aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarren Krahn <dkrahn@google.com>2018-07-24 13:20:36 -0700
committerDarren Krahn <dkrahn@google.com>2018-07-24 13:26:37 -0700
commit9101fea97c5d7edea47a1d46ab587f6fb5ba659b (patch)
treec8a7de8effa9b502175776f99e766fb29f93376f
parent6fdc6b835ab4fd85358b74397ca059fc19dd7a3e (diff)
parent29965f89eab7b8591564d4dde05b0b3c00ade4cd (diff)
downloadepid-sdk-9101fea97c5d7edea47a1d46ab587f6fb5ba659b.tar.gz
AOSP: Initial merge from upstream.
Bug: 111799497 Test: None Change-Id: I51cc42c8ffb82955149e718511ec800559fc071c
-rw-r--r--CHANGELOG.md264
-rw-r--r--LICENSE.txt253
-rw-r--r--Makefile.in207
-rw-r--r--NOTICE.txt21
-rw-r--r--README.md63
-rw-r--r--SConstruct566
-rw-r--r--configure3968
-rw-r--r--doc/html/1_81_2file__parser_8h.html106
-rw-r--r--doc/html/1_81_2types_8h.html153
-rw-r--r--doc/html/_basenames.html101
-rw-r--r--doc/html/_build_tools_installation.html132
-rw-r--r--doc/html/_building_sdk.html220
-rw-r--r--doc/html/_change_log.html246
-rw-r--r--doc/html/_epid_overview.html196
-rw-r--r--doc/html/_examples.html87
-rw-r--r--doc/html/_examples.js11
-rw-r--r--doc/html/_glossary.html176
-rw-r--r--doc/html/_how_validated.html123
-rw-r--r--doc/html/_implementation_notes.html122
-rw-r--r--doc/html/_issuer_material.html268
-rw-r--r--doc/html/_legal_information.html86
-rw-r--r--doc/html/_provisioning.html140
-rw-r--r--doc/html/_revocation.html144
-rw-r--r--doc/html/_sdk_overview.html247
-rw-r--r--doc/html/_sign_verify_tutorial.html251
-rw-r--r--doc/html/_tpm_considerations.html230
-rw-r--r--doc/html/_user_manual__generating_an_intel_epid_signature.html188
-rw-r--r--doc/html/_user_manual__verifying_an_intel_epid_signature.html205
-rw-r--r--doc/html/_usingi_k_g_f.html248
-rw-r--r--doc/html/annotated.html153
-rw-r--r--doc/html/base_name.pngbin0 -> 43384 bytes
-rw-r--r--doc/html/basenames_8dox.html84
-rw-r--r--doc/html/basicdoc.pngbin0 -> 26874 bytes
-rw-r--r--doc/html/bc_s.pngbin0 -> 676 bytes
-rw-r--r--doc/html/bdwn.pngbin0 -> 147 bytes
-rw-r--r--doc/html/bignum_8h.html139
-rw-r--r--doc/html/bitsupplier_8h.html94
-rw-r--r--doc/html/build__tools__installation_8dox.html84
-rw-r--r--doc/html/building__sdk_8dox.html84
-rw-r--r--doc/html/classes.html118
-rw-r--r--doc/html/closed.pngbin0 -> 132 bytes
-rw-r--r--doc/html/commit_8c.html139
-rw-r--r--doc/html/commit_8h.html96
-rw-r--r--doc/html/common_2math_2pairing_8h.html103
-rw-r--r--doc/html/context_8c.html180
-rw-r--r--doc/html/context_8h.html105
-rw-r--r--doc/html/conversion_8c.html323
-rw-r--r--doc/html/conversion_8h.html340
-rw-r--r--doc/html/createprimary_8c.html139
-rw-r--r--doc/html/createprimary_8h.html133
-rw-r--r--doc/html/deprecated.html84
-rw-r--r--doc/html/dir_02c945662023679b89476bd7126bc985.html95
-rw-r--r--doc/html/dir_0d59f1b8006345e373e07b4691e0da76.html107
-rw-r--r--doc/html/dir_12b90d9c027aaf878a834df729679a56.html98
-rw-r--r--doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html103
-rw-r--r--doc/html/dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html128
-rw-r--r--doc/html/dir_a32be19bc88f3d7aac6b7249da379f26.html89
-rw-r--r--doc/html/dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html89
-rw-r--r--doc/html/dir_b7525369f2fbc378c6814b573b9a2bc3.html119
-rw-r--r--doc/html/dir_ea12d375fc1eb79df248c0adf953af4f.html83
-rw-r--r--doc/html/dir_ef364879bae02db2684040178ed9b186.html86
-rw-r--r--doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html113
-rw-r--r--doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html113
-rw-r--r--doc/html/doc.pngbin0 -> 746 bytes
-rw-r--r--doc/html/doxygen.css1596
-rw-r--r--doc/html/doxygen.pngbin0 -> 3779 bytes
-rw-r--r--doc/html/dynsections.js120
-rw-r--r--doc/html/ecdsa_8h.html100
-rw-r--r--doc/html/ecgroup_8h.html167
-rw-r--r--doc/html/efq2_8h.html448
-rw-r--r--doc/html/efq_8h.html1146
-rw-r--r--doc/html/endian_8h.html138
-rw-r--r--doc/html/epid__overview_8dox.html84
-rw-r--r--doc/html/epid_diagram_generating_member_private_keys.pngbin0 -> 38002 bytes
-rw-r--r--doc/html/epid_diagram_group.pngbin0 -> 25944 bytes
-rw-r--r--doc/html/epid_diagram_group_public_key_and_issuing_private_key.pngbin0 -> 29556 bytes
-rw-r--r--doc/html/epid_diagram_issuer_makes_revocation_lists_available.pngbin0 -> 40167 bytes
-rw-r--r--doc/html/epid_diagram_maintaining_revocation_lists.pngbin0 -> 51634 bytes
-rw-r--r--doc/html/epid_diagram_provisioning.pngbin0 -> 73631 bytes
-rw-r--r--doc/html/epid_diagram_roles_summary.pngbin0 -> 25980 bytes
-rw-r--r--doc/html/epid_diagram_signing_and_verification.pngbin0 -> 72501 bytes
-rw-r--r--doc/html/epiddefs_8h.html86
-rw-r--r--doc/html/epidstyle.css325
-rw-r--r--doc/html/errors_8h.html128
-rw-r--r--doc/html/examples_8dox.html84
-rw-r--r--doc/html/file__parser_8h.html156
-rw-r--r--doc/html/files.html151
-rw-r--r--doc/html/finitefield_8h.html176
-rw-r--r--doc/html/folderclosed.pngbin0 -> 616 bytes
-rw-r--r--doc/html/folderopen.pngbin0 -> 597 bytes
-rw-r--r--doc/html/fp_8h.html645
-rw-r--r--doc/html/fq12_8h.html814
-rw-r--r--doc/html/fq2_8h.html762
-rw-r--r--doc/html/fq6_8h.html675
-rw-r--r--doc/html/fq_8h.html803
-rw-r--r--doc/html/functions.html97
-rw-r--r--doc/html/functions_b.html102
-rw-r--r--doc/html/functions_c.html88
-rw-r--r--doc/html/functions_d.html98
-rw-r--r--doc/html/functions_e.html105
-rw-r--r--doc/html/functions_f.html92
-rw-r--r--doc/html/functions_g.html112
-rw-r--r--doc/html/functions_h.html99
-rw-r--r--doc/html/functions_k.html92
-rw-r--r--doc/html/functions_l.html82
-rw-r--r--doc/html/functions_n.html101
-rw-r--r--doc/html/functions_o.html81
-rw-r--r--doc/html/functions_p.html91
-rw-r--r--doc/html/functions_q.html88
-rw-r--r--doc/html/functions_r.html91
-rw-r--r--doc/html/functions_s.html143
-rw-r--r--doc/html/functions_t.html97
-rw-r--r--doc/html/functions_v.html87
-rw-r--r--doc/html/functions_vars.html97
-rw-r--r--doc/html/functions_vars_b.html102
-rw-r--r--doc/html/functions_vars_c.html88
-rw-r--r--doc/html/functions_vars_d.html98
-rw-r--r--doc/html/functions_vars_e.html105
-rw-r--r--doc/html/functions_vars_f.html92
-rw-r--r--doc/html/functions_vars_g.html112
-rw-r--r--doc/html/functions_vars_h.html99
-rw-r--r--doc/html/functions_vars_k.html92
-rw-r--r--doc/html/functions_vars_l.html82
-rw-r--r--doc/html/functions_vars_n.html101
-rw-r--r--doc/html/functions_vars_o.html81
-rw-r--r--doc/html/functions_vars_p.html91
-rw-r--r--doc/html/functions_vars_q.html88
-rw-r--r--doc/html/functions_vars_r.html91
-rw-r--r--doc/html/functions_vars_s.html143
-rw-r--r--doc/html/functions_vars_t.html97
-rw-r--r--doc/html/functions_vars_v.html87
-rw-r--r--doc/html/functions_vars_w.html86
-rw-r--r--doc/html/functions_vars_x.html106
-rw-r--r--doc/html/functions_vars_y.html103
-rw-r--r--doc/html/functions_vars_z.html88
-rw-r--r--doc/html/functions_w.html86
-rw-r--r--doc/html/functions_x.html106
-rw-r--r--doc/html/functions_y.html103
-rw-r--r--doc/html/functions_z.html88
-rw-r--r--doc/html/getrandom_8c.html100
-rw-r--r--doc/html/getrandom_8h.html94
-rw-r--r--doc/html/globals.html81
-rw-r--r--doc/html/globals_b.html128
-rw-r--r--doc/html/globals_c.html81
-rw-r--r--doc/html/globals_d.html99
-rw-r--r--doc/html/globals_defs.html144
-rw-r--r--doc/html/globals_e.html448
-rw-r--r--doc/html/globals_enum.html91
-rw-r--r--doc/html/globals_eval.html210
-rw-r--r--doc/html/globals_f.html375
-rw-r--r--doc/html/globals_func.html102
-rw-r--r--doc/html/globals_func_d.html99
-rw-r--r--doc/html/globals_func_e.html418
-rw-r--r--doc/html/globals_func_f.html366
-rw-r--r--doc/html/globals_func_i.html81
-rw-r--r--doc/html/globals_func_m.html84
-rw-r--r--doc/html/globals_func_n.html105
-rw-r--r--doc/html/globals_func_p.html127
-rw-r--r--doc/html/globals_func_r.html95
-rw-r--r--doc/html/globals_func_s.html84
-rw-r--r--doc/html/globals_func_t.html171
-rw-r--r--doc/html/globals_func_u.html84
-rw-r--r--doc/html/globals_func_v.html138
-rw-r--r--doc/html/globals_func_w.html95
-rw-r--r--doc/html/globals_g.html81
-rw-r--r--doc/html/globals_h.html84
-rw-r--r--doc/html/globals_i.html87
-rw-r--r--doc/html/globals_k.html216
-rw-r--r--doc/html/globals_m.html93
-rw-r--r--doc/html/globals_n.html108
-rw-r--r--doc/html/globals_o.html81
-rw-r--r--doc/html/globals_p.html130
-rw-r--r--doc/html/globals_r.html98
-rw-r--r--doc/html/globals_s.html105
-rw-r--r--doc/html/globals_t.html186
-rw-r--r--doc/html/globals_type.html136
-rw-r--r--doc/html/globals_u.html84
-rw-r--r--doc/html/globals_v.html141
-rw-r--r--doc/html/globals_vars.html85
-rw-r--r--doc/html/globals_w.html95
-rw-r--r--doc/html/glossary_8dox.html84
-rw-r--r--doc/html/group___big_num_primitives.html642
-rw-r--r--doc/html/group___big_num_primitives.js16
-rw-r--r--doc/html/group___ec_group_primitives.html1249
-rw-r--r--doc/html/group___ec_group_primitives.js25
-rw-r--r--doc/html/group___ecdsa_primitives.html235
-rw-r--r--doc/html/group___ecdsa_primitives.js5
-rw-r--r--doc/html/group___epid11_file_parser_module.html372
-rw-r--r--doc/html/group___epid11_file_parser_module.js7
-rw-r--r--doc/html/group___epid11_pairing_primitives.html254
-rw-r--r--doc/html/group___epid11_pairing_primitives.js7
-rw-r--r--doc/html/group___epid11_types.html152
-rw-r--r--doc/html/group___epid11_types.js97
-rw-r--r--doc/html/group___epid11_verifier_module.html806
-rw-r--r--doc/html/group___epid11_verifier_module.js22
-rw-r--r--doc/html/group___epid_common.html141
-rw-r--r--doc/html/group___epid_common.js9
-rw-r--r--doc/html/group___epid_math.html108
-rw-r--r--doc/html/group___epid_math.js9
-rw-r--r--doc/html/group___epid_member_module.html991
-rw-r--r--doc/html/group___epid_member_module.js28
-rw-r--r--doc/html/group___epid_module.html99
-rw-r--r--doc/html/group___epid_module.js6
-rw-r--r--doc/html/group___epid_print.html689
-rw-r--r--doc/html/group___epid_print.js20
-rw-r--r--doc/html/group___epid_types.html284
-rw-r--r--doc/html/group___epid_types.js179
-rw-r--r--doc/html/group___epid_verifier_module.html1076
-rw-r--r--doc/html/group___epid_verifier_module.js29
-rw-r--r--doc/html/group___error_codes.html222
-rw-r--r--doc/html/group___error_codes.js27
-rw-r--r--doc/html/group___file_parser.html547
-rw-r--r--doc/html/group___file_parser.js42
-rw-r--r--doc/html/group___finite_field_primitives.html1379
-rw-r--r--doc/html/group___finite_field_primitives.js28
-rw-r--r--doc/html/group___hash_primitives.html146
-rw-r--r--doc/html/group___hash_primitives.js7
-rw-r--r--doc/html/group___pairing_primitives.html257
-rw-r--r--doc/html/group___pairing_primitives.js7
-rw-r--r--doc/html/group___tpm2_module.html790
-rw-r--r--doc/html/group___tpm2_module.js16
-rw-r--r--doc/html/hash_8h.html104
-rw-r--r--doc/html/hashwrap_8h.html264
-rw-r--r--doc/html/how__validated_8dox.html84
-rw-r--r--doc/html/implementation__notes_8dox.html84
-rw-r--r--doc/html/implementing_member.pngbin0 -> 3858 bytes
-rw-r--r--doc/html/index.html90
-rw-r--r--doc/html/issuer__material_8dox.html84
-rw-r--r--doc/html/jquery.js115
-rw-r--r--doc/html/legal__information_8dox.html84
-rw-r--r--doc/html/load__external_8c.html131
-rw-r--r--doc/html/load__external_8h.html95
-rw-r--r--doc/html/mainpage_8dox.html84
-rw-r--r--doc/html/mathdefs_8h.html98
-rw-r--r--doc/html/mathtypes_8h.html135
-rw-r--r--doc/html/member_2api_8h.html160
-rw-r--r--doc/html/member_2tiny_2math_2pairing_8h.html175
-rw-r--r--doc/html/member_host.pngbin0 -> 24364 bytes
-rw-r--r--doc/html/member_private_key.pngbin0 -> 15137 bytes
-rw-r--r--doc/html/modules.html102
-rw-r--r--doc/html/modules.js4
-rw-r--r--doc/html/nav_f.pngbin0 -> 153 bytes
-rw-r--r--doc/html/nav_g.pngbin0 -> 95 bytes
-rw-r--r--doc/html/nav_h.pngbin0 -> 98 bytes
-rw-r--r--doc/html/navtree.css146
-rw-r--r--doc/html/navtree.js540
-rw-r--r--doc/html/navtreedata.js204
-rw-r--r--doc/html/navtreeindex0.js253
-rw-r--r--doc/html/navtreeindex1.js253
-rw-r--r--doc/html/navtreeindex2.js110
-rw-r--r--doc/html/nv_8c.html107
-rw-r--r--doc/html/nv_8h.html105
-rw-r--r--doc/html/open.pngbin0 -> 123 bytes
-rw-r--r--doc/html/organization_8dox.html84
-rw-r--r--doc/html/pageorder_8dox.html86
-rw-r--r--doc/html/pages.html102
-rw-r--r--doc/html/printtss_8c.html135
-rw-r--r--doc/html/printtss_8h.html133
-rw-r--r--doc/html/printutils_8h.html140
-rw-r--r--doc/html/provisioning_8dox.html84
-rw-r--r--doc/html/random_base.pngbin0 -> 39173 bytes
-rw-r--r--doc/html/resize.js136
-rw-r--r--doc/html/revocation_8dox.html84
-rw-r--r--doc/html/sdk__overview_8dox.html84
-rw-r--r--doc/html/sdk_block_diagram.pngbin0 -> 16299 bytes
-rw-r--r--doc/html/serialize_8h.html726
-rw-r--r--doc/html/sha256_8h.html235
-rw-r--r--doc/html/sha512_8h.html229
-rw-r--r--doc/html/sign_8c.html146
-rw-r--r--doc/html/sign_8h.html99
-rw-r--r--doc/html/sign__verify__tutorial_8dox.html84
-rw-r--r--doc/html/signmsg__walkthrough_8dox.html84
-rw-r--r--doc/html/software__member_8h.html95
-rw-r--r--doc/html/splitbar.pngbin0 -> 314 bytes
-rw-r--r--doc/html/state_8h.html95
-rw-r--r--doc/html/stdtypes_8h.html111
-rw-r--r--doc/html/struct_basic_signature.html128
-rw-r--r--doc/html/struct_big_num_str.html99
-rw-r--r--doc/html/struct_compressed_priv_key.html108
-rw-r--r--doc/html/struct_ecc_point_fq.html103
-rw-r--r--doc/html/struct_ecc_point_fq2.html103
-rw-r--r--doc/html/struct_ecc_point_jacobi_fq.html107
-rw-r--r--doc/html/struct_ecc_point_jacobi_fq2.html107
-rw-r--r--doc/html/struct_ecdsa_private_key.html99
-rw-r--r--doc/html/struct_ecdsa_public_key.html103
-rw-r--r--doc/html/struct_ecdsa_signature.html103
-rw-r--r--doc/html/struct_epid11_basic_signature.html148
-rw-r--r--doc/html/struct_epid11_g2_elem_str.html103
-rw-r--r--doc/html/struct_epid11_group_pub_key.html112
-rw-r--r--doc/html/struct_epid11_group_rl.html108
-rw-r--r--doc/html/struct_epid11_gt_elem_str.html99
-rw-r--r--doc/html/struct_epid11_nr_proof.html112
-rw-r--r--doc/html/struct_epid11_params.html174
-rw-r--r--doc/html/struct_epid11_priv_rl.html112
-rw-r--r--doc/html/struct_epid11_sig_rl.html112
-rw-r--r--doc/html/struct_epid11_sig_rl_entry.html103
-rw-r--r--doc/html/struct_epid11_signature.html112
-rw-r--r--doc/html/struct_epid11_verifier_precomp.html115
-rw-r--r--doc/html/struct_epid2_params.html132
-rw-r--r--doc/html/struct_epid_ca_certificate.html131
-rw-r--r--doc/html/struct_epid_file_header.html103
-rw-r--r--doc/html/struct_epid_signature.html112
-rw-r--r--doc/html/struct_fp_elem.html99
-rw-r--r--doc/html/struct_fp_elem_str.html99
-rw-r--r--doc/html/struct_fq12_elem.html103
-rw-r--r--doc/html/struct_fq12_elem_str.html99
-rw-r--r--doc/html/struct_fq2_elem.html103
-rw-r--r--doc/html/struct_fq2_elem_str.html99
-rw-r--r--doc/html/struct_fq3_elem_str.html99
-rw-r--r--doc/html/struct_fq6_elem.html107
-rw-r--r--doc/html/struct_fq6_elem_str.html99
-rw-r--r--doc/html/struct_fq_elem.html99
-rw-r--r--doc/html/struct_fq_elem_str.html99
-rw-r--r--doc/html/struct_g1_elem_str.html103
-rw-r--r--doc/html/struct_g2_elem_str.html103
-rw-r--r--doc/html/struct_group_pub_key.html112
-rw-r--r--doc/html/struct_group_rl.html108
-rw-r--r--doc/html/struct_gt_elem_str.html99
-rw-r--r--doc/html/struct_i_priv_key.html104
-rw-r--r--doc/html/struct_join_request.html108
-rw-r--r--doc/html/struct_member_params.html109
-rw-r--r--doc/html/struct_member_precomp.html113
-rw-r--r--doc/html/struct_membership_credential.html108
-rw-r--r--doc/html/struct_nr_proof.html112
-rw-r--r--doc/html/struct_oct_str128.html99
-rw-r--r--doc/html/struct_oct_str16.html99
-rw-r--r--doc/html/struct_oct_str256.html99
-rw-r--r--doc/html/struct_oct_str32.html99
-rw-r--r--doc/html/struct_oct_str512.html99
-rw-r--r--doc/html/struct_oct_str600.html99
-rw-r--r--doc/html/struct_oct_str64.html99
-rw-r--r--doc/html/struct_oct_str768.html99
-rw-r--r--doc/html/struct_oct_str8.html99
-rw-r--r--doc/html/struct_oct_str80.html99
-rw-r--r--doc/html/struct_pairing_state.html100
-rw-r--r--doc/html/struct_priv_key.html112
-rw-r--r--doc/html/struct_priv_rl.html112
-rw-r--r--doc/html/struct_sha256_digest.html99
-rw-r--r--doc/html/struct_sig_rl.html112
-rw-r--r--doc/html/struct_sig_rl_entry.html103
-rw-r--r--doc/html/struct_tpm2_ctx.html111
-rw-r--r--doc/html/struct_verifier_precomp.html117
-rw-r--r--doc/html/struct_verifier_rl.html112
-rw-r--r--doc/html/struct_very_large_int.html100
-rw-r--r--doc/html/struct_very_large_int_product.html99
-rw-r--r--doc/html/structtiny__sha.html112
-rw-r--r--doc/html/sync_off.pngbin0 -> 853 bytes
-rw-r--r--doc/html/sync_on.pngbin0 -> 845 bytes
-rw-r--r--doc/html/tab_a.pngbin0 -> 142 bytes
-rw-r--r--doc/html/tab_b.pngbin0 -> 169 bytes
-rw-r--r--doc/html/tab_h.pngbin0 -> 177 bytes
-rw-r--r--doc/html/tab_s.pngbin0 -> 184 bytes
-rw-r--r--doc/html/tabs.css1
-rw-r--r--doc/html/tatepairing_8h.html111
-rw-r--r--doc/html/tiny__stdlib_8h.html199
-rw-r--r--doc/html/tpm__considerations_8dox.html84
-rw-r--r--doc/html/tpm__member_8h.html84
-rw-r--r--doc/html/types_8h.html241
-rw-r--r--doc/html/uml_sequence.pngbin0 -> 27669 bytes
-rw-r--r--doc/html/unionsha__digest.html107
-rw-r--r--doc/html/using__ikgf_8dox.html84
-rw-r--r--doc/html/verifier_21_81_2api_8h.html146
-rw-r--r--doc/html/verifier_2api_8h.html160
-rw-r--r--doc/html/verifysig__walkthrough_8dox.html84
-rw-r--r--doc/html/vli_8h.html924
-rw-r--r--doc/index.html15
-rw-r--r--epid/common-testhelper/1.1/epid_params-testhelper.cc216
-rw-r--r--epid/common-testhelper/1.1/epid_params-testhelper.h78
-rw-r--r--epid/common-testhelper/1.1/testdata/grp01/member0/sig_bsn0_msg_0_255_sha256.inc89
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/corrupted_privrl.inc35
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/epid_grpcrt.inc52
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_single_entry.inc97
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_three_entry.inc127
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc79
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/privrl.inc43
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/privrl_single_entry.inc35
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/sig_sha256_bsnrnd_msg0.inc78
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_first_entry.inc68
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_last_entry.inc68
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_middle_entry.inc68
-rw-r--r--epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_single_entry.inc44
-rw-r--r--epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_first_entry.inc38
-rw-r--r--epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_last_entry.inc38
-rw-r--r--epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_middle_entry.inc38
-rw-r--r--epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_single_entry.inc32
-rw-r--r--epid/common-testhelper/1.1/verifier_wrapper-testhelper.cc54
-rw-r--r--epid/common-testhelper/1.1/verifier_wrapper-testhelper.h56
-rw-r--r--epid/common-testhelper/Makefile68
-rw-r--r--epid/common-testhelper/bignum_wrapper-testhelper.cc123
-rw-r--r--epid/common-testhelper/bignum_wrapper-testhelper.h69
-rw-r--r--epid/common-testhelper/common-testhelper.parts86
-rw-r--r--epid/common-testhelper/ecgroup_wrapper-testhelper.cc126
-rw-r--r--epid/common-testhelper/ecgroup_wrapper-testhelper.h68
-rw-r--r--epid/common-testhelper/ecpoint_wrapper-testhelper.cc128
-rw-r--r--epid/common-testhelper/ecpoint_wrapper-testhelper.h78
-rw-r--r--epid/common-testhelper/epid2params_wrapper-testhelper.cc49
-rw-r--r--epid/common-testhelper/epid2params_wrapper-testhelper.h55
-rw-r--r--epid/common-testhelper/epid_gtest-testhelper.cc69
-rw-r--r--epid/common-testhelper/epid_gtest-testhelper.h30
-rw-r--r--epid/common-testhelper/epid_params-testhelper.cc171
-rw-r--r--epid/common-testhelper/epid_params-testhelper.h75
-rw-r--r--epid/common-testhelper/errors-testhelper.h48
-rw-r--r--epid/common-testhelper/ffelement_wrapper-testhelper.cc146
-rw-r--r--epid/common-testhelper/ffelement_wrapper-testhelper.h84
-rw-r--r--epid/common-testhelper/finite_field_wrapper-testhelper.cc173
-rw-r--r--epid/common-testhelper/finite_field_wrapper-testhelper.h71
-rw-r--r--epid/common-testhelper/mem_params-testhelper.cc35
-rw-r--r--epid/common-testhelper/mem_params-testhelper.h48
-rw-r--r--epid/common-testhelper/member_wrapper-testhelper.cc290
-rw-r--r--epid/common-testhelper/member_wrapper-testhelper.h84
-rw-r--r--epid/common-testhelper/octstr-testhelper.cc129
-rw-r--r--epid/common-testhelper/octstr-testhelper.h47
-rw-r--r--epid/common-testhelper/prng-testhelper.h116
-rw-r--r--epid/common-testhelper/testapp-testhelper.cc74
-rw-r--r--epid/common-testhelper/testapp-testhelper.h33
-rw-r--r--epid/common-testhelper/testdata/grp01/gpubkey.inc53
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_bsn0_msg_0_255_sha512.inc72
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test0_sha256_sigrl.inc1222
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test0_sha384_sigrl.inc1222
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test0_sha512_sigrl.inc1222
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test1.inc74
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test1_basename1_sha256.inc85
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc85
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc85
-rw-r--r--epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc85
-rw-r--r--epid/common-testhelper/testdata/grp01/privrl.inc277
-rw-r--r--epid/common-testhelper/testdata/grp01/sigrl.inc878
-rw-r--r--epid/common-testhelper/testdata/grp01/verrl.inc151
-rw-r--r--epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc36
-rw-r--r--epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc44
-rw-r--r--epid/common-testhelper/testdata/grp_x/corrupted_privrl.inc36
-rw-r--r--epid/common-testhelper/testdata/grp_x/iprivkey.inc31
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc44
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc95
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_bsn0_msg0.inc100
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0.inc100
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0_no_sigrl.inc88
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_huge_bsn_msg0.inc99
-rw-r--r--epid/common-testhelper/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/member1/mprivkey.inc44
-rw-r--r--epid/common-testhelper/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc136
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey000.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey001.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey002.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrl.inc40
-rw-r--r--epid/common-testhelper/testdata/grp_x/privrl_single_entry_revoked_key000.inc33
-rw-r--r--epid/common-testhelper/testdata/grp_x/pubkey.inc59
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey001.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey002.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl.inc76
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc77
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc77
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc77
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc77
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/sigrl_ver_2.inc76
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey000.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey001.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey002.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc136
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha384bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512_256bsn0msg0.inc100
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha384bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512_256bsn0msg0.inc100
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha384bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512_256bsn0msg0.inc100
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512bsn0msg0.inc60
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl.inc69
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc51
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha384.inc69
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512.inc69
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512_256.inc68
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey003.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey004.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey005.inc45
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc135
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl.inc70
-rw-r--r--epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc69
-rw-r--r--epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.datbin0 -> 80 bytes
-rw-r--r--epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc36
-rw-r--r--epid/common-testhelper/testdata/grp_y/iprivkey.inc32
-rw-r--r--epid/common-testhelper/testdata/grp_y/pubkey.inc59
-rw-r--r--epid/common-testhelper/testdata/grprl.inc26
-rw-r--r--epid/common-testhelper/testdata/grprl_revoked_grp_x_first_entry.inc31
-rw-r--r--epid/common-testhelper/testdata/grprl_revoked_grp_x_last_entry.inc31
-rw-r--r--epid/common-testhelper/testdata/grprl_revoked_grp_x_middle_entry.inc31
-rw-r--r--epid/common-testhelper/testdata/grprl_single_entry_revoked_grp_x.inc27
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc106
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc36
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/privrl.inc38
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc27
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc46
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc98
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc58
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_empty_sigrl.inc58
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_nosigrl.inc58
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc61
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc98
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc98
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc59
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc36
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc57
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc30
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupb/member0/mprivkey.inc36
-rw-r--r--epid/common-testhelper/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc98
-rw-r--r--epid/common-testhelper/testdata/ikgf/grprl.inc124
-rw-r--r--epid/common-testhelper/unittests/bignum_wrapper-test.cc174
-rw-r--r--epid/common-testhelper/unittests/ecgroup_wrapper-test.cc154
-rw-r--r--epid/common-testhelper/unittests/ecpoint_wrapper-test.cc134
-rw-r--r--epid/common-testhelper/unittests/ffelement_wrapper-test.cc156
-rw-r--r--epid/common-testhelper/unittests/finite_field_wrapper-test.cc135
-rw-r--r--epid/common-testhelper/unittests/main-test.cc27
-rw-r--r--epid/common-testhelper/verifier_wrapper-testhelper.cc53
-rw-r--r--epid/common-testhelper/verifier_wrapper-testhelper.h55
-rw-r--r--epid/common/1.1/file_parser.h220
-rw-r--r--epid/common/1.1/src/commitment.c135
-rw-r--r--epid/common/1.1/src/commitment.h137
-rw-r--r--epid/common/1.1/src/epid11params.c469
-rw-r--r--epid/common/1.1/src/epid11params.h75
-rw-r--r--epid/common/1.1/src/epid11params_tate.inc160
-rw-r--r--epid/common/1.1/src/file_parser.c187
-rw-r--r--epid/common/1.1/src/grouppubkey.c82
-rw-r--r--epid/common/1.1/src/grouppubkey.h69
-rw-r--r--epid/common/1.1/types.h207
-rw-r--r--epid/common/1.1/unittests/file_parser-test.cc1435
-rw-r--r--epid/common/Makefile81
-rw-r--r--epid/common/bitsupplier.h60
-rw-r--r--epid/common/common.parts119
-rw-r--r--epid/common/epiddefs.h39
-rw-r--r--epid/common/errors.h74
-rw-r--r--epid/common/file_parser.h288
-rw-r--r--epid/common/math/bignum.h207
-rw-r--r--epid/common/math/ecdsa.h114
-rw-r--r--epid/common/math/ecgroup.h490
-rw-r--r--epid/common/math/finitefield.h517
-rw-r--r--epid/common/math/hash.h63
-rw-r--r--epid/common/math/pairing.h105
-rw-r--r--epid/common/math/printutils.h288
-rw-r--r--epid/common/math/src/bignum-internal.h74
-rw-r--r--epid/common/math/src/bignum.c398
-rw-r--r--epid/common/math/src/ecdsa_sign.c205
-rw-r--r--epid/common/math/src/ecdsa_verify.c362
-rw-r--r--epid/common/math/src/ecgroup-internal.h45
-rw-r--r--epid/common/math/src/ecgroup.c1238
-rw-r--r--epid/common/math/src/finitefield-internal.h64
-rw-r--r--epid/common/math/src/finitefield.c1659
-rw-r--r--epid/common/math/src/pairing-internal.h39
-rw-r--r--epid/common/math/src/pairing.c2434
-rw-r--r--epid/common/math/src/printutils.c598
-rw-r--r--epid/common/math/src/sha256.c44
-rw-r--r--epid/common/math/src/tatepairing-internal.h41
-rw-r--r--epid/common/math/src/tatepairing.c925
-rw-r--r--epid/common/math/tatepairing.h124
-rw-r--r--epid/common/math/unittests/bignum-test.cc534
-rw-r--r--epid/common/math/unittests/ecdsa_sign-test.cc229
-rw-r--r--epid/common/math/unittests/ecdsa_verify-test.cc279
-rw-r--r--epid/common/math/unittests/ecgroup-test.cc2171
-rw-r--r--epid/common/math/unittests/ffelement-test.cc3003
-rw-r--r--epid/common/math/unittests/finitefield-test.cc252
-rw-r--r--epid/common/math/unittests/hash-test.cc88
-rw-r--r--epid/common/math/unittests/main-test.cc27
-rw-r--r--epid/common/math/unittests/octstrconvert-test.cc76
-rw-r--r--epid/common/math/unittests/pairing-test.cc274
-rw-r--r--epid/common/math/unittests/printutils-test.cc380
-rw-r--r--epid/common/math/unittests/tatepairing-test.cc232
-rw-r--r--epid/common/src/commitment.c124
-rw-r--r--epid/common/src/commitment.h125
-rw-r--r--epid/common/src/endian_convert.h47
-rw-r--r--epid/common/src/epid2params.c586
-rw-r--r--epid/common/src/epid2params.h76
-rw-r--r--epid/common/src/epid2params_ate.inc111
-rw-r--r--epid/common/src/errors.c66
-rw-r--r--epid/common/src/file_parser-internal.h47
-rw-r--r--epid/common/src/file_parser.c335
-rw-r--r--epid/common/src/grouppubkey.c86
-rw-r--r--epid/common/src/grouppubkey.h67
-rw-r--r--epid/common/src/hashsize.c44
-rw-r--r--epid/common/src/hashsize.h46
-rw-r--r--epid/common/src/memory.c123
-rw-r--r--epid/common/src/memory.h123
-rw-r--r--epid/common/src/sigrlvalid.c46
-rw-r--r--epid/common/src/sigrlvalid.h46
-rw-r--r--epid/common/src/stack.c95
-rw-r--r--epid/common/src/stack.h106
-rw-r--r--epid/common/stdtypes.h39
-rw-r--r--epid/common/tinycommon.parts46
-rw-r--r--epid/common/types.h363
-rw-r--r--epid/common/unittests/file_parser-test.cc1367
-rw-r--r--epid/member/Makefile186
-rw-r--r--epid/member/api.h443
-rw-r--r--epid/member/member.parts181
-rw-r--r--epid/member/software_member.h48
-rw-r--r--epid/member/src/allowed_basenames.c117
-rw-r--r--epid/member/src/allowed_basenames.h45
-rw-r--r--epid/member/src/context.c289
-rw-r--r--epid/member/src/context.h99
-rw-r--r--epid/member/src/decompress_privkey.c308
-rw-r--r--epid/member/src/get_sigsize.c35
-rw-r--r--epid/member/src/hash_basename.c54
-rw-r--r--epid/member/src/hash_basename.h59
-rw-r--r--epid/member/src/join.c152
-rw-r--r--epid/member/src/join_commitment.c89
-rw-r--r--epid/member/src/join_commitment.h64
-rw-r--r--epid/member/src/nrprove.c293
-rw-r--r--epid/member/src/nrprove.h71
-rw-r--r--epid/member/src/nrprove_commitment.c113
-rw-r--r--epid/member/src/nrprove_commitment.h82
-rw-r--r--epid/member/src/precomp.c91
-rw-r--r--epid/member/src/precomp.h59
-rw-r--r--epid/member/src/presig-internal.h53
-rw-r--r--epid/member/src/presig.c295
-rw-r--r--epid/member/src/privateexp.c141
-rw-r--r--epid/member/src/privateexp.h42
-rw-r--r--epid/member/src/provision_bulk.c88
-rw-r--r--epid/member/src/provision_compressed.c41
-rw-r--r--epid/member/src/provision_join.c85
-rw-r--r--epid/member/src/resize.c40
-rw-r--r--epid/member/src/resize.h45
-rw-r--r--epid/member/src/sign.c111
-rw-r--r--epid/member/src/sign_commitment.c71
-rw-r--r--epid/member/src/sign_commitment.h73
-rw-r--r--epid/member/src/signbasic.c340
-rw-r--r--epid/member/src/signbasic.h70
-rw-r--r--epid/member/src/startup.c127
-rw-r--r--epid/member/src/storage.c71
-rw-r--r--epid/member/src/storage.h72
-rw-r--r--epid/member/src/validatekey.c130
-rw-r--r--epid/member/src/validatekey.h64
-rw-r--r--epid/member/src/write_precomp.c36
-rw-r--r--epid/member/src/write_precomp.h46
-rw-r--r--epid/member/tiny/math/efq.h254
-rw-r--r--epid/member/tiny/math/efq2.h103
-rw-r--r--epid/member/tiny/math/fp.h135
-rw-r--r--epid/member/tiny/math/fq.h168
-rw-r--r--epid/member/tiny/math/fq12.h165
-rw-r--r--epid/member/tiny/math/fq2.h155
-rw-r--r--epid/member/tiny/math/fq6.h137
-rw-r--r--epid/member/tiny/math/hashwrap.h109
-rw-r--r--epid/member/tiny/math/math.parts51
-rw-r--r--epid/member/tiny/math/mathdefs.h27
-rw-r--r--epid/member/tiny/math/mathtypes.h101
-rw-r--r--epid/member/tiny/math/pairing.h48
-rw-r--r--epid/member/tiny/math/serialize.h183
-rw-r--r--epid/member/tiny/math/sha256.h133
-rw-r--r--epid/member/tiny/math/sha512.h89
-rw-r--r--epid/member/tiny/math/src/efq.c412
-rw-r--r--epid/member/tiny/math/src/efq2.c253
-rw-r--r--epid/member/tiny/math/src/fp.c120
-rw-r--r--epid/member/tiny/math/src/fq.c126
-rw-r--r--epid/member/tiny/math/src/fq12.c282
-rw-r--r--epid/member/tiny/math/src/fq2.c150
-rw-r--r--epid/member/tiny/math/src/fq6.c192
-rw-r--r--epid/member/tiny/math/src/hashwrap.c86
-rw-r--r--epid/member/tiny/math/src/pairing.c300
-rw-r--r--epid/member/tiny/math/src/serialize.c232
-rw-r--r--epid/member/tiny/math/src/sha256.c225
-rw-r--r--epid/member/tiny/math/src/sha512.c169
-rw-r--r--epid/member/tiny/math/src/vli.c316
-rw-r--r--epid/member/tiny/math/unittests/cmp-testhelper.cc71
-rw-r--r--epid/member/tiny/math/unittests/cmp-testhelper.h65
-rw-r--r--epid/member/tiny/math/unittests/efq-test.cc714
-rw-r--r--epid/member/tiny/math/unittests/efq2-test.cc406
-rw-r--r--epid/member/tiny/math/unittests/fp-test.cc263
-rw-r--r--epid/member/tiny/math/unittests/fq-test.cc329
-rw-r--r--epid/member/tiny/math/unittests/fq12-test.cc1058
-rw-r--r--epid/member/tiny/math/unittests/fq2-test.cc352
-rw-r--r--epid/member/tiny/math/unittests/fq6-test.cc452
-rw-r--r--epid/member/tiny/math/unittests/internal/onetimepad-test.cc130
-rw-r--r--epid/member/tiny/math/unittests/main-testhelper.cc24
-rw-r--r--epid/member/tiny/math/unittests/onetimepad.h122
-rw-r--r--epid/member/tiny/math/unittests/pairing-test.cc79
-rw-r--r--epid/member/tiny/math/unittests/serialize-test.cc423
-rw-r--r--epid/member/tiny/math/unittests/sha256-test.cc350
-rw-r--r--epid/member/tiny/math/unittests/sha512-test.cc108
-rw-r--r--epid/member/tiny/math/unittests/utest.parts47
-rw-r--r--epid/member/tiny/math/unittests/vli-test.cc379
-rw-r--r--epid/member/tiny/math/vli.h196
-rw-r--r--epid/member/tiny/src/allowed_basenames.c76
-rw-r--r--epid/member/tiny/src/allowed_basenames.h46
-rw-r--r--epid/member/tiny/src/context.h75
-rw-r--r--epid/member/tiny/src/createjoinrequest.c121
-rw-r--r--epid/member/tiny/src/decompresskey.c29
-rw-r--r--epid/member/tiny/src/init.c94
-rw-r--r--epid/member/tiny/src/native_types.h64
-rw-r--r--epid/member/tiny/src/nrprove.c136
-rw-r--r--epid/member/tiny/src/nrprove.h66
-rw-r--r--epid/member/tiny/src/presig.c31
-rw-r--r--epid/member/tiny/src/presig_compute.c100
-rw-r--r--epid/member/tiny/src/presig_compute.h51
-rw-r--r--epid/member/tiny/src/provisioncompressed.c31
-rw-r--r--epid/member/tiny/src/provisioncredential.c81
-rw-r--r--epid/member/tiny/src/provisionkey.c90
-rw-r--r--epid/member/tiny/src/registerbasename.c47
-rw-r--r--epid/member/tiny/src/serialize.c141
-rw-r--r--epid/member/tiny/src/serialize.h98
-rw-r--r--epid/member/tiny/src/sethashalg.c33
-rw-r--r--epid/member/tiny/src/setsigrl.c79
-rw-r--r--epid/member/tiny/src/sign.c117
-rw-r--r--epid/member/tiny/src/signbasic.c159
-rw-r--r--epid/member/tiny/src/signbasic.h37
-rw-r--r--epid/member/tiny/src/startup.c27
-rw-r--r--epid/member/tiny/src/validate.c101
-rw-r--r--epid/member/tiny/src/validate.h86
-rw-r--r--epid/member/tiny/stdlib/endian.h38
-rw-r--r--epid/member/tiny/stdlib/src/tiny_stdlib.c46
-rw-r--r--epid/member/tiny/stdlib/tiny_stdlib.h64
-rw-r--r--epid/member/tiny/stdlib/tiny_stdlib.parts37
-rw-r--r--epid/member/tiny/unittests/allowed_basenames-test.cc117
-rw-r--r--epid/member/tiny/unittests/context-test.cc484
-rw-r--r--epid/member/tiny/unittests/decompress_privkey-test.cc99
-rw-r--r--epid/member/tiny/unittests/get_sigsize-test.cc94
-rw-r--r--epid/member/tiny/unittests/internal/nr_prove-test.cc181
-rw-r--r--epid/member/tiny/unittests/internal/presig_compute-test.cc44
-rw-r--r--epid/member/tiny/unittests/internal/serialize-test.cc409
-rw-r--r--epid/member/tiny/unittests/internal/signbasic-test.cc109
-rw-r--r--epid/member/tiny/unittests/internal/validate-test.cc317
-rw-r--r--epid/member/tiny/unittests/join_request-test.cc369
-rw-r--r--epid/member/tiny/unittests/main-testhelper.cc24
-rw-r--r--epid/member/tiny/unittests/member-testhelper.cc468
-rw-r--r--epid/member/tiny/unittests/member-testhelper.h119
-rw-r--r--epid/member/tiny/unittests/presig-test.cc117
-rw-r--r--epid/member/tiny/unittests/provision_compressed-test.cc176
-rw-r--r--epid/member/tiny/unittests/provision_credential-test.cc317
-rw-r--r--epid/member/tiny/unittests/provision_key-test.cc243
-rw-r--r--epid/member/tiny/unittests/sign-test.cc1082
-rw-r--r--epid/member/tiny/unittests/utest.parts64
-rw-r--r--epid/member/tinymember.parts98
-rw-r--r--epid/member/tpm2/commit.h72
-rw-r--r--epid/member/tpm2/context.h123
-rw-r--r--epid/member/tpm2/createprimary.h39
-rw-r--r--epid/member/tpm2/getrandom.h57
-rw-r--r--epid/member/tpm2/ibm_tss/commit.c147
-rw-r--r--epid/member/tpm2/ibm_tss/context.c150
-rw-r--r--epid/member/tpm2/ibm_tss/conversion.c134
-rw-r--r--epid/member/tpm2/ibm_tss/conversion.h117
-rw-r--r--epid/member/tpm2/ibm_tss/createprimary.c100
-rw-r--r--epid/member/tpm2/ibm_tss/getrandom.c78
-rw-r--r--epid/member/tpm2/ibm_tss/load_external.c137
-rw-r--r--epid/member/tpm2/ibm_tss/nv.c166
-rw-r--r--epid/member/tpm2/ibm_tss/printtss.c37
-rw-r--r--epid/member/tpm2/ibm_tss/printtss.h36
-rw-r--r--epid/member/tpm2/ibm_tss/sign.c155
-rw-r--r--epid/member/tpm2/ibm_tss/state.h39
-rw-r--r--epid/member/tpm2/load_external.h54
-rw-r--r--epid/member/tpm2/nv.h110
-rw-r--r--epid/member/tpm2/sign.h85
-rw-r--r--epid/member/tpm2/src/commit.c188
-rw-r--r--epid/member/tpm2/src/context.c119
-rw-r--r--epid/member/tpm2/src/createprimary.c58
-rw-r--r--epid/member/tpm2/src/getrandom.c43
-rw-r--r--epid/member/tpm2/src/load_external.c54
-rw-r--r--epid/member/tpm2/src/nv.c134
-rw-r--r--epid/member/tpm2/src/sign.c127
-rw-r--r--epid/member/tpm2/src/state.h63
-rw-r--r--epid/member/tpm2/unittests/commit-simulator-test.cc292
-rw-r--r--epid/member/tpm2/unittests/commit-test.cc321
-rw-r--r--epid/member/tpm2/unittests/context-test.cc105
-rw-r--r--epid/member/tpm2/unittests/conversion-tss-test.cc160
-rw-r--r--epid/member/tpm2/unittests/createprimary-test.cc48
-rw-r--r--epid/member/tpm2/unittests/getrandom-simulator-test.cc53
-rw-r--r--epid/member/tpm2/unittests/getrandom-test.cc67
-rw-r--r--epid/member/tpm2/unittests/getrandom-tss-test.cc44
-rw-r--r--epid/member/tpm2/unittests/load_external-simulator-test.cc58
-rw-r--r--epid/member/tpm2/unittests/load_external-test.cc60
-rw-r--r--epid/member/tpm2/unittests/main-testhelper.cc64
-rw-r--r--epid/member/tpm2/unittests/nv-test.cc326
-rw-r--r--epid/member/tpm2/unittests/sign-simulator-test.cc75
-rw-r--r--epid/member/tpm2/unittests/sign-test.cc320
-rw-r--r--epid/member/tpm2/unittests/tpm2-testhelper.cc157
-rw-r--r--epid/member/tpm2/unittests/tpm2-testhelper.h78
-rw-r--r--epid/member/tpm2/unittests/tpm2_wrapper-testhelper.cc61
-rw-r--r--epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h58
-rw-r--r--epid/member/tpm_member.h48
-rw-r--r--epid/member/unittests/context-test.cc620
-rw-r--r--epid/member/unittests/decompress_privkey-test.cc98
-rw-r--r--epid/member/unittests/get_sigsize-test.cc97
-rw-r--r--epid/member/unittests/iskeyvalid-test.cc198
-rw-r--r--epid/member/unittests/join_request-test.cc380
-rw-r--r--epid/member/unittests/main-test.cc66
-rw-r--r--epid/member/unittests/member-testhelper.cc436
-rw-r--r--epid/member/unittests/member-testhelper.h115
-rw-r--r--epid/member/unittests/nr_prove-test.cc413
-rw-r--r--epid/member/unittests/presig-test.cc116
-rw-r--r--epid/member/unittests/privateexp-test.cc155
-rw-r--r--epid/member/unittests/provision_compressed-test.cc178
-rw-r--r--epid/member/unittests/provision_credential-test.cc318
-rw-r--r--epid/member/unittests/provision_key-test.cc244
-rw-r--r--epid/member/unittests/resize-test.cc63
-rw-r--r--epid/member/unittests/sign-test.cc1160
-rw-r--r--epid/member/unittests/signbasic-test.cc609
-rw-r--r--epid/member/unittests/storage-test.cc126
-rw-r--r--epid/verifier/1.1/api.h493
-rw-r--r--epid/verifier/1.1/src/check_privrl_entry.c90
-rw-r--r--epid/verifier/1.1/src/context.c450
-rw-r--r--epid/verifier/1.1/src/context.h47
-rw-r--r--epid/verifier/1.1/src/nrverify.c253
-rw-r--r--epid/verifier/1.1/src/sigs_linked.c29
-rw-r--r--epid/verifier/1.1/src/verify.c246
-rw-r--r--epid/verifier/1.1/src/verifybasic.c412
-rw-r--r--epid/verifier/1.1/unittests/check_privrl_entry-test.cc84
-rw-r--r--epid/verifier/1.1/unittests/context-test.cc489
-rw-r--r--epid/verifier/1.1/unittests/nrverify-test.cc232
-rw-r--r--epid/verifier/1.1/unittests/sigs_linked-test.cc72
-rw-r--r--epid/verifier/1.1/unittests/testdata/verifier_precmp.inc73
-rw-r--r--epid/verifier/1.1/unittests/verifier-testhelper.cc304
-rw-r--r--epid/verifier/1.1/unittests/verifier-testhelper.h128
-rw-r--r--epid/verifier/1.1/unittests/verify-test.cc772
-rw-r--r--epid/verifier/1.1/unittests/verifybasic-test.cc112
-rw-r--r--epid/verifier/Makefile90
-rw-r--r--epid/verifier/api.h588
-rw-r--r--epid/verifier/src/check_privrl_entry.c93
-rw-r--r--epid/verifier/src/context.c687
-rw-r--r--epid/verifier/src/context.h47
-rw-r--r--epid/verifier/src/nrverify.c244
-rw-r--r--epid/verifier/src/sigs_linked.c31
-rw-r--r--epid/verifier/src/verify.c198
-rw-r--r--epid/verifier/src/verifybasic.c316
-rw-r--r--epid/verifier/unittests/check_privrl_entry-test.cc117
-rw-r--r--epid/verifier/unittests/context-test.cc1111
-rw-r--r--epid/verifier/unittests/main-test.cc27
-rw-r--r--epid/verifier/unittests/nrverify-test.cc292
-rw-r--r--epid/verifier/unittests/sigs_linked-test.cc69
-rw-r--r--epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc39
-rw-r--r--epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc54
-rw-r--r--epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc54
-rw-r--r--epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc54
-rw-r--r--epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc113
-rw-r--r--epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc29
-rw-r--r--epid/verifier/unittests/verifier-testhelper.cc768
-rw-r--r--epid/verifier/unittests/verifier-testhelper.h280
-rw-r--r--epid/verifier/unittests/verify-test.cc1317
-rw-r--r--epid/verifier/unittests/verifybasic-test.cc179
-rw-r--r--epid/verifier/verifier.parts120
-rw-r--r--example/Makefile90
-rw-r--r--example/compressed_data/README.md179
-rw-r--r--example/compressed_data/cacert.binbin0 -> 324 bytes
-rw-r--r--example/compressed_data/compressed_data.parts72
-rw-r--r--example/compressed_data/groupa/member0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/member1/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/privrevokedmember0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/privrevokedmember1/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/privrevokedmember2/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/privrl.binbin0 -> 188 bytes
-rw-r--r--example/compressed_data/groupa/privrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/compressed_data/groupa/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/compressed_data/groupa/sigrevokedmember0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/sigrevokedmember1/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/sigrevokedmember2/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupa/sigrl.binbin0 -> 476 bytes
-rw-r--r--example/compressed_data/groupa/sigrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/compressed_data/groupb/member0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupb/privrevokedmember0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupb/privrl.binbin0 -> 124 bytes
-rw-r--r--example/compressed_data/groupb/privrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/compressed_data/groupb/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/compressed_data/groupb/sigrevokedmember0/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/groupb/sigrl.binbin0 -> 476 bytes
-rw-r--r--example/compressed_data/groupb/sigrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/compressed_data/grprl.binbin0 -> 1660 bytes
-rw-r--r--example/compressed_data/grprl_empty.binbin0 -> 76 bytes
-rw-r--r--example/compressed_data/mprivkey.datbin0 -> 80 bytes
-rw-r--r--example/compressed_data/privrl.binbin0 -> 188 bytes
-rw-r--r--example/compressed_data/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/compressed_data/sigrl.binbin0 -> 476 bytes
-rw-r--r--example/data/README.md179
-rw-r--r--example/data/cacert.binbin0 -> 324 bytes
-rw-r--r--example/data/data.parts72
-rw-r--r--example/data/groupa/member0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/member1/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/privrevokedmember0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/privrevokedmember1/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/privrevokedmember2/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/privrl.binbin0 -> 188 bytes
-rw-r--r--example/data/groupa/privrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/data/groupa/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/data/groupa/sigrevokedmember0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/sigrevokedmember1/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/sigrevokedmember2/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupa/sigrl.binbin0 -> 476 bytes
-rw-r--r--example/data/groupa/sigrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/data/groupb/member0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupb/privrevokedmember0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupb/privrl.binbin0 -> 188 bytes
-rw-r--r--example/data/groupb/privrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/data/groupb/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/data/groupb/sigrevokedmember0/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/groupb/sigrl.binbin0 -> 476 bytes
-rw-r--r--example/data/groupb/sigrl_empty.binbin0 -> 92 bytes
-rw-r--r--example/data/grprl.binbin0 -> 876 bytes
-rw-r--r--example/data/grprl_empty.binbin0 -> 76 bytes
-rw-r--r--example/data/mprivkey.datbin0 -> 144 bytes
-rw-r--r--example/data/privrl.binbin0 -> 92 bytes
-rw-r--r--example/data/pubkey.binbin0 -> 340 bytes
-rw-r--r--example/data/sigrl.binbin0 -> 92 bytes
-rw-r--r--example/signmsg/signmsg.parts53
-rw-r--r--example/signmsg/src/main.c409
-rw-r--r--example/signmsg/src/prng.c98
-rw-r--r--example/signmsg/src/prng.h42
-rw-r--r--example/signmsg/src/signmsg.c196
-rw-r--r--example/signmsg/src/signmsg.h42
-rw-r--r--example/util/Makefile32
-rw-r--r--example/util/buffutil.h159
-rw-r--r--example/util/convutil.h98
-rw-r--r--example/util/envutil.h54
-rw-r--r--example/util/src/bufutil.c364
-rw-r--r--example/util/src/convutil.c108
-rw-r--r--example/util/src/envutil.c91
-rw-r--r--example/util/src/strutil.c53
-rw-r--r--example/util/stdtypes.h39
-rw-r--r--example/util/strutil.h33
-rw-r--r--example/util/util.parts64
-rw-r--r--example/verifysig/src/main.c515
-rw-r--r--example/verifysig/src/verifysig.c196
-rw-r--r--example/verifysig/src/verifysig.h45
-rw-r--r--example/verifysig/src/verifysig11.c181
-rw-r--r--example/verifysig/src/verifysig11.h40
-rw-r--r--example/verifysig/verifysig.parts53
-rw-r--r--ext/argtable3/LICENSE26
-rw-r--r--ext/argtable3/Makefile22
-rw-r--r--ext/argtable3/argtable3.c5062
-rw-r--r--ext/argtable3/argtable3.h305
-rw-r--r--ext/argtable3/argtable3.parts45
-rw-r--r--ext/gtest/LICENSE28
-rw-r--r--ext/gtest/Makefile23
-rw-r--r--ext/gtest/gtest-all.cc10407
-rw-r--r--ext/gtest/gtest.h21203
-rw-r--r--ext/gtest/gtest.parts52
-rw-r--r--ext/ipp/include/ippbase.h188
-rw-r--r--ext/ipp/include/ippcp.h1195
-rw-r--r--ext/ipp/include/ippcpdefs.h777
-rw-r--r--ext/ipp/include/ippdefs.h121
-rw-r--r--ext/ipp/include/ipptypes.h977
-rw-r--r--ext/ipp/ippcp.parts131
-rw-r--r--ext/ipp/sources/include/owndefs.h926
-rw-r--r--ext/ipp/sources/ippcp/Makefile31
-rw-r--r--ext/ipp/sources/ippcp/src/gsmodinv.c166
-rw-r--r--ext/ipp/sources/ippcp/src/gsmodmethod.c719
-rw-r--r--ext/ipp/sources/ippcp/src/gsmodmethod.h97
-rw-r--r--ext/ipp/sources/ippcp/src/gsmodstuff.c168
-rw-r--r--ext/ipp/sources/ippcp/src/gsmodstuff.h137
-rw-r--r--ext/ipp/sources/ippcp/src/gsscramble.c127
-rw-r--r--ext/ipp/sources/ippcp/src/gsscramble.h71
-rw-r--r--ext/ipp/sources/ippcp/src/owncp.h203
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbn.h208
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnca.c1297
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnsetca.c117
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnu32arith.c280
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnu32arith.h51
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnu32misc.c126
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnu32misc.h65
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnuarith.c538
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnuarith.h170
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnuimpl.h136
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnumisc.c225
-rw-r--r--ext/ipp/sources/ippcp/src/pcpbnumisc.h150
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp.h200
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp128r1r2dpca.c75
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp192r1dpca.c63
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp224r1dpca.c63
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp256r1dpca.c63
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp384r1dpca.c64
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccp521r1dpca.c63
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpdpca.c453
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c108
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpinitca.c251
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccppointca.c105
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccppointopca.c397
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c104
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c194
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpsm2dpca.c64
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpstdca.c340
-rw-r--r--ext/ipp/sources/ippcp/src/pcpeccpverifydsaca.c174
-rw-r--r--ext/ipp/sources/ippcp/src/pcpecprime.h55
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfp.c1165
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpec.c881
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecdh.c229
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpeckeys.c257
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecpoint.c643
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecpointstuff.c1243
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecsigndsa.c331
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecsignnr.c314
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecsignsm2.c349
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpecstuff.h342
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod.h62
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_192r1.c180
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_224r1.c179
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_256.c154
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_256r1.c178
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_384r1.c182
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_521r1.c189
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_com.c37
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpmethod_sm2.c179
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpstuff.c296
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpstuff.h216
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpx.c250
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom.c442
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom_epid2.c498
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.c311
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.h52
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxstuff.c722
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxstuff.h161
-rw-r--r--ext/ipp/sources/ippcp/src/pcphash.h229
-rw-r--r--ext/ipp/sources/ippcp/src/pcphash_rmf.h51
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashca.c683
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashca_rmf.c437
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashcnt.c434
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashmethod_rmf.h44
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashsha1px.c188
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashsha256px.c213
-rw-r--r--ext/ipp/sources/ippcp/src/pcphashsha512px.c220
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmontexpbinca.c451
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmontgomery.h308
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmontgomeryca.c424
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmontred.c75
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmontred.h56
-rw-r--r--ext/ipp/sources/ippcp/src/pcpmulbnukara.h87
-rw-r--r--ext/ipp/sources/ippcp/src/pcpp192r1precomca.c1936
-rw-r--r--ext/ipp/sources/ippcp/src/pcpp224r1precomca.c4488
-rw-r--r--ext/ipp/sources/ippcp/src/pcpp256r1precomca.c2539
-rw-r--r--ext/ipp/sources/ippcp/src/pcpp384r1precomca.c1523
-rw-r--r--ext/ipp/sources/ippcp/src/pcpp521r1precomca.c4056
-rw-r--r--ext/ipp/sources/ippcp/src/pcpprng.h71
-rw-r--r--ext/ipp/sources/ippcp/src/pcpprngenca.c296
-rw-r--r--ext/ipp/sources/ippcp/src/pcpprnginitca.c111
-rw-r--r--ext/ipp/sources/ippcp/src/pcpprngsetca.c239
-rw-r--r--ext/ipp/sources/ippcp/src/pcpsha256ca.c814
-rw-r--r--ext/ipp/sources/ippcp/src/pcpsm2pprecomca.c2539
-rw-r--r--ext/ipp/sources/ippcp/src/pcptool.h657
-rw-r--r--ext/ipp/sources/ippcp/src/pcpvariant.h419
-rw-r--r--parts-site/configurations/__init__.py27
-rw-r--r--parts-site/configurations/debug/__init__.py20
-rw-r--r--parts-site/configurations/debug/g++.py56
-rw-r--r--parts-site/configurations/debug/g++_win32-any.py58
-rw-r--r--parts-site/configurations/debug/gcc.py61
-rw-r--r--parts-site/configurations/debug/gcc_win32-any.py60
-rw-r--r--parts-site/configurations/debug/intelc_posix-any.py48
-rw-r--r--parts-site/configurations/debug/intelc_win32-any_win32-x86.py49
-rw-r--r--parts-site/configurations/debug/intelc_win32-any_win32-x86_64.py48
-rw-r--r--parts-site/configurations/debug/msvc_win32-any_win32-x86.py54
-rw-r--r--parts-site/configurations/debug/msvc_win32-any_win32-x86_64.py53
-rw-r--r--parts-site/configurations/embedded/__init__.py20
-rw-r--r--parts-site/configurations/embedded/gcc.py72
-rw-r--r--parts-site/configurations/embedded/gcc_win32-any.py72
-rw-r--r--parts-site/configurations/embedded/intelc_posix-any.py66
-rw-r--r--parts-site/configurations/embedded/intelc_win32-any.py69
-rw-r--r--parts-site/configurations/embedded/msvc_win32-any.py85
-rw-r--r--parts-site/configurations/release/__init__.py20
-rw-r--r--parts-site/configurations/release/g++.py55
-rw-r--r--parts-site/configurations/release/g++_win32-any.py61
-rw-r--r--parts-site/configurations/release/gcc.py63
-rw-r--r--parts-site/configurations/release/gcc_win32-any.py65
-rw-r--r--parts-site/configurations/release/intelc_posix-any.py57
-rw-r--r--parts-site/configurations/release/intelc_win32-any_win32-x86.py52
-rw-r--r--parts-site/configurations/release/intelc_win32-any_win32-x86_64.py51
-rw-r--r--parts-site/configurations/release/msvc_win32-any_win32-x86.py58
-rw-r--r--parts-site/configurations/release/msvc_win32-any_win32-x86_64.py57
-rw-r--r--parts-site/pieces/arm_support.py23
-rw-r--r--parts-site/tools/g++.py74
-rw-r--r--parts-site/tools/gcc.py73
-rw-r--r--tools/Makefile109
-rw-r--r--tools/extractgrps/extractgrps.parts47
-rw-r--r--tools/extractgrps/src/main.c210
-rw-r--r--tools/extractkeys/extractkeys.parts47
-rw-r--r--tools/extractkeys/src/main.c232
-rw-r--r--tools/revokegrp/revokegrp.parts46
-rw-r--r--tools/revokegrp/src/main.c375
-rw-r--r--tools/revokekey/revokekey.parts47
-rw-r--r--tools/revokekey/src/main.c342
-rw-r--r--tools/revokesig/revokesig.parts46
-rw-r--r--tools/revokesig/src/main.c434
1094 files changed, 236143 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..9c12ee4
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,264 @@
+# Intel(R) EPID SDK ChangeLog {#ChangeLog}
+
+## [6.0.1] - 2018-05-04
+
+### Changed
+
+- Updated Intel(R) IPP Cryptography library to version 2018 (Update
+ 2.1).
+
+### Fixed
+
+- The member library now includes the tpm2 subcomponent when built
+ using SCons, instead of requiring a separate member.tpm2 library.
+
+### Known Issues
+
+- Only the SHA-256 hash algorithm is supported when using the SDK with
+ the IBM TPM simulator due to a defect in version 532 of the
+ simulator.
+
+- Basenames are limited to 124 bytes in TPM mode.
+
+- Scons build will not work natively on ARM. You can still build using
+ `make` or cross compile.
+
+## [6.0.0] - 2017-12-15
+
+### Added
+
+- The member can now be built with a substantially reduced code size
+ using a compilation option.
+
+- New context lifetime management APIs have been added to member to
+ give callers more control of memory allocation.
+
+- New member API `EpidClearRegisteredBasenames` has been added to
+ clear registered basenames without recreating the member.
+
+### Changed
+
+- `EpidRegisterBaseName` was renamed to `EpidRegisterBasename` because
+ basename is a single word.
+
+- Command-line parsing library used by samples and tools has been
+ replaced by Argtable3.
+
+
+### Deprecated
+
+- `EpidMemberCreate` has been deprecated. This API has been superseded
+ by `EpidMemberGetSize` and `EpidMemberInit`.
+
+- `EpidMemberDelete` has been deprecated. This API has been superseded
+ by `EpidMemberDeinit`.
+
+### Removed
+
+- `size_optimized_release` build configuration has been removed.
+ Use the compilation option to build member with reduced code size.
+
+### Known Issues
+
+- Only the SHA-256 hash algorithm is supported when using the SDK with
+ the IBM TPM simulator due to a defect in version 532 of the
+ simulator.
+
+- Basenames are limited to 124 bytes in TPM mode.
+
+- Scons build will not work natively on ARM. You can still build using
+ `make` or cross compile.
+
+
+## [5.0.0] - 2017-09-15
+
+### Added
+
+- The member implementation now has the option to support signing
+ using a TPM, using the ECDAA capabilities of TPM 2.0.
+
+
+### Changed
+
+- Member API updated to unify HW and SW use cases.
+ - Added
+ - `ProvisionKey`
+ - `ProvisionCompressed`
+ - `ProvisionCredential`
+ - `Startup`
+ - Parameters changed
+ - `MemberCreate`
+ - `RequestJoin`
+ - Removed or made private
+ - `WritePrecomp`
+ - `SignBasic`
+ - `NrProve`
+ - `AssemblePrivKey`
+
+- `EpidRequestJoin` was renamed to `EpidCreateJoinRequest` to make it
+ clear that it is not directly communicating with the issuer.
+
+
+### Fixed
+
+- `EpidCreateJoinRequest` creates valid join requests. This fixes a
+ regression in `EpidRequestJoin` introduced in 4.0.0.
+
+
+### Known Issues
+
+- Only the SHA-256 hash algorithm is supported when using the
+ SDK with the IBM TPM simulator due to a defect in version
+ 532 of the simulator.
+
+- Basenames are limited to 124 bytes in TPM mode.
+
+
+## [4.0.0] - 2017-04-25
+
+### Added
+
+- The member implementation now provides an internal interface that
+ gives guidance on partitioning member operations between highly
+ sensitive ones that use f value of the private key, and less
+ sensitive operations that can be performed in a host environment.
+
+- New member API `EpidAssemblePrivKey` was added to help assemble and
+ validate the new member private key that is created when a member
+ either joins a group (using the join protocol) or switches to a new
+ group (as the result of a performance rekey).
+
+
+### Changed
+
+- Updated Intel(R) IPP Cryptography library to version 2017 (Update 2).
+
+- The mechanism to set the signature based revocation list (SigRL)
+ used for signing was changed. `EpidMemberSetSigRl` must be used to
+ set the SigRL. The SigRL is no longer a parameter to `EpidSign`.
+ This better models typical use case where a device stores a
+ revocation list and updates it independently of signing operations.
+
+
+### Removed
+
+- Removed `EpidWritePreSigs` API. Serialization of pre-computed
+ signatures is a risky capability to provide, and simply expanding
+ the internal pool via `EpidAddPreSigs` still provides most of the
+ optimization benefits.
+
+- The `EpidIsPrivKeyInGroup` API is no longer exposed to clients. It
+ is no longer needed because the new member API `EpidAssemblePrivKey`
+ performs this check.
+
+
+### Fixed
+
+- When building with commercial version of the Intel(R) IPP
+ Cryptography library, optimized functions are now properly invoked,
+ making signing and verification operations ~2 times faster
+
+- SHA-512/256 hash algorithm is now supported.
+
+- README for compressed data now correctly documents the number of
+ entries in revocation lists.
+
+- The `verifysig` sample now reports a more clear error message for
+ mismatched SigRLs.
+
+- The default scons build will now build for a 32-bit target on a
+ 32-bit platform.
+
+
+### Known Issues
+
+- Scons build will not work natively on ARM. You can still build using
+ `make` or cross compile.
+
+
+## [3.0.0] - 2016-11-22
+
+### Added
+
+- Support for verification of Intel(R) EPID 1.1 members.
+
+- Make-based build system support.
+
+- Sample material includes compressed keys.
+
+- Enhanced documentation, including step-by-step walkthroughs of
+ example applications.
+
+- Validated on additional IoT platforms.
+
+ - Ostro Linux
+
+ - Snappy Ubuntu Core
+
+
+### Changes
+
+- A new verifier API has been added to set the basename to be used for
+ verification. Verifier APIs that used to accept basenames now use
+ the basename set via `EpidVerifierSetBasename`.
+
+- The verifier pre-computation structure has been changed to include
+ the group ID to allow detection of errors that result from providing
+ a pre-computation blob from a different group to
+ `EpidVerifierCreate`.
+
+
+### Fixes
+
+- The kEpidxxxRevoked enums have been renamed to be consistent with
+ other result return values.
+
+
+### Known Issues
+
+- SHA-512/256 hash algorithm is not supported.
+
+
+## [2.0.0] - 2016-07-20
+
+### Added
+
+- Signed binary issuer material support.
+
+ - Binary issuer material validation APIs.
+
+ - Updated sample issuer material.
+
+ - Updated samples that parse signed binary issuer material.
+
+- Compressed member private key support.
+
+- Validated on additional IoT platforms.
+
+ - Windows 10 IoT Core
+
+ - WindRiver IDP
+
+
+### Changed
+
+- The default hash algorithm has changed. It is now SHA-512.
+
+- Functions that returned `EpidNullPtrErr` now return `EpidBadArgErr`
+ instead.
+
+
+### Fixed
+
+- Updated build flags to work around GCC 4.8.5 defect.
+
+
+## [1.0.0] - 2016-03-03
+
+### Added
+
+- Basic sign and verify functionality
+
+- Dynamic join support for member
+
+- Apache 2.0 License
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..6af6000
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,253 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+=======================================================================
+
+SDK Subcomponents:
+
+The Intel(R) EPID SDK contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+
+-----------------------------------------------------------------------
+The BSD 3-Clause License
+-----------------------------------------------------------------------
+
+The Intel(R) EPID SDK bundles portions of the following under the BSD
+3-Clause License:
+
+ - Google Test (https://github.com/google/googletest)
+ Copyright 2008, Google Inc.
+ - Argtable3 (https://github.com/argtable/argtable3)
+ Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ <sheitmann@users.sourceforge.net>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..1c96fc2
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,207 @@
+#!/usr/bin/make -f
+
+#variables are set by configure
+prefix = @prefix@
+installdir = $(prefix)/
+epidinstalldir = $(installdir)/epid-sdk
+CC = @CC@
+CXX = @CXX@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+RANLIB = @RANLIB@
+TSS_PATH = @TSS_PATH@
+TINY = @TINY@
+
+#set performance affecting flags
+SIZE_CFLAGS := -O2
+
+#gcc flags
+CC_FLAGS := $(CFLAGS) $(SIZE_CFLAGS) -Werror -Wall -Wextra -Wno-missing-braces \
+ -Wno-missing-field-initializers -Wno-unknown-pragmas -Wno-unused-function \
+ -fno-strict-aliasing -Wno-unused-but-set-variable -Wno-comment -Wformat \
+ -Wformat-security -fstack-protector -DNDEBUG -D_FORTIFY_SOURCE=2
+
+#intel c compiler flags
+ICC_FLAGS := $(CFLAGS) $(SIZE_CFLAGS) -Werror -Wall -Wextra -DNDEBUG \
+ -fstack-protector -D_FORTIFY_SOURCE=2 \
+ -Wformat -Wformat-security
+
+ifneq ($(OS),Windows_NT)
+ CC_FLAGS += -fPIC
+ ICC_FLAGS += -fPIC
+ CXX11_FLAG = -std=c++0x
+ EXE_EXTENSION =
+else
+ CC_FLAGS += -D__int64='long long'
+ CXX11_FLAG = -std=gnu++11
+ EXE_EXTENSION = .exe
+endif
+
+#g++ flags
+CXX_FLAGS := $(CC_FLAGS) $(CXX11_FLAG)
+
+#intel c++ compiler flags
+ICPC_FLAGS := $(ICC_FLAGS) $(CXX11_FLAG)
+
+#check if architecture was specified
+#or take it by shell command
+ifeq ($(findstring -m32,$(CFLAGS)),-m32)
+ ARCH = x86
+ CXXFLAGS += -m32
+ LDFLAGS += -m32
+else ifeq ($(findstring -m64,$(CFLAGS)),-m64)
+ ARCH = x86_64
+ CXXFLAGS += -m64
+ LDFLAGS += -m64
+else
+ ifeq ($(findstring arm-,$(CC)),arm-)
+ ARCH = arm
+
+ ifneq (,$(findstring gnueabihf,$(CC)))
+ ARCH := $(addsuffix hf,$(ARCH))
+ endif
+
+ else
+ ARCH := $(shell uname -m)
+ endif
+endif
+
+#set ippflags
+IPP_FLAGS := -D_IPP_v50_ -D_IPP_DEBUG -D_DISABLE_ALG_MD5_ -D_DISABLE_ALG_SM3_
+
+#set tools and flags depending on specified compiler
+ifeq ($(findstring icc,$(CC)),icc)
+ CFLAGS := $(ICC_FLAGS)
+ CXXFLAGS := $(ICPC_FLAGS)
+ AR = $(subst icc,xiar,$(CC))
+else
+ CFLAGS := $(CC_FLAGS)
+ CXXFLAGS := $(CXX_FLAGS)
+endif
+
+# ld flags
+LDFLAGS += -fstack-protector
+ifneq ($(OS),Windows_NT)
+ LDFLAGS += -z noexecstack -z relro -z now -pie
+endif
+
+#gtest defines
+GTEST_DEFINES := -DGTEST_HAS_PTHREAD=0 -D_VARIADIC_MAX=10
+
+#set flags for unit tests executables
+GTEST_FLAGS = --gtest_color=yes \
+ --gtest_print_time=1 \
+ --gtest_output=xml
+
+export CC LDFLAGS ARCH CFLAGS
+export CXX CXXFLAGS
+export AR RANLIB
+export epidinstalldir
+export GTEST_FLAGS GTEST_DEFINES IPP_FLAGS
+export EXE_EXTENSION
+export TSS_PATH
+export TINY
+
+#output of the main parameters
+$(info $$ccompiler is [${CC}])
+$(info $$cxxcompiler is [${CXX}])
+$(info $$architecture is [${ARCH}])
+#targets part
+all:
+ $(MAKE) ipp common member verifier argtable3 examples_util
+ $(MAKE) examples epid_tools
+
+clean:
+ $(MAKE) -C ./ext/ipp/sources/ippcp clean
+ $(MAKE) -C ./epid/common/ clean
+ $(MAKE) -C ./epid/member/ clean
+ $(MAKE) -C ./epid/verifier/ clean
+ $(MAKE) -C ./example/util/ clean
+ $(MAKE) -C ./example/ clean
+ $(MAKE) -C ./tools/ clean
+ $(MAKE) -C ./ext/gtest/ clean
+ $(MAKE) -C ./epid/common-testhelper/ clean
+ $(MAKE) -C ./ext/argtable3/ clean
+ifneq ("$(wildcard ./ext/google_benchmark)","")
+ $(MAKE) -C ./ext/google_benchmark/ clean
+endif
+
+install:
+ $(MAKE) -C ./ext/ipp/sources/ippcp install
+ $(MAKE) -C ./epid/common/ install
+ $(MAKE) -C ./epid/member/ install
+ $(MAKE) -C ./epid/verifier/ install
+ $(MAKE) -C ./example/ install
+ $(MAKE) -C ./tools/ install
+ $(MAKE) -C ./epid/common-testhelper/ install
+
+uninstall:
+ rm -rf $(epidinstalldir)
+
+ipp:
+ $(MAKE) -C ./ext/ipp/sources/ippcp all
+
+common-testhelper:
+ $(MAKE) -C ./epid/common-testhelper/ all
+
+common-testhelper_utest:
+ $(MAKE) -C ./epid/common-testhelper/ utest
+
+common:
+ $(MAKE) -C ./epid/common/ all
+
+common_utest:
+ $(MAKE) -C ./epid/common/ utest
+
+member:
+ $(MAKE) -C ./epid/member/ all
+
+member_utest:
+ $(MAKE) -C ./epid/member/ utest
+
+verifier:
+ $(MAKE) -C ./epid/verifier/ all
+
+verifier_utest:
+ $(MAKE) -C ./epid/verifier/ utest
+
+gtest:
+ $(MAKE) -C ./ext/gtest/ all
+
+argtable3:
+ $(MAKE) -C ./ext/argtable3/ all
+
+examples_util:
+ $(MAKE) -C ./example/util/ all
+
+utest:
+ $(MAKE) gtest common-testhelper
+ $(MAKE) common-testhelper_utest common_utest member_utest verifier_utest
+
+run_utest:
+ $(MAKE) -C ./epid/common-testhelper/ run_utest
+ $(MAKE) -C ./epid/common/ run_utest
+ $(MAKE) -C ./epid/member/ run_utest
+ $(MAKE) -C ./epid/verifier/ run_utest
+
+check:
+ $(MAKE) utest
+ $(MAKE) run_utest
+
+examples:
+ $(MAKE) -C ./example/ all
+
+epid_tools:
+ $(MAKE) -C ./tools/ all
+
+perf:
+ifneq ("$(wildcard ./ext/google_benchmark/)","")
+ $(MAKE) -C ./ext/google_benchmark/ all
+ $(MAKE) -C ./ext/google_benchmark/ utest
+ $(MAKE) -C ./ext/google_benchmark/ run_utest
+endif
+
+build:
+ $(MAKE) all
+ $(MAKE) check
+ $(MAKE) install
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..51a62a2
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,21 @@
+Intel(R) EPID SDK
+Copyright 2016-2017 Intel Corporation
+
+==========
+
+The Intel(R) EPID SDK contains subcomponents with separate copyright
+notices and license terms.
+
+Your use of the source code for the these subcomponents is subject to
+the terms and conditions of their respective licenses.
+
+See the LICENSE.txt file for a list of subcomponents and dependencies
+and their respective licenses.
+
+----------
+
+The source code used for math primitives in the Intel(R) EPID SDK is a
+subset of Intel(R) IPP Cryptography 2017 Update 2 written in C. For
+higher performance, you can use the commercial version of the IPP
+Cryptography libraries, which are available at
+https://software.intel.com/articles/download-ipp-cryptography-libraries.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2c201e0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,63 @@
+# Intel(R) EPID SDK
+
+The Intel(R) Enhanced Privacy ID Software Development Kit
+
+Intel(R) EPID SDK enables adding Intel(R) EPID support to applications
+and platforms.
+
+Intel(R) EPID is a cryptographic protocol which enables the remote
+authentication of a trusted platform whilst preserving the user's
+privacy.
+
+* For a given public key there are many (e.g., millions) of private
+ keys. The key holders form a group.
+
+* Any key holder may sign against the one public key.
+
+* No one can tell which private key signed the data. This is the
+ privacy property.
+
+You can use Intel(R) EPID as a foundational building block for a
+multitude of security solutions.
+
+
+## Prerequisites
+
+* [Python](http://www.python.org)
+
+* [SCons](http://www.scons.org/)
+
+* [Parts](https://bitbucket.org/sconsparts/parts)
+
+* A C/C++ compiler supported by Parts
+
+
+## What's New in This Release
+
+See [CHANGELOG.md](CHANGELOG.md).
+
+
+## Documentation
+
+See [doc/index.html](doc/index.html) to browse the html
+documentation.
+
+
+## License
+
+See [LICENSE.txt](LICENSE.txt).
+
+
+## Math Primitives
+
+The source code used for math primitives in the Intel(R) EPID SDK is a
+subset of the Intel(R) IPP Cryptography library (version 2017 Update
+2) written in pure C and not optimized for performance. For higher
+performance, you can use the commercial version of the IPP
+Cryptography library, which is available at
+[https://software.intel.com/articles/download-ipp-cryptography-libraries](https://software.intel.com/articles/download-ipp-cryptography-libraries).
+
+More information on the optimized versions of Intel(R) IPP
+Cryptography library, including mitigations for a potential
+side-channel issue are available at
+[https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00060&languageid=en-fr](https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00060&languageid=en-fr).
diff --git a/SConstruct b/SConstruct
new file mode 100644
index 0000000..033d2d7
--- /dev/null
+++ b/SConstruct
@@ -0,0 +1,566 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+"""use scons -k to invoke all builds regardless of unit test failures
+"""
+import string
+import sys
+import SCons.Script
+import os.path
+import subprocess
+from subprocess import Popen, PIPE
+from parts import *
+import re
+import tempfile
+import shutil
+from collections import OrderedDict
+
+def get_parts_versions(env):
+ """Get Parts related versions given SCons environment env"""
+ return OrderedDict({'python': string.split(sys.version, " ", 1)[0],
+ 'scons': str(SCons.__version__),
+ 'parts': str(PartsExtensionVersion())})
+
+def get_toolchain_versions(env):
+ """Get version of compilation toolchain given SCons environment env"""
+ versions = OrderedDict()
+ if 'MSVC_VERSION' in env:
+ versions['compiler'] = 'MSVC ' + env['MSVC_VERSION']
+ cmd = env.subst('echo int main(){return 0;} > a.cpp'
+ ' | $CXX $CCFLAGS a.cpp /link /verbose')
+ defaultlib_regexp = r'.*Searching (.*\.lib).*'
+ elif 'GCC_VERSION' in env:
+ versions['compiler'] = 'GCC ' + env['GCC_VERSION']
+ if 'GXX_VERSION' in env:
+ versions['compiler'] += ' and GXX ' + env['GXX_VERSION']
+ if os.name == 'nt':
+ cmd = env.subst('echo int main(){return 0;}'
+ ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
+ else:
+ cmd = env.subst('echo "int main(){return 0;}"'
+ ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
+ else:
+ if os.name == 'nt':
+ cmd = env.subst('echo int main(){return 0;}'
+ ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
+ else:
+ cmd = env.subst('echo "int main(){return 0;}"'
+ ' | $CC $CCFLAGS -xc -Wl,--verbose -')
+ if os.name == 'nt':
+ defaultlib_regexp = r'\n.* open (.*) succeeded'
+ else:
+ defaultlib_regexp = r'[\n(](/.*\.so[-.\da-fA-F]*).*'
+
+ # Intel C compiler always depends from base toolchain
+ if 'INTELC_VERSION' in env:
+ versions['compiler'] = 'INTELC {0} with {1}'.format(
+ env['INTELC_VERSION'],
+ versions['compiler'])
+
+ env['ENV']['PATH'] = str(env['ENV']['PATH'])
+ temp_dir = tempfile.mkdtemp()
+ try:
+ proc = subprocess.Popen(cmd,
+ cwd=temp_dir,
+ env=env['ENV'],
+ shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ stdout, _ = proc.communicate()
+ if proc.returncode != 0:
+ versions['default_libs'] = 'failure executing: "{0}"'.format(cmd)
+ else:
+ default_libs = list(
+ set(re.findall(defaultlib_regexp, stdout, re.M)))
+ if 'MSVC_VERSION' in env:
+ # for windows additionally report versions of Windows Kit used
+ runtime_version_set = set()
+ for lib_path in default_libs:
+ path_components = os.path.realpath(lib_path).split(os.sep)
+ if 'Windows Kits' in path_components:
+ i = path_components.index('Windows Kits')
+ runtime_version_set.add(
+ 'Windows Kits {0} {1}'.format(path_components[i + 1],
+ path_components[i + 3]))
+ versions['sdk_or_libc'] = '; '.join(list(runtime_version_set))
+ else:
+ # for posix additionally report versions of libc used
+ versions['sdk_or_libc'] = os.path.split(os.path.realpath(
+ next((lib for lib in default_libs if
+ 'libc' in lib.lower() and 'libcilk' not in lib.lower()), None)))[1]
+ versions['default_libs'] = default_libs
+ finally:
+ shutil.rmtree(temp_dir)
+
+ return versions
+
+
+def log_versions(env, include_toolchain=True):
+ """Log tools and libraries versions given SCons environment env
+
+ Args:
+ env: Scons environment.
+ include_toolchain: Log version of compilation toolchain if True.
+ """
+
+ versions = get_parts_versions(env)
+ if include_toolchain:
+ versions.update(get_toolchain_versions(env))
+
+ print "**************** VERSIONS *************"
+ long_names = {
+ 'python': 'Python Version',
+ 'scons': 'SCons Version',
+ 'parts': 'Parts Version',
+ 'compiler': 'Compiler Version',
+ 'sdk_or_libc': 'Libc/SDK',
+ 'default_libs': 'Default Libs'
+ }
+ for name, value in versions.iteritems():
+ if not isinstance(value, list):
+ print '* {0}: {1}'.format(long_names.get(name, name), value)
+ else:
+ print '* {0}:\n* \t{1}'.format(long_names.get(name, name),
+ '\n* \t'.join(sorted(value)))
+ print "***************************************"
+
+
+def include_parts(part_list, **kwargs):
+ for parts_file in part_list:
+ if os.path.isfile(DefaultEnvironment().subst(parts_file)):
+ Part(parts_file=parts_file, **kwargs)
+
+
+######## Part groups ####################################################
+ipp_parts = ['ext/ipp/ippcp.parts']
+utest_parts = ['ext/gtest/gtest.parts',
+ 'epid/common-testhelper/common-testhelper.parts']
+common_parts = ['epid/common/common.parts']
+member_parts = ['epid/member/member.parts']
+verifier_parts = ['epid/verifier/verifier.parts']
+util_parts = ['example/util/util.parts']
+example_parts = ['ext/argtable3/argtable3.parts',
+ 'example/verifysig/verifysig.parts',
+ 'example/signmsg/signmsg.parts',
+ 'example/data/data.parts',
+ 'example/compressed_data/compressed_data.parts']
+sizing_parts = ['example/util/util_static.parts',
+ 'example/signmsg/signmsg_shared.parts',
+ 'example/verifysig/verifysig_shared.parts',
+ 'example/verifysig/verifysig11_shared.parts']
+example_static_parts = ['example/util/util_static.parts',
+ 'example/signmsg/signmsg_static.parts',
+ 'example/verifysig/verifysig_static.parts']
+tools_parts = ['tools/revokegrp/revokegrp.parts',
+ 'tools/revokekey/revokekey.parts',
+ 'tools/revokesig/revokesig.parts',
+ 'tools/extractkeys/extractkeys.parts',
+ 'tools/extractgrps/extractgrps.parts']
+testbot_test_parts = ['test/testbot/testbot.parts',
+ 'test/testbot/signmsg/signmsg_testbot.parts',
+ 'test/testbot/verifysig/verifysig_testbot.parts',
+ 'test/testbot/integration/integration_testbot.parts',
+ 'test/testbot/ssh_remote/ssh_remote_testbot.parts',
+ 'test/testbot/revokegrp/revokegrp_testbot.parts',
+ 'test/testbot/revokekey/revokekey_testbot.parts',
+ 'test/testbot/revokesig/revokesig_testbot.parts',
+ 'test/testbot/extractkeys/extractkeys_testbot.parts',
+ 'test/testbot/extractgrps/extractgrps_testbot.parts',
+ 'tools/reports/reports.parts']
+tss_test_parts = ['test/tss/tss.parts']
+package_parts = ['ext/gtest/gtest.parts',
+ 'ext/ipp/ippcp.parts',
+ 'package.parts']
+memory_profiler_parts = ['tools/memory_profiler/memory_profiler.parts']
+internal_tools_parts = ['ext/argtable3/argtable3.parts',
+ 'tools/ikgfwrapper/ikgfwrapper.parts']
+epid_data = ['test/epid_data/epid_data.parts']
+perf_benchmark_parts = ['ext/google_benchmark/google_benchmark.parts',
+ 'test/performance/performance.parts']
+memory_benchmark_parts = ['test/dynamic_memory/dynamic_memory.parts']
+######## End Part groups ###############################################
+######## Commandline option setup #######################################
+product_variants = [
+ 'production',
+ 'internal-test',
+ 'package-epid-sdk',
+ 'internal-tools',
+ 'benchmark',
+ 'tiny',
+ 'internal-test-tiny'
+]
+
+default_variant = 'production'
+
+
+def is_production():
+ return GetOption("product-variant") == 'production'
+
+
+def is_internal_test():
+ return GetOption("product-variant") == 'internal-test'
+
+
+def is_internal_tools():
+ return GetOption("product-variant") == 'internal-tools'
+
+
+def is_package():
+ return GetOption("product-variant") == 'package-epid-sdk'
+
+
+def is_benchmark():
+ return GetOption("product-variant") == 'benchmark'
+
+def is_tiny():
+ return GetOption("product-variant") == 'tiny'
+
+def is_internal_test_tiny():
+ return GetOption("product-variant") == 'internal-test-tiny'
+
+
+def use_commercial_ipp():
+ return GetOption("use-commercial-ipp")
+
+
+def use_tss():
+ return GetOption("use-tss")
+
+
+def config_has_instrumentation():
+ return any(DefaultEnvironment().isConfigBasedOn(config_name)
+ for config_name in ['instr_release'])
+
+
+def variant_dirname():
+ s = GetOption("product-variant")
+ if s == 'production':
+ return 'epid-sdk'
+ elif s == 'package-epid-sdk':
+ return 'epid-sdk'
+ elif s == 'tiny':
+ return 'epid-sdk'
+ else:
+ return s
+
+
+AddOption("--product-variant", "--prod-var", nargs=1,
+ help=("Select product variant to build. Possible "
+ "options are: {0}. The default is {1} if no option "
+ "is specified").format(", ".join(product_variants),
+ default_variant),
+ action='store', dest='product-variant', type='choice',
+ choices=product_variants, default=default_variant)
+
+AddOption("--use-commercial-ipp",
+ help=("Link with commercial IPP. The IPPCRYPTOROOT environment "
+ "variable must be set."),
+ action='store_true', dest='use-commercial-ipp',
+ default=False)
+
+AddOption("--use-tss",
+ help=("Link with TPM TSS. The TSSROOT environment variable "
+ "must be set."),
+ action='store_true', dest='use-tss',
+ default=False)
+
+AddOption("--ipp-shared",
+ help=("Build /ext/ipp as shared library."),
+ action='store_true', dest='ipp-shared',
+ default=False)
+
+AddOption("--enable-sanitizers",
+ help=("Build with sanitizers (https://github.com/google/sanitizers)."),
+ action='store_true', dest='sanitizers',
+ default=False)
+
+AddOption("--sanitizers-recover",
+ help=("Configure sanititzers to recover and continue execution "
+ "on error found. Only applicable when sanitizers are enabled."
+ "See --enable-sanitizers option."),
+ action='store_true', dest='sanitizers-recover',
+ default=False)
+
+
+SetOptionDefault("PRODUCT_VARIANT", variant_dirname())
+
+######## End Commandline option setup ###################################
+
+
+# fix for parts 0.10.8 until we get better logic to extract ${CC}
+SetOptionDefault('PARTS_USE_SHORT_TOOL_NAMES', 1)
+
+
+def enable_sanitizers(recover):
+ """
+ Configures compiler to enable sanitizers.
+ Adds sanitizer options to default scons environment such
+ that it affects all parts.
+ Args:
+ recover: Enable sanitizers recovery from errors found when True.
+ """
+ env = DefaultEnvironment()
+ error_msg = None
+ try:
+ major = int(env.subst('$GCC_VERSION').partition('.')[0])
+ except ValueError:
+ major = 0
+
+ if major >= 6 and env['TARGET_OS'] == 'posix':
+ if 'INTELC_VERSION' not in env:
+ ccflags = ['-fsanitize=address,undefined', '-fno-sanitize=alignment',
+ '-fno-sanitize=shift', '-fno-omit-frame-pointer']
+ if recover:
+ ccflags = ccflags + ['-fsanitize-recover=all', '-fsanitize-recover=address']
+ else:
+ ccflags = ccflags + ['-fno-sanitize-recover']
+ # Extends default flags with sanitizer options
+ SetOptionDefault('CCFLAGS', ccflags)
+ SetOptionDefault('LIBS', ['asan', 'ubsan'])
+ else:
+ error_msg = """
+ Build with sanitizers is not supported for Intel(R) C++ Compiler.
+ Try scons --toolchain=gcc_6 --target=posix
+ """
+ else:
+ # User experience with sanitizers in GCC 4.8 is not great. Use at least GCC 6.x.
+ error_msg = """
+ Build with sanitizers is only supported for GCC version greater than
+ 6.x targeting posix OS. Current GCC version is "{0}" and OS target is "{1}".
+ Try scons --toolchain=gcc_6 --target=posix
+ """.format(env.get('GCC_VERSION', 'unknown'), env.get('TARGET_OS', 'unknown'))
+ if error_msg is not None:
+ env.PrintError(error_msg)
+
+
+def set_default_production_options():
+ SetOptionDefault('CONFIG', 'release')
+
+ SetOptionDefault('TARGET_VARIANT', '${TARGET_OS}-${TARGET_ARCH}')
+
+ SetOptionDefault('INSTALL_ROOT',
+ '#_install/${PRODUCT_VARIANT}')
+
+ SetOptionDefault('INSTALL_TOOLS_BIN',
+ '$INSTALL_ROOT/tools')
+
+ SetOptionDefault('INSTALL_SAMPLE_BIN',
+ '$INSTALL_ROOT/example')
+
+ SetOptionDefault('INSTALL_EPID_INCLUDE',
+ '$INSTALL_ROOT/include/epid')
+
+ SetOptionDefault('INSTALL_IPP_INCLUDE',
+ '$INSTALL_ROOT/include/ext/ipp/include')
+
+ SetOptionDefault('INSTALL_TEST_BIN',
+ '$INSTALL_ROOT/test')
+
+ SetOptionDefault('INSTALL_LIB',
+ '$INSTALL_ROOT/lib/${TARGET_VARIANT}')
+
+ SetOptionDefault('INSTALL_SAMPLE_DATA',
+ '$INSTALL_ROOT/example')
+
+ SetOptionDefault('INSTALL_TOOLS_DATA',
+ '$INSTALL_ROOT/tools')
+
+ SetOptionDefault('PACKAGE_DIR',
+ '#_package')
+
+ SetOptionDefault('PACKAGE_ROOT',
+ '#_package/${PRODUCT_VARIANT}')
+
+ SetOptionDefault('ROOT',
+ '#')
+
+ SetOptionDefault('PACKAGE_NAME',
+ '{PRODUCT_VARIANT}')
+
+
+if GetOption("sanitizers"):
+ enable_sanitizers(GetOption("sanitizers-recover"))
+
+if is_production():
+ set_default_production_options()
+ ipp_mode = ['install_lib']
+ if use_commercial_ipp():
+ ipp_mode.append('use_commercial_ipp')
+ sdk_mode = ['install_lib']
+ if use_tss():
+ sdk_mode.append('use_tss')
+ if GetOption('ipp-shared'):
+ ipp_mode.append('build_ipp_shared')
+ include_parts(ipp_parts, mode=ipp_mode,
+ INSTALL_INCLUDE='${INSTALL_IPP_INCLUDE}')
+ include_parts(utest_parts + common_parts +
+ member_parts + verifier_parts,
+ mode=sdk_mode,
+ INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}')
+ include_parts(util_parts + example_parts,
+ INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}',
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
+ INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
+ include_parts(tools_parts,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}',
+ INSTALL_DATA='${INSTALL_TOOLS_DATA}')
+ Default('all')
+ Default('utest::')
+ if not use_tss():
+ Default('run_utest::')
+
+if is_internal_test():
+ set_default_production_options()
+ sdk_mode = []
+ if use_tss():
+ sdk_mode.append('use_tss')
+ include_parts(tss_test_parts)
+ include_parts(ipp_parts)
+ include_parts(utest_parts + common_parts +
+ member_parts + verifier_parts,
+ mode=sdk_mode)
+ include_parts(util_parts + example_parts,
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
+ INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
+ include_parts(sizing_parts,
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}')
+ include_parts(tools_parts, INSTALL_BIN='${INSTALL_TOOLS_BIN}')
+ include_parts(testbot_test_parts)
+ Default('all')
+
+if is_internal_tools():
+ set_default_production_options()
+ include_parts(ipp_parts + utest_parts + common_parts + verifier_parts + member_parts + util_parts)
+ include_parts(internal_tools_parts + memory_profiler_parts,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
+ Default('ikgfwrapper', 'memory_profiler')
+ Default('run_utest::memory_profiler::')
+
+if is_benchmark():
+ set_default_production_options()
+ MODE = []
+ if config_has_instrumentation():
+ MODE.append('use_memory_profiler')
+ ipp_mode = []
+ if use_commercial_ipp():
+ ipp_mode.append('use_commercial_ipp')
+
+ # install ipp static and ipp shared builds into separate locations
+ if GetOption('ipp-shared'):
+ ipp_mode.append('build_ipp_shared')
+ SetOptionDefault('INSTALL_TEST_BIN',
+ '$INSTALL_ROOT/test_ipp_shared')
+ SetOptionDefault('INSTALL_LIB',
+ '$INSTALL_ROOT/lib_ipp_shared')
+ else:
+ SetOptionDefault('INSTALL_LIB',
+ '$INSTALL_ROOT/lib')
+
+ # do not allow file links to keep previous builds intact
+ SetOptionDefault('CCOPY_LOGIC', 'copy')
+
+ include_parts(ipp_parts, config_independent=True, mode=MODE + ipp_mode,
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
+ include_parts(example_static_parts + utest_parts + perf_benchmark_parts +
+ common_parts + verifier_parts +
+ sizing_parts + epid_data,
+ config_independent=True,
+ mode=MODE,
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
+
+ member_mode = ['install_lib']
+ member_cfg = ('embedded' if not DefaultEnvironment().isConfigBasedOn(
+ 'debug') and not config_has_instrumentation() else DefaultEnvironment().subst('$CONFIG'))
+ Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
+ Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
+ config_independent=True, mode=MODE + member_mode, INSTALL_BIN='${INSTALL_TEST_BIN}')
+
+ if config_has_instrumentation():
+ include_parts(memory_benchmark_parts + memory_profiler_parts,
+ config_independent=True,
+ mode=MODE,
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
+
+ Default('build::')
+
+if is_package():
+ set_default_production_options()
+ include_parts(package_parts,
+ mode=['install_package'],
+ INSTALL_TOP_LEVEL='${PACKAGE_ROOT}')
+ Default('package')
+
+if is_tiny():
+ set_default_production_options()
+ ### Member
+ Part(parts_file='ext/gtest/gtest.parts')
+ member_mode = ['install_lib']
+ member_cfg = ('embedded'
+ if not DefaultEnvironment().isConfigBasedOn('debug')
+ else DefaultEnvironment().subst('$CONFIG'))
+ Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
+ Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
+ config_independent=True, mode=member_mode)
+ Default('member::')
+ Default('run_utest::member::')
+ ### Verifier, samples and tools
+ verifier_mode = ['install_lib']
+ ipp_mode = ['install_lib']
+ if use_commercial_ipp():
+ ipp_mode.append('use_commercial_ipp')
+ if GetOption('ipp-shared'):
+ ipp_mode.append('build_ipp_shared')
+ include_parts(ipp_parts, mode=ipp_mode,
+ INSTALL_INCLUDE='${INSTALL_IPP_INCLUDE}')
+ Part(parts_file='epid/common-testhelper/common-testhelper.parts',
+ config_independent=True)
+ include_parts(common_parts + verifier_parts,
+ mode=verifier_mode,
+ INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}')
+ include_parts(util_parts + example_parts,
+ INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}',
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
+ INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
+ include_parts(tools_parts,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}',
+ INSTALL_DATA='${INSTALL_TOOLS_DATA}')
+ Default('all')
+ Default('utest::')
+
+if is_internal_test_tiny():
+ set_default_production_options()
+ sdk_mode = []
+ ### Member
+ Part(parts_file='ext/gtest/gtest.parts')
+ member_cfg = ('embedded'
+ if not DefaultEnvironment().isConfigBasedOn('debug')
+ else DefaultEnvironment().subst('$CONFIG'))
+ Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
+ Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
+ config_independent=True, mode=sdk_mode)
+ ### Verifier, samples and tools
+ include_parts(ipp_parts)
+ Part(parts_file='epid/common-testhelper/common-testhelper.parts',
+ config_independent=True)
+ include_parts(common_parts + verifier_parts,
+ mode=sdk_mode)
+ include_parts(util_parts + example_parts,
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
+ INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
+ include_parts(tools_parts, INSTALL_BIN='${INSTALL_TOOLS_BIN}')
+ include_parts(testbot_test_parts)
+ Default('build::')
+
+log_versions(DefaultEnvironment(), not is_package())
diff --git a/configure b/configure
new file mode 100644
index 0000000..a288104
--- /dev/null
+++ b/configure
@@ -0,0 +1,3968 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for Intel(R) EPID SDK .
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='Intel(R) EPID SDK'
+PACKAGE_TARNAME='intel-r--epid-sdk'
+PACKAGE_VERSION=' '
+PACKAGE_STRING='Intel(R) EPID SDK '
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_default_prefix=`pwd`/_install
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+TINY
+TSS_PATH
+RANLIB
+ac_ct_CXX
+CXXFLAGS
+CXX
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_tss
+enable_tiny
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures Intel(R) EPID SDK to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root
+ [DATAROOTDIR/doc/intel-r--epid-sdk]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of Intel(R) EPID SDK :";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-tiny Build size optimized member. Mutually exclusive with
+ '--with-tss'
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-tss Link with TPM TSS. The TSSROOT environment variable
+ must be set.
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+Intel(R) EPID SDK configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by Intel(R) EPID SDK $as_me , which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# save flags
+CFLAGS_OLD="$CFLAGS"
+CPPFLAGS_OLD="$CPPFLAGS"
+
+#c compiler priority
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in gcc icc cc
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in gcc icc cc
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+#c++ compiler priority
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ icpc c++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ icpc c++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+else
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+#define ranlib
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+# restore flags
+CFLAGS="$CFLAGS_OLD"
+CPPFLAGS="$CPPFLAGS_OLD"
+
+
+# Check whether --with-tss was given.
+if test "${with_tss+set}" = set; then :
+ withval=$with_tss;
+else
+ with_tss=no
+
+fi
+
+
+
+
+if test "x$with_tss" != "xno"; then :
+ as_ac_File=`$as_echo "ac_cv_file_$TSSROOT" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $TSSROOT" >&5
+$as_echo_n "checking for $TSSROOT... " >&6; }
+if eval \${$as_ac_File+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "$TSSROOT"; then
+ eval "$as_ac_File=yes"
+else
+ eval "$as_ac_File=no"
+fi
+fi
+eval ac_res=\$$as_ac_File
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_File"\" = x"yes"; then :
+ TSS_PATH=$TSSROOT
+else
+
+ as_fn_error $? "Necessary environment variable not set or set incorrectly: 'TSSROOT'" "$LINENO" 5
+
+fi
+
+fi
+
+
+# Check whether --enable-tiny was given.
+if test "${enable_tiny+set}" = set; then :
+ enableval=$enable_tiny;
+else
+ enable_tiny=no
+
+fi
+
+
+
+if test "x$enable_tiny" != "xno"; then :
+ if test "x$with_tss" != "xno"; then :
+
+ as_fn_error $? "Size optimized member can not link with TPM TSS" "$LINENO" 5
+
+fi
+ TINY=yes
+fi
+# default install path is current directory
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by Intel(R) EPID SDK $as_me , which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+Intel(R) EPID SDK config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
diff --git a/doc/html/1_81_2file__parser_8h.html b/doc/html/1_81_2file__parser_8h.html
new file mode 100644
index 0000000..85965f9
--- /dev/null
+++ b/doc/html/1_81_2file__parser_8h.html
@@ -0,0 +1,106 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/1.1/file_parser.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('1_81_2file__parser_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">file_parser.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 issuer material parsing utilities.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="1_81_2types_8h.html">epid/common/1.1/types.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="file__parser_8h.html">epid/common/file_parser.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c">Epid11ParseGroupPubKeyFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> *pubkey)</td></tr>
+<tr class="memdesc:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group public key from buffer in issuer binary format. <a href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c">More...</a><br /></td></tr>
+<tr class="separator:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae682077d315c39ed298ef198fd738546"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546">Epid11ParsePrivRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gae682077d315c39ed298ef198fd738546"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts private key revocation list from buffer in issuer binary format. <a href="group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546">More...</a><br /></td></tr>
+<tr class="separator:gae682077d315c39ed298ef198fd738546"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3f6daaa5333627d4efe5438c1fe8868"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868">Epid11ParseSigRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gac3f6daaa5333627d4efe5438c1fe8868"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts signature revocation list from buffer in issuer binary format. <a href="group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868">More...</a><br /></td></tr>
+<tr class="separator:gac3f6daaa5333627d4efe5438c1fe8868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae28a844eb68828480b2a76fcb7d252a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3">Epid11ParseGroupRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gae28a844eb68828480b2a76fcb7d252a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group revocation list from buffer in issuer binary format. <a href="group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3">More...</a><br /></td></tr>
+<tr class="separator:gae28a844eb68828480b2a76fcb7d252a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 issuer material parsing utilities. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_a32be19bc88f3d7aac6b7249da379f26.html">1.1</a></li><li class="navelem"><a class="el" href="1_81_2file__parser_8h.html">file_parser.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/1_81_2types_8h.html b/doc/html/1_81_2types_8h.html
new file mode 100644
index 0000000..7b89ece
--- /dev/null
+++ b/doc/html/1_81_2types_8h.html
@@ -0,0 +1,153 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/1.1/types.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('1_81_2types_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle">
+<div class="title">types.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK data types for Intel(R) EPID 1.1.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;limits.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str80.html">OctStr80</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">80 bit octet string <a href="struct_oct_str80.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str600.html">OctStr600</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">600 bit octet string <a href="struct_oct_str600.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str768.html">OctStr768</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">768 bit octet string <a href="struct_oct_str768.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq3_elem_str.html">Fq3ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq3 element. <a href="struct_fq3_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G2 element. <a href="struct_epid11_g2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 GT element. <a href="struct_epid11_gt_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html">Epid11Params</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Parameters. <a href="struct_epid11_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group public key. <a href="struct_epid11_group_pub_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 basic signature. <a href="struct_epid11_basic_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 non-revoked Proof. <a href="struct_epid11_nr_proof.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html">Epid11Signature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Signature. <a href="struct_epid11_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 private-key based revocation list. <a href="struct_epid11_priv_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 entry in SigRL (B,K) <a href="struct_epid11_sig_rl_entry.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 signature based revocation list. <a href="struct_epid11_sig_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group revocation list. <a href="struct_epid11_group_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gadff9c05d5b7751024152b40dda545545"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a></td></tr>
+<tr class="memdesc:gadff9c05d5b7751024152b40dda545545"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G1 element. <br /></td></tr>
+<tr class="separator:gadff9c05d5b7751024152b40dda545545"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1f4f1d6f001895abe548cfb33611c23"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a></td></tr>
+<tr class="memdesc:gaf1f4f1d6f001895abe548cfb33611c23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G3 element. <br /></td></tr>
+<tr class="separator:gaf1f4f1d6f001895abe548cfb33611c23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7293cec8f937d6f5da42084403f978f1"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a></td></tr>
+<tr class="memdesc:ga7293cec8f937d6f5da42084403f978f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group ID. <br /></td></tr>
+<tr class="separator:ga7293cec8f937d6f5da42084403f978f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK data types for Intel(R) EPID 1.1. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_a32be19bc88f3d7aac6b7249da379f26.html">1.1</a></li><li class="navelem"><a class="el" href="1_81_2types_8h.html">types.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_basenames.html b/doc/html/_basenames.html
new file mode 100644
index 0000000..14289bb
--- /dev/null
+++ b/doc/html/_basenames.html
@@ -0,0 +1,101 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: In-Depth Explanation of Basenames</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_basenames.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">In-Depth Explanation of Basenames </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This in-depth explanation covers the use of basenames in the Intel&reg; EPID scheme. It provides detail on name based signatures, random base signatures and how and when they are used.</p>
+<p><br />
+</p>
+<h1><a class="anchor" id="random_base"></a>
+Random Base Signatures</h1>
+<div class="image">
+<img src="random_base.png" alt="random_base.png"/>
+</div>
+<p>By default, members sign using a random basename that is not shared with the verifier. This signing method is also referred to as signing using random base. Signing using random base provides the strongest privacy properties for the signer. If a member signs using random base, the signature generated by the member is anonymous.</p>
+<p>When the signer and verifier agree to use random base, the basename is chosen at random for each signature. Two signatures using a random base cannot be linked to the same signer.</p>
+<h1><a class="anchor" id="name_based"></a>
+Name Based Signatures</h1>
+<div class="image">
+<img src="base_name.png" alt="base_name.png"/>
+</div>
+<p>A name based signature is a type of signature that gives the verifier the ability to link Intel&reg; EPID signatures from the same member, reducing the member's privacy. When using name based signatures, the signer and verifier agree on an explicit basename.</p>
+<p>The verifier can ask the member to sign a message with a basename that the verifier chooses. If the member agrees to use a name based signature, then all the signatures created by the member using the same basename are linkable by the verifier, reducing the member's privacy.</p>
+<p>Reasons why a verifier might require members to use a basename when signing include the following:</p>
+<ul>
+<li><b>Profiling for Advertising</b> Widget-Mart wants to show targeted advertising to privacy-conscious customers. Widget-Mart requests that all customers use a specific basename so that Widget-Mart can build an individualized profile for each anonymous user, while Intel&reg; EPID technology ensures that the retailer does not have the ability to aggregate that information with other retailers to build a more extensive profile of the consumer.</li>
+<li><b>Voting</b> A voting machine is designed so that each anonymous authorized voter can only vote once per race. A basename per office being contested allows the verifier to confirm that the voter has not already voted for that office, without revealing their identity or correlating their voting patterns across multiple races.</li>
+</ul>
+<dl class="section warning"><dt>Warning</dt><dd>The use of a name-based signature creates a platform unique pseudonymous identifier. Because it reduces the member's privacy, the user should be notified when it is used and should have control over its use. </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_build_tools_installation.html b/doc/html/_build_tools_installation.html
new file mode 100644
index 0000000..ae08469
--- /dev/null
+++ b/doc/html/_build_tools_installation.html
@@ -0,0 +1,132 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Guide to Installing Build Tools</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_build_tools_installation.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Guide to Installing Build Tools </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#build_tools_windows_python">Installing Python</a></li>
+<li class="level1"><a href="#build_tools_windows_scons">Installing SCons</a></li>
+<li class="level1"><a href="#build_tools_windows_parts">Installing Parts</a></li>
+</ul>
+</div>
+<div class="textblock"><p>Building SDK code out of the box requires a number of tools. This section explains how to install the following tools:</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Prerequisite </th><th class="markdownTableHeadNone">URL </th><th class="markdownTableHeadNone">Downloads -----&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Python 2.7 </td><td class="markdownTableBodyNone"><a href="https://www.python.org">https://www.python.org</a> </td><td class="markdownTableBodyNone"><a href="https://www.python.org/downloads/release/python-2712/">python 2.7.12 installers</a> </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">SCons 2.4 </td><td class="markdownTableBodyNone"><a href="http://www.scons.org">http://www.scons.org</a> </td><td class="markdownTableBodyNone"><a href="http://prdownloads.sourceforge.net/scons/scons-2.4.1.zip">scons-2.4.1.zip</a> </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Parts 0.11 </td><td class="markdownTableBodyNone"><a href="https://bitbucket.org/sconsparts/parts/downloads">https://bitbucket.org/sconsparts/parts/downloads</a> </td><td class="markdownTableBodyNone"><a href="https://bitbucket.org/sconsparts/parts/get/v0.11.1.zip">parts-0.11.1.zip</a> </td></tr>
+</table>
+<p><br />
+ </p>
+<h1><a class="anchor" id="build_tools_windows_python"></a>
+Installing Python</h1>
+<ol type="1">
+<li>Download and install Python according to the installation procedure for your platform.</li>
+<li>Make sure that the Python directory and the Python scripts directory are in the path.</li>
+</ol>
+<p>To verify that Python installed correctly, run: </p><pre class="fragment"> &gt; python --version
+</pre><p><br />
+ </p>
+<h1><a class="anchor" id="build_tools_windows_scons"></a>
+Installing SCons</h1>
+<p>After Python is installed, install SCons.</p>
+<ol type="1">
+<li>Download and extract the files from the SCons archive.</li>
+<li>To install SCons, go to the directory with the extracted files and run: <pre class="fragment"> &gt; python setup.py install
+</pre></li>
+</ol>
+<dl class="section note"><dt>Note</dt><dd>You may need administrative privileges to execute this command.</dd></dl>
+<p><br />
+ To verify that SCons installed correctly, run: </p><pre class="fragment"> &gt; scons --version
+</pre><p><br />
+ </p>
+<h1><a class="anchor" id="build_tools_windows_parts"></a>
+Installing Parts</h1>
+<p>After SCons is installed, install Parts.</p>
+<ol type="1">
+<li>Download and extract the files from the Parts archive.</li>
+<li>To install Parts, go to the directory with the extracted files and run: <pre class="fragment"> &gt; python setup.py install
+</pre></li>
+</ol>
+<dl class="section note"><dt>Note</dt><dd>You may need administrative privileges to execute this command.</dd></dl>
+<p><br />
+ To verify that Parts installed correctly, run: </p><pre class="fragment"> &gt; python -c "import pkgutil; print 'Parts is installed' if 'parts' in [str(n) for _, n, _ in pkgutil.iter_modules()] else 'Parts module is not found'"
+</pre><p><br />
+</p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_building_sdk.html b/doc/html/_building_sdk.html
new file mode 100644
index 0000000..e698a99
--- /dev/null
+++ b/doc/html/_building_sdk.html
@@ -0,0 +1,220 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Building from Source</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_building_sdk.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Building from Source </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#BuildingSdk_Prerequisites">Prerequisites</a></li>
+<li class="level1"><a href="#BuildingSdk_Building_SCons">Building SDK with SCons</a></li>
+<li class="level1"><a href="#BuildingSdk_Building_Makefile">Alternate Makefile Based Build Approach</a></li>
+<li class="level1"><a href="#BuildingSdk_CommercialIpp">Improving Performance with Commercial IPP</a></li>
+<li class="level1"><a href="#BuildingSdk_Tiny">Optimizing for Code Size</a><ul><li class="level2"><a href="#implementation_TinyLimitations">Limitations</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#BuildingSdk_Examples">Example Programs</a></li>
+<li class="level1"><a href="#BuildingSdk_PortingBuildSystem">Building with Other Build Systems</a></li>
+</ul>
+</div>
+<div class="textblock"><p>To use the SDK in a project, the code from the SDK must be included in that project. The easiest way to do this is to link to static libraries. The SDK comes with build scripts to build static libraries for common environments.</p>
+<h1><a class="anchor" id="BuildingSdk_Prerequisites"></a>
+Prerequisites</h1>
+<p>Building SDK code out of the box requires a number of tools. This section lists the tools used to build the SDK.</p>
+<p>For more information on how to install these tools, refer to <a class="el" href="_build_tools_installation.html">Guide to Installing Build Tools</a>.</p>
+<p>For a list of compilers and libraries that the SDK was validated on, refer to <a class="el" href="_how_validated.html#validated_supported_compilers">Tested Libraries and Compilers</a>.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Prerequisite </th><th class="markdownTableHeadNone">Notes -----------------------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">A C/C++ compiler </td><td class="markdownTableBodyNone">Core code in C. Unit tests need C++11 support. </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a href="http://www.python.org">Python</a> </td><td class="markdownTableBodyNone">Validated with v2.7.12 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a href="http://www.scons.org">SCons</a> </td><td class="markdownTableBodyNone">Validated with v2.4.1 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a href="https://bitbucket.org/sconsparts/parts">Parts</a> </td><td class="markdownTableBodyNone">0.11.0 or later </td></tr>
+</table>
+<h1><a class="anchor" id="BuildingSdk_Building_SCons"></a>
+Building SDK with SCons</h1>
+<p>To use the SDK, you need to build it to generate libraries compatible with your build environment.</p>
+<p>To build based on the default SConstruct file in the root directory of the SDK, invoke scons with no arguments. </p><pre class="fragment">cd &lt;path/to/sdk-root&gt;
+scons
+</pre><p>By default, this performs a release build of the SDK with unit tests for the current platform and runs unit tests.</p>
+<p>To skip unit test execution when doing cross platform build use: </p><pre class="fragment">scons build:: utest::
+</pre><p>Built components appear in the <code>_install</code> directory of the SDK root.</p>
+<p>Potentially useful command line options:</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Option </th><th class="markdownTableHeadNone">Action -----------------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--cfg=debug</code> </td><td class="markdownTableBodyNone">Build in debug mode </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>--cfg=release</code> </td><td class="markdownTableBodyNone">Build in release mode </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--target=x86</code> </td><td class="markdownTableBodyNone">Target x86 (i386) architecture </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>--target=x86_64</code> </td><td class="markdownTableBodyNone">Target x86-64 architecture </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--target=arm</code> </td><td class="markdownTableBodyNone">Target 32-bit ARM architecture </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>--target=arm_hf</code> </td><td class="markdownTableBodyNone">Target 32-bit ARM architecture with hard float ABI </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--target=aarch64</code> </td><td class="markdownTableBodyNone">Target AArch64 (64-bit ARM) architecture </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>--tc=cl</code> </td><td class="markdownTableBodyNone">Use MSVC to compile (Microsoft&reg;* C/C++ Compiler) </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--tc=gcc</code> </td><td class="markdownTableBodyNone">Use GCC to compile (GNU* Compiler Collection) </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>--tc=icl,mstools</code> </td><td class="markdownTableBodyNone">Use Intel&reg; C++ compiler for Windows </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>--tc=icc,gnutools</code> </td><td class="markdownTableBodyNone">Use Intel&reg; C++ compiler for Linux </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>build::</code> </td><td class="markdownTableBodyNone">Build the SDK (does not build unit tests) </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>utest::</code> </td><td class="markdownTableBodyNone">Build unit tests </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>run_utest::</code> </td><td class="markdownTableBodyNone">Run unit tests (builds tests if needed) </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>-c</code> </td><td class="markdownTableBodyNone">Clean the build </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>-j N</code> or <code>--jobs=N</code> </td><td class="markdownTableBodyNone">Allow N jobs at once </td></tr>
+</table>
+<h1><a class="anchor" id="BuildingSdk_Building_Makefile"></a>
+Alternate Makefile Based Build Approach</h1>
+<p>You can build with the <code>make</code> command on platforms that support Make/Autoconf.</p>
+<p>In the root directory of the SDK, run: </p><pre class="fragment">./configure
+make all
+make check
+make install
+</pre><p><code>./configure</code> sets up the default settings:</p>
+<ul>
+<li>The default compilers are GCC/G++. You can specify compilers via the CC and CXX variables. For example, <code>./configure CC=/opt/intel/bin/icc CXX=/opt/intel/bin/icpc</code></li>
+<li>The default installation directory is <code>./_install</code>. You can specify the installation directory by using <code>./configure --prefix=/usr/local/epid_install</code></li>
+<li>The default target matches the current environment. You may change it with the CFLAGS parameter. For example, <code>./configure CFLAGS=-m32</code> when run on x86_64 environment configures compilation to target x86.</li>
+</ul>
+<p><code>make check</code> is optional. It builds and runs the unit tests.</p>
+<p>Alternatively, you can use <code>make build</code> as a shortcut to replace <code>make all</code>, <code>make check</code>, and <code>make install</code>.</p>
+<p>To run N jobs at once use the <code>-j N</code> or <code>--jobs=N</code> option with the <code>make</code> command, e.g. <code>make all -j 4</code> will allow make to create 4 jobs at once.</p>
+<p>To clean the build, run <code>make clean</code>.</p>
+<p>To remove the install directory, run <code>make uninstall</code>.</p>
+<p>To configure cross compilation use <code>--host</code> option. For example, <code>./configure --host=arm-linux-gnueabi</code> configures cross compilation build targeting ARM architecture. Cross compiled tests will not run on the build machine so <code>make check</code> should be replaced to <code>make utest</code>. A typical build sequence for cross compilation is as follows: </p><pre class="fragment">./configure --host=&lt;target system&gt;
+make all
+make utest
+make install
+</pre><h1><a class="anchor" id="BuildingSdk_CommercialIpp"></a>
+Improving Performance with Commercial IPP</h1>
+<p>For higher performance, you can use the commercial version of Cryptography for Intel&reg; Integrated Performance Primitives, available at <a href="https://software.intel.com/get-ipp-cryptography-libraries">https://software.intel.com/get-ipp-cryptography-libraries</a>.</p>
+<dl class="section note"><dt>Note</dt><dd>The SDK has been validated with version 2018 (Update 2.1) of the cryptography library.</dd></dl>
+<p>To build the SDK using a commercial Intel&reg; IPP installation, the <code>IPPCRYPTOROOT</code> environment variable must be properly configured to point to the IPP installation directory, as described in <em>Setting Environment Variables</em> in the <a href="https://software.intel.com/ipp-crypto-dev-guide-setting-environment-variables">Intel&reg; IPP Crypto Developer Guide</a>.</p>
+<p>Once the environment is configured, you can build using commercial IPP by specifying <code>--use-commercial-ipp</code> as a command line option.</p>
+<h1><a class="anchor" id="BuildingSdk_Tiny"></a>
+Optimizing for Code Size</h1>
+<p>To build the SDK with a member with substantially reduced code size, you can use tiny mode.</p>
+<p>To build with SCons, go to the root directory of the SDK and run: </p><pre class="fragment">scons --prod-var=tiny
+</pre><p>To build with Make, go to the root directory of the SDK and run: </p><pre class="fragment">./configure --enable-tiny
+make all
+make check
+make install
+</pre><h2><a class="anchor" id="implementation_TinyLimitations"></a>
+Limitations</h2>
+<p>By design, a member built in tiny mode has the following limitations:</p>
+<ul>
+<li>TPM mode is not supported.</li>
+<li>Only SHA-256 and SHA-512 are supported.</li>
+<li>Signature pre-computation is not supported.</li>
+<li>Compressed keys are not supported.</li>
+<li>Commercial IPP cannot be used.</li>
+<li>The implementation prioritizes size over performance.</li>
+</ul>
+<h1><a class="anchor" id="BuildingSdk_Examples"></a>
+Example Programs</h1>
+<p>The SDK includes several examples that show you different aspects of how the Intel&reg; EPID scheme works. In the SDK build, these examples are located in <code>_install/epid-sdk/example</code>.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Name </th><th class="markdownTableHeadNone">Description ----------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>signmsg</code> </td><td class="markdownTableBodyNone">Create Intel&reg; EPID signature of message </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>verifysig</code> </td><td class="markdownTableBodyNone">Verify signature is from a group member in good standing </td></tr>
+</table>
+<h1><a class="anchor" id="BuildingSdk_PortingBuildSystem"></a>
+Building with Other Build Systems</h1>
+<p>It is relatively straightforward to port the SDK to your build system of choice. The following dependency diagram shows the relationship between components and the sources used to build them.</p>
+<div class="image">
+<img src="basicdoc.png" alt="basicdoc.png"/>
+</div>
+<p><br />
+</p>
+<p>*Other names and brands may be claimed as the property of others. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_change_log.html b/doc/html/_change_log.html
new file mode 100644
index 0000000..99f86b0
--- /dev/null
+++ b/doc/html/_change_log.html
@@ -0,0 +1,246 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: What&#39;s New</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_change_log.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">What's New </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>[6.0.1] - 2018-05-04</h2>
+<h3>Changed</h3>
+<ul>
+<li>Updated Intel(R) IPP Cryptography library to version 2018 (Update 2.1).</li>
+</ul>
+<h3>Fixed</h3>
+<ul>
+<li>The member library now includes the tpm2 subcomponent when built using SCons, instead of requiring a separate member.tpm2 library.</li>
+</ul>
+<h3>Known Issues</h3>
+<ul>
+<li>Only the SHA-256 hash algorithm is supported when using the SDK with the IBM TPM simulator due to a defect in version 532 of the simulator.</li>
+<li>Basenames are limited to 124 bytes in TPM mode.</li>
+<li>Scons build will not work natively on ARM. You can still build using <code>make</code> or cross compile.</li>
+</ul>
+<h2>[6.0.0] - 2017-12-15</h2>
+<h3>Added</h3>
+<ul>
+<li>The member can now be built with a substantially reduced code size using a compilation option.</li>
+<li>New context lifetime management APIs have been added to member to give callers more control of memory allocation.</li>
+<li>New member API <code>EpidClearRegisteredBasenames</code> has been added to clear registered basenames without recreating the member.</li>
+</ul>
+<h3>Changed</h3>
+<ul>
+<li><code>EpidRegisterBaseName</code> was renamed to <code>EpidRegisterBasename</code> because basename is a single word.</li>
+<li>Command-line parsing library used by samples and tools has been replaced by Argtable3.</li>
+</ul>
+<h3>Deprecated</h3>
+<ul>
+<li><code>EpidMemberCreate</code> has been deprecated. This API has been superseded by <code>EpidMemberGetSize</code> and <code>EpidMemberInit</code>.</li>
+<li><code>EpidMemberDelete</code> has been deprecated. This API has been superseded by <code>EpidMemberDeinit</code>.</li>
+</ul>
+<h3>Removed</h3>
+<ul>
+<li><code>size_optimized_release</code> build configuration has been removed. Use the compilation option to build member with reduced code size.</li>
+</ul>
+<h3>Known Issues</h3>
+<ul>
+<li>Only the SHA-256 hash algorithm is supported when using the SDK with the IBM TPM simulator due to a defect in version 532 of the simulator.</li>
+<li>Basenames are limited to 124 bytes in TPM mode.</li>
+<li>Scons build will not work natively on ARM. You can still build using <code>make</code> or cross compile.</li>
+</ul>
+<h2>[5.0.0] - 2017-09-15</h2>
+<h3>Added</h3>
+<ul>
+<li>The member implementation now has the option to support signing using a TPM, using the ECDAA capabilities of TPM 2.0.</li>
+</ul>
+<h3>Changed</h3>
+<ul>
+<li>Member API updated to unify HW and SW use cases.<ul>
+<li>Added<ul>
+<li><code>ProvisionKey</code></li>
+<li><code>ProvisionCompressed</code></li>
+<li><code>ProvisionCredential</code></li>
+<li><code>Startup</code></li>
+</ul>
+</li>
+<li>Parameters changed<ul>
+<li><code>MemberCreate</code></li>
+<li><code>RequestJoin</code></li>
+</ul>
+</li>
+<li>Removed or made private<ul>
+<li><code>WritePrecomp</code></li>
+<li><code>SignBasic</code></li>
+<li><code>NrProve</code></li>
+<li><code>AssemblePrivKey</code></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><code>EpidRequestJoin</code> was renamed to <code>EpidCreateJoinRequest</code> to make it clear that it is not directly communicating with the issuer.</li>
+</ul>
+<h3>Fixed</h3>
+<ul>
+<li><code>EpidCreateJoinRequest</code> creates valid join requests. This fixes a regression in <code>EpidRequestJoin</code> introduced in 4.0.0.</li>
+</ul>
+<h3>Known Issues</h3>
+<ul>
+<li>Only the SHA-256 hash algorithm is supported when using the SDK with the IBM TPM simulator due to a defect in version 532 of the simulator.</li>
+<li>Basenames are limited to 124 bytes in TPM mode.</li>
+</ul>
+<h2>[4.0.0] - 2017-04-25</h2>
+<h3>Added</h3>
+<ul>
+<li>The member implementation now provides an internal interface that gives guidance on partitioning member operations between highly sensitive ones that use f value of the private key, and less sensitive operations that can be performed in a host environment.</li>
+<li>New member API <code>EpidAssemblePrivKey</code> was added to help assemble and validate the new member private key that is created when a member either joins a group (using the join protocol) or switches to a new group (as the result of a performance rekey).</li>
+</ul>
+<h3>Changed</h3>
+<ul>
+<li>Updated Intel(R) IPP Cryptography library to version 2017 (Update 2).</li>
+<li>The mechanism to set the signature based revocation list (SigRL) used for signing was changed. <code>EpidMemberSetSigRl</code> must be used to set the SigRL. The SigRL is no longer a parameter to <code>EpidSign</code>. This better models typical use case where a device stores a revocation list and updates it independently of signing operations.</li>
+</ul>
+<h3>Removed</h3>
+<ul>
+<li>Removed <code>EpidWritePreSigs</code> API. Serialization of pre-computed signatures is a risky capability to provide, and simply expanding the internal pool via <code>EpidAddPreSigs</code> still provides most of the optimization benefits.</li>
+<li>The <code>EpidIsPrivKeyInGroup</code> API is no longer exposed to clients. It is no longer needed because the new member API <code>EpidAssemblePrivKey</code> performs this check.</li>
+</ul>
+<h3>Fixed</h3>
+<ul>
+<li>When building with commercial version of the Intel(R) IPP Cryptography library, optimized functions are now properly invoked, making signing and verification operations ~2 times faster</li>
+<li>SHA-512/256 hash algorithm is now supported.</li>
+<li>README for compressed data now correctly documents the number of entries in revocation lists.</li>
+<li>The <code>verifysig</code> sample now reports a more clear error message for mismatched SigRLs.</li>
+<li>The default scons build will now build for a 32-bit target on a 32-bit platform.</li>
+</ul>
+<h3>Known Issues</h3>
+<ul>
+<li>Scons build will not work natively on ARM. You can still build using <code>make</code> or cross compile.</li>
+</ul>
+<h2>[3.0.0] - 2016-11-22</h2>
+<h3>Added</h3>
+<ul>
+<li>Support for verification of Intel(R) EPID 1.1 members.</li>
+<li>Make-based build system support.</li>
+<li>Sample material includes compressed keys.</li>
+<li>Enhanced documentation, including step-by-step walkthroughs of example applications.</li>
+<li>Validated on additional IoT platforms.<ul>
+<li>Ostro Linux</li>
+<li>Snappy Ubuntu Core</li>
+</ul>
+</li>
+</ul>
+<h3>Changes</h3>
+<ul>
+<li>A new verifier API has been added to set the basename to be used for verification. Verifier APIs that used to accept basenames now use the basename set via <code>EpidVerifierSetBasename</code>.</li>
+<li>The verifier pre-computation structure has been changed to include the group ID to allow detection of errors that result from providing a pre-computation blob from a different group to <code>EpidVerifierCreate</code>.</li>
+</ul>
+<h3>Fixes</h3>
+<ul>
+<li>The kEpidxxxRevoked enums have been renamed to be consistent with other result return values.</li>
+</ul>
+<h3>Known Issues</h3>
+<ul>
+<li>SHA-512/256 hash algorithm is not supported.</li>
+</ul>
+<h2>[2.0.0] - 2016-07-20</h2>
+<h3>Added</h3>
+<ul>
+<li>Signed binary issuer material support.<ul>
+<li>Binary issuer material validation APIs.</li>
+<li>Updated sample issuer material.</li>
+<li>Updated samples that parse signed binary issuer material.</li>
+</ul>
+</li>
+<li>Compressed member private key support.</li>
+<li>Validated on additional IoT platforms.<ul>
+<li>Windows 10 IoT Core</li>
+<li>WindRiver IDP</li>
+</ul>
+</li>
+</ul>
+<h3>Changed</h3>
+<ul>
+<li>The default hash algorithm has changed. It is now SHA-512.</li>
+<li>Functions that returned <code>EpidNullPtrErr</code> now return <code>EpidBadArgErr</code> instead.</li>
+</ul>
+<h3>Fixed</h3>
+<ul>
+<li>Updated build flags to work around GCC 4.8.5 defect.</li>
+</ul>
+<h2>[1.0.0] - 2016-03-03</h2>
+<h3>Added</h3>
+<ul>
+<li>Basic sign and verify functionality</li>
+<li>Dynamic join support for member</li>
+<li>Apache 2.0 License </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_epid_overview.html b/doc/html/_epid_overview.html
new file mode 100644
index 0000000..a746663
--- /dev/null
+++ b/doc/html/_epid_overview.html
@@ -0,0 +1,196 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Introduction to the Intel&reg; EPID Scheme</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_epid_overview.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Introduction to the Intel&reg; EPID Scheme </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#EpidOverview_Roles">Roles</a><ul><li class="level2"><a href="#EpidOverview_Issuers">Issuers</a></li>
+<li class="level2"><a href="#EpidOverview_Members">Members</a></li>
+<li class="level2"><a href="#EpidOverview_Verifiers">Verifiers</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#EpidOverview_Entity_interaction">Member and Verifier Interaction</a></li>
+<li class="level1"><a href="#EpidOverview_Groups">Groups</a></li>
+<li class="level1"><a href="#EpidOverview_Keys">Keys</a><ul><li class="level2"><a href="#EpidOverview_Group_public_key">Group Public Key</a></li>
+<li class="level2"><a href="#EpidOverview_Issuing_private_key">Issuing Private Key</a></li>
+<li class="level2"><a href="#EpidOverview_Member_private_key">Member Private Key</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><p>Intel&reg; EPID is a cryptographic protocol which enables the remote authentication of a trusted platform whilst preserving the user's privacy.</p>
+<h1><a class="anchor" id="EpidOverview_Roles"></a>
+Roles</h1>
+<p>In the Intel&reg; EPID scheme, there are three roles: issuers, members, and verifiers.</p>
+<p>The entities in these roles interact with each other in such a way that a member can prove to a verifier that it is a trusted member of a group without disclosing the identity of the member. Groups are created and managed by the issuer.</p>
+<div class="image">
+<img src="epid_diagram_roles_summary.png" alt="epid_diagram_roles_summary.png"/>
+</div>
+<h2><a class="anchor" id="EpidOverview_Issuers"></a>
+Issuers</h2>
+<p>The issuer is responsible for managing group membership. Issuer functionality is not included in the SDK.</p>
+<p>The issuer manages groups by doing the following:</p>
+<ul>
+<li>Creates groups by generating one issuing private key and one group certificate for each group. The group certificate contains the group public key.</li>
+</ul>
+<div class="image">
+<img src="epid_diagram_group_public_key_and_issuing_private_key.png" alt="epid_diagram_group_public_key_and_issuing_private_key.png"/>
+</div>
+<p><br />
+</p>
+<ul>
+<li>Creates group members by generating unique Intel&reg; EPID member private keys through bulk provisioning. Member private keys are created from the issuing private key for the group.</li>
+<li>Manages requests from prospective members to join existing groups.</li>
+</ul>
+<div class="image">
+<img src="epid_diagram_generating_member_private_keys.png" alt="epid_diagram_generating_member_private_keys.png"/>
+</div>
+<div class="image">
+<img src="epid_diagram_provisioning.png" alt="epid_diagram_provisioning.png"/>
+</div>
+<p><br />
+</p>
+<ul>
+<li>Creates and maintains group revocation lists.</li>
+<li>Creates and maintains signature revocation lists and member private key revocation lists. These lists of members no longer in good standing allow members to be dropped from a group.</li>
+</ul>
+<div class="image">
+<img src="epid_diagram_maintaining_revocation_lists.png" alt="epid_diagram_maintaining_revocation_lists.png"/>
+</div>
+<p><br />
+</p>
+<ul>
+<li>Makes group public keys and revocation lists available to verifiers. Makes signature revocation list available to members.</li>
+</ul>
+<div class="image">
+<img src="epid_diagram_issuer_makes_revocation_lists_available.png" alt="epid_diagram_issuer_makes_revocation_lists_available.png"/>
+</div>
+<h2><a class="anchor" id="EpidOverview_Members"></a>
+Members</h2>
+<p>The member is the entity that attempts to anonymously prove its group membership to the verifier.</p>
+<ul>
+<li>Members are authorized by the issuer as part of a group.</li>
+<li>Each group member has a unique Intel&reg; EPID private key, which corresponds to the group.</li>
+<li>The member uses its member private key to sign a message to prove group membership to the verifier without revealing the identity of the member.</li>
+</ul>
+<h2><a class="anchor" id="EpidOverview_Verifiers"></a>
+Verifiers</h2>
+<p>The verifier checks an Intel(R) EPID signature to establish whether it was signed by an entity or device that is a member in good standing.</p>
+<p>The verifier acts on behalf of a party that needs to know it is communicating with a trusted device. Verifiers obtain group certificates and revocation lists from issuers and negotiate details of signature protocol with members.</p>
+<p>A verifier can do the following:</p>
+<ul>
+<li>Confirm a member is in fact a member of a given group in good standing.</li>
+<li>Obtain group certificates and revocation lists from issuers.</li>
+<li>Negotiate details of signature protocol with members.</li>
+<li>Manage a private list of revoked members, also called the verifier blacklist.</li>
+</ul>
+<h1><a class="anchor" id="EpidOverview_Entity_interaction"></a>
+Member and Verifier Interaction</h1>
+<p>Each Intel&reg; EPID member uses its Intel&reg; EPID private key to digitally sign a message. The resulting signature is called an Intel&reg; EPID signature.</p>
+<p>The Intel&reg; EPID verifier uses the group public key to verify the correctness of an Intel&reg; EPID signature, i.e., to verify that the signature was indeed created by a member with a valid Intel&reg; EPID private key.</p>
+<p>However, the Intel&reg; EPID signature does not convey any information about which unique private key was used to create the signature.</p>
+<div class="image">
+<img src="epid_diagram_signing_and_verification.png" alt="epid_diagram_signing_and_verification.png"/>
+</div>
+<h1><a class="anchor" id="EpidOverview_Groups"></a>
+Groups</h1>
+<p>An Intel&reg; EPID group represents a set of trusted entities called members. Issuers create groups and manage group membership. For each group, the issuer creates a group public key simultaneously with the corresponding issuing private key. The issuer uses the issuing private key to create unique member private keys for each group member, and makes the group public key available to verifiers.</p>
+<p>All groups have the following:</p>
+<ul>
+<li>Group public key, which corresponds to the issuing private key kept by the issuer</li>
+<li>Signature revocation list</li>
+<li>Member private key revocation list</li>
+<li>Member private keys, generated from the issuing private key</li>
+</ul>
+<p>If a signature revocation list or member private key revocation list does not exist, it is assumed to be empty.</p>
+<div class="image">
+<img src="epid_diagram_group.png" alt="epid_diagram_group.png"/>
+</div>
+<h1><a class="anchor" id="EpidOverview_Keys"></a>
+Keys</h1>
+<p>The Intel&reg; EPID scheme works with three types of keys: the group public key, the issuing private key, and the member private key. A group public key corresponds to the unique member private keys that are part of the group. Member private keys are generated from the issuing private key.</p>
+<p>Additionally, in the Intel&reg; EPID scheme, a private key can be revoked given a signature created by that key, even if the key itself is still unknown. Group membership can be revoked and entire groups can be revoked. For more information on revocation, refer to <a class="el" href="_revocation.html">In-Depth Explanation of Revocation</a>.</p>
+<h2><a class="anchor" id="EpidOverview_Group_public_key"></a>
+Group Public Key</h2>
+<p>The group public key is the key used by the verifier to confirm that a member belongs to a group in good standing. Each member private key in a group is associated with the group's public key.</p>
+<p>When a group is created, the group public key and the issuing private key are simultaneously generated by the issuer. The verifier obtains the group public key from the issuer.</p>
+<h2><a class="anchor" id="EpidOverview_Issuing_private_key"></a>
+Issuing Private Key</h2>
+<p>The issuing private key is the key used by the issuer to generate unique private keys for each member of a given group. For every group public key, there is a corresponding issuing private key. The issuing private key remains with the issuer and is kept private.</p>
+<h2><a class="anchor" id="EpidOverview_Member_private_key"></a>
+Member Private Key</h2>
+<p>The member private key is the key used by the member to digitally sign a message when attempting to prove to the verifier that the member belongs to the group and is in good standing.</p>
+<p>Unique member private keys are generated by the issuer for each member of a given group. The same group public key corresponds to each member private key in the group. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_examples.html b/doc/html/_examples.html
new file mode 100644
index 0000000..3b5e18c
--- /dev/null
+++ b/doc/html/_examples.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Walkthroughs of Examples Showing API Usage</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_examples.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Walkthroughs of Examples Showing API Usage </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Several example applications are included that demonstrate how to use the SDK APIs.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Example Application </th><th class="markdownTableHeadNone">Concept Demonstrated </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>signmsg</code> </td><td class="markdownTableBodyNone"><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>verifysig</code> </td><td class="markdownTableBodyNone"><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </td></tr>
+</table>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_examples.js b/doc/html/_examples.js
new file mode 100644
index 0000000..3abe571
--- /dev/null
+++ b/doc/html/_examples.js
@@ -0,0 +1,11 @@
+var _examples =
+[
+ [ "Generating an Intel® EPID Signature", "_user_manual__generating_an_intel_epid_signature.html", [
+ [ "Summary", "_user_manual__generating_an_intel_epid_signature.html#signmsgWalktrhu_overview", null ],
+ [ "Signmsg Walkthrough", "_user_manual__generating_an_intel_epid_signature.html#signmsgWalkthru_", null ]
+ ] ],
+ [ "Verifying an Intel® EPID Signature", "_user_manual__verifying_an_intel_epid_signature.html", [
+ [ "Summary", "_user_manual__verifying_an_intel_epid_signature.html#verifysigWalktrhu_overview", null ],
+ [ "Verifysig Walkthrough", "_user_manual__verifying_an_intel_epid_signature.html#verifysigWalkthrough_main", null ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/_glossary.html b/doc/html/_glossary.html
new file mode 100644
index 0000000..8f1220f
--- /dev/null
+++ b/doc/html/_glossary.html
@@ -0,0 +1,176 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Glossary</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_glossary.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Glossary </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#Issuing_CA">CA public key</a></li>
+<li class="level1"><a href="#Glossary_Daa">DAA</a></li>
+<li class="level1"><a href="#Glossary_EllipticCurve">Elliptic curve</a></li>
+<li class="level1"><a href="#Glossary_EllipticCurvePoint">Elliptic curve point</a></li>
+<li class="level1"><a href="#Glossary_Group">Group</a></li>
+<li class="level1"><a href="#Glossary_Group_certificate">Group certificate</a></li>
+<li class="level1"><a href="#Glossary_GroupPublicKey">Group public key</a></li>
+<li class="level1"><a href="#Glossary_Epid">Intel&reg; EPID</a></li>
+<li class="level1"><a href="#Glossary_EpidSignature">Intel&reg; EPID signature</a></li>
+<li class="level1"><a href="#Glossary_Issuer">Issuer</a></li>
+<li class="level1"><a href="#Glossary_IssuingPrivateKey">Issuing private key</a></li>
+<li class="level1"><a href="#Glossary_Member">Member</a></li>
+<li class="level1"><a href="#Glossary_NameBasedSignature">Name-based signature</a></li>
+<li class="level1"><a href="#Glossary_MemberPrivateKey">Member private key</a></li>
+<li class="level1"><a href="#Glossary_NonRevokedProof">Non-revoked proof</a></li>
+<li class="level1"><a href="#Glossary_Pairing">Pairing</a></li>
+<li class="level1"><a href="#Glossary_Revocation">Revocation, revocation lists</a></li>
+<li class="level1"><a href="#Glossary_Verifier">Verifier</a></li>
+</ul>
+</div>
+<div class="textblock"><h1><a class="anchor" id="Issuing_CA"></a>
+CA public key</h1>
+<p>The CA (Certificate Authority) public key contains the ECDSA public key of the issuing CA. The verifier uses this key to authenticate that information provided by the issuer is genuine.</p>
+<h1><a class="anchor" id="Glossary_Daa"></a>
+DAA</h1>
+<p>Direct Anonymous Attestation (DAA) is a digital signature algorithm that supports anonymity by providing a group public verification key associated with many unique private signing keys. Intel&reg; EPID enhances DAA by enabling a private key to be revoked given a signature created by that key, even if the key itself is still unknown.</p>
+<h1><a class="anchor" id="Glossary_EllipticCurve"></a>
+Elliptic curve</h1>
+<p>In elliptic curve cryptography, an elliptic curve is an algebraic structure used to create a function whose output is easy to compute, but whose input is difficult to compute given the output. Elliptic curve cryptography requires smaller keys compared to non-elliptic curve cryptography (based on Galois fields) to provide equivalent security.</p>
+<h1><a class="anchor" id="Glossary_EllipticCurvePoint"></a>
+Elliptic curve point</h1>
+<p>An elliptic curve point is a point along an elliptic curve. The security of elliptic curve cryptography depends on the ability to compute a point multiplication and the inability to compute the multiplicand given the original and product points.</p>
+<h1><a class="anchor" id="Glossary_Group"></a>
+Group</h1>
+<p>An Intel&reg; EPID group represents a set of trusted entities called members.</p>
+<p>Issuers create groups and manage group membership. For each group, the issuer creates a group public key simultaneously with the corresponding issuing private key. The issuer uses the issuing private key to create unique member private keys for each group member, and makes the group public key available to verifiers.</p>
+<p>All groups have the following:</p>
+<ul>
+<li>Group public key, which corresponds to the issuing private key kept by the issuer</li>
+<li>Signature based revocation list</li>
+<li>Private key based revocation list</li>
+<li>Member private keys, generated from the issuing private key</li>
+</ul>
+<p>If a signature based revocation list or private key based revocation list does not exist, it is assumed to be empty.</p>
+<h1><a class="anchor" id="Glossary_Group_certificate"></a>
+Group certificate</h1>
+<p>The group certificate contains the group public key. The group certificate is created by the issuer and obtained by the verifier. When the issuer creates groups, it generates one issuing private key and one group certificate for each group.</p>
+<h1><a class="anchor" id="Glossary_GroupPublicKey"></a>
+Group public key</h1>
+<p>The group public key is the key used by the verifier to confirm that a member belongs to a group in good standing. Each member private key in a group is associated with the group's public key.</p>
+<p>When a group is created, the group public key and the issuing private key are simultaneously generated by the issuer. The verifier obtains the group public key from the issuer.</p>
+<h1><a class="anchor" id="Glossary_Epid"></a>
+Intel® EPID</h1>
+<p>Enhanced Privacy ID (Intel&reg; EPID) is a cryptographic protocol for attestation of a trusted platform while preserving the user's privacy. Intel&reg; EPID can be used as a foundational building block for a multitude of security solutions.</p>
+<h1><a class="anchor" id="Glossary_EpidSignature"></a>
+Intel® EPID signature</h1>
+<p>An Intel&reg; EPID signature is a type of digital signature that preserves anonymity of the signer, while still proving the signer is a member of a trusted group.</p>
+<h1><a class="anchor" id="Glossary_Issuer"></a>
+Issuer</h1>
+<p>The issuer is the entity in the Intel&reg; EPID scheme that is responsible for managing group membership. Issuer APIs are not included in the SDK. An example of an issuer is the Intel Key Generation Facility. For sample issuer material, refer to <a class="el" href="_provisioning.html">Preparing a Device</a>. For tools that can help you if you choose to use iKGF as your issuer, refer to <a class="el" href="_issuer_material.html">Test Data</a>.</p>
+<p>The issuer manages groups by doing the following:</p>
+<ul>
+<li>Creates groups by generating one issuing private key and one group certificate for each group. The group certificate contains the group public key.</li>
+<li>Creates group members by generating unique Intel&reg; EPID member private keys through bulk provisioning. Member private keys are created from the issuing private key for the group.</li>
+<li>Manages requests from prospective members to join existing groups.</li>
+<li>Creates and maintains signature based revocation lists and private key based revocation lists. These lists of members no longer in good standing allow members to be dropped from a group.</li>
+<li>Creates and maintains group revocation lists.</li>
+<li>Makes group public keys and revocation lists available to verifiers.</li>
+</ul>
+<h1><a class="anchor" id="Glossary_IssuingPrivateKey"></a>
+Issuing private key</h1>
+<p>The issuing private key is the key used by the issuer to generate unique private keys for each member of a given group. For every group public key, there is a corresponding issuing private key. The issuing private key remains with the issuer and is kept private.</p>
+<h1><a class="anchor" id="Glossary_Member"></a>
+Member</h1>
+<p>The member is the entity that attempts to prove its group membership to the verifier. Members are authorized by the issuer as part of a group and each group member has a unique Intel&reg; EPID private key. The member uses its member private key to sign a message to prove group membership without revealing its identity. An example of a member is a PC with an embedded Intel&reg; EPID member private key.</p>
+<h1><a class="anchor" id="Glossary_NameBasedSignature"></a>
+Name-based signature</h1>
+<p>A name-based signature is a type of signature that gives the verifier the ability to link Intel&reg; EPID signatures from the same member, reducing the member's privacy.</p>
+<p>A name-based signature is created using the additional parameter of a basename. If a basename is not specified, a random number is chosen as the basename. If the member uses the same basename, the verifier can mathematically link signatures generated by the member, showing that the signatures are from the same member.</p>
+<h1><a class="anchor" id="Glossary_MemberPrivateKey"></a>
+Member private key</h1>
+<p>The member private key is the key used by the member to digitally sign a message when attempting to prove to the verifier that the member belongs to the group and is in good standing.</p>
+<p>Unique member private keys are generated by the issuer for each member of a given group. The same group public key corresponds to each member private key in the group.</p>
+<h1><a class="anchor" id="Glossary_NonRevokedProof"></a>
+Non-revoked proof</h1>
+<p>A non-revoked proof is part of an Intel&reg; EPID signature that proves that the member is not a specific revoked entity in the signature based revocation list. The member provides the signature with a number of non-revoked proofs, one per revocation list entry, to prove to the verifier that the member does not correspond to any entry in the revocation list.</p>
+<h1><a class="anchor" id="Glossary_Pairing"></a>
+Pairing</h1>
+<p>Pairing is a mathematical operation that maps two elliptic curve groups to a third multiplicative group.</p>
+<h1><a class="anchor" id="Glossary_Revocation"></a>
+Revocation, revocation lists</h1>
+<p>Revocation lists are data structures used by the verifier to identify members that are no longer approved members of the group.</p>
+<p>The verifier obtains the member private key based revocation list (PrivRL), signature based revocation list (SigRL), and group based revocation list (GroupRL) from the issuer. The verifier can also maintain its own verifier blacklist (VerifierRL). Verifier blacklist revocation only works with name based signatures.</p>
+<h1><a class="anchor" id="Glossary_Verifier"></a>
+Verifier</h1>
+<p>The verifier is the entity that checks an Intel&reg; EPID signature to establish whether it was signed by an entity or device that is a member in good standing.</p>
+<p>The verifier acts on behalf of a party that needs to know it is communicating with a trusted device. Verifiers obtain group certificates and revocation lists from issuers and negotiate details of signature protocol with members. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_how_validated.html b/doc/html/_how_validated.html
new file mode 100644
index 0000000..22be5cb
--- /dev/null
+++ b/doc/html/_how_validated.html
@@ -0,0 +1,123 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Tested Libraries and Compilers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_how_validated.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Tested Libraries and Compilers </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="validated_supported_compilers"></a>
+Tested Libraries and Compilers</h1>
+<p>The Intel&reg; SDK was validated with the following compilers:</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Runtime Library </th><th class="markdownTableHeadNone">Compiler ---------------------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">GNU* C Library (glibc) 2.23 </td><td class="markdownTableBodyNone">GNU* Compiler Collection version (GCC) 6.2.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">GCC 5.4.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">GCC 4.8.5 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">Intel&reg; C++ Compiler for Linux* (ICC) 17.0.1 with GCC 4.8.5 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 17.0.1 with GCC 5.4.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 17.0.1 with GCC 6.2.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 16.0.3 with GCC 4.8.5 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 16.0.3 with GCC 5.4.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 16.0.3 with GCC 6.2.0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 15.0.7 with GCC 4.8.5 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">glibc 2.23 </td><td class="markdownTableBodyNone">ICC 14.0.4 with GCC 4.8.5 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 10 </td><td class="markdownTableBodyNone">Microsoft* Visual Studio*(VS) 2015 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 8.1 </td><td class="markdownTableBodyNone">VS 2015 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 8.1 </td><td class="markdownTableBodyNone">Intel&reg; C++ Compiler for Windows* (ICL) 16.0.207 with VS 2013 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 10 </td><td class="markdownTableBodyNone">ICL 16.0.207 with VS 2015 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 8.1 </td><td class="markdownTableBodyNone">ICL 15.0.287 with VS 2013 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 10 </td><td class="markdownTableBodyNone">ICL 15.0.287 with VS 2015 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Microsoft* Windows* Kit 8.1 </td><td class="markdownTableBodyNone">ICL 14.0.241 with VS 2013 </td></tr>
+</table>
+<p><br />
+ *Other names and brands may be claimed as the property of others. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_implementation_notes.html b/doc/html/_implementation_notes.html
new file mode 100644
index 0000000..5e01693
--- /dev/null
+++ b/doc/html/_implementation_notes.html
@@ -0,0 +1,122 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Implementation Notes</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_implementation_notes.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Implementation Notes </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#implementationNotes_Members">Member Implementations</a></li>
+<li class="level1"><a href="#ImplementationNotes_Prng">Random Number Generation</a></li>
+<li class="level1"><a href="#ImplementationNotes_ProtectingSecrets">Protecting Secrets</a></li>
+<li class="level1"><a href="#ImplementationNotes_MathPrimitives">Replacing Math Primitives</a></li>
+<li class="level1"><a href="#ImplementationNotes_SerializedTypes">Octstring/Buffer Types</a></li>
+<li class="level1"><a href="#ImplementationNotes_FlexibleArrays">Flexible Arrays</a></li>
+</ul>
+</div>
+<div class="textblock"><h1><a class="anchor" id="implementationNotes_Members"></a>
+Member Implementations</h1>
+<p>There are three member implementations. You can use a specific compilation option to select the implementation that will be used at compile time. The implementations are:</p>
+<ol type="1">
+<li><b>Reference:</b> This default implementation gives guidance on partitioning member operations between highly sensitive ones that use the <code>f</code> value of the member private key, and less sensitive ones that can be performed in a host environment. To build in default mode, refer to <a class="el" href="_building_sdk.html">Building from Source</a>.</li>
+<li><b>TPM:</b> This TPM member implementation uses the TPM for signing by linking to the IBM TSS. To build in TPM mode, refer to <a class="el" href="_tpm_considerations.html#TpmConsiderations_BuildingTpmMode">Building the SDK in TPM Mode</a>.</li>
+<li><b>Tiny:</b> This tiny implementation builds the SDK with a substantially reduced code size. To build in tiny mode, refer to <a class="el" href="_building_sdk.html#BuildingSdk_Tiny">Optimizing for Code Size</a>.</li>
+</ol>
+<h1><a class="anchor" id="ImplementationNotes_Prng"></a>
+Random Number Generation</h1>
+<p>Some SDK APIs require a random number data source. A <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> provides a source of random data. This function should be a cryptographically secure random number generator.</p>
+<dl class="section warning"><dt>Warning</dt><dd>The pseudo-random number generator provided with the examples is for sample use only and is not suitable for cryptographically secure applications.</dd></dl>
+<h1><a class="anchor" id="ImplementationNotes_ProtectingSecrets"></a>
+Protecting Secrets</h1>
+<p>Member code works with private keys, so member code must be run in a trusted environment. The member component contains a TPM subcomponent which contains the most sensitive operations performed by the member.</p>
+<dl class="section warning"><dt>Warning</dt><dd>If member memory is available to an untrusted source, the member private key could be exposed.</dd></dl>
+<p>The <code>EpidZeroMemory</code> function is used by the memory allocation routines <code>EpidAlloc</code>, <code>EpidRealloc</code> and <code>EpidFree</code> to wipe the memory as memory is freed.</p>
+<dl class="section warning"><dt>Warning</dt><dd>The <code>EpidZeroMemory</code> function may be optimized away by some compilers. If it is, you should consider using a compiler or operating system specific memory sanitization function (e.g. <code>memcpy_s</code> or <code>SecureZeroMemory</code>).</dd></dl>
+<h1><a class="anchor" id="ImplementationNotes_MathPrimitives"></a>
+Replacing Math Primitives</h1>
+<p>SDK math primitives are designed to be replaced with your own implementation if you need to rely on custom hardware for performance. The SDK is designed to simplify this process by isolating implementation details behind a clearly defined interface, defined by the non-internal headers in the <code>epid/common/math</code> directory. Math functionality has detailed tests to ease validation.</p>
+<h1><a class="anchor" id="ImplementationNotes_SerializedTypes"></a>
+Octstring/Buffer Types</h1>
+<p>Serialized information in the SDK is passed in fixed size buffer types whenever possible. Collectively these fixed size buffer types are called Octstrings.</p>
+<p>In <a class="el" href="types_8h.html" title="SDK data types. ">epid/common/types.h</a>, there are a large number of packed structs that contain other packed structs, which eventually contain OctStr* types. Normally these are named *Str and are refered to as Str types.</p>
+<p>OctStr* types are buffers that hold N bits, where N is the number at the end of the type name. These types usually represent numbers in a Big Endian format (buffer[0] is the most significant value).</p>
+<p>Str types generally represent fixed size groups of numbers such as a point or vector.</p>
+<p>OctStr* and Str types are usually populated by reading a buffer from a file or other storage, or by calling a serialize function. OctStr* and Str types must be packed so that the compiler does not insert padding. In the current code, this is done using pragmas.</p>
+<div class="fragment"><div class="line"><span class="preprocessor">#pragma pack(1)</span></div><div class="line"></div><div class="line"><span class="comment">// OctStr* type holding 256 bits</span></div><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_oct_str256.html">OctStr256</a> {</div><div class="line"> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e">data</a>[256 / CHAR_BIT]; </div><div class="line">} <a class="code" href="struct_oct_str256.html">OctStr256</a>;</div><div class="line"></div><div class="line"><span class="comment">// Str type consisting of a single 256 bit number</span></div><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_fq_elem_str.html">FqElemStr</a> {</div><div class="line"> <a class="code" href="struct_oct_str256.html">OctStr256</a> <a class="code" href="struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14">data</a>; </div><div class="line">} <a class="code" href="struct_fq_elem_str.html">FqElemStr</a>;</div><div class="line"></div><div class="line"><span class="comment">// Str type consisting of a two other Str types</span></div><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_g1_elem_str.html">G1ElemStr</a> {</div><div class="line"> <a class="code" href="struct_fq_elem_str.html">FqElemStr</a> <a class="code" href="struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4">x</a>; </div><div class="line"> <a class="code" href="struct_fq_elem_str.html">FqElemStr</a> <a class="code" href="struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3">y</a>; </div><div class="line">} <a class="code" href="struct_g1_elem_str.html">G1ElemStr</a>;</div></div><!-- fragment --><p>Many APIs use void* parameters where OctStr* types are expected. If more than one size is allowed, a size parameter is usually also required.</p>
+<h1><a class="anchor" id="ImplementationNotes_FlexibleArrays"></a>
+Flexible Arrays</h1>
+<p>A common idiom in the SDK is the use of flexible array types. These types are structs with the last element being an array of size 1 of some type. Flexible array types always have a size value embedded in the struct. The name of the count and array fields differs between flexible array types.</p>
+<div class="fragment"><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>Sample {</div><div class="line"> <a class="code" href="struct_oct_str32.html">OctStr32</a> data; </div><div class="line"> <a class="code" href="struct_oct_str32.html">OctStr32</a> count; </div><div class="line"> <a class="code" href="struct_g1_elem_str.html">G1ElemStr</a> array[1]; </div><div class="line">} Sample;</div></div><!-- fragment --><p>Flexible array types are expected to be in a buffer of size <code>sizeof(FA) + ((N-1) * sizeof(E))</code> where FA is the flexible array type, N is the number of elements in the array and E is the type of each element. Note that this may be smaller than <code>sizeof(FA)</code> if N is 0, in which case referencing any element is an error.</p>
+<div class="fragment"><div class="line">Sample* AllocSample(<span class="keywordtype">size_t</span> count) {</div><div class="line"> <span class="keywordflow">return</span> (Sample*)malloc(<span class="keyword">sizeof</span>(Sample)</div><div class="line"> + (count * <span class="keyword">sizeof</span>(<a class="code" href="struct_g1_elem_str.html">G1ElemStr</a>))</div><div class="line"> - <span class="keyword">sizeof</span>(<a class="code" href="struct_g1_elem_str.html">G1ElemStr</a>));</div><div class="line">}</div></div><!-- fragment --><p>In many cases, functions that accept flexible array types will also expect a buffer size that is compared against the computed size of the array as a sanity check.</p>
+<p>*Other names and brands may be claimed as the property of others. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_issuer_material.html b/doc/html/_issuer_material.html
new file mode 100644
index 0000000..7e79f96
--- /dev/null
+++ b/doc/html/_issuer_material.html
@@ -0,0 +1,268 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Test Data</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_issuer_material.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Test Data </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>The SDK includes sample material in <code>example/data</code> that is intended to be provisioned in members and verifiers so that they can operate without material from a real issuer, such as iKGF.</p>
+<h1><a class="anchor" id="IssuerMaterial_Groups"></a>
+Sample Groups</h1>
+<h2>Sample Group A</h2>
+<p>Group A (<code>groupa</code>) contains eight group members and sample revocation lists:</p>
+<p><br />
+</p>
+<h3>Members in Group A</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Member </th><th class="markdownTableHeadNone">Revocation Status </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/member0 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/member1 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/privrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/privrevokedmember1 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/privrevokedmember2 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember1 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember2 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+</table>
+<p><br />
+</p>
+<h3>Revocation Lists for Group A</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Directory Location </th><th class="markdownTableHeadNone">Revoked Members </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Private key based revocation list </td><td class="markdownTableBodyNone"><code>groupa/privrl.bin</code> </td><td class="markdownTableBodyNone">privrevokedmember0, <br />
+ privrevokedmember1, <br />
+ privrevokedmember2 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Signature based revocation list </td><td class="markdownTableBodyNone"><code>groupa/sigrl.bin</code> </td><td class="markdownTableBodyNone">sigrevokedmember0, <br />
+ sigrevokedmember1, <br />
+ sigrevokedmember2 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Empty private key based revocation list </td><td class="markdownTableBodyNone"><code>groupa/privrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Empty signature based revocation list </td><td class="markdownTableBodyNone"><code>groupa/sigrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+</table>
+<p><br />
+</p>
+<h2>Sample Group B</h2>
+<p>Group B (<code>groupb</code>) contains four group members and sample revocation lists:</p>
+<p><br />
+</p>
+<h3>Members in Group B</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Member </th><th class="markdownTableHeadNone">Revocation Status </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupb/member0 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupb/member1 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupb/privrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupb/sigrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+</table>
+<p><br />
+</p>
+<h3>Revocation Lists for Group B</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Directory Location </th><th class="markdownTableHeadNone">Revoked Members </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Private key based revocation list </td><td class="markdownTableBodyNone"><code>groupb/privrl.bin</code> </td><td class="markdownTableBodyNone">privrevokedmember0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Signature based revocation list </td><td class="markdownTableBodyNone"><code>groupb/sigrl.bin</code> </td><td class="markdownTableBodyNone">sigrevokedmember0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Empty private key based revocation list </td><td class="markdownTableBodyNone"><code>groupb/privrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Empty signature based revocation list </td><td class="markdownTableBodyNone"><code>groupb/sigrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+</table>
+<h1><a class="anchor" id="IssuerMaterial_GroupRls"></a>
+Group Revocation Lists</h1>
+<p>If an entire group is no longer valid, the issuer can revoke it using the group revocation list. Two sample group revocation lists are provided with the SDK.</p>
+<p><br />
+</p>
+<h3>Sample GrpRLs</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Revocation List </th><th class="markdownTableHeadNone">Description </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>grprl_empty.bin</code> </td><td class="markdownTableBodyNone">No entries </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>grprl.bin</code> </td><td class="markdownTableBodyNone">One entry in which <code>groupb</code> is revoked </td></tr>
+</table>
+<h1><a class="anchor" id="CompressedSamples"></a>
+Compressed Sample Groups</h1>
+<p>Intel&reg; EPID SDK supports use of compressed member private keys. The groups described here use compressed member private keys but structurally correspond to groups described above.</p>
+<h2>Compressed Sample Group A</h2>
+<p>Group A (<code>groupa</code>) contains eight group members and sample revocation lists:</p>
+<p><br />
+</p>
+<h3>Members in Group A</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Member </th><th class="markdownTableHeadNone">Revocation Status </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/member0 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/member1 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/privrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/privrevokedmember1 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/privrevokedmember2 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember1 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupa/sigrevokedmember2 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+</table>
+<p><br />
+</p>
+<h3>Revocation Lists for Group A</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Directory Location </th><th class="markdownTableHeadNone">Revoked Members </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Private key based revocation list </td><td class="markdownTableBodyNone"><code>groupa/privrl.bin</code> </td><td class="markdownTableBodyNone">privrevokedmember0, <br />
+ privrevokedmember1, <br />
+ privrevokedmember2 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Signature based revocation list </td><td class="markdownTableBodyNone"><code>groupa/sigrl.bin</code> </td><td class="markdownTableBodyNone">sigrevokedmember0, <br />
+ sigrevokedmember1, <br />
+ sigrevokedmember2 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Empty private key based revocation list </td><td class="markdownTableBodyNone"><code>groupa/privrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Empty signature based revocation list </td><td class="markdownTableBodyNone"><code>groupa/sigrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+</table>
+<p><br />
+</p>
+<h2>Compressed Sample Group B</h2>
+<p>Group B (<code>groupb</code>) contains four group members and sample revocation lists:</p>
+<p><br />
+</p>
+<h3>Members in Group B</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Member </th><th class="markdownTableHeadNone">Revocation Status </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupb/member0 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupb/member1 </td><td class="markdownTableBodyNone">Non-revoked </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">groupb/privrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in PrivRL </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">groupb/sigrevokedmember0 </td><td class="markdownTableBodyNone">Revoked in SigRL </td></tr>
+</table>
+<p><br />
+</p>
+<h3>Revocation Lists for Group B</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Directory Location </th><th class="markdownTableHeadNone">Revoked Members </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Private key based revocation list </td><td class="markdownTableBodyNone"><code>groupb/privrl.bin</code> </td><td class="markdownTableBodyNone">privrevokedmember0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Signature based revocation list </td><td class="markdownTableBodyNone"><code>groupb/sigrl.bin</code> </td><td class="markdownTableBodyNone">sigrevokedmember0 </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Empty private key based revocation list </td><td class="markdownTableBodyNone"><code>groupb/privrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Empty signature based revocation list </td><td class="markdownTableBodyNone"><code>groupb/sigrl_empty.bin</code> </td><td class="markdownTableBodyNone">None </td></tr>
+</table>
+<h1><a class="anchor" id="IssuerMaterial_CmpGroupRls"></a>
+Compressed Group Revocation Lists</h1>
+<p>If an entire group is no longer valid, the issuer can revoke it using the group revocation list. Two sample group revocation lists are provided with the SDK.</p>
+<p><br />
+</p>
+<h3>Sample GrpRLs</h3>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Group Revocation List </th><th class="markdownTableHeadNone">Description </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>grprl_empty.bin</code> </td><td class="markdownTableBodyNone">No entries </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>grprl.bin</code> </td><td class="markdownTableBodyNone">One entry in which <code>groupb</code> is revoked </td></tr>
+</table>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_legal_information.html b/doc/html/_legal_information.html
new file mode 100644
index 0000000..e5de949
--- /dev/null
+++ b/doc/html/_legal_information.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Legal Information</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_legal_information.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Legal Information </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL&reg; PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER, AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.</p>
+<p>UNLESS OTHERWISE AGREED IN WRITING BY INTEL, THE INTEL PRODUCTS ARE NOT DESIGNED NOR INTENDED FOR ANY APPLICATION IN WHICH THE FAILURE OF THE INTEL PRODUCT COULD CREATE A SITUATION WHERE PERSONAL INJURY OR DEATH MAY OCCUR.</p>
+<p>Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined." Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information.</p>
+<p>The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request.</p>
+<p>Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order.</p>
+<p>Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-800-548-4725, or by visiting Intel's web site <a href="http://www.intel.com">http://www.intel.com</a>.</p>
+<p>Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and other countries.</p>
+<p>*Other names and brands may be claimed as the property of others. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_provisioning.html b/doc/html/_provisioning.html
new file mode 100644
index 0000000..4cad26e
--- /dev/null
+++ b/doc/html/_provisioning.html
@@ -0,0 +1,140 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Preparing a Device</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_provisioning.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Preparing a Device </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#Provisioning_BulkProvisioning">Bulk Provisioning</a></li>
+<li class="level1"><a href="#Provisioning_JoinProvisioning">Dynamic Provisioning</a></li>
+<li class="level1"><a href="#SampleIssuerMaterial">Issuer Material</a><ul><li class="level2"><a href="#Provisioning_ValidatingVerifiers">Issuer Material for Verifiers</a></li>
+<li class="level2"><a href="#Provisioning_ValidatingMembers">Issuer Material for Members</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><p>In order to be an Intel&reg; EPID device, members need to be provisioned with a member private key and group public key. Members can get member private keys through bulk or dynamic provisioning.</p>
+<p>For Intel&reg; EPID verifiers to function, they need access to a group public key and revocation lists.</p>
+<p>All Intel&reg; EPID keys and revocation lists are referred to collectively as issuer material.</p>
+<p>This section describes how to:</p>
+<ul>
+<li>Provision member private keys through bulk provisioning</li>
+<li>Provision member private keys through dynamic provisioning</li>
+<li>Provision members and verifiers with sample issuer material</li>
+</ul>
+<p>For information on obtaining real issuer material from iKGF (Intel Key Generation Facility), see <a class="el" href="_usingi_k_g_f.html">Managing Groups with iKGF</a>. For more general information on how the issuer provides material for members and verifiers, see <a class="el" href="_epid_overview.html">Introduction to the Intel&reg; EPID Scheme</a>.</p>
+<h1><a class="anchor" id="Provisioning_BulkProvisioning"></a>
+Bulk Provisioning</h1>
+<p><b>Bulk provisioning</b> is typically done during manufacturing.</p>
+<p>In bulk provisioning, the issuer provides complete member private keys to the device manufacturer.</p>
+<p>In bulk provisioning, the manufacturer needs to do the following:</p>
+<ul>
+<li>Request member private keys from the issuer in bulk. These are complete member private keys, including the membership credential and the secret f component.</li>
+<li>Fuse the member private keys into each device.</li>
+</ul>
+<h1><a class="anchor" id="Provisioning_JoinProvisioning"></a>
+Dynamic Provisioning</h1>
+<p><b>Dynamic provisioning</b> was designed to allow a device to join a group post-manufacturing. While key generation is the key part of bulk provisioning, the key part of dynamic provisioning is the join protocol.</p>
+<p>Dynamic provisioning relies on a two-way exchange of intermediate values to protect the secrecy of the final member private key. In dynamic provisioning, the issuer provides the membership credential component of each member private key, while the secret <code>f</code> value comes from the device and is never known to the issuer.</p>
+<div class="image">
+<img src="member_private_key.png" alt="member_private_key.png"/>
+</div>
+<p>In dynamic provisioning, the manufacturer needs to do the following:</p>
+<ol type="1">
+<li><b>Generate the <code>f</code> value</b> of the member private key.</li>
+<li><b>Generate the join request</b> using the <code>f</code> value and a nonce obtained from the issuer.</li>
+<li><b>Send the join request to the issuer.</b> The issuer will respond to the join request by returning the membership credential.</li>
+<li><b>Provision the membership credential</b> to the member device.</li>
+</ol>
+<h1><a class="anchor" id="SampleIssuerMaterial"></a>
+Issuer Material</h1>
+<p>Members and verifiers need issuer material to operate. The SDK includes sample material in <code>example/data</code> so that members and verifiers can operate without real issuer material. The following types of sample issuer material are included:</p>
+<ul>
+<li>Group public key, which corresponds to the issuing private key kept by the issuer</li>
+<li>Member private keys</li>
+<li>Signature based revocation list (SigRL)</li>
+<li>Private key based revocation list (PrivRL)</li>
+<li>Group revocation list (GroupRL)</li>
+</ul>
+<p>For detailed information on what sample issuer material is included in the SDK, refer to <a class="el" href="_issuer_material.html">Test Data</a>.</p>
+<p>For information on how to work with real issuer material, refer to <a class="el" href="_usingi_k_g_f.html">Managing Groups with iKGF</a>.</p>
+<h2><a class="anchor" id="Provisioning_ValidatingVerifiers"></a>
+Issuer Material for Verifiers</h2>
+<p>To test a verifier, you can provide the verifier a sample group public key and sample revocation lists from <code>example/data</code>, and make sure that verification succeeds or fails based on the revoked or non-revoked status of the member.</p>
+<h2><a class="anchor" id="Provisioning_ValidatingMembers"></a>
+Issuer Material for Members</h2>
+<p>To test a member, you can provision the member with a sample group public key, sample member private key, and sample <code>SigRL</code> from <code>example/data</code>.</p>
+<p>You can provision the member with revoked material to make sure the verification process fails. For example, when you sign and verify using the member <code>groupa/privrevokedmember0</code>, and use the sample private key revocation list on which <code>privrevokedmember0</code> is revoked, verification should fail.</p>
+<p>Similarly, when you generate a signature using the member <code>groupa/sigrevokedmember0</code>, using sample SigRL <code>groupa/sigrl.bin</code>, verification should fail. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_revocation.html b/doc/html/_revocation.html
new file mode 100644
index 0000000..98e5f3c
--- /dev/null
+++ b/doc/html/_revocation.html
@@ -0,0 +1,144 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: In-Depth Explanation of Revocation</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_revocation.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">In-Depth Explanation of Revocation </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This in-depth explanation covers the available options to revoke members in the Intel&reg; EPID scheme. It also provides details on how and why each type of revocation is used.</p>
+<p><br />
+</p>
+<h1><a class="anchor" id="revocation_hierarchy"></a>
+Revocation Hierarchy</h1>
+<p>The verifier only checks the revocation lists if the message was signed with a member private key that corresponds with the correct group public key.</p>
+<p>After concluding that the signer is a member of a group, the verifier proceeds to check for group based revocation, then member private key based revocation, then signature based revocation, then verifier blacklist revocation.</p>
+<p>If the group is revoked, the verifier stops and reports it.</p>
+<p>If the member private key is revoked, the verifier does not check the signature based revocation list.</p>
+<h1><a class="anchor" id="revocation_versions"></a>
+Revocation List Versions</h1>
+<p>The verifier should periodically download the revocation lists (GroupRL, PrivRL, and SigRL) from the issuer and should use the latest revocation list during signature verification. The verifier should make sure that it gets the newest version of the revocation list during the update by checking RLver, the revocation list version number.</p>
+<h1><a class="anchor" id="group_revocation"></a>
+Group Based Revocation</h1>
+<p>The group based revocation list, also called the GroupRL, has a list of revoked groups.</p>
+<p>The issuer revokes the entire Intel&reg; EPID group by revoking the group public key. This results in the revocation of all members of a group.</p>
+<h2><a class="anchor" id="group_revocation_reasons"></a>
+Reasons the Issuer Might Revoke a Group</h2>
+<p>Group revocation is expected to be a rare event and would only happen under limited criteria.</p>
+<p>Reasons to revoke a group might include:</p>
+<ul>
+<li>A manufacturing defect causes the devices in the group to malfunction.</li>
+<li>A subscriber terminates or violates the service agreement.</li>
+<li>The Intel&reg; EPID issuing private key is exposed.</li>
+<li>A critical vulnerability in a member implementation is identified.</li>
+<li>Performance problems arise due to the expensive calculation of non-revoked proofs in signature based revocation, and a replacement group needs to be provisioned.</li>
+</ul>
+<h1><a class="anchor" id="private_key_revocation"></a>
+Private Key Based Revocation</h1>
+<p>Private key based revocation is used to revoke a compromised member. For example, the issuer can revoke a member if the member private key is exposed. When a compromised member private key is identified, it needs to be communicated to the issuer so that the issuer can revoke the member private key.</p>
+<p>The issuer manages and publishes the member private key revocation list, also called the PrivRL, which contains member private keys that can no longer be used.</p>
+<h2><a class="anchor" id="private_key_revocation_reasons"></a>
+Reasons the Issuer Might Revoke a Member Private Key</h2>
+<p>Depending on the use case, these member private keys could belong to members whose identity was compromised. For example, if a member private key is exposed online, allowing group members to be impersonated, then the compromised member private key is known, and the issuer revokes the member private key.</p>
+<h1><a class="anchor" id="signature_revocation"></a>
+Signature Based Revocation</h1>
+<p>In signature based revocation, the issuer revokes a member based on the signature generated by the member. This revocation method is used when a member becomes subject to revocation criteria, but the issuer does not know the member's member private key.</p>
+<p>The issuer manages and publishes the signature based revocation list, also called SigRL.</p>
+<p>Entries in the SigRL cause signing to take longer for all members of the group. Therefore, when an issuer receives a signature revocation request, it first checks the signature against all entries in the private key based revocation list. If the signature was generated by a revoked private key, then it is not placed in the SigRL.</p>
+<p>For the same reason, if the issuer were requested to revoke a private key, and the current SigRL had entries that corresponded to that private key, then the issuer would remove those entries from the SigRL.</p>
+<h2><a class="anchor" id="revoked_proofs"></a>
+Signing with Non-Revoked Proofs</h2>
+<p>The verifier and the member both use the SigRL managed by the issuer (the method of obtaining the SigRL is outside the scope of the SDK). The member sends the verifier an Intel&reg; EPID signature that includes a number of non-revoked proofs that correspond to each revoked member in the SigRL.</p>
+<p>In other words, the member mathematically proves that it is not any of the members who created the entries on the SigRL. One proof of non-revocation is generated by the member per entry in the SigRL. A single proof indicates the member in question cannot be the one who generated that signature in the SigRL.</p>
+<p>For privacy, Intel&reg; EPID signatures that are generated by the same member are unlinkable by default. This means that the verifier cannot recognize if two Intel&reg; EPID signatures are from the same device. Therefore, multiple Intel&reg; EPID signatures on the SigRL could be from the same member.</p>
+<h2><a class="anchor" id="signature_revocation_reasons"></a>
+Reasons the Issuer Might Revoke an Intel® EPID Signature</h2>
+<p>Reasons for revoking a signature might include the following:</p>
+<ul>
+<li>A member's signature is connected to an aspect of its behavior that indicates that the member is compromised.</li>
+<li>A member repeatedly generates a constant signature for the same message. Per the Intel&reg; EPID algorithm, multiple signatures generated for the same challenge must be different.</li>
+</ul>
+<h1><a class="anchor" id="verifier_blacklist"></a>
+Verifier Blacklist Revocation</h1>
+<p>Verifier blacklist revocation is similar to signature based revocation in that it can be used to revoke a member using only a signature from a compromised member. Unlike the procedure for the signature based revocation list, members do not have to create non-revoked proofs for each entry on the verifier blacklist. Instead, the verifier relies on the member to use a basename when creating the signature (in other words, to use a name based signature) in order to determine if the same member created any of the signatures on the verifier blacklist.</p>
+<p>For the verifier to determine that a member created an entry on the verifier blacklist, the member and verifier must use the same basename. The mechanism that allows them to agree on a basename is outside the scope of the SDK.</p>
+<p>For more information on basenames, refer to <a class="el" href="_basenames.html#name_based">Name Based Signatures</a>.</p>
+<p>The verifier adds a signature to a blacklist when the verifier does not want to trust the signer, but the verifier does not have enough reason to send a request to the issuer to revoke the member's signature.</p>
+<p>When the verifier tracks a member using a basename, and decides the member is not trustworthy, the verifier can add the member's signature to the verifier blacklist.</p>
+<h2><a class="anchor" id="verifier_blacklist_reasons"></a>
+Reasons the Verifier Might Revoke an Intel® EPID Signature</h2>
+<p>Reasons a verifier might revoke a member based on its tracked signatures include the following:</p>
+<ul>
+<li>A service provider receives a complaint about a customer. In this case, even though the verifier no longer trusts that customer to use the service, the verifier does not have a case to petition the issuer to revoke the member.</li>
+<li>A service provider detects suspicious behavior that might indicate illegal activity or another violation of the service provider's policy. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_sdk_overview.html b/doc/html/_sdk_overview.html
new file mode 100644
index 0000000..887b394
--- /dev/null
+++ b/doc/html/_sdk_overview.html
@@ -0,0 +1,247 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: What&#39;s Included in the SDK</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_sdk_overview.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">What's Included in the SDK </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#SdkOverview_Components">SDK Components</a><ul><li class="level2"><a href="#SdkOverview_Core">SDK Core</a></li>
+<li class="level2"><a href="#SdkOverview_Samples">Samples</a></li>
+<li class="level2"><a href="#SdkOverview_Tools">Tools</a></li>
+<li class="level2"><a href="#SdkOverview_BuildingAndValidation">Other Components</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#SdkOverview_Compatibility">Intel&reg; EPID 1.1 Compatibility</a></li>
+<li class="level1"><a href="#SdkOverview_TPM">Member Implementations</a></li>
+<li class="level1"><a href="#SdkOverview_Files">Folder Layout</a><ul><li class="level2"><a href="#SdkOverview_Files_SourceLayout">Source Layout</a></li>
+<li class="level2"><a href="#SdkOverview_Files_InstallLayout">Install Layout</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><h1><a class="anchor" id="SdkOverview_Components"></a>
+SDK Components</h1>
+<p>The SDK is divided into logical components to separate responsibilities and create interfaces that you can re-implement using custom tools such as hardware accelerators.</p>
+<div class="image">
+<img src="sdk_block_diagram.png" alt="sdk_block_diagram.png"/>
+</div>
+<p><br />
+ The Intel&reg; EPID SDK is divided into the following components:</p>
+<p><br />
+</p>
+<h2><a class="anchor" id="SdkOverview_Core"></a>
+SDK Core</h2>
+<p>Components in the SDK Core implement the features of Intel&reg; EPID.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Component </th><th class="markdownTableHeadNone">Description ------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">member </td><td class="markdownTableBodyNone">Library containing APIs needed to implement a member </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">verifier </td><td class="markdownTableBodyNone">Library containing APIs needed to implement a verifier </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">common </td><td class="markdownTableBodyNone">Library containing common types and functions </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">math </td><td class="markdownTableBodyNone">Math primitives used by member and verifier </td></tr>
+</table>
+<p><br />
+</p>
+<h2><a class="anchor" id="SdkOverview_Samples"></a>
+Samples</h2>
+<p>The SDK includes <a class="el" href="_issuer_material.html">Test Data</a> in <code>example/data</code> that is intended to be provisioned in members and verifiers so that they can operate without real issuer material. (For information on how to work with real issuer material, refer to <a class="el" href="_usingi_k_g_f.html">Managing Groups with iKGF</a>.)</p>
+<p>The SDK also includes signing and verification <a class="el" href="_examples.html">Examples</a> that show how to use the SDK APIs in working code.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Component </th><th class="markdownTableHeadNone">Description ------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">signmsg </td><td class="markdownTableBodyNone">A sample program showing how to sign messages </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">verfifysig </td><td class="markdownTableBodyNone">A sample program showing how to verify signatures </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">util </td><td class="markdownTableBodyNone">Common utilities used by samples </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Sample Issuer Material </td><td class="markdownTableBodyNone">Sample keys and revocation lists </td></tr>
+</table>
+<p><br />
+</p>
+<h2><a class="anchor" id="SdkOverview_Tools"></a>
+Tools</h2>
+<p>The SDK provides tools to interact with Intel&reg; EPID related services such those offered by the <a class="el" href="_issuer_material.html">Intel&reg; Key Generation Facility</a>.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Component </th><th class="markdownTableHeadNone">Description ------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">extractgrps </td><td class="markdownTableBodyNone">A tool to extract groups from a bulk group file </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">extractkeys </td><td class="markdownTableBodyNone">A tool to extract member keys from a bulk key file </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">revokegrp </td><td class="markdownTableBodyNone">A tool to create a revocation request for a group </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">revokekey </td><td class="markdownTableBodyNone">A tool to create a revocation request for a member key </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">revokesig </td><td class="markdownTableBodyNone">A tool to create a revocation request from a signature </td></tr>
+</table>
+<p><br />
+</p>
+<h2><a class="anchor" id="SdkOverview_BuildingAndValidation"></a>
+Other Components</h2>
+<p>The SDK comes with a number of other components that support building and validating the code.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Component </th><th class="markdownTableHeadNone">Description ------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">gtest </td><td class="markdownTableBodyNone">gtest unit test framework </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Build Scripts </td><td class="markdownTableBodyNone">Scripts to configure and build the SDK </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">dropt </td><td class="markdownTableBodyNone">Library for parsing command line </td></tr>
+</table>
+<p>Math primitives are implemented in the <em>math</em> sub-component of <em>common</em>. The reference math primitive implementation is based on a non-optimized Vanilla C subset of the Intel&reg; Performance Primitives. <em>Math</em> is designed so that you can replace its implementation to call custom hardware IP blocks or optimized libraries.</p>
+<p><br />
+</p>
+<h1><a class="anchor" id="SdkOverview_Compatibility"></a>
+Intel® EPID 1.1 Compatibility</h1>
+<p>In addition to the default Intel&reg; EPID 2.0 APIs, the <em>verifier</em> component also includes APIs that allow verification of Intel&reg; EPID 1.1 signatures.</p>
+<p>Billions of existing devices, including most Intel platforms manufactured since 2008, create signatures that need Intel&reg; EPID 1.1 verification.</p>
+<p>For details on verifying Intel&reg; EPID 1.1 signatures see <a href="group___epid11_verifier_module.html#details"><b>Intel&reg; EPID 1.1 support</b></a> in the API Reference.</p>
+<h1><a class="anchor" id="SdkOverview_TPM"></a>
+Member Implementations</h1>
+<p>There are three member implementations. You can use a specific compilation option to select the implementation that will be used at compile time. The implementations are:</p>
+<ol type="1">
+<li><b>Reference:</b> This default implementation gives guidance on partitioning member operations between highly sensitive ones that use the <code>f</code> value of the member private key, and less sensitive ones that can be performed in a host environment. To build in default mode, refer to <a class="el" href="_building_sdk.html">Building from Source</a>.</li>
+<li><b>TPM:</b> This TPM member implementation uses the TPM for signing by linking to the IBM TSS. To build in TPM mode, refer to <a class="el" href="_tpm_considerations.html#TpmConsiderations_BuildingTpmMode">Building the SDK in TPM Mode</a>.</li>
+<li><b>Tiny:</b> This tiny implementation builds the SDK with a substantially reduced code size. To build in tiny mode, refer to <a class="el" href="_building_sdk.html#BuildingSdk_Tiny">Optimizing for Code Size</a>.</li>
+</ol>
+<div class="image">
+<img src="implementing_member.png" alt="implementing_member.png"/>
+</div>
+<h1><a class="anchor" id="SdkOverview_Files"></a>
+Folder Layout</h1>
+<p>The Intel&reg; EPID SDK has two filesystem layouts: the Source Layout and the Install Layout.</p>
+<p>The Source Layout is what you find when you download the SDK and extract it to disk. This layout contains all of the files that you need to build the libraries, samples, tests, and data generated by the SDK.</p>
+<p>The Install Layout is the layout of files under the <code>_install</code> folder after you build the SDK.</p>
+<h2><a class="anchor" id="SdkOverview_Files_SourceLayout"></a>
+Source Layout</h2>
+<p>The Source Layout is used by the build scripts in the Intel&reg; EPID SDK to find components and files needed to create libraries and executables. </p><pre class="fragment">epid-sdk/
+|__ LICENSE.txt Distribution license
+|__ NOTICE.txt Legal notices
+|__ README.md Readme
+|__ CHANGELOG.md Change log
+|__ SConstruct Parts based build configuration
+|__ configure Make based build configuration
+|__ Makefile.in Make based build configuration
+|
+|__ doc/
+| |__ html/ HTML format documentation
+| |__ index.html Entry point for HTML format documentation
+|
+|__ epid/
+| |__ common/ Source for Common
+| |__ common-testhelper/ Source for unit test helper common helpers
+| |__ member/ Source for Member
+| |__ verifier/ Source for Verifier
+|
+|__ example/
+| |__ data/ Binary data used for testing and tutorials
+| |__ compressed_data/ Compressed Member Key Binary data used for testing and tutorials
+| |__ signmsg/ Source for message signing example
+| |__ util/ Common utilities for examples
+| |__ verifysig/ Source for signature validation signing example
+|
+|__ ext/
+| |__ dropt/ Third party library for parsing command-line options
+| |__ gtest/ Third party gtest library
+| |__ ipp/ Intel(R) Performance Primitives library
+|
+|__ parts-site/ Parts platform config scripts
+|
+|__ tools/
+ |__ extractgrps/ Tool to extract groups
+ |__ extractkeys/ Tool to extract keys
+ |__ revokegrp/ Tool to create group revocation request
+ |__ revokekey/ Tool to create a member key revocation request
+ |__ revokesig/ Tool to create a signature based revocation
+ request
+</pre><h2><a class="anchor" id="SdkOverview_Files_InstallLayout"></a>
+Install Layout</h2>
+<p>The Install Layout contains the data developers need to develop and build their applications using the Intel&reg; EPID SDK. Once built, the Install Layout has no dependency on the Source Layout, allowing developers to build the SDK once and reuse the built files in other locations or on other computers. </p><pre class="fragment">_install/
+|__ epid-sdk/
+ |__ include/ C include header files for the SDK
+ |__ lib/
+ | |__ &lt;platform&gt; Target specific static libraries for the SDK
+ |
+ |__ example/ Sample applications and data
+ |__ compressed_example/ Compressed Member Key Binary data for sample applications
+ |__ test/ Unit test executables (if unit tests built)
+ |__ tools/ Tools</pre> </div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_sign_verify_tutorial.html b/doc/html/_sign_verify_tutorial.html
new file mode 100644
index 0000000..17a212f
--- /dev/null
+++ b/doc/html/_sign_verify_tutorial.html
@@ -0,0 +1,251 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Signing and Verification Tutorial</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_sign_verify_tutorial.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Signing and Verification Tutorial </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#tutorial_signmmsgOverview">Creating an Intel&reg; EPID Signature of a Given Message</a><ul><li class="level2"><a href="#tutorial_signmsgList">What Do You Need to Create a Signature?</a></li>
+<li class="level2"><a href="#tutorial_signmsgExample">Signing Example</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#tutorial_verifysigOverview">Verifying an Intel&reg; EPID Signature</a><ul><li class="level2"><a href="#tutorial_verifyList">What Do You Need to Verify a Signature?</a></li>
+<li class="level2"><a href="#tutorial_verifyExample">Verification Example</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#SignVerifyTutorial_requirements">Parameter Matching Requirements</a><ul><li class="level2"><a href="#SignVerifyTutorial_message">Message</a></li>
+<li class="level2"><a href="#SignVerifyTutorial_hashalg">Hash Algorithm</a></li>
+<li class="level2"><a href="#SignVerifyTutorial_SigRL">Signature Revocation List</a></li>
+<li class="level2"><a href="#SignVerifyTutorial_basenames">Basenames</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#SignVerifyTutorial_Revocation_Group">Revocation</a><ul><li class="level2"><a href="#SignVerifyTutorial_GroupRevocation">Detecting Revoked Group from Group Revocation List</a></li>
+<li class="level2"><a href="#SignVerifyTutorial_KeyRevocation">Detecting Revoked Member from Private Key Based Revocation List</a></li>
+<li class="level2"><a href="#SignVerifyTutorial_SigRevocation">Detecting Revoked Member from Signature Based Revocation List</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><p>The Intel&reg; EPID SDK provides example tools to show you how to use the Intel&reg; EPID SDK APIs. These examples are called <code>signmsg</code> and <code>verifysig</code>.</p>
+<p>These examples use the pre-generated data described in <a class="el" href="_issuer_material.html">Test Data</a>. After you build the SDK, the data is in the <code>_install/epid-sdk/example/data</code> directory. If you don't have genuine issuer material, you can use this data for validation purposes.</p>
+<p>You can follow along with the commands used in this tutorial if you first build these examples using the instructions in <a class="el" href="_building_sdk.html">Building from Source</a>. The tutorial assumes <code>_install/epid-sdk/example</code> is the current directory.</p>
+<p>All command lines in this tutorial use posix command line conventions; for other systems, adjust accordingly.</p>
+<p>For detailed walkthroughs of the code used in <code>signmsg</code> and <code>verifysig</code>, refer to <a class="el" href="_examples.html">Walkthroughs of Examples Showing API Usage</a>.</p>
+<h1><a class="anchor" id="tutorial_signmmsgOverview"></a>
+Creating an Intel® EPID Signature of a Given Message</h1>
+<p>The example application <code>signmsg</code> shows you how to create an Intel&reg; EPID signature of a given message.</p>
+<h2><a class="anchor" id="tutorial_signmsgList"></a>
+What Do You Need to Create a Signature?</h2>
+<p>To generate a signature, you need the following items:</p>
+<ul>
+<li><b>Group public key:</b> You need the group public key to specify which group the member belongs to.</li>
+<li><b>Member private key:</b> You need the member private key so that the member can create a signature that corresponds with the group public key.</li>
+<li><b>Message:</b> You need the message because the member needs something to sign.</li>
+<li><b>Hash algorithm:</b> You need the hash algorithm to encrypt the signature. If you don't specify a hash algorithm, a default hash algorithm is used.</li>
+<li><b>Signature based revocation list (SigRL):</b> You need the SigRL so that the member can create non-revoked proofs for each entry on the list. For more information, see <a class="el" href="_revocation.html">In-Depth Explanation of Revocation</a>.</li>
+<li><b>Member precomputation blob:</b> The precomputation blob is an optional parameter that you can use to improve performance when generating signatures repeatedly with the same member private key.</li>
+<li><b>Basename:</b> A basename is a parameter that is only provided when the member is generating a name based signature. If no basename is specified, a random value is chosen as the basename. For more information, see <a class="el" href="_basenames.html">In-Depth Explanation of Basenames</a>.</li>
+<li><b>Random number generator:</b> You need a cryptographically secure random number generator to ensure that signatures generated by the same member with the same message are different. The SDK provides the <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> function prototype that specifies the interface for your random number generator implementation.</li>
+</ul>
+<h2><a class="anchor" id="tutorial_signmsgExample"></a>
+Signing Example</h2>
+<p>The signmsg command can be passed a number of options: </p><pre class="fragment">$ ./signmsg -h
+Usage: signmsg [OPTION]...
+Verify signature was created by group member in good standing
+
+Options:
+ --sig=FILE write signature to FILE (default: sig.dat)
+ --msg=MESSAGE MESSAGE to sign
+ --msgfile=FILE FILE containing message to sign
+ --bsn=BASENAME BASENAME to sign with (default: random)
+ --bsnfile=FILE FILE containing basename to sign with
+ --sigrl=FILE load signature based revocation list from FILE
+ --gpubkey=FILE load group public key from FILE (default: pubkey.bin)
+ --mprivkey=FILE load member private key from FILE (default: mprivkey.dat)
+ --mprecmpi=FILE load pre-computed member data from FILE
+ --capubkey=FILE load IoT Issuing CA public key from FILE (default: cacert.bin)
+ --hashalg={SHA-256 | SHA-384 | SHA-512 | SHA-512/256} use specified hash algorithm (default: SHA-512)
+ --help display this help and exit
+ -v, --verbose print status messages to stdout
+</pre><p>To sign a message, a group member in good standing uses the following command: </p><pre class="fragment">$ ./signmsg --msg="test0"
+</pre><p>The above command signs a message "test0". <code>signmsg</code> uses default options for the group public key, member private key, hash algorithm and IoT Issuing CA public key. All other parameters that are not given are ignored. The command produces a signature file: <code>sig.dat</code></p>
+<h1><a class="anchor" id="tutorial_verifysigOverview"></a>
+Verifying an Intel® EPID Signature</h1>
+<p>The example application <code>verifysig</code> shows you how to verify that a given Intel&reg; EPID signature is produced by a member in good standing.</p>
+<h2><a class="anchor" id="tutorial_verifyList"></a>
+What Do You Need to Verify a Signature?</h2>
+<p>To verify a signature, you need the following items:</p>
+<ul>
+<li><b>Signature:</b> You need the signature that you want to verify.</li>
+<li><b>CA certificate:</b> You need the CA certificate to verify the authenticity of the issuer material before you use it. Depending on how your issuer protects its data, you may not need a CA certificate. For more information on issuer material, refer to <a class="el" href="_provisioning.html">Preparing a Device</a> and <a class="el" href="_issuer_material.html">Test Data</a>.</li>
+<li><b>Group certificate:</b> The group certificate comes from the issuer and contains the group public key. You need the group public key to determine if the signature came from a member of this group. The group public key corresponds to the member private key used to generate the signature.</li>
+<li><b>Message:</b> In order for verification to succeed, you need to specify the message that was signed.</li>
+<li><b>Hash algorithm:</b> In order for verification to succeed, you need to specify the hash algorithm that was used to sign the message. If you don't specify a hash algorithm, a default hash algorithm is used.</li>
+<li><b>Group based revocation list (GroupRL):</b> You need the GroupRL to ensure the member does not belong to a revoked group. The GroupRL comes from the issuer.</li>
+<li><b>Private key based revocation list (PrivRL):</b> You need the PrivRL to ensure that the member private key has not been revoked. The PrivRL comes from the issuer.</li>
+<li><b>Signature based revocation list (SigRL):</b> You need to compare the SigRL with non-revoked proofs from the member to ensure that the member did not create any revoked signaures. The SigRL comes from the issuer.</li>
+<li><b>Verifier revocation list:</b> The VerRL is optional. The verifier uses the VerRL to ensure that the member did not create any signatures that were revoked by the verifier. You can only use the VerRL if the signature is a name based signature. The VerRL comes from the verifier. For more information, refer to <a class="el" href="_revocation.html">In-Depth Explanation of Revocation</a> and <a class="el" href="_basenames.html">In-Depth Explanation of Basenames</a>.</li>
+<li><b>Verifier precomputation blob:</b> The verifier precomputation blob is optional. You can use the precomputation blob to increase performance when verifying signatures repeatedly with the same group public key.</li>
+<li><b>Basename:</b> A basename is a parameter that is only provided in instances where Intel&reg; EPID uses name based signatures. If a basename is used, the member and verifier have to use the same basename. If a basename is not specified, a random number is chosen as the basename. Because name-based signatures decrease the member's privacy, they must only be used with the knowledge and consent of the member. For more information, refer to <a class="el" href="_basenames.html">In-Depth Explanation of Basenames</a>.</li>
+<li><b>Precomputation blob:</b> You can optionally provide a precomputation blob to greatly speed up <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a>. If you don't use one, the precomputation blob can be stored for use in a future session to verify membership in the same group using <a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392" title="Serializes the pre-computed verifier settings. ">EpidVerifierWritePrecomp</a>.</li>
+</ul>
+<h2><a class="anchor" id="tutorial_verifyExample"></a>
+Verification Example</h2>
+<p>The verifysig command can be passed a number of options: </p><pre class="fragment">$ ./verifysig -h
+Usage: verifysig [OPTION]...
+Create Intel(R) EPID signature of message
+
+Options:
+ --sig=FILE load signature from FILE (default: sig.dat)
+ --msg=MESSAGE MESSAGE that was signed (default: empty)
+ --msgfile=FILE FILE containing message that was signed
+ --bsn=BASENAME BASENAME used in signature (default: random)
+ --bsnfile=FILE FILE containing basename used in signature
+ --privrl=FILE load private key revocation list from FILE
+ --sigrl=FILE load signature based revocation list from FILE
+ --grprl=FILE load group revocation list from FILE (default: grprl.bin)
+ --verifierrl=FILE load verifier revocation list from FILE
+ --gpubkey=FILE load group public key from FILE (default: pubkey.bin)
+ --vprecmpi=FILE load pre-computed verifier data from FILE
+ --vprecmpo=FILE write pre-computed verifier data to FILE
+ --capubkey=FILE load IoT Issuing CA public key from FILE (default: cacert.bin)
+ --hashalg={SHA-256 | SHA-384 | SHA-512 | SHA-512/256} use specified hash algorithm for 2.0 groups (default: SHA-512)
+ --help display this help and exit
+ -v, --verbose print status messages to stdout
+</pre><p>To verify that a signature is from a member in good standing, the verifier uses the following command: </p><pre class="fragment">$ ./verifysig --msg="test0"
+signature verified successfully
+</pre><p>This verifies that the default signature file <code>sig.dat</code> is generated for the message "test0" by a member in good standing. The <code>verifysig</code> example uses default inputs for group public key, hash algorithm, and IoT Issuing CA public key. All other parameters are ignored. The output <code>verifysig: signature verified successfully</code> denotes that the verification is successful.</p>
+<h1><a class="anchor" id="SignVerifyTutorial_requirements"></a>
+Parameter Matching Requirements</h1>
+<p>To successfully create and verify a signature, the member and verifier have to use the same message, hash algorithm, signature revocation list, and basename.</p>
+<p>The signature verification process fails if there is a parameter mismatch between sign and verify operations. The mechanism for avoiding a parameter mismatch is outside the scope of the SDK.</p>
+<h2><a class="anchor" id="SignVerifyTutorial_message"></a>
+Message</h2>
+<p>The member needs the message to generate the signature using the member private key. In order for verification to succeed, the verifier needs to use the same message that the member used.</p>
+<p>This comparison allows the verifier to determine if the signature fulfills the verifier's basic expectations of what a signature from a valid member should look like, given the original message and the group public key.</p>
+<p>Verification fails if the signing and verification operations don't use the same message: </p><pre class="fragment">$ ./signmsg --msg="test0"
+$ ./verifysig --msg="test1"
+verifysig: signature verification failed: invalid signature
+</pre><h2><a class="anchor" id="SignVerifyTutorial_hashalg"></a>
+Hash Algorithm</h2>
+<p>The member needs to encrypt the signature with the hash algorithm. The verifier needs to use the same hash algorithm that the member used.</p>
+<p>If you don't specify a hash algorithm, a default hash algorithm is used.</p>
+<p>The Intel&reg; EPID SDK supports the following hash algorithms: SHA-256, SHA-384, SHA-512.</p>
+<p>Verification fails if the signing and verification operations don't use the same hash algorithm: </p><pre class="fragment">$ ./signmsg --msg="test0" --hashalg=SHA-256
+$ ./verifysig --msg="test0" --hashalg=SHA-384
+verifysig: signature verification failed: invalid signature
+</pre><h2><a class="anchor" id="SignVerifyTutorial_SigRL"></a>
+Signature Revocation List</h2>
+<p>The member needs the signature based revocation list (SigRL) to create non-revoked proofs for each entry on the SigRL. The verifier needs to use the same SigRL to check the proofs.</p>
+<p>Verification fails if the signing and verification operations don't use the same SigRL. </p><pre class="fragment">$ ./signmsg --msg="test0" --sigrl=data\groupa\sigrl.bin
+$ ./verifysig --msg="test0" --sigrl=sigrl.bin
+verifysig: signature verification failed: bad arguments
+</pre><h2><a class="anchor" id="SignVerifyTutorial_basenames"></a>
+Basenames</h2>
+<p>For a verifier to be able to know that multiple signatures were generated by the same member, the verifier has to use the same basename that the member used for each name based signature. For more information, refer to <a class="el" href="_basenames.html">In-Depth Explanation of Basenames</a>.</p>
+<p>If a basename is not provided to the member, then the member uses a random basename and the signature generated by the member is anonymous.</p>
+<p>If a basename is not provided to the verifier, then the verifier does not check for a basename and it will verify the signature successfully without linking it to other signatures.</p>
+<p>To sign message "test0" with a basename "base0": </p><pre class="fragment">$ ./signmsg --msg="test0" --bsn="base0"
+</pre><p>To verify the signature: </p><pre class="fragment">$ ./verifysig --msg="test0" --bsn="base0"
+verifysig: signature verified successfully
+</pre><p>Verification fails if the signing and verification operations use different basenames: </p><pre class="fragment">$ ./signmsg --msg="test0" --bsn="base0"
+$ ./verifysig --msg="test0" --bsn="base1"
+verifysig: signature verification failed: invalid signature
+</pre><dl class="section warning"><dt>Warning</dt><dd>The use of a name-based signature creates a platform unique pseudonymous identifier. Because it reduces the member's privacy, the user should be notified when it is used and should have control over its use.</dd></dl>
+<h1><a class="anchor" id="SignVerifyTutorial_Revocation_Group"></a>
+Revocation</h1>
+<p>Revocation lists are data structures used by the verifier to identify members that are no longer approved members of the group.</p>
+<p>The verifier obtains the member private key based revocation list (PrivRL), signature based revocation list (SigRL), and group based revocation list (GroupRL) from the issuer. The verifier can also maintain its own verifier blacklist (VerifierRL).</p>
+<h2><a class="anchor" id="SignVerifyTutorial_GroupRevocation"></a>
+Detecting Revoked Group from Group Revocation List</h2>
+<p>Verification of a signature fails if it is generated by a member of a group that is revoked in the group revocation list.</p>
+<p>For example, </p><pre class="fragment">$ ./signmsg --msg="test0" --gpubkey=data/groupb/pubkey.bin --mprivkey=data/groupb/member0/mprivkey.dat
+$ ./verifysig --msg="test0" --grprl=data/grprl.bin --gpubkey=data/groupb/pubkey.bin
+verifysig: signature verification failed: signature revoked in GroupRl
+</pre><p>The verification fails because <b>groupb</b> is revoked and is an entry in the group revocation list (<code>grprl.bin</code>).</p>
+<h2><a class="anchor" id="SignVerifyTutorial_KeyRevocation"></a>
+Detecting Revoked Member from Private Key Based Revocation List</h2>
+<p>Verification of a signature fails if it is generated by a member whose private key is revoked in a private-key based revocation list.</p>
+<p>For example, </p><pre class="fragment">$ ./signmsg --msg=test0 --gpubkey=data/groupa/pubkey.bin --mprivkey=data/groupa/privrevokedmember0/mprivkey.dat
+$ ./verifysig --msg=test0 --privrl=data/groupa/privrl.bin --gpubkey=data/groupa/pubkey.bin
+verifysig: signature verification failed: signature revoked in PrivRl
+</pre><p>The verification fails because the private key of <b>privrevokedmember0</b> is revoked and is an entry in the private key based revocation list of <b>groupa</b> (<code>privrl.bin</code>).</p>
+<h2><a class="anchor" id="SignVerifyTutorial_SigRevocation"></a>
+Detecting Revoked Member from Signature Based Revocation List</h2>
+<p>Verification of a signature fails if it is generated by a member whose signature is revoked in a signature based revocation list. </p><pre class="fragment">$ ./signmsg --msg="test1" --sigrl=data/groupa/sigrl.bin --gpubkey=data/groupa/pubkey.bin --mprivkey=data/groupa/sigrevokedmember0/mprivkey.dat
+signmsg: signature revoked in SigRL
+$ ./verifysig --msg="test1" --sigrl=data/groupa/sigrl.bin --gpubkey=data/groupa/pubkey.bin
+verifysig: signature verification failed: signature revoked in SigRl
+</pre><p>The message "test1" is signed by <em>signmsg</em> with a warning <code>signmsg: signature revoked in SigRL</code>. This means that the signature of <b>sigrevokedmember0</b> is revoked in the signature based revocation list. The verification fails because the signature was generated by <b>sigrevokedmember0</b>, which is revoked and is an entry in the signature based revocation list of <b>groupa</b> (<code>sigrl.bin</code>). </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_tpm_considerations.html b/doc/html/_tpm_considerations.html
new file mode 100644
index 0000000..57ef50c
--- /dev/null
+++ b/doc/html/_tpm_considerations.html
@@ -0,0 +1,230 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Considerations for TPM</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_tpm_considerations.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Considerations for TPM </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#TPM_compatibility">Compatibility</a></li>
+<li class="level1"><a href="#TpmConsiderations_Manufacturers">Considerations for TPM Manufacturers</a><ul><li class="level2"><a href="#TPM_provisioning">Provisioning TPM with Intel&reg; EPID Key Material</a></li>
+<li class="level2"><a href="#TpmConsiderations_Mapping">Mapping TPM Commands to Intel&reg; EPID</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#TpmConsiderations_Applications">Considerations for TPM Applications</a></li>
+<li class="level1"><a href="#TpmConsiderations_Architecture">SDK Member Architecture</a></li>
+<li class="level1"><a href="#TpmConsiderations_Building">Building the SDK to Take Advantage of TPM</a><ul><li class="level2"><a href="#TpmConsiderations_Prereqs">Prerequisites to Build the SDK in TPM Mode</a></li>
+<li class="level2"><a href="#TpmConsiderations_BuildingTpmMode">Building the SDK in TPM Mode</a></li>
+<li class="level2"><a href="#TpmConsiderations_Signing">Intel&reg; EPID Signing and Verification with a TPM</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><p>Intel&reg; EPID is compatible with TPM (Trusted Platform Modules) and is designed to take advantage of the security features of TPM. This section describes integrating a TPM device and Intel&reg; EPID functionality.</p>
+<p>Intel&reg; EPID is a technology for securely and anonymously identifying a device, and TPM is a technology for protecting secrets on a device. Therefore it is desirable to protect the most secret part of the member private key on an Intel&reg; EPID TPM device.</p>
+<h1><a class="anchor" id="TPM_compatibility"></a>
+Compatibility</h1>
+<p>The SDK is compatible with the Trusted Computing Group's TPM 2.0 spec. The most recent version of the TPM 2.0 specification (Level 00, Revision 01.38) includes the use of a nonce, which is incompatible with the current version of the Intel&reg; EPID scheme. Therefore, this implementation of Intel&reg; EPID APIs is compatible with an earlier version, which is the TPM 2.0 specification Level 00, Revision 1.16.</p>
+<h1><a class="anchor" id="TpmConsiderations_Manufacturers"></a>
+Considerations for TPM Manufacturers</h1>
+<p>This section explains what manufacturers have to do with the SDK in order to have their TPMs recognized to a service provider:</p>
+<ul>
+<li>Provisioning TPM devices with crypto secrets</li>
+<li>Adapting SDK code to specific TSS functionality</li>
+</ul>
+<p>This SDK was tested on the IBM TPM and TSS (Trusted Computing Group Software Stack). Device manufacturers should replace specific items with their own TPM functionality.</p>
+<h2><a class="anchor" id="TPM_provisioning"></a>
+Provisioning TPM with Intel® EPID Key Material</h2>
+<p>For TPM use with Intel&reg; EPID, members and verifiers need to be provisioned with crypto material to enable security function.</p>
+<p>In order to ensure that the <code>f</code> value only exists in the volatile memory of the TPM, TPM manufacturers need to provision the TPM with an EPS (Endorsement Primary Seed), from which the <code>f</code> value of the member private key is derived.</p>
+<p>Typically, bulk provisioning is more efficient than dynamic provisioning in a manufacturing environment. However, bulk provisioning is not viable for TPM devices for the following reasons:</p>
+<ul>
+<li>In bulk provisioning, the issuer provides <code>f</code> as part of each member private key, but it is intentionally difficult to derive EPS from <code>f</code>.</li>
+<li>The issuer cannot provide EPS to manufacturers because the translation from EPS to <code>f</code> is dependent upon an implementation specific, deterministic random number generator.</li>
+</ul>
+<p>Therefore, in order to provision the TPM with EPS, Intel supports a variation on typical <a class="el" href="_provisioning.html#Provisioning_JoinProvisioning">dynamic provisioning</a> in which manufacturers provide their own EPS.</p>
+<p>In this variation on dynamic provisioning, which we call <b>bulk-join</b>, some steps are performed in bulk and credentials for many devices can be generated at the same time. This process allows TPM devices to be provisioned during manufacturing.</p>
+<p>For bulk-join, TPM device manufacturers need to do the following:</p>
+<ol type="1">
+<li><b>Generate a set of EPS</b>, because EPS are the seeds from which the <code>f</code> values of the member private keys are generated.</li>
+<li><b>Derive a set of <code>f</code> values</b> from the EPS values.</li>
+<li><b>Request a set of nonces from the issuer</b> which will be used to generate join requests.</li>
+<li><b>Generate a set of join requests</b> using the <code>f</code> values and nonces and send them to the issuer. The issuer will respond to the bulk join requests by sending membership credentials to the manufacturer in bulk.</li>
+<li><b>Provision the membership credentials in silicon,</b> mapping each membership credential to the corresponding EPS value.</li>
+</ol>
+<p>The following graphic shows how the issuer, manufacturer, TPM, and member interact during the time of key generation, device manufacturing, and signing:</p>
+<div class="image">
+<img src="uml_sequence.png" alt="uml_sequence.png"/>
+</div>
+<h2><a class="anchor" id="TpmConsiderations_Mapping"></a>
+Mapping TPM Commands to Intel® EPID</h2>
+<p>APIs</p>
+<p>The <code>tpm2</code> module in the <code>member</code> section of the API reference contains internal functions that map to TPM commands. This code is provided as sample code for manufacturers who will use it to write their own implementation of Intel&reg; EPID APIs for TPM.</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Intel&reg; EPID Function </th><th class="markdownTableHeadNone">Corresponding TPM 2.0 Command </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Tpm2Commit </td><td class="markdownTableBodyNone">TPM2_Commit </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Tpm2CreateContext </td><td class="markdownTableBodyNone">N/A </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Tpm2DeleteContext </td><td class="markdownTableBodyNone">N/A </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Tpm2GetRandom </td><td class="markdownTableBodyNone">TPM2_GetRandom </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Tpm2LoadExternal </td><td class="markdownTableBodyNone">TPM2_LoadExternal </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Tpm2NvDefineSpace </td><td class="markdownTableBodyNone">TPM2_NV_DefineSpace </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Tpm2NvUndefineSpace </td><td class="markdownTableBodyNone">TPM2_NV_UndefineSpace </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Tpm2NvWrite </td><td class="markdownTableBodyNone">TPM2_NV_Write </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">Tpm2NvRead </td><td class="markdownTableBodyNone">TPM2_NV_Read </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone">Tpm2Sign </td><td class="markdownTableBodyNone">TPM2_Sign </td></tr>
+</table>
+<h1><a class="anchor" id="TpmConsiderations_Applications"></a>
+Considerations for TPM Applications</h1>
+<p>Unlike non-TPM device manufacturers, TPM manufacturers cannot use <a class="el" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302" title="Provisions a member context from a private key. ">EpidProvisionKey</a>. TPMs are designed to protect secret values from access even by the programs that use them. Dynamic provisioning is specifically designed to allow this use case.</p>
+<p>To get a TPM device running, TPM applications can use the following steps to join a group using a TPM protected secret:</p>
+<ol type="1">
+<li>Use <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> and <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> to create a new member context. Those functions take the parameter <a class="el" href="struct_member_params.html" title="Software only specific member parameters. ">MemberParams</a>. You will pass NULL to this struct instead of the <code>f</code> value, which indicates that <code>f</code> needs to be derived from the EPS within the TPM.</li>
+<li>Use <a class="el" href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3" title="Creates a request to join a group. ">EpidCreateJoinRequest</a> to generate join requests using the <code>f</code> derived from EPS within the TPM. Then send the join request to the issuer to request a membership credential.</li>
+<li>After receiving the membership credential (A, x), use <a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140" title="Provisions a member context from a membership credential. ">EpidProvisionCredential</a> to provision it into the non-volatile memory of the TPM device.</li>
+</ol>
+<p>After the TPM device is provisioned with <a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140" title="Provisions a member context from a membership credential. ">EpidProvisionCredential</a>, the simplest way to get the device running is:</p>
+<ol type="1">
+<li><a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a>,</li>
+<li><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>,</li>
+<li><a class="el" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6" title="Change member from setup state to normal operation. ">EpidMemberStartup</a>, and</li>
+<li><a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f" title="Writes an Intel(R) EPID signature. ">EpidSign</a>.</li>
+</ol>
+<h1><a class="anchor" id="TpmConsiderations_Architecture"></a>
+SDK Member Architecture</h1>
+<p>In the SDK, the Tpm2 module exposes commands that can be mapped to real TSS commands.</p>
+<div class="image">
+<img src="member_host.png" alt="member_host.png"/>
+</div>
+<p>The <b>Member Host</b> (<code>member/src</code>) implements Intel&reg; EPID signing in terms of TPM2 commands.</p>
+<p>The <b>TPM module</b> (<code>member/tpm2</code>) implements TPM2 commands.</p>
+<p>There are two implementations of TPM functionality:</p>
+<ul>
+<li><b>BM TSS dispatcher implementation</b> (<code>member/tpm2/ibm_tss</code>), which calls the IBM TSS, which calls the IBM TPM simulator (in this implementation). It is invoked when building in TPM mode.</li>
+<li><b>TPM SDK software implementation</b> (<code>member/tpm2/src</code>) implements sufficient TPM functionality for Intel&reg; EPID. It is invoked when building in non-TPM mode.</li>
+</ul>
+<h1><a class="anchor" id="TpmConsiderations_Building"></a>
+Building the SDK to Take Advantage of TPM</h1>
+<p>This section describes:</p>
+<ul>
+<li>Prerequisites to building the SDK to take advantage of TPM</li>
+<li>Building the SDK in TPM mode</li>
+<li>Running signing and verification operations with TPM</li>
+</ul>
+<h2><a class="anchor" id="TpmConsiderations_Prereqs"></a>
+Prerequisites to Build the SDK in TPM Mode</h2>
+<ol type="1">
+<li>Download <a href="https://sourceforge.net/projects/ibmtpm20tss/files/?source=navbar">IBM TSS</a> version <a href="https://sourceforge.net/projects/ibmtpm20tss/files/ibmtss996.tar.gz/download">966</a>. (The SDK was tested on version 966. Newer versions may also work, but we do not guarantee it.)</li>
+<li>Download <a href="https://sourceforge.net/projects/ibmswtpm2/files/?source=navbar">IBM TPM</a> version <a href="https://sourceforge.net/projects/ibmswtpm2/files/ibmtpm532.tar/download">532</a>. (The SDK was tested on version 532 and does not work on newer versions.)</li>
+<li>Build the IBM TSS in accordance with the build steps from the package. Copy <code>tss.lib</code> and <code>tss.dll</code> from <code>ibmtss\tpmutils\Release</code> to <code>ibmtss\utils</code>.</li>
+</ol>
+<h2><a class="anchor" id="TpmConsiderations_BuildingTpmMode"></a>
+Building the SDK in TPM Mode</h2>
+<p>Set the TSSROOT environment variable to the <code>..\ibmtss\utils\</code> folder. Make sure this folder contains the <code>\tss2</code> folder, <code>tss.lib</code> and <code>tss.dll</code>. Example of the command for Windows: </p><pre class="fragment">&gt; set TSSROOT=C:\ibmtss\utils\
+</pre><p>To build the SDK in TPM mode, go to the SDK folder and build the SDK with the following command: </p><pre class="fragment">&gt; scons --target=x86 --use-tss
+</pre><p><br />
+</p>
+<p>To build the SDK in TPM mode using <code>make</code> command, go to the SDK folder and build the SDK with the following commands: </p><pre class="fragment">&gt; ./configure CFLAGS=-m32 --with-tss
+&gt; make all
+&gt; make utest
+&gt; make install
+</pre><p>Because the IBM TSS only supports x86 targets, you must build in x86.</p>
+<h2><a class="anchor" id="TpmConsiderations_Signing"></a>
+Intel® EPID Signing and Verification with a TPM</h2>
+<ol type="1">
+<li>Build the IBM TSS (see above).</li>
+<li>Build the IBM TPM (see above).</li>
+<li>Build the Intel&reg; EPID SDK with <code>--target=86 --use-tss</code> (see above).</li>
+<li>Copy <code>tss.dll</code> from <code>_install/epid-sdk/test</code> to <code>_install/epid-sdk/example</code>.</li>
+<li>Go to the <code>ibmtpm</code> folder and run the <code>tpm_server</code> executable. Note: if you built the TPM server with the MS Visual Studio debug mode, go to the <code>..\ibmtpm\tpmvstudio\tpm_server\Debug\</code> folder.</li>
+<li>You need to run both the TPM server and the <code>powerup</code> and <code>startup</code> executables on IBM TSS. Go to <code>..\ibmtss\tpmutils\Debug\</code> or <code>..\ibmtss\tpmutils\Release\</code> and run <code>powerup</code> and <code>startup</code> executables.</li>
+</ol>
+<p>Then you can run:</p>
+<pre class="fragment">&gt; signmsg --hashalg=SHA-256 --msg="test"
+</pre><dl class="section note"><dt>Note</dt><dd>In TPM mode samples have to be used with <code>--hashalg=SHA-256</code>.</dd></dl>
+<p>If signing succeeds, nothing is returned.</p>
+<p>Then run:</p>
+<pre class="fragment">&gt; verifysig --hashalg=SHA-256 --msg="test"
+-signature verified successfully
+</pre><dl class="section warning"><dt>Warning</dt><dd>The samples use <code>LoadExternal</code> to load keys into the TPM. In a real TPM use case, <code>CreatePrimary</code> should be used, and the SDK implementation provides functions for this use case. </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_user_manual__generating_an_intel_epid_signature.html b/doc/html/_user_manual__generating_an_intel_epid_signature.html
new file mode 100644
index 0000000..60118ba
--- /dev/null
+++ b/doc/html/_user_manual__generating_an_intel_epid_signature.html
@@ -0,0 +1,188 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Generating an Intel&reg; EPID Signature</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_user_manual__generating_an_intel_epid_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Generating an Intel&reg; EPID Signature </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This walkthrough of the <code>signmsg</code> example shows you how to use SDK APIs to generate an Intel&reg; EPID signature. <code>signmsg</code> is built during the <a class="el" href="_building_sdk.html">SDK build</a>.</p>
+<h1><a class="anchor" id="signmsgWalktrhu_overview"></a>
+Summary</h1>
+<p>In the code example below, we take this approach:</p>
+<ul>
+<li>Extract and authenticate issuer provided material</li>
+<li>Create the member context to allow us to call other member APIs</li>
+<li>Generate the signature</li>
+<li>Clean up</li>
+</ul>
+<h1><a class="anchor" id="signmsgWalkthru_"></a>
+Signmsg Walkthrough</h1>
+<p><br />
+</p>
+<p>First, we include headers so we have access to needed declarations.</p>
+<p><div class="fragment"><div class="line"><span class="preprocessor">#include &quot;src/signmsg.h&quot;</span></div><div class="line"><span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;string.h&gt;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="file__parser_8h.html">epid/common/file_parser.h</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="member_2api_8h.html">epid/member/api.h</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;src/prng.h&quot;</span></div></div><!-- fragment --></p>
+<p>The <code>prng.h</code> header provides access to a pseudo-random number generator needed for signing, while the utility headers are used by <code>signmsg</code> for logging and buffer management. The <code><a class="el" href="member_2api_8h.html" title="Intel(R) EPID SDK member API. ">epid/member/api.h</a></code> header provides access to the core member APIs. The <code><a class="el" href="file__parser_8h.html" title="Intel(R) EPID issuer material parsing utilities. ">epid/common/file_parser.h</a></code> header provides an API for parsing buffers formatted according to the various IoT Intel&reg; EPID binary file formats. The <code><a class="el" href="software__member_8h.html" title="Member creation parameters for software only implementation. ">epid/member/software_member.h</a></code> provides an implementation specific definition of <a class="el" href="struct_member_params.html" title="Software only specific member parameters. ">MemberParams</a>. The specific definition of <a class="el" href="struct_member_params.html" title="Software only specific member parameters. ">MemberParams</a> may differ dramatically between implementations.</p>
+<p><br />
+</p>
+<p>We define a stub function responsible for checking that the CA certificate is authorized by the root CA.</p>
+<p>In <code>main.c</code>, we define a stub function, IsCaCertAuthorizedByRootCa, which is responsible for checking that the CA certificate is authorized by the root CA. Before calling <code>signmsg</code>, we call this function, IsCaCertAuthorizedByRootCa. In an actual implementation, you need to provide an implementation to validate the issuing CA certificate with the CA root certificate before using it in parse functions.</p>
+<p><br />
+</p>
+<p>The core signing functionality is contained in <code>SignMsg</code>.</p>
+<p><div class="fragment"><div class="line"><a class="code" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> SignMsg(<span class="keywordtype">void</span> <span class="keyword">const</span>* msg, <span class="keywordtype">size_t</span> msg_len, <span class="keywordtype">void</span> <span class="keyword">const</span>* basename,</div><div class="line"> <span class="keywordtype">size_t</span> basename_len, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* signed_sig_rl,</div><div class="line"> <span class="keywordtype">size_t</span> signed_sig_rl_size,</div><div class="line"> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* signed_pubkey,</div><div class="line"> <span class="keywordtype">size_t</span> signed_pubkey_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* priv_key_ptr,</div><div class="line"> <span class="keywordtype">size_t</span> privkey_size, <a class="code" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg,</div><div class="line"> <a class="code" href="struct_member_precomp.html">MemberPrecomp</a>* member_precomp, <a class="code" href="struct_epid_signature.html">EpidSignature</a>** sig,</div><div class="line"> <span class="keywordtype">size_t</span>* sig_len, <a class="code" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> <span class="keyword">const</span>* cacert) {</div></div><!-- fragment --></p>
+<p>The <code>SignMsg</code> parameters are either received by the member, or they are part of the member's configuration. The exceptions are the <code>sig</code> and <code>sig_len</code> parameters, which are used to output the signature.</p>
+<p>The verifier might send the message to the member or there may be another mechanism to choose the message, but the way the message is communicated is outside the scope of the Intel&reg; EPID scheme.</p>
+<p>We use the parameters <code>member_precomp</code> to pass in a pre-computation blob if provided. We can use the pre-computation blob to increase performance when verifying signatures repeatedly with the same group public key.</p>
+<p>The member knows the group public key and the member private key.</p>
+<p>The member and the verifier agree on the message, basename, hash algorithm, and SigRL that the member uses for signing.</p>
+<p><br />
+</p>
+<p>Next we do basic variable setup and argument checking.</p>
+<p><div class="fragment"><div class="line"> <a class="code" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">kEpidErr</a>;</div><div class="line"> <span class="keywordtype">void</span>* prng = NULL;</div><div class="line"> <a class="code" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a>* member = NULL;</div><div class="line"> <a class="code" href="struct_sig_rl.html">SigRl</a>* sig_rl = NULL;</div><div class="line"></div><div class="line"> <span class="keywordflow">do</span> {</div><div class="line"> <a class="code" href="struct_group_pub_key.html">GroupPubKey</a> pub_key = {0};</div><div class="line"> <a class="code" href="struct_priv_key.html">PrivKey</a> priv_key = {0};</div><div class="line"> <a class="code" href="struct_membership_credential.html">MembershipCredential</a> member_credential = {0};</div><div class="line"> <span class="keywordtype">size_t</span> sig_rl_size = 0;</div><div class="line"> <a class="code" href="struct_member_params.html">MemberParams</a> params = {0};</div><div class="line"> <span class="keywordtype">size_t</span> member_size = 0;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!sig) {</div><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">kEpidBadArgErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>We create pointers to resources to be allocated and use the <code>do {} while(0)</code> idiom so that we can reliably free resources on return from <code>SignMsg</code>.</p>
+<p>We create variables on the stack to hold the group public key and member private key.</p>
+<p>Finally we check to make sure that <code>sig</code> is a vaild pointer.</p>
+<p><br />
+</p>
+<p>Next, if group public key is passed we authenticate and extract the group public key using <a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb" title="Extracts group public key from buffer in issuer binary format. ">EpidParseGroupPubKeyFile</a>.</p>
+<p><div class="fragment"><div class="line"> sts = <a class="code" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">EpidParseGroupPubKeyFile</a>(signed_pubkey, signed_pubkey_size, cacert,</div><div class="line"> &amp;pub_key);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p><a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb" title="Extracts group public key from buffer in issuer binary format. ">EpidParseGroupPubKeyFile</a> takes a buffer containing a group public key in issuer binary format and validates that the public key is signed by the private key that corresponds to the provided CA certificate, extracting the key in the process.</p>
+<p><br />
+</p>
+<p>Next, if member private key is passed we fill the member private key.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_priv_key.html">PrivKey</a>)) {</div><div class="line"> priv_key = *(<a class="code" href="struct_priv_key.html">PrivKey</a>*)priv_key_ptr;</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_compressed_priv_key.html">CompressedPrivKey</a>)) {</div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">EpidDecompressPrivKey</a>(&amp;pub_key, (<a class="code" href="struct_compressed_priv_key.html">CompressedPrivKey</a>*)priv_key_ptr,</div><div class="line"> &amp;priv_key);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_membership_credential.html">MembershipCredential</a>)) {</div><div class="line"> member_credential = *(<a class="code" href="struct_membership_credential.html">MembershipCredential</a>*)priv_key_ptr;</div><div class="line"> } <span class="keywordflow">else</span> {</div><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">kEpidErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> } <span class="comment">// if (privkey_size == sizeof(PrivKey))</span></div></div><!-- fragment --></p>
+<p>If the member private key is compressed, then we decompress it using <a class="el" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef" title="Decompresses compressed member private key. ">EpidDecompressPrivKey</a> before it can be passed to the member APIs. To determine if the member private key is compressed, we check if it is the known size of a compressed key.</p>
+<p>If the member private key contains just public part, then we fill it as membership credential. To check if the member private key is complete or contains only the membership credential, we check if it is the known size of the member private key without the secret <code>f</code> value.</p>
+<p>If the key size is not the size of a known format, we return an error.</p>
+<p><br />
+</p>
+<p>Next, we create a pseudo-random number generator.</p>
+<p><div class="fragment"><div class="line"> sts = PrngCreate(&amp;prng);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<dl class="section warning"><dt>Warning</dt><dd>This pseudo-random number generator is included only for demonstration, and should not be used in production code as a source of secure random data. For security, <code>prng</code> should be a cryptographically secure random number generator.</dd></dl>
+<p><br />
+</p>
+<p>Now that the inputs have been prepared, we create a member context using <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> and <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>.</p>
+<p><div class="fragment"><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">EpidMemberGetSize</a>(&amp;params, &amp;member_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> member = (<a class="code" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a>*)calloc(1, member_size);</div><div class="line"> <span class="keywordflow">if</span> (!member) {</div><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c">kEpidNoMemErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">EpidMemberInit</a>(&amp;params, member);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>Then we set the hash algorithm to be used by the member using <a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf" title="Sets the hash algorithm to be used by a member. ">EpidMemberSetHashAlg</a>.</p>
+<p><div class="fragment"><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">EpidMemberSetHashAlg</a>(member, hash_alg);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>After the hash algorithm is set, future calls to <code>EpidSign</code> will use the same algorithm.</p>
+<p><br />
+</p>
+<p>If a pre-computation blob is provided to the top level application, we use it. Otherwise, we pass in <code>NULL</code>.</p>
+<p><br />
+</p>
+<p>Next we provision either the member private key or the membership credential based on the passed member private key.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_priv_key.html">PrivKey</a>) ||</div><div class="line"> privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_compressed_priv_key.html">CompressedPrivKey</a>)) {</div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">EpidProvisionKey</a>(member, &amp;pub_key, &amp;priv_key, member_precomp);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (privkey_size == <span class="keyword">sizeof</span>(<a class="code" href="struct_membership_credential.html">MembershipCredential</a>)) {</div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">EpidProvisionCredential</a>(member, &amp;pub_key, &amp;member_credential,</div><div class="line"> member_precomp);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="comment">// if (privkey_size == sizeof(PrivKey))</span></div></div><!-- fragment --></p>
+<p>If neither is passed, we provision nothing.</p>
+<p><br />
+</p>
+<p>Now we load provisioned membership credential and initialize context.</p>
+<p><div class="fragment"><div class="line"> sts = <a class="code" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">EpidMemberStartup</a>(member);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p><br />
+</p>
+<p>Next, if a basename is specified, we register it with <a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220" title="Registers a basename with a member. ">EpidRegisterBasename</a> so that the member can use it.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (0 != basename_len) {</div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">EpidRegisterBasename</a>(member, basename, basename_len);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>In a typical use case, to prevent loss of privacy, the member keeps a list of basenames that correspond to authorized verifiers. The member signs a message with a basename only if the basename is in the member's basename list.</p>
+<dl class="section warning"><dt>Warning</dt><dd>The use of a name-based signature creates a platform unique pseudonymous identifier. Because it reduces the member's privacy, the user should be notified when it is used and should have control over its use.</dd></dl>
+<p><br />
+</p>
+<p>We authenticate and extract the signed SigRL using <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (signed_sig_rl) {</div><div class="line"> <span class="comment">// authenticate and determine space needed for SigRl</span></div><div class="line"> sts = <a class="code" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a>(signed_sig_rl, signed_sig_rl_size, cacert, NULL,</div><div class="line"> &amp;sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">kEpidSigInvalid</a> == sts) {</div><div class="line"> <span class="comment">// authentication failure</span></div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> sig_rl = calloc(1, sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (!sig_rl) {</div><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fill the SigRl</span></div><div class="line"> sts = <a class="code" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a>(signed_sig_rl, signed_sig_rl_size, cacert,</div><div class="line"> sig_rl, &amp;sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">kEpidSigInvalid</a> == sts) {</div><div class="line"> <span class="comment">// authentication failure</span></div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> sts = <a class="code" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">EpidMemberSetSigRl</a>(member, sig_rl, sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="comment">// if (signed_sig_rl)</span></div></div><!-- fragment --></p>
+<p>We use <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a> to:</p>
+<ul>
+<li>extract the signature based revocation list</li>
+<li>validate that the revocation list was signed by the private key corresponding to the provided CA certificate</li>
+<li>validate that the size of the input buffer is correct</li>
+<li>determine the required size of the revocation list output buffer</li>
+</ul>
+<p>To determine the required <code>sig_rl</code> output buffer size, we provide a null pointer for the output buffer when calling <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a>. This updates <code>sig_rl_size</code> with the required size of the output buffer.</p>
+<p>After we find out the required size of the <code>sig_rl</code>, we allocate a buffer for the <code>sig_rl</code>. Then we fill the buffer using <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a>.</p>
+<p>After we extracted the signature based revocation list we should assign it to the member context using <a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4" title="Sets the signature based revocation list to be used by a member. ">EpidMemberSetSigRl</a>.</p>
+<p><br />
+</p>
+<p>Next, we sign the message, generating an Intel&reg; EPID signature.</p>
+<p><div class="fragment"><div class="line"> *sig_len = <a class="code" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">EpidGetSigSize</a>(sig_rl);</div><div class="line"></div><div class="line"> *sig = calloc(1, *sig_len);</div><div class="line"> <span class="keywordflow">if</span> (!*sig) {</div><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// sign message</span></div><div class="line"> sts =</div><div class="line"> <a class="code" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">EpidSign</a>(member, msg, msg_len, basename, basename_len, *sig, *sig_len);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != sts) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>To create a signature, first we find out the required size of the signature using <a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000" title="Computes the size in bytes required for an Intel(R) EPID signature. ">EpidGetSigSize</a>. Then we allocate a buffer for the signature and fill the buffer using <a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f" title="Writes an Intel(R) EPID signature. ">EpidSign</a>.</p>
+<p>It is important to compute signature size after loading <code>sig_rl</code> because the signature size varies with the size of the SigRL.</p>
+<p><br />
+</p>
+<p>Finally, we clean up and exit.</p>
+<p><div class="fragment"><div class="line"> sts = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a>;</div><div class="line"> } <span class="keywordflow">while</span> (0);</div><div class="line"></div><div class="line"> PrngDelete(&amp;prng);</div><div class="line"> <a class="code" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">EpidMemberDeinit</a>(member);</div><div class="line"> <span class="keywordflow">if</span> (member) free(member);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (sig_rl) free(sig_rl);</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> sts;</div><div class="line">}</div></div><!-- fragment --></p>
+<p>If we made it past signing without an error, we set the return code appropriately and fall out of the do-while loop. If there was an error earlier, all breaks in the do-while loop bring us to this point with an error status.</p>
+<p>Next, we de-initialize the member context and free the allocated resources. <a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d" title="De-initializes an existing member context buffer. ">EpidMemberDeinit</a> de-initializes an existing member context.</p>
+<p>We return from SignMsg with the success or error status.</p>
+<p><br />
+</p>
+<p>This concludes the <code>signmsg</code> walkthrough. Now you should be able to generate an Intel&reg; EPID signature that proves a member's group membership to a verifier without revealing the member's identity.</p>
+<p>To learn more about the SDK APIs see the <a href="modules.html"><b>API Reference</b></a>. To learn more about the Intel&reg; EPID scheme see <a class="el" href="_epid_overview.html">Introduction to the Intel&reg; EPID Scheme</a> in the documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_user_manual__verifying_an_intel_epid_signature.html b/doc/html/_user_manual__verifying_an_intel_epid_signature.html
new file mode 100644
index 0000000..e718e59
--- /dev/null
+++ b/doc/html/_user_manual__verifying_an_intel_epid_signature.html
@@ -0,0 +1,205 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Verifying an Intel&reg; EPID Signature</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_user_manual__verifying_an_intel_epid_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Verifying an Intel&reg; EPID Signature </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This walkthrough of the <code>verifysig</code> example shows you how to use SDK APIs to verify an Intel&reg; EPID 2.0 signature. <code>verifysig</code> is built during the <a class="el" href="_building_sdk.html">SDK build</a>.</p>
+<p>To verify an Intel&reg; EPID 1.1 signature see the example code in <code>verifysig11.c</code>. For information on Intel&reg; EPID 1.1 specific APIs see <a href="group___epid11_verifier_module.html"><b>Intel&reg; EPID 1.1 support</b></a>.</p>
+<p><br />
+</p>
+<h1><a class="anchor" id="verifysigWalktrhu_overview"></a>
+Summary</h1>
+<p>In the code example below, we take this approach:</p>
+<ul>
+<li>Extract and authenticate issuer provided material</li>
+<li>Create the verifier context to allow us to call other verifier APIs</li>
+<li>Verify signature</li>
+<li>Clean up</li>
+</ul>
+<p><br />
+</p>
+<h1><a class="anchor" id="verifysigWalkthrough_main"></a>
+Verifysig Walkthrough</h1>
+<p>First, we include headers so we have access to needed declarations.</p>
+<p><div class="fragment"><div class="line"><span class="preprocessor">#include &quot;src/verifysig.h&quot;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="file__parser_8h.html">epid/common/file_parser.h</a>&quot;</span></div></div><!-- fragment --></p>
+<p>The utility headers are used by <code>verifysig</code> for logging and buffer management. The <code><a class="el" href="verifier_2api_8h.html" title="Intel(R) EPID SDK verifier API. ">epid/verifier/api.h</a></code> header provides access to the core verifier APIs, and the <code><a class="el" href="file__parser_8h.html" title="Intel(R) EPID issuer material parsing utilities. ">epid/common/file_parser.h</a></code> header provides an API for parsing buffers formatted according to the various IoT Intel&reg; EPID binary file formats.</p>
+<p><br />
+</p>
+<p>In <code>main.c</code>, we define a stub function, IsCaCertAuthorizedByRootCa, which is responsible for checking that the CA certificate is authorized by the root CA. Before calling <code>verify</code>, we call this function, IsCaCertAuthorizedByRootCa. In an actual implementation, you need to provide an implementation to validate the issuing CA certificate with the CA root certificate before using it in parse functions.</p>
+<p><br />
+</p>
+<p>We use <code>Verify</code> to verify an Intel&reg; EPID signature. <code>Verify</code> is a wrapper function that isolates SDK API functionality for the purpose of this walkthrough.</p>
+<p><div class="fragment"><div class="line"><a class="code" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Verify(<a class="code" href="struct_epid_signature.html">EpidSignature</a> <span class="keyword">const</span>* sig, <span class="keywordtype">size_t</span> sig_len, <span class="keywordtype">void</span> <span class="keyword">const</span>* msg,</div><div class="line"> <span class="keywordtype">size_t</span> msg_len, <span class="keywordtype">void</span> <span class="keyword">const</span>* basename, <span class="keywordtype">size_t</span> basename_len,</div><div class="line"> <span class="keywordtype">void</span> <span class="keyword">const</span>* signed_priv_rl, <span class="keywordtype">size_t</span> signed_priv_rl_size,</div><div class="line"> <span class="keywordtype">void</span> <span class="keyword">const</span>* signed_sig_rl, <span class="keywordtype">size_t</span> signed_sig_rl_size,</div><div class="line"> <span class="keywordtype">void</span> <span class="keyword">const</span>* signed_grp_rl, <span class="keywordtype">size_t</span> signed_grp_rl_size,</div><div class="line"> <a class="code" href="struct_verifier_rl.html">VerifierRl</a> <span class="keyword">const</span>* ver_rl, <span class="keywordtype">size_t</span> ver_rl_size,</div><div class="line"> <span class="keywordtype">void</span> <span class="keyword">const</span>* signed_pub_key, <span class="keywordtype">size_t</span> signed_pub_key_size,</div><div class="line"> <a class="code" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> <span class="keyword">const</span>* cacert, <a class="code" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg,</div><div class="line"> <span class="keywordtype">void</span>** verifier_precomp, <span class="keywordtype">size_t</span>* verifier_precomp_size) {</div></div><!-- fragment --></p>
+<p>The <code>Verify</code> parameters were either sent by the verifier to the member, or they were part of the member's configuration. The exceptions are the <code>sig</code> and <code>sig_len</code> parameters, which we use to input the signature to be verified.</p>
+<p>The verifier might send the message to the member or there may be another mechanism to choose the message, but the way the message is communicated is outside the scope of the Intel&reg; EPID scheme.</p>
+<p>We use the parameters <code>verifier_precomp</code> and <code>verifier_precomp_is_input</code> to pass in a pre-computation blob if provided. We can use the pre-computation blob to increase performance when verifying signatures repeatedly with the same group public key.</p>
+<p>The member and the verifier agree on the message, basename, hash algorithm, and SigRL that the verifier uses for verification.</p>
+<dl class="section warning"><dt>Warning</dt><dd>The use of a name-based signature creates a platform unique pseudonymous identifier. Because it reduces the member's privacy, the user should be notified when it is used and should have control over its use.</dd></dl>
+<p><br />
+</p>
+<p>Next we do basic variable setup.</p>
+<p><div class="fragment"><div class="line"> <a class="code" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> result = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">kEpidErr</a>;</div><div class="line"> <a class="code" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a>* ctx = NULL;</div><div class="line"> <a class="code" href="struct_priv_rl.html">PrivRl</a>* priv_rl = NULL;</div><div class="line"> <a class="code" href="struct_sig_rl.html">SigRl</a>* sig_rl = NULL;</div><div class="line"> <a class="code" href="struct_group_rl.html">GroupRl</a>* grp_rl = NULL;</div><div class="line"></div><div class="line"> <span class="keywordflow">do</span> {</div><div class="line"> <a class="code" href="struct_group_pub_key.html">GroupPubKey</a> pub_key = {0};</div></div><!-- fragment --></p>
+<p>We create pointers to resources to be allocated and we use the <code>do {} while(0)</code> idiom so that we can reliably free resources on return from <code>Verify</code>. We also allocate the group public key on the stack.</p>
+<p><br />
+</p>
+<p>Next, we authenticate and extract the group public key using <a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb" title="Extracts group public key from buffer in issuer binary format. ">EpidParseGroupPubKeyFile</a>.</p>
+<p><div class="fragment"><div class="line"> result = <a class="code" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">EpidParseGroupPubKeyFile</a>(signed_pub_key, signed_pub_key_size,</div><div class="line"> cacert, &amp;pub_key);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p><a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb" title="Extracts group public key from buffer in issuer binary format. ">EpidParseGroupPubKeyFile</a> takes a buffer containing a group public key in issuer binary format and validates that the public key is signed by the private key that corresponds to the provided CA certificate, reading the key into <code>pub_key</code> in the process.</p>
+<p>Next, if a pre-computation blob is being used, we make sure that it is not in a legacy format.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (*verifier_precomp &amp;&amp;</div><div class="line"> *verifier_precomp_size != <span class="keyword">sizeof</span>(<a class="code" href="struct_verifier_precomp.html">VerifierPrecomp</a>)) {</div><div class="line"> result = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">kEpidBadArgErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> *verifier_precomp_size = <span class="keyword">sizeof</span>(<a class="code" href="struct_verifier_precomp.html">VerifierPrecomp</a>);</div></div><!-- fragment --></p>
+<p><br />
+</p>
+<p>Next, we create a verifier context using <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a>.</p>
+<p><div class="fragment"><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">EpidVerifierCreate</a>(&amp;pub_key, *verifier_precomp, &amp;ctx);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>If a pre-computation blob is provided to the top level application, we use it. Otherwise, we pass in <code>NULL</code>.</p>
+<p><br />
+</p>
+<p>Then we serialize pre-computed verifier data using <a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392" title="Serializes the pre-computed verifier settings. ">EpidVerifierWritePrecomp</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (!*verifier_precomp) {</div><div class="line"> *verifier_precomp = calloc(1, *verifier_precomp_size);</div><div class="line"> }</div><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">EpidVerifierWritePrecomp</a>(ctx, *verifier_precomp);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>The serialized verifier pre-computation blob can be used to greatly increase performance of <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> in future sessions if the same group public key is used.</p>
+<p><br />
+</p>
+<p>We use <a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92" title="Sets the hash algorithm to be used by a verifier. ">EpidVerifierSetHashAlg</a> to indicate the hash algorithm used for verification, which should be the same algorithm that the member used when signing.</p>
+<p><div class="fragment"><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">EpidVerifierSetHashAlg</a>(ctx, hash_alg);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>After the hash algorithm is set, future calls to <a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064" title="Verifies a signature and checks revocation status. ">EpidVerify</a> will use the same algorithm.</p>
+<p><br />
+</p>
+<p>We use <a class="el" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6" title="Sets the basename to be used by a verifier. ">EpidVerifierSetBasename</a> to indicate the basename used for verification, which should be the same one that the member used when signing.</p>
+<p><div class="fragment"><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">EpidVerifierSetBasename</a>(ctx, basename, basename_len);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>After the basename is set, future calls to <a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064" title="Verifies a signature and checks revocation status. ">EpidVerify</a> will use the same basename.</p>
+<p><br />
+</p>
+<p>Before we verify a signature, we have to configure revocation lists so that we can check to see if a signer's group membership has been revoked.</p>
+<dl class="section note"><dt>Note</dt><dd>Configured revocation lists are referenced directly by the verifier until a new revocation list is set or the verifier is destroyed. Until the verifier is destroyed, we do not modify the revocation lists.</dd></dl>
+<p><br />
+</p>
+<p>We set the private key revocation list using <a class="el" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e" title="Sets the private key based revocation list. ">EpidVerifierSetPrivRl</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (signed_priv_rl) {</div><div class="line"> <span class="comment">// authenticate and determine space needed for RL</span></div><div class="line"> <span class="keywordtype">size_t</span> priv_rl_size = 0;</div><div class="line"> result = <a class="code" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">EpidParsePrivRlFile</a>(signed_priv_rl, signed_priv_rl_size, cacert,</div><div class="line"> NULL, &amp;priv_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> priv_rl = calloc(1, priv_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (!priv_rl) {</div><div class="line"> result = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fill the rl</span></div><div class="line"> result = <a class="code" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">EpidParsePrivRlFile</a>(signed_priv_rl, signed_priv_rl_size, cacert,</div><div class="line"> priv_rl, &amp;priv_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// set private key based revocation list</span></div><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">EpidVerifierSetPrivRl</a>(ctx, priv_rl, priv_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="comment">// if (signed_priv_rl)</span></div></div><!-- fragment --></p>
+<p>We use <a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e" title="Extracts private key revocation list from buffer in issuer binary format. ">EpidParsePrivRlFile</a> to:</p>
+<ul>
+<li>extract the private key revocation list</li>
+<li>validate that the revocation list was signed by the private key corresponding to the provided CA certificate</li>
+<li>validate that the size of the input buffer is correct</li>
+<li>determine the required size of the revocation list output buffer</li>
+</ul>
+<p>To determine the required <code>priv_rl</code> buffer size, we provide a null pointer for the output buffer when calling <a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e" title="Extracts private key revocation list from buffer in issuer binary format. ">EpidParsePrivRlFile</a>.</p>
+<p>After we find out the required size of the <code>priv_rl</code> buffer, we allocate memory for it. Then we fill the buffer using <a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e" title="Extracts private key revocation list from buffer in issuer binary format. ">EpidParsePrivRlFile</a>.</p>
+<p><br />
+</p>
+<p>Next, we set the signature revocation list using <a class="el" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf" title="Sets the signature based revocation list. ">EpidVerifierSetSigRl</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (signed_sig_rl) {</div><div class="line"> <span class="comment">// authenticate and determine space needed for RL</span></div><div class="line"> <span class="keywordtype">size_t</span> sig_rl_size = 0;</div><div class="line"> result = <a class="code" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a>(signed_sig_rl, signed_sig_rl_size, cacert,</div><div class="line"> NULL, &amp;sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> sig_rl = calloc(1, sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (!sig_rl) {</div><div class="line"> result = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fill the rl</span></div><div class="line"> result = <a class="code" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a>(signed_sig_rl, signed_sig_rl_size, cacert,</div><div class="line"> sig_rl, &amp;sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// set signature based revocation list</span></div><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">EpidVerifierSetSigRl</a>(ctx, sig_rl, sig_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="comment">// if (signed_sig_rl)</span></div></div><!-- fragment --></p>
+<p>We use <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a> to:</p>
+<ul>
+<li>extract the signature revocation list</li>
+<li>validate that the revocation list was signed by the private key corresponding to the provided CA certificate</li>
+<li>validate that the size of the input buffer is correct</li>
+<li>determine the required size of the revocation list output buffer</li>
+</ul>
+<p>To determine the required <code>sig_rl</code> buffer size, we provide a null pointer for the output buffer when calling <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a>.</p>
+<p>After we find out the required size of the <code>sig_rl</code> buffer, we allocate memory for it. Then we fill the buffer using <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f" title="Extracts signature revocation list from buffer in issuer binary format. ">EpidParseSigRlFile</a>.</p>
+<p><br />
+</p>
+<p>Next, we set the group revocation list using <a class="el" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb" title="Sets the group based revocation list. ">EpidVerifierSetGroupRl</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (signed_grp_rl) {</div><div class="line"> <span class="comment">// authenticate and determine space needed for RL</span></div><div class="line"> <span class="keywordtype">size_t</span> grp_rl_size = 0;</div><div class="line"> result = <a class="code" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">EpidParseGroupRlFile</a>(signed_grp_rl, signed_grp_rl_size, cacert,</div><div class="line"> NULL, &amp;grp_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> grp_rl = calloc(1, grp_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (!grp_rl) {</div><div class="line"> result = <a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fill the rl</span></div><div class="line"> result = <a class="code" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">EpidParseGroupRlFile</a>(signed_grp_rl, signed_grp_rl_size, cacert,</div><div class="line"> grp_rl, &amp;grp_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> <span class="comment">// set group revocation list</span></div><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">EpidVerifierSetGroupRl</a>(ctx, grp_rl, grp_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> } <span class="comment">// if (signed_grp_rl)</span></div></div><!-- fragment --></p>
+<p>We use <a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f" title="Extracts group revocation list from buffer in issuer binary format. ">EpidParseGroupRlFile</a> to:</p>
+<ul>
+<li>extract the group revocation list</li>
+<li>validate that the revocation list was signed by the private key corresponding to the provided CA certificate</li>
+<li>validate that the size of the input buffer is correct</li>
+<li>determine the required size of the revocation list output buffer</li>
+</ul>
+<p>To determine the required <code>grp_rl</code> buffer size, we provide a null pointer for the output buffer when calling <a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f" title="Extracts group revocation list from buffer in issuer binary format. ">EpidParseGroupRlFile</a>.</p>
+<p>After we find out the required size of the <code>grp_rl</code> buffer, we allocate memory for it. Then we fill the buffer using <a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f" title="Extracts group revocation list from buffer in issuer binary format. ">EpidParseGroupRlFile</a>.</p>
+<p><br />
+</p>
+<p>Next, we set the verifier blacklist using <a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a>.</p>
+<p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (ver_rl) {</div><div class="line"> <span class="comment">// set verifier based revocation list</span></div><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">EpidVerifierSetVerifierRl</a>(ctx, ver_rl, ver_rl_size);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> }</div></div><!-- fragment --></p>
+<p>The verifier is responsible for ensuring that the verifier revocation list is authorized. Validating it is outside the scope of this example.</p>
+<p><br />
+</p>
+<p>Next, we use <a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064" title="Verifies a signature and checks revocation status. ">EpidVerify</a> to verify that the Intel&reg; EPID signature was created by a valid member of a group in good standing.</p>
+<p><div class="fragment"><div class="line"> result = <a class="code" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">EpidVerify</a>(ctx, sig, sig_len, msg, msg_len);</div><div class="line"> <span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != result) {</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --> <br />
+</p>
+<p>Finally, we clean up and exit.</p>
+<p><div class="fragment"><div class="line"> } <span class="keywordflow">while</span> (0);</div><div class="line"></div><div class="line"> <span class="comment">// delete verifier</span></div><div class="line"> <a class="code" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">EpidVerifierDelete</a>(&amp;ctx);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (priv_rl) free(priv_rl);</div><div class="line"> <span class="keywordflow">if</span> (sig_rl) free(sig_rl);</div><div class="line"> <span class="keywordflow">if</span> (grp_rl) free(grp_rl);</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> result;</div><div class="line">}</div></div><!-- fragment --></p>
+<p>If we made it past verification without an error, we set the return code appropriately and fall out of the <code>do-while</code> loop. If there was an error earlier, all breaks in the <code>do-while</code> loop bring us to this point with an error status.</p>
+<p>Then we free the allocated resources. <a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12" title="Deletes an existing verifier context. ">EpidVerifierDelete</a> deletes the verifier context.</p>
+<p>After deleting the verifier context, we can also delete the revocation lists.</p>
+<p>We return from <code>Verify</code> with the success or error status.</p>
+<p><br />
+</p>
+<p>This concludes the <code>verifysig</code> walkthrough. Now you should be able to verify an Intel&reg; EPID signature using the SDK APIs.</p>
+<p>To learn more about the SDK APIs see the <a href="modules.html"><b>API Reference</b></a>. To learn more about the Intel&reg; EPID Scheme see <a class="el" href="_epid_overview.html">Introduction to the Intel&reg; EPID Scheme</a> in the documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/_usingi_k_g_f.html b/doc/html/_usingi_k_g_f.html
new file mode 100644
index 0000000..3726fed
--- /dev/null
+++ b/doc/html/_usingi_k_g_f.html
@@ -0,0 +1,248 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Managing Groups with iKGF</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('_usingi_k_g_f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Managing Groups with iKGF </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="toc"><h3>Table of Contents</h3>
+<ul><li class="level1"><a href="#ContactingiKGF">Contacting iKGF</a></li>
+<li class="level1"><a href="#RevocationTools">Tools for Creating Revocation Requests</a><ul><li class="level2"><a href="#RevocationTools_revokegrp">Requesting Group Revocation</a></li>
+<li class="level2"><a href="#RevocationTools_revokekey">Requesting Private Key Revocation</a></li>
+<li class="level2"><a href="#RevocationTools_revokesig">Requesting Signature Revocation</a></li>
+</ul>
+</li>
+<li class="level1"><a href="#ExtractionTools">Tools for Extracting Keys from iKGF Files</a><ul><li class="level2"><a href="#ExtractionTools_extractgrps">Extracting Group Public Keys</a></li>
+<li class="level2"><a href="#ExtractionTools_extractkeys">Extracting Member Private Keys</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="textblock"><p>The issuer handles group membership and revocation. To provision devices with Intel&reg; EPID keys, you need to process data provided by the issuer. Also, in order to revoke a member, you have to generate a revocation request and send it to the issuer.</p>
+<p>This section assumes you are using iKGF as your issuer, and describes how to do the following:</p>
+<ul>
+<li>Create group revocation request for iKGF</li>
+<li>Create member private key revocation request for iKGF</li>
+<li>Create signature revocation request for iKGF</li>
+<li>Extract group public keys from iKGF files</li>
+<li>Extract member private keys from iKGF files</li>
+</ul>
+<p>After you send revocation requests with the issuer, the issuer updates the revocation lists as needed.</p>
+<p>The Intel&reg; EPID SDK provides tools designed to make it easier to generate revocation requests and extract keys from iKGF files.</p>
+<h1><a class="anchor" id="ContactingiKGF"></a>
+Contacting iKGF</h1>
+<p>If you want to use the Intel Key Generation Facility (iKGF) as the issuer, contact <a href="#" onclick="location.href='mai'+'lto:'+'inf'+'o@'+'dig'+'it'+'al-'+'cp'+'.co'+'m'; return false;">info@<span style="display: none;">.nosp@m.</span>digi<span style="display: none;">.nosp@m.</span>tal-c<span style="display: none;">.nosp@m.</span>p.co<span style="display: none;">.nosp@m.</span>m</a> to get started.</p>
+<h1><a class="anchor" id="RevocationTools"></a>
+Tools for Creating Revocation Requests</h1>
+<p>The Intel&reg; EPID SDK includes tools to help you request that iKGF add a revoked group, member private key, or signature to a revocation list.</p>
+<p>These tools are designed to create a revocation request in the specific format required by iKGF. After one of these tools generates a revocation request, the request must be submitted to the issuer in order for the revocation to take effect.</p>
+<p>To access the tools, go to <code>_install/epid-sdk/tools</code> in the SDK directory.</p>
+<p>You need to build the SDK before you can use these tools. For more information, refer to <a class="el" href="_building_sdk.html">Building from Source</a>.</p>
+<p>The following tools are available:</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Tool </th><th class="markdownTableHeadNone">Purpose ----------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>revokegrp</code> </td><td class="markdownTableBodyNone">Create group revocation request </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>revokekey</code> </td><td class="markdownTableBodyNone">Create member private key revocation request </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>revokesig</code> </td><td class="markdownTableBodyNone">Create signature revocation request </td></tr>
+</table>
+<p><br />
+</p>
+<h2><a class="anchor" id="RevocationTools_revokegrp"></a>
+Requesting Group Revocation</h2>
+<p>The <code>revokegrp</code> tool adds a group to the revocation request file. </p><pre class="fragment">Usage: revokegrp [OPTION]...
+Revoke Intel(R) EPID group
+
+Options:
+ --gpubkey=FILE
+ load group public key from FILE (default: pubkey.bin)
+
+ --capubkey=FILE
+ load IoT Issuing CA public key from FILE
+
+ --reason=NUM
+ revocation reason (default: 0)
+
+ --req=FILE
+ append group revocation request to FILE (default: grprlreq.dat)
+
+ -h, --help
+ display this help and exit
+
+ -v, --verbose
+ print status messages to stdout
+</pre><p><br />
+</p>
+<h2><a class="anchor" id="RevocationTools_revokekey"></a>
+Requesting Private Key Revocation</h2>
+<p>The <code>revokekey</code> tool adds a member private key to the revocation request file. </p><pre class="fragment">Usage: revokekey [OPTION]
+Revoke Intel(R) EPID private key
+
+Options:
+ --mprivkey=FILE
+ load private key to revoke from FILE (default: mprivkey.dat)
+
+ --req=FILE
+ append private key revocation request to FILE (default: privreq.dat)
+
+ -h, --help
+ display this help and exit
+
+ -v,--verbose
+ print status messages to stdout
+
+The following options are only needed for compressed keys:
+
+ --gpubkey=FILE
+ load group public key from FILE (default: pubkey.bin)
+
+ --capubkey=FILE
+ load IoT Issuing CA public key from FILE
+</pre><p><br />
+</p>
+<h2><a class="anchor" id="RevocationTools_revokesig"></a>
+Requesting Signature Revocation</h2>
+<p>The <code>revokesig</code> tool creates a request to add a signature to the revocation request file.</p>
+<p><code>revokesig</code> only accepts valid signatures for addition to the revocation request. </p><pre class="fragment">Usage: revokesig [OPTION]...
+Revoke Intel(R) EPID signature
+
+Options:
+ --sig=FILE
+ load signature to revoke from FILE (default: sig.dat)
+
+ --msg=MESSAGE
+ MESSAGE used to generate signature to revoke
+
+ --msgfile=FILE
+ FILE containing message used to generate signature to revoke
+
+ --gpubkey=FILE
+ load group public key from FILE (default: pubkey.bin)
+
+ --capubkey=FILE
+ load IoT Issuing CA public key from FILE
+
+ --req=FILE
+ append signature revocation request to FILE (default: sigrlreq.dat)
+
+ -h, --help
+ display this help and exit
+
+ -v, --verbose
+ print status messages to stdout
+</pre><h1><a class="anchor" id="ExtractionTools"></a>
+Tools for Extracting Keys from iKGF Files</h1>
+<p>The Intel&reg; EPID SDK includes tools to help you extract individual keys from files provided by the Intel Key Generation Facility (iKGF).</p>
+<p>To access the tools, go to <code>_install/epid-sdk/tools</code> in the SDK directory.</p>
+<p>You need to build the SDK before you can use these tools. For more information, refer to <a class="el" href="_building_sdk.html">Building from Source</a>.</p>
+<p>The following tools are available:</p>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Tool </th><th class="markdownTableHeadNone">Purpose ------------&mdash; </th></tr>
+<tr class="markdownTableBody" class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><code>extractgrps</code> </td><td class="markdownTableBodyNone">Extracts group public keys </td></tr>
+<tr class="markdownTableBody" class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><code>extractkeys</code> </td><td class="markdownTableBodyNone">Extracts member private keys </td></tr>
+</table>
+<p><br />
+</p>
+<h2><a class="anchor" id="ExtractionTools_extractgrps"></a>
+Extracting Group Public Keys</h2>
+<p>The <code>extractgrps</code> tool extracts group public keys from the input file to the current directory. </p><pre class="fragment">Usage: extractgrps [OPTION]... [FILE] [NUM]
+Extract the first NUM group certs from FILE to current directory
+
+Options:
+ -h, --help
+ display this help and exit
+
+ -v, --verbose
+ print status messages to stdout
+</pre><p><br />
+</p>
+<h2><a class="anchor" id="ExtractionTools_extractkeys"></a>
+Extracting Member Private Keys</h2>
+<p>The <code>extractkeys</code> tool extracts member private keys from the input file to the current directory. </p><pre class="fragment">Usage: extractkeys [OPTION]... [FILE] [NUM]
+Extract the first NUM private keys from FILE to current directory.
+
+Options:
+ -c, --compressed
+ extract compressed keys
+
+ -h, --help
+ display this help and exit
+
+ -v, --verbose
+ print status messages to stdout</pre> </div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
new file mode 100644
index 0000000..f8087d5
--- /dev/null
+++ b/doc/html/annotated.html
@@ -0,0 +1,153 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Structures</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('annotated.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Data Structures</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_basic_signature.html" target="_self">BasicSignature</a></td><td class="desc">Intel(R) EPID 2.0 basic signature </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_big_num_str.html" target="_self">BigNumStr</a></td><td class="desc">Serialized BigNum </td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_compressed_priv_key.html" target="_self">CompressedPrivKey</a></td><td class="desc">Compressed private key </td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecc_point_fq.html" target="_self">EccPointFq</a></td><td class="desc">Point in EFq </td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecc_point_fq2.html" target="_self">EccPointFq2</a></td><td class="desc">Point in EFq2 </td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecc_point_jacobi_fq.html" target="_self">EccPointJacobiFq</a></td><td class="desc">Element of EFq in Jacobi format </td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecc_point_jacobi_fq2.html" target="_self">EccPointJacobiFq2</a></td><td class="desc">Element of EFq2 in Jacobi format </td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecdsa_private_key.html" target="_self">EcdsaPrivateKey</a></td><td class="desc">ECDSA Private Key </td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecdsa_public_key.html" target="_self">EcdsaPublicKey</a></td><td class="desc">ECDSA Public Key </td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_ecdsa_signature.html" target="_self">EcdsaSignature</a></td><td class="desc">ECDSA Signature using NIST 256-bit curve secp256r1 </td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_basic_signature.html" target="_self">Epid11BasicSignature</a></td><td class="desc">Intel(R) EPID 1.1 basic signature </td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_g2_elem_str.html" target="_self">Epid11G2ElemStr</a></td><td class="desc">Serialized Intel(R) EPID 1.1 G2 element </td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_group_pub_key.html" target="_self">Epid11GroupPubKey</a></td><td class="desc">Intel(R) EPID 1.1 group public key </td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_group_rl.html" target="_self">Epid11GroupRl</a></td><td class="desc">Intel(R) EPID 1.1 group revocation list </td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_gt_elem_str.html" target="_self">Epid11GtElemStr</a></td><td class="desc">Serialized Intel(R) EPID 1.1 GT element </td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_nr_proof.html" target="_self">Epid11NrProof</a></td><td class="desc">Intel(R) EPID 1.1 non-revoked Proof </td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_params.html" target="_self">Epid11Params</a></td><td class="desc">Intel(R) EPID 1.1 Parameters </td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_priv_rl.html" target="_self">Epid11PrivRl</a></td><td class="desc">Intel(R) EPID 1.1 private-key based revocation list </td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_signature.html" target="_self">Epid11Signature</a></td><td class="desc">Intel(R) EPID 1.1 Signature </td></tr>
+<tr id="row_19_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_sig_rl.html" target="_self">Epid11SigRl</a></td><td class="desc">Intel(R) EPID 1.1 signature based revocation list </td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_sig_rl_entry.html" target="_self">Epid11SigRlEntry</a></td><td class="desc">Intel(R) EPID 1.1 entry in SigRL (B,K) </td></tr>
+<tr id="row_21_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid11_verifier_precomp.html" target="_self">Epid11VerifierPrecomp</a></td><td class="desc">Intel(R) EPID 1.1 Pre-computed verifier settings </td></tr>
+<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid2_params.html" target="_self">Epid2Params</a></td><td class="desc">Intel(R) EPID 2.0 Parameters </td></tr>
+<tr id="row_23_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid_ca_certificate.html" target="_self">EpidCaCertificate</a></td><td class="desc">IoT CA Certificate binary format </td></tr>
+<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid_file_header.html" target="_self">EpidFileHeader</a></td><td class="desc">Intel(R) EPID binary file header </td></tr>
+<tr id="row_25_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_epid_signature.html" target="_self">EpidSignature</a></td><td class="desc">Intel(R) EPID 2.0 Signature </td></tr>
+<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fp_elem.html" target="_self">FpElem</a></td><td class="desc">Element of Fp </td></tr>
+<tr id="row_27_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fp_elem_str.html" target="_self">FpElemStr</a></td><td class="desc">Number in [0, p-1] </td></tr>
+<tr id="row_28_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq12_elem.html" target="_self">Fq12Elem</a></td><td class="desc">Element of Fq12 </td></tr>
+<tr id="row_29_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq12_elem_str.html" target="_self">Fq12ElemStr</a></td><td class="desc">Serialized Fq2^3^2 element </td></tr>
+<tr id="row_30_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq2_elem.html" target="_self">Fq2Elem</a></td><td class="desc">Element of Fq2 </td></tr>
+<tr id="row_31_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq2_elem_str.html" target="_self">Fq2ElemStr</a></td><td class="desc">Serialized Fq2 element </td></tr>
+<tr id="row_32_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq3_elem_str.html" target="_self">Fq3ElemStr</a></td><td class="desc">Serialized Fq3 element </td></tr>
+<tr id="row_33_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq6_elem.html" target="_self">Fq6Elem</a></td><td class="desc">Element of Fq6 </td></tr>
+<tr id="row_34_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq6_elem_str.html" target="_self">Fq6ElemStr</a></td><td class="desc">Serialized Fq2^3 element </td></tr>
+<tr id="row_35_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq_elem.html" target="_self">FqElem</a></td><td class="desc">Element of Fq </td></tr>
+<tr id="row_36_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_fq_elem_str.html" target="_self">FqElemStr</a></td><td class="desc">Number in [0, q-1] </td></tr>
+<tr id="row_37_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_g1_elem_str.html" target="_self">G1ElemStr</a></td><td class="desc">Serialized G1 element </td></tr>
+<tr id="row_38_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_g2_elem_str.html" target="_self">G2ElemStr</a></td><td class="desc">Serialized G2 element </td></tr>
+<tr id="row_39_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_group_pub_key.html" target="_self">GroupPubKey</a></td><td class="desc">Intel(R) EPID 2.0 group public key </td></tr>
+<tr id="row_40_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_group_rl.html" target="_self">GroupRl</a></td><td class="desc">Group revocation list </td></tr>
+<tr id="row_41_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_gt_elem_str.html" target="_self">GtElemStr</a></td><td class="desc">Serialized GT element </td></tr>
+<tr id="row_42_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_i_priv_key.html" target="_self">IPrivKey</a></td><td class="desc">Intel(R) EPID 2.0 issuing private key </td></tr>
+<tr id="row_43_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_join_request.html" target="_self">JoinRequest</a></td><td class="desc">Join request </td></tr>
+<tr id="row_44_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_member_params.html" target="_self">MemberParams</a></td><td class="desc">Software only specific member parameters </td></tr>
+<tr id="row_45_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_member_precomp.html" target="_self">MemberPrecomp</a></td><td class="desc">Pre-computed member settings </td></tr>
+<tr id="row_46_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_membership_credential.html" target="_self">MembershipCredential</a></td><td class="desc">Membership credential </td></tr>
+<tr id="row_47_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_nr_proof.html" target="_self">NrProof</a></td><td class="desc">Non-revoked Proof </td></tr>
+<tr id="row_48_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str128.html" target="_self">OctStr128</a></td><td class="desc">128 bit octet string </td></tr>
+<tr id="row_49_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str16.html" target="_self">OctStr16</a></td><td class="desc">16 bit octet string </td></tr>
+<tr id="row_50_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str256.html" target="_self">OctStr256</a></td><td class="desc">256 bit octet string </td></tr>
+<tr id="row_51_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str32.html" target="_self">OctStr32</a></td><td class="desc">32 bit octet string </td></tr>
+<tr id="row_52_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str512.html" target="_self">OctStr512</a></td><td class="desc">512 bit octet string </td></tr>
+<tr id="row_53_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str600.html" target="_self">OctStr600</a></td><td class="desc">600 bit octet string </td></tr>
+<tr id="row_54_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str64.html" target="_self">OctStr64</a></td><td class="desc">64 bit octet string </td></tr>
+<tr id="row_55_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str768.html" target="_self">OctStr768</a></td><td class="desc">768 bit octet string </td></tr>
+<tr id="row_56_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str8.html" target="_self">OctStr8</a></td><td class="desc">8 bit octet string </td></tr>
+<tr id="row_57_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_oct_str80.html" target="_self">OctStr80</a></td><td class="desc">80 bit octet string </td></tr>
+<tr id="row_58_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_pairing_state.html" target="_self">PairingState</a></td><td class="desc">A scratch buffer for stateful pairing calls </td></tr>
+<tr id="row_59_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_priv_key.html" target="_self">PrivKey</a></td><td class="desc">Intel(R) EPID 2.0 private key </td></tr>
+<tr id="row_60_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_priv_rl.html" target="_self">PrivRl</a></td><td class="desc">Private-key based revocation list </td></tr>
+<tr id="row_61_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_sha256_digest.html" target="_self">Sha256Digest</a></td><td class="desc">SHA256 digest </td></tr>
+<tr id="row_62_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionsha__digest.html" target="_self">sha_digest</a></td><td class="desc">Sha Digest Element </td></tr>
+<tr id="row_63_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_sig_rl.html" target="_self">SigRl</a></td><td class="desc">Signature based revocation list </td></tr>
+<tr id="row_64_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_sig_rl_entry.html" target="_self">SigRlEntry</a></td><td class="desc">Entry in SigRL (B,K) </td></tr>
+<tr id="row_65_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtiny__sha.html" target="_self">tiny_sha</a></td><td class="desc">Tiny Sha wrapper Element </td></tr>
+<tr id="row_66_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_tpm2_ctx.html" target="_self">Tpm2Ctx</a></td><td class="desc">TPM TSS context definition </td></tr>
+<tr id="row_67_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_verifier_precomp.html" target="_self">VerifierPrecomp</a></td><td class="desc">Pre-computed verifier settings </td></tr>
+<tr id="row_68_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_verifier_rl.html" target="_self">VerifierRl</a></td><td class="desc"></td></tr>
+<tr id="row_69_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_very_large_int.html" target="_self">VeryLargeInt</a></td><td class="desc">Large integer </td></tr>
+<tr id="row_70_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_very_large_int_product.html" target="_self">VeryLargeIntProduct</a></td><td class="desc">Used for multiplication </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/base_name.png b/doc/html/base_name.png
new file mode 100644
index 0000000..5b28a61
--- /dev/null
+++ b/doc/html/base_name.png
Binary files differ
diff --git a/doc/html/basenames_8dox.html b/doc/html/basenames_8dox.html
new file mode 100644
index 0000000..1318631
--- /dev/null
+++ b/doc/html/basenames_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/basenames.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('basenames_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/basenames.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="basenames_8dox.html">basenames.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/basicdoc.png b/doc/html/basicdoc.png
new file mode 100644
index 0000000..7464933
--- /dev/null
+++ b/doc/html/basicdoc.png
Binary files differ
diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png
new file mode 100644
index 0000000..224b29a
--- /dev/null
+++ b/doc/html/bc_s.png
Binary files differ
diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png
new file mode 100644
index 0000000..940a0b9
--- /dev/null
+++ b/doc/html/bdwn.png
Binary files differ
diff --git a/doc/html/bignum_8h.html b/doc/html/bignum_8h.html
new file mode 100644
index 0000000..c23a9ca
--- /dev/null
+++ b/doc/html/bignum_8h.html
@@ -0,0 +1,139 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/bignum.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('bignum_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bignum.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Big number interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a></td></tr>
+<tr class="memdesc:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal representation of large numbers. <br /></td></tr>
+<tr class="separator:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad5f6f262bfd780fed3678bcee16f0aed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed">NewBigNum</a> (size_t data_size_bytes, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **bignum)</td></tr>
+<tr class="memdesc:gad5f6f262bfd780fed3678bcee16f0aed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new BigNum. <a href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed">More...</a><br /></td></tr>
+<tr class="separator:gad5f6f262bfd780fed3678bcee16f0aed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2d17600068b1d94000635c6644258a03"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03">DeleteBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **bignum)</td></tr>
+<tr class="memdesc:ga2d17600068b1d94000635c6644258a03"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated BigNum. <a href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03">More...</a><br /></td></tr>
+<tr class="separator:ga2d17600068b1d94000635c6644258a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe8e39d5788423f41770a71a4c911fbe"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe">ReadBigNum</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> bn_str, size_t strlen, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *bn)</td></tr>
+<tr class="memdesc:gabe8e39d5788423f41770a71a4c911fbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes a BigNum from a string. <a href="group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe">More...</a><br /></td></tr>
+<tr class="separator:gabe8e39d5788423f41770a71a4c911fbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga904c16cc020e7196f22ac9abdc31b41f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f">WriteBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *bn, size_t strlen, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> bn_str)</td></tr>
+<tr class="memdesc:ga904c16cc020e7196f22ac9abdc31b41f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes a BigNum to a string. <a href="group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f">More...</a><br /></td></tr>
+<tr class="separator:ga904c16cc020e7196f22ac9abdc31b41f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8">BigNumAdd</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds two BigNum values. <a href="group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8">More...</a><br /></td></tr>
+<tr class="separator:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbec9669ab0fe768e2be74dcaca397ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea">BigNumSub</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gacbec9669ab0fe768e2be74dcaca397ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts two BigNum values. <a href="group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea">More...</a><br /></td></tr>
+<tr class="separator:gacbec9669ab0fe768e2be74dcaca397ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317">BigNumMul</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two BigNum values. <a href="group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317">More...</a><br /></td></tr>
+<tr class="separator:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga166134085464b0df2c8efcfccf8ec573"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573">BigNumDiv</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *q, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga166134085464b0df2c8efcfccf8ec573"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divides two BigNum values. <a href="group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573">More...</a><br /></td></tr>
+<tr class="separator:ga166134085464b0df2c8efcfccf8ec573"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7dd6038987210d10bf843602fef0c929"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929">BigNumMod</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga7dd6038987210d10bf843602fef0c929"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes modular reduction for BigNum value by specified modulus. <a href="group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929">More...</a><br /></td></tr>
+<tr class="separator:ga7dd6038987210d10bf843602fef0c929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0366e47226563b17fcbc8e3ed766084"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084">BigNumIsEven</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_even)</td></tr>
+<tr class="memdesc:gaf0366e47226563b17fcbc8e3ed766084"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a BigNum is even. <a href="group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084">More...</a><br /></td></tr>
+<tr class="separator:gaf0366e47226563b17fcbc8e3ed766084"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacde6564a814617a96985b379be0dfabb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb">BigNumIsZero</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_zero)</td></tr>
+<tr class="memdesc:gacde6564a814617a96985b379be0dfabb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a BigNum is zero. <a href="group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb">More...</a><br /></td></tr>
+<tr class="separator:gacde6564a814617a96985b379be0dfabb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4">BigNumPow2N</a> (unsigned int n, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises 2 to the given power. <a href="group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4">More...</a><br /></td></tr>
+<tr class="separator:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Big number interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="bignum_8h.html">bignum.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/bitsupplier_8h.html b/doc/html/bitsupplier_8h.html
new file mode 100644
index 0000000..9fb58aa
--- /dev/null
+++ b/doc/html/bitsupplier_8h.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/bitsupplier.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('bitsupplier_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle">
+<div class="title">bitsupplier.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Random data supplier interface.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="memItemLeft" align="right" valign="top">typedef int(__STDCALL *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>) (unsigned int *rand_data, int num_bits, void *user_data)</td></tr>
+<tr class="memdesc:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates random data. <a href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">More...</a><br /></td></tr>
+<tr class="separator:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Random data supplier interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="bitsupplier_8h.html">bitsupplier.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/build__tools__installation_8dox.html b/doc/html/build__tools__installation_8dox.html
new file mode 100644
index 0000000..3aa11e3
--- /dev/null
+++ b/doc/html/build__tools__installation_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/build_tools_installation.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('build__tools__installation_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/build_tools_installation.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="build__tools__installation_8dox.html">build_tools_installation.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/building__sdk_8dox.html b/doc/html/building__sdk_8dox.html
new file mode 100644
index 0000000..a2d2638
--- /dev/null
+++ b/doc/html/building__sdk_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/building_sdk.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('building__sdk_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/building_sdk.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="building__sdk_8dox.html">building_sdk.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/classes.html b/doc/html/classes.html
new file mode 100644
index 0000000..0672349
--- /dev/null
+++ b/doc/html/classes.html
@@ -0,0 +1,118 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Structure Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('classes.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Data Structure Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_c">c</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_f">f</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_i">i</a>&#160;|&#160;<a class="qindex" href="#letter_j">j</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_n">n</a>&#160;|&#160;<a class="qindex" href="#letter_o">o</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_v">v</a></div>
+<table class="classindex">
+<tr><td rowspan="2" valign="bottom"><a name="letter_b"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;b&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq3_elem_str.html">Fq3ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_priv_key.html">PrivKey</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_membership_credential.html">MembershipCredential</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_priv_rl.html">PrivRl</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_basic_signature.html">BasicSignature</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid11_params.html">Epid11Params</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;n&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;s&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq_elem.html">FqElem</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_c"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;c&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_epid11_signature.html">Epid11Signature</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_nr_proof.html">NrProof</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_sha256_digest.html">Sha256Digest</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_g"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;g&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_o"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;o&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="unionsha__digest.html">sha_digest</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_sig_rl.html">SigRl</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_e"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;e&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str128.html">OctStr128</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid2_params.html">Epid2Params</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;t&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid_file_header.html">EpidFileHeader</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_group_rl.html">GroupRl</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtiny__sha.html">tiny_sha</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_epid_signature.html">EpidSignature</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str512.html">OctStr512</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_f"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;f&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_i"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;i&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_oct_str600.html">OctStr600</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_v"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;v&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str64.html">OctStr64</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fp_elem.html">FpElem</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_i_priv_key.html">IPrivKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str768.html">OctStr768</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_j"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;j&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_oct_str8.html">OctStr8</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_verifier_rl.html">VerifierRl</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_oct_str80.html">OctStr80</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_join_request.html">JoinRequest</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;p&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_m"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;m&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_pairing_state.html">PairingState</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td></td><td></td><td valign="top"><a class="el" href="struct_member_params.html">MemberParams</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_c">c</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_f">f</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_i">i</a>&#160;|&#160;<a class="qindex" href="#letter_j">j</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_n">n</a>&#160;|&#160;<a class="qindex" href="#letter_o">o</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_v">v</a></div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/closed.png b/doc/html/closed.png
new file mode 100644
index 0000000..98cc2c9
--- /dev/null
+++ b/doc/html/closed.png
Binary files differ
diff --git a/doc/html/commit_8c.html b/doc/html/commit_8c.html
new file mode 100644
index 0000000..a596151
--- /dev/null
+++ b/doc/html/commit_8c.html
@@ -0,0 +1,139 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/commit.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('commit_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">commit.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Tpm2Commit implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="commit_8h.html">epid/member/tpm2/commit.h</a>&quot;</code><br />
+<code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/epid2params.h&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="conversion_8h.html">epid/member/tpm2/ibm_tss/conversion.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="commit_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">BREAK_ON_EPID_ERROR</a>(ret)</td></tr>
+<tr class="memdesc:a5638f861b82f1746ea1af0b384ef8ff1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle Intel(R) EPID Error with Break. <a href="#a5638f861b82f1746ea1af0b384ef8ff1">More...</a><br /></td></tr>
+<tr class="separator:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="memItemLeft" align="right" valign="top"><a id="aa6b8f3261ae9e2e1043380c192f7b5f0"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="commit_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">BIT7</a>&#160;&#160;&#160;0x080</td></tr>
+<tr class="memdesc:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit 7 binary mask. <br /></td></tr>
+<tr class="separator:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="memItemLeft" align="right" valign="top"><a id="a5c80fc0389d18e76cf9f43cfe13b63c7"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="commit_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">BITS0500</a>&#160;&#160;&#160;0x3f</td></tr>
+<tr class="memdesc:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binary 00011111. <br /></td></tr>
+<tr class="separator:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga750e38b6d6cea1b05f605e476df065d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">Tpm2Commit</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p1, void const *s2, size_t s2_len, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *y2, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *k, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *l, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *e, uint16_t *counter)</td></tr>
+<tr class="memdesc:ga750e38b6d6cea1b05f605e476df065d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Commit TPM operation. <a href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">More...</a><br /></td></tr>
+<tr class="separator:ga750e38b6d6cea1b05f605e476df065d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Tpm2Commit implementation. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a5638f861b82f1746ea1af0b384ef8ff1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5638f861b82f1746ea1af0b384ef8ff1">&#9670;&nbsp;</a></span>BREAK_ON_EPID_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define BREAK_ON_EPID_ERROR</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">ret</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != (ret)) { \</div><div class="line"> break; \</div><div class="line"> }</div><div class="ttc" id="group___error_codes_html_ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9"><div class="ttname"><a href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a></div><div class="ttdoc">no error </div><div class="ttdef"><b>Definition:</b> errors.h:41</div></div>
+</div><!-- fragment -->
+<p>Handle Intel(R) EPID Error with Break. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="commit_8c.html">commit.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/commit_8h.html b/doc/html/commit_8h.html
new file mode 100644
index 0000000..79f642d
--- /dev/null
+++ b/doc/html/commit_8h.html
@@ -0,0 +1,96 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/commit.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('commit_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">commit.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM Commit API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga750e38b6d6cea1b05f605e476df065d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">Tpm2Commit</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p1, void const *s2, size_t s2_len, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *y2, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *k, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *l, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *e, uint16_t *counter)</td></tr>
+<tr class="memdesc:ga750e38b6d6cea1b05f605e476df065d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Commit TPM operation. <a href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">More...</a><br /></td></tr>
+<tr class="separator:ga750e38b6d6cea1b05f605e476df065d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM Commit API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="commit_8h.html">commit.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/common_2math_2pairing_8h.html b/doc/html/common_2math_2pairing_8h.html
new file mode 100644
index 0000000..5c6718c
--- /dev/null
+++ b/doc/html/common_2math_2pairing_8h.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/pairing.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('common_2math_2pairing_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pairing.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Pairing interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga29f79a645871830754d396b9b4a2a0cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc">NewPairingState</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *ga, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *gb, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *t, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> neg, <a class="el" href="struct_pairing_state.html">PairingState</a> **ps)</td></tr>
+<tr class="memdesc:ga29f79a645871830754d396b9b4a2a0cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new pairing state. <a href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc">More...</a><br /></td></tr>
+<tr class="separator:ga29f79a645871830754d396b9b4a2a0cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad54aebdc331d39b73000fdca9e04f94d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d">DeletePairingState</a> (<a class="el" href="struct_pairing_state.html">PairingState</a> **ps)</td></tr>
+<tr class="memdesc:gad54aebdc331d39b73000fdca9e04f94d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated by <a class="el" href="struct_pairing_state.html" title="A scratch buffer for stateful pairing calls. ">PairingState</a>. <a href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d">More...</a><br /></td></tr>
+<tr class="separator:gad54aebdc331d39b73000fdca9e04f94d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga58a9d3cb6129274a04c72a35a52f768d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d">Pairing</a> (<a class="el" href="struct_pairing_state.html">PairingState</a> *ps, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *d)</td></tr>
+<tr class="memdesc:ga58a9d3cb6129274a04c72a35a52f768d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes an Optimal Ate Pairing for two parameters. <a href="group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d">More...</a><br /></td></tr>
+<tr class="separator:ga58a9d3cb6129274a04c72a35a52f768d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Pairing interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="common_2math_2pairing_8h.html">pairing.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/context_8c.html b/doc/html/context_8c.html
new file mode 100644
index 0000000..443ec8c
--- /dev/null
+++ b/doc/html/context_8c.html
@@ -0,0 +1,180 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/context.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('context_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">context.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM context implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="context_8h.html">epid/member/tpm2/context.h</a>&quot;</code><br />
+<code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/epid2params.h&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="getrandom_8h.html">epid/member/tpm2/getrandom.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tpm__member_8h.html">epid/member/tpm_member.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="context_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">BREAK_ON_EPID_ERROR</a>(ret)</td></tr>
+<tr class="memdesc:a5638f861b82f1746ea1af0b384ef8ff1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle Intel(R) EPID Error with Break. <a href="#a5638f861b82f1746ea1af0b384ef8ff1">More...</a><br /></td></tr>
+<tr class="separator:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7f547c0068dc63f0a6b76ad15b1b9675"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="context_8c.html#a7f547c0068dc63f0a6b76ad15b1b9675">Tpm2FlushKey</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx)</td></tr>
+<tr class="memdesc:a7f547c0068dc63f0a6b76ad15b1b9675"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes key from TPM. <a href="#a7f547c0068dc63f0a6b76ad15b1b9675">More...</a><br /></td></tr>
+<tr class="separator:a7f547c0068dc63f0a6b76ad15b1b9675"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">Tpm2CreateContext</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, Epid2Params_ const *epid2_params, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> *rnd_func, void **rnd_param, const <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> **f, <a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new Tpm context. <a href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">More...</a><br /></td></tr>
+<tr class="separator:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga38f47cba4c26320db06aa50a77590ef4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">Tpm2DeleteContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga38f47cba4c26320db06aa50a77590ef4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing Tpm context. <a href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">More...</a><br /></td></tr>
+<tr class="separator:ga38f47cba4c26320db06aa50a77590ef4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11cc131debbca60c0de7e53d48330b69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">Tpm2SetHashAlg</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga11cc131debbca60c0de7e53d48330b69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a TPM2. <a href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">More...</a><br /></td></tr>
+<tr class="separator:ga11cc131debbca60c0de7e53d48330b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">Tpm2ResetContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reset an existing Tpm context. <a href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">More...</a><br /></td></tr>
+<tr class="separator:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8e9ae8d68d53b7549da3823bc65a336e"><td class="memItemLeft" align="right" valign="top"><a id="a8e9ae8d68d53b7549da3823bc65a336e"></a>
+<a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="context_8c.html#a8e9ae8d68d53b7549da3823bc65a336e">is_context_already_created</a> = <a class="el" href="stdtypes_8h.html#a65e9886d74aaee76545e83dd09011727">false</a></td></tr>
+<tr class="memdesc:a8e9ae8d68d53b7549da3823bc65a336e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag that indicates that context was already created. <br /></td></tr>
+<tr class="separator:a8e9ae8d68d53b7549da3823bc65a336e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM context implementation. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a5638f861b82f1746ea1af0b384ef8ff1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5638f861b82f1746ea1af0b384ef8ff1">&#9670;&nbsp;</a></span>BREAK_ON_EPID_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define BREAK_ON_EPID_ERROR</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">ret</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != (ret)) { \</div><div class="line"> break; \</div><div class="line"> }</div><div class="ttc" id="group___error_codes_html_ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9"><div class="ttname"><a href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a></div><div class="ttdoc">no error </div><div class="ttdef"><b>Definition:</b> errors.h:41</div></div>
+</div><!-- fragment -->
+<p>Handle Intel(R) EPID Error with Break. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a7f547c0068dc63f0a6b76ad15b1b9675"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f547c0068dc63f0a6b76ad15b1b9675">&#9670;&nbsp;</a></span>Tpm2FlushKey()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Tpm2FlushKey </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes key from TPM. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>TPM context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="context_8c.html">context.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/context_8h.html b/doc/html/context_8h.html
new file mode 100644
index 0000000..1771996
--- /dev/null
+++ b/doc/html/context_8h.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/context.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('context_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">context.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">Tpm2CreateContext</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, Epid2Params_ const *epid2_params, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> *rnd_func, void **rnd_param, const <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> **f, <a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new Tpm context. <a href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">More...</a><br /></td></tr>
+<tr class="separator:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga38f47cba4c26320db06aa50a77590ef4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">Tpm2DeleteContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga38f47cba4c26320db06aa50a77590ef4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing Tpm context. <a href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">More...</a><br /></td></tr>
+<tr class="separator:ga38f47cba4c26320db06aa50a77590ef4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11cc131debbca60c0de7e53d48330b69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">Tpm2SetHashAlg</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga11cc131debbca60c0de7e53d48330b69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a TPM2. <a href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">More...</a><br /></td></tr>
+<tr class="separator:ga11cc131debbca60c0de7e53d48330b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">Tpm2ResetContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reset an existing Tpm context. <a href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">More...</a><br /></td></tr>
+<tr class="separator:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="context_8h.html">context.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/conversion_8c.html b/doc/html/conversion_8c.html
new file mode 100644
index 0000000..635eff6
--- /dev/null
+++ b/doc/html/conversion_8c.html
@@ -0,0 +1,323 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/conversion.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('conversion_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">conversion.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM-SDK data conversion implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="conversion_8h.html">epid/member/tpm2/ibm_tss/conversion.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad08628a6bf33154c1029a32e8b83325f"><td class="memItemLeft" align="right" valign="top">TPMI_ALG_HASH&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#ad08628a6bf33154c1029a32e8b83325f">EpidtoTpm2HashAlg</a> (<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ad08628a6bf33154c1029a32e8b83325f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps HashAlg to TPM type. <a href="#ad08628a6bf33154c1029a32e8b83325f">More...</a><br /></td></tr>
+<tr class="separator:ad08628a6bf33154c1029a32e8b83325f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#a51507a6be8d7dfa167c9e6fb70e5ee57">Tpm2toEpidHashAlg</a> (TPMI_ALG_HASH tpm_hash_alg)</td></tr>
+<tr class="memdesc:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps TPMI_ALG_HASH to HashAlg. <a href="#a51507a6be8d7dfa167c9e6fb70e5ee57">More...</a><br /></td></tr>
+<tr class="separator:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8243faa9ef46d90b936c7dace421e10e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#a8243faa9ef46d90b936c7dace421e10e">ReadTpm2FfElement</a> (<a class="el" href="struct_oct_str256.html">OctStr256</a> const *str, TPM2B_ECC_PARAMETER *tpm_data)</td></tr>
+<tr class="memdesc:a8243faa9ef46d90b936c7dace421e10e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts serialized FfElement into TPM type. <a href="#a8243faa9ef46d90b936c7dace421e10e">More...</a><br /></td></tr>
+<tr class="separator:a8243faa9ef46d90b936c7dace421e10e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f6a2b44857c038a2f90c12959640dea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#a9f6a2b44857c038a2f90c12959640dea">WriteTpm2FfElement</a> (TPM2B_ECC_PARAMETER const *tpm_data, <a class="el" href="struct_oct_str256.html">OctStr256</a> *str)</td></tr>
+<tr class="memdesc:a9f6a2b44857c038a2f90c12959640dea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts TPM finite field element types into serialized FfElement. <a href="#a9f6a2b44857c038a2f90c12959640dea">More...</a><br /></td></tr>
+<tr class="separator:a9f6a2b44857c038a2f90c12959640dea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acff82e14f6287ec2d4676a3f8cd38a57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#acff82e14f6287ec2d4676a3f8cd38a57">ReadTpm2EcPoint</a> (<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *p_str, TPM2B_ECC_POINT *tpm_point)</td></tr>
+<tr class="memdesc:acff82e14f6287ec2d4676a3f8cd38a57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts ECPoint string to TMP ECPoint structure. <a href="#acff82e14f6287ec2d4676a3f8cd38a57">More...</a><br /></td></tr>
+<tr class="separator:acff82e14f6287ec2d4676a3f8cd38a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e859e04c4b9c32a0970565846bdba3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html#a15e859e04c4b9c32a0970565846bdba3">WriteTpm2EcPoint</a> (TPM2B_ECC_POINT const *tpm_point, <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *p_str)</td></tr>
+<tr class="memdesc:a15e859e04c4b9c32a0970565846bdba3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes TMP ECPoint to ECPoint string. <a href="#a15e859e04c4b9c32a0970565846bdba3">More...</a><br /></td></tr>
+<tr class="separator:a15e859e04c4b9c32a0970565846bdba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM-SDK data conversion implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ad08628a6bf33154c1029a32e8b83325f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad08628a6bf33154c1029a32e8b83325f">&#9670;&nbsp;</a></span>EpidtoTpm2HashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">TPMI_ALG_HASH EpidtoTpm2HashAlg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Maps HashAlg to TPM type. </p>
+<p>Maps Intel(R) EPID SDK HashAlg into TPMI_ALG_HASH.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>Code of the hash algorithm </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>TPMI_ALG_HASH </dd></dl>
+
+</div>
+</div>
+<a id="acff82e14f6287ec2d4676a3f8cd38a57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acff82e14f6287ec2d4676a3f8cd38a57">&#9670;&nbsp;</a></span>ReadTpm2EcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadTpm2EcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>p_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM2B_ECC_POINT *&#160;</td>
+ <td class="paramname"><em>tpm_point</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts ECPoint string to TMP ECPoint structure. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>The serialized EcPoint to convert. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">tpm_point</td><td>The TPM EC point representation.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8243faa9ef46d90b936c7dace421e10e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8243faa9ef46d90b936c7dace421e10e">&#9670;&nbsp;</a></span>ReadTpm2FfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadTpm2FfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_oct_str256.html">OctStr256</a> const *&#160;</td>
+ <td class="paramname"><em>str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM2B_ECC_PARAMETER *&#160;</td>
+ <td class="paramname"><em>tpm_data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts serialized FfElement into TPM type. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">str</td><td>Serialized Intel(R) EPID SDK FfElement </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">tpm_data</td><td>tpm type data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a51507a6be8d7dfa167c9e6fb70e5ee57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51507a6be8d7dfa167c9e6fb70e5ee57">&#9670;&nbsp;</a></span>Tpm2toEpidHashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> Tpm2toEpidHashAlg </td>
+ <td>(</td>
+ <td class="paramtype">TPMI_ALG_HASH&#160;</td>
+ <td class="paramname"><em>tpm_hash_alg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Maps TPMI_ALG_HASH to HashAlg. </p>
+<p>Maps TPM hash code TPMI_ALG_HASH into HashAlg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_hash_alg</td><td>Code of the hash algorithm in TPM</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>HashAlg </dd></dl>
+
+</div>
+</div>
+<a id="a15e859e04c4b9c32a0970565846bdba3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15e859e04c4b9c32a0970565846bdba3">&#9670;&nbsp;</a></span>WriteTpm2EcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteTpm2EcPoint </td>
+ <td>(</td>
+ <td class="paramtype">TPM2B_ECC_POINT const *&#160;</td>
+ <td class="paramname"><em>tpm_point</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>p_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes TMP ECPoint to ECPoint string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_point</td><td>The TPM EC point to convert. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>The target string.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9f6a2b44857c038a2f90c12959640dea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9f6a2b44857c038a2f90c12959640dea">&#9670;&nbsp;</a></span>WriteTpm2FfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteTpm2FfElement </td>
+ <td>(</td>
+ <td class="paramtype">TPM2B_ECC_PARAMETER const *&#160;</td>
+ <td class="paramname"><em>tpm_data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_oct_str256.html">OctStr256</a> *&#160;</td>
+ <td class="paramname"><em>str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts TPM finite field element types into serialized FfElement. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_data</td><td>The TPM finite field data, typically TPM2B_DIGEST or TPM2B_ECC_PARAMETER. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">str</td><td>The target buffer.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="conversion_8c.html">conversion.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/conversion_8h.html b/doc/html/conversion_8h.html
new file mode 100644
index 0000000..ac5922a
--- /dev/null
+++ b/doc/html/conversion_8h.html
@@ -0,0 +1,340 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/conversion.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('conversion_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">conversion.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM-SDK data conversion interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae9c66465b8109d648704268fee8cf66b"><td class="memItemLeft" align="right" valign="top"><a id="ae9c66465b8109d648704268fee8cf66b"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#ae9c66465b8109d648704268fee8cf66b">TPM_ALG_SHA256</a>&#160;&#160;&#160;(TPM_ALG_ID)(0x000B)</td></tr>
+<tr class="memdesc:ae9c66465b8109d648704268fee8cf66b"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM code of SHA 256 algorithm. <br /></td></tr>
+<tr class="separator:ae9c66465b8109d648704268fee8cf66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85ee45736d112c61495faad4fea3dbbc"><td class="memItemLeft" align="right" valign="top"><a id="a85ee45736d112c61495faad4fea3dbbc"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a85ee45736d112c61495faad4fea3dbbc">TPM_ALG_SHA384</a>&#160;&#160;&#160;(TPM_ALG_ID)(0x000C)</td></tr>
+<tr class="memdesc:a85ee45736d112c61495faad4fea3dbbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM code of SHA 384 algorithm. <br /></td></tr>
+<tr class="separator:a85ee45736d112c61495faad4fea3dbbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8aecd28504c6511c02da2e78ecaaf5bd"><td class="memItemLeft" align="right" valign="top"><a id="a8aecd28504c6511c02da2e78ecaaf5bd"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a8aecd28504c6511c02da2e78ecaaf5bd">TPM_ALG_SHA512</a>&#160;&#160;&#160;(TPM_ALG_ID)(0x000D)</td></tr>
+<tr class="memdesc:a8aecd28504c6511c02da2e78ecaaf5bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM code of SHA 512 algorithm. <br /></td></tr>
+<tr class="separator:a8aecd28504c6511c02da2e78ecaaf5bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3622ddd0080bf63059d26887b6ee90ac"><td class="memItemLeft" align="right" valign="top"><a id="a3622ddd0080bf63059d26887b6ee90ac"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a3622ddd0080bf63059d26887b6ee90ac">TPM_ALG_NULL</a>&#160;&#160;&#160;(TPM_ALG_ID)(0x0010)</td></tr>
+<tr class="memdesc:a3622ddd0080bf63059d26887b6ee90ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM code of Null algorithm. <br /></td></tr>
+<tr class="separator:a3622ddd0080bf63059d26887b6ee90ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad08628a6bf33154c1029a32e8b83325f"><td class="memItemLeft" align="right" valign="top">TPMI_ALG_HASH&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#ad08628a6bf33154c1029a32e8b83325f">EpidtoTpm2HashAlg</a> (<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ad08628a6bf33154c1029a32e8b83325f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps HashAlg to TPM type. <a href="#ad08628a6bf33154c1029a32e8b83325f">More...</a><br /></td></tr>
+<tr class="separator:ad08628a6bf33154c1029a32e8b83325f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a51507a6be8d7dfa167c9e6fb70e5ee57">Tpm2toEpidHashAlg</a> (TPMI_ALG_HASH tpm_hash_alg)</td></tr>
+<tr class="memdesc:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps TPMI_ALG_HASH to HashAlg. <a href="#a51507a6be8d7dfa167c9e6fb70e5ee57">More...</a><br /></td></tr>
+<tr class="separator:a51507a6be8d7dfa167c9e6fb70e5ee57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8243faa9ef46d90b936c7dace421e10e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a8243faa9ef46d90b936c7dace421e10e">ReadTpm2FfElement</a> (<a class="el" href="struct_oct_str256.html">OctStr256</a> const *str, TPM2B_ECC_PARAMETER *tpm_data)</td></tr>
+<tr class="memdesc:a8243faa9ef46d90b936c7dace421e10e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts serialized FfElement into TPM type. <a href="#a8243faa9ef46d90b936c7dace421e10e">More...</a><br /></td></tr>
+<tr class="separator:a8243faa9ef46d90b936c7dace421e10e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f6a2b44857c038a2f90c12959640dea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a9f6a2b44857c038a2f90c12959640dea">WriteTpm2FfElement</a> (TPM2B_ECC_PARAMETER const *tpm_data, <a class="el" href="struct_oct_str256.html">OctStr256</a> *str)</td></tr>
+<tr class="memdesc:a9f6a2b44857c038a2f90c12959640dea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts TPM finite field element types into serialized FfElement. <a href="#a9f6a2b44857c038a2f90c12959640dea">More...</a><br /></td></tr>
+<tr class="separator:a9f6a2b44857c038a2f90c12959640dea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acff82e14f6287ec2d4676a3f8cd38a57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#acff82e14f6287ec2d4676a3f8cd38a57">ReadTpm2EcPoint</a> (<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *p_str, TPM2B_ECC_POINT *tpm_point)</td></tr>
+<tr class="memdesc:acff82e14f6287ec2d4676a3f8cd38a57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts ECPoint string to TMP ECPoint structure. <a href="#acff82e14f6287ec2d4676a3f8cd38a57">More...</a><br /></td></tr>
+<tr class="separator:acff82e14f6287ec2d4676a3f8cd38a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e859e04c4b9c32a0970565846bdba3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html#a15e859e04c4b9c32a0970565846bdba3">WriteTpm2EcPoint</a> (TPM2B_ECC_POINT const *tpm_point, <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *p_str)</td></tr>
+<tr class="memdesc:a15e859e04c4b9c32a0970565846bdba3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes TMP ECPoint to ECPoint string. <a href="#a15e859e04c4b9c32a0970565846bdba3">More...</a><br /></td></tr>
+<tr class="separator:a15e859e04c4b9c32a0970565846bdba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM-SDK data conversion interface. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ad08628a6bf33154c1029a32e8b83325f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad08628a6bf33154c1029a32e8b83325f">&#9670;&nbsp;</a></span>EpidtoTpm2HashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">TPMI_ALG_HASH EpidtoTpm2HashAlg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Maps HashAlg to TPM type. </p>
+<p>Maps Intel(R) EPID SDK HashAlg into TPMI_ALG_HASH.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>Code of the hash algorithm </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>TPMI_ALG_HASH </dd></dl>
+
+</div>
+</div>
+<a id="acff82e14f6287ec2d4676a3f8cd38a57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acff82e14f6287ec2d4676a3f8cd38a57">&#9670;&nbsp;</a></span>ReadTpm2EcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadTpm2EcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>p_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM2B_ECC_POINT *&#160;</td>
+ <td class="paramname"><em>tpm_point</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts ECPoint string to TMP ECPoint structure. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>The serialized EcPoint to convert. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">tpm_point</td><td>The TPM EC point representation.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8243faa9ef46d90b936c7dace421e10e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8243faa9ef46d90b936c7dace421e10e">&#9670;&nbsp;</a></span>ReadTpm2FfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadTpm2FfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_oct_str256.html">OctStr256</a> const *&#160;</td>
+ <td class="paramname"><em>str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM2B_ECC_PARAMETER *&#160;</td>
+ <td class="paramname"><em>tpm_data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts serialized FfElement into TPM type. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">str</td><td>Serialized Intel(R) EPID SDK FfElement </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">tpm_data</td><td>tpm type data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a51507a6be8d7dfa167c9e6fb70e5ee57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51507a6be8d7dfa167c9e6fb70e5ee57">&#9670;&nbsp;</a></span>Tpm2toEpidHashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> Tpm2toEpidHashAlg </td>
+ <td>(</td>
+ <td class="paramtype">TPMI_ALG_HASH&#160;</td>
+ <td class="paramname"><em>tpm_hash_alg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Maps TPMI_ALG_HASH to HashAlg. </p>
+<p>Maps TPM hash code TPMI_ALG_HASH into HashAlg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_hash_alg</td><td>Code of the hash algorithm in TPM</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>HashAlg </dd></dl>
+
+</div>
+</div>
+<a id="a15e859e04c4b9c32a0970565846bdba3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15e859e04c4b9c32a0970565846bdba3">&#9670;&nbsp;</a></span>WriteTpm2EcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteTpm2EcPoint </td>
+ <td>(</td>
+ <td class="paramtype">TPM2B_ECC_POINT const *&#160;</td>
+ <td class="paramname"><em>tpm_point</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>p_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes TMP ECPoint to ECPoint string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_point</td><td>The TPM EC point to convert. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>The target string.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9f6a2b44857c038a2f90c12959640dea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9f6a2b44857c038a2f90c12959640dea">&#9670;&nbsp;</a></span>WriteTpm2FfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteTpm2FfElement </td>
+ <td>(</td>
+ <td class="paramtype">TPM2B_ECC_PARAMETER const *&#160;</td>
+ <td class="paramname"><em>tpm_data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_oct_str256.html">OctStr256</a> *&#160;</td>
+ <td class="paramname"><em>str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts TPM finite field element types into serialized FfElement. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">tpm_data</td><td>The TPM finite field data, typically TPM2B_DIGEST or TPM2B_ECC_PARAMETER. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">str</td><td>The target buffer.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="conversion_8h.html">conversion.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/createprimary_8c.html b/doc/html/createprimary_8c.html
new file mode 100644
index 0000000..fae9bbe
--- /dev/null
+++ b/doc/html/createprimary_8c.html
@@ -0,0 +1,139 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/createprimary.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('createprimary_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">createprimary.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM2_CreatePrimary command implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="createprimary_8h.html">epid/member/tpm2/createprimary.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="conversion_8h.html">epid/member/tpm2/ibm_tss/conversion.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+<code>#include &quot;tss2/TPM_Types.h&quot;</code><br />
+<code>#include &quot;tss2/tss.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="createprimary_8c.html#a01df38cbb1c7c7986dadefcc1295bb9e">Tpm2CreatePrimary</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *p_str)</td></tr>
+<tr class="memdesc:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates Primary key. <a href="#a01df38cbb1c7c7986dadefcc1295bb9e">More...</a><br /></td></tr>
+<tr class="separator:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM2_CreatePrimary command implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a01df38cbb1c7c7986dadefcc1295bb9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01df38cbb1c7c7986dadefcc1295bb9e">&#9670;&nbsp;</a></span>Tpm2CreatePrimary()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2CreatePrimary </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>p_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates Primary key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>TPM context. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">p_str</td><td>Primary key: g1^f </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="createprimary_8c.html">createprimary.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/createprimary_8h.html b/doc/html/createprimary_8h.html
new file mode 100644
index 0000000..c219b76
--- /dev/null
+++ b/doc/html/createprimary_8h.html
@@ -0,0 +1,133 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/createprimary.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('createprimary_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">createprimary.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM2_CreatePrimary command interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="createprimary_8h.html#a01df38cbb1c7c7986dadefcc1295bb9e">Tpm2CreatePrimary</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *p_str)</td></tr>
+<tr class="memdesc:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates Primary key. <a href="#a01df38cbb1c7c7986dadefcc1295bb9e">More...</a><br /></td></tr>
+<tr class="separator:a01df38cbb1c7c7986dadefcc1295bb9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM2_CreatePrimary command interface. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a01df38cbb1c7c7986dadefcc1295bb9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01df38cbb1c7c7986dadefcc1295bb9e">&#9670;&nbsp;</a></span>Tpm2CreatePrimary()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2CreatePrimary </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>p_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates Primary key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>TPM context. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">p_str</td><td>Primary key: g1^f </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="createprimary_8h.html">createprimary.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
new file mode 100644
index 0000000..28c20ed
--- /dev/null
+++ b/doc/html/deprecated.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Deprecated List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('deprecated.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Deprecated List </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><dl class="reflist">
+<dt><a class="anchor" id="_deprecated000001"></a>Global <a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">EpidMemberCreate</a> (<a class="el" href="struct_member_params.html" title="Software only specific member parameters. ">MemberParams</a> const *params, MemberCtx **ctx)</dt>
+<dd>This API has been superseded by <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> and <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>. </dd>
+<dt><a class="anchor" id="_deprecated000002"></a>Global <a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">EpidMemberDelete</a> (MemberCtx **ctx)</dt>
+<dd>This API has been superseded by <a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d" title="De-initializes an existing member context buffer. ">EpidMemberDeinit</a>.</dd>
+</dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_02c945662023679b89476bd7126bc985.html b/doc/html/dir_02c945662023679b89476bd7126bc985.html
new file mode 100644
index 0000000..768288a
--- /dev/null
+++ b/doc/html/dir_02c945662023679b89476bd7126bc985.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/verifier Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_02c945662023679b89476bd7126bc985.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">verifier Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><p>Verifier functionality. </p>
+
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:verifier_2api_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="verifier_2api_8h.html">api.h</a></td></tr>
+<tr class="memdesc:verifier_2api_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID SDK verifier API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Verifier functionality. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_02c945662023679b89476bd7126bc985.html">verifier</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_0d59f1b8006345e373e07b4691e0da76.html b/doc/html/dir_0d59f1b8006345e373e07b4691e0da76.html
new file mode 100644
index 0000000..78865d8
--- /dev/null
+++ b/doc/html/dir_0d59f1b8006345e373e07b4691e0da76.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2 Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_0d59f1b8006345e373e07b4691e0da76.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">tpm2 Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:commit_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="commit_8h.html">commit.h</a></td></tr>
+<tr class="memdesc:commit_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM Commit API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:context_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="context_8h.html">context.h</a></td></tr>
+<tr class="memdesc:context_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:createprimary_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="createprimary_8h.html">createprimary.h</a></td></tr>
+<tr class="memdesc:createprimary_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM2_CreatePrimary command interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:getrandom_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="getrandom_8h.html">getrandom.h</a></td></tr>
+<tr class="memdesc:getrandom_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:load__external_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="load__external_8h.html">load_external.h</a></td></tr>
+<tr class="memdesc:load__external_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nv_8h.html">nv.h</a></td></tr>
+<tr class="memdesc:nv_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM non volatile memory API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sign_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sign_8h.html">sign.h</a></td></tr>
+<tr class="memdesc:sign_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK TPM Sign API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_12b90d9c027aaf878a834df729679a56.html b/doc/html/dir_12b90d9c027aaf878a834df729679a56.html
new file mode 100644
index 0000000..57bbab5
--- /dev/null
+++ b/doc/html/dir_12b90d9c027aaf878a834df729679a56.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_12b90d9c027aaf878a834df729679a56.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">epid Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><p>Core Intel&reg; EPID functionality. </p>
+
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_f6bef457d5f671b6e774bfccc16651f6"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></td></tr>
+<tr class="memdesc:dir_f6bef457d5f671b6e774bfccc16651f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Common code shared between core sub-components. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_512d3e62841a8535b716ec4cf8b9e950"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></td></tr>
+<tr class="memdesc:dir_512d3e62841a8535b716ec4cf8b9e950"><td class="mdescLeft">&#160;</td><td class="mdescRight">Member functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_02c945662023679b89476bd7126bc985"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_02c945662023679b89476bd7126bc985.html">verifier</a></td></tr>
+<tr class="memdesc:dir_02c945662023679b89476bd7126bc985"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifier functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Core Intel&reg; EPID functionality. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html b/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html
new file mode 100644
index 0000000..f1e699c
--- /dev/null
+++ b/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_512d3e62841a8535b716ec4cf8b9e950.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">member Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><p>Member functionality. </p>
+
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_ea12d375fc1eb79df248c0adf953af4f"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:member_2api_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="member_2api_8h.html">api.h</a></td></tr>
+<tr class="memdesc:member_2api_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID SDK member API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:software__member_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="software__member_8h.html">software_member.h</a></td></tr>
+<tr class="memdesc:software__member_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Member creation parameters for software only implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tpm__member_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpm__member_8h.html">tpm_member.h</a></td></tr>
+<tr class="memdesc:tpm__member_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Member creation parameters for TPM implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Member functionality. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html b/doc/html/dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html
new file mode 100644
index 0000000..cb1a6a3
--- /dev/null
+++ b/doc/html/dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html
@@ -0,0 +1,128 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">math Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:efq_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html">efq.h</a></td></tr>
+<tr class="memdesc:efq_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of EFq math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:efq2_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html">efq2.h</a></td></tr>
+<tr class="memdesc:efq2_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of EFq2 math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html">fp.h</a></td></tr>
+<tr class="memdesc:fp_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Fp math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fq_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html">fq.h</a></td></tr>
+<tr class="memdesc:fq_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Fq math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fq12_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html">fq12.h</a></td></tr>
+<tr class="memdesc:fq12_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Fq12 math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fq2_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html">fq2.h</a></td></tr>
+<tr class="memdesc:fq2_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Fq2 math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fq6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html">fq6.h</a></td></tr>
+<tr class="memdesc:fq6_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Fq6 math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:hashwrap_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hashwrap_8h.html">hashwrap.h</a></td></tr>
+<tr class="memdesc:hashwrap_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decleration of hash wrap function. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mathdefs_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mathdefs_8h.html">mathdefs.h</a></td></tr>
+<tr class="memdesc:mathdefs_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Common public definitions for math headers. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mathtypes_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mathtypes_8h.html">mathtypes.h</a></td></tr>
+<tr class="memdesc:mathtypes_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of math types in tiny Intel(R) EPID. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:member_2tiny_2math_2pairing_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="member_2tiny_2math_2pairing_8h.html">pairing.h</a></td></tr>
+<tr class="memdesc:member_2tiny_2math_2pairing_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of pairing math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:serialize_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html">serialize.h</a></td></tr>
+<tr class="memdesc:serialize_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of de/serialize functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sha256_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html">sha256.h</a></td></tr>
+<tr class="memdesc:sha256_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Interface to a SHA-256 implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sha512_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html">sha512.h</a></td></tr>
+<tr class="memdesc:sha512_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Interface to a SHA-512 implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:vli_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html">vli.h</a></td></tr>
+<tr class="memdesc:vli_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Definition of Large Integer math. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_a32be19bc88f3d7aac6b7249da379f26.html b/doc/html/dir_a32be19bc88f3d7aac6b7249da379f26.html
new file mode 100644
index 0000000..7fd404f
--- /dev/null
+++ b/doc/html/dir_a32be19bc88f3d7aac6b7249da379f26.html
@@ -0,0 +1,89 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/1.1 Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_a32be19bc88f3d7aac6b7249da379f26.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">1.1 Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:1_81_2file__parser_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="1_81_2file__parser_8h.html">file_parser.h</a></td></tr>
+<tr class="memdesc:1_81_2file__parser_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 issuer material parsing utilities. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:1_81_2types_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="1_81_2types_8h.html">types.h</a></td></tr>
+<tr class="memdesc:1_81_2types_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK data types for Intel(R) EPID 1.1. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_a32be19bc88f3d7aac6b7249da379f26.html">1.1</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html b/doc/html/dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html
new file mode 100644
index 0000000..114d4ce
--- /dev/null
+++ b/doc/html/dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html
@@ -0,0 +1,89 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/stdlib Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">stdlib Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:endian_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="endian_8h.html">endian.h</a></td></tr>
+<tr class="memdesc:endian_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert values between host and big-/little-endian byte order. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tiny__stdlib_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tiny__stdlib_8h.html">tiny_stdlib.h</a></td></tr>
+<tr class="memdesc:tiny__stdlib_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tiny portable implementations of standard library functions. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html">stdlib</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_b7525369f2fbc378c6814b573b9a2bc3.html b/doc/html/dir_b7525369f2fbc378c6814b573b9a2bc3.html
new file mode 100644
index 0000000..b180c6a
--- /dev/null
+++ b/doc/html/dir_b7525369f2fbc378c6814b573b9a2bc3.html
@@ -0,0 +1,119 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_b7525369f2fbc378c6814b573b9a2bc3.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">ibm_tss Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:commit_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="commit_8c.html">commit.c</a></td></tr>
+<tr class="memdesc:commit_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tpm2Commit implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:context_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="context_8c.html">context.c</a></td></tr>
+<tr class="memdesc:context_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM context implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:conversion_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8c.html">conversion.c</a></td></tr>
+<tr class="memdesc:conversion_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM-SDK data conversion implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:conversion_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversion_8h.html">conversion.h</a></td></tr>
+<tr class="memdesc:conversion_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM-SDK data conversion interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:createprimary_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="createprimary_8c.html">createprimary.c</a></td></tr>
+<tr class="memdesc:createprimary_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM2_CreatePrimary command implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:getrandom_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="getrandom_8c.html">getrandom.c</a></td></tr>
+<tr class="memdesc:getrandom_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM2_GetRandom command implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:load__external_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="load__external_8c.html">load_external.c</a></td></tr>
+<tr class="memdesc:load__external_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM2_LoadExternal command implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nv_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nv_8c.html">nv.c</a></td></tr>
+<tr class="memdesc:nv_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TSS NV API implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:printtss_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printtss_8c.html">printtss.c</a></td></tr>
+<tr class="memdesc:printtss_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM context implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:printtss_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printtss_8h.html">printtss.h</a></td></tr>
+<tr class="memdesc:printtss_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM log error prints. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sign_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sign_8c.html">sign.c</a></td></tr>
+<tr class="memdesc:sign_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tpm2Sign implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:state_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="state_8h.html">state.h</a></td></tr>
+<tr class="memdesc:state_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM internal state. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_ea12d375fc1eb79df248c0adf953af4f.html b/doc/html/dir_ea12d375fc1eb79df248c0adf953af4f.html
new file mode 100644
index 0000000..9f73057
--- /dev/null
+++ b/doc/html/dir_ea12d375fc1eb79df248c0adf953af4f.html
@@ -0,0 +1,83 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_ea12d375fc1eb79df248c0adf953af4f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">tiny Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_ef364879bae02db2684040178ed9b186.html b/doc/html/dir_ef364879bae02db2684040178ed9b186.html
new file mode 100644
index 0000000..6f87ce8
--- /dev/null
+++ b/doc/html/dir_ef364879bae02db2684040178ed9b186.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/verifier/1.1 Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_ef364879bae02db2684040178ed9b186.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">1.1 Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:verifier_21_81_2api_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="verifier_21_81_2api_8h.html">api.h</a></td></tr>
+<tr class="memdesc:verifier_21_81_2api_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_02c945662023679b89476bd7126bc985.html">verifier</a></li><li class="navelem"><a class="el" href="dir_ef364879bae02db2684040178ed9b186.html">1.1</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html b/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html
new file mode 100644
index 0000000..91712ab
--- /dev/null
+++ b/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_f169ebf8da29290a918fa4b3f7151050.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">math Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><p>Math primitives. </p>
+
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:bignum_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bignum_8h.html">bignum.h</a></td></tr>
+<tr class="memdesc:bignum_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Big number interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ecdsa_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ecdsa_8h.html">ecdsa.h</a></td></tr>
+<tr class="memdesc:ecdsa_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Ecdsa interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ecgroup_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ecgroup_8h.html">ecgroup.h</a></td></tr>
+<tr class="memdesc:ecgroup_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Elliptic curve group interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:finitefield_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="finitefield_8h.html">finitefield.h</a></td></tr>
+<tr class="memdesc:finitefield_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finite field interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:hash_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hash_8h.html">hash.h</a></td></tr>
+<tr class="memdesc:hash_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash primitives. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:common_2math_2pairing_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_2math_2pairing_8h.html">pairing.h</a></td></tr>
+<tr class="memdesc:common_2math_2pairing_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pairing interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:printutils_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printutils_8h.html">printutils.h</a></td></tr>
+<tr class="memdesc:printutils_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Print helper interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tatepairing_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tatepairing_8h.html">tatepairing.h</a></td></tr>
+<tr class="memdesc:tatepairing_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Pairing interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Math primitives. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html b/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html
new file mode 100644
index 0000000..366666a
--- /dev/null
+++ b/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('dir_f6bef457d5f671b6e774bfccc16651f6.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">common Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><p>Common code shared between core sub-components. </p>
+
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_f169ebf8da29290a918fa4b3f7151050"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></td></tr>
+<tr class="memdesc:dir_f169ebf8da29290a918fa4b3f7151050"><td class="mdescLeft">&#160;</td><td class="mdescRight">Math primitives. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:bitsupplier_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bitsupplier_8h.html">bitsupplier.h</a></td></tr>
+<tr class="memdesc:bitsupplier_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Random data supplier interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:epiddefs_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="epiddefs_8h.html">epiddefs.h</a></td></tr>
+<tr class="memdesc:epiddefs_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Common SDK macro definitions. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:errors_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="errors_8h.html">errors.h</a></td></tr>
+<tr class="memdesc:errors_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Error reporting. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:file__parser_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="file__parser_8h.html">file_parser.h</a></td></tr>
+<tr class="memdesc:file__parser_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID issuer material parsing utilities. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:stdtypes_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stdtypes_8h.html">stdtypes.h</a></td></tr>
+<tr class="memdesc:stdtypes_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">C99 standard data types. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:types_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="types_8h.html">types.h</a></td></tr>
+<tr class="memdesc:types_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK data types. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Common code shared between core sub-components. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/doc.png b/doc/html/doc.png
new file mode 100644
index 0000000..17edabf
--- /dev/null
+++ b/doc/html/doc.png
Binary files differ
diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css
new file mode 100644
index 0000000..266c8b3
--- /dev/null
+++ b/doc/html/doxygen.css
@@ -0,0 +1,1596 @@
+/* The standard CSS for doxygen 1.8.14 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 0px;
+ margin: 4px 8px 4px 2px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.ah, span.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ margin-bottom: -1px;
+ background-image: url('nav_f.png');
+ background-repeat: repeat-x;
+ background-color: #E2E8F2;
+ line-height: 1.25;
+ font-weight: 300;
+ float:left;
+}
+
+.permalink
+{
+ font-size: 65%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-color: #DFE5F1;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #9CAFD4;
+ border-bottom: 1px solid #9CAFD4;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+.arrow {
+ color: #9CAFD4;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #728DC1;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ font-weight: 400;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.plantumlgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
+/* @group Markdown */
+
+/*
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTableHead tr {
+}
+
+table.markdownTableBodyLeft td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter {
+ text-align: center
+}
+*/
+
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+ text-align: center
+}
+
+
+/* @end */
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644
index 0000000..3ff17d8
--- /dev/null
+++ b/doc/html/doxygen.png
Binary files differ
diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js
new file mode 100644
index 0000000..c1ce122
--- /dev/null
+++ b/doc/html/dynsections.js
@@ -0,0 +1,120 @@
+/*
+ @licstart The following is the entire license notice for the
+ JavaScript code in this file.
+
+ Copyright (C) 1997-2017 by Dimitri van Heesch
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ @licend The above is the entire license notice
+ for the JavaScript code in this file
+ */
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+ a.html('&#9660;');
+ $(this).show();
+ } else if (l==level+1) {
+ i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+ a.html('&#9654;');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ // the clicked row
+ var currentRow = $('#row_'+id);
+
+ // all rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+ // only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() { return this.id.match(re); });
+
+ // first row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ // replace down arrow by right arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ currentRowSpans.filter(".arrow").html('&#9654;');
+ rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+ } else { // we are SHOWING
+ // replace right arrow by down arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+ currentRowSpans.filter(".arrow").html('&#9660;');
+ // replace down arrows by right arrows for child rows
+ var childRowsSpans = childRows.find("span");
+ childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ childRowsSpans.filter(".arrow").html('&#9654;');
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+/* @license-end */
diff --git a/doc/html/ecdsa_8h.html b/doc/html/ecdsa_8h.html
new file mode 100644
index 0000000..85141b8
--- /dev/null
+++ b/doc/html/ecdsa_8h.html
@@ -0,0 +1,100 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/ecdsa.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('ecdsa_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ecdsa.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Ecdsa interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0">EcdsaVerifyBuffer</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> buf, size_t buf_len, <a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a> const *pubkey, <a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> const *sig)</td></tr>
+<tr class="memdesc:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies authenticity of a digital signature over a buffer. <a href="group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0">More...</a><br /></td></tr>
+<tr class="separator:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef0e8a31e830fe9285b43a0969e6611a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a">EcdsaSignBuffer</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> buf, size_t buf_len, <a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a> const *privkey, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param, <a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> *sig)</td></tr>
+<tr class="memdesc:gaef0e8a31e830fe9285b43a0969e6611a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates ECDSA signature of buffer. <a href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a">More...</a><br /></td></tr>
+<tr class="separator:gaef0e8a31e830fe9285b43a0969e6611a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Ecdsa interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="ecdsa_8h.html">ecdsa.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/ecgroup_8h.html b/doc/html/ecgroup_8h.html
new file mode 100644
index 0000000..9ee2f8c
--- /dev/null
+++ b/doc/html/ecgroup_8h.html
@@ -0,0 +1,167 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/ecgroup.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('ecgroup_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ecgroup.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Elliptic curve group interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="bignum_8h.html">epid/common/math/bignum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a></td></tr>
+<tr class="memdesc:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="mdescLeft">&#160;</td><td class="mdescRight">Elliptic curve group over finite field. <br /></td></tr>
+<tr class="separator:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85c1d5e106031b385a6e23e598ac98fa"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a></td></tr>
+<tr class="memdesc:ga85c1d5e106031b385a6e23e598ac98fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point on elliptic curve over finite field. <br /></td></tr>
+<tr class="separator:ga85c1d5e106031b385a6e23e598ac98fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62">NewEcGroup</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *x, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *y, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *order, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *cofactor, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **g)</td></tr>
+<tr class="memdesc:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new EcGroup. <a href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62">More...</a><br /></td></tr>
+<tr class="separator:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7af276256c27610eda85ff432b846ea"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea">DeleteEcGroup</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **g)</td></tr>
+<tr class="memdesc:gab7af276256c27610eda85ff432b846ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated EcGroup. <a href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea">More...</a><br /></td></tr>
+<tr class="separator:gab7af276256c27610eda85ff432b846ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6417b0ce72ba96de00c329e322fec7fb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb">NewEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **p)</td></tr>
+<tr class="memdesc:ga6417b0ce72ba96de00c329e322fec7fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new EcPoint. <a href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb">More...</a><br /></td></tr>
+<tr class="separator:ga6417b0ce72ba96de00c329e322fec7fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7">DeleteEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **p)</td></tr>
+<tr class="memdesc:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated EcPoint. <a href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7">More...</a><br /></td></tr>
+<tr class="separator:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb">ReadEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> p_str, size_t strlen, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *p)</td></tr>
+<tr class="memdesc:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes an EcPoint from a string. <a href="group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb">More...</a><br /></td></tr>
+<tr class="separator:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb">WriteEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> p_str, size_t strlen)</td></tr>
+<tr class="memdesc:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes an EcPoint to a string. <a href="group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb">More...</a><br /></td></tr>
+<tr class="separator:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25c9013cc76907d73765eb7a96aa8c96"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96">EcMul</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga25c9013cc76907d73765eb7a96aa8c96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two elements in an elliptic curve group. <a href="group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96">More...</a><br /></td></tr>
+<tr class="separator:ga25c9013cc76907d73765eb7a96aa8c96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga01bf8d6fa60a2e445490966b3a06c270"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270">EcExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga01bf8d6fa60a2e445490966b3a06c270"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises a point in an elliptic curve group to a power. <a href="group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270">More...</a><br /></td></tr>
+<tr class="separator:ga01bf8d6fa60a2e445490966b3a06c270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57">EcSscmExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of EcExp. <a href="group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57">More...</a><br /></td></tr>
+<tr class="separator:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae96c38e004ccd2211290ad6e66415ec4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4">EcMultiExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gae96c38e004ccd2211290ad6e66415ec4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates elements in elliptic curve group. <a href="group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4">More...</a><br /></td></tr>
+<tr class="separator:gae96c38e004ccd2211290ad6e66415ec4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76d24378455eb96a3257fe8045c0993a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a">EcMultiExpBn</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga76d24378455eb96a3257fe8045c0993a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates elements in elliptic curve group. <a href="group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a">More...</a><br /></td></tr>
+<tr class="separator:ga76d24378455eb96a3257fe8045c0993a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4">EcSscmMultiExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of EcMultiExp. <a href="group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4">More...</a><br /></td></tr>
+<tr class="separator:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f96c43d14d24de0f7a5e214aef64196"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196">EcGetRandom</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_func_param, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga3f96c43d14d24de0f7a5e214aef64196"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates a random element from an elliptic curve group. <a href="group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196">More...</a><br /></td></tr>
+<tr class="separator:ga3f96c43d14d24de0f7a5e214aef64196"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga48ec5ae951c9f49d8d7d983234eea921"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921">EcInGroup</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> p_str, size_t strlen, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *in_group)</td></tr>
+<tr class="memdesc:ga48ec5ae951c9f49d8d7d983234eea921"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a point is in an elliptic curve group. <a href="group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921">More...</a><br /></td></tr>
+<tr class="separator:ga48ec5ae951c9f49d8d7d983234eea921"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad96a1498b85d28f71514b8f7b154d82"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82">Epid11EcHash</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gaad96a1498b85d28f71514b8f7b154d82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an Intel(R) EPID 1.1 element in an elliptic curve group. <a href="group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82">More...</a><br /></td></tr>
+<tr class="separator:gaad96a1498b85d28f71514b8f7b154d82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3067cc899e65e647390bb3bd1cabe4c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c">EcHash</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r, uint32_t *iterations)</td></tr>
+<tr class="memdesc:gac3067cc899e65e647390bb3bd1cabe4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an element in an elliptic curve group. <a href="group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c">More...</a><br /></td></tr>
+<tr class="separator:gac3067cc899e65e647390bb3bd1cabe4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8a6114a48214a327d4ec04fd25e5940e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e">EcMakePoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *x, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga8a6114a48214a327d4ec04fd25e5940e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets an EcPoint variable to a point on a curve. <a href="group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e">More...</a><br /></td></tr>
+<tr class="separator:ga8a6114a48214a327d4ec04fd25e5940e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b6d7a3398251e9352fb29ef4abef466"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466">EcInverse</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga0b6d7a3398251e9352fb29ef4abef466"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the additive inverse of an EcPoint. <a href="group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466">More...</a><br /></td></tr>
+<tr class="separator:ga0b6d7a3398251e9352fb29ef4abef466"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad3b3c63c48fa24e8dea07837b05bc061"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061">EcIsEqual</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_equal)</td></tr>
+<tr class="memdesc:gad3b3c63c48fa24e8dea07837b05bc061"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if two EcPoints are equal. <a href="group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061">More...</a><br /></td></tr>
+<tr class="separator:gad3b3c63c48fa24e8dea07837b05bc061"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210">EcIsIdentity</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_identity)</td></tr>
+<tr class="memdesc:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if an EcPoint is the identity element. <a href="group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210">More...</a><br /></td></tr>
+<tr class="separator:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Elliptic curve group interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="ecgroup_8h.html">ecgroup.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/efq2_8h.html b/doc/html/efq2_8h.html
new file mode 100644
index 0000000..4f9dcee
--- /dev/null
+++ b/doc/html/efq2_8h.html
@@ -0,0 +1,448 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/efq2.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('efq2_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">efq2.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of EFq2 math.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9181b09474d800c65fd89aee2c28ebab"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a9181b09474d800c65fd89aee2c28ebab">EFq2IsInf</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *in)</td></tr>
+<tr class="memdesc:a9181b09474d800c65fd89aee2c28ebab"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a point is infinity. <a href="#a9181b09474d800c65fd89aee2c28ebab">More...</a><br /></td></tr>
+<tr class="separator:a9181b09474d800c65fd89aee2c28ebab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1da3e171d605db6f5ea0a70dc01ac27"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#af1da3e171d605db6f5ea0a70dc01ac27">EFq2FromAffine</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *result, <a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *in)</td></tr>
+<tr class="memdesc:af1da3e171d605db6f5ea0a70dc01ac27"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert a point from Affine to Jacobi representation. <a href="#af1da3e171d605db6f5ea0a70dc01ac27">More...</a><br /></td></tr>
+<tr class="separator:af1da3e171d605db6f5ea0a70dc01ac27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a484e6af5efc2042d865999dac9489684"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a484e6af5efc2042d865999dac9489684">EFq2ToAffine</a> (<a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *in)</td></tr>
+<tr class="memdesc:a484e6af5efc2042d865999dac9489684"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert a point from Jacobi to Affine representation. <a href="#a484e6af5efc2042d865999dac9489684">More...</a><br /></td></tr>
+<tr class="separator:a484e6af5efc2042d865999dac9489684"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1db50d99360ed019ca4dcd2f9bcf210a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a1db50d99360ed019ca4dcd2f9bcf210a">EFq2Dbl</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *in)</td></tr>
+<tr class="memdesc:a1db50d99360ed019ca4dcd2f9bcf210a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Double a point in EFq2. <a href="#a1db50d99360ed019ca4dcd2f9bcf210a">More...</a><br /></td></tr>
+<tr class="separator:a1db50d99360ed019ca4dcd2f9bcf210a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6cbfb24b20b29b2e678e259aa6c0e2db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a6cbfb24b20b29b2e678e259aa6c0e2db">EFq2Add</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *left, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *right)</td></tr>
+<tr class="memdesc:a6cbfb24b20b29b2e678e259aa6c0e2db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two points in EFq2. <a href="#a6cbfb24b20b29b2e678e259aa6c0e2db">More...</a><br /></td></tr>
+<tr class="separator:a6cbfb24b20b29b2e678e259aa6c0e2db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a977bd074ed0dec943ad0cf19a01c0cf7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a977bd074ed0dec943ad0cf19a01c0cf7">EFq2Neg</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *in)</td></tr>
+<tr class="memdesc:a977bd074ed0dec943ad0cf19a01c0cf7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate a point on EFq2. <a href="#a977bd074ed0dec943ad0cf19a01c0cf7">More...</a><br /></td></tr>
+<tr class="separator:a977bd074ed0dec943ad0cf19a01c0cf7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ad678e3701e1211fa01ddc54f2bc5e4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a3ad678e3701e1211fa01ddc54f2bc5e4">EFq2MulSSCM</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *left, <a class="el" href="struct_fp_elem.html">FpElem</a> const *right)</td></tr>
+<tr class="memdesc:a3ad678e3701e1211fa01ddc54f2bc5e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two points in EFq. <a href="#a3ad678e3701e1211fa01ddc54f2bc5e4">More...</a><br /></td></tr>
+<tr class="separator:a3ad678e3701e1211fa01ddc54f2bc5e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2064ea9b48565a164314da4b487aaabd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a2064ea9b48565a164314da4b487aaabd">EFq2Eq</a> (<a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *left, <a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *right)</td></tr>
+<tr class="memdesc:a2064ea9b48565a164314da4b487aaabd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two points on EFq2 are equal. <a href="#a2064ea9b48565a164314da4b487aaabd">More...</a><br /></td></tr>
+<tr class="separator:a2064ea9b48565a164314da4b487aaabd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26c35eefbd1ee11a5d078c44d295ff5a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq2_8h.html#a26c35eefbd1ee11a5d078c44d295ff5a">EFq2OnCurve</a> (<a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *in)</td></tr>
+<tr class="memdesc:a26c35eefbd1ee11a5d078c44d295ff5a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a point is in EFq2. <a href="#a26c35eefbd1ee11a5d078c44d295ff5a">More...</a><br /></td></tr>
+<tr class="separator:a26c35eefbd1ee11a5d078c44d295ff5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of EFq2 math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a6cbfb24b20b29b2e678e259aa6c0e2db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6cbfb24b20b29b2e678e259aa6c0e2db">&#9670;&nbsp;</a></span>EFq2Add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFq2Add </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two points in EFq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1db50d99360ed019ca4dcd2f9bcf210a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1db50d99360ed019ca4dcd2f9bcf210a">&#9670;&nbsp;</a></span>EFq2Dbl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFq2Dbl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Double a point in EFq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to double. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2064ea9b48565a164314da4b487aaabd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2064ea9b48565a164314da4b487aaabd">&#9670;&nbsp;</a></span>EFq2Eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFq2Eq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two points on EFq2 are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="af1da3e171d605db6f5ea0a70dc01ac27"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1da3e171d605db6f5ea0a70dc01ac27">&#9670;&nbsp;</a></span>EFq2FromAffine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFq2FromAffine </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert a point from Affine to Jacobi representation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9181b09474d800c65fd89aee2c28ebab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9181b09474d800c65fd89aee2c28ebab">&#9670;&nbsp;</a></span>EFq2IsInf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFq2IsInf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a point is infinity. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the point to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the value is infinity. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a3ad678e3701e1211fa01ddc54f2bc5e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ad678e3701e1211fa01ddc54f2bc5e4">&#9670;&nbsp;</a></span>EFq2MulSSCM()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFq2MulSSCM </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two points in EFq. </p>
+<p>This function is mitigated against software side-channel attacks.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a977bd074ed0dec943ad0cf19a01c0cf7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a977bd074ed0dec943ad0cf19a01c0cf7">&#9670;&nbsp;</a></span>EFq2Neg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFq2Neg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate a point on EFq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a26c35eefbd1ee11a5d078c44d295ff5a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26c35eefbd1ee11a5d078c44d295ff5a">&#9670;&nbsp;</a></span>EFq2OnCurve()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFq2OnCurve </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a point is in EFq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the point to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the point is on the curve. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a484e6af5efc2042d865999dac9489684"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a484e6af5efc2042d865999dac9489684">&#9670;&nbsp;</a></span>EFq2ToAffine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFq2ToAffine </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert a point from Jacobi to Affine representation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on success, 0 on failure </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="efq2_8h.html">efq2.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/efq_8h.html b/doc/html/efq_8h.html
new file mode 100644
index 0000000..19f3e5d
--- /dev/null
+++ b/doc/html/efq_8h.html
@@ -0,0 +1,1146 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/efq.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('efq_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">efq.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of EFq math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a84e5231cee67eeba5b2a0f99088bc70e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a84e5231cee67eeba5b2a0f99088bc70e">EFqMulSSCM</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *base, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp)</td></tr>
+<tr class="memdesc:a84e5231cee67eeba5b2a0f99088bc70e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two points in EFq. <a href="#a84e5231cee67eeba5b2a0f99088bc70e">More...</a><br /></td></tr>
+<tr class="separator:a84e5231cee67eeba5b2a0f99088bc70e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8990ca0e19d8ed7b78958963e60948e2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a8990ca0e19d8ed7b78958963e60948e2">EFqAffineExp</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *base, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp)</td></tr>
+<tr class="memdesc:a8990ca0e19d8ed7b78958963e60948e2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate a point in EFq by an element of Fp. <a href="#a8990ca0e19d8ed7b78958963e60948e2">More...</a><br /></td></tr>
+<tr class="separator:a8990ca0e19d8ed7b78958963e60948e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2618ae4b4fc8f2838a6550abfb4448ca"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a2618ae4b4fc8f2838a6550abfb4448ca">EFqAffineMultiExp</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *base0, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp0, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *base1, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp1)</td></tr>
+<tr class="memdesc:a2618ae4b4fc8f2838a6550abfb4448ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum the results of exponentiating two points in EFq by elements of Fp. <a href="#a2618ae4b4fc8f2838a6550abfb4448ca">More...</a><br /></td></tr>
+<tr class="separator:a2618ae4b4fc8f2838a6550abfb4448ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbcd39b964e4fd685d1dba73ec110c86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#abbcd39b964e4fd685d1dba73ec110c86">EFqMultiExp</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *base0, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp0, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *base1, <a class="el" href="struct_fp_elem.html">FpElem</a> const *exp1)</td></tr>
+<tr class="memdesc:abbcd39b964e4fd685d1dba73ec110c86"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum the results of exponentiating two points in EFq by elements of Fp. <a href="#abbcd39b964e4fd685d1dba73ec110c86">More...</a><br /></td></tr>
+<tr class="separator:abbcd39b964e4fd685d1dba73ec110c86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6cf130d65a5f35237a88046faad43c0a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a6cf130d65a5f35237a88046faad43c0a">EFqAffineAdd</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *left, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *right)</td></tr>
+<tr class="memdesc:a6cf130d65a5f35237a88046faad43c0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two points in EFq. <a href="#a6cf130d65a5f35237a88046faad43c0a">More...</a><br /></td></tr>
+<tr class="separator:a6cf130d65a5f35237a88046faad43c0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a975f92abdaf431f2fb152fca84d468b3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a975f92abdaf431f2fb152fca84d468b3">EFqAffineDbl</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *in)</td></tr>
+<tr class="memdesc:a975f92abdaf431f2fb152fca84d468b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Double a point in EFq. <a href="#a975f92abdaf431f2fb152fca84d468b3">More...</a><br /></td></tr>
+<tr class="separator:a975f92abdaf431f2fb152fca84d468b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23b6331263b002e6e07d2be5216fd6e8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a23b6331263b002e6e07d2be5216fd6e8">EFqDbl</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:a23b6331263b002e6e07d2be5216fd6e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Double a point in EFq. <a href="#a23b6331263b002e6e07d2be5216fd6e8">More...</a><br /></td></tr>
+<tr class="separator:a23b6331263b002e6e07d2be5216fd6e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf04f5ec866fc77d0203beb8a8991f25"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#abf04f5ec866fc77d0203beb8a8991f25">EFqAdd</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *left, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *right)</td></tr>
+<tr class="memdesc:abf04f5ec866fc77d0203beb8a8991f25"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two points in EFq. <a href="#abf04f5ec866fc77d0203beb8a8991f25">More...</a><br /></td></tr>
+<tr class="separator:abf04f5ec866fc77d0203beb8a8991f25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40588e2618ed9a38043532785a8d5785"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a40588e2618ed9a38043532785a8d5785">EFqRand</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a40588e2618ed9a38043532785a8d5785"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a random point in EFq. <a href="#a40588e2618ed9a38043532785a8d5785">More...</a><br /></td></tr>
+<tr class="separator:a40588e2618ed9a38043532785a8d5785"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d1841f9e29bc604054536de7a4a861d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a7d1841f9e29bc604054536de7a4a861d">EFqSet</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *x, <a class="el" href="struct_fq_elem.html">FqElem</a> const *y)</td></tr>
+<tr class="memdesc:a7d1841f9e29bc604054536de7a4a861d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set a point's value. <a href="#a7d1841f9e29bc604054536de7a4a861d">More...</a><br /></td></tr>
+<tr class="separator:a7d1841f9e29bc604054536de7a4a861d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae38257cf97872a4fa855033ad44e2e10"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#ae38257cf97872a4fa855033ad44e2e10">EFqIsInf</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:ae38257cf97872a4fa855033ad44e2e10"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a point is infinity. <a href="#ae38257cf97872a4fa855033ad44e2e10">More...</a><br /></td></tr>
+<tr class="separator:ae38257cf97872a4fa855033ad44e2e10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97ce025667b076986a6d92b3d41a7827"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a97ce025667b076986a6d92b3d41a7827">EFqFromAffine</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *in)</td></tr>
+<tr class="memdesc:a97ce025667b076986a6d92b3d41a7827"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert a point from Affine to Jacobi representation. <a href="#a97ce025667b076986a6d92b3d41a7827">More...</a><br /></td></tr>
+<tr class="separator:a97ce025667b076986a6d92b3d41a7827"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf3f26e855b85e869cb80fae780a4e6a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#aaf3f26e855b85e869cb80fae780a4e6a">EFqToAffine</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:aaf3f26e855b85e869cb80fae780a4e6a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert a point from Jacobi to Affine representation. <a href="#aaf3f26e855b85e869cb80fae780a4e6a">More...</a><br /></td></tr>
+<tr class="separator:aaf3f26e855b85e869cb80fae780a4e6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f7309ab07d4d3e0556a32f1839ae6fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a0f7309ab07d4d3e0556a32f1839ae6fe">EFqNeg</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:a0f7309ab07d4d3e0556a32f1839ae6fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate a point on EFq. <a href="#a0f7309ab07d4d3e0556a32f1839ae6fe">More...</a><br /></td></tr>
+<tr class="separator:a0f7309ab07d4d3e0556a32f1839ae6fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7fbfe9d25cf08f4dcbd950cfb07471ff"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a7fbfe9d25cf08f4dcbd950cfb07471ff">EFqEq</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *left, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *right)</td></tr>
+<tr class="memdesc:a7fbfe9d25cf08f4dcbd950cfb07471ff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two points on EFq are equal. <a href="#a7fbfe9d25cf08f4dcbd950cfb07471ff">More...</a><br /></td></tr>
+<tr class="separator:a7fbfe9d25cf08f4dcbd950cfb07471ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf80ad8b8e3e506f4c46ec57de1c4846"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#abf80ad8b8e3e506f4c46ec57de1c4846">EFqHash</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, unsigned char const *msg, size_t len, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hashalg)</td></tr>
+<tr class="memdesc:abf80ad8b8e3e506f4c46ec57de1c4846"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to a point on EFq. <a href="#abf80ad8b8e3e506f4c46ec57de1c4846">More...</a><br /></td></tr>
+<tr class="separator:abf80ad8b8e3e506f4c46ec57de1c4846"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a7863639a5b96d44522d579d7d32e40"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a7a7863639a5b96d44522d579d7d32e40">EFqCp</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *result, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *in)</td></tr>
+<tr class="memdesc:a7a7863639a5b96d44522d579d7d32e40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy a point's value. <a href="#a7a7863639a5b96d44522d579d7d32e40">More...</a><br /></td></tr>
+<tr class="separator:a7a7863639a5b96d44522d579d7d32e40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfc458ea689ea3aa637c9c817dfa44c5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#acfc458ea689ea3aa637c9c817dfa44c5">EFqEqAffine</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *left, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *right)</td></tr>
+<tr class="memdesc:acfc458ea689ea3aa637c9c817dfa44c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two points on EFq are equal. <a href="#acfc458ea689ea3aa637c9c817dfa44c5">More...</a><br /></td></tr>
+<tr class="separator:acfc458ea689ea3aa637c9c817dfa44c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b2fcab6bc74601f9c302c5b34400ae4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a9b2fcab6bc74601f9c302c5b34400ae4">EFqCondSet</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *true_val, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *false_val, int truth_val)</td></tr>
+<tr class="memdesc:a9b2fcab6bc74601f9c302c5b34400ae4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Conditionally Set a point's value to one of two values. <a href="#a9b2fcab6bc74601f9c302c5b34400ae4">More...</a><br /></td></tr>
+<tr class="separator:a9b2fcab6bc74601f9c302c5b34400ae4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a31d069739c4da17011280a8ae6354a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a1a31d069739c4da17011280a8ae6354a">EFqJCp</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:a1a31d069739c4da17011280a8ae6354a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy a point's value. <a href="#a1a31d069739c4da17011280a8ae6354a">More...</a><br /></td></tr>
+<tr class="separator:a1a31d069739c4da17011280a8ae6354a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73fd77b7cc14c0decd95fd294b5b250c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a73fd77b7cc14c0decd95fd294b5b250c">EFqInf</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result)</td></tr>
+<tr class="memdesc:a73fd77b7cc14c0decd95fd294b5b250c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set an element's value to infinity. <a href="#a73fd77b7cc14c0decd95fd294b5b250c">More...</a><br /></td></tr>
+<tr class="separator:a73fd77b7cc14c0decd95fd294b5b250c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81470fed188d5043f89b6b8ab6031a42"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a81470fed188d5043f89b6b8ab6031a42">EFqOnCurve</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *in)</td></tr>
+<tr class="memdesc:a81470fed188d5043f89b6b8ab6031a42"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a point is on EFq. <a href="#a81470fed188d5043f89b6b8ab6031a42">More...</a><br /></td></tr>
+<tr class="separator:a81470fed188d5043f89b6b8ab6031a42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada751265a36ee3236fce90105a62909e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#ada751265a36ee3236fce90105a62909e">EFqJOnCurve</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *in)</td></tr>
+<tr class="memdesc:ada751265a36ee3236fce90105a62909e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a point is on EFq. <a href="#ada751265a36ee3236fce90105a62909e">More...</a><br /></td></tr>
+<tr class="separator:ada751265a36ee3236fce90105a62909e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15bda5d411f7c6d602994e6444034414"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="efq_8h.html#a15bda5d411f7c6d602994e6444034414">EFqJRand</a> (<a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a15bda5d411f7c6d602994e6444034414"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a random point in EFq. <a href="#a15bda5d411f7c6d602994e6444034414">More...</a><br /></td></tr>
+<tr class="separator:a15bda5d411f7c6d602994e6444034414"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of EFq math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="abf04f5ec866fc77d0203beb8a8991f25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf04f5ec866fc77d0203beb8a8991f25">&#9670;&nbsp;</a></span>EFqAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two points in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6cf130d65a5f35237a88046faad43c0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6cf130d65a5f35237a88046faad43c0a">&#9670;&nbsp;</a></span>EFqAffineAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqAffineAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two points in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a975f92abdaf431f2fb152fca84d468b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a975f92abdaf431f2fb152fca84d468b3">&#9670;&nbsp;</a></span>EFqAffineDbl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqAffineDbl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Double a point in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to double. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a8990ca0e19d8ed7b78958963e60948e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8990ca0e19d8ed7b78958963e60948e2">&#9670;&nbsp;</a></span>EFqAffineExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqAffineExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate a point in EFq by an element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise.</dd>
+<dd>
+1 on success, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="a2618ae4b4fc8f2838a6550abfb4448ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2618ae4b4fc8f2838a6550abfb4448ca">&#9670;&nbsp;</a></span>EFqAffineMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqAffineMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>base0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>base1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp1</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sum the results of exponentiating two points in EFq by elements of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base0</td><td>the first base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp0</td><td>the first exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base1</td><td>the second base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp1</td><td>the second exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a9b2fcab6bc74601f9c302c5b34400ae4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b2fcab6bc74601f9c302c5b34400ae4">&#9670;&nbsp;</a></span>EFqCondSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqCondSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>true_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>false_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>truth_val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Conditionally Set a point's value to one of two values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">true_val</td><td>value to set if condition is true. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">false_val</td><td>value to set if condition is false. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">truth_val</td><td>value of condition. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7a7863639a5b96d44522d579d7d32e40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a7863639a5b96d44522d579d7d32e40">&#9670;&nbsp;</a></span>EFqCp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqCp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy a point's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a23b6331263b002e6e07d2be5216fd6e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23b6331263b002e6e07d2be5216fd6e8">&#9670;&nbsp;</a></span>EFqDbl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqDbl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Double a point in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to double. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7fbfe9d25cf08f4dcbd950cfb07471ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7fbfe9d25cf08f4dcbd950cfb07471ff">&#9670;&nbsp;</a></span>EFqEq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqEq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two points on EFq are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="acfc458ea689ea3aa637c9c817dfa44c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acfc458ea689ea3aa637c9c817dfa44c5">&#9670;&nbsp;</a></span>EFqEqAffine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqEqAffine </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two points on EFq are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a97ce025667b076986a6d92b3d41a7827"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97ce025667b076986a6d92b3d41a7827">&#9670;&nbsp;</a></span>EFqFromAffine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqFromAffine </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert a point from Affine to Jacobi representation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="abf80ad8b8e3e506f4c46ec57de1c4846"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf80ad8b8e3e506f4c46ec57de1c4846">&#9670;&nbsp;</a></span>EFqHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hashalg</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes an arbitrary message to a point on EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>buffer to reinterpret. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>length of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hashalg</td><td>hash algorithm to use. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a73fd77b7cc14c0decd95fd294b5b250c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73fd77b7cc14c0decd95fd294b5b250c">&#9670;&nbsp;</a></span>EFqInf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqInf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set an element's value to infinity. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>element to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae38257cf97872a4fa855033ad44e2e10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae38257cf97872a4fa855033ad44e2e10">&#9670;&nbsp;</a></span>EFqIsInf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqIsInf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a point is infinity. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the point to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the value is infinity. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a1a31d069739c4da17011280a8ae6354a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a31d069739c4da17011280a8ae6354a">&#9670;&nbsp;</a></span>EFqJCp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqJCp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy a point's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ada751265a36ee3236fce90105a62909e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada751265a36ee3236fce90105a62909e">&#9670;&nbsp;</a></span>EFqJOnCurve()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqJOnCurve </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a point is on EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the point to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the point is on the curve. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a15bda5d411f7c6d602994e6444034414"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15bda5d411f7c6d602994e6444034414">&#9670;&nbsp;</a></span>EFqJRand()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqJRand </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a random point in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a84e5231cee67eeba5b2a0f99088bc70e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84e5231cee67eeba5b2a0f99088bc70e">&#9670;&nbsp;</a></span>EFqMulSSCM()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqMulSSCM </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two points in EFq. </p>
+<p>This function is mitigated against software side-channel attacks.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="abbcd39b964e4fd685d1dba73ec110c86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbcd39b964e4fd685d1dba73ec110c86">&#9670;&nbsp;</a></span>EFqMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>base0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>base1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>exp1</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sum the results of exponentiating two points in EFq by elements of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base0</td><td>the first base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp0</td><td>the first exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base1</td><td>the second base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp1</td><td>the second exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on success, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="a0f7309ab07d4d3e0556a32f1839ae6fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f7309ab07d4d3e0556a32f1839ae6fe">&#9670;&nbsp;</a></span>EFqNeg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqNeg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate a point on EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a81470fed188d5043f89b6b8ab6031a42"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81470fed188d5043f89b6b8ab6031a42">&#9670;&nbsp;</a></span>EFqOnCurve()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqOnCurve </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a point is on EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the point to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the point is on the curve. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a40588e2618ed9a38043532785a8d5785"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40588e2618ed9a38043532785a8d5785">&#9670;&nbsp;</a></span>EFqRand()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqRand </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a random point in EFq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a7d1841f9e29bc604054536de7a4a861d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d1841f9e29bc604054536de7a4a861d">&#9670;&nbsp;</a></span>EFqSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EFqSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>y</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set a point's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">x</td><td>value to set. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">y</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaf3f26e855b85e869cb80fae780a4e6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf3f26e855b85e869cb80fae780a4e6a">&#9670;&nbsp;</a></span>EFqToAffine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int EFqToAffine </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert a point from Jacobi to Affine representation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="efq_8h.html">efq.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/endian_8h.html b/doc/html/endian_8h.html
new file mode 100644
index 0000000..e9ed3a8
--- /dev/null
+++ b/doc/html/endian_8h.html
@@ -0,0 +1,138 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/stdlib/endian.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('endian_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle">
+<div class="title">endian.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Convert values between host and big-/little-endian byte order.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a48127d3bd550dacd707b58a637b05393"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="endian_8h.html#a48127d3bd550dacd707b58a637b05393">be32toh</a>(big_endian_32bits)</td></tr>
+<tr class="memdesc:a48127d3bd550dacd707b58a637b05393"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transform big endian uint32_t to host uint32_t. <a href="#a48127d3bd550dacd707b58a637b05393">More...</a><br /></td></tr>
+<tr class="separator:a48127d3bd550dacd707b58a637b05393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab004b68a63ea32dcd67fbe597263120b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="endian_8h.html#ab004b68a63ea32dcd67fbe597263120b">htobe32</a>(host_32bits)</td></tr>
+<tr class="memdesc:ab004b68a63ea32dcd67fbe597263120b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transform host uint32_t to big endian uint32_t. <a href="#ab004b68a63ea32dcd67fbe597263120b">More...</a><br /></td></tr>
+<tr class="separator:ab004b68a63ea32dcd67fbe597263120b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Convert values between host and big-/little-endian byte order. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a48127d3bd550dacd707b58a637b05393"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a48127d3bd550dacd707b58a637b05393">&#9670;&nbsp;</a></span>be32toh</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define be32toh</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">big_endian_32bits</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((uint32_t)(((((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;(big_endian_32bits))[0]) &lt;&lt; 24) + \</div><div class="line"> ((((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;(big_endian_32bits))[1]) &lt;&lt; 16) + \</div><div class="line"> ((((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;(big_endian_32bits))[2]) &lt;&lt; 8) + \</div><div class="line"> (((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;(big_endian_32bits))[3])))</div></div><!-- fragment -->
+<p>Transform big endian uint32_t to host uint32_t. </p>
+
+</div>
+</div>
+<a id="ab004b68a63ea32dcd67fbe597263120b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab004b68a63ea32dcd67fbe597263120b">&#9670;&nbsp;</a></span>htobe32</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define htobe32</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">host_32bits</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(uint32_t)(((((uint32_t)(host_32bits)) &amp; 0xFF) &lt;&lt; 24) | \</div><div class="line"> ((((uint32_t)(host_32bits)) &amp; 0xFF00) &lt;&lt; 8) | \</div><div class="line"> ((((uint32_t)(host_32bits)) &amp; 0xFF0000) &gt;&gt; 8) | \</div><div class="line"> ((((uint32_t)(host_32bits)) &amp; 0xFF000000) &gt;&gt; 24))</div></div><!-- fragment -->
+<p>Transform host uint32_t to big endian uint32_t. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html">stdlib</a></li><li class="navelem"><a class="el" href="endian_8h.html">endian.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/epid__overview_8dox.html b/doc/html/epid__overview_8dox.html
new file mode 100644
index 0000000..0116c6e
--- /dev/null
+++ b/doc/html/epid__overview_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/epid_overview.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('epid__overview_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/epid_overview.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="epid__overview_8dox.html">epid_overview.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/epid_diagram_generating_member_private_keys.png b/doc/html/epid_diagram_generating_member_private_keys.png
new file mode 100644
index 0000000..6b92763
--- /dev/null
+++ b/doc/html/epid_diagram_generating_member_private_keys.png
Binary files differ
diff --git a/doc/html/epid_diagram_group.png b/doc/html/epid_diagram_group.png
new file mode 100644
index 0000000..2caf441
--- /dev/null
+++ b/doc/html/epid_diagram_group.png
Binary files differ
diff --git a/doc/html/epid_diagram_group_public_key_and_issuing_private_key.png b/doc/html/epid_diagram_group_public_key_and_issuing_private_key.png
new file mode 100644
index 0000000..a6b7ca1
--- /dev/null
+++ b/doc/html/epid_diagram_group_public_key_and_issuing_private_key.png
Binary files differ
diff --git a/doc/html/epid_diagram_issuer_makes_revocation_lists_available.png b/doc/html/epid_diagram_issuer_makes_revocation_lists_available.png
new file mode 100644
index 0000000..cd77e59
--- /dev/null
+++ b/doc/html/epid_diagram_issuer_makes_revocation_lists_available.png
Binary files differ
diff --git a/doc/html/epid_diagram_maintaining_revocation_lists.png b/doc/html/epid_diagram_maintaining_revocation_lists.png
new file mode 100644
index 0000000..79ddddc
--- /dev/null
+++ b/doc/html/epid_diagram_maintaining_revocation_lists.png
Binary files differ
diff --git a/doc/html/epid_diagram_provisioning.png b/doc/html/epid_diagram_provisioning.png
new file mode 100644
index 0000000..40fafd1
--- /dev/null
+++ b/doc/html/epid_diagram_provisioning.png
Binary files differ
diff --git a/doc/html/epid_diagram_roles_summary.png b/doc/html/epid_diagram_roles_summary.png
new file mode 100644
index 0000000..4c6f422
--- /dev/null
+++ b/doc/html/epid_diagram_roles_summary.png
Binary files differ
diff --git a/doc/html/epid_diagram_signing_and_verification.png b/doc/html/epid_diagram_signing_and_verification.png
new file mode 100644
index 0000000..7eeedbb
--- /dev/null
+++ b/doc/html/epid_diagram_signing_and_verification.png
Binary files differ
diff --git a/doc/html/epiddefs_8h.html b/doc/html/epiddefs_8h.html
new file mode 100644
index 0000000..0137ded
--- /dev/null
+++ b/doc/html/epiddefs_8h.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/epiddefs.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('epiddefs_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle">
+<div class="title">epiddefs.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Common SDK macro definitions.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Common SDK macro definitions. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="epiddefs_8h.html">epiddefs.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/epidstyle.css b/doc/html/epidstyle.css
new file mode 100644
index 0000000..4b51e3f
--- /dev/null
+++ b/doc/html/epidstyle.css
@@ -0,0 +1,325 @@
+.image {
+ text-align: left;
+}
+body {
+ color: #333333;
+ background-color: #ffffff;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ margin-left: 0px;
+}
+h1 {
+ color: #0860a8;
+ font-size: 15pt;
+ padding-bottom: 1px;
+ margin-left: 0pt;
+ margin-bottom: 0px;
+ border-bottom: 1px solid #0860A8;
+ font-weight: normal;
+}
+h1.title {
+ border-bottom: 0 none;
+ margin-left: 0;
+ font-weight: normal;
+}
+h2 {
+ color: #0860a8;
+ font-weight: lighter;
+ margin-top: 5pt;
+ margin-bottom: 0;
+ font-size: 13pt;
+}
+h3 {
+ color: #333333;
+ font-weight: bold;
+ margin-top: 5pt;
+ margin-bottom: 0;
+ font-size: 11pt;
+}
+a:link {
+ color: #0860a8;
+ text-decoration: none;
+}
+a:visited {
+ color: #0860a8;
+ text-decoration: none;
+}
+a:active {
+ color: #0860a8;
+ text-decoration: underline;
+}
+a:hover {
+ color: #0860a8;
+ text-decoration: underline;
+}
+p {
+ font-size: inherit;
+ line-height: 120%;
+ margin-top: 0;
+ margin-bottom: 5pt;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+}
+blockquote {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+HR {
+ color: #555555;
+ border: 0;
+ background: #555555;
+ height: 1px;
+ margin-left: 0;
+}
+p.Note {
+ margin-top: 0;
+ margin-left: 25px;
+ margin-bottom: 10pt;
+}
+h3.NoteTipHead {
+ color: #006699;
+ margin-top: 11pt;
+ padding-bottom: 0;
+ line-height: 18px;
+ text-transform: uppercase;
+}
+LI.h3-NoteTipHead {
+ color: #006699;
+ line-height: 18px;
+ text-transform: uppercase;
+}
+h3.NoteTipHead img {
+ vertical-align: middle;
+}
+/*
+table {
+ margin-bottom: 5pt;
+ border-collapse: collapse;
+ margin-top: 0.3em;
+ font-size: 10pt;
+}
+tr {
+ vertical-align: top;
+}
+th {
+ padding: 4px;
+ text-align: left;
+ background-color: #555555;
+ font-weight: bold;
+ margin-top: 0;
+ margin-bottom: 0;
+ color: #ffffff;
+ font-size: 11pt;
+ border: 1px #bababa solid;
+}
+td {
+ border: 1px #bababa solid;
+ vertical-align: top;
+ font-size: 9pt;
+ margin-bottom: 0px;
+ margin-top: 0;
+ margin-left: 0;
+ padding: 0px;
+ text-align: left;
+}
+P.TableCell {
+ margin-top: 0;
+ margin-left: 4px;
+ padding: 0px;
+ margin-bottom: 0;
+ font-size: 9pt;
+ line-height: 120%;
+}
+td p {
+ margin-top: 0;
+ margin-left: 4;
+ padding: 0;
+ margin-bottom: 0;
+ text-align: left;
+ font-size: 9pt;
+ line-height: 120%;
+}
+td h3 {
+ margin-top: 0;
+ margin-left: 0;
+ padding: 0;
+ text-align: left;
+ font-size: inherit;
+ line-height: 120%;
+}
+td ul {
+ font-size: inherit;
+}
+td ol {
+ font-size: inherit;
+}
+td.noBorder {
+ border: 0px none;
+}
+h3.TableHead {
+ padding: 4px;
+ text-align: left;
+ background-color: #555555;
+ font-weight: bold;
+ margin-top: 0;
+ margin-bottom: 0;
+ color: #ffffff;
+ font-size: 11pt;
+}
+td table {
+ margin-left: 0;
+}
+*/
+ol {
+ margin-bottom: 1em;
+ font-size: inherit;
+ margin-top: 0px;
+ line-height: 100%;
+ list-style-type: decimal;
+}
+ol ol {
+ list-style: lower-alpha;
+ margin-bottom: 0em;
+ font-size: inherit;
+}
+ol ul {
+ margin-bottom: 0px;
+ font-size: inherit;
+}
+ol p {
+ margin-bottom: 0.2em;
+ margin-top: 0.2em;
+ margin-left: 0;
+ padding-left: 0;
+ font-size: inherit;
+}
+ol.Note {
+ margin-left: 25px;
+}
+ul {
+ margin-bottom: 1em;
+ font-size: inherit;
+ margin-top: 0px;
+ line-height: 100%;
+}
+ul p {
+ margin-bottom: 0.2em;
+ margin-top: 0.2em;
+ margin-left: 0;
+ padding-left: 0;
+ font-size: inherit;
+}
+ul ol {
+ margin-bottom: 0em;
+ font-size: inherit;
+ list-style-type: decimal;
+}
+ul ul {
+ margin-bottom: 0px;
+ font-size: inherit;
+}
+ul.Note {
+ margin-left: 25px;
+}
+li {
+ font-size: inherit;
+ margin-top: 0px;
+ line-height: 130%;
+}
+li p {
+ margin-bottom: 0.2em;
+ margin-top: 0.2em;
+ margin-left: 0;
+ padding-left: 0;
+ font-size: inherit;
+}
+p.twoColumnListHead {
+ color: #000000;
+ margin-top: 0;
+ margin-bottom: 0;
+ font-weight: bold;
+}
+dl {
+ margin-bottom: 1em;
+ font-size: inherit;
+ margin-top: 0px;
+}
+dt {
+ font-weight: bold;
+ margin-top: 1em;
+}
+dd {
+ font-size: inherit;
+ margin-top: 0;
+}
+dd p {
+ margin-bottom: 0.2em;
+ margin-top: 0.2em;
+ font-size: inherit;
+}
+p.pRelatedLink {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+SPAN.Code {
+ font-family: "Courier New", Courier, monospace;
+}
+span.Variable {
+ font-family: Courier, monospace;
+ font-style: italic;
+}
+SPAN.Superscript {
+ vertical-align: top;
+ font-size: 80%;
+}
+SPAN.Color {
+ color: #6C9A65;
+}
+SPAN.Color2 {
+ color: #0860a8;
+}
+SPAN.Color3 {
+ color: #fd0b01;
+}
+SPAN.Color4 {
+ color: #f8aa06;
+}
+.Code {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #eeeeee;
+}
+.link_buttons {
+ background-color: #EEEEEE;
+ border-color: #EEEEEE;
+ border-width: 1px;
+ padding: 4px;
+}
+.Color {
+ color: #6C9A65;
+}
+.Preformatted {
+ x-text-tab-stops: repeat 1in;
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 10pt;
+ font-family: "Courier New", Courier, monospace;
+ background-color: #eeeeee;
+}
+
+/* Hide top level nav-tree node */
+#nav-tree-contents > ul > li > div {
+ display: none;
+}
+
+/* Shift remaining nav-tree nodes left */
+#nav-tree-contents > ul {
+ margin: 0;
+ padding: 0;
+ margin-left: -16px;
+ margin-top: -2em; /* nav-tree hack*/
+}
+
+#projectlink {
+ color:inherit;
+ text-decoration:none;
+}
diff --git a/doc/html/errors_8h.html b/doc/html/errors_8h.html
new file mode 100644
index 0000000..d5d7517
--- /dev/null
+++ b/doc/html/errors_8h.html
@@ -0,0 +1,128 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/errors.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('errors_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">errors.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Error reporting.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gafdb27c77c2c4b32c807e326a8a0da360"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> { <br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> = 0,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e">kEpidSigValid</a> = 0,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">kEpidSigInvalid</a> = 1,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5">kEpidSigRevokedInGroupRl</a> = 2,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1">kEpidSigRevokedInPrivRl</a> = 3,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c">kEpidSigRevokedInSigRl</a> = 4,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298">kEpidSigRevokedInVerifierRl</a> = 5,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">kEpidErr</a> = -999,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7">kEpidNotImpl</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">kEpidBadArgErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c">kEpidNoMemErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6">kEpidMathErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3">kEpidDivByZeroErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec">kEpidUnderflowErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4">kEpidHashAlgorithmNotSupported</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357">kEpidRandMaxIterErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f">kEpidDuplicateErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df">kEpidInconsistentBasenameSetErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129">kEpidMathQuadraticNonResidueError</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43">kEpidOutOfSequenceError</a>
+<br />
+ }</td></tr>
+<tr class="memdesc:gafdb27c77c2c4b32c807e326a8a0da360"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return status for SDK functions. <a href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">More...</a><br /></td></tr>
+<tr class="separator:gafdb27c77c2c4b32c807e326a8a0da360"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga59e8680ce52509302fd58a987e45004d"><td class="memItemLeft" align="right" valign="top">char const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___error_codes.html#ga59e8680ce52509302fd58a987e45004d">EpidStatusToString</a> (<a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> e)</td></tr>
+<tr class="memdesc:ga59e8680ce52509302fd58a987e45004d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns string representation of error code. <a href="group___error_codes.html#ga59e8680ce52509302fd58a987e45004d">More...</a><br /></td></tr>
+<tr class="separator:ga59e8680ce52509302fd58a987e45004d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Error reporting. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="errors_8h.html">errors.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/examples_8dox.html b/doc/html/examples_8dox.html
new file mode 100644
index 0000000..1c1955d
--- /dev/null
+++ b/doc/html/examples_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/examples.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('examples_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/examples.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="examples_8dox.html">examples.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/file__parser_8h.html b/doc/html/file__parser_8h.html
new file mode 100644
index 0000000..f679e44
--- /dev/null
+++ b/doc/html/file__parser_8h.html
@@ -0,0 +1,156 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/file_parser.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('file__parser_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">file_parser.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID issuer material parsing utilities.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_file_header.html">EpidFileHeader</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID binary file header. <a href="struct_epid_file_header.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">IoT CA Certificate binary format. <a href="struct_epid_ca_certificate.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga1562efc7c1891875d6b2b9180d65de9d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a> { <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc">kEpid1x</a>,
+<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2">kEpid2x</a>,
+<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">kNumEpidVersions</a>
+ }</td></tr>
+<tr class="memdesc:ga1562efc7c1891875d6b2b9180d65de9d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized Intel(R) EPID versions. <a href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">More...</a><br /></td></tr>
+<tr class="separator:ga1562efc7c1891875d6b2b9180d65de9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a> { <br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92">kIssuingCaPubKeyFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e">kGroupPubKeyFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322">kPrivRlFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710">kSigRlFile</a>,
+<br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770">kGroupRlFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911">kPrivRlRequestFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600">kSigRlRequestFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c">kGroupRlRequestFile</a>,
+<br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">kNumFileTypes</a>
+<br />
+ }</td></tr>
+<tr class="memdesc:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized Intel(R) EPID file types. <a href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">More...</a><br /></td></tr>
+<tr class="separator:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55">EpidParseFileHeader</a> (void const *buf, size_t len, <a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a> *epid_version, <a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a> *file_type)</td></tr>
+<tr class="memdesc:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts Intel(R) EPID Binary Output File header information. <a href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55">More...</a><br /></td></tr>
+<tr class="separator:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">EpidParseGroupPubKeyFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> *pubkey)</td></tr>
+<tr class="memdesc:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group public key from buffer in issuer binary format. <a href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">More...</a><br /></td></tr>
+<tr class="separator:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">EpidParsePrivRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_priv_rl.html">PrivRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts private key revocation list from buffer in issuer binary format. <a href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">More...</a><br /></td></tr>
+<tr class="separator:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_sig_rl.html">SigRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts signature revocation list from buffer in issuer binary format. <a href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">More...</a><br /></td></tr>
+<tr class="separator:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad767f72dc55307b872a8b5600da3fd6f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">EpidParseGroupRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_group_rl.html">GroupRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gad767f72dc55307b872a8b5600da3fd6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group revocation list from buffer in issuer binary format. <a href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">More...</a><br /></td></tr>
+<tr class="separator:gad767f72dc55307b872a8b5600da3fd6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:gaae808987ce82188dff42baa4e43cab82"><td class="memItemLeft" align="right" valign="top">
+const <a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gaae808987ce82188dff42baa4e43cab82">kEpidVersionCode</a> [<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">kNumEpidVersions</a>]</td></tr>
+<tr class="memdesc:gaae808987ce82188dff42baa4e43cab82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encoding of issuer material Intel(R) EPID versions. <br /></td></tr>
+<tr class="separator:gaae808987ce82188dff42baa4e43cab82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3770c39a0546c79447c9d4159d794c33"><td class="memItemLeft" align="right" valign="top">
+const <a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33">kEpidFileTypeCode</a> [<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">kNumFileTypes</a>]</td></tr>
+<tr class="memdesc:ga3770c39a0546c79447c9d4159d794c33"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encoding of issuer material file types. <br /></td></tr>
+<tr class="separator:ga3770c39a0546c79447c9d4159d794c33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID issuer material parsing utilities. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="file__parser_8h.html">file_parser.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/files.html b/doc/html/files.html
new file mode 100644
index 0000000..20d93e6
--- /dev/null
+++ b/doc/html/files.html
@@ -0,0 +1,151 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('files.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html" target="_self">epid</a></td><td class="desc">Core Intel&reg; EPID functionality </td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html" target="_self">common</a></td><td class="desc">Common code shared between core sub-components </td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_0_" class="arrow" onclick="toggleFolder('0_0_0_')">&#9660;</span><span id="img_0_0_0_" class="iconfopen" onclick="toggleFolder('0_0_0_')">&#160;</span><a class="el" href="dir_a32be19bc88f3d7aac6b7249da379f26.html" target="_self">1.1</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_0_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="1_81_2file__parser_8h.html" target="_self">file_parser.h</a></td><td class="desc">Intel(R) EPID 1.1 issuer material parsing utilities </td></tr>
+<tr id="row_0_0_0_1_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="1_81_2types_8h.html" target="_self">types.h</a></td><td class="desc">SDK data types for Intel(R) EPID 1.1 </td></tr>
+<tr id="row_0_0_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_1_" class="arrow" onclick="toggleFolder('0_0_1_')">&#9660;</span><span id="img_0_0_1_" class="iconfopen" onclick="toggleFolder('0_0_1_')">&#160;</span><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html" target="_self">math</a></td><td class="desc">Math primitives </td></tr>
+<tr id="row_0_0_1_0_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bignum_8h.html" target="_self">bignum.h</a></td><td class="desc">Big number interface </td></tr>
+<tr id="row_0_0_1_1_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ecdsa_8h.html" target="_self">ecdsa.h</a></td><td class="desc">Ecdsa interface </td></tr>
+<tr id="row_0_0_1_2_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ecgroup_8h.html" target="_self">ecgroup.h</a></td><td class="desc">Elliptic curve group interface </td></tr>
+<tr id="row_0_0_1_3_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="finitefield_8h.html" target="_self">finitefield.h</a></td><td class="desc">Finite field interface </td></tr>
+<tr id="row_0_0_1_4_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="hash_8h.html" target="_self">hash.h</a></td><td class="desc">Hash primitives </td></tr>
+<tr id="row_0_0_1_5_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="common_2math_2pairing_8h.html" target="_self">pairing.h</a></td><td class="desc">Pairing interface </td></tr>
+<tr id="row_0_0_1_6_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="printutils_8h.html" target="_self">printutils.h</a></td><td class="desc">Print helper interface </td></tr>
+<tr id="row_0_0_1_7_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tatepairing_8h.html" target="_self">tatepairing.h</a></td><td class="desc">Intel(R) EPID 1.1 Pairing interface </td></tr>
+<tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bitsupplier_8h.html" target="_self">bitsupplier.h</a></td><td class="desc">Random data supplier interface </td></tr>
+<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="epiddefs_8h.html" target="_self">epiddefs.h</a></td><td class="desc">Common SDK macro definitions </td></tr>
+<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="errors_8h.html" target="_self">errors.h</a></td><td class="desc">Error reporting </td></tr>
+<tr id="row_0_0_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="file__parser_8h.html" target="_self">file_parser.h</a></td><td class="desc">Intel(R) EPID issuer material parsing utilities </td></tr>
+<tr id="row_0_0_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="stdtypes_8h.html" target="_self">stdtypes.h</a></td><td class="desc">C99 standard data types </td></tr>
+<tr id="row_0_0_7_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="types_8h.html" target="_self">types.h</a></td><td class="desc">SDK data types </td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_1_" class="arrow" onclick="toggleFolder('0_1_')">&#9660;</span><span id="img_0_1_" class="iconfopen" onclick="toggleFolder('0_1_')">&#160;</span><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html" target="_self">member</a></td><td class="desc">Member functionality </td></tr>
+<tr id="row_0_1_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_0_" class="arrow" onclick="toggleFolder('0_1_0_')">&#9660;</span><span id="img_0_1_0_" class="iconfopen" onclick="toggleFolder('0_1_0_')">&#160;</span><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html" target="_self">tiny</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_1_0_0_" class="arrow" onclick="toggleFolder('0_1_0_0_')">&#9660;</span><span id="img_0_1_0_0_" class="iconfopen" onclick="toggleFolder('0_1_0_0_')">&#160;</span><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html" target="_self">math</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_0_0_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="efq_8h.html" target="_self">efq.h</a></td><td class="desc">Definition of EFq math </td></tr>
+<tr id="row_0_1_0_0_1_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="efq2_8h.html" target="_self">efq2.h</a></td><td class="desc">Definition of EFq2 math </td></tr>
+<tr id="row_0_1_0_0_2_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="fp_8h.html" target="_self">fp.h</a></td><td class="desc">Definition of Fp math </td></tr>
+<tr id="row_0_1_0_0_3_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="fq_8h.html" target="_self">fq.h</a></td><td class="desc">Definition of Fq math </td></tr>
+<tr id="row_0_1_0_0_4_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="fq12_8h.html" target="_self">fq12.h</a></td><td class="desc">Definition of Fq12 math </td></tr>
+<tr id="row_0_1_0_0_5_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="fq2_8h.html" target="_self">fq2.h</a></td><td class="desc">Definition of Fq2 math </td></tr>
+<tr id="row_0_1_0_0_6_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="fq6_8h.html" target="_self">fq6.h</a></td><td class="desc">Definition of Fq6 math </td></tr>
+<tr id="row_0_1_0_0_7_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="hashwrap_8h.html" target="_self">hashwrap.h</a></td><td class="desc">Decleration of hash wrap function </td></tr>
+<tr id="row_0_1_0_0_8_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mathdefs_8h.html" target="_self">mathdefs.h</a></td><td class="desc">Common public definitions for math headers </td></tr>
+<tr id="row_0_1_0_0_9_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mathtypes_8h.html" target="_self">mathtypes.h</a></td><td class="desc">Definition of math types in tiny Intel(R) EPID </td></tr>
+<tr id="row_0_1_0_0_10_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="member_2tiny_2math_2pairing_8h.html" target="_self">pairing.h</a></td><td class="desc">Definition of pairing math </td></tr>
+<tr id="row_0_1_0_0_11_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="serialize_8h.html" target="_self">serialize.h</a></td><td class="desc">Definition of de/serialize functionality </td></tr>
+<tr id="row_0_1_0_0_12_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sha256_8h.html" target="_self">sha256.h</a></td><td class="desc">Interface to a SHA-256 implementation </td></tr>
+<tr id="row_0_1_0_0_13_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sha512_8h.html" target="_self">sha512.h</a></td><td class="desc">Interface to a SHA-512 implementation </td></tr>
+<tr id="row_0_1_0_0_14_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="vli_8h.html" target="_self">vli.h</a></td><td class="desc">Definition of Large Integer math </td></tr>
+<tr id="row_0_1_0_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_1_0_1_" class="arrow" onclick="toggleFolder('0_1_0_1_')">&#9660;</span><span id="img_0_1_0_1_" class="iconfopen" onclick="toggleFolder('0_1_0_1_')">&#160;</span><a class="el" href="dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html" target="_self">stdlib</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_1_0_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="endian_8h.html" target="_self">endian.h</a></td><td class="desc">Convert values between host and big-/little-endian byte order </td></tr>
+<tr id="row_0_1_0_1_1_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tiny__stdlib_8h.html" target="_self">tiny_stdlib.h</a></td><td class="desc">Tiny portable implementations of standard library functions </td></tr>
+<tr id="row_0_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_1_" class="arrow" onclick="toggleFolder('0_1_1_')">&#9660;</span><span id="img_0_1_1_" class="iconfopen" onclick="toggleFolder('0_1_1_')">&#160;</span><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html" target="_self">tpm2</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_1_1_0_" class="arrow" onclick="toggleFolder('0_1_1_0_')">&#9660;</span><span id="img_0_1_1_0_" class="iconfopen" onclick="toggleFolder('0_1_1_0_')">&#160;</span><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html" target="_self">ibm_tss</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_0_0_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="commit_8c.html" target="_self">commit.c</a></td><td class="desc">Tpm2Commit implementation </td></tr>
+<tr id="row_0_1_1_0_1_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="context_8c.html" target="_self">context.c</a></td><td class="desc">TPM context implementation </td></tr>
+<tr id="row_0_1_1_0_2_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="conversion_8c.html" target="_self">conversion.c</a></td><td class="desc">TPM-SDK data conversion implementation </td></tr>
+<tr id="row_0_1_1_0_3_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="conversion_8h.html" target="_self">conversion.h</a></td><td class="desc">TPM-SDK data conversion interface </td></tr>
+<tr id="row_0_1_1_0_4_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="createprimary_8c.html" target="_self">createprimary.c</a></td><td class="desc">TPM2_CreatePrimary command implementation </td></tr>
+<tr id="row_0_1_1_0_5_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="getrandom_8c.html" target="_self">getrandom.c</a></td><td class="desc">TPM2_GetRandom command implementation </td></tr>
+<tr id="row_0_1_1_0_6_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="load__external_8c.html" target="_self">load_external.c</a></td><td class="desc">TPM2_LoadExternal command implementation </td></tr>
+<tr id="row_0_1_1_0_7_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="nv_8c.html" target="_self">nv.c</a></td><td class="desc">TSS NV API implementation </td></tr>
+<tr id="row_0_1_1_0_8_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="printtss_8c.html" target="_self">printtss.c</a></td><td class="desc">TPM context implementation </td></tr>
+<tr id="row_0_1_1_0_9_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="printtss_8h.html" target="_self">printtss.h</a></td><td class="desc">TPM log error prints </td></tr>
+<tr id="row_0_1_1_0_10_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sign_8c.html" target="_self">sign.c</a></td><td class="desc">Tpm2Sign implementation </td></tr>
+<tr id="row_0_1_1_0_11_" class="even"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="state_8h.html" target="_self">state.h</a></td><td class="desc">TPM internal state </td></tr>
+<tr id="row_0_1_1_1_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="commit_8h.html" target="_self">commit.h</a></td><td class="desc">SDK TPM Commit API </td></tr>
+<tr id="row_0_1_1_2_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="context_8h.html" target="_self">context.h</a></td><td class="desc">SDK TPM API </td></tr>
+<tr id="row_0_1_1_3_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="createprimary_8h.html" target="_self">createprimary.h</a></td><td class="desc">TPM2_CreatePrimary command interface </td></tr>
+<tr id="row_0_1_1_4_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="getrandom_8h.html" target="_self">getrandom.h</a></td><td class="desc">SDK TPM API </td></tr>
+<tr id="row_0_1_1_5_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="load__external_8h.html" target="_self">load_external.h</a></td><td class="desc">SDK TPM API </td></tr>
+<tr id="row_0_1_1_6_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="nv_8h.html" target="_self">nv.h</a></td><td class="desc">SDK TPM non volatile memory API </td></tr>
+<tr id="row_0_1_1_7_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sign_8h.html" target="_self">sign.h</a></td><td class="desc">SDK TPM Sign API </td></tr>
+<tr id="row_0_1_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="member_2api_8h.html" target="_self">api.h</a></td><td class="desc">Intel(R) EPID SDK member API </td></tr>
+<tr id="row_0_1_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="software__member_8h.html" target="_self">software_member.h</a></td><td class="desc">Member creation parameters for software only implementation </td></tr>
+<tr id="row_0_1_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tpm__member_8h.html" target="_self">tpm_member.h</a></td><td class="desc">Member creation parameters for TPM implementation </td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9660;</span><span id="img_0_2_" class="iconfopen" onclick="toggleFolder('0_2_')">&#160;</span><a class="el" href="dir_02c945662023679b89476bd7126bc985.html" target="_self">verifier</a></td><td class="desc">Verifier functionality </td></tr>
+<tr id="row_0_2_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_0_" class="arrow" onclick="toggleFolder('0_2_0_')">&#9660;</span><span id="img_0_2_0_" class="iconfopen" onclick="toggleFolder('0_2_0_')">&#160;</span><a class="el" href="dir_ef364879bae02db2684040178ed9b186.html" target="_self">1.1</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_0_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="verifier_21_81_2api_8h.html" target="_self">api.h</a></td><td class="desc">Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API </td></tr>
+<tr id="row_0_2_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="verifier_2api_8h.html" target="_self">api.h</a></td><td class="desc">Intel(R) EPID SDK verifier API </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/finitefield_8h.html b/doc/html/finitefield_8h.html
new file mode 100644
index 0000000..1a3c88e
--- /dev/null
+++ b/doc/html/finitefield_8h.html
@@ -0,0 +1,176 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/finitefield.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('finitefield_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">finitefield.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Finite field interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="bignum_8h.html">epid/common/math/bignum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gab281b24e336a8b3d7d90079d862d969e"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a></td></tr>
+<tr class="memdesc:gab281b24e336a8b3d7d90079d862d969e"><td class="mdescLeft">&#160;</td><td class="mdescRight">A finite field. <br /></td></tr>
+<tr class="separator:gab281b24e336a8b3d7d90079d862d969e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a></td></tr>
+<tr class="memdesc:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">An element in a finite field. <br /></td></tr>
+<tr class="separator:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c">NewFiniteField</a> (<a class="el" href="struct_big_num_str.html">BigNumStr</a> const *prime, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates new finite field. <a href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c">More...</a><br /></td></tr>
+<tr class="separator:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2">NewFiniteFieldViaBinomalExtension</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ground_field, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ground_element, int degree, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field using binomial extension. <a href="group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2">More...</a><br /></td></tr>
+<tr class="separator:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae69af62a03179718cac81b004549c598"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598">NewFiniteFieldViaPolynomialExtension</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ground_field, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *irr_polynomial, int degree, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:gae69af62a03179718cac81b004549c598"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field using polynomial extension. <a href="group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598">More...</a><br /></td></tr>
+<tr class="separator:gae69af62a03179718cac81b004549c598"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f">DeleteFiniteField</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated FiniteField. <a href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f">More...</a><br /></td></tr>
+<tr class="separator:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c">NewFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **new_ff_elem)</td></tr>
+<tr class="memdesc:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field element. <a href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c">More...</a><br /></td></tr>
+<tr class="separator:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e">DeleteFfElement</a> (<a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **ff_elem)</td></tr>
+<tr class="memdesc:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated FfElement. <a href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e">More...</a><br /></td></tr>
+<tr class="separator:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8a143a5a815a62f4947be2de1653c50f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f">ReadFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> ff_elem_str, size_t strlen, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *ff_elem)</td></tr>
+<tr class="memdesc:ga8a143a5a815a62f4947be2de1653c50f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes a FfElement from a string. <a href="group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f">More...</a><br /></td></tr>
+<tr class="separator:ga8a143a5a815a62f4947be2de1653c50f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90b2c192708973b54b7a3e82b34536ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed">InitFfElementFromBn</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *bn, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *ff_elem)</td></tr>
+<tr class="memdesc:ga90b2c192708973b54b7a3e82b34536ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes an existing FfElement from a BigNum. <a href="group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed">More...</a><br /></td></tr>
+<tr class="separator:ga90b2c192708973b54b7a3e82b34536ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3c1f7515dd823ddad8764091ebc665f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f">WriteFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ff_elem, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> ff_elem_str, size_t strlen)</td></tr>
+<tr class="memdesc:gaa3c1f7515dd823ddad8764091ebc665f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes a finite field element to a string. <a href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f">More...</a><br /></td></tr>
+<tr class="separator:gaa3c1f7515dd823ddad8764091ebc665f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2">FfNeg</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculates the additive inverse of a finite field element. <a href="group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2">More...</a><br /></td></tr>
+<tr class="separator:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga26069d035d0f6ade33af2b5d5c14949a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a">FfInv</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga26069d035d0f6ade33af2b5d5c14949a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculates the multiplicative inverse of a finite field element. <a href="group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a">More...</a><br /></td></tr>
+<tr class="separator:ga26069d035d0f6ade33af2b5d5c14949a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b">FfAdd</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds two finite field elements. <a href="group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b">More...</a><br /></td></tr>
+<tr class="separator:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga59d20610f245ff4bc3a17b7bfe289991"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991">FfSub</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga59d20610f245ff4bc3a17b7bfe289991"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts two finite field elements. <a href="group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991">More...</a><br /></td></tr>
+<tr class="separator:ga59d20610f245ff4bc3a17b7bfe289991"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4613a75bd001a974b3e3e494c3a112a5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5">FfMul</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga4613a75bd001a974b3e3e494c3a112a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two finite field elements. <a href="group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5">More...</a><br /></td></tr>
+<tr class="separator:ga4613a75bd001a974b3e3e494c3a112a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga20d9140e5670d679ef8183d9b5115f53"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53">FfIsZero</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_zero)</td></tr>
+<tr class="memdesc:ga20d9140e5670d679ef8183d9b5115f53"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if given finite field element is the additive identity (zero). <a href="group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53">More...</a><br /></td></tr>
+<tr class="separator:ga20d9140e5670d679ef8183d9b5115f53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c">FfExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises an element of a finite field to a power. <a href="group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c">More...</a><br /></td></tr>
+<tr class="separator:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3">FfMultiExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates finite field elements. <a href="group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3">More...</a><br /></td></tr>
+<tr class="separator:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144">FfMultiExpBn</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates finite field elements. <a href="group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144">More...</a><br /></td></tr>
+<tr class="separator:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634">FfSscmMultiExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of FfMultiExp. <a href="group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634">More...</a><br /></td></tr>
+<tr class="separator:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaed2acb8583e9c9f6b49fdb660c672625"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625">FfIsEqual</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_equal)</td></tr>
+<tr class="memdesc:gaed2acb8583e9c9f6b49fdb660c672625"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if two finite field elements are equal. <a href="group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625">More...</a><br /></td></tr>
+<tr class="separator:gaed2acb8583e9c9f6b49fdb660c672625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabd511d79d9cbd1899e59258f149102c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5">FfHash</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gabd511d79d9cbd1899e59258f149102c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an element in a finite field. <a href="group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5">More...</a><br /></td></tr>
+<tr class="separator:gabd511d79d9cbd1899e59258f149102c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8">FfGetRandom</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *low_bound, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate random finite field element. <a href="group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8">More...</a><br /></td></tr>
+<tr class="separator:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga39892fe2ab431e166dbbcf57756660f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6">FfSqrt</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga39892fe2ab431e166dbbcf57756660f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds a square root of a finite field element. <a href="group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6">More...</a><br /></td></tr>
+<tr class="separator:ga39892fe2ab431e166dbbcf57756660f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Finite field interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="finitefield_8h.html">finitefield.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/folderclosed.png b/doc/html/folderclosed.png
new file mode 100644
index 0000000..bb8ab35
--- /dev/null
+++ b/doc/html/folderclosed.png
Binary files differ
diff --git a/doc/html/folderopen.png b/doc/html/folderopen.png
new file mode 100644
index 0000000..d6c7f67
--- /dev/null
+++ b/doc/html/folderopen.png
Binary files differ
diff --git a/doc/html/fp_8h.html b/doc/html/fp_8h.html
new file mode 100644
index 0000000..fca00e7
--- /dev/null
+++ b/doc/html/fp_8h.html
@@ -0,0 +1,645 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/fp.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('fp_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fp.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Fp math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac2eab44a7aa9679d107667ffc035ee0a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#ac2eab44a7aa9679d107667ffc035ee0a">FpInField</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> const *in)</td></tr>
+<tr class="memdesc:ac2eab44a7aa9679d107667ffc035ee0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if an element is in Fp. <a href="#ac2eab44a7aa9679d107667ffc035ee0a">More...</a><br /></td></tr>
+<tr class="separator:ac2eab44a7aa9679d107667ffc035ee0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55152abe8b866eba5a0c83cfb1bbe5f6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a55152abe8b866eba5a0c83cfb1bbe5f6">FpAdd</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *left, <a class="el" href="struct_fp_elem.html">FpElem</a> const *right)</td></tr>
+<tr class="memdesc:a55152abe8b866eba5a0c83cfb1bbe5f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two elements of Fp. <a href="#a55152abe8b866eba5a0c83cfb1bbe5f6">More...</a><br /></td></tr>
+<tr class="separator:a55152abe8b866eba5a0c83cfb1bbe5f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9392597a6fe50e5c102ce21b8a1ae6c2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a9392597a6fe50e5c102ce21b8a1ae6c2">FpMul</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *left, <a class="el" href="struct_fp_elem.html">FpElem</a> const *right)</td></tr>
+<tr class="memdesc:a9392597a6fe50e5c102ce21b8a1ae6c2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fp. <a href="#a9392597a6fe50e5c102ce21b8a1ae6c2">More...</a><br /></td></tr>
+<tr class="separator:a9392597a6fe50e5c102ce21b8a1ae6c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9cc9f5e33bba75420b83cb2d49ca280"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#aa9cc9f5e33bba75420b83cb2d49ca280">FpSub</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *left, <a class="el" href="struct_fp_elem.html">FpElem</a> const *right)</td></tr>
+<tr class="memdesc:aa9cc9f5e33bba75420b83cb2d49ca280"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two elements of Fp. <a href="#aa9cc9f5e33bba75420b83cb2d49ca280">More...</a><br /></td></tr>
+<tr class="separator:aa9cc9f5e33bba75420b83cb2d49ca280"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab06b1b1a59f1138aa6c4d746ab707f86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#ab06b1b1a59f1138aa6c4d746ab707f86">FpExp</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *base, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp)</td></tr>
+<tr class="memdesc:ab06b1b1a59f1138aa6c4d746ab707f86"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate an element of Fp by a large integer. <a href="#ab06b1b1a59f1138aa6c4d746ab707f86">More...</a><br /></td></tr>
+<tr class="separator:ab06b1b1a59f1138aa6c4d746ab707f86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0524fd074857712ea61ea5717ff54fd3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a0524fd074857712ea61ea5717ff54fd3">FpNeg</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *in)</td></tr>
+<tr class="memdesc:a0524fd074857712ea61ea5717ff54fd3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate an element of Fp. <a href="#a0524fd074857712ea61ea5717ff54fd3">More...</a><br /></td></tr>
+<tr class="separator:a0524fd074857712ea61ea5717ff54fd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bb685bd810368d8077f638ffcab2554"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a7bb685bd810368d8077f638ffcab2554">FpEq</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> const *left, <a class="el" href="struct_fp_elem.html">FpElem</a> const *right)</td></tr>
+<tr class="memdesc:a7bb685bd810368d8077f638ffcab2554"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two elements in Fp are equal. <a href="#a7bb685bd810368d8077f638ffcab2554">More...</a><br /></td></tr>
+<tr class="separator:a7bb685bd810368d8077f638ffcab2554"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e7500fe8ee73592b002ed675d1758b3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a9e7500fe8ee73592b002ed675d1758b3">FpInv</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="struct_fp_elem.html">FpElem</a> const *in)</td></tr>
+<tr class="memdesc:a9e7500fe8ee73592b002ed675d1758b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert an element of Fp. <a href="#a9e7500fe8ee73592b002ed675d1758b3">More...</a><br /></td></tr>
+<tr class="separator:a9e7500fe8ee73592b002ed675d1758b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c06b175fd82b5db555508f2d26713f8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a6c06b175fd82b5db555508f2d26713f8">FpRand</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a6c06b175fd82b5db555508f2d26713f8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a random element of Fp. <a href="#a6c06b175fd82b5db555508f2d26713f8">More...</a><br /></td></tr>
+<tr class="separator:a6c06b175fd82b5db555508f2d26713f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54743809639797b4d4445c221291048b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a54743809639797b4d4445c221291048b">FpRandNonzero</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a54743809639797b4d4445c221291048b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a non-zero random element of Fp. <a href="#a54743809639797b4d4445c221291048b">More...</a><br /></td></tr>
+<tr class="separator:a54743809639797b4d4445c221291048b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf010ec5710d4013e33efd7e5ba8f9ad"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#adf010ec5710d4013e33efd7e5ba8f9ad">FpClear</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result)</td></tr>
+<tr class="memdesc:adf010ec5710d4013e33efd7e5ba8f9ad"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear an element of Fp. <a href="#adf010ec5710d4013e33efd7e5ba8f9ad">More...</a><br /></td></tr>
+<tr class="separator:adf010ec5710d4013e33efd7e5ba8f9ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23bf42c7024a318970a6b60c02d9a08d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a23bf42c7024a318970a6b60c02d9a08d">FpSet</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, uint32_t in)</td></tr>
+<tr class="memdesc:a23bf42c7024a318970a6b60c02d9a08d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set a element of Fp's value. <a href="#a23bf42c7024a318970a6b60c02d9a08d">More...</a><br /></td></tr>
+<tr class="separator:a23bf42c7024a318970a6b60c02d9a08d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a472b0a9229b0eff0ca445f158efa1175"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fp_8h.html#a472b0a9229b0eff0ca445f158efa1175">FpFromHash</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *result, unsigned char const *hash, size_t len)</td></tr>
+<tr class="memdesc:a472b0a9229b0eff0ca445f158efa1175"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reinterpret a buffer as an element of Fp. <a href="#a472b0a9229b0eff0ca445f158efa1175">More...</a><br /></td></tr>
+<tr class="separator:a472b0a9229b0eff0ca445f158efa1175"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Fp math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a55152abe8b866eba5a0c83cfb1bbe5f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55152abe8b866eba5a0c83cfb1bbe5f6">&#9670;&nbsp;</a></span>FpAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two elements of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="adf010ec5710d4013e33efd7e5ba8f9ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adf010ec5710d4013e33efd7e5ba8f9ad">&#9670;&nbsp;</a></span>FpClear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpClear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear an element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>value to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7bb685bd810368d8077f638ffcab2554"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7bb685bd810368d8077f638ffcab2554">&#9670;&nbsp;</a></span>FpEq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FpEq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two elements in Fp are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="ab06b1b1a59f1138aa6c4d746ab707f86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab06b1b1a59f1138aa6c4d746ab707f86">&#9670;&nbsp;</a></span>FpExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate an element of Fp by a large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a472b0a9229b0eff0ca445f158efa1175"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a472b0a9229b0eff0ca445f158efa1175">&#9670;&nbsp;</a></span>FpFromHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpFromHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char const *&#160;</td>
+ <td class="paramname"><em>hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Reinterpret a buffer as an element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash</td><td>buffer to reinterpret. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>length of hash in bytes. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac2eab44a7aa9679d107667ffc035ee0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2eab44a7aa9679d107667ffc035ee0a">&#9670;&nbsp;</a></span>FpInField()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FpInField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if an element is in Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to test </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the value is in the field. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a9e7500fe8ee73592b002ed675d1758b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e7500fe8ee73592b002ed675d1758b3">&#9670;&nbsp;</a></span>FpInv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpInv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert an element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to invert. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9392597a6fe50e5c102ce21b8a1ae6c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9392597a6fe50e5c102ce21b8a1ae6c2">&#9670;&nbsp;</a></span>FpMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0524fd074857712ea61ea5717ff54fd3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0524fd074857712ea61ea5717ff54fd3">&#9670;&nbsp;</a></span>FpNeg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpNeg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate an element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6c06b175fd82b5db555508f2d26713f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c06b175fd82b5db555508f2d26713f8">&#9670;&nbsp;</a></span>FpRand()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FpRand </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a random element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a54743809639797b4d4445c221291048b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54743809639797b4d4445c221291048b">&#9670;&nbsp;</a></span>FpRandNonzero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FpRandNonzero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a non-zero random element of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a23bf42c7024a318970a6b60c02d9a08d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23bf42c7024a318970a6b60c02d9a08d">&#9670;&nbsp;</a></span>FpSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set a element of Fp's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa9cc9f5e33bba75420b83cb2d49ca280"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9cc9f5e33bba75420b83cb2d49ca280">&#9670;&nbsp;</a></span>FpSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FpSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two elements of Fp. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of subtracting left from right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="fp_8h.html">fp.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/fq12_8h.html b/doc/html/fq12_8h.html
new file mode 100644
index 0000000..91f1fa1
--- /dev/null
+++ b/doc/html/fq12_8h.html
@@ -0,0 +1,814 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/fq12.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('fq12_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fq12.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Fq12 math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa4a17bfa56644ab615c60bd7ec900821"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#aa4a17bfa56644ab615c60bd7ec900821">Fq12Add</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *left, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *right)</td></tr>
+<tr class="memdesc:aa4a17bfa56644ab615c60bd7ec900821"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two elements of Fq12. <a href="#aa4a17bfa56644ab615c60bd7ec900821">More...</a><br /></td></tr>
+<tr class="separator:aa4a17bfa56644ab615c60bd7ec900821"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80c3da69a0991423a728e9b74a2dfe15"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a80c3da69a0991423a728e9b74a2dfe15">Fq12Sub</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *left, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *right)</td></tr>
+<tr class="memdesc:a80c3da69a0991423a728e9b74a2dfe15"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two elements of Fq12. <a href="#a80c3da69a0991423a728e9b74a2dfe15">More...</a><br /></td></tr>
+<tr class="separator:a80c3da69a0991423a728e9b74a2dfe15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12e88a0bbfcc24b1863754f5e027d28e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a12e88a0bbfcc24b1863754f5e027d28e">Fq12Square</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:a12e88a0bbfcc24b1863754f5e027d28e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Square an element of Fq12. <a href="#a12e88a0bbfcc24b1863754f5e027d28e">More...</a><br /></td></tr>
+<tr class="separator:a12e88a0bbfcc24b1863754f5e027d28e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec7e0ce55e01ab48c0c6315cb9e5b47d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#aec7e0ce55e01ab48c0c6315cb9e5b47d">Fq12Mul</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *left, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *right)</td></tr>
+<tr class="memdesc:aec7e0ce55e01ab48c0c6315cb9e5b47d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fq12. <a href="#aec7e0ce55e01ab48c0c6315cb9e5b47d">More...</a><br /></td></tr>
+<tr class="separator:aec7e0ce55e01ab48c0c6315cb9e5b47d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd089e0cb6e4ec68a3a3062f26d4430d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#afd089e0cb6e4ec68a3a3062f26d4430d">Fq12Inv</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:afd089e0cb6e4ec68a3a3062f26d4430d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert an element of Fq12. <a href="#afd089e0cb6e4ec68a3a3062f26d4430d">More...</a><br /></td></tr>
+<tr class="separator:afd089e0cb6e4ec68a3a3062f26d4430d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3fd9055d559c592eb5715bb261c072b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#af3fd9055d559c592eb5715bb261c072b">Fq12Neg</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:af3fd9055d559c592eb5715bb261c072b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate an element of Fq12. <a href="#af3fd9055d559c592eb5715bb261c072b">More...</a><br /></td></tr>
+<tr class="separator:af3fd9055d559c592eb5715bb261c072b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd16f86f83021d44d25389ad9f701597"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#acd16f86f83021d44d25389ad9f701597">Fq12Set</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, uint32_t val)</td></tr>
+<tr class="memdesc:acd16f86f83021d44d25389ad9f701597"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set an element's value. <a href="#acd16f86f83021d44d25389ad9f701597">More...</a><br /></td></tr>
+<tr class="separator:acd16f86f83021d44d25389ad9f701597"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bf52e5b01103632fa429927e5a07b1d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a3bf52e5b01103632fa429927e5a07b1d">Fq12Exp</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *base, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp)</td></tr>
+<tr class="memdesc:a3bf52e5b01103632fa429927e5a07b1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate an element of Fq12 by a large integer. <a href="#a3bf52e5b01103632fa429927e5a07b1d">More...</a><br /></td></tr>
+<tr class="separator:a3bf52e5b01103632fa429927e5a07b1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae88eb95c37c9db2e37e14d8a9304fadd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#ae88eb95c37c9db2e37e14d8a9304fadd">Fq12MultiExp</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *base0, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp0, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *base1, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp1, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *base2, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp2, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *base3, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp3)</td></tr>
+<tr class="memdesc:ae88eb95c37c9db2e37e14d8a9304fadd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply of exponentiation of elements of Fq12 by a large integers. <a href="#ae88eb95c37c9db2e37e14d8a9304fadd">More...</a><br /></td></tr>
+<tr class="separator:ae88eb95c37c9db2e37e14d8a9304fadd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08b50a1f5fe19c78a19f1f4a457b9a39"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a08b50a1f5fe19c78a19f1f4a457b9a39">Fq12Eq</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *left, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *right)</td></tr>
+<tr class="memdesc:a08b50a1f5fe19c78a19f1f4a457b9a39"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two elements in Fq12 are equal. <a href="#a08b50a1f5fe19c78a19f1f4a457b9a39">More...</a><br /></td></tr>
+<tr class="separator:a08b50a1f5fe19c78a19f1f4a457b9a39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33a3bb0f378ac008cde38b88a39ea79c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a33a3bb0f378ac008cde38b88a39ea79c">Fq12Conj</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:a33a3bb0f378ac008cde38b88a39ea79c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate the conjugate of an element of Fq2. <a href="#a33a3bb0f378ac008cde38b88a39ea79c">More...</a><br /></td></tr>
+<tr class="separator:a33a3bb0f378ac008cde38b88a39ea79c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65ad8c0f4aa0859593aab885066c5025"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a65ad8c0f4aa0859593aab885066c5025">Fq12ExpCyc</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *t)</td></tr>
+<tr class="memdesc:a65ad8c0f4aa0859593aab885066c5025"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate the cyclotomic exponentiation of an element of Fq12 by another element of Fq12. <a href="#a65ad8c0f4aa0859593aab885066c5025">More...</a><br /></td></tr>
+<tr class="separator:a65ad8c0f4aa0859593aab885066c5025"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ad8710126bb4906d6170dd8ab30e43a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#a1ad8710126bb4906d6170dd8ab30e43a">Fq12SqCyc</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:a1ad8710126bb4906d6170dd8ab30e43a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate the cyclotomic square of an element of fq12. <a href="#a1ad8710126bb4906d6170dd8ab30e43a">More...</a><br /></td></tr>
+<tr class="separator:a1ad8710126bb4906d6170dd8ab30e43a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1b44bbceb1c648b2b880871c8b52195"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#ac1b44bbceb1c648b2b880871c8b52195">Fq12MulSpecial</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *left, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *right)</td></tr>
+<tr class="memdesc:ac1b44bbceb1c648b2b880871c8b52195"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fq12. <a href="#ac1b44bbceb1c648b2b880871c8b52195">More...</a><br /></td></tr>
+<tr class="separator:ac1b44bbceb1c648b2b880871c8b52195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad739d6a59a3f7ed0c0117c7486d06290"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#ad739d6a59a3f7ed0c0117c7486d06290">Fq12Cp</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *in)</td></tr>
+<tr class="memdesc:ad739d6a59a3f7ed0c0117c7486d06290"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy an element's value. <a href="#ad739d6a59a3f7ed0c0117c7486d06290">More...</a><br /></td></tr>
+<tr class="separator:ad739d6a59a3f7ed0c0117c7486d06290"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaeb34cf6f4d176674fc300d7e7fc57f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq12_8h.html#aaeb34cf6f4d176674fc300d7e7fc57f1">Fq12Clear</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *result)</td></tr>
+<tr class="memdesc:aaeb34cf6f4d176674fc300d7e7fc57f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear an element's value. <a href="#aaeb34cf6f4d176674fc300d7e7fc57f1">More...</a><br /></td></tr>
+<tr class="separator:aaeb34cf6f4d176674fc300d7e7fc57f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Fq12 math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aa4a17bfa56644ab615c60bd7ec900821"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa4a17bfa56644ab615c60bd7ec900821">&#9670;&nbsp;</a></span>Fq12Add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Add </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two elements of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaeb34cf6f4d176674fc300d7e7fc57f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaeb34cf6f4d176674fc300d7e7fc57f1">&#9670;&nbsp;</a></span>Fq12Clear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Clear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>element to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a33a3bb0f378ac008cde38b88a39ea79c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33a3bb0f378ac008cde38b88a39ea79c">&#9670;&nbsp;</a></span>Fq12Conj()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Conj </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate the conjugate of an element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the conjugate of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad739d6a59a3f7ed0c0117c7486d06290"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad739d6a59a3f7ed0c0117c7486d06290">&#9670;&nbsp;</a></span>Fq12Cp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Cp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a08b50a1f5fe19c78a19f1f4a457b9a39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08b50a1f5fe19c78a19f1f4a457b9a39">&#9670;&nbsp;</a></span>Fq12Eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int Fq12Eq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two elements in Fq12 are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a3bf52e5b01103632fa429927e5a07b1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3bf52e5b01103632fa429927e5a07b1d">&#9670;&nbsp;</a></span>Fq12Exp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Exp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate an element of Fq12 by a large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a65ad8c0f4aa0859593aab885066c5025"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65ad8c0f4aa0859593aab885066c5025">&#9670;&nbsp;</a></span>Fq12ExpCyc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12ExpCyc </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>t</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate the cyclotomic exponentiation of an element of Fq12 by another element of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">result</td><td>the base of the exponentiation. This will receive the result. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">t</td><td>pairing parameter t </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="afd089e0cb6e4ec68a3a3062f26d4430d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd089e0cb6e4ec68a3a3062f26d4430d">&#9670;&nbsp;</a></span>Fq12Inv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Inv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert an element of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the inverse of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to invert. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aec7e0ce55e01ab48c0c6315cb9e5b47d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec7e0ce55e01ab48c0c6315cb9e5b47d">&#9670;&nbsp;</a></span>Fq12Mul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Mul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac1b44bbceb1c648b2b880871c8b52195"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1b44bbceb1c648b2b880871c8b52195">&#9670;&nbsp;</a></span>Fq12MulSpecial()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12MulSpecial </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fq12. </p>
+<p>Requires that b[2] = b[4] = b[5] = 0. where right = ((b[0], b[2], b[4]), (b[1], b[3], b[5]))</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae88eb95c37c9db2e37e14d8a9304fadd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae88eb95c37c9db2e37e14d8a9304fadd">&#9670;&nbsp;</a></span>Fq12MultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12MultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp0</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply of exponentiation of elements of Fq12 by a large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base0</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp0</td><td>the exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base1</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp1</td><td>the exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base2</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp2</td><td>the exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base3</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp3</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="af3fd9055d559c592eb5715bb261c072b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3fd9055d559c592eb5715bb261c072b">&#9670;&nbsp;</a></span>Fq12Neg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Neg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate an element of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="acd16f86f83021d44d25389ad9f701597"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd16f86f83021d44d25389ad9f701597">&#9670;&nbsp;</a></span>Fq12Set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Set </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1ad8710126bb4906d6170dd8ab30e43a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ad8710126bb4906d6170dd8ab30e43a">&#9670;&nbsp;</a></span>Fq12SqCyc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12SqCyc </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate the cyclotomic square of an element of fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">result</td><td>result of the cyclotomic square. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the base. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a12e88a0bbfcc24b1863754f5e027d28e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12e88a0bbfcc24b1863754f5e027d28e">&#9670;&nbsp;</a></span>Fq12Square()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Square </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Square an element of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the square of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to square. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a80c3da69a0991423a728e9b74a2dfe15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a80c3da69a0991423a728e9b74a2dfe15">&#9670;&nbsp;</a></span>Fq12Sub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq12Sub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two elements of Fq12. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of subtracting left from right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="fq12_8h.html">fq12.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/fq2_8h.html b/doc/html/fq2_8h.html
new file mode 100644
index 0000000..58fce5c
--- /dev/null
+++ b/doc/html/fq2_8h.html
@@ -0,0 +1,762 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/fq2.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('fq2_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fq2.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Fq2 math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6c67364f78e6946a7ad3af2c86baf1a5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a6c67364f78e6946a7ad3af2c86baf1a5">Fq2Cp</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:a6c67364f78e6946a7ad3af2c86baf1a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy an element's value. <a href="#a6c67364f78e6946a7ad3af2c86baf1a5">More...</a><br /></td></tr>
+<tr class="separator:a6c67364f78e6946a7ad3af2c86baf1a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9165c1d2deef46ceb9af238928b2ec5c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a9165c1d2deef46ceb9af238928b2ec5c">Fq2Set</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, uint32_t in)</td></tr>
+<tr class="memdesc:a9165c1d2deef46ceb9af238928b2ec5c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set an element's value. <a href="#a9165c1d2deef46ceb9af238928b2ec5c">More...</a><br /></td></tr>
+<tr class="separator:a9165c1d2deef46ceb9af238928b2ec5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59d3d8212ffd5bf75f9b6fd85b896654"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a59d3d8212ffd5bf75f9b6fd85b896654">Fq2Clear</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result)</td></tr>
+<tr class="memdesc:a59d3d8212ffd5bf75f9b6fd85b896654"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear an element's value. <a href="#a59d3d8212ffd5bf75f9b6fd85b896654">More...</a><br /></td></tr>
+<tr class="separator:a59d3d8212ffd5bf75f9b6fd85b896654"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afcaaf75460f36b85386cd1959b904f57"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#afcaaf75460f36b85386cd1959b904f57">Fq2Add</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *left, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *right)</td></tr>
+<tr class="memdesc:afcaaf75460f36b85386cd1959b904f57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two elements of Fq2. <a href="#afcaaf75460f36b85386cd1959b904f57">More...</a><br /></td></tr>
+<tr class="separator:afcaaf75460f36b85386cd1959b904f57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acecbff7a5a8cec15e24c47663957c05a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#acecbff7a5a8cec15e24c47663957c05a">Fq2Exp</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *base, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp)</td></tr>
+<tr class="memdesc:acecbff7a5a8cec15e24c47663957c05a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate an element of Fq2 by a large integer. <a href="#acecbff7a5a8cec15e24c47663957c05a">More...</a><br /></td></tr>
+<tr class="separator:acecbff7a5a8cec15e24c47663957c05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae27a9400b5d8fbd0b720a449c60ad146"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#ae27a9400b5d8fbd0b720a449c60ad146">Fq2Sub</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *left, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *right)</td></tr>
+<tr class="memdesc:ae27a9400b5d8fbd0b720a449c60ad146"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two elements of Fq2. <a href="#ae27a9400b5d8fbd0b720a449c60ad146">More...</a><br /></td></tr>
+<tr class="separator:ae27a9400b5d8fbd0b720a449c60ad146"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a876f870f84cd8ab697176dbb42591565"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a876f870f84cd8ab697176dbb42591565">Fq2Mul</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *left, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *right)</td></tr>
+<tr class="memdesc:a876f870f84cd8ab697176dbb42591565"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fq2. <a href="#a876f870f84cd8ab697176dbb42591565">More...</a><br /></td></tr>
+<tr class="separator:a876f870f84cd8ab697176dbb42591565"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a756666161516fe541b26a4082f69343d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a756666161516fe541b26a4082f69343d">Fq2Inv</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:a756666161516fe541b26a4082f69343d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert an element of Fq2. <a href="#a756666161516fe541b26a4082f69343d">More...</a><br /></td></tr>
+<tr class="separator:a756666161516fe541b26a4082f69343d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d523d5d6d4159c71f58945af82a7936"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a5d523d5d6d4159c71f58945af82a7936">Fq2Neg</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:a5d523d5d6d4159c71f58945af82a7936"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate an element of Fq2. <a href="#a5d523d5d6d4159c71f58945af82a7936">More...</a><br /></td></tr>
+<tr class="separator:a5d523d5d6d4159c71f58945af82a7936"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc0d02ddec564ca86b0ef53d7ff79864"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#adc0d02ddec564ca86b0ef53d7ff79864">Fq2Conj</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:adc0d02ddec564ca86b0ef53d7ff79864"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate the conjugate of an element of Fq2. <a href="#adc0d02ddec564ca86b0ef53d7ff79864">More...</a><br /></td></tr>
+<tr class="separator:adc0d02ddec564ca86b0ef53d7ff79864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c6583dd519a3dd7efb26db5e9a59036"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a3c6583dd519a3dd7efb26db5e9a59036">Fq2Square</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:a3c6583dd519a3dd7efb26db5e9a59036"><td class="mdescLeft">&#160;</td><td class="mdescRight">Square an element of Fq2. <a href="#a3c6583dd519a3dd7efb26db5e9a59036">More...</a><br /></td></tr>
+<tr class="separator:a3c6583dd519a3dd7efb26db5e9a59036"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af45903d791794faabedb00f760885e8c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#af45903d791794faabedb00f760885e8c">Fq2MulScalar</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *left, <a class="el" href="struct_fq_elem.html">FqElem</a> const *right)</td></tr>
+<tr class="memdesc:af45903d791794faabedb00f760885e8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply an element of Fq2 by and element of Fq. <a href="#af45903d791794faabedb00f760885e8c">More...</a><br /></td></tr>
+<tr class="separator:af45903d791794faabedb00f760885e8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad94b155025e7a11b9c5b60032fde4491"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#ad94b155025e7a11b9c5b60032fde4491">Fq2CondSet</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *true_val, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *false_val, int truth_val)</td></tr>
+<tr class="memdesc:ad94b155025e7a11b9c5b60032fde4491"><td class="mdescLeft">&#160;</td><td class="mdescRight">Conditionally Set an element's value to one of two values. <a href="#ad94b155025e7a11b9c5b60032fde4491">More...</a><br /></td></tr>
+<tr class="separator:ad94b155025e7a11b9c5b60032fde4491"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3dc330cff53539b51183c43085275f97"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a3dc330cff53539b51183c43085275f97">Fq2Eq</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *left, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *right)</td></tr>
+<tr class="memdesc:a3dc330cff53539b51183c43085275f97"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two elements in Fq2 are equal. <a href="#a3dc330cff53539b51183c43085275f97">More...</a><br /></td></tr>
+<tr class="separator:a3dc330cff53539b51183c43085275f97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afeeb4e14ddf9f39f860661c599923c58"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#afeeb4e14ddf9f39f860661c599923c58">Fq2MulXi</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *result, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *in)</td></tr>
+<tr class="memdesc:afeeb4e14ddf9f39f860661c599923c58"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply an element of Fq2 by xi. <a href="#afeeb4e14ddf9f39f860661c599923c58">More...</a><br /></td></tr>
+<tr class="separator:afeeb4e14ddf9f39f860661c599923c58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a610c9d7c2afa63b1d48da30c684d6e27"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq2_8h.html#a610c9d7c2afa63b1d48da30c684d6e27">Fq2IsZero</a> (<a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *value)</td></tr>
+<tr class="memdesc:a610c9d7c2afa63b1d48da30c684d6e27"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if an element is zero. <a href="#a610c9d7c2afa63b1d48da30c684d6e27">More...</a><br /></td></tr>
+<tr class="separator:a610c9d7c2afa63b1d48da30c684d6e27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Fq2 math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="afcaaf75460f36b85386cd1959b904f57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afcaaf75460f36b85386cd1959b904f57">&#9670;&nbsp;</a></span>Fq2Add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Add </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two elements of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a59d3d8212ffd5bf75f9b6fd85b896654"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59d3d8212ffd5bf75f9b6fd85b896654">&#9670;&nbsp;</a></span>Fq2Clear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Clear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>element to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad94b155025e7a11b9c5b60032fde4491"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad94b155025e7a11b9c5b60032fde4491">&#9670;&nbsp;</a></span>Fq2CondSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2CondSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>true_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>false_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>truth_val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Conditionally Set an element's value to one of two values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">true_val</td><td>value to set if condition is true. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">false_val</td><td>value to set if condition is false. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">truth_val</td><td>value of condition. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="adc0d02ddec564ca86b0ef53d7ff79864"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc0d02ddec564ca86b0ef53d7ff79864">&#9670;&nbsp;</a></span>Fq2Conj()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Conj </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate the conjugate of an element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the conjugate of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6c67364f78e6946a7ad3af2c86baf1a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c67364f78e6946a7ad3af2c86baf1a5">&#9670;&nbsp;</a></span>Fq2Cp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Cp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3dc330cff53539b51183c43085275f97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3dc330cff53539b51183c43085275f97">&#9670;&nbsp;</a></span>Fq2Eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int Fq2Eq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two elements in Fq2 are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="acecbff7a5a8cec15e24c47663957c05a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acecbff7a5a8cec15e24c47663957c05a">&#9670;&nbsp;</a></span>Fq2Exp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Exp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate an element of Fq2 by a large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a756666161516fe541b26a4082f69343d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a756666161516fe541b26a4082f69343d">&#9670;&nbsp;</a></span>Fq2Inv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Inv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert an element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the inverse of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to invert. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a610c9d7c2afa63b1d48da30c684d6e27"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a610c9d7c2afa63b1d48da30c684d6e27">&#9670;&nbsp;</a></span>Fq2IsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int Fq2IsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if an element is zero. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>the element to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the value is zero. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a876f870f84cd8ab697176dbb42591565"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a876f870f84cd8ab697176dbb42591565">&#9670;&nbsp;</a></span>Fq2Mul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Mul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="af45903d791794faabedb00f760885e8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af45903d791794faabedb00f760885e8c">&#9670;&nbsp;</a></span>Fq2MulScalar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2MulScalar </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply an element of Fq2 by and element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="afeeb4e14ddf9f39f860661c599923c58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afeeb4e14ddf9f39f860661c599923c58">&#9670;&nbsp;</a></span>Fq2MulXi()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2MulXi </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply an element of Fq2 by xi. </p>
+<p>This function was formerly called as Fq2Const.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying in by xi. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>The first operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5d523d5d6d4159c71f58945af82a7936"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5d523d5d6d4159c71f58945af82a7936">&#9670;&nbsp;</a></span>Fq2Neg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Neg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate an element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9165c1d2deef46ceb9af238928b2ec5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9165c1d2deef46ceb9af238928b2ec5c">&#9670;&nbsp;</a></span>Fq2Set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Set </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3c6583dd519a3dd7efb26db5e9a59036"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c6583dd519a3dd7efb26db5e9a59036">&#9670;&nbsp;</a></span>Fq2Square()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Square </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Square an element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the square of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to square. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae27a9400b5d8fbd0b720a449c60ad146"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae27a9400b5d8fbd0b720a449c60ad146">&#9670;&nbsp;</a></span>Fq2Sub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq2Sub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two elements of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of subtracting left from right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="fq2_8h.html">fq2.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/fq6_8h.html b/doc/html/fq6_8h.html
new file mode 100644
index 0000000..bfac9f1
--- /dev/null
+++ b/doc/html/fq6_8h.html
@@ -0,0 +1,675 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/fq6.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('fq6_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fq6.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Fq6 math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0607ab44e53c7a16f8e1b2746d250a7c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a0607ab44e53c7a16f8e1b2746d250a7c">Fq6Add</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *left, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *right)</td></tr>
+<tr class="memdesc:a0607ab44e53c7a16f8e1b2746d250a7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two elements of Fq6. <a href="#a0607ab44e53c7a16f8e1b2746d250a7c">More...</a><br /></td></tr>
+<tr class="separator:a0607ab44e53c7a16f8e1b2746d250a7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87d07ab842862a482410a838516ad0c7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a87d07ab842862a482410a838516ad0c7">Fq6Sub</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *left, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *right)</td></tr>
+<tr class="memdesc:a87d07ab842862a482410a838516ad0c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two elements of Fq6. <a href="#a87d07ab842862a482410a838516ad0c7">More...</a><br /></td></tr>
+<tr class="separator:a87d07ab842862a482410a838516ad0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1e1cac423a2c3c69a4f3629d33faaf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#ad1e1cac423a2c3c69a4f3629d33faaf1">Fq6Mul</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *left, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *right)</td></tr>
+<tr class="memdesc:ad1e1cac423a2c3c69a4f3629d33faaf1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fq6. <a href="#ad1e1cac423a2c3c69a4f3629d33faaf1">More...</a><br /></td></tr>
+<tr class="separator:ad1e1cac423a2c3c69a4f3629d33faaf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f4708ca109578527afd8cda99acd6ee"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a5f4708ca109578527afd8cda99acd6ee">Fq6Inv</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:a5f4708ca109578527afd8cda99acd6ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert an element of Fq6. <a href="#a5f4708ca109578527afd8cda99acd6ee">More...</a><br /></td></tr>
+<tr class="separator:a5f4708ca109578527afd8cda99acd6ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a5ddbf8f16b48030209b172079d22a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a9a5ddbf8f16b48030209b172079d22a6">Fq6Neg</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:a9a5ddbf8f16b48030209b172079d22a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate an element of Fq6. <a href="#a9a5ddbf8f16b48030209b172079d22a6">More...</a><br /></td></tr>
+<tr class="separator:a9a5ddbf8f16b48030209b172079d22a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c77a862223f577e11e595332c9fb272"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a7c77a862223f577e11e595332c9fb272">Fq6Clear</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result)</td></tr>
+<tr class="memdesc:a7c77a862223f577e11e595332c9fb272"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear an element's value. <a href="#a7c77a862223f577e11e595332c9fb272">More...</a><br /></td></tr>
+<tr class="separator:a7c77a862223f577e11e595332c9fb272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a701d89b5c73ba67a2f765d49f5d5ae4e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a701d89b5c73ba67a2f765d49f5d5ae4e">Fq6MulScalar</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in, <a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *scalar)</td></tr>
+<tr class="memdesc:a701d89b5c73ba67a2f765d49f5d5ae4e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply an element of Fq6 by and element of Fq2. <a href="#a701d89b5c73ba67a2f765d49f5d5ae4e">More...</a><br /></td></tr>
+<tr class="separator:a701d89b5c73ba67a2f765d49f5d5ae4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad30bd276a4e2e9df3613072c38ec13ae"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#ad30bd276a4e2e9df3613072c38ec13ae">Fq6MulV</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:ad30bd276a4e2e9df3613072c38ec13ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply an element of Fq6 by V. <a href="#ad30bd276a4e2e9df3613072c38ec13ae">More...</a><br /></td></tr>
+<tr class="separator:ad30bd276a4e2e9df3613072c38ec13ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf54d03c0afdb6eeced6ddad1237c2e4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#aaf54d03c0afdb6eeced6ddad1237c2e4">Fq6Eq</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *left, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *right)</td></tr>
+<tr class="memdesc:aaf54d03c0afdb6eeced6ddad1237c2e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two elements in Fq6 are equal. <a href="#aaf54d03c0afdb6eeced6ddad1237c2e4">More...</a><br /></td></tr>
+<tr class="separator:aaf54d03c0afdb6eeced6ddad1237c2e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a634aab5dc04177587a22324352ff91e5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a634aab5dc04177587a22324352ff91e5">Fq6IsZero</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:a634aab5dc04177587a22324352ff91e5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if an element is zero. <a href="#a634aab5dc04177587a22324352ff91e5">More...</a><br /></td></tr>
+<tr class="separator:a634aab5dc04177587a22324352ff91e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58e5b68a86b776d82ade8307046e2375"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a58e5b68a86b776d82ade8307046e2375">Fq6Square</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:a58e5b68a86b776d82ade8307046e2375"><td class="mdescLeft">&#160;</td><td class="mdescRight">Square an element of Fq6. <a href="#a58e5b68a86b776d82ade8307046e2375">More...</a><br /></td></tr>
+<tr class="separator:a58e5b68a86b776d82ade8307046e2375"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36bd769bc95b887f75bb60c2f7a45e17"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a36bd769bc95b887f75bb60c2f7a45e17">Fq6Cp</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *in)</td></tr>
+<tr class="memdesc:a36bd769bc95b887f75bb60c2f7a45e17"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy an element's value. <a href="#a36bd769bc95b887f75bb60c2f7a45e17">More...</a><br /></td></tr>
+<tr class="separator:a36bd769bc95b887f75bb60c2f7a45e17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0c82e905ee190ad2187b89e464466d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#aa0c82e905ee190ad2187b89e464466d4">Fq6CondSet</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *true_val, <a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *false_val, int truth_val)</td></tr>
+<tr class="memdesc:aa0c82e905ee190ad2187b89e464466d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Conditionally Set an element's value to one of two values. <a href="#aa0c82e905ee190ad2187b89e464466d4">More...</a><br /></td></tr>
+<tr class="separator:aa0c82e905ee190ad2187b89e464466d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a06b8c3988c3782fda22c9ffb47b5180b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq6_8h.html#a06b8c3988c3782fda22c9ffb47b5180b">Fq6Set</a> (<a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *result, uint32_t in)</td></tr>
+<tr class="memdesc:a06b8c3988c3782fda22c9ffb47b5180b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set an element's value. <a href="#a06b8c3988c3782fda22c9ffb47b5180b">More...</a><br /></td></tr>
+<tr class="separator:a06b8c3988c3782fda22c9ffb47b5180b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Fq6 math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a0607ab44e53c7a16f8e1b2746d250a7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0607ab44e53c7a16f8e1b2746d250a7c">&#9670;&nbsp;</a></span>Fq6Add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Add </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two elements of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7c77a862223f577e11e595332c9fb272"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c77a862223f577e11e595332c9fb272">&#9670;&nbsp;</a></span>Fq6Clear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Clear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>element to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa0c82e905ee190ad2187b89e464466d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa0c82e905ee190ad2187b89e464466d4">&#9670;&nbsp;</a></span>Fq6CondSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6CondSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>true_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>false_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>truth_val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Conditionally Set an element's value to one of two values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">true_val</td><td>value to set if condition is true. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">false_val</td><td>value to set if condition is false. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">truth_val</td><td>value of condition. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a36bd769bc95b887f75bb60c2f7a45e17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36bd769bc95b887f75bb60c2f7a45e17">&#9670;&nbsp;</a></span>Fq6Cp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Cp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaf54d03c0afdb6eeced6ddad1237c2e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf54d03c0afdb6eeced6ddad1237c2e4">&#9670;&nbsp;</a></span>Fq6Eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int Fq6Eq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two elements in Fq6 are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a5f4708ca109578527afd8cda99acd6ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f4708ca109578527afd8cda99acd6ee">&#9670;&nbsp;</a></span>Fq6Inv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Inv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert an element of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the inverse of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to invert. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a634aab5dc04177587a22324352ff91e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a634aab5dc04177587a22324352ff91e5">&#9670;&nbsp;</a></span>Fq6IsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int Fq6IsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if an element is zero. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the value is zero. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="ad1e1cac423a2c3c69a4f3629d33faaf1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad1e1cac423a2c3c69a4f3629d33faaf1">&#9670;&nbsp;</a></span>Fq6Mul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Mul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a701d89b5c73ba67a2f765d49f5d5ae4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a701d89b5c73ba67a2f765d49f5d5ae4e">&#9670;&nbsp;</a></span>Fq6MulScalar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6MulScalar </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a> const *&#160;</td>
+ <td class="paramname"><em>scalar</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply an element of Fq6 by and element of Fq2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">scalar</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad30bd276a4e2e9df3613072c38ec13ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad30bd276a4e2e9df3613072c38ec13ae">&#9670;&nbsp;</a></span>Fq6MulV()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6MulV </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply an element of Fq6 by V. </p>
+<p>This function was formerly called as Fq2Const.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying in and V. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>The first operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9a5ddbf8f16b48030209b172079d22a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a5ddbf8f16b48030209b172079d22a6">&#9670;&nbsp;</a></span>Fq6Neg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Neg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate an element of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a06b8c3988c3782fda22c9ffb47b5180b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06b8c3988c3782fda22c9ffb47b5180b">&#9670;&nbsp;</a></span>Fq6Set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Set </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a58e5b68a86b776d82ade8307046e2375"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58e5b68a86b776d82ade8307046e2375">&#9670;&nbsp;</a></span>Fq6Square()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Square </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Square an element of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the square of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to square. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a87d07ab842862a482410a838516ad0c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a87d07ab842862a482410a838516ad0c7">&#9670;&nbsp;</a></span>Fq6Sub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Fq6Sub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two elements of Fq6. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of subtracting left from right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="fq6_8h.html">fq6.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/fq_8h.html b/doc/html/fq_8h.html
new file mode 100644
index 0000000..352c938
--- /dev/null
+++ b/doc/html/fq_8h.html
@@ -0,0 +1,803 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/fq.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('fq_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fq.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Fq math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aceb37a8f5538fe9ca682058ff0e36091"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#aceb37a8f5538fe9ca682058ff0e36091">FqInField</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:aceb37a8f5538fe9ca682058ff0e36091"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if an element is in Fq. <a href="#aceb37a8f5538fe9ca682058ff0e36091">More...</a><br /></td></tr>
+<tr class="separator:aceb37a8f5538fe9ca682058ff0e36091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab52f69c761454d976c3fc56a26549419"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ab52f69c761454d976c3fc56a26549419">FqAdd</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *left, <a class="el" href="struct_fq_elem.html">FqElem</a> const *right)</td></tr>
+<tr class="memdesc:ab52f69c761454d976c3fc56a26549419"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two elements of Fq. <a href="#ab52f69c761454d976c3fc56a26549419">More...</a><br /></td></tr>
+<tr class="separator:ab52f69c761454d976c3fc56a26549419"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5148f610202ae759aafb197cb52137f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a5148f610202ae759aafb197cb52137f1">FqSub</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *left, <a class="el" href="struct_fq_elem.html">FqElem</a> const *right)</td></tr>
+<tr class="memdesc:a5148f610202ae759aafb197cb52137f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two elements of Fq. <a href="#a5148f610202ae759aafb197cb52137f1">More...</a><br /></td></tr>
+<tr class="separator:a5148f610202ae759aafb197cb52137f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0bf77a97fb3a12292886bef3abcf9bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ab0bf77a97fb3a12292886bef3abcf9bd">FqMul</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *left, <a class="el" href="struct_fq_elem.html">FqElem</a> const *right)</td></tr>
+<tr class="memdesc:ab0bf77a97fb3a12292886bef3abcf9bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two elements of Fq. <a href="#ab0bf77a97fb3a12292886bef3abcf9bd">More...</a><br /></td></tr>
+<tr class="separator:ab0bf77a97fb3a12292886bef3abcf9bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a276d3747aefdac5503982f2aa5eccbf8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a276d3747aefdac5503982f2aa5eccbf8">FqExp</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *base, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp)</td></tr>
+<tr class="memdesc:a276d3747aefdac5503982f2aa5eccbf8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate an element of Fq by a large integer. <a href="#a276d3747aefdac5503982f2aa5eccbf8">More...</a><br /></td></tr>
+<tr class="separator:a276d3747aefdac5503982f2aa5eccbf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17133e5b777baa8c745b7dfcf1c8ad8d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a17133e5b777baa8c745b7dfcf1c8ad8d">FqCp</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:a17133e5b777baa8c745b7dfcf1c8ad8d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy an element's value. <a href="#a17133e5b777baa8c745b7dfcf1c8ad8d">More...</a><br /></td></tr>
+<tr class="separator:a17133e5b777baa8c745b7dfcf1c8ad8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac08ca8c781cd18cbadabbeeb85722e49"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ac08ca8c781cd18cbadabbeeb85722e49">FqIsZero</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> const *value)</td></tr>
+<tr class="memdesc:ac08ca8c781cd18cbadabbeeb85722e49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if an element is zero. <a href="#ac08ca8c781cd18cbadabbeeb85722e49">More...</a><br /></td></tr>
+<tr class="separator:ac08ca8c781cd18cbadabbeeb85722e49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b60a8996973d474d2fb7a31838c6d8c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a7b60a8996973d474d2fb7a31838c6d8c">FqInv</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:a7b60a8996973d474d2fb7a31838c6d8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert an element of Fq. <a href="#a7b60a8996973d474d2fb7a31838c6d8c">More...</a><br /></td></tr>
+<tr class="separator:a7b60a8996973d474d2fb7a31838c6d8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8379530cca959e7e36446b2979d8af4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ae8379530cca959e7e36446b2979d8af4">FqNeg</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:ae8379530cca959e7e36446b2979d8af4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate an element of Fq. <a href="#ae8379530cca959e7e36446b2979d8af4">More...</a><br /></td></tr>
+<tr class="separator:ae8379530cca959e7e36446b2979d8af4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab62c8f43f78a0c4f830c9ed65048b8f9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ab62c8f43f78a0c4f830c9ed65048b8f9">FqSquare</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:ab62c8f43f78a0c4f830c9ed65048b8f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Square an element of Fq. <a href="#ab62c8f43f78a0c4f830c9ed65048b8f9">More...</a><br /></td></tr>
+<tr class="separator:ab62c8f43f78a0c4f830c9ed65048b8f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac85eb642d3b3973477749769e04d45af"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ac85eb642d3b3973477749769e04d45af">FqClear</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result)</td></tr>
+<tr class="memdesc:ac85eb642d3b3973477749769e04d45af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear an element's value. <a href="#ac85eb642d3b3973477749769e04d45af">More...</a><br /></td></tr>
+<tr class="separator:ac85eb642d3b3973477749769e04d45af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab28f9df688a669a64dc04fa33f4cbb64"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#ab28f9df688a669a64dc04fa33f4cbb64">FqSet</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, uint32_t in)</td></tr>
+<tr class="memdesc:ab28f9df688a669a64dc04fa33f4cbb64"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set an element's value. <a href="#ab28f9df688a669a64dc04fa33f4cbb64">More...</a><br /></td></tr>
+<tr class="separator:ab28f9df688a669a64dc04fa33f4cbb64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd40d255e0094f7156092db44a3b90fa"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#abd40d255e0094f7156092db44a3b90fa">FqEq</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> const *left, <a class="el" href="struct_fq_elem.html">FqElem</a> const *right)</td></tr>
+<tr class="memdesc:abd40d255e0094f7156092db44a3b90fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if two elements in Fq are equal. <a href="#abd40d255e0094f7156092db44a3b90fa">More...</a><br /></td></tr>
+<tr class="separator:abd40d255e0094f7156092db44a3b90fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afbb0976ef343b14c66305db0a48647ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#afbb0976ef343b14c66305db0a48647ca">FqCondSet</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *true_val, <a class="el" href="struct_fq_elem.html">FqElem</a> const *false_val, int truth_val)</td></tr>
+<tr class="memdesc:afbb0976ef343b14c66305db0a48647ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Conditionally Set an element's value to one of two values. <a href="#afbb0976ef343b14c66305db0a48647ca">More...</a><br /></td></tr>
+<tr class="separator:afbb0976ef343b14c66305db0a48647ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cbded46e28a1e6f641c5c0ae37fd744"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a0cbded46e28a1e6f641c5c0ae37fd744">FqSqrt</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="struct_fq_elem.html">FqElem</a> const *in)</td></tr>
+<tr class="memdesc:a0cbded46e28a1e6f641c5c0ae37fd744"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the Square root of an element of Fq. <a href="#a0cbded46e28a1e6f641c5c0ae37fd744">More...</a><br /></td></tr>
+<tr class="separator:a0cbded46e28a1e6f641c5c0ae37fd744"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cc7d7d7640cd0bbcb635e95be3ed8a3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a5cc7d7d7640cd0bbcb635e95be3ed8a3">FqRand</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a5cc7d7d7640cd0bbcb635e95be3ed8a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a random element of Fq. <a href="#a5cc7d7d7640cd0bbcb635e95be3ed8a3">More...</a><br /></td></tr>
+<tr class="separator:a5cc7d7d7640cd0bbcb635e95be3ed8a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7794f72bcc506f8d8a60dbfae1a70ed0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fq_8h.html#a7794f72bcc506f8d8a60dbfae1a70ed0">FqFromHash</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *result, unsigned char const *hash, size_t len)</td></tr>
+<tr class="memdesc:a7794f72bcc506f8d8a60dbfae1a70ed0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reinterpret a buffer as an element of Fq. <a href="#a7794f72bcc506f8d8a60dbfae1a70ed0">More...</a><br /></td></tr>
+<tr class="separator:a7794f72bcc506f8d8a60dbfae1a70ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Fq math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab52f69c761454d976c3fc56a26549419"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab52f69c761454d976c3fc56a26549419">&#9670;&nbsp;</a></span>FqAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two elements of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of adding left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac85eb642d3b3973477749769e04d45af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac85eb642d3b3973477749769e04d45af">&#9670;&nbsp;</a></span>FqClear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqClear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>element to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="afbb0976ef343b14c66305db0a48647ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afbb0976ef343b14c66305db0a48647ca">&#9670;&nbsp;</a></span>FqCondSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqCondSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>true_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>false_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>truth_val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Conditionally Set an element's value to one of two values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">true_val</td><td>value to set if condition is true. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">false_val</td><td>value to set if condition is false. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">truth_val</td><td>value of condition. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a17133e5b777baa8c745b7dfcf1c8ad8d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17133e5b777baa8c745b7dfcf1c8ad8d">&#9670;&nbsp;</a></span>FqCp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqCp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>copy target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>copy source. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="abd40d255e0094f7156092db44a3b90fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd40d255e0094f7156092db44a3b90fa">&#9670;&nbsp;</a></span>FqEq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FqEq </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if two elements in Fq are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be tested. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be tested. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a276d3747aefdac5503982f2aa5eccbf8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a276d3747aefdac5503982f2aa5eccbf8">&#9670;&nbsp;</a></span>FqExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate an element of Fq by a large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7794f72bcc506f8d8a60dbfae1a70ed0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7794f72bcc506f8d8a60dbfae1a70ed0">&#9670;&nbsp;</a></span>FqFromHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqFromHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char const *&#160;</td>
+ <td class="paramname"><em>hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Reinterpret a buffer as an element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash</td><td>buffer to reinterpret. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>length of hash in bytes. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aceb37a8f5538fe9ca682058ff0e36091"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aceb37a8f5538fe9ca682058ff0e36091">&#9670;&nbsp;</a></span>FqInField()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FqInField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if an element is in Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) indeed the value is in the field. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a7b60a8996973d474d2fb7a31838c6d8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b60a8996973d474d2fb7a31838c6d8c">&#9670;&nbsp;</a></span>FqInv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqInv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert an element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the inverse of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to invert. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac08ca8c781cd18cbadabbeeb85722e49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac08ca8c781cd18cbadabbeeb85722e49">&#9670;&nbsp;</a></span>FqIsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FqIsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if an element is zero. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>the element to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the value is zero. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="ab0bf77a97fb3a12292886bef3abcf9bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0bf77a97fb3a12292886bef3abcf9bd">&#9670;&nbsp;</a></span>FqMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two elements of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae8379530cca959e7e36446b2979d8af4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8379530cca959e7e36446b2979d8af4">&#9670;&nbsp;</a></span>FqNeg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqNeg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate an element of Fq. </p>
+<p>This function was formerly called as FqConst.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the negative of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to negate. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5cc7d7d7640cd0bbcb635e95be3ed8a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cc7d7d7640cd0bbcb635e95be3ed8a3">&#9670;&nbsp;</a></span>FqRand()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FqRand </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a random element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="ab28f9df688a669a64dc04fa33f4cbb64"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab28f9df688a669a64dc04fa33f4cbb64">&#9670;&nbsp;</a></span>FqSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set an element's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0cbded46e28a1e6f641c5c0ae37fd744"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0cbded46e28a1e6f641c5c0ae37fd744">&#9670;&nbsp;</a></span>FqSqrt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int FqSqrt </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Compute the Square root of an element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the square root of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to find the square root of. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if the square root exists. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="ab62c8f43f78a0c4f830c9ed65048b8f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab62c8f43f78a0c4f830c9ed65048b8f9">&#9670;&nbsp;</a></span>FqSquare()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqSquare </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Square an element of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>the square of the element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the element to square. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5148f610202ae759aafb197cb52137f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5148f610202ae759aafb197cb52137f1">&#9670;&nbsp;</a></span>FqSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void FqSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two elements of Fq. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of subtracting left from right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="fq_8h.html">fq.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions.html b/doc/html/functions.html
new file mode 100644
index 0000000..23513c4
--- /dev/null
+++ b/doc/html/functions.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>a
+: <a class="el" href="struct_epid11_gt_elem_str.html#aed8dd86f1696c2f3537154fc904bf2b0">Epid11GtElemStr</a>
+, <a class="el" href="struct_epid11_params.html#a01381f84b2d747b6273e21c71c58a1b0">Epid11Params</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a2811c1914ffae913820f13da914c8f01">EpidCaCertificate</a>
+, <a class="el" href="struct_fq12_elem_str.html#a0520947335aaf52de90af1dec5bdd112">Fq12ElemStr</a>
+, <a class="el" href="struct_fq2_elem_str.html#ab1d253eb24ba30eaf516ac429daab915">Fq2ElemStr</a>
+, <a class="el" href="struct_fq3_elem_str.html#af1be0a4d5c9c674d75bec34f95e3c731">Fq3ElemStr</a>
+, <a class="el" href="struct_fq6_elem_str.html#a89d656e5c815b4a2382d11ef6932a7d2">Fq6ElemStr</a>
+</li>
+<li>A
+: <a class="el" href="struct_membership_credential.html#a6d38ac3a9c5417833b8adb9b22bc9dc8">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#a266c7e369b8b868ef5755e9cd3c0c849">PrivKey</a>
+</li>
+<li>a_tick
+: <a class="el" href="struct_epid11_params.html#ae8770bb921aac9214ff8c45c41dbb228">Epid11Params</a>
+</li>
+<li>ax
+: <a class="el" href="struct_compressed_priv_key.html#a0b0535f0567eb0e48f799d27991d0f66">CompressedPrivKey</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_b.html b/doc/html/functions_b.html
new file mode 100644
index 0000000..13cf163
--- /dev/null
+++ b/doc/html/functions_b.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_b.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>B
+: <a class="el" href="struct_basic_signature.html#ae90cb6af66b010ae39913f033c1e65ac">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a27fd7ae99d1ada652e21e7508a467c0b">Epid11BasicSignature</a>
+</li>
+<li>b
+: <a class="el" href="struct_epid11_params.html#a27b45ed7771a3024d1d059b4b4ff6eae">Epid11Params</a>
+, <a class="el" href="struct_epid11_sig_rl_entry.html#abe47cfbd00684941f93a211417bedf0c">Epid11SigRlEntry</a>
+, <a class="el" href="struct_epid2_params.html#a2f868edb49be49f645101ef5ebbbc551">Epid2Params</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a280e0b0238cf45834c21849ab8a7e124">EpidCaCertificate</a>
+, <a class="el" href="struct_sig_rl_entry.html#ac6a47ff0d1b8ea1512e0ff14983ac5ce">SigRlEntry</a>
+</li>
+<li>B
+: <a class="el" href="struct_verifier_rl.html#a5d9a9265fffa96fd5f9260543eb08c68">VerifierRl</a>
+</li>
+<li>b_tick
+: <a class="el" href="struct_epid11_params.html#ade3f88ce73d7de656ec67d9fdb0719d7">Epid11Params</a>
+</li>
+<li>beta
+: <a class="el" href="struct_epid2_params.html#ac2d7507c6f58c3451beacacb91b52695">Epid2Params</a>
+</li>
+<li>bk
+: <a class="el" href="struct_epid11_sig_rl.html#a6473f8a98f76c9f82183041ea5ae17e3">Epid11SigRl</a>
+, <a class="el" href="struct_sig_rl.html#ac23a919993d99d24a5150302f1778102">SigRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_c.html b/doc/html/functions_c.html
new file mode 100644
index 0000000..144be22
--- /dev/null
+++ b/doc/html/functions_c.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="struct_basic_signature.html#a4daa94db5068db3f10960f3dd178d603">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a9cc6efcd3d7270022779bd16776168ed">Epid11BasicSignature</a>
+, <a class="el" href="struct_epid11_nr_proof.html#a2e5ee8dc25d296538dce935397a93d68">Epid11NrProof</a>
+, <a class="el" href="struct_join_request.html#a55e30a274e83b808db6fbab5ae6c6cb8">JoinRequest</a>
+, <a class="el" href="struct_nr_proof.html#a0de1aa69acf3d93da34cf4a613b359a1">NrProof</a>
+</li>
+<li>coeff
+: <a class="el" href="struct_epid11_params.html#aacc39ebe0cc625321039ffb6be0b0e87">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_d.html b/doc/html/functions_d.html
new file mode 100644
index 0000000..44be5a3
--- /dev/null
+++ b/doc/html/functions_d.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_d.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="struct_big_num_str.html#a442dcf33889b4f85c5b1228d2c8e6838">BigNumStr</a>
+, <a class="el" href="struct_ecdsa_private_key.html#a97efee9b4079f95d94a104f9a6d8c96d">EcdsaPrivateKey</a>
+, <a class="el" href="struct_fp_elem_str.html#a5ddb96a5567750f2834335851c906c45">FpElemStr</a>
+, <a class="el" href="struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14">FqElemStr</a>
+, <a class="el" href="struct_oct_str128.html#a7482aa9b0b580fdd50bd65419d52d4b9">OctStr128</a>
+, <a class="el" href="struct_oct_str16.html#a86ed6671693a3f60ec4ff7de2c1206c3">OctStr16</a>
+, <a class="el" href="struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e">OctStr256</a>
+, <a class="el" href="struct_oct_str32.html#a5588a7e70f3d73f6ce58b567a9f5c5c8">OctStr32</a>
+, <a class="el" href="struct_oct_str512.html#abd4d1b97fe49321571da86de1aeac653">OctStr512</a>
+, <a class="el" href="struct_oct_str600.html#a06d53af92a06e1decc6062fd16c43a59">OctStr600</a>
+, <a class="el" href="struct_oct_str64.html#a0e107d78192a5ae0b48ed9e5c4eab0fc">OctStr64</a>
+, <a class="el" href="struct_oct_str768.html#ae45eea89259bd22e60a8d960063921cc">OctStr768</a>
+, <a class="el" href="struct_oct_str80.html#af80e2b81554109d9a41c5e771aceb8c9">OctStr80</a>
+, <a class="el" href="struct_oct_str8.html#a5e6c56fda48c88b419e621b464b03bef">OctStr8</a>
+, <a class="el" href="struct_sha256_digest.html#a4b6462ddd3f89e4c40220ceb6b1c7f28">Sha256Digest</a>
+</li>
+<li>digest
+: <a class="el" href="unionsha__digest.html#a182db3a17879fc1fb95c018044533060">sha_digest</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_e.html b/doc/html/functions_e.html
new file mode 100644
index 0000000..933721f
--- /dev/null
+++ b/doc/html/functions_e.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_e.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>e12
+: <a class="el" href="struct_epid11_verifier_precomp.html#a0a980adb039089263ec59a995600ee91">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a55e5c4b25c8f0f426969a8d745260fe5">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#ad1106376f12772942af0331eb74de6e5">VerifierPrecomp</a>
+</li>
+<li>e22
+: <a class="el" href="struct_epid11_verifier_precomp.html#ad0ff2a13c2c87460296900dde72a2f30">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a4e7412969bed3964f813b093b948e7b4">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#af8fd90f3a5a2be932a97dcd86099d5b2">VerifierPrecomp</a>
+</li>
+<li>e2w
+: <a class="el" href="struct_epid11_verifier_precomp.html#a14ebadf105aff085edb9a817a2d1db89">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a879d5a7b0c30088b23f6e5c5fc62f834">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#a8caf79578e3c0baf91921460391103ca">VerifierPrecomp</a>
+</li>
+<li>ea2
+: <a class="el" href="struct_member_precomp.html#a573551f6494e372f44fd3bdf5b02aeda">MemberPrecomp</a>
+</li>
+<li>eg12
+: <a class="el" href="struct_verifier_precomp.html#ab061d6cc07d1467eeb5bf25f3ea7e306">VerifierPrecomp</a>
+</li>
+<li>epid2_params
+: <a class="el" href="struct_tpm2_ctx.html#ac9cb082159a9ca169b6666779985a705">Tpm2Ctx</a>
+</li>
+<li>epid_version
+: <a class="el" href="struct_epid_file_header.html#a35d43c51c1739940381e4898ca87b824">EpidFileHeader</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_f.html b/doc/html/functions_f.html
new file mode 100644
index 0000000..8103669
--- /dev/null
+++ b/doc/html/functions_f.html
@@ -0,0 +1,92 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>f
+: <a class="el" href="struct_epid11_priv_rl.html#abbb75fee81aecb2dde7e2daab895ad3b">Epid11PrivRl</a>
+</li>
+<li>F
+: <a class="el" href="struct_join_request.html#a005651506fd4511e8a3537f6c3634532">JoinRequest</a>
+</li>
+<li>f
+: <a class="el" href="struct_member_params.html#ad6782a38fd79477bccf2313c676ea4fc">MemberParams</a>
+, <a class="el" href="struct_priv_key.html#ad7ee0392a583edd2e287cf8c1f9066ba">PrivKey</a>
+, <a class="el" href="struct_priv_rl.html#a60d73f9ef5fc81f117b3abadf8c18466">PrivRl</a>
+</li>
+<li>file_type
+: <a class="el" href="struct_epid_file_header.html#af5d48c739cc6c00c6e1ce35abf4f1473">EpidFileHeader</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_g.html b/doc/html/functions_g.html
new file mode 100644
index 0000000..bae120b
--- /dev/null
+++ b/doc/html/functions_g.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_g.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>g
+: <a class="el" href="struct_pairing_state.html#a0e19d5e16a81645aca678e04b88758da">PairingState</a>
+</li>
+<li>g1
+: <a class="el" href="struct_epid11_params.html#a835e70da717cd5b0c94e242a6418a287">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a4c5195b4fa9393a07a121336202531ad">Epid2Params</a>
+</li>
+<li>g2
+: <a class="el" href="struct_epid11_params.html#a1c6bbc4e066449d9c329f88cb653ef7c">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a609b0aac17fca34fe39bee29676a9618">Epid2Params</a>
+</li>
+<li>g3
+: <a class="el" href="struct_epid11_params.html#a7eb9a1371d7187ae81bccfa8d5595033">Epid11Params</a>
+</li>
+<li>gamma
+: <a class="el" href="struct_i_priv_key.html#a6d484175317aef09fb959c3ca55fc70a">IPrivKey</a>
+</li>
+<li>gid
+: <a class="el" href="struct_compressed_priv_key.html#ac6689899f1d9a6a8c5e4915563679840">CompressedPrivKey</a>
+, <a class="el" href="struct_epid11_group_pub_key.html#a964344b3c595bdd585bb9b5d9d0ea762">Epid11GroupPubKey</a>
+, <a class="el" href="struct_epid11_group_rl.html#a97f165c59bc447e3ca3c2148a096710f">Epid11GroupRl</a>
+, <a class="el" href="struct_epid11_priv_rl.html#aa8945d81e30674b52a6d0900b64feb3c">Epid11PrivRl</a>
+, <a class="el" href="struct_epid11_sig_rl.html#ad45b0e3e1be59649150dd34c104000ac">Epid11SigRl</a>
+, <a class="el" href="struct_epid11_verifier_precomp.html#a03138e937f4488bdbc52ed473dc313da">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_group_pub_key.html#ae8e77ab4d5eb3c8e566c24a64cce56ee">GroupPubKey</a>
+, <a class="el" href="struct_group_rl.html#a51022e172ab8b945efc69f1e63170107">GroupRl</a>
+, <a class="el" href="struct_i_priv_key.html#ad400a4237b6d50855538fd40580eb1bb">IPrivKey</a>
+, <a class="el" href="struct_membership_credential.html#afbff64ec55888c7e2a658eabb5e16671">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#ab416dcb4366427c24b44c2a02e4ae7c8">PrivKey</a>
+, <a class="el" href="struct_priv_rl.html#af7317529b8e55476bd06b66ed8131d64">PrivRl</a>
+, <a class="el" href="struct_sig_rl.html#a12757d30fcccd310716433948e0b603e">SigRl</a>
+, <a class="el" href="struct_verifier_precomp.html#afc3e29a325c95c62bb192d5f8cdd5c1c">VerifierPrecomp</a>
+, <a class="el" href="struct_verifier_rl.html#ab85c4666d16145ff16443e84468d2d7d">VerifierRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_h.html b/doc/html/functions_h.html
new file mode 100644
index 0000000..8a7b8db
--- /dev/null
+++ b/doc/html/functions_h.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>h
+: <a class="el" href="struct_epid11_params.html#ae2d1dc635d9d7cba496c3d64fb6f9d5b">Epid11Params</a>
+</li>
+<li>h1
+: <a class="el" href="struct_epid11_group_pub_key.html#a36f688472e2655052d485eac67d8c362">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a8c22c758ea186f95e3bf4b2ef8451da5">GroupPubKey</a>
+</li>
+<li>h2
+: <a class="el" href="struct_epid11_group_pub_key.html#aa724e9d2f0cb6019c05547d76a13b72a">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a2a4320ec99fd1a15df412fbf2a8d49f1">GroupPubKey</a>
+</li>
+<li>h_tick
+: <a class="el" href="struct_epid11_params.html#a0fe238db4ebc0225899dc2dac97d11c0">Epid11Params</a>
+</li>
+<li>hash_alg
+: <a class="el" href="structtiny__sha.html#acc38b88204bd86b40f1f1de557b247c4">tiny_sha</a>
+, <a class="el" href="struct_tpm2_ctx.html#a48940c01483e2e6ba4bd1475fba16fdd">Tpm2Ctx</a>
+</li>
+<li>header
+: <a class="el" href="struct_epid_ca_certificate.html#ac03cf7257c52ad14e3dd3201b930dd50">EpidCaCertificate</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_k.html b/doc/html/functions_k.html
new file mode 100644
index 0000000..dbea068
--- /dev/null
+++ b/doc/html/functions_k.html
@@ -0,0 +1,92 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_k.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>K
+: <a class="el" href="struct_basic_signature.html#a0078cc83ecf6c7e31f96b7d44aa60e21">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a5882fcbfd272774e12e50a2d77f0b139">Epid11BasicSignature</a>
+</li>
+<li>k
+: <a class="el" href="struct_epid11_sig_rl_entry.html#a5de66e1352eafe95774a0d76bac8f01a">Epid11SigRlEntry</a>
+, <a class="el" href="struct_sig_rl_entry.html#a0dfeb058614e81878bfbf86ae3edac3c">SigRlEntry</a>
+</li>
+<li>K
+: <a class="el" href="struct_verifier_rl.html#ac7d3dceab4772096bbbeb3fa735d18a9">VerifierRl</a>
+</li>
+<li>key_handle
+: <a class="el" href="struct_tpm2_ctx.html#ad71eba97fbd7d36ac1dd51ffc67791ce">Tpm2Ctx</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_l.html b/doc/html/functions_l.html
new file mode 100644
index 0000000..1e582dd
--- /dev/null
+++ b/doc/html/functions_l.html
@@ -0,0 +1,82 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_l.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>limbs
+: <a class="el" href="struct_fp_elem.html#a755a581a230c169e36985fb0301f2a28">FpElem</a>
+, <a class="el" href="struct_fq_elem.html#ad7d9feb0b777d58abfa9a31d6ddc466f">FqElem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_n.html b/doc/html/functions_n.html
new file mode 100644
index 0000000..fea3475
--- /dev/null
+++ b/doc/html/functions_n.html
@@ -0,0 +1,101 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_n.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>n1
+: <a class="el" href="struct_epid11_priv_rl.html#ad95f880f40e2f40c723f5bdbd22ecfa2">Epid11PrivRl</a>
+, <a class="el" href="struct_priv_rl.html#a6da9639ec4061689d1c30a58e0befd14">PrivRl</a>
+</li>
+<li>n2
+: <a class="el" href="struct_epid11_signature.html#ad25c277223a5210063163ea554d08ad4">Epid11Signature</a>
+, <a class="el" href="struct_epid11_sig_rl.html#a8c654d43df132db7874f4c84c177dc12">Epid11SigRl</a>
+, <a class="el" href="struct_epid_signature.html#a62a6b0ffcd5f68dd3d2786a58fe43017">EpidSignature</a>
+, <a class="el" href="struct_sig_rl.html#a9dfb6b508db9051f4dc480a51d702af2">SigRl</a>
+</li>
+<li>n3
+: <a class="el" href="struct_epid11_group_rl.html#a35cb954f598d4006b0f047cde77010a5">Epid11GroupRl</a>
+, <a class="el" href="struct_group_rl.html#a9067f01c63cdefbc8e23c3cf67a10172">GroupRl</a>
+</li>
+<li>n4
+: <a class="el" href="struct_verifier_rl.html#a1e3f84b873bccc0c882aa6432c42d2f7">VerifierRl</a>
+</li>
+<li>nd
+: <a class="el" href="struct_epid11_basic_signature.html#af18200712d2cf3ed3ccaee328e8a4e0f">Epid11BasicSignature</a>
+</li>
+<li>neg
+: <a class="el" href="struct_epid2_params.html#af23f07fb0e1745c0ad14aceeaa946928">Epid2Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_o.html b/doc/html/functions_o.html
new file mode 100644
index 0000000..4dcb73d
--- /dev/null
+++ b/doc/html/functions_o.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_o.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>orderG2
+: <a class="el" href="struct_epid11_params.html#a02bd6fa2ab256e3a07533e947ab0101e">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_p.html b/doc/html/functions_p.html
new file mode 100644
index 0000000..2c2745c
--- /dev/null
+++ b/doc/html/functions_p.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_p.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>p
+: <a class="el" href="struct_epid11_params.html#a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#ac0e0dad45b10927860cd5fa4f8101f08">Epid2Params</a>
+</li>
+<li>p_tick
+: <a class="el" href="struct_epid11_params.html#a77a8350b97a7afb584a46eb5b32f03bf">Epid11Params</a>
+</li>
+<li>prime
+: <a class="el" href="struct_epid_ca_certificate.html#a3a44e8050ca2f5085652b2b4e15b779c">EpidCaCertificate</a>
+</li>
+<li>pubkey
+: <a class="el" href="struct_epid_ca_certificate.html#a9d2fc21f46cf9fc96e2ea557b70e5356">EpidCaCertificate</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_q.html b/doc/html/functions_q.html
new file mode 100644
index 0000000..b27a0a6
--- /dev/null
+++ b/doc/html/functions_q.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_q.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_q"></a>- q -</h3><ul>
+<li>q
+: <a class="el" href="struct_epid11_params.html#aad03fd1cc3955bb8879535fa7298123f">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a023603228fed2854ddae2e228938940f">Epid2Params</a>
+</li>
+<li>q_tick
+: <a class="el" href="struct_epid11_params.html#a49462f35596d07a456a731d0690fdd83">Epid11Params</a>
+</li>
+<li>qnr
+: <a class="el" href="struct_epid11_params.html#af22cfcd6c7ec0e7e7369b79554b963bd">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_r.html b/doc/html/functions_r.html
new file mode 100644
index 0000000..f5b3a46
--- /dev/null
+++ b/doc/html/functions_r.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_r.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>r
+: <a class="el" href="struct_epid_ca_certificate.html#ab9d4c318b1fc8d38d3ce53b29f2dfee2">EpidCaCertificate</a>
+</li>
+<li>rl_ver
+: <a class="el" href="struct_epid11_signature.html#a43cb3ed13c862ff05a9292623ad57c5e">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#a4155f3f4f1223fc4ae50c94f5305def1">EpidSignature</a>
+</li>
+<li>rnd_func
+: <a class="el" href="struct_member_params.html#ad844c7a2be20bac70b118e7c08530c0b">MemberParams</a>
+</li>
+<li>rnd_param
+: <a class="el" href="struct_member_params.html#a7510f05e63328fa13cf2a3a3bd6acd95">MemberParams</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_s.html b/doc/html/functions_s.html
new file mode 100644
index 0000000..25661a8
--- /dev/null
+++ b/doc/html/functions_s.html
@@ -0,0 +1,143 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_s.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>s
+: <a class="el" href="struct_join_request.html#a73bf8989df5f90eb3d06e7a42ad74d1d">JoinRequest</a>
+</li>
+<li>sa
+: <a class="el" href="struct_basic_signature.html#a69115a4776d15b48411dd6c3a76d0f3d">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#aeb221cf52bc2b1a9bf6e0a9779bfd20f">Epid11BasicSignature</a>
+</li>
+<li>salpha
+: <a class="el" href="struct_epid11_basic_signature.html#a1a73fc922f69e2499643dd4c53d0d42d">Epid11BasicSignature</a>
+</li>
+<li>sb
+: <a class="el" href="struct_basic_signature.html#a91daebc5b577688afeed2a7ee7913245">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a29a700f3bec251600e18b2292081df4b">Epid11BasicSignature</a>
+</li>
+<li>sbeta
+: <a class="el" href="struct_epid11_basic_signature.html#afe28bad6328f81e6f7af011cc96ac2e5">Epid11BasicSignature</a>
+</li>
+<li>seed
+: <a class="el" href="struct_compressed_priv_key.html#a54b9af7699f517bbaef3d52d03e3fed8">CompressedPrivKey</a>
+</li>
+<li>sf
+: <a class="el" href="struct_basic_signature.html#a79d8dec8c5da176e497abf22e4c43adb">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#ae17b45194997a6fa13c6014a51ec711c">Epid11BasicSignature</a>
+</li>
+<li>sha256_digest
+: <a class="el" href="unionsha__digest.html#a2d79411c2115953d2c5fa50c176dda8d">sha_digest</a>
+</li>
+<li>sha256s
+: <a class="el" href="structtiny__sha.html#a40fd76fa2a0395295d4747ce2cb80888">tiny_sha</a>
+</li>
+<li>sha512_digest
+: <a class="el" href="unionsha__digest.html#a2c5fa88c4f65cc62d1839bd9a166b843">sha_digest</a>
+</li>
+<li>sha512s
+: <a class="el" href="structtiny__sha.html#a10addc820d663785aa5dd90c572bf953">tiny_sha</a>
+</li>
+<li>sha_state_t
+: <a class="el" href="structtiny__sha.html#a414a745937e610b84c0f6942470b531c">tiny_sha</a>
+</li>
+<li>sigma
+: <a class="el" href="struct_epid11_signature.html#abf24a8df563ba3f535486d8dad7384f4">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#a89d2e38223944310b6eeeadf6061a2dd">EpidSignature</a>
+</li>
+<li>sigma0
+: <a class="el" href="struct_epid11_signature.html#a48526e73f02ad3f1544c4c71c481f153">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#ab0fe5f98bff737fcfbfe0b4d658e83f2">EpidSignature</a>
+</li>
+<li>signature
+: <a class="el" href="struct_epid_ca_certificate.html#a2f8f09ae02919c379c38386668b47418">EpidCaCertificate</a>
+</li>
+<li>smu
+: <a class="el" href="struct_epid11_nr_proof.html#a1ad7fe6b32c09f2504ee49731c0ad145">Epid11NrProof</a>
+, <a class="el" href="struct_nr_proof.html#a717ec36a6c91acd01d9b642bb20fc178">NrProof</a>
+</li>
+<li>snu
+: <a class="el" href="struct_epid11_nr_proof.html#aa8406e938b2f87bded9e374e93a8ee5d">Epid11NrProof</a>
+, <a class="el" href="struct_nr_proof.html#ae2e9f22089793a4d44a0f7f5cdb78a0c">NrProof</a>
+</li>
+<li>sx
+: <a class="el" href="struct_basic_signature.html#a0e8ea6a2cd3af10e9b59d96d7d06bc69">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a2718346665210b7e26521bf4a15cb3bd">Epid11BasicSignature</a>
+</li>
+<li>sy
+: <a class="el" href="struct_epid11_basic_signature.html#a911441845fc9b82d514133371b5ba87c">Epid11BasicSignature</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_t.html b/doc/html/functions_t.html
new file mode 100644
index 0000000..b453127
--- /dev/null
+++ b/doc/html/functions_t.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_t.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>T
+: <a class="el" href="struct_basic_signature.html#a730f74d85cfb4fa4089d43c87b97a624">BasicSignature</a>
+, <a class="el" href="struct_epid11_nr_proof.html#a5ad9ba3bfac4eac37fd4a4e33ea65ddc">Epid11NrProof</a>
+</li>
+<li>t
+: <a class="el" href="struct_epid2_params.html#a200a0cba1c9e4ad512bece23f2461a5f">Epid2Params</a>
+</li>
+<li>T
+: <a class="el" href="struct_nr_proof.html#ace535065bbf96502b893ac677dc8dcd3">NrProof</a>
+</li>
+<li>T1
+: <a class="el" href="struct_epid11_basic_signature.html#a58b058a9c5119a240177acfade328b3b">Epid11BasicSignature</a>
+</li>
+<li>T2
+: <a class="el" href="struct_epid11_basic_signature.html#a267cf4e17d10584736b0c38f3668d822">Epid11BasicSignature</a>
+</li>
+<li>tss
+: <a class="el" href="struct_tpm2_ctx.html#add1c4c767abfee8bf87068ac03c52db1">Tpm2Ctx</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_v.html b/doc/html/functions_v.html
new file mode 100644
index 0000000..ddbc0de
--- /dev/null
+++ b/doc/html/functions_v.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_v.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>version
+: <a class="el" href="struct_epid11_group_rl.html#a63afa9863e8dcb63ff884e6e4093c481">Epid11GroupRl</a>
+, <a class="el" href="struct_epid11_priv_rl.html#a2b3899f5a35bf64f860d6d91bccb03c8">Epid11PrivRl</a>
+, <a class="el" href="struct_epid11_sig_rl.html#aa38674729293f4879ff94328dd3c59b1">Epid11SigRl</a>
+, <a class="el" href="struct_group_rl.html#a69c41d99cdfc5b6ece7442f466f7ec3f">GroupRl</a>
+, <a class="el" href="struct_priv_rl.html#a4c6b51cec760f7e81ca8635422ac6a50">PrivRl</a>
+, <a class="el" href="struct_sig_rl.html#ac9d4c343c539dba799e1f42eb38b351f">SigRl</a>
+, <a class="el" href="struct_verifier_rl.html#afa44ab69ffff5a3508366aeb2131fdaa">VerifierRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
new file mode 100644
index 0000000..f11a007
--- /dev/null
+++ b/doc/html/functions_vars.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>a
+: <a class="el" href="struct_epid11_gt_elem_str.html#aed8dd86f1696c2f3537154fc904bf2b0">Epid11GtElemStr</a>
+, <a class="el" href="struct_epid11_params.html#a01381f84b2d747b6273e21c71c58a1b0">Epid11Params</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a2811c1914ffae913820f13da914c8f01">EpidCaCertificate</a>
+, <a class="el" href="struct_fq12_elem_str.html#a0520947335aaf52de90af1dec5bdd112">Fq12ElemStr</a>
+, <a class="el" href="struct_fq2_elem_str.html#ab1d253eb24ba30eaf516ac429daab915">Fq2ElemStr</a>
+, <a class="el" href="struct_fq3_elem_str.html#af1be0a4d5c9c674d75bec34f95e3c731">Fq3ElemStr</a>
+, <a class="el" href="struct_fq6_elem_str.html#a89d656e5c815b4a2382d11ef6932a7d2">Fq6ElemStr</a>
+</li>
+<li>A
+: <a class="el" href="struct_membership_credential.html#a6d38ac3a9c5417833b8adb9b22bc9dc8">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#a266c7e369b8b868ef5755e9cd3c0c849">PrivKey</a>
+</li>
+<li>a_tick
+: <a class="el" href="struct_epid11_params.html#ae8770bb921aac9214ff8c45c41dbb228">Epid11Params</a>
+</li>
+<li>ax
+: <a class="el" href="struct_compressed_priv_key.html#a0b0535f0567eb0e48f799d27991d0f66">CompressedPrivKey</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_b.html b/doc/html/functions_vars_b.html
new file mode 100644
index 0000000..9cc4b47
--- /dev/null
+++ b/doc/html/functions_vars_b.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_b.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>B
+: <a class="el" href="struct_basic_signature.html#ae90cb6af66b010ae39913f033c1e65ac">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a27fd7ae99d1ada652e21e7508a467c0b">Epid11BasicSignature</a>
+</li>
+<li>b
+: <a class="el" href="struct_epid11_params.html#a27b45ed7771a3024d1d059b4b4ff6eae">Epid11Params</a>
+, <a class="el" href="struct_epid11_sig_rl_entry.html#abe47cfbd00684941f93a211417bedf0c">Epid11SigRlEntry</a>
+, <a class="el" href="struct_epid2_params.html#a2f868edb49be49f645101ef5ebbbc551">Epid2Params</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a280e0b0238cf45834c21849ab8a7e124">EpidCaCertificate</a>
+, <a class="el" href="struct_sig_rl_entry.html#ac6a47ff0d1b8ea1512e0ff14983ac5ce">SigRlEntry</a>
+</li>
+<li>B
+: <a class="el" href="struct_verifier_rl.html#a5d9a9265fffa96fd5f9260543eb08c68">VerifierRl</a>
+</li>
+<li>b_tick
+: <a class="el" href="struct_epid11_params.html#ade3f88ce73d7de656ec67d9fdb0719d7">Epid11Params</a>
+</li>
+<li>beta
+: <a class="el" href="struct_epid2_params.html#ac2d7507c6f58c3451beacacb91b52695">Epid2Params</a>
+</li>
+<li>bk
+: <a class="el" href="struct_epid11_sig_rl.html#a6473f8a98f76c9f82183041ea5ae17e3">Epid11SigRl</a>
+, <a class="el" href="struct_sig_rl.html#ac23a919993d99d24a5150302f1778102">SigRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_c.html b/doc/html/functions_vars_c.html
new file mode 100644
index 0000000..7ca5974
--- /dev/null
+++ b/doc/html/functions_vars_c.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="struct_basic_signature.html#a4daa94db5068db3f10960f3dd178d603">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a9cc6efcd3d7270022779bd16776168ed">Epid11BasicSignature</a>
+, <a class="el" href="struct_epid11_nr_proof.html#a2e5ee8dc25d296538dce935397a93d68">Epid11NrProof</a>
+, <a class="el" href="struct_join_request.html#a55e30a274e83b808db6fbab5ae6c6cb8">JoinRequest</a>
+, <a class="el" href="struct_nr_proof.html#a0de1aa69acf3d93da34cf4a613b359a1">NrProof</a>
+</li>
+<li>coeff
+: <a class="el" href="struct_epid11_params.html#aacc39ebe0cc625321039ffb6be0b0e87">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_d.html b/doc/html/functions_vars_d.html
new file mode 100644
index 0000000..6378e59
--- /dev/null
+++ b/doc/html/functions_vars_d.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_d.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="struct_big_num_str.html#a442dcf33889b4f85c5b1228d2c8e6838">BigNumStr</a>
+, <a class="el" href="struct_ecdsa_private_key.html#a97efee9b4079f95d94a104f9a6d8c96d">EcdsaPrivateKey</a>
+, <a class="el" href="struct_fp_elem_str.html#a5ddb96a5567750f2834335851c906c45">FpElemStr</a>
+, <a class="el" href="struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14">FqElemStr</a>
+, <a class="el" href="struct_oct_str128.html#a7482aa9b0b580fdd50bd65419d52d4b9">OctStr128</a>
+, <a class="el" href="struct_oct_str16.html#a86ed6671693a3f60ec4ff7de2c1206c3">OctStr16</a>
+, <a class="el" href="struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e">OctStr256</a>
+, <a class="el" href="struct_oct_str32.html#a5588a7e70f3d73f6ce58b567a9f5c5c8">OctStr32</a>
+, <a class="el" href="struct_oct_str512.html#abd4d1b97fe49321571da86de1aeac653">OctStr512</a>
+, <a class="el" href="struct_oct_str600.html#a06d53af92a06e1decc6062fd16c43a59">OctStr600</a>
+, <a class="el" href="struct_oct_str64.html#a0e107d78192a5ae0b48ed9e5c4eab0fc">OctStr64</a>
+, <a class="el" href="struct_oct_str768.html#ae45eea89259bd22e60a8d960063921cc">OctStr768</a>
+, <a class="el" href="struct_oct_str80.html#af80e2b81554109d9a41c5e771aceb8c9">OctStr80</a>
+, <a class="el" href="struct_oct_str8.html#a5e6c56fda48c88b419e621b464b03bef">OctStr8</a>
+, <a class="el" href="struct_sha256_digest.html#a4b6462ddd3f89e4c40220ceb6b1c7f28">Sha256Digest</a>
+</li>
+<li>digest
+: <a class="el" href="unionsha__digest.html#a182db3a17879fc1fb95c018044533060">sha_digest</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_e.html b/doc/html/functions_vars_e.html
new file mode 100644
index 0000000..7f82370
--- /dev/null
+++ b/doc/html/functions_vars_e.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_e.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>e12
+: <a class="el" href="struct_epid11_verifier_precomp.html#a0a980adb039089263ec59a995600ee91">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a55e5c4b25c8f0f426969a8d745260fe5">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#ad1106376f12772942af0331eb74de6e5">VerifierPrecomp</a>
+</li>
+<li>e22
+: <a class="el" href="struct_epid11_verifier_precomp.html#ad0ff2a13c2c87460296900dde72a2f30">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a4e7412969bed3964f813b093b948e7b4">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#af8fd90f3a5a2be932a97dcd86099d5b2">VerifierPrecomp</a>
+</li>
+<li>e2w
+: <a class="el" href="struct_epid11_verifier_precomp.html#a14ebadf105aff085edb9a817a2d1db89">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_member_precomp.html#a879d5a7b0c30088b23f6e5c5fc62f834">MemberPrecomp</a>
+, <a class="el" href="struct_verifier_precomp.html#a8caf79578e3c0baf91921460391103ca">VerifierPrecomp</a>
+</li>
+<li>ea2
+: <a class="el" href="struct_member_precomp.html#a573551f6494e372f44fd3bdf5b02aeda">MemberPrecomp</a>
+</li>
+<li>eg12
+: <a class="el" href="struct_verifier_precomp.html#ab061d6cc07d1467eeb5bf25f3ea7e306">VerifierPrecomp</a>
+</li>
+<li>epid2_params
+: <a class="el" href="struct_tpm2_ctx.html#ac9cb082159a9ca169b6666779985a705">Tpm2Ctx</a>
+</li>
+<li>epid_version
+: <a class="el" href="struct_epid_file_header.html#a35d43c51c1739940381e4898ca87b824">EpidFileHeader</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_f.html b/doc/html/functions_vars_f.html
new file mode 100644
index 0000000..ad5bb47
--- /dev/null
+++ b/doc/html/functions_vars_f.html
@@ -0,0 +1,92 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>f
+: <a class="el" href="struct_epid11_priv_rl.html#abbb75fee81aecb2dde7e2daab895ad3b">Epid11PrivRl</a>
+</li>
+<li>F
+: <a class="el" href="struct_join_request.html#a005651506fd4511e8a3537f6c3634532">JoinRequest</a>
+</li>
+<li>f
+: <a class="el" href="struct_member_params.html#ad6782a38fd79477bccf2313c676ea4fc">MemberParams</a>
+, <a class="el" href="struct_priv_key.html#ad7ee0392a583edd2e287cf8c1f9066ba">PrivKey</a>
+, <a class="el" href="struct_priv_rl.html#a60d73f9ef5fc81f117b3abadf8c18466">PrivRl</a>
+</li>
+<li>file_type
+: <a class="el" href="struct_epid_file_header.html#af5d48c739cc6c00c6e1ce35abf4f1473">EpidFileHeader</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_g.html b/doc/html/functions_vars_g.html
new file mode 100644
index 0000000..64b26fb
--- /dev/null
+++ b/doc/html/functions_vars_g.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_g.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>g
+: <a class="el" href="struct_pairing_state.html#a0e19d5e16a81645aca678e04b88758da">PairingState</a>
+</li>
+<li>g1
+: <a class="el" href="struct_epid11_params.html#a835e70da717cd5b0c94e242a6418a287">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a4c5195b4fa9393a07a121336202531ad">Epid2Params</a>
+</li>
+<li>g2
+: <a class="el" href="struct_epid11_params.html#a1c6bbc4e066449d9c329f88cb653ef7c">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a609b0aac17fca34fe39bee29676a9618">Epid2Params</a>
+</li>
+<li>g3
+: <a class="el" href="struct_epid11_params.html#a7eb9a1371d7187ae81bccfa8d5595033">Epid11Params</a>
+</li>
+<li>gamma
+: <a class="el" href="struct_i_priv_key.html#a6d484175317aef09fb959c3ca55fc70a">IPrivKey</a>
+</li>
+<li>gid
+: <a class="el" href="struct_compressed_priv_key.html#ac6689899f1d9a6a8c5e4915563679840">CompressedPrivKey</a>
+, <a class="el" href="struct_epid11_group_pub_key.html#a964344b3c595bdd585bb9b5d9d0ea762">Epid11GroupPubKey</a>
+, <a class="el" href="struct_epid11_group_rl.html#a97f165c59bc447e3ca3c2148a096710f">Epid11GroupRl</a>
+, <a class="el" href="struct_epid11_priv_rl.html#aa8945d81e30674b52a6d0900b64feb3c">Epid11PrivRl</a>
+, <a class="el" href="struct_epid11_sig_rl.html#ad45b0e3e1be59649150dd34c104000ac">Epid11SigRl</a>
+, <a class="el" href="struct_epid11_verifier_precomp.html#a03138e937f4488bdbc52ed473dc313da">Epid11VerifierPrecomp</a>
+, <a class="el" href="struct_group_pub_key.html#ae8e77ab4d5eb3c8e566c24a64cce56ee">GroupPubKey</a>
+, <a class="el" href="struct_group_rl.html#a51022e172ab8b945efc69f1e63170107">GroupRl</a>
+, <a class="el" href="struct_i_priv_key.html#ad400a4237b6d50855538fd40580eb1bb">IPrivKey</a>
+, <a class="el" href="struct_membership_credential.html#afbff64ec55888c7e2a658eabb5e16671">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#ab416dcb4366427c24b44c2a02e4ae7c8">PrivKey</a>
+, <a class="el" href="struct_priv_rl.html#af7317529b8e55476bd06b66ed8131d64">PrivRl</a>
+, <a class="el" href="struct_sig_rl.html#a12757d30fcccd310716433948e0b603e">SigRl</a>
+, <a class="el" href="struct_verifier_precomp.html#afc3e29a325c95c62bb192d5f8cdd5c1c">VerifierPrecomp</a>
+, <a class="el" href="struct_verifier_rl.html#ab85c4666d16145ff16443e84468d2d7d">VerifierRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_h.html b/doc/html/functions_vars_h.html
new file mode 100644
index 0000000..a6c145e
--- /dev/null
+++ b/doc/html/functions_vars_h.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>h
+: <a class="el" href="struct_epid11_params.html#ae2d1dc635d9d7cba496c3d64fb6f9d5b">Epid11Params</a>
+</li>
+<li>h1
+: <a class="el" href="struct_epid11_group_pub_key.html#a36f688472e2655052d485eac67d8c362">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a8c22c758ea186f95e3bf4b2ef8451da5">GroupPubKey</a>
+</li>
+<li>h2
+: <a class="el" href="struct_epid11_group_pub_key.html#aa724e9d2f0cb6019c05547d76a13b72a">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a2a4320ec99fd1a15df412fbf2a8d49f1">GroupPubKey</a>
+</li>
+<li>h_tick
+: <a class="el" href="struct_epid11_params.html#a0fe238db4ebc0225899dc2dac97d11c0">Epid11Params</a>
+</li>
+<li>hash_alg
+: <a class="el" href="structtiny__sha.html#acc38b88204bd86b40f1f1de557b247c4">tiny_sha</a>
+, <a class="el" href="struct_tpm2_ctx.html#a48940c01483e2e6ba4bd1475fba16fdd">Tpm2Ctx</a>
+</li>
+<li>header
+: <a class="el" href="struct_epid_ca_certificate.html#ac03cf7257c52ad14e3dd3201b930dd50">EpidCaCertificate</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_k.html b/doc/html/functions_vars_k.html
new file mode 100644
index 0000000..8aac465
--- /dev/null
+++ b/doc/html/functions_vars_k.html
@@ -0,0 +1,92 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_k.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>K
+: <a class="el" href="struct_basic_signature.html#a0078cc83ecf6c7e31f96b7d44aa60e21">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a5882fcbfd272774e12e50a2d77f0b139">Epid11BasicSignature</a>
+</li>
+<li>k
+: <a class="el" href="struct_epid11_sig_rl_entry.html#a5de66e1352eafe95774a0d76bac8f01a">Epid11SigRlEntry</a>
+, <a class="el" href="struct_sig_rl_entry.html#a0dfeb058614e81878bfbf86ae3edac3c">SigRlEntry</a>
+</li>
+<li>K
+: <a class="el" href="struct_verifier_rl.html#ac7d3dceab4772096bbbeb3fa735d18a9">VerifierRl</a>
+</li>
+<li>key_handle
+: <a class="el" href="struct_tpm2_ctx.html#ad71eba97fbd7d36ac1dd51ffc67791ce">Tpm2Ctx</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_l.html b/doc/html/functions_vars_l.html
new file mode 100644
index 0000000..ff601cd
--- /dev/null
+++ b/doc/html/functions_vars_l.html
@@ -0,0 +1,82 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_l.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>limbs
+: <a class="el" href="struct_fp_elem.html#a755a581a230c169e36985fb0301f2a28">FpElem</a>
+, <a class="el" href="struct_fq_elem.html#ad7d9feb0b777d58abfa9a31d6ddc466f">FqElem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_n.html b/doc/html/functions_vars_n.html
new file mode 100644
index 0000000..c319c18
--- /dev/null
+++ b/doc/html/functions_vars_n.html
@@ -0,0 +1,101 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_n.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>n1
+: <a class="el" href="struct_epid11_priv_rl.html#ad95f880f40e2f40c723f5bdbd22ecfa2">Epid11PrivRl</a>
+, <a class="el" href="struct_priv_rl.html#a6da9639ec4061689d1c30a58e0befd14">PrivRl</a>
+</li>
+<li>n2
+: <a class="el" href="struct_epid11_signature.html#ad25c277223a5210063163ea554d08ad4">Epid11Signature</a>
+, <a class="el" href="struct_epid11_sig_rl.html#a8c654d43df132db7874f4c84c177dc12">Epid11SigRl</a>
+, <a class="el" href="struct_epid_signature.html#a62a6b0ffcd5f68dd3d2786a58fe43017">EpidSignature</a>
+, <a class="el" href="struct_sig_rl.html#a9dfb6b508db9051f4dc480a51d702af2">SigRl</a>
+</li>
+<li>n3
+: <a class="el" href="struct_epid11_group_rl.html#a35cb954f598d4006b0f047cde77010a5">Epid11GroupRl</a>
+, <a class="el" href="struct_group_rl.html#a9067f01c63cdefbc8e23c3cf67a10172">GroupRl</a>
+</li>
+<li>n4
+: <a class="el" href="struct_verifier_rl.html#a1e3f84b873bccc0c882aa6432c42d2f7">VerifierRl</a>
+</li>
+<li>nd
+: <a class="el" href="struct_epid11_basic_signature.html#af18200712d2cf3ed3ccaee328e8a4e0f">Epid11BasicSignature</a>
+</li>
+<li>neg
+: <a class="el" href="struct_epid2_params.html#af23f07fb0e1745c0ad14aceeaa946928">Epid2Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_o.html b/doc/html/functions_vars_o.html
new file mode 100644
index 0000000..bec8f89
--- /dev/null
+++ b/doc/html/functions_vars_o.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_o.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>orderG2
+: <a class="el" href="struct_epid11_params.html#a02bd6fa2ab256e3a07533e947ab0101e">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_p.html b/doc/html/functions_vars_p.html
new file mode 100644
index 0000000..a1bf710
--- /dev/null
+++ b/doc/html/functions_vars_p.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_p.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>p
+: <a class="el" href="struct_epid11_params.html#a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#ac0e0dad45b10927860cd5fa4f8101f08">Epid2Params</a>
+</li>
+<li>p_tick
+: <a class="el" href="struct_epid11_params.html#a77a8350b97a7afb584a46eb5b32f03bf">Epid11Params</a>
+</li>
+<li>prime
+: <a class="el" href="struct_epid_ca_certificate.html#a3a44e8050ca2f5085652b2b4e15b779c">EpidCaCertificate</a>
+</li>
+<li>pubkey
+: <a class="el" href="struct_epid_ca_certificate.html#a9d2fc21f46cf9fc96e2ea557b70e5356">EpidCaCertificate</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_q.html b/doc/html/functions_vars_q.html
new file mode 100644
index 0000000..c02c157
--- /dev/null
+++ b/doc/html/functions_vars_q.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_q.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_q"></a>- q -</h3><ul>
+<li>q
+: <a class="el" href="struct_epid11_params.html#aad03fd1cc3955bb8879535fa7298123f">Epid11Params</a>
+, <a class="el" href="struct_epid2_params.html#a023603228fed2854ddae2e228938940f">Epid2Params</a>
+</li>
+<li>q_tick
+: <a class="el" href="struct_epid11_params.html#a49462f35596d07a456a731d0690fdd83">Epid11Params</a>
+</li>
+<li>qnr
+: <a class="el" href="struct_epid11_params.html#af22cfcd6c7ec0e7e7369b79554b963bd">Epid11Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_r.html b/doc/html/functions_vars_r.html
new file mode 100644
index 0000000..a309350
--- /dev/null
+++ b/doc/html/functions_vars_r.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_r.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>r
+: <a class="el" href="struct_epid_ca_certificate.html#ab9d4c318b1fc8d38d3ce53b29f2dfee2">EpidCaCertificate</a>
+</li>
+<li>rl_ver
+: <a class="el" href="struct_epid11_signature.html#a43cb3ed13c862ff05a9292623ad57c5e">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#a4155f3f4f1223fc4ae50c94f5305def1">EpidSignature</a>
+</li>
+<li>rnd_func
+: <a class="el" href="struct_member_params.html#ad844c7a2be20bac70b118e7c08530c0b">MemberParams</a>
+</li>
+<li>rnd_param
+: <a class="el" href="struct_member_params.html#a7510f05e63328fa13cf2a3a3bd6acd95">MemberParams</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_s.html b/doc/html/functions_vars_s.html
new file mode 100644
index 0000000..af4c67f
--- /dev/null
+++ b/doc/html/functions_vars_s.html
@@ -0,0 +1,143 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_s.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>s
+: <a class="el" href="struct_join_request.html#a73bf8989df5f90eb3d06e7a42ad74d1d">JoinRequest</a>
+</li>
+<li>sa
+: <a class="el" href="struct_basic_signature.html#a69115a4776d15b48411dd6c3a76d0f3d">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#aeb221cf52bc2b1a9bf6e0a9779bfd20f">Epid11BasicSignature</a>
+</li>
+<li>salpha
+: <a class="el" href="struct_epid11_basic_signature.html#a1a73fc922f69e2499643dd4c53d0d42d">Epid11BasicSignature</a>
+</li>
+<li>sb
+: <a class="el" href="struct_basic_signature.html#a91daebc5b577688afeed2a7ee7913245">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a29a700f3bec251600e18b2292081df4b">Epid11BasicSignature</a>
+</li>
+<li>sbeta
+: <a class="el" href="struct_epid11_basic_signature.html#afe28bad6328f81e6f7af011cc96ac2e5">Epid11BasicSignature</a>
+</li>
+<li>seed
+: <a class="el" href="struct_compressed_priv_key.html#a54b9af7699f517bbaef3d52d03e3fed8">CompressedPrivKey</a>
+</li>
+<li>sf
+: <a class="el" href="struct_basic_signature.html#a79d8dec8c5da176e497abf22e4c43adb">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#ae17b45194997a6fa13c6014a51ec711c">Epid11BasicSignature</a>
+</li>
+<li>sha256_digest
+: <a class="el" href="unionsha__digest.html#a2d79411c2115953d2c5fa50c176dda8d">sha_digest</a>
+</li>
+<li>sha256s
+: <a class="el" href="structtiny__sha.html#a40fd76fa2a0395295d4747ce2cb80888">tiny_sha</a>
+</li>
+<li>sha512_digest
+: <a class="el" href="unionsha__digest.html#a2c5fa88c4f65cc62d1839bd9a166b843">sha_digest</a>
+</li>
+<li>sha512s
+: <a class="el" href="structtiny__sha.html#a10addc820d663785aa5dd90c572bf953">tiny_sha</a>
+</li>
+<li>sha_state_t
+: <a class="el" href="structtiny__sha.html#a414a745937e610b84c0f6942470b531c">tiny_sha</a>
+</li>
+<li>sigma
+: <a class="el" href="struct_epid11_signature.html#abf24a8df563ba3f535486d8dad7384f4">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#a89d2e38223944310b6eeeadf6061a2dd">EpidSignature</a>
+</li>
+<li>sigma0
+: <a class="el" href="struct_epid11_signature.html#a48526e73f02ad3f1544c4c71c481f153">Epid11Signature</a>
+, <a class="el" href="struct_epid_signature.html#ab0fe5f98bff737fcfbfe0b4d658e83f2">EpidSignature</a>
+</li>
+<li>signature
+: <a class="el" href="struct_epid_ca_certificate.html#a2f8f09ae02919c379c38386668b47418">EpidCaCertificate</a>
+</li>
+<li>smu
+: <a class="el" href="struct_epid11_nr_proof.html#a1ad7fe6b32c09f2504ee49731c0ad145">Epid11NrProof</a>
+, <a class="el" href="struct_nr_proof.html#a717ec36a6c91acd01d9b642bb20fc178">NrProof</a>
+</li>
+<li>snu
+: <a class="el" href="struct_epid11_nr_proof.html#aa8406e938b2f87bded9e374e93a8ee5d">Epid11NrProof</a>
+, <a class="el" href="struct_nr_proof.html#ae2e9f22089793a4d44a0f7f5cdb78a0c">NrProof</a>
+</li>
+<li>sx
+: <a class="el" href="struct_basic_signature.html#a0e8ea6a2cd3af10e9b59d96d7d06bc69">BasicSignature</a>
+, <a class="el" href="struct_epid11_basic_signature.html#a2718346665210b7e26521bf4a15cb3bd">Epid11BasicSignature</a>
+</li>
+<li>sy
+: <a class="el" href="struct_epid11_basic_signature.html#a911441845fc9b82d514133371b5ba87c">Epid11BasicSignature</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_t.html b/doc/html/functions_vars_t.html
new file mode 100644
index 0000000..2b5fb68
--- /dev/null
+++ b/doc/html/functions_vars_t.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_t.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>T
+: <a class="el" href="struct_basic_signature.html#a730f74d85cfb4fa4089d43c87b97a624">BasicSignature</a>
+, <a class="el" href="struct_epid11_nr_proof.html#a5ad9ba3bfac4eac37fd4a4e33ea65ddc">Epid11NrProof</a>
+</li>
+<li>t
+: <a class="el" href="struct_epid2_params.html#a200a0cba1c9e4ad512bece23f2461a5f">Epid2Params</a>
+</li>
+<li>T
+: <a class="el" href="struct_nr_proof.html#ace535065bbf96502b893ac677dc8dcd3">NrProof</a>
+</li>
+<li>T1
+: <a class="el" href="struct_epid11_basic_signature.html#a58b058a9c5119a240177acfade328b3b">Epid11BasicSignature</a>
+</li>
+<li>T2
+: <a class="el" href="struct_epid11_basic_signature.html#a267cf4e17d10584736b0c38f3668d822">Epid11BasicSignature</a>
+</li>
+<li>tss
+: <a class="el" href="struct_tpm2_ctx.html#add1c4c767abfee8bf87068ac03c52db1">Tpm2Ctx</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_v.html b/doc/html/functions_vars_v.html
new file mode 100644
index 0000000..ee40f96
--- /dev/null
+++ b/doc/html/functions_vars_v.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_v.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>version
+: <a class="el" href="struct_epid11_group_rl.html#a63afa9863e8dcb63ff884e6e4093c481">Epid11GroupRl</a>
+, <a class="el" href="struct_epid11_priv_rl.html#a2b3899f5a35bf64f860d6d91bccb03c8">Epid11PrivRl</a>
+, <a class="el" href="struct_epid11_sig_rl.html#aa38674729293f4879ff94328dd3c59b1">Epid11SigRl</a>
+, <a class="el" href="struct_group_rl.html#a69c41d99cdfc5b6ece7442f466f7ec3f">GroupRl</a>
+, <a class="el" href="struct_priv_rl.html#a4c6b51cec760f7e81ca8635422ac6a50">PrivRl</a>
+, <a class="el" href="struct_sig_rl.html#ac9d4c343c539dba799e1f42eb38b351f">SigRl</a>
+, <a class="el" href="struct_verifier_rl.html#afa44ab69ffff5a3508366aeb2131fdaa">VerifierRl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_w.html b/doc/html/functions_vars_w.html
new file mode 100644
index 0000000..301cacf
--- /dev/null
+++ b/doc/html/functions_vars_w.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_w.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w
+: <a class="el" href="struct_epid11_group_pub_key.html#a056c7138246e2bdcd47eaad501b756bb">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a86be439104fb60b324784baf24a943f9">GroupPubKey</a>
+</li>
+<li>word
+: <a class="el" href="struct_very_large_int.html#a42fb1bb370910b7fadf474b421b29eb8">VeryLargeInt</a>
+, <a class="el" href="struct_very_large_int_product.html#a02a4e20db872ec6264e614ac0f1438be">VeryLargeIntProduct</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_x.html b/doc/html/functions_vars_x.html
new file mode 100644
index 0000000..33911ad
--- /dev/null
+++ b/doc/html/functions_vars_x.html
@@ -0,0 +1,106 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_x.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_x"></a>- x -</h3><ul>
+<li>x
+: <a class="el" href="struct_ecc_point_fq2.html#ac1c2f9e66988d12c61bd1ffd4975eb7d">EccPointFq2</a>
+, <a class="el" href="struct_ecc_point_fq.html#a50491ef33f641fa3e81d58bdc906b258">EccPointFq</a>
+</li>
+<li>X
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#aa540cd77c703ba538b245897009076a7">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#a281019c17dd470ab6b5a763efc23fa1b">EccPointJacobiFq</a>
+</li>
+<li>x
+: <a class="el" href="struct_ecdsa_public_key.html#a37c51614faf022eec491b4de8f3a13e1">EcdsaPublicKey</a>
+, <a class="el" href="struct_ecdsa_signature.html#a64b623605a55a267a36df18f29142d0d">EcdsaSignature</a>
+, <a class="el" href="struct_epid11_g2_elem_str.html#af28558484298f4f56377ededf57a4a04">Epid11G2ElemStr</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a4f77996f90ed7da1d0503c4236b2c9d1">EpidCaCertificate</a>
+, <a class="el" href="struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4">G1ElemStr</a>
+, <a class="el" href="struct_g2_elem_str.html#a145ec5b20a6f4f00b080e11c8680afc3">G2ElemStr</a>
+, <a class="el" href="struct_gt_elem_str.html#aeaeb0e9e1c6efd378a475eb9a6c42132">GtElemStr</a>
+, <a class="el" href="struct_membership_credential.html#a2c5c0d22999d6917fea5ad6618883bcf">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#aa805f9e124f05bdb733c85cb93614cbd">PrivKey</a>
+</li>
+<li>x0
+: <a class="el" href="struct_fq2_elem.html#a3e0e0c995074a18ca1e234fd99f90b3d">Fq2Elem</a>
+</li>
+<li>x1
+: <a class="el" href="struct_fq2_elem.html#a4f48b8d7f1d6bac1579c1fad81ef4a02">Fq2Elem</a>
+</li>
+<li>xi
+: <a class="el" href="struct_epid2_params.html#ae1d8f5d6036a82064e91bc137b278e74">Epid2Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_y.html b/doc/html/functions_vars_y.html
new file mode 100644
index 0000000..1483971
--- /dev/null
+++ b/doc/html/functions_vars_y.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_y.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_y"></a>- y -</h3><ul>
+<li>y
+: <a class="el" href="struct_ecc_point_fq2.html#a137a9467dc77df97319c88880d13ea48">EccPointFq2</a>
+, <a class="el" href="struct_ecc_point_fq.html#abd3c36cb29db82a73ba89e9e15739b5a">EccPointFq</a>
+</li>
+<li>Y
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#adc2fa4757b5091e7927daae3452ee739">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#ad86b6242f7c242107f7af9a37fad2a74">EccPointJacobiFq</a>
+</li>
+<li>y
+: <a class="el" href="struct_ecdsa_public_key.html#a4503c4613386cbc78add1dc245c99284">EcdsaPublicKey</a>
+, <a class="el" href="struct_ecdsa_signature.html#a2efd6bf37b12f35135bf325fa491b029">EcdsaSignature</a>
+, <a class="el" href="struct_epid11_g2_elem_str.html#a9e8984e479bcbe8bd36c65e80c340032">Epid11G2ElemStr</a>
+, <a class="el" href="struct_epid_ca_certificate.html#abd69cce8d5e3940787ee0d17f72184ab">EpidCaCertificate</a>
+, <a class="el" href="struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3">G1ElemStr</a>
+, <a class="el" href="struct_g2_elem_str.html#a43141b2458aecceed8ee2748270f7908">G2ElemStr</a>
+</li>
+<li>y0
+: <a class="el" href="struct_fq6_elem.html#a84522e736d8b9fb706c90aeef5e0fda2">Fq6Elem</a>
+</li>
+<li>y1
+: <a class="el" href="struct_fq6_elem.html#ac35469120214ab7d75767a8adeb9c0f6">Fq6Elem</a>
+</li>
+<li>y2
+: <a class="el" href="struct_fq6_elem.html#a1753ef18695535ada56e337e8f6f7280">Fq6Elem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_vars_z.html b/doc/html/functions_vars_z.html
new file mode 100644
index 0000000..a8251f6
--- /dev/null
+++ b/doc/html/functions_vars_z.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_vars_z.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>Z
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#aea8a3a5b2bd2fce104e75cfe21615619">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#afe6154e547f9c3908a8ce801a14afeca">EccPointJacobiFq</a>
+</li>
+<li>z0
+: <a class="el" href="struct_fq12_elem.html#a2f33b78b0e6f4c720f481aac8f82d938">Fq12Elem</a>
+</li>
+<li>z1
+: <a class="el" href="struct_fq12_elem.html#a53a5954433b4c4df1fda6dcb08f54c7b">Fq12Elem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_w.html b/doc/html/functions_w.html
new file mode 100644
index 0000000..d37c88a
--- /dev/null
+++ b/doc/html/functions_w.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_w.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w
+: <a class="el" href="struct_epid11_group_pub_key.html#a056c7138246e2bdcd47eaad501b756bb">Epid11GroupPubKey</a>
+, <a class="el" href="struct_group_pub_key.html#a86be439104fb60b324784baf24a943f9">GroupPubKey</a>
+</li>
+<li>word
+: <a class="el" href="struct_very_large_int.html#a42fb1bb370910b7fadf474b421b29eb8">VeryLargeInt</a>
+, <a class="el" href="struct_very_large_int_product.html#a02a4e20db872ec6264e614ac0f1438be">VeryLargeIntProduct</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_x.html b/doc/html/functions_x.html
new file mode 100644
index 0000000..7a2a1b9
--- /dev/null
+++ b/doc/html/functions_x.html
@@ -0,0 +1,106 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_x.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_x"></a>- x -</h3><ul>
+<li>x
+: <a class="el" href="struct_ecc_point_fq2.html#ac1c2f9e66988d12c61bd1ffd4975eb7d">EccPointFq2</a>
+, <a class="el" href="struct_ecc_point_fq.html#a50491ef33f641fa3e81d58bdc906b258">EccPointFq</a>
+</li>
+<li>X
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#aa540cd77c703ba538b245897009076a7">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#a281019c17dd470ab6b5a763efc23fa1b">EccPointJacobiFq</a>
+</li>
+<li>x
+: <a class="el" href="struct_ecdsa_public_key.html#a37c51614faf022eec491b4de8f3a13e1">EcdsaPublicKey</a>
+, <a class="el" href="struct_ecdsa_signature.html#a64b623605a55a267a36df18f29142d0d">EcdsaSignature</a>
+, <a class="el" href="struct_epid11_g2_elem_str.html#af28558484298f4f56377ededf57a4a04">Epid11G2ElemStr</a>
+, <a class="el" href="struct_epid_ca_certificate.html#a4f77996f90ed7da1d0503c4236b2c9d1">EpidCaCertificate</a>
+, <a class="el" href="struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4">G1ElemStr</a>
+, <a class="el" href="struct_g2_elem_str.html#a145ec5b20a6f4f00b080e11c8680afc3">G2ElemStr</a>
+, <a class="el" href="struct_gt_elem_str.html#aeaeb0e9e1c6efd378a475eb9a6c42132">GtElemStr</a>
+, <a class="el" href="struct_membership_credential.html#a2c5c0d22999d6917fea5ad6618883bcf">MembershipCredential</a>
+, <a class="el" href="struct_priv_key.html#aa805f9e124f05bdb733c85cb93614cbd">PrivKey</a>
+</li>
+<li>x0
+: <a class="el" href="struct_fq2_elem.html#a3e0e0c995074a18ca1e234fd99f90b3d">Fq2Elem</a>
+</li>
+<li>x1
+: <a class="el" href="struct_fq2_elem.html#a4f48b8d7f1d6bac1579c1fad81ef4a02">Fq2Elem</a>
+</li>
+<li>xi
+: <a class="el" href="struct_epid2_params.html#ae1d8f5d6036a82064e91bc137b278e74">Epid2Params</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_y.html b/doc/html/functions_y.html
new file mode 100644
index 0000000..f2f7b33
--- /dev/null
+++ b/doc/html/functions_y.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_y.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_y"></a>- y -</h3><ul>
+<li>y
+: <a class="el" href="struct_ecc_point_fq2.html#a137a9467dc77df97319c88880d13ea48">EccPointFq2</a>
+, <a class="el" href="struct_ecc_point_fq.html#abd3c36cb29db82a73ba89e9e15739b5a">EccPointFq</a>
+</li>
+<li>Y
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#adc2fa4757b5091e7927daae3452ee739">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#ad86b6242f7c242107f7af9a37fad2a74">EccPointJacobiFq</a>
+</li>
+<li>y
+: <a class="el" href="struct_ecdsa_public_key.html#a4503c4613386cbc78add1dc245c99284">EcdsaPublicKey</a>
+, <a class="el" href="struct_ecdsa_signature.html#a2efd6bf37b12f35135bf325fa491b029">EcdsaSignature</a>
+, <a class="el" href="struct_epid11_g2_elem_str.html#a9e8984e479bcbe8bd36c65e80c340032">Epid11G2ElemStr</a>
+, <a class="el" href="struct_epid_ca_certificate.html#abd69cce8d5e3940787ee0d17f72184ab">EpidCaCertificate</a>
+, <a class="el" href="struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3">G1ElemStr</a>
+, <a class="el" href="struct_g2_elem_str.html#a43141b2458aecceed8ee2748270f7908">G2ElemStr</a>
+</li>
+<li>y0
+: <a class="el" href="struct_fq6_elem.html#a84522e736d8b9fb706c90aeef5e0fda2">Fq6Elem</a>
+</li>
+<li>y1
+: <a class="el" href="struct_fq6_elem.html#ac35469120214ab7d75767a8adeb9c0f6">Fq6Elem</a>
+</li>
+<li>y2
+: <a class="el" href="struct_fq6_elem.html#a1753ef18695535ada56e337e8f6f7280">Fq6Elem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/functions_z.html b/doc/html/functions_z.html
new file mode 100644
index 0000000..6177421
--- /dev/null
+++ b/doc/html/functions_z.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('functions_z.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>Z
+: <a class="el" href="struct_ecc_point_jacobi_fq2.html#aea8a3a5b2bd2fce104e75cfe21615619">EccPointJacobiFq2</a>
+, <a class="el" href="struct_ecc_point_jacobi_fq.html#afe6154e547f9c3908a8ce801a14afeca">EccPointJacobiFq</a>
+</li>
+<li>z0
+: <a class="el" href="struct_fq12_elem.html#a2f33b78b0e6f4c720f481aac8f82d938">Fq12Elem</a>
+</li>
+<li>z1
+: <a class="el" href="struct_fq12_elem.html#a53a5954433b4c4df1fda6dcb08f54c7b">Fq12Elem</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/getrandom_8c.html b/doc/html/getrandom_8c.html
new file mode 100644
index 0000000..2a0a3f3
--- /dev/null
+++ b/doc/html/getrandom_8c.html
@@ -0,0 +1,100 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/getrandom.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('getrandom_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">getrandom.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM2_GetRandom command implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;limits.h&gt;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="getrandom_8h.html">epid/member/tpm2/getrandom.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+<code>#include &quot;tss2/TPM_Types.h&quot;</code><br />
+<code>#include &quot;tss2/tss.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">Tpm2GetRandom</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, int const num_bits, void *random_data)</td></tr>
+<tr class="memdesc:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get random data. <a href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">More...</a><br /></td></tr>
+<tr class="separator:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM2_GetRandom command implementation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="getrandom_8c.html">getrandom.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/getrandom_8h.html b/doc/html/getrandom_8h.html
new file mode 100644
index 0000000..bf87537
--- /dev/null
+++ b/doc/html/getrandom_8h.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/getrandom.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('getrandom_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">getrandom.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">Tpm2GetRandom</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, int const num_bits, void *random_data)</td></tr>
+<tr class="memdesc:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get random data. <a href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">More...</a><br /></td></tr>
+<tr class="separator:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="getrandom_8h.html">getrandom.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644
index 0000000..be2b6d6
--- /dev/null
+++ b/doc/html/globals.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index__"></a>- _ -</h3><ul>
+<li>_Bool
+: <a class="el" href="stdtypes_8h.html#aeaff0db5524987a2f50d71ac0162ceb2">stdtypes.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_b.html b/doc/html/globals_b.html
new file mode 100644
index 0000000..2ef3fbf
--- /dev/null
+++ b/doc/html/globals_b.html
@@ -0,0 +1,128 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_b.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>be32toh
+: <a class="el" href="endian_8h.html#a48127d3bd550dacd707b58a637b05393">endian.h</a>
+</li>
+<li>BigNum
+: <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">bignum.h</a>
+</li>
+<li>BigNumAdd()
+: <a class="el" href="group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8">bignum.h</a>
+</li>
+<li>BigNumDiv()
+: <a class="el" href="group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573">bignum.h</a>
+</li>
+<li>BigNumIsEven()
+: <a class="el" href="group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084">bignum.h</a>
+</li>
+<li>BigNumIsZero()
+: <a class="el" href="group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb">bignum.h</a>
+</li>
+<li>BigNumMod()
+: <a class="el" href="group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929">bignum.h</a>
+</li>
+<li>BigNumMul()
+: <a class="el" href="group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317">bignum.h</a>
+</li>
+<li>BigNumPow2N()
+: <a class="el" href="group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4">bignum.h</a>
+</li>
+<li>BigNumSub()
+: <a class="el" href="group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea">bignum.h</a>
+</li>
+<li>BIT7
+: <a class="el" href="commit_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">commit.c</a>
+, <a class="el" href="sign_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">sign.c</a>
+</li>
+<li>BITS0500
+: <a class="el" href="commit_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">commit.c</a>
+, <a class="el" href="sign_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">sign.c</a>
+</li>
+<li>BitSupplier
+: <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">bitsupplier.h</a>
+</li>
+<li>bool
+: <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">stdtypes.h</a>
+</li>
+<li>BREAK_ON_EPID_ERROR
+: <a class="el" href="load__external_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">load_external.c</a>
+, <a class="el" href="commit_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">commit.c</a>
+, <a class="el" href="sign_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">sign.c</a>
+, <a class="el" href="context_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">context.c</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_c.html b/doc/html/globals_c.html
new file mode 100644
index 0000000..8f62635
--- /dev/null
+++ b/doc/html/globals_c.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>ConstOctStr
+: <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">types.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_d.html b/doc/html/globals_d.html
new file mode 100644
index 0000000..0f994c8
--- /dev/null
+++ b/doc/html/globals_d.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_d.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>DeleteBigNum()
+: <a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03">bignum.h</a>
+</li>
+<li>DeleteEcGroup()
+: <a class="el" href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea">ecgroup.h</a>
+</li>
+<li>DeleteEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7">ecgroup.h</a>
+</li>
+<li>DeleteEpid11PairingState()
+: <a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758">tatepairing.h</a>
+</li>
+<li>DeleteFfElement()
+: <a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e">finitefield.h</a>
+</li>
+<li>DeleteFiniteField()
+: <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f">finitefield.h</a>
+</li>
+<li>DeletePairingState()
+: <a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d">pairing.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html
new file mode 100644
index 0000000..55a6baa
--- /dev/null
+++ b/doc/html/globals_defs.html
@@ -0,0 +1,144 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_defs.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;<ul>
+<li>_Bool
+: <a class="el" href="stdtypes_8h.html#aeaff0db5524987a2f50d71ac0162ceb2">stdtypes.h</a>
+</li>
+<li>be32toh
+: <a class="el" href="endian_8h.html#a48127d3bd550dacd707b58a637b05393">endian.h</a>
+</li>
+<li>BIT7
+: <a class="el" href="commit_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">commit.c</a>
+, <a class="el" href="sign_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">sign.c</a>
+</li>
+<li>BITS0500
+: <a class="el" href="commit_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">commit.c</a>
+, <a class="el" href="sign_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">sign.c</a>
+</li>
+<li>BREAK_ON_EPID_ERROR
+: <a class="el" href="sign_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">sign.c</a>
+, <a class="el" href="commit_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">commit.c</a>
+, <a class="el" href="load__external_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">load_external.c</a>
+, <a class="el" href="context_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">context.c</a>
+</li>
+<li>false
+: <a class="el" href="stdtypes_8h.html#a65e9886d74aaee76545e83dd09011727">stdtypes.h</a>
+</li>
+<li>htobe32
+: <a class="el" href="endian_8h.html#ab004b68a63ea32dcd67fbe597263120b">endian.h</a>
+</li>
+<li>MATH_FAIL
+: <a class="el" href="mathdefs_8h.html#a1a994bd1e283835646241e53b6728cee">mathdefs.h</a>
+</li>
+<li>MATH_SUCCESS
+: <a class="el" href="mathdefs_8h.html#a352e5652c4f35088eba5f769a5d7993f">mathdefs.h</a>
+</li>
+<li>NUM_ECC_DIGITS
+: <a class="el" href="mathtypes_8h.html#a94d0ffa1ccb9d2f09d1ada23a5807021">mathtypes.h</a>
+</li>
+<li>SHA256_BLOCK_SIZE
+: <a class="el" href="sha256_8h.html#a9c1fe69ad43d4ca74b84303a0ed64f2f">sha256.h</a>
+</li>
+<li>SHA256_DIGEST_SIZE
+: <a class="el" href="sha256_8h.html#a81efbc0fc101b06a914f7ff9e2fbc0e9">sha256.h</a>
+</li>
+<li>SHA256_STATE_BLOCKS
+: <a class="el" href="sha256_8h.html#a0558ee82699b60132c23e0a049ab7a56">sha256.h</a>
+</li>
+<li>SHA512_BLOCK_SIZE
+: <a class="el" href="sha512_8h.html#ac7071364cb94c9fcce009ba16a4bdca1">sha512.h</a>
+</li>
+<li>SHA512_DIGEST_SIZE
+: <a class="el" href="sha512_8h.html#a67f489f3eee39c447a6db3ba34ef75f2">sha512.h</a>
+</li>
+<li>SHA512_DIGEST_WORDS
+: <a class="el" href="sha512_8h.html#ab16e074d262ae09949e0bf222f95f5be">sha512.h</a>
+</li>
+<li>TPM_ALG_NULL
+: <a class="el" href="conversion_8h.html#a3622ddd0080bf63059d26887b6ee90ac">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA256
+: <a class="el" href="conversion_8h.html#ae9c66465b8109d648704268fee8cf66b">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA384
+: <a class="el" href="conversion_8h.html#a85ee45736d112c61495faad4fea3dbbc">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA512
+: <a class="el" href="conversion_8h.html#a8aecd28504c6511c02da2e78ecaaf5bd">conversion.h</a>
+</li>
+<li>true
+: <a class="el" href="stdtypes_8h.html#a41f9c5fb8b08eb5dc3edce4dcb37fee7">stdtypes.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_e.html b/doc/html/globals_e.html
new file mode 100644
index 0000000..a233889
--- /dev/null
+++ b/doc/html/globals_e.html
@@ -0,0 +1,448 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_e.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>EcdsaSignBuffer()
+: <a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a">ecdsa.h</a>
+</li>
+<li>EcdsaVerifyBuffer()
+: <a class="el" href="group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0">ecdsa.h</a>
+</li>
+<li>EcExp()
+: <a class="el" href="group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270">ecgroup.h</a>
+</li>
+<li>EcGetRandom()
+: <a class="el" href="group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196">ecgroup.h</a>
+</li>
+<li>EcGroup
+: <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">ecgroup.h</a>
+</li>
+<li>EcHash()
+: <a class="el" href="group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c">ecgroup.h</a>
+</li>
+<li>EcInGroup()
+: <a class="el" href="group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921">ecgroup.h</a>
+</li>
+<li>EcInverse()
+: <a class="el" href="group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466">ecgroup.h</a>
+</li>
+<li>EcIsEqual()
+: <a class="el" href="group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061">ecgroup.h</a>
+</li>
+<li>EcIsIdentity()
+: <a class="el" href="group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210">ecgroup.h</a>
+</li>
+<li>EcMakePoint()
+: <a class="el" href="group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e">ecgroup.h</a>
+</li>
+<li>EcMul()
+: <a class="el" href="group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96">ecgroup.h</a>
+</li>
+<li>EcMultiExp()
+: <a class="el" href="group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4">ecgroup.h</a>
+</li>
+<li>EcMultiExpBn()
+: <a class="el" href="group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a">ecgroup.h</a>
+</li>
+<li>EcPoint
+: <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">ecgroup.h</a>
+</li>
+<li>EcSscmExp()
+: <a class="el" href="group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57">ecgroup.h</a>
+</li>
+<li>EcSscmMultiExp()
+: <a class="el" href="group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4">ecgroup.h</a>
+</li>
+<li>EFq2Add()
+: <a class="el" href="efq2_8h.html#a6cbfb24b20b29b2e678e259aa6c0e2db">efq2.h</a>
+</li>
+<li>EFq2Dbl()
+: <a class="el" href="efq2_8h.html#a1db50d99360ed019ca4dcd2f9bcf210a">efq2.h</a>
+</li>
+<li>EFq2Deserialize()
+: <a class="el" href="serialize_8h.html#a393c9cf42edef41aa28449a0d321a57e">serialize.h</a>
+</li>
+<li>EFq2Eq()
+: <a class="el" href="efq2_8h.html#a2064ea9b48565a164314da4b487aaabd">efq2.h</a>
+</li>
+<li>EFq2FromAffine()
+: <a class="el" href="efq2_8h.html#af1da3e171d605db6f5ea0a70dc01ac27">efq2.h</a>
+</li>
+<li>EFq2IsInf()
+: <a class="el" href="efq2_8h.html#a9181b09474d800c65fd89aee2c28ebab">efq2.h</a>
+</li>
+<li>EFq2MulSSCM()
+: <a class="el" href="efq2_8h.html#a3ad678e3701e1211fa01ddc54f2bc5e4">efq2.h</a>
+</li>
+<li>EFq2Neg()
+: <a class="el" href="efq2_8h.html#a977bd074ed0dec943ad0cf19a01c0cf7">efq2.h</a>
+</li>
+<li>EFq2OnCurve()
+: <a class="el" href="efq2_8h.html#a26c35eefbd1ee11a5d078c44d295ff5a">efq2.h</a>
+</li>
+<li>EFq2Serialize()
+: <a class="el" href="serialize_8h.html#aa53e1c30fa109e586fa90a3a4cf3d0ac">serialize.h</a>
+</li>
+<li>EFq2ToAffine()
+: <a class="el" href="efq2_8h.html#a484e6af5efc2042d865999dac9489684">efq2.h</a>
+</li>
+<li>EFqAdd()
+: <a class="el" href="efq_8h.html#abf04f5ec866fc77d0203beb8a8991f25">efq.h</a>
+</li>
+<li>EFqAffineAdd()
+: <a class="el" href="efq_8h.html#a6cf130d65a5f35237a88046faad43c0a">efq.h</a>
+</li>
+<li>EFqAffineDbl()
+: <a class="el" href="efq_8h.html#a975f92abdaf431f2fb152fca84d468b3">efq.h</a>
+</li>
+<li>EFqAffineExp()
+: <a class="el" href="efq_8h.html#a8990ca0e19d8ed7b78958963e60948e2">efq.h</a>
+</li>
+<li>EFqAffineMultiExp()
+: <a class="el" href="efq_8h.html#a2618ae4b4fc8f2838a6550abfb4448ca">efq.h</a>
+</li>
+<li>EFqCondSet()
+: <a class="el" href="efq_8h.html#a9b2fcab6bc74601f9c302c5b34400ae4">efq.h</a>
+</li>
+<li>EFqCp()
+: <a class="el" href="efq_8h.html#a7a7863639a5b96d44522d579d7d32e40">efq.h</a>
+</li>
+<li>EFqDbl()
+: <a class="el" href="efq_8h.html#a23b6331263b002e6e07d2be5216fd6e8">efq.h</a>
+</li>
+<li>EFqDeserialize()
+: <a class="el" href="serialize_8h.html#af7f9b8ffdf1bb18bc156a4f80fc32419">serialize.h</a>
+</li>
+<li>EFqEq()
+: <a class="el" href="efq_8h.html#a7fbfe9d25cf08f4dcbd950cfb07471ff">efq.h</a>
+</li>
+<li>EFqEqAffine()
+: <a class="el" href="efq_8h.html#acfc458ea689ea3aa637c9c817dfa44c5">efq.h</a>
+</li>
+<li>EFqFromAffine()
+: <a class="el" href="efq_8h.html#a97ce025667b076986a6d92b3d41a7827">efq.h</a>
+</li>
+<li>EFqHash()
+: <a class="el" href="efq_8h.html#abf80ad8b8e3e506f4c46ec57de1c4846">efq.h</a>
+</li>
+<li>EFqInf()
+: <a class="el" href="efq_8h.html#a73fd77b7cc14c0decd95fd294b5b250c">efq.h</a>
+</li>
+<li>EFqIsInf()
+: <a class="el" href="efq_8h.html#ae38257cf97872a4fa855033ad44e2e10">efq.h</a>
+</li>
+<li>EFqJCp()
+: <a class="el" href="efq_8h.html#a1a31d069739c4da17011280a8ae6354a">efq.h</a>
+</li>
+<li>EFqJOnCurve()
+: <a class="el" href="efq_8h.html#ada751265a36ee3236fce90105a62909e">efq.h</a>
+</li>
+<li>EFqJRand()
+: <a class="el" href="efq_8h.html#a15bda5d411f7c6d602994e6444034414">efq.h</a>
+</li>
+<li>EFqMulSSCM()
+: <a class="el" href="efq_8h.html#a84e5231cee67eeba5b2a0f99088bc70e">efq.h</a>
+</li>
+<li>EFqMultiExp()
+: <a class="el" href="efq_8h.html#abbcd39b964e4fd685d1dba73ec110c86">efq.h</a>
+</li>
+<li>EFqNeg()
+: <a class="el" href="efq_8h.html#a0f7309ab07d4d3e0556a32f1839ae6fe">efq.h</a>
+</li>
+<li>EFqOnCurve()
+: <a class="el" href="efq_8h.html#a81470fed188d5043f89b6b8ab6031a42">efq.h</a>
+</li>
+<li>EFqRand()
+: <a class="el" href="efq_8h.html#a40588e2618ed9a38043532785a8d5785">efq.h</a>
+</li>
+<li>EFqSerialize()
+: <a class="el" href="serialize_8h.html#a81b7bcb69d6ea28ebb3e3520c7d0eeb5">serialize.h</a>
+</li>
+<li>EFqSet()
+: <a class="el" href="efq_8h.html#a7d1841f9e29bc604054536de7a4a861d">efq.h</a>
+</li>
+<li>EFqToAffine()
+: <a class="el" href="efq_8h.html#aaf3f26e855b85e869cb80fae780a4e6a">efq.h</a>
+</li>
+<li>Epid11AreSigsLinked()
+: <a class="el" href="group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7">api.h</a>
+</li>
+<li>Epid11CheckPrivRlEntry()
+: <a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929">api.h</a>
+</li>
+<li>Epid11EcHash()
+: <a class="el" href="group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82">ecgroup.h</a>
+</li>
+<li>Epid11G1ElemStr
+: <a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">types.h</a>
+</li>
+<li>Epid11G3ElemStr
+: <a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">types.h</a>
+</li>
+<li>Epid11GroupId
+: <a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">types.h</a>
+</li>
+<li>Epid11NrVerify()
+: <a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813">api.h</a>
+</li>
+<li>Epid11Pairing()
+: <a class="el" href="group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059">tatepairing.h</a>
+</li>
+<li>Epid11PairingState
+: <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">tatepairing.h</a>
+</li>
+<li>Epid11ParseGroupPubKeyFile()
+: <a class="el" href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c">file_parser.h</a>
+</li>
+<li>Epid11ParseGroupRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3">file_parser.h</a>
+</li>
+<li>Epid11ParsePrivRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546">file_parser.h</a>
+</li>
+<li>Epid11ParseSigRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868">file_parser.h</a>
+</li>
+<li>Epid11VerifierCreate()
+: <a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8">api.h</a>
+</li>
+<li>Epid11VerifierCtx
+: <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">api.h</a>
+</li>
+<li>Epid11VerifierDelete()
+: <a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1">api.h</a>
+</li>
+<li>Epid11VerifierSetBasename()
+: <a class="el" href="group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">api.h</a>
+</li>
+<li>Epid11VerifierSetGroupRl()
+: <a class="el" href="group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65">api.h</a>
+</li>
+<li>Epid11VerifierSetPrivRl()
+: <a class="el" href="group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14">api.h</a>
+</li>
+<li>Epid11VerifierSetSigRl()
+: <a class="el" href="group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8">api.h</a>
+</li>
+<li>Epid11VerifierWritePrecomp()
+: <a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c">api.h</a>
+</li>
+<li>Epid11Verify()
+: <a class="el" href="group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216">api.h</a>
+</li>
+<li>Epid11VerifyBasicSig()
+: <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070">api.h</a>
+</li>
+<li>EpidAddPreSigs()
+: <a class="el" href="group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78">api.h</a>
+</li>
+<li>EpidAreSigsLinked()
+: <a class="el" href="group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8">api.h</a>
+</li>
+<li>EpidBlacklistSig()
+: <a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69">api.h</a>
+</li>
+<li>EpidCheckPrivRlEntry()
+: <a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea">api.h</a>
+</li>
+<li>EpidClearRegisteredBasenames()
+: <a class="el" href="group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3">api.h</a>
+</li>
+<li>EpidCreateJoinRequest()
+: <a class="el" href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3">api.h</a>
+</li>
+<li>EpidDecompressPrivKey()
+: <a class="el" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">api.h</a>
+</li>
+<li>EpidFileType
+: <a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">file_parser.h</a>
+</li>
+<li>EpidGetNumPreSigs()
+: <a class="el" href="group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075">api.h</a>
+</li>
+<li>EpidGetSigSize()
+: <a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">api.h</a>
+</li>
+<li>EpidGetVerifierRlSize()
+: <a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f">api.h</a>
+</li>
+<li>EpidMemberCreate()
+: <a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">api.h</a>
+</li>
+<li>EpidMemberDeinit()
+: <a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">api.h</a>
+</li>
+<li>EpidMemberDelete()
+: <a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">api.h</a>
+</li>
+<li>EpidMemberGetSize()
+: <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">api.h</a>
+</li>
+<li>EpidMemberInit()
+: <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">api.h</a>
+</li>
+<li>EpidMemberSetHashAlg()
+: <a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">api.h</a>
+</li>
+<li>EpidMemberSetSigRl()
+: <a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">api.h</a>
+</li>
+<li>EpidMemberStartup()
+: <a class="el" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">api.h</a>
+</li>
+<li>EpidNrVerify()
+: <a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700">api.h</a>
+</li>
+<li>EpidParseFileHeader()
+: <a class="el" href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55">file_parser.h</a>
+</li>
+<li>EpidParseGroupPubKeyFile()
+: <a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">file_parser.h</a>
+</li>
+<li>EpidParseGroupRlFile()
+: <a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">file_parser.h</a>
+</li>
+<li>EpidParsePrivRlFile()
+: <a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">file_parser.h</a>
+</li>
+<li>EpidParseSigRlFile()
+: <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">file_parser.h</a>
+</li>
+<li>EpidProvisionCompressed()
+: <a class="el" href="group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea">api.h</a>
+</li>
+<li>EpidProvisionCredential()
+: <a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">api.h</a>
+</li>
+<li>EpidProvisionKey()
+: <a class="el" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">api.h</a>
+</li>
+<li>EpidRegisterBasename()
+: <a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">api.h</a>
+</li>
+<li>EpidSign()
+: <a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">api.h</a>
+</li>
+<li>EpidStatus
+: <a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">errors.h</a>
+</li>
+<li>EpidStatusToString()
+: <a class="el" href="group___error_codes.html#ga59e8680ce52509302fd58a987e45004d">errors.h</a>
+</li>
+<li>EpidtoTpm2HashAlg()
+: <a class="el" href="conversion_8c.html#ad08628a6bf33154c1029a32e8b83325f">conversion.c</a>
+, <a class="el" href="conversion_8h.html#ad08628a6bf33154c1029a32e8b83325f">conversion.h</a>
+</li>
+<li>EpidVerifierCreate()
+: <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">api.h</a>
+</li>
+<li>EpidVerifierDelete()
+: <a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">api.h</a>
+</li>
+<li>EpidVerifierSetBasename()
+: <a class="el" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">api.h</a>
+</li>
+<li>EpidVerifierSetGroupRl()
+: <a class="el" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">api.h</a>
+</li>
+<li>EpidVerifierSetHashAlg()
+: <a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">api.h</a>
+</li>
+<li>EpidVerifierSetPrivRl()
+: <a class="el" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">api.h</a>
+</li>
+<li>EpidVerifierSetSigRl()
+: <a class="el" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">api.h</a>
+</li>
+<li>EpidVerifierSetVerifierRl()
+: <a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">api.h</a>
+</li>
+<li>EpidVerifierWritePrecomp()
+: <a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">api.h</a>
+</li>
+<li>EpidVerify()
+: <a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">api.h</a>
+</li>
+<li>EpidVerifyBasicSig()
+: <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">api.h</a>
+</li>
+<li>EpidVersion
+: <a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">file_parser.h</a>
+</li>
+<li>EpidWriteVerifierRl()
+: <a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81">api.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_enum.html b/doc/html/globals_enum.html
new file mode 100644
index 0000000..953df2f
--- /dev/null
+++ b/doc/html/globals_enum.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_enum.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;<ul>
+<li>EpidFileType
+: <a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">file_parser.h</a>
+</li>
+<li>EpidStatus
+: <a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">errors.h</a>
+</li>
+<li>EpidVersion
+: <a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">file_parser.h</a>
+</li>
+<li>HashAlg
+: <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">types.h</a>
+</li>
+<li>PrintUtilFormat
+: <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">printutils.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_eval.html b/doc/html/globals_eval.html
new file mode 100644
index 0000000..be562cb
--- /dev/null
+++ b/doc/html/globals_eval.html
@@ -0,0 +1,210 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_eval.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>kEpid1x
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc">file_parser.h</a>
+</li>
+<li>kEpid2x
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2">file_parser.h</a>
+</li>
+<li>kEpidBadArgErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">errors.h</a>
+</li>
+<li>kEpidDivByZeroErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3">errors.h</a>
+</li>
+<li>kEpidDuplicateErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f">errors.h</a>
+</li>
+<li>kEpidErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">errors.h</a>
+</li>
+<li>kEpidHashAlgorithmNotSupported
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4">errors.h</a>
+</li>
+<li>kEpidInconsistentBasenameSetErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df">errors.h</a>
+</li>
+<li>kEpidMathErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6">errors.h</a>
+</li>
+<li>kEpidMathQuadraticNonResidueError
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129">errors.h</a>
+</li>
+<li>kEpidMemAllocErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">errors.h</a>
+</li>
+<li>kEpidNoErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">errors.h</a>
+</li>
+<li>kEpidNoMemErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c">errors.h</a>
+</li>
+<li>kEpidNotImpl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7">errors.h</a>
+</li>
+<li>kEpidOutOfSequenceError
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43">errors.h</a>
+</li>
+<li>kEpidRandMaxIterErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357">errors.h</a>
+</li>
+<li>kEpidSigInvalid
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">errors.h</a>
+</li>
+<li>kEpidSigRevokedInGroupRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5">errors.h</a>
+</li>
+<li>kEpidSigRevokedInPrivRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1">errors.h</a>
+</li>
+<li>kEpidSigRevokedInSigRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c">errors.h</a>
+</li>
+<li>kEpidSigRevokedInVerifierRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298">errors.h</a>
+</li>
+<li>kEpidSigValid
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e">errors.h</a>
+</li>
+<li>kEpidUnderflowErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec">errors.h</a>
+</li>
+<li>kGroupPubKeyFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e">file_parser.h</a>
+</li>
+<li>kGroupRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770">file_parser.h</a>
+</li>
+<li>kGroupRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c">file_parser.h</a>
+</li>
+<li>kInvalidHashAlg
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb">types.h</a>
+</li>
+<li>kIssuingCaPubKeyFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92">file_parser.h</a>
+</li>
+<li>kNumEpidVersions
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">file_parser.h</a>
+</li>
+<li>kNumFileTypes
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">file_parser.h</a>
+</li>
+<li>kPrintUtilAnnotated
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d">printutils.h</a>
+</li>
+<li>kPrintUtilFormatCount
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a">printutils.h</a>
+</li>
+<li>kPrintUtilUnannotated
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae">printutils.h</a>
+</li>
+<li>kPrivRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322">file_parser.h</a>
+</li>
+<li>kPrivRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911">file_parser.h</a>
+</li>
+<li>kSha256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d">types.h</a>
+</li>
+<li>kSha384
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290">types.h</a>
+</li>
+<li>kSha3_256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85">types.h</a>
+</li>
+<li>kSha3_384
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86">types.h</a>
+</li>
+<li>kSha3_512
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee">types.h</a>
+</li>
+<li>kSha512
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055">types.h</a>
+</li>
+<li>kSha512_256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba">types.h</a>
+</li>
+<li>kSigRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710">file_parser.h</a>
+</li>
+<li>kSigRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600">file_parser.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_f.html b/doc/html/globals_f.html
new file mode 100644
index 0000000..cbfa61c
--- /dev/null
+++ b/doc/html/globals_f.html
@@ -0,0 +1,375 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>false
+: <a class="el" href="stdtypes_8h.html#a65e9886d74aaee76545e83dd09011727">stdtypes.h</a>
+</li>
+<li>FfAdd()
+: <a class="el" href="group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b">finitefield.h</a>
+</li>
+<li>FfElement
+: <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">finitefield.h</a>
+</li>
+<li>FfExp()
+: <a class="el" href="group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c">finitefield.h</a>
+</li>
+<li>FfGetRandom()
+: <a class="el" href="group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8">finitefield.h</a>
+</li>
+<li>FfHash()
+: <a class="el" href="group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5">finitefield.h</a>
+</li>
+<li>FfInv()
+: <a class="el" href="group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a">finitefield.h</a>
+</li>
+<li>FfIsEqual()
+: <a class="el" href="group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625">finitefield.h</a>
+</li>
+<li>FfIsZero()
+: <a class="el" href="group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53">finitefield.h</a>
+</li>
+<li>FfMul()
+: <a class="el" href="group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5">finitefield.h</a>
+</li>
+<li>FfMultiExp()
+: <a class="el" href="group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3">finitefield.h</a>
+</li>
+<li>FfMultiExpBn()
+: <a class="el" href="group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144">finitefield.h</a>
+</li>
+<li>FfNeg()
+: <a class="el" href="group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2">finitefield.h</a>
+</li>
+<li>FfSqrt()
+: <a class="el" href="group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6">finitefield.h</a>
+</li>
+<li>FfSscmMultiExp()
+: <a class="el" href="group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634">finitefield.h</a>
+</li>
+<li>FfSub()
+: <a class="el" href="group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991">finitefield.h</a>
+</li>
+<li>FiniteField
+: <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">finitefield.h</a>
+</li>
+<li>FpAdd()
+: <a class="el" href="fp_8h.html#a55152abe8b866eba5a0c83cfb1bbe5f6">fp.h</a>
+</li>
+<li>FpClear()
+: <a class="el" href="fp_8h.html#adf010ec5710d4013e33efd7e5ba8f9ad">fp.h</a>
+</li>
+<li>FpDeserialize()
+: <a class="el" href="serialize_8h.html#ac49c8bd07a7f09aadd08c58c362cf3af">serialize.h</a>
+</li>
+<li>FpEq()
+: <a class="el" href="fp_8h.html#a7bb685bd810368d8077f638ffcab2554">fp.h</a>
+</li>
+<li>FpExp()
+: <a class="el" href="fp_8h.html#ab06b1b1a59f1138aa6c4d746ab707f86">fp.h</a>
+</li>
+<li>FpFromHash()
+: <a class="el" href="fp_8h.html#a472b0a9229b0eff0ca445f158efa1175">fp.h</a>
+</li>
+<li>FpInField()
+: <a class="el" href="fp_8h.html#ac2eab44a7aa9679d107667ffc035ee0a">fp.h</a>
+</li>
+<li>FpInv()
+: <a class="el" href="fp_8h.html#a9e7500fe8ee73592b002ed675d1758b3">fp.h</a>
+</li>
+<li>FpMul()
+: <a class="el" href="fp_8h.html#a9392597a6fe50e5c102ce21b8a1ae6c2">fp.h</a>
+</li>
+<li>FpNeg()
+: <a class="el" href="fp_8h.html#a0524fd074857712ea61ea5717ff54fd3">fp.h</a>
+</li>
+<li>FpRand()
+: <a class="el" href="fp_8h.html#a6c06b175fd82b5db555508f2d26713f8">fp.h</a>
+</li>
+<li>FpRandNonzero()
+: <a class="el" href="fp_8h.html#a54743809639797b4d4445c221291048b">fp.h</a>
+</li>
+<li>FpSerialize()
+: <a class="el" href="serialize_8h.html#a57237335a24f8a9b2a151a2141ec5917">serialize.h</a>
+</li>
+<li>FpSet()
+: <a class="el" href="fp_8h.html#a23bf42c7024a318970a6b60c02d9a08d">fp.h</a>
+</li>
+<li>FpSub()
+: <a class="el" href="fp_8h.html#aa9cc9f5e33bba75420b83cb2d49ca280">fp.h</a>
+</li>
+<li>Fq12Add()
+: <a class="el" href="fq12_8h.html#aa4a17bfa56644ab615c60bd7ec900821">fq12.h</a>
+</li>
+<li>Fq12Clear()
+: <a class="el" href="fq12_8h.html#aaeb34cf6f4d176674fc300d7e7fc57f1">fq12.h</a>
+</li>
+<li>Fq12Conj()
+: <a class="el" href="fq12_8h.html#a33a3bb0f378ac008cde38b88a39ea79c">fq12.h</a>
+</li>
+<li>Fq12Cp()
+: <a class="el" href="fq12_8h.html#ad739d6a59a3f7ed0c0117c7486d06290">fq12.h</a>
+</li>
+<li>Fq12Deserialize()
+: <a class="el" href="serialize_8h.html#a2f5ba336b7da938e92dad848e00ad157">serialize.h</a>
+</li>
+<li>Fq12Eq()
+: <a class="el" href="fq12_8h.html#a08b50a1f5fe19c78a19f1f4a457b9a39">fq12.h</a>
+</li>
+<li>Fq12Exp()
+: <a class="el" href="fq12_8h.html#a3bf52e5b01103632fa429927e5a07b1d">fq12.h</a>
+</li>
+<li>Fq12ExpCyc()
+: <a class="el" href="fq12_8h.html#a65ad8c0f4aa0859593aab885066c5025">fq12.h</a>
+</li>
+<li>Fq12Inv()
+: <a class="el" href="fq12_8h.html#afd089e0cb6e4ec68a3a3062f26d4430d">fq12.h</a>
+</li>
+<li>Fq12Mul()
+: <a class="el" href="fq12_8h.html#aec7e0ce55e01ab48c0c6315cb9e5b47d">fq12.h</a>
+</li>
+<li>Fq12MulSpecial()
+: <a class="el" href="fq12_8h.html#ac1b44bbceb1c648b2b880871c8b52195">fq12.h</a>
+</li>
+<li>Fq12MultiExp()
+: <a class="el" href="fq12_8h.html#ae88eb95c37c9db2e37e14d8a9304fadd">fq12.h</a>
+</li>
+<li>Fq12Neg()
+: <a class="el" href="fq12_8h.html#af3fd9055d559c592eb5715bb261c072b">fq12.h</a>
+</li>
+<li>Fq12Serialize()
+: <a class="el" href="serialize_8h.html#ad0de690fc04ff307fa64575f9033c4d7">serialize.h</a>
+</li>
+<li>Fq12Set()
+: <a class="el" href="fq12_8h.html#acd16f86f83021d44d25389ad9f701597">fq12.h</a>
+</li>
+<li>Fq12SqCyc()
+: <a class="el" href="fq12_8h.html#a1ad8710126bb4906d6170dd8ab30e43a">fq12.h</a>
+</li>
+<li>Fq12Square()
+: <a class="el" href="fq12_8h.html#a12e88a0bbfcc24b1863754f5e027d28e">fq12.h</a>
+</li>
+<li>Fq12Sub()
+: <a class="el" href="fq12_8h.html#a80c3da69a0991423a728e9b74a2dfe15">fq12.h</a>
+</li>
+<li>Fq2Add()
+: <a class="el" href="fq2_8h.html#afcaaf75460f36b85386cd1959b904f57">fq2.h</a>
+</li>
+<li>Fq2Clear()
+: <a class="el" href="fq2_8h.html#a59d3d8212ffd5bf75f9b6fd85b896654">fq2.h</a>
+</li>
+<li>Fq2CondSet()
+: <a class="el" href="fq2_8h.html#ad94b155025e7a11b9c5b60032fde4491">fq2.h</a>
+</li>
+<li>Fq2Conj()
+: <a class="el" href="fq2_8h.html#adc0d02ddec564ca86b0ef53d7ff79864">fq2.h</a>
+</li>
+<li>Fq2Cp()
+: <a class="el" href="fq2_8h.html#a6c67364f78e6946a7ad3af2c86baf1a5">fq2.h</a>
+</li>
+<li>Fq2Eq()
+: <a class="el" href="fq2_8h.html#a3dc330cff53539b51183c43085275f97">fq2.h</a>
+</li>
+<li>Fq2Exp()
+: <a class="el" href="fq2_8h.html#acecbff7a5a8cec15e24c47663957c05a">fq2.h</a>
+</li>
+<li>Fq2Inv()
+: <a class="el" href="fq2_8h.html#a756666161516fe541b26a4082f69343d">fq2.h</a>
+</li>
+<li>Fq2IsZero()
+: <a class="el" href="fq2_8h.html#a610c9d7c2afa63b1d48da30c684d6e27">fq2.h</a>
+</li>
+<li>Fq2Mul()
+: <a class="el" href="fq2_8h.html#a876f870f84cd8ab697176dbb42591565">fq2.h</a>
+</li>
+<li>Fq2MulScalar()
+: <a class="el" href="fq2_8h.html#af45903d791794faabedb00f760885e8c">fq2.h</a>
+</li>
+<li>Fq2MulXi()
+: <a class="el" href="fq2_8h.html#afeeb4e14ddf9f39f860661c599923c58">fq2.h</a>
+</li>
+<li>Fq2Neg()
+: <a class="el" href="fq2_8h.html#a5d523d5d6d4159c71f58945af82a7936">fq2.h</a>
+</li>
+<li>Fq2Set()
+: <a class="el" href="fq2_8h.html#a9165c1d2deef46ceb9af238928b2ec5c">fq2.h</a>
+</li>
+<li>Fq2Square()
+: <a class="el" href="fq2_8h.html#a3c6583dd519a3dd7efb26db5e9a59036">fq2.h</a>
+</li>
+<li>Fq2Sub()
+: <a class="el" href="fq2_8h.html#ae27a9400b5d8fbd0b720a449c60ad146">fq2.h</a>
+</li>
+<li>Fq6Add()
+: <a class="el" href="fq6_8h.html#a0607ab44e53c7a16f8e1b2746d250a7c">fq6.h</a>
+</li>
+<li>Fq6Clear()
+: <a class="el" href="fq6_8h.html#a7c77a862223f577e11e595332c9fb272">fq6.h</a>
+</li>
+<li>Fq6CondSet()
+: <a class="el" href="fq6_8h.html#aa0c82e905ee190ad2187b89e464466d4">fq6.h</a>
+</li>
+<li>Fq6Cp()
+: <a class="el" href="fq6_8h.html#a36bd769bc95b887f75bb60c2f7a45e17">fq6.h</a>
+</li>
+<li>Fq6Eq()
+: <a class="el" href="fq6_8h.html#aaf54d03c0afdb6eeced6ddad1237c2e4">fq6.h</a>
+</li>
+<li>Fq6Inv()
+: <a class="el" href="fq6_8h.html#a5f4708ca109578527afd8cda99acd6ee">fq6.h</a>
+</li>
+<li>Fq6IsZero()
+: <a class="el" href="fq6_8h.html#a634aab5dc04177587a22324352ff91e5">fq6.h</a>
+</li>
+<li>Fq6Mul()
+: <a class="el" href="fq6_8h.html#ad1e1cac423a2c3c69a4f3629d33faaf1">fq6.h</a>
+</li>
+<li>Fq6MulScalar()
+: <a class="el" href="fq6_8h.html#a701d89b5c73ba67a2f765d49f5d5ae4e">fq6.h</a>
+</li>
+<li>Fq6MulV()
+: <a class="el" href="fq6_8h.html#ad30bd276a4e2e9df3613072c38ec13ae">fq6.h</a>
+</li>
+<li>Fq6Neg()
+: <a class="el" href="fq6_8h.html#a9a5ddbf8f16b48030209b172079d22a6">fq6.h</a>
+</li>
+<li>Fq6Set()
+: <a class="el" href="fq6_8h.html#a06b8c3988c3782fda22c9ffb47b5180b">fq6.h</a>
+</li>
+<li>Fq6Square()
+: <a class="el" href="fq6_8h.html#a58e5b68a86b776d82ade8307046e2375">fq6.h</a>
+</li>
+<li>Fq6Sub()
+: <a class="el" href="fq6_8h.html#a87d07ab842862a482410a838516ad0c7">fq6.h</a>
+</li>
+<li>FqAdd()
+: <a class="el" href="fq_8h.html#ab52f69c761454d976c3fc56a26549419">fq.h</a>
+</li>
+<li>FqClear()
+: <a class="el" href="fq_8h.html#ac85eb642d3b3973477749769e04d45af">fq.h</a>
+</li>
+<li>FqCondSet()
+: <a class="el" href="fq_8h.html#afbb0976ef343b14c66305db0a48647ca">fq.h</a>
+</li>
+<li>FqCp()
+: <a class="el" href="fq_8h.html#a17133e5b777baa8c745b7dfcf1c8ad8d">fq.h</a>
+</li>
+<li>FqDeserialize()
+: <a class="el" href="serialize_8h.html#a051985a737e59da22d04dfcc5112ec77">serialize.h</a>
+</li>
+<li>FqEq()
+: <a class="el" href="fq_8h.html#abd40d255e0094f7156092db44a3b90fa">fq.h</a>
+</li>
+<li>FqExp()
+: <a class="el" href="fq_8h.html#a276d3747aefdac5503982f2aa5eccbf8">fq.h</a>
+</li>
+<li>FqFromHash()
+: <a class="el" href="fq_8h.html#a7794f72bcc506f8d8a60dbfae1a70ed0">fq.h</a>
+</li>
+<li>FqInField()
+: <a class="el" href="fq_8h.html#aceb37a8f5538fe9ca682058ff0e36091">fq.h</a>
+</li>
+<li>FqInv()
+: <a class="el" href="fq_8h.html#a7b60a8996973d474d2fb7a31838c6d8c">fq.h</a>
+</li>
+<li>FqIsZero()
+: <a class="el" href="fq_8h.html#ac08ca8c781cd18cbadabbeeb85722e49">fq.h</a>
+</li>
+<li>FqMul()
+: <a class="el" href="fq_8h.html#ab0bf77a97fb3a12292886bef3abcf9bd">fq.h</a>
+</li>
+<li>FqNeg()
+: <a class="el" href="fq_8h.html#ae8379530cca959e7e36446b2979d8af4">fq.h</a>
+</li>
+<li>FqRand()
+: <a class="el" href="fq_8h.html#a5cc7d7d7640cd0bbcb635e95be3ed8a3">fq.h</a>
+</li>
+<li>FqSerialize()
+: <a class="el" href="serialize_8h.html#a1fe8ff2aa7f73b807a7f5f5cdd8eba94">serialize.h</a>
+</li>
+<li>FqSet()
+: <a class="el" href="fq_8h.html#ab28f9df688a669a64dc04fa33f4cbb64">fq.h</a>
+</li>
+<li>FqSqrt()
+: <a class="el" href="fq_8h.html#a0cbded46e28a1e6f641c5c0ae37fd744">fq.h</a>
+</li>
+<li>FqSquare()
+: <a class="el" href="fq_8h.html#ab62c8f43f78a0c4f830c9ed65048b8f9">fq.h</a>
+</li>
+<li>FqSub()
+: <a class="el" href="fq_8h.html#a5148f610202ae759aafb197cb52137f1">fq.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
new file mode 100644
index 0000000..4167909
--- /dev/null
+++ b/doc/html/globals_func.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>BigNumAdd()
+: <a class="el" href="group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8">bignum.h</a>
+</li>
+<li>BigNumDiv()
+: <a class="el" href="group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573">bignum.h</a>
+</li>
+<li>BigNumIsEven()
+: <a class="el" href="group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084">bignum.h</a>
+</li>
+<li>BigNumIsZero()
+: <a class="el" href="group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb">bignum.h</a>
+</li>
+<li>BigNumMod()
+: <a class="el" href="group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929">bignum.h</a>
+</li>
+<li>BigNumMul()
+: <a class="el" href="group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317">bignum.h</a>
+</li>
+<li>BigNumPow2N()
+: <a class="el" href="group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4">bignum.h</a>
+</li>
+<li>BigNumSub()
+: <a class="el" href="group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea">bignum.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_d.html b/doc/html/globals_func_d.html
new file mode 100644
index 0000000..d26b905
--- /dev/null
+++ b/doc/html/globals_func_d.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_d.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>DeleteBigNum()
+: <a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03">bignum.h</a>
+</li>
+<li>DeleteEcGroup()
+: <a class="el" href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea">ecgroup.h</a>
+</li>
+<li>DeleteEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7">ecgroup.h</a>
+</li>
+<li>DeleteEpid11PairingState()
+: <a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758">tatepairing.h</a>
+</li>
+<li>DeleteFfElement()
+: <a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e">finitefield.h</a>
+</li>
+<li>DeleteFiniteField()
+: <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f">finitefield.h</a>
+</li>
+<li>DeletePairingState()
+: <a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d">pairing.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_e.html b/doc/html/globals_func_e.html
new file mode 100644
index 0000000..3e02353
--- /dev/null
+++ b/doc/html/globals_func_e.html
@@ -0,0 +1,418 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_e.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>EcdsaSignBuffer()
+: <a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a">ecdsa.h</a>
+</li>
+<li>EcdsaVerifyBuffer()
+: <a class="el" href="group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0">ecdsa.h</a>
+</li>
+<li>EcExp()
+: <a class="el" href="group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270">ecgroup.h</a>
+</li>
+<li>EcGetRandom()
+: <a class="el" href="group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196">ecgroup.h</a>
+</li>
+<li>EcHash()
+: <a class="el" href="group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c">ecgroup.h</a>
+</li>
+<li>EcInGroup()
+: <a class="el" href="group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921">ecgroup.h</a>
+</li>
+<li>EcInverse()
+: <a class="el" href="group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466">ecgroup.h</a>
+</li>
+<li>EcIsEqual()
+: <a class="el" href="group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061">ecgroup.h</a>
+</li>
+<li>EcIsIdentity()
+: <a class="el" href="group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210">ecgroup.h</a>
+</li>
+<li>EcMakePoint()
+: <a class="el" href="group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e">ecgroup.h</a>
+</li>
+<li>EcMul()
+: <a class="el" href="group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96">ecgroup.h</a>
+</li>
+<li>EcMultiExp()
+: <a class="el" href="group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4">ecgroup.h</a>
+</li>
+<li>EcMultiExpBn()
+: <a class="el" href="group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a">ecgroup.h</a>
+</li>
+<li>EcSscmExp()
+: <a class="el" href="group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57">ecgroup.h</a>
+</li>
+<li>EcSscmMultiExp()
+: <a class="el" href="group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4">ecgroup.h</a>
+</li>
+<li>EFq2Add()
+: <a class="el" href="efq2_8h.html#a6cbfb24b20b29b2e678e259aa6c0e2db">efq2.h</a>
+</li>
+<li>EFq2Dbl()
+: <a class="el" href="efq2_8h.html#a1db50d99360ed019ca4dcd2f9bcf210a">efq2.h</a>
+</li>
+<li>EFq2Deserialize()
+: <a class="el" href="serialize_8h.html#a393c9cf42edef41aa28449a0d321a57e">serialize.h</a>
+</li>
+<li>EFq2Eq()
+: <a class="el" href="efq2_8h.html#a2064ea9b48565a164314da4b487aaabd">efq2.h</a>
+</li>
+<li>EFq2FromAffine()
+: <a class="el" href="efq2_8h.html#af1da3e171d605db6f5ea0a70dc01ac27">efq2.h</a>
+</li>
+<li>EFq2IsInf()
+: <a class="el" href="efq2_8h.html#a9181b09474d800c65fd89aee2c28ebab">efq2.h</a>
+</li>
+<li>EFq2MulSSCM()
+: <a class="el" href="efq2_8h.html#a3ad678e3701e1211fa01ddc54f2bc5e4">efq2.h</a>
+</li>
+<li>EFq2Neg()
+: <a class="el" href="efq2_8h.html#a977bd074ed0dec943ad0cf19a01c0cf7">efq2.h</a>
+</li>
+<li>EFq2OnCurve()
+: <a class="el" href="efq2_8h.html#a26c35eefbd1ee11a5d078c44d295ff5a">efq2.h</a>
+</li>
+<li>EFq2Serialize()
+: <a class="el" href="serialize_8h.html#aa53e1c30fa109e586fa90a3a4cf3d0ac">serialize.h</a>
+</li>
+<li>EFq2ToAffine()
+: <a class="el" href="efq2_8h.html#a484e6af5efc2042d865999dac9489684">efq2.h</a>
+</li>
+<li>EFqAdd()
+: <a class="el" href="efq_8h.html#abf04f5ec866fc77d0203beb8a8991f25">efq.h</a>
+</li>
+<li>EFqAffineAdd()
+: <a class="el" href="efq_8h.html#a6cf130d65a5f35237a88046faad43c0a">efq.h</a>
+</li>
+<li>EFqAffineDbl()
+: <a class="el" href="efq_8h.html#a975f92abdaf431f2fb152fca84d468b3">efq.h</a>
+</li>
+<li>EFqAffineExp()
+: <a class="el" href="efq_8h.html#a8990ca0e19d8ed7b78958963e60948e2">efq.h</a>
+</li>
+<li>EFqAffineMultiExp()
+: <a class="el" href="efq_8h.html#a2618ae4b4fc8f2838a6550abfb4448ca">efq.h</a>
+</li>
+<li>EFqCondSet()
+: <a class="el" href="efq_8h.html#a9b2fcab6bc74601f9c302c5b34400ae4">efq.h</a>
+</li>
+<li>EFqCp()
+: <a class="el" href="efq_8h.html#a7a7863639a5b96d44522d579d7d32e40">efq.h</a>
+</li>
+<li>EFqDbl()
+: <a class="el" href="efq_8h.html#a23b6331263b002e6e07d2be5216fd6e8">efq.h</a>
+</li>
+<li>EFqDeserialize()
+: <a class="el" href="serialize_8h.html#af7f9b8ffdf1bb18bc156a4f80fc32419">serialize.h</a>
+</li>
+<li>EFqEq()
+: <a class="el" href="efq_8h.html#a7fbfe9d25cf08f4dcbd950cfb07471ff">efq.h</a>
+</li>
+<li>EFqEqAffine()
+: <a class="el" href="efq_8h.html#acfc458ea689ea3aa637c9c817dfa44c5">efq.h</a>
+</li>
+<li>EFqFromAffine()
+: <a class="el" href="efq_8h.html#a97ce025667b076986a6d92b3d41a7827">efq.h</a>
+</li>
+<li>EFqHash()
+: <a class="el" href="efq_8h.html#abf80ad8b8e3e506f4c46ec57de1c4846">efq.h</a>
+</li>
+<li>EFqInf()
+: <a class="el" href="efq_8h.html#a73fd77b7cc14c0decd95fd294b5b250c">efq.h</a>
+</li>
+<li>EFqIsInf()
+: <a class="el" href="efq_8h.html#ae38257cf97872a4fa855033ad44e2e10">efq.h</a>
+</li>
+<li>EFqJCp()
+: <a class="el" href="efq_8h.html#a1a31d069739c4da17011280a8ae6354a">efq.h</a>
+</li>
+<li>EFqJOnCurve()
+: <a class="el" href="efq_8h.html#ada751265a36ee3236fce90105a62909e">efq.h</a>
+</li>
+<li>EFqJRand()
+: <a class="el" href="efq_8h.html#a15bda5d411f7c6d602994e6444034414">efq.h</a>
+</li>
+<li>EFqMulSSCM()
+: <a class="el" href="efq_8h.html#a84e5231cee67eeba5b2a0f99088bc70e">efq.h</a>
+</li>
+<li>EFqMultiExp()
+: <a class="el" href="efq_8h.html#abbcd39b964e4fd685d1dba73ec110c86">efq.h</a>
+</li>
+<li>EFqNeg()
+: <a class="el" href="efq_8h.html#a0f7309ab07d4d3e0556a32f1839ae6fe">efq.h</a>
+</li>
+<li>EFqOnCurve()
+: <a class="el" href="efq_8h.html#a81470fed188d5043f89b6b8ab6031a42">efq.h</a>
+</li>
+<li>EFqRand()
+: <a class="el" href="efq_8h.html#a40588e2618ed9a38043532785a8d5785">efq.h</a>
+</li>
+<li>EFqSerialize()
+: <a class="el" href="serialize_8h.html#a81b7bcb69d6ea28ebb3e3520c7d0eeb5">serialize.h</a>
+</li>
+<li>EFqSet()
+: <a class="el" href="efq_8h.html#a7d1841f9e29bc604054536de7a4a861d">efq.h</a>
+</li>
+<li>EFqToAffine()
+: <a class="el" href="efq_8h.html#aaf3f26e855b85e869cb80fae780a4e6a">efq.h</a>
+</li>
+<li>Epid11AreSigsLinked()
+: <a class="el" href="group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7">api.h</a>
+</li>
+<li>Epid11CheckPrivRlEntry()
+: <a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929">api.h</a>
+</li>
+<li>Epid11EcHash()
+: <a class="el" href="group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82">ecgroup.h</a>
+</li>
+<li>Epid11NrVerify()
+: <a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813">api.h</a>
+</li>
+<li>Epid11Pairing()
+: <a class="el" href="group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059">tatepairing.h</a>
+</li>
+<li>Epid11ParseGroupPubKeyFile()
+: <a class="el" href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c">file_parser.h</a>
+</li>
+<li>Epid11ParseGroupRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3">file_parser.h</a>
+</li>
+<li>Epid11ParsePrivRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546">file_parser.h</a>
+</li>
+<li>Epid11ParseSigRlFile()
+: <a class="el" href="group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868">file_parser.h</a>
+</li>
+<li>Epid11VerifierCreate()
+: <a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8">api.h</a>
+</li>
+<li>Epid11VerifierDelete()
+: <a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1">api.h</a>
+</li>
+<li>Epid11VerifierSetBasename()
+: <a class="el" href="group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">api.h</a>
+</li>
+<li>Epid11VerifierSetGroupRl()
+: <a class="el" href="group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65">api.h</a>
+</li>
+<li>Epid11VerifierSetPrivRl()
+: <a class="el" href="group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14">api.h</a>
+</li>
+<li>Epid11VerifierSetSigRl()
+: <a class="el" href="group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8">api.h</a>
+</li>
+<li>Epid11VerifierWritePrecomp()
+: <a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c">api.h</a>
+</li>
+<li>Epid11Verify()
+: <a class="el" href="group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216">api.h</a>
+</li>
+<li>Epid11VerifyBasicSig()
+: <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070">api.h</a>
+</li>
+<li>EpidAddPreSigs()
+: <a class="el" href="group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78">api.h</a>
+</li>
+<li>EpidAreSigsLinked()
+: <a class="el" href="group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8">api.h</a>
+</li>
+<li>EpidBlacklistSig()
+: <a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69">api.h</a>
+</li>
+<li>EpidCheckPrivRlEntry()
+: <a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea">api.h</a>
+</li>
+<li>EpidClearRegisteredBasenames()
+: <a class="el" href="group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3">api.h</a>
+</li>
+<li>EpidCreateJoinRequest()
+: <a class="el" href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3">api.h</a>
+</li>
+<li>EpidDecompressPrivKey()
+: <a class="el" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">api.h</a>
+</li>
+<li>EpidGetNumPreSigs()
+: <a class="el" href="group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075">api.h</a>
+</li>
+<li>EpidGetSigSize()
+: <a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">api.h</a>
+</li>
+<li>EpidGetVerifierRlSize()
+: <a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f">api.h</a>
+</li>
+<li>EpidMemberCreate()
+: <a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">api.h</a>
+</li>
+<li>EpidMemberDeinit()
+: <a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">api.h</a>
+</li>
+<li>EpidMemberDelete()
+: <a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">api.h</a>
+</li>
+<li>EpidMemberGetSize()
+: <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">api.h</a>
+</li>
+<li>EpidMemberInit()
+: <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">api.h</a>
+</li>
+<li>EpidMemberSetHashAlg()
+: <a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">api.h</a>
+</li>
+<li>EpidMemberSetSigRl()
+: <a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">api.h</a>
+</li>
+<li>EpidMemberStartup()
+: <a class="el" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">api.h</a>
+</li>
+<li>EpidNrVerify()
+: <a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700">api.h</a>
+</li>
+<li>EpidParseFileHeader()
+: <a class="el" href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55">file_parser.h</a>
+</li>
+<li>EpidParseGroupPubKeyFile()
+: <a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">file_parser.h</a>
+</li>
+<li>EpidParseGroupRlFile()
+: <a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">file_parser.h</a>
+</li>
+<li>EpidParsePrivRlFile()
+: <a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">file_parser.h</a>
+</li>
+<li>EpidParseSigRlFile()
+: <a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">file_parser.h</a>
+</li>
+<li>EpidProvisionCompressed()
+: <a class="el" href="group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea">api.h</a>
+</li>
+<li>EpidProvisionCredential()
+: <a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">api.h</a>
+</li>
+<li>EpidProvisionKey()
+: <a class="el" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">api.h</a>
+</li>
+<li>EpidRegisterBasename()
+: <a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">api.h</a>
+</li>
+<li>EpidSign()
+: <a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">api.h</a>
+</li>
+<li>EpidStatusToString()
+: <a class="el" href="group___error_codes.html#ga59e8680ce52509302fd58a987e45004d">errors.h</a>
+</li>
+<li>EpidtoTpm2HashAlg()
+: <a class="el" href="conversion_8c.html#ad08628a6bf33154c1029a32e8b83325f">conversion.c</a>
+, <a class="el" href="conversion_8h.html#ad08628a6bf33154c1029a32e8b83325f">conversion.h</a>
+</li>
+<li>EpidVerifierCreate()
+: <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">api.h</a>
+</li>
+<li>EpidVerifierDelete()
+: <a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">api.h</a>
+</li>
+<li>EpidVerifierSetBasename()
+: <a class="el" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">api.h</a>
+</li>
+<li>EpidVerifierSetGroupRl()
+: <a class="el" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">api.h</a>
+</li>
+<li>EpidVerifierSetHashAlg()
+: <a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">api.h</a>
+</li>
+<li>EpidVerifierSetPrivRl()
+: <a class="el" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">api.h</a>
+</li>
+<li>EpidVerifierSetSigRl()
+: <a class="el" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">api.h</a>
+</li>
+<li>EpidVerifierSetVerifierRl()
+: <a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">api.h</a>
+</li>
+<li>EpidVerifierWritePrecomp()
+: <a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">api.h</a>
+</li>
+<li>EpidVerify()
+: <a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">api.h</a>
+</li>
+<li>EpidVerifyBasicSig()
+: <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">api.h</a>
+</li>
+<li>EpidWriteVerifierRl()
+: <a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81">api.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_f.html b/doc/html/globals_func_f.html
new file mode 100644
index 0000000..1448d26
--- /dev/null
+++ b/doc/html/globals_func_f.html
@@ -0,0 +1,366 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_f.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>FfAdd()
+: <a class="el" href="group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b">finitefield.h</a>
+</li>
+<li>FfExp()
+: <a class="el" href="group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c">finitefield.h</a>
+</li>
+<li>FfGetRandom()
+: <a class="el" href="group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8">finitefield.h</a>
+</li>
+<li>FfHash()
+: <a class="el" href="group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5">finitefield.h</a>
+</li>
+<li>FfInv()
+: <a class="el" href="group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a">finitefield.h</a>
+</li>
+<li>FfIsEqual()
+: <a class="el" href="group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625">finitefield.h</a>
+</li>
+<li>FfIsZero()
+: <a class="el" href="group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53">finitefield.h</a>
+</li>
+<li>FfMul()
+: <a class="el" href="group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5">finitefield.h</a>
+</li>
+<li>FfMultiExp()
+: <a class="el" href="group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3">finitefield.h</a>
+</li>
+<li>FfMultiExpBn()
+: <a class="el" href="group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144">finitefield.h</a>
+</li>
+<li>FfNeg()
+: <a class="el" href="group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2">finitefield.h</a>
+</li>
+<li>FfSqrt()
+: <a class="el" href="group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6">finitefield.h</a>
+</li>
+<li>FfSscmMultiExp()
+: <a class="el" href="group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634">finitefield.h</a>
+</li>
+<li>FfSub()
+: <a class="el" href="group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991">finitefield.h</a>
+</li>
+<li>FpAdd()
+: <a class="el" href="fp_8h.html#a55152abe8b866eba5a0c83cfb1bbe5f6">fp.h</a>
+</li>
+<li>FpClear()
+: <a class="el" href="fp_8h.html#adf010ec5710d4013e33efd7e5ba8f9ad">fp.h</a>
+</li>
+<li>FpDeserialize()
+: <a class="el" href="serialize_8h.html#ac49c8bd07a7f09aadd08c58c362cf3af">serialize.h</a>
+</li>
+<li>FpEq()
+: <a class="el" href="fp_8h.html#a7bb685bd810368d8077f638ffcab2554">fp.h</a>
+</li>
+<li>FpExp()
+: <a class="el" href="fp_8h.html#ab06b1b1a59f1138aa6c4d746ab707f86">fp.h</a>
+</li>
+<li>FpFromHash()
+: <a class="el" href="fp_8h.html#a472b0a9229b0eff0ca445f158efa1175">fp.h</a>
+</li>
+<li>FpInField()
+: <a class="el" href="fp_8h.html#ac2eab44a7aa9679d107667ffc035ee0a">fp.h</a>
+</li>
+<li>FpInv()
+: <a class="el" href="fp_8h.html#a9e7500fe8ee73592b002ed675d1758b3">fp.h</a>
+</li>
+<li>FpMul()
+: <a class="el" href="fp_8h.html#a9392597a6fe50e5c102ce21b8a1ae6c2">fp.h</a>
+</li>
+<li>FpNeg()
+: <a class="el" href="fp_8h.html#a0524fd074857712ea61ea5717ff54fd3">fp.h</a>
+</li>
+<li>FpRand()
+: <a class="el" href="fp_8h.html#a6c06b175fd82b5db555508f2d26713f8">fp.h</a>
+</li>
+<li>FpRandNonzero()
+: <a class="el" href="fp_8h.html#a54743809639797b4d4445c221291048b">fp.h</a>
+</li>
+<li>FpSerialize()
+: <a class="el" href="serialize_8h.html#a57237335a24f8a9b2a151a2141ec5917">serialize.h</a>
+</li>
+<li>FpSet()
+: <a class="el" href="fp_8h.html#a23bf42c7024a318970a6b60c02d9a08d">fp.h</a>
+</li>
+<li>FpSub()
+: <a class="el" href="fp_8h.html#aa9cc9f5e33bba75420b83cb2d49ca280">fp.h</a>
+</li>
+<li>Fq12Add()
+: <a class="el" href="fq12_8h.html#aa4a17bfa56644ab615c60bd7ec900821">fq12.h</a>
+</li>
+<li>Fq12Clear()
+: <a class="el" href="fq12_8h.html#aaeb34cf6f4d176674fc300d7e7fc57f1">fq12.h</a>
+</li>
+<li>Fq12Conj()
+: <a class="el" href="fq12_8h.html#a33a3bb0f378ac008cde38b88a39ea79c">fq12.h</a>
+</li>
+<li>Fq12Cp()
+: <a class="el" href="fq12_8h.html#ad739d6a59a3f7ed0c0117c7486d06290">fq12.h</a>
+</li>
+<li>Fq12Deserialize()
+: <a class="el" href="serialize_8h.html#a2f5ba336b7da938e92dad848e00ad157">serialize.h</a>
+</li>
+<li>Fq12Eq()
+: <a class="el" href="fq12_8h.html#a08b50a1f5fe19c78a19f1f4a457b9a39">fq12.h</a>
+</li>
+<li>Fq12Exp()
+: <a class="el" href="fq12_8h.html#a3bf52e5b01103632fa429927e5a07b1d">fq12.h</a>
+</li>
+<li>Fq12ExpCyc()
+: <a class="el" href="fq12_8h.html#a65ad8c0f4aa0859593aab885066c5025">fq12.h</a>
+</li>
+<li>Fq12Inv()
+: <a class="el" href="fq12_8h.html#afd089e0cb6e4ec68a3a3062f26d4430d">fq12.h</a>
+</li>
+<li>Fq12Mul()
+: <a class="el" href="fq12_8h.html#aec7e0ce55e01ab48c0c6315cb9e5b47d">fq12.h</a>
+</li>
+<li>Fq12MulSpecial()
+: <a class="el" href="fq12_8h.html#ac1b44bbceb1c648b2b880871c8b52195">fq12.h</a>
+</li>
+<li>Fq12MultiExp()
+: <a class="el" href="fq12_8h.html#ae88eb95c37c9db2e37e14d8a9304fadd">fq12.h</a>
+</li>
+<li>Fq12Neg()
+: <a class="el" href="fq12_8h.html#af3fd9055d559c592eb5715bb261c072b">fq12.h</a>
+</li>
+<li>Fq12Serialize()
+: <a class="el" href="serialize_8h.html#ad0de690fc04ff307fa64575f9033c4d7">serialize.h</a>
+</li>
+<li>Fq12Set()
+: <a class="el" href="fq12_8h.html#acd16f86f83021d44d25389ad9f701597">fq12.h</a>
+</li>
+<li>Fq12SqCyc()
+: <a class="el" href="fq12_8h.html#a1ad8710126bb4906d6170dd8ab30e43a">fq12.h</a>
+</li>
+<li>Fq12Square()
+: <a class="el" href="fq12_8h.html#a12e88a0bbfcc24b1863754f5e027d28e">fq12.h</a>
+</li>
+<li>Fq12Sub()
+: <a class="el" href="fq12_8h.html#a80c3da69a0991423a728e9b74a2dfe15">fq12.h</a>
+</li>
+<li>Fq2Add()
+: <a class="el" href="fq2_8h.html#afcaaf75460f36b85386cd1959b904f57">fq2.h</a>
+</li>
+<li>Fq2Clear()
+: <a class="el" href="fq2_8h.html#a59d3d8212ffd5bf75f9b6fd85b896654">fq2.h</a>
+</li>
+<li>Fq2CondSet()
+: <a class="el" href="fq2_8h.html#ad94b155025e7a11b9c5b60032fde4491">fq2.h</a>
+</li>
+<li>Fq2Conj()
+: <a class="el" href="fq2_8h.html#adc0d02ddec564ca86b0ef53d7ff79864">fq2.h</a>
+</li>
+<li>Fq2Cp()
+: <a class="el" href="fq2_8h.html#a6c67364f78e6946a7ad3af2c86baf1a5">fq2.h</a>
+</li>
+<li>Fq2Eq()
+: <a class="el" href="fq2_8h.html#a3dc330cff53539b51183c43085275f97">fq2.h</a>
+</li>
+<li>Fq2Exp()
+: <a class="el" href="fq2_8h.html#acecbff7a5a8cec15e24c47663957c05a">fq2.h</a>
+</li>
+<li>Fq2Inv()
+: <a class="el" href="fq2_8h.html#a756666161516fe541b26a4082f69343d">fq2.h</a>
+</li>
+<li>Fq2IsZero()
+: <a class="el" href="fq2_8h.html#a610c9d7c2afa63b1d48da30c684d6e27">fq2.h</a>
+</li>
+<li>Fq2Mul()
+: <a class="el" href="fq2_8h.html#a876f870f84cd8ab697176dbb42591565">fq2.h</a>
+</li>
+<li>Fq2MulScalar()
+: <a class="el" href="fq2_8h.html#af45903d791794faabedb00f760885e8c">fq2.h</a>
+</li>
+<li>Fq2MulXi()
+: <a class="el" href="fq2_8h.html#afeeb4e14ddf9f39f860661c599923c58">fq2.h</a>
+</li>
+<li>Fq2Neg()
+: <a class="el" href="fq2_8h.html#a5d523d5d6d4159c71f58945af82a7936">fq2.h</a>
+</li>
+<li>Fq2Set()
+: <a class="el" href="fq2_8h.html#a9165c1d2deef46ceb9af238928b2ec5c">fq2.h</a>
+</li>
+<li>Fq2Square()
+: <a class="el" href="fq2_8h.html#a3c6583dd519a3dd7efb26db5e9a59036">fq2.h</a>
+</li>
+<li>Fq2Sub()
+: <a class="el" href="fq2_8h.html#ae27a9400b5d8fbd0b720a449c60ad146">fq2.h</a>
+</li>
+<li>Fq6Add()
+: <a class="el" href="fq6_8h.html#a0607ab44e53c7a16f8e1b2746d250a7c">fq6.h</a>
+</li>
+<li>Fq6Clear()
+: <a class="el" href="fq6_8h.html#a7c77a862223f577e11e595332c9fb272">fq6.h</a>
+</li>
+<li>Fq6CondSet()
+: <a class="el" href="fq6_8h.html#aa0c82e905ee190ad2187b89e464466d4">fq6.h</a>
+</li>
+<li>Fq6Cp()
+: <a class="el" href="fq6_8h.html#a36bd769bc95b887f75bb60c2f7a45e17">fq6.h</a>
+</li>
+<li>Fq6Eq()
+: <a class="el" href="fq6_8h.html#aaf54d03c0afdb6eeced6ddad1237c2e4">fq6.h</a>
+</li>
+<li>Fq6Inv()
+: <a class="el" href="fq6_8h.html#a5f4708ca109578527afd8cda99acd6ee">fq6.h</a>
+</li>
+<li>Fq6IsZero()
+: <a class="el" href="fq6_8h.html#a634aab5dc04177587a22324352ff91e5">fq6.h</a>
+</li>
+<li>Fq6Mul()
+: <a class="el" href="fq6_8h.html#ad1e1cac423a2c3c69a4f3629d33faaf1">fq6.h</a>
+</li>
+<li>Fq6MulScalar()
+: <a class="el" href="fq6_8h.html#a701d89b5c73ba67a2f765d49f5d5ae4e">fq6.h</a>
+</li>
+<li>Fq6MulV()
+: <a class="el" href="fq6_8h.html#ad30bd276a4e2e9df3613072c38ec13ae">fq6.h</a>
+</li>
+<li>Fq6Neg()
+: <a class="el" href="fq6_8h.html#a9a5ddbf8f16b48030209b172079d22a6">fq6.h</a>
+</li>
+<li>Fq6Set()
+: <a class="el" href="fq6_8h.html#a06b8c3988c3782fda22c9ffb47b5180b">fq6.h</a>
+</li>
+<li>Fq6Square()
+: <a class="el" href="fq6_8h.html#a58e5b68a86b776d82ade8307046e2375">fq6.h</a>
+</li>
+<li>Fq6Sub()
+: <a class="el" href="fq6_8h.html#a87d07ab842862a482410a838516ad0c7">fq6.h</a>
+</li>
+<li>FqAdd()
+: <a class="el" href="fq_8h.html#ab52f69c761454d976c3fc56a26549419">fq.h</a>
+</li>
+<li>FqClear()
+: <a class="el" href="fq_8h.html#ac85eb642d3b3973477749769e04d45af">fq.h</a>
+</li>
+<li>FqCondSet()
+: <a class="el" href="fq_8h.html#afbb0976ef343b14c66305db0a48647ca">fq.h</a>
+</li>
+<li>FqCp()
+: <a class="el" href="fq_8h.html#a17133e5b777baa8c745b7dfcf1c8ad8d">fq.h</a>
+</li>
+<li>FqDeserialize()
+: <a class="el" href="serialize_8h.html#a051985a737e59da22d04dfcc5112ec77">serialize.h</a>
+</li>
+<li>FqEq()
+: <a class="el" href="fq_8h.html#abd40d255e0094f7156092db44a3b90fa">fq.h</a>
+</li>
+<li>FqExp()
+: <a class="el" href="fq_8h.html#a276d3747aefdac5503982f2aa5eccbf8">fq.h</a>
+</li>
+<li>FqFromHash()
+: <a class="el" href="fq_8h.html#a7794f72bcc506f8d8a60dbfae1a70ed0">fq.h</a>
+</li>
+<li>FqInField()
+: <a class="el" href="fq_8h.html#aceb37a8f5538fe9ca682058ff0e36091">fq.h</a>
+</li>
+<li>FqInv()
+: <a class="el" href="fq_8h.html#a7b60a8996973d474d2fb7a31838c6d8c">fq.h</a>
+</li>
+<li>FqIsZero()
+: <a class="el" href="fq_8h.html#ac08ca8c781cd18cbadabbeeb85722e49">fq.h</a>
+</li>
+<li>FqMul()
+: <a class="el" href="fq_8h.html#ab0bf77a97fb3a12292886bef3abcf9bd">fq.h</a>
+</li>
+<li>FqNeg()
+: <a class="el" href="fq_8h.html#ae8379530cca959e7e36446b2979d8af4">fq.h</a>
+</li>
+<li>FqRand()
+: <a class="el" href="fq_8h.html#a5cc7d7d7640cd0bbcb635e95be3ed8a3">fq.h</a>
+</li>
+<li>FqSerialize()
+: <a class="el" href="serialize_8h.html#a1fe8ff2aa7f73b807a7f5f5cdd8eba94">serialize.h</a>
+</li>
+<li>FqSet()
+: <a class="el" href="fq_8h.html#ab28f9df688a669a64dc04fa33f4cbb64">fq.h</a>
+</li>
+<li>FqSqrt()
+: <a class="el" href="fq_8h.html#a0cbded46e28a1e6f641c5c0ae37fd744">fq.h</a>
+</li>
+<li>FqSquare()
+: <a class="el" href="fq_8h.html#ab62c8f43f78a0c4f830c9ed65048b8f9">fq.h</a>
+</li>
+<li>FqSub()
+: <a class="el" href="fq_8h.html#a5148f610202ae759aafb197cb52137f1">fq.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_i.html b/doc/html/globals_func_i.html
new file mode 100644
index 0000000..7ce49c2
--- /dev/null
+++ b/doc/html/globals_func_i.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_i.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>InitFfElementFromBn()
+: <a class="el" href="group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed">finitefield.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_m.html b/doc/html/globals_func_m.html
new file mode 100644
index 0000000..79bbb51
--- /dev/null
+++ b/doc/html/globals_func_m.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_m.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>memcmp()
+: <a class="el" href="tiny__stdlib_8h.html#a1e7d61eb280250fb55dce370ba1a1709">tiny_stdlib.h</a>
+</li>
+<li>memset()
+: <a class="el" href="tiny__stdlib_8h.html#a4cb469bec7b722064b97a406346acb61">tiny_stdlib.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_n.html b/doc/html/globals_func_n.html
new file mode 100644
index 0000000..5177de1
--- /dev/null
+++ b/doc/html/globals_func_n.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_n.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>NewBigNum()
+: <a class="el" href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed">bignum.h</a>
+</li>
+<li>NewEcGroup()
+: <a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62">ecgroup.h</a>
+</li>
+<li>NewEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb">ecgroup.h</a>
+</li>
+<li>NewEpid11PairingState()
+: <a class="el" href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e">tatepairing.h</a>
+</li>
+<li>NewFfElement()
+: <a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c">finitefield.h</a>
+</li>
+<li>NewFiniteField()
+: <a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c">finitefield.h</a>
+</li>
+<li>NewFiniteFieldViaBinomalExtension()
+: <a class="el" href="group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2">finitefield.h</a>
+</li>
+<li>NewFiniteFieldViaPolynomialExtension()
+: <a class="el" href="group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598">finitefield.h</a>
+</li>
+<li>NewPairingState()
+: <a class="el" href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc">pairing.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_p.html b/doc/html/globals_func_p.html
new file mode 100644
index 0000000..7e272e9
--- /dev/null
+++ b/doc/html/globals_func_p.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_p.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>Pairing()
+: <a class="el" href="group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d">pairing.h</a>
+</li>
+<li>PairingCompute()
+: <a class="el" href="member_2tiny_2math_2pairing_8h.html#a74dabfd47d20d4086a89e1910ca27fe0">pairing.h</a>
+</li>
+<li>PairingInit()
+: <a class="el" href="member_2tiny_2math_2pairing_8h.html#aba03ba485b970dd2d3f30b1f74f6ed6f">pairing.h</a>
+</li>
+<li>print_tpm2_response_code()
+: <a class="el" href="printtss_8c.html#ac02d185169caec44119e82d97228a68a">printtss.c</a>
+, <a class="el" href="printtss_8h.html#ac02d185169caec44119e82d97228a68a">printtss.h</a>
+</li>
+<li>PrintBigNum()
+: <a class="el" href="group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a">printutils.h</a>
+</li>
+<li>PrintBigNumStr()
+: <a class="el" href="group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d">printutils.h</a>
+</li>
+<li>PrintEcPoint()
+: <a class="el" href="group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca">printutils.h</a>
+</li>
+<li>PrintFfElement()
+: <a class="el" href="group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf">printutils.h</a>
+</li>
+<li>PrintFpElemStr()
+: <a class="el" href="group___epid_print.html#gae553c3a156a0e4968b89635ab0757580">printutils.h</a>
+</li>
+<li>PrintFq12ElemStr()
+: <a class="el" href="group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f">printutils.h</a>
+</li>
+<li>PrintFq2ElemStr()
+: <a class="el" href="group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de">printutils.h</a>
+</li>
+<li>PrintFq6ElemStr()
+: <a class="el" href="group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476">printutils.h</a>
+</li>
+<li>PrintFqElemStr()
+: <a class="el" href="group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4">printutils.h</a>
+</li>
+<li>PrintG1ElemStr()
+: <a class="el" href="group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f">printutils.h</a>
+</li>
+<li>PrintG2ElemStr()
+: <a class="el" href="group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a">printutils.h</a>
+</li>
+<li>PrintGtElemStr()
+: <a class="el" href="group___epid_print.html#ga138cd388247a58680d4701d59d6976d2">printutils.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_r.html b/doc/html/globals_func_r.html
new file mode 100644
index 0000000..06be06c
--- /dev/null
+++ b/doc/html/globals_func_r.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_r.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>ReadBigNum()
+: <a class="el" href="group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe">bignum.h</a>
+</li>
+<li>ReadEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb">ecgroup.h</a>
+</li>
+<li>ReadFfElement()
+: <a class="el" href="group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f">finitefield.h</a>
+</li>
+<li>ReadTpm2EcPoint()
+: <a class="el" href="conversion_8h.html#acff82e14f6287ec2d4676a3f8cd38a57">conversion.h</a>
+, <a class="el" href="conversion_8c.html#acff82e14f6287ec2d4676a3f8cd38a57">conversion.c</a>
+</li>
+<li>ReadTpm2FfElement()
+: <a class="el" href="conversion_8c.html#a8243faa9ef46d90b936c7dace421e10e">conversion.c</a>
+, <a class="el" href="conversion_8h.html#a8243faa9ef46d90b936c7dace421e10e">conversion.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_s.html b/doc/html/globals_func_s.html
new file mode 100644
index 0000000..51e0831
--- /dev/null
+++ b/doc/html/globals_func_s.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_s.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>Sha256MessageDigest()
+: <a class="el" href="group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c">hash.h</a>
+</li>
+<li>SwapNativeAndPortableLayout()
+: <a class="el" href="serialize_8h.html#a6789f8e258de2efc616c2f3109b7992b">serialize.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_t.html b/doc/html/globals_func_t.html
new file mode 100644
index 0000000..0d73af6
--- /dev/null
+++ b/doc/html/globals_func_t.html
@@ -0,0 +1,171 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_t.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tc_sha256_final()
+: <a class="el" href="sha256_8h.html#a8013bed3e0b388ec654f991b45c00bbf">sha256.h</a>
+</li>
+<li>tc_sha256_init()
+: <a class="el" href="sha256_8h.html#a05aad282287c226a9ab8a2eb65d10d1b">sha256.h</a>
+</li>
+<li>tc_sha256_update()
+: <a class="el" href="sha256_8h.html#ab42ecba529c48040c34e70cee8d98096">sha256.h</a>
+</li>
+<li>tinysha512_final()
+: <a class="el" href="sha512_8h.html#ace9440a26ec431a1596f40284cc8d5ee">sha512.h</a>
+</li>
+<li>tinysha512_init()
+: <a class="el" href="sha512_8h.html#a3cf87b13e209264d7aba7d708560dfde">sha512.h</a>
+</li>
+<li>tinysha512_update()
+: <a class="el" href="sha512_8h.html#a47108f5097342900a4a07f52b6204082">sha512.h</a>
+</li>
+<li>tinysha_digest_size()
+: <a class="el" href="hashwrap_8h.html#a6e07fd5b18355546d72dd09eae343c6a">hashwrap.h</a>
+</li>
+<li>tinysha_final()
+: <a class="el" href="hashwrap_8h.html#a22b9a3e01537f4f5d89e608c8b7956f6">hashwrap.h</a>
+</li>
+<li>tinysha_init()
+: <a class="el" href="hashwrap_8h.html#ab168fa663e74cc973af7e79d384df8b0">hashwrap.h</a>
+</li>
+<li>tinysha_update()
+: <a class="el" href="hashwrap_8h.html#a9844075a9ccf12e56f6a07d86b49c98d">hashwrap.h</a>
+</li>
+<li>Tpm2Commit()
+: <a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">commit.h</a>
+, <a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">commit.c</a>
+</li>
+<li>Tpm2CreateContext()
+: <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">context.c</a>
+</li>
+<li>Tpm2CreatePrimary()
+: <a class="el" href="createprimary_8c.html#a01df38cbb1c7c7986dadefcc1295bb9e">createprimary.c</a>
+, <a class="el" href="createprimary_8h.html#a01df38cbb1c7c7986dadefcc1295bb9e">createprimary.h</a>
+</li>
+<li>Tpm2DeleteContext()
+: <a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">context.c</a>
+</li>
+<li>Tpm2FlushKey()
+: <a class="el" href="context_8c.html#a7f547c0068dc63f0a6b76ad15b1b9675">context.c</a>
+</li>
+<li>Tpm2GetRandom()
+: <a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">getrandom.h</a>
+, <a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">getrandom.c</a>
+</li>
+<li>Tpm2LoadExternal()
+: <a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">load_external.h</a>
+, <a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">load_external.c</a>
+</li>
+<li>Tpm2NvDefineSpace()
+: <a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">nv.c</a>
+, <a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">nv.h</a>
+</li>
+<li>Tpm2NvRead()
+: <a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">nv.h</a>
+, <a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">nv.c</a>
+</li>
+<li>Tpm2NvUndefineSpace()
+: <a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">nv.h</a>
+, <a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">nv.c</a>
+</li>
+<li>Tpm2NvWrite()
+: <a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">nv.h</a>
+, <a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">nv.c</a>
+</li>
+<li>Tpm2ReleaseCounter()
+: <a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">sign.c</a>
+, <a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">sign.h</a>
+</li>
+<li>Tpm2ResetContext()
+: <a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">context.c</a>
+, <a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">context.h</a>
+</li>
+<li>Tpm2SetHashAlg()
+: <a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">context.c</a>
+</li>
+<li>Tpm2Sign()
+: <a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">sign.h</a>
+, <a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">sign.c</a>
+</li>
+<li>Tpm2toEpidHashAlg()
+: <a class="el" href="conversion_8c.html#a51507a6be8d7dfa167c9e6fb70e5ee57">conversion.c</a>
+, <a class="el" href="conversion_8h.html#a51507a6be8d7dfa167c9e6fb70e5ee57">conversion.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_u.html b/doc/html/globals_func_u.html
new file mode 100644
index 0000000..4104806
--- /dev/null
+++ b/doc/html/globals_func_u.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_u.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>Uint32Deserialize()
+: <a class="el" href="serialize_8h.html#a2aaa1779f9085d62b27e072271329dd7">serialize.h</a>
+</li>
+<li>Uint32Serialize()
+: <a class="el" href="serialize_8h.html#ac74344e39b6d285c6a0258c4554712b0">serialize.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_v.html b/doc/html/globals_func_v.html
new file mode 100644
index 0000000..0b13794
--- /dev/null
+++ b/doc/html/globals_func_v.html
@@ -0,0 +1,138 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_v.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>VliAdd()
+: <a class="el" href="vli_8h.html#a566cfdc23f1c35230891d53139850032">vli.h</a>
+</li>
+<li>VliClear()
+: <a class="el" href="vli_8h.html#ad1e2e5fe5fc466eff75dbe70fba3169f">vli.h</a>
+</li>
+<li>VliCmp()
+: <a class="el" href="vli_8h.html#a1f6ded73c6bb3dc340efd2a8978f8d7a">vli.h</a>
+</li>
+<li>VliCondSet()
+: <a class="el" href="vli_8h.html#a426db811cf4ee822bd4b6863f2e51d8c">vli.h</a>
+</li>
+<li>VliDeserialize()
+: <a class="el" href="serialize_8h.html#a7950febe703ea62457664eadc1e4eed9">serialize.h</a>
+</li>
+<li>VliIsZero()
+: <a class="el" href="vli_8h.html#a8f6a41541103b1bde8428ea7f4b816fa">vli.h</a>
+</li>
+<li>VliModAdd()
+: <a class="el" href="vli_8h.html#a6373f1d28198a0f34f220bfcc2ecf040">vli.h</a>
+</li>
+<li>VliModBarrett()
+: <a class="el" href="vli_8h.html#a5280e583a19e61ad815b02906c082033">vli.h</a>
+</li>
+<li>VliModExp()
+: <a class="el" href="vli_8h.html#aa1f2257e949c0c4f26b24aec95e01452">vli.h</a>
+</li>
+<li>VliModInv()
+: <a class="el" href="vli_8h.html#a3d4ee194f13293e61bddf243e4241b4c">vli.h</a>
+</li>
+<li>VliModMul()
+: <a class="el" href="vli_8h.html#a112a5d4118e101ec539e9669ebd4fdf9">vli.h</a>
+</li>
+<li>VliModSquare()
+: <a class="el" href="vli_8h.html#accf6070832e479e01c1268b0414645b9">vli.h</a>
+</li>
+<li>VliModSub()
+: <a class="el" href="vli_8h.html#aa53a875972ac2f10852fcaca92de2b40">vli.h</a>
+</li>
+<li>VliMul()
+: <a class="el" href="vli_8h.html#ab6d63a825df6f224fe37c76b6bb67bcf">vli.h</a>
+</li>
+<li>VliRand()
+: <a class="el" href="vli_8h.html#a10fc791278e51543fc685d5a4903fcd1">vli.h</a>
+</li>
+<li>VliRShift()
+: <a class="el" href="vli_8h.html#a4c7e60c47b82e5b2cf823d51b3a9fdcc">vli.h</a>
+</li>
+<li>VliSerialize()
+: <a class="el" href="serialize_8h.html#af2841bf57731c82f8164900bf3f52320">serialize.h</a>
+</li>
+<li>VliSet()
+: <a class="el" href="vli_8h.html#a9a1df0e7770aa1421e41b87965e71425">vli.h</a>
+</li>
+<li>VliSub()
+: <a class="el" href="vli_8h.html#ac47d57834c67877c10ecdc230cdaf503">vli.h</a>
+</li>
+<li>VliTestBit()
+: <a class="el" href="vli_8h.html#a80d1a80f5a21437354ee185923621d66">vli.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_func_w.html b/doc/html/globals_func_w.html
new file mode 100644
index 0000000..f3d166c
--- /dev/null
+++ b/doc/html/globals_func_w.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_func_w.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>WriteBigNum()
+: <a class="el" href="group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f">bignum.h</a>
+</li>
+<li>WriteEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb">ecgroup.h</a>
+</li>
+<li>WriteFfElement()
+: <a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f">finitefield.h</a>
+</li>
+<li>WriteTpm2EcPoint()
+: <a class="el" href="conversion_8h.html#a15e859e04c4b9c32a0970565846bdba3">conversion.h</a>
+, <a class="el" href="conversion_8c.html#a15e859e04c4b9c32a0970565846bdba3">conversion.c</a>
+</li>
+<li>WriteTpm2FfElement()
+: <a class="el" href="conversion_8c.html#a9f6a2b44857c038a2f90c12959640dea">conversion.c</a>
+, <a class="el" href="conversion_8h.html#a9f6a2b44857c038a2f90c12959640dea">conversion.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_g.html b/doc/html/globals_g.html
new file mode 100644
index 0000000..4d4edff
--- /dev/null
+++ b/doc/html/globals_g.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_g.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>GroupId
+: <a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">types.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_h.html b/doc/html/globals_h.html
new file mode 100644
index 0000000..1c1f0a6
--- /dev/null
+++ b/doc/html/globals_h.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>HashAlg
+: <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">types.h</a>
+</li>
+<li>htobe32
+: <a class="el" href="endian_8h.html#ab004b68a63ea32dcd67fbe597263120b">endian.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_i.html b/doc/html/globals_i.html
new file mode 100644
index 0000000..e530175
--- /dev/null
+++ b/doc/html/globals_i.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_i.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>InitFfElementFromBn()
+: <a class="el" href="group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed">finitefield.h</a>
+</li>
+<li>is_context_already_created
+: <a class="el" href="context_8c.html#a8e9ae8d68d53b7549da3823bc65a336e">context.c</a>
+</li>
+<li>IssuerNonce
+: <a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">types.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_k.html b/doc/html/globals_k.html
new file mode 100644
index 0000000..54d64bb
--- /dev/null
+++ b/doc/html/globals_k.html
@@ -0,0 +1,216 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_k.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>kEpid1x
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc">file_parser.h</a>
+</li>
+<li>kEpid2x
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2">file_parser.h</a>
+</li>
+<li>kEpidBadArgErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">errors.h</a>
+</li>
+<li>kEpidDivByZeroErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3">errors.h</a>
+</li>
+<li>kEpidDuplicateErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f">errors.h</a>
+</li>
+<li>kEpidErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">errors.h</a>
+</li>
+<li>kEpidFileTypeCode
+: <a class="el" href="group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33">file_parser.h</a>
+</li>
+<li>kEpidHashAlgorithmNotSupported
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4">errors.h</a>
+</li>
+<li>kEpidInconsistentBasenameSetErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df">errors.h</a>
+</li>
+<li>kEpidMathErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6">errors.h</a>
+</li>
+<li>kEpidMathQuadraticNonResidueError
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129">errors.h</a>
+</li>
+<li>kEpidMemAllocErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">errors.h</a>
+</li>
+<li>kEpidNoErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">errors.h</a>
+</li>
+<li>kEpidNoMemErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c">errors.h</a>
+</li>
+<li>kEpidNotImpl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7">errors.h</a>
+</li>
+<li>kEpidOutOfSequenceError
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43">errors.h</a>
+</li>
+<li>kEpidRandMaxIterErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357">errors.h</a>
+</li>
+<li>kEpidSigInvalid
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">errors.h</a>
+</li>
+<li>kEpidSigRevokedInGroupRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5">errors.h</a>
+</li>
+<li>kEpidSigRevokedInPrivRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1">errors.h</a>
+</li>
+<li>kEpidSigRevokedInSigRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c">errors.h</a>
+</li>
+<li>kEpidSigRevokedInVerifierRl
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298">errors.h</a>
+</li>
+<li>kEpidSigValid
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e">errors.h</a>
+</li>
+<li>kEpidUnderflowErr
+: <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec">errors.h</a>
+</li>
+<li>kEpidVersionCode
+: <a class="el" href="group___file_parser.html#gaae808987ce82188dff42baa4e43cab82">file_parser.h</a>
+</li>
+<li>kGroupPubKeyFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e">file_parser.h</a>
+</li>
+<li>kGroupRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770">file_parser.h</a>
+</li>
+<li>kGroupRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c">file_parser.h</a>
+</li>
+<li>kInvalidHashAlg
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb">types.h</a>
+</li>
+<li>kIssuingCaPubKeyFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92">file_parser.h</a>
+</li>
+<li>kNumEpidVersions
+: <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">file_parser.h</a>
+</li>
+<li>kNumFileTypes
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">file_parser.h</a>
+</li>
+<li>kPrintUtilAnnotated
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d">printutils.h</a>
+</li>
+<li>kPrintUtilFormatCount
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a">printutils.h</a>
+</li>
+<li>kPrintUtilUnannotated
+: <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae">printutils.h</a>
+</li>
+<li>kPrivRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322">file_parser.h</a>
+</li>
+<li>kPrivRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911">file_parser.h</a>
+</li>
+<li>kSha256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d">types.h</a>
+</li>
+<li>kSha384
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290">types.h</a>
+</li>
+<li>kSha3_256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85">types.h</a>
+</li>
+<li>kSha3_384
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86">types.h</a>
+</li>
+<li>kSha3_512
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee">types.h</a>
+</li>
+<li>kSha512
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055">types.h</a>
+</li>
+<li>kSha512_256
+: <a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba">types.h</a>
+</li>
+<li>kSigRlFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710">file_parser.h</a>
+</li>
+<li>kSigRlRequestFile
+: <a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600">file_parser.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_m.html b/doc/html/globals_m.html
new file mode 100644
index 0000000..52e18f8
--- /dev/null
+++ b/doc/html/globals_m.html
@@ -0,0 +1,93 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_m.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>MATH_FAIL
+: <a class="el" href="mathdefs_8h.html#a1a994bd1e283835646241e53b6728cee">mathdefs.h</a>
+</li>
+<li>MATH_SUCCESS
+: <a class="el" href="mathdefs_8h.html#a352e5652c4f35088eba5f769a5d7993f">mathdefs.h</a>
+</li>
+<li>MemberCtx
+: <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">api.h</a>
+</li>
+<li>memcmp()
+: <a class="el" href="tiny__stdlib_8h.html#a1e7d61eb280250fb55dce370ba1a1709">tiny_stdlib.h</a>
+</li>
+<li>memset()
+: <a class="el" href="tiny__stdlib_8h.html#a4cb469bec7b722064b97a406346acb61">tiny_stdlib.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_n.html b/doc/html/globals_n.html
new file mode 100644
index 0000000..1ca020c
--- /dev/null
+++ b/doc/html/globals_n.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_n.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>NewBigNum()
+: <a class="el" href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed">bignum.h</a>
+</li>
+<li>NewEcGroup()
+: <a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62">ecgroup.h</a>
+</li>
+<li>NewEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb">ecgroup.h</a>
+</li>
+<li>NewEpid11PairingState()
+: <a class="el" href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e">tatepairing.h</a>
+</li>
+<li>NewFfElement()
+: <a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c">finitefield.h</a>
+</li>
+<li>NewFiniteField()
+: <a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c">finitefield.h</a>
+</li>
+<li>NewFiniteFieldViaBinomalExtension()
+: <a class="el" href="group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2">finitefield.h</a>
+</li>
+<li>NewFiniteFieldViaPolynomialExtension()
+: <a class="el" href="group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598">finitefield.h</a>
+</li>
+<li>NewPairingState()
+: <a class="el" href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc">pairing.h</a>
+</li>
+<li>NUM_ECC_DIGITS
+: <a class="el" href="mathtypes_8h.html#a94d0ffa1ccb9d2f09d1ada23a5807021">mathtypes.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_o.html b/doc/html/globals_o.html
new file mode 100644
index 0000000..3f55aa7
--- /dev/null
+++ b/doc/html/globals_o.html
@@ -0,0 +1,81 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_o.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>OctStr
+: <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">types.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_p.html b/doc/html/globals_p.html
new file mode 100644
index 0000000..1a5c623
--- /dev/null
+++ b/doc/html/globals_p.html
@@ -0,0 +1,130 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_p.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>Pairing()
+: <a class="el" href="group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d">pairing.h</a>
+</li>
+<li>PairingCompute()
+: <a class="el" href="member_2tiny_2math_2pairing_8h.html#a74dabfd47d20d4086a89e1910ca27fe0">pairing.h</a>
+</li>
+<li>PairingInit()
+: <a class="el" href="member_2tiny_2math_2pairing_8h.html#aba03ba485b970dd2d3f30b1f74f6ed6f">pairing.h</a>
+</li>
+<li>print_tpm2_response_code()
+: <a class="el" href="printtss_8c.html#ac02d185169caec44119e82d97228a68a">printtss.c</a>
+, <a class="el" href="printtss_8h.html#ac02d185169caec44119e82d97228a68a">printtss.h</a>
+</li>
+<li>PrintBigNum()
+: <a class="el" href="group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a">printutils.h</a>
+</li>
+<li>PrintBigNumStr()
+: <a class="el" href="group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d">printutils.h</a>
+</li>
+<li>PrintEcPoint()
+: <a class="el" href="group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca">printutils.h</a>
+</li>
+<li>PrintFfElement()
+: <a class="el" href="group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf">printutils.h</a>
+</li>
+<li>PrintFpElemStr()
+: <a class="el" href="group___epid_print.html#gae553c3a156a0e4968b89635ab0757580">printutils.h</a>
+</li>
+<li>PrintFq12ElemStr()
+: <a class="el" href="group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f">printutils.h</a>
+</li>
+<li>PrintFq2ElemStr()
+: <a class="el" href="group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de">printutils.h</a>
+</li>
+<li>PrintFq6ElemStr()
+: <a class="el" href="group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476">printutils.h</a>
+</li>
+<li>PrintFqElemStr()
+: <a class="el" href="group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4">printutils.h</a>
+</li>
+<li>PrintG1ElemStr()
+: <a class="el" href="group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f">printutils.h</a>
+</li>
+<li>PrintG2ElemStr()
+: <a class="el" href="group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a">printutils.h</a>
+</li>
+<li>PrintGtElemStr()
+: <a class="el" href="group___epid_print.html#ga138cd388247a58680d4701d59d6976d2">printutils.h</a>
+</li>
+<li>PrintUtilFormat
+: <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">printutils.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_r.html b/doc/html/globals_r.html
new file mode 100644
index 0000000..af21993
--- /dev/null
+++ b/doc/html/globals_r.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_r.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>ReadBigNum()
+: <a class="el" href="group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe">bignum.h</a>
+</li>
+<li>ReadEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb">ecgroup.h</a>
+</li>
+<li>ReadFfElement()
+: <a class="el" href="group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f">finitefield.h</a>
+</li>
+<li>ReadTpm2EcPoint()
+: <a class="el" href="conversion_8c.html#acff82e14f6287ec2d4676a3f8cd38a57">conversion.c</a>
+, <a class="el" href="conversion_8h.html#acff82e14f6287ec2d4676a3f8cd38a57">conversion.h</a>
+</li>
+<li>ReadTpm2FfElement()
+: <a class="el" href="conversion_8c.html#a8243faa9ef46d90b936c7dace421e10e">conversion.c</a>
+, <a class="el" href="conversion_8h.html#a8243faa9ef46d90b936c7dace421e10e">conversion.h</a>
+</li>
+<li>ReKeySeed
+: <a class="el" href="group___epid_types.html#ga54bd22670f2e348593db7ab631131d10">types.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_s.html b/doc/html/globals_s.html
new file mode 100644
index 0000000..830344b
--- /dev/null
+++ b/doc/html/globals_s.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_s.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>Seed
+: <a class="el" href="group___epid_types.html#ga888541b8148df69c634a92c64ed51317">types.h</a>
+</li>
+<li>SHA256_BLOCK_SIZE
+: <a class="el" href="sha256_8h.html#a9c1fe69ad43d4ca74b84303a0ed64f2f">sha256.h</a>
+</li>
+<li>SHA256_DIGEST_SIZE
+: <a class="el" href="sha256_8h.html#a81efbc0fc101b06a914f7ff9e2fbc0e9">sha256.h</a>
+</li>
+<li>SHA256_STATE_BLOCKS
+: <a class="el" href="sha256_8h.html#a0558ee82699b60132c23e0a049ab7a56">sha256.h</a>
+</li>
+<li>Sha256MessageDigest()
+: <a class="el" href="group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c">hash.h</a>
+</li>
+<li>SHA512_BLOCK_SIZE
+: <a class="el" href="sha512_8h.html#ac7071364cb94c9fcce009ba16a4bdca1">sha512.h</a>
+</li>
+<li>SHA512_DIGEST_SIZE
+: <a class="el" href="sha512_8h.html#a67f489f3eee39c447a6db3ba34ef75f2">sha512.h</a>
+</li>
+<li>SHA512_DIGEST_WORDS
+: <a class="el" href="sha512_8h.html#ab16e074d262ae09949e0bf222f95f5be">sha512.h</a>
+</li>
+<li>SwapNativeAndPortableLayout()
+: <a class="el" href="serialize_8h.html#a6789f8e258de2efc616c2f3109b7992b">serialize.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_t.html b/doc/html/globals_t.html
new file mode 100644
index 0000000..a7c95f7
--- /dev/null
+++ b/doc/html/globals_t.html
@@ -0,0 +1,186 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_t.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tc_sha256_final()
+: <a class="el" href="sha256_8h.html#a8013bed3e0b388ec654f991b45c00bbf">sha256.h</a>
+</li>
+<li>tc_sha256_init()
+: <a class="el" href="sha256_8h.html#a05aad282287c226a9ab8a2eb65d10d1b">sha256.h</a>
+</li>
+<li>tc_sha256_update()
+: <a class="el" href="sha256_8h.html#ab42ecba529c48040c34e70cee8d98096">sha256.h</a>
+</li>
+<li>tinysha512_final()
+: <a class="el" href="sha512_8h.html#ace9440a26ec431a1596f40284cc8d5ee">sha512.h</a>
+</li>
+<li>tinysha512_init()
+: <a class="el" href="sha512_8h.html#a3cf87b13e209264d7aba7d708560dfde">sha512.h</a>
+</li>
+<li>tinysha512_update()
+: <a class="el" href="sha512_8h.html#a47108f5097342900a4a07f52b6204082">sha512.h</a>
+</li>
+<li>tinysha_digest_size()
+: <a class="el" href="hashwrap_8h.html#a6e07fd5b18355546d72dd09eae343c6a">hashwrap.h</a>
+</li>
+<li>tinysha_final()
+: <a class="el" href="hashwrap_8h.html#a22b9a3e01537f4f5d89e608c8b7956f6">hashwrap.h</a>
+</li>
+<li>tinysha_init()
+: <a class="el" href="hashwrap_8h.html#ab168fa663e74cc973af7e79d384df8b0">hashwrap.h</a>
+</li>
+<li>tinysha_update()
+: <a class="el" href="hashwrap_8h.html#a9844075a9ccf12e56f6a07d86b49c98d">hashwrap.h</a>
+</li>
+<li>Tpm2Commit()
+: <a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">commit.h</a>
+, <a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">commit.c</a>
+</li>
+<li>Tpm2CreateContext()
+: <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">context.c</a>
+</li>
+<li>Tpm2CreatePrimary()
+: <a class="el" href="createprimary_8c.html#a01df38cbb1c7c7986dadefcc1295bb9e">createprimary.c</a>
+, <a class="el" href="createprimary_8h.html#a01df38cbb1c7c7986dadefcc1295bb9e">createprimary.h</a>
+</li>
+<li>Tpm2DeleteContext()
+: <a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">context.c</a>
+</li>
+<li>Tpm2FlushKey()
+: <a class="el" href="context_8c.html#a7f547c0068dc63f0a6b76ad15b1b9675">context.c</a>
+</li>
+<li>Tpm2GetRandom()
+: <a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">getrandom.h</a>
+, <a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">getrandom.c</a>
+</li>
+<li>Tpm2LoadExternal()
+: <a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">load_external.c</a>
+, <a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">load_external.h</a>
+</li>
+<li>Tpm2NvDefineSpace()
+: <a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">nv.c</a>
+, <a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">nv.h</a>
+</li>
+<li>Tpm2NvRead()
+: <a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">nv.h</a>
+, <a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">nv.c</a>
+</li>
+<li>Tpm2NvUndefineSpace()
+: <a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">nv.c</a>
+, <a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">nv.h</a>
+</li>
+<li>Tpm2NvWrite()
+: <a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">nv.h</a>
+, <a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">nv.c</a>
+</li>
+<li>Tpm2ReleaseCounter()
+: <a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">sign.c</a>
+, <a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">sign.h</a>
+</li>
+<li>Tpm2ResetContext()
+: <a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">context.c</a>
+</li>
+<li>Tpm2SetHashAlg()
+: <a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">context.h</a>
+, <a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">context.c</a>
+</li>
+<li>Tpm2Sign()
+: <a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">sign.c</a>
+, <a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">sign.h</a>
+</li>
+<li>Tpm2toEpidHashAlg()
+: <a class="el" href="conversion_8h.html#a51507a6be8d7dfa167c9e6fb70e5ee57">conversion.h</a>
+, <a class="el" href="conversion_8c.html#a51507a6be8d7dfa167c9e6fb70e5ee57">conversion.c</a>
+</li>
+<li>TPM_ALG_NULL
+: <a class="el" href="conversion_8h.html#a3622ddd0080bf63059d26887b6ee90ac">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA256
+: <a class="el" href="conversion_8h.html#ae9c66465b8109d648704268fee8cf66b">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA384
+: <a class="el" href="conversion_8h.html#a85ee45736d112c61495faad4fea3dbbc">conversion.h</a>
+</li>
+<li>TPM_ALG_SHA512
+: <a class="el" href="conversion_8h.html#a8aecd28504c6511c02da2e78ecaaf5bd">conversion.h</a>
+</li>
+<li>true
+: <a class="el" href="stdtypes_8h.html#a41f9c5fb8b08eb5dc3edce4dcb37fee7">stdtypes.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_type.html b/doc/html/globals_type.html
new file mode 100644
index 0000000..34339f0
--- /dev/null
+++ b/doc/html/globals_type.html
@@ -0,0 +1,136 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_type.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;<ul>
+<li>BigNum
+: <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">bignum.h</a>
+</li>
+<li>BitSupplier
+: <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">bitsupplier.h</a>
+</li>
+<li>bool
+: <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">stdtypes.h</a>
+</li>
+<li>ConstOctStr
+: <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">types.h</a>
+</li>
+<li>EcGroup
+: <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">ecgroup.h</a>
+</li>
+<li>EcPoint
+: <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">ecgroup.h</a>
+</li>
+<li>Epid11G1ElemStr
+: <a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">types.h</a>
+</li>
+<li>Epid11G3ElemStr
+: <a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">types.h</a>
+</li>
+<li>Epid11GroupId
+: <a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">types.h</a>
+</li>
+<li>Epid11PairingState
+: <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">tatepairing.h</a>
+</li>
+<li>Epid11VerifierCtx
+: <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">api.h</a>
+</li>
+<li>FfElement
+: <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">finitefield.h</a>
+</li>
+<li>FiniteField
+: <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">finitefield.h</a>
+</li>
+<li>GroupId
+: <a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">types.h</a>
+</li>
+<li>IssuerNonce
+: <a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">types.h</a>
+</li>
+<li>MemberCtx
+: <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">api.h</a>
+</li>
+<li>OctStr
+: <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">types.h</a>
+</li>
+<li>ReKeySeed
+: <a class="el" href="group___epid_types.html#ga54bd22670f2e348593db7ab631131d10">types.h</a>
+</li>
+<li>Seed
+: <a class="el" href="group___epid_types.html#ga888541b8148df69c634a92c64ed51317">types.h</a>
+</li>
+<li>VerifierCtx
+: <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">api.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_u.html b/doc/html/globals_u.html
new file mode 100644
index 0000000..ce5a775
--- /dev/null
+++ b/doc/html/globals_u.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_u.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>Uint32Deserialize()
+: <a class="el" href="serialize_8h.html#a2aaa1779f9085d62b27e072271329dd7">serialize.h</a>
+</li>
+<li>Uint32Serialize()
+: <a class="el" href="serialize_8h.html#ac74344e39b6d285c6a0258c4554712b0">serialize.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_v.html b/doc/html/globals_v.html
new file mode 100644
index 0000000..281fb42
--- /dev/null
+++ b/doc/html/globals_v.html
@@ -0,0 +1,141 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_v.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>VerifierCtx
+: <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">api.h</a>
+</li>
+<li>VliAdd()
+: <a class="el" href="vli_8h.html#a566cfdc23f1c35230891d53139850032">vli.h</a>
+</li>
+<li>VliClear()
+: <a class="el" href="vli_8h.html#ad1e2e5fe5fc466eff75dbe70fba3169f">vli.h</a>
+</li>
+<li>VliCmp()
+: <a class="el" href="vli_8h.html#a1f6ded73c6bb3dc340efd2a8978f8d7a">vli.h</a>
+</li>
+<li>VliCondSet()
+: <a class="el" href="vli_8h.html#a426db811cf4ee822bd4b6863f2e51d8c">vli.h</a>
+</li>
+<li>VliDeserialize()
+: <a class="el" href="serialize_8h.html#a7950febe703ea62457664eadc1e4eed9">serialize.h</a>
+</li>
+<li>VliIsZero()
+: <a class="el" href="vli_8h.html#a8f6a41541103b1bde8428ea7f4b816fa">vli.h</a>
+</li>
+<li>VliModAdd()
+: <a class="el" href="vli_8h.html#a6373f1d28198a0f34f220bfcc2ecf040">vli.h</a>
+</li>
+<li>VliModBarrett()
+: <a class="el" href="vli_8h.html#a5280e583a19e61ad815b02906c082033">vli.h</a>
+</li>
+<li>VliModExp()
+: <a class="el" href="vli_8h.html#aa1f2257e949c0c4f26b24aec95e01452">vli.h</a>
+</li>
+<li>VliModInv()
+: <a class="el" href="vli_8h.html#a3d4ee194f13293e61bddf243e4241b4c">vli.h</a>
+</li>
+<li>VliModMul()
+: <a class="el" href="vli_8h.html#a112a5d4118e101ec539e9669ebd4fdf9">vli.h</a>
+</li>
+<li>VliModSquare()
+: <a class="el" href="vli_8h.html#accf6070832e479e01c1268b0414645b9">vli.h</a>
+</li>
+<li>VliModSub()
+: <a class="el" href="vli_8h.html#aa53a875972ac2f10852fcaca92de2b40">vli.h</a>
+</li>
+<li>VliMul()
+: <a class="el" href="vli_8h.html#ab6d63a825df6f224fe37c76b6bb67bcf">vli.h</a>
+</li>
+<li>VliRand()
+: <a class="el" href="vli_8h.html#a10fc791278e51543fc685d5a4903fcd1">vli.h</a>
+</li>
+<li>VliRShift()
+: <a class="el" href="vli_8h.html#a4c7e60c47b82e5b2cf823d51b3a9fdcc">vli.h</a>
+</li>
+<li>VliSerialize()
+: <a class="el" href="serialize_8h.html#af2841bf57731c82f8164900bf3f52320">serialize.h</a>
+</li>
+<li>VliSet()
+: <a class="el" href="vli_8h.html#a9a1df0e7770aa1421e41b87965e71425">vli.h</a>
+</li>
+<li>VliSub()
+: <a class="el" href="vli_8h.html#ac47d57834c67877c10ecdc230cdaf503">vli.h</a>
+</li>
+<li>VliTestBit()
+: <a class="el" href="vli_8h.html#a80d1a80f5a21437354ee185923621d66">vli.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html
new file mode 100644
index 0000000..17979b6
--- /dev/null
+++ b/doc/html/globals_vars.html
@@ -0,0 +1,85 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_vars.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+&#160;<ul>
+<li>is_context_already_created
+: <a class="el" href="context_8c.html#a8e9ae8d68d53b7549da3823bc65a336e">context.c</a>
+</li>
+<li>kEpidFileTypeCode
+: <a class="el" href="group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33">file_parser.h</a>
+</li>
+<li>kEpidVersionCode
+: <a class="el" href="group___file_parser.html#gaae808987ce82188dff42baa4e43cab82">file_parser.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/globals_w.html b/doc/html/globals_w.html
new file mode 100644
index 0000000..0dcf919
--- /dev/null
+++ b/doc/html/globals_w.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('globals_w.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>WriteBigNum()
+: <a class="el" href="group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f">bignum.h</a>
+</li>
+<li>WriteEcPoint()
+: <a class="el" href="group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb">ecgroup.h</a>
+</li>
+<li>WriteFfElement()
+: <a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f">finitefield.h</a>
+</li>
+<li>WriteTpm2EcPoint()
+: <a class="el" href="conversion_8h.html#a15e859e04c4b9c32a0970565846bdba3">conversion.h</a>
+, <a class="el" href="conversion_8c.html#a15e859e04c4b9c32a0970565846bdba3">conversion.c</a>
+</li>
+<li>WriteTpm2FfElement()
+: <a class="el" href="conversion_8c.html#a9f6a2b44857c038a2f90c12959640dea">conversion.c</a>
+, <a class="el" href="conversion_8h.html#a9f6a2b44857c038a2f90c12959640dea">conversion.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/glossary_8dox.html b/doc/html/glossary_8dox.html
new file mode 100644
index 0000000..47ae8d5
--- /dev/null
+++ b/doc/html/glossary_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/glossary.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('glossary_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/glossary.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="glossary_8dox.html">glossary.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___big_num_primitives.html b/doc/html/group___big_num_primitives.html
new file mode 100644
index 0000000..75217e5
--- /dev/null
+++ b/doc/html/group___big_num_primitives.html
@@ -0,0 +1,642 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: bignum</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___big_num_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bignum<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Big number operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="memItemLeft" align="right" valign="top"><a id="ga2bf153e27be2683f0fb26f0f7ff1f718"></a>
+typedef struct <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a></td></tr>
+<tr class="memdesc:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal representation of large numbers. <br /></td></tr>
+<tr class="separator:ga2bf153e27be2683f0fb26f0f7ff1f718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad5f6f262bfd780fed3678bcee16f0aed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed">NewBigNum</a> (size_t data_size_bytes, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **bignum)</td></tr>
+<tr class="memdesc:gad5f6f262bfd780fed3678bcee16f0aed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new BigNum. <a href="#gad5f6f262bfd780fed3678bcee16f0aed">More...</a><br /></td></tr>
+<tr class="separator:gad5f6f262bfd780fed3678bcee16f0aed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2d17600068b1d94000635c6644258a03"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03">DeleteBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **bignum)</td></tr>
+<tr class="memdesc:ga2d17600068b1d94000635c6644258a03"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated BigNum. <a href="#ga2d17600068b1d94000635c6644258a03">More...</a><br /></td></tr>
+<tr class="separator:ga2d17600068b1d94000635c6644258a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe8e39d5788423f41770a71a4c911fbe"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe">ReadBigNum</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> bn_str, size_t strlen, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *bn)</td></tr>
+<tr class="memdesc:gabe8e39d5788423f41770a71a4c911fbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes a BigNum from a string. <a href="#gabe8e39d5788423f41770a71a4c911fbe">More...</a><br /></td></tr>
+<tr class="separator:gabe8e39d5788423f41770a71a4c911fbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga904c16cc020e7196f22ac9abdc31b41f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f">WriteBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *bn, size_t strlen, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> bn_str)</td></tr>
+<tr class="memdesc:ga904c16cc020e7196f22ac9abdc31b41f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes a BigNum to a string. <a href="#ga904c16cc020e7196f22ac9abdc31b41f">More...</a><br /></td></tr>
+<tr class="separator:ga904c16cc020e7196f22ac9abdc31b41f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8">BigNumAdd</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds two BigNum values. <a href="#gae70fd9b3026f0ab3c7e9601d0a3186b8">More...</a><br /></td></tr>
+<tr class="separator:gae70fd9b3026f0ab3c7e9601d0a3186b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbec9669ab0fe768e2be74dcaca397ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea">BigNumSub</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gacbec9669ab0fe768e2be74dcaca397ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts two BigNum values. <a href="#gacbec9669ab0fe768e2be74dcaca397ea">More...</a><br /></td></tr>
+<tr class="separator:gacbec9669ab0fe768e2be74dcaca397ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317">BigNumMul</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two BigNum values. <a href="#ga03c89b8b8dd87de2c0f4b5822145d317">More...</a><br /></td></tr>
+<tr class="separator:ga03c89b8b8dd87de2c0f4b5822145d317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga166134085464b0df2c8efcfccf8ec573"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573">BigNumDiv</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *q, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga166134085464b0df2c8efcfccf8ec573"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divides two BigNum values. <a href="#ga166134085464b0df2c8efcfccf8ec573">More...</a><br /></td></tr>
+<tr class="separator:ga166134085464b0df2c8efcfccf8ec573"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7dd6038987210d10bf843602fef0c929"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929">BigNumMod</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:ga7dd6038987210d10bf843602fef0c929"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes modular reduction for BigNum value by specified modulus. <a href="#ga7dd6038987210d10bf843602fef0c929">More...</a><br /></td></tr>
+<tr class="separator:ga7dd6038987210d10bf843602fef0c929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0366e47226563b17fcbc8e3ed766084"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084">BigNumIsEven</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_even)</td></tr>
+<tr class="memdesc:gaf0366e47226563b17fcbc8e3ed766084"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a BigNum is even. <a href="#gaf0366e47226563b17fcbc8e3ed766084">More...</a><br /></td></tr>
+<tr class="separator:gaf0366e47226563b17fcbc8e3ed766084"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacde6564a814617a96985b379be0dfabb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb">BigNumIsZero</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_zero)</td></tr>
+<tr class="memdesc:gacde6564a814617a96985b379be0dfabb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a BigNum is zero. <a href="#gacde6564a814617a96985b379be0dfabb">More...</a><br /></td></tr>
+<tr class="separator:gacde6564a814617a96985b379be0dfabb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4">BigNumPow2N</a> (unsigned int n, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *r)</td></tr>
+<tr class="memdesc:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises 2 to the given power. <a href="#gafd64b66fc85dab0005f4a1bb67bdf7b4">More...</a><br /></td></tr>
+<tr class="separator:gafd64b66fc85dab0005f4a1bb67bdf7b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Big number operations. </p>
+<p>This module provides an API for working with large numbers. BigNums represent non-negative integers.</p>
+<p>Each BigNum variable represents a number of a byte-size set when the variable was created. BigNum variables cannot be re-sized after they are created. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gae70fd9b3026f0ab3c7e9601d0a3186b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae70fd9b3026f0ab3c7e9601d0a3186b8">&#9670;&nbsp;</a></span>BigNumAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds two BigNum values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second operand to be added. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of adding a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga166134085464b0df2c8efcfccf8ec573"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga166134085464b0df2c8efcfccf8ec573">&#9670;&nbsp;</a></span>BigNumDiv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumDiv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>q</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Divides two BigNum values. </p>
+<dl class="section note"><dt>Note</dt><dd>Only needed for Intel(R) EPID 1.1 verification.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>Dividend parameter. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>Divisor parameter. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">q</td><td>Quotient of result. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>Remainder of result.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf0366e47226563b17fcbc8e3ed766084"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf0366e47226563b17fcbc8e3ed766084">&#9670;&nbsp;</a></span>BigNumIsEven()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumIsEven </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_even</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if a BigNum is even. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The BigNum to check. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_even</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gacde6564a814617a96985b379be0dfabb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacde6564a814617a96985b379be0dfabb">&#9670;&nbsp;</a></span>BigNumIsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumIsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_zero</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if a BigNum is zero. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The BigNum to check. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_zero</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7dd6038987210d10bf843602fef0c929"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7dd6038987210d10bf843602fef0c929">&#9670;&nbsp;</a></span>BigNumMod()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumMod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes modular reduction for BigNum value by specified modulus. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The BigNum value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The modulus. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>Modular reduction result.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga03c89b8b8dd87de2c0f4b5822145d317"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga03c89b8b8dd87de2c0f4b5822145d317">&#9670;&nbsp;</a></span>BigNumMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiplies two BigNum values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of multiplying a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gafd64b66fc85dab0005f4a1bb67bdf7b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafd64b66fc85dab0005f4a1bb67bdf7b4">&#9670;&nbsp;</a></span>BigNumPow2N()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumPow2N </td>
+ <td>(</td>
+ <td class="paramtype">unsigned int&#160;</td>
+ <td class="paramname"><em>n</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Raises 2 to the given power. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">n</td><td>The power. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of 2^n.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gacbec9669ab0fe768e2be74dcaca397ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacbec9669ab0fe768e2be74dcaca397ea">&#9670;&nbsp;</a></span>BigNumSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> BigNumSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts two BigNum values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first operand to use in subtraction. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second operand to use in subtraction. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of subtracting a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2d17600068b1d94000635c6644258a03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2d17600068b1d94000635c6644258a03">&#9670;&nbsp;</a></span>DeleteBigNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteBigNum </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **&#160;</td>
+ <td class="paramname"><em>bignum</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes a previously allocated BigNum. </p>
+<p>Frees memory pointed to by bignum. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">bignum</td><td>The BigNum. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed" title="Constructs a new BigNum. ">NewBigNum</a> </dd></dl>
+
+</div>
+</div>
+<a id="gad5f6f262bfd780fed3678bcee16f0aed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad5f6f262bfd780fed3678bcee16f0aed">&#9670;&nbsp;</a></span>NewBigNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewBigNum </td>
+ <td>(</td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>data_size_bytes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> **&#160;</td>
+ <td class="paramname"><em>bignum</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a new BigNum. </p>
+<p>Allocates memory and creates a new BigNum.</p>
+<p>Use <a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03" title="Deletes a previously allocated BigNum. ">DeleteBigNum()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">data_size_bytes</td><td>The size in bytes of the new number. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">bignum</td><td>The BigNum.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03" title="Deletes a previously allocated BigNum. ">DeleteBigNum</a> </dd></dl>
+
+</div>
+</div>
+<a id="gabe8e39d5788423f41770a71a4c911fbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabe8e39d5788423f41770a71a4c911fbe">&#9670;&nbsp;</a></span>ReadBigNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadBigNum </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>bn_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>bn</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deserializes a BigNum from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">bn_str</td><td>The serialized value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of bn_str in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">bn</td><td>The target BigNum.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga904c16cc020e7196f22ac9abdc31b41f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga904c16cc020e7196f22ac9abdc31b41f">&#9670;&nbsp;</a></span>WriteBigNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteBigNum </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>bn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a>&#160;</td>
+ <td class="paramname"><em>bn_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes a BigNum to a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">bn</td><td>The BigNum to be serialized. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of bn_str in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">bn_str</td><td>The target string.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___big_num_primitives.js b/doc/html/group___big_num_primitives.js
new file mode 100644
index 0000000..63bda6f
--- /dev/null
+++ b/doc/html/group___big_num_primitives.js
@@ -0,0 +1,16 @@
+var group___big_num_primitives =
+[
+ [ "BigNum", "group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718", null ],
+ [ "BigNumAdd", "group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8", null ],
+ [ "BigNumDiv", "group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573", null ],
+ [ "BigNumIsEven", "group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084", null ],
+ [ "BigNumIsZero", "group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb", null ],
+ [ "BigNumMod", "group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929", null ],
+ [ "BigNumMul", "group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317", null ],
+ [ "BigNumPow2N", "group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4", null ],
+ [ "BigNumSub", "group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea", null ],
+ [ "DeleteBigNum", "group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03", null ],
+ [ "NewBigNum", "group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed", null ],
+ [ "ReadBigNum", "group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe", null ],
+ [ "WriteBigNum", "group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___ec_group_primitives.html b/doc/html/group___ec_group_primitives.html
new file mode 100644
index 0000000..429a763
--- /dev/null
+++ b/doc/html/group___ec_group_primitives.html
@@ -0,0 +1,1249 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: ecgroup</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___ec_group_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ecgroup<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Elliptic curve group operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="memItemLeft" align="right" valign="top"><a id="gac91c5a7623c17a868dd15b2e9aaf7159"></a>
+typedef struct <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a></td></tr>
+<tr class="memdesc:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="mdescLeft">&#160;</td><td class="mdescRight">Elliptic curve group over finite field. <br /></td></tr>
+<tr class="separator:gac91c5a7623c17a868dd15b2e9aaf7159"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85c1d5e106031b385a6e23e598ac98fa"><td class="memItemLeft" align="right" valign="top"><a id="ga85c1d5e106031b385a6e23e598ac98fa"></a>
+typedef struct <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a></td></tr>
+<tr class="memdesc:ga85c1d5e106031b385a6e23e598ac98fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point on elliptic curve over finite field. <br /></td></tr>
+<tr class="separator:ga85c1d5e106031b385a6e23e598ac98fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62">NewEcGroup</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *x, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *y, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *order, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *cofactor, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **g)</td></tr>
+<tr class="memdesc:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new EcGroup. <a href="#gaf4e23677dd378ef2e0cf55df79cbdb62">More...</a><br /></td></tr>
+<tr class="separator:gaf4e23677dd378ef2e0cf55df79cbdb62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7af276256c27610eda85ff432b846ea"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea">DeleteEcGroup</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **g)</td></tr>
+<tr class="memdesc:gab7af276256c27610eda85ff432b846ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated EcGroup. <a href="#gab7af276256c27610eda85ff432b846ea">More...</a><br /></td></tr>
+<tr class="separator:gab7af276256c27610eda85ff432b846ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6417b0ce72ba96de00c329e322fec7fb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb">NewEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **p)</td></tr>
+<tr class="memdesc:ga6417b0ce72ba96de00c329e322fec7fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new EcPoint. <a href="#ga6417b0ce72ba96de00c329e322fec7fb">More...</a><br /></td></tr>
+<tr class="separator:ga6417b0ce72ba96de00c329e322fec7fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7">DeleteEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **p)</td></tr>
+<tr class="memdesc:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a previously allocated EcPoint. <a href="#ga8cb086d792bffb79b3ca07e6ca4ce0e7">More...</a><br /></td></tr>
+<tr class="separator:ga8cb086d792bffb79b3ca07e6ca4ce0e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb">ReadEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> p_str, size_t strlen, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *p)</td></tr>
+<tr class="memdesc:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes an EcPoint from a string. <a href="#gad495a9f91b79984f7533c8ea4f92b3cb">More...</a><br /></td></tr>
+<tr class="separator:gad495a9f91b79984f7533c8ea4f92b3cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb">WriteEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> p_str, size_t strlen)</td></tr>
+<tr class="memdesc:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes an EcPoint to a string. <a href="#ga7a8bdb9782d065bc32fd102e0ae73ccb">More...</a><br /></td></tr>
+<tr class="separator:ga7a8bdb9782d065bc32fd102e0ae73ccb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25c9013cc76907d73765eb7a96aa8c96"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96">EcMul</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga25c9013cc76907d73765eb7a96aa8c96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two elements in an elliptic curve group. <a href="#ga25c9013cc76907d73765eb7a96aa8c96">More...</a><br /></td></tr>
+<tr class="separator:ga25c9013cc76907d73765eb7a96aa8c96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga01bf8d6fa60a2e445490966b3a06c270"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270">EcExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga01bf8d6fa60a2e445490966b3a06c270"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises a point in an elliptic curve group to a power. <a href="#ga01bf8d6fa60a2e445490966b3a06c270">More...</a><br /></td></tr>
+<tr class="separator:ga01bf8d6fa60a2e445490966b3a06c270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57">EcSscmExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *b, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of EcExp. <a href="#gaf3b6a548aa6f0d4f028a14feca251f57">More...</a><br /></td></tr>
+<tr class="separator:gaf3b6a548aa6f0d4f028a14feca251f57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae96c38e004ccd2211290ad6e66415ec4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4">EcMultiExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gae96c38e004ccd2211290ad6e66415ec4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates elements in elliptic curve group. <a href="#gae96c38e004ccd2211290ad6e66415ec4">More...</a><br /></td></tr>
+<tr class="separator:gae96c38e004ccd2211290ad6e66415ec4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76d24378455eb96a3257fe8045c0993a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a">EcMultiExpBn</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga76d24378455eb96a3257fe8045c0993a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates elements in elliptic curve group. <a href="#ga76d24378455eb96a3257fe8045c0993a">More...</a><br /></td></tr>
+<tr class="separator:ga76d24378455eb96a3257fe8045c0993a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4">EcSscmMultiExp</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of EcMultiExp. <a href="#ga40e3431d3dbe8cf7a65ada7b7811cba4">More...</a><br /></td></tr>
+<tr class="separator:ga40e3431d3dbe8cf7a65ada7b7811cba4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f96c43d14d24de0f7a5e214aef64196"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196">EcGetRandom</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_func_param, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga3f96c43d14d24de0f7a5e214aef64196"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates a random element from an elliptic curve group. <a href="#ga3f96c43d14d24de0f7a5e214aef64196">More...</a><br /></td></tr>
+<tr class="separator:ga3f96c43d14d24de0f7a5e214aef64196"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga48ec5ae951c9f49d8d7d983234eea921"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921">EcInGroup</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> p_str, size_t strlen, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *in_group)</td></tr>
+<tr class="memdesc:ga48ec5ae951c9f49d8d7d983234eea921"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if a point is in an elliptic curve group. <a href="#ga48ec5ae951c9f49d8d7d983234eea921">More...</a><br /></td></tr>
+<tr class="separator:ga48ec5ae951c9f49d8d7d983234eea921"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad96a1498b85d28f71514b8f7b154d82"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82">Epid11EcHash</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:gaad96a1498b85d28f71514b8f7b154d82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an Intel(R) EPID 1.1 element in an elliptic curve group. <a href="#gaad96a1498b85d28f71514b8f7b154d82">More...</a><br /></td></tr>
+<tr class="separator:gaad96a1498b85d28f71514b8f7b154d82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3067cc899e65e647390bb3bd1cabe4c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c">EcHash</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r, uint32_t *iterations)</td></tr>
+<tr class="memdesc:gac3067cc899e65e647390bb3bd1cabe4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an element in an elliptic curve group. <a href="#gac3067cc899e65e647390bb3bd1cabe4c">More...</a><br /></td></tr>
+<tr class="separator:gac3067cc899e65e647390bb3bd1cabe4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8a6114a48214a327d4ec04fd25e5940e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e">EcMakePoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *x, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga8a6114a48214a327d4ec04fd25e5940e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets an EcPoint variable to a point on a curve. <a href="#ga8a6114a48214a327d4ec04fd25e5940e">More...</a><br /></td></tr>
+<tr class="separator:ga8a6114a48214a327d4ec04fd25e5940e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b6d7a3398251e9352fb29ef4abef466"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466">EcInverse</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *r)</td></tr>
+<tr class="memdesc:ga0b6d7a3398251e9352fb29ef4abef466"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the additive inverse of an EcPoint. <a href="#ga0b6d7a3398251e9352fb29ef4abef466">More...</a><br /></td></tr>
+<tr class="separator:ga0b6d7a3398251e9352fb29ef4abef466"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad3b3c63c48fa24e8dea07837b05bc061"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061">EcIsEqual</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_equal)</td></tr>
+<tr class="memdesc:gad3b3c63c48fa24e8dea07837b05bc061"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if two EcPoints are equal. <a href="#gad3b3c63c48fa24e8dea07837b05bc061">More...</a><br /></td></tr>
+<tr class="separator:gad3b3c63c48fa24e8dea07837b05bc061"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210">EcIsIdentity</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_identity)</td></tr>
+<tr class="memdesc:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if an EcPoint is the identity element. <a href="#ga9cf15b34bc4ff12e58b169dd989d8210">More...</a><br /></td></tr>
+<tr class="separator:ga9cf15b34bc4ff12e58b169dd989d8210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Elliptic curve group operations. </p>
+<p>Provides APIs for working with Elliptic curve groups. Elliptic curve groups allow simple mathematical operations based on points that lie on a defined elliptic curve. The results of these operations also lie on the same curve.</p>
+<p>Curves themselves are defined based on elements (<a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa" title="An element in a finite field. ">FfElement</a>) of a finite field (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e" title="A finite field. ">FiniteField</a>). </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gab7af276256c27610eda85ff432b846ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab7af276256c27610eda85ff432b846ea">&#9670;&nbsp;</a></span>DeleteEcGroup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteEcGroup </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **&#160;</td>
+ <td class="paramname"><em>g</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes a previously allocated EcGroup. </p>
+<p>Frees memory pointed to by elliptic curve group. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8cb086d792bffb79b3ca07e6ca4ce0e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8cb086d792bffb79b3ca07e6ca4ce0e7">&#9670;&nbsp;</a></span>DeleteEcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteEcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes a previously allocated EcPoint. </p>
+<p>Frees memory used by a point on elliptic curve group. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>The EcPoint. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga01bf8d6fa60a2e445490966b3a06c270"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga01bf8d6fa60a2e445490966b3a06c270">&#9670;&nbsp;</a></span>EcExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Raises a point in an elliptic curve group to a power. </p>
+<p>This exponentiation operation is also known as element multiplication for elliptic curve groups. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The power. Power must be less than the order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising a to the power b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3f96c43d14d24de0f7a5e214aef64196"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3f96c43d14d24de0f7a5e214aef64196">&#9670;&nbsp;</a></span>EcGetRandom()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcGetRandom </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_func_param</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generates a random element from an elliptic curve group. </p>
+<p>This function is only available for G1 and GT.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func_param</td><td>Pass through context data for rnd_func. </td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">r</td><td>Output random elliptic curve element.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd>
+<dd>
+<a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac3067cc899e65e647390bb3bd1cabe4c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac3067cc899e65e647390bb3bd1cabe4c">&#9670;&nbsp;</a></span>EcHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t *&#160;</td>
+ <td class="paramname"><em>iterations</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes an arbitrary message to an element in an elliptic curve group. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>The hash algorithm. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The hashed value. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">iterations</td><td>The number of hash iterations needed to find a valid hash. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga48ec5ae951c9f49d8d7d983234eea921"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga48ec5ae951c9f49d8d7d983234eea921">&#9670;&nbsp;</a></span>EcInGroup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcInGroup </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>p_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>in_group</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if a point is in an elliptic curve group. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>A serialized point. Must be a <a class="el" href="struct_g1_elem_str.html" title="Serialized G1 element. ">G1ElemStr</a> or <a class="el" href="struct_g2_elem_str.html" title="Serialized G2 element. ">G2ElemStr</a>. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of p_str in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">in_group</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga0b6d7a3398251e9352fb29ef4abef466"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0b6d7a3398251e9352fb29ef4abef466">&#9670;&nbsp;</a></span>EcInverse()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcInverse </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes the additive inverse of an EcPoint. </p>
+<p>This inverse operation is also known as element negation for elliptic curve groups.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>The point. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The inverted point.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gad3b3c63c48fa24e8dea07837b05bc061"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad3b3c63c48fa24e8dea07837b05bc061">&#9670;&nbsp;</a></span>EcIsEqual()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcIsEqual </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_equal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if two EcPoints are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>A point to check. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>Another point to check. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_equal</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga9cf15b34bc4ff12e58b169dd989d8210"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9cf15b34bc4ff12e58b169dd989d8210">&#9670;&nbsp;</a></span>EcIsIdentity()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcIsIdentity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_identity</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if an EcPoint is the identity element. </p>
+<p>Takes a group element P as input. It outputs true if P is the identity element of G. Otherwise, it outputs false.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>The point to check. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_identity</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8a6114a48214a327d4ec04fd25e5940e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8a6114a48214a327d4ec04fd25e5940e">&#9670;&nbsp;</a></span>EcMakePoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcMakePoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets an EcPoint variable to a point on a curve. </p>
+<p>This function is only available for G1.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">x</td><td>The x coordinate. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The point.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga25c9013cc76907d73765eb7a96aa8c96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga25c9013cc76907d73765eb7a96aa8c96">&#9670;&nbsp;</a></span>EcMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiplies two elements in an elliptic curve group. </p>
+<p>This multiplication operation is also known as element addition for elliptic curve groups.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of multiplying a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae96c38e004ccd2211290ad6e66415ec4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae96c38e004ccd2211290ad6e66415ec4">&#9670;&nbsp;</a></span>EcMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multi-exponentiates elements in elliptic curve group. </p>
+<p>Takes a group elements a[0], ... , a[m-1] in G and positive integers b[0], ..., b[m-1], where m is a small positive integer. Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. Power must be less than the order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga76d24378455eb96a3257fe8045c0993a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76d24378455eb96a3257fe8045c0993a">&#9670;&nbsp;</a></span>EcMultiExpBn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcMultiExpBn </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multi-exponentiates elements in elliptic curve group. </p>
+<p>Takes a group elements a[0], ... , a[m-1] in G and positive integers b[0], ..., b[m-1], where m is a small positive integer. Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. Power must be less than the order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf3b6a548aa6f0d4f028a14feca251f57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf3b6a548aa6f0d4f028a14feca251f57">&#9670;&nbsp;</a></span>EcSscmExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcSscmExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Software side-channel mitigated implementation of EcExp. </p>
+<p>This exponentiation operation is also known as element multiplication for elliptic curve groups.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The reference implementation of EcSscmExp calls EcExp directly because the implementation of EcExp is already side channel mitigated. Implementers providing their own versions of this function are responsible for ensuring that EcSscmExp is side channel mitigated per section 8 of the Intel(R) EPID 2.0 spec.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The power. Power must be less than the order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising a to the power b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga40e3431d3dbe8cf7a65ada7b7811cba4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga40e3431d3dbe8cf7a65ada7b7811cba4">&#9670;&nbsp;</a></span>EcSscmMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcSscmMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Software side-channel mitigated implementation of EcMultiExp. </p>
+<p>Takes a group elements a[0], ... , a[m-1] in G and positive integers b[0], ..., b[m-1], where m is a small positive integer. Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).</p>
+<dl class="section attention"><dt>Attention</dt><dd>The reference implementation of EcSscmMultiExp calls EcMultiExp directly because the implementation of EcMultiExp is already side channel mitigated. Implementers providing their own versions of this function are responsible for ensuring that EcSscmMultiExp is side channel mitigated per section 8 of the Intel(R) EPID 2.0 spec.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. Power must be less than the order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaad96a1498b85d28f71514b8f7b154d82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaad96a1498b85d28f71514b8f7b154d82">&#9670;&nbsp;</a></span>Epid11EcHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11EcHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes an arbitrary message to an Intel(R) EPID 1.1 element in an elliptic curve group. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The hashed value.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf4e23677dd378ef2e0cf55df79cbdb62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf4e23677dd378ef2e0cf55df79cbdb62">&#9670;&nbsp;</a></span>NewEcGroup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewEcGroup </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>order</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>cofactor</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> **&#160;</td>
+ <td class="paramname"><em>g</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a new EcGroup. </p>
+<p>Allocates memory and creates a new elliptic curve group.</p>
+<p>Use <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field on which the curve is based. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The A value of the elliptic curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The B value of the elliptic curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">x</td><td>The X-coordinate of the base point of the elliptic curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">y</td><td>The Y-coordinate of the base point of the elliptic curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">order</td><td>The order of the elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cofactor</td><td>The co-factor of the elliptic curve. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">g</td><td>The newly constructed elliptic curve group.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ff exists for the entire lifetime of the new EcGroup.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea" title="Deletes a previously allocated EcGroup. ">DeleteEcGroup</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga6417b0ce72ba96de00c329e322fec7fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6417b0ce72ba96de00c329e322fec7fb">&#9670;&nbsp;</a></span>NewEcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewEcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> **&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new EcPoint. </p>
+<p>Allocates memory and creates a new point on elliptic curve group.</p>
+<p>Use <a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7" title="Deletes a previously allocated EcPoint. ">DeleteEcPoint()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>Elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">p</td><td>Newly constructed point on the elliptic curve group g.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that g exists for the entire lifetime of the new EcPoint.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7" title="Deletes a previously allocated EcPoint. ">DeleteEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="gad495a9f91b79984f7533c8ea4f92b3cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad495a9f91b79984f7533c8ea4f92b3cb">&#9670;&nbsp;</a></span>ReadEcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadEcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>p_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deserializes an EcPoint from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p_str</td><td>The serialized value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of p_str in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">p</td><td>The target EcPoint.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7a8bdb9782d065bc32fd102e0ae73ccb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7a8bdb9782d065bc32fd102e0ae73ccb">&#9670;&nbsp;</a></span>WriteEcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteEcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a>&#160;</td>
+ <td class="paramname"><em>p_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes an EcPoint to a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>The elliptic curve group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>The EcPoint to be serialized. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">p_str</td><td>The target string. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>the size of p_str in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___ec_group_primitives.js b/doc/html/group___ec_group_primitives.js
new file mode 100644
index 0000000..48bf3ad
--- /dev/null
+++ b/doc/html/group___ec_group_primitives.js
@@ -0,0 +1,25 @@
+var group___ec_group_primitives =
+[
+ [ "EcGroup", "group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159", null ],
+ [ "EcPoint", "group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa", null ],
+ [ "DeleteEcGroup", "group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea", null ],
+ [ "DeleteEcPoint", "group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7", null ],
+ [ "EcExp", "group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270", null ],
+ [ "EcGetRandom", "group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196", null ],
+ [ "EcHash", "group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c", null ],
+ [ "EcInGroup", "group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921", null ],
+ [ "EcInverse", "group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466", null ],
+ [ "EcIsEqual", "group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061", null ],
+ [ "EcIsIdentity", "group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210", null ],
+ [ "EcMakePoint", "group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e", null ],
+ [ "EcMul", "group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96", null ],
+ [ "EcMultiExp", "group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4", null ],
+ [ "EcMultiExpBn", "group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a", null ],
+ [ "EcSscmExp", "group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57", null ],
+ [ "EcSscmMultiExp", "group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4", null ],
+ [ "Epid11EcHash", "group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82", null ],
+ [ "NewEcGroup", "group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62", null ],
+ [ "NewEcPoint", "group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb", null ],
+ [ "ReadEcPoint", "group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb", null ],
+ [ "WriteEcPoint", "group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___ecdsa_primitives.html b/doc/html/group___ecdsa_primitives.html
new file mode 100644
index 0000000..61c9e07
--- /dev/null
+++ b/doc/html/group___ecdsa_primitives.html
@@ -0,0 +1,235 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: ecdsa</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___ecdsa_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ecdsa<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Elliptic Curve Digital Signature Algorithm Primitives.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0">EcdsaVerifyBuffer</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> buf, size_t buf_len, <a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a> const *pubkey, <a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> const *sig)</td></tr>
+<tr class="memdesc:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies authenticity of a digital signature over a buffer. <a href="#ga07e4ebd3423e1f6f9ae35f0608dde7c0">More...</a><br /></td></tr>
+<tr class="separator:ga07e4ebd3423e1f6f9ae35f0608dde7c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef0e8a31e830fe9285b43a0969e6611a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a">EcdsaSignBuffer</a> (<a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> buf, size_t buf_len, <a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a> const *privkey, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param, <a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> *sig)</td></tr>
+<tr class="memdesc:gaef0e8a31e830fe9285b43a0969e6611a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates ECDSA signature of buffer. <a href="#gaef0e8a31e830fe9285b43a0969e6611a">More...</a><br /></td></tr>
+<tr class="separator:gaef0e8a31e830fe9285b43a0969e6611a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Elliptic Curve Digital Signature Algorithm Primitives. </p>
+<p>Provides APIs for computing and checking buffer signatures using the Elliptic Curve Digital Signature Algorithm. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaef0e8a31e830fe9285b43a0969e6611a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef0e8a31e830fe9285b43a0969e6611a">&#9670;&nbsp;</a></span>EcdsaSignBuffer()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcdsaSignBuffer </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>buf_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a> const *&#160;</td>
+ <td class="paramname"><em>privkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> *&#160;</td>
+ <td class="paramname"><em>sig</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates ECDSA signature of buffer. </p>
+<p>Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to generate a signature of the SHA-256 hash of the input buffer with the provided private key.</p>
+<p>The operation is over the standard secp256r1 curve.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing message to sign. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf_len</td><td>The size of buf in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">privkey</td><td>The ECDSA private key on secp256r1 curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">sig</td><td>The resulting ECDSA signature.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357" title="reached max iteration for random number generation ">kEpidRandMaxIterErr</a></td><td>Failed to sign after maximum number of iterations due to bad luck in random number generation.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a" title="Creates ECDSA signature of buffer. ">EcdsaSignBuffer</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga07e4ebd3423e1f6f9ae35f0608dde7c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga07e4ebd3423e1f6f9ae35f0608dde7c0">&#9670;&nbsp;</a></span>EcdsaVerifyBuffer()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EcdsaVerifyBuffer </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>buf_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a> const *&#160;</td>
+ <td class="paramname"><em>pubkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies authenticity of a digital signature over a buffer. </p>
+<p>Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to verify that the SHA-256 hash of the input buffer was signed with the private key corresponding to the provided public key.</p>
+<p>The operation is over the standard secp256r1 curve.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to verify the identity of the public key.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing message to verify. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf_len</td><td>The size of buf in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">pubkey</td><td>The ECDSA public key on secp256r1 curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The ECDSA signature to be verified.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e" title="Signature is valid. ">kEpidSigValid</a></td><td><a class="el" href="struct_ecdsa_signature.html" title="ECDSA Signature using NIST 256-bit curve secp256r1. ">EcdsaSignature</a> is valid for the given buffer. </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td><a class="el" href="struct_ecdsa_signature.html" title="ECDSA Signature using NIST 256-bit curve secp256r1. ">EcdsaSignature</a> is invalid for the given buffer.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a" title="Creates ECDSA signature of buffer. ">EcdsaSignBuffer</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___ecdsa_primitives.js b/doc/html/group___ecdsa_primitives.js
new file mode 100644
index 0000000..e901408
--- /dev/null
+++ b/doc/html/group___ecdsa_primitives.js
@@ -0,0 +1,5 @@
+var group___ecdsa_primitives =
+[
+ [ "EcdsaSignBuffer", "group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a", null ],
+ [ "EcdsaVerifyBuffer", "group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid11_file_parser_module.html b/doc/html/group___epid11_file_parser_module.html
new file mode 100644
index 0000000..b88a0f3
--- /dev/null
+++ b/doc/html/group___epid11_file_parser_module.html
@@ -0,0 +1,372 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Intel(R) EPID 1.1 support</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid11_file_parser_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Intel(R) EPID 1.1 support<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___file_parser.html">fileparser</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Parser for 1.1 issuer material.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c">Epid11ParseGroupPubKeyFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> *pubkey)</td></tr>
+<tr class="memdesc:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group public key from buffer in issuer binary format. <a href="#ga1f92d1cb6bd7d9815711fde515b40a4c">More...</a><br /></td></tr>
+<tr class="separator:ga1f92d1cb6bd7d9815711fde515b40a4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae682077d315c39ed298ef198fd738546"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546">Epid11ParsePrivRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gae682077d315c39ed298ef198fd738546"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts private key revocation list from buffer in issuer binary format. <a href="#gae682077d315c39ed298ef198fd738546">More...</a><br /></td></tr>
+<tr class="separator:gae682077d315c39ed298ef198fd738546"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3f6daaa5333627d4efe5438c1fe8868"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868">Epid11ParseSigRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gac3f6daaa5333627d4efe5438c1fe8868"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts signature revocation list from buffer in issuer binary format. <a href="#gac3f6daaa5333627d4efe5438c1fe8868">More...</a><br /></td></tr>
+<tr class="separator:gac3f6daaa5333627d4efe5438c1fe8868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae28a844eb68828480b2a76fcb7d252a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3">Epid11ParseGroupRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gae28a844eb68828480b2a76fcb7d252a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group revocation list from buffer in issuer binary format. <a href="#gae28a844eb68828480b2a76fcb7d252a3">More...</a><br /></td></tr>
+<tr class="separator:gae28a844eb68828480b2a76fcb7d252a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Parser for 1.1 issuer material. </p>
+<p>Defines the APIs needed to parse Intel(R) EPID 1.1 issuer material.</p>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga1f92d1cb6bd7d9815711fde515b40a4c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f92d1cb6bd7d9815711fde515b40a4c">&#9670;&nbsp;</a></span>Epid11ParseGroupPubKeyFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11ParseGroupPubKeyFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> *&#160;</td>
+ <td class="paramname"><em>pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts group public key from buffer in issuer binary format. </p>
+<p>Extracts the first group public key from a buffer with format of Intel(R) EPID 1.1 Group Public Key Certificate Binary File. The function validates that the first public key was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing public key to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">pubkey</td><td>The extracted group public key.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gae28a844eb68828480b2a76fcb7d252a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae28a844eb68828480b2a76fcb7d252a3">&#9670;&nbsp;</a></span>Epid11ParseGroupRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11ParseGroupRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts group revocation list from buffer in issuer binary format. </p>
+<p>Extracts the group revocation list from a buffer with format of Intel(R) EPID 1.1 Binary Group Certificate Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gae682077d315c39ed298ef198fd738546"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae682077d315c39ed298ef198fd738546">&#9670;&nbsp;</a></span>Epid11ParsePrivRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11ParsePrivRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts private key revocation list from buffer in issuer binary format. </p>
+<p>Extracts the private key revocation list from a buffer with format of Intel(R) EPID 1.1 Binary Private Key Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gac3f6daaa5333627d4efe5438c1fe8868"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac3f6daaa5333627d4efe5438c1fe8868">&#9670;&nbsp;</a></span>Epid11ParseSigRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11ParseSigRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts signature revocation list from buffer in issuer binary format. </p>
+<p>Extracts the signature based revocation list from a buffer with format of Intel(R) EPID 1.1 Binary Signature Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid11_file_parser_module.js b/doc/html/group___epid11_file_parser_module.js
new file mode 100644
index 0000000..aacd290
--- /dev/null
+++ b/doc/html/group___epid11_file_parser_module.js
@@ -0,0 +1,7 @@
+var group___epid11_file_parser_module =
+[
+ [ "Epid11ParseGroupPubKeyFile", "group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c", null ],
+ [ "Epid11ParseGroupRlFile", "group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3", null ],
+ [ "Epid11ParsePrivRlFile", "group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546", null ],
+ [ "Epid11ParseSigRlFile", "group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid11_pairing_primitives.html b/doc/html/group___epid11_pairing_primitives.html
new file mode 100644
index 0000000..da9e8f8
--- /dev/null
+++ b/doc/html/group___epid11_pairing_primitives.html
@@ -0,0 +1,254 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Intel(R) EPID 1.1 specific pairing</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid11_pairing_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Intel(R) EPID 1.1 specific pairing<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a> &raquo; <a class="el" href="group___pairing_primitives.html">pairing</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 pairing operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="memItemLeft" align="right" valign="top"><a id="ga74236e8ebbfc30a7daa7fa1cf1df148b"></a>
+typedef struct <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a></td></tr>
+<tr class="memdesc:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pairing. <br /></td></tr>
+<tr class="separator:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e">NewEpid11PairingState</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *ga, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *gb, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **ps)</td></tr>
+<tr class="memdesc:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new Tate pairing state. <a href="#ga0ee658e26e9f933ba2ffbf2504dfae7e">More...</a><br /></td></tr>
+<tr class="separator:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3457d6f85889bc714910252fd21c758"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758">DeleteEpid11PairingState</a> (<a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **ps)</td></tr>
+<tr class="memdesc:gaa3457d6f85889bc714910252fd21c758"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated by Epid11PairingState. <a href="#gaa3457d6f85889bc714910252fd21c758">More...</a><br /></td></tr>
+<tr class="separator:gaa3457d6f85889bc714910252fd21c758"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa4076dfe25e8e61ac6753333a322c059"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059">Epid11Pairing</a> (<a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> *ps, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *d)</td></tr>
+<tr class="memdesc:gaa4076dfe25e8e61ac6753333a322c059"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a Tate Pairing for two parameters. <a href="#gaa4076dfe25e8e61ac6753333a322c059">More...</a><br /></td></tr>
+<tr class="separator:gaa4076dfe25e8e61ac6753333a322c059"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Intel(R) EPID 1.1 pairing operations. </p>
+<p>Provides APIs for defining and using a pairing relationship between two Elliptic curve groups.</p>
+<p>These pairing operations are intended to support Intel(R) EPID 1.1 verification.</p>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaa3457d6f85889bc714910252fd21c758"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3457d6f85889bc714910252fd21c758">&#9670;&nbsp;</a></span>DeleteEpid11PairingState()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteEpid11PairingState </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **&#160;</td>
+ <td class="paramname"><em>ps</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Frees a previously allocated by Epid11PairingState. </p>
+<p>Frees memory pointed to by pairing state. Nulls the pointer.</p>
+<p>This pairing operation is intended to support Intel(R) EPID 1.1 verification.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ps</td><td>The pairing state. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e" title="Constructs a new Tate pairing state. ">NewEpid11PairingState</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa4076dfe25e8e61ac6753333a322c059"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa4076dfe25e8e61ac6753333a322c059">&#9670;&nbsp;</a></span>Epid11Pairing()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11Pairing </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> *&#160;</td>
+ <td class="paramname"><em>ps</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes a Tate Pairing for two parameters. </p>
+<p>This pairing operation is intended to support Intel(R) EPID 1.1 verification. It frees memory pointed to by an Intel(R) EPID 1.1 pairing state.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ps</td><td>The pairing state. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first value to pair. Must be in ga. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second value to pair. Must be in gb. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">d</td><td>The result of the pairing. Must be in ff.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga0ee658e26e9f933ba2ffbf2504dfae7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0ee658e26e9f933ba2ffbf2504dfae7e">&#9670;&nbsp;</a></span>NewEpid11PairingState()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewEpid11PairingState </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>ga</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>gb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **&#160;</td>
+ <td class="paramname"><em>ps</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a new Tate pairing state. </p>
+<p>Allocates memory and creates a new pairing state for Tate pairing.</p>
+<p>Use <a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758" title="Frees a previously allocated by Epid11PairingState. ">DeleteEpid11PairingState()</a> to free memory.</p>
+<p>This pairing operation is intended to support Intel(R) EPID 1.1 verification.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ga</td><td>The EcGroup from which the first parameter of the pairing will be taken. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">gb</td><td>The EcGroup from which the second parameter of the pairing will be taken. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The result finite field. Must be a Fq12 field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ps</td><td>Newly constructed pairing state.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ga, gb, and ff exist for the entire lifetime of the new Epid11PairingState.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758" title="Frees a previously allocated by Epid11PairingState. ">DeleteEpid11PairingState</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid11_pairing_primitives.js b/doc/html/group___epid11_pairing_primitives.js
new file mode 100644
index 0000000..53b346a
--- /dev/null
+++ b/doc/html/group___epid11_pairing_primitives.js
@@ -0,0 +1,7 @@
+var group___epid11_pairing_primitives =
+[
+ [ "Epid11PairingState", "group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b", null ],
+ [ "DeleteEpid11PairingState", "group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758", null ],
+ [ "Epid11Pairing", "group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059", null ],
+ [ "NewEpid11PairingState", "group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid11_types.html b/doc/html/group___epid11_types.html
new file mode 100644
index 0000000..ade8e36
--- /dev/null
+++ b/doc/html/group___epid11_types.html
@@ -0,0 +1,152 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Intel(R) EPID 1.1 specific types</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid11_types.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle">
+<div class="title">Intel(R) EPID 1.1 specific types<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 specific data types.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str80.html">OctStr80</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">80 bit octet string <a href="struct_oct_str80.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str600.html">OctStr600</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">600 bit octet string <a href="struct_oct_str600.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str768.html">OctStr768</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">768 bit octet string <a href="struct_oct_str768.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq3_elem_str.html">Fq3ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq3 element. <a href="struct_fq3_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G2 element. <a href="struct_epid11_g2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 GT element. <a href="struct_epid11_gt_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html">Epid11Params</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Parameters. <a href="struct_epid11_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group public key. <a href="struct_epid11_group_pub_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 basic signature. <a href="struct_epid11_basic_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 non-revoked Proof. <a href="struct_epid11_nr_proof.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html">Epid11Signature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Signature. <a href="struct_epid11_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 private-key based revocation list. <a href="struct_epid11_priv_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 entry in SigRL (B,K) <a href="struct_epid11_sig_rl_entry.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 signature based revocation list. <a href="struct_epid11_sig_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group revocation list. <a href="struct_epid11_group_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gadff9c05d5b7751024152b40dda545545"><td class="memItemLeft" align="right" valign="top"><a id="gadff9c05d5b7751024152b40dda545545"></a>
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a></td></tr>
+<tr class="memdesc:gadff9c05d5b7751024152b40dda545545"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G1 element. <br /></td></tr>
+<tr class="separator:gadff9c05d5b7751024152b40dda545545"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1f4f1d6f001895abe548cfb33611c23"><td class="memItemLeft" align="right" valign="top"><a id="gaf1f4f1d6f001895abe548cfb33611c23"></a>
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a></td></tr>
+<tr class="memdesc:gaf1f4f1d6f001895abe548cfb33611c23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Intel(R) EPID 1.1 G3 element. <br /></td></tr>
+<tr class="separator:gaf1f4f1d6f001895abe548cfb33611c23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7293cec8f937d6f5da42084403f978f1"><td class="memItemLeft" align="right" valign="top"><a id="ga7293cec8f937d6f5da42084403f978f1"></a>
+typedef <a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a></td></tr>
+<tr class="memdesc:ga7293cec8f937d6f5da42084403f978f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 group ID. <br /></td></tr>
+<tr class="separator:ga7293cec8f937d6f5da42084403f978f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Intel(R) EPID 1.1 specific data types. </p>
+<p>Defines serialized data types used by the SDK. These data types are only used by components that need to do Intel(R) EPID 1.1 verification.</p>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid11_types.js b/doc/html/group___epid11_types.js
new file mode 100644
index 0000000..4d71606
--- /dev/null
+++ b/doc/html/group___epid11_types.js
@@ -0,0 +1,97 @@
+var group___epid11_types =
+[
+ [ "OctStr80", "struct_oct_str80.html", [
+ [ "data", "struct_oct_str80.html#af80e2b81554109d9a41c5e771aceb8c9", null ]
+ ] ],
+ [ "OctStr600", "struct_oct_str600.html", [
+ [ "data", "struct_oct_str600.html#a06d53af92a06e1decc6062fd16c43a59", null ]
+ ] ],
+ [ "OctStr768", "struct_oct_str768.html", [
+ [ "data", "struct_oct_str768.html#ae45eea89259bd22e60a8d960063921cc", null ]
+ ] ],
+ [ "Fq3ElemStr", "struct_fq3_elem_str.html", [
+ [ "a", "struct_fq3_elem_str.html#af1be0a4d5c9c674d75bec34f95e3c731", null ]
+ ] ],
+ [ "Epid11G2ElemStr", "struct_epid11_g2_elem_str.html", [
+ [ "x", "struct_epid11_g2_elem_str.html#af28558484298f4f56377ededf57a4a04", null ],
+ [ "y", "struct_epid11_g2_elem_str.html#a9e8984e479bcbe8bd36c65e80c340032", null ]
+ ] ],
+ [ "Epid11GtElemStr", "struct_epid11_gt_elem_str.html", [
+ [ "a", "struct_epid11_gt_elem_str.html#aed8dd86f1696c2f3537154fc904bf2b0", null ]
+ ] ],
+ [ "Epid11Params", "struct_epid11_params.html", [
+ [ "a", "struct_epid11_params.html#a01381f84b2d747b6273e21c71c58a1b0", null ],
+ [ "a_tick", "struct_epid11_params.html#ae8770bb921aac9214ff8c45c41dbb228", null ],
+ [ "b", "struct_epid11_params.html#a27b45ed7771a3024d1d059b4b4ff6eae", null ],
+ [ "b_tick", "struct_epid11_params.html#ade3f88ce73d7de656ec67d9fdb0719d7", null ],
+ [ "coeff", "struct_epid11_params.html#aacc39ebe0cc625321039ffb6be0b0e87", null ],
+ [ "g1", "struct_epid11_params.html#a835e70da717cd5b0c94e242a6418a287", null ],
+ [ "g2", "struct_epid11_params.html#a1c6bbc4e066449d9c329f88cb653ef7c", null ],
+ [ "g3", "struct_epid11_params.html#a7eb9a1371d7187ae81bccfa8d5595033", null ],
+ [ "h", "struct_epid11_params.html#ae2d1dc635d9d7cba496c3d64fb6f9d5b", null ],
+ [ "h_tick", "struct_epid11_params.html#a0fe238db4ebc0225899dc2dac97d11c0", null ],
+ [ "orderG2", "struct_epid11_params.html#a02bd6fa2ab256e3a07533e947ab0101e", null ],
+ [ "p", "struct_epid11_params.html#a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a", null ],
+ [ "p_tick", "struct_epid11_params.html#a77a8350b97a7afb584a46eb5b32f03bf", null ],
+ [ "q", "struct_epid11_params.html#aad03fd1cc3955bb8879535fa7298123f", null ],
+ [ "q_tick", "struct_epid11_params.html#a49462f35596d07a456a731d0690fdd83", null ],
+ [ "qnr", "struct_epid11_params.html#af22cfcd6c7ec0e7e7369b79554b963bd", null ]
+ ] ],
+ [ "Epid11GroupPubKey", "struct_epid11_group_pub_key.html", [
+ [ "gid", "struct_epid11_group_pub_key.html#a964344b3c595bdd585bb9b5d9d0ea762", null ],
+ [ "h1", "struct_epid11_group_pub_key.html#a36f688472e2655052d485eac67d8c362", null ],
+ [ "h2", "struct_epid11_group_pub_key.html#aa724e9d2f0cb6019c05547d76a13b72a", null ],
+ [ "w", "struct_epid11_group_pub_key.html#a056c7138246e2bdcd47eaad501b756bb", null ]
+ ] ],
+ [ "Epid11BasicSignature", "struct_epid11_basic_signature.html", [
+ [ "B", "struct_epid11_basic_signature.html#a27fd7ae99d1ada652e21e7508a467c0b", null ],
+ [ "c", "struct_epid11_basic_signature.html#a9cc6efcd3d7270022779bd16776168ed", null ],
+ [ "K", "struct_epid11_basic_signature.html#a5882fcbfd272774e12e50a2d77f0b139", null ],
+ [ "nd", "struct_epid11_basic_signature.html#af18200712d2cf3ed3ccaee328e8a4e0f", null ],
+ [ "sa", "struct_epid11_basic_signature.html#aeb221cf52bc2b1a9bf6e0a9779bfd20f", null ],
+ [ "salpha", "struct_epid11_basic_signature.html#a1a73fc922f69e2499643dd4c53d0d42d", null ],
+ [ "sb", "struct_epid11_basic_signature.html#a29a700f3bec251600e18b2292081df4b", null ],
+ [ "sbeta", "struct_epid11_basic_signature.html#afe28bad6328f81e6f7af011cc96ac2e5", null ],
+ [ "sf", "struct_epid11_basic_signature.html#ae17b45194997a6fa13c6014a51ec711c", null ],
+ [ "sx", "struct_epid11_basic_signature.html#a2718346665210b7e26521bf4a15cb3bd", null ],
+ [ "sy", "struct_epid11_basic_signature.html#a911441845fc9b82d514133371b5ba87c", null ],
+ [ "T1", "struct_epid11_basic_signature.html#a58b058a9c5119a240177acfade328b3b", null ],
+ [ "T2", "struct_epid11_basic_signature.html#a267cf4e17d10584736b0c38f3668d822", null ]
+ ] ],
+ [ "Epid11NrProof", "struct_epid11_nr_proof.html", [
+ [ "c", "struct_epid11_nr_proof.html#a2e5ee8dc25d296538dce935397a93d68", null ],
+ [ "smu", "struct_epid11_nr_proof.html#a1ad7fe6b32c09f2504ee49731c0ad145", null ],
+ [ "snu", "struct_epid11_nr_proof.html#aa8406e938b2f87bded9e374e93a8ee5d", null ],
+ [ "T", "struct_epid11_nr_proof.html#a5ad9ba3bfac4eac37fd4a4e33ea65ddc", null ]
+ ] ],
+ [ "Epid11Signature", "struct_epid11_signature.html", [
+ [ "n2", "struct_epid11_signature.html#ad25c277223a5210063163ea554d08ad4", null ],
+ [ "rl_ver", "struct_epid11_signature.html#a43cb3ed13c862ff05a9292623ad57c5e", null ],
+ [ "sigma", "struct_epid11_signature.html#abf24a8df563ba3f535486d8dad7384f4", null ],
+ [ "sigma0", "struct_epid11_signature.html#a48526e73f02ad3f1544c4c71c481f153", null ]
+ ] ],
+ [ "Epid11PrivRl", "struct_epid11_priv_rl.html", [
+ [ "f", "struct_epid11_priv_rl.html#abbb75fee81aecb2dde7e2daab895ad3b", null ],
+ [ "gid", "struct_epid11_priv_rl.html#aa8945d81e30674b52a6d0900b64feb3c", null ],
+ [ "n1", "struct_epid11_priv_rl.html#ad95f880f40e2f40c723f5bdbd22ecfa2", null ],
+ [ "version", "struct_epid11_priv_rl.html#a2b3899f5a35bf64f860d6d91bccb03c8", null ]
+ ] ],
+ [ "Epid11SigRlEntry", "struct_epid11_sig_rl_entry.html", [
+ [ "b", "struct_epid11_sig_rl_entry.html#abe47cfbd00684941f93a211417bedf0c", null ],
+ [ "k", "struct_epid11_sig_rl_entry.html#a5de66e1352eafe95774a0d76bac8f01a", null ]
+ ] ],
+ [ "Epid11SigRl", "struct_epid11_sig_rl.html", [
+ [ "bk", "struct_epid11_sig_rl.html#a6473f8a98f76c9f82183041ea5ae17e3", null ],
+ [ "gid", "struct_epid11_sig_rl.html#ad45b0e3e1be59649150dd34c104000ac", null ],
+ [ "n2", "struct_epid11_sig_rl.html#a8c654d43df132db7874f4c84c177dc12", null ],
+ [ "version", "struct_epid11_sig_rl.html#aa38674729293f4879ff94328dd3c59b1", null ]
+ ] ],
+ [ "Epid11GroupRl", "struct_epid11_group_rl.html", [
+ [ "gid", "struct_epid11_group_rl.html#a97f165c59bc447e3ca3c2148a096710f", null ],
+ [ "n3", "struct_epid11_group_rl.html#a35cb954f598d4006b0f047cde77010a5", null ],
+ [ "version", "struct_epid11_group_rl.html#a63afa9863e8dcb63ff884e6e4093c481", null ]
+ ] ],
+ [ "Epid11G1ElemStr", "group___epid11_types.html#gadff9c05d5b7751024152b40dda545545", null ],
+ [ "Epid11G3ElemStr", "group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23", null ],
+ [ "Epid11GroupId", "group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid11_verifier_module.html b/doc/html/group___epid11_verifier_module.html
new file mode 100644
index 0000000..b75c7f3
--- /dev/null
+++ b/doc/html/group___epid11_verifier_module.html
@@ -0,0 +1,806 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Intel(R) EPID 1.1 support</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid11_verifier_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Intel(R) EPID 1.1 support<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_verifier_module.html">verifier</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 Verifier functionality.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Pre-computed verifier settings. <a href="struct_epid11_verifier_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gabe6a864a06322205ae7536ffea34c702"><td class="memItemLeft" align="right" valign="top"><a id="gabe6a864a06322205ae7536ffea34c702"></a>
+typedef struct <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a></td></tr>
+<tr class="memdesc:gabe6a864a06322205ae7536ffea34c702"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal context of Intel(R) EPID 1.1 verifier. <br /></td></tr>
+<tr class="separator:gabe6a864a06322205ae7536ffea34c702"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8">Epid11VerifierCreate</a> (<a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> const *pub_key, <a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> const *precomp, <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new Intel(R) EPID 1.1 verifier context. <a href="#gac5a8f8d7624063ea428d81dbdbf61fa8">More...</a><br /></td></tr>
+<tr class="separator:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1">Epid11VerifierDelete</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing Intel(R) EPID 1.1 verifier context. <a href="#ga63cae8d5abcf4d7e3af4157de18998f1">More...</a><br /></td></tr>
+<tr class="separator:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga241520cb925e5be89893a2037451cf1c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c">Epid11VerifierWritePrecomp</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> *precomp)</td></tr>
+<tr class="memdesc:ga241520cb925e5be89893a2037451cf1c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the pre-computed Intel(R) EPID 1.1 verifier settings. <a href="#ga241520cb925e5be89893a2037451cf1c">More...</a><br /></td></tr>
+<tr class="separator:ga241520cb925e5be89893a2037451cf1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14">Epid11VerifierSetPrivRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> const *priv_rl, size_t priv_rl_size)</td></tr>
+<tr class="memdesc:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 private key based revocation list. <a href="#gaffbe6ac2bc7236ad65126a17ebdceb14">More...</a><br /></td></tr>
+<tr class="separator:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8">Epid11VerifierSetSigRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 signature based revocation list. <a href="#gaff5a014b0334be7e8583f0f99cb5e9b8">More...</a><br /></td></tr>
+<tr class="separator:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga809c777908b2f9d029062d9424cb5f65"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65">Epid11VerifierSetGroupRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> const *grp_rl, size_t grp_rl_size)</td></tr>
+<tr class="memdesc:ga809c777908b2f9d029062d9424cb5f65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 group based revocation list. <a href="#ga809c777908b2f9d029062d9424cb5f65">More...</a><br /></td></tr>
+<tr class="separator:ga809c777908b2f9d029062d9424cb5f65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">Epid11VerifierSetBasename</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the basename to be used by a verifier. <a href="#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">More...</a><br /></td></tr>
+<tr class="separator:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216">Epid11Verify</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_signature.html">Epid11Signature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 signature and checks revocation status. <a href="#gafe5ad6bde38ad0c3e0a9960975fd5216">More...</a><br /></td></tr>
+<tr class="separator:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7">Epid11AreSigsLinked</a> (<a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig1, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig2)</td></tr>
+<tr class="memdesc:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if two Intel(R) EPID 1.1 signatures are linked. <a href="#gab0b6560b226a37321f5ca5d4fb55eba7">More...</a><br /></td></tr>
+<tr class="separator:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7b5d19277da043c2b79721975d7bd070"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070">Epid11VerifyBasicSig</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:ga7b5d19277da043c2b79721975d7bd070"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 member signature without revocation checks. <a href="#ga7b5d19277da043c2b79721975d7bd070">More...</a><br /></td></tr>
+<tr class="separator:ga7b5d19277da043c2b79721975d7bd070"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813">Epid11NrVerify</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, void const *msg, size_t msg_len, <a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a> const *sigrl_entry, <a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a> const *proof)</td></tr>
+<tr class="memdesc:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry. <a href="#ga3a2e320d7de6156b2ce9d73e9cdce813">More...</a><br /></td></tr>
+<tr class="separator:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b79c79d09e3551158e1c38c7c335929"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929">Epid11CheckPrivRlEntry</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f)</td></tr>
+<tr class="memdesc:ga0b79c79d09e3551158e1c38c7c335929"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list. <a href="#ga0b79c79d09e3551158e1c38c7c335929">More...</a><br /></td></tr>
+<tr class="separator:ga0b79c79d09e3551158e1c38c7c335929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Intel(R) EPID 1.1 Verifier functionality. </p>
+<p>To verify signatures coming from member devices that belong to an Intel&reg; EPID 1.1 group, you need to use Intel&reg; EPID 1.1 verifier APIs.</p>
+<p>If you are acting as a verifier for both Intel&reg; EPID 1.1 and 2.0 members, you can determine if you need version 1.1 or 2.0 verification by checking the Intel&reg; EPID version field in the group public key file (see <a class="el" href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55" title="Extracts Intel(R) EPID Binary Output File header information. ">EpidParseFileHeader</a>). You can also check the version in other binary issuer material, such as the GroupRL and SigRL.</p>
+<p>The 1.1 verifier APIs take a verifier context as input. Each verifier context (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702" title="Internal context of Intel(R) EPID 1.1 verifier. ">Epid11VerifierCtx</a>) represents a verifier for a single group.</p>
+<p>The Intel&reg; EPID 1.1 specification does not provide hash algorithm selection and verifier blacklist revocation. Therefore, APIs such as <a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92" title="Sets the hash algorithm to be used by a verifier. ">EpidVerifierSetHashAlg</a> and <a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a> are not available.</p>
+<p>You can find the Intel&reg; EPID 1.1 API headers in the 1.1 directories, for example, <code>epid/verifier/1.1/api.h</code>.</p>
+<p>Intel&reg; EPID 1.1 APIs and data structures are indicated with the "Epid11" prefix. For example, the Intel&reg; EPID 1.1 version of <a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb" title="Extracts group public key from buffer in issuer binary format. ">EpidParseGroupPubKeyFile</a> is called <a class="el" href="group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c" title="Extracts group public key from buffer in issuer binary format. ">Epid11ParseGroupPubKeyFile</a>, and the Intel&reg; EPID 1.1 version of <code><a class="el" href="struct_group_rl.html" title="group revocation list ">GroupRl</a></code> is <code><a class="el" href="struct_epid11_group_rl.html" title="Intel(R) EPID 1.1 group revocation list. ">Epid11GroupRl</a></code>. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gab0b6560b226a37321f5ca5d4fb55eba7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0b6560b226a37321f5ca5d4fb55eba7">&#9670;&nbsp;</a></span>Epid11AreSigsLinked()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> Epid11AreSigsLinked </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if two Intel(R) EPID 1.1 signatures are linked. </p>
+<p>The Intel(R) EPID scheme allows signatures to be linked. If basename option is specified when signing signatures with the same basename will be linkable. This linking capability allows the verifier, or anyone, to know whether two Intel(R) EPID signatures are generated by the same member.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig1</td><td>A basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig2</td><td>A basic signature.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>bool</dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname">true</td><td>if the signatures were generated by the same member </td></tr>
+ <tr><td class="paramname">false</td><td>if it couldn't be determined if the signatures were generated by the same member</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>The input signatures should be verified using <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig()</a> before invocation. Behavior is undefined if either of the signatures cannot be verified.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga0b79c79d09e3551158e1c38c7c335929"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0b79c79d09e3551158e1c38c7c335929">&#9670;&nbsp;</a></span>Epid11CheckPrivRlEntry()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11CheckPrivRlEntry </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>f</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">f</td><td>The private key based revocation list entry.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>Sig should be verified using <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig()</a> before invocation. Behavior is undefined if sig cannot be verified.</dd>
+<dd>
+This function should be used in conjunction with <a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813" title="Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry...">Epid11NrVerify()</a> and <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verify should de considered to have failed.</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813" title="Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry...">Epid11NrVerify</a> </dd>
+<dd>
+<a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3a2e320d7de6156b2ce9d73e9cdce813"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3a2e320d7de6156b2ce9d73e9cdce813">&#9670;&nbsp;</a></span>Epid11NrVerify()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11NrVerify </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a> const *&#160;</td>
+ <td class="paramname"><em>sigrl_entry</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a> const *&#160;</td>
+ <td class="paramname"><em>proof</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sigrl_entry</td><td>The signature based revocation list entry. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">proof</td><td>The non-revoked proof.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>Sig should be verified using <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig()</a> before invocation. Behavior is undefined if sig cannot be verified.</dd>
+<dd>
+This function should be used in conjunction with <a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig()</a> and <a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929" title="Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list...">Epid11CheckPrivRlEntry()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verify should de considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070" title="Verifies an Intel(R) EPID 1.1 member signature without revocation checks. ">Epid11VerifyBasicSig</a> </dd>
+<dd>
+<a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929" title="Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list...">Epid11CheckPrivRlEntry</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gac5a8f8d7624063ea428d81dbdbf61fa8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac5a8f8d7624063ea428d81dbdbf61fa8">&#9670;&nbsp;</a></span>Epid11VerifierCreate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierCreate </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> const *&#160;</td>
+ <td class="paramname"><em>precomp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new Intel(R) EPID 1.1 verifier context. </p>
+<p>Must be called to create the verifier context that is used by other "Verifier" APIs.</p>
+<p>Allocates memory for the context, then initialize it.</p>
+<p><a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1" title="Deletes an existing Intel(R) EPID 1.1 verifier context. ">Epid11VerifierDelete()</a> must be called to safely release the member context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">precomp</td><td>Optional pre-computed data. If NULL the value is computed internally and is readable using <a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c" title="Serializes the pre-computed Intel(R) EPID 1.1 verifier settings. ">Epid11VerifierWritePrecomp()</a>. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ctx</td><td>Newly constructed verifier context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the content of ctx is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1" title="Deletes an existing Intel(R) EPID 1.1 verifier context. ">Epid11VerifierDelete</a> </dd>
+<dd>
+<a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c" title="Serializes the pre-computed Intel(R) EPID 1.1 verifier settings. ">Epid11VerifierWritePrecomp</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga63cae8d5abcf4d7e3af4157de18998f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga63cae8d5abcf4d7e3af4157de18998f1">&#9670;&nbsp;</a></span>Epid11VerifierDelete()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Epid11VerifierDelete </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes an existing Intel(R) EPID 1.1 verifier context. </p>
+<p>Must be called to safely release a verifier context created using <a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate()</a>.</p>
+<p>De-initializes the context, frees memory used by the context, and sets the context pointer to NULL.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">&#9670;&nbsp;</a></span>Epid11VerifierSetBasename()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierSetBasename </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>basename_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the basename to be used by a verifier. </p>
+<p>This API allows setting a zero length base name.</p>
+<dl class="section warning"><dt>Warning</dt><dd>Not all members in the Intel(R) EPID 1.1 ecosystem may support zero length basenames. They may interpret a zero length basename as random base.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename</td><td>The basename. Pass NULL for random base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename_len</td><td>Number of bytes in basename buffer. Must be 0 if basename is NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga809c777908b2f9d029062d9424cb5f65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga809c777908b2f9d029062d9424cb5f65">&#9670;&nbsp;</a></span>Epid11VerifierSetGroupRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierSetGroupRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> const *&#160;</td>
+ <td class="paramname"><em>grp_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>grp_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the Intel(R) EPID 1.1 group based revocation list. </p>
+<p>The caller is responsible to for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call will fail if trying to set an older version of the revocation list than was last set.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by grp_rl will be accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list will be undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by grp_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">grp_rl</td><td>The group based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">grp_rl_size</td><td>The size of the group based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the group based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gaffbe6ac2bc7236ad65126a17ebdceb14"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaffbe6ac2bc7236ad65126a17ebdceb14">&#9670;&nbsp;</a></span>Epid11VerifierSetPrivRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierSetPrivRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> const *&#160;</td>
+ <td class="paramname"><em>priv_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>priv_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the Intel(R) EPID 1.1 private key based revocation list. </p>
+<p>The caller is responsible to for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call will fail if trying to set an older version of the revocation list than was last set.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by priv_rl will be accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list will be undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by priv_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">priv_rl</td><td>The private key based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">priv_rl_size</td><td>The size of the private key based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the private key based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gaff5a014b0334be7e8583f0f99cb5e9b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaff5a014b0334be7e8583f0f99cb5e9b8">&#9670;&nbsp;</a></span>Epid11VerifierSetSigRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierSetSigRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> const *&#160;</td>
+ <td class="paramname"><em>sig_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the Intel(R) EPID 1.1 signature based revocation list. </p>
+<p>The caller is responsible to for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call will fail if trying to set an older version of the revocation list than was last set.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by sig_rl will be accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list will be undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by sig_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl</td><td>The signature based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl_size</td><td>The size of the signature based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the signature based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+SdkOverview_11Verifier </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga241520cb925e5be89893a2037451cf1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga241520cb925e5be89893a2037451cf1c">&#9670;&nbsp;</a></span>Epid11VerifierWritePrecomp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifierWritePrecomp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> *&#160;</td>
+ <td class="paramname"><em>precomp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes the pre-computed Intel(R) EPID 1.1 verifier settings. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">precomp</td><td>The Serialized pre-computed verifier settings.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the content of precomp is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="gafe5ad6bde38ad0c3e0a9960975fd5216"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafe5ad6bde38ad0c3e0a9960975fd5216">&#9670;&nbsp;</a></span>Epid11Verify()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11Verify </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_signature.html">Epid11Signature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies an Intel(R) EPID 1.1 signature and checks revocation status. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_len</td><td>The size of sig in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e" title="Signature is valid. ">kEpidSigValid</a></td><td>Signature validated successfully </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Signature is invalid </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5" title="Signature revoked in GroupRl. ">kEpidSigRevokedInGroupRl</a></td><td>Signature revoked in <a class="el" href="struct_group_rl.html" title="group revocation list ">GroupRl</a> </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1" title="Signature revoked in PrivRl. ">kEpidSigRevokedInPrivRl</a></td><td>Signature revoked in <a class="el" href="struct_priv_rl.html" title="private-key based revocation list. ">PrivRl</a> </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c" title="Signature revoked in SigRl. ">kEpidSigRevokedInSigRl</a></td><td>Signature revoked in <a class="el" href="struct_sig_rl.html" title="signature based revocation list ">SigRl</a></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> or one of the values listed above the verify should de considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7b5d19277da043c2b79721975d7bd070"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7b5d19277da043c2b79721975d7bd070">&#9670;&nbsp;</a></span>Epid11VerifyBasicSig()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Epid11VerifyBasicSig </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies an Intel(R) EPID 1.1 member signature without revocation checks. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>This function should be used in conjunction with <a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813" title="Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry...">Epid11NrVerify()</a> and <a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929" title="Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list...">Epid11CheckPrivRlEntry()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verify should be considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8" title="Creates a new Intel(R) EPID 1.1 verifier context. ">Epid11VerifierCreate</a> </dd>
+<dd>
+<a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid11_verifier_module.js b/doc/html/group___epid11_verifier_module.js
new file mode 100644
index 0000000..b686765
--- /dev/null
+++ b/doc/html/group___epid11_verifier_module.js
@@ -0,0 +1,22 @@
+var group___epid11_verifier_module =
+[
+ [ "Epid11VerifierPrecomp", "struct_epid11_verifier_precomp.html", [
+ [ "e12", "struct_epid11_verifier_precomp.html#a0a980adb039089263ec59a995600ee91", null ],
+ [ "e22", "struct_epid11_verifier_precomp.html#ad0ff2a13c2c87460296900dde72a2f30", null ],
+ [ "e2w", "struct_epid11_verifier_precomp.html#a14ebadf105aff085edb9a817a2d1db89", null ],
+ [ "gid", "struct_epid11_verifier_precomp.html#a03138e937f4488bdbc52ed473dc313da", null ]
+ ] ],
+ [ "Epid11VerifierCtx", "group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702", null ],
+ [ "Epid11AreSigsLinked", "group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7", null ],
+ [ "Epid11CheckPrivRlEntry", "group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929", null ],
+ [ "Epid11NrVerify", "group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813", null ],
+ [ "Epid11VerifierCreate", "group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8", null ],
+ [ "Epid11VerifierDelete", "group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1", null ],
+ [ "Epid11VerifierSetBasename", "group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0", null ],
+ [ "Epid11VerifierSetGroupRl", "group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65", null ],
+ [ "Epid11VerifierSetPrivRl", "group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14", null ],
+ [ "Epid11VerifierSetSigRl", "group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8", null ],
+ [ "Epid11VerifierWritePrecomp", "group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c", null ],
+ [ "Epid11Verify", "group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216", null ],
+ [ "Epid11VerifyBasicSig", "group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_common.html b/doc/html/group___epid_common.html
new file mode 100644
index 0000000..e32a173
--- /dev/null
+++ b/doc/html/group___epid_common.html
@@ -0,0 +1,141 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: common</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_common.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle">
+<div class="title">common<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Common code shared between core sub-components.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid_math"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_math.html">math</a></td></tr>
+<tr class="memdesc:group___epid_math"><td class="mdescLeft">&#160;</td><td class="mdescRight">Math Primitives and Group Operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___error_codes"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___error_codes.html">errors</a></td></tr>
+<tr class="memdesc:group___error_codes"><td class="mdescLeft">&#160;</td><td class="mdescRight">Error reporting interface. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___file_parser"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html">fileparser</a></td></tr>
+<tr class="memdesc:group___file_parser"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parser for issuer material. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___epid_print"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html">print_utils</a></td></tr>
+<tr class="memdesc:group___epid_print"><td class="mdescLeft">&#160;</td><td class="mdescRight">Debug print routines. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___epid_types"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html">types</a></td></tr>
+<tr class="memdesc:group___epid_types"><td class="mdescLeft">&#160;</td><td class="mdescRight">SDK data types. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="memItemLeft" align="right" valign="top">typedef int(__STDCALL *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>) (unsigned int *rand_data, int num_bits, void *user_data)</td></tr>
+<tr class="memdesc:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates random data. <a href="#ga6119a2c0323a3fca9e502b24bc378c2c">More...</a><br /></td></tr>
+<tr class="separator:ga6119a2c0323a3fca9e502b24bc378c2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Common code shared between core sub-components. </p>
+<p>Constants, utility functions, and libraries that are used widely in the implementation or definition of APIs and samples. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga6119a2c0323a3fca9e502b24bc378c2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6119a2c0323a3fca9e502b24bc378c2c">&#9670;&nbsp;</a></span>BitSupplier</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef int(__STDCALL* BitSupplier) (unsigned int *rand_data, int num_bits, void *user_data)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generates random data. </p>
+<p>The SDK provides the <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> as a function prototype so that you will know the requirements for your own implementation of a random number generator.</p>
+<p>You need to pass a pointer to your implementation of the random number generator into methods that require it.</p>
+<p>For an example of how a BitSupplier is created, see the <code>signmsg</code> example.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">rand_data</td><td>destination buffer for random data generated by BitSupplier. The buffer will receive <code>num_bits</code> of random data. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">num_bits</td><td>specifies the size of the random data, in bits, to be generated. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">user_data</td><td>user data that will be passed to the random number generator. The usage of this data is specific to the implementation of the BitSupplier. For example, this could be used to pass a pointer to a data structure that maintains state across calls to your BitSupplier.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success and non-zero value on error. </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_common.js b/doc/html/group___epid_common.js
new file mode 100644
index 0000000..70dc2de
--- /dev/null
+++ b/doc/html/group___epid_common.js
@@ -0,0 +1,9 @@
+var group___epid_common =
+[
+ [ "math", "group___epid_math.html", "group___epid_math" ],
+ [ "errors", "group___error_codes.html", "group___error_codes" ],
+ [ "fileparser", "group___file_parser.html", "group___file_parser" ],
+ [ "print_utils", "group___epid_print.html", "group___epid_print" ],
+ [ "types", "group___epid_types.html", "group___epid_types" ],
+ [ "BitSupplier", "group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_math.html b/doc/html/group___epid_math.html
new file mode 100644
index 0000000..f6485f7
--- /dev/null
+++ b/doc/html/group___epid_math.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: math</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_math.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> </div>
+ <div class="headertitle">
+<div class="title">math<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Math Primitives and Group Operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___big_num_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___big_num_primitives.html">bignum</a></td></tr>
+<tr class="memdesc:group___big_num_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Big number operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___ecdsa_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ecdsa_primitives.html">ecdsa</a></td></tr>
+<tr class="memdesc:group___ecdsa_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Elliptic Curve Digital Signature Algorithm Primitives. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___ec_group_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___ec_group_primitives.html">ecgroup</a></td></tr>
+<tr class="memdesc:group___ec_group_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Elliptic curve group operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___finite_field_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html">finitefield</a></td></tr>
+<tr class="memdesc:group___finite_field_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finite field operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___hash_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___hash_primitives.html">hash</a></td></tr>
+<tr class="memdesc:group___hash_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash primitives. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___pairing_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html">pairing</a></td></tr>
+<tr class="memdesc:group___pairing_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pairing operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Math Primitives and Group Operations. </p>
+<p>Provides abstracted math primitives that are designed to be overridden by implementers porting to environments with specialized hardware. This module is defined and tested to hide implementation details from users of the API </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_math.js b/doc/html/group___epid_math.js
new file mode 100644
index 0000000..c416f54
--- /dev/null
+++ b/doc/html/group___epid_math.js
@@ -0,0 +1,9 @@
+var group___epid_math =
+[
+ [ "bignum", "group___big_num_primitives.html", "group___big_num_primitives" ],
+ [ "ecdsa", "group___ecdsa_primitives.html", "group___ecdsa_primitives" ],
+ [ "ecgroup", "group___ec_group_primitives.html", "group___ec_group_primitives" ],
+ [ "finitefield", "group___finite_field_primitives.html", "group___finite_field_primitives" ],
+ [ "hash", "group___hash_primitives.html", "group___hash_primitives" ],
+ [ "pairing", "group___pairing_primitives.html", "group___pairing_primitives" ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_member_module.html b/doc/html/group___epid_member_module.html
new file mode 100644
index 0000000..ff1c0d8
--- /dev/null
+++ b/doc/html/group___epid_member_module.html
@@ -0,0 +1,991 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: member</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_member_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">member<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Member functionality.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___tpm2_module"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html">tpm2</a></td></tr>
+<tr class="memdesc:group___tpm2_module"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal interface that models TPM 2.0 interfaces. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_params.html">MemberParams</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software only specific member parameters. <a href="struct_member_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">EpidMemberCreate</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **ctx)</td></tr>
+<tr class="memdesc:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates and initializes a new member context. <a href="#gae7a7b01bc0a84c44c9d14e6c311c1ba7">More...</a><br /></td></tr>
+<tr class="separator:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">EpidMemberGetSize</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, size_t *context_size)</td></tr>
+<tr class="memdesc:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the size in bytes required for a member context. <a href="#ga2b3c0cc1d8d4e50190ca94656fa36e24">More...</a><br /></td></tr>
+<tr class="separator:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">EpidMemberInit</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a new member context. <a href="#ga35273b8e75d51e312f0d2fd3aa094efb">More...</a><br /></td></tr>
+<tr class="separator:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3">EpidCreateJoinRequest</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">IssuerNonce</a> const *ni, <a class="el" href="struct_join_request.html">JoinRequest</a> *join_request)</td></tr>
+<tr class="memdesc:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a request to join a group. <a href="#gac10008d8c9ba7bc5e5be899ed03c61c3">More...</a><br /></td></tr>
+<tr class="separator:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga788ebc9d1ba6153c637b762484ca1140"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">EpidProvisionCredential</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_membership_credential.html">MembershipCredential</a> const *credential, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga788ebc9d1ba6153c637b762484ca1140"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a membership credential. <a href="#ga788ebc9d1ba6153c637b762484ca1140">More...</a><br /></td></tr>
+<tr class="separator:ga788ebc9d1ba6153c637b762484ca1140"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea">EpidProvisionCompressed</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *compressed_privkey, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a compressed private key. <a href="#ga76cddb8e20afc43de2c30d5e4addb2ea">More...</a><br /></td></tr>
+<tr class="separator:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga07094399c1e040b95ae3e58a74e7c302"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">EpidProvisionKey</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_priv_key.html">PrivKey</a> const *priv_key, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga07094399c1e040b95ae3e58a74e7c302"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a private key. <a href="#ga07094399c1e040b95ae3e58a74e7c302">More...</a><br /></td></tr>
+<tr class="separator:ga07094399c1e040b95ae3e58a74e7c302"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">EpidMemberStartup</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Change member from setup state to normal operation. <a href="#gaa2c85b1f0ea17a11ac5d297b21aa30f6">More...</a><br /></td></tr>
+<tr class="separator:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98b4d990a885339b83cd0513fedcc76d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">EpidMemberDeinit</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga98b4d990a885339b83cd0513fedcc76d"><td class="mdescLeft">&#160;</td><td class="mdescRight">De-initializes an existing member context buffer. <a href="#ga98b4d990a885339b83cd0513fedcc76d">More...</a><br /></td></tr>
+<tr class="separator:ga98b4d990a885339b83cd0513fedcc76d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3824589c683c5e0e59d483462fce65d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">EpidMemberDelete</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga3824589c683c5e0e59d483462fce65d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing member context. <a href="#ga3824589c683c5e0e59d483462fce65d6">More...</a><br /></td></tr>
+<tr class="separator:ga3824589c683c5e0e59d483462fce65d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9998eb454838ff5d232ff22ecbab31bf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">EpidMemberSetHashAlg</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga9998eb454838ff5d232ff22ecbab31bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a member. <a href="#ga9998eb454838ff5d232ff22ecbab31bf">More...</a><br /></td></tr>
+<tr class="separator:ga9998eb454838ff5d232ff22ecbab31bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaae6f21f58c22fce58076f10d68159f4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">EpidMemberSetSigRl</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:gaaae6f21f58c22fce58076f10d68159f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the signature based revocation list to be used by a member. <a href="#gaaae6f21f58c22fce58076f10d68159f4">More...</a><br /></td></tr>
+<tr class="separator:gaaae6f21f58c22fce58076f10d68159f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76e535722467af7c16809b5b521e0000"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">EpidGetSigSize</a> (<a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl)</td></tr>
+<tr class="memdesc:ga76e535722467af7c16809b5b521e0000"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the size in bytes required for an Intel(R) EPID signature. <a href="#ga76e535722467af7c16809b5b521e0000">More...</a><br /></td></tr>
+<tr class="separator:ga76e535722467af7c16809b5b521e0000"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga74d1409a816cb52633564b793072da5f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">EpidSign</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *ctx, void const *msg, size_t msg_len, void const *basename, size_t basename_len, <a class="el" href="struct_epid_signature.html">EpidSignature</a> *sig, size_t sig_len)</td></tr>
+<tr class="memdesc:ga74d1409a816cb52633564b793072da5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes an Intel(R) EPID signature. <a href="#ga74d1409a816cb52633564b793072da5f">More...</a><br /></td></tr>
+<tr class="separator:ga74d1409a816cb52633564b793072da5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c6f097ba89542664375bd5e0f205220"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">EpidRegisterBasename</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga8c6f097ba89542664375bd5e0f205220"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a basename with a member. <a href="#ga8c6f097ba89542664375bd5e0f205220">More...</a><br /></td></tr>
+<tr class="separator:ga8c6f097ba89542664375bd5e0f205220"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3">EpidClearRegisteredBasenames</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears registered basenames. <a href="#ga4f3a464f14581ef3e5a50719cb4709c3">More...</a><br /></td></tr>
+<tr class="separator:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb0547ec085a9ed324d323416bce4a78"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78">EpidAddPreSigs</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, size_t number_presigs)</td></tr>
+<tr class="memdesc:gacb0547ec085a9ed324d323416bce4a78"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extends the member's pool of pre-computed signatures. <a href="#gacb0547ec085a9ed324d323416bce4a78">More...</a><br /></td></tr>
+<tr class="separator:gacb0547ec085a9ed324d323416bce4a78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad78ca056dfea2565bbacd5734d9dc075"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075">EpidGetNumPreSigs</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *ctx)</td></tr>
+<tr class="memdesc:gad78ca056dfea2565bbacd5734d9dc075"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the number of pre-computed signatures in the member's pool. <a href="#gad78ca056dfea2565bbacd5734d9dc075">More...</a><br /></td></tr>
+<tr class="separator:gad78ca056dfea2565bbacd5734d9dc075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf8cd05388f017486f14da2ee48d067ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">EpidDecompressPrivKey</a> (<a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *compressed_privkey, <a class="el" href="struct_priv_key.html">PrivKey</a> *priv_key)</td></tr>
+<tr class="memdesc:gaf8cd05388f017486f14da2ee48d067ef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decompresses compressed member private key. <a href="#gaf8cd05388f017486f14da2ee48d067ef">More...</a><br /></td></tr>
+<tr class="separator:gaf8cd05388f017486f14da2ee48d067ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Member functionality. </p>
+<p>Defines the APIs needed by Intel(R) EPID members. Each member context (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817" title="Internal context of member. ">MemberCtx</a>) represents membership in a single group.</p>
+<p>To use this module, include the header <a class="el" href="member_2api_8h.html" title="Intel(R) EPID SDK member API. ">epid/member/api.h</a>. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gacb0547ec085a9ed324d323416bce4a78"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacb0547ec085a9ed324d323416bce4a78">&#9670;&nbsp;</a></span>EpidAddPreSigs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidAddPreSigs </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>number_presigs</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extends the member's pool of pre-computed signatures. </p>
+<p>Generate new pre-computed signatures and add them to the internal pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">number_presigs</td><td>The number of pre-computed signatures to add to the internal pool.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga4f3a464f14581ef3e5a50719cb4709c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4f3a464f14581ef3e5a50719cb4709c3">&#9670;&nbsp;</a></span>EpidClearRegisteredBasenames()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidClearRegisteredBasenames </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clears registered basenames. </p>
+<p>Allows clearing registered basenames without recreating member.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220" title="Registers a basename with a member. ">EpidRegisterBasename</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac10008d8c9ba7bc5e5be899ed03c61c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac10008d8c9ba7bc5e5be899ed03c61c3">&#9670;&nbsp;</a></span>EpidCreateJoinRequest()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidCreateJoinRequest </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">IssuerNonce</a> const *&#160;</td>
+ <td class="paramname"><em>ni</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_join_request.html">JoinRequest</a> *&#160;</td>
+ <td class="paramname"><em>join_request</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a request to join a group. </p>
+<p>The created request is part of the interaction with an issuer needed to join a group. This interaction with the issuer is outside the scope of this API.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate of group to join. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ni</td><td>The nonce chosen by issuer as part of join protocol. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">join_request</td><td>The join request.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf8cd05388f017486f14da2ee48d067ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf8cd05388f017486f14da2ee48d067ef">&#9670;&nbsp;</a></span>EpidDecompressPrivKey()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidDecompressPrivKey </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *&#160;</td>
+ <td class="paramname"><em>compressed_privkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_priv_key.html">PrivKey</a> *&#160;</td>
+ <td class="paramname"><em>priv_key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Decompresses compressed member private key. </p>
+<p>Converts a compressed member private key into a member private key for use by other member APIs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The public key of the group. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">compressed_privkey</td><td>The compressed member private key to be decompressed. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">priv_key</td><td>The member private key.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gad78ca056dfea2565bbacd5734d9dc075"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad78ca056dfea2565bbacd5734d9dc075">&#9670;&nbsp;</a></span>EpidGetNumPreSigs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t EpidGetNumPreSigs </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Gets the number of pre-computed signatures in the member's pool. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of remaining pre-computed signatures. Returns 0 if ctx is NULL.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga76e535722467af7c16809b5b521e0000"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76e535722467af7c16809b5b521e0000">&#9670;&nbsp;</a></span>EpidGetSigSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t EpidGetSigSize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_sig_rl.html">SigRl</a> const *&#160;</td>
+ <td class="paramname"><em>sig_rl</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes the size in bytes required for an Intel(R) EPID signature. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl</td><td>The signature based revocation list that is used. NULL is treated as a zero length list.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Size in bytes of an Intel(R) EPID signature including proofs for each entry in the signature based revocation list.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="struct_sig_rl.html" title="signature based revocation list ">SigRl</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gae7a7b01bc0a84c44c9d14e6c311c1ba7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7a7b01bc0a84c44c9d14e6c311c1ba7">&#9670;&nbsp;</a></span>EpidMemberCreate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberCreate </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_member_params.html">MemberParams</a> const *&#160;</td>
+ <td class="paramname"><em>params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Allocates and initializes a new member context. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">params</td><td>Implementation specific configuration parameters. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ctx</td><td>Newly constructed member context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section warning"><dt>Warning</dt><dd>buffers allocated using this function should not be initialized with <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>.</dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This API has been superseded by <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> and <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>.</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga98b4d990a885339b83cd0513fedcc76d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga98b4d990a885339b83cd0513fedcc76d">&#9670;&nbsp;</a></span>EpidMemberDeinit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EpidMemberDeinit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>De-initializes an existing member context buffer. </p>
+<p>Must be called to safely release a member context initialized using <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>.</p>
+<p>De-initializes the context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section warning"><dt>Warning</dt><dd>This function should not be used on buffers allocated with <a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7" title="Allocates and initializes a new member context. ">EpidMemberCreate</a>. Those buffers should be released using <a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6" title="Deletes an existing member context. ">EpidMemberDelete</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3824589c683c5e0e59d483462fce65d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3824589c683c5e0e59d483462fce65d6">&#9670;&nbsp;</a></span>EpidMemberDelete()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EpidMemberDelete </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes an existing member context. </p>
+<p>Must be called to safely release a member context created using <a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7" title="Allocates and initializes a new member context. ">EpidMemberCreate</a>.</p>
+<p>De-initializes the context, frees memory used by the context, and sets the context pointer to NULL.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This API has been superseded by <a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d" title="De-initializes an existing member context buffer. ">EpidMemberDeinit</a>.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7" title="Allocates and initializes a new member context. ">EpidMemberCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga2b3c0cc1d8d4e50190ca94656fa36e24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2b3c0cc1d8d4e50190ca94656fa36e24">&#9670;&nbsp;</a></span>EpidMemberGetSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberGetSize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_member_params.html">MemberParams</a> const *&#160;</td>
+ <td class="paramname"><em>params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>context_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes the size in bytes required for a member context. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">params</td><td>Implementation specific configuration parameters. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">context_size</td><td>Number of bytes required for a <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817" title="Internal context of member. ">MemberCtx</a> buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga35273b8e75d51e312f0d2fd3aa094efb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga35273b8e75d51e312f0d2fd3aa094efb">&#9670;&nbsp;</a></span>EpidMemberInit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberInit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_member_params.html">MemberParams</a> const *&#160;</td>
+ <td class="paramname"><em>params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Initializes a new member context. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">params</td><td>Implementation specific configuration parameters. </td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>An existing buffer that will be used as a <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817" title="Internal context of member. ">MemberCtx</a>.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section warning"><dt>Warning</dt><dd>ctx must be a buffer of at least the size reported by <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> for the same parameters.</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga9998eb454838ff5d232ff22ecbab31bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9998eb454838ff5d232ff22ecbab31bf">&#9670;&nbsp;</a></span>EpidMemberSetHashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberSetHashAlg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the hash algorithm to be used by a member. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>The hash algorithm to use.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a>, the hash algorithm used by the member is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd>
+<dd>
+<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890" title="Recognized hash algorithms. ">HashAlg</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gaaae6f21f58c22fce58076f10d68159f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaae6f21f58c22fce58076f10d68159f4">&#9670;&nbsp;</a></span>EpidMemberSetSigRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberSetSigRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_sig_rl.html">SigRl</a> const *&#160;</td>
+ <td class="paramname"><em>sig_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the signature based revocation list to be used by a member. </p>
+<p>The caller is responsible for ensuring the revocation list is authorized, e.g. signed by the issuer. The caller is also responsible checking the version of the revocation list. The call fails if trying to set an older version of the revocation list than was last set.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by sig_rl is accessed directly by the member until a new list is set or the member is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list is undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by sig_rl after the member is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl</td><td>The signature based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl_size</td><td>The size of the signature based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the signature based revocation list pointed to by the member is not changed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gaa2c85b1f0ea17a11ac5d297b21aa30f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa2c85b1f0ea17a11ac5d297b21aa30f6">&#9670;&nbsp;</a></span>EpidMemberStartup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidMemberStartup </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Change member from setup state to normal operation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga76cddb8e20afc43de2c30d5e4addb2ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76cddb8e20afc43de2c30d5e4addb2ea">&#9670;&nbsp;</a></span>EpidProvisionCompressed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidProvisionCompressed </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *&#160;</td>
+ <td class="paramname"><em>compressed_privkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *&#160;</td>
+ <td class="paramname"><em>precomp_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Provisions a member context from a compressed private key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate of group to provision. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">compressed_privkey</td><td>private key. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">precomp_str</td><td>Precomputed state (implementation specific optional)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga788ebc9d1ba6153c637b762484ca1140"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga788ebc9d1ba6153c637b762484ca1140">&#9670;&nbsp;</a></span>EpidProvisionCredential()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidProvisionCredential </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_membership_credential.html">MembershipCredential</a> const *&#160;</td>
+ <td class="paramname"><em>credential</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *&#160;</td>
+ <td class="paramname"><em>precomp_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Provisions a member context from a membership credential. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate of group to provision. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">credential</td><td>membership credential. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">precomp_str</td><td>Precomputed state (implementation specific optional)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga07094399c1e040b95ae3e58a74e7c302"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga07094399c1e040b95ae3e58a74e7c302">&#9670;&nbsp;</a></span>EpidProvisionKey()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidProvisionKey </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_priv_key.html">PrivKey</a> const *&#160;</td>
+ <td class="paramname"><em>priv_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *&#160;</td>
+ <td class="paramname"><em>precomp_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Provisions a member context from a private key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate of group to provision. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">priv_key</td><td>private key. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">precomp_str</td><td>Precomputed state (implementation specific optional)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8c6f097ba89542664375bd5e0f205220"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8c6f097ba89542664375bd5e0f205220">&#9670;&nbsp;</a></span>EpidRegisterBasename()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidRegisterBasename </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>basename_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Registers a basename with a member. </p>
+<p>To prevent loss of privacy, the member keeps a list of basenames (corresponding to authorized verifiers). The member signs a message with a basename only if the basename is in the member's basename list.</p>
+<dl class="section warning"><dt>Warning</dt><dd>The use of a name-based signature creates a platform unique pseudonymous identifier. Because it reduces the member's privacy, the user should be notified when it is used and should have control over its use.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename</td><td>The basename. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename_len</td><td>Length of the basename.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f" title="argument would add duplicate entry ">kEpidDuplicateErr</a></td><td>The basename was already registered.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> or <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f" title="argument would add duplicate entry ">kEpidDuplicateErr</a> it is undefined if the basename is registered.</dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga74d1409a816cb52633564b793072da5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga74d1409a816cb52633564b793072da5f">&#9670;&nbsp;</a></span>EpidSign()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidSign </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>basename_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_signature.html">EpidSignature</a> *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Writes an Intel(R) EPID signature. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The member context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message to sign. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The length in bytes of message. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename</td><td>Optional basename. If basename is NULL a random basename is used. Signatures generated using random basenames are anonymous. Signatures generated using the same basename are linkable by the verifier. If a basename is provided, it must already be registered, or <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf" title="incorrect arg to function ">kEpidBadArgErr</a> is returned. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename_len</td><td>The size of basename in bytes. Must be 0 if basename is NULL. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">sig</td><td>The generated signature </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_len</td><td>The size of signature in bytes. Must be equal to value returned by <a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000" title="Computes the size in bytes required for an Intel(R) EPID signature. ">EpidGetSigSize()</a>.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the content of sig is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a> </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf" title="Sets the hash algorithm to be used by a member. ">EpidMemberSetHashAlg</a> </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4" title="Sets the signature based revocation list to be used by a member. ">EpidMemberSetSigRl</a> </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000" title="Computes the size in bytes required for an Intel(R) EPID signature. ">EpidGetSigSize</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_member_module.js b/doc/html/group___epid_member_module.js
new file mode 100644
index 0000000..5896810
--- /dev/null
+++ b/doc/html/group___epid_member_module.js
@@ -0,0 +1,28 @@
+var group___epid_member_module =
+[
+ [ "tpm2", "group___tpm2_module.html", "group___tpm2_module" ],
+ [ "MemberParams", "struct_member_params.html", [
+ [ "f", "struct_member_params.html#ad6782a38fd79477bccf2313c676ea4fc", null ],
+ [ "rnd_func", "struct_member_params.html#ad844c7a2be20bac70b118e7c08530c0b", null ],
+ [ "rnd_param", "struct_member_params.html#a7510f05e63328fa13cf2a3a3bd6acd95", null ]
+ ] ],
+ [ "EpidAddPreSigs", "group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78", null ],
+ [ "EpidClearRegisteredBasenames", "group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3", null ],
+ [ "EpidCreateJoinRequest", "group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3", null ],
+ [ "EpidDecompressPrivKey", "group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef", null ],
+ [ "EpidGetNumPreSigs", "group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075", null ],
+ [ "EpidGetSigSize", "group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000", null ],
+ [ "EpidMemberCreate", "group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7", null ],
+ [ "EpidMemberDeinit", "group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d", null ],
+ [ "EpidMemberDelete", "group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6", null ],
+ [ "EpidMemberGetSize", "group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24", null ],
+ [ "EpidMemberInit", "group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb", null ],
+ [ "EpidMemberSetHashAlg", "group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf", null ],
+ [ "EpidMemberSetSigRl", "group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4", null ],
+ [ "EpidMemberStartup", "group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6", null ],
+ [ "EpidProvisionCompressed", "group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea", null ],
+ [ "EpidProvisionCredential", "group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140", null ],
+ [ "EpidProvisionKey", "group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302", null ],
+ [ "EpidRegisterBasename", "group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220", null ],
+ [ "EpidSign", "group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_module.html b/doc/html/group___epid_module.html
new file mode 100644
index 0000000..f8fe5cb
--- /dev/null
+++ b/doc/html/group___epid_module.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid&nbsp;</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> </div>
+ <div class="headertitle">
+<div class="title">epid&#160;</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Core Intel&reg; EPID functionality.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid_common"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_common.html">common</a></td></tr>
+<tr class="memdesc:group___epid_common"><td class="mdescLeft">&#160;</td><td class="mdescRight">Common code shared between core sub-components. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___epid_member_module"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html">member</a></td></tr>
+<tr class="memdesc:group___epid_member_module"><td class="mdescLeft">&#160;</td><td class="mdescRight">Member functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group___epid_verifier_module"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html">verifier</a></td></tr>
+<tr class="memdesc:group___epid_verifier_module"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifier functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Core Intel&reg; EPID functionality. </p>
+<p>Contains core functionality used to provide or implement APIs in the Intel&reg; EPID SDK. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_module.js b/doc/html/group___epid_module.js
new file mode 100644
index 0000000..892eddf
--- /dev/null
+++ b/doc/html/group___epid_module.js
@@ -0,0 +1,6 @@
+var group___epid_module =
+[
+ [ "common", "group___epid_common.html", "group___epid_common" ],
+ [ "member", "group___epid_member_module.html", "group___epid_member_module" ],
+ [ "verifier", "group___epid_verifier_module.html", "group___epid_verifier_module" ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_print.html b/doc/html/group___epid_print.html
new file mode 100644
index 0000000..25e5d29
--- /dev/null
+++ b/doc/html/group___epid_print.html
@@ -0,0 +1,689 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: print_utils</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_print.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">print_utils<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Debug print routines.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga3e215d157eb205ad596bb84bce694a83"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> { <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae">kPrintUtilUnannotated</a> = 0,
+<a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d">kPrintUtilAnnotated</a> = 1,
+<a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a">kPrintUtilFormatCount</a> = 2
+ }</td></tr>
+<tr class="memdesc:ga3e215d157eb205ad596bb84bce694a83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Print format. <a href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">More...</a><br /></td></tr>
+<tr class="separator:ga3e215d157eb205ad596bb84bce694a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga45a933b44fc1dfe926e3af89c198070a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a">PrintBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *big_num, char const *var_name)</td></tr>
+<tr class="memdesc:ga45a933b44fc1dfe926e3af89c198070a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints BigNum. <a href="#ga45a933b44fc1dfe926e3af89c198070a">More...</a><br /></td></tr>
+<tr class="separator:ga45a933b44fc1dfe926e3af89c198070a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3b1cbbfc6f78562658953113e5798cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf">PrintFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ff_element, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gaa3b1cbbfc6f78562658953113e5798cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints finite field element. <a href="#gaa3b1cbbfc6f78562658953113e5798cf">More...</a><br /></td></tr>
+<tr class="separator:gaa3b1cbbfc6f78562658953113e5798cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca">PrintEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *ec_point, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints elliptic curve group element. <a href="#ga0d6377d9c1651d0101ec6b61feaa78ca">More...</a><br /></td></tr>
+<tr class="separator:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d">PrintBigNumStr</a> (<a class="el" href="struct_big_num_str.html">BigNumStr</a> const *big_num_str, char const *var_name)</td></tr>
+<tr class="memdesc:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized BigNum. <a href="#ga5f249c594ed12e4a9b11b7bc101da85d">More...</a><br /></td></tr>
+<tr class="separator:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae553c3a156a0e4968b89635ab0757580"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gae553c3a156a0e4968b89635ab0757580">PrintFpElemStr</a> (<a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *fp_elem_str, char const *var_name)</td></tr>
+<tr class="memdesc:gae553c3a156a0e4968b89635ab0757580"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fp element. <a href="#gae553c3a156a0e4968b89635ab0757580">More...</a><br /></td></tr>
+<tr class="separator:gae553c3a156a0e4968b89635ab0757580"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4">PrintFqElemStr</a> (<a class="el" href="struct_fq_elem_str.html">FqElemStr</a> const *fq_elem_str, char const *var_name)</td></tr>
+<tr class="memdesc:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq element. <a href="#ga6c9fea48fa0477f4a98abb50f891a5e4">More...</a><br /></td></tr>
+<tr class="separator:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga883a834ab1703365bb0bca4abd3104de"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de">PrintFq2ElemStr</a> (<a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a> const *fq2_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga883a834ab1703365bb0bca4abd3104de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq2 element. <a href="#ga883a834ab1703365bb0bca4abd3104de">More...</a><br /></td></tr>
+<tr class="separator:ga883a834ab1703365bb0bca4abd3104de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f2961ef6b4c44a6205d422d8a293476"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476">PrintFq6ElemStr</a> (<a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a> const *fq6_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga3f2961ef6b4c44a6205d422d8a293476"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq6 element. <a href="#ga3f2961ef6b4c44a6205d422d8a293476">More...</a><br /></td></tr>
+<tr class="separator:ga3f2961ef6b4c44a6205d422d8a293476"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f">PrintFq12ElemStr</a> (<a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> const *fq12_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq12 element. <a href="#gaf185fe3df270cd8b4a2969bf3cfc5d5f">More...</a><br /></td></tr>
+<tr class="separator:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f">PrintG1ElemStr</a> (<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *g1_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized G1 element. <a href="#ga87168a3ce5306f9839b8e8d6c9a5f84f">More...</a><br /></td></tr>
+<tr class="separator:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a">PrintG2ElemStr</a> (<a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> const *g2_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized G2 element. <a href="#gab76a4cf0385dc4a76bb56ee9f0e3e87a">More...</a><br /></td></tr>
+<tr class="separator:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga138cd388247a58680d4701d59d6976d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga138cd388247a58680d4701d59d6976d2">PrintGtElemStr</a> (<a class="el" href="struct_gt_elem_str.html">GtElemStr</a> const *gt_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga138cd388247a58680d4701d59d6976d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Gt element. <a href="#ga138cd388247a58680d4701d59d6976d2">More...</a><br /></td></tr>
+<tr class="separator:ga138cd388247a58680d4701d59d6976d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Debug print routines. </p>
+<p>Defines an API to print formatted versions of the types used for mathematical operations.</p>
+<p>If the symbol EPID_ENABLE_DEBUG_PRINT is not defined, all calls to the functions in this module are ignored. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga3e215d157eb205ad596bb84bce694a83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3e215d157eb205ad596bb84bce694a83">&#9670;&nbsp;</a></span>PrintUtilFormat</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Print format. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae"></a>kPrintUtilUnannotated&#160;</td><td class="fielddoc"><p>Unannotated output format. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d"></a>kPrintUtilAnnotated&#160;</td><td class="fielddoc"><p>Annotated output format. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a"></a>kPrintUtilFormatCount&#160;</td><td class="fielddoc"><p>Count of print formats. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga45a933b44fc1dfe926e3af89c198070a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga45a933b44fc1dfe926e3af89c198070a">&#9670;&nbsp;</a></span>PrintBigNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintBigNum </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>big_num</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints BigNum. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">big_num</td><td>BigNum to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga5f249c594ed12e4a9b11b7bc101da85d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5f249c594ed12e4a9b11b7bc101da85d">&#9670;&nbsp;</a></span>PrintBigNumStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintBigNumStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>big_num_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized BigNum. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">big_num_str</td><td>Serialized BigNum to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga0d6377d9c1651d0101ec6b61feaa78ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0d6377d9c1651d0101ec6b61feaa78ca">&#9670;&nbsp;</a></span>PrintEcPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintEcPoint </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>g</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>ec_point</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints elliptic curve group element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g</td><td>Elliptic curve group that element to be printed belongs to </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ec_point</td><td>Elliptic curve group element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaa3b1cbbfc6f78562658953113e5798cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3b1cbbfc6f78562658953113e5798cf">&#9670;&nbsp;</a></span>PrintFfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>ff_element</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints finite field element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>Finite field that element to be printed belongs to </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff_element</td><td>Finite field element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae553c3a156a0e4968b89635ab0757580"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae553c3a156a0e4968b89635ab0757580">&#9670;&nbsp;</a></span>PrintFpElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFpElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>fp_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Fp element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">fp_elem_str</td><td>Serialized Fp element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaf185fe3df270cd8b4a2969bf3cfc5d5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf185fe3df270cd8b4a2969bf3cfc5d5f">&#9670;&nbsp;</a></span>PrintFq12ElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFq12ElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>fq12_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Fq12 element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">fq12_elem_str</td><td>Serialized Intel(R) EPID Fq12 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga883a834ab1703365bb0bca4abd3104de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga883a834ab1703365bb0bca4abd3104de">&#9670;&nbsp;</a></span>PrintFq2ElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFq2ElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>fq2_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Fq2 element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">fq2_elem_str</td><td>Serialized Fq2 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3f2961ef6b4c44a6205d422d8a293476"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3f2961ef6b4c44a6205d422d8a293476">&#9670;&nbsp;</a></span>PrintFq6ElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFq6ElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>fq6_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Fq6 element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">fq6_elem_str</td><td>Serialized Fq6 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga6c9fea48fa0477f4a98abb50f891a5e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6c9fea48fa0477f4a98abb50f891a5e4">&#9670;&nbsp;</a></span>PrintFqElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintFqElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>fq_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Fq element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">fq_elem_str</td><td>Serialized Fq element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga87168a3ce5306f9839b8e8d6c9a5f84f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga87168a3ce5306f9839b8e8d6c9a5f84f">&#9670;&nbsp;</a></span>PrintG1ElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintG1ElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>g1_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized G1 element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g1_elem_str</td><td>Serialized G1 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="gab76a4cf0385dc4a76bb56ee9f0e3e87a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab76a4cf0385dc4a76bb56ee9f0e3e87a">&#9670;&nbsp;</a></span>PrintG2ElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintG2ElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>g2_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized G2 element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">g2_elem_str</td><td>Serialized G2 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga138cd388247a58680d4701d59d6976d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga138cd388247a58680d4701d59d6976d2">&#9670;&nbsp;</a></span>PrintGtElemStr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PrintGtElemStr </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_gt_elem_str.html">GtElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>gt_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>var_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Prints serialized Gt element. </p>
+<p>Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">gt_elem_str</td><td>Serialized G2 element to be printed </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">var_name</td><td>Result variable name </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>Output format </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_print.js b/doc/html/group___epid_print.js
new file mode 100644
index 0000000..d1b92d4
--- /dev/null
+++ b/doc/html/group___epid_print.js
@@ -0,0 +1,20 @@
+var group___epid_print =
+[
+ [ "PrintUtilFormat", "group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83", [
+ [ "kPrintUtilUnannotated", "group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae", null ],
+ [ "kPrintUtilAnnotated", "group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d", null ],
+ [ "kPrintUtilFormatCount", "group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a", null ]
+ ] ],
+ [ "PrintBigNum", "group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a", null ],
+ [ "PrintBigNumStr", "group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d", null ],
+ [ "PrintEcPoint", "group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca", null ],
+ [ "PrintFfElement", "group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf", null ],
+ [ "PrintFpElemStr", "group___epid_print.html#gae553c3a156a0e4968b89635ab0757580", null ],
+ [ "PrintFq12ElemStr", "group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f", null ],
+ [ "PrintFq2ElemStr", "group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de", null ],
+ [ "PrintFq6ElemStr", "group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476", null ],
+ [ "PrintFqElemStr", "group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4", null ],
+ [ "PrintG1ElemStr", "group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f", null ],
+ [ "PrintG2ElemStr", "group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a", null ],
+ [ "PrintGtElemStr", "group___epid_print.html#ga138cd388247a58680d4701d59d6976d2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_types.html b/doc/html/group___epid_types.html
new file mode 100644
index 0000000..4ce7891
--- /dev/null
+++ b/doc/html/group___epid_types.html
@@ -0,0 +1,284 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: types</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_types.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a> </div>
+ <div class="headertitle">
+<div class="title">types<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK data types.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid11_types"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></td></tr>
+<tr class="memdesc:group___epid11_types"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 specific data types. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str8.html">OctStr8</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">8 bit octet string <a href="struct_oct_str8.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str16.html">OctStr16</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">16 bit octet string <a href="struct_oct_str16.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str32.html">OctStr32</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">32 bit octet string <a href="struct_oct_str32.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str64.html">OctStr64</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">64 bit octet string <a href="struct_oct_str64.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str128.html">OctStr128</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">128 bit octet string <a href="struct_oct_str128.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str256.html">OctStr256</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit octet string <a href="struct_oct_str256.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str512.html">OctStr512</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">512 bit octet string <a href="struct_oct_str512.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_big_num_str.html">BigNumStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized BigNum. <a href="struct_big_num_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">a number in [0, p-1] <a href="struct_fp_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">a number in [0, q-1] <a href="struct_fq_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized G1 element. <a href="struct_g1_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized G2 element. <a href="struct_g2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_gt_elem_str.html">GtElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized GT element. <a href="struct_gt_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html">Epid2Params</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 Parameters. <a href="struct_epid2_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 group public key. <a href="struct_group_pub_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_i_priv_key.html">IPrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 issuing private key. <a href="struct_i_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html">PrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 private key. <a href="struct_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compressed private key. <a href="struct_compressed_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_membership_credential.html">MembershipCredential</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Membership credential. <a href="struct_membership_credential.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_join_request.html">JoinRequest</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Join request. <a href="struct_join_request.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html">BasicSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 basic signature. <a href="struct_basic_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html">NrProof</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">non-revoked Proof. <a href="struct_nr_proof.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html">EpidSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 Signature. <a href="struct_epid_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html">PrivRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">private-key based revocation list. <a href="struct_priv_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">entry in SigRL (B,K) <a href="struct_sig_rl_entry.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html">SigRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">signature based revocation list <a href="struct_sig_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_rl.html">GroupRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">group revocation list <a href="struct_group_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html">VerifierRl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pre-computed member settings. <a href="struct_member_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2 element. <a href="struct_fq2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2^3 element. <a href="struct_fq6_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2^3^2 element. <a href="struct_fq12_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Signature using NIST 256-bit curve secp256r1. <a href="struct_ecdsa_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Public Key. <a href="struct_ecdsa_public_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Private Key. <a href="struct_ecdsa_private_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga3315fb24f4c5783b6d6eb107933390b0"><td class="memItemLeft" align="right" valign="top"><a id="ga3315fb24f4c5783b6d6eb107933390b0"></a>
+typedef void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a></td></tr>
+<tr class="memdesc:ga3315fb24f4c5783b6d6eb107933390b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generic Octet String Style Number. <br /></td></tr>
+<tr class="separator:ga3315fb24f4c5783b6d6eb107933390b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gace6876a045f2c2694444b35ccb0844e2"><td class="memItemLeft" align="right" valign="top"><a id="gace6876a045f2c2694444b35ccb0844e2"></a>
+typedef void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a></td></tr>
+<tr class="memdesc:gace6876a045f2c2694444b35ccb0844e2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generic Const Octet String Style Number. <br /></td></tr>
+<tr class="separator:gace6876a045f2c2694444b35ccb0844e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gada666b48d0cbc301985405fde896f1de"><td class="memItemLeft" align="right" valign="top"><a id="gada666b48d0cbc301985405fde896f1de"></a>
+typedef <a class="el" href="struct_oct_str128.html">OctStr128</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a></td></tr>
+<tr class="memdesc:gada666b48d0cbc301985405fde896f1de"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:gada666b48d0cbc301985405fde896f1de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga888541b8148df69c634a92c64ed51317"><td class="memItemLeft" align="right" valign="top"><a id="ga888541b8148df69c634a92c64ed51317"></a>
+typedef <a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga888541b8148df69c634a92c64ed51317">Seed</a></td></tr>
+<tr class="memdesc:ga888541b8148df69c634a92c64ed51317"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit seed derived from fuse key <br /></td></tr>
+<tr class="separator:ga888541b8148df69c634a92c64ed51317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55eb2193045bde31af3f551565126042"><td class="memItemLeft" align="right" valign="top"><a id="ga55eb2193045bde31af3f551565126042"></a>
+typedef <a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">IssuerNonce</a></td></tr>
+<tr class="memdesc:ga55eb2193045bde31af3f551565126042"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit nonce chosen by issuer <br /></td></tr>
+<tr class="separator:ga55eb2193045bde31af3f551565126042"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54bd22670f2e348593db7ab631131d10"><td class="memItemLeft" align="right" valign="top"><a id="ga54bd22670f2e348593db7ab631131d10"></a>
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga54bd22670f2e348593db7ab631131d10">ReKeySeed</a></td></tr>
+<tr class="memdesc:ga54bd22670f2e348593db7ab631131d10"><td class="mdescLeft">&#160;</td><td class="mdescRight">element to store seed values for later rekey <br /></td></tr>
+<tr class="separator:ga54bd22670f2e348593db7ab631131d10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> { <br />
+&#160;&#160;<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb">kInvalidHashAlg</a> = -1,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d">kSha256</a> = 0,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290">kSha384</a> = 1,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055">kSha512</a> = 2,
+<br />
+&#160;&#160;<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba">kSha512_256</a> = 3,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85">kSha3_256</a> = 4,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86">kSha3_384</a> = 5,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee">kSha3_512</a> = 6
+<br />
+ }</td></tr>
+<tr class="memdesc:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized hash algorithms. <a href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">More...</a><br /></td></tr>
+<tr class="separator:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>SDK data types. </p>
+<p>Defines serialized data types used by the SDK.</p>
+<p>Most of the types defined here are fixed size binary buffers of various sizes that are semantically mapped to the types of various inputs to the Intel(R) EPID APIs.</p>
+<p>For example <a class="el" href="struct_gt_elem_str.html" title="Serialized GT element. ">GtElemStr</a> is a 384 byte buffer that represents a serialized value that is compatible with a <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa" title="An element in a finite field. ">FfElement</a> belonging to the <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e" title="A finite field. ">FiniteField</a> GT. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga5e450438f6f9a5eacd0cf5ce354ec890"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5e450438f6f9a5eacd0cf5ce354ec890">&#9670;&nbsp;</a></span>HashAlg</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Recognized hash algorithms. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb"></a>kInvalidHashAlg&#160;</td><td class="fielddoc"><p>Invalid. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d"></a>kSha256&#160;</td><td class="fielddoc"><p>SHA-256. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290"></a>kSha384&#160;</td><td class="fielddoc"><p>SHA-384. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055"></a>kSha512&#160;</td><td class="fielddoc"><p>SHA-512. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba"></a>kSha512_256&#160;</td><td class="fielddoc"><p>SHA-512/256. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85"></a>kSha3_256&#160;</td><td class="fielddoc"><p>Reserved for SHA3/256. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86"></a>kSha3_384&#160;</td><td class="fielddoc"><p>Reserved for SHA3/384. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee"></a>kSha3_512&#160;</td><td class="fielddoc"><p>Reserved for SHA3/512. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_types.js b/doc/html/group___epid_types.js
new file mode 100644
index 0000000..865892d
--- /dev/null
+++ b/doc/html/group___epid_types.js
@@ -0,0 +1,179 @@
+var group___epid_types =
+[
+ [ "Intel(R) EPID 1.1 specific types", "group___epid11_types.html", "group___epid11_types" ],
+ [ "OctStr8", "struct_oct_str8.html", [
+ [ "data", "struct_oct_str8.html#a5e6c56fda48c88b419e621b464b03bef", null ]
+ ] ],
+ [ "OctStr16", "struct_oct_str16.html", [
+ [ "data", "struct_oct_str16.html#a86ed6671693a3f60ec4ff7de2c1206c3", null ]
+ ] ],
+ [ "OctStr32", "struct_oct_str32.html", [
+ [ "data", "struct_oct_str32.html#a5588a7e70f3d73f6ce58b567a9f5c5c8", null ]
+ ] ],
+ [ "OctStr64", "struct_oct_str64.html", [
+ [ "data", "struct_oct_str64.html#a0e107d78192a5ae0b48ed9e5c4eab0fc", null ]
+ ] ],
+ [ "OctStr128", "struct_oct_str128.html", [
+ [ "data", "struct_oct_str128.html#a7482aa9b0b580fdd50bd65419d52d4b9", null ]
+ ] ],
+ [ "OctStr256", "struct_oct_str256.html", [
+ [ "data", "struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e", null ]
+ ] ],
+ [ "OctStr512", "struct_oct_str512.html", [
+ [ "data", "struct_oct_str512.html#abd4d1b97fe49321571da86de1aeac653", null ]
+ ] ],
+ [ "BigNumStr", "struct_big_num_str.html", [
+ [ "data", "struct_big_num_str.html#a442dcf33889b4f85c5b1228d2c8e6838", null ]
+ ] ],
+ [ "FpElemStr", "struct_fp_elem_str.html", [
+ [ "data", "struct_fp_elem_str.html#a5ddb96a5567750f2834335851c906c45", null ]
+ ] ],
+ [ "FqElemStr", "struct_fq_elem_str.html", [
+ [ "data", "struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14", null ]
+ ] ],
+ [ "G1ElemStr", "struct_g1_elem_str.html", [
+ [ "x", "struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4", null ],
+ [ "y", "struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3", null ]
+ ] ],
+ [ "G2ElemStr", "struct_g2_elem_str.html", [
+ [ "x", "struct_g2_elem_str.html#a145ec5b20a6f4f00b080e11c8680afc3", null ],
+ [ "y", "struct_g2_elem_str.html#a43141b2458aecceed8ee2748270f7908", null ]
+ ] ],
+ [ "GtElemStr", "struct_gt_elem_str.html", [
+ [ "x", "struct_gt_elem_str.html#aeaeb0e9e1c6efd378a475eb9a6c42132", null ]
+ ] ],
+ [ "Epid2Params", "struct_epid2_params.html", [
+ [ "b", "struct_epid2_params.html#a2f868edb49be49f645101ef5ebbbc551", null ],
+ [ "beta", "struct_epid2_params.html#ac2d7507c6f58c3451beacacb91b52695", null ],
+ [ "g1", "struct_epid2_params.html#a4c5195b4fa9393a07a121336202531ad", null ],
+ [ "g2", "struct_epid2_params.html#a609b0aac17fca34fe39bee29676a9618", null ],
+ [ "neg", "struct_epid2_params.html#af23f07fb0e1745c0ad14aceeaa946928", null ],
+ [ "p", "struct_epid2_params.html#ac0e0dad45b10927860cd5fa4f8101f08", null ],
+ [ "q", "struct_epid2_params.html#a023603228fed2854ddae2e228938940f", null ],
+ [ "t", "struct_epid2_params.html#a200a0cba1c9e4ad512bece23f2461a5f", null ],
+ [ "xi", "struct_epid2_params.html#ae1d8f5d6036a82064e91bc137b278e74", null ]
+ ] ],
+ [ "GroupPubKey", "struct_group_pub_key.html", [
+ [ "gid", "struct_group_pub_key.html#ae8e77ab4d5eb3c8e566c24a64cce56ee", null ],
+ [ "h1", "struct_group_pub_key.html#a8c22c758ea186f95e3bf4b2ef8451da5", null ],
+ [ "h2", "struct_group_pub_key.html#a2a4320ec99fd1a15df412fbf2a8d49f1", null ],
+ [ "w", "struct_group_pub_key.html#a86be439104fb60b324784baf24a943f9", null ]
+ ] ],
+ [ "IPrivKey", "struct_i_priv_key.html", [
+ [ "gamma", "struct_i_priv_key.html#a6d484175317aef09fb959c3ca55fc70a", null ],
+ [ "gid", "struct_i_priv_key.html#ad400a4237b6d50855538fd40580eb1bb", null ]
+ ] ],
+ [ "PrivKey", "struct_priv_key.html", [
+ [ "A", "struct_priv_key.html#a266c7e369b8b868ef5755e9cd3c0c849", null ],
+ [ "f", "struct_priv_key.html#ad7ee0392a583edd2e287cf8c1f9066ba", null ],
+ [ "gid", "struct_priv_key.html#ab416dcb4366427c24b44c2a02e4ae7c8", null ],
+ [ "x", "struct_priv_key.html#aa805f9e124f05bdb733c85cb93614cbd", null ]
+ ] ],
+ [ "CompressedPrivKey", "struct_compressed_priv_key.html", [
+ [ "ax", "struct_compressed_priv_key.html#a0b0535f0567eb0e48f799d27991d0f66", null ],
+ [ "gid", "struct_compressed_priv_key.html#ac6689899f1d9a6a8c5e4915563679840", null ],
+ [ "seed", "struct_compressed_priv_key.html#a54b9af7699f517bbaef3d52d03e3fed8", null ]
+ ] ],
+ [ "MembershipCredential", "struct_membership_credential.html", [
+ [ "A", "struct_membership_credential.html#a6d38ac3a9c5417833b8adb9b22bc9dc8", null ],
+ [ "gid", "struct_membership_credential.html#afbff64ec55888c7e2a658eabb5e16671", null ],
+ [ "x", "struct_membership_credential.html#a2c5c0d22999d6917fea5ad6618883bcf", null ]
+ ] ],
+ [ "JoinRequest", "struct_join_request.html", [
+ [ "c", "struct_join_request.html#a55e30a274e83b808db6fbab5ae6c6cb8", null ],
+ [ "F", "struct_join_request.html#a005651506fd4511e8a3537f6c3634532", null ],
+ [ "s", "struct_join_request.html#a73bf8989df5f90eb3d06e7a42ad74d1d", null ]
+ ] ],
+ [ "BasicSignature", "struct_basic_signature.html", [
+ [ "B", "struct_basic_signature.html#ae90cb6af66b010ae39913f033c1e65ac", null ],
+ [ "c", "struct_basic_signature.html#a4daa94db5068db3f10960f3dd178d603", null ],
+ [ "K", "struct_basic_signature.html#a0078cc83ecf6c7e31f96b7d44aa60e21", null ],
+ [ "sa", "struct_basic_signature.html#a69115a4776d15b48411dd6c3a76d0f3d", null ],
+ [ "sb", "struct_basic_signature.html#a91daebc5b577688afeed2a7ee7913245", null ],
+ [ "sf", "struct_basic_signature.html#a79d8dec8c5da176e497abf22e4c43adb", null ],
+ [ "sx", "struct_basic_signature.html#a0e8ea6a2cd3af10e9b59d96d7d06bc69", null ],
+ [ "T", "struct_basic_signature.html#a730f74d85cfb4fa4089d43c87b97a624", null ]
+ ] ],
+ [ "NrProof", "struct_nr_proof.html", [
+ [ "c", "struct_nr_proof.html#a0de1aa69acf3d93da34cf4a613b359a1", null ],
+ [ "smu", "struct_nr_proof.html#a717ec36a6c91acd01d9b642bb20fc178", null ],
+ [ "snu", "struct_nr_proof.html#ae2e9f22089793a4d44a0f7f5cdb78a0c", null ],
+ [ "T", "struct_nr_proof.html#ace535065bbf96502b893ac677dc8dcd3", null ]
+ ] ],
+ [ "EpidSignature", "struct_epid_signature.html", [
+ [ "n2", "struct_epid_signature.html#a62a6b0ffcd5f68dd3d2786a58fe43017", null ],
+ [ "rl_ver", "struct_epid_signature.html#a4155f3f4f1223fc4ae50c94f5305def1", null ],
+ [ "sigma", "struct_epid_signature.html#a89d2e38223944310b6eeeadf6061a2dd", null ],
+ [ "sigma0", "struct_epid_signature.html#ab0fe5f98bff737fcfbfe0b4d658e83f2", null ]
+ ] ],
+ [ "PrivRl", "struct_priv_rl.html", [
+ [ "f", "struct_priv_rl.html#a60d73f9ef5fc81f117b3abadf8c18466", null ],
+ [ "gid", "struct_priv_rl.html#af7317529b8e55476bd06b66ed8131d64", null ],
+ [ "n1", "struct_priv_rl.html#a6da9639ec4061689d1c30a58e0befd14", null ],
+ [ "version", "struct_priv_rl.html#a4c6b51cec760f7e81ca8635422ac6a50", null ]
+ ] ],
+ [ "SigRlEntry", "struct_sig_rl_entry.html", [
+ [ "b", "struct_sig_rl_entry.html#ac6a47ff0d1b8ea1512e0ff14983ac5ce", null ],
+ [ "k", "struct_sig_rl_entry.html#a0dfeb058614e81878bfbf86ae3edac3c", null ]
+ ] ],
+ [ "SigRl", "struct_sig_rl.html", [
+ [ "bk", "struct_sig_rl.html#ac23a919993d99d24a5150302f1778102", null ],
+ [ "gid", "struct_sig_rl.html#a12757d30fcccd310716433948e0b603e", null ],
+ [ "n2", "struct_sig_rl.html#a9dfb6b508db9051f4dc480a51d702af2", null ],
+ [ "version", "struct_sig_rl.html#ac9d4c343c539dba799e1f42eb38b351f", null ]
+ ] ],
+ [ "GroupRl", "struct_group_rl.html", [
+ [ "gid", "struct_group_rl.html#a51022e172ab8b945efc69f1e63170107", null ],
+ [ "n3", "struct_group_rl.html#a9067f01c63cdefbc8e23c3cf67a10172", null ],
+ [ "version", "struct_group_rl.html#a69c41d99cdfc5b6ece7442f466f7ec3f", null ]
+ ] ],
+ [ "VerifierRl", "struct_verifier_rl.html", [
+ [ "B", "struct_verifier_rl.html#a5d9a9265fffa96fd5f9260543eb08c68", null ],
+ [ "gid", "struct_verifier_rl.html#ab85c4666d16145ff16443e84468d2d7d", null ],
+ [ "K", "struct_verifier_rl.html#ac7d3dceab4772096bbbeb3fa735d18a9", null ],
+ [ "n4", "struct_verifier_rl.html#a1e3f84b873bccc0c882aa6432c42d2f7", null ],
+ [ "version", "struct_verifier_rl.html#afa44ab69ffff5a3508366aeb2131fdaa", null ]
+ ] ],
+ [ "MemberPrecomp", "struct_member_precomp.html", [
+ [ "e12", "struct_member_precomp.html#a55e5c4b25c8f0f426969a8d745260fe5", null ],
+ [ "e22", "struct_member_precomp.html#a4e7412969bed3964f813b093b948e7b4", null ],
+ [ "e2w", "struct_member_precomp.html#a879d5a7b0c30088b23f6e5c5fc62f834", null ],
+ [ "ea2", "struct_member_precomp.html#a573551f6494e372f44fd3bdf5b02aeda", null ]
+ ] ],
+ [ "Fq2ElemStr", "struct_fq2_elem_str.html", [
+ [ "a", "struct_fq2_elem_str.html#ab1d253eb24ba30eaf516ac429daab915", null ]
+ ] ],
+ [ "Fq6ElemStr", "struct_fq6_elem_str.html", [
+ [ "a", "struct_fq6_elem_str.html#a89d656e5c815b4a2382d11ef6932a7d2", null ]
+ ] ],
+ [ "Fq12ElemStr", "struct_fq12_elem_str.html", [
+ [ "a", "struct_fq12_elem_str.html#a0520947335aaf52de90af1dec5bdd112", null ]
+ ] ],
+ [ "EcdsaSignature", "struct_ecdsa_signature.html", [
+ [ "x", "struct_ecdsa_signature.html#a64b623605a55a267a36df18f29142d0d", null ],
+ [ "y", "struct_ecdsa_signature.html#a2efd6bf37b12f35135bf325fa491b029", null ]
+ ] ],
+ [ "EcdsaPublicKey", "struct_ecdsa_public_key.html", [
+ [ "x", "struct_ecdsa_public_key.html#a37c51614faf022eec491b4de8f3a13e1", null ],
+ [ "y", "struct_ecdsa_public_key.html#a4503c4613386cbc78add1dc245c99284", null ]
+ ] ],
+ [ "EcdsaPrivateKey", "struct_ecdsa_private_key.html", [
+ [ "data", "struct_ecdsa_private_key.html#a97efee9b4079f95d94a104f9a6d8c96d", null ]
+ ] ],
+ [ "ConstOctStr", "group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2", null ],
+ [ "GroupId", "group___epid_types.html#gada666b48d0cbc301985405fde896f1de", null ],
+ [ "IssuerNonce", "group___epid_types.html#ga55eb2193045bde31af3f551565126042", null ],
+ [ "OctStr", "group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0", null ],
+ [ "ReKeySeed", "group___epid_types.html#ga54bd22670f2e348593db7ab631131d10", null ],
+ [ "Seed", "group___epid_types.html#ga888541b8148df69c634a92c64ed51317", null ],
+ [ "HashAlg", "group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890", [
+ [ "kInvalidHashAlg", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb", null ],
+ [ "kSha256", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d", null ],
+ [ "kSha384", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290", null ],
+ [ "kSha512", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055", null ],
+ [ "kSha512_256", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba", null ],
+ [ "kSha3_256", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85", null ],
+ [ "kSha3_384", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86", null ],
+ [ "kSha3_512", "group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee", null ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/group___epid_verifier_module.html b/doc/html/group___epid_verifier_module.html
new file mode 100644
index 0000000..ec1d29f
--- /dev/null
+++ b/doc/html/group___epid_verifier_module.html
@@ -0,0 +1,1076 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: verifier</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___epid_verifier_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">verifier<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Verifier functionality.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid11_verifier_module"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html">Intel(R) EPID 1.1 support</a></td></tr>
+<tr class="memdesc:group___epid11_verifier_module"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Verifier functionality. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pre-computed verifier settings. <a href="struct_verifier_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="memItemLeft" align="right" valign="top"><a id="gaf172a5f8f7f069d38c5838b723a1a85c"></a>
+typedef struct <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a></td></tr>
+<tr class="memdesc:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal context of verifier. <br /></td></tr>
+<tr class="separator:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">EpidVerifierCreate</a> (<a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> const *precomp, <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new verifier context. <a href="#ga1d116daaee5466a1485d26ebc4e3ab70">More...</a><br /></td></tr>
+<tr class="separator:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6707e691f4b3916f9c684d5bbd463d12"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">EpidVerifierDelete</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga6707e691f4b3916f9c684d5bbd463d12"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing verifier context. <a href="#ga6707e691f4b3916f9c684d5bbd463d12">More...</a><br /></td></tr>
+<tr class="separator:ga6707e691f4b3916f9c684d5bbd463d12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">EpidVerifierWritePrecomp</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> *precomp)</td></tr>
+<tr class="memdesc:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the pre-computed verifier settings. <a href="#ga92df4d00ea4ee59d7bfd35b23da03392">More...</a><br /></td></tr>
+<tr class="separator:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">EpidVerifierSetPrivRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_priv_rl.html">PrivRl</a> const *priv_rl, size_t priv_rl_size)</td></tr>
+<tr class="memdesc:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the private key based revocation list. <a href="#gafab08180a43b58ce2e1d56c4b070bb0e">More...</a><br /></td></tr>
+<tr class="separator:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">EpidVerifierSetSigRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the signature based revocation list. <a href="#ga4c7c9820409ee06f30bb8dc75fdd5dcf">More...</a><br /></td></tr>
+<tr class="separator:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">EpidVerifierSetGroupRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_group_rl.html">GroupRl</a> const *grp_rl, size_t grp_rl_size)</td></tr>
+<tr class="memdesc:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the group based revocation list. <a href="#ga1d41d6ef4dabbc30ec28452edd6baffb">More...</a><br /></td></tr>
+<tr class="separator:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0909703a0a4dfe080374d0d99077465a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">EpidVerifierSetVerifierRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_verifier_rl.html">VerifierRl</a> const *ver_rl, size_t ver_rl_size)</td></tr>
+<tr class="memdesc:ga0909703a0a4dfe080374d0d99077465a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the verifier revocation list. <a href="#ga0909703a0a4dfe080374d0d99077465a">More...</a><br /></td></tr>
+<tr class="separator:ga0909703a0a4dfe080374d0d99077465a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97b58b2382f24756b66a357f1e825c92"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">EpidVerifierSetHashAlg</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga97b58b2382f24756b66a357f1e825c92"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a verifier. <a href="#ga97b58b2382f24756b66a357f1e825c92">More...</a><br /></td></tr>
+<tr class="separator:ga97b58b2382f24756b66a357f1e825c92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1c3810ef361da678a1f77823bd9c37a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">EpidVerifierSetBasename</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga1c3810ef361da678a1f77823bd9c37a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the basename to be used by a verifier. <a href="#ga1c3810ef361da678a1f77823bd9c37a6">More...</a><br /></td></tr>
+<tr class="separator:ga1c3810ef361da678a1f77823bd9c37a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae3f9c37628e18b880d8bbee3e7f55064"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">EpidVerify</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_epid_signature.html">EpidSignature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gae3f9c37628e18b880d8bbee3e7f55064"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a signature and checks revocation status. <a href="#gae3f9c37628e18b880d8bbee3e7f55064">More...</a><br /></td></tr>
+<tr class="separator:gae3f9c37628e18b880d8bbee3e7f55064"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8">EpidAreSigsLinked</a> (<a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig1, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig2)</td></tr>
+<tr class="memdesc:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if two signatures are linked. <a href="#gae44bd8acbc1e7205aeedff0c7e2632a8">More...</a><br /></td></tr>
+<tr class="separator:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">EpidVerifyBasicSig</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a member signature without revocation checks. <a href="#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">More...</a><br /></td></tr>
+<tr class="separator:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac6e2fab59e3af8a33a74a5b201642700"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700">EpidNrVerify</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, void const *msg, size_t msg_len, <a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a> const *sigrl_entry, <a class="el" href="struct_nr_proof.html">NrProof</a> const *proof)</td></tr>
+<tr class="memdesc:gac6e2fab59e3af8a33a74a5b201642700"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies the non-revoked proof for a single signature based revocation list entry. <a href="#gac6e2fab59e3af8a33a74a5b201642700">More...</a><br /></td></tr>
+<tr class="separator:gac6e2fab59e3af8a33a74a5b201642700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea">EpidCheckPrivRlEntry</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f)</td></tr>
+<tr class="memdesc:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a signature has not been revoked in the private key based revocation list. <a href="#gaeb05e6faea6f09c0665b13adc6e7ddea">More...</a><br /></td></tr>
+<tr class="separator:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f">EpidGetVerifierRlSize</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx)</td></tr>
+<tr class="memdesc:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the number of bytes required to serialize the verifier blacklist. <a href="#ga2a75c7d5775e852a7b6e24178dd4054f">More...</a><br /></td></tr>
+<tr class="separator:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac857bff47e7d80363eac15285471fe81"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81">EpidWriteVerifierRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_verifier_rl.html">VerifierRl</a> *ver_rl, size_t ver_rl_size)</td></tr>
+<tr class="memdesc:gac857bff47e7d80363eac15285471fe81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the verifier blacklist to a buffer. <a href="#gac857bff47e7d80363eac15285471fe81">More...</a><br /></td></tr>
+<tr class="separator:gac857bff47e7d80363eac15285471fe81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69">EpidBlacklistSig</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_epid_signature.html">EpidSignature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a valid name-based signature to the verifier blacklist. <a href="#ga8eaeb9f4a34e9e37ccdf342919f38c69">More...</a><br /></td></tr>
+<tr class="separator:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Verifier functionality. </p>
+<p>Defines the APIs needed by Intel(R) EPID verifiers. Each verifier context (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c" title="Internal context of verifier. ">VerifierCtx</a>) represents a verifier for a single group.</p>
+<p>To use this module, include the header <a class="el" href="verifier_2api_8h.html" title="Intel(R) EPID SDK verifier API. ">epid/verifier/api.h</a>. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gae44bd8acbc1e7205aeedff0c7e2632a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae44bd8acbc1e7205aeedff0c7e2632a8">&#9670;&nbsp;</a></span>EpidAreSigsLinked()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> EpidAreSigsLinked </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_basic_signature.html">BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_basic_signature.html">BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if two signatures are linked. </p>
+<p>The Intel(R) EPID scheme allows signatures to be linked. If basename option is specified when signing, signatures with the same basename are linkable. This linking capability allows the verifier, or anyone, to know whether two Intel(R) EPID signatures are generated by the same member.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig1</td><td>A basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig2</td><td>A basic signature.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>bool</dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname">true</td><td>if the signatures were generated by the same member </td></tr>
+ <tr><td class="paramname">false</td><td>if it couldn't be determined if the signatures were generated by the same member</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>The input signatures should be verified using <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig()</a> before invocation. Behavior is undefined if either of the signatures cannot be verified.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig</a> </dd>
+<dd>
+EpidSignBasic </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f" title="Writes an Intel(R) EPID signature. ">EpidSign</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8eaeb9f4a34e9e37ccdf342919f38c69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8eaeb9f4a34e9e37ccdf342919f38c69">&#9670;&nbsp;</a></span>EpidBlacklistSig()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidBlacklistSig </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_signature.html">EpidSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a valid name-based signature to the verifier blacklist. </p>
+<p>If the signature is not valid it will not be added to the blacklist.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The name-based signature to revoke. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_len</td><td>The size of sig in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81" title="Serializes the verifier blacklist to a buffer. ">EpidWriteVerifierRl</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaeb05e6faea6f09c0665b13adc6e7ddea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaeb05e6faea6f09c0665b13adc6e7ddea">&#9670;&nbsp;</a></span>EpidCheckPrivRlEntry()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidCheckPrivRlEntry </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_basic_signature.html">BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>f</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies a signature has not been revoked in the private key based revocation list. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">f</td><td>The private key based revocation list entry.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>Sig should be verified using <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig()</a> before invocation. Behavior is undefined if sig cannot be verified.</dd>
+<dd>
+This function should be used in conjunction with <a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700" title="Verifies the non-revoked proof for a single signature based revocation list entry. ">EpidNrVerify()</a> and <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verify should be considered to have failed.</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700" title="Verifies the non-revoked proof for a single signature based revocation list entry. ">EpidNrVerify</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2a75c7d5775e852a7b6e24178dd4054f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2a75c7d5775e852a7b6e24178dd4054f">&#9670;&nbsp;</a></span>EpidGetVerifierRlSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t EpidGetVerifierRlSize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the number of bytes required to serialize the verifier blacklist. </p>
+<p>Use this function to determine the buffer size required by <a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81" title="Serializes the verifier blacklist to a buffer. ">EpidWriteVerifierRl</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Size in bytes required to serialize the verifier blacklist</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69" title="Adds a valid name-based signature to the verifier blacklist. ">EpidBlacklistSig</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81" title="Serializes the verifier blacklist to a buffer. ">EpidWriteVerifierRl</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac6e2fab59e3af8a33a74a5b201642700"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac6e2fab59e3af8a33a74a5b201642700">&#9670;&nbsp;</a></span>EpidNrVerify()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidNrVerify </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_basic_signature.html">BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a> const *&#160;</td>
+ <td class="paramname"><em>sigrl_entry</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_nr_proof.html">NrProof</a> const *&#160;</td>
+ <td class="paramname"><em>proof</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies the non-revoked proof for a single signature based revocation list entry. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sigrl_entry</td><td>The signature based revocation list entry. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">proof</td><td>The non-revoked proof.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>Sig should be verified using <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig()</a> before invocation. Behavior is undefined if sig cannot be verified.</dd>
+<dd>
+This function should be used in conjunction with <a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig()</a> and <a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea" title="Verifies a signature has not been revoked in the private key based revocation list. ">EpidCheckPrivRlEntry()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a>, the verification should be considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e" title="Verifies a member signature without revocation checks. ">EpidVerifyBasicSig</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea" title="Verifies a signature has not been revoked in the private key based revocation list. ">EpidCheckPrivRlEntry</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga1d116daaee5466a1485d26ebc4e3ab70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1d116daaee5466a1485d26ebc4e3ab70">&#9670;&nbsp;</a></span>EpidVerifierCreate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierCreate </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *&#160;</td>
+ <td class="paramname"><em>pub_key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> const *&#160;</td>
+ <td class="paramname"><em>precomp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new verifier context. </p>
+<p>Must be called to create the verifier context that is used by other "Verifier" APIs.</p>
+<p>Allocates memory for the context, then initializes it.</p>
+<p><a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12" title="Deletes an existing verifier context. ">EpidVerifierDelete()</a> must be called to safely release the member context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">pub_key</td><td>The group certificate. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">precomp</td><td>Optional pre-computed data. If NULL the value is computed internally and is readable using <a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392" title="Serializes the pre-computed verifier settings. ">EpidVerifierWritePrecomp()</a>. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ctx</td><td>Newly constructed verifier context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the content of ctx is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12" title="Deletes an existing verifier context. ">EpidVerifierDelete</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392" title="Serializes the pre-computed verifier settings. ">EpidVerifierWritePrecomp</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga6707e691f4b3916f9c684d5bbd463d12"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6707e691f4b3916f9c684d5bbd463d12">&#9670;&nbsp;</a></span>EpidVerifierDelete()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void EpidVerifierDelete </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes an existing verifier context. </p>
+<p>Must be called to safely release a verifier context created using <a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate()</a>.</p>
+<p>De-initializes the context, frees memory used by the context, and sets the context pointer to NULL.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga1c3810ef361da678a1f77823bd9c37a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1c3810ef361da678a1f77823bd9c37a6">&#9670;&nbsp;</a></span>EpidVerifierSetBasename()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetBasename </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>basename_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the basename to be used by a verifier. </p>
+<dl class="section note"><dt>Note</dt><dd>A successful call to this function will clear the current verifier blacklist.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename</td><td>The basename. Pass NULL for random base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">basename_len</td><td>Number of bytes in basename buffer. Must be 0 if basename is NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga1d41d6ef4dabbc30ec28452edd6baffb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1d41d6ef4dabbc30ec28452edd6baffb">&#9670;&nbsp;</a></span>EpidVerifierSetGroupRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetGroupRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_rl.html">GroupRl</a> const *&#160;</td>
+ <td class="paramname"><em>grp_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>grp_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the group based revocation list. </p>
+<p>The caller is responsible for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call fails if trying to set an older version of the revocation list than was last set.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by grp_rl is accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list is undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by grp_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">grp_rl</td><td>The group based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">grp_rl_size</td><td>The size of the group based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the group based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga97b58b2382f24756b66a357f1e825c92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97b58b2382f24756b66a357f1e825c92">&#9670;&nbsp;</a></span>EpidVerifierSetHashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetHashAlg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the hash algorithm to be used by a verifier. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>The hash algorithm to use.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a>, the hash algorithm used by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890" title="Recognized hash algorithms. ">HashAlg</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gafab08180a43b58ce2e1d56c4b070bb0e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafab08180a43b58ce2e1d56c4b070bb0e">&#9670;&nbsp;</a></span>EpidVerifierSetPrivRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetPrivRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_priv_rl.html">PrivRl</a> const *&#160;</td>
+ <td class="paramname"><em>priv_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>priv_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the private key based revocation list. </p>
+<p>The caller is responsible for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call fails if trying to set an older version of the revocation list than was last set.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by priv_rl is accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list is undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by priv_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">priv_rl</td><td>The private key based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">priv_rl_size</td><td>The size of the private key based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the private key based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga4c7c9820409ee06f30bb8dc75fdd5dcf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4c7c9820409ee06f30bb8dc75fdd5dcf">&#9670;&nbsp;</a></span>EpidVerifierSetSigRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetSigRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_sig_rl.html">SigRl</a> const *&#160;</td>
+ <td class="paramname"><em>sig_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the signature based revocation list. </p>
+<p>The caller is responsible for ensuring the revocation list is authorized, e.g signed by the issuer. The caller is also responsible checking the version of the revocation list. The call fails if trying to set an older version of the revocation list than was last set.</p>
+<dl class="section attention"><dt>Attention</dt><dd>The memory pointed to by sig_rl is accessed directly by the verifier until a new list is set or the verifier is destroyed. Do not modify the contents of this memory. The behavior of subsequent operations that rely on the revocation list is undefined if the memory is modified.</dd>
+<dd>
+It is the responsibility of the caller to free the memory pointed to by sig_rl after the verifier is no longer using it.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl</td><td>The signature based revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_rl_size</td><td>The size of the signature based revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the signature based revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga0909703a0a4dfe080374d0d99077465a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0909703a0a4dfe080374d0d99077465a">&#9670;&nbsp;</a></span>EpidVerifierSetVerifierRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierSetVerifierRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_verifier_rl.html">VerifierRl</a> const *&#160;</td>
+ <td class="paramname"><em>ver_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>ver_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the verifier revocation list. </p>
+<p>The caller is responsible for ensuring the revocation list is authorized. The caller is also responsible for checking the version of the revocation list. The call fails if trying to set an older version of the same revocation list than was last set.</p>
+<p>Once <a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a> returns, callers are free to release the memory pointed to by ver_rl.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ver_rl</td><td>The verifier revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ver_rl_size</td><td>The size of the verifier revocation list in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verifier revocation list pointed to by the verifier is undefined.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69" title="Adds a valid name-based signature to the verifier blacklist. ">EpidBlacklistSig</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81" title="Serializes the verifier blacklist to a buffer. ">EpidWriteVerifierRl</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga92df4d00ea4ee59d7bfd35b23da03392"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga92df4d00ea4ee59d7bfd35b23da03392">&#9670;&nbsp;</a></span>EpidVerifierWritePrecomp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifierWritePrecomp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> *&#160;</td>
+ <td class="paramname"><em>precomp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes the pre-computed verifier settings. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">precomp</td><td>The Serialized pre-computed verifier settings. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the content of precomp is undefined.</dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gae3f9c37628e18b880d8bbee3e7f55064"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae3f9c37628e18b880d8bbee3e7f55064">&#9670;&nbsp;</a></span>EpidVerify()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerify </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_signature.html">EpidSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>sig_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies a signature and checks revocation status. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig_len</td><td>The size of sig in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e" title="Signature is valid. ">kEpidSigValid</a></td><td>Signature validated successfully </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Signature is invalid </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5" title="Signature revoked in GroupRl. ">kEpidSigRevokedInGroupRl</a></td><td>Signature revoked in <a class="el" href="struct_group_rl.html" title="group revocation list ">GroupRl</a> </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1" title="Signature revoked in PrivRl. ">kEpidSigRevokedInPrivRl</a></td><td>Signature revoked in <a class="el" href="struct_priv_rl.html" title="private-key based revocation list. ">PrivRl</a> </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c" title="Signature revoked in SigRl. ">kEpidSigRevokedInSigRl</a></td><td>Signature revoked in <a class="el" href="struct_sig_rl.html" title="signature based revocation list ">SigRl</a> </td></tr>
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298" title="Signature revoked in VerifierRl. ">kEpidSigRevokedInVerifierRl</a></td><td>Signature revoked in <a class="el" href="struct_verifier_rl.html">VerifierRl</a></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> or one of the values listed above the verify should be considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+EpidSignBasic </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f" title="Writes an Intel(R) EPID signature. ">EpidSign</a></dd></dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gac3b1f1a2bdba8eeeebbf1e0c8c00862e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">&#9670;&nbsp;</a></span>EpidVerifyBasicSig()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidVerifyBasicSig </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_basic_signature.html">BasicSignature</a> const *&#160;</td>
+ <td class="paramname"><em>sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Verifies a member signature without revocation checks. </p>
+<p>Used in constrained environments where, due to limited memory, it may not be possible to process through a large and potentially unbounded revocation list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The basic signature. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message that was signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>This function should be used in conjunction with <a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700" title="Verifies the non-revoked proof for a single signature based revocation list entry. ">EpidNrVerify()</a> and <a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea" title="Verifies a signature has not been revoked in the private key based revocation list. ">EpidCheckPrivRlEntry()</a>.</dd>
+<dd>
+If the result is not <a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9" title="no error ">kEpidNoErr</a> the verify should be considered to have failed.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+EpidSignBasic </dd>
+<dd>
+<a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f" title="Writes an Intel(R) EPID signature. ">EpidSign</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac857bff47e7d80363eac15285471fe81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac857bff47e7d80363eac15285471fe81">&#9670;&nbsp;</a></span>EpidWriteVerifierRl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidWriteVerifierRl </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_verifier_rl.html">VerifierRl</a> *&#160;</td>
+ <td class="paramname"><em>ver_rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>ver_rl_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes the verifier blacklist to a buffer. </p>
+<p>If the current blacklist is empty or not set a valid empty verifier blacklist will be serialized.</p>
+<p>Use <a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f" title="Returns the number of bytes required to serialize the verifier blacklist. ">EpidGetVerifierRlSize</a> to determine the buffer size required to serialize the verifier blacklist.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The verifier context. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ver_rl</td><td>An existing buffer in which to write the verifier revocation list. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ver_rl_size</td><td>The size of the caller allocated output buffer in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70" title="Creates a new verifier context. ">EpidVerifierCreate</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a" title="Sets the verifier revocation list. ">EpidVerifierSetVerifierRl</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69" title="Adds a valid name-based signature to the verifier blacklist. ">EpidBlacklistSig</a> </dd>
+<dd>
+<a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f" title="Returns the number of bytes required to serialize the verifier blacklist. ">EpidGetVerifierRlSize</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___epid_verifier_module.js b/doc/html/group___epid_verifier_module.js
new file mode 100644
index 0000000..9b10202
--- /dev/null
+++ b/doc/html/group___epid_verifier_module.js
@@ -0,0 +1,29 @@
+var group___epid_verifier_module =
+[
+ [ "Intel(R) EPID 1.1 support", "group___epid11_verifier_module.html", "group___epid11_verifier_module" ],
+ [ "VerifierPrecomp", "struct_verifier_precomp.html", [
+ [ "e12", "struct_verifier_precomp.html#ad1106376f12772942af0331eb74de6e5", null ],
+ [ "e22", "struct_verifier_precomp.html#af8fd90f3a5a2be932a97dcd86099d5b2", null ],
+ [ "e2w", "struct_verifier_precomp.html#a8caf79578e3c0baf91921460391103ca", null ],
+ [ "eg12", "struct_verifier_precomp.html#ab061d6cc07d1467eeb5bf25f3ea7e306", null ],
+ [ "gid", "struct_verifier_precomp.html#afc3e29a325c95c62bb192d5f8cdd5c1c", null ]
+ ] ],
+ [ "VerifierCtx", "group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c", null ],
+ [ "EpidAreSigsLinked", "group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8", null ],
+ [ "EpidBlacklistSig", "group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69", null ],
+ [ "EpidCheckPrivRlEntry", "group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea", null ],
+ [ "EpidGetVerifierRlSize", "group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f", null ],
+ [ "EpidNrVerify", "group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700", null ],
+ [ "EpidVerifierCreate", "group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70", null ],
+ [ "EpidVerifierDelete", "group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12", null ],
+ [ "EpidVerifierSetBasename", "group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6", null ],
+ [ "EpidVerifierSetGroupRl", "group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb", null ],
+ [ "EpidVerifierSetHashAlg", "group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92", null ],
+ [ "EpidVerifierSetPrivRl", "group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e", null ],
+ [ "EpidVerifierSetSigRl", "group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf", null ],
+ [ "EpidVerifierSetVerifierRl", "group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a", null ],
+ [ "EpidVerifierWritePrecomp", "group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392", null ],
+ [ "EpidVerify", "group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064", null ],
+ [ "EpidVerifyBasicSig", "group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e", null ],
+ [ "EpidWriteVerifierRl", "group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___error_codes.html b/doc/html/group___error_codes.html
new file mode 100644
index 0000000..608c2ab
--- /dev/null
+++ b/doc/html/group___error_codes.html
@@ -0,0 +1,222 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: errors</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___error_codes.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">errors<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Error reporting interface.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gafdb27c77c2c4b32c807e326a8a0da360"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> { <br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> = 0,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e">kEpidSigValid</a> = 0,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8">kEpidSigInvalid</a> = 1,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5">kEpidSigRevokedInGroupRl</a> = 2,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1">kEpidSigRevokedInPrivRl</a> = 3,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c">kEpidSigRevokedInSigRl</a> = 4,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298">kEpidSigRevokedInVerifierRl</a> = 5,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e">kEpidErr</a> = -999,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7">kEpidNotImpl</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf">kEpidBadArgErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c">kEpidNoMemErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8">kEpidMemAllocErr</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6">kEpidMathErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3">kEpidDivByZeroErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec">kEpidUnderflowErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4">kEpidHashAlgorithmNotSupported</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357">kEpidRandMaxIterErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f">kEpidDuplicateErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df">kEpidInconsistentBasenameSetErr</a>,
+<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129">kEpidMathQuadraticNonResidueError</a>,
+<br />
+&#160;&#160;<a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43">kEpidOutOfSequenceError</a>
+<br />
+ }</td></tr>
+<tr class="memdesc:gafdb27c77c2c4b32c807e326a8a0da360"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return status for SDK functions. <a href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">More...</a><br /></td></tr>
+<tr class="separator:gafdb27c77c2c4b32c807e326a8a0da360"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga59e8680ce52509302fd58a987e45004d"><td class="memItemLeft" align="right" valign="top">char const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___error_codes.html#ga59e8680ce52509302fd58a987e45004d">EpidStatusToString</a> (<a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> e)</td></tr>
+<tr class="memdesc:ga59e8680ce52509302fd58a987e45004d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns string representation of error code. <a href="#ga59e8680ce52509302fd58a987e45004d">More...</a><br /></td></tr>
+<tr class="separator:ga59e8680ce52509302fd58a987e45004d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Error reporting interface. </p>
+<p>This module defines the return status type. It also provides tools for interactions with status values, such as converting them to a string. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gafdb27c77c2c4b32c807e326a8a0da360"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdb27c77c2c4b32c807e326a8a0da360">&#9670;&nbsp;</a></span>EpidStatus</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Return status for SDK functions. </p>
+<p>Convention for status values is as follows:</p><ul>
+<li>Zero indicates "success"</li>
+<li>Any positive number indicates "success with status"</li>
+<li>Any negative number indicates "failure" </li>
+</ul>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9"></a>kEpidNoErr&#160;</td><td class="fielddoc"><p>no error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e"></a>kEpidSigValid&#160;</td><td class="fielddoc"><p>Signature is valid. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8"></a>kEpidSigInvalid&#160;</td><td class="fielddoc"><p>Signature is invalid. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5"></a>kEpidSigRevokedInGroupRl&#160;</td><td class="fielddoc"><p>Signature revoked in <a class="el" href="struct_group_rl.html" title="group revocation list ">GroupRl</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1"></a>kEpidSigRevokedInPrivRl&#160;</td><td class="fielddoc"><p>Signature revoked in <a class="el" href="struct_priv_rl.html" title="private-key based revocation list. ">PrivRl</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c"></a>kEpidSigRevokedInSigRl&#160;</td><td class="fielddoc"><p>Signature revoked in <a class="el" href="struct_sig_rl.html" title="signature based revocation list ">SigRl</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298"></a>kEpidSigRevokedInVerifierRl&#160;</td><td class="fielddoc"><p>Signature revoked in <a class="el" href="struct_verifier_rl.html">VerifierRl</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e"></a>kEpidErr&#160;</td><td class="fielddoc"><p>unspecified error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7"></a>kEpidNotImpl&#160;</td><td class="fielddoc"><p>not implemented error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf"></a>kEpidBadArgErr&#160;</td><td class="fielddoc"><p>incorrect arg to function </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c"></a>kEpidNoMemErr&#160;</td><td class="fielddoc"><p>not enough memory for the operation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8"></a>kEpidMemAllocErr&#160;</td><td class="fielddoc"><p>insufficient memory allocated for operation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6"></a>kEpidMathErr&#160;</td><td class="fielddoc"><p>internal math error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3"></a>kEpidDivByZeroErr&#160;</td><td class="fielddoc"><p>an attempt to divide by zero </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec"></a>kEpidUnderflowErr&#160;</td><td class="fielddoc"><p>a value became less than minimum supported level </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4"></a>kEpidHashAlgorithmNotSupported&#160;</td><td class="fielddoc"><p>unsupported hash algorithm type </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357"></a>kEpidRandMaxIterErr&#160;</td><td class="fielddoc"><p>reached max iteration for random number generation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f"></a>kEpidDuplicateErr&#160;</td><td class="fielddoc"><p>argument would add duplicate entry </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df"></a>kEpidInconsistentBasenameSetErr&#160;</td><td class="fielddoc"><p>set basename conflicts with arguments </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129"></a>kEpidMathQuadraticNonResidueError&#160;</td><td class="fielddoc"><p>quadratic Non-Residue Error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43"></a>kEpidOutOfSequenceError&#160;</td><td class="fielddoc"><p>operation was performed out of sequence </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga59e8680ce52509302fd58a987e45004d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga59e8680ce52509302fd58a987e45004d">&#9670;&nbsp;</a></span>EpidStatusToString()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char const* EpidStatusToString </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td>
+ <td class="paramname"><em>e</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns string representation of error code. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">e</td><td>The status value.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The string describing the status. </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___error_codes.js b/doc/html/group___error_codes.js
new file mode 100644
index 0000000..84205b4
--- /dev/null
+++ b/doc/html/group___error_codes.js
@@ -0,0 +1,27 @@
+var group___error_codes =
+[
+ [ "EpidStatus", "group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360", [
+ [ "kEpidNoErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9", null ],
+ [ "kEpidSigValid", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e", null ],
+ [ "kEpidSigInvalid", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8", null ],
+ [ "kEpidSigRevokedInGroupRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5", null ],
+ [ "kEpidSigRevokedInPrivRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1", null ],
+ [ "kEpidSigRevokedInSigRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c", null ],
+ [ "kEpidSigRevokedInVerifierRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298", null ],
+ [ "kEpidErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e", null ],
+ [ "kEpidNotImpl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7", null ],
+ [ "kEpidBadArgErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf", null ],
+ [ "kEpidNoMemErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c", null ],
+ [ "kEpidMemAllocErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8", null ],
+ [ "kEpidMathErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6", null ],
+ [ "kEpidDivByZeroErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3", null ],
+ [ "kEpidUnderflowErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec", null ],
+ [ "kEpidHashAlgorithmNotSupported", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4", null ],
+ [ "kEpidRandMaxIterErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357", null ],
+ [ "kEpidDuplicateErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f", null ],
+ [ "kEpidInconsistentBasenameSetErr", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df", null ],
+ [ "kEpidMathQuadraticNonResidueError", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129", null ],
+ [ "kEpidOutOfSequenceError", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43", null ]
+ ] ],
+ [ "EpidStatusToString", "group___error_codes.html#ga59e8680ce52509302fd58a987e45004d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___file_parser.html b/doc/html/group___file_parser.html
new file mode 100644
index 0000000..22e9357
--- /dev/null
+++ b/doc/html/group___file_parser.html
@@ -0,0 +1,547 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: fileparser</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___file_parser.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">fileparser<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Parser for issuer material.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid11_file_parser_module"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_file_parser_module.html">Intel(R) EPID 1.1 support</a></td></tr>
+<tr class="memdesc:group___epid11_file_parser_module"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parser for 1.1 issuer material. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_file_header.html">EpidFileHeader</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID binary file header. <a href="struct_epid_file_header.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">IoT CA Certificate binary format. <a href="struct_epid_ca_certificate.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga1562efc7c1891875d6b2b9180d65de9d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a> { <a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc">kEpid1x</a>,
+<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2">kEpid2x</a>,
+<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">kNumEpidVersions</a>
+ }</td></tr>
+<tr class="memdesc:ga1562efc7c1891875d6b2b9180d65de9d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized Intel(R) EPID versions. <a href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">More...</a><br /></td></tr>
+<tr class="separator:ga1562efc7c1891875d6b2b9180d65de9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a> { <br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92">kIssuingCaPubKeyFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e">kGroupPubKeyFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322">kPrivRlFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710">kSigRlFile</a>,
+<br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770">kGroupRlFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911">kPrivRlRequestFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600">kSigRlRequestFile</a>,
+<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c">kGroupRlRequestFile</a>,
+<br />
+&#160;&#160;<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">kNumFileTypes</a>
+<br />
+ }</td></tr>
+<tr class="memdesc:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized Intel(R) EPID file types. <a href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">More...</a><br /></td></tr>
+<tr class="separator:ga9a33be7edc6b4c7a867fb07bd2bddecb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55">EpidParseFileHeader</a> (void const *buf, size_t len, <a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a> *epid_version, <a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a> *file_type)</td></tr>
+<tr class="memdesc:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts Intel(R) EPID Binary Output File header information. <a href="#ga8e38d1102eb1dd9b5af2e2f79236da55">More...</a><br /></td></tr>
+<tr class="separator:ga8e38d1102eb1dd9b5af2e2f79236da55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb">EpidParseGroupPubKeyFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> *pubkey)</td></tr>
+<tr class="memdesc:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group public key from buffer in issuer binary format. <a href="#ga43fdbc1bf2edd3695d21cb457365afbb">More...</a><br /></td></tr>
+<tr class="separator:ga43fdbc1bf2edd3695d21cb457365afbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e">EpidParsePrivRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_priv_rl.html">PrivRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts private key revocation list from buffer in issuer binary format. <a href="#gadc033fb23e3cbda56aa7e3d412060b7e">More...</a><br /></td></tr>
+<tr class="separator:gadc033fb23e3cbda56aa7e3d412060b7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f">EpidParseSigRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_sig_rl.html">SigRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts signature revocation list from buffer in issuer binary format. <a href="#ga237ef5a43076aa6fc6eb18829a93da3f">More...</a><br /></td></tr>
+<tr class="separator:ga237ef5a43076aa6fc6eb18829a93da3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad767f72dc55307b872a8b5600da3fd6f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f">EpidParseGroupRlFile</a> (void const *buf, size_t len, <a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *cert, <a class="el" href="struct_group_rl.html">GroupRl</a> *rl, size_t *rl_len)</td></tr>
+<tr class="memdesc:gad767f72dc55307b872a8b5600da3fd6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts group revocation list from buffer in issuer binary format. <a href="#gad767f72dc55307b872a8b5600da3fd6f">More...</a><br /></td></tr>
+<tr class="separator:gad767f72dc55307b872a8b5600da3fd6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:gaae808987ce82188dff42baa4e43cab82"><td class="memItemLeft" align="right" valign="top"><a id="gaae808987ce82188dff42baa4e43cab82"></a>
+const <a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#gaae808987ce82188dff42baa4e43cab82">kEpidVersionCode</a> [<a class="el" href="group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d">kNumEpidVersions</a>]</td></tr>
+<tr class="memdesc:gaae808987ce82188dff42baa4e43cab82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encoding of issuer material Intel(R) EPID versions. <br /></td></tr>
+<tr class="separator:gaae808987ce82188dff42baa4e43cab82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3770c39a0546c79447c9d4159d794c33"><td class="memItemLeft" align="right" valign="top"><a id="ga3770c39a0546c79447c9d4159d794c33"></a>
+const <a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33">kEpidFileTypeCode</a> [<a class="el" href="group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811">kNumFileTypes</a>]</td></tr>
+<tr class="memdesc:ga3770c39a0546c79447c9d4159d794c33"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encoding of issuer material file types. <br /></td></tr>
+<tr class="separator:ga3770c39a0546c79447c9d4159d794c33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Parser for issuer material. </p>
+<p>Provides an API for parsing buffers formatted according to the various IoT Intel(R) EPID binary file formats.</p>
+<p>To use this module, include the header <a class="el" href="file__parser_8h.html" title="Intel(R) EPID issuer material parsing utilities. ">epid/common/file_parser.h</a>. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga9a33be7edc6b4c7a867fb07bd2bddecb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9a33be7edc6b4c7a867fb07bd2bddecb">&#9670;&nbsp;</a></span>EpidFileType</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Recognized Intel(R) EPID file types. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92"></a>kIssuingCaPubKeyFile&#160;</td><td class="fielddoc"><p>IoT Issuing CA public key file. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e"></a>kGroupPubKeyFile&#160;</td><td class="fielddoc"><p>Group Public Key Output File Format. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322"></a>kPrivRlFile&#160;</td><td class="fielddoc"><p>Binary Private Key Revocation List. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710"></a>kSigRlFile&#160;</td><td class="fielddoc"><p>Binary Signature Revocation List. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770"></a>kGroupRlFile&#160;</td><td class="fielddoc"><p>Binary Group Revocation List. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911"></a>kPrivRlRequestFile&#160;</td><td class="fielddoc"><p>Binary Private Key Revocation Request. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600"></a>kSigRlRequestFile&#160;</td><td class="fielddoc"><p>Binary Signature Revocation Request. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c"></a>kGroupRlRequestFile&#160;</td><td class="fielddoc"><p>Binary Group Revocation Request. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811"></a>kNumFileTypes&#160;</td><td class="fielddoc"><p>Maximum number of file types. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="ga1562efc7c1891875d6b2b9180d65de9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1562efc7c1891875d6b2b9180d65de9d">&#9670;&nbsp;</a></span>EpidVersion</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Recognized Intel(R) EPID versions. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc"></a>kEpid1x&#160;</td><td class="fielddoc"><p>Intel(R) EPID version 1.x. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2"></a>kEpid2x&#160;</td><td class="fielddoc"><p>Intel(R) EPID version 2.x. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d"></a>kNumEpidVersions&#160;</td><td class="fielddoc"><p>Maximum number of versions. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga8e38d1102eb1dd9b5af2e2f79236da55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e38d1102eb1dd9b5af2e2f79236da55">&#9670;&nbsp;</a></span>EpidParseFileHeader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidParseFileHeader </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d">EpidVersion</a> *&#160;</td>
+ <td class="paramname"><em>epid_version</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb">EpidFileType</a> *&#160;</td>
+ <td class="paramname"><em>file_type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts Intel(R) EPID Binary Output File header information. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing Intel(R) EPID Binary Output File to parse.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">epid_version</td><td>The extracted Intel(R) EPID version or kNumEpidVersions if Intel(R) EPID version is unknown. Pass NULL to not extract.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">file_type</td><td>The extracted Intel(R) EPID file type or kNumFileTypes if file type is unknown. Pass NULL to not extract.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga43fdbc1bf2edd3695d21cb457365afbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga43fdbc1bf2edd3695d21cb457365afbb">&#9670;&nbsp;</a></span>EpidParseGroupPubKeyFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidParseGroupPubKeyFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a> *&#160;</td>
+ <td class="paramname"><em>pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts group public key from buffer in issuer binary format. </p>
+<p>Extracts the first group public key from a buffer with format of Intel(R) EPID 2.0 Group Public Key Certificate Binary File. The function validates that the first public key was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing public key to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">pubkey</td><td>The extracted group public key.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p><b>Examples</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gad767f72dc55307b872a8b5600da3fd6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad767f72dc55307b872a8b5600da3fd6f">&#9670;&nbsp;</a></span>EpidParseGroupRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidParseGroupRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_group_rl.html">GroupRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts group revocation list from buffer in issuer binary format. </p>
+<p>Extracts the group revocation list from a buffer with format of Binary Group Certificate Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="gadc033fb23e3cbda56aa7e3d412060b7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadc033fb23e3cbda56aa7e3d412060b7e">&#9670;&nbsp;</a></span>EpidParsePrivRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidParsePrivRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_priv_rl.html">PrivRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts private key revocation list from buffer in issuer binary format. </p>
+<p>Extracts the private key revocation list from a buffer with format of Binary Private Key Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p><b>Example</b> </p>
+<p><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+<a id="ga237ef5a43076aa6fc6eb18829a93da3f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga237ef5a43076aa6fc6eb18829a93da3f">&#9670;&nbsp;</a></span>EpidParseSigRlFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> EpidParseSigRlFile </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a> const *&#160;</td>
+ <td class="paramname"><em>cert</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_sig_rl.html">SigRl</a> *&#160;</td>
+ <td class="paramname"><em>rl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t *&#160;</td>
+ <td class="paramname"><em>rl_len</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extracts signature revocation list from buffer in issuer binary format. </p>
+<p>Extracts the signature based revocation list from a buffer with format of Binary Signature Revocation List File. The function validates that the revocation list was signed by the private key corresponding to the provided CA certificate and the size of the input buffer is correct.</p>
+<p>To determine the required size of the revocation list output buffer, provide a null pointer for the output buffer.</p>
+<dl class="section warning"><dt>Warning</dt><dd>It is the responsibility of the caller to authenticate the <a class="el" href="struct_epid_ca_certificate.html" title="IoT CA Certificate binary format. ">EpidCaCertificate</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">buf</td><td>Pointer to buffer containing the revocation list to extract.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of buf in bytes.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">cert</td><td>The issuing CA public key certificate.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rl</td><td>The extracted revocation list. If Null, rl_len is filled with the required output buffer size.</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">rl_len</td><td>The size of rl in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8" title="Signature is invalid. ">kEpidSigInvalid</a></td><td>Parsing failed due to data authentication failure.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p><b>Examples</b> </p>
+<p><a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___file_parser.js b/doc/html/group___file_parser.js
new file mode 100644
index 0000000..1fe5f83
--- /dev/null
+++ b/doc/html/group___file_parser.js
@@ -0,0 +1,42 @@
+var group___file_parser =
+[
+ [ "Intel(R) EPID 1.1 support", "group___epid11_file_parser_module.html", "group___epid11_file_parser_module" ],
+ [ "EpidFileHeader", "struct_epid_file_header.html", [
+ [ "epid_version", "struct_epid_file_header.html#a35d43c51c1739940381e4898ca87b824", null ],
+ [ "file_type", "struct_epid_file_header.html#af5d48c739cc6c00c6e1ce35abf4f1473", null ]
+ ] ],
+ [ "EpidCaCertificate", "struct_epid_ca_certificate.html", [
+ [ "a", "struct_epid_ca_certificate.html#a2811c1914ffae913820f13da914c8f01", null ],
+ [ "b", "struct_epid_ca_certificate.html#a280e0b0238cf45834c21849ab8a7e124", null ],
+ [ "header", "struct_epid_ca_certificate.html#ac03cf7257c52ad14e3dd3201b930dd50", null ],
+ [ "prime", "struct_epid_ca_certificate.html#a3a44e8050ca2f5085652b2b4e15b779c", null ],
+ [ "pubkey", "struct_epid_ca_certificate.html#a9d2fc21f46cf9fc96e2ea557b70e5356", null ],
+ [ "r", "struct_epid_ca_certificate.html#ab9d4c318b1fc8d38d3ce53b29f2dfee2", null ],
+ [ "signature", "struct_epid_ca_certificate.html#a2f8f09ae02919c379c38386668b47418", null ],
+ [ "x", "struct_epid_ca_certificate.html#a4f77996f90ed7da1d0503c4236b2c9d1", null ],
+ [ "y", "struct_epid_ca_certificate.html#abd69cce8d5e3940787ee0d17f72184ab", null ]
+ ] ],
+ [ "EpidFileType", "group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb", [
+ [ "kIssuingCaPubKeyFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92", null ],
+ [ "kGroupPubKeyFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e", null ],
+ [ "kPrivRlFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322", null ],
+ [ "kSigRlFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710", null ],
+ [ "kGroupRlFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770", null ],
+ [ "kPrivRlRequestFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911", null ],
+ [ "kSigRlRequestFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600", null ],
+ [ "kGroupRlRequestFile", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c", null ],
+ [ "kNumFileTypes", "group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811", null ]
+ ] ],
+ [ "EpidVersion", "group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d", [
+ [ "kEpid1x", "group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc", null ],
+ [ "kEpid2x", "group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2", null ],
+ [ "kNumEpidVersions", "group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d", null ]
+ ] ],
+ [ "EpidParseFileHeader", "group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55", null ],
+ [ "EpidParseGroupPubKeyFile", "group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb", null ],
+ [ "EpidParseGroupRlFile", "group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f", null ],
+ [ "EpidParsePrivRlFile", "group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e", null ],
+ [ "EpidParseSigRlFile", "group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f", null ],
+ [ "kEpidFileTypeCode", "group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33", null ],
+ [ "kEpidVersionCode", "group___file_parser.html#gaae808987ce82188dff42baa4e43cab82", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___finite_field_primitives.html b/doc/html/group___finite_field_primitives.html
new file mode 100644
index 0000000..6e1ec2f
--- /dev/null
+++ b/doc/html/group___finite_field_primitives.html
@@ -0,0 +1,1379 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: finitefield</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___finite_field_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">finitefield<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Finite field operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gab281b24e336a8b3d7d90079d862d969e"><td class="memItemLeft" align="right" valign="top"><a id="gab281b24e336a8b3d7d90079d862d969e"></a>
+typedef struct <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a></td></tr>
+<tr class="memdesc:gab281b24e336a8b3d7d90079d862d969e"><td class="mdescLeft">&#160;</td><td class="mdescRight">A finite field. <br /></td></tr>
+<tr class="separator:gab281b24e336a8b3d7d90079d862d969e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="memItemLeft" align="right" valign="top"><a id="ga6cff5c7c06b07a87442b810ccc0a86fa"></a>
+typedef struct <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a></td></tr>
+<tr class="memdesc:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">An element in a finite field. <br /></td></tr>
+<tr class="separator:ga6cff5c7c06b07a87442b810ccc0a86fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c">NewFiniteField</a> (<a class="el" href="struct_big_num_str.html">BigNumStr</a> const *prime, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates new finite field. <a href="#ga7d99fdc5e4573668a5744e49df7ab67c">More...</a><br /></td></tr>
+<tr class="separator:ga7d99fdc5e4573668a5744e49df7ab67c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2">NewFiniteFieldViaBinomalExtension</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ground_field, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ground_element, int degree, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field using binomial extension. <a href="#ga83041e3be9984a4bd8f1021934bfa3a2">More...</a><br /></td></tr>
+<tr class="separator:ga83041e3be9984a4bd8f1021934bfa3a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae69af62a03179718cac81b004549c598"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598">NewFiniteFieldViaPolynomialExtension</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ground_field, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *irr_polynomial, int degree, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:gae69af62a03179718cac81b004549c598"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field using polynomial extension. <a href="#gae69af62a03179718cac81b004549c598">More...</a><br /></td></tr>
+<tr class="separator:gae69af62a03179718cac81b004549c598"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f">DeleteFiniteField</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **ff)</td></tr>
+<tr class="memdesc:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated FiniteField. <a href="#gacbdd2871ecf93dadaac9d2c5b16e1e5f">More...</a><br /></td></tr>
+<tr class="separator:gacbdd2871ecf93dadaac9d2c5b16e1e5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c">NewFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **new_ff_elem)</td></tr>
+<tr class="memdesc:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new finite field element. <a href="#gacc54f315ede2dbeb8c5990c024a0de6c">More...</a><br /></td></tr>
+<tr class="separator:gacc54f315ede2dbeb8c5990c024a0de6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e">DeleteFfElement</a> (<a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **ff_elem)</td></tr>
+<tr class="memdesc:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated FfElement. <a href="#ga1bad3c6945d1d709fceb07a1dd03000e">More...</a><br /></td></tr>
+<tr class="separator:ga1bad3c6945d1d709fceb07a1dd03000e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8a143a5a815a62f4947be2de1653c50f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f">ReadFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> ff_elem_str, size_t strlen, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *ff_elem)</td></tr>
+<tr class="memdesc:ga8a143a5a815a62f4947be2de1653c50f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deserializes a FfElement from a string. <a href="#ga8a143a5a815a62f4947be2de1653c50f">More...</a><br /></td></tr>
+<tr class="separator:ga8a143a5a815a62f4947be2de1653c50f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90b2c192708973b54b7a3e82b34536ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed">InitFfElementFromBn</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *bn, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *ff_elem)</td></tr>
+<tr class="memdesc:ga90b2c192708973b54b7a3e82b34536ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes an existing FfElement from a BigNum. <a href="#ga90b2c192708973b54b7a3e82b34536ed">More...</a><br /></td></tr>
+<tr class="separator:ga90b2c192708973b54b7a3e82b34536ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3c1f7515dd823ddad8764091ebc665f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f">WriteFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ff_elem, <a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a> ff_elem_str, size_t strlen)</td></tr>
+<tr class="memdesc:gaa3c1f7515dd823ddad8764091ebc665f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes a finite field element to a string. <a href="#gaa3c1f7515dd823ddad8764091ebc665f">More...</a><br /></td></tr>
+<tr class="separator:gaa3c1f7515dd823ddad8764091ebc665f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2">FfNeg</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculates the additive inverse of a finite field element. <a href="#gae7a8c7503b6fc7a41bcaab4d45ca37b2">More...</a><br /></td></tr>
+<tr class="separator:gae7a8c7503b6fc7a41bcaab4d45ca37b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga26069d035d0f6ade33af2b5d5c14949a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a">FfInv</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga26069d035d0f6ade33af2b5d5c14949a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculates the multiplicative inverse of a finite field element. <a href="#ga26069d035d0f6ade33af2b5d5c14949a">More...</a><br /></td></tr>
+<tr class="separator:ga26069d035d0f6ade33af2b5d5c14949a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b">FfAdd</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds two finite field elements. <a href="#ga1a6e6d3c2319bb24eae8670b021e223b">More...</a><br /></td></tr>
+<tr class="separator:ga1a6e6d3c2319bb24eae8670b021e223b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga59d20610f245ff4bc3a17b7bfe289991"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991">FfSub</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga59d20610f245ff4bc3a17b7bfe289991"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts two finite field elements. <a href="#ga59d20610f245ff4bc3a17b7bfe289991">More...</a><br /></td></tr>
+<tr class="separator:ga59d20610f245ff4bc3a17b7bfe289991"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4613a75bd001a974b3e3e494c3a112a5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5">FfMul</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga4613a75bd001a974b3e3e494c3a112a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiplies two finite field elements. <a href="#ga4613a75bd001a974b3e3e494c3a112a5">More...</a><br /></td></tr>
+<tr class="separator:ga4613a75bd001a974b3e3e494c3a112a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga20d9140e5670d679ef8183d9b5115f53"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53">FfIsZero</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_zero)</td></tr>
+<tr class="memdesc:ga20d9140e5670d679ef8183d9b5115f53"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if given finite field element is the additive identity (zero). <a href="#ga20d9140e5670d679ef8183d9b5115f53">More...</a><br /></td></tr>
+<tr class="separator:ga20d9140e5670d679ef8183d9b5115f53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c">FfExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Raises an element of a finite field to a power. <a href="#gaf0ddbc1bad048d67771cba119eb44a6c">More...</a><br /></td></tr>
+<tr class="separator:gaf0ddbc1bad048d67771cba119eb44a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3">FfMultiExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates finite field elements. <a href="#ga84d21decc1c957bcf6e98e1492eb2ac3">More...</a><br /></td></tr>
+<tr class="separator:ga84d21decc1c957bcf6e98e1492eb2ac3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144">FfMultiExpBn</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multi-exponentiates finite field elements. <a href="#ga1ef46fc83f9c11263a2aa1ec906c9144">More...</a><br /></td></tr>
+<tr class="separator:ga1ef46fc83f9c11263a2aa1ec906c9144"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634">FfSscmMultiExp</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **a, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const **b, size_t m, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software side-channel mitigated implementation of FfMultiExp. <a href="#ga0d0c31a22bbfb665a16b2d25b0cd2634">More...</a><br /></td></tr>
+<tr class="separator:ga0d0c31a22bbfb665a16b2d25b0cd2634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaed2acb8583e9c9f6b49fdb660c672625"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625">FfIsEqual</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *b, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *is_equal)</td></tr>
+<tr class="memdesc:gaed2acb8583e9c9f6b49fdb660c672625"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if two finite field elements are equal. <a href="#gaed2acb8583e9c9f6b49fdb660c672625">More...</a><br /></td></tr>
+<tr class="separator:gaed2acb8583e9c9f6b49fdb660c672625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabd511d79d9cbd1899e59258f149102c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5">FfHash</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a> msg, size_t msg_len, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:gabd511d79d9cbd1899e59258f149102c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes an arbitrary message to an element in a finite field. <a href="#gabd511d79d9cbd1899e59258f149102c5">More...</a><br /></td></tr>
+<tr class="separator:gabd511d79d9cbd1899e59258f149102c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8">FfGetRandom</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *low_bound, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate random finite field element. <a href="#ga6622db072782fd9e53b4d59dd3dbd8e8">More...</a><br /></td></tr>
+<tr class="separator:ga6622db072782fd9e53b4d59dd3dbd8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga39892fe2ab431e166dbbcf57756660f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6">FfSqrt</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *a, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *r)</td></tr>
+<tr class="memdesc:ga39892fe2ab431e166dbbcf57756660f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds a square root of a finite field element. <a href="#ga39892fe2ab431e166dbbcf57756660f6">More...</a><br /></td></tr>
+<tr class="separator:ga39892fe2ab431e166dbbcf57756660f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Finite field operations. </p>
+<p>provides APIs for working with finite fields. Finite fields allow simple mathematical operations based on a finite set of discrete values. The results of these operations are also contained in the same set.</p>
+<p>A simple example of a finite field is all integers from zero that are less than a given value.</p>
+<p>The elements (<a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa" title="An element in a finite field. ">FfElement</a>) of a finite field can be used in a variety of simple mathematical operations that result in elements of the same field. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga1bad3c6945d1d709fceb07a1dd03000e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1bad3c6945d1d709fceb07a1dd03000e">&#9670;&nbsp;</a></span>DeleteFfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteFfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **&#160;</td>
+ <td class="paramname"><em>ff_elem</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Frees a previously allocated FfElement. </p>
+<p>Frees memory pointed to by ff_elem. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff_elem</td><td>The finite field element. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="gacbdd2871ecf93dadaac9d2c5b16e1e5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacbdd2871ecf93dadaac9d2c5b16e1e5f">&#9670;&nbsp;</a></span>DeleteFiniteField()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeleteFiniteField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **&#160;</td>
+ <td class="paramname"><em>ff</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Frees a previously allocated FiniteField. </p>
+<p>Frees memory pointed to by finite field. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The Finite field. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga1a6e6d3c2319bb24eae8670b021e223b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1a6e6d3c2319bb24eae8670b021e223b">&#9670;&nbsp;</a></span>FfAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds two finite field elements. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">a</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">b</td><td>The second operand to be added. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of adding a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf0ddbc1bad048d67771cba119eb44a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf0ddbc1bad048d67771cba119eb44a6c">&#9670;&nbsp;</a></span>FfExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Raises an element of a finite field to a power. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field in which to perform the operation </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The power. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising a to the power b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga6622db072782fd9e53b4d59dd3dbd8e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6622db072782fd9e53b4d59dd3dbd8e8">&#9670;&nbsp;</a></span>FfGetRandom()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfGetRandom </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>low_bound</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate random finite field element. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field associated with the random finite field element. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">low_bound</td><td>Lower bound of the random finite field to be generated. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">r</td><td>The random finite field element.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname"><a class="el" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357" title="reached max iteration for random number generation ">kEpidRandMaxIterErr</a></td><td>the function should be called again with different random data.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd>
+<dd>
+<a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> </dd></dl>
+
+</div>
+</div>
+<a id="gabd511d79d9cbd1899e59258f149102c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabd511d79d9cbd1899e59258f149102c5">&#9670;&nbsp;</a></span>FfHash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfHash </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>msg_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes an arbitrary message to an element in a finite field. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>The message. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg_len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>The hash algorithm. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The hashed value.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga26069d035d0f6ade33af2b5d5c14949a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga26069d035d0f6ade33af2b5d5c14949a">&#9670;&nbsp;</a></span>FfInv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfInv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculates the multiplicative inverse of a finite field element. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The element. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The inverted element.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaed2acb8583e9c9f6b49fdb660c672625"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaed2acb8583e9c9f6b49fdb660c672625">&#9670;&nbsp;</a></span>FfIsEqual()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfIsEqual </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_equal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if two finite field elements are equal. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>An element to check. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>Another element to check. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_equal</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62" title="Constructs a new EcGroup. ">NewEcGroup</a> </dd>
+<dd>
+<a class="el" href="group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb" title="Creates a new EcPoint. ">NewEcPoint</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga20d9140e5670d679ef8183d9b5115f53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga20d9140e5670d679ef8183d9b5115f53">&#9670;&nbsp;</a></span>FfIsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfIsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> *&#160;</td>
+ <td class="paramname"><em>is_zero</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks if given finite field element is the additive identity (zero). </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">a</td><td>The element. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">is_zero</td><td>The result of the check.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga4613a75bd001a974b3e3e494c3a112a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4613a75bd001a974b3e3e494c3a112a5">&#9670;&nbsp;</a></span>FfMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiplies two finite field elements. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">a</td><td>The first operand to be multplied. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">b</td><td>The second operand to be multiplied. If ff is an extension field of a field F then this parameter may be an element of either ff or F. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of multiplying a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga84d21decc1c957bcf6e98e1492eb2ac3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga84d21decc1c957bcf6e98e1492eb2ac3">&#9670;&nbsp;</a></span>FfMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multi-exponentiates finite field elements. </p>
+<p>Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m &gt; 1</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field in which to perform the operation </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga1ef46fc83f9c11263a2aa1ec906c9144"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1ef46fc83f9c11263a2aa1ec906c9144">&#9670;&nbsp;</a></span>FfMultiExpBn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfMultiExpBn </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multi-exponentiates finite field elements. </p>
+<p>Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m &gt; 1</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field in which to perform the operation </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae7a8c7503b6fc7a41bcaab4d45ca37b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7a8c7503b6fc7a41bcaab4d45ca37b2">&#9670;&nbsp;</a></span>FfNeg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfNeg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculates the additive inverse of a finite field element. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The element. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The inverted element.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga39892fe2ab431e166dbbcf57756660f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga39892fe2ab431e166dbbcf57756660f6">&#9670;&nbsp;</a></span>FfSqrt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfSqrt </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Finds a square root of a finite field element. </p>
+<p>This function calculates the square root by the method of false position.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field in which to perform the operation </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname">kEpidMathQuadraticNonResidueError</td><td>No square root could be found. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga0d0c31a22bbfb665a16b2d25b0cd2634"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0d0c31a22bbfb665a16b2d25b0cd2634">&#9670;&nbsp;</a></span>FfSscmMultiExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfSscmMultiExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const **&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const **&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Software side-channel mitigated implementation of FfMultiExp. </p>
+<p>Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m &gt; 1</p>
+<dl class="section attention"><dt>Attention</dt><dd>The reference implementation of FfSscmMultiExp calls FfMultiExp directly because the implementation of FfMultiExp is already side channel mitigated. Implementers providing their own versions of this function are responsible for ensuring that FfSscmMultiExp is side channel mitigated per section 8 of the Intel(R) EPID 2.0 spec.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field in which to perform the operation. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The bases. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The powers. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>Number of entries in a and b. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of raising each a to the corresponding power b and multiplying the results.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga59d20610f245ff4bc3a17b7bfe289991"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga59d20610f245ff4bc3a17b7bfe289991">&#9670;&nbsp;</a></span>FfSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> FfSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts two finite field elements. </p>
+<dl class="section note"><dt>Note</dt><dd>Only needed for Intel(R) EPID 1.1 verification.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">a</td><td>The first operand to use in subtraction. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">b</td><td>The second operand to use in subtraction. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>The result of subtracting a and b.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga90b2c192708973b54b7a3e82b34536ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga90b2c192708973b54b7a3e82b34536ed">&#9670;&nbsp;</a></span>InitFfElementFromBn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> InitFfElementFromBn </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> *&#160;</td>
+ <td class="paramname"><em>bn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>ff_elem</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Initializes an existing FfElement from a BigNum. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. Must be a Prime Field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">bn</td><td>The value to read. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff_elem</td><td>The target FfElement.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f" title="Serializes a finite field element to a string. ">WriteFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="gacc54f315ede2dbeb8c5990c024a0de6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacc54f315ede2dbeb8c5990c024a0de6c">&#9670;&nbsp;</a></span>NewFfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewFfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> **&#160;</td>
+ <td class="paramname"><em>new_ff_elem</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new finite field element. </p>
+<p>Allocates memory and creates a new finite field element.</p>
+<p>Use <a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e" title="Frees a previously allocated FfElement. ">DeleteFfElement()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">new_ff_elem</td><td>The Newly constructed finite field element.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ff exists for the entire lifetime of the new FfElement.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c" title="Creates new finite field. ">NewFiniteField</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e" title="Frees a previously allocated FfElement. ">DeleteFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7d99fdc5e4573668a5744e49df7ab67c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7d99fdc5e4573668a5744e49df7ab67c">&#9670;&nbsp;</a></span>NewFiniteField()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewFiniteField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>prime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **&#160;</td>
+ <td class="paramname"><em>ff</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates new finite field. </p>
+<p>Allocates memory and creates a new finite field GF(prime).</p>
+<p>Use <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">prime</td><td>The order of the finite field. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff</td><td>The newly constructed finite field.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga83041e3be9984a4bd8f1021934bfa3a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83041e3be9984a4bd8f1021934bfa3a2">&#9670;&nbsp;</a></span>NewFiniteFieldViaBinomalExtension()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewFiniteFieldViaBinomalExtension </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ground_field</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>ground_element</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>degree</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **&#160;</td>
+ <td class="paramname"><em>ff</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new finite field using binomial extension. </p>
+<p>Allocates memory and creates a finite field using binomial extension.</p>
+<p>Use <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ground_field</td><td>The ground field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ground_element</td><td>The low-order term of the extension. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">degree</td><td>The degree of the extension. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff</td><td>The newly constructed finite field.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ground_field exists for the entire lifetime of the new FiniteField.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae69af62a03179718cac81b004549c598"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae69af62a03179718cac81b004549c598">&#9670;&nbsp;</a></span>NewFiniteFieldViaPolynomialExtension()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewFiniteFieldViaPolynomialExtension </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *&#160;</td>
+ <td class="paramname"><em>ground_field</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>irr_polynomial</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>degree</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> **&#160;</td>
+ <td class="paramname"><em>ff</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new finite field using polynomial extension. </p>
+<p>Allocates memory and creates a finite field using polynomial extension.</p>
+<p>Use <a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField()</a> to free memory.</p>
+<dl class="section note"><dt>Note</dt><dd>Only needed for Intel(R) EPID 1.1 verification.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ground_field</td><td>The ground field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">irr_polynomial</td><td>Array with coefficients of the irreducible polynomial. Number of elements must be equal to the degree of the extension. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">degree</td><td>The degree of the extension. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff</td><td>The newly constructed finite field.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ground_field exists for the entire lifetime of the new FiniteField.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f" title="Frees a previously allocated FiniteField. ">DeleteFiniteField</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8a143a5a815a62f4947be2de1653c50f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8a143a5a815a62f4947be2de1653c50f">&#9670;&nbsp;</a></span>ReadFfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> ReadFfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a>&#160;</td>
+ <td class="paramname"><em>ff_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>ff_elem</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deserializes a FfElement from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff_elem_str</td><td>The serialized value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of ff_elem_str in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff_elem</td><td>The target FfElement.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd>
+<dd>
+<a class="el" href="group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f" title="Serializes a finite field element to a string. ">WriteFfElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa3c1f7515dd823ddad8764091ebc665f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3c1f7515dd823ddad8764091ebc665f">&#9670;&nbsp;</a></span>WriteFfElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> WriteFfElement </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>ff_elem</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a>&#160;</td>
+ <td class="paramname"><em>ff_elem_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>strlen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serializes a finite field element to a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The finite field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff_elem</td><td>The FfElement to be serialized. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ff_elem_str</td><td>The target string. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">strlen</td><td>The size of ff_elem_str in bytes.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c" title="Creates a new finite field element. ">NewFfElement</a> </dd>
+<dd>
+<a class="el" href="struct_fp_elem_str.html" title="a number in [0, p-1] ">FpElemStr</a> </dd>
+<dd>
+<a class="el" href="struct_fq_elem_str.html" title="a number in [0, q-1] ">FqElemStr</a> </dd>
+<dd>
+<a class="el" href="struct_gt_elem_str.html" title="Serialized GT element. ">GtElemStr</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___finite_field_primitives.js b/doc/html/group___finite_field_primitives.js
new file mode 100644
index 0000000..e199c19
--- /dev/null
+++ b/doc/html/group___finite_field_primitives.js
@@ -0,0 +1,28 @@
+var group___finite_field_primitives =
+[
+ [ "FfElement", "group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa", null ],
+ [ "FiniteField", "group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e", null ],
+ [ "DeleteFfElement", "group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e", null ],
+ [ "DeleteFiniteField", "group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f", null ],
+ [ "FfAdd", "group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b", null ],
+ [ "FfExp", "group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c", null ],
+ [ "FfGetRandom", "group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8", null ],
+ [ "FfHash", "group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5", null ],
+ [ "FfInv", "group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a", null ],
+ [ "FfIsEqual", "group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625", null ],
+ [ "FfIsZero", "group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53", null ],
+ [ "FfMul", "group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5", null ],
+ [ "FfMultiExp", "group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3", null ],
+ [ "FfMultiExpBn", "group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144", null ],
+ [ "FfNeg", "group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2", null ],
+ [ "FfSqrt", "group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6", null ],
+ [ "FfSscmMultiExp", "group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634", null ],
+ [ "FfSub", "group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991", null ],
+ [ "InitFfElementFromBn", "group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed", null ],
+ [ "NewFfElement", "group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c", null ],
+ [ "NewFiniteField", "group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c", null ],
+ [ "NewFiniteFieldViaBinomalExtension", "group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2", null ],
+ [ "NewFiniteFieldViaPolynomialExtension", "group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598", null ],
+ [ "ReadFfElement", "group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f", null ],
+ [ "WriteFfElement", "group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___hash_primitives.html b/doc/html/group___hash_primitives.html
new file mode 100644
index 0000000..ad3f5dd
--- /dev/null
+++ b/doc/html/group___hash_primitives.html
@@ -0,0 +1,146 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: hash</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___hash_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hash<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Hash primitives.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sha256_digest.html">Sha256Digest</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">SHA256 digest. <a href="struct_sha256_digest.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga86d62aac9efd7445acee311b41846c6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c">Sha256MessageDigest</a> (void const *msg, size_t len, <a class="el" href="struct_sha256_digest.html">Sha256Digest</a> *digest)</td></tr>
+<tr class="memdesc:ga86d62aac9efd7445acee311b41846c6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes SHA256 digest of a message. <a href="#ga86d62aac9efd7445acee311b41846c6c">More...</a><br /></td></tr>
+<tr class="separator:ga86d62aac9efd7445acee311b41846c6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Hash primitives. </p>
+<p>Provides APIs for computing digests of messages. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga86d62aac9efd7445acee311b41846c6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86d62aac9efd7445acee311b41846c6c">&#9670;&nbsp;</a></span>Sha256MessageDigest()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Sha256MessageDigest </td>
+ <td>(</td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_sha256_digest.html">Sha256Digest</a> *&#160;</td>
+ <td class="paramname"><em>digest</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes SHA256 digest of a message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">msg</td><td>Message to compute digest for. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">len</td><td>The size of msg in bytes. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">digest</td><td>The resulting message digest.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___hash_primitives.js b/doc/html/group___hash_primitives.js
new file mode 100644
index 0000000..14b9282
--- /dev/null
+++ b/doc/html/group___hash_primitives.js
@@ -0,0 +1,7 @@
+var group___hash_primitives =
+[
+ [ "Sha256Digest", "struct_sha256_digest.html", [
+ [ "data", "struct_sha256_digest.html#a4b6462ddd3f89e4c40220ceb6b1c7f28", null ]
+ ] ],
+ [ "Sha256MessageDigest", "group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___pairing_primitives.html b/doc/html/group___pairing_primitives.html
new file mode 100644
index 0000000..db8f244
--- /dev/null
+++ b/doc/html/group___pairing_primitives.html
@@ -0,0 +1,257 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: pairing</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___pairing_primitives.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pairing<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Pairing operations.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group___epid11_pairing_primitives"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html">Intel(R) EPID 1.1 specific pairing</a></td></tr>
+<tr class="memdesc:group___epid11_pairing_primitives"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 pairing operations. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga29f79a645871830754d396b9b4a2a0cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc">NewPairingState</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *ga, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *gb, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *ff, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *t, <a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a> neg, <a class="el" href="struct_pairing_state.html">PairingState</a> **ps)</td></tr>
+<tr class="memdesc:ga29f79a645871830754d396b9b4a2a0cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new pairing state. <a href="#ga29f79a645871830754d396b9b4a2a0cc">More...</a><br /></td></tr>
+<tr class="separator:ga29f79a645871830754d396b9b4a2a0cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad54aebdc331d39b73000fdca9e04f94d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d">DeletePairingState</a> (<a class="el" href="struct_pairing_state.html">PairingState</a> **ps)</td></tr>
+<tr class="memdesc:gad54aebdc331d39b73000fdca9e04f94d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated by <a class="el" href="struct_pairing_state.html" title="A scratch buffer for stateful pairing calls. ">PairingState</a>. <a href="#gad54aebdc331d39b73000fdca9e04f94d">More...</a><br /></td></tr>
+<tr class="separator:gad54aebdc331d39b73000fdca9e04f94d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga58a9d3cb6129274a04c72a35a52f768d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d">Pairing</a> (<a class="el" href="struct_pairing_state.html">PairingState</a> *ps, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *d)</td></tr>
+<tr class="memdesc:ga58a9d3cb6129274a04c72a35a52f768d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes an Optimal Ate Pairing for two parameters. <a href="#ga58a9d3cb6129274a04c72a35a52f768d">More...</a><br /></td></tr>
+<tr class="separator:ga58a9d3cb6129274a04c72a35a52f768d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Pairing operations. </p>
+<p>Provides APIs for defining and using a pairing relationship between two elliptic curve groups. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gad54aebdc331d39b73000fdca9e04f94d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad54aebdc331d39b73000fdca9e04f94d">&#9670;&nbsp;</a></span>DeletePairingState()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void DeletePairingState </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_pairing_state.html">PairingState</a> **&#160;</td>
+ <td class="paramname"><em>ps</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Frees a previously allocated by <a class="el" href="struct_pairing_state.html" title="A scratch buffer for stateful pairing calls. ">PairingState</a>. </p>
+<p>Frees memory pointed to by pairing state. Nulls the pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ps</td><td>The pairing state. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc" title="Constructs a new pairing state. ">NewPairingState</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga29f79a645871830754d396b9b4a2a0cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29f79a645871830754d396b9b4a2a0cc">&#9670;&nbsp;</a></span>NewPairingState()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> NewPairingState </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>ga</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *&#160;</td>
+ <td class="paramname"><em>gb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> *&#160;</td>
+ <td class="paramname"><em>ff</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>t</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td>
+ <td class="paramname"><em>neg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_pairing_state.html">PairingState</a> **&#160;</td>
+ <td class="paramname"><em>ps</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a new pairing state. </p>
+<p>Allocates memory and creates a new pairing state for Optimal Ate Pairing.</p>
+<p>Use <a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d" title="Frees a previously allocated by PairingState. ">DeletePairingState()</a> to free memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ga</td><td>The EcGroup from which the first parameter of the pairing is taken. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">gb</td><td>The EcGroup from which the second parameter of the pairing is taken. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">ff</td><td>The result finite field. Must be a Fq12 field. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">t</td><td>A positive integer such that 6(t^2) == q - p, where p and q are parameters of G1. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">neg</td><td>Select the alternate "negate" processing path for Optimal Ate Pairing. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ps</td><td>Newly constructed pairing state.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section attention"><dt>Attention</dt><dd>It is the responsibility of the caller to ensure that ga, gb, and ff exist for the entire lifetime of the new <a class="el" href="struct_pairing_state.html" title="A scratch buffer for stateful pairing calls. ">PairingState</a>.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d" title="Frees a previously allocated by PairingState. ">DeletePairingState</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga58a9d3cb6129274a04c72a35a52f768d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga58a9d3cb6129274a04c72a35a52f768d">&#9670;&nbsp;</a></span>Pairing()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Pairing </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_pairing_state.html">PairingState</a> *&#160;</td>
+ <td class="paramname"><em>ps</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes an Optimal Ate Pairing for two parameters. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ps</td><td>The pairing state. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>The first value to pair. Must be in ga used to create ps. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">b</td><td>The second value to pair. Must be in gb used to create ps </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">d</td><td>The result of the pairing. Will be in ff used to create the pairing state.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___pairing_primitives.js b/doc/html/group___pairing_primitives.js
new file mode 100644
index 0000000..fad5c07
--- /dev/null
+++ b/doc/html/group___pairing_primitives.js
@@ -0,0 +1,7 @@
+var group___pairing_primitives =
+[
+ [ "Intel(R) EPID 1.1 specific pairing", "group___epid11_pairing_primitives.html", "group___epid11_pairing_primitives" ],
+ [ "DeletePairingState", "group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d", null ],
+ [ "NewPairingState", "group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc", null ],
+ [ "Pairing", "group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/group___tpm2_module.html b/doc/html/group___tpm2_module.html
new file mode 100644
index 0000000..45dc05d
--- /dev/null
+++ b/doc/html/group___tpm2_module.html
@@ -0,0 +1,790 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: tpm2</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('group___tpm2_module.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tpm2<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_member_module.html">member</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Internal interface that models TPM 2.0 interfaces.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga750e38b6d6cea1b05f605e476df065d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9">Tpm2Commit</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *p1, void const *s2, size_t s2_len, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *y2, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *k, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *l, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *e, uint16_t *counter)</td></tr>
+<tr class="memdesc:ga750e38b6d6cea1b05f605e476df065d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Commit TPM operation. <a href="#ga750e38b6d6cea1b05f605e476df065d9">More...</a><br /></td></tr>
+<tr class="separator:ga750e38b6d6cea1b05f605e476df065d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e">Tpm2CreateContext</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, Epid2Params_ const *epid2_params, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> *rnd_func, void **rnd_param, const <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> **f, <a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new Tpm context. <a href="#ga11a523e65eee3c7ad1ab21239329ce3e">More...</a><br /></td></tr>
+<tr class="separator:ga11a523e65eee3c7ad1ab21239329ce3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga38f47cba4c26320db06aa50a77590ef4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4">Tpm2DeleteContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga38f47cba4c26320db06aa50a77590ef4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing Tpm context. <a href="#ga38f47cba4c26320db06aa50a77590ef4">More...</a><br /></td></tr>
+<tr class="separator:ga38f47cba4c26320db06aa50a77590ef4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11cc131debbca60c0de7e53d48330b69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69">Tpm2SetHashAlg</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga11cc131debbca60c0de7e53d48330b69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a TPM2. <a href="#ga11cc131debbca60c0de7e53d48330b69">More...</a><br /></td></tr>
+<tr class="separator:ga11cc131debbca60c0de7e53d48330b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81">Tpm2ResetContext</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **ctx)</td></tr>
+<tr class="memdesc:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reset an existing Tpm context. <a href="#ga8ee4fed3e1a4dd0c910102430fca8c81">More...</a><br /></td></tr>
+<tr class="separator:ga8ee4fed3e1a4dd0c910102430fca8c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6">Tpm2GetRandom</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, int const num_bits, void *random_data)</td></tr>
+<tr class="memdesc:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get random data. <a href="#gae7f35aaf9045e4e21bc2ec56e384fcf6">More...</a><br /></td></tr>
+<tr class="separator:gae7f35aaf9045e4e21bc2ec56e384fcf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac2507260f635a9c7abd9113cda6918f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">Tpm2LoadExternal</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f_str)</td></tr>
+<tr class="memdesc:gac2507260f635a9c7abd9113cda6918f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invokes TPM2_LoadExternal command. <a href="#gac2507260f635a9c7abd9113cda6918f9">More...</a><br /></td></tr>
+<tr class="separator:gac2507260f635a9c7abd9113cda6918f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadee3a48d63f03d55ea5f02e48d169326"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">Tpm2NvDefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size)</td></tr>
+<tr class="memdesc:gadee3a48d63f03d55ea5f02e48d169326"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_DefineSpace TPM command. <a href="#gadee3a48d63f03d55ea5f02e48d169326">More...</a><br /></td></tr>
+<tr class="separator:gadee3a48d63f03d55ea5f02e48d169326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga38ca781a9a0126223456e677f40e1d22"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">Tpm2NvUndefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index)</td></tr>
+<tr class="memdesc:ga38ca781a9a0126223456e677f40e1d22"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_UndefineSpace TPM command. <a href="#ga38ca781a9a0126223456e677f40e1d22">More...</a><br /></td></tr>
+<tr class="separator:ga38ca781a9a0126223456e677f40e1d22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">Tpm2NvWrite</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void const *data)</td></tr>
+<tr class="memdesc:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Write TPM command. <a href="#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">More...</a><br /></td></tr>
+<tr class="separator:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">Tpm2NvRead</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void *data)</td></tr>
+<tr class="memdesc:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Read TPM command. <a href="#ga2ec34e65adaf46a14a78f24a7fd0e4dd">More...</a><br /></td></tr>
+<tr class="separator:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">Tpm2Sign</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, void const *digest, size_t digest_len, uint16_t counter, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *k, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *s)</td></tr>
+<tr class="memdesc:ga035c8ffba3182ba75a38131e23bb31c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Sign TPM command. <a href="#ga035c8ffba3182ba75a38131e23bb31c7">More...</a><br /></td></tr>
+<tr class="separator:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3735163276efa0da4b793ba935513bb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">Tpm2ReleaseCounter</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint16_t counter)</td></tr>
+<tr class="memdesc:gac3735163276efa0da4b793ba935513bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Erases random r value assosiated with counter. <a href="#gac3735163276efa0da4b793ba935513bb">More...</a><br /></td></tr>
+<tr class="separator:gac3735163276efa0da4b793ba935513bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Internal interface that models TPM 2.0 interfaces. </p>
+<p>Provides an interface that represents operations that can be directly translated to operations on TPM 2.0 devices. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga750e38b6d6cea1b05f605e476df065d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga750e38b6d6cea1b05f605e476df065d9">&#9670;&nbsp;</a></span>Tpm2Commit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2Commit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *&#160;</td>
+ <td class="paramname"><em>p1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>s2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>s2_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *&#160;</td>
+ <td class="paramname"><em>y2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>k</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>l</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> *&#160;</td>
+ <td class="paramname"><em>e</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint16_t *&#160;</td>
+ <td class="paramname"><em>counter</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_Commit TPM operation. </p>
+<p>Generates random r and compute K, L and E points.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">p1</td><td>A point P1 on G1 curve. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">s2</td><td>Octet array used to derive x-coordinate of a point P2. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">s2_len</td><td>Length of s2 buffer. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">y2</td><td>y coordinate of the point associated with s2. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">k</td><td>Result of G1.exp(P2, private key f). </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">l</td><td>Result of G1.exp(P2, random r). </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">e</td><td>Result of G1.exp(P1, random r). </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">counter</td><td>A value associated with the random r. Should be initialized with zero.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga11a523e65eee3c7ad1ab21239329ce3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga11a523e65eee3c7ad1ab21239329ce3e">&#9670;&nbsp;</a></span>Tpm2CreateContext()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2CreateContext </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_member_params.html">MemberParams</a> const *&#160;</td>
+ <td class="paramname"><em>params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">Epid2Params_ const *&#160;</td>
+ <td class="paramname"><em>epid2_params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> *&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void **&#160;</td>
+ <td class="paramname"><em>rnd_param</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> **&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new Tpm context. </p>
+<p>Must be called to create the TPM context that is used by other TPM APIs.</p>
+<p>You need to use a cryptographically secure random number generator to create a TPM context. The <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> is provided as a function prototype for your own implementation of the random number generator.</p>
+<p><a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4" title="Deletes an existing Tpm context. ">Tpm2DeleteContext</a> must be called to safely release the TPM context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">params</td><td>member parameters to initialize rnd_func, rnd_param, ff_elem, ctx.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">epid2_params</td><td>The field and group parameters.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rnd_func</td><td>random function if exists in MemberParms</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">rnd_param</td><td>random parameters if exists in MemberParms</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">f</td><td>seed f if exists in <a class="el" href="struct_member_params.html" title="Software only specific member parameters. ">MemberParams</a></td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">ctx</td><td>Newly constructed TPM context.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4" title="Deletes an existing Tpm context. ">Tpm2DeleteContext</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga38f47cba4c26320db06aa50a77590ef4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga38f47cba4c26320db06aa50a77590ef4">&#9670;&nbsp;</a></span>Tpm2DeleteContext()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Tpm2DeleteContext </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Deletes an existing Tpm context. </p>
+<p>Must be called to safely release a TPM context created using <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a>.</p>
+<p>De-initializes the context, frees memory used by the context, and sets the context pointer to NULL.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The TPM context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae7f35aaf9045e4e21bc2ec56e384fcf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7f35aaf9045e4e21bc2ec56e384fcf6">&#9670;&nbsp;</a></span>Tpm2GetRandom()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2GetRandom </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int const&#160;</td>
+ <td class="paramname"><em>num_bits</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>random_data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get random data. </p>
+<p>This command returns the next num_bits from the random number generator (RNG).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>TPM context.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">num_bits</td><td>Number of bits to return.</td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">random_data</td><td>Output random bits.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac2507260f635a9c7abd9113cda6918f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac2507260f635a9c7abd9113cda6918f9">&#9670;&nbsp;</a></span>Tpm2LoadExternal()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2LoadExternal </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>f_str</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invokes TPM2_LoadExternal command. </p>
+<p>This command is used to load an object that is not a Protected Object into the TPM. The command allows loading of a public area or both a public and sensitive area.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>TPM context.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">f_str</td><td>The f value of the member private key.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="gadee3a48d63f03d55ea5f02e48d169326"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadee3a48d63f03d55ea5f02e48d169326">&#9670;&nbsp;</a></span>Tpm2NvDefineSpace()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2NvDefineSpace </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>nv_index</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_NV_DefineSpace TPM command. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">nv_index</td><td>Handle of the data area. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Size of the data area.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd" title="Performs TPM2_NV_Read TPM command. ">Tpm2NvRead</a> </dd>
+<dd>
+<a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc" title="Performs TPM2_NV_Write TPM command. ">Tpm2NvWrite</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2ec34e65adaf46a14a78f24a7fd0e4dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2ec34e65adaf46a14a78f24a7fd0e4dd">&#9670;&nbsp;</a></span>Tpm2NvRead()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2NvRead </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>nv_index</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint16_t&#160;</td>
+ <td class="paramname"><em>offset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_NV_Read TPM command. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">nv_index</td><td>NV Index to be read. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Number of bytes to read. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset into the area. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">data</td><td>Data read.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc" title="Performs TPM2_NV_Write TPM command. ">Tpm2NvWrite</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga38ca781a9a0126223456e677f40e1d22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga38ca781a9a0126223456e677f40e1d22">&#9670;&nbsp;</a></span>Tpm2NvUndefineSpace()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2NvUndefineSpace </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>nv_index</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_NV_UndefineSpace TPM command. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">nv_index</td><td>Handle of the data area to undefine.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326" title="Performs TPM2_NV_DefineSpace TPM command. ">Tpm2NvDefineSpace</a> </dd></dl>
+
+</div>
+</div>
+<a id="gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">&#9670;&nbsp;</a></span>Tpm2NvWrite()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2NvWrite </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>nv_index</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint16_t&#160;</td>
+ <td class="paramname"><em>offset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_NV_Write TPM command. </p>
+<p>An area in NV memory must be defined prior writing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">nv_index</td><td>NV Index to be write. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Number of bytes to write. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset into the area. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">data</td><td>Data to write.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326" title="Performs TPM2_NV_DefineSpace TPM command. ">Tpm2NvDefineSpace</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac3735163276efa0da4b793ba935513bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac3735163276efa0da4b793ba935513bb">&#9670;&nbsp;</a></span>Tpm2ReleaseCounter()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2ReleaseCounter </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint16_t&#160;</td>
+ <td class="paramname"><em>counter</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Erases random r value assosiated with counter. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">counter</td><td>To be released value associated with the random r generated during TPM2_Commit.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>This function should be used if Tpm2Sign wasn't called after Tpm2Commit which created counter.</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9" title="Performs TPM2_Commit TPM operation. ">Tpm2Commit</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8ee4fed3e1a4dd0c910102430fca8c81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8ee4fed3e1a4dd0c910102430fca8c81">&#9670;&nbsp;</a></span>Tpm2ResetContext()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Tpm2ResetContext </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> **&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Reset an existing Tpm context. </p>
+<p>Must be called to reset a TPM context created using <a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a>.</p>
+<p>Re-initializes the context, reset memory used for primary key.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">ctx</td><td>The TPM context. Can be NULL.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga11cc131debbca60c0de7e53d48330b69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga11cc131debbca60c0de7e53d48330b69">&#9670;&nbsp;</a></span>Tpm2SetHashAlg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2SetHashAlg </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>hash_alg</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the hash algorithm to be used by a TPM2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM2 context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">hash_alg</td><td>The hash algorithm to use.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga035c8ffba3182ba75a38131e23bb31c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga035c8ffba3182ba75a38131e23bb31c7">&#9670;&nbsp;</a></span>Tpm2Sign()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a> Tpm2Sign </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *&#160;</td>
+ <td class="paramname"><em>ctx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>digest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>digest_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint16_t&#160;</td>
+ <td class="paramname"><em>counter</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>k</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Performs TPM2_Sign TPM command. </p>
+<p>Calculate a pair (k, s) an ECDAA signature.</p>
+<p>Private key f must exist in the TPM context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">ctx</td><td>The TPM context. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">digest</td><td>Digest to be signed. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">digest_len</td><td>The size of digest in bytes. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">counter</td><td>A value associated with the random r generated during TPM2_Commit. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">k</td><td>The ECDAA signature k value. Nonce produced by the TPM during signing. </td></tr>
+ <tr><td class="paramdir">[out]</td><td class="paramname">s</td><td>The ECDAA signature s value.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360" title="Return status for SDK functions. ">EpidStatus</a></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e" title="Creates a new Tpm context. ">Tpm2CreateContext</a> </dd>
+<dd>
+<a class="el" href="group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9" title="Performs TPM2_Commit TPM operation. ">Tpm2Commit</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/group___tpm2_module.js b/doc/html/group___tpm2_module.js
new file mode 100644
index 0000000..6f085a0
--- /dev/null
+++ b/doc/html/group___tpm2_module.js
@@ -0,0 +1,16 @@
+var group___tpm2_module =
+[
+ [ "Tpm2Commit", "group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9", null ],
+ [ "Tpm2CreateContext", "group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e", null ],
+ [ "Tpm2DeleteContext", "group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4", null ],
+ [ "Tpm2GetRandom", "group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6", null ],
+ [ "Tpm2LoadExternal", "group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9", null ],
+ [ "Tpm2NvDefineSpace", "group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326", null ],
+ [ "Tpm2NvRead", "group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd", null ],
+ [ "Tpm2NvUndefineSpace", "group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22", null ],
+ [ "Tpm2NvWrite", "group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc", null ],
+ [ "Tpm2ReleaseCounter", "group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb", null ],
+ [ "Tpm2ResetContext", "group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81", null ],
+ [ "Tpm2SetHashAlg", "group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69", null ],
+ [ "Tpm2Sign", "group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hash_8h.html b/doc/html/hash_8h.html
new file mode 100644
index 0000000..4bb1811
--- /dev/null
+++ b/doc/html/hash_8h.html
@@ -0,0 +1,104 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/hash.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('hash_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hash.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Hash primitives.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;limits.h&gt;</code><br />
+<code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sha256_digest.html">Sha256Digest</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">SHA256 digest. <a href="struct_sha256_digest.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga86d62aac9efd7445acee311b41846c6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c">Sha256MessageDigest</a> (void const *msg, size_t len, <a class="el" href="struct_sha256_digest.html">Sha256Digest</a> *digest)</td></tr>
+<tr class="memdesc:ga86d62aac9efd7445acee311b41846c6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes SHA256 digest of a message. <a href="group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c">More...</a><br /></td></tr>
+<tr class="separator:ga86d62aac9efd7445acee311b41846c6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Hash primitives. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="hash_8h.html">hash.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/hashwrap_8h.html b/doc/html/hashwrap_8h.html
new file mode 100644
index 0000000..57e22e7
--- /dev/null
+++ b/doc/html/hashwrap_8h.html
@@ -0,0 +1,264 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/hashwrap.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('hashwrap_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hashwrap.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Decleration of hash wrap function.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mathtypes_8h.html">epid/member/tiny/math/mathtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sha512_8h.html">epid/member/tiny/math/sha512.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sha256_8h.html">epid/member/tiny/math/sha256.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsha__digest.html">sha_digest</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sha Digest Element. <a href="unionsha__digest.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtiny__sha.html">tiny_sha</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tiny Sha wrapper Element. <a href="structtiny__sha.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab168fa663e74cc973af7e79d384df8b0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hashwrap_8h.html#ab168fa663e74cc973af7e79d384df8b0">tinysha_init</a> (<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> sha_type, <a class="el" href="structtiny__sha.html">tiny_sha</a> *s)</td></tr>
+<tr class="memdesc:ab168fa663e74cc973af7e79d384df8b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes the hash state. <a href="#ab168fa663e74cc973af7e79d384df8b0">More...</a><br /></td></tr>
+<tr class="separator:ab168fa663e74cc973af7e79d384df8b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9844075a9ccf12e56f6a07d86b49c98d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hashwrap_8h.html#a9844075a9ccf12e56f6a07d86b49c98d">tinysha_update</a> (<a class="el" href="structtiny__sha.html">tiny_sha</a> *s, void const *data, size_t data_length)</td></tr>
+<tr class="memdesc:a9844075a9ccf12e56f6a07d86b49c98d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes data into state using a chosen hash algorithm. <a href="#a9844075a9ccf12e56f6a07d86b49c98d">More...</a><br /></td></tr>
+<tr class="separator:a9844075a9ccf12e56f6a07d86b49c98d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22b9a3e01537f4f5d89e608c8b7956f6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hashwrap_8h.html#a22b9a3e01537f4f5d89e608c8b7956f6">tinysha_final</a> (unsigned char *digest, <a class="el" href="structtiny__sha.html">tiny_sha</a> *s)</td></tr>
+<tr class="memdesc:a22b9a3e01537f4f5d89e608c8b7956f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the hash algorithm in the digest buffer. <a href="#a22b9a3e01537f4f5d89e608c8b7956f6">More...</a><br /></td></tr>
+<tr class="separator:a22b9a3e01537f4f5d89e608c8b7956f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e07fd5b18355546d72dd09eae343c6a"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hashwrap_8h.html#a6e07fd5b18355546d72dd09eae343c6a">tinysha_digest_size</a> (<a class="el" href="structtiny__sha.html">tiny_sha</a> *s)</td></tr>
+<tr class="memdesc:a6e07fd5b18355546d72dd09eae343c6a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns size of digest depending on hash algorithm. <a href="#a6e07fd5b18355546d72dd09eae343c6a">More...</a><br /></td></tr>
+<tr class="separator:a6e07fd5b18355546d72dd09eae343c6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Decleration of hash wrap function. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a6e07fd5b18355546d72dd09eae343c6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e07fd5b18355546d72dd09eae343c6a">&#9670;&nbsp;</a></span>tinysha_digest_size()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t tinysha_digest_size </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structtiny__sha.html">tiny_sha</a> *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns size of digest depending on hash algorithm. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">s</td><td>The hash state. Must be non-null or behavior is undefined.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Size of digest </dd></dl>
+
+</div>
+</div>
+<a id="a22b9a3e01537f4f5d89e608c8b7956f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a22b9a3e01537f4f5d89e608c8b7956f6">&#9670;&nbsp;</a></span>tinysha_final()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha_final </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char *&#160;</td>
+ <td class="paramname"><em>digest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structtiny__sha.html">tiny_sha</a> *&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes the hash algorithm in the digest buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">digest</td><td>The computed digest. Must be non-null or behavior is undefined.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">s</td><td>The hash state. Must be non-null or behavior is undefined. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab168fa663e74cc973af7e79d384df8b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab168fa663e74cc973af7e79d384df8b0">&#9670;&nbsp;</a></span>tinysha_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha_init </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td>
+ <td class="paramname"><em>sha_type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structtiny__sha.html">tiny_sha</a> *&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Initializes the hash state. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">sha_type</td><td>Type of hash algorithm</td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">s</td><td>The hash state to initialize. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9844075a9ccf12e56f6a07d86b49c98d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9844075a9ccf12e56f6a07d86b49c98d">&#9670;&nbsp;</a></span>tinysha_update()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha_update </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structtiny__sha.html">tiny_sha</a> *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>data_length</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes data into state using a chosen hash algorithm. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">s</td><td>The hash state. Must be non-null or behavior is undefined.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">data</td><td>The data to hash into s.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">data_length</td><td>The size of data in bytes. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="hashwrap_8h.html">hashwrap.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/how__validated_8dox.html b/doc/html/how__validated_8dox.html
new file mode 100644
index 0000000..d24119d
--- /dev/null
+++ b/doc/html/how__validated_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/how_validated.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('how__validated_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/how_validated.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="how__validated_8dox.html">how_validated.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/implementation__notes_8dox.html b/doc/html/implementation__notes_8dox.html
new file mode 100644
index 0000000..01caf4f
--- /dev/null
+++ b/doc/html/implementation__notes_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/implementation_notes.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('implementation__notes_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/implementation_notes.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="implementation__notes_8dox.html">implementation_notes.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/implementing_member.png b/doc/html/implementing_member.png
new file mode 100644
index 0000000..ceb8bbb
--- /dev/null
+++ b/doc/html/implementing_member.png
Binary files differ
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 0000000..bbf8a58
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,90 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Introducing the Intel&reg; EPID SDK</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('index.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Introducing the Intel&reg; EPID SDK </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Intel&reg; EPID is a cryptographic protocol which enables the remote authentication of a trusted platform whilst preserving the user's privacy.</p>
+<p>The Intel&reg; EPID Software Development Kit provides an implementation of the Intel&reg; EPID specification that developers can use when developing their own applications using Intel&reg; EPID technology.</p>
+<h1><a class="anchor" id="mainpage_roadmap"></a>
+Getting Started</h1>
+<p>If you are learning to use the SDK, we recommend the following approach:</p>
+<ol type="1">
+<li><b>Get the Big Picture</b> The <a class="el" href="_epid_overview.html">Introduction to the Intel&reg; EPID Scheme</a> provides a non-implementation-specific overview of the interactions between the issuer, member, and verifier.</li>
+<li><b>Build the SDK</b> For instructions, refer to <a class="el" href="_building_sdk.html">Building from Source</a>. For help installing the prerequisite build tools, refer to <a class="el" href="_build_tools_installation.html">Guide to Installing Build Tools</a>.</li>
+<li><b>Run the SDK Samples with Test Data</b> After you build the SDK, you can follow along with the commands in the implementation specific <a class="el" href="_sign_verify_tutorial.html">Signing and Verification Tutorial</a>, using the provided samples and the test data from <a class="el" href="_issuer_material.html">Test Data</a>.</li>
+<li><b>Check out the Code Examples</b> Refer to <a class="el" href="_user_manual__generating_an_intel_epid_signature.html">Generating an Intel&reg; EPID Signature</a> and <a class="el" href="_user_manual__verifying_an_intel_epid_signature.html">Verifying an Intel&reg; EPID Signature</a> to see how SDK APIs are used by the code examples <code>signmsg</code> and <code>verifysig</code>.</li>
+<li><b>Check out the API Reference</b> The API reference shows you how to use all APIs included in the SDK. </li>
+</ol>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/issuer__material_8dox.html b/doc/html/issuer__material_8dox.html
new file mode 100644
index 0000000..6312fb2
--- /dev/null
+++ b/doc/html/issuer__material_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/issuer_material.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('issuer__material_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/issuer_material.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="issuer__material_8dox.html">issuer_material.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/jquery.js b/doc/html/jquery.js
new file mode 100644
index 0000000..2771c74
--- /dev/null
+++ b/doc/html/jquery.js
@@ -0,0 +1,115 @@
+/*
+ @licstart The following is the entire license notice for the
+ JavaScript code in this file.
+
+ Copyright (C) 1997-2017 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice
+ for the JavaScript code in this file
+ */
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*!
+ PowerTip - v1.2.0 - 2013-04-03
+ http://stevenbenner.github.com/jquery-powertip/
+ Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return}var d=b.ui.mouse.prototype,f=d._mouseInit,c=d._mouseDestroy,a;function e(h,i){if(h.originalEvent.touches.length>1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*!
+ * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
+ * http://www.smartmenus.org/
+ *
+ * Copyright Vasil Dinkov, Vadikom Web Ltd.
+ * http://vadikom.com
+ *
+ * Licensed MIT
+ */
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
diff --git a/doc/html/legal__information_8dox.html b/doc/html/legal__information_8dox.html
new file mode 100644
index 0000000..c6b06ad
--- /dev/null
+++ b/doc/html/legal__information_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/legal_information.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('legal__information_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/legal_information.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="legal__information_8dox.html">legal_information.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/load__external_8c.html b/doc/html/load__external_8c.html
new file mode 100644
index 0000000..7d29fbe
--- /dev/null
+++ b/doc/html/load__external_8c.html
@@ -0,0 +1,131 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/load_external.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('load__external_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">load_external.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM2_LoadExternal command implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="load__external_8h.html">epid/member/tpm2/load_external.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/epid2params.h&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="conversion_8h.html">epid/member/tpm2/ibm_tss/conversion.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+<code>#include &quot;tss2/TPM_Types.h&quot;</code><br />
+<code>#include &quot;tss2/tss.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="load__external_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">BREAK_ON_EPID_ERROR</a>(ret)</td></tr>
+<tr class="memdesc:a5638f861b82f1746ea1af0b384ef8ff1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle Intel(R) EPID Error with Break. <a href="#a5638f861b82f1746ea1af0b384ef8ff1">More...</a><br /></td></tr>
+<tr class="separator:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac2507260f635a9c7abd9113cda6918f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">Tpm2LoadExternal</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f_str)</td></tr>
+<tr class="memdesc:gac2507260f635a9c7abd9113cda6918f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invokes TPM2_LoadExternal command. <a href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">More...</a><br /></td></tr>
+<tr class="separator:gac2507260f635a9c7abd9113cda6918f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM2_LoadExternal command implementation. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a5638f861b82f1746ea1af0b384ef8ff1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5638f861b82f1746ea1af0b384ef8ff1">&#9670;&nbsp;</a></span>BREAK_ON_EPID_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define BREAK_ON_EPID_ERROR</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">ret</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != (ret)) { \</div><div class="line"> break; \</div><div class="line"> }</div><div class="ttc" id="group___error_codes_html_ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9"><div class="ttname"><a href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a></div><div class="ttdoc">no error </div><div class="ttdef"><b>Definition:</b> errors.h:41</div></div>
+</div><!-- fragment -->
+<p>Handle Intel(R) EPID Error with Break. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="load__external_8c.html">load_external.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/load__external_8h.html b/doc/html/load__external_8h.html
new file mode 100644
index 0000000..c611227
--- /dev/null
+++ b/doc/html/load__external_8h.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/load_external.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('load__external_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">load_external.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac2507260f635a9c7abd9113cda6918f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">Tpm2LoadExternal</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f_str)</td></tr>
+<tr class="memdesc:gac2507260f635a9c7abd9113cda6918f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invokes TPM2_LoadExternal command. <a href="group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9">More...</a><br /></td></tr>
+<tr class="separator:gac2507260f635a9c7abd9113cda6918f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="load__external_8h.html">load_external.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/mainpage_8dox.html b/doc/html/mainpage_8dox.html
new file mode 100644
index 0000000..3e2b7a8
--- /dev/null
+++ b/doc/html/mainpage_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/mainpage.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('mainpage_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/mainpage.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="mainpage_8dox.html">mainpage.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/mathdefs_8h.html b/doc/html/mathdefs_8h.html
new file mode 100644
index 0000000..1224692
--- /dev/null
+++ b/doc/html/mathdefs_8h.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/mathdefs.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('mathdefs_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle">
+<div class="title">mathdefs.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Common public definitions for math headers.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a1a994bd1e283835646241e53b6728cee"><td class="memItemLeft" align="right" valign="top"><a id="a1a994bd1e283835646241e53b6728cee"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mathdefs_8h.html#a1a994bd1e283835646241e53b6728cee">MATH_FAIL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="memdesc:a1a994bd1e283835646241e53b6728cee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return code representing failure of math function. <br /></td></tr>
+<tr class="separator:a1a994bd1e283835646241e53b6728cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a352e5652c4f35088eba5f769a5d7993f"><td class="memItemLeft" align="right" valign="top"><a id="a352e5652c4f35088eba5f769a5d7993f"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mathdefs_8h.html#a352e5652c4f35088eba5f769a5d7993f">MATH_SUCCESS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memdesc:a352e5652c4f35088eba5f769a5d7993f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return code representing success of math function. <br /></td></tr>
+<tr class="separator:a352e5652c4f35088eba5f769a5d7993f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Common public definitions for math headers. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="mathdefs_8h.html">mathdefs.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/mathtypes_8h.html b/doc/html/mathtypes_8h.html
new file mode 100644
index 0000000..548224c
--- /dev/null
+++ b/doc/html/mathtypes_8h.html
@@ -0,0 +1,135 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/mathtypes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('mathtypes_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle">
+<div class="title">mathtypes.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of math types in tiny Intel(R) EPID.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Large integer. <a href="struct_very_large_int.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Used for multiplication. <a href="struct_very_large_int_product.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fp_elem.html">FpElem</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of Fp. <a href="struct_fp_elem.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq_elem.html">FqElem</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of Fq. <a href="struct_fq_elem.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of Fq2. <a href="struct_fq2_elem.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point in EFq. <a href="struct_ecc_point_fq.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point in EFq2. <a href="struct_ecc_point_fq2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of Fq6. <a href="struct_fq6_elem.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of Fq12. <a href="struct_fq12_elem.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of EFq in Jacobi format. <a href="struct_ecc_point_jacobi_fq.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Element of EFq2 in Jacobi format. <a href="struct_ecc_point_jacobi_fq2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_pairing_state.html">PairingState</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A scratch buffer for stateful pairing calls. <a href="struct_pairing_state.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a94d0ffa1ccb9d2f09d1ada23a5807021"><td class="memItemLeft" align="right" valign="top"><a id="a94d0ffa1ccb9d2f09d1ada23a5807021"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mathtypes_8h.html#a94d0ffa1ccb9d2f09d1ada23a5807021">NUM_ECC_DIGITS</a>&#160;&#160;&#160;8</td></tr>
+<tr class="memdesc:a94d0ffa1ccb9d2f09d1ada23a5807021"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of 32bit words in a very large integer <br /></td></tr>
+<tr class="separator:a94d0ffa1ccb9d2f09d1ada23a5807021"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of math types in tiny Intel(R) EPID. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/member_2api_8h.html b/doc/html/member_2api_8h.html
new file mode 100644
index 0000000..aef9006
--- /dev/null
+++ b/doc/html/member_2api_8h.html
@@ -0,0 +1,160 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/api.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('member_2api_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">api.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID SDK member API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="epiddefs_8h.html">epid/common/epiddefs.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:adfb10d5dfdadb0694792c7b06718e817"><td class="memItemLeft" align="right" valign="top"><a id="adfb10d5dfdadb0694792c7b06718e817"></a>
+typedef struct <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a></td></tr>
+<tr class="memdesc:adfb10d5dfdadb0694792c7b06718e817"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal context of member. <br /></td></tr>
+<tr class="separator:adfb10d5dfdadb0694792c7b06718e817"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">EpidMemberCreate</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **ctx)</td></tr>
+<tr class="memdesc:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates and initializes a new member context. <a href="group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7">More...</a><br /></td></tr>
+<tr class="separator:gae7a7b01bc0a84c44c9d14e6c311c1ba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">EpidMemberGetSize</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, size_t *context_size)</td></tr>
+<tr class="memdesc:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the size in bytes required for a member context. <a href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24">More...</a><br /></td></tr>
+<tr class="separator:ga2b3c0cc1d8d4e50190ca94656fa36e24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">EpidMemberInit</a> (<a class="el" href="struct_member_params.html">MemberParams</a> const *params, <a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a new member context. <a href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb">More...</a><br /></td></tr>
+<tr class="separator:ga35273b8e75d51e312f0d2fd3aa094efb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3">EpidCreateJoinRequest</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">IssuerNonce</a> const *ni, <a class="el" href="struct_join_request.html">JoinRequest</a> *join_request)</td></tr>
+<tr class="memdesc:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a request to join a group. <a href="group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3">More...</a><br /></td></tr>
+<tr class="separator:gac10008d8c9ba7bc5e5be899ed03c61c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga788ebc9d1ba6153c637b762484ca1140"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">EpidProvisionCredential</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_membership_credential.html">MembershipCredential</a> const *credential, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga788ebc9d1ba6153c637b762484ca1140"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a membership credential. <a href="group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140">More...</a><br /></td></tr>
+<tr class="separator:ga788ebc9d1ba6153c637b762484ca1140"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea">EpidProvisionCompressed</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *compressed_privkey, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a compressed private key. <a href="group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea">More...</a><br /></td></tr>
+<tr class="separator:ga76cddb8e20afc43de2c30d5e4addb2ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga07094399c1e040b95ae3e58a74e7c302"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">EpidProvisionKey</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_priv_key.html">PrivKey</a> const *priv_key, <a class="el" href="struct_member_precomp.html">MemberPrecomp</a> const *precomp_str)</td></tr>
+<tr class="memdesc:ga07094399c1e040b95ae3e58a74e7c302"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provisions a member context from a private key. <a href="group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302">More...</a><br /></td></tr>
+<tr class="separator:ga07094399c1e040b95ae3e58a74e7c302"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">EpidMemberStartup</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Change member from setup state to normal operation. <a href="group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6">More...</a><br /></td></tr>
+<tr class="separator:gaa2c85b1f0ea17a11ac5d297b21aa30f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98b4d990a885339b83cd0513fedcc76d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">EpidMemberDeinit</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga98b4d990a885339b83cd0513fedcc76d"><td class="mdescLeft">&#160;</td><td class="mdescRight">De-initializes an existing member context buffer. <a href="group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d">More...</a><br /></td></tr>
+<tr class="separator:ga98b4d990a885339b83cd0513fedcc76d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3824589c683c5e0e59d483462fce65d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">EpidMemberDelete</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga3824589c683c5e0e59d483462fce65d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing member context. <a href="group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6">More...</a><br /></td></tr>
+<tr class="separator:ga3824589c683c5e0e59d483462fce65d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9998eb454838ff5d232ff22ecbab31bf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">EpidMemberSetHashAlg</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga9998eb454838ff5d232ff22ecbab31bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a member. <a href="group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf">More...</a><br /></td></tr>
+<tr class="separator:ga9998eb454838ff5d232ff22ecbab31bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaae6f21f58c22fce58076f10d68159f4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">EpidMemberSetSigRl</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, <a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:gaaae6f21f58c22fce58076f10d68159f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the signature based revocation list to be used by a member. <a href="group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4">More...</a><br /></td></tr>
+<tr class="separator:gaaae6f21f58c22fce58076f10d68159f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76e535722467af7c16809b5b521e0000"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">EpidGetSigSize</a> (<a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl)</td></tr>
+<tr class="memdesc:ga76e535722467af7c16809b5b521e0000"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the size in bytes required for an Intel(R) EPID signature. <a href="group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000">More...</a><br /></td></tr>
+<tr class="separator:ga76e535722467af7c16809b5b521e0000"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga74d1409a816cb52633564b793072da5f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">EpidSign</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *ctx, void const *msg, size_t msg_len, void const *basename, size_t basename_len, <a class="el" href="struct_epid_signature.html">EpidSignature</a> *sig, size_t sig_len)</td></tr>
+<tr class="memdesc:ga74d1409a816cb52633564b793072da5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes an Intel(R) EPID signature. <a href="group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f">More...</a><br /></td></tr>
+<tr class="separator:ga74d1409a816cb52633564b793072da5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c6f097ba89542664375bd5e0f205220"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">EpidRegisterBasename</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga8c6f097ba89542664375bd5e0f205220"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a basename with a member. <a href="group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220">More...</a><br /></td></tr>
+<tr class="separator:ga8c6f097ba89542664375bd5e0f205220"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3">EpidClearRegisteredBasenames</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx)</td></tr>
+<tr class="memdesc:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears registered basenames. <a href="group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3">More...</a><br /></td></tr>
+<tr class="separator:ga4f3a464f14581ef3e5a50719cb4709c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb0547ec085a9ed324d323416bce4a78"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78">EpidAddPreSigs</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> *ctx, size_t number_presigs)</td></tr>
+<tr class="memdesc:gacb0547ec085a9ed324d323416bce4a78"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extends the member's pool of pre-computed signatures. <a href="group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78">More...</a><br /></td></tr>
+<tr class="separator:gacb0547ec085a9ed324d323416bce4a78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad78ca056dfea2565bbacd5734d9dc075"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075">EpidGetNumPreSigs</a> (<a class="el" href="member_2api_8h.html#adfb10d5dfdadb0694792c7b06718e817">MemberCtx</a> const *ctx)</td></tr>
+<tr class="memdesc:gad78ca056dfea2565bbacd5734d9dc075"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the number of pre-computed signatures in the member's pool. <a href="group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075">More...</a><br /></td></tr>
+<tr class="separator:gad78ca056dfea2565bbacd5734d9dc075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf8cd05388f017486f14da2ee48d067ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">EpidDecompressPrivKey</a> (<a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a> const *compressed_privkey, <a class="el" href="struct_priv_key.html">PrivKey</a> *priv_key)</td></tr>
+<tr class="memdesc:gaf8cd05388f017486f14da2ee48d067ef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decompresses compressed member private key. <a href="group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef">More...</a><br /></td></tr>
+<tr class="separator:gaf8cd05388f017486f14da2ee48d067ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID SDK member API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="member_2api_8h.html">api.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/member_2tiny_2math_2pairing_8h.html b/doc/html/member_2tiny_2math_2pairing_8h.html
new file mode 100644
index 0000000..cd5bf01
--- /dev/null
+++ b/doc/html/member_2tiny_2math_2pairing_8h.html
@@ -0,0 +1,175 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/pairing.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('member_2tiny_2math_2pairing_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pairing.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of pairing math.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aba03ba485b970dd2d3f30b1f74f6ed6f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="member_2tiny_2math_2pairing_8h.html#aba03ba485b970dd2d3f30b1f74f6ed6f">PairingInit</a> (<a class="el" href="struct_pairing_state.html">PairingState</a> *state)</td></tr>
+<tr class="memdesc:aba03ba485b970dd2d3f30b1f74f6ed6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes pairing environment. <a href="#aba03ba485b970dd2d3f30b1f74f6ed6f">More...</a><br /></td></tr>
+<tr class="separator:aba03ba485b970dd2d3f30b1f74f6ed6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74dabfd47d20d4086a89e1910ca27fe0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="member_2tiny_2math_2pairing_8h.html#a74dabfd47d20d4086a89e1910ca27fe0">PairingCompute</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *d, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *P, <a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *Q, <a class="el" href="struct_pairing_state.html">PairingState</a> const *state)</td></tr>
+<tr class="memdesc:a74dabfd47d20d4086a89e1910ca27fe0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a pairing according to the Optimal Ate pairing computation. <a href="#a74dabfd47d20d4086a89e1910ca27fe0">More...</a><br /></td></tr>
+<tr class="separator:a74dabfd47d20d4086a89e1910ca27fe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of pairing math. </p>
+<p>Tiny portable implementations of standard library functions.</p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a74dabfd47d20d4086a89e1910ca27fe0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a74dabfd47d20d4086a89e1910ca27fe0">&#9670;&nbsp;</a></span>PairingCompute()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PairingCompute </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>P</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *&#160;</td>
+ <td class="paramname"><em>Q</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_pairing_state.html">PairingState</a> const *&#160;</td>
+ <td class="paramname"><em>state</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes a pairing according to the Optimal Ate pairing computation. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">d</td><td>target, an element in GT. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">P</td><td>an element in G1. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">Q</td><td>an element in G2. </td></tr>
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">state</td><td>pairing state information. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aba03ba485b970dd2d3f30b1f74f6ed6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba03ba485b970dd2d3f30b1f74f6ed6f">&#9670;&nbsp;</a></span>PairingInit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void PairingInit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_pairing_state.html">PairingState</a> *&#160;</td>
+ <td class="paramname"><em>state</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Initializes pairing environment. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">state</td><td>pairing state information. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="member_2tiny_2math_2pairing_8h.html">pairing.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/member_host.png b/doc/html/member_host.png
new file mode 100644
index 0000000..f42006d
--- /dev/null
+++ b/doc/html/member_host.png
Binary files differ
diff --git a/doc/html/member_private_key.png b/doc/html/member_private_key.png
new file mode 100644
index 0000000..0e8d3cf
--- /dev/null
+++ b/doc/html/member_private_key.png
Binary files differ
diff --git a/doc/html/modules.html b/doc/html/modules.html
new file mode 100644
index 0000000..babfe17
--- /dev/null
+++ b/doc/html/modules.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: API Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('modules.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">API Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all modules:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><a class="el" href="group___epid_module.html" target="_self">epid&nbsp;</a></td><td class="desc">Core Intel&reg; EPID functionality </td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><a class="el" href="group___epid_common.html" target="_self">common</a></td><td class="desc">Common code shared between core sub-components </td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_0_" class="arrow" onclick="toggleFolder('0_0_0_')">&#9660;</span><a class="el" href="group___epid_math.html" target="_self">math</a></td><td class="desc">Math Primitives and Group Operations </td></tr>
+<tr id="row_0_0_0_0_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___big_num_primitives.html" target="_self">bignum</a></td><td class="desc">Big number operations </td></tr>
+<tr id="row_0_0_0_1_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___ecdsa_primitives.html" target="_self">ecdsa</a></td><td class="desc">Elliptic Curve Digital Signature Algorithm Primitives </td></tr>
+<tr id="row_0_0_0_2_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___ec_group_primitives.html" target="_self">ecgroup</a></td><td class="desc">Elliptic curve group operations </td></tr>
+<tr id="row_0_0_0_3_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___finite_field_primitives.html" target="_self">finitefield</a></td><td class="desc">Finite field operations </td></tr>
+<tr id="row_0_0_0_4_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___hash_primitives.html" target="_self">hash</a></td><td class="desc">Hash primitives </td></tr>
+<tr id="row_0_0_0_5_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_0_0_5_" class="arrow" onclick="toggleFolder('0_0_0_5_')">&#9660;</span><a class="el" href="group___pairing_primitives.html" target="_self">pairing</a></td><td class="desc">Pairing operations </td></tr>
+<tr id="row_0_0_0_5_0_"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group___epid11_pairing_primitives.html" target="_self">Intel(R) EPID 1.1 specific pairing</a></td><td class="desc">Intel(R) EPID 1.1 pairing operations </td></tr>
+<tr id="row_0_0_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group___error_codes.html" target="_self">errors</a></td><td class="desc">Error reporting interface </td></tr>
+<tr id="row_0_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_2_" class="arrow" onclick="toggleFolder('0_0_2_')">&#9660;</span><a class="el" href="group___file_parser.html" target="_self">fileparser</a></td><td class="desc">Parser for issuer material </td></tr>
+<tr id="row_0_0_2_0_" class="even"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___epid11_file_parser_module.html" target="_self">Intel(R) EPID 1.1 support</a></td><td class="desc">Parser for 1.1 issuer material </td></tr>
+<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group___epid_print.html" target="_self">print_utils</a></td><td class="desc">Debug print routines </td></tr>
+<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_4_" class="arrow" onclick="toggleFolder('0_0_4_')">&#9660;</span><a class="el" href="group___epid_types.html" target="_self">types</a></td><td class="desc">SDK data types </td></tr>
+<tr id="row_0_0_4_0_"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group___epid11_types.html" target="_self">Intel(R) EPID 1.1 specific types</a></td><td class="desc">Intel(R) EPID 1.1 specific data types </td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_1_" class="arrow" onclick="toggleFolder('0_1_')">&#9660;</span><a class="el" href="group___epid_member_module.html" target="_self">member</a></td><td class="desc">Member functionality </td></tr>
+<tr id="row_0_1_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group___tpm2_module.html" target="_self">tpm2</a></td><td class="desc">Internal interface that models TPM 2.0 interfaces </td></tr>
+<tr id="row_0_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9660;</span><a class="el" href="group___epid_verifier_module.html" target="_self">verifier</a></td><td class="desc">Verifier functionality </td></tr>
+<tr id="row_0_2_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group___epid11_verifier_module.html" target="_self">Intel(R) EPID 1.1 support</a></td><td class="desc">Intel(R) EPID 1.1 Verifier functionality </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/modules.js b/doc/html/modules.js
new file mode 100644
index 0000000..885d249
--- /dev/null
+++ b/doc/html/modules.js
@@ -0,0 +1,4 @@
+var modules =
+[
+ [ "epid ", "group___epid_module.html", "group___epid_module" ]
+]; \ No newline at end of file
diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png
new file mode 100644
index 0000000..72a58a5
--- /dev/null
+++ b/doc/html/nav_f.png
Binary files differ
diff --git a/doc/html/nav_g.png b/doc/html/nav_g.png
new file mode 100644
index 0000000..2093a23
--- /dev/null
+++ b/doc/html/nav_g.png
Binary files differ
diff --git a/doc/html/nav_h.png b/doc/html/nav_h.png
new file mode 100644
index 0000000..33389b1
--- /dev/null
+++ b/doc/html/nav_h.png
Binary files differ
diff --git a/doc/html/navtree.css b/doc/html/navtree.css
new file mode 100644
index 0000000..0cc7e77
--- /dev/null
+++ b/doc/html/navtree.css
@@ -0,0 +1,146 @@
+#nav-tree .children_ul {
+ margin:0;
+ padding:4px;
+}
+
+#nav-tree ul {
+ list-style:none outside none;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree li {
+ white-space:nowrap;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .plus {
+ margin:0px;
+}
+
+#nav-tree .selected {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ vertical-align: middle;
+}
+
+#nav-tree a {
+ text-decoration:none;
+ padding:0px;
+ margin:0px;
+ outline:none;
+}
+
+#nav-tree .label {
+ margin:0px;
+ padding:0px;
+ font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+#nav-tree .label a {
+ padding:2px;
+}
+
+#nav-tree .selected a {
+ text-decoration:none;
+ color:#fff;
+}
+
+#nav-tree .children_ul {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .item {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree {
+ padding: 0px 0px;
+ background-color: #FAFAFF;
+ font-size:14px;
+ overflow:auto;
+}
+
+#doc-content {
+ overflow:auto;
+ display:block;
+ padding:0px;
+ margin:0px;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#side-nav {
+ padding:0 6px 0 0;
+ margin: 0px;
+ display:block;
+ position: absolute;
+ left: 0px;
+ width: 250px;
+}
+
+.ui-resizable .ui-resizable-handle {
+ display:block;
+}
+
+.ui-resizable-e {
+ background-image:url("splitbar.png");
+ background-size:100%;
+ background-repeat:no-repeat;
+ background-attachment: scroll;
+ cursor:ew-resize;
+ height:100%;
+ right:0;
+ top:0;
+ width:6px;
+}
+
+.ui-resizable-handle {
+ display:none;
+ font-size:0.1px;
+ position:absolute;
+ z-index:1;
+}
+
+#nav-tree-contents {
+ margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#nav-sync {
+ position:absolute;
+ top:5px;
+ right:24px;
+ z-index:0;
+}
+
+#nav-sync img {
+ opacity:0.3;
+}
+
+#nav-sync img:hover {
+ opacity:0.9;
+}
+
+@media print
+{
+ #nav-tree { display: none; }
+ div.ui-resizable-handle { display: none; position: relative; }
+}
+
diff --git a/doc/html/navtree.js b/doc/html/navtree.js
new file mode 100644
index 0000000..e310bc9
--- /dev/null
+++ b/doc/html/navtree.js
@@ -0,0 +1,540 @@
+/*
+ @licstart The following is the entire license notice for the
+ JavaScript code in this file.
+
+ Copyright (C) 1997-2017 by Dimitri van Heesch
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ @licend The above is the entire license notice
+ for the JavaScript code in this file
+ */
+var navTreeSubIndices = new Array();
+var arrowDown = '&#9660;';
+var arrowRight = '&#9654;';
+
+function getData(varName)
+{
+ var i = varName.lastIndexOf('/');
+ var n = i>=0 ? varName.substring(i+1) : varName;
+ return eval(n.replace(/\-/g,'_'));
+}
+
+function stripPath(uri)
+{
+ return uri.substring(uri.lastIndexOf('/')+1);
+}
+
+function stripPath2(uri)
+{
+ var i = uri.lastIndexOf('/');
+ var s = uri.substring(i+1);
+ var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
+ return m ? uri.substring(i-6) : s;
+}
+
+function hashValue()
+{
+ return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+ return '#'+hashValue();
+}
+
+function pathName()
+{
+ return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
+function localStorageSupported()
+{
+ try {
+ return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
+ }
+ catch(e) {
+ return false;
+ }
+}
+
+
+function storeLink(link)
+{
+ if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
+ window.localStorage.setItem('navpath',link);
+ }
+}
+
+function deleteLink()
+{
+ if (localStorageSupported()) {
+ window.localStorage.setItem('navpath','');
+ }
+}
+
+function cachedLink()
+{
+ if (localStorageSupported()) {
+ return window.localStorage.getItem('navpath');
+ } else {
+ return '';
+ }
+}
+
+function getScript(scriptName,func,show)
+{
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement('script');
+ script.id = scriptName;
+ script.type = 'text/javascript';
+ script.onload = func;
+ script.src = scriptName+'.js';
+ if ($.browser.msie && $.browser.version<=8) {
+ // script.onload does not work with older versions of IE
+ script.onreadystatechange = function() {
+ if (script.readyState=='complete' || script.readyState=='loaded') {
+ func(); if (show) showRoot();
+ }
+ }
+ }
+ head.appendChild(script);
+}
+
+function createIndent(o,domNode,node,level)
+{
+ var level=-1;
+ var n = node;
+ while (n.parentNode) { level++; n=n.parentNode; }
+ if (node.childrenData) {
+ var imgNode = document.createElement("span");
+ imgNode.className = 'arrow';
+ imgNode.style.paddingLeft=(16*level).toString()+'px';
+ imgNode.innerHTML=arrowRight;
+ node.plus_img = imgNode;
+ node.expandToggle = document.createElement("a");
+ node.expandToggle.href = "javascript:void(0)";
+ node.expandToggle.onclick = function() {
+ if (node.expanded) {
+ $(node.getChildrenUL()).slideUp("fast");
+ node.plus_img.innerHTML=arrowRight;
+ node.expanded = false;
+ } else {
+ expandNode(o, node, false, false);
+ }
+ }
+ node.expandToggle.appendChild(imgNode);
+ domNode.appendChild(node.expandToggle);
+ } else {
+ var span = document.createElement("span");
+ span.className = 'arrow';
+ span.style.width = 16*(level+1)+'px';
+ span.innerHTML = '&#160;';
+ domNode.appendChild(span);
+ }
+}
+
+var animationInProgress = false;
+
+function gotoAnchor(anchor,aname,updateLocation)
+{
+ var pos, docContent = $('#doc-content');
+ var ancParent = $(anchor.parent());
+ if (ancParent.hasClass('memItemLeft') ||
+ ancParent.hasClass('fieldname') ||
+ ancParent.hasClass('fieldtype') ||
+ ancParent.is(':header'))
+ {
+ pos = ancParent.position().top;
+ } else if (anchor.position()) {
+ pos = anchor.position().top;
+ }
+ if (pos) {
+ var dist = Math.abs(Math.min(
+ pos-docContent.offset().top,
+ docContent[0].scrollHeight-
+ docContent.height()-docContent.scrollTop()));
+ animationInProgress=true;
+ docContent.animate({
+ scrollTop: pos + docContent.scrollTop() - docContent.offset().top
+ },Math.max(50,Math.min(500,dist)),function(){
+ if (updateLocation) window.location.href=aname;
+ animationInProgress=false;
+ });
+ }
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+ var node = new Object();
+ node.children = Array();
+ node.childrenData = childrenData;
+ node.depth = po.depth + 1;
+ node.relpath = po.relpath;
+ node.isLast = lastNode;
+
+ node.li = document.createElement("li");
+ po.getChildrenUL().appendChild(node.li);
+ node.parentNode = po;
+
+ node.itemDiv = document.createElement("div");
+ node.itemDiv.className = "item";
+
+ node.labelSpan = document.createElement("span");
+ node.labelSpan.className = "label";
+
+ createIndent(o,node.itemDiv,node,0);
+ node.itemDiv.appendChild(node.labelSpan);
+ node.li.appendChild(node.itemDiv);
+
+ var a = document.createElement("a");
+ node.labelSpan.appendChild(a);
+ node.label = document.createTextNode(text);
+ node.expanded = false;
+ a.appendChild(node.label);
+ if (link) {
+ var url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ link = url;
+ } else {
+ url = node.relpath+link;
+ }
+ a.className = stripPath(link.replace('#',':'));
+ if (link.indexOf('#')!=-1) {
+ var aname = '#'+link.split('#')[1];
+ var srcPage = stripPath(pathName());
+ var targetPage = stripPath(link.split('#')[0]);
+ a.href = srcPage!=targetPage ? url : "javascript:void(0)";
+ a.onclick = function(){
+ storeLink(link);
+ if (!$(a).parent().parent().hasClass('selected'))
+ {
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ $(a).parent().parent().addClass('selected');
+ $(a).parent().parent().attr('id','selected');
+ }
+ var anchor = $(aname);
+ gotoAnchor(anchor,aname,true);
+ };
+ } else {
+ a.href = url;
+ a.onclick = function() { storeLink(link); }
+ }
+ } else {
+ if (childrenData != null)
+ {
+ a.className = "nolink";
+ a.href = "javascript:void(0)";
+ a.onclick = node.expandToggle.onclick;
+ }
+ }
+
+ node.childrenUL = null;
+ node.getChildrenUL = function() {
+ if (!node.childrenUL) {
+ node.childrenUL = document.createElement("ul");
+ node.childrenUL.className = "children_ul";
+ node.childrenUL.style.display = "none";
+ node.li.appendChild(node.childrenUL);
+ }
+ return node.childrenUL;
+ };
+
+ return node;
+}
+
+function showRoot()
+{
+ var headerHeight = $("#top").height();
+ var footerHeight = $("#nav-path").height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ (function (){ // retry until we can scroll to the selected item
+ try {
+ var navtree=$('#nav-tree');
+ navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+ } catch (err) {
+ setTimeout(arguments.callee, 0);
+ }
+ })();
+}
+
+function expandNode(o, node, imm, showRoot)
+{
+ if (node.childrenData && !node.expanded) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ expandNode(o, node, imm, showRoot);
+ }, showRoot);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ } if (imm || ($.browser.msie && $.browser.version>8)) {
+ // somehow slideDown jumps to the start of tree for IE9 :-(
+ $(node.getChildrenUL()).show();
+ } else {
+ $(node.getChildrenUL()).slideDown("fast");
+ }
+ node.plus_img.innerHTML = arrowDown;
+ node.expanded = true;
+ }
+ }
+}
+
+function glowEffect(n,duration)
+{
+ n.addClass('glow').delay(duration).queue(function(next){
+ $(this).removeClass('glow');next();
+ });
+}
+
+function highlightAnchor()
+{
+ var aname = hashUrl();
+ var anchor = $(aname);
+ if (anchor.parent().attr('class')=='memItemLeft'){
+ var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
+ glowEffect(rows.children(),300); // member without details
+ } else if (anchor.parent().attr('class')=='fieldname'){
+ glowEffect(anchor.parent().parent(),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldtype'){
+ glowEffect(anchor.parent().parent(),1000); // struct field
+ } else if (anchor.parent().is(":header")) {
+ glowEffect(anchor.parent(),1000); // section header
+ } else {
+ glowEffect(anchor.next(),1000); // normal member
+ }
+ gotoAnchor(anchor,aname,false);
+}
+
+function selectAndHighlight(hash,n)
+{
+ var a;
+ if (hash) {
+ var link=stripPath(pathName())+':'+hash.substring(1);
+ a=$('.item a[class$="'+link+'"]');
+ }
+ if (a && a.length) {
+ a.parent().parent().addClass('selected');
+ a.parent().parent().attr('id','selected');
+ highlightAnchor();
+ } else if (n) {
+ $(n.itemDiv).addClass('selected');
+ $(n.itemDiv).attr('id','selected');
+ }
+ if ($('#nav-tree-contents .item:first').hasClass('selected')) {
+ $('#nav-sync').css('top','30px');
+ } else {
+ $('#nav-sync').css('top','5px');
+ }
+ showRoot();
+}
+
+function showNode(o, node, index, hash)
+{
+ if (node && node.childrenData) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ showNode(o,node,index,hash);
+ },true);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ }
+ $(node.getChildrenUL()).css({'display':'block'});
+ node.plus_img.innerHTML = arrowDown;
+ node.expanded = true;
+ var n = node.children[o.breadcrumbs[index]];
+ if (index+1<o.breadcrumbs.length) {
+ showNode(o,n,index+1,hash);
+ } else {
+ if (typeof(n.childrenData)==='string') {
+ var varName = n.childrenData;
+ getScript(n.relpath+varName,function(){
+ n.childrenData = getData(varName);
+ node.expanded=false;
+ showNode(o,node,index,hash); // retry with child node expanded
+ },true);
+ } else {
+ var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
+ if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
+ expandNode(o, n, true, true);
+ }
+ selectAndHighlight(hash,n);
+ }
+ }
+ }
+ } else {
+ selectAndHighlight(hash);
+ }
+}
+
+function removeToInsertLater(element) {
+ var parentNode = element.parentNode;
+ var nextSibling = element.nextSibling;
+ parentNode.removeChild(element);
+ return function() {
+ if (nextSibling) {
+ parentNode.insertBefore(element, nextSibling);
+ } else {
+ parentNode.appendChild(element);
+ }
+ };
+}
+
+function getNode(o, po)
+{
+ var insertFunction = removeToInsertLater(po.li);
+ po.childrenVisited = true;
+ var l = po.childrenData.length-1;
+ for (var i in po.childrenData) {
+ var nodeData = po.childrenData[i];
+ po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+ i==l);
+ }
+ insertFunction();
+}
+
+function gotoNode(o,subIndex,root,hash,relpath)
+{
+ var nti = navTreeSubIndices[subIndex][root+hash];
+ o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
+ if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
+ navTo(o,NAVTREE[0][1],"",relpath);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ if (o.breadcrumbs) {
+ o.breadcrumbs.unshift(0); // add 0 for root node
+ showNode(o, o.node, 0, hash);
+ }
+}
+
+function navTo(o,root,hash,relpath)
+{
+ var link = cachedLink();
+ if (link) {
+ var parts = link.split('#');
+ root = parts[0];
+ if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
+ else hash='';
+ }
+ if (hash.match(/^#l\d+$/)) {
+ var anchor=$('a[name='+hash.substring(1)+']');
+ glowEffect(anchor.parent(),1000); // line number
+ hash=''; // strip line number anchors
+ }
+ var url=root+hash;
+ var i=-1;
+ while (NAVTREEINDEX[i+1]<=url) i++;
+ if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath)
+ } else {
+ getScript(relpath+'navtreeindex'+i,function(){
+ navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath);
+ }
+ },true);
+ }
+}
+
+function showSyncOff(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
+}
+
+function showSyncOn(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
+}
+
+function toggleSyncButton(relpath)
+{
+ var navSync = $('#nav-sync');
+ if (navSync.hasClass('sync')) {
+ navSync.removeClass('sync');
+ showSyncOff(navSync,relpath);
+ storeLink(stripPath2(pathName())+hashUrl());
+ } else {
+ navSync.addClass('sync');
+ showSyncOn(navSync,relpath);
+ deleteLink();
+ }
+}
+
+function initNavTree(toroot,relpath)
+{
+ var o = new Object();
+ o.toroot = toroot;
+ o.node = new Object();
+ o.node.li = document.getElementById("nav-tree-contents");
+ o.node.childrenData = NAVTREE;
+ o.node.children = new Array();
+ o.node.childrenUL = document.createElement("ul");
+ o.node.getChildrenUL = function() { return o.node.childrenUL; };
+ o.node.li.appendChild(o.node.childrenUL);
+ o.node.depth = 0;
+ o.node.relpath = relpath;
+ o.node.expanded = false;
+ o.node.isLast = true;
+ o.node.plus_img = document.createElement("span");
+ o.node.plus_img.className = 'arrow';
+ o.node.plus_img.innerHTML = arrowRight;
+
+ if (localStorageSupported()) {
+ var navSync = $('#nav-sync');
+ if (cachedLink()) {
+ showSyncOff(navSync,relpath);
+ navSync.removeClass('sync');
+ } else {
+ showSyncOn(navSync,relpath);
+ }
+ navSync.click(function(){ toggleSyncButton(relpath); });
+ }
+
+ $(window).load(function(){
+ navTo(o,toroot,hashUrl(),relpath);
+ showRoot();
+ });
+
+ $(window).bind('hashchange', function(){
+ if (window.location.hash && window.location.hash.length>1){
+ var a;
+ if ($(location).attr('hash')){
+ var clslink=stripPath(pathName())+':'+hashValue();
+ a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
+ }
+ if (a==null || !$(a).parent().parent().hasClass('selected')){
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ var link=stripPath2(pathName());
+ navTo(o,link,hashUrl(),relpath);
+ } else if (!animationInProgress) {
+ $('#doc-content').scrollTop(0);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ navTo(o,toroot,hashUrl(),relpath);
+ }
+ })
+}
+/* @license-end */
diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js
new file mode 100644
index 0000000..3d8f43e
--- /dev/null
+++ b/doc/html/navtreedata.js
@@ -0,0 +1,204 @@
+/*
+@ @licstart The following is the entire license notice for the
+JavaScript code in this file.
+
+Copyright (C) 1997-2017 by Dimitri van Heesch
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+@licend The above is the entire license notice
+for the JavaScript code in this file
+*/
+var NAVTREE =
+[
+ [ "Intel® Enhanced Privacy ID SDK", "index.html", [
+ [ " ", "user", null ],
+ [ "Introducing the Intel® EPID SDK", "index.html", [
+ [ "Getting Started", "index.html#mainpage_roadmap", null ]
+ ] ],
+ [ "Legal Information", "_legal_information.html", null ],
+ [ "What's New", "_change_log.html", null ],
+ [ "Introduction to the Intel® EPID Scheme", "_epid_overview.html", [
+ [ "Roles", "_epid_overview.html#EpidOverview_Roles", [
+ [ "Issuers", "_epid_overview.html#EpidOverview_Issuers", null ],
+ [ "Members", "_epid_overview.html#EpidOverview_Members", null ],
+ [ "Verifiers", "_epid_overview.html#EpidOverview_Verifiers", null ]
+ ] ],
+ [ "Member and Verifier Interaction", "_epid_overview.html#EpidOverview_Entity_interaction", null ],
+ [ "Groups", "_epid_overview.html#EpidOverview_Groups", null ],
+ [ "Keys", "_epid_overview.html#EpidOverview_Keys", [
+ [ "Group Public Key", "_epid_overview.html#EpidOverview_Group_public_key", null ],
+ [ "Issuing Private Key", "_epid_overview.html#EpidOverview_Issuing_private_key", null ],
+ [ "Member Private Key", "_epid_overview.html#EpidOverview_Member_private_key", null ]
+ ] ]
+ ] ],
+ [ "What's Included in the SDK", "_sdk_overview.html", [
+ [ "SDK Components", "_sdk_overview.html#SdkOverview_Components", [
+ [ "SDK Core", "_sdk_overview.html#SdkOverview_Core", null ],
+ [ "Samples", "_sdk_overview.html#SdkOverview_Samples", null ],
+ [ "Tools", "_sdk_overview.html#SdkOverview_Tools", null ],
+ [ "Other Components", "_sdk_overview.html#SdkOverview_BuildingAndValidation", null ]
+ ] ],
+ [ "Intel® EPID 1.1 Compatibility", "_sdk_overview.html#SdkOverview_Compatibility", null ],
+ [ "Member Implementations", "_sdk_overview.html#SdkOverview_TPM", null ],
+ [ "Folder Layout", "_sdk_overview.html#SdkOverview_Files", [
+ [ "Source Layout", "_sdk_overview.html#SdkOverview_Files_SourceLayout", null ],
+ [ "Install Layout", "_sdk_overview.html#SdkOverview_Files_InstallLayout", null ]
+ ] ]
+ ] ],
+ [ "Building from Source", "_building_sdk.html", [
+ [ "Prerequisites", "_building_sdk.html#BuildingSdk_Prerequisites", null ],
+ [ "Building SDK with SCons", "_building_sdk.html#BuildingSdk_Building_SCons", null ],
+ [ "Alternate Makefile Based Build Approach", "_building_sdk.html#BuildingSdk_Building_Makefile", null ],
+ [ "Improving Performance with Commercial IPP", "_building_sdk.html#BuildingSdk_CommercialIpp", null ],
+ [ "Optimizing for Code Size", "_building_sdk.html#BuildingSdk_Tiny", [
+ [ "Limitations", "_building_sdk.html#implementation_TinyLimitations", null ]
+ ] ],
+ [ "Example Programs", "_building_sdk.html#BuildingSdk_Examples", null ],
+ [ "Building with Other Build Systems", "_building_sdk.html#BuildingSdk_PortingBuildSystem", null ]
+ ] ],
+ [ "Signing and Verification Tutorial", "_sign_verify_tutorial.html", [
+ [ "Creating an Intel® EPID Signature of a Given Message", "_sign_verify_tutorial.html#tutorial_signmmsgOverview", [
+ [ "What Do You Need to Create a Signature?", "_sign_verify_tutorial.html#tutorial_signmsgList", null ],
+ [ "Signing Example", "_sign_verify_tutorial.html#tutorial_signmsgExample", null ]
+ ] ],
+ [ "Verifying an Intel® EPID Signature", "_sign_verify_tutorial.html#tutorial_verifysigOverview", [
+ [ "What Do You Need to Verify a Signature?", "_sign_verify_tutorial.html#tutorial_verifyList", null ],
+ [ "Verification Example", "_sign_verify_tutorial.html#tutorial_verifyExample", null ]
+ ] ],
+ [ "Parameter Matching Requirements", "_sign_verify_tutorial.html#SignVerifyTutorial_requirements", [
+ [ "Message", "_sign_verify_tutorial.html#SignVerifyTutorial_message", null ],
+ [ "Hash Algorithm", "_sign_verify_tutorial.html#SignVerifyTutorial_hashalg", null ],
+ [ "Signature Revocation List", "_sign_verify_tutorial.html#SignVerifyTutorial_SigRL", null ],
+ [ "Basenames", "_sign_verify_tutorial.html#SignVerifyTutorial_basenames", null ]
+ ] ],
+ [ "Revocation", "_sign_verify_tutorial.html#SignVerifyTutorial_Revocation_Group", [
+ [ "Detecting Revoked Group from Group Revocation List", "_sign_verify_tutorial.html#SignVerifyTutorial_GroupRevocation", null ],
+ [ "Detecting Revoked Member from Private Key Based Revocation List", "_sign_verify_tutorial.html#SignVerifyTutorial_KeyRevocation", null ],
+ [ "Detecting Revoked Member from Signature Based Revocation List", "_sign_verify_tutorial.html#SignVerifyTutorial_SigRevocation", null ]
+ ] ]
+ ] ],
+ [ "Preparing a Device", "_provisioning.html", [
+ [ "Bulk Provisioning", "_provisioning.html#Provisioning_BulkProvisioning", null ],
+ [ "Dynamic Provisioning", "_provisioning.html#Provisioning_JoinProvisioning", null ],
+ [ "Issuer Material", "_provisioning.html#SampleIssuerMaterial", [
+ [ "Issuer Material for Verifiers", "_provisioning.html#Provisioning_ValidatingVerifiers", null ],
+ [ "Issuer Material for Members", "_provisioning.html#Provisioning_ValidatingMembers", null ]
+ ] ]
+ ] ],
+ [ "Test Data", "_issuer_material.html", [
+ [ "Sample Groups", "_issuer_material.html#IssuerMaterial_Groups", null ],
+ [ "Group Revocation Lists", "_issuer_material.html#IssuerMaterial_GroupRls", null ],
+ [ "Compressed Sample Groups", "_issuer_material.html#CompressedSamples", null ],
+ [ "Compressed Group Revocation Lists", "_issuer_material.html#IssuerMaterial_CmpGroupRls", null ]
+ ] ],
+ [ "Managing Groups with iKGF", "_usingi_k_g_f.html", [
+ [ "Contacting iKGF", "_usingi_k_g_f.html#ContactingiKGF", null ],
+ [ "Tools for Creating Revocation Requests", "_usingi_k_g_f.html#RevocationTools", [
+ [ "Requesting Group Revocation", "_usingi_k_g_f.html#RevocationTools_revokegrp", null ],
+ [ "Requesting Private Key Revocation", "_usingi_k_g_f.html#RevocationTools_revokekey", null ],
+ [ "Requesting Signature Revocation", "_usingi_k_g_f.html#RevocationTools_revokesig", null ]
+ ] ],
+ [ "Tools for Extracting Keys from iKGF Files", "_usingi_k_g_f.html#ExtractionTools", [
+ [ "Extracting Group Public Keys", "_usingi_k_g_f.html#ExtractionTools_extractgrps", null ],
+ [ "Extracting Member Private Keys", "_usingi_k_g_f.html#ExtractionTools_extractkeys", null ]
+ ] ]
+ ] ],
+ [ "In-Depth Explanation of Revocation", "_revocation.html", [
+ [ "Revocation Hierarchy", "_revocation.html#revocation_hierarchy", null ],
+ [ "Revocation List Versions", "_revocation.html#revocation_versions", null ],
+ [ "Group Based Revocation", "_revocation.html#group_revocation", [
+ [ "Reasons the Issuer Might Revoke a Group", "_revocation.html#group_revocation_reasons", null ]
+ ] ],
+ [ "Private Key Based Revocation", "_revocation.html#private_key_revocation", [
+ [ "Reasons the Issuer Might Revoke a Member Private Key", "_revocation.html#private_key_revocation_reasons", null ]
+ ] ],
+ [ "Signature Based Revocation", "_revocation.html#signature_revocation", [
+ [ "Signing with Non-Revoked Proofs", "_revocation.html#revoked_proofs", null ],
+ [ "Reasons the Issuer Might Revoke an Intel® EPID Signature", "_revocation.html#signature_revocation_reasons", null ]
+ ] ],
+ [ "Verifier Blacklist Revocation", "_revocation.html#verifier_blacklist", [
+ [ "Reasons the Verifier Might Revoke an Intel® EPID Signature", "_revocation.html#verifier_blacklist_reasons", null ]
+ ] ]
+ ] ],
+ [ "In-Depth Explanation of Basenames", "_basenames.html", [
+ [ "Random Base Signatures", "_basenames.html#random_base", null ],
+ [ "Name Based Signatures", "_basenames.html#name_based", null ]
+ ] ],
+ [ "Implementation Notes", "_implementation_notes.html", [
+ [ "Member Implementations", "_implementation_notes.html#implementationNotes_Members", null ],
+ [ "Random Number Generation", "_implementation_notes.html#ImplementationNotes_Prng", null ],
+ [ "Protecting Secrets", "_implementation_notes.html#ImplementationNotes_ProtectingSecrets", null ],
+ [ "Replacing Math Primitives", "_implementation_notes.html#ImplementationNotes_MathPrimitives", null ],
+ [ "Octstring/Buffer Types", "_implementation_notes.html#ImplementationNotes_SerializedTypes", null ],
+ [ "Flexible Arrays", "_implementation_notes.html#ImplementationNotes_FlexibleArrays", null ]
+ ] ],
+ [ "Considerations for TPM", "_tpm_considerations.html", [
+ [ "Compatibility", "_tpm_considerations.html#TPM_compatibility", null ],
+ [ "Considerations for TPM Manufacturers", "_tpm_considerations.html#TpmConsiderations_Manufacturers", [
+ [ "Provisioning TPM with Intel® EPID Key Material", "_tpm_considerations.html#TPM_provisioning", null ],
+ [ "Mapping TPM Commands to Intel® EPID", "_tpm_considerations.html#TpmConsiderations_Mapping", null ]
+ ] ],
+ [ "Considerations for TPM Applications", "_tpm_considerations.html#TpmConsiderations_Applications", null ],
+ [ "SDK Member Architecture", "_tpm_considerations.html#TpmConsiderations_Architecture", null ],
+ [ "Building the SDK to Take Advantage of TPM", "_tpm_considerations.html#TpmConsiderations_Building", [
+ [ "Prerequisites to Build the SDK in TPM Mode", "_tpm_considerations.html#TpmConsiderations_Prereqs", null ],
+ [ "Building the SDK in TPM Mode", "_tpm_considerations.html#TpmConsiderations_BuildingTpmMode", null ],
+ [ "Intel® EPID Signing and Verification with a TPM", "_tpm_considerations.html#TpmConsiderations_Signing", null ]
+ ] ]
+ ] ],
+ [ "Glossary", "_glossary.html", [
+ [ "CA public key", "_glossary.html#Issuing_CA", null ],
+ [ "DAA", "_glossary.html#Glossary_Daa", null ],
+ [ "Elliptic curve", "_glossary.html#Glossary_EllipticCurve", null ],
+ [ "Elliptic curve point", "_glossary.html#Glossary_EllipticCurvePoint", null ],
+ [ "Group", "_glossary.html#Glossary_Group", null ],
+ [ "Group certificate", "_glossary.html#Glossary_Group_certificate", null ],
+ [ "Group public key", "_glossary.html#Glossary_GroupPublicKey", null ],
+ [ "Intel® EPID", "_glossary.html#Glossary_Epid", null ],
+ [ "Intel® EPID signature", "_glossary.html#Glossary_EpidSignature", null ],
+ [ "Issuer", "_glossary.html#Glossary_Issuer", null ],
+ [ "Issuing private key", "_glossary.html#Glossary_IssuingPrivateKey", null ],
+ [ "Member", "_glossary.html#Glossary_Member", null ],
+ [ "Name-based signature", "_glossary.html#Glossary_NameBasedSignature", null ],
+ [ "Member private key", "_glossary.html#Glossary_MemberPrivateKey", null ],
+ [ "Non-revoked proof", "_glossary.html#Glossary_NonRevokedProof", null ],
+ [ "Pairing", "_glossary.html#Glossary_Pairing", null ],
+ [ "Revocation, revocation lists", "_glossary.html#Glossary_Revocation", null ],
+ [ "Verifier", "_glossary.html#Glossary_Verifier", null ]
+ ] ],
+ [ "Guide to Installing Build Tools", "_build_tools_installation.html", [
+ [ "Installing Python", "_build_tools_installation.html#build_tools_windows_python", null ],
+ [ "Installing SCons", "_build_tools_installation.html#build_tools_windows_scons", null ],
+ [ "Installing Parts", "_build_tools_installation.html#build_tools_windows_parts", null ]
+ ] ],
+ [ "Tested Libraries and Compilers", "_how_validated.html", [
+ [ "Tested Libraries and Compilers", "_how_validated.html#validated_supported_compilers", null ]
+ ] ],
+ [ "Walkthroughs of Examples Showing API Usage", "_examples.html", "_examples" ],
+ [ "Deprecated List", "deprecated.html", null ],
+ [ "API Reference", "modules.html", "modules" ]
+ ] ]
+];
+
+var NAVTREEINDEX =
+[
+"_basenames.html",
+"group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2",
+"struct_fp_elem_str.html"
+];
+
+var SYNCONMSG = 'click to disable panel synchronisation';
+var SYNCOFFMSG = 'click to enable panel synchronisation'; \ No newline at end of file
diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js
new file mode 100644
index 0000000..acafce7
--- /dev/null
+++ b/doc/html/navtreeindex0.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX0 =
+{
+"_basenames.html":[12],
+"_basenames.html#name_based":[12,1],
+"_basenames.html#random_base":[12,0],
+"_build_tools_installation.html":[16],
+"_build_tools_installation.html#build_tools_windows_parts":[16,2],
+"_build_tools_installation.html#build_tools_windows_python":[16,0],
+"_build_tools_installation.html#build_tools_windows_scons":[16,1],
+"_building_sdk.html":[6],
+"_building_sdk.html#BuildingSdk_Building_Makefile":[6,2],
+"_building_sdk.html#BuildingSdk_Building_SCons":[6,1],
+"_building_sdk.html#BuildingSdk_CommercialIpp":[6,3],
+"_building_sdk.html#BuildingSdk_Examples":[6,5],
+"_building_sdk.html#BuildingSdk_PortingBuildSystem":[6,6],
+"_building_sdk.html#BuildingSdk_Prerequisites":[6,0],
+"_building_sdk.html#BuildingSdk_Tiny":[6,4],
+"_building_sdk.html#implementation_TinyLimitations":[6,4,0],
+"_change_log.html":[3],
+"_epid_overview.html":[4],
+"_epid_overview.html#EpidOverview_Entity_interaction":[4,1],
+"_epid_overview.html#EpidOverview_Group_public_key":[4,3,0],
+"_epid_overview.html#EpidOverview_Groups":[4,2],
+"_epid_overview.html#EpidOverview_Issuers":[4,0,0],
+"_epid_overview.html#EpidOverview_Issuing_private_key":[4,3,1],
+"_epid_overview.html#EpidOverview_Keys":[4,3],
+"_epid_overview.html#EpidOverview_Member_private_key":[4,3,2],
+"_epid_overview.html#EpidOverview_Members":[4,0,1],
+"_epid_overview.html#EpidOverview_Roles":[4,0],
+"_epid_overview.html#EpidOverview_Verifiers":[4,0,2],
+"_examples.html":[18],
+"_glossary.html":[15],
+"_glossary.html#Glossary_Daa":[15,1],
+"_glossary.html#Glossary_EllipticCurve":[15,2],
+"_glossary.html#Glossary_EllipticCurvePoint":[15,3],
+"_glossary.html#Glossary_Epid":[15,7],
+"_glossary.html#Glossary_EpidSignature":[15,8],
+"_glossary.html#Glossary_Group":[15,4],
+"_glossary.html#Glossary_GroupPublicKey":[15,6],
+"_glossary.html#Glossary_Group_certificate":[15,5],
+"_glossary.html#Glossary_Issuer":[15,9],
+"_glossary.html#Glossary_IssuingPrivateKey":[15,10],
+"_glossary.html#Glossary_Member":[15,11],
+"_glossary.html#Glossary_MemberPrivateKey":[15,13],
+"_glossary.html#Glossary_NameBasedSignature":[15,12],
+"_glossary.html#Glossary_NonRevokedProof":[15,14],
+"_glossary.html#Glossary_Pairing":[15,15],
+"_glossary.html#Glossary_Revocation":[15,16],
+"_glossary.html#Glossary_Verifier":[15,17],
+"_glossary.html#Issuing_CA":[15,0],
+"_how_validated.html":[17],
+"_how_validated.html#validated_supported_compilers":[17,0],
+"_implementation_notes.html":[13],
+"_implementation_notes.html#ImplementationNotes_FlexibleArrays":[13,5],
+"_implementation_notes.html#ImplementationNotes_MathPrimitives":[13,3],
+"_implementation_notes.html#ImplementationNotes_Prng":[13,1],
+"_implementation_notes.html#ImplementationNotes_ProtectingSecrets":[13,2],
+"_implementation_notes.html#ImplementationNotes_SerializedTypes":[13,4],
+"_implementation_notes.html#implementationNotes_Members":[13,0],
+"_issuer_material.html":[9],
+"_issuer_material.html#CompressedSamples":[9,2],
+"_issuer_material.html#IssuerMaterial_CmpGroupRls":[9,3],
+"_issuer_material.html#IssuerMaterial_GroupRls":[9,1],
+"_issuer_material.html#IssuerMaterial_Groups":[9,0],
+"_legal_information.html":[2],
+"_provisioning.html":[8],
+"_provisioning.html#Provisioning_BulkProvisioning":[8,0],
+"_provisioning.html#Provisioning_JoinProvisioning":[8,1],
+"_provisioning.html#Provisioning_ValidatingMembers":[8,2,1],
+"_provisioning.html#Provisioning_ValidatingVerifiers":[8,2,0],
+"_provisioning.html#SampleIssuerMaterial":[8,2],
+"_revocation.html":[11],
+"_revocation.html#group_revocation":[11,2],
+"_revocation.html#group_revocation_reasons":[11,2,0],
+"_revocation.html#private_key_revocation":[11,3],
+"_revocation.html#private_key_revocation_reasons":[11,3,0],
+"_revocation.html#revocation_hierarchy":[11,0],
+"_revocation.html#revocation_versions":[11,1],
+"_revocation.html#revoked_proofs":[11,4,0],
+"_revocation.html#signature_revocation":[11,4],
+"_revocation.html#signature_revocation_reasons":[11,4,1],
+"_revocation.html#verifier_blacklist":[11,5],
+"_revocation.html#verifier_blacklist_reasons":[11,5,0],
+"_sdk_overview.html":[5],
+"_sdk_overview.html#SdkOverview_BuildingAndValidation":[5,0,3],
+"_sdk_overview.html#SdkOverview_Compatibility":[5,1],
+"_sdk_overview.html#SdkOverview_Components":[5,0],
+"_sdk_overview.html#SdkOverview_Core":[5,0,0],
+"_sdk_overview.html#SdkOverview_Files":[5,3],
+"_sdk_overview.html#SdkOverview_Files_InstallLayout":[5,3,1],
+"_sdk_overview.html#SdkOverview_Files_SourceLayout":[5,3,0],
+"_sdk_overview.html#SdkOverview_Samples":[5,0,1],
+"_sdk_overview.html#SdkOverview_TPM":[5,2],
+"_sdk_overview.html#SdkOverview_Tools":[5,0,2],
+"_sign_verify_tutorial.html":[7],
+"_sign_verify_tutorial.html#SignVerifyTutorial_GroupRevocation":[7,3,0],
+"_sign_verify_tutorial.html#SignVerifyTutorial_KeyRevocation":[7,3,1],
+"_sign_verify_tutorial.html#SignVerifyTutorial_Revocation_Group":[7,3],
+"_sign_verify_tutorial.html#SignVerifyTutorial_SigRL":[7,2,2],
+"_sign_verify_tutorial.html#SignVerifyTutorial_SigRevocation":[7,3,2],
+"_sign_verify_tutorial.html#SignVerifyTutorial_basenames":[7,2,3],
+"_sign_verify_tutorial.html#SignVerifyTutorial_hashalg":[7,2,1],
+"_sign_verify_tutorial.html#SignVerifyTutorial_message":[7,2,0],
+"_sign_verify_tutorial.html#SignVerifyTutorial_requirements":[7,2],
+"_sign_verify_tutorial.html#tutorial_signmmsgOverview":[7,0],
+"_sign_verify_tutorial.html#tutorial_signmsgExample":[7,0,1],
+"_sign_verify_tutorial.html#tutorial_signmsgList":[7,0,0],
+"_sign_verify_tutorial.html#tutorial_verifyExample":[7,1,1],
+"_sign_verify_tutorial.html#tutorial_verifyList":[7,1,0],
+"_sign_verify_tutorial.html#tutorial_verifysigOverview":[7,1],
+"_tpm_considerations.html":[14],
+"_tpm_considerations.html#TPM_compatibility":[14,0],
+"_tpm_considerations.html#TPM_provisioning":[14,1,0],
+"_tpm_considerations.html#TpmConsiderations_Applications":[14,2],
+"_tpm_considerations.html#TpmConsiderations_Architecture":[14,3],
+"_tpm_considerations.html#TpmConsiderations_Building":[14,4],
+"_tpm_considerations.html#TpmConsiderations_BuildingTpmMode":[14,4,1],
+"_tpm_considerations.html#TpmConsiderations_Manufacturers":[14,1],
+"_tpm_considerations.html#TpmConsiderations_Mapping":[14,1,1],
+"_tpm_considerations.html#TpmConsiderations_Prereqs":[14,4,0],
+"_tpm_considerations.html#TpmConsiderations_Signing":[14,4,2],
+"_user_manual__generating_an_intel_epid_signature.html":[18,0],
+"_user_manual__generating_an_intel_epid_signature.html#signmsgWalkthru_":[18,0,1],
+"_user_manual__generating_an_intel_epid_signature.html#signmsgWalktrhu_overview":[18,0,0],
+"_user_manual__verifying_an_intel_epid_signature.html":[18,1],
+"_user_manual__verifying_an_intel_epid_signature.html#verifysigWalkthrough_main":[18,1,1],
+"_user_manual__verifying_an_intel_epid_signature.html#verifysigWalktrhu_overview":[18,1,0],
+"_usingi_k_g_f.html":[10],
+"_usingi_k_g_f.html#ContactingiKGF":[10,0],
+"_usingi_k_g_f.html#ExtractionTools":[10,2],
+"_usingi_k_g_f.html#ExtractionTools_extractgrps":[10,2,0],
+"_usingi_k_g_f.html#ExtractionTools_extractkeys":[10,2,1],
+"_usingi_k_g_f.html#RevocationTools":[10,1],
+"_usingi_k_g_f.html#RevocationTools_revokegrp":[10,1,0],
+"_usingi_k_g_f.html#RevocationTools_revokekey":[10,1,1],
+"_usingi_k_g_f.html#RevocationTools_revokesig":[10,1,2],
+"deprecated.html":[19],
+"group___big_num_primitives.html":[20,0,0,0,0],
+"group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317":[20,0,0,0,0,6],
+"group___big_num_primitives.html#ga166134085464b0df2c8efcfccf8ec573":[20,0,0,0,0,2],
+"group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718":[20,0,0,0,0,0],
+"group___big_num_primitives.html#ga2d17600068b1d94000635c6644258a03":[20,0,0,0,0,9],
+"group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929":[20,0,0,0,0,5],
+"group___big_num_primitives.html#ga904c16cc020e7196f22ac9abdc31b41f":[20,0,0,0,0,12],
+"group___big_num_primitives.html#gabe8e39d5788423f41770a71a4c911fbe":[20,0,0,0,0,11],
+"group___big_num_primitives.html#gacbec9669ab0fe768e2be74dcaca397ea":[20,0,0,0,0,8],
+"group___big_num_primitives.html#gacde6564a814617a96985b379be0dfabb":[20,0,0,0,0,4],
+"group___big_num_primitives.html#gad5f6f262bfd780fed3678bcee16f0aed":[20,0,0,0,0,10],
+"group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8":[20,0,0,0,0,1],
+"group___big_num_primitives.html#gaf0366e47226563b17fcbc8e3ed766084":[20,0,0,0,0,3],
+"group___big_num_primitives.html#gafd64b66fc85dab0005f4a1bb67bdf7b4":[20,0,0,0,0,7],
+"group___ec_group_primitives.html":[20,0,0,0,2],
+"group___ec_group_primitives.html#ga01bf8d6fa60a2e445490966b3a06c270":[20,0,0,0,2,4],
+"group___ec_group_primitives.html#ga0b6d7a3398251e9352fb29ef4abef466":[20,0,0,0,2,8],
+"group___ec_group_primitives.html#ga25c9013cc76907d73765eb7a96aa8c96":[20,0,0,0,2,12],
+"group___ec_group_primitives.html#ga3f96c43d14d24de0f7a5e214aef64196":[20,0,0,0,2,5],
+"group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4":[20,0,0,0,2,16],
+"group___ec_group_primitives.html#ga48ec5ae951c9f49d8d7d983234eea921":[20,0,0,0,2,7],
+"group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb":[20,0,0,0,2,19],
+"group___ec_group_primitives.html#ga76d24378455eb96a3257fe8045c0993a":[20,0,0,0,2,14],
+"group___ec_group_primitives.html#ga7a8bdb9782d065bc32fd102e0ae73ccb":[20,0,0,0,2,21],
+"group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa":[20,0,0,0,2,1],
+"group___ec_group_primitives.html#ga8a6114a48214a327d4ec04fd25e5940e":[20,0,0,0,2,11],
+"group___ec_group_primitives.html#ga8cb086d792bffb79b3ca07e6ca4ce0e7":[20,0,0,0,2,3],
+"group___ec_group_primitives.html#ga9cf15b34bc4ff12e58b169dd989d8210":[20,0,0,0,2,10],
+"group___ec_group_primitives.html#gaad96a1498b85d28f71514b8f7b154d82":[20,0,0,0,2,17],
+"group___ec_group_primitives.html#gab7af276256c27610eda85ff432b846ea":[20,0,0,0,2,2],
+"group___ec_group_primitives.html#gac3067cc899e65e647390bb3bd1cabe4c":[20,0,0,0,2,6],
+"group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159":[20,0,0,0,2,0],
+"group___ec_group_primitives.html#gad3b3c63c48fa24e8dea07837b05bc061":[20,0,0,0,2,9],
+"group___ec_group_primitives.html#gad495a9f91b79984f7533c8ea4f92b3cb":[20,0,0,0,2,20],
+"group___ec_group_primitives.html#gae96c38e004ccd2211290ad6e66415ec4":[20,0,0,0,2,13],
+"group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57":[20,0,0,0,2,15],
+"group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62":[20,0,0,0,2,18],
+"group___ecdsa_primitives.html":[20,0,0,0,1],
+"group___ecdsa_primitives.html#ga07e4ebd3423e1f6f9ae35f0608dde7c0":[20,0,0,0,1,1],
+"group___ecdsa_primitives.html#gaef0e8a31e830fe9285b43a0969e6611a":[20,0,0,0,1,0],
+"group___epid11_file_parser_module.html":[20,0,0,2,0],
+"group___epid11_file_parser_module.html#ga1f92d1cb6bd7d9815711fde515b40a4c":[20,0,0,2,0,0],
+"group___epid11_file_parser_module.html#gac3f6daaa5333627d4efe5438c1fe8868":[20,0,0,2,0,3],
+"group___epid11_file_parser_module.html#gae28a844eb68828480b2a76fcb7d252a3":[20,0,0,2,0,1],
+"group___epid11_file_parser_module.html#gae682077d315c39ed298ef198fd738546":[20,0,0,2,0,2],
+"group___epid11_pairing_primitives.html":[20,0,0,0,5,0],
+"group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e":[20,0,0,0,5,0,3],
+"group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b":[20,0,0,0,5,0,0],
+"group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758":[20,0,0,0,5,0,1],
+"group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059":[20,0,0,0,5,0,2],
+"group___epid11_types.html":[20,0,0,4,0],
+"group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1":[20,0,0,4,0,17],
+"group___epid11_types.html#gadff9c05d5b7751024152b40dda545545":[20,0,0,4,0,15],
+"group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23":[20,0,0,4,0,16],
+"group___epid11_verifier_module.html":[20,0,2,0],
+"group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929":[20,0,2,0,3],
+"group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0":[20,0,2,0,7],
+"group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c":[20,0,2,0,11],
+"group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813":[20,0,2,0,4],
+"group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1":[20,0,2,0,6],
+"group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070":[20,0,2,0,13],
+"group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65":[20,0,2,0,8],
+"group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7":[20,0,2,0,2],
+"group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702":[20,0,2,0,1],
+"group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8":[20,0,2,0,5],
+"group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216":[20,0,2,0,12],
+"group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8":[20,0,2,0,10],
+"group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14":[20,0,2,0,9],
+"group___epid_common.html":[20,0,0],
+"group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c":[20,0,0,5],
+"group___epid_math.html":[20,0,0,0],
+"group___epid_member_module.html":[20,0,1],
+"group___epid_member_module.html#ga07094399c1e040b95ae3e58a74e7c302":[20,0,1,18],
+"group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24":[20,0,1,11],
+"group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb":[20,0,1,12],
+"group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6":[20,0,1,10],
+"group___epid_member_module.html#ga4f3a464f14581ef3e5a50719cb4709c3":[20,0,1,3],
+"group___epid_member_module.html#ga74d1409a816cb52633564b793072da5f":[20,0,1,20],
+"group___epid_member_module.html#ga76cddb8e20afc43de2c30d5e4addb2ea":[20,0,1,16],
+"group___epid_member_module.html#ga76e535722467af7c16809b5b521e0000":[20,0,1,7],
+"group___epid_member_module.html#ga788ebc9d1ba6153c637b762484ca1140":[20,0,1,17],
+"group___epid_member_module.html#ga8c6f097ba89542664375bd5e0f205220":[20,0,1,19],
+"group___epid_member_module.html#ga98b4d990a885339b83cd0513fedcc76d":[20,0,1,9],
+"group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf":[20,0,1,13],
+"group___epid_member_module.html#gaa2c85b1f0ea17a11ac5d297b21aa30f6":[20,0,1,15],
+"group___epid_member_module.html#gaaae6f21f58c22fce58076f10d68159f4":[20,0,1,14],
+"group___epid_member_module.html#gac10008d8c9ba7bc5e5be899ed03c61c3":[20,0,1,4],
+"group___epid_member_module.html#gacb0547ec085a9ed324d323416bce4a78":[20,0,1,2],
+"group___epid_member_module.html#gad78ca056dfea2565bbacd5734d9dc075":[20,0,1,6],
+"group___epid_member_module.html#gae7a7b01bc0a84c44c9d14e6c311c1ba7":[20,0,1,8],
+"group___epid_member_module.html#gaf8cd05388f017486f14da2ee48d067ef":[20,0,1,5],
+"group___epid_module.html":[20,0],
+"group___epid_print.html":[20,0,0,3],
+"group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca":[20,0,0,3,3],
+"group___epid_print.html#ga138cd388247a58680d4701d59d6976d2":[20,0,0,3,12],
+"group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83":[20,0,0,3,0],
+"group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476":[20,0,0,3,8],
+"group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a":[20,0,0,3,1],
+"group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d":[20,0,0,3,2],
+"group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4":[20,0,0,3,9],
+"group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f":[20,0,0,3,10],
+"group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de":[20,0,0,3,7],
+"group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf":[20,0,0,3,4],
+"group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a":[20,0,0,3,11],
+"group___epid_print.html#gae553c3a156a0e4968b89635ab0757580":[20,0,0,3,5],
+"group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f":[20,0,0,3,6],
+"group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a":[20,0,0,3,0,2],
+"group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d":[20,0,0,3,0,1],
+"group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae":[20,0,0,3,0,0],
+"group___epid_types.html":[20,0,0,4],
+"group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0":[20,0,0,4,39],
+"group___epid_types.html#ga54bd22670f2e348593db7ab631131d10":[20,0,0,4,40],
+"group___epid_types.html#ga55eb2193045bde31af3f551565126042":[20,0,0,4,38],
+"group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890":[20,0,0,4,42],
+"group___epid_types.html#ga888541b8148df69c634a92c64ed51317":[20,0,0,4,41]
+};
diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js
new file mode 100644
index 0000000..41c1473
--- /dev/null
+++ b/doc/html/navtreeindex1.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX1 =
+{
+"group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2":[20,0,0,4,36],
+"group___epid_types.html#gada666b48d0cbc301985405fde896f1de":[20,0,0,4,37],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290":[20,0,0,4,42,2],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85":[20,0,0,4,42,5],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb":[20,0,0,4,42,0],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86":[20,0,0,4,42,6],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba":[20,0,0,4,42,4],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee":[20,0,0,4,42,7],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d":[20,0,0,4,42,1],
+"group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055":[20,0,0,4,42,3],
+"group___epid_verifier_module.html":[20,0,2],
+"group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a":[20,0,2,15],
+"group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6":[20,0,2,10],
+"group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70":[20,0,2,8],
+"group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb":[20,0,2,11],
+"group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f":[20,0,2,6],
+"group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf":[20,0,2,14],
+"group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12":[20,0,2,9],
+"group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69":[20,0,2,4],
+"group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392":[20,0,2,16],
+"group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92":[20,0,2,12],
+"group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e":[20,0,2,18],
+"group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700":[20,0,2,7],
+"group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81":[20,0,2,19],
+"group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064":[20,0,2,17],
+"group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8":[20,0,2,3],
+"group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea":[20,0,2,5],
+"group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c":[20,0,2,2],
+"group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e":[20,0,2,13],
+"group___error_codes.html":[20,0,0,1],
+"group___error_codes.html#ga59e8680ce52509302fd58a987e45004d":[20,0,0,1,1],
+"group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360":[20,0,0,1,0],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a11a4d2f1c37064eb663de08dc57bcda8":[20,0,0,1,0,11],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1739ecb620f4bede2e1b84e52a96cee6":[20,0,0,1,0,12],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a1dc7b7e6ff97c7ed9ff4191d76ebd6e1":[20,0,0,1,0,4],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a3706f895a660260033b5b91890516c0f":[20,0,0,1,0,17],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a43c658cbf0d156850d71ce3f8efd461c":[20,0,0,1,0,5],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a486e052baa99c6c25ae5d5cc710de298":[20,0,0,1,0,6],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a5252da1ff519a098446723e9edd30cc7":[20,0,0,1,0,8],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a61234ad9610406da6bf7977afd72a357":[20,0,0,1,0,16],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a700953ded1af35781948e8ada6dedf43":[20,0,0,1,0,20],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a83a867b4f71ee13edbfca2f1b72abbec":[20,0,0,1,0,14],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a893cd0d417b139bb376d09c93695c3f3":[20,0,0,1,0,13],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9":[20,0,0,1,0,0],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a94ae9c9b9337afd2fefd3b4f9c3160df":[20,0,0,1,0,18],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aa08f0d2e394b37694117a6a32bc71e6e":[20,0,0,1,0,7],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab2768a1a5c4374cb1ac6175c09c73129":[20,0,0,1,0,19],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab45ad60085d03c03ea30b40a0519897e":[20,0,0,1,0,1],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ab7dfec784192a827a91a4b8a6054d01c":[20,0,0,1,0,10],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad134d6cc95a9dcb1b1a9f9c358047cbf":[20,0,0,1,0,9],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360ad4d4ff24a7ef2cd7a50b8082265e9ff4":[20,0,0,1,0,15],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aedd43fb4043bef3b515fc23f1d9a5fe5":[20,0,0,1,0,3],
+"group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aeedd19b8a1cbdecf963f90b4860e02b8":[20,0,0,1,0,2],
+"group___file_parser.html":[20,0,0,2],
+"group___file_parser.html#ga1562efc7c1891875d6b2b9180d65de9d":[20,0,0,2,4],
+"group___file_parser.html#ga237ef5a43076aa6fc6eb18829a93da3f":[20,0,0,2,9],
+"group___file_parser.html#ga3770c39a0546c79447c9d4159d794c33":[20,0,0,2,10],
+"group___file_parser.html#ga43fdbc1bf2edd3695d21cb457365afbb":[20,0,0,2,6],
+"group___file_parser.html#ga8e38d1102eb1dd9b5af2e2f79236da55":[20,0,0,2,5],
+"group___file_parser.html#ga9a33be7edc6b4c7a867fb07bd2bddecb":[20,0,0,2,3],
+"group___file_parser.html#gaae808987ce82188dff42baa4e43cab82":[20,0,0,2,11],
+"group___file_parser.html#gad767f72dc55307b872a8b5600da3fd6f":[20,0,0,2,7],
+"group___file_parser.html#gadc033fb23e3cbda56aa7e3d412060b7e":[20,0,0,2,8],
+"group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da5f270e2e8c2412bc07de293023f425cc":[20,0,0,2,4,0],
+"group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da6af0ee9d9689f1d4325bdd0beb8a89e2":[20,0,0,2,4,1],
+"group___file_parser.html#gga1562efc7c1891875d6b2b9180d65de9da8bbd27765997dd10f1c0378dbecef01d":[20,0,0,2,4,2],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba1f8d8c4b253403a35c51e05d34a7ca1e":[20,0,0,2,3,1],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba692b4141bff8225bee6000750b0da322":[20,0,0,2,3,2],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8aead4b6aab87a1efb2d7e8c77a9b710":[20,0,0,2,3,3],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecba8e5247daee3999540e6cb24d4c2b3770":[20,0,0,2,3,4],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbab772fa1e3f221af125ffb34b86b3f24c":[20,0,0,2,3,7],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac24554caafe2db01e2daed413188cd92":[20,0,0,2,3,0],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac52e5fe24a12424316f655b9b7c62600":[20,0,0,2,3,6],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac6d742ea3dd3b17f6d763970ac84b811":[20,0,0,2,3,8],
+"group___file_parser.html#gga9a33be7edc6b4c7a867fb07bd2bddecbac708ba9e56eaeac0f1256457cbd45911":[20,0,0,2,3,5],
+"group___finite_field_primitives.html":[20,0,0,0,3],
+"group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634":[20,0,0,0,3,16],
+"group___finite_field_primitives.html#ga1a6e6d3c2319bb24eae8670b021e223b":[20,0,0,0,3,4],
+"group___finite_field_primitives.html#ga1bad3c6945d1d709fceb07a1dd03000e":[20,0,0,0,3,2],
+"group___finite_field_primitives.html#ga1ef46fc83f9c11263a2aa1ec906c9144":[20,0,0,0,3,13],
+"group___finite_field_primitives.html#ga20d9140e5670d679ef8183d9b5115f53":[20,0,0,0,3,10],
+"group___finite_field_primitives.html#ga26069d035d0f6ade33af2b5d5c14949a":[20,0,0,0,3,8],
+"group___finite_field_primitives.html#ga39892fe2ab431e166dbbcf57756660f6":[20,0,0,0,3,15],
+"group___finite_field_primitives.html#ga4613a75bd001a974b3e3e494c3a112a5":[20,0,0,0,3,11],
+"group___finite_field_primitives.html#ga59d20610f245ff4bc3a17b7bfe289991":[20,0,0,0,3,17],
+"group___finite_field_primitives.html#ga6622db072782fd9e53b4d59dd3dbd8e8":[20,0,0,0,3,6],
+"group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa":[20,0,0,0,3,0],
+"group___finite_field_primitives.html#ga7d99fdc5e4573668a5744e49df7ab67c":[20,0,0,0,3,20],
+"group___finite_field_primitives.html#ga83041e3be9984a4bd8f1021934bfa3a2":[20,0,0,0,3,21],
+"group___finite_field_primitives.html#ga84d21decc1c957bcf6e98e1492eb2ac3":[20,0,0,0,3,12],
+"group___finite_field_primitives.html#ga8a143a5a815a62f4947be2de1653c50f":[20,0,0,0,3,23],
+"group___finite_field_primitives.html#ga90b2c192708973b54b7a3e82b34536ed":[20,0,0,0,3,18],
+"group___finite_field_primitives.html#gaa3c1f7515dd823ddad8764091ebc665f":[20,0,0,0,3,24],
+"group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e":[20,0,0,0,3,1],
+"group___finite_field_primitives.html#gabd511d79d9cbd1899e59258f149102c5":[20,0,0,0,3,7],
+"group___finite_field_primitives.html#gacbdd2871ecf93dadaac9d2c5b16e1e5f":[20,0,0,0,3,3],
+"group___finite_field_primitives.html#gacc54f315ede2dbeb8c5990c024a0de6c":[20,0,0,0,3,19],
+"group___finite_field_primitives.html#gae69af62a03179718cac81b004549c598":[20,0,0,0,3,22],
+"group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2":[20,0,0,0,3,14],
+"group___finite_field_primitives.html#gaed2acb8583e9c9f6b49fdb660c672625":[20,0,0,0,3,9],
+"group___finite_field_primitives.html#gaf0ddbc1bad048d67771cba119eb44a6c":[20,0,0,0,3,5],
+"group___hash_primitives.html":[20,0,0,0,4],
+"group___hash_primitives.html#ga86d62aac9efd7445acee311b41846c6c":[20,0,0,0,4,1],
+"group___pairing_primitives.html":[20,0,0,0,5],
+"group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc":[20,0,0,0,5,2],
+"group___pairing_primitives.html#ga58a9d3cb6129274a04c72a35a52f768d":[20,0,0,0,5,3],
+"group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d":[20,0,0,0,5,1],
+"group___tpm2_module.html":[20,0,1,0],
+"group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7":[20,0,1,0,12],
+"group___tpm2_module.html#ga11a523e65eee3c7ad1ab21239329ce3e":[20,0,1,0,1],
+"group___tpm2_module.html#ga11cc131debbca60c0de7e53d48330b69":[20,0,1,0,11],
+"group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd":[20,0,1,0,6],
+"group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22":[20,0,1,0,7],
+"group___tpm2_module.html#ga38f47cba4c26320db06aa50a77590ef4":[20,0,1,0,2],
+"group___tpm2_module.html#ga750e38b6d6cea1b05f605e476df065d9":[20,0,1,0,0],
+"group___tpm2_module.html#ga8ee4fed3e1a4dd0c910102430fca8c81":[20,0,1,0,10],
+"group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc":[20,0,1,0,8],
+"group___tpm2_module.html#gac2507260f635a9c7abd9113cda6918f9":[20,0,1,0,4],
+"group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb":[20,0,1,0,9],
+"group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326":[20,0,1,0,5],
+"group___tpm2_module.html#gae7f35aaf9045e4e21bc2ec56e384fcf6":[20,0,1,0,3],
+"index.html":[],
+"index.html":[1],
+"index.html#mainpage_roadmap":[1,0],
+"modules.html":[20],
+"pages.html":[],
+"struct_basic_signature.html":[20,0,0,4,21],
+"struct_basic_signature.html#a0078cc83ecf6c7e31f96b7d44aa60e21":[20,0,0,4,21,2],
+"struct_basic_signature.html#a0e8ea6a2cd3af10e9b59d96d7d06bc69":[20,0,0,4,21,6],
+"struct_basic_signature.html#a4daa94db5068db3f10960f3dd178d603":[20,0,0,4,21,1],
+"struct_basic_signature.html#a69115a4776d15b48411dd6c3a76d0f3d":[20,0,0,4,21,3],
+"struct_basic_signature.html#a730f74d85cfb4fa4089d43c87b97a624":[20,0,0,4,21,7],
+"struct_basic_signature.html#a79d8dec8c5da176e497abf22e4c43adb":[20,0,0,4,21,5],
+"struct_basic_signature.html#a91daebc5b577688afeed2a7ee7913245":[20,0,0,4,21,4],
+"struct_basic_signature.html#ae90cb6af66b010ae39913f033c1e65ac":[20,0,0,4,21,0],
+"struct_big_num_str.html":[20,0,0,4,8],
+"struct_big_num_str.html#a442dcf33889b4f85c5b1228d2c8e6838":[20,0,0,4,8,0],
+"struct_compressed_priv_key.html":[20,0,0,4,18],
+"struct_compressed_priv_key.html#a0b0535f0567eb0e48f799d27991d0f66":[20,0,0,4,18,0],
+"struct_compressed_priv_key.html#a54b9af7699f517bbaef3d52d03e3fed8":[20,0,0,4,18,2],
+"struct_compressed_priv_key.html#ac6689899f1d9a6a8c5e4915563679840":[20,0,0,4,18,1],
+"struct_ecdsa_private_key.html":[20,0,0,4,35],
+"struct_ecdsa_private_key.html#a97efee9b4079f95d94a104f9a6d8c96d":[20,0,0,4,35,0],
+"struct_ecdsa_public_key.html":[20,0,0,4,34],
+"struct_ecdsa_public_key.html#a37c51614faf022eec491b4de8f3a13e1":[20,0,0,4,34,0],
+"struct_ecdsa_public_key.html#a4503c4613386cbc78add1dc245c99284":[20,0,0,4,34,1],
+"struct_ecdsa_signature.html":[20,0,0,4,33],
+"struct_ecdsa_signature.html#a2efd6bf37b12f35135bf325fa491b029":[20,0,0,4,33,1],
+"struct_ecdsa_signature.html#a64b623605a55a267a36df18f29142d0d":[20,0,0,4,33,0],
+"struct_epid11_basic_signature.html":[20,0,0,4,0,8],
+"struct_epid11_basic_signature.html#a1a73fc922f69e2499643dd4c53d0d42d":[20,0,0,4,0,8,5],
+"struct_epid11_basic_signature.html#a267cf4e17d10584736b0c38f3668d822":[20,0,0,4,0,8,12],
+"struct_epid11_basic_signature.html#a2718346665210b7e26521bf4a15cb3bd":[20,0,0,4,0,8,9],
+"struct_epid11_basic_signature.html#a27fd7ae99d1ada652e21e7508a467c0b":[20,0,0,4,0,8,0],
+"struct_epid11_basic_signature.html#a29a700f3bec251600e18b2292081df4b":[20,0,0,4,0,8,6],
+"struct_epid11_basic_signature.html#a5882fcbfd272774e12e50a2d77f0b139":[20,0,0,4,0,8,2],
+"struct_epid11_basic_signature.html#a58b058a9c5119a240177acfade328b3b":[20,0,0,4,0,8,11],
+"struct_epid11_basic_signature.html#a911441845fc9b82d514133371b5ba87c":[20,0,0,4,0,8,10],
+"struct_epid11_basic_signature.html#a9cc6efcd3d7270022779bd16776168ed":[20,0,0,4,0,8,1],
+"struct_epid11_basic_signature.html#ae17b45194997a6fa13c6014a51ec711c":[20,0,0,4,0,8,8],
+"struct_epid11_basic_signature.html#aeb221cf52bc2b1a9bf6e0a9779bfd20f":[20,0,0,4,0,8,4],
+"struct_epid11_basic_signature.html#af18200712d2cf3ed3ccaee328e8a4e0f":[20,0,0,4,0,8,3],
+"struct_epid11_basic_signature.html#afe28bad6328f81e6f7af011cc96ac2e5":[20,0,0,4,0,8,7],
+"struct_epid11_g2_elem_str.html":[20,0,0,4,0,4],
+"struct_epid11_g2_elem_str.html#a9e8984e479bcbe8bd36c65e80c340032":[20,0,0,4,0,4,1],
+"struct_epid11_g2_elem_str.html#af28558484298f4f56377ededf57a4a04":[20,0,0,4,0,4,0],
+"struct_epid11_group_pub_key.html":[20,0,0,4,0,7],
+"struct_epid11_group_pub_key.html#a056c7138246e2bdcd47eaad501b756bb":[20,0,0,4,0,7,3],
+"struct_epid11_group_pub_key.html#a36f688472e2655052d485eac67d8c362":[20,0,0,4,0,7,1],
+"struct_epid11_group_pub_key.html#a964344b3c595bdd585bb9b5d9d0ea762":[20,0,0,4,0,7,0],
+"struct_epid11_group_pub_key.html#aa724e9d2f0cb6019c05547d76a13b72a":[20,0,0,4,0,7,2],
+"struct_epid11_group_rl.html":[20,0,0,4,0,14],
+"struct_epid11_group_rl.html#a35cb954f598d4006b0f047cde77010a5":[20,0,0,4,0,14,1],
+"struct_epid11_group_rl.html#a63afa9863e8dcb63ff884e6e4093c481":[20,0,0,4,0,14,2],
+"struct_epid11_group_rl.html#a97f165c59bc447e3ca3c2148a096710f":[20,0,0,4,0,14,0],
+"struct_epid11_gt_elem_str.html":[20,0,0,4,0,5],
+"struct_epid11_gt_elem_str.html#aed8dd86f1696c2f3537154fc904bf2b0":[20,0,0,4,0,5,0],
+"struct_epid11_nr_proof.html":[20,0,0,4,0,9],
+"struct_epid11_nr_proof.html#a1ad7fe6b32c09f2504ee49731c0ad145":[20,0,0,4,0,9,1],
+"struct_epid11_nr_proof.html#a2e5ee8dc25d296538dce935397a93d68":[20,0,0,4,0,9,0],
+"struct_epid11_nr_proof.html#a5ad9ba3bfac4eac37fd4a4e33ea65ddc":[20,0,0,4,0,9,3],
+"struct_epid11_nr_proof.html#aa8406e938b2f87bded9e374e93a8ee5d":[20,0,0,4,0,9,2],
+"struct_epid11_params.html":[20,0,0,4,0,6],
+"struct_epid11_params.html#a01381f84b2d747b6273e21c71c58a1b0":[20,0,0,4,0,6,0],
+"struct_epid11_params.html#a02bd6fa2ab256e3a07533e947ab0101e":[20,0,0,4,0,6,10],
+"struct_epid11_params.html#a0fe238db4ebc0225899dc2dac97d11c0":[20,0,0,4,0,6,9],
+"struct_epid11_params.html#a1c6bbc4e066449d9c329f88cb653ef7c":[20,0,0,4,0,6,6],
+"struct_epid11_params.html#a27b45ed7771a3024d1d059b4b4ff6eae":[20,0,0,4,0,6,2],
+"struct_epid11_params.html#a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a":[20,0,0,4,0,6,11],
+"struct_epid11_params.html#a49462f35596d07a456a731d0690fdd83":[20,0,0,4,0,6,14],
+"struct_epid11_params.html#a77a8350b97a7afb584a46eb5b32f03bf":[20,0,0,4,0,6,12],
+"struct_epid11_params.html#a7eb9a1371d7187ae81bccfa8d5595033":[20,0,0,4,0,6,7],
+"struct_epid11_params.html#a835e70da717cd5b0c94e242a6418a287":[20,0,0,4,0,6,5],
+"struct_epid11_params.html#aacc39ebe0cc625321039ffb6be0b0e87":[20,0,0,4,0,6,4],
+"struct_epid11_params.html#aad03fd1cc3955bb8879535fa7298123f":[20,0,0,4,0,6,13],
+"struct_epid11_params.html#ade3f88ce73d7de656ec67d9fdb0719d7":[20,0,0,4,0,6,3],
+"struct_epid11_params.html#ae2d1dc635d9d7cba496c3d64fb6f9d5b":[20,0,0,4,0,6,8],
+"struct_epid11_params.html#ae8770bb921aac9214ff8c45c41dbb228":[20,0,0,4,0,6,1],
+"struct_epid11_params.html#af22cfcd6c7ec0e7e7369b79554b963bd":[20,0,0,4,0,6,15],
+"struct_epid11_priv_rl.html":[20,0,0,4,0,11],
+"struct_epid11_priv_rl.html#a2b3899f5a35bf64f860d6d91bccb03c8":[20,0,0,4,0,11,3],
+"struct_epid11_priv_rl.html#aa8945d81e30674b52a6d0900b64feb3c":[20,0,0,4,0,11,1],
+"struct_epid11_priv_rl.html#abbb75fee81aecb2dde7e2daab895ad3b":[20,0,0,4,0,11,0],
+"struct_epid11_priv_rl.html#ad95f880f40e2f40c723f5bdbd22ecfa2":[20,0,0,4,0,11,2],
+"struct_epid11_sig_rl.html":[20,0,0,4,0,13],
+"struct_epid11_sig_rl.html#a6473f8a98f76c9f82183041ea5ae17e3":[20,0,0,4,0,13,0],
+"struct_epid11_sig_rl.html#a8c654d43df132db7874f4c84c177dc12":[20,0,0,4,0,13,2],
+"struct_epid11_sig_rl.html#aa38674729293f4879ff94328dd3c59b1":[20,0,0,4,0,13,3],
+"struct_epid11_sig_rl.html#ad45b0e3e1be59649150dd34c104000ac":[20,0,0,4,0,13,1],
+"struct_epid11_sig_rl_entry.html":[20,0,0,4,0,12],
+"struct_epid11_sig_rl_entry.html#a5de66e1352eafe95774a0d76bac8f01a":[20,0,0,4,0,12,1],
+"struct_epid11_sig_rl_entry.html#abe47cfbd00684941f93a211417bedf0c":[20,0,0,4,0,12,0],
+"struct_epid11_signature.html":[20,0,0,4,0,10],
+"struct_epid11_signature.html#a43cb3ed13c862ff05a9292623ad57c5e":[20,0,0,4,0,10,1],
+"struct_epid11_signature.html#a48526e73f02ad3f1544c4c71c481f153":[20,0,0,4,0,10,3],
+"struct_epid11_signature.html#abf24a8df563ba3f535486d8dad7384f4":[20,0,0,4,0,10,2],
+"struct_epid11_signature.html#ad25c277223a5210063163ea554d08ad4":[20,0,0,4,0,10,0],
+"struct_epid11_verifier_precomp.html":[20,0,2,0,0],
+"struct_epid11_verifier_precomp.html#a03138e937f4488bdbc52ed473dc313da":[20,0,2,0,0,3],
+"struct_epid11_verifier_precomp.html#a0a980adb039089263ec59a995600ee91":[20,0,2,0,0,0],
+"struct_epid11_verifier_precomp.html#a14ebadf105aff085edb9a817a2d1db89":[20,0,2,0,0,2],
+"struct_epid11_verifier_precomp.html#ad0ff2a13c2c87460296900dde72a2f30":[20,0,2,0,0,1],
+"struct_epid2_params.html":[20,0,0,4,14],
+"struct_epid2_params.html#a023603228fed2854ddae2e228938940f":[20,0,0,4,14,6],
+"struct_epid2_params.html#a200a0cba1c9e4ad512bece23f2461a5f":[20,0,0,4,14,7],
+"struct_epid2_params.html#a2f868edb49be49f645101ef5ebbbc551":[20,0,0,4,14,0],
+"struct_epid2_params.html#a4c5195b4fa9393a07a121336202531ad":[20,0,0,4,14,2],
+"struct_epid2_params.html#a609b0aac17fca34fe39bee29676a9618":[20,0,0,4,14,3],
+"struct_epid2_params.html#ac0e0dad45b10927860cd5fa4f8101f08":[20,0,0,4,14,5],
+"struct_epid2_params.html#ac2d7507c6f58c3451beacacb91b52695":[20,0,0,4,14,1],
+"struct_epid2_params.html#ae1d8f5d6036a82064e91bc137b278e74":[20,0,0,4,14,8],
+"struct_epid2_params.html#af23f07fb0e1745c0ad14aceeaa946928":[20,0,0,4,14,4],
+"struct_epid_ca_certificate.html":[20,0,0,2,2],
+"struct_epid_ca_certificate.html#a280e0b0238cf45834c21849ab8a7e124":[20,0,0,2,2,1],
+"struct_epid_ca_certificate.html#a2811c1914ffae913820f13da914c8f01":[20,0,0,2,2,0],
+"struct_epid_ca_certificate.html#a2f8f09ae02919c379c38386668b47418":[20,0,0,2,2,6],
+"struct_epid_ca_certificate.html#a3a44e8050ca2f5085652b2b4e15b779c":[20,0,0,2,2,3],
+"struct_epid_ca_certificate.html#a4f77996f90ed7da1d0503c4236b2c9d1":[20,0,0,2,2,7],
+"struct_epid_ca_certificate.html#a9d2fc21f46cf9fc96e2ea557b70e5356":[20,0,0,2,2,4],
+"struct_epid_ca_certificate.html#ab9d4c318b1fc8d38d3ce53b29f2dfee2":[20,0,0,2,2,5],
+"struct_epid_ca_certificate.html#abd69cce8d5e3940787ee0d17f72184ab":[20,0,0,2,2,8],
+"struct_epid_ca_certificate.html#ac03cf7257c52ad14e3dd3201b930dd50":[20,0,0,2,2,2],
+"struct_epid_file_header.html":[20,0,0,2,1],
+"struct_epid_file_header.html#a35d43c51c1739940381e4898ca87b824":[20,0,0,2,1,0],
+"struct_epid_file_header.html#af5d48c739cc6c00c6e1ce35abf4f1473":[20,0,0,2,1,1],
+"struct_epid_signature.html":[20,0,0,4,23],
+"struct_epid_signature.html#a4155f3f4f1223fc4ae50c94f5305def1":[20,0,0,4,23,1],
+"struct_epid_signature.html#a62a6b0ffcd5f68dd3d2786a58fe43017":[20,0,0,4,23,0],
+"struct_epid_signature.html#a89d2e38223944310b6eeeadf6061a2dd":[20,0,0,4,23,2],
+"struct_epid_signature.html#ab0fe5f98bff737fcfbfe0b4d658e83f2":[20,0,0,4,23,3]
+};
diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js
new file mode 100644
index 0000000..fed10d0
--- /dev/null
+++ b/doc/html/navtreeindex2.js
@@ -0,0 +1,110 @@
+var NAVTREEINDEX2 =
+{
+"struct_fp_elem_str.html":[20,0,0,4,9],
+"struct_fp_elem_str.html#a5ddb96a5567750f2834335851c906c45":[20,0,0,4,9,0],
+"struct_fq12_elem_str.html":[20,0,0,4,32],
+"struct_fq12_elem_str.html#a0520947335aaf52de90af1dec5bdd112":[20,0,0,4,32,0],
+"struct_fq2_elem_str.html":[20,0,0,4,30],
+"struct_fq2_elem_str.html#ab1d253eb24ba30eaf516ac429daab915":[20,0,0,4,30,0],
+"struct_fq3_elem_str.html":[20,0,0,4,0,3],
+"struct_fq3_elem_str.html#af1be0a4d5c9c674d75bec34f95e3c731":[20,0,0,4,0,3,0],
+"struct_fq6_elem_str.html":[20,0,0,4,31],
+"struct_fq6_elem_str.html#a89d656e5c815b4a2382d11ef6932a7d2":[20,0,0,4,31,0],
+"struct_fq_elem_str.html":[20,0,0,4,10],
+"struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14":[20,0,0,4,10,0],
+"struct_g1_elem_str.html":[20,0,0,4,11],
+"struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4":[20,0,0,4,11,0],
+"struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3":[20,0,0,4,11,1],
+"struct_g2_elem_str.html":[20,0,0,4,12],
+"struct_g2_elem_str.html#a145ec5b20a6f4f00b080e11c8680afc3":[20,0,0,4,12,0],
+"struct_g2_elem_str.html#a43141b2458aecceed8ee2748270f7908":[20,0,0,4,12,1],
+"struct_group_pub_key.html":[20,0,0,4,15],
+"struct_group_pub_key.html#a2a4320ec99fd1a15df412fbf2a8d49f1":[20,0,0,4,15,2],
+"struct_group_pub_key.html#a86be439104fb60b324784baf24a943f9":[20,0,0,4,15,3],
+"struct_group_pub_key.html#a8c22c758ea186f95e3bf4b2ef8451da5":[20,0,0,4,15,1],
+"struct_group_pub_key.html#ae8e77ab4d5eb3c8e566c24a64cce56ee":[20,0,0,4,15,0],
+"struct_group_rl.html":[20,0,0,4,27],
+"struct_group_rl.html#a51022e172ab8b945efc69f1e63170107":[20,0,0,4,27,0],
+"struct_group_rl.html#a69c41d99cdfc5b6ece7442f466f7ec3f":[20,0,0,4,27,2],
+"struct_group_rl.html#a9067f01c63cdefbc8e23c3cf67a10172":[20,0,0,4,27,1],
+"struct_gt_elem_str.html":[20,0,0,4,13],
+"struct_gt_elem_str.html#aeaeb0e9e1c6efd378a475eb9a6c42132":[20,0,0,4,13,0],
+"struct_i_priv_key.html":[20,0,0,4,16],
+"struct_i_priv_key.html#a6d484175317aef09fb959c3ca55fc70a":[20,0,0,4,16,0],
+"struct_i_priv_key.html#ad400a4237b6d50855538fd40580eb1bb":[20,0,0,4,16,1],
+"struct_join_request.html":[20,0,0,4,20],
+"struct_join_request.html#a005651506fd4511e8a3537f6c3634532":[20,0,0,4,20,1],
+"struct_join_request.html#a55e30a274e83b808db6fbab5ae6c6cb8":[20,0,0,4,20,0],
+"struct_join_request.html#a73bf8989df5f90eb3d06e7a42ad74d1d":[20,0,0,4,20,2],
+"struct_member_params.html":[20,0,1,1],
+"struct_member_params.html#a7510f05e63328fa13cf2a3a3bd6acd95":[20,0,1,1,2],
+"struct_member_params.html#ad6782a38fd79477bccf2313c676ea4fc":[20,0,1,1,0],
+"struct_member_params.html#ad844c7a2be20bac70b118e7c08530c0b":[20,0,1,1,1],
+"struct_member_precomp.html":[20,0,0,4,29],
+"struct_member_precomp.html#a4e7412969bed3964f813b093b948e7b4":[20,0,0,4,29,1],
+"struct_member_precomp.html#a55e5c4b25c8f0f426969a8d745260fe5":[20,0,0,4,29,0],
+"struct_member_precomp.html#a573551f6494e372f44fd3bdf5b02aeda":[20,0,0,4,29,3],
+"struct_member_precomp.html#a879d5a7b0c30088b23f6e5c5fc62f834":[20,0,0,4,29,2],
+"struct_membership_credential.html":[20,0,0,4,19],
+"struct_membership_credential.html#a2c5c0d22999d6917fea5ad6618883bcf":[20,0,0,4,19,2],
+"struct_membership_credential.html#a6d38ac3a9c5417833b8adb9b22bc9dc8":[20,0,0,4,19,0],
+"struct_membership_credential.html#afbff64ec55888c7e2a658eabb5e16671":[20,0,0,4,19,1],
+"struct_nr_proof.html":[20,0,0,4,22],
+"struct_nr_proof.html#a0de1aa69acf3d93da34cf4a613b359a1":[20,0,0,4,22,0],
+"struct_nr_proof.html#a717ec36a6c91acd01d9b642bb20fc178":[20,0,0,4,22,1],
+"struct_nr_proof.html#ace535065bbf96502b893ac677dc8dcd3":[20,0,0,4,22,3],
+"struct_nr_proof.html#ae2e9f22089793a4d44a0f7f5cdb78a0c":[20,0,0,4,22,2],
+"struct_oct_str128.html":[20,0,0,4,5],
+"struct_oct_str128.html#a7482aa9b0b580fdd50bd65419d52d4b9":[20,0,0,4,5,0],
+"struct_oct_str16.html":[20,0,0,4,2],
+"struct_oct_str16.html#a86ed6671693a3f60ec4ff7de2c1206c3":[20,0,0,4,2,0],
+"struct_oct_str256.html":[20,0,0,4,6],
+"struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e":[20,0,0,4,6,0],
+"struct_oct_str32.html":[20,0,0,4,3],
+"struct_oct_str32.html#a5588a7e70f3d73f6ce58b567a9f5c5c8":[20,0,0,4,3,0],
+"struct_oct_str512.html":[20,0,0,4,7],
+"struct_oct_str512.html#abd4d1b97fe49321571da86de1aeac653":[20,0,0,4,7,0],
+"struct_oct_str600.html":[20,0,0,4,0,1],
+"struct_oct_str600.html#a06d53af92a06e1decc6062fd16c43a59":[20,0,0,4,0,1,0],
+"struct_oct_str64.html":[20,0,0,4,4],
+"struct_oct_str64.html#a0e107d78192a5ae0b48ed9e5c4eab0fc":[20,0,0,4,4,0],
+"struct_oct_str768.html":[20,0,0,4,0,2],
+"struct_oct_str768.html#ae45eea89259bd22e60a8d960063921cc":[20,0,0,4,0,2,0],
+"struct_oct_str8.html":[20,0,0,4,1],
+"struct_oct_str8.html#a5e6c56fda48c88b419e621b464b03bef":[20,0,0,4,1,0],
+"struct_oct_str80.html":[20,0,0,4,0,0],
+"struct_oct_str80.html#af80e2b81554109d9a41c5e771aceb8c9":[20,0,0,4,0,0,0],
+"struct_priv_key.html":[20,0,0,4,17],
+"struct_priv_key.html#a266c7e369b8b868ef5755e9cd3c0c849":[20,0,0,4,17,0],
+"struct_priv_key.html#aa805f9e124f05bdb733c85cb93614cbd":[20,0,0,4,17,3],
+"struct_priv_key.html#ab416dcb4366427c24b44c2a02e4ae7c8":[20,0,0,4,17,2],
+"struct_priv_key.html#ad7ee0392a583edd2e287cf8c1f9066ba":[20,0,0,4,17,1],
+"struct_priv_rl.html":[20,0,0,4,24],
+"struct_priv_rl.html#a4c6b51cec760f7e81ca8635422ac6a50":[20,0,0,4,24,3],
+"struct_priv_rl.html#a60d73f9ef5fc81f117b3abadf8c18466":[20,0,0,4,24,0],
+"struct_priv_rl.html#a6da9639ec4061689d1c30a58e0befd14":[20,0,0,4,24,2],
+"struct_priv_rl.html#af7317529b8e55476bd06b66ed8131d64":[20,0,0,4,24,1],
+"struct_sha256_digest.html":[20,0,0,0,4,0],
+"struct_sha256_digest.html#a4b6462ddd3f89e4c40220ceb6b1c7f28":[20,0,0,0,4,0,0],
+"struct_sig_rl.html":[20,0,0,4,26],
+"struct_sig_rl.html#a12757d30fcccd310716433948e0b603e":[20,0,0,4,26,1],
+"struct_sig_rl.html#a9dfb6b508db9051f4dc480a51d702af2":[20,0,0,4,26,2],
+"struct_sig_rl.html#ac23a919993d99d24a5150302f1778102":[20,0,0,4,26,0],
+"struct_sig_rl.html#ac9d4c343c539dba799e1f42eb38b351f":[20,0,0,4,26,3],
+"struct_sig_rl_entry.html":[20,0,0,4,25],
+"struct_sig_rl_entry.html#a0dfeb058614e81878bfbf86ae3edac3c":[20,0,0,4,25,1],
+"struct_sig_rl_entry.html#ac6a47ff0d1b8ea1512e0ff14983ac5ce":[20,0,0,4,25,0],
+"struct_verifier_precomp.html":[20,0,2,1],
+"struct_verifier_precomp.html#a8caf79578e3c0baf91921460391103ca":[20,0,2,1,2],
+"struct_verifier_precomp.html#ab061d6cc07d1467eeb5bf25f3ea7e306":[20,0,2,1,3],
+"struct_verifier_precomp.html#ad1106376f12772942af0331eb74de6e5":[20,0,2,1,0],
+"struct_verifier_precomp.html#af8fd90f3a5a2be932a97dcd86099d5b2":[20,0,2,1,1],
+"struct_verifier_precomp.html#afc3e29a325c95c62bb192d5f8cdd5c1c":[20,0,2,1,4],
+"struct_verifier_rl.html":[20,0,0,4,28],
+"struct_verifier_rl.html#a1e3f84b873bccc0c882aa6432c42d2f7":[20,0,0,4,28,3],
+"struct_verifier_rl.html#a5d9a9265fffa96fd5f9260543eb08c68":[20,0,0,4,28,0],
+"struct_verifier_rl.html#ab85c4666d16145ff16443e84468d2d7d":[20,0,0,4,28,1],
+"struct_verifier_rl.html#ac7d3dceab4772096bbbeb3fa735d18a9":[20,0,0,4,28,2],
+"struct_verifier_rl.html#afa44ab69ffff5a3508366aeb2131fdaa":[20,0,0,4,28,4],
+"user":[0]
+};
diff --git a/doc/html/nv_8c.html b/doc/html/nv_8c.html
new file mode 100644
index 0000000..2be954d
--- /dev/null
+++ b/doc/html/nv_8c.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/nv.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('nv_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nv.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TSS NV API implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="nv_8h.html">epid/member/tpm2/nv.h</a>&quot;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga38ca781a9a0126223456e677f40e1d22"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">Tpm2NvUndefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index)</td></tr>
+<tr class="memdesc:ga38ca781a9a0126223456e677f40e1d22"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_UndefineSpace TPM command. <a href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">More...</a><br /></td></tr>
+<tr class="separator:ga38ca781a9a0126223456e677f40e1d22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadee3a48d63f03d55ea5f02e48d169326"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">Tpm2NvDefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size)</td></tr>
+<tr class="memdesc:gadee3a48d63f03d55ea5f02e48d169326"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_DefineSpace TPM command. <a href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">More...</a><br /></td></tr>
+<tr class="separator:gadee3a48d63f03d55ea5f02e48d169326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">Tpm2NvRead</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void *data)</td></tr>
+<tr class="memdesc:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Read TPM command. <a href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">More...</a><br /></td></tr>
+<tr class="separator:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">Tpm2NvWrite</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void const *data)</td></tr>
+<tr class="memdesc:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Write TPM command. <a href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">More...</a><br /></td></tr>
+<tr class="separator:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TSS NV API implementation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="nv_8c.html">nv.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/nv_8h.html b/doc/html/nv_8h.html
new file mode 100644
index 0000000..46852ed
--- /dev/null
+++ b/doc/html/nv_8h.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/nv.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('nv_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nv.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM non volatile memory API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gadee3a48d63f03d55ea5f02e48d169326"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">Tpm2NvDefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size)</td></tr>
+<tr class="memdesc:gadee3a48d63f03d55ea5f02e48d169326"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_DefineSpace TPM command. <a href="group___tpm2_module.html#gadee3a48d63f03d55ea5f02e48d169326">More...</a><br /></td></tr>
+<tr class="separator:gadee3a48d63f03d55ea5f02e48d169326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga38ca781a9a0126223456e677f40e1d22"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">Tpm2NvUndefineSpace</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index)</td></tr>
+<tr class="memdesc:ga38ca781a9a0126223456e677f40e1d22"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_UndefineSpace TPM command. <a href="group___tpm2_module.html#ga38ca781a9a0126223456e677f40e1d22">More...</a><br /></td></tr>
+<tr class="separator:ga38ca781a9a0126223456e677f40e1d22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">Tpm2NvWrite</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void const *data)</td></tr>
+<tr class="memdesc:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Write TPM command. <a href="group___tpm2_module.html#gabfe5ccf53b8ecb8e2f2b367a39f6e5cc">More...</a><br /></td></tr>
+<tr class="separator:gabfe5ccf53b8ecb8e2f2b367a39f6e5cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">Tpm2NvRead</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint32_t nv_index, size_t size, uint16_t offset, void *data)</td></tr>
+<tr class="memdesc:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_NV_Read TPM command. <a href="group___tpm2_module.html#ga2ec34e65adaf46a14a78f24a7fd0e4dd">More...</a><br /></td></tr>
+<tr class="separator:ga2ec34e65adaf46a14a78f24a7fd0e4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM non volatile memory API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="nv_8h.html">nv.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/open.png b/doc/html/open.png
new file mode 100644
index 0000000..30f75c7
--- /dev/null
+++ b/doc/html/open.png
Binary files differ
diff --git a/doc/html/organization_8dox.html b/doc/html/organization_8dox.html
new file mode 100644
index 0000000..3fc1888
--- /dev/null
+++ b/doc/html/organization_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/organization.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('organization_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/organization.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="organization_8dox.html">organization.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/pageorder_8dox.html b/doc/html/pageorder_8dox.html
new file mode 100644
index 0000000..5d606f9
--- /dev/null
+++ b/doc/html/pageorder_8dox.html
@@ -0,0 +1,86 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/pageorder.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('pageorder_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/pageorder.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+<p>It is the first file processed and used to assure ordering of "related pages".</p>
+<dl class="section note"><dt>Note</dt><dd>Page titles here override titles in page docs! </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="pageorder_8dox.html">pageorder.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/pages.html b/doc/html/pages.html
new file mode 100644
index 0000000..172048b
--- /dev/null
+++ b/doc/html/pages.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Contents</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('pages.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Contents</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_legal_information.html" target="_self">Legal Information</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_change_log.html" target="_self">What&#39;s New</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_epid_overview.html" target="_self">Introduction to the Intel&reg; EPID Scheme</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_sdk_overview.html" target="_self">What&#39;s Included in the SDK</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_building_sdk.html" target="_self">Building from Source</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_sign_verify_tutorial.html" target="_self">Signing and Verification Tutorial</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_provisioning.html" target="_self">Preparing a Device</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_issuer_material.html" target="_self">Test Data</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_usingi_k_g_f.html" target="_self">Managing Groups with iKGF</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_revocation.html" target="_self">In-Depth Explanation of Revocation</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_basenames.html" target="_self">In-Depth Explanation of Basenames</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_implementation_notes.html" target="_self">Implementation Notes</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_tpm_considerations.html" target="_self">Considerations for TPM</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_glossary.html" target="_self">Glossary</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_build_tools_installation.html" target="_self">Guide to Installing Build Tools</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="_how_validated.html" target="_self">Tested Libraries and Compilers</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_16_" class="arrow" onclick="toggleFolder('16_')">&#9660;</span><a class="el" href="_examples.html" target="_self">Walkthroughs of Examples Showing API Usage</a></td><td class="desc"></td></tr>
+<tr id="row_16_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="_user_manual__generating_an_intel_epid_signature.html" target="_self">Generating an Intel&reg; EPID Signature</a></td><td class="desc"></td></tr>
+<tr id="row_16_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="_user_manual__verifying_an_intel_epid_signature.html" target="_self">Verifying an Intel&reg; EPID Signature</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/printtss_8c.html b/doc/html/printtss_8c.html
new file mode 100644
index 0000000..b400728
--- /dev/null
+++ b/doc/html/printtss_8c.html
@@ -0,0 +1,135 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/printtss.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('printtss_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">printtss.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM context implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+<code>#include &lt;tss2/tssresponsecode.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac02d185169caec44119e82d97228a68a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printtss_8c.html#ac02d185169caec44119e82d97228a68a">print_tpm2_response_code</a> (char const *operation, TPM_RC rc)</td></tr>
+<tr class="memdesc:ac02d185169caec44119e82d97228a68a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Print TPM 2.0 response code as human readable message. <a href="#ac02d185169caec44119e82d97228a68a">More...</a><br /></td></tr>
+<tr class="separator:ac02d185169caec44119e82d97228a68a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM context implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ac02d185169caec44119e82d97228a68a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac02d185169caec44119e82d97228a68a">&#9670;&nbsp;</a></span>print_tpm2_response_code()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void print_tpm2_response_code </td>
+ <td>(</td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>operation</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM_RC&#160;</td>
+ <td class="paramname"><em>rc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Print TPM 2.0 response code as human readable message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">operation</td><td>The operation that returned the code </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rc</td><td>The response code </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="printtss_8c.html">printtss.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/printtss_8h.html b/doc/html/printtss_8h.html
new file mode 100644
index 0000000..bc76008
--- /dev/null
+++ b/doc/html/printtss_8h.html
@@ -0,0 +1,133 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/printtss.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('printtss_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">printtss.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM log error prints.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;tss2/TPM_Types.h&gt;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac02d185169caec44119e82d97228a68a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printtss_8h.html#ac02d185169caec44119e82d97228a68a">print_tpm2_response_code</a> (char const *operation, TPM_RC rc)</td></tr>
+<tr class="memdesc:ac02d185169caec44119e82d97228a68a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Print TPM 2.0 response code as human readable message. <a href="#ac02d185169caec44119e82d97228a68a">More...</a><br /></td></tr>
+<tr class="separator:ac02d185169caec44119e82d97228a68a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM log error prints. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ac02d185169caec44119e82d97228a68a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac02d185169caec44119e82d97228a68a">&#9670;&nbsp;</a></span>print_tpm2_response_code()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void print_tpm2_response_code </td>
+ <td>(</td>
+ <td class="paramtype">char const *&#160;</td>
+ <td class="paramname"><em>operation</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">TPM_RC&#160;</td>
+ <td class="paramname"><em>rc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Print TPM 2.0 response code as human readable message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">operation</td><td>The operation that returned the code </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rc</td><td>The response code </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="printtss_8h.html">printtss.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/printutils_8h.html b/doc/html/printutils_8h.html
new file mode 100644
index 0000000..b955af8
--- /dev/null
+++ b/doc/html/printutils_8h.html
@@ -0,0 +1,140 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/printutils.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('printutils_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">printutils.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Print helper interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="bignum_8h.html">epid/common/math/bignum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga3e215d157eb205ad596bb84bce694a83"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> { <a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae">kPrintUtilUnannotated</a> = 0,
+<a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d">kPrintUtilAnnotated</a> = 1,
+<a class="el" href="group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ade23610605d0ba7dd48db5060e28995a">kPrintUtilFormatCount</a> = 2
+ }</td></tr>
+<tr class="memdesc:ga3e215d157eb205ad596bb84bce694a83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Print format. <a href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">More...</a><br /></td></tr>
+<tr class="separator:ga3e215d157eb205ad596bb84bce694a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga45a933b44fc1dfe926e3af89c198070a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a">PrintBigNum</a> (<a class="el" href="group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718">BigNum</a> const *big_num, char const *var_name)</td></tr>
+<tr class="memdesc:ga45a933b44fc1dfe926e3af89c198070a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints BigNum. <a href="group___epid_print.html#ga45a933b44fc1dfe926e3af89c198070a">More...</a><br /></td></tr>
+<tr class="separator:ga45a933b44fc1dfe926e3af89c198070a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3b1cbbfc6f78562658953113e5798cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf">PrintFfElement</a> (<a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> const *ff_element, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gaa3b1cbbfc6f78562658953113e5798cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints finite field element. <a href="group___epid_print.html#gaa3b1cbbfc6f78562658953113e5798cf">More...</a><br /></td></tr>
+<tr class="separator:gaa3b1cbbfc6f78562658953113e5798cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca">PrintEcPoint</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *g, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *ec_point, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints elliptic curve group element. <a href="group___epid_print.html#ga0d6377d9c1651d0101ec6b61feaa78ca">More...</a><br /></td></tr>
+<tr class="separator:ga0d6377d9c1651d0101ec6b61feaa78ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d">PrintBigNumStr</a> (<a class="el" href="struct_big_num_str.html">BigNumStr</a> const *big_num_str, char const *var_name)</td></tr>
+<tr class="memdesc:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized BigNum. <a href="group___epid_print.html#ga5f249c594ed12e4a9b11b7bc101da85d">More...</a><br /></td></tr>
+<tr class="separator:ga5f249c594ed12e4a9b11b7bc101da85d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae553c3a156a0e4968b89635ab0757580"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gae553c3a156a0e4968b89635ab0757580">PrintFpElemStr</a> (<a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *fp_elem_str, char const *var_name)</td></tr>
+<tr class="memdesc:gae553c3a156a0e4968b89635ab0757580"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fp element. <a href="group___epid_print.html#gae553c3a156a0e4968b89635ab0757580">More...</a><br /></td></tr>
+<tr class="separator:gae553c3a156a0e4968b89635ab0757580"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4">PrintFqElemStr</a> (<a class="el" href="struct_fq_elem_str.html">FqElemStr</a> const *fq_elem_str, char const *var_name)</td></tr>
+<tr class="memdesc:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq element. <a href="group___epid_print.html#ga6c9fea48fa0477f4a98abb50f891a5e4">More...</a><br /></td></tr>
+<tr class="separator:ga6c9fea48fa0477f4a98abb50f891a5e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga883a834ab1703365bb0bca4abd3104de"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de">PrintFq2ElemStr</a> (<a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a> const *fq2_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga883a834ab1703365bb0bca4abd3104de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq2 element. <a href="group___epid_print.html#ga883a834ab1703365bb0bca4abd3104de">More...</a><br /></td></tr>
+<tr class="separator:ga883a834ab1703365bb0bca4abd3104de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f2961ef6b4c44a6205d422d8a293476"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476">PrintFq6ElemStr</a> (<a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a> const *fq6_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga3f2961ef6b4c44a6205d422d8a293476"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq6 element. <a href="group___epid_print.html#ga3f2961ef6b4c44a6205d422d8a293476">More...</a><br /></td></tr>
+<tr class="separator:ga3f2961ef6b4c44a6205d422d8a293476"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f">PrintFq12ElemStr</a> (<a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> const *fq12_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Fq12 element. <a href="group___epid_print.html#gaf185fe3df270cd8b4a2969bf3cfc5d5f">More...</a><br /></td></tr>
+<tr class="separator:gaf185fe3df270cd8b4a2969bf3cfc5d5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f">PrintG1ElemStr</a> (<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *g1_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized G1 element. <a href="group___epid_print.html#ga87168a3ce5306f9839b8e8d6c9a5f84f">More...</a><br /></td></tr>
+<tr class="separator:ga87168a3ce5306f9839b8e8d6c9a5f84f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a">PrintG2ElemStr</a> (<a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> const *g2_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized G2 element. <a href="group___epid_print.html#gab76a4cf0385dc4a76bb56ee9f0e3e87a">More...</a><br /></td></tr>
+<tr class="separator:gab76a4cf0385dc4a76bb56ee9f0e3e87a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga138cd388247a58680d4701d59d6976d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_print.html#ga138cd388247a58680d4701d59d6976d2">PrintGtElemStr</a> (<a class="el" href="struct_gt_elem_str.html">GtElemStr</a> const *gt_elem_str, char const *var_name, <a class="el" href="group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83">PrintUtilFormat</a> format)</td></tr>
+<tr class="memdesc:ga138cd388247a58680d4701d59d6976d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prints serialized Gt element. <a href="group___epid_print.html#ga138cd388247a58680d4701d59d6976d2">More...</a><br /></td></tr>
+<tr class="separator:ga138cd388247a58680d4701d59d6976d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Print helper interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="printutils_8h.html">printutils.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/provisioning_8dox.html b/doc/html/provisioning_8dox.html
new file mode 100644
index 0000000..8e88cb6
--- /dev/null
+++ b/doc/html/provisioning_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/provisioning.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('provisioning_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/provisioning.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="provisioning_8dox.html">provisioning.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/random_base.png b/doc/html/random_base.png
new file mode 100644
index 0000000..de4c665
--- /dev/null
+++ b/doc/html/random_base.png
Binary files differ
diff --git a/doc/html/resize.js b/doc/html/resize.js
new file mode 100644
index 0000000..6617aee
--- /dev/null
+++ b/doc/html/resize.js
@@ -0,0 +1,136 @@
+/*
+ @licstart The following is the entire license notice for the
+ JavaScript code in this file.
+
+ Copyright (C) 1997-2017 by Dimitri van Heesch
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ @licend The above is the entire license notice
+ for the JavaScript code in this file
+ */
+function initResizable()
+{
+ var cookie_namespace = 'doxygen';
+ var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight;
+
+ function readCookie(cookie)
+ {
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie) {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1) {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1) {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
+ }
+ }
+ return 0;
+ }
+
+ function writeCookie(cookie, val, expiration)
+ {
+ if (val==undefined) return;
+ if (expiration == null) {
+ var date = new Date();
+ date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+ expiration = date.toGMTString();
+ }
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+ }
+
+ function resizeWidth()
+ {
+ var windowWidth = $(window).width() + "px";
+ var sidenavWidth = $(sidenav).outerWidth();
+ content.css({marginLeft:parseInt(sidenavWidth)+"px"});
+ writeCookie('width',sidenavWidth-barWidth, null);
+ }
+
+ function restoreWidth(navWidth)
+ {
+ var windowWidth = $(window).width() + "px";
+ content.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+ sidenav.css({width:navWidth + "px"});
+ }
+
+ function resizeHeight()
+ {
+ var headerHeight = header.outerHeight();
+ var footerHeight = footer.outerHeight();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ content.css({height:windowHeight + "px"});
+ navtree.css({height:windowHeight + "px"});
+ sidenav.css({height:windowHeight + "px"});
+ var width=$(window).width();
+ if (width!=collapsedWidth) {
+ if (width<desktop_vp && collapsedWidth>=desktop_vp) {
+ if (!collapsed) {
+ collapseExpand();
+ }
+ } else if (width>desktop_vp && collapsedWidth<desktop_vp) {
+ if (collapsed) {
+ collapseExpand();
+ }
+ }
+ collapsedWidth=width;
+ }
+ }
+
+ function collapseExpand()
+ {
+ if (sidenav.width()>0) {
+ restoreWidth(0);
+ collapsed=true;
+ }
+ else {
+ var width = readCookie('width');
+ if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); }
+ collapsed=false;
+ }
+ }
+
+ header = $("#top");
+ sidenav = $("#side-nav");
+ content = $("#doc-content");
+ navtree = $("#nav-tree");
+ footer = $("#nav-path");
+ $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+ $(sidenav).resizable({ minWidth: 0 });
+ $(window).resize(function() { resizeHeight(); });
+ var device = navigator.userAgent.toLowerCase();
+ var touch_device = device.match(/(iphone|ipod|ipad|android)/);
+ if (touch_device) { /* wider split bar for touch only devices */
+ $(sidenav).css({ paddingRight:'20px' });
+ $('.ui-resizable-e').css({ width:'20px' });
+ $('#nav-sync').css({ right:'34px' });
+ barWidth=20;
+ }
+ var width = readCookie('width');
+ if (width) { restoreWidth(width); } else { resizeWidth(); }
+ resizeHeight();
+ var url = location.href;
+ var i=url.indexOf("#");
+ if (i>=0) window.location.hash=url.substr(i);
+ var _preventDefault = function(evt) { evt.preventDefault(); };
+ $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+ $(".ui-resizable-handle").dblclick(collapseExpand);
+ $(window).load(resizeHeight);
+}
+/* @license-end */
diff --git a/doc/html/revocation_8dox.html b/doc/html/revocation_8dox.html
new file mode 100644
index 0000000..efcb492
--- /dev/null
+++ b/doc/html/revocation_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/revocation.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('revocation_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/revocation.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="revocation_8dox.html">revocation.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sdk__overview_8dox.html b/doc/html/sdk__overview_8dox.html
new file mode 100644
index 0000000..75a1ac3
--- /dev/null
+++ b/doc/html/sdk__overview_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/sdk_overview.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sdk__overview_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/sdk_overview.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="sdk__overview_8dox.html">sdk_overview.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sdk_block_diagram.png b/doc/html/sdk_block_diagram.png
new file mode 100644
index 0000000..e228685
--- /dev/null
+++ b/doc/html/sdk_block_diagram.png
Binary files differ
diff --git a/doc/html/serialize_8h.html b/doc/html/serialize_8h.html
new file mode 100644
index 0000000..1516a7d
--- /dev/null
+++ b/doc/html/serialize_8h.html
@@ -0,0 +1,726 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/serialize.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('serialize_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">serialize.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of de/serialize functionality.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6789f8e258de2efc616c2f3109b7992b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a6789f8e258de2efc616c2f3109b7992b">SwapNativeAndPortableLayout</a> (void *dest, size_t dest_size, void const *src, size_t src_size)</td></tr>
+<tr class="memdesc:a6789f8e258de2efc616c2f3109b7992b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialize or deserailize a sequence of math objects. <a href="#a6789f8e258de2efc616c2f3109b7992b">More...</a><br /></td></tr>
+<tr class="separator:a6789f8e258de2efc616c2f3109b7992b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac74344e39b6d285c6a0258c4554712b0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#ac74344e39b6d285c6a0258c4554712b0">Uint32Serialize</a> (<a class="el" href="struct_oct_str32.html">OctStr32</a> *dest, uint32_t src)</td></tr>
+<tr class="memdesc:ac74344e39b6d285c6a0258c4554712b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a uint32_t to a portable buffer. <a href="#ac74344e39b6d285c6a0258c4554712b0">More...</a><br /></td></tr>
+<tr class="separator:ac74344e39b6d285c6a0258c4554712b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2aaa1779f9085d62b27e072271329dd7"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a2aaa1779f9085d62b27e072271329dd7">Uint32Deserialize</a> (uint32_t *dest, <a class="el" href="struct_oct_str32.html">OctStr32</a> const *src)</td></tr>
+<tr class="memdesc:a2aaa1779f9085d62b27e072271329dd7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a uint32_t from a portable buffer. <a href="#a2aaa1779f9085d62b27e072271329dd7">More...</a><br /></td></tr>
+<tr class="separator:a2aaa1779f9085d62b27e072271329dd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2841bf57731c82f8164900bf3f52320"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#af2841bf57731c82f8164900bf3f52320">VliSerialize</a> (<a class="el" href="struct_big_num_str.html">BigNumStr</a> *dest, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *src)</td></tr>
+<tr class="memdesc:af2841bf57731c82f8164900bf3f52320"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a large integer to a portable buffer. <a href="#af2841bf57731c82f8164900bf3f52320">More...</a><br /></td></tr>
+<tr class="separator:af2841bf57731c82f8164900bf3f52320"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7950febe703ea62457664eadc1e4eed9"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a7950febe703ea62457664eadc1e4eed9">VliDeserialize</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *dest, <a class="el" href="struct_big_num_str.html">BigNumStr</a> const *src)</td></tr>
+<tr class="memdesc:a7950febe703ea62457664eadc1e4eed9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a large integer from a portable buffer. <a href="#a7950febe703ea62457664eadc1e4eed9">More...</a><br /></td></tr>
+<tr class="separator:a7950febe703ea62457664eadc1e4eed9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fe8ff2aa7f73b807a7f5f5cdd8eba94"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a1fe8ff2aa7f73b807a7f5f5cdd8eba94">FqSerialize</a> (<a class="el" href="struct_fq_elem_str.html">FqElemStr</a> *dest, <a class="el" href="struct_fq_elem.html">FqElem</a> const *src)</td></tr>
+<tr class="memdesc:a1fe8ff2aa7f73b807a7f5f5cdd8eba94"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write an element of Fq to a portable buffer. <a href="#a1fe8ff2aa7f73b807a7f5f5cdd8eba94">More...</a><br /></td></tr>
+<tr class="separator:a1fe8ff2aa7f73b807a7f5f5cdd8eba94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a051985a737e59da22d04dfcc5112ec77"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a051985a737e59da22d04dfcc5112ec77">FqDeserialize</a> (<a class="el" href="struct_fq_elem.html">FqElem</a> *dest, <a class="el" href="struct_fq_elem_str.html">FqElemStr</a> const *src)</td></tr>
+<tr class="memdesc:a051985a737e59da22d04dfcc5112ec77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read an element of Fq from a portable buffer. <a href="#a051985a737e59da22d04dfcc5112ec77">More...</a><br /></td></tr>
+<tr class="separator:a051985a737e59da22d04dfcc5112ec77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0de690fc04ff307fa64575f9033c4d7"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#ad0de690fc04ff307fa64575f9033c4d7">Fq12Serialize</a> (<a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> *dest, <a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *src)</td></tr>
+<tr class="memdesc:ad0de690fc04ff307fa64575f9033c4d7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write an element of Fq12 to a portable buffer. <a href="#ad0de690fc04ff307fa64575f9033c4d7">More...</a><br /></td></tr>
+<tr class="separator:ad0de690fc04ff307fa64575f9033c4d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f5ba336b7da938e92dad848e00ad157"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a2f5ba336b7da938e92dad848e00ad157">Fq12Deserialize</a> (<a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *dest, <a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> const *src)</td></tr>
+<tr class="memdesc:a2f5ba336b7da938e92dad848e00ad157"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read an element of Fq12 from a portable buffer. <a href="#a2f5ba336b7da938e92dad848e00ad157">More...</a><br /></td></tr>
+<tr class="separator:a2f5ba336b7da938e92dad848e00ad157"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57237335a24f8a9b2a151a2141ec5917"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a57237335a24f8a9b2a151a2141ec5917">FpSerialize</a> (<a class="el" href="struct_fp_elem_str.html">FpElemStr</a> *dest, <a class="el" href="struct_fp_elem.html">FpElem</a> const *src)</td></tr>
+<tr class="memdesc:a57237335a24f8a9b2a151a2141ec5917"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write an element of Fp to a portable buffer. <a href="#a57237335a24f8a9b2a151a2141ec5917">More...</a><br /></td></tr>
+<tr class="separator:a57237335a24f8a9b2a151a2141ec5917"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac49c8bd07a7f09aadd08c58c362cf3af"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#ac49c8bd07a7f09aadd08c58c362cf3af">FpDeserialize</a> (<a class="el" href="struct_fp_elem.html">FpElem</a> *dest, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *src)</td></tr>
+<tr class="memdesc:ac49c8bd07a7f09aadd08c58c362cf3af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read an element of Fp from a portable buffer. <a href="#ac49c8bd07a7f09aadd08c58c362cf3af">More...</a><br /></td></tr>
+<tr class="separator:ac49c8bd07a7f09aadd08c58c362cf3af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81b7bcb69d6ea28ebb3e3520c7d0eeb5"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a81b7bcb69d6ea28ebb3e3520c7d0eeb5">EFqSerialize</a> (<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *dest, <a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *src)</td></tr>
+<tr class="memdesc:a81b7bcb69d6ea28ebb3e3520c7d0eeb5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a point on EFq to a portable buffer. <a href="#a81b7bcb69d6ea28ebb3e3520c7d0eeb5">More...</a><br /></td></tr>
+<tr class="separator:a81b7bcb69d6ea28ebb3e3520c7d0eeb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af7f9b8ffdf1bb18bc156a4f80fc32419"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#af7f9b8ffdf1bb18bc156a4f80fc32419">EFqDeserialize</a> (<a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *dest, <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *src)</td></tr>
+<tr class="memdesc:af7f9b8ffdf1bb18bc156a4f80fc32419"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a point on EFq from a portable buffer. <a href="#af7f9b8ffdf1bb18bc156a4f80fc32419">More...</a><br /></td></tr>
+<tr class="separator:af7f9b8ffdf1bb18bc156a4f80fc32419"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa53e1c30fa109e586fa90a3a4cf3d0ac"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#aa53e1c30fa109e586fa90a3a4cf3d0ac">EFq2Serialize</a> (<a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> *dest, <a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *src)</td></tr>
+<tr class="memdesc:aa53e1c30fa109e586fa90a3a4cf3d0ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a point on EFq2 to a portable buffer. <a href="#aa53e1c30fa109e586fa90a3a4cf3d0ac">More...</a><br /></td></tr>
+<tr class="separator:aa53e1c30fa109e586fa90a3a4cf3d0ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a393c9cf42edef41aa28449a0d321a57e"><td class="memItemLeft" align="right" valign="top">void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="serialize_8h.html#a393c9cf42edef41aa28449a0d321a57e">EFq2Deserialize</a> (<a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> *dest, <a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> const *src)</td></tr>
+<tr class="memdesc:a393c9cf42edef41aa28449a0d321a57e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a point on EFq2 from a portable buffer. <a href="#a393c9cf42edef41aa28449a0d321a57e">More...</a><br /></td></tr>
+<tr class="separator:a393c9cf42edef41aa28449a0d321a57e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of de/serialize functionality. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a393c9cf42edef41aa28449a0d321a57e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a393c9cf42edef41aa28449a0d321a57e">&#9670;&nbsp;</a></span>EFq2Deserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* EFq2Deserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a point on EFq2 from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="aa53e1c30fa109e586fa90a3a4cf3d0ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa53e1c30fa109e586fa90a3a4cf3d0ac">&#9670;&nbsp;</a></span>EFq2Serialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* EFq2Serialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a point on EFq2 to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="af7f9b8ffdf1bb18bc156a4f80fc32419"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af7f9b8ffdf1bb18bc156a4f80fc32419">&#9670;&nbsp;</a></span>EFqDeserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* EFqDeserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a point on EFq from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="a81b7bcb69d6ea28ebb3e3520c7d0eeb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81b7bcb69d6ea28ebb3e3520c7d0eeb5">&#9670;&nbsp;</a></span>EFqSerialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* EFqSerialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a point on EFq to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="ac49c8bd07a7f09aadd08c58c362cf3af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac49c8bd07a7f09aadd08c58c362cf3af">&#9670;&nbsp;</a></span>FpDeserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* FpDeserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read an element of Fp from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="a57237335a24f8a9b2a151a2141ec5917"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57237335a24f8a9b2a151a2141ec5917">&#9670;&nbsp;</a></span>FpSerialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* FpSerialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fp_elem.html">FpElem</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write an element of Fp to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="a2f5ba336b7da938e92dad848e00ad157"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f5ba336b7da938e92dad848e00ad157">&#9670;&nbsp;</a></span>Fq12Deserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* Fq12Deserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read an element of Fq12 from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="ad0de690fc04ff307fa64575f9033c4d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0de690fc04ff307fa64575f9033c4d7">&#9670;&nbsp;</a></span>Fq12Serialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* Fq12Serialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write an element of Fq12 to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="a051985a737e59da22d04dfcc5112ec77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a051985a737e59da22d04dfcc5112ec77">&#9670;&nbsp;</a></span>FqDeserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* FqDeserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read an element of Fq from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="a1fe8ff2aa7f73b807a7f5f5cdd8eba94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fe8ff2aa7f73b807a7f5f5cdd8eba94">&#9670;&nbsp;</a></span>FqSerialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* FqSerialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_fq_elem.html">FqElem</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write an element of Fq to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="a6789f8e258de2efc616c2f3109b7992b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6789f8e258de2efc616c2f3109b7992b">&#9670;&nbsp;</a></span>SwapNativeAndPortableLayout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void SwapNativeAndPortableLayout </td>
+ <td>(</td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>dest_size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>src_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Serialize or deserailize a sequence of math objects. </p>
+<p>Converts layouts between native and portable or between portable and native of the following types: <a class="el" href="struct_very_large_int.html" title="Large integer. ">VeryLargeInt</a> and <a class="el" href="struct_big_num_str.html" title="Serialized BigNum. ">BigNumStr</a>, <a class="el" href="struct_fq_elem.html" title="Element of Fq. ">FqElem</a> and <a class="el" href="struct_fq_elem_str.html" title="a number in [0, q-1] ">FqElemStr</a>, <a class="el" href="struct_fp_elem.html" title="Element of Fp. ">FpElem</a> and <a class="el" href="struct_fp_elem_str.html" title="a number in [0, p-1] ">FpElemStr</a>, <a class="el" href="struct_ecc_point_fq.html" title="Point in EFq. ">EccPointFq</a> and <a class="el" href="struct_g1_elem_str.html" title="Serialized G1 element. ">G1ElemStr</a>, <a class="el" href="struct_fq12_elem.html" title="Element of Fq12. ">Fq12Elem</a> and <a class="el" href="struct_fq12_elem_str.html" title="Serialized Fq2^3^2 element. ">Fq12ElemStr</a>.</p>
+<p>If input contain multiple values of supported types all will be converted.</p>
+<dl class="section note"><dt>Note</dt><dd>The following types are not supported: <a class="el" href="struct_very_large_int_product.html" title="Used for multiplication. ">VeryLargeIntProduct</a>.</dd>
+<dd>
+This function have the assumptions that the input structures are packed such that consequent 32 byte fields would have no gap in between.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">dest_size</td><td>size of dest buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src_size</td><td>size of src buffer </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2aaa1779f9085d62b27e072271329dd7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2aaa1779f9085d62b27e072271329dd7">&#9670;&nbsp;</a></span>Uint32Deserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* Uint32Deserialize </td>
+ <td>(</td>
+ <td class="paramtype">uint32_t *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_oct_str32.html">OctStr32</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a uint32_t from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="ac74344e39b6d285c6a0258c4554712b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac74344e39b6d285c6a0258c4554712b0">&#9670;&nbsp;</a></span>Uint32Serialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* Uint32Serialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_oct_str32.html">OctStr32</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a uint32_t to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+<a id="a7950febe703ea62457664eadc1e4eed9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7950febe703ea62457664eadc1e4eed9">&#9670;&nbsp;</a></span>VliDeserialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void const* VliDeserialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a large integer from a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data read from to src </dd></dl>
+
+</div>
+</div>
+<a id="af2841bf57731c82f8164900bf3f52320"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2841bf57731c82f8164900bf3f52320">&#9670;&nbsp;</a></span>VliSerialize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* VliSerialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_big_num_str.html">BigNumStr</a> *&#160;</td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>src</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a large integer to a portable buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">dest</td><td>target buffer </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>source data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to next byte after final data written to dest </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="serialize_8h.html">serialize.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sha256_8h.html b/doc/html/sha256_8h.html
new file mode 100644
index 0000000..bbec25a
--- /dev/null
+++ b/doc/html/sha256_8h.html
@@ -0,0 +1,235 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/sha256.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sha256_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sha256.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Interface to a SHA-256 implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9c1fe69ad43d4ca74b84303a0ed64f2f"><td class="memItemLeft" align="right" valign="top"><a id="a9c1fe69ad43d4ca74b84303a0ed64f2f"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#a9c1fe69ad43d4ca74b84303a0ed64f2f">SHA256_BLOCK_SIZE</a>&#160;&#160;&#160;(64)</td></tr>
+<tr class="memdesc:a9c1fe69ad43d4ca74b84303a0ed64f2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Block size. <br /></td></tr>
+<tr class="separator:a9c1fe69ad43d4ca74b84303a0ed64f2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81efbc0fc101b06a914f7ff9e2fbc0e9"><td class="memItemLeft" align="right" valign="top"><a id="a81efbc0fc101b06a914f7ff9e2fbc0e9"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#a81efbc0fc101b06a914f7ff9e2fbc0e9">SHA256_DIGEST_SIZE</a>&#160;&#160;&#160;(32)</td></tr>
+<tr class="memdesc:a81efbc0fc101b06a914f7ff9e2fbc0e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Digest size. <br /></td></tr>
+<tr class="separator:a81efbc0fc101b06a914f7ff9e2fbc0e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0558ee82699b60132c23e0a049ab7a56"><td class="memItemLeft" align="right" valign="top"><a id="a0558ee82699b60132c23e0a049ab7a56"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#a0558ee82699b60132c23e0a049ab7a56">SHA256_STATE_BLOCKS</a>&#160;&#160;&#160;(<a class="el" href="sha256_8h.html#a81efbc0fc101b06a914f7ff9e2fbc0e9">SHA256_DIGEST_SIZE</a> / 4)</td></tr>
+<tr class="memdesc:a0558ee82699b60132c23e0a049ab7a56"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of blocks in state. <br /></td></tr>
+<tr class="separator:a0558ee82699b60132c23e0a049ab7a56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a05aad282287c226a9ab8a2eb65d10d1b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#a05aad282287c226a9ab8a2eb65d10d1b">tc_sha256_init</a> (sha256_state *s)</td></tr>
+<tr class="memdesc:a05aad282287c226a9ab8a2eb65d10d1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The SHA state. <a href="#a05aad282287c226a9ab8a2eb65d10d1b">More...</a><br /></td></tr>
+<tr class="separator:a05aad282287c226a9ab8a2eb65d10d1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab42ecba529c48040c34e70cee8d98096"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#ab42ecba529c48040c34e70cee8d98096">tc_sha256_update</a> (sha256_state *s, const uint8_t *data, size_t datalen)</td></tr>
+<tr class="memdesc:ab42ecba529c48040c34e70cee8d98096"><td class="mdescLeft">&#160;</td><td class="mdescRight">SHA256 update procedure Hashes data_length bytes addressed by data into state s. <a href="#ab42ecba529c48040c34e70cee8d98096">More...</a><br /></td></tr>
+<tr class="separator:ab42ecba529c48040c34e70cee8d98096"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8013bed3e0b388ec654f991b45c00bbf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha256_8h.html#a8013bed3e0b388ec654f991b45c00bbf">tc_sha256_final</a> (uint8_t *digest, sha256_state *s)</td></tr>
+<tr class="memdesc:a8013bed3e0b388ec654f991b45c00bbf"><td class="mdescLeft">&#160;</td><td class="mdescRight">SHA256 final procedure Inserts the completed hash computation into digest. <a href="#a8013bed3e0b388ec654f991b45c00bbf">More...</a><br /></td></tr>
+<tr class="separator:a8013bed3e0b388ec654f991b45c00bbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Interface to a SHA-256 implementation. </p>
+<p>Overview: SHA-256 is a NIST approved cryptographic hashing algorithm specified in FIPS 180. A hash algorithm maps data of arbitrary size to data of fixed length.</p>
+<p>Security: SHA-256 provides 128 bits of security against collision attacks and 256 bits of security against pre-image attacks. SHA-256 does NOT behave like a random oracle, but it can be used as one if the string being hashed is prefix-free encoded before hashing.</p>
+<p>Usage: 1) call tc_sha256_init to initialize a struct tc_sha256_state_struct before hashing a new string.</p>
+<p>2) call tc_sha256_update to hash the next string segment; tc_sha256_update can be called as many times as needed to hash all of the segments of a string; the order is important.</p>
+<p>3) call tc_sha256_final to out put the digest from a hashing operation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a8013bed3e0b388ec654f991b45c00bbf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8013bed3e0b388ec654f991b45c00bbf">&#9670;&nbsp;</a></span>tc_sha256_final()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tc_sha256_final </td>
+ <td>(</td>
+ <td class="paramtype">uint8_t *&#160;</td>
+ <td class="paramname"><em>digest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">sha256_state *&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>SHA256 final procedure Inserts the completed hash computation into digest. </p>
+<dl class="section return"><dt>Returns</dt><dd>returns 1 returns 0 if: s == NULL, s-&gt;iv == NULL, digest == NULL </dd></dl>
+<dl class="section note"><dt>Note</dt><dd>Assumes: s has been initialized by tc_sha256_init digest points to at least SHA256_DIGEST_SIZE bytes </dd></dl>
+<dl class="section warning"><dt>Warning</dt><dd>The state buffer 'leftover' is left in memory after processing If your application intends to have sensitive data in this buffer, remind to erase it after the data has been processed </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">digest</td><td>unsigned eight bit integer </td></tr>
+ <tr><td class="paramname">s</td><td>Sha256 state struct </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a05aad282287c226a9ab8a2eb65d10d1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05aad282287c226a9ab8a2eb65d10d1b">&#9670;&nbsp;</a></span>tc_sha256_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tc_sha256_init </td>
+ <td>(</td>
+ <td class="paramtype">sha256_state *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The SHA state. </p>
+<p>SHA256 initialization procedure Initializes s </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Sha256 state struct </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab42ecba529c48040c34e70cee8d98096"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab42ecba529c48040c34e70cee8d98096">&#9670;&nbsp;</a></span>tc_sha256_update()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tc_sha256_update </td>
+ <td>(</td>
+ <td class="paramtype">sha256_state *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const uint8_t *&#160;</td>
+ <td class="paramname"><em>data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>datalen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>SHA256 update procedure Hashes data_length bytes addressed by data into state s. </p>
+<dl class="section note"><dt>Note</dt><dd>Assumes s has been initialized by tc_sha256_init </dd></dl>
+<dl class="section warning"><dt>Warning</dt><dd>The state buffer 'leftover' is left in memory after processing If your application intends to have sensitive data in this buffer, remind to erase it after the data has been processed </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Sha256 state struct </td></tr>
+ <tr><td class="paramname">data</td><td>message to hash </td></tr>
+ <tr><td class="paramname">datalen</td><td>length of message to hash </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="sha256_8h.html">sha256.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sha512_8h.html b/doc/html/sha512_8h.html
new file mode 100644
index 0000000..bd51a79
--- /dev/null
+++ b/doc/html/sha512_8h.html
@@ -0,0 +1,229 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/sha512.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sha512_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sha512.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Interface to a SHA-512 implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac7071364cb94c9fcce009ba16a4bdca1"><td class="memItemLeft" align="right" valign="top"><a id="ac7071364cb94c9fcce009ba16a4bdca1"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#ac7071364cb94c9fcce009ba16a4bdca1">SHA512_BLOCK_SIZE</a>&#160;&#160;&#160;(128)</td></tr>
+<tr class="memdesc:ac7071364cb94c9fcce009ba16a4bdca1"><td class="mdescLeft">&#160;</td><td class="mdescRight">block size <br /></td></tr>
+<tr class="separator:ac7071364cb94c9fcce009ba16a4bdca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67f489f3eee39c447a6db3ba34ef75f2"><td class="memItemLeft" align="right" valign="top"><a id="a67f489f3eee39c447a6db3ba34ef75f2"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#a67f489f3eee39c447a6db3ba34ef75f2">SHA512_DIGEST_SIZE</a>&#160;&#160;&#160;(64)</td></tr>
+<tr class="memdesc:a67f489f3eee39c447a6db3ba34ef75f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">digest size <br /></td></tr>
+<tr class="separator:a67f489f3eee39c447a6db3ba34ef75f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab16e074d262ae09949e0bf222f95f5be"><td class="memItemLeft" align="right" valign="top"><a id="ab16e074d262ae09949e0bf222f95f5be"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#ab16e074d262ae09949e0bf222f95f5be">SHA512_DIGEST_WORDS</a>&#160;&#160;&#160;(8)</td></tr>
+<tr class="memdesc:ab16e074d262ae09949e0bf222f95f5be"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of words in SHA state <br /></td></tr>
+<tr class="separator:ab16e074d262ae09949e0bf222f95f5be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3cf87b13e209264d7aba7d708560dfde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#a3cf87b13e209264d7aba7d708560dfde">tinysha512_init</a> (sha512_state *s)</td></tr>
+<tr class="memdesc:a3cf87b13e209264d7aba7d708560dfde"><td class="mdescLeft">&#160;</td><td class="mdescRight">The SHA state. <a href="#a3cf87b13e209264d7aba7d708560dfde">More...</a><br /></td></tr>
+<tr class="separator:a3cf87b13e209264d7aba7d708560dfde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47108f5097342900a4a07f52b6204082"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#a47108f5097342900a4a07f52b6204082">tinysha512_update</a> (sha512_state *s, void const *data, size_t data_length)</td></tr>
+<tr class="memdesc:a47108f5097342900a4a07f52b6204082"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hashes data into state using SHA-512. <a href="#a47108f5097342900a4a07f52b6204082">More...</a><br /></td></tr>
+<tr class="separator:a47108f5097342900a4a07f52b6204082"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace9440a26ec431a1596f40284cc8d5ee"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sha512_8h.html#ace9440a26ec431a1596f40284cc8d5ee">tinysha512_final</a> (unsigned char *digest, sha512_state *s)</td></tr>
+<tr class="memdesc:ace9440a26ec431a1596f40284cc8d5ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the SHA-512 hash in the digest buffer. <a href="#ace9440a26ec431a1596f40284cc8d5ee">More...</a><br /></td></tr>
+<tr class="separator:ace9440a26ec431a1596f40284cc8d5ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Interface to a SHA-512 implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ace9440a26ec431a1596f40284cc8d5ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace9440a26ec431a1596f40284cc8d5ee">&#9670;&nbsp;</a></span>tinysha512_final()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha512_final </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char *&#160;</td>
+ <td class="paramname"><em>digest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">sha512_state *&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Computes the SHA-512 hash in the digest buffer. </p>
+<dl class="section note"><dt>Note</dt><dd>Assumes SHA512_DIGEST_SIZE bytes are available to accept the digest.</dd></dl>
+<dl class="section warning"><dt>Warning</dt><dd>The state buffer 'leftover' is left in memory after processing. If your application intends to have sensitive data in this buffer, remember to erase it after the data has been processed</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">digest</td><td>The computed digest. Must be non-null or behavior is undefined.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">s</td><td>The hash state. Must be non-null or behavior is undefined. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3cf87b13e209264d7aba7d708560dfde"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3cf87b13e209264d7aba7d708560dfde">&#9670;&nbsp;</a></span>tinysha512_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha512_init </td>
+ <td>(</td>
+ <td class="paramtype">sha512_state *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The SHA state. </p>
+<p>Initializes the hash state</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">s</td><td>The hash state to initialize. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a47108f5097342900a4a07f52b6204082"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a47108f5097342900a4a07f52b6204082">&#9670;&nbsp;</a></span>tinysha512_update()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tinysha512_update </td>
+ <td>(</td>
+ <td class="paramtype">sha512_state *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void const *&#160;</td>
+ <td class="paramname"><em>data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>data_length</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Hashes data into state using SHA-512. </p>
+<dl class="section warning"><dt>Warning</dt><dd>The state buffer 'leftover' is left in memory after processing. If your application intends to have sensitive data in this buffer, remember to erase it after the data has been processed</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in,out]</td><td class="paramname">s</td><td>The hash state. Must be non-null or behavior is undefined.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">data</td><td>The data to hash into s.</td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">data_length</td><td>The size of data in bytes. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="sha512_8h.html">sha512.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sign_8c.html b/doc/html/sign_8c.html
new file mode 100644
index 0000000..ebd162c
--- /dev/null
+++ b/doc/html/sign_8c.html
@@ -0,0 +1,146 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/sign.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sign_8c.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sign.c File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Tpm2Sign implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="sign_8h.html">epid/member/tpm2/sign.h</a>&quot;</code><br />
+<code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;tss2/tss.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;epid/common/src/epid2params.h&quot;</code><br />
+<code>#include &quot;epid/common/src/hashsize.h&quot;</code><br />
+<code>#include &quot;epid/common/src/memory.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="getrandom_8h.html">epid/member/tpm2/getrandom.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="conversion_8h.html">epid/member/tpm2/ibm_tss/conversion.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="printtss_8h.html">epid/member/tpm2/ibm_tss/printtss.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="state_8h.html">epid/member/tpm2/ibm_tss/state.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sign_8c.html#a5638f861b82f1746ea1af0b384ef8ff1">BREAK_ON_EPID_ERROR</a>(ret)</td></tr>
+<tr class="memdesc:a5638f861b82f1746ea1af0b384ef8ff1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle Intel(R) EPID Error with Break. <a href="#a5638f861b82f1746ea1af0b384ef8ff1">More...</a><br /></td></tr>
+<tr class="separator:a5638f861b82f1746ea1af0b384ef8ff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="memItemLeft" align="right" valign="top"><a id="aa6b8f3261ae9e2e1043380c192f7b5f0"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sign_8c.html#aa6b8f3261ae9e2e1043380c192f7b5f0">BIT7</a>&#160;&#160;&#160;0x080</td></tr>
+<tr class="memdesc:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit 7 binary mask. <br /></td></tr>
+<tr class="separator:aa6b8f3261ae9e2e1043380c192f7b5f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="memItemLeft" align="right" valign="top"><a id="a5c80fc0389d18e76cf9f43cfe13b63c7"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sign_8c.html#a5c80fc0389d18e76cf9f43cfe13b63c7">BITS0500</a>&#160;&#160;&#160;0x3f</td></tr>
+<tr class="memdesc:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binary 00011111. <br /></td></tr>
+<tr class="separator:a5c80fc0389d18e76cf9f43cfe13b63c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">Tpm2Sign</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, void const *digest, size_t digest_len, uint16_t counter, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *k, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *s)</td></tr>
+<tr class="memdesc:ga035c8ffba3182ba75a38131e23bb31c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Sign TPM command. <a href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">More...</a><br /></td></tr>
+<tr class="separator:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3735163276efa0da4b793ba935513bb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">Tpm2ReleaseCounter</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint16_t counter)</td></tr>
+<tr class="memdesc:gac3735163276efa0da4b793ba935513bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Erases random r value assosiated with counter. <a href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">More...</a><br /></td></tr>
+<tr class="separator:gac3735163276efa0da4b793ba935513bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Tpm2Sign implementation. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a5638f861b82f1746ea1af0b384ef8ff1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5638f861b82f1746ea1af0b384ef8ff1">&#9670;&nbsp;</a></span>BREAK_ON_EPID_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define BREAK_ON_EPID_ERROR</td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname">ret</td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a> != (ret)) { \</div><div class="line"> break; \</div><div class="line"> }</div><div class="ttc" id="group___error_codes_html_ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9"><div class="ttname"><a href="group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a8a6861e14322ca9193498ffc955537f9">kEpidNoErr</a></div><div class="ttdoc">no error </div><div class="ttdef"><b>Definition:</b> errors.h:41</div></div>
+</div><!-- fragment -->
+<p>Handle Intel(R) EPID Error with Break. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="sign_8c.html">sign.c</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sign_8h.html b/doc/html/sign_8h.html
new file mode 100644
index 0000000..2de45a3
--- /dev/null
+++ b/doc/html/sign_8h.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/sign.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sign_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sign.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK TPM Sign API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">Tpm2Sign</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, void const *digest, size_t digest_len, uint16_t counter, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *k, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *s)</td></tr>
+<tr class="memdesc:ga035c8ffba3182ba75a38131e23bb31c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs TPM2_Sign TPM command. <a href="group___tpm2_module.html#ga035c8ffba3182ba75a38131e23bb31c7">More...</a><br /></td></tr>
+<tr class="separator:ga035c8ffba3182ba75a38131e23bb31c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3735163276efa0da4b793ba935513bb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">Tpm2ReleaseCounter</a> (<a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a> *ctx, uint16_t counter)</td></tr>
+<tr class="memdesc:gac3735163276efa0da4b793ba935513bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Erases random r value assosiated with counter. <a href="group___tpm2_module.html#gac3735163276efa0da4b793ba935513bb">More...</a><br /></td></tr>
+<tr class="separator:gac3735163276efa0da4b793ba935513bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK TPM Sign API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="sign_8h.html">sign.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sign__verify__tutorial_8dox.html b/doc/html/sign__verify__tutorial_8dox.html
new file mode 100644
index 0000000..a05f82f
--- /dev/null
+++ b/doc/html/sign__verify__tutorial_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/sign_verify_tutorial.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('sign__verify__tutorial_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/sign_verify_tutorial.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="sign__verify__tutorial_8dox.html">sign_verify_tutorial.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/signmsg__walkthrough_8dox.html b/doc/html/signmsg__walkthrough_8dox.html
new file mode 100644
index 0000000..87c78c2
--- /dev/null
+++ b/doc/html/signmsg__walkthrough_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/signmsg_walkthrough.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('signmsg__walkthrough_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/signmsg_walkthrough.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="signmsg__walkthrough_8dox.html">signmsg_walkthrough.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/software__member_8h.html b/doc/html/software__member_8h.html
new file mode 100644
index 0000000..73fcb33
--- /dev/null
+++ b/doc/html/software__member_8h.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/software_member.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('software__member_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> </div>
+ <div class="headertitle">
+<div class="title">software_member.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Member creation parameters for software only implementation.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_params.html">MemberParams</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Software only specific member parameters. <a href="struct_member_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Member creation parameters for software only implementation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="software__member_8h.html">software_member.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/splitbar.png b/doc/html/splitbar.png
new file mode 100644
index 0000000..fe895f2
--- /dev/null
+++ b/doc/html/splitbar.png
Binary files differ
diff --git a/doc/html/state_8h.html b/doc/html/state_8h.html
new file mode 100644
index 0000000..3a288ea
--- /dev/null
+++ b/doc/html/state_8h.html
@@ -0,0 +1,95 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm2/ibm_tss/state.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('state_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> </div>
+ <div class="headertitle">
+<div class="title">state.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM internal state.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+<code>#include &quot;tss2/TPM_Types.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">TPM TSS context definition. <a href="struct_tpm2_ctx.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM internal state. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_0d59f1b8006345e373e07b4691e0da76.html">tpm2</a></li><li class="navelem"><a class="el" href="dir_b7525369f2fbc378c6814b573b9a2bc3.html">ibm_tss</a></li><li class="navelem"><a class="el" href="state_8h.html">state.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/stdtypes_8h.html b/doc/html/stdtypes_8h.html
new file mode 100644
index 0000000..982cafe
--- /dev/null
+++ b/doc/html/stdtypes_8h.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/stdtypes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('stdtypes_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle">
+<div class="title">stdtypes.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>C99 standard data types.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aeaff0db5524987a2f50d71ac0162ceb2"><td class="memItemLeft" align="right" valign="top"><a id="aeaff0db5524987a2f50d71ac0162ceb2"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stdtypes_8h.html#aeaff0db5524987a2f50d71ac0162ceb2">_Bool</a>&#160;&#160;&#160;char</td></tr>
+<tr class="memdesc:aeaff0db5524987a2f50d71ac0162ceb2"><td class="mdescLeft">&#160;</td><td class="mdescRight">C99 standard name for bool. <br /></td></tr>
+<tr class="separator:aeaff0db5524987a2f50d71ac0162ceb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41f9c5fb8b08eb5dc3edce4dcb37fee7"><td class="memItemLeft" align="right" valign="top"><a id="a41f9c5fb8b08eb5dc3edce4dcb37fee7"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stdtypes_8h.html#a41f9c5fb8b08eb5dc3edce4dcb37fee7">true</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memdesc:a41f9c5fb8b08eb5dc3edce4dcb37fee7"><td class="mdescLeft">&#160;</td><td class="mdescRight">integer constant 1 <br /></td></tr>
+<tr class="separator:a41f9c5fb8b08eb5dc3edce4dcb37fee7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65e9886d74aaee76545e83dd09011727"><td class="memItemLeft" align="right" valign="top"><a id="a65e9886d74aaee76545e83dd09011727"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stdtypes_8h.html#a65e9886d74aaee76545e83dd09011727">false</a>&#160;&#160;&#160;0</td></tr>
+<tr class="memdesc:a65e9886d74aaee76545e83dd09011727"><td class="mdescLeft">&#160;</td><td class="mdescRight">integer constant 0 <br /></td></tr>
+<tr class="separator:a65e9886d74aaee76545e83dd09011727"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ad5c9d4ba3dc37783a528b0925dc981a0"><td class="memItemLeft" align="right" valign="top"><a id="ad5c9d4ba3dc37783a528b0925dc981a0"></a>
+typedef char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a></td></tr>
+<tr class="memdesc:ad5c9d4ba3dc37783a528b0925dc981a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Boolean type. <br /></td></tr>
+<tr class="separator:ad5c9d4ba3dc37783a528b0925dc981a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>C99 standard data types. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="stdtypes_8h.html">stdtypes.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_basic_signature.html b/doc/html/struct_basic_signature.html
new file mode 100644
index 0000000..ebd0fc0
--- /dev/null
+++ b/doc/html/struct_basic_signature.html
@@ -0,0 +1,128 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: BasicSignature Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_basic_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">BasicSignature Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 basic signature.
+ <a href="struct_basic_signature.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ae90cb6af66b010ae39913f033c1e65ac"><td class="memItemLeft" align="right" valign="top"><a id="ae90cb6af66b010ae39913f033c1e65ac"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#ae90cb6af66b010ae39913f033c1e65ac">B</a></td></tr>
+<tr class="memdesc:ae90cb6af66b010ae39913f033c1e65ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:ae90cb6af66b010ae39913f033c1e65ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0078cc83ecf6c7e31f96b7d44aa60e21"><td class="memItemLeft" align="right" valign="top"><a id="a0078cc83ecf6c7e31f96b7d44aa60e21"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a0078cc83ecf6c7e31f96b7d44aa60e21">K</a></td></tr>
+<tr class="memdesc:a0078cc83ecf6c7e31f96b7d44aa60e21"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a0078cc83ecf6c7e31f96b7d44aa60e21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a730f74d85cfb4fa4089d43c87b97a624"><td class="memItemLeft" align="right" valign="top"><a id="a730f74d85cfb4fa4089d43c87b97a624"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a730f74d85cfb4fa4089d43c87b97a624">T</a></td></tr>
+<tr class="memdesc:a730f74d85cfb4fa4089d43c87b97a624"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a730f74d85cfb4fa4089d43c87b97a624"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4daa94db5068db3f10960f3dd178d603"><td class="memItemLeft" align="right" valign="top"><a id="a4daa94db5068db3f10960f3dd178d603"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a4daa94db5068db3f10960f3dd178d603">c</a></td></tr>
+<tr class="memdesc:a4daa94db5068db3f10960f3dd178d603"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a4daa94db5068db3f10960f3dd178d603"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e8ea6a2cd3af10e9b59d96d7d06bc69"><td class="memItemLeft" align="right" valign="top"><a id="a0e8ea6a2cd3af10e9b59d96d7d06bc69"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a0e8ea6a2cd3af10e9b59d96d7d06bc69">sx</a></td></tr>
+<tr class="memdesc:a0e8ea6a2cd3af10e9b59d96d7d06bc69"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a0e8ea6a2cd3af10e9b59d96d7d06bc69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79d8dec8c5da176e497abf22e4c43adb"><td class="memItemLeft" align="right" valign="top"><a id="a79d8dec8c5da176e497abf22e4c43adb"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a79d8dec8c5da176e497abf22e4c43adb">sf</a></td></tr>
+<tr class="memdesc:a79d8dec8c5da176e497abf22e4c43adb"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a79d8dec8c5da176e497abf22e4c43adb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69115a4776d15b48411dd6c3a76d0f3d"><td class="memItemLeft" align="right" valign="top"><a id="a69115a4776d15b48411dd6c3a76d0f3d"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a69115a4776d15b48411dd6c3a76d0f3d">sa</a></td></tr>
+<tr class="memdesc:a69115a4776d15b48411dd6c3a76d0f3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a69115a4776d15b48411dd6c3a76d0f3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91daebc5b577688afeed2a7ee7913245"><td class="memItemLeft" align="right" valign="top"><a id="a91daebc5b577688afeed2a7ee7913245"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html#a91daebc5b577688afeed2a7ee7913245">sb</a></td></tr>
+<tr class="memdesc:a91daebc5b577688afeed2a7ee7913245"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a91daebc5b577688afeed2a7ee7913245"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 basic signature. </p>
+<p>Basic signature: (B, K, T, c, sx, sf, sa, sb) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_basic_signature.html">BasicSignature</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_big_num_str.html b/doc/html/struct_big_num_str.html
new file mode 100644
index 0000000..3d9412b
--- /dev/null
+++ b/doc/html/struct_big_num_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: BigNumStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_big_num_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">BigNumStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized BigNum.
+ <a href="struct_big_num_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a442dcf33889b4f85c5b1228d2c8e6838"><td class="memItemLeft" align="right" valign="top"><a id="a442dcf33889b4f85c5b1228d2c8e6838"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_big_num_str.html#a442dcf33889b4f85c5b1228d2c8e6838">data</a></td></tr>
+<tr class="memdesc:a442dcf33889b4f85c5b1228d2c8e6838"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit octet string <br /></td></tr>
+<tr class="separator:a442dcf33889b4f85c5b1228d2c8e6838"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized BigNum. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_big_num_str.html">BigNumStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_compressed_priv_key.html b/doc/html/struct_compressed_priv_key.html
new file mode 100644
index 0000000..40835d9
--- /dev/null
+++ b/doc/html/struct_compressed_priv_key.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: CompressedPrivKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_compressed_priv_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">CompressedPrivKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Compressed private key.
+ <a href="struct_compressed_priv_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac6689899f1d9a6a8c5e4915563679840"><td class="memItemLeft" align="right" valign="top"><a id="ac6689899f1d9a6a8c5e4915563679840"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_compressed_priv_key.html#ac6689899f1d9a6a8c5e4915563679840">gid</a></td></tr>
+<tr class="memdesc:ac6689899f1d9a6a8c5e4915563679840"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ac6689899f1d9a6a8c5e4915563679840"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b0535f0567eb0e48f799d27991d0f66"><td class="memItemLeft" align="right" valign="top"><a id="a0b0535f0567eb0e48f799d27991d0f66"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_compressed_priv_key.html#a0b0535f0567eb0e48f799d27991d0f66">ax</a></td></tr>
+<tr class="memdesc:a0b0535f0567eb0e48f799d27991d0f66"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a0b0535f0567eb0e48f799d27991d0f66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54b9af7699f517bbaef3d52d03e3fed8"><td class="memItemLeft" align="right" valign="top"><a id="a54b9af7699f517bbaef3d52d03e3fed8"></a>
+<a class="el" href="group___epid_types.html#ga888541b8148df69c634a92c64ed51317">Seed</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_compressed_priv_key.html#a54b9af7699f517bbaef3d52d03e3fed8">seed</a></td></tr>
+<tr class="memdesc:a54b9af7699f517bbaef3d52d03e3fed8"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit rekey seed <br /></td></tr>
+<tr class="separator:a54b9af7699f517bbaef3d52d03e3fed8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Compressed private key. </p>
+<p>Compressed Private key: (gid, A.x, seed) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecc_point_fq.html b/doc/html/struct_ecc_point_fq.html
new file mode 100644
index 0000000..8a7d63f
--- /dev/null
+++ b/doc/html/struct_ecc_point_fq.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EccPointFq Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecc_point_fq.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EccPointFq Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Point in EFq.
+ <a href="struct_ecc_point_fq.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a50491ef33f641fa3e81d58bdc906b258"><td class="memItemLeft" align="right" valign="top"><a id="a50491ef33f641fa3e81d58bdc906b258"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq.html#a50491ef33f641fa3e81d58bdc906b258">x</a></td></tr>
+<tr class="memdesc:a50491ef33f641fa3e81d58bdc906b258"><td class="mdescLeft">&#160;</td><td class="mdescRight">x coordinate <br /></td></tr>
+<tr class="separator:a50491ef33f641fa3e81d58bdc906b258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd3c36cb29db82a73ba89e9e15739b5a"><td class="memItemLeft" align="right" valign="top"><a id="abd3c36cb29db82a73ba89e9e15739b5a"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq.html#abd3c36cb29db82a73ba89e9e15739b5a">y</a></td></tr>
+<tr class="memdesc:abd3c36cb29db82a73ba89e9e15739b5a"><td class="mdescLeft">&#160;</td><td class="mdescRight">y coordinate <br /></td></tr>
+<tr class="separator:abd3c36cb29db82a73ba89e9e15739b5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Point in EFq. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecc_point_fq.html">EccPointFq</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecc_point_fq2.html b/doc/html/struct_ecc_point_fq2.html
new file mode 100644
index 0000000..acf3c59
--- /dev/null
+++ b/doc/html/struct_ecc_point_fq2.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EccPointFq2 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecc_point_fq2.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EccPointFq2 Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Point in EFq2.
+ <a href="struct_ecc_point_fq2.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac1c2f9e66988d12c61bd1ffd4975eb7d"><td class="memItemLeft" align="right" valign="top"><a id="ac1c2f9e66988d12c61bd1ffd4975eb7d"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq2.html#ac1c2f9e66988d12c61bd1ffd4975eb7d">x</a></td></tr>
+<tr class="memdesc:ac1c2f9e66988d12c61bd1ffd4975eb7d"><td class="mdescLeft">&#160;</td><td class="mdescRight">x coordinate <br /></td></tr>
+<tr class="separator:ac1c2f9e66988d12c61bd1ffd4975eb7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a137a9467dc77df97319c88880d13ea48"><td class="memItemLeft" align="right" valign="top"><a id="a137a9467dc77df97319c88880d13ea48"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_fq2.html#a137a9467dc77df97319c88880d13ea48">y</a></td></tr>
+<tr class="memdesc:a137a9467dc77df97319c88880d13ea48"><td class="mdescLeft">&#160;</td><td class="mdescRight">y coordinate <br /></td></tr>
+<tr class="separator:a137a9467dc77df97319c88880d13ea48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Point in EFq2. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecc_point_fq2.html">EccPointFq2</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecc_point_jacobi_fq.html b/doc/html/struct_ecc_point_jacobi_fq.html
new file mode 100644
index 0000000..3597c39
--- /dev/null
+++ b/doc/html/struct_ecc_point_jacobi_fq.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EccPointJacobiFq Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecc_point_jacobi_fq.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EccPointJacobiFq Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of EFq in Jacobi format.
+ <a href="struct_ecc_point_jacobi_fq.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a281019c17dd470ab6b5a763efc23fa1b"><td class="memItemLeft" align="right" valign="top"><a id="a281019c17dd470ab6b5a763efc23fa1b"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq.html#a281019c17dd470ab6b5a763efc23fa1b">X</a></td></tr>
+<tr class="memdesc:a281019c17dd470ab6b5a763efc23fa1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">x coordinate <br /></td></tr>
+<tr class="separator:a281019c17dd470ab6b5a763efc23fa1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad86b6242f7c242107f7af9a37fad2a74"><td class="memItemLeft" align="right" valign="top"><a id="ad86b6242f7c242107f7af9a37fad2a74"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq.html#ad86b6242f7c242107f7af9a37fad2a74">Y</a></td></tr>
+<tr class="memdesc:ad86b6242f7c242107f7af9a37fad2a74"><td class="mdescLeft">&#160;</td><td class="mdescRight">y coordinate <br /></td></tr>
+<tr class="separator:ad86b6242f7c242107f7af9a37fad2a74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe6154e547f9c3908a8ce801a14afeca"><td class="memItemLeft" align="right" valign="top"><a id="afe6154e547f9c3908a8ce801a14afeca"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq.html#afe6154e547f9c3908a8ce801a14afeca">Z</a></td></tr>
+<tr class="memdesc:afe6154e547f9c3908a8ce801a14afeca"><td class="mdescLeft">&#160;</td><td class="mdescRight">z coordinate <br /></td></tr>
+<tr class="separator:afe6154e547f9c3908a8ce801a14afeca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of EFq in Jacobi format. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecc_point_jacobi_fq.html">EccPointJacobiFq</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecc_point_jacobi_fq2.html b/doc/html/struct_ecc_point_jacobi_fq2.html
new file mode 100644
index 0000000..45cadd1
--- /dev/null
+++ b/doc/html/struct_ecc_point_jacobi_fq2.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EccPointJacobiFq2 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecc_point_jacobi_fq2.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EccPointJacobiFq2 Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of EFq2 in Jacobi format.
+ <a href="struct_ecc_point_jacobi_fq2.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aa540cd77c703ba538b245897009076a7"><td class="memItemLeft" align="right" valign="top"><a id="aa540cd77c703ba538b245897009076a7"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq2.html#aa540cd77c703ba538b245897009076a7">X</a></td></tr>
+<tr class="memdesc:aa540cd77c703ba538b245897009076a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">x coordinate <br /></td></tr>
+<tr class="separator:aa540cd77c703ba538b245897009076a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc2fa4757b5091e7927daae3452ee739"><td class="memItemLeft" align="right" valign="top"><a id="adc2fa4757b5091e7927daae3452ee739"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq2.html#adc2fa4757b5091e7927daae3452ee739">Y</a></td></tr>
+<tr class="memdesc:adc2fa4757b5091e7927daae3452ee739"><td class="mdescLeft">&#160;</td><td class="mdescRight">y coordinate <br /></td></tr>
+<tr class="separator:adc2fa4757b5091e7927daae3452ee739"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea8a3a5b2bd2fce104e75cfe21615619"><td class="memItemLeft" align="right" valign="top"><a id="aea8a3a5b2bd2fce104e75cfe21615619"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecc_point_jacobi_fq2.html#aea8a3a5b2bd2fce104e75cfe21615619">Z</a></td></tr>
+<tr class="memdesc:aea8a3a5b2bd2fce104e75cfe21615619"><td class="mdescLeft">&#160;</td><td class="mdescRight">z coordinate <br /></td></tr>
+<tr class="separator:aea8a3a5b2bd2fce104e75cfe21615619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of EFq2 in Jacobi format. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecc_point_jacobi_fq2.html">EccPointJacobiFq2</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecdsa_private_key.html b/doc/html/struct_ecdsa_private_key.html
new file mode 100644
index 0000000..89f1e48
--- /dev/null
+++ b/doc/html/struct_ecdsa_private_key.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EcdsaPrivateKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecdsa_private_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EcdsaPrivateKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>ECDSA Private Key.
+ <a href="struct_ecdsa_private_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a97efee9b4079f95d94a104f9a6d8c96d"><td class="memItemLeft" align="right" valign="top"><a id="a97efee9b4079f95d94a104f9a6d8c96d"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_private_key.html#a97efee9b4079f95d94a104f9a6d8c96d">data</a></td></tr>
+<tr class="memdesc:a97efee9b4079f95d94a104f9a6d8c96d"><td class="mdescLeft">&#160;</td><td class="mdescRight">256-bit integer <br /></td></tr>
+<tr class="separator:a97efee9b4079f95d94a104f9a6d8c96d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ECDSA Private Key. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecdsa_public_key.html b/doc/html/struct_ecdsa_public_key.html
new file mode 100644
index 0000000..f71d222
--- /dev/null
+++ b/doc/html/struct_ecdsa_public_key.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EcdsaPublicKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecdsa_public_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EcdsaPublicKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>ECDSA Public Key.
+ <a href="struct_ecdsa_public_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a37c51614faf022eec491b4de8f3a13e1"><td class="memItemLeft" align="right" valign="top"><a id="a37c51614faf022eec491b4de8f3a13e1"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_public_key.html#a37c51614faf022eec491b4de8f3a13e1">x</a></td></tr>
+<tr class="memdesc:a37c51614faf022eec491b4de8f3a13e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">256-bit integer <br /></td></tr>
+<tr class="separator:a37c51614faf022eec491b4de8f3a13e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4503c4613386cbc78add1dc245c99284"><td class="memItemLeft" align="right" valign="top"><a id="a4503c4613386cbc78add1dc245c99284"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_public_key.html#a4503c4613386cbc78add1dc245c99284">y</a></td></tr>
+<tr class="memdesc:a4503c4613386cbc78add1dc245c99284"><td class="mdescLeft">&#160;</td><td class="mdescRight">256-bit integer <br /></td></tr>
+<tr class="separator:a4503c4613386cbc78add1dc245c99284"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ECDSA Public Key. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_ecdsa_signature.html b/doc/html/struct_ecdsa_signature.html
new file mode 100644
index 0000000..f910885
--- /dev/null
+++ b/doc/html/struct_ecdsa_signature.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EcdsaSignature Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_ecdsa_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EcdsaSignature Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>ECDSA Signature using NIST 256-bit curve secp256r1.
+ <a href="struct_ecdsa_signature.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a64b623605a55a267a36df18f29142d0d"><td class="memItemLeft" align="right" valign="top"><a id="a64b623605a55a267a36df18f29142d0d"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_signature.html#a64b623605a55a267a36df18f29142d0d">x</a></td></tr>
+<tr class="memdesc:a64b623605a55a267a36df18f29142d0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">256-bit integer <br /></td></tr>
+<tr class="separator:a64b623605a55a267a36df18f29142d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2efd6bf37b12f35135bf325fa491b029"><td class="memItemLeft" align="right" valign="top"><a id="a2efd6bf37b12f35135bf325fa491b029"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_signature.html#a2efd6bf37b12f35135bf325fa491b029">y</a></td></tr>
+<tr class="memdesc:a2efd6bf37b12f35135bf325fa491b029"><td class="mdescLeft">&#160;</td><td class="mdescRight">256-bit integer <br /></td></tr>
+<tr class="separator:a2efd6bf37b12f35135bf325fa491b029"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ECDSA Signature using NIST 256-bit curve secp256r1. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_basic_signature.html b/doc/html/struct_epid11_basic_signature.html
new file mode 100644
index 0000000..7cf9294
--- /dev/null
+++ b/doc/html/struct_epid11_basic_signature.html
@@ -0,0 +1,148 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11BasicSignature Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_basic_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11BasicSignature Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 basic signature.
+ <a href="struct_epid11_basic_signature.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a27fd7ae99d1ada652e21e7508a467c0b"><td class="memItemLeft" align="right" valign="top"><a id="a27fd7ae99d1ada652e21e7508a467c0b"></a>
+<a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a27fd7ae99d1ada652e21e7508a467c0b">B</a></td></tr>
+<tr class="memdesc:a27fd7ae99d1ada652e21e7508a467c0b"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G3 <br /></td></tr>
+<tr class="separator:a27fd7ae99d1ada652e21e7508a467c0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5882fcbfd272774e12e50a2d77f0b139"><td class="memItemLeft" align="right" valign="top"><a id="a5882fcbfd272774e12e50a2d77f0b139"></a>
+<a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a5882fcbfd272774e12e50a2d77f0b139">K</a></td></tr>
+<tr class="memdesc:a5882fcbfd272774e12e50a2d77f0b139"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G3 <br /></td></tr>
+<tr class="separator:a5882fcbfd272774e12e50a2d77f0b139"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58b058a9c5119a240177acfade328b3b"><td class="memItemLeft" align="right" valign="top"><a id="a58b058a9c5119a240177acfade328b3b"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a58b058a9c5119a240177acfade328b3b">T1</a></td></tr>
+<tr class="memdesc:a58b058a9c5119a240177acfade328b3b"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a58b058a9c5119a240177acfade328b3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a267cf4e17d10584736b0c38f3668d822"><td class="memItemLeft" align="right" valign="top"><a id="a267cf4e17d10584736b0c38f3668d822"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a267cf4e17d10584736b0c38f3668d822">T2</a></td></tr>
+<tr class="memdesc:a267cf4e17d10584736b0c38f3668d822"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a267cf4e17d10584736b0c38f3668d822"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cc6efcd3d7270022779bd16776168ed"><td class="memItemLeft" align="right" valign="top"><a id="a9cc6efcd3d7270022779bd16776168ed"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a9cc6efcd3d7270022779bd16776168ed">c</a></td></tr>
+<tr class="memdesc:a9cc6efcd3d7270022779bd16776168ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">a 256-bit integer <br /></td></tr>
+<tr class="separator:a9cc6efcd3d7270022779bd16776168ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af18200712d2cf3ed3ccaee328e8a4e0f"><td class="memItemLeft" align="right" valign="top"><a id="af18200712d2cf3ed3ccaee328e8a4e0f"></a>
+<a class="el" href="struct_oct_str80.html">OctStr80</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#af18200712d2cf3ed3ccaee328e8a4e0f">nd</a></td></tr>
+<tr class="memdesc:af18200712d2cf3ed3ccaee328e8a4e0f"><td class="mdescLeft">&#160;</td><td class="mdescRight">an 80-bit integer <br /></td></tr>
+<tr class="separator:af18200712d2cf3ed3ccaee328e8a4e0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2718346665210b7e26521bf4a15cb3bd"><td class="memItemLeft" align="right" valign="top"><a id="a2718346665210b7e26521bf4a15cb3bd"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a2718346665210b7e26521bf4a15cb3bd">sx</a></td></tr>
+<tr class="memdesc:a2718346665210b7e26521bf4a15cb3bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a2718346665210b7e26521bf4a15cb3bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a911441845fc9b82d514133371b5ba87c"><td class="memItemLeft" align="right" valign="top"><a id="a911441845fc9b82d514133371b5ba87c"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a911441845fc9b82d514133371b5ba87c">sy</a></td></tr>
+<tr class="memdesc:a911441845fc9b82d514133371b5ba87c"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a911441845fc9b82d514133371b5ba87c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae17b45194997a6fa13c6014a51ec711c"><td class="memItemLeft" align="right" valign="top"><a id="ae17b45194997a6fa13c6014a51ec711c"></a>
+<a class="el" href="struct_oct_str600.html">OctStr600</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#ae17b45194997a6fa13c6014a51ec711c">sf</a></td></tr>
+<tr class="memdesc:ae17b45194997a6fa13c6014a51ec711c"><td class="mdescLeft">&#160;</td><td class="mdescRight">a 593-bit integer <br /></td></tr>
+<tr class="separator:ae17b45194997a6fa13c6014a51ec711c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb221cf52bc2b1a9bf6e0a9779bfd20f"><td class="memItemLeft" align="right" valign="top"><a id="aeb221cf52bc2b1a9bf6e0a9779bfd20f"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#aeb221cf52bc2b1a9bf6e0a9779bfd20f">sa</a></td></tr>
+<tr class="memdesc:aeb221cf52bc2b1a9bf6e0a9779bfd20f"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:aeb221cf52bc2b1a9bf6e0a9779bfd20f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29a700f3bec251600e18b2292081df4b"><td class="memItemLeft" align="right" valign="top"><a id="a29a700f3bec251600e18b2292081df4b"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a29a700f3bec251600e18b2292081df4b">sb</a></td></tr>
+<tr class="memdesc:a29a700f3bec251600e18b2292081df4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a29a700f3bec251600e18b2292081df4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a73fc922f69e2499643dd4c53d0d42d"><td class="memItemLeft" align="right" valign="top"><a id="a1a73fc922f69e2499643dd4c53d0d42d"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#a1a73fc922f69e2499643dd4c53d0d42d">salpha</a></td></tr>
+<tr class="memdesc:a1a73fc922f69e2499643dd4c53d0d42d"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a1a73fc922f69e2499643dd4c53d0d42d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe28bad6328f81e6f7af011cc96ac2e5"><td class="memItemLeft" align="right" valign="top"><a id="afe28bad6328f81e6f7af011cc96ac2e5"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_basic_signature.html#afe28bad6328f81e6f7af011cc96ac2e5">sbeta</a></td></tr>
+<tr class="memdesc:afe28bad6328f81e6f7af011cc96ac2e5"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:afe28bad6328f81e6f7af011cc96ac2e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 basic signature. </p>
+<p>Basic signature: (B, K, T1, T2, c, nd, sx, sy, sf, sa, sb, salpha, sbeta) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_g2_elem_str.html b/doc/html/struct_epid11_g2_elem_str.html
new file mode 100644
index 0000000..6d440cc
--- /dev/null
+++ b/doc/html/struct_epid11_g2_elem_str.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11G2ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_g2_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11G2ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Intel(R) EPID 1.1 G2 element.
+ <a href="struct_epid11_g2_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af28558484298f4f56377ededf57a4a04"><td class="memItemLeft" align="right" valign="top"><a id="af28558484298f4f56377ededf57a4a04"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_g2_elem_str.html#af28558484298f4f56377ededf57a4a04">x</a> [3]</td></tr>
+<tr class="memdesc:af28558484298f4f56377ededf57a4a04"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:af28558484298f4f56377ededf57a4a04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e8984e479bcbe8bd36c65e80c340032"><td class="memItemLeft" align="right" valign="top"><a id="a9e8984e479bcbe8bd36c65e80c340032"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_g2_elem_str.html#a9e8984e479bcbe8bd36c65e80c340032">y</a> [3]</td></tr>
+<tr class="memdesc:a9e8984e479bcbe8bd36c65e80c340032"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a9e8984e479bcbe8bd36c65e80c340032"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Intel(R) EPID 1.1 G2 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_group_pub_key.html b/doc/html/struct_epid11_group_pub_key.html
new file mode 100644
index 0000000..e2e95ba
--- /dev/null
+++ b/doc/html/struct_epid11_group_pub_key.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11GroupPubKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_group_pub_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11GroupPubKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 group public key.
+ <a href="struct_epid11_group_pub_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a964344b3c595bdd585bb9b5d9d0ea762"><td class="memItemLeft" align="right" valign="top"><a id="a964344b3c595bdd585bb9b5d9d0ea762"></a>
+<a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html#a964344b3c595bdd585bb9b5d9d0ea762">gid</a></td></tr>
+<tr class="memdesc:a964344b3c595bdd585bb9b5d9d0ea762"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:a964344b3c595bdd585bb9b5d9d0ea762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36f688472e2655052d485eac67d8c362"><td class="memItemLeft" align="right" valign="top"><a id="a36f688472e2655052d485eac67d8c362"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html#a36f688472e2655052d485eac67d8c362">h1</a></td></tr>
+<tr class="memdesc:a36f688472e2655052d485eac67d8c362"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a36f688472e2655052d485eac67d8c362"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa724e9d2f0cb6019c05547d76a13b72a"><td class="memItemLeft" align="right" valign="top"><a id="aa724e9d2f0cb6019c05547d76a13b72a"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html#aa724e9d2f0cb6019c05547d76a13b72a">h2</a></td></tr>
+<tr class="memdesc:aa724e9d2f0cb6019c05547d76a13b72a"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:aa724e9d2f0cb6019c05547d76a13b72a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a056c7138246e2bdcd47eaad501b756bb"><td class="memItemLeft" align="right" valign="top"><a id="a056c7138246e2bdcd47eaad501b756bb"></a>
+<a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_pub_key.html#a056c7138246e2bdcd47eaad501b756bb">w</a></td></tr>
+<tr class="memdesc:a056c7138246e2bdcd47eaad501b756bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G2 <br /></td></tr>
+<tr class="separator:a056c7138246e2bdcd47eaad501b756bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 group public key. </p>
+<p>Group public key: (gid, h1, h2, w) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_group_rl.html b/doc/html/struct_epid11_group_rl.html
new file mode 100644
index 0000000..0f0e644
--- /dev/null
+++ b/doc/html/struct_epid11_group_rl.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11GroupRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_group_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11GroupRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 group revocation list.
+ <a href="struct_epid11_group_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a63afa9863e8dcb63ff884e6e4093c481"><td class="memItemLeft" align="right" valign="top"><a id="a63afa9863e8dcb63ff884e6e4093c481"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_rl.html#a63afa9863e8dcb63ff884e6e4093c481">version</a></td></tr>
+<tr class="memdesc:a63afa9863e8dcb63ff884e6e4093c481"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a63afa9863e8dcb63ff884e6e4093c481"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35cb954f598d4006b0f047cde77010a5"><td class="memItemLeft" align="right" valign="top"><a id="a35cb954f598d4006b0f047cde77010a5"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_rl.html#a35cb954f598d4006b0f047cde77010a5">n3</a></td></tr>
+<tr class="memdesc:a35cb954f598d4006b0f047cde77010a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in GroupRL <br /></td></tr>
+<tr class="separator:a35cb954f598d4006b0f047cde77010a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97f165c59bc447e3ca3c2148a096710f"><td class="memItemLeft" align="right" valign="top"><a id="a97f165c59bc447e3ca3c2148a096710f"></a>
+<a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_group_rl.html#a97f165c59bc447e3ca3c2148a096710f">gid</a> [1]</td></tr>
+<tr class="memdesc:a97f165c59bc447e3ca3c2148a096710f"><td class="mdescLeft">&#160;</td><td class="mdescRight">revoked group IDs (flexible array) <br /></td></tr>
+<tr class="separator:a97f165c59bc447e3ca3c2148a096710f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 group revocation list. </p>
+<p>Group revocation list GroupRL: (RLver, n3, gid[0], ..., gid[n3-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_gt_elem_str.html b/doc/html/struct_epid11_gt_elem_str.html
new file mode 100644
index 0000000..cb0c157
--- /dev/null
+++ b/doc/html/struct_epid11_gt_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11GtElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_gt_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11GtElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Intel(R) EPID 1.1 GT element.
+ <a href="struct_epid11_gt_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aed8dd86f1696c2f3537154fc904bf2b0"><td class="memItemLeft" align="right" valign="top"><a id="aed8dd86f1696c2f3537154fc904bf2b0"></a>
+<a class="el" href="struct_fq3_elem_str.html">Fq3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_gt_elem_str.html#aed8dd86f1696c2f3537154fc904bf2b0">a</a> [2]</td></tr>
+<tr class="memdesc:aed8dd86f1696c2f3537154fc904bf2b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in Fq3 <br /></td></tr>
+<tr class="separator:aed8dd86f1696c2f3537154fc904bf2b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Intel(R) EPID 1.1 GT element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_nr_proof.html b/doc/html/struct_epid11_nr_proof.html
new file mode 100644
index 0000000..3a05c94
--- /dev/null
+++ b/doc/html/struct_epid11_nr_proof.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11NrProof Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_nr_proof.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11NrProof Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 non-revoked Proof.
+ <a href="struct_epid11_nr_proof.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5ad9ba3bfac4eac37fd4a4e33ea65ddc"><td class="memItemLeft" align="right" valign="top"><a id="a5ad9ba3bfac4eac37fd4a4e33ea65ddc"></a>
+<a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html#a5ad9ba3bfac4eac37fd4a4e33ea65ddc">T</a></td></tr>
+<tr class="memdesc:a5ad9ba3bfac4eac37fd4a4e33ea65ddc"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G3 <br /></td></tr>
+<tr class="separator:a5ad9ba3bfac4eac37fd4a4e33ea65ddc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e5ee8dc25d296538dce935397a93d68"><td class="memItemLeft" align="right" valign="top"><a id="a2e5ee8dc25d296538dce935397a93d68"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html#a2e5ee8dc25d296538dce935397a93d68">c</a></td></tr>
+<tr class="memdesc:a2e5ee8dc25d296538dce935397a93d68"><td class="mdescLeft">&#160;</td><td class="mdescRight">a 256-bit integer <br /></td></tr>
+<tr class="separator:a2e5ee8dc25d296538dce935397a93d68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ad7fe6b32c09f2504ee49731c0ad145"><td class="memItemLeft" align="right" valign="top"><a id="a1ad7fe6b32c09f2504ee49731c0ad145"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html#a1ad7fe6b32c09f2504ee49731c0ad145">smu</a></td></tr>
+<tr class="memdesc:a1ad7fe6b32c09f2504ee49731c0ad145"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p'-1] <br /></td></tr>
+<tr class="separator:a1ad7fe6b32c09f2504ee49731c0ad145"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8406e938b2f87bded9e374e93a8ee5d"><td class="memItemLeft" align="right" valign="top"><a id="aa8406e938b2f87bded9e374e93a8ee5d"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_nr_proof.html#aa8406e938b2f87bded9e374e93a8ee5d">snu</a></td></tr>
+<tr class="memdesc:aa8406e938b2f87bded9e374e93a8ee5d"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p'-1] <br /></td></tr>
+<tr class="separator:aa8406e938b2f87bded9e374e93a8ee5d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 non-revoked Proof. </p>
+<p>Non-revoked Proof: (T, c, smu, snu) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_params.html b/doc/html/struct_epid11_params.html
new file mode 100644
index 0000000..fbd3b7b
--- /dev/null
+++ b/doc/html/struct_epid11_params.html
@@ -0,0 +1,174 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11Params Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_params.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11Params Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 Parameters.
+ <a href="struct_epid11_params.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a"><td class="memItemLeft" align="right" valign="top"><a id="a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a">p</a></td></tr>
+<tr class="memdesc:a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:a2aa4d8a2ebe0dfeb6d930fd7b39f9d1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad03fd1cc3955bb8879535fa7298123f"><td class="memItemLeft" align="right" valign="top"><a id="aad03fd1cc3955bb8879535fa7298123f"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#aad03fd1cc3955bb8879535fa7298123f">q</a></td></tr>
+<tr class="memdesc:aad03fd1cc3955bb8879535fa7298123f"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:aad03fd1cc3955bb8879535fa7298123f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2d1dc635d9d7cba496c3d64fb6f9d5b"><td class="memItemLeft" align="right" valign="top"><a id="ae2d1dc635d9d7cba496c3d64fb6f9d5b"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#ae2d1dc635d9d7cba496c3d64fb6f9d5b">h</a></td></tr>
+<tr class="memdesc:ae2d1dc635d9d7cba496c3d64fb6f9d5b"><td class="mdescLeft">&#160;</td><td class="mdescRight">a small integer, also denoted as cofactor <br /></td></tr>
+<tr class="separator:ae2d1dc635d9d7cba496c3d64fb6f9d5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01381f84b2d747b6273e21c71c58a1b0"><td class="memItemLeft" align="right" valign="top"><a id="a01381f84b2d747b6273e21c71c58a1b0"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a01381f84b2d747b6273e21c71c58a1b0">a</a></td></tr>
+<tr class="memdesc:a01381f84b2d747b6273e21c71c58a1b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a01381f84b2d747b6273e21c71c58a1b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27b45ed7771a3024d1d059b4b4ff6eae"><td class="memItemLeft" align="right" valign="top"><a id="a27b45ed7771a3024d1d059b4b4ff6eae"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a27b45ed7771a3024d1d059b4b4ff6eae">b</a></td></tr>
+<tr class="memdesc:a27b45ed7771a3024d1d059b4b4ff6eae"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a27b45ed7771a3024d1d059b4b4ff6eae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacc39ebe0cc625321039ffb6be0b0e87"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#aacc39ebe0cc625321039ffb6be0b0e87">coeff</a> [3]</td></tr>
+<tr class="separator:aacc39ebe0cc625321039ffb6be0b0e87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af22cfcd6c7ec0e7e7369b79554b963bd"><td class="memItemLeft" align="right" valign="top"><a id="af22cfcd6c7ec0e7e7369b79554b963bd"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#af22cfcd6c7ec0e7e7369b79554b963bd">qnr</a></td></tr>
+<tr class="memdesc:af22cfcd6c7ec0e7e7369b79554b963bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">a quadratic non-residue (an integer between [0, q-1]) <br /></td></tr>
+<tr class="separator:af22cfcd6c7ec0e7e7369b79554b963bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02bd6fa2ab256e3a07533e947ab0101e"><td class="memItemLeft" align="right" valign="top"><a id="a02bd6fa2ab256e3a07533e947ab0101e"></a>
+<a class="el" href="struct_oct_str768.html">OctStr768</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a02bd6fa2ab256e3a07533e947ab0101e">orderG2</a></td></tr>
+<tr class="memdesc:a02bd6fa2ab256e3a07533e947ab0101e"><td class="mdescLeft">&#160;</td><td class="mdescRight">the total number of points in G2 elliptic curve <br /></td></tr>
+<tr class="separator:a02bd6fa2ab256e3a07533e947ab0101e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77a8350b97a7afb584a46eb5b32f03bf"><td class="memItemLeft" align="right" valign="top"><a id="a77a8350b97a7afb584a46eb5b32f03bf"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a77a8350b97a7afb584a46eb5b32f03bf">p_tick</a></td></tr>
+<tr class="memdesc:a77a8350b97a7afb584a46eb5b32f03bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:a77a8350b97a7afb584a46eb5b32f03bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49462f35596d07a456a731d0690fdd83"><td class="memItemLeft" align="right" valign="top"><a id="a49462f35596d07a456a731d0690fdd83"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a49462f35596d07a456a731d0690fdd83">q_tick</a></td></tr>
+<tr class="memdesc:a49462f35596d07a456a731d0690fdd83"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:a49462f35596d07a456a731d0690fdd83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fe238db4ebc0225899dc2dac97d11c0"><td class="memItemLeft" align="right" valign="top"><a id="a0fe238db4ebc0225899dc2dac97d11c0"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a0fe238db4ebc0225899dc2dac97d11c0">h_tick</a></td></tr>
+<tr class="memdesc:a0fe238db4ebc0225899dc2dac97d11c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">a small integer, also denoted as cofactor <br /></td></tr>
+<tr class="separator:a0fe238db4ebc0225899dc2dac97d11c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8770bb921aac9214ff8c45c41dbb228"><td class="memItemLeft" align="right" valign="top"><a id="ae8770bb921aac9214ff8c45c41dbb228"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#ae8770bb921aac9214ff8c45c41dbb228">a_tick</a></td></tr>
+<tr class="memdesc:ae8770bb921aac9214ff8c45c41dbb228"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:ae8770bb921aac9214ff8c45c41dbb228"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade3f88ce73d7de656ec67d9fdb0719d7"><td class="memItemLeft" align="right" valign="top"><a id="ade3f88ce73d7de656ec67d9fdb0719d7"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#ade3f88ce73d7de656ec67d9fdb0719d7">b_tick</a></td></tr>
+<tr class="memdesc:ade3f88ce73d7de656ec67d9fdb0719d7"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:ade3f88ce73d7de656ec67d9fdb0719d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a835e70da717cd5b0c94e242a6418a287"><td class="memItemLeft" align="right" valign="top"><a id="a835e70da717cd5b0c94e242a6418a287"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a835e70da717cd5b0c94e242a6418a287">g1</a></td></tr>
+<tr class="memdesc:a835e70da717cd5b0c94e242a6418a287"><td class="mdescLeft">&#160;</td><td class="mdescRight">a generator(an element) of G1 <br /></td></tr>
+<tr class="separator:a835e70da717cd5b0c94e242a6418a287"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c6bbc4e066449d9c329f88cb653ef7c"><td class="memItemLeft" align="right" valign="top"><a id="a1c6bbc4e066449d9c329f88cb653ef7c"></a>
+<a class="el" href="struct_epid11_g2_elem_str.html">Epid11G2ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a1c6bbc4e066449d9c329f88cb653ef7c">g2</a></td></tr>
+<tr class="memdesc:a1c6bbc4e066449d9c329f88cb653ef7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">a generator (an element) of G2 <br /></td></tr>
+<tr class="separator:a1c6bbc4e066449d9c329f88cb653ef7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eb9a1371d7187ae81bccfa8d5595033"><td class="memItemLeft" align="right" valign="top"><a id="a7eb9a1371d7187ae81bccfa8d5595033"></a>
+<a class="el" href="group___epid11_types.html#gadff9c05d5b7751024152b40dda545545">Epid11G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_params.html#a7eb9a1371d7187ae81bccfa8d5595033">g3</a></td></tr>
+<tr class="memdesc:a7eb9a1371d7187ae81bccfa8d5595033"><td class="mdescLeft">&#160;</td><td class="mdescRight">a generator (an element) of G3 <br /></td></tr>
+<tr class="separator:a7eb9a1371d7187ae81bccfa8d5595033"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 Parameters. </p>
+<p>Intel(R) EPID 1.1 parameters are: (p, q, h, a, b, coeff, qnr, orderG2, p', q', h', a', b', g1, g2, g3). The size of the Intel(R) EPID public parameters of G1, G2, G3, and GT is 6464 bits or 808 bytes. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aacc39ebe0cc625321039ffb6be0b0e87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aacc39ebe0cc625321039ffb6be0b0e87">&#9670;&nbsp;</a></span>coeff</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="struct_big_num_str.html">BigNumStr</a> Epid11Params::coeff[3]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>the coefficients of an irreducible polynomial coeff[0], coeff[1], coeff[2] are 256-bit integers between [0, q - 1] </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_params.html">Epid11Params</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_priv_rl.html b/doc/html/struct_epid11_priv_rl.html
new file mode 100644
index 0000000..477b035
--- /dev/null
+++ b/doc/html/struct_epid11_priv_rl.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11PrivRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_priv_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11PrivRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 private-key based revocation list.
+ <a href="struct_epid11_priv_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aa8945d81e30674b52a6d0900b64feb3c"><td class="memItemLeft" align="right" valign="top"><a id="aa8945d81e30674b52a6d0900b64feb3c"></a>
+<a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html#aa8945d81e30674b52a6d0900b64feb3c">gid</a></td></tr>
+<tr class="memdesc:aa8945d81e30674b52a6d0900b64feb3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:aa8945d81e30674b52a6d0900b64feb3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b3899f5a35bf64f860d6d91bccb03c8"><td class="memItemLeft" align="right" valign="top"><a id="a2b3899f5a35bf64f860d6d91bccb03c8"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html#a2b3899f5a35bf64f860d6d91bccb03c8">version</a></td></tr>
+<tr class="memdesc:a2b3899f5a35bf64f860d6d91bccb03c8"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a2b3899f5a35bf64f860d6d91bccb03c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad95f880f40e2f40c723f5bdbd22ecfa2"><td class="memItemLeft" align="right" valign="top"><a id="ad95f880f40e2f40c723f5bdbd22ecfa2"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html#ad95f880f40e2f40c723f5bdbd22ecfa2">n1</a></td></tr>
+<tr class="memdesc:ad95f880f40e2f40c723f5bdbd22ecfa2"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in PrivRL <br /></td></tr>
+<tr class="separator:ad95f880f40e2f40c723f5bdbd22ecfa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbb75fee81aecb2dde7e2daab895ad3b"><td class="memItemLeft" align="right" valign="top"><a id="abbb75fee81aecb2dde7e2daab895ad3b"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_priv_rl.html#abbb75fee81aecb2dde7e2daab895ad3b">f</a> [1]</td></tr>
+<tr class="memdesc:abbb75fee81aecb2dde7e2daab895ad3b"><td class="mdescLeft">&#160;</td><td class="mdescRight">integers between [1, p-1] (flexible array) <br /></td></tr>
+<tr class="separator:abbb75fee81aecb2dde7e2daab895ad3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 private-key based revocation list. </p>
+<p>Private-key based revocation list PrivRL: (gid, RLver, n1, f[0], ..., f[n1-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_sig_rl.html b/doc/html/struct_epid11_sig_rl.html
new file mode 100644
index 0000000..747f53d
--- /dev/null
+++ b/doc/html/struct_epid11_sig_rl.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11SigRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_sig_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11SigRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 signature based revocation list.
+ <a href="struct_epid11_sig_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad45b0e3e1be59649150dd34c104000ac"><td class="memItemLeft" align="right" valign="top"><a id="ad45b0e3e1be59649150dd34c104000ac"></a>
+<a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html#ad45b0e3e1be59649150dd34c104000ac">gid</a></td></tr>
+<tr class="memdesc:ad45b0e3e1be59649150dd34c104000ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ad45b0e3e1be59649150dd34c104000ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa38674729293f4879ff94328dd3c59b1"><td class="memItemLeft" align="right" valign="top"><a id="aa38674729293f4879ff94328dd3c59b1"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html#aa38674729293f4879ff94328dd3c59b1">version</a></td></tr>
+<tr class="memdesc:aa38674729293f4879ff94328dd3c59b1"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:aa38674729293f4879ff94328dd3c59b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c654d43df132db7874f4c84c177dc12"><td class="memItemLeft" align="right" valign="top"><a id="a8c654d43df132db7874f4c84c177dc12"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html#a8c654d43df132db7874f4c84c177dc12">n2</a></td></tr>
+<tr class="memdesc:a8c654d43df132db7874f4c84c177dc12"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in SigRL <br /></td></tr>
+<tr class="separator:a8c654d43df132db7874f4c84c177dc12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6473f8a98f76c9f82183041ea5ae17e3"><td class="memItemLeft" align="right" valign="top"><a id="a6473f8a98f76c9f82183041ea5ae17e3"></a>
+<a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl.html#a6473f8a98f76c9f82183041ea5ae17e3">bk</a> [1]</td></tr>
+<tr class="memdesc:a6473f8a98f76c9f82183041ea5ae17e3"><td class="mdescLeft">&#160;</td><td class="mdescRight">revoked Bs and Ks (flexible array) <br /></td></tr>
+<tr class="separator:a6473f8a98f76c9f82183041ea5ae17e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 signature based revocation list. </p>
+<p>Signature based revocation list SigRL: (gid, RLver, n2, B[0], K[0], ..., B[n2-1], K[n2-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_sig_rl_entry.html b/doc/html/struct_epid11_sig_rl_entry.html
new file mode 100644
index 0000000..578dc93
--- /dev/null
+++ b/doc/html/struct_epid11_sig_rl_entry.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11SigRlEntry Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_sig_rl_entry.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11SigRlEntry Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 entry in SigRL (B,K)
+ <a href="struct_epid11_sig_rl_entry.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:abe47cfbd00684941f93a211417bedf0c"><td class="memItemLeft" align="right" valign="top"><a id="abe47cfbd00684941f93a211417bedf0c"></a>
+<a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl_entry.html#abe47cfbd00684941f93a211417bedf0c">b</a></td></tr>
+<tr class="memdesc:abe47cfbd00684941f93a211417bedf0c"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element of G1 <br /></td></tr>
+<tr class="separator:abe47cfbd00684941f93a211417bedf0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5de66e1352eafe95774a0d76bac8f01a"><td class="memItemLeft" align="right" valign="top"><a id="a5de66e1352eafe95774a0d76bac8f01a"></a>
+<a class="el" href="group___epid11_types.html#gaf1f4f1d6f001895abe548cfb33611c23">Epid11G3ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_sig_rl_entry.html#a5de66e1352eafe95774a0d76bac8f01a">k</a></td></tr>
+<tr class="memdesc:a5de66e1352eafe95774a0d76bac8f01a"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element of G1 <br /></td></tr>
+<tr class="separator:a5de66e1352eafe95774a0d76bac8f01a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 entry in SigRL (B,K) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_signature.html b/doc/html/struct_epid11_signature.html
new file mode 100644
index 0000000..1c7bf0d
--- /dev/null
+++ b/doc/html/struct_epid11_signature.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11Signature Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11Signature Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 Signature.
+ <a href="struct_epid11_signature.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a48526e73f02ad3f1544c4c71c481f153"><td class="memItemLeft" align="right" valign="top"><a id="a48526e73f02ad3f1544c4c71c481f153"></a>
+<a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html#a48526e73f02ad3f1544c4c71c481f153">sigma0</a></td></tr>
+<tr class="memdesc:a48526e73f02ad3f1544c4c71c481f153"><td class="mdescLeft">&#160;</td><td class="mdescRight">basic signature <br /></td></tr>
+<tr class="separator:a48526e73f02ad3f1544c4c71c481f153"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43cb3ed13c862ff05a9292623ad57c5e"><td class="memItemLeft" align="right" valign="top"><a id="a43cb3ed13c862ff05a9292623ad57c5e"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html#a43cb3ed13c862ff05a9292623ad57c5e">rl_ver</a></td></tr>
+<tr class="memdesc:a43cb3ed13c862ff05a9292623ad57c5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a43cb3ed13c862ff05a9292623ad57c5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad25c277223a5210063163ea554d08ad4"><td class="memItemLeft" align="right" valign="top"><a id="ad25c277223a5210063163ea554d08ad4"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html#ad25c277223a5210063163ea554d08ad4">n2</a></td></tr>
+<tr class="memdesc:ad25c277223a5210063163ea554d08ad4"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in SigRL <br /></td></tr>
+<tr class="separator:ad25c277223a5210063163ea554d08ad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf24a8df563ba3f535486d8dad7384f4"><td class="memItemLeft" align="right" valign="top"><a id="abf24a8df563ba3f535486d8dad7384f4"></a>
+<a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_signature.html#abf24a8df563ba3f535486d8dad7384f4">sigma</a> [1]</td></tr>
+<tr class="memdesc:abf24a8df563ba3f535486d8dad7384f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">array of non-revoked proofs (flexible array) <br /></td></tr>
+<tr class="separator:abf24a8df563ba3f535486d8dad7384f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 Signature. </p>
+<p>Signature: (sigma0, RLver, n2, sigma[0], ..., sigma[n2-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_signature.html">Epid11Signature</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid11_verifier_precomp.html b/doc/html/struct_epid11_verifier_precomp.html
new file mode 100644
index 0000000..dca2fd0
--- /dev/null
+++ b/doc/html/struct_epid11_verifier_precomp.html
@@ -0,0 +1,115 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid11VerifierPrecomp Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid11_verifier_precomp.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid11VerifierPrecomp Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_verifier_module.html">verifier</a> &raquo; <a class="el" href="group___epid11_verifier_module.html">Intel(R) EPID 1.1 support</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 Pre-computed verifier settings.
+ <a href="struct_epid11_verifier_precomp.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/verifier/1.1/api.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a03138e937f4488bdbc52ed473dc313da"><td class="memItemLeft" align="right" valign="top"><a id="a03138e937f4488bdbc52ed473dc313da"></a>
+<a class="el" href="group___epid11_types.html#ga7293cec8f937d6f5da42084403f978f1">Epid11GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html#a03138e937f4488bdbc52ed473dc313da">gid</a></td></tr>
+<tr class="memdesc:a03138e937f4488bdbc52ed473dc313da"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:a03138e937f4488bdbc52ed473dc313da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a980adb039089263ec59a995600ee91"><td class="memItemLeft" align="right" valign="top"><a id="a0a980adb039089263ec59a995600ee91"></a>
+<a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html#a0a980adb039089263ec59a995600ee91">e12</a></td></tr>
+<tr class="memdesc:a0a980adb039089263ec59a995600ee91"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a0a980adb039089263ec59a995600ee91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0ff2a13c2c87460296900dde72a2f30"><td class="memItemLeft" align="right" valign="top"><a id="ad0ff2a13c2c87460296900dde72a2f30"></a>
+<a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html#ad0ff2a13c2c87460296900dde72a2f30">e22</a></td></tr>
+<tr class="memdesc:ad0ff2a13c2c87460296900dde72a2f30"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:ad0ff2a13c2c87460296900dde72a2f30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14ebadf105aff085edb9a817a2d1db89"><td class="memItemLeft" align="right" valign="top"><a id="a14ebadf105aff085edb9a817a2d1db89"></a>
+<a class="el" href="struct_epid11_gt_elem_str.html">Epid11GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html#a14ebadf105aff085edb9a817a2d1db89">e2w</a></td></tr>
+<tr class="memdesc:a14ebadf105aff085edb9a817a2d1db89"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a14ebadf105aff085edb9a817a2d1db89"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 Pre-computed verifier settings. </p>
+<p>Serialized form of the information about a verifier that remains stable for a given set of keys.</p>
+<p>This API supports Intel(R) EPID 1.1 verification.</p>
+<dl class="section note"><dt>Note</dt><dd>e12 = 0 implies that this data is not valid </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1 support</b></a> </dd></dl>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/verifier/1.1/<a class="el" href="verifier_21_81_2api_8h.html">api.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid2_params.html b/doc/html/struct_epid2_params.html
new file mode 100644
index 0000000..ff5b915
--- /dev/null
+++ b/doc/html/struct_epid2_params.html
@@ -0,0 +1,132 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Epid2Params Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid2_params.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Epid2Params Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 Parameters.
+ <a href="struct_epid2_params.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac0e0dad45b10927860cd5fa4f8101f08"><td class="memItemLeft" align="right" valign="top"><a id="ac0e0dad45b10927860cd5fa4f8101f08"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#ac0e0dad45b10927860cd5fa4f8101f08">p</a></td></tr>
+<tr class="memdesc:ac0e0dad45b10927860cd5fa4f8101f08"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:ac0e0dad45b10927860cd5fa4f8101f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a023603228fed2854ddae2e228938940f"><td class="memItemLeft" align="right" valign="top"><a id="a023603228fed2854ddae2e228938940f"></a>
+<a class="el" href="struct_big_num_str.html">BigNumStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#a023603228fed2854ddae2e228938940f">q</a></td></tr>
+<tr class="memdesc:a023603228fed2854ddae2e228938940f"><td class="mdescLeft">&#160;</td><td class="mdescRight">a prime <br /></td></tr>
+<tr class="separator:a023603228fed2854ddae2e228938940f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f868edb49be49f645101ef5ebbbc551"><td class="memItemLeft" align="right" valign="top"><a id="a2f868edb49be49f645101ef5ebbbc551"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#a2f868edb49be49f645101ef5ebbbc551">b</a></td></tr>
+<tr class="memdesc:a2f868edb49be49f645101ef5ebbbc551"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a2f868edb49be49f645101ef5ebbbc551"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a200a0cba1c9e4ad512bece23f2461a5f"><td class="memItemLeft" align="right" valign="top"><a id="a200a0cba1c9e4ad512bece23f2461a5f"></a>
+<a class="el" href="struct_oct_str64.html">OctStr64</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#a200a0cba1c9e4ad512bece23f2461a5f">t</a></td></tr>
+<tr class="memdesc:a200a0cba1c9e4ad512bece23f2461a5f"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer <br /></td></tr>
+<tr class="separator:a200a0cba1c9e4ad512bece23f2461a5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af23f07fb0e1745c0ad14aceeaa946928"><td class="memItemLeft" align="right" valign="top"><a id="af23f07fb0e1745c0ad14aceeaa946928"></a>
+<a class="el" href="struct_oct_str8.html">OctStr8</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#af23f07fb0e1745c0ad14aceeaa946928">neg</a></td></tr>
+<tr class="memdesc:af23f07fb0e1745c0ad14aceeaa946928"><td class="mdescLeft">&#160;</td><td class="mdescRight">a boolean <br /></td></tr>
+<tr class="separator:af23f07fb0e1745c0ad14aceeaa946928"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2d7507c6f58c3451beacacb91b52695"><td class="memItemLeft" align="right" valign="top"><a id="ac2d7507c6f58c3451beacacb91b52695"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#ac2d7507c6f58c3451beacacb91b52695">beta</a></td></tr>
+<tr class="memdesc:ac2d7507c6f58c3451beacacb91b52695"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:ac2d7507c6f58c3451beacacb91b52695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1d8f5d6036a82064e91bc137b278e74"><td class="memItemLeft" align="right" valign="top"><a id="ae1d8f5d6036a82064e91bc137b278e74"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#ae1d8f5d6036a82064e91bc137b278e74">xi</a> [2]</td></tr>
+<tr class="memdesc:ae1d8f5d6036a82064e91bc137b278e74"><td class="mdescLeft">&#160;</td><td class="mdescRight">array of integers between [0, q-1] <br /></td></tr>
+<tr class="separator:ae1d8f5d6036a82064e91bc137b278e74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c5195b4fa9393a07a121336202531ad"><td class="memItemLeft" align="right" valign="top"><a id="a4c5195b4fa9393a07a121336202531ad"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#a4c5195b4fa9393a07a121336202531ad">g1</a></td></tr>
+<tr class="memdesc:a4c5195b4fa9393a07a121336202531ad"><td class="mdescLeft">&#160;</td><td class="mdescRight">a generator (an element) of G1 <br /></td></tr>
+<tr class="separator:a4c5195b4fa9393a07a121336202531ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a609b0aac17fca34fe39bee29676a9618"><td class="memItemLeft" align="right" valign="top"><a id="a609b0aac17fca34fe39bee29676a9618"></a>
+<a class="el" href="struct_g2_elem_str.html">G2ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html#a609b0aac17fca34fe39bee29676a9618">g2</a></td></tr>
+<tr class="memdesc:a609b0aac17fca34fe39bee29676a9618"><td class="mdescLeft">&#160;</td><td class="mdescRight">a generator (an element) of G2 <br /></td></tr>
+<tr class="separator:a609b0aac17fca34fe39bee29676a9618"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 Parameters. </p>
+<p>Intel(R) EPID 2.0 parameters: (p, q, b, t, neg, beta, xi0, xi1, g1, g2) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid2_params.html">Epid2Params</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid_ca_certificate.html b/doc/html/struct_epid_ca_certificate.html
new file mode 100644
index 0000000..5e7c217
--- /dev/null
+++ b/doc/html/struct_epid_ca_certificate.html
@@ -0,0 +1,131 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EpidCaCertificate Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid_ca_certificate.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EpidCaCertificate Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___file_parser.html">fileparser</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>IoT CA Certificate binary format.
+ <a href="struct_epid_ca_certificate.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/file_parser.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac03cf7257c52ad14e3dd3201b930dd50"><td class="memItemLeft" align="right" valign="top"><a id="ac03cf7257c52ad14e3dd3201b930dd50"></a>
+<a class="el" href="struct_epid_file_header.html">EpidFileHeader</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#ac03cf7257c52ad14e3dd3201b930dd50">header</a></td></tr>
+<tr class="memdesc:ac03cf7257c52ad14e3dd3201b930dd50"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID binary file header. <br /></td></tr>
+<tr class="separator:ac03cf7257c52ad14e3dd3201b930dd50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d2fc21f46cf9fc96e2ea557b70e5356"><td class="memItemLeft" align="right" valign="top"><a id="a9d2fc21f46cf9fc96e2ea557b70e5356"></a>
+<a class="el" href="struct_oct_str512.html">OctStr512</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a9d2fc21f46cf9fc96e2ea557b70e5356">pubkey</a></td></tr>
+<tr class="memdesc:a9d2fc21f46cf9fc96e2ea557b70e5356"><td class="mdescLeft">&#160;</td><td class="mdescRight">Public Key (Qx, Qy) <br /></td></tr>
+<tr class="separator:a9d2fc21f46cf9fc96e2ea557b70e5356"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a44e8050ca2f5085652b2b4e15b779c"><td class="memItemLeft" align="right" valign="top"><a id="a3a44e8050ca2f5085652b2b4e15b779c"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a3a44e8050ca2f5085652b2b4e15b779c">prime</a></td></tr>
+<tr class="memdesc:a3a44e8050ca2f5085652b2b4e15b779c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Prime of GF(p) <br /></td></tr>
+<tr class="separator:a3a44e8050ca2f5085652b2b4e15b779c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2811c1914ffae913820f13da914c8f01"><td class="memItemLeft" align="right" valign="top"><a id="a2811c1914ffae913820f13da914c8f01"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a2811c1914ffae913820f13da914c8f01">a</a></td></tr>
+<tr class="memdesc:a2811c1914ffae913820f13da914c8f01"><td class="mdescLeft">&#160;</td><td class="mdescRight">Coefficient of E Curve. <br /></td></tr>
+<tr class="separator:a2811c1914ffae913820f13da914c8f01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a280e0b0238cf45834c21849ab8a7e124"><td class="memItemLeft" align="right" valign="top"><a id="a280e0b0238cf45834c21849ab8a7e124"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a280e0b0238cf45834c21849ab8a7e124">b</a></td></tr>
+<tr class="memdesc:a280e0b0238cf45834c21849ab8a7e124"><td class="mdescLeft">&#160;</td><td class="mdescRight">Coefficient of E Curve. <br /></td></tr>
+<tr class="separator:a280e0b0238cf45834c21849ab8a7e124"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f77996f90ed7da1d0503c4236b2c9d1"><td class="memItemLeft" align="right" valign="top"><a id="a4f77996f90ed7da1d0503c4236b2c9d1"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a4f77996f90ed7da1d0503c4236b2c9d1">x</a></td></tr>
+<tr class="memdesc:a4f77996f90ed7da1d0503c4236b2c9d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">X coordinate of Base point G. <br /></td></tr>
+<tr class="separator:a4f77996f90ed7da1d0503c4236b2c9d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd69cce8d5e3940787ee0d17f72184ab"><td class="memItemLeft" align="right" valign="top"><a id="abd69cce8d5e3940787ee0d17f72184ab"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#abd69cce8d5e3940787ee0d17f72184ab">y</a></td></tr>
+<tr class="memdesc:abd69cce8d5e3940787ee0d17f72184ab"><td class="mdescLeft">&#160;</td><td class="mdescRight">Y coordinate of Base point G. <br /></td></tr>
+<tr class="separator:abd69cce8d5e3940787ee0d17f72184ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9d4c318b1fc8d38d3ce53b29f2dfee2"><td class="memItemLeft" align="right" valign="top"><a id="ab9d4c318b1fc8d38d3ce53b29f2dfee2"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#ab9d4c318b1fc8d38d3ce53b29f2dfee2">r</a></td></tr>
+<tr class="memdesc:ab9d4c318b1fc8d38d3ce53b29f2dfee2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Order of base point. <br /></td></tr>
+<tr class="separator:ab9d4c318b1fc8d38d3ce53b29f2dfee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f8f09ae02919c379c38386668b47418"><td class="memItemLeft" align="right" valign="top"><a id="a2f8f09ae02919c379c38386668b47418"></a>
+<a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_ca_certificate.html#a2f8f09ae02919c379c38386668b47418">signature</a></td></tr>
+<tr class="memdesc:a2f8f09ae02919c379c38386668b47418"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Signature on SHA-256 of above values. <br /></td></tr>
+<tr class="separator:a2f8f09ae02919c379c38386668b47418"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>IoT CA Certificate binary format. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="file__parser_8h.html">file_parser.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid_ca_certificate.html">EpidCaCertificate</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid_file_header.html b/doc/html/struct_epid_file_header.html
new file mode 100644
index 0000000..ff7d31b
--- /dev/null
+++ b/doc/html/struct_epid_file_header.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EpidFileHeader Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid_file_header.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EpidFileHeader Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___file_parser.html">fileparser</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID binary file header.
+ <a href="struct_epid_file_header.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/file_parser.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a35d43c51c1739940381e4898ca87b824"><td class="memItemLeft" align="right" valign="top"><a id="a35d43c51c1739940381e4898ca87b824"></a>
+<a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_file_header.html#a35d43c51c1739940381e4898ca87b824">epid_version</a></td></tr>
+<tr class="memdesc:a35d43c51c1739940381e4898ca87b824"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID Version. <br /></td></tr>
+<tr class="separator:a35d43c51c1739940381e4898ca87b824"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5d48c739cc6c00c6e1ce35abf4f1473"><td class="memItemLeft" align="right" valign="top"><a id="af5d48c739cc6c00c6e1ce35abf4f1473"></a>
+<a class="el" href="struct_oct_str16.html">OctStr16</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_file_header.html#af5d48c739cc6c00c6e1ce35abf4f1473">file_type</a></td></tr>
+<tr class="memdesc:af5d48c739cc6c00c6e1ce35abf4f1473"><td class="mdescLeft">&#160;</td><td class="mdescRight">File Type. <br /></td></tr>
+<tr class="separator:af5d48c739cc6c00c6e1ce35abf4f1473"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID binary file header. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="file__parser_8h.html">file_parser.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid_file_header.html">EpidFileHeader</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_epid_signature.html b/doc/html/struct_epid_signature.html
new file mode 100644
index 0000000..80bd8c7
--- /dev/null
+++ b/doc/html/struct_epid_signature.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: EpidSignature Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_epid_signature.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">EpidSignature Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 Signature.
+ <a href="struct_epid_signature.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab0fe5f98bff737fcfbfe0b4d658e83f2"><td class="memItemLeft" align="right" valign="top"><a id="ab0fe5f98bff737fcfbfe0b4d658e83f2"></a>
+<a class="el" href="struct_basic_signature.html">BasicSignature</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html#ab0fe5f98bff737fcfbfe0b4d658e83f2">sigma0</a></td></tr>
+<tr class="memdesc:ab0fe5f98bff737fcfbfe0b4d658e83f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">basic signature <br /></td></tr>
+<tr class="separator:ab0fe5f98bff737fcfbfe0b4d658e83f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4155f3f4f1223fc4ae50c94f5305def1"><td class="memItemLeft" align="right" valign="top"><a id="a4155f3f4f1223fc4ae50c94f5305def1"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html#a4155f3f4f1223fc4ae50c94f5305def1">rl_ver</a></td></tr>
+<tr class="memdesc:a4155f3f4f1223fc4ae50c94f5305def1"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a4155f3f4f1223fc4ae50c94f5305def1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62a6b0ffcd5f68dd3d2786a58fe43017"><td class="memItemLeft" align="right" valign="top"><a id="a62a6b0ffcd5f68dd3d2786a58fe43017"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html#a62a6b0ffcd5f68dd3d2786a58fe43017">n2</a></td></tr>
+<tr class="memdesc:a62a6b0ffcd5f68dd3d2786a58fe43017"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in SigRL <br /></td></tr>
+<tr class="separator:a62a6b0ffcd5f68dd3d2786a58fe43017"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89d2e38223944310b6eeeadf6061a2dd"><td class="memItemLeft" align="right" valign="top"><a id="a89d2e38223944310b6eeeadf6061a2dd"></a>
+<a class="el" href="struct_nr_proof.html">NrProof</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html#a89d2e38223944310b6eeeadf6061a2dd">sigma</a> [1]</td></tr>
+<tr class="memdesc:a89d2e38223944310b6eeeadf6061a2dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">array of non-revoked proofs (flexible array) <br /></td></tr>
+<tr class="separator:a89d2e38223944310b6eeeadf6061a2dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 Signature. </p>
+<p>Signature: (sigma0, RLver, n2, sigma[0], ..., sigma[n2-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_epid_signature.html">EpidSignature</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fp_elem.html b/doc/html/struct_fp_elem.html
new file mode 100644
index 0000000..6ced116
--- /dev/null
+++ b/doc/html/struct_fp_elem.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: FpElem Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fp_elem.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">FpElem Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of Fp.
+ <a href="struct_fp_elem.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a755a581a230c169e36985fb0301f2a28"><td class="memItemLeft" align="right" valign="top"><a id="a755a581a230c169e36985fb0301f2a28"></a>
+<a class="el" href="struct_very_large_int.html">VeryLargeInt</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fp_elem.html#a755a581a230c169e36985fb0301f2a28">limbs</a></td></tr>
+<tr class="memdesc:a755a581a230c169e36985fb0301f2a28"><td class="mdescLeft">&#160;</td><td class="mdescRight">An integer in [0, p-1]. <br /></td></tr>
+<tr class="separator:a755a581a230c169e36985fb0301f2a28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of Fp. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fp_elem.html">FpElem</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fp_elem_str.html b/doc/html/struct_fp_elem_str.html
new file mode 100644
index 0000000..28bad31
--- /dev/null
+++ b/doc/html/struct_fp_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: FpElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fp_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">FpElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>a number in [0, p-1]
+ <a href="struct_fp_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5ddb96a5567750f2834335851c906c45"><td class="memItemLeft" align="right" valign="top"><a id="a5ddb96a5567750f2834335851c906c45"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fp_elem_str.html#a5ddb96a5567750f2834335851c906c45">data</a></td></tr>
+<tr class="memdesc:a5ddb96a5567750f2834335851c906c45"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit octet string <br /></td></tr>
+<tr class="separator:a5ddb96a5567750f2834335851c906c45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>a number in [0, p-1] </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq12_elem.html b/doc/html/struct_fq12_elem.html
new file mode 100644
index 0000000..739c742
--- /dev/null
+++ b/doc/html/struct_fq12_elem.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq12Elem Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq12_elem.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq12Elem Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of Fq12.
+ <a href="struct_fq12_elem.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a2f33b78b0e6f4c720f481aac8f82d938"><td class="memItemLeft" align="right" valign="top"><a id="a2f33b78b0e6f4c720f481aac8f82d938"></a>
+<a class="el" href="struct_fq6_elem.html">Fq6Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem.html#a2f33b78b0e6f4c720f481aac8f82d938">z0</a></td></tr>
+<tr class="memdesc:a2f33b78b0e6f4c720f481aac8f82d938"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq6. <br /></td></tr>
+<tr class="separator:a2f33b78b0e6f4c720f481aac8f82d938"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53a5954433b4c4df1fda6dcb08f54c7b"><td class="memItemLeft" align="right" valign="top"><a id="a53a5954433b4c4df1fda6dcb08f54c7b"></a>
+<a class="el" href="struct_fq6_elem.html">Fq6Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem.html#a53a5954433b4c4df1fda6dcb08f54c7b">z1</a></td></tr>
+<tr class="memdesc:a53a5954433b4c4df1fda6dcb08f54c7b"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq6. <br /></td></tr>
+<tr class="separator:a53a5954433b4c4df1fda6dcb08f54c7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of Fq12. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq12_elem.html">Fq12Elem</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq12_elem_str.html b/doc/html/struct_fq12_elem_str.html
new file mode 100644
index 0000000..cb702e6
--- /dev/null
+++ b/doc/html/struct_fq12_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq12ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq12_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq12ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Fq2^3^2 element.
+ <a href="struct_fq12_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0520947335aaf52de90af1dec5bdd112"><td class="memItemLeft" align="right" valign="top"><a id="a0520947335aaf52de90af1dec5bdd112"></a>
+<a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem_str.html#a0520947335aaf52de90af1dec5bdd112">a</a> [2]</td></tr>
+<tr class="memdesc:a0520947335aaf52de90af1dec5bdd112"><td class="mdescLeft">&#160;</td><td class="mdescRight">polynomial coefficient <br /></td></tr>
+<tr class="separator:a0520947335aaf52de90af1dec5bdd112"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Fq2^3^2 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq2_elem.html b/doc/html/struct_fq2_elem.html
new file mode 100644
index 0000000..51799c5
--- /dev/null
+++ b/doc/html/struct_fq2_elem.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq2Elem Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq2_elem.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq2Elem Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of Fq2.
+ <a href="struct_fq2_elem.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3e0e0c995074a18ca1e234fd99f90b3d"><td class="memItemLeft" align="right" valign="top"><a id="a3e0e0c995074a18ca1e234fd99f90b3d"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem.html#a3e0e0c995074a18ca1e234fd99f90b3d">x0</a></td></tr>
+<tr class="memdesc:a3e0e0c995074a18ca1e234fd99f90b3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq. <br /></td></tr>
+<tr class="separator:a3e0e0c995074a18ca1e234fd99f90b3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f48b8d7f1d6bac1579c1fad81ef4a02"><td class="memItemLeft" align="right" valign="top"><a id="a4f48b8d7f1d6bac1579c1fad81ef4a02"></a>
+<a class="el" href="struct_fq_elem.html">FqElem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem.html#a4f48b8d7f1d6bac1579c1fad81ef4a02">x1</a></td></tr>
+<tr class="memdesc:a4f48b8d7f1d6bac1579c1fad81ef4a02"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq. <br /></td></tr>
+<tr class="separator:a4f48b8d7f1d6bac1579c1fad81ef4a02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of Fq2. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq2_elem.html">Fq2Elem</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq2_elem_str.html b/doc/html/struct_fq2_elem_str.html
new file mode 100644
index 0000000..15c957f
--- /dev/null
+++ b/doc/html/struct_fq2_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq2ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq2_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq2ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Fq2 element.
+ <a href="struct_fq2_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab1d253eb24ba30eaf516ac429daab915"><td class="memItemLeft" align="right" valign="top"><a id="ab1d253eb24ba30eaf516ac429daab915"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem_str.html#ab1d253eb24ba30eaf516ac429daab915">a</a> [2]</td></tr>
+<tr class="memdesc:ab1d253eb24ba30eaf516ac429daab915"><td class="mdescLeft">&#160;</td><td class="mdescRight">polynomial coefficient <br /></td></tr>
+<tr class="separator:ab1d253eb24ba30eaf516ac429daab915"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Fq2 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq3_elem_str.html b/doc/html/struct_fq3_elem_str.html
new file mode 100644
index 0000000..08b911a
--- /dev/null
+++ b/doc/html/struct_fq3_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq3ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq3_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq3ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Fq3 element.
+ <a href="struct_fq3_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af1be0a4d5c9c674d75bec34f95e3c731"><td class="memItemLeft" align="right" valign="top"><a id="af1be0a4d5c9c674d75bec34f95e3c731"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq3_elem_str.html#af1be0a4d5c9c674d75bec34f95e3c731">a</a> [3]</td></tr>
+<tr class="memdesc:af1be0a4d5c9c674d75bec34f95e3c731"><td class="mdescLeft">&#160;</td><td class="mdescRight">polynomial coefficient <br /></td></tr>
+<tr class="separator:af1be0a4d5c9c674d75bec34f95e3c731"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Fq3 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq3_elem_str.html">Fq3ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq6_elem.html b/doc/html/struct_fq6_elem.html
new file mode 100644
index 0000000..a028e9a
--- /dev/null
+++ b/doc/html/struct_fq6_elem.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq6Elem Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq6_elem.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq6Elem Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of Fq6.
+ <a href="struct_fq6_elem.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a84522e736d8b9fb706c90aeef5e0fda2"><td class="memItemLeft" align="right" valign="top"><a id="a84522e736d8b9fb706c90aeef5e0fda2"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem.html#a84522e736d8b9fb706c90aeef5e0fda2">y0</a></td></tr>
+<tr class="memdesc:a84522e736d8b9fb706c90aeef5e0fda2"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq2. <br /></td></tr>
+<tr class="separator:a84522e736d8b9fb706c90aeef5e0fda2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac35469120214ab7d75767a8adeb9c0f6"><td class="memItemLeft" align="right" valign="top"><a id="ac35469120214ab7d75767a8adeb9c0f6"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem.html#ac35469120214ab7d75767a8adeb9c0f6">y1</a></td></tr>
+<tr class="memdesc:ac35469120214ab7d75767a8adeb9c0f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq2. <br /></td></tr>
+<tr class="separator:ac35469120214ab7d75767a8adeb9c0f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1753ef18695535ada56e337e8f6f7280"><td class="memItemLeft" align="right" valign="top"><a id="a1753ef18695535ada56e337e8f6f7280"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem.html#a1753ef18695535ada56e337e8f6f7280">y2</a></td></tr>
+<tr class="memdesc:a1753ef18695535ada56e337e8f6f7280"><td class="mdescLeft">&#160;</td><td class="mdescRight">A coefficent in Fq2. <br /></td></tr>
+<tr class="separator:a1753ef18695535ada56e337e8f6f7280"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of Fq6. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq6_elem.html">Fq6Elem</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq6_elem_str.html b/doc/html/struct_fq6_elem_str.html
new file mode 100644
index 0000000..b9eedf8
--- /dev/null
+++ b/doc/html/struct_fq6_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Fq6ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq6_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Fq6ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized Fq2^3 element.
+ <a href="struct_fq6_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a89d656e5c815b4a2382d11ef6932a7d2"><td class="memItemLeft" align="right" valign="top"><a id="a89d656e5c815b4a2382d11ef6932a7d2"></a>
+<a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem_str.html#a89d656e5c815b4a2382d11ef6932a7d2">a</a> [3]</td></tr>
+<tr class="memdesc:a89d656e5c815b4a2382d11ef6932a7d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">polynomial coefficient <br /></td></tr>
+<tr class="separator:a89d656e5c815b4a2382d11ef6932a7d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized Fq2^3 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq_elem.html b/doc/html/struct_fq_elem.html
new file mode 100644
index 0000000..478309b
--- /dev/null
+++ b/doc/html/struct_fq_elem.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: FqElem Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq_elem.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">FqElem Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Element of Fq.
+ <a href="struct_fq_elem.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad7d9feb0b777d58abfa9a31d6ddc466f"><td class="memItemLeft" align="right" valign="top"><a id="ad7d9feb0b777d58abfa9a31d6ddc466f"></a>
+<a class="el" href="struct_very_large_int.html">VeryLargeInt</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq_elem.html#ad7d9feb0b777d58abfa9a31d6ddc466f">limbs</a></td></tr>
+<tr class="memdesc:ad7d9feb0b777d58abfa9a31d6ddc466f"><td class="mdescLeft">&#160;</td><td class="mdescRight">An integer in [0, q-1]. <br /></td></tr>
+<tr class="separator:ad7d9feb0b777d58abfa9a31d6ddc466f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Element of Fq. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq_elem.html">FqElem</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_fq_elem_str.html b/doc/html/struct_fq_elem_str.html
new file mode 100644
index 0000000..b4750b7
--- /dev/null
+++ b/doc/html/struct_fq_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: FqElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_fq_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">FqElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>a number in [0, q-1]
+ <a href="struct_fq_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aac1a876b51a8d2c6d1510e4df2fd3f14"><td class="memItemLeft" align="right" valign="top"><a id="aac1a876b51a8d2c6d1510e4df2fd3f14"></a>
+<a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq_elem_str.html#aac1a876b51a8d2c6d1510e4df2fd3f14">data</a></td></tr>
+<tr class="memdesc:aac1a876b51a8d2c6d1510e4df2fd3f14"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit octet string <br /></td></tr>
+<tr class="separator:aac1a876b51a8d2c6d1510e4df2fd3f14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>a number in [0, q-1] </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_g1_elem_str.html b/doc/html/struct_g1_elem_str.html
new file mode 100644
index 0000000..8058799
--- /dev/null
+++ b/doc/html/struct_g1_elem_str.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: G1ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_g1_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">G1ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized G1 element.
+ <a href="struct_g1_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3b0e658d6e5697763ad9c633c11d4ec4"><td class="memItemLeft" align="right" valign="top"><a id="a3b0e658d6e5697763ad9c633c11d4ec4"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g1_elem_str.html#a3b0e658d6e5697763ad9c633c11d4ec4">x</a></td></tr>
+<tr class="memdesc:a3b0e658d6e5697763ad9c633c11d4ec4"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a3b0e658d6e5697763ad9c633c11d4ec4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f2455ca314e885ea180dadf84bf27c3"><td class="memItemLeft" align="right" valign="top"><a id="a8f2455ca314e885ea180dadf84bf27c3"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g1_elem_str.html#a8f2455ca314e885ea180dadf84bf27c3">y</a></td></tr>
+<tr class="memdesc:a8f2455ca314e885ea180dadf84bf27c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a8f2455ca314e885ea180dadf84bf27c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized G1 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_g2_elem_str.html b/doc/html/struct_g2_elem_str.html
new file mode 100644
index 0000000..1e87ee1
--- /dev/null
+++ b/doc/html/struct_g2_elem_str.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: G2ElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_g2_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">G2ElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized G2 element.
+ <a href="struct_g2_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a145ec5b20a6f4f00b080e11c8680afc3"><td class="memItemLeft" align="right" valign="top"><a id="a145ec5b20a6f4f00b080e11c8680afc3"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g2_elem_str.html#a145ec5b20a6f4f00b080e11c8680afc3">x</a> [2]</td></tr>
+<tr class="memdesc:a145ec5b20a6f4f00b080e11c8680afc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a145ec5b20a6f4f00b080e11c8680afc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43141b2458aecceed8ee2748270f7908"><td class="memItemLeft" align="right" valign="top"><a id="a43141b2458aecceed8ee2748270f7908"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g2_elem_str.html#a43141b2458aecceed8ee2748270f7908">y</a> [2]</td></tr>
+<tr class="memdesc:a43141b2458aecceed8ee2748270f7908"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:a43141b2458aecceed8ee2748270f7908"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized G2 element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_group_pub_key.html b/doc/html/struct_group_pub_key.html
new file mode 100644
index 0000000..fe0988c
--- /dev/null
+++ b/doc/html/struct_group_pub_key.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: GroupPubKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_group_pub_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">GroupPubKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 group public key.
+ <a href="struct_group_pub_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ae8e77ab4d5eb3c8e566c24a64cce56ee"><td class="memItemLeft" align="right" valign="top"><a id="ae8e77ab4d5eb3c8e566c24a64cce56ee"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html#ae8e77ab4d5eb3c8e566c24a64cce56ee">gid</a></td></tr>
+<tr class="memdesc:ae8e77ab4d5eb3c8e566c24a64cce56ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ae8e77ab4d5eb3c8e566c24a64cce56ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c22c758ea186f95e3bf4b2ef8451da5"><td class="memItemLeft" align="right" valign="top"><a id="a8c22c758ea186f95e3bf4b2ef8451da5"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html#a8c22c758ea186f95e3bf4b2ef8451da5">h1</a></td></tr>
+<tr class="memdesc:a8c22c758ea186f95e3bf4b2ef8451da5"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a8c22c758ea186f95e3bf4b2ef8451da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a4320ec99fd1a15df412fbf2a8d49f1"><td class="memItemLeft" align="right" valign="top"><a id="a2a4320ec99fd1a15df412fbf2a8d49f1"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html#a2a4320ec99fd1a15df412fbf2a8d49f1">h2</a></td></tr>
+<tr class="memdesc:a2a4320ec99fd1a15df412fbf2a8d49f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a2a4320ec99fd1a15df412fbf2a8d49f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86be439104fb60b324784baf24a943f9"><td class="memItemLeft" align="right" valign="top"><a id="a86be439104fb60b324784baf24a943f9"></a>
+<a class="el" href="struct_g2_elem_str.html">G2ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html#a86be439104fb60b324784baf24a943f9">w</a></td></tr>
+<tr class="memdesc:a86be439104fb60b324784baf24a943f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G2 <br /></td></tr>
+<tr class="separator:a86be439104fb60b324784baf24a943f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 group public key. </p>
+<p>Group public key: (gid, h1, h2, w) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_group_rl.html b/doc/html/struct_group_rl.html
new file mode 100644
index 0000000..b178c54
--- /dev/null
+++ b/doc/html/struct_group_rl.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: GroupRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_group_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">GroupRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>group revocation list
+ <a href="struct_group_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a69c41d99cdfc5b6ece7442f466f7ec3f"><td class="memItemLeft" align="right" valign="top"><a id="a69c41d99cdfc5b6ece7442f466f7ec3f"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_rl.html#a69c41d99cdfc5b6ece7442f466f7ec3f">version</a></td></tr>
+<tr class="memdesc:a69c41d99cdfc5b6ece7442f466f7ec3f"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a69c41d99cdfc5b6ece7442f466f7ec3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9067f01c63cdefbc8e23c3cf67a10172"><td class="memItemLeft" align="right" valign="top"><a id="a9067f01c63cdefbc8e23c3cf67a10172"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_rl.html#a9067f01c63cdefbc8e23c3cf67a10172">n3</a></td></tr>
+<tr class="memdesc:a9067f01c63cdefbc8e23c3cf67a10172"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in GroupRL <br /></td></tr>
+<tr class="separator:a9067f01c63cdefbc8e23c3cf67a10172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51022e172ab8b945efc69f1e63170107"><td class="memItemLeft" align="right" valign="top"><a id="a51022e172ab8b945efc69f1e63170107"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_rl.html#a51022e172ab8b945efc69f1e63170107">gid</a> [1]</td></tr>
+<tr class="memdesc:a51022e172ab8b945efc69f1e63170107"><td class="mdescLeft">&#160;</td><td class="mdescRight">revoked group IDs (flexible array) <br /></td></tr>
+<tr class="separator:a51022e172ab8b945efc69f1e63170107"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>group revocation list </p>
+<p>Group revocation list GroupRL: (RLver, n3, gid[0], ..., gid[n3-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_group_rl.html">GroupRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_gt_elem_str.html b/doc/html/struct_gt_elem_str.html
new file mode 100644
index 0000000..d9f39b5
--- /dev/null
+++ b/doc/html/struct_gt_elem_str.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: GtElemStr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_gt_elem_str.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">GtElemStr Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Serialized GT element.
+ <a href="struct_gt_elem_str.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aeaeb0e9e1c6efd378a475eb9a6c42132"><td class="memItemLeft" align="right" valign="top"><a id="aeaeb0e9e1c6efd378a475eb9a6c42132"></a>
+<a class="el" href="struct_fq_elem_str.html">FqElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_gt_elem_str.html#aeaeb0e9e1c6efd378a475eb9a6c42132">x</a> [12]</td></tr>
+<tr class="memdesc:aeaeb0e9e1c6efd378a475eb9a6c42132"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, q-1] <br /></td></tr>
+<tr class="separator:aeaeb0e9e1c6efd378a475eb9a6c42132"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Serialized GT element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_gt_elem_str.html">GtElemStr</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_i_priv_key.html b/doc/html/struct_i_priv_key.html
new file mode 100644
index 0000000..ad9beac
--- /dev/null
+++ b/doc/html/struct_i_priv_key.html
@@ -0,0 +1,104 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: IPrivKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_i_priv_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">IPrivKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 issuing private key.
+ <a href="struct_i_priv_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad400a4237b6d50855538fd40580eb1bb"><td class="memItemLeft" align="right" valign="top"><a id="ad400a4237b6d50855538fd40580eb1bb"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_i_priv_key.html#ad400a4237b6d50855538fd40580eb1bb">gid</a></td></tr>
+<tr class="memdesc:ad400a4237b6d50855538fd40580eb1bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ad400a4237b6d50855538fd40580eb1bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d484175317aef09fb959c3ca55fc70a"><td class="memItemLeft" align="right" valign="top"><a id="a6d484175317aef09fb959c3ca55fc70a"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_i_priv_key.html#a6d484175317aef09fb959c3ca55fc70a">gamma</a></td></tr>
+<tr class="memdesc:a6d484175317aef09fb959c3ca55fc70a"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a6d484175317aef09fb959c3ca55fc70a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 issuing private key. </p>
+<p>Issuing private key: (gid, gamma) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_i_priv_key.html">IPrivKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_join_request.html b/doc/html/struct_join_request.html
new file mode 100644
index 0000000..7a40202
--- /dev/null
+++ b/doc/html/struct_join_request.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: JoinRequest Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_join_request.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">JoinRequest Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Join request.
+ <a href="struct_join_request.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a005651506fd4511e8a3537f6c3634532"><td class="memItemLeft" align="right" valign="top"><a id="a005651506fd4511e8a3537f6c3634532"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_join_request.html#a005651506fd4511e8a3537f6c3634532">F</a></td></tr>
+<tr class="memdesc:a005651506fd4511e8a3537f6c3634532"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a005651506fd4511e8a3537f6c3634532"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55e30a274e83b808db6fbab5ae6c6cb8"><td class="memItemLeft" align="right" valign="top"><a id="a55e30a274e83b808db6fbab5ae6c6cb8"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_join_request.html#a55e30a274e83b808db6fbab5ae6c6cb8">c</a></td></tr>
+<tr class="memdesc:a55e30a274e83b808db6fbab5ae6c6cb8"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a55e30a274e83b808db6fbab5ae6c6cb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73bf8989df5f90eb3d06e7a42ad74d1d"><td class="memItemLeft" align="right" valign="top"><a id="a73bf8989df5f90eb3d06e7a42ad74d1d"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_join_request.html#a73bf8989df5f90eb3d06e7a42ad74d1d">s</a></td></tr>
+<tr class="memdesc:a73bf8989df5f90eb3d06e7a42ad74d1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a73bf8989df5f90eb3d06e7a42ad74d1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Join request. </p>
+<p>Join request: (F, c, s) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_join_request.html">JoinRequest</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_member_params.html b/doc/html/struct_member_params.html
new file mode 100644
index 0000000..a979019
--- /dev/null
+++ b/doc/html/struct_member_params.html
@@ -0,0 +1,109 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: MemberParams Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_member_params.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">MemberParams Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_member_module.html">member</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Software only specific member parameters.
+ <a href="struct_member_params.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/software_member.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad844c7a2be20bac70b118e7c08530c0b"><td class="memItemLeft" align="right" valign="top"><a id="ad844c7a2be20bac70b118e7c08530c0b"></a>
+<a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_params.html#ad844c7a2be20bac70b118e7c08530c0b">rnd_func</a></td></tr>
+<tr class="memdesc:ad844c7a2be20bac70b118e7c08530c0b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Random number generator. <br /></td></tr>
+<tr class="separator:ad844c7a2be20bac70b118e7c08530c0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7510f05e63328fa13cf2a3a3bd6acd95"><td class="memItemLeft" align="right" valign="top"><a id="a7510f05e63328fa13cf2a3a3bd6acd95"></a>
+void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_params.html#a7510f05e63328fa13cf2a3a3bd6acd95">rnd_param</a></td></tr>
+<tr class="memdesc:a7510f05e63328fa13cf2a3a3bd6acd95"><td class="mdescLeft">&#160;</td><td class="mdescRight">User data that will be passed to the user_data parameter of the random number generator. <br /></td></tr>
+<tr class="separator:a7510f05e63328fa13cf2a3a3bd6acd95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6782a38fd79477bccf2313c676ea4fc"><td class="memItemLeft" align="right" valign="top"><a id="ad6782a38fd79477bccf2313c676ea4fc"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_params.html#ad6782a38fd79477bccf2313c676ea4fc">f</a></td></tr>
+<tr class="memdesc:ad6782a38fd79477bccf2313c676ea4fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Secret part of the private key. If NULL a random value will be generated using rnd_func. <br /></td></tr>
+<tr class="separator:ad6782a38fd79477bccf2313c676ea4fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Software only specific member parameters. </p>
+<p>Implementation specific configuration parameters.</p>
+<p>You need to use a cryptographically secure random number generator to create a member context using <a class="el" href="group___epid_member_module.html#ga2b3c0cc1d8d4e50190ca94656fa36e24" title="Computes the size in bytes required for a member context. ">EpidMemberGetSize</a> and <a class="el" href="group___epid_member_module.html#ga35273b8e75d51e312f0d2fd3aa094efb" title="Initializes a new member context. ">EpidMemberInit</a>. The <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c" title="Generates random data. ">BitSupplier</a> is provided as a function prototype for your own implementation of the random number generator. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/<a class="el" href="software__member_8h.html">software_member.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_member_params.html">MemberParams</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_member_precomp.html b/doc/html/struct_member_precomp.html
new file mode 100644
index 0000000..925ca55
--- /dev/null
+++ b/doc/html/struct_member_precomp.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: MemberPrecomp Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_member_precomp.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">MemberPrecomp Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Pre-computed member settings.
+ <a href="struct_member_precomp.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a55e5c4b25c8f0f426969a8d745260fe5"><td class="memItemLeft" align="right" valign="top"><a id="a55e5c4b25c8f0f426969a8d745260fe5"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html#a55e5c4b25c8f0f426969a8d745260fe5">e12</a></td></tr>
+<tr class="memdesc:a55e5c4b25c8f0f426969a8d745260fe5"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a55e5c4b25c8f0f426969a8d745260fe5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e7412969bed3964f813b093b948e7b4"><td class="memItemLeft" align="right" valign="top"><a id="a4e7412969bed3964f813b093b948e7b4"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html#a4e7412969bed3964f813b093b948e7b4">e22</a></td></tr>
+<tr class="memdesc:a4e7412969bed3964f813b093b948e7b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a4e7412969bed3964f813b093b948e7b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a879d5a7b0c30088b23f6e5c5fc62f834"><td class="memItemLeft" align="right" valign="top"><a id="a879d5a7b0c30088b23f6e5c5fc62f834"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html#a879d5a7b0c30088b23f6e5c5fc62f834">e2w</a></td></tr>
+<tr class="memdesc:a879d5a7b0c30088b23f6e5c5fc62f834"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a879d5a7b0c30088b23f6e5c5fc62f834"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a573551f6494e372f44fd3bdf5b02aeda"><td class="memItemLeft" align="right" valign="top"><a id="a573551f6494e372f44fd3bdf5b02aeda"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html#a573551f6494e372f44fd3bdf5b02aeda">ea2</a></td></tr>
+<tr class="memdesc:a573551f6494e372f44fd3bdf5b02aeda"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a573551f6494e372f44fd3bdf5b02aeda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Pre-computed member settings. </p>
+<p>Serialized form of the information about a member that remains stable for a given set of keys.</p>
+<dl class="section note"><dt>Note</dt><dd>e12 = 0 implies that this data is not valid </dd></dl>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_membership_credential.html b/doc/html/struct_membership_credential.html
new file mode 100644
index 0000000..e271c3f
--- /dev/null
+++ b/doc/html/struct_membership_credential.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: MembershipCredential Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_membership_credential.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">MembershipCredential Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Membership credential.
+ <a href="struct_membership_credential.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:afbff64ec55888c7e2a658eabb5e16671"><td class="memItemLeft" align="right" valign="top"><a id="afbff64ec55888c7e2a658eabb5e16671"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_membership_credential.html#afbff64ec55888c7e2a658eabb5e16671">gid</a></td></tr>
+<tr class="memdesc:afbff64ec55888c7e2a658eabb5e16671"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:afbff64ec55888c7e2a658eabb5e16671"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d38ac3a9c5417833b8adb9b22bc9dc8"><td class="memItemLeft" align="right" valign="top"><a id="a6d38ac3a9c5417833b8adb9b22bc9dc8"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_membership_credential.html#a6d38ac3a9c5417833b8adb9b22bc9dc8">A</a></td></tr>
+<tr class="memdesc:a6d38ac3a9c5417833b8adb9b22bc9dc8"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a6d38ac3a9c5417833b8adb9b22bc9dc8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c5c0d22999d6917fea5ad6618883bcf"><td class="memItemLeft" align="right" valign="top"><a id="a2c5c0d22999d6917fea5ad6618883bcf"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_membership_credential.html#a2c5c0d22999d6917fea5ad6618883bcf">x</a></td></tr>
+<tr class="memdesc:a2c5c0d22999d6917fea5ad6618883bcf"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a2c5c0d22999d6917fea5ad6618883bcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Membership credential. </p>
+<p>Membership credential: (gid, A, x) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_membership_credential.html">MembershipCredential</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_nr_proof.html b/doc/html/struct_nr_proof.html
new file mode 100644
index 0000000..2539c2a
--- /dev/null
+++ b/doc/html/struct_nr_proof.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: NrProof Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_nr_proof.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">NrProof Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>non-revoked Proof.
+ <a href="struct_nr_proof.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ace535065bbf96502b893ac677dc8dcd3"><td class="memItemLeft" align="right" valign="top"><a id="ace535065bbf96502b893ac677dc8dcd3"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html#ace535065bbf96502b893ac677dc8dcd3">T</a></td></tr>
+<tr class="memdesc:ace535065bbf96502b893ac677dc8dcd3"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:ace535065bbf96502b893ac677dc8dcd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0de1aa69acf3d93da34cf4a613b359a1"><td class="memItemLeft" align="right" valign="top"><a id="a0de1aa69acf3d93da34cf4a613b359a1"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html#a0de1aa69acf3d93da34cf4a613b359a1">c</a></td></tr>
+<tr class="memdesc:a0de1aa69acf3d93da34cf4a613b359a1"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a0de1aa69acf3d93da34cf4a613b359a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a717ec36a6c91acd01d9b642bb20fc178"><td class="memItemLeft" align="right" valign="top"><a id="a717ec36a6c91acd01d9b642bb20fc178"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html#a717ec36a6c91acd01d9b642bb20fc178">smu</a></td></tr>
+<tr class="memdesc:a717ec36a6c91acd01d9b642bb20fc178"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:a717ec36a6c91acd01d9b642bb20fc178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2e9f22089793a4d44a0f7f5cdb78a0c"><td class="memItemLeft" align="right" valign="top"><a id="ae2e9f22089793a4d44a0f7f5cdb78a0c"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html#ae2e9f22089793a4d44a0f7f5cdb78a0c">snu</a></td></tr>
+<tr class="memdesc:ae2e9f22089793a4d44a0f7f5cdb78a0c"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:ae2e9f22089793a4d44a0f7f5cdb78a0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>non-revoked Proof. </p>
+<p>Non-revoked Proof: (T, c, smu, snu) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_nr_proof.html">NrProof</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str128.html b/doc/html/struct_oct_str128.html
new file mode 100644
index 0000000..bd66b48
--- /dev/null
+++ b/doc/html/struct_oct_str128.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr128 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str128.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr128 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>128 bit octet string
+ <a href="struct_oct_str128.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a7482aa9b0b580fdd50bd65419d52d4b9"><td class="memItemLeft" align="right" valign="top"><a id="a7482aa9b0b580fdd50bd65419d52d4b9"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str128.html#a7482aa9b0b580fdd50bd65419d52d4b9">data</a> [128/CHAR_BIT]</td></tr>
+<tr class="memdesc:a7482aa9b0b580fdd50bd65419d52d4b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">128 bit data <br /></td></tr>
+<tr class="separator:a7482aa9b0b580fdd50bd65419d52d4b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>128 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str128.html">OctStr128</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str16.html b/doc/html/struct_oct_str16.html
new file mode 100644
index 0000000..14477c6
--- /dev/null
+++ b/doc/html/struct_oct_str16.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr16 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str16.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr16 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>16 bit octet string
+ <a href="struct_oct_str16.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a86ed6671693a3f60ec4ff7de2c1206c3"><td class="memItemLeft" align="right" valign="top"><a id="a86ed6671693a3f60ec4ff7de2c1206c3"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str16.html#a86ed6671693a3f60ec4ff7de2c1206c3">data</a> [16/CHAR_BIT]</td></tr>
+<tr class="memdesc:a86ed6671693a3f60ec4ff7de2c1206c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">16 bit data <br /></td></tr>
+<tr class="separator:a86ed6671693a3f60ec4ff7de2c1206c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>16 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str16.html">OctStr16</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str256.html b/doc/html/struct_oct_str256.html
new file mode 100644
index 0000000..2f275e1
--- /dev/null
+++ b/doc/html/struct_oct_str256.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr256 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str256.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr256 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>256 bit octet string
+ <a href="struct_oct_str256.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a359781bb84f5717a16094583a00ef14e"><td class="memItemLeft" align="right" valign="top"><a id="a359781bb84f5717a16094583a00ef14e"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str256.html#a359781bb84f5717a16094583a00ef14e">data</a> [256/CHAR_BIT]</td></tr>
+<tr class="memdesc:a359781bb84f5717a16094583a00ef14e"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit data <br /></td></tr>
+<tr class="separator:a359781bb84f5717a16094583a00ef14e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>256 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str256.html">OctStr256</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str32.html b/doc/html/struct_oct_str32.html
new file mode 100644
index 0000000..5d184a5
--- /dev/null
+++ b/doc/html/struct_oct_str32.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str32.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr32 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>32 bit octet string
+ <a href="struct_oct_str32.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5588a7e70f3d73f6ce58b567a9f5c5c8"><td class="memItemLeft" align="right" valign="top"><a id="a5588a7e70f3d73f6ce58b567a9f5c5c8"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str32.html#a5588a7e70f3d73f6ce58b567a9f5c5c8">data</a> [32/CHAR_BIT]</td></tr>
+<tr class="memdesc:a5588a7e70f3d73f6ce58b567a9f5c5c8"><td class="mdescLeft">&#160;</td><td class="mdescRight">32 bit data <br /></td></tr>
+<tr class="separator:a5588a7e70f3d73f6ce58b567a9f5c5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>32 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str32.html">OctStr32</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str512.html b/doc/html/struct_oct_str512.html
new file mode 100644
index 0000000..141e0c6
--- /dev/null
+++ b/doc/html/struct_oct_str512.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr512 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str512.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr512 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>512 bit octet string
+ <a href="struct_oct_str512.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:abd4d1b97fe49321571da86de1aeac653"><td class="memItemLeft" align="right" valign="top"><a id="abd4d1b97fe49321571da86de1aeac653"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str512.html#abd4d1b97fe49321571da86de1aeac653">data</a> [512/CHAR_BIT]</td></tr>
+<tr class="memdesc:abd4d1b97fe49321571da86de1aeac653"><td class="mdescLeft">&#160;</td><td class="mdescRight">512 bit data <br /></td></tr>
+<tr class="separator:abd4d1b97fe49321571da86de1aeac653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>512 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str512.html">OctStr512</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str600.html b/doc/html/struct_oct_str600.html
new file mode 100644
index 0000000..f995ed9
--- /dev/null
+++ b/doc/html/struct_oct_str600.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr600 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str600.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr600 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>600 bit octet string
+ <a href="struct_oct_str600.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a06d53af92a06e1decc6062fd16c43a59"><td class="memItemLeft" align="right" valign="top"><a id="a06d53af92a06e1decc6062fd16c43a59"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str600.html#a06d53af92a06e1decc6062fd16c43a59">data</a> [600/CHAR_BIT]</td></tr>
+<tr class="memdesc:a06d53af92a06e1decc6062fd16c43a59"><td class="mdescLeft">&#160;</td><td class="mdescRight">600 bit data <br /></td></tr>
+<tr class="separator:a06d53af92a06e1decc6062fd16c43a59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>600 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str600.html">OctStr600</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str64.html b/doc/html/struct_oct_str64.html
new file mode 100644
index 0000000..5df1777
--- /dev/null
+++ b/doc/html/struct_oct_str64.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr64 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str64.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr64 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>64 bit octet string
+ <a href="struct_oct_str64.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0e107d78192a5ae0b48ed9e5c4eab0fc"><td class="memItemLeft" align="right" valign="top"><a id="a0e107d78192a5ae0b48ed9e5c4eab0fc"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str64.html#a0e107d78192a5ae0b48ed9e5c4eab0fc">data</a> [64/CHAR_BIT]</td></tr>
+<tr class="memdesc:a0e107d78192a5ae0b48ed9e5c4eab0fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">64 bit data <br /></td></tr>
+<tr class="separator:a0e107d78192a5ae0b48ed9e5c4eab0fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>64 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str64.html">OctStr64</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str768.html b/doc/html/struct_oct_str768.html
new file mode 100644
index 0000000..0927dd7
--- /dev/null
+++ b/doc/html/struct_oct_str768.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr768 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str768.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr768 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>768 bit octet string
+ <a href="struct_oct_str768.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ae45eea89259bd22e60a8d960063921cc"><td class="memItemLeft" align="right" valign="top"><a id="ae45eea89259bd22e60a8d960063921cc"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str768.html#ae45eea89259bd22e60a8d960063921cc">data</a> [768/CHAR_BIT]</td></tr>
+<tr class="memdesc:ae45eea89259bd22e60a8d960063921cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">768 bit data <br /></td></tr>
+<tr class="separator:ae45eea89259bd22e60a8d960063921cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>768 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str768.html">OctStr768</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str8.html b/doc/html/struct_oct_str8.html
new file mode 100644
index 0000000..40bb444
--- /dev/null
+++ b/doc/html/struct_oct_str8.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr8 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str8.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr8 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>8 bit octet string
+ <a href="struct_oct_str8.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5e6c56fda48c88b419e621b464b03bef"><td class="memItemLeft" align="right" valign="top"><a id="a5e6c56fda48c88b419e621b464b03bef"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str8.html#a5e6c56fda48c88b419e621b464b03bef">data</a> [8/CHAR_BIT]</td></tr>
+<tr class="memdesc:a5e6c56fda48c88b419e621b464b03bef"><td class="mdescLeft">&#160;</td><td class="mdescRight">8 bit data <br /></td></tr>
+<tr class="separator:a5e6c56fda48c88b419e621b464b03bef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>8 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str8.html">OctStr8</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_oct_str80.html b/doc/html/struct_oct_str80.html
new file mode 100644
index 0000000..ec482ef
--- /dev/null
+++ b/doc/html/struct_oct_str80.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: OctStr80 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_oct_str80.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">OctStr80 Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a> &raquo; <a class="el" href="group___epid11_types.html">Intel(R) EPID 1.1 specific types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>80 bit octet string
+ <a href="struct_oct_str80.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/1.1/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af80e2b81554109d9a41c5e771aceb8c9"><td class="memItemLeft" align="right" valign="top"><a id="af80e2b81554109d9a41c5e771aceb8c9"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str80.html#af80e2b81554109d9a41c5e771aceb8c9">data</a> [80/CHAR_BIT]</td></tr>
+<tr class="memdesc:af80e2b81554109d9a41c5e771aceb8c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">80 bit data <br /></td></tr>
+<tr class="separator:af80e2b81554109d9a41c5e771aceb8c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>80 bit octet string </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/1.1/<a class="el" href="1_81_2types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_oct_str80.html">OctStr80</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_pairing_state.html b/doc/html/struct_pairing_state.html
new file mode 100644
index 0000000..4901696
--- /dev/null
+++ b/doc/html/struct_pairing_state.html
@@ -0,0 +1,100 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: PairingState Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_pairing_state.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">PairingState Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A scratch buffer for stateful pairing calls.
+ <a href="struct_pairing_state.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0e19d5e16a81645aca678e04b88758da"><td class="memItemLeft" align="right" valign="top"><a id="a0e19d5e16a81645aca678e04b88758da"></a>
+<a class="el" href="struct_fq2_elem.html">Fq2Elem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_pairing_state.html#a0e19d5e16a81645aca678e04b88758da">g</a> [3][5]</td></tr>
+<tr class="memdesc:a0e19d5e16a81645aca678e04b88758da"><td class="mdescLeft">&#160;</td><td class="mdescRight">pairing scratch data <br /></td></tr>
+<tr class="separator:a0e19d5e16a81645aca678e04b88758da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A scratch buffer for stateful pairing calls. </p>
+<p>A pairing. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_pairing_state.html">PairingState</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_priv_key.html b/doc/html/struct_priv_key.html
new file mode 100644
index 0000000..dba661d
--- /dev/null
+++ b/doc/html/struct_priv_key.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: PrivKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_priv_key.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">PrivKey Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 2.0 private key.
+ <a href="struct_priv_key.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab416dcb4366427c24b44c2a02e4ae7c8"><td class="memItemLeft" align="right" valign="top"><a id="ab416dcb4366427c24b44c2a02e4ae7c8"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html#ab416dcb4366427c24b44c2a02e4ae7c8">gid</a></td></tr>
+<tr class="memdesc:ab416dcb4366427c24b44c2a02e4ae7c8"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ab416dcb4366427c24b44c2a02e4ae7c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a266c7e369b8b868ef5755e9cd3c0c849"><td class="memItemLeft" align="right" valign="top"><a id="a266c7e369b8b868ef5755e9cd3c0c849"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html#a266c7e369b8b868ef5755e9cd3c0c849">A</a></td></tr>
+<tr class="memdesc:a266c7e369b8b868ef5755e9cd3c0c849"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a266c7e369b8b868ef5755e9cd3c0c849"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa805f9e124f05bdb733c85cb93614cbd"><td class="memItemLeft" align="right" valign="top"><a id="aa805f9e124f05bdb733c85cb93614cbd"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html#aa805f9e124f05bdb733c85cb93614cbd">x</a></td></tr>
+<tr class="memdesc:aa805f9e124f05bdb733c85cb93614cbd"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:aa805f9e124f05bdb733c85cb93614cbd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7ee0392a583edd2e287cf8c1f9066ba"><td class="memItemLeft" align="right" valign="top"><a id="ad7ee0392a583edd2e287cf8c1f9066ba"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html#ad7ee0392a583edd2e287cf8c1f9066ba">f</a></td></tr>
+<tr class="memdesc:ad7ee0392a583edd2e287cf8c1f9066ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">an integer between [0, p-1] <br /></td></tr>
+<tr class="separator:ad7ee0392a583edd2e287cf8c1f9066ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 2.0 private key. </p>
+<p>Private key: (gid, A, x, f) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_priv_key.html">PrivKey</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_priv_rl.html b/doc/html/struct_priv_rl.html
new file mode 100644
index 0000000..216d9c8
--- /dev/null
+++ b/doc/html/struct_priv_rl.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: PrivRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_priv_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">PrivRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>private-key based revocation list.
+ <a href="struct_priv_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af7317529b8e55476bd06b66ed8131d64"><td class="memItemLeft" align="right" valign="top"><a id="af7317529b8e55476bd06b66ed8131d64"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html#af7317529b8e55476bd06b66ed8131d64">gid</a></td></tr>
+<tr class="memdesc:af7317529b8e55476bd06b66ed8131d64"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:af7317529b8e55476bd06b66ed8131d64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c6b51cec760f7e81ca8635422ac6a50"><td class="memItemLeft" align="right" valign="top"><a id="a4c6b51cec760f7e81ca8635422ac6a50"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html#a4c6b51cec760f7e81ca8635422ac6a50">version</a></td></tr>
+<tr class="memdesc:a4c6b51cec760f7e81ca8635422ac6a50"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:a4c6b51cec760f7e81ca8635422ac6a50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6da9639ec4061689d1c30a58e0befd14"><td class="memItemLeft" align="right" valign="top"><a id="a6da9639ec4061689d1c30a58e0befd14"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html#a6da9639ec4061689d1c30a58e0befd14">n1</a></td></tr>
+<tr class="memdesc:a6da9639ec4061689d1c30a58e0befd14"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in PrivRL <br /></td></tr>
+<tr class="separator:a6da9639ec4061689d1c30a58e0befd14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60d73f9ef5fc81f117b3abadf8c18466"><td class="memItemLeft" align="right" valign="top"><a id="a60d73f9ef5fc81f117b3abadf8c18466"></a>
+<a class="el" href="struct_fp_elem_str.html">FpElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html#a60d73f9ef5fc81f117b3abadf8c18466">f</a> [1]</td></tr>
+<tr class="memdesc:a60d73f9ef5fc81f117b3abadf8c18466"><td class="mdescLeft">&#160;</td><td class="mdescRight">integers between [1, p-1] (flexible array) <br /></td></tr>
+<tr class="separator:a60d73f9ef5fc81f117b3abadf8c18466"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>private-key based revocation list. </p>
+<p>Private-key based revocation list PrivRL: (gid, RLver, n1, f[0], ..., f[n1-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_priv_rl.html">PrivRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_sha256_digest.html b/doc/html/struct_sha256_digest.html
new file mode 100644
index 0000000..d3c75ef
--- /dev/null
+++ b/doc/html/struct_sha256_digest.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Sha256Digest Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_sha256_digest.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Sha256Digest Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_math.html">math</a> &raquo; <a class="el" href="group___hash_primitives.html">hash</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SHA256 digest.
+ <a href="struct_sha256_digest.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/math/hash.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a4b6462ddd3f89e4c40220ceb6b1c7f28"><td class="memItemLeft" align="right" valign="top"><a id="a4b6462ddd3f89e4c40220ceb6b1c7f28"></a>
+unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sha256_digest.html#a4b6462ddd3f89e4c40220ceb6b1c7f28">data</a> [256/CHAR_BIT]</td></tr>
+<tr class="memdesc:a4b6462ddd3f89e4c40220ceb6b1c7f28"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit data <br /></td></tr>
+<tr class="separator:a4b6462ddd3f89e4c40220ceb6b1c7f28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SHA256 digest. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/math/<a class="el" href="hash_8h.html">hash.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_sha256_digest.html">Sha256Digest</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_sig_rl.html b/doc/html/struct_sig_rl.html
new file mode 100644
index 0000000..7d714d4
--- /dev/null
+++ b/doc/html/struct_sig_rl.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: SigRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_sig_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">SigRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>signature based revocation list
+ <a href="struct_sig_rl.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a12757d30fcccd310716433948e0b603e"><td class="memItemLeft" align="right" valign="top"><a id="a12757d30fcccd310716433948e0b603e"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html#a12757d30fcccd310716433948e0b603e">gid</a></td></tr>
+<tr class="memdesc:a12757d30fcccd310716433948e0b603e"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:a12757d30fcccd310716433948e0b603e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9d4c343c539dba799e1f42eb38b351f"><td class="memItemLeft" align="right" valign="top"><a id="ac9d4c343c539dba799e1f42eb38b351f"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html#ac9d4c343c539dba799e1f42eb38b351f">version</a></td></tr>
+<tr class="memdesc:ac9d4c343c539dba799e1f42eb38b351f"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:ac9d4c343c539dba799e1f42eb38b351f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dfb6b508db9051f4dc480a51d702af2"><td class="memItemLeft" align="right" valign="top"><a id="a9dfb6b508db9051f4dc480a51d702af2"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html#a9dfb6b508db9051f4dc480a51d702af2">n2</a></td></tr>
+<tr class="memdesc:a9dfb6b508db9051f4dc480a51d702af2"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in SigRL <br /></td></tr>
+<tr class="separator:a9dfb6b508db9051f4dc480a51d702af2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac23a919993d99d24a5150302f1778102"><td class="memItemLeft" align="right" valign="top"><a id="ac23a919993d99d24a5150302f1778102"></a>
+<a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html#ac23a919993d99d24a5150302f1778102">bk</a> [1]</td></tr>
+<tr class="memdesc:ac23a919993d99d24a5150302f1778102"><td class="mdescLeft">&#160;</td><td class="mdescRight">revoked Bs and Ks (flexible array) <br /></td></tr>
+<tr class="separator:ac23a919993d99d24a5150302f1778102"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>signature based revocation list </p>
+<p>Signature based revocation list SigRL: (gid, RLver, n2, B[0], K[0], ..., B[n2-1], K[n2-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_sig_rl.html">SigRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_sig_rl_entry.html b/doc/html/struct_sig_rl_entry.html
new file mode 100644
index 0000000..f861d87
--- /dev/null
+++ b/doc/html/struct_sig_rl_entry.html
@@ -0,0 +1,103 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: SigRlEntry Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_sig_rl_entry.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">SigRlEntry Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>entry in SigRL (B,K)
+ <a href="struct_sig_rl_entry.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac6a47ff0d1b8ea1512e0ff14983ac5ce"><td class="memItemLeft" align="right" valign="top"><a id="ac6a47ff0d1b8ea1512e0ff14983ac5ce"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl_entry.html#ac6a47ff0d1b8ea1512e0ff14983ac5ce">b</a></td></tr>
+<tr class="memdesc:ac6a47ff0d1b8ea1512e0ff14983ac5ce"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element of G1 <br /></td></tr>
+<tr class="separator:ac6a47ff0d1b8ea1512e0ff14983ac5ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0dfeb058614e81878bfbf86ae3edac3c"><td class="memItemLeft" align="right" valign="top"><a id="a0dfeb058614e81878bfbf86ae3edac3c"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl_entry.html#a0dfeb058614e81878bfbf86ae3edac3c">k</a></td></tr>
+<tr class="memdesc:a0dfeb058614e81878bfbf86ae3edac3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element of G1 <br /></td></tr>
+<tr class="separator:a0dfeb058614e81878bfbf86ae3edac3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>entry in SigRL (B,K) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_tpm2_ctx.html b/doc/html/struct_tpm2_ctx.html
new file mode 100644
index 0000000..735525b
--- /dev/null
+++ b/doc/html/struct_tpm2_ctx.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: Tpm2Ctx Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_tpm2_ctx.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">Tpm2Ctx Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>TPM TSS context definition.
+ <a href="struct_tpm2_ctx.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tpm2/ibm_tss/state.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:add1c4c767abfee8bf87068ac03c52db1"><td class="memItemLeft" align="right" valign="top"><a id="add1c4c767abfee8bf87068ac03c52db1"></a>
+TSS_CONTEXT *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_tpm2_ctx.html#add1c4c767abfee8bf87068ac03c52db1">tss</a></td></tr>
+<tr class="memdesc:add1c4c767abfee8bf87068ac03c52db1"><td class="mdescLeft">&#160;</td><td class="mdescRight">TSS context. <br /></td></tr>
+<tr class="separator:add1c4c767abfee8bf87068ac03c52db1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9cb082159a9ca169b6666779985a705"><td class="memItemLeft" align="right" valign="top"><a id="ac9cb082159a9ca169b6666779985a705"></a>
+Epid2Params_ const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_tpm2_ctx.html#ac9cb082159a9ca169b6666779985a705">epid2_params</a></td></tr>
+<tr class="memdesc:ac9cb082159a9ca169b6666779985a705"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 params. <br /></td></tr>
+<tr class="separator:ac9cb082159a9ca169b6666779985a705"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad71eba97fbd7d36ac1dd51ffc67791ce"><td class="memItemLeft" align="right" valign="top"><a id="ad71eba97fbd7d36ac1dd51ffc67791ce"></a>
+TPM_HANDLE&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_tpm2_ctx.html#ad71eba97fbd7d36ac1dd51ffc67791ce">key_handle</a></td></tr>
+<tr class="memdesc:ad71eba97fbd7d36ac1dd51ffc67791ce"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle to f value of private key. <br /></td></tr>
+<tr class="separator:ad71eba97fbd7d36ac1dd51ffc67791ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48940c01483e2e6ba4bd1475fba16fdd"><td class="memItemLeft" align="right" valign="top"><a id="a48940c01483e2e6ba4bd1475fba16fdd"></a>
+<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_tpm2_ctx.html#a48940c01483e2e6ba4bd1475fba16fdd">hash_alg</a></td></tr>
+<tr class="memdesc:a48940c01483e2e6ba4bd1475fba16fdd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash algorithm to use. <br /></td></tr>
+<tr class="separator:a48940c01483e2e6ba4bd1475fba16fdd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TPM TSS context definition. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tpm2/ibm_tss/<a class="el" href="state_8h.html">state.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_tpm2_ctx.html">Tpm2Ctx</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_verifier_precomp.html b/doc/html/struct_verifier_precomp.html
new file mode 100644
index 0000000..635fcbd
--- /dev/null
+++ b/doc/html/struct_verifier_precomp.html
@@ -0,0 +1,117 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: VerifierPrecomp Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_verifier_precomp.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">VerifierPrecomp Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_verifier_module.html">verifier</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Pre-computed verifier settings.
+ <a href="struct_verifier_precomp.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/verifier/api.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:afc3e29a325c95c62bb192d5f8cdd5c1c"><td class="memItemLeft" align="right" valign="top"><a id="afc3e29a325c95c62bb192d5f8cdd5c1c"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html#afc3e29a325c95c62bb192d5f8cdd5c1c">gid</a></td></tr>
+<tr class="memdesc:afc3e29a325c95c62bb192d5f8cdd5c1c"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:afc3e29a325c95c62bb192d5f8cdd5c1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1106376f12772942af0331eb74de6e5"><td class="memItemLeft" align="right" valign="top"><a id="ad1106376f12772942af0331eb74de6e5"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html#ad1106376f12772942af0331eb74de6e5">e12</a></td></tr>
+<tr class="memdesc:ad1106376f12772942af0331eb74de6e5"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:ad1106376f12772942af0331eb74de6e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8fd90f3a5a2be932a97dcd86099d5b2"><td class="memItemLeft" align="right" valign="top"><a id="af8fd90f3a5a2be932a97dcd86099d5b2"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html#af8fd90f3a5a2be932a97dcd86099d5b2">e22</a></td></tr>
+<tr class="memdesc:af8fd90f3a5a2be932a97dcd86099d5b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:af8fd90f3a5a2be932a97dcd86099d5b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8caf79578e3c0baf91921460391103ca"><td class="memItemLeft" align="right" valign="top"><a id="a8caf79578e3c0baf91921460391103ca"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html#a8caf79578e3c0baf91921460391103ca">e2w</a></td></tr>
+<tr class="memdesc:a8caf79578e3c0baf91921460391103ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:a8caf79578e3c0baf91921460391103ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab061d6cc07d1467eeb5bf25f3ea7e306"><td class="memItemLeft" align="right" valign="top"><a id="ab061d6cc07d1467eeb5bf25f3ea7e306"></a>
+<a class="el" href="struct_gt_elem_str.html">GtElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html#ab061d6cc07d1467eeb5bf25f3ea7e306">eg12</a></td></tr>
+<tr class="memdesc:ab061d6cc07d1467eeb5bf25f3ea7e306"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in GT <br /></td></tr>
+<tr class="separator:ab061d6cc07d1467eeb5bf25f3ea7e306"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Pre-computed verifier settings. </p>
+<p>Serialized form of the information about a verifier that remains stable for a given set of keys.</p>
+<dl class="section note"><dt>Note</dt><dd>e12 = 0 implies that this data is not valid </dd></dl>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/verifier/<a class="el" href="verifier_2api_8h.html">api.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_verifier_rl.html b/doc/html/struct_verifier_rl.html
new file mode 100644
index 0000000..8363487
--- /dev/null
+++ b/doc/html/struct_verifier_rl.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: VerifierRl Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_verifier_rl.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">VerifierRl Struct Reference<div class="ingroups"><a class="el" href="group___epid_module.html">epid&amp;nbsp;</a> &raquo; <a class="el" href="group___epid_common.html">common</a> &raquo; <a class="el" href="group___epid_types.html">types</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;epid/common/types.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab85c4666d16145ff16443e84468d2d7d"><td class="memItemLeft" align="right" valign="top"><a id="ab85c4666d16145ff16443e84468d2d7d"></a>
+<a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html#ab85c4666d16145ff16443e84468d2d7d">gid</a></td></tr>
+<tr class="memdesc:ab85c4666d16145ff16443e84468d2d7d"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:ab85c4666d16145ff16443e84468d2d7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d9a9265fffa96fd5f9260543eb08c68"><td class="memItemLeft" align="right" valign="top"><a id="a5d9a9265fffa96fd5f9260543eb08c68"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html#a5d9a9265fffa96fd5f9260543eb08c68">B</a></td></tr>
+<tr class="memdesc:a5d9a9265fffa96fd5f9260543eb08c68"><td class="mdescLeft">&#160;</td><td class="mdescRight">an element in G1 <br /></td></tr>
+<tr class="separator:a5d9a9265fffa96fd5f9260543eb08c68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa44ab69ffff5a3508366aeb2131fdaa"><td class="memItemLeft" align="right" valign="top"><a id="afa44ab69ffff5a3508366aeb2131fdaa"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html#afa44ab69ffff5a3508366aeb2131fdaa">version</a></td></tr>
+<tr class="memdesc:afa44ab69ffff5a3508366aeb2131fdaa"><td class="mdescLeft">&#160;</td><td class="mdescRight">revocation list version number <br /></td></tr>
+<tr class="separator:afa44ab69ffff5a3508366aeb2131fdaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e3f84b873bccc0c882aa6432c42d2f7"><td class="memItemLeft" align="right" valign="top"><a id="a1e3f84b873bccc0c882aa6432c42d2f7"></a>
+<a class="el" href="struct_oct_str32.html">OctStr32</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html#a1e3f84b873bccc0c882aa6432c42d2f7">n4</a></td></tr>
+<tr class="memdesc:a1e3f84b873bccc0c882aa6432c42d2f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">number of entries in VerifierRL <br /></td></tr>
+<tr class="separator:a1e3f84b873bccc0c882aa6432c42d2f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac7d3dceab4772096bbbeb3fa735d18a9"><td class="memItemLeft" align="right" valign="top"><a id="ac7d3dceab4772096bbbeb3fa735d18a9"></a>
+<a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html#ac7d3dceab4772096bbbeb3fa735d18a9">K</a> [1]</td></tr>
+<tr class="memdesc:ac7d3dceab4772096bbbeb3fa735d18a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">elements in G1 (flexible array) <br /></td></tr>
+<tr class="separator:ac7d3dceab4772096bbbeb3fa735d18a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>verifier revocation list Verifier revocation list VerifierRL: (gid, B, RLver, n4, K[0], ..., K[n4-1]) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/common/<a class="el" href="types_8h.html">types.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_verifier_rl.html">VerifierRl</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_very_large_int.html b/doc/html/struct_very_large_int.html
new file mode 100644
index 0000000..5c43e5c
--- /dev/null
+++ b/doc/html/struct_very_large_int.html
@@ -0,0 +1,100 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: VeryLargeInt Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_very_large_int.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">VeryLargeInt Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Large integer.
+ <a href="struct_very_large_int.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a42fb1bb370910b7fadf474b421b29eb8"><td class="memItemLeft" align="right" valign="top"><a id="a42fb1bb370910b7fadf474b421b29eb8"></a>
+uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_very_large_int.html#a42fb1bb370910b7fadf474b421b29eb8">word</a> [<a class="el" href="mathtypes_8h.html#a94d0ffa1ccb9d2f09d1ada23a5807021">NUM_ECC_DIGITS</a>]</td></tr>
+<tr class="memdesc:a42fb1bb370910b7fadf474b421b29eb8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Large integer data. <br /></td></tr>
+<tr class="separator:a42fb1bb370910b7fadf474b421b29eb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Large integer. </p>
+<p>VeryLargeInt* is always expected to point to a buffer with NUM_ECC_DIGITS uint32_t sized words. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/struct_very_large_int_product.html b/doc/html/struct_very_large_int_product.html
new file mode 100644
index 0000000..2f68680
--- /dev/null
+++ b/doc/html/struct_very_large_int_product.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: VeryLargeIntProduct Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('struct_very_large_int_product.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">VeryLargeIntProduct Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Used for multiplication.
+ <a href="struct_very_large_int_product.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/mathtypes.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a02a4e20db872ec6264e614ac0f1438be"><td class="memItemLeft" align="right" valign="top"><a id="a02a4e20db872ec6264e614ac0f1438be"></a>
+uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_very_large_int_product.html#a02a4e20db872ec6264e614ac0f1438be">word</a> [2 *<a class="el" href="mathtypes_8h.html#a94d0ffa1ccb9d2f09d1ada23a5807021">NUM_ECC_DIGITS</a>]</td></tr>
+<tr class="memdesc:a02a4e20db872ec6264e614ac0f1438be"><td class="mdescLeft">&#160;</td><td class="mdescRight">Large integer data. <br /></td></tr>
+<tr class="separator:a02a4e20db872ec6264e614ac0f1438be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Used for multiplication. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="mathtypes_8h.html">mathtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/structtiny__sha.html b/doc/html/structtiny__sha.html
new file mode 100644
index 0000000..f77a21f
--- /dev/null
+++ b/doc/html/structtiny__sha.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: tiny_sha Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('structtiny__sha.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">tiny_sha Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Tiny Sha wrapper Element.
+ <a href="structtiny__sha.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/hashwrap.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a414a745937e610b84c0f6942470b531c"><td class="memItemLeft" ><a id="a414a745937e610b84c0f6942470b531c"></a>
+union {</td></tr>
+<tr class="memitem:ae57f00079dbef220b860d581e1bd633b"><td class="memItemLeft" >
+&#160;&#160;&#160;sha512_state&#160;&#160;&#160;<a class="el" href="structtiny__sha.html#a10addc820d663785aa5dd90c572bf953">sha512s</a></td></tr>
+<tr class="memdesc:ae57f00079dbef220b860d581e1bd633b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The state of sha512 if supported. <br /></td></tr>
+<tr class="separator:ae57f00079dbef220b860d581e1bd633b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7b4d7fa6c79d15428808b13066c5076"><td class="memItemLeft" >
+&#160;&#160;&#160;sha256_state&#160;&#160;&#160;<a class="el" href="structtiny__sha.html#a40fd76fa2a0395295d4747ce2cb80888">sha256s</a></td></tr>
+<tr class="memdesc:ae7b4d7fa6c79d15428808b13066c5076"><td class="mdescLeft">&#160;</td><td class="mdescRight">The state of sha256 if supported. <br /></td></tr>
+<tr class="separator:ae7b4d7fa6c79d15428808b13066c5076"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a414a745937e610b84c0f6942470b531c"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtiny__sha.html#a414a745937e610b84c0f6942470b531c">sha_state_t</a></td></tr>
+<tr class="memdesc:a414a745937e610b84c0f6942470b531c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Store state of hash algorithm. <br /></td></tr>
+<tr class="separator:a414a745937e610b84c0f6942470b531c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc38b88204bd86b40f1f1de557b247c4"><td class="memItemLeft" align="right" valign="top"><a id="acc38b88204bd86b40f1f1de557b247c4"></a>
+<a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtiny__sha.html#acc38b88204bd86b40f1f1de557b247c4">hash_alg</a></td></tr>
+<tr class="memdesc:acc38b88204bd86b40f1f1de557b247c4"><td class="mdescLeft">&#160;</td><td class="mdescRight">The hash algorithem which selected. <br /></td></tr>
+<tr class="separator:acc38b88204bd86b40f1f1de557b247c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Tiny Sha wrapper Element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="hashwrap_8h.html">hashwrap.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structtiny__sha.html">tiny_sha</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/sync_off.png b/doc/html/sync_off.png
new file mode 100644
index 0000000..3b443fc
--- /dev/null
+++ b/doc/html/sync_off.png
Binary files differ
diff --git a/doc/html/sync_on.png b/doc/html/sync_on.png
new file mode 100644
index 0000000..e08320f
--- /dev/null
+++ b/doc/html/sync_on.png
Binary files differ
diff --git a/doc/html/tab_a.png b/doc/html/tab_a.png
new file mode 100644
index 0000000..3b725c4
--- /dev/null
+++ b/doc/html/tab_a.png
Binary files differ
diff --git a/doc/html/tab_b.png b/doc/html/tab_b.png
new file mode 100644
index 0000000..e2b4a86
--- /dev/null
+++ b/doc/html/tab_b.png
Binary files differ
diff --git a/doc/html/tab_h.png b/doc/html/tab_h.png
new file mode 100644
index 0000000..fd5cb70
--- /dev/null
+++ b/doc/html/tab_h.png
Binary files differ
diff --git a/doc/html/tab_s.png b/doc/html/tab_s.png
new file mode 100644
index 0000000..ab478c9
--- /dev/null
+++ b/doc/html/tab_s.png
Binary files differ
diff --git a/doc/html/tabs.css b/doc/html/tabs.css
new file mode 100644
index 0000000..a28614b
--- /dev/null
+++ b/doc/html/tabs.css
@@ -0,0 +1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file
diff --git a/doc/html/tatepairing_8h.html b/doc/html/tatepairing_8h.html
new file mode 100644
index 0000000..47b927a
--- /dev/null
+++ b/doc/html/tatepairing_8h.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/math/tatepairing.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('tatepairing_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tatepairing.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID 1.1 Pairing interface.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ecgroup_8h.html">epid/common/math/ecgroup.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="finitefield_8h.html">epid/common/math/finitefield.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a></td></tr>
+<tr class="memdesc:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pairing. <br /></td></tr>
+<tr class="separator:ga74236e8ebbfc30a7daa7fa1cf1df148b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e">NewEpid11PairingState</a> (<a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *ga, <a class="el" href="group___ec_group_primitives.html#gac91c5a7623c17a868dd15b2e9aaf7159">EcGroup</a> const *gb, <a class="el" href="group___finite_field_primitives.html#gab281b24e336a8b3d7d90079d862d969e">FiniteField</a> const *ff, <a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **ps)</td></tr>
+<tr class="memdesc:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new Tate pairing state. <a href="group___epid11_pairing_primitives.html#ga0ee658e26e9f933ba2ffbf2504dfae7e">More...</a><br /></td></tr>
+<tr class="separator:ga0ee658e26e9f933ba2ffbf2504dfae7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3457d6f85889bc714910252fd21c758"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758">DeleteEpid11PairingState</a> (<a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> **ps)</td></tr>
+<tr class="memdesc:gaa3457d6f85889bc714910252fd21c758"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a previously allocated by Epid11PairingState. <a href="group___epid11_pairing_primitives.html#gaa3457d6f85889bc714910252fd21c758">More...</a><br /></td></tr>
+<tr class="separator:gaa3457d6f85889bc714910252fd21c758"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa4076dfe25e8e61ac6753333a322c059"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059">Epid11Pairing</a> (<a class="el" href="group___epid11_pairing_primitives.html#ga74236e8ebbfc30a7daa7fa1cf1df148b">Epid11PairingState</a> *ps, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *a, <a class="el" href="group___ec_group_primitives.html#ga85c1d5e106031b385a6e23e598ac98fa">EcPoint</a> const *b, <a class="el" href="group___finite_field_primitives.html#ga6cff5c7c06b07a87442b810ccc0a86fa">FfElement</a> *d)</td></tr>
+<tr class="memdesc:gaa4076dfe25e8e61ac6753333a322c059"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a Tate Pairing for two parameters. <a href="group___epid11_pairing_primitives.html#gaa4076dfe25e8e61ac6753333a322c059">More...</a><br /></td></tr>
+<tr class="separator:gaa4076dfe25e8e61ac6753333a322c059"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID 1.1 Pairing interface. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="dir_f169ebf8da29290a918fa4b3f7151050.html">math</a></li><li class="navelem"><a class="el" href="tatepairing_8h.html">tatepairing.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/tiny__stdlib_8h.html b/doc/html/tiny__stdlib_8h.html
new file mode 100644
index 0000000..ac13fa8
--- /dev/null
+++ b/doc/html/tiny__stdlib_8h.html
@@ -0,0 +1,199 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/stdlib/tiny_stdlib.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('tiny__stdlib_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tiny_stdlib.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Tiny portable implementations of standard library functions.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4cb469bec7b722064b97a406346acb61"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tiny__stdlib_8h.html#a4cb469bec7b722064b97a406346acb61">memset</a> (void *ptr, int value, size_t num)</td></tr>
+<tr class="memdesc:a4cb469bec7b722064b97a406346acb61"><td class="mdescLeft">&#160;</td><td class="mdescRight">Fill block of memory. <a href="#a4cb469bec7b722064b97a406346acb61">More...</a><br /></td></tr>
+<tr class="separator:a4cb469bec7b722064b97a406346acb61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e7d61eb280250fb55dce370ba1a1709"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tiny__stdlib_8h.html#a1e7d61eb280250fb55dce370ba1a1709">memcmp</a> (const void *ptr1, const void *ptr2, size_t num)</td></tr>
+<tr class="memdesc:a1e7d61eb280250fb55dce370ba1a1709"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compare two blocks of memory. <a href="#a1e7d61eb280250fb55dce370ba1a1709">More...</a><br /></td></tr>
+<tr class="separator:a1e7d61eb280250fb55dce370ba1a1709"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Tiny portable implementations of standard library functions. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a1e7d61eb280250fb55dce370ba1a1709"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1e7d61eb280250fb55dce370ba1a1709">&#9670;&nbsp;</a></span>memcmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int memcmp </td>
+ <td>(</td>
+ <td class="paramtype">const void *&#160;</td>
+ <td class="paramname"><em>ptr1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const void *&#160;</td>
+ <td class="paramname"><em>ptr2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>num</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Compare two blocks of memory. </p>
+<p>Compares the first num bytes of the block of memory pointed by ptr1 to the first num bytes pointed by ptr2, returning zero if they all match or a value different from zero representing which is greater if they do not.</p>
+<p>Notice that, unlike strcmp, the function does not stop comparing after finding a null character.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ptr1</td><td>Pointer to block of memory. </td></tr>
+ <tr><td class="paramname">ptr2</td><td>Pointer to block of memory. </td></tr>
+ <tr><td class="paramname">num</td><td>Number of bytes to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an integral value indicating the relationship between the content of the memory blocks: </dd></dl>
+<dl class="retval"><dt>Return values</dt><dd>
+ <table class="retval">
+ <tr><td class="paramname">&lt;0</td><td>the first byte that does not match in both memory blocks has a lower value in ptr1 than in ptr2 (if evaluated as unsigned char values) </td></tr>
+ <tr><td class="paramname">0</td><td>the contents of both memory blocks are equal </td></tr>
+ <tr><td class="paramname">&gt;0</td><td>the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 (if evaluated as unsigned char values) </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4cb469bec7b722064b97a406346acb61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4cb469bec7b722064b97a406346acb61">&#9670;&nbsp;</a></span>memset()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* memset </td>
+ <td>(</td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>ptr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>value</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>num</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Fill block of memory. </p>
+<p>Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ptr</td><td>Pointer to the block of memory to fill. </td></tr>
+ <tr><td class="paramname">value</td><td>Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value. </td></tr>
+ <tr><td class="paramname">num</td><td>Number of bytes to be set to the value. size_t is an unsigned integral type. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ptr is returned. </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_a6a596e2b2b50fb0973c7fe0b17a09e5.html">stdlib</a></li><li class="navelem"><a class="el" href="tiny__stdlib_8h.html">tiny_stdlib.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/tpm__considerations_8dox.html b/doc/html/tpm__considerations_8dox.html
new file mode 100644
index 0000000..0e42f7e
--- /dev/null
+++ b/doc/html/tpm__considerations_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/tpm_considerations.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('tpm__considerations_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/tpm_considerations.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="tpm__considerations_8dox.html">tpm_considerations.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/tpm__member_8h.html b/doc/html/tpm__member_8h.html
new file mode 100644
index 0000000..c0e6c43
--- /dev/null
+++ b/doc/html/tpm__member_8h.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tpm_member.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('tpm__member_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">tpm_member.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Member creation parameters for TPM implementation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Member creation parameters for TPM implementation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="tpm__member_8h.html">tpm_member.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/types_8h.html b/doc/html/types_8h.html
new file mode 100644
index 0000000..0bd3ccc
--- /dev/null
+++ b/doc/html/types_8h.html
@@ -0,0 +1,241 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/common/types.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('types_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a> </div>
+ <div class="headertitle">
+<div class="title">types.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>SDK data types.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;limits.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str8.html">OctStr8</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">8 bit octet string <a href="struct_oct_str8.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str16.html">OctStr16</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">16 bit octet string <a href="struct_oct_str16.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str32.html">OctStr32</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">32 bit octet string <a href="struct_oct_str32.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str64.html">OctStr64</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">64 bit octet string <a href="struct_oct_str64.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str128.html">OctStr128</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">128 bit octet string <a href="struct_oct_str128.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str256.html">OctStr256</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit octet string <a href="struct_oct_str256.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_oct_str512.html">OctStr512</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">512 bit octet string <a href="struct_oct_str512.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_big_num_str.html">BigNumStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized BigNum. <a href="struct_big_num_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fp_elem_str.html">FpElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">a number in [0, p-1] <a href="struct_fp_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq_elem_str.html">FqElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">a number in [0, q-1] <a href="struct_fq_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g1_elem_str.html">G1ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized G1 element. <a href="struct_g1_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_g2_elem_str.html">G2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized G2 element. <a href="struct_g2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_gt_elem_str.html">GtElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized GT element. <a href="struct_gt_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid2_params.html">Epid2Params</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 Parameters. <a href="struct_epid2_params.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_pub_key.html">GroupPubKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 group public key. <a href="struct_group_pub_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_i_priv_key.html">IPrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 issuing private key. <a href="struct_i_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_key.html">PrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 private key. <a href="struct_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_compressed_priv_key.html">CompressedPrivKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compressed private key. <a href="struct_compressed_priv_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_membership_credential.html">MembershipCredential</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Membership credential. <a href="struct_membership_credential.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_join_request.html">JoinRequest</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Join request. <a href="struct_join_request.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_basic_signature.html">BasicSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 basic signature. <a href="struct_basic_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_nr_proof.html">NrProof</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">non-revoked Proof. <a href="struct_nr_proof.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid_signature.html">EpidSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 2.0 Signature. <a href="struct_epid_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_priv_rl.html">PrivRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">private-key based revocation list. <a href="struct_priv_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">entry in SigRL (B,K) <a href="struct_sig_rl_entry.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_sig_rl.html">SigRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">signature based revocation list <a href="struct_sig_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_group_rl.html">GroupRl</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">group revocation list <a href="struct_group_rl.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_rl.html">VerifierRl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_member_precomp.html">MemberPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pre-computed member settings. <a href="struct_member_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq2_elem_str.html">Fq2ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2 element. <a href="struct_fq2_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq6_elem_str.html">Fq6ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2^3 element. <a href="struct_fq6_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_fq12_elem_str.html">Fq12ElemStr</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialized Fq2^3^2 element. <a href="struct_fq12_elem_str.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_signature.html">EcdsaSignature</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Signature using NIST 256-bit curve secp256r1. <a href="struct_ecdsa_signature.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_public_key.html">EcdsaPublicKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Public Key. <a href="struct_ecdsa_public_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_ecdsa_private_key.html">EcdsaPrivateKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ECDSA Private Key. <a href="struct_ecdsa_private_key.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga3315fb24f4c5783b6d6eb107933390b0"><td class="memItemLeft" align="right" valign="top">
+typedef void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga3315fb24f4c5783b6d6eb107933390b0">OctStr</a></td></tr>
+<tr class="memdesc:ga3315fb24f4c5783b6d6eb107933390b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generic Octet String Style Number. <br /></td></tr>
+<tr class="separator:ga3315fb24f4c5783b6d6eb107933390b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gace6876a045f2c2694444b35ccb0844e2"><td class="memItemLeft" align="right" valign="top">
+typedef void const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#gace6876a045f2c2694444b35ccb0844e2">ConstOctStr</a></td></tr>
+<tr class="memdesc:gace6876a045f2c2694444b35ccb0844e2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generic Const Octet String Style Number. <br /></td></tr>
+<tr class="separator:gace6876a045f2c2694444b35ccb0844e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gada666b48d0cbc301985405fde896f1de"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_oct_str128.html">OctStr128</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#gada666b48d0cbc301985405fde896f1de">GroupId</a></td></tr>
+<tr class="memdesc:gada666b48d0cbc301985405fde896f1de"><td class="mdescLeft">&#160;</td><td class="mdescRight">group ID <br /></td></tr>
+<tr class="separator:gada666b48d0cbc301985405fde896f1de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga888541b8148df69c634a92c64ed51317"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga888541b8148df69c634a92c64ed51317">Seed</a></td></tr>
+<tr class="memdesc:ga888541b8148df69c634a92c64ed51317"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit seed derived from fuse key <br /></td></tr>
+<tr class="separator:ga888541b8148df69c634a92c64ed51317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55eb2193045bde31af3f551565126042"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_oct_str256.html">OctStr256</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga55eb2193045bde31af3f551565126042">IssuerNonce</a></td></tr>
+<tr class="memdesc:ga55eb2193045bde31af3f551565126042"><td class="mdescLeft">&#160;</td><td class="mdescRight">256 bit nonce chosen by issuer <br /></td></tr>
+<tr class="separator:ga55eb2193045bde31af3f551565126042"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54bd22670f2e348593db7ab631131d10"><td class="memItemLeft" align="right" valign="top">
+typedef <a class="el" href="struct_g1_elem_str.html">G1ElemStr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga54bd22670f2e348593db7ab631131d10">ReKeySeed</a></td></tr>
+<tr class="memdesc:ga54bd22670f2e348593db7ab631131d10"><td class="mdescLeft">&#160;</td><td class="mdescRight">element to store seed values for later rekey <br /></td></tr>
+<tr class="separator:ga54bd22670f2e348593db7ab631131d10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> { <br />
+&#160;&#160;<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a68b2137c7946583a99f0dac2286523eb">kInvalidHashAlg</a> = -1,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890aefb89989305b5c34120b0f18ee8e2c5d">kSha256</a> = 0,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a0f4dde6e82b84f5769873f6704fcd290">kSha384</a> = 1,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890afb78d98f37fecc53dd1637d94c5c0055">kSha512</a> = 2,
+<br />
+&#160;&#160;<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a9746b5049a62bca2f7b844925e6136ba">kSha512_256</a> = 3,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a4fa16d3867498f5e2f8ae5c94b0fab85">kSha3_256</a> = 4,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890a90d21c8885ab138f7cf91f253dd6ef86">kSha3_384</a> = 5,
+<a class="el" href="group___epid_types.html#gga5e450438f6f9a5eacd0cf5ce354ec890ade8e74cf7910b3a71fe902a40abf7eee">kSha3_512</a> = 6
+<br />
+ }</td></tr>
+<tr class="memdesc:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="mdescLeft">&#160;</td><td class="mdescRight">Recognized hash algorithms. <a href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">More...</a><br /></td></tr>
+<tr class="separator:ga5e450438f6f9a5eacd0cf5ce354ec890"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SDK data types. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_f6bef457d5f671b6e774bfccc16651f6.html">common</a></li><li class="navelem"><a class="el" href="types_8h.html">types.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/uml_sequence.png b/doc/html/uml_sequence.png
new file mode 100644
index 0000000..66a44ce
--- /dev/null
+++ b/doc/html/uml_sequence.png
Binary files differ
diff --git a/doc/html/unionsha__digest.html b/doc/html/unionsha__digest.html
new file mode 100644
index 0000000..d1941bd
--- /dev/null
+++ b/doc/html/unionsha__digest.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: sha_digest Union Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('unionsha__digest.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">sha_digest Union Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Sha Digest Element.
+ <a href="unionsha__digest.html#details">More...</a></p>
+
+<p><code>#include &lt;epid/member/tiny/math/hashwrap.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a2c5fa88c4f65cc62d1839bd9a166b843"><td class="memItemLeft" align="right" valign="top"><a id="a2c5fa88c4f65cc62d1839bd9a166b843"></a>
+uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsha__digest.html#a2c5fa88c4f65cc62d1839bd9a166b843">sha512_digest</a> [<a class="el" href="sha512_8h.html#a67f489f3eee39c447a6db3ba34ef75f2">SHA512_DIGEST_SIZE</a>]</td></tr>
+<tr class="memdesc:a2c5fa88c4f65cc62d1839bd9a166b843"><td class="mdescLeft">&#160;</td><td class="mdescRight">Support digest for sha512. <br /></td></tr>
+<tr class="separator:a2c5fa88c4f65cc62d1839bd9a166b843"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d79411c2115953d2c5fa50c176dda8d"><td class="memItemLeft" align="right" valign="top"><a id="a2d79411c2115953d2c5fa50c176dda8d"></a>
+uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsha__digest.html#a2d79411c2115953d2c5fa50c176dda8d">sha256_digest</a> [<a class="el" href="sha256_8h.html#a81efbc0fc101b06a914f7ff9e2fbc0e9">SHA256_DIGEST_SIZE</a>]</td></tr>
+<tr class="memdesc:a2d79411c2115953d2c5fa50c176dda8d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Support digest for sha256. <br /></td></tr>
+<tr class="separator:a2d79411c2115953d2c5fa50c176dda8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a182db3a17879fc1fb95c018044533060"><td class="memItemLeft" align="right" valign="top"><a id="a182db3a17879fc1fb95c018044533060"></a>
+uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsha__digest.html#a182db3a17879fc1fb95c018044533060">digest</a> [1]</td></tr>
+<tr class="memdesc:a182db3a17879fc1fb95c018044533060"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to digest. <br /></td></tr>
+<tr class="separator:a182db3a17879fc1fb95c018044533060"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Sha Digest Element. </p>
+</div><hr/>The documentation for this union was generated from the following file:<ul>
+<li>epid/member/tiny/math/<a class="el" href="hashwrap_8h.html">hashwrap.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="unionsha__digest.html">sha_digest</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/using__ikgf_8dox.html b/doc/html/using__ikgf_8dox.html
new file mode 100644
index 0000000..c46bca6
--- /dev/null
+++ b/doc/html/using__ikgf_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/using_ikgf.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('using__ikgf_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/using_ikgf.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="using__ikgf_8dox.html">using_ikgf.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/verifier_21_81_2api_8h.html b/doc/html/verifier_21_81_2api_8h.html
new file mode 100644
index 0000000..6b46e66
--- /dev/null
+++ b/doc/html/verifier_21_81_2api_8h.html
@@ -0,0 +1,146 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/verifier/1.1/api.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('verifier_21_81_2api_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">api.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="1_81_2types_8h.html">epid/common/1.1/types.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="verifier_2api_8h.html">epid/verifier/api.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intel(R) EPID 1.1 Pre-computed verifier settings. <a href="struct_epid11_verifier_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gabe6a864a06322205ae7536ffea34c702"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a></td></tr>
+<tr class="memdesc:gabe6a864a06322205ae7536ffea34c702"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal context of Intel(R) EPID 1.1 verifier. <br /></td></tr>
+<tr class="separator:gabe6a864a06322205ae7536ffea34c702"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8">Epid11VerifierCreate</a> (<a class="el" href="struct_epid11_group_pub_key.html">Epid11GroupPubKey</a> const *pub_key, <a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> const *precomp, <a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new Intel(R) EPID 1.1 verifier context. <a href="group___epid11_verifier_module.html#gac5a8f8d7624063ea428d81dbdbf61fa8">More...</a><br /></td></tr>
+<tr class="separator:gac5a8f8d7624063ea428d81dbdbf61fa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1">Epid11VerifierDelete</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing Intel(R) EPID 1.1 verifier context. <a href="group___epid11_verifier_module.html#ga63cae8d5abcf4d7e3af4157de18998f1">More...</a><br /></td></tr>
+<tr class="separator:ga63cae8d5abcf4d7e3af4157de18998f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga241520cb925e5be89893a2037451cf1c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c">Epid11VerifierWritePrecomp</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_verifier_precomp.html">Epid11VerifierPrecomp</a> *precomp)</td></tr>
+<tr class="memdesc:ga241520cb925e5be89893a2037451cf1c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the pre-computed Intel(R) EPID 1.1 verifier settings. <a href="group___epid11_verifier_module.html#ga241520cb925e5be89893a2037451cf1c">More...</a><br /></td></tr>
+<tr class="separator:ga241520cb925e5be89893a2037451cf1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14">Epid11VerifierSetPrivRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_priv_rl.html">Epid11PrivRl</a> const *priv_rl, size_t priv_rl_size)</td></tr>
+<tr class="memdesc:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 private key based revocation list. <a href="group___epid11_verifier_module.html#gaffbe6ac2bc7236ad65126a17ebdceb14">More...</a><br /></td></tr>
+<tr class="separator:gaffbe6ac2bc7236ad65126a17ebdceb14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8">Epid11VerifierSetSigRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_sig_rl.html">Epid11SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 signature based revocation list. <a href="group___epid11_verifier_module.html#gaff5a014b0334be7e8583f0f99cb5e9b8">More...</a><br /></td></tr>
+<tr class="separator:gaff5a014b0334be7e8583f0f99cb5e9b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga809c777908b2f9d029062d9424cb5f65"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65">Epid11VerifierSetGroupRl</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, <a class="el" href="struct_epid11_group_rl.html">Epid11GroupRl</a> const *grp_rl, size_t grp_rl_size)</td></tr>
+<tr class="memdesc:ga809c777908b2f9d029062d9424cb5f65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the Intel(R) EPID 1.1 group based revocation list. <a href="group___epid11_verifier_module.html#ga809c777908b2f9d029062d9424cb5f65">More...</a><br /></td></tr>
+<tr class="separator:ga809c777908b2f9d029062d9424cb5f65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">Epid11VerifierSetBasename</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the basename to be used by a verifier. <a href="group___epid11_verifier_module.html#ga0cb6d30df527ee0d8f0a1b68d2b7c0c0">More...</a><br /></td></tr>
+<tr class="separator:ga0cb6d30df527ee0d8f0a1b68d2b7c0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216">Epid11Verify</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_signature.html">Epid11Signature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 signature and checks revocation status. <a href="group___epid11_verifier_module.html#gafe5ad6bde38ad0c3e0a9960975fd5216">More...</a><br /></td></tr>
+<tr class="separator:gafe5ad6bde38ad0c3e0a9960975fd5216"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7">Epid11AreSigsLinked</a> (<a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig1, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig2)</td></tr>
+<tr class="memdesc:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if two Intel(R) EPID 1.1 signatures are linked. <a href="group___epid11_verifier_module.html#gab0b6560b226a37321f5ca5d4fb55eba7">More...</a><br /></td></tr>
+<tr class="separator:gab0b6560b226a37321f5ca5d4fb55eba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7b5d19277da043c2b79721975d7bd070"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070">Epid11VerifyBasicSig</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:ga7b5d19277da043c2b79721975d7bd070"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 member signature without revocation checks. <a href="group___epid11_verifier_module.html#ga7b5d19277da043c2b79721975d7bd070">More...</a><br /></td></tr>
+<tr class="separator:ga7b5d19277da043c2b79721975d7bd070"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813">Epid11NrVerify</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, void const *msg, size_t msg_len, <a class="el" href="struct_epid11_sig_rl_entry.html">Epid11SigRlEntry</a> const *sigrl_entry, <a class="el" href="struct_epid11_nr_proof.html">Epid11NrProof</a> const *proof)</td></tr>
+<tr class="memdesc:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature based revocation list entry. <a href="group___epid11_verifier_module.html#ga3a2e320d7de6156b2ce9d73e9cdce813">More...</a><br /></td></tr>
+<tr class="separator:ga3a2e320d7de6156b2ce9d73e9cdce813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b79c79d09e3551158e1c38c7c335929"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929">Epid11CheckPrivRlEntry</a> (<a class="el" href="group___epid11_verifier_module.html#gabe6a864a06322205ae7536ffea34c702">Epid11VerifierCtx</a> const *ctx, <a class="el" href="struct_epid11_basic_signature.html">Epid11BasicSignature</a> const *sig, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f)</td></tr>
+<tr class="memdesc:ga0b79c79d09e3551158e1c38c7c335929"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies an Intel(R) EPID 1.1 signature has not been revoked in the private key based revocation list. <a href="group___epid11_verifier_module.html#ga0b79c79d09e3551158e1c38c7c335929">More...</a><br /></td></tr>
+<tr class="separator:ga0b79c79d09e3551158e1c38c7c335929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_02c945662023679b89476bd7126bc985.html">verifier</a></li><li class="navelem"><a class="el" href="dir_ef364879bae02db2684040178ed9b186.html">1.1</a></li><li class="navelem"><a class="el" href="verifier_21_81_2api_8h.html">api.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/verifier_2api_8h.html b/doc/html/verifier_2api_8h.html
new file mode 100644
index 0000000..a38f941
--- /dev/null
+++ b/doc/html/verifier_2api_8h.html
@@ -0,0 +1,160 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/verifier/api.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('verifier_2api_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">api.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Intel(R) EPID SDK verifier API.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="errors_8h.html">epid/common/errors.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stdtypes_8h.html">epid/common/stdtypes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="types_8h.html">epid/common/types.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pre-computed verifier settings. <a href="struct_verifier_precomp.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="memItemLeft" align="right" valign="top">
+typedef struct <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a></td></tr>
+<tr class="memdesc:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal context of verifier. <br /></td></tr>
+<tr class="separator:gaf172a5f8f7f069d38c5838b723a1a85c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">EpidVerifierCreate</a> (<a class="el" href="struct_group_pub_key.html">GroupPubKey</a> const *pub_key, <a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> const *precomp, <a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new verifier context. <a href="group___epid_verifier_module.html#ga1d116daaee5466a1485d26ebc4e3ab70">More...</a><br /></td></tr>
+<tr class="separator:ga1d116daaee5466a1485d26ebc4e3ab70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6707e691f4b3916f9c684d5bbd463d12"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">EpidVerifierDelete</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> **ctx)</td></tr>
+<tr class="memdesc:ga6707e691f4b3916f9c684d5bbd463d12"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes an existing verifier context. <a href="group___epid_verifier_module.html#ga6707e691f4b3916f9c684d5bbd463d12">More...</a><br /></td></tr>
+<tr class="separator:ga6707e691f4b3916f9c684d5bbd463d12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">EpidVerifierWritePrecomp</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_verifier_precomp.html">VerifierPrecomp</a> *precomp)</td></tr>
+<tr class="memdesc:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the pre-computed verifier settings. <a href="group___epid_verifier_module.html#ga92df4d00ea4ee59d7bfd35b23da03392">More...</a><br /></td></tr>
+<tr class="separator:ga92df4d00ea4ee59d7bfd35b23da03392"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">EpidVerifierSetPrivRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_priv_rl.html">PrivRl</a> const *priv_rl, size_t priv_rl_size)</td></tr>
+<tr class="memdesc:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the private key based revocation list. <a href="group___epid_verifier_module.html#gafab08180a43b58ce2e1d56c4b070bb0e">More...</a><br /></td></tr>
+<tr class="separator:gafab08180a43b58ce2e1d56c4b070bb0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">EpidVerifierSetSigRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_sig_rl.html">SigRl</a> const *sig_rl, size_t sig_rl_size)</td></tr>
+<tr class="memdesc:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the signature based revocation list. <a href="group___epid_verifier_module.html#ga4c7c9820409ee06f30bb8dc75fdd5dcf">More...</a><br /></td></tr>
+<tr class="separator:ga4c7c9820409ee06f30bb8dc75fdd5dcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">EpidVerifierSetGroupRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_group_rl.html">GroupRl</a> const *grp_rl, size_t grp_rl_size)</td></tr>
+<tr class="memdesc:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the group based revocation list. <a href="group___epid_verifier_module.html#ga1d41d6ef4dabbc30ec28452edd6baffb">More...</a><br /></td></tr>
+<tr class="separator:ga1d41d6ef4dabbc30ec28452edd6baffb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0909703a0a4dfe080374d0d99077465a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">EpidVerifierSetVerifierRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_verifier_rl.html">VerifierRl</a> const *ver_rl, size_t ver_rl_size)</td></tr>
+<tr class="memdesc:ga0909703a0a4dfe080374d0d99077465a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the verifier revocation list. <a href="group___epid_verifier_module.html#ga0909703a0a4dfe080374d0d99077465a">More...</a><br /></td></tr>
+<tr class="separator:ga0909703a0a4dfe080374d0d99077465a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97b58b2382f24756b66a357f1e825c92"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">EpidVerifierSetHashAlg</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890">HashAlg</a> hash_alg)</td></tr>
+<tr class="memdesc:ga97b58b2382f24756b66a357f1e825c92"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the hash algorithm to be used by a verifier. <a href="group___epid_verifier_module.html#ga97b58b2382f24756b66a357f1e825c92">More...</a><br /></td></tr>
+<tr class="separator:ga97b58b2382f24756b66a357f1e825c92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1c3810ef361da678a1f77823bd9c37a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">EpidVerifierSetBasename</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, void const *basename, size_t basename_len)</td></tr>
+<tr class="memdesc:ga1c3810ef361da678a1f77823bd9c37a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the basename to be used by a verifier. <a href="group___epid_verifier_module.html#ga1c3810ef361da678a1f77823bd9c37a6">More...</a><br /></td></tr>
+<tr class="separator:ga1c3810ef361da678a1f77823bd9c37a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae3f9c37628e18b880d8bbee3e7f55064"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">EpidVerify</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_epid_signature.html">EpidSignature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gae3f9c37628e18b880d8bbee3e7f55064"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a signature and checks revocation status. <a href="group___epid_verifier_module.html#gae3f9c37628e18b880d8bbee3e7f55064">More...</a><br /></td></tr>
+<tr class="separator:gae3f9c37628e18b880d8bbee3e7f55064"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stdtypes_8h.html#ad5c9d4ba3dc37783a528b0925dc981a0">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8">EpidAreSigsLinked</a> (<a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig1, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig2)</td></tr>
+<tr class="memdesc:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if two signatures are linked. <a href="group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8">More...</a><br /></td></tr>
+<tr class="separator:gae44bd8acbc1e7205aeedff0c7e2632a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">EpidVerifyBasicSig</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a member signature without revocation checks. <a href="group___epid_verifier_module.html#gac3b1f1a2bdba8eeeebbf1e0c8c00862e">More...</a><br /></td></tr>
+<tr class="separator:gac3b1f1a2bdba8eeeebbf1e0c8c00862e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac6e2fab59e3af8a33a74a5b201642700"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700">EpidNrVerify</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, void const *msg, size_t msg_len, <a class="el" href="struct_sig_rl_entry.html">SigRlEntry</a> const *sigrl_entry, <a class="el" href="struct_nr_proof.html">NrProof</a> const *proof)</td></tr>
+<tr class="memdesc:gac6e2fab59e3af8a33a74a5b201642700"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies the non-revoked proof for a single signature based revocation list entry. <a href="group___epid_verifier_module.html#gac6e2fab59e3af8a33a74a5b201642700">More...</a><br /></td></tr>
+<tr class="separator:gac6e2fab59e3af8a33a74a5b201642700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea">EpidCheckPrivRlEntry</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_basic_signature.html">BasicSignature</a> const *sig, <a class="el" href="struct_fp_elem_str.html">FpElemStr</a> const *f)</td></tr>
+<tr class="memdesc:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Verifies a signature has not been revoked in the private key based revocation list. <a href="group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea">More...</a><br /></td></tr>
+<tr class="separator:gaeb05e6faea6f09c0665b13adc6e7ddea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f">EpidGetVerifierRlSize</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx)</td></tr>
+<tr class="memdesc:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the number of bytes required to serialize the verifier blacklist. <a href="group___epid_verifier_module.html#ga2a75c7d5775e852a7b6e24178dd4054f">More...</a><br /></td></tr>
+<tr class="separator:ga2a75c7d5775e852a7b6e24178dd4054f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac857bff47e7d80363eac15285471fe81"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81">EpidWriteVerifierRl</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> const *ctx, <a class="el" href="struct_verifier_rl.html">VerifierRl</a> *ver_rl, size_t ver_rl_size)</td></tr>
+<tr class="memdesc:gac857bff47e7d80363eac15285471fe81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes the verifier blacklist to a buffer. <a href="group___epid_verifier_module.html#gac857bff47e7d80363eac15285471fe81">More...</a><br /></td></tr>
+<tr class="separator:gac857bff47e7d80363eac15285471fe81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___error_codes.html#gafdb27c77c2c4b32c807e326a8a0da360">EpidStatus</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69">EpidBlacklistSig</a> (<a class="el" href="group___epid_verifier_module.html#gaf172a5f8f7f069d38c5838b723a1a85c">VerifierCtx</a> *ctx, <a class="el" href="struct_epid_signature.html">EpidSignature</a> const *sig, size_t sig_len, void const *msg, size_t msg_len)</td></tr>
+<tr class="memdesc:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a valid name-based signature to the verifier blacklist. <a href="group___epid_verifier_module.html#ga8eaeb9f4a34e9e37ccdf342919f38c69">More...</a><br /></td></tr>
+<tr class="separator:ga8eaeb9f4a34e9e37ccdf342919f38c69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Intel(R) EPID SDK verifier API. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_02c945662023679b89476bd7126bc985.html">verifier</a></li><li class="navelem"><a class="el" href="verifier_2api_8h.html">api.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/verifysig__walkthrough_8dox.html b/doc/html/verifysig__walkthrough_8dox.html
new file mode 100644
index 0000000..e87e963
--- /dev/null
+++ b/doc/html/verifysig__walkthrough_8dox.html
@@ -0,0 +1,84 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: doc/docsrc/verifysig_walkthrough.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('verifysig__walkthrough_8dox.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/docsrc/verifysig_walkthrough.dox File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This file is used by Doxygen to generate documentation.
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is used by Doxygen to generate documentation. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="verifysig__walkthrough_8dox.html">verifysig_walkthrough.dox</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/vli_8h.html b/doc/html/vli_8h.html
new file mode 100644
index 0000000..1baf678
--- /dev/null
+++ b/doc/html/vli_8h.html
@@ -0,0 +1,924 @@
+<!-- HTML header for doxygen 1.8.10-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.14"/>
+<title>Intel&reg; Enhanced Privacy ID SDK: epid/member/tiny/math/vli.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+ $(document).ready(initResizable);
+/* @license-end */</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="epidstyle.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname"><a
+ onclick="storeLink('index.html')"
+ id="projectlink"
+ class="index.html"
+ href="index.html">Intel&reg; Enhanced Privacy ID SDK</a>
+&#160;<span id="projectnumber">6.0.1</span>
+</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.14 -->
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(document).ready(function(){initNavTree('vli_8h.html','');});
+/* @license-end */
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">vli.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Definition of Large Integer math.
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="bitsupplier_8h.html">epid/common/bitsupplier.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a566cfdc23f1c35230891d53139850032"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a566cfdc23f1c35230891d53139850032">VliAdd</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right)</td></tr>
+<tr class="memdesc:a566cfdc23f1c35230891d53139850032"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two large integers. <a href="#a566cfdc23f1c35230891d53139850032">More...</a><br /></td></tr>
+<tr class="separator:a566cfdc23f1c35230891d53139850032"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6d63a825df6f224fe37c76b6bb67bcf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#ab6d63a825df6f224fe37c76b6bb67bcf">VliMul</a> (<a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right)</td></tr>
+<tr class="memdesc:ab6d63a825df6f224fe37c76b6bb67bcf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two large integers. <a href="#ab6d63a825df6f224fe37c76b6bb67bcf">More...</a><br /></td></tr>
+<tr class="separator:ab6d63a825df6f224fe37c76b6bb67bcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c7e60c47b82e5b2cf823d51b3a9fdcc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a4c7e60c47b82e5b2cf823d51b3a9fdcc">VliRShift</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *in, uint32_t shift)</td></tr>
+<tr class="memdesc:a4c7e60c47b82e5b2cf823d51b3a9fdcc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Right shift a large integers. <a href="#a4c7e60c47b82e5b2cf823d51b3a9fdcc">More...</a><br /></td></tr>
+<tr class="separator:a4c7e60c47b82e5b2cf823d51b3a9fdcc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac47d57834c67877c10ecdc230cdaf503"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#ac47d57834c67877c10ecdc230cdaf503">VliSub</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right)</td></tr>
+<tr class="memdesc:ac47d57834c67877c10ecdc230cdaf503"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two large integers. <a href="#ac47d57834c67877c10ecdc230cdaf503">More...</a><br /></td></tr>
+<tr class="separator:ac47d57834c67877c10ecdc230cdaf503"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a1df0e7770aa1421e41b87965e71425"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a9a1df0e7770aa1421e41b87965e71425">VliSet</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *in)</td></tr>
+<tr class="memdesc:a9a1df0e7770aa1421e41b87965e71425"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set a large integer's value. <a href="#a9a1df0e7770aa1421e41b87965e71425">More...</a><br /></td></tr>
+<tr class="separator:a9a1df0e7770aa1421e41b87965e71425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1e2e5fe5fc466eff75dbe70fba3169f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#ad1e2e5fe5fc466eff75dbe70fba3169f">VliClear</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result)</td></tr>
+<tr class="memdesc:ad1e2e5fe5fc466eff75dbe70fba3169f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clear a large integer's value. <a href="#ad1e2e5fe5fc466eff75dbe70fba3169f">More...</a><br /></td></tr>
+<tr class="separator:ad1e2e5fe5fc466eff75dbe70fba3169f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f6a41541103b1bde8428ea7f4b816fa"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a8f6a41541103b1bde8428ea7f4b816fa">VliIsZero</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *in)</td></tr>
+<tr class="memdesc:a8f6a41541103b1bde8428ea7f4b816fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test if a large integer is zero. <a href="#a8f6a41541103b1bde8428ea7f4b816fa">More...</a><br /></td></tr>
+<tr class="separator:a8f6a41541103b1bde8428ea7f4b816fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a426db811cf4ee822bd4b6863f2e51d8c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a426db811cf4ee822bd4b6863f2e51d8c">VliCondSet</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *true_val, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *false_val, int truth_val)</td></tr>
+<tr class="memdesc:a426db811cf4ee822bd4b6863f2e51d8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Conditionally Set a large inter's value to one of two values. <a href="#a426db811cf4ee822bd4b6863f2e51d8c">More...</a><br /></td></tr>
+<tr class="separator:a426db811cf4ee822bd4b6863f2e51d8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80d1a80f5a21437354ee185923621d66"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a80d1a80f5a21437354ee185923621d66">VliTestBit</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *in, uint32_t bit)</td></tr>
+<tr class="memdesc:a80d1a80f5a21437354ee185923621d66"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test the value of a bit in a large integer. <a href="#a80d1a80f5a21437354ee185923621d66">More...</a><br /></td></tr>
+<tr class="separator:a80d1a80f5a21437354ee185923621d66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10fc791278e51543fc685d5a4903fcd1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a10fc791278e51543fc685d5a4903fcd1">VliRand</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a> rnd_func, void *rnd_param)</td></tr>
+<tr class="memdesc:a10fc791278e51543fc685d5a4903fcd1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generate a random large integer. <a href="#a10fc791278e51543fc685d5a4903fcd1">More...</a><br /></td></tr>
+<tr class="separator:a10fc791278e51543fc685d5a4903fcd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f6ded73c6bb3dc340efd2a8978f8d7a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a1f6ded73c6bb3dc340efd2a8978f8d7a">VliCmp</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right)</td></tr>
+<tr class="memdesc:a1f6ded73c6bb3dc340efd2a8978f8d7a"><td class="mdescLeft">&#160;</td><td class="mdescRight">compare two large integers. <a href="#a1f6ded73c6bb3dc340efd2a8978f8d7a">More...</a><br /></td></tr>
+<tr class="separator:a1f6ded73c6bb3dc340efd2a8978f8d7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6373f1d28198a0f34f220bfcc2ecf040"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a6373f1d28198a0f34f220bfcc2ecf040">VliModAdd</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:a6373f1d28198a0f34f220bfcc2ecf040"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add two large integers modulo a value. <a href="#a6373f1d28198a0f34f220bfcc2ecf040">More...</a><br /></td></tr>
+<tr class="separator:a6373f1d28198a0f34f220bfcc2ecf040"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa53a875972ac2f10852fcaca92de2b40"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#aa53a875972ac2f10852fcaca92de2b40">VliModSub</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:aa53a875972ac2f10852fcaca92de2b40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtract two large integers modulo a value. <a href="#aa53a875972ac2f10852fcaca92de2b40">More...</a><br /></td></tr>
+<tr class="separator:aa53a875972ac2f10852fcaca92de2b40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a112a5d4118e101ec539e9669ebd4fdf9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a112a5d4118e101ec539e9669ebd4fdf9">VliModMul</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *left, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *right, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:a112a5d4118e101ec539e9669ebd4fdf9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two large integers modulo a value. <a href="#a112a5d4118e101ec539e9669ebd4fdf9">More...</a><br /></td></tr>
+<tr class="separator:a112a5d4118e101ec539e9669ebd4fdf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1f2257e949c0c4f26b24aec95e01452"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#aa1f2257e949c0c4f26b24aec95e01452">VliModExp</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *base, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *exp, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:aa1f2257e949c0c4f26b24aec95e01452"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exponentiate a large integer modulo a value. <a href="#aa1f2257e949c0c4f26b24aec95e01452">More...</a><br /></td></tr>
+<tr class="separator:aa1f2257e949c0c4f26b24aec95e01452"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d4ee194f13293e61bddf243e4241b4c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a3d4ee194f13293e61bddf243e4241b4c">VliModInv</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *input, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:a3d4ee194f13293e61bddf243e4241b4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invert a large integer modulo a value. <a href="#a3d4ee194f13293e61bddf243e4241b4c">More...</a><br /></td></tr>
+<tr class="separator:a3d4ee194f13293e61bddf243e4241b4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accf6070832e479e01c1268b0414645b9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#accf6070832e479e01c1268b0414645b9">VliModSquare</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *input, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:accf6070832e479e01c1268b0414645b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Square a large integer modulo a value. <a href="#accf6070832e479e01c1268b0414645b9">More...</a><br /></td></tr>
+<tr class="separator:accf6070832e479e01c1268b0414645b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5280e583a19e61ad815b02906c082033"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vli_8h.html#a5280e583a19e61ad815b02906c082033">VliModBarrett</a> (<a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *result, <a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a> const *input, <a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *mod)</td></tr>
+<tr class="memdesc:a5280e583a19e61ad815b02906c082033"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reduce a value to a modulo. <a href="#a5280e583a19e61ad815b02906c082033">More...</a><br /></td></tr>
+<tr class="separator:a5280e583a19e61ad815b02906c082033"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Definition of Large Integer math. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a566cfdc23f1c35230891d53139850032"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a566cfdc23f1c35230891d53139850032">&#9670;&nbsp;</a></span>VliAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uint32_t VliAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the carry portion of the addition. </dd></dl>
+
+</div>
+</div>
+<a id="ad1e2e5fe5fc466eff75dbe70fba3169f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad1e2e5fe5fc466eff75dbe70fba3169f">&#9670;&nbsp;</a></span>VliClear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliClear </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Clear a large integer's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>value to clear. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1f6ded73c6bb3dc340efd2a8978f8d7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f6ded73c6bb3dc340efd2a8978f8d7a">&#9670;&nbsp;</a></span>VliCmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int VliCmp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>compare two large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>the left hand value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>the right hand value.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the sign of left - right </dd></dl>
+
+</div>
+</div>
+<a id="a426db811cf4ee822bd4b6863f2e51d8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a426db811cf4ee822bd4b6863f2e51d8c">&#9670;&nbsp;</a></span>VliCondSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliCondSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>true_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>false_val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>truth_val</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Conditionally Set a large inter's value to one of two values. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">true_val</td><td>value to set if condition is true. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">false_val</td><td>value to set if condition is false. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">truth_val</td><td>value of condition. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8f6a41541103b1bde8428ea7f4b816fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f6a41541103b1bde8428ea7f4b816fa">&#9670;&nbsp;</a></span>VliIsZero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int VliIsZero </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>in</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test if a large integer is zero. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to test. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if indeed the value is zero. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a6373f1d28198a0f34f220bfcc2ecf040"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6373f1d28198a0f34f220bfcc2ecf040">&#9670;&nbsp;</a></span>VliModAdd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModAdd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add two large integers modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be added. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5280e583a19e61ad815b02906c082033"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5280e583a19e61ad815b02906c082033">&#9670;&nbsp;</a></span>VliModBarrett()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModBarrett </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a> const *&#160;</td>
+ <td class="paramname"><em>input</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Reduce a value to a modulo. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">input</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section warning"><dt>Warning</dt><dd>This function makes significant assumptions about the range of values input </dd></dl>
+
+</div>
+</div>
+<a id="aa1f2257e949c0c4f26b24aec95e01452"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1f2257e949c0c4f26b24aec95e01452">&#9670;&nbsp;</a></span>VliModExp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModExp </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>base</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>exp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Exponentiate a large integer modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">base</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">exp</td><td>the exponent. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3d4ee194f13293e61bddf243e4241b4c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d4ee194f13293e61bddf243e4241b4c">&#9670;&nbsp;</a></span>VliModInv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModInv </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>input</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invert a large integer modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">input</td><td>the value to invert. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a112a5d4118e101ec539e9669ebd4fdf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a112a5d4118e101ec539e9669ebd4fdf9">&#9670;&nbsp;</a></span>VliModMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two large integers modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="accf6070832e479e01c1268b0414645b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accf6070832e479e01c1268b0414645b9">&#9670;&nbsp;</a></span>VliModSquare()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModSquare </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>input</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Square a large integer modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">input</td><td>the base. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa53a875972ac2f10852fcaca92de2b40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa53a875972ac2f10852fcaca92de2b40">&#9670;&nbsp;</a></span>VliModSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliModSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>mod</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two large integers modulo a value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">mod</td><td>The modulo. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab6d63a825df6f224fe37c76b6bb67bcf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6d63a825df6f224fe37c76b6bb67bcf">&#9670;&nbsp;</a></span>VliMul()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliMul </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int_product.html">VeryLargeIntProduct</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>of multiplying left and right. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The first operand to be multiplied. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The second operand to be multiplied. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a10fc791278e51543fc685d5a4903fcd1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10fc791278e51543fc685d5a4903fcd1">&#9670;&nbsp;</a></span>VliRand()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int VliRand </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c">BitSupplier</a>&#160;</td>
+ <td class="paramname"><em>rnd_func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>rnd_param</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Generate a random large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">result</td><td>the random value. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_func</td><td>Random number generator. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">rnd_param</td><td>Pass through context data for rnd_func. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. </dd></dl>
+
+</div>
+</div>
+<a id="a4c7e60c47b82e5b2cf823d51b3a9fdcc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4c7e60c47b82e5b2cf823d51b3a9fdcc">&#9670;&nbsp;</a></span>VliRShift()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliRShift </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>shift</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Right shift a large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>The value to be shifted. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">shift</td><td>The number of bits to shift. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9a1df0e7770aa1421e41b87965e71425"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a1df0e7770aa1421e41b87965e71425">&#9670;&nbsp;</a></span>VliSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void VliSet </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set a large integer's value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac47d57834c67877c10ecdc230cdaf503"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac47d57834c67877c10ecdc230cdaf503">&#9670;&nbsp;</a></span>VliSub()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uint32_t VliSub </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> *&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>right</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtract two large integers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[out]</td><td class="paramname">result</td><td>target. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">left</td><td>The operand to be subtracted from. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">right</td><td>The operand to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on success, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="a80d1a80f5a21437354ee185923621d66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a80d1a80f5a21437354ee185923621d66">&#9670;&nbsp;</a></span>VliTestBit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uint32_t VliTestBit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="struct_very_large_int.html">VeryLargeInt</a> const *&#160;</td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uint32_t&#160;</td>
+ <td class="paramname"><em>bit</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Test the value of a bit in a large integer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>the value to test. </td></tr>
+ <tr><td class="paramdir">[in]</td><td class="paramname">bit</td><td>the bit index.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>value of the bit (1 or 0). </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- HTML footer for doxygen 1.8.10-->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_12b90d9c027aaf878a834df729679a56.html">epid</a></li><li class="navelem"><a class="el" href="dir_512d3e62841a8535b716ec4cf8b9e950.html">member</a></li><li class="navelem"><a class="el" href="dir_ea12d375fc1eb79df248c0adf953af4f.html">tiny</a></li><li class="navelem"><a class="el" href="dir_5f2fc2cf41db41de2b55e03ffa7a1d16.html">math</a></li><li class="navelem"><a class="el" href="vli_8h.html">vli.h</a></li>
+ <li class="footer">
+ &copy; 2016-2017 Intel Corporation
+ </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..b115199
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+ <title>Intel&reg; Enhanced Privacy ID SDK</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+ <meta http-equiv="refresh" content="0; URL=html/index.html" />
+</head>
+
+<body>
+ Automatic redirection failed, please go to <a href=
+ "html/index.html">html/index.html</a>
+</body>
+</html>
diff --git a/epid/common-testhelper/1.1/epid_params-testhelper.cc b/epid/common-testhelper/1.1/epid_params-testhelper.cc
new file mode 100644
index 0000000..46aa850
--- /dev/null
+++ b/epid/common-testhelper/1.1/epid_params-testhelper.cc
@@ -0,0 +1,216 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 parameters C++ wrapper implementation.
+ */
+
+#include <cstring>
+
+#include "epid/common-testhelper/1.1/epid_params-testhelper.h"
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/math/src/pairing-internal.h"
+}
+
+#ifndef COUNT_OF
+#define COUNT_OF(a) (sizeof(a) / sizeof((a)[0]))
+#endif // COUNT_OF
+
+Epid11ParamsObj::Epid11ParamsObj() {
+ // construct Fq finite field
+ FiniteFieldObj fq(this->q_str_);
+
+ // Create G1
+ // G1 is an elliptic curve group E(Fq).It can be initialized as follows:
+ // Set G1 = E(Fq).init(p, q, h, a, b, g1.x, g1.y)
+ G1 = EcGroupObj(&fq, FfElementObj(&fq, a_str_), FfElementObj(&fq, b_str_),
+ FfElementObj(&fq, g1_str_.x), FfElementObj(&fq, g1_str_.y),
+ BigNumObj(p_str_), BigNumObj(h_str_));
+
+ // construct Fq1 finite field
+ FiniteFieldObj fq1(this->q1_str_);
+
+ // Create G3
+ // G3 is an elliptic curve group E(Fq) as well (but with different
+ // parameters).
+ // It can be initialized as follows:
+ // Set G3 = Fq.init(p', q', h', a', b', g3.x, g3.y)
+ G3 =
+ EcGroupObj(&fq1, FfElementObj(&fq1, a1_str_), FfElementObj(&fq1, b1_str_),
+ FfElementObj(&fq1, g3_str_.x), FfElementObj(&fq1, g3_str_.y),
+ BigNumObj(p1_str_), BigNumObj(h1_str_));
+
+ // construct Fqd finite field
+ FiniteFieldObj fqd(fq, this->coeffs_str_, COUNT_OF(this->coeffs_str_));
+
+ // Fqk ground element is {-qnr, 0, 0}
+ FfElementObj neg_qnr(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, qnr_str), neg_qnr));
+ Fq3ElemStr ground_element_str = {0};
+ THROW_ON_EPIDERR(WriteFfElement(fq, neg_qnr, &ground_element_str.a[0],
+ sizeof(ground_element_str.a[0])));
+ FfElementObj ground_element(&fqd, ground_element_str);
+
+ // construct GT:=Fqk finite field
+ GT = FiniteFieldObj(fqd, ground_element, 2);
+
+ // G2 is an elliptic curve group E(Fqd).It can be initialized as follows:
+
+ FfElementObj qnr(&fq, qnr_str);
+
+ // twista = (a * qnr * qnr) mod q
+ FfElementObj twista_fq(&fq, a_str_);
+ THROW_ON_EPIDERR(FfMul(fq, twista_fq, qnr, twista_fq));
+ THROW_ON_EPIDERR(FfMul(fq, twista_fq, qnr, twista_fq));
+ Fq3ElemStr twista_str = {0};
+ THROW_ON_EPIDERR(
+ WriteFfElement(fq, twista_fq, &twista_str.a[0], sizeof(twista_str.a[0])));
+
+ // twistb = (b * qnr * qnr * qnr) mod q
+ FfElementObj twistb_fq(&fq, b_str_);
+ THROW_ON_EPIDERR(FfMul(fq, twistb_fq, qnr, twistb_fq));
+ THROW_ON_EPIDERR(FfMul(fq, twistb_fq, qnr, twistb_fq));
+ THROW_ON_EPIDERR(FfMul(fq, twistb_fq, qnr, twistb_fq));
+ Fq3ElemStr twistb_str = {0};
+ THROW_ON_EPIDERR(
+ WriteFfElement(fq, twistb_fq, &twistb_str.a[0], sizeof(twistb_str.a[0])));
+
+ // cofactor is 1 for G2
+ const BigNumStr h2_str_ = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+
+ // Create G2
+ // Set G2 = E(Fqd).init(orderG2, param(Fqd), twista, twistb, g2.x, g2.y).
+ G2 = EcGroupObj(&fqd, FfElementObj(&fqd, twista_str),
+ FfElementObj(&fqd, twistb_str), FfElementObj(&fqd, g2x_str_),
+ FfElementObj(&fqd, g2y_str_), BigNumObj(orderG2_str),
+ BigNumObj(h2_str_));
+}
+
+const BigNumStr Epid11ParamsObj::p_str_ = {
+ {{0x00, 0x00, 0x89, 0x57, 0x3F, 0x17, 0x47, 0x30, 0x8C, 0x43, 0xD5,
+ 0xEE, 0x41, 0x97, 0x96, 0x19, 0x72, 0xBB, 0x86, 0x88, 0xED, 0x4B,
+ 0xEF, 0x04, 0xAB, 0xAE, 0xC3, 0x8E, 0xEC, 0x51, 0xC3, 0xD3}}};
+
+const BigNumStr Epid11ParamsObj::q_str_ = {
+ {{0x09, 0xF9, 0x24, 0xE5, 0xD9, 0xBC, 0x67, 0x7F, 0x81, 0x0D, 0xF0,
+ 0x25, 0x58, 0xF7, 0x53, 0x13, 0xA9, 0x8A, 0xA6, 0x10, 0x47, 0x65,
+ 0x5D, 0x73, 0x9E, 0xF1, 0x94, 0xEB, 0x05, 0xB1, 0xA7, 0x11}}};
+
+const std::vector<uint8_t> Epid11ParamsObj::h_str_ = {0x00, 0x00, 0x12, 0x97};
+const FqElemStr Epid11ParamsObj::a_str_ = {
+ {{0x05, 0x53, 0xD7, 0xC8, 0x81, 0xF7, 0x78, 0xC2, 0x2C, 0x37, 0xB6,
+ 0xC0, 0x16, 0x3E, 0x68, 0x24, 0x3A, 0x84, 0x78, 0x1C, 0x0A, 0xDF,
+ 0x9B, 0xB3, 0xED, 0x21, 0xC4, 0x46, 0xE5, 0xA7, 0xA3, 0x92}}};
+const FqElemStr Epid11ParamsObj::b_str_ = {
+ {{0x00, 0x3A, 0x2E, 0x39, 0x0E, 0x10, 0xD8, 0xAC, 0x47, 0xCB, 0x29,
+ 0xC8, 0xF1, 0x2C, 0x7F, 0x11, 0x99, 0x2A, 0x18, 0xB7, 0xEF, 0x73,
+ 0x48, 0xA6, 0xBE, 0x70, 0xA6, 0x8B, 0x97, 0x34, 0x8A, 0xB1}}};
+
+const BigNumStr Epid11ParamsObj::coeffs_str_[3] = {
+ {{{0x02, 0x16, 0x7A, 0x61, 0x53, 0xDD, 0xF6, 0xE2, 0x89, 0x15, 0xA0,
+ 0x94, 0xF1, 0xB5, 0xDC, 0x65, 0x21, 0x15, 0x62, 0xE1, 0x7D, 0xC5,
+ 0x43, 0x89, 0xEE, 0xB4, 0xEF, 0xC8, 0xA0, 0x8E, 0x34, 0x0F}}},
+
+ {{{0x04, 0x82, 0x27, 0xE1, 0xEB, 0x98, 0x64, 0xC2, 0x8D, 0x8F, 0xDD,
+ 0x0E, 0x82, 0x40, 0xAE, 0xD4, 0x31, 0x63, 0xD6, 0x46, 0x32, 0x16,
+ 0x85, 0x7A, 0xB7, 0x18, 0x68, 0xB8, 0x17, 0x02, 0x81, 0xA6}}},
+
+ {{{0x06, 0x20, 0x76, 0xE8, 0x54, 0x54, 0x53, 0xB4, 0xA9, 0xD8, 0x44,
+ 0x4B, 0xAA, 0xFB, 0x1C, 0xFD, 0xAE, 0x15, 0xCA, 0x29, 0x79, 0xA6,
+ 0x24, 0xA4, 0x0A, 0xF6, 0x1E, 0xAC, 0xED, 0xFB, 0x10, 0x41}}}};
+
+const FqElemStr Epid11ParamsObj::qnr_str = {
+ {0x08, 0x66, 0xA7, 0x67, 0x36, 0x6E, 0x62, 0x71, 0xB7, 0xA6, 0x52,
+ 0x94, 0x8F, 0xFB, 0x25, 0x9E, 0xE6, 0x4F, 0x25, 0xE5, 0x26, 0x9A,
+ 0x2B, 0x6E, 0x7E, 0xF8, 0xA6, 0x39, 0xAE, 0x46, 0xAA, 0x24}};
+
+const std::vector<uint8_t> Epid11ParamsObj::orderG2_str = {
+ 0x00, 0x03, 0xDF, 0xFC, 0xBE, 0x2F, 0x5C, 0x2E, 0x45, 0x49, 0x7A, 0x2A,
+ 0x91, 0xBA, 0xD1, 0x3E, 0x01, 0xEC, 0x5F, 0xC2, 0x15, 0x14, 0x10, 0xB3,
+ 0x28, 0x5E, 0x56, 0xCC, 0x26, 0x51, 0x24, 0x93, 0x0E, 0x6C, 0x99, 0x96,
+ 0x38, 0xE0, 0x7D, 0x68, 0x8C, 0xB7, 0x97, 0x23, 0xF4, 0xAC, 0x4D, 0xBC,
+ 0x5E, 0x01, 0x15, 0xFF, 0x45, 0x60, 0x08, 0x13, 0xCD, 0x59, 0xD7, 0x73,
+ 0xB0, 0x0C, 0x20, 0x5E, 0xAB, 0xAA, 0x24, 0x31, 0xE2, 0x2A, 0xA2, 0x53,
+ 0x8A, 0xF7, 0x86, 0xD5, 0x19, 0x78, 0xC5, 0x55, 0x9C, 0x08, 0xB7, 0xE2,
+ 0xF4, 0xD0, 0x37, 0x74, 0x93, 0x56, 0x62, 0x7B, 0x95, 0xCC, 0x2C, 0xB0};
+
+const BigNumStr Epid11ParamsObj::p1_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17,
+ 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51}}};
+
+const BigNumStr Epid11ParamsObj::q1_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}};
+
+const std::vector<uint8_t> Epid11ParamsObj::h1_str_ = {0x00, 0x00, 0x00, 0x01};
+
+const FqElemStr Epid11ParamsObj::a1_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}}};
+const FqElemStr Epid11ParamsObj::b1_str_ = {
+ {{0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD,
+ 0x55, 0x76, 0x98, 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53,
+ 0xB0, 0xF6, 0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2, 0x60, 0x4B}}};
+
+const Epid11G1ElemStr Epid11ParamsObj::g1_str_ = {
+ {{{0x07, 0x78, 0x3B, 0x0D, 0xFE, 0x4A, 0xA3, 0x19, 0x49, 0xB0, 0xCE,
+ 0xAF, 0x3F, 0x74, 0x0F, 0x32, 0x16, 0x0C, 0x8B, 0x46, 0x94, 0x5B,
+ 0xA5, 0xB0, 0xE4, 0x8A, 0xDA, 0xD8, 0x88, 0x32, 0x90, 0x53}}},
+ {{{0x08, 0xF7, 0xA2, 0xAA, 0xBA, 0x62, 0xB3, 0xFE, 0x29, 0x80, 0xC9,
+ 0x5B, 0x63, 0x53, 0xC8, 0x24, 0x3C, 0x7C, 0x1F, 0x4C, 0xDA, 0xCD,
+ 0xE5, 0x5F, 0xA2, 0x36, 0x93, 0x04, 0x3C, 0x3A, 0xBC, 0x2E}}}};
+const Fq3ElemStr Epid11ParamsObj::g2x_str_ = {
+ {{{{0x02, 0x10, 0x9A, 0xF4, 0x06, 0x32, 0x30, 0x89, 0xCB, 0x95, 0xE9,
+ 0x55, 0x0E, 0x9D, 0xAF, 0x0E, 0x98, 0xCD, 0xCA, 0xDC, 0xB1, 0xFF,
+ 0xFC, 0xD1, 0x45, 0x66, 0xBB, 0x86, 0x46, 0x1E, 0x8C, 0x30}}},
+ {{{0x04, 0x78, 0x53, 0xE1, 0x3F, 0x96, 0xC5, 0xE4, 0x15, 0x23, 0x7B,
+ 0x1F, 0x3F, 0x2C, 0xD3, 0x95, 0x40, 0xBC, 0x7A, 0x31, 0x1F, 0x14,
+ 0x38, 0x9E, 0x1A, 0xA5, 0xD6, 0x63, 0x10, 0x91, 0xE4, 0xD3}}},
+ {{{0x00, 0xB4, 0x02, 0xBC, 0x47, 0xFA, 0xA6, 0x29, 0x82, 0x0B, 0xB1,
+ 0xD5, 0xFF, 0xF2, 0xE6, 0xB0, 0xC6, 0xAE, 0xE8, 0x7B, 0x91, 0xD9,
+ 0xEE, 0x66, 0x07, 0x1F, 0xFD, 0xA2, 0xE7, 0x02, 0x66, 0xDD}}}}};
+
+const Fq3ElemStr Epid11ParamsObj::g2y_str_ = {
+ {{{{0x05, 0x2E, 0xF8, 0xC6, 0xC1, 0x6A, 0xEF, 0x3C, 0xC1, 0x95, 0xF6,
+ 0x26, 0xCE, 0x5E, 0x55, 0xD1, 0x64, 0x13, 0x28, 0xB1, 0x18, 0x57,
+ 0xD8, 0x1B, 0x84, 0xFA, 0xEC, 0x7E, 0x5D, 0x99, 0x06, 0x49}}},
+ {{{0x05, 0x73, 0x35, 0xA9, 0xA7, 0xF2, 0xA1, 0x92, 0x5F, 0x3E, 0x7C,
+ 0xDF, 0xAC, 0xFE, 0x0F, 0xF5, 0x08, 0xD0, 0x3C, 0xAE, 0xCD, 0x58,
+ 0x00, 0x5F, 0xD0, 0x84, 0x7E, 0xEA, 0x63, 0x57, 0xFE, 0xC6}}},
+ {{{0x01, 0x56, 0xDA, 0xF3, 0x72, 0x61, 0xDA, 0xC6, 0x93, 0xB0, 0xAC,
+ 0xEF, 0xAA, 0xD4, 0x51, 0x6D, 0xCA, 0x71, 0x1E, 0x06, 0x73, 0xEA,
+ 0x83, 0xB2, 0xB1, 0x99, 0x4A, 0x4D, 0x4A, 0x0D, 0x35, 0x07}}}}};
+const Epid11G3ElemStr Epid11ParamsObj::g3_str_ = {
+ {{{0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6,
+ 0xE5, 0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB,
+ 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96}}},
+ {{{0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB,
+ 0x4A, 0x7C, 0x0F, 0x9E, 0x16, 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31,
+ 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5}}}};
diff --git a/epid/common-testhelper/1.1/epid_params-testhelper.h b/epid/common-testhelper/1.1/epid_params-testhelper.h
new file mode 100644
index 0000000..1792392
--- /dev/null
+++ b/epid/common-testhelper/1.1/epid_params-testhelper.h
@@ -0,0 +1,78 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Intel(R) EPID 1.1 parameters C++ wrapper interface.
+*/
+#ifndef EPID_COMMON_TESTHELPER_1_1_EPID_PARAMS_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_1_1_EPID_PARAMS_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+}
+
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+class Epid11ParamsObj {
+ public:
+ Epid11ParamsObj();
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ Epid11ParamsObj(const Epid11ParamsObj&) = delete;
+ Epid11ParamsObj& operator=(const Epid11ParamsObj&) = delete;
+
+ virtual ~Epid11ParamsObj() {}
+
+ FiniteFieldObj GT;
+ EcGroupObj G1;
+ EcGroupObj G2;
+ EcGroupObj G3;
+
+ private:
+ static const BigNumStr p_str_;
+ static const BigNumStr q_str_;
+ static const std::vector<uint8_t> h_str_;
+ static const FqElemStr a_str_;
+ static const FqElemStr b_str_;
+ static const BigNumStr coeffs_str_[3];
+ static const FqElemStr qnr_str;
+
+ static const std::vector<uint8_t> orderG2_str;
+
+ static const BigNumStr p1_str_;
+ static const BigNumStr q1_str_;
+ static const std::vector<uint8_t> h1_str_;
+ static const FqElemStr a1_str_;
+ static const FqElemStr b1_str_;
+
+ static const Epid11G1ElemStr g1_str_;
+ static const Fq3ElemStr g2x_str_;
+ static const Fq3ElemStr g2y_str_;
+ static const Epid11G3ElemStr g3_str_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_1_1_EPID_PARAMS_TESTHELPER_H_
diff --git a/epid/common-testhelper/1.1/testdata/grp01/member0/sig_bsn0_msg_0_255_sha256.inc b/epid/common-testhelper/1.1/testdata/grp01/member0/sig_bsn0_msg_0_255_sha256.inc
new file mode 100644
index 0000000..b8639f5
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp01/member0/sig_bsn0_msg_0_255_sha256.inc
@@ -0,0 +1,89 @@
+ /*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : groupA
+ * Signer : member0
+ * HashAlg : Sha512
+ * Message : bytes [0, 255]
+ * Basename: Random
+ * SigRl : SigRl of group
+ */
+0x8d, 0x1c, 0x17, 0x76, 0x00, 0x19, 0xe0, 0xdd,
+0xd7, 0xf3, 0xad, 0x12, 0xf0, 0x68, 0xd2, 0xa4, 0x45, 0xfb, 0xfb, 0x79,
+0x4d, 0x8d, 0xef, 0x13, 0x62, 0x19, 0x12, 0x7a, 0x5f, 0xfb, 0xdb, 0x49,
+0x6a, 0x73, 0x37, 0x9e, 0xe7, 0x9f, 0x91, 0x3b, 0xba, 0x77, 0xac, 0xae,
+0x10, 0x91, 0xb0, 0xa5, 0xab, 0x3d, 0xc8, 0x69, 0x07, 0x9a, 0x73, 0xdd,
+0x64, 0x3b, 0xed, 0x0b, 0x26, 0x63, 0x28, 0xc7, 0x5b, 0x84, 0xb9, 0x94,
+0xdb, 0xac, 0xfc, 0xcc, 0x7c, 0x46, 0xd7, 0x12, 0xee, 0xb2, 0x49, 0x8e,
+0xb9, 0x9f, 0xf7, 0x96, 0xf9, 0x83, 0xf3, 0xfb, 0xb5, 0xd6, 0x26, 0x3b,
+0xde, 0x99, 0xa3, 0x97, 0x7e, 0xe8, 0x57, 0x93, 0xe2, 0xd9, 0xa3, 0x8c,
+0xc6, 0xb0, 0x74, 0xfd, 0x2d, 0x2d, 0xe7, 0x9f, 0xe3, 0xf0, 0xf5, 0x4c,
+0xe5, 0xb3, 0xdc, 0xfc, 0xac, 0xac, 0xe7, 0x83, 0x2c, 0xe7, 0x8a, 0xe1,
+0x03, 0x6c, 0xfd, 0xa5, 0x46, 0xab, 0xe0, 0x50, 0xd4, 0x86, 0x5e, 0xbf,
+0x03, 0xfb, 0xac, 0xca, 0x4f, 0x89, 0x2c, 0x7c, 0xeb, 0xad, 0x43, 0x19,
+0x21, 0x7d, 0x00, 0x2a, 0x2c, 0x14, 0x20, 0x4d, 0x06, 0xc0, 0x28, 0x96,
+0x1c, 0x3a, 0x3c, 0x81, 0x01, 0x9b, 0x38, 0xd1, 0x4c, 0x00, 0xe8, 0x6c,
+0x44, 0xe6, 0x3a, 0xeb, 0x72, 0x94, 0x06, 0xd4, 0x06, 0x46, 0xc0, 0xf3,
+0xd3, 0xc5, 0xdf, 0x5e, 0x02, 0x13, 0x72, 0x81, 0x96, 0x2c, 0x98, 0x19,
+0x9c, 0x61, 0xc1, 0xe7, 0xf8, 0x94, 0x24, 0x33, 0x7b, 0xea, 0x97, 0x9a,
+0x2f, 0x99, 0x46, 0x0e, 0xd6, 0x0f, 0x3a, 0x66, 0xf0, 0xb9, 0xa6, 0xa7,
+0x03, 0xee, 0xb1, 0xfc, 0x8b, 0xa8, 0xf4, 0xad, 0x77, 0xc1, 0x26, 0x63,
+0x47, 0x81, 0x5c, 0x01, 0x67, 0xf5, 0x43, 0xfb, 0xec, 0x58, 0xd7, 0x20,
+0xd8, 0xe2, 0xba, 0xdb, 0x95, 0x74, 0xd5, 0x18, 0xda, 0x7d, 0xf7, 0xf6,
+0xa8, 0x4d, 0x0f, 0x82, 0x60, 0xe7, 0x21, 0x38, 0x11, 0x4b, 0x81, 0x40,
+0x63, 0x08, 0x5c, 0x9c, 0x86, 0xbe, 0x2a, 0x53, 0x69, 0x54, 0xbe, 0x0f,
+0x4f, 0xb6, 0x60, 0x88, 0xd0, 0x28, 0x83, 0xf7, 0xea, 0xaa, 0xcb, 0xdb,
+0xdf, 0x89, 0x00, 0x00, 0x56, 0xac, 0x9e, 0x51, 0x7d, 0xc0, 0xe1, 0x77,
+0x93, 0xb8, 0x18, 0x2a, 0x1a, 0x95, 0xe4, 0x7c, 0x21, 0x14, 0x5a, 0xa7,
+0x35, 0x8d, 0xb9, 0xcd, 0x0c, 0xc8, 0x33, 0x93, 0x47, 0x87, 0x00, 0x00,
+0x5a, 0xf8, 0x3f, 0x82, 0x6a, 0x6f, 0x85, 0x75, 0x83, 0xfe, 0x50, 0x3d,
+0xeb, 0x68, 0xbd, 0x6d, 0xe6, 0x14, 0xb9, 0x16, 0xab, 0x84, 0x76, 0x59,
+0x42, 0x4a, 0x9f, 0x61, 0xac, 0xa7, 0x00, 0x80, 0xbb, 0x20, 0xfe, 0xb1,
+0x3e, 0xee, 0x68, 0x07, 0xc7, 0xcf, 0x2d, 0x2d, 0x98, 0x18, 0xa0, 0x8d,
+0x91, 0xd5, 0x7f, 0x23, 0x05, 0x2e, 0x35, 0x06, 0xdd, 0xe0, 0xab, 0xd7,
+0x90, 0x2e, 0x53, 0xcc, 0xa1, 0xfd, 0x17, 0x28, 0xbf, 0x91, 0xd6, 0x32,
+0xc8, 0x48, 0xdc, 0x97, 0xae, 0xe2, 0xf4, 0x22, 0x4d, 0xb0, 0x7c, 0xc4,
+0x14, 0xb6, 0x6f, 0x02, 0x54, 0xc3, 0x9a, 0x89, 0xec, 0xbf, 0x41, 0x5f,
+0xda, 0x16, 0x34, 0xd3, 0x1f, 0x77, 0x50, 0x44, 0xb6, 0x00, 0x00, 0x19,
+0xa9, 0x7e, 0xc9, 0x58, 0x95, 0x9d, 0xc7, 0x3e, 0x25, 0x78, 0x75, 0xa1,
+0x1a, 0x68, 0x61, 0x42, 0x94, 0x1a, 0xdc, 0x73, 0xee, 0x23, 0x2e, 0x85,
+0xa1, 0x3e, 0xe8, 0xdc, 0x9d, 0x00, 0x00, 0x65, 0x16, 0x55, 0x42, 0xbc,
+0x48, 0xdc, 0x13, 0xf5, 0xd9, 0x77, 0x89, 0x25, 0x4a, 0x1f, 0x12, 0xf0,
+0x7a, 0xce, 0x98, 0xd8, 0xbe, 0x96, 0x08, 0x04, 0x75, 0x45, 0xc1, 0x63,
+0xd6, 0x00, 0x00, 0x21, 0xdb, 0x1d, 0x9f, 0xe5, 0xbc, 0x64, 0x2c, 0x3c,
+0x37, 0xac, 0xd4, 0x18, 0xf6, 0xf5, 0x52, 0xae, 0xe6, 0x54, 0x19, 0x6e,
+0xac, 0x83, 0x28, 0x43, 0xa7, 0x49, 0xea, 0x94, 0x6f, 0x00, 0x00, 0x72,
+0x8d, 0x9d, 0x41, 0x1d, 0x81, 0x24, 0x13, 0xe4, 0x92, 0x3e, 0x1d, 0x94,
+0x1a, 0x79, 0x04, 0x33, 0xd1, 0x9a, 0xe5, 0x17, 0xf4, 0x7f, 0xf8, 0xd0,
+0x23, 0x2f, 0x15, 0x20, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+0x01, 0x79, 0xc4, 0x6e, 0xb2, 0xb9, 0x0d, 0x82, 0x0e, 0x43, 0x6b, 0x62,
+0xdd, 0xaa, 0xf4, 0xe5, 0x60, 0x60, 0xa0, 0xf6, 0x0f, 0x0a, 0x3a, 0xd4,
+0x10, 0xfb, 0x3d, 0x9e, 0x65, 0x3d, 0xf8, 0xf2, 0x6b, 0x9e, 0x4f, 0xb1,
+0xe1, 0xad, 0x06, 0x71, 0xc1, 0xe2, 0xb8, 0x9b, 0xcd, 0x56, 0x2b, 0xca,
+0xa7, 0x0a, 0x44, 0x9a, 0xdb, 0xa6, 0x4d, 0x7d, 0xb5, 0xe0, 0x76, 0x9d,
+0x24, 0x45, 0x87, 0x5f, 0x01, 0x79, 0xce, 0xb3, 0xc1, 0x34, 0xa3, 0xab,
+0x7f, 0x86, 0x95, 0x19, 0x02, 0xa4, 0xdc, 0xb0, 0x47, 0xd6, 0x69, 0x21,
+0x22, 0x00, 0xc5, 0x82, 0xc6, 0x70, 0x1d, 0x5d, 0xaf, 0xe4, 0x20, 0xa3,
+0x71, 0xf3, 0x29, 0x5a, 0xe1, 0x59, 0x3a, 0x66, 0x02, 0x0d, 0xe1, 0x01,
+0x10, 0xab, 0x17, 0x17, 0x30, 0x8e, 0x1d, 0xb2, 0x1b, 0x71, 0x92, 0x02,
+0xe1, 0x91, 0xa9, 0xd5, 0xdb, 0xc7, 0x20, 0x72, 0x09, 0x93, 0xe8, 0x64,
+0x63, 0x3a, 0x6a, 0x4a, 0xc9, 0x4e, 0x20, 0x19, 0x6f, 0xb5, 0x5e, 0x37,
+0x01, 0x38, 0x82, 0x7a, 0x74, 0x87, 0x29, 0xbb, 0xd2, 0xca, 0x24, 0xf5,
+0x75, 0x17, 0xdc, 0xd3, 0x60
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/corrupted_privrl.inc b/epid/common-testhelper/1.1/testdata/grp_x/corrupted_privrl.inc
new file mode 100644
index 0000000..6972ab7
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/corrupted_privrl.inc
@@ -0,0 +1,35 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 private-key based revocation list
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ // Group ID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x03,
+ // n1
+ 0x00, 0x00, 0x00, 0x01,
+ // f[1]
+ 0x00, 0x00, 0x89, 0x57, 0x3F, 0x17, 0x47, 0x30, 0x8C, 0x43, 0xD5, 0xEE,
+ 0x41, 0x97, 0x96, 0x19, 0x72, 0xBB, 0x86, 0x88, 0xED, 0x4B, 0xEF, 0x04,
+ 0xAB, 0xAE, 0xC3, 0x8E, 0xEC, 0x51, 0xC3, 0xD3
+//};
+// unsigned int privrl_dat_len = 44;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/epid_grpcrt.inc b/epid/common-testhelper/1.1/testdata/grp_x/epid_grpcrt.inc
new file mode 100644
index 0000000..b3ba691
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/epid_grpcrt.inc
@@ -0,0 +1,52 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 group public key
+ * Group : grpX
+ */
+//unsigned char epid_grpcrt_dat[] = {
+ 0x00, 0x00, 0x00, 0x7b, 0x08, 0x4a, 0x9d, 0x2e, 0xf9, 0x4f, 0x78, 0x02,
+ 0xd7, 0x89, 0x75, 0xb4, 0xe7, 0x25, 0x26, 0x9f, 0x00, 0x57, 0xad, 0x33,
+ 0x30, 0xea, 0xa9, 0x6c, 0x00, 0x9e, 0x8b, 0xc8, 0x13, 0x23, 0xcb, 0x06,
+ 0x04, 0xbe, 0x42, 0x74, 0x11, 0x07, 0xb1, 0x06, 0xd7, 0xef, 0x5f, 0x66,
+ 0x87, 0xd9, 0xfa, 0xdd, 0x53, 0xae, 0xd7, 0xf4, 0x54, 0xf8, 0xd0, 0x21,
+ 0x75, 0xe0, 0x07, 0x44, 0xc9, 0xc3, 0x4e, 0xf7, 0x06, 0xd8, 0xa9, 0x90,
+ 0x02, 0x8f, 0xca, 0xa5, 0x73, 0x36, 0x24, 0x03, 0xc9, 0xa8, 0x7e, 0x9d,
+ 0x64, 0x12, 0xac, 0xa7, 0xbd, 0x17, 0x7f, 0x7c, 0x96, 0x8d, 0x2e, 0x13,
+ 0xd9, 0xb2, 0x69, 0x47, 0x09, 0xdb, 0xe3, 0xbf, 0xbc, 0xa1, 0x34, 0x0f,
+ 0xc6, 0xe2, 0x00, 0x3d, 0x98, 0xa3, 0x7d, 0xab, 0xd4, 0x0e, 0xec, 0xde,
+ 0x4f, 0x97, 0xa9, 0xbb, 0xdd, 0x60, 0x94, 0x24, 0x7b, 0xb3, 0xf5, 0x94,
+ 0x02, 0x43, 0x78, 0x9f, 0x54, 0xc1, 0x21, 0x3a, 0x2b, 0x4d, 0x12, 0x65,
+ 0x2f, 0x51, 0x94, 0xc6, 0x34, 0x24, 0xd9, 0x7b, 0x06, 0x3a, 0xc4, 0xf5,
+ 0x56, 0xeb, 0x32, 0xe3, 0xee, 0x7b, 0xad, 0x6b, 0x04, 0x90, 0x86, 0x31,
+ 0x18, 0x2a, 0xa4, 0xcf, 0xa3, 0x90, 0xa5, 0x80, 0x7b, 0xae, 0x3b, 0xb1,
+ 0x77, 0x03, 0xe7, 0x7e, 0xf2, 0xfc, 0x6d, 0x3a, 0xab, 0x8f, 0xbf, 0x95,
+ 0x40, 0xed, 0x08, 0x03, 0x01, 0x05, 0x86, 0xf5, 0x42, 0xea, 0x4d, 0xf7,
+ 0x4f, 0xef, 0x46, 0xdf, 0x8f, 0xe8, 0x2d, 0xbb, 0x5d, 0x0d, 0x2f, 0x4f,
+ 0xf4, 0xd8, 0x31, 0xc6, 0x5a, 0x97, 0x98, 0x44, 0xcf, 0x42, 0x5a, 0xf3,
+ 0x03, 0x5f, 0xb6, 0x38, 0x45, 0x5a, 0x15, 0x1e, 0xb9, 0x54, 0xfa, 0x2c,
+ 0x3f, 0x68, 0x7b, 0x4e, 0x85, 0x35, 0xf3, 0x5b, 0xe5, 0xdc, 0x96, 0x2b,
+ 0x18, 0x84, 0x5e, 0x1e, 0x53, 0xdc, 0x22, 0x23, 0x06, 0x08, 0x91, 0x5a,
+ 0x2d, 0x27, 0xe2, 0x12, 0x69, 0xfa, 0xab, 0x19, 0x7c, 0x47, 0x6b, 0xec,
+ 0xde, 0xc6, 0x25, 0xd4, 0x43, 0xb4, 0x65, 0x23, 0x61, 0x0f, 0x1f, 0x2d,
+ 0xfd, 0xb1, 0x18, 0xb0, 0x04, 0x8e, 0x1a, 0xc5, 0x95, 0x9a, 0x0e, 0x37,
+ 0x7c, 0x5e, 0x95, 0x38, 0xc2, 0xcf, 0xfa, 0x1f, 0xe3, 0x3a, 0x2b, 0x85,
+ 0xa5, 0xfd, 0x6b, 0xc4, 0x1d, 0xfb, 0x47, 0x27, 0xaf, 0xc1, 0x94, 0xcd
+// };
+//unsigned int epid_grpcrt_dat_len = 392;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..75b62e0
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : group x sigrl
+ */
+ //unsigned char sig_sha256_bsn0_msg0_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04,
+ 0x7b, 0xfc, 0x0a, 0x6c, 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41,
+ 0x3a, 0xc6, 0x01, 0x3a, 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c,
+ 0x84, 0xde, 0xc3, 0x3b, 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44,
+ 0x25, 0x98, 0x89, 0xdb, 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86,
+ 0x63, 0x8c, 0xe1, 0x93, 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+ 0x05, 0x39, 0x5a, 0xef, 0x26, 0xf8, 0x6c, 0x41, 0x5d, 0x7f, 0xb2, 0x63,
+ 0x92, 0x5c, 0xf4, 0x82, 0xa3, 0x93, 0xe3, 0x02, 0x14, 0x55, 0x47, 0x99,
+ 0xa5, 0xf9, 0xf7, 0xad, 0x1f, 0x66, 0x23, 0x50, 0x08, 0xab, 0x10, 0x95,
+ 0x9a, 0x0c, 0x0f, 0x62, 0xca, 0xcb, 0x63, 0x6f, 0xc6, 0xb3, 0xb1, 0x06,
+ 0x52, 0x33, 0x56, 0xad, 0x8e, 0xac, 0xfe, 0xe4, 0x56, 0x88, 0xed, 0x8e,
+ 0xdd, 0xa4, 0x20, 0x7f, 0x03, 0xb7, 0x4c, 0xda, 0xb1, 0x70, 0x9d, 0x8c,
+ 0x5b, 0x34, 0x08, 0x37, 0x84, 0xbc, 0xd0, 0x54, 0xdf, 0x52, 0x40, 0x41,
+ 0xfe, 0x58, 0x48, 0x86, 0x43, 0x51, 0xa9, 0x7d, 0x53, 0x21, 0x01, 0xe6,
+ 0x06, 0x2b, 0xd0, 0xd3, 0x8a, 0xe0, 0xb6, 0xc3, 0xad, 0xb3, 0x6c, 0x12,
+ 0x75, 0x50, 0x19, 0xd2, 0x69, 0xc7, 0x41, 0x98, 0xf3, 0xfb, 0x5c, 0x58,
+ 0xe0, 0x8c, 0x0b, 0x22, 0x6f, 0x05, 0xa1, 0x0e, 0x45, 0xce, 0x2e, 0x83,
+ 0xd8, 0xd9, 0xeb, 0xc9, 0x9a, 0x81, 0x38, 0x1d, 0x33, 0x9a, 0x16, 0x9f,
+ 0x4c, 0x06, 0xf0, 0xb2, 0xc1, 0x1d, 0xb8, 0x54, 0xe4, 0x0f, 0x61, 0x36,
+ 0xd8, 0xbc, 0xbf, 0x0c, 0x60, 0x71, 0xde, 0x72, 0x10, 0x0e, 0x0a, 0x30,
+ 0x04, 0x60, 0x00, 0x00, 0x78, 0xb5, 0xb6, 0xc2, 0xdd, 0x20, 0x6a, 0xb5,
+ 0xdf, 0x61, 0x64, 0xd0, 0xa9, 0x02, 0x88, 0x4c, 0xdd, 0x2b, 0x81, 0x79,
+ 0x2e, 0x50, 0xb6, 0x1c, 0xaa, 0xf0, 0x74, 0x31, 0x31, 0x34, 0x00, 0x00,
+ 0x0a, 0xd1, 0xbf, 0x34, 0xa2, 0x84, 0xc8, 0x9b, 0xdf, 0xdc, 0xb5, 0x95,
+ 0x4a, 0xad, 0x76, 0xc2, 0xc6, 0xb0, 0xa3, 0x77, 0x25, 0x76, 0xb3, 0x2e,
+ 0x34, 0xfb, 0x79, 0x16, 0x0a, 0x7c, 0x00, 0xaf, 0x5b, 0x22, 0x71, 0x98,
+ 0xb6, 0xeb, 0x67, 0x3d, 0x94, 0x4a, 0xb6, 0x5e, 0x99, 0x81, 0xc5, 0x96,
+ 0x91, 0x55, 0xba, 0x2f, 0x16, 0x01, 0x4e, 0xe1, 0x25, 0xad, 0xca, 0x94,
+ 0x88, 0x60, 0x3b, 0xa2, 0x56, 0x0a, 0x94, 0x0b, 0x2c, 0x3e, 0xd0, 0x8f,
+ 0x15, 0x07, 0x3d, 0xd5, 0xbe, 0x72, 0x3e, 0x2d, 0x06, 0x74, 0xff, 0x06,
+ 0xed, 0x47, 0x28, 0x08, 0x0c, 0xa0, 0x6f, 0xdb, 0x75, 0x55, 0x32, 0xdc,
+ 0x97, 0x47, 0x60, 0x4e, 0x6f, 0xb4, 0x29, 0x89, 0x0c, 0x00, 0x00, 0x37,
+ 0x1e, 0xcd, 0x0f, 0x66, 0x09, 0x7d, 0x33, 0x9a, 0xdc, 0x47, 0x28, 0xf7,
+ 0x91, 0xf3, 0xc2, 0xbc, 0x3a, 0xa9, 0x05, 0x62, 0xfc, 0xdd, 0x8c, 0x65,
+ 0xc2, 0xa8, 0x14, 0x55, 0x52, 0x00, 0x00, 0x11, 0xed, 0x83, 0xfc, 0x60,
+ 0x97, 0x7e, 0x5e, 0x15, 0xe0, 0x43, 0xdb, 0x01, 0x0b, 0xc7, 0x93, 0xa0,
+ 0xef, 0x08, 0xf6, 0x4f, 0x91, 0xda, 0x83, 0x14, 0x34, 0x0d, 0x4f, 0x25,
+ 0xaf, 0x00, 0x00, 0x80, 0x3d, 0xc0, 0x9e, 0x85, 0xc8, 0x48, 0x35, 0xf8,
+ 0xd2, 0x7b, 0x6b, 0xcf, 0xfc, 0xe9, 0xe4, 0x59, 0x6d, 0x06, 0x4e, 0x12,
+ 0x56, 0x00, 0xbc, 0xb4, 0x6e, 0x20, 0x3a, 0xf4, 0x34, 0x00, 0x00, 0x2e,
+ 0x06, 0xcd, 0x93, 0x4f, 0x39, 0x62, 0x0b, 0xb1, 0x12, 0xf4, 0x49, 0x22,
+ 0xe5, 0x55, 0x29, 0x08, 0xd0, 0x51, 0x02, 0x14, 0xc3, 0xc5, 0x6d, 0xa3,
+ 0xb0, 0xd9, 0x67, 0x61, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg0_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_single_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_single_entry.inc
new file mode 100644
index 0000000..f00bee5
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_single_entry.inc
@@ -0,0 +1,97 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_bsn0_msg0_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2, 0x05, 0x39, 0x5a, 0xef,
+ 0x26, 0xf8, 0x6c, 0x41, 0x5d, 0x7f, 0xb2, 0x63, 0x92, 0x5c, 0xf4, 0x82,
+ 0xa3, 0x93, 0xe3, 0x02, 0x14, 0x55, 0x47, 0x99, 0xa5, 0xf9, 0xf7, 0xad,
+ 0x1f, 0x66, 0x23, 0x50, 0x08, 0xab, 0x10, 0x95, 0x9a, 0x0c, 0x0f, 0x62,
+ 0xca, 0xcb, 0x63, 0x6f, 0xc6, 0xb3, 0xb1, 0x06, 0x52, 0x33, 0x56, 0xad,
+ 0x8e, 0xac, 0xfe, 0xe4, 0x56, 0x88, 0xed, 0x8e, 0xdd, 0xa4, 0x20, 0x7f,
+ 0x03, 0xb7, 0x4c, 0xda, 0xb1, 0x70, 0x9d, 0x8c, 0x5b, 0x34, 0x08, 0x37,
+ 0x84, 0xbc, 0xd0, 0x54, 0xdf, 0x52, 0x40, 0x41, 0xfe, 0x58, 0x48, 0x86,
+ 0x43, 0x51, 0xa9, 0x7d, 0x53, 0x21, 0x01, 0xe6, 0x06, 0x2b, 0xd0, 0xd3,
+ 0x8a, 0xe0, 0xb6, 0xc3, 0xad, 0xb3, 0x6c, 0x12, 0x75, 0x50, 0x19, 0xd2,
+ 0x69, 0xc7, 0x41, 0x98, 0xf3, 0xfb, 0x5c, 0x58, 0xe0, 0x8c, 0x0b, 0x22,
+ 0x6f, 0x05, 0xa1, 0x0e, 0x45, 0xce, 0x2e, 0x83, 0xd8, 0xd9, 0xeb, 0xc9,
+ 0x9a, 0x81, 0x38, 0x1d, 0x33, 0x9a, 0x16, 0x9f, 0x4c, 0x06, 0xf0, 0xb2,
+ 0xc1, 0x1d, 0xb8, 0x54, 0xe4, 0x0f, 0x61, 0x36, 0xd8, 0xbc, 0xbf, 0x0c,
+ 0x60, 0x71, 0xde, 0x72, 0x10, 0x0e, 0x0a, 0x30, 0x04, 0x60, 0x00, 0x00,
+ 0x78, 0xb5, 0xb6, 0xc2, 0xdd, 0x20, 0x6a, 0xb5, 0xdf, 0x61, 0x64, 0xd0,
+ 0xa9, 0x02, 0x88, 0x4c, 0xdd, 0x2b, 0x81, 0x79, 0x2e, 0x50, 0xb6, 0x1c,
+ 0xaa, 0xf0, 0x74, 0x31, 0x31, 0x34, 0x00, 0x00, 0x0a, 0xd1, 0xbf, 0x34,
+ 0xa2, 0x84, 0xc8, 0x9b, 0xdf, 0xdc, 0xb5, 0x95, 0x4a, 0xad, 0x76, 0xc2,
+ 0xc6, 0xb0, 0xa3, 0x77, 0x25, 0x76, 0xb3, 0x2e, 0x34, 0xfb, 0x79, 0x16,
+ 0x0a, 0x7c, 0x00, 0xaf, 0x5b, 0x22, 0x71, 0x98, 0xb6, 0xeb, 0x67, 0x3d,
+ 0x94, 0x4a, 0xb6, 0x5e, 0x99, 0x81, 0xc5, 0x96, 0x91, 0x55, 0xba, 0x2f,
+ 0x16, 0x01, 0x4e, 0xe1, 0x25, 0xad, 0xca, 0x94, 0x88, 0x60, 0x3b, 0xa2,
+ 0x56, 0x0a, 0x94, 0x0b, 0x2c, 0x3e, 0xd0, 0x8f, 0x15, 0x07, 0x3d, 0xd5,
+ 0xbe, 0x72, 0x3e, 0x2d, 0x06, 0x74, 0xff, 0x06, 0xed, 0x47, 0x28, 0x08,
+ 0x0c, 0xa0, 0x6f, 0xdb, 0x75, 0x55, 0x32, 0xdc, 0x97, 0x47, 0x60, 0x4e,
+ 0x6f, 0xb4, 0x29, 0x89, 0x0c, 0x00, 0x00, 0x37, 0x1e, 0xcd, 0x0f, 0x66,
+ 0x09, 0x7d, 0x33, 0x9a, 0xdc, 0x47, 0x28, 0xf7, 0x91, 0xf3, 0xc2, 0xbc,
+ 0x3a, 0xa9, 0x05, 0x62, 0xfc, 0xdd, 0x8c, 0x65, 0xc2, 0xa8, 0x14, 0x55,
+ 0x52, 0x00, 0x00, 0x11, 0xed, 0x83, 0xfc, 0x60, 0x97, 0x7e, 0x5e, 0x15,
+ 0xe0, 0x43, 0xdb, 0x01, 0x0b, 0xc7, 0x93, 0xa0, 0xef, 0x08, 0xf6, 0x4f,
+ 0x91, 0xda, 0x83, 0x14, 0x34, 0x0d, 0x4f, 0x25, 0xaf, 0x00, 0x00, 0x80,
+ 0x3d, 0xc0, 0x9e, 0x85, 0xc8, 0x48, 0x35, 0xf8, 0xd2, 0x7b, 0x6b, 0xcf,
+ 0xfc, 0xe9, 0xe4, 0x59, 0x6d, 0x06, 0x4e, 0x12, 0x56, 0x00, 0xbc, 0xb4,
+ 0x6e, 0x20, 0x3a, 0xf4, 0x34, 0x00, 0x00, 0x2e, 0x06, 0xcd, 0x93, 0x4f,
+ 0x39, 0x62, 0x0b, 0xb1, 0x12, 0xf4, 0x49, 0x22, 0xe5, 0x55, 0x29, 0x08,
+ 0xd0, 0x51, 0x02, 0x14, 0xc3, 0xc5, 0x6d, 0xa3, 0xb0, 0xd9, 0x67, 0x61,
+ 0xec,
+
+ 0x00, 0x00, 0x00, 0x01,
+
+ 0x00, 0x00, 0x00, 0x01,
+
+ 0x70, 0x1a, 0x63, 0xed, 0x78, 0xb4, 0xfa, 0xe1, 0x22, 0xc8, 0xfc, 0xd7,
+ 0xfb, 0xf4, 0x63, 0x1f, 0xcf, 0x82, 0x02, 0x28, 0xe5, 0x70, 0xe0, 0x4e,
+ 0x73, 0xbd, 0xdf, 0xa2, 0xaf, 0x5a, 0xfe, 0xc8, 0x58, 0x95, 0xed, 0x67,
+ 0xc9, 0xcf, 0x41, 0xe9, 0x5c, 0xd9, 0x71, 0x30, 0x7a, 0xa2, 0x8e, 0xfb,
+ 0xb2, 0x59, 0xd8, 0x12, 0x47, 0x5d, 0x9f, 0x8b, 0x2f, 0x8c, 0xb9, 0x2c,
+ 0xb5, 0x12, 0x3d, 0x4c, 0x46, 0x06, 0x99, 0x02, 0xe5, 0x20, 0x99, 0x77,
+ 0x98, 0x29, 0x51, 0xb2, 0xee, 0x7b, 0x6e, 0xd9, 0xed, 0xbc, 0x1d, 0xf3,
+ 0xfe, 0xe5, 0xdb, 0x98, 0x02, 0x1e, 0xc7, 0x6b, 0x87, 0xdb, 0x81, 0x74,
+ 0x3c, 0x40, 0xbf, 0x24, 0xcb, 0xce, 0xc5, 0x3a, 0xd0, 0xd3, 0x5d, 0xd9,
+ 0x2c, 0xaf, 0xe0, 0x33, 0x84, 0xb6, 0xc4, 0xa3, 0xd5, 0x54, 0xdb, 0x18,
+ 0x6d, 0x10, 0x02, 0x90, 0x00, 0xc1, 0xdc, 0x59, 0x76, 0xdb, 0x0e, 0x72,
+ 0x49, 0xa8, 0x6f, 0xb1, 0x8e, 0x7b, 0xbe, 0xf8, 0xf6, 0x93, 0xe0, 0x1a,
+ 0xcc, 0xac, 0xe8, 0x4d, 0xe4, 0x41, 0xc3, 0xe8, 0xaa, 0x4a, 0x25, 0x96,
+ 0xd4, 0xc2, 0x9a, 0x87
+//};
+// unsigned int sig_sha256_bsn0_msg0_dat_len = 733;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_three_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_three_entry.inc
new file mode 100644
index 0000000..7c80fe7
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_three_entry.inc
@@ -0,0 +1,127 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Test data.
+*
+* Type : Intel(R) EPID 1.1 Signature
+* Group : grpX
+* Signer : member0
+* HashAlg : Sha256
+* Message : "test message"
+* Basename: "basename1"
+* SigRl : group x sigrl
+*/
+//unsigned char epid_sig_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2, 0x06, 0x88, 0x3b, 0x78,
+ 0xf9, 0x69, 0x8f, 0x4f, 0x80, 0x9b, 0xc6, 0x38, 0x30, 0x10, 0x12, 0x82,
+ 0x31, 0x00, 0x61, 0x15, 0x2f, 0x4d, 0x56, 0x14, 0x67, 0x30, 0x24, 0xb9,
+ 0xeb, 0xed, 0x75, 0x80, 0x06, 0x23, 0xbe, 0x49, 0x73, 0x18, 0x07, 0xf0,
+ 0xd7, 0xd1, 0xe9, 0x20, 0x39, 0xfc, 0x94, 0xb2, 0xaf, 0x72, 0xd6, 0xe5,
+ 0x3d, 0x29, 0x40, 0xc0, 0x6c, 0x58, 0x4e, 0xe9, 0xe8, 0x49, 0x5d, 0x8e,
+ 0x08, 0x04, 0x55, 0xec, 0x09, 0x9e, 0x63, 0x24, 0x50, 0x5b, 0xc5, 0x08,
+ 0x5d, 0xb9, 0xd2, 0xcf, 0x70, 0x48, 0xd3, 0x2e, 0x53, 0x12, 0x97, 0x5e,
+ 0xa4, 0xa5, 0x9f, 0xb5, 0xc4, 0xd3, 0x5e, 0xc3, 0x05, 0x33, 0x98, 0x86,
+ 0xcd, 0xac, 0x34, 0x41, 0xee, 0xf5, 0x03, 0x05, 0xed, 0x4b, 0xca, 0x08,
+ 0xc8, 0x31, 0x63, 0xce, 0x9e, 0xd8, 0xe2, 0xba, 0x9a, 0x0d, 0x7e, 0x5e,
+ 0x79, 0xc1, 0x13, 0xd4, 0xa4, 0xe6, 0x5e, 0x44, 0x54, 0xad, 0x61, 0xb8,
+ 0x99, 0xb7, 0xaf, 0xdc, 0x54, 0xf8, 0x3e, 0x5d, 0x47, 0xa9, 0x05, 0xdb,
+ 0xb6, 0xc1, 0x85, 0x1f, 0xaf, 0xb1, 0xe1, 0x0d, 0xd4, 0x71, 0x1b, 0x91,
+ 0x29, 0x69, 0x02, 0xd6, 0x0b, 0xd4, 0x33, 0x66, 0x4b, 0x5e, 0x00, 0x00,
+ 0x13, 0x3e, 0x2c, 0x68, 0xd2, 0x0b, 0x68, 0x2c, 0x22, 0x9d, 0x2d, 0xf0,
+ 0x74, 0x29, 0x87, 0x58, 0xb9, 0xa0, 0xc2, 0xdb, 0xd8, 0x68, 0xba, 0x46,
+ 0xc7, 0x75, 0x5b, 0x94, 0x4c, 0x4c, 0x00, 0x00, 0x41, 0x7b, 0xde, 0xfb,
+ 0xe0, 0x3c, 0x45, 0xf4, 0xf1, 0x9e, 0x70, 0x52, 0x37, 0x39, 0x20, 0xf6,
+ 0xb9, 0xa8, 0x0f, 0x49, 0x58, 0x4a, 0x72, 0x46, 0x31, 0xe5, 0xad, 0x92,
+ 0x47, 0x88, 0x00, 0xf1, 0x59, 0x15, 0x9e, 0x42, 0x7a, 0x60, 0x15, 0x74,
+ 0xc9, 0x37, 0x64, 0x10, 0x21, 0x83, 0x2d, 0x3c, 0xcd, 0xd1, 0xc1, 0xa1,
+ 0x85, 0x1b, 0x08, 0x2e, 0x8c, 0xb8, 0xfd, 0xe7, 0xb7, 0x82, 0xc4, 0xa2,
+ 0xa4, 0x71, 0x40, 0x1c, 0x1f, 0xf9, 0x7d, 0x7d, 0xf5, 0x2c, 0xd6, 0x63,
+ 0x2e, 0x7e, 0x34, 0x69, 0x8a, 0x1b, 0xdf, 0x7b, 0x01, 0x01, 0x92, 0xfc,
+ 0xa3, 0xc8, 0xb4, 0xa1, 0x0e, 0x18, 0x40, 0x96, 0xa1, 0xdf, 0xf2, 0xcb,
+ 0x75, 0x9d, 0x90, 0x54, 0xb0, 0x00, 0x00, 0x53, 0x86, 0xa4, 0x1c, 0xa8,
+ 0x29, 0x33, 0xda, 0x92, 0xe4, 0xab, 0x77, 0x79, 0x70, 0xe4, 0x84, 0xa9,
+ 0x5f, 0xdf, 0x8a, 0x23, 0x7d, 0xb0, 0xc6, 0x57, 0x22, 0x41, 0x7f, 0x99,
+ 0x5b, 0x00, 0x00, 0x4f, 0x52, 0x39, 0xde, 0xce, 0x9e, 0xc3, 0xf8, 0xa1,
+ 0x42, 0xf0, 0x71, 0xda, 0x5c, 0x43, 0xde, 0xe0, 0xdd, 0x88, 0x8a, 0xe5,
+ 0xb8, 0x38, 0xb1, 0x60, 0x75, 0xee, 0x1b, 0x04, 0xbb, 0x00, 0x00, 0x47,
+ 0xd6, 0xef, 0x11, 0x6f, 0xb8, 0x98, 0x06, 0x17, 0x14, 0x2d, 0x40, 0x5a,
+ 0xbd, 0x6a, 0x2d, 0xae, 0xb6, 0x04, 0x70, 0x56, 0x52, 0x4d, 0x6c, 0x1f,
+ 0x2d, 0x43, 0x1f, 0xad, 0x82, 0x00, 0x00, 0x1f, 0xb9, 0xdf, 0x3c, 0xf7,
+ 0xac, 0x90, 0x1c, 0x7a, 0xfc, 0x07, 0xf8, 0x01, 0x50, 0x52, 0x30, 0xba,
+ 0xc2, 0xb4, 0x7c, 0x0a, 0x0c, 0x25, 0xae, 0xd6, 0x6a, 0x38, 0x8d, 0xe1,
+ 0x13,
+
+ 0x00, 0x00, 0x00, 0x03,
+
+ 0x00, 0x00, 0x00, 0x03,
+
+ 0x98, 0x4f, 0xd9, 0x6a, 0x1f, 0xaa, 0xfc, 0xfb, 0x38, 0xbf, 0x49, 0x9e,
+ 0xd5, 0x1b, 0xc6, 0x48, 0xac, 0xeb, 0xc4, 0x1a, 0xec, 0x7c, 0xeb, 0xd9,
+ 0x1b, 0x02, 0xa4, 0xbc, 0x1d, 0x1a, 0x73, 0x79, 0x3f, 0x56, 0x15, 0x80,
+ 0x70, 0x94, 0x7b, 0xfe, 0xfc, 0x7a, 0x02, 0x4a, 0x16, 0xd1, 0x6b, 0x71,
+ 0xaa, 0x89, 0x12, 0xbe, 0x34, 0xc1, 0x08, 0xbf, 0xd7, 0xf8, 0xae, 0xc9,
+ 0xeb, 0xe9, 0xb3, 0xb8, 0xa5, 0x5f, 0x11, 0xfc, 0x6d, 0x4e, 0x9a, 0x86,
+ 0xe4, 0x67, 0xdf, 0xcc, 0xb6, 0xab, 0xf8, 0xee, 0x65, 0xf7, 0x19, 0x28,
+ 0x8c, 0x71, 0x60, 0xb0, 0x70, 0xc3, 0x7f, 0x20, 0xf0, 0xfa, 0x5f, 0xc8,
+ 0x09, 0xe4, 0xd1, 0x9f, 0xf4, 0x69, 0x00, 0xb9, 0x63, 0xc9, 0xc0, 0xa9,
+ 0xad, 0x62, 0x1f, 0x7c, 0xbb, 0xfc, 0x81, 0xe7, 0xc7, 0x37, 0xd1, 0xb4,
+ 0x59, 0x8f, 0x9a, 0xcf, 0x20, 0x2d, 0x9b, 0x6b, 0x9a, 0x1a, 0x4f, 0x28,
+ 0xdd, 0x4f, 0x9b, 0x2d, 0x4f, 0x20, 0x47, 0x70, 0xed, 0x85, 0xbc, 0x55,
+ 0x63, 0x9a, 0x37, 0xfd, 0xf1, 0xd7, 0xf1, 0x19, 0x37, 0x85, 0x2b, 0x55,
+ 0xcc, 0x8a, 0xfd, 0x67,
+
+ 0x49, 0x3a, 0x78, 0x1c, 0x57, 0x03, 0x7d, 0x84, 0x3c, 0xf4, 0x19, 0x6a,
+ 0xd2, 0x98, 0xcb, 0xe6, 0x6c, 0x7f, 0xf9, 0xa4, 0x80, 0xf8, 0x86, 0xc1,
+ 0x6f, 0xe2, 0x31, 0xd9, 0xeb, 0x92, 0x39, 0xd8, 0x9e, 0xcd, 0x78, 0xbf,
+ 0x50, 0xc5, 0xb8, 0xeb, 0xec, 0xcb, 0x3f, 0x96, 0x2c, 0x11, 0x01, 0x7f,
+ 0xb2, 0xd2, 0xc6, 0xf9, 0x01, 0xe5, 0x5d, 0x69, 0xed, 0xf0, 0xd5, 0xf4,
+ 0x2e, 0x1f, 0x68, 0x6f, 0xde, 0x76, 0x65, 0x91, 0x25, 0x86, 0xfe, 0xe4,
+ 0x55, 0xd1, 0x43, 0x2a, 0x19, 0x2e, 0xd8, 0x38, 0x1a, 0xec, 0x2b, 0xc9,
+ 0x14, 0xc3, 0x54, 0xd6, 0xe2, 0x7e, 0xd3, 0xe7, 0x77, 0xc8, 0x77, 0x75,
+ 0x28, 0x3d, 0xb6, 0x6e, 0xac, 0x29, 0x4c, 0x70, 0xcc, 0xa5, 0x50, 0xad,
+ 0xf1, 0x29, 0xf5, 0xea, 0xa5, 0x44, 0xda, 0xc1, 0xc5, 0x47, 0x39, 0x8e,
+ 0xbb, 0xa9, 0x63, 0xf9, 0x4c, 0xe9, 0x5a, 0xa4, 0x58, 0x2c, 0x33, 0xc7,
+ 0x24, 0x4b, 0x03, 0x54, 0xb4, 0xdb, 0x41, 0x51, 0xa7, 0x9a, 0x89, 0x46,
+ 0x27, 0x49, 0x08, 0xe6, 0x64, 0xca, 0xb7, 0xd2, 0x1c, 0xfa, 0x62, 0x2b,
+ 0x01, 0xb0, 0xb7, 0x98,
+
+ 0xd3, 0x7d, 0x29, 0xfb, 0x5e, 0x1f, 0x3a, 0x27, 0xc1, 0x26, 0xdc, 0x52,
+ 0x48, 0x16, 0xfa, 0x89, 0xb9, 0x68, 0x2e, 0xfb, 0xb8, 0xa2, 0xc0, 0x1a,
+ 0x74, 0xc5, 0x39, 0x1e, 0xe1, 0x9f, 0x25, 0x09, 0x02, 0xe6, 0x26, 0xda,
+ 0x39, 0x8c, 0xf0, 0x73, 0xa5, 0x2d, 0x59, 0x6e, 0xde, 0x5d, 0x64, 0x66,
+ 0x96, 0x87, 0x0e, 0x08, 0xa2, 0x78, 0x96, 0x7c, 0x8c, 0x54, 0xa4, 0x54,
+ 0xf1, 0x3c, 0x81, 0x44, 0xd5, 0x30, 0x4c, 0x2a, 0xdb, 0x5a, 0xbd, 0x13,
+ 0x5f, 0xa5, 0x7e, 0xbf, 0x7c, 0x9d, 0x51, 0x8b, 0x17, 0x49, 0xce, 0x4c,
+ 0x33, 0xaa, 0x7f, 0x6e, 0x8d, 0xdb, 0x18, 0x77, 0x02, 0x5b, 0xc6, 0x88,
+ 0x65, 0xf3, 0x94, 0x99, 0x6d, 0xcd, 0xa5, 0xa7, 0xa4, 0xbd, 0x62, 0xfa,
+ 0x36, 0x7c, 0xa5, 0xd7, 0x3c, 0xe3, 0x6b, 0x7e, 0x36, 0x02, 0x57, 0xa5,
+ 0xd2, 0x8e, 0x28, 0xa9, 0x4b, 0xc0, 0xca, 0xf2, 0xe9, 0x92, 0x86, 0x55,
+ 0xeb, 0x63, 0xc4, 0x7f, 0x45, 0x7f, 0x2f, 0xbb, 0x89, 0xa5, 0xa6, 0x10,
+ 0xe9, 0x4f, 0x98, 0x08, 0x43, 0xc8, 0x53, 0xad, 0x07, 0x8a, 0xb0, 0xe7,
+ 0x8e, 0x8f, 0x7b, 0x45,
+//};
+//unsigned int epid_sig_dat_len = 1053;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc
new file mode 100644
index 0000000..0c42c86
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test1"
+ * Basename: "basename1"
+ * SigRl : group x sigrl
+ */
+ //unsigned char sig_sha256_bsn0_msg1_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04,
+ 0x7b, 0xfc, 0x0a, 0x6c, 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41,
+ 0x3a, 0xc6, 0x01, 0x3a, 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c,
+ 0x84, 0xde, 0xc3, 0x3b, 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44,
+ 0x25, 0x98, 0x89, 0xdb, 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86,
+ 0x63, 0x8c, 0xe1, 0x93, 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+ 0x03, 0xf0, 0x18, 0x3e, 0x21, 0xd3, 0x65, 0xa6, 0x2f, 0x7e, 0x85, 0xa9,
+ 0x9f, 0x7b, 0x28, 0x4e, 0xf0, 0x9c, 0xd1, 0xda, 0xc4, 0x4b, 0xe4, 0x8f,
+ 0xc0, 0xe1, 0x4c, 0xaf, 0xcf, 0x85, 0xf7, 0x5c, 0x01, 0x1a, 0x15, 0xd9,
+ 0x4c, 0xf5, 0xdc, 0xc6, 0xce, 0xc5, 0x95, 0x3c, 0x1f, 0xe6, 0x57, 0x3c,
+ 0xbd, 0x8f, 0x5d, 0x05, 0x6e, 0xf9, 0xa3, 0x1e, 0xfb, 0x11, 0x18, 0x0e,
+ 0xfa, 0x07, 0x3b, 0xfd, 0x06, 0xdb, 0x21, 0xaa, 0x13, 0x05, 0xf3, 0x49,
+ 0x63, 0xb2, 0x8e, 0x1d, 0x22, 0x58, 0x53, 0x32, 0xd5, 0x86, 0xcf, 0xd2,
+ 0x2b, 0xfb, 0xf0, 0xe7, 0x56, 0x63, 0xd7, 0x12, 0xd5, 0xe0, 0xa8, 0x71,
+ 0x03, 0x1c, 0xe4, 0x83, 0x1d, 0x58, 0x63, 0xad, 0xa0, 0x48, 0xf3, 0x69,
+ 0x6b, 0xbd, 0x04, 0x4b, 0x81, 0xc7, 0x11, 0xa0, 0x26, 0x48, 0x9d, 0x12,
+ 0xe7, 0x13, 0x20, 0xb4, 0x15, 0xec, 0xbb, 0x06, 0xd1, 0x8e, 0x61, 0xb1,
+ 0xac, 0x11, 0x77, 0x86, 0x4c, 0x03, 0x6a, 0x9a, 0xe6, 0x3a, 0xd7, 0x2b,
+ 0xc8, 0x12, 0xf5, 0xa7, 0x0a, 0x8b, 0x3d, 0xa3, 0x23, 0xdc, 0x66, 0x66,
+ 0x7e, 0x67, 0x19, 0x62, 0x65, 0x60, 0xe8, 0x36, 0x48, 0x97, 0x18, 0xfd,
+ 0xbf, 0x43, 0x00, 0x00, 0x12, 0xa8, 0x4b, 0x8b, 0xf4, 0x38, 0x73, 0x30,
+ 0x84, 0xbd, 0x3e, 0xeb, 0x88, 0xe4, 0x52, 0xd1, 0xd2, 0xb4, 0x35, 0x05,
+ 0x38, 0x66, 0x5c, 0x4f, 0x56, 0xa1, 0x9a, 0x71, 0x82, 0x30, 0x00, 0x00,
+ 0x3f, 0x2e, 0x31, 0x92, 0x93, 0x40, 0x32, 0x64, 0xf0, 0x5c, 0xfa, 0x4e,
+ 0x69, 0xf8, 0xe6, 0x13, 0x7e, 0x7d, 0x1f, 0xb0, 0x32, 0x76, 0x1c, 0x39,
+ 0x42, 0xcf, 0x58, 0xa4, 0xe7, 0x16, 0x00, 0x6f, 0x16, 0x43, 0x7f, 0xa4,
+ 0x4e, 0x58, 0x7d, 0x50, 0xd0, 0x4a, 0x02, 0x89, 0xeb, 0x57, 0x06, 0x8e,
+ 0x61, 0x90, 0x50, 0x1d, 0x29, 0xbf, 0x31, 0xaa, 0x58, 0x2b, 0xa2, 0xc2,
+ 0x0d, 0x23, 0x37, 0x25, 0x15, 0xfd, 0xfc, 0x9c, 0x64, 0xa1, 0xea, 0x12,
+ 0x32, 0x2c, 0x96, 0x24, 0xa9, 0xa8, 0x75, 0x18, 0x5f, 0xb4, 0xf8, 0xfe,
+ 0xd9, 0xf2, 0xd9, 0x44, 0x45, 0xfe, 0x4e, 0x8a, 0xb7, 0x68, 0x0f, 0x6b,
+ 0x5e, 0x05, 0xab, 0xec, 0x1b, 0x5e, 0xcd, 0x44, 0x6a, 0x00, 0x00, 0x33,
+ 0x45, 0xea, 0x26, 0x29, 0x78, 0xe5, 0x0b, 0x40, 0xe5, 0xe0, 0xe2, 0x78,
+ 0xdb, 0x9a, 0xf8, 0xef, 0xa5, 0x3b, 0x54, 0x57, 0x0a, 0x4a, 0x2c, 0x47,
+ 0xd0, 0x1d, 0x55, 0xd8, 0x5e, 0x00, 0x00, 0x30, 0xc0, 0x99, 0xac, 0xcf,
+ 0xb3, 0x0e, 0xd1, 0xf0, 0xc3, 0xfb, 0x47, 0xf5, 0x7e, 0xaa, 0xb7, 0xba,
+ 0x05, 0x21, 0x04, 0xcd, 0x12, 0x07, 0x3f, 0xb6, 0x12, 0x1b, 0x3b, 0x19,
+ 0x12, 0x00, 0x00, 0x3a, 0x2b, 0x9e, 0x80, 0x2a, 0x14, 0x1b, 0x21, 0x81,
+ 0xf8, 0x79, 0xfb, 0xe7, 0x9a, 0x60, 0x90, 0x66, 0x81, 0x65, 0x24, 0x49,
+ 0x27, 0x80, 0x18, 0x29, 0x42, 0x8c, 0xaa, 0xd9, 0xb8, 0x00, 0x00, 0x4e,
+ 0x0b, 0x8c, 0x7e, 0x01, 0xad, 0x83, 0xd1, 0xaa, 0xb4, 0xa3, 0x75, 0xd9,
+ 0x42, 0xa0, 0x9f, 0x1c, 0xd9, 0x05, 0x10, 0x78, 0x78, 0x60, 0xe6, 0xe5,
+ 0xa3, 0x24, 0x79, 0x47, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg1_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc
new file mode 100644
index 0000000..a13cf04
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename2"
+ * SigRl : group x sigrl
+ */
+ //unsigned char sig_sha256_bsn1_msg0_dat[] = {
+ 0x67, 0x58, 0xb2, 0x9c, 0xad, 0x61, 0x1f, 0xfb,
+ 0x74, 0x23, 0xea, 0x40, 0xe9, 0x66, 0x26, 0xb0, 0x43, 0xdc, 0x7e, 0xc7,
+ 0x48, 0x88, 0x56, 0x59, 0xf3, 0x35, 0x9f, 0xdb, 0xfa, 0xa2, 0x49, 0x51,
+ 0x85, 0x35, 0x42, 0x50, 0x8e, 0x79, 0x79, 0xc0, 0x6c, 0xcc, 0x39, 0x0b,
+ 0xad, 0x3b, 0x39, 0x33, 0xae, 0xb2, 0xa1, 0xc5, 0x28, 0x6f, 0x48, 0x3a,
+ 0xd2, 0x63, 0x5d, 0xfb, 0x1b, 0x1f, 0x8a, 0x63, 0x84, 0xdc, 0x2d, 0xad,
+ 0x3b, 0x98, 0x3f, 0xc3, 0x8e, 0x18, 0xd7, 0xea, 0x18, 0x50, 0x0c, 0x50,
+ 0x42, 0x77, 0xb2, 0x59, 0xf5, 0xd5, 0x38, 0xc3, 0x8d, 0x57, 0xf4, 0xe7,
+ 0xb8, 0x74, 0x5a, 0x9e, 0x32, 0x75, 0xd1, 0xb4, 0xb3, 0x64, 0xbc, 0x23,
+ 0xcd, 0x98, 0x29, 0x7a, 0x77, 0x51, 0xfc, 0x26, 0x81, 0x41, 0x9b, 0xf6,
+ 0x21, 0xad, 0xc1, 0xd9, 0xab, 0x30, 0x25, 0x8d, 0x0c, 0x3b, 0x62, 0xe2,
+ 0x05, 0xe1, 0x05, 0xdd, 0x55, 0x7e, 0xf6, 0x7a, 0x66, 0xf9, 0x64, 0x67,
+ 0x2b, 0x57, 0x0b, 0xd1, 0x83, 0x12, 0xfa, 0x67, 0x4d, 0x29, 0x3e, 0x86,
+ 0x91, 0xbb, 0x4c, 0x9a, 0x50, 0xf4, 0xba, 0xab, 0x02, 0x46, 0x36, 0x83,
+ 0x12, 0x54, 0xf6, 0x5e, 0xcb, 0xd7, 0xcd, 0x8c, 0x47, 0x72, 0x43, 0xf4,
+ 0x5f, 0x8b, 0x9f, 0xa6, 0x31, 0x38, 0x8c, 0x52, 0xde, 0x16, 0x0f, 0xe5,
+ 0xea, 0x3b, 0x51, 0x18, 0x06, 0xda, 0xec, 0x18, 0x94, 0xdc, 0xb2, 0x32,
+ 0xc8, 0x0f, 0xfd, 0x43, 0x15, 0x9c, 0x91, 0xb2, 0xf4, 0x90, 0xb6, 0x9c,
+ 0xb8, 0xcd, 0x49, 0xfc, 0x27, 0xff, 0x68, 0x33, 0xc3, 0x06, 0xb9, 0x05,
+ 0x04, 0x9b, 0x71, 0x83, 0x6b, 0xf0, 0x95, 0x31, 0x16, 0x70, 0x30, 0xc9,
+ 0x4b, 0xcd, 0x63, 0x85, 0xc6, 0xf4, 0x3f, 0xe9, 0x35, 0x19, 0x02, 0x61,
+ 0x91, 0x52, 0xda, 0x47, 0xcf, 0x40, 0xed, 0x40, 0xda, 0x8d, 0xe3, 0xbb,
+ 0x31, 0xee, 0xf6, 0x3e, 0x83, 0x6a, 0x20, 0xc0, 0x38, 0xc6, 0xb1, 0x5d,
+ 0x78, 0xff, 0x2b, 0x5e, 0x90, 0x53, 0x04, 0xb0, 0x25, 0x49, 0x04, 0xb4,
+ 0x38, 0x1f, 0x56, 0xfe, 0x15, 0x23, 0x7d, 0xbc, 0x31, 0xc6, 0x38, 0x71,
+ 0xe5, 0xa3, 0x00, 0x00, 0x0b, 0x8c, 0x01, 0xef, 0x56, 0x72, 0x20, 0x1d,
+ 0x30, 0x95, 0x62, 0x3c, 0x37, 0x91, 0x32, 0x94, 0xf3, 0xa4, 0x73, 0x68,
+ 0x6c, 0xda, 0x11, 0x7f, 0x3e, 0x33, 0xa2, 0x35, 0xcb, 0x7c, 0x00, 0x00,
+ 0x43, 0xb9, 0x97, 0x4e, 0x4b, 0xcc, 0x01, 0x30, 0xea, 0xba, 0xcf, 0x5a,
+ 0x4a, 0x4c, 0x35, 0xdc, 0x2a, 0xfa, 0x3a, 0xa7, 0x8b, 0x07, 0x50, 0x1b,
+ 0x28, 0x83, 0x5f, 0x12, 0xd5, 0x3f, 0x00, 0x93, 0x24, 0x59, 0x9b, 0x1c,
+ 0x46, 0xd6, 0x1b, 0x85, 0x23, 0x4d, 0x05, 0xf2, 0x14, 0x00, 0x31, 0xe0,
+ 0x53, 0x85, 0x0b, 0x0a, 0xa5, 0x75, 0x6d, 0x74, 0x65, 0x87, 0x12, 0xa5,
+ 0x2f, 0x98, 0x23, 0x2f, 0x93, 0x21, 0x24, 0x93, 0x1e, 0x4e, 0x51, 0x0e,
+ 0x7a, 0x46, 0x01, 0x0b, 0x9b, 0xc8, 0xc7, 0xb0, 0xd0, 0x5d, 0x6a, 0x54,
+ 0xc5, 0x76, 0xf3, 0xdb, 0x40, 0xe1, 0x9e, 0xd0, 0x33, 0x32, 0xd5, 0x13,
+ 0x57, 0xf9, 0x74, 0x20, 0x86, 0x6b, 0xa8, 0xfb, 0xb9, 0x00, 0x00, 0x17,
+ 0xb0, 0xa5, 0x95, 0x02, 0x3c, 0x4e, 0x02, 0x73, 0x38, 0xc7, 0xbb, 0x5f,
+ 0xef, 0x48, 0x70, 0xde, 0xf4, 0xa4, 0x45, 0x4c, 0x7d, 0x9c, 0x19, 0xc8,
+ 0x98, 0x56, 0x13, 0xe3, 0x31, 0x00, 0x00, 0x6b, 0xdb, 0xe4, 0x38, 0x71,
+ 0xdc, 0x95, 0xf0, 0x40, 0xb1, 0xc8, 0xcd, 0x88, 0xe2, 0x75, 0xc1, 0xeb,
+ 0x7f, 0xb0, 0x6f, 0x9a, 0x46, 0xca, 0x1a, 0xb3, 0xf3, 0xc9, 0xe4, 0x56,
+ 0xaa, 0x00, 0x00, 0x6b, 0x89, 0xf7, 0xd9, 0x55, 0x3c, 0x9f, 0xd6, 0xf6,
+ 0x71, 0x0e, 0xc3, 0xe8, 0xbf, 0xe1, 0x3a, 0x91, 0x1d, 0xe8, 0x8d, 0x9d,
+ 0x1d, 0x20, 0x08, 0x4e, 0x2e, 0x04, 0x9c, 0xd0, 0x06, 0x00, 0x00, 0x23,
+ 0x5c, 0x31, 0x9b, 0x46, 0x4a, 0xff, 0x19, 0x16, 0x89, 0x06, 0x35, 0x58,
+ 0xdf, 0xf4, 0x2d, 0x17, 0x04, 0x21, 0x28, 0x80, 0x66, 0x2c, 0x48, 0xb6,
+ 0x4f, 0xee, 0xd0, 0xe5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn1_msg0_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc
new file mode 100644
index 0000000..470e82c
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_rndbase_msg0_dat[] = {
+ 0x0a, 0x53, 0xeb, 0x13, 0xda, 0x3e, 0xc9, 0xe9,
+ 0x7d, 0xed, 0x23, 0xd3, 0xd0, 0x71, 0xf4, 0xdb, 0xf7, 0x36, 0x83, 0x24,
+ 0x09, 0x87, 0x20, 0x5d, 0x48, 0x2d, 0x6c, 0x3a, 0xf3, 0xe2, 0x46, 0xcd,
+ 0x8b, 0x2a, 0xaf, 0x60, 0x6b, 0xe3, 0x64, 0x9c, 0x9e, 0x6a, 0x6d, 0x05,
+ 0xb0, 0xf9, 0x61, 0xc6, 0x60, 0xd6, 0x70, 0xcf, 0xa6, 0x9f, 0x4a, 0xc0,
+ 0x7b, 0x3a, 0xb6, 0xa2, 0xbd, 0x85, 0xcf, 0x2b, 0xce, 0x9e, 0xf0, 0x48,
+ 0x85, 0xf9, 0x65, 0xf5, 0x73, 0x2c, 0xfc, 0x52, 0x21, 0x7e, 0xfa, 0x85,
+ 0xfc, 0x6a, 0x06, 0xad, 0xa5, 0xce, 0x3d, 0xb6, 0xe0, 0xc8, 0x34, 0x38,
+ 0x01, 0x8e, 0xea, 0x76, 0x99, 0xb4, 0x52, 0x99, 0xa7, 0x89, 0x86, 0x18,
+ 0x5f, 0xd9, 0xef, 0x06, 0x99, 0xeb, 0x63, 0x54, 0xd5, 0x8d, 0x44, 0x9b,
+ 0xb0, 0xa2, 0x86, 0xed, 0x1f, 0x85, 0xf7, 0x2e, 0x26, 0xfd, 0x31, 0xd9,
+ 0x05, 0x9b, 0x64, 0x1c, 0x73, 0x26, 0xeb, 0xce, 0xce, 0x77, 0xa1, 0xef,
+ 0x58, 0x16, 0x56, 0x7f, 0xaa, 0xa9, 0xc0, 0x21, 0x94, 0xa5, 0xa2, 0xdb,
+ 0xe8, 0x12, 0x00, 0x5f, 0x1e, 0x87, 0x42, 0x53, 0x08, 0x04, 0xa7, 0xe9,
+ 0x14, 0xd9, 0x9a, 0x56, 0xb1, 0x63, 0x5a, 0x64, 0x67, 0xa8, 0xb9, 0x96,
+ 0xff, 0xa6, 0x89, 0x47, 0xf3, 0xd9, 0x15, 0x82, 0xf6, 0x11, 0x9a, 0x39,
+ 0xc1, 0x85, 0x87, 0xac, 0x09, 0xdd, 0x35, 0xcf, 0x01, 0x34, 0xd7, 0x7f,
+ 0x6f, 0xe6, 0xfa, 0xa8, 0x5d, 0x12, 0x42, 0xa4, 0x32, 0x3a, 0x63, 0x76,
+ 0x46, 0xe5, 0xbe, 0x4d, 0xfb, 0xb4, 0xba, 0xa3, 0x64, 0x8e, 0x97, 0xfe,
+ 0x05, 0xe4, 0x86, 0xc6, 0x3d, 0xd7, 0x2e, 0xaf, 0xcf, 0xa4, 0x83, 0x66,
+ 0xe2, 0x84, 0x99, 0xf5, 0x55, 0x3f, 0xdf, 0x1e, 0x86, 0x2b, 0x61, 0x35,
+ 0xc2, 0x4b, 0x07, 0xc6, 0xa7, 0xe2, 0x59, 0x3e, 0xa8, 0xc7, 0x47, 0x34,
+ 0x42, 0xdb, 0x72, 0xec, 0xe6, 0x67, 0x85, 0xeb, 0xbe, 0xdd, 0x02, 0x37,
+ 0x1a, 0xc1, 0x7c, 0xea, 0xf1, 0x43, 0x19, 0xe1, 0x38, 0xb6, 0x82, 0x13,
+ 0x78, 0xeb, 0xe4, 0xa2, 0xe6, 0xd7, 0x26, 0x27, 0x4f, 0x33, 0x75, 0xaa,
+ 0x4c, 0x76, 0x00, 0x00, 0x75, 0x35, 0x2a, 0xdf, 0x8a, 0x7e, 0x29, 0xa8,
+ 0x12, 0xb7, 0x53, 0xaa, 0x51, 0x8a, 0x69, 0x2f, 0xa1, 0xf2, 0x4b, 0xac,
+ 0x33, 0x8e, 0xc6, 0xaa, 0xb3, 0x89, 0x2d, 0xa0, 0xf1, 0x61, 0x00, 0x00,
+ 0x5c, 0xb7, 0x83, 0x21, 0x28, 0x00, 0x91, 0xbd, 0x39, 0x38, 0xf0, 0x45,
+ 0x9b, 0xf7, 0xd3, 0x36, 0x13, 0x22, 0x04, 0x39, 0x6c, 0x5b, 0x0e, 0xb0,
+ 0x7b, 0x31, 0x8f, 0xa6, 0xe6, 0xd2, 0x00, 0x15, 0xa8, 0xec, 0xf1, 0xc2,
+ 0x68, 0xc8, 0x68, 0x75, 0xf3, 0xef, 0x66, 0x60, 0x35, 0x88, 0x5f, 0xae,
+ 0x3d, 0xd9, 0x26, 0x8e, 0x54, 0xdb, 0xc4, 0x5d, 0xf1, 0xb5, 0x57, 0xc2,
+ 0x1b, 0xca, 0x18, 0x65, 0xd8, 0xb5, 0x4d, 0xa8, 0xfa, 0x7a, 0x12, 0x6d,
+ 0xca, 0x65, 0x19, 0x26, 0x4d, 0x2c, 0xf6, 0x15, 0x3d, 0xbf, 0x18, 0xce,
+ 0xc8, 0x83, 0xbd, 0x7f, 0xe8, 0x73, 0xb4, 0xba, 0xbd, 0xcd, 0xc9, 0xe1,
+ 0x03, 0xa6, 0x36, 0x1d, 0xe6, 0x4b, 0xf1, 0x79, 0xc2, 0x00, 0x00, 0x86,
+ 0x29, 0x09, 0x23, 0xe9, 0x08, 0x76, 0x02, 0xc2, 0xea, 0x06, 0xc6, 0x46,
+ 0xfd, 0x41, 0x5e, 0x10, 0x9e, 0x45, 0xf2, 0x68, 0xb1, 0x7c, 0xbf, 0x27,
+ 0x7e, 0x5f, 0x35, 0xa1, 0x61, 0x00, 0x00, 0x00, 0xef, 0x17, 0x44, 0x9a,
+ 0xf0, 0xe7, 0xb7, 0xb1, 0xef, 0x64, 0xc1, 0xe9, 0x1c, 0xec, 0x23, 0x28,
+ 0x38, 0xb2, 0x68, 0x5d, 0x57, 0x22, 0x8d, 0x17, 0x34, 0x39, 0x90, 0x73,
+ 0x9e, 0x00, 0x00, 0x32, 0xca, 0xac, 0xa4, 0xf3, 0xe0, 0xf1, 0xd4, 0x76,
+ 0xc8, 0x66, 0x52, 0xa1, 0x1c, 0x77, 0x12, 0x1b, 0x12, 0xa4, 0xf1, 0xa7,
+ 0x61, 0x58, 0xb3, 0xd8, 0x6d, 0xa4, 0x38, 0x6f, 0xd7, 0x00, 0x00, 0x0b,
+ 0xf7, 0xc6, 0xc9, 0xa2, 0x7b, 0x65, 0x26, 0x33, 0xaf, 0xbc, 0xd9, 0x5c,
+ 0x07, 0x57, 0x59, 0x14, 0xac, 0x40, 0x71, 0xbd, 0x25, 0x9c, 0xbb, 0x52,
+ 0x9e, 0x2a, 0x64, 0x70, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_rndbase_msg0_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc
new file mode 100644
index 0000000..4682ed3
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "test1"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_rndbase_msg1_dat[] = {
+ 0x35, 0xac, 0x96, 0x37, 0xa4, 0x82, 0x58, 0xa1,
+ 0xf5, 0xa1, 0xd2, 0x6b, 0x65, 0x56, 0xb6, 0xee, 0x8f, 0x8d, 0xc8, 0xc7,
+ 0x8f, 0x54, 0x66, 0xad, 0xcc, 0x84, 0x5f, 0x7b, 0x97, 0x16, 0x3e, 0xa8,
+ 0x66, 0x20, 0x05, 0xb5, 0x3c, 0x84, 0xf9, 0xa2, 0x00, 0xd8, 0x0d, 0x61,
+ 0x93, 0x93, 0x0e, 0x81, 0x86, 0x1b, 0xe5, 0x53, 0xc0, 0xbe, 0xf1, 0x84,
+ 0x42, 0x75, 0x22, 0x60, 0xa3, 0xcf, 0x88, 0x35, 0x41, 0xf0, 0x0e, 0xd8,
+ 0x1c, 0x2f, 0xa0, 0x46, 0x2d, 0xbd, 0x5c, 0xee, 0xa1, 0xdb, 0xe3, 0x20,
+ 0x4c, 0xd3, 0x27, 0xe0, 0x92, 0x28, 0x85, 0x01, 0xbd, 0xe4, 0x13, 0x47,
+ 0x37, 0xaf, 0x30, 0xb7, 0x93, 0xce, 0x4d, 0x2c, 0x43, 0x31, 0xa7, 0x96,
+ 0x62, 0x53, 0xa5, 0x1b, 0x93, 0x49, 0x37, 0xb0, 0x7c, 0x67, 0x8e, 0x9e,
+ 0xf6, 0xe2, 0x5e, 0x3c, 0xcb, 0xcc, 0x2f, 0xc0, 0x50, 0x8f, 0xf4, 0xaa,
+ 0x04, 0x8d, 0x7b, 0x15, 0xf9, 0x89, 0xa6, 0x2f, 0x8a, 0xc3, 0xa0, 0x07,
+ 0x32, 0x6f, 0x25, 0x3c, 0x88, 0xa4, 0xf2, 0x93, 0x3c, 0x49, 0xe7, 0x84,
+ 0xb0, 0xc6, 0x77, 0xb3, 0x84, 0xcb, 0x0b, 0xb9, 0x00, 0x44, 0xd1, 0xca,
+ 0xea, 0x1e, 0xcc, 0xe2, 0x6f, 0xe9, 0x2b, 0x73, 0xfe, 0x13, 0x07, 0x27,
+ 0x36, 0x36, 0xc7, 0x0b, 0x7d, 0x76, 0xa2, 0xde, 0x96, 0xb1, 0x4a, 0xe4,
+ 0x05, 0x5f, 0x35, 0x1e, 0x01, 0x01, 0xfd, 0x80, 0x5f, 0x5a, 0xfd, 0x55,
+ 0x80, 0xe6, 0x76, 0xd9, 0xec, 0xfc, 0x1c, 0x4a, 0xf0, 0x3c, 0xec, 0x47,
+ 0x62, 0xca, 0x80, 0x12, 0x94, 0x7f, 0x3d, 0xc8, 0xe1, 0x7d, 0xdd, 0x20,
+ 0x01, 0xe3, 0x48, 0xdc, 0x78, 0xef, 0x45, 0x49, 0x30, 0x8d, 0xeb, 0xae,
+ 0x2a, 0x5a, 0x82, 0x40, 0x61, 0x16, 0xdb, 0x5c, 0x4c, 0x04, 0x0b, 0xc1,
+ 0x51, 0x64, 0xfb, 0x43, 0x2d, 0x71, 0xef, 0xf1, 0x76, 0xe4, 0xb6, 0xb8,
+ 0x9d, 0x27, 0x4f, 0xf4, 0x23, 0xaf, 0x56, 0x9f, 0x44, 0x7c, 0xb0, 0xb7,
+ 0x87, 0x89, 0xce, 0x05, 0xec, 0x06, 0xc3, 0x7f, 0xa1, 0x6c, 0xc3, 0xe1,
+ 0xa7, 0xd8, 0x02, 0xfc, 0x70, 0xd0, 0xd3, 0x40, 0x95, 0x85, 0x1c, 0x4b,
+ 0x15, 0x62, 0x00, 0x00, 0x62, 0xfb, 0xc3, 0x15, 0x6d, 0xf8, 0x4b, 0x50,
+ 0x52, 0xfd, 0xc9, 0x3a, 0xaf, 0x43, 0x22, 0x5e, 0xab, 0x76, 0x5a, 0x35,
+ 0x25, 0x32, 0x4c, 0x07, 0xf4, 0x03, 0xb6, 0x01, 0x09, 0xd8, 0x00, 0x00,
+ 0x32, 0x15, 0x7f, 0x79, 0xfe, 0x69, 0x79, 0x1c, 0x34, 0xe3, 0xdf, 0x9a,
+ 0xef, 0x31, 0xf4, 0x79, 0xad, 0x38, 0xf1, 0xee, 0x89, 0x95, 0x46, 0x56,
+ 0x82, 0x04, 0x7a, 0xda, 0xd5, 0x23, 0x00, 0x2b, 0x11, 0xa1, 0x5a, 0xc6,
+ 0x23, 0x46, 0xde, 0x9c, 0x86, 0x99, 0x4f, 0xd0, 0xf7, 0x10, 0xe7, 0x1d,
+ 0xd7, 0xed, 0xbd, 0xb1, 0x95, 0xcf, 0x2b, 0x2d, 0x97, 0x46, 0x1e, 0x95,
+ 0x69, 0x7d, 0x21, 0x11, 0x33, 0x37, 0x10, 0x17, 0xee, 0xb7, 0x64, 0x48,
+ 0x08, 0xf9, 0xd3, 0x56, 0xb5, 0xa8, 0x74, 0xb2, 0xc6, 0xe4, 0x07, 0x42,
+ 0x42, 0x30, 0x4c, 0x5e, 0x30, 0x1f, 0xce, 0x0e, 0x65, 0x03, 0x23, 0xfd,
+ 0x1b, 0x19, 0x73, 0xa5, 0xdb, 0xb0, 0x91, 0x11, 0xcd, 0x00, 0x00, 0x21,
+ 0x27, 0xb7, 0x3b, 0x45, 0x88, 0xc4, 0xbc, 0x47, 0xfb, 0x2d, 0xaf, 0x28,
+ 0x25, 0xb9, 0x7b, 0x38, 0xa6, 0xdd, 0x9c, 0x86, 0x56, 0xcc, 0xf2, 0x24,
+ 0xd0, 0x9a, 0xc9, 0x9e, 0x94, 0x00, 0x00, 0x76, 0xf1, 0xe7, 0xb1, 0xad,
+ 0x26, 0xbf, 0x5e, 0x04, 0xd1, 0x6e, 0x95, 0x18, 0x12, 0x8d, 0xce, 0x45,
+ 0xeb, 0x91, 0xce, 0xaa, 0x88, 0x7c, 0x65, 0xd5, 0x74, 0x9b, 0x05, 0xa4,
+ 0x3d, 0x00, 0x00, 0x11, 0x70, 0x70, 0xcc, 0x62, 0xe4, 0x70, 0xa3, 0x65,
+ 0x0a, 0x3e, 0xbe, 0xac, 0xbe, 0xdc, 0xeb, 0x2f, 0xe4, 0xe6, 0xec, 0x10,
+ 0x3a, 0x5a, 0x90, 0xd8, 0xb6, 0xa2, 0x4a, 0x3f, 0x27, 0x00, 0x00, 0x10,
+ 0x15, 0x11, 0xc1, 0x14, 0x9e, 0x53, 0x4e, 0x02, 0xe3, 0x1b, 0x90, 0x3e,
+ 0x3a, 0x65, 0xa4, 0x87, 0xaa, 0x24, 0xa0, 0x16, 0x59, 0x54, 0x7f, 0x10,
+ 0xb4, 0x73, 0x67, 0x55, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_rndbase_msg1_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc b/epid/common-testhelper/1.1/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..13704b1
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : member1
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_bsn0_msg0_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x2e, 0x50, 0xd9, 0xca,
+ 0x8f, 0x12, 0x5b, 0xfc, 0xc8, 0x02, 0x58, 0xff, 0xc9, 0xb8, 0xc1, 0x91,
+ 0x59, 0x33, 0x1e, 0xdb, 0x17, 0x8c, 0x2b, 0x24, 0x03, 0x8f, 0x1a, 0xcd,
+ 0x6b, 0x69, 0x1d, 0xd0, 0xa5, 0x79, 0x11, 0x92, 0x6b, 0x26, 0xe2, 0xc5,
+ 0xec, 0xa8, 0x85, 0x7b, 0xe0, 0x4f, 0xb0, 0x3c, 0x41, 0xc2, 0xa5, 0x8e,
+ 0xb9, 0x74, 0xe6, 0xa5, 0x69, 0xca, 0x86, 0x34, 0xf0, 0x74, 0xaa, 0x95,
+ 0x03, 0x5a, 0xbe, 0x40, 0xcd, 0x53, 0x62, 0x56, 0x50, 0x42, 0x0c, 0x75,
+ 0xe3, 0x93, 0x3a, 0x87, 0x69, 0x0d, 0x18, 0x71, 0xd0, 0xfb, 0x5e, 0xd9,
+ 0xf9, 0x58, 0xb0, 0x8b, 0x64, 0xd5, 0x35, 0x17, 0x03, 0x45, 0x25, 0x4e,
+ 0x6b, 0x10, 0x1c, 0x1e, 0x87, 0x4d, 0xe1, 0x79, 0xf4, 0x41, 0x61, 0xf5,
+ 0x45, 0xf0, 0x72, 0x37, 0x41, 0x0c, 0x11, 0x74, 0x48, 0x98, 0x0e, 0xb4,
+ 0x65, 0x25, 0xcf, 0xad, 0x06, 0x2c, 0x1f, 0x4f, 0x01, 0xf8, 0x8b, 0xa6,
+ 0x79, 0xe3, 0x53, 0xf9, 0xe6, 0x26, 0xa1, 0x08, 0xdf, 0x0f, 0x6f, 0xff,
+ 0x92, 0x6b, 0xcb, 0x4c, 0x6a, 0x66, 0xe2, 0xb0, 0xad, 0x37, 0x05, 0xba,
+ 0x03, 0x27, 0xef, 0xad, 0x48, 0xb9, 0xd3, 0xe3, 0x10, 0xba, 0x28, 0xf7,
+ 0x76, 0xf6, 0xd1, 0xe3, 0x8d, 0x17, 0x3d, 0xdc, 0x38, 0xd0, 0x2c, 0xa4,
+ 0x34, 0xc8, 0x04, 0x39, 0xe8, 0xfb, 0xd6, 0xa0, 0x98, 0x64, 0x75, 0xbd,
+ 0xa9, 0xfb, 0x8e, 0x8b, 0x3a, 0x51, 0xa8, 0x0d, 0x75, 0x89, 0x9f, 0xe9,
+ 0x23, 0xe0, 0xfe, 0x3d, 0x52, 0x67, 0x95, 0xf6, 0x12, 0xe7, 0x9f, 0x23,
+ 0xfd, 0xba, 0xcb, 0xc8, 0xc5, 0x76, 0xca, 0x19, 0xb6, 0xfe, 0x00, 0x78,
+ 0x63, 0x0c, 0x00, 0x00, 0x17, 0x98, 0x13, 0xf3, 0x2e, 0xd1, 0x6c, 0xa1,
+ 0x58, 0x54, 0x4f, 0xcb, 0x68, 0xae, 0xe9, 0xbc, 0x52, 0xfc, 0x95, 0x4b,
+ 0x31, 0x23, 0x44, 0x30, 0x99, 0xdf, 0x40, 0x7f, 0xb8, 0xb1, 0x00, 0x00,
+ 0x3b, 0x35, 0x7b, 0x2b, 0xaf, 0xd7, 0x5f, 0x53, 0xeb, 0x10, 0x66, 0xa9,
+ 0x68, 0x23, 0xea, 0xbc, 0xa0, 0xdc, 0xb4, 0x4a, 0x1f, 0xd5, 0x15, 0x46,
+ 0x99, 0xb3, 0x7b, 0x44, 0xc9, 0xfc, 0x00, 0x47, 0x6e, 0xac, 0x44, 0xeb,
+ 0x65, 0x06, 0x7a, 0x3a, 0x57, 0xa1, 0x18, 0x4a, 0x70, 0x33, 0x7a, 0x5b,
+ 0x8f, 0x26, 0x5f, 0xfb, 0x13, 0x72, 0x58, 0xbd, 0xec, 0xc4, 0xe7, 0x7a,
+ 0x65, 0x18, 0xb4, 0x8b, 0x68, 0xa0, 0x53, 0x3f, 0xc0, 0x26, 0x67, 0xca,
+ 0x1c, 0xd4, 0x3d, 0x60, 0x62, 0x2f, 0x9f, 0x8c, 0xac, 0xd1, 0x80, 0xfd,
+ 0x9b, 0x6f, 0xe1, 0xd1, 0x3c, 0x65, 0x4e, 0x0d, 0x34, 0xca, 0x85, 0xe4,
+ 0x55, 0xf7, 0x4e, 0x41, 0x28, 0xea, 0xab, 0xef, 0x96, 0x00, 0x00, 0x54,
+ 0xbf, 0x83, 0x72, 0x76, 0x1c, 0xe5, 0xe5, 0x2e, 0xfc, 0xc7, 0x8a, 0x13,
+ 0xd8, 0x92, 0x5c, 0xab, 0x9e, 0x00, 0xf2, 0xbe, 0xf9, 0xfb, 0x63, 0x30,
+ 0xf5, 0x53, 0xa2, 0x99, 0x49, 0x00, 0x00, 0x0b, 0x9f, 0x78, 0x17, 0xc2,
+ 0xa5, 0x4f, 0xc1, 0x38, 0xe1, 0x75, 0xf6, 0x46, 0x2a, 0x8e, 0x45, 0xdf,
+ 0xbd, 0x39, 0xa0, 0x6d, 0xf8, 0x75, 0x68, 0xce, 0x73, 0xad, 0x56, 0xea,
+ 0xe0, 0x00, 0x00, 0x0e, 0xc6, 0xa7, 0x88, 0x43, 0xc2, 0xdb, 0xbf, 0x73,
+ 0xa3, 0xa1, 0xdb, 0x46, 0xd8, 0x89, 0xca, 0xea, 0x11, 0xf7, 0x6c, 0x47,
+ 0xea, 0x0d, 0xdd, 0x52, 0x7d, 0x33, 0xef, 0x65, 0xdb, 0x00, 0x00, 0x0f,
+ 0x48, 0xd4, 0x3f, 0xbc, 0x4e, 0xc3, 0xd9, 0x59, 0x52, 0x65, 0xbb, 0xbc,
+ 0x13, 0xa0, 0xb8, 0x51, 0xef, 0xdc, 0x11, 0x94, 0xa6, 0xc4, 0x09, 0x83,
+ 0x3d, 0xe2, 0x7e, 0x09, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg0_dat_len = 577;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc
new file mode 100644
index 0000000..b1dc8e8
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : privrevoked->member000
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : groupx empty sigrl
+ */
+ //unsigned char sig_sha256_bsn0_msg0_revkey000_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x06, 0x29, 0x78, 0xfc,
+ 0x10, 0xfc, 0x2c, 0xde, 0x10, 0xe7, 0xe0, 0x6b, 0xdd, 0x0a, 0x9a, 0xb7,
+ 0x0e, 0xad, 0x06, 0x41, 0x61, 0x2b, 0x4f, 0xc8, 0x31, 0x84, 0x64, 0x22,
+ 0xbb, 0xe1, 0x83, 0x77, 0x98, 0x03, 0x0e, 0x5c, 0x01, 0x38, 0xd1, 0x9b,
+ 0x29, 0x3f, 0xc3, 0x6f, 0x1d, 0x1a, 0x92, 0x9f, 0xab, 0x47, 0x6f, 0x42,
+ 0xf4, 0x79, 0x96, 0xae, 0x74, 0x45, 0xbf, 0x33, 0xb5, 0x93, 0xf6, 0x74,
+ 0x06, 0xbb, 0xf0, 0x0c, 0x9f, 0x2a, 0x41, 0x1f, 0xc9, 0x90, 0x34, 0x41,
+ 0xf5, 0xdc, 0xcc, 0x65, 0x7e, 0xfc, 0x00, 0xec, 0x9a, 0x50, 0x76, 0x2c,
+ 0xc9, 0x39, 0x1b, 0x17, 0x19, 0x4e, 0x41, 0xa6, 0x03, 0xcc, 0xc6, 0xd9,
+ 0xcd, 0x5e, 0x24, 0xeb, 0x5b, 0xaf, 0x2c, 0x44, 0xdc, 0x29, 0x71, 0x8f,
+ 0x6e, 0x24, 0x86, 0xfa, 0x58, 0x6c, 0x0b, 0x67, 0x8a, 0xf9, 0xb9, 0x36,
+ 0x41, 0xdb, 0xa4, 0x3f, 0x00, 0x8c, 0xa8, 0x10, 0x9c, 0xca, 0xc8, 0xbd,
+ 0x7b, 0x08, 0x9c, 0xb0, 0x20, 0x10, 0x2b, 0x63, 0xff, 0x25, 0x19, 0x48,
+ 0x69, 0x85, 0x92, 0x74, 0xc1, 0x3c, 0x26, 0x9a, 0x9c, 0x10, 0x42, 0x42,
+ 0x08, 0xe2, 0x9f, 0x98, 0xee, 0xb8, 0xc7, 0x6e, 0x0a, 0x87, 0x8a, 0x27,
+ 0x6d, 0xe7, 0x27, 0x22, 0xcf, 0x23, 0x14, 0x8c, 0x4e, 0xfe, 0x33, 0x3b,
+ 0xa4, 0x14, 0x3e, 0x37, 0x6a, 0x39, 0xfe, 0x12, 0xd0, 0x5b, 0xa5, 0x08,
+ 0x3d, 0x85, 0x71, 0xeb, 0xa5, 0xe8, 0x5a, 0x9f, 0xcb, 0xb4, 0xdb, 0xce,
+ 0x32, 0x49, 0x9a, 0xba, 0xda, 0x37, 0x23, 0x45, 0x16, 0x50, 0x60, 0x15,
+ 0x4b, 0xc1, 0xfd, 0xfb, 0x00, 0x9c, 0x67, 0xae, 0xc0, 0x98, 0xbb, 0x63,
+ 0x52, 0x7b, 0x00, 0x00, 0x82, 0xec, 0xd1, 0xd1, 0x45, 0xd6, 0x9e, 0x42,
+ 0x9a, 0x18, 0xe7, 0x1e, 0x52, 0x27, 0xed, 0x65, 0x90, 0x95, 0xc1, 0x79,
+ 0x3d, 0x0b, 0x2e, 0x84, 0xdd, 0xcc, 0xdc, 0xc3, 0x46, 0x17, 0x00, 0x00,
+ 0x7c, 0xce, 0x2e, 0x41, 0xd1, 0x68, 0xa8, 0xdb, 0xea, 0x42, 0x7a, 0x67,
+ 0xf7, 0x6b, 0xae, 0xb4, 0xc2, 0xdf, 0x8d, 0xbb, 0xd5, 0xdb, 0x1c, 0x88,
+ 0xca, 0x68, 0x4a, 0xc9, 0xdb, 0x18, 0x00, 0x9a, 0x1b, 0x74, 0xf0, 0x79,
+ 0xfc, 0xa8, 0x10, 0xb3, 0xec, 0x6b, 0x48, 0xdf, 0xbc, 0x89, 0xd6, 0x78,
+ 0xb4, 0xff, 0xb1, 0xae, 0x76, 0xec, 0x97, 0xa1, 0x72, 0x8e, 0xfe, 0x1d,
+ 0x30, 0xa3, 0xda, 0x64, 0x59, 0xf8, 0x28, 0x5b, 0xa5, 0x9c, 0x05, 0x2c,
+ 0x96, 0x45, 0x00, 0xd4, 0xb5, 0xab, 0x93, 0x2e, 0x34, 0x04, 0x09, 0x15,
+ 0x22, 0x9e, 0xf3, 0x44, 0x5e, 0xaa, 0xfc, 0xce, 0x1f, 0x05, 0x67, 0xe2,
+ 0x58, 0xa8, 0x88, 0xb2, 0x77, 0x5d, 0x23, 0x41, 0x9a, 0x00, 0x00, 0x5f,
+ 0xed, 0x04, 0x87, 0x17, 0x46, 0xcb, 0xb3, 0x94, 0x07, 0x58, 0xa5, 0xc2,
+ 0x98, 0xaa, 0xc1, 0x58, 0x30, 0x1f, 0x45, 0x28, 0xad, 0xbf, 0xce, 0x7d,
+ 0xb6, 0xb7, 0x80, 0x8f, 0x57, 0x00, 0x00, 0x2d, 0x5b, 0xc3, 0x9f, 0x99,
+ 0xb6, 0xb4, 0x15, 0x98, 0x4b, 0xb7, 0x3c, 0xb1, 0x1a, 0x7a, 0x78, 0xcd,
+ 0x03, 0xd0, 0xe7, 0x36, 0x1e, 0xdc, 0x13, 0x28, 0x5d, 0xdc, 0x4b, 0x47,
+ 0x18, 0x00, 0x00, 0x61, 0x3d, 0xa0, 0x18, 0x14, 0xbd, 0x62, 0xdc, 0x75,
+ 0xf5, 0xfc, 0xf4, 0xcc, 0x34, 0x9b, 0x9a, 0x7f, 0x61, 0xaa, 0x18, 0x1c,
+ 0xe3, 0x54, 0x51, 0xb5, 0x0c, 0xe2, 0xa6, 0x90, 0x0b, 0x00, 0x00, 0x19,
+ 0x92, 0x07, 0x28, 0xc1, 0x79, 0xd1, 0xb2, 0xba, 0x4b, 0xcb, 0x7e, 0x85,
+ 0x67, 0x24, 0xab, 0x74, 0x63, 0xe8, 0x47, 0x4a, 0x30, 0x1c, 0x26, 0x18,
+ 0x98, 0x43, 0x16, 0xc6, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg0_revkey000_dat_len = 573;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc
new file mode 100644
index 0000000..151527f
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : privrevoked->member001
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : groupx empty sigrl
+ */
+ //unsigned char sig_sha256_bsn0_msg0_revkey000_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x26, 0xbb, 0xb1, 0x25,
+ 0x06, 0xa9, 0xaf, 0xff, 0x35, 0xc2, 0xb5, 0x36, 0x4b, 0xbd, 0x36, 0xc3,
+ 0x64, 0x50, 0x9a, 0x59, 0xf6, 0x50, 0x84, 0x70, 0xfd, 0xcd, 0xfb, 0x13,
+ 0x9a, 0x07, 0x32, 0x7b, 0xc7, 0x7c, 0xff, 0x33, 0x99, 0x8e, 0xb1, 0x86,
+ 0x45, 0xb6, 0xea, 0xc2, 0x90, 0x33, 0xdc, 0x1e, 0x63, 0x26, 0x26, 0xe1,
+ 0xe4, 0x57, 0x3d, 0x9c, 0x61, 0x3a, 0x50, 0x14, 0x3d, 0xbb, 0x22, 0x9b,
+ 0x00, 0xfc, 0x22, 0xec, 0x97, 0xe9, 0x65, 0xdd, 0x83, 0x81, 0xf3, 0xf2,
+ 0x21, 0x66, 0x73, 0xa3, 0x5a, 0x43, 0x9c, 0x0e, 0x00, 0x19, 0x89, 0x3b,
+ 0x0a, 0xad, 0xa1, 0xa8, 0xad, 0x86, 0x5c, 0xc2, 0x07, 0xd3, 0x9c, 0xa0,
+ 0xa7, 0x08, 0xb0, 0x5e, 0x01, 0xe2, 0xf9, 0xcc, 0x55, 0x3c, 0x13, 0x40,
+ 0x8c, 0x8f, 0x9f, 0x2d, 0x6d, 0xb0, 0x94, 0x5c, 0x7b, 0xb3, 0x2d, 0xea,
+ 0x12, 0xd4, 0x3f, 0x84, 0x03, 0x6d, 0x19, 0xbc, 0x4d, 0x29, 0x44, 0x8d,
+ 0xa5, 0x5c, 0xc2, 0x5e, 0x20, 0x1f, 0x1f, 0xdd, 0x1d, 0x02, 0x96, 0x4c,
+ 0x23, 0xa1, 0xe0, 0xe6, 0x66, 0x67, 0x41, 0x2f, 0xcb, 0xb7, 0x61, 0x60,
+ 0x05, 0xa9, 0x80, 0x8a, 0xd0, 0x7b, 0x4e, 0xb4, 0xc0, 0xdd, 0xf4, 0xd7,
+ 0xd1, 0x6d, 0x7f, 0xab, 0x50, 0xbf, 0xbc, 0x9b, 0x68, 0xf3, 0x4b, 0xd9,
+ 0xee, 0x25, 0x4e, 0x32, 0x93, 0xc2, 0x3d, 0x2d, 0x2e, 0xa8, 0xc8, 0x40,
+ 0xc6, 0xca, 0xa4, 0xb4, 0xf2, 0xb9, 0xc8, 0x76, 0xb0, 0x48, 0x71, 0xe3,
+ 0xf7, 0x2d, 0x55, 0x0b, 0xdb, 0x17, 0xc6, 0x15, 0x07, 0x96, 0x45, 0x65,
+ 0x4e, 0xd8, 0xb1, 0x08, 0xc4, 0xd6, 0x6b, 0x40, 0x1f, 0x6d, 0xb9, 0xc0,
+ 0x35, 0x31, 0x00, 0x00, 0x2b, 0x55, 0xb4, 0x60, 0x26, 0x2c, 0x5d, 0xab,
+ 0xf3, 0x66, 0x09, 0x2d, 0x33, 0xd6, 0x74, 0x34, 0x39, 0xba, 0x76, 0xfc,
+ 0xc3, 0xfd, 0x10, 0x3a, 0x72, 0x30, 0x53, 0x8d, 0x8b, 0x82, 0x00, 0x00,
+ 0x50, 0x41, 0x2f, 0x3f, 0x08, 0x27, 0x68, 0x63, 0x02, 0xdd, 0xb1, 0x1b,
+ 0x42, 0xd2, 0x2d, 0x26, 0x97, 0xa3, 0x13, 0x04, 0xe3, 0x6e, 0x8b, 0x19,
+ 0x5a, 0x14, 0xf9, 0x0d, 0xa2, 0x67, 0x00, 0xd0, 0x38, 0x85, 0x83, 0xf7,
+ 0x0b, 0x26, 0x97, 0x66, 0x91, 0x20, 0xbb, 0x27, 0x22, 0xaa, 0x6e, 0x6b,
+ 0x36, 0x1a, 0xa6, 0x1e, 0x0a, 0xb2, 0x83, 0x37, 0xf8, 0xea, 0xc2, 0x6c,
+ 0x35, 0xa5, 0x71, 0xfd, 0xec, 0x97, 0x69, 0x28, 0xa0, 0x22, 0xcd, 0x4a,
+ 0x2f, 0x7b, 0x64, 0x48, 0x5c, 0xfe, 0x6d, 0xdc, 0x71, 0x2d, 0x1e, 0x66,
+ 0xea, 0x89, 0x9f, 0x52, 0x0c, 0xc4, 0x48, 0x91, 0x7e, 0xae, 0x02, 0xbf,
+ 0x92, 0xe7, 0xa5, 0xcb, 0x38, 0xe7, 0xe1, 0x2a, 0xc2, 0x00, 0x00, 0x11,
+ 0x06, 0xe4, 0x48, 0x68, 0xe7, 0xe1, 0x35, 0x4c, 0xd5, 0x21, 0x1f, 0x47,
+ 0x3f, 0x1f, 0x60, 0xd3, 0x54, 0x8f, 0x5c, 0xf6, 0xba, 0x39, 0xaa, 0x3e,
+ 0x25, 0x83, 0x9c, 0xd2, 0xbe, 0x00, 0x00, 0x60, 0xda, 0xd4, 0xae, 0x6b,
+ 0xb3, 0x48, 0xbc, 0x59, 0x10, 0x01, 0x25, 0xe5, 0xe1, 0x8f, 0x24, 0x3f,
+ 0x32, 0x34, 0x29, 0x73, 0x42, 0x22, 0x6f, 0xa4, 0x32, 0x47, 0x8d, 0xde,
+ 0x82, 0x00, 0x00, 0x35, 0x27, 0x8b, 0xfb, 0x4d, 0x69, 0x4d, 0xb0, 0xcb,
+ 0xf0, 0x02, 0x19, 0xde, 0xe1, 0x64, 0x82, 0x66, 0xd6, 0x44, 0x51, 0x7c,
+ 0x25, 0x95, 0xf7, 0x6c, 0x1a, 0x68, 0xd9, 0xbf, 0x77, 0x00, 0x00, 0x66,
+ 0x94, 0x58, 0x4c, 0x22, 0x52, 0x46, 0xa5, 0x8c, 0x26, 0x13, 0xa1, 0xdd,
+ 0x3e, 0x2b, 0xd1, 0x81, 0x09, 0x64, 0xb9, 0xc3, 0x1a, 0x2e, 0xb7, 0xc6,
+ 0xee, 0xbc, 0x28, 0xc9, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg0_revkey000_dat_len = 573;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc
new file mode 100644
index 0000000..c2ddb24
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 1.1 Signature
+ * Group : grpX
+ * Signer : privrevoked->member002
+ * HashAlg : Sha256
+ * Message : "test message"
+ * Basename: "basename1"
+ * SigRl : groupx empty sigrl
+ */
+ //unsigned char sig_sha256_bsn0_msg0_revkey000_dat[] = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x09, 0xbd, 0x15, 0x9f,
+ 0x7f, 0x5f, 0x39, 0x6a, 0xe4, 0x92, 0x3b, 0x9c, 0x63, 0xed, 0xd4, 0x84,
+ 0xb7, 0xda, 0xff, 0xea, 0xb5, 0x5d, 0x17, 0xc2, 0xeb, 0x29, 0x16, 0xd8,
+ 0xbc, 0x59, 0x33, 0xd2, 0xd5, 0x6d, 0x89, 0xdf, 0xe4, 0x17, 0x8a, 0xa0,
+ 0x94, 0x9d, 0x29, 0xcb, 0xc7, 0x97, 0x63, 0x35, 0x5a, 0x50, 0xa4, 0x0d,
+ 0x93, 0x34, 0x39, 0x39, 0xf9, 0x46, 0xa1, 0xa8, 0x81, 0x18, 0xf7, 0xc9,
+ 0x05, 0xb5, 0x07, 0xcf, 0x2e, 0xa4, 0xbf, 0x69, 0x99, 0x98, 0x32, 0x2f,
+ 0xa9, 0x1d, 0x65, 0x0c, 0x48, 0x5f, 0xd8, 0x1f, 0x9f, 0xba, 0x21, 0x3a,
+ 0xf5, 0x34, 0xae, 0x30, 0xa7, 0xbc, 0xa0, 0x0a, 0x06, 0x9f, 0xfc, 0xe0,
+ 0x7c, 0xea, 0x0c, 0xc4, 0xbc, 0x59, 0x6e, 0x71, 0x90, 0x2e, 0x5d, 0x76,
+ 0x31, 0x12, 0x2d, 0x62, 0x05, 0xd1, 0x72, 0xe6, 0xb7, 0x5d, 0x11, 0x5f,
+ 0xd4, 0x67, 0x8e, 0x50, 0x02, 0x19, 0xb0, 0x26, 0x74, 0xdb, 0x7c, 0x21,
+ 0x8c, 0xd8, 0xff, 0x12, 0xb7, 0xa6, 0x49, 0xfc, 0x3f, 0x9a, 0xed, 0x8c,
+ 0x5e, 0x99, 0xfb, 0xa2, 0xd7, 0xff, 0x88, 0x54, 0x09, 0xd6, 0x26, 0x2c,
+ 0x04, 0xa6, 0x4d, 0xb3, 0xec, 0x6c, 0x76, 0xc1, 0x67, 0x2d, 0xfd, 0xa4,
+ 0xfb, 0x69, 0x61, 0x49, 0xf7, 0x38, 0x4d, 0x25, 0xd6, 0x93, 0x0b, 0xee,
+ 0x3d, 0x19, 0x92, 0xb4, 0x6b, 0x36, 0x4c, 0x63, 0x33, 0x90, 0x51, 0xc4,
+ 0x5e, 0x41, 0x0c, 0xe8, 0x4c, 0x3d, 0x50, 0xd9, 0x88, 0x27, 0xe7, 0xfb,
+ 0x40, 0xe6, 0x1d, 0x12, 0x0c, 0x6e, 0x63, 0x45, 0x46, 0xa2, 0x89, 0x60,
+ 0x14, 0x14, 0xc3, 0x75, 0xe0, 0xf1, 0x86, 0x74, 0x7d, 0x8d, 0xf4, 0x81,
+ 0xd7, 0x35, 0x00, 0x00, 0x35, 0x79, 0x11, 0x1d, 0xc0, 0x44, 0x4b, 0x09,
+ 0x72, 0x8d, 0x46, 0x63, 0xc7, 0xfa, 0x37, 0x4a, 0xe8, 0xcd, 0x9f, 0x1b,
+ 0x3e, 0xb6, 0x3b, 0x51, 0x46, 0x2a, 0x33, 0xde, 0xdd, 0x2a, 0x00, 0x00,
+ 0x3f, 0x8e, 0x95, 0xe4, 0x17, 0x26, 0xf4, 0x6a, 0x99, 0xf6, 0x19, 0x0b,
+ 0x4d, 0x44, 0x32, 0x63, 0x95, 0xff, 0x2b, 0x23, 0x79, 0xa4, 0xfe, 0xd7,
+ 0x16, 0x91, 0x5b, 0x88, 0x6d, 0x54, 0x00, 0x76, 0xae, 0xc3, 0xca, 0x2b,
+ 0x12, 0x25, 0x9a, 0x14, 0xde, 0x25, 0x96, 0x40, 0xdf, 0x54, 0x7b, 0x4c,
+ 0x79, 0x1e, 0xe0, 0x1d, 0x91, 0xdc, 0xd1, 0x90, 0x71, 0x52, 0x1a, 0x70,
+ 0xad, 0xd8, 0xc2, 0x53, 0x7e, 0xf1, 0x8c, 0xbd, 0x6b, 0x25, 0xab, 0x8e,
+ 0xd6, 0x93, 0x7a, 0xa9, 0x03, 0x96, 0xde, 0x7b, 0xad, 0x06, 0x5d, 0x26,
+ 0x5a, 0xdf, 0x9f, 0x1f, 0x2e, 0x57, 0xf9, 0x5d, 0xde, 0xe2, 0xe6, 0xf3,
+ 0x70, 0x2a, 0xac, 0xfd, 0x43, 0xa1, 0x8e, 0xc6, 0xf1, 0x00, 0x00, 0x72,
+ 0x7e, 0xb4, 0x6d, 0xbf, 0x32, 0x69, 0xeb, 0x71, 0x19, 0x03, 0x91, 0x9d,
+ 0xca, 0x98, 0xe9, 0x84, 0x34, 0xb7, 0xab, 0x33, 0x00, 0x1a, 0xf4, 0x4e,
+ 0x48, 0x0d, 0xc3, 0xe9, 0xe7, 0x00, 0x00, 0x08, 0x05, 0x73, 0xf4, 0xb0,
+ 0x38, 0xaa, 0xe1, 0xba, 0xd5, 0x11, 0x49, 0x21, 0xb2, 0x04, 0x8c, 0xba,
+ 0xd5, 0xb8, 0xcc, 0xf8, 0x29, 0x78, 0x4a, 0x80, 0xd8, 0x0e, 0xac, 0x04,
+ 0x00, 0x00, 0x00, 0x0c, 0xc1, 0xe7, 0xcd, 0xac, 0xb9, 0xea, 0x87, 0xae,
+ 0x15, 0xa2, 0x47, 0xf1, 0x4e, 0x28, 0x03, 0x38, 0x59, 0x11, 0xd5, 0x08,
+ 0xc0, 0x71, 0x23, 0xfe, 0x8e, 0x3e, 0xbc, 0x2d, 0xde, 0x00, 0x00, 0x05,
+ 0xd9, 0x48, 0xc2, 0x69, 0x3b, 0x6d, 0x03, 0x3b, 0x3b, 0xc5, 0xfe, 0x1d,
+ 0xd9, 0x7b, 0xb7, 0x20, 0x2f, 0xa8, 0x3c, 0x03, 0xc4, 0x5a, 0x74, 0xeb,
+ 0xed, 0x9b, 0x18, 0xb6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+//};
+//unsigned int sig_sha256_bsn0_msg0_revkey000_dat_len = 573;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/privrl.inc b/epid/common-testhelper/1.1/testdata/grp_x/privrl.inc
new file mode 100644
index 0000000..3b55ca6
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/privrl.inc
@@ -0,0 +1,43 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 private-key based revocation list
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ // Group ID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x03,
+ // n1
+ 0x00, 0x00, 0x00, 0x03,
+ // f[1]
+ 0x00, 0x00, 0x3f, 0x47, 0x7d, 0x79, 0x63, 0x82,
+ 0x72, 0x64, 0x0e, 0x44, 0xd4, 0x1a, 0x05, 0xae, 0xf0, 0x04, 0x15, 0x15,
+ 0xc7, 0x3f, 0x31, 0xdf, 0x1e, 0x57, 0x5b, 0x59, 0xcb, 0x85, 0xd4, 0xbd,
+ // f[2]
+ 0x00, 0x00, 0x47, 0xe5, 0xea, 0x2e, 0x35, 0x1c,
+ 0x6e, 0xcb, 0x99, 0xfc, 0xa6, 0x30, 0xd2, 0xf4, 0x31, 0x38, 0xc3, 0x6e,
+ 0x28, 0xee, 0xfb, 0x02, 0x5a, 0x33, 0xc1, 0xe7, 0xf7, 0x5c, 0xb4, 0xcf,
+ // f[3]
+ 0x00, 0x00, 0x06, 0x77, 0x9f, 0xc2, 0xf7, 0x86,
+ 0x3e, 0x45, 0x56, 0xfe, 0x8b, 0xd1, 0x03, 0x5a, 0x0d, 0xe5, 0xc5, 0x24,
+ 0x11, 0x4b, 0x22, 0x29, 0x04, 0x48, 0xa5, 0x7b, 0x09, 0xc9, 0x61, 0xcc,
+//};
+// unsigned int privrl_dat_len = 108;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/privrl_single_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/privrl_single_entry.inc
new file mode 100644
index 0000000..b7eb744
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/privrl_single_entry.inc
@@ -0,0 +1,35 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 private-key based revocation list
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ // Group ID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x01,
+ // n1
+ 0x00, 0x00, 0x00, 0x01,
+ // f[1]
+ 0x00, 0x00, 0x3f, 0x47, 0x7d, 0x79, 0x63, 0x82,
+ 0x72, 0x64, 0x0e, 0x44, 0xd4, 0x1a, 0x05, 0xae, 0xf0, 0x04, 0x15, 0x15,
+ 0xc7, 0x3f, 0x31, 0xdf, 0x1e, 0x57, 0x5b, 0x59, 0xcb, 0x85, 0xd4, 0xbd,
+//};
+//unsigned int privrl_dat_len = 44;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/sig_sha256_bsnrnd_msg0.inc b/epid/common-testhelper/1.1/testdata/grp_x/sig_sha256_bsnrnd_msg0.inc
new file mode 100644
index 0000000..00a0d12
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/sig_sha256_bsnrnd_msg0.inc
@@ -0,0 +1,78 @@
+//unsigned char sig_sha256_bsnrnd_msg0_dat[] = {
+//Basic sig
+0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0xaa, 0x5f, 0x63, 0xcf,
+0x9d, 0x40, 0x8b, 0xba, 0xe7, 0x33, 0xd7, 0x8b, 0xd4, 0x05, 0x91, 0x30,
+0x28, 0xcb, 0x41, 0xb6, 0x8c, 0x3a, 0x90, 0x10, 0x37, 0x06, 0x14, 0x17,
+0x5f, 0xfd, 0x56, 0x71, 0x66, 0xaf, 0x13, 0xc8, 0xfc, 0xdd, 0x9d, 0xf2,
+0x0d, 0xc2, 0x8a, 0x06, 0x5c, 0x6d, 0x0b, 0xf8, 0x25, 0xcd, 0xe2, 0x9e,
+0xad, 0x52, 0xf3, 0x29, 0x4e, 0xb0, 0x5b, 0x3f, 0x22, 0xe8, 0x1f, 0xb2,
+0x06, 0xc7, 0x32, 0x18, 0x81, 0xbf, 0xd4, 0x19, 0x03, 0xcc, 0x09, 0x78,
+0x72, 0xcc, 0x40, 0x88, 0x38, 0x27, 0x25, 0x14, 0x7a, 0x9b, 0x25, 0xb9,
+0x92, 0x67, 0x98, 0x92, 0x5d, 0x5c, 0xaf, 0x1d, 0x08, 0xc6, 0x26, 0xa5,
+0x68, 0xa3, 0x89, 0xc4, 0x28, 0x9f, 0x9c, 0x7a, 0x0e, 0x02, 0xcf, 0x34,
+0x3b, 0x37, 0x78, 0x5b, 0x1d, 0x64, 0x17, 0x47, 0x4f, 0x75, 0xb4, 0xcc,
+0x8b, 0x7d, 0xa7, 0xe1, 0x04, 0x3b, 0x70, 0x67, 0xfb, 0xae, 0x06, 0xb9,
+0x38, 0xdf, 0x13, 0x2e, 0x40, 0x95, 0x2c, 0x09, 0x2a, 0xca, 0xfd, 0x18,
+0x32, 0x1c, 0x8b, 0x11, 0x1e, 0x43, 0xd2, 0x1c, 0x25, 0xd9, 0x72, 0x0b,
+0x04, 0xb8, 0x46, 0x6d, 0xc5, 0xf9, 0xf8, 0x1c, 0xf2, 0x7b, 0xe6, 0x8a,
+0xec, 0xa8, 0x2f, 0xd8, 0x05, 0x1f, 0x82, 0x4f, 0x9f, 0xd7, 0xf7, 0x15,
+0x4e, 0xe2, 0xd2, 0x1b, 0xe0, 0xf7, 0xef, 0x90, 0x48, 0x77, 0x13, 0x24,
+0x5d, 0xcb, 0x79, 0x7d, 0x0f, 0xc0, 0x1e, 0x6e, 0x87, 0x79, 0x04, 0x41,
+0xcd, 0xfb, 0x4d, 0x47, 0xa6, 0x6c, 0x39, 0x10, 0xed, 0x45, 0x5f, 0xd1,
+0x5f, 0x18, 0x5d, 0x68, 0x1d, 0x80, 0xfd, 0x68, 0xf1, 0x7c, 0xaf, 0x9a,
+0xd7, 0x34, 0x00, 0x00, 0x75, 0xdb, 0xe0, 0x83, 0x3c, 0x49, 0x9d, 0x2e,
+0xd1, 0x6c, 0x94, 0x7e, 0x7d, 0xb7, 0x35, 0x63, 0x2f, 0x5a, 0x45, 0x6c,
+0x96, 0x9d, 0x97, 0x38, 0xf4, 0xa9, 0x99, 0xe9, 0x2c, 0x55, 0x00, 0x00,
+0x4d, 0x8d, 0xac, 0x38, 0x12, 0x22, 0x42, 0x2e, 0xdc, 0x38, 0x05, 0xa3,
+0xc8, 0x13, 0x81, 0x4c, 0x6d, 0x92, 0x13, 0x2e, 0x25, 0x95, 0x96, 0x81,
+0x61, 0xf3, 0xe5, 0x45, 0xa0, 0x85, 0x00, 0xa2, 0x2d, 0x0f, 0xc3, 0x4d,
+0xbe, 0xd9, 0x0a, 0xc0, 0x24, 0x48, 0xf4, 0x5e, 0xb3, 0x58, 0xd9, 0x2a,
+0x89, 0x1b, 0x2b, 0x83, 0x75, 0xea, 0xd7, 0x2d, 0x85, 0x7a, 0xa4, 0x06,
+0x4f, 0x2b, 0x9d, 0x0d, 0x32, 0xeb, 0x9f, 0x94, 0xe1, 0x68, 0xe5, 0x66,
+0x16, 0xc3, 0xf5, 0x75, 0xed, 0x66, 0xef, 0x97, 0xb5, 0x3f, 0x70, 0x20,
+0x23, 0x01, 0x0d, 0x0f, 0x56, 0xfd, 0x18, 0xe2, 0xe1, 0x18, 0x2d, 0xdc,
+0x83, 0xb9, 0x16, 0xd4, 0x4e, 0xc6, 0x3b, 0x29, 0x76, 0x00, 0x00, 0x85,
+0x6c, 0x54, 0x1b, 0x03, 0x74, 0xa7, 0x9f, 0xcf, 0x8c, 0x47, 0x02, 0xc9,
+0xcd, 0x59, 0xb3, 0xc9, 0x51, 0xf2, 0xf7, 0x1f, 0x48, 0x8d, 0x70, 0x7b,
+0x4d, 0xd3, 0xaf, 0xc4, 0x07, 0x00, 0x00, 0x87, 0xcc, 0x24, 0x58, 0x59,
+0x80, 0x79, 0x14, 0xff, 0xce, 0x74, 0xf2, 0xe6, 0x24, 0x5e, 0x5c, 0x41,
+0x9b, 0x5f, 0x9d, 0x64, 0x1b, 0x11, 0x60, 0x64, 0x77, 0x60, 0xd0, 0x52,
+0xac, 0x00, 0x00, 0x15, 0x44, 0x28, 0x8f, 0x55, 0xb0, 0x45, 0x5b, 0x82,
+0x40, 0x57, 0x8b, 0x45, 0xcf, 0x71, 0x79, 0x72, 0xc3, 0x47, 0x0e, 0x65,
+0x6e, 0xc8, 0x1a, 0x29, 0x87, 0xa7, 0xe3, 0x1f, 0x57, 0x00, 0x00, 0x64,
+0x32, 0xfc, 0xe8, 0x2a, 0x2e, 0x94, 0xbd, 0x62, 0xa0, 0xcc, 0xb2, 0x67,
+0x65, 0x57, 0xa6, 0x28, 0x8a, 0xd6, 0x46, 0x9d, 0xac, 0x08, 0xca, 0x3a,
+0x79, 0xe4, 0x04, 0x95, 0xb8,
+//RLver
+0x00, 0x00, 0x00, 0x02,
+//n2
+0x00, 0x00, 0x00, 0x01,
+//NrProof1 = 160
+ //T
+0x5e, 0xcc, 0x94, 0xe3, 0x67, 0x5d, 0xb5, 0x71, 0xe0, 0x28, 0x34,
+0x2e, 0xd1, 0x10, 0xff, 0x25, 0xc0, 0x3a, 0x1a, 0x2c, 0xde, 0x13, 0xe9,
+0x7e, 0x5a, 0xde, 0xc3, 0xa6, 0x04, 0x02, 0xbd, 0xf6, 0xaa, 0x4a, 0xf4,
+0xf9, 0x82, 0x31, 0xda, 0x8b, 0x44, 0xfb, 0x35, 0xcf, 0xb5, 0x4e, 0x5a,
+0x82, 0x5c, 0x11, 0xa6, 0xab, 0xdf, 0x13, 0xa9, 0x00, 0x2c, 0x95, 0xf9,
+0x9a, 0x2c, 0x9b, 0x12, 0x15,
+ //c
+0x1f, 0x7f, 0x9a, 0xc0, 0x84, 0xaa, 0x74,
+0x3e, 0x19, 0x8b, 0xb6, 0x10, 0xb6, 0xc3, 0x99, 0xaa, 0x02, 0x18, 0x62,
+0xc9, 0xa9, 0x0c, 0x26, 0x66, 0x9a, 0x1c, 0x9b, 0xc8, 0x6f, 0xaf, 0xac,
+0x06,
+ //smu
+0x9a, 0x84, 0xf4, 0xf0, 0x29, 0x48, 0x08, 0x6e, 0x43, 0xa8, 0x98,
+0xc6, 0x9f, 0x36, 0x91, 0x06, 0x25, 0x32, 0xa3, 0x57, 0x52, 0x68, 0x81,
+0x18, 0xac, 0xdc, 0xb8, 0xb4, 0x75, 0xa8, 0x85, 0xb0,
+ //snu
+0x5b, 0x3d, 0xd6,
+0xaa, 0x6e, 0xb7, 0x9a, 0x96, 0x01, 0x19, 0xb3, 0x36, 0xaa, 0x88, 0x91,
+0xff, 0x69, 0x5d, 0xf0, 0xa3, 0x9c, 0xfa, 0xd0, 0xcb, 0x60, 0xc8, 0xe7,
+0xeb, 0xab, 0xd4, 0x62, 0xff,
+//};
+//unsigned int sig_sha256_bsnrnd_msg0_dat_len = 733;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_first_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_first_entry.inc
new file mode 100644
index 0000000..bef6878
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_first_entry.inc
@@ -0,0 +1,68 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Test data.
+*
+* Type : Intel(R) EPID 1.1 signature based revocation list
+* Group : grpX
+* Revoked signature : Member0/sig_sha256_bsn0_msg0 last entry
+*/
+//unsigned char epid_sigrevlist_dat[] = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x03,
+ // n2
+ 0x00, 0x00, 0x00, 0x03,
+ // B, K - revoked signature to test
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x6e, 0xdf, 0x9f, 0xe3, 0xe0, 0x8d, 0xe4, 0x0b,
+ 0xbb, 0x86, 0x12, 0xd7, 0xc5, 0xd8, 0x14, 0x5e, 0x67, 0xbd, 0x1d, 0xa5,
+ 0x0b, 0xdb, 0xf5, 0x87, 0x36, 0x6c, 0xda, 0x81, 0x2a, 0x8c, 0x2e, 0x78,
+ 0xef, 0x6c, 0x42, 0xb2, 0xcd, 0x40, 0xda, 0xd3, 0x22, 0xf4, 0xd9, 0x7e,
+ 0x34, 0x78, 0x49, 0x41, 0x0d, 0x1e, 0x64, 0xc1, 0x43, 0xa1, 0xb0, 0xe9,
+ 0x6c, 0x45, 0xe2, 0x2d, 0xc3, 0xeb, 0xc8, 0x14,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x95, 0x8b, 0x05, 0x1e, 0x8b, 0xa5, 0x21, 0xdd,
+ 0x63, 0xfd, 0x1a, 0x36, 0xb7, 0x42, 0x04, 0x92, 0x10, 0xe6, 0x29, 0x22,
+ 0xc8, 0x97, 0xb1, 0x28, 0x01, 0x45, 0x95, 0xf1, 0x2a, 0xa0, 0x86, 0x41,
+ 0xc4, 0x4c, 0xb6, 0x3b, 0x45, 0x23, 0x6e, 0x8d, 0x6e, 0x07, 0xc7, 0x5b,
+ 0xe5, 0x46, 0xca, 0xd0, 0x68, 0x99, 0xb6, 0x30, 0x7b, 0x70, 0xb0, 0x92,
+ 0x48, 0xc2, 0x89, 0xb6, 0x27, 0x3b, 0x95, 0x89,
+// };
+// unsigned int epid_sigrevlist_dat_len = 400;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_last_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_last_entry.inc
new file mode 100644
index 0000000..ebd42ab
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_last_entry.inc
@@ -0,0 +1,68 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Test data.
+*
+* Type : Intel(R) EPID 1.1 signature based revocation list
+* Group : grpX
+* Revoked signature : Member0/sig_sha256_bsn0_msg0 last entry
+*/
+//unsigned char epid_sigrevlist_dat[] = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x03,
+ // n2
+ 0x00, 0x00, 0x00, 0x03,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x6e, 0xdf, 0x9f, 0xe3, 0xe0, 0x8d, 0xe4, 0x0b,
+ 0xbb, 0x86, 0x12, 0xd7, 0xc5, 0xd8, 0x14, 0x5e, 0x67, 0xbd, 0x1d, 0xa5,
+ 0x0b, 0xdb, 0xf5, 0x87, 0x36, 0x6c, 0xda, 0x81, 0x2a, 0x8c, 0x2e, 0x78,
+ 0xef, 0x6c, 0x42, 0xb2, 0xcd, 0x40, 0xda, 0xd3, 0x22, 0xf4, 0xd9, 0x7e,
+ 0x34, 0x78, 0x49, 0x41, 0x0d, 0x1e, 0x64, 0xc1, 0x43, 0xa1, 0xb0, 0xe9,
+ 0x6c, 0x45, 0xe2, 0x2d, 0xc3, 0xeb, 0xc8, 0x14,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x95, 0x8b, 0x05, 0x1e, 0x8b, 0xa5, 0x21, 0xdd,
+ 0x63, 0xfd, 0x1a, 0x36, 0xb7, 0x42, 0x04, 0x92, 0x10, 0xe6, 0x29, 0x22,
+ 0xc8, 0x97, 0xb1, 0x28, 0x01, 0x45, 0x95, 0xf1, 0x2a, 0xa0, 0x86, 0x41,
+ 0xc4, 0x4c, 0xb6, 0x3b, 0x45, 0x23, 0x6e, 0x8d, 0x6e, 0x07, 0xc7, 0x5b,
+ 0xe5, 0x46, 0xca, 0xd0, 0x68, 0x99, 0xb6, 0x30, 0x7b, 0x70, 0xb0, 0x92,
+ 0x48, 0xc2, 0x89, 0xb6, 0x27, 0x3b, 0x95, 0x89,
+ // B, K - revoked signature to test
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+// };
+// unsigned int epid_sigrevlist_dat_len = 400;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_middle_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_middle_entry.inc
new file mode 100644
index 0000000..c8c01c7
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_middle_entry.inc
@@ -0,0 +1,68 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Test data.
+*
+* Type : Intel(R) EPID 1.1 signature based revocation list
+* Group : grpX
+* Revoked signature : Member0/sig_sha256_bsn0_msg0 last entry
+*/
+//unsigned char epid_sigrevlist_dat[] = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x03,
+ // n2
+ 0x00, 0x00, 0x00, 0x03,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x6e, 0xdf, 0x9f, 0xe3, 0xe0, 0x8d, 0xe4, 0x0b,
+ 0xbb, 0x86, 0x12, 0xd7, 0xc5, 0xd8, 0x14, 0x5e, 0x67, 0xbd, 0x1d, 0xa5,
+ 0x0b, 0xdb, 0xf5, 0x87, 0x36, 0x6c, 0xda, 0x81, 0x2a, 0x8c, 0x2e, 0x78,
+ 0xef, 0x6c, 0x42, 0xb2, 0xcd, 0x40, 0xda, 0xd3, 0x22, 0xf4, 0xd9, 0x7e,
+ 0x34, 0x78, 0x49, 0x41, 0x0d, 0x1e, 0x64, 0xc1, 0x43, 0xa1, 0xb0, 0xe9,
+ 0x6c, 0x45, 0xe2, 0x2d, 0xc3, 0xeb, 0xc8, 0x14,
+ // B, K - revoked signature to test
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x95, 0x8b, 0x05, 0x1e, 0x8b, 0xa5, 0x21, 0xdd,
+ 0x63, 0xfd, 0x1a, 0x36, 0xb7, 0x42, 0x04, 0x92, 0x10, 0xe6, 0x29, 0x22,
+ 0xc8, 0x97, 0xb1, 0x28, 0x01, 0x45, 0x95, 0xf1, 0x2a, 0xa0, 0x86, 0x41,
+ 0xc4, 0x4c, 0xb6, 0x3b, 0x45, 0x23, 0x6e, 0x8d, 0x6e, 0x07, 0xc7, 0x5b,
+ 0xe5, 0x46, 0xca, 0xd0, 0x68, 0x99, 0xb6, 0x30, 0x7b, 0x70, 0xb0, 0x92,
+ 0x48, 0xc2, 0x89, 0xb6, 0x27, 0x3b, 0x95, 0x89,
+// };
+// unsigned int epid_sigrevlist_dat_len = 400;
diff --git a/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_single_entry.inc b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_single_entry.inc
new file mode 100644
index 0000000..aaa0a8b
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_single_entry.inc
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha256_bsn0_msg0 single entry
+ */
+//unsigned char sigrl_dat[] = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RLver
+ 0x00, 0x00, 0x00, 0x01,
+ // n2
+ 0x00, 0x00, 0x00, 0x01,
+ // B, K - revoked signature to test
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+//};
+//unsigned int sigrl_dat_len = 140;
diff --git a/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_first_entry.inc b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_first_entry.inc
new file mode 100644
index 0000000..c005e32
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_first_entry.inc
@@ -0,0 +1,38 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 group revocation list grpX revoked first entry
+ * 0 32 64 96 128 Bit
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | RLVer = 3 | n3 = 3 | gid[1] = 0x7b | gid[2] = 0x12 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * 128 160 Bit
+ * +-+-+-+-+-+-+-+-+
+ * | gid[2] = 0x5f |
+ * +-+-+-+-+-+-+-+-+
+ *
+ * 0x7b is revoked gid
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x5f
+//};
+//unsigned int grprl_dat_len = 20;
diff --git a/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_last_entry.inc b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_last_entry.inc
new file mode 100644
index 0000000..c239ce2
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_last_entry.inc
@@ -0,0 +1,38 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 group revocation list grpX revoked last entry
+ * 0 32 64 96 128 Bit
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | RLVer = 3 | n3 = 3 | gid[1] = 0x4e | gid[2] = 0x12 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * 128 160 Bit
+ * +-+-+-+-+-+-+-+-+
+ * | gid[2] = 0x7b |
+ * +-+-+-+-+-+-+-+-+
+ *
+ * 0x7b is revoked gid
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x7b
+//};
+//unsigned int grprl_dat_len = 20;
diff --git a/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_middle_entry.inc b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_middle_entry.inc
new file mode 100644
index 0000000..bbddb31
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_middle_entry.inc
@@ -0,0 +1,38 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 group revocation list grpX revoked middle entry
+ * 0 32 64 96 128 Bit
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | RLVer = 3 | n3 = 3 | gid[1] = 0x4e | gid[2] = 0x7b |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * 128 160 Bit
+ * +-+-+-+-+-+-+-+-+
+ * | gid[2] = 0x6c |
+ * +-+-+-+-+-+-+-+-+
+ *
+ * 0x7b is revoked gid
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x7b,
+ 0x00, 0x00, 0x00, 0x6c
+//};
+//unsigned int grprl_dat_len = 20;
diff --git a/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_single_entry.inc b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_single_entry.inc
new file mode 100644
index 0000000..e25cce3
--- /dev/null
+++ b/epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_single_entry.inc
@@ -0,0 +1,32 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 group revocation list single entry grpX revoked
+ * 0 32 64 96 Bit
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | RLVer = 3 | n3 = 1 | gid[0] = 0x7b |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * 0x7b is revoked gid
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x7b
+//};
+//unsigned int grprl_dat_len = 12;
diff --git a/epid/common-testhelper/1.1/verifier_wrapper-testhelper.cc b/epid/common-testhelper/1.1/verifier_wrapper-testhelper.cc
new file mode 100644
index 0000000..ea95b07
--- /dev/null
+++ b/epid/common-testhelper/1.1/verifier_wrapper-testhelper.cc
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcGroup C++ wrapper implementation.
+ */
+#include <cstdio>
+#include <stdexcept>
+#include <string>
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+
+Epid11VerifierCtxObj::Epid11VerifierCtxObj(Epid11GroupPubKey const& pub_key)
+ : ctx_(nullptr) {
+ auto sts = Epid11VerifierCreate(&pub_key, nullptr, &ctx_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "Epid11VerifierCreate()");
+ }
+}
+
+Epid11VerifierCtxObj::Epid11VerifierCtxObj(Epid11GroupPubKey const& pub_key,
+ Epid11VerifierPrecomp const& precomp)
+ : ctx_(nullptr) {
+ auto sts = Epid11VerifierCreate(&pub_key, &precomp, &ctx_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "Epid11VerifierCreate()");
+ }
+}
+
+Epid11VerifierCtxObj::~Epid11VerifierCtxObj() { Epid11VerifierDelete(&ctx_); }
+
+Epid11VerifierCtx* Epid11VerifierCtxObj::ctx() const { return ctx_; }
+
+Epid11VerifierCtxObj::operator Epid11VerifierCtx*() const { return ctx_; }
+
+Epid11VerifierCtxObj::operator const Epid11VerifierCtx*() const { return ctx_; }
diff --git a/epid/common-testhelper/1.1/verifier_wrapper-testhelper.h b/epid/common-testhelper/1.1/verifier_wrapper-testhelper.h
new file mode 100644
index 0000000..f3c351a
--- /dev/null
+++ b/epid/common-testhelper/1.1/verifier_wrapper-testhelper.h
@@ -0,0 +1,56 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verifier C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_1_1_VERIFIER_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_1_1_VERIFIER_WRAPPER_TESTHELPER_H_
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+}
+
+/// C++ Wrapper to manage memory for VerifierCtx via RAII
+class Epid11VerifierCtxObj {
+ public:
+ /// Create an Epid11VerifierCtx
+ explicit Epid11VerifierCtxObj(Epid11GroupPubKey const& pub_key);
+ /// Create an Epid11VerifierCtx given precomputation blob
+ Epid11VerifierCtxObj(Epid11GroupPubKey const& pub_key,
+ Epid11VerifierPrecomp const& precomp);
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ Epid11VerifierCtxObj(const Epid11VerifierCtxObj&) = delete;
+ Epid11VerifierCtxObj& operator=(const Epid11VerifierCtxObj&) = delete;
+
+ /// Destroy the Epid11VerifierCtx
+ ~Epid11VerifierCtxObj();
+ /// get a pointer to the stored Epid11VerifierCtx
+ Epid11VerifierCtx* ctx() const;
+ /// cast operator to get the pointer to the stored Epid11VerifierCtx
+ operator Epid11VerifierCtx*() const;
+ /// const cast operator to get the pointer to the stored Epid11VerifierCtx
+ operator const Epid11VerifierCtx*() const;
+
+ private:
+ /// The stored VerifierCtx
+ Epid11VerifierCtx* ctx_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_1_1_VERIFIER_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/Makefile b/epid/common-testhelper/Makefile
new file mode 100644
index 0000000..1b9559b
--- /dev/null
+++ b/epid/common-testhelper/Makefile
@@ -0,0 +1,68 @@
+#!/usr/bin/make -f
+
+#define variables
+GTEST_INCLUDE_DIR = ../../ext
+TEST_INSTALL_DIR = $(epidinstalldir)/test/
+
+COMMON_TESTHELPER_INCLUDE_DIR = ../..
+COMMON_TESTHELPER_11_INCLUDE_DIR = ../../1.1
+COMMON_TESTHELPER_SRC = $(wildcard ./*.cc)
+COMMON_TESTHELPER_SRC += $(wildcard ./1.1/*.cc)
+COMMON_TESTHELPER_UTEST_SRC = $(wildcard ./unittests/*.cc)
+COMMON_TESTHELPER_OBJ = $(COMMON_TESTHELPER_SRC:.cc=.o)
+COMMON_TESTHELPER_UTEST_OBJ = $(COMMON_TESTHELPER_UTEST_SRC:.cc=.o)
+COMMON_TESTHELPER_LIB = ./libcommon-testhelper.a
+COMMON_TESTHELPER_UTEST_EXE = ./unittests/common-testhelper-utest$(EXE_EXTENSION)
+
+LIB_COMMON_TESTHELPER_DIR = .
+LIB_COMMON_DIR = ../common
+LIB_IPPCP_DIR = ../../ext/ipp/sources/ippcp/src
+
+#set flags for linker
+LDFLAGS += -L$(GTEST_INCLUDE_DIR)/gtest -L$(LIB_COMMON_TESTHELPER_DIR) \
+ -L$(LIB_COMMON_DIR) -L$(LIB_IPPCP_DIR) \
+ -lgtest -lcommon-testhelper -lcommon -lippcp
+
+ifneq ($(TSS_PATH),)
+ CXXFLAGS += -DTPM_TSS
+endif
+
+#target part
+$(COMMON_TESTHELPER_LIB): $(COMMON_TESTHELPER_OBJ)
+ $(AR) rc $(COMMON_TESTHELPER_LIB) $(COMMON_TESTHELPER_OBJ)
+ $(RANLIB) $(COMMON_TESTHELPER_LIB)
+
+$(COMMON_TESTHELPER_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) -I$(COMMON_TESTHELPER_INCLUDE_DIR) -c $^
+
+$(COMMON_TESTHELPER_UTEST_EXE): $(COMMON_TESTHELPER_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+$(COMMON_TESTHELPER_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(COMMON_TESTHELPER_INCLUDE_DIR) \
+ -I$(COMMON_TESTHELPER_11_INCLUDE_DIR) -I$(GTEST_INCLUDE_DIR) -c $^
+
+build: all
+
+all: $(COMMON_TESTHELPER_LIB)
+
+install:
+#install tests if they exist
+ifneq (,$(wildcard $(COMMON_TESTHELPER_UTEST_EXE)))
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(COMMON_TESTHELPER_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+endif
+
+utest: $(COMMON_TESTHELPER_UTEST_EXE)
+
+run_utest:
+ $(COMMON_TESTHELPER_UTEST_EXE) $(GTEST_FLAGS)
+
+check: utest run_utest
+
+clean:
+ rm -f $(COMMON_TESTHELPER_OBJ) \
+ $(COMMON_TESTHELPER_LIB) \
+ $(COMMON_TESTHELPER_UTEST_OBJ) \
+ $(COMMON_TESTHELPER_UTEST_EXE) \
+ *.xml
diff --git a/epid/common-testhelper/bignum_wrapper-testhelper.cc b/epid/common-testhelper/bignum_wrapper-testhelper.cc
new file mode 100644
index 0000000..680dd59
--- /dev/null
+++ b/epid/common-testhelper/bignum_wrapper-testhelper.cc
@@ -0,0 +1,123 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Bignum C++ wrapper implementation.
+ */
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common/math/bignum.h"
+
+/// bignum deleter type
+struct BigNumDeleter {
+ /// bignum deleter
+ void operator()(BigNum* bn) {
+ if (bn) {
+ DeleteBigNum(&bn);
+ }
+ }
+};
+
+/// bignum deleter singlton
+BigNumDeleter bignum_deleter;
+
+/// Internal state of the bignum wrapper
+struct BigNumObj::State {
+ /// size of the stored BigNum
+ size_t size;
+
+ /// The stored BigNum
+ std::shared_ptr<BigNum> bn_;
+
+ /// Default initializing constructor
+ State() : size(0), bn_() {}
+
+ /// write a new value
+ void write(unsigned char const* buf, size_t buflen, size_t len) {
+ bool orig_has_data = (buf != nullptr) && (buflen > 0);
+ std::shared_ptr<BigNum> bn;
+ BigNum* bn_ptr = nullptr;
+ THROW_ON_EPIDERR(NewBigNum(len, &bn_ptr));
+ bn.reset(bn_ptr, bignum_deleter);
+ size = len;
+ if (orig_has_data) {
+ THROW_ON_EPIDERR(ReadBigNum(buf, buflen, bn.get()));
+ }
+ bn_ = bn;
+ }
+};
+
+BigNumObj::BigNumObj() : state_(new State) {
+ state_->write(nullptr, 0, sizeof(BigNumStr));
+}
+
+BigNumObj::BigNumObj(BigNumObj const& other) : state_(new State) {
+ bool orig_has_data = other.state_->bn_.get() != nullptr;
+ std::vector<unsigned char> buf;
+ if (orig_has_data) {
+ buf.resize(other.state_->size);
+ THROW_ON_EPIDERR(WriteBigNum(other.state_->bn_.get(), buf.size(), &buf[0]));
+ }
+ state_->write(&buf[0], other.state_->size, buf.size());
+}
+
+BigNumObj& BigNumObj::operator=(BigNumObj const& other) {
+ bool orig_has_data = other.state_->bn_.get() != nullptr;
+ std::vector<unsigned char> buf;
+ if (orig_has_data) {
+ buf.resize(other.state_->size);
+ THROW_ON_EPIDERR(WriteBigNum(other.state_->bn_.get(), buf.size(), &buf[0]));
+ }
+ state_->write(&buf[0], other.state_->size, buf.size());
+ return *this;
+}
+
+BigNumObj::BigNumObj(size_t data_size_bytes) : state_(new State) {
+ state_->write(nullptr, 0, data_size_bytes);
+}
+
+BigNumObj::BigNumObj(size_t data_size_bytes,
+ std::vector<unsigned char> const& bytes)
+ : state_(new State) {
+ state_->write(&bytes[0], bytes.size(), data_size_bytes);
+}
+
+BigNumObj::BigNumObj(size_t data_size_bytes, BigNumStr const& bytes)
+ : state_(new State) {
+ state_->write((unsigned char const*)&bytes, sizeof(BigNumStr),
+ data_size_bytes);
+}
+
+BigNumObj::BigNumObj(std::vector<unsigned char> const& bytes)
+ : state_(new State) {
+ state_->write(&bytes[0], bytes.size(), bytes.size());
+}
+
+BigNumObj::BigNumObj(BigNumStr const& bytes) : state_(new State) {
+ state_->write((unsigned char const*)&bytes, sizeof(BigNumStr),
+ sizeof(BigNumStr));
+}
+
+BigNumObj::~BigNumObj() {}
+
+BigNumObj::operator BigNum*() { return state_->bn_.get(); }
+
+BigNumObj::operator const BigNum*() const { return state_->bn_.get(); }
+
+BigNum* BigNumObj::get() { return state_->bn_.get(); }
+
+BigNum const* BigNumObj::getc() const { return state_->bn_.get(); }
diff --git a/epid/common-testhelper/bignum_wrapper-testhelper.h b/epid/common-testhelper/bignum_wrapper-testhelper.h
new file mode 100644
index 0000000..6008e65
--- /dev/null
+++ b/epid/common-testhelper/bignum_wrapper-testhelper.h
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Bignum C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_BIGNUM_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_BIGNUM_WRAPPER_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+}
+
+/*!
+Wrapper class to provide Resource Allocation is Initialization handling
+for BigNum
+*/
+class BigNumObj {
+ public:
+ /// Create a BigNum of default size ( sizeof(BigNumStr) )
+ BigNumObj();
+ /// copy constructor
+ BigNumObj(BigNumObj const& other);
+ /// assignment operator
+ BigNumObj& operator=(BigNumObj const& other);
+ /// Create a BigNum of specific size
+ explicit BigNumObj(size_t data_size_bytes);
+ /// Create a BigNum of specific size and initialize it to bytes
+ BigNumObj(size_t data_size_bytes, std::vector<unsigned char> const& bytes);
+ /// Create a BigNum of specific size and initialize it to bytes
+ BigNumObj(size_t data_size_bytes, BigNumStr const& bytes);
+ /// Create a BigNum the same size as bytes and initialize it to bytes
+ explicit BigNumObj(std::vector<unsigned char> const& bytes);
+ /// Create a BigNum the same size as bytes and initialize it to bytes
+ explicit BigNumObj(BigNumStr const& bytes);
+ /// Destroy the Bignum
+ ~BigNumObj();
+ /// cast operator to get the pointer to the stored BigNum
+ operator BigNum*();
+ /// const cast operator to get the pointer to the stored BigNum
+ operator const BigNum*() const;
+ /// Get the underlying pointer
+ BigNum* get();
+ /// Get the underlying pointer
+ BigNum const* getc() const;
+
+ private:
+ struct State;
+ std::unique_ptr<State> state_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_BIGNUM_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/common-testhelper.parts b/epid/common-testhelper/common-testhelper.parts
new file mode 100644
index 0000000..c0b6a41
--- /dev/null
+++ b/epid/common-testhelper/common-testhelper.parts
@@ -0,0 +1,86 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+env.PartName('common-testhelper')
+
+src_files = Pattern(
+ src_dir='.', includes=['*-testhelper.cc'], excludes=[],
+ recursive=False).files()
+inc_files = Pattern(
+ src_dir='.', includes=['*-testhelper.h'], excludes=[],
+ recursive=False).files()
+epid11_src_files = Pattern(
+ src_dir='1.1', includes=['*-testhelper.cc'], excludes=[],
+ recursive=False).files()
+epid11_inc_files = Pattern(
+ src_dir='1.1', includes=['*-testhelper.h'], excludes=[],
+ recursive=False).files()
+test_data_files = Pattern(
+ src_dir='testdata', includes=['*'], excludes=[], recursive=True)
+epid11_test_data_files = Pattern(
+ src_dir='1.1/testdata', includes=['*'], excludes=[], recursive=True)
+
+# unit tests
+utest_files = Pattern(
+ src_dir='.', includes=['*-test.cc'], excludes=[], recursive=True).files()
+
+if 'use_tss' in env['MODE']:
+ env.Append(CPPDEFINES=['TPM_TSS'])
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(inc_files, sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(
+ utest_files, sub_dir='epid/${PART_SHORT_NAME}/unittests')
+ env.InstallTopLevel(
+ test_data_files, sub_dir='epid/${PART_SHORT_NAME}/testdata')
+
+ env.InstallTopLevel(
+ epid11_src_files, sub_dir='epid/${PART_SHORT_NAME}/1.1')
+ env.InstallTopLevel(
+ epid11_inc_files, sub_dir='epid/${PART_SHORT_NAME}/1.1')
+ env.InstallTopLevel(
+ epid11_test_data_files, sub_dir='epid/${PART_SHORT_NAME}/1.1/testdata')
+
+ parts_file = ['common-testhelper.parts']
+ env.InstallTopLevel(parts_file, sub_dir='epid/${PART_SHORT_NAME}')
+ makefile = ['Makefile']
+ env.InstallTopLevel(makefile, sub_dir='epid/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ ])
+
+ env.Append(CPPPATH='#')
+
+ testenv = env.Clone()
+
+ outputs = env.Library('${PART_NAME}', src_files + epid11_src_files)
+ env.Sdk(outputs)
+
+ testenv['UNIT_TEST_TARGET_NAME'] = "${PART_NAME}-${UNIT_TEST_TARGET}"
+ testenv.UnitTest(
+ "utest",
+ utest_files,
+ command_args=[
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ '--gtest_filter=**',
+ ],
+ make_pdb=(env.isConfigBasedOn('debug')),
+ depends=[Component('gtest'), Component('common-testhelper')],
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
diff --git a/epid/common-testhelper/ecgroup_wrapper-testhelper.cc b/epid/common-testhelper/ecgroup_wrapper-testhelper.cc
new file mode 100644
index 0000000..34dfd7e
--- /dev/null
+++ b/epid/common-testhelper/ecgroup_wrapper-testhelper.cc
@@ -0,0 +1,126 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcGroup C++ wrapper implementation.
+ */
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common/math/bignum.h"
+
+/// ecgroup deleter type
+struct EcGroupDeleter {
+ /// ecgroup deleter
+ void operator()(EcGroup* ptr) {
+ if (ptr) {
+ DeleteEcGroup(&ptr);
+ }
+ }
+};
+
+/// ecgroup deleter singlton
+EcGroupDeleter ecgroup_deleter;
+
+/// Internal state of the ecgroup wrapper
+struct EcGroupObj::State {
+ /// The stored EcGroup
+ std::shared_ptr<EcGroup> group_;
+ FiniteFieldObj fintefield_;
+
+ /// constructor
+ State() : group_(nullptr, ecgroup_deleter) {}
+
+ // State instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ State(const State&) = delete;
+ State& operator=(const State&) = delete;
+
+ /// destructor
+ ~State() {}
+};
+
+EcGroupObj::EcGroupObj() : state_(new State()) {
+ const BigNumStr q_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}}};
+ const FqElemStr b_str = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}};
+ const BigNumStr p_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+ const BigNumStr h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+ const G1ElemStr g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+ FiniteFieldObj fq(q_str);
+ EcGroup* temp = nullptr;
+ NewEcGroup(fq, FfElementObj(&fq), FfElementObj(&fq, b_str),
+ FfElementObj(&fq, g1_str.x), FfElementObj(&fq, g1_str.y),
+ BigNumObj(p_str), BigNumObj(h1), &temp);
+ state_->group_.reset(temp, ecgroup_deleter);
+ state_->fintefield_ = fq;
+}
+
+EcGroupObj::EcGroupObj(EcGroupObj const& other) : state_(new State) {
+ state_->group_ = other.state_->group_;
+ state_->fintefield_ = other.state_->fintefield_;
+}
+
+EcGroupObj& EcGroupObj::operator=(EcGroupObj const& other) {
+ state_->group_ = other.state_->group_;
+ state_->fintefield_ = other.state_->fintefield_;
+ return *this;
+}
+
+EcGroupObj::EcGroupObj(FiniteFieldObj* ff, FfElement const* a,
+ FfElement const* b, FfElement const* x,
+ FfElement const* y, BigNum const* order,
+ BigNum const* cofactor)
+ : state_(new State) {
+ EcGroup* temp = nullptr;
+ NewEcGroup(*ff, a, b, x, y, order, cofactor, &temp);
+ state_->group_.reset(temp, ecgroup_deleter);
+ state_->fintefield_ = *ff;
+}
+
+EcGroupObj::~EcGroupObj() {}
+
+EcGroupObj::operator EcGroup*() { return state_->group_.get(); }
+
+EcGroupObj::operator const EcGroup*() const { return state_->group_.get(); }
+
+EcGroup* EcGroupObj::get() { return state_->group_.get(); }
+
+EcGroup const* EcGroupObj::getc() const { return state_->group_.get(); }
+
+size_t EcGroupObj::GetElementMaxSize() const {
+ return 2 * state_->fintefield_.GetElementMaxSize();
+}
diff --git a/epid/common-testhelper/ecgroup_wrapper-testhelper.h b/epid/common-testhelper/ecgroup_wrapper-testhelper.h
new file mode 100644
index 0000000..4969134
--- /dev/null
+++ b/epid/common-testhelper/ecgroup_wrapper-testhelper.h
@@ -0,0 +1,68 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcGroup C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_ECGROUP_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_ECGROUP_WRAPPER_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/math/ecgroup.h"
+}
+
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+/*!
+Wrapper class to provide Resource Allocation is Initialization handling
+for EcGroup
+*/
+class EcGroupObj {
+ public:
+ /// constructor
+ EcGroupObj();
+ /// copy constructor
+ EcGroupObj(EcGroupObj const& other);
+ /// assignment operator
+ EcGroupObj& operator=(EcGroupObj const& other);
+ /// Create a EcGroup
+ explicit EcGroupObj(FiniteFieldObj* ff, FfElement const* a,
+ FfElement const* b, FfElement const* x,
+ FfElement const* y, BigNum const* order,
+ BigNum const* cofactor);
+ /// Destroy the EcGroup
+ ~EcGroupObj();
+ /// cast operator to get the pointer to the stored EcGroup
+ operator EcGroup*();
+ /// const cast operator to get the pointer to the stored EcGroup
+ operator const EcGroup*() const;
+ /// Get the underlying pointer
+ EcGroup* get();
+ /// Get the underlying pointer
+ EcGroup const* getc() const;
+ /// Get maximum size of group element
+ size_t GetElementMaxSize() const;
+
+ private:
+ struct State;
+ std::unique_ptr<State> state_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_ECGROUP_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/ecpoint_wrapper-testhelper.cc b/epid/common-testhelper/ecpoint_wrapper-testhelper.cc
new file mode 100644
index 0000000..354338b
--- /dev/null
+++ b/epid/common-testhelper/ecpoint_wrapper-testhelper.cc
@@ -0,0 +1,128 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcPoint C++ wrapper implementation.
+ */
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common/math/bignum.h"
+
+/// ecpoint deleter type
+struct EcPointDeleter {
+ /// ecpoint deleter
+ void operator()(EcPoint* ptr) {
+ if (ptr) {
+ DeleteEcPoint(&ptr);
+ }
+ }
+};
+
+/// ecpoint deleter singlton
+EcPointDeleter ecpoint_deleter;
+
+/// Internal state of the ecpoint wrapper
+struct EcPointObj::State {
+ /// The containing field
+ EcGroupObj group_;
+ /// The stored EcPoint
+ std::shared_ptr<EcPoint> point_;
+
+ State() : group_(), point_() {}
+ /// write a new value
+ void write(EcGroupObj* group, unsigned char const* buf, size_t buflen) {
+ group_ = *group;
+ bool orig_has_data = (buf != nullptr) && (buflen > 0);
+ std::shared_ptr<EcPoint> point;
+ EcPoint* point_ptr;
+ THROW_ON_EPIDERR(NewEcPoint(group_, &point_ptr));
+ point.reset(point_ptr, ecpoint_deleter);
+ if (orig_has_data) {
+ THROW_ON_EPIDERR(ReadEcPoint(group_, buf, buflen, point.get()));
+ }
+ point_ = point;
+ }
+};
+
+EcPointObj::EcPointObj() : state_(new State) {}
+
+EcPointObj::EcPointObj(EcPointObj const& other) : state_(new State) {
+ std::vector<unsigned char> buf = other.data();
+ state_->write(&other.state_->group_, &buf[0], buf.size());
+}
+
+EcPointObj& EcPointObj::operator=(EcPointObj const& other) {
+ std::vector<unsigned char> buf = other.data();
+ state_->write(&other.state_->group_, &buf[0], buf.size());
+ return *this;
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group) : state_(new State) {
+ state_->write(group, nullptr, 0);
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group, G1ElemStr const& bytes)
+ : state_(new State) {
+ init(group, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group, G2ElemStr const& bytes)
+ : state_(new State) {
+ init(group, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group, Epid11G2ElemStr const& bytes)
+ : state_(new State) {
+ init(group, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group,
+ std::vector<unsigned char> const& bytes)
+ : state_(new State) {
+ init(group, &bytes[0], bytes.size());
+}
+
+EcPointObj::EcPointObj(EcGroupObj* group, void const* bytes, size_t size)
+ : state_(new State) {
+ init(group, (unsigned char const*)bytes, size);
+}
+
+void EcPointObj::init(EcGroupObj* group, unsigned char const* bytes,
+ size_t size) {
+ state_->write(group, bytes, size);
+}
+
+EcPointObj::~EcPointObj() {}
+
+EcPointObj::operator EcPoint*() { return state_->point_.get(); }
+
+EcPointObj::operator const EcPoint*() const { return state_->point_.get(); }
+
+EcPoint* EcPointObj::get() { return state_->point_.get(); }
+
+EcPoint const* EcPointObj::getc() const { return state_->point_.get(); }
+
+std::vector<unsigned char> EcPointObj::data() const {
+ std::vector<unsigned char> buf;
+ if (state_->point_.get() != nullptr) {
+ buf.resize(state_->group_.GetElementMaxSize());
+ THROW_ON_EPIDERR(WriteEcPoint(state_->group_, state_->point_.get(), &buf[0],
+ buf.size()));
+ }
+ return buf;
+}
diff --git a/epid/common-testhelper/ecpoint_wrapper-testhelper.h b/epid/common-testhelper/ecpoint_wrapper-testhelper.h
new file mode 100644
index 0000000..6e75df4
--- /dev/null
+++ b/epid/common-testhelper/ecpoint_wrapper-testhelper.h
@@ -0,0 +1,78 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcPoint C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_ECPOINT_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_ECPOINT_WRAPPER_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+}
+
+class EcGroupObj;
+
+/*!
+Wrapper class to provide Resource Allocation is Initialization handling
+for EcPoint
+*/
+class EcPointObj {
+ public:
+ /// constructor
+ EcPointObj();
+ /// copy constructor
+ EcPointObj(EcPointObj const& other);
+ /// assignment operator
+ EcPointObj& operator=(EcPointObj const& other);
+ /// Create an EcPoint
+ explicit EcPointObj(EcGroupObj* group);
+ /// Create an EcPoint
+ EcPointObj(EcGroupObj* group, G1ElemStr const& bytes);
+ /// Create an EcPoint
+ EcPointObj(EcGroupObj* group, G2ElemStr const& bytes);
+ /// Create an EcPoint
+ EcPointObj(EcGroupObj* group, Epid11G2ElemStr const& bytes);
+ /// Create an EcPoint
+ EcPointObj(EcGroupObj* group, std::vector<unsigned char> const& bytes);
+ /// Create an EcPoint
+ EcPointObj(EcGroupObj* group, void const* bytes, size_t size);
+ /// Destroy the EcPoint
+ ~EcPointObj();
+ /// cast operator to get the pointer to the stored EcPoint
+ operator EcPoint*();
+ /// const cast operator to get the pointer to the stored EcPoint
+ operator const EcPoint*() const;
+ /// Get the underlying pointer
+ EcPoint* get();
+ /// Get the underlying pointer
+ EcPoint const* getc() const;
+ /// Get element bytes
+ std::vector<unsigned char> data() const;
+
+ private:
+ void init(EcGroupObj* group, unsigned char const* bytes, size_t size);
+ struct State;
+ std::unique_ptr<State> state_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_ECPOINT_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/epid2params_wrapper-testhelper.cc b/epid/common-testhelper/epid2params_wrapper-testhelper.cc
new file mode 100644
index 0000000..b9636f8
--- /dev/null
+++ b/epid/common-testhelper/epid2params_wrapper-testhelper.cc
@@ -0,0 +1,49 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Epid2Params C++ wrapper implementation.
+/*! \file */
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+
+#include <cstdio>
+#include <stdexcept>
+#include <string>
+
+extern "C" {
+#include "epid/common/src/epid2params.h"
+}
+
+Epid2ParamsObj::Epid2ParamsObj() : params_(nullptr) {
+ EpidStatus sts = kEpidNoErr;
+ sts = CreateEpid2Params(&params_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "CreateEpid2Params()");
+ }
+}
+
+Epid2ParamsObj::~Epid2ParamsObj() { DeleteEpid2Params(&params_); }
+
+Epid2Params_* Epid2ParamsObj::ctx() const { return params_; }
+
+Epid2ParamsObj::operator Epid2Params_*() const { return params_; }
+
+Epid2ParamsObj::operator const Epid2Params_*() const { return params_; }
+
+FiniteField* Epid2ParamsObj::Fp() const { return params_->Fp; }
+
+EcGroup* Epid2ParamsObj::G1() const { return params_->G1; }
diff --git a/epid/common-testhelper/epid2params_wrapper-testhelper.h b/epid/common-testhelper/epid2params_wrapper-testhelper.h
new file mode 100644
index 0000000..90ddcee
--- /dev/null
+++ b/epid/common-testhelper/epid2params_wrapper-testhelper.h
@@ -0,0 +1,55 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Epid2Params C++ wrapper interface.
+/*! \file */
+
+#ifndef EPID_COMMON_TESTHELPER_EPID2PARAMS_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_EPID2PARAMS_WRAPPER_TESTHELPER_H_
+
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct FiniteField FiniteField;
+typedef struct EcGroup EcGroup;
+
+/// C++ Wrapper to manage memory for Epid2Params via RAII
+class Epid2ParamsObj {
+ public:
+ /// Create a Epid2Params
+ Epid2ParamsObj();
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ Epid2ParamsObj(const Epid2ParamsObj&) = delete;
+ Epid2ParamsObj& operator=(const Epid2ParamsObj&) = delete;
+
+ /// Destroy the Epid2Params
+ ~Epid2ParamsObj();
+ /// get a pointer to the stored Epid2Params
+ Epid2Params_* ctx() const;
+ /// cast operator to get the pointer to the stored Epid2Params
+ operator Epid2Params_*() const;
+ /// const cast operator to get the pointer to the stored Epid2Params
+ operator const Epid2Params_*() const;
+ /// get a pointer to the prime field Fp
+ FiniteField* Fp() const;
+ /// get a pointer to elliptic curve group G1
+ EcGroup* G1() const;
+
+ private:
+ /// The stored parameters
+ Epid2Params_* params_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_EPID2PARAMS_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/epid_gtest-testhelper.cc b/epid/common-testhelper/epid_gtest-testhelper.cc
new file mode 100644
index 0000000..d19e822
--- /dev/null
+++ b/epid/common-testhelper/epid_gtest-testhelper.cc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Implementation of Intel(R) EPID specific predicates for gtest
+ */
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include <string>
+
+/// Record mapping status code to string
+struct EpidStatusTextEntry {
+ /// error code
+ EpidStatus value;
+ /// name of error code
+ const char* value_name;
+};
+#define EPID_STATUS_TEXT_ENTRY_VALUE(sts) \
+ { sts, #sts }
+/// Mapping of status codes to strings
+static const struct EpidStatusTextEntry kEnumToText[] = {
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidNoErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidSigInvalid),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidSigRevokedInGroupRl),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidSigRevokedInPrivRl),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidSigRevokedInSigRl),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidSigRevokedInVerifierRl),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidNotImpl),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidBadArgErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidNoMemErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidMemAllocErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidMathErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidDivByZeroErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidUnderflowErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidHashAlgorithmNotSupported),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidRandMaxIterErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidDuplicateErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidInconsistentBasenameSetErr),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidMathQuadraticNonResidueError),
+ EPID_STATUS_TEXT_ENTRY_VALUE(kEpidOutOfSequenceError)};
+
+const char* EpidStatusToName(EpidStatus e) {
+ size_t i = 0;
+ const size_t num_entries = sizeof(kEnumToText) / sizeof(kEnumToText[0]);
+ for (i = 0; i < num_entries; i++) {
+ if (e == kEnumToText[i].value) {
+ return kEnumToText[i].value_name;
+ }
+ }
+ return "unknown";
+}
+std::ostream& operator<<(std::ostream& os, EpidStatus e) {
+ const char* enum_name = EpidStatusToName(e);
+ return os << enum_name << " (" << std::to_string(e) << ")";
+}
diff --git a/epid/common-testhelper/epid_gtest-testhelper.h b/epid/common-testhelper/epid_gtest-testhelper.h
new file mode 100644
index 0000000..3831f3d
--- /dev/null
+++ b/epid/common-testhelper/epid_gtest-testhelper.h
@@ -0,0 +1,30 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID specific predicates for gtest
+ */
+#ifndef EPID_COMMON_TESTHELPER_EPID_GTEST_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_EPID_GTEST_TESTHELPER_H_
+#include <ostream>
+extern "C" {
+#include "epid/common/errors.h"
+}
+
+std::ostream& operator<<(std::ostream& os, EpidStatus e);
+
+#endif // EPID_COMMON_TESTHELPER_EPID_GTEST_TESTHELPER_H_
diff --git a/epid/common-testhelper/epid_params-testhelper.cc b/epid/common-testhelper/epid_params-testhelper.cc
new file mode 100644
index 0000000..1991db9
--- /dev/null
+++ b/epid/common-testhelper/epid_params-testhelper.cc
@@ -0,0 +1,171 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID parameters C++ wrapper implementation.
+ */
+
+#include <cstdio>
+#include <cstring>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/math/src/pairing-internal.h"
+#include "epid/common/src/epid2params.h"
+}
+
+Epid20Params::Epid20Params() {
+ // construct Fp finite field
+ fp = FiniteFieldObj(p_str_);
+
+ // construct Fq finite field
+ fq = FiniteFieldObj(q_str_);
+
+ // construct Fq^2 finite field
+ FfElementObj neg_beta(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, beta_str_), neg_beta));
+ fq2 = FiniteFieldObj(fq, neg_beta, 2);
+
+ // construct Fq^6 finite field
+ FfElementObj neg_xi(&fq2);
+ THROW_ON_EPIDERR(FfNeg(fq2, FfElementObj(&fq2, xi_str_), neg_xi));
+ fq6 = FiniteFieldObj(fq2, neg_xi, 3);
+
+ // construct Fq^12 finite field
+ FfElementObj neg_v(&fq6);
+ THROW_ON_EPIDERR(FfNeg(fq6, FfElementObj(&fq6, v_str_), neg_v));
+ GT = FiniteFieldObj(fq6, neg_v, 2);
+
+ const BigNumStr h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+
+ // Create G1
+ // G1 is an elliptic curve group E(Fq).It can be initialized as follows :
+ // Set G1 = E(Fq).init(p, q, n = p, h = 1, a = 0, b, g1.x, g1.y).
+ G1 = EcGroupObj(&fq, FfElementObj(&fq), FfElementObj(&fq, b_str_),
+ FfElementObj(&fq, g1_str_.x), FfElementObj(&fq, g1_str_.y),
+ BigNumObj(p_str_), BigNumObj(h1));
+
+ // set h = 2q - p, aka cofactor
+ std::vector<uint8_t> cofactor_str(
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xcd, 0x46, 0xe5, 0xf2, 0x5e,
+ 0xee, 0x71, 0xa4, 0xa0, 0x0c, 0xdc, 0x65, 0xfb, 0x12, 0x96, 0x82,
+ 0xea, 0xb0, 0x25, 0x08, 0x4a, 0x8c, 0x9b, 0x10, 0x19});
+ // set n = p * h, AKA order
+ std::vector<uint8_t> order_str(
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe1, 0x9a, 0x8d, 0xcb, 0xe4,
+ 0xc7, 0x38, 0xfa, 0x9b, 0x98, 0x4d, 0x1c, 0x12, 0x9f, 0x64, 0x97,
+ 0xe8, 0x54, 0xa3, 0x0a, 0x81, 0xac, 0x42, 0xf9, 0x39, 0x16, 0xa7,
+ 0x70, 0x21, 0xdc, 0xfb, 0xb6, 0xe7, 0x7e, 0x1f, 0x5b, 0x55, 0xcc,
+ 0x4e, 0x84, 0xcd, 0x19, 0x4f, 0x49, 0x20, 0x94, 0xb5, 0xd8, 0x12,
+ 0xa0, 0x2e, 0x7f, 0x40, 0x13, 0xb2, 0xfa, 0xa1, 0x45});
+
+ // Compute xi' = Fq2.inverse(xi).
+ FfElementObj inv_xi(&fq2);
+ THROW_ON_EPIDERR(FfInv(fq2, FfElementObj(&fq2, xi_str_), inv_xi));
+ // Compute b' = Fq2.mul(xi', b).
+ FfElementObj b_dash(&fq2);
+ THROW_ON_EPIDERR(FfMul(fq2, inv_xi.get(), FfElementObj(&fq, b_str_), b_dash));
+
+ // Set G2 = E(Fq2).init(p, param(Fq2), n, h, 0, b', g2.x, g2.y)
+ G2 = EcGroupObj(&fq2, FfElementObj(&fq2), b_dash,
+ FfElementObj(&fq2, &g2_str_.x, sizeof(g2_str_.x)),
+ FfElementObj(&fq2, &g2_str_.y, sizeof(g2_str_.y)),
+ BigNumObj(order_str), BigNumObj(cofactor_str));
+}
+
+const BigNumStr Epid20Params::q_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}}};
+const FqElemStr Epid20Params::beta_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}}};
+const Fq6ElemStr Epid20Params::v_str_ = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+
+const BigNumStr Epid20Params::p_str_ = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+const FqElemStr Epid20Params::b_str_ = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}};
+const FqElemStr Epid20Params::h_str_ = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+const G1ElemStr Epid20Params::g1_str_ = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+const Fq2ElemStr Epid20Params::xi_str_ = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}}};
+const G2ElemStr Epid20Params::g2_str_ = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
diff --git a/epid/common-testhelper/epid_params-testhelper.h b/epid/common-testhelper/epid_params-testhelper.h
new file mode 100644
index 0000000..5ed7631
--- /dev/null
+++ b/epid/common-testhelper/epid_params-testhelper.h
@@ -0,0 +1,75 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 2.0 parameters C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_EPID_PARAMS_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_EPID_PARAMS_TESTHELPER_H_
+
+#include <memory>
+#include "epid/common/types.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+}
+
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+typedef struct Epid2Params_ Epid2Params_;
+
+class Epid20Params {
+ public:
+ Epid20Params();
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ Epid20Params(const Epid20Params&) = delete;
+ Epid20Params& operator=(const Epid20Params&) = delete;
+
+ virtual ~Epid20Params() {}
+
+ FiniteFieldObj GT;
+ EcGroupObj G1;
+ EcGroupObj G2;
+ FiniteFieldObj fq;
+ FiniteFieldObj fp;
+
+ private:
+ static const BigNumStr q_str_;
+ static const FqElemStr beta_str_;
+ static const Fq6ElemStr v_str_;
+
+ static const BigNumStr p_str_;
+ static const FqElemStr b_str_;
+ static const FqElemStr h_str_;
+ static const G1ElemStr g1_str_;
+
+ static const Fq2ElemStr xi_str_;
+ static const G2ElemStr g2_str_;
+
+ FiniteFieldObj fq2;
+ FiniteFieldObj fq6;
+};
+
+#endif // EPID_COMMON_TESTHELPER_EPID_PARAMS_TESTHELPER_H_
diff --git a/epid/common-testhelper/errors-testhelper.h b/epid/common-testhelper/errors-testhelper.h
new file mode 100644
index 0000000..9950f26
--- /dev/null
+++ b/epid/common-testhelper/errors-testhelper.h
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Error handling C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_ERRORS_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_ERRORS_TESTHELPER_H_
+
+#include <cstdio>
+#include <initializer_list>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+}
+
+/// Macro used to indicate fatal error during unit test run
+#define THROW_ON_EPIDERR(actual) \
+ if (kEpidNoErr != actual) { \
+ printf("%s(%d): error: %s\n", __FILE__, __LINE__, "test defect"); \
+ throw std::logic_error(std::string("Failed to call: ") + #actual); \
+ }
+
+/// Macro used to indicate fatal error during unit test run
+#define THROW_NE(expected, actual) \
+ if (expected != actual) { \
+ printf("%s(%d): error: %s\n", __FILE__, __LINE__, "test defect"); \
+ throw std::logic_error(std::string("Failed to call: ") + #actual); \
+ }
+
+#endif // EPID_COMMON_TESTHELPER_ERRORS_TESTHELPER_H_
diff --git a/epid/common-testhelper/ffelement_wrapper-testhelper.cc b/epid/common-testhelper/ffelement_wrapper-testhelper.cc
new file mode 100644
index 0000000..fcebe50
--- /dev/null
+++ b/epid/common-testhelper/ffelement_wrapper-testhelper.cc
@@ -0,0 +1,146 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FfElement C++ wrapper implementation.
+ */
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common/math/bignum.h"
+
+/// ffelement deleter type
+struct FfElementDeleter {
+ /// ffelement deleter
+ void operator()(FfElement* ffe) {
+ if (ffe) {
+ DeleteFfElement(&ffe);
+ }
+ }
+};
+
+/// ffelement deleter singlton
+FfElementDeleter ff_element_deleter;
+
+/// Internal state of the ffelement wrapper
+struct FfElementObj::State {
+ /// The containing field
+ FiniteFieldObj ff_;
+ /// size of the element data
+ size_t size;
+ /// The stored FfElement
+ std::shared_ptr<FfElement> ffe_;
+
+ State() : ff_(), size(0), ffe_() {}
+ /// write a new value
+ void write(FiniteFieldObj* ff, unsigned char const* buf, size_t buflen) {
+ ff_ = *ff;
+ bool orig_has_data = (buf != nullptr) && (buflen > 0);
+ std::shared_ptr<FfElement> ffe;
+ FfElement* ffe_ptr;
+ THROW_ON_EPIDERR(NewFfElement(ff_, &ffe_ptr));
+ ffe.reset(ffe_ptr, ff_element_deleter);
+ size = buflen;
+ if (orig_has_data) {
+ THROW_ON_EPIDERR(ReadFfElement(ff_, buf, buflen, ffe.get()));
+ }
+ ffe_ = ffe;
+ }
+};
+
+FfElementObj::FfElementObj() : state_(new State) {}
+
+FfElementObj::FfElementObj(FfElementObj const& other) : state_(new State) {
+ std::vector<unsigned char> buf = other.data();
+ state_->write(&other.state_->ff_, &buf[0], buf.size());
+}
+
+FfElementObj& FfElementObj::operator=(FfElementObj const& other) {
+ std::vector<unsigned char> buf = other.data();
+ state_->write(&other.state_->ff_, &buf[0], buf.size());
+ return *this;
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff) : state_(new State) {
+ state_->write(ff, nullptr, 0);
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, FpElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, FqElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, Fq2ElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, Fq3ElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, Fq6ElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, Fq12ElemStr const& bytes)
+ : state_(new State) {
+ init(ff, (unsigned char*)&bytes, sizeof(bytes));
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff,
+ std::vector<unsigned char> const& bytes)
+ : state_(new State) {
+ init(ff, &bytes[0], bytes.size());
+}
+
+FfElementObj::FfElementObj(FiniteFieldObj* ff, void const* bytes, size_t size)
+ : state_(new State) {
+ init(ff, (unsigned char const*)bytes, size);
+}
+
+void FfElementObj::init(FiniteFieldObj* ff, unsigned char const* bytes,
+ size_t size) {
+ state_->write(ff, bytes, size);
+}
+
+FfElementObj::~FfElementObj() {}
+
+FfElementObj::operator FfElement*() { return state_->ffe_.get(); }
+
+FfElementObj::operator const FfElement*() const { return state_->ffe_.get(); }
+
+FfElement* FfElementObj::get() { return state_->ffe_.get(); }
+
+FfElement const* FfElementObj::getc() const { return state_->ffe_.get(); }
+
+std::vector<unsigned char> FfElementObj::data() const {
+ std::vector<unsigned char> buf;
+ if (state_->ffe_.get() != nullptr) {
+ buf.resize(state_->ff_.GetElementMaxSize());
+ THROW_ON_EPIDERR(
+ WriteFfElement(state_->ff_, state_->ffe_.get(), &buf[0], buf.size()));
+ }
+ return buf;
+}
diff --git a/epid/common-testhelper/ffelement_wrapper-testhelper.h b/epid/common-testhelper/ffelement_wrapper-testhelper.h
new file mode 100644
index 0000000..c86a68a
--- /dev/null
+++ b/epid/common-testhelper/ffelement_wrapper-testhelper.h
@@ -0,0 +1,84 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FfElement C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_FFELEMENT_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_FFELEMENT_WRAPPER_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/finitefield.h"
+}
+
+class FiniteFieldObj;
+
+/*!
+Wrapper class to provide Resource Allocation is Initialization handling
+for FfElement
+*/
+class FfElementObj {
+ public:
+ /// constructor
+ FfElementObj();
+ /// copy constructor
+ FfElementObj(FfElementObj const& other);
+ /// assignment operator
+ FfElementObj& operator=(FfElementObj const& other);
+ /// Create a FfElement
+ explicit FfElementObj(FiniteFieldObj* ff);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, FpElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, FqElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, Fq2ElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, Fq3ElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, Fq6ElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, Fq12ElemStr const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, std::vector<unsigned char> const& bytes);
+ /// Create a FfElement
+ FfElementObj(FiniteFieldObj* ff, void const* bytes, size_t size);
+ /// Destroy the FfElement
+ ~FfElementObj();
+ /// cast operator to get the pointer to the stored FfElement
+ operator FfElement*();
+ /// const cast operator to get the pointer to the stored FfElement
+ operator const FfElement*() const;
+ /// Get the underlying pointer
+ FfElement* get();
+ /// Get the underlying pointer
+ FfElement const* getc() const;
+ /// Get element bytes
+ std::vector<unsigned char> data() const;
+
+ private:
+ void init(FiniteFieldObj* ff, unsigned char const* bytes, size_t size);
+ struct State;
+ std::unique_ptr<State> state_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_FFELEMENT_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/finite_field_wrapper-testhelper.cc b/epid/common-testhelper/finite_field_wrapper-testhelper.cc
new file mode 100644
index 0000000..8a70446
--- /dev/null
+++ b/epid/common-testhelper/finite_field_wrapper-testhelper.cc
@@ -0,0 +1,173 @@
+/*############################################################################
+ # Copyright 2016-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FiniteField C++ wrapper implementation.
+ */
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common/math/bignum.h"
+
+/// finite field deleter type
+struct FiniteFieldDeleter {
+ /// finite field deleter
+ void operator()(FiniteField* ff) {
+ if (ff) {
+ DeleteFiniteField(&ff);
+ }
+ }
+};
+
+/// finite field deleter singlton
+FiniteFieldDeleter finite_field_deleter;
+
+/// Internal state of the finite field wrapper
+struct FiniteFieldObj::State {
+ /// Inner state of complex fields
+ struct InnerState {
+ /// The ground field
+ FiniteFieldObj gf_;
+ };
+ /// Inner state
+ /*!
+ We store a pointer to InnerState so simple fields
+ that are not composed from other fields do not result
+ in an infinite series of fields.
+
+ Instead simple fields have a NULL inner_state and
+ complex fields have it set.
+ */
+ InnerState* inner_state;
+
+ /// The stored FiniteField
+ std::shared_ptr<FiniteField> ff_;
+
+ /// Maximum size of field element
+ size_t size_;
+
+ /// constructor
+ State() : ff_(nullptr, finite_field_deleter), size_(0) {
+ inner_state = nullptr;
+ }
+
+ // State instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ State(const State&) = delete;
+ State& operator=(const State&) = delete;
+
+ /// destructor
+ ~State() {
+ if (inner_state) {
+ delete inner_state;
+ inner_state = nullptr;
+ }
+ }
+
+ /// setter for inner_state
+ void SetInnerState(FiniteFieldObj const& gf) {
+ if (!inner_state) {
+ inner_state = new InnerState;
+ inner_state->gf_ = gf;
+ }
+ }
+
+ /// setter for inner_state
+ void SetInnerState(InnerState* state) {
+ if (state) {
+ if (!inner_state) {
+ inner_state = new InnerState;
+ }
+ if (!inner_state) {
+ inner_state->gf_ = state->gf_;
+ }
+ } else {
+ if (inner_state) {
+ delete inner_state;
+ inner_state = nullptr;
+ }
+ }
+ }
+};
+
+FiniteFieldObj::FiniteFieldObj() : state_(new State()) {
+ const BigNumStr max_prime = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x43};
+ FiniteField* temp = nullptr;
+ NewFiniteField(&max_prime, &temp);
+ state_->ff_.reset(temp, finite_field_deleter);
+ state_->size_ = sizeof(max_prime);
+}
+
+FiniteFieldObj::FiniteFieldObj(FiniteFieldObj const& other)
+ : state_(new State) {
+ state_->ff_ = other.state_->ff_;
+ state_->size_ = other.state_->size_;
+ state_->SetInnerState(other.state_->inner_state);
+}
+
+FiniteFieldObj& FiniteFieldObj::operator=(FiniteFieldObj const& other) {
+ state_->ff_ = other.state_->ff_;
+ state_->size_ = other.state_->size_;
+ state_->SetInnerState(other.state_->inner_state);
+ return *this;
+}
+
+FiniteFieldObj::FiniteFieldObj(BigNumStr const& prime) : state_(new State) {
+ FiniteField* temp = nullptr;
+ NewFiniteField(&prime, &temp);
+ state_->ff_.reset(temp, finite_field_deleter);
+ state_->size_ = sizeof(prime);
+}
+
+FiniteFieldObj::FiniteFieldObj(FiniteFieldObj const& ground_field,
+ FfElementObj const& ground_element, int degree)
+ : state_(new State) {
+ FiniteField* temp = nullptr;
+ state_->SetInnerState(ground_field);
+ NewFiniteFieldViaBinomalExtension(ground_field, ground_element, degree,
+ &temp);
+ state_->ff_.reset(temp, finite_field_deleter);
+ state_->size_ = ground_field.GetElementMaxSize() * degree;
+}
+
+FiniteFieldObj::FiniteFieldObj(FiniteFieldObj const& ground_field,
+ BigNumStr const* irr_polynomial, int degree)
+ : state_(new State) {
+ FiniteField* temp = nullptr;
+ state_->SetInnerState(ground_field);
+ NewFiniteFieldViaPolynomialExtension(ground_field, irr_polynomial, degree,
+ &temp);
+ state_->ff_.reset(temp, finite_field_deleter);
+ state_->size_ = ground_field.GetElementMaxSize() * degree;
+}
+
+FiniteFieldObj::~FiniteFieldObj() {}
+
+FiniteFieldObj::operator FiniteField*() { return state_->ff_.get(); }
+
+FiniteFieldObj::operator const FiniteField*() const {
+ return state_->ff_.get();
+}
+
+FiniteField* FiniteFieldObj::get() { return state_->ff_.get(); }
+
+FiniteField const* FiniteFieldObj::getc() const { return state_->ff_.get(); }
+
+size_t FiniteFieldObj::GetElementMaxSize() const { return state_->size_; }
diff --git a/epid/common-testhelper/finite_field_wrapper-testhelper.h b/epid/common-testhelper/finite_field_wrapper-testhelper.h
new file mode 100644
index 0000000..ceebc4c
--- /dev/null
+++ b/epid/common-testhelper/finite_field_wrapper-testhelper.h
@@ -0,0 +1,71 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FiniteField C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_FINITE_FIELD_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_FINITE_FIELD_WRAPPER_TESTHELPER_H_
+
+#include <memory>
+#include <vector>
+
+extern "C" {
+#include "epid/common/math/finitefield.h"
+}
+
+class FfElementObj;
+
+/*!
+Wrapper class to provide Resource Allocation is Initialization handling
+for FiniteField
+*/
+class FiniteFieldObj {
+ public:
+ /// constructor
+ FiniteFieldObj();
+ /// copy constructor
+ FiniteFieldObj(FiniteFieldObj const& other);
+ /// assignment operator
+ FiniteFieldObj& operator=(FiniteFieldObj const& other);
+ /// Create a FiniteField
+ explicit FiniteFieldObj(BigNumStr const& prime);
+ /// Create a FiniteField
+ FiniteFieldObj(FiniteFieldObj const& ground_field,
+ FfElementObj const& ground_element, int degree);
+ /// Create a FiniteField
+ FiniteFieldObj(FiniteFieldObj const& ground_field,
+ BigNumStr const* irr_polynomial, int degree);
+ /// Destroy the FiniteField
+ ~FiniteFieldObj();
+ /// cast operator to get the pointer to the stored FiniteField
+ operator FiniteField*();
+ /// const cast operator to get the pointer to the stored FiniteField
+ operator const FiniteField*() const;
+ /// Get the underlying pointer
+ FiniteField* get();
+ /// Get the underlying pointer
+ FiniteField const* getc() const;
+ /// Get maximum size of field element
+ size_t GetElementMaxSize() const;
+
+ private:
+ struct State;
+ std::unique_ptr<State> state_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_FINITE_FIELD_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/mem_params-testhelper.cc b/epid/common-testhelper/mem_params-testhelper.cc
new file mode 100644
index 0000000..621b691
--- /dev/null
+++ b/epid/common-testhelper/mem_params-testhelper.cc
@@ -0,0 +1,35 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Implementation of Intel(R) EPID specific predicates for Set MemParams
+ * strcuture
+ */
+#include "epid/common-testhelper/mem_params-testhelper.h"
+
+void SetMemberParams(BitSupplier rnd_func, void* rnd_param, const FpElemStr* f,
+ MemberParams* params) {
+#ifdef TPM_TSS
+ (void)rnd_func;
+ (void)rnd_param;
+ params->f = f;
+#else
+ params->rnd_func = rnd_func;
+ params->rnd_param = rnd_param;
+ params->f = f;
+#endif
+}
diff --git a/epid/common-testhelper/mem_params-testhelper.h b/epid/common-testhelper/mem_params-testhelper.h
new file mode 100644
index 0000000..48277ae
--- /dev/null
+++ b/epid/common-testhelper/mem_params-testhelper.h
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 2.0 parameters C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_MEM_PARAMS_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_MEM_PARAMS_TESTHELPER_H_
+
+extern "C" {
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+#ifdef TPM_TSS
+#include "epid/member/tpm_member.h"
+#else
+#include "epid/member/software_member.h"
+#endif
+}
+/// Implementation specific configuration parameters.
+typedef struct MemberParams MemberParams;
+
+/// Set MemmberParams structure
+/*!
+
+MemberParams had different structure between TPM_TSS build
+and non TPM_TSS build
+
+\returns ::void
+
+*/
+void SetMemberParams(BitSupplier rnd_func, void* rnd_param, const FpElemStr* f,
+ MemberParams* params);
+
+#endif // EPID_COMMON_TESTHELPER_MEM_PARAMS_TESTHELPER_H_
diff --git a/epid/common-testhelper/member_wrapper-testhelper.cc b/epid/common-testhelper/member_wrapper-testhelper.cc
new file mode 100644
index 0000000..7dfcefe
--- /dev/null
+++ b/epid/common-testhelper/member_wrapper-testhelper.cc
@@ -0,0 +1,290 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member C++ wrapper implementation.
+ */
+
+#include "epid/common-testhelper/member_wrapper-testhelper.h"
+
+#include <stdint.h>
+#include <cstdio>
+#include <cstring>
+#include <new>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+extern "C" {
+#include "epid/common/types.h"
+}
+
+#include "epid/common-testhelper/mem_params-testhelper.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ BitSupplier rnd_func, void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, &priv_key.f, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, nullptr);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key,
+ MembershipCredential const& cred,
+ BitSupplier rnd_func, void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, nullptr, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidProvisionCredential(ctx_, &pub_key, &cred, nullptr);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ HashAlg hash_alg, BitSupplier rnd_func,
+ void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, &priv_key.f, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidMemberSetHashAlg(ctx_, hash_alg);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberSetHashAlg()");
+ }
+ sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, nullptr);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(BitSupplier rnd_func, void* rnd_param)
+ : ctx_(nullptr) {
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, nullptr, &params);
+ ctx_ = CreateMember(&params);
+}
+
+MemberCtxObj::MemberCtxObj(MemberParams const* params) : ctx_(nullptr) {
+ ctx_ = CreateMember(params);
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ MemberPrecomp const& precomp, BitSupplier rnd_func,
+ void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, &priv_key.f, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, &precomp);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ HashAlg hash_alg, MemberPrecomp const& precomp,
+ BitSupplier rnd_func, void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, &priv_key.f, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidMemberSetHashAlg(ctx_, hash_alg);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, &precomp);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key,
+ MembershipCredential const& cred,
+ MemberPrecomp const& precomp, BitSupplier rnd_func,
+ void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, nullptr, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidProvisionCredential(ctx_, &pub_key, &cred, &precomp);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionCredential()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key,
+ MembershipCredential const& cred, HashAlg hash_alg,
+ BitSupplier rnd_func, void* rnd_param)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidErr;
+ MemberParams params = {0};
+ SetMemberParams(rnd_func, rnd_param, nullptr, &params);
+ ctx_ = CreateMember(&params);
+ sts = EpidMemberSetHashAlg(ctx_, hash_alg);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionKey()");
+ }
+ sts = EpidProvisionCredential(ctx_, &pub_key, &cred, nullptr);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidProvisionCredential()");
+ }
+ sts = EpidMemberStartup(ctx_);
+ if (kEpidNoErr != sts) {
+ DeleteMember(&ctx_);
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberStartup()");
+ }
+}
+
+MemberCtxObj::~MemberCtxObj() { DeleteMember(&ctx_); }
+
+MemberCtx* MemberCtxObj::ctx() const { return ctx_; }
+
+MemberCtxObj::operator MemberCtx*() const { return ctx_; }
+
+MemberCtxObj::operator const MemberCtx*() const { return ctx_; }
+
+MemberCtx* MemberCtxObj::CreateMember(MemberParams const* params) const {
+ size_t context_size = 0;
+ EpidStatus sts = kEpidErr;
+ MemberCtx* member_ctx = NULL;
+
+ sts = EpidMemberGetSize(params, &context_size);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberGetSize()");
+ }
+
+ // allocate and zero initialize, no throw on failure
+ member_ctx = (MemberCtx*)new (std::nothrow) uint8_t[context_size]();
+ if (!member_ctx) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ std::ostringstream err;
+ err << "Failed to allocate " << context_size
+ << "bytes after EpidMemberGetSize()";
+ throw std::logic_error(err.str());
+ }
+
+ sts = EpidMemberInit(params, member_ctx);
+ if (kEpidNoErr != sts) {
+ delete[](uint8_t*) member_ctx;
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidMemberInit()");
+ }
+ return member_ctx;
+}
+
+void MemberCtxObj::DeleteMember(MemberCtx** ctx) const {
+ if (ctx) {
+ EpidMemberDeinit(*ctx);
+ delete[](uint8_t*)(*ctx);
+ *ctx = NULL;
+ }
+}
diff --git a/epid/common-testhelper/member_wrapper-testhelper.h b/epid/common-testhelper/member_wrapper-testhelper.h
new file mode 100644
index 0000000..d25f196
--- /dev/null
+++ b/epid/common-testhelper/member_wrapper-testhelper.h
@@ -0,0 +1,84 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_MEMBER_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_MEMBER_WRAPPER_TESTHELPER_H_
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+/// C++ Wrapper to manage memory for MemberCtx via RAII
+class MemberCtxObj {
+ public:
+ /// Create a MemberCtx
+ explicit MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ BitSupplier rnd_func, void* rnd_param);
+ /// Create a MemberCtx
+ explicit MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ HashAlg hash_alg, BitSupplier rnd_func,
+ void* rnd_param);
+ /// Create a MemberCtx
+ explicit MemberCtxObj(BitSupplier rnd_func, void* rnd_param);
+ /// Create a MemberCtx
+ explicit MemberCtxObj(MemberParams const* params);
+ /// Create a MemberCtx
+ explicit MemberCtxObj(GroupPubKey const& pub_key,
+ MembershipCredential const& cred, BitSupplier rnd_func,
+ void* rnd_param);
+ /// Create a MemberCtx given precomputation blob
+ MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ MemberPrecomp const& precomp, BitSupplier rnd_func,
+ void* rnd_param);
+ /// Create a MemberCtx given precomputation blob
+ MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key,
+ HashAlg hash_alg, MemberPrecomp const& precomp,
+ BitSupplier rnd_func, void* rnd_param);
+ /// Create a MemberCtx given precomputation blob
+ MemberCtxObj(GroupPubKey const& pub_key, MembershipCredential const& cred,
+ MemberPrecomp const& precomp, BitSupplier rnd_func,
+ void* rnd_param);
+ /// Create a MemberCtx given precomputation blob
+ MemberCtxObj(GroupPubKey const& pub_key, MembershipCredential const& cred,
+ HashAlg hash_alg, BitSupplier rnd_func, void* rnd_param);
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ MemberCtxObj(const MemberCtxObj&) = delete;
+ MemberCtxObj& operator=(const MemberCtxObj&) = delete;
+
+ /// Destroy the MemberCtx
+ ~MemberCtxObj();
+ /// get a pointer to the stored MemberCtx
+ MemberCtx* ctx() const;
+ /// cast operator to get the pointer to the stored MemberCtx
+ operator MemberCtx*() const;
+ /// const cast operator to get the pointer to the stored MemberCtx
+ operator const MemberCtx*() const;
+
+ private:
+ /// Creates and initializes new member given parameters.
+ MemberCtx* CreateMember(MemberParams const* params) const;
+ /// Deletes the member created by CreateMember().
+ void DeleteMember(MemberCtx** ctx) const;
+ /// The stored MemberCtx
+ MemberCtx* ctx_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_MEMBER_WRAPPER_TESTHELPER_H_
diff --git a/epid/common-testhelper/octstr-testhelper.cc b/epid/common-testhelper/octstr-testhelper.cc
new file mode 100644
index 0000000..18e9fff
--- /dev/null
+++ b/epid/common-testhelper/octstr-testhelper.cc
@@ -0,0 +1,129 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief OctString handling utility implementation.
+ */
+#include "epid/common-testhelper/octstr-testhelper.h"
+extern "C" {
+#include "epid/common/src/memory.h"
+}
+#include "epid/common/types.h"
+#include "ext/ipp/include/ippcp.h"
+
+typedef Ipp8u* IppOctStr;
+
+/// Internal function to delete BigNum
+void delete_BigNum(IppsBigNumState** bn) {
+ if (*bn) {
+ SAFE_FREE(*bn);
+ }
+}
+/// Internal function to create BigNum from an OctStr256
+EpidStatus create_BigNum(IppsBigNumState** bn, const OctStr256* str) {
+ EpidStatus result = kEpidErr;
+ IppsBigNumState* ipp_bn_ctx = nullptr;
+ do {
+ IppStatus sts = ippStsNoErr;
+ unsigned int byte_size = sizeof(OctStr256);
+ unsigned int word_size =
+ (unsigned int)((byte_size + sizeof(Ipp32u) - 1) / sizeof(Ipp32u));
+ int bignum_ctx_size = 0;
+
+ if (!bn || !str) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsBigNumGetSize(word_size, &bignum_ctx_size);
+ if (ippStsNoErr != sts) {
+ if (ippStsLengthErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ // Allocate space for ipp bignum context
+ ipp_bn_ctx = (IppsBigNumState*)SAFE_ALLOC(bignum_ctx_size);
+ if (!ipp_bn_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Initialize ipp bignum context
+ sts = ippsBigNumInit(word_size, ipp_bn_ctx);
+ if (sts != ippStsNoErr) {
+ if (sts == ippStsLengthErr) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ sts = ippsSetOctString_BN((IppOctStr)str, byte_size, ipp_bn_ctx);
+ if (sts != ippStsNoErr) {
+ if (sts == ippStsLengthErr) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ *bn = ipp_bn_ctx;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (result != kEpidNoErr) {
+ SAFE_FREE(ipp_bn_ctx);
+ }
+ return result;
+}
+
+EpidStatus Cmp_OctStr256(const OctStr256* pA, const OctStr256* pB,
+ unsigned int* pResult) {
+ EpidStatus result = kEpidErr;
+ IppsBigNumState* ipp_a_ctx = nullptr;
+ IppsBigNumState* ipp_b_ctx = nullptr;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ if (!pA || !pB || !pResult) {
+ return kEpidBadArgErr;
+ }
+ result = create_BigNum(&ipp_a_ctx, pA);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = create_BigNum(&ipp_b_ctx, pB);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ sts = ippsCmp_BN(ipp_a_ctx, ipp_b_ctx, pResult);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts || ippStsOutOfRangeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ }
+ } while (0);
+
+ delete_BigNum(&ipp_a_ctx);
+ delete_BigNum(&ipp_b_ctx);
+ return result;
+}
diff --git a/epid/common-testhelper/octstr-testhelper.h b/epid/common-testhelper/octstr-testhelper.h
new file mode 100644
index 0000000..1d60062
--- /dev/null
+++ b/epid/common-testhelper/octstr-testhelper.h
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief OctString handling utility interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_OCTSTR_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_OCTSTR_TESTHELPER_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// Compares 2 OctStr256
+/*!
+
+if A==B, then pResult = 0
+if A > B, then pResult = 1
+if A < B, then pResult = 2
+
+\param[in] pA
+OctStr256 A
+\param[in] pB
+OctStr256 B
+\param[out] pResult
+Comparison Result
+
+\returns ::EpidStatus
+
+*/
+EpidStatus Cmp_OctStr256(const OctStr256* pA, const OctStr256* pB,
+ unsigned int* pResult);
+
+#endif // EPID_COMMON_TESTHELPER_OCTSTR_TESTHELPER_H_
diff --git a/epid/common-testhelper/prng-testhelper.h b/epid/common-testhelper/prng-testhelper.h
new file mode 100644
index 0000000..8eaae83
--- /dev/null
+++ b/epid/common-testhelper/prng-testhelper.h
@@ -0,0 +1,116 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pseudo random number generator interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_PRNG_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_PRNG_TESTHELPER_H_
+
+#if defined(_WIN32) || defined(_WIN64)
+#define __STDCALL __stdcall
+#else
+#define __STDCALL
+#endif
+#include <limits.h> // for CHAR_BIT
+#include <stdint.h>
+#include <random>
+#include <vector>
+
+extern "C" {
+#include "epid/common/types.h"
+}
+
+/// Return status for Prng Generate function
+typedef enum {
+ kPrngNoErr = 0, //!< no error
+ kPrngErr = -999, //!< unspecified error
+ kPrngNotImpl, //!< not implemented error
+ kPrngBadArgErr //!< incorrect arg to function
+} PrngStatus;
+
+/// Pseudo random number generator (prng) class.
+class Prng {
+ public:
+ Prng() : seed_(1) { set_seed(seed_); }
+ ~Prng() {}
+ /// Retrieve seed
+ unsigned int get_seed() const { return seed_; }
+ /// Set seed for random number generator
+ void set_seed(unsigned int val) {
+ seed_ = val;
+ generator_.seed(seed_);
+ }
+ /// Generates random number
+ static int __STDCALL Generate(unsigned int* random_data, int num_bits,
+ void* user_data) {
+ unsigned int num_bytes = num_bits / CHAR_BIT;
+
+ unsigned int extra_bits = num_bits % CHAR_BIT;
+ unsigned char* random_bytes = reinterpret_cast<unsigned char*>(random_data);
+ if (!random_data) {
+ return kPrngBadArgErr;
+ }
+ if (num_bits <= 0) {
+ return kPrngBadArgErr;
+ }
+ if (0 != extra_bits) {
+ num_bytes += 1;
+ }
+
+ Prng* myprng = (Prng*)user_data;
+ for (unsigned int n = 0; n < num_bytes; n++) {
+ random_bytes[n] =
+ static_cast<unsigned char>(myprng->generator_() & 0x000000ff);
+ }
+
+ return kPrngNoErr;
+ }
+
+ private:
+ unsigned int seed_;
+ std::mt19937 generator_;
+};
+
+// BitSupplier implementation returns pre-defined bytes.
+class StaticPrng {
+ public:
+ StaticPrng(ConstOctStr bytes, size_t length)
+ : bytes_((uint8_t const*)bytes, (uint8_t const*)bytes + length) {}
+ ~StaticPrng() {}
+ /// Generates random number
+ static int __STDCALL Generate(unsigned int* random_data, int num_bits,
+ void* user_data) {
+ unsigned int num_bytes = num_bits / CHAR_BIT;
+ if (!random_data) {
+ return kPrngBadArgErr;
+ }
+ if (num_bits <= 0) {
+ return kPrngBadArgErr;
+ }
+ StaticPrng* myprng = (StaticPrng*)user_data;
+ for (size_t i = 0; i < num_bytes; i++) {
+ random_data[i] = myprng->bytes_[i % myprng->bytes_.size()];
+ }
+ return kPrngNoErr;
+ }
+
+ private:
+ std::vector<uint8_t> bytes_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_PRNG_TESTHELPER_H_
diff --git a/epid/common-testhelper/testapp-testhelper.cc b/epid/common-testhelper/testapp-testhelper.cc
new file mode 100644
index 0000000..7fde385
--- /dev/null
+++ b/epid/common-testhelper/testapp-testhelper.cc
@@ -0,0 +1,74 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Main entry point helpers unit tests.
+*/
+#include "epid/common-testhelper/testapp-testhelper.h"
+#include <sstream>
+#include <string>
+#include <vector>
+
+void split_filter(std::vector<std::string>* positive,
+ std::vector<std::string>* negative, std::string filter_expr) {
+ std::istringstream f(filter_expr);
+ std::string s;
+ bool is_neg = false;
+ while (getline(f, s, ':')) {
+ if (!is_neg) {
+ if (s.compare(0, 1, "-") == 0) {
+ is_neg = true;
+ s = s.substr(1);
+ } else {
+ positive->push_back(s);
+ }
+ }
+ if (is_neg) {
+ negative->push_back(s);
+ }
+ }
+}
+
+std::string join_filter(std::vector<std::string> const& positive,
+ std::vector<std::string> const& negative) {
+ std::ostringstream s;
+ bool first = true;
+ bool first_neg = true;
+ if (!positive.empty() || !negative.empty()) {
+ s << "--gtest_filter=";
+ }
+ for (const auto& i : positive) {
+ if (!first) {
+ s << ":";
+ } else {
+ first = false;
+ }
+ s << i;
+ }
+ for (const auto& i : negative) {
+ if (!first) {
+ s << ":";
+ } else {
+ first = false;
+ }
+ if (first_neg) {
+ s << "-";
+ first_neg = false;
+ }
+ s << i;
+ }
+ return s.str();
+}
diff --git a/epid/common-testhelper/testapp-testhelper.h b/epid/common-testhelper/testapp-testhelper.h
new file mode 100644
index 0000000..4c33768
--- /dev/null
+++ b/epid/common-testhelper/testapp-testhelper.h
@@ -0,0 +1,33 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*!
+* \file
+* \brief Main entry point helpers unit tests.
+*/
+
+#ifndef EPID_COMMON_TESTHELPER_TESTAPP_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_TESTAPP_TESTHELPER_H_
+
+#include <string>
+#include <vector>
+
+void split_filter(std::vector<std::string>* positive,
+ std::vector<std::string>* negative, std::string filter_expr);
+
+std::string join_filter(std::vector<std::string> const& positive,
+ std::vector<std::string> const& negative);
+
+#endif // EPID_COMMON_TESTHELPER_TESTAPP_TESTHELPER_H_
diff --git a/epid/common-testhelper/testdata/grp01/gpubkey.inc b/epid/common-testhelper/testdata/grp01/gpubkey.inc
new file mode 100644
index 0000000..0ed0ded
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/gpubkey.inc
@@ -0,0 +1,53 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+// gpubkey
+0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
+
+0x89, 0x33, 0xA7, 0x86, 0xD7, 0x71, 0xCC, 0x80,
+0x46, 0x4B, 0x42, 0xC3, 0xE7, 0xBA, 0x1A, 0x54,
+0x85, 0x8A, 0x21, 0x8E, 0x29, 0x91, 0xA9, 0x60,
+0x41, 0xF9, 0xA5, 0xD9, 0x7B, 0x5F, 0x54, 0x49,
+0x2A, 0x89, 0x8C, 0x10, 0x0E, 0x26, 0x0D, 0xE8,
+0x36, 0x6A, 0x9E, 0x6F, 0x79, 0xFF, 0xF1, 0xCD,
+0xA7, 0xCD, 0xAC, 0x1F, 0x92, 0x33, 0x3A, 0xD9,
+0x7C, 0xF5, 0xCD, 0x38, 0x48, 0x01, 0x4F, 0xC5,
+0x6F, 0xEA, 0x50, 0x60, 0x59, 0x09, 0xDA, 0x44,
+0x21, 0xC2, 0xD0, 0x86, 0xE6, 0x00, 0x63, 0x59,
+0xA9, 0xFB, 0x35, 0x13, 0x4E, 0x13, 0xB1, 0x47,
+0x36, 0xD7, 0xBD, 0xF6, 0x0A, 0x35, 0x74, 0x7D,
+0x36, 0xC5, 0x67, 0xA2, 0x03, 0xB7, 0x38, 0x31,
+0x16, 0xA8, 0x5D, 0x64, 0x3F, 0xE6, 0xF1, 0x94,
+0x37, 0x09, 0x8C, 0x20, 0x17, 0xAC, 0x2F, 0x55,
+0x9E, 0xED, 0xB3, 0xC7, 0x73, 0xC0, 0x1C, 0xBB,
+0xBF, 0xF7, 0x18, 0xCE, 0x4F, 0xD4, 0xE3, 0x67,
+0x75, 0xE4, 0xD9, 0x51, 0xFB, 0x1B, 0x22, 0xF9,
+0x72, 0x2E, 0xC1, 0x76, 0x2A, 0xE1, 0x4A, 0x6E,
+0x88, 0xD6, 0x2D, 0x71, 0xF4, 0xC4, 0x6D, 0xAC,
+0x8C, 0xBD, 0xE7, 0x2B, 0xB1, 0x40, 0x15, 0x93,
+0xBD, 0x97, 0xD4, 0x84, 0x90, 0xEF, 0x4E, 0xFD,
+0x78, 0x25, 0xAB, 0xDF, 0x16, 0xF3, 0x46, 0x52,
+0x16, 0x96, 0xAE, 0x50, 0x88, 0x96, 0x18, 0x73,
+0xC1, 0xD1, 0x73, 0xF0, 0x67, 0xC8, 0x8D, 0xBB,
+0x4E, 0xBC, 0x6A, 0x40, 0xE6, 0x1E, 0x7D, 0x36,
+0x8C, 0xF4, 0xB1, 0xF1, 0x5F, 0x26, 0x4F, 0x43,
+0x0A, 0x36, 0xD4, 0x67, 0xD4, 0x79, 0x3F, 0xB8,
+0x69, 0x6F, 0x9C, 0x33, 0xD3, 0xDB, 0xC6, 0xCE,
+0x42, 0xE3, 0x46, 0x87, 0xD6, 0x65, 0xAC, 0xC9,
+0x71, 0xF1, 0xA9, 0x8F, 0x78, 0x45, 0x9A, 0xEF,
+0x1C, 0xE4, 0x45, 0x84, 0x3D, 0x8A, 0x27, 0x51,
+
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_bsn0_msg_0_255_sha512.inc b/epid/common-testhelper/testdata/grp01/member0/sig_bsn0_msg_0_255_sha512.inc
new file mode 100644
index 0000000..e57d201
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_bsn0_msg_0_255_sha512.inc
@@ -0,0 +1,72 @@
+ /*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupA
+ * Signer : member0
+ * HashAlg : Sha512
+ * Message : bytes [0, 255]
+ * Basename: "bsn0"
+ * SigRl : SigRl of group
+ */
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4, 0x56, 0x4f, 0x11, 0x31,
+ 0x62, 0x07, 0x02, 0x0f, 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f, 0xa7, 0xd5, 0xec, 0x4b,
+ 0x3e, 0x23, 0x5f, 0x4f, 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49, 0xa9, 0xed, 0x1d, 0x88,
+ 0xde, 0xa6, 0x93, 0x18, 0xa4, 0xaa, 0xcc, 0x21, 0xc0, 0xbb, 0x90, 0xc1,
+ 0xb4, 0x1c, 0x8d, 0xf6, 0xd9, 0xb4, 0x6d, 0xd8, 0xa6, 0x66, 0xed, 0xc4,
+ 0x33, 0x97, 0x6d, 0xc1, 0x68, 0x44, 0x3e, 0xd1, 0x08, 0x75, 0x6e, 0x1d,
+ 0xf5, 0x81, 0xee, 0x39, 0xaa, 0xbf, 0xc9, 0x38, 0x14, 0x8a, 0x57, 0x93,
+ 0x85, 0x6a, 0x98, 0xbf, 0x1a, 0xed, 0xa5, 0x96, 0x1f, 0x97, 0x1e, 0xc6,
+ 0xc5, 0x28, 0x8e, 0x6f, 0xf4, 0xca, 0x2f, 0xe5, 0xc6, 0x4c, 0xc8, 0x9d,
+ 0xdc, 0x63, 0x46, 0x5b, 0xab, 0x79, 0xea, 0x49, 0x76, 0x47, 0x68, 0xe6,
+ 0x2e, 0x7d, 0x0b, 0x49, 0xc0, 0x29, 0xe4, 0xc8, 0x84, 0xb5, 0x04, 0x2d,
+ 0x15, 0xaa, 0x0d, 0xd4, 0x71, 0x43, 0xd0, 0x24, 0x3e, 0x00, 0xf4, 0x94,
+ 0xad, 0x1e, 0x1e, 0x32, 0xea, 0x21, 0x4d, 0x83, 0xae, 0x63, 0x3c, 0x5a,
+ 0xd4, 0xa5, 0x79, 0x9b, 0x2c, 0xad, 0x03, 0x50, 0xb6, 0x57, 0x0a, 0xbf,
+ 0x3f, 0xeb, 0xf5, 0x72, 0x9f, 0x5f, 0x9f, 0x95, 0x5c, 0x66, 0xc9, 0x1f,
+ 0xfe, 0x71, 0x50, 0xee, 0xf6, 0x09, 0xf5, 0x1f, 0x08, 0x0c, 0x78, 0xd0,
+ 0xc3, 0xcf, 0x4a, 0x7b, 0xba, 0xb5, 0xf7, 0xbb, 0xc4, 0x5e, 0x1f, 0x0c,
+ 0xc3, 0x25, 0xe3, 0x7f, 0x8d, 0x15, 0x16, 0xec, 0x6a, 0xae, 0x58, 0xf8,
+ 0xb9, 0x73, 0x0f, 0xa4, 0x73, 0xdb, 0xe7, 0x29, 0x72, 0x07, 0xda, 0xcc,
+ 0x0f, 0xc4, 0xfc, 0x9b, 0xd3, 0xe5, 0xbd, 0x26, 0xf5, 0xb6, 0x05, 0xaf,
+ 0x93, 0x31, 0xf5, 0x62, 0x6d, 0xf4, 0xdd, 0xea, 0x16, 0xf9, 0xe9, 0x2e,
+ 0x3f, 0x10, 0xa4, 0x6f, 0xfd, 0x7c, 0x06, 0x10, 0x74, 0x51, 0xf1, 0x8e,
+ 0x1e, 0x49, 0xd2, 0xb1, 0x4c, 0x89, 0xe1, 0x16, 0x5e, 0xbc, 0xbb, 0xfc,
+ 0x5f, 0xad, 0x33, 0xb9, 0x7a, 0x9b, 0xf4, 0x59, 0x0b, 0xf2, 0x0e, 0x63,
+ 0x39, 0xc7, 0x90, 0xce, 0x0a, 0xef, 0x5c, 0x72, 0x7a, 0x05, 0xbb, 0xe5,
+ 0xfe, 0xfc, 0xbe, 0x2c, 0xdf, 0xd1, 0xba, 0x0c, 0x3f, 0x40, 0xe0, 0x8c,
+ 0xa4, 0x25, 0xe8, 0xc3, 0x54, 0x8d, 0x32, 0xba, 0x2d, 0x96, 0x3c, 0x5e,
+ 0x44, 0x61, 0xd1, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ // sigma
+ 0x9a, 0x8a, 0x3c, 0x2d, 0x96, 0x27, 0x84, 0xfc, 0x3f, 0x11, 0x87, 0x30,
+ 0x51, 0x30, 0x62, 0xba, 0x51, 0x93, 0x09, 0x87, 0x80, 0x44, 0x02, 0x10,
+ 0x95, 0x09, 0xe7, 0x7f, 0x27, 0x9d, 0x8f, 0xae, 0xc7, 0x06, 0xad, 0xd8,
+ 0xe2, 0xe4, 0x79, 0x07, 0x0c, 0xc1, 0xba, 0x5f, 0x64, 0xe2, 0xee, 0xe5,
+ 0xc5, 0x89, 0x6d, 0xc4, 0xde, 0x2c, 0xd3, 0x88, 0x31, 0x09, 0x47, 0x3d,
+ 0xd4, 0x5a, 0xe1, 0x55, 0x43, 0xbc, 0x23, 0x60, 0xdd, 0x63, 0xf9, 0x21,
+ 0x07, 0xde, 0x56, 0x85, 0x9f, 0x0c, 0xbe, 0x04, 0xfe, 0x35, 0x67, 0x75,
+ 0x23, 0x27, 0x11, 0x8e, 0x7b, 0xcd, 0x7d, 0x85, 0x2e, 0xd2, 0xfe, 0x25,
+ 0x6a, 0x34, 0xf2, 0xed, 0x5d, 0x2b, 0x1e, 0x63, 0x46, 0x88, 0x72, 0x47,
+ 0x5e, 0xf3, 0x1b, 0x70, 0x3d, 0xd7, 0x06, 0x7a, 0x07, 0xb1, 0x62, 0xd4,
+ 0x55, 0x6a, 0xed, 0x0b, 0x4e, 0x52, 0xcd, 0x8d, 0x5c, 0x35, 0x6b, 0x58,
+ 0xad, 0x69, 0x14, 0x96, 0xe7, 0x0c, 0x43, 0x14, 0xd6, 0x28, 0x33, 0xbc,
+ 0xe4, 0x2c, 0x23, 0x58, 0xee, 0x05, 0xa2, 0x6f, 0x7b, 0x88, 0xab, 0xc8,
+ 0x93, 0x6e, 0x99, 0xba,
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha256_sigrl.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha256_sigrl.inc
new file mode 100644
index 0000000..c009b34
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha256_sigrl.inc
@@ -0,0 +1,1222 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "test message"
+ * Basename: None (random base)
+ * SigRl: SigRl of group
+ */
+0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17,
+0xeb, 0x3d, 0x75, 0x3d, 0x61, 0x7e, 0x27,
+0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64,
+0xce, 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd,
+0xb5, 0x80, 0xe0, 0x99, 0x3a, 0x7, 0x56,
+0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5,
+0xb7, 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee,
+0x3d, 0x66, 0x42, 0x82, 0x45, 0x7e, 0x7f,
+0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59,
+0xee, 0x50, 0xda, 0xbf, 0xc4, 0x59, 0xcc,
+0x11, 0xf3, 0x49, 0xd8, 0xbb, 0x51, 0xfc,
+0xa7, 0x15, 0xf9, 0x4d, 0xbb, 0x7c, 0x27,
+0xaa, 0x0, 0x2c, 0xa2, 0x91, 0x7b, 0x36,
+0xa3, 0x2c, 0x60, 0x96, 0x16, 0x38, 0xff,
+0xe4, 0x4a, 0x42, 0x13, 0x3, 0xdb, 0x88,
+0x6f, 0xe3, 0x4f, 0xd6, 0xf2, 0x47, 0x10,
+0xed, 0xeb, 0xa0, 0xaf, 0x71, 0xc3, 0x6,
+0x10, 0x30, 0x55, 0x91, 0xf0, 0xf2, 0x70,
+0xe0, 0x10, 0x1b, 0x7f, 0xb4, 0x3, 0xc2,
+0x0, 0x70, 0xb2, 0x77, 0x20, 0xbf, 0x6c,
+0x49, 0xee, 0xfa, 0xf2, 0xca, 0x6, 0x99,
+0x9c, 0x54, 0xe3, 0x29, 0x1b, 0x17, 0x6a,
+0xb1, 0x5e, 0x92, 0xa0, 0x27, 0xac, 0x81,
+0x91, 0x33, 0x39, 0x6a, 0xf9, 0x60, 0xb,
+0xe4, 0xcd, 0xa2, 0xe8, 0xde, 0x74, 0xb2,
+0xbe, 0x58, 0xaa, 0x96, 0x3e, 0xdd, 0x5f,
+0xc0, 0x3c, 0xe5, 0x94, 0x1b, 0xfd, 0x78,
+0xa8, 0x44, 0x48, 0x32, 0x91, 0x89, 0xb0,
+0xf0, 0x9e, 0x56, 0x87, 0x76, 0xee, 0x24,
+0xfe, 0xf5, 0xf, 0x69, 0x95, 0xc, 0xfe,
+0xcc, 0xce, 0x22, 0xd7, 0x33, 0xe3, 0xe5,
+0x86, 0xa3, 0xb9, 0x42, 0x6f, 0x7b, 0xe4,
+0x86, 0x95, 0xec, 0xc3, 0x8, 0x43, 0xf6,
+0xba, 0x26, 0x1c, 0xbd, 0x8b, 0x21, 0xa7,
+0x82, 0x91, 0x22, 0xdb, 0x62, 0x4c, 0xff,
+0x85, 0x8f, 0x10, 0xb7, 0xb1, 0x40, 0xa7,
+0x44, 0x80, 0x20, 0xb4, 0x61, 0xf9, 0xf4,
+0x98, 0xad, 0xb4, 0x35, 0xf7, 0x1e, 0x11,
+0xa1, 0x77, 0xe4, 0xf2, 0x60, 0x68, 0x96,
+0x9, 0x62, 0x6c, 0x35, 0xd2, 0x73, 0x43,
+0x6a, 0x12, 0xc3, 0x2b, 0x5d, 0xe3, 0xc4,
+0x68, 0x2f, 0x5a, 0x69, 0x56, 0xb6, 0x40,
+0x26, 0x11, 0xb9, 0xff, 0x67, 0xb, 0xec,
+0xdc, 0x53, 0x86, 0xe2, 0x83, 0xfb, 0x75,
+0xa1, 0x48, 0xd1, 0x3a, 0xaf, 0xaf, 0x29,
+0x53, 0xce, 0xd1, 0x24, 0xb5, 0xf8, 0x6e,
+0x9, 0xab, 0x2b, 0xe4, 0xf0, 0xfe, 0x19,
+0x66, 0x65, 0xc1, 0x73, 0x91, 0x9d, 0xe5,
+0xe1, 0x89, 0x24, 0x17, 0xa8, 0xba, 0x73,
+0x10, 0xbe, 0x6b, 0xf6, 0x45, 0xbc, 0xe5,
+0x3e, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x32, 0x27, 0xce, 0xbd, 0x3d,
+0xe0, 0xa, 0x5a, 0x61, 0x29, 0xaa, 0xe0,
+0xda, 0x63, 0x27, 0x6f, 0x7a, 0xae, 0x85,
+0xf9, 0x9a, 0x4d, 0x38, 0xe, 0x7, 0x7d,
+0xc4, 0xbc, 0x3e, 0xef, 0x50, 0xc5, 0x39,
+0x43, 0x3d, 0x1f, 0xb1, 0xd3, 0x86, 0x5a,
+0x47, 0x4c, 0x19, 0xf6, 0xf3, 0x13, 0x22,
+0x92, 0x6c, 0x3d, 0xe2, 0x29, 0x6a, 0xe6,
+0xb7, 0xf1, 0x26, 0xd8, 0x31, 0xa1, 0xe9,
+0x8f, 0x97, 0xd7, 0xc8, 0x2e, 0x80, 0x1d,
+0x98, 0xc, 0x1a, 0xbe, 0x7b, 0xef, 0xd5,
+0x7c, 0x1, 0x86, 0xcd, 0x4d, 0xe0, 0xcd,
+0xc9, 0x75, 0xe8, 0x43, 0x11, 0x2, 0x5c,
+0x12, 0x54, 0xe6, 0x79, 0xbd, 0x81, 0x75,
+0xd, 0x7e, 0xd, 0x2, 0xc3, 0x73, 0x85,
+0xee, 0x9e, 0x41, 0x81, 0x6a, 0xf9, 0x7,
+0x95, 0x21, 0x2f, 0x45, 0x60, 0xb2, 0x1a,
+0x3b, 0x83, 0x1, 0x76, 0x9e, 0xf6, 0x4,
+0x5c, 0x52, 0xa1, 0x53, 0x4c, 0x0, 0xfc,
+0x4f, 0x2c, 0xe, 0x70, 0xd9, 0x9, 0x6c,
+0x2b, 0x5b, 0x8c, 0xed, 0xc3, 0xfe, 0xbb,
+0xbc, 0xa4, 0x2d, 0x51, 0x9f, 0xa8, 0x69,
+0x43, 0x7c, 0xe3, 0x82, 0x49, 0x1a, 0x90,
+0xc0, 0xfd, 0x9c, 0x69, 0xe0, 0x20, 0xdb,
+0x40, 0x5c, 0xf7, 0x16, 0x15, 0x24, 0xaa,
+0x6, 0x5e, 0xb5, 0x39, 0xb8, 0x0, 0x79,
+0x5d, 0xc1, 0x72, 0x89, 0xa2, 0x14, 0xdf,
+0xdc, 0x2b, 0x6b, 0x70, 0x66, 0xd9, 0xd,
+0x23, 0x47, 0x67, 0xb3, 0x8c, 0x9c, 0x8a,
+0xea, 0xa5, 0x5c, 0x79, 0x4b, 0xaa, 0x16,
+0x82, 0xb7, 0x4f, 0xdf, 0x55, 0x24, 0xf7,
+0x72, 0x4e, 0x4b, 0xaf, 0xc2, 0x8c, 0xfe,
+0x82, 0x70, 0x49, 0x30, 0xa6, 0xd4, 0x97,
+0xa5, 0x7c, 0xec, 0x42, 0xd6, 0x1, 0xbe,
+0x66, 0x35, 0xf7, 0x28, 0xce, 0xe0, 0xab,
+0x6a, 0xfc, 0x69, 0xf3, 0x6b, 0xea, 0xd5,
+0xa5, 0xbf, 0xd, 0x6d, 0xc3, 0xbf, 0xaa,
+0xb2, 0x69, 0x35, 0xe7, 0xdb, 0x51, 0x3a,
+0x59, 0x8, 0x1, 0xb7, 0xd8, 0x7a, 0x95,
+0xa8, 0xa5, 0xc8, 0x6a, 0xaa, 0x30, 0x25,
+0x4f, 0x59, 0x45, 0x70, 0xce, 0x95, 0x70,
+0x70, 0xec, 0xf2, 0xaa, 0x3c, 0xa2, 0x3,
+0xcb, 0xb8, 0x3f, 0x1d, 0x64, 0x66, 0x26,
+0xc2, 0x2d, 0xa, 0xfc, 0x1a, 0x1e, 0x89,
+0xfd, 0xfd, 0xaa, 0x51, 0xb7, 0x72, 0xad,
+0xb3, 0x98, 0xe1, 0x8, 0x58, 0x10, 0x56,
+0x87, 0xaf, 0x5a, 0x71, 0x68, 0x94, 0x11,
+0x50, 0x3b, 0xae, 0x96, 0xfe, 0x34, 0x73,
+0x41, 0xcd, 0x9f, 0xf3, 0x70, 0xbc, 0xad,
+0xb, 0xb5, 0x76, 0x6a, 0x7d, 0x9c, 0x64,
+0x5d, 0x0, 0xed, 0xf1, 0xfa, 0xd4, 0xed,
+0x73, 0xdf, 0x25, 0xe, 0x74, 0xd1, 0x5d,
+0x5f, 0xf3, 0x86, 0x69, 0x61, 0x4a, 0xda,
+0x39, 0xd5, 0x4b, 0xf, 0x94, 0xd, 0x14,
+0xc8, 0x43, 0x33, 0xf9, 0xfd, 0x92, 0x46,
+0x77, 0x8f, 0xef, 0xc8, 0xb8, 0x35, 0xa3,
+0x6b, 0x3b, 0xf4, 0x29, 0x6e, 0x58, 0xa8,
+0xe4, 0x9a, 0xbd, 0xe6, 0x17, 0x18, 0x12,
+0x5f, 0x78, 0xde, 0xf9, 0xa9, 0x54, 0x83,
+0xd1, 0xa3, 0xbe, 0xf9, 0xe7, 0x3, 0xab,
+0xe1, 0x7, 0xe4, 0xa9, 0x4, 0x9f, 0x86,
+0xff, 0xf7, 0x88, 0x2, 0x3, 0xe8, 0xe9,
+0xa, 0xf2, 0x8a, 0xf8, 0x70, 0xbb, 0xc9,
+0xc1, 0xb9, 0x6, 0x29, 0x25, 0x94, 0x70,
+0xc4, 0x3, 0xdd, 0x9a, 0x51, 0x3a, 0xfc,
+0x45, 0x1a, 0xc6, 0xac, 0x56, 0x80, 0x18,
+0x3c, 0x4b, 0x1d, 0xb, 0x6c, 0x1a, 0x73,
+0xd1, 0xdd, 0xae, 0x7f, 0xe2, 0x48, 0x3a,
+0xe5, 0xb6, 0xf5, 0x1a, 0xf3, 0xc5, 0x2a,
+0x79, 0x93, 0x3, 0x41, 0x88, 0x5d, 0x86,
+0x2, 0x26, 0xbd, 0x93, 0x7f, 0xdf, 0xc9,
+0x49, 0xaa, 0x79, 0x66, 0x62, 0x50, 0x81,
+0xf5, 0xef, 0x1, 0xeb, 0x61, 0xd1, 0x64,
+0x6c, 0xe0, 0xa8, 0x2, 0xb8, 0xff, 0x3e,
+0x6e, 0x3c, 0xf5, 0xd2, 0x81, 0xbe, 0x9c,
+0x45, 0x7a, 0x77, 0x83, 0x38, 0x76, 0x7f,
+0x28, 0x25, 0x47, 0xc7, 0xe1, 0x8c, 0xae,
+0x99, 0x81, 0x79, 0xa9, 0xd1, 0x3d, 0x9e,
+0x6a, 0xfc, 0x40, 0x8b, 0xc5, 0xbd, 0x2d,
+0xf7, 0x91, 0x8f, 0x5, 0x83, 0x13, 0x10,
+0x2, 0x84, 0xc2, 0xc6, 0x8d, 0x18, 0x5f,
+0x23, 0x7e, 0x1b, 0x60, 0xc6, 0x66, 0x24,
+0xba, 0xd8, 0xf4, 0x3d, 0x76, 0xc6, 0xd2,
+0x1, 0xe9, 0x85, 0xb7, 0x44, 0x1c, 0xd4,
+0x59, 0xe8, 0xa4, 0xe0, 0x88, 0x8b, 0xad,
+0x34, 0xd5, 0x36, 0x2e, 0xc2, 0x16, 0x82,
+0x1, 0x2f, 0x92, 0x75, 0x98, 0x88, 0xb2,
+0xcb, 0x34, 0xcd, 0xb8, 0x6, 0x40, 0x84,
+0xbb, 0x99, 0xd, 0x79, 0x5f, 0xca, 0xca,
+0x9c, 0xbf, 0x2f, 0xd3, 0x2a, 0x1, 0x8f,
+0xea, 0xff, 0xcd, 0x24, 0x2b, 0x4b, 0xfd,
+0xef, 0xeb, 0x96, 0xc3, 0xca, 0xa5, 0x39,
+0x91, 0x3, 0x6f, 0x73, 0xc5, 0x72, 0x41,
+0x42, 0x17, 0xd, 0x4a, 0x2f, 0xa, 0x7e,
+0x12, 0x1f, 0x73, 0xd6, 0x80, 0x64, 0x69,
+0xf0, 0xe1, 0xd3, 0x74, 0x31, 0xa8, 0x8a,
+0x24, 0xaa, 0xd6, 0x8f, 0x39, 0x95, 0xbd,
+0x13, 0x39, 0x99, 0xa5, 0xa4, 0x7b, 0x78,
+0x80, 0x3f, 0xad, 0x19, 0x18, 0x28, 0x37,
+0x54, 0xd3, 0x42, 0x43, 0x95, 0x9d, 0x22,
+0xc3, 0x1b, 0x63, 0x9a, 0x2f, 0xea, 0xa7,
+0x94, 0x88, 0x62, 0x34, 0x5b, 0xae, 0x44,
+0xf1, 0xda, 0xd8, 0x55, 0x8b, 0xe6, 0x24,
+0xd5, 0xce, 0x77, 0x75, 0xd9, 0x71, 0x2b,
+0xb7, 0xb7, 0x62, 0x2d, 0xb8, 0xa2, 0xd8,
+0x2c, 0x38, 0xc4, 0x3a, 0x6, 0x34, 0xd0,
+0xe9, 0x74, 0xb9, 0xba, 0xe7, 0xb9, 0xe8,
+0x97, 0x80, 0xdd, 0x65, 0xd6, 0x5b, 0xeb,
+0x7f, 0xdf, 0x38, 0xe9, 0x30, 0x43, 0x3e,
+0xc5, 0x28, 0xb4, 0xb7, 0x47, 0xae, 0xfa,
+0xf9, 0x53, 0xa7, 0xd, 0x3e, 0x82, 0xd4,
+0x60, 0xf8, 0xa9, 0xa4, 0x16, 0x6d, 0xfb,
+0x84, 0x57, 0x7a, 0xeb, 0x80, 0x71, 0xff,
+0x55, 0xbd, 0x42, 0xe8, 0xd0, 0x1c, 0xf,
+0xd, 0xe1, 0x38, 0xac, 0x69, 0xd0, 0xb1,
+0x4c, 0x8f, 0x26, 0x5b, 0xe0, 0x4, 0xa2,
+0xe8, 0xd1, 0x72, 0x15, 0x24, 0x97, 0x51,
+0x7, 0x85, 0x54, 0xed, 0x6f, 0xc4, 0xa0,
+0xac, 0xed, 0x67, 0x6, 0x7d, 0x92, 0x5,
+0x79, 0x4, 0x2f, 0x5e, 0x4e, 0x9e, 0x69,
+0x33, 0xc3, 0x43, 0xc9, 0x89, 0x8, 0xfa,
+0x7a, 0x8d, 0x86, 0x2d, 0x27, 0x37, 0x32,
+0xdf, 0x9, 0x94, 0x86, 0x5f, 0x21, 0x97,
+0x25, 0xc, 0xb3, 0xbd, 0xe, 0x61, 0xf4,
+0x53, 0xfd, 0xac, 0xbb, 0xd2, 0x4d, 0x9a,
+0xd1, 0x6e, 0xfc, 0x99, 0x3, 0xc1, 0x3f,
+0x4c, 0x1a, 0xcb, 0x0, 0x4a, 0x54, 0xd2,
+0xa9, 0x26, 0x32, 0x46, 0xe0, 0x5a, 0x60,
+0x1, 0x58, 0x59, 0xca, 0x2d, 0x19, 0xf4,
+0xc0, 0x18, 0x4b, 0x7a, 0xc6, 0x83, 0xab,
+0xf0, 0xbf, 0xb2, 0x82, 0x49, 0x9b, 0x15,
+0x31, 0xa0, 0x65, 0x4, 0x72, 0xc, 0xbe,
+0x1b, 0x70, 0x34, 0x7d, 0xe4, 0x44, 0xbf,
+0x78, 0x5e, 0xca, 0x41, 0x27, 0x8b, 0x8c,
+0xba, 0x53, 0xa7, 0x7b, 0xb7, 0x77, 0xe2,
+0xa3, 0x2e, 0x69, 0x6, 0x12, 0xcc, 0x5f,
+0x8, 0xea, 0x7a, 0x72, 0x23, 0xc9, 0x66,
+0xa6, 0x3a, 0x56, 0x23, 0x3d, 0xee, 0x93,
+0x57, 0x2a, 0xca, 0x63, 0x6a, 0xb3, 0x77,
+0x82, 0xac, 0xe0, 0xe4, 0x23, 0xd0, 0x16,
+0x3, 0x7c, 0x3a, 0x74, 0x7b, 0xc3, 0xa6,
+0xbe, 0x72, 0xe1, 0x9a, 0xe7, 0x73, 0x6e,
+0xcb, 0x70, 0x74, 0x7e, 0xab, 0xac, 0xec,
+0x80, 0x57, 0xa6, 0x38, 0x68, 0x8f, 0x54,
+0x41, 0xa9, 0xb, 0x0, 0x77, 0x2, 0xa8,
+0xad, 0x92, 0x64, 0x6d, 0xd2, 0xee, 0x2f,
+0x2c, 0x42, 0x40, 0xec, 0x4a, 0x45, 0x33,
+0x4f, 0x55, 0xc, 0x4b, 0x51, 0x3c, 0x10,
+0x22, 0x27, 0xa4, 0xe1, 0x89, 0x3a, 0x90,
+0xe5, 0xe0, 0x97, 0x10, 0xe2, 0x89, 0x63,
+0x16, 0xb9, 0x59, 0x1e, 0xcb, 0xf2, 0xb0,
+0xe8, 0xbf, 0x7b, 0x5a, 0x8f, 0x67, 0xec,
+0xb0, 0x98, 0xb0, 0x4b, 0xed, 0x5b, 0xd8,
+0xbe, 0x4f, 0x33, 0xb9, 0x5, 0xb4, 0x4d,
+0x40, 0x91, 0x83, 0x5d, 0xc, 0x9b, 0x56,
+0x60, 0xa8, 0xdc, 0xf9, 0xdd, 0xfb, 0xb5,
+0x6, 0xcd, 0x6d, 0xc2, 0x44, 0x9a, 0xdd,
+0xf, 0x1a, 0xe0, 0x18, 0x62, 0xb0, 0x90,
+0xb1, 0xed, 0xa9, 0x11, 0xcb, 0x8c, 0x1,
+0xb2, 0x78, 0x62, 0x9a, 0x8f, 0x37, 0x2,
+0xac, 0xbc, 0xc5, 0x23, 0x36, 0xfd, 0xe,
+0x73, 0x15, 0x27, 0x1, 0x17, 0xc9, 0xc6,
+0xf5, 0x79, 0x80, 0xee, 0x68, 0x47, 0xb4,
+0x8f, 0xfd, 0xdb, 0x11, 0x1c, 0x7f, 0x3e,
+0xcd, 0x78, 0xdd, 0x7, 0x80, 0x55, 0xe7,
+0xbc, 0xfb, 0x11, 0xe1, 0xca, 0xcf, 0x65,
+0x75, 0x5c, 0x73, 0xf2, 0x28, 0x9b, 0x7a,
+0x24, 0xd0, 0x9f, 0x43, 0x85, 0xe4, 0x62,
+0x8d, 0x90, 0x53, 0xec, 0xcd, 0xba, 0xdc,
+0xc3, 0x96, 0x3e, 0x12, 0x22, 0xc, 0x52,
+0x59, 0x8c, 0xa3, 0x18, 0x86, 0x6b, 0xbe,
+0xc8, 0x65, 0x66, 0xe2, 0x6e, 0x1c, 0xfc,
+0x7b, 0x8c, 0xd5, 0xaa, 0xcc, 0xc2, 0xb9,
+0x3, 0x1e, 0xf2, 0x10, 0x92, 0x45, 0xf1,
+0xf0, 0xe0, 0xf, 0x68, 0x4a, 0x92, 0xf8,
+0x6d, 0x19, 0x83, 0xf9, 0xe7, 0xe9, 0xb2,
+0x47, 0x17, 0xd6, 0x39, 0x59, 0x55, 0xd3,
+0x96, 0xd0, 0xfd, 0xe7, 0xdc, 0xb7, 0x12,
+0x35, 0xbe, 0xaa, 0xb0, 0xc4, 0xe8, 0x83,
+0x25, 0xc0, 0x42, 0xc4, 0x42, 0xd9, 0x41,
+0x38, 0xcd, 0xcb, 0x86, 0x58, 0x83, 0x2c,
+0xef, 0xf4, 0x90, 0x95, 0x56, 0x6, 0x24,
+0x1, 0x5, 0x4c, 0xdc, 0xcd, 0x80, 0xa6,
+0xd6, 0x4, 0xc0, 0xd4, 0xc3, 0x42, 0x99,
+0x8c, 0xa4, 0x97, 0x98, 0x4f, 0xaf, 0x98,
+0x27, 0x47, 0x62, 0x9b, 0x25, 0x94, 0xaf,
+0x27, 0x61, 0x6c, 0x13, 0x7d, 0x5f, 0x1a,
+0x3d, 0x43, 0x3d, 0x49, 0x3e, 0x96, 0x1f,
+0x8d, 0xc3, 0x5c, 0x17, 0x3, 0x3c, 0xe,
+0xd, 0xc5, 0xf7, 0x21, 0x5c, 0xcc, 0x81,
+0x3c, 0x49, 0xfa, 0xfd, 0x1c, 0xc5, 0x7d,
+0x51, 0x34, 0x5d, 0xcd, 0x6a, 0x67, 0x7e,
+0x63, 0x9a, 0x57, 0xd3, 0x49, 0x94, 0xda,
+0x7b, 0xb1, 0xa7, 0xf, 0xc0, 0xcb, 0xe6,
+0x8a, 0x94, 0x2e, 0x6e, 0xc7, 0x49, 0xf8,
+0x7f, 0xea, 0xe2, 0xe3, 0xb3, 0x46, 0x19,
+0x5, 0xaf, 0x9f, 0x7e, 0x65, 0x42, 0xd8,
+0x18, 0xa4, 0xf2, 0x31, 0xa3, 0x1f, 0xb3,
+0x93, 0x8b, 0xe5, 0x5c, 0x5e, 0x44, 0xd3,
+0xc5, 0xce, 0xd0, 0xe, 0x4d, 0xe9, 0x70,
+0x4f, 0x57, 0xa4, 0x18, 0x5f, 0x26, 0xc,
+0x46, 0x74, 0x7e, 0xf4, 0x55, 0x5d, 0xc,
+0x16, 0xc9, 0xcc, 0xc5, 0xe9, 0x42, 0xfa,
+0x60, 0xbf, 0x62, 0x4f, 0x46, 0x38, 0x9c,
+0x2a, 0x26, 0x86, 0x73, 0xab, 0x24, 0x29,
+0x23, 0x49, 0x72, 0x9e, 0x8c, 0x97, 0xf2,
+0x5b, 0x54, 0xbe, 0xf8, 0x4, 0x1d, 0xa5,
+0xe7, 0x21, 0x9d, 0xa0, 0x5e, 0xf7, 0xbf,
+0x1c, 0xfe, 0xec, 0xee, 0x28, 0xac, 0x6,
+0x6e, 0xc6, 0x3a, 0x4f, 0xe4, 0xf3, 0xb5,
+0x27, 0x98, 0x28, 0x84, 0xef, 0x62, 0xf,
+0xc0, 0x14, 0x1c, 0xf6, 0x63, 0x88, 0xdf,
+0x2, 0xfb, 0x84, 0x76, 0x6a, 0x1f, 0x30,
+0x3e, 0x77, 0x79, 0x46, 0x9b, 0x24, 0x5b,
+0x63, 0x5e, 0x82, 0x7f, 0x43, 0x0, 0xdd,
+0x41, 0xc9, 0x61, 0xf6, 0x25, 0x38, 0xee,
+0x6b, 0xf, 0xcd, 0xa2, 0x19, 0xcd, 0x21,
+0x8e, 0x57, 0x94, 0xcb, 0xda, 0x87, 0x3a,
+0xe1, 0xf4, 0xc6, 0x91, 0xce, 0xf6, 0x85,
+0x92, 0xf6, 0xf9, 0x55, 0x84, 0x16, 0x7e,
+0x88, 0x69, 0x43, 0xbf, 0x9b, 0xd5, 0x14,
+0xc6, 0xf2, 0x86, 0xf2, 0x79, 0xae, 0xb8,
+0x1d, 0xf, 0xde, 0xcd, 0xf, 0xbf, 0x5f,
+0x18, 0x11, 0xd2, 0x83, 0xc1, 0x55, 0x77,
+0x6b, 0xdc, 0x13, 0x6d, 0x6e, 0x6, 0x76,
+0x9, 0xdc, 0xa2, 0xe5, 0x13, 0xe0, 0xa5,
+0x40, 0x30, 0xa7, 0x67, 0x85, 0x82, 0x92,
+0xec, 0xaa, 0xa1, 0x1, 0x32, 0x76, 0xd9,
+0x20, 0x21, 0xef, 0xe, 0xb, 0x51, 0xee,
+0xbd, 0xf1, 0xca, 0x7, 0x8b, 0x3d, 0xb0,
+0xca, 0xc1, 0x23, 0x4b, 0x2e, 0x4b, 0x55,
+0x1e, 0x82, 0xea, 0x5d, 0x9f, 0x4b, 0x77,
+0xc9, 0x7e, 0xb6, 0xe, 0x4b, 0xc6, 0x45,
+0x53, 0xa8, 0xfd, 0xcf, 0x8f, 0x66, 0x41,
+0x4a, 0x1, 0x79, 0x4f, 0x41, 0x53, 0x67,
+0xc2, 0x50, 0xc5, 0xfe, 0xea, 0x66, 0xab,
+0x63, 0xe4, 0xed, 0xaa, 0x78, 0xba, 0x59,
+0xef, 0x91, 0x15, 0xe7, 0xc1, 0xcf, 0x6b,
+0x0, 0xc3, 0x9, 0xba, 0x66, 0x7d, 0x3f,
+0x1a, 0x5c, 0x39, 0x89, 0xaf, 0x44, 0x7e,
+0x37, 0xe6, 0x8e, 0x5, 0x75, 0xd9, 0xcb,
+0xe8, 0x3c, 0x6, 0xc0, 0xca, 0xce, 0xba,
+0x27, 0x13, 0x58, 0x5e, 0x17, 0x86, 0x22,
+0xfd, 0x57, 0x29, 0xb5, 0x55, 0xb, 0xf7,
+0xdc, 0x7d, 0x6b, 0x4e, 0xd6, 0x4c, 0x39,
+0x10, 0x71, 0x1f, 0x55, 0xcd, 0x58, 0x5d,
+0x4e, 0x4e, 0x5a, 0xee, 0x80, 0x66, 0xae,
+0x6e, 0xe6, 0x4e, 0x8f, 0x97, 0xfd, 0x88,
+0xba, 0x92, 0xc4, 0x2e, 0x9a, 0xe, 0x15,
+0xff, 0xad, 0x1c, 0x21, 0xda, 0x5, 0x8d,
+0x6, 0x61, 0x54, 0x2e, 0x6, 0xb1, 0xd1,
+0xa1, 0xb, 0x87, 0xe, 0xf6, 0x95, 0x7f,
+0xa5, 0xf7, 0x1c, 0x24, 0xa7, 0x5f, 0xab,
+0xf7, 0x33, 0x26, 0x6e, 0xb3, 0x53, 0x3,
+0xd7, 0x8b, 0x24, 0x8a, 0x83, 0xfe, 0x21,
+0x7d, 0xcb, 0x55, 0x37, 0x34, 0x58, 0xdc,
+0x7a, 0x1d, 0x62, 0x2a, 0x79, 0xaf, 0x1d,
+0xe1, 0x97, 0xfb, 0xbe, 0x37, 0x1d, 0xa7,
+0xcd, 0x7f, 0x65, 0x9a, 0x5, 0x8d, 0x4e,
+0xe, 0x83, 0x66, 0x9d, 0xb8, 0xbf, 0x30,
+0x57, 0xe8, 0xbf, 0x8, 0x8d, 0x91, 0xa3,
+0x9b, 0xe4, 0xf6, 0x7, 0xd2, 0xc5, 0x14,
+0x0, 0x42, 0x6, 0xaa, 0xe8, 0x32, 0x8e,
+0x63, 0x99, 0x5c, 0x88, 0x6a, 0x3a, 0x50,
+0xb6, 0x40, 0xf9, 0x0, 0x63, 0xbc, 0x1b,
+0x9d, 0xcf, 0xa7, 0x39, 0x18, 0xab, 0x76,
+0x87, 0xa1, 0xad, 0x4b, 0xeb, 0x7d, 0x0,
+0xab, 0x45, 0x79, 0xb9, 0x17, 0x8b, 0x2a,
+0xf8, 0x1c, 0x1, 0x1a, 0x11, 0xda, 0xf2,
+0x8, 0x7e, 0x4, 0x66, 0x67, 0xc0, 0xb8,
+0xa3, 0x12, 0x4f, 0x57, 0xb2, 0x45, 0xda,
+0xbb, 0x93, 0x54, 0x5b, 0xc5, 0xaf, 0x2f,
+0xe5, 0x6a, 0x2c, 0xcc, 0x6a, 0x44, 0x9c,
+0xe5, 0x10, 0xba, 0x6, 0x27, 0x25, 0xe7,
+0x24, 0x31, 0x3a, 0xaf, 0x7d, 0xb1, 0x86,
+0x1e, 0xb1, 0xa9, 0x3c, 0xc8, 0xea, 0x9c,
+0xa6, 0x93, 0xf2, 0x45, 0x6a, 0xde, 0x13,
+0xfb, 0x6, 0x32, 0xd3, 0x4b, 0x4d, 0x83,
+0x76, 0x9, 0x12, 0xf2, 0x1e, 0xdc, 0xb2,
+0xae, 0x5d, 0x6a, 0x87, 0x5d, 0xbc, 0xd1,
+0x94, 0x8, 0xec, 0x1c, 0xf4, 0x61, 0x82,
+0x67, 0xa1, 0x33, 0x7c, 0x98, 0x3c, 0xfc,
+0x14, 0xdb, 0x4e, 0x0, 0x3f, 0x16, 0x5f,
+0x4b, 0x72, 0xe4, 0x89, 0xbc, 0xf4, 0x4c,
+0x99, 0x5f, 0x51, 0x4e, 0xfb, 0xb0, 0xaf,
+0x29, 0xf4, 0xe2, 0x30, 0x8e, 0x74, 0x5,
+0xc0, 0x45, 0xc1, 0xc2, 0xe, 0xde, 0x70,
+0x58, 0x9e, 0x80, 0x6d, 0x87, 0x49, 0x83,
+0xc2, 0xaa, 0x25, 0x46, 0x94, 0x8e, 0x23,
+0x21, 0x0, 0x3a, 0x43, 0xcf, 0x34, 0x34,
+0x1c, 0x42, 0x13, 0x3e, 0x10, 0xd4, 0x1d,
+0x35, 0xf3, 0x60, 0x26, 0xe5, 0x69, 0xbd,
+0x2c, 0x3c, 0xc6, 0xb, 0xb6, 0xa4, 0xd1,
+0x51, 0x22, 0x1, 0xac, 0xb2, 0xab, 0x84,
+0x21, 0xdd, 0x7e, 0x50, 0x8b, 0x11, 0x77,
+0x1, 0x32, 0x6, 0xd0, 0xf3, 0x7f, 0x28,
+0x2c, 0xb5, 0x7e, 0x83, 0x84, 0xc7, 0x41,
+0x5e, 0xc1, 0xd6, 0x14, 0x21, 0xcf, 0x84,
+0x69, 0xff, 0x1a, 0xf4, 0x3d, 0xca, 0x53,
+0x8b, 0x30, 0x83, 0x96, 0xc9, 0xef, 0xa1,
+0xc6, 0x9e, 0xc6, 0x7d, 0x55, 0x5d, 0xb7,
+0x7, 0x16, 0x4, 0x77, 0x12, 0xb2, 0xc5,
+0x55, 0xa0, 0x32, 0xc0, 0x1, 0xae, 0xdb,
+0x1, 0x9b, 0x8f, 0x81, 0xf2, 0xc7, 0xb1,
+0xef, 0x75, 0x87, 0x1, 0x5e, 0x8c, 0x75,
+0x7f, 0x42, 0x3, 0x45, 0x2f, 0x45, 0x15,
+0x69, 0xa6, 0x81, 0xd0, 0x31, 0x69, 0x30,
+0x7c, 0xc0, 0xc0, 0xa6, 0x24, 0xd5, 0xca,
+0xc2, 0xe0, 0x26, 0xee, 0xc7, 0xa0, 0x6b,
+0x83, 0xe0, 0x83, 0x6b, 0xee, 0xab, 0xa8,
+0xe4, 0x1e, 0x5f, 0x48, 0x54, 0xd4, 0x40,
+0x5c, 0xd, 0x2e, 0x63, 0xf4, 0xde, 0x9a,
+0x76, 0xb, 0xc1, 0x26, 0x73, 0x53, 0xfd,
+0x1b, 0xac, 0xf1, 0x60, 0x5a, 0x9d, 0xb6,
+0x7a, 0x54, 0x81, 0xcd, 0x31, 0xb5, 0xd9,
+0x66, 0x40, 0xae, 0x11, 0xc6, 0xf3, 0x93,
+0x8f, 0xfe, 0x28, 0x3, 0x8e, 0x20, 0x36,
+0xb7, 0x1f, 0xab, 0xd3, 0x99, 0xb9, 0x4c,
+0x5, 0x72, 0xfc, 0x16, 0xe1, 0x78, 0xb8,
+0xa4, 0x1b, 0x8c, 0xe2, 0xf7, 0x1e, 0x62,
+0x9e, 0x4b, 0x57, 0x2d, 0x47, 0x87, 0x34,
+0x55, 0xaa, 0x7f, 0xfd, 0x6b, 0x5e, 0x3a,
+0x3f, 0xc0, 0xb3, 0x69, 0xe8, 0x58, 0x11,
+0x3d, 0x7, 0xb, 0x79, 0x4c, 0xae, 0xc9,
+0x39, 0x87, 0x27, 0xba, 0x67, 0x79, 0xcd,
+0x2a, 0x78, 0x81, 0x47, 0x24, 0xaf, 0x83,
+0xc, 0xd, 0xfb, 0xe1, 0xc5, 0x1a, 0xc2,
+0x38, 0x36, 0xe6, 0xfa, 0x4f, 0xb3, 0xe4,
+0xa3, 0x1a, 0xc5, 0x9b, 0x16, 0x87, 0xb4,
+0x7f, 0xd2, 0x9d, 0xf5, 0xde, 0xba, 0x9d,
+0x13, 0xc, 0x75, 0x30, 0x48, 0xe6, 0x91,
+0x11, 0x98, 0x30, 0x6d, 0xa8, 0x9, 0xc5,
+0x76, 0x45, 0x64, 0x54, 0x8a, 0xa1, 0xd6,
+0xa0, 0xdd, 0x5f, 0x9e, 0x6b, 0x86, 0x49,
+0xbe, 0xf8, 0x99, 0xdf, 0x40, 0x5a, 0x18,
+0x2e, 0xe8, 0x98, 0x68, 0x2, 0xbc, 0xa6,
+0xfe, 0x15, 0xe9, 0x4a, 0x7, 0x9f, 0x18,
+0x34, 0x41, 0x9, 0x73, 0x47, 0xd7, 0x0,
+0x5, 0x99, 0x80, 0x4, 0x58, 0x3, 0x24,
+0x12, 0x59, 0x69, 0xcf, 0x2b, 0xb4, 0x11,
+0xd7, 0x8, 0xa6, 0xfa, 0x86, 0xb4, 0xe0,
+0x32, 0x5e, 0x9f, 0x8d, 0xbb, 0x91, 0xe3,
+0x83, 0x83, 0x8c, 0x26, 0x9e, 0x71, 0x26,
+0x8c, 0xbc, 0x3a, 0x84, 0x2a, 0xba, 0xe2,
+0x55, 0x75, 0xa8, 0x52, 0x9, 0x91, 0xeb,
+0xef, 0x8f, 0x6c, 0x2a, 0xa8, 0x88, 0x8a,
+0xc5, 0xd1, 0x5d, 0x4a, 0x5f, 0xe, 0xac,
+0xe2, 0xc9, 0xd3, 0x36, 0xf4, 0xa9, 0x1a,
+0x37, 0xbd, 0x1, 0xb9, 0x4, 0x4d, 0x86,
+0x8c, 0x4d, 0x6b, 0xce, 0x6a, 0x6c, 0xba,
+0x6c, 0x4d, 0xc5, 0x34, 0x54, 0x1d, 0xe5,
+0x61, 0x85, 0x6d, 0x53, 0xc3, 0xf8, 0x75,
+0x17, 0xad, 0xbc, 0xd4, 0x66, 0x76, 0x8a,
+0x84, 0xb6, 0xd7, 0x42, 0xaf, 0x9b, 0xaf,
+0xbd, 0xee, 0xaf, 0x51, 0xe5, 0x1c, 0x17,
+0x57, 0x66, 0x6e, 0xac, 0x93, 0x8d, 0xef,
+0xaf, 0xaf, 0xb4, 0xa1, 0x3, 0xfe, 0x82,
+0x86, 0xa6, 0xa6, 0xc4, 0x30, 0x17, 0x5c,
+0x90, 0x8e, 0xa1, 0x17, 0xa8, 0x92, 0x23,
+0x1d, 0xc, 0x57, 0xbc, 0x24, 0xcb, 0x7b,
+0x7c, 0x72, 0x93, 0x2a, 0xf0, 0x78, 0xf6,
+0xa6, 0x71, 0xb, 0x81, 0x2a, 0x41, 0x37,
+0xda, 0xfd, 0xc1, 0xc1, 0xc3, 0x5d, 0x29,
+0x59, 0x99, 0xe1, 0x78, 0x9d, 0x7e, 0x2c,
+0xba, 0xf7, 0xf5, 0x99, 0xb1, 0x2b, 0x51,
+0x26, 0xb5, 0x93, 0xae, 0x1e, 0xd1, 0x94,
+0xdf, 0x30, 0x55, 0x10, 0xa4, 0xe6, 0xb9,
+0x33, 0x74, 0xb2, 0x4c, 0x5e, 0xdf, 0x83,
+0xf1, 0xd4, 0x2c, 0x3e, 0x46, 0x55, 0xed,
+0xb, 0x16, 0x71, 0xb2, 0xf7, 0xac, 0x69,
+0x3d, 0x7b, 0x31, 0x70, 0xf9, 0xc3, 0x38,
+0xdc, 0x8d, 0xaa, 0x56, 0x81, 0x2c, 0x21,
+0x3c, 0xb5, 0x16, 0x5c, 0x98, 0xfe, 0x53,
+0x6c, 0x7d, 0x8b, 0x3c, 0xc9, 0x35, 0x1f,
+0x8, 0xd2, 0x41, 0x4e, 0x2b, 0x7, 0xaa,
+0xde, 0x85, 0xc4, 0x77, 0xe5, 0xfb, 0xec,
+0x7f, 0x48, 0x6a, 0x94, 0x73, 0xbf, 0xa3,
+0x77, 0x34, 0xb7, 0xe3, 0x90, 0xa6, 0x99,
+0xb8, 0x2f, 0x7d, 0x0, 0xef, 0x5f, 0xd7,
+0xa7, 0x10, 0x16, 0xf9, 0xd5, 0x98, 0x79,
+0xd4, 0x49, 0x57, 0xf0, 0x4b, 0x70, 0xed,
+0x2f, 0x81, 0x53, 0x35, 0x1d, 0xef, 0x82,
+0xa7, 0x15, 0xcb, 0x69, 0x59, 0x90, 0x1d,
+0x5c, 0x58, 0xc2, 0x1c, 0x73, 0x2a, 0x5a,
+0xd4, 0x13, 0x6e, 0xa, 0x15, 0xc0, 0xc5,
+0x64, 0xea, 0xd1, 0xf1, 0x14, 0x62, 0x97,
+0xb1, 0x7e, 0x8c, 0xa0, 0x8c, 0xbd, 0xe3,
+0x6b, 0x11, 0x71, 0xb0, 0xff, 0xf7, 0xe0,
+0xa, 0x2d, 0xaa, 0x8, 0x64, 0x65, 0x6b,
+0x32, 0xe5, 0x87, 0x40, 0x4d, 0x87, 0xa7,
+0xb3, 0x8b, 0x26, 0x79, 0xd, 0xed, 0x99,
+0x5c, 0xae, 0x4e, 0x2b, 0x5d, 0x21, 0xb6,
+0xc4, 0xf0, 0x1b, 0x47, 0xc4, 0xcc, 0xc3,
+0x62, 0xc3, 0x77, 0x54, 0x45, 0x4, 0x66,
+0x99, 0xeb, 0x51, 0x44, 0x6e, 0xb9, 0x7c,
+0xd5, 0x90, 0x68, 0xa8, 0x77, 0xcf, 0x3e,
+0xe6, 0x20, 0xc9, 0xbc, 0x2f, 0xf1, 0x91,
+0x11, 0xc, 0x36, 0x12, 0xec, 0xd6, 0xcb,
+0xfe, 0xcf, 0x38, 0x5, 0x39, 0x9e, 0x9,
+0xae, 0x54, 0x25, 0x78, 0xa9, 0x64, 0xc4,
+0xd1, 0x83, 0x45, 0xac, 0x73, 0xdd, 0x96,
+0x88, 0x52, 0x7, 0xf, 0x6e, 0x2d, 0xa4,
+0x0, 0xc3, 0xbd, 0xd2, 0xcc, 0xd1, 0xb0,
+0xd2, 0x9d, 0xf4, 0xc6, 0xbe, 0xcd, 0x95,
+0x11, 0xed, 0x62, 0x4, 0x8, 0x23, 0x5,
+0x88, 0xc7, 0x3d, 0x76, 0x81, 0x5, 0x9a,
+0x6f, 0x5a, 0x2a, 0xd6, 0xbb, 0x7c, 0x3,
+0x34, 0xea, 0x35, 0x9b, 0x75, 0x6c, 0x44,
+0x18, 0xb0, 0x61, 0xd6, 0x6c, 0x6e, 0xf9,
+0xfd, 0x12, 0x9c, 0x17, 0xc3, 0x89, 0x16,
+0x3d, 0x8d, 0x6, 0x47, 0x5d, 0x99, 0xc9,
+0x9a, 0x7c, 0xdf, 0xb3, 0xc2, 0x5f, 0x4,
+0xf2, 0xf3, 0xb7, 0x72, 0xf8, 0x3, 0x4c,
+0xe1, 0x53, 0x18, 0x13, 0x5f, 0xbd, 0x74,
+0x9f, 0xa1, 0xc9, 0xa8, 0x5, 0x4c, 0xb6,
+0x9d, 0xa1, 0xd5, 0x29, 0xec, 0x44, 0x7a,
+0x61, 0xe8, 0x74, 0x12, 0x30, 0x32, 0xa4,
+0x1f, 0x32, 0xaf, 0x44, 0x4, 0xe3, 0x8,
+0x94, 0xbd, 0x13, 0x9f, 0x19, 0x12, 0x68,
+0x87, 0x2e, 0x9c, 0xa0, 0xe5, 0x5a, 0xd,
+0x4d, 0x88, 0x8f, 0x3b, 0xfb, 0x7c, 0xd6,
+0xf7, 0x76, 0x7c, 0x69, 0x9c, 0x41, 0x8c,
+0xa0, 0xeb, 0x3c, 0x2a, 0xdd, 0xbd, 0x26,
+0x85, 0x61, 0xd2, 0x80, 0x25, 0xa1, 0xdc,
+0xc7, 0x92, 0xd7, 0xe6, 0xa9, 0xdf, 0x6c,
+0xf3, 0x64, 0xc3, 0x93, 0xaf, 0xef, 0xe8,
+0xd1, 0xc4, 0x23, 0x1a, 0xe1, 0xa0, 0xac,
+0xc2, 0x9c, 0x3e, 0x54, 0xaf, 0x7a, 0xe1,
+0x67, 0xe1, 0x2b, 0x9d, 0xa, 0xa4, 0xe9,
+0x6, 0x2, 0xfa, 0x98, 0xd, 0xd8, 0xdf,
+0x37, 0xa6, 0x21, 0xe2, 0x8b, 0xd0, 0xe0,
+0x27, 0xee, 0xa0, 0x9b, 0xf0, 0xc9, 0xe,
+0xfc, 0xad, 0x8, 0x9f, 0x5e, 0x8b, 0x2d,
+0xf0, 0x45, 0x45, 0x55, 0x29, 0xd1, 0xe3,
+0xb3, 0x95, 0x81, 0x0, 0x86, 0x44, 0x36,
+0x99, 0x78, 0x3e, 0x76, 0xb7, 0xa, 0x88,
+0xda, 0xb6, 0x6f, 0xb6, 0xd2, 0xcd, 0xe0,
+0x41, 0x8d, 0x49, 0x49, 0x7b, 0x36, 0xa0,
+0x52, 0x22, 0x51, 0xa8, 0xb7, 0xd0, 0x4f,
+0x20, 0xef, 0xb, 0xf6, 0x7d, 0x6b, 0x10,
+0xde, 0x6e, 0xaf, 0xe8, 0x4a, 0xe6, 0x91,
+0xea, 0x2b, 0x7f, 0x7d, 0x97, 0x98, 0xb6,
+0xcb, 0x9a, 0x31, 0x76, 0x78, 0xeb, 0x9,
+0x10, 0xed, 0x27, 0x29, 0xcd, 0xe6, 0x34,
+0x48, 0x9e, 0xb9, 0x3f, 0x89, 0xc, 0x93,
+0x65, 0xc0, 0x5, 0x8, 0x2b, 0x5c, 0x82,
+0x77, 0x4e, 0x46, 0xdd, 0x7e, 0x5e, 0x42,
+0xe0, 0x43, 0xb8, 0x30, 0xd8, 0xb, 0xfc,
+0xab, 0xb2, 0x35, 0x55, 0x50, 0x1c, 0xfa,
+0xc6, 0x6, 0xaf, 0xff, 0xfe, 0xeb, 0x64,
+0x3, 0x5, 0x6e, 0x33, 0x19, 0x57, 0xb0,
+0x4f, 0xc6, 0x86, 0x99, 0x1b, 0x3e, 0x9c,
+0xb2, 0xb3, 0xf9, 0x2c, 0xba, 0xaf, 0xbb,
+0xe6, 0x87, 0x63, 0x2b, 0xd7, 0x22, 0xa0,
+0x79, 0xce, 0x17, 0x9f, 0x45, 0x68, 0x3b,
+0xd6, 0x55, 0xf1, 0xe0, 0x22, 0x9c, 0x25,
+0x9a, 0x5b, 0xa5, 0xd1, 0xcd, 0x8f, 0x2c,
+0x3c, 0x35, 0x93, 0x36, 0x66, 0x3a, 0x32,
+0xa1, 0x43, 0x3, 0xd4, 0xe3, 0xf3, 0xbe,
+0xdd, 0x36, 0xd7, 0x1c, 0xdb, 0xf9, 0x33,
+0xab, 0x59, 0x3c, 0x18, 0xb1, 0x79, 0xd5,
+0x24, 0x7, 0x70, 0xd0, 0x43, 0xf6, 0xf7,
+0x61, 0x72, 0xef, 0xc5, 0x8e, 0x7b, 0xd0,
+0x92, 0x7b, 0x6a, 0x4d, 0x98, 0x43, 0xf6,
+0xfa, 0xb2, 0x4d, 0xde, 0x1f, 0xbf, 0xe2,
+0x69, 0x75, 0x9d, 0x3a, 0x12, 0x24, 0xe6,
+0xf2, 0xd0, 0xb2, 0x6e, 0x35, 0x43, 0x1c,
+0x14, 0xc6, 0x7f, 0xa4, 0x5d, 0x6f, 0x80,
+0xfe, 0x64, 0x60, 0x88, 0xbe, 0x74, 0x85,
+0x88, 0x24, 0x6, 0xe2, 0xe5, 0xb5, 0xdc,
+0xc7, 0x4b, 0x16, 0xcc, 0x11, 0xec, 0xb5,
+0xbc, 0x31, 0xc8, 0xa3, 0x24, 0x13, 0x16,
+0xe6, 0xa5, 0xdb, 0x14, 0x9b, 0x75, 0x25,
+0x9, 0xc8, 0x28, 0x68, 0xa6, 0x8c, 0x7f,
+0x80, 0x5c, 0x48, 0x70, 0x47, 0x1e, 0x6a,
+0x14, 0x17, 0xbc, 0x84, 0x16, 0xb7, 0x7,
+0x5f, 0x25, 0x3a, 0x7d, 0x6f, 0x3, 0x8f,
+0xe8, 0xb7, 0x1c, 0x14, 0xff, 0x73, 0xc8,
+0xd4, 0x94, 0x3c, 0x37, 0x77, 0xec, 0x8f,
+0x95, 0xf4, 0xf3, 0x8a, 0x0, 0x4, 0x8a,
+0x3e, 0xb5, 0x77, 0xc0, 0x7b, 0x5f, 0x7b,
+0xb3, 0xe0, 0xe8, 0xd4, 0x9a, 0xfd, 0x90,
+0xb6, 0x61, 0xe7, 0x61, 0x9, 0x80, 0xfd,
+0x47, 0x68, 0xb0, 0x28, 0x92, 0x94, 0x3a,
+0x3e, 0xcd, 0x1b, 0x3e, 0xed, 0xc0, 0xc0,
+0x24, 0x14, 0x9a, 0xce, 0x32, 0x46, 0xe3,
+0x6d, 0xef, 0x29, 0xa0, 0x8b, 0x14, 0xc,
+0x8a, 0x7b, 0x2f, 0xde, 0xba, 0xb6, 0x4e,
+0xf4, 0x46, 0x39, 0xe5, 0x2c, 0x76, 0xa1,
+0x9d, 0xf2, 0x64, 0xfa, 0xbc, 0xac, 0x7a,
+0x9d, 0xef, 0x8, 0x38, 0xc, 0xaf, 0xc,
+0xff, 0xd3, 0x3a, 0x58, 0x9c, 0xdb, 0xae,
+0x7c, 0x16, 0x36, 0x45, 0xba, 0x4f, 0xd1,
+0xcf, 0xbf, 0x3a, 0x5a, 0x99, 0xf8, 0x66,
+0x65, 0x7a, 0xcb, 0x93, 0xad, 0xba, 0x40,
+0x66, 0x60, 0xb5, 0x32, 0x10, 0x88, 0xe5,
+0xd5, 0xc5, 0xfe, 0xf3, 0x18, 0xa4, 0x62,
+0xff, 0x3, 0x9, 0x9a, 0xf6, 0x13, 0x1d,
+0x1d, 0x6f, 0xa1, 0xf9, 0xa9, 0xe0, 0x21,
+0x40, 0x57, 0x59, 0x4f, 0x52, 0xa5, 0x22,
+0xb1, 0x30, 0xa8, 0xa1, 0x55, 0x5f, 0x82,
+0x2d, 0xf4, 0x58, 0x94, 0x77, 0x3f, 0x7b,
+0xaf, 0x30, 0xaf, 0x91, 0xcd, 0xb0, 0x63,
+0x60, 0x80, 0x9f, 0xf3, 0xd9, 0xb2, 0xd,
+0x15, 0xc5, 0xab, 0xa4, 0x18, 0xa5, 0x5c,
+0x9b, 0x2a, 0x3e, 0x5f, 0x52, 0x26, 0xa2,
+0x71, 0xe, 0x64, 0xcb, 0xb0, 0x59, 0x9d,
+0x1a, 0x65, 0xa4, 0x8a, 0x7, 0xcd, 0x6a,
+0x31, 0xe8, 0xf9, 0x1, 0x41, 0x7e, 0x69,
+0x98, 0x55, 0x4a, 0xee, 0xcc, 0x28, 0x35,
+0x23, 0x38, 0xd7, 0xeb, 0xe6, 0x41, 0x91,
+0x5e, 0xf8, 0xa8, 0x25, 0x67, 0x44, 0x75,
+0xd, 0xaf, 0x0, 0xff, 0x83, 0xd2, 0xd2,
+0xc2, 0xd4, 0xf7, 0xbb, 0xcd, 0x87, 0x84,
+0xe1, 0x90, 0x0, 0xfb, 0x85, 0xd1, 0x12,
+0xac, 0x36, 0x72, 0xb6, 0x57, 0xae, 0x41,
+0x47, 0x1e, 0x1, 0x5d, 0x38, 0x48, 0xb2,
+0x6e, 0xd9, 0xe4, 0xda, 0x9b, 0xba, 0xcc,
+0xf5, 0x7, 0x91, 0xf6, 0xb0, 0xe8, 0x1d,
+0x4c, 0x88, 0x6e, 0x28, 0xf2, 0x1b, 0x3d,
+0xe0, 0x33, 0xd1, 0xdd, 0x4b, 0x68, 0xd7,
+0x8f, 0xcd, 0xc9, 0x43, 0x74, 0x36, 0x69,
+0xa7, 0xe9, 0x2d, 0xa6, 0x75, 0x59, 0xb,
+0x49, 0x24, 0x27, 0xb6, 0x1d, 0xc9, 0xa,
+0x4, 0x61, 0xce, 0x6e, 0x8b, 0x0, 0x88,
+0x72, 0x46, 0x40, 0xaa, 0xc5, 0x92, 0xf2,
+0x2e, 0xf, 0x29, 0x9d, 0xc9, 0xa3, 0x5b,
+0x39, 0xe5, 0xde, 0xf1, 0x26, 0x2a, 0xd4,
+0x1a, 0x1e, 0x1c, 0x33, 0x20, 0x58, 0x6e,
+0x2b, 0xd9, 0xf4, 0x81, 0x77, 0xcd, 0x47,
+0xba, 0x98, 0x2c, 0x2f, 0xf5, 0x9, 0x8d,
+0xe5, 0xd0, 0xa2, 0x9f, 0x11, 0x4, 0xf9,
+0xc2, 0x5e, 0xe8, 0x66, 0xa9, 0x66, 0xb5,
+0xee, 0x12, 0x2d, 0x43, 0x85, 0xa3, 0x57,
+0x9a, 0x7a, 0x29, 0xc3, 0x6a, 0x65, 0xca,
+0xa2, 0x3b, 0x34, 0x84, 0x35, 0xd8, 0x39,
+0xda, 0x71, 0xb6, 0xd0, 0xda, 0xe9, 0x4,
+0x3e, 0x95, 0x3, 0x72, 0x6e, 0x4b, 0x4d,
+0x58, 0x97, 0x1b, 0x4c, 0x31, 0xb2, 0x5d,
+0xf, 0x3b, 0x44, 0x4, 0x0, 0x8c, 0x9f,
+0xfa, 0x40, 0x3d, 0x8f, 0xa4, 0x70, 0x4b,
+0x38, 0x69, 0xcf, 0x4f, 0xc, 0xd5, 0xc7,
+0x2a, 0x24, 0xec, 0xb6, 0x5d, 0x6, 0xcd,
+0x69, 0x88, 0x41, 0x27, 0x37, 0xc3, 0x23,
+0x43, 0x87, 0x28, 0x70, 0x31, 0x74, 0x77,
+0x8b, 0xca, 0x4b, 0x73, 0x4a, 0x33, 0xbb,
+0xb7, 0xa0, 0x68, 0xe6, 0x27, 0x1e, 0x6d,
+0xc5, 0xf5, 0x49, 0x74, 0x5e, 0x7c, 0xbe,
+0xb1, 0x25, 0x5b, 0x2, 0x91, 0x8f, 0xde,
+0x35, 0x5d, 0x5b, 0xfd, 0xc0, 0xe0, 0x3d,
+0x7e, 0x5b, 0x56, 0x1a, 0x15, 0x77, 0x69,
+0x1, 0x7b, 0x2d, 0x4e, 0x86, 0xb9, 0x1b,
+0x5a, 0x1d, 0xc4, 0x4e, 0x7f, 0x5, 0x31,
+0x58, 0x2c, 0xf5, 0xdd, 0xeb, 0xb8, 0x2d,
+0x4e, 0x5c, 0xa2, 0xc0, 0x94, 0x60, 0xde,
+0xc0, 0x2c, 0xb7, 0x1b, 0x9d, 0xff, 0x15,
+0x99, 0x9d, 0x34, 0x84, 0x8e, 0xf8, 0x32,
+0xa, 0xb4, 0xc3, 0xe4, 0x8c, 0xf6, 0x9e,
+0x5f, 0xc1, 0xde, 0x71, 0x85, 0xe7, 0xc8,
+0x8f, 0x77, 0x5b, 0xf4, 0x69, 0x50, 0xcf,
+0x86, 0xda, 0x9a, 0x52, 0x11, 0x1e, 0x9d,
+0x93, 0xb2, 0xb7, 0x5, 0x4a, 0x3b, 0xf3,
+0x30, 0xd9, 0x6d, 0xe0, 0x6f, 0x50, 0x28,
+0xcd, 0x8, 0x1a, 0x99, 0x3e, 0x7e, 0xd3,
+0x90, 0x97, 0x66, 0xb9, 0x3a, 0x97, 0xb2,
+0xb5, 0xea, 0x6d, 0x28, 0xa9, 0x35, 0x50,
+0x0, 0x12, 0x94, 0xc5, 0xd3, 0xcc, 0x4b,
+0x52, 0x7d, 0x2a, 0x2e, 0x92, 0x19, 0xde,
+0x61, 0xf8, 0x21, 0x33, 0x13, 0xc5, 0x3,
+0x7f, 0x33, 0x3, 0x13, 0x2e, 0xa7, 0x9f,
+0x38, 0xe9, 0x5c, 0xd, 0xa3, 0xda, 0x4f,
+0xd9, 0xb3, 0x5f, 0x9, 0xdd, 0x58, 0xa2,
+0x80, 0x20, 0x89, 0x30, 0x14, 0x34, 0xb5,
+0x5, 0x71, 0x84, 0x25, 0x68, 0x24, 0x37,
+0x30, 0x53, 0x19, 0xa1, 0xe0, 0xac, 0x52,
+0x65, 0x49, 0x5e, 0x3b, 0xca, 0xcc, 0xb7,
+0xc3, 0xe2, 0xce, 0xfb, 0x90, 0x42, 0x1e,
+0xbe, 0x94, 0xb0, 0xa1, 0x19, 0x8f, 0xde,
+0x5, 0xde, 0x69, 0x16, 0x39, 0x72, 0x4e,
+0x94, 0x45, 0x6a, 0xe4, 0xf1, 0x30, 0x25,
+0xc1, 0xd5, 0xf, 0xcb, 0xe7, 0xa1, 0x31,
+0x66, 0x4b, 0xae, 0x36, 0x7b, 0xfd, 0x88,
+0x48, 0x25, 0x44, 0xd7, 0x85, 0xeb, 0xce,
+0xcd, 0x2b, 0xec, 0x63, 0x82, 0xbf, 0xc5,
+0x17, 0xb9, 0x5, 0xb, 0x14, 0x9, 0x1f,
+0x98, 0xb6, 0x6, 0x38, 0xc8, 0x20, 0x58,
+0x4, 0xc7, 0xf8, 0x95, 0xc8, 0xaa, 0xee,
+0x1f, 0x88, 0x2f, 0xc1, 0x3f, 0x4f, 0x3d,
+0x7b, 0x4a, 0xdd, 0xfc, 0x11, 0x2a, 0xaf,
+0x11, 0xd, 0xbf, 0xe6, 0xd3, 0xa3, 0x2c,
+0xd1, 0x2b, 0xb9, 0x7a, 0xaa, 0xad, 0xc6,
+0x2d, 0xbb, 0x22, 0x84, 0x98, 0x2, 0x4d,
+0x1f, 0x37, 0x6b, 0x86, 0xd7, 0xdd, 0xbc,
+0x1f, 0x69, 0x44, 0x87, 0x70, 0xe, 0x3f,
+0x4e, 0xe, 0x76, 0xdb, 0x18, 0x4a, 0x8e,
+0x3d, 0x65, 0x3b, 0xae, 0x7e, 0xca, 0x6c,
+0x8d, 0x7f, 0x6a, 0xf9, 0x38, 0xf6, 0x25,
+0x55, 0xc1, 0xd8, 0x4c, 0xd0, 0xb6, 0x2c,
+0x8e, 0x15, 0xa, 0x88, 0x63, 0xd3, 0xda,
+0xda, 0xab, 0xf3, 0x22, 0x9d, 0xd1, 0x26,
+0x1b, 0x13, 0x3d, 0x9d, 0x90, 0x3b, 0xd6,
+0xb9, 0x92, 0xfd, 0x21, 0x5f, 0xb2, 0xb8,
+0xe6, 0xa6, 0xd7, 0xb9, 0x29, 0x13, 0x5e,
+0xa3, 0x22, 0x1c, 0x31, 0xc2, 0xd6, 0xd7,
+0xa9, 0x5a, 0x14, 0xf6, 0x4, 0x7f, 0xba,
+0x92, 0x49, 0x41, 0x4c, 0x14, 0xb1, 0xe,
+0x26, 0xc0, 0x6c, 0xa9, 0xe3, 0x8c, 0xf7,
+0xd3, 0xa8, 0x1f, 0x2, 0xd6, 0xc0, 0x1a,
+0xf1, 0x5f, 0x7e, 0xd2, 0x13, 0xb5, 0xd2,
+0xb1, 0xf9, 0x44, 0x57, 0x9d, 0xd1, 0x1d,
+0xb6, 0x55, 0x20, 0x2a, 0x68, 0x52, 0xaf,
+0xa9, 0x6e, 0x28, 0x41, 0x9, 0x2b, 0xe8,
+0x49, 0x6d, 0x13, 0x32, 0x83, 0xd8, 0x1d,
+0x86, 0xf2, 0x73, 0x53, 0xcb, 0x89, 0x92,
+0xf1, 0xd8, 0x8e, 0xab, 0xab, 0xce, 0x32,
+0xe5, 0x8e, 0xda, 0xab, 0xbe, 0xcd, 0x8b,
+0x9c, 0xe0, 0xd0, 0x23, 0xfc, 0x1e, 0x1f,
+0xf9, 0x94, 0x4f, 0x26, 0xa2, 0x86, 0xfe,
+0x26, 0x50, 0x51, 0xf6, 0xdd, 0x1b, 0x7f,
+0x7c, 0x13, 0xe8, 0xcc, 0x91, 0x77, 0x1f,
+0xe7, 0xc0, 0x54, 0x2a, 0xe9, 0x60, 0xf3,
+0x8b, 0x8e, 0x58, 0x2a, 0x24, 0x15, 0x0,
+0x48, 0xa3, 0x9c, 0x68, 0xa3, 0x6a, 0x21,
+0x89, 0xf1, 0x62, 0x92, 0xa8, 0x78, 0x18,
+0x3e, 0x95, 0x62, 0x2b, 0xfa, 0x76, 0xa1,
+0xa1, 0xfb, 0xed, 0x16, 0x89, 0xef, 0x74,
+0xbb, 0x16, 0xef, 0x78, 0x9c, 0x4, 0xb2,
+0x51, 0xe1, 0x15, 0x5f, 0xf3, 0xd5, 0x21,
+0xf8, 0x54, 0x76, 0xfd, 0xda, 0xd9, 0x70,
+0x81, 0xd2, 0x45, 0x29, 0x8, 0xf8, 0xfd,
+0x21, 0x56, 0x82, 0x59, 0x5, 0x70, 0x29,
+0xe9, 0x1, 0x55, 0xb6, 0xc5, 0x53, 0xee,
+0x30, 0x18, 0xa7, 0xae, 0x9f, 0xc4, 0x2c,
+0xd, 0x4d, 0x13, 0x9, 0x48, 0xde, 0x91,
+0xcf, 0x3, 0xdd, 0xf5, 0xe8, 0xb3, 0x50,
+0x82, 0x99, 0x75, 0x83, 0x72, 0x55, 0xb2,
+0x6b, 0x95, 0x1e, 0xeb, 0x5a, 0x2c, 0xd1,
+0xc3, 0x38, 0xc8, 0xd5, 0x5f, 0x2d, 0x3e,
+0xd9, 0xc, 0xea, 0xc7, 0xb8, 0x5c, 0x9,
+0x24, 0x21, 0xbd, 0x2a, 0x31, 0x75, 0x94,
+0xe7, 0x8, 0x35, 0x25, 0x5a, 0xf, 0x25,
+0x59, 0xfe, 0xf7, 0x96, 0x75, 0x5b, 0xd1,
+0xd6, 0x91, 0x3b, 0xcf, 0x6d, 0x5f, 0xbd,
+0x40, 0x59, 0x5e, 0xbe, 0xde, 0xf, 0x36,
+0x97, 0x85, 0x9e, 0xa6, 0x95, 0xf6, 0xa0,
+0x18, 0x44, 0xaf, 0x56, 0x8c, 0x65, 0x48,
+0x81, 0x91, 0xfe, 0x87, 0x60, 0x7, 0xa9,
+0x91, 0xb7, 0xed, 0xb5, 0x7c, 0x63, 0x1d,
+0x84, 0x51, 0xd7, 0x15, 0x0, 0xda, 0xa0,
+0x39, 0x96, 0xb6, 0x4d, 0x3a, 0x3c, 0x7b,
+0xd9, 0xe3, 0x7a, 0x6, 0x31, 0x62, 0x17,
+0xfe, 0x84, 0x5f, 0x59, 0xed, 0xa2, 0x45,
+0x6, 0xda, 0x41, 0xa9, 0x0, 0xca, 0x60,
+0x62, 0x77, 0x27, 0xdf, 0x9a, 0xa, 0x64,
+0xc4, 0x7d, 0xbe, 0x8, 0x98, 0x6b, 0xd7,
+0x67, 0xe1, 0xca, 0x90, 0x24, 0xc4, 0x34,
+0xa5, 0x84, 0x9f, 0xc9, 0xa, 0xdd, 0x36,
+0xd1, 0x58, 0x94, 0xcf, 0x68, 0xf7, 0x4b,
+0xfd, 0x1f, 0x9a, 0x7f, 0xc0, 0x9c, 0xa0,
+0x63, 0x5d, 0x3f, 0x27, 0x60, 0x33, 0x13,
+0xef, 0x6d, 0x58, 0xd8, 0x9d, 0x75, 0xfc,
+0x9d, 0x73, 0x89, 0xb3, 0x4, 0x8, 0xe,
+0x79, 0x8f, 0xe8, 0xfa, 0xde, 0xd8, 0x94,
+0x21, 0x97, 0x22, 0x37, 0x2b, 0xdb, 0xe9,
+0x2, 0x9f, 0x7, 0xa7, 0xe4, 0xad, 0x79,
+0x51, 0xe3, 0xcd, 0x92, 0xeb, 0x72, 0x1b,
+0xf1, 0x3d, 0x3f, 0xf4, 0x16, 0xa3, 0x40,
+0x50, 0x2, 0x8f, 0xcf, 0x2, 0xfc, 0x33,
+0x61, 0x11, 0xea, 0xfb, 0x37, 0x1, 0xbe,
+0xa1, 0xc6, 0xee, 0xe8, 0x37, 0x84, 0xd1,
+0x9c, 0xfe, 0xbf, 0x23, 0x98, 0x60, 0xb3,
+0x49, 0x71, 0x1e, 0xfa, 0xbf, 0x90, 0x73,
+0x8f, 0x41, 0xc0, 0xef, 0x70, 0x46, 0xa2,
+0x9d, 0x4c, 0x22, 0x92, 0x90, 0xae, 0xd8,
+0xee, 0x2a, 0xe2, 0x24, 0xfa, 0x75, 0xe7,
+0x63, 0x1a, 0xaa, 0xfa, 0xcf, 0xdc, 0x54,
+0x1f, 0x73, 0x63, 0xe3, 0xf9, 0x5e, 0x73,
+0xff, 0x11, 0xd2, 0x39, 0x1a, 0xa, 0x38,
+0x56, 0x3e, 0xa0, 0xaa, 0xf6, 0x72, 0x4c,
+0x36, 0x1a, 0xf, 0xd7, 0xe2, 0x91, 0x46,
+0xe6, 0xaa, 0xe2, 0xdc, 0x3f, 0xf0, 0xac,
+0x0, 0x98, 0x32, 0xcc, 0x3a, 0x4a, 0xa8,
+0xab, 0x8b, 0xa6, 0xfd, 0x59, 0xd, 0xed,
+0x1, 0xc7, 0xee, 0x38, 0x80, 0xb3, 0x52,
+0x9e, 0x8, 0x69, 0x44, 0xf9, 0x7, 0x4b,
+0xf6, 0xf7, 0xb4, 0x34, 0xa8, 0xa1, 0xfa,
+0x36, 0xf2, 0x96, 0xf0, 0xf5, 0xc4, 0x8f,
+0x29, 0x80, 0x8c, 0x3e, 0xa1, 0x15, 0x6a,
+0xb6, 0x33, 0xfe, 0x91, 0x4a, 0x4d, 0x8c,
+0x5f, 0x8, 0xdf, 0x5c, 0xb3, 0xda, 0x4b,
+0xb3, 0xa5, 0xad, 0xcb, 0xec, 0x19, 0xc9,
+0xf0, 0xe2, 0x93, 0xc9, 0x1f, 0x5f, 0xc3,
+0xed, 0x9d, 0x3f, 0x52, 0x20, 0x4a, 0x5a,
+0x10, 0x46, 0x72, 0xc8, 0x1, 0xa7, 0x43,
+0xed, 0x58, 0x87, 0xd4, 0x96, 0xf1, 0x61,
+0xea, 0xce, 0xbd, 0x42, 0xa3, 0x1c, 0xf,
+0x67, 0xb6, 0xb5, 0x75, 0xe6, 0x7a, 0xad,
+0x70, 0x9f, 0x25, 0x99, 0x0, 0xd3, 0x19,
+0x15, 0xc4, 0x17, 0xe0, 0xe6, 0xb1, 0x81,
+0xbc, 0xd9, 0x34, 0xc4, 0x96, 0x9e, 0x6,
+0xf4, 0x89, 0xfe, 0x28, 0xac, 0x51, 0x8,
+0x1c, 0x60, 0x1b, 0x5, 0x8b, 0x1b, 0x79,
+0x2, 0x74, 0xb9, 0xa7, 0x55, 0x6f, 0x7a,
+0x94, 0xc7, 0x5a, 0x84, 0x6d, 0x6a, 0x3e,
+0x19, 0xe, 0xd1, 0xe9, 0x76, 0xf5, 0x5d,
+0x6a, 0x7e, 0x3c, 0x3c, 0x3b, 0xb3, 0x73,
+0x28, 0x5a, 0x89, 0xa2, 0x33, 0x42, 0x67,
+0xf, 0xd, 0x33, 0x1a, 0x1a, 0xf6, 0xfe,
+0x3c, 0x3a, 0xf2, 0xd7, 0x6d, 0x67, 0x40,
+0xfc, 0x70, 0xde, 0xc1, 0xf6, 0x46, 0xa2,
+0x36, 0xde, 0xb1, 0x19, 0x2a, 0x3e, 0x39,
+0xb, 0xa7, 0xf9, 0x42, 0x69, 0xc0, 0xd9,
+0xfc, 0xfb, 0x56, 0xe7, 0x73, 0x3e, 0xf8,
+0xd8, 0x92, 0xe7, 0xfa, 0xe, 0x6c, 0x9d,
+0x81, 0x2, 0x7f, 0xe6, 0x2f, 0x1e, 0x6f,
+0x59, 0x81, 0x7c, 0xe8, 0x10, 0x34, 0x76,
+0x4, 0x57, 0x56, 0xed, 0x15, 0x20, 0x4b,
+0x4e, 0x16, 0x2c, 0x99, 0x57, 0xdb, 0xd,
+0x18, 0xf7, 0xaa, 0xd3, 0x89, 0x24, 0x50,
+0x18, 0x32, 0xf, 0x75, 0xea, 0x10, 0x5,
+0xe9, 0x1b, 0xfb, 0x6c, 0x6c, 0xf, 0xf1,
+0x27, 0x83, 0x1f, 0x13, 0x91, 0x69, 0xe7,
+0x9f, 0x60, 0xc4, 0x93, 0x7c, 0xe0, 0x37,
+0x30, 0x8b, 0x4b, 0xb1, 0xd9, 0x4f, 0x82,
+0x4c, 0xa9, 0xce, 0x1d, 0xc9, 0x48, 0x2f,
+0xcc, 0x21, 0x1b, 0x8c, 0x6a, 0xc1, 0xa,
+0xa5, 0x44, 0x57, 0x98, 0xec, 0x10, 0x1d,
+0xd7, 0x5f, 0xf3, 0x53, 0x76, 0x96, 0x6c,
+0xe2, 0x46, 0x38, 0xac, 0x47, 0xb7, 0x77,
+0xc9, 0x49, 0xaa, 0xae, 0xe7, 0xab, 0x20,
+0xaa, 0x8e, 0x2a, 0x58, 0x5a, 0x80, 0xe3,
+0x88, 0xde, 0x7, 0x1c, 0x3, 0xfd, 0xe6,
+0x69, 0x29, 0x16, 0xc6, 0x2d, 0xa7, 0x12,
+0x66, 0xb2, 0x3f, 0x8a, 0xb0, 0x74, 0xb1,
+0x0, 0x3c, 0x4d, 0xd9, 0x6b, 0x12, 0xf9,
+0xbf, 0x4e, 0xda, 0x29, 0x32, 0x27, 0xd5,
+0x5b, 0x9a, 0xb9, 0xc5, 0x2b, 0x58, 0x78,
+0x6c, 0x4, 0x5a, 0xb, 0xa1, 0x16, 0xb9,
+0xc1, 0x27, 0xb6, 0x93, 0x7c, 0x74, 0x52,
+0x53, 0xa, 0xec, 0x63, 0x67, 0x62, 0x8a,
+0x3a, 0xf1, 0x6d, 0x73, 0x32, 0x4e, 0x93,
+0x2a, 0xce, 0x1f, 0x32, 0x9e, 0xa6, 0x5e,
+0xa9, 0xcc, 0xd3, 0xe0, 0x30, 0x29, 0x85,
+0x36, 0x13, 0xe9, 0xdd, 0x8a, 0x26, 0x78,
+0xe8, 0xa2, 0x8d, 0xd3, 0xf9, 0xf2, 0x14,
+0xf4, 0xb0, 0x55, 0x8f, 0x6e, 0x93, 0x90,
+0x70, 0x42, 0xaa, 0x93, 0x7c, 0xaa, 0x3c,
+0x14, 0xee, 0x2c, 0xa6, 0x4c, 0x79, 0x5d,
+0xd1, 0x15, 0xcb, 0x18, 0x45, 0x2c, 0x15,
+0x4d, 0x96, 0x9a, 0x8, 0xec, 0xde, 0xfb,
+0xa6, 0x26, 0x64, 0xcd, 0x3f, 0x85, 0x46,
+0xa6, 0x20, 0xe7, 0x1b, 0xc4, 0xa1, 0xe4,
+0xbf, 0x57, 0x40, 0x8d, 0x12, 0x2b, 0x8,
+0x88, 0xa3, 0x7a, 0x7d, 0x82, 0xfa, 0xc4,
+0xe3, 0x5b, 0xa6, 0x55, 0x63, 0xec, 0x7c,
+0x23, 0xd0, 0xbc, 0x9a, 0xbb, 0x1b, 0xce,
+0x21, 0x6a, 0x92, 0xf, 0xa3, 0xd2, 0xcd,
+0x93, 0x74, 0x81, 0x2a, 0xa0, 0x26, 0xde,
+0xf1, 0x70, 0x5b, 0x7e, 0xbf, 0x2b, 0xc3,
+0x91, 0x8a, 0xbf, 0xfb, 0xa0, 0xf, 0x10,
+0x4, 0x9e, 0xa5, 0xad, 0xdd, 0xbd, 0x90,
+0xe, 0x3f, 0xbb, 0xc4, 0xc0, 0xb3, 0xc6,
+0x15, 0x8a, 0xb2, 0x0, 0x6a, 0xcc, 0x4e,
+0x7c, 0xca, 0x21, 0x51, 0x63, 0xb6, 0xc2,
+0x71, 0x38, 0xf6, 0x5f, 0x50, 0x91, 0xab,
+0x87, 0xd3, 0xb9, 0xad, 0x44, 0x37, 0x3d,
+0x2e, 0x93, 0x43, 0xd2, 0x5b, 0xcd, 0xa9,
+0x8c, 0xec, 0xfb, 0xcc, 0x49, 0xb0, 0xa9,
+0x77, 0x66, 0x12, 0x15, 0x6, 0xbd, 0x43,
+0x86, 0x6c, 0x2a, 0xeb, 0x62, 0x58, 0x25,
+0xa5, 0x23, 0xaf, 0xe2, 0x4, 0x7a, 0x61,
+0xb8, 0x25, 0x3a, 0x4, 0x39, 0xe3, 0x15,
+0x10, 0x1e, 0x8d, 0x4a, 0x42, 0x5f, 0x81,
+0xe2, 0xac, 0x28, 0x4a, 0x25, 0x35, 0x5,
+0xb7, 0x20, 0xab, 0xbb, 0xc4, 0x45, 0xef,
+0xc4, 0xf7, 0xf1, 0x41, 0xf9, 0x58, 0x3a,
+0x67, 0x14, 0xba, 0xc3, 0x76, 0x41, 0x58,
+0x8, 0x6f, 0x90, 0x6e, 0xe0, 0x51, 0x19,
+0xf, 0x94, 0x60, 0x7c, 0x8, 0x81, 0xd4,
+0xc9, 0xbc, 0x7, 0xfd, 0x2b, 0xf2, 0xa8,
+0x1b, 0xfa, 0x4a, 0xe5, 0x3d, 0xf3, 0xe7,
+0x84, 0xff, 0x9e, 0xee, 0x44, 0xb8, 0xee,
+0xbb, 0xd0, 0xd5, 0xfb, 0xc9, 0xd7, 0x7c,
+0xc8, 0x28, 0xd2, 0x2c, 0x46, 0x3f, 0xee,
+0xd3, 0x7, 0x5c, 0xed, 0x50, 0x3a, 0x92,
+0x6e, 0xd, 0xdf, 0x75, 0x55, 0x2f, 0xf8,
+0x46, 0x58, 0x17, 0x0, 0x94, 0xc9, 0x1d,
+0xc, 0x96, 0xee, 0x44, 0x33, 0xcc, 0x7d,
+0xf7, 0xd3, 0x52, 0x4d, 0x92, 0x66, 0x4e,
+0xdd, 0xe1, 0x18, 0xa3, 0x94, 0xae, 0x82,
+0x6d, 0x80, 0x75, 0xc1, 0x65, 0x42, 0x3f,
+0xc8, 0x96, 0x2c, 0xb, 0xb, 0x7b, 0x18,
+0x65, 0x90, 0x57, 0xc6, 0x22, 0x38, 0xf2,
+0xce, 0x5, 0x9e, 0xd6, 0xcc, 0x7d, 0x7b,
+0x75, 0x90, 0x4e, 0xda, 0xd, 0x28, 0x63,
+0xea, 0x8c, 0xd6, 0x8a, 0x8a, 0x74, 0x38,
+0x61, 0xf7, 0xbd, 0xd, 0x5b, 0x5f, 0x50,
+0x70, 0x23, 0x78, 0x2b, 0xc5, 0xb1, 0x2c,
+0xac, 0x26, 0x37, 0xf9, 0xf1, 0xa8, 0x95,
+0x74, 0xb7, 0x2d, 0xf3, 0xeb, 0xb4, 0x78,
+0x9e, 0xfe, 0xd5, 0x7c, 0xad, 0xd1, 0x18,
+0x26, 0xb5, 0x84, 0x64, 0x6f, 0x80, 0xc,
+0x9a, 0xe9, 0x9, 0xbc, 0x47, 0x26, 0x88,
+0x52, 0x95, 0x3c, 0xab, 0x4d, 0x8, 0x42,
+0x81, 0x69, 0x3, 0xd8, 0xf4, 0x31, 0x9a,
+0x2f, 0x3, 0xa3, 0xcc, 0x1f, 0xb4, 0x11,
+0xd1, 0x82, 0x7, 0xa7, 0x93, 0xac, 0xb2,
+0x8b, 0x7, 0xba, 0x46, 0x67, 0x6a, 0x2c,
+0xde, 0x62, 0x53, 0x15, 0xd1, 0x70, 0x6d,
+0x9, 0x30, 0xa9, 0xf, 0xb3, 0x3d, 0x8b,
+0xb1, 0xc, 0xd6, 0x88, 0xcd, 0xa6, 0xf4,
+0xee, 0x22, 0xc0, 0x1a, 0x18, 0x1b, 0x42,
+0xbc, 0x34, 0xb1, 0x57, 0x48, 0x9, 0x5b,
+0x5b, 0xb1, 0x7, 0xfb, 0x45, 0x97, 0x8e,
+0x25, 0x40, 0x2, 0xd8, 0xaa, 0x64, 0x6f,
+0x8c, 0xa, 0xd7, 0xfd, 0x4c, 0xad, 0x35,
+0x97, 0xc5, 0xbe, 0xf9, 0x3d, 0x86, 0x15,
+0x3c, 0x7c, 0xd9, 0x72, 0x8, 0x6b, 0xdf,
+0xff, 0x30, 0x32, 0x94, 0x23, 0xa7, 0x71,
+0x27, 0x39, 0xa6, 0x16, 0x75, 0x4f, 0x6a,
+0x45, 0x51, 0x74, 0xcc, 0xe7, 0xfe, 0xa2,
+0x7d, 0xf8, 0xe8, 0x2e, 0x1d, 0x8c, 0xe9,
+0xba, 0xca, 0x89, 0xc4, 0x29, 0x1c, 0x9a,
+0x24, 0x4f, 0x50, 0xe5, 0x2c, 0x55, 0x12,
+0x9, 0x17, 0xae, 0x75, 0x31, 0xac, 0x2,
+0x86, 0x1f, 0x85, 0xf4, 0x1d, 0x5c, 0x3,
+0x13, 0x3f, 0xe0, 0x12, 0xdb, 0xfc, 0x6d,
+0x7c, 0x30, 0xfd, 0x53, 0x56, 0xbe, 0x14,
+0xce, 0x19, 0x19, 0xab, 0x43, 0x62, 0xcd,
+0xd7, 0x4b, 0x24, 0x11, 0xc7, 0x6a, 0x80,
+0xe7, 0xcb, 0x98, 0x47, 0x79, 0x8a, 0xf,
+0x72, 0x5b, 0xd2, 0xf8, 0xf7, 0x10, 0x3e,
+0x21, 0xfa, 0x37, 0xdf, 0xe3, 0xa6, 0xfb,
+0x21, 0x47, 0xf4, 0x95, 0x9a, 0x88, 0xe3,
+0x51, 0x82, 0x5c, 0xa6, 0xe0, 0x24, 0xf4,
+0x5f, 0x74, 0x25, 0x24, 0x78, 0x81, 0xe7,
+0x3d, 0x37, 0x1c, 0xda, 0xbc, 0x0, 0x46,
+0x86, 0x3a, 0x7d, 0x36, 0xe5, 0x35, 0x6d,
+0xdc, 0x6d, 0x64, 0xbf, 0xe1, 0x26, 0x7b,
+0x5c, 0xb0, 0xe5, 0x75, 0xd3, 0xcd, 0x4c,
+0x12, 0xf, 0x0, 0x3e, 0x2d, 0x8a, 0x9e,
+0xc, 0xa6, 0xb1, 0xf1, 0x18, 0xc3, 0x74,
+0xc5, 0xc2, 0xf7, 0xdb, 0xc4, 0x70, 0xf,
+0x21, 0x41, 0xa5, 0xb7, 0x67, 0x16, 0x2f,
+0xef, 0xd6, 0x3c, 0xa5, 0x96, 0xa7, 0xb8,
+0x5c, 0x87, 0x39, 0x4e, 0x85, 0xbc, 0x80,
+0xdd, 0x66, 0x5b, 0xa7, 0xfc, 0x53, 0xb3,
+0x1c, 0x14, 0xae, 0xb9, 0xd4, 0xef, 0xce,
+0x7b, 0xb5, 0x10, 0x89, 0x7e, 0xd2, 0xc9,
+0xb4, 0x6b, 0xfe, 0xb5, 0x9d, 0x35, 0xf2,
+0x6f, 0xb6, 0x79, 0xfb, 0x5, 0x7, 0x6e,
+0xdc, 0x8e, 0xa8, 0x2f, 0xdf, 0x73, 0x87,
+0xed, 0x33, 0x14, 0x4e, 0xbb, 0x88, 0x68,
+0x3c, 0x82, 0x44, 0x3b, 0xce, 0xba, 0xa8,
+0x72, 0xf5, 0x3e, 0xdd, 0xcc, 0x48, 0x9,
+0xe, 0xfe, 0xb3, 0x3, 0x1f, 0xd9, 0x4,
+0x85, 0xbc, 0x2, 0xa7, 0x84, 0x3d, 0xc2,
+0x4d, 0xf0, 0x1d, 0x14, 0x6b, 0xd0, 0x99,
+0xb3, 0xe, 0x7b, 0xdd, 0xdd, 0x82, 0xd6,
+0x9b, 0xf8, 0x8c, 0xf8, 0x9e, 0xf8, 0x3,
+0x10, 0x49, 0xfb, 0x24, 0x5d, 0xe2, 0x35,
+0xc3, 0xb1, 0x50, 0xdc, 0x53, 0xd2, 0xa3,
+0xce, 0xa1, 0xc5, 0x75, 0x4b, 0x9e, 0x63,
+0x7a, 0xd3, 0x1f, 0x6d, 0x4c, 0xb0, 0xee,
+0x16, 0x90, 0x1a, 0x51, 0x59, 0x8, 0x9a,
+0xd8, 0x3, 0xac, 0x6b, 0x0, 0xb8, 0x71,
+0xb7, 0x26, 0xc8, 0x14, 0x35, 0xe, 0x99,
+0x27, 0xd5, 0x36, 0xd2, 0xee, 0x6c, 0xf,
+0xed, 0x7a, 0x29, 0x89, 0xeb, 0x1c, 0x60,
+0x73, 0xd8, 0x50, 0x4d, 0x4a, 0x74, 0x30,
+0xa0, 0x85, 0xe4, 0x52, 0x59, 0x56, 0xca,
+0xcf, 0xa4, 0xad, 0x80, 0x59, 0x57, 0x13,
+0xae, 0xd7, 0x99, 0x26, 0x7a, 0x7d, 0xbe,
+0xbf, 0xf7, 0xf2, 0x30, 0xc9, 0xc2, 0x12,
+0xd6, 0x54, 0x53, 0x9d, 0x2e, 0xca, 0x56,
+0x4d, 0xc0, 0xff, 0x8d, 0x24, 0xe8, 0x5e,
+0x4b, 0x97, 0xb, 0x27, 0x77, 0x5a, 0x60,
+0x2e, 0x72, 0x36, 0xdb, 0xde, 0x48, 0x27,
+0x7c, 0xe4, 0xb2, 0xed, 0x38, 0xf8, 0x13,
+0x9e, 0xfd, 0x5c, 0x48, 0xf, 0x6f, 0x6e,
+0x74, 0xd6, 0x69, 0x2, 0x9b, 0x54, 0xec,
+0xda, 0xc9, 0x8f, 0x77, 0xa0, 0x49, 0x42,
+0x1, 0x74, 0x2, 0x6, 0x17, 0x5e, 0x85,
+0x9e, 0x85, 0x13, 0x5f, 0x12, 0x2e, 0xf4,
+0xd, 0xcc, 0x7f, 0x41, 0xdc, 0xd5, 0xa2,
+0xd6, 0x4a, 0x1e, 0x16, 0xd5, 0xdf, 0x39,
+0xd2, 0x36, 0x43, 0x1d, 0x8f, 0xb5, 0xc5,
+0x90, 0x71, 0xec, 0xb1, 0x9e, 0x32, 0x54,
+0xb2, 0x2e, 0x10, 0xe4, 0x92, 0x21, 0x79,
+0x3b, 0xa2, 0x25, 0xf0, 0x49, 0x19, 0xb5,
+0xf4, 0x8c, 0xff, 0xf2, 0x85, 0x81, 0xc0,
+0x53, 0xc8, 0xa8, 0x8e, 0x61, 0x7d, 0x50,
+0xd4, 0x3a, 0x6a, 0x7b, 0x9f, 0xb2, 0xd9,
+0x7b, 0xf6, 0x8a, 0xe4, 0x6, 0x70, 0xe6,
+0x6e, 0xb9, 0x78, 0x26, 0x9b, 0x9c, 0xcd,
+0x90, 0x27, 0xdc, 0xed, 0xc4, 0xd6, 0x93,
+0xd0, 0x89, 0xe4, 0xd0, 0x15, 0x77, 0x24,
+0x4d, 0x64, 0x81, 0x60, 0xa8, 0x8a, 0xd7,
+0xfd, 0xd6, 0x4c, 0x47, 0x27, 0xf7, 0x9,
+0xea, 0xa1, 0xfa, 0x1c, 0x75, 0x6f, 0xe5,
+0xf4, 0xdb, 0xa6, 0xa6, 0xc4, 0xa1, 0xc0,
+0x40, 0x4d, 0x46, 0xa5, 0xc1, 0x66, 0xc1,
+0x1b, 0x1, 0x2b, 0x9e, 0x91, 0xd4, 0xb8,
+0x68, 0xa0, 0x24, 0x2a, 0x1c, 0x37, 0x42,
+0x4b, 0xd8, 0x3b, 0x7f, 0x4e, 0x1d, 0x4e,
+0xb, 0x5f, 0x6a, 0x17, 0xfa, 0xb8, 0x21,
+0x88, 0x87, 0x58, 0x42, 0x77, 0x86, 0xea,
+0x3, 0xf, 0xf2, 0x15, 0x95, 0xf3, 0x16,
+0xf1, 0x8e, 0xee, 0x95, 0xba, 0x7d, 0x75,
+0x8c, 0xd0, 0x4e, 0x63, 0x2, 0x1a, 0xc6,
+0x5e, 0x1, 0x20, 0x44, 0xd7, 0x21, 0x43,
+0x40, 0xd9, 0xd1, 0x82, 0xa9, 0x23, 0x4c,
+0x68, 0x88, 0x94, 0xfa, 0x47, 0x56, 0x45,
+0x31, 0x58, 0x2c, 0x1c, 0x6e, 0x56, 0x31,
+0x37, 0x10, 0x6b, 0x2e, 0xda, 0xac, 0x69,
+0x8c, 0xd2, 0x7a, 0x66, 0x8d, 0xa5, 0x26,
+0x1f, 0xf6, 0x3e, 0xe0, 0x1, 0xb0, 0x7,
+0xe1, 0xd9, 0xff, 0x8c, 0x4b, 0x8e, 0x17,
+0x1b, 0xcc, 0x47, 0x76, 0xed, 0xbd, 0xd6,
+0x94, 0x21, 0xb7, 0x8f, 0x5e, 0xb4, 0x1c,
+0xd1, 0x49, 0x83, 0x25, 0x6f, 0x63, 0xe8,
+0x28, 0xa5, 0x51, 0xd7, 0xdb, 0x82, 0x9f,
+0xd9, 0xb1, 0x32, 0x38, 0xa5, 0xd0, 0x59,
+0x2d, 0x97, 0xd, 0xb5, 0x14, 0xe5, 0x2f,
+0xb9, 0xb2, 0x2a, 0xb, 0x96, 0xf6, 0x77,
+0x86, 0xf3, 0xa9, 0xe0, 0x96, 0x76, 0x1f,
+0x66, 0xc0, 0x78, 0xff, 0xd1, 0x26, 0xfb,
+0xe7, 0x94, 0x81, 0x72, 0xe9, 0xdd, 0xa4,
+0x1a, 0x7a, 0xdc, 0x95, 0x9e, 0x2c, 0x6d,
+0x41, 0xfb, 0x3c, 0x67, 0x66, 0xa5, 0xa,
+0x84, 0x43, 0xb8, 0x80, 0x45, 0x54, 0xd9,
+0x69, 0x70, 0x93, 0x52, 0xaf, 0xbb, 0xe7,
+0xd4, 0x39, 0x22, 0xd5, 0x40, 0xa2, 0xf7,
+0xee, 0x21, 0xe8, 0x8e, 0x81, 0xb6, 0x33,
+0x12, 0x72, 0x7, 0x70, 0x7c, 0x52, 0x9a,
+0x62, 0xd1, 0x52, 0x33, 0x51, 0x11, 0x7f,
+0x1c, 0x9f, 0x43, 0xe6, 0xa0, 0xc2, 0x99,
+0xea, 0xc4, 0xd6, 0x92, 0xb8, 0x75, 0x64,
+0x42, 0x83, 0x4, 0x9d, 0x42, 0xd4, 0x4b,
+0x55, 0x4e, 0xef, 0xd9, 0x10, 0x7e, 0xe4,
+0x5e, 0xa0, 0x4f, 0x47, 0x16, 0xc2, 0x54,
+0x22, 0x3f, 0x37, 0x1, 0x31, 0x90, 0x34,
+0xc5, 0x15, 0x5a, 0x4a, 0x88, 0x9, 0xdb,
+0x49, 0x9, 0xd7, 0xd2, 0x34, 0x54, 0xd7,
+0xb4, 0xdc, 0xa5, 0x6d, 0x10, 0x3b, 0x19,
+0x4c, 0x81, 0x5f, 0x2f, 0x5a, 0xe2, 0x54,
+0xc5, 0xd0, 0x2, 0xf0, 0x6c, 0xc5, 0x3a,
+0x1d, 0x59, 0x41, 0xf3, 0x30, 0x33, 0xf7,
+0xfc, 0x1, 0x69, 0xba, 0x87, 0xbc, 0x9f,
+0x30, 0x3b, 0x68, 0xb7, 0xb1, 0xf5, 0x19,
+0x33, 0xdb, 0xd2, 0xf5, 0x3a, 0x8b, 0xb0,
+0xdf, 0x8, 0x63, 0xce, 0x7a, 0x8, 0xcc,
+0x81, 0x97, 0x9b, 0x3f, 0xc, 0x91, 0x46,
+0x8d, 0x3c, 0x9d, 0x7b, 0xea, 0x27, 0x3b,
+0x3f, 0xa5, 0x16, 0x27, 0xe9, 0x54, 0x87,
+0xda, 0x84, 0xfd, 0x16, 0x24, 0x71, 0xd3,
+0xce, 0x9d, 0xa3, 0x4d, 0x34, 0xeb, 0x92,
+0xf8, 0x5f, 0xa9, 0x1a, 0x47, 0x6d, 0xc,
+0x44, 0x7b, 0xd3, 0x4d, 0xe7, 0xfe, 0x7,
+0xa4, 0x25, 0xfe, 0x9d, 0x9a, 0x94, 0x9a,
+0x34, 0x6a, 0x3b, 0x50, 0xcc, 0x41, 0xdc,
+0x5f, 0x28, 0x4, 0x3d, 0x3a, 0xc2, 0x58,
+0x40, 0xc0, 0xa, 0x63, 0x1, 0x6e, 0xb,
+0x9, 0xc1, 0xc7, 0x42, 0x0, 0x72, 0xa0,
+0x45, 0xa6, 0x11, 0x53, 0x23, 0x7b, 0x42,
+0x0, 0x46, 0x9b, 0x1e, 0x7a, 0xde, 0x96,
+0x7b, 0x48, 0x40, 0xda, 0x5b, 0x20, 0xf,
+0xb6, 0x79, 0xc6, 0x5c, 0x4b, 0xb0, 0x4f,
+0xf7, 0xa1, 0x93, 0x34, 0x6, 0x73, 0xb5,
+0x9d, 0x94, 0xc0, 0xd, 0x11, 0x4e, 0xfa,
+0xc2, 0x71, 0xb4, 0x2d, 0x68, 0xf6, 0x72,
+0x4a, 0xe4, 0x40, 0xa3, 0xc5, 0x3c, 0x2f,
+0x5e, 0x70, 0x1d, 0xfb, 0x66, 0xff, 0xed,
+0x9a, 0x22, 0x85, 0x96, 0x41, 0xf, 0x7c,
+0xc, 0xc7, 0x86, 0x6a, 0xc4, 0xd8, 0xa9,
+0x59, 0x55, 0x69, 0xa3, 0xd0, 0x85, 0x6c,
+0xae, 0xd2, 0x97, 0xf1, 0x54, 0xeb, 0xf1,
+0x59, 0x29, 0xa6, 0x89, 0xb5, 0xfa, 0xd,
+0x10, 0xe7, 0xd6, 0xb5, 0xfe, 0xb0, 0xc7,
+0x1a, 0x65, 0x62, 0xfa, 0xce, 0x31, 0xb7,
+0x8d, 0x64, 0x93, 0x5b, 0xfb, 0x6, 0x31,
+0x19, 0xee, 0xb2, 0x54, 0xc9, 0x3c, 0xdb,
+0xbe, 0xb0, 0xc1, 0xc3, 0x95, 0xb, 0x9f,
+0xcd, 0xa2, 0x35, 0x29, 0xcf, 0x2b, 0xa0,
+0xf2, 0x9b, 0x21, 0x5a, 0xa, 0xbe, 0x2a,
+0x99, 0xfa, 0x60, 0xa1, 0x4c, 0x15, 0x2a,
+0x6d, 0xec, 0xc6, 0x86, 0x49, 0x6, 0xcc,
+0x50, 0xe6, 0xf9, 0xe4, 0xa9, 0xa2, 0x39,
+0x24, 0x8e, 0xcb, 0xa0, 0xb7, 0x32, 0x2b,
+0xab, 0x2f, 0xfb, 0x8f, 0xdf, 0x31, 0x9f,
+0xfe, 0x5b, 0x55, 0xbd, 0xb4, 0x61, 0xb4,
+0xfe, 0xe1, 0x26, 0xd5, 0x6e, 0x61, 0xde,
+0xd9, 0x7a, 0x56, 0xa8, 0x57, 0x56, 0x74,
+0xf2, 0xcb, 0xd3, 0xc2, 0xf8, 0xe8, 0x4,
+0x49, 0x4c, 0x22, 0x45, 0x6d, 0x46, 0x30,
+0x92, 0xf2, 0xdd, 0x45, 0x98, 0xe3, 0x8e,
+0x71, 0xaf, 0x7d, 0x1b, 0x3, 0xa6, 0x7c,
+0x42, 0x88, 0xae, 0xc8, 0xe1, 0x11, 0x55,
+0x1a, 0x10, 0x42, 0x9a, 0x7a, 0x11, 0x4a,
+0xe, 0x53, 0x36, 0xcc, 0x6b, 0x4b, 0x86,
+0x7, 0x38, 0xe9, 0xf9, 0x66, 0xcc, 0x71,
+0xa1, 0xf, 0x16, 0xd7, 0x92, 0x16, 0x9,
+0x9d, 0xc0, 0xc3, 0x38, 0xdb, 0xcb, 0xb5,
+0xd4, 0x42, 0xf0, 0xc, 0x90, 0xb, 0xad,
+0x93, 0x1e, 0x50, 0x23, 0xe8, 0x9a, 0xe1,
+0xd0, 0xf9, 0x67, 0xc4, 0x89, 0xc9, 0x7,
+0xdc, 0x96, 0xfd, 0xa6, 0x9a, 0x2a, 0x6,
+0xff, 0x12, 0x44, 0x30, 0xa3, 0x62, 0xe2,
+0x82, 0x8a, 0x62, 0x61, 0xa5, 0x22, 0x2d,
+0x65, 0xcf, 0x2c, 0x39, 0x32, 0x65, 0x94,
+0x8b, 0xb5, 0x14, 0xbb, 0xbe, 0xfb, 0x83,
+0xe4, 0x83, 0x4c, 0x84, 0x38, 0x35, 0xa4,
+0xbc, 0x11, 0x13, 0x2b, 0xc6, 0x45, 0x67,
+0x48, 0x42, 0x79, 0xf4, 0xbe, 0x65, 0xe9,
+0x38, 0xdc, 0xea, 0x96, 0xc1, 0xb5, 0x35,
+0xd3, 0xa5, 0x7d, 0x52, 0x16, 0xf2, 0x3c,
+0xbd, 0x2d, 0x9c, 0x67, 0xb0, 0x5c, 0x69,
+0x21, 0x7a, 0x22, 0xdd, 0xc6, 0x80, 0x4,
+0x9e, 0xcd, 0x1a, 0xfd, 0x77, 0xa9, 0xa0,
+0x40, 0x1f, 0xd9, 0xfb, 0x17, 0x99, 0xec,
+0x4e, 0x69, 0x86, 0x7f, 0xf, 0x32, 0xea,
+0x1e, 0xe9, 0x12, 0x64, 0xe, 0xef, 0x30,
+0x9b, 0xfd, 0xf7, 0xfb, 0x9c, 0x24, 0x2f,
+0x5f, 0x79, 0x83, 0x7c, 0x41, 0x57, 0x85,
+0xa1, 0xcf, 0x55, 0xda, 0xf, 0xce, 0xd7,
+0x43, 0xa1, 0x3c, 0xe3, 0x17, 0xa7, 0x66,
+0x44, 0xac, 0x51, 0xc2, 0x46, 0x2e, 0x2d,
+0x88, 0x61, 0xc5, 0xea, 0xc9, 0x9d, 0x3,
+0xdc, 0xc2, 0x9f, 0x21, 0x6, 0xfe, 0xed,
+0xb1, 0x38, 0xef, 0x7a, 0x88, 0xfd, 0x9,
+0xfe, 0x2b, 0x50, 0xd8, 0xcc, 0x2b, 0xb,
+0xb1, 0x2b, 0x8c, 0x7e, 0xd7, 0x7d, 0x54,
+0x1, 0xb8, 0xd7, 0x2b, 0xf7, 0xfd, 0xdf,
+0x3f, 0xe6, 0xde, 0x5a, 0xa2, 0x9e, 0x45,
+0xc, 0x37, 0xf1, 0x1a, 0xa0, 0xd1, 0x87,
+0x7c, 0xd9, 0x16, 0x7e, 0x66, 0x97, 0xd2,
+0x7e, 0x4a, 0xb3, 0x2f, 0x53, 0x24, 0xd5,
+0xd6, 0x22, 0xa2, 0x2e, 0xf9, 0x22, 0x43,
+0x8d, 0x65, 0x6b, 0x6a, 0xb7, 0xdf, 0xb4,
+0x60, 0x3d, 0x4b, 0x10, 0x72, 0xc, 0x82,
+0x3a, 0x72, 0x13, 0xe5, 0x76, 0x1e, 0x6d,
+0x21, 0xce, 0xec, 0x6, 0x8b, 0x98, 0x73,
+0xb7, 0x6b, 0x9d, 0xed, 0x52, 0x42, 0x10,
+0x38, 0xf1, 0x6d, 0xeb, 0xd2, 0x77, 0x9c,
+0xc9, 0x8d, 0x44, 0x9e, 0xf1, 0x26, 0x5,
+0xc7, 0x94, 0xdd, 0x8e, 0xe0, 0xc7, 0x7b,
+0xe2, 0x98, 0x8b, 0xd, 0x36, 0x92, 0x74,
+0xf7, 0x7c, 0xf2, 0x98, 0xd5, 0x19, 0x34,
+0xab, 0x59, 0xd, 0xcb, 0x7a, 0x2b, 0x71,
+0x3f, 0xfc, 0x73, 0xa0, 0x51, 0x8a, 0xe6,
+0xd8, 0xa1, 0x76, 0x25, 0xe3, 0x7, 0xd1,
+0xc2, 0xf6, 0x4f, 0x84, 0x50, 0xd6, 0xdd,
+0x92, 0xeb, 0x8c, 0x45, 0xfe, 0xbf, 0xdd,
+0x40, 0x1a, 0x4b, 0xff, 0x84, 0x47, 0x44,
+0xad, 0x78, 0x75, 0x42, 0x20, 0xae, 0xa7,
+0x91, 0x23, 0xda, 0xde, 0xc6, 0x68, 0x9f,
+0xb3, 0x10, 0xc4, 0x3, 0xf, 0xa8, 0x5,
+0x5d, 0xb0, 0xec, 0x33, 0x1f, 0xf5, 0xd3,
+0x57, 0x9b, 0xab, 0xcd, 0xb3, 0xe2, 0xdc,
+0x2d, 0xf7, 0xa3, 0xd3, 0x78, 0x56, 0xb1,
+0xcf, 0x82, 0x8d, 0x2c, 0x65, 0x4a, 0xde,
+0x17, 0xe7, 0xcc, 0xb8, 0xf2, 0xe, 0x9b,
+0x67, 0xf4, 0x3a, 0x76, 0xeb, 0x66, 0xd5,
+0x15, 0x2a, 0xc, 0xa0, 0x5b, 0xc, 0xfb,
+0xcd, 0x7f, 0x65, 0x7d, 0xee, 0x12, 0xba,
+0x2b, 0xd7, 0x2a, 0x5f, 0xc, 0x1c, 0x8d,
+0x89, 0x51, 0x60, 0x9c, 0x17, 0x24, 0xe1,
+0x48, 0xa2, 0x9c, 0xd5, 0x72, 0xa1, 0x25,
+0x95, 0x9a, 0xa6, 0x4a, 0x2, 0x54, 0x68,
+0x53, 0xe1, 0x5c, 0xea, 0x6a, 0xc2, 0xcd,
+0x63, 0x86, 0x96, 0xaa, 0xbf, 0xd0, 0x52,
+0x92, 0x3d, 0x5d, 0x3, 0x76, 0x67, 0xe8,
+0x4c, 0xf5, 0x33, 0xc0, 0x7, 0xcd, 0xa6,
+0x75, 0x8f, 0x5c, 0x82, 0x8e, 0x8e, 0xbf,
+0x1f, 0xdb, 0x91, 0x94, 0x41, 0x51, 0x11,
+0x78, 0x9a, 0x53, 0x40, 0x99, 0x74, 0x1c,
+0x2f, 0x46, 0x37, 0x2b, 0x26, 0x2a, 0xcf,
+0x1e, 0x4f, 0x43, 0x7b, 0x72, 0x61, 0x94,
+0x9d, 0xd9, 0xf5, 0xb7, 0x37, 0x4e, 0x6f,
+0x63, 0x25, 0xfc, 0x0, 0xc0, 0x72, 0x17,
+0x6a, 0xec, 0x15, 0x37, 0x2, 0x3e, 0xc8,
+0x78, 0xd0, 0xf3, 0xe4, 0x32, 0xa6, 0x60,
+0xcf, 0xf8, 0xe8, 0xb8, 0x23, 0x37, 0x43,
+0x94, 0xff, 0xbe, 0xfd, 0xa7, 0x3b, 0x54,
+0x4d, 0x40, 0x3f, 0x8, 0x3a, 0x7d, 0x57,
+0x7e, 0x7b, 0x79, 0xe8, 0x91, 0x1c, 0x47,
+0x50, 0xe6, 0xde, 0xa3, 0x27, 0x50, 0x21,
+0x8, 0xef, 0x89, 0x64, 0xec, 0x77, 0x0,
+0x49, 0xd5, 0xab, 0xcf, 0xc0, 0xd6, 0xbe,
+0x3c, 0x3f, 0x8, 0xae, 0x6, 0x73, 0x24,
+0x56, 0x91, 0xff, 0xb, 0xe0, 0xa5, 0xe7,
+0x2d, 0x69, 0x7, 0xa5, 0xb5, 0xe3, 0x4e,
+0xa9, 0xc7, 0x19, 0x7e, 0xc4, 0xa1, 0x8a,
+0xc1, 0xc1, 0x9f, 0x22, 0xbf, 0x76, 0xf2,
+0x10, 0x8d, 0x78, 0xd8, 0xad, 0x4f, 0xef,
+0xd8, 0x90, 0x97, 0x37, 0x13, 0x38, 0x99,
+0x36, 0xab, 0x2b, 0x7d, 0x77, 0xe4, 0x34,
+0x43, 0x17, 0x5a, 0x4e, 0x3c, 0xc7, 0xcd,
+0xb7, 0xbb, 0x69, 0x79, 0x75, 0x43, 0x3d,
+0xc2, 0x79, 0x7b, 0xfb, 0xff, 0xf5, 0x1,
+0x2f, 0xb2, 0x79, 0x82, 0x6, 0x28, 0x74,
+0xd9, 0x4d, 0x79, 0x23, 0xb4, 0xb2, 0xfb,
+0x26, 0x12, 0x8e, 0x42, 0x2f, 0x5e, 0xf9,
+0x62, 0xb2, 0x5e, 0x57, 0x13, 0x29, 0x75,
+0x49, 0x35, 0x7e, 0x11, 0x46, 0xdd, 0xf6,
+0x8d, 0x38, 0x6d, 0xea, 0x2d, 0x29, 0xce,
+0x22, 0x14, 0x77, 0xe0, 0xd3, 0x4f, 0x91,
+0x45, 0x7a, 0xb9, 0x43, 0x5d, 0xbf, 0xdc,
+0x9f, 0x71, 0xaf, 0x48, 0x52, 0xe6, 0x15,
+0x9f, 0xdb, 0xd9, 0xb2, 0x1b, 0x78, 0x6,
+0x4e, 0x7f, 0xfa, 0x13, 0x54, 0xf9, 0x82,
+0x4c, 0x21, 0x17, 0xe4, 0x53, 0x3, 0xdb,
+0x2f, 0x8, 0x7a, 0x29, 0xb6, 0x2e, 0xde,
+0x11, 0xce, 0xf7, 0x57, 0x5, 0x5, 0xdc,
+0xb5, 0xcf, 0x3, 0xe1, 0x98, 0x77, 0xe7,
+0xd5, 0x8b, 0x63, 0x74, 0x26, 0xea, 0xdd,
+0xfe, 0x5c, 0x59, 0x90, 0x44, 0x31, 0x73,
+0x51, 0x4e, 0x62, 0xcd, 0x5, 0x23, 0xed,
+0x24, 0x79, 0x52, 0x4a, 0x69, 0x64, 0x6b,
+0x2b, 0x7e, 0xf8, 0x51, 0x6e, 0xd1, 0x56,
+0x5b, 0x5a, 0xa3, 0x48, 0xcd, 0x5b, 0xc9,
+0x1b, 0xf7, 0x5e, 0x5f, 0x84, 0xf7, 0x3d,
+0x8a, 0xf7, 0x25, 0xbf, 0xc8, 0x80, 0x6,
+0x44, 0x96, 0x3e, 0x9c, 0x85, 0xbf, 0xad,
+0x64, 0xd4, 0x6e, 0xab, 0x2e, 0x4e, 0x8d,
+0x1b, 0xaa, 0x8a, 0x6a, 0xb9, 0x4e, 0x2a,
+0x73, 0xad, 0x2c, 0x14, 0xb2, 0xa2, 0xd4,
+0x4a, 0x75, 0x5c, 0x62, 0xa3, 0xf2, 0x53,
+0xef, 0xf2, 0x5b, 0x5a, 0x4a, 0xeb, 0x1b,
+0xba, 0x34, 0x5f, 0x66, 0x73, 0xd2, 0x19,
+0x55, 0x3d, 0x8c, 0x18, 0x32, 0x4c, 0x8,
+0x99, 0xf5, 0x4a, 0x52, 0xbd, 0x78, 0xbe,
+0x1f, 0x29, 0x91, 0xf0, 0x26, 0x25, 0xb5,
+0xb2, 0x6d, 0x2f, 0x22, 0xd8, 0x4d, 0x4,
+0xe1, 0x5e, 0x4d, 0x55, 0xec, 0x6f, 0x29,
+0x99, 0x1b, 0xe6, 0x4e, 0x8, 0xc1, 0x35,
+0x11, 0x28, 0x59, 0xdc, 0xd4, 0xa4, 0x3e,
+0x72, 0xdc, 0x31, 0x7a, 0x2b, 0x64, 0x83,
+0xa9, 0xdb, 0xd5, 0xfa, 0x46, 0x29, 0xaa,
+0x27, 0x34, 0x98, 0x36, 0xcc, 0x72, 0xa6,
+0xe2, 0x1c, 0x86, 0x7a, 0x94, 0xa4, 0x50,
+0xd8, 0x23, 0x3, 0x33, 0x7b, 0x14, 0xe,
+0xa2, 0x16, 0x77, 0x4d, 0x8b, 0x7c, 0x3c,
+0xda, 0xe2
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha384_sigrl.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha384_sigrl.inc
new file mode 100644
index 0000000..c3e1b0a
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha384_sigrl.inc
@@ -0,0 +1,1222 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha384
+ * Message: "test message"
+ * Basename: None (random base)
+ * SigRl: SigRl of group
+ */
+0x36, 0x19, 0x27, 0x2c, 0xcf, 0xa0, 0x7a,
+0x44, 0x9c, 0xea, 0xe5, 0x77, 0x7e, 0x7d,
+0x12, 0x33, 0xd9, 0x21, 0x41, 0x58, 0x9b,
+0xaf, 0xcc, 0xa2, 0x2e, 0xe1, 0xe1, 0x27,
+0x70, 0xe6, 0x2f, 0x8e, 0x70, 0x9d, 0x7c,
+0x2b, 0x65, 0xf0, 0xd6, 0xe3, 0x89, 0x5b,
+0x8a, 0x82, 0x68, 0x2a, 0x2f, 0x44, 0xbb,
+0xba, 0xbe, 0xbf, 0xed, 0x94, 0x87, 0x5b,
+0xf4, 0x2a, 0xde, 0xb2, 0xe6, 0xee, 0x57,
+0x17, 0x71, 0xec, 0xf4, 0x3d, 0x7c, 0x44,
+0x2d, 0x77, 0x42, 0xc6, 0x22, 0x88, 0xc4,
+0x80, 0xe3, 0x99, 0x79, 0x7d, 0xe8, 0xf0,
+0xaf, 0x37, 0x67, 0x66, 0xe8, 0xa8, 0x63,
+0xd7, 0x88, 0xd6, 0xf7, 0x2e, 0x2b, 0x98,
+0xcc, 0x0a, 0x96, 0xef, 0x72, 0xfe, 0x47,
+0xf7, 0x46, 0x4c, 0x0b, 0x79, 0x94, 0x8c,
+0x6a, 0x1f, 0x09, 0x30, 0x31, 0x29, 0xd2,
+0x86, 0xed, 0x93, 0xd9, 0xed, 0x9e, 0x88,
+0xd2, 0x9b, 0x44, 0x15, 0x36, 0x91, 0x33,
+0x62, 0x44, 0xcf, 0xab, 0x0d, 0xf0, 0x24,
+0x86, 0x3f, 0x10, 0x74, 0x42, 0x37, 0xbb,
+0x1a, 0x67, 0xf4, 0x16, 0x61, 0xc7, 0x5e,
+0x30, 0x18, 0x86, 0x28, 0xa2, 0x3a, 0x68,
+0xe2, 0xec, 0x6e, 0xa4, 0x5f, 0x1e, 0x81,
+0xf1, 0x09, 0xcc, 0x8c, 0xde, 0xe5, 0x3f,
+0xc3, 0x6e, 0xfe, 0x19, 0x4f, 0x51, 0xa6,
+0x66, 0x69, 0xf2, 0x38, 0xac, 0xad, 0xd9,
+0xe8, 0xe2, 0x81, 0xdd, 0x0c, 0x74, 0x9a,
+0x76, 0x49, 0x7e, 0x33, 0x7a, 0xa8, 0x15,
+0xc0, 0x49, 0xee, 0xd5, 0xff, 0x6f, 0x53,
+0x27, 0x69, 0xcc, 0xb6, 0x4b, 0x55, 0xf7,
+0x64, 0xa1, 0x08, 0x46, 0x09, 0xb9, 0x18,
+0x0e, 0x97, 0x87, 0x2a, 0x41, 0x48, 0x5d,
+0x45, 0x3b, 0xea, 0xc5, 0x15, 0x7a, 0xe2,
+0x91, 0xee, 0x35, 0xea, 0x34, 0xd4, 0x89,
+0x96, 0xf1, 0x74, 0x63, 0x06, 0xc7, 0x43,
+0x69, 0xc6, 0x9a, 0x75, 0x30, 0x45, 0x87,
+0x8a, 0x3b, 0x64, 0x60, 0xa0, 0xfb, 0x73,
+0xc3, 0x77, 0xde, 0x9d, 0xfb, 0x2d, 0x1a,
+0x03, 0xc2, 0xc6, 0x2d, 0x72, 0x31, 0x93,
+0xd9, 0xb1, 0x26, 0xd3, 0xb7, 0x51, 0xcb,
+0x4c, 0x95, 0x42, 0x55, 0xfc, 0x30, 0xa4,
+0x13, 0x4b, 0x2b, 0xe2, 0x99, 0x10, 0x3c,
+0x5c, 0x4d, 0xf6, 0xe5, 0x1b, 0x7a, 0x5a,
+0xbe, 0xb4, 0x23, 0x4b, 0x99, 0x3c, 0x93,
+0x63, 0x38, 0x84, 0x2b, 0xfe, 0xc1, 0x01,
+0xdd, 0x0b, 0xc7, 0x6f, 0x3c, 0x06, 0xbc,
+0x6f, 0x17, 0xb4, 0x95, 0x9d, 0xd3, 0xd1,
+0xfd, 0xea, 0xf3, 0x15, 0x47, 0xec, 0x07,
+0xa1, 0x22, 0xd0, 0x2d, 0xe8, 0xb8, 0xfb,
+0x33, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x32, 0x97, 0x36, 0xc2, 0x28,
+0x13, 0xa6, 0xce, 0x2a, 0x82, 0xf5, 0x7e,
+0xce, 0xdb, 0x7e, 0x95, 0x97, 0x71, 0xce,
+0xf0, 0xa6, 0xbd, 0x9a, 0x09, 0x6c, 0x4b,
+0x5c, 0x64, 0xbc, 0xb6, 0x56, 0xfb, 0x5c,
+0xec, 0x0e, 0xc6, 0x33, 0x54, 0xa0, 0x4d,
+0x21, 0xdf, 0x03, 0xc4, 0xc8, 0x6a, 0x28,
+0xa3, 0xde, 0x94, 0x2c, 0x1b, 0x81, 0x47,
+0x71, 0xe9, 0xe0, 0xe7, 0x2a, 0x2e, 0x37,
+0x04, 0x0a, 0x86, 0x0f, 0x57, 0x49, 0xfc,
+0x58, 0xc2, 0x79, 0xfa, 0x8f, 0x4a, 0xfa,
+0x41, 0x7a, 0x8e, 0xb1, 0xe0, 0x57, 0x41,
+0xe6, 0x7b, 0xad, 0xa9, 0x2f, 0x66, 0x89,
+0x76, 0x88, 0x72, 0x5f, 0xd7, 0xf8, 0xc9,
+0xdd, 0x64, 0x6d, 0x92, 0xe8, 0x5e, 0xce,
+0x15, 0xb3, 0xa0, 0xf1, 0x2a, 0x24, 0xe0,
+0x09, 0xf7, 0xb5, 0x77, 0x27, 0xff, 0x15,
+0xd3, 0xaf, 0x33, 0x45, 0xe0, 0x33, 0x15,
+0xef, 0xb7, 0x38, 0x23, 0xf2, 0x20, 0x1d,
+0xd6, 0xc1, 0x6a, 0x37, 0x1d, 0xda, 0xfb,
+0xf4, 0xa7, 0x29, 0x60, 0xf7, 0x45, 0x50,
+0x0a, 0x9f, 0xcb, 0xa7, 0xc4, 0x17, 0x8d,
+0x7d, 0x91, 0x3f, 0xb8, 0xa9, 0xcb, 0x0f,
+0x89, 0x16, 0x2a, 0x1d, 0xc6, 0xef, 0xc7,
+0x53, 0xe6, 0x53, 0xbf, 0x7c, 0x3d, 0xed,
+0x79, 0x88, 0xd6, 0xbb, 0xf8, 0x2d, 0xeb,
+0x1a, 0x87, 0xd4, 0xee, 0xc4, 0x30, 0xbd,
+0xa0, 0x36, 0x98, 0xe5, 0x0a, 0xa5, 0x04,
+0xb5, 0xaa, 0x25, 0x00, 0xc8, 0x0b, 0xee,
+0x66, 0xe8, 0xc4, 0x6e, 0x9f, 0xb9, 0xea,
+0x29, 0xdb, 0xb2, 0x70, 0xfc, 0x75, 0xc8,
+0xef, 0x52, 0xd7, 0x4b, 0xa0, 0x15, 0x9c,
+0xf0, 0x4a, 0xc5, 0xbe, 0xe0, 0xbd, 0x4f,
+0xe7, 0x07, 0x61, 0x69, 0xa4, 0xd8, 0xf0,
+0x6a, 0x2e, 0x8e, 0x7f, 0xf2, 0x1f, 0x98,
+0x77, 0x9f, 0x19, 0xed, 0x1b, 0x39, 0x5a,
+0xa1, 0xec, 0x26, 0xcd, 0xae, 0xe9, 0x13,
+0xd5, 0x33, 0x86, 0xc7, 0x68, 0xc7, 0x18,
+0xcf, 0xb0, 0x58, 0x11, 0x08, 0xe1, 0xe3,
+0x79, 0x91, 0x29, 0x60, 0xc6, 0x3a, 0x31,
+0x20, 0xc5, 0x82, 0xbb, 0x63, 0x7f, 0x57,
+0x31, 0xef, 0x91, 0xf5, 0xe7, 0x68, 0x19,
+0x29, 0x99, 0x01, 0x22, 0x53, 0x86, 0x41,
+0x34, 0xf9, 0xb6, 0x46, 0x03, 0x78, 0xfb,
+0xf3, 0x67, 0x33, 0x8a, 0x18, 0x7e, 0x0e,
+0x18, 0x6e, 0xa0, 0x93, 0xfe, 0x3c, 0xa8,
+0x47, 0xb0, 0xe9, 0xee, 0x27, 0x4f, 0x25,
+0x29, 0x0f, 0x96, 0xa0, 0x26, 0xe7, 0xa6,
+0xd6, 0xf2, 0x03, 0x85, 0x3b, 0x2e, 0xc6,
+0x78, 0xe7, 0x77, 0x8d, 0x4f, 0xba, 0x03,
+0x55, 0xeb, 0xdb, 0xac, 0x3d, 0x77, 0xdf,
+0xdc, 0x27, 0xad, 0x71, 0x6c, 0xb9, 0xee,
+0x87, 0xc8, 0x51, 0x3f, 0xe5, 0xe1, 0xa0,
+0x3d, 0x42, 0xc9, 0xf2, 0x87, 0x7b, 0x0b,
+0xe3, 0x68, 0xbc, 0xbc, 0xea, 0x79, 0xd2,
+0x99, 0x0a, 0x9c, 0x29, 0x38, 0xb9, 0x96,
+0x3a, 0xaa, 0xd5, 0x0f, 0xdf, 0xf8, 0xb7,
+0x3b, 0xab, 0x35, 0x51, 0xbf, 0xa4, 0x60,
+0xd2, 0xc8, 0xeb, 0x22, 0x9d, 0xc6, 0x51,
+0x85, 0xc9, 0xc1, 0xd7, 0xe3, 0xd5, 0xa4,
+0x2b, 0x76, 0x6f, 0xd1, 0x2a, 0x9a, 0xd3,
+0x73, 0xca, 0xe7, 0x48, 0xc4, 0xa4, 0xa6,
+0x11, 0xa9, 0x91, 0x03, 0xb8, 0xaa, 0xaf,
+0xb0, 0xf7, 0x51, 0x7b, 0x4b, 0xed, 0x49,
+0x65, 0x39, 0x76, 0xf4, 0x60, 0xbf, 0x01,
+0x2f, 0xeb, 0x80, 0x9b, 0x4e, 0x51, 0xf2,
+0x7d, 0xd4, 0x99, 0xab, 0x78, 0x49, 0x43,
+0x05, 0x88, 0x8d, 0xee, 0xcc, 0x39, 0x32,
+0xf8, 0xc2, 0x51, 0x7e, 0xd3, 0x58, 0x26,
+0x01, 0xb2, 0x41, 0xc1, 0x9e, 0x38, 0x7e,
+0xab, 0x05, 0x48, 0xbe, 0x95, 0x09, 0x9f,
+0x02, 0x01, 0x15, 0xa6, 0x3d, 0xfa, 0xa7,
+0xf9, 0xac, 0xe4, 0xc0, 0xb1, 0x22, 0x82,
+0xfc, 0x37, 0x9b, 0xbd, 0xdb, 0xec, 0x23,
+0x3e, 0xec, 0xd8, 0x64, 0x35, 0xe9, 0x81,
+0xab, 0x15, 0x54, 0x28, 0x65, 0xf3, 0x2b,
+0xe1, 0x3e, 0x9e, 0x6c, 0x45, 0x43, 0xdf,
+0x76, 0x00, 0x37, 0xf4, 0x52, 0x8b, 0x68,
+0xce, 0xb4, 0xe6, 0x24, 0x0f, 0x39, 0x03,
+0x8a, 0x75, 0x78, 0x62, 0x68, 0xa6, 0x4d,
+0x37, 0x32, 0x8e, 0xf6, 0x8c, 0x3e, 0xa3,
+0xc8, 0xb2, 0xbf, 0x43, 0x03, 0x29, 0x2c,
+0x1c, 0xa4, 0xde, 0x60, 0x54, 0xaa, 0x0e,
+0x7a, 0xe2, 0x4e, 0xf0, 0x8f, 0x46, 0x95,
+0xdf, 0x00, 0xbc, 0x53, 0xf2, 0x64, 0x96,
+0xa2, 0x20, 0x7e, 0x45, 0xfa, 0x81, 0xa9,
+0x93, 0x3a, 0x69, 0xa8, 0x5a, 0x17, 0xd8,
+0xf0, 0x49, 0x3d, 0x1d, 0x82, 0x88, 0x5f,
+0x37, 0x83, 0x7b, 0x08, 0xa9, 0x22, 0xc3,
+0xa4, 0x2f, 0x2c, 0x21, 0x9f, 0x01, 0x9c,
+0x61, 0xc4, 0x6a, 0x3a, 0x45, 0x59, 0xc0,
+0x0e, 0x8b, 0x5d, 0xf8, 0xc6, 0xbf, 0x30,
+0xc3, 0xec, 0xa0, 0xff, 0xdb, 0xda, 0xd3,
+0x3e, 0x7d, 0x72, 0x04, 0x8f, 0x68, 0x76,
+0xe6, 0x30, 0xb2, 0x13, 0xde, 0x8c, 0xe9,
+0x07, 0xc2, 0xbf, 0x3a, 0x78, 0xf0, 0xf0,
+0xd4, 0xc1, 0xdb, 0x64, 0x69, 0x26, 0x5d,
+0x4f, 0xac, 0x98, 0x66, 0x4d, 0x20, 0x0d,
+0xc0, 0x9c, 0x56, 0x94, 0xd8, 0xe2, 0x84,
+0xa9, 0x32, 0x4c, 0x10, 0x47, 0x68, 0x2b,
+0x33, 0x8c, 0x16, 0xb0, 0xf9, 0x35, 0x36,
+0x2f, 0xcd, 0x3b, 0xbd, 0x31, 0x03, 0x70,
+0xcf, 0x5b, 0x4c, 0x50, 0xdf, 0xd7, 0x54,
+0xc0, 0x2f, 0x85, 0x7f, 0xee, 0xd1, 0x9a,
+0xde, 0xfe, 0x9f, 0x3d, 0xce, 0x08, 0xc4,
+0xd0, 0x8d, 0x96, 0x0f, 0x30, 0xdd, 0x60,
+0x4f, 0x37, 0xf8, 0xf1, 0x10, 0x5e, 0x10,
+0x3f, 0xfc, 0xbb, 0x6b, 0x7b, 0x7d, 0x9c,
+0xe3, 0xf0, 0x27, 0xab, 0xa6, 0x9a, 0x70,
+0xae, 0x18, 0xa0, 0x9a, 0xa7, 0x48, 0xb2,
+0xf8, 0x28, 0xe3, 0x20, 0x76, 0x67, 0xaf,
+0x3f, 0xb2, 0x5e, 0x59, 0x4c, 0x84, 0x9c,
+0xc7, 0x6e, 0x41, 0x30, 0xbf, 0xfe, 0x9b,
+0xb8, 0x9b, 0xab, 0x40, 0x09, 0xfd, 0x02,
+0x99, 0x79, 0x9f, 0x39, 0xb4, 0x40, 0x73,
+0xb3, 0x3e, 0xa0, 0x5e, 0xa0, 0x5c, 0x74,
+0x5d, 0x21, 0xfc, 0x00, 0x57, 0xbf, 0x23,
+0xda, 0xae, 0x49, 0xac, 0x6a, 0x10, 0xe6,
+0x1e, 0x1b, 0x19, 0xe6, 0xce, 0x41, 0x6c,
+0x3c, 0xe7, 0x45, 0x3c, 0xcb, 0x75, 0xa9,
+0xd7, 0x60, 0x0d, 0x43, 0x69, 0x1e, 0xc2,
+0x47, 0xea, 0x07, 0x46, 0x2c, 0x58, 0x25,
+0x1e, 0x10, 0xe9, 0xc8, 0x8a, 0x14, 0x85,
+0x6f, 0x49, 0x37, 0xd7, 0xfb, 0x07, 0xbb,
+0xfa, 0xc2, 0x4e, 0x9d, 0xaf, 0x4c, 0xe6,
+0xb8, 0xad, 0x1b, 0x70, 0x8c, 0x74, 0xda,
+0xb4, 0x38, 0x57, 0xa7, 0x42, 0x4e, 0xe2,
+0x84, 0xfb, 0x97, 0x4e, 0x46, 0x2c, 0xad,
+0x37, 0xc0, 0x10, 0x62, 0x6c, 0x07, 0xea,
+0x06, 0xc4, 0x5a, 0x29, 0xfb, 0x4c, 0x0f,
+0xc6, 0x9e, 0x5f, 0xcd, 0xd6, 0x33, 0xc6,
+0x1b, 0x92, 0x76, 0x99, 0xa3, 0xe7, 0x13,
+0x92, 0x0b, 0x27, 0x3b, 0x75, 0xb2, 0x3f,
+0x9c, 0x6b, 0x4e, 0x96, 0x9f, 0xfc, 0xed,
+0x36, 0xb7, 0x69, 0x3d, 0xe2, 0x64, 0xa9,
+0xb8, 0xdf, 0x46, 0x67, 0x6e, 0xc2, 0x2f,
+0x5e, 0xf9, 0x24, 0x2b, 0xea, 0x6c, 0xde,
+0x00, 0x14, 0x4a, 0xe0, 0x8e, 0x43, 0x0b,
+0x2b, 0xcb, 0xf4, 0x93, 0x76, 0x97, 0x74,
+0x61, 0xaf, 0x2e, 0x7d, 0xfe, 0x11, 0x74,
+0x03, 0x8f, 0x38, 0x32, 0x7c, 0x1f, 0xf6,
+0x46, 0x68, 0xac, 0x29, 0x48, 0x3e, 0x63,
+0xac, 0x64, 0x10, 0x97, 0x1a, 0x22, 0x67,
+0x09, 0x51, 0x0c, 0x46, 0x7e, 0xab, 0x21,
+0x72, 0xbf, 0x12, 0x69, 0x99, 0x7c, 0xef,
+0x07, 0x39, 0x33, 0x63, 0xf8, 0x16, 0x70,
+0xe8, 0x25, 0x62, 0x90, 0xa4, 0xa4, 0x37,
+0x0e, 0xcc, 0x8b, 0xc4, 0x6b, 0x77, 0x3f,
+0xbd, 0xe7, 0xe8, 0xaa, 0xf1, 0x2c, 0x70,
+0x00, 0xb3, 0x13, 0x91, 0xa9, 0x01, 0x2e,
+0x8b, 0xc4, 0xf7, 0x4b, 0xe9, 0xc8, 0x6c,
+0x3f, 0xfe, 0x3d, 0x99, 0x71, 0x95, 0x04,
+0x01, 0x58, 0x62, 0x43, 0x2b, 0x38, 0xdc,
+0x11, 0x03, 0x08, 0x98, 0x14, 0x7e, 0x71,
+0xf4, 0xa6, 0x3d, 0xac, 0x02, 0x05, 0x97,
+0xfe, 0xf0, 0x54, 0xd8, 0x4c, 0xd3, 0x11,
+0xbc, 0x9f, 0x6a, 0x4b, 0x40, 0xd0, 0x5c,
+0x53, 0xd5, 0x5c, 0x8d, 0xfa, 0x90, 0x95,
+0x73, 0x7e, 0xb6, 0xba, 0x4d, 0x08, 0xf5,
+0xb7, 0x46, 0x89, 0xf6, 0x9d, 0x82, 0x72,
+0xce, 0x0d, 0xfc, 0x0e, 0x01, 0x07, 0x5a,
+0xd8, 0xee, 0x8d, 0x20, 0x09, 0xfe, 0x2b,
+0x08, 0x63, 0x62, 0xc6, 0xdb, 0x1d, 0xac,
+0x9b, 0xbc, 0x97, 0x15, 0xba, 0x45, 0x1f,
+0x05, 0x1a, 0xe4, 0xbb, 0x1a, 0xeb, 0x2a,
+0xc6, 0x3a, 0xd5, 0xdc, 0x14, 0x90, 0x90,
+0x29, 0x8d, 0xe1, 0x2b, 0x37, 0x50, 0x63,
+0x1f, 0xcc, 0x73, 0xbe, 0x46, 0x69, 0xeb,
+0x67, 0x75, 0xd6, 0x18, 0xc7, 0xde, 0x39,
+0xd3, 0x26, 0x1f, 0xd3, 0xca, 0x39, 0x5f,
+0x93, 0xf2, 0x5d, 0x94, 0x69, 0x3b, 0xbc,
+0x68, 0x2e, 0x02, 0x6c, 0x07, 0x7d, 0xa9,
+0x2a, 0xc7, 0xf7, 0xf9, 0x5c, 0xfd, 0x05,
+0xb5, 0x5b, 0x5c, 0x07, 0xab, 0x26, 0xf5,
+0xd5, 0xbd, 0x34, 0xdc, 0xf7, 0x73, 0x6e,
+0x07, 0xc4, 0xca, 0x72, 0xe9, 0x82, 0x3f,
+0x6f, 0x79, 0xff, 0xd7, 0xb6, 0xbe, 0x7a,
+0xf7, 0xab, 0x49, 0x8c, 0xd5, 0xa2, 0x34,
+0xb8, 0x9b, 0xe7, 0xca, 0x1f, 0x6e, 0x29,
+0x08, 0x7e, 0xd9, 0x44, 0x7f, 0xda, 0x23,
+0x0e, 0x99, 0xf7, 0xd0, 0x2f, 0x12, 0x68,
+0xac, 0xbc, 0x41, 0xe0, 0x40, 0x5a, 0x3b,
+0xee, 0x85, 0xb2, 0x49, 0x67, 0xd3, 0xee,
+0xe2, 0x24, 0x5f, 0xb8, 0x89, 0x45, 0xad,
+0xeb, 0x92, 0xf1, 0x86, 0x43, 0x15, 0x7e,
+0x21, 0xbc, 0x06, 0xba, 0xe3, 0x78, 0xf8,
+0x85, 0xc0, 0x90, 0x71, 0x16, 0xdb, 0x6f,
+0x21, 0x0b, 0xd4, 0x69, 0x34, 0x35, 0x4e,
+0x1c, 0xc1, 0x83, 0x2b, 0x4e, 0x2f, 0x2f,
+0xb4, 0xf5, 0x2b, 0x94, 0x91, 0xdf, 0x97,
+0x65, 0xd0, 0x79, 0x74, 0xd7, 0x61, 0x12,
+0x3e, 0xf8, 0xaa, 0xfe, 0x74, 0x54, 0x09,
+0x38, 0x0c, 0xdf, 0x0f, 0x2c, 0x21, 0xb7,
+0x75, 0xf7, 0xb7, 0x39, 0x48, 0xdb, 0xbe,
+0xee, 0x88, 0x61, 0xb9, 0x46, 0x2a, 0x5e,
+0x34, 0xf9, 0x27, 0x9b, 0xeb, 0x9a, 0x68,
+0xba, 0xc6, 0x9f, 0x5d, 0xc7, 0xf3, 0x02,
+0x93, 0x9a, 0xf5, 0x2f, 0xa8, 0xe0, 0xac,
+0x9d, 0xb8, 0x2d, 0x2e, 0xd2, 0x2e, 0x19,
+0x40, 0x31, 0xa2, 0xe9, 0x40, 0x8d, 0xb5,
+0x0c, 0xda, 0x09, 0xe2, 0x70, 0x5a, 0x57,
+0x78, 0x50, 0x26, 0xfe, 0xa1, 0x75, 0x37,
+0x74, 0xa3, 0x19, 0xd9, 0xf3, 0x9b, 0xf5,
+0x66, 0x12, 0x1e, 0xb9, 0x1a, 0x25, 0xad,
+0x94, 0x64, 0x5e, 0x82, 0x93, 0xc6, 0x66,
+0xd6, 0xeb, 0x48, 0xff, 0x8f, 0x7d, 0xa1,
+0x9d, 0x24, 0xd2, 0xf5, 0x84, 0xf9, 0x1b,
+0xa5, 0xaa, 0xed, 0xec, 0xb5, 0xc4, 0x9e,
+0xaf, 0xda, 0x54, 0x5d, 0x32, 0xfd, 0xe1,
+0x4f, 0x77, 0xa9, 0xdb, 0x77, 0x50, 0x54,
+0x75, 0xcd, 0x4e, 0x9a, 0xd9, 0x87, 0x25,
+0xae, 0x5a, 0x73, 0x36, 0x5d, 0x80, 0xa8,
+0x70, 0x76, 0x8a, 0xc5, 0x42, 0xb2, 0xc1,
+0xed, 0x8e, 0x3b, 0xf8, 0x1c, 0xbf, 0x99,
+0x8a, 0x9b, 0x5d, 0x83, 0xf8, 0x55, 0x91,
+0xd9, 0xd9, 0xc0, 0xa8, 0xfc, 0x42, 0xdb,
+0xd8, 0x42, 0xcf, 0x65, 0x45, 0x14, 0xac,
+0x06, 0x65, 0x93, 0x74, 0x3c, 0xa0, 0x61,
+0x24, 0xb1, 0x17, 0x4c, 0xab, 0xb4, 0x67,
+0xd5, 0xbc, 0x0a, 0x2d, 0x42, 0xea, 0x87,
+0xad, 0x56, 0xb4, 0xf7, 0xb0, 0xed, 0x44,
+0xff, 0xe6, 0x10, 0xec, 0x19, 0x22, 0xb6,
+0xfc, 0x1f, 0xc4, 0x3c, 0x6c, 0x43, 0x7f,
+0x0a, 0xb6, 0x9c, 0xed, 0x3d, 0x66, 0xd3,
+0x43, 0xc8, 0xe5, 0x33, 0x13, 0x1d, 0xd1,
+0xaa, 0x0b, 0xa6, 0x59, 0xed, 0x60, 0xb2,
+0xa8, 0x5e, 0xee, 0x00, 0x2f, 0x73, 0xf3,
+0xa3, 0xdc, 0x8d, 0x9a, 0xb6, 0xa3, 0x6f,
+0x9a, 0x20, 0x9f, 0xfe, 0xb9, 0xb8, 0xe8,
+0x49, 0x22, 0x93, 0xe2, 0xc0, 0xf1, 0x66,
+0xe0, 0xbe, 0x32, 0x94, 0x13, 0x4b, 0x4a,
+0x70, 0xa0, 0xfe, 0xfb, 0xa3, 0xe7, 0x99,
+0xd0, 0x9d, 0xc1, 0x89, 0x91, 0xe4, 0x78,
+0xc3, 0xf0, 0xb2, 0xae, 0x27, 0x71, 0xc8,
+0x87, 0x1d, 0xaa, 0x40, 0x44, 0x23, 0x68,
+0x9f, 0x51, 0xd5, 0x8b, 0x88, 0xf3, 0x29,
+0x2f, 0xf5, 0xdf, 0x31, 0xa5, 0xcd, 0x8e,
+0xc2, 0x16, 0x2f, 0x0f, 0x69, 0x45, 0xb8,
+0x9b, 0x23, 0xda, 0x29, 0xa6, 0x3c, 0xb8,
+0xc4, 0x81, 0x5c, 0x25, 0x1e, 0x88, 0x7e,
+0x30, 0x47, 0xe4, 0x4b, 0xea, 0x6a, 0xb2,
+0xe7, 0x78, 0x21, 0xe0, 0xec, 0x4f, 0x36,
+0xad, 0x1a, 0xe1, 0x1c, 0x9c, 0x83, 0xfb,
+0x51, 0xb1, 0x0b, 0x92, 0x1d, 0x04, 0xb2,
+0xe3, 0xf8, 0xf9, 0xb0, 0x67, 0x7a, 0x55,
+0x11, 0xb9, 0x24, 0xc5, 0x8d, 0x25, 0x74,
+0x49, 0x47, 0xb8, 0x6b, 0xc2, 0xe3, 0x84,
+0xef, 0x3a, 0x32, 0x46, 0x60, 0x1f, 0x5e,
+0xa4, 0x5f, 0x9e, 0x20, 0x3a, 0x6e, 0xc5,
+0x7e, 0x4b, 0xa5, 0x05, 0x46, 0xa4, 0x15,
+0xdd, 0x60, 0x3c, 0xda, 0xd9, 0x52, 0x20,
+0x59, 0xa3, 0x12, 0x6d, 0x03, 0xda, 0x88,
+0x60, 0xd6, 0xeb, 0x6b, 0x2a, 0x38, 0x35,
+0xe6, 0x4a, 0xbf, 0x57, 0xe9, 0x1d, 0x50,
+0x40, 0xd9, 0x74, 0xe9, 0xc5, 0x03, 0x2a,
+0xde, 0x1e, 0x95, 0xc7, 0xd4, 0xd2, 0x58,
+0x70, 0xdb, 0x20, 0xaa, 0x46, 0x94, 0x55,
+0xd8, 0x19, 0xc7, 0xe6, 0xd4, 0x9b, 0x25,
+0x4f, 0x5d, 0xf9, 0x57, 0x9d, 0xb3, 0x21,
+0x31, 0x95, 0x7c, 0xb6, 0xcb, 0x67, 0x4d,
+0x2f, 0xd7, 0xa7, 0xdd, 0xe5, 0x08, 0xf7,
+0x2e, 0xab, 0x37, 0xee, 0xb0, 0x78, 0x51,
+0x9b, 0xfd, 0xda, 0x9f, 0xe2, 0x8f, 0xc0,
+0x7d, 0xfd, 0x72, 0xd6, 0xa1, 0x5f, 0x05,
+0x73, 0x9b, 0x8d, 0xbf, 0xb1, 0x21, 0xd1,
+0x6f, 0x9b, 0x6d, 0x40, 0x68, 0x0e, 0x68,
+0x5c, 0x56, 0xfe, 0xae, 0xf1, 0xa6, 0x19,
+0x18, 0x16, 0xb9, 0xa5, 0xc3, 0x3b, 0x2c,
+0xcc, 0x15, 0x6d, 0xad, 0x01, 0xc3, 0x9c,
+0xcd, 0xce, 0xd2, 0xdb, 0x17, 0x07, 0x54,
+0x44, 0x2b, 0xa5, 0xaf, 0xe7, 0x65, 0xe8,
+0x2e, 0x71, 0xf3, 0xe3, 0x0d, 0xb1, 0xe4,
+0x07, 0x57, 0xb9, 0x83, 0x9f, 0xae, 0x98,
+0x1f, 0xc0, 0x1a, 0xc9, 0x94, 0x22, 0xe1,
+0x4c, 0xad, 0x1e, 0xc8, 0x6b, 0x34, 0x9a,
+0x0a, 0xeb, 0xd4, 0x83, 0x0e, 0xb1, 0x34,
+0x56, 0xdb, 0x9a, 0xca, 0xbb, 0x0d, 0x34,
+0x9c, 0x38, 0x74, 0x6b, 0xee, 0x67, 0x65,
+0xb4, 0xee, 0xb3, 0x65, 0xc4, 0x22, 0xeb,
+0x4b, 0x7d, 0x67, 0xe5, 0x83, 0x8d, 0xf4,
+0x92, 0x02, 0x88, 0xad, 0x85, 0xe7, 0xbd,
+0xfd, 0x9f, 0xd8, 0x55, 0x86, 0x8e, 0x0d,
+0x1a, 0xff, 0x1a, 0x0a, 0x5d, 0xf9, 0x0a,
+0xc3, 0xa3, 0x66, 0x35, 0xab, 0x09, 0x3c,
+0xfc, 0x3e, 0x81, 0xe7, 0xd2, 0xa2, 0x7c,
+0xf2, 0xb3, 0x0a, 0x18, 0x1b, 0xcb, 0xfa,
+0x3f, 0x6c, 0x2a, 0x9c, 0x56, 0x54, 0x6c,
+0xf6, 0xf6, 0xb8, 0xae, 0x63, 0xd0, 0x3b,
+0x03, 0xad, 0xc2, 0xb5, 0xe3, 0x17, 0x7e,
+0x60, 0x04, 0x76, 0x12, 0x2b, 0x86, 0x6a,
+0x9e, 0x7d, 0xa4, 0x92, 0x14, 0x61, 0x47,
+0x76, 0xb4, 0x8c, 0x27, 0x4e, 0x4b, 0xc6,
+0x52, 0x63, 0x8f, 0xa0, 0x17, 0xf6, 0x32,
+0x2c, 0x91, 0x5c, 0x14, 0x20, 0xb5, 0xf7,
+0x5a, 0xf2, 0x4e, 0xcf, 0xd3, 0x7b, 0x04,
+0xe6, 0xb9, 0xe5, 0x09, 0xa0, 0x53, 0xfd,
+0x60, 0x0c, 0x83, 0xb2, 0xb9, 0xcb, 0xd2,
+0xfb, 0xc3, 0x16, 0x48, 0x8d, 0xcf, 0xec,
+0xd8, 0xf2, 0x68, 0x46, 0x8f, 0x5a, 0x26,
+0x1c, 0x4e, 0x31, 0x7e, 0x65, 0x4b, 0xc7,
+0xd6, 0x4e, 0x9d, 0xe4, 0x06, 0x98, 0x1e,
+0xef, 0x79, 0x41, 0xfe, 0x9d, 0xe1, 0x68,
+0xbf, 0x45, 0x17, 0xb7, 0x34, 0x90, 0x7c,
+0xa6, 0xf2, 0xe7, 0xa7, 0x59, 0xc0, 0x12,
+0xb0, 0xce, 0x62, 0x1c, 0x22, 0x31, 0x52,
+0x8d, 0x3f, 0x55, 0x41, 0x92, 0x0a, 0xa5,
+0x1e, 0x1d, 0x3c, 0x84, 0xd2, 0x51, 0xe7,
+0x6b, 0x4a, 0xb5, 0x10, 0x01, 0xec, 0x76,
+0x5b, 0xda, 0x57, 0xe4, 0x11, 0xcd, 0x6f,
+0x40, 0x3e, 0xe6, 0x48, 0x22, 0x86, 0xd6,
+0xb6, 0x7c, 0x43, 0x84, 0x82, 0x70, 0x3e,
+0x35, 0x24, 0xaf, 0x79, 0x55, 0xe5, 0x36,
+0xcf, 0x3e, 0x02, 0xcf, 0x25, 0x02, 0xb6,
+0xd4, 0xc3, 0x17, 0x68, 0xba, 0x60, 0x94,
+0xf4, 0x3d, 0x7a, 0x0b, 0x48, 0xc1, 0xc6,
+0xd6, 0xf3, 0x1a, 0x08, 0x05, 0x20, 0x3e,
+0x88, 0x59, 0x83, 0x75, 0xa9, 0x1f, 0xd3,
+0x79, 0x81, 0x81, 0xac, 0xb3, 0x94, 0xd1,
+0x67, 0x5b, 0x6e, 0xcd, 0x04, 0x79, 0x91,
+0x8e, 0x6e, 0xa5, 0x2a, 0x06, 0x9d, 0x49,
+0x7c, 0x58, 0x91, 0xcf, 0xae, 0x88, 0xc0,
+0xc9, 0x19, 0xb4, 0xcc, 0x4e, 0x6e, 0x06,
+0x50, 0xf6, 0x3c, 0x3e, 0xc7, 0x48, 0xb1,
+0x9e, 0x32, 0xe3, 0x54, 0x05, 0xac, 0x41,
+0xd8, 0x31, 0xb6, 0xb3, 0x6e, 0xf1, 0x4d,
+0xfe, 0xd4, 0x38, 0x2e, 0xff, 0x2f, 0x3a,
+0x61, 0xa3, 0xe7, 0x77, 0x99, 0xcb, 0x27,
+0xb8, 0x26, 0xab, 0xc4, 0x10, 0xe3, 0xdf,
+0x93, 0x05, 0x2b, 0x95, 0x7e, 0xca, 0x2e,
+0x6c, 0xe2, 0x9b, 0x29, 0x67, 0xfd, 0x73,
+0x91, 0x61, 0x2b, 0xa4, 0x5d, 0xea, 0x95,
+0xe2, 0x63, 0xae, 0xe8, 0x43, 0x98, 0x2e,
+0x15, 0x09, 0xf4, 0x98, 0x5d, 0x9c, 0x98,
+0x4f, 0x74, 0x63, 0x9d, 0x5d, 0x93, 0xda,
+0x26, 0x36, 0xb7, 0xb0, 0xf9, 0xe5, 0x04,
+0x9c, 0xeb, 0xaf, 0x94, 0x72, 0xa1, 0xf5,
+0xf1, 0x7f, 0xa1, 0xeb, 0x32, 0x0a, 0x9a,
+0x90, 0xc5, 0xbb, 0xb8, 0x55, 0x05, 0x91,
+0xe0, 0x0c, 0xd6, 0x1e, 0x8f, 0xfd, 0xd8,
+0xe7, 0xf5, 0xb4, 0x2f, 0xf3, 0xa4, 0xe1,
+0x1b, 0x95, 0x30, 0xcf, 0x1f, 0x72, 0xfc,
+0xbb, 0x6d, 0x4d, 0x06, 0x80, 0x68, 0xe0,
+0x98, 0x77, 0x97, 0x66, 0x2c, 0x48, 0x3b,
+0xa6, 0xb9, 0x1d, 0x76, 0x02, 0x6c, 0x7a,
+0x9e, 0x3e, 0xf9, 0x2f, 0x4b, 0x1a, 0xae,
+0x34, 0x03, 0x39, 0xe2, 0x7f, 0x1e, 0x5a,
+0x29, 0x8d, 0x45, 0xac, 0x2e, 0x85, 0x91,
+0xd0, 0x37, 0xcf, 0xe0, 0x84, 0x02, 0x13,
+0x13, 0x69, 0xd7, 0x8a, 0xc6, 0xbc, 0x07,
+0xb4, 0x1c, 0xa0, 0xa7, 0x18, 0x73, 0x26,
+0x8d, 0xad, 0xae, 0x67, 0xc3, 0x83, 0x88,
+0x46, 0x52, 0x90, 0x23, 0x40, 0xd1, 0x04,
+0x50, 0xbe, 0x57, 0x0c, 0x37, 0x13, 0x8f,
+0x29, 0x8a, 0xcd, 0xc0, 0x67, 0xb7, 0x97,
+0xfa, 0x41, 0xf5, 0x88, 0x2f, 0x63, 0x4a,
+0x5b, 0xd2, 0x60, 0xc0, 0x76, 0xfa, 0xa8,
+0xbb, 0xfc, 0x8a, 0xc1, 0x07, 0x2a, 0x31,
+0x01, 0xf8, 0x31, 0x43, 0xdc, 0x13, 0x86,
+0xb1, 0x46, 0x6d, 0xb8, 0xd5, 0xc7, 0x14,
+0xa8, 0xab, 0x99, 0xd6, 0x54, 0x48, 0x9e,
+0x60, 0xf9, 0xf5, 0x74, 0xd9, 0xa9, 0xcc,
+0xbd, 0x1c, 0xa9, 0xce, 0xc2, 0xa6, 0x18,
+0x21, 0xad, 0x44, 0x72, 0x71, 0x8d, 0xd7,
+0x91, 0xcd, 0x4f, 0x9d, 0x98, 0x39, 0x2e,
+0x62, 0xe2, 0xbf, 0x8b, 0xab, 0xb0, 0x8c,
+0xda, 0xa7, 0x44, 0x45, 0xcf, 0xff, 0xfd,
+0x0e, 0xee, 0xd7, 0xcb, 0xbb, 0x09, 0x6d,
+0x86, 0xb2, 0x31, 0x54, 0xcd, 0xca, 0x49,
+0x67, 0x5c, 0x7f, 0x49, 0x90, 0xf3, 0xb3,
+0x95, 0x8d, 0x25, 0xed, 0x4e, 0x84, 0x28,
+0xb3, 0xbf, 0x68, 0xc1, 0xc6, 0x32, 0xa0,
+0x66, 0xb0, 0x07, 0x25, 0xc5, 0x26, 0xfb,
+0x76, 0x9e, 0x73, 0xed, 0x63, 0x19, 0x2f,
+0xb1, 0x3e, 0xb0, 0xc7, 0x8c, 0xd8, 0x7d,
+0x60, 0xb5, 0x0a, 0x0c, 0x57, 0x0d, 0xac,
+0xa5, 0xa3, 0xa4, 0x94, 0x4b, 0x07, 0x7d,
+0xc3, 0x4e, 0x99, 0x32, 0x34, 0x95, 0x7b,
+0x99, 0xea, 0x30, 0x93, 0x16, 0x81, 0x61,
+0x86, 0x6b, 0xa7, 0x28, 0xd9, 0x62, 0xf0,
+0x0e, 0x48, 0x5f, 0xad, 0x97, 0x1b, 0x8b,
+0x14, 0x4e, 0x10, 0xa7, 0xac, 0xf7, 0xa1,
+0x86, 0x43, 0x53, 0x73, 0x90, 0xc4, 0x4b,
+0xb9, 0xcb, 0x56, 0x8a, 0x54, 0xd0, 0xbb,
+0xa5, 0xcb, 0xbb, 0x7b, 0xb1, 0xb0, 0x22,
+0x82, 0x58, 0x85, 0xdd, 0x80, 0x78, 0xfb,
+0x2d, 0x67, 0x23, 0x38, 0xdb, 0x96, 0xe1,
+0x98, 0xc6, 0x07, 0xed, 0xd0, 0x8a, 0xeb,
+0x29, 0xda, 0xdd, 0xc9, 0x14, 0xea, 0xe9,
+0xeb, 0x3b, 0x5e, 0xd1, 0x06, 0x80, 0xb8,
+0x3e, 0x87, 0x49, 0x23, 0x5c, 0xcf, 0x47,
+0x20, 0xd4, 0x84, 0x2c, 0xba, 0xc7, 0x4b,
+0x0c, 0xf5, 0xfd, 0xa9, 0x36, 0xdd, 0x32,
+0x97, 0x78, 0x6b, 0x52, 0x4a, 0xac, 0x73,
+0xb6, 0x38, 0x58, 0x6c, 0xc4, 0x2c, 0xbe,
+0x57, 0xbc, 0xd2, 0x29, 0xad, 0xb0, 0xfc,
+0xd9, 0xcf, 0x0d, 0x4d, 0x8d, 0x85, 0x80,
+0x50, 0x8e, 0x35, 0xf1, 0x9a, 0x9f, 0x19,
+0x05, 0xb8, 0x65, 0x0f, 0x1b, 0xc5, 0xca,
+0xb9, 0xbb, 0x66, 0xf9, 0x18, 0x6a, 0x2b,
+0x45, 0x6f, 0x98, 0xe5, 0x09, 0xd4, 0x7b,
+0x84, 0x50, 0x3d, 0x44, 0x58, 0xf7, 0xa7,
+0xc8, 0xf3, 0xef, 0xa1, 0x5c, 0x0e, 0x9c,
+0x7f, 0xbf, 0x6d, 0xfd, 0x54, 0xcc, 0xe0,
+0xf8, 0xa9, 0x41, 0x85, 0x55, 0xfa, 0x0e,
+0xa2, 0x89, 0xc8, 0xcf, 0xd8, 0x6e, 0x6b,
+0x1d, 0x96, 0x9f, 0x48, 0xf9, 0xa2, 0x67,
+0xff, 0xf0, 0x86, 0x3d, 0x03, 0xc5, 0x73,
+0x5c, 0xeb, 0x9f, 0xe1, 0x1e, 0x5d, 0x06,
+0x59, 0x2e, 0xfa, 0x69, 0x41, 0x6f, 0x8b,
+0x5a, 0x51, 0x9a, 0x75, 0x0d, 0x6a, 0x94,
+0x51, 0xac, 0xb9, 0xb4, 0x31, 0xe1, 0xea,
+0x38, 0xe4, 0x91, 0x1a, 0x59, 0xb1, 0xd5,
+0x94, 0x3a, 0x7a, 0x9f, 0x5d, 0xb6, 0xe0,
+0x46, 0x33, 0x5c, 0x2d, 0xb4, 0x5e, 0x5d,
+0xaf, 0x0a, 0x24, 0x0a, 0xae, 0x39, 0xe5,
+0xef, 0xc4, 0xb1, 0x26, 0xad, 0x42, 0x1f,
+0xc3, 0x12, 0x79, 0xb8, 0x60, 0xcc, 0x23,
+0x28, 0x6d, 0x11, 0x41, 0x27, 0x08, 0x8f,
+0xbd, 0x12, 0xbe, 0x71, 0x5f, 0x48, 0x99,
+0x88, 0xa0, 0xa0, 0x34, 0xb5, 0x0e, 0x72,
+0xe3, 0x99, 0x7d, 0x88, 0x14, 0x1c, 0x3e,
+0x3d, 0x9b, 0x1e, 0xe0, 0x6b, 0x2b, 0xb6,
+0xd6, 0x3d, 0xe3, 0x86, 0xdf, 0x31, 0x61,
+0x5e, 0x4a, 0xba, 0xf6, 0x9d, 0xd4, 0xf9,
+0x8c, 0xdf, 0x59, 0x8a, 0x47, 0x2d, 0x04,
+0x95, 0x64, 0x2c, 0x0f, 0x9e, 0xcb, 0xf9,
+0x08, 0x37, 0x47, 0x43, 0x23, 0xe5, 0x16,
+0x5b, 0x73, 0xbe, 0xc1, 0x8f, 0x24, 0x59,
+0x36, 0xa7, 0xa9, 0xa8, 0x63, 0xd5, 0x25,
+0xfc, 0xf7, 0x64, 0x6a, 0x16, 0x2d, 0x03,
+0xe3, 0x44, 0x2a, 0xc8, 0xa9, 0x0a, 0xe4,
+0xb8, 0x11, 0xc0, 0xd8, 0x7f, 0x82, 0x96,
+0x79, 0x79, 0x0c, 0xdb, 0xe0, 0x09, 0xfb,
+0x0b, 0x84, 0x7a, 0x44, 0x91, 0x68, 0x15,
+0xec, 0x7d, 0x20, 0x43, 0x87, 0xd8, 0x99,
+0x4c, 0xda, 0xa5, 0xf1, 0xe1, 0xa8, 0xfb,
+0x7e, 0x07, 0x2a, 0x98, 0x43, 0x87, 0x69,
+0xa3, 0xb0, 0x68, 0xce, 0xdd, 0xad, 0xb0,
+0x1f, 0x26, 0x1e, 0x60, 0x4f, 0x92, 0xc8,
+0x74, 0xb3, 0xee, 0xee, 0x53, 0x73, 0x97,
+0x03, 0xa0, 0x5a, 0x84, 0x9f, 0x9b, 0x79,
+0x2b, 0x6b, 0xbb, 0xec, 0x95, 0xa6, 0x97,
+0x01, 0x47, 0x45, 0xd7, 0x07, 0x77, 0x86,
+0x19, 0x43, 0x8d, 0x9a, 0x44, 0x7c, 0xb5,
+0xfc, 0xa3, 0x47, 0x2b, 0xaf, 0x60, 0x26,
+0x6e, 0x7e, 0x85, 0xb6, 0x72, 0x26, 0xec,
+0x11, 0xe4, 0xf9, 0x11, 0xea, 0x0f, 0xba,
+0xe1, 0x17, 0x3c, 0xe6, 0x73, 0x4d, 0x03,
+0x25, 0x1d, 0xcf, 0x45, 0x07, 0x78, 0x01,
+0xfa, 0x31, 0x88, 0xc9, 0xe1, 0x23, 0x72,
+0x0f, 0x29, 0x19, 0x54, 0xa9, 0x81, 0xaa,
+0x0e, 0xa5, 0x76, 0x1a, 0xb9, 0x38, 0xbd,
+0xae, 0x53, 0xf8, 0xa6, 0x53, 0x4b, 0xc9,
+0xa8, 0x80, 0xeb, 0xbc, 0x24, 0xf6, 0xf3,
+0xb9, 0x3d, 0x53, 0x53, 0xf0, 0x13, 0xfe,
+0x3b, 0x5a, 0x60, 0xb9, 0x8a, 0x32, 0x7e,
+0x7a, 0x6f, 0xd2, 0xe5, 0x1b, 0x23, 0x66,
+0xb4, 0x3b, 0xc3, 0xf6, 0x1f, 0x62, 0xd5,
+0xe4, 0x26, 0x62, 0x38, 0xc0, 0x7f, 0xce,
+0xa4, 0x14, 0x11, 0xe9, 0xfa, 0x97, 0x64,
+0x4e, 0x0f, 0x82, 0x6f, 0x82, 0x82, 0x2d,
+0x2a, 0xd0, 0xc0, 0xd3, 0x66, 0x37, 0x87,
+0x1b, 0x9d, 0xaf, 0x2c, 0xbd, 0xe3, 0xb2,
+0x15, 0x36, 0x75, 0x65, 0x1c, 0x68, 0xbc,
+0x4d, 0x64, 0xe6, 0x50, 0x82, 0x0a, 0x4f,
+0x4b, 0x0d, 0x2c, 0x89, 0x63, 0x50, 0x18,
+0x48, 0x3c, 0xcf, 0xa8, 0xa8, 0xd8, 0x03,
+0xb8, 0xab, 0xed, 0x3a, 0x81, 0x1e, 0x90,
+0x00, 0x37, 0xd6, 0x45, 0xb5, 0x3b, 0xaf,
+0x3f, 0xa2, 0x65, 0xed, 0x94, 0xcf, 0x64,
+0xb7, 0xa5, 0x8c, 0xc5, 0xed, 0x82, 0xac,
+0x80, 0x08, 0x7e, 0xd2, 0x5b, 0x80, 0xfd,
+0xf3, 0xc7, 0x7c, 0x1b, 0xb0, 0x94, 0xb3,
+0xd4, 0x75, 0x3c, 0xf6, 0x66, 0x84, 0xb1,
+0xc5, 0x3c, 0x16, 0x9c, 0x02, 0x65, 0xb6,
+0x32, 0x7c, 0xd6, 0xbf, 0xf7, 0x38, 0xab,
+0xc3, 0x66, 0xa3, 0x2f, 0x19, 0x00, 0x40,
+0xd3, 0xd0, 0x97, 0xf2, 0x77, 0x09, 0x57,
+0x68, 0xcf, 0xce, 0x25, 0x7e, 0x7c, 0xec,
+0x31, 0xf6, 0xed, 0x1d, 0xdc, 0xbb, 0xa3,
+0x4b, 0x24, 0xb3, 0x94, 0x56, 0xed, 0xd8,
+0x59, 0x01, 0x4c, 0x45, 0xff, 0x9d, 0x8c,
+0xbf, 0xa1, 0x40, 0x19, 0xdc, 0x17, 0x04,
+0x8d, 0xd4, 0x43, 0x9e, 0xa0, 0x0a, 0xca,
+0x9d, 0x1e, 0xc7, 0xf5, 0x50, 0xad, 0x6b,
+0x99, 0x75, 0xda, 0x4b, 0xfc, 0x4f, 0x92,
+0x5e, 0x3c, 0x49, 0xb7, 0x0e, 0xf6, 0xda,
+0x35, 0xa7, 0x17, 0xd3, 0xb7, 0x30, 0xc9,
+0x7b, 0x50, 0xcc, 0x09, 0x29, 0xa4, 0xfa,
+0xc0, 0x63, 0xaf, 0xee, 0x0e, 0xfb, 0x06,
+0x69, 0x4a, 0x2f, 0x38, 0xf9, 0x3e, 0x42,
+0x22, 0xd1, 0x08, 0xe6, 0x75, 0xd1, 0x07,
+0xb6, 0x76, 0x11, 0x60, 0xe7, 0x03, 0x07,
+0x11, 0x3a, 0x2f, 0x38, 0x5e, 0x2b, 0xc7,
+0x65, 0xb6, 0x2c, 0x62, 0xf6, 0x4c, 0xb7,
+0xb6, 0xae, 0x56, 0x4c, 0x6d, 0xfe, 0x86,
+0xd6, 0x8b, 0x25, 0x04, 0xc1, 0x9c, 0x8c,
+0x87, 0x66, 0x1a, 0x7b, 0xe9, 0xf4, 0x0c,
+0xc0, 0xdb, 0xca, 0xf2, 0x8a, 0x8f, 0x0b,
+0xdb, 0x9d, 0xfe, 0xf5, 0x38, 0x09, 0x74,
+0xac, 0xd8, 0x7e, 0x7c, 0x1b, 0xc4, 0xda,
+0x71, 0x73, 0x00, 0x0b, 0x3f, 0x1b, 0xb0,
+0xbc, 0xd4, 0xe4, 0xf3, 0x14, 0x43, 0xb7,
+0x51, 0xd0, 0x38, 0x82, 0x77, 0x39, 0xa2,
+0x16, 0x0e, 0xc5, 0xd5, 0x90, 0x70, 0xb2,
+0x92, 0x4b, 0xb7, 0xb3, 0x7c, 0xad, 0x3a,
+0xf9, 0xd6, 0x53, 0x3f, 0xf8, 0xdb, 0x03,
+0x10, 0x14, 0x4f, 0x7c, 0x47, 0x64, 0x24,
+0xd2, 0xd8, 0xec, 0x72, 0x73, 0xc8, 0x21,
+0x81, 0xcc, 0xb5, 0x11, 0xd2, 0x8c, 0xbc,
+0xe1, 0x27, 0xa7, 0xe5, 0x76, 0xae, 0x92,
+0x19, 0x23, 0x99, 0x43, 0x8f, 0x3b, 0xee,
+0xd5, 0x62, 0xf8, 0x5c, 0xbf, 0x9f, 0xb9,
+0xa8, 0x65, 0xdb, 0xf6, 0x86, 0xff, 0x9b,
+0x2c, 0xe6, 0x80, 0x0b, 0x80, 0x17, 0x12,
+0x48, 0x81, 0x81, 0x79, 0x7d, 0xae, 0xc9,
+0x15, 0x79, 0x45, 0xa7, 0x45, 0x3a, 0x97,
+0xf5, 0x9a, 0x67, 0xaf, 0x07, 0x35, 0x28,
+0x61, 0xf1, 0x16, 0x0b, 0x89, 0x5e, 0xa8,
+0x63, 0x38, 0x24, 0xd9, 0x21, 0x7b, 0xa4,
+0x4e, 0x63, 0x4e, 0x26, 0xc5, 0x31, 0xcf,
+0x9e, 0x9b, 0x7e, 0xce, 0x94, 0x58, 0x95,
+0x63, 0x36, 0x88, 0xa8, 0x96, 0x1b, 0xd5,
+0xfd, 0x24, 0xfc, 0xc3, 0xaf, 0x39, 0xb2,
+0x12, 0x18, 0xb7, 0xe4, 0x93, 0xb3, 0x7c,
+0x73, 0x38, 0x2d, 0x63, 0xb6, 0x3b, 0xce,
+0xa9, 0x0e, 0xb8, 0xa5, 0x4b, 0x97, 0x63,
+0x92, 0xcf, 0xd9, 0xd9, 0x67, 0x40, 0x17,
+0x42, 0x4b, 0xc8, 0xdf, 0x4c, 0x14, 0x3b,
+0x3c, 0x23, 0x91, 0xf2, 0x57, 0x38, 0x23,
+0x8e, 0x66, 0xf0, 0xfd, 0x3b, 0x9e, 0x4d,
+0x93, 0x23, 0x49, 0xed, 0x96, 0xf7, 0x1b,
+0x11, 0x55, 0x55, 0x86, 0x2f, 0x09, 0xe1,
+0x57, 0xa8, 0xc2, 0x54, 0x1a, 0x81, 0x85,
+0x50, 0x64, 0xfc, 0x16, 0x0b, 0x0c, 0x20,
+0x24, 0xb5, 0x62, 0x8f, 0x21, 0xc1, 0xe8,
+0x14, 0x7e, 0xec, 0x8c, 0xa4, 0x82, 0x3b,
+0xb9, 0xfc, 0x3e, 0xfd, 0x96, 0x17, 0xe0,
+0xcf, 0x6f, 0x21, 0x67, 0xb5, 0x76, 0x39,
+0x8b, 0xf6, 0x98, 0xff, 0xbb, 0x7f, 0xd6,
+0x8c, 0xdb, 0x4a, 0xba, 0xdf, 0xd6, 0x52,
+0xfa, 0x53, 0x2e, 0x82, 0x7e, 0x1c, 0x1e,
+0x63, 0x7c, 0x35, 0x39, 0xde, 0x9f, 0x5f,
+0xc4, 0xbe, 0xe2, 0xcd, 0xcf, 0x43, 0x40,
+0x55, 0x98, 0x6a, 0x21, 0x8e, 0xac, 0x93,
+0x90, 0x98, 0x6f, 0xcf, 0xe5, 0x88, 0x13,
+0x27, 0x5c, 0x88, 0xad, 0x16, 0x9a, 0x2f,
+0x5f, 0x8b, 0x88, 0xfd, 0x01, 0x9a, 0x75,
+0x56, 0x5f, 0xd4, 0x6f, 0xc7, 0x20, 0x30,
+0xe2, 0xf6, 0x97, 0x77, 0xee, 0xa1, 0xd4,
+0x50, 0x26, 0x3a, 0x3f, 0x9e, 0x5a, 0x75,
+0xa8, 0xce, 0xf5, 0x4f, 0x2e, 0xfc, 0xee,
+0x87, 0xb2, 0xe9, 0x92, 0x5e, 0xce, 0x09,
+0x12, 0x1b, 0x56, 0x3e, 0x28, 0xb1, 0x2c,
+0x1f, 0xe4, 0x59, 0x09, 0x75, 0x1a, 0xdf,
+0x3e, 0x91, 0x79, 0x0f, 0x71, 0x36, 0x6d,
+0xb2, 0xcd, 0x82, 0x0c, 0x9d, 0x3d, 0xfa,
+0x0f, 0x8c, 0xf8, 0xc2, 0x65, 0xa6, 0xae,
+0x42, 0xe5, 0x73, 0x0d, 0x6e, 0x26, 0x92,
+0x8e, 0x1d, 0x88, 0x2f, 0x2c, 0xa5, 0x92,
+0x8b, 0xac, 0xa8, 0x60, 0x1d, 0xbc, 0xbe,
+0x03, 0x04, 0x53, 0x5d, 0xf9, 0x33, 0x12,
+0x8b, 0xc2, 0x6c, 0x5a, 0xf4, 0x68, 0x4d,
+0x94, 0x65, 0x06, 0xa5, 0xa3, 0x06, 0x62,
+0x82, 0xb6, 0x4d, 0xf3, 0x76, 0x9d, 0xdc,
+0x69, 0xb8, 0xef, 0xf5, 0x80, 0xa5, 0xc6,
+0xfe, 0xe1, 0xcc, 0xb3, 0x5a, 0xa9, 0x8a,
+0x70, 0x33, 0xc6, 0x9f, 0x33, 0xdb, 0x51,
+0xc1, 0x10, 0x00, 0xea, 0x2d, 0x37, 0x51,
+0x63, 0x55, 0xe7, 0x7f, 0x75, 0x41, 0x9f,
+0x7a, 0x79, 0xb7, 0x05, 0xfa, 0xf4, 0x11,
+0x05, 0xf2, 0x8b, 0x5e, 0xc0, 0x34, 0x26,
+0x25, 0xa0, 0x00, 0xe5, 0xf5, 0x7a, 0x82,
+0xec, 0x11, 0xdf, 0xd4, 0x68, 0x87, 0x69,
+0x81, 0x40, 0xff, 0x1a, 0x3d, 0xc7, 0x37,
+0xe1, 0x94, 0x42, 0xa5, 0xdf, 0xc0, 0xeb,
+0x38, 0x82, 0x2d, 0x33, 0xf7, 0x9d, 0x6c,
+0x7c, 0xee, 0xa4, 0x3e, 0x37, 0x73, 0xfc,
+0x3b, 0x2c, 0xd9, 0x0c, 0x5b, 0x7a, 0x18,
+0x9c, 0xe3, 0x53, 0xc5, 0xbb, 0x02, 0xc2,
+0x4a, 0x03, 0xb3, 0xeb, 0xe9, 0x74, 0xc3,
+0xf6, 0xeb, 0xab, 0xe9, 0x24, 0xbf, 0x7a,
+0x0f, 0xfd, 0x35, 0xe1, 0x7f, 0xb2, 0x38,
+0x60, 0xb9, 0x4d, 0x24, 0x15, 0x5d, 0x74,
+0x27, 0x16, 0xe9, 0x57, 0x63, 0x2d, 0x62,
+0x82, 0x7e, 0x41, 0xc4, 0xe9, 0xc7, 0x64,
+0x91, 0x6e, 0x41, 0xbe, 0x01, 0x19, 0xce,
+0x0f, 0x14, 0x42, 0xd5, 0x7f, 0xbb, 0x8b,
+0x28, 0x7f, 0x79, 0xa8, 0xf7, 0xdc, 0x70,
+0xe2, 0x09, 0xc9, 0x93, 0x23, 0xae, 0x13,
+0x96, 0x7d, 0xb2, 0x75, 0x18, 0xbd, 0xee,
+0x88, 0x76, 0xb1, 0x97, 0xb5, 0xf7, 0x7b,
+0x85, 0x32, 0x43, 0xb8, 0xec, 0xf7, 0x2b,
+0x77, 0x99, 0x59, 0xbd, 0xc5, 0x15, 0x3c,
+0x3f, 0x6f, 0xa2, 0x16, 0x1e, 0x47, 0x1c,
+0x9c, 0x80, 0x3a, 0x7e, 0xcd, 0xb8, 0xad,
+0x53, 0xf5, 0x04, 0xcc, 0x7e, 0x8b, 0x4e,
+0x6c, 0x65, 0x52, 0x1c, 0x8a, 0x7a, 0xa6,
+0x30, 0x6a, 0x6f, 0xc2, 0xf5, 0x26, 0xf8,
+0xc9, 0xa6, 0xb1, 0x47, 0x18, 0x16, 0x3d,
+0x38, 0x47, 0x95, 0xa5, 0x16, 0xb2, 0x95,
+0x77, 0xad, 0x2b, 0xdf, 0xf8, 0x27, 0xc8,
+0x7c, 0xf7, 0xa0, 0x12, 0x13, 0xa1, 0xcb,
+0xd0, 0xd3, 0x01, 0x7f, 0x51, 0x89, 0x88,
+0x55, 0x73, 0x66, 0x18, 0x4b, 0xa5, 0xfa,
+0xd9, 0xde, 0xb5, 0xde, 0x2d, 0x4f, 0xe5,
+0x99, 0xda, 0x1c, 0x0d, 0xaf, 0x8d, 0xaf,
+0xaa, 0x33, 0x37, 0x97, 0xd9, 0xca, 0x53,
+0x1a, 0x9f, 0x8c, 0xd0, 0x56, 0xb9, 0x5b,
+0xb2, 0x99, 0xad, 0x8e, 0x85, 0x00, 0x97,
+0xf1, 0x23, 0xb0, 0x2c, 0xd7, 0x6c, 0x22,
+0xb8, 0x55, 0xcf, 0xb9, 0x96, 0x49, 0xbb,
+0xe2, 0x02, 0x58, 0x07, 0xd1, 0xb0, 0x05,
+0xc5, 0xe5, 0x9a, 0xd9, 0xce, 0x3e, 0xa9,
+0xd0, 0x27, 0x32, 0x8a, 0x59, 0xd4, 0xde,
+0xde, 0x7a, 0x9a, 0x7e, 0x34, 0x08, 0xfc,
+0xbc, 0xbe, 0x32, 0x96, 0xd0, 0x4d, 0x70,
+0x16, 0xac, 0x9f, 0xa9, 0xca, 0x0d, 0xe8,
+0x50, 0xcd, 0x0c, 0x41, 0xfe, 0x43, 0xe0,
+0x97, 0x75, 0xb9, 0x11, 0xc3, 0x48, 0xe7,
+0xfa, 0x5b, 0xf3, 0x92, 0x7f, 0x3a, 0x50,
+0xe4, 0xd7, 0x49, 0xe0, 0x22, 0x79, 0x2a,
+0x19, 0x7e, 0x21, 0x08, 0xf9, 0x5b, 0x87,
+0x13, 0x8d, 0xf1, 0x02, 0x10, 0x14, 0xe9,
+0x11, 0xfa, 0xb2, 0xd5, 0x08, 0xdb, 0xbc,
+0x95, 0x79, 0x8d, 0xce, 0x53, 0x41, 0xd7,
+0xf9, 0x72, 0x6d, 0xe3, 0x95, 0x0e, 0x51,
+0x18, 0x30, 0x2a, 0xe5, 0x3c, 0x57, 0xb1,
+0x3a, 0x5a, 0xbb, 0x3c, 0x8e, 0x90, 0x20,
+0x1e, 0x70, 0x2c, 0x97, 0x17, 0x5b, 0x02,
+0x0b, 0x4f, 0x78, 0x9c, 0x91, 0x9a, 0x77,
+0x87, 0xbc, 0x40, 0x9d, 0x15, 0xbe, 0xf4,
+0x19, 0x1f, 0xb3, 0x60, 0x6b, 0x31, 0x2c,
+0xd2, 0xdf, 0xf5, 0xae, 0xaa, 0x2d, 0xb1,
+0x52, 0xb5, 0x2b, 0x0d, 0x44, 0x79, 0x30,
+0x3e, 0x60, 0x5b, 0x35, 0xd5, 0x21, 0xaf,
+0xec, 0xed, 0xbb, 0x94, 0xf9, 0xf4, 0x76,
+0x05, 0x16, 0x50, 0x1e, 0x57, 0x7f, 0xfc,
+0x76, 0xf1, 0x30, 0x95, 0xae, 0xa2, 0xad,
+0xce, 0x24, 0x4a, 0x08, 0xc6, 0xf8, 0xd8,
+0x8d, 0x88, 0xb7, 0x5d, 0x59, 0x27, 0x93,
+0xe1, 0x74, 0xbe, 0xa2, 0x48, 0x15, 0x1f,
+0x44, 0x88, 0x4f, 0x72, 0xd8, 0x51, 0x3b,
+0xdf, 0x74, 0x4c, 0xd7, 0x60, 0x6c, 0x99,
+0x79, 0xf3, 0xdc, 0xd5, 0xbc, 0xf8, 0x57,
+0x13, 0x4d, 0x2b, 0x91, 0xbe, 0x94, 0xa8,
+0x31, 0x74, 0x49, 0x7e, 0x40, 0xca, 0x8b,
+0xe9, 0xf5, 0x83, 0x90, 0x86, 0x8f, 0xa3,
+0x46, 0xcf, 0x4a, 0xbc, 0xf5, 0xc9, 0x03,
+0xb4, 0x25, 0xaa, 0xe6, 0xd5, 0xeb, 0xcc,
+0x20, 0x0d, 0x58, 0x05, 0x2c, 0x6d, 0xd5,
+0xbe, 0x38, 0xd5, 0x97, 0x40, 0x1b, 0x9e,
+0xfc, 0x5f, 0x56, 0xe5, 0x3c, 0xb3, 0x99,
+0x7a, 0x44, 0x62, 0x2f, 0xef, 0x5a, 0x1b,
+0x36, 0x3e, 0x84, 0xf1, 0xde, 0x24, 0xf6,
+0x48, 0x24, 0xc0, 0x20, 0xf3, 0xb3, 0x8c,
+0x77, 0xd0, 0xb4, 0xa3, 0xba, 0xad, 0x1d,
+0xf9, 0x27, 0xc4, 0x79, 0x4c, 0x2a, 0x8a,
+0x05, 0xfc, 0x84, 0x9c, 0x11, 0x71, 0xce,
+0x12, 0x00, 0xdf, 0x5c, 0xaa, 0xc2, 0x4e,
+0xdf, 0x7b, 0xdb, 0x2f, 0x22, 0x19, 0x9e,
+0xb2, 0xf6, 0x34, 0x35, 0xc5, 0x22, 0xcf,
+0x07, 0x4b, 0x99, 0xc6, 0x39, 0x3b, 0x9d,
+0x5e, 0xd0, 0x4f, 0x06, 0x41, 0xb4, 0x2e,
+0xd1, 0x8d, 0x22, 0x41, 0x45, 0x58, 0x46,
+0x29, 0xe0, 0x26, 0x38, 0x45, 0x00, 0xdb,
+0x6c, 0xfc, 0xc4, 0x9f, 0xe5, 0xb3, 0x3b,
+0xba, 0x57, 0x82, 0x51, 0x2d, 0xef, 0x3e,
+0xc1, 0x65, 0x89, 0x3d, 0x85, 0x62, 0xe9,
+0x58, 0x1c, 0x27, 0x77, 0xa0, 0xcb, 0x2d,
+0x33, 0x88, 0x2c, 0xb7, 0x32, 0xa5, 0x55,
+0xdb, 0xe5, 0x33, 0x88, 0x5f, 0x72, 0xb1,
+0x91, 0x9b, 0xe0, 0xab, 0x41, 0x59, 0x85,
+0x8e, 0xd1, 0x4f, 0xb9, 0x64, 0x43, 0x82,
+0x31, 0x1e, 0x39, 0x43, 0x9c, 0x78, 0xfd,
+0x1c, 0x77, 0xa5, 0x87, 0x09, 0x9e, 0x13,
+0x22, 0x45, 0x0c, 0x9a, 0xf7, 0xa9, 0x57,
+0x19, 0x7a, 0x40, 0xfa, 0x81, 0x66, 0xd6,
+0x89, 0x41, 0x92, 0xb4, 0x97, 0x13, 0xf9,
+0xf4, 0x84, 0xde, 0xe3, 0x37, 0x6e, 0xce,
+0x49, 0xd8, 0xa7, 0x1a, 0x27, 0xad, 0xb5,
+0xe1, 0x06, 0x8e, 0x3d, 0xf5, 0xa0, 0x79,
+0xd8, 0x91, 0xca, 0x15, 0x0b, 0xca, 0x80,
+0x82, 0xbc, 0xf8, 0x68, 0x9b, 0xa5, 0x3f,
+0x68, 0x1c, 0x9f, 0x68, 0xd1, 0x25, 0xc3,
+0x2c, 0xb3, 0xe9, 0x45, 0x2d, 0x01, 0x81,
+0x75, 0x2f, 0xf2, 0x50, 0x7b, 0xca, 0x7c,
+0xe2, 0x1e, 0x17, 0x47, 0x34, 0x25, 0x8e,
+0x5a, 0x04, 0xe4, 0x6c, 0xd2, 0xad, 0x7f,
+0xaa, 0xaa, 0xc8, 0x1d, 0x2a, 0xaa, 0x62,
+0x16, 0x31, 0x4b, 0x88, 0x1d, 0x2d, 0xd5,
+0x31, 0x96, 0x15, 0xa7, 0xb0, 0xa6, 0x0c,
+0xc4, 0xef, 0xcb, 0xb9, 0x86, 0x8a, 0xfe,
+0xb9, 0x99, 0xc8, 0x73, 0xd5, 0x3a, 0xa0,
+0x24, 0x06, 0x1b, 0x89, 0x45, 0xc0, 0x38,
+0x33, 0xcc, 0xae, 0xab, 0x10, 0x31, 0xed,
+0x68, 0x0d, 0x9b, 0x3c, 0xa7, 0xde, 0xac,
+0x3f, 0x97, 0x0c, 0x3e, 0xca, 0x02, 0xaa,
+0xe2, 0x87, 0x7c, 0x61, 0xfe, 0x7e, 0x82,
+0x32, 0x20, 0xcf, 0x84, 0x12, 0x78, 0x37,
+0x1e, 0x4c, 0xb0, 0xe6, 0x4e, 0x54, 0x84,
+0x5e, 0xa0, 0x93, 0x6b, 0xa3, 0x59, 0x71,
+0xcf, 0x40, 0x7a, 0xda, 0x28, 0x19, 0xf1,
+0x6a, 0x6f, 0xb7, 0x1e, 0xe0, 0xcd, 0xbc,
+0x99, 0xb7, 0x6e, 0x2d, 0x2b, 0xdd, 0xf7,
+0xea, 0x81, 0x65, 0x39, 0xd2, 0x90, 0xd3,
+0xbc, 0x64, 0xb5, 0x2c, 0xeb, 0xb4, 0xaf,
+0x4e, 0x9c, 0x50, 0x67, 0x60, 0xc3, 0xd2,
+0x56, 0xb3, 0x34, 0x94, 0xbb, 0x4d, 0xeb,
+0x4c, 0x8f, 0x7f, 0x31, 0x8a, 0xe1, 0xd8,
+0xf9, 0x18, 0x62, 0x4d, 0xa4, 0xb6, 0x4a,
+0x80, 0xa8, 0x09, 0x85, 0x2c, 0x1a, 0x14,
+0x3c, 0xa9, 0xab, 0x28, 0xef, 0x35, 0x37,
+0x7c, 0xdc, 0x69, 0x0e, 0x8f, 0x82, 0xa0,
+0xfb, 0xb4, 0x86, 0xcc, 0xd9, 0x07, 0x1a,
+0x2d, 0x53, 0xa9, 0x5b, 0x46, 0xf7, 0xf2,
+0xcb, 0x7a, 0x85, 0x62, 0x89, 0xc8, 0x53,
+0x08, 0x24, 0xfc, 0x11, 0x10, 0xfb, 0x4f,
+0x31, 0xa3, 0xcd, 0xd5, 0x75, 0x91, 0xbd,
+0x18, 0xb3, 0xaa, 0x40, 0xed, 0xda, 0xe9,
+0x83, 0xcc, 0x46, 0xb4, 0x1f, 0xb8, 0xd8,
+0x11, 0xbf, 0xa6, 0x83, 0x58, 0x93, 0xfc,
+0xe2, 0xc7, 0x0d, 0xa0, 0x13, 0xd0, 0x6d,
+0xe2, 0xb7, 0x50, 0xc9, 0xcb, 0x41, 0x8b,
+0xfd, 0xa6, 0xf7, 0x25, 0xe1, 0xb6, 0x40,
+0x69, 0xbc, 0xd5, 0x80, 0x3d, 0xbb, 0x7b,
+0x30, 0xf7, 0x84, 0x2f, 0x04, 0xb8, 0x22,
+0xc8, 0x33, 0xc4, 0x26, 0x30, 0xd1, 0x50,
+0x53, 0x13, 0xd1, 0x45, 0xfc, 0x0c, 0x33,
+0xb9, 0xa8, 0xc2, 0x41, 0x29, 0x0c, 0x4e,
+0x98, 0xb9, 0x43, 0xc2, 0x7b, 0x24, 0x68,
+0x77, 0xcc, 0xad, 0x7e, 0x62, 0x51, 0x7d,
+0x1d, 0x34, 0xaf, 0x08, 0xa8, 0x15, 0x24,
+0x2d, 0xbe, 0x9c, 0x9f, 0xb3, 0xb8, 0x6b,
+0x29, 0x68, 0x4e, 0x07, 0x6f, 0xfb, 0xe1,
+0xc8, 0x27, 0x5b, 0x3c, 0xef, 0x8f, 0x85,
+0x79, 0x75, 0x42, 0xfb, 0xab, 0x59, 0x9c,
+0x8c, 0x18, 0x10, 0x0f, 0xc4, 0x74, 0x24,
+0xfe, 0x82, 0x7f, 0xb6, 0x6c, 0xfd, 0xc0,
+0xc5, 0xd6, 0xa6, 0x23, 0x7c, 0x26, 0xf1,
+0x28, 0x09, 0x32, 0xa3, 0x59, 0x5f, 0x98,
+0x52, 0x70, 0x40, 0x1e, 0x75, 0xfc, 0x3f,
+0xad, 0xa2, 0xa6, 0xc2, 0xea, 0xf9, 0x1d,
+0xbc, 0xd9, 0x6a, 0xa3, 0x48, 0x18, 0x15,
+0x01, 0x99, 0x5c, 0xe1, 0x23, 0x76, 0xeb,
+0x35, 0x1a, 0xfb, 0xdb, 0xcc, 0xc8, 0x49,
+0xf0, 0x4a, 0xfd, 0xf6, 0x5d, 0x20, 0x42,
+0x78, 0xf5, 0xf5, 0x44, 0x0b, 0x11, 0x77,
+0xc4, 0xd4, 0x0f, 0x60, 0xb3, 0xc9, 0xe1,
+0x04, 0xa0, 0xe6, 0xc1, 0x2e, 0xb6, 0x1d,
+0x9d, 0x1d, 0xeb, 0x1c, 0xa2, 0x85, 0x0c,
+0x1b, 0x8d, 0xb0, 0xa8, 0xea, 0x4c, 0x12,
+0x2d, 0xf6, 0x85, 0xf0, 0xe9, 0x3f, 0x17,
+0x2f, 0x3d, 0xe4, 0x03, 0x29, 0x5a, 0xe7,
+0x95, 0x1e, 0x6c, 0xea, 0x8e, 0x92, 0x15,
+0x98, 0x83, 0xcb, 0xec, 0x4a, 0x84, 0x39,
+0x7a, 0xc0, 0xc7, 0xd8, 0x97, 0x79, 0xcc,
+0x6a, 0x9a, 0x4a, 0x3e, 0xfb, 0x4f, 0xd1,
+0x64, 0xd9, 0xf7, 0xb2, 0xc4, 0xcc, 0xd3,
+0x9c, 0x22, 0x55, 0xc3, 0xbc, 0xf8, 0xf8,
+0x2e, 0x35, 0x37, 0x05, 0x47, 0x43, 0x26,
+0x43, 0xb3, 0x96, 0x1c, 0xd4, 0x1a, 0xc7,
+0x2b, 0xdd, 0x5a, 0x9c, 0xb4, 0x58, 0x3a,
+0x9f, 0x24, 0x9d, 0x82, 0x31, 0x21, 0x44,
+0x81, 0x44, 0x67, 0x78, 0xcb, 0x57, 0x20,
+0xd3, 0xdc, 0x54, 0x4b, 0x2b, 0xd6, 0xa7,
+0xff, 0x83, 0x8e, 0x6b, 0xa9, 0xac, 0xb1,
+0x25, 0xf7, 0x33, 0xad, 0xbe, 0xc6, 0x83,
+0xd1, 0x9c, 0x72, 0x12, 0x61, 0xc9, 0xf2,
+0xc2, 0x4a, 0xe0, 0x7f, 0x5d, 0xab, 0xb8,
+0x6f, 0x94, 0xad, 0x78, 0x8c, 0x98, 0x58,
+0xa0, 0x31, 0xf8, 0x73, 0xec, 0x61, 0x54,
+0xd1, 0x3f, 0x46, 0xd1, 0xa2, 0xe9, 0x9a,
+0x99, 0x8f, 0x32, 0xa2, 0x23, 0x9f, 0xf3,
+0xc0, 0xa2, 0xfd, 0x23, 0x5c, 0x93, 0x82,
+0xfa, 0xfe, 0xce, 0x28, 0xdf, 0xa2, 0x32,
+0xf6, 0x2c, 0x67, 0xeb, 0x0f, 0x7c, 0x43,
+0xab, 0xd9, 0xbd, 0x1c, 0x38, 0xf4, 0x80,
+0x12, 0xb8, 0x14, 0x05, 0x8e, 0xab, 0x62,
+0x47, 0x6a, 0xa8, 0xa4, 0x89, 0xfd, 0xf5,
+0x85, 0x8a, 0xea, 0x2c, 0x58, 0x3e, 0x95,
+0xe5, 0x6a, 0x6f, 0xd3, 0x63, 0x47, 0x3c,
+0xfb, 0xdb, 0x6c, 0x94, 0xb0, 0xcf, 0x97,
+0xdd, 0xfc, 0xde, 0xa9, 0x5e, 0x67, 0x49,
+0x37, 0x55, 0xe5, 0xd4, 0x25, 0xbc, 0x95,
+0x58, 0x9d, 0xf7, 0x08, 0x05, 0x34, 0x32,
+0xbf, 0x4f, 0xf1, 0xf5, 0x3a, 0x59, 0x1c,
+0x55, 0x6b, 0xbd, 0x14, 0x83, 0x29, 0xbe,
+0x4f, 0xab, 0xe2, 0xc0, 0xc7, 0x52, 0xf6,
+0x6e, 0x73, 0x60, 0x35, 0x35, 0x27, 0x73,
+0x9f, 0xcc, 0x07, 0xee, 0xbd, 0x2c, 0xbb,
+0x47, 0x46, 0x1f, 0xdf, 0x05, 0xd8, 0xcf,
+0x5e, 0xc9, 0x5a, 0xa7, 0x46, 0xdb, 0xcd,
+0x98, 0xb4, 0xf1, 0x2a, 0x90, 0xbf, 0xad,
+0x39, 0x73, 0x9e, 0x78, 0xf7, 0x40, 0xda,
+0x1b, 0xc9, 0xe0, 0x1f, 0x24, 0xd4, 0x4f,
+0xee, 0x3c, 0x97, 0x15, 0xa9, 0x05, 0xd0,
+0xa1, 0x8b, 0x81, 0x57, 0xb1, 0xe8, 0x55,
+0x25, 0xa2, 0x2b, 0x2c, 0x10, 0xf2, 0x3e,
+0x0e, 0xb2, 0xea, 0x7c, 0x63, 0x9b, 0x01,
+0x54, 0x26, 0x20, 0xd3, 0xc5, 0x2b, 0x76,
+0xe6, 0xc9, 0x34, 0x84, 0xf0, 0xf5, 0xb5,
+0x50, 0xb9, 0xd9, 0x9a, 0xba, 0x2a, 0x7a,
+0xd6, 0xea, 0xec, 0x1a, 0xee, 0xbe, 0x5a,
+0x6b, 0x9e, 0xa7, 0x7a, 0x34, 0xe6, 0xf7,
+0xb7, 0x97, 0x57, 0xba, 0x6f, 0x56, 0xe8,
+0xc7, 0xc0, 0xa1, 0xfe, 0x5d, 0xf0, 0x0f,
+0x06, 0xf5, 0xbc, 0x4d, 0x68, 0x75, 0x39,
+0x3d, 0x93, 0x4e, 0x1f, 0xb7, 0xcd, 0xc6,
+0x3f, 0x5a, 0xf2, 0x71, 0x79, 0xbe, 0x8a,
+0x44, 0xe4, 0x8f, 0xad, 0x1b, 0xaf, 0x6d,
+0x2e, 0x27, 0xd2, 0xd3, 0x0e, 0xfb, 0x1c,
+0x62, 0x75, 0x7d, 0xaf, 0x0d, 0xf0, 0x45,
+0x77, 0xf0, 0xfc, 0xbd, 0x4b, 0xae, 0xe9,
+0x0e, 0xb4, 0xed, 0x4a, 0xf9, 0x6c, 0x34,
+0xbf, 0x94, 0x94, 0x0c, 0xf9, 0xd1, 0x66,
+0x37, 0x90, 0xba, 0x1e, 0x62, 0x61, 0xbf,
+0xc8, 0xed, 0x9f, 0xf0, 0x9d, 0xf5, 0xa2,
+0x5f, 0x22, 0x5b, 0xcf, 0x22, 0xb0, 0x91,
+0xe8, 0x17, 0x56, 0x0d, 0xf4, 0x60, 0x5e,
+0x77, 0x97, 0x42, 0xb6, 0x33, 0xdb, 0xcd,
+0x5f, 0x04, 0xa2, 0x7c, 0x1e, 0xb2, 0xd7,
+0xc9, 0xf5, 0x4d, 0xdf, 0x76, 0xe7, 0xb1,
+0x83, 0xa5, 0x72, 0x13, 0xf1, 0x27, 0x65,
+0x49, 0x7f, 0x05, 0x6e, 0x35, 0xab, 0x73,
+0xcb, 0x09, 0x49, 0x14, 0x1f, 0xf1, 0xa6,
+0x85, 0x8b, 0x61, 0x3a, 0xb7, 0xe0, 0x1d,
+0x87, 0xeb, 0x34, 0x44, 0xd8, 0xd4, 0x12,
+0x7b, 0x82, 0xa1, 0xb6, 0x77, 0x53, 0xd7,
+0x36, 0x39, 0x64, 0x49, 0xbd, 0xd1, 0xb4,
+0x3d, 0xea, 0x4d, 0x0b, 0x50, 0x5d, 0x0a,
+0x5d, 0x64, 0xa2, 0xac, 0x7d, 0x6c, 0x6a,
+0x2c, 0x01, 0x75, 0x1b, 0xbd, 0x19, 0xf6,
+0x4a, 0xe6, 0x83, 0x0b, 0x23, 0x5f, 0xe2,
+0xe8, 0x15, 0x70, 0x2c, 0x63, 0x68, 0xde,
+0x1c, 0xf8, 0xd4, 0x41, 0xab, 0x0e, 0xf0,
+0x39, 0xbe, 0x3c, 0x46, 0xfd, 0x2b, 0xcb,
+0x21, 0x88, 0x4c, 0xdf, 0xf8, 0x91, 0x3b,
+0x83, 0xa1, 0x3e, 0xaa, 0xc6, 0xc0, 0xd9,
+0x1d, 0xac, 0x0c, 0x79, 0xec, 0x23, 0xed,
+0xde, 0x4a, 0xcc, 0x33, 0xdb, 0x5a, 0x81,
+0x3b, 0xee, 0xa6, 0x22, 0x4d, 0x87, 0x43,
+0x29, 0x1a, 0x3f, 0xdd, 0xe3, 0xc5, 0x1a,
+0x3b, 0x8f, 0x22, 0x42, 0xa9, 0x43, 0xdf,
+0x07, 0x2e, 0x0c, 0xc0, 0x6f, 0x69, 0x9d,
+0x1f, 0x03, 0x4a, 0xc2, 0x8f, 0x2e, 0x07,
+0x09, 0x20, 0xa8, 0xbb, 0xb4, 0x63, 0xd1,
+0x12, 0x09, 0xf6, 0xd6, 0x01, 0xa4, 0x25,
+0x74, 0xa8, 0xb9, 0x56, 0x82, 0xdb, 0x78,
+0xe8, 0x41, 0xbb, 0xc6, 0x18, 0xc5, 0x86,
+0xa3, 0xea, 0xbf, 0x90, 0x2c, 0xdd, 0x15,
+0xe0, 0x4a, 0x21, 0xd4, 0x42, 0x94, 0x94,
+0xf4, 0x48, 0x62, 0x97, 0x25, 0xc7, 0xcd,
+0x44, 0x88, 0x20, 0xd6, 0x05, 0x4b, 0x96,
+0x89, 0xd0, 0x3e, 0x0d, 0x9f, 0xa3, 0x24,
+0xf8, 0xf8, 0xed, 0x7e, 0xe1, 0x64, 0xa9,
+0x03, 0x04, 0x07, 0x19, 0x5f, 0x1c, 0x08,
+0x59, 0xef, 0x5e, 0xa6, 0xe0, 0xe4, 0x79,
+0xd7, 0xd9, 0x15, 0x83, 0xc8, 0x67, 0xf4,
+0xaa, 0x89, 0xaf, 0xa1, 0x85, 0x09, 0x6d,
+0xc5, 0x4c, 0x09, 0xd2, 0xf9, 0x91, 0x37,
+0x73, 0xa1, 0x87, 0x5e, 0x2e, 0x00, 0x81,
+0x1b, 0xea, 0xf2, 0x01, 0xf0, 0x30, 0x36,
+0xdd, 0x69, 0x9d, 0xf5, 0x30, 0x3d, 0x25,
+0x9f, 0xef, 0xd9, 0xf3, 0x18, 0x23, 0x1a,
+0x49, 0x72, 0x66, 0x7f, 0xda, 0x95, 0xea,
+0x50, 0x7c, 0xe8, 0x98, 0x1a, 0x11, 0xdc,
+0xec, 0xb8, 0x0b, 0x10, 0x65, 0x9c, 0xfe,
+0xdd, 0xf1, 0x09, 0x13, 0xfb, 0xc4, 0xea,
+0x49, 0x12, 0x30, 0x07, 0x6a, 0x0c, 0x52,
+0x2f, 0x63, 0xf8, 0x53, 0xe5, 0x9e, 0x66,
+0xaf, 0x6d, 0xe3, 0xc3, 0xbd, 0x1f, 0xf7,
+0x9b, 0x1f, 0x52, 0xb8, 0x9b, 0x8e, 0x63,
+0x4c, 0x95, 0xb4, 0x92, 0x7c, 0x7f, 0x23,
+0x76, 0x07, 0x3a, 0x48, 0xdc, 0x88, 0x4b,
+0x43, 0xf2, 0xea, 0x57, 0x07, 0xf6, 0xcc,
+0x8a, 0x9c, 0x0e, 0x7f, 0x9e, 0x75, 0x98,
+0xf5, 0x25, 0x9e, 0x19, 0x41, 0x4f, 0x5b,
+0xb1, 0xee, 0x70, 0x69, 0xf4, 0x23, 0xb5,
+0xba, 0x59, 0x5f, 0x7c, 0x1e, 0x76, 0x6b,
+0xb4, 0xd6, 0x77, 0x51, 0xf8, 0xd7, 0xdf,
+0x55, 0x5c, 0x85, 0x50, 0x5c, 0xd0, 0x12,
+0xd0, 0x38, 0x4e, 0x7b, 0xee, 0xa8, 0x6c,
+0xd8, 0x33, 0x04, 0xf1, 0x9d, 0x90, 0xd3,
+0xf1, 0x78, 0x88, 0x79, 0xce, 0x72, 0xc1,
+0x0c, 0xad, 0x9b, 0xae, 0x50, 0x1b, 0x9e,
+0xfd, 0xb4, 0x44, 0x31, 0x85, 0x82, 0xe6,
+0x9e, 0xe4, 0xe8, 0x5f, 0x14, 0xe2, 0x37,
+0x87, 0x2f, 0x79, 0x8e, 0xb0, 0xd8, 0x6d,
+0xae, 0x2d, 0xa5, 0xcc, 0x9c, 0xeb, 0xd0,
+0x49, 0x8b, 0xa1, 0xa7, 0xc1, 0x5e, 0x2c,
+0xfe, 0x61, 0x6b, 0x3b, 0x39, 0xd3, 0x20,
+0x6a, 0x77, 0x4c, 0xa0, 0x13, 0xa7, 0x68,
+0xc8, 0x34, 0x95, 0x71, 0x26, 0x31, 0x02,
+0x7e, 0x26, 0x87, 0x5a, 0x2c, 0x8b, 0xd3,
+0x3b, 0x30, 0x94, 0xa6, 0x04, 0x03, 0xcd,
+0xbf, 0x4b, 0x53, 0x46, 0xe5, 0x37, 0xf1,
+0xa7, 0x16, 0xad, 0x23, 0x3a, 0x7f, 0x5d,
+0x43, 0x22, 0x5c, 0xdb, 0xfd, 0x6c, 0xd1,
+0x41, 0x69, 0xc1, 0x2a, 0x63, 0x6c, 0x02,
+0xe9, 0x9c, 0xa1, 0x26, 0xa6, 0x4a, 0xa5,
+0xaa, 0x18, 0xa9, 0xb7, 0x71, 0x6f, 0x4b,
+0x52, 0x06, 0xc7, 0x52, 0xfd, 0x33, 0xe3,
+0x1d, 0x48, 0x16, 0x3b, 0x76, 0x96, 0x83,
+0xd8, 0xc1, 0xb6, 0x8e, 0xdb, 0xf9, 0x19,
+0xb0, 0xc3, 0xae, 0xf8, 0x73, 0xa3, 0x90,
+0x56, 0xba, 0x83, 0x60, 0xaa, 0x56, 0x5b,
+0xbd, 0xa7, 0x2d, 0x38, 0xc0, 0xc4, 0xac,
+0xe9, 0x13, 0xdf, 0x29, 0xd8, 0xf7, 0x9e,
+0xc4, 0xf0, 0x9b, 0x7b, 0x15, 0xbf, 0xd7,
+0x50, 0x8f, 0xf6, 0x61, 0xd9, 0x30, 0x59,
+0xb6, 0x05, 0xd5, 0xfe, 0x9e, 0xf5, 0x5c,
+0x5b, 0x54, 0x3a, 0x18, 0x7a, 0xd2, 0x68,
+0x47, 0x42, 0x82, 0x39, 0xf0, 0xdd, 0x9a,
+0x1b, 0x90, 0x1c, 0x52, 0xe7, 0xed, 0xac,
+0xb3, 0x52, 0xbd, 0x6b, 0x19, 0x90, 0x8f,
+0xc4, 0xe4, 0x80, 0x2a, 0x86, 0xb4, 0x9c,
+0x8c, 0x83, 0x45, 0x6b, 0x3b, 0x03, 0x99,
+0xa7, 0xe8, 0x7b, 0x34, 0xda, 0x8a, 0x0c,
+0xc7, 0x1d, 0xcd, 0x31, 0x41, 0xe6, 0x44,
+0xd9, 0xcf, 0xea, 0x58, 0x2f, 0x0f, 0x56,
+0x6e, 0xe1, 0xc1, 0x8b, 0x53, 0xa6, 0xdb,
+0xf2, 0xad, 0x68, 0x13, 0x54, 0x43, 0xb5,
+0x2d, 0xb8, 0x0d, 0x77, 0xbd, 0x48, 0xae,
+0xbc, 0x80, 0x27, 0x61, 0xdc, 0x20, 0xca,
+0x8c, 0x41, 0xb0, 0x51, 0xd6, 0xfb, 0xd2,
+0x93, 0x39, 0xb7, 0x59, 0x41, 0x91, 0xd5,
+0x5d, 0xdc, 0xbd, 0xd7, 0x3a, 0xad, 0xaa,
+0x41, 0xe2, 0xcb, 0x6b, 0xbe, 0xd1, 0x97,
+0x50, 0x6b, 0x38, 0xaa, 0x64, 0x38, 0x3f,
+0x08, 0xe2, 0xf8, 0xa8, 0x64, 0x3c, 0xc4,
+0x33, 0xdc, 0x19, 0x00, 0xbb, 0x19, 0x63,
+0xc0, 0xd1, 0x74, 0x9c, 0x2a, 0x4e, 0x82,
+0x17, 0x12, 0xda, 0x0e, 0x7f, 0x30, 0x86,
+0x3d, 0x49, 0x6a, 0xce, 0xbd, 0xbc, 0x2f,
+0xc8, 0xc5, 0x3d, 0xaa, 0xf0, 0x31, 0xa4,
+0xe8, 0x50, 0x7e, 0xb6, 0xf0, 0xfd, 0xe9,
+0x8c, 0x00, 0x7f, 0xfa, 0x56, 0xba, 0x29,
+0x82, 0xc1, 0x2a, 0xfa, 0x70, 0x2b, 0x8f,
+0x42, 0xc2, 0x54, 0x61, 0xd2, 0xec, 0xe4,
+0x9c, 0x8a, 0xe3, 0x28, 0xa1, 0x88, 0x3d,
+0x96, 0xfd, 0x36, 0x64, 0x5e, 0x63, 0xa9,
+0xc8, 0x6c, 0x65, 0x69, 0x46, 0x74, 0x23,
+0x7a, 0x30, 0x08, 0xe3, 0x37, 0x01, 0xe8,
+0xe5, 0x2d, 0xed, 0xd9, 0xb9, 0x14, 0x53,
+0x76, 0x87, 0x0e, 0x9f, 0xf3, 0x36, 0xc4,
+0xec, 0xef, 0x3b, 0xee, 0xd2, 0x04, 0x8f,
+0xb1, 0xca, 0x5f, 0xbd, 0xbf, 0xd2, 0xa4,
+0xbb, 0x63, 0x2f, 0x00, 0x59, 0xb6, 0x78,
+0x03, 0x56, 0x74, 0x42, 0x14, 0x27, 0x21,
+0x09, 0x05, 0xa5, 0xfd, 0x61, 0x03, 0x39,
+0xff, 0x23, 0x51, 0xa4, 0x45, 0x40, 0x9c,
+0x0e, 0x1e, 0xaa, 0x93, 0xdc, 0x28, 0xe0,
+0xd4, 0xfc, 0x7d, 0x4d, 0x80, 0x6a, 0x1a,
+0x0e, 0xfc, 0xe5, 0xdb, 0x3a, 0x05, 0x49,
+0xed, 0x56, 0x9d, 0x4f, 0x17, 0x79, 0x9b,
+0x6d, 0x0f, 0x1e, 0xd0, 0x10, 0x5a, 0xfa,
+0xd7, 0x08, 0x25, 0x2f, 0x1d, 0xef, 0x5e,
+0x9a, 0xc4, 0x44, 0xff, 0x41, 0x50, 0xfb,
+0x5a, 0x5f, 0x14, 0x60, 0x49, 0xbc, 0x52,
+0x68, 0xf2, 0xf0, 0x44, 0xc9, 0x20, 0x72,
+0xc5, 0xbf, 0x91, 0xc6, 0x93, 0x7d, 0x9f,
+0xde, 0x0f, 0x66, 0x90, 0xa6, 0x0b, 0x66,
+0x74, 0xc8, 0x71, 0x54, 0xc3, 0x42, 0xd8,
+0xa5, 0xe0, 0xba, 0xf1, 0x50, 0x1d, 0x39,
+0x33, 0x0b, 0xa1, 0x9d, 0xfa, 0xf7, 0xe7,
+0xa0, 0xf9, 0xf6, 0xe6, 0xb7, 0xe0, 0x20,
+0xe6, 0x95, 0xcc, 0xe1, 0x84, 0x9c, 0xce,
+0xab, 0x61, 0x14, 0xdc, 0xa6, 0x22, 0xda,
+0xf7, 0x14, 0xc5, 0x58, 0x4b, 0xae, 0x1c,
+0xd6, 0xcf, 0xce, 0x32, 0x4d, 0x20, 0x1d,
+0x1c, 0xae, 0x26, 0xf5, 0xa8, 0x47, 0x18,
+0x28, 0x05, 0x83, 0xcd, 0xd7, 0x11, 0xc5,
+0x4c, 0xf4, 0x39, 0xe6, 0x1b, 0x54, 0xf9,
+0x6c, 0x1a, 0x43, 0xc4, 0x02, 0xf4, 0xb7,
+0x06, 0xaa, 0xca, 0xda, 0x13, 0x64, 0xee,
+0xf4, 0xfc, 0xc7, 0x28, 0x13, 0x57, 0xeb,
+0x9c, 0x2c, 0xa0, 0x2e, 0x1d, 0x3c, 0xd4,
+0x8f, 0xcd, 0x15, 0x9d, 0x3d, 0x5a, 0x0b,
+0xe8, 0xce, 0x70, 0x70, 0xe1, 0x8f, 0x46,
+0x0b, 0xeb, 0x63, 0x7c, 0xd1, 0x2c, 0x7e,
+0xe5, 0x6b, 0x4b, 0x1d, 0x4e, 0x22, 0xd1,
+0x1a, 0x10, 0xc4, 0x00, 0x04, 0xf6, 0x37,
+0x9f, 0x67, 0xe4, 0x37, 0xef, 0x3a, 0xa6,
+0x28, 0x09, 0x9d, 0x2b, 0xd2, 0x6b, 0xf8,
+0x95, 0xe1, 0xf7, 0x19, 0x22, 0x34, 0xd0,
+0xca, 0x8a, 0x05, 0x2d, 0x1f, 0x4d, 0x8a,
+0x02, 0x59, 0x8e, 0x06, 0x3b, 0x36, 0xd8,
+0x7d, 0x70, 0x52, 0xcd, 0x55, 0xd3, 0x94,
+0x5c, 0x7b, 0xb4, 0x84, 0x91, 0x29, 0x4b,
+0xb2, 0x86, 0xba, 0xdd, 0xc7, 0xb5, 0x48,
+0xd5, 0xde, 0x6f, 0x9c, 0x2c, 0xcf, 0xd8,
+0xd8, 0xcc, 0x34, 0xcf, 0x54, 0x0a, 0xc4,
+0xb5, 0xb0, 0x79, 0x87, 0x50, 0xdb, 0xdf,
+0x39, 0xa7, 0x8a, 0x38, 0x9e, 0x97, 0xa9,
+0xac, 0x5e, 0x42, 0xaa, 0xc0, 0xfb, 0xe4,
+0xf5, 0x08, 0xfb, 0xd7, 0xa9, 0x80, 0x1e,
+0x13, 0x22, 0xa3, 0x44, 0x46, 0x99, 0x96,
+0xc9, 0x77, 0xa1, 0xc1, 0xdf, 0xdf, 0x93,
+0x8f, 0xf2, 0xd0, 0xda, 0x1f, 0x0f, 0xfb,
+0xb1, 0x8e, 0x06, 0x17, 0x4a, 0x10, 0xb2,
+0x73, 0xa5, 0x2a, 0x26, 0x59, 0x81, 0x33,
+0xba, 0xd7, 0x26, 0x5a, 0x60, 0x1f, 0x02,
+0x42, 0xd9, 0xca, 0xde, 0x01, 0x85, 0xb3,
+0xb6, 0x4d, 0x38, 0x00, 0x98, 0xbd, 0xab,
+0xd1, 0xc3, 0x9c, 0x18, 0x67, 0x76, 0x73,
+0xc6, 0x55, 0x3a, 0xbf, 0x5d, 0x3d, 0x65,
+0x1e, 0x50, 0x74, 0x31, 0x4f, 0x2d, 0x2a,
+0x81, 0x91, 0x98, 0x91, 0xfb, 0x67, 0x5d,
+0xdb, 0x13, 0x5d, 0xaf, 0xdc, 0x90, 0x87,
+0x9d, 0x55, 0xb4, 0xbc, 0xa9, 0x3a, 0x73,
+0xca, 0x2e, 0x22, 0xad, 0x64, 0xb2, 0xdf,
+0x61, 0xbe, 0x85, 0x3b, 0xee, 0x50, 0xda,
+0x90, 0x80, 0xb4, 0xaf, 0x13, 0xcb, 0xb6,
+0x5c, 0xd0, 0x68, 0xc2, 0x21, 0x8e, 0x26,
+0x34, 0xd1, 0xd6, 0x1b, 0x67, 0x3b, 0xce,
+0xc3, 0x22, 0x45, 0x00, 0x1c, 0x2e, 0xe5,
+0xbc, 0x10, 0x6f, 0x8d, 0x45, 0x0f, 0x1e,
+0x8e, 0x77, 0x3d, 0xee, 0x8f, 0x7d, 0x94,
+0x34, 0x24, 0xf9, 0xca, 0x55, 0xaa, 0x99,
+0x63, 0x24, 0x55, 0x22, 0x3c, 0x3a, 0xee,
+0x42, 0x9f, 0x2e, 0xfd, 0xb2, 0xad, 0x10,
+0xe7, 0x34, 0xec, 0x9f, 0x1b, 0x06, 0x88,
+0x7a, 0xba, 0x5d, 0xf8, 0xb7, 0x62, 0x0e,
+0x6a, 0x84, 0x23, 0x1c, 0xfa, 0x15, 0xba,
+0xe1, 0xcf, 0xa1, 0xb8, 0x88, 0xe2, 0x16,
+0x5c, 0xdf, 0x15, 0x18, 0x42, 0xd5, 0x9c,
+0xc7, 0x08, 0xfe, 0x9d, 0x50, 0x56, 0x72,
+0x53, 0x99, 0x19, 0xb5, 0x67, 0x40, 0x96,
+0x5f, 0x0c, 0x94, 0xcf, 0xa8, 0xc9, 0xbe,
+0xcf, 0xb1, 0x7d, 0xf4, 0x55, 0xa4, 0x5e,
+0xc0, 0xae, 0x03, 0x91, 0x98, 0x6e, 0x29,
+0x56, 0xbb, 0xa3, 0xb2, 0xea, 0x45, 0xfb,
+0xcb, 0x45, 0x33, 0x84, 0x0c, 0x14, 0x2d,
+0x9d, 0x09, 0x72, 0x4f, 0x01, 0x58, 0x86,
+0x07, 0x83, 0x3e, 0xfc, 0xa5, 0x89, 0x4e,
+0xa7, 0xe4, 0xfd, 0x5e, 0x61, 0x47, 0x98,
+0xa8, 0xec, 0x05, 0xdc, 0xe4, 0x92, 0x85,
+0x5f, 0xd5, 0xeb, 0x26, 0x4f, 0x19, 0xde,
+0xa1, 0xf6, 0xcd, 0xd4, 0xfa, 0x5e, 0x45,
+0x25, 0x13, 0x39, 0x93, 0x80, 0x59, 0x90,
+0xbf, 0xee, 0x0e, 0x74, 0x41, 0xdd, 0x41,
+0xe2, 0x85, 0x9d, 0x39, 0xa1, 0xa1, 0xdf,
+0xa0, 0x89, 0x7e, 0x79, 0x7c, 0xb9, 0x78,
+0x12, 0x6b, 0x3f, 0x11, 0x59, 0x47, 0x34,
+0x5b, 0x14, 0xb9, 0x98, 0x4e, 0x73, 0x46,
+0x5a, 0xdf, 0xeb, 0x2f, 0x24, 0x22, 0x6a,
+0x1c, 0x26, 0xe5, 0x07, 0x51, 0xee, 0x43,
+0x95, 0xdd, 0xb0, 0xb2, 0x7a, 0x10, 0x0a,
+0xcd, 0xdb, 0x8f, 0x62, 0x0c, 0xca, 0xb9,
+0xd5, 0x07, 0x87, 0xde, 0x94, 0xb0, 0xc8,
+0xa8, 0xa4, 0x32, 0xb6, 0x48, 0xb7, 0xbe,
+0xce, 0x02, 0x43, 0x7e, 0x1f, 0x67, 0xbe,
+0x60, 0x26, 0xa3, 0xb8, 0xa8, 0xb0, 0x89,
+0xca, 0xd3, 0x92, 0x1f, 0xbb, 0xf8, 0x6a,
+0xcb, 0xb3, 0x65, 0x44, 0x9e, 0x8b, 0xaa,
+0x94, 0x77, 0x68, 0x1b, 0x38, 0xa1, 0x41,
+0x9f, 0x54, 0xae, 0xd4, 0x4e, 0x61, 0x71,
+0x8e, 0x78, 0x59, 0x93, 0x9c, 0xc5, 0x00,
+0xa6, 0xd1, 0x0c, 0x69, 0x09, 0xbe, 0x59,
+0x7c, 0xd7, 0x82, 0x30, 0x8b, 0xa2, 0x4a,
+0xba, 0x7f, 0xb7, 0xe5, 0x5e, 0x91, 0x72,
+0x5f, 0xb9, 0x06, 0xfe, 0x72, 0x06, 0xd9,
+0xd3, 0xa4, 0xd3, 0xfa, 0xa2, 0xdb, 0xdb,
+0xfc, 0x5c, 0x41, 0xcf, 0x3f, 0x84, 0xc4,
+0x18, 0x9d, 0xe6, 0x93, 0x00, 0xe9, 0x19,
+0x4b, 0x99, 0x4a, 0xf6, 0x56, 0xd8, 0x89,
+0xd9, 0xbe, 0x7b, 0x75, 0xfd, 0x9b, 0x76,
+0xa0, 0xa7, 0x62, 0x27, 0xe1, 0xca, 0xd2,
+0x77, 0x06, 0x94, 0xd5, 0xc9, 0x0f, 0x32,
+0xaf, 0x46, 0x9e, 0xc9, 0xd1, 0x0d, 0xc2,
+0xfa, 0x62, 0x34, 0x9d, 0xe9, 0x67, 0x17,
+0xf3, 0x49, 0x8e, 0x10, 0x12, 0x69, 0x8b,
+0xe3, 0x3b, 0xfc, 0x73, 0x16, 0xf9, 0x81,
+0xea, 0xa1, 0x5a, 0x11, 0xa5, 0xfe, 0x7a,
+0x1b, 0xf4, 0x6c, 0xc1, 0xc0, 0xf9, 0x56,
+0x1b, 0xad, 0xe5, 0xc6, 0xf2, 0xfe, 0x44,
+0x5d, 0x5d, 0x16, 0x15, 0x5e, 0xe3, 0xdf,
+0x30, 0x21, 0x13, 0x7b, 0x3d, 0x84, 0x09,
+0x8c, 0x1c, 0x59, 0xa5, 0x22, 0x56, 0x28,
+0xa6, 0xac, 0x36, 0xf1, 0x9f, 0x76, 0x21,
+0x42, 0xc6, 0xf7, 0xb3, 0x12, 0xd6, 0x63,
+0x2c, 0x89, 0xf3, 0x96, 0xf8, 0x9f, 0x66,
+0xf2, 0x5c, 0xc8, 0x08, 0x59, 0xdd, 0x5d,
+0xe8, 0x1e, 0xee, 0x1b, 0xaa, 0xb5, 0x47,
+0x14, 0x77, 0xf0, 0x1f, 0x48, 0x59, 0x8a,
+0x59, 0x6b, 0x6e, 0x06, 0xfe, 0x10, 0x03,
+0x74, 0xef, 0xa1, 0xef, 0xed, 0x46, 0x78,
+0xac, 0x62, 0x9c, 0xf2, 0xd3, 0x77, 0x1d,
+0x40, 0xad, 0xdb, 0xab, 0xc7, 0x22, 0xf4,
+0xd1, 0x34, 0x71, 0xfc, 0x7e, 0xb1, 0xc5,
+0x4d, 0x85, 0x65, 0xb5, 0x3a, 0xba, 0xe4,
+0xe3, 0xa9, 0xe6, 0xd4, 0xd6, 0x68, 0xe5,
+0x5f, 0x06, 0x1b, 0x36, 0xdf, 0x86, 0x97,
+0xa0, 0x08, 0x4a, 0x40, 0x74, 0x75, 0x5c,
+0x21, 0x14, 0xe3, 0x2b, 0xb7, 0x88, 0x73,
+0x52, 0x10, 0x70, 0x94, 0x99, 0x85, 0x8f,
+0x08, 0xba, 0xac, 0xba, 0x73, 0x2e, 0x94,
+0x9b, 0xc4, 0xcf, 0xa6, 0x09, 0x9d, 0x46,
+0xcb, 0x71, 0x75, 0x42, 0x85, 0xba, 0xdf,
+0x94, 0xb4, 0x3c, 0xff, 0xcb, 0x57, 0x27,
+0xd2, 0x7c, 0xec, 0xd5, 0x24, 0x8c, 0xa6,
+0x5a, 0x04, 0x5d, 0x98, 0x65, 0x57, 0x1c,
+0xcb, 0x11, 0x1e, 0xfa, 0xe4, 0xfc, 0x53,
+0xb3, 0x4b, 0x62, 0x10, 0xb7, 0x64, 0xf0,
+0x54, 0x1a, 0x39, 0xf7, 0xcc, 0x15, 0x03,
+0x8d, 0xf6, 0xaf, 0x34, 0x05, 0x50, 0xce,
+0xc0, 0xc1, 0xd1, 0x14, 0x5d, 0x80, 0x37,
+0xd4, 0x51, 0x54, 0x3d, 0xdc, 0xa9, 0x8c,
+0x5e, 0xe2, 0xc2, 0x01, 0x86, 0x8c, 0x4b,
+0x71, 0xf5, 0xf2, 0x3a, 0xfa, 0xb9, 0x2c,
+0xec, 0x1b, 0xf8, 0xce, 0xce, 0xcf, 0xb5,
+0x63, 0x31, 0x66, 0xa3, 0x21, 0xe6, 0xfd,
+0x8b, 0x15, 0xd2, 0xff, 0xa5, 0x16, 0xab,
+0x93, 0x23, 0xf5, 0xf4, 0x33, 0x92, 0xd3,
+0x52, 0x05, 0x01, 0x42, 0x33, 0x36, 0x37,
+0x6c, 0x58, 0xa2, 0x21, 0x3d, 0x86, 0xbb,
+0x1e, 0x20, 0xc2, 0x6c, 0x50, 0x17, 0xc0,
+0x31, 0xcc, 0x55, 0xdc, 0x76, 0x5e, 0x32,
+0x9e, 0x5d, 0x54, 0x9d, 0xd3, 0xc9, 0xd9,
+0x2d, 0x1c, 0xbf, 0x2d, 0x27, 0x8c, 0xf2,
+0xf5, 0x22, 0x75, 0xbb, 0x8d, 0x27, 0x43,
+0xd6, 0xc2, 0x84, 0x28, 0x63, 0x95, 0x4d,
+0x13, 0x42, 0x80, 0x0a, 0x69, 0xaa, 0xef,
+0xa2, 0x79, 0x56, 0xb9, 0x9f, 0x35, 0x75,
+0x67, 0xaf, 0x13, 0x84, 0x68, 0xcb, 0xf5,
+0x1f, 0x35, 0x6f, 0xe1, 0x45, 0x9b, 0x22,
+0x69, 0x0a, 0x8f, 0x90, 0x7d, 0x37, 0x8e,
+0x7e, 0xaa, 0x8e, 0xef, 0x25, 0x22, 0xf5,
+0xe2, 0xa6, 0x69, 0xfb, 0x56, 0x79, 0xdc,
+0xcb, 0x9c, 0xcb, 0xf2, 0xc5, 0x8b, 0xbe,
+0x28, 0xc7, 0x75, 0x2f, 0x95, 0xf8, 0x36,
+0xac, 0x3c, 0x52, 0x4d, 0x96, 0x95, 0xc3,
+0xda, 0xb6, 0x0d, 0x45, 0x20, 0x1a, 0x25,
+0x80, 0x1e, 0x7b, 0xa5, 0x33, 0x62, 0xbf,
+0xb5, 0x66, 0xb5, 0x39, 0x0a, 0x86, 0xfb,
+0xcf, 0xb5, 0xfe, 0x66, 0x81, 0xc8, 0x87,
+0x0c, 0x69, 0x60, 0xbb, 0xc0, 0x39, 0xad,
+0x21, 0x04, 0xbe, 0x57, 0xea, 0xa2, 0x8b,
+0xf4, 0xde, 0x12, 0xbd, 0x58, 0x84, 0x21,
+0xe3, 0x95, 0x4f, 0x1c, 0x5f, 0x35, 0xea,
+0x2f, 0xed, 0x84, 0x43, 0x31, 0x88, 0x12,
+0x98, 0x4a, 0x68, 0xe1, 0x66, 0x7c, 0x81,
+0xc6, 0x57,
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha512_sigrl.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha512_sigrl.inc
new file mode 100644
index 0000000..265b166
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test0_sha512_sigrl.inc
@@ -0,0 +1,1222 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha512
+ * Message: "test message"
+ * Basename: None (random base)
+ * SigRl: SigRl of group
+ */
+0x36, 0x19, 0x27, 0x2c, 0xcf, 0xa0, 0x7a,
+0x44, 0x9c, 0xea, 0xe5, 0x77, 0x7e, 0x7d,
+0x12, 0x33, 0xd9, 0x21, 0x41, 0x58, 0x9b,
+0xaf, 0xcc, 0xa2, 0x2e, 0xe1, 0xe1, 0x27,
+0x70, 0xe6, 0x2f, 0x8e, 0x70, 0x9d, 0x7c,
+0x2b, 0x65, 0xf0, 0xd6, 0xe3, 0x89, 0x5b,
+0x8a, 0x82, 0x68, 0x2a, 0x2f, 0x44, 0xbb,
+0xba, 0xbe, 0xbf, 0xed, 0x94, 0x87, 0x5b,
+0xf4, 0x2a, 0xde, 0xb2, 0xe6, 0xee, 0x57,
+0x17, 0x71, 0xec, 0xf4, 0x3d, 0x7c, 0x44,
+0x2d, 0x77, 0x42, 0xc6, 0x22, 0x88, 0xc4,
+0x80, 0xe3, 0x99, 0x79, 0x7d, 0xe8, 0xf0,
+0xaf, 0x37, 0x67, 0x66, 0xe8, 0xa8, 0x63,
+0xd7, 0x88, 0xd6, 0xf7, 0x2e, 0x2b, 0x98,
+0xcc, 0x0a, 0x96, 0xef, 0x72, 0xfe, 0x47,
+0xf7, 0x46, 0x4c, 0x0b, 0x79, 0x94, 0x8c,
+0x6a, 0x1f, 0x09, 0x30, 0x31, 0x29, 0xd2,
+0x86, 0xed, 0x93, 0xd9, 0xed, 0x9e, 0x88,
+0xd2, 0x9b, 0x44, 0x15, 0x36, 0x91, 0x33,
+0x62, 0x44, 0xcf, 0xab, 0x0d, 0xf0, 0x24,
+0x86, 0x3f, 0x10, 0x74, 0x42, 0x37, 0xbb,
+0x1a, 0x67, 0xf4, 0x16, 0x61, 0xc7, 0x5e,
+0x30, 0x18, 0x86, 0x28, 0xa2, 0x3a, 0x68,
+0xe2, 0xec, 0x6e, 0xa4, 0x5f, 0x1e, 0x81,
+0xf1, 0x09, 0xcc, 0x8c, 0xde, 0xe5, 0x3f,
+0xc3, 0x6e, 0xfe, 0x19, 0x4f, 0x51, 0xa6,
+0x66, 0x69, 0xf2, 0x38, 0xac, 0xad, 0xd9,
+0xe8, 0xe2, 0x81, 0x5d, 0xde, 0x68, 0xa8,
+0x7e, 0x87, 0xfc, 0x67, 0xda, 0x14, 0xab,
+0x14, 0xf0, 0x42, 0x73, 0x8b, 0x2f, 0x82,
+0x3b, 0xce, 0x2e, 0x1f, 0x8d, 0xc8, 0x6e,
+0x3a, 0x6a, 0x0e, 0x8b, 0x9f, 0x8d, 0x58,
+0xbc, 0x32, 0x42, 0x14, 0x07, 0x5c, 0x4c,
+0x51, 0xd8, 0xb6, 0x59, 0x29, 0xf7, 0xe7,
+0x68, 0xa7, 0x27, 0x43, 0x75, 0x2d, 0x6b,
+0x0b, 0x0a, 0x4f, 0x9e, 0x85, 0xe0, 0x84,
+0xf2, 0x65, 0x25, 0xbd, 0x33, 0x76, 0xb7,
+0xee, 0x5d, 0xab, 0x4d, 0x2e, 0x33, 0xfd,
+0x93, 0xff, 0x74, 0x4d, 0x23, 0x99, 0xb4,
+0xaa, 0x10, 0x3a, 0xa5, 0x41, 0xb4, 0x18,
+0x38, 0xfc, 0x20, 0x04, 0x69, 0xb9, 0x8e,
+0xae, 0x5f, 0x77, 0xd8, 0x92, 0x15, 0xa4,
+0x5b, 0x4b, 0x46, 0x75, 0xdc, 0x77, 0xf8,
+0xdb, 0x58, 0x7a, 0xf8, 0xd3, 0x50, 0xa6,
+0x3b, 0x52, 0x10, 0x8b, 0x0f, 0x5c, 0x3d,
+0xeb, 0xb9, 0xf0, 0x11, 0xe7, 0xab, 0x1d,
+0x24, 0xc6, 0x99, 0x13, 0xbf, 0xc6, 0x41,
+0xbd, 0xf8, 0x13, 0xe1, 0x06, 0xb8, 0xb5,
+0xb3, 0x94, 0xcb, 0xc1, 0x65, 0xf2, 0x9a,
+0x47, 0x05, 0x87, 0xb6, 0x81, 0x8d, 0xd9,
+0x19, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x32, 0x97, 0x36, 0xc2, 0x28,
+0x13, 0xa6, 0xce, 0x2a, 0x82, 0xf5, 0x7e,
+0xce, 0xdb, 0x7e, 0x95, 0x97, 0x71, 0xce,
+0xf0, 0xa6, 0xbd, 0x9a, 0x09, 0x6c, 0x4b,
+0x5c, 0x64, 0xbc, 0xb6, 0x56, 0xfb, 0x5c,
+0xec, 0x0e, 0xc6, 0x33, 0x54, 0xa0, 0x4d,
+0x21, 0xdf, 0x03, 0xc4, 0xc8, 0x6a, 0x28,
+0xa3, 0xde, 0x94, 0x2c, 0x1b, 0x81, 0x47,
+0x71, 0xe9, 0xe0, 0xe7, 0x2a, 0x2e, 0x37,
+0x04, 0x0a, 0x86, 0x0f, 0x9f, 0xa4, 0x25,
+0x70, 0xd8, 0x52, 0xf4, 0x03, 0xdc, 0x10,
+0x93, 0x37, 0x9e, 0x23, 0xd9, 0x95, 0x59,
+0x66, 0xa0, 0x65, 0x00, 0x10, 0x27, 0xb3,
+0x78, 0xf2, 0x4a, 0xef, 0xab, 0x60, 0xed,
+0x21, 0x22, 0xb6, 0x5d, 0x1e, 0x90, 0x16,
+0xdf, 0xcc, 0x94, 0x54, 0x01, 0x3f, 0x06,
+0xfa, 0xdc, 0x59, 0xb9, 0x68, 0x95, 0xd1,
+0x71, 0x59, 0x06, 0x1d, 0xfe, 0xf4, 0x16,
+0x57, 0x19, 0x01, 0xc1, 0xd0, 0x7d, 0x6d,
+0x41, 0xee, 0x8e, 0xe0, 0x11, 0xd1, 0x95,
+0xde, 0xb5, 0x11, 0xa5, 0x61, 0xc6, 0xbf,
+0xb4, 0x4c, 0x9b, 0xb2, 0xc1, 0xb7, 0x32,
+0xb0, 0x45, 0x1c, 0xd5, 0x9d, 0x4e, 0x50,
+0x52, 0xa6, 0x2a, 0x1d, 0xc6, 0xef, 0xc7,
+0x53, 0xe6, 0x53, 0xbf, 0x7c, 0x3d, 0xed,
+0x79, 0x88, 0xd6, 0xbb, 0xf8, 0x2d, 0xeb,
+0x1a, 0x87, 0xd4, 0xee, 0xc4, 0x30, 0xbd,
+0xa0, 0x36, 0x98, 0xe5, 0x0a, 0xa5, 0x04,
+0xb5, 0xaa, 0x25, 0x00, 0xc8, 0x0b, 0xee,
+0x66, 0xe8, 0xc4, 0x6e, 0x9f, 0xb9, 0xea,
+0x29, 0xdb, 0xb2, 0x70, 0xfc, 0x75, 0xc8,
+0xef, 0x52, 0xd7, 0x4b, 0xa0, 0x15, 0x9c,
+0xf0, 0x4a, 0xc5, 0x1a, 0x8f, 0x1e, 0xb3,
+0xf3, 0xdc, 0xe0, 0x95, 0x5a, 0x07, 0x7d,
+0x8c, 0xfd, 0x2d, 0xeb, 0x20, 0x3e, 0xce,
+0x59, 0x63, 0x65, 0x59, 0x41, 0xf5, 0xde,
+0x3b, 0xb9, 0xd3, 0x0d, 0x88, 0xbc, 0xf4,
+0xf2, 0x95, 0x89, 0x29, 0x75, 0xeb, 0xbc,
+0xc3, 0x80, 0xe3, 0x5e, 0x06, 0x84, 0x10,
+0xc6, 0xb2, 0xd4, 0x61, 0x99, 0x4f, 0xe8,
+0x34, 0xcc, 0xfb, 0x22, 0x61, 0x9f, 0x24,
+0xe1, 0x5f, 0xf2, 0x56, 0x54, 0x01, 0x05,
+0xde, 0x2c, 0x21, 0xb4, 0x20, 0xbf, 0x86,
+0x1e, 0xef, 0x88, 0x35, 0xfb, 0xac, 0xcf,
+0x94, 0xcf, 0xb3, 0x66, 0x58, 0x2c, 0x53,
+0xdf, 0x87, 0xc9, 0xa2, 0x27, 0xa8, 0xe4,
+0x10, 0xb0, 0xe9, 0xee, 0x27, 0x4f, 0x25,
+0x29, 0x0f, 0x96, 0xa0, 0x26, 0xe7, 0xa6,
+0xd6, 0xf2, 0x03, 0x85, 0x3b, 0x2e, 0xc6,
+0x78, 0xe7, 0x77, 0x8d, 0x4f, 0xba, 0x03,
+0x55, 0xeb, 0xdb, 0xac, 0x3d, 0x77, 0xdf,
+0xdc, 0x27, 0xad, 0x71, 0x6c, 0xb9, 0xee,
+0x87, 0xc8, 0x51, 0x3f, 0xe5, 0xe1, 0xa0,
+0x3d, 0x42, 0xc9, 0xf2, 0x87, 0x7b, 0x0b,
+0xe3, 0x68, 0xbc, 0xbc, 0xea, 0x79, 0xd2,
+0x99, 0x0a, 0xdc, 0x37, 0x39, 0x68, 0xf2,
+0x5d, 0x09, 0xe4, 0xba, 0xc6, 0xf6, 0xd9,
+0xfa, 0xab, 0x90, 0x2c, 0x0f, 0x08, 0x8d,
+0xca, 0x14, 0xe1, 0xd8, 0xe9, 0xc8, 0x38,
+0x63, 0x00, 0x5f, 0x87, 0xba, 0x7e, 0x83,
+0x1b, 0x7d, 0x31, 0xcb, 0x54, 0x50, 0xca,
+0xe0, 0x96, 0x34, 0x4b, 0xdc, 0x71, 0x17,
+0xcb, 0x79, 0x1b, 0xa2, 0xae, 0x6f, 0xf2,
+0x1f, 0x62, 0xc1, 0x24, 0xc2, 0x30, 0x77,
+0x6c, 0x51, 0x23, 0x62, 0x1c, 0x4b, 0x0f,
+0xb5, 0x63, 0xc1, 0xd6, 0x12, 0x10, 0x77,
+0x11, 0x35, 0x01, 0xd9, 0xbd, 0x90, 0x02,
+0x39, 0x8c, 0x2d, 0x12, 0xbe, 0x77, 0x02,
+0x65, 0x9c, 0x66, 0xa5, 0x5d, 0xbe, 0x18,
+0x01, 0xb2, 0x41, 0xc1, 0x9e, 0x38, 0x7e,
+0xab, 0x05, 0x48, 0xbe, 0x95, 0x09, 0x9f,
+0x02, 0x01, 0x15, 0xa6, 0x3d, 0xfa, 0xa7,
+0xf9, 0xac, 0xe4, 0xc0, 0xb1, 0x22, 0x82,
+0xfc, 0x37, 0x9b, 0xbd, 0xdb, 0xec, 0x23,
+0x3e, 0xec, 0xd8, 0x64, 0x35, 0xe9, 0x81,
+0xab, 0x15, 0x54, 0x28, 0x65, 0xf3, 0x2b,
+0xe1, 0x3e, 0x9e, 0x6c, 0x45, 0x43, 0xdf,
+0x76, 0x00, 0x37, 0xf4, 0x52, 0x8b, 0x68,
+0xce, 0xdb, 0x29, 0x71, 0x1d, 0x5e, 0x1f,
+0x94, 0x7f, 0x46, 0xfc, 0x2b, 0x34, 0x1b,
+0xbb, 0xee, 0x0e, 0xa5, 0x57, 0x8e, 0xe1,
+0x51, 0x4d, 0x54, 0xbc, 0x62, 0x19, 0xe3,
+0xec, 0x5d, 0x10, 0xa0, 0x94, 0x8d, 0x8d,
+0xb2, 0xca, 0x19, 0xac, 0x49, 0xa9, 0x4e,
+0x9a, 0x9f, 0xcc, 0x77, 0x1d, 0x3e, 0x14,
+0xe2, 0x99, 0xac, 0x58, 0x1d, 0xe0, 0xd0,
+0x7e, 0x01, 0xe2, 0x46, 0x4b, 0x22, 0x10,
+0x66, 0x04, 0x6a, 0x18, 0x3d, 0x60, 0x3c,
+0xc7, 0x13, 0x65, 0xb9, 0xba, 0x8e, 0xfe,
+0xf8, 0x2a, 0x37, 0x06, 0xf1, 0xd2, 0x84,
+0xc7, 0x80, 0xfc, 0x51, 0x8b, 0xbf, 0x7d,
+0xe1, 0x70, 0xd1, 0xc4, 0xf8, 0xa9, 0x30,
+0xc3, 0xec, 0xa0, 0xff, 0xdb, 0xda, 0xd3,
+0x3e, 0x7d, 0x72, 0x04, 0x8f, 0x68, 0x76,
+0xe6, 0x30, 0xb2, 0x13, 0xde, 0x8c, 0xe9,
+0x07, 0xc2, 0xbf, 0x3a, 0x78, 0xf0, 0xf0,
+0xd4, 0xc1, 0xdb, 0x64, 0x69, 0x26, 0x5d,
+0x4f, 0xac, 0x98, 0x66, 0x4d, 0x20, 0x0d,
+0xc0, 0x9c, 0x56, 0x94, 0xd8, 0xe2, 0x84,
+0xa9, 0x32, 0x4c, 0x10, 0x47, 0x68, 0x2b,
+0x33, 0x8c, 0x16, 0xb0, 0xf9, 0x35, 0x36,
+0x65, 0x53, 0xc8, 0x23, 0x7e, 0x6b, 0x07,
+0x2d, 0x2d, 0x32, 0x20, 0x1a, 0x4c, 0xe9,
+0xe9, 0x84, 0x25, 0x4d, 0xc3, 0x8e, 0x70,
+0xa6, 0x47, 0xd1, 0xe5, 0xfd, 0x72, 0xa6,
+0xf5, 0x7c, 0x9a, 0x93, 0x0e, 0x23, 0xe0,
+0x98, 0xb9, 0x64, 0x1f, 0x9a, 0x64, 0xc0,
+0xd4, 0x0a, 0xe5, 0xbb, 0x17, 0x3e, 0x3a,
+0x94, 0xe3, 0x81, 0xd6, 0x75, 0x5c, 0x8e,
+0xf3, 0xf6, 0x9f, 0x80, 0xb5, 0x1e, 0xef,
+0xd6, 0x58, 0x31, 0x8b, 0x94, 0xe0, 0xed,
+0x3a, 0x5b, 0xcf, 0xca, 0x26, 0x34, 0xe8,
+0xa1, 0x70, 0xc3, 0xbe, 0x23, 0x0a, 0x47,
+0x36, 0xeb, 0xc8, 0xfc, 0x8a, 0x26, 0xf7,
+0x60, 0x44, 0x48, 0x4e, 0x08, 0x40, 0x73,
+0xb3, 0x3e, 0xa0, 0x5e, 0xa0, 0x5c, 0x74,
+0x5d, 0x21, 0xfc, 0x00, 0x57, 0xbf, 0x23,
+0xda, 0xae, 0x49, 0xac, 0x6a, 0x10, 0xe6,
+0x1e, 0x1b, 0x19, 0xe6, 0xce, 0x41, 0x6c,
+0x3c, 0xe7, 0x45, 0x3c, 0xcb, 0x75, 0xa9,
+0xd7, 0x60, 0x0d, 0x43, 0x69, 0x1e, 0xc2,
+0x47, 0xea, 0x07, 0x46, 0x2c, 0x58, 0x25,
+0x1e, 0x10, 0xe9, 0xc8, 0x8a, 0x14, 0x85,
+0x6f, 0x49, 0x37, 0xd7, 0xfb, 0x07, 0x82,
+0x4a, 0x6a, 0x5a, 0x3e, 0x95, 0x7c, 0x2c,
+0x05, 0xc4, 0x50, 0x82, 0xaa, 0x9e, 0x6b,
+0x27, 0x35, 0x48, 0x42, 0x8e, 0x5a, 0x5f,
+0x4c, 0x7e, 0xd4, 0x7c, 0x08, 0x77, 0x1e,
+0x91, 0x42, 0xd8, 0x3f, 0xbe, 0xed, 0x3b,
+0x64, 0x58, 0x57, 0x95, 0xc7, 0x92, 0x94,
+0xcf, 0xce, 0x22, 0x73, 0xe3, 0x32, 0xe5,
+0x15, 0xa9, 0xbb, 0x6f, 0x27, 0xb9, 0xf3,
+0xf1, 0xe4, 0xfd, 0xaf, 0xf5, 0x02, 0x86,
+0xb2, 0x4e, 0x50, 0x5b, 0xef, 0xa0, 0xac,
+0x0c, 0xa9, 0xba, 0x78, 0xe1, 0xbe, 0x4d,
+0x1b, 0x74, 0x9f, 0x36, 0xa4, 0x58, 0x4b,
+0xcf, 0x7b, 0xc2, 0xac, 0x3f, 0x1d, 0x8a,
+0x9f, 0x81, 0x15, 0x70, 0x8e, 0x43, 0x0b,
+0x2b, 0xcb, 0xf4, 0x93, 0x76, 0x97, 0x74,
+0x61, 0xaf, 0x2e, 0x7d, 0xfe, 0x11, 0x74,
+0x03, 0x8f, 0x38, 0x32, 0x7c, 0x1f, 0xf6,
+0x46, 0x68, 0xac, 0x29, 0x48, 0x3e, 0x63,
+0xac, 0x64, 0x10, 0x97, 0x1a, 0x22, 0x67,
+0x09, 0x51, 0x0c, 0x46, 0x7e, 0xab, 0x21,
+0x72, 0xbf, 0x12, 0x69, 0x99, 0x7c, 0xef,
+0x07, 0x39, 0x33, 0x63, 0xf8, 0x16, 0x70,
+0xe8, 0x25, 0x62, 0x90, 0xa4, 0xd4, 0x10,
+0x77, 0xbf, 0x20, 0xac, 0x00, 0xc8, 0x85,
+0x12, 0x34, 0x52, 0x1a, 0x77, 0x2a, 0xb7,
+0x42, 0x27, 0xcf, 0x2d, 0x1b, 0x15, 0x29,
+0x60, 0xdc, 0x61, 0xdf, 0x0d, 0x97, 0xac,
+0x71, 0x86, 0xae, 0x93, 0x78, 0xdf, 0xc4,
+0xa2, 0x1a, 0xb9, 0x30, 0x23, 0xd0, 0x37,
+0xd4, 0x3a, 0x14, 0x67, 0x80, 0xb7, 0xfd,
+0x41, 0x89, 0xc3, 0x5b, 0x72, 0xa7, 0x55,
+0x76, 0xdf, 0x73, 0x43, 0x9d, 0x40, 0xd6,
+0xd8, 0x93, 0xee, 0x39, 0x54, 0xf3, 0x65,
+0x15, 0x76, 0xa9, 0x90, 0xe3, 0x5a, 0xea,
+0xda, 0xc9, 0x19, 0x9e, 0x4e, 0x30, 0x43,
+0x07, 0xcc, 0x24, 0x40, 0x73, 0x91, 0xaf,
+0x8d, 0x42, 0x65, 0x0e, 0x01, 0x07, 0x5a,
+0xd8, 0xee, 0x8d, 0x20, 0x09, 0xfe, 0x2b,
+0x08, 0x63, 0x62, 0xc6, 0xdb, 0x1d, 0xac,
+0x9b, 0xbc, 0x97, 0x15, 0xba, 0x45, 0x1f,
+0x05, 0x1a, 0xe4, 0xbb, 0x1a, 0xeb, 0x2a,
+0xc6, 0x3a, 0xd5, 0xdc, 0x14, 0x90, 0x90,
+0x29, 0x8d, 0xe1, 0x2b, 0x37, 0x50, 0x63,
+0x1f, 0xcc, 0x73, 0xbe, 0x46, 0x69, 0xeb,
+0x67, 0x75, 0xd6, 0x18, 0xc7, 0xde, 0x39,
+0xd3, 0x26, 0x1f, 0xd3, 0x92, 0x27, 0x65,
+0xec, 0xd0, 0x6a, 0xb3, 0xca, 0x84, 0x47,
+0x97, 0xb9, 0x07, 0x70, 0xc5, 0xcf, 0xa1,
+0xf0, 0x54, 0x99, 0x32, 0x1b, 0x1a, 0x15,
+0xd7, 0x49, 0xd3, 0x50, 0x36, 0x20, 0x99,
+0xde, 0xf8, 0xc3, 0x06, 0xa9, 0x99, 0x29,
+0x91, 0x9c, 0xed, 0xf5, 0xad, 0x30, 0x78,
+0x6f, 0xdb, 0xca, 0x37, 0x10, 0xf1, 0x8c,
+0xf5, 0x23, 0x0b, 0x08, 0x81, 0xf3, 0x89,
+0x1d, 0x82, 0xc2, 0x5c, 0x52, 0x69, 0x28,
+0x5e, 0x63, 0x82, 0x85, 0xc6, 0xc3, 0x7d,
+0x31, 0x64, 0x09, 0x7d, 0xac, 0xbc, 0x03,
+0x1e, 0xe0, 0xe9, 0xba, 0xf3, 0xc3, 0xfd,
+0xdd, 0xd2, 0x6d, 0x21, 0xd7, 0xa3, 0x9d,
+0x2c, 0x80, 0x5f, 0xb8, 0x89, 0x45, 0xad,
+0xeb, 0x92, 0xf1, 0x86, 0x43, 0x15, 0x7e,
+0x21, 0xbc, 0x06, 0xba, 0xe3, 0x78, 0xf8,
+0x85, 0xc0, 0x90, 0x71, 0x16, 0xdb, 0x6f,
+0x21, 0x0b, 0xd4, 0x69, 0x34, 0x35, 0x4e,
+0x1c, 0xc1, 0x83, 0x2b, 0x4e, 0x2f, 0x2f,
+0xb4, 0xf5, 0x2b, 0x94, 0x91, 0xdf, 0x97,
+0x65, 0xd0, 0x79, 0x74, 0xd7, 0x61, 0x12,
+0x3e, 0xf8, 0xaa, 0xfe, 0x74, 0x54, 0x09,
+0x38, 0x0c, 0xdf, 0xb7, 0x50, 0x9e, 0x03,
+0xab, 0x6d, 0xe4, 0x7c, 0x62, 0xe0, 0xc7,
+0x9d, 0x80, 0xa4, 0x02, 0x64, 0x1f, 0x4f,
+0x4b, 0x22, 0x5c, 0xf9, 0x10, 0xc1, 0xc8,
+0x5e, 0x73, 0x65, 0xd8, 0xd7, 0xf3, 0x5f,
+0xb4, 0xc9, 0x25, 0xbf, 0x55, 0xea, 0x09,
+0x14, 0x42, 0x69, 0x19, 0x5c, 0x2b, 0xfa,
+0x3d, 0x79, 0x2c, 0x66, 0xa4, 0x99, 0x63,
+0x96, 0x1c, 0xe0, 0xbb, 0x5a, 0x52, 0x65,
+0x56, 0x77, 0x2e, 0x47, 0x94, 0xc6, 0x4d,
+0x12, 0x03, 0xb0, 0x23, 0x89, 0x25, 0xc8,
+0x59, 0xdf, 0x1a, 0xb6, 0x01, 0x42, 0x45,
+0x12, 0x3a, 0xbd, 0xb6, 0x22, 0xbe, 0x7c,
+0x64, 0x04, 0x07, 0xe4, 0x90, 0xca, 0x55,
+0x94, 0x24, 0xd2, 0xf5, 0x84, 0xf9, 0x1b,
+0xa5, 0xaa, 0xed, 0xec, 0xb5, 0xc4, 0x9e,
+0xaf, 0xda, 0x54, 0x5d, 0x32, 0xfd, 0xe1,
+0x4f, 0x77, 0xa9, 0xdb, 0x77, 0x50, 0x54,
+0x75, 0xcd, 0x4e, 0x9a, 0xd9, 0x87, 0x25,
+0xae, 0x5a, 0x73, 0x36, 0x5d, 0x80, 0xa8,
+0x70, 0x76, 0x8a, 0xc5, 0x42, 0xb2, 0xc1,
+0xed, 0x8e, 0x3b, 0xf8, 0x1c, 0xbf, 0x99,
+0x8a, 0x9b, 0x5d, 0x83, 0xf8, 0x55, 0x91,
+0xd9, 0xd9, 0x80, 0x17, 0xde, 0xea, 0xa1,
+0xf2, 0x47, 0xc2, 0xbd, 0xfa, 0x3b, 0x47,
+0x1b, 0x57, 0xe0, 0xbd, 0x7d, 0xa5, 0x67,
+0x7a, 0x86, 0xae, 0x64, 0x74, 0x57, 0xd6,
+0x9d, 0x34, 0xe8, 0x48, 0xf8, 0x1d, 0xce,
+0x40, 0x32, 0x6e, 0xb4, 0x80, 0xaa, 0xae,
+0xb8, 0x10, 0x23, 0x1c, 0x03, 0x2d, 0x68,
+0x7c, 0x17, 0xb2, 0x10, 0xec, 0x22, 0xa4,
+0x11, 0x0a, 0xcb, 0xe8, 0xcc, 0x56, 0x11,
+0xe4, 0x61, 0xf2, 0x13, 0xf7, 0x9a, 0x67,
+0x3f, 0x82, 0x92, 0xcc, 0x56, 0xd7, 0xc4,
+0x2a, 0xd1, 0x49, 0x22, 0x9a, 0xa1, 0xcf,
+0x2a, 0xea, 0xe8, 0xd6, 0xac, 0x49, 0x3d,
+0x8a, 0x77, 0xc7, 0x3f, 0x29, 0xbf, 0x93,
+0x49, 0x22, 0x93, 0xe2, 0xc0, 0xf1, 0x66,
+0xe0, 0xbe, 0x32, 0x94, 0x13, 0x4b, 0x4a,
+0x70, 0xa0, 0xfe, 0xfb, 0xa3, 0xe7, 0x99,
+0xd0, 0x9d, 0xc1, 0x89, 0x91, 0xe4, 0x78,
+0xc3, 0xf0, 0xb2, 0xae, 0x27, 0x71, 0xc8,
+0x87, 0x1d, 0xaa, 0x40, 0x44, 0x23, 0x68,
+0x9f, 0x51, 0xd5, 0x8b, 0x88, 0xf3, 0x29,
+0x2f, 0xf5, 0xdf, 0x31, 0xa5, 0xcd, 0x8e,
+0xc2, 0x16, 0x2f, 0x0f, 0x69, 0x45, 0xb8,
+0x9b, 0xa5, 0x6f, 0x06, 0x43, 0x15, 0xbb,
+0xaa, 0xf0, 0xa1, 0xd4, 0x5e, 0xf8, 0xbb,
+0xe5, 0x8c, 0x83, 0x6a, 0x4b, 0x87, 0xf2,
+0xa9, 0x61, 0x48, 0xe2, 0xcb, 0x8a, 0xcf,
+0x0c, 0x77, 0x7d, 0x0b, 0xb9, 0x29, 0x80,
+0x69, 0x90, 0x41, 0x31, 0x6b, 0x02, 0x49,
+0xb7, 0xb6, 0x27, 0xca, 0x64, 0x2a, 0x1e,
+0xa4, 0x3c, 0xda, 0x95, 0xa1, 0xb0, 0xa2,
+0x81, 0x90, 0xce, 0xcd, 0x93, 0xc2, 0x88,
+0xac, 0xb2, 0x5f, 0x2c, 0x0e, 0x72, 0x05,
+0x9d, 0x93, 0xb3, 0x46, 0x30, 0x1f, 0xef,
+0xf4, 0xe9, 0xaf, 0x92, 0xb9, 0x92, 0x89,
+0xfc, 0xa6, 0x2e, 0xb4, 0x2a, 0xee, 0x34,
+0x27, 0xcf, 0xb7, 0xdb, 0x36, 0xf4, 0x88,
+0x60, 0xd6, 0xeb, 0x6b, 0x2a, 0x38, 0x35,
+0xe6, 0x4a, 0xbf, 0x57, 0xe9, 0x1d, 0x50,
+0x40, 0xd9, 0x74, 0xe9, 0xc5, 0x03, 0x2a,
+0xde, 0x1e, 0x95, 0xc7, 0xd4, 0xd2, 0x58,
+0x70, 0xdb, 0x20, 0xaa, 0x46, 0x94, 0x55,
+0xd8, 0x19, 0xc7, 0xe6, 0xd4, 0x9b, 0x25,
+0x4f, 0x5d, 0xf9, 0x57, 0x9d, 0xb3, 0x21,
+0x31, 0x95, 0x7c, 0xb6, 0xcb, 0x67, 0x4d,
+0x2f, 0xd7, 0xa7, 0xdd, 0xe5, 0x08, 0xf7,
+0xf2, 0x13, 0x99, 0x98, 0x84, 0x8d, 0xef,
+0x7d, 0xed, 0x17, 0xa1, 0x8c, 0x78, 0x45,
+0x36, 0x54, 0x78, 0xf3, 0xcb, 0x3d, 0x23,
+0x34, 0xcd, 0x94, 0xd8, 0x79, 0x88, 0x7d,
+0xca, 0x3b, 0x0b, 0x69, 0x21, 0xe0, 0x4b,
+0x5f, 0x5f, 0x56, 0x34, 0xba, 0x73, 0xb3,
+0xe5, 0x04, 0xf2, 0x76, 0xaf, 0x19, 0x8c,
+0x4b, 0x3c, 0xf2, 0xd7, 0x9d, 0x5e, 0x3e,
+0x0e, 0x0b, 0x74, 0xb1, 0xf4, 0x51, 0x5b,
+0x5f, 0x9f, 0xdc, 0xa5, 0x4f, 0x95, 0x05,
+0x3a, 0xb9, 0x60, 0x87, 0xc2, 0xda, 0xb1,
+0xa9, 0xc0, 0x85, 0xf6, 0xf4, 0x3c, 0xd9,
+0x3a, 0x39, 0x5d, 0x80, 0xfa, 0x93, 0x56,
+0xbc, 0x4c, 0x7e, 0xb1, 0x8a, 0x34, 0x9a,
+0x0a, 0xeb, 0xd4, 0x83, 0x0e, 0xb1, 0x34,
+0x56, 0xdb, 0x9a, 0xca, 0xbb, 0x0d, 0x34,
+0x9c, 0x38, 0x74, 0x6b, 0xee, 0x67, 0x65,
+0xb4, 0xee, 0xb3, 0x65, 0xc4, 0x22, 0xeb,
+0x4b, 0x7d, 0x67, 0xe5, 0x83, 0x8d, 0xf4,
+0x92, 0x02, 0x88, 0xad, 0x85, 0xe7, 0xbd,
+0xfd, 0x9f, 0xd8, 0x55, 0x86, 0x8e, 0x0d,
+0x1a, 0xff, 0x1a, 0x0a, 0x5d, 0xf9, 0x0a,
+0xc3, 0xa3, 0x66, 0x35, 0xab, 0x09, 0xe2,
+0x64, 0x25, 0x02, 0x6e, 0xbb, 0xca, 0x62,
+0xd2, 0xbe, 0x1e, 0xb1, 0x8f, 0x16, 0xb5,
+0x40, 0x56, 0x86, 0x97, 0x57, 0x35, 0xbf,
+0x1d, 0xdd, 0x70, 0x28, 0x1d, 0xd5, 0x0a,
+0x92, 0x9e, 0x94, 0x35, 0xcb, 0xdc, 0xe2,
+0x56, 0xc3, 0x6f, 0x46, 0x35, 0x73, 0xee,
+0xfd, 0x02, 0x6e, 0x63, 0xad, 0x46, 0x26,
+0xb8, 0x71, 0x6f, 0x4a, 0x67, 0x0d, 0x70,
+0x33, 0x82, 0x90, 0x90, 0x16, 0x00, 0xcd,
+0x54, 0x93, 0xb3, 0xc2, 0x67, 0xdf, 0x6f,
+0x23, 0x34, 0x29, 0x19, 0x02, 0xad, 0x0b,
+0xd0, 0x8e, 0xd9, 0xc8, 0x3d, 0x17, 0x10,
+0xc8, 0x0a, 0x6c, 0x1f, 0x62, 0x3e, 0xed,
+0x72, 0xde, 0x5c, 0x1b, 0x8d, 0xcf, 0xec,
+0xd8, 0xf2, 0x68, 0x46, 0x8f, 0x5a, 0x26,
+0x1c, 0x4e, 0x31, 0x7e, 0x65, 0x4b, 0xc7,
+0xd6, 0x4e, 0x9d, 0xe4, 0x06, 0x98, 0x1e,
+0xef, 0x79, 0x41, 0xfe, 0x9d, 0xe1, 0x68,
+0xbf, 0x45, 0x17, 0xb7, 0x34, 0x90, 0x7c,
+0xa6, 0xf2, 0xe7, 0xa7, 0x59, 0xc0, 0x12,
+0xb0, 0xce, 0x62, 0x1c, 0x22, 0x31, 0x52,
+0x8d, 0x3f, 0x55, 0x41, 0x92, 0x0a, 0xa5,
+0x1e, 0x1d, 0x3c, 0x84, 0xd2, 0xba, 0x5d,
+0x83, 0x83, 0xe9, 0x8e, 0xca, 0xbc, 0xb4,
+0x44, 0xc7, 0x9b, 0x7c, 0xdd, 0x3b, 0xcf,
+0xe2, 0xe3, 0x82, 0x3b, 0x05, 0x12, 0x2f,
+0xf1, 0x7a, 0x62, 0x72, 0xcb, 0xce, 0x3f,
+0xc4, 0xbc, 0xe9, 0x22, 0x34, 0x2f, 0x76,
+0xe7, 0x0f, 0xa3, 0xda, 0x73, 0x1c, 0xe9,
+0xe6, 0x51, 0x39, 0x85, 0xb0, 0xf2, 0xab,
+0xc3, 0x65, 0xd3, 0x18, 0xe5, 0xd7, 0xc4,
+0x64, 0x90, 0xee, 0xe4, 0x9c, 0xc3, 0x69,
+0xe7, 0x9a, 0x1a, 0x7d, 0x1e, 0x43, 0xc8,
+0xe2, 0x31, 0x50, 0x07, 0xd1, 0xb5, 0xb6,
+0x25, 0x56, 0x90, 0x19, 0x38, 0xb9, 0x3e,
+0x2b, 0x3e, 0xcd, 0xcd, 0x74, 0xc1, 0x40,
+0x61, 0xdb, 0xd4, 0xcf, 0xae, 0x88, 0xc0,
+0xc9, 0x19, 0xb4, 0xcc, 0x4e, 0x6e, 0x06,
+0x50, 0xf6, 0x3c, 0x3e, 0xc7, 0x48, 0xb1,
+0x9e, 0x32, 0xe3, 0x54, 0x05, 0xac, 0x41,
+0xd8, 0x31, 0xb6, 0xb3, 0x6e, 0xf1, 0x4d,
+0xfe, 0xd4, 0x38, 0x2e, 0xff, 0x2f, 0x3a,
+0x61, 0xa3, 0xe7, 0x77, 0x99, 0xcb, 0x27,
+0xb8, 0x26, 0xab, 0xc4, 0x10, 0xe3, 0xdf,
+0x93, 0x05, 0x2b, 0x95, 0x7e, 0xca, 0x2e,
+0x6c, 0xe2, 0x9b, 0x29, 0x84, 0xca, 0x6c,
+0xad, 0x9b, 0x59, 0xc6, 0x69, 0x03, 0x78,
+0x34, 0x13, 0xd6, 0x7f, 0xf9, 0x94, 0xcd,
+0xce, 0x79, 0x2b, 0x98, 0x2d, 0xc6, 0xb7,
+0xbe, 0xe2, 0x05, 0x2d, 0xdd, 0xae, 0x62,
+0x4c, 0xb9, 0x12, 0xc9, 0xfe, 0x0d, 0x8b,
+0x90, 0x19, 0xd1, 0x75, 0xfc, 0x5f, 0x6d,
+0x21, 0x86, 0x0b, 0x2d, 0x5f, 0xd1, 0x1c,
+0xde, 0xb4, 0x32, 0x69, 0x6b, 0x41, 0x6d,
+0xbe, 0xfe, 0xb9, 0x62, 0xba, 0x5d, 0x5b,
+0x28, 0x73, 0xd5, 0xdb, 0x7b, 0x71, 0x88,
+0x28, 0x86, 0xb2, 0x1a, 0x6c, 0xa7, 0x52,
+0x79, 0x84, 0x74, 0xd7, 0x40, 0xcf, 0x45,
+0xd7, 0x5a, 0xf3, 0x16, 0xa6, 0x32, 0x5c,
+0x82, 0x6d, 0x1d, 0x76, 0x02, 0x6c, 0x7a,
+0x9e, 0x3e, 0xf9, 0x2f, 0x4b, 0x1a, 0xae,
+0x34, 0x03, 0x39, 0xe2, 0x7f, 0x1e, 0x5a,
+0x29, 0x8d, 0x45, 0xac, 0x2e, 0x85, 0x91,
+0xd0, 0x37, 0xcf, 0xe0, 0x84, 0x02, 0x13,
+0x13, 0x69, 0xd7, 0x8a, 0xc6, 0xbc, 0x07,
+0xb4, 0x1c, 0xa0, 0xa7, 0x18, 0x73, 0x26,
+0x8d, 0xad, 0xae, 0x67, 0xc3, 0x83, 0x88,
+0x46, 0x52, 0x90, 0x23, 0x40, 0xd1, 0x04,
+0x50, 0xbe, 0x57, 0x2a, 0xb5, 0x53, 0x39,
+0x9e, 0x53, 0xb5, 0xcc, 0x15, 0xf2, 0xa7,
+0xae, 0xb1, 0x82, 0x64, 0xa1, 0x05, 0xfe,
+0xd5, 0xf7, 0x39, 0x8b, 0xbe, 0xe5, 0xbb,
+0xae, 0xab, 0xce, 0x4f, 0x60, 0x7b, 0x4c,
+0x2e, 0xc4, 0x3c, 0x32, 0x2c, 0xb1, 0x95,
+0x36, 0xb4, 0x10, 0xd6, 0xfc, 0xf3, 0xcc,
+0x03, 0x69, 0x82, 0xfa, 0xdd, 0x02, 0xfb,
+0xf6, 0xed, 0x44, 0x90, 0xec, 0x7a, 0xfa,
+0x74, 0xd4, 0xd9, 0x97, 0x1c, 0xd1, 0x69,
+0x5f, 0x87, 0xa9, 0x51, 0x1b, 0x00, 0x5d,
+0xf7, 0x12, 0xe0, 0xf1, 0xb0, 0xae, 0x33,
+0x09, 0xbc, 0xe9, 0xd0, 0x50, 0xac, 0x80,
+0x80, 0xb8, 0xe1, 0xa5, 0x7a, 0xd5, 0x65,
+0x1c, 0xee, 0xd7, 0xcb, 0xbb, 0x09, 0x6d,
+0x86, 0xb2, 0x31, 0x54, 0xcd, 0xca, 0x49,
+0x67, 0x5c, 0x7f, 0x49, 0x90, 0xf3, 0xb3,
+0x95, 0x8d, 0x25, 0xed, 0x4e, 0x84, 0x28,
+0xb3, 0xbf, 0x68, 0xc1, 0xc6, 0x32, 0xa0,
+0x66, 0xb0, 0x07, 0x25, 0xc5, 0x26, 0xfb,
+0x76, 0x9e, 0x73, 0xed, 0x63, 0x19, 0x2f,
+0xb1, 0x3e, 0xb0, 0xc7, 0x8c, 0xd8, 0x7d,
+0x60, 0xb5, 0x0a, 0x0c, 0x57, 0x0d, 0xac,
+0xa5, 0xa3, 0x12, 0x1e, 0x3a, 0xa3, 0x82,
+0xeb, 0xfb, 0x0d, 0x1a, 0x26, 0x22, 0xd6,
+0x25, 0x14, 0xa7, 0x4e, 0x72, 0x87, 0x62,
+0x8d, 0x7a, 0x25, 0x31, 0xbb, 0xb8, 0x89,
+0x62, 0x69, 0xf1, 0xff, 0xb4, 0xb7, 0x26,
+0x45, 0x80, 0x59, 0xce, 0x1b, 0x19, 0x22,
+0x4b, 0x6d, 0x31, 0x8f, 0xf7, 0x9c, 0xf2,
+0xf7, 0xe0, 0x1e, 0x4a, 0x7d, 0x5e, 0x6c,
+0xc2, 0x3e, 0x2d, 0x42, 0x96, 0xe6, 0xe8,
+0x7d, 0x3d, 0xdf, 0x8b, 0xbb, 0x8c, 0x64,
+0xc3, 0x45, 0x91, 0x67, 0x39, 0x6c, 0xcb,
+0x9b, 0x58, 0x4b, 0xde, 0x32, 0x6c, 0xc4,
+0xf2, 0x19, 0x5e, 0x27, 0x7e, 0xdc, 0xee,
+0x14, 0x69, 0x14, 0x83, 0x62, 0xa6, 0xb5,
+0x3e, 0x87, 0x49, 0x23, 0x5c, 0xcf, 0x47,
+0x20, 0xd4, 0x84, 0x2c, 0xba, 0xc7, 0x4b,
+0x0c, 0xf5, 0xfd, 0xa9, 0x36, 0xdd, 0x32,
+0x97, 0x78, 0x6b, 0x52, 0x4a, 0xac, 0x73,
+0xb6, 0x38, 0x58, 0x6c, 0xc4, 0x2c, 0xbe,
+0x57, 0xbc, 0xd2, 0x29, 0xad, 0xb0, 0xfc,
+0xd9, 0xcf, 0x0d, 0x4d, 0x8d, 0x85, 0x80,
+0x50, 0x8e, 0x35, 0xf1, 0x9a, 0x9f, 0x19,
+0x05, 0xb8, 0x65, 0x0f, 0x1b, 0xc5, 0xca,
+0xb9, 0x77, 0xb1, 0x00, 0xa1, 0x9a, 0x95,
+0xd7, 0x11, 0xcd, 0x8f, 0x56, 0xe3, 0x62,
+0xc9, 0xc5, 0x47, 0xf1, 0x2c, 0x0c, 0xd1,
+0xc2, 0x49, 0x17, 0xc0, 0xe4, 0xeb, 0xe4,
+0xa9, 0x1f, 0x34, 0x10, 0x0a, 0xc5, 0x54,
+0x8d, 0xb1, 0xb9, 0x4d, 0xf6, 0x89, 0xc2,
+0x86, 0x2c, 0xde, 0x32, 0xdd, 0x67, 0x01,
+0x0a, 0x37, 0xad, 0x0a, 0xa7, 0xa9, 0x6a,
+0x75, 0xdf, 0x18, 0x53, 0xf8, 0x54, 0xee,
+0x4e, 0x2a, 0x0b, 0x94, 0x09, 0x92, 0x54,
+0x20, 0x92, 0x93, 0x5a, 0x22, 0xb5, 0xc6,
+0x1a, 0x94, 0xed, 0xd5, 0x2b, 0xe7, 0xb6,
+0xe2, 0xdf, 0xc5, 0x4f, 0x17, 0xce, 0xfc,
+0xc2, 0x5a, 0xdb, 0x3b, 0xf9, 0x9d, 0xd5,
+0x94, 0x3a, 0x7a, 0x9f, 0x5d, 0xb6, 0xe0,
+0x46, 0x33, 0x5c, 0x2d, 0xb4, 0x5e, 0x5d,
+0xaf, 0x0a, 0x24, 0x0a, 0xae, 0x39, 0xe5,
+0xef, 0xc4, 0xb1, 0x26, 0xad, 0x42, 0x1f,
+0xc3, 0x12, 0x79, 0xb8, 0x60, 0xcc, 0x23,
+0x28, 0x6d, 0x11, 0x41, 0x27, 0x08, 0x8f,
+0xbd, 0x12, 0xbe, 0x71, 0x5f, 0x48, 0x99,
+0x88, 0xa0, 0xa0, 0x34, 0xb5, 0x0e, 0x72,
+0xe3, 0x99, 0x7d, 0x88, 0x14, 0x1c, 0x3e,
+0x13, 0xd6, 0xcd, 0x56, 0xb5, 0x46, 0xc6,
+0xed, 0x80, 0x78, 0x23, 0xb5, 0xfb, 0x53,
+0x7c, 0x5f, 0x9f, 0xb4, 0x21, 0x2c, 0xb7,
+0x4b, 0xbf, 0x5a, 0x67, 0xc7, 0x9a, 0x4f,
+0x59, 0x2f, 0x8f, 0x3b, 0x8a, 0x11, 0xde,
+0x5a, 0xa7, 0x66, 0xc5, 0x2b, 0xa7, 0x2d,
+0xde, 0xad, 0x85, 0x0c, 0x5d, 0x80, 0xf6,
+0x41, 0x38, 0x99, 0xdf, 0x1f, 0x27, 0x64,
+0x5c, 0xe5, 0x26, 0x6f, 0x2e, 0xbc, 0xb3,
+0x5e, 0x00, 0xf7, 0x9d, 0x1e, 0xdb, 0x35,
+0x7e, 0x70, 0x9d, 0xaf, 0x33, 0x5f, 0x01,
+0x79, 0xe2, 0x08, 0x4f, 0x50, 0x7b, 0xf0,
+0x10, 0xa5, 0xe8, 0x63, 0x36, 0x34, 0xe5,
+0x2e, 0x25, 0x1b, 0xfa, 0x1d, 0xd8, 0x99,
+0x4c, 0xda, 0xa5, 0xf1, 0xe1, 0xa8, 0xfb,
+0x7e, 0x07, 0x2a, 0x98, 0x43, 0x87, 0x69,
+0xa3, 0xb0, 0x68, 0xce, 0xdd, 0xad, 0xb0,
+0x1f, 0x26, 0x1e, 0x60, 0x4f, 0x92, 0xc8,
+0x74, 0xb3, 0xee, 0xee, 0x53, 0x73, 0x97,
+0x03, 0xa0, 0x5a, 0x84, 0x9f, 0x9b, 0x79,
+0x2b, 0x6b, 0xbb, 0xec, 0x95, 0xa6, 0x97,
+0x01, 0x47, 0x45, 0xd7, 0x07, 0x77, 0x86,
+0x19, 0x43, 0x8d, 0x9a, 0x44, 0x7c, 0xb4,
+0x85, 0x48, 0xcd, 0xa0, 0x9e, 0x94, 0xc3,
+0x41, 0x46, 0x40, 0xd5, 0x51, 0x75, 0x64,
+0x58, 0x36, 0x5a, 0xc9, 0x52, 0x48, 0x08,
+0xa4, 0xd3, 0xd9, 0x7e, 0x07, 0x74, 0x22,
+0xd9, 0xf3, 0x2d, 0x4d, 0x93, 0x8b, 0xad,
+0x79, 0xc1, 0x6a, 0x6d, 0xd6, 0x57, 0xc4,
+0xbf, 0x37, 0x03, 0xb1, 0x78, 0xf2, 0xf3,
+0x1c, 0x01, 0xd6, 0x09, 0x53, 0xb8, 0xb4,
+0x23, 0x54, 0xaf, 0x39, 0x8c, 0xa6, 0xf7,
+0x54, 0x19, 0x99, 0x53, 0xd1, 0x3a, 0x14,
+0x68, 0xf2, 0x00, 0x69, 0x03, 0xa3, 0xae,
+0x75, 0x46, 0x2e, 0x70, 0xe5, 0xde, 0x4c,
+0xe0, 0xec, 0x46, 0x94, 0xa6, 0x6d, 0x7b,
+0x9c, 0x96, 0x65, 0xeb, 0x1f, 0x62, 0xd5,
+0xe4, 0x26, 0x62, 0x38, 0xc0, 0x7f, 0xce,
+0xa4, 0x14, 0x11, 0xe9, 0xfa, 0x97, 0x64,
+0x4e, 0x0f, 0x82, 0x6f, 0x82, 0x82, 0x2d,
+0x2a, 0xd0, 0xc0, 0xd3, 0x66, 0x37, 0x87,
+0x1b, 0x9d, 0xaf, 0x2c, 0xbd, 0xe3, 0xb2,
+0x15, 0x36, 0x75, 0x65, 0x1c, 0x68, 0xbc,
+0x4d, 0x64, 0xe6, 0x50, 0x82, 0x0a, 0x4f,
+0x4b, 0x0d, 0x2c, 0x89, 0x63, 0x50, 0x18,
+0x48, 0x3c, 0xcf, 0xa8, 0xa8, 0x1b, 0xaa,
+0x62, 0x38, 0x79, 0x4d, 0x93, 0x79, 0xeb,
+0xcb, 0x54, 0x17, 0x76, 0xc2, 0x29, 0xf5,
+0x54, 0x34, 0x36, 0xe8, 0xfb, 0x87, 0x30,
+0xec, 0x67, 0xf1, 0x16, 0x26, 0x10, 0x6f,
+0xab, 0x0a, 0x9b, 0xea, 0x38, 0x16, 0x42,
+0x9f, 0x45, 0xbb, 0xbc, 0x88, 0x5c, 0x2d,
+0x03, 0xe0, 0xc0, 0xd9, 0xc9, 0x99, 0x8e,
+0xab, 0x5e, 0x6f, 0x57, 0xff, 0xe4, 0xe2,
+0xc4, 0x5a, 0xf8, 0x3d, 0x59, 0x12, 0x82,
+0x35, 0x2d, 0x92, 0x0f, 0x5b, 0xa3, 0xd0,
+0x25, 0xd7, 0xe5, 0xa9, 0xd1, 0xde, 0x73,
+0x78, 0x0b, 0x17, 0x6e, 0xa1, 0xf2, 0xfe,
+0x68, 0xba, 0xe0, 0x24, 0x26, 0x75, 0x58,
+0x18, 0x07, 0xa1, 0x94, 0x56, 0xed, 0xd8,
+0x59, 0x01, 0x4c, 0x45, 0xff, 0x9d, 0x8c,
+0xbf, 0xa1, 0x40, 0x19, 0xdc, 0x17, 0x04,
+0x8d, 0xd4, 0x43, 0x9e, 0xa0, 0x0a, 0xca,
+0x9d, 0x1e, 0xc7, 0xf5, 0x50, 0xad, 0x6b,
+0x99, 0x75, 0xda, 0x4b, 0xfc, 0x4f, 0x92,
+0x5e, 0x3c, 0x49, 0xb7, 0x0e, 0xf6, 0xda,
+0x35, 0xa7, 0x17, 0xd3, 0xb7, 0x30, 0xc9,
+0x7b, 0x50, 0xcc, 0x09, 0x29, 0xa4, 0xfa,
+0xc0, 0x63, 0xaf, 0xee, 0x71, 0x1d, 0x57,
+0xdf, 0x64, 0xfd, 0x32, 0x18, 0x7d, 0x28,
+0xb8, 0xca, 0xbe, 0x81, 0x5e, 0x89, 0x70,
+0xfe, 0x5f, 0xae, 0x82, 0x79, 0xf6, 0xf5,
+0x8f, 0x54, 0xfe, 0xe0, 0xc4, 0x12, 0x07,
+0x5e, 0x80, 0x4e, 0x74, 0x7b, 0x74, 0x1c,
+0xe2, 0x81, 0x77, 0xf8, 0x13, 0xae, 0xd9,
+0xf7, 0x2c, 0xc0, 0xc1, 0x0f, 0xbb, 0xcb,
+0xe1, 0xb3, 0x27, 0x2f, 0x08, 0x9d, 0x4a,
+0xc8, 0xdc, 0x09, 0xc3, 0x78, 0xba, 0x85,
+0x17, 0xb0, 0xa9, 0x2c, 0xaa, 0x1a, 0x0a,
+0x67, 0xea, 0x33, 0x3e, 0x03, 0x5f, 0xc6,
+0xd3, 0x0d, 0x50, 0xfd, 0x22, 0xb6, 0x12,
+0x35, 0x24, 0x82, 0xd7, 0x55, 0xc4, 0x6d,
+0x0e, 0xac, 0x38, 0x82, 0x77, 0x39, 0xa2,
+0x16, 0x0e, 0xc5, 0xd5, 0x90, 0x70, 0xb2,
+0x92, 0x4b, 0xb7, 0xb3, 0x7c, 0xad, 0x3a,
+0xf9, 0xd6, 0x53, 0x3f, 0xf8, 0xdb, 0x03,
+0x10, 0x14, 0x4f, 0x7c, 0x47, 0x64, 0x24,
+0xd2, 0xd8, 0xec, 0x72, 0x73, 0xc8, 0x21,
+0x81, 0xcc, 0xb5, 0x11, 0xd2, 0x8c, 0xbc,
+0xe1, 0x27, 0xa7, 0xe5, 0x76, 0xae, 0x92,
+0x19, 0x23, 0x99, 0x43, 0x8f, 0x3b, 0xee,
+0xd5, 0x62, 0xf8, 0xb5, 0x66, 0xc9, 0x66,
+0xee, 0xdc, 0x99, 0x49, 0xcc, 0x7f, 0x24,
+0xce, 0x25, 0xbc, 0xe1, 0x4e, 0xa4, 0x07,
+0x1c, 0xe8, 0x60, 0xe8, 0x2d, 0xdd, 0x0a,
+0x4f, 0x3f, 0x09, 0xf4, 0x28, 0xe6, 0x1b,
+0x74, 0xb0, 0xfa, 0xa8, 0xa9, 0x7d, 0xed,
+0xae, 0x9f, 0x3c, 0x5b, 0x32, 0xb6, 0x7f,
+0xfa, 0x3a, 0xc3, 0xbc, 0xb4, 0xe5, 0x81,
+0x63, 0x08, 0xc4, 0x4e, 0xa0, 0xaf, 0xd7,
+0x6e, 0xa1, 0x2d, 0x7f, 0xf1, 0x49, 0x97,
+0xde, 0xf0, 0xca, 0xe2, 0x94, 0xf5, 0x7f,
+0xd5, 0xf3, 0x96, 0x15, 0xb9, 0xc1, 0x1d,
+0x49, 0x0a, 0x05, 0xcb, 0xfd, 0x6a, 0xfd,
+0x3c, 0xc5, 0xcb, 0x0a, 0xaf, 0xde, 0x15,
+0x34, 0x0e, 0xb8, 0xa5, 0x4b, 0x97, 0x63,
+0x92, 0xcf, 0xd9, 0xd9, 0x67, 0x40, 0x17,
+0x42, 0x4b, 0xc8, 0xdf, 0x4c, 0x14, 0x3b,
+0x3c, 0x23, 0x91, 0xf2, 0x57, 0x38, 0x23,
+0x8e, 0x66, 0xf0, 0xfd, 0x3b, 0x9e, 0x4d,
+0x93, 0x23, 0x49, 0xed, 0x96, 0xf7, 0x1b,
+0x11, 0x55, 0x55, 0x86, 0x2f, 0x09, 0xe1,
+0x57, 0xa8, 0xc2, 0x54, 0x1a, 0x81, 0x85,
+0x50, 0x64, 0xfc, 0x16, 0x0b, 0x0c, 0x20,
+0x24, 0xb5, 0xce, 0x38, 0x21, 0xf4, 0xb1,
+0x84, 0xc4, 0xcb, 0x5a, 0x37, 0x47, 0xfc,
+0x24, 0x07, 0x00, 0x24, 0x6c, 0x94, 0xdf,
+0xa8, 0xaf, 0xd0, 0x3c, 0x80, 0xe7, 0x19,
+0xb1, 0xe2, 0xaa, 0x1c, 0xfb, 0xfc, 0xce,
+0xe0, 0x6b, 0x5c, 0xbe, 0x4a, 0xb0, 0xad,
+0x17, 0xf2, 0x47, 0xb3, 0x97, 0x70, 0x78,
+0x5d, 0x89, 0xe0, 0x7f, 0x8e, 0x8e, 0x19,
+0xe2, 0xc0, 0x11, 0x4e, 0x10, 0x0d, 0x67,
+0x4d, 0x21, 0x8e, 0x97, 0x90, 0xbb, 0xac,
+0xc0, 0x4a, 0x85, 0xdb, 0x5b, 0x9a, 0x91,
+0x62, 0x76, 0x39, 0x67, 0xb6, 0xe0, 0xfc,
+0x3f, 0xa4, 0x71, 0x1f, 0xa7, 0xae, 0x84,
+0x5b, 0xad, 0x84, 0x56, 0xae, 0x90, 0xe2,
+0xe2, 0xf6, 0x97, 0x77, 0xee, 0xa1, 0xd4,
+0x50, 0x26, 0x3a, 0x3f, 0x9e, 0x5a, 0x75,
+0xa8, 0xce, 0xf5, 0x4f, 0x2e, 0xfc, 0xee,
+0x87, 0xb2, 0xe9, 0x92, 0x5e, 0xce, 0x09,
+0x12, 0x1b, 0x56, 0x3e, 0x28, 0xb1, 0x2c,
+0x1f, 0xe4, 0x59, 0x09, 0x75, 0x1a, 0xdf,
+0x3e, 0x91, 0x79, 0x0f, 0x71, 0x36, 0x6d,
+0xb2, 0xcd, 0x82, 0x0c, 0x9d, 0x3d, 0xfa,
+0x0f, 0x8c, 0xf8, 0xc2, 0x65, 0xa6, 0xae,
+0x42, 0x93, 0x2c, 0xcd, 0x8b, 0x76, 0x4d,
+0x0e, 0xec, 0xd2, 0xd5, 0x43, 0xe3, 0xd6,
+0x61, 0xcc, 0xd9, 0x7e, 0x42, 0x09, 0xbd,
+0x0b, 0xaa, 0x95, 0xb0, 0x03, 0x5d, 0x87,
+0xd6, 0x15, 0xe8, 0x3e, 0x65, 0x1f, 0xc6,
+0xd8, 0x79, 0xfe, 0xa9, 0xc4, 0xbc, 0xc8,
+0x81, 0xf5, 0x0b, 0x75, 0xab, 0xc4, 0x12,
+0x1a, 0x6e, 0x76, 0xd9, 0xea, 0x58, 0xea,
+0x81, 0x99, 0x72, 0x8b, 0x3c, 0x2b, 0xca,
+0xff, 0xfd, 0xff, 0xb4, 0x07, 0xb5, 0x1d,
+0x0c, 0x7a, 0x55, 0x76, 0xf9, 0xb6, 0x7e,
+0xbd, 0xd7, 0x46, 0x07, 0x3e, 0x17, 0x96,
+0x24, 0xba, 0x94, 0xdf, 0xe4, 0x10, 0xeb,
+0xed, 0x37, 0xd0, 0xe2, 0xc2, 0x33, 0x26,
+0x25, 0xa0, 0x00, 0xe5, 0xf5, 0x7a, 0x82,
+0xec, 0x11, 0xdf, 0xd4, 0x68, 0x87, 0x69,
+0x81, 0x40, 0xff, 0x1a, 0x3d, 0xc7, 0x37,
+0xe1, 0x94, 0x42, 0xa5, 0xdf, 0xc0, 0xeb,
+0x38, 0x82, 0x2d, 0x33, 0xf7, 0x9d, 0x6c,
+0x7c, 0xee, 0xa4, 0x3e, 0x37, 0x73, 0xfc,
+0x3b, 0x2c, 0xd9, 0x0c, 0x5b, 0x7a, 0x18,
+0x9c, 0xe3, 0x53, 0xc5, 0xbb, 0x02, 0xc2,
+0x4a, 0x03, 0xb3, 0xeb, 0xe9, 0x74, 0xc3,
+0xb4, 0x2f, 0xfa, 0xc1, 0xf9, 0xa9, 0x22,
+0xf0, 0x53, 0xc4, 0x2a, 0x33, 0x24, 0x3c,
+0xbe, 0xb2, 0xf4, 0x72, 0xdf, 0x71, 0xf6,
+0x8c, 0x85, 0xb8, 0xb4, 0xef, 0xd3, 0x17,
+0x52, 0x68, 0xdc, 0xcd, 0xb8, 0x0d, 0x09,
+0xb5, 0x40, 0xdf, 0x0b, 0x4a, 0xbd, 0xee,
+0xd3, 0x92, 0x03, 0xbd, 0xff, 0x1f, 0x5c,
+0x6f, 0xb0, 0x4d, 0x94, 0x01, 0xf4, 0xca,
+0xdd, 0x86, 0xdc, 0x4e, 0x41, 0xe9, 0x49,
+0x08, 0x55, 0x01, 0x03, 0x49, 0x89, 0x9b,
+0xc1, 0x0b, 0x23, 0x52, 0xf8, 0xea, 0x2d,
+0x75, 0xdd, 0xb1, 0xb1, 0x2e, 0xa1, 0x91,
+0x10, 0x7c, 0x13, 0xe6, 0xe4, 0x47, 0x2c,
+0x08, 0x6e, 0xfc, 0xca, 0xf9, 0x47, 0x1c,
+0x9c, 0x80, 0x3a, 0x7e, 0xcd, 0xb8, 0xad,
+0x53, 0xf5, 0x04, 0xcc, 0x7e, 0x8b, 0x4e,
+0x6c, 0x65, 0x52, 0x1c, 0x8a, 0x7a, 0xa6,
+0x30, 0x6a, 0x6f, 0xc2, 0xf5, 0x26, 0xf8,
+0xc9, 0xa6, 0xb1, 0x47, 0x18, 0x16, 0x3d,
+0x38, 0x47, 0x95, 0xa5, 0x16, 0xb2, 0x95,
+0x77, 0xad, 0x2b, 0xdf, 0xf8, 0x27, 0xc8,
+0x7c, 0xf7, 0xa0, 0x12, 0x13, 0xa1, 0xcb,
+0xd0, 0xd3, 0x01, 0x7f, 0x51, 0x89, 0x0e,
+0xb1, 0x72, 0x5c, 0x08, 0x15, 0xa0, 0x20,
+0xd6, 0x10, 0x3e, 0xbe, 0xcb, 0x45, 0x30,
+0x92, 0x3d, 0xb7, 0xca, 0x4d, 0xff, 0xe0,
+0x0c, 0x17, 0x77, 0xbc, 0x92, 0x84, 0xf0,
+0x63, 0x39, 0xde, 0xb3, 0x31, 0x4b, 0x0b,
+0xe6, 0x4d, 0x8b, 0x8d, 0x81, 0xf7, 0xfb,
+0x51, 0xbf, 0x53, 0xeb, 0x23, 0x12, 0x6e,
+0x48, 0x28, 0xbe, 0xaa, 0x18, 0xff, 0x70,
+0x9f, 0x81, 0x87, 0x7e, 0xb3, 0x21, 0xba,
+0x44, 0x5a, 0x63, 0x60, 0x31, 0xf2, 0x62,
+0x2a, 0x92, 0x74, 0x31, 0x6a, 0x98, 0x4c,
+0xbd, 0x90, 0xe4, 0xd7, 0xbc, 0xab, 0xe7,
+0x51, 0xde, 0x08, 0x68, 0xa7, 0xcc, 0x28,
+0xdf, 0xac, 0xb1, 0x05, 0xca, 0x0d, 0xe8,
+0x50, 0xcd, 0x0c, 0x41, 0xfe, 0x43, 0xe0,
+0x97, 0x75, 0xb9, 0x11, 0xc3, 0x48, 0xe7,
+0xfa, 0x5b, 0xf3, 0x92, 0x7f, 0x3a, 0x50,
+0xe4, 0xd7, 0x49, 0xe0, 0x22, 0x79, 0x2a,
+0x19, 0x7e, 0x21, 0x08, 0xf9, 0x5b, 0x87,
+0x13, 0x8d, 0xf1, 0x02, 0x10, 0x14, 0xe9,
+0x11, 0xfa, 0xb2, 0xd5, 0x08, 0xdb, 0xbc,
+0x95, 0x79, 0x8d, 0xce, 0x53, 0x41, 0xd7,
+0xf9, 0x72, 0x6d, 0xe3, 0x95, 0x56, 0xb6,
+0xbb, 0x71, 0x77, 0xab, 0x07, 0xbd, 0xdd,
+0xeb, 0xc9, 0xb7, 0x26, 0xcd, 0x15, 0xbd,
+0x19, 0x88, 0xe9, 0x7c, 0xa0, 0xaa, 0x3e,
+0x64, 0xd1, 0xd9, 0x66, 0x91, 0xdd, 0x89,
+0x5d, 0xfc, 0x26, 0x2e, 0x0a, 0x9c, 0x87,
+0x88, 0x44, 0x2e, 0x54, 0x68, 0x98, 0x8b,
+0xa7, 0x23, 0xd6, 0xe2, 0x3a, 0x17, 0x2f,
+0xd9, 0x71, 0x89, 0xa6, 0xcb, 0x1d, 0xb8,
+0x21, 0xe6, 0x8d, 0x37, 0x30, 0xca, 0xcb,
+0xc5, 0x87, 0x61, 0x1b, 0x39, 0xca, 0xf5,
+0xe8, 0xd4, 0x3b, 0xa6, 0x3f, 0xdf, 0x19,
+0x34, 0x70, 0xeb, 0xb0, 0x5b, 0xb5, 0x2c,
+0x3f, 0x6f, 0x99, 0x4e, 0x21, 0x64, 0x64,
+0x3f, 0xb7, 0x01, 0x5d, 0x59, 0x27, 0x93,
+0xe1, 0x74, 0xbe, 0xa2, 0x48, 0x15, 0x1f,
+0x44, 0x88, 0x4f, 0x72, 0xd8, 0x51, 0x3b,
+0xdf, 0x74, 0x4c, 0xd7, 0x60, 0x6c, 0x99,
+0x79, 0xf3, 0xdc, 0xd5, 0xbc, 0xf8, 0x57,
+0x13, 0x4d, 0x2b, 0x91, 0xbe, 0x94, 0xa8,
+0x31, 0x74, 0x49, 0x7e, 0x40, 0xca, 0x8b,
+0xe9, 0xf5, 0x83, 0x90, 0x86, 0x8f, 0xa3,
+0x46, 0xcf, 0x4a, 0xbc, 0xf5, 0xc9, 0x03,
+0xb4, 0x25, 0xaa, 0xe6, 0x6c, 0xcf, 0xc6,
+0xbf, 0x90, 0x74, 0xf2, 0x6f, 0xa9, 0x5e,
+0xba, 0xee, 0x5f, 0x90, 0x07, 0x19, 0x75,
+0x41, 0xf4, 0x35, 0xe6, 0xd5, 0x05, 0xbe,
+0xdb, 0xc4, 0xc8, 0xc8, 0xce, 0x21, 0xe6,
+0xbf, 0xd9, 0xa3, 0x5f, 0xce, 0x63, 0x89,
+0xa0, 0xd4, 0x30, 0x5e, 0x48, 0xca, 0xb1,
+0x04, 0x5e, 0x78, 0xfa, 0xac, 0x9f, 0x98,
+0x2f, 0xb2, 0xe1, 0xfc, 0x2e, 0x76, 0xda,
+0xc5, 0x55, 0x7c, 0xcc, 0x40, 0x9e, 0xf0,
+0x42, 0x84, 0xb3, 0x69, 0x5a, 0x3c, 0x78,
+0xe7, 0x34, 0x7b, 0xf1, 0x6b, 0x8f, 0xc3,
+0x34, 0xfc, 0x4b, 0x56, 0xfc, 0x33, 0x93,
+0xb6, 0x01, 0x35, 0xbb, 0x94, 0xcd, 0xb3,
+0xef, 0x00, 0x4f, 0x06, 0x41, 0xb4, 0x2e,
+0xd1, 0x8d, 0x22, 0x41, 0x45, 0x58, 0x46,
+0x29, 0xe0, 0x26, 0x38, 0x45, 0x00, 0xdb,
+0x6c, 0xfc, 0xc4, 0x9f, 0xe5, 0xb3, 0x3b,
+0xba, 0x57, 0x82, 0x51, 0x2d, 0xef, 0x3e,
+0xc1, 0x65, 0x89, 0x3d, 0x85, 0x62, 0xe9,
+0x58, 0x1c, 0x27, 0x77, 0xa0, 0xcb, 0x2d,
+0x33, 0x88, 0x2c, 0xb7, 0x32, 0xa5, 0x55,
+0xdb, 0xe5, 0x33, 0x88, 0x5f, 0x72, 0xb1,
+0x91, 0x9b, 0xe0, 0x25, 0x31, 0x3b, 0x35,
+0x67, 0x27, 0x30, 0xda, 0x75, 0xcd, 0x78,
+0xa3, 0x2a, 0x6f, 0x0e, 0x80, 0xc9, 0xa7,
+0x69, 0x00, 0xed, 0x5d, 0x3f, 0x87, 0xa3,
+0x87, 0x11, 0xf5, 0x65, 0x07, 0xcb, 0xcd,
+0xb7, 0x31, 0x2b, 0x5a, 0x52, 0x19, 0x1e,
+0xa4, 0x7e, 0x93, 0x9e, 0xf5, 0x60, 0x7b,
+0xea, 0x8b, 0x0b, 0x6e, 0xbb, 0xe3, 0x85,
+0x04, 0xe6, 0x5b, 0xb9, 0x78, 0x61, 0x7f,
+0xe1, 0x1c, 0x6c, 0xff, 0x5d, 0x25, 0x8c,
+0x12, 0x86, 0xa6, 0xec, 0x30, 0x5d, 0x57,
+0x29, 0x6a, 0x3e, 0x8f, 0x96, 0xaf, 0xca,
+0x88, 0xf0, 0x17, 0xeb, 0xf1, 0x2f, 0xe0,
+0x07, 0x41, 0xe1, 0x47, 0x81, 0x48, 0x28,
+0x09, 0x2f, 0xf2, 0x50, 0x7b, 0xca, 0x7c,
+0xe2, 0x1e, 0x17, 0x47, 0x34, 0x25, 0x8e,
+0x5a, 0x04, 0xe4, 0x6c, 0xd2, 0xad, 0x7f,
+0xaa, 0xaa, 0xc8, 0x1d, 0x2a, 0xaa, 0x62,
+0x16, 0x31, 0x4b, 0x88, 0x1d, 0x2d, 0xd5,
+0x31, 0x96, 0x15, 0xa7, 0xb0, 0xa6, 0x0c,
+0xc4, 0xef, 0xcb, 0xb9, 0x86, 0x8a, 0xfe,
+0xb9, 0x99, 0xc8, 0x73, 0xd5, 0x3a, 0xa0,
+0x24, 0x06, 0x1b, 0x89, 0x45, 0xc0, 0x38,
+0x33, 0xcc, 0x25, 0xb0, 0xc9, 0xeb, 0xee,
+0x0b, 0xd3, 0xfe, 0xa6, 0x51, 0x84, 0xef,
+0xd4, 0x1c, 0x42, 0xc6, 0x04, 0x15, 0x33,
+0x98, 0xd6, 0xd7, 0x01, 0xf8, 0xc3, 0x29,
+0xe0, 0xeb, 0x5f, 0x28, 0x5a, 0xd1, 0xa6,
+0x90, 0x26, 0xac, 0x0a, 0x58, 0xed, 0x08,
+0x41, 0xe8, 0x5f, 0x84, 0x8f, 0xaf, 0x04,
+0x82, 0x1f, 0xa1, 0xf7, 0x3b, 0xbf, 0xd9,
+0x69, 0x98, 0xcc, 0x59, 0xb3, 0x7f, 0xde,
+0xa2, 0x55, 0x81, 0x8b, 0x88, 0xb2, 0x98,
+0xfd, 0x77, 0x7a, 0x32, 0x7b, 0x42, 0xe1,
+0x14, 0x94, 0xbf, 0x7c, 0xcf, 0x43, 0x73,
+0x51, 0x97, 0xda, 0xc3, 0x96, 0x79, 0x3a,
+0x0a, 0xf5, 0x0b, 0x5a, 0x9d, 0x60, 0x5d,
+0x4c, 0x8f, 0x7f, 0x31, 0x8a, 0xe1, 0xd8,
+0xf9, 0x18, 0x62, 0x4d, 0xa4, 0xb6, 0x4a,
+0x80, 0xa8, 0x09, 0x85, 0x2c, 0x1a, 0x14,
+0x3c, 0xa9, 0xab, 0x28, 0xef, 0x35, 0x37,
+0x7c, 0xdc, 0x69, 0x0e, 0x8f, 0x82, 0xa0,
+0xfb, 0xb4, 0x86, 0xcc, 0xd9, 0x07, 0x1a,
+0x2d, 0x53, 0xa9, 0x5b, 0x46, 0xf7, 0xf2,
+0xcb, 0x7a, 0x85, 0x62, 0x89, 0xc8, 0x53,
+0x08, 0x24, 0xfc, 0x11, 0x10, 0xfb, 0x4f,
+0x31, 0x21, 0x6f, 0x01, 0x10, 0xff, 0x2f,
+0x21, 0x48, 0x8e, 0x91, 0xa0, 0x91, 0xc7,
+0xaf, 0x0a, 0xf9, 0xb2, 0x3f, 0xe4, 0x61,
+0x83, 0x1b, 0x03, 0xb8, 0x66, 0x96, 0xd1,
+0x54, 0x85, 0xfc, 0xf1, 0x7d, 0x10, 0x3e,
+0xec, 0xcf, 0x2d, 0xe5, 0xaa, 0xe0, 0xde,
+0xa7, 0x20, 0x8a, 0x22, 0xca, 0x1a, 0x56,
+0x98, 0xb2, 0x7c, 0xe7, 0x6c, 0xf5, 0x2f,
+0x9e, 0x9e, 0x95, 0x43, 0xbc, 0x8a, 0x3d,
+0xcc, 0xa0, 0xdb, 0x49, 0x78, 0x36, 0x84,
+0x2e, 0x55, 0x49, 0x02, 0xb2, 0xdf, 0x5f,
+0x21, 0x1c, 0x2b, 0x97, 0xca, 0xc1, 0x8f,
+0xc1, 0x5d, 0xf2, 0xa4, 0x3c, 0xb7, 0x69,
+0xd0, 0x19, 0x5d, 0xea, 0xe6, 0x95, 0x7d,
+0x1d, 0x34, 0xaf, 0x08, 0xa8, 0x15, 0x24,
+0x2d, 0xbe, 0x9c, 0x9f, 0xb3, 0xb8, 0x6b,
+0x29, 0x68, 0x4e, 0x07, 0x6f, 0xfb, 0xe1,
+0xc8, 0x27, 0x5b, 0x3c, 0xef, 0x8f, 0x85,
+0x79, 0x75, 0x42, 0xfb, 0xab, 0x59, 0x9c,
+0x8c, 0x18, 0x10, 0x0f, 0xc4, 0x74, 0x24,
+0xfe, 0x82, 0x7f, 0xb6, 0x6c, 0xfd, 0xc0,
+0xc5, 0xd6, 0xa6, 0x23, 0x7c, 0x26, 0xf1,
+0x28, 0x09, 0x32, 0xa3, 0x59, 0x5f, 0x98,
+0x89, 0x6c, 0x22, 0xd6, 0x6b, 0x7d, 0x52,
+0x1c, 0xce, 0xbd, 0xbb, 0xf5, 0x1b, 0x8d,
+0x8d, 0xa2, 0xd4, 0x98, 0x30, 0x14, 0x69,
+0xd8, 0xae, 0x66, 0x36, 0x6e, 0x7c, 0xd8,
+0x82, 0x97, 0xa3, 0xac, 0x84, 0x35, 0xe3,
+0xeb, 0x09, 0x4b, 0x72, 0x43, 0xd7, 0x2b,
+0xc9, 0xc4, 0x72, 0xbe, 0x84, 0x2b, 0xfa,
+0x23, 0x95, 0x9c, 0x2f, 0x18, 0x45, 0x03,
+0xeb, 0x92, 0x9e, 0x0a, 0x46, 0xad, 0x01,
+0xc6, 0xea, 0xe1, 0xd3, 0xd8, 0x25, 0x50,
+0x1f, 0x8a, 0xb8, 0x19, 0xdb, 0x05, 0x17,
+0x74, 0x6d, 0x28, 0x1d, 0x8c, 0x4c, 0x29,
+0xde, 0xc2, 0x64, 0x96, 0x0a, 0x07, 0xf8,
+0xc5, 0xad, 0xcd, 0x5c, 0x1a, 0x92, 0x15,
+0x98, 0x83, 0xcb, 0xec, 0x4a, 0x84, 0x39,
+0x7a, 0xc0, 0xc7, 0xd8, 0x97, 0x79, 0xcc,
+0x6a, 0x9a, 0x4a, 0x3e, 0xfb, 0x4f, 0xd1,
+0x64, 0xd9, 0xf7, 0xb2, 0xc4, 0xcc, 0xd3,
+0x9c, 0x22, 0x55, 0xc3, 0xbc, 0xf8, 0xf8,
+0x2e, 0x35, 0x37, 0x05, 0x47, 0x43, 0x26,
+0x43, 0xb3, 0x96, 0x1c, 0xd4, 0x1a, 0xc7,
+0x2b, 0xdd, 0x5a, 0x9c, 0xb4, 0x58, 0x3a,
+0x9f, 0x24, 0x9d, 0x82, 0x31, 0x21, 0x43,
+0xa7, 0xc7, 0xb0, 0xe8, 0xf5, 0xf0, 0xd1,
+0xcd, 0x86, 0xe4, 0xf8, 0x98, 0x5e, 0x50,
+0x10, 0x87, 0xac, 0x79, 0x6f, 0x56, 0x3f,
+0xf6, 0x27, 0x87, 0x83, 0xa7, 0xc4, 0x45,
+0x10, 0x20, 0xca, 0x77, 0xca, 0x65, 0x04,
+0x6f, 0xd5, 0x54, 0x8f, 0xf8, 0xf3, 0x3c,
+0xd2, 0x4d, 0x6f, 0x46, 0xaa, 0xa8, 0x3d,
+0xb6, 0xdf, 0x24, 0xc3, 0xf8, 0xfe, 0x59,
+0x88, 0x47, 0x2c, 0x2d, 0xed, 0x76, 0x08,
+0x89, 0x55, 0x10, 0x42, 0xfc, 0xa4, 0x74,
+0x2b, 0xbf, 0x26, 0xe9, 0x9c, 0x52, 0x6b,
+0xa4, 0x3c, 0xad, 0x31, 0x76, 0x1d, 0x9f,
+0x09, 0xbf, 0xda, 0xde, 0xb1, 0x12, 0x3b,
+0xcb, 0x34, 0x6b, 0x44, 0x38, 0xf4, 0x80,
+0x12, 0xb8, 0x14, 0x05, 0x8e, 0xab, 0x62,
+0x47, 0x6a, 0xa8, 0xa4, 0x89, 0xfd, 0xf5,
+0x85, 0x8a, 0xea, 0x2c, 0x58, 0x3e, 0x95,
+0xe5, 0x6a, 0x6f, 0xd3, 0x63, 0x47, 0x3c,
+0xfb, 0xdb, 0x6c, 0x94, 0xb0, 0xcf, 0x97,
+0xdd, 0xfc, 0xde, 0xa9, 0x5e, 0x67, 0x49,
+0x37, 0x55, 0xe5, 0xd4, 0x25, 0xbc, 0x95,
+0x58, 0x9d, 0xf7, 0x08, 0x05, 0x34, 0x32,
+0xbf, 0x4f, 0xf1, 0xf5, 0x3a, 0x96, 0x7c,
+0xe5, 0xb7, 0xe3, 0x71, 0xac, 0x9e, 0x89,
+0xb6, 0x1c, 0xce, 0x7d, 0x10, 0x33, 0xc3,
+0x41, 0x5e, 0x9d, 0xa0, 0xff, 0x67, 0xcc,
+0xe6, 0xdb, 0x27, 0xa4, 0xe8, 0xe1, 0x80,
+0xf7, 0x67, 0x76, 0x42, 0xef, 0xd2, 0x48,
+0x65, 0x45, 0xd6, 0xea, 0x69, 0xd5, 0xb4,
+0x6f, 0xc7, 0x3c, 0xe7, 0xe3, 0x71, 0x88,
+0x23, 0x27, 0x77, 0x23, 0xb3, 0x65, 0x89,
+0x19, 0x52, 0x31, 0x7e, 0xe3, 0x78, 0x78,
+0xa5, 0x38, 0x4f, 0xff, 0x64, 0x18, 0x87,
+0x09, 0x5d, 0xc5, 0x82, 0x5f, 0xd4, 0xa4,
+0x28, 0x3a, 0x69, 0xb3, 0x80, 0xb1, 0x9f,
+0x04, 0xa1, 0x24, 0x9a, 0x6f, 0x15, 0xe2,
+0x09, 0xd6, 0xe2, 0xd3, 0xc5, 0x2b, 0x76,
+0xe6, 0xc9, 0x34, 0x84, 0xf0, 0xf5, 0xb5,
+0x50, 0xb9, 0xd9, 0x9a, 0xba, 0x2a, 0x7a,
+0xd6, 0xea, 0xec, 0x1a, 0xee, 0xbe, 0x5a,
+0x6b, 0x9e, 0xa7, 0x7a, 0x34, 0xe6, 0xf7,
+0xb7, 0x97, 0x57, 0xba, 0x6f, 0x56, 0xe8,
+0xc7, 0xc0, 0xa1, 0xfe, 0x5d, 0xf0, 0x0f,
+0x06, 0xf5, 0xbc, 0x4d, 0x68, 0x75, 0x39,
+0x3d, 0x93, 0x4e, 0x1f, 0xb7, 0xcd, 0xc6,
+0x3f, 0x5a, 0xf2, 0x71, 0xa3, 0x44, 0x5e,
+0x15, 0xd3, 0x84, 0x6c, 0xf8, 0xc8, 0xe8,
+0xb5, 0x31, 0xa3, 0x45, 0x58, 0xdd, 0xa6,
+0x63, 0x43, 0x73, 0xe2, 0x06, 0x52, 0x40,
+0x34, 0x0e, 0xb4, 0xea, 0x59, 0x5b, 0x9f,
+0xcb, 0xed, 0xd9, 0x41, 0x9d, 0xd4, 0x92,
+0x46, 0xa4, 0x47, 0x0a, 0x38, 0xde, 0x19,
+0xab, 0xdd, 0x98, 0x25, 0x2a, 0x46, 0xc9,
+0xb4, 0xb0, 0x15, 0xa2, 0xcf, 0x34, 0xff,
+0x82, 0x39, 0xa7, 0x17, 0xa3, 0x62, 0xe3,
+0xed, 0xa7, 0x7b, 0x62, 0x32, 0x0c, 0x46,
+0x96, 0xfd, 0x6c, 0x1b, 0x6d, 0x47, 0xb9,
+0x73, 0xb0, 0x65, 0x39, 0xea, 0x25, 0x71,
+0xd7, 0x77, 0x8a, 0x43, 0x58, 0x2b, 0x8c,
+0xa3, 0x1b, 0x72, 0x13, 0xf1, 0x27, 0x65,
+0x49, 0x7f, 0x05, 0x6e, 0x35, 0xab, 0x73,
+0xcb, 0x09, 0x49, 0x14, 0x1f, 0xf1, 0xa6,
+0x85, 0x8b, 0x61, 0x3a, 0xb7, 0xe0, 0x1d,
+0x87, 0xeb, 0x34, 0x44, 0xd8, 0xd4, 0x12,
+0x7b, 0x82, 0xa1, 0xb6, 0x77, 0x53, 0xd7,
+0x36, 0x39, 0x64, 0x49, 0xbd, 0xd1, 0xb4,
+0x3d, 0xea, 0x4d, 0x0b, 0x50, 0x5d, 0x0a,
+0x5d, 0x64, 0xa2, 0xac, 0x7d, 0x6c, 0x6a,
+0x2c, 0x01, 0x75, 0x04, 0xf8, 0x50, 0xfe,
+0x58, 0xb2, 0xe5, 0xaa, 0x7a, 0x30, 0x96,
+0x82, 0x98, 0x8b, 0x4c, 0xd5, 0x97, 0x5c,
+0xf8, 0xb6, 0xf0, 0x7d, 0xdd, 0xba, 0xdd,
+0xfd, 0xf2, 0xd6, 0xea, 0x6b, 0xbd, 0x9d,
+0xcd, 0x63, 0x33, 0x9b, 0x4f, 0xf2, 0x3c,
+0x3b, 0x17, 0x2e, 0x46, 0xbf, 0xaf, 0xc5,
+0x97, 0x32, 0x14, 0x34, 0x99, 0x94, 0xc9,
+0xa9, 0x10, 0x91, 0xe7, 0x51, 0x3b, 0x42,
+0x8d, 0x74, 0x8b, 0x57, 0x28, 0x20, 0x3f,
+0xd1, 0xdc, 0xf9, 0xd4, 0x0f, 0x87, 0x5b,
+0xd5, 0x2f, 0x74, 0x44, 0xc3, 0xc7, 0xbe,
+0xcd, 0x17, 0x0c, 0xbf, 0xe4, 0x62, 0xa1,
+0x43, 0x34, 0x17, 0x08, 0x46, 0x30, 0xa0,
+0x85, 0x20, 0xa8, 0xbb, 0xb4, 0x63, 0xd1,
+0x12, 0x09, 0xf6, 0xd6, 0x01, 0xa4, 0x25,
+0x74, 0xa8, 0xb9, 0x56, 0x82, 0xdb, 0x78,
+0xe8, 0x41, 0xbb, 0xc6, 0x18, 0xc5, 0x86,
+0xa3, 0xea, 0xbf, 0x90, 0x2c, 0xdd, 0x15,
+0xe0, 0x4a, 0x21, 0xd4, 0x42, 0x94, 0x94,
+0xf4, 0x48, 0x62, 0x97, 0x25, 0xc7, 0xcd,
+0x44, 0x88, 0x20, 0xd6, 0x05, 0x4b, 0x96,
+0x89, 0xd0, 0x3e, 0x0d, 0x9f, 0xa3, 0x24,
+0xf8, 0xf8, 0xb1, 0x44, 0xa9, 0x37, 0x55,
+0xdb, 0x2c, 0x51, 0xb8, 0x8c, 0x6b, 0x4e,
+0x36, 0xaa, 0xb9, 0x56, 0x0b, 0xda, 0x62,
+0x49, 0x97, 0xac, 0x9b, 0x62, 0xaa, 0x90,
+0x4e, 0xe3, 0xce, 0xa9, 0x04, 0x5f, 0x7f,
+0xcc, 0x3d, 0x97, 0xaf, 0x73, 0xb8, 0x4a,
+0x2f, 0xdc, 0x5b, 0xd8, 0x3a, 0xc3, 0xb4,
+0x98, 0x7a, 0x2b, 0xd5, 0x24, 0x6b, 0x50,
+0xe1, 0xbe, 0x1f, 0x24, 0x1d, 0xff, 0xb6,
+0xfb, 0x93, 0xe3, 0xb5, 0x06, 0x75, 0x07,
+0x64, 0xb1, 0xb0, 0x78, 0x0d, 0xf7, 0xa9,
+0x06, 0x1f, 0x9f, 0x80, 0x57, 0xb1, 0x25,
+0xca, 0xdb, 0x58, 0xc7, 0x79, 0xfd, 0x18,
+0xac, 0x71, 0xc2, 0x3b, 0x54, 0xd7, 0x38,
+0x49, 0x12, 0x30, 0x07, 0x6a, 0x0c, 0x52,
+0x2f, 0x63, 0xf8, 0x53, 0xe5, 0x9e, 0x66,
+0xaf, 0x6d, 0xe3, 0xc3, 0xbd, 0x1f, 0xf7,
+0x9b, 0x1f, 0x52, 0xb8, 0x9b, 0x8e, 0x63,
+0x4c, 0x95, 0xb4, 0x92, 0x7c, 0x7f, 0x23,
+0x76, 0x07, 0x3a, 0x48, 0xdc, 0x88, 0x4b,
+0x43, 0xf2, 0xea, 0x57, 0x07, 0xf6, 0xcc,
+0x8a, 0x9c, 0x0e, 0x7f, 0x9e, 0x75, 0x98,
+0xf5, 0x25, 0x9e, 0x19, 0x41, 0x4f, 0x5b,
+0xb1, 0x86, 0x94, 0x7a, 0x52, 0xf6, 0xdc,
+0x0f, 0x8f, 0x2f, 0x29, 0x52, 0x9f, 0x0a,
+0x50, 0x3a, 0xac, 0xe4, 0x59, 0xbb, 0x6d,
+0xae, 0x3a, 0x89, 0xf8, 0x5d, 0x9a, 0xd5,
+0x1f, 0x6b, 0x58, 0x1e, 0xc9, 0xe9, 0x1a,
+0xdf, 0x63, 0xd1, 0xea, 0xb6, 0x51, 0x10,
+0x91, 0xe2, 0x9c, 0xa0, 0x48, 0xc3, 0x39,
+0xa2, 0x80, 0xfc, 0x3f, 0x21, 0x74, 0xe5,
+0xd4, 0x4f, 0x83, 0x95, 0x09, 0x00, 0x82,
+0x59, 0x94, 0x78, 0xad, 0x63, 0x7f, 0x97,
+0xbf, 0x27, 0x7d, 0x93, 0x4f, 0x4f, 0x8e,
+0x98, 0x74, 0x76, 0xa1, 0x8a, 0x91, 0xb5,
+0x22, 0xf0, 0x81, 0x03, 0x53, 0xc9, 0xc0,
+0xd0, 0x5a, 0x30, 0xe5, 0x63, 0x66, 0x20,
+0x6a, 0x77, 0x4c, 0xa0, 0x13, 0xa7, 0x68,
+0xc8, 0x34, 0x95, 0x71, 0x26, 0x31, 0x02,
+0x7e, 0x26, 0x87, 0x5a, 0x2c, 0x8b, 0xd3,
+0x3b, 0x30, 0x94, 0xa6, 0x04, 0x03, 0xcd,
+0xbf, 0x4b, 0x53, 0x46, 0xe5, 0x37, 0xf1,
+0xa7, 0x16, 0xad, 0x23, 0x3a, 0x7f, 0x5d,
+0x43, 0x22, 0x5c, 0xdb, 0xfd, 0x6c, 0xd1,
+0x41, 0x69, 0xc1, 0x2a, 0x63, 0x6c, 0x02,
+0xe9, 0x9c, 0xa1, 0x26, 0xa6, 0x4a, 0xa5,
+0xe3, 0xd1, 0xd3, 0x75, 0x73, 0x0b, 0x6b,
+0x7c, 0x52, 0x84, 0x0d, 0x1e, 0x7c, 0xdc,
+0xb2, 0xf8, 0x61, 0x74, 0x83, 0x26, 0x91,
+0x59, 0xf2, 0x6d, 0x6f, 0x08, 0x0e, 0x31,
+0xd8, 0xc6, 0xdd, 0x4c, 0xb5, 0x4a, 0x16,
+0x62, 0x83, 0x21, 0xf2, 0x93, 0xe2, 0x4e,
+0x32, 0x22, 0x0b, 0x29, 0x79, 0xcc, 0x9f,
+0x7e, 0xaf, 0x39, 0x5f, 0x5f, 0x70, 0xf3,
+0x60, 0x3c, 0xc2, 0x52, 0x03, 0x4b, 0x7c,
+0xef, 0x98, 0x95, 0xd2, 0xb1, 0xf0, 0x33,
+0xdf, 0xa9, 0x82, 0x2e, 0x17, 0x9d, 0x89,
+0xe2, 0xa9, 0xd8, 0x61, 0x62, 0x30, 0x7b,
+0x1c, 0x07, 0x2b, 0xc3, 0xe1, 0x29, 0x80,
+0x4e, 0x36, 0x98, 0x14, 0x75, 0xed, 0xac,
+0xb3, 0x52, 0xbd, 0x6b, 0x19, 0x90, 0x8f,
+0xc4, 0xe4, 0x80, 0x2a, 0x86, 0xb4, 0x9c,
+0x8c, 0x83, 0x45, 0x6b, 0x3b, 0x03, 0x99,
+0xa7, 0xe8, 0x7b, 0x34, 0xda, 0x8a, 0x0c,
+0xc7, 0x1d, 0xcd, 0x31, 0x41, 0xe6, 0x44,
+0xd9, 0xcf, 0xea, 0x58, 0x2f, 0x0f, 0x56,
+0x6e, 0xe1, 0xc1, 0x8b, 0x53, 0xa6, 0xdb,
+0xf2, 0xad, 0x68, 0x13, 0x54, 0x43, 0xb5,
+0x2d, 0xb8, 0x0d, 0x77, 0xbd, 0x48, 0x2a,
+0x50, 0xe8, 0x47, 0xac, 0xbc, 0xb5, 0x15,
+0x58, 0x45, 0xa9, 0x6d, 0xfb, 0x62, 0x13,
+0xe1, 0x77, 0xb7, 0x21, 0x17, 0x18, 0x8a,
+0xd8, 0xf8, 0x96, 0xdb, 0xdf, 0x33, 0x92,
+0x0b, 0xea, 0x18, 0x66, 0x08, 0x28, 0x47,
+0xbd, 0xa1, 0xd7, 0x3b, 0x00, 0x50, 0x84,
+0xa0, 0xd6, 0xc9, 0xf9, 0x9a, 0x9e, 0x25,
+0xab, 0x43, 0x07, 0x4d, 0x89, 0x11, 0xe4,
+0xaf, 0x01, 0xf1, 0xf3, 0x2a, 0x42, 0xa8,
+0xbe, 0xea, 0xcd, 0x17, 0x5b, 0x99, 0x5d,
+0xdf, 0xf4, 0x2e, 0xe8, 0x1d, 0xee, 0x1b,
+0x3a, 0x91, 0x70, 0x50, 0x82, 0xa7, 0xb5,
+0x17, 0x7c, 0xe1, 0x35, 0x8b, 0xe4, 0x43,
+0x29, 0x8d, 0x52, 0xb9, 0x56, 0xba, 0x29,
+0x82, 0xc1, 0x2a, 0xfa, 0x70, 0x2b, 0x8f,
+0x42, 0xc2, 0x54, 0x61, 0xd2, 0xec, 0xe4,
+0x9c, 0x8a, 0xe3, 0x28, 0xa1, 0x88, 0x3d,
+0x96, 0xfd, 0x36, 0x64, 0x5e, 0x63, 0xa9,
+0xc8, 0x6c, 0x65, 0x69, 0x46, 0x74, 0x23,
+0x7a, 0x30, 0x08, 0xe3, 0x37, 0x01, 0xe8,
+0xe5, 0x2d, 0xed, 0xd9, 0xb9, 0x14, 0x53,
+0x76, 0x87, 0x0e, 0x9f, 0xf3, 0x36, 0xc4,
+0xec, 0xef, 0x3b, 0xee, 0xd2, 0x2d, 0x97,
+0x94, 0x1d, 0xe7, 0x94, 0xe7, 0xe0, 0xb3,
+0x03, 0x52, 0xb1, 0x65, 0xdd, 0x9e, 0xe3,
+0x44, 0xaf, 0xba, 0x77, 0x09, 0x1e, 0x70,
+0xc8, 0xc2, 0xc5, 0x32, 0x52, 0xcf, 0xa3,
+0x0b, 0x74, 0x50, 0xda, 0x9e, 0xfa, 0xa7,
+0x66, 0x02, 0x1d, 0xac, 0xd5, 0xc5, 0x0c,
+0x87, 0xbd, 0x48, 0xd5, 0x43, 0x8c, 0xbc,
+0xd7, 0x93, 0x54, 0x76, 0x9e, 0xbe, 0x99,
+0x24, 0x18, 0xb2, 0xc0, 0xcb, 0x51, 0x38,
+0x08, 0xd0, 0x2b, 0x72, 0x4b, 0xa5, 0xeb,
+0xc2, 0x3f, 0x08, 0x5e, 0x0a, 0x75, 0x0c,
+0x96, 0xdb, 0xe0, 0xf0, 0x40, 0x0d, 0x9d,
+0xf0, 0xcb, 0x20, 0x38, 0xf3, 0x7e, 0xce,
+0x5a, 0x73, 0x7e, 0x44, 0xc9, 0x20, 0x72,
+0xc5, 0xbf, 0x91, 0xc6, 0x93, 0x7d, 0x9f,
+0xde, 0x0f, 0x66, 0x90, 0xa6, 0x0b, 0x66,
+0x74, 0xc8, 0x71, 0x54, 0xc3, 0x42, 0xd8,
+0xa5, 0xe0, 0xba, 0xf1, 0x50, 0x1d, 0x39,
+0x33, 0x0b, 0xa1, 0x9d, 0xfa, 0xf7, 0xe7,
+0xa0, 0xf9, 0xf6, 0xe6, 0xb7, 0xe0, 0x20,
+0xe6, 0x95, 0xcc, 0xe1, 0x84, 0x9c, 0xce,
+0xab, 0x61, 0x14, 0xdc, 0xa6, 0x22, 0xda,
+0xf7, 0x14, 0xc5, 0x58, 0x90, 0x20, 0xa0,
+0x8b, 0x0b, 0x0f, 0xb3, 0x70, 0xcd, 0xbc,
+0xe0, 0xc9, 0xa5, 0x33, 0x1e, 0xfd, 0x94,
+0xe8, 0x7c, 0xe4, 0x0b, 0xc9, 0x65, 0x25,
+0xa1, 0xed, 0x44, 0x87, 0xb5, 0xb0, 0x23,
+0x85, 0xad, 0x67, 0xcb, 0xf4, 0x3b, 0xeb,
+0xd5, 0x6c, 0xfb, 0x9e, 0xe2, 0x3f, 0xed,
+0x99, 0x48, 0x99, 0xf4, 0xbe, 0x9a, 0x88,
+0x72, 0x82, 0x71, 0x6c, 0x07, 0x3b, 0x77,
+0x9b, 0xd7, 0xd9, 0xb1, 0x89, 0x0c, 0x62,
+0x07, 0x67, 0xeb, 0xca, 0x1d, 0xf4, 0x1b,
+0x39, 0x03, 0x7c, 0xd7, 0xf9, 0x07, 0x89,
+0xc1, 0x80, 0xca, 0xfd, 0xf2, 0x19, 0xa2,
+0x58, 0xef, 0x8f, 0xea, 0x93, 0x15, 0x4a,
+0xfd, 0x90, 0xe4, 0x37, 0xef, 0x3a, 0xa6,
+0x28, 0x09, 0x9d, 0x2b, 0xd2, 0x6b, 0xf8,
+0x95, 0xe1, 0xf7, 0x19, 0x22, 0x34, 0xd0,
+0xca, 0x8a, 0x05, 0x2d, 0x1f, 0x4d, 0x8a,
+0x02, 0x59, 0x8e, 0x06, 0x3b, 0x36, 0xd8,
+0x7d, 0x70, 0x52, 0xcd, 0x55, 0xd3, 0x94,
+0x5c, 0x7b, 0xb4, 0x84, 0x91, 0x29, 0x4b,
+0xb2, 0x86, 0xba, 0xdd, 0xc7, 0xb5, 0x48,
+0xd5, 0xde, 0x6f, 0x9c, 0x2c, 0xcf, 0xd8,
+0xd8, 0xcc, 0x34, 0xb0, 0x6a, 0x59, 0xc7,
+0x3e, 0x3d, 0xe7, 0xe6, 0x89, 0x98, 0x83,
+0xa4, 0x5d, 0xa9, 0x8d, 0x54, 0xa0, 0xb8,
+0x9a, 0x32, 0xe3, 0x49, 0xc0, 0x25, 0x4e,
+0x29, 0x1b, 0xb9, 0x49, 0x8b, 0x65, 0x16,
+0x1f, 0xaa, 0x90, 0xbf, 0x2a, 0x64, 0x0f,
+0x7a, 0x86, 0x57, 0x84, 0x47, 0xd6, 0x0e,
+0xf2, 0x52, 0xaa, 0xe2, 0x0a, 0xc9, 0xb3,
+0xdd, 0x5e, 0xda, 0xf1, 0xca, 0x81, 0x5c,
+0x11, 0xed, 0x03, 0xdc, 0xc6, 0xff, 0x82,
+0x8a, 0xa8, 0xac, 0x93, 0x9a, 0x77, 0xd7,
+0xdf, 0x22, 0x33, 0xf8, 0xb6, 0xf5, 0x04,
+0xb5, 0x25, 0x96, 0x1a, 0x78, 0x28, 0x75,
+0x75, 0xaf, 0xc7, 0xbf, 0x14, 0xe3, 0x48,
+0xb2, 0x55, 0x3a, 0xbf, 0x5d, 0x3d, 0x65,
+0x1e, 0x50, 0x74, 0x31, 0x4f, 0x2d, 0x2a,
+0x81, 0x91, 0x98, 0x91, 0xfb, 0x67, 0x5d,
+0xdb, 0x13, 0x5d, 0xaf, 0xdc, 0x90, 0x87,
+0x9d, 0x55, 0xb4, 0xbc, 0xa9, 0x3a, 0x73,
+0xca, 0x2e, 0x22, 0xad, 0x64, 0xb2, 0xdf,
+0x61, 0xbe, 0x85, 0x3b, 0xee, 0x50, 0xda,
+0x90, 0x80, 0xb4, 0xaf, 0x13, 0xcb, 0xb6,
+0x5c, 0xd0, 0x68, 0xc2, 0x21, 0x8e, 0x26,
+0x34, 0xd1, 0x6f, 0xf6, 0xe2, 0x3e, 0x25,
+0xdd, 0x38, 0x3e, 0xc7, 0xa4, 0x8f, 0x95,
+0xb6, 0xc9, 0x1d, 0xe4, 0xc7, 0x46, 0x59,
+0x9e, 0xf8, 0x46, 0xcd, 0x60, 0x59, 0x66,
+0x0c, 0x7c, 0xf8, 0xe3, 0x61, 0xd4, 0x3f,
+0xcd, 0x5d, 0xf7, 0xb9, 0x7c, 0x7d, 0x44,
+0x1a, 0x86, 0x58, 0x62, 0xfd, 0x0b, 0x7c,
+0x42, 0x78, 0x4e, 0x20, 0xe0, 0x81, 0x74,
+0x15, 0xe4, 0xb9, 0x45, 0x85, 0x5f, 0x22,
+0x79, 0x05, 0x4d, 0x35, 0xbb, 0x4b, 0xd7,
+0x04, 0x55, 0xf9, 0x3f, 0x72, 0xb5, 0xfa,
+0x2f, 0xbb, 0xcf, 0xce, 0xb6, 0x39, 0x2e,
+0xf6, 0xbe, 0x76, 0x77, 0x34, 0x72, 0xc2,
+0x1d, 0x38, 0x31, 0x25, 0x45, 0x74, 0x95,
+0x5f, 0x0c, 0x94, 0xcf, 0xa8, 0xc9, 0xbe,
+0xcf, 0xb1, 0x7d, 0xf4, 0x55, 0xa4, 0x5e,
+0xc0, 0xae, 0x03, 0x91, 0x98, 0x6e, 0x29,
+0x56, 0xbb, 0xa3, 0xb2, 0xea, 0x45, 0xfb,
+0xcb, 0x45, 0x33, 0x84, 0x0c, 0x14, 0x2d,
+0x9d, 0x09, 0x72, 0x4f, 0x01, 0x58, 0x86,
+0x07, 0x83, 0x3e, 0xfc, 0xa5, 0x89, 0x4e,
+0xa7, 0xe4, 0xfd, 0x5e, 0x61, 0x47, 0x98,
+0xa8, 0xec, 0x05, 0xdc, 0xe4, 0x92, 0x85,
+0x5f, 0x53, 0xa5, 0xeb, 0x5f, 0x06, 0x46,
+0x23, 0xfd, 0xad, 0x25, 0x9c, 0xd4, 0xe5,
+0xbe, 0x8c, 0x74, 0x5f, 0xc6, 0xbe, 0x62,
+0x81, 0x13, 0xb5, 0xa0, 0x71, 0x90, 0x71,
+0x56, 0x0b, 0x35, 0xef, 0x12, 0x9c, 0x8e,
+0x45, 0xdf, 0xd8, 0x89, 0xbe, 0x35, 0x92,
+0x2b, 0x46, 0x9e, 0xab, 0x62, 0x74, 0x0d,
+0xa7, 0x51, 0x1b, 0x75, 0x4e, 0x67, 0x84,
+0xa8, 0xc2, 0x06, 0x00, 0xc9, 0x6a, 0xdd,
+0xa7, 0x17, 0xc6, 0xb0, 0xf1, 0x24, 0xcd,
+0x42, 0x7a, 0xbe, 0x4f, 0x24, 0xa2, 0x3e,
+0xf7, 0x54, 0x5b, 0xba, 0xd3, 0xfc, 0xc8,
+0x4d, 0x37, 0x8f, 0xc5, 0x6f, 0x96, 0xd8,
+0x2e, 0xab, 0x66, 0xfa, 0xba, 0x64, 0xbe,
+0xce, 0x02, 0x43, 0x7e, 0x1f, 0x67, 0xbe,
+0x60, 0x26, 0xa3, 0xb8, 0xa8, 0xb0, 0x89,
+0xca, 0xd3, 0x92, 0x1f, 0xbb, 0xf8, 0x6a,
+0xcb, 0xb3, 0x65, 0x44, 0x9e, 0x8b, 0xaa,
+0x94, 0x77, 0x68, 0x1b, 0x38, 0xa1, 0x41,
+0x9f, 0x54, 0xae, 0xd4, 0x4e, 0x61, 0x71,
+0x8e, 0x78, 0x59, 0x93, 0x9c, 0xc5, 0x00,
+0xa6, 0xd1, 0x0c, 0x69, 0x09, 0xbe, 0x59,
+0x7c, 0xd7, 0x82, 0x30, 0x8b, 0xa2, 0x4a,
+0x5c, 0x91, 0x8d, 0xe8, 0x6d, 0x8d, 0xe0,
+0x77, 0x14, 0x91, 0x12, 0x4f, 0xda, 0x0d,
+0x0e, 0x7d, 0x9e, 0xdf, 0x1a, 0x24, 0x48,
+0x01, 0x47, 0x67, 0xba, 0x5a, 0x03, 0xec,
+0x71, 0xa6, 0xde, 0x85, 0x86, 0xff, 0x0f,
+0xbc, 0x6e, 0xc6, 0x1b, 0x13, 0xf3, 0x92,
+0x7f, 0x38, 0x67, 0x61, 0x92, 0xfa, 0x6d,
+0xe8, 0x43, 0x89, 0x75, 0x2d, 0xd5, 0xa9,
+0xda, 0x44, 0x74, 0x43, 0xbd, 0xee, 0x16,
+0x76, 0xa0, 0xc4, 0x42, 0xed, 0x77, 0xe2,
+0x9b, 0x59, 0x11, 0x73, 0x16, 0x11, 0x1d,
+0x36, 0xfc, 0x1c, 0xfd, 0x4b, 0xd3, 0x03,
+0xa5, 0xad, 0xca, 0x9e, 0x9f, 0x92, 0x5d,
+0x42, 0xb5, 0x62, 0xae, 0xdd, 0xfe, 0x7a,
+0x1b, 0xf4, 0x6c, 0xc1, 0xc0, 0xf9, 0x56,
+0x1b, 0xad, 0xe5, 0xc6, 0xf2, 0xfe, 0x44,
+0x5d, 0x5d, 0x16, 0x15, 0x5e, 0xe3, 0xdf,
+0x30, 0x21, 0x13, 0x7b, 0x3d, 0x84, 0x09,
+0x8c, 0x1c, 0x59, 0xa5, 0x22, 0x56, 0x28,
+0xa6, 0xac, 0x36, 0xf1, 0x9f, 0x76, 0x21,
+0x42, 0xc6, 0xf7, 0xb3, 0x12, 0xd6, 0x63,
+0x2c, 0x89, 0xf3, 0x96, 0xf8, 0x9f, 0x66,
+0xf2, 0x5c, 0xc8, 0x08, 0x59, 0xdd, 0x7e,
+0x79, 0xde, 0x0d, 0x3c, 0x41, 0xa9, 0x7e,
+0xcc, 0xc1, 0x35, 0x6c, 0x60, 0x65, 0x02,
+0xdc, 0xd1, 0x9e, 0x71, 0xc0, 0x99, 0x1e,
+0x77, 0x63, 0x18, 0xa6, 0x42, 0x6a, 0x23,
+0x51, 0x9c, 0xc3, 0xd3, 0xfd, 0x0f, 0x6b,
+0xc9, 0x88, 0xb5, 0x7e, 0x7a, 0x9c, 0xf6,
+0xd5, 0xdc, 0x53, 0xdb, 0x2e, 0x42, 0xdb,
+0xd7, 0xcf, 0xe0, 0x8b, 0x80, 0x3f, 0x70,
+0x53, 0x1e, 0xf5, 0x89, 0x6c, 0xa4, 0x23,
+0x6e, 0x48, 0x5e, 0xd8, 0x34, 0xac, 0xf4,
+0x69, 0x6b, 0x29, 0x45, 0x7d, 0xee, 0xbc,
+0x90, 0xe7, 0x00, 0x99, 0xe1, 0x75, 0x4c,
+0xe6, 0x42, 0x3f, 0xda, 0xc1, 0xe9, 0x26,
+0x73, 0x38, 0xe7, 0xe9, 0x73, 0x2e, 0x94,
+0x9b, 0xc4, 0xcf, 0xa6, 0x09, 0x9d, 0x46,
+0xcb, 0x71, 0x75, 0x42, 0x85, 0xba, 0xdf,
+0x94, 0xb4, 0x3c, 0xff, 0xcb, 0x57, 0x27,
+0xd2, 0x7c, 0xec, 0xd5, 0x24, 0x8c, 0xa6,
+0x5a, 0x04, 0x5d, 0x98, 0x65, 0x57, 0x1c,
+0xcb, 0x11, 0x1e, 0xfa, 0xe4, 0xfc, 0x53,
+0xb3, 0x4b, 0x62, 0x10, 0xb7, 0x64, 0xf0,
+0x54, 0x1a, 0x39, 0xf7, 0xcc, 0x15, 0x03,
+0x8d, 0xf6, 0xaf, 0x34, 0x05, 0x44, 0xaa,
+0xa8, 0xe7, 0x51, 0xe0, 0x0a, 0xe9, 0xaa,
+0xc6, 0x85, 0x5f, 0x73, 0x8e, 0xa6, 0xd4,
+0xe6, 0x5d, 0x45, 0xab, 0x7d, 0xbf, 0x6f,
+0x0b, 0xf9, 0x52, 0x17, 0x32, 0x54, 0x43,
+0x29, 0x1b, 0x97, 0x6a, 0x6c, 0x68, 0x77,
+0x31, 0x76, 0x72, 0x27, 0x04, 0x40, 0x16,
+0x41, 0xb1, 0xfa, 0xc9, 0xb9, 0xa7, 0xaf,
+0xce, 0xf4, 0xe5, 0x70, 0x19, 0x55, 0x19,
+0xf2, 0x53, 0x19, 0x2d, 0x6f, 0x3f, 0x10,
+0x81, 0xc4, 0x6c, 0xa6, 0x42, 0xa5, 0x86,
+0x48, 0xce, 0x94, 0xd4, 0x3f, 0xcd, 0xc6,
+0x87, 0x3d, 0xa9, 0x7c, 0xcb, 0x68, 0x30,
+0x0d, 0xb1, 0x8f, 0x15, 0xb6, 0xeb, 0x67,
+0x9e, 0x03, 0x25, 0x2d, 0x27, 0x8c, 0xf2,
+0xf5, 0x22, 0x75, 0xbb, 0x8d, 0x27, 0x43,
+0xd6, 0xc2, 0x84, 0x28, 0x63, 0x95, 0x4d,
+0x13, 0x42, 0x80, 0x0a, 0x69, 0xaa, 0xef,
+0xa2, 0x79, 0x56, 0xb9, 0x9f, 0x35, 0x75,
+0x67, 0xaf, 0x13, 0x84, 0x68, 0xcb, 0xf5,
+0x1f, 0x35, 0x6f, 0xe1, 0x45, 0x9b, 0x22,
+0x69, 0x0a, 0x8f, 0x90, 0x7d, 0x37, 0x8e,
+0x7e, 0xaa, 0x8e, 0xef, 0x25, 0x22, 0xf5,
+0xe2, 0xa6, 0x69, 0xfb, 0xcd, 0xab, 0x02,
+0xfe, 0xcc, 0x09, 0xc1, 0x59, 0x6c, 0x4b,
+0xc4, 0xb9, 0xf0, 0xa1, 0x25, 0x3a, 0xec,
+0x58, 0x76, 0xa4, 0xec, 0x27, 0x86, 0x05,
+0xf3, 0x3e, 0x02, 0x05, 0x47, 0xfa, 0xb4,
+0xf0, 0xde, 0xd3, 0xd1, 0x2a, 0x88, 0xf4,
+0x47, 0x35, 0xd6, 0xba, 0x59, 0xe4, 0x7e,
+0x42, 0x3c, 0x77, 0x1e, 0xf6, 0x00, 0xc4,
+0x7c, 0x2c, 0x2e, 0x60, 0xdd, 0x5d, 0xcf,
+0xc4, 0x25, 0x1f, 0x5d, 0x37, 0xf2, 0x37,
+0x63, 0x7b, 0x88, 0x84, 0x64, 0x06, 0x07,
+0xfa, 0x90, 0x66, 0x9b, 0x9a, 0x3e, 0x5a,
+0x1f, 0x91, 0x62, 0xaf, 0x4d, 0xcb, 0x24,
+0x39, 0x7f, 0x9e, 0x57, 0xf8, 0xc1, 0x97,
+0xb9, 0x2e,
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test1.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test1.inc
new file mode 100644
index 0000000..ee582e3
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test1.inc
@@ -0,0 +1,74 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "test1"
+ * Basename: None (random base)
+ * SigRl: Empty
+ */
+ 0xF7, 0xEE, 0x2C, 0x94, 0x30, 0x89, 0xA3, 0x9D, 0x6F, 0x1B, 0xF4,
+ 0xC9, 0xEA, 0xFA, 0x17, 0xF0, 0x01, 0x3F, 0x48, 0xA0, 0x90, 0xB9,
+ 0x73, 0xA6, 0x52, 0xC4, 0xF0, 0xDD, 0xDD, 0xFF, 0xFC, 0x72,
+
+ 0x15, 0x08, 0x6C, 0x6B, 0xE7, 0x8B, 0xFE, 0x27, 0x7B, 0x51, 0x39,
+ 0x7D, 0xE1, 0xB2, 0x2A, 0x17, 0xDF, 0x80, 0xF5, 0xC9, 0x55, 0x6A,
+ 0x30, 0xF2, 0xA9, 0xE7, 0x0E, 0xF9, 0x4F, 0x50, 0x32, 0xDB,
+
+ 0xE0, 0x46, 0xF9, 0xFA, 0x48, 0xD1, 0xE9, 0xA4, 0x6E, 0xC1, 0x47,
+ 0xDE, 0x95, 0xD6, 0x03, 0x0B, 0x92, 0x38, 0xD2, 0x86, 0xE0, 0x0E,
+ 0x97, 0x9C, 0x4B, 0x74, 0x9E, 0x3E, 0xCE, 0x08, 0xA3, 0x97,
+
+ 0xEB, 0x08, 0x67, 0x0F, 0x88, 0x9C, 0xB3, 0xCE, 0x5B, 0x13, 0x45,
+ 0x97, 0xFA, 0xA5, 0xE8, 0xC9, 0xEF, 0xEA, 0xD5, 0xFC, 0x4D, 0xE2,
+ 0x33, 0xC8, 0x43, 0x90, 0x40, 0x13, 0xFC, 0xA5, 0x7B, 0xDF,
+
+ 0xA6, 0x1F, 0xE5, 0x33, 0x84, 0x9B, 0x59, 0x7B, 0x34, 0x13, 0x8E,
+ 0x87, 0x78, 0x53, 0xC2, 0x50, 0x83, 0x81, 0x8B, 0xE2, 0x16, 0x52,
+ 0x22, 0x89, 0x9C, 0xA6, 0xDA, 0xF5, 0x04, 0x4B, 0x76, 0x64,
+
+ 0xBB, 0xBB, 0x2E, 0x80, 0x00, 0x80, 0xF0, 0xBF, 0x3F, 0xC0, 0x1A,
+ 0x8F, 0x6A, 0x76, 0xBB, 0x91, 0x36, 0xC7, 0x3B, 0x35, 0xFE, 0x1C,
+ 0x3E, 0x2A, 0x77, 0x11, 0xE4, 0x43, 0xBB, 0x98, 0xBF, 0xB4,
+
+ 0xA1, 0x3F, 0xEA, 0x99, 0x7E, 0xC7, 0x65, 0xF5, 0x41, 0xA6, 0xD6,
+ 0xD3, 0x77, 0xEC, 0x27, 0xF8, 0x6C, 0x18, 0x28, 0x69, 0x97, 0x08,
+ 0x0E, 0x63, 0x5A, 0xDA, 0xFE, 0x9F, 0xD1, 0x4A, 0x61, 0x4F,
+
+ 0xE2, 0x21, 0xD1, 0xBC, 0x14, 0x8A, 0xCB, 0xF5, 0xB4, 0xE0, 0x24,
+ 0xB8, 0xB7, 0x6B, 0xDD, 0x2A, 0xC5, 0xF8, 0x10, 0x3B, 0xD3, 0x77,
+ 0xC8, 0x8B, 0x19, 0xBF, 0x5E, 0xFB, 0x2B, 0xB1, 0xC9, 0xE1,
+
+ 0x14, 0x92, 0xD1, 0x1F, 0xAC, 0x90, 0x4D, 0xC3, 0x3E, 0xB8, 0xA7,
+ 0xFE, 0x35, 0x98, 0xDA, 0x94, 0xD6, 0xF3, 0x27, 0x29, 0x4B, 0x70,
+ 0xCF, 0x0F, 0xDA, 0x14, 0x97, 0xA1, 0x9B, 0x6B, 0x24, 0x08,
+
+ 0x50, 0x38, 0x60, 0x31, 0xAB, 0x05, 0xCC, 0xB1, 0xC2, 0x06, 0xA0,
+ 0xD7, 0x92, 0x12, 0xBD, 0x17, 0x81, 0xB9, 0x7E, 0x07, 0x9B, 0xD4,
+ 0x3B, 0x2D, 0x3C, 0x15, 0x3A, 0x5A, 0xF1, 0xC0, 0xC4, 0x75,
+
+ 0x76, 0x8D, 0xE5, 0xC2, 0xAB, 0x78, 0xD9, 0x76, 0x98, 0xFF, 0x92,
+ 0xEA, 0x95, 0x58, 0xC5, 0x0C, 0x6F, 0x1B, 0x35, 0xC4, 0xBF, 0x4A,
+ 0x9E, 0xC2, 0x6A, 0xEC, 0xE2, 0xF6, 0xAF, 0xEB, 0xAC, 0x06,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test1_basename1_sha256.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test1_basename1_sha256.inc
new file mode 100644
index 0000000..9d2680f
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test1_basename1_sha256.inc
@@ -0,0 +1,85 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "test1"
+ * Basename: "basename1"
+ * SigRl: Empty
+ */
+ 0xa6, 0x13, 0x29, 0xb6, 0x61, 0xa2, 0xb8, 0xd7,
+ 0x49, 0x86, 0xcb, 0xaf, 0x94, 0x4d, 0x9e, 0x51,
+ 0xcf, 0xd3, 0x5d, 0x0f, 0x33, 0x9a, 0x59, 0x0d,
+ 0xe7, 0xc9, 0xb9, 0x7f, 0x83, 0xae, 0x27, 0xe6,
+
+ 0x40, 0xf0, 0x88, 0x13, 0xe2, 0xb6, 0x6a, 0x43,
+ 0x26, 0xa3, 0x21, 0xea, 0x00, 0x78, 0xcd, 0xce,
+ 0x0e, 0x14, 0x7a, 0xde, 0xcf, 0xaa, 0x7b, 0xc5,
+ 0x7e, 0x7c, 0xaf, 0xe4, 0x5e, 0x8a, 0xdd, 0xc7,
+
+ 0x0b, 0x5e, 0x4e, 0xc6, 0x94, 0xf0, 0xef, 0xf3,
+ 0xbe, 0xd6, 0x12, 0x28, 0x01, 0xa5, 0xf0, 0x4d,
+ 0xcc, 0xbe, 0xeb, 0x0e, 0xb9, 0xa1, 0x39, 0x4a,
+ 0x7e, 0xb3, 0x46, 0x74, 0xc3, 0xb1, 0xdf, 0x91,
+
+ 0x74, 0x3b, 0xa1, 0x5b, 0x29, 0xae, 0x57, 0xf1,
+ 0x9d, 0xfa, 0xda, 0x57, 0x06, 0x90, 0x4a, 0xa6,
+ 0x30, 0x16, 0x1a, 0xe9, 0x47, 0xad, 0xd1, 0xc2,
+ 0xda, 0x8d, 0xbb, 0x5b, 0x46, 0x17, 0x48, 0x58,
+
+ 0x2d, 0xd2, 0x44, 0xc4, 0x7e, 0xd7, 0xb2, 0x73,
+ 0x91, 0x8c, 0xb2, 0xa7, 0xff, 0xb0, 0xd3, 0xab,
+ 0x6f, 0x10, 0x14, 0xeb, 0x30, 0x33, 0x90, 0x14,
+ 0x5b, 0x3b, 0x83, 0x6c, 0xe1, 0xa5, 0x0f, 0x8b,
+
+ 0x6f, 0x9f, 0xf1, 0x1a, 0xbe, 0xc3, 0x75, 0xd2,
+ 0x0b, 0xb9, 0xa1, 0x1a, 0x2b, 0x01, 0x86, 0xc3,
+ 0xc2, 0xf8, 0xd7, 0x14, 0x1d, 0xc1, 0x8b, 0x97,
+ 0x0c, 0x20, 0xce, 0xce, 0xf4, 0x9a, 0xee, 0xc9,
+
+ 0x77, 0x3b, 0x42, 0x0d, 0xe4, 0x87, 0xb2, 0x4a,
+ 0x44, 0x4e, 0x3e, 0xed, 0x39, 0xaa, 0xad, 0xe4,
+ 0xe8, 0x4d, 0xa3, 0x5d, 0x6f, 0xa4, 0xb7, 0x22,
+ 0x32, 0xae, 0xa5, 0xfb, 0x85, 0x71, 0x42, 0xc7,
+
+ 0x02, 0x70, 0xa1, 0xae, 0x70, 0x4f, 0xfe, 0xfc,
+ 0x1e, 0x52, 0x0f, 0xc0, 0xbe, 0x0a, 0xaf, 0xbc,
+ 0x1a, 0x4a, 0xd6, 0x25, 0x91, 0x1f, 0xca, 0x0d,
+ 0x83, 0x89, 0x18, 0xd3, 0xbd, 0x35, 0xbd, 0x58,
+
+ 0x5d, 0xda, 0x73, 0x4f, 0x82, 0xa4, 0xdc, 0x58,
+ 0x9a, 0x66, 0x02, 0x16, 0xa0, 0x85, 0x77, 0x8f,
+ 0x38, 0x84, 0x68, 0xcf, 0x08, 0xcd, 0x88, 0x7f,
+ 0x75, 0xe5, 0x6c, 0x16, 0x96, 0xd1, 0x0b, 0xea,
+
+ 0x97, 0x74, 0xaa, 0x93, 0xcb, 0xe6, 0x6c, 0xab,
+ 0x9f, 0x62, 0x68, 0x8a, 0x07, 0x93, 0x5c, 0x67,
+ 0xb3, 0xa8, 0x7a, 0x5a, 0x1c, 0xc3, 0xc3, 0xbe,
+ 0x44, 0x73, 0x79, 0x65, 0xa5, 0x5a, 0x62, 0x9e,
+
+ 0xc1, 0x52, 0xd9, 0xd1, 0xb2, 0x40, 0x0f, 0x95,
+ 0x4e, 0x53, 0x95, 0xc0, 0x3e, 0x5b, 0xba, 0x5f,
+ 0x54, 0x25, 0x05, 0xde, 0xea, 0x5a, 0x4c, 0xa1,
+ 0x25, 0xa6, 0x2c, 0x05, 0x0c, 0x79, 0x53, 0x15,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc
new file mode 100644
index 0000000..b14d518
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc
@@ -0,0 +1,85 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "test1"
+ * Basename: None (random base)
+ * SigRl: Empty
+ */
+ 0x04, 0x16, 0x79, 0x8e, 0xf9, 0xff, 0x2b, 0xc3,
+ 0x63, 0x0a, 0x40, 0x68, 0x87, 0x4a, 0x5b, 0xb5,
+ 0xba, 0x0f, 0xe4, 0x23, 0x05, 0xca, 0xd1, 0xf8,
+ 0x4e, 0xa6, 0x40, 0x18, 0xed, 0xb5, 0xb3, 0x0d,
+
+ 0x16, 0x58, 0x87, 0x51, 0xd1, 0x83, 0xb6, 0x9a,
+ 0x41, 0x03, 0xd9, 0xdc, 0xb3, 0xca, 0xc7, 0x0e,
+ 0xbe, 0xbc, 0xf5, 0xc7, 0x31, 0xe3, 0x8d, 0x0b,
+ 0x14, 0x0c, 0xe4, 0x2d, 0x2b, 0xcb, 0x3c, 0xf5,
+
+ 0xc0, 0x23, 0x82, 0xe0, 0x69, 0xe7, 0x41, 0x78,
+ 0x7f, 0x50, 0xc6, 0x61, 0x5c, 0x1b, 0x07, 0x3a,
+ 0xf6, 0x83, 0xbc, 0xb0, 0x46, 0xae, 0x5c, 0x4f,
+ 0x13, 0xf3, 0xef, 0x0c, 0xe6, 0x24, 0xe5, 0xdf,
+
+ 0x5e, 0x62, 0xa1, 0x09, 0x1a, 0xe3, 0xa1, 0xda,
+ 0x72, 0x34, 0x51, 0x18, 0xbc, 0x91, 0x7d, 0x11,
+ 0x0d, 0x4d, 0x9a, 0xd9, 0x47, 0x40, 0x69, 0xbf,
+ 0xc6, 0xaf, 0x06, 0xb2, 0xf6, 0xee, 0x76, 0xde,
+
+ 0x1f, 0xb6, 0xb9, 0x55, 0xab, 0xe7, 0x7b, 0xb1,
+ 0xe7, 0x9e, 0xaf, 0xe4, 0x60, 0x9f, 0x6d, 0x1b,
+ 0xd9, 0xc8, 0xee, 0xcc, 0x49, 0xea, 0x52, 0x41,
+ 0x26, 0x06, 0x0b, 0x75, 0x13, 0x63, 0x4a, 0x15,
+
+ 0x18, 0x50, 0xb4, 0x49, 0x35, 0xf8, 0xc7, 0xf7,
+ 0x77, 0xc3, 0xa7, 0x69, 0xc3, 0xb3, 0xaa, 0x19,
+ 0xc1, 0x57, 0x21, 0x44, 0x00, 0x95, 0x99, 0xef,
+ 0x09, 0xbe, 0x9b, 0xc5, 0x82, 0xbd, 0x3b, 0xc2,
+
+ 0x0d, 0x85, 0xbb, 0x4a, 0x12, 0x0f, 0xd0, 0xfc,
+ 0x2d, 0x66, 0x8f, 0xda, 0x79, 0xb4, 0x28, 0x8e,
+ 0x3c, 0x74, 0xa8, 0xf8, 0x55, 0xe4, 0x6d, 0xc6,
+ 0x67, 0xa2, 0x7d, 0x1c, 0xfa, 0xcb, 0x59, 0x2d,
+
+ 0x41, 0x4c, 0xd6, 0x9b, 0x89, 0xd3, 0xef, 0x3b,
+ 0x87, 0xae, 0x3c, 0x11, 0x6b, 0xc6, 0x6c, 0xab,
+ 0xe0, 0x9b, 0x68, 0x89, 0xa5, 0xcb, 0x9f, 0x87,
+ 0x49, 0x9f, 0xe6, 0x6b, 0xf7, 0xbb, 0x11, 0x70,
+
+ 0x13, 0xee, 0x94, 0x8e, 0x35, 0x6a, 0xa5, 0x0c,
+ 0x8f, 0x71, 0x16, 0x65, 0xe4, 0x83, 0x8b, 0x15,
+ 0xc9, 0xa7, 0x27, 0x0c, 0x07, 0x86, 0x6c, 0x8b,
+ 0x5f, 0x4f, 0x69, 0xf3, 0x12, 0x7e, 0x4b, 0x27,
+
+ 0x5c, 0x0f, 0x22, 0x26, 0xe4, 0x4a, 0x96, 0xe7,
+ 0x5b, 0x5a, 0xaf, 0x9e, 0xb4, 0xc8, 0xc5, 0x5e,
+ 0x12, 0xa7, 0x66, 0x50, 0xe4, 0x2a, 0x24, 0xb4,
+ 0x06, 0x93, 0x80, 0x1b, 0x39, 0xc2, 0x07, 0x20,
+
+ 0x32, 0x82, 0xe5, 0xde, 0x81, 0xb6, 0x7c, 0x3a,
+ 0x55, 0x88, 0xa8, 0x4f, 0x12, 0xdb, 0xd4, 0x0c,
+ 0x75, 0x02, 0x9d, 0xdb, 0x0b, 0x8b, 0xf7, 0xc8,
+ 0x7e, 0xbc, 0x34, 0x66, 0x5e, 0x9a, 0xb2, 0x8f,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc
new file mode 100644
index 0000000..6191f5d
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc
@@ -0,0 +1,85 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha384
+ * Message: "test1"
+ * Basename: None (random base)
+ * SigRl: Empty
+ */
+ 0x79, 0xb5, 0x73, 0xf5, 0xb2, 0x63, 0x6e, 0x0c,
+ 0xbb, 0x99, 0x14, 0xa8, 0x86, 0xbf, 0x23, 0xd6,
+ 0xc8, 0x03, 0x5f, 0x5e, 0x0b, 0xd9, 0xc6, 0x74,
+ 0x23, 0xc0, 0x4d, 0x0d, 0xa3, 0xdf, 0x88, 0x17,
+
+ 0x67, 0x31, 0x05, 0xb8, 0x29, 0x9e, 0x58, 0x06,
+ 0xaa, 0x1f, 0xf1, 0x9f, 0xe7, 0x65, 0x7a, 0xda,
+ 0x9a, 0x45, 0x93, 0x27, 0xb2, 0x61, 0x51, 0x94,
+ 0xa4, 0x8c, 0x4a, 0x4e, 0xcd, 0xf4, 0x5c, 0x7c,
+
+ 0xf7, 0xa4, 0x67, 0x40, 0x4e, 0xf4, 0x20, 0x90,
+ 0x77, 0x91, 0x37, 0x09, 0xfe, 0xe7, 0x4b, 0x9e,
+ 0x2e, 0xa9, 0x80, 0xfe, 0xda, 0x19, 0x4c, 0xe0,
+ 0x29, 0xab, 0x8e, 0xa8, 0x60, 0x59, 0x8b, 0x8e,
+
+ 0xe1, 0x11, 0x52, 0x83, 0xdb, 0xbb, 0xff, 0x1b,
+ 0xc6, 0x94, 0xc2, 0xc9, 0xc9, 0x3d, 0x1f, 0xd9,
+ 0x3b, 0x9a, 0x14, 0x0c, 0x5e, 0x98, 0xae, 0x66,
+ 0x2a, 0xe1, 0x75, 0xd7, 0x19, 0x08, 0x5f, 0xf5,
+
+ 0x01, 0xed, 0x5f, 0x18, 0xc1, 0x7e, 0xde, 0xb6,
+ 0x4f, 0x9c, 0xb2, 0xe7, 0x21, 0xeb, 0x94, 0xdc,
+ 0xaf, 0x2c, 0xf1, 0x4a, 0xef, 0x98, 0x9a, 0x8c,
+ 0x8d, 0xb2, 0xb5, 0x72, 0xab, 0x31, 0xf5, 0x10,
+
+ 0xe5, 0x9c, 0x32, 0x35, 0xa7, 0x41, 0x56, 0x71,
+ 0xc2, 0x16, 0xcd, 0x05, 0x68, 0x2e, 0xc6, 0x00,
+ 0xc9, 0x3b, 0x0d, 0x43, 0x04, 0x7a, 0x6c, 0x32,
+ 0x96, 0x44, 0xeb, 0x75, 0xb2, 0xd9, 0xd5, 0xb1,
+
+ 0x28, 0x91, 0x45, 0x6c, 0x28, 0x85, 0xae, 0x68,
+ 0xb0, 0xa6, 0x5e, 0x35, 0x1b, 0x46, 0xcf, 0x86,
+ 0x7a, 0xd1, 0x3a, 0xf0, 0xc6, 0x6c, 0x4a, 0x07,
+ 0x7a, 0xcb, 0x40, 0x90, 0x55, 0xb7, 0xdc, 0x63,
+
+ 0xa9, 0x58, 0xae, 0x04, 0xe7, 0x65, 0x63, 0x4a,
+ 0x94, 0xcc, 0x32, 0x6f, 0xe3, 0xef, 0xac, 0x41,
+ 0x09, 0x1b, 0x06, 0x55, 0x27, 0x3a, 0x26, 0x87,
+ 0xb7, 0x4a, 0x1d, 0x76, 0x27, 0x2c, 0xab, 0x8a,
+
+ 0x18, 0x64, 0x25, 0x70, 0x8b, 0x4f, 0xab, 0x0f,
+ 0x4b, 0x20, 0x14, 0xbf, 0x25, 0x49, 0xcc, 0x98,
+ 0xbd, 0x2d, 0xee, 0x33, 0x90, 0xd8, 0x37, 0x12,
+ 0x15, 0x7e, 0x0e, 0x39, 0x5e, 0xf1, 0x0f, 0xbd,
+
+ 0xaf, 0x38, 0xb3, 0x0b, 0x9d, 0x98, 0x28, 0xa0,
+ 0xc3, 0x3f, 0x70, 0xc8, 0xe4, 0xc2, 0xa9, 0xac,
+ 0xeb, 0x24, 0xe1, 0x0a, 0xfa, 0xd4, 0xe3, 0x2e,
+ 0xdd, 0x8d, 0x15, 0xc9, 0x32, 0x01, 0x77, 0xcb,
+
+ 0xdc, 0x99, 0x4c, 0xba, 0x99, 0xd3, 0xd0, 0xf1,
+ 0x22, 0x1a, 0xd7, 0x6e, 0x93, 0xe4, 0xd6, 0x46,
+ 0x41, 0x88, 0x7f, 0x5c, 0xda, 0x21, 0xa6, 0x1f,
+ 0x12, 0x9f, 0x77, 0x98, 0xae, 0x4a, 0x50, 0xc9,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc
new file mode 100644
index 0000000..fe9eff1
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc
@@ -0,0 +1,85 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: grp01
+ * Signer: member0
+ * HashAlg: Sha512
+ * Message: "test1"
+ * Basename: None (random base)
+ * SigRl: Empty
+ */
+ 0xb8, 0x56, 0xe4, 0xb3, 0x1a, 0xba, 0xcf, 0xaa,
+ 0xee, 0x6a, 0xc6, 0xaa, 0xc6, 0x43, 0xcf, 0x24,
+ 0x38, 0xb5, 0x95, 0xd9, 0x60, 0x40, 0xfd, 0xb1,
+ 0xa5, 0x0b, 0x49, 0x72, 0x8c, 0x1a, 0x32, 0x8b,
+
+ 0x50, 0x9f, 0xed, 0xc0, 0x90, 0x46, 0x0f, 0xe5,
+ 0x26, 0x72, 0xb1, 0x7a, 0xf9, 0xfe, 0x67, 0xa2,
+ 0x81, 0xab, 0x7a, 0x6f, 0x8e, 0xc6, 0x26, 0x8b,
+ 0x9f, 0x5a, 0x07, 0xd7, 0xc1, 0x8a, 0x94, 0x53,
+
+ 0x0b, 0x0a, 0xd3, 0xd9, 0xa2, 0x10, 0xc5, 0xc2,
+ 0x14, 0x13, 0xe2, 0xc0, 0x53, 0x5a, 0xa3, 0x13,
+ 0x25, 0xfd, 0xd7, 0x4c, 0xec, 0xc4, 0x57, 0x36,
+ 0xfc, 0x34, 0xb0, 0x7c, 0xcc, 0x17, 0x9c, 0xf4,
+
+ 0x68, 0x9d, 0xd0, 0x8c, 0xb9, 0xb4, 0xb2, 0x35,
+ 0x7c, 0x9b, 0xeb, 0x24, 0x00, 0x05, 0x96, 0x0b,
+ 0xa2, 0xf2, 0xe4, 0x87, 0x38, 0x80, 0xcb, 0xd5,
+ 0x0c, 0x01, 0xc1, 0xb1, 0xe4, 0x21, 0x63, 0x41,
+
+ 0x73, 0x44, 0xf4, 0xe4, 0x20, 0xb0, 0x0c, 0xb7,
+ 0x6b, 0x49, 0x4b, 0xe8, 0xb3, 0x09, 0x5f, 0x16,
+ 0x35, 0x08, 0x5e, 0x97, 0x5b, 0xe1, 0x77, 0x94,
+ 0x2c, 0x47, 0xba, 0x1b, 0x3b, 0x37, 0x71, 0x1b,
+
+ 0x28, 0xb7, 0x7d, 0x9b, 0x61, 0x50, 0xc0, 0x85,
+ 0x38, 0xb7, 0xb4, 0xd7, 0x27, 0x22, 0x5b, 0xf1,
+ 0x72, 0xb6, 0x0d, 0x19, 0x60, 0xdc, 0x70, 0x38,
+ 0xe5, 0x01, 0x31, 0x04, 0x8a, 0xee, 0x1f, 0xd8,
+
+ 0x45, 0x1d, 0x0c, 0x4c, 0xe3, 0x5f, 0xbc, 0xb0,
+ 0x6e, 0x9b, 0x7b, 0x01, 0x42, 0xcf, 0xb5, 0x56,
+ 0x32, 0xdc, 0xf2, 0xea, 0xb5, 0x66, 0xdc, 0x10,
+ 0xea, 0xb8, 0x2b, 0xa0, 0xb7, 0xbb, 0x55, 0x45,
+
+ 0xf7, 0x50, 0xf5, 0x14, 0x02, 0x91, 0xf4, 0x2f,
+ 0x10, 0xa8, 0x94, 0xaf, 0x6a, 0x4a, 0xab, 0x87,
+ 0xdf, 0xd5, 0xeb, 0xc3, 0x22, 0x38, 0xaf, 0xef,
+ 0x79, 0xf4, 0xed, 0x1c, 0xe8, 0x5d, 0xd0, 0x19,
+
+ 0x7a, 0x9c, 0x7c, 0x05, 0x23, 0x24, 0xb3, 0xfb,
+ 0x2c, 0x54, 0x4d, 0xee, 0x55, 0x51, 0xab, 0xff,
+ 0x52, 0xc6, 0x79, 0xe8, 0xd4, 0x64, 0x5b, 0xc5,
+ 0x3b, 0x65, 0xee, 0xaf, 0x69, 0xb5, 0x81, 0x51,
+
+ 0x3a, 0x23, 0x0b, 0x6c, 0xf8, 0x0c, 0xe5, 0x72,
+ 0xd7, 0x16, 0x61, 0x3b, 0x73, 0x4c, 0x2b, 0x23,
+ 0x51, 0x64, 0x02, 0xa2, 0x60, 0xac, 0xda, 0x17,
+ 0x4d, 0x49, 0x38, 0xaf, 0x9c, 0xcd, 0x83, 0x3a,
+
+ 0x88, 0x73, 0xb4, 0x5b, 0x86, 0x2c, 0xa7, 0x7f,
+ 0x95, 0xf1, 0x9f, 0xa9, 0x9b, 0x49, 0xca, 0xef,
+ 0xd7, 0x07, 0xdf, 0x06, 0x3e, 0xb9, 0xa8, 0x7f,
+ 0x45, 0x9d, 0x6e, 0x24, 0xf8, 0xf3, 0xee, 0x5e,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/grp01/privrl.inc b/epid/common-testhelper/testdata/grp01/privrl.inc
new file mode 100644
index 0000000..3c373a1
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/privrl.inc
@@ -0,0 +1,277 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+// privRL
+// gid
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A,
+
+// version
+0x00, 0x00, 0x00, 0x00,
+
+// n1
+0x00, 0x00, 0x00, 0x32,
+
+// f's
+0x8a, 0xdc, 0xc0, 0xc8, 0xcd, 0x29, 0x9e, 0x8,
+0x9e, 0x4e, 0xd, 0xa7, 0xf6, 0x46, 0xee, 0x80,
+0xca, 0x91, 0x86, 0x54, 0x3c, 0x7f, 0x8d, 0xb5,
+0x49, 0xf9, 0x6d, 0x00, 0x39, 0x39, 0x62, 0xc7,
+
+0xe9, 0xa2, 0x59, 0x31, 0xbc, 0xc6, 0x6, 0xe1,
+0xf5, 0x45, 0xc6, 0xe1, 0x1a, 0x8e, 0xd6, 0xc6,
+0xc7, 0x25, 0x94, 0x7f, 0x82, 0x99, 0x3d, 0x1d,
+0x32, 0x39, 0xd9, 0x37, 0x2a, 0x12, 0x89, 0x03,
+
+0x83, 0xe7, 0x53, 0xa9, 0x99, 0xba, 0x3f, 0xae,
+0x3e, 0xa0, 0x86, 0x91, 0x1c, 0xee, 0xe3, 0x76,
+0x4b, 0xf0, 0x7a, 0x11, 0xb3, 0x9d, 0x35, 0x42,
+0x00, 0xcf, 0x40, 0x5e, 0x36, 0x74, 0x2a, 0x94,
+
+0xb9, 0x2f, 0x96, 0xa7, 0xbf, 0x5d, 0x8c, 0x5b,
+0x47, 0xc4, 0xac, 0xe9, 0x9a, 0x8a, 0x2d, 0x38,
+0x4, 0xb5, 0xe6, 0x56, 0x30, 0xa7, 0xe4, 0x9a,
+0xcc, 0x73, 0x81, 0x9a, 0x4f, 0x75, 0x6c, 0xef,
+
+0x91, 0x52, 0xb2, 0x6, 0x20, 0x83, 0x7c, 0x22,
+0x27, 0x83, 0xd, 0x77, 0x5c, 0xff, 0x20, 0xf5,
+0x53, 0xad, 0x9e, 0xd9, 0x9c, 0x76, 0x6f, 0xc,
+0x4b, 0xa9, 0xb9, 0xc0, 0x51, 0xe7, 0x32, 0xd5,
+
+0x10, 0x01, 0xa7, 0xbf, 0xc5, 0xad, 0x96, 0xb9,
+0x40, 0xdc, 0x6f, 0xdb, 0xca, 0xd5, 0xf8, 0x03,
+0xe, 0x47, 0x6e, 0xe8, 0x76, 0x4b, 0x87, 0x1e,
+0x59, 0x17, 0x99, 0x88, 0x15, 0xe4, 0xc5, 0x4d,
+
+0xf2, 0x38, 0xb7, 0x1d, 0x30, 0x89, 0xa5, 0xbe,
+0x15, 0xb6, 0x9d, 0x8e, 0x8e, 0x85, 0x33, 0x99,
+0xe3, 0x6a, 0x8, 0x3f, 0xba, 0xeb, 0x40, 0x8b,
+0x17, 0xfc, 0xa8, 0x2e, 0xe0, 0x34, 0x94, 0x4e,
+
+0x50, 0xb6, 0x8d, 0x45, 0xac, 0x8, 0x10, 0xb1,
+0xb7, 0xa4, 0xbe, 0xd6, 0x00, 0xd0, 0x96, 0xc,
+0xa3, 0xb5, 0x74, 0xc6, 0xe9, 0xa7, 0xe1, 0x80,
+0x6f, 0x5d, 0x71, 0x37, 0x4d, 0xf4, 0xee, 0x9a,
+
+0xc5, 0x46, 0xa4, 0x21, 0xff, 0xd2, 0x73, 0x47,
+0x40, 0xe3, 0xa2, 0xf0, 0xe2, 0x4a, 0xed, 0xde,
+0x35, 0xca, 0x92, 0xba, 0xfa, 0x92, 0xa4, 0x21,
+0x03, 0x46, 0xb5, 0x28, 0x88, 0xea, 0xcc, 0xd2,
+
+0x38, 0x95, 0x8d, 0x4a, 0x3a, 0xcf, 0xc2, 0x8c,
+0xc3, 0x88, 0x81, 0x5, 0x8d, 0x94, 0x7c, 0xd2,
+0xf9, 0x7d, 0x6c, 0x68, 0x6f, 0x69, 0x54, 0xc4,
+0x9d, 0xf5, 0x38, 0x9b, 0x40, 0xb6, 0xee, 0xe6,
+
+0xb, 0x50, 0x76, 0x23, 0x1b, 0x19, 0xf6, 0xf9,
+0x1b, 0xf7, 0x63, 0xe4, 0x38, 0xd0, 0x1c, 0xff,
+0x32, 0x6, 0x86, 0xa8, 0x89, 0x87, 0x5c, 0xc,
+0x23, 0x2c, 0xaa, 0xe, 0x6, 0xa8, 0xfa, 0x91,
+
+0xfa, 0x93, 0xea, 0xdc, 0x3d, 0xc, 0x4d, 0x84,
+0x89, 0x21, 0xc1, 0x3e, 0xb4, 0xa1, 0x30, 0x8e,
+0x7e, 0xb, 0xa5, 0x4c, 0x51, 0x11, 0xff, 0x00,
+0x95, 0x5a, 0xa4, 0x47, 0x94, 0x2f, 0x43, 0x56,
+
+0x2c, 0x53, 0xb8, 0x93, 0xf4, 0x38, 0xd7, 0x30,
+0x15, 0x73, 0x53, 0xfa, 0xd9, 0x75, 0x4a, 0xda,
+0xe5, 0xb, 0xdc, 0xc, 0x01, 0x73, 0x2e, 0x57,
+0x1c, 0xdd, 0xf9, 0x9, 0x9e, 0x22, 0xf6, 0x4b,
+
+0xfd, 0xcd, 0x91, 0x57, 0x7f, 0xb9, 0x3d, 0xd1,
+0xb6, 0xc9, 0x25, 0xe5, 0x18, 0x1a, 0x94, 0xe8,
+0xe0, 0x52, 0x7d, 0xbe, 0x93, 0x28, 0xf, 0xa1,
+0x69, 0x86, 0xc1, 0xb0, 0x47, 0xa4, 0x48, 0xa4,
+
+0x7d, 0xee, 0x16, 0x67, 0xe8, 0x23, 0x9d, 0xf9,
+0xc4, 0xc6, 0x2f, 0xc1, 0x6f, 0x8, 0xa, 0x52,
+0x2b, 0xd7, 0x33, 0x40, 0x3a, 0xf7, 0xc0, 0x60,
+0x72, 0xa9, 0xf1, 0x34, 0x9e, 0xd8, 0x3b, 0x9c,
+
+0x7a, 0xc0, 0x2f, 0x2f, 0xe9, 0xae, 0xb2, 0xe1,
+0x10, 0x8d, 0x30, 0xd7, 0xb5, 0x4e, 0x49, 0x1c,
+0xac, 0xfc, 0x1d, 0x39, 0xc4, 0x36, 0x46, 0xd9,
+0x82, 0x2d, 0xc1, 0xec, 0x27, 0xba, 0xe2, 0xea,
+
+0x3d, 0x9e, 0xfd, 0xe0, 0x81, 0x33, 0xe1, 0x17,
+0xda, 0x5a, 0x29, 0x13, 0x03, 0xf0, 0xb5, 0xf,
+0xf5, 0x78, 0x37, 0x64, 0xda, 0x20, 0x87, 0xf9,
+0xf5, 0xbb, 0xff, 0x9e, 0x9c, 0xf4, 0xcc, 0xb0,
+
+0xeb, 0x30, 0xcf, 0x10, 0x34, 0xd0, 0xc2, 0x6b,
+0x2b, 0xae, 0xc5, 0x8c, 0x1a, 0xf2, 0x1e, 0x19,
+0x16, 0xe1, 0x31, 0xc0, 0x77, 0x32, 0x4e, 0x2a,
+0x1a, 0x54, 0xb3, 0xbf, 0x52, 0x87, 0xa5, 0xb6,
+
+0x9e, 0x10, 0xba, 0x1a, 0x2f, 0x49, 0xe9, 0x6,
+0xf4, 0x00, 0x84, 0xb8, 0x13, 0x94, 0x91, 0xfb,
+0xaf, 0x43, 0x8f, 0x4a, 0xa3, 0x42, 0xce, 0xb7,
+0x01, 0xf5, 0x2a, 0xde, 0xad, 0x36, 0x7f, 0xde,
+
+0x4e, 0xea, 0x64, 0x98, 0x8e, 0x13, 0x95, 0xae,
+0xdf, 0xca, 0xa, 0x3f, 0x39, 0x65, 0xda, 0xe4,
+0x4c, 0xa4, 0x1d, 0x80, 0x16, 0x25, 0x8b, 0x1e,
+0xf4, 0x9e, 0x92, 0x7d, 0xe2, 0xb4, 0x5, 0xd3,
+
+0x18, 0x11, 0x18, 0x4c, 0xab, 0x71, 0x23, 0xf4,
+0xeb, 0x2c, 0xc, 0x82, 0x15, 0x1c, 0x8c, 0xde,
+0x24, 0x8d, 0xa1, 0x74, 0xf1, 0xe7, 0x54, 0x7a,
+0x10, 0x3c, 0xd3, 0x39, 0x7a, 0x2e, 0x3e, 0x30,
+
+0x37, 0xc8, 0x39, 0x90, 0xf5, 0xca, 0x5e, 0x4c,
+0xc1, 0x79, 0x40, 0x65, 0x97, 0x5d, 0x1a, 0x27,
+0xb7, 0x7c, 0x10, 0xb3, 0x50, 0x61, 0x51, 0xc0,
+0xe8, 0xac, 0x78, 0x1e, 0xcb, 0x88, 0x01, 0xbd,
+
+0x7, 0xb0, 0x2e, 0xd4, 0xe8, 0x6, 0xd, 0xb8,
+0xb5, 0xa3, 0xe1, 0x54, 0xb6, 0xe7, 0xaf, 0x3a,
+0x65, 0xdb, 0x3b, 0x76, 0x5c, 0xdd, 0x83, 0x15,
+0xc0, 0x84, 0xf4, 0xda, 0xff, 0xf3, 0x40, 0xc5,
+
+0x2e, 0xe5, 0xab, 0x73, 0x4b, 0x14, 0xde, 0xb6,
+0x5a, 0xfc, 0x3d, 0x77, 0x03, 0x5a, 0xa3, 0x9f,
+0x88, 0x69, 0x58, 0xa6, 0x8, 0x87, 0x28, 0x33,
+0xa3, 0x34, 0x4b, 0x83, 0x14, 0x8b, 0x1e, 0x50,
+
+0x9c, 0x6, 0x6b, 0x6a, 0xc1, 0x62, 0x82, 0xab,
+0x8f, 0x82, 0xae, 0x3d, 0x91, 0xd7, 0xfd, 0xd5,
+0xd2, 0x19, 0x3f, 0x4f, 0xae, 0x1f, 0x01, 0xcc,
+0x50, 0x96, 0xfc, 0x79, 0x2f, 0x67, 0xa3, 0xdd,
+
+0x9b, 0x86, 0x6b, 0xd7, 0xd6, 0x8e, 0x62, 0x26,
+0x59, 0x28, 0xd1, 0x9f, 0x25, 0x12, 0xe7, 0xbd,
+0x16, 0x7b, 0x22, 0xd3, 0x7c, 0xfe, 0xcd, 0x7e,
+0x60, 0x93, 0x59, 0xc9, 0x48, 0xd4, 0xab, 0xd8,
+
+0x95, 0x29, 0x50, 0xe4, 0x98, 0xe6, 0xb4, 0x4b,
+0x41, 0x78, 0xb7, 0x01, 0x5d, 0x88, 0x3e, 0x3d,
+0xd4, 0x4a, 0x59, 0x5, 0xc7, 0x8, 0xb9, 0x5c,
+0xff, 0xcb, 0x6e, 0x3e, 0x1b, 0xe6, 0xf3, 0x9b,
+
+0xae, 0x75, 0x86, 0xc, 0x12, 0xb8, 0x5b, 0xb3,
+0x62, 0x53, 0xb3, 0xf6, 0xa8, 0xdd, 0xa2, 0xc3,
+0x6a, 0xc1, 0x54, 0x19, 0xfb, 0xd8, 0x51, 0x5b,
+0x4c, 0x31, 0xc4, 0x58, 0xc6, 0x11, 0x89, 0x18,
+
+0x73, 0x93, 0xc, 0xda, 0x48, 0x73, 0x3a, 0x5e,
+0x67, 0xa, 0xd1, 0x3c, 0x8e, 0xb7, 0xbe, 0x18,
+0x1b, 0x84, 0xe5, 0x72, 0x59, 0x19, 0x5f, 0x44,
+0x84, 0x41, 0x8a, 0xf5, 0xac, 0xa0, 0xa2, 0x85,
+
+0xcf, 0x50, 0xb0, 0x73, 0x9a, 0x2b, 0x6, 0x93,
+0xaa, 0x26, 0xc4, 0xc7, 0xca, 0x30, 0xb, 0x2e,
+0x3e, 0xca, 0xa9, 0xa4, 0x47, 0xe7, 0x44, 0x9f,
+0xae, 0x7e, 0xda, 0xc0, 0x4b, 0xb7, 0xa1, 0x74,
+
+0x78, 0x86, 0xe6, 0xc4, 0x59, 0xbd, 0xb5, 0x41,
+0xc0, 0x48, 0x57, 0x4f, 0x5b, 0x6a, 0xda, 0x9d,
+0x27, 0xf6, 0xb6, 0x4f, 0xc5, 0x30, 0x94, 0x8e,
+0xe3, 0x5d, 0x84, 0x67, 0xd7, 0xd4, 0x79, 0x37,
+
+0x31, 0x41, 0x4, 0xb0, 0xf0, 0xa8, 0xe3, 0x80,
+0xf3, 0x3a, 0x6b, 0x5b, 0x03, 0x9d, 0x41, 0x37,
+0x98, 0x3b, 0x03, 0xac, 0x1b, 0xca, 0xe9, 0xe1,
+0x91, 0xc, 0x2b, 0x8b, 0x52, 0x7a, 0xf7, 0x6,
+
+0x4f, 0xdc, 0x6f, 0x6b, 0x9a, 0x2a, 0x88, 0x52,
+0xf5, 0x65, 0x11, 0xc9, 0x27, 0x14, 0x90, 0xf6,
+0xab, 0x73, 0xe0, 0x71, 0x50, 0x52, 0xb3, 0xb7,
+0x27, 0x6e, 0xe7, 0xa, 0x17, 0x7a, 0x7e, 0xb3,
+
+0xc5, 0x67, 0x79, 0x19, 0xb9, 0xf1, 0x2b, 0x4b,
+0x4e, 0x2f, 0xc6, 0xda, 0xee, 0x76, 0x1d, 0xb7,
+0x91, 0x66, 0x30, 0x61, 0xa4, 0xca, 0xc3, 0x47,
+0x68, 0xba, 0x5b, 0xe8, 0x1c, 0xd9, 0x7c, 0xb8,
+
+0x22, 0xfd, 0x1a, 0xe0, 0x39, 0x84, 0x8c, 0x9e,
+0xb2, 0x1e, 0x5d, 0xbe, 0x86, 0x8d, 0xbb, 0x76,
+0x12, 0xd3, 0x9d, 0x7c, 0xa9, 0x2a, 0xa5, 0xae,
+0x11, 0xdd, 0x01, 0x96, 0xc6, 0x01, 0x5d, 0x5a,
+
+0x98, 0x55, 0x5e, 0x5a, 0xd3, 0xc9, 0x10, 0x11,
+0x01, 0x62, 0xa7, 0x82, 0x01, 0xd3, 0xea, 0x5e,
+0x49, 0x21, 0x54, 0x8e, 0x99, 0x35, 0x95, 0x15,
+0x26, 0xfb, 0xbd, 0x82, 0x41, 0x2e, 0x66, 0x03,
+
+0xd9, 0x2b, 0xed, 0xd9, 0xb4, 0x44, 0x62, 0x4a,
+0x11, 0x73, 0x6e, 0x54, 0xab, 0xdd, 0x5c, 0x24,
+0x46, 0xdc, 0x47, 0xf, 0x2c, 0xbb, 0x4b, 0x71,
+0x6a, 0xbd, 0xd2, 0xf9, 0xbf, 0x6b, 0x23, 0xb1,
+
+0xdb, 0xe8, 0xd0, 0x45, 0xbf, 0x20, 0x90, 0x9f,
+0x89, 0xea, 0x8b, 0x8a, 0xbe, 0x52, 0xd5, 0xe4,
+0xb0, 0x68, 0xf5, 0x80, 0x74, 0xad, 0xc, 0xe3,
+0x9f, 0xa, 0xee, 0xec, 0x1b, 0x4, 0x7c, 0xf0,
+
+0x35, 0xf7, 0x80, 0xd7, 0xd8, 0xf3, 0x88, 0xee,
+0xfb, 0x9, 0xc9, 0xd3, 0x5, 0x92, 0x77, 0xe3,
+0xe3, 0x80, 0xe6, 0x6d, 0x7b, 0xc6, 0xc2, 0xe1,
+0xfe, 0x5f, 0x5d, 0x53, 0xc7, 0x94, 0xf8, 0x9c,
+
+0x5f, 0xad, 0x9c, 0x1a, 0xf5, 0x2, 0xe5, 0xcf,
+0x01, 0xe4, 0x87, 0x29, 0xaf, 0xb9, 0xa7, 0x2,
+0xcb, 0xe0, 0x57, 0x00, 0xfd, 0x56, 0x35, 0x54,
+0xb, 0xb5, 0x71, 0xa0, 0xf3, 0xdc, 0x34, 0x5a,
+
+0xbd, 0x7c, 0xe0, 0xc6, 0x99, 0x50, 0x58, 0x72,
+0x53, 0x5d, 0x90, 0x70, 0x7d, 0x27, 0x6f, 0x99,
+0x28, 0x6, 0x80, 0x20, 0x15, 0xd4, 0xcb, 0x7a,
+0xb2, 0x6b, 0xd0, 0xe5, 0x14, 0xcf, 0x80, 0x79,
+
+0x6, 0x81, 0x62, 0x5f, 0x5, 0x2, 0xe6, 0x71,
+0x77, 0xcc, 0xaf, 0x29, 0x46, 0x35, 0xe2, 0x20,
+0x18, 0xb8, 0x47, 0x7d, 0x72, 0x34, 0x74, 0x3d,
+0x19, 0x10, 0x6c, 0x11, 0x73, 0xe9, 0x3b, 0x48,
+
+0xec, 0xe9, 0x54, 0xc3, 0x4, 0xba, 0xa6, 0x78,
+0xa2, 0xeb, 0x54, 0x6d, 0xf, 0x8f, 0xb2, 0x5f,
+0x9a, 0xc3, 0x3a, 0xb8, 0x7e, 0x5b, 0x01, 0xac,
+0x6b, 0x45, 0x65, 0xf5, 0x9a, 0x43, 0x4a, 0x46,
+
+0xef, 0x99, 0x9, 0x46, 0xa5, 0xa7, 0x6, 0xa5,
+0xc3, 0x54, 0x7, 0xbe, 0x3b, 0x35, 0x4d, 0xdc,
+0xc8, 0x8e, 0xa4, 0x44, 0x4a, 0x81, 0xdf, 0xdd,
+0x92, 0xa8, 0xee, 0xcf, 0x1a, 0x5b, 0x2c, 0x6d,
+
+0x2e, 0x3e, 0xce, 0x64, 0xe7, 0x9, 0x9b, 0x23,
+0xf6, 0xd8, 0x92, 0xca, 0x60, 0x6b, 0xf0, 0x21,
+0xf9, 0x76, 0x4f, 0xf7, 0x56, 0x5, 0xe1, 0x89,
+0xd1, 0x83, 0xe9, 0xd3, 0xc3, 0x4a, 0x8f, 0xd8,
+
+0x3e, 0xd6, 0x1c, 0xda, 0xdf, 0x9, 0x25, 0x7b,
+0xf9, 0xc, 0x61, 0x93, 0x21, 0x12, 0x6b, 0xbb,
+0x83, 0x2d, 0xfe, 0x3f, 0x81, 0x40, 0x34, 0x1c,
+0x3c, 0xb6, 0x93, 0xe6, 0x27, 0x80, 0xfe, 0xde,
+
+0xbd, 0x53, 0xfb, 0x7c, 0x1c, 0xe5, 0x1e, 0xaa,
+0xa0, 0x77, 0xe0, 0x60, 0xcd, 0xb6, 0x81, 0x30,
+0xbe, 0x27, 0x59, 0x6a, 0x33, 0x8, 0x58, 0xa1,
+0x23, 0x9d, 0x7f, 0x6e, 0x47, 0xf5, 0x45, 0xd9,
+
+0xa8, 0x7a, 0xc7, 0x01, 0x8, 0x40, 0x4a, 0x66,
+0xbe, 0x6d, 0x12, 0xe9, 0xf, 0xc6, 0xca, 0xa5,
+0x83, 0xd8, 0xda, 0x3e, 0xe5, 0xb5, 0x3d, 0x78,
+0x60, 0x86, 0xdc, 0xfc, 0x9b, 0xd6, 0xb6, 0x33,
+
+0xd8, 0x2a, 0xa1, 0x5d, 0x1e, 0xc9, 0xab, 0xde,
+0x6e, 0x10, 0x00, 0x74, 0x51, 0xa8, 0x5e, 0x94,
+0x84, 0x6c, 0xf6, 0x73, 0xfd, 0x7, 0x38, 0xdc,
+0x7e, 0x6a, 0x6d, 0xc, 0x50, 0x3f, 0x4, 0x13,
+
+0x55, 0xdd, 0x03, 0xd3, 0xdc, 0x5f, 0x11, 0x18,
+0x97, 0xe9, 0x4a, 0xb5, 0x2b, 0xd, 0x88, 0x69,
+0x18, 0x99, 0xc4, 0xe, 0x24, 0x5c, 0xac, 0x7f,
+0x49, 0xc9, 0x33, 0xb9, 0xa9, 0xba, 0x6e, 0xc1
diff --git a/epid/common-testhelper/testdata/grp01/sigrl.inc b/epid/common-testhelper/testdata/grp01/sigrl.inc
new file mode 100644
index 0000000..52de07b
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/sigrl.inc
@@ -0,0 +1,878 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+// sigRL
+
+// gid
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A,
+
+// version
+0x00, 0x00, 0x00, 0x00,
+
+// n2
+0x00, 0x00, 0x00, 0x32,
+
+// bk's
+0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59,
+0x33, 0x35, 0x27, 0xd, 0x8, 0xb1, 0xbe, 0x5d,
+0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28,
+0x56, 0x43, 0xc6, 0x94, 0x67, 0xa6, 0x72, 0xf6,
+0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa,
+0x90, 0x23, 0x18, 0x8, 0xad, 0x7d, 0xfe, 0xf5,
+0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28,
+0xc2, 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55,
+0x87, 0x98, 0xbd, 0x72, 0xf9, 0xcf, 0xd, 0x40,
+0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc,
+0x61, 0x9d, 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9,
+0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a, 0x33, 0xad,
+0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3,
+0x98, 0x37, 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+
+0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a,
+0xa2, 0xc9, 0x81, 0x10, 0xfe, 0xbf, 0xc, 0x53,
+0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60,
+0x3e, 0xc0, 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67,
+0x2d, 0xb5, 0xd5, 0x82, 0xc4, 0x49, 0x29, 0x51,
+0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5,
+0x77, 0x16, 0x4, 0x40, 0x8a, 0x0, 0xe, 0x3a,
+0x5d, 0x37, 0x42, 0xd3, 0x8, 0x40, 0xbd, 0x69,
+0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe,
+0xd9, 0xdd, 0x97, 0x6c, 0xa8, 0xa5, 0x60, 0x6b,
+0xf8, 0x1b, 0xba, 0x2, 0xb2, 0xca, 0x5, 0x44,
+0x9b, 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51,
+0xfa, 0xcf, 0xa4, 0x4, 0xe9, 0xf3, 0xbf, 0x38,
+0xd4, 0x24, 0x9, 0x52, 0xf3, 0x58, 0x3d, 0x9d,
+0x4b, 0xb3, 0x37, 0x4b, 0xec, 0x87, 0xe1, 0x64,
+0x60, 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40, 0x11,
+
+0x6e, 0x22, 0xaa, 0x10, 0x84, 0x58, 0x8b, 0xff,
+0xd8, 0x37, 0x8, 0xa9, 0xe9, 0xdb, 0xf6, 0x1f,
+0x69, 0x10, 0x95, 0x6c, 0xbf, 0xd, 0x11, 0x48,
+0x6f, 0x1b, 0x3c, 0x62, 0x46, 0x13, 0x89, 0x13,
+0x5f, 0xa1, 0x3, 0x62, 0xed, 0x62, 0xdf, 0x3d,
+0xbf, 0xcd, 0xb7, 0x41, 0x48, 0x81, 0x3, 0x9f,
+0x54, 0xa, 0xe, 0xb3, 0x35, 0xf9, 0xde, 0x24,
+0xba, 0x6d, 0x4c, 0x7f, 0xfc, 0xc1, 0xb4, 0xce,
+0x6d, 0xa1, 0x73, 0x7c, 0xaa, 0xb, 0xad, 0x2,
+0xd6, 0x37, 0x85, 0xe, 0xbb, 0x48, 0x11, 0x38,
+0xc4, 0xaa, 0x1b, 0xf, 0xcf, 0xc1, 0x9c, 0x26,
+0xcc, 0x95, 0xc2, 0x5b, 0x49, 0x9, 0x3d, 0xe9,
+0x7d, 0xce, 0xc7, 0xa6, 0x4, 0x3e, 0x7c, 0x9e,
+0x28, 0xde, 0x8, 0x11, 0xe, 0x61, 0x3b, 0xc0,
+0x9c, 0x6b, 0x58, 0x23, 0xe6, 0x40, 0x7b, 0xbd,
+0xb8, 0x72, 0xf, 0xe0, 0xee, 0xcf, 0xba, 0xb4,
+
+0xc4, 0xff, 0xaf, 0x48, 0x15, 0xda, 0x60, 0x40,
+0xcc, 0xd7, 0xf2, 0x68, 0xf7, 0xe2, 0x70, 0x12,
+0x8d, 0x15, 0xa5, 0xb7, 0xe6, 0x4c, 0x23, 0xea,
+0x4d, 0x8a, 0x51, 0x6, 0x67, 0x3, 0x4c, 0x83,
+0x6f, 0x28, 0x67, 0xcf, 0x63, 0x46, 0x3e, 0x8a,
+0x45, 0x9f, 0xed, 0x1a, 0xde, 0xa7, 0xad, 0xb2,
+0x2b, 0xf, 0x8b, 0xab, 0x7c, 0x70, 0xff, 0xc3,
+0xa8, 0x6e, 0x8c, 0xaa, 0xb1, 0xf6, 0x20, 0xe3,
+0xb9, 0xf1, 0xc3, 0x3d, 0x5, 0x6a, 0x1e, 0x26,
+0x2d, 0xf4, 0xd, 0xe4, 0x53, 0x63, 0x67, 0x23,
+0x48, 0xa8, 0x1, 0xa8, 0xee, 0xe1, 0x5f, 0x64,
+0xe3, 0x2c, 0x71, 0xe2, 0x10, 0x82, 0x0, 0x52,
+0xd7, 0x74, 0x87, 0xff, 0x1c, 0x0, 0x19, 0xe6,
+0x4d, 0x15, 0x91, 0x6d, 0xf3, 0x38, 0x3b, 0xee,
+0xf3, 0xd5, 0xd1, 0xc7, 0x6d, 0xd9, 0x8e, 0x55,
+0x70, 0x90, 0xb0, 0xb, 0x3c, 0x4a, 0x67, 0x19,
+
+0x4f, 0x98, 0x92, 0xf9, 0x18, 0x38, 0xf5, 0xb4,
+0xf7, 0x2f, 0xa7, 0x21, 0x71, 0x52, 0x27, 0xd0,
+0x57, 0x4f, 0x9c, 0x30, 0xe, 0xb2, 0x27, 0xce,
+0xd7, 0xb2, 0x9f, 0xc0, 0xf6, 0xc3, 0xb0, 0x7c,
+0x40, 0x18, 0x75, 0x4a, 0xde, 0xb0, 0x9f, 0x46,
+0x8a, 0x5a, 0xeb, 0x4f, 0xcb, 0x5e, 0x60, 0xf5,
+0xca, 0xf4, 0x98, 0xaf, 0x62, 0x9b, 0x7e, 0x10,
+0xda, 0xba, 0x2f, 0x47, 0x64, 0xf2, 0xc0, 0x84,
+0x19, 0x75, 0xe0, 0xe4, 0xff, 0x20, 0xda, 0x7d,
+0xe5, 0xd, 0xc8, 0xf8, 0xe3, 0x83, 0x61, 0x19,
+0x17, 0xf1, 0xa9, 0x1b, 0xff, 0x39, 0x79, 0x88,
+0x1, 0xfb, 0xe7, 0x23, 0xd2, 0xac, 0xe0, 0x49,
+0x12, 0x2a, 0x38, 0xb4, 0x7c, 0xc2, 0x1b, 0x88,
+0x5f, 0x68, 0x32, 0x11, 0xd9, 0xfd, 0xdc, 0x65,
+0x2, 0xb3, 0x74, 0x2c, 0x13, 0xf2, 0xd8, 0xf1,
+0x45, 0xc5, 0xd1, 0xf4, 0xa3, 0x38, 0x81, 0x92,
+
+0x4f, 0xde, 0x62, 0x9d, 0xde, 0xfb, 0x23, 0x29,
+0x9c, 0x4, 0xed, 0x19, 0xa8, 0x86, 0x5f, 0xed,
+0x99, 0x5d, 0xc0, 0xe, 0xcf, 0x2c, 0x2e, 0x27,
+0x93, 0x91, 0x47, 0x75, 0xa5, 0xf3, 0x87, 0x99,
+0x15, 0x47, 0xb4, 0xee, 0x79, 0xda, 0xf9, 0x7a,
+0xd9, 0x8d, 0x67, 0xf2, 0xac, 0xe5, 0xc8, 0x30,
+0xbe, 0xa2, 0xee, 0xe1, 0x85, 0x35, 0x93, 0xab,
+0xf1, 0x46, 0xe, 0xb4, 0x4c, 0xa3, 0xe0, 0x9b,
+0xb0, 0x8d, 0x54, 0x5b, 0xa8, 0x53, 0xbb, 0xd5,
+0x9e, 0xc0, 0xa9, 0xd4, 0xae, 0x46, 0x4c, 0x1a,
+0x1, 0xac, 0x80, 0x92, 0xee, 0x46, 0x39, 0xad,
+0x69, 0x9b, 0x8b, 0x15, 0xc9, 0xa3, 0x88, 0x24,
+0x96, 0x32, 0x2b, 0xae, 0xc8, 0xdb, 0x98, 0xc6,
+0xbd, 0x32, 0xe9, 0x12, 0xbb, 0xb9, 0x5d, 0xa5,
+0xfc, 0x4f, 0x2, 0xde, 0x64, 0xc5, 0x94, 0x15,
+0x25, 0x19, 0x44, 0xc0, 0xa, 0xfe, 0xb3, 0x40,
+
+0xf, 0x8, 0xd2, 0x35, 0x1a, 0xca, 0x75, 0xb0,
+0xdf, 0x4a, 0xc1, 0x5f, 0x93, 0x1f, 0x86, 0x7,
+0x78, 0x4b, 0x31, 0x2, 0xb6, 0xe6, 0x9e, 0x93,
+0x30, 0x19, 0x7e, 0x2f, 0x67, 0x40, 0xde, 0x3b,
+0x71, 0x32, 0x71, 0x1a, 0x35, 0x2c, 0xe4, 0xb8,
+0xeb, 0xf4, 0x9, 0xf1, 0xd2, 0x8, 0xcd, 0x15,
+0xb3, 0xdf, 0xd, 0xf5, 0xe8, 0x3a, 0x65, 0x3e,
+0xd6, 0x46, 0x87, 0xd8, 0x91, 0x70, 0xe, 0x73,
+0x62, 0x11, 0xd6, 0x99, 0x36, 0xa5, 0xb7, 0x40,
+0x98, 0xb1, 0x74, 0xfb, 0xbd, 0x99, 0xae, 0xfb,
+0x5f, 0xac, 0xe5, 0x46, 0xb7, 0x71, 0x22, 0xd,
+0xfa, 0xe2, 0x20, 0x8c, 0x1, 0x58, 0x61, 0x13,
+0xd, 0xc, 0x33, 0x49, 0x64, 0xd4, 0x51, 0xe0,
+0x13, 0xea, 0xa5, 0xe5, 0xc3, 0x2a, 0x7, 0x8d,
+0x6f, 0x6e, 0x35, 0x28, 0x55, 0x82, 0xdd, 0x75,
+0x5b, 0xab, 0x8e, 0xfe, 0x2a, 0x42, 0x3f, 0xd2,
+
+0x15, 0x50, 0xd8, 0xf6, 0x51, 0xc2, 0xf3, 0x9f,
+0x4, 0xca, 0xb5, 0x5e, 0x8b, 0x4f, 0xc1, 0x2b,
+0x6a, 0x19, 0x99, 0x32, 0x57, 0x88, 0xf5, 0xbf,
+0x9c, 0x20, 0x37, 0x70, 0x29, 0x35, 0x8a, 0x5c,
+0x74, 0x3c, 0x72, 0xe9, 0x47, 0x31, 0x2d, 0xd2,
+0x23, 0xa5, 0x5b, 0xbb, 0x5, 0x36, 0x62, 0x57,
+0x60, 0x98, 0xb6, 0x75, 0xc, 0x5a, 0xa8, 0x9b,
+0x32, 0x47, 0xe6, 0x7e, 0x18, 0x67, 0xe6, 0x35,
+0x8, 0x96, 0x14, 0x94, 0xd3, 0x86, 0xae, 0x25,
+0x13, 0x66, 0xf0, 0xee, 0x6, 0x1b, 0x6e, 0x37,
+0xba, 0xcd, 0x96, 0xa7, 0x35, 0x5c, 0x5b, 0xdd,
+0x83, 0xdc, 0xb8, 0xa1, 0x22, 0x38, 0x66, 0x8c,
+0xeb, 0xcd, 0x62, 0x9a, 0xc4, 0xf1, 0xc2, 0x4e,
+0x2a, 0xf6, 0x5, 0x94, 0xfe, 0xa5, 0x33, 0xd7,
+0xca, 0x59, 0x95, 0x72, 0xf1, 0x77, 0xe9, 0x48,
+0x11, 0xe5, 0x78, 0x7a, 0x89, 0x98, 0xab, 0x1d,
+
+0x9d, 0x9e, 0xb0, 0x78, 0x78, 0xa4, 0xf, 0x23,
+0xe9, 0x68, 0xb5, 0x63, 0xa, 0x59, 0x9e, 0xb7,
+0xed, 0x92, 0x46, 0xf3, 0x52, 0x4b, 0x3b, 0x38,
+0xec, 0xeb, 0x4a, 0xcd, 0xb5, 0x61, 0xf1, 0xc0,
+0xe, 0xc8, 0x99, 0xc6, 0x8f, 0xfa, 0x7b, 0xcf,
+0x4a, 0x58, 0xa5, 0x58, 0x51, 0x88, 0xe9, 0xe2,
+0xb9, 0xbe, 0x2f, 0x9b, 0xa4, 0x4c, 0x16, 0x1b,
+0xbe, 0x9e, 0xc6, 0x55, 0xd9, 0xe9, 0x2c, 0x77,
+0x28, 0xdc, 0x7c, 0x35, 0x19, 0x3c, 0x19, 0x40,
+0x6c, 0x6b, 0x28, 0x77, 0x37, 0x98, 0x15, 0x7f,
+0xa8, 0xe9, 0x3e, 0x99, 0x66, 0xed, 0x7a, 0xe6,
+0x79, 0x7c, 0xf9, 0x27, 0x75, 0x9, 0xb9, 0xc0,
+0xd8, 0x88, 0xc2, 0xff, 0x79, 0x90, 0x4e, 0x1d,
+0x61, 0x5c, 0x88, 0x81, 0x2, 0xbf, 0x4b, 0x2d,
+0x2f, 0x18, 0x2a, 0xfb, 0x4, 0x5c, 0x1c, 0x17,
+0xae, 0xd4, 0x6e, 0x97, 0x44, 0x61, 0xfd, 0x95,
+
+0x23, 0x91, 0x6e, 0xe5, 0x8a, 0xc4, 0x97, 0x21,
+0xc9, 0x21, 0x6, 0x8d, 0xa3, 0xbe, 0x7f, 0x7a,
+0xf5, 0xf8, 0x68, 0x86, 0xa, 0xc6, 0xf4, 0x57,
+0x3e, 0x3f, 0xed, 0x48, 0xa1, 0xdf, 0xec, 0x77,
+0x78, 0x82, 0x82, 0x7, 0xf4, 0x58, 0xd8, 0x9a,
+0x8a, 0x52, 0x57, 0x69, 0x69, 0x2b, 0x9c, 0xf9,
+0x85, 0x94, 0x53, 0x78, 0x2c, 0xa2, 0x21, 0x12,
+0xc4, 0x50, 0xfe, 0xd3, 0x7d, 0x89, 0xf, 0x5f,
+0x4c, 0xa5, 0xbc, 0x1d, 0x74, 0x99, 0xc7, 0x86,
+0xc5, 0xbd, 0x25, 0xc0, 0xa1, 0x2, 0x99, 0xa4,
+0xa8, 0xdf, 0x41, 0x9e, 0xed, 0xa9, 0x71, 0x0,
+0x7f, 0xc7, 0x81, 0xd4, 0xbf, 0x70, 0xf6, 0x59,
+0x77, 0x29, 0x44, 0x86, 0xae, 0xa9, 0xa, 0x3f,
+0xc6, 0x7a, 0x4e, 0xe6, 0x5, 0x8c, 0x0, 0x6d,
+0x4d, 0xc4, 0x82, 0xfc, 0x41, 0x3f, 0x11, 0xcb,
+0x90, 0x9c, 0xee, 0xdf, 0x2, 0xc3, 0x26, 0xa2,
+
+0x32, 0x2e, 0xff, 0x9d, 0xa5, 0x5a, 0xee, 0xff,
+0x5d, 0x42, 0xf2, 0x8b, 0xf1, 0xb6, 0x46, 0xe8,
+0x93, 0x21, 0x8a, 0x1f, 0xc, 0x1d, 0x5e, 0x63,
+0x36, 0xd0, 0x45, 0x22, 0x24, 0x74, 0x38, 0x5b,
+0x5e, 0x22, 0xcd, 0xe4, 0x37, 0xa1, 0x9c, 0xe0,
+0x34, 0xf7, 0x78, 0x5e, 0x79, 0x98, 0x56, 0xe8,
+0xe5, 0xd5, 0x49, 0x1f, 0x1b, 0x3c, 0xf5, 0x8f,
+0xd4, 0xa1, 0x8d, 0x4a, 0x4b, 0x71, 0xa, 0xb4,
+0x4e, 0xde, 0x7e, 0x45, 0xa2, 0x59, 0xb3, 0x5,
+0x82, 0xfb, 0x2, 0x23, 0xfe, 0x60, 0xf8, 0xec,
+0xb7, 0xc7, 0xff, 0x23, 0x7e, 0xee, 0xc5, 0x60,
+0xf, 0x7b, 0xc6, 0xb6, 0x90, 0x9c, 0x90, 0x67,
+0xf9, 0x8c, 0x3, 0xf, 0x2a, 0x91, 0xfc, 0x57,
+0x91, 0x1c, 0x77, 0xf4, 0xdd, 0xe7, 0x83, 0x68,
+0x3, 0xf, 0x9b, 0xfd, 0x7a, 0xf0, 0x9a, 0xfc,
+0x13, 0xe0, 0xae, 0x11, 0x26, 0xfe, 0x5f, 0xab,
+
+0xb0, 0xe, 0x1a, 0xa7, 0x1, 0x3d, 0xfa, 0xd4,
+0xc2, 0x96, 0xce, 0x18, 0x53, 0x5f, 0x82, 0xe4,
+0x30, 0x91, 0x9, 0x6, 0x68, 0xf, 0x94, 0x20,
+0xb0, 0x58, 0x65, 0x8, 0xb5, 0xce, 0x69, 0x34,
+0x5, 0x6c, 0x3, 0xea, 0x92, 0x96, 0xa9, 0xf0,
+0x23, 0xb4, 0x93, 0xbc, 0xf8, 0x99, 0xd6, 0xda,
+0x97, 0x3e, 0xea, 0x92, 0x70, 0x9b, 0x7a, 0xc6,
+0x8c, 0xaf, 0x69, 0x3e, 0x5b, 0x5a, 0xd9, 0x59,
+0x4a, 0x59, 0xa5, 0xbe, 0x29, 0xf1, 0x79, 0x79,
+0x56, 0x2d, 0x92, 0x7e, 0x56, 0xe9, 0x56, 0x8b,
+0x71, 0xac, 0xf7, 0xe9, 0xc1, 0x59, 0x28, 0xe1,
+0x3f, 0x96, 0x4d, 0x28, 0xc6, 0x83, 0xbf, 0xf3,
+0xb, 0x8, 0x26, 0x39, 0x90, 0x22, 0x1e, 0x93,
+0xb2, 0x50, 0xa4, 0x4e, 0xa6, 0xcb, 0xa, 0x28,
+0xa7, 0xb9, 0xe5, 0x1a, 0x84, 0x8d, 0x98, 0xc1,
+0x8f, 0x7d, 0xc5, 0xe3, 0xea, 0xe6, 0x16, 0x83,
+
+0xed, 0xfc, 0x46, 0x11, 0x79, 0x69, 0xbe, 0x73,
+0x6e, 0x86, 0xa0, 0x58, 0x7, 0x14, 0x8, 0x92,
+0x9e, 0x26, 0x3, 0x72, 0xb1, 0x5b, 0x85, 0x5c,
+0x1f, 0x96, 0xfb, 0x59, 0x52, 0x48, 0x99, 0x7d,
+0x34, 0xd6, 0x68, 0x62, 0x3, 0xf3, 0x65, 0xcf,
+0x64, 0x78, 0x50, 0xc3, 0xe5, 0xbb, 0x57, 0x4e,
+0xc1, 0xce, 0xdf, 0x0, 0x63, 0x57, 0xd2, 0x6,
+0x75, 0x3d, 0x7b, 0x0, 0xa6, 0x7f, 0x88, 0x1c,
+0x96, 0x47, 0x7, 0xa3, 0x9, 0x61, 0x79, 0xed,
+0x86, 0x1e, 0xd9, 0xc2, 0xf0, 0x73, 0x6, 0x2b,
+0x74, 0x57, 0x5f, 0x5c, 0xea, 0xfc, 0x1a, 0xdf,
+0x67, 0x98, 0xa4, 0x72, 0x3f, 0x73, 0x10, 0x8a,
+0x9b, 0xd1, 0xbf, 0x8e, 0x22, 0x5b, 0x7d, 0x1e,
+0xc6, 0x8a, 0x9b, 0x6b, 0xbd, 0xdb, 0x43, 0x33,
+0xfb, 0x30, 0xf2, 0x24, 0xda, 0x2f, 0x54, 0xea,
+0xfc, 0xcc, 0x9, 0x98, 0x31, 0xc7, 0xfd, 0x3a,
+
+0xf1, 0xea, 0x2c, 0xbc, 0x2d, 0xfe, 0xfd, 0xb1,
+0x86, 0x1c, 0x3, 0x10, 0x59, 0xa5, 0x66, 0x5c,
+0xc2, 0x5e, 0x94, 0x23, 0x12, 0x3d, 0x52, 0x75,
+0x95, 0x5b, 0xa2, 0xaf, 0xf0, 0x11, 0x83, 0x9a,
+0x4, 0x96, 0xba, 0xaa, 0x6f, 0x5c, 0x26, 0x15,
+0x43, 0xd4, 0xc5, 0xbc, 0x74, 0xa9, 0xbf, 0xd8,
+0x5e, 0x92, 0x55, 0xa, 0x2e, 0xb6, 0xcf, 0xe6,
+0x6f, 0x11, 0x44, 0xf3, 0x39, 0x32, 0x69, 0xc8,
+0xe1, 0x74, 0x50, 0x34, 0x62, 0x14, 0x20, 0xd3,
+0xc2, 0xc8, 0x9c, 0x4e, 0x58, 0xb, 0xad, 0x7c,
+0xc0, 0xf5, 0xe8, 0xfe, 0x35, 0xd5, 0x2b, 0xb0,
+0x24, 0x83, 0x77, 0x1d, 0x69, 0x7a, 0x29, 0xd8,
+0x3c, 0x4d, 0xdf, 0xe5, 0x5b, 0x4c, 0xc5, 0x86,
+0xf2, 0xf8, 0x6b, 0x4e, 0x44, 0xad, 0xae, 0x92,
+0xa5, 0x24, 0xdd, 0x54, 0x66, 0x75, 0x83, 0x4a,
+0x89, 0xea, 0xc6, 0xef, 0xc6, 0xfb, 0xbd, 0x85,
+
+0xf8, 0x5b, 0xa, 0xc1, 0xf2, 0x3d, 0xbc, 0x3c,
+0xb7, 0x59, 0x5d, 0xbf, 0xac, 0x28, 0xd7, 0x99,
+0xbb, 0x95, 0x18, 0x98, 0x3d, 0xf6, 0xbd, 0x5a,
+0x35, 0xb2, 0x60, 0x97, 0x12, 0x8, 0xfd, 0x48,
+0xc, 0xfb, 0xf3, 0x9e, 0x6, 0x8, 0x22, 0xa5,
+0xa4, 0x92, 0xdb, 0xd4, 0x67, 0x85, 0xb2, 0x84,
+0x32, 0x6a, 0x45, 0xed, 0x5c, 0x63, 0x16, 0xe2,
+0xb1, 0x9b, 0xb9, 0x6a, 0x15, 0xd4, 0x53, 0x65,
+0xda, 0x4d, 0xac, 0xe7, 0xb7, 0x43, 0x2b, 0x1a,
+0x0, 0xaa, 0x62, 0xfd, 0xc, 0x3e, 0xed, 0xcc,
+0xb8, 0x25, 0x4d, 0x61, 0x12, 0xe5, 0xf6, 0x4c,
+0x79, 0xe, 0x7e, 0xe4, 0x88, 0x32, 0xf9, 0x88,
+0xd2, 0xd0, 0xd2, 0xf7, 0x83, 0xb0, 0xa3, 0xc1,
+0xf0, 0x1e, 0x43, 0x8c, 0x1b, 0xc5, 0xc0, 0xf7,
+0x39, 0x5d, 0x8, 0x79, 0xf6, 0xb1, 0x59, 0x33,
+0x94, 0xcd, 0xee, 0xcd, 0xd, 0x13, 0x11, 0xbd,
+
+0xba, 0x7b, 0x86, 0x3d, 0x31, 0x42, 0x89, 0xe1,
+0xde, 0xf9, 0xc0, 0x79, 0x94, 0x8, 0x93, 0xc3,
+0x45, 0xd5, 0xba, 0x55, 0x77, 0x66, 0x56, 0xce,
+0xdc, 0xbc, 0x50, 0x96, 0x49, 0xe2, 0xd1, 0xf9,
+0x20, 0xc1, 0x88, 0x8f, 0xe0, 0xd3, 0xaf, 0xc1,
+0xe4, 0xdf, 0x7c, 0xa2, 0xce, 0x92, 0xd1, 0x1e,
+0xd1, 0xbb, 0xe0, 0x26, 0xaf, 0x1f, 0x36, 0x40,
+0x8c, 0x22, 0xca, 0xe1, 0xe, 0x2f, 0x5d, 0x90,
+0x5a, 0x9b, 0x88, 0x91, 0x1f, 0x35, 0x74, 0xd6,
+0x13, 0x6f, 0xd1, 0xfe, 0xf6, 0x4, 0x80, 0xba,
+0x15, 0x27, 0x12, 0x27, 0x6a, 0x6, 0xf2, 0x94,
+0xeb, 0xd6, 0xf3, 0x1d, 0x89, 0x2f, 0xac, 0xb0,
+0x68, 0x2e, 0x8a, 0x51, 0x3d, 0x4e, 0xfc, 0xf6,
+0x6f, 0xc2, 0x24, 0x36, 0x0, 0x1, 0x34, 0xd6,
+0xa6, 0x35, 0x7b, 0x4b, 0xd1, 0x4a, 0x3f, 0xd1,
+0x8b, 0x44, 0xb, 0xe1, 0xe6, 0x35, 0x22, 0xdf,
+
+0x80, 0x71, 0xf1, 0xef, 0x8d, 0x26, 0x7e, 0x30,
+0x4e, 0x47, 0xde, 0xcf, 0x64, 0xdd, 0x28, 0xbe,
+0x1b, 0xbf, 0x95, 0x1b, 0x54, 0xda, 0x36, 0xad,
+0xf0, 0x9b, 0x92, 0x9e, 0x35, 0x74, 0x93, 0xd0,
+0x14, 0x8, 0x82, 0xfe, 0x29, 0xd7, 0xa1, 0x50,
+0x3, 0xc2, 0x21, 0xf3, 0x20, 0xa8, 0x53, 0x32,
+0xd9, 0x23, 0x6d, 0x9e, 0x9c, 0xb8, 0x93, 0x9a,
+0x8c, 0xb3, 0xa3, 0x69, 0xa6, 0x33, 0xba, 0x92,
+0x8, 0x96, 0xc5, 0x84, 0x89, 0x94, 0x2c, 0x81,
+0x3e, 0xe2, 0xd9, 0x57, 0x63, 0x8a, 0x89, 0x78,
+0x14, 0x17, 0x46, 0xac, 0x26, 0x21, 0x8f, 0xb,
+0x7, 0x4d, 0x5f, 0xff, 0xc1, 0xa5, 0xad, 0xbd,
+0xf2, 0x62, 0x79, 0x59, 0x56, 0x9a, 0x94, 0xd5,
+0xfe, 0x50, 0xba, 0xba, 0x6f, 0xd7, 0xb, 0xf,
+0xea, 0x9e, 0x49, 0xbb, 0x4, 0x5f, 0x2b, 0x3c,
+0x81, 0xe0, 0xab, 0xcb, 0xa6, 0x64, 0x7a, 0x2b,
+
+0x89, 0xfd, 0x2b, 0x3e, 0x3b, 0xc4, 0x15, 0x91,
+0x6c, 0x10, 0x47, 0x4a, 0xd4, 0x8d, 0xde, 0x36,
+0x3f, 0xbf, 0x3e, 0x70, 0xb3, 0x83, 0xb, 0x13,
+0xf2, 0x73, 0xa7, 0xe6, 0xfb, 0xc5, 0x4f, 0xbc,
+0xe, 0xc8, 0xc, 0xee, 0x61, 0x7b, 0x71, 0xce,
+0x29, 0xb9, 0xa6, 0xb8, 0xee, 0xbc, 0x27, 0x76,
+0x4a, 0x60, 0x2d, 0x11, 0xf, 0x64, 0x8c, 0x7,
+0x27, 0x6, 0xd8, 0x4e, 0x75, 0xeb, 0x98, 0x10,
+0x86, 0x49, 0x6c, 0x2d, 0x5f, 0xc, 0x15, 0xb0,
+0x35, 0x37, 0x29, 0xe5, 0xbd, 0xa9, 0xba, 0xea,
+0x3e, 0x4d, 0xc7, 0xd0, 0xdd, 0x1c, 0x57, 0x17,
+0xe5, 0xb7, 0x16, 0x46, 0x70, 0x1e, 0x47, 0x75,
+0x29, 0x2c, 0xd, 0x39, 0x85, 0xe8, 0xdf, 0xad,
+0x74, 0x2e, 0xf1, 0xda, 0x63, 0x9, 0xdc, 0x32,
+0xb8, 0x99, 0x66, 0xb1, 0x0, 0xc, 0x81, 0x5d,
+0x6f, 0x2b, 0xd4, 0xb4, 0xbf, 0xbc, 0x70, 0x3e,
+
+0x2c, 0xef, 0xd7, 0x19, 0xac, 0x86, 0x1e, 0xbc,
+0x99, 0xf9, 0xe, 0x18, 0xb1, 0x5b, 0x6, 0x22,
+0x67, 0xcb, 0x1a, 0x81, 0xb6, 0x96, 0x53, 0xf,
+0x31, 0xb5, 0x1d, 0x6c, 0xd2, 0x4a, 0xf8, 0x4b,
+0x3b, 0x8a, 0x4c, 0x30, 0x4e, 0x3c, 0xde, 0xc9,
+0x14, 0x63, 0x5a, 0xe1, 0x32, 0x4a, 0x66, 0x88,
+0x67, 0x93, 0x7c, 0xf9, 0xbe, 0x5d, 0x84, 0x4,
+0x28, 0x56, 0x21, 0xd4, 0x33, 0x6, 0x79, 0x30,
+0xd5, 0x17, 0xd5, 0x30, 0x63, 0x7c, 0x23, 0x67,
+0x3d, 0x30, 0x66, 0x63, 0x5d, 0xd9, 0xde, 0x20,
+0xd9, 0xfa, 0xcc, 0x13, 0x5c, 0x45, 0xef, 0xd8,
+0x83, 0xdd, 0xeb, 0x7e, 0xe2, 0x13, 0x1a, 0x74,
+0xe4, 0xad, 0x46, 0xfa, 0x33, 0x7, 0xe2, 0xa7,
+0x57, 0xf5, 0x86, 0xa1, 0xe6, 0xce, 0x12, 0x5b,
+0x21, 0xff, 0x43, 0x3d, 0x70, 0xf1, 0x59, 0x4b,
+0x53, 0x1c, 0xf, 0x56, 0x5e, 0xc0, 0x78, 0xd7,
+
+0x30, 0x32, 0xbe, 0xcb, 0xdf, 0x3c, 0xce, 0xb5,
+0xbe, 0x2e, 0x6c, 0x52, 0xd2, 0x74, 0x7e, 0x2e,
+0x84, 0x65, 0xcb, 0xfd, 0x90, 0x43, 0x60, 0x10,
+0x88, 0xa1, 0x4f, 0x63, 0xa1, 0x54, 0x7d, 0xbe,
+0x5e, 0x40, 0xbf, 0x7a, 0x77, 0x6d, 0xa, 0xca,
+0xa4, 0xaf, 0xbc, 0xe7, 0xe3, 0x85, 0xa7, 0x9c,
+0xcd, 0x2a, 0xde, 0xdc, 0xce, 0x29, 0x61, 0x0,
+0x9e, 0x89, 0x5, 0xf4, 0xf3, 0x6f, 0xb8, 0x3b,
+0xf6, 0x8c, 0x58, 0xd3, 0x43, 0x96, 0x10, 0x23,
+0x5a, 0xff, 0x3b, 0xc7, 0x7, 0x81, 0xdf, 0x53,
+0xda, 0x5e, 0x26, 0x82, 0xe3, 0xe7, 0xb0, 0xd9,
+0xca, 0x56, 0x71, 0xc6, 0x5, 0x1c, 0x9b, 0x7a,
+0x8e, 0x11, 0x16, 0xfd, 0x5e, 0x22, 0x9a, 0xd7,
+0x9e, 0x5e, 0x43, 0x8f, 0x8f, 0xe0, 0x2a, 0x7d,
+0xc0, 0x21, 0xc4, 0xf3, 0x3b, 0x42, 0xb, 0x44,
+0x7b, 0xac, 0x24, 0xf, 0x8b, 0x4c, 0x65, 0xd5,
+
+0xdf, 0x8f, 0x1, 0xec, 0xe, 0xa9, 0x96, 0x5f,
+0x91, 0x94, 0x83, 0x69, 0x8f, 0x9, 0xfb, 0x59,
+0x6, 0xa9, 0xd6, 0xa0, 0xa3, 0x8b, 0xb2, 0xb1,
+0xc8, 0xcd, 0xc1, 0xb1, 0xdf, 0xb0, 0x50, 0x80,
+0x6b, 0xed, 0x99, 0x37, 0x3b, 0x69, 0x36, 0x9c,
+0xd2, 0xc6, 0xb0, 0x44, 0x3f, 0x89, 0x4, 0x15,
+0x6a, 0xe1, 0xde, 0xd, 0x8c, 0x27, 0x81, 0x9b,
+0xb9, 0xcf, 0xdc, 0x8c, 0x9a, 0xdd, 0xf0, 0x8e,
+0xed, 0x6c, 0xe4, 0xfa, 0x11, 0xbf, 0xef, 0x54,
+0x83, 0xed, 0x8, 0xf1, 0x9a, 0x5a, 0x1f, 0xf,
+0xf6, 0xa0, 0xd4, 0xd6, 0x1d, 0x0, 0xca, 0x93,
+0x8d, 0x33, 0x15, 0x93, 0x38, 0x2f, 0x24, 0xed,
+0xd0, 0xe7, 0x16, 0x50, 0x9c, 0xf, 0x82, 0x6f,
+0xf1, 0xd1, 0x10, 0x24, 0xbc, 0x21, 0x41, 0x26,
+0x2d, 0x2b, 0xa8, 0xce, 0x34, 0xe4, 0x7c, 0x55,
+0x2c, 0x8b, 0x30, 0xa2, 0xbe, 0x5b, 0x47, 0xa3,
+
+0x1d, 0xa0, 0xf4, 0xc, 0xa4, 0xf8, 0x4c, 0x5f,
+0x9a, 0x97, 0xda, 0xca, 0x11, 0x5d, 0x78, 0xef,
+0x4e, 0x97, 0x71, 0xc5, 0xd7, 0x48, 0xa8, 0x68,
+0x3e, 0xfc, 0x6f, 0xc2, 0x29, 0x2f, 0x62, 0x80,
+0x72, 0x58, 0xbf, 0x54, 0xc1, 0x86, 0x23, 0x11,
+0xa2, 0x49, 0xa3, 0xf7, 0x19, 0x1b, 0xd6, 0xb1,
+0x50, 0xca, 0x1c, 0x1a, 0x7f, 0xb7, 0xd4, 0x15,
+0xc8, 0x88, 0x11, 0xf2, 0xc1, 0x53, 0x3b, 0xac,
+0x2, 0xef, 0x3, 0x67, 0xea, 0x3d, 0x69, 0x40,
+0xa6, 0x76, 0xd7, 0x20, 0x8d, 0x9b, 0x94, 0x54,
+0x5f, 0x72, 0x32, 0xd9, 0x79, 0x22, 0xe, 0x63,
+0x0, 0x86, 0x5f, 0xba, 0x4, 0xf4, 0xd2, 0xb3,
+0xa, 0xbe, 0x23, 0x30, 0x9d, 0x44, 0x97, 0x50,
+0x83, 0x74, 0x45, 0x33, 0x12, 0x60, 0x1, 0xe2,
+0x95, 0x1b, 0x7e, 0xd, 0x78, 0x3f, 0xa0, 0x9d,
+0xe0, 0x72, 0xfa, 0x9a, 0x6a, 0xc3, 0x7e, 0x47,
+
+0x5f, 0x32, 0x87, 0x6c, 0x2d, 0x88, 0xd8, 0x57,
+0x9, 0x43, 0x81, 0xc5, 0x76, 0xe7, 0x67, 0x44,
+0x19, 0x41, 0xea, 0x76, 0xdc, 0xd5, 0xd6, 0x38,
+0x43, 0x59, 0xa4, 0xda, 0x13, 0xd1, 0x8f, 0xa0,
+0x42, 0x8f, 0xf9, 0x64, 0x2f, 0x5a, 0x3e, 0x9c,
+0xee, 0x22, 0x2d, 0xe0, 0xcf, 0x20, 0x89, 0x6,
+0x57, 0x1, 0x17, 0x51, 0x19, 0x7a, 0x1c, 0xb4,
+0x18, 0x21, 0xec, 0x88, 0xad, 0x96, 0xe4, 0xfa,
+0xa, 0x98, 0x94, 0xaa, 0x76, 0xe7, 0x8, 0x68,
+0x45, 0xdb, 0xa5, 0xc0, 0xb2, 0xab, 0xc1, 0x14,
+0x38, 0xf1, 0x3b, 0x43, 0xec, 0x7d, 0x5e, 0xe3,
+0xfa, 0x82, 0x2b, 0x23, 0xfe, 0x50, 0x3e, 0x7b,
+0x27, 0xed, 0x24, 0x5e, 0x9d, 0xa0, 0xf7, 0x67,
+0x3f, 0x3a, 0xc1, 0xdd, 0x9b, 0x79, 0xf4, 0x86,
+0xab, 0xac, 0x27, 0xb0, 0xbf, 0x6b, 0xa5, 0xd7,
+0x7a, 0x7, 0xc6, 0xb0, 0xfc, 0xa6, 0xf9, 0xbf,
+
+0x47, 0x3, 0xfc, 0x4, 0xc3, 0x71, 0xd5, 0xb0,
+0xaa, 0xe4, 0x3e, 0xe8, 0x5c, 0x36, 0xfa, 0x89,
+0x21, 0x94, 0xba, 0x7c, 0x16, 0xbf, 0x1e, 0xff,
+0xd0, 0x47, 0xd5, 0x2a, 0x98, 0x46, 0x2a, 0x60,
+0x42, 0x13, 0xdb, 0xca, 0xe1, 0x3a, 0xd, 0xaf,
+0x89, 0xf2, 0x7c, 0x99, 0x6b, 0xbe, 0xb4, 0xd6,
+0x58, 0x8a, 0xf2, 0x99, 0x2, 0x81, 0xc4, 0x1f,
+0x10, 0x8f, 0x7c, 0x81, 0xe4, 0x23, 0x9f, 0x25,
+0x96, 0x1, 0x26, 0x44, 0x4, 0xa3, 0xef, 0x45,
+0x8, 0x8b, 0x1e, 0x20, 0x67, 0x89, 0x9b, 0xea,
+0xd8, 0x59, 0x22, 0xa6, 0xe0, 0x5f, 0x5c, 0xde,
+0x45, 0x97, 0x52, 0xb5, 0x45, 0x76, 0xe2, 0x13,
+0xdd, 0x29, 0x9a, 0x77, 0x2f, 0xb8, 0xf, 0x83,
+0xb0, 0x73, 0x3d, 0x96, 0x1c, 0xe5, 0xfc, 0xc2,
+0x31, 0x24, 0x6f, 0xa5, 0x9, 0x1f, 0x9b, 0xc7,
+0x58, 0x80, 0x32, 0xd, 0x25, 0xd7, 0x42, 0x7f,
+
+0x8a, 0x55, 0x23, 0x5, 0x68, 0xe5, 0x4c, 0xb3,
+0x8d, 0x17, 0xb8, 0x4f, 0xe5, 0xaa, 0x91, 0x15,
+0x46, 0xb5, 0x96, 0x6c, 0x4, 0xac, 0x93, 0x93,
+0xe4, 0xa5, 0x48, 0x42, 0x50, 0x18, 0x1d, 0x84,
+0x5b, 0xd2, 0x79, 0xb1, 0x44, 0x7f, 0x92, 0x7,
+0x14, 0xc3, 0x87, 0x7c, 0x1a, 0x32, 0xa0, 0x32,
+0xd3, 0x79, 0xc1, 0x1d, 0xec, 0x86, 0x98, 0x4,
+0xd, 0x65, 0xb6, 0x40, 0x1d, 0x31, 0x73, 0xdd,
+0x8c, 0x91, 0x23, 0x99, 0x9a, 0xa6, 0x82, 0xad,
+0xf6, 0xd4, 0x74, 0x6, 0x46, 0x46, 0x97, 0x5,
+0x42, 0xcf, 0x82, 0x7e, 0xc8, 0x8c, 0x4, 0xdc,
+0xff, 0x99, 0x8b, 0xa0, 0x18, 0x8f, 0xff, 0x44,
+0xdf, 0x2f, 0x8c, 0xd3, 0x67, 0x7b, 0x87, 0x8a,
+0xf4, 0xd, 0xe1, 0x5d, 0x70, 0xcc, 0x42, 0x69,
+0xa9, 0xb5, 0xff, 0x33, 0xac, 0xfe, 0xf6, 0x69,
+0xc1, 0x1f, 0xa5, 0x8d, 0x76, 0x0, 0xc7, 0xee,
+
+0xd7, 0xa5, 0x87, 0x51, 0xe0, 0x70, 0xf, 0x6d,
+0xf7, 0x3c, 0x72, 0x1e, 0x7, 0xd, 0xa, 0xa1,
+0x64, 0xce, 0xd7, 0x1c, 0xfb, 0xc, 0xd1, 0x53,
+0xb2, 0x39, 0xeb, 0x50, 0x59, 0x64, 0x8, 0x76,
+0x73, 0x56, 0x31, 0xf8, 0x24, 0xfd, 0x64, 0x8,
+0xbf, 0xb3, 0x3, 0xcf, 0x86, 0x80, 0xf1, 0x5a,
+0xa0, 0x79, 0x12, 0xe4, 0x80, 0x85, 0x52, 0x76,
+0x2f, 0xd9, 0x52, 0x16, 0x1a, 0xbb, 0x7e, 0x65,
+0x52, 0x65, 0x5e, 0xd, 0x85, 0x17, 0x2f, 0x2e,
+0x41, 0xc, 0x48, 0xe7, 0x19, 0x51, 0x3e, 0x6e,
+0x88, 0x22, 0xf, 0xb4, 0xfb, 0x30, 0x70, 0xf7,
+0x77, 0xa9, 0xd6, 0x90, 0xcd, 0x1b, 0x9b, 0x6b,
+0x28, 0x35, 0x9c, 0x36, 0xbf, 0xd4, 0x6f, 0xb7,
+0xd0, 0xc2, 0x29, 0x14, 0x22, 0xdf, 0x72, 0xc7,
+0x6e, 0x60, 0x34, 0xca, 0xe, 0x46, 0x14, 0xf1,
+0x54, 0x3e, 0x25, 0x49, 0x7c, 0x42, 0x3e, 0x38,
+
+0x7b, 0x17, 0x81, 0xf6, 0x4c, 0xf3, 0x84, 0x2,
+0x8e, 0x2c, 0xe7, 0x62, 0xa, 0x82, 0xbc, 0xb6,
+0x8f, 0x77, 0x3a, 0x1, 0x30, 0x77, 0xc5, 0xbf,
+0x58, 0x43, 0xcd, 0xfc, 0xfd, 0xba, 0x9, 0xe1,
+0x65, 0x5, 0xe5, 0x8f, 0xad, 0x64, 0x9f, 0xe7,
+0x5d, 0xa9, 0xb2, 0x6a, 0x7d, 0xca, 0xbd, 0x29,
+0xd0, 0xfe, 0xba, 0xac, 0xad, 0x46, 0xca, 0xa5,
+0xfe, 0xf0, 0x38, 0xef, 0x73, 0x0, 0x3a, 0x94,
+0xbb, 0x69, 0xcc, 0x7c, 0xdb, 0x4d, 0x83, 0xe8,
+0x7b, 0x4b, 0x2e, 0xd1, 0x37, 0xe3, 0x5b, 0x79,
+0xd, 0x1, 0x9c, 0x17, 0xe5, 0x88, 0x48, 0x65,
+0x1f, 0x9d, 0xc0, 0x2d, 0xe5, 0xcf, 0x56, 0x2f,
+0xac, 0x74, 0xf3, 0x23, 0xd, 0x51, 0x4e, 0x66,
+0x22, 0x3e, 0xa7, 0x39, 0xcc, 0xe2, 0xef, 0x1d,
+0xd2, 0x80, 0x35, 0x5b, 0xec, 0x5c, 0xe9, 0xf8,
+0xb7, 0x70, 0x5c, 0xf1, 0x9a, 0x6e, 0xfa, 0xda,
+
+0x0, 0xeb, 0x6a, 0x69, 0xfd, 0x26, 0x7d, 0xbb,
+0xcd, 0xc, 0x62, 0xa, 0x90, 0x3d, 0x9c, 0x37,
+0xfa, 0x9a, 0x84, 0x9e, 0x93, 0xac, 0xc4, 0xb9,
+0x32, 0x2d, 0xf5, 0x69, 0x27, 0x35, 0x86, 0x2,
+0x56, 0xbd, 0x85, 0x22, 0x54, 0x87, 0xf6, 0x77,
+0xfa, 0xc9, 0x62, 0xfb, 0xd3, 0x6f, 0x8f, 0x3,
+0x0, 0x56, 0x30, 0x6e, 0xc7, 0xd7, 0xd1, 0xd0,
+0x45, 0x6f, 0xe8, 0xcd, 0x8b, 0xbc, 0x81, 0xd0,
+0x3a, 0x1, 0x7, 0x85, 0x6d, 0x3b, 0xb0, 0x42,
+0x6c, 0xa2, 0x54, 0xeb, 0x5b, 0x60, 0x59, 0xa1,
+0x70, 0x34, 0x86, 0x1d, 0xb1, 0xba, 0xfb, 0x28,
+0x29, 0x73, 0xb, 0xa8, 0xb3, 0x31, 0x42, 0x4e,
+0xa6, 0x23, 0xee, 0x1e, 0x34, 0x8d, 0x8f, 0xc8,
+0xf3, 0x5b, 0xcd, 0x8e, 0x64, 0x15, 0x2e, 0xa1,
+0x81, 0x12, 0xad, 0x13, 0x8d, 0x8, 0x68, 0xe8,
+0xe2, 0xf2, 0xf4, 0xc4, 0x2a, 0x73, 0x30, 0x9b,
+
+0xb0, 0x12, 0x3b, 0x5e, 0xd0, 0x7a, 0x6c, 0x93,
+0x6f, 0x7c, 0x3f, 0xe4, 0x2c, 0xb2, 0x61, 0xb1,
+0xe1, 0xc4, 0x61, 0xfa, 0x9b, 0x92, 0xe, 0xe3,
+0x27, 0x85, 0x9c, 0xb6, 0xa2, 0x54, 0x62, 0x38,
+0x4a, 0xb8, 0x72, 0x8, 0xa3, 0xd8, 0x8d, 0xa1,
+0xef, 0x20, 0x75, 0x46, 0x76, 0xba, 0xae, 0x40,
+0x68, 0x14, 0x49, 0xd9, 0xfc, 0x2, 0x42, 0xca,
+0x83, 0xb2, 0x2b, 0xb6, 0x34, 0x58, 0x80, 0x26,
+0x82, 0xe8, 0xbe, 0x17, 0xe7, 0x26, 0xab, 0x11,
+0xc0, 0xea, 0xb0, 0x5b, 0x19, 0xef, 0xea, 0x61,
+0x9d, 0xe6, 0xa9, 0x82, 0xf1, 0xa0, 0xe6, 0xb3,
+0xda, 0xaf, 0xd2, 0xcf, 0x41, 0x8c, 0x32, 0xd4,
+0xa, 0xf0, 0xd2, 0xca, 0xe6, 0x41, 0x3d, 0x41,
+0x29, 0x93, 0x96, 0x39, 0x87, 0x5b, 0x85, 0x1f,
+0x61, 0xd8, 0x63, 0x45, 0xee, 0x4c, 0x2e, 0x42,
+0x4b, 0x7c, 0xa7, 0xe4, 0x20, 0xf6, 0x37, 0x63,
+
+0xfe, 0xb1, 0x28, 0xb9, 0xf0, 0x76, 0x30, 0xe7,
+0xce, 0x9e, 0xf6, 0xe9, 0x65, 0x5d, 0xcc, 0x20,
+0x70, 0xd8, 0x70, 0x3d, 0x87, 0x24, 0xa2, 0x56,
+0xc4, 0x93, 0xd3, 0xaa, 0xd0, 0xd6, 0x5c, 0x3d,
+0xd, 0xfc, 0x49, 0x61, 0x23, 0x94, 0x2c, 0x22,
+0xc3, 0x7e, 0xdc, 0xf7, 0x3f, 0x2, 0xcc, 0x2c,
+0xd2, 0xe0, 0x77, 0xc4, 0xda, 0xd2, 0x99, 0xe6,
+0x9, 0x6b, 0x60, 0x65, 0x82, 0x38, 0x7b, 0x60,
+0x53, 0x30, 0xc2, 0xb7, 0xd4, 0xe3, 0xec, 0xb0,
+0xc4, 0x50, 0x41, 0xcc, 0xe7, 0xa4, 0x3f, 0xed,
+0xc0, 0x27, 0x2b, 0xc4, 0x17, 0xb7, 0x98, 0x7f,
+0xcc, 0xe9, 0xb0, 0xfd, 0x1e, 0x9, 0x49, 0x20,
+0x88, 0x9e, 0x2d, 0xa6, 0x9, 0x32, 0x42, 0xc7,
+0x21, 0x2a, 0x85, 0x84, 0x42, 0xd8, 0x2d, 0x94,
+0x6b, 0x18, 0x45, 0x46, 0xd8, 0x69, 0xee, 0xff,
+0x15, 0xfb, 0x20, 0x4d, 0x6, 0xce, 0xf, 0x14,
+
+0x6c, 0x8d, 0xf3, 0xd, 0x53, 0x39, 0x80, 0x8,
+0x4f, 0x41, 0xe9, 0xe9, 0xae, 0x97, 0x1c, 0x53,
+0xae, 0x21, 0x1e, 0x99, 0xf8, 0x98, 0xe9, 0x6a,
+0xa0, 0x1f, 0x93, 0xd1, 0xd2, 0x5f, 0xb8, 0x26,
+0x25, 0x82, 0x34, 0xa9, 0x2a, 0xa7, 0xe7, 0x53,
+0x48, 0x37, 0x3e, 0x4f, 0x3d, 0xa9, 0x11, 0x28,
+0x4f, 0xa6, 0x1f, 0x34, 0xf4, 0x62, 0x44, 0x3c,
+0xf6, 0xe6, 0x84, 0xf9, 0xd, 0x59, 0x82, 0xc3,
+0xb1, 0x7f, 0x36, 0x6c, 0x95, 0x1a, 0x8e, 0x55,
+0x5c, 0x95, 0x53, 0xfe, 0xb0, 0x2c, 0xc7, 0xd,
+0xfe, 0x1c, 0x4a, 0xc5, 0x85, 0xe4, 0x23, 0xb3,
+0x46, 0xaa, 0x17, 0xd9, 0x24, 0x6e, 0xf6, 0x6b,
+0x8e, 0x5d, 0x6c, 0x48, 0x1c, 0x61, 0x16, 0x6d,
+0x94, 0xf7, 0xc6, 0xf3, 0xb6, 0xde, 0xb2, 0x4d,
+0xee, 0x25, 0x1a, 0x45, 0xb8, 0xd5, 0xdf, 0x46,
+0xcd, 0xc7, 0x93, 0xfe, 0x49, 0xd0, 0xc9, 0x63,
+
+0xd3, 0x9a, 0x16, 0xee, 0x5a, 0x93, 0xd7, 0x63,
+0x89, 0x9a, 0x6a, 0x68, 0x45, 0xb0, 0x2, 0x49,
+0xac, 0xb2, 0x8e, 0x1e, 0xb5, 0x8d, 0x4e, 0x61,
+0xb, 0xab, 0x35, 0x9c, 0x84, 0x51, 0xca, 0x2,
+0x15, 0x7c, 0x2b, 0x8d, 0x34, 0x92, 0xc2, 0x29,
+0x6c, 0xa7, 0x64, 0x1b, 0xbe, 0x6e, 0x8c, 0x7c,
+0x8d, 0x16, 0x31, 0x3f, 0x66, 0x65, 0xf7, 0xf1,
+0x56, 0x7b, 0x89, 0x5e, 0x21, 0x6f, 0xd9, 0x64,
+0x5e, 0x87, 0x20, 0x18, 0xb0, 0x94, 0x28, 0x78,
+0x42, 0x3, 0x5f, 0x34, 0x59, 0xd8, 0x96, 0x53,
+0xd1, 0xef, 0x4, 0xbc, 0xfb, 0x3b, 0xce, 0x65,
+0x7d, 0x16, 0xad, 0x60, 0x7e, 0xf, 0x5a, 0x57,
+0x76, 0xfa, 0x5, 0x79, 0x85, 0xba, 0x96, 0xab,
+0x50, 0xd4, 0x1f, 0x49, 0x8, 0xdd, 0xfc, 0x8e,
+0xa9, 0xa1, 0x46, 0x96, 0x47, 0xbe, 0x94, 0x5b,
+0x78, 0xb1, 0x29, 0x35, 0x6e, 0x42, 0x62, 0xb7,
+
+0x39, 0xcc, 0xbd, 0x7d, 0xfa, 0xc5, 0xcf, 0x4b,
+0x17, 0x1, 0x9a, 0xaf, 0xca, 0xd, 0xb2, 0xe8,
+0x21, 0x6f, 0x15, 0xa5, 0x74, 0x47, 0xea, 0x19,
+0xe4, 0x5d, 0x95, 0x4b, 0x6c, 0xc3, 0x78, 0xad,
+0x2, 0x2b, 0xed, 0xb4, 0xc3, 0x4e, 0xd5, 0x8,
+0x9, 0xde, 0xf9, 0x59, 0x1, 0xf3, 0x4e, 0xf6,
+0xac, 0x6f, 0xb2, 0x44, 0xa4, 0xd6, 0x3f, 0x8c,
+0x48, 0xb7, 0xf0, 0xbb, 0xd7, 0xa5, 0xd5, 0xc9,
+0xfe, 0x6b, 0x77, 0xdd, 0x2d, 0xda, 0x97, 0xff,
+0x8e, 0xbc, 0xd6, 0x43, 0x40, 0xa2, 0x69, 0x6b,
+0x38, 0x13, 0x8d, 0x53, 0xd2, 0xe0, 0xc1, 0x5a,
+0xe1, 0x97, 0xdc, 0x6c, 0x6d, 0x46, 0xce, 0x5a,
+0x71, 0xa7, 0x98, 0xf2, 0x38, 0xa, 0x82, 0x9d,
+0xe4, 0x5, 0xa2, 0xe5, 0x16, 0xcc, 0xb1, 0x0,
+0x73, 0x7, 0x73, 0x21, 0xf2, 0x46, 0xf7, 0xb6,
+0xed, 0x9a, 0x81, 0x1c, 0xae, 0x19, 0x59, 0x76,
+
+0x79, 0xdc, 0x3b, 0x6f, 0x6b, 0x96, 0xfc, 0x1a,
+0x9, 0x6, 0x55, 0x8a, 0x8, 0xa2, 0x6, 0x8a,
+0x32, 0x6, 0x38, 0x3a, 0xba, 0xc9, 0x40, 0xc,
+0xb0, 0x9c, 0x9, 0x29, 0xe1, 0x7b, 0x9, 0xae,
+0x30, 0xb8, 0x21, 0xbf, 0x8a, 0x64, 0x89, 0x43,
+0x47, 0xd, 0xc4, 0xee, 0xfd, 0xec, 0x75, 0x61,
+0xe8, 0xf7, 0x4c, 0xd2, 0x4b, 0xdb, 0x58, 0x2d,
+0x8a, 0xd9, 0x4c, 0xe4, 0xc8, 0xf5, 0xe, 0x42,
+0x4b, 0x7d, 0xdd, 0xa1, 0xdb, 0xe3, 0x97, 0x4e,
+0x34, 0x19, 0xed, 0xab, 0xfa, 0x4f, 0xb3, 0x32,
+0xd9, 0x3a, 0x6, 0x44, 0x30, 0x70, 0xa8, 0x94,
+0x11, 0x37, 0xc2, 0x18, 0x1f, 0xb3, 0x38, 0x7f,
+0xf, 0xc5, 0xad, 0xfa, 0xfd, 0x76, 0x2e, 0x34,
+0xa9, 0x6d, 0x50, 0x80, 0xf3, 0x84, 0xd4, 0x6f,
+0xd6, 0x1c, 0x4d, 0x70, 0xcb, 0xe, 0xf6, 0x36,
+0x6a, 0xf3, 0xbb, 0x83, 0xc5, 0x4c, 0x9c, 0x6b,
+
+0x32, 0x41, 0x4d, 0x3e, 0xf, 0x84, 0x41, 0xe8,
+0xbe, 0x7e, 0x23, 0x4c, 0x5a, 0x71, 0x48, 0xe7,
+0xe7, 0x4a, 0xb3, 0x88, 0xee, 0xe4, 0x47, 0xd5,
+0xde, 0x56, 0x89, 0x1d, 0x2b, 0xc2, 0xcc, 0xb5,
+0x3, 0x4d, 0xcc, 0x9a, 0xa4, 0x3, 0x40, 0xce,
+0x1f, 0xbc, 0xb8, 0x9d, 0x2b, 0x88, 0x11, 0xda,
+0xe2, 0x6f, 0x66, 0x86, 0xeb, 0x68, 0x91, 0x2b,
+0xf9, 0x18, 0xc7, 0x67, 0x81, 0xfa, 0xf5, 0xee,
+0xf0, 0x21, 0x1a, 0x6b, 0xcb, 0x5d, 0xfc, 0x9a,
+0x64, 0xd3, 0x12, 0xe, 0xa1, 0x81, 0xfd, 0xec,
+0xe9, 0x6a, 0xb1, 0x20, 0x23, 0xd6, 0xfe, 0x77,
+0xc8, 0x99, 0x1b, 0x21, 0x1e, 0x8b, 0xc, 0x57,
+0x11, 0x6, 0xc9, 0x88, 0xbc, 0x92, 0xff, 0xa0,
+0xa4, 0x54, 0x45, 0xc5, 0x47, 0x2c, 0x81, 0x2a,
+0x32, 0x69, 0xfb, 0x2c, 0xa7, 0x99, 0x6f, 0x79,
+0x41, 0xf2, 0x22, 0xe9, 0x3b, 0x59, 0xa, 0x41,
+
+0xb7, 0x85, 0x32, 0xa9, 0xe0, 0x96, 0xcd, 0x1c,
+0xf7, 0x10, 0x94, 0xa0, 0xa6, 0x1, 0x66, 0x2b,
+0xf3, 0x9a, 0x82, 0x3d, 0x34, 0x20, 0xa9, 0x7a,
+0x1, 0xcb, 0x10, 0x91, 0x6b, 0xb0, 0x2a, 0xec,
+0x77, 0xb1, 0x35, 0x53, 0xe6, 0xc9, 0x42, 0xe9,
+0x59, 0xc2, 0xd8, 0x6, 0x3e, 0x50, 0xba, 0xe2,
+0xcf, 0xe0, 0x65, 0x5f, 0xde, 0x58, 0xc6, 0x22,
+0x6c, 0x16, 0x70, 0x96, 0x4c, 0x8c, 0xd1, 0xe2,
+0x4f, 0x82, 0x3a, 0x98, 0x6, 0x4e, 0x67, 0xae,
+0x9c, 0x0, 0x9f, 0x3f, 0x20, 0xa2, 0x7a, 0x69,
+0xc3, 0x7a, 0xd6, 0x73, 0xef, 0x5f, 0xf3, 0xb9,
+0xbd, 0x68, 0xe5, 0x9b, 0xeb, 0xdb, 0x1c, 0x1,
+0x83, 0x5, 0x48, 0x94, 0x63, 0x8e, 0xfb, 0x23,
+0x17, 0x66, 0xfc, 0xa0, 0x66, 0x26, 0x9d, 0x69,
+0xdb, 0xca, 0xef, 0x20, 0x3b, 0x41, 0x4e, 0x10,
+0x8d, 0x5c, 0x1a, 0x46, 0xef, 0x48, 0x13, 0xb7,
+
+0xfc, 0x1c, 0x63, 0xaf, 0x63, 0x54, 0x72, 0x88,
+0x46, 0xf0, 0xe6, 0x2d, 0x14, 0x7f, 0x3b, 0x8b,
+0xd0, 0x2c, 0xb0, 0x5d, 0x8f, 0x82, 0x33, 0x36,
+0x76, 0xa0, 0xa8, 0x2d, 0x8, 0x1a, 0x4e, 0xd1,
+0x34, 0xb8, 0xac, 0x3c, 0xe9, 0x75, 0x97, 0xa1,
+0x96, 0x36, 0xfe, 0xad, 0xcd, 0x9d, 0x7d, 0xc9,
+0xb6, 0x58, 0xbc, 0xa3, 0x1b, 0x47, 0xb, 0x87,
+0x4c, 0x3a, 0xae, 0x85, 0xb7, 0xd5, 0xb7, 0x94,
+0xc1, 0x2e, 0x39, 0x85, 0x74, 0x2e, 0xc1, 0x7f,
+0x7c, 0x81, 0xd6, 0x17, 0xbd, 0x7a, 0x4d, 0xb8,
+0x95, 0x8c, 0x4b, 0x9c, 0x8c, 0x33, 0x30, 0xc1,
+0x45, 0xf6, 0x2f, 0x74, 0xc6, 0x89, 0x24, 0x87,
+0x3a, 0xb6, 0x7d, 0x89, 0x13, 0x40, 0x1e, 0xf9,
+0x8a, 0xf8, 0xf1, 0xcd, 0x7, 0xc3, 0x29, 0x4e,
+0x1, 0xc4, 0x1f, 0xf9, 0x81, 0xca, 0x5e, 0x1,
+0xc8, 0xb3, 0xb7, 0xf6, 0x6d, 0x38, 0x31, 0x18,
+
+0x4f, 0xd, 0x10, 0x96, 0x61, 0xfc, 0x72, 0xce,
+0xc2, 0xbb, 0xfe, 0x11, 0xfa, 0xf4, 0x26, 0x54,
+0xf, 0x40, 0x26, 0xe0, 0x5, 0x93, 0xf8, 0xe9,
+0x7f, 0x7b, 0x44, 0x75, 0xeb, 0x30, 0xa7, 0xde,
+0x2f, 0xb3, 0x29, 0x93, 0x17, 0x8b, 0x19, 0x1a,
+0xcf, 0xf, 0xb9, 0xee, 0xb2, 0xbb, 0xc1, 0xf3,
+0x4, 0x7b, 0xb0, 0xd, 0xf5, 0x4a, 0x57, 0xdd,
+0xf5, 0xac, 0x9e, 0xf5, 0x97, 0x7e, 0x87, 0xbb,
+0x3b, 0xb5, 0x8e, 0x53, 0xc7, 0x81, 0x9, 0xa3,
+0x12, 0x8a, 0x42, 0x2b, 0xa, 0x7a, 0xfc, 0x1f,
+0xba, 0x4b, 0xab, 0xe9, 0xe8, 0x21, 0xda, 0xae,
+0x33, 0x47, 0xd9, 0x1b, 0x44, 0x7a, 0x2f, 0xdc,
+0x53, 0xf7, 0xf2, 0xa8, 0xab, 0x76, 0x3f, 0x7b,
+0xaa, 0xa2, 0x6a, 0xd0, 0x88, 0xc1, 0x1b, 0x47,
+0x16, 0x66, 0x69, 0xe, 0x75, 0x97, 0x9c, 0x17,
+0xe, 0x60, 0x2a, 0x68, 0xc3, 0x11, 0xdf, 0x4,
+
+0xc8, 0xc4, 0xce, 0x61, 0x25, 0xf6, 0x34, 0x2b,
+0x61, 0x50, 0x91, 0x1d, 0x35, 0xcb, 0x6b, 0x91,
+0x2f, 0x8e, 0x9c, 0x69, 0xce, 0xfe, 0x1f, 0x62,
+0x22, 0x3f, 0x8f, 0xb4, 0x5f, 0x29, 0x5a, 0x8f,
+0x1e, 0x8a, 0xbd, 0x6, 0x5d, 0xe, 0xb, 0xd9,
+0xd6, 0x53, 0x68, 0xd0, 0x14, 0xb4, 0xb5, 0xf5,
+0xa0, 0x5e, 0x4e, 0x2e, 0x91, 0x5b, 0xd4, 0xfc,
+0xcf, 0x58, 0x38, 0x10, 0xa5, 0x78, 0x8a, 0xdb,
+0xa5, 0xa, 0xad, 0x7a, 0xa, 0x72, 0xc0, 0xe2,
+0xe2, 0xf5, 0x40, 0xb9, 0x7b, 0x47, 0xad, 0xa3,
+0xfe, 0x11, 0x9d, 0x3f, 0x37, 0xc4, 0x82, 0x44,
+0x3, 0xa4, 0x29, 0xf1, 0xe4, 0x29, 0x29, 0x27,
+0xb6, 0x30, 0x85, 0x95, 0x2b, 0x82, 0xb2, 0x55,
+0x4b, 0x69, 0x5a, 0x4, 0x89, 0x84, 0x1f, 0x96,
+0xa8, 0x5b, 0x59, 0x83, 0x6e, 0x62, 0xeb, 0x9c,
+0xfe, 0x97, 0x30, 0x1d, 0x9c, 0x16, 0x26, 0x7d,
+
+0x7d, 0x9c, 0x59, 0x60, 0x81, 0x8b, 0x65, 0x29,
+0xb1, 0x2f, 0xb3, 0x34, 0x11, 0xa8, 0x19, 0x5f,
+0xde, 0xf5, 0x65, 0xea, 0xb8, 0x55, 0xc3, 0xe1,
+0x1c, 0xac, 0x3a, 0x7, 0xd8, 0xeb, 0x91, 0x51,
+0x3e, 0x4e, 0x24, 0xb, 0xa3, 0x7f, 0x59, 0x86,
+0xeb, 0x7d, 0x33, 0xe9, 0x3e, 0x58, 0xa9, 0x68,
+0x6d, 0x70, 0x12, 0xb3, 0xbb, 0xf7, 0x21, 0x2d,
+0x30, 0xca, 0x83, 0x2, 0x11, 0xb9, 0xc2, 0x52,
+0xb8, 0xd4, 0xc1, 0x52, 0xdc, 0x8c, 0xd, 0x2e,
+0x95, 0x84, 0x58, 0x54, 0xa0, 0x22, 0xe4, 0xa4,
+0xf1, 0xa3, 0xa4, 0xd4, 0x5d, 0x27, 0x6c, 0x83,
+0x3d, 0xfe, 0x90, 0xd9, 0x61, 0x43, 0x40, 0x2,
+0x4d, 0x64, 0x6f, 0xd6, 0x74, 0xc, 0x58, 0x38,
+0x7c, 0x3, 0xf3, 0x77, 0x30, 0xcc, 0x29, 0x8d,
+0x9d, 0xf9, 0x56, 0xea, 0x6b, 0xa8, 0x1a, 0x7,
+0xd0, 0xa0, 0xe8, 0x48, 0x93, 0xa3, 0x19, 0x9b,
+
+0xc4, 0x4, 0x57, 0x5, 0xec, 0x63, 0xd6, 0x6f,
+0xb2, 0xf7, 0x48, 0x65, 0x24, 0x19, 0xcb, 0x20,
+0x78, 0xb4, 0xaf, 0xe8, 0x6c, 0x92, 0x7d, 0x86,
+0x49, 0xab, 0x5, 0x7, 0xfc, 0x11, 0xc6, 0x70,
+0x66, 0xac, 0xbc, 0x70, 0x7e, 0x9d, 0x34, 0xb0,
+0x50, 0x41, 0x35, 0xf9, 0xc2, 0x6c, 0xf4, 0xf,
+0x17, 0xe0, 0xa7, 0xc2, 0x7a, 0xbf, 0xf4, 0xa1,
+0x11, 0xb, 0xe4, 0x52, 0xbf, 0x7c, 0x38, 0x29,
+0xfa, 0x34, 0x32, 0x44, 0x14, 0x99, 0x79, 0x6b,
+0xb3, 0x5b, 0xd, 0x1, 0x5f, 0xc3, 0x33, 0x57,
+0xb0, 0x4b, 0xe, 0x28, 0x36, 0xcf, 0xff, 0xf4,
+0x19, 0xf, 0x91, 0x4b, 0xcb, 0x93, 0xcc, 0x6c,
+0xc7, 0xfd, 0x2b, 0x57, 0x38, 0x15, 0x7b, 0x6e,
+0xda, 0x83, 0xed, 0xcf, 0x28, 0x32, 0x2b, 0xda,
+0x82, 0x55, 0x49, 0x68, 0xf8, 0x66, 0xb1, 0x13,
+0x11, 0xa9, 0xe0, 0xef, 0xb0, 0x87, 0xec, 0x2,
+
+0xe7, 0x64, 0x49, 0x58, 0x93, 0xd9, 0x87, 0xb3,
+0xfa, 0x50, 0x39, 0x3e, 0xe8, 0x3c, 0xdc, 0x7c,
+0x41, 0x21, 0x95, 0xf7, 0xae, 0xa8, 0xa6, 0xc2,
+0xab, 0x1b, 0xec, 0x67, 0xd9, 0xd5, 0xca, 0xac,
+0x2, 0xe5, 0x72, 0x59, 0xab, 0x29, 0x74, 0x52,
+0xc8, 0xf8, 0x1b, 0x10, 0xd4, 0xe9, 0xc2, 0x1a,
+0x25, 0xfc, 0xa8, 0xca, 0x41, 0x4b, 0x16, 0x2c,
+0x4d, 0x11, 0x20, 0xa5, 0x4a, 0xa9, 0xbc, 0x55,
+0xbc, 0x8, 0x79, 0x92, 0x4b, 0xe2, 0x4e, 0x30,
+0x26, 0x76, 0xf4, 0xd3, 0x37, 0x68, 0x17, 0xca,
+0xcc, 0xd0, 0x71, 0x38, 0x5, 0x44, 0x7e, 0xd4,
+0x69, 0xbe, 0xd7, 0xdd, 0xd4, 0x2f, 0x76, 0x8f,
+0x41, 0x13, 0x51, 0x5, 0x15, 0x4e, 0x56, 0x75,
+0x1a, 0x4f, 0x93, 0x4e, 0x89, 0x1f, 0xef, 0x77,
+0x59, 0xe2, 0xbf, 0x4a, 0x86, 0xcc, 0x76, 0x20,
+0x9a, 0xfe, 0x3a, 0xbb, 0x7f, 0xb5, 0xed, 0x27,
+
+0x7a, 0xee, 0x1, 0xca, 0xda, 0x8a, 0xd6, 0x6,
+0xe4, 0xdc, 0xe, 0xb4, 0x43, 0xa7, 0x21, 0x55,
+0x71, 0x38, 0xc4, 0x44, 0xf, 0x9d, 0x77, 0xad,
+0x32, 0xea, 0x41, 0x9a, 0xa8, 0x99, 0x39, 0xb2,
+0xc, 0x28, 0xf3, 0x89, 0x7b, 0xee, 0x2a, 0x76,
+0x23, 0xc8, 0xc4, 0xa, 0x8e, 0x2, 0xc0, 0xa6,
+0x96, 0xe, 0x4e, 0xf6, 0x91, 0xb1, 0x1a, 0x38,
+0x46, 0x62, 0x24, 0x37, 0x60, 0xf8, 0x3e, 0x8d,
+0xe9, 0x7, 0x1f, 0x88, 0xcf, 0xab, 0xae, 0x3e,
+0x80, 0x74, 0xc9, 0x1, 0x8c, 0x81, 0xc1, 0xa,
+0x7, 0x10, 0x7c, 0x72, 0xf5, 0xb7, 0x0, 0x3f,
+0x7b, 0xfa, 0xe4, 0x4, 0xf4, 0x6d, 0x87, 0x6e,
+0xbb, 0x55, 0xce, 0xaf, 0xd9, 0x8e, 0xbd, 0xfc,
+0x67, 0x8c, 0x1d, 0x9, 0x98, 0x65, 0x84, 0xda,
+0xc6, 0xb8, 0x6f, 0xba, 0x9c, 0x20, 0x83, 0xeb,
+0x6e, 0xa1, 0x92, 0x29, 0xb3, 0xe7, 0x35, 0xf3,
+
+0x7e, 0xaa, 0xc6, 0xcb, 0xb7, 0x7b, 0x73, 0xbd,
+0xd2, 0xca, 0x8, 0xa3, 0xb4, 0x12, 0x94, 0x8c,
+0xe9, 0xf4, 0x20, 0xa2, 0xbb, 0x22, 0xc, 0x7e,
+0x83, 0x1a, 0x58, 0xe9, 0xd2, 0x5, 0x49, 0x5,
+0x53, 0xe6, 0x44, 0x81, 0x5c, 0x4d, 0x67, 0x7d,
+0x81, 0xcd, 0xb0, 0x69, 0xf6, 0x46, 0x11, 0xf5,
+0x42, 0x9c, 0xa3, 0xce, 0x8e, 0x3b, 0x81, 0x53,
+0x1d, 0x34, 0x29, 0xcc, 0x50, 0x38, 0x8, 0x5c,
+0x71, 0xf4, 0xbe, 0x48, 0x44, 0x8f, 0x9, 0x1f,
+0xa1, 0x3e, 0xfc, 0xa8, 0x4c, 0x3, 0x4, 0x5e,
+0x7f, 0xed, 0x8f, 0xc8, 0x26, 0x45, 0x8, 0xaf,
+0x83, 0xa8, 0xa7, 0x96, 0xb5, 0xd5, 0x53, 0x9c,
+0xc2, 0x82, 0x9, 0xe3, 0x77, 0x5, 0x48, 0xf6,
+0x87, 0x98, 0x74, 0x32, 0x93, 0x56, 0x7e, 0xb,
+0x7e, 0x59, 0x5, 0xfe, 0x77, 0x5f, 0xa1, 0x2a,
+0x28, 0x16, 0xf0, 0xb9, 0x85, 0x9c, 0x19, 0xc2,
+
+0x21, 0x97, 0x11, 0x13, 0xb5, 0x8, 0x6, 0xe8,
+0x10, 0xe8, 0xdc, 0x87, 0xc3, 0x2c, 0x26, 0xa8,
+0x3f, 0xdd, 0x20, 0x60, 0x58, 0x5c, 0x56, 0x34,
+0xb8, 0x5c, 0xb6, 0x57, 0xe0, 0xf1, 0x9b, 0x3f,
+0x41, 0x16, 0xac, 0x18, 0x9c, 0x83, 0xcf, 0xa2,
+0x81, 0xdd, 0xc8, 0xf3, 0x5e, 0xda, 0x3a, 0x91,
+0xb1, 0x77, 0xb9, 0x49, 0x4a, 0x83, 0x89, 0x79,
+0x47, 0x8a, 0xb8, 0xa8, 0x42, 0xa6, 0x3, 0x31,
+0x1b, 0xe6, 0xc0, 0xed, 0x41, 0x51, 0xf8, 0x7a,
+0x40, 0x1, 0x93, 0x45, 0x9, 0x53, 0x2b, 0x5c,
+0x8d, 0xf6, 0x42, 0x42, 0xd3, 0xfe, 0xef, 0x5,
+0x87, 0x6e, 0x16, 0x43, 0xe5, 0xcf, 0x49, 0x7d,
+0xc6, 0xc7, 0x1, 0xc3, 0x4f, 0x44, 0xa2, 0x51,
+0x8, 0xe8, 0xd4, 0x7a, 0x4c, 0x7f, 0xae, 0x89,
+0xd8, 0x37, 0xd2, 0x33, 0xcc, 0xb7, 0x9a, 0xc3,
+0x59, 0x83, 0xe0, 0xc9, 0xa7, 0xe4, 0x83, 0x13,
+
+0xa1, 0xd7, 0xd7, 0x18, 0x5, 0x55, 0x43, 0x5a,
+0xbc, 0x5e, 0x7c, 0x95, 0x59, 0x4e, 0x77, 0xe6,
+0x15, 0x44, 0xf5, 0x4c, 0x65, 0x8f, 0x2, 0xdc,
+0xa, 0x15, 0x83, 0x9f, 0x95, 0x5b, 0x18, 0x4e,
+0x6e, 0x4d, 0x6f, 0x6c, 0xce, 0x99, 0x7e, 0xa5,
+0x34, 0x3e, 0x1b, 0xb4, 0xb4, 0x1c, 0xa1, 0x70,
+0x35, 0xb9, 0x3b, 0xe4, 0x86, 0xcb, 0xfe, 0xc8,
+0x67, 0x86, 0xd6, 0x5a, 0x8a, 0x2, 0x9e, 0xc9,
+0x23, 0xfc, 0xe3, 0x50, 0x5a, 0xaa, 0xb4, 0xd,
+0xb9, 0xb6, 0x6f, 0xc2, 0xdf, 0xc8, 0x9, 0x5a,
+0x9, 0xf, 0xf9, 0x5f, 0xaf, 0xd7, 0x26, 0x7e,
+0xb7, 0x15, 0xbf, 0x6d, 0xb9, 0xc8, 0x10, 0x61,
+0x1a, 0x8f, 0xaf, 0xcb, 0x82, 0xe1, 0xc0, 0x3e,
+0xce, 0x43, 0x44, 0x82, 0x22, 0xcb, 0x64, 0x5f,
+0xa8, 0xd0, 0xfc, 0x9e, 0x5f, 0x6c, 0x3f, 0x78,
+0xe9, 0x67, 0xa, 0xac, 0x22, 0x66, 0x57, 0x95,
+
+0xa, 0x95, 0xf0, 0xa7, 0xae, 0x1, 0x32, 0x8,
+0xb3, 0xe1, 0x5c, 0x3d, 0xa4, 0x65, 0xac, 0xa0,
+0x0, 0x3f, 0xad, 0xbd, 0xbb, 0xce, 0xfc, 0xb4,
+0x37, 0xf1, 0xd, 0xfa, 0x6c, 0x22, 0x75, 0xea,
+0x70, 0x7b, 0x6, 0x18, 0xcf, 0x50, 0x33, 0xc2,
+0xe2, 0x7f, 0x35, 0xd1, 0x47, 0xd8, 0x74, 0x83,
+0x5a, 0x8e, 0xe2, 0xf6, 0x2d, 0xa3, 0xa5, 0x90,
+0xc2, 0x52, 0xf4, 0xd2, 0xbd, 0xa6, 0xde, 0xc2,
+0x5b, 0xc6, 0xaf, 0xdc, 0xc4, 0xec, 0xd2, 0xb1,
+0x17, 0xb9, 0x50, 0x8d, 0xc7, 0x57, 0xa5, 0x31,
+0xa8, 0x50, 0xe6, 0xa, 0xcd, 0xe1, 0x93, 0xa1,
+0xd8, 0x84, 0xf6, 0x4, 0xa5, 0x4, 0xf3, 0x4e,
+0x16, 0xea, 0x91, 0x22, 0xd2, 0xeb, 0xd7, 0x82,
+0xe3, 0xdb, 0x4e, 0x55, 0x5, 0xd7, 0xfd, 0x74,
+0xaa, 0x87, 0xa7, 0x87, 0xb3, 0xf3, 0x9, 0x4b,
+0xfe, 0x69, 0x27, 0xa, 0x1a, 0x5e, 0x67, 0xcb,
+
+0xe9, 0x23, 0xb, 0x62, 0xe3, 0xd9, 0xb7, 0xc4,
+0x1c, 0x7a, 0xe9, 0x78, 0x3f, 0x98, 0x25, 0xef,
+0x2, 0x2c, 0x2a, 0xa4, 0x71, 0x5, 0xa6, 0xa0,
+0x5e, 0x1c, 0x5d, 0x4e, 0x48, 0x97, 0x9b, 0x12,
+0x71, 0xe1, 0x2f, 0xf9, 0x14, 0xfd, 0xa4, 0x9d,
+0x93, 0xd0, 0x64, 0x93, 0xda, 0xda, 0x8, 0x4,
+0x16, 0x9b, 0xbc, 0xa7, 0xd1, 0x2, 0xbf, 0x1f,
+0xed, 0x5a, 0x4c, 0x4a, 0x94, 0x29, 0xc, 0x77,
+0x8b, 0xcd, 0x10, 0x37, 0xca, 0x92, 0x98, 0x1b,
+0x30, 0x2f, 0x83, 0x4d, 0x53, 0x35, 0x29, 0x53,
+0x87, 0x90, 0xb9, 0x38, 0x41, 0x68, 0xd0, 0x79,
+0xf9, 0xf4, 0xb, 0x2e, 0x76, 0x5e, 0x39, 0xc3,
+0x99, 0xa3, 0x91, 0x90, 0xf9, 0x9, 0x85, 0x9,
+0x20, 0xca, 0xa1, 0x49, 0xd7, 0xd2, 0xc6, 0x8f,
+0xe0, 0x15, 0x61, 0xc, 0xd6, 0xa1, 0x88, 0xdd,
+0x49, 0x72, 0xa2, 0x50, 0xd2, 0xf4, 0x71, 0x3,
+
+0xc4, 0x7e, 0xa4, 0x9b, 0x7c, 0xf2, 0x78, 0x3f,
+0x3e, 0xcc, 0x67, 0xda, 0xa9, 0x5e, 0x19, 0x27,
+0x48, 0x7b, 0xbd, 0x36, 0xb9, 0xc1, 0x55, 0x34,
+0x99, 0xaf, 0xb6, 0xe6, 0x29, 0xc9, 0xcc, 0x62,
+0x5a, 0x5f, 0xfd, 0xa0, 0x92, 0xab, 0x61, 0x75,
+0x3b, 0x17, 0x2c, 0x9, 0x3a, 0xed, 0xfd, 0x14,
+0x35, 0xc0, 0xcb, 0xb9, 0x4d, 0xa2, 0x64, 0x60,
+0x7, 0xe, 0x61, 0x78, 0xe1, 0x1a, 0xdd, 0xda,
+0x57, 0xe9, 0xff, 0xf2, 0x6c, 0x22, 0x37, 0xa5,
+0x3d, 0xfb, 0xb, 0x67, 0x40, 0x34, 0xf1, 0x8e,
+0x7, 0xe4, 0x2a, 0xe4, 0x85, 0x5e, 0xa7, 0x9d,
+0x9f, 0xed, 0x88, 0xc2, 0xcf, 0x0, 0xed, 0xd3,
+0x77, 0x6a, 0xfc, 0x3e, 0x87, 0x56, 0x39, 0xa3,
+0xa6, 0x79, 0xa7, 0xf1, 0xad, 0x98, 0x94, 0x86,
+0x41, 0x68, 0x4c, 0xc6, 0xf5, 0xc3, 0xeb, 0x80,
+0xc5, 0x68, 0x5f, 0x1f, 0x83, 0x20, 0x5c, 0xa3,
+
+0x45, 0xde, 0xf9, 0x2, 0xcf, 0xe0, 0x57, 0xc8,
+0x76, 0x43, 0x75, 0x4e, 0x21, 0xa4, 0x75, 0x42,
+0x81, 0xa0, 0x18, 0xe2, 0xee, 0x4, 0xed, 0x88,
+0x50, 0xcc, 0xde, 0xd8, 0xa4, 0x58, 0x13, 0xe7,
+0x7d, 0x88, 0x54, 0x71, 0x2c, 0x5d, 0x9a, 0xe0,
+0x91, 0xf9, 0x83, 0x84, 0x1c, 0x73, 0xff, 0x6a,
+0x79, 0x8b, 0x54, 0x25, 0x2f, 0x7f, 0x2f, 0xae,
+0x4b, 0x9c, 0x95, 0xc8, 0x88, 0xb1, 0x75, 0xc6,
+0xb6, 0xdc, 0xcf, 0x84, 0x91, 0x44, 0xb7, 0x73,
+0x22, 0x30, 0x38, 0x49, 0xda, 0x1d, 0xe3, 0x19,
+0xdd, 0xf1, 0x32, 0xb6, 0xaf, 0xed, 0x36, 0xde,
+0xf2, 0x3e, 0xfb, 0x42, 0x11, 0x8c, 0xdc, 0x3d,
+0x8c, 0xd0, 0x71, 0xdc, 0x8a, 0xe3, 0x22, 0xfb,
+0xca, 0x87, 0xfb, 0x9c, 0x9a, 0xa1, 0xfb, 0xbb,
+0x5b, 0x4b, 0x6b, 0xd0, 0xf5, 0x67, 0x8b, 0xd7,
+0x85, 0x43, 0xb2, 0x4f, 0x9d, 0x34, 0x46, 0x23
diff --git a/epid/common-testhelper/testdata/grp01/verrl.inc b/epid/common-testhelper/testdata/grp01/verrl.inc
new file mode 100644
index 0000000..36c5f92
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp01/verrl.inc
@@ -0,0 +1,151 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+// VerRl
+
+// gid
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x2A,
+// B
+0x41, 0x63, 0xfd, 0x06, 0xb8, 0xb1, 0xa6, 0x32, 0xa5, 0xe3, 0xeb, 0xc4,
+0x40, 0x11, 0x37, 0xc0, 0x62, 0x0d, 0xe1, 0xca, 0xe9, 0x79, 0xad, 0xff,
+0x1d, 0x13, 0xb3, 0xda, 0xa0, 0x10, 0x8a, 0xa8, 0x30, 0x72, 0xa4, 0xe8,
+0x27, 0xb5, 0xad, 0xdb, 0xac, 0x89, 0xd8, 0x37, 0x79, 0xd9, 0x8c, 0xd0,
+0xb3, 0xef, 0x94, 0x17, 0x4f, 0x05, 0x53, 0x4c, 0x4d, 0xf0, 0x77, 0xf7,
+0xb6, 0xaf, 0xb8, 0xfa,
+// version
+0x00, 0x00, 0x00, 0x00,
+// n4
+0x00, 0x00, 0x00, 0x11,
+// k's
+0xdc, 0x41, 0x24, 0xe7, 0xb8, 0xf2, 0x6d, 0xc4, 0x01, 0xf9, 0x5d, 0xf8,
+0xd9, 0x23, 0x32, 0x29, 0x0a, 0xe1, 0xf6, 0xdc, 0xa1, 0xef, 0x52, 0xf7,
+0x3a, 0x3c, 0xe6, 0x7e, 0x3d, 0x0e, 0xe8, 0x86, 0xa9, 0x58, 0xf4, 0xfe,
+0xfa, 0x8b, 0xe4, 0x1c, 0xad, 0x58, 0x5b, 0x1c, 0xc7, 0x54, 0xee, 0x7e,
+0xe7, 0x12, 0x6a, 0x4b, 0x01, 0x63, 0xb4, 0xdb, 0x6e, 0xe7, 0x7a, 0xe9,
+0x62, 0xa5, 0xb4, 0xe3,
+
+0xc3, 0x22, 0x1c, 0x3c, 0x75, 0x2e, 0x7a, 0xe2, 0xc6, 0x86, 0xf7, 0x0b,
+0xba, 0x1f, 0x2d, 0xe8, 0xfa, 0xd8, 0x21, 0x59, 0xe1, 0x41, 0xd1, 0xbd,
+0x78, 0xfe, 0xcd, 0x10, 0x70, 0xb9, 0xe3, 0x46, 0x9c, 0x62, 0x13, 0x53,
+0x93, 0xd5, 0xf0, 0x3f, 0xfe, 0x00, 0x4c, 0x78, 0xc4, 0x4c, 0x24, 0x70,
+0x56, 0xde, 0x40, 0x1a, 0x47, 0xea, 0x2b, 0xcc, 0xc7, 0x18, 0xdc, 0xa2,
+0x91, 0x97, 0x0c, 0xec,
+
+0x64, 0x87, 0x4a, 0x72, 0x28, 0x6e, 0x35, 0xa7, 0x38, 0x21, 0x8c, 0x44,
+0x74, 0xde, 0x34, 0x2c, 0x64, 0xba, 0x9e, 0xf1, 0x53, 0x09, 0xa8, 0x75,
+0x85, 0xcc, 0x29, 0x8c, 0x58, 0x1f, 0xf9, 0xde, 0x2d, 0xab, 0xca, 0xc3,
+0x46, 0xf4, 0xb9, 0x21, 0x63, 0x19, 0xbc, 0xf4, 0x1a, 0x18, 0xb3, 0xc5,
+0x1e, 0xbc, 0x37, 0xde, 0x99, 0xef, 0xa7, 0x32, 0x2b, 0x4d, 0xb1, 0xe9,
+0xe8, 0xb7, 0x8c, 0xff,
+
+0xdd, 0x77, 0x59, 0x88, 0xd7, 0x91, 0xee, 0x4c, 0x30, 0x8b, 0x8e, 0x81,
+0x6f, 0x83, 0x4f, 0x82, 0x76, 0xca, 0xfa, 0xbc, 0x34, 0xa2, 0x48, 0xe4,
+0xde, 0x4b, 0x55, 0x18, 0xcc, 0xf6, 0xdd, 0x11, 0x97, 0x6a, 0xf7, 0x3a,
+0x25, 0x4c, 0x84, 0x06, 0xd9, 0xc4, 0x58, 0x1d, 0xc5, 0xac, 0xf9, 0x47,
+0x33, 0x48, 0x14, 0x61, 0xcb, 0xba, 0x10, 0x83, 0x6b, 0x20, 0xb3, 0x72,
+0x8e, 0xee, 0x72, 0x26,
+
+0x9e, 0x5e, 0xb2, 0x19, 0x23, 0x86, 0x14, 0x5a, 0x5c, 0xb0, 0x0a, 0x41,
+0x71, 0x6c, 0x88, 0xde, 0xd1, 0x1c, 0xa5, 0xa4, 0x80, 0xba, 0x41, 0x9c,
+0xd3, 0xd8, 0xa6, 0x8f, 0x6f, 0x3e, 0xd8, 0x04, 0x8f, 0x8b, 0x78, 0x13,
+0x7b, 0xd4, 0x9d, 0x92, 0xe4, 0xda, 0x0e, 0xfe, 0xa3, 0xd1, 0xda, 0x8f,
+0x6a, 0x62, 0x8d, 0x7c, 0x7c, 0x00, 0x33, 0x2e, 0x68, 0xa8, 0x39, 0x3c,
+0x86, 0x7b, 0x02, 0x20,
+
+0x6d, 0x53, 0x62, 0x9e, 0xd3, 0x2a, 0x14, 0x3c, 0xec, 0x3f, 0x2c, 0x22,
+0x37, 0xe4, 0xb7, 0xf4, 0x4b, 0x44, 0xad, 0xcb, 0xa4, 0xf0, 0xb6, 0x4a,
+0x5a, 0x1c, 0x74, 0x41, 0x7c, 0x57, 0xe5, 0xbc, 0xa9, 0x60, 0xfc, 0xf6,
+0x45, 0x53, 0xa1, 0x6f, 0x9f, 0x76, 0xf3, 0x15, 0x00, 0x8f, 0xae, 0xd8,
+0xf6, 0x5e, 0x3d, 0x39, 0x85, 0xa2, 0xbe, 0xc2, 0xc0, 0x53, 0xaf, 0xd5,
+0xa6, 0x5f, 0x57, 0xf3,
+
+0x24, 0x4d, 0x10, 0x98, 0xde, 0xbc, 0x37, 0x64, 0x60, 0xf5, 0x9d, 0x92,
+0x65, 0x03, 0x36, 0xbb, 0x40, 0x03, 0x64, 0x12, 0x5f, 0xca, 0x63, 0x2d,
+0x53, 0xe8, 0xa5, 0xa5, 0x7b, 0x5f, 0x82, 0x76, 0xbb, 0xd6, 0xb2, 0xf8,
+0x26, 0xc3, 0x9d, 0xfa, 0x2a, 0xb2, 0x73, 0xe3, 0xab, 0x6c, 0x9e, 0xbd,
+0x6a, 0xa4, 0x3c, 0x29, 0x4b, 0x70, 0xf8, 0x22, 0x0d, 0xde, 0x78, 0xe1,
+0x05, 0x50, 0x76, 0xba,
+
+0x08, 0xf1, 0x64, 0xbc, 0x00, 0x43, 0xac, 0x2e, 0x11, 0x46, 0xad, 0xb9,
+0x02, 0x48, 0x05, 0xd1, 0xfd, 0x9f, 0x63, 0x65, 0x1c, 0xcc, 0x62, 0x33,
+0x12, 0x95, 0xdb, 0xd2, 0xff, 0xd7, 0x0e, 0x8b, 0x64, 0x92, 0xd5, 0x44,
+0x3e, 0x30, 0xf8, 0xfc, 0x49, 0xe3, 0x4b, 0x27, 0x82, 0xa8, 0x90, 0x4b,
+0xca, 0xa1, 0x0b, 0xfd, 0x1e, 0xe1, 0x9b, 0xad, 0xcc, 0x08, 0x7e, 0x6a,
+0x03, 0xef, 0xec, 0x07,
+
+0x03, 0xf8, 0x09, 0xa5, 0x9e, 0xd3, 0x5e, 0x75, 0x0c, 0x80, 0x8b, 0x13,
+0x54, 0xa2, 0x25, 0x05, 0x5a, 0xa8, 0x82, 0xb4, 0xa2, 0x33, 0xc4, 0xb3,
+0xb5, 0xf7, 0xa8, 0x78, 0x33, 0x6a, 0xef, 0x50, 0x14, 0xf1, 0x17, 0xff,
+0x30, 0x59, 0x87, 0xe4, 0x2c, 0xb7, 0x20, 0x9f, 0x17, 0xb8, 0x7b, 0x32,
+0xe1, 0x6a, 0x3c, 0xda, 0x51, 0x09, 0x79, 0x33, 0x0b, 0x8d, 0x9c, 0x11,
+0xbe, 0x0c, 0xcb, 0x98,
+
+0xd7, 0x9f, 0xa6, 0x0b, 0x21, 0xab, 0x8b, 0x56, 0xc1, 0xae, 0xca, 0x76,
+0xa9, 0x4e, 0x41, 0xcd, 0x9d, 0xfd, 0xa1, 0x15, 0xc0, 0x3a, 0x51, 0xd7,
+0x1d, 0x12, 0x7c, 0x9a, 0xe4, 0x11, 0x0b, 0xee, 0x1f, 0x5f, 0x2b, 0x1c,
+0x39, 0xca, 0x6a, 0x87, 0x37, 0xe0, 0xd4, 0xa2, 0xef, 0x05, 0xc1, 0x92,
+0xcd, 0x2a, 0x5a, 0x7d, 0x1b, 0xc6, 0xde, 0xf7, 0x57, 0xa2, 0xea, 0x17,
+0x63, 0x94, 0x00, 0x81,
+
+0xd6, 0xf7, 0x2d, 0x50, 0x48, 0x25, 0x69, 0xed, 0x4f, 0x19, 0x42, 0x19,
+0x72, 0xcd, 0x57, 0x83, 0xde, 0x1b, 0x3f, 0x46, 0xa6, 0x95, 0x50, 0x60,
+0x48, 0xbc, 0xb9, 0xe3, 0xe6, 0x05, 0x08, 0x58, 0xa5, 0x15, 0x80, 0x35,
+0xcd, 0x27, 0x2d, 0xd0, 0xc5, 0xe5, 0x29, 0x7f, 0x43, 0x02, 0xc1, 0x0a,
+0xe4, 0x47, 0x0e, 0x55, 0x7a, 0xbd, 0x44, 0xb0, 0x31, 0x90, 0x55, 0xa0,
+0x38, 0x16, 0x0e, 0x2a,
+
+0xb5, 0x12, 0xe8, 0x99, 0x4e, 0xaf, 0x15, 0xa7, 0x39, 0xa2, 0xf2, 0x50,
+0x88, 0xc4, 0x48, 0x70, 0xb4, 0xf1, 0x54, 0xd0, 0x58, 0xdb, 0x91, 0x43,
+0xc1, 0x64, 0x49, 0x0b, 0xc6, 0x06, 0xb6, 0x4a, 0x25, 0x78, 0x9d, 0xa9,
+0x8b, 0x4e, 0x1b, 0x33, 0xa9, 0x6f, 0xa3, 0x5c, 0x53, 0xd5, 0xab, 0x0a,
+0xf4, 0x49, 0x9d, 0x67, 0xc5, 0x6a, 0x4b, 0x81, 0x84, 0x4d, 0x6c, 0xd8,
+0x8f, 0xe4, 0xca, 0x1f,
+
+0x80, 0xe6, 0x23, 0x82, 0xf5, 0x0c, 0x24, 0x37, 0x4e, 0xd6, 0x2d, 0x29,
+0x80, 0x69, 0x8d, 0x04, 0x72, 0x82, 0x7f, 0xe5, 0x81, 0x50, 0xfd, 0x53,
+0x7c, 0xc3, 0xd6, 0xc8, 0x80, 0xea, 0x67, 0x76, 0xe4, 0x17, 0x98, 0xac,
+0x3c, 0x4a, 0x01, 0x86, 0xb6, 0xb7, 0x07, 0x20, 0x31, 0x0a, 0x4d, 0x08,
+0xf0, 0xe0, 0xc0, 0xea, 0xb8, 0x82, 0xfa, 0x91, 0x76, 0x01, 0xe6, 0xe4,
+0x45, 0x54, 0xdf, 0x75,
+
+0x32, 0xdb, 0x43, 0x97, 0x5e, 0x3b, 0x23, 0x42, 0x9d, 0xc7, 0xbc, 0x2a,
+0x05, 0x8f, 0xc0, 0xfb, 0x8b, 0xd6, 0xd7, 0x4b, 0xbf, 0x51, 0x34, 0x11,
+0xcf, 0xaa, 0x15, 0x6b, 0x0c, 0x4e, 0xf1, 0x05, 0xff, 0x2e, 0x1e, 0x09,
+0x4a, 0xa0, 0xfa, 0xf4, 0x59, 0x61, 0x2a, 0x0f, 0x62, 0x09, 0x75, 0x55,
+0x87, 0x21, 0x7d, 0xc1, 0x97, 0xef, 0x89, 0x5d, 0xb8, 0x45, 0x63, 0xc6,
+0x28, 0x4f, 0x84, 0x22,
+
+0x42, 0x71, 0xbc, 0xc5, 0x4c, 0xf2, 0x5e, 0xe8, 0x91, 0xda, 0x0c, 0x86,
+0xb7, 0x81, 0x66, 0xad, 0xef, 0xcd, 0x89, 0x35, 0xb8, 0xdc, 0x8f, 0x24,
+0x38, 0x17, 0x91, 0x65, 0xf4, 0x45, 0x71, 0xf9, 0x89, 0xcf, 0x54, 0x0b,
+0x8c, 0x35, 0xa5, 0x74, 0x89, 0x41, 0x9f, 0x1e, 0xc1, 0xef, 0x5d, 0xc3,
+0xba, 0x46, 0x27, 0xc3, 0xe6, 0x88, 0x4b, 0xc7, 0xfe, 0x8b, 0x8f, 0x0e,
+0x7c, 0xcd, 0xdc, 0xce,
+
+0x0c, 0x81, 0x66, 0xa5, 0x23, 0xa8, 0x87, 0x81, 0x03, 0x09, 0x36, 0x04,
+0x88, 0xd7, 0xbf, 0x33, 0xb5, 0x40, 0x65, 0xf6, 0x65, 0xcc, 0x05, 0x6c,
+0xa1, 0x3c, 0xfa, 0x5d, 0x0c, 0x2a, 0x28, 0x53, 0x03, 0xae, 0x59, 0xdd,
+0x99, 0x80, 0xb7, 0x81, 0x68, 0xaf, 0xf0, 0xf4, 0xcb, 0xd0, 0xa3, 0xde,
+0x7d, 0x1f, 0x5c, 0x53, 0x20, 0x25, 0xe2, 0x0f, 0x08, 0x40, 0xb2, 0xca,
+0xc5, 0x81, 0x02, 0xf4,
+
+0x40, 0xcf, 0x75, 0xb0, 0x18, 0x9c, 0x82, 0x40, 0xea, 0x98, 0x2d, 0x24,
+0x97, 0xb3, 0x1a, 0x2d, 0x78, 0x56, 0x2a, 0x21, 0x51, 0x38, 0x19, 0x1a,
+0x47, 0x58, 0x16, 0xa9, 0xf8, 0x9c, 0xe9, 0x16, 0xad, 0xa4, 0x9c, 0x11,
+0xce, 0xcf, 0x19, 0x8a, 0x37, 0x64, 0xab, 0x81, 0xe9, 0x35, 0x9e, 0x18,
+0x3e, 0x06, 0x6f, 0xb8, 0x89, 0xf0, 0x67, 0x75, 0xeb, 0xbc, 0x4e, 0xff,
+0x95, 0xea, 0x12, 0x40,
diff --git a/epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc b/epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc
new file mode 100644
index 0000000..902ee73
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 compressed private key
+ * Group : grpX
+ * Signer : member9
+ */
+//unsigned char cmpprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xaf, 0x49, 0xd9, 0xba, 0x72, 0x81, 0xa7, 0x2f,
+ 0xcc, 0x5a, 0xe3, 0x13, 0xed, 0x5c, 0xf2, 0x5b,
+ 0xf9, 0x56, 0x23, 0x39, 0x4b, 0xc2, 0xf6, 0x29,
+ 0xb7, 0x14, 0x61, 0x4c, 0x4e, 0x46, 0x9c, 0x35,
+ 0xaf, 0x5a, 0x70, 0xdd, 0x2d, 0x06, 0x13, 0x55,
+ 0xc9, 0x70, 0xb6, 0xa9, 0x90, 0xd6, 0x2f, 0x98,
+ 0x69, 0x92, 0x82, 0x7c, 0x44, 0x77, 0x81, 0x9e,
+ 0xe9, 0x35, 0x57, 0x87, 0x5b, 0x3a, 0xd3, 0xbf
+//};
+//unsigned int cmpprivkey_dat_len = 80;
diff --git a/epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc b/epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc
new file mode 100644
index 0000000..58db4cd
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : member9
+ */
+//unsigned char mprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xaf, 0x49, 0xd9, 0xba, 0x72, 0x81, 0xa7, 0x2f,
+ 0xcc, 0x5a, 0xe3, 0x13, 0xed, 0x5c, 0xf2, 0x5b,
+ 0xf9, 0x56, 0x23, 0x39, 0x4b, 0xc2, 0xf6, 0x29,
+ 0xb7, 0x14, 0x61, 0x4c, 0x4e, 0x46, 0x9c, 0x35,
+ 0xae, 0x8d, 0xc4, 0x20, 0xb1, 0x9a, 0x2f, 0x21,
+ 0x66, 0xae, 0x93, 0xd9, 0xe3, 0xfb, 0x65, 0xd6,
+ 0xbf, 0x3c, 0x97, 0x59, 0x43, 0x37, 0x51, 0x5e,
+ 0x94, 0x9f, 0xb7, 0xcd, 0x49, 0x71, 0xee, 0xef,
+ 0x92, 0x9c, 0xdc, 0xfc, 0x54, 0x9d, 0xa5, 0x42,
+ 0x51, 0x5e, 0xec, 0x41, 0x1a, 0x4c, 0xb7, 0xf1,
+ 0x5f, 0x34, 0x8d, 0x3a, 0x4c, 0x75, 0x0e, 0xc9,
+ 0x3f, 0xc6, 0x46, 0x08, 0x8d, 0xbb, 0xbf, 0xe1,
+ 0xc1, 0xb0, 0xb5, 0x16, 0x13, 0xaa, 0x45, 0x66,
+ 0xaa, 0x57, 0x3f, 0x96, 0x0f, 0x54, 0x62, 0xd9,
+ 0x90, 0x13, 0x5e, 0x5b, 0xdd, 0x2a, 0xb1, 0xfd,
+ 0x51, 0xef, 0x85, 0xa9, 0x8b, 0xf8, 0x3d, 0x78
+//};
+//unsigned int mprivkey_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/corrupted_privrl.inc b/epid/common-testhelper/testdata/grp_x/corrupted_privrl.inc
new file mode 100644
index 0000000..4047117
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/corrupted_privrl.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 private-key based revocation list
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ // Group ID
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // RLver
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ // n1
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
+ // f[1]
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A,
+ 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D,
+//};
+//unsigned int privrl_dat_len = 56;
diff --git a/epid/common-testhelper/testdata/grp_x/iprivkey.inc b/epid/common-testhelper/testdata/grp_x/iprivkey.inc
new file mode 100644
index 0000000..b3adabd
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/iprivkey.inc
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 issuing private key
+ * Group : grpX
+ */
+//unsigned char iprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xb5, 0xd4, 0xfe, 0x09, 0x91, 0x97, 0xd0, 0x9c,
+ 0x39, 0x20, 0x94, 0x7f, 0xe2, 0x30, 0xbb, 0x5a,
+ 0xea, 0x00, 0x35, 0xfe, 0x8d, 0x49, 0x3c, 0x86,
+ 0x56, 0xd8, 0xec, 0x55, 0xc8, 0x86, 0xe5, 0xb5
+//};
+//unsigned int iprivkey_dat_len = 48;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc b/epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc
new file mode 100644
index 0000000..67f52a0
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : member0
+ */
+//unsigned char mprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x63, 0xd3, 0x48, 0x19, 0x93, 0x92, 0x3d, 0xfc,
+ 0x78, 0xcc, 0x01, 0x3f, 0x2a, 0x29, 0x73, 0xd8,
+ 0x1b, 0x9a, 0xbe, 0x70, 0x66, 0x71, 0xfa, 0x47,
+ 0x66, 0xc5, 0xd4, 0xe5, 0x07, 0xcb, 0xe2, 0x51,
+ 0x47, 0x4a, 0x06, 0x9a, 0x29, 0xeb, 0x99, 0x0e,
+ 0x1b, 0x6b, 0x24, 0x88, 0x8f, 0x11, 0x4b, 0x9d,
+ 0xb4, 0x82, 0xf6, 0x04, 0x79, 0xde, 0x9b, 0xe7,
+ 0x83, 0x63, 0x27, 0x91, 0x46, 0xa8, 0x52, 0x27,
+ 0xb2, 0xed, 0xf0, 0x3b, 0x61, 0x78, 0x50, 0x20,
+ 0x61, 0x97, 0x3f, 0x4d, 0xba, 0x17, 0xfc, 0x50,
+ 0x65, 0x0a, 0xff, 0xec, 0x64, 0x14, 0xa2, 0x53,
+ 0xee, 0x2d, 0xff, 0xc9, 0x2d, 0xb3, 0xbe, 0xa0,
+ 0xc4, 0x80, 0xd8, 0xd9, 0xfa, 0xa9, 0xb6, 0x1a,
+ 0xa0, 0x24, 0xcc, 0xfa, 0x4f, 0x03, 0x37, 0xe2,
+ 0xdf, 0xff, 0x35, 0x2e, 0x87, 0xd3, 0x3a, 0x2b,
+ 0x58, 0x00, 0x54, 0x32, 0x8b, 0xe4, 0x83, 0xb5
+//};
+//unsigned int mprivkey_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..3b033ac
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59,
+ 0x15, 0xdb, 0xf7, 0x26, 0xde, 0xc4, 0x1f, 0x31,
+ 0xe8, 0x4c, 0x11, 0xe6, 0x60, 0xdf, 0xc4, 0xde,
+ 0xa1, 0x42, 0xbb, 0x55, 0x22, 0x0e, 0xea, 0x5f,
+ 0xc0, 0xf7, 0x78, 0x8a, 0x15, 0xcd, 0xf4, 0x03,
+ 0x97, 0x1b, 0x88, 0xd7, 0xcc, 0x86, 0xaf, 0x54,
+ 0x65, 0xa1, 0x18, 0x10, 0x39, 0x53, 0x95, 0x1f,
+ 0x93, 0x74, 0x9b, 0xb7, 0x39, 0xc7, 0x9a, 0x81,
+ 0x72, 0x2b, 0x67, 0x12, 0xe3, 0x42, 0xbc, 0x76,
+ 0xb6, 0x03, 0xbe, 0xc2, 0x13, 0x7f, 0xb2, 0x86,
+ 0xc7, 0x20, 0x27, 0xcc, 0x30, 0x1e, 0xa7, 0xf2,
+ 0xfe, 0x96, 0x5b, 0x85, 0xa6, 0xac, 0xef, 0x41,
+ 0x1f, 0x12, 0xe7, 0x6f, 0x22, 0xea, 0xf1, 0xac,
+ 0xb3, 0x48, 0xef, 0xdf, 0x39, 0x11, 0xe3, 0x2f,
+ 0x16, 0x98, 0x77, 0x4f, 0x6f, 0x71, 0x40, 0x03,
+ 0xdf, 0xb7, 0xa3, 0x10, 0x08, 0xc7, 0xae, 0x77,
+ 0x87, 0x3d, 0xd6, 0x8b, 0xc8, 0xd4, 0x00, 0x05,
+ 0x4f, 0xd3, 0xb2, 0x21, 0x71, 0x28, 0x97, 0x2b,
+ 0xda, 0x05, 0x07, 0x87, 0x9e, 0x32, 0x24, 0xe7,
+ 0x0c, 0xa2, 0x37, 0x32, 0xf0, 0xfa, 0xec, 0x07,
+ 0x5e, 0x5e, 0xec, 0x45, 0xdd, 0xa3, 0x68, 0x4d,
+ 0x8a, 0x8b, 0xd5, 0xc3, 0x0d, 0x91, 0xd2, 0xc4,
+ 0x3d, 0x04, 0x24, 0xe9, 0xbc, 0x65, 0xb9, 0xee,
+ 0x2d, 0x52, 0xf7, 0x97, 0xe5, 0xa0, 0x84, 0x16,
+ 0x57, 0x53, 0xd5, 0x7b, 0xee, 0xb2, 0xa6, 0x9c,
+ 0x77, 0xad, 0x9d, 0x73, 0x0b, 0x53, 0xd8, 0x33,
+ 0x83, 0x8f, 0xb2, 0x7c, 0x2e, 0x4b, 0x12, 0xf2,
+ 0xbd, 0xbb, 0x7c, 0x25, 0x80, 0xa8, 0x04, 0x24,
+ 0x39, 0x90, 0x61, 0xdf, 0x72, 0x21, 0x05, 0xd3,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x5b, 0x9f, 0xd9, 0x96, 0x82, 0x57, 0x4c, 0xa7,
+ 0xd8, 0x66, 0xe6, 0x2f, 0x56, 0x46, 0x7a, 0xa4,
+ 0xa6, 0x74, 0x28, 0x38, 0xa2, 0x38, 0x28, 0xb3,
+ 0xb6, 0x5b, 0x95, 0xf5, 0xd6, 0x6c, 0x37, 0xb1,
+ 0x14, 0x59, 0xf6, 0x42, 0xe9, 0x5c, 0xee, 0x45,
+ 0x51, 0x5b, 0xe7, 0x3b, 0xd9, 0x0c, 0x44, 0x40,
+ 0x3a, 0x9b, 0x2d, 0x9a, 0xfb, 0x07, 0xdf, 0xe3,
+ 0x58, 0xdc, 0x3d, 0x62, 0xc0, 0x7c, 0x8f, 0xa9,
+ 0x32, 0x48, 0x7d, 0x8f, 0x4d, 0xe0, 0x26, 0x72,
+ 0xe9, 0x1e, 0xcb, 0x7f, 0x10, 0x93, 0x00, 0xf8,
+ 0xca, 0x02, 0x3e, 0x21, 0x99, 0xee, 0xae, 0x57,
+ 0x8d, 0xef, 0xa3, 0x29, 0xef, 0xb7, 0xfc, 0x11,
+ 0xf5, 0x8b, 0x19, 0xc7, 0xfb, 0x9c, 0xc7, 0xc1,
+ 0x7e, 0x35, 0x2c, 0x78, 0xd8, 0x15, 0x60, 0xe6,
+ 0xbf, 0xf5, 0xba, 0x21, 0xeb, 0x60, 0x94, 0x2e,
+ 0x37, 0xe2, 0xa8, 0x11, 0xab, 0xfd, 0xea, 0x26,
+ 0xab, 0x82, 0x6c, 0x24, 0x38, 0xbb, 0x56, 0x10,
+ 0x5b, 0xb9, 0xcb, 0xe7, 0xc2, 0xbe, 0x4c, 0xf7,
+ 0x43, 0xe8, 0xca, 0xeb, 0x6c, 0x57, 0xcb, 0x01,
+ 0xb7, 0x54, 0x84, 0x6a, 0x61, 0xe0, 0x37, 0x3a,
+ 0xe1, 0xfa, 0xae, 0x67, 0x06, 0x81, 0xbe, 0x4c,
+ 0x2a, 0xc8, 0xf1, 0x17, 0x75, 0xd3, 0xa9, 0x75,
+ 0xa7, 0xa9, 0x72, 0x6b, 0xe9, 0xd2, 0x32, 0x63,
+ 0x8b, 0x37, 0xf7, 0x45, 0xa4, 0x43, 0x9c, 0x2d,
+ 0x12, 0x40, 0x05, 0x9f, 0xe1, 0x97, 0xee, 0xdb,
+ 0x92, 0x6a, 0x98, 0xe4, 0x66, 0x83, 0xdb, 0x6e,
+ 0xdf, 0xbe, 0x53, 0x36, 0x68, 0x38, 0xb2, 0x6b,
+ 0x1c, 0x66, 0xe6, 0xc8, 0xfc, 0x1c, 0x25, 0x39,
+ 0xbf, 0xd7, 0x0e, 0x4c, 0x2d, 0x36, 0x78, 0xfe,
+ 0xdf, 0x47, 0x51, 0x19, 0xb1, 0xf2, 0x4b, 0xd8,
+ 0x55, 0xed, 0xab, 0x3d, 0x2e, 0x4a, 0x18, 0x78,
+ 0xb1, 0x29, 0x4a, 0xe9, 0xad, 0xab, 0xe8, 0xcf,
+ 0xa2, 0x8f, 0xf4, 0xc3, 0x70, 0x6b, 0x4d, 0x18,
+ 0xfa, 0x0d, 0xea, 0x9d, 0xf1, 0x81, 0x51, 0x05,
+ 0x85, 0x8f, 0x00, 0xb2, 0x6b, 0xfe, 0x64, 0xfe,
+ 0xbc, 0x65, 0xcd, 0x14, 0xcd, 0x65, 0xe8, 0xc6,
+ 0xe2, 0x21, 0xb8, 0x95, 0x5e, 0x62, 0xb5, 0x4d,
+ 0x98, 0x0e, 0x8e, 0xb2, 0xba, 0x9b, 0x07, 0xd4,
+ 0xa8, 0xb6, 0x01, 0xe4, 0xe6, 0x8f, 0xdc, 0x69,
+ 0x06, 0xe0, 0x0a, 0x53, 0x94, 0xef, 0x07, 0x05,
+ 0xb2, 0x33, 0x1d, 0xb4, 0x5a, 0x8f, 0x88, 0x24,
+ 0xee, 0x28, 0x61, 0x80, 0x58, 0x95, 0xc6, 0x1c,
+ 0x8d, 0xb3, 0xb1, 0x9c, 0x9c, 0x7a, 0x5e, 0xc6,
+ 0x75, 0xe1, 0x0a, 0x75, 0xce, 0xb6, 0xb2, 0x60,
+ 0x7b, 0xf8, 0x48, 0xb9, 0xd3, 0x62, 0x44, 0xa4,
+ 0x32, 0x00, 0xd7, 0xf5, 0xc9, 0x4e, 0xc4, 0xba,
+ 0x76, 0xf3, 0x6c, 0x25, 0x55, 0xd0, 0x69, 0x92,
+ 0x19, 0x10, 0xb5, 0xf6, 0x27, 0x50, 0xaa, 0x99,
+ 0x61, 0xfe, 0x6e, 0x6b, 0x94, 0xb2, 0x55, 0x69,
+ 0x9b, 0xd1, 0x93, 0x92, 0xdc, 0x68, 0xe3, 0x26,
+ 0x6a, 0xc7, 0xf4, 0xdf, 0x50, 0xcb, 0x94, 0x82,
+ 0x57, 0xe8, 0xc0, 0x50, 0xee, 0x21, 0xd0, 0x11,
+ 0xcc, 0x17, 0x9a, 0x40, 0xb9, 0x11, 0x54, 0xe9,
+ 0x20, 0x43, 0x97, 0x33, 0xfb, 0xda, 0x25, 0x67,
+ 0x94, 0x0d, 0x6e, 0x08, 0x59, 0x54, 0x75, 0xb5,
+ 0x3c, 0x85, 0x4f, 0xfe, 0x21, 0x1a, 0xc4, 0x74,
+ 0xdc, 0x1f, 0x3c, 0x1b, 0x6e, 0x8d, 0x66, 0xc2,
+ 0xdb, 0x6f, 0x02, 0x1a, 0x3d, 0x23, 0xc5, 0x14,
+ 0xbf, 0x9c, 0xb1, 0x87, 0x3f, 0x14, 0x82, 0x8b,
+ 0xe2, 0x20, 0x2a, 0x64, 0xe5, 0xb3, 0x1d, 0x2e
+//};
+//unsigned int sig_grpx_member0_sha256_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc
new file mode 100644
index 0000000..ba9b3f4
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc
@@ -0,0 +1,95 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59,
+ 0x15, 0xdb, 0xf7, 0x26, 0xde, 0xc4, 0x1f, 0x31,
+ 0xe8, 0x4c, 0x11, 0xe6, 0x60, 0xdf, 0xc4, 0xde,
+ 0xa1, 0x42, 0xbb, 0x55, 0x22, 0x0e, 0xea, 0x5f,
+ 0xc0, 0xf7, 0x78, 0x8a, 0x15, 0xcd, 0xf4, 0x03,
+ 0x97, 0x1b, 0x88, 0xd7, 0xcc, 0x86, 0xaf, 0x54,
+ 0x65, 0xa1, 0x18, 0x10, 0x39, 0x53, 0x95, 0x1f,
+ 0x93, 0x74, 0x9b, 0xb7, 0x39, 0xc7, 0x9a, 0x81,
+ 0x72, 0x2b, 0x67, 0x12, 0xe3, 0x42, 0xbc, 0x76,
+ 0xb6, 0x03, 0xbe, 0xc2, 0x13, 0x7f, 0xb2, 0x86,
+ 0xc7, 0x20, 0x27, 0xcc, 0x30, 0x1e, 0xa7, 0xf2,
+ 0xfe, 0x96, 0x5b, 0x85, 0xa6, 0xac, 0xef, 0x41,
+ 0x1f, 0x12, 0xe7, 0x6f, 0x22, 0xea, 0xf1, 0xac,
+ 0xb3, 0x48, 0xef, 0xdf, 0x39, 0x11, 0xe3, 0x2f,
+ 0x16, 0x98, 0x77, 0x4f, 0x6f, 0x71, 0x40, 0x03,
+ 0xdf, 0xb7, 0xa3, 0x10, 0x08, 0xc7, 0xae, 0x77,
+ 0x87, 0x3d, 0xd6, 0x8b, 0xc8, 0xd4, 0x00, 0x05,
+ 0x4f, 0xd3, 0xb2, 0x21, 0x71, 0x28, 0x97, 0x2b,
+ 0xda, 0x05, 0x07, 0x87, 0x9e, 0x32, 0x24, 0xe7,
+ 0x0c, 0xa2, 0x37, 0x32, 0xf0, 0xfa, 0xec, 0x07,
+ 0x5e, 0x5e, 0xec, 0x45, 0xdd, 0xa3, 0x68, 0x4d,
+ 0x8a, 0x8b, 0xd5, 0xc3, 0x0d, 0x91, 0xd2, 0xc4,
+ 0x3d, 0x04, 0x24, 0xe9, 0xbc, 0x65, 0xb9, 0xee,
+ 0x2d, 0x52, 0xf7, 0x97, 0xe5, 0xa0, 0x84, 0x16,
+ 0x57, 0x53, 0xd5, 0x7b, 0xee, 0xb2, 0xa6, 0x9c,
+ 0x77, 0xad, 0x9d, 0x73, 0x0b, 0x53, 0xd8, 0x33,
+ 0x83, 0x8f, 0xb2, 0x7c, 0x2e, 0x4b, 0x12, 0xf2,
+ 0xbd, 0xbb, 0x7c, 0x25, 0x80, 0xa8, 0x04, 0x24,
+ 0x39, 0x90, 0x61, 0xdf, 0x72, 0x21, 0x05, 0xd3,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x5b, 0x9f, 0xd9, 0x96, 0x82, 0x57, 0x4c, 0xa7,
+ 0xd8, 0x66, 0xe6, 0x2f, 0x56, 0x46, 0x7a, 0xa4,
+ 0xa6, 0x74, 0x28, 0x38, 0xa2, 0x38, 0x28, 0xb3,
+ 0xb6, 0x5b, 0x95, 0xf5, 0xd6, 0x6c, 0x37, 0xb1,
+ 0x14, 0x59, 0xf6, 0x42, 0xe9, 0x5c, 0xee, 0x45,
+ 0x51, 0x5b, 0xe7, 0x3b, 0xd9, 0x0c, 0x44, 0x40,
+ 0x3a, 0x9b, 0x2d, 0x9a, 0xfb, 0x07, 0xdf, 0xe3,
+ 0x58, 0xdc, 0x3d, 0x62, 0xc0, 0x7c, 0x8f, 0xa9,
+ 0x32, 0x48, 0x7d, 0x8f, 0x4d, 0xe0, 0x26, 0x72,
+ 0xe9, 0x1e, 0xcb, 0x7f, 0x10, 0x93, 0x00, 0xf8,
+ 0xca, 0x02, 0x3e, 0x21, 0x99, 0xee, 0xae, 0x57,
+ 0x8d, 0xef, 0xa3, 0x29, 0xef, 0xb7, 0xfc, 0x11,
+ 0xf5, 0x8b, 0x19, 0xc7, 0xfb, 0x9c, 0xc7, 0xc1,
+ 0x7e, 0x35, 0x2c, 0x78, 0xd8, 0x15, 0x60, 0xe6,
+ 0xbf, 0xf5, 0xba, 0x21, 0xeb, 0x60, 0x94, 0x2e,
+ 0x37, 0xe2, 0xa8, 0x11, 0xab, 0xfd, 0xea, 0x26,
+ 0xab, 0x82, 0x6c, 0x24, 0x38, 0xbb, 0x56, 0x10,
+ 0x5b, 0xb9, 0xcb, 0xe7, 0xc2, 0xbe, 0x4c, 0xf7,
+ 0x43, 0xe8, 0xca, 0xeb, 0x6c, 0x57, 0xcb, 0x01,
+ 0xb7, 0x54, 0x84, 0x6a, 0x61, 0xe0, 0x37, 0x3a
+//};
+//unsigned int sig_grpx_member0_sha256_bsn0_msg0_dat_len = 520;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc
new file mode 100644
index 0000000..28a6a45
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg1"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_bsn0_msg1_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59,
+ 0x52, 0xbb, 0x68, 0x9d, 0x22, 0x68, 0x8c, 0xc4,
+ 0x51, 0x27, 0x21, 0x02, 0x87, 0x4a, 0xb0, 0x39,
+ 0x7e, 0xdc, 0xb8, 0xbb, 0x39, 0x08, 0x76, 0xac,
+ 0xbb, 0x39, 0xc7, 0x46, 0xed, 0xfa, 0xb2, 0x43,
+ 0xb2, 0xdb, 0xf9, 0xd5, 0x46, 0x9a, 0xc7, 0x6c,
+ 0xbd, 0xb3, 0x0b, 0x70, 0x4f, 0xcd, 0xf0, 0x12,
+ 0x15, 0x5f, 0x42, 0x56, 0x8c, 0xd9, 0x04, 0xef,
+ 0x67, 0xa0, 0x21, 0xe1, 0x97, 0x99, 0x50, 0x11,
+ 0x38, 0x67, 0x95, 0x92, 0x63, 0x14, 0xed, 0xa2,
+ 0x34, 0xdb, 0x2f, 0x70, 0x01, 0x3e, 0xf2, 0x68,
+ 0x86, 0x44, 0x76, 0x31, 0xd2, 0x82, 0xaa, 0x82,
+ 0x4f, 0x63, 0x86, 0xdb, 0xed, 0xa4, 0x9c, 0xff,
+ 0x3d, 0xeb, 0x80, 0xfe, 0x39, 0xf9, 0x27, 0xd0,
+ 0x27, 0x63, 0x25, 0xb0, 0x3f, 0x27, 0x6d, 0x53,
+ 0x74, 0xc7, 0x4c, 0xae, 0x75, 0x4e, 0x1c, 0xd0,
+ 0xb4, 0x0a, 0xd0, 0x15, 0x24, 0x40, 0x87, 0x17,
+ 0x56, 0x5d, 0xa6, 0xfb, 0x4d, 0x12, 0xc7, 0x2a,
+ 0x1c, 0x11, 0x5c, 0x81, 0x1d, 0x80, 0x82, 0x01,
+ 0xa5, 0x9b, 0x2b, 0x8a, 0xe5, 0x1a, 0x77, 0x36,
+ 0xcb, 0x40, 0xb1, 0xbd, 0x60, 0x1c, 0x92, 0x0c,
+ 0xbf, 0xa6, 0xe5, 0xd4, 0x2b, 0x26, 0xa9, 0x99,
+ 0xf4, 0x64, 0x8e, 0x35, 0xaa, 0xab, 0x3f, 0x5f,
+ 0x8c, 0x35, 0x09, 0xb6, 0x96, 0x09, 0x93, 0x35,
+ 0xe3, 0x77, 0xfb, 0xb0, 0x2f, 0xa0, 0xd2, 0x69,
+ 0x8f, 0x13, 0xe1, 0x03, 0x87, 0x4e, 0xdf, 0xdd,
+ 0x67, 0x14, 0x3b, 0xb0, 0x1e, 0x43, 0xbe, 0x75,
+ 0x38, 0x1a, 0x06, 0xee, 0xab, 0xa8, 0x67, 0xf2,
+ 0x67, 0x97, 0x2c, 0x36, 0x24, 0x62, 0x48, 0x61,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x69, 0x60, 0x39, 0xdb, 0xa7, 0x11, 0xf4, 0xa3,
+ 0xee, 0x42, 0x45, 0xcf, 0x2a, 0x2b, 0xfc, 0xe0,
+ 0x95, 0x0c, 0x30, 0x14, 0xee, 0x49, 0xdc, 0x75,
+ 0xf1, 0xcc, 0xeb, 0xec, 0x6e, 0xdc, 0xd2, 0xf3,
+ 0x89, 0x9f, 0xfc, 0xd3, 0x18, 0xfe, 0xb1, 0x49,
+ 0x0f, 0x97, 0xea, 0xa1, 0x43, 0xb4, 0xef, 0xac,
+ 0xd8, 0x5f, 0x29, 0x87, 0x00, 0x7a, 0x81, 0xdc,
+ 0x89, 0xb1, 0x74, 0x18, 0x93, 0xa0, 0x19, 0x3b,
+ 0x22, 0x27, 0xe3, 0x8c, 0x3f, 0x09, 0x20, 0x4d,
+ 0x23, 0x8b, 0xab, 0x97, 0xa3, 0xfa, 0xc5, 0x03,
+ 0x7e, 0x62, 0xa0, 0xcc, 0x8b, 0x0e, 0x3a, 0x17,
+ 0xb7, 0x5d, 0xcd, 0x51, 0xf2, 0x52, 0x1a, 0x0f,
+ 0x6d, 0xb2, 0xd8, 0xf6, 0xc4, 0x2b, 0xbd, 0xcb,
+ 0xe8, 0x80, 0x6d, 0xe8, 0x29, 0x64, 0xdb, 0xb9,
+ 0x7f, 0x63, 0xb0, 0x42, 0x12, 0xdd, 0x57, 0x89,
+ 0x3b, 0x65, 0xee, 0xc0, 0x5a, 0x53, 0x83, 0x81,
+ 0xf6, 0xe1, 0x96, 0x33, 0xc0, 0x59, 0x7d, 0x65,
+ 0x20, 0x37, 0xd6, 0xd0, 0xcf, 0xae, 0xbb, 0x00,
+ 0x19, 0x29, 0xbc, 0x03, 0xe1, 0xb4, 0x97, 0x8a,
+ 0x00, 0xde, 0xd3, 0xce, 0x52, 0x52, 0xd4, 0x48,
+ 0x16, 0xed, 0xe6, 0xee, 0x09, 0x83, 0x12, 0xc8,
+ 0x70, 0xc9, 0x4a, 0x0c, 0x11, 0x3a, 0xa1, 0x2a,
+ 0x4a, 0xd4, 0xf4, 0x22, 0xa6, 0x6d, 0x3e, 0xb8,
+ 0x35, 0x6b, 0x1e, 0x75, 0xa0, 0xb4, 0x43, 0xcd,
+ 0x65, 0xe7, 0x62, 0x17, 0x3d, 0x2e, 0x83, 0xda,
+ 0x79, 0xea, 0x23, 0x5f, 0xba, 0x73, 0x2c, 0x15,
+ 0x0b, 0x38, 0x0a, 0x9b, 0x28, 0x66, 0x5f, 0x4e,
+ 0x2e, 0x0d, 0x41, 0x21, 0x83, 0x4a, 0x8d, 0xa1,
+ 0x0e, 0xf6, 0xc4, 0xf5, 0x7d, 0x77, 0x65, 0x75,
+ 0xba, 0xcd, 0xc9, 0x97, 0xc7, 0x45, 0xd1, 0x84,
+ 0xcb, 0xac, 0xe6, 0x75, 0x60, 0xd0, 0x1f, 0xff,
+ 0x07, 0xe1, 0x81, 0x50, 0x76, 0x64, 0x62, 0x2a,
+ 0x82, 0xc3, 0x85, 0x08, 0x0c, 0xe1, 0x96, 0xbd,
+ 0xf3, 0x92, 0x4d, 0x24, 0x58, 0x0f, 0x02, 0x45,
+ 0x23, 0x92, 0x6d, 0xab, 0x30, 0x2e, 0x91, 0x7a,
+ 0xab, 0x99, 0xb6, 0xc8, 0xe4, 0xea, 0x51, 0x84,
+ 0x54, 0xc7, 0xe3, 0x37, 0x8f, 0x90, 0xd0, 0x71,
+ 0x4b, 0x34, 0xfc, 0xaf, 0x41, 0xcf, 0x78, 0xe7,
+ 0x0a, 0xe8, 0x83, 0xf5, 0xa6, 0x5c, 0x6d, 0x83,
+ 0x24, 0xed, 0x52, 0xb5, 0x0f, 0x65, 0xf8, 0x9c,
+ 0x3b, 0xa3, 0x15, 0xd6, 0xa5, 0xf4, 0x00, 0xd4,
+ 0xf4, 0xdb, 0x43, 0xc2, 0x02, 0x40, 0x14, 0x75,
+ 0x13, 0x7e, 0xdb, 0xc5, 0xf2, 0x9c, 0xea, 0x44,
+ 0x9b, 0x0a, 0x56, 0xfd, 0x97, 0xa5, 0xc5, 0x14,
+ 0xc4, 0xe2, 0x0d, 0x79, 0xe3, 0xd3, 0x7a, 0x64,
+ 0x83, 0x7c, 0x82, 0xba, 0x94, 0x0e, 0xba, 0xef,
+ 0x9a, 0x8a, 0x87, 0xf7, 0x8b, 0x53, 0x62, 0xae,
+ 0xa4, 0x9f, 0xff, 0xe4, 0xdf, 0x30, 0x71, 0x8f,
+ 0x72, 0x3d, 0xd1, 0xfa, 0xff, 0x5f, 0x8f, 0x13,
+ 0x8f, 0xf8, 0x65, 0xe9, 0xa2, 0xd9, 0x07, 0x2a,
+ 0x5b, 0x87, 0x2b, 0x3c, 0x43, 0x33, 0xdd, 0xf6,
+ 0x95, 0x0d, 0x43, 0x77, 0xc6, 0x65, 0x74, 0xe4,
+ 0xbc, 0xcf, 0x6a, 0x88, 0xcc, 0xda, 0x16, 0xe0,
+ 0xd7, 0xab, 0xe7, 0x46, 0xbe, 0x08, 0x0f, 0x6a,
+ 0x4b, 0x8d, 0xa3, 0xf4, 0xee, 0xc5, 0x83, 0xff,
+ 0x98, 0xee, 0x19, 0x2c, 0x7b, 0x81, 0xd4, 0x2e,
+ 0xb8, 0x04, 0x3c, 0x4f, 0xdb, 0xc7, 0x9c, 0x9c,
+ 0x8e, 0x2f, 0x77, 0x86, 0x6e, 0x7c, 0xbe, 0xc6,
+ 0x5e, 0x70, 0xc1, 0x4b, 0x0b, 0x2d, 0x07, 0x2a,
+ 0xa1, 0xfd, 0x63, 0x2d, 0xc5, 0x4c, 0x63, 0x36
+//};
+//unsigned int sig_sha256_bsn0_msg1_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc
new file mode 100644
index 0000000..fd1131e
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn1"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_bsn1_msg0_dat[] = {
+ 0x4b, 0xb3, 0x62, 0x6c, 0xa5, 0x12, 0xaa, 0x7a,
+ 0x22, 0x7f, 0xde, 0xf0, 0x8f, 0x1e, 0x3c, 0xc8,
+ 0xda, 0x5f, 0x2f, 0x6d, 0x3b, 0xd0, 0x42, 0xec,
+ 0x62, 0xbf, 0x3c, 0x0f, 0xae, 0xd4, 0xf9, 0xa0,
+ 0x56, 0xc9, 0xd5, 0x33, 0xaa, 0x60, 0xab, 0x86,
+ 0x15, 0x48, 0xc2, 0xbb, 0xda, 0x3f, 0x37, 0x71,
+ 0x3e, 0xf2, 0xd5, 0x3c, 0xd3, 0xb9, 0x08, 0xa0,
+ 0x63, 0x26, 0x6e, 0x26, 0xca, 0x93, 0xc1, 0xe1,
+ 0x03, 0x2e, 0xff, 0xad, 0xc8, 0xb1, 0x8f, 0x26,
+ 0x16, 0x61, 0x4f, 0x33, 0x19, 0x45, 0xb8, 0x0c,
+ 0xb3, 0x0e, 0x19, 0x98, 0xfc, 0x32, 0x83, 0xc2,
+ 0x58, 0x60, 0x12, 0x5c, 0xc6, 0xa8, 0x36, 0xc2,
+ 0xf6, 0xd4, 0x99, 0xb2, 0x44, 0x19, 0xef, 0xf0,
+ 0x75, 0x76, 0x6e, 0x63, 0xc4, 0x3f, 0x21, 0x5d,
+ 0x47, 0xa4, 0xf6, 0x90, 0x16, 0xa6, 0x18, 0xa4,
+ 0xe7, 0xc6, 0xff, 0x47, 0xb9, 0x9d, 0x99, 0x8a,
+ 0x12, 0x4d, 0xb7, 0xe4, 0xf1, 0x42, 0x1d, 0x8b,
+ 0x0f, 0x71, 0xac, 0xc7, 0xd4, 0xe0, 0x46, 0x7e,
+ 0x71, 0x36, 0x6c, 0x10, 0xa5, 0x93, 0xdc, 0x17,
+ 0xb6, 0x40, 0x7d, 0xa4, 0x8a, 0xf7, 0xf1, 0x9d,
+ 0x48, 0x41, 0xd3, 0xd1, 0x01, 0xbe, 0x28, 0xdf,
+ 0x50, 0x56, 0x1e, 0xf2, 0x0d, 0x47, 0x4e, 0x8d,
+ 0x11, 0x57, 0xe1, 0x5f, 0x41, 0xb2, 0x8e, 0x05,
+ 0xa2, 0xac, 0xb9, 0x05, 0x5a, 0xc4, 0x71, 0xb8,
+ 0x8a, 0xf2, 0xf1, 0xb0, 0x9e, 0x5e, 0xcf, 0xa9,
+ 0x83, 0xb4, 0x57, 0x1d, 0xe9, 0x6c, 0xda, 0xf5,
+ 0x3c, 0x90, 0xc0, 0x0e, 0xc2, 0xc3, 0x60, 0xd7,
+ 0x19, 0x61, 0xf7, 0x9b, 0x95, 0x3d, 0x16, 0xed,
+ 0x01, 0x60, 0xd0, 0xe2, 0x3b, 0x83, 0xd9, 0x3b,
+ 0xda, 0xe7, 0x8a, 0x4b, 0xdd, 0xfa, 0xcd, 0x4e,
+ 0xbf, 0xd1, 0x70, 0x57, 0xd0, 0x63, 0x56, 0xee,
+ 0xea, 0x76, 0x33, 0x59, 0xcc, 0xfb, 0x25, 0xc7,
+ 0x20, 0x9d, 0x74, 0x8f, 0x13, 0x68, 0xdb, 0x64,
+ 0x02, 0x20, 0x5b, 0x3a, 0xd2, 0x59, 0x78, 0xd4,
+ 0xf3, 0x53, 0x43, 0x9f, 0xcc, 0x3f, 0x4d, 0x9a,
+ 0x23, 0x2d, 0xdb, 0x71, 0xda, 0x25, 0x94, 0x0c,
+ 0xaa, 0xd9, 0x9a, 0x6a, 0x1c, 0x5d, 0xd1, 0xfe,
+ 0xf5, 0x19, 0xf7, 0x03, 0xe7, 0x74, 0x1b, 0x6f,
+ 0x37, 0x93, 0x3a, 0xc4, 0x4e, 0xdb, 0x72, 0xfb,
+ 0xfc, 0x81, 0xcc, 0xf9, 0x0e, 0x27, 0x55, 0x0d,
+ 0xb5, 0x48, 0xe9, 0xb7, 0x26, 0xa7, 0xf4, 0x2a,
+ 0x74, 0x93, 0xb8, 0x0d, 0x2b, 0xf8, 0x48, 0x18,
+ 0xde, 0x13, 0x7b, 0x5a, 0x33, 0xda, 0x46, 0x5b,
+ 0x10, 0xce, 0xe9, 0x94, 0x98, 0x97, 0xaf, 0x67,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xa2, 0xa8, 0xe1, 0x74, 0xe4, 0x4e, 0x10, 0xcc,
+ 0xbe, 0x17, 0x43, 0xb0, 0x5f, 0xd5, 0x66, 0x1c,
+ 0xbe, 0xf8, 0xfe, 0x35, 0xa0, 0x99, 0x9b, 0x24,
+ 0x16, 0x73, 0xd3, 0xcb, 0x31, 0x96, 0x2f, 0xab,
+ 0xd1, 0x7c, 0xdb, 0xf9, 0x82, 0xfc, 0xd5, 0x38,
+ 0x2d, 0x76, 0x3e, 0x9a, 0x13, 0x39, 0x63, 0x71,
+ 0xe8, 0x1a, 0xea, 0x20, 0xbf, 0xcb, 0x81, 0x4d,
+ 0xe7, 0xc6, 0xb9, 0xbb, 0x9f, 0x9e, 0x97, 0x93,
+ 0xc9, 0xe3, 0x6a, 0xca, 0xc0, 0x3b, 0xd6, 0x23,
+ 0xb3, 0x66, 0xf5, 0x6a, 0x02, 0x63, 0x46, 0xbf,
+ 0xa0, 0xbd, 0x94, 0x92, 0x59, 0x2b, 0x06, 0x71,
+ 0xb7, 0xcc, 0x00, 0xc0, 0xb1, 0x12, 0x21, 0x34,
+ 0xb7, 0xdb, 0x08, 0x1e, 0x57, 0x12, 0x72, 0x5b,
+ 0x9c, 0xee, 0x22, 0x73, 0x7a, 0xf8, 0x75, 0x31,
+ 0x2f, 0xa3, 0x1f, 0xea, 0x3d, 0x45, 0x3e, 0xfd,
+ 0xf6, 0x13, 0xcf, 0xa9, 0x16, 0xc6, 0xe5, 0xb7,
+ 0x7c, 0xf7, 0x87, 0x95, 0x6a, 0xc7, 0xc9, 0x79,
+ 0x09, 0x17, 0x9e, 0xe6, 0xb1, 0x8f, 0x96, 0x14,
+ 0x86, 0xc6, 0xa2, 0xbe, 0xb0, 0x4a, 0x54, 0x65,
+ 0xb3, 0x80, 0xef, 0xf5, 0xc0, 0x40, 0xa3, 0xde,
+ 0x6b, 0x31, 0xaa, 0x49, 0x21, 0xfa, 0x0c, 0x83,
+ 0x54, 0xdf, 0xe3, 0x17, 0xf1, 0x2a, 0xa4, 0x73,
+ 0x6d, 0x1f, 0x97, 0xcb, 0x23, 0x29, 0x1d, 0x7e,
+ 0xf3, 0x9f, 0x7b, 0xcc, 0x3c, 0x48, 0xc1, 0x18,
+ 0xe3, 0x07, 0xb6, 0x7d, 0x32, 0x32, 0xce, 0xfa,
+ 0x8d, 0x9d, 0xba, 0x42, 0x4a, 0x45, 0xe6, 0x7b,
+ 0x02, 0x7c, 0x53, 0x7d, 0x21, 0x8e, 0x6f, 0x35,
+ 0x4f, 0xb2, 0x1b, 0xe2, 0x2d, 0xdb, 0x9c, 0xef,
+ 0x3e, 0x58, 0x58, 0x8d, 0x11, 0xc2, 0xec, 0xfa,
+ 0x99, 0x13, 0x86, 0x1a, 0xe6, 0x14, 0x95, 0x70,
+ 0x4d, 0xf4, 0xe4, 0x7f, 0xde, 0x95, 0x29, 0xcf,
+ 0x93, 0x4c, 0xac, 0x79, 0x99, 0xcf, 0xbe, 0x1f,
+ 0x1c, 0x4b, 0x29, 0x29, 0x24, 0xf6, 0xbe, 0x9f,
+ 0xf2, 0x0f, 0x67, 0xae, 0x4d, 0x0d, 0xe3, 0x17,
+ 0x79, 0xcf, 0x65, 0xfd, 0x6f, 0x12, 0x64, 0xc6,
+ 0x9e, 0x2d, 0xcc, 0x3b, 0x2c, 0x94, 0x42, 0x63,
+ 0x86, 0x06, 0x00, 0xa7, 0x37, 0x06, 0x92, 0x15,
+ 0x02, 0xc6, 0x34, 0xeb, 0xa6, 0x17, 0xfe, 0x90,
+ 0x0d, 0xd1, 0x85, 0x5c, 0x77, 0x3a, 0x2b, 0x96,
+ 0xf1, 0x21, 0x07, 0xb5, 0x7c, 0x38, 0xb1, 0x4d,
+ 0x02, 0x43, 0xa9, 0x11, 0x65, 0x4d, 0x34, 0x64,
+ 0x72, 0x6a, 0x41, 0xb3, 0x8f, 0xf5, 0x2c, 0x9c,
+ 0xec, 0x3b, 0x48, 0xd0, 0xd5, 0xa9, 0x37, 0xf5,
+ 0x1f, 0x3e, 0x54, 0x62, 0xde, 0xed, 0x9e, 0x8a,
+ 0x0e, 0x22, 0x36, 0x2c, 0xc8, 0x2c, 0xf5, 0xc0,
+ 0xf6, 0xc9, 0x08, 0x73, 0x4a, 0xaf, 0x83, 0x8f,
+ 0xd6, 0x17, 0xe9, 0xf3, 0x01, 0xe3, 0xa3, 0x55,
+ 0xfd, 0x2d, 0x9d, 0xa7, 0x04, 0xa8, 0x09, 0x23,
+ 0xc0, 0x22, 0x74, 0x8e, 0xd4, 0xd4, 0x78, 0x75,
+ 0x6f, 0x33, 0xe8, 0xb9, 0xd7, 0x3c, 0x72, 0xb5,
+ 0x73, 0x78, 0x60, 0x4b, 0xcf, 0x2e, 0x22, 0x60,
+ 0x28, 0xa1, 0x8e, 0xcc, 0x1d, 0x20, 0xfa, 0x32,
+ 0x16, 0xce, 0x2b, 0x90, 0x62, 0xf3, 0x4d, 0x52,
+ 0x26, 0x05, 0x7d, 0xad, 0x07, 0x6d, 0x21, 0x55,
+ 0x34, 0x24, 0x21, 0xb2, 0x79, 0x14, 0x1c, 0x64,
+ 0x16, 0x1c, 0x14, 0x8b, 0x19, 0xf7, 0x03, 0x87,
+ 0xde, 0xe1, 0xdf, 0x9b, 0xa9, 0x86, 0x79, 0xdf,
+ 0x0f, 0x99, 0x09, 0x93, 0x96, 0x15, 0x79, 0x27,
+ 0x40, 0x53, 0x06, 0x73, 0x59, 0x19, 0x8d, 0x4f,
+ 0xd0, 0x09, 0xd3, 0x09, 0x23, 0x4f, 0x12, 0xec
+//};
+//unsigned int sig_sha256_bsn1_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc
new file mode 100644
index 0000000..824f0ef
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_rndbase_msg0_dat[] = {
+ 0x69, 0x77, 0x85, 0xee, 0xf5, 0x5f, 0x69, 0xd7,
+ 0x6f, 0x22, 0x49, 0x4f, 0xbb, 0x83, 0x73, 0x2e,
+ 0x91, 0xf1, 0x94, 0x48, 0x1b, 0x06, 0x4a, 0xf7,
+ 0x90, 0x07, 0x07, 0x2e, 0xb5, 0x65, 0xc8, 0xed,
+ 0x3e, 0x48, 0xb8, 0xc1, 0x7e, 0x20, 0x79, 0xd3,
+ 0xe0, 0x49, 0x3f, 0x10, 0x40, 0x41, 0x39, 0x59,
+ 0xa6, 0xfe, 0xe7, 0xcf, 0x21, 0x29, 0x37, 0x1b,
+ 0xef, 0xc0, 0xf0, 0x37, 0x49, 0x75, 0x6d, 0x66,
+ 0x4f, 0x31, 0x71, 0x23, 0x0e, 0x3a, 0x03, 0x00,
+ 0x9e, 0xcd, 0xc4, 0x70, 0xaa, 0x97, 0x02, 0xf7,
+ 0x1c, 0x49, 0x45, 0xac, 0xd9, 0xe7, 0x46, 0x20,
+ 0x36, 0xe8, 0x23, 0x57, 0xee, 0x5e, 0x6b, 0x6d,
+ 0x1a, 0xf4, 0x04, 0x1d, 0xd5, 0xb0, 0x81, 0x0c,
+ 0xe4, 0xd6, 0x01, 0x39, 0x35, 0xe2, 0x38, 0xb9,
+ 0xea, 0xc1, 0x35, 0xc0, 0x91, 0x39, 0x0e, 0xe6,
+ 0x6a, 0x45, 0x5e, 0xe1, 0x06, 0xa3, 0x5b, 0x09,
+ 0x6a, 0xd8, 0xe4, 0x61, 0x35, 0x72, 0x8d, 0x22,
+ 0x53, 0xd0, 0x96, 0xc3, 0xd9, 0x32, 0x21, 0x87,
+ 0x6f, 0xaa, 0x41, 0x4f, 0x90, 0x75, 0x01, 0x57,
+ 0x2a, 0xab, 0x38, 0xc7, 0x5d, 0xd5, 0xdd, 0x6b,
+ 0xfb, 0xde, 0xd8, 0x25, 0xa4, 0x14, 0x7f, 0x87,
+ 0x55, 0x78, 0x4b, 0xf5, 0x87, 0x15, 0x1d, 0xdb,
+ 0x59, 0xc1, 0xb4, 0x92, 0x52, 0x06, 0xfb, 0x96,
+ 0x9a, 0xf2, 0x05, 0x9e, 0xa7, 0x57, 0xf2, 0xa5,
+ 0xcf, 0xe8, 0x5e, 0x61, 0x59, 0xd0, 0x81, 0xab,
+ 0x97, 0xdd, 0x5c, 0x90, 0x1c, 0x21, 0x5b, 0x48,
+ 0x5d, 0x93, 0x71, 0x98, 0x46, 0x6b, 0x2c, 0x8b,
+ 0xa3, 0xce, 0x5a, 0xed, 0x8e, 0x76, 0x92, 0x75,
+ 0x5b, 0x9b, 0x09, 0x5a, 0x9a, 0x06, 0xde, 0xc5,
+ 0x33, 0x73, 0xc5, 0xdb, 0x14, 0x5b, 0x82, 0x8b,
+ 0xd2, 0xdd, 0xf1, 0x1d, 0xc8, 0x1a, 0x6b, 0x16,
+ 0xba, 0x19, 0xa4, 0x0d, 0xaa, 0x11, 0xb7, 0x2c,
+ 0x88, 0x8d, 0xde, 0x94, 0x6a, 0x3d, 0xbf, 0x52,
+ 0x95, 0x10, 0xad, 0xa5, 0x2b, 0x9d, 0xd3, 0xc3,
+ 0x07, 0x60, 0x4e, 0x37, 0xed, 0x0f, 0xb5, 0xeb,
+ 0xd1, 0xda, 0x8a, 0xec, 0x54, 0xbd, 0xad, 0xbf,
+ 0x88, 0xaf, 0xca, 0x23, 0xdf, 0xd5, 0x84, 0xc4,
+ 0xa5, 0x21, 0x3f, 0x53, 0x8b, 0xe9, 0x3c, 0xbe,
+ 0x2c, 0xf6, 0xa5, 0x27, 0xe2, 0x18, 0x16, 0xe4,
+ 0x9f, 0xfb, 0xe3, 0x17, 0x58, 0x6e, 0xc6, 0x87,
+ 0x5e, 0x2a, 0x33, 0xcd, 0x02, 0xa3, 0x94, 0x2a,
+ 0x8f, 0x09, 0x6d, 0x6b, 0x0a, 0x4e, 0x62, 0x29,
+ 0xe9, 0x40, 0xf2, 0xba, 0xfc, 0x6b, 0x7d, 0x96,
+ 0x3f, 0x7e, 0x86, 0x19, 0x5d, 0x5f, 0xb4, 0xdd,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x9a, 0x32, 0x23, 0x75, 0xc3, 0x6c, 0x8a, 0x37,
+ 0xc0, 0xf2, 0x2a, 0xd6, 0x8e, 0xbc, 0x91, 0x68,
+ 0xf9, 0xd5, 0xc2, 0x85, 0x26, 0x61, 0x9c, 0xed,
+ 0x01, 0xcd, 0x5b, 0xd9, 0xa0, 0xc0, 0x75, 0xa8,
+ 0x36, 0x7c, 0xc3, 0x2f, 0x57, 0x3c, 0x46, 0xc5,
+ 0x57, 0x6a, 0x0b, 0x96, 0xe5, 0x6b, 0x3d, 0x45,
+ 0x10, 0xe1, 0x4f, 0xd1, 0x11, 0xa9, 0x3b, 0xe1,
+ 0x34, 0xbb, 0x30, 0xbc, 0x6b, 0x86, 0x2c, 0x01,
+ 0x35, 0x38, 0x26, 0x75, 0x15, 0x9f, 0x35, 0x7a,
+ 0xb7, 0x47, 0xe0, 0x72, 0xa4, 0x42, 0x90, 0x00,
+ 0x86, 0xea, 0xdf, 0xc1, 0x19, 0xee, 0x9d, 0x44,
+ 0xe4, 0x2c, 0x4a, 0x33, 0xea, 0x5c, 0x8c, 0x1e,
+ 0xc3, 0x93, 0x1b, 0x51, 0x00, 0x5f, 0x71, 0xb6,
+ 0xc5, 0xb0, 0x94, 0x9c, 0x45, 0x1f, 0xef, 0x1d,
+ 0x1f, 0xd6, 0x1b, 0xb9, 0xa4, 0xcf, 0xe6, 0xf1,
+ 0x48, 0xcd, 0xbe, 0x78, 0xb1, 0xf7, 0x0c, 0x01,
+ 0xd7, 0x64, 0xc7, 0xeb, 0x23, 0x20, 0x21, 0x49,
+ 0xfb, 0x71, 0xf3, 0xc3, 0x63, 0x94, 0x9c, 0x91,
+ 0x2f, 0xd6, 0xbe, 0x79, 0x43, 0x83, 0x14, 0x17,
+ 0xe4, 0x2a, 0x8c, 0xac, 0x02, 0x68, 0xec, 0x71,
+ 0x88, 0xc5, 0xfa, 0xb8, 0x98, 0x0e, 0xd7, 0x19,
+ 0x1d, 0x1a, 0x3d, 0x86, 0x2c, 0xb4, 0xc3, 0x03,
+ 0x7b, 0x2a, 0xa7, 0xb5, 0x69, 0x73, 0x0e, 0x0e,
+ 0xe0, 0x67, 0x04, 0xc1, 0x71, 0xa9, 0x29, 0x46,
+ 0x71, 0x96, 0x4f, 0x64, 0x27, 0xac, 0x7a, 0x10,
+ 0x70, 0xc5, 0x5f, 0x5b, 0xca, 0x3e, 0xb3, 0xcc,
+ 0x9a, 0xe9, 0xa5, 0x03, 0x7b, 0x93, 0x2b, 0x77,
+ 0xdd, 0xd5, 0xc2, 0x0a, 0x78, 0xef, 0x7c, 0x3a,
+ 0xea, 0x6e, 0xa4, 0xf7, 0x65, 0x50, 0x01, 0xdd,
+ 0x0e, 0x60, 0xef, 0x40, 0xb2, 0x28, 0xdc, 0xa9,
+ 0x7f, 0x1a, 0x98, 0x3d, 0x8d, 0xd4, 0xa0, 0xd6,
+ 0xec, 0xe3, 0x2f, 0x1e, 0x48, 0xa6, 0x88, 0x8f,
+ 0xe4, 0x25, 0xdc, 0xdf, 0xd5, 0xfa, 0x6d, 0x16,
+ 0x94, 0xbb, 0xf7, 0xe0, 0x4f, 0x6b, 0xb7, 0x49,
+ 0x5c, 0x89, 0xde, 0x9f, 0xeb, 0x7b, 0xad, 0xda,
+ 0x57, 0x5e, 0xae, 0xa5, 0xd6, 0xfd, 0xa4, 0x20,
+ 0x07, 0x12, 0x12, 0x73, 0x56, 0x6d, 0xb8, 0x65,
+ 0x41, 0x7a, 0xdb, 0xc6, 0x25, 0x19, 0xea, 0x1c,
+ 0x83, 0x4c, 0x48, 0x77, 0x92, 0x14, 0x97, 0xe5,
+ 0x3c, 0x90, 0x4d, 0x5a, 0xb0, 0x7a, 0xab, 0xc5,
+ 0xa4, 0xdc, 0x52, 0x24, 0x75, 0xe1, 0x8f, 0x8e,
+ 0x53, 0x39, 0x1e, 0x2d, 0x95, 0x2d, 0xd3, 0xa4,
+ 0x01, 0x6a, 0x9f, 0x85, 0x5b, 0xd2, 0xe5, 0xa9,
+ 0x56, 0x0e, 0xdf, 0x89, 0x6e, 0xaa, 0x0a, 0x68,
+ 0x9c, 0x47, 0x94, 0x0d, 0xb7, 0xeb, 0x8b, 0x2e,
+ 0xdb, 0x8d, 0x99, 0xf5, 0x7b, 0x34, 0xc1, 0x19,
+ 0xd6, 0xf3, 0x42, 0x8a, 0xba, 0x50, 0xe1, 0xb1,
+ 0x26, 0xf6, 0x8a, 0x21, 0x24, 0xa4, 0xe3, 0xb5,
+ 0x93, 0x84, 0xed, 0x41, 0x74, 0x8a, 0x39, 0x6a,
+ 0xf9, 0xb9, 0x25, 0x2e, 0x71, 0x8e, 0x37, 0x6a,
+ 0x17, 0x8a, 0x3b, 0x91, 0x4e, 0x3f, 0x93, 0x10,
+ 0x6e, 0xe9, 0xa9, 0xde, 0x10, 0x87, 0x3b, 0xbb,
+ 0x8c, 0x80, 0xc8, 0xd0, 0x23, 0x01, 0xfc, 0x46,
+ 0x38, 0x39, 0x6c, 0xf9, 0x3b, 0xff, 0x4b, 0xbf,
+ 0xd8, 0xee, 0xf1, 0xf7, 0x5a, 0x71, 0x6c, 0x17,
+ 0xd9, 0x7b, 0x0e, 0x5d, 0x14, 0x02, 0x6b, 0xd9,
+ 0x2d, 0x6d, 0xe2, 0xb4, 0xc8, 0xa2, 0xc1, 0xad,
+ 0x1c, 0x5f, 0x27, 0x0e, 0xd1, 0xd7, 0xf4, 0xa0,
+ 0xd6, 0x54, 0xc2, 0x94, 0x02, 0x50, 0xe1, 0xdc,
+ 0x82, 0xf2, 0x33, 0x2e, 0x46, 0xf2, 0x80, 0x83
+//};
+//unsigned int sig_grpx_member0_sha256_rndbase_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc
new file mode 100644
index 0000000..27de6e3
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg1"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_sha256_rndbase_msg1_dat[] = {
+ 0xfc, 0x15, 0xdf, 0x05, 0x15, 0xad, 0xda, 0xbe,
+ 0x91, 0x78, 0xba, 0x72, 0x1f, 0x32, 0xd0, 0x5d,
+ 0xcb, 0x08, 0xbd, 0x8f, 0x37, 0xa8, 0x6b, 0xfe,
+ 0x58, 0x5f, 0xe4, 0x66, 0xb9, 0xbc, 0x2d, 0x68,
+ 0x21, 0xa2, 0xa7, 0x4b, 0x37, 0x50, 0x56, 0x1f,
+ 0xae, 0x20, 0xf0, 0x33, 0x29, 0xd0, 0xec, 0x64,
+ 0xde, 0xd5, 0xf4, 0x08, 0x75, 0xa1, 0xf1, 0x73,
+ 0xea, 0x20, 0x1e, 0x4e, 0x9d, 0x7f, 0x26, 0xdb,
+ 0x19, 0xb7, 0x3e, 0xe9, 0x16, 0x76, 0xc8, 0x24,
+ 0x89, 0x08, 0x03, 0xfd, 0xad, 0x7f, 0x9e, 0x88,
+ 0x5f, 0x4a, 0x99, 0x0c, 0xcf, 0x60, 0x9b, 0xaf,
+ 0x14, 0xcc, 0x1f, 0xc8, 0x0e, 0x5a, 0xe6, 0x97,
+ 0x13, 0xbf, 0x26, 0x98, 0x64, 0xd8, 0xc7, 0x7e,
+ 0xba, 0x94, 0x6b, 0x85, 0x7d, 0xda, 0xc6, 0x2f,
+ 0x37, 0x21, 0xd7, 0xc8, 0x57, 0xa4, 0xff, 0x43,
+ 0x66, 0xd0, 0xf1, 0x9f, 0x2c, 0xc3, 0xda, 0x28,
+ 0x9d, 0x1d, 0x29, 0x02, 0xd0, 0x2e, 0xf9, 0x3a,
+ 0xa6, 0xb2, 0x24, 0x60, 0x9c, 0x6f, 0x71, 0x90,
+ 0xc4, 0x32, 0x71, 0x24, 0xfb, 0xec, 0xbe, 0xca,
+ 0x66, 0x44, 0x12, 0x4f, 0x39, 0x5f, 0x1e, 0xbe,
+ 0x55, 0xb1, 0x33, 0xff, 0x1a, 0xf9, 0x73, 0xfc,
+ 0x57, 0xfe, 0x0d, 0x6e, 0xd5, 0x55, 0x22, 0xc2,
+ 0x02, 0x41, 0x10, 0x11, 0x77, 0xb7, 0x12, 0x67,
+ 0xc6, 0xc9, 0x24, 0x89, 0x4b, 0x4c, 0x55, 0xf0,
+ 0xa1, 0xfb, 0x06, 0xb6, 0x35, 0x52, 0xbd, 0x06,
+ 0xb9, 0x6a, 0xc3, 0x8d, 0xd9, 0x8f, 0x03, 0x35,
+ 0x49, 0x78, 0x93, 0xdc, 0xef, 0xd8, 0xf1, 0xdf,
+ 0x82, 0x7f, 0x72, 0xf8, 0x61, 0x43, 0x09, 0xef,
+ 0xa2, 0x85, 0x88, 0x12, 0xb8, 0x71, 0x39, 0x27,
+ 0x46, 0xa0, 0x6a, 0x9a, 0x07, 0x12, 0x76, 0xd8,
+ 0x3b, 0x38, 0x65, 0xc0, 0x11, 0x46, 0x14, 0xd4,
+ 0x00, 0x90, 0x69, 0x3b, 0x66, 0xbe, 0xcb, 0xcc,
+ 0x61, 0x71, 0x4a, 0xc7, 0x03, 0xfc, 0x35, 0xcd,
+ 0x77, 0x89, 0xea, 0xdd, 0x30, 0x1f, 0x40, 0xa8,
+ 0xea, 0xd2, 0x12, 0x22, 0x51, 0xbd, 0x49, 0xa4,
+ 0x52, 0x80, 0x3e, 0xa2, 0xa5, 0x8e, 0xea, 0xd0,
+ 0xec, 0x43, 0x3e, 0xa8, 0x23, 0x5e, 0xac, 0x5c,
+ 0x0f, 0x6b, 0x34, 0xbd, 0x76, 0x77, 0x5a, 0x2d,
+ 0x78, 0x3e, 0x42, 0x11, 0xfc, 0x96, 0x8b, 0xe2,
+ 0x35, 0x87, 0x00, 0x93, 0x34, 0xf2, 0xf0, 0xb0,
+ 0x03, 0xba, 0x82, 0x0a, 0x38, 0x5b, 0xa6, 0xe9,
+ 0xaa, 0xf3, 0x8f, 0xb3, 0x66, 0xb5, 0x84, 0x80,
+ 0x40, 0x2f, 0xac, 0x3b, 0xcf, 0x49, 0x38, 0x17,
+ 0xde, 0x0f, 0xce, 0x57, 0x07, 0x2b, 0xb8, 0xd1,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x33, 0x99, 0x88, 0x92, 0x66, 0x39, 0xe7, 0x42,
+ 0xc8, 0x21, 0xad, 0xbd, 0x71, 0xa7, 0xb5, 0xea,
+ 0x6b, 0xef, 0x02, 0x48, 0x85, 0xc7, 0x53, 0xb0,
+ 0xca, 0xc7, 0x63, 0xe0, 0xe8, 0x3d, 0x80, 0x01,
+ 0x55, 0x6a, 0x6f, 0x1b, 0x2d, 0x4f, 0x33, 0x53,
+ 0x85, 0xb4, 0x47, 0x12, 0x9a, 0x1f, 0xcc, 0x7b,
+ 0x37, 0x32, 0xec, 0x68, 0xa4, 0x97, 0xfc, 0x25,
+ 0xe6, 0x69, 0x48, 0xd1, 0x65, 0xc9, 0xd2, 0x17,
+ 0x38, 0x07, 0x6d, 0x49, 0xbe, 0x06, 0xd5, 0x28,
+ 0xb2, 0xe6, 0x16, 0x16, 0x67, 0x82, 0x3c, 0xdb,
+ 0x2c, 0x5b, 0xb0, 0x64, 0x7f, 0x44, 0x11, 0x53,
+ 0xc6, 0x6f, 0xed, 0xbc, 0x8f, 0x1e, 0xd0, 0xca,
+ 0x29, 0xea, 0x97, 0xc4, 0x84, 0xe3, 0xfc, 0xf5,
+ 0xc1, 0xb4, 0xa2, 0x31, 0x13, 0x0c, 0x30, 0x08,
+ 0x32, 0x4c, 0x2e, 0x11, 0x38, 0x63, 0xb1, 0x5c,
+ 0x9b, 0xf3, 0xca, 0xf2, 0x9a, 0x4f, 0x5d, 0x75,
+ 0x5c, 0xa9, 0xe3, 0x62, 0x2e, 0xd8, 0x8b, 0xe8,
+ 0x14, 0x5f, 0x9f, 0x27, 0x0b, 0x36, 0x26, 0x08,
+ 0x54, 0x9f, 0xac, 0xf8, 0xc6, 0x81, 0x47, 0xd6,
+ 0x28, 0x0b, 0xbf, 0x99, 0xb1, 0x94, 0x92, 0xeb,
+ 0x02, 0x9a, 0x0d, 0xde, 0x32, 0xd9, 0xc9, 0x7f,
+ 0x0f, 0x26, 0xba, 0x5f, 0x76, 0x5e, 0xdc, 0x2d,
+ 0xf7, 0x61, 0x3c, 0x57, 0x73, 0xc5, 0xbc, 0x61,
+ 0x1e, 0xc7, 0xcd, 0x6c, 0x1f, 0xe8, 0xc9, 0x00,
+ 0x1f, 0x70, 0x41, 0x0b, 0x08, 0x35, 0x0c, 0x04,
+ 0xaa, 0x99, 0x5e, 0xf4, 0x45, 0xf0, 0xfb, 0xfb,
+ 0x97, 0x72, 0x1d, 0x72, 0xd5, 0xe2, 0x7e, 0xba,
+ 0x2e, 0x69, 0x2c, 0x08, 0x3d, 0x59, 0xb3, 0xc6,
+ 0x89, 0xbd, 0xed, 0x2b, 0x29, 0x9e, 0x8e, 0x04,
+ 0x46, 0x29, 0xc4, 0x40, 0x77, 0x60, 0x76, 0x58,
+ 0x47, 0x90, 0x23, 0x65, 0x20, 0x40, 0x84, 0xb2,
+ 0xc7, 0xd3, 0x1c, 0x15, 0x77, 0x94, 0x38, 0x49,
+ 0x49, 0x22, 0x21, 0x87, 0x41, 0x04, 0x17, 0xca,
+ 0x87, 0xb8, 0xdf, 0x3f, 0xb5, 0xa6, 0x2a, 0xce,
+ 0x19, 0xd2, 0xd3, 0x51, 0xd8, 0x32, 0xd7, 0x78,
+ 0x12, 0x66, 0x6c, 0x23, 0x22, 0xbc, 0x50, 0x99,
+ 0x2f, 0x53, 0xa9, 0x1d, 0xf0, 0x26, 0x9b, 0x5b,
+ 0xab, 0xd0, 0x14, 0x6d, 0x20, 0xd6, 0x5d, 0x48,
+ 0x05, 0x97, 0x6b, 0xbe, 0xa4, 0x9e, 0xf8, 0xbd,
+ 0x3e, 0x52, 0xe9, 0xcb, 0x66, 0xc0, 0xbf, 0xe1,
+ 0x25, 0x45, 0x48, 0xb1, 0x26, 0xb6, 0xe5, 0x65,
+ 0x17, 0x33, 0x4e, 0x4b, 0x0b, 0x74, 0x84, 0x0d,
+ 0xcd, 0x9c, 0x9a, 0x98, 0xaa, 0x75, 0x2e, 0xb5,
+ 0xb4, 0x3f, 0x4a, 0x0d, 0x29, 0x18, 0xa2, 0xed,
+ 0x18, 0xc9, 0x79, 0xc6, 0xb1, 0x0b, 0x23, 0x86,
+ 0x87, 0x67, 0xd2, 0x80, 0xcc, 0x82, 0xda, 0x43,
+ 0x98, 0x39, 0x10, 0x68, 0x78, 0x8f, 0xf9, 0xaa,
+ 0x8f, 0xa9, 0xcc, 0xd8, 0x52, 0xfc, 0xda, 0xd4,
+ 0x98, 0xa5, 0xaa, 0xcc, 0x7f, 0x43, 0x6d, 0x94,
+ 0xcc, 0x7f, 0x69, 0xa8, 0xc2, 0x30, 0x3d, 0x7b,
+ 0x1d, 0x87, 0x24, 0xcf, 0x14, 0x16, 0x37, 0xc8,
+ 0x59, 0x97, 0x0a, 0x31, 0xaa, 0xeb, 0x38, 0xf8,
+ 0xaf, 0xdc, 0x85, 0x0a, 0x37, 0x47, 0x19, 0x3f,
+ 0xab, 0xcd, 0x48, 0xdc, 0x2b, 0xf6, 0x42, 0xf1,
+ 0x41, 0xc2, 0xcc, 0x8a, 0xfc, 0xbb, 0xbd, 0xe3,
+ 0xd1, 0x2e, 0x39, 0x07, 0x91, 0x36, 0x40, 0x33,
+ 0x95, 0xa6, 0x0e, 0xcf, 0x9a, 0xcf, 0xbb, 0xb2,
+ 0x9b, 0x63, 0x86, 0x31, 0xec, 0x12, 0xb3, 0x1e,
+ 0xe3, 0xcb, 0xd1, 0x2c, 0x55, 0xca, 0x07, 0xec,
+ 0x23, 0x97, 0xc2, 0xa1, 0x4d, 0xa4, 0x11, 0x13
+//};
+//unsigned int sig_sha256_rndbase_msg1_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc
new file mode 100644
index 0000000..b9855f0
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha384
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha384_bsn0_msg0_dat[] = {
+ 0x57, 0xe7, 0x8f, 0xfb, 0xf9, 0xa3, 0xba, 0x5e,
+ 0xac, 0xec, 0xb3, 0xa4, 0xf4, 0x13, 0x95, 0xa1,
+ 0x1c, 0x1d, 0xe1, 0xaf, 0xea, 0x16, 0xba, 0x6d,
+ 0xde, 0x4c, 0x43, 0xf0, 0x89, 0x59, 0x5e, 0xfa,
+ 0x0f, 0x18, 0xdd, 0x22, 0xf6, 0xd6, 0xfc, 0xe5,
+ 0x0f, 0xb2, 0x81, 0xb5, 0xa9, 0xa6, 0xe8, 0xee,
+ 0x14, 0x04, 0xec, 0x1b, 0x4e, 0x65, 0x82, 0x7f,
+ 0x96, 0x53, 0xc4, 0x3b, 0x29, 0x17, 0x39, 0xc0,
+ 0x8a, 0x3a, 0x3d, 0xef, 0x79, 0xe7, 0x7d, 0x06,
+ 0x00, 0x32, 0xc7, 0x4f, 0x82, 0x01, 0x71, 0x10,
+ 0xb1, 0x5b, 0x7b, 0x7c, 0x82, 0x10, 0xfd, 0xb4,
+ 0x8e, 0x7e, 0x87, 0x50, 0x9d, 0xc4, 0xf8, 0x4c,
+ 0x8b, 0xb2, 0xf9, 0x34, 0x17, 0x9e, 0x44, 0x93,
+ 0x47, 0xb4, 0x8c, 0x42, 0x55, 0x8a, 0xd9, 0xd8,
+ 0x12, 0x4a, 0xd9, 0x01, 0xce, 0x1a, 0x6b, 0x96,
+ 0x9d, 0x4c, 0x9b, 0xa9, 0x48, 0xae, 0x3c, 0xd6,
+ 0xc0, 0xb7, 0x0a, 0x62, 0xe7, 0xa9, 0xc8, 0xda,
+ 0x02, 0xc0, 0x1a, 0xb4, 0x8c, 0x8c, 0xda, 0x1d,
+ 0xe8, 0x2e, 0x8b, 0x16, 0x49, 0xd8, 0xe2, 0xd7,
+ 0x86, 0xab, 0x76, 0x20, 0x08, 0x9a, 0x66, 0x2e,
+ 0x60, 0x4f, 0x8d, 0xd9, 0x20, 0x0f, 0x85, 0x2a,
+ 0x9e, 0xa5, 0x95, 0x04, 0x3f, 0x82, 0xae, 0xbb,
+ 0x84, 0x35, 0xb4, 0xda, 0x93, 0x46, 0x46, 0x8c,
+ 0x6b, 0x14, 0x4a, 0x70, 0x26, 0xa4, 0xf7, 0xba,
+ 0xcd, 0x9d, 0x8e, 0x5a, 0x9d, 0x66, 0x87, 0xa6,
+ 0x50, 0x97, 0x1c, 0xea, 0x01, 0xea, 0x7e, 0xa5,
+ 0x1f, 0xf3, 0xc7, 0xff, 0x17, 0x75, 0x05, 0x0a,
+ 0xb8, 0x71, 0x79, 0x75, 0x5b, 0xfa, 0xee, 0xc7,
+ 0xb3, 0x1f, 0xed, 0xc5, 0x8c, 0x65, 0x05, 0x41,
+ 0x04, 0x82, 0xb6, 0xd9, 0xa4, 0x00, 0x12, 0xeb,
+ 0x1a, 0x26, 0xba, 0xad, 0x97, 0x3e, 0xe3, 0x0b,
+ 0x15, 0x98, 0x5d, 0xcd, 0xb3, 0x66, 0x58, 0xff,
+ 0x1d, 0x40, 0x99, 0xaf, 0xad, 0x19, 0x05, 0x06,
+ 0x7f, 0x42, 0x1e, 0xfc, 0x88, 0x23, 0x7b, 0xd4,
+ 0x6c, 0xd7, 0x3e, 0xa2, 0x16, 0x12, 0x83, 0x28,
+ 0x47, 0xf9, 0xe1, 0xed, 0x94, 0x29, 0xab, 0x7b,
+ 0xef, 0x20, 0x53, 0x9a, 0x8b, 0xdf, 0x0e, 0xd7,
+ 0x3e, 0x26, 0x26, 0x5a, 0x4a, 0x25, 0xa8, 0x09,
+ 0x76, 0x5e, 0xd0, 0x6a, 0x6c, 0xe5, 0x39, 0x10,
+ 0xcc, 0x77, 0xaa, 0x75, 0x28, 0x17, 0x43, 0xb9,
+ 0xd9, 0x7a, 0x4a, 0x36, 0xfb, 0x02, 0x42, 0x30,
+ 0xac, 0x9e, 0x28, 0x93, 0x54, 0x94, 0x9f, 0xbf,
+ 0xc2, 0x7c, 0xd7, 0xa4, 0x84, 0x89, 0x90, 0x74,
+ 0xf0, 0xcf, 0xcc, 0x0b, 0x1e, 0x8f, 0x98, 0x62,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x80, 0x71, 0x05, 0x55, 0xae, 0x18, 0xc1, 0x77,
+ 0x38, 0x6e, 0x5f, 0x17, 0xe1, 0xcb, 0x89, 0x00,
+ 0xc2, 0x43, 0x20, 0x3d, 0x63, 0x2a, 0xd8, 0xe2,
+ 0x3a, 0x7a, 0x20, 0xf0, 0x72, 0x21, 0x7d, 0x22,
+ 0xaf, 0x37, 0x4f, 0x98, 0x3a, 0x2b, 0x4f, 0x76,
+ 0x84, 0xed, 0x09, 0x74, 0x6c, 0x37, 0xf0, 0x44,
+ 0x17, 0x7e, 0xd6, 0x8c, 0x87, 0x5c, 0x98, 0x36,
+ 0xe1, 0xd9, 0x32, 0x30, 0x73, 0x31, 0x8a, 0x73,
+ 0x53, 0xf8, 0x5f, 0xa9, 0x0a, 0x72, 0xd8, 0x68,
+ 0x17, 0x8f, 0x8c, 0x97, 0xf9, 0xd2, 0x45, 0x42,
+ 0xcf, 0xd0, 0x82, 0x4a, 0x9c, 0xde, 0xca, 0xe1,
+ 0xbc, 0x63, 0xbd, 0xea, 0x75, 0xff, 0xe0, 0x61,
+ 0x89, 0x51, 0xb5, 0xbf, 0x08, 0x67, 0x19, 0x11,
+ 0x8e, 0x6b, 0x05, 0xe5, 0xc5, 0x52, 0xff, 0xb5,
+ 0x1c, 0x5a, 0xe3, 0x9a, 0xef, 0xc6, 0x52, 0xbc,
+ 0xe9, 0xc7, 0x4b, 0x1c, 0x21, 0xd8, 0xdc, 0x39,
+ 0x0e, 0x6b, 0x44, 0x5d, 0xae, 0x30, 0x98, 0xfc,
+ 0xdc, 0x54, 0xbe, 0xa5, 0xef, 0x90, 0x15, 0x9a,
+ 0x13, 0xac, 0x9f, 0xa8, 0xf7, 0xb0, 0xc7, 0xc5,
+ 0x67, 0xbd, 0xae, 0x8b, 0xa6, 0xc8, 0x20, 0xa2,
+ 0x2f, 0x26, 0x42, 0xe3, 0x8e, 0x56, 0xcc, 0xf0,
+ 0xfc, 0x24, 0x33, 0x93, 0x78, 0xa7, 0xdd, 0x5b,
+ 0x0b, 0x77, 0x7b, 0x36, 0xc4, 0xad, 0x95, 0x25,
+ 0x9b, 0x8a, 0x9f, 0xbc, 0xfb, 0xa0, 0x40, 0x18,
+ 0xc5, 0x3f, 0x32, 0x84, 0x85, 0xcb, 0xf4, 0xfd,
+ 0xf2, 0x03, 0xa9, 0xf4, 0x95, 0x50, 0x92, 0xe8,
+ 0xa8, 0x44, 0xe8, 0x92, 0xe0, 0x09, 0x71, 0x25,
+ 0x6c, 0xfb, 0x50, 0x38, 0x77, 0x6a, 0x7d, 0x6c,
+ 0xc6, 0x34, 0x72, 0xec, 0x50, 0x02, 0x0d, 0xce,
+ 0x2d, 0xfd, 0xe9, 0x2a, 0xf6, 0x8a, 0x90, 0x82,
+ 0x44, 0x45, 0xfb, 0x9f, 0x03, 0x22, 0xd0, 0x5e,
+ 0x8e, 0x01, 0xac, 0xa4, 0xb8, 0x20, 0xa1, 0x2d,
+ 0xff, 0xb2, 0x22, 0x4e, 0xe4, 0xe0, 0x68, 0x33,
+ 0x85, 0x29, 0x6b, 0xb6, 0x3c, 0xc8, 0x17, 0x40,
+ 0x80, 0x2c, 0x9a, 0x19, 0x58, 0x7c, 0x77, 0xdc,
+ 0xc9, 0xf7, 0x91, 0xa1, 0x6e, 0xfd, 0xd6, 0x3c,
+ 0x5e, 0x38, 0x9b, 0x90, 0xbf, 0xab, 0xab, 0x94,
+ 0x3d, 0x39, 0xc0, 0xe3, 0x90, 0x5c, 0xaf, 0xd1,
+ 0x81, 0x06, 0xe4, 0x03, 0x88, 0x90, 0xe1, 0x9a,
+ 0x09, 0x9d, 0x8a, 0xed, 0x81, 0xdf, 0x30, 0x85,
+ 0xc1, 0xe3, 0xd0, 0x72, 0x4e, 0x14, 0x03, 0x0b,
+ 0x72, 0x5f, 0x36, 0x7b, 0x13, 0xd7, 0xe9, 0x07,
+ 0x94, 0x89, 0xf3, 0x68, 0x6d, 0x86, 0x6b, 0x6a,
+ 0xa6, 0xdf, 0x68, 0x97, 0xf8, 0x15, 0x0f, 0xd1,
+ 0x8d, 0xeb, 0xd0, 0x43, 0xe6, 0x1d, 0x1e, 0x1a,
+ 0xc6, 0x31, 0x0c, 0x1d, 0xf0, 0x34, 0xe8, 0x8c,
+ 0x34, 0x39, 0xca, 0xf6, 0x35, 0xfe, 0xa4, 0xd2,
+ 0x1c, 0xb5, 0x96, 0x07, 0x3a, 0x40, 0xd0, 0x0b,
+ 0x7d, 0x20, 0x76, 0xeb, 0x24, 0xa1, 0xa8, 0x99,
+ 0x7c, 0xd1, 0x51, 0x3c, 0xe2, 0xf0, 0x96, 0xa6,
+ 0xeb, 0x0e, 0x8f, 0x8c, 0x35, 0xf4, 0x08, 0x26,
+ 0xf7, 0xd4, 0xbb, 0xf1, 0xd6, 0x4e, 0xa0, 0x9e,
+ 0xb8, 0x72, 0x60, 0xdf, 0x8f, 0x1d, 0xef, 0x86,
+ 0x86, 0x76, 0x56, 0x49, 0x4e, 0x31, 0x40, 0x47,
+ 0xce, 0xdf, 0x9d, 0x75, 0x5f, 0x7a, 0xe4, 0xc3,
+ 0x9c, 0xdf, 0xd7, 0x40, 0x2b, 0xf9, 0xb9, 0x12,
+ 0xf7, 0x1b, 0x9a, 0x55, 0x3f, 0x87, 0x3a, 0x67,
+ 0x75, 0xc4, 0xd9, 0xda, 0xd6, 0xc4, 0x30, 0xe6,
+ 0xc1, 0x53, 0xd1, 0x5c, 0x38, 0xdb, 0xff, 0x8d,
+ 0x21, 0x18, 0x6a, 0xb7, 0x1e, 0x05, 0x61, 0x05
+//};
+//unsigned int sig_grpx_member0_sha384_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc
new file mode 100644
index 0000000..b3b5888
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha384
+ * Message : "msg0"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha384_rndbase_msg0_dat[] = {
+ 0xa6, 0x0b, 0xac, 0x7d, 0xed, 0x65, 0xaa, 0x55,
+ 0xc7, 0xfc, 0x20, 0xde, 0x29, 0x02, 0x4d, 0x7f,
+ 0x24, 0xec, 0x24, 0x98, 0x94, 0xc9, 0x06, 0xd8,
+ 0x24, 0x14, 0x82, 0x06, 0xe6, 0xf0, 0x13, 0x6a,
+ 0x28, 0xfb, 0xed, 0xbf, 0x47, 0x25, 0x20, 0x14,
+ 0x5e, 0x68, 0x78, 0x1f, 0xc4, 0x41, 0x8c, 0x47,
+ 0x4a, 0xac, 0xdd, 0x88, 0x89, 0x95, 0xa6, 0x3a,
+ 0x52, 0x01, 0x87, 0xf0, 0xee, 0xf2, 0x8c, 0x19,
+ 0x4c, 0xe6, 0xb4, 0xc2, 0x2d, 0x8b, 0xdb, 0x45,
+ 0x91, 0x43, 0x79, 0xa5, 0x8f, 0x5b, 0x66, 0x54,
+ 0x34, 0x28, 0x1b, 0xe7, 0x10, 0x94, 0xbc, 0x88,
+ 0xcb, 0xf5, 0x4e, 0x6d, 0x3b, 0x46, 0x70, 0xb4,
+ 0xb6, 0x67, 0xf1, 0x64, 0xee, 0x1a, 0xe0, 0xb6,
+ 0x5d, 0x8c, 0xe6, 0xbd, 0xd0, 0x54, 0x7f, 0x51,
+ 0x1e, 0x4b, 0x55, 0x08, 0xb2, 0x1a, 0x22, 0x70,
+ 0x29, 0xba, 0x76, 0x59, 0xdb, 0x81, 0x95, 0x7b,
+ 0xc6, 0xd0, 0x7a, 0x0e, 0x4c, 0x6b, 0x54, 0xfb,
+ 0x01, 0xf7, 0x48, 0xc6, 0x62, 0x58, 0x3a, 0x68,
+ 0xa6, 0xb0, 0x31, 0x9f, 0x1c, 0x51, 0x90, 0x8b,
+ 0x59, 0xb4, 0x24, 0x8f, 0xd9, 0x56, 0xe4, 0xc0,
+ 0x58, 0x58, 0x5a, 0x1e, 0x8c, 0x75, 0x98, 0xcf,
+ 0xc8, 0x1c, 0x89, 0xc0, 0x94, 0x46, 0x82, 0xfc,
+ 0xc8, 0x10, 0x53, 0xc8, 0x55, 0xcd, 0x7e, 0x5b,
+ 0x7b, 0xd7, 0xfb, 0xa9, 0xe7, 0xcb, 0x9a, 0x9c,
+ 0x00, 0x8f, 0x95, 0x98, 0x7e, 0xe3, 0x24, 0x8b,
+ 0x7a, 0x8f, 0x19, 0x31, 0x1f, 0x7f, 0xcf, 0x75,
+ 0x39, 0x9a, 0x86, 0x21, 0x59, 0xf3, 0x66, 0xf6,
+ 0x7b, 0xf5, 0x0f, 0x36, 0x65, 0xe8, 0xbd, 0xca,
+ 0xed, 0x0e, 0x23, 0x62, 0x1c, 0x95, 0xb8, 0xfc,
+ 0x3d, 0x25, 0x63, 0x1a, 0x35, 0xd9, 0xbb, 0x88,
+ 0xed, 0xf9, 0x40, 0xe1, 0x93, 0xe8, 0x46, 0x59,
+ 0x40, 0x11, 0x58, 0x37, 0x82, 0x12, 0x85, 0xaf,
+ 0xf9, 0x76, 0x28, 0xcf, 0x26, 0x15, 0xdd, 0x1d,
+ 0xd5, 0x17, 0x03, 0x8f, 0xab, 0x79, 0xda, 0x93,
+ 0x1e, 0x7c, 0x03, 0xfd, 0x40, 0x3f, 0xaa, 0xb8,
+ 0xd1, 0x96, 0xe3, 0x64, 0x72, 0x6a, 0x0e, 0x62,
+ 0x21, 0x1a, 0x9c, 0x0b, 0xff, 0x4e, 0xea, 0x82,
+ 0xb2, 0xe2, 0xac, 0xa5, 0xab, 0x17, 0xb5, 0x58,
+ 0xae, 0x53, 0xc1, 0xa7, 0xeb, 0xd1, 0x7e, 0xc0,
+ 0xba, 0x26, 0xbf, 0x61, 0xc1, 0xe4, 0xe1, 0x19,
+ 0xfe, 0x7c, 0x41, 0x81, 0xc4, 0x82, 0x95, 0x51,
+ 0x1c, 0xc6, 0xd5, 0xf2, 0x7f, 0xa5, 0xee, 0x59,
+ 0xf7, 0xd1, 0x5e, 0x9c, 0xda, 0xf7, 0xe8, 0xa5,
+ 0x22, 0x2f, 0xc5, 0xf0, 0xa0, 0x73, 0xbd, 0xda,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x45, 0x60, 0xe3, 0x04, 0xa4, 0xff, 0xe1, 0xf0,
+ 0x26, 0x4e, 0x1d, 0xee, 0x9a, 0xe2, 0xdb, 0x9c,
+ 0x04, 0x7d, 0xf2, 0x88, 0x30, 0x44, 0x0b, 0x76,
+ 0x71, 0x64, 0x57, 0xfc, 0x43, 0xe0, 0x10, 0x32,
+ 0x03, 0xfe, 0x51, 0xfc, 0x0a, 0x57, 0x58, 0x31,
+ 0x19, 0x10, 0xce, 0xa3, 0x9b, 0xc1, 0x27, 0x65,
+ 0xad, 0xd7, 0x81, 0xd6, 0xe2, 0x59, 0xbf, 0xbd,
+ 0xe3, 0x59, 0x98, 0xcd, 0x37, 0xe0, 0xa9, 0xff,
+ 0x0d, 0x8f, 0x7e, 0xc8, 0x8e, 0xab, 0xd6, 0xb6,
+ 0xb6, 0x74, 0x6e, 0x5d, 0x7f, 0x60, 0x0e, 0x96,
+ 0x8c, 0x26, 0x27, 0xaf, 0x20, 0x8f, 0xee, 0x5c,
+ 0xcc, 0x61, 0x84, 0x3f, 0x39, 0x39, 0xb7, 0x07,
+ 0xbf, 0xf7, 0xcb, 0x75, 0x61, 0x34, 0xea, 0x06,
+ 0xb3, 0xc3, 0xd2, 0x2a, 0x51, 0x33, 0xce, 0x5e,
+ 0xb0, 0x26, 0x04, 0x48, 0x83, 0x5e, 0x3d, 0x59,
+ 0x8f, 0x50, 0x2b, 0xc6, 0xcd, 0x55, 0xf5, 0xb7,
+ 0x01, 0xd6, 0x84, 0x52, 0x1d, 0x22, 0x10, 0x92,
+ 0x10, 0x08, 0x3a, 0x63, 0xc2, 0x72, 0xfe, 0x9e,
+ 0x7e, 0x81, 0x0d, 0xa9, 0x16, 0x91, 0x0a, 0x55,
+ 0x9a, 0xf5, 0xae, 0x23, 0x2b, 0x8d, 0x67, 0x55,
+ 0x8c, 0x51, 0x19, 0x30, 0x1f, 0x9f, 0x8b, 0xc4,
+ 0xf4, 0x17, 0xab, 0xd1, 0x9d, 0x7a, 0xd8, 0xfa,
+ 0x5d, 0xdc, 0xe8, 0xc3, 0x24, 0x97, 0xae, 0x8a,
+ 0x64, 0x27, 0x86, 0x5f, 0x88, 0xf0, 0x92, 0xc3,
+ 0xa9, 0x13, 0x15, 0x1a, 0xc3, 0xbc, 0xba, 0x0a,
+ 0x3c, 0xb7, 0x8b, 0x46, 0xa9, 0x40, 0x94, 0x0e,
+ 0x17, 0x46, 0x3f, 0x6d, 0xcf, 0x0e, 0x0f, 0xf6,
+ 0xe6, 0xd7, 0x5c, 0x86, 0x44, 0xf7, 0x1a, 0x42,
+ 0xa0, 0xbc, 0x93, 0x9c, 0x66, 0x9d, 0x26, 0xa7,
+ 0x54, 0xad, 0x85, 0x03, 0x3c, 0x12, 0xa9, 0xab,
+ 0x56, 0xcc, 0xe7, 0x60, 0xb2, 0x5b, 0x06, 0x88,
+ 0x81, 0x47, 0xe4, 0x52, 0xde, 0x3d, 0xe0, 0x14,
+ 0x17, 0xea, 0xd1, 0x78, 0x30, 0xf2, 0xca, 0x6b,
+ 0xc4, 0x15, 0xad, 0x2f, 0x8e, 0x36, 0xa9, 0x18,
+ 0x88, 0x74, 0x62, 0xba, 0xf4, 0x6a, 0x64, 0x8c,
+ 0x20, 0x1a, 0x8f, 0x92, 0x00, 0x6d, 0x12, 0x68,
+ 0x52, 0x41, 0x3b, 0xc8, 0x88, 0xd9, 0xda, 0x6d,
+ 0x19, 0xc1, 0x32, 0x82, 0x6e, 0xd8, 0xe2, 0xd7,
+ 0x3b, 0x68, 0xf4, 0x87, 0x96, 0xe4, 0xf4, 0x91,
+ 0x52, 0x02, 0xf0, 0x02, 0xf6, 0x8e, 0xdd, 0x49,
+ 0x4d, 0xc6, 0x03, 0x0d, 0xf9, 0x27, 0x5c, 0x81,
+ 0xf0, 0xb8, 0xf4, 0xa1, 0x5f, 0x01, 0x88, 0x2a,
+ 0x05, 0x96, 0xbd, 0xbc, 0xe8, 0x0f, 0xec, 0xe5,
+ 0x83, 0xe9, 0xfc, 0x4c, 0xe1, 0xcb, 0xec, 0x51,
+ 0xaa, 0xb3, 0xc7, 0xd6, 0x64, 0x63, 0x5c, 0x66,
+ 0x46, 0xed, 0x7f, 0x49, 0x5a, 0x76, 0xb2, 0x8f,
+ 0x13, 0x19, 0x61, 0x3d, 0x95, 0x10, 0xb0, 0x5a,
+ 0x63, 0x35, 0xed, 0x0f, 0xdc, 0xf6, 0xd5, 0xf6,
+ 0x90, 0x52, 0xa3, 0x0c, 0x7c, 0xbc, 0x1f, 0x60,
+ 0xc4, 0x30, 0xd9, 0xe8, 0xe5, 0x70, 0xfa, 0x67,
+ 0xf2, 0x79, 0x76, 0x14, 0x4d, 0x5f, 0xae, 0x4f,
+ 0x2f, 0x93, 0x9d, 0x37, 0x1d, 0x53, 0xca, 0xd8,
+ 0x20, 0x1d, 0x5a, 0x2e, 0x3c, 0x9b, 0x6f, 0x3c,
+ 0xdb, 0xa9, 0xac, 0x4d, 0xe3, 0x46, 0x8c, 0x70,
+ 0xe7, 0x8b, 0xdd, 0x9c, 0x57, 0xd0, 0x5d, 0x6f,
+ 0x8c, 0x62, 0xc1, 0xd1, 0x83, 0xbc, 0x83, 0xa2,
+ 0x92, 0x6d, 0xad, 0xc5, 0xbd, 0xab, 0x48, 0xd0,
+ 0x43, 0xe0, 0xff, 0x5b, 0x90, 0x57, 0xa3, 0x6f,
+ 0xd6, 0xa3, 0x9e, 0x70, 0x23, 0x18, 0x9d, 0xa0,
+ 0x06, 0x5d, 0xa2, 0xe0, 0x43, 0xed, 0x3b, 0xd3
+//};
+//unsigned int sig_grpx_member0_sha384_rndbase_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_bsn0_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_bsn0_msg0.inc
new file mode 100644
index 0000000..7decfde
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_bsn0_msg0.inc
@@ -0,0 +1,100 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+// unsigned char sig[] = {
+0xcb, 0xc0, 0x78, 0x14, 0xbd, 0x94, 0x6f, 0xe6, 0xeb, 0x43, 0x37, 0x3b,
+0x7e, 0x22, 0x79, 0xf4, 0x4d, 0xc1, 0x55, 0x93, 0x7f, 0x5c, 0x22, 0x2f,
+0x87, 0x15, 0x18, 0x92, 0xbd, 0x23, 0x15, 0x83, 0x9e, 0x0d, 0x3b, 0x35,
+0xe9, 0xd0, 0xdd, 0xd5, 0xd8, 0x99, 0xac, 0x22, 0xaf, 0x2a, 0xa3, 0x52,
+0x25, 0xfa, 0x02, 0x50, 0x60, 0x60, 0xd3, 0x07, 0x7a, 0x59, 0xec, 0x8d,
+0xb2, 0xf6, 0x6e, 0x2d, 0x98, 0x59, 0x58, 0x94, 0x34, 0xda, 0x7a, 0x0b,
+0x66, 0xc4, 0xa5, 0x8f, 0x6a, 0x56, 0xf6, 0x91, 0x0b, 0xa8, 0x52, 0xde,
+0xb4, 0x1c, 0x36, 0xa7, 0x93, 0x6d, 0xbf, 0xd6, 0xca, 0x0e, 0x77, 0x9a,
+0xb1, 0xdf, 0xc4, 0x78, 0x61, 0x41, 0x17, 0xb2, 0x74, 0x7f, 0x92, 0xc8,
+0x26, 0x17, 0x89, 0xa0, 0x1b, 0xdb, 0x6a, 0x82, 0x1b, 0x7d, 0xb0, 0x3b,
+0x3e, 0x4e, 0x06, 0x81, 0x83, 0x3a, 0x79, 0x09, 0xba, 0xec, 0xaa, 0x96,
+0x22, 0xa9, 0xaa, 0xb3, 0x4f, 0x19, 0x9e, 0xf3, 0xed, 0x82, 0xcc, 0xf2,
+0x69, 0x4c, 0x17, 0x39, 0x27, 0xf4, 0x18, 0x98, 0x0f, 0xdc, 0xc9, 0x4e,
+0x93, 0x9c, 0x5e, 0xad, 0x77, 0xbd, 0xe2, 0x74, 0x0b, 0xa9, 0x8a, 0x8a,
+0xfc, 0xa6, 0x79, 0x0b, 0x72, 0x7b, 0x2a, 0x9b, 0xba, 0x25, 0x51, 0x06,
+0x06, 0x14, 0xc4, 0x6d, 0xa6, 0x2f, 0xf5, 0xdd, 0x3d, 0xd6, 0x49, 0x61,
+0x6c, 0x08, 0x7a, 0xff, 0x66, 0xbf, 0xf5, 0xbb, 0x08, 0x3d, 0x14, 0x89,
+0x15, 0x5a, 0xcf, 0xcd, 0x50, 0xbb, 0xab, 0x4d, 0xb2, 0xda, 0x9d, 0xac,
+0x6d, 0xee, 0xc3, 0xf7, 0x09, 0x9a, 0x84, 0xe1, 0x75, 0x2e, 0x1a, 0x7d,
+0x50, 0xa2, 0x62, 0xaf, 0xf4, 0x0a, 0x9a, 0x7c, 0x9d, 0x13, 0x0a, 0xd6,
+0x34, 0x5d, 0x97, 0xc7, 0x65, 0x2a, 0xda, 0x5e, 0xae, 0xf0, 0x6c, 0x4b,
+0x7d, 0x9f, 0x10, 0x99, 0x04, 0x1b, 0xde, 0x58, 0xe7, 0xa7, 0xa5, 0x31,
+0x0a, 0x5b, 0x51, 0x01, 0xc8, 0x65, 0x47, 0xf2, 0xbc, 0x19, 0xf2, 0xe0,
+0x7f, 0x43, 0x9d, 0x58, 0x50, 0xf2, 0xbf, 0x47, 0x94, 0xce, 0xa9, 0x50,
+0x81, 0x60, 0x72, 0x64, 0xf2, 0x6e, 0x62, 0x8b, 0x13, 0x6a, 0x95, 0x7f,
+0xf1, 0xfe, 0x3e, 0x6a, 0xc1, 0x5e, 0x59, 0x98, 0x24, 0x0b, 0xc7, 0x31,
+0x12, 0xe1, 0x96, 0x92, 0xdb, 0x39, 0x17, 0xcf, 0xb8, 0x0e, 0x02, 0xd5,
+0x3b, 0x5e, 0x8f, 0x32, 0xee, 0x58, 0x02, 0x6f, 0x9f, 0x08, 0xe1, 0xf7,
+0xe9, 0x63, 0xed, 0xae, 0xf0, 0xe5, 0x43, 0xcb, 0x31, 0x76, 0x78, 0x33,
+0x06, 0x84, 0xc2, 0x87, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+0x43, 0x04, 0xf0, 0xea, 0xe0, 0xca, 0x02, 0x65, 0x22, 0xd4, 0x68, 0x5c,
+0x12, 0xfa, 0xe0, 0x39, 0x23, 0x5a, 0xde, 0x7e, 0xb2, 0xed, 0x02, 0x4f,
+0xcc, 0x10, 0xe4, 0xf7, 0x5f, 0x7d, 0x69, 0xbc, 0x6d, 0xf9, 0xe9, 0x0b,
+0x88, 0x1b, 0x60, 0xad, 0xee, 0xab, 0x56, 0xc1, 0x36, 0x44, 0x58, 0x92,
+0x28, 0x64, 0x87, 0xdc, 0x2a, 0xfb, 0x1e, 0x59, 0x24, 0xbb, 0x07, 0xf5,
+0x1c, 0x3a, 0xee, 0xe7, 0x33, 0xec, 0x48, 0xd3, 0xd3, 0x10, 0xf4, 0x0a,
+0x3c, 0xb6, 0xfd, 0x80, 0x0a, 0x95, 0x91, 0x67, 0xa6, 0x53, 0x34, 0x19,
+0x63, 0x4c, 0x4d, 0xff, 0x21, 0xe9, 0x0c, 0xc2, 0x53, 0x95, 0x27, 0xbd,
+0x7f, 0x60, 0x5f, 0x3c, 0xa6, 0x8f, 0xcb, 0xf8, 0x67, 0x91, 0xa9, 0xb9,
+0x11, 0x52, 0xa7, 0x49, 0x04, 0xde, 0x1d, 0x47, 0x4a, 0xc8, 0x9b, 0x27,
+0x31, 0x03, 0xa4, 0x4c, 0x3b, 0x29, 0xfc, 0xa4, 0x35, 0x11, 0x42, 0x86,
+0x3f, 0x67, 0x70, 0xac, 0x89, 0x66, 0x93, 0x39, 0x2a, 0xce, 0x34, 0x51,
+0xcc, 0x7d, 0x93, 0x5b, 0x0f, 0xe4, 0xbd, 0xdf, 0x70, 0xaa, 0xf2, 0x74,
+0x61, 0x2c, 0x6c, 0x63, 0x78, 0xd9, 0xf1, 0x6b, 0x41, 0x4f, 0xeb, 0xe4,
+0x25, 0x00, 0x45, 0xd4, 0xab, 0xce, 0xd2, 0x01, 0xa0, 0x18, 0xd1, 0x37,
+0x6c, 0xb1, 0xb4, 0x44, 0xef, 0x62, 0x18, 0x76, 0x2a, 0xd8, 0x56, 0x26,
+0xee, 0x6c, 0x68, 0xd9, 0xf8, 0x91, 0xd9, 0x5a, 0x10, 0x52, 0x75, 0xb0,
+0x3e, 0xe8, 0x98, 0xa9, 0x37, 0x3d, 0x18, 0x50, 0xfd, 0x7c, 0x18, 0x43,
+0xbd, 0x25, 0x4e, 0x08, 0x02, 0xc0, 0x9e, 0xa5, 0x47, 0xcb, 0x3c, 0xd4,
+0xb9, 0xe1, 0x7a, 0xdf, 0x70, 0x35, 0x7b, 0x61, 0x42, 0x1a, 0x86, 0xf0,
+0xab, 0x64, 0xf5, 0x5c, 0x5c, 0x7f, 0xfa, 0xd5, 0x73, 0x1e, 0xd6, 0x62,
+0x67, 0xad, 0xf2, 0xe7, 0x8b, 0xd0, 0xaf, 0xbb, 0x5f, 0x1f, 0xff, 0xb0,
+0xc0, 0x94, 0x6e, 0x68, 0xed, 0xc3, 0xdb, 0x8f, 0x2f, 0xeb, 0x72, 0x2c,
+0x65, 0xb8, 0x8b, 0x50, 0x2f, 0x28, 0xfa, 0xa0, 0xdd, 0x8a, 0x42, 0xd7,
+0xeb, 0xc3, 0xd2, 0x49, 0xb7, 0x56, 0x6d, 0xc1, 0x23, 0xa5, 0x8c, 0xe1,
+0x19, 0xde, 0x59, 0x46, 0xaf, 0x4e, 0x10, 0x77, 0x9c, 0x5e, 0x7f, 0x00,
+0x74, 0x83, 0x57, 0x04, 0xc1, 0xee, 0x48, 0xba, 0x13, 0xab, 0x06, 0x8b,
+0xb7, 0x07, 0xa0, 0x7c, 0x17, 0x1a, 0x62, 0xa3, 0xdf, 0x86, 0xcd, 0xd0,
+0x3a, 0xc1, 0x4f, 0x80, 0x0d, 0x64, 0x8e, 0xf8, 0xe6, 0xf9, 0xed, 0x35,
+0x26, 0xe5, 0x04, 0x3e, 0x61, 0xd9, 0x32, 0x5a, 0x5c, 0x56, 0x51, 0xb2,
+0xdf, 0xab, 0x5c, 0x7e, 0xce, 0xd6, 0xb7, 0x6d, 0x10, 0xc5, 0xb4, 0xf6,
+0x66, 0xe0, 0xb7, 0x1b, 0x36, 0x78, 0x05, 0xde, 0xa7, 0xdd, 0x93, 0xdd,
+0x6f, 0x74, 0xa6, 0xce, 0x3e, 0xb7, 0x52, 0x32, 0xdc, 0x09, 0xba, 0x25,
+0xb2, 0xc8, 0xa1, 0x6b, 0x67, 0xa3, 0xac, 0x77, 0xd9, 0xa8, 0x14, 0x09,
+0x7d, 0x2a, 0x66, 0x89, 0x3f, 0xc0, 0x3a, 0xaf, 0xef, 0x79, 0xfb, 0x38,
+0x59, 0x58, 0x78, 0xd1, 0x78, 0x73, 0x0d, 0xaf, 0x80, 0xe6, 0x2c, 0x90,
+0x21, 0x97, 0x7c, 0xa5, 0xa6, 0xe7, 0x4c, 0x30, 0xfe, 0x96, 0xea, 0x82,
+0xcd, 0x14, 0x20, 0xec, 0xc4, 0x81, 0x29, 0xec, 0x82, 0xc7, 0xfe, 0xe2,
+0x79, 0x92, 0x12, 0x61, 0x3f, 0xc8, 0xa2, 0x45, 0x2e, 0xe3, 0xe9, 0x11,
+0xfc, 0x22, 0xc3, 0xb4, 0x73, 0x5c, 0xcb, 0xc3, 0xd5, 0x24, 0x75, 0x9d,
+// }
+// unsigned int sig_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0.inc
new file mode 100644
index 0000000..12d464b
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0.inc
@@ -0,0 +1,100 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+// unsigned char sig[] = {
+ 0xf9, 0x71, 0x8d, 0x87, 0x0c, 0x04, 0x6a, 0x5c, 0xea, 0x61, 0xee, 0xcd,
+ 0x41, 0x62, 0xc6, 0xc0, 0x30, 0x88, 0x34, 0x2d, 0x37, 0xd6, 0x47, 0xa8,
+ 0x39, 0xe1, 0x6a, 0xa5, 0x56, 0xae, 0x1c, 0x4f, 0x62, 0x36, 0xcb, 0x59,
+ 0x10, 0xf5, 0x81, 0x94, 0x08, 0xe6, 0xd0, 0x62, 0xab, 0x59, 0x9f, 0x29,
+ 0xc9, 0xaf, 0xe5, 0x75, 0xa5, 0xee, 0x30, 0xd8, 0x0c, 0xc4, 0x63, 0x4d,
+ 0x2a, 0x72, 0xee, 0xd4, 0xfc, 0x3a, 0xc1, 0x2a, 0xd9, 0xad, 0xb2, 0xc0,
+ 0xe1, 0x62, 0x7e, 0x01, 0xb0, 0x28, 0x2b, 0x74, 0x7d, 0xba, 0xab, 0x6a,
+ 0x12, 0x81, 0x81, 0x51, 0xad, 0x27, 0x8d, 0xc8, 0x66, 0xba, 0x29, 0xd0,
+ 0xdd, 0x0f, 0xa1, 0x41, 0xd8, 0xf7, 0xc3, 0xca, 0xcf, 0x71, 0x2d, 0xaf,
+ 0x90, 0x7b, 0x22, 0x7b, 0x63, 0x74, 0x5a, 0x74, 0x20, 0xe8, 0xa3, 0x93,
+ 0x17, 0xc4, 0x4e, 0xca, 0xf0, 0x5e, 0xc1, 0x5c, 0xd1, 0x1a, 0x6c, 0xc2,
+ 0x22, 0xdb, 0x9f, 0xff, 0x3b, 0x0c, 0x49, 0xe0, 0x22, 0x64, 0x46, 0x7a,
+ 0x87, 0x0e, 0x49, 0x42, 0x53, 0xf4, 0xbb, 0xdb, 0x6e, 0xd1, 0x15, 0xd5,
+ 0xec, 0x70, 0x6b, 0xed, 0x8c, 0x99, 0x85, 0x88, 0x77, 0xc8, 0x09, 0xb7,
+ 0x2f, 0xc4, 0x35, 0xbd, 0x0a, 0xe5, 0x3d, 0x1c, 0xd3, 0x23, 0x94, 0x07,
+ 0x42, 0x50, 0x02, 0x48, 0x5c, 0x4f, 0x22, 0x23, 0xce, 0xb8, 0x70, 0x44,
+ 0x9d, 0x55, 0xae, 0x3b, 0x4c, 0xa7, 0xe9, 0x58, 0xf7, 0x83, 0x1a, 0x11,
+ 0x97, 0x6b, 0x2b, 0x19, 0x6a, 0xf9, 0x5d, 0x45, 0x4f, 0xae, 0x6c, 0xb2,
+ 0x72, 0x40, 0xb0, 0x54, 0x6c, 0x8e, 0xbc, 0x64, 0x0c, 0x7e, 0xf5, 0x32,
+ 0x97, 0x4e, 0x2d, 0xb4, 0x88, 0x76, 0x26, 0xc5, 0x2a, 0x28, 0x5c, 0x46,
+ 0xe7, 0x1f, 0x04, 0xc0, 0xad, 0xe6, 0xcd, 0x51, 0xaf, 0x25, 0x89, 0x17,
+ 0xff, 0x3e, 0x90, 0xba, 0x8e, 0x50, 0xe5, 0x6d, 0xe6, 0x10, 0xbf, 0x99,
+ 0x56, 0x61, 0x47, 0xfb, 0xa9, 0x1a, 0x77, 0xd9, 0xdf, 0xe1, 0x62, 0x51,
+ 0xa8, 0xe1, 0x91, 0x64, 0xf4, 0x87, 0xa0, 0x1d, 0xe8, 0x46, 0x68, 0xcb,
+ 0x76, 0x9f, 0x51, 0x49, 0x7b, 0xe7, 0xfe, 0xde, 0x21, 0xb6, 0xca, 0x93,
+ 0x8b, 0x5e, 0x8e, 0x79, 0xa0, 0x9e, 0x69, 0xf3, 0xe5, 0x4d, 0x53, 0x3a,
+ 0x3b, 0x6c, 0x28, 0xe1, 0x56, 0x6a, 0xb9, 0x86, 0x0a, 0xc8, 0x81, 0xb9,
+ 0x87, 0xee, 0xe4, 0xb0, 0x41, 0x3a, 0x4a, 0x4b, 0xde, 0x39, 0x2b, 0x63,
+ 0x62, 0x2a, 0x97, 0xd6, 0x9c, 0xaa, 0xc9, 0xdd, 0x09, 0x77, 0x53, 0x5f,
+ 0xdb, 0xfe, 0x7d, 0x51, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xad, 0x09, 0xe0, 0x35, 0xf5, 0xfb, 0xc9, 0xc0, 0xf4, 0x18, 0x23, 0x31,
+ 0x29, 0xed, 0xbb, 0x33, 0xf7, 0x38, 0x86, 0xe2, 0xd8, 0x69, 0x0e, 0x7d,
+ 0xf3, 0x94, 0xbb, 0xe8, 0xfb, 0xbe, 0xcd, 0xaf, 0x51, 0xd7, 0x38, 0x6b,
+ 0x52, 0x0d, 0x73, 0x0e, 0x1a, 0xda, 0x2c, 0x0c, 0xa3, 0x96, 0x00, 0x47,
+ 0x86, 0xc9, 0x59, 0xec, 0xc0, 0xe5, 0xb3, 0x36, 0xae, 0x3b, 0xd9, 0x1a,
+ 0xae, 0x73, 0x34, 0x94, 0xbd, 0x69, 0x6d, 0x36, 0xa6, 0xc4, 0x82, 0x0f,
+ 0xfa, 0xb9, 0x6b, 0x9e, 0x59, 0xb5, 0x4e, 0xe6, 0x15, 0x4f, 0x20, 0xcc,
+ 0xd4, 0x2c, 0x17, 0x29, 0xd0, 0xb1, 0x17, 0x88, 0xb4, 0xc7, 0xf3, 0xdb,
+ 0xff, 0x20, 0xa5, 0x40, 0x4b, 0x35, 0x8e, 0x03, 0x51, 0xa2, 0x18, 0x90,
+ 0x27, 0x24, 0x0b, 0x57, 0x3f, 0xb5, 0x6c, 0x97, 0x0c, 0x33, 0xe1, 0xb2,
+ 0x84, 0xbb, 0x37, 0xfc, 0x71, 0xd4, 0xb5, 0x9f, 0x51, 0xed, 0xe1, 0x59,
+ 0x14, 0x51, 0xb1, 0x9a, 0x63, 0x70, 0x3e, 0x93, 0x53, 0x52, 0x02, 0x70,
+ 0x02, 0xde, 0x05, 0xa5, 0x51, 0x85, 0x82, 0x12, 0xd2, 0x66, 0xa0, 0x41,
+ 0xae, 0x93, 0x29, 0x21, 0x9c, 0x35, 0x8f, 0xea, 0x2b, 0xee, 0xcd, 0x47,
+ 0xa8, 0xb8, 0xc1, 0x26, 0x6c, 0x73, 0x40, 0x9d, 0xdf, 0xf0, 0x67, 0x75,
+ 0x9d, 0x52, 0x5a, 0x50, 0x95, 0x57, 0xd1, 0x5d, 0x9f, 0x5f, 0x8a, 0xe8,
+ 0x1b, 0x9d, 0x65, 0x9a, 0x36, 0xe9, 0xb1, 0x6f, 0x74, 0x03, 0x18, 0x59,
+ 0x95, 0x01, 0x5a, 0x90, 0xc3, 0x95, 0x7b, 0x88, 0xa0, 0xf3, 0xdc, 0x05,
+ 0xa3, 0x95, 0xdc, 0x4b, 0x9d, 0x77, 0x5f, 0x2c, 0x43, 0x74, 0x04, 0xb7,
+ 0x56, 0xc5, 0xf7, 0x46, 0x46, 0xf8, 0x84, 0x30, 0x4b, 0x7c, 0x04, 0x89,
+ 0x73, 0xde, 0xaf, 0xb5, 0xd2, 0xbc, 0xaf, 0x30, 0xad, 0x91, 0x2d, 0x78,
+ 0x5a, 0x1f, 0x09, 0x89, 0x5f, 0xd4, 0x1f, 0x1e, 0x24, 0xe5, 0xb1, 0x2f,
+ 0xbe, 0xc3, 0x4e, 0xf4, 0x66, 0xa4, 0x84, 0x62, 0xd6, 0xcf, 0x2e, 0x89,
+ 0xf0, 0x57, 0xe7, 0xbe, 0x86, 0xe0, 0x20, 0xc0, 0x9f, 0xca, 0xd4, 0x5d,
+ 0x2e, 0x02, 0x3f, 0x8a, 0x9f, 0x8a, 0x12, 0x2e, 0x6a, 0x6c, 0x0f, 0x71,
+ 0xaa, 0x27, 0x44, 0x4f, 0xca, 0xf2, 0x56, 0x28, 0x49, 0x91, 0x9b, 0xa5,
+ 0x24, 0x91, 0x07, 0x6a, 0xfa, 0x7f, 0xdc, 0x96, 0x83, 0x81, 0x2c, 0x36,
+ 0x42, 0x8f, 0xe8, 0xf6, 0xa0, 0x42, 0x59, 0xbb, 0xd8, 0xf9, 0x17, 0x3c,
+ 0x7d, 0xd2, 0xa4, 0x9c, 0xb6, 0xcc, 0xbe, 0x0d, 0xbf, 0xc6, 0x42, 0x34,
+ 0x35, 0x6c, 0x7b, 0x8e, 0x86, 0x91, 0x40, 0x44, 0xc4, 0x13, 0xa4, 0x4b,
+ 0x4d, 0x73, 0xaf, 0xd9, 0x2e, 0xbf, 0xd2, 0x84, 0xbc, 0x74, 0x9b, 0x4f,
+ 0x63, 0x50, 0x57, 0xda, 0xe8, 0x2e, 0x10, 0x6f, 0xbb, 0x3b, 0x13, 0xc4,
+ 0xa3, 0x22, 0x6d, 0xc7, 0x42, 0x8b, 0x0c, 0xb5, 0x18, 0xe6, 0x99, 0x31,
+ 0xf7, 0xbe, 0xab, 0x42, 0x70, 0xee, 0x19, 0xea, 0x79, 0xab, 0xe4, 0xbe,
+ 0x07, 0xe5, 0xa9, 0x67, 0x78, 0xee, 0xdd, 0xf1, 0xd6, 0x94, 0x04, 0xf4,
+ 0xe2, 0x7b, 0x5a, 0xb3, 0xdd, 0x4b, 0x4f, 0x1b, 0x05, 0x41, 0x6b, 0x01,
+ 0x11, 0xf6, 0x0e, 0xec, 0x84, 0x04, 0xce, 0x9f, 0xaa, 0x9a, 0x75, 0x48,
+ 0x09, 0x3c, 0xc2, 0x0a, 0x31, 0x7f, 0x13, 0x71, 0x81, 0x20, 0x93, 0xd2,
+ 0x53, 0xce, 0xe7, 0xc6, 0x41, 0xd3, 0xfb, 0x7c, 0xc4, 0x05, 0xc6, 0x1c,
+ 0x83, 0x26, 0x00, 0x78, 0x67, 0xe5, 0xb3, 0x0a, 0x41, 0xe1, 0xec, 0x42
+// };
+// unsigned int sig_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0_no_sigrl.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0_no_sigrl.inc
new file mode 100644
index 0000000..3720cba
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0_no_sigrl.inc
@@ -0,0 +1,88 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: random
+ * SigRl : no sigrl
+ */
+ // unsigned char sig[] = {
+ 0xc2, 0x8c, 0xa4, 0x67, 0x82, 0xb2, 0x29, 0x10,
+ 0xe2, 0x21, 0x20, 0xf2, 0x6c, 0x10, 0x2b, 0x10,
+ 0x39, 0xea, 0x4f, 0x20, 0x6a, 0xb0, 0x2a, 0xfc,
+ 0x12, 0xba, 0xf8, 0xf7, 0x4b, 0xa6, 0x1c, 0x87,
+
+ 0x3e, 0x09, 0x74, 0xd1, 0x3a, 0x3f, 0x0e, 0x16,
+ 0x47, 0x75, 0x19, 0x2c, 0x5a, 0x90, 0xa2, 0xf3,
+ 0x5a, 0x3a, 0x17, 0xab, 0xeb, 0x0a, 0xe3, 0x41,
+ 0xd3, 0x77, 0xc2, 0xdd, 0x14, 0xcd, 0x52, 0x2c,
+
+ 0x60, 0xca, 0x87, 0x57, 0xc9, 0x91, 0x51, 0x48,
+ 0x7b, 0x48, 0x4a, 0x10, 0x81, 0xb3, 0x05, 0x77,
+ 0xdc, 0x5e, 0x1c, 0x9d, 0xcf, 0xbc, 0x18, 0x7c,
+ 0x1b, 0x97, 0x58, 0x45, 0xde, 0x2e, 0xce, 0x2c,
+
+ 0xd5, 0xa5, 0xf2, 0x79, 0x70, 0xbd, 0x72, 0x0d,
+ 0x11, 0x10, 0x60, 0x41, 0x01, 0x5c, 0x25, 0xd4,
+ 0x68, 0xa1, 0xe5, 0x86, 0x6e, 0x72, 0xa7, 0xc6,
+ 0x24, 0x22, 0x66, 0xe0, 0x63, 0x55, 0x07, 0xb9,
+
+ 0xe9, 0x6c, 0xad, 0xa7, 0xdc, 0x39, 0x5e, 0xb1,
+ 0xec, 0x7f, 0x42, 0x55, 0x60, 0x83, 0xd8, 0xda,
+ 0x9d, 0xb4, 0xb0, 0xef, 0x28, 0x37, 0x6a, 0xfd,
+ 0x65, 0xdd, 0xce, 0x93, 0x08, 0x22, 0x01, 0x19,
+
+ 0x22, 0x51, 0x58, 0x80, 0x27, 0x94, 0xaa, 0x15,
+ 0xd4, 0xff, 0xfa, 0x21, 0xd0, 0xa4, 0x07, 0x43,
+ 0xc5, 0x43, 0x16, 0x5a, 0x4b, 0x95, 0xfd, 0x4b,
+ 0xe7, 0x50, 0x7a, 0xee, 0x1e, 0x91, 0x81, 0x49,
+
+ 0xb1, 0x89, 0x7c, 0x8f, 0xed, 0x4f, 0x02, 0x66,
+ 0x52, 0xbf, 0xfb, 0x4f, 0xc7, 0x9b, 0x58, 0xb1,
+ 0x30, 0x8a, 0x00, 0x5a, 0x39, 0x99, 0x64, 0x67,
+ 0xfa, 0x7a, 0xc3, 0x62, 0xf8, 0x04, 0x4a, 0x21,
+
+ 0x9e, 0x91, 0xf9, 0x22, 0x64, 0x8c, 0x7d, 0x8e,
+ 0x7d, 0x9a, 0xe9, 0xb8, 0xd4, 0x95, 0xc6, 0x3e,
+ 0xda, 0xb3, 0xb9, 0x6b, 0x93, 0x5c, 0x21, 0x05,
+ 0x29, 0xb4, 0xbf, 0x16, 0x80, 0xc9, 0xba, 0xe2,
+
+ 0xd6, 0xf2, 0x1f, 0x4e, 0xdb, 0x1b, 0x79, 0x12,
+ 0x02, 0xb5, 0x11, 0xdf, 0x30, 0x21, 0xf4, 0x53,
+ 0xda, 0x00, 0x6b, 0xc7, 0x60, 0x6a, 0x85, 0x2a,
+ 0xfa, 0xec, 0x03, 0x0f, 0x6a, 0x2a, 0xe1, 0x60,
+
+ 0x94, 0x8f, 0x7e, 0x04, 0xea, 0x54, 0x06, 0x6c,
+ 0x0f, 0x44, 0x37, 0x89, 0xd7, 0x33, 0x76, 0x92,
+ 0xf9, 0xd4, 0x46, 0xd3, 0xbd, 0x93, 0xfe, 0x37,
+ 0x3e, 0x51, 0x0a, 0xfc, 0x8b, 0xa3, 0x2f, 0xa9,
+
+ 0xea, 0xd7, 0x8a, 0xa5, 0x2c, 0x94, 0xbe, 0xd4,
+ 0x40, 0x1f, 0xe3, 0x92, 0x7d, 0x60, 0xc3, 0x76,
+ 0x2b, 0xeb, 0x72, 0x7e, 0x0d, 0x70, 0x6c, 0xdb,
+ 0x1b, 0xa8, 0xec, 0xb6, 0x37, 0xf6, 0x8f, 0x15,
+
+ 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// };
+// unsigned int sig_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc
new file mode 100644
index 0000000..072a224
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha512_bsn0_msg0_dat[] = {
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4,
+ 0x56, 0x4f, 0x11, 0x31, 0x62, 0x07, 0x02, 0x0f,
+ 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f,
+ 0xa7, 0xd5, 0xec, 0x4b, 0x3e, 0x23, 0x5f, 0x4f,
+ 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49,
+ 0xa9, 0xed, 0x1d, 0x88, 0xde, 0xa6, 0x93, 0x18,
+ 0x4a, 0x58, 0xea, 0xc3, 0x7c, 0x9e, 0xf1, 0x2a,
+ 0x1a, 0xbf, 0x5a, 0xf8, 0xd5, 0xb4, 0xae, 0xa8,
+ 0x9a, 0x37, 0xdc, 0x1b, 0xe1, 0xab, 0xb0, 0xef,
+ 0x45, 0x88, 0x94, 0x48, 0x99, 0xc8, 0x70, 0x3b,
+ 0x25, 0x70, 0x5a, 0x84, 0x4c, 0x65, 0x29, 0x64,
+ 0xe2, 0x2b, 0x28, 0x84, 0xcf, 0x05, 0x83, 0xfb,
+ 0x00, 0xe9, 0x20, 0xc2, 0xb2, 0x12, 0x3c, 0x90,
+ 0x12, 0xeb, 0x85, 0x3a, 0x70, 0xe4, 0xed, 0x64,
+ 0x73, 0xc2, 0xef, 0x1b, 0x33, 0x7b, 0xa9, 0xf1,
+ 0x76, 0xae, 0xac, 0x99, 0xd1, 0xaa, 0x9c, 0xb1,
+ 0xcb, 0x17, 0x40, 0xf9, 0x9d, 0xa9, 0x75, 0x7f,
+ 0xe6, 0x9e, 0x8d, 0x31, 0xf0, 0x07, 0x7b, 0x33,
+ 0xb6, 0x11, 0x7e, 0xf3, 0xa0, 0xf2, 0x42, 0xdf,
+ 0xe2, 0x6a, 0xa0, 0x10, 0xb6, 0x6a, 0xda, 0x6d,
+ 0x1e, 0xf3, 0x18, 0xf1, 0xd7, 0x0c, 0x9b, 0x67,
+ 0x97, 0x62, 0xd6, 0xc7, 0x92, 0x61, 0xa0, 0x23,
+ 0x4e, 0xb2, 0xd3, 0x08, 0x5e, 0x74, 0x65, 0xd0,
+ 0xca, 0x0c, 0x9d, 0x5d, 0x81, 0x13, 0xa3, 0x16,
+ 0x6d, 0x44, 0xc4, 0x74, 0x4f, 0xf4, 0x33, 0x97,
+ 0xd5, 0xb5, 0x46, 0xc7, 0xde, 0x7c, 0xef, 0xbb,
+ 0xfc, 0x58, 0x16, 0xe3, 0x13, 0xc3, 0x7d, 0x24,
+ 0x1c, 0x8a, 0x50, 0x98, 0x31, 0x81, 0x66, 0xc3,
+ 0x4f, 0x75, 0xd7, 0xa8, 0xc4, 0xec, 0xe0, 0x63,
+ 0xf4, 0x48, 0x79, 0xdf, 0x5a, 0xec, 0xad, 0x64,
+ 0x48, 0x21, 0x28, 0x3b, 0x8a, 0x75, 0xcc, 0x37,
+ 0x78, 0x0f, 0x56, 0x4a, 0x1e, 0xbe, 0xc1, 0xd4,
+ 0x24, 0x6d, 0x0a, 0x62, 0x35, 0x3d, 0x87, 0xcf,
+ 0xd4, 0x45, 0xb7, 0x16, 0xab, 0xe7, 0xce, 0x2a,
+ 0xb3, 0xda, 0x32, 0xd1, 0x5d, 0xa8, 0x23, 0x51,
+ 0x3c, 0x6e, 0x24, 0x3e, 0x19, 0x34, 0xd1, 0xe7,
+ 0x69, 0x59, 0x2e, 0x2c, 0x56, 0x40, 0x92, 0x51,
+ 0x90, 0xbe, 0xcd, 0x7d, 0x42, 0x5c, 0xa9, 0xf0,
+ 0x4b, 0xcb, 0x5e, 0x2b, 0xb3, 0xa6, 0x15, 0xf3,
+ 0xfb, 0x60, 0x27, 0xad, 0x8e, 0x57, 0xff, 0x41,
+ 0x45, 0xa0, 0xb2, 0xb9, 0x89, 0xcc, 0x9e, 0x9e,
+ 0x36, 0x12, 0x3d, 0x5e, 0xdd, 0xcf, 0x54, 0xbc,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x78, 0xe5, 0x54, 0xb7, 0x82, 0x81, 0xb6, 0xf2,
+ 0xab, 0x11, 0x73, 0x08, 0x4f, 0x9a, 0xda, 0xcc,
+ 0xc5, 0x94, 0x78, 0x08, 0xc0, 0x22, 0xda, 0x06,
+ 0x87, 0xd4, 0xa0, 0x9f, 0x50, 0xb3, 0x04, 0xdc,
+ 0xbe, 0x5b, 0x02, 0x28, 0x71, 0x8f, 0x4f, 0x18,
+ 0x2b, 0xb1, 0xab, 0x62, 0x83, 0x9c, 0xb7, 0x1b,
+ 0x87, 0x48, 0x8f, 0xbe, 0x4f, 0x1c, 0x8d, 0x16,
+ 0xa4, 0xed, 0x4f, 0xe4, 0x10, 0x4c, 0x83, 0xd9,
+ 0xcb, 0xa3, 0xdc, 0xd2, 0x5e, 0xdd, 0xab, 0x2d,
+ 0x5d, 0x73, 0x88, 0x5f, 0x92, 0x66, 0x0f, 0xaa,
+ 0xed, 0x5c, 0x1e, 0xf5, 0xca, 0x82, 0xd7, 0xcb,
+ 0x04, 0x98, 0xb1, 0x4d, 0xb1, 0x6e, 0xd0, 0x04,
+ 0x48, 0xf8, 0x84, 0x66, 0xae, 0x01, 0x3e, 0x24,
+ 0x9f, 0xdf, 0x0c, 0x7a, 0x9a, 0x22, 0xd3, 0x46,
+ 0xe0, 0x0b, 0xb2, 0x68, 0x65, 0x64, 0x95, 0x8d,
+ 0x45, 0xa2, 0xb2, 0xd9, 0x49, 0x8b, 0xd7, 0x7d,
+ 0x0f, 0x1a, 0x80, 0xd3, 0x71, 0xd9, 0x05, 0xb3,
+ 0xff, 0x65, 0x2f, 0x7f, 0xe1, 0xb7, 0x68, 0xc6,
+ 0x4f, 0x22, 0x69, 0x2a, 0xcb, 0x5e, 0x45, 0xed,
+ 0x40, 0x30, 0xd5, 0xc7, 0xda, 0xf8, 0xb9, 0x22,
+ 0xa6, 0xe8, 0x00, 0x6c, 0xa2, 0x30, 0x37, 0x36,
+ 0xf8, 0xe6, 0xcb, 0xca, 0x5f, 0xc8, 0x9b, 0xc0,
+ 0x03, 0xba, 0x08, 0x5f, 0x81, 0xa4, 0x1d, 0x55,
+ 0x11, 0x5b, 0x34, 0x3c, 0x6b, 0x55, 0x5a, 0xc6,
+ 0xe2, 0x3b, 0xf3, 0xbc, 0x15, 0xa5, 0x70, 0x9a,
+ 0x1a, 0x4c, 0x9e, 0x53, 0x8b, 0xa3, 0x46, 0x5f,
+ 0xbc, 0x20, 0x15, 0x8a, 0xc7, 0x95, 0xb4, 0xdc,
+ 0x87, 0xbf, 0xce, 0x75, 0x8a, 0xa7, 0x5f, 0xc7,
+ 0x77, 0x8f, 0x4c, 0xd9, 0x72, 0x36, 0xc6, 0xb6,
+ 0xb6, 0x2a, 0x11, 0x59, 0xaf, 0x0f, 0x6c, 0xac,
+ 0x4d, 0xdd, 0x99, 0xd6, 0xa5, 0x85, 0x12, 0x08,
+ 0xeb, 0x38, 0x20, 0x0f, 0xb7, 0xe0, 0x09, 0x72,
+ 0x15, 0xfb, 0x11, 0x1e, 0x35, 0x4e, 0x01, 0xba,
+ 0x96, 0x0a, 0x0e, 0x51, 0x10, 0x8b, 0x68, 0x7c,
+ 0xf8, 0x8e, 0x56, 0x65, 0xe2, 0x25, 0x42, 0x43,
+ 0xeb, 0xf4, 0xca, 0xf2, 0xb7, 0x66, 0x3c, 0x38,
+ 0xb2, 0x99, 0xd1, 0x2f, 0x2d, 0x30, 0xbd, 0xa3,
+ 0x05, 0x41, 0x40, 0x26, 0x5b, 0x83, 0x06, 0x1f,
+ 0x2a, 0xad, 0xd2, 0x86, 0x1c, 0x7f, 0x1a, 0x80,
+ 0x79, 0x88, 0xa1, 0xc6, 0xd2, 0x9f, 0xf3, 0x51,
+ 0x7b, 0xd3, 0xe9, 0x6c, 0xd6, 0xe4, 0xaa, 0x21,
+ 0x4d, 0xe6, 0x42, 0xea, 0x53, 0x6f, 0xfe, 0xcd,
+ 0xf8, 0x67, 0x6d, 0xb3, 0x16, 0x67, 0x55, 0x51,
+ 0x60, 0xa5, 0xe4, 0x1e, 0x5f, 0xd0, 0xfc, 0xcd,
+ 0x82, 0xb1, 0x8f, 0xeb, 0x5f, 0xe3, 0xf3, 0xd5,
+ 0xc7, 0x9e, 0xa2, 0x31, 0x31, 0xee, 0x61, 0x29,
+ 0xe8, 0xe1, 0x8f, 0xe7, 0x9b, 0x94, 0x34, 0xec,
+ 0x18, 0xd4, 0xac, 0x30, 0xd9, 0xd5, 0x83, 0x08,
+ 0xba, 0x1d, 0x27, 0x08, 0xad, 0x89, 0x74, 0xcc,
+ 0xff, 0x5a, 0x8f, 0xc7, 0xca, 0x91, 0x57, 0xb3,
+ 0xf9, 0x8a, 0xc4, 0x33, 0xa2, 0xea, 0xa1, 0x60,
+ 0xc2, 0xfb, 0xea, 0xca, 0xf7, 0x97, 0xff, 0xb3,
+ 0x5a, 0xe3, 0x06, 0x45, 0x37, 0xf8, 0x48, 0xa8,
+ 0x51, 0x93, 0x71, 0xea, 0x5a, 0xfa, 0x7e, 0x32,
+ 0x68, 0x0a, 0x2f, 0x9d, 0x55, 0x94, 0x94, 0xe1,
+ 0x1c, 0x41, 0xce, 0x8d, 0xe6, 0x3b, 0xda, 0x32,
+ 0xb4, 0xf4, 0x90, 0xe6, 0xb0, 0x94, 0x17, 0x2e,
+ 0x5a, 0x36, 0xbb, 0x9b, 0xa1, 0x39, 0x1e, 0x69,
+ 0xf6, 0x2c, 0xca, 0x6e, 0xe1, 0xbb, 0x70, 0xd4,
+ 0x32, 0xdf, 0xd8, 0x88, 0x6b, 0x28, 0x14, 0x31
+//};
+//unsigned int sig_grpx_member0_sha512_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_huge_bsn_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_huge_bsn_msg0.inc
new file mode 100644
index 0000000..6d56d48
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_huge_bsn_msg0.inc
@@ -0,0 +1,99 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: huge (1024 KB) bsn
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha512_huge_bsn_msg0_dat[] = {
+ 0xd8, 0xf7, 0xcd, 0x26, 0xa1, 0x86, 0x2e, 0x25, 0xa5, 0x17, 0x84, 0x98,
+ 0x80, 0x5b, 0xb6, 0x10, 0x1c, 0xd, 0xe1, 0xf4, 0xaa, 0x50, 0xfa, 0xdd,
+ 0x67, 0x2f, 0xfd, 0x96, 0x95, 0x57, 0x1d, 0xf, 0x92, 0xcd, 0xd1, 0x99,
+ 0x27, 0x29, 0xbe, 0x7c, 0x66, 0x27, 0x8e, 0x5b, 0xc7, 0xf, 0x9f, 0xad,
+ 0xd7, 0x29, 0x54, 0xf, 0xea, 0xa8, 0x1, 0x42, 0xf9, 0x47, 0x1d, 0xec,
+ 0x5c, 0xc, 0x2e, 0xdb, 0x56, 0xd3, 0x35, 0x74, 0xca, 0x88, 0x50, 0xc3,
+ 0x3, 0xdf, 0x66, 0x33, 0xe3, 0xb2, 0x70, 0xc2, 0x6b, 0x2b, 0xa3, 0xb7,
+ 0x7d, 0x45, 0x4f, 0xcd, 0xeb, 0x39, 0x47, 0x4b, 0x5c, 0xad, 0x60, 0x2a,
+ 0x9b, 0x1e, 0xeb, 0xd5, 0xfa, 0x4b, 0x0, 0x33, 0xf1, 0xbb, 0xc0, 0xbb,
+ 0xe6, 0xf0, 0x8b, 0xe7, 0xd9, 0xaa, 0x84, 0x44, 0x5c, 0x7f, 0x11, 0xa1,
+ 0x78, 0x5e, 0x45, 0xc1, 0x58, 0x85, 0x9d, 0xb7, 0xba, 0xec, 0xaa, 0x96,
+ 0x22, 0xa9, 0xaa, 0xb3, 0x4f, 0x19, 0x9e, 0xf3, 0xed, 0x82, 0xcc, 0xf2,
+ 0x69, 0x4c, 0x17, 0x39, 0x27, 0xf4, 0x18, 0x98, 0xf, 0xdc, 0xc9, 0x4e,
+ 0x93, 0x9c, 0x5e, 0xad, 0x77, 0xbd, 0xe2, 0x74, 0xb, 0xa9, 0x8a, 0x8a,
+ 0xfc, 0xa6, 0x79, 0xb, 0x72, 0x7b, 0x2a, 0x9b, 0xba, 0x25, 0x51, 0x6,
+ 0x6, 0x14, 0xc4, 0x6d, 0xa6, 0x2f, 0xf5, 0xdd, 0x3d, 0xd6, 0x49, 0x61,
+ 0x62, 0xb, 0x56, 0x28, 0xa8, 0xe9, 0xe2, 0x77, 0x6a, 0x15, 0x44, 0xb0,
+ 0x7a, 0xaa, 0x32, 0x5c, 0xe9, 0xbf, 0xfb, 0xaf, 0xfe, 0xca, 0x47, 0x13,
+ 0xe8, 0xc8, 0xfe, 0xb3, 0xd2, 0x88, 0x45, 0xcd, 0x96, 0x79, 0x2b, 0x6a,
+ 0x26, 0xb2, 0xd7, 0x33, 0x7e, 0x8c, 0x6b, 0xff, 0x9b, 0x49, 0x1c, 0xc2,
+ 0x3e, 0xff, 0x70, 0x63, 0x4a, 0x2c, 0x8a, 0x7, 0x7c, 0xe9, 0x1a, 0x92,
+ 0x7a, 0x53, 0xe1, 0x30, 0xf0, 0x29, 0xe6, 0xe3, 0x58, 0x5a, 0x3f, 0xa1,
+ 0x8b, 0x2c, 0xfe, 0x57, 0xb0, 0x2c, 0x96, 0x5e, 0xd2, 0xbd, 0xff, 0x92,
+ 0xaf, 0xb4, 0xb5, 0x71, 0x5c, 0x27, 0x89, 0x7f, 0x72, 0xc5, 0x2c, 0x41,
+ 0x2b, 0xbd, 0xf7, 0xd, 0xb8, 0xfd, 0xe4, 0x94, 0x27, 0x62, 0x7f, 0x64,
+ 0xb8, 0xf4, 0x47, 0x64, 0x90, 0x8b, 0x96, 0xb7, 0x59, 0xd2, 0xee, 0xee,
+ 0x55, 0x8e, 0x2b, 0x82, 0xde, 0x72, 0x23, 0x5, 0xdc, 0x1e, 0xa, 0xd4,
+ 0xc4, 0xe6, 0x7d, 0x9b, 0x96, 0xfc, 0xb4, 0x17, 0x38, 0xea, 0x7b, 0x9d,
+ 0xf7, 0xd8, 0x95, 0xfa, 0xfb, 0x99, 0x26, 0xa, 0x13, 0x96, 0xf3, 0x7b,
+ 0x20, 0xc4, 0x39, 0xb7, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3,
+ 0x43, 0x4, 0xf0, 0xea, 0xe0, 0xca, 0x2, 0x65, 0x22, 0xd4, 0x68, 0x5c,
+ 0x12, 0xfa, 0xe0, 0x39, 0x23, 0x5a, 0xde, 0x7e, 0xb2, 0xed, 0x2, 0x4f,
+ 0xcc, 0x10, 0xe4, 0xf7, 0x5f, 0x7d, 0x69, 0xbc, 0x6d, 0xf9, 0xe9, 0xb,
+ 0x88, 0x1b, 0x60, 0xad, 0xee, 0xab, 0x56, 0xc1, 0x36, 0x44, 0x58, 0x92,
+ 0x28, 0x64, 0x87, 0xdc, 0x2a, 0xfb, 0x1e, 0x59, 0x24, 0xbb, 0x7, 0xf5,
+ 0x1c, 0x3a, 0xee, 0xe7, 0x73, 0xc2, 0x83, 0xb8, 0xd6, 0x93, 0x41, 0x78,
+ 0xb, 0xc2, 0xe6, 0xee, 0x8a, 0xa0, 0xc1, 0x4b, 0xc8, 0x4a, 0x89, 0x3f,
+ 0xc9, 0x56, 0x6d, 0x7f, 0xf3, 0x51, 0x2e, 0x9, 0x68, 0x35, 0xca, 0x45,
+ 0x89, 0x39, 0x2d, 0xc9, 0xa1, 0x30, 0xfb, 0xf0, 0xae, 0x90, 0x39, 0x9f,
+ 0x68, 0x7, 0xab, 0xea, 0x8c, 0xf1, 0x83, 0x4c, 0x5d, 0x46, 0xb9, 0xe2,
+ 0xc0, 0xbf, 0x1f, 0x91, 0xa5, 0xed, 0x7, 0xb8, 0x35, 0x15, 0x55, 0x19,
+ 0x32, 0xd5, 0x42, 0x3d, 0xea, 0x1e, 0x60, 0x37, 0x44, 0x75, 0xe0, 0x57,
+ 0x93, 0x58, 0x3b, 0x4f, 0xcc, 0x17, 0x97, 0x5, 0xba, 0x67, 0x3e, 0x6a,
+ 0xfc, 0x69, 0x1, 0x93, 0x78, 0xd9, 0xf1, 0x6b, 0x41, 0x4f, 0xeb, 0xe4,
+ 0x25, 0x0, 0x45, 0xd4, 0xab, 0xce, 0xd2, 0x1, 0xa0, 0x18, 0xd1, 0x37,
+ 0x6c, 0xb1, 0xb4, 0x44, 0xef, 0x62, 0x18, 0x76, 0x2a, 0xd8, 0x56, 0x26,
+ 0xee, 0x6c, 0x68, 0xd9, 0xf8, 0x91, 0xd9, 0x5a, 0x10, 0x52, 0x75, 0xb0,
+ 0x3e, 0xe8, 0x98, 0xa9, 0x37, 0x3d, 0x18, 0x50, 0xfd, 0x7c, 0x18, 0x43,
+ 0xbd, 0x25, 0x4e, 0x8, 0x2, 0xc0, 0x9e, 0xa5, 0xc0, 0xdc, 0x6b, 0xb,
+ 0x39, 0x7a, 0xc0, 0x6d, 0x8e, 0x59, 0x70, 0x31, 0x77, 0x88, 0xdc, 0xf1,
+ 0x27, 0xf4, 0x5d, 0x28, 0xed, 0x3c, 0x61, 0x24, 0x77, 0x5f, 0x3f, 0xf4,
+ 0x64, 0x73, 0x1a, 0x40, 0xb3, 0xab, 0xfa, 0x76, 0x7b, 0xc0, 0x1f, 0x53,
+ 0xd1, 0xa9, 0x28, 0xff, 0x2c, 0x24, 0xe5, 0xf3, 0x3c, 0xcc, 0x44, 0xe5,
+ 0x48, 0x47, 0x73, 0xd8, 0x86, 0xa8, 0x2e, 0xd7, 0xff, 0xc0, 0x5a, 0x86,
+ 0xde, 0xa4, 0x31, 0xe4, 0xfd, 0xe4, 0x7d, 0x62, 0x75, 0xf, 0x47, 0x62,
+ 0xfc, 0x56, 0xa5, 0x3f, 0x34, 0xd6, 0xf6, 0x74, 0x18, 0x93, 0xa8, 0xfd,
+ 0x8d, 0xfe, 0x7a, 0xc7, 0x85, 0xe, 0xbe, 0xf1, 0x13, 0xab, 0x6, 0x8b,
+ 0xb7, 0x7, 0xa0, 0x7c, 0x17, 0x1a, 0x62, 0xa3, 0xdf, 0x86, 0xcd, 0xd0,
+ 0x3a, 0xc1, 0x4f, 0x80, 0xd, 0x64, 0x8e, 0xf8, 0xe6, 0xf9, 0xed, 0x35,
+ 0x26, 0xe5, 0x4, 0x3e, 0x61, 0xd9, 0x32, 0x5a, 0x5c, 0x56, 0x51, 0xb2,
+ 0xdf, 0xab, 0x5c, 0x7e, 0xce, 0xd6, 0xb7, 0x6d, 0x10, 0xc5, 0xb4, 0xf6,
+ 0x66, 0xe0, 0xb7, 0x1b, 0x36, 0x78, 0x5, 0xde, 0xa7, 0xdd, 0x93, 0xdd,
+ 0x78, 0xe, 0xdb, 0x7f, 0x9, 0x2f, 0x4, 0x66, 0x4d, 0xe2, 0x4c, 0xe0,
+ 0x87, 0x66, 0x38, 0xf1, 0x7c, 0xa5, 0xce, 0xce, 0x98, 0x4d, 0x1e, 0x77,
+ 0xae, 0x55, 0x94, 0xa5, 0xd5, 0x32, 0xc7, 0x11, 0x2d, 0x63, 0x1a, 0x38,
+ 0x5f, 0xae, 0x6a, 0xd1, 0x22, 0xbd, 0xc5, 0xc4, 0x7f, 0xab, 0x98, 0xb2,
+ 0x9b, 0xb5, 0x72, 0x2f, 0xb4, 0x96, 0x2e, 0xdf, 0x4c, 0x83, 0x87, 0x44,
+ 0xc8, 0x5f, 0x41, 0x1, 0xf4, 0x55, 0xfc, 0x28, 0xa3, 0xab, 0xb0, 0xfb,
+ 0x2e, 0xc7, 0x98, 0xd, 0xa9, 0x6d, 0x74, 0x10, 0x2a, 0x9f, 0xd1, 0xb6,
+ 0x7d, 0x50, 0x81, 0x24, 0x9c, 0xba, 0x32, 0x6, 0x57, 0xeb, 0xa9, 0xca
+//};
diff --git a/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc
new file mode 100644
index 0000000..e6a7db1
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member0
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: None (random base)
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha512_rndbase_msg0_dat[] = {
+ 0x43, 0xa4, 0x74, 0x4b, 0xcb, 0x17, 0xfa, 0xaf,
+ 0xb8, 0x6e, 0xb4, 0xca, 0x94, 0x4d, 0xe8, 0x5b,
+ 0x40, 0x88, 0x6c, 0x9c, 0xfa, 0xba, 0x4a, 0x4c,
+ 0x65, 0x94, 0xd1, 0x17, 0x90, 0x5b, 0x66, 0x12,
+ 0x46, 0xcf, 0xcc, 0x6e, 0x47, 0x2c, 0x0c, 0xa7,
+ 0x4e, 0xb4, 0x62, 0x57, 0xdc, 0x70, 0xbb, 0xd0,
+ 0x52, 0xa7, 0x38, 0x97, 0xec, 0x34, 0x8c, 0xfd,
+ 0xe6, 0x5f, 0xa1, 0x8b, 0x8a, 0x1e, 0x0c, 0x41,
+ 0xa9, 0x86, 0x53, 0x85, 0x0e, 0xaa, 0xc2, 0x1d,
+ 0xe9, 0x42, 0x18, 0x2e, 0x1f, 0xca, 0xa0, 0x41,
+ 0x46, 0x04, 0x10, 0xb9, 0xc7, 0x15, 0x88, 0x41,
+ 0x92, 0x53, 0x7b, 0xb0, 0xc2, 0xf1, 0x96, 0x8f,
+ 0xc8, 0xe7, 0x4a, 0x43, 0x0a, 0xa2, 0x92, 0x08,
+ 0xd3, 0xdb, 0x09, 0xae, 0x31, 0x6c, 0xef, 0x9f,
+ 0xb7, 0x58, 0x4b, 0x41, 0x69, 0xf7, 0x5b, 0xbc,
+ 0x62, 0x3b, 0xa9, 0x9f, 0x4b, 0xcb, 0x17, 0x6f,
+ 0x26, 0xce, 0x54, 0x7e, 0xaa, 0x3c, 0x1a, 0xfd,
+ 0xab, 0x3a, 0x67, 0x11, 0x89, 0x16, 0xac, 0xfa,
+ 0xbf, 0xfb, 0x17, 0x6e, 0x39, 0xd1, 0x5a, 0x88,
+ 0x02, 0xf3, 0x14, 0xaa, 0x5c, 0xef, 0xa1, 0x69,
+ 0xb1, 0x76, 0x82, 0x72, 0x9c, 0xaa, 0x20, 0xb2,
+ 0xa6, 0x21, 0xac, 0x60, 0x77, 0x0b, 0xbb, 0x24,
+ 0x6f, 0x14, 0x9e, 0xea, 0x87, 0xb0, 0x91, 0x70,
+ 0xf9, 0x05, 0x18, 0x62, 0x32, 0x03, 0xb9, 0x95,
+ 0xad, 0xce, 0x40, 0x1f, 0x00, 0x33, 0x64, 0xf7,
+ 0x2a, 0xd9, 0xea, 0xeb, 0x4f, 0x5b, 0x6a, 0xbb,
+ 0x23, 0x56, 0x74, 0x31, 0xa7, 0x44, 0xae, 0xdd,
+ 0x60, 0x01, 0xa9, 0xb4, 0x82, 0xed, 0x55, 0xcd,
+ 0x81, 0x39, 0x40, 0xf1, 0xf3, 0x25, 0x7e, 0x27,
+ 0xfa, 0x5e, 0x44, 0xc6, 0x40, 0xfd, 0xde, 0x0b,
+ 0xab, 0xae, 0x53, 0xf5, 0x05, 0x78, 0xd3, 0xeb,
+ 0x1f, 0x4f, 0xb2, 0x56, 0x48, 0xe9, 0x08, 0xb1,
+ 0xa4, 0xc6, 0xbc, 0x20, 0x8c, 0xf4, 0x5e, 0x65,
+ 0xd7, 0x52, 0x59, 0x66, 0xe3, 0xf6, 0xbc, 0xc2,
+ 0x23, 0x29, 0x4a, 0x98, 0x53, 0x1c, 0xf5, 0x37,
+ 0x2a, 0x8b, 0x3b, 0x42, 0xf2, 0x10, 0xb4, 0x33,
+ 0x8b, 0xd6, 0x54, 0x83, 0xc3, 0x8d, 0x2c, 0x77,
+ 0x46, 0xae, 0x09, 0xc0, 0x47, 0xb7, 0x33, 0x59,
+ 0xe0, 0xc7, 0x0f, 0xbb, 0xea, 0x42, 0xdf, 0xb6,
+ 0xa9, 0x19, 0xd4, 0x9a, 0xfd, 0x5f, 0x82, 0x18,
+ 0x3e, 0x97, 0x89, 0x79, 0xca, 0x92, 0xed, 0x33,
+ 0xa3, 0xc3, 0x8e, 0x34, 0xf0, 0x03, 0xb5, 0x83,
+ 0x28, 0x6f, 0x5f, 0x0c, 0x35, 0xee, 0x0f, 0x16,
+ 0x3e, 0xdd, 0xb3, 0xd4, 0x5d, 0x0b, 0xa5, 0x26,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xce, 0x9d, 0x84, 0x2d, 0xf0, 0x21, 0xe7, 0x25,
+ 0x11, 0xb5, 0xee, 0xb0, 0x4a, 0x4e, 0x8c, 0x3f,
+ 0x83, 0xd0, 0x91, 0xf2, 0x15, 0x88, 0xe3, 0x8c,
+ 0x9a, 0x24, 0xca, 0xea, 0x34, 0x4f, 0xa8, 0xee,
+ 0x3c, 0xf6, 0x8c, 0x62, 0xff, 0xa2, 0x93, 0x49,
+ 0x4d, 0xb9, 0x39, 0x25, 0xcb, 0x1b, 0x7e, 0x9b,
+ 0xef, 0xb6, 0xde, 0x4e, 0xc0, 0x80, 0x27, 0xac,
+ 0xdd, 0xf8, 0x34, 0xa2, 0xb4, 0x4b, 0x29, 0x04,
+ 0xd6, 0xc4, 0x98, 0x3a, 0x9c, 0x23, 0xec, 0xf5,
+ 0x90, 0x44, 0xfb, 0x04, 0x15, 0x77, 0xdd, 0x1c,
+ 0x3e, 0x6e, 0xc2, 0x97, 0x0c, 0x77, 0x83, 0x95,
+ 0xe4, 0x49, 0xdf, 0x28, 0x38, 0x80, 0x97, 0x70,
+ 0xa0, 0xf2, 0xa2, 0xb0, 0x23, 0x64, 0xce, 0x4b,
+ 0x7e, 0x1e, 0xd5, 0x07, 0x80, 0x3a, 0xe0, 0xb5,
+ 0xa6, 0xf2, 0x82, 0xa3, 0x3a, 0xd0, 0x5f, 0xe9,
+ 0x2b, 0x61, 0xb2, 0x15, 0x8e, 0x19, 0x81, 0x84,
+ 0x64, 0x4f, 0x9e, 0x3d, 0xc4, 0x94, 0xad, 0x9f,
+ 0x7c, 0x81, 0x16, 0x70, 0xb0, 0x93, 0xea, 0x7d,
+ 0x34, 0x55, 0xe7, 0xd0, 0xae, 0x24, 0xa7, 0x54,
+ 0xa5, 0x19, 0x0c, 0x71, 0x50, 0xea, 0x93, 0x07,
+ 0xbd, 0x67, 0xdf, 0xa3, 0x9a, 0xbe, 0xf8, 0x89,
+ 0xca, 0xe2, 0xab, 0xb3, 0xb1, 0xd2, 0xf2, 0x05,
+ 0xab, 0xa2, 0x1e, 0xa7, 0xda, 0xf4, 0x27, 0x83,
+ 0x8f, 0xee, 0xe1, 0x31, 0x82, 0x1b, 0x5d, 0x29,
+ 0xb1, 0x23, 0x11, 0x64, 0x86, 0x70, 0x99, 0x06,
+ 0x6d, 0xaf, 0xc2, 0xeb, 0xd2, 0x1a, 0xb7, 0x2f,
+ 0x92, 0x0b, 0x33, 0xfe, 0x5d, 0x9b, 0xc6, 0xdd,
+ 0x39, 0x84, 0xbe, 0xbf, 0x05, 0xff, 0x92, 0x9a,
+ 0x52, 0x08, 0x24, 0xb6, 0xc3, 0xa8, 0x84, 0x39,
+ 0xda, 0xf8, 0x26, 0xcb, 0x56, 0x12, 0xb5, 0xd3,
+ 0x03, 0x54, 0x3d, 0xf3, 0xf9, 0x36, 0xf4, 0xff,
+ 0xc4, 0xf6, 0x1f, 0x15, 0xed, 0x70, 0x18, 0x0a,
+ 0x38, 0x08, 0x6f, 0xf6, 0x3a, 0x61, 0x2d, 0x43,
+ 0x4a, 0x04, 0x48, 0x3f, 0xe9, 0xe8, 0x8c, 0xc7,
+ 0xd9, 0x18, 0x86, 0xfb, 0x7c, 0xc3, 0xa6, 0x87,
+ 0x66, 0xdc, 0x94, 0x65, 0x19, 0x0f, 0xe3, 0x69,
+ 0x09, 0x34, 0x4c, 0x47, 0x0a, 0xc1, 0x5f, 0x41,
+ 0xb6, 0x18, 0x3d, 0x5a, 0xfb, 0xf2, 0x52, 0x9a,
+ 0xc1, 0xbe, 0x1e, 0x86, 0x25, 0xe8, 0xd4, 0xa7,
+ 0xa9, 0x79, 0x03, 0x7b, 0xea, 0x44, 0x5e, 0x84,
+ 0x2d, 0x21, 0x27, 0x52, 0x65, 0xf4, 0x36, 0x78,
+ 0x89, 0x0a, 0xcb, 0x3e, 0x00, 0x08, 0xb9, 0x43,
+ 0xc9, 0x50, 0xf2, 0xfe, 0x1a, 0x15, 0x8b, 0xdf,
+ 0xac, 0xa8, 0x23, 0x73, 0xc8, 0xab, 0x8d, 0xa2,
+ 0x62, 0x62, 0x7b, 0xdd, 0x5c, 0x05, 0x36, 0x3a,
+ 0x08, 0xe5, 0xca, 0x9f, 0x1b, 0x38, 0x11, 0x43,
+ 0xb9, 0xc5, 0x5d, 0x84, 0x7f, 0xfc, 0x8c, 0x88,
+ 0x28, 0x84, 0x0a, 0xda, 0x90, 0xe0, 0x98, 0x29,
+ 0x9a, 0xae, 0x3a, 0x2d, 0xae, 0xc2, 0x45, 0xa3,
+ 0x92, 0xbd, 0xb6, 0x2b, 0x2c, 0xae, 0xb2, 0x7a,
+ 0x91, 0x73, 0x27, 0x09, 0xcf, 0xf3, 0x71, 0xdf,
+ 0xf9, 0xbd, 0x6d, 0xee, 0xd6, 0x1c, 0xd8, 0x8b,
+ 0xf5, 0xc1, 0x84, 0x93, 0xc1, 0x8d, 0x60, 0xec,
+ 0x6d, 0x98, 0x19, 0xf5, 0x39, 0xbd, 0x51, 0x31,
+ 0xd6, 0xc8, 0x3c, 0x28, 0xf9, 0xf5, 0x36, 0xfe,
+ 0x43, 0xd9, 0xf5, 0x3b, 0x13, 0x41, 0xda, 0x48,
+ 0xbc, 0x1f, 0x64, 0xb3, 0x70, 0x68, 0xa0, 0xda,
+ 0xea, 0xad, 0x70, 0xed, 0x5c, 0x80, 0x40, 0x3c,
+ 0xc0, 0x77, 0x18, 0x97, 0x0a, 0x60, 0x11, 0x05,
+ 0xcc, 0x2a, 0x91, 0x40, 0xa5, 0x5e, 0x0b, 0x14
+//};
+//unsigned int sig_grpx_member0_sha512_rndbase_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/member1/mprivkey.inc b/epid/common-testhelper/testdata/grp_x/member1/mprivkey.inc
new file mode 100644
index 0000000..62a5e29
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member1/mprivkey.inc
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : member1
+ */
+//unsigned char mprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x14, 0x26, 0x0f, 0x4c, 0x15, 0xb6, 0xea, 0x44,
+ 0x5f, 0x3c, 0x01, 0xc2, 0xad, 0xe7, 0x00, 0x63,
+ 0x41, 0xa8, 0xff, 0xa3, 0x7a, 0x10, 0x00, 0x80,
+ 0xdf, 0xb0, 0x9c, 0x1e, 0x77, 0x19, 0x72, 0x6e,
+ 0x47, 0x4e, 0x27, 0x8c, 0xfb, 0x1d, 0x86, 0xf7,
+ 0x03, 0x85, 0x27, 0x93, 0xac, 0x0a, 0xbe, 0x94,
+ 0x24, 0x79, 0x23, 0x21, 0x0a, 0x80, 0xac, 0x00,
+ 0xdd, 0x78, 0xd8, 0x68, 0xb4, 0xf4, 0x81, 0x6c,
+ 0x0c, 0x89, 0x68, 0x9d, 0x6b, 0x0a, 0x77, 0x6c,
+ 0x7a, 0xdb, 0x96, 0xea, 0xaa, 0x8a, 0x47, 0xd2,
+ 0x59, 0xc6, 0x98, 0xde, 0x47, 0xb2, 0xc7, 0xab,
+ 0xf0, 0xb4, 0xac, 0x1c, 0x58, 0xe7, 0x20, 0x1f,
+ 0x5b, 0xcc, 0xd0, 0xef, 0x05, 0x3c, 0x02, 0x94,
+ 0xee, 0xaf, 0x1e, 0x12, 0x90, 0xd9, 0xc6, 0x05,
+ 0x36, 0x75, 0xc7, 0x46, 0x3c, 0x6c, 0x19, 0xaf,
+ 0xbe, 0xe7, 0x43, 0x88, 0x6c, 0x08, 0xa2, 0xb5
+//};
+//unsigned int mprivkey_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc b/epid/common-testhelper/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..0b729f5
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc
@@ -0,0 +1,136 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : member1
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+
+//unsigned char sig_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0xfa, 0xd0, 0x0a, 0x0a, 0x32, 0xc3, 0xf4, 0x37,
+ 0x41, 0x79, 0x5d, 0xfe, 0xe4, 0x86, 0x46, 0x9b,
+ 0x92, 0x68, 0xae, 0xd4, 0xd0, 0xc9, 0x6f, 0xfa,
+ 0x2c, 0xe4, 0xf8, 0x19, 0x62, 0x8f, 0x63, 0x59,
+ 0x34, 0xf2, 0x9c, 0xae, 0x5e, 0x09, 0x42, 0x91,
+ 0x16, 0x5b, 0x78, 0x3f, 0x77, 0xa4, 0xb7, 0xef,
+ 0x33, 0xf7, 0x50, 0x0b, 0x7d, 0x6b, 0xa9, 0x0e,
+ 0xce, 0x78, 0x21, 0xd7, 0xdd, 0x63, 0x21, 0x20,
+ 0xda, 0xdc, 0xa0, 0x5f, 0xa0, 0x1e, 0xf3, 0x08,
+ 0x18, 0xd4, 0x0d, 0x33, 0x90, 0x36, 0x2b, 0xc6,
+ 0x30, 0xa8, 0x4a, 0xce, 0x8b, 0xf4, 0xfa, 0x09,
+ 0x8e, 0x37, 0x01, 0x19, 0x56, 0xd7, 0x73, 0xec,
+ 0x78, 0xd4, 0x2d, 0x3f, 0x64, 0x51, 0xe8, 0xf8,
+ 0x98, 0x70, 0x9e, 0x13, 0xd0, 0xca, 0xcf, 0x91,
+ 0x86, 0x54, 0x47, 0xea, 0xe7, 0x37, 0x3e, 0x8a,
+ 0x98, 0x0f, 0x16, 0x4b, 0xfb, 0xe0, 0x39, 0xa7,
+ 0x94, 0x12, 0x20, 0x27, 0x95, 0x40, 0xc0, 0x80,
+ 0x1c, 0x22, 0x36, 0x27, 0xd4, 0x67, 0x3e, 0xc2,
+ 0x8a, 0x68, 0xfb, 0x60, 0x15, 0x16, 0x52, 0xf1,
+ 0x6c, 0xdd, 0x8f, 0xf6, 0xbb, 0x28, 0x13, 0x0e,
+ 0xb4, 0x00, 0x22, 0x81, 0xf0, 0x4a, 0xeb, 0x1a,
+ 0x74, 0x07, 0x1e, 0x5f, 0xd6, 0xa1, 0x03, 0x35,
+ 0xa4, 0x48, 0x4a, 0x0f, 0x0a, 0xa4, 0x30, 0x4a,
+ 0x02, 0x52, 0xa7, 0xac, 0xdf, 0xf0, 0xf4, 0x3c,
+ 0xe1, 0xc6, 0xbd, 0xe1, 0x12, 0x70, 0x09, 0x0a,
+ 0x79, 0x83, 0x35, 0x85, 0x64, 0x93, 0xca, 0xb5,
+ 0xd7, 0x3d, 0x9b, 0xe7, 0xf0, 0x8f, 0xcf, 0x53,
+ 0xb5, 0xb0, 0x37, 0x95, 0x08, 0x72, 0x39, 0x89,
+ 0x3a, 0x3a, 0xf2, 0x9e, 0x5e, 0x04, 0xdd, 0x1d,
+ 0x0e, 0x55, 0x60, 0xef, 0x01, 0xe2, 0x51, 0x58,
+ 0xef, 0x3b, 0xe4, 0xab, 0x7f, 0x5d, 0x50, 0x5a,
+ 0x2d, 0xfd, 0x5f, 0x86, 0xd6, 0x0f, 0xbf, 0x77,
+ 0x7f, 0x64, 0xba, 0x95, 0xe8, 0x81, 0x4d, 0x8b,
+ 0xb9, 0xf4, 0x4d, 0x02, 0x29, 0x22, 0x37, 0x45,
+ 0xb4, 0x83, 0x31, 0x84, 0x39, 0x49, 0x97, 0xac,
+ 0x70, 0xe9, 0x15, 0xf3, 0xe5, 0x38, 0x01, 0x53,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xcb, 0xd2, 0x73, 0x50, 0x7b, 0x1d, 0xb4, 0x93,
+ 0xde, 0xe8, 0x23, 0x9c, 0xee, 0x77, 0x21, 0x0f,
+ 0x76, 0xf6, 0xec, 0x66, 0x0d, 0x26, 0xd9, 0x8a,
+ 0x08, 0x29, 0x7c, 0x40, 0x16, 0xf8, 0x9d, 0xdf,
+ 0x84, 0x0c, 0xf7, 0x7c, 0x74, 0x01, 0xd8, 0xe7,
+ 0xed, 0x83, 0x82, 0x2f, 0x0d, 0xfc, 0x77, 0x63,
+ 0xb6, 0x72, 0xba, 0xc1, 0x8e, 0x13, 0xd4, 0xcd,
+ 0x1f, 0x50, 0x95, 0x8f, 0x56, 0x89, 0x64, 0x1a,
+ 0x38, 0xbe, 0x82, 0x38, 0x24, 0x2b, 0xcc, 0x1b,
+ 0x76, 0xac, 0x31, 0xf7, 0x91, 0x49, 0x33, 0x48,
+ 0x05, 0x71, 0x73, 0x3c, 0xed, 0x26, 0x22, 0x26,
+ 0x2b, 0xca, 0x11, 0x5b, 0xb5, 0xc4, 0x13, 0x33,
+ 0x70, 0x43, 0xa6, 0x6f, 0x0f, 0x97, 0x92, 0xe7,
+ 0x71, 0xa4, 0x96, 0x79, 0x9f, 0xa3, 0x21, 0x10,
+ 0xb8, 0xc2, 0x9c, 0x30, 0x73, 0x72, 0x16, 0x85,
+ 0x2f, 0xac, 0x76, 0xfd, 0x90, 0x88, 0x03, 0x58,
+ 0x5b, 0xb5, 0x40, 0x40, 0xf9, 0x76, 0x39, 0x50,
+ 0x15, 0x8a, 0x39, 0xb5, 0x93, 0x68, 0xe1, 0x1d,
+ 0xcb, 0xce, 0x54, 0xe1, 0x50, 0xd9, 0xed, 0x75,
+ 0x6e, 0x28, 0x67, 0x9d, 0xb6, 0x80, 0x91, 0x7e,
+ 0x8e, 0xd9, 0x01, 0xd0, 0x45, 0xd7, 0xa9, 0x32,
+ 0xd1, 0xd6, 0x62, 0x48, 0x5e, 0xa9, 0xb9, 0x08,
+ 0x3a, 0x01, 0xa7, 0x7b, 0xa1, 0x1e, 0x58, 0x13,
+ 0xb3, 0x63, 0x4b, 0x1c, 0x14, 0x17, 0x3e, 0xe6,
+ 0x02, 0xe1, 0x76, 0x80, 0xda, 0xd5, 0x5b, 0xed,
+ 0x9d, 0xae, 0x05, 0x7e, 0x69, 0xb1, 0xbd, 0xc6,
+ 0x2c, 0x46, 0x28, 0x9d, 0x74, 0xd6, 0x19, 0xd8,
+ 0xb4, 0x50, 0x08, 0xb5, 0xb9, 0x51, 0x9a, 0xef,
+ 0xf7, 0x1d, 0x74, 0xf0, 0xf8, 0x65, 0x6f, 0x9e,
+ 0x8a, 0xb6, 0x77, 0x12, 0x95, 0x92, 0x91, 0xec,
+ 0x6b, 0x64, 0xfa, 0xd3, 0xc1, 0x08, 0x52, 0x0f,
+ 0xc9, 0x97, 0xcd, 0xd6, 0xda, 0x1b, 0x04, 0x01,
+ 0x2c, 0x51, 0xbd, 0x09, 0x39, 0x26, 0x8c, 0x70,
+ 0x46, 0x68, 0x4d, 0xf6, 0x07, 0xb8, 0x26, 0xb4,
+ 0xb2, 0xf9, 0x7a, 0x3b, 0x9b, 0x23, 0xbf, 0xed,
+ 0xfe, 0xca, 0x42, 0x73, 0x50, 0xe2, 0xf8, 0x9b,
+ 0x95, 0xf6, 0x22, 0x82, 0xa6, 0xfd, 0xfe, 0x75,
+ 0x9c, 0x9d, 0x0e, 0x13, 0xdd, 0xb5, 0xfc, 0x2a,
+ 0xc7, 0x59, 0x8f, 0xa8, 0xf5, 0x8c, 0xe1, 0x8b,
+ 0xd3, 0x95, 0xc2, 0x24, 0x9e, 0x62, 0x54, 0x34,
+ 0x17, 0x78, 0x84, 0xd8, 0x26, 0x82, 0x82, 0x41,
+ 0xbd, 0x66, 0xd2, 0xa1, 0x0a, 0x6a, 0xef, 0x98,
+ 0x0f, 0x3b, 0x79, 0xed, 0x1e, 0xb1, 0xb0, 0xce,
+ 0x33, 0x7a, 0x33, 0xfe, 0x73, 0x5e, 0x3f, 0x22,
+ 0xea, 0xb2, 0x08, 0xc3, 0x65, 0xa6, 0x5d, 0x00,
+ 0x07, 0xd4, 0xa9, 0x17, 0x86, 0xa7, 0x50, 0xa9,
+ 0x4f, 0xdf, 0xe0, 0x80, 0x3a, 0xcd, 0x16, 0x09,
+ 0x42, 0xa5, 0xc0, 0x50, 0xff, 0xba, 0xf2, 0xd3,
+ 0x6e, 0x6a, 0x20, 0x66, 0x15, 0x52, 0x51, 0x7b,
+ 0xb8, 0x0b, 0x71, 0x69, 0x5c, 0x4c, 0xd0, 0x74,
+ 0x60, 0x44, 0x65, 0x58, 0x19, 0x62, 0x1d, 0x0f,
+ 0x4b, 0xea, 0x7a, 0xb6, 0x3c, 0x54, 0x81, 0xd2,
+ 0xec, 0x53, 0xcf, 0x16, 0x4a, 0x1d, 0xfa, 0x01,
+ 0x94, 0xc7, 0x9e, 0x53, 0xbb, 0xa6, 0xe0, 0xb5,
+ 0x33, 0x6f, 0x9d, 0x6e, 0x81, 0x79, 0x18, 0x30,
+ 0xf9, 0x7b, 0xbb, 0x97, 0xf5, 0x9f, 0xa6, 0x1c,
+ 0xaa, 0x59, 0xd2, 0xe0, 0xf8, 0xc8, 0xc8, 0x56,
+ 0xbb, 0x91, 0x97, 0x29, 0xaf, 0xad, 0xc1, 0x5f,
+ 0x0d, 0x8e, 0x5a, 0x12, 0x8a, 0xc1, 0x64, 0x3c,
+ 0x2a, 0x82, 0x7b, 0xef, 0xfb, 0x67, 0xdc, 0x58
+//};
+//unsigned int sig_sha256_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey000.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey000.inc
new file mode 100644
index 0000000..895fc7d
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey000.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : privrevokedmember000 (revoked in grpX privrl)
+ */
+
+//unsigned char mprivatekey000_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x1b, 0x31, 0xd8, 0x78, 0x27, 0xc5, 0x4a, 0x53,
+ 0x64, 0xe2, 0xcb, 0x12, 0x10, 0xcb, 0xfb, 0xb5,
+ 0x12, 0x03, 0x81, 0x3c, 0xee, 0x99, 0xbe, 0xb3,
+ 0x8b, 0xfe, 0xe9, 0xb9, 0x3f, 0x79, 0xcf, 0xe4,
+ 0xa3, 0x0f, 0x5c, 0xba, 0x7f, 0x4a, 0x9e, 0x34,
+ 0xda, 0x75, 0x97, 0x3d, 0x85, 0x44, 0x0b, 0x75,
+ 0x00, 0x80, 0x65, 0x53, 0x51, 0x07, 0x40, 0xcc,
+ 0xe7, 0x0f, 0x52, 0x49, 0xf4, 0xb6, 0x90, 0xe0,
+ 0x8f, 0xf3, 0x60, 0xe2, 0xe8, 0x01, 0x1d, 0xbb,
+ 0x02, 0xa3, 0x49, 0x99, 0xc5, 0x89, 0xfa, 0x40,
+ 0xbc, 0x65, 0xe7, 0x64, 0x1e, 0x1a, 0x0e, 0xe1,
+ 0xa0, 0x8e, 0xe0, 0x4a, 0x69, 0xeb, 0x65, 0x23,
+ 0xb1, 0x58, 0x6e, 0x93, 0x42, 0x67, 0x51, 0xfb,
+ 0x1b, 0x42, 0x4f, 0x0b, 0xe5, 0x11, 0x44, 0x6b,
+ 0xdd, 0x8b, 0xe8, 0xe9, 0x44, 0x09, 0x70, 0x6a,
+ 0xab, 0xaf, 0x54, 0xd8, 0x4a, 0xd3, 0x3d, 0x7c
+//};
+//unsigned int mprivatekey000_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey001.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey001.inc
new file mode 100644
index 0000000..e9d5161
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey001.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : privrevokedmember001 (revoked in grpX privrl)
+ */
+
+//unsigned char mprivatekey001_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xae, 0x8f, 0x73, 0x56, 0xd4, 0xd4, 0x95, 0x28,
+ 0x0a, 0x9b, 0xb4, 0x57, 0x65, 0x8b, 0x68, 0x82,
+ 0x58, 0x42, 0x3f, 0x75, 0x0f, 0x60, 0x15, 0xc2,
+ 0x83, 0x26, 0x3b, 0xa6, 0x74, 0xab, 0x5f, 0x7a,
+ 0xc7, 0x99, 0x84, 0x0d, 0xe4, 0xed, 0xa7, 0x11,
+ 0xd9, 0x8a, 0xd0, 0x08, 0xb0, 0x1c, 0x29, 0x75,
+ 0x71, 0x99, 0xf5, 0x11, 0x7d, 0xf3, 0xa5, 0x55,
+ 0xae, 0xaf, 0x71, 0x1b, 0x25, 0x93, 0xbd, 0x30,
+ 0x50, 0x08, 0x2f, 0xb9, 0x46, 0x89, 0xbf, 0x9d,
+ 0xf5, 0xae, 0x5f, 0x4d, 0x28, 0x5c, 0x5c, 0x19,
+ 0x58, 0xfb, 0xec, 0xac, 0xac, 0xe1, 0x16, 0x27,
+ 0xd3, 0x19, 0x07, 0x76, 0x2c, 0x20, 0x29, 0xec,
+ 0xfb, 0x9c, 0x7f, 0x54, 0x34, 0xba, 0xc2, 0xdb,
+ 0x2b, 0xec, 0xca, 0x08, 0xf8, 0x19, 0x3f, 0x79,
+ 0xee, 0x02, 0x01, 0x1f, 0x7c, 0x6a, 0x3a, 0xdb,
+ 0x6b, 0x42, 0x31, 0xc7, 0x09, 0x4e, 0xb0, 0x1b
+//};
+//unsigned int mprivatekey001_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey002.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey002.inc
new file mode 100644
index 0000000..8e9af9d
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/mprivatekey002.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : privrevokedmember002 (revoked in grpX privrl)
+ */
+
+//unsigned char mprivatekey002_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xbb, 0x31, 0x32, 0x47, 0xde, 0xe1, 0xd5, 0x97,
+ 0xe9, 0xdf, 0x2a, 0xa1, 0x3b, 0xb4, 0x0d, 0x84,
+ 0xf0, 0x01, 0x61, 0x74, 0x9e, 0xde, 0x47, 0x9c,
+ 0xfa, 0xcc, 0x73, 0x63, 0x6e, 0x63, 0x8d, 0x5c,
+ 0xf8, 0x1c, 0xe8, 0x32, 0x5f, 0x1c, 0xed, 0xde,
+ 0x82, 0xc4, 0x29, 0x28, 0x8d, 0xf2, 0x5e, 0x4f,
+ 0xd6, 0x16, 0x9e, 0x87, 0xa2, 0x65, 0x61, 0x31,
+ 0x25, 0x8a, 0x81, 0xb5, 0x60, 0xf2, 0x08, 0xc9,
+ 0x83, 0x8d, 0xbe, 0x69, 0xb1, 0x8d, 0x0f, 0x4a,
+ 0x55, 0x1d, 0xdb, 0x72, 0x84, 0x33, 0x45, 0x02,
+ 0x34, 0xcd, 0x76, 0x94, 0x2b, 0xd6, 0x89, 0xab,
+ 0xa6, 0x9a, 0x87, 0x60, 0x54, 0x37, 0x5f, 0x04,
+ 0x8d, 0xa3, 0xbf, 0xfa, 0xd1, 0x1d, 0x03, 0x29,
+ 0x17, 0xca, 0xcd, 0x01, 0xda, 0x76, 0x49, 0x3b,
+ 0x97, 0xc9, 0xd3, 0xf5, 0x13, 0x75, 0xbe, 0x70,
+ 0xc4, 0x24, 0x43, 0xff, 0xaa, 0x44, 0x67, 0xba
+//};
+//unsigned int mprivatekey002_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc
new file mode 100644
index 0000000..a27ba10
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : privrevoked/member000
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2C, 0xBB, 0xFE, 0x06, 0x26,
+ 0x5F, 0x20, 0xBD, 0x9E, 0x49, 0x11, 0x31, 0xE0,
+ 0x7C, 0x99, 0x5E, 0xA0, 0x58, 0x4F, 0x1B, 0x3F,
+ 0xB4, 0x6E, 0xCD, 0x17, 0x61, 0x79, 0xA0, 0xFD,
+ 0x64, 0x60, 0xA4, 0xF8, 0x17, 0x81, 0xC3, 0x0A,
+ 0x4B, 0x6A, 0x72, 0x86, 0x96, 0xE3, 0xFA, 0x95,
+ 0x47, 0x45, 0xFB, 0x57, 0xEF, 0xCA, 0x82, 0x99,
+ 0x72, 0xDC, 0xE6, 0x78, 0xE3, 0x70, 0xA8, 0x28,
+ 0x38, 0xF7, 0x31, 0x44, 0xE9, 0xD3, 0xC8, 0xA8,
+ 0xF9, 0x72, 0x0D, 0x4F, 0xB5, 0x5E, 0x64, 0xD0,
+ 0x36, 0x0C, 0xEE, 0x7D, 0x67, 0x92, 0xD8, 0xF7,
+ 0xCB, 0x3C, 0xA3, 0x86, 0x06, 0x14, 0x6F, 0x79,
+ 0xAB, 0xB6, 0x8E, 0x27, 0x72, 0xBF, 0x87, 0x3D,
+ 0x3C, 0x28, 0xB6, 0xC4, 0x2D, 0x21, 0x2E, 0xBA,
+ 0x4E, 0x15, 0xA7, 0xFE, 0xD3, 0xF9, 0x5D, 0x8B,
+ 0x86, 0xD9, 0x1D, 0x6E, 0xD3, 0xAA, 0x3C, 0x8D,
+ 0xF4, 0xE8, 0x5D, 0x34, 0xEB, 0xB1, 0x28, 0x15,
+ 0x86, 0x0C, 0x17, 0x5E, 0x9F, 0x37, 0x02, 0x3C,
+ 0xDA, 0xF2, 0xAD, 0x95, 0xF8, 0x55, 0xB2, 0xCD,
+ 0x19, 0x12, 0x8F, 0xD8, 0xAB, 0x23, 0xC2, 0x51,
+ 0x22, 0x58, 0x2F, 0x9A, 0x86, 0x6D, 0x89, 0x44,
+ 0x78, 0x78, 0xEB, 0x4F, 0xA2, 0xD7, 0x06, 0x3A,
+ 0xBE, 0xCC, 0x27, 0x8E, 0x24, 0x07, 0x84, 0x10,
+ 0x9B, 0xBB, 0x1E, 0xC3, 0x1F, 0x96, 0xE8, 0x5F,
+ 0xDF, 0xC9, 0xFA, 0x8A, 0xDF, 0xB7, 0x1E, 0x4A,
+ 0x0E, 0x65, 0xE0, 0x1A, 0x1C, 0x74, 0xA0, 0xFE,
+ 0x4C, 0xD0, 0xDC, 0xB4, 0xEB, 0xA8, 0x03, 0xE0,
+ 0x89, 0xBC, 0x85, 0x5E, 0x82, 0xC8, 0xC5, 0x3D,
+ 0x0F, 0x29, 0xB9, 0x90, 0xA0, 0xBC, 0xB3, 0x73,
+ 0xAF, 0xF5, 0xEF, 0xA6, 0x55, 0x66, 0x23, 0x80,
+ 0x82, 0x6D, 0x53, 0xAB, 0x75, 0xAA, 0x9B, 0x08,
+ 0xDB, 0x2A, 0x72, 0x73, 0x88, 0x25, 0x91, 0x52,
+ 0xC3, 0x89, 0x4C, 0xD6, 0x24, 0x65, 0xB0, 0x30,
+ 0x09, 0x03, 0xAE, 0x24, 0x4D, 0x4B, 0x65, 0x66,
+ 0x7B, 0xA1, 0x2B, 0x36, 0xE6, 0xD8, 0x5C, 0x71,
+ 0xE6, 0xE0, 0xBB, 0x9F, 0x82, 0x0C, 0x53, 0x61,
+ 0xF8, 0xAB, 0x62, 0x48, 0x96, 0x4F, 0x04, 0xB9,
+ 0x31, 0x0C, 0x76, 0x62, 0x8A, 0xFB, 0x58, 0x56,
+ 0xA5, 0x3B, 0xF0, 0xB8, 0xE9, 0x8F, 0xE1, 0x47,
+ 0x12, 0x75, 0x2A, 0x30, 0x28, 0x93, 0xA9, 0xF0,
+ 0xEE, 0x22, 0xB0, 0x66, 0xFB, 0x0C, 0x2B, 0x09,
+ 0xAD, 0x07, 0x3C, 0x51, 0xFE, 0xD6, 0x8E, 0xED,
+ 0xC3, 0xFC, 0x68, 0x29, 0x0A, 0x1A, 0xB9, 0xD1,
+ 0x27, 0xAC, 0x52, 0xA0, 0x79, 0x5D, 0x44, 0x08,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xBC, 0xB0, 0x1D, 0x71, 0x43, 0xB1, 0x9C, 0x54,
+ 0x8E, 0x87, 0xE6, 0x61, 0x77, 0x78, 0xF6, 0x37,
+ 0x82, 0x49, 0xFB, 0xDA, 0x62, 0x38, 0x49, 0xE1,
+ 0xBA, 0x59, 0x89, 0x47, 0x40, 0xF1, 0xAE, 0x8D,
+ 0x80, 0x7B, 0xAC, 0xEF, 0x9E, 0x80, 0x43, 0xF4,
+ 0xF0, 0xDE, 0x7E, 0x77, 0x2A, 0x2B, 0x20, 0xAD,
+ 0x2C, 0x74, 0x19, 0xD8, 0x73, 0x64, 0xE9, 0xC1,
+ 0x00, 0x35, 0x77, 0xE2, 0x16, 0x02, 0x81, 0xE1,
+ 0x3D, 0x97, 0x90, 0x2F, 0x50, 0x46, 0xB4, 0x55,
+ 0x0F, 0x64, 0x1B, 0xEF, 0xA5, 0xA4, 0x80, 0x59,
+ 0x5D, 0xF2, 0xD5, 0x4D, 0x0C, 0x46, 0xBD, 0x28,
+ 0xCC, 0x98, 0xE8, 0x04, 0xB8, 0x07, 0x2A, 0x57,
+ 0xBD, 0xCE, 0x84, 0x1B, 0x8F, 0x85, 0x62, 0x5F,
+ 0x73, 0xBF, 0x71, 0x8C, 0xB5, 0xD5, 0x78, 0x45,
+ 0xB9, 0x7F, 0x93, 0xC3, 0x92, 0xCF, 0x06, 0xE9,
+ 0xD9, 0x25, 0x8E, 0x28, 0x51, 0x88, 0x26, 0x1D,
+ 0xE0, 0xAE, 0x4F, 0x9C, 0xED, 0xD2, 0x93, 0xA2,
+ 0xC8, 0x80, 0x32, 0x02, 0x67, 0xBB, 0x27, 0xDC,
+ 0x19, 0xF7, 0xB7, 0x67, 0xD1, 0xE3, 0x7E, 0xF1,
+ 0xB6, 0x16, 0x5A, 0xFE, 0xB6, 0x1C, 0x55, 0x5D,
+ 0x02, 0x86, 0x4F, 0xAB, 0x1E, 0xB2, 0x2A, 0xFD,
+ 0x91, 0xB6, 0x2B, 0x1A, 0x86, 0xFC, 0x14, 0x77,
+ 0xCB, 0xAD, 0x50, 0xC5, 0x9F, 0x7F, 0x9B, 0x86,
+ 0x0C, 0xD8, 0xAD, 0x3B, 0x17, 0xE6, 0x86, 0x6E,
+ 0x5B, 0x3B, 0xEE, 0x28, 0x9E, 0x79, 0xC5, 0x19,
+ 0x88, 0x5E, 0x9C, 0x5D, 0xD8, 0x44, 0x9C, 0x37,
+ 0xAD, 0x0E, 0x0E, 0x54, 0x8D, 0xB5, 0x42, 0x4C,
+ 0x52, 0xFB, 0xE4, 0x61, 0x2D, 0x32, 0x94, 0x77,
+ 0xF8, 0x19, 0x31, 0x92, 0x1A, 0x4B, 0x73, 0xB3,
+ 0xDE, 0x0E, 0x84, 0xD0, 0xBD, 0x55, 0xC4, 0xA6,
+ 0x5A, 0xDA, 0xD4, 0x3F, 0x86, 0xF5, 0xEB, 0x48,
+ 0x6B, 0xDA, 0xF5, 0xE9, 0x0A, 0x57, 0x4C, 0x87,
+ 0x87, 0x5C, 0x15, 0xFD, 0x48, 0x4E, 0xE3, 0xA0,
+ 0xC2, 0x7F, 0xE7, 0x3F, 0x25, 0x3D, 0x82, 0x1F,
+ 0xC8, 0xB0, 0x75, 0x59, 0x55, 0x9F, 0x5B, 0x51,
+ 0x97, 0xF0, 0xF5, 0xBC, 0xE1, 0xB0, 0xC1, 0x7D,
+ 0xD7, 0x32, 0xFB, 0xAE, 0x76, 0x96, 0xCE, 0x08,
+ 0xC0, 0xBA, 0x59, 0x4D, 0xE5, 0xDA, 0xFE, 0x4E,
+ 0xDD, 0x6D, 0xA8, 0x44, 0xC1, 0x0D, 0xEC, 0x1D,
+ 0xE0, 0xC1, 0xDF, 0x0B, 0xB8, 0x72, 0x5B, 0x2B,
+ 0x33, 0xBC, 0x50, 0xB4, 0x0C, 0x60, 0x14, 0x6A,
+ 0x3B, 0x47, 0xBC, 0x24, 0x68, 0x84, 0xEE, 0xD2,
+ 0x5F, 0xA5, 0xAC, 0x72, 0x87, 0xE4, 0x85, 0x23,
+ 0x36, 0x2B, 0x59, 0x51, 0x56, 0x71, 0x38, 0xB6,
+ 0x0D, 0x29, 0xC1, 0xFD, 0x07, 0xB0, 0x96, 0x7C,
+ 0xC2, 0x3F, 0x91, 0x17, 0x19, 0xC3, 0x1D, 0x4B,
+ 0xFE, 0x2A, 0xE8, 0x26, 0xB4, 0x11, 0x70, 0x54,
+ 0xB4, 0x44, 0x59, 0xCB, 0xB3, 0x16, 0xD4, 0x78,
+ 0x0E, 0xB6, 0x52, 0x47, 0x5F, 0xF5, 0x04, 0x61,
+ 0x71, 0xEA, 0x76, 0x53, 0x33, 0x6E, 0xEE, 0x84,
+ 0xF3, 0x8C, 0xCC, 0xC9, 0x67, 0xB7, 0xDE, 0xDF,
+ 0x2C, 0x49, 0x43, 0xD6, 0x7A, 0x8A, 0xB8, 0xFB,
+ 0x14, 0x9F, 0xD9, 0xC6, 0x00, 0x4D, 0xA3, 0x73,
+ 0x92, 0x50, 0x85, 0x9D, 0x92, 0x5A, 0x77, 0xC5,
+ 0x5A, 0xB2, 0x29, 0xB9, 0x97, 0x64, 0xE6, 0xF6,
+ 0x84, 0xE8, 0x9C, 0x68, 0x0D, 0xD7, 0x0E, 0xC2,
+ 0x63, 0x88, 0x9D, 0x83, 0x91, 0x14, 0x64, 0x99,
+ 0xAD, 0xBE, 0xBC, 0x35, 0x99, 0x76, 0x71, 0x4E,
+ 0x65, 0x79, 0x5E, 0xF5, 0x37, 0x09, 0x71, 0xF8,
+ 0x21, 0x00, 0xCA, 0x1B, 0x3F, 0xEF, 0x51, 0x1D
+//};
+//unsigned int sig_grpx_member0_sha256_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc
new file mode 100644
index 0000000..5814422
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : privrevoked/member001
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2C, 0xBB, 0xFE, 0x06, 0x26,
+ 0x5F, 0x20, 0xBD, 0x9E, 0x49, 0x11, 0x31, 0xE0,
+ 0x7C, 0x99, 0x5E, 0xA0, 0x58, 0x4F, 0x1B, 0x3F,
+ 0xB4, 0x6E, 0xCD, 0x17, 0x61, 0x79, 0xA0, 0xFD,
+ 0x64, 0x60, 0xA4, 0xF8, 0x17, 0x81, 0xC3, 0x0A,
+ 0x4B, 0x6A, 0x72, 0x86, 0x96, 0xE3, 0xFA, 0x95,
+ 0x47, 0x45, 0xFB, 0x57, 0xEF, 0xCA, 0x82, 0x99,
+ 0x72, 0xDC, 0xE6, 0x78, 0xE3, 0x70, 0xA8, 0x28,
+ 0x97, 0xD9, 0xAF, 0x30, 0xFA, 0x73, 0xBC, 0x33,
+ 0xA8, 0x5F, 0x52, 0x1A, 0x72, 0x93, 0xCF, 0xC3,
+ 0xA0, 0xE2, 0x73, 0x3C, 0xAA, 0x2A, 0x27, 0x52,
+ 0x21, 0x78, 0xD0, 0x7C, 0x74, 0x2E, 0xCB, 0xD5,
+ 0x80, 0x52, 0xCC, 0xDF, 0x55, 0x2A, 0xB9, 0x71,
+ 0x77, 0xE3, 0xCB, 0xAE, 0xC7, 0x55, 0x8A, 0xBF,
+ 0xDC, 0x55, 0x57, 0xD2, 0xFC, 0xE7, 0x33, 0xE9,
+ 0x58, 0x38, 0x0F, 0x36, 0x98, 0xD1, 0x50, 0xEE,
+ 0xB2, 0xCA, 0x4E, 0x22, 0x4B, 0xEB, 0xB8, 0x03,
+ 0x4A, 0x4F, 0x4D, 0xF6, 0x1A, 0x3D, 0xDD, 0x77,
+ 0x85, 0x4B, 0xC3, 0x8E, 0x3A, 0x26, 0x05, 0x7D,
+ 0x9B, 0xAF, 0x72, 0xC9, 0x04, 0x2C, 0x53, 0x4D,
+ 0x6B, 0x35, 0x26, 0x03, 0x2D, 0xA6, 0xB9, 0xFA,
+ 0x3D, 0x60, 0xCD, 0x95, 0x15, 0x81, 0x89, 0x72,
+ 0x88, 0x1E, 0x53, 0x20, 0x63, 0xC2, 0x1B, 0x5A,
+ 0x59, 0x48, 0xE5, 0x0F, 0xD6, 0xF5, 0x63, 0x3E,
+ 0x0C, 0x94, 0x8C, 0x3C, 0x18, 0x4C, 0x6A, 0x7C,
+ 0x6E, 0x51, 0xB2, 0x31, 0xFC, 0x35, 0xB4, 0x35,
+ 0xF3, 0x63, 0x69, 0x75, 0x31, 0x95, 0x2B, 0x1D,
+ 0x53, 0x2F, 0xC8, 0x59, 0x8F, 0xFD, 0xBA, 0x81,
+ 0xAE, 0xF8, 0x0A, 0x1B, 0xFE, 0xD1, 0xF0, 0x60,
+ 0xA8, 0x9C, 0xC6, 0x4E, 0x39, 0x7C, 0xC4, 0xFF,
+ 0xBB, 0xED, 0x4B, 0xC4, 0x66, 0xF2, 0xBE, 0xEA,
+ 0x83, 0x15, 0x7F, 0x62, 0xA7, 0xA0, 0x0E, 0x6A,
+ 0x68, 0xBF, 0xD6, 0xA5, 0xCE, 0xF4, 0x64, 0x85,
+ 0x9B, 0xAC, 0x97, 0xE8, 0x19, 0xDA, 0xCF, 0xCC,
+ 0xDF, 0xB5, 0x3E, 0xA5, 0xFC, 0xFD, 0x9C, 0x88,
+ 0x41, 0x54, 0x43, 0xA8, 0xF7, 0x86, 0xD3, 0x2E,
+ 0xC3, 0x27, 0x26, 0x23, 0x1C, 0x5C, 0xF8, 0xA8,
+ 0x4A, 0x9F, 0x52, 0x89, 0xEC, 0x71, 0x4D, 0x14,
+ 0xE1, 0x0E, 0x1A, 0x9C, 0x49, 0x2B, 0x39, 0xFD,
+ 0x8E, 0x87, 0x0A, 0x74, 0x2E, 0xAA, 0x91, 0xE8,
+ 0x7F, 0x06, 0xAD, 0x11, 0x9A, 0xA9, 0x33, 0x36,
+ 0x26, 0xA3, 0x21, 0xE8, 0xEF, 0x06, 0x7F, 0x36,
+ 0x2D, 0xEF, 0xAE, 0x63, 0x8A, 0x1A, 0xFC, 0xAD,
+ 0x72, 0xFF, 0xCA, 0x7B, 0xFF, 0xED, 0xD2, 0xCB,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x11, 0xBC, 0x6D, 0x79, 0x07, 0x9D, 0x50, 0x47,
+ 0xA4, 0x1D, 0x04, 0xBB, 0xEC, 0xBE, 0xEB, 0x07,
+ 0xCF, 0xB3, 0x5A, 0xC8, 0xBA, 0xB7, 0xCE, 0x92,
+ 0x72, 0x5F, 0xA5, 0xDA, 0x89, 0xDF, 0xC6, 0xEB,
+ 0x35, 0xDC, 0x53, 0x3C, 0xD8, 0x32, 0x7B, 0xD3,
+ 0xE7, 0xBD, 0x76, 0x28, 0xFA, 0x71, 0x3A, 0xD5,
+ 0x64, 0xD3, 0xC9, 0x39, 0x12, 0xA0, 0x86, 0x60,
+ 0xBB, 0x7B, 0xBA, 0xD3, 0xAF, 0xAC, 0x06, 0x07,
+ 0x0E, 0x15, 0xAA, 0xD7, 0x86, 0xD3, 0x2F, 0x56,
+ 0x9D, 0xE0, 0xE3, 0xAE, 0xBF, 0xE3, 0x53, 0x64,
+ 0x57, 0x98, 0xF3, 0x90, 0x12, 0xC9, 0xDD, 0x54,
+ 0xE3, 0x31, 0xAE, 0xB9, 0xF4, 0x3F, 0x3A, 0x0F,
+ 0xB5, 0xC0, 0x08, 0x30, 0x41, 0xE1, 0x9B, 0x3C,
+ 0xFD, 0x55, 0xDA, 0xD7, 0x7D, 0xB5, 0x6A, 0xB6,
+ 0x21, 0x4A, 0xAC, 0x4B, 0x7C, 0x41, 0x4E, 0x46,
+ 0xC6, 0x42, 0x87, 0x3B, 0xE1, 0x2D, 0xCB, 0xFE,
+ 0x66, 0xA7, 0x1E, 0xC1, 0xFD, 0xAC, 0xA3, 0xE5,
+ 0x8C, 0x8A, 0xB1, 0x6E, 0x90, 0xBA, 0x45, 0x8C,
+ 0x5C, 0xA5, 0x57, 0xB9, 0x0B, 0x58, 0x6B, 0x59,
+ 0x29, 0x5D, 0x98, 0x32, 0x85, 0xA7, 0x5A, 0x2F,
+ 0x95, 0x2D, 0x83, 0x16, 0x43, 0x04, 0x16, 0xB0,
+ 0x80, 0x32, 0xD0, 0x22, 0x8D, 0xFF, 0x21, 0xA4,
+ 0x04, 0x6A, 0x54, 0xE0, 0x0D, 0x4D, 0xBF, 0xA7,
+ 0x48, 0x1A, 0xDB, 0xD2, 0xDB, 0x84, 0xDE, 0x77,
+ 0x1A, 0x43, 0x36, 0x61, 0xF0, 0x7F, 0xB4, 0x99,
+ 0x75, 0xE5, 0x5D, 0xD6, 0xE2, 0x56, 0xC7, 0x17,
+ 0x9B, 0x38, 0x3E, 0x53, 0xF4, 0x4F, 0xBE, 0x82,
+ 0x3C, 0xEE, 0x89, 0x8A, 0x81, 0xD4, 0x9B, 0x72,
+ 0xD4, 0x55, 0xD1, 0x90, 0x34, 0x12, 0xA6, 0xED,
+ 0xA2, 0x6E, 0x7C, 0x50, 0xDB, 0x2C, 0x7C, 0xF9,
+ 0x34, 0xE7, 0xB8, 0xE1, 0xD2, 0xC8, 0x9E, 0x17,
+ 0x15, 0xA3, 0x22, 0xEC, 0x5A, 0xC4, 0x91, 0x2A,
+ 0x96, 0x19, 0x88, 0xBA, 0x73, 0xBE, 0x83, 0xA1,
+ 0x9F, 0x95, 0x17, 0x6F, 0x6A, 0xCE, 0x14, 0xF7,
+ 0x95, 0x60, 0xE8, 0xA9, 0xDF, 0x0B, 0xD9, 0xD7,
+ 0xE2, 0x98, 0xC0, 0x5C, 0x86, 0x83, 0x43, 0xE7,
+ 0xE1, 0x4F, 0xDA, 0x57, 0x27, 0xC7, 0x52, 0xE6,
+ 0x77, 0x05, 0x0B, 0x84, 0x46, 0x4B, 0xCB, 0x4D,
+ 0x2A, 0x4F, 0x39, 0xCC, 0xA3, 0x93, 0x42, 0xE0,
+ 0x9E, 0xA2, 0x4D, 0xAC, 0xC8, 0x9D, 0x1A, 0xAD,
+ 0x37, 0x01, 0xA4, 0x33, 0x58, 0xB7, 0x46, 0x60,
+ 0x82, 0xF9, 0xCB, 0xA6, 0x4D, 0x6B, 0xB5, 0x54,
+ 0x9E, 0xD8, 0xBA, 0x32, 0x96, 0xD8, 0xE0, 0x14,
+ 0x5E, 0xF8, 0x79, 0x53, 0x5B, 0xED, 0xC6, 0x93,
+ 0x3F, 0xEA, 0x3C, 0xD2, 0x34, 0xA2, 0xB8, 0x68,
+ 0x56, 0xC7, 0x2D, 0xA5, 0x0C, 0xB3, 0x5A, 0xFD,
+ 0x34, 0x93, 0x5B, 0x59, 0x08, 0x4E, 0x77, 0x7C,
+ 0x78, 0x81, 0x89, 0x10, 0xB4, 0x8A, 0x95, 0x8E,
+ 0x5A, 0xB7, 0x66, 0xF1, 0x26, 0xC1, 0x71, 0xA8,
+ 0x09, 0x0E, 0x5D, 0x60, 0x57, 0xC2, 0x79, 0xFD,
+ 0xE9, 0x59, 0xFC, 0x5A, 0xD2, 0x46, 0x0B, 0x3D,
+ 0x76, 0xC3, 0x65, 0xF0, 0x26, 0xAF, 0x8E, 0xF9,
+ 0x16, 0xFC, 0x6B, 0xC7, 0x4F, 0x8F, 0x36, 0x2A,
+ 0x7F, 0x20, 0x24, 0x70, 0x10, 0xF8, 0x32, 0x7D,
+ 0xF6, 0x64, 0xE3, 0x18, 0x37, 0x14, 0x0C, 0xD3,
+ 0xBC, 0x2C, 0x1F, 0x88, 0x39, 0xD0, 0xF7, 0x97,
+ 0xAC, 0x15, 0xFA, 0xED, 0x33, 0xEE, 0x10, 0x1A,
+ 0xB0, 0xEB, 0x98, 0x36, 0xB2, 0x5C, 0x82, 0x20,
+ 0xA2, 0x75, 0xF9, 0xE4, 0x72, 0xA9, 0xB2, 0x0C,
+ 0x6C, 0x12, 0xC1, 0x4D, 0x86, 0x3A, 0x42, 0x7F
+//};
+//unsigned int sig_grpx_member0_sha256_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc
new file mode 100644
index 0000000..2737b16
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : privrevoked/member002
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_grpx_member0_sha256_bsn0_msg0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2C, 0xBB, 0xFE, 0x06, 0x26,
+ 0x5F, 0x20, 0xBD, 0x9E, 0x49, 0x11, 0x31, 0xE0,
+ 0x7C, 0x99, 0x5E, 0xA0, 0x58, 0x4F, 0x1B, 0x3F,
+ 0xB4, 0x6E, 0xCD, 0x17, 0x61, 0x79, 0xA0, 0xFD,
+ 0x64, 0x60, 0xA4, 0xF8, 0x17, 0x81, 0xC3, 0x0A,
+ 0x4B, 0x6A, 0x72, 0x86, 0x96, 0xE3, 0xFA, 0x95,
+ 0x47, 0x45, 0xFB, 0x57, 0xEF, 0xCA, 0x82, 0x99,
+ 0x72, 0xDC, 0xE6, 0x78, 0xE3, 0x70, 0xA8, 0x28,
+ 0x1D, 0xFB, 0xB5, 0x81, 0x0D, 0xDB, 0x30, 0x3B,
+ 0xD9, 0x3A, 0xFE, 0x9D, 0x94, 0xCD, 0x7D, 0x9F,
+ 0x7D, 0x68, 0xB6, 0x57, 0xE8, 0x26, 0x78, 0x2B,
+ 0x32, 0xC3, 0x14, 0xC7, 0xE4, 0xDE, 0x04, 0x7B,
+ 0x27, 0xBE, 0x27, 0xDA, 0x79, 0x25, 0x4E, 0x36,
+ 0x75, 0x0E, 0x6E, 0xD0, 0x78, 0x36, 0xA6, 0x23,
+ 0x57, 0x63, 0x71, 0xCC, 0x07, 0xFA, 0x57, 0xB6,
+ 0xF6, 0x9D, 0xA6, 0x00, 0x36, 0xA2, 0xAB, 0xBB,
+ 0x81, 0xC9, 0xAE, 0xA8, 0x3B, 0xA0, 0xA7, 0xCE,
+ 0x0B, 0xC6, 0xE3, 0x40, 0x32, 0xE5, 0x29, 0x8F,
+ 0x4E, 0x5E, 0xFD, 0x1B, 0x7A, 0x7E, 0x83, 0x8B,
+ 0x26, 0xC1, 0x7B, 0xEC, 0x62, 0x30, 0x1E, 0x6F,
+ 0xDD, 0x18, 0xD0, 0x89, 0x5B, 0xD9, 0xC5, 0xD7,
+ 0x1B, 0x94, 0x29, 0x81, 0xBC, 0xD8, 0x2D, 0xF3,
+ 0xE2, 0xD5, 0x2E, 0x7E, 0x4A, 0xA0, 0x87, 0xA9,
+ 0xAB, 0x73, 0xB1, 0x8C, 0x7B, 0x18, 0x1E, 0xDA,
+ 0x4E, 0x5D, 0x7B, 0x49, 0xA7, 0x0E, 0xD9, 0xD7,
+ 0x1A, 0x6C, 0xC6, 0x18, 0x25, 0x1F, 0x36, 0x49,
+ 0xFA, 0xB6, 0x54, 0xCE, 0x2D, 0x73, 0x70, 0x52,
+ 0xC8, 0xC3, 0xFE, 0x22, 0x5C, 0x58, 0x6A, 0x6E,
+ 0x60, 0xE1, 0x86, 0xA0, 0x7F, 0x38, 0x48, 0xEE,
+ 0xDC, 0x4B, 0xBC, 0xD1, 0xF4, 0x3D, 0x1A, 0x2B,
+ 0x6E, 0x95, 0x61, 0x41, 0x17, 0x66, 0xC3, 0xAE,
+ 0x05, 0xD4, 0x67, 0x6D, 0x29, 0x79, 0xB9, 0x3A,
+ 0x81, 0x28, 0xA9, 0x0C, 0xFA, 0xE3, 0xBD, 0x60,
+ 0x16, 0x53, 0xFF, 0x5C, 0x2B, 0x25, 0x29, 0x66,
+ 0x2D, 0x91, 0x5E, 0x97, 0xF2, 0x8C, 0x42, 0xE7,
+ 0xAE, 0x50, 0x08, 0x7E, 0xEF, 0x1B, 0xB0, 0xB2,
+ 0xA0, 0x5E, 0xDF, 0xB0, 0x49, 0x2A, 0xA8, 0x3D,
+ 0xA0, 0x95, 0x1A, 0xF6, 0x0B, 0xB1, 0x0D, 0x70,
+ 0x3E, 0x6B, 0xFC, 0x1B, 0x57, 0x4F, 0x01, 0xF8,
+ 0x1F, 0xF0, 0xDC, 0x7F, 0x7E, 0xF9, 0xF6, 0xA4,
+ 0xD3, 0x1B, 0x4C, 0x72, 0x9C, 0xB5, 0xAF, 0x9E,
+ 0xEF, 0x0B, 0x24, 0x39, 0xC0, 0x89, 0x6B, 0xE6,
+ 0x16, 0x4D, 0xFA, 0x2B, 0x71, 0xF1, 0x58, 0xC7,
+ 0x3E, 0xF1, 0xB3, 0x47, 0x48, 0xD9, 0xD5, 0x03,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x05, 0xED, 0x13, 0xC4, 0xB7, 0x70, 0x01, 0xA9,
+ 0x1F, 0x36, 0x29, 0x8E, 0x1F, 0x0B, 0x43, 0x0E,
+ 0xD9, 0x23, 0x1A, 0x80, 0xCD, 0x75, 0x2F, 0x84,
+ 0x44, 0x2D, 0x2B, 0xF2, 0xFD, 0x78, 0x9F, 0xF0,
+ 0xA8, 0xEC, 0xDC, 0x53, 0x38, 0x6B, 0x11, 0x9B,
+ 0x42, 0x7E, 0x3B, 0x8A, 0xBB, 0x48, 0x8A, 0x79,
+ 0x58, 0x99, 0xFD, 0xE2, 0x35, 0x63, 0x2F, 0xA1,
+ 0xDF, 0x1C, 0x3B, 0x2C, 0x93, 0xFA, 0xD4, 0x71,
+ 0x7A, 0xDC, 0x01, 0xFF, 0x9C, 0x5A, 0x3B, 0xD8,
+ 0xA4, 0x86, 0xBD, 0x51, 0x99, 0x13, 0x31, 0xDE,
+ 0x84, 0x8B, 0x44, 0x9F, 0x7C, 0x29, 0xED, 0x3E,
+ 0xB7, 0xE9, 0x81, 0x82, 0x87, 0xB1, 0x05, 0xD0,
+ 0x4B, 0xC5, 0x9B, 0x7D, 0x91, 0x67, 0xE9, 0x11,
+ 0x56, 0x79, 0x84, 0xEF, 0x59, 0x95, 0x6C, 0xF8,
+ 0xA7, 0xB7, 0x0B, 0x61, 0x4A, 0xF5, 0x73, 0x41,
+ 0xFD, 0x39, 0x82, 0xEC, 0xEB, 0x22, 0xA0, 0x22,
+ 0xF0, 0xAB, 0xDD, 0x15, 0x9D, 0x93, 0x73, 0xF1,
+ 0x31, 0xF2, 0xE7, 0x5E, 0xA1, 0x04, 0x95, 0x1D,
+ 0x88, 0xA5, 0x80, 0x05, 0x87, 0xF2, 0xBC, 0xAB,
+ 0xFE, 0x0A, 0x7B, 0x3F, 0xF3, 0x2E, 0xA9, 0x8A,
+ 0x98, 0x6D, 0xCB, 0x0A, 0xFA, 0x7B, 0x43, 0x98,
+ 0xFC, 0x5A, 0xC7, 0x4F, 0x17, 0x15, 0x45, 0xFA,
+ 0xC4, 0x5B, 0x4B, 0x79, 0xDE, 0x21, 0x1F, 0x1D,
+ 0x0F, 0xFF, 0x1B, 0xFB, 0xCF, 0x87, 0x9D, 0x11,
+ 0x0D, 0x3A, 0x29, 0x17, 0xAF, 0xC6, 0xDA, 0x22,
+ 0x5B, 0x58, 0xC7, 0xF6, 0xFB, 0x4F, 0x46, 0x8A,
+ 0xCA, 0x9B, 0x5E, 0xAA, 0x5A, 0xF7, 0xAE, 0xB5,
+ 0xAC, 0x0B, 0x0E, 0xE1, 0x54, 0xD5, 0x6A, 0x20,
+ 0x20, 0xC1, 0x8A, 0x31, 0xCC, 0xE8, 0xCE, 0x92,
+ 0xFA, 0x7F, 0xF7, 0xD0, 0x73, 0x42, 0xDA, 0x47,
+ 0xFB, 0x08, 0x63, 0x38, 0xA0, 0x0D, 0xB6, 0x73,
+ 0x06, 0x48, 0xCA, 0x10, 0x8C, 0xE3, 0xA3, 0xE4,
+ 0xC3, 0x2A, 0x77, 0xDB, 0x1E, 0x47, 0x6A, 0x95,
+ 0xF4, 0x99, 0x0C, 0xA6, 0x29, 0x8C, 0x4E, 0x20,
+ 0x8D, 0xB6, 0x8D, 0x77, 0x8A, 0x3E, 0x35, 0xB7,
+ 0x8A, 0x0B, 0xCE, 0x71, 0x92, 0xD8, 0x32, 0xBA,
+ 0xB1, 0xA0, 0x40, 0x28, 0x7B, 0xA3, 0x19, 0x12,
+ 0x05, 0xA7, 0x13, 0xC1, 0xDB, 0xE3, 0x2A, 0x9A,
+ 0xDC, 0x41, 0x95, 0x69, 0x47, 0x81, 0xC1, 0x3B,
+ 0x88, 0x78, 0xBA, 0x08, 0xC0, 0xDC, 0xAF, 0x24,
+ 0x1C, 0x17, 0xEF, 0xD0, 0xB3, 0x3E, 0xFA, 0x0B,
+ 0x9A, 0x62, 0xF8, 0x6F, 0xEC, 0x84, 0xA0, 0xC1,
+ 0xB7, 0x9E, 0x24, 0x9B, 0x05, 0x77, 0x80, 0x7E,
+ 0x2D, 0x5A, 0xBF, 0xD9, 0x90, 0xBB, 0x99, 0xF0,
+ 0x2D, 0xF7, 0x66, 0xB6, 0x77, 0xF5, 0xF2, 0xD3,
+ 0xA7, 0x57, 0x85, 0xAF, 0x39, 0x9A, 0x3D, 0x05,
+ 0x1E, 0xD7, 0x87, 0x6C, 0xF4, 0xA6, 0xDD, 0x36,
+ 0x57, 0x10, 0xB9, 0x4C, 0x55, 0xC7, 0x83, 0xFA,
+ 0x29, 0xAF, 0x4D, 0x8C, 0xCC, 0x13, 0x4B, 0x2D,
+ 0x0E, 0x9D, 0x8B, 0xFF, 0xCE, 0x70, 0x3D, 0x27,
+ 0x52, 0x99, 0x32, 0x69, 0xC2, 0xDC, 0xA1, 0x27,
+ 0x61, 0x98, 0x11, 0x3C, 0xC8, 0x60, 0x6F, 0xF1,
+ 0x8C, 0x86, 0x27, 0xA5, 0x18, 0x2C, 0xEE, 0x7B,
+ 0xF8, 0xEE, 0x72, 0x8A, 0x12, 0x59, 0xDF, 0x90,
+ 0x0F, 0x34, 0x4D, 0x38, 0x19, 0x6E, 0xBD, 0xE3,
+ 0x08, 0x77, 0x60, 0x88, 0x2F, 0x69, 0x5B, 0xF7,
+ 0x3B, 0x7E, 0x81, 0xD0, 0x04, 0xE7, 0x8C, 0x17,
+ 0xD5, 0x60, 0xC6, 0xED, 0xF0, 0x65, 0xAD, 0x54,
+ 0x60, 0xE7, 0x76, 0x34, 0x4F, 0x8D, 0xB6, 0x44,
+ 0x57, 0xBD, 0x20, 0xEB, 0x15, 0x89, 0xE4, 0xB1
+//};
+//unsigned int sig_grpx_member0_sha256_bsn0_msg0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/privrl.inc b/epid/common-testhelper/testdata/grp_x/privrl.inc
new file mode 100644
index 0000000..a16a36a
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrl.inc
@@ -0,0 +1,40 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 private-key based revocation list
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xb1, 0x58, 0x6e, 0x93, 0x42, 0x67, 0x51, 0xfb,
+ 0x1b, 0x42, 0x4f, 0x0b, 0xe5, 0x11, 0x44, 0x6b,
+ 0xdd, 0x8b, 0xe8, 0xe9, 0x44, 0x09, 0x70, 0x6a,
+ 0xab, 0xaf, 0x54, 0xd8, 0x4a, 0xd3, 0x3d, 0x7c,
+ 0xfb, 0x9c, 0x7f, 0x54, 0x34, 0xba, 0xc2, 0xdb,
+ 0x2b, 0xec, 0xca, 0x08, 0xf8, 0x19, 0x3f, 0x79,
+ 0xee, 0x02, 0x01, 0x1f, 0x7c, 0x6a, 0x3a, 0xdb,
+ 0x6b, 0x42, 0x31, 0xc7, 0x09, 0x4e, 0xb0, 0x1b,
+ 0x8d, 0xa3, 0xbf, 0xfa, 0xd1, 0x1d, 0x03, 0x29,
+ 0x17, 0xca, 0xcd, 0x01, 0xda, 0x76, 0x49, 0x3b,
+ 0x97, 0xc9, 0xd3, 0xf5, 0x13, 0x75, 0xbe, 0x70,
+ 0xc4, 0x24, 0x43, 0xff, 0xaa, 0x44, 0x67, 0xba
+//};
+//unsigned int privrl_dat_len = 120;
diff --git a/epid/common-testhelper/testdata/grp_x/privrl_single_entry_revoked_key000.inc b/epid/common-testhelper/testdata/grp_x/privrl_single_entry_revoked_key000.inc
new file mode 100644
index 0000000..abd8fb5
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/privrl_single_entry_revoked_key000.inc
@@ -0,0 +1,33 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 private-key based revocation list
+ * single entry, privrevoked/member000
+ * Group : grpX
+ */
+//unsigned char privrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0xb1, 0x58, 0x6e, 0x93, 0x42, 0x67, 0x51, 0xfb,
+ 0x1b, 0x42, 0x4f, 0x0b, 0xe5, 0x11, 0x44, 0x6b,
+ 0xdd, 0x8b, 0xe8, 0xe9, 0x44, 0x09, 0x70, 0x6a,
+ 0xab, 0xaf, 0x54, 0xd8, 0x4a, 0xd3, 0x3d, 0x7c
+//};
+//unsigned int privrl_dat_len = 56;
diff --git a/epid/common-testhelper/testdata/grp_x/pubkey.inc b/epid/common-testhelper/testdata/grp_x/pubkey.inc
new file mode 100644
index 0000000..a7d7484
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/pubkey.inc
@@ -0,0 +1,59 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group public key
+ * Group : grpX
+ */
+//unsigned char pubkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x3d, 0x4b, 0x62, 0xf9, 0xf9, 0x1a, 0x0f, 0xb1,
+ 0x58, 0x7b, 0x0e, 0x42, 0x0c, 0xba, 0x94, 0x10,
+ 0xb4, 0x4e, 0x75, 0x33, 0x37, 0x24, 0xc0, 0xd0,
+ 0x9e, 0xf6, 0xb8, 0xe6, 0x8b, 0x69, 0xaa, 0xb1,
+ 0x29, 0x8f, 0x2a, 0xc3, 0xd9, 0x1d, 0x50, 0x4d,
+ 0xa3, 0x75, 0x20, 0x07, 0x1a, 0xa1, 0x7b, 0x2f,
+ 0xad, 0x72, 0x47, 0xff, 0x46, 0x8e, 0x69, 0xb2,
+ 0x05, 0x9e, 0xda, 0x68, 0xca, 0xc7, 0x81, 0x4c,
+ 0x48, 0x7a, 0x66, 0x7d, 0x9f, 0x52, 0xb3, 0x45,
+ 0x59, 0x5e, 0xde, 0x15, 0xdc, 0x29, 0xea, 0x7e,
+ 0x0e, 0xbf, 0x5e, 0xf3, 0xd0, 0x7b, 0xf1, 0x79,
+ 0x00, 0x1a, 0xcb, 0xd2, 0x56, 0xdc, 0x6f, 0xb1,
+ 0x50, 0xe8, 0xa8, 0x37, 0x22, 0x44, 0xa5, 0x6b,
+ 0x8f, 0x11, 0x92, 0xe5, 0x02, 0xd4, 0x9f, 0x89,
+ 0x4f, 0x97, 0x3a, 0x46, 0x5a, 0xe7, 0x00, 0xf3,
+ 0xbf, 0xf2, 0x47, 0x28, 0xa5, 0xf9, 0x07, 0xf5,
+ 0xb0, 0x63, 0x98, 0x76, 0x04, 0xcf, 0x85, 0xd9,
+ 0xad, 0xf2, 0x02, 0x0c, 0x13, 0x2c, 0x45, 0x10,
+ 0x5b, 0xcb, 0xa8, 0x76, 0xde, 0x1e, 0xe6, 0x92,
+ 0x06, 0x91, 0x49, 0xc2, 0x1a, 0xe8, 0x80, 0x90,
+ 0x46, 0x20, 0xd0, 0xd6, 0x73, 0xae, 0x29, 0x02,
+ 0xc2, 0x3f, 0x85, 0x13, 0x1a, 0x66, 0xae, 0xc1,
+ 0x61, 0x52, 0x62, 0xbf, 0x70, 0x1b, 0x1b, 0x52,
+ 0xde, 0x76, 0x8c, 0x9b, 0x35, 0x42, 0xa8, 0x19,
+ 0x32, 0x6c, 0xa2, 0x9b, 0x44, 0x24, 0x96, 0x1e,
+ 0x48, 0x68, 0xc8, 0x83, 0x16, 0xfb, 0xc3, 0xf6,
+ 0xed, 0x73, 0x94, 0xd9, 0xd4, 0x60, 0x63, 0xc0,
+ 0x2c, 0x44, 0x54, 0x36, 0x20, 0x38, 0x5b, 0x12,
+ 0x23, 0x32, 0x63, 0x6d, 0x79, 0x40, 0xf0, 0x3c,
+ 0x60, 0x35, 0xe9, 0xfe, 0xa3, 0xb3, 0xad, 0xe7,
+ 0xfa, 0x9c, 0xf1, 0xd7, 0x98, 0xfe, 0x28, 0x9e,
+ 0xc1, 0x81, 0xe7, 0x51, 0xce, 0x07, 0xbc, 0xc5
+//};
+//unsigned int pubkey_dat_len = 272;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc
new file mode 100644
index 0000000..d05d3b8
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : sigrevokedmember000 (revoked in grpX sigrl)
+ */
+
+//unsigned char mprivatekey000_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xa6, 0x7f, 0x17, 0xb8, 0xef, 0xe3, 0xab, 0x01,
+ 0x3f, 0x25, 0x02, 0x5e, 0x19, 0x93, 0xa5, 0x34,
+ 0x3a, 0x23, 0xec, 0xe5, 0x71, 0x87, 0x7d, 0x33,
+ 0x7c, 0x6b, 0xbf, 0x2e, 0x63, 0xb6, 0x85, 0xeb,
+ 0xe6, 0x1a, 0x60, 0xd9, 0x1c, 0xef, 0xd1, 0xae,
+ 0x85, 0x96, 0xd9, 0x8e, 0xf8, 0xf9, 0x8b, 0x68,
+ 0xfe, 0x7c, 0x3a, 0xde, 0x0b, 0xea, 0xa7, 0x7f,
+ 0x1c, 0x65, 0x81, 0xda, 0x3a, 0xc5, 0xea, 0xe0,
+ 0x67, 0x80, 0xf0, 0x53, 0x2c, 0xfa, 0xe3, 0xec,
+ 0xfd, 0x35, 0x7b, 0xd8, 0xa6, 0xf6, 0x54, 0x4b,
+ 0xc0, 0xb3, 0x38, 0x6b, 0x40, 0xae, 0xd9, 0x50,
+ 0x3f, 0x9f, 0x01, 0x87, 0x70, 0x0f, 0x9f, 0xcd,
+ 0x79, 0xa7, 0x3b, 0x7c, 0xb3, 0xd3, 0xd1, 0xc0,
+ 0x75, 0xf1, 0x50, 0xd6, 0x03, 0x40, 0xf8, 0xd6,
+ 0xc5, 0xf5, 0x7b, 0x1f, 0xfa, 0x61, 0xd9, 0x58,
+ 0xbc, 0x1b, 0xcd, 0x92, 0x35, 0x97, 0xa2, 0xb9
+//};
+//unsigned int mprivatekey000_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey001.inc b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey001.inc
new file mode 100644
index 0000000..e9d2877
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey001.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : sigrevokedmember001 (revoked in grpX sigrl)
+ */
+
+//unsigned char mprivatekey001_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xdb, 0x1b, 0x7b, 0xaa, 0x93, 0xed, 0x33, 0x68,
+ 0x8d, 0x20, 0x80, 0x66, 0x12, 0xaa, 0xfb, 0x6c,
+ 0x84, 0x02, 0xf0, 0xbd, 0x4b, 0xa4, 0xac, 0x12,
+ 0xcc, 0xbf, 0xfb, 0xd2, 0x19, 0x64, 0x14, 0xa2,
+ 0xdc, 0xf6, 0x85, 0xcc, 0xd1, 0xb7, 0x15, 0x65,
+ 0x76, 0xf2, 0xf5, 0xdd, 0x91, 0x98, 0xa1, 0x6e,
+ 0x21, 0x64, 0xcc, 0x74, 0xe1, 0x9b, 0x7c, 0x56,
+ 0xd4, 0x2f, 0xf5, 0x5f, 0xd4, 0xec, 0x03, 0x69,
+ 0x27, 0x49, 0xcd, 0xd3, 0x90, 0x18, 0xb2, 0x82,
+ 0x74, 0x46, 0x2b, 0x70, 0xc3, 0xe9, 0xcb, 0x30,
+ 0xde, 0x4e, 0x9c, 0x19, 0x97, 0x93, 0x24, 0x8b,
+ 0x10, 0xe9, 0x68, 0xca, 0x64, 0xbf, 0xcd, 0x81,
+ 0x02, 0x5c, 0x15, 0x7e, 0x0f, 0x00, 0x82, 0x32,
+ 0x45, 0xcf, 0x91, 0xd3, 0x64, 0x5f, 0xf6, 0x0a,
+ 0x83, 0x83, 0xc6, 0x3c, 0x0a, 0x68, 0x2c, 0x1e,
+ 0x96, 0x4b, 0xfa, 0xde, 0x06, 0xfe, 0x1a, 0x73
+//};
+//unsigned int mprivatekey001_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey002.inc b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey002.inc
new file mode 100644
index 0000000..9bb5536
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey002.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : sigrevokedmember002 (revoked in grpX sigrl)
+ */
+
+//unsigned char mprivatekey002_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x77, 0xb7, 0x7d, 0xd1, 0x1c, 0xd3, 0xb5, 0x42,
+ 0x0b, 0x4c, 0xfb, 0x15, 0x97, 0x14, 0x5c, 0x44,
+ 0x24, 0xea, 0x32, 0xc4, 0x8f, 0x36, 0xfd, 0x20,
+ 0x19, 0x5f, 0x68, 0x61, 0x09, 0xf5, 0xd0, 0x78,
+ 0xa9, 0xc4, 0x07, 0x83, 0x02, 0x49, 0xf7, 0x8f,
+ 0x31, 0x3d, 0xb2, 0x0d, 0x91, 0x15, 0xfa, 0x38,
+ 0x76, 0x09, 0xce, 0x7e, 0xc0, 0x4e, 0x16, 0x08,
+ 0x79, 0x8f, 0x8b, 0xe4, 0xc9, 0x11, 0x40, 0x21,
+ 0x41, 0x34, 0x3d, 0x59, 0xc1, 0x65, 0x6d, 0x14,
+ 0x23, 0x82, 0x83, 0x66, 0xef, 0x04, 0x7b, 0xfb,
+ 0x7b, 0x43, 0x87, 0xfe, 0x46, 0xdb, 0x92, 0x97,
+ 0x5f, 0xe4, 0x2e, 0xe4, 0x76, 0x40, 0x50, 0x66,
+ 0xdf, 0x41, 0x0e, 0xe7, 0x5d, 0xa2, 0xd2, 0x17,
+ 0x72, 0xae, 0x43, 0x56, 0x05, 0xee, 0x7d, 0x43,
+ 0xbb, 0x84, 0xbc, 0x28, 0x55, 0x56, 0xaf, 0x0d,
+ 0x71, 0x41, 0x1a, 0x4a, 0x26, 0x63, 0x83, 0x87
+//};
+//unsigned int mprivatekey002_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl.inc b/epid/common-testhelper/testdata/grp_x/sigrl.inc
new file mode 100644
index 0000000..6aba0eb
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl.inc
@@ -0,0 +1,76 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xa6, 0xad, 0xdd, 0xbe, 0x45, 0xcc, 0x88, 0xcc,
+ 0x18, 0x30, 0x68, 0x49, 0x77, 0xfe, 0xc0, 0x4f,
+ 0xf9, 0x27, 0xa9, 0x49, 0x66, 0x03, 0x1a, 0x3c,
+ 0x3c, 0x4f, 0xac, 0xb6, 0x94, 0x2e, 0xd7, 0xb0,
+ 0x01, 0xa3, 0x8c, 0x5e, 0x73, 0x1d, 0x2f, 0x20,
+ 0x86, 0xb7, 0x10, 0xbd, 0x8e, 0x63, 0x5b, 0x41,
+ 0x21, 0x23, 0x8d, 0xac, 0x87, 0xc0, 0x7e, 0x78,
+ 0xb2, 0x11, 0x33, 0x52, 0x50, 0xa7, 0x6f, 0x7a,
+ 0x09, 0x95, 0x63, 0x1b, 0x04, 0xce, 0x6b, 0x93,
+ 0x47, 0xa2, 0xb0, 0x1f, 0x2c, 0x89, 0x1c, 0xd7,
+ 0xaa, 0xd6, 0x88, 0xbd, 0xd5, 0x45, 0x6f, 0x06,
+ 0x2b, 0xcc, 0x3e, 0x02, 0x4f, 0xeb, 0xef, 0x9d,
+ 0xb2, 0xf9, 0x71, 0xea, 0xca, 0x8c, 0x9c, 0x00,
+ 0xcd, 0x7e, 0x1c, 0x15, 0x7d, 0x69, 0xe8, 0x52,
+ 0x03, 0x81, 0xc4, 0x31, 0x2e, 0x8f, 0x0d, 0x31,
+ 0xef, 0x18, 0x03, 0x37, 0x0f, 0xa3, 0x19, 0x7b,
+ 0x19, 0x6a, 0x11, 0x7c, 0xfb, 0x88, 0xd3, 0x08,
+ 0x17, 0x98, 0x9d, 0xd6, 0x5a, 0x87, 0xd3, 0xe8,
+ 0x69, 0x3f, 0x6c, 0x8b, 0xd8, 0xd4, 0x6c, 0x11,
+ 0x17, 0x2b, 0xae, 0xf2, 0x8d, 0xa4, 0x35, 0x55,
+ 0x32, 0x9e, 0x85, 0x6a, 0xc2, 0x9e, 0xee, 0x5b,
+ 0xcd, 0x23, 0x7a, 0x11, 0xa7, 0xdd, 0xde, 0xb2,
+ 0xd1, 0xc6, 0xb8, 0x02, 0x93, 0xdb, 0x1e, 0x69,
+ 0x99, 0x6d, 0xc6, 0x2f, 0x98, 0xab, 0x26, 0x89,
+ 0x02, 0x83, 0xfa, 0xa6, 0x65, 0xe9, 0xc6, 0x9f,
+ 0xf7, 0xc9, 0x7b, 0xda, 0x73, 0x1c, 0x60, 0x11,
+ 0x32, 0x85, 0x17, 0x49, 0xca, 0x0b, 0x96, 0x0c,
+ 0x47, 0x0d, 0xef, 0x94, 0x9c, 0x15, 0x05, 0xbe,
+ 0x4b, 0xed, 0xd6, 0xee, 0x7b, 0xbb, 0x14, 0x23,
+ 0x54, 0x31, 0x04, 0xf0, 0x81, 0x04, 0x44, 0xd2,
+ 0x02, 0x33, 0x60, 0xba, 0x5f, 0x4f, 0xae, 0x1f,
+ 0x2d, 0xce, 0xbb, 0xff, 0xe8, 0x55, 0xc7, 0xa8,
+ 0xa6, 0x50, 0xbe, 0xa7, 0xfb, 0x41, 0x9d, 0xf8,
+ 0x41, 0x9c, 0xdd, 0x92, 0x47, 0x9f, 0x6f, 0xf3,
+ 0x56, 0x25, 0x0e, 0xbc, 0xa0, 0x89, 0xf2, 0x7f,
+ 0x12, 0x45, 0x5b, 0xb4, 0xd6, 0xa5, 0xb5, 0x71,
+ 0x31, 0x70, 0xae, 0xaf, 0x65, 0x55, 0x0e, 0xa9,
+ 0x1a, 0x5d, 0xc0, 0x1f, 0x20, 0x71, 0x07, 0xce,
+ 0x3e, 0x5e, 0xd3, 0xee, 0x5b, 0x4c, 0x67, 0x21,
+ 0x64, 0x0c, 0x5c, 0x1c, 0xd3, 0x2d, 0x24, 0xc4,
+ 0xf8, 0xad, 0x31, 0x02, 0xc5, 0xb0, 0x45, 0xe8,
+ 0x60, 0xd2, 0x50, 0xf4, 0xd1, 0xd6, 0x2b, 0x85,
+ 0x53, 0xac, 0x73, 0x96, 0x98, 0xf9, 0x1b, 0x5e,
+ 0xb8, 0x0f, 0xa1, 0xd3, 0xba, 0x6e, 0x43, 0x92,
+ 0x31, 0x69, 0x82, 0x14, 0x4a, 0xff, 0x36, 0x44,
+ 0x58, 0xf6, 0x41, 0xe3, 0x46, 0x85, 0x83, 0x05,
+ 0x96, 0x87, 0x7c, 0x0c, 0x0b, 0x70, 0x24, 0x8e,
+ 0x42, 0xb0, 0xd5, 0x9e, 0x7f, 0xcb, 0x26, 0xe8
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc
new file mode 100644
index 0000000..3ca0386
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc
@@ -0,0 +1,77 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha256_bsn0_msg0 first entry
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59,
+ 0x19, 0x6a, 0x11, 0x7c, 0xfb, 0x88, 0xd3, 0x08,
+ 0x17, 0x98, 0x9d, 0xd6, 0x5a, 0x87, 0xd3, 0xe8,
+ 0x69, 0x3f, 0x6c, 0x8b, 0xd8, 0xd4, 0x6c, 0x11,
+ 0x17, 0x2b, 0xae, 0xf2, 0x8d, 0xa4, 0x35, 0x55,
+ 0x32, 0x9e, 0x85, 0x6a, 0xc2, 0x9e, 0xee, 0x5b,
+ 0xcd, 0x23, 0x7a, 0x11, 0xa7, 0xdd, 0xde, 0xb2,
+ 0xd1, 0xc6, 0xb8, 0x02, 0x93, 0xdb, 0x1e, 0x69,
+ 0x99, 0x6d, 0xc6, 0x2f, 0x98, 0xab, 0x26, 0x89,
+ 0x02, 0x83, 0xfa, 0xa6, 0x65, 0xe9, 0xc6, 0x9f,
+ 0xf7, 0xc9, 0x7b, 0xda, 0x73, 0x1c, 0x60, 0x11,
+ 0x32, 0x85, 0x17, 0x49, 0xca, 0x0b, 0x96, 0x0c,
+ 0x47, 0x0d, 0xef, 0x94, 0x9c, 0x15, 0x05, 0xbe,
+ 0x4b, 0xed, 0xd6, 0xee, 0x7b, 0xbb, 0x14, 0x23,
+ 0x54, 0x31, 0x04, 0xf0, 0x81, 0x04, 0x44, 0xd2,
+ 0x02, 0x33, 0x60, 0xba, 0x5f, 0x4f, 0xae, 0x1f,
+ 0x2d, 0xce, 0xbb, 0xff, 0xe8, 0x55, 0xc7, 0xa8,
+ 0xa6, 0x50, 0xbe, 0xa7, 0xfb, 0x41, 0x9d, 0xf8,
+ 0x41, 0x9c, 0xdd, 0x92, 0x47, 0x9f, 0x6f, 0xf3,
+ 0x56, 0x25, 0x0e, 0xbc, 0xa0, 0x89, 0xf2, 0x7f,
+ 0x12, 0x45, 0x5b, 0xb4, 0xd6, 0xa5, 0xb5, 0x71,
+ 0x31, 0x70, 0xae, 0xaf, 0x65, 0x55, 0x0e, 0xa9,
+ 0x1a, 0x5d, 0xc0, 0x1f, 0x20, 0x71, 0x07, 0xce,
+ 0x3e, 0x5e, 0xd3, 0xee, 0x5b, 0x4c, 0x67, 0x21,
+ 0x64, 0x0c, 0x5c, 0x1c, 0xd3, 0x2d, 0x24, 0xc4,
+ 0xf8, 0xad, 0x31, 0x02, 0xc5, 0xb0, 0x45, 0xe8,
+ 0x60, 0xd2, 0x50, 0xf4, 0xd1, 0xd6, 0x2b, 0x85,
+ 0x53, 0xac, 0x73, 0x96, 0x98, 0xf9, 0x1b, 0x5e,
+ 0xb8, 0x0f, 0xa1, 0xd3, 0xba, 0x6e, 0x43, 0x92,
+ 0x31, 0x69, 0x82, 0x14, 0x4a, 0xff, 0x36, 0x44,
+ 0x58, 0xf6, 0x41, 0xe3, 0x46, 0x85, 0x83, 0x05,
+ 0x96, 0x87, 0x7c, 0x0c, 0x0b, 0x70, 0x24, 0x8e,
+ 0x42, 0xb0, 0xd5, 0x9e, 0x7f, 0xcb, 0x26, 0xe8
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc
new file mode 100644
index 0000000..f92cde6
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc
@@ -0,0 +1,77 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha256_bsn0_msg0 last entry
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xa6, 0xad, 0xdd, 0xbe, 0x45, 0xcc, 0x88, 0xcc,
+ 0x18, 0x30, 0x68, 0x49, 0x77, 0xfe, 0xc0, 0x4f,
+ 0xf9, 0x27, 0xa9, 0x49, 0x66, 0x03, 0x1a, 0x3c,
+ 0x3c, 0x4f, 0xac, 0xb6, 0x94, 0x2e, 0xd7, 0xb0,
+ 0x01, 0xa3, 0x8c, 0x5e, 0x73, 0x1d, 0x2f, 0x20,
+ 0x86, 0xb7, 0x10, 0xbd, 0x8e, 0x63, 0x5b, 0x41,
+ 0x21, 0x23, 0x8d, 0xac, 0x87, 0xc0, 0x7e, 0x78,
+ 0xb2, 0x11, 0x33, 0x52, 0x50, 0xa7, 0x6f, 0x7a,
+ 0x09, 0x95, 0x63, 0x1b, 0x04, 0xce, 0x6b, 0x93,
+ 0x47, 0xa2, 0xb0, 0x1f, 0x2c, 0x89, 0x1c, 0xd7,
+ 0xaa, 0xd6, 0x88, 0xbd, 0xd5, 0x45, 0x6f, 0x06,
+ 0x2b, 0xcc, 0x3e, 0x02, 0x4f, 0xeb, 0xef, 0x9d,
+ 0xb2, 0xf9, 0x71, 0xea, 0xca, 0x8c, 0x9c, 0x00,
+ 0xcd, 0x7e, 0x1c, 0x15, 0x7d, 0x69, 0xe8, 0x52,
+ 0x03, 0x81, 0xc4, 0x31, 0x2e, 0x8f, 0x0d, 0x31,
+ 0xef, 0x18, 0x03, 0x37, 0x0f, 0xa3, 0x19, 0x7b,
+ 0x19, 0x6a, 0x11, 0x7c, 0xfb, 0x88, 0xd3, 0x08,
+ 0x17, 0x98, 0x9d, 0xd6, 0x5a, 0x87, 0xd3, 0xe8,
+ 0x69, 0x3f, 0x6c, 0x8b, 0xd8, 0xd4, 0x6c, 0x11,
+ 0x17, 0x2b, 0xae, 0xf2, 0x8d, 0xa4, 0x35, 0x55,
+ 0x32, 0x9e, 0x85, 0x6a, 0xc2, 0x9e, 0xee, 0x5b,
+ 0xcd, 0x23, 0x7a, 0x11, 0xa7, 0xdd, 0xde, 0xb2,
+ 0xd1, 0xc6, 0xb8, 0x02, 0x93, 0xdb, 0x1e, 0x69,
+ 0x99, 0x6d, 0xc6, 0x2f, 0x98, 0xab, 0x26, 0x89,
+ 0x02, 0x83, 0xfa, 0xa6, 0x65, 0xe9, 0xc6, 0x9f,
+ 0xf7, 0xc9, 0x7b, 0xda, 0x73, 0x1c, 0x60, 0x11,
+ 0x32, 0x85, 0x17, 0x49, 0xca, 0x0b, 0x96, 0x0c,
+ 0x47, 0x0d, 0xef, 0x94, 0x9c, 0x15, 0x05, 0xbe,
+ 0x4b, 0xed, 0xd6, 0xee, 0x7b, 0xbb, 0x14, 0x23,
+ 0x54, 0x31, 0x04, 0xf0, 0x81, 0x04, 0x44, 0xd2,
+ 0x02, 0x33, 0x60, 0xba, 0x5f, 0x4f, 0xae, 0x1f,
+ 0x2d, 0xce, 0xbb, 0xff, 0xe8, 0x55, 0xc7, 0xa8,
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc
new file mode 100644
index 0000000..ecd9138
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc
@@ -0,0 +1,77 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha256_bsn0_msg0 middle entry
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xa6, 0xad, 0xdd, 0xbe, 0x45, 0xcc, 0x88, 0xcc,
+ 0x18, 0x30, 0x68, 0x49, 0x77, 0xfe, 0xc0, 0x4f,
+ 0xf9, 0x27, 0xa9, 0x49, 0x66, 0x03, 0x1a, 0x3c,
+ 0x3c, 0x4f, 0xac, 0xb6, 0x94, 0x2e, 0xd7, 0xb0,
+ 0x01, 0xa3, 0x8c, 0x5e, 0x73, 0x1d, 0x2f, 0x20,
+ 0x86, 0xb7, 0x10, 0xbd, 0x8e, 0x63, 0x5b, 0x41,
+ 0x21, 0x23, 0x8d, 0xac, 0x87, 0xc0, 0x7e, 0x78,
+ 0xb2, 0x11, 0x33, 0x52, 0x50, 0xa7, 0x6f, 0x7a,
+ 0x09, 0x95, 0x63, 0x1b, 0x04, 0xce, 0x6b, 0x93,
+ 0x47, 0xa2, 0xb0, 0x1f, 0x2c, 0x89, 0x1c, 0xd7,
+ 0xaa, 0xd6, 0x88, 0xbd, 0xd5, 0x45, 0x6f, 0x06,
+ 0x2b, 0xcc, 0x3e, 0x02, 0x4f, 0xeb, 0xef, 0x9d,
+ 0xb2, 0xf9, 0x71, 0xea, 0xca, 0x8c, 0x9c, 0x00,
+ 0xcd, 0x7e, 0x1c, 0x15, 0x7d, 0x69, 0xe8, 0x52,
+ 0x03, 0x81, 0xc4, 0x31, 0x2e, 0x8f, 0x0d, 0x31,
+ 0xef, 0x18, 0x03, 0x37, 0x0f, 0xa3, 0x19, 0x7b,
+ 0x19, 0x6a, 0x11, 0x7c, 0xfb, 0x88, 0xd3, 0x08,
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59,
+ 0x41, 0x9c, 0xdd, 0x92, 0x47, 0x9f, 0x6f, 0xf3,
+ 0x56, 0x25, 0x0e, 0xbc, 0xa0, 0x89, 0xf2, 0x7f,
+ 0x12, 0x45, 0x5b, 0xb4, 0xd6, 0xa5, 0xb5, 0x71,
+ 0x31, 0x70, 0xae, 0xaf, 0x65, 0x55, 0x0e, 0xa9,
+ 0x1a, 0x5d, 0xc0, 0x1f, 0x20, 0x71, 0x07, 0xce,
+ 0x3e, 0x5e, 0xd3, 0xee, 0x5b, 0x4c, 0x67, 0x21,
+ 0x64, 0x0c, 0x5c, 0x1c, 0xd3, 0x2d, 0x24, 0xc4,
+ 0xf8, 0xad, 0x31, 0x02, 0xc5, 0xb0, 0x45, 0xe8,
+ 0x60, 0xd2, 0x50, 0xf4, 0xd1, 0xd6, 0x2b, 0x85,
+ 0x53, 0xac, 0x73, 0x96, 0x98, 0xf9, 0x1b, 0x5e,
+ 0xb8, 0x0f, 0xa1, 0xd3, 0xba, 0x6e, 0x43, 0x92,
+ 0x31, 0x69, 0x82, 0x14, 0x4a, 0xff, 0x36, 0x44,
+ 0x58, 0xf6, 0x41, 0xe3, 0x46, 0x85, 0x83, 0x05,
+ 0x96, 0x87, 0x7c, 0x0c, 0x0b, 0x70, 0x24, 0x8e,
+ 0x42, 0xb0, 0xd5, 0x9e, 0x7f, 0xcb, 0x26, 0xe8
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc
new file mode 100644
index 0000000..9899c2b
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc
@@ -0,0 +1,77 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha512_rndbase_msg0 middle entry
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x87, 0xe2, 0xb2, 0x6d, 0x2e, 0x6f, 0xd0, 0x1d,
+ 0x1f, 0x53, 0x11, 0xdb, 0x8f, 0x2c, 0x7f, 0x07,
+ 0xd2, 0x8b, 0x04, 0x00, 0x72, 0xae, 0x07, 0x40,
+ 0x95, 0x94, 0xc2, 0x7d, 0x25, 0x28, 0xd3, 0x3a,
+ 0x00, 0x4b, 0xa7, 0x92, 0x76, 0x3d, 0xd8, 0x51,
+ 0x32, 0x2d, 0x7b, 0x2e, 0x9d, 0x93, 0xd3, 0xfe,
+ 0x75, 0x3c, 0xf5, 0xc0, 0xbf, 0x69, 0xed, 0xc5,
+ 0xfa, 0x26, 0x5e, 0x4a, 0x6d, 0xea, 0x7d, 0xac,
+ 0x17, 0xe8, 0x8d, 0x5f, 0xcf, 0xeb, 0x35, 0x51,
+ 0x55, 0x1c, 0x41, 0x7e, 0xc9, 0x67, 0x0d, 0x87,
+ 0x25, 0x7d, 0xaa, 0x75, 0xc5, 0x2b, 0x86, 0x69,
+ 0xa3, 0x67, 0xf2, 0x95, 0x9c, 0xdb, 0x22, 0xb1,
+ 0x04, 0x0c, 0x8a, 0xae, 0x4f, 0xb3, 0xdd, 0x9b,
+ 0xb1, 0x6e, 0x79, 0x5f, 0x8f, 0xeb, 0x4a, 0x94,
+ 0x9e, 0x95, 0xf4, 0xbb, 0xb6, 0x1c, 0xe6, 0xbb,
+ 0x9c, 0x34, 0xc7, 0xa0, 0x61, 0x14, 0x3d, 0xfb,
+ 0x43, 0xa4, 0x74, 0x4b, 0xcb, 0x17, 0xfa, 0xaf,
+ 0xb8, 0x6e, 0xb4, 0xca, 0x94, 0x4d, 0xe8, 0x5b,
+ 0x40, 0x88, 0x6c, 0x9c, 0xfa, 0xba, 0x4a, 0x4c,
+ 0x65, 0x94, 0xd1, 0x17, 0x90, 0x5b, 0x66, 0x12,
+ 0x46, 0xcf, 0xcc, 0x6e, 0x47, 0x2c, 0x0c, 0xa7,
+ 0x4e, 0xb4, 0x62, 0x57, 0xdc, 0x70, 0xbb, 0xd0,
+ 0x52, 0xa7, 0x38, 0x97, 0xec, 0x34, 0x8c, 0xfd,
+ 0xe6, 0x5f, 0xa1, 0x8b, 0x8a, 0x1e, 0x0c, 0x41,
+ 0xa9, 0x86, 0x53, 0x85, 0x0e, 0xaa, 0xc2, 0x1d,
+ 0xe9, 0x42, 0x18, 0x2e, 0x1f, 0xca, 0xa0, 0x41,
+ 0x46, 0x04, 0x10, 0xb9, 0xc7, 0x15, 0x88, 0x41,
+ 0x92, 0x53, 0x7b, 0xb0, 0xc2, 0xf1, 0x96, 0x8f,
+ 0xc8, 0xe7, 0x4a, 0x43, 0x0a, 0xa2, 0x92, 0x08,
+ 0xd3, 0xdb, 0x09, 0xae, 0x31, 0x6c, 0xef, 0x9f,
+ 0xb7, 0x58, 0x4b, 0x41, 0x69, 0xf7, 0x5b, 0xbc,
+ 0x62, 0x3b, 0xa9, 0x9f, 0x4b, 0xcb, 0x17, 0x6f,
+ 0x6d, 0x5c, 0x55, 0x4b, 0xc8, 0xa4, 0x51, 0xb1,
+ 0xf3, 0xae, 0x18, 0x68, 0xaf, 0x45, 0x91, 0xe4,
+ 0x03, 0x96, 0x8c, 0x71, 0x2d, 0x7e, 0xe5, 0x96,
+ 0x03, 0x68, 0x4d, 0xc3, 0xb8, 0x59, 0x12, 0x41,
+ 0x57, 0xed, 0xcf, 0x41, 0xe4, 0xad, 0xf4, 0xcb,
+ 0x32, 0x38, 0x4c, 0x71, 0x8b, 0xa6, 0x5a, 0x4f,
+ 0x9c, 0xb7, 0x0e, 0x3c, 0x23, 0x82, 0x88, 0x95,
+ 0xc0, 0x5a, 0x5a, 0x28, 0xbe, 0xcd, 0xdc, 0xef,
+ 0x35, 0xd5, 0x83, 0x3f, 0x36, 0x88, 0x0f, 0xea,
+ 0x6e, 0x97, 0xab, 0xe2, 0x6f, 0x56, 0x67, 0x50,
+ 0x89, 0x9d, 0x40, 0xc3, 0xd9, 0x90, 0x04, 0x67,
+ 0xef, 0x1a, 0x38, 0x5d, 0xb6, 0xe4, 0xcb, 0xf1,
+ 0xf1, 0x22, 0x98, 0xb6, 0x5e, 0x4a, 0xdd, 0x71,
+ 0xb8, 0x98, 0xa6, 0x37, 0xfe, 0xd3, 0xdc, 0x0c,
+ 0x82, 0xb6, 0x6b, 0xed, 0x8b, 0x07, 0xbd, 0x0d,
+ 0xa3, 0x6b, 0x41, 0x9c, 0x26, 0xd0, 0xe5, 0xf9
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc b/epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc
new file mode 100644
index 0000000..95a6f0d
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ * Revoked signature : Member0/sig_sha256_bsn0_msg0
+ */
+//unsigned char sigrl_empty_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x81, 0xa5, 0xa5, 0x8f, 0xe6, 0x4e, 0x18, 0x04,
+ 0x05, 0x46, 0xa1, 0x30, 0x84, 0xde, 0x4f, 0x09,
+ 0x36, 0x5f, 0x59, 0xbe, 0xc0, 0x4f, 0x4f, 0xbc,
+ 0xde, 0xd1, 0xd1, 0x11, 0x11, 0x07, 0x7a, 0x2d,
+ 0x89, 0x9c, 0x1b, 0x21, 0x34, 0xeb, 0x84, 0xc4,
+ 0x2c, 0x82, 0x63, 0xce, 0x98, 0x30, 0x22, 0xee,
+ 0x2c, 0xec, 0x90, 0x95, 0x66, 0x94, 0x74, 0xf5,
+ 0xef, 0xff, 0x74, 0xfa, 0xad, 0x61, 0x6f, 0x59
+//};
+//unsigned int sigrl_empty_dat_len = 152;
diff --git a/epid/common-testhelper/testdata/grp_x/sigrl_ver_2.inc b/epid/common-testhelper/testdata/grp_x/sigrl_ver_2.inc
new file mode 100644
index 0000000..d722684
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/sigrl_ver_2.inc
@@ -0,0 +1,76 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : grpX
+ */
+//unsigned char sigrl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
+ 0xa6, 0xad, 0xdd, 0xbe, 0x45, 0xcc, 0x88, 0xcc,
+ 0x18, 0x30, 0x68, 0x49, 0x77, 0xfe, 0xc0, 0x4f,
+ 0xf9, 0x27, 0xa9, 0x49, 0x66, 0x03, 0x1a, 0x3c,
+ 0x3c, 0x4f, 0xac, 0xb6, 0x94, 0x2e, 0xd7, 0xb0,
+ 0x01, 0xa3, 0x8c, 0x5e, 0x73, 0x1d, 0x2f, 0x20,
+ 0x86, 0xb7, 0x10, 0xbd, 0x8e, 0x63, 0x5b, 0x41,
+ 0x21, 0x23, 0x8d, 0xac, 0x87, 0xc0, 0x7e, 0x78,
+ 0xb2, 0x11, 0x33, 0x52, 0x50, 0xa7, 0x6f, 0x7a,
+ 0x09, 0x95, 0x63, 0x1b, 0x04, 0xce, 0x6b, 0x93,
+ 0x47, 0xa2, 0xb0, 0x1f, 0x2c, 0x89, 0x1c, 0xd7,
+ 0xaa, 0xd6, 0x88, 0xbd, 0xd5, 0x45, 0x6f, 0x06,
+ 0x2b, 0xcc, 0x3e, 0x02, 0x4f, 0xeb, 0xef, 0x9d,
+ 0xb2, 0xf9, 0x71, 0xea, 0xca, 0x8c, 0x9c, 0x00,
+ 0xcd, 0x7e, 0x1c, 0x15, 0x7d, 0x69, 0xe8, 0x52,
+ 0x03, 0x81, 0xc4, 0x31, 0x2e, 0x8f, 0x0d, 0x31,
+ 0xef, 0x18, 0x03, 0x37, 0x0f, 0xa3, 0x19, 0x7b,
+ 0x19, 0x6a, 0x11, 0x7c, 0xfb, 0x88, 0xd3, 0x08,
+ 0x17, 0x98, 0x9d, 0xd6, 0x5a, 0x87, 0xd3, 0xe8,
+ 0x69, 0x3f, 0x6c, 0x8b, 0xd8, 0xd4, 0x6c, 0x11,
+ 0x17, 0x2b, 0xae, 0xf2, 0x8d, 0xa4, 0x35, 0x55,
+ 0x32, 0x9e, 0x85, 0x6a, 0xc2, 0x9e, 0xee, 0x5b,
+ 0xcd, 0x23, 0x7a, 0x11, 0xa7, 0xdd, 0xde, 0xb2,
+ 0xd1, 0xc6, 0xb8, 0x02, 0x93, 0xdb, 0x1e, 0x69,
+ 0x99, 0x6d, 0xc6, 0x2f, 0x98, 0xab, 0x26, 0x89,
+ 0x02, 0x83, 0xfa, 0xa6, 0x65, 0xe9, 0xc6, 0x9f,
+ 0xf7, 0xc9, 0x7b, 0xda, 0x73, 0x1c, 0x60, 0x11,
+ 0x32, 0x85, 0x17, 0x49, 0xca, 0x0b, 0x96, 0x0c,
+ 0x47, 0x0d, 0xef, 0x94, 0x9c, 0x15, 0x05, 0xbe,
+ 0x4b, 0xed, 0xd6, 0xee, 0x7b, 0xbb, 0x14, 0x23,
+ 0x54, 0x31, 0x04, 0xf0, 0x81, 0x04, 0x44, 0xd2,
+ 0x02, 0x33, 0x60, 0xba, 0x5f, 0x4f, 0xae, 0x1f,
+ 0x2d, 0xce, 0xbb, 0xff, 0xe8, 0x55, 0xc7, 0xa8,
+ 0xa6, 0x50, 0xbe, 0xa7, 0xfb, 0x41, 0x9d, 0xf8,
+ 0x41, 0x9c, 0xdd, 0x92, 0x47, 0x9f, 0x6f, 0xf3,
+ 0x56, 0x25, 0x0e, 0xbc, 0xa0, 0x89, 0xf2, 0x7f,
+ 0x12, 0x45, 0x5b, 0xb4, 0xd6, 0xa5, 0xb5, 0x71,
+ 0x31, 0x70, 0xae, 0xaf, 0x65, 0x55, 0x0e, 0xa9,
+ 0x1a, 0x5d, 0xc0, 0x1f, 0x20, 0x71, 0x07, 0xce,
+ 0x3e, 0x5e, 0xd3, 0xee, 0x5b, 0x4c, 0x67, 0x21,
+ 0x64, 0x0c, 0x5c, 0x1c, 0xd3, 0x2d, 0x24, 0xc4,
+ 0xf8, 0xad, 0x31, 0x02, 0xc5, 0xb0, 0x45, 0xe8,
+ 0x60, 0xd2, 0x50, 0xf4, 0xd1, 0xd6, 0x2b, 0x85,
+ 0x53, 0xac, 0x73, 0x96, 0x98, 0xf9, 0x1b, 0x5e,
+ 0xb8, 0x0f, 0xa1, 0xd3, 0xba, 0x6e, 0x43, 0x92,
+ 0x31, 0x69, 0x82, 0x14, 0x4a, 0xff, 0x36, 0x44,
+ 0x58, 0xf6, 0x41, 0xe3, 0x46, 0x85, 0x83, 0x05,
+ 0x96, 0x87, 0x7c, 0x0c, 0x0b, 0x70, 0x24, 0x8e,
+ 0x42, 0xb0, 0xd5, 0x9e, 0x7f, 0xcb, 0x26, 0xe8
+//};
+//unsigned int sigrl_dat_len = 408;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey000.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey000.inc
new file mode 100644
index 0000000..4dc89ff
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey000.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember000 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey000_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x91, 0xd6, 0xcd, 0x65, 0x09, 0xbc, 0x30, 0x13,
+ 0x43, 0x50, 0x09, 0x25, 0x1c, 0x05, 0x66, 0x77,
+ 0xb0, 0x69, 0x38, 0x5b, 0x61, 0x49, 0x25, 0xec,
+ 0xf3, 0xa0, 0x00, 0x4b, 0xcb, 0xc9, 0xa3, 0x58,
+ 0xee, 0x72, 0xb6, 0x75, 0xf6, 0x79, 0xb8, 0xf1,
+ 0x8e, 0x1f, 0xe8, 0x8b, 0xf7, 0x1b, 0x84, 0xf9,
+ 0xd0, 0x27, 0x28, 0x8b, 0xf6, 0x2a, 0xe2, 0xf0,
+ 0xd9, 0xb7, 0xf7, 0xdf, 0x8d, 0x65, 0x75, 0xee,
+ 0xc8, 0xa3, 0xf2, 0xcd, 0xc3, 0x26, 0x5a, 0x13,
+ 0xf8, 0xa5, 0x39, 0x57, 0x44, 0x57, 0xb7, 0x96,
+ 0x2e, 0x5c, 0x3a, 0x7a, 0xe6, 0x38, 0x5a, 0x99,
+ 0xec, 0xe3, 0x4b, 0x6c, 0x77, 0x7a, 0x14, 0x8b,
+ 0xb2, 0x17, 0x61, 0x7d, 0x51, 0x64, 0xf6, 0xa4,
+ 0xbc, 0x97, 0xcd, 0x67, 0xde, 0x98, 0xce, 0xee,
+ 0x8d, 0x5e, 0x78, 0x84, 0x77, 0x9b, 0x99, 0x84,
+ 0x01, 0x9f, 0x66, 0x7c, 0xd4, 0x67, 0x81, 0x48
+//};
+//unsigned int mprivkey000_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey001.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey001.inc
new file mode 100644
index 0000000..c42eaad
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey001.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember001 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey001_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x2e, 0xcb, 0xb7, 0x36, 0x9b, 0x2b, 0x8d, 0xd1,
+ 0x03, 0x25, 0xd8, 0xe7, 0x57, 0x21, 0xac, 0x47,
+ 0x60, 0xe3, 0x1d, 0xb5, 0x78, 0xfa, 0x6d, 0x8c,
+ 0x00, 0x7d, 0x95, 0x91, 0x64, 0x31, 0xb6, 0x7d,
+ 0xdb, 0x18, 0x3a, 0x11, 0x99, 0x22, 0x93, 0x93,
+ 0x57, 0x8d, 0x9b, 0x23, 0x1d, 0x65, 0xa2, 0x78,
+ 0x18, 0xa0, 0xf4, 0x99, 0x1b, 0x67, 0xe2, 0xc7,
+ 0x4a, 0xb1, 0xfc, 0xa6, 0xdd, 0xae, 0x05, 0x20,
+ 0x3b, 0x26, 0xd9, 0xc6, 0x41, 0x2f, 0x38, 0x64,
+ 0xb4, 0xd7, 0x7b, 0xf3, 0x86, 0x01, 0x33, 0xc1,
+ 0x5f, 0x22, 0x30, 0xeb, 0x20, 0x94, 0x76, 0xad,
+ 0xb1, 0x15, 0xc3, 0xe0, 0x1c, 0xfe, 0x8d, 0x61,
+ 0x3f, 0xf7, 0xef, 0xfc, 0xcb, 0xfb, 0xeb, 0xa6,
+ 0xf9, 0x31, 0x3b, 0x9f, 0xd4, 0xa7, 0x21, 0x61,
+ 0xaa, 0x98, 0xf4, 0x8d, 0x79, 0x3c, 0xf0, 0x33,
+ 0x04, 0x0c, 0x79, 0x6d, 0x88, 0x02, 0xba, 0x1c
+//};
+//unsigned int mprivkey001_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey002.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey002.inc
new file mode 100644
index 0000000..ef60d52
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/mprivkey002.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember002 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey002_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xab, 0x31, 0xae, 0x14, 0x0c, 0xcf, 0x08, 0x26,
+ 0xfb, 0x6e, 0x67, 0x2c, 0xca, 0x71, 0x49, 0xba,
+ 0x84, 0x53, 0xc7, 0xe6, 0x2b, 0xee, 0xc7, 0xff,
+ 0x3a, 0x1e, 0x7e, 0x63, 0x1d, 0xf7, 0x2e, 0xee,
+ 0xc3, 0xa7, 0xfc, 0x69, 0x69, 0x44, 0x09, 0x5d,
+ 0xf9, 0xf0, 0xf4, 0x27, 0xca, 0x26, 0xe2, 0x3a,
+ 0x85, 0x8c, 0x8f, 0x01, 0x7b, 0xcf, 0xef, 0xac,
+ 0x1c, 0x07, 0x89, 0x0b, 0x41, 0x5f, 0x15, 0x42,
+ 0x9d, 0x62, 0xfc, 0x19, 0x8e, 0xe1, 0xde, 0x1f,
+ 0x37, 0x47, 0xe3, 0xc0, 0x72, 0xff, 0xdb, 0x0c,
+ 0x18, 0x3f, 0x21, 0x6d, 0x8e, 0xb0, 0xfb, 0xb6,
+ 0x6a, 0x15, 0x19, 0xc7, 0x47, 0x88, 0x88, 0x4a,
+ 0x90, 0xdb, 0xd9, 0x11, 0xf1, 0xef, 0x1a, 0x68,
+ 0x8d, 0x1c, 0x07, 0xfe, 0x04, 0xbd, 0xf2, 0x6c,
+ 0x8b, 0x1b, 0xd0, 0x7f, 0x96, 0x9a, 0x90, 0xed,
+ 0x34, 0x0c, 0x13, 0x6d, 0x7c, 0x0c, 0x32, 0x58
+//};
+//unsigned int mprivkey002_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc
new file mode 100644
index 0000000..338a3b8
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc
@@ -0,0 +1,136 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey000
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+
+//unsigned char sig_revoked0msg0bsn0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2,
+ 0x73, 0x96, 0xfa, 0xd6, 0xf8, 0xfa, 0x2c, 0x39,
+ 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3,
+ 0x74, 0x90, 0xf2, 0xf5, 0x50, 0xe4, 0x69, 0x5d,
+ 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a,
+ 0x70, 0x75, 0x91, 0x2d, 0xbd, 0x56, 0x9f, 0x18,
+ 0x65, 0x25, 0x5f, 0x3a, 0x15, 0x36, 0x10, 0x91,
+ 0xf9, 0x02, 0x37, 0x30, 0xb1, 0x75, 0x8a, 0x9b,
+ 0xb0, 0x99, 0xc1, 0x28, 0xb7, 0x7b, 0x15, 0x4d,
+ 0xfc, 0x66, 0x4d, 0xe3, 0x3c, 0x37, 0x57, 0xf2,
+ 0x64, 0xbb, 0x24, 0xe4, 0xfc, 0xbd, 0x56, 0x7a,
+ 0x3f, 0x3a, 0xa5, 0xcb, 0x66, 0xd3, 0xd2, 0x9f,
+ 0xe2, 0x51, 0x4b, 0xa8, 0x5d, 0x8f, 0x79, 0x38,
+ 0xa1, 0x25, 0xe4, 0x3c, 0xc0, 0xa5, 0x4e, 0x83,
+ 0xd5, 0x0a, 0x9f, 0xfa, 0x6f, 0x9d, 0xc2, 0x49,
+ 0x35, 0x71, 0x54, 0x2e, 0x62, 0x7b, 0x06, 0xb3,
+ 0x60, 0x57, 0x79, 0x77, 0xf4, 0x0e, 0x91, 0x6f,
+ 0xec, 0x58, 0xdc, 0xb2, 0x80, 0xe3, 0xd3, 0x5b,
+ 0xa7, 0x68, 0x31, 0x18, 0x6f, 0x9e, 0x47, 0x5f,
+ 0x99, 0xc8, 0x85, 0xd2, 0x25, 0xbb, 0x68, 0xb4,
+ 0x8f, 0x4c, 0x21, 0x85, 0x77, 0x2f, 0x62, 0x92,
+ 0xd0, 0xe1, 0x70, 0x5a, 0x02, 0xbc, 0xed, 0x69,
+ 0x46, 0xc0, 0xca, 0x83, 0xcc, 0xe6, 0xb9, 0xff,
+ 0x17, 0x90, 0xb7, 0xc3, 0xbb, 0x86, 0xa5, 0x41,
+ 0x55, 0x25, 0xcb, 0x3d, 0x18, 0x6e, 0x60, 0xaf,
+ 0x52, 0x70, 0xfc, 0xe5, 0x55, 0xfc, 0x7d, 0x8e,
+ 0xf2, 0x5b, 0xa1, 0x1c, 0xc2, 0x34, 0x31, 0x77,
+ 0xbc, 0x9d, 0x23, 0xc5, 0xbb, 0x01, 0xf0, 0x2b,
+ 0xa7, 0xaf, 0x52, 0xaa, 0x9a, 0xd9, 0x74, 0x58,
+ 0x96, 0x87, 0x54, 0x6c, 0xb6, 0x93, 0x0c, 0x9a,
+ 0x8f, 0x0f, 0xb6, 0x0e, 0x89, 0xb6, 0xb9, 0x0b,
+ 0xd3, 0x5c, 0xe4, 0x83, 0xad, 0x1c, 0x79, 0x7c,
+ 0x12, 0x36, 0x0d, 0xe2, 0xa7, 0xab, 0xd7, 0xd0,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xc5, 0x3b, 0x02, 0x5f, 0xcd, 0x67, 0x05, 0x99,
+ 0x74, 0x1f, 0x65, 0xa1, 0xdb, 0xee, 0xa2, 0x18,
+ 0x5d, 0xee, 0x82, 0xa9, 0x98, 0xab, 0xa6, 0x92,
+ 0x84, 0xf1, 0x08, 0x98, 0x36, 0x56, 0xe0, 0x63,
+ 0xa0, 0xc0, 0xd2, 0xff, 0xc3, 0x34, 0xc1, 0xc2,
+ 0x87, 0x00, 0x0d, 0x8b, 0x78, 0xc9, 0x68, 0x49,
+ 0xdf, 0xd8, 0xfa, 0xdc, 0x00, 0x80, 0xf7, 0xf4,
+ 0xa7, 0xf8, 0x1c, 0x8c, 0x96, 0xf3, 0x00, 0x3b,
+ 0xcf, 0x06, 0x8f, 0x66, 0x18, 0x68, 0x9b, 0xe6,
+ 0xca, 0x20, 0xe5, 0x5a, 0x4c, 0xf4, 0x87, 0x43,
+ 0xc8, 0xf4, 0x5c, 0x28, 0x8d, 0x35, 0x85, 0x1c,
+ 0xa5, 0x27, 0xd7, 0xcc, 0x8b, 0x7f, 0x96, 0x70,
+ 0xdd, 0xf2, 0x50, 0x60, 0xde, 0x45, 0x83, 0x8c,
+ 0x9b, 0x64, 0xe2, 0xd2, 0x49, 0x46, 0x48, 0xb0,
+ 0x7a, 0x67, 0x32, 0x2b, 0xb6, 0xea, 0xa8, 0x40,
+ 0x8d, 0x08, 0x2f, 0xd7, 0xd7, 0x2a, 0x2b, 0x4a,
+ 0x45, 0x9e, 0x5c, 0x56, 0x8c, 0x50, 0xaa, 0x81,
+ 0x46, 0x18, 0xc8, 0x46, 0x8a, 0x11, 0xf8, 0x89,
+ 0x3e, 0x32, 0x20, 0xb8, 0xf5, 0x7f, 0xc8, 0x25,
+ 0xda, 0xe0, 0x51, 0x39, 0xe9, 0x57, 0x87, 0x26,
+ 0xe9, 0x79, 0x70, 0xce, 0x75, 0x99, 0xe5, 0xab,
+ 0x6e, 0x6f, 0x73, 0xe9, 0xc2, 0x99, 0xc8, 0xb7,
+ 0x30, 0xdc, 0xe3, 0xd8, 0x95, 0x92, 0x4e, 0xb8,
+ 0xac, 0xf3, 0xc1, 0x9c, 0x97, 0x6e, 0xfe, 0x48,
+ 0x5e, 0xff, 0xce, 0x7a, 0x1b, 0x95, 0xb8, 0x90,
+ 0xb9, 0xd5, 0x8d, 0x44, 0xdc, 0x92, 0xf5, 0xf7,
+ 0x91, 0xe5, 0x2f, 0x28, 0x31, 0x7d, 0x21, 0x91,
+ 0x2b, 0xf0, 0x1d, 0x27, 0xd6, 0x46, 0x7a, 0x6d,
+ 0xdc, 0x70, 0x2e, 0x85, 0x55, 0x58, 0x8a, 0xd4,
+ 0xdb, 0x09, 0xea, 0xf7, 0x6a, 0x2c, 0x35, 0xcb,
+ 0xc5, 0xd1, 0x53, 0x07, 0x12, 0xbd, 0x25, 0x5e,
+ 0x05, 0x61, 0x43, 0xb8, 0xb3, 0x87, 0xf1, 0xb8,
+ 0x88, 0x58, 0xaf, 0x47, 0x04, 0x7e, 0x52, 0x6c,
+ 0x6c, 0x04, 0x58, 0xfb, 0x00, 0x67, 0x8f, 0xa5,
+ 0xb2, 0x99, 0x09, 0xed, 0x86, 0xa4, 0x5d, 0xdf,
+ 0x4b, 0xea, 0x4d, 0xa0, 0xb9, 0x1a, 0x4d, 0x98,
+ 0x1f, 0x76, 0x19, 0x84, 0x9c, 0x2a, 0x8e, 0xdb,
+ 0x8b, 0xdb, 0x5c, 0x60, 0xa5, 0x8c, 0x09, 0xea,
+ 0x0d, 0xff, 0x3e, 0x3e, 0x18, 0xf5, 0xa8, 0xf5,
+ 0xa0, 0x82, 0x15, 0xa0, 0xf5, 0x36, 0xc3, 0xb6,
+ 0x72, 0xab, 0x81, 0x8f, 0xae, 0x9c, 0x67, 0x63,
+ 0x49, 0xfe, 0x01, 0x66, 0xd2, 0x53, 0x9c, 0x97,
+ 0x0e, 0x58, 0x1c, 0x6f, 0xb6, 0x49, 0x16, 0x7a,
+ 0x43, 0xfc, 0x61, 0x0d, 0x36, 0x31, 0x28, 0x65,
+ 0x32, 0x62, 0x28, 0x44, 0x50, 0xda, 0xb1, 0x1b,
+ 0x7a, 0xd6, 0x27, 0x69, 0xc0, 0xe9, 0xab, 0x78,
+ 0xda, 0x27, 0xd7, 0x9e, 0x7e, 0x35, 0xcf, 0x8b,
+ 0x09, 0xc7, 0x2f, 0x5f, 0x8d, 0xa4, 0x29, 0xdb,
+ 0x83, 0x62, 0x89, 0x36, 0x86, 0x53, 0xcc, 0xe9,
+ 0x6f, 0xb9, 0x4a, 0x31, 0x9e, 0xf8, 0xa5, 0x7b,
+ 0x2f, 0xb6, 0xff, 0x2a, 0x5f, 0xbe, 0xb1, 0x71,
+ 0x42, 0xc0, 0xf8, 0x36, 0x51, 0xdb, 0xe9, 0x1a,
+ 0xe0, 0xcd, 0xaa, 0xc1, 0x0c, 0x1d, 0x74, 0x4c,
+ 0x00, 0x98, 0x38, 0xbd, 0x70, 0x39, 0xc9, 0xd3,
+ 0xdf, 0x4c, 0xeb, 0xde, 0x19, 0x2f, 0xf8, 0x52,
+ 0x5b, 0x1a, 0x2a, 0x91, 0x50, 0xb8, 0xd3, 0xca,
+ 0x67, 0x2e, 0x4e, 0xaf, 0xa5, 0xce, 0x54, 0xa6,
+ 0x02, 0x34, 0xa5, 0x8b, 0x0b, 0xf8, 0x96, 0x46,
+ 0x04, 0xe2, 0x45, 0xaa, 0xb3, 0x24, 0x99, 0x60,
+ 0x24, 0x42, 0xde, 0x75, 0x91, 0xcf, 0x5b, 0xfb
+//};
+//unsigned int sig_revoked0msg0bsn0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha384bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha384bsn0msg0.inc
new file mode 100644
index 0000000..51cbdfd
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha384bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey000
+ * HashAlg : Sha384
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig000_sha384_dat[] = {
+ 0x57, 0xe7, 0x8f, 0xfb, 0xf9, 0xa3, 0xba, 0x5e, 0xac, 0xec, 0xb3, 0xa4,
+ 0xf4, 0x13, 0x95, 0xa1, 0x1c, 0x1d, 0xe1, 0xaf, 0xea, 0x16, 0xba, 0x6d,
+ 0xde, 0x4c, 0x43, 0xf0, 0x89, 0x59, 0x5e, 0xfa, 0x0f, 0x18, 0xdd, 0x22,
+ 0xf6, 0xd6, 0xfc, 0xe5, 0x0f, 0xb2, 0x81, 0xb5, 0xa9, 0xa6, 0xe8, 0xee,
+ 0x14, 0x04, 0xec, 0x1b, 0x4e, 0x65, 0x82, 0x7f, 0x96, 0x53, 0xc4, 0x3b,
+ 0x29, 0x17, 0x39, 0xc0, 0x9d, 0x3e, 0x8e, 0xd2, 0x45, 0xfd, 0x1b, 0xcd,
+ 0x33, 0x6c, 0xdb, 0x1a, 0xda, 0x34, 0x59, 0x2e, 0x38, 0x72, 0x75, 0x17,
+ 0x25, 0xee, 0xa8, 0x9b, 0xf9, 0xd0, 0x1b, 0x15, 0x82, 0x03, 0x8c, 0x72,
+ 0x5d, 0xb7, 0x3c, 0x7c, 0x7e, 0x17, 0x81, 0x55, 0x52, 0x7d, 0x87, 0x7c,
+ 0x90, 0xd8, 0x17, 0xee, 0x35, 0xdb, 0xe1, 0x67, 0x59, 0xa4, 0xd6, 0xb3,
+ 0x24, 0x54, 0xd2, 0x70, 0x0f, 0xc0, 0x37, 0x39, 0x54, 0xfd, 0xce, 0xff,
+ 0x03, 0x33, 0xe4, 0xe9, 0x3d, 0x5e, 0xef, 0x0c, 0x2b, 0x7b, 0x54, 0xf4,
+ 0x9e, 0x45, 0x45, 0xe3, 0x7b, 0x41, 0xa5, 0x91, 0x68, 0x8a, 0x56, 0xca,
+ 0xdb, 0xb0, 0xb4, 0x2c, 0x62, 0x14, 0x5e, 0x29, 0xf9, 0x54, 0x03, 0xaa,
+ 0xb0, 0xff, 0x60, 0x2a, 0xc1, 0x41, 0xe6, 0x1c, 0xbc, 0xbc, 0x7d, 0xc5,
+ 0x40, 0x67, 0xae, 0x72, 0x81, 0xcb, 0xc7, 0x91, 0xaa, 0x57, 0xb2, 0x78,
+ 0xaf, 0xc2, 0x44, 0x85, 0x56, 0x6d, 0xcc, 0x42, 0x72, 0xdc, 0x0f, 0x6e,
+ 0x85, 0x47, 0xb6, 0x09, 0xa8, 0x7e, 0x10, 0x78, 0xe7, 0x37, 0xfd, 0xbe,
+ 0x9a, 0x80, 0x3b, 0x51, 0x48, 0x58, 0xa4, 0x36, 0xbd, 0x2b, 0xe5, 0xbf,
+ 0x1e, 0x0b, 0x10, 0xf4, 0xc1, 0xf1, 0xf8, 0x4d, 0xb0, 0x99, 0xba, 0xdb,
+ 0xc5, 0x61, 0xd1, 0x0d, 0x8a, 0x37, 0x9d, 0x97, 0x5d, 0x50, 0x26, 0x32,
+ 0x5b, 0x3d, 0x43, 0x11, 0xd7, 0xf1, 0x79, 0xf3, 0xf5, 0x7d, 0xd5, 0xe6,
+ 0xab, 0x60, 0xe5, 0xed, 0x27, 0x8f, 0x9f, 0xd8, 0x7e, 0x79, 0x51, 0x0a,
+ 0x11, 0x56, 0x94, 0x06, 0x49, 0x83, 0x74, 0xbe, 0x08, 0x3e, 0xbe, 0xc7,
+ 0x0b, 0x3e, 0xfe, 0x1b, 0x04, 0x1b, 0xd5, 0x8f, 0xd3, 0xee, 0xcc, 0xcd,
+ 0x13, 0xf3, 0x51, 0xae, 0xcd, 0x61, 0x02, 0x1f, 0x00, 0x00, 0xf9, 0x7d,
+ 0x19, 0xac, 0xee, 0x09, 0x84, 0xf9, 0x9d, 0x67, 0x1b, 0x7b, 0xe6, 0x60,
+ 0x8c, 0xfc, 0xa1, 0x66, 0xc4, 0xbf, 0x01, 0x75, 0x1a, 0x12, 0xfc, 0x9f,
+ 0x92, 0xd9, 0x47, 0x8b, 0x7f, 0x6a, 0x03, 0x93, 0x16, 0x5b, 0x76, 0xf8,
+ 0x62, 0x26, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig000_sha384_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512_256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512_256bsn0msg0.inc
new file mode 100644
index 0000000..916a4a1
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512_256bsn0msg0.inc
@@ -0,0 +1,100 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey000
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+ // unsigned char sig[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2, 0x73, 0x96, 0xfa, 0xd6,
+ 0xf8, 0xfa, 0x2c, 0x39, 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3, 0x74, 0x90, 0xf2, 0xf5,
+ 0x50, 0xe4, 0x69, 0x5d, 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a, 0xec, 0x31, 0x09, 0xa3,
+ 0x2f, 0x9a, 0x3d, 0x87, 0xa0, 0x9c, 0x7a, 0xb6, 0x25, 0x86, 0x47, 0x27,
+ 0x05, 0x14, 0x14, 0x2e, 0x72, 0xcd, 0x61, 0x0e, 0x2f, 0x3c, 0xb2, 0x83,
+ 0xdc, 0x4f, 0x3d, 0x5d, 0xa4, 0xa4, 0xcb, 0x10, 0x73, 0xf2, 0xae, 0x9f,
+ 0xae, 0x22, 0x90, 0x03, 0x69, 0xa4, 0x83, 0xf5, 0xf8, 0xf4, 0x2b, 0x59,
+ 0x50, 0xf3, 0x2a, 0x66, 0xb6, 0x2c, 0x0f, 0x23, 0x96, 0xc2, 0xee, 0x5d,
+ 0x42, 0xdf, 0x5b, 0xbc, 0x31, 0x76, 0xce, 0x8a, 0xce, 0xb0, 0x35, 0x82,
+ 0x79, 0x20, 0xee, 0xe2, 0x45, 0xf9, 0xb3, 0xc5, 0xb2, 0x59, 0xcf, 0x29,
+ 0x67, 0x3c, 0x80, 0xf8, 0x0c, 0xad, 0xe9, 0xdb, 0x26, 0x93, 0x42, 0xdd,
+ 0x9f, 0x41, 0x69, 0xd4, 0x28, 0x77, 0xfd, 0x32, 0xf3, 0x55, 0xcc, 0x10,
+ 0xbc, 0x49, 0xbc, 0xbf, 0xac, 0x87, 0xcb, 0xa0, 0xf3, 0x1a, 0xf4, 0xfd,
+ 0x28, 0xe3, 0x32, 0xee, 0xf1, 0x0c, 0x7a, 0x75, 0x20, 0xcf, 0x44, 0x17,
+ 0xd6, 0x9c, 0x87, 0x2f, 0xe7, 0xad, 0x8a, 0xc6, 0xa1, 0xea, 0x4a, 0x86,
+ 0xe0, 0x3d, 0x6f, 0x7d, 0xd1, 0xd4, 0x08, 0x9f, 0x64, 0x45, 0x7c, 0x35,
+ 0xe6, 0x5c, 0x97, 0x52, 0x58, 0xc4, 0x0a, 0xbc, 0x3c, 0x74, 0x56, 0x2c,
+ 0x2a, 0xc4, 0x4d, 0x29, 0x3d, 0xba, 0x45, 0x35, 0x55, 0x23, 0x05, 0xbf,
+ 0x0b, 0x95, 0xba, 0x06, 0x01, 0x9d, 0x31, 0xb4, 0x47, 0xa0, 0xe5, 0xf4,
+ 0xd1, 0xcd, 0x42, 0x07, 0x92, 0x60, 0x40, 0x15, 0x7d, 0x96, 0xdc, 0x1e,
+ 0xd5, 0x43, 0x85, 0xf3, 0x86, 0x8b, 0x98, 0xc6, 0x24, 0x44, 0x24, 0x77,
+ 0x54, 0x86, 0x03, 0xc4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x4d, 0xef, 0x88, 0xbf, 0xa9, 0x73, 0xfc, 0x06, 0x7e, 0x69, 0xba, 0xcc,
+ 0x30, 0xb5, 0x83, 0x33, 0x3a, 0xdd, 0xa8, 0x36, 0x95, 0x6c, 0xa5, 0x63,
+ 0xe6, 0x88, 0xbe, 0x4f, 0xa8, 0x61, 0xaf, 0x5a, 0x37, 0x48, 0x59, 0x6e,
+ 0xa8, 0x5f, 0x94, 0xc1, 0xae, 0x8d, 0xbf, 0xa2, 0x76, 0xa0, 0x3e, 0xb2,
+ 0x6b, 0x50, 0x6f, 0x84, 0x53, 0xc3, 0xd9, 0x52, 0xfc, 0x8e, 0xcb, 0x94,
+ 0x20, 0x10, 0x88, 0x8d, 0x8f, 0x77, 0xbb, 0x4c, 0xfa, 0x18, 0x2d, 0xa5,
+ 0x3e, 0x72, 0x62, 0x8f, 0x7b, 0x10, 0x99, 0x35, 0xd8, 0x9d, 0x61, 0x34,
+ 0xcd, 0xb7, 0x7f, 0x42, 0xe9, 0xe6, 0xaa, 0x7f, 0x7b, 0x8c, 0x1b, 0xa4,
+ 0xb6, 0xf7, 0xaa, 0x22, 0x2c, 0xd3, 0xff, 0x9b, 0xc0, 0xcf, 0x3e, 0x53,
+ 0xc6, 0x8f, 0x1d, 0x5f, 0x48, 0x4a, 0x6c, 0xec, 0x83, 0x6f, 0xf6, 0x4c,
+ 0xd4, 0xaf, 0x86, 0x50, 0xe2, 0x79, 0xe3, 0x64, 0xbd, 0x9d, 0xd7, 0x7b,
+ 0x83, 0xda, 0x98, 0x49, 0x4f, 0x70, 0xcf, 0xeb, 0xec, 0xa1, 0x3d, 0x40,
+ 0xc9, 0x49, 0x9a, 0x45, 0x00, 0xda, 0x7f, 0x85, 0xc1, 0x2c, 0x32, 0x5d,
+ 0x02, 0xa0, 0x57, 0x44, 0xc7, 0x1c, 0x7b, 0x1b, 0xa3, 0xf0, 0x9c, 0xbc,
+ 0xfd, 0x7d, 0x0c, 0x52, 0xc2, 0x07, 0x83, 0x9b, 0xd0, 0x26, 0x10, 0xec,
+ 0x9f, 0x54, 0x5d, 0xd7, 0x46, 0xb4, 0x2e, 0xe1, 0x76, 0xa1, 0x53, 0x18,
+ 0x06, 0x25, 0x91, 0x0a, 0xb8, 0xc2, 0x61, 0x9d, 0x0f, 0xa9, 0x5c, 0xb9,
+ 0x9d, 0xdd, 0x2b, 0xe3, 0x40, 0xab, 0x45, 0xd0, 0xfe, 0x9b, 0xc2, 0xa2,
+ 0xee, 0x19, 0xa8, 0xbb, 0xf0, 0x2b, 0x63, 0x98, 0x86, 0xc3, 0x2d, 0xbc,
+ 0x6c, 0x24, 0x0e, 0xd4, 0x8f, 0xca, 0x4a, 0xca, 0xa8, 0x83, 0x7f, 0x22,
+ 0x40, 0x54, 0x0f, 0xeb, 0x97, 0xfe, 0x4b, 0x78, 0xd9, 0xc5, 0x3f, 0x79,
+ 0x23, 0x5c, 0xc0, 0xd7, 0x7b, 0x0c, 0xa0, 0xce, 0x54, 0x96, 0x44, 0x81,
+ 0x68, 0xd2, 0x36, 0x5f, 0x56, 0x3d, 0xed, 0xaa, 0xa4, 0xff, 0x59, 0x3a,
+ 0x76, 0x0f, 0x9b, 0x29, 0xa8, 0x9c, 0x58, 0x1a, 0x93, 0x31, 0x3a, 0x9b,
+ 0xd1, 0x9c, 0xf3, 0xd1, 0x83, 0xf0, 0xb2, 0xf5, 0x4a, 0x0a, 0x24, 0xb4,
+ 0x60, 0x76, 0x4a, 0x11, 0x93, 0x24, 0x2e, 0xcb, 0x6d, 0x40, 0x76, 0x7f,
+ 0xb6, 0xd3, 0x1a, 0x12, 0x95, 0x6d, 0x47, 0xad, 0xed, 0xe7, 0x11, 0xce,
+ 0x13, 0x1b, 0x28, 0x5c, 0x45, 0xd1, 0x33, 0x71, 0xe8, 0x68, 0xb1, 0x45,
+ 0xd2, 0x56, 0x5a, 0xe0, 0xde, 0x8c, 0x60, 0x2f, 0x22, 0x29, 0x8f, 0x34,
+ 0x6f, 0xba, 0xf5, 0xb3, 0x00, 0x0f, 0xd9, 0xcb, 0xb5, 0x02, 0x58, 0x1a,
+ 0x27, 0x09, 0x8d, 0x88, 0x6e, 0x60, 0x7e, 0x89, 0x0b, 0x1d, 0xb8, 0x01,
+ 0x1c, 0x82, 0x2f, 0x39, 0x2c, 0x3f, 0xa0, 0x23, 0x72, 0x84, 0xb7, 0xb1,
+ 0x8c, 0x12, 0xd0, 0xfb, 0x4d, 0xff, 0xb9, 0x7f, 0xbc, 0x31, 0x11, 0x57,
+ 0xa0, 0x7e, 0x67, 0x43, 0xd8, 0x6a, 0x2c, 0x25, 0x79, 0x3f, 0x9a, 0x54,
+ 0xeb, 0x6f, 0x4a, 0xb9, 0xc2, 0x45, 0xfd, 0x03, 0x97, 0x14, 0x67, 0xf3,
+ 0x39, 0x08, 0xda, 0x92, 0x08, 0x2b, 0xe2, 0xe3, 0xc2, 0x68, 0x9b, 0x36,
+ 0xaf, 0xf1, 0x16, 0xde, 0x0f, 0x28, 0xd2, 0xc1, 0xeb, 0x2f, 0x99, 0x3c,
+ 0xa5, 0xa1, 0x54, 0x38, 0x25, 0x55, 0x1f, 0x94, 0xf1, 0xbf, 0xcd, 0x60,
+ 0xc0, 0x3b, 0x97, 0xbc, 0x36, 0x20, 0xd1, 0xfe, 0x61, 0xb1, 0x1a, 0x8f,
+ 0x56, 0xe6, 0xdf, 0xdb, 0x06, 0x4f, 0x78, 0xa9, 0xa7, 0xcb, 0x1c, 0x1c
+// };
+// unsigned int sig_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512bsn0msg0.inc
new file mode 100644
index 0000000..e10dc03
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha512bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey000
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig000_sha512_dat[] = {
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4, 0x56, 0x4f, 0x11, 0x31,
+ 0x62, 0x07, 0x02, 0x0f, 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f, 0xa7, 0xd5, 0xec, 0x4b,
+ 0x3e, 0x23, 0x5f, 0x4f, 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49, 0xa9, 0xed, 0x1d, 0x88,
+ 0xde, 0xa6, 0x93, 0x18, 0xe6, 0xec, 0xb1, 0xff, 0xca, 0xad, 0x04, 0x8a,
+ 0x1a, 0x04, 0xac, 0xf9, 0x6c, 0xe4, 0x7a, 0xa1, 0xfe, 0xe0, 0x7b, 0xd7,
+ 0xbb, 0x64, 0x25, 0xa7, 0x5b, 0xfa, 0x3c, 0xa4, 0xd6, 0x30, 0x9e, 0x25,
+ 0xa0, 0x85, 0xad, 0x9f, 0x81, 0x61, 0x87, 0x6f, 0x1b, 0x34, 0x01, 0x67,
+ 0x30, 0x31, 0xbc, 0x3c, 0x9f, 0x37, 0x62, 0x79, 0x51, 0x13, 0x57, 0x6d,
+ 0xa8, 0xd3, 0xca, 0x73, 0x8d, 0xe2, 0x76, 0x42, 0x68, 0xe0, 0x76, 0xb3,
+ 0xde, 0x5d, 0xeb, 0x23, 0x26, 0xdd, 0x41, 0xad, 0x4c, 0x67, 0x8c, 0x7d,
+ 0x35, 0x55, 0x2b, 0x5c, 0x1c, 0x68, 0xa6, 0x0e, 0x17, 0x1b, 0x9a, 0xa7,
+ 0x0a, 0x07, 0x21, 0xaf, 0x2b, 0x5a, 0x69, 0x06, 0x8e, 0x66, 0xe5, 0x18,
+ 0x85, 0x83, 0x5a, 0x20, 0x4b, 0x14, 0x0e, 0xfa, 0x62, 0x13, 0x1d, 0x7c,
+ 0x22, 0x6a, 0xd7, 0xff, 0x04, 0x19, 0x93, 0x06, 0x91, 0xc0, 0x83, 0x82,
+ 0xdc, 0x34, 0x2a, 0x66, 0x3a, 0x73, 0x49, 0x1f, 0xc8, 0x36, 0x1f, 0xa8,
+ 0x37, 0x6b, 0x93, 0xe2, 0x66, 0xb6, 0x91, 0xbe, 0xd8, 0xcc, 0xd3, 0x84,
+ 0xda, 0x09, 0x6b, 0xa9, 0xb3, 0xa5, 0x32, 0x8e, 0x92, 0x99, 0x61, 0xdc,
+ 0xa7, 0xbe, 0xbe, 0x59, 0x30, 0x44, 0x62, 0x96, 0x25, 0x2e, 0xcf, 0xcb,
+ 0x79, 0xf6, 0xb5, 0x9c, 0x38, 0xce, 0xac, 0x89, 0x76, 0x99, 0x7e, 0x50,
+ 0x7f, 0x46, 0xce, 0x61, 0xde, 0x4a, 0xd9, 0xa9, 0x72, 0x38, 0xa9, 0xe4,
+ 0x3b, 0x92, 0x83, 0x63, 0xe9, 0xf1, 0xea, 0x8c, 0x03, 0x1b, 0xba, 0xe4,
+ 0x63, 0xea, 0x52, 0x79, 0xad, 0x87, 0x8e, 0xad, 0x36, 0x7f, 0x35, 0x90,
+ 0x6b, 0xdb, 0x29, 0xf6, 0x1d, 0x2b, 0x55, 0x28, 0x15, 0x6e, 0xac, 0x72,
+ 0xb0, 0x60, 0x9c, 0x08, 0xc0, 0x76, 0xfe, 0x56, 0xa4, 0xc2, 0x4c, 0x58,
+ 0xcf, 0xd2, 0xb8, 0x79, 0xf2, 0x3c, 0x90, 0xfd, 0x79, 0x92, 0x17, 0x05,
+ 0x68, 0x5b, 0xce, 0x4d, 0xc3, 0x82, 0xca, 0xd9, 0x9b, 0x45, 0xc6, 0x3c,
+ 0xe5, 0xff, 0x17, 0x07, 0x47, 0x3c, 0x86, 0x3c, 0x38, 0x9a, 0x02, 0x18,
+ 0xdc, 0x87, 0xfc, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig000_sha512_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc
new file mode 100644
index 0000000..b27b723
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey001
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_revoked1msg0bsn0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x07, 0x46, 0xed, 0xb8, 0x6a, 0x4e, 0x7f, 0x4b,
+ 0x9d, 0xcc, 0x18, 0x91, 0x88, 0xf6, 0x76, 0x4d,
+ 0x74, 0x02, 0x36, 0x62, 0xe6, 0xd4, 0xb5, 0xf0,
+ 0x2d, 0x70, 0x91, 0x49, 0x65, 0xdf, 0x19, 0x02,
+ 0x30, 0x6c, 0x11, 0xaa, 0x74, 0x8c, 0x55, 0x2e,
+ 0x4b, 0xa3, 0x00, 0x00, 0xb0, 0x38, 0xf4, 0xcd,
+ 0x5d, 0xc9, 0x1d, 0xaa, 0x1e, 0x44, 0x98, 0xa4,
+ 0xe1, 0x3f, 0x2f, 0x4f, 0x6c, 0xc9, 0x15, 0xb0,
+ 0xb4, 0x9c, 0xb0, 0xe1, 0x0d, 0x9e, 0x27, 0x6c,
+ 0xc4, 0x1f, 0x77, 0x8c, 0x93, 0x98, 0x19, 0x8f,
+ 0xfa, 0xf5, 0xa2, 0x29, 0x09, 0x88, 0x51, 0xfc,
+ 0x76, 0xd8, 0xcd, 0xe6, 0xc7, 0x88, 0xeb, 0xba,
+ 0x19, 0x28, 0xa2, 0xd4, 0x25, 0x76, 0x13, 0x9d,
+ 0x0f, 0xee, 0x7c, 0x24, 0xbe, 0xc6, 0x67, 0x41,
+ 0xee, 0xce, 0x35, 0xf5, 0x6e, 0x83, 0xef, 0xb7,
+ 0x28, 0x28, 0xaa, 0x4f, 0x81, 0x3c, 0xc5, 0xb1,
+ 0x26, 0xc0, 0x76, 0x1b, 0x34, 0xab, 0x95, 0xfc,
+ 0x3a, 0x8f, 0x55, 0x93, 0x0a, 0x14, 0x2c, 0x3a,
+ 0x4c, 0xac, 0x6d, 0xd8, 0x3f, 0xa3, 0x0d, 0x57,
+ 0x6f, 0xe3, 0xd7, 0x46, 0xe4, 0x0a, 0x74, 0x27,
+ 0x27, 0x7c, 0x11, 0x25, 0xc9, 0x39, 0xe4, 0xee,
+ 0xf6, 0xfb, 0x08, 0xd1, 0xee, 0xa0, 0xbd, 0x67,
+ 0x0d, 0x16, 0x5b, 0xf6, 0x58, 0x22, 0x86, 0x4c,
+ 0xcd, 0x6f, 0x96, 0x8e, 0x5e, 0xb9, 0xa8, 0x23,
+ 0x2a, 0x8c, 0x35, 0x1a, 0x56, 0x81, 0x44, 0xfd,
+ 0xd6, 0xb5, 0x4a, 0x9c, 0xc5, 0xad, 0x95, 0x63,
+ 0xff, 0x20, 0x57, 0x56, 0xd8, 0x4c, 0x7e, 0x65,
+ 0x91, 0xd4, 0x81, 0xee, 0xa6, 0xdf, 0x43, 0x5e,
+ 0x82, 0x21, 0xcd, 0xda, 0x13, 0xc0, 0x9e, 0xef,
+ 0xa7, 0x42, 0xff, 0x30, 0x0a, 0x74, 0x2d, 0x18,
+ 0x88, 0xe8, 0x69, 0x9d, 0xbc, 0x51, 0x9e, 0x8e,
+ 0x64, 0x5c, 0x05, 0x7f, 0x4d, 0xac, 0x64, 0xd4,
+ 0x88, 0xc7, 0xa5, 0xac, 0xf4, 0x25, 0x40, 0x9e,
+ 0x46, 0x67, 0x4d, 0x2a, 0x1e, 0x58, 0xe6, 0x41,
+ 0xcc, 0xbb, 0x6a, 0x10, 0x98, 0x46, 0xd1, 0x33,
+ 0x8c, 0xe6, 0x97, 0xb4, 0x1e, 0x0f, 0x61, 0x24,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xe0, 0x9c, 0xd6, 0x62, 0x37, 0xb4, 0xf4, 0xf1,
+ 0x84, 0x29, 0xe0, 0x3f, 0x0f, 0x55, 0xbb, 0x4b,
+ 0xc7, 0xac, 0xac, 0x55, 0xd9, 0xc7, 0x80, 0xfb,
+ 0x8b, 0xd7, 0x25, 0x7a, 0x03, 0x0d, 0x5a, 0xc9,
+ 0xa7, 0x14, 0xb1, 0x3d, 0xd8, 0x23, 0x25, 0x92,
+ 0x30, 0x7a, 0xb8, 0x1e, 0xe9, 0x35, 0x7d, 0x0f,
+ 0x61, 0x77, 0x5d, 0xb8, 0x08, 0x97, 0xf0, 0xfe,
+ 0x93, 0xf1, 0xdc, 0xcb, 0x36, 0x2f, 0x3c, 0x40,
+ 0xde, 0xaf, 0xa5, 0xd4, 0x91, 0x76, 0x08, 0xdf,
+ 0x67, 0x0c, 0xce, 0xe3, 0xdc, 0x68, 0xba, 0x89,
+ 0x0e, 0xf0, 0x9d, 0xd5, 0xdf, 0x2d, 0x52, 0xfa,
+ 0x6a, 0x59, 0xd3, 0x68, 0x78, 0x01, 0x6a, 0x66,
+ 0xa5, 0x8a, 0x39, 0x2d, 0x7e, 0x66, 0xbf, 0x71,
+ 0x21, 0x31, 0xa3, 0x3a, 0xff, 0x4d, 0x1d, 0xd5,
+ 0x68, 0x21, 0x4a, 0x6a, 0x80, 0x77, 0xab, 0x56,
+ 0xcb, 0x11, 0x43, 0x7c, 0xf4, 0x5e, 0x84, 0x9a,
+ 0xc5, 0xea, 0x5c, 0x00, 0x2d, 0x94, 0xf4, 0xcb,
+ 0x05, 0xbe, 0x56, 0x8f, 0x95, 0x62, 0x02, 0xe1,
+ 0xa8, 0x82, 0xa5, 0x96, 0x3b, 0x3f, 0x36, 0xbf,
+ 0x41, 0x44, 0x6a, 0xe3, 0x0b, 0xeb, 0x90, 0x81,
+ 0x32, 0x1a, 0x8e, 0x1d, 0x1e, 0xf4, 0x9a, 0x6e,
+ 0xcf, 0xf6, 0x7d, 0x1e, 0x25, 0xf7, 0xa6, 0x67,
+ 0x10, 0xed, 0x3b, 0x95, 0xf5, 0x23, 0xd3, 0xb8,
+ 0x7e, 0x91, 0x16, 0x10, 0x78, 0x81, 0xbb, 0x7c,
+ 0x9f, 0x76, 0x17, 0x8a, 0x90, 0x1a, 0x6c, 0x9d,
+ 0x24, 0x45, 0x58, 0xf2, 0x81, 0x36, 0x53, 0x77,
+ 0xf4, 0xa6, 0x1f, 0xd2, 0xef, 0x58, 0x19, 0x15,
+ 0xe4, 0x99, 0x03, 0x4d, 0x1f, 0x96, 0xc0, 0x81,
+ 0x3c, 0xf2, 0x92, 0x15, 0xca, 0x3c, 0x4e, 0x0f,
+ 0x96, 0x01, 0xdf, 0xeb, 0x1f, 0x07, 0xec, 0x91,
+ 0x22, 0x8a, 0x66, 0x15, 0x44, 0x28, 0xf4, 0xeb,
+ 0x20, 0xb6, 0x1b, 0x8c, 0xbe, 0x06, 0x45, 0x31,
+ 0x44, 0x4a, 0x5f, 0x9a, 0x2c, 0xac, 0x19, 0x13,
+ 0x52, 0x10, 0xad, 0xb5, 0x69, 0x23, 0xd8, 0xdf,
+ 0x41, 0x24, 0x5e, 0x33, 0x8e, 0xc1, 0x6e, 0xd1,
+ 0x42, 0x18, 0x9d, 0x1c, 0x4e, 0x2b, 0x92, 0x06,
+ 0x4f, 0x90, 0x63, 0x24, 0x6b, 0xd6, 0x7f, 0x14,
+ 0x63, 0x66, 0xf1, 0x84, 0xef, 0x3d, 0x92, 0x81,
+ 0xa2, 0xfb, 0x1b, 0xb5, 0x12, 0x44, 0x45, 0x1d,
+ 0x0c, 0x78, 0x52, 0x12, 0x80, 0x05, 0xcd, 0x57,
+ 0xea, 0xd4, 0x65, 0xc8, 0x61, 0x3d, 0x12, 0x5f,
+ 0x79, 0x32, 0xdc, 0xe4, 0xc2, 0xb2, 0x3e, 0xeb,
+ 0xcf, 0xed, 0x1c, 0x8d, 0x89, 0x3b, 0xfd, 0x4a,
+ 0xcd, 0x7b, 0x05, 0xa4, 0xe5, 0xee, 0x90, 0xa0,
+ 0x33, 0xcd, 0xee, 0x7e, 0xfd, 0xd0, 0xb9, 0x1c,
+ 0x47, 0x9f, 0x29, 0xa3, 0x60, 0x51, 0x7d, 0x4d,
+ 0x86, 0x3c, 0x03, 0x73, 0xd7, 0x26, 0x67, 0x6b,
+ 0x86, 0x0b, 0x29, 0x1e, 0x0d, 0x94, 0x93, 0xc0,
+ 0x37, 0xf2, 0xc3, 0x65, 0x96, 0x61, 0x40, 0x51,
+ 0x2a, 0x0f, 0xf3, 0xce, 0xb1, 0x85, 0x03, 0x29,
+ 0x34, 0x77, 0x37, 0x5a, 0x2c, 0xd3, 0xa5, 0x96,
+ 0xf9, 0x6e, 0x92, 0xba, 0x78, 0xca, 0xfb, 0x41,
+ 0x2f, 0x10, 0xee, 0x43, 0xd4, 0x35, 0xfd, 0x00,
+ 0x8b, 0x99, 0x31, 0xe2, 0x58, 0x40, 0x5a, 0x5c,
+ 0xc8, 0x20, 0x68, 0x3d, 0x8a, 0x97, 0x58, 0xbb,
+ 0x86, 0x11, 0x09, 0xeb, 0xe9, 0xd7, 0xf2, 0x71,
+ 0x3f, 0x45, 0xdc, 0x8f, 0x7e, 0xbe, 0x5b, 0x11,
+ 0x3b, 0xa2, 0x00, 0x35, 0x94, 0x47, 0xb7, 0x22,
+ 0xca, 0xae, 0x30, 0x20, 0x10, 0xf7, 0xbb, 0x10,
+ 0xc1, 0x54, 0xc0, 0x7d, 0xfe, 0xca, 0x17, 0x5e
+//};
+//unsigned int sig_revoked1msg0bsn0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha384bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha384bsn0msg0.inc
new file mode 100644
index 0000000..a1af060
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha384bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey001
+ * HashAlg : Sha384
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig001_sha384_dat[] = {
+ 0x57, 0xe7, 0x8f, 0xfb, 0xf9, 0xa3, 0xba, 0x5e, 0xac, 0xec, 0xb3, 0xa4,
+ 0xf4, 0x13, 0x95, 0xa1, 0x1c, 0x1d, 0xe1, 0xaf, 0xea, 0x16, 0xba, 0x6d,
+ 0xde, 0x4c, 0x43, 0xf0, 0x89, 0x59, 0x5e, 0xfa, 0x0f, 0x18, 0xdd, 0x22,
+ 0xf6, 0xd6, 0xfc, 0xe5, 0x0f, 0xb2, 0x81, 0xb5, 0xa9, 0xa6, 0xe8, 0xee,
+ 0x14, 0x04, 0xec, 0x1b, 0x4e, 0x65, 0x82, 0x7f, 0x96, 0x53, 0xc4, 0x3b,
+ 0x29, 0x17, 0x39, 0xc0, 0x40, 0x45, 0x1d, 0xa1, 0xe4, 0x5c, 0x0a, 0xc9,
+ 0x81, 0xd7, 0x52, 0xe2, 0x75, 0x49, 0xf8, 0x36, 0x2d, 0xf0, 0x60, 0xd2,
+ 0x18, 0x1f, 0xd0, 0x98, 0x5b, 0xde, 0xdb, 0x4a, 0x99, 0x05, 0xeb, 0xba,
+ 0xab, 0x56, 0x75, 0x7b, 0x76, 0xaa, 0xc8, 0x52, 0xa9, 0x90, 0x95, 0x01,
+ 0xda, 0xfb, 0x0f, 0x1b, 0xe3, 0x04, 0x96, 0x9c, 0x27, 0x9d, 0x2b, 0xb3,
+ 0xc2, 0x48, 0x16, 0x3f, 0x4c, 0xc3, 0xe6, 0x6f, 0x71, 0x8a, 0xc6, 0x62,
+ 0x1f, 0x41, 0xc0, 0xe1, 0x2f, 0xb6, 0xd9, 0xee, 0x20, 0x47, 0x43, 0xe0,
+ 0xbd, 0x24, 0x16, 0xf7, 0xd5, 0x5e, 0xb4, 0x28, 0xb9, 0x62, 0xb4, 0xb4,
+ 0x2f, 0x1c, 0xef, 0x0a, 0x26, 0x77, 0xd2, 0x11, 0xc7, 0xf0, 0xa4, 0x05,
+ 0xf7, 0xc3, 0x27, 0xaa, 0x5b, 0x1c, 0x5b, 0x46, 0xce, 0x4b, 0xea, 0xe0,
+ 0x94, 0xef, 0xeb, 0x6e, 0x55, 0xa4, 0x57, 0xd8, 0xa8, 0x18, 0x8b, 0xf4,
+ 0x86, 0xc7, 0x2b, 0x9e, 0xce, 0xef, 0x1c, 0x30, 0x10, 0x18, 0x56, 0x2b,
+ 0xcf, 0x94, 0x21, 0x24, 0xaf, 0x8e, 0xd4, 0xb7, 0x40, 0xdf, 0xab, 0x14,
+ 0x3f, 0x55, 0x65, 0x72, 0x9f, 0xaf, 0x99, 0xed, 0xe1, 0x0a, 0x6d, 0x95,
+ 0x71, 0x1d, 0x38, 0x83, 0x4e, 0xba, 0xb3, 0x7e, 0xed, 0xe5, 0x9e, 0xfd,
+ 0xd0, 0xbf, 0xb4, 0x6a, 0x5f, 0xeb, 0x12, 0x94, 0xb2, 0xac, 0x27, 0x55,
+ 0x34, 0xa8, 0x2d, 0x77, 0x06, 0x0d, 0x7c, 0x56, 0x8b, 0x96, 0x3c, 0xc5,
+ 0xa2, 0xcf, 0x14, 0x52, 0x0c, 0x1f, 0x40, 0xcf, 0x0f, 0x46, 0x55, 0x0a,
+ 0x4a, 0x2b, 0x8f, 0xe0, 0xe7, 0xa3, 0xd5, 0xf5, 0x29, 0x10, 0x2a, 0x7d,
+ 0xd6, 0x43, 0xf3, 0x13, 0x7a, 0x77, 0x29, 0x2a, 0x56, 0x4b, 0x8c, 0x90,
+ 0x73, 0x73, 0x3e, 0x19, 0x58, 0x81, 0x3c, 0x69, 0x98, 0x4e, 0x96, 0x50,
+ 0xdd, 0xe8, 0x7e, 0x6b, 0x94, 0x45, 0xc4, 0xc5, 0x3d, 0xcb, 0x0c, 0x42,
+ 0xd9, 0x69, 0x29, 0x6c, 0x8d, 0xeb, 0x9e, 0x6a, 0xda, 0x8a, 0x4c, 0xfb,
+ 0x2d, 0xb7, 0x33, 0xe8, 0xe8, 0xeb, 0x05, 0x6a, 0x9e, 0x12, 0xb5, 0xb1,
+ 0x21, 0x39, 0xbc, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig001_sha384_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512_256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512_256bsn0msg0.inc
new file mode 100644
index 0000000..9fe16fd
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512_256bsn0msg0.inc
@@ -0,0 +1,100 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey001
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+ // unsigned char sig[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x07, 0x46, 0xed, 0xb8, 0x6a, 0x4e, 0x7f, 0x4b,
+ 0x9d, 0xcc, 0x18, 0x91, 0x88, 0xf6, 0x76, 0x4d, 0x74, 0x02, 0x36, 0x62,
+ 0xe6, 0xd4, 0xb5, 0xf0, 0x2d, 0x70, 0x91, 0x49, 0x65, 0xdf, 0x19, 0x02,
+ 0x30, 0x6c, 0x11, 0xaa, 0x74, 0x8c, 0x55, 0x2e, 0x4b, 0xa3, 0x00, 0x00,
+ 0xb0, 0x38, 0xf4, 0xcd, 0x5d, 0xc9, 0x1d, 0xaa, 0x1e, 0x44, 0x98, 0xa4,
+ 0xe1, 0x3f, 0x2f, 0x4f, 0x6c, 0xc9, 0x15, 0xb0, 0xe6, 0x70, 0x62, 0x2c,
+ 0x21, 0xf0, 0xa3, 0x7b, 0x32, 0x5f, 0x96, 0xc7, 0x19, 0xef, 0x7b, 0x14,
+ 0xf2, 0x52, 0xaa, 0xc8, 0x16, 0x81, 0x71, 0xdb, 0x53, 0x07, 0x1f, 0x52,
+ 0x5b, 0x7b, 0xa9, 0x7a, 0x4f, 0x92, 0x1e, 0xda, 0x24, 0xc0, 0xdd, 0xcb,
+ 0x19, 0xb0, 0x4a, 0x8c, 0x25, 0x7a, 0x18, 0x62, 0x34, 0x23, 0x93, 0xb4,
+ 0xeb, 0x14, 0xd4, 0x4d, 0x4d, 0xbd, 0xf1, 0x88, 0xf5, 0xb0, 0xa4, 0x8f,
+ 0x82, 0x03, 0x3d, 0x95, 0x58, 0x4c, 0xd8, 0x7b, 0xe9, 0xac, 0x40, 0x25,
+ 0x5b, 0xba, 0xa5, 0x36, 0x36, 0xf5, 0x5c, 0xff, 0xd1, 0x55, 0x89, 0x85,
+ 0x74, 0xf6, 0xf8, 0x0d, 0x2c, 0x3a, 0x94, 0x5e, 0x6d, 0xd6, 0x07, 0x99,
+ 0x07, 0x2e, 0x4f, 0x89, 0x3f, 0x33, 0x2e, 0xe8, 0x20, 0x20, 0xcf, 0xea,
+ 0x80, 0xbc, 0x33, 0xe4, 0x4e, 0xc6, 0xdf, 0x7f, 0xff, 0x20, 0x33, 0x2d,
+ 0x09, 0x29, 0x66, 0x2f, 0xf1, 0xbb, 0xea, 0xe8, 0x7a, 0x95, 0x4b, 0x35,
+ 0xab, 0xb4, 0x50, 0xc1, 0xdc, 0x34, 0x42, 0x49, 0x5b, 0xf4, 0x85, 0xb3,
+ 0xe1, 0xce, 0xf4, 0x0a, 0xbd, 0x6a, 0xde, 0xad, 0x35, 0xef, 0xef, 0x18,
+ 0xea, 0x89, 0x0c, 0x80, 0x7e, 0x26, 0xd8, 0xc5, 0x6e, 0x55, 0x06, 0xb0,
+ 0xf4, 0x25, 0x4e, 0x3e, 0x4b, 0x5a, 0xea, 0x08, 0x3b, 0xe4, 0xcc, 0x3f,
+ 0x87, 0x6a, 0xd3, 0xb7, 0x29, 0x54, 0xdc, 0x89, 0xf8, 0x3d, 0x4f, 0x1b,
+ 0xd0, 0x8d, 0xe9, 0x03, 0x4e, 0xba, 0x15, 0x3a, 0xc0, 0xf5, 0xbf, 0x47,
+ 0x68, 0x4b, 0x45, 0xb0, 0x7d, 0x9b, 0x57, 0x87, 0xf5, 0x07, 0x9a, 0xad,
+ 0x4e, 0x0d, 0xaa, 0xe9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x93, 0x28, 0xdc, 0xca, 0x44, 0xca, 0xd1, 0x3b, 0x05, 0x4e, 0x68, 0xfb,
+ 0x37, 0xee, 0x91, 0xf0, 0x46, 0x7e, 0x33, 0xa5, 0xae, 0x5f, 0xd9, 0x3c,
+ 0x37, 0x7e, 0xe2, 0x9a, 0x6e, 0xfa, 0x91, 0x9f, 0xd8, 0x43, 0x75, 0xa7,
+ 0x8b, 0x18, 0x0b, 0x25, 0x5d, 0x46, 0x94, 0x72, 0xc0, 0x19, 0x8c, 0x42,
+ 0x1c, 0xbc, 0x5f, 0xa9, 0x67, 0xbf, 0x55, 0x84, 0x6e, 0x2b, 0x4b, 0x6f,
+ 0xeb, 0x42, 0x67, 0xb8, 0x42, 0xcc, 0xa7, 0xa2, 0x38, 0xf8, 0x6c, 0xf9,
+ 0x1c, 0xe3, 0xdb, 0xa2, 0x31, 0x6d, 0xd5, 0x5e, 0xe9, 0xb6, 0xef, 0xf9,
+ 0x7f, 0x20, 0x51, 0x45, 0x7d, 0x8c, 0xb6, 0x47, 0xed, 0xcf, 0x9f, 0x57,
+ 0x61, 0x44, 0x2e, 0x25, 0xb2, 0x4e, 0xea, 0x36, 0x0d, 0x32, 0xa2, 0x46,
+ 0xbe, 0xf8, 0xa9, 0xbb, 0x61, 0x11, 0x56, 0xc6, 0x15, 0xf2, 0xdd, 0x35,
+ 0xb4, 0xa2, 0x31, 0xba, 0x04, 0xd4, 0x4d, 0x36, 0xa0, 0x79, 0x37, 0x53,
+ 0x94, 0x91, 0x37, 0x56, 0xe1, 0xed, 0xdb, 0x67, 0x73, 0x69, 0xad, 0xf2,
+ 0x0b, 0xb2, 0x37, 0xbb, 0x44, 0xd0, 0xd9, 0x19, 0x0c, 0x9b, 0xd4, 0xb0,
+ 0x3f, 0x16, 0x2b, 0x2f, 0x41, 0x10, 0xdf, 0xea, 0x98, 0x36, 0xc1, 0xc1,
+ 0xca, 0x12, 0x46, 0x30, 0xcd, 0xad, 0x07, 0x18, 0x24, 0x54, 0x55, 0xb7,
+ 0x85, 0x3f, 0x5a, 0x35, 0x10, 0xf8, 0xf9, 0x96, 0xca, 0x0b, 0xbb, 0xf6,
+ 0x37, 0x76, 0x3a, 0xd8, 0x73, 0xec, 0x86, 0xf8, 0x5b, 0xdd, 0xae, 0x01,
+ 0x83, 0xc8, 0x0e, 0x6e, 0x18, 0x23, 0x63, 0x34, 0x0f, 0x09, 0xf0, 0x65,
+ 0x35, 0xad, 0xbe, 0x88, 0x97, 0x04, 0x39, 0x45, 0x90, 0x2a, 0xbd, 0x5d,
+ 0x96, 0x33, 0xdb, 0x04, 0xa0, 0xa1, 0x7b, 0x79, 0x25, 0xa1, 0x8f, 0x37,
+ 0xfc, 0xef, 0x68, 0x2a, 0xf7, 0xa8, 0x8a, 0x26, 0x56, 0xf1, 0xf4, 0x77,
+ 0x11, 0xa0, 0x39, 0xf5, 0xb6, 0x02, 0x2e, 0x7e, 0xa9, 0xfe, 0x9e, 0x49,
+ 0xb6, 0x6d, 0xd6, 0xf4, 0x34, 0xe6, 0xe2, 0x85, 0xc5, 0x64, 0xfc, 0xa0,
+ 0x1a, 0xf5, 0xed, 0xed, 0xde, 0xa9, 0x67, 0xcd, 0xf4, 0x97, 0x27, 0xa9,
+ 0xe8, 0x30, 0xeb, 0x81, 0x85, 0xe6, 0x1f, 0x0b, 0xb5, 0x79, 0xee, 0x4b,
+ 0x20, 0xbb, 0x77, 0xd5, 0x45, 0x08, 0xf5, 0xb9, 0x7d, 0xbd, 0xac, 0x82,
+ 0x78, 0xd9, 0x07, 0xde, 0x72, 0x9c, 0xe1, 0xc9, 0x8a, 0x45, 0x15, 0xb3,
+ 0x6f, 0xc7, 0xc7, 0xee, 0x78, 0x4d, 0x05, 0x70, 0xd4, 0x24, 0xc5, 0x24,
+ 0x20, 0x0e, 0xbc, 0xfa, 0xfc, 0xa7, 0x09, 0x14, 0x5c, 0xb4, 0x8a, 0xe7,
+ 0x4d, 0xb0, 0xa0, 0x6a, 0xc1, 0x50, 0x87, 0xbd, 0xc9, 0x9e, 0x67, 0xcb,
+ 0xc9, 0xf6, 0x8d, 0xc8, 0x8d, 0xee, 0x61, 0x81, 0xf6, 0xef, 0x60, 0x68,
+ 0x19, 0xc5, 0x0d, 0x67, 0x55, 0x24, 0xa8, 0x12, 0x84, 0xe7, 0x70, 0x86,
+ 0xf2, 0x99, 0x06, 0x0e, 0xfc, 0xfe, 0x08, 0x58, 0x56, 0xd8, 0xc1, 0x6d,
+ 0xab, 0xda, 0x90, 0xf5, 0x53, 0xda, 0x2d, 0x72, 0xe2, 0xf7, 0xdc, 0x0c,
+ 0x9d, 0x61, 0x9c, 0x91, 0xff, 0xc1, 0x67, 0xe0, 0x31, 0xc3, 0xbf, 0x10,
+ 0x0a, 0xce, 0x6c, 0xb5, 0x7f, 0x5d, 0xcc, 0x17, 0xaa, 0x57, 0xd9, 0x36,
+ 0xd0, 0x50, 0xfe, 0xc8, 0x24, 0x5d, 0x6e, 0xb5, 0x91, 0xc4, 0x8c, 0xf1,
+ 0x08, 0x50, 0xf3, 0x76, 0x29, 0xc6, 0x94, 0x04, 0xf8, 0x97, 0xa8, 0xa5,
+ 0x1b, 0x52, 0x4c, 0xd9, 0xc0, 0xcc, 0xe4, 0x00, 0xe1, 0x1f, 0xba, 0x6b,
+ 0xf5, 0x2c, 0x61, 0x53, 0x8b, 0x12, 0x04, 0xa0, 0x4c, 0xdd, 0x93, 0xff
+// };
+// unsigned int sig_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512bsn0msg0.inc
new file mode 100644
index 0000000..370251a
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha512bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey001
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig001_sha512_dat[] = {
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4, 0x56, 0x4f, 0x11, 0x31,
+ 0x62, 0x07, 0x02, 0x0f, 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f, 0xa7, 0xd5, 0xec, 0x4b,
+ 0x3e, 0x23, 0x5f, 0x4f, 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49, 0xa9, 0xed, 0x1d, 0x88,
+ 0xde, 0xa6, 0x93, 0x18, 0xe1, 0xd0, 0x28, 0x79, 0xa1, 0xb8, 0xfb, 0x8d,
+ 0x5b, 0xcf, 0xd8, 0x53, 0x7b, 0x27, 0xcf, 0xf0, 0x7b, 0x3c, 0xfd, 0xec,
+ 0x2d, 0x32, 0x75, 0xa9, 0xb0, 0x12, 0xf7, 0xb5, 0x04, 0x9b, 0x4a, 0x89,
+ 0x09, 0xd5, 0xc2, 0xf9, 0x81, 0x3b, 0x02, 0x38, 0x18, 0x7a, 0x8e, 0x0a,
+ 0x94, 0x22, 0x22, 0x32, 0x20, 0xf9, 0x41, 0x12, 0x02, 0x11, 0xbc, 0x0e,
+ 0x43, 0x94, 0x7e, 0x3d, 0x35, 0x98, 0xe8, 0xac, 0xf2, 0x6b, 0xcf, 0xdf,
+ 0xf8, 0x4f, 0x0e, 0x42, 0x5b, 0xaa, 0x07, 0xb9, 0x55, 0x2b, 0xad, 0xb4,
+ 0xbc, 0x3c, 0x2f, 0xc7, 0xc9, 0x5b, 0xe2, 0xaa, 0x9b, 0xca, 0x80, 0xf4,
+ 0x92, 0x58, 0xbe, 0x3b, 0x43, 0xea, 0xaf, 0xb6, 0x1b, 0xd2, 0x6a, 0xda,
+ 0x6f, 0xd8, 0x89, 0x88, 0xbf, 0xbd, 0x7c, 0x8e, 0xa9, 0x47, 0x62, 0x7d,
+ 0xd5, 0x88, 0x7c, 0xb0, 0x24, 0x20, 0xfe, 0x71, 0x8f, 0xc6, 0x3a, 0xfb,
+ 0x44, 0xe1, 0xe8, 0x33, 0x45, 0x26, 0x12, 0x72, 0xe9, 0x2e, 0xbe, 0xf2,
+ 0xea, 0x0a, 0x21, 0x68, 0xc7, 0x1c, 0xea, 0x18, 0x7c, 0x3c, 0x01, 0x44,
+ 0xf1, 0xb5, 0xf7, 0xc6, 0x4b, 0xd7, 0xeb, 0x33, 0x1e, 0x1e, 0x7a, 0xe5,
+ 0xce, 0x76, 0xd6, 0x2b, 0x28, 0xe6, 0xb0, 0xfb, 0xc5, 0xda, 0x0b, 0xc0,
+ 0xbe, 0x39, 0xc1, 0x52, 0x9f, 0x69, 0xb3, 0xc7, 0xd7, 0x90, 0xc5, 0x63,
+ 0x07, 0xd1, 0x22, 0xa2, 0x25, 0x21, 0x8b, 0x12, 0x7a, 0x0c, 0xc7, 0xbb,
+ 0xad, 0xc2, 0xf7, 0xd2, 0xfa, 0x6f, 0x63, 0x04, 0x4d, 0x98, 0x74, 0x7a,
+ 0x96, 0x47, 0x9c, 0x3c, 0x5d, 0xbf, 0x1b, 0x58, 0x79, 0xee, 0xe2, 0x76,
+ 0xae, 0x6b, 0x23, 0xbe, 0xb1, 0x7c, 0xd5, 0x24, 0xe9, 0xae, 0xee, 0x34,
+ 0xf1, 0x73, 0x8b, 0x0e, 0x71, 0xcb, 0x0a, 0xd0, 0xae, 0x16, 0xc3, 0x4a,
+ 0x5a, 0x6c, 0xed, 0x3c, 0x1e, 0xaa, 0x7f, 0x48, 0xca, 0x6b, 0x20, 0x67,
+ 0x16, 0x93, 0xc8, 0xd9, 0x26, 0x21, 0xe9, 0x05, 0x0d, 0x4a, 0x6d, 0x30,
+ 0x86, 0xdd, 0x90, 0x95, 0x53, 0xd3, 0x73, 0x88, 0x6b, 0xec, 0x50, 0x25,
+ 0x29, 0x05, 0xeb, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig001_sha512_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc
new file mode 100644
index 0000000..5dc82aa
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey002
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_revoked2msg0bsn0_dat[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+ 0x8c, 0x10, 0x2f, 0x17, 0xa0, 0xe4, 0x1f, 0xc6,
+ 0xaa, 0xea, 0xd4, 0x82, 0x67, 0x61, 0x96, 0x47,
+ 0x9b, 0x46, 0x2c, 0x31, 0xbd, 0x29, 0x62, 0x2d,
+ 0xd8, 0x40, 0x44, 0xbc, 0x1d, 0xf0, 0x19, 0x02,
+ 0x4e, 0x4c, 0x2e, 0xc1, 0x0d, 0x43, 0x59, 0x8b,
+ 0xe0, 0x0d, 0xb4, 0x29, 0x20, 0x35, 0x1f, 0xb6,
+ 0x00, 0x07, 0xa3, 0xd9, 0x28, 0xd9, 0x48, 0x08,
+ 0x5e, 0x14, 0xca, 0x56, 0x72, 0xa4, 0xb6, 0x5a,
+ 0xfb, 0xda, 0x6b, 0x4c, 0xa0, 0xdc, 0xa8, 0x92,
+ 0x71, 0x65, 0x55, 0xb1, 0xe5, 0x56, 0x06, 0xb6,
+ 0xb1, 0xb0, 0x88, 0xe8, 0x05, 0xa6, 0x81, 0x1d,
+ 0x06, 0xb7, 0x88, 0xe8, 0x8d, 0xc3, 0xce, 0xf5,
+ 0x7a, 0x56, 0x3f, 0xb8, 0xdb, 0x73, 0xbc, 0x41,
+ 0xa9, 0xd9, 0xb7, 0x1f, 0x23, 0x1f, 0x4d, 0xae,
+ 0xd1, 0x83, 0x3d, 0xaf, 0xb9, 0x01, 0xfc, 0x94,
+ 0x4b, 0x06, 0x7b, 0x53, 0x9f, 0xaa, 0x92, 0xac,
+ 0xc6, 0x8a, 0x89, 0x5b, 0xcc, 0x1d, 0x35, 0x9e,
+ 0x27, 0xe6, 0x4e, 0x77, 0x02, 0x89, 0x4e, 0xd2,
+ 0xd7, 0xed, 0xdb, 0x6e, 0xce, 0xb9, 0x3c, 0xc6,
+ 0x77, 0x3c, 0x18, 0x6c, 0x6f, 0x48, 0x3b, 0xfc,
+ 0x6e, 0x6c, 0x89, 0xd7, 0x6c, 0xd6, 0xb1, 0x23,
+ 0xd0, 0x19, 0x58, 0xd4, 0x87, 0xbf, 0x30, 0x3e,
+ 0x84, 0xe3, 0x47, 0x43, 0xa0, 0xe3, 0xcf, 0x3a,
+ 0x68, 0x07, 0x46, 0x73, 0x0d, 0x87, 0x5f, 0x1b,
+ 0x51, 0x31, 0x5a, 0x76, 0xd7, 0x6e, 0x7f, 0x99,
+ 0x5b, 0xc5, 0x30, 0x76, 0xac, 0xf2, 0x74, 0xbc,
+ 0x8a, 0xc8, 0x80, 0xc0, 0x22, 0x65, 0xa2, 0x41,
+ 0x51, 0xde, 0x18, 0x65, 0xc4, 0x02, 0x8f, 0x8e,
+ 0x19, 0x27, 0xb4, 0x47, 0x18, 0x2c, 0xb6, 0x87,
+ 0x7e, 0xd6, 0x44, 0x33, 0xaa, 0xa4, 0xed, 0x07,
+ 0xeb, 0x40, 0xc3, 0x95, 0x60, 0x24, 0x4b, 0x5b,
+ 0xc9, 0x2b, 0x4d, 0xae, 0x9e, 0x94, 0x6c, 0x07,
+ 0xb8, 0xd5, 0x2a, 0x3c, 0xa3, 0x39, 0x55, 0x17,
+ 0xde, 0xee, 0x77, 0x43, 0x63, 0x09, 0xb1, 0xbd,
+ 0xab, 0x57, 0x08, 0x8e, 0x66, 0xd8, 0xec, 0x23,
+ 0x10, 0x62, 0x19, 0xb3, 0x4e, 0xa3, 0x55, 0x7b,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x5d, 0x9b, 0xdc, 0x23, 0x31, 0xbe, 0x5a, 0xbf,
+ 0x04, 0x51, 0x20, 0xd0, 0xea, 0xb0, 0x3f, 0x13,
+ 0x12, 0x53, 0x94, 0xdb, 0xa8, 0x11, 0xc7, 0x98,
+ 0xef, 0x2f, 0x6b, 0xbc, 0xbc, 0x1a, 0x73, 0xa5,
+ 0x2c, 0xac, 0x63, 0x8d, 0x67, 0x09, 0x65, 0x6d,
+ 0xe9, 0xc0, 0x2a, 0x61, 0x2d, 0xce, 0xe8, 0xc0,
+ 0xa2, 0xa4, 0xf5, 0x85, 0xfd, 0x91, 0x70, 0x80,
+ 0x32, 0xb7, 0xd8, 0x2f, 0x0d, 0x8a, 0x06, 0xc1,
+ 0x81, 0xe2, 0xee, 0x73, 0xa1, 0x5d, 0xbe, 0xca,
+ 0xaf, 0xe9, 0x2d, 0x12, 0xd6, 0xdd, 0x0a, 0xc2,
+ 0xa0, 0x33, 0x09, 0x1f, 0x53, 0x9b, 0x8e, 0xc2,
+ 0x13, 0x8d, 0x2d, 0x6c, 0xe0, 0xe3, 0x49, 0xd7,
+ 0xb4, 0xf4, 0xd4, 0xae, 0x7a, 0x5c, 0x19, 0xe2,
+ 0x68, 0x8a, 0xff, 0xfa, 0x07, 0x2a, 0x9b, 0x64,
+ 0x9c, 0x14, 0x0d, 0xd5, 0x06, 0xb3, 0xb2, 0x5a,
+ 0x58, 0x45, 0xd7, 0xe9, 0x22, 0x75, 0x7a, 0x2d,
+ 0x00, 0xe0, 0x6a, 0xff, 0xbf, 0xad, 0x3f, 0x58,
+ 0xc6, 0x8a, 0x45, 0x25, 0x9d, 0x97, 0x85, 0x8c,
+ 0x1c, 0x58, 0xcd, 0xf8, 0x35, 0xbc, 0x87, 0x6b,
+ 0x71, 0x14, 0xb7, 0x80, 0xba, 0xe8, 0x84, 0x17,
+ 0x80, 0x32, 0x94, 0x1f, 0x7c, 0xaa, 0xb5, 0xd4,
+ 0x8a, 0xe8, 0xa4, 0xe0, 0x55, 0xaf, 0x16, 0x4a,
+ 0xcf, 0xa0, 0x32, 0xc5, 0xd0, 0xc6, 0x22, 0xd9,
+ 0x5f, 0x08, 0x0f, 0xe5, 0x7c, 0x43, 0xc6, 0x2e,
+ 0x79, 0x82, 0x33, 0x67, 0xdd, 0xd9, 0xb4, 0xda,
+ 0x2b, 0x7e, 0x36, 0x5d, 0x2c, 0x6a, 0xaf, 0x5d,
+ 0xe9, 0x45, 0xa0, 0xc8, 0x2b, 0x8d, 0x0b, 0xa4,
+ 0xb3, 0x79, 0x87, 0xd4, 0xe6, 0x37, 0xed, 0xfa,
+ 0x87, 0x7a, 0x3d, 0x8e, 0xa7, 0x1f, 0xdd, 0xa7,
+ 0xe3, 0x71, 0x9f, 0x6f, 0xe3, 0xb7, 0xc8, 0x50,
+ 0x1b, 0xfc, 0x74, 0x33, 0x66, 0x0f, 0x2a, 0xff,
+ 0xd7, 0xbb, 0xbd, 0x0d, 0xed, 0x36, 0x57, 0x4f,
+ 0x0d, 0x0a, 0x49, 0xe2, 0x29, 0xd3, 0x23, 0xfc,
+ 0x3e, 0x70, 0x04, 0x4b, 0x45, 0x35, 0xa7, 0xe9,
+ 0x11, 0x26, 0x0a, 0xbd, 0xf6, 0x78, 0x8b, 0xf1,
+ 0x7a, 0x9e, 0x69, 0xff, 0xcb, 0x5f, 0x6d, 0x76,
+ 0x3e, 0xc0, 0xd9, 0xf4, 0x02, 0xf6, 0x62, 0xc5,
+ 0x11, 0x62, 0x9e, 0xcb, 0xc8, 0xc4, 0x42, 0x2b,
+ 0x01, 0xcb, 0xc5, 0x5a, 0x54, 0x7c, 0xd0, 0x9e,
+ 0xa4, 0x59, 0xc7, 0x3d, 0x22, 0x13, 0xb4, 0x0e,
+ 0x1a, 0xfc, 0xaa, 0x9d, 0xc1, 0x45, 0x74, 0xd0,
+ 0xe3, 0xec, 0xf4, 0xc4, 0x38, 0x7e, 0x7d, 0xb6,
+ 0xe0, 0xee, 0x3a, 0x3f, 0x9b, 0x89, 0xaa, 0x01,
+ 0x17, 0xc3, 0xfe, 0xe7, 0x3d, 0x45, 0x24, 0x3d,
+ 0x69, 0xd2, 0xed, 0x3d, 0x68, 0xd7, 0xca, 0x4a,
+ 0xe4, 0x7f, 0x17, 0xfb, 0x78, 0x84, 0x41, 0xd0,
+ 0x26, 0x36, 0xf2, 0x52, 0x57, 0x73, 0xce, 0xa1,
+ 0x0f, 0x77, 0x06, 0x8e, 0xdf, 0x3a, 0x55, 0x94,
+ 0x9b, 0xf7, 0xf4, 0xc6, 0x2d, 0x77, 0x93, 0x77,
+ 0xc3, 0x88, 0xc1, 0x11, 0x0a, 0x99, 0xf7, 0x56,
+ 0xfd, 0x0b, 0xbc, 0x1e, 0xd8, 0x55, 0x6f, 0xc7,
+ 0x48, 0x60, 0xa4, 0x2d, 0x6b, 0x47, 0x12, 0x2e,
+ 0x23, 0x07, 0x71, 0x53, 0x64, 0x2c, 0xbe, 0xb2,
+ 0xde, 0xcb, 0xf7, 0xe3, 0x19, 0x18, 0xf8, 0x8f,
+ 0x10, 0xd6, 0xfd, 0x44, 0xbe, 0x7b, 0x0e, 0xe6,
+ 0x8b, 0xca, 0xf1, 0x36, 0xaa, 0x8d, 0xac, 0x7e,
+ 0x1e, 0x3b, 0x13, 0xee, 0x4a, 0xaf, 0x87, 0xf5,
+ 0xf0, 0x25, 0xce, 0x5b, 0xf5, 0x4a, 0x3a, 0xa4,
+ 0x71, 0x2e, 0x53, 0x74, 0xa9, 0xbe, 0x49, 0x97,
+ 0xab, 0x49, 0xca, 0x73, 0x47, 0x59, 0x41, 0xde
+//};
+//unsigned int sig_revoked2msg0bsn0_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha384bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha384bsn0msg0.inc
new file mode 100644
index 0000000..8bc7618
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha384bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey002
+ * HashAlg : Sha384
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig002_sha384_dat[] = {
+ 0x57, 0xe7, 0x8f, 0xfb, 0xf9, 0xa3, 0xba, 0x5e, 0xac, 0xec, 0xb3, 0xa4,
+ 0xf4, 0x13, 0x95, 0xa1, 0x1c, 0x1d, 0xe1, 0xaf, 0xea, 0x16, 0xba, 0x6d,
+ 0xde, 0x4c, 0x43, 0xf0, 0x89, 0x59, 0x5e, 0xfa, 0x0f, 0x18, 0xdd, 0x22,
+ 0xf6, 0xd6, 0xfc, 0xe5, 0x0f, 0xb2, 0x81, 0xb5, 0xa9, 0xa6, 0xe8, 0xee,
+ 0x14, 0x04, 0xec, 0x1b, 0x4e, 0x65, 0x82, 0x7f, 0x96, 0x53, 0xc4, 0x3b,
+ 0x29, 0x17, 0x39, 0xc0, 0x9c, 0x72, 0x76, 0x06, 0xe0, 0xbd, 0x59, 0xba,
+ 0xc5, 0x0b, 0x58, 0x76, 0xf9, 0x32, 0xb7, 0xd1, 0x62, 0x68, 0x66, 0x97,
+ 0xc3, 0xaf, 0xfd, 0xa4, 0x76, 0x62, 0x40, 0xed, 0x19, 0xaa, 0x75, 0x54,
+ 0x17, 0x8b, 0xb4, 0x6a, 0xce, 0x16, 0x43, 0x46, 0xb4, 0xe0, 0x5d, 0xac,
+ 0xcf, 0xf8, 0xa8, 0xcf, 0x23, 0x6b, 0x08, 0x95, 0x28, 0xb4, 0x07, 0x44,
+ 0xc5, 0xe9, 0x7f, 0x16, 0x60, 0x2a, 0x1d, 0x23, 0xaf, 0x23, 0x6b, 0xe5,
+ 0x0f, 0x85, 0x6f, 0x62, 0x06, 0x26, 0xec, 0xaa, 0x08, 0x88, 0x39, 0x79,
+ 0x6c, 0xa4, 0x45, 0xf2, 0xda, 0xac, 0x08, 0x7d, 0x1c, 0xe3, 0x75, 0xa9,
+ 0xd4, 0x56, 0x18, 0x27, 0xa5, 0xc2, 0xbf, 0x5d, 0x9c, 0x98, 0x1c, 0xa6,
+ 0xec, 0x4e, 0x21, 0x20, 0x88, 0x1d, 0x53, 0x51, 0x4d, 0x1f, 0x86, 0xa3,
+ 0x67, 0x54, 0xc4, 0xfd, 0x43, 0xb9, 0x06, 0xcb, 0x0d, 0xb8, 0x06, 0x48,
+ 0x83, 0xe8, 0x80, 0x94, 0x04, 0x11, 0xe6, 0xd3, 0xbe, 0xb6, 0x28, 0x94,
+ 0x6e, 0x5b, 0x2b, 0xa4, 0x48, 0x4d, 0x7b, 0xef, 0xab, 0x90, 0x8b, 0x59,
+ 0x25, 0xcc, 0xcb, 0x0f, 0x51, 0x8a, 0x49, 0xcf, 0x58, 0xd3, 0x80, 0xc8,
+ 0xb0, 0xea, 0x84, 0x23, 0x65, 0xe4, 0x6f, 0x49, 0xc1, 0x64, 0x30, 0x44,
+ 0xf3, 0x4f, 0x96, 0x46, 0x96, 0x46, 0xd9, 0x5a, 0xce, 0xb0, 0xac, 0x59,
+ 0xc3, 0xa4, 0xbe, 0x47, 0x9c, 0x50, 0xb9, 0xb2, 0x9d, 0x60, 0xcb, 0x63,
+ 0x15, 0x44, 0x3a, 0x3d, 0xee, 0x8e, 0xf4, 0x05, 0xaf, 0x8b, 0xa5, 0xa8,
+ 0x76, 0x4e, 0x9f, 0xf9, 0x89, 0x4c, 0x94, 0x98, 0xfa, 0x05, 0xf3, 0xb5,
+ 0x5c, 0xe2, 0x10, 0xdd, 0x0a, 0x4c, 0x10, 0x95, 0x69, 0xc8, 0xe0, 0xbf,
+ 0x8e, 0x65, 0x79, 0x90, 0x2c, 0x9b, 0x5f, 0x00, 0x27, 0x04, 0x3f, 0x09,
+ 0x3a, 0xce, 0x8d, 0x0e, 0x6a, 0x4e, 0x53, 0x6b, 0x67, 0x87, 0xf7, 0x3b,
+ 0xe1, 0x15, 0x05, 0xe1, 0x93, 0x77, 0x53, 0x1b, 0x6b, 0xfa, 0xdb, 0xd4,
+ 0xee, 0x57, 0x1e, 0xe2, 0xd8, 0xc8, 0x41, 0x89, 0xc0, 0x71, 0x47, 0x80,
+ 0x2e, 0x6d, 0x8d, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig002_sha384_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512_256bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512_256bsn0msg0.inc
new file mode 100644
index 0000000..82425b4
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512_256bsn0msg0.inc
@@ -0,0 +1,100 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey002
+ * HashAlg : Sha512256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : group x sigrl
+ */
+ // unsigned char sig[] = {
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x8c, 0x10, 0x2f, 0x17, 0xa0, 0xe4, 0x1f, 0xc6,
+ 0xaa, 0xea, 0xd4, 0x82, 0x67, 0x61, 0x96, 0x47, 0x9b, 0x46, 0x2c, 0x31,
+ 0xbd, 0x29, 0x62, 0x2d, 0xd8, 0x40, 0x44, 0xbc, 0x1d, 0xf0, 0x19, 0x02,
+ 0x4e, 0x4c, 0x2e, 0xc1, 0x0d, 0x43, 0x59, 0x8b, 0xe0, 0x0d, 0xb4, 0x29,
+ 0x20, 0x35, 0x1f, 0xb6, 0x00, 0x07, 0xa3, 0xd9, 0x28, 0xd9, 0x48, 0x08,
+ 0x5e, 0x14, 0xca, 0x56, 0x72, 0xa4, 0xb6, 0x5a, 0xbf, 0xaa, 0xfd, 0x90,
+ 0x46, 0xfb, 0xac, 0x86, 0x7c, 0x1d, 0xcd, 0x22, 0x48, 0xfb, 0xca, 0xa5,
+ 0x88, 0xfd, 0x8c, 0x3b, 0x3a, 0x16, 0xa6, 0x98, 0x77, 0x44, 0x45, 0xcc,
+ 0x03, 0x50, 0xf1, 0x76, 0x8f, 0x06, 0x81, 0x12, 0x4d, 0x5c, 0x58, 0x23,
+ 0xdb, 0x88, 0x1c, 0x40, 0x79, 0xa8, 0x5b, 0x31, 0x72, 0x76, 0x4f, 0x9b,
+ 0x34, 0x6e, 0x38, 0x1a, 0x5b, 0xda, 0xac, 0x1d, 0xf4, 0x6b, 0x89, 0xd8,
+ 0x64, 0xd7, 0x63, 0x80, 0x47, 0x59, 0x0b, 0xd0, 0xb6, 0x0d, 0xaf, 0x83,
+ 0x72, 0xac, 0xb5, 0x45, 0xce, 0xaf, 0x49, 0x61, 0x24, 0xb1, 0xcc, 0x75,
+ 0x6b, 0x48, 0x19, 0x5f, 0x49, 0x54, 0x66, 0xa4, 0x09, 0x73, 0x0c, 0x9a,
+ 0x1f, 0x9c, 0x2a, 0xf0, 0x03, 0x10, 0xf1, 0x9d, 0x6f, 0xf7, 0xa4, 0xf2,
+ 0x19, 0x01, 0x90, 0xfa, 0x5b, 0xa0, 0x89, 0xf9, 0xc2, 0x00, 0xc2, 0xed,
+ 0x53, 0xca, 0x0c, 0xfc, 0x54, 0x0f, 0x09, 0xa3, 0x0c, 0x4e, 0x8d, 0xf6,
+ 0x81, 0x9f, 0x2b, 0x0a, 0x09, 0x09, 0x2c, 0x1d, 0xb0, 0x39, 0x72, 0xd9,
+ 0x46, 0xe2, 0xf3, 0xfc, 0xa1, 0xb9, 0x4a, 0x46, 0xe4, 0x6e, 0xb5, 0x55,
+ 0x57, 0x5a, 0x3f, 0xa3, 0x84, 0x28, 0x2f, 0x77, 0x3c, 0x90, 0x0f, 0x66,
+ 0xc9, 0x9f, 0xb4, 0x51, 0xe3, 0x6f, 0x27, 0x73, 0xb0, 0xf3, 0x2e, 0xdf,
+ 0x94, 0x0a, 0x22, 0xf5, 0xdf, 0xaf, 0xa7, 0x94, 0x0f, 0x14, 0xb5, 0x05,
+ 0x76, 0x05, 0x5e, 0xb5, 0x15, 0xb5, 0x34, 0x99, 0xcb, 0xff, 0xbe, 0xf7,
+ 0xd2, 0x12, 0xc8, 0x58, 0xdb, 0x33, 0x28, 0xa9, 0xc1, 0xc6, 0x23, 0x07,
+ 0xbc, 0x50, 0xc4, 0xdd, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x45, 0xd2, 0xd0, 0xb3, 0x22, 0xd3, 0xf2, 0x8b, 0x01, 0x6e, 0xba, 0xfa,
+ 0x0f, 0xac, 0x4c, 0x80, 0x29, 0x2c, 0xd0, 0x1d, 0x48, 0x99, 0x0a, 0xd2,
+ 0x78, 0x2b, 0x52, 0xd4, 0xe3, 0xbf, 0x12, 0xb9, 0x95, 0x45, 0x4a, 0x47,
+ 0xf4, 0x20, 0xd0, 0xa3, 0xc4, 0x55, 0x82, 0x1e, 0x6a, 0xbe, 0x00, 0x86,
+ 0x9c, 0x94, 0xe3, 0xd6, 0xac, 0xb5, 0x51, 0x25, 0x08, 0x5d, 0x0d, 0xf2,
+ 0x39, 0x37, 0x95, 0x88, 0xc9, 0xeb, 0xbe, 0xd5, 0xce, 0xff, 0x9b, 0x33,
+ 0x4e, 0xd0, 0xcc, 0x91, 0x2e, 0xf4, 0x5f, 0x0d, 0x0b, 0x9f, 0x93, 0xb7,
+ 0x63, 0xd1, 0x0f, 0x32, 0xd0, 0x64, 0x37, 0x42, 0x0c, 0x08, 0xc5, 0x3c,
+ 0xdf, 0xc3, 0xb0, 0xec, 0x8f, 0x51, 0xdc, 0x58, 0xe9, 0x99, 0xad, 0x58,
+ 0x58, 0x89, 0xa4, 0x35, 0xca, 0xc8, 0x14, 0xc0, 0x93, 0x78, 0x36, 0x08,
+ 0x3a, 0xf0, 0xac, 0x03, 0x20, 0x51, 0x59, 0x7e, 0x4c, 0x28, 0x3c, 0xf8,
+ 0x48, 0x9e, 0x91, 0x3a, 0xd4, 0x3b, 0xf4, 0xa9, 0x49, 0x7c, 0x61, 0x50,
+ 0x9c, 0xa5, 0xf1, 0xed, 0xc7, 0xb3, 0xbe, 0xca, 0x9e, 0x9a, 0x30, 0x91,
+ 0x77, 0x64, 0x5d, 0xdd, 0xf6, 0x83, 0x22, 0x63, 0x79, 0x52, 0xe9, 0x88,
+ 0xe8, 0x92, 0x64, 0x09, 0x0f, 0xa3, 0xbf, 0x77, 0x84, 0x37, 0x8e, 0xda,
+ 0xa8, 0xac, 0x9e, 0xfc, 0x49, 0xcf, 0x70, 0x2e, 0xe3, 0x2b, 0xdb, 0x11,
+ 0x0a, 0x6b, 0x5b, 0xc2, 0xa2, 0x0b, 0x2e, 0xa3, 0xa5, 0xed, 0x77, 0x1b,
+ 0xb5, 0x75, 0xe1, 0x8b, 0xec, 0x59, 0xbf, 0x80, 0xbb, 0x96, 0x80, 0xc2,
+ 0x1a, 0x57, 0x01, 0x9e, 0x1d, 0xdf, 0xcf, 0xf6, 0x86, 0x9e, 0x38, 0xed,
+ 0x46, 0xfa, 0x88, 0x1c, 0xcf, 0x56, 0xcc, 0x61, 0xe3, 0x8c, 0x06, 0xbb,
+ 0x80, 0xd4, 0xc4, 0x40, 0x3c, 0xa8, 0xce, 0x02, 0xc8, 0xb5, 0x2b, 0x5c,
+ 0xd2, 0xee, 0xd6, 0xc9, 0x4e, 0x5c, 0x82, 0x40, 0x00, 0xa5, 0xa8, 0x89,
+ 0x77, 0x4e, 0xa7, 0xd3, 0xa2, 0x0e, 0xc0, 0xb8, 0xfa, 0xa3, 0xdd, 0x53,
+ 0x12, 0x1d, 0x45, 0x04, 0x87, 0xd7, 0xe3, 0xd2, 0x99, 0x6f, 0xbe, 0xb4,
+ 0xb3, 0xb0, 0x35, 0x99, 0x22, 0xb8, 0x91, 0x83, 0x0d, 0x0a, 0xf6, 0x2c,
+ 0x51, 0x4c, 0xb8, 0xe5, 0x4a, 0x75, 0xca, 0xda, 0xd7, 0x3d, 0x8f, 0x0a,
+ 0x04, 0x04, 0xf8, 0x55, 0xb8, 0x01, 0xb7, 0xff, 0xf7, 0xed, 0x0a, 0x4b,
+ 0x62, 0x94, 0x79, 0x3d, 0x29, 0x1f, 0xfc, 0x40, 0xd1, 0xd2, 0x29, 0xbe,
+ 0x5d, 0x99, 0x3c, 0x04, 0xee, 0xa9, 0x20, 0x08, 0xea, 0xad, 0x08, 0x3d,
+ 0x8d, 0x35, 0x7f, 0x7c, 0x51, 0xf2, 0xe2, 0x00, 0x3e, 0x47, 0x7a, 0x98,
+ 0x53, 0x70, 0x23, 0xc2, 0xa0, 0x6d, 0x81, 0xc1, 0x78, 0xb0, 0xff, 0xfb,
+ 0xaf, 0xe4, 0x66, 0x4e, 0x7b, 0x79, 0xcd, 0x77, 0x09, 0x7b, 0x0e, 0x64,
+ 0xad, 0x30, 0xe2, 0x03, 0xe1, 0xed, 0x29, 0xa0, 0xb7, 0x8f, 0xa4, 0x62,
+ 0xc0, 0x09, 0xa8, 0xae, 0x8e, 0xf9, 0x91, 0x74, 0x2a, 0xf2, 0x87, 0x3b,
+ 0x0e, 0x02, 0x4e, 0x19, 0xb7, 0xef, 0xc8, 0x7e, 0x53, 0x40, 0x59, 0x9b,
+ 0x6e, 0x91, 0xcb, 0xcb, 0x8e, 0x80, 0xfd, 0x8e, 0x11, 0x94, 0xd3, 0x93,
+ 0x22, 0x6b, 0x7d, 0xbd, 0xa5, 0x1f, 0xa8, 0xf5, 0x64, 0x55, 0x31, 0xa6,
+ 0xd4, 0x21, 0x38, 0xfb, 0x8c, 0xc5, 0xaa, 0x1c, 0x71, 0x5f, 0xb6, 0x3f,
+ 0x3c, 0x0f, 0x3b, 0x66, 0xbf, 0x18, 0x69, 0xaa, 0x98, 0x84, 0x8d, 0x8c,
+ 0x5d, 0xa8, 0xec, 0x6f, 0x77, 0x41, 0x48, 0xfa, 0x25, 0x7d, 0x53, 0x54
+// };
+// unsigned int sig_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512bsn0msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512bsn0msg0.inc
new file mode 100644
index 0000000..eb022fa
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha512bsn0msg0.inc
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn0/mprivkey002
+ * HashAlg : Sha512
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : empty sigrl
+ */
+//unsigned char sig002_sha512_dat[] = {
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4, 0x56, 0x4f, 0x11, 0x31,
+ 0x62, 0x07, 0x02, 0x0f, 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f, 0xa7, 0xd5, 0xec, 0x4b,
+ 0x3e, 0x23, 0x5f, 0x4f, 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49, 0xa9, 0xed, 0x1d, 0x88,
+ 0xde, 0xa6, 0x93, 0x18, 0x5b, 0x0a, 0xb1, 0xd7, 0x8e, 0x50, 0xf3, 0x3c,
+ 0xed, 0x19, 0x00, 0xdb, 0x98, 0xdf, 0x1d, 0x5a, 0xf2, 0x2a, 0x54, 0x57,
+ 0xfd, 0x1f, 0xdb, 0xbd, 0x64, 0x83, 0xe0, 0x1e, 0x1d, 0x08, 0x14, 0x59,
+ 0x3a, 0xf6, 0xd2, 0x6a, 0xd7, 0xba, 0x42, 0x7f, 0xca, 0xb4, 0xe9, 0x06,
+ 0x24, 0x9b, 0xbf, 0x67, 0xed, 0x56, 0x3c, 0x65, 0xd6, 0x7f, 0xcf, 0x7c,
+ 0x17, 0xa5, 0x5f, 0x90, 0x22, 0x71, 0x05, 0x00, 0x05, 0x3a, 0x09, 0x77,
+ 0x8a, 0x0f, 0xca, 0x75, 0x10, 0xb5, 0xdf, 0xc6, 0x86, 0x3a, 0xf6, 0x0d,
+ 0x9e, 0xb8, 0x28, 0xae, 0x53, 0x93, 0x4d, 0x8a, 0x4a, 0x91, 0x77, 0xdf,
+ 0x5b, 0xeb, 0x08, 0x39, 0xab, 0x96, 0x72, 0x32, 0x5c, 0x8b, 0x8d, 0xb4,
+ 0x6b, 0xcc, 0x94, 0x62, 0x69, 0xd3, 0x73, 0xf5, 0x96, 0x49, 0xfe, 0x92,
+ 0x46, 0xe9, 0x0e, 0xae, 0x05, 0xc3, 0xc8, 0xd2, 0x35, 0x86, 0x98, 0xec,
+ 0x86, 0x56, 0xec, 0x74, 0xa3, 0x52, 0x2f, 0x5a, 0xc8, 0x0c, 0x26, 0xb5,
+ 0x9c, 0xd6, 0xab, 0xcf, 0xc0, 0x4f, 0xcb, 0xa4, 0xee, 0xe8, 0xd9, 0xc3,
+ 0x6e, 0xb4, 0x6f, 0x2d, 0x2e, 0x94, 0x7a, 0xb2, 0x99, 0xe2, 0x3f, 0x26,
+ 0x89, 0x10, 0x20, 0x72, 0x24, 0x9e, 0xbe, 0xbc, 0xcd, 0x81, 0xaa, 0x42,
+ 0x09, 0x4f, 0x02, 0x8e, 0x09, 0xff, 0x40, 0x9e, 0x52, 0xae, 0x0d, 0x01,
+ 0xf8, 0x0b, 0x39, 0x55, 0x68, 0x27, 0xf6, 0xb5, 0x93, 0xc5, 0x19, 0x13,
+ 0x4b, 0xa9, 0x9e, 0x91, 0xa2, 0xf8, 0x49, 0xb5, 0xbe, 0x6c, 0x13, 0x5a,
+ 0x97, 0x5f, 0x33, 0x85, 0x2b, 0xbd, 0x79, 0xea, 0xe2, 0x35, 0xb8, 0x60,
+ 0x27, 0xa1, 0x87, 0x88, 0x68, 0x92, 0x98, 0x96, 0xcd, 0x0b, 0x4f, 0x9c,
+ 0x99, 0x27, 0x0d, 0xb7, 0x85, 0x88, 0x5e, 0x9d, 0x61, 0x3b, 0x66, 0x94,
+ 0x1e, 0x97, 0xd4, 0x4f, 0x3b, 0xb7, 0xba, 0x0e, 0xaa, 0x31, 0x5b, 0x10,
+ 0x70, 0x2d, 0x5b, 0x28, 0x95, 0xe9, 0xb8, 0x40, 0x90, 0x12, 0x1e, 0x02,
+ 0xa8, 0x41, 0x0a, 0xc4, 0x05, 0x94, 0xf4, 0x99, 0x74, 0x0b, 0xed, 0x27,
+ 0xb9, 0x74, 0x3a, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int sig002_sha512_dat_len = 360;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl.inc
new file mode 100644
index 0000000..468c0ec
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl.inc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn0"
+ * HashAlg : Sha256
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2,
+ 0x73, 0x96, 0xfa, 0xd6, 0xf8, 0xfa, 0x2c, 0x39,
+ 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3,
+ 0x74, 0x90, 0xf2, 0xf5, 0x50, 0xe4, 0x69, 0x5d,
+ 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a,
+
+ 0x07, 0x46, 0xed, 0xb8, 0x6a, 0x4e, 0x7f, 0x4b,
+ 0x9d, 0xcc, 0x18, 0x91, 0x88, 0xf6, 0x76, 0x4d,
+ 0x74, 0x02, 0x36, 0x62, 0xe6, 0xd4, 0xb5, 0xf0,
+ 0x2d, 0x70, 0x91, 0x49, 0x65, 0xdf, 0x19, 0x02,
+ 0x30, 0x6c, 0x11, 0xaa, 0x74, 0x8c, 0x55, 0x2e,
+ 0x4b, 0xa3, 0x00, 0x00, 0xb0, 0x38, 0xf4, 0xcd,
+ 0x5d, 0xc9, 0x1d, 0xaa, 0x1e, 0x44, 0x98, 0xa4,
+ 0xe1, 0x3f, 0x2f, 0x4f, 0x6c, 0xc9, 0x15, 0xb0,
+
+ 0x8c, 0x10, 0x2f, 0x17, 0xa0, 0xe4, 0x1f, 0xc6,
+ 0xaa, 0xea, 0xd4, 0x82, 0x67, 0x61, 0x96, 0x47,
+ 0x9b, 0x46, 0x2c, 0x31, 0xbd, 0x29, 0x62, 0x2d,
+ 0xd8, 0x40, 0x44, 0xbc, 0x1d, 0xf0, 0x19, 0x02,
+ 0x4e, 0x4c, 0x2e, 0xc1, 0x0d, 0x43, 0x59, 0x8b,
+ 0xe0, 0x0d, 0xb4, 0x29, 0x20, 0x35, 0x1f, 0xb6,
+ 0x00, 0x07, 0xa3, 0xd9, 0x28, 0xd9, 0x48, 0x08,
+ 0x5e, 0x14, 0xca, 0x56, 0x72, 0xa4, 0xb6, 0x5a,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc
new file mode 100644
index 0000000..aa2b295
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc
@@ -0,0 +1,51 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn0"
+ * HashAlg : Sha256
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26,
+ 0x5f, 0x20, 0xbd, 0x9e, 0x49, 0x11, 0x31, 0xe0,
+ 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd,
+ 0x64, 0x60, 0xa4, 0xf8, 0x17, 0x81, 0xc3, 0x0a,
+ 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99,
+ 0x72, 0xdc, 0xe6, 0x78, 0xe3, 0x70, 0xa8, 0x28,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+
+ 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2,
+ 0x73, 0x96, 0xfa, 0xd6, 0xf8, 0xfa, 0x2c, 0x39,
+ 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3,
+ 0x74, 0x90, 0xf2, 0xf5, 0x50, 0xe4, 0x69, 0x5d,
+ 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha384.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha384.inc
new file mode 100644
index 0000000..ee7eccb
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha384.inc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn0"
+ * HashAlg : Sha384
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x57, 0xe7, 0x8f, 0xfb, 0xf9, 0xa3, 0xba, 0x5e,
+ 0xac, 0xec, 0xb3, 0xa4, 0xf4, 0x13, 0x95, 0xa1,
+ 0x1c, 0x1d, 0xe1, 0xaf, 0xea, 0x16, 0xba, 0x6d,
+ 0xde, 0x4c, 0x43, 0xf0, 0x89, 0x59, 0x5e, 0xfa,
+ 0x0f, 0x18, 0xdd, 0x22, 0xf6, 0xd6, 0xfc, 0xe5,
+ 0x0f, 0xb2, 0x81, 0xb5, 0xa9, 0xa6, 0xe8, 0xee,
+ 0x14, 0x04, 0xec, 0x1b, 0x4e, 0x65, 0x82, 0x7f,
+ 0x96, 0x53, 0xc4, 0x3b, 0x29, 0x17, 0x39, 0xc0,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0x9d, 0x3e, 0x8e, 0xd2, 0x45, 0xfd, 0x1b, 0xcd,
+ 0x33, 0x6c, 0xdb, 0x1a, 0xda, 0x34, 0x59, 0x2e,
+ 0x38, 0x72, 0x75, 0x17, 0x25, 0xee, 0xa8, 0x9b,
+ 0xf9, 0xd0, 0x1b, 0x15, 0x82, 0x03, 0x8c, 0x72,
+ 0x5d, 0xb7, 0x3c, 0x7c, 0x7e, 0x17, 0x81, 0x55,
+ 0x52, 0x7d, 0x87, 0x7c, 0x90, 0xd8, 0x17, 0xee,
+ 0x35, 0xdb, 0xe1, 0x67, 0x59, 0xa4, 0xd6, 0xb3,
+ 0x24, 0x54, 0xd2, 0x70, 0x0f, 0xc0, 0x37, 0x39,
+
+ 0x40, 0x45, 0x1d, 0xa1, 0xe4, 0x5c, 0x0a, 0xc9,
+ 0x81, 0xd7, 0x52, 0xe2, 0x75, 0x49, 0xf8, 0x36,
+ 0x2d, 0xf0, 0x60, 0xd2, 0x18, 0x1f, 0xd0, 0x98,
+ 0x5b, 0xde, 0xdb, 0x4a, 0x99, 0x05, 0xeb, 0xba,
+ 0xab, 0x56, 0x75, 0x7b, 0x76, 0xaa, 0xc8, 0x52,
+ 0xa9, 0x90, 0x95, 0x01, 0xda, 0xfb, 0x0f, 0x1b,
+ 0xe3, 0x04, 0x96, 0x9c, 0x27, 0x9d, 0x2b, 0xb3,
+ 0xc2, 0x48, 0x16, 0x3f, 0x4c, 0xc3, 0xe6, 0x6f,
+
+ 0x9c, 0x72, 0x76, 0x06, 0xe0, 0xbd, 0x59, 0xba,
+ 0xc5, 0x0b, 0x58, 0x76, 0xf9, 0x32, 0xb7, 0xd1,
+ 0x62, 0x68, 0x66, 0x97, 0xc3, 0xaf, 0xfd, 0xa4,
+ 0x76, 0x62, 0x40, 0xed, 0x19, 0xaa, 0x75, 0x54,
+ 0x17, 0x8b, 0xb4, 0x6a, 0xce, 0x16, 0x43, 0x46,
+ 0xb4, 0xe0, 0x5d, 0xac, 0xcf, 0xf8, 0xa8, 0xcf,
+ 0x23, 0x6b, 0x08, 0x95, 0x28, 0xb4, 0x07, 0x44,
+ 0xc5, 0xe9, 0x7f, 0x16, 0x60, 0x2a, 0x1d, 0x23,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512.inc
new file mode 100644
index 0000000..7b8fbfc
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512.inc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn0"
+ * HashAlg : Sha512
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x72, 0xed, 0x4f, 0x01, 0xf2, 0xfe, 0xc9, 0xf4,
+ 0x56, 0x4f, 0x11, 0x31, 0x62, 0x07, 0x02, 0x0f,
+ 0xed, 0xd0, 0x6b, 0xe8, 0xbf, 0xa9, 0x0b, 0x55,
+ 0xb8, 0xf7, 0xe9, 0x6e, 0xaa, 0x13, 0x2e, 0x6f,
+ 0xa7, 0xd5, 0xec, 0x4b, 0x3e, 0x23, 0x5f, 0x4f,
+ 0x61, 0x44, 0x52, 0xc1, 0x75, 0x0b, 0x13, 0xad,
+ 0xa1, 0x53, 0x0d, 0x6a, 0x73, 0xed, 0x5e, 0x49,
+ 0xa9, 0xed, 0x1d, 0x88, 0xde, 0xa6, 0x93, 0x18,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0xe6, 0xec, 0xb1, 0xff, 0xca, 0xad, 0x04, 0x8a,
+ 0x1a, 0x04, 0xac, 0xf9, 0x6c, 0xe4, 0x7a, 0xa1,
+ 0xfe, 0xe0, 0x7b, 0xd7, 0xbb, 0x64, 0x25, 0xa7,
+ 0x5b, 0xfa, 0x3c, 0xa4, 0xd6, 0x30, 0x9e, 0x25,
+ 0xa0, 0x85, 0xad, 0x9f, 0x81, 0x61, 0x87, 0x6f,
+ 0x1b, 0x34, 0x01, 0x67, 0x30, 0x31, 0xbc, 0x3c,
+ 0x9f, 0x37, 0x62, 0x79, 0x51, 0x13, 0x57, 0x6d,
+ 0xa8, 0xd3, 0xca, 0x73, 0x8d, 0xe2, 0x76, 0x42,
+
+ 0xe1, 0xd0, 0x28, 0x79, 0xa1, 0xb8, 0xfb, 0x8d,
+ 0x5b, 0xcf, 0xd8, 0x53, 0x7b, 0x27, 0xcf, 0xf0,
+ 0x7b, 0x3c, 0xfd, 0xec, 0x2d, 0x32, 0x75, 0xa9,
+ 0xb0, 0x12, 0xf7, 0xb5, 0x04, 0x9b, 0x4a, 0x89,
+ 0x09, 0xd5, 0xc2, 0xf9, 0x81, 0x3b, 0x02, 0x38,
+ 0x18, 0x7a, 0x8e, 0x0a, 0x94, 0x22, 0x22, 0x32,
+ 0x20, 0xf9, 0x41, 0x12, 0x02, 0x11, 0xbc, 0x0e,
+ 0x43, 0x94, 0x7e, 0x3d, 0x35, 0x98, 0xe8, 0xac,
+
+ 0x5b, 0x0a, 0xb1, 0xd7, 0x8e, 0x50, 0xf3, 0x3c,
+ 0xed, 0x19, 0x00, 0xdb, 0x98, 0xdf, 0x1d, 0x5a,
+ 0xf2, 0x2a, 0x54, 0x57, 0xfd, 0x1f, 0xdb, 0xbd,
+ 0x64, 0x83, 0xe0, 0x1e, 0x1d, 0x08, 0x14, 0x59,
+ 0x3a, 0xf6, 0xd2, 0x6a, 0xd7, 0xba, 0x42, 0x7f,
+ 0xca, 0xb4, 0xe9, 0x06, 0x24, 0x9b, 0xbf, 0x67,
+ 0xed, 0x56, 0x3c, 0x65, 0xd6, 0x7f, 0xcf, 0x7c,
+ 0x17, 0xa5, 0x5f, 0x90, 0x22, 0x71, 0x05, 0x00,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512_256.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512_256.inc
new file mode 100644
index 0000000..0159bbf
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512_256.inc
@@ -0,0 +1,68 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn0"
+ * HashAlg : Sha512256
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+ // B
+ 0xcb, 0xc0, 0x78, 0x14, 0xbd, 0x94, 0x6f, 0xe6,
+ 0xeb, 0x43, 0x37, 0x3b, 0x7e, 0x22, 0x79, 0xf4,
+ 0x4d, 0xc1, 0x55, 0x93, 0x7f, 0x5c, 0x22, 0x2f,
+ 0x87, 0x15, 0x18, 0x92, 0xbd, 0x23, 0x15, 0x83,
+ 0x9e, 0x0d, 0x3b, 0x35, 0xe9, 0xd0, 0xdd, 0xd5,
+ 0xd8, 0x99, 0xac, 0x22, 0xaf, 0x2a, 0xa3, 0x52,
+ 0x25, 0xfa, 0x02, 0x50, 0x60, 0x60, 0xd3, 0x07,
+ 0x7a, 0x59, 0xec, 0x8d, 0xb2, 0xf6, 0x6e, 0x2d,
+ // version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2,
+ 0x73, 0x96, 0xfa, 0xd6, 0xf8, 0xfa, 0x2c, 0x39,
+ 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3,
+ 0x74, 0x90, 0xf2, 0xf5, 0x50, 0xe4, 0x69, 0x5d,
+ 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a,
+
+ 0x07, 0x46, 0xed, 0xb8, 0x6a, 0x4e, 0x7f, 0x4b,
+ 0x9d, 0xcc, 0x18, 0x91, 0x88, 0xf6, 0x76, 0x4d,
+ 0x74, 0x02, 0x36, 0x62, 0xe6, 0xd4, 0xb5, 0xf0,
+ 0x2d, 0x70, 0x91, 0x49, 0x65, 0xdf, 0x19, 0x02,
+ 0x30, 0x6c, 0x11, 0xaa, 0x74, 0x8c, 0x55, 0x2e,
+ 0x4b, 0xa3, 0x00, 0x00, 0xb0, 0x38, 0xf4, 0xcd,
+ 0x5d, 0xc9, 0x1d, 0xaa, 0x1e, 0x44, 0x98, 0xa4,
+ 0xe1, 0x3f, 0x2f, 0x4f, 0x6c, 0xc9, 0x15, 0xb0,
+
+ 0x8c, 0x10, 0x2f, 0x17, 0xa0, 0xe4, 0x1f, 0xc6,
+ 0xaa, 0xea, 0xd4, 0x82, 0x67, 0x61, 0x96, 0x47,
+ 0x9b, 0x46, 0x2c, 0x31, 0xbd, 0x29, 0x62, 0x2d,
+ 0xd8, 0x40, 0x44, 0xbc, 0x1d, 0xf0, 0x19, 0x02,
+ 0x4e, 0x4c, 0x2e, 0xc1, 0x0d, 0x43, 0x59, 0x8b,
+ 0xe0, 0x0d, 0xb4, 0x29, 0x20, 0x35, 0x1f, 0xb6,
+ 0x00, 0x07, 0xa3, 0xd9, 0x28, 0xd9, 0x48, 0x08,
+ 0x5e, 0x14, 0xca, 0x56, 0x72, 0xa4, 0xb6, 0x5a,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey003.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey003.inc
new file mode 100644
index 0000000..3009049
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey003.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember003 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey003_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xdd, 0x5d, 0x03, 0xfb, 0xd2, 0x60, 0x36, 0xbc,
+ 0x5c, 0x16, 0xea, 0x9c, 0xd3, 0x47, 0x66, 0xec,
+ 0xc0, 0x71, 0x8b, 0xf8, 0x8e, 0x1c, 0xfb, 0x5b,
+ 0xaf, 0x60, 0x59, 0x78, 0xd0, 0x60, 0xde, 0x20,
+ 0xb3, 0x5c, 0x59, 0xb3, 0x29, 0x2e, 0x71, 0xbc,
+ 0x6d, 0xe9, 0x9d, 0xb5, 0x18, 0xce, 0xfb, 0x44,
+ 0x0f, 0x79, 0xf7, 0xb5, 0x45, 0x4d, 0xcd, 0x6b,
+ 0x6b, 0x42, 0x6b, 0x09, 0x38, 0x1e, 0xca, 0x30,
+ 0x6b, 0xda, 0xf8, 0xef, 0xef, 0x20, 0x38, 0x5a,
+ 0x30, 0xd3, 0xb8, 0x01, 0x0a, 0x3e, 0x76, 0x1e,
+ 0xaa, 0x60, 0x64, 0x43, 0x7c, 0x68, 0xcc, 0xfc,
+ 0xaf, 0x94, 0x4b, 0x61, 0x00, 0x54, 0x08, 0xa9,
+ 0x15, 0xa3, 0x46, 0xeb, 0x8d, 0x36, 0xcc, 0x1e,
+ 0x4c, 0x00, 0xe5, 0x71, 0xef, 0xea, 0xb2, 0x6a,
+ 0x7a, 0x1e, 0xba, 0x98, 0x68, 0x58, 0xd3, 0x02,
+ 0x98, 0xdd, 0x9b, 0xd1, 0x9c, 0x8e, 0x98, 0xec
+//};
+//unsigned int mprivkey003_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey004.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey004.inc
new file mode 100644
index 0000000..253228e
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey004.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember004 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey004_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0xe9, 0x8d, 0x15, 0x88, 0xd4, 0x83, 0xc0, 0x70,
+ 0x60, 0xa8, 0xce, 0x0f, 0x13, 0x03, 0x4b, 0xc8,
+ 0x8d, 0xec, 0x33, 0xc0, 0x85, 0x1e, 0x3c, 0x69,
+ 0x6f, 0x87, 0x79, 0x51, 0x95, 0xe6, 0x1b, 0x35,
+ 0xf6, 0x15, 0x84, 0x40, 0x00, 0x91, 0xc8, 0x6c,
+ 0x67, 0xd0, 0x64, 0xd9, 0x1a, 0x45, 0xbb, 0x12,
+ 0x4f, 0xb1, 0xfd, 0x09, 0x8c, 0x1c, 0x8d, 0x5e,
+ 0xee, 0x8d, 0x69, 0x4f, 0x83, 0x19, 0x68, 0x0c,
+ 0x6e, 0xfe, 0xc2, 0x46, 0x89, 0xef, 0x6d, 0x26,
+ 0x7d, 0xd2, 0xd4, 0x6f, 0x05, 0xc2, 0x6e, 0x51,
+ 0x04, 0x2c, 0x6c, 0x7a, 0xfb, 0x5b, 0x25, 0x71,
+ 0x46, 0x39, 0xff, 0x88, 0x6d, 0xea, 0x16, 0x9a,
+ 0x90, 0x18, 0x15, 0xdd, 0x12, 0x04, 0x86, 0xba,
+ 0x8c, 0xfb, 0x41, 0x5f, 0x9f, 0xc8, 0x36, 0x4f,
+ 0xd5, 0x44, 0xa8, 0xdc, 0x16, 0x1f, 0xd2, 0x3a,
+ 0x30, 0x4b, 0xb3, 0xfa, 0xbf, 0x57, 0x46, 0xe2
+//};
+//unsigned int mprivkey004_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey005.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey005.inc
new file mode 100644
index 0000000..0bf76c8
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/mprivkey005.inc
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Member private key
+ * Group : grpX
+ * Signer : verrevokedmember005 (revoked in grpX bsn0 verrl)
+ */
+
+//unsigned char mprivkey005_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x0c, 0x1e, 0x00, 0x97, 0x9e, 0xc0, 0x35, 0xfb,
+ 0x1d, 0xca, 0x18, 0xb5, 0xef, 0x29, 0x5c, 0x04,
+ 0xe1, 0xcc, 0xec, 0x37, 0x6e, 0x5b, 0x45, 0x23,
+ 0xf6, 0xb2, 0xf4, 0x34, 0x36, 0x19, 0x6c, 0xc1,
+ 0x0c, 0xb4, 0x29, 0xa6, 0xe0, 0x1d, 0x53, 0x3a,
+ 0xdd, 0xeb, 0xcb, 0x72, 0x2c, 0x76, 0x75, 0x99,
+ 0x67, 0xc7, 0x4f, 0xf9, 0x8f, 0x37, 0x6f, 0x49,
+ 0x0a, 0xe3, 0xe6, 0xa3, 0x0b, 0xfb, 0xb7, 0xfc,
+ 0xe5, 0x36, 0x11, 0x6d, 0x5d, 0xc1, 0x8b, 0x72,
+ 0x75, 0xc6, 0x1d, 0xe3, 0x5a, 0x98, 0x77, 0x20,
+ 0xcd, 0x27, 0xb7, 0x26, 0xfb, 0x7f, 0xfc, 0x94,
+ 0x35, 0x58, 0xfc, 0x3f, 0x35, 0x87, 0x32, 0x05,
+ 0x77, 0x1c, 0x5b, 0xc0, 0xc7, 0xe5, 0x00, 0xa2,
+ 0x47, 0xd2, 0x0a, 0x67, 0xa7, 0x1b, 0x15, 0x0c,
+ 0xc6, 0xb9, 0x7a, 0xd2, 0xad, 0x55, 0x58, 0x8d,
+ 0x7f, 0xa9, 0x6e, 0x44, 0x57, 0xc2, 0x5f, 0xe8
+//};
+//unsigned int mprivkey005_dat_len = 144;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc
new file mode 100644
index 0000000..25a00f8
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : grpX
+ * Signer : verrevoked/bsn1/mprivkey003
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn1"
+ * SigRl : group x sigrl
+ */
+//unsigned char sig_revoked3msg0bsn1_dat[] = {
+ 0x4b, 0xb3, 0x62, 0x6c, 0xa5, 0x12, 0xaa, 0x7a,
+ 0x22, 0x7f, 0xde, 0xf0, 0x8f, 0x1e, 0x3c, 0xc8,
+ 0xda, 0x5f, 0x2f, 0x6d, 0x3b, 0xd0, 0x42, 0xec,
+ 0x62, 0xbf, 0x3c, 0x0f, 0xae, 0xd4, 0xf9, 0xa0,
+ 0x56, 0xc9, 0xd5, 0x33, 0xaa, 0x60, 0xab, 0x86,
+ 0x15, 0x48, 0xc2, 0xbb, 0xda, 0x3f, 0x37, 0x71,
+ 0x3e, 0xf2, 0xd5, 0x3c, 0xd3, 0xb9, 0x08, 0xa0,
+ 0x63, 0x26, 0x6e, 0x26, 0xca, 0x93, 0xc1, 0xe1,
+ 0x5a, 0x6b, 0xd9, 0x27, 0x3a, 0x6e, 0x51, 0xd6,
+ 0xe4, 0xc0, 0x83, 0xa7, 0x2d, 0xab, 0xd4, 0x57,
+ 0x07, 0xf3, 0xaa, 0xb2, 0xac, 0xbf, 0x21, 0x46,
+ 0x2e, 0xba, 0x8c, 0xc6, 0xb9, 0x6c, 0xcd, 0xbb,
+ 0xc0, 0x94, 0x3b, 0x1b, 0x45, 0xa9, 0x0a, 0x64,
+ 0x3e, 0x2c, 0x92, 0x02, 0x69, 0xfb, 0x72, 0x9b,
+ 0xe6, 0xf9, 0x06, 0x82, 0x01, 0x01, 0x43, 0x19,
+ 0xca, 0xea, 0x70, 0x01, 0x51, 0xae, 0x91, 0xad,
+ 0x1c, 0x6f, 0x78, 0x8c, 0xfd, 0x47, 0xdc, 0xb2,
+ 0xaa, 0xa4, 0x85, 0x1b, 0xb4, 0xa1, 0x2e, 0xcd,
+ 0x17, 0xad, 0x60, 0x11, 0x85, 0x01, 0x97, 0xe6,
+ 0x73, 0xd3, 0x19, 0x1b, 0x92, 0xb5, 0xd8, 0x75,
+ 0xf0, 0x26, 0x11, 0x44, 0xef, 0x03, 0x69, 0x39,
+ 0xb3, 0x00, 0xdc, 0x18, 0x79, 0xaf, 0x7a, 0x2c,
+ 0xc7, 0xdf, 0x26, 0xdb, 0x48, 0xb3, 0x39, 0x1f,
+ 0x5f, 0x29, 0xda, 0x3e, 0x43, 0x7f, 0xf3, 0x8e,
+ 0x81, 0x8c, 0x56, 0x3a, 0xec, 0xc8, 0xb8, 0x7c,
+ 0x53, 0xfc, 0x14, 0x8e, 0x84, 0x68, 0xff, 0x17,
+ 0x3d, 0x0c, 0x97, 0x42, 0xf7, 0x42, 0x09, 0xa5,
+ 0xcf, 0x5d, 0x29, 0x1b, 0xdb, 0x97, 0x32, 0xb1,
+ 0x39, 0x42, 0x66, 0xe2, 0x7b, 0x24, 0x47, 0x61,
+ 0xf3, 0x0b, 0x2a, 0x84, 0x74, 0xd4, 0xb0, 0x1b,
+ 0x88, 0x93, 0xc0, 0xa7, 0xf3, 0x6d, 0x28, 0x17,
+ 0x46, 0x15, 0xd9, 0x32, 0x86, 0xf2, 0x9a, 0x56,
+ 0xfa, 0x72, 0xf7, 0xa0, 0x60, 0x75, 0xb0, 0x40,
+ 0x76, 0x7c, 0xe4, 0x7f, 0x97, 0xd6, 0xc2, 0x1d,
+ 0x1e, 0xaf, 0xd8, 0xaf, 0x32, 0xeb, 0x7b, 0x2c,
+ 0xc1, 0x45, 0xcc, 0xe1, 0xec, 0x2c, 0xe5, 0x46,
+ 0x09, 0x60, 0x12, 0xd7, 0xae, 0xa1, 0xa4, 0xf0,
+ 0x4d, 0x46, 0xd6, 0x6d, 0x79, 0xba, 0x34, 0x37,
+ 0x5d, 0xc5, 0x3b, 0x2c, 0xba, 0x88, 0x7b, 0xf4,
+ 0xf6, 0xbe, 0x47, 0x18, 0x60, 0xb5, 0x47, 0xfc,
+ 0x1e, 0xaf, 0xf8, 0xaf, 0x71, 0x94, 0xe5, 0xeb,
+ 0xf2, 0x68, 0xc0, 0x73, 0x16, 0xdf, 0x6d, 0x1f,
+ 0x7e, 0x25, 0x1f, 0x17, 0x96, 0x6f, 0x93, 0x26,
+ 0xb4, 0x56, 0x63, 0xe7, 0x45, 0x7f, 0x33, 0xc6,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0xeb, 0xcf, 0x05, 0xca, 0xa9, 0x85, 0xed, 0xc1,
+ 0x61, 0xd4, 0x73, 0xe8, 0xd9, 0xe3, 0x9a, 0xee,
+ 0x9e, 0x3c, 0x9e, 0x2a, 0x9e, 0x9f, 0xc8, 0x83,
+ 0x3a, 0x31, 0x92, 0xf0, 0x46, 0x57, 0xb9, 0x9e,
+ 0xab, 0xfe, 0xee, 0xdd, 0x1c, 0x63, 0x24, 0x5a,
+ 0x97, 0x61, 0xa6, 0x76, 0x5b, 0xa4, 0x03, 0x70,
+ 0x65, 0xc5, 0x2b, 0x97, 0x5b, 0xce, 0x97, 0x90,
+ 0xdb, 0x55, 0x90, 0xb1, 0x1d, 0x3c, 0xf4, 0x2e,
+ 0xf7, 0x3b, 0x1c, 0x29, 0xd4, 0x80, 0x07, 0x19,
+ 0x68, 0x04, 0x65, 0x7c, 0x35, 0x43, 0x71, 0x19,
+ 0xe9, 0x32, 0x03, 0x1f, 0xa5, 0xf7, 0x99, 0x32,
+ 0x0b, 0xa8, 0xe4, 0xf0, 0x63, 0xb9, 0x1a, 0x79,
+ 0x4f, 0x82, 0xe2, 0xab, 0x2c, 0xb3, 0xb0, 0xff,
+ 0x33, 0xdc, 0xa9, 0xaf, 0x52, 0x2c, 0x16, 0x3d,
+ 0xf3, 0x49, 0x17, 0xd4, 0xaf, 0xf3, 0xbe, 0x51,
+ 0xca, 0xa8, 0x46, 0xf6, 0x15, 0xac, 0xea, 0x99,
+ 0x71, 0x37, 0xd5, 0x12, 0x57, 0xf0, 0xa1, 0x75,
+ 0xe5, 0x87, 0xe3, 0x42, 0xbc, 0xc5, 0xbb, 0xcf,
+ 0x7a, 0x53, 0xca, 0x9d, 0xd0, 0xb7, 0x15, 0x29,
+ 0x72, 0xfc, 0x75, 0x97, 0x55, 0x0b, 0xbf, 0xc7,
+ 0x6d, 0x54, 0x7a, 0x47, 0x0e, 0xb9, 0x30, 0xe1,
+ 0xf1, 0x0e, 0x98, 0x96, 0x33, 0x0f, 0x86, 0xbf,
+ 0x95, 0xf9, 0xa0, 0x74, 0x16, 0xbb, 0x64, 0xa0,
+ 0x4c, 0x91, 0x01, 0x9c, 0xa6, 0x17, 0x25, 0xab,
+ 0xe5, 0x87, 0xcb, 0x9b, 0x47, 0x10, 0x2d, 0x69,
+ 0xb8, 0x50, 0x67, 0x59, 0x26, 0xfe, 0xf5, 0x02,
+ 0x64, 0x82, 0x5e, 0xcd, 0x8e, 0x32, 0x0b, 0x5d,
+ 0x81, 0x65, 0x20, 0x9c, 0xd7, 0x6a, 0x46, 0xdd,
+ 0xb4, 0x86, 0xf9, 0x39, 0x20, 0xc7, 0xd8, 0x1a,
+ 0x29, 0xf2, 0xc6, 0x46, 0x7d, 0x08, 0xcc, 0x2e,
+ 0xba, 0xe4, 0x36, 0x0e, 0x52, 0xb3, 0xa8, 0xdf,
+ 0x25, 0xcd, 0x68, 0x5e, 0xeb, 0xb6, 0x4a, 0xd1,
+ 0xc9, 0x15, 0xef, 0x47, 0x0a, 0x5b, 0xeb, 0xf5,
+ 0xd2, 0xc4, 0x00, 0xc9, 0x43, 0x00, 0xe2, 0xba,
+ 0xca, 0xf4, 0x71, 0xbc, 0x39, 0xe5, 0x68, 0x8a,
+ 0x1a, 0x48, 0xc6, 0x71, 0x34, 0xaf, 0x75, 0x6d,
+ 0xdc, 0xb2, 0x3c, 0xd3, 0x31, 0x21, 0xd0, 0xd0,
+ 0x00, 0x2a, 0xa1, 0x5d, 0xe4, 0xc8, 0x8c, 0x86,
+ 0x07, 0x55, 0x2d, 0x2d, 0x8f, 0x94, 0x55, 0x05,
+ 0xd8, 0x2d, 0x4f, 0x26, 0xfe, 0x54, 0x88, 0xb0,
+ 0xac, 0xbd, 0xfc, 0x20, 0x13, 0xe8, 0x63, 0xf0,
+ 0x22, 0x17, 0x56, 0x6f, 0x3d, 0xe4, 0xc4, 0x08,
+ 0x28, 0xe5, 0x5b, 0x58, 0xed, 0x59, 0xf5, 0xe4,
+ 0x14, 0xf5, 0x10, 0xf6, 0x75, 0x3c, 0xe4, 0xaf,
+ 0xdf, 0xb2, 0x47, 0xa8, 0xb5, 0xc5, 0x25, 0x5a,
+ 0x5e, 0xeb, 0x03, 0x06, 0x18, 0x27, 0xfe, 0x96,
+ 0x92, 0x0b, 0x83, 0x7e, 0x23, 0x54, 0x7f, 0x87,
+ 0x1e, 0xfc, 0x63, 0x40, 0xab, 0xf0, 0xc7, 0x6a,
+ 0x64, 0x31, 0xed, 0xaf, 0xab, 0xbd, 0xbc, 0xa9,
+ 0x40, 0xf6, 0xde, 0xf5, 0xdd, 0x92, 0x98, 0xd4,
+ 0xb1, 0xa0, 0xe2, 0x13, 0x55, 0x05, 0x65, 0xb8,
+ 0x2c, 0x5f, 0x7e, 0xd3, 0x3f, 0xb6, 0xf4, 0x9b,
+ 0x3c, 0x2c, 0x1a, 0xc3, 0x30, 0x21, 0x15, 0xcc,
+ 0x98, 0x41, 0x01, 0x05, 0xa6, 0x9a, 0x2a, 0xd8,
+ 0x38, 0xd8, 0x55, 0x3f, 0xb7, 0x62, 0xaf, 0x36,
+ 0xc3, 0xc7, 0x0a, 0x16, 0x17, 0x98, 0x5c, 0xe5,
+ 0x57, 0x10, 0x6b, 0xdd, 0x1d, 0x9b, 0xb6, 0x40,
+ 0x85, 0xe5, 0xc1, 0xb0, 0x97, 0x8c, 0xbf, 0x31,
+ 0x54, 0x73, 0x62, 0xef, 0xa0, 0x05, 0x49, 0xf0,
+ 0xb0, 0xe7, 0x11, 0x1d, 0xf7, 0xae, 0x17, 0x1d
+//};
+//unsigned int sig_revoked3msg0bsn1_dat_len = 840;
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl.inc
new file mode 100644
index 0000000..3f1b784
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl.inc
@@ -0,0 +1,70 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn1"
+ * HashAlg : Sha256
+ * Revoked : verrevoked/mprivatekey003
+ * verrevoked/mprivatekey004
+ * verrevoked/mprivatekey005
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x4b, 0xb3, 0x62, 0x6c, 0xa5, 0x12, 0xaa, 0x7a,
+ 0x22, 0x7f, 0xde, 0xf0, 0x8f, 0x1e, 0x3c, 0xc8,
+ 0xda, 0x5f, 0x2f, 0x6d, 0x3b, 0xd0, 0x42, 0xec,
+ 0x62, 0xbf, 0x3c, 0x0f, 0xae, 0xd4, 0xf9, 0xa0,
+ 0x56, 0xc9, 0xd5, 0x33, 0xaa, 0x60, 0xab, 0x86,
+ 0x15, 0x48, 0xc2, 0xbb, 0xda, 0x3f, 0x37, 0x71,
+ 0x3e, 0xf2, 0xd5, 0x3c, 0xd3, 0xb9, 0x08, 0xa0,
+ 0x63, 0x26, 0x6e, 0x26, 0xca, 0x93, 0xc1, 0xe1,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0x5a, 0x6b, 0xd9, 0x27, 0x3a, 0x6e, 0x51, 0xd6,
+ 0xe4, 0xc0, 0x83, 0xa7, 0x2d, 0xab, 0xd4, 0x57,
+ 0x07, 0xf3, 0xaa, 0xb2, 0xac, 0xbf, 0x21, 0x46,
+ 0x2e, 0xba, 0x8c, 0xc6, 0xb9, 0x6c, 0xcd, 0xbb,
+ 0xc0, 0x94, 0x3b, 0x1b, 0x45, 0xa9, 0x0a, 0x64,
+ 0x3e, 0x2c, 0x92, 0x02, 0x69, 0xfb, 0x72, 0x9b,
+ 0xe6, 0xf9, 0x06, 0x82, 0x01, 0x01, 0x43, 0x19,
+ 0xca, 0xea, 0x70, 0x01, 0x51, 0xae, 0x91, 0xad,
+ 0x5d, 0xb7, 0x24, 0xf8, 0xbc, 0xff, 0x55, 0x1a,
+
+ 0x34, 0xd9, 0x4d, 0xf5, 0xa8, 0x13, 0x4c, 0x41,
+ 0x3c, 0x52, 0x9c, 0xde, 0x8b, 0x08, 0x9d, 0x3a,
+ 0xa0, 0xc9, 0xe9, 0xd6, 0x33, 0x9c, 0x05, 0x43,
+ 0x8c, 0x78, 0x63, 0xaf, 0x6d, 0x64, 0x5a, 0x0e,
+ 0x36, 0xce, 0xc4, 0xba, 0x94, 0xf9, 0x2f, 0xa9,
+ 0xce, 0x81, 0xea, 0xa9, 0x2a, 0xe4, 0x4d, 0x6b,
+ 0xec, 0xd3, 0xdd, 0xe1, 0x8b, 0x82, 0x1a, 0x54,
+ 0xeb, 0x23, 0x56, 0x4b, 0xb1, 0xe5, 0xa4, 0x25,
+
+ 0x34, 0x89, 0xd7, 0x46, 0xb8, 0xcb, 0xed, 0xa1,
+ 0x1c, 0x92, 0xa9, 0xfd, 0x57, 0x56, 0xdf, 0x62,
+ 0x2e, 0x7d, 0x31, 0x44, 0x4a, 0x7d, 0xa2, 0x29,
+ 0x07, 0x1e, 0x51, 0xcc, 0x89, 0x8e, 0xee, 0xc4,
+ 0xda, 0x34, 0x93, 0x0f, 0x6a, 0xd0, 0x7b, 0x17,
+ 0x06, 0x78, 0x84, 0x37, 0x59, 0x5c, 0xcc, 0xa3,
+ 0x84, 0xb2, 0x95, 0x15, 0x5a, 0x58, 0xbe, 0x1f,
+ 0xe4, 0x21, 0x01, 0x39, 0xba, 0x27, 0x3e, 0xc8,
diff --git a/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc
new file mode 100644
index 0000000..dc6e732
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 verifier revocation list
+ * Group : grpX
+ * Bsn : "bsn1"
+ * HashAlg : Sha256
+ * Revoked : verrevoked/mprivatekey000
+ * verrevoked/mprivatekey001
+ * verrevoked/mprivatekey002
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+
+// B
+ 0x4b, 0xb3, 0x62, 0x6c, 0xa5, 0x12, 0xaa, 0x7a,
+ 0x22, 0x7f, 0xde, 0xf0, 0x8f, 0x1e, 0x3c, 0xc8,
+ 0xda, 0x5f, 0x2f, 0x6d, 0x3b, 0xd0, 0x42, 0xec,
+ 0x62, 0xbf, 0x3c, 0x0f, 0xae, 0xd4, 0xf9, 0xa0,
+ 0x56, 0xc9, 0xd5, 0x33, 0xaa, 0x60, 0xab, 0x86,
+ 0x15, 0x48, 0xc2, 0xbb, 0xda, 0x3f, 0x37, 0x71,
+ 0x3e, 0xf2, 0xd5, 0x3c, 0xd3, 0xb9, 0x08, 0xa0,
+ 0x63, 0x26, 0x6e, 0x26, 0xca, 0x93, 0xc1, 0xe1,
+
+// version | n4
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+
+ 0x8b, 0xc9, 0x6e, 0xc0, 0x86, 0x04, 0x6f, 0x6c,
+ 0x89, 0xc2, 0x27, 0xfd, 0x61, 0x59, 0xb5, 0xd2,
+ 0x73, 0x96, 0xfa, 0xd6, 0xf8, 0xfa, 0x2c, 0x39,
+ 0xfe, 0xee, 0xef, 0x3e, 0x73, 0xd2, 0x38, 0x3f,
+ 0x3c, 0x04, 0x07, 0x78, 0xfd, 0x32, 0x9b, 0xc3,
+ 0x74, 0x90, 0xf2, 0xf5, 0x50, 0xe4, 0x69, 0x5d,
+ 0x30, 0x0c, 0x6a, 0x8a, 0x9c, 0xcf, 0xff, 0x78,
+ 0x28, 0x52, 0x6d, 0x20, 0x29, 0xef, 0x2d, 0x7a,
+
+ 0x07, 0x46, 0xed, 0xb8, 0x6a, 0x4e, 0x7f, 0x4b,
+ 0x9d, 0xcc, 0x18, 0x91, 0x88, 0xf6, 0x76, 0x4d,
+ 0x74, 0x02, 0x36, 0x62, 0xe6, 0xd4, 0xb5, 0xf0,
+ 0x2d, 0x70, 0x91, 0x49, 0x65, 0xdf, 0x19, 0x02,
+ 0x30, 0x6c, 0x11, 0xaa, 0x74, 0x8c, 0x55, 0x2e,
+ 0x4b, 0xa3, 0x00, 0x00, 0xb0, 0x38, 0xf4, 0xcd,
+ 0x5d, 0xc9, 0x1d, 0xaa, 0x1e, 0x44, 0x98, 0xa4,
+ 0xe1, 0x3f, 0x2f, 0x4f, 0x6c, 0xc9, 0x15, 0xb0,
+
+ 0x8c, 0x10, 0x2f, 0x17, 0xa0, 0xe4, 0x1f, 0xc6,
+ 0xaa, 0xea, 0xd4, 0x82, 0x67, 0x61, 0x96, 0x47,
+ 0x9b, 0x46, 0x2c, 0x31, 0xbd, 0x29, 0x62, 0x2d,
+ 0xd8, 0x40, 0x44, 0xbc, 0x1d, 0xf0, 0x19, 0x02,
+ 0x4e, 0x4c, 0x2e, 0xc1, 0x0d, 0x43, 0x59, 0x8b,
+ 0xe0, 0x0d, 0xb4, 0x29, 0x20, 0x35, 0x1f, 0xb6,
+ 0x00, 0x07, 0xa3, 0xd9, 0x28, 0xd9, 0x48, 0x08,
+ 0x5e, 0x14, 0xca, 0x56, 0x72, 0xa4, 0xb6, 0x5a,
diff --git a/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.dat b/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.dat
new file mode 100644
index 0000000..9c0f0a4
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.dat
Binary files differ
diff --git a/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc b/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc
new file mode 100644
index 0000000..c1fc635
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 compressed private key
+ * Group : grpY
+ * Signer : member9
+ */
+//unsigned char cmpprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
+ 0x27, 0x8d, 0x99, 0x27, 0x35, 0x78, 0x6d, 0xf6,
+ 0x24, 0xdc, 0x18, 0x4d, 0xc0, 0xd5, 0x2c, 0xde,
+ 0x0d, 0xb1, 0x2c, 0x26, 0x6f, 0x02, 0xae, 0x41,
+ 0x80, 0xc2, 0xab, 0x2a, 0xa9, 0xd8, 0x3a, 0xbc,
+ 0x1d, 0x41, 0xca, 0x59, 0x4f, 0x40, 0xfe, 0x20,
+ 0x59, 0x1e, 0xdb, 0x28, 0x5a, 0x23, 0x6b, 0xce,
+ 0x21, 0x27, 0x66, 0xa2, 0x05, 0x97, 0xb7, 0x8d,
+ 0x27, 0xd8, 0x9d, 0xca, 0x37, 0x7d, 0x77, 0x30
+//};
+//unsigned int cmpprivkey_dat_len = 80;
diff --git a/epid/common-testhelper/testdata/grp_y/iprivkey.inc b/epid/common-testhelper/testdata/grp_y/iprivkey.inc
new file mode 100644
index 0000000..d5444a8
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_y/iprivkey.inc
@@ -0,0 +1,32 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 issuing private key
+ * Group : grpY
+ */
+
+//unsigned char iprivkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
+ 0x77, 0x65, 0xc8, 0xd0, 0x47, 0x53, 0x1e, 0xab,
+ 0x30, 0x57, 0x01, 0x49, 0x51, 0x26, 0xbf, 0xa2,
+ 0x00, 0xa4, 0x67, 0x12, 0x7a, 0x70, 0x40, 0x29,
+ 0x32, 0x95, 0x0d, 0x37, 0x6a, 0x53, 0xd7, 0x9e
+//};
+//unsigned int iprivkey_dat_len = 48;
diff --git a/epid/common-testhelper/testdata/grp_y/pubkey.inc b/epid/common-testhelper/testdata/grp_y/pubkey.inc
new file mode 100644
index 0000000..592241a
--- /dev/null
+++ b/epid/common-testhelper/testdata/grp_y/pubkey.inc
@@ -0,0 +1,59 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group public key
+ * Group : grpY
+ */
+//unsigned char pubkey_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
+ 0x8f, 0x23, 0xda, 0x77, 0xed, 0xda, 0x2f, 0x0b,
+ 0x5b, 0xe8, 0x99, 0x6b, 0xf4, 0x52, 0x09, 0x5b,
+ 0xf2, 0x00, 0x77, 0x4e, 0xea, 0x44, 0x58, 0x4e,
+ 0x1c, 0x5c, 0xd6, 0x02, 0x77, 0xea, 0x99, 0x2f,
+ 0x75, 0xef, 0x33, 0xd6, 0x83, 0xe0, 0xc4, 0xdb,
+ 0x57, 0x48, 0x69, 0x27, 0xad, 0x69, 0xe5, 0x05,
+ 0xef, 0xda, 0xaa, 0x0e, 0xef, 0x41, 0xc5, 0x09,
+ 0xcd, 0x3e, 0x27, 0xb9, 0xce, 0x80, 0x28, 0xc9,
+ 0x76, 0x9d, 0x10, 0x18, 0x26, 0xa3, 0x51, 0xe8,
+ 0x3e, 0x3c, 0xb6, 0x29, 0xaa, 0x57, 0x84, 0x68,
+ 0x2f, 0x75, 0xc8, 0x51, 0xd4, 0xab, 0xed, 0x76,
+ 0x87, 0xb8, 0xbf, 0xf2, 0x14, 0x2f, 0xd2, 0x1e,
+ 0x18, 0xc8, 0x6a, 0xe1, 0xf4, 0xaf, 0xec, 0x47,
+ 0xe7, 0x00, 0xea, 0x18, 0x8e, 0xcf, 0x05, 0xdb,
+ 0x46, 0x78, 0xf5, 0xd8, 0xe7, 0xa8, 0x08, 0x5c,
+ 0xa1, 0xcb, 0x12, 0x14, 0x73, 0x74, 0x75, 0x35,
+ 0x09, 0x3b, 0x39, 0x52, 0x02, 0xa1, 0xbf, 0xcf,
+ 0x0b, 0xb0, 0x77, 0xc6, 0x9d, 0x3e, 0x50, 0x67,
+ 0x7d, 0x36, 0x9a, 0xb6, 0x84, 0x62, 0xd4, 0x09,
+ 0x6c, 0xef, 0xd7, 0x11, 0xce, 0x64, 0xf4, 0xe2,
+ 0x79, 0x58, 0x3c, 0x7a, 0x96, 0x2a, 0x8f, 0xaa,
+ 0x0f, 0xe1, 0x1a, 0xbd, 0x3a, 0x50, 0x1c, 0x29,
+ 0x24, 0x0d, 0xe7, 0xfc, 0xb5, 0xf4, 0x02, 0xaf,
+ 0x5e, 0xb0, 0xda, 0x52, 0x23, 0x40, 0x33, 0x2c,
+ 0xcf, 0xf9, 0xda, 0xf7, 0x38, 0x9a, 0xd3, 0x0f,
+ 0x69, 0x38, 0xec, 0x77, 0xd0, 0xe0, 0x30, 0x8a,
+ 0x66, 0x03, 0x5c, 0xd0, 0x05, 0x03, 0x87, 0xe6,
+ 0x5d, 0xef, 0x86, 0xe7, 0xf6, 0x8b, 0x04, 0xf8,
+ 0x30, 0x28, 0x9d, 0x22, 0xe6, 0xee, 0x40, 0x48,
+ 0x46, 0x5a, 0x2b, 0xff, 0xf2, 0xd4, 0x70, 0xf8,
+ 0x7e, 0x91, 0xea, 0x51, 0xac, 0x0b, 0xbd, 0xfc,
+ 0xe1, 0x91, 0xe1, 0x37, 0xb8, 0x11, 0xce, 0x6e
+//};
+//unsigned int pubkey_dat_len = 272;
diff --git a/epid/common-testhelper/testdata/grprl.inc b/epid/common-testhelper/testdata/grprl.inc
new file mode 100644
index 0000000..3968e0d
--- /dev/null
+++ b/epid/common-testhelper/testdata/grprl.inc
@@ -0,0 +1,26 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list
+ * Group : grpX
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+//};
+//unsigned int grprl_dat_len = 8;
diff --git a/epid/common-testhelper/testdata/grprl_revoked_grp_x_first_entry.inc b/epid/common-testhelper/testdata/grprl_revoked_grp_x_first_entry.inc
new file mode 100644
index 0000000..5cad583
--- /dev/null
+++ b/epid/common-testhelper/testdata/grprl_revoked_grp_x_first_entry.inc
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list grpX revoked first entry
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x67, 0x56, 0x34, 0x21
+//};
+//unsigned int grprl_dat_len = 56;
diff --git a/epid/common-testhelper/testdata/grprl_revoked_grp_x_last_entry.inc b/epid/common-testhelper/testdata/grprl_revoked_grp_x_last_entry.inc
new file mode 100644
index 0000000..0c9dcad
--- /dev/null
+++ b/epid/common-testhelper/testdata/grprl_revoked_grp_x_last_entry.inc
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list grpX revoked last entry
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x67, 0x56, 0x34, 0x21,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+//};
+//unsigned int grprl_dat_len = 56;
diff --git a/epid/common-testhelper/testdata/grprl_revoked_grp_x_middle_entry.inc b/epid/common-testhelper/testdata/grprl_revoked_grp_x_middle_entry.inc
new file mode 100644
index 0000000..258273e
--- /dev/null
+++ b/epid/common-testhelper/testdata/grprl_revoked_grp_x_middle_entry.inc
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list grpX revoked middle entry
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x67, 0x56, 0x34, 0x21
+//};
+//unsigned int grprl_dat_len = 56;
diff --git a/epid/common-testhelper/testdata/grprl_single_entry_revoked_grp_x.inc b/epid/common-testhelper/testdata/grprl_single_entry_revoked_grp_x.inc
new file mode 100644
index 0000000..17573e4
--- /dev/null
+++ b/epid/common-testhelper/testdata/grprl_single_entry_revoked_grp_x.inc
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list single entry grpX revoked
+ */
+//unsigned char grprl_dat[] = {
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xee
+//};
+//unsigned int grprl_dat_len = 24;
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc b/epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc
new file mode 100644
index 0000000..0fae8b7
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc
@@ -0,0 +1,106 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 member precomp
+ * Group : GroupA
+ * Member : 0
+ * Issuer : Ikgf
+ */
+ 0xbc, 0x74, 0xd9, 0xd2, 0xcc, 0x56, 0x28, 0xfd, 0x3d, 0x0b, 0x2b, 0x86,
+ 0xf4, 0xc6, 0xb2, 0x25, 0x19, 0x6b, 0x5b, 0x42, 0x35, 0x6a, 0xd9, 0x9c,
+ 0xf9, 0xb4, 0x30, 0xcb, 0xff, 0x39, 0xbb, 0x92, 0x41, 0x71, 0xf4, 0x49,
+ 0xc3, 0xfd, 0x36, 0xa3, 0xe0, 0xdd, 0x83, 0xf1, 0x34, 0x53, 0x2e, 0x16,
+ 0x2f, 0x45, 0x06, 0x10, 0x3d, 0x9a, 0xfd, 0x22, 0xb8, 0xf1, 0xfd, 0x52,
+ 0x3a, 0x24, 0xc5, 0x9c, 0xdd, 0x54, 0x9c, 0xff, 0xb0, 0x4d, 0xb9, 0xe5,
+ 0x21, 0x62, 0x61, 0xaa, 0x76, 0xc3, 0xc1, 0x25, 0x47, 0xe4, 0x3b, 0x62,
+ 0xab, 0x5f, 0x2c, 0x56, 0xe1, 0x24, 0x9c, 0x21, 0xec, 0x6b, 0x1d, 0x80,
+ 0x1d, 0xca, 0xc5, 0x45, 0x34, 0xee, 0x4e, 0xc6, 0x20, 0x94, 0x14, 0x98,
+ 0x0e, 0xd6, 0x88, 0x1d, 0x69, 0xfd, 0x25, 0xd3, 0xe3, 0x08, 0x3f, 0x62,
+ 0x82, 0xa9, 0xf2, 0x13, 0xd6, 0x54, 0xda, 0x12, 0xec, 0x4e, 0xd2, 0x92,
+ 0xe1, 0x82, 0x3f, 0x54, 0xf8, 0xc7, 0x0e, 0x21, 0x90, 0x49, 0xa1, 0x73,
+ 0xa2, 0x03, 0xd0, 0xc7, 0x1c, 0xc2, 0x36, 0x1f, 0xb5, 0x8e, 0x22, 0xaf,
+ 0xb5, 0x96, 0xad, 0xba, 0xde, 0xe6, 0x45, 0xb9, 0xee, 0x39, 0x74, 0x53,
+ 0x62, 0x68, 0xa6, 0x37, 0x33, 0x65, 0x47, 0x3b, 0xf2, 0xa3, 0x35, 0xd0,
+ 0xe9, 0x50, 0x49, 0x68, 0x23, 0x9a, 0xa0, 0x33, 0x66, 0x2f, 0x84, 0x23,
+ 0x43, 0x95, 0x35, 0xea, 0x1d, 0xfe, 0x3a, 0xe4, 0x45, 0x6f, 0xad, 0x86,
+ 0x7a, 0x4b, 0xf8, 0xb7, 0x32, 0xaf, 0x79, 0x7c, 0x45, 0x8d, 0xd9, 0x36,
+ 0x0d, 0x66, 0xcb, 0x47, 0x07, 0xf4, 0x75, 0xae, 0x38, 0xe1, 0x32, 0x67,
+ 0x80, 0x73, 0x0b, 0x98, 0xb7, 0x8d, 0xa3, 0x03, 0x94, 0x59, 0x0c, 0x04,
+ 0xa8, 0x3e, 0xf8, 0x39, 0xc9, 0x25, 0x74, 0xb5, 0x9c, 0x62, 0x79, 0xb9,
+ 0xf0, 0x20, 0x0b, 0x41, 0xb1, 0x76, 0x2a, 0x93, 0x15, 0xfa, 0x7a, 0x55,
+ 0xe4, 0x50, 0xf3, 0xe1, 0x54, 0xf8, 0x9e, 0x42, 0x84, 0xaf, 0xb6, 0xc2,
+ 0x2e, 0x98, 0xd5, 0xfd, 0x31, 0xe4, 0x16, 0x2b, 0x4d, 0x32, 0x96, 0x04,
+ 0x4f, 0xca, 0x8b, 0x8d, 0x3c, 0x24, 0xb4, 0xc3, 0x86, 0x3b, 0x06, 0xc9,
+ 0x45, 0xc9, 0xb1, 0x90, 0xac, 0xc3, 0xd6, 0xec, 0x80, 0x5b, 0x84, 0xcb,
+ 0x5e, 0x7b, 0xc4, 0xcb, 0x63, 0x9e, 0xca, 0x09, 0x92, 0xca, 0x70, 0xfd,
+ 0x24, 0x2a, 0x81, 0x37, 0x5a, 0x85, 0x72, 0x4a, 0x46, 0x2d, 0x29, 0x38,
+ 0x8f, 0xc3, 0x59, 0xc7, 0xe9, 0x76, 0x24, 0xea, 0xd4, 0xef, 0x06, 0x12,
+ 0xf5, 0xab, 0xab, 0xa1, 0x59, 0x13, 0xc8, 0x1d, 0xdf, 0x0f, 0x41, 0xbe,
+ 0x98, 0x65, 0x00, 0x11, 0x41, 0x7c, 0x6e, 0x29, 0x83, 0x73, 0xfd, 0x81,
+ 0xff, 0xe8, 0xd8, 0x7f, 0xa1, 0x00, 0x62, 0x11, 0x14, 0x38, 0x06, 0x57,
+ 0x20, 0x81, 0xaa, 0x9e, 0xaf, 0xfe, 0xee, 0x68, 0xee, 0x30, 0x1a, 0x83,
+ 0xe7, 0x32, 0xc3, 0xfc, 0x69, 0xe5, 0x19, 0x29, 0x4e, 0xee, 0xb0, 0xf1,
+ 0x63, 0xaf, 0x41, 0x3d, 0x3b, 0xb9, 0xbb, 0x2e, 0xde, 0xd7, 0x0b, 0xbe,
+ 0x11, 0x8f, 0x4a, 0x94, 0x4c, 0x57, 0xf3, 0x64, 0x38, 0x5a, 0xc6, 0xb8,
+ 0x5d, 0xa1, 0x9d, 0xc8, 0xfa, 0x32, 0xe2, 0x08, 0xf4, 0x26, 0x3f, 0x75,
+ 0xb5, 0x35, 0x9a, 0xe9, 0xd6, 0x1d, 0x35, 0x41, 0x9b, 0x20, 0x2b, 0x54,
+ 0xb9, 0x66, 0x6c, 0xc6, 0xb7, 0x44, 0x82, 0x9b, 0x74, 0xe8, 0x09, 0x04,
+ 0xa4, 0xf2, 0x7a, 0x8f, 0xe8, 0x6f, 0x3c, 0xa0, 0x18, 0xab, 0x66, 0xf6,
+ 0x39, 0x34, 0x70, 0xf3, 0xa6, 0xd3, 0xc9, 0xe1, 0x97, 0xe2, 0xdc, 0x4d,
+ 0xca, 0x02, 0xb6, 0x73, 0x07, 0xf3, 0x8c, 0xd0, 0xab, 0xd9, 0x12, 0x45,
+ 0x70, 0x7c, 0x3a, 0x24, 0x64, 0xce, 0x9e, 0x38, 0x4d, 0x5d, 0xe1, 0x9d,
+ 0xf2, 0x4b, 0x58, 0xdc, 0x71, 0xb3, 0x61, 0x56, 0x14, 0x62, 0x2a, 0x1b,
+ 0x36, 0x5e, 0xc9, 0x15, 0xf3, 0x50, 0xe6, 0xc0, 0x93, 0x62, 0xd0, 0x69,
+ 0xab, 0xd4, 0xe5, 0x9b, 0xa6, 0xa7, 0xa3, 0x0c, 0x51, 0xad, 0xf7, 0x38,
+ 0x6f, 0x1d, 0xcf, 0x43, 0xda, 0x83, 0x95, 0xc6, 0xfb, 0xd8, 0x90, 0x5e,
+ 0x35, 0x30, 0x0b, 0x7b, 0x45, 0xd0, 0x12, 0x32, 0x95, 0xc3, 0x96, 0xdc,
+ 0x0a, 0x68, 0xcc, 0xcf, 0x19, 0x0b, 0x13, 0xc7, 0x6a, 0x7a, 0x53, 0x36,
+ 0x5b, 0x24, 0xc5, 0x84, 0x5c, 0xeb, 0x9e, 0xeb, 0xdc, 0x91, 0x17, 0xb3,
+ 0x29, 0xfd, 0xee, 0x55, 0xc9, 0x8c, 0xcd, 0xbe, 0x3a, 0x66, 0xf3, 0xba,
+ 0x79, 0xfe, 0xc7, 0xf8, 0x08, 0xeb, 0xd2, 0x3a, 0x17, 0x3c, 0x36, 0x29,
+ 0xc1, 0xde, 0xa9, 0xab, 0x80, 0xdb, 0x6c, 0xdd, 0xfb, 0xe5, 0xb1, 0x12,
+ 0x25, 0x2f, 0xa3, 0x3d, 0x0e, 0x72, 0xde, 0xaf, 0x86, 0x93, 0x35, 0x18,
+ 0x96, 0x19, 0x47, 0xfd, 0x8f, 0xae, 0x7b, 0xe7, 0xac, 0x6e, 0x53, 0x10,
+ 0x1e, 0x66, 0x54, 0xc0, 0x36, 0x0e, 0x73, 0x35, 0xb3, 0x20, 0xf9, 0xaa,
+ 0x25, 0x4a, 0x66, 0xaf, 0xc9, 0x2f, 0xd1, 0x19, 0x8b, 0x8f, 0x93, 0xbe,
+ 0x3a, 0x30, 0xa5, 0x24, 0xc2, 0xad, 0x30, 0xfc, 0x97, 0xfe, 0x6c, 0xe0,
+ 0x7f, 0x98, 0x71, 0x37, 0x33, 0x26, 0xc3, 0x75, 0xc8, 0x51, 0xe6, 0xf2,
+ 0x99, 0xf0, 0x0f, 0x7d, 0x5d, 0x12, 0x26, 0x9d, 0x96, 0xeb, 0xd5, 0x08,
+ 0x28, 0x34, 0x90, 0x1c, 0xdb, 0x98, 0xbd, 0x8a, 0xeb, 0x93, 0x0d, 0xd0,
+ 0x57, 0x3e, 0xb8, 0x65, 0xdd, 0xa6, 0xa9, 0x81, 0xd6, 0xca, 0x62, 0x4b,
+ 0x24, 0xed, 0xf4, 0x36, 0xf0, 0x83, 0xd6, 0x0e, 0x53, 0xf2, 0x50, 0x89,
+ 0x70, 0x23, 0x19, 0x7b, 0xd0, 0x7e, 0x67, 0xa3, 0x45, 0x72, 0x9d, 0x11,
+ 0xbe, 0xbb, 0xe1, 0x72, 0x51, 0xf6, 0x5f, 0x4e, 0x2c, 0xca, 0x61, 0x3d,
+ 0xaa, 0xfd, 0xb7, 0x61, 0xbc, 0x3a, 0xd2, 0x20, 0x18, 0xa2, 0xee, 0x04,
+ 0xe4, 0x6b, 0xf3, 0x84, 0x26, 0xc2, 0x43, 0xa4, 0xfe, 0x4e, 0x14, 0x5c,
+ 0xbe, 0xe7, 0x11, 0x4a, 0x61, 0x33, 0x7d, 0xeb, 0x71, 0x98, 0x7c, 0xf0,
+ 0x44, 0xe2, 0x41, 0x17, 0x39, 0xd0, 0x4e, 0xe2, 0x9c, 0xcc, 0x8d, 0x76,
+ 0x3c, 0xb8, 0x0f, 0x63, 0x4a, 0x56, 0x7c, 0xf8, 0xab, 0xbd, 0x87, 0xcc,
+ 0xa2, 0x29, 0xb9, 0x3c, 0xcc, 0x12, 0xd2, 0x9d, 0x6f, 0xbd, 0x28, 0xc3,
+ 0x0c, 0x2f, 0x83, 0x8c, 0xf3, 0xad, 0x3d, 0xc6, 0x92, 0xba, 0x0b, 0x28,
+ 0x47, 0x81, 0x78, 0xbe, 0x2b, 0xe0, 0x6a, 0x47, 0xba, 0xf3, 0xbe, 0x39,
+ 0x30, 0x49, 0x0b, 0x35, 0x34, 0x80, 0x70, 0xc2, 0x75, 0x54, 0x65, 0xd8,
+ 0xc8, 0x1c, 0x26, 0xb8, 0x97, 0x61, 0x57, 0xcf, 0x2d, 0xb8, 0xd1, 0xdd,
+ 0xb0, 0xf1, 0xa9, 0x0f, 0x3f, 0x7e, 0xfe, 0xd3, 0xee, 0xdc, 0x75, 0xbf,
+ 0xc2, 0xf1, 0x30, 0xd6, 0x60, 0x1b, 0xcd, 0x7b, 0x87, 0xde, 0x0b, 0x58,
+ 0x5c, 0xac, 0x84, 0xda, 0xef, 0x86, 0x86, 0x8d, 0x8e, 0xfd, 0x6f, 0x93,
+ 0x32, 0x8d, 0xac, 0x7b, 0x8f, 0x2a, 0x8a, 0x5f, 0xf1, 0xea, 0xbb, 0x8e,
+ 0x6d, 0xbf, 0xe0, 0x59, 0x90, 0xc2, 0xd3, 0x3d, 0x8a, 0x03, 0x64, 0x11,
+ 0xdd, 0xf1, 0xfc, 0x2d, 0x26, 0x8a, 0x6f, 0x39, 0x25, 0xa9, 0xaa, 0x61,
+ 0x45, 0x5b, 0x7b, 0x36, 0xfd, 0x82, 0xd2, 0x6a, 0x8c, 0x9a, 0xf1, 0xc2
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc b/epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc
new file mode 100644
index 0000000..44de32a
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 member private-key
+ * Group : GroupA
+ * Member : 0
+ * Issuer : Ikgf
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xca, 0x24, 0x49, 0x67, 0x86, 0x98, 0xfe, 0x05,
+ 0xd2, 0x66, 0xc5, 0x7c, 0xd2, 0x40, 0xb6, 0xed, 0x4f, 0x76, 0xc0, 0xb8,
+ 0x08, 0x62, 0x9a, 0x56, 0x46, 0x76, 0x01, 0x40, 0xd8, 0xa3, 0xe1, 0xb8,
+ 0x2f, 0x83, 0x64, 0x88, 0x99, 0xca, 0xd3, 0x2b, 0xd9, 0x50, 0xfb, 0x74,
+ 0x8b, 0xa5, 0x32, 0xb8, 0xce, 0x31, 0xd7, 0x56, 0x4b, 0xdd, 0xdd, 0x1c,
+ 0x0e, 0x5e, 0xba, 0x34, 0x68, 0x66, 0xbc, 0xb6, 0x9c, 0x92, 0xf0, 0x2f,
+ 0xa2, 0x27, 0x56, 0xc1, 0xef, 0x3a, 0x21, 0x5e, 0x9a, 0x05, 0x13, 0x63,
+ 0x0e, 0x2f, 0x12, 0xac, 0x95, 0xb9, 0x26, 0x6d, 0x1d, 0xe2, 0xcf, 0x64,
+ 0x4a, 0x09, 0xdd, 0x4f, 0x15, 0x9d, 0x08, 0x6b, 0x93, 0xbf, 0x95, 0x89,
+ 0x11, 0xb8, 0x31, 0x11, 0xb1, 0x36, 0x76, 0x4d, 0x0a, 0xbe, 0x5a, 0x42,
+ 0xe7, 0x44, 0xbb, 0x17, 0x6d, 0x36, 0x7b, 0x80, 0x0b, 0x10, 0x1e, 0xc6
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/privrl.inc b/epid/common-testhelper/testdata/ikgf/groupa/privrl.inc
new file mode 100644
index 0000000..2b2edc3
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/privrl.inc
@@ -0,0 +1,38 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 private-key based revocation list
+ * Group : GroupA
+ * Issuer : iKGF
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x1d, 0x79, 0x15, 0xee, 0xc2, 0x0b, 0x17, 0xc4,
+ 0xd4, 0xcb, 0x43, 0x3c, 0x5c, 0xad, 0x68, 0x3a,
+ 0x03, 0x6d, 0xdf, 0xea, 0x78, 0x42, 0x9a, 0xc3,
+ 0xfc, 0xc9, 0x93, 0xdd, 0x71, 0x44, 0xba, 0xcb,
+ 0x36, 0xcd, 0x95, 0x0d, 0xa2, 0x77, 0x96, 0x89,
+ 0x91, 0xca, 0xf6, 0x02, 0xca, 0x20, 0xff, 0x73,
+ 0x37, 0x97, 0xb1, 0x46, 0x8c, 0xaf, 0x64, 0xb6,
+ 0x0c, 0x48, 0xa6, 0x3e, 0xbd, 0x92, 0x71, 0xf8,
+ 0x52, 0x21, 0x71, 0x2b, 0x5a, 0x9f, 0x9d, 0xc9,
+ 0x44, 0x41, 0x15, 0xa0, 0xd8, 0x39, 0xa9, 0xad,
+ 0x49, 0x64, 0x68, 0x38, 0xa8, 0xef, 0xa5, 0x95,
+ 0x14, 0x6a, 0xe2, 0x7d, 0xee, 0x96, 0xae, 0x9e
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc b/epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc
new file mode 100644
index 0000000..cf9237e
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 private-key based revocation list
+ * Group : GroupA
+ * Issuer : iKGF
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00
+
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc b/epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc
new file mode 100644
index 0000000..00fabe2
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group public-key
+ * Group : GroupA
+ * Issuer : Ikgf
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x45, 0xcb, 0x06, 0x04, 0xb3, 0xf7, 0x23, 0xb2,
+ 0xd1, 0xd1, 0x0d, 0x4f, 0x51, 0x7b, 0xbb, 0x8f, 0x71, 0x15, 0xd7, 0xf1,
+ 0xdc, 0x15, 0x37, 0xc8, 0xb8, 0x3d, 0x68, 0x0a, 0x18, 0xa5, 0x34, 0x14,
+ 0x0c, 0xdc, 0xd9, 0x15, 0x7e, 0xba, 0x56, 0xc5, 0xe5, 0x61, 0xfa, 0x6a,
+ 0x86, 0xa0, 0xac, 0x6a, 0x81, 0x36, 0x6d, 0x01, 0x5f, 0x86, 0xc0, 0x04,
+ 0x8b, 0x1e, 0xff, 0x49, 0xd9, 0x37, 0x96, 0x66, 0xf1, 0xc3, 0x16, 0xb5,
+ 0xc5, 0x1c, 0x67, 0xb6, 0xff, 0x28, 0x23, 0x79, 0x59, 0xea, 0x80, 0xe6,
+ 0x09, 0x07, 0xe7, 0xd3, 0x38, 0xec, 0xb9, 0x16, 0x83, 0x88, 0xda, 0x64,
+ 0xdd, 0xc4, 0x9d, 0x6a, 0x5c, 0xb2, 0x1c, 0x88, 0x97, 0xea, 0xaf, 0xa9,
+ 0xf3, 0x3e, 0x07, 0xea, 0xb6, 0x2a, 0xd5, 0x7a, 0xed, 0x32, 0xd9, 0x3d,
+ 0x90, 0xd7, 0xb9, 0x91, 0x08, 0x05, 0x9e, 0xe3, 0x22, 0x75, 0x06, 0x35,
+ 0xe5, 0xc4, 0x77, 0xad, 0x52, 0xb9, 0x7c, 0x04, 0x2d, 0x7e, 0x81, 0xf2,
+ 0x5d, 0x5d, 0x52, 0x7d, 0xd7, 0x1d, 0x29, 0xfb, 0x6a, 0xa7, 0xbc, 0xb5,
+ 0xa9, 0x1a, 0xa6, 0xfd, 0x20, 0xea, 0xf2, 0x98, 0xe2, 0x67, 0x33, 0x28,
+ 0x67, 0x5f, 0xbe, 0x23, 0xa0, 0x43, 0xe8, 0x71, 0xaa, 0xab, 0xf6, 0xf0,
+ 0x6a, 0x2b, 0x52, 0xa8, 0x61, 0x51, 0x22, 0x44, 0x00, 0x91, 0xd7, 0xf1,
+ 0x7e, 0x05, 0x48, 0xdc, 0x51, 0x0c, 0xef, 0xa0, 0xf3, 0x72, 0xcd, 0x59,
+ 0xd4, 0x7a, 0x2a, 0x60, 0xa3, 0x62, 0x54, 0xa8, 0xb6, 0x8f, 0xed, 0x90,
+ 0xdf, 0x3e, 0x94, 0xe8, 0xa4, 0x89, 0x32, 0xaa, 0x52, 0x5a, 0x97, 0xae,
+ 0x4c, 0x86, 0xf4, 0xba, 0xec, 0xc6, 0x36, 0x13, 0x87, 0x42, 0x5d, 0x16,
+ 0x49, 0x12, 0x66, 0xc5, 0xe0, 0xe4, 0x9b, 0xf9, 0x68, 0xaa, 0xa9, 0x95,
+ 0x81, 0x16, 0x5c, 0xd2, 0xca, 0xd4, 0x2e, 0x61
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc
new file mode 100644
index 0000000..0cc91af
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc
@@ -0,0 +1,98 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: groupA
+ * Issuer : iKGF
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "msg0"
+ * Basename: None (random base)
+ * SigRl: SigRl of group
+ */
+ 0x9e, 0x45, 0x73, 0x32, 0x27, 0x75, 0xb0, 0x65, 0x22, 0xd4, 0x90, 0xbf,
+ 0x5b, 0xcd, 0x4d, 0xfd, 0xd1, 0x6e, 0xe7, 0xa0, 0x18, 0xe4, 0x3b, 0xdb,
+ 0x2e, 0xf2, 0xb7, 0x58, 0xfb, 0xa6, 0xb5, 0xc3, 0x22, 0x3c, 0x62, 0x88,
+ 0x26, 0xc4, 0x20, 0x5f, 0xf2, 0x76, 0x8b, 0xc5, 0x2e, 0x09, 0x4f, 0x4d,
+ 0xee, 0xd9, 0xc6, 0x87, 0xe8, 0xba, 0xba, 0x51, 0x00, 0x98, 0x3c, 0x37,
+ 0x26, 0x13, 0x1c, 0x8e, 0x1a, 0x72, 0x0b, 0xd3, 0x26, 0xce, 0xd2, 0x78,
+ 0x3c, 0xd8, 0x70, 0x4a, 0xa6, 0xd5, 0x44, 0xb9, 0xa5, 0xac, 0x0f, 0x5a,
+ 0x7a, 0x0e, 0xdf, 0x71, 0xc0, 0xa8, 0xdd, 0x84, 0xf8, 0xc3, 0x4e, 0xfe,
+ 0x53, 0xdb, 0x54, 0x97, 0x0a, 0x23, 0xbe, 0x80, 0x7f, 0xb8, 0x91, 0x92,
+ 0x83, 0x30, 0x10, 0x65, 0x62, 0x1c, 0xfa, 0x4b, 0xe5, 0x5c, 0x07, 0xde,
+ 0x0b, 0x41, 0x3e, 0xf3, 0xcf, 0x8f, 0x24, 0xc9, 0xb6, 0xe5, 0xfb, 0xee,
+ 0xa6, 0x0e, 0x19, 0x0f, 0xa7, 0x16, 0xcf, 0x7e, 0xac, 0xb6, 0xa2, 0xb7,
+ 0x57, 0x30, 0x9f, 0x13, 0x84, 0x71, 0x6a, 0x9c, 0x0e, 0x3d, 0x6f, 0x0c,
+ 0x37, 0xb6, 0xde, 0xdb, 0x15, 0x95, 0x30, 0xe7, 0xba, 0x1f, 0x7e, 0xc7,
+ 0x1e, 0x3f, 0x02, 0x66, 0x0f, 0xb8, 0x50, 0xd7, 0xcf, 0xde, 0xe1, 0x28,
+ 0xd1, 0x61, 0x95, 0x4d, 0xfd, 0x6c, 0xd2, 0xb0, 0x39, 0xca, 0xf9, 0xf1,
+ 0xce, 0x42, 0x8d, 0xe1, 0x67, 0x40, 0x84, 0xe8, 0xef, 0x9c, 0x9b, 0x27,
+ 0x9f, 0x32, 0x7f, 0x72, 0xb8, 0x15, 0x99, 0xb9, 0xad, 0x02, 0x5b, 0x66,
+ 0xa7, 0x5f, 0xb6, 0x4d, 0xcc, 0x23, 0x2e, 0xc6, 0xa6, 0x24, 0x9d, 0xf2,
+ 0x31, 0xfd, 0x5b, 0x7a, 0x9e, 0x62, 0xb6, 0x4e, 0x9a, 0x26, 0xff, 0x92,
+ 0xd6, 0x2d, 0x59, 0xd4, 0x65, 0xdc, 0x67, 0x58, 0x2e, 0xf4, 0x8b, 0x7e,
+ 0xd7, 0x5d, 0xc2, 0x8b, 0x24, 0x77, 0xa4, 0x51, 0x67, 0xcb, 0x14, 0x90,
+ 0x8f, 0xf1, 0xb8, 0xee, 0x85, 0xa5, 0xd8, 0x66, 0x7b, 0xa5, 0x5e, 0xf6,
+ 0xfa, 0xe2, 0x50, 0xbd, 0x9b, 0xf0, 0xfb, 0xc7, 0x4a, 0xea, 0x95, 0xcf,
+ 0x27, 0x02, 0x37, 0xa9, 0xec, 0x43, 0xe5, 0xa1, 0xa0, 0x53, 0xf7, 0x2c,
+ 0x4e, 0xd0, 0x84, 0x7a, 0x56, 0xe7, 0x55, 0x80, 0x91, 0x11, 0x53, 0xb7,
+ 0xbc, 0xc6, 0x73, 0x1d, 0x7d, 0x24, 0x06, 0x52, 0x5e, 0x86, 0xd4, 0x43,
+ 0xde, 0xde, 0xe9, 0x95, 0x9f, 0x86, 0x03, 0xcc, 0x2e, 0x0d, 0xec, 0xa0,
+ 0x1a, 0x5c, 0xe5, 0x93, 0x89, 0xfb, 0x7a, 0x9e, 0x79, 0x4f, 0x85, 0x8e,
+ 0xe8, 0x91, 0x18, 0x4f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0xcf, 0x8a, 0x04, 0x78, 0x6d, 0xcc, 0x0b, 0xac, 0x42, 0x2e, 0xe3, 0x46,
+ 0xeb, 0x20, 0xcb, 0x19, 0x64, 0x23, 0x2d, 0xd2, 0xf6, 0xef, 0xa0, 0xf0,
+ 0xd1, 0xf2, 0x84, 0x53, 0xb3, 0x91, 0xec, 0x3c, 0xa0, 0x1c, 0xb8, 0x66,
+ 0xb3, 0x6e, 0xb1, 0x2b, 0x72, 0x65, 0x3e, 0x30, 0xfe, 0xef, 0x58, 0xd0,
+ 0x3b, 0x31, 0x3b, 0xb9, 0x5a, 0x61, 0x26, 0x77, 0xea, 0x87, 0xf3, 0x09,
+ 0x47, 0xc2, 0x8d, 0x96, 0xb9, 0x05, 0x40, 0xf3, 0x48, 0xe8, 0x1b, 0x71,
+ 0x39, 0x2f, 0xd3, 0x6f, 0xad, 0x1b, 0x7e, 0x33, 0xd2, 0x8f, 0x5b, 0xf4,
+ 0x5a, 0xdc, 0x66, 0xcb, 0xd5, 0xcf, 0xc9, 0x91, 0xb6, 0x7a, 0xd8, 0xe4,
+ 0x81, 0x86, 0xb6, 0x88, 0xc4, 0x59, 0x8e, 0x03, 0x09, 0x8e, 0x29, 0xba,
+ 0x16, 0x23, 0x84, 0x5f, 0x30, 0x93, 0x13, 0xb4, 0xe9, 0xdf, 0x28, 0x49,
+ 0xa8, 0x4a, 0xce, 0x69, 0xd1, 0xc6, 0x25, 0x26, 0xf2, 0x5c, 0x4d, 0x0b,
+ 0xa0, 0x2b, 0xbe, 0xec, 0xb2, 0x09, 0x30, 0x8b, 0xd8, 0xb4, 0x09, 0x68,
+ 0x01, 0x82, 0x00, 0x9d, 0x65, 0x54, 0x19, 0xf0, 0x4f, 0xd1, 0x4d, 0xe9,
+ 0x60, 0xcf, 0x8c, 0xab, 0xd3, 0xb6, 0x06, 0xa4, 0x78, 0xea, 0xf1, 0xd0,
+ 0xba, 0x9f, 0x53, 0x89, 0x9b, 0xdf, 0xc9, 0xe4, 0xf5, 0x7b, 0x98, 0x5f,
+ 0x41, 0x59, 0x0c, 0x78, 0x71, 0x6b, 0xf9, 0xa8, 0xf1, 0x82, 0x1b, 0xf6,
+ 0xb1, 0x92, 0xa8, 0xd9, 0xbf, 0x65, 0xe7, 0xf0, 0x3a, 0x05, 0xe1, 0xba,
+ 0x03, 0xb6, 0xc6, 0x52, 0x0f, 0xb2, 0x6c, 0x5d, 0x70, 0x01, 0x1b, 0x30,
+ 0x3e, 0x65, 0x28, 0xbd, 0x90, 0xa5, 0x2d, 0x6c, 0xdf, 0xac, 0xe7, 0xa0,
+ 0xe2, 0x3a, 0xe6, 0x3a, 0xe9, 0xe6, 0x21, 0x5f, 0x27, 0xe4, 0x53, 0x4b,
+ 0xa2, 0x88, 0x7b, 0x66, 0x42, 0x77, 0x5b, 0x25, 0xe0, 0x76, 0x27, 0xbd,
+ 0x5b, 0x13, 0x7b, 0x7e, 0x81, 0x92, 0x74, 0xcf, 0xcd, 0x4a, 0xf6, 0x6d,
+ 0x61, 0xcd, 0x99, 0x4c, 0x54, 0x91, 0x48, 0x6f, 0xb6, 0xf3, 0xb7, 0xde,
+ 0xf3, 0x75, 0xe9, 0xd6, 0xbb, 0x43, 0x0c, 0xaf, 0x31, 0x76, 0x7f, 0x3c,
+ 0x87, 0x6e, 0xf8, 0xbe, 0x04, 0x99, 0xf5, 0x00, 0x15, 0x76, 0xc2, 0x0e,
+ 0x65, 0xfd, 0xe5, 0x26, 0x2d, 0x41, 0x36, 0xca, 0x2d, 0x17, 0xc0, 0x27,
+ 0xdf, 0xdd, 0xcc, 0xaa, 0x04, 0x96, 0x62, 0x50, 0x43, 0xce, 0x49, 0x86,
+ 0xb5, 0xf7, 0xd9, 0x11, 0xaf, 0x2c, 0xe5, 0x7c, 0xc8, 0x01, 0x6b, 0xb9,
+ 0xfe, 0x0c, 0x19, 0x47, 0x3f, 0xac, 0x56, 0x69, 0xb0, 0xb8, 0xd5, 0x5f,
+ 0x6b, 0xd8, 0xc7, 0x85, 0xd9, 0xe1, 0xc2, 0x85, 0xf8, 0x90, 0xd6, 0xa7,
+ 0xc9, 0x18, 0xe3, 0x48, 0x8b, 0xc8, 0x61, 0xb5, 0x60, 0x0c, 0x6b, 0x94,
+ 0xce, 0x0b, 0x00, 0x5e, 0xaf, 0x01, 0xde, 0xfd, 0x68, 0x25, 0x01, 0xef,
+ 0x4f, 0xa5, 0xe4, 0xeb, 0x96, 0xba, 0x58, 0x50, 0x0b, 0xb1, 0xd1, 0xfa,
+ 0x2e, 0x3d, 0xc3, 0x5a, 0xc7, 0x68, 0x73, 0x78, 0x36, 0x9b, 0x0b, 0x86,
+ 0xcf, 0x0b, 0x34, 0x19, 0x35, 0x53, 0x23, 0x12, 0xd7, 0x21, 0xaa, 0xe3,
+ 0xc0, 0x0b, 0xec, 0xe1, 0xbc, 0x26, 0x0d, 0x70, 0xf6, 0xd0, 0x68, 0xf2,
+ 0x94, 0x79, 0x37, 0x0a, 0x2e, 0x98, 0xb3, 0x09, 0x97, 0x0f, 0xa3, 0x8e,
+ 0x40, 0xeb, 0x61, 0xa4, 0x06, 0x19, 0x7f, 0x0a, 0x04, 0x9a, 0x29, 0x9f,
+ 0xfa, 0xe4, 0x2c, 0x0b, 0xc6, 0xc0, 0xfa, 0x1d, 0xa0, 0x24, 0x7c, 0x58,
+ 0x8e, 0xce, 0x08, 0x82, 0x14, 0x4c, 0xf0, 0x78, 0x0d, 0x31, 0xdc, 0x97
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..0feea00
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc
@@ -0,0 +1,58 @@
+ /*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupA
+ * Issuer : iKGF
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : SigRl of group
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x1f, 0x63, 0x25, 0xf1, 0xb0, 0x2f, 0x03, 0x92,
+ 0xc7, 0x15, 0x23, 0x27, 0xd7, 0xb3, 0x16, 0x3f, 0x91, 0x29, 0xa1, 0x72,
+ 0x1d, 0xb7, 0x74, 0x34, 0xc2, 0xe4, 0x8d, 0x71, 0x4f, 0x43, 0xcd, 0x48,
+ 0x73, 0x72, 0xaa, 0x7d, 0x58, 0x7a, 0x91, 0x17, 0x42, 0x56, 0x5c, 0xe1,
+ 0x50, 0x6b, 0x13, 0x39, 0x7a, 0x54, 0x7b, 0x0c, 0xa4, 0xe4, 0xaa, 0xc0,
+ 0x98, 0x20, 0xb8, 0x29, 0xb3, 0x2f, 0x9b, 0x40, 0xff, 0x48, 0x6b, 0xa5,
+ 0x8e, 0xdb, 0xe4, 0x31, 0xc8, 0xd2, 0xe7, 0x2a, 0x95, 0xdf, 0x72, 0x86,
+ 0x79, 0x80, 0x91, 0x1b, 0x73, 0x26, 0x81, 0x3f, 0x06, 0x28, 0x92, 0x46,
+ 0x4c, 0xa1, 0x41, 0x38, 0xc5, 0x12, 0xe7, 0x51, 0x42, 0x49, 0xe8, 0x41,
+ 0x28, 0xb4, 0xd1, 0x42, 0xf4, 0xc4, 0x38, 0x13, 0x64, 0x58, 0x13, 0x05,
+ 0x65, 0xdd, 0x85, 0x76, 0x5a, 0x25, 0xe9, 0x46, 0xfc, 0x19, 0x64, 0x78,
+ 0xc2, 0xe6, 0x57, 0xba, 0x6b, 0x77, 0xf6, 0x64, 0xea, 0x27, 0x27, 0x9c,
+ 0x8c, 0x05, 0xc2, 0xb9, 0x23, 0x83, 0xd4, 0xa6, 0x3f, 0x3e, 0x57, 0x43,
+ 0x8a, 0xa2, 0x2f, 0x9b, 0x2c, 0x82, 0x4c, 0x9c, 0xd0, 0x8a, 0xfa, 0x4b,
+ 0xf3, 0x49, 0x5e, 0x84, 0x53, 0x69, 0x92, 0xbc, 0xb1, 0xfd, 0xd2, 0x88,
+ 0x46, 0x71, 0x16, 0x71, 0xe0, 0x97, 0x81, 0x36, 0x70, 0xc5, 0x0f, 0xd6,
+ 0x00, 0x64, 0x53, 0x81, 0xe7, 0x56, 0xc4, 0x56, 0xf7, 0xeb, 0x84, 0x72,
+ 0xb0, 0xd8, 0x52, 0x61, 0x9c, 0xfb, 0xc9, 0x4f, 0x90, 0x94, 0xf8, 0x6a,
+ 0x90, 0xf4, 0x0a, 0xaa, 0x54, 0xf5, 0xb4, 0xd6, 0xde, 0xfb, 0xa7, 0x5c,
+ 0xf7, 0xe6, 0xb7, 0x55, 0xa1, 0x07, 0x19, 0x3c, 0x32, 0xfb, 0x09, 0xa0,
+ 0x54, 0x20, 0xba, 0x73, 0x2a, 0xed, 0xea, 0x91, 0xc6, 0x62, 0x64, 0x48,
+ 0x6c, 0x91, 0x4b, 0x0e, 0xd1, 0x1e, 0x20, 0x4c, 0x4b, 0x13, 0x9f, 0xe1,
+ 0x9f, 0x0a, 0x84, 0x41, 0x4b, 0x29, 0xb8, 0x90, 0x46, 0x09, 0x00, 0xde,
+ 0x48, 0xd2, 0xb9, 0x8a, 0x6f, 0x61, 0xd3, 0x1e, 0xc4, 0x7b, 0x59, 0x16,
+ 0xa6, 0xc4, 0x4a, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_empty_sigrl.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_empty_sigrl.inc
new file mode 100644
index 0000000..e48b648
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_empty_sigrl.inc
@@ -0,0 +1,58 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: groupA
+ * Issuer : iKGF
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "msg0"
+ * Basename: "bsn0"
+ * SigRl: Empty SigRl of group
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x1f, 0x63, 0x25, 0xf1, 0xb0, 0x2f, 0x03, 0x92,
+ 0xc7, 0x15, 0x23, 0x27, 0xd7, 0xb3, 0x16, 0x3f, 0x91, 0x29, 0xa1, 0x72,
+ 0x1d, 0xb7, 0x74, 0x34, 0xc2, 0xe4, 0x8d, 0x71, 0x4f, 0x43, 0xcd, 0x48,
+ 0x73, 0x72, 0xaa, 0x7d, 0x58, 0x7a, 0x91, 0x17, 0x42, 0x56, 0x5c, 0xe1,
+ 0x50, 0x6b, 0x13, 0x39, 0x7a, 0x54, 0x7b, 0x0c, 0xa4, 0xe4, 0xaa, 0xc0,
+ 0x98, 0x20, 0xb8, 0x29, 0xb3, 0x2f, 0x9b, 0x40, 0x95, 0x66, 0x30, 0x8d,
+ 0xd8, 0x4c, 0xfc, 0xd5, 0xb4, 0x51, 0xcf, 0x6f, 0xd1, 0x25, 0xf0, 0xe4,
+ 0x2f, 0xe1, 0x2f, 0x85, 0x7d, 0x84, 0x10, 0x35, 0xe0, 0x29, 0xa9, 0x0f,
+ 0xc2, 0x92, 0x93, 0x40, 0x67, 0xc1, 0x34, 0x23, 0xb8, 0xe0, 0xf6, 0x5e,
+ 0x68, 0xde, 0xe7, 0x50, 0xed, 0x2d, 0xfc, 0xe1, 0x45, 0x27, 0x19, 0x66,
+ 0xf3, 0xe7, 0xb9, 0x2e, 0x3d, 0xc7, 0xfa, 0xa9, 0xd9, 0x7c, 0x51, 0xc0,
+ 0x80, 0x9e, 0x3d, 0x64, 0x73, 0x37, 0xa0, 0x14, 0x3e, 0xa6, 0x8c, 0xfa,
+ 0xec, 0x11, 0x64, 0x7e, 0x4f, 0xcf, 0x04, 0x5d, 0x5e, 0x30, 0xaa, 0x23,
+ 0xd6, 0xcf, 0x5e, 0xc5, 0x78, 0x26, 0x28, 0x24, 0x21, 0xcf, 0xdb, 0x6c,
+ 0x4a, 0x58, 0x82, 0x44, 0x6e, 0xda, 0xed, 0x24, 0xe3, 0x2a, 0x80, 0xa7,
+ 0x28, 0x69, 0x93, 0x3b, 0x71, 0xe1, 0x8c, 0x77, 0x3c, 0x90, 0x5b, 0x96,
+ 0x17, 0x95, 0x3e, 0x5f, 0xf0, 0xda, 0xab, 0x1c, 0xc0, 0x04, 0x6f, 0x29,
+ 0x13, 0xe7, 0x89, 0x51, 0x20, 0xc8, 0xeb, 0x90, 0xee, 0x8f, 0x84, 0x1e,
+ 0xd7, 0x9c, 0x1e, 0x15, 0x3d, 0x50, 0x11, 0x91, 0x29, 0x58, 0xde, 0xa6,
+ 0x6a, 0x35, 0x08, 0xc1, 0x17, 0x85, 0x67, 0xa8, 0xe2, 0x0a, 0x13, 0xb2,
+ 0x8e, 0x64, 0xd6, 0xb6, 0xdb, 0x5d, 0xfe, 0xcd, 0x09, 0x37, 0x68, 0xea,
+ 0x4c, 0x9e, 0x16, 0x29, 0x80, 0x9d, 0x32, 0x5a, 0xd3, 0x7a, 0x26, 0xf2,
+ 0x5e, 0x49, 0x64, 0xb9, 0xd2, 0x71, 0x1f, 0x68, 0xab, 0xdf, 0x62, 0xa7,
+ 0x3c, 0xf7, 0xdd, 0x54, 0x8f, 0xa7, 0x14, 0xa5, 0x99, 0xce, 0xc8, 0x93,
+ 0xa2, 0xf9, 0xd8, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_nosigrl.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_nosigrl.inc
new file mode 100644
index 0000000..c0c37bc
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_nosigrl.inc
@@ -0,0 +1,58 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: groupA
+ * Issuer : iKGF
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "msg0"
+ * Basename: "bsn0"
+ * SigRl: no SigRl
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x1f, 0x63, 0x25, 0xf1, 0xb0, 0x2f, 0x03, 0x92,
+ 0xc7, 0x15, 0x23, 0x27, 0xd7, 0xb3, 0x16, 0x3f, 0x91, 0x29, 0xa1, 0x72,
+ 0x1d, 0xb7, 0x74, 0x34, 0xc2, 0xe4, 0x8d, 0x71, 0x4f, 0x43, 0xcd, 0x48,
+ 0x73, 0x72, 0xaa, 0x7d, 0x58, 0x7a, 0x91, 0x17, 0x42, 0x56, 0x5c, 0xe1,
+ 0x50, 0x6b, 0x13, 0x39, 0x7a, 0x54, 0x7b, 0x0c, 0xa4, 0xe4, 0xaa, 0xc0,
+ 0x98, 0x20, 0xb8, 0x29, 0xb3, 0x2f, 0x9b, 0x40, 0xc8, 0x62, 0x1b, 0x96,
+ 0xe6, 0xfb, 0x4f, 0x62, 0xcb, 0xbd, 0x35, 0xae, 0xa6, 0x2f, 0x5f, 0x8c,
+ 0x3a, 0x49, 0x52, 0x6c, 0x35, 0xfa, 0x00, 0xf8, 0x7d, 0x30, 0xbb, 0x9a,
+ 0x62, 0x7e, 0xfa, 0x0a, 0xcf, 0x57, 0xce, 0x2a, 0x17, 0x41, 0x10, 0x89,
+ 0x89, 0x8f, 0x65, 0x31, 0x69, 0xaf, 0x0b, 0x96, 0xd2, 0x19, 0x78, 0x5f,
+ 0x7a, 0x32, 0x0c, 0x13, 0x58, 0xde, 0x00, 0x32, 0x0a, 0xd6, 0xc5, 0x22,
+ 0x14, 0xbf, 0x63, 0xa0, 0x21, 0x94, 0x65, 0x04, 0x4e, 0x7e, 0x75, 0xdd,
+ 0xd0, 0x9f, 0xeb, 0x01, 0xe6, 0xdc, 0x1f, 0x88, 0x34, 0xc9, 0xc1, 0xef,
+ 0xea, 0xc9, 0xe1, 0x55, 0x89, 0x8d, 0x20, 0xc2, 0x46, 0xc9, 0x67, 0xd8,
+ 0x97, 0x2e, 0x84, 0x63, 0x2e, 0x38, 0x76, 0xaa, 0xcf, 0x02, 0xcb, 0x17,
+ 0xbc, 0xfa, 0xf8, 0x80, 0xb1, 0x16, 0x1f, 0x05, 0x1c, 0xa7, 0x92, 0x6b,
+ 0xe9, 0x1a, 0xf0, 0x7e, 0x33, 0x24, 0x22, 0xde, 0x8c, 0xb0, 0xa6, 0xb1,
+ 0x74, 0x65, 0x83, 0x44, 0x55, 0xe0, 0xc7, 0xa5, 0x1a, 0x76, 0xba, 0x04,
+ 0x66, 0xca, 0x12, 0xf5, 0x9d, 0x52, 0x8a, 0xeb, 0x52, 0xaf, 0xed, 0xeb,
+ 0x28, 0xbd, 0x27, 0xd2, 0x72, 0xa4, 0xe5, 0x3f, 0x47, 0x82, 0x04, 0x91,
+ 0x10, 0xfc, 0xc2, 0xfc, 0x07, 0x56, 0x77, 0x99, 0x4e, 0xf5, 0xb4, 0xc6,
+ 0x5a, 0x0c, 0x86, 0xd4, 0x4c, 0xc3, 0xd2, 0x2f, 0x6d, 0x30, 0x3e, 0xff,
+ 0xd7, 0xfe, 0x90, 0x8a, 0x12, 0xb9, 0x77, 0x29, 0x16, 0x39, 0xe1, 0xe4,
+ 0x9b, 0xeb, 0xcc, 0x1c, 0xac, 0x8e, 0x64, 0x59, 0xfb, 0x1f, 0xd6, 0x5c,
+ 0xde, 0x2b, 0xd9, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc
new file mode 100644
index 0000000..c3f1160
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc
@@ -0,0 +1,61 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data for revoked privrl.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupA
+ * Issuer : iKGF
+ * Signer : privrevokedmember0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : SigRl of group
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0xc8, 0x0b, 0x3e, 0xdf, 0xfc, 0xde, 0x52, 0xee,
+ 0xf7, 0xe7, 0xe7, 0x01, 0x85, 0xda, 0xef, 0x3f, 0xdb, 0x54, 0x46, 0x8f,
+ 0xdf, 0x78, 0x57, 0x38, 0x5a, 0x7c, 0x96, 0xcd, 0x44, 0x04, 0x95, 0x97,
+ 0xc8, 0x6c, 0xc7, 0x58, 0x5f, 0xbb, 0x9a, 0xcf, 0xb1, 0x78, 0xae, 0xef,
+ 0x65, 0xd6, 0xe0, 0xdb, 0x4f, 0xd5, 0x66, 0x93, 0x7c, 0xe6, 0x02, 0x2a,
+ 0x28, 0x45, 0x6f, 0x40, 0x8f, 0xe2, 0x5b, 0x29, 0x8b, 0x54, 0x37, 0xe9,
+ 0xee, 0xc8, 0x3e, 0x57, 0x3f, 0xd8, 0x80, 0xb2, 0x95, 0x97, 0xa2, 0x13,
+ 0x21, 0xf4, 0x5c, 0xbd, 0x44, 0xd3, 0x3e, 0x43, 0xb9, 0x23, 0xe9, 0xdd,
+ 0xd5, 0x9b, 0x88, 0xd3, 0xda, 0x1e, 0x17, 0x00, 0x1b, 0x00, 0x6e, 0x52,
+ 0xde, 0xb2, 0xa5, 0xbd, 0x9b, 0x32, 0xee, 0x9b, 0x9e, 0x75, 0x14, 0xe8,
+ 0x0e, 0xcb, 0xfc, 0x38, 0x44, 0x99, 0x08, 0x66, 0xc6, 0x66, 0xe0, 0x4f,
+ 0xf2, 0xac, 0x26, 0x16, 0x6f, 0x4a, 0xd9, 0x49, 0xad, 0x1e, 0x59, 0x6c,
+ 0xd3, 0x50, 0x3c, 0xb4, 0x55, 0xe4, 0xa3, 0x5f, 0xfb, 0x5b, 0xc5, 0xcd,
+ 0x7f, 0xc1, 0x2d, 0x17, 0xad, 0xde, 0x6e, 0x76, 0x3a, 0x87, 0x40, 0xc4,
+ 0xb9, 0xd9, 0xef, 0x13, 0x2f, 0x70, 0x77, 0x0d, 0xff, 0xf0, 0x1a, 0x08,
+ 0x36, 0xd3, 0xb9, 0xec, 0x13, 0x93, 0x96, 0x7a, 0x8f, 0x3a, 0x07, 0xe2,
+ 0xaa, 0x51, 0x89, 0x75, 0xa9, 0x6a, 0xe0, 0xef, 0x35, 0xf7, 0x59, 0xa4,
+ 0x08, 0xf0, 0xf8, 0x0b, 0x83, 0xda, 0xfd, 0x15, 0xb7, 0x9b, 0xb6, 0x70,
+ 0x61, 0xe9, 0xd1, 0x67, 0xae, 0x33, 0x65, 0x92, 0x3a, 0x1e, 0x6a, 0x9f,
+ 0x76, 0xa4, 0x7a, 0xf2, 0xe9, 0xd9, 0x79, 0x19, 0x88, 0xb4, 0x98, 0x20,
+ 0xbb, 0x75, 0x02, 0x3c, 0xc7, 0x28, 0x7b, 0x9d, 0xde, 0xf1, 0xac, 0x04,
+ 0xef, 0x64, 0xe4, 0xf9, 0xc0, 0x6d, 0x9e, 0xbc, 0x2e, 0x5c, 0x0b, 0x2a,
+ 0x80, 0x03, 0xb7, 0xdf, 0x22, 0xcf, 0xe0, 0x7d, 0x7f, 0xc9, 0x08, 0x61,
+ 0x87, 0xea, 0x28, 0xf4, 0xec, 0xd2, 0x07, 0x9b, 0x47, 0x39, 0x34, 0x0e,
+ 0xda, 0x29, 0x8a, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+
+
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc
new file mode 100644
index 0000000..d8a19f2
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc
@@ -0,0 +1,98 @@
+ /*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupA
+ * Signer : member0
+ * Issuer : iKGF
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: None (random base)
+ * SigRl : SigRl of group
+ */
+ 0xa9, 0x4b, 0x40, 0x3c, 0xdb, 0x6b, 0x14, 0xec, 0x93, 0x51, 0x6e, 0x2a,
+ 0x44, 0x81, 0xa5, 0x92, 0x96, 0x03, 0x2c, 0x77, 0x20, 0x41, 0xad, 0x10,
+ 0xce, 0xe1, 0xe9, 0xab, 0xcb, 0x3f, 0x6b, 0xbe, 0x65, 0xa1, 0xe6, 0xa9,
+ 0x27, 0xbb, 0x2d, 0x44, 0x63, 0xf2, 0xf9, 0x81, 0xf3, 0x19, 0x57, 0x4d,
+ 0xb8, 0xd0, 0x47, 0xd2, 0xaf, 0x4c, 0xa9, 0x64, 0xfd, 0xfc, 0xc4, 0x48,
+ 0x13, 0x61, 0xd2, 0xfe, 0x60, 0x50, 0xdd, 0xe4, 0x96, 0xfc, 0x39, 0x57,
+ 0x5f, 0xbd, 0xa5, 0x18, 0x21, 0x5a, 0x12, 0x42, 0x03, 0xdd, 0xb3, 0xb3,
+ 0xc5, 0xc4, 0x1b, 0x9a, 0xb8, 0x31, 0x4f, 0xd2, 0x3d, 0x71, 0x6f, 0x46,
+ 0x8d, 0x2a, 0x85, 0x12, 0x0d, 0x88, 0xeb, 0xee, 0x27, 0xa6, 0xd5, 0x75,
+ 0x82, 0x09, 0x66, 0xf5, 0xab, 0x9e, 0x92, 0xeb, 0x58, 0xce, 0x8b, 0x5c,
+ 0x67, 0x75, 0x0e, 0x5f, 0xd2, 0x22, 0xcb, 0x92, 0x2f, 0x8a, 0xc5, 0x4a,
+ 0x2d, 0x9b, 0x6f, 0x9a, 0x39, 0x91, 0x9a, 0xc2, 0x9b, 0x89, 0x91, 0x6b,
+ 0xdd, 0x5c, 0xc9, 0x66, 0xcb, 0xf7, 0x58, 0xa8, 0x2b, 0x6d, 0xb8, 0x2b,
+ 0xe0, 0x39, 0xec, 0x95, 0x0e, 0x4c, 0x3b, 0x74, 0x39, 0x34, 0x1b, 0xd8,
+ 0x8c, 0xe7, 0xf5, 0x3b, 0xdb, 0xba, 0xd2, 0xc7, 0xee, 0x65, 0x90, 0xcf,
+ 0xcb, 0x65, 0x52, 0x3b, 0x2a, 0xc4, 0x05, 0x5a, 0x72, 0xd2, 0xbb, 0xdd,
+ 0x8e, 0x3b, 0x2a, 0x02, 0xec, 0xec, 0x36, 0x37, 0xb5, 0x44, 0x1a, 0x9a,
+ 0xee, 0x8b, 0x49, 0x37, 0xc6, 0x4a, 0x7e, 0x7e, 0xa1, 0x8c, 0x57, 0x3f,
+ 0x8b, 0xec, 0xd5, 0x29, 0xee, 0x2a, 0xf9, 0x95, 0x52, 0xe1, 0xde, 0x8a,
+ 0xd5, 0xcd, 0xfe, 0x68, 0x4b, 0xe8, 0x4f, 0xd4, 0x4f, 0x02, 0xdd, 0x0f,
+ 0xe1, 0x22, 0xe7, 0x95, 0xfb, 0xc4, 0x7c, 0x8a, 0xa6, 0x82, 0x72, 0xd2,
+ 0x43, 0x88, 0x9e, 0x67, 0xd9, 0xa5, 0x04, 0x2a, 0x71, 0x24, 0x02, 0x52,
+ 0x6c, 0x67, 0x6c, 0xa3, 0xfd, 0x47, 0xf2, 0xcc, 0x0c, 0xbd, 0x81, 0x2b,
+ 0x16, 0x84, 0x90, 0x35, 0x44, 0xcf, 0x75, 0xf5, 0xc1, 0xd7, 0x63, 0x89,
+ 0x65, 0x2f, 0xec, 0x61, 0xa2, 0xad, 0x10, 0x77, 0x95, 0xb8, 0x21, 0xf2,
+ 0x7c, 0x36, 0x56, 0x24, 0x99, 0xf0, 0x27, 0x11, 0x02, 0x03, 0x31, 0x32,
+ 0xee, 0x86, 0x71, 0x06, 0xd3, 0xfd, 0xe7, 0xc7, 0x6d, 0x30, 0xbe, 0x39,
+ 0x07, 0xa5, 0xd0, 0x2d, 0xb3, 0x00, 0x1c, 0x8c, 0x4e, 0x74, 0xdc, 0x07,
+ 0xd3, 0x60, 0x95, 0xc1, 0x2c, 0xaa, 0x93, 0x67, 0xb3, 0x8d, 0x42, 0x2e,
+ 0x6d, 0x22, 0x50, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0xe7, 0x2a, 0x73, 0x9d, 0xc0, 0x60, 0x48, 0xed, 0xf1, 0xef, 0x0a, 0x93,
+ 0xf7, 0x12, 0x70, 0x39, 0xb5, 0x54, 0x5b, 0xc9, 0x8d, 0xc5, 0x6a, 0x48,
+ 0xd3, 0xc1, 0xe9, 0xef, 0x77, 0x7b, 0x16, 0x3d, 0x54, 0x35, 0xca, 0xbb,
+ 0xa0, 0x71, 0x69, 0x69, 0xfc, 0x81, 0x5c, 0x29, 0x7d, 0x55, 0x7c, 0x99,
+ 0x2a, 0xfc, 0xd6, 0x08, 0xed, 0xdd, 0xe0, 0x35, 0x29, 0x7d, 0xe6, 0xb5,
+ 0x45, 0x60, 0xb7, 0x34, 0x7b, 0xeb, 0x1a, 0xb7, 0x03, 0x41, 0xdd, 0x89,
+ 0xaa, 0x4d, 0xdf, 0x34, 0x1e, 0xc1, 0xb8, 0xd4, 0x26, 0xc9, 0xdb, 0x38,
+ 0x78, 0x1c, 0x20, 0x88, 0x78, 0x4a, 0x0e, 0xe5, 0x65, 0x20, 0x54, 0xab,
+ 0xc9, 0x61, 0x85, 0x02, 0x24, 0x36, 0x79, 0xbe, 0xea, 0xc7, 0x6b, 0x6e,
+ 0x2f, 0x3c, 0xea, 0x78, 0x38, 0x89, 0xb6, 0x88, 0x07, 0xdd, 0xb1, 0x2f,
+ 0xda, 0x20, 0x48, 0x91, 0x34, 0x05, 0x0e, 0x70, 0xe7, 0x96, 0x67, 0x40,
+ 0xa4, 0xda, 0xa0, 0xfb, 0x88, 0x2d, 0x8b, 0x49, 0x40, 0xa6, 0x42, 0x81,
+ 0xf6, 0x2e, 0x23, 0xe8, 0x10, 0x03, 0x46, 0x0e, 0x77, 0x4a, 0x53, 0xab,
+ 0xdc, 0xd2, 0x39, 0x9c, 0x27, 0xd8, 0x61, 0x7c, 0x58, 0x1f, 0xf1, 0x31,
+ 0xd7, 0x0c, 0x38, 0xa7, 0xd3, 0x23, 0x5b, 0x22, 0xb8, 0x25, 0xb9, 0x43,
+ 0x78, 0xe6, 0xd8, 0xcc, 0x00, 0x8e, 0xf1, 0x4f, 0xbd, 0x84, 0x8d, 0x09,
+ 0x27, 0x45, 0xbd, 0x4c, 0xb9, 0x3e, 0x6d, 0x65, 0xeb, 0xed, 0xfd, 0xc5,
+ 0x3e, 0x28, 0x89, 0x2b, 0x76, 0xc4, 0x56, 0xcf, 0xbb, 0x9e, 0xec, 0xd2,
+ 0x21, 0x41, 0xcf, 0x44, 0x6c, 0x86, 0xb0, 0x46, 0x46, 0xef, 0xa0, 0x24,
+ 0x64, 0xf6, 0xb8, 0xbc, 0x66, 0xf0, 0x26, 0x0d, 0x80, 0x25, 0xb0, 0xa4,
+ 0x9f, 0x5b, 0xb9, 0x82, 0x40, 0xea, 0xde, 0xb5, 0x84, 0x1a, 0x77, 0xd0,
+ 0xa5, 0x24, 0xc5, 0xae, 0x5c, 0xe7, 0x2a, 0xbf, 0x1d, 0x9c, 0x76, 0x4c,
+ 0xcd, 0xf1, 0x68, 0xa8, 0xa6, 0x30, 0xb5, 0xbb, 0x99, 0x8c, 0x23, 0x94,
+ 0xd3, 0x1d, 0xa1, 0x90, 0xee, 0x6e, 0xba, 0xd6, 0xc0, 0xa5, 0x0a, 0x84,
+ 0xfd, 0xc5, 0x4e, 0x81, 0xb4, 0x33, 0x22, 0x3b, 0xf3, 0x51, 0xb3, 0x18,
+ 0x06, 0x5d, 0x2d, 0xf0, 0xfd, 0x9b, 0x34, 0xbc, 0x30, 0x02, 0x7f, 0xcb,
+ 0x24, 0x38, 0xeb, 0x7c, 0xeb, 0x55, 0x46, 0x9b, 0x0f, 0xfb, 0x1e, 0x7a,
+ 0xfd, 0xe2, 0xe3, 0x7a, 0x46, 0x45, 0x8f, 0xe2, 0x78, 0x88, 0xfa, 0xa8,
+ 0x8f, 0x4e, 0x85, 0x14, 0xfa, 0x3e, 0x4c, 0x67, 0xe2, 0x76, 0x9e, 0x82,
+ 0xe4, 0x70, 0x7e, 0x69, 0x48, 0xec, 0xdb, 0x0b, 0xd0, 0xc2, 0x3c, 0xc6,
+ 0xce, 0x51, 0x7d, 0x0f, 0x5d, 0xb7, 0x2f, 0x31, 0xd7, 0x69, 0x8a, 0x74,
+ 0xd6, 0x81, 0x89, 0xb3, 0x7a, 0x16, 0xd7, 0xf4, 0xb3, 0x74, 0x41, 0x40,
+ 0xf7, 0x39, 0xf5, 0x66, 0x94, 0xa6, 0xf5, 0x7b, 0x8f, 0xf7, 0x2e, 0x66,
+ 0x47, 0x5f, 0x2d, 0x1e, 0x52, 0xc7, 0x93, 0xd6, 0xed, 0xa8, 0x06, 0x8e,
+ 0x73, 0x2e, 0xce, 0x21, 0xf4, 0xe6, 0xa3, 0x89, 0x26, 0xa4, 0x07, 0x49,
+ 0x58, 0x6c, 0x22, 0xef, 0xa1, 0x18, 0xe8, 0x1d, 0x4b, 0x4a, 0x26, 0xdd,
+ 0xa0, 0x09, 0xe3, 0xfd, 0x64, 0x99, 0xff, 0x88, 0xf9, 0xb6, 0xe6, 0xfb,
+ 0x7b, 0x66, 0x0a, 0x82, 0x3b, 0xa1, 0x31, 0xab, 0x31, 0x75, 0xe8, 0xc0,
+ 0xb9, 0xf2, 0x0d, 0xa3, 0x78, 0xf8, 0x02, 0x0b, 0xe4, 0x3c, 0x20, 0xdc,
+ 0x4c, 0x6e, 0x2b, 0xa8, 0xd5, 0x81, 0x33, 0x1f, 0x51, 0xf9, 0x25, 0x7f
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..a65e1c3
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc
@@ -0,0 +1,98 @@
+ /*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupA
+ * Issuer : iKGF
+ * Signer : member0 revoked in SigRl
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : SigRl of group
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x62, 0x54, 0xa2, 0xdf, 0x64, 0x8d, 0xe9, 0x24,
+ 0xd5, 0x67, 0x49, 0xf0, 0x0f, 0x23, 0x35, 0xbd, 0xfd, 0x1e, 0xa2, 0x80,
+ 0x47, 0x26, 0x41, 0x00, 0xb9, 0xac, 0x71, 0xde, 0x03, 0x21, 0x79, 0x53,
+ 0xfc, 0x50, 0x4d, 0x48, 0x1c, 0xda, 0xd5, 0x1d, 0x8b, 0x1d, 0x14, 0xd3,
+ 0xd0, 0x1e, 0x17, 0x74, 0x85, 0x7a, 0xa7, 0xc8, 0x8e, 0x8f, 0x0a, 0x49,
+ 0x9c, 0xe6, 0x57, 0x7e, 0xbc, 0xbd, 0xf3, 0xd0, 0x40, 0x1d, 0xd2, 0x66,
+ 0x68, 0x0f, 0xa8, 0xc4, 0xa0, 0x8b, 0x58, 0x33, 0x9b, 0x8a, 0x09, 0xc5,
+ 0x72, 0x35, 0x27, 0xa6, 0xb9, 0x83, 0xd0, 0xe3, 0x9e, 0xf4, 0xca, 0x3f,
+ 0xab, 0x69, 0xcb, 0x5d, 0xca, 0xcc, 0x36, 0x40, 0xbc, 0x80, 0x5b, 0x81,
+ 0x25, 0xcc, 0x31, 0xe5, 0x7d, 0x3f, 0x1d, 0xe9, 0x1b, 0xc6, 0x64, 0x4a,
+ 0x00, 0x58, 0xfa, 0xe2, 0x3c, 0x4f, 0x4c, 0xc6, 0xa7, 0x14, 0xa6, 0xf6,
+ 0x5f, 0xad, 0xf5, 0x7e, 0x5f, 0x78, 0x98, 0x1c, 0xe4, 0xca, 0xfb, 0x9a,
+ 0x96, 0xdd, 0x53, 0x64, 0x4b, 0x67, 0xd1, 0x1e, 0xd8, 0xf5, 0xc2, 0xdb,
+ 0x46, 0x21, 0x14, 0xfd, 0xcc, 0x54, 0x35, 0x0a, 0x4a, 0xd6, 0x96, 0xe7,
+ 0xc6, 0xdc, 0xc2, 0x12, 0x4e, 0x54, 0x81, 0x8c, 0xf6, 0xca, 0xa5, 0xad,
+ 0xab, 0x07, 0xe0, 0x8b, 0x78, 0x56, 0x99, 0x5e, 0x26, 0x94, 0xd7, 0x6d,
+ 0x93, 0x9a, 0x0f, 0xab, 0x35, 0xc0, 0xc9, 0x82, 0x54, 0xef, 0xf5, 0xed,
+ 0x56, 0x26, 0xda, 0x82, 0xb9, 0x8e, 0x26, 0x2b, 0xda, 0x8f, 0xba, 0x81,
+ 0xba, 0xfe, 0x9d, 0x89, 0x45, 0x02, 0xb0, 0x38, 0x4b, 0x4e, 0x36, 0x4f,
+ 0xe0, 0xb6, 0xb6, 0x70, 0xad, 0x05, 0xd9, 0xe4, 0xbe, 0xc9, 0xcb, 0x43,
+ 0x19, 0x54, 0x8d, 0x65, 0xb9, 0x97, 0x85, 0x3a, 0x96, 0xee, 0xaf, 0x92,
+ 0x49, 0xbb, 0xa5, 0xb5, 0x92, 0xbd, 0x1e, 0xa4, 0x8f, 0xdd, 0xc4, 0x62,
+ 0xfc, 0xc8, 0x25, 0x11, 0x4a, 0x6f, 0xe6, 0xfa, 0xbc, 0xd5, 0xf5, 0xf6,
+ 0x79, 0x13, 0xd4, 0x9b, 0x46, 0x1e, 0x97, 0xb3, 0x13, 0xf2, 0x65, 0x7f,
+ 0xe1, 0xb9, 0x30, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc b/epid/common-testhelper/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc
new file mode 100644
index 0000000..a7a956b
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc
@@ -0,0 +1,59 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type: Intel(R) EPID 2.0 Signature
+ * Group: groupA
+ * Issuer : iKGF
+ * Signer: member0
+ * HashAlg: Sha256
+ * Message: "test1"
+ * Basename: "basename1"
+ * SigRl: Empty
+ */
+ 0xa6, 0x13, 0x29, 0xb6, 0x61, 0xa2, 0xb8, 0xd7, 0x49, 0x86, 0xcb, 0xaf,
+ 0x94, 0x4d, 0x9e, 0x51, 0xcf, 0xd3, 0x5d, 0x0f, 0x33, 0x9a, 0x59, 0x0d,
+ 0xe7, 0xc9, 0xb9, 0x7f, 0x83, 0xae, 0x27, 0xe6, 0x40, 0xf0, 0x88, 0x13,
+ 0xe2, 0xb6, 0x6a, 0x43, 0x26, 0xa3, 0x21, 0xea, 0x00, 0x78, 0xcd, 0xce,
+ 0x0e, 0x14, 0x7a, 0xde, 0xcf, 0xaa, 0x7b, 0xc5, 0x7e, 0x7c, 0xaf, 0xe4,
+ 0x5e, 0x8a, 0xdd, 0xc7, 0x2b, 0x4e, 0x81, 0x50, 0xcc, 0xf9, 0xcc, 0x85,
+ 0xcb, 0x8c, 0xe5, 0x76, 0x26, 0xd2, 0x30, 0x62, 0x12, 0x6b, 0xbc, 0xfb,
+ 0xf9, 0x91, 0x47, 0x55, 0x54, 0x5c, 0x5b, 0xce, 0x75, 0xaf, 0x69, 0xa3,
+ 0x26, 0xa6, 0xb7, 0xd5, 0x33, 0xe1, 0xbb, 0xd4, 0x94, 0xca, 0x05, 0xc5,
+ 0xc3, 0x64, 0xe8, 0xd8, 0x12, 0xa8, 0x5b, 0x0d, 0x12, 0xf6, 0x53, 0xa2,
+ 0xfa, 0x28, 0x59, 0xc4, 0xc3, 0x6f, 0x6a, 0xd8, 0x7d, 0x77, 0x17, 0x11,
+ 0xa2, 0xf3, 0x70, 0xa4, 0x85, 0xc8, 0x65, 0xb2, 0x8b, 0x30, 0x1b, 0x75,
+ 0x2b, 0x96, 0x95, 0xa7, 0xd5, 0x1c, 0x4e, 0xae, 0xc4, 0xdc, 0xa3, 0x48,
+ 0x84, 0x53, 0xee, 0xaa, 0xc5, 0xe0, 0x26, 0x9e, 0xde, 0x4c, 0x21, 0x78,
+ 0xea, 0x38, 0xb4, 0x53, 0xce, 0xe4, 0xea, 0x4f, 0x08, 0x08, 0x4f, 0x08,
+ 0x21, 0xca, 0xfc, 0x01, 0xa4, 0xc9, 0x23, 0xa8, 0x9a, 0x00, 0xe0, 0x14,
+ 0x8b, 0xec, 0x5f, 0x2e, 0xbb, 0x22, 0x6a, 0x63, 0xda, 0x99, 0xd6, 0xf8,
+ 0xa1, 0x7d, 0x4c, 0x1a, 0xde, 0x19, 0xa4, 0x52, 0x1b, 0x54, 0xa9, 0x42,
+ 0x2c, 0xb4, 0x7a, 0x8d, 0xc8, 0xe6, 0x0b, 0x35, 0x70, 0x03, 0x08, 0x88,
+ 0xfe, 0x0f, 0xab, 0x62, 0x95, 0x35, 0xf4, 0xfc, 0x46, 0x26, 0x99, 0x59,
+ 0xdf, 0x25, 0x96, 0x0d, 0x10, 0x89, 0xcb, 0x52, 0x95, 0xba, 0xa7, 0xe9,
+ 0xc4, 0x34, 0xf2, 0xee, 0xbd, 0x02, 0x99, 0x38, 0x8d, 0xef, 0x80, 0xa5,
+ 0xc3, 0x54, 0xb1, 0x78, 0xf3, 0xf5, 0xc5, 0xf3, 0xf4, 0x08, 0xc6, 0x51,
+ 0xf1, 0x4d, 0x6d, 0x28, 0x95, 0x02, 0x55, 0xc9, 0x60, 0xba, 0x23, 0x81,
+ 0x2f, 0xe6, 0xb0, 0x47, 0x23, 0x40, 0x85, 0xf6, 0x11, 0x8f, 0xa3, 0x71,
+ 0xa2, 0x69, 0x47, 0xc4, 0x79, 0x26, 0x67, 0x84, 0xb1, 0x43, 0xde, 0xe4,
+ 0xb2, 0xad, 0xb4, 0x71, 0xba, 0xb6, 0xbb, 0xf8, 0xae, 0x77, 0xcd, 0x3f,
+ 0x40, 0xe9, 0x9c, 0x7c, 0x90, 0xb6, 0x98, 0xac, 0xa8, 0x6f, 0x67, 0x94,
+ 0xe1, 0x97, 0xc1, 0x38, 0xd5, 0x05, 0xd0, 0x7b, 0x77, 0x8e, 0xc9, 0x17,
+ 0xb7, 0x21, 0x15, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc b/epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc
new file mode 100644
index 0000000..08b48b9
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 member private-key
+ * Group : GroupA
+ * Member : sigrevokedmember0
+ * Issuer : Ikgf
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x39, 0x88, 0x2e, 0xee, 0xbb, 0x26, 0xa6, 0x85,
+ 0xa0, 0x06, 0x6b, 0xb4, 0x7f, 0x81, 0x2a, 0x02, 0x13, 0xf3, 0x2e, 0xcf,
+ 0x10, 0xeb, 0xfd, 0xce, 0xa0, 0x39, 0xd2, 0xb7, 0xb3, 0x52, 0xd0, 0x5a,
+ 0x9b, 0x2d, 0x47, 0xbc, 0x5f, 0x30, 0x57, 0x5b, 0x60, 0xdf, 0xa1, 0x5a,
+ 0x16, 0xb6, 0xff, 0x5f, 0x55, 0xc5, 0x34, 0xf9, 0x59, 0x55, 0x78, 0xa6,
+ 0xa6, 0x5d, 0xc6, 0x52, 0x81, 0x41, 0x35, 0x83, 0x56, 0xe0, 0x5e, 0x7b,
+ 0xaa, 0x17, 0x8d, 0x0d, 0x8f, 0xc5, 0xaf, 0xf7, 0xcc, 0x3a, 0xc1, 0xb8,
+ 0x96, 0xfd, 0xdc, 0x71, 0x8a, 0x88, 0x5c, 0x13, 0x55, 0x1b, 0x22, 0xbd,
+ 0x42, 0x0e, 0xc2, 0x49, 0x48, 0x5b, 0xa0, 0x03, 0xea, 0x4b, 0x79, 0x0b,
+ 0xb5, 0xed, 0x1a, 0x81, 0x6d, 0xb2, 0xe8, 0x41, 0xca, 0x1b, 0xb1, 0xc0,
+ 0xf7, 0x11, 0x42, 0x3f, 0x24, 0xea, 0x55, 0x02, 0x82, 0x4d, 0x11, 0x48
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc b/epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc
new file mode 100644
index 0000000..e0b631f
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc
@@ -0,0 +1,57 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : GroupA
+ * Issuer : iKGF
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x4d, 0xaa, 0xa4, 0xb2, 0x80, 0xa9, 0x7a, 0x51, 0xfd, 0x1a, 0x3c, 0x44,
+ 0x5b, 0x17, 0x35, 0x3a, 0x88, 0x02, 0xce, 0x92, 0xfa, 0xac, 0x3e, 0x74,
+ 0x4a, 0xb7, 0x0b, 0xbe, 0xce, 0x77, 0x83, 0x71, 0x3c, 0x2d, 0xfd, 0xf4,
+ 0x56, 0x5a, 0x8a, 0x22, 0x10, 0x28, 0x8c, 0x2a, 0x73, 0x0f, 0x84, 0x11,
+ 0xb5, 0x97, 0x15, 0x17, 0x57, 0x04, 0x7d, 0x1c, 0x40, 0xce, 0x7d, 0xa1,
+ 0xe0, 0x75, 0xaa, 0x19, 0x5b, 0x62, 0xe7, 0x53, 0x26, 0xfc, 0xae, 0x2b,
+ 0x9d, 0x21, 0x7d, 0x0e, 0xf8, 0xc2, 0x80, 0xc6, 0x64, 0x20, 0xea, 0x04,
+ 0x32, 0xb8, 0x96, 0xd9, 0x72, 0x56, 0x6c, 0xea, 0xdd, 0xe8, 0x49, 0xa0,
+ 0xea, 0x5f, 0xbe, 0x0a, 0x8b, 0x2d, 0x17, 0x03, 0xd9, 0xe0, 0x0a, 0x24,
+ 0xc2, 0xa6, 0xf4, 0x97, 0x7d, 0x0f, 0xfd, 0xee, 0x09, 0x62, 0xba, 0x31,
+ 0x51, 0x6b, 0x3d, 0x1e, 0x91, 0xe3, 0xbc, 0xd5, 0x4d, 0xaa, 0xa4, 0xb2,
+ 0x80, 0xa9, 0x7a, 0x51, 0xfd, 0x1a, 0x3c, 0x44, 0x5b, 0x17, 0x35, 0x3a,
+ 0x88, 0x02, 0xce, 0x92, 0xfa, 0xac, 0x3e, 0x74, 0x4a, 0xb7, 0x0b, 0xbe,
+ 0xce, 0x77, 0x83, 0x71, 0x3c, 0x2d, 0xfd, 0xf4, 0x56, 0x5a, 0x8a, 0x22,
+ 0x10, 0x28, 0x8c, 0x2a, 0x73, 0x0f, 0x84, 0x11, 0xb5, 0x97, 0x15, 0x17,
+ 0x57, 0x04, 0x7d, 0x1c, 0x40, 0xce, 0x7d, 0xa1, 0xe0, 0x75, 0xaa, 0x19,
+ 0xda, 0x7f, 0x40, 0x65, 0x27, 0x0c, 0x47, 0x39, 0x5e, 0xcb, 0xbc, 0xca,
+ 0xc6, 0x5b, 0xdc, 0x48, 0xe0, 0x7a, 0x71, 0x54, 0x15, 0x21, 0xea, 0x40,
+ 0xb8, 0x49, 0x9e, 0x6b, 0x6a, 0xdd, 0x97, 0xc1, 0x77, 0xcf, 0x43, 0x55,
+ 0x64, 0x97, 0x2d, 0x14, 0x9c, 0x64, 0x22, 0xb2, 0x29, 0xa0, 0xe2, 0x90,
+ 0x1b, 0x00, 0xb2, 0xcd, 0x58, 0xf7, 0xd3, 0x90, 0x10, 0x1e, 0x0f, 0x61,
+ 0xad, 0xad, 0x71, 0x93, 0x4d, 0xaa, 0xa4, 0xb2, 0x80, 0xa9, 0x7a, 0x51,
+ 0xfd, 0x1a, 0x3c, 0x44, 0x5b, 0x17, 0x35, 0x3a, 0x88, 0x02, 0xce, 0x92,
+ 0xfa, 0xac, 0x3e, 0x74, 0x4a, 0xb7, 0x0b, 0xbe, 0xce, 0x77, 0x83, 0x71,
+ 0x3c, 0x2d, 0xfd, 0xf4, 0x56, 0x5a, 0x8a, 0x22, 0x10, 0x28, 0x8c, 0x2a,
+ 0x73, 0x0f, 0x84, 0x11, 0xb5, 0x97, 0x15, 0x17, 0x57, 0x04, 0x7d, 0x1c,
+ 0x40, 0xce, 0x7d, 0xa1, 0xe0, 0x75, 0xaa, 0x19, 0x3d, 0xa2, 0xbd, 0xc5,
+ 0x15, 0x67, 0x50, 0x88, 0x02, 0x0a, 0x37, 0xa3, 0x77, 0xef, 0x89, 0xf4,
+ 0x1b, 0x2a, 0x20, 0x04, 0xc8, 0x2c, 0x3f, 0xb5, 0x82, 0x9d, 0x55, 0xd1,
+ 0xb1, 0x4b, 0x18, 0x4d, 0xbb, 0x21, 0x5d, 0x09, 0x48, 0x44, 0x2c, 0xd3,
+ 0x4f, 0xc8, 0x29, 0xcb, 0x2e, 0xf9, 0xbf, 0xc5, 0x34, 0xb2, 0x94, 0x4e,
+ 0x1b, 0xf0, 0xa6, 0x9c, 0x32, 0x4f, 0x56, 0x0b, 0x68, 0x7b, 0xa9, 0x7b
diff --git a/epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc b/epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc
new file mode 100644
index 0000000..54dbb94
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc
@@ -0,0 +1,30 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+ /*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 signature based revocation list
+ * Group : GroupA
+ * Issuer : iKGF
+ */
+ // GID
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ // RL ver
+ 0x00, 0x00, 0x00, 0x01,
+ // n2
+ 0x00, 0x00, 0x00, 0x00
diff --git a/epid/common-testhelper/testdata/ikgf/groupb/member0/mprivkey.inc b/epid/common-testhelper/testdata/ikgf/groupb/member0/mprivkey.inc
new file mode 100644
index 0000000..1ff48ee
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupb/member0/mprivkey.inc
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 member private-key
+ * Group : GroupB
+ * Member : 0
+ * Issuer : Ikgf
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x5e, 0xbe, 0x58, 0xb5, 0xc5, 0xdb, 0xee, 0x60,
+ 0x7a, 0xdb, 0x17, 0x93, 0xf8, 0x15, 0xb8, 0x0c, 0xec, 0x9b, 0xd0, 0x8c,
+ 0x0f, 0x5d, 0x71, 0xf8, 0xe6, 0xd3, 0xcf, 0x85, 0x74, 0xe2, 0xc1, 0xa3,
+ 0x89, 0x74, 0xb2, 0xcd, 0x77, 0x9a, 0x25, 0xad, 0x6f, 0x85, 0xe2, 0x26,
+ 0x89, 0xa1, 0xc7, 0xef, 0x70, 0x5e, 0x5c, 0xb4, 0xde, 0x3c, 0x3b, 0xbf,
+ 0x27, 0x8c, 0x6f, 0x25, 0x24, 0xa4, 0x10, 0xe2, 0x83, 0x91, 0xa3, 0x01,
+ 0x60, 0xf4, 0x47, 0x2e, 0xe2, 0x55, 0x10, 0x55, 0xcc, 0x18, 0xef, 0xdc,
+ 0x9f, 0xe1, 0xb0, 0x93, 0x74, 0x58, 0xdd, 0x13, 0x8f, 0xc8, 0xce, 0x87,
+ 0x76, 0x80, 0x02, 0x8b, 0x8f, 0xb9, 0x5d, 0x46, 0x25, 0xcb, 0x20, 0x43,
+ 0xda, 0x66, 0xd3, 0x50, 0x6e, 0x10, 0xf2, 0x32, 0x6a, 0x39, 0x36, 0xd2,
+ 0x97, 0x01, 0x08, 0x6c, 0x8e, 0x9e, 0x25, 0xa7, 0x7c, 0x86, 0xd4, 0xad
diff --git a/epid/common-testhelper/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc b/epid/common-testhelper/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc
new file mode 100644
index 0000000..ecdbeb7
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc
@@ -0,0 +1,98 @@
+ /*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 Signature
+ * Group : groupB
+ * Issuer : iKGF
+ * Signer : member0
+ * HashAlg : Sha256
+ * Message : "msg0"
+ * Basename: "bsn0"
+ * SigRl : SigRl of group
+ */
+ 0x70, 0x91, 0x63, 0x2c, 0xbb, 0xfe, 0x06, 0x26, 0x5f, 0x20, 0xbd, 0x9e,
+ 0x49, 0x11, 0x31, 0xe0, 0x7c, 0x99, 0x5e, 0xa0, 0x58, 0x4f, 0x1b, 0x3f,
+ 0xb4, 0x6e, 0xcd, 0x17, 0x61, 0x79, 0xa0, 0xfd, 0x64, 0x60, 0xa4, 0xf8,
+ 0x17, 0x81, 0xc3, 0x0a, 0x4b, 0x6a, 0x72, 0x86, 0x96, 0xe3, 0xfa, 0x95,
+ 0x47, 0x45, 0xfb, 0x57, 0xef, 0xca, 0x82, 0x99, 0x72, 0xdc, 0xe6, 0x78,
+ 0xe3, 0x70, 0xa8, 0x28, 0x9e, 0x33, 0x16, 0x72, 0x80, 0x10, 0x54, 0x16,
+ 0x58, 0x56, 0x74, 0x64, 0xd2, 0x8e, 0x6f, 0x5c, 0x17, 0xbc, 0x34, 0xcf,
+ 0xaa, 0x09, 0xbe, 0x2e, 0xef, 0x3d, 0xa2, 0xf2, 0xbd, 0x22, 0xaa, 0xac,
+ 0xf3, 0x42, 0xc1, 0xfe, 0xdc, 0x7d, 0xd6, 0x48, 0xe9, 0x03, 0x21, 0xda,
+ 0x45, 0x99, 0x41, 0x8e, 0xe0, 0x31, 0xd3, 0x3b, 0x4a, 0x87, 0x09, 0x13,
+ 0xcf, 0x1d, 0xf9, 0xad, 0xbc, 0xc0, 0x95, 0x44, 0x32, 0x12, 0x35, 0xa4,
+ 0x7d, 0x36, 0xbe, 0xff, 0xa4, 0x49, 0x33, 0xc8, 0x1f, 0x96, 0xf0, 0xfe,
+ 0x2d, 0xbc, 0xec, 0xef, 0xfd, 0x5e, 0xb4, 0x7d, 0xe6, 0x12, 0xd5, 0x1b,
+ 0x2a, 0x4f, 0x72, 0x47, 0x22, 0x0d, 0xdc, 0xf8, 0x20, 0xbf, 0x08, 0xf6,
+ 0xfc, 0x28, 0xff, 0x9f, 0x0f, 0x87, 0x5d, 0x80, 0x4e, 0x7a, 0xf8, 0xdd,
+ 0x4e, 0x73, 0x9e, 0x26, 0x1b, 0x7b, 0xcd, 0x56, 0xfc, 0x4c, 0x2a, 0xd8,
+ 0x51, 0x5a, 0x38, 0x11, 0x4a, 0x5c, 0x10, 0xe2, 0x8f, 0x0c, 0x1c, 0x18,
+ 0x04, 0x01, 0x96, 0x6d, 0x21, 0xdd, 0x02, 0xd2, 0xf5, 0xa5, 0xcc, 0xf4,
+ 0x78, 0x35, 0x96, 0x99, 0xae, 0xc5, 0x1d, 0xc4, 0xd9, 0xe1, 0x02, 0x53,
+ 0x76, 0xe1, 0x4a, 0x0e, 0xd8, 0x19, 0x9b, 0x61, 0x87, 0xea, 0x30, 0x83,
+ 0x8a, 0xa0, 0x8f, 0x19, 0xab, 0x38, 0x4d, 0x1b, 0x07, 0xc1, 0xea, 0x91,
+ 0x6e, 0x71, 0x73, 0x9a, 0x35, 0xe9, 0x97, 0x75, 0x20, 0x91, 0xbb, 0x37,
+ 0xb1, 0x01, 0x77, 0xad, 0xec, 0x2c, 0x68, 0x47, 0xd5, 0x08, 0x95, 0x3b,
+ 0xf5, 0x14, 0x4a, 0x19, 0x2e, 0xad, 0xb8, 0xac, 0xfc, 0x93, 0x00, 0xa4,
+ 0x83, 0xdd, 0x52, 0x23, 0xe6, 0x4e, 0x20, 0xeb, 0x67, 0xc7, 0x84, 0xa9,
+ 0x14, 0x4f, 0x90, 0x18, 0x90, 0x55, 0xad, 0xa3, 0x68, 0x7e, 0xcf, 0xd3,
+ 0xf2, 0xe5, 0xfe, 0x13, 0xd4, 0x47, 0x76, 0x29, 0x6e, 0x8c, 0xfc, 0x7f,
+ 0xad, 0x1c, 0x80, 0x64, 0xbf, 0xb5, 0xd7, 0x62, 0x08, 0x8e, 0x1c, 0xb2,
+ 0xb7, 0x4b, 0x8f, 0x6e, 0x11, 0xfd, 0x48, 0xe4, 0x8c, 0x13, 0x16, 0x75,
+ 0xe7, 0x83, 0xf8, 0xef, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x86, 0x92, 0xbc, 0x07, 0x76, 0x7a, 0xff, 0x03, 0x70, 0x26, 0xe5, 0xef,
+ 0x13, 0x7a, 0x5a, 0xdd, 0x8f, 0x3a, 0x4d, 0x8a, 0xe0, 0xbb, 0x87, 0xff,
+ 0xd7, 0xed, 0xce, 0xd1, 0x84, 0x1b, 0xa8, 0x70, 0x8b, 0x35, 0xf2, 0xab,
+ 0xa6, 0x85, 0x8a, 0xd6, 0xb6, 0x31, 0x99, 0x13, 0xdd, 0x29, 0x64, 0xa9,
+ 0x7f, 0xbe, 0x12, 0x58, 0x1b, 0x86, 0x55, 0x66, 0x7e, 0x03, 0x9e, 0x37,
+ 0xbb, 0x8a, 0xf3, 0x44, 0x94, 0x35, 0x32, 0x96, 0x6f, 0x4a, 0x31, 0x1a,
+ 0xf3, 0xa8, 0x09, 0x19, 0x08, 0x29, 0x83, 0x65, 0x51, 0x1f, 0xd4, 0x4c,
+ 0x43, 0x8f, 0xf2, 0x93, 0x8f, 0x1a, 0x7f, 0x3c, 0x4c, 0x00, 0x80, 0x0f,
+ 0x31, 0x06, 0xb1, 0x59, 0x62, 0x8a, 0xb1, 0x37, 0xa7, 0xb9, 0xfc, 0xc9,
+ 0xbd, 0xf1, 0xca, 0xf2, 0xd4, 0x41, 0xa0, 0xc9, 0xb8, 0x62, 0x84, 0x4f,
+ 0x55, 0x80, 0xa0, 0x33, 0xdf, 0x80, 0xb7, 0x71, 0x6d, 0xda, 0x75, 0xd6,
+ 0xc9, 0x91, 0xed, 0x43, 0x0e, 0x44, 0x96, 0xd6, 0x97, 0x2a, 0x38, 0x87,
+ 0x07, 0x1e, 0x3a, 0xa8, 0xc2, 0x48, 0x38, 0x3c, 0x8c, 0x8f, 0xd0, 0xfe,
+ 0xa7, 0xbe, 0x05, 0xa0, 0x21, 0x83, 0x7e, 0xbc, 0x2e, 0xa8, 0x66, 0x04,
+ 0xfe, 0x90, 0x44, 0xa6, 0xc7, 0xe0, 0xa6, 0xb5, 0xf9, 0x42, 0xd9, 0x24,
+ 0xe4, 0x48, 0xa4, 0x14, 0x3c, 0xf9, 0x69, 0xc5, 0x4c, 0x07, 0x49, 0xa4,
+ 0xfe, 0x3d, 0xae, 0x18, 0xb2, 0x15, 0x01, 0xa7, 0xec, 0xbf, 0xc4, 0x33,
+ 0xd6, 0x44, 0xd6, 0x27, 0x4c, 0xcd, 0x58, 0x61, 0x97, 0x15, 0xd2, 0x15,
+ 0xa4, 0xd6, 0x62, 0xfe, 0x9c, 0x56, 0x8e, 0xfc, 0xdf, 0x40, 0x17, 0xbb,
+ 0x64, 0x76, 0x95, 0x76, 0x74, 0xbb, 0xe6, 0xcd, 0xbc, 0x41, 0x33, 0xaf,
+ 0x3e, 0xac, 0x44, 0x41, 0x95, 0xb9, 0x93, 0xff, 0xb0, 0xe2, 0x98, 0x0e,
+ 0x30, 0x8c, 0x03, 0x06, 0x68, 0xc8, 0x7e, 0x64, 0xeb, 0xdb, 0xa9, 0x65,
+ 0x5f, 0xf2, 0x76, 0xc8, 0xa4, 0x75, 0x28, 0xf4, 0x7c, 0xc4, 0xb3, 0xa0,
+ 0x5e, 0xd7, 0x10, 0x45, 0x51, 0x0d, 0x13, 0x1c, 0x18, 0x2f, 0x6a, 0x16,
+ 0x6f, 0x64, 0xc4, 0x09, 0xd7, 0x7c, 0x41, 0x94, 0xd4, 0x23, 0x82, 0xbe,
+ 0x08, 0xca, 0x48, 0x84, 0x9a, 0x72, 0x96, 0xe2, 0x1c, 0x8e, 0x95, 0x59,
+ 0xc4, 0xd7, 0x25, 0xc0, 0x5d, 0x91, 0xb5, 0xd9, 0x4c, 0xd1, 0x75, 0xe8,
+ 0xda, 0x55, 0xdf, 0x44, 0x0f, 0x20, 0x18, 0xfb, 0x49, 0xdf, 0xe5, 0xcb,
+ 0xdf, 0xfe, 0x75, 0xfd, 0x44, 0x01, 0x5d, 0x28, 0x8f, 0xf9, 0xc2, 0xcb,
+ 0xa3, 0xed, 0x3b, 0x1e, 0x78, 0xe3, 0x0c, 0x3a, 0xac, 0xbc, 0xfe, 0x9e,
+ 0xff, 0x99, 0x1b, 0x35, 0xca, 0xf7, 0x00, 0x51, 0xa2, 0x6d, 0xb1, 0x0a,
+ 0xec, 0xaa, 0x99, 0x48, 0x07, 0x1a, 0x68, 0x99, 0xf0, 0xeb, 0x09, 0x07,
+ 0xc5, 0x68, 0xb4, 0xb5, 0x41, 0xb8, 0xd1, 0x18, 0x99, 0x4e, 0x68, 0x25,
+ 0xc9, 0x4d, 0x32, 0x58, 0xeb, 0xcb, 0x3b, 0x73, 0x8a, 0x26, 0x50, 0x58,
+ 0x00, 0x41, 0xc6, 0xf8, 0xc6, 0x6c, 0xf8, 0x28, 0xe3, 0x99, 0xf2, 0xcd,
+ 0xa0, 0x6f, 0xc3, 0x22, 0xd4, 0x00, 0x87, 0xd2, 0x75, 0x7f, 0xaa, 0x84,
+ 0x11, 0x10, 0x7f, 0x7a, 0x28, 0x4b, 0x69, 0xf9, 0xfa, 0x22, 0xa7, 0x95,
+ 0x37, 0x61, 0x46, 0x61, 0xf0, 0x66, 0x5e, 0x92, 0x5c, 0x2e, 0xd8, 0x97,
+ 0x86, 0xa5, 0x3b, 0x2c, 0x45, 0x98, 0x1a, 0x6a, 0xc0, 0xb2, 0xff, 0x1d,
+ 0x99, 0x5c, 0x32, 0x10, 0x82, 0xd3, 0x63, 0x82, 0x8c, 0x89, 0xa2, 0x5d
diff --git a/epid/common-testhelper/testdata/ikgf/grprl.inc b/epid/common-testhelper/testdata/ikgf/grprl.inc
new file mode 100644
index 0000000..4059011
--- /dev/null
+++ b/epid/common-testhelper/testdata/ikgf/grprl.inc
@@ -0,0 +1,124 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 2.0 group revocation list
+ * Group : GroupA
+ * Issuer : iKGF
+ */
+ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x32,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32,
diff --git a/epid/common-testhelper/unittests/bignum_wrapper-test.cc b/epid/common-testhelper/unittests/bignum_wrapper-test.cc
new file mode 100644
index 0000000..2f4db3f
--- /dev/null
+++ b/epid/common-testhelper/unittests/bignum_wrapper-test.cc
@@ -0,0 +1,174 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Bignum C++ wrapper unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+#include "epid/common/src/memory.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class BigNumObjTest : public ::testing::Test {
+ public:
+ static const BigNumStr str_0;
+ static const std::vector<unsigned char> vec_0;
+};
+
+const BigNumStr BigNumObjTest::str_0 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+const std::vector<unsigned char> BigNumObjTest::vec_0 = {0, 0, 0, 0,
+ 0, 0, 0, 0};
+
+TEST_F(BigNumObjTest, ObjDefaultConstructedIsNotNull) {
+ BigNumObj bn;
+ EXPECT_NE(nullptr, (BigNum*)bn);
+}
+
+TEST_F(BigNumObjTest, ObjConstructedWithSizeIsNotNull) {
+ BigNumObj bn1(1);
+ EXPECT_NE(nullptr, (BigNum*)bn1);
+ BigNumObj bn32(32);
+ EXPECT_NE(nullptr, (BigNum*)bn32);
+}
+
+TEST_F(BigNumObjTest, AssignmentDoesNotCopyPointer) {
+ BigNumObj bn1;
+ BigNumObj bn2;
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn2);
+ bn1 = bn2;
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn2);
+}
+
+TEST_F(BigNumObjTest, CopyConstructorDoesNotCopyPointer) {
+ BigNumObj bn1;
+ BigNumObj bn2(bn1);
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn2);
+}
+
+TEST_F(BigNumObjTest, ConstructorDoesNotThrow) {
+ BigNumObj bn1;
+ BigNumObj bn2(32);
+ BigNumObj bn3(32, this->str_0);
+ BigNumObj bn4(32, this->vec_0);
+ BigNumObj bn5(this->str_0);
+ BigNumObj bn6(this->vec_0);
+
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn2);
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn3);
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn4);
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn5);
+ EXPECT_NE((BigNum*)bn1, (BigNum*)bn6);
+
+ EXPECT_NE((BigNum*)bn2, (BigNum*)bn1);
+ EXPECT_NE((BigNum*)bn2, (BigNum*)bn3);
+ EXPECT_NE((BigNum*)bn2, (BigNum*)bn4);
+ EXPECT_NE((BigNum*)bn2, (BigNum*)bn5);
+ EXPECT_NE((BigNum*)bn2, (BigNum*)bn6);
+
+ EXPECT_NE((BigNum*)bn3, (BigNum*)bn1);
+ EXPECT_NE((BigNum*)bn3, (BigNum*)bn2);
+ EXPECT_NE((BigNum*)bn3, (BigNum*)bn4);
+ EXPECT_NE((BigNum*)bn3, (BigNum*)bn5);
+ EXPECT_NE((BigNum*)bn3, (BigNum*)bn6);
+
+ EXPECT_NE((BigNum*)bn4, (BigNum*)bn1);
+ EXPECT_NE((BigNum*)bn4, (BigNum*)bn2);
+ EXPECT_NE((BigNum*)bn4, (BigNum*)bn3);
+ EXPECT_NE((BigNum*)bn4, (BigNum*)bn5);
+ EXPECT_NE((BigNum*)bn4, (BigNum*)bn6);
+
+ EXPECT_NE((BigNum*)bn5, (BigNum*)bn1);
+ EXPECT_NE((BigNum*)bn5, (BigNum*)bn2);
+ EXPECT_NE((BigNum*)bn5, (BigNum*)bn3);
+ EXPECT_NE((BigNum*)bn5, (BigNum*)bn4);
+ EXPECT_NE((BigNum*)bn5, (BigNum*)bn6);
+
+ EXPECT_NE((BigNum*)bn6, (BigNum*)bn1);
+ EXPECT_NE((BigNum*)bn6, (BigNum*)bn2);
+ EXPECT_NE((BigNum*)bn6, (BigNum*)bn3);
+ EXPECT_NE((BigNum*)bn6, (BigNum*)bn4);
+ EXPECT_NE((BigNum*)bn6, (BigNum*)bn5);
+}
+
+TEST_F(BigNumObjTest, CanCastConstToConstPointer) {
+ BigNumObj const bn;
+ BigNum const* bn_ptr = bn;
+ (void)bn_ptr;
+}
+
+TEST_F(BigNumObjTest, CanGetConstPointerFromConst) {
+ BigNumObj const bn;
+ BigNum const* bn_ptr = bn.getc();
+ (void)bn_ptr;
+}
+
+/*
+The following tests are expected to result in
+compile time errors (by design)
+*/
+/*
+TEST_F(BigNumObjTest, CannotCastConstToNonConstPointer) {
+ BigNumObj const bn;
+ BigNum * bn_ptr = bn;
+ (void) bn_ptr;
+}
+
+TEST_F(BigNumObjTest, CannotGetNonConstPointerFromConst) {
+ BigNumObj const bn;
+ BigNum * bn_ptr = bn.get();
+ (void) bn_ptr;
+}
+*/
+
+TEST_F(BigNumObjTest, CanCastNonConstToConstPointer) {
+ BigNumObj bn;
+ BigNum const* bn_ptr = bn;
+ (void)bn_ptr;
+}
+
+TEST_F(BigNumObjTest, CanGetConstPointerFromNonConst) {
+ BigNumObj bn;
+ BigNum const* bn_ptr = bn.getc();
+ (void)bn_ptr;
+}
+
+TEST_F(BigNumObjTest, CanCastNonConstToNonConstPointer) {
+ BigNumObj bn;
+ BigNum* bn_ptr = bn;
+ (void)bn_ptr;
+}
+
+TEST_F(BigNumObjTest, CanGetNonConstPointerFromNonConst) {
+ BigNumObj bn;
+ BigNum* bn_ptr = bn.get();
+ (void)bn_ptr;
+}
+
+} // namespace
diff --git a/epid/common-testhelper/unittests/ecgroup_wrapper-test.cc b/epid/common-testhelper/unittests/ecgroup_wrapper-test.cc
new file mode 100644
index 0000000..fc9ba85
--- /dev/null
+++ b/epid/common-testhelper/unittests/ecgroup_wrapper-test.cc
@@ -0,0 +1,154 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcGroup C++ wrapper unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+#include "epid/common/types.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class EcGroupObjTest : public ::testing::Test {
+ public:
+ static const BigNumStr q_str;
+ static const FqElemStr b_str;
+ static const BigNumStr p_str;
+ static const BigNumStr h1;
+ static const G1ElemStr g1_str;
+};
+const BigNumStr EcGroupObjTest::q_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}}};
+const FqElemStr EcGroupObjTest::b_str = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}};
+const BigNumStr EcGroupObjTest::p_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+const BigNumStr EcGroupObjTest::h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+const G1ElemStr EcGroupObjTest::g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+
+TEST_F(EcGroupObjTest, ObjDefaultConstructedIsNotNull) {
+ EcGroupObj group;
+ EXPECT_NE(nullptr, (EcGroup*)group);
+}
+
+TEST_F(EcGroupObjTest, AssignmentCopiesPointer) {
+ EcGroupObj group1;
+ EcGroupObj group2;
+ EXPECT_NE((EcGroup*)group1, (EcGroup*)group2);
+ group1 = group2;
+ EXPECT_EQ((EcGroup*)group1, (EcGroup*)group2);
+}
+
+TEST_F(EcGroupObjTest, CopyConstructorCopiesPointer) {
+ EcGroupObj group1;
+ EcGroupObj group2(group1);
+ EXPECT_EQ((EcGroup*)group1, (EcGroup*)group2);
+}
+
+TEST_F(EcGroupObjTest, ConstructorDoesNotThrow) {
+ EcGroupObj group1;
+ FiniteFieldObj fq(this->q_str);
+ EcGroupObj group2(&fq, FfElementObj(&fq), FfElementObj(&fq, this->b_str),
+ FfElementObj(&fq, this->g1_str.x),
+ FfElementObj(&fq, this->g1_str.y), BigNumObj(this->p_str),
+ BigNumObj(this->h1));
+}
+
+TEST_F(EcGroupObjTest, CanCastConstToConstPointer) {
+ EcGroupObj const group;
+ EcGroup const* group_ptr = group;
+ (void)group_ptr;
+}
+
+TEST_F(EcGroupObjTest, CanGetConstPointerFromConst) {
+ EcGroupObj const group;
+ EcGroup const* group_ptr = group.getc();
+ (void)group_ptr;
+}
+
+/*
+The following tests are expected to result in
+compile time errors (by design)
+*/
+/*
+TEST_F(EcGroupObjTest, CannotCastConstToNonConstPointer) {
+ EcGroupObj const group;
+ EcGroup * group_ptr = group;
+ (void) group_ptr;
+}
+
+TEST_F(EcGroupObjTest, CannotGetNonConstPointerFromConst) {
+ EcGroupObj const group;
+ EcGroup * group_ptr = group.get();
+ (void) group_ptr;
+}
+*/
+
+TEST_F(EcGroupObjTest, CanCastNonConstToConstPointer) {
+ EcGroupObj group;
+ EcGroup const* group_ptr = group;
+ (void)group_ptr;
+}
+
+TEST_F(EcGroupObjTest, CanGetConstPointerFromNonConst) {
+ EcGroupObj group;
+ EcGroup const* group_ptr = group.getc();
+ (void)group_ptr;
+}
+
+TEST_F(EcGroupObjTest, CanCastNonConstToNonConstPointer) {
+ EcGroupObj group;
+ EcGroup* group_ptr = group;
+ (void)group_ptr;
+}
+
+TEST_F(EcGroupObjTest, CanGetNonConstPointerFromNonConst) {
+ EcGroupObj group;
+ EcGroup* group_ptr = group.get();
+ (void)group_ptr;
+}
+
+} // namespace
diff --git a/epid/common-testhelper/unittests/ecpoint_wrapper-test.cc b/epid/common-testhelper/unittests/ecpoint_wrapper-test.cc
new file mode 100644
index 0000000..db77afc
--- /dev/null
+++ b/epid/common-testhelper/unittests/ecpoint_wrapper-test.cc
@@ -0,0 +1,134 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcPoint C++ wrapper unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class EcPointObjTest : public ::testing::Test {
+ public:
+ static EcGroupObj group;
+ static const G1ElemStr group_str_1;
+ static const G1ElemStr group_str_2;
+};
+
+const G1ElemStr EcPointObjTest::group_str_1 = {
+ {{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0x78, 0x65, 0x28, 0xCB, 0xAF, 0x07, 0x52, 0x50, 0x55, 0x7A, 0x5F,
+ 0x30, 0x0A, 0xC0, 0xB4, 0x6B, 0xEA, 0x6F, 0xE2, 0xF6, 0x6D, 0x96,
+ 0xF7, 0xCD, 0xC8, 0xD3, 0x12, 0x7F, 0x1F, 0x3A, 0x8B, 0x42}}}};
+
+const G1ElemStr EcPointObjTest::group_str_2 = {
+ {{{0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2,
+ 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E,
+ 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2}}},
+ {{{0x63, 0xB0, 0xAD, 0xB8, 0x2C, 0xE8, 0x14, 0xFD, 0xA2, 0x39, 0x0E,
+ 0x66, 0xB7, 0xD0, 0x6A, 0xAB, 0xEE, 0xFA, 0x2E, 0x24, 0x9B, 0xB5,
+ 0x14, 0x35, 0xFE, 0xB6, 0xB0, 0xFF, 0xFD, 0x5F, 0x73, 0x19}}}};
+
+EcGroupObj EcPointObjTest::group;
+
+TEST_F(EcPointObjTest, ObjDefaultConstructedIsNotNull) {
+ EcPointObj point(&group);
+ EXPECT_NE(nullptr, (EcPoint*)point);
+}
+
+TEST_F(EcPointObjTest, AssignmentDoesNotCopyPointer) {
+ EcPointObj point1(&group, group_str_1);
+ EcPointObj point2(&group, group_str_2);
+ EXPECT_NE((EcPoint*)point1, (EcPoint*)point2);
+ point1 = point2;
+ EXPECT_NE((EcPoint*)point1, (EcPoint*)point2);
+}
+
+TEST_F(EcPointObjTest, CopyConstructorDoesNotCopyPointer) {
+ EcPointObj point1(&group, group_str_1);
+ EcPointObj point2(point1);
+ EXPECT_NE((EcPoint*)point1, (EcPoint*)point2);
+}
+
+TEST_F(EcPointObjTest, CanCastConstToConstPointer) {
+ EcPointObj const point(&group);
+ EcPoint const* point_ptr = point;
+ (void)point_ptr;
+}
+
+TEST_F(EcPointObjTest, CanGetConstPointerFromConst) {
+ EcPointObj const point(&group);
+ EcPoint const* point_ptr = point.getc();
+ (void)point_ptr;
+}
+
+/*
+The following tests are expected to result in
+compile time errors (by design)
+*/
+/*
+TEST_F(EcPointObjTest, CannotCastConstToNonConstPointer) {
+ EcPointObj const point(&group);
+ EcPoint * point_ptr = point;
+ (void) point_ptr;
+}
+
+TEST_F(EcPointObjTest, CannotGetNonConstPointerFromConst) {
+ EcPointObj const point(&group);
+ EcPoint * point_ptr = point.get();
+ (void) point_ptr;
+}
+*/
+
+TEST_F(EcPointObjTest, CanCastNonConstToConstPointer) {
+ EcPointObj point(&group);
+ EcPoint const* point_ptr = point;
+ (void)point_ptr;
+}
+
+TEST_F(EcPointObjTest, CanGetConstPointerFromNonConst) {
+ EcPointObj point(&group);
+ EcPoint const* point_ptr = point.getc();
+ (void)point_ptr;
+}
+
+TEST_F(EcPointObjTest, CanCastNonConstToNonConstPointer) {
+ EcPointObj point(&group);
+ EcPoint* point_ptr = point;
+ (void)point_ptr;
+}
+
+TEST_F(EcPointObjTest, CanGetNonConstPointerFromNonConst) {
+ EcPointObj point(&group);
+ EcPoint* point_ptr = point.get();
+ (void)point_ptr;
+}
+
+} // namespace
diff --git a/epid/common-testhelper/unittests/ffelement_wrapper-test.cc b/epid/common-testhelper/unittests/ffelement_wrapper-test.cc
new file mode 100644
index 0000000..c9e1361
--- /dev/null
+++ b/epid/common-testhelper/unittests/ffelement_wrapper-test.cc
@@ -0,0 +1,156 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FfElement C++ wrapper unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class FfElementObjTest : public ::testing::Test {
+ public:
+ static FiniteFieldObj ff;
+ static const BigNumStr prime_str;
+
+ static const FpElemStr ff_str_1;
+ static const FpElemStr ff_str_2;
+ static const Fq2ElemStr ff_2_str;
+};
+
+/// Intel(R) EPID 2.0 parameter p
+const BigNumStr FfElementObjTest::prime_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+
+const FpElemStr FfElementObjTest::ff_str_1 = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+};
+
+const FpElemStr FfElementObjTest::ff_str_2 = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+};
+
+const Fq2ElemStr FfElementObjTest::ff_2_str = {
+ // 1
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ // 2
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20};
+
+FiniteFieldObj FfElementObjTest::ff(prime_str);
+
+TEST_F(FfElementObjTest, ObjDefaultConstructedIsNotNull) {
+ FfElementObj ffe(&ff);
+ EXPECT_NE(nullptr, (FfElement*)ffe);
+}
+
+TEST_F(FfElementObjTest, AssignmentDoesNotCopyPointer) {
+ FfElementObj ffe1(&ff, ff_str_1);
+ FfElementObj ffe2(&ff, ff_str_2);
+ EXPECT_NE((FfElement*)ffe1, (FfElement*)ffe2);
+ ffe1 = ffe2;
+ EXPECT_NE((FfElement*)ffe1, (FfElement*)ffe2);
+}
+
+TEST_F(FfElementObjTest, CopyConstructorDoesNotCopyPointer) {
+ FfElementObj ffe1(&ff, ff_str_1);
+ FfElementObj ffe2(ffe1);
+ EXPECT_NE((FfElement*)ffe1, (FfElement*)ffe2);
+}
+
+TEST_F(FfElementObjTest, CanConstructBinomialElement) {
+ FfElementObj ffe1(&ff, ff_str_1);
+ FiniteFieldObj ff2(ff, ffe1, 2);
+ FfElementObj ff2_e1(&ff2, ff_2_str);
+ EXPECT_NE(nullptr, (FfElement*)ff2_e1);
+}
+
+TEST_F(FfElementObjTest, CanCastConstToConstPointer) {
+ FfElementObj const ffe(&ff);
+ FfElement const* ffe_ptr = ffe;
+ (void)ffe_ptr;
+}
+
+TEST_F(FfElementObjTest, CanGetConstPointerFromConst) {
+ FfElementObj const ffe(&ff);
+ FfElement const* ffe_ptr = ffe.getc();
+ (void)ffe_ptr;
+}
+
+/*
+The following tests are expected to result in
+compile time errors (by design)
+*/
+/*
+TEST_F(FfElementObjTest, CannotCastConstToNonConstPointer) {
+ FfElementObj const ffe(&ff);
+ FfElement * ffe_ptr = ffe;
+ (void) ffe_ptr;
+}
+
+TEST_F(FfElementObjTest, CannotGetNonConstPointerFromConst) {
+ FfElementObj const ffe(&ff);
+ FfElement * ffe_ptr = ffe.get();
+ (void) ffe_ptr;
+}
+*/
+
+TEST_F(FfElementObjTest, CanCastNonConstToConstPointer) {
+ FfElementObj ffe(&ff);
+ FfElement const* ffe_ptr = ffe;
+ (void)ffe_ptr;
+}
+
+TEST_F(FfElementObjTest, CanGetConstPointerFromNonConst) {
+ FfElementObj ffe(&ff);
+ FfElement const* ffe_ptr = ffe.getc();
+ (void)ffe_ptr;
+}
+
+TEST_F(FfElementObjTest, CanCastNonConstToNonConstPointer) {
+ FfElementObj ffe(&ff);
+ FfElement* ffe_ptr = ffe;
+ (void)ffe_ptr;
+}
+
+TEST_F(FfElementObjTest, CanGetNonConstPointerFromNonConst) {
+ FfElementObj ffe(&ff);
+ FfElement* ffe_ptr = ffe.get();
+ (void)ffe_ptr;
+}
+
+} // namespace
diff --git a/epid/common-testhelper/unittests/finite_field_wrapper-test.cc b/epid/common-testhelper/unittests/finite_field_wrapper-test.cc
new file mode 100644
index 0000000..62a29c6
--- /dev/null
+++ b/epid/common-testhelper/unittests/finite_field_wrapper-test.cc
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FiniteField C++ wrapper unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+#include "epid/common/types.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class FiniteFieldObjTest : public ::testing::Test {
+ public:
+ static const BigNumStr prime_str;
+ static const FpElemStr ground_str;
+};
+
+/// Intel(R) EPID 2.0 parameter p
+const BigNumStr FiniteFieldObjTest::prime_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+
+const FpElemStr FiniteFieldObjTest::ground_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+TEST_F(FiniteFieldObjTest, ObjDefaultConstructedIsNotNull) {
+ FiniteFieldObj ff;
+ EXPECT_NE(nullptr, (FiniteField*)ff);
+}
+
+TEST_F(FiniteFieldObjTest, AssignmentCopiesPointer) {
+ FiniteFieldObj ff1;
+ FiniteFieldObj ff2;
+ EXPECT_NE((FiniteField*)ff1, (FiniteField*)ff2);
+ ff1 = ff2;
+ EXPECT_EQ((FiniteField*)ff1, (FiniteField*)ff2);
+}
+
+TEST_F(FiniteFieldObjTest, CopyConstructorCopiesPointer) {
+ FiniteFieldObj ff1;
+ FiniteFieldObj ff2(ff1);
+ EXPECT_EQ((FiniteField*)ff1, (FiniteField*)ff2);
+}
+
+TEST_F(FiniteFieldObjTest, ConstructorDoesNotThrow) {
+ FiniteFieldObj ff1;
+ FiniteFieldObj ff2(this->prime_str);
+ FfElementObj ffe(&ff2, this->ground_str);
+ FiniteFieldObj ff3(ff2, ffe, 2);
+}
+
+TEST_F(FiniteFieldObjTest, CanCastConstToConstPointer) {
+ FiniteFieldObj const ff;
+ FiniteField const* ff_ptr = ff;
+ (void)ff_ptr;
+}
+
+TEST_F(FiniteFieldObjTest, CanGetConstPointerFromConst) {
+ FiniteFieldObj const ff;
+ FiniteField const* ff_ptr = ff.getc();
+ (void)ff_ptr;
+}
+
+/*
+The following tests are expected to result in
+compile time errors (by design)
+*/
+/*
+TEST_F(FiniteFieldObjTest, CannotCastConstToNonConstPointer) {
+ FiniteFieldObj const ff;
+ FiniteField * ff_ptr = ff;
+ (void) ff_ptr;
+}
+
+TEST_F(FiniteFieldObjTest, CannotGetNonConstPointerFromConst) {
+ FiniteFieldObj const ff;
+ FiniteField * ff_ptr = ff.get();
+ (void) ff_ptr;
+}
+*/
+
+TEST_F(FiniteFieldObjTest, CanCastNonConstToConstPointer) {
+ FiniteFieldObj ff;
+ FiniteField const* ff_ptr = ff;
+ (void)ff_ptr;
+}
+
+TEST_F(FiniteFieldObjTest, CanGetConstPointerFromNonConst) {
+ FiniteFieldObj ff;
+ FiniteField const* ff_ptr = ff.getc();
+ (void)ff_ptr;
+}
+
+TEST_F(FiniteFieldObjTest, CanCastNonConstToNonConstPointer) {
+ FiniteFieldObj ff;
+ FiniteField* ff_ptr = ff;
+ (void)ff_ptr;
+}
+
+TEST_F(FiniteFieldObjTest, CanGetNonConstPointerFromNonConst) {
+ FiniteFieldObj ff;
+ FiniteField* ff_ptr = ff.get();
+ (void)ff_ptr;
+}
+
+} // namespace
diff --git a/epid/common-testhelper/unittests/main-test.cc b/epid/common-testhelper/unittests/main-test.cc
new file mode 100644
index 0000000..a8bb2fa
--- /dev/null
+++ b/epid/common-testhelper/unittests/main-test.cc
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Main entry point for unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/common-testhelper/verifier_wrapper-testhelper.cc b/epid/common-testhelper/verifier_wrapper-testhelper.cc
new file mode 100644
index 0000000..943d308
--- /dev/null
+++ b/epid/common-testhelper/verifier_wrapper-testhelper.cc
@@ -0,0 +1,53 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verifier C++ wrapper implementation.
+ */
+#include <cstdio>
+#include <stdexcept>
+#include <string>
+
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+
+VerifierCtxObj::VerifierCtxObj(GroupPubKey const& pub_key) : ctx_(nullptr) {
+ auto sts = EpidVerifierCreate(&pub_key, nullptr, &ctx_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidVerifierCreate()");
+ }
+}
+
+VerifierCtxObj::VerifierCtxObj(GroupPubKey const& pub_key,
+ VerifierPrecomp const& precomp)
+ : ctx_(nullptr) {
+ auto sts = EpidVerifierCreate(&pub_key, &precomp, &ctx_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "EpidVerifierCreate()");
+ }
+}
+
+VerifierCtxObj::~VerifierCtxObj() { EpidVerifierDelete(&ctx_); }
+
+VerifierCtx* VerifierCtxObj::ctx() const { return ctx_; }
+
+VerifierCtxObj::operator VerifierCtx*() const { return ctx_; }
+
+VerifierCtxObj::operator const VerifierCtx*() const { return ctx_; }
diff --git a/epid/common-testhelper/verifier_wrapper-testhelper.h b/epid/common-testhelper/verifier_wrapper-testhelper.h
new file mode 100644
index 0000000..1a42f0f
--- /dev/null
+++ b/epid/common-testhelper/verifier_wrapper-testhelper.h
@@ -0,0 +1,55 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verifier C++ wrapper interface.
+ */
+#ifndef EPID_COMMON_TESTHELPER_VERIFIER_WRAPPER_TESTHELPER_H_
+#define EPID_COMMON_TESTHELPER_VERIFIER_WRAPPER_TESTHELPER_H_
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+/// C++ Wrapper to manage memory for VerifierCtx via RAII
+class VerifierCtxObj {
+ public:
+ /// Create a VerifierCtx
+ explicit VerifierCtxObj(GroupPubKey const& pub_key);
+ /// Create a VerifierCtx given precomputation blob
+ VerifierCtxObj(GroupPubKey const& pub_key, VerifierPrecomp const& precomp);
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ VerifierCtxObj(const VerifierCtxObj&) = delete;
+ VerifierCtxObj& operator=(const VerifierCtxObj&) = delete;
+
+ /// Destroy the VerifierCtx
+ ~VerifierCtxObj();
+ /// get a pointer to the stored VerifierCtx
+ VerifierCtx* ctx() const;
+ /// cast operator to get the pointer to the stored VerifierCtx
+ operator VerifierCtx*() const;
+ /// const cast operator to get the pointer to the stored VerifierCtx
+ operator const VerifierCtx*() const;
+
+ private:
+ /// The stored VerifierCtx
+ VerifierCtx* ctx_;
+};
+
+#endif // EPID_COMMON_TESTHELPER_VERIFIER_WRAPPER_TESTHELPER_H_
diff --git a/epid/common/1.1/file_parser.h b/epid/common/1.1/file_parser.h
new file mode 100644
index 0000000..70ccfdc
--- /dev/null
+++ b/epid/common/1.1/file_parser.h
@@ -0,0 +1,220 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Intel(R) EPID 1.1 issuer material parsing utilities.
+/*!
+ * \file
+ */
+#ifndef EPID_COMMON_1_1_FILE_PARSER_H_
+#define EPID_COMMON_1_1_FILE_PARSER_H_
+
+#include <stddef.h>
+
+#include "epid/common/1.1/types.h"
+#include "epid/common/errors.h"
+#include "epid/common/file_parser.h"
+
+/// Parser for 1.1 issuer material
+/*!
+ \defgroup Epid11FileParserModule Intel(R) EPID 1.1 support
+
+ Defines the APIs needed to parse Intel(R) EPID 1.1 issuer material.
+
+ \ingroup FileParser
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R)
+ EPID 1.1 support</b></a>
+ @{
+*/
+
+/// Extracts group public key from buffer in issuer binary format
+/*!
+
+ Extracts the first group public key from a buffer with format of
+ Intel(R) EPID 1.1 Group Public Key Certificate Binary File. The
+ function validates that the first public key was signed by the
+ private key corresponding to the provided CA certificate and the
+ size of the input buffer is correct.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing public key to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] pubkey
+ The extracted group public key.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R)
+ EPID 1.1
+ support</b></a>
+
+ */
+EpidStatus Epid11ParseGroupPubKeyFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11GroupPubKey* pubkey);
+
+/// Extracts private key revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the private key revocation list from a buffer with format of
+ Intel(R) EPID 1.1 Binary Private Key Revocation List File. The function
+ validates that the revocation list was signed by the private
+ key corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R)
+ EPID 1.1 support</b></a>
+
+ */
+EpidStatus Epid11ParsePrivRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11PrivRl* rl, size_t* rl_len);
+
+/// Extracts signature revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the signature based revocation list from a buffer with
+ format of Intel(R) EPID 1.1 Binary Signature Revocation List File. The
+ function
+ validates that the revocation list was signed by the private key
+ corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R)
+ EPID 1.1 support</b></a>
+
+ */
+EpidStatus Epid11ParseSigRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, Epid11SigRl* rl,
+ size_t* rl_len);
+
+/// Extracts group revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the group revocation list from a buffer with format of
+ Intel(R) EPID 1.1 Binary Group Certificate Revocation List File. The function
+ validates that the revocation list was signed by the private key
+ corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R)
+ EPID 1.1 support</b></a>
+
+ */
+EpidStatus Epid11ParseGroupRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11GroupRl* rl, size_t* rl_len);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_1_1_FILE_PARSER_H_
diff --git a/epid/common/1.1/src/commitment.c b/epid/common/1.1/src/commitment.c
new file mode 100644
index 0000000..cf16144
--- /dev/null
+++ b/epid/common/1.1/src/commitment.c
@@ -0,0 +1,135 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Commitment hash implementation.
+ */
+#include "epid/common/1.1/src/commitment.h"
+#include <limits.h>
+#include <stdio.h>
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/memory.h"
+
+EpidStatus SetKeySpecificEpid11CommitValues(Epid11GroupPubKey const* pub_key,
+ Epid11CommitValues* values) {
+ static const Epid11Params params = {
+#include "epid/common/1.1/src/epid11params_tate.inc"
+ };
+
+ if (!pub_key || !values) return kEpidBadArgErr;
+
+ values->p = params.p;
+ values->g1 = params.g1;
+ values->g2 = params.g2;
+ values->g3 = params.g3;
+ values->h1 = pub_key->h1;
+ values->h2 = pub_key->h2;
+ values->w = pub_key->w;
+
+ return kEpidNoErr;
+}
+
+EpidStatus SetCalculatedEpid11CommitValues(
+ Epid11G3ElemStr const* B, Epid11G3ElemStr const* K,
+ Epid11G1ElemStr const* T1, Epid11G1ElemStr const* T2, EcPoint const* R1,
+ EcPoint const* R2, EcPoint const* R3, FfElement const* R4, EcGroup* G1,
+ EcGroup* G3, FiniteField* GT, Epid11CommitValues* values) {
+ EpidStatus result;
+ if (!B || !K || !T1 || !T2 || !R1 || !R2 || !R3 || !R4 || !G1 || !G3 || !GT ||
+ !values) {
+ return kEpidBadArgErr;
+ }
+
+ values->B = *B;
+ values->K = *K;
+ values->T1 = *T1;
+ values->T2 = *T2;
+
+ result = WriteEcPoint(G1, R1, &values->R1, sizeof(values->R1));
+ if (kEpidNoErr != result) return result;
+ result = WriteEcPoint(G1, R2, &values->R2, sizeof(values->R2));
+ if (kEpidNoErr != result) return result;
+ result = WriteEcPoint(G3, R3, &values->R3, sizeof(values->R3));
+ if (kEpidNoErr != result) return result;
+ result = WriteFfElement(GT, R4, &values->R4, sizeof(values->R4));
+ if (kEpidNoErr != result) return result;
+
+ return kEpidNoErr;
+}
+
+EpidStatus CalculateEpid11CommitmentHash(Epid11CommitValues const* values,
+ void const* msg, uint32_t msg_len,
+ OctStr80 const* nd, Sha256Digest* c) {
+ EpidStatus result;
+
+#pragma pack(1)
+ struct {
+ Sha256Digest t4;
+ OctStr80 nd;
+ uint32_t msg_len;
+ uint8_t msg[1];
+ }* t4mconcat_buf = NULL;
+#pragma pack()
+ size_t max_msg_len =
+ SIZE_MAX - (sizeof(*t4mconcat_buf) - sizeof(t4mconcat_buf->msg));
+ size_t t4mconcat_size =
+ sizeof(*t4mconcat_buf) - sizeof(t4mconcat_buf->msg) + msg_len;
+
+ if (!values || !nd || !c) return kEpidBadArgErr;
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (max_msg_len < (size_t)msg_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ // compute c = H(t4 || nd || msg_len || msg).
+ t4mconcat_buf = SAFE_ALLOC(t4mconcat_size);
+ if (!t4mconcat_buf) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Calculate c = Hash(t4 || nd || mSize || m) where t4 is Hash(p || g1 || g2
+ // || g3 || h1 || h2 || w || B || K || T1 || T2 || R1 || R2 || R3 || R4).
+ result = Sha256MessageDigest(values, sizeof(*values), &t4mconcat_buf->t4);
+ if (kEpidNoErr != result) break;
+ t4mconcat_buf->nd = *nd;
+ t4mconcat_buf->msg_len = ntohl(msg_len);
+ // place variable length msg into t4mconcat_buf
+ if (msg) {
+ if (0 != memcpy_S(&t4mconcat_buf->msg[0],
+ t4mconcat_size - sizeof(*t4mconcat_buf) +
+ sizeof(t4mconcat_buf->msg),
+ msg, msg_len)) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ }
+ result = Sha256MessageDigest(t4mconcat_buf, t4mconcat_size, c);
+ if (kEpidNoErr != result) break;
+
+ result = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(t4mconcat_buf);
+
+ return result;
+}
diff --git a/epid/common/1.1/src/commitment.h b/epid/common/1.1/src/commitment.h
new file mode 100644
index 0000000..ee3d9b1
--- /dev/null
+++ b/epid/common/1.1/src/commitment.h
@@ -0,0 +1,137 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_1_1_SRC_COMMITMENT_H_
+#define EPID_COMMON_1_1_SRC_COMMITMENT_H_
+/*!
+ * \file
+ * \brief Commitment hash interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include "epid/common/1.1/types.h"
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/math/hash.h"
+
+#pragma pack(1)
+/// Storage for values to create Intel(R) EPID 1.1 commitment in Sign and Verify
+/// algorithms
+typedef struct Epid11CommitValues {
+ BigNumStr p; ///< Intel(R) EPID 1.1 parameter p
+ Epid11G1ElemStr g1; ///< Intel(R) EPID 1.1 parameter g1
+ Epid11G2ElemStr g2; ///< Intel(R) EPID 1.1 parameter g2
+ Epid11G1ElemStr g3; ///< Intel(R) EPID 1.1 parameter g3
+ Epid11G1ElemStr h1; ///< Group public key value h1
+ Epid11G1ElemStr h2; ///< Group public key value h2
+ Epid11G2ElemStr w; ///< Group public key value w
+ Epid11G3ElemStr B; ///< Variable B computed in algorithm
+ Epid11G3ElemStr K; ///< Variable K computed in algorithm
+ Epid11G1ElemStr T1; ///< Variable T1 computed in algorithm
+ Epid11G1ElemStr T2; ///< Variable T2 computed in algorithm
+ Epid11G1ElemStr R1; ///< Variable R1 computed in algorithm
+ Epid11G1ElemStr R2; ///< Variable R2 computed in algorithm
+ Epid11G3ElemStr R3; ///< Variable R3 computed in algorithm
+ Epid11GtElemStr R4; ///< Variable R4 computed in algorithm
+} Epid11CommitValues;
+#pragma pack()
+
+/// Set Intel(R) EPID 1.1 group public key related fields to Epid11CommitValues
+/// structure
+/*!
+ Set p, g1, g2, g3, h1, h2 and w fields of values argument.
+
+ \param[in] pub_key
+ Intel(R) EPID 1.1 Group public key
+ \param[out] values
+ Pointer to Epid11CommitValues structure to fill.
+
+ \returns ::EpidStatus
+
+ \see CalculateCommitmentHash
+*/
+EpidStatus SetKeySpecificEpid11CommitValues(Epid11GroupPubKey const* pub_key,
+ Epid11CommitValues* values);
+
+/// Set Epid11CommitValues structure fields calculated in Intel(R) EPID 1.1 Sign
+/// or Verify algorithm
+/*!
+ Set B, K, T1, T2, R1, R2, R3 and R4 fields of values argument.
+
+ \param[in] B
+ Value of B to set
+ \param[in] K
+ Value of K to set
+ \param[in] T1
+ Value of T1 to set
+ \param[in] T2
+ Value of T2 to set
+ \param[in] R1
+ Value of R1 to set
+ \param[in] R2
+ Value of R2 to set
+ \param[in] R3
+ Value of R3 to set
+ \param[in] R4
+ Value of R4 to set
+ \param[in] G1
+ EcGroup containing element R1, R2
+ \param[in] G3
+ EcGroup containing element R3
+ \param[in] GT
+ FiniteField containing element R4
+ \param[out] values
+ Pointer to CommitValues structure to fill.
+
+ \returns ::EpidStatus
+
+ \see CalculateCommitmentHash
+*/
+EpidStatus SetCalculatedEpid11CommitValues(
+ Epid11G3ElemStr const* B, Epid11G3ElemStr const* K,
+ Epid11G1ElemStr const* T1, Epid11G1ElemStr const* T2, EcPoint const* R1,
+ EcPoint const* R2, EcPoint const* R3, FfElement const* R4, EcGroup* G1,
+ EcGroup* G3, FiniteField* GT, Epid11CommitValues* values);
+
+/// Calculate Hash(t4 || nd || mSize || m) for Intel(R) EPID 1.1 Sign and Verfiy
+/// algorithms
+/*!
+ Calculate c = Hash(t4 || nd || mSize || m) where t4 is
+ Hash(p || g1 || g2 || g3 || h1 || h2 || w || B || K || T1 || T2 || R1 || R2 ||
+ R3 || R4).
+
+ \param[in] values
+ Commit values to hash
+ \param[in] msg
+ Message to hash
+ \param[in] msg_len
+ Size of msg buffer in bytes
+ \param[in] nd
+ 80-bit big integer
+ \param[out] c
+ Result of calculation
+
+ \returns ::EpidStatus
+
+ \see SetKeySpecificCommitValues
+ \see SetCalculatedCommitValues
+*/
+EpidStatus CalculateEpid11CommitmentHash(Epid11CommitValues const* values,
+ void const* msg, uint32_t msg_len,
+ OctStr80 const* nd, Sha256Digest* c);
+
+/*! @} */
+#endif // EPID_COMMON_1_1_SRC_COMMITMENT_H_
diff --git a/epid/common/1.1/src/epid11params.c b/epid/common/1.1/src/epid11params.c
new file mode 100644
index 0000000..8692f0e
--- /dev/null
+++ b/epid/common/1.1/src/epid11params.c
@@ -0,0 +1,469 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Intel(R) EPID 1.1 constant parameters implementation.
+*/
+#include "epid/common/1.1/src/epid11params.h"
+#include "epid/common/math/tatepairing.h"
+#include "epid/common/src/memory.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(a) (sizeof(a) / sizeof((a)[0]))
+
+/// create a new Finite Field Fqd
+static EpidStatus NewFqd(Epid11Params const* params, FiniteField* Fq,
+ FiniteField** Fqd);
+
+/// create a new Finite Field Fqk
+EpidStatus NewFqk(Epid11Params const* params, FiniteField* Fq, FiniteField* Fqd,
+ FiniteField** Fqk);
+
+/// create a new Elliptic curve group G1 over Fq
+static EpidStatus NewG1(Epid11Params const* params, FiniteField* Fq,
+ EcGroup** G1);
+
+/// create a new Elliptic curve group G2 over Fqd
+static EpidStatus NewG2(Epid11Params const* params, FiniteField* Fq,
+ FiniteField* Fqd, EcGroup** G2);
+
+/// create a new Elliptic curve group G3 over Fq'
+static EpidStatus NewG3(Epid11Params const* params, FiniteField* Fq_tick,
+ EcGroup** G3);
+
+EpidStatus CreateEpid11Params(Epid11Params_** params) {
+ EpidStatus result = kEpidErr;
+ Epid11Params_* _params = NULL;
+ Epid11Params params_str = {
+#include "epid/common/1.1/src/epid11params_tate.inc"
+ };
+
+ if (!params) return kEpidBadArgErr;
+
+ do {
+ _params = SAFE_ALLOC(sizeof(Epid11Params_));
+ if (!_params) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // BigNum* p;
+ result = NewBigNum(sizeof(params_str.p), &_params->p);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params_str.p, sizeof(params_str.p), _params->p);
+ BREAK_ON_EPID_ERROR(result);
+ // BigNum* p_tick;
+ result = NewBigNum(sizeof(params_str.p_tick), &_params->p_tick);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params_str.p_tick, sizeof(params_str.p_tick),
+ _params->p_tick);
+ BREAK_ON_EPID_ERROR(result);
+
+ // FiniteField* Fp;
+ result = NewFiniteField(&params_str.p, &_params->Fp);
+ BREAK_ON_EPID_ERROR(result);
+ // FiniteField* Fq;
+ result = NewFiniteField(&params_str.q, &_params->Fq);
+ BREAK_ON_EPID_ERROR(result);
+ // FiniteField* Fp_tick;
+ result = NewFiniteField(&params_str.p_tick, &_params->Fp_tick);
+ BREAK_ON_EPID_ERROR(result);
+ // FiniteField* Fq_tick;
+ result = NewFiniteField(&params_str.q_tick, &_params->Fq_tick);
+ BREAK_ON_EPID_ERROR(result);
+ // FiniteField* Fqd;
+ result = NewFqd(&params_str, _params->Fq, &_params->Fqd);
+ BREAK_ON_EPID_ERROR(result);
+
+ // EcGroup* G1;
+ result = NewG1(&params_str, _params->Fq, &_params->G1);
+ BREAK_ON_EPID_ERROR(result);
+ // EcGroup* G2;
+ result = NewG2(&params_str, _params->Fq, _params->Fqd, &_params->G2);
+ BREAK_ON_EPID_ERROR(result);
+ // EcGroup* G3;
+ result = NewG3(&params_str, _params->Fq_tick, &_params->G3);
+ BREAK_ON_EPID_ERROR(result);
+ // FiniteField* GT;
+ result = NewFqk(&params_str, _params->Fq, _params->Fqd, &_params->GT);
+ BREAK_ON_EPID_ERROR(result);
+
+ // EcPoint* g1;
+ result = NewEcPoint(_params->G1, &_params->g1);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadEcPoint(_params->G1, &params_str.g1, sizeof(params_str.g1),
+ _params->g1);
+ BREAK_ON_EPID_ERROR(result);
+ // EcPoint* g2;
+ result = NewEcPoint(_params->G2, &_params->g2);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadEcPoint(_params->G2, &params_str.g2, sizeof(params_str.g2),
+ _params->g2);
+ BREAK_ON_EPID_ERROR(result);
+ // EcPoint* g3;
+ result = NewEcPoint(_params->G3, &_params->g3);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadEcPoint(_params->G3, &params_str.g3, sizeof(params_str.g3),
+ _params->g3);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Epid11PairingState* pairing_state;
+ result = NewEpid11PairingState(_params->G1, _params->G2, _params->GT,
+ &_params->pairing_state);
+ BREAK_ON_EPID_ERROR(result);
+
+ *params = _params;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result && _params) {
+ DeleteEpid11PairingState(&_params->pairing_state);
+
+ DeleteBigNum(&_params->p);
+ DeleteBigNum(&_params->p_tick);
+ DeleteEcPoint(&_params->g1);
+ DeleteEcPoint(&_params->g2);
+ DeleteEcPoint(&_params->g3);
+
+ DeleteFiniteField(&_params->Fp);
+ DeleteFiniteField(&_params->Fq);
+ DeleteFiniteField(&_params->Fp_tick);
+ DeleteFiniteField(&_params->Fq_tick);
+ DeleteFiniteField(&_params->Fqd);
+ DeleteFiniteField(&_params->GT);
+
+ DeleteEcGroup(&_params->G1);
+ DeleteEcGroup(&_params->G2);
+ DeleteEcGroup(&_params->G3);
+ SAFE_FREE(_params);
+ }
+ return result;
+}
+
+void DeleteEpid11Params(Epid11Params_** params) {
+ if (params && *params) {
+ DeleteEpid11PairingState(&(*params)->pairing_state);
+
+ DeleteBigNum(&(*params)->p);
+ DeleteBigNum(&(*params)->p_tick);
+ DeleteEcPoint(&(*params)->g1);
+ DeleteEcPoint(&(*params)->g2);
+ DeleteEcPoint(&(*params)->g3);
+
+ DeleteFiniteField(&(*params)->Fp);
+ DeleteFiniteField(&(*params)->Fq);
+ DeleteFiniteField(&(*params)->Fp_tick);
+ DeleteFiniteField(&(*params)->Fq_tick);
+ DeleteFiniteField(&(*params)->Fqd);
+ DeleteFiniteField(&(*params)->GT);
+
+ DeleteEcGroup(&(*params)->G1);
+ DeleteEcGroup(&(*params)->G2);
+ DeleteEcGroup(&(*params)->G3);
+
+ SAFE_FREE(*params);
+ }
+}
+
+EpidStatus NewFqd(Epid11Params const* params, FiniteField* Fq,
+ FiniteField** Fqd) {
+ if (!params || !Fq || !Fqd) return kEpidBadArgErr;
+
+ return NewFiniteFieldViaPolynomialExtension(Fq, params->coeff, 3, Fqd);
+}
+
+EpidStatus NewFqk(Epid11Params const* params, FiniteField* Fq, FiniteField* Fqd,
+ FiniteField** Fqk) {
+ EpidStatus result = kEpidNoErr;
+ FfElement* qnr = NULL;
+ FfElement* neg_qnr = NULL;
+ FfElement* ground_element = NULL;
+ Fq3ElemStr ground_element_str = {0};
+
+ if (!params || !Fq || !Fqd || !Fqk) return kEpidBadArgErr;
+
+ do {
+ result = NewFfElement(Fq, &qnr);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = ReadFfElement(Fq, &(params->qnr), sizeof(params->qnr), qnr);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewFfElement(Fq, &neg_qnr);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfNeg(Fq, qnr, neg_qnr);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = WriteFfElement(Fq, neg_qnr, &ground_element_str.a[0],
+ sizeof(ground_element_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewFfElement(Fqd, &ground_element);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = ReadFfElement(Fqd, &(ground_element_str),
+ sizeof(ground_element_str), ground_element);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewFiniteFieldViaBinomalExtension(Fqd, ground_element, 2, Fqk);
+ BREAK_ON_EPID_ERROR(result);
+ } while (0);
+
+ DeleteFfElement(&qnr);
+ DeleteFfElement(&neg_qnr);
+ DeleteFfElement(&ground_element);
+
+ return result;
+}
+
+EpidStatus NewG1(Epid11Params const* params, FiniteField* Fq, EcGroup** G1) {
+ EpidStatus result = kEpidErr;
+ EcGroup* ec = NULL;
+ FfElement* fq_a = NULL;
+ FfElement* fq_b = NULL;
+ FfElement* g1_x = NULL;
+ FfElement* g1_y = NULL;
+ BigNum* order = NULL;
+ BigNum* h = NULL;
+
+ if (!params || !Fq || !G1) return kEpidBadArgErr;
+
+ do {
+ // Create G1
+ // G1 is an elliptic curve group E(Fq).It can be initialized as follows:
+ // 1. Set G1 = E(Fq).init(p, q, h, a, b, g1.x, g1.y).
+ // a
+ result = NewFfElement(Fq, &fq_a);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->a, sizeof(params->a), fq_a);
+ BREAK_ON_EPID_ERROR(result);
+ // b
+ result = NewFfElement(Fq, &fq_b);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->b, sizeof(params->b), fq_b);
+ BREAK_ON_EPID_ERROR(result);
+ // g1.x
+ result = NewFfElement(Fq, &g1_x);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->g1.x, sizeof(params->g1.x), g1_x);
+ BREAK_ON_EPID_ERROR(result);
+ // g1.y
+ result = NewFfElement(Fq, &g1_y);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->g1.y, sizeof(params->g1.y), g1_y);
+ BREAK_ON_EPID_ERROR(result);
+ // order
+ result = NewBigNum(sizeof(BigNumStr), &order);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->p, sizeof(params->p), order);
+ BREAK_ON_EPID_ERROR(result);
+ // h
+ result = NewBigNum(sizeof(BigNumStr), &h);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->h, sizeof(params->h), h);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewEcGroup(Fq, fq_a, fq_b, g1_x, g1_y, order, h, &ec);
+ BREAK_ON_EPID_ERROR(result);
+ *G1 = ec;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&h);
+ DeleteBigNum(&order);
+ DeleteFfElement(&g1_y);
+ DeleteFfElement(&g1_x);
+ DeleteFfElement(&fq_b);
+ DeleteFfElement(&fq_a);
+
+ return result;
+}
+
+EpidStatus NewG3(Epid11Params const* params, FiniteField* Fq_dash,
+ EcGroup** G3) {
+ EpidStatus result = kEpidErr;
+ EcGroup* ec = NULL;
+ FfElement* fq_a = NULL;
+ FfElement* fq_b = NULL;
+ FfElement* g3_x = NULL;
+ FfElement* g3_y = NULL;
+ BigNum* order = NULL;
+ BigNum* h_tick = NULL;
+
+ if (!params || !Fq_dash || !G3) return kEpidBadArgErr;
+
+ do {
+ // Create G3
+ // G3 is an elliptic curve group E(Fq').It can be initialized as follows:
+ // 1. Set G3 = E(Fq').init(p', q', h', a', b', g3.x, g3.y).
+ // a'
+ result = NewFfElement(Fq_dash, &fq_a);
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ ReadFfElement(Fq_dash, &params->a_tick, sizeof(params->a_tick), fq_a);
+ BREAK_ON_EPID_ERROR(result);
+ // b'
+ result = NewFfElement(Fq_dash, &fq_b);
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ ReadFfElement(Fq_dash, &params->b_tick, sizeof(params->b_tick), fq_b);
+ BREAK_ON_EPID_ERROR(result);
+ // g3.x
+ result = NewFfElement(Fq_dash, &g3_x);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq_dash, &params->g3.x, sizeof(params->g3.x), g3_x);
+ BREAK_ON_EPID_ERROR(result);
+ // g3.y
+ result = NewFfElement(Fq_dash, &g3_y);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq_dash, &params->g3.y, sizeof(params->g3.y), g3_y);
+ BREAK_ON_EPID_ERROR(result);
+ // order
+ result = NewBigNum(sizeof(BigNumStr), &order);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->p_tick, sizeof(params->p_tick), order);
+ BREAK_ON_EPID_ERROR(result);
+ // h'
+ result = NewBigNum(sizeof(BigNumStr), &h_tick);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->h_tick, sizeof(params->h_tick), h_tick);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewEcGroup(Fq_dash, fq_a, fq_b, g3_x, g3_y, order, h_tick, &ec);
+ BREAK_ON_EPID_ERROR(result);
+ *G3 = ec;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&h_tick);
+ DeleteBigNum(&order);
+ DeleteFfElement(&g3_y);
+ DeleteFfElement(&g3_x);
+ DeleteFfElement(&fq_b);
+ DeleteFfElement(&fq_a);
+
+ return result;
+}
+
+EpidStatus NewG2(Epid11Params const* params, FiniteField* Fq, FiniteField* Fqd,
+ EcGroup** G2) {
+ EpidStatus result = kEpidErr;
+ EcGroup* ec = NULL;
+ FfElement* fq_twista = NULL;
+ FfElement* fq_twistb = NULL;
+ FfElement* fqd_twista = NULL;
+ FfElement* fqd_twistb = NULL;
+ FfElement* g2_x = NULL;
+ FfElement* g2_y = NULL;
+ FfElement* qnr = NULL;
+ BigNum* order = NULL;
+ BigNum* h = NULL;
+ Fq3ElemStr tmp_Fq3_str = {0};
+
+ if (!params || !Fq || !Fqd || !G2) return kEpidBadArgErr;
+
+ do {
+ // Create G2
+ // G2 is an elliptic curve group E(Fqd).It can be initialized as follows:
+ // 2. Set g2.x = (g2.x[0], g2.x[1], g2.x[2]) an element of Fqd
+ result = NewFfElement(Fqd, &g2_x);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fqd, &params->g2.x, sizeof(params->g2.x), g2_x);
+ BREAK_ON_EPID_ERROR(result);
+ // 3. Set g2.y = (g2.y[0], g2.y[1], g2.y[2]) an element of Fqd
+ result = NewFfElement(Fqd, &g2_y);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fqd, &params->g2.y, sizeof(params->g2.y), g2_y);
+ BREAK_ON_EPID_ERROR(result);
+ // qnr
+ result = NewFfElement(Fq, &qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->qnr, sizeof(params->qnr), qnr);
+ BREAK_ON_EPID_ERROR(result);
+ // 4. twista = (a * qnr * qnr) mod q
+ result = NewFfElement(Fq, &fq_twista);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->a, sizeof(params->a), fq_twista);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(Fq, fq_twista, qnr, fq_twista);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(Fq, fq_twista, qnr, fq_twista);
+ BREAK_ON_EPID_ERROR(result);
+ // twista = {twista, 0, 0}
+ result = WriteFfElement(Fq, fq_twista, &(tmp_Fq3_str.a[0]),
+ sizeof(tmp_Fq3_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(Fqd, &fqd_twista);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fqd, &tmp_Fq3_str, sizeof(tmp_Fq3_str), fqd_twista);
+ BREAK_ON_EPID_ERROR(result);
+ // 5. twistb = (b * qnr * qnr * qnr) mod q
+ result = NewFfElement(Fq, &fq_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fq, &params->b, sizeof(params->b), fq_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(Fq, fq_twistb, qnr, fq_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(Fq, fq_twistb, qnr, fq_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(Fq, fq_twistb, qnr, fq_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ // twistb = {twistb, 0, 0}
+ result = WriteFfElement(Fq, fq_twistb, &(tmp_Fq3_str.a[0]),
+ sizeof(tmp_Fq3_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(Fqd, &fqd_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(Fqd, &tmp_Fq3_str, sizeof(tmp_Fq3_str), fqd_twistb);
+ BREAK_ON_EPID_ERROR(result);
+ // order
+ result = NewBigNum(3 * sizeof(BigNumStr), &order);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->orderG2, sizeof(params->orderG2), order);
+ BREAK_ON_EPID_ERROR(result);
+ // h
+ result = NewBigNum(sizeof(BigNumStr), &h);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&params->h, sizeof(params->h), h);
+ BREAK_ON_EPID_ERROR(result);
+
+ // 6. Set G2 = E(Fqd).init(orderG2, param(Fqd), twista, twistb, g2.x, g2.y)
+ result = NewEcGroup(Fqd, fqd_twista, fqd_twistb, g2_x, g2_y, order, h, &ec);
+ BREAK_ON_EPID_ERROR(result);
+ *G2 = ec;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&h);
+ DeleteBigNum(&order);
+ DeleteFfElement(&qnr);
+ DeleteFfElement(&fqd_twistb);
+ DeleteFfElement(&fq_twistb);
+ DeleteFfElement(&fqd_twista);
+ DeleteFfElement(&fq_twista);
+ DeleteFfElement(&g2_y);
+ DeleteFfElement(&g2_x);
+
+ return result;
+}
diff --git a/epid/common/1.1/src/epid11params.h b/epid/common/1.1/src/epid11params.h
new file mode 100644
index 0000000..c00af22
--- /dev/null
+++ b/epid/common/1.1/src/epid11params.h
@@ -0,0 +1,75 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_1_1_SRC_EPID11PARAMS_H_
+#define EPID_COMMON_1_1_SRC_EPID11PARAMS_H_
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 constant parameters interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/math/tatepairing.h"
+
+/// Internal representation of Epid11Params
+typedef struct Epid11Params_ {
+ BigNum* p; ///< a prime
+ BigNum* p_tick; ///< a prime
+ EcPoint* g1; ///< a generator (an element) of G1
+ EcPoint* g2; ///< a generator (an element) of G2
+ EcPoint* g3; ///< a generator (an element) of G3
+
+ FiniteField* Fp; ///< Finite field Fp
+ FiniteField* Fq; ///< Finite field Fq
+ FiniteField* Fp_tick; ///< Finite field Fp'
+ FiniteField* Fq_tick; ///< Finite field Fq'
+ FiniteField* Fqd; ///< Finite field Fqd, an extension of Fq
+ FiniteField* GT; ///< GT is a quadratic field extension Fqk of Fqd
+
+ EcGroup* G1; ///< Elliptic curve group over finite field Fq
+ EcGroup* G2; ///< Elliptic curve group over finite field Fqd
+ EcGroup* G3; ///< Elliptic curve group over finite field Fq'
+
+ Epid11PairingState* pairing_state; ///< Pairing state
+} Epid11Params_;
+
+/// Constructs the internal representation of Epid11Params
+/*!
+ Allocates memory for the internal representation of Epid11Params. Initialize
+ the Epid11Params. Use DeleteEpid11Params() to deallocate memory.
+
+ \param[in,out] params
+ Internal Epid11Params
+
+ \returns ::EpidStatus
+ \see DeleteEpid11Params
+*/
+EpidStatus CreateEpid11Params(Epid11Params_** params);
+/// Deallocates storage for internal representation of Epid11Params
+/*!
+ Frees the memory and nulls the pointer.
+
+ \param[in,out] params
+ params to be deallocated
+
+ \see CreateEpid11Params
+*/
+void DeleteEpid11Params(Epid11Params_** params);
+/*! @} */
+#endif // EPID_COMMON_1_1_SRC_EPID11PARAMS_H_
diff --git a/epid/common/1.1/src/epid11params_tate.inc b/epid/common/1.1/src/epid11params_tate.inc
new file mode 100644
index 0000000..248b271
--- /dev/null
+++ b/epid/common/1.1/src/epid11params_tate.inc
@@ -0,0 +1,160 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Intel(R) EPID 1.1 constant parameters data.
+ *
+ */
+ {{{ // p
+ 0x00, 0x00, 0x89, 0x57, 0x3F, 0x17, 0x47, 0x30, 0x8C, 0x43, 0xD5, 0xEE,
+ 0x41, 0x97, 0x96, 0x19, 0x72, 0xBB, 0x86, 0x88, 0xED, 0x4B, 0xEF, 0x04,
+ 0xAB, 0xAE, 0xC3, 0x8E, 0xEC, 0x51, 0xC3, 0xD3
+ }}},
+ {{{ // q
+ 0x09, 0xF9, 0x24, 0xE5, 0xD9, 0xBC, 0x67, 0x7F, 0x81, 0x0D, 0xF0, 0x25,
+ 0x58, 0xF7, 0x53, 0x13, 0xA9, 0x8A, 0xA6, 0x10, 0x47, 0x65, 0x5D, 0x73,
+ 0x9E, 0xF1, 0x94, 0xEB, 0x05, 0xB1, 0xA7, 0x11
+ }}},
+ {{ // h
+ 0x00, 0x00, 0x12, 0x97
+ }},
+ {{{ // a
+ 0x05, 0x53, 0xD7, 0xC8, 0x81, 0xF7, 0x78, 0xC2, 0x2C, 0x37, 0xB6, 0xC0,
+ 0x16, 0x3E, 0x68, 0x24, 0x3A, 0x84, 0x78, 0x1C, 0x0A, 0xDF, 0x9B, 0xB3,
+ 0xED, 0x21, 0xC4, 0x46, 0xE5, 0xA7, 0xA3, 0x92
+ }}},
+ {{{ // b
+ 0x00, 0x3A, 0x2E, 0x39, 0x0E, 0x10, 0xD8, 0xAC, 0x47, 0xCB, 0x29, 0xC8,
+ 0xF1, 0x2C, 0x7F, 0x11, 0x99, 0x2A, 0x18, 0xB7, 0xEF, 0x73, 0x48, 0xA6,
+ 0xBE, 0x70, 0xA6, 0x8B, 0x97, 0x34, 0x8A, 0xB1
+ }}},
+ { // coeff
+ {{{ // coeff[0]
+ 0x02, 0x16, 0x7A, 0x61, 0x53, 0xDD, 0xF6, 0xE2, 0x89, 0x15, 0xA0, 0x94,
+ 0xF1, 0xB5, 0xDC, 0x65, 0x21, 0x15, 0x62, 0xE1, 0x7D, 0xC5, 0x43, 0x89,
+ 0xEE, 0xB4, 0xEF, 0xC8, 0xA0, 0x8E, 0x34, 0x0F
+ }}},
+ {{{ // coeff[1]
+ 0x04, 0x82, 0x27, 0xE1, 0xEB, 0x98, 0x64, 0xC2, 0x8D, 0x8F, 0xDD, 0x0E,
+ 0x82, 0x40, 0xAE, 0xD4, 0x31, 0x63, 0xD6, 0x46, 0x32, 0x16, 0x85, 0x7A,
+ 0xB7, 0x18, 0x68, 0xB8, 0x17, 0x02, 0x81, 0xA6
+ }}},
+ {{{ // coeff[2]
+ 0x06, 0x20, 0x76, 0xE8, 0x54, 0x54, 0x53, 0xB4, 0xA9, 0xD8, 0x44, 0x4B,
+ 0xAA, 0xFB, 0x1C, 0xFD, 0xAE, 0x15, 0xCA, 0x29, 0x79, 0xA6, 0x24, 0xA4,
+ 0x0A, 0xF6, 0x1E, 0xAC, 0xED, 0xFB, 0x10, 0x41
+ }}},
+ },
+ {{{ // qnr
+ 0x08, 0x66, 0xA7, 0x67, 0x36, 0x6E, 0x62, 0x71, 0xB7, 0xA6, 0x52, 0x94,
+ 0x8F, 0xFB, 0x25, 0x9E, 0xE6, 0x4F, 0x25, 0xE5, 0x26, 0x9A, 0x2B, 0x6E,
+ 0x7E, 0xF8, 0xA6, 0x39, 0xAE, 0x46, 0xAA, 0x24
+ }}},
+ {{ // orderG2
+ 0x00, 0x03, 0xDF, 0xFC, 0xBE, 0x2F, 0x5C, 0x2E, 0x45, 0x49, 0x7A, 0x2A,
+ 0x91, 0xBA, 0xD1, 0x3E, 0x01, 0xEC, 0x5F, 0xC2, 0x15, 0x14, 0x10, 0xB3,
+ 0x28, 0x5E, 0x56, 0xCC, 0x26, 0x51, 0x24, 0x93, 0x0E, 0x6C, 0x99, 0x96,
+ 0x38, 0xE0, 0x7D, 0x68, 0x8C, 0xB7, 0x97, 0x23, 0xF4, 0xAC, 0x4D, 0xBC,
+ 0x5E, 0x01, 0x15, 0xFF, 0x45, 0x60, 0x08, 0x13, 0xCD, 0x59, 0xD7, 0x73,
+ 0xB0, 0x0C, 0x20, 0x5E, 0xAB, 0xAA, 0x24, 0x31, 0xE2, 0x2A, 0xA2, 0x53,
+ 0x8A, 0xF7, 0x86, 0xD5, 0x19, 0x78, 0xC5, 0x55, 0x9C, 0x08, 0xB7, 0xE2,
+ 0xF4, 0xD0, 0x37, 0x74, 0x93, 0x56, 0x62, 0x7B, 0x95, 0xCC, 0x2C, 0xB0
+ }},
+ {{{ // p_tick
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
+ 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
+ }}},
+ {{{ // q_tick
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+ }}},
+ {{ // h_tick
+ 0x00, 0x00, 0x00, 0x01
+ }},
+ {{{ // a_tick
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC
+ }}},
+ {{{ // b_tick
+ 0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD, 0x55,
+ 0x76, 0x98, 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53, 0xB0, 0xF6,
+ 0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2, 0x60, 0x4B
+ }}},
+ { // g1
+ {{{ // x
+ 0x07, 0x78, 0x3B, 0x0D, 0xFE, 0x4A, 0xA3, 0x19, 0x49, 0xB0, 0xCE, 0xAF,
+ 0x3F, 0x74, 0x0F, 0x32, 0x16, 0x0C, 0x8B, 0x46, 0x94, 0x5B, 0xA5, 0xB0,
+ 0xE4, 0x8A, 0xDA, 0xD8, 0x88, 0x32, 0x90, 0x53
+ }}},
+ {{{ // y
+ 0x08, 0xF7, 0xA2, 0xAA, 0xBA, 0x62, 0xB3, 0xFE, 0x29, 0x80, 0xC9, 0x5B,
+ 0x63, 0x53, 0xC8, 0x24, 0x3C, 0x7C, 0x1F, 0x4C, 0xDA, 0xCD, 0xE5, 0x5F,
+ 0xA2, 0x36, 0x93, 0x04, 0x3C, 0x3A, 0xBC, 0x2E
+ }}},
+ },
+ { // g2
+ { // x
+ {{{ // x[0]
+ 0x02, 0x10, 0x9A, 0xF4, 0x06, 0x32, 0x30, 0x89, 0xCB, 0x95, 0xE9, 0x55,
+ 0x0E, 0x9D, 0xAF, 0x0E, 0x98, 0xCD, 0xCA, 0xDC, 0xB1, 0xFF, 0xFC, 0xD1,
+ 0x45, 0x66, 0xBB, 0x86, 0x46, 0x1E, 0x8C, 0x30
+ }}},
+ {{{ // x[1]
+ 0x04, 0x78, 0x53, 0xE1, 0x3F, 0x96, 0xC5, 0xE4, 0x15, 0x23, 0x7B, 0x1F,
+ 0x3F, 0x2C, 0xD3, 0x95, 0x40, 0xBC, 0x7A, 0x31, 0x1F, 0x14, 0x38, 0x9E,
+ 0x1A, 0xA5, 0xD6, 0x63, 0x10, 0x91, 0xE4, 0xD3
+ }}},
+ {{{ // x[2]
+ 0x00, 0xB4, 0x02, 0xBC, 0x47, 0xFA, 0xA6, 0x29, 0x82, 0x0B, 0xB1, 0xD5,
+ 0xFF, 0xF2, 0xE6, 0xB0, 0xC6, 0xAE, 0xE8, 0x7B, 0x91, 0xD9, 0xEE, 0x66,
+ 0x07, 0x1F, 0xFD, 0xA2, 0xE7, 0x02, 0x66, 0xDD
+ }}},
+ },
+ { // y
+ {{{ // y[0]
+ 0x05, 0x2E, 0xF8, 0xC6, 0xC1, 0x6A, 0xEF, 0x3C, 0xC1, 0x95, 0xF6, 0x26,
+ 0xCE, 0x5E, 0x55, 0xD1, 0x64, 0x13, 0x28, 0xB1, 0x18, 0x57, 0xD8, 0x1B,
+ 0x84, 0xFA, 0xEC, 0x7E, 0x5D, 0x99, 0x06, 0x49
+ }}},
+ {{{ // y[1]
+ 0x05, 0x73, 0x35, 0xA9, 0xA7, 0xF2, 0xA1, 0x92, 0x5F, 0x3E, 0x7C, 0xDF,
+ 0xAC, 0xFE, 0x0F, 0xF5, 0x08, 0xD0, 0x3C, 0xAE, 0xCD, 0x58, 0x00, 0x5F,
+ 0xD0, 0x84, 0x7E, 0xEA, 0x63, 0x57, 0xFE, 0xC6
+ }}},
+ {{{ // y[2]
+ 0x01, 0x56, 0xDA, 0xF3, 0x72, 0x61, 0xDA, 0xC6, 0x93, 0xB0, 0xAC, 0xEF,
+ 0xAA, 0xD4, 0x51, 0x6D, 0xCA, 0x71, 0x1E, 0x06, 0x73, 0xEA, 0x83, 0xB2,
+ 0xB1, 0x99, 0x4A, 0x4D, 0x4A, 0x0D, 0x35, 0x07
+ }}},
+ },
+ },
+ { // g3
+ {{{ // x
+ 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5,
+ 0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0,
+ 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96
+ }}},
+ {{{ // y
+ 0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A,
+ 0x7C, 0x0F, 0x9E, 0x16, 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE,
+ 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5
+ }}},
+ }
diff --git a/epid/common/1.1/src/file_parser.c b/epid/common/1.1/src/file_parser.c
new file mode 100644
index 0000000..a971632
--- /dev/null
+++ b/epid/common/1.1/src/file_parser.c
@@ -0,0 +1,187 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Implementation of 1.1 issuer material file parsing utilities.
+/*!
+ * \file
+ */
+#include "epid/common/1.1/file_parser.h"
+#include <string.h>
+
+#include "epid/common/math/ecdsa.h"
+#include "epid/common/src/file_parser-internal.h"
+#include "epid/common/src/memory.h"
+
+/// Intel(R) EPID 1.1 Group Public Key binary format
+typedef struct Epid11GroupPubKeyCertificate {
+ EpidFileHeader header; ///< Intel(R) EPID binary file header
+ Epid11GroupId gid; ///< group ID
+ Epid11G1ElemStr h1; ///< an element in G1
+ Epid11G1ElemStr h2; ///< an element in G1
+ Epid11G2ElemStr w; ///< an element in G2
+ EcdsaSignature signature; ///< ECDSA Signature on SHA-256 of above values
+} Epid11GroupPubKeyCertificate;
+
+/// Parse a file with a revocation list of any type
+static EpidStatus Epid11ParseRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, void* rl,
+ size_t* rl_len, EpidFileType file_type) {
+ size_t min_rl_file_size = 0;
+ size_t empty_rl_size = 0;
+ size_t rl_entry_size = 0;
+ EpidStatus result = kEpidErr;
+ EpidFileHeader const* file_header = (EpidFileHeader*)buf;
+ void const* buf_rl =
+ (void const*)((unsigned char*)buf + sizeof(EpidFileHeader));
+ size_t buf_rl_len = 0;
+ EcdsaSignature const* signature = NULL;
+
+ if (!buf || !cert || !rl_len) return kEpidBadArgErr;
+
+ switch (file_type) {
+ case kPrivRlFile:
+ empty_rl_size = sizeof(Epid11PrivRl) - sizeof(((Epid11PrivRl*)0)->f[0]);
+ rl_entry_size = sizeof(((Epid11PrivRl*)0)->f[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(Epid11PrivRl) -
+ sizeof(((Epid11PrivRl*)0)->f[0]) +
+ sizeof(EcdsaSignature);
+ break;
+ case kSigRlFile:
+ empty_rl_size = sizeof(Epid11SigRl) - sizeof(((Epid11SigRl*)0)->bk[0]);
+ rl_entry_size = sizeof(((Epid11SigRl*)0)->bk[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(Epid11SigRl) -
+ sizeof(((Epid11SigRl*)0)->bk[0]) +
+ sizeof(EcdsaSignature);
+ break;
+ case kGroupRlFile:
+ empty_rl_size =
+ sizeof(Epid11GroupRl) - sizeof(((Epid11GroupRl*)0)->gid[0]);
+ rl_entry_size = sizeof(((Epid11GroupRl*)0)->gid[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(Epid11GroupRl) -
+ sizeof(((Epid11GroupRl*)0)->gid[0]) +
+ sizeof(EcdsaSignature);
+ break;
+ default:
+ return kEpidErr;
+ }
+
+ if (min_rl_file_size > len) return kEpidBadArgErr;
+
+ // Verify that Intel(R) EPID file header in the buffer is correct
+ if (0 != memcmp(&file_header->epid_version, &kEpidVersionCode[kEpid1x],
+ sizeof(kEpidVersionCode[kEpid1x]))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&file_header->file_type, &kEpidFileTypeCode[file_type],
+ sizeof(file_header->file_type))) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that CA certificate is correct
+ result = EpidVerifyCaCertificate(cert);
+ if (kEpidNoErr != result) return result;
+
+ // Verify that RL in file buffer contains of integer number of entries
+ buf_rl_len = len - sizeof(EpidFileHeader) - sizeof(EcdsaSignature);
+ if (0 != ((buf_rl_len - empty_rl_size) % rl_entry_size)) {
+ return kEpidBadArgErr;
+ }
+
+ signature =
+ (EcdsaSignature*)((unsigned char*)buf + len - sizeof(EcdsaSignature));
+ // Authenticate signature for buffer
+ result = EcdsaVerifyBuffer(buf, len - sizeof(EcdsaSignature),
+ (EcdsaPublicKey*)&cert->pubkey, signature);
+ if (kEpidSigValid != result) return result;
+
+ buf_rl_len = len - sizeof(EpidFileHeader) - sizeof(EcdsaSignature);
+
+ // If pointer to output buffer is NULL it should return required size of RL
+ if (!rl) {
+ *rl_len = buf_rl_len;
+ return kEpidNoErr;
+ }
+
+ if (*rl_len < buf_rl_len) return kEpidBadArgErr;
+ *rl_len = buf_rl_len;
+
+ // Copy revocation list from file buffer to output
+ // Memory copy is used to copy a revocation list of variable length
+ if (0 != memcpy_S(rl, *rl_len, buf_rl, buf_rl_len)) return kEpidBadArgErr;
+
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11ParseGroupPubKeyFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11GroupPubKey* pubkey) {
+ EpidStatus result = kEpidErr;
+ Epid11GroupPubKeyCertificate* buf_pubkey = (Epid11GroupPubKeyCertificate*)buf;
+
+ if (!buf || !cert || !pubkey) {
+ return kEpidBadArgErr;
+ }
+
+ if (len == 0 || len % sizeof(Epid11GroupPubKeyCertificate) != 0) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that Intel(R) EPID file header in the buffer is correct
+ if (0 != memcmp(&buf_pubkey->header.epid_version, &kEpidVersionCode[kEpid1x],
+ sizeof(buf_pubkey->header.epid_version))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&buf_pubkey->header.file_type,
+ &kEpidFileTypeCode[kGroupPubKeyFile],
+ sizeof(buf_pubkey->header.file_type))) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that CA certificate is correct
+ result = EpidVerifyCaCertificate(cert);
+ if (kEpidNoErr != result) return result;
+
+ // Authenticate signature for buffer
+ result = EcdsaVerifyBuffer(
+ buf_pubkey, sizeof(Epid11GroupPubKeyCertificate) - sizeof(EcdsaSignature),
+ (EcdsaPublicKey*)&cert->pubkey, &buf_pubkey->signature);
+ if (kEpidSigValid != result) return result;
+
+ // Copy group public key from the buffer to output
+ pubkey->gid = buf_pubkey->gid;
+ pubkey->h1 = buf_pubkey->h1;
+ pubkey->h2 = buf_pubkey->h2;
+ pubkey->w = buf_pubkey->w;
+
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11ParsePrivRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11PrivRl* rl, size_t* rl_len) {
+ return Epid11ParseRlFile(buf, len, cert, rl, rl_len, kPrivRlFile);
+}
+
+EpidStatus Epid11ParseSigRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, Epid11SigRl* rl,
+ size_t* rl_len) {
+ return Epid11ParseRlFile(buf, len, cert, rl, rl_len, kSigRlFile);
+}
+
+EpidStatus Epid11ParseGroupRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ Epid11GroupRl* rl, size_t* rl_len) {
+ return Epid11ParseRlFile(buf, len, cert, rl, rl_len, kGroupRlFile);
+}
diff --git a/epid/common/1.1/src/grouppubkey.c b/epid/common/1.1/src/grouppubkey.c
new file mode 100644
index 0000000..790e5bc
--- /dev/null
+++ b/epid/common/1.1/src/grouppubkey.c
@@ -0,0 +1,82 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 group public key implementation.
+ */
+#include "epid/common/1.1/src/grouppubkey.h"
+#include "epid/common/src/memory.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus CreateEpid11GroupPubKey(Epid11GroupPubKey const* pub_key_str,
+ EcGroup* G1, EcGroup* G2,
+ Epid11GroupPubKey_** pub_key) {
+ EpidStatus result = kEpidErr;
+ Epid11GroupPubKey_* pubkey = NULL;
+ if (!pub_key_str || !G1 || !G2 || !pub_key) {
+ return kEpidBadArgErr;
+ }
+ do {
+ pubkey = SAFE_ALLOC(sizeof(Epid11GroupPubKey_));
+ if (!pubkey) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ result = NewEcPoint(G1, &pubkey->h1);
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ ReadEcPoint(G1, &pub_key_str->h1, sizeof(pub_key_str->h1), pubkey->h1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewEcPoint(G1, &pubkey->h2);
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ ReadEcPoint(G1, &pub_key_str->h2, sizeof(pub_key_str->h2), pubkey->h2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewEcPoint(G2, &pubkey->w);
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ ReadEcPoint(G2, &pub_key_str->w, sizeof(pub_key_str->w), pubkey->w);
+ BREAK_ON_EPID_ERROR(result);
+ pubkey->gid = pub_key_str->gid;
+ *pub_key = pubkey;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result && pubkey) {
+ DeleteEcPoint(&pubkey->w);
+ DeleteEcPoint(&pubkey->h2);
+ DeleteEcPoint(&pubkey->h1);
+ SAFE_FREE(pubkey);
+ }
+ return result;
+}
+
+void DeleteEpid11GroupPubKey(Epid11GroupPubKey_** pub_key) {
+ if (pub_key && *pub_key) {
+ DeleteEcPoint(&(*pub_key)->w);
+ DeleteEcPoint(&(*pub_key)->h2);
+ DeleteEcPoint(&(*pub_key)->h1);
+
+ SAFE_FREE(*pub_key);
+ }
+}
diff --git a/epid/common/1.1/src/grouppubkey.h b/epid/common/1.1/src/grouppubkey.h
new file mode 100644
index 0000000..3cb83a3
--- /dev/null
+++ b/epid/common/1.1/src/grouppubkey.h
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_1_1_SRC_GROUPPUBKEY_H_
+#define EPID_COMMON_1_1_SRC_GROUPPUBKEY_H_
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 group public key interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include "epid/common/1.1/types.h"
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+
+/// Internal representation of Epid11GroupPubKey
+typedef struct Epid11GroupPubKey_ {
+ Epid11GroupId gid; ///< group ID
+ EcPoint* h1; ///< an element in G1
+ EcPoint* h2; ///< an element in G1
+ EcPoint* w; ///< an element in G2
+} Epid11GroupPubKey_;
+
+/// Constructs internal representation of Intel(R) EPID 1.1 group public key
+/*!
+ Allocates memory and initializes gid, h1, h2, w parameters. Use
+ DeleteEpid11GroupPubKey() to deallocate memory
+
+ \param[in] pub_key_str
+ Oct string representation of group public key
+ \param[in] G1
+ EcGroup containing elements h1 and h2
+ \param[in] G2
+ EcGroup containing element w
+ \param[out] pub_key
+ Group public key: (gid, h1, h2, w)
+
+ \returns ::EpidStatus
+ \see DeleteEpid11GroupPubKey
+*/
+EpidStatus CreateEpid11GroupPubKey(Epid11GroupPubKey const* pub_key_str,
+ EcGroup* G1, EcGroup* G2,
+ Epid11GroupPubKey_** pub_key);
+
+/// Deallocates storage for internal representation Intel(R) EPID 1.1 group
+/// public key
+/*!
+ Frees memory pointed to by Epid11GroupPubKey. Nulls the pointer.
+
+ \param[in] pub_key
+ Epid11GroupPubKey to be freed
+
+ \see CreateEpid11GroupPubKey
+*/
+void DeleteEpid11GroupPubKey(Epid11GroupPubKey_** pub_key);
+/*! @} */
+#endif // EPID_COMMON_1_1_SRC_GROUPPUBKEY_H_
diff --git a/epid/common/1.1/types.h b/epid/common/1.1/types.h
new file mode 100644
index 0000000..5ef8359
--- /dev/null
+++ b/epid/common/1.1/types.h
@@ -0,0 +1,207 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_1_1_TYPES_H_
+#define EPID_COMMON_1_1_TYPES_H_
+
+/*!
+* \file
+* \brief SDK data types for Intel(R) EPID 1.1.
+*/
+
+#include <limits.h> // for CHAR_BIT
+
+#include "epid/common/types.h"
+
+/// Intel(R) EPID 1.1 specific data types.
+/*!
+\defgroup Epid11Types Intel(R) EPID 1.1 specific types
+Defines serialized data types used by the SDK. These data types
+are only used by components that need to do Intel(R) EPID 1.1
+verification.
+
+\ingroup EpidTypes
+\see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+@{
+*/
+
+#pragma pack(1)
+
+/// 80 bit octet string
+typedef struct OctStr80 {
+ unsigned char data[80 / CHAR_BIT]; ///< 80 bit data
+} OctStr80;
+
+/// 600 bit octet string
+typedef struct OctSt600 {
+ unsigned char data[600 / CHAR_BIT]; ///< 600 bit data
+} OctStr600;
+
+/// 768 bit octet string
+typedef struct OctStr768 {
+ unsigned char data[768 / CHAR_BIT]; ///< 768 bit data
+} OctStr768;
+
+/// Serialized Fq3 element
+typedef struct Fq3ElemStr {
+ FqElemStr a[3]; ///< polynomial coefficient
+} Fq3ElemStr;
+
+/// Serialized Intel(R) EPID 1.1 G1 element
+typedef G1ElemStr Epid11G1ElemStr;
+
+/// Serialized Intel(R) EPID 1.1 G3 element
+typedef G1ElemStr Epid11G3ElemStr;
+
+/// Serialized Intel(R) EPID 1.1 G2 element
+typedef struct Epid11G2ElemStr {
+ FqElemStr x[3]; ///< an integer between [0, q-1]
+ FqElemStr y[3]; ///< an integer between [0, q-1]
+} Epid11G2ElemStr;
+
+/// Serialized Intel(R) EPID 1.1 GT element
+typedef struct Epid11GtElemStr {
+ Fq3ElemStr a[2]; ///< an element in Fq3
+} Epid11GtElemStr;
+
+/// Intel(R) EPID 1.1 Parameters.
+/*!
+Intel(R) EPID 1.1 parameters are: (p, q, h, a, b, coeff, qnr, orderG2, p', q',
+h', a', b', g1, g2, g3). The size of the Intel(R) EPID public parameters of G1,
+G2, G3, and GT is 6464 bits or 808 bytes.
+*/
+typedef struct Epid11Params {
+ BigNumStr p; ///< a prime
+ BigNumStr q; ///< a prime
+ OctStr32 h; ///< a small integer, also denoted as cofactor
+ FqElemStr a; ///< an integer between [0, q-1]
+ FqElemStr b; ///< an integer between [0, q-1]
+ /*! the coefficients of an irreducible polynomial
+ coeff[0], coeff[1], coeff[2] are 256-bit integers between [0, q - 1]*/
+ BigNumStr coeff[3];
+ FqElemStr qnr; ///< a quadratic non-residue (an integer between [0, q-1])
+ OctStr768 orderG2; ///< the total number of points in G2 elliptic curve
+ BigNumStr p_tick; ///< a prime
+ BigNumStr q_tick; ///< a prime
+ OctStr32 h_tick; ///< a small integer, also denoted as cofactor
+ FqElemStr a_tick; ///< an integer between [0, q-1]
+ FqElemStr b_tick; ///< an integer between [0, q-1]
+ Epid11G1ElemStr g1; ///< a generator(an element) of G1
+ Epid11G2ElemStr g2; ///< a generator (an element) of G2
+ Epid11G1ElemStr g3; ///< a generator (an element) of G3
+} Epid11Params;
+
+/// Intel(R) EPID 1.1 group ID
+typedef OctStr32 Epid11GroupId;
+
+/// Intel(R) EPID 1.1 group public key
+/*!
+* Group public key: (gid, h1, h2, w)
+*/
+typedef struct Epid11GroupPubKey {
+ Epid11GroupId gid; ///< group ID
+ Epid11G1ElemStr h1; ///< an element in G1
+ Epid11G1ElemStr h2; ///< an element in G1
+ Epid11G2ElemStr w; ///< an element in G2
+} Epid11GroupPubKey;
+
+/// Intel(R) EPID 1.1 basic signature.
+/*!
+* Basic signature: (B, K, T1, T2, c, nd, sx, sy, sf, sa, sb, salpha, sbeta)
+*/
+typedef struct Epid11BasicSignature {
+ Epid11G3ElemStr B; ///< an element in G3
+ Epid11G3ElemStr K; ///< an element in G3
+ Epid11G1ElemStr T1; ///< an element in G1
+ Epid11G1ElemStr T2; ///< an element in G1
+ OctStr256 c; ///< a 256-bit integer
+ OctStr80 nd; ///< an 80-bit integer
+ FpElemStr sx; ///< an integer between [0, p-1]
+ FpElemStr sy; ///< an integer between [0, p-1]
+ OctStr600 sf; ///< a 593-bit integer
+ FpElemStr sa; ///< an integer between [0, p-1]
+ FpElemStr sb; ///< an integer between [0, p-1]
+ FpElemStr salpha; ///< an integer between [0, p-1]
+ FpElemStr sbeta; ///< an integer between [0, p-1]
+} Epid11BasicSignature;
+
+/// Intel(R) EPID 1.1 non-revoked Proof
+/*!
+* Non-revoked Proof: (T, c, smu, snu)
+*/
+typedef struct Epid11NrProof {
+ Epid11G3ElemStr T; ///< an element in G3
+ OctStr256 c; ///< a 256-bit integer
+ FpElemStr smu; ///< an integer between [0, p'-1]
+ FpElemStr snu; ///< an integer between [0, p'-1]
+} Epid11NrProof;
+
+/// Intel(R) EPID 1.1 Signature
+/*!
+* Signature: (sigma0, RLver, n2, sigma[0], ..., sigma[n2-1])
+*/
+typedef struct Epid11Signature {
+ Epid11BasicSignature sigma0; ///< basic signature
+ OctStr32 rl_ver; ///< revocation list version number
+ OctStr32 n2; ///< number of entries in SigRL
+ Epid11NrProof sigma[1]; ///< array of non-revoked proofs (flexible array)
+} Epid11Signature;
+
+/// Intel(R) EPID 1.1 private-key based revocation list
+/*!
+* Private-key based revocation list PrivRL: (gid, RLver, n1, f[0],
+* ..., f[n1-1])
+*/
+typedef struct Epid11PrivRl {
+ Epid11GroupId gid; ///< group ID
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n1; ///< number of entries in PrivRL
+ FpElemStr f[1]; ///< integers between [1, p-1] (flexible array)
+} Epid11PrivRl;
+
+/// Intel(R) EPID 1.1 entry in SigRL (B,K)
+typedef struct Epid11SigRlEntry {
+ Epid11G3ElemStr b; ///< an element of G1
+ Epid11G3ElemStr k; ///< an element of G1
+} Epid11SigRlEntry;
+
+/// Intel(R) EPID 1.1 signature based revocation list
+/*!
+* Signature based revocation list SigRL: (gid, RLver, n2, B[0],
+* K[0], ..., B[n2-1], K[n2-1])
+*/
+typedef struct Epid11SigRl {
+ Epid11GroupId gid; ///< group ID
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n2; ///< number of entries in SigRL
+ Epid11SigRlEntry bk[1]; ///< revoked Bs and Ks (flexible array)
+} Epid11SigRl;
+
+/// Intel(R) EPID 1.1 group revocation list
+/*!
+* Group revocation list GroupRL: (RLver, n3, gid[0], ...,
+* gid[n3-1])
+*/
+typedef struct Epid11GroupRl {
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n3; ///< number of entries in GroupRL
+ Epid11GroupId gid[1]; ///< revoked group IDs (flexible array)
+} Epid11GroupRl;
+
+#pragma pack()
+
+/*! @} */
+#endif // EPID_COMMON_1_1_TYPES_H_
diff --git a/epid/common/1.1/unittests/file_parser-test.cc b/epid/common/1.1/unittests/file_parser-test.cc
new file mode 100644
index 0000000..a2bf244
--- /dev/null
+++ b/epid/common/1.1/unittests/file_parser-test.cc
@@ -0,0 +1,1435 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// 1.1 issuer material file parsing unit tests.
+/*!
+ * \file
+ */
+#include <cstdint>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+extern "C" {
+#include "epid/common/1.1/file_parser.h"
+}
+
+namespace {
+
+/// Test fixture class for Epid11FileParser
+class Epid11FileParser : public ::testing::Test {
+ public:
+ /// Cert used to sign legitimate test data
+ static const EpidCaCertificate kCert;
+
+ /// A file with Epid11GroupPublicKey signed with kCert
+ static const std::vector<uint8_t> kGroupPublicKeyFile;
+ /// A file with two Epid11GroupPublicKey signed with kCert
+ static const std::vector<uint8_t> kGroupMultiPublicKeyFile;
+ /// Expected Epid11GroupPublicKey
+ static const std::vector<uint8_t> kGroupPublicKey;
+
+ /// A file with empty privrl signed with kCert
+ static const std::vector<uint8_t> kEmptyPrivRlFile;
+ /// Expected empty privrl
+ static const std::vector<uint8_t> kEmptyPrivRl;
+ /// A file with short privrl signed with kCert
+ static const std::vector<uint8_t> kShortPrivRlFile;
+ /// Expected short privrl
+ static const std::vector<uint8_t> kShortPrivRl;
+
+ /// A file with empty SigRl signed with kCert
+ static const std::vector<uint8_t> kEmptySigRlFile;
+ /// Expected empty SigRl
+ static const std::vector<uint8_t> kEmptySigRl;
+ /// A file with short SigRl signed with kCert
+ static const std::vector<uint8_t> kShortSigRlFile;
+ /// Expected short SigRl
+ static const std::vector<uint8_t> kShortSigRl;
+
+ /// A file with empty GroupRl signed with kCert
+ static const std::vector<uint8_t> kEmptyGroupRlFile;
+ /// Expected empty GroupRl
+ static const std::vector<uint8_t> kEmptyGroupRl;
+ /// A file with short GroupRl signed with kCert
+ static const std::vector<uint8_t> kShortGroupRlFile;
+ /// Expected short GroupRl
+ static const std::vector<uint8_t> kShortGroupRl;
+};
+const EpidCaCertificate Epid11FileParser::kCert = {
+ // Intel(R) EPID Version
+ 0x02, 0x00,
+ // File type
+ 0x00, 0x11,
+ // pubkey
+ 0x24, 0x42, 0xa5, 0xcc, 0x0e, 0xcd, 0x01, 0x5f, 0xa3, 0xca, 0x31, 0xdc,
+ 0x8e, 0x2b, 0xbc, 0x70, 0xbf, 0x42, 0xd6, 0x0c, 0xbc, 0xa2, 0x00, 0x85,
+ 0xe0, 0x82, 0x2c, 0xb0, 0x42, 0x35, 0xe9, 0x70, 0x6f, 0xc9, 0x8b, 0xd7,
+ 0xe5, 0x02, 0x11, 0xa4, 0xa2, 0x71, 0x02, 0xfa, 0x35, 0x49, 0xdf, 0x79,
+ 0xeb, 0xcb, 0x4b, 0xf2, 0x46, 0xb8, 0x09, 0x45, 0xcd, 0xdf, 0xe7, 0xd5,
+ 0x09, 0xbb, 0xfd, 0x7d,
+ // prime
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ // a
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
+ // b
+ 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, 0xb3, 0xeb, 0xbd, 0x55,
+ 0x76, 0x98, 0x86, 0xbc, 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
+ 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b,
+ // x
+ 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, 0xe6, 0xe5,
+ 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
+ 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96,
+ // y
+ 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a,
+ 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
+ 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5,
+ // r
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e, 0x84,
+ 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51,
+ // signature::x
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ // signature::y
+ 0x94, 0x03, 0x1d, 0x90, 0x6b, 0x6f, 0xcd, 0x99, 0xef, 0x2c, 0xdb, 0x8b,
+ 0xa9, 0x8a, 0xef, 0x7e, 0xf0, 0x77, 0xba, 0xb5, 0x11, 0x43, 0x0d, 0x28,
+ 0x1c, 0x01, 0x5b, 0xc9, 0x08, 0xce, 0x3e, 0x68};
+
+const std::vector<uint8_t> Epid11FileParser::kGroupPublicKeyFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0c,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // h1
+ 0x08, 0x4a, 0x9d, 0x2e, 0xf9, 0x4f, 0x78, 0x02, 0xd7, 0x89, 0x75, 0xb4,
+ 0xe7, 0x25, 0x26, 0x9f, 0x00, 0x57, 0xad, 0x33, 0x30, 0xea, 0xa9, 0x6c,
+ 0x00, 0x9e, 0x8b, 0xc8, 0x13, 0x23, 0xcb, 0x06, 0x04, 0xbe, 0x42, 0x74,
+ 0x11, 0x07, 0xb1, 0x06, 0xd7, 0xef, 0x5f, 0x66, 0x87, 0xd9, 0xfa, 0xdd,
+ 0x53, 0xae, 0xd7, 0xf4, 0x54, 0xf8, 0xd0, 0x21, 0x75, 0xe0, 0x07, 0x44,
+ 0xc9, 0xc3, 0x4e, 0xf7,
+ // h2
+ 0x06, 0xd8, 0xa9, 0x90, 0x02, 0x8f, 0xca, 0xa5, 0x73, 0x36, 0x24, 0x03,
+ 0xc9, 0xa8, 0x7e, 0x9d, 0x64, 0x12, 0xac, 0xa7, 0xbd, 0x17, 0x7f, 0x7c,
+ 0x96, 0x8d, 0x2e, 0x13, 0xd9, 0xb2, 0x69, 0x47, 0x09, 0xdb, 0xe3, 0xbf,
+ 0xbc, 0xa1, 0x34, 0x0f, 0xc6, 0xe2, 0x00, 0x3d, 0x98, 0xa3, 0x7d, 0xab,
+ 0xd4, 0x0e, 0xec, 0xde, 0x4f, 0x97, 0xa9, 0xbb, 0xdd, 0x60, 0x94, 0x24,
+ 0x7b, 0xb3, 0xf5, 0x94,
+ // w
+ 0x02, 0x43, 0x78, 0x9f, 0x54, 0xc1, 0x21, 0x3a, 0x2b, 0x4d, 0x12, 0x65,
+ 0x2f, 0x51, 0x94, 0xc6, 0x34, 0x24, 0xd9, 0x7b, 0x06, 0x3a, 0xc4, 0xf5,
+ 0x56, 0xeb, 0x32, 0xe3, 0xee, 0x7b, 0xad, 0x6b, 0x04, 0x90, 0x86, 0x31,
+ 0x18, 0x2a, 0xa4, 0xcf, 0xa3, 0x90, 0xa5, 0x80, 0x7b, 0xae, 0x3b, 0xb1,
+ 0x77, 0x03, 0xe7, 0x7e, 0xf2, 0xfc, 0x6d, 0x3a, 0xab, 0x8f, 0xbf, 0x95,
+ 0x40, 0xed, 0x08, 0x03, 0x01, 0x05, 0x86, 0xf5, 0x42, 0xea, 0x4d, 0xf7,
+ 0x4f, 0xef, 0x46, 0xdf, 0x8f, 0xe8, 0x2d, 0xbb, 0x5d, 0x0d, 0x2f, 0x4f,
+ 0xf4, 0xd8, 0x31, 0xc6, 0x5a, 0x97, 0x98, 0x44, 0xcf, 0x42, 0x5a, 0xf3,
+ 0x03, 0x5f, 0xb6, 0x38, 0x45, 0x5a, 0x15, 0x1e, 0xb9, 0x54, 0xfa, 0x2c,
+ 0x3f, 0x68, 0x7b, 0x4e, 0x85, 0x35, 0xf3, 0x5b, 0xe5, 0xdc, 0x96, 0x2b,
+ 0x18, 0x84, 0x5e, 0x1e, 0x53, 0xdc, 0x22, 0x23, 0x06, 0x08, 0x91, 0x5a,
+ 0x2d, 0x27, 0xe2, 0x12, 0x69, 0xfa, 0xab, 0x19, 0x7c, 0x47, 0x6b, 0xec,
+ 0xde, 0xc6, 0x25, 0xd4, 0x43, 0xb4, 0x65, 0x23, 0x61, 0x0f, 0x1f, 0x2d,
+ 0xfd, 0xb1, 0x18, 0xb0, 0x04, 0x8e, 0x1a, 0xc5, 0x95, 0x9a, 0x0e, 0x37,
+ 0x7c, 0x5e, 0x95, 0x38, 0xc2, 0xcf, 0xfa, 0x1f, 0xe3, 0x3a, 0x2b, 0x85,
+ 0xa5, 0xfd, 0x6b, 0xc4, 0x1d, 0xfb, 0x47, 0x27, 0xaf, 0xc1, 0x94, 0xcd,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0xf0, 0x6e, 0x43, 0x67,
+ 0x68, 0x6f, 0x9e, 0x3b, 0xcf, 0xfd, 0x98, 0xcc, 0xae, 0x92, 0xcc, 0x94,
+ 0x23, 0xb6, 0xbd, 0x57, 0xac, 0x06, 0x3c, 0xa1, 0xe5, 0x3e, 0xe9, 0xf5,
+ 0x0e, 0x55, 0xb4, 0xe5};
+const std::vector<uint8_t> Epid11FileParser::kGroupPublicKey = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // h1
+ 0x08, 0x4a, 0x9d, 0x2e, 0xf9, 0x4f, 0x78, 0x02, 0xd7, 0x89, 0x75, 0xb4,
+ 0xe7, 0x25, 0x26, 0x9f, 0x00, 0x57, 0xad, 0x33, 0x30, 0xea, 0xa9, 0x6c,
+ 0x00, 0x9e, 0x8b, 0xc8, 0x13, 0x23, 0xcb, 0x06, 0x04, 0xbe, 0x42, 0x74,
+ 0x11, 0x07, 0xb1, 0x06, 0xd7, 0xef, 0x5f, 0x66, 0x87, 0xd9, 0xfa, 0xdd,
+ 0x53, 0xae, 0xd7, 0xf4, 0x54, 0xf8, 0xd0, 0x21, 0x75, 0xe0, 0x07, 0x44,
+ 0xc9, 0xc3, 0x4e, 0xf7,
+ // h2
+ 0x06, 0xd8, 0xa9, 0x90, 0x02, 0x8f, 0xca, 0xa5, 0x73, 0x36, 0x24, 0x03,
+ 0xc9, 0xa8, 0x7e, 0x9d, 0x64, 0x12, 0xac, 0xa7, 0xbd, 0x17, 0x7f, 0x7c,
+ 0x96, 0x8d, 0x2e, 0x13, 0xd9, 0xb2, 0x69, 0x47, 0x09, 0xdb, 0xe3, 0xbf,
+ 0xbc, 0xa1, 0x34, 0x0f, 0xc6, 0xe2, 0x00, 0x3d, 0x98, 0xa3, 0x7d, 0xab,
+ 0xd4, 0x0e, 0xec, 0xde, 0x4f, 0x97, 0xa9, 0xbb, 0xdd, 0x60, 0x94, 0x24,
+ 0x7b, 0xb3, 0xf5, 0x94,
+ // w
+ 0x02, 0x43, 0x78, 0x9f, 0x54, 0xc1, 0x21, 0x3a, 0x2b, 0x4d, 0x12, 0x65,
+ 0x2f, 0x51, 0x94, 0xc6, 0x34, 0x24, 0xd9, 0x7b, 0x06, 0x3a, 0xc4, 0xf5,
+ 0x56, 0xeb, 0x32, 0xe3, 0xee, 0x7b, 0xad, 0x6b, 0x04, 0x90, 0x86, 0x31,
+ 0x18, 0x2a, 0xa4, 0xcf, 0xa3, 0x90, 0xa5, 0x80, 0x7b, 0xae, 0x3b, 0xb1,
+ 0x77, 0x03, 0xe7, 0x7e, 0xf2, 0xfc, 0x6d, 0x3a, 0xab, 0x8f, 0xbf, 0x95,
+ 0x40, 0xed, 0x08, 0x03, 0x01, 0x05, 0x86, 0xf5, 0x42, 0xea, 0x4d, 0xf7,
+ 0x4f, 0xef, 0x46, 0xdf, 0x8f, 0xe8, 0x2d, 0xbb, 0x5d, 0x0d, 0x2f, 0x4f,
+ 0xf4, 0xd8, 0x31, 0xc6, 0x5a, 0x97, 0x98, 0x44, 0xcf, 0x42, 0x5a, 0xf3,
+ 0x03, 0x5f, 0xb6, 0x38, 0x45, 0x5a, 0x15, 0x1e, 0xb9, 0x54, 0xfa, 0x2c,
+ 0x3f, 0x68, 0x7b, 0x4e, 0x85, 0x35, 0xf3, 0x5b, 0xe5, 0xdc, 0x96, 0x2b,
+ 0x18, 0x84, 0x5e, 0x1e, 0x53, 0xdc, 0x22, 0x23, 0x06, 0x08, 0x91, 0x5a,
+ 0x2d, 0x27, 0xe2, 0x12, 0x69, 0xfa, 0xab, 0x19, 0x7c, 0x47, 0x6b, 0xec,
+ 0xde, 0xc6, 0x25, 0xd4, 0x43, 0xb4, 0x65, 0x23, 0x61, 0x0f, 0x1f, 0x2d,
+ 0xfd, 0xb1, 0x18, 0xb0, 0x04, 0x8e, 0x1a, 0xc5, 0x95, 0x9a, 0x0e, 0x37,
+ 0x7c, 0x5e, 0x95, 0x38, 0xc2, 0xcf, 0xfa, 0x1f, 0xe3, 0x3a, 0x2b, 0x85,
+ 0xa5, 0xfd, 0x6b, 0xc4, 0x1d, 0xfb, 0x47, 0x27, 0xaf, 0xc1, 0x94, 0xcd};
+
+const std::vector<uint8_t> Epid11FileParser::kGroupMultiPublicKeyFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0c,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // h1
+ 0x08, 0x4a, 0x9d, 0x2e, 0xf9, 0x4f, 0x78, 0x02, 0xd7, 0x89, 0x75, 0xb4,
+ 0xe7, 0x25, 0x26, 0x9f, 0x00, 0x57, 0xad, 0x33, 0x30, 0xea, 0xa9, 0x6c,
+ 0x00, 0x9e, 0x8b, 0xc8, 0x13, 0x23, 0xcb, 0x06, 0x04, 0xbe, 0x42, 0x74,
+ 0x11, 0x07, 0xb1, 0x06, 0xd7, 0xef, 0x5f, 0x66, 0x87, 0xd9, 0xfa, 0xdd,
+ 0x53, 0xae, 0xd7, 0xf4, 0x54, 0xf8, 0xd0, 0x21, 0x75, 0xe0, 0x07, 0x44,
+ 0xc9, 0xc3, 0x4e, 0xf7,
+ // h2
+ 0x06, 0xd8, 0xa9, 0x90, 0x02, 0x8f, 0xca, 0xa5, 0x73, 0x36, 0x24, 0x03,
+ 0xc9, 0xa8, 0x7e, 0x9d, 0x64, 0x12, 0xac, 0xa7, 0xbd, 0x17, 0x7f, 0x7c,
+ 0x96, 0x8d, 0x2e, 0x13, 0xd9, 0xb2, 0x69, 0x47, 0x09, 0xdb, 0xe3, 0xbf,
+ 0xbc, 0xa1, 0x34, 0x0f, 0xc6, 0xe2, 0x00, 0x3d, 0x98, 0xa3, 0x7d, 0xab,
+ 0xd4, 0x0e, 0xec, 0xde, 0x4f, 0x97, 0xa9, 0xbb, 0xdd, 0x60, 0x94, 0x24,
+ 0x7b, 0xb3, 0xf5, 0x94,
+ // w
+ 0x02, 0x43, 0x78, 0x9f, 0x54, 0xc1, 0x21, 0x3a, 0x2b, 0x4d, 0x12, 0x65,
+ 0x2f, 0x51, 0x94, 0xc6, 0x34, 0x24, 0xd9, 0x7b, 0x06, 0x3a, 0xc4, 0xf5,
+ 0x56, 0xeb, 0x32, 0xe3, 0xee, 0x7b, 0xad, 0x6b, 0x04, 0x90, 0x86, 0x31,
+ 0x18, 0x2a, 0xa4, 0xcf, 0xa3, 0x90, 0xa5, 0x80, 0x7b, 0xae, 0x3b, 0xb1,
+ 0x77, 0x03, 0xe7, 0x7e, 0xf2, 0xfc, 0x6d, 0x3a, 0xab, 0x8f, 0xbf, 0x95,
+ 0x40, 0xed, 0x08, 0x03, 0x01, 0x05, 0x86, 0xf5, 0x42, 0xea, 0x4d, 0xf7,
+ 0x4f, 0xef, 0x46, 0xdf, 0x8f, 0xe8, 0x2d, 0xbb, 0x5d, 0x0d, 0x2f, 0x4f,
+ 0xf4, 0xd8, 0x31, 0xc6, 0x5a, 0x97, 0x98, 0x44, 0xcf, 0x42, 0x5a, 0xf3,
+ 0x03, 0x5f, 0xb6, 0x38, 0x45, 0x5a, 0x15, 0x1e, 0xb9, 0x54, 0xfa, 0x2c,
+ 0x3f, 0x68, 0x7b, 0x4e, 0x85, 0x35, 0xf3, 0x5b, 0xe5, 0xdc, 0x96, 0x2b,
+ 0x18, 0x84, 0x5e, 0x1e, 0x53, 0xdc, 0x22, 0x23, 0x06, 0x08, 0x91, 0x5a,
+ 0x2d, 0x27, 0xe2, 0x12, 0x69, 0xfa, 0xab, 0x19, 0x7c, 0x47, 0x6b, 0xec,
+ 0xde, 0xc6, 0x25, 0xd4, 0x43, 0xb4, 0x65, 0x23, 0x61, 0x0f, 0x1f, 0x2d,
+ 0xfd, 0xb1, 0x18, 0xb0, 0x04, 0x8e, 0x1a, 0xc5, 0x95, 0x9a, 0x0e, 0x37,
+ 0x7c, 0x5e, 0x95, 0x38, 0xc2, 0xcf, 0xfa, 0x1f, 0xe3, 0x3a, 0x2b, 0x85,
+ 0xa5, 0xfd, 0x6b, 0xc4, 0x1d, 0xfb, 0x47, 0x27, 0xaf, 0xc1, 0x94, 0xcd,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0xf0, 0x6e, 0x43, 0x67,
+ 0x68, 0x6f, 0x9e, 0x3b, 0xcf, 0xfd, 0x98, 0xcc, 0xae, 0x92, 0xcc, 0x94,
+ 0x23, 0xb6, 0xbd, 0x57, 0xac, 0x06, 0x3c, 0xa1, 0xe5, 0x3e, 0xe9, 0xf5,
+ 0x0e, 0x55, 0xb4, 0xe5,
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0c,
+ // GID
+ 0x00, 0x00, 0x04, 0xd2,
+ // h1
+ 0x00, 0x6c, 0x38, 0x98, 0x41, 0x97, 0xf6, 0xf1, 0xb0, 0x41, 0x57, 0xd4,
+ 0xf9, 0xce, 0xcc, 0x22, 0xce, 0x4f, 0xc8, 0x47, 0xaf, 0x2a, 0x6c, 0xa3,
+ 0x02, 0xf2, 0x74, 0x80, 0xc9, 0x5c, 0x1c, 0xf7, 0x06, 0xed, 0xce, 0xc0,
+ 0x0b, 0x29, 0x73, 0x1c, 0x09, 0x84, 0x4c, 0xcc, 0xff, 0x82, 0x9d, 0x29,
+ 0xe7, 0x88, 0x57, 0xfd, 0xd2, 0x55, 0x41, 0x0f, 0x5e, 0x6e, 0xf5, 0xc4,
+ 0x77, 0xa2, 0x5d, 0xaf,
+ // h2
+ 0x00, 0x50, 0x70, 0xe5, 0x66, 0x92, 0x77, 0x33, 0x82, 0xda, 0xc9, 0x27,
+ 0x7c, 0x16, 0xf8, 0xf2, 0x69, 0x48, 0x2f, 0xf0, 0xdd, 0x8d, 0x9e, 0x27,
+ 0x41, 0xaf, 0xcc, 0xb9, 0x04, 0xf4, 0x77, 0x8c, 0x06, 0x36, 0xee, 0xbd,
+ 0x53, 0x0e, 0x20, 0xd8, 0x9f, 0xd7, 0xb7, 0x41, 0xdd, 0xe0, 0xee, 0xc7,
+ 0xf8, 0xef, 0x91, 0x03, 0xe1, 0xfe, 0x6a, 0xe6, 0x3b, 0x91, 0xb7, 0xaa,
+ 0xc4, 0x64, 0x72, 0x37,
+ // w
+ 0x06, 0xa3, 0x37, 0xa1, 0xfc, 0xe2, 0x3a, 0x99, 0x96, 0xb9, 0x8d, 0xad,
+ 0x07, 0xec, 0xfc, 0x62, 0x39, 0x5c, 0x0c, 0x89, 0xba, 0x06, 0x3a, 0x1c,
+ 0xea, 0x2d, 0xcc, 0xf2, 0x00, 0xaa, 0x08, 0x25, 0x06, 0x82, 0xa0, 0x68,
+ 0x71, 0x4f, 0x5d, 0xbd, 0xc3, 0x80, 0xe6, 0x98, 0xe9, 0x14, 0x10, 0xdc,
+ 0x9c, 0xa6, 0x4e, 0x75, 0x09, 0x0a, 0x45, 0x39, 0x2b, 0xcc, 0x6e, 0x6f,
+ 0x66, 0xad, 0x1a, 0x63, 0x05, 0x9c, 0x6a, 0xeb, 0x7f, 0xd3, 0x16, 0x46,
+ 0x37, 0xc8, 0x5f, 0x1a, 0x34, 0x46, 0x35, 0x92, 0x10, 0x7b, 0x7b, 0xe3,
+ 0x9c, 0x65, 0x59, 0x2d, 0xa8, 0x8a, 0x4b, 0xfb, 0x81, 0x97, 0xf6, 0x25,
+ 0x09, 0xf3, 0x6d, 0xcc, 0x50, 0x63, 0xe0, 0x9d, 0x69, 0x02, 0x0c, 0x52,
+ 0x75, 0x95, 0x30, 0x38, 0x69, 0x1e, 0x8e, 0x6b, 0x52, 0xbf, 0x97, 0x9f,
+ 0x20, 0x02, 0xec, 0xb3, 0x6b, 0x2b, 0xdd, 0xf3, 0x01, 0x11, 0xbb, 0xbe,
+ 0x3b, 0xc9, 0xa0, 0xc3, 0x44, 0xfe, 0x49, 0x53, 0x89, 0x2d, 0x27, 0x40,
+ 0x86, 0x87, 0xea, 0xce, 0x5f, 0x9a, 0xee, 0xc2, 0x15, 0x62, 0xc1, 0x87,
+ 0x0f, 0x3a, 0x78, 0x03, 0x03, 0xd2, 0x8c, 0x24, 0x5a, 0x90, 0xa7, 0xc5,
+ 0x35, 0x4f, 0xab, 0xcd, 0x40, 0xe8, 0x7c, 0xf0, 0xab, 0x96, 0x59, 0x3a,
+ 0x96, 0xe4, 0x4a, 0x73, 0x67, 0x51, 0x1f, 0xad, 0x06, 0x94, 0x40, 0xcf,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x4b, 0xba, 0x99, 0x05,
+ 0x14, 0x98, 0x2c, 0x10, 0x5d, 0x25, 0x84, 0x93, 0x92, 0x0c, 0x7c, 0x44,
+ 0x39, 0xb8, 0xd9, 0x65, 0x8a, 0x27, 0x20, 0x31, 0xb8, 0xc8, 0x47, 0xe2,
+ 0xfb, 0x79, 0xa0, 0xa5};
+
+const std::vector<uint8_t> Epid11FileParser::kEmptyPrivRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0d,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n1
+ 0x00, 0x00, 0x00, 0x00,
+ // sig
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x29, 0xa4, 0x10, 0x8f,
+ 0x7d, 0xb4, 0xff, 0xae, 0x6a, 0xce, 0x8d, 0xcd, 0xc6, 0x84, 0x63, 0x9f,
+ 0x89, 0x3d, 0x23, 0x42, 0xf5, 0x37, 0xba, 0xb9, 0x4a, 0xbb, 0x6e, 0xf2,
+ 0xb2, 0x74, 0x8c, 0xcc,
+};
+const std::vector<uint8_t> Epid11FileParser::kEmptyPrivRl = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n1
+ 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> Epid11FileParser::kShortPrivRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0d,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n1
+ 0x00, 0x00, 0x00, 0x01,
+ // PrivRl
+ 0x00, 0x00, 0x56, 0x1e, 0xb1, 0x91, 0xb6, 0xdf, 0x40, 0xbc, 0xa2, 0xe3,
+ 0xe3, 0x92, 0x33, 0xd1, 0xd7, 0x5c, 0xcc, 0x4c, 0x3a, 0xe7, 0x91, 0x49,
+ 0x73, 0xe2, 0x03, 0xd4, 0x5e, 0x4f, 0x87, 0xad,
+ // Sig
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x60, 0xf3, 0xfa, 0xe8,
+ 0x34, 0x9f, 0x50, 0xac, 0x1b, 0x75, 0xf4, 0x62, 0x41, 0xc4, 0xb7, 0x11,
+ 0x64, 0xef, 0xe1, 0xd4, 0x3c, 0xee, 0xee, 0x86, 0x4c, 0xbb, 0x9a, 0x40,
+ 0x77, 0x0b, 0xb2, 0xec,
+};
+const std::vector<uint8_t> Epid11FileParser::kShortPrivRl = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n1
+ 0x00, 0x00, 0x00, 0x01,
+ // PrivRl
+ 0x00, 0x00, 0x56, 0x1e, 0xb1, 0x91, 0xb6, 0xdf, 0x40, 0xbc, 0xa2, 0xe3,
+ 0xe3, 0x92, 0x33, 0xd1, 0xd7, 0x5c, 0xcc, 0x4c, 0x3a, 0xe7, 0x91, 0x49,
+ 0x73, 0xe2, 0x03, 0xd4, 0x5e, 0x4f, 0x87, 0xad,
+};
+
+const std::vector<uint8_t> Epid11FileParser::kEmptySigRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0e,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x00,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x94, 0x29, 0xf2, 0x7e,
+ 0x16, 0x19, 0x48, 0xa0, 0xed, 0xb7, 0x61, 0x5e, 0x63, 0x54, 0x87, 0xf4,
+ 0xbb, 0x7f, 0x42, 0x8d, 0x39, 0x63, 0x62, 0x06, 0x69, 0x7b, 0x9d, 0x0b,
+ 0x7e, 0xdf, 0xf2, 0x0d};
+const std::vector<uint8_t> Epid11FileParser::kEmptySigRl = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> Epid11FileParser::kShortSigRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0e,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n2
+ 0x00, 0x00, 0x00, 0x03,
+ // bks
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x6e, 0xdf, 0x9f, 0xe3, 0xe0, 0x8d, 0xe4, 0x0b,
+ 0xbb, 0x86, 0x12, 0xd7, 0xc5, 0xd8, 0x14, 0x5e, 0x67, 0xbd, 0x1d, 0xa5,
+ 0x0b, 0xdb, 0xf5, 0x87, 0x36, 0x6c, 0xda, 0x81, 0x2a, 0x8c, 0x2e, 0x78,
+ 0xef, 0x6c, 0x42, 0xb2, 0xcd, 0x40, 0xda, 0xd3, 0x22, 0xf4, 0xd9, 0x7e,
+ 0x34, 0x78, 0x49, 0x41, 0x0d, 0x1e, 0x64, 0xc1, 0x43, 0xa1, 0xb0, 0xe9,
+ 0x6c, 0x45, 0xe2, 0x2d, 0xc3, 0xeb, 0xc8, 0x14, 0x09, 0x0d, 0x6f, 0x82,
+ 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27,
+ 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a,
+ 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46,
+ 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13,
+ 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70,
+ 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c, 0xb4, 0x10, 0x2d, 0x4a,
+ 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a, 0x59, 0x21, 0x17, 0x04,
+ 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b, 0x1e, 0x6a, 0xaf, 0x82,
+ 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb, 0x82, 0x17, 0xe6, 0xb8,
+ 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93, 0x77, 0x61, 0x3c, 0xc2,
+ 0x75, 0x14, 0xa1, 0xc2, 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53,
+ 0xba, 0x1e, 0x1b, 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09,
+ 0x4f, 0xcd, 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64,
+ 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb,
+ 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70, 0x95, 0x8b, 0x05, 0x1e,
+ 0x8b, 0xa5, 0x21, 0xdd, 0x63, 0xfd, 0x1a, 0x36, 0xb7, 0x42, 0x04, 0x92,
+ 0x10, 0xe6, 0x29, 0x22, 0xc8, 0x97, 0xb1, 0x28, 0x01, 0x45, 0x95, 0xf1,
+ 0x2a, 0xa0, 0x86, 0x41, 0xc4, 0x4c, 0xb6, 0x3b, 0x45, 0x23, 0x6e, 0x8d,
+ 0x6e, 0x07, 0xc7, 0x5b, 0xe5, 0x46, 0xca, 0xd0, 0x68, 0x99, 0xb6, 0x30,
+ 0x7b, 0x70, 0xb0, 0x92, 0x48, 0xc2, 0x89, 0xb6, 0x27, 0x3b, 0x95, 0x89,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x1c, 0xab, 0x1f, 0xca,
+ 0x99, 0x74, 0x76, 0x02, 0x4c, 0xa6, 0xca, 0x13, 0xda, 0x9d, 0x74, 0xfa,
+ 0x56, 0x23, 0xf1, 0x86, 0xbe, 0xd4, 0xf2, 0x84, 0x7a, 0xdf, 0xd3, 0x62,
+ 0x4f, 0xc2, 0x0d, 0x84};
+const std::vector<uint8_t> Epid11FileParser::kShortSigRl = {
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n2
+ 0x00, 0x00, 0x00, 0x03,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x6e, 0xdf, 0x9f, 0xe3, 0xe0, 0x8d, 0xe4, 0x0b,
+ 0xbb, 0x86, 0x12, 0xd7, 0xc5, 0xd8, 0x14, 0x5e, 0x67, 0xbd, 0x1d, 0xa5,
+ 0x0b, 0xdb, 0xf5, 0x87, 0x36, 0x6c, 0xda, 0x81, 0x2a, 0x8c, 0x2e, 0x78,
+ 0xef, 0x6c, 0x42, 0xb2, 0xcd, 0x40, 0xda, 0xd3, 0x22, 0xf4, 0xd9, 0x7e,
+ 0x34, 0x78, 0x49, 0x41, 0x0d, 0x1e, 0x64, 0xc1, 0x43, 0xa1, 0xb0, 0xe9,
+ 0x6c, 0x45, 0xe2, 0x2d, 0xc3, 0xeb, 0xc8, 0x14,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2,
+ // B, K
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x95, 0x8b, 0x05, 0x1e, 0x8b, 0xa5, 0x21, 0xdd,
+ 0x63, 0xfd, 0x1a, 0x36, 0xb7, 0x42, 0x04, 0x92, 0x10, 0xe6, 0x29, 0x22,
+ 0xc8, 0x97, 0xb1, 0x28, 0x01, 0x45, 0x95, 0xf1, 0x2a, 0xa0, 0x86, 0x41,
+ 0xc4, 0x4c, 0xb6, 0x3b, 0x45, 0x23, 0x6e, 0x8d, 0x6e, 0x07, 0xc7, 0x5b,
+ 0xe5, 0x46, 0xca, 0xd0, 0x68, 0x99, 0xb6, 0x30, 0x7b, 0x70, 0xb0, 0x92,
+ 0x48, 0xc2, 0x89, 0xb6, 0x27, 0x3b, 0x95, 0x89};
+
+const std::vector<uint8_t> Epid11FileParser::kEmptyGroupRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0f,
+ // RL ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n3
+ 0x00, 0x00, 0x00, 0x00,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0xc3, 0x21, 0x99, 0xe1,
+ 0x18, 0x22, 0x4a, 0xd2, 0xa5, 0xe5, 0xbf, 0x4a, 0xd9, 0x83, 0x08, 0x9d,
+ 0x62, 0x71, 0xa1, 0x39, 0x21, 0x49, 0x5d, 0xb2, 0x7a, 0xdb, 0x05, 0x2a,
+ 0xa4, 0xde, 0xb0, 0xac};
+const std::vector<uint8_t> Epid11FileParser::kEmptyGroupRl = {
+ // RL ver
+ 0x00, 0x00, 0x00, 0x00,
+ // n3
+ 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> Epid11FileParser::kShortGroupRlFile = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0f,
+ // RL ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x03,
+ // GIDs
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
+ // Signature
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0xc0, 0xec, 0x90, 0x92,
+ 0xe9, 0xaa, 0x2e, 0x61, 0xca, 0x70, 0x8f, 0x48, 0xd4, 0x7d, 0xe7, 0x82,
+ 0x22, 0x9f, 0x2f, 0x78, 0x5b, 0xfe, 0x56, 0x6e, 0x1a, 0xa1, 0x69, 0x9d,
+ 0xcc, 0xb1, 0xaa, 0x62};
+const std::vector<uint8_t> Epid11FileParser::kShortGroupRl = {
+ // RL ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x03,
+ // GIDs
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03};
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11ParseGroupPubKeyFile Tests
+TEST_F(Epid11FileParser, GroupPubKeyParseFailsGivenNullParameters) {
+ Epid11GroupPubKey pubkey{};
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupPubKeyFile(
+ nullptr, this->kGroupPublicKeyFile.size(),
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ nullptr, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &this->kCert, nullptr));
+}
+
+TEST_F(Epid11FileParser, GroupPubKeyParseFailsGivenUnsupportedCurve) {
+ Epid11GroupPubKey pubkey{};
+ EpidCaCertificate unsupported_curve1(this->kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve1, &pubkey));
+ EpidCaCertificate unsupported_curve2(this->kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve2, &pubkey));
+ EpidCaCertificate unsupported_curve3(this->kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve3, &pubkey));
+ EpidCaCertificate unsupported_curve4(this->kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve4, &pubkey));
+ EpidCaCertificate unsupported_curve5(this->kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve5, &pubkey));
+ EpidCaCertificate unsupported_curve6(this->kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve6, &pubkey));
+}
+
+TEST_F(Epid11FileParser, GroupPubKeyParseFailsGivenInvalidKeyInCertificate) {
+ Epid11GroupPubKey pubkey{};
+ EpidCaCertificate invalid_key_qx(this->kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qx, &pubkey));
+ EpidCaCertificate invalid_key_qy(this->kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qy, &pubkey));
+ EpidCaCertificate invalid_key_qx_qy(this->kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qx_qy, &pubkey));
+}
+
+TEST_F(Epid11FileParser, RejectsGroupPubKeyFileWithInvalidSize) {
+ Epid11GroupPubKey pubkey{};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ 0, &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size() - 1,
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size() - 1,
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size() + 1,
+ &this->kCert, &pubkey));
+}
+
+TEST_F(Epid11FileParser, RejectsInvalidGroupPubKeyFileType) {
+ Epid11GroupPubKey pubkey{};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)this->kShortPrivRlFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &this->kCert, &pubkey));
+}
+
+TEST_F(Epid11FileParser, RejectsGroupPubKeyFileWithUnsupportedEpidVersion) {
+ Epid11GroupPubKey pubkey{};
+
+ std::vector<uint8_t> unsupported_epidver_file(this->kGroupPublicKeyFile);
+ unsupported_epidver_file[0] = {0x02};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupPubKeyFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(),
+ &this->kCert, &pubkey));
+}
+
+TEST_F(Epid11FileParser, ParsesValidPubKeyFile) {
+ std::vector<uint8_t> pubkey(sizeof(Epid11GroupPubKey), 0);
+ EXPECT_EQ(kEpidNoErr, Epid11ParseGroupPubKeyFile(
+ (void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(), &this->kCert,
+ (Epid11GroupPubKey*)pubkey.data()));
+ EXPECT_EQ(this->kGroupPublicKey, pubkey);
+}
+
+TEST_F(Epid11FileParser, ParsesValidMultiPubKeyFile) {
+ std::vector<uint8_t> pubkey(sizeof(Epid11GroupPubKey), 0);
+ EXPECT_EQ(kEpidNoErr, Epid11ParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size(), &this->kCert,
+ (Epid11GroupPubKey*)pubkey.data()));
+ EXPECT_EQ(this->kGroupPublicKey, pubkey);
+}
+
+TEST_F(Epid11FileParser, RejectsGroupPubKeyFileWithInvalidSignature) {
+ Epid11GroupPubKey pubkey{};
+ std::vector<uint8_t> pubkey_inv_sign(this->kGroupPublicKeyFile);
+ pubkey_inv_sign[pubkey_inv_sign.size() - 1] =
+ pubkey_inv_sign[pubkey_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11ParseGroupPubKeyFile((void*)pubkey_inv_sign.data(),
+ pubkey_inv_sign.size(), &this->kCert,
+ &pubkey));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11ParsePrivRlFile Tests
+TEST_F(Epid11FileParser, PrivRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ nullptr, &rl_len));
+ EXPECT_EQ(this->kShortPrivRl.size(), rl_len);
+}
+
+TEST_F(Epid11FileParser, PrivRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ // null input buffer
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile(nullptr, this->kShortPrivRlFile.size(),
+ &this->kCert, (Epid11PrivRl*)rl.data(), &rl_len));
+ // null kCert
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), nullptr,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ // null rl_length
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), nullptr));
+ // null rl_length with null dest
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ nullptr, nullptr));
+}
+
+TEST_F(Epid11FileParser, PrivRlParseFailsGivenUnsupportedCurveInCA) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve(kCert);
+ unsupported_curve.a.data[0] = unsupported_curve.a.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve2,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve3,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve4,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve5,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve6,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParsePrivRlFile(
+ (void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qx,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParsePrivRlFile(
+ (void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qy,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qx_qy,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlParseRejectsPrivRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptyPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParsePrivRlFile(
+ (void*)this->kEmptyPrivRlFile.data(),
+ this->kEmptyPrivRlFile.size() + 1, &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParsePrivRlFile(
+ (void*)this->kEmptyPrivRlFile.data(),
+ this->kEmptyPrivRlFile.size() - 1, &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kEmptyPrivRlFile.data(), 0,
+ &this->kCert, (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlParseRejectsInvalidPrivRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlRejectsPrivRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortPrivRlFile);
+ unsupported_epidver_file[0] = {0x02};
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlParseParsesEmptyPrivRl) {
+ size_t rl_len = this->kEmptyPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParsePrivRlFile((void*)this->kEmptyPrivRlFile.data(),
+ this->kEmptyPrivRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(this->kEmptyPrivRl, rl);
+}
+
+TEST_F(Epid11FileParser, PrivRlParseParsesShortPrivRl) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(this->kShortPrivRl, rl);
+}
+
+TEST_F(Epid11FileParser, PrivRlParseParsesLongPrivRl) {
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x31,
+ 0x02, 0x1e, 0x05, 0xa2, 0x80, 0x99, 0xef, 0xa9, 0xed, 0x69, 0x90,
+ 0x36, 0x83, 0xaf, 0x95, 0xb8, 0x11, 0x5b, 0xb1, 0x83, 0x5f, 0x86,
+ 0x6b, 0x82, 0x17, 0x8f, 0x00, 0x3d, 0x79, 0x25, 0xda,
+ };
+
+ std::vector<uint8_t> long_privrl_file = {
+ // Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0d,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL Ver
+ 0x00, 0x00, 0x00, 0x03,
+ // n1
+ 0x00, 0x00, 0x00, 0x32,
+ };
+ const std::vector<uint8_t> FToCreateLongRl = {
+ 0x00, 0x00, 0x56, 0x1e, 0xb1, 0x91, 0xb6, 0xdf, 0x40, 0xbc, 0xa2,
+ 0xe3, 0xe3, 0x92, 0x33, 0xd1, 0xd7, 0x5c, 0xcc, 0x4c, 0x3a, 0xe7,
+ 0x91, 0x49, 0x73, 0xe2, 0x03, 0xd4, 0x5e, 0x4f, 0x87, 0xad,
+ };
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : FToCreateLongRl) {
+ long_privrl_file.push_back(it);
+ }
+ }
+ for (auto it : signature.x.data) {
+ long_privrl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_privrl_file.push_back(it);
+ }
+ size_t rl_len = long_privrl_file.size() - 68;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParsePrivRlFile((void*)long_privrl_file.data(),
+ long_privrl_file.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(
+ std::vector<uint8_t>(&long_privrl_file[4],
+ &long_privrl_file[long_privrl_file.size() - 64]),
+ rl);
+}
+
+TEST_F(Epid11FileParser, PrivRlRejectsPrivRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> privrl_inv_sign(kShortPrivRlFile);
+ privrl_inv_sign[privrl_inv_sign.size() - 1] =
+ privrl_inv_sign[privrl_inv_sign.size() - 1] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidSigInvalid,
+ Epid11ParsePrivRlFile(privrl_inv_sign.data(), privrl_inv_sign.size(),
+ &this->kCert, (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlRejectsGivenInsufficientOutputBufSize) {
+ size_t rl_len = this->kShortPrivRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, PrivRlReturnsProperSizeGivenOversizedPrivRlBuf) {
+ size_t rl_len = this->kShortPrivRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11PrivRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortPrivRl, rl);
+ EXPECT_EQ(this->kShortPrivRl.size(), rl_len);
+}
+//////////////////////////////////////////////////////////////////////////
+// Epid11ParseSigRlFile Tests
+TEST_F(Epid11FileParser, SigRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert, nullptr,
+ &rl_len));
+ EXPECT_EQ(rl_len, this->kShortSigRl.size());
+}
+
+TEST_F(Epid11FileParser, SigRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile(nullptr, this->kShortSigRlFile.size(), &kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), nullptr,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert,
+ (Epid11SigRl*)rl.data(), nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert, nullptr,
+ nullptr));
+}
+
+TEST_F(Epid11FileParser, SigRlParseFailsGivenUnsupportedCurveInCA) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve1(kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve1,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve2,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve3,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve4,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve5,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve6,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, SigRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qx,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qy,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qx_qy,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, SigRlParseRejectsSigRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptySigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kEmptySigRlFile.data(), 0, &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kEmptySigRlFile.data(),
+ this->kEmptySigRlFile.size() - 1, &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kEmptySigRlFile.size() + 1, &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, SigRlParseRejectsInvalidSigRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, RejectsSigRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortSigRlFile);
+ unsupported_epidver_file[0] = {0x02};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, SigRlParseParsesEmptySigRl) {
+ size_t rl_len = this->kEmptySigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseSigRlFile(this->kEmptySigRlFile.data(),
+ this->kEmptySigRlFile.size(), &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kEmptySigRl);
+}
+
+TEST_F(Epid11FileParser, SigRlParseParsesShortSigRl) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseSigRlFile(this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kShortSigRl);
+}
+
+TEST_F(Epid11FileParser, SigRlParseParsesLongSigRl) {
+ std::vector<uint8_t> bk = {
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x80, 0x85, 0x35, 0x04, 0x7b, 0xfc, 0x0a, 0x6c,
+ 0xb4, 0x10, 0x2d, 0x4a, 0xbe, 0x35, 0x78, 0x41, 0x3a, 0xc6, 0x01, 0x3a,
+ 0x59, 0x21, 0x17, 0x04, 0x60, 0x6a, 0x51, 0x6c, 0x84, 0xde, 0xc3, 0x3b,
+ 0x1e, 0x6a, 0xaf, 0x82, 0x5d, 0x81, 0xe2, 0x44, 0x25, 0x98, 0x89, 0xdb,
+ 0x82, 0x17, 0xe6, 0xb8, 0x9f, 0xfd, 0x03, 0x86, 0x63, 0x8c, 0xe1, 0x93,
+ 0x77, 0x61, 0x3c, 0xc2, 0x75, 0x14, 0xa1, 0xc2};
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x02,
+ 0x23, 0x1d, 0x31, 0x17, 0x88, 0x49, 0x13, 0x47, 0xe7, 0xda, 0xfe,
+ 0x8d, 0x67, 0xba, 0x16, 0x1d, 0x0a, 0xd3, 0x4a, 0x2d, 0xd1, 0xf8,
+ 0x60, 0x21, 0xa5, 0x00, 0x9a, 0x0d, 0x4d, 0xc4, 0xbd};
+ std::vector<uint8_t> long_sigrl_file = {// Intel(R) EPID Version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0e,
+ // GID
+ 0x00, 0x00, 0x00, 0x7b,
+ // RL ver
+ 0x00, 0x00, 0x00, 0x32,
+ // n2
+ 0x00, 0x00, 0x00, 0x32};
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : bk) {
+ long_sigrl_file.push_back(it);
+ }
+ }
+ for (auto it : signature.x.data) {
+ long_sigrl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_sigrl_file.push_back(it);
+ }
+ size_t rl_len = long_sigrl_file.size() - sizeof(signature) - 4;
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr, Epid11ParseSigRlFile(
+ long_sigrl_file.data(), long_sigrl_file.size(),
+ &this->kCert, (Epid11SigRl*)rl.data(), &rl_len));
+
+ std::vector<uint8_t> expected_long_sig_rl(std::vector<uint8_t>(
+ &long_sigrl_file[4],
+ &long_sigrl_file[long_sigrl_file.size() - sizeof(signature)]));
+
+ EXPECT_EQ(expected_long_sig_rl, rl);
+}
+
+TEST_F(Epid11FileParser, RejectsSigRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> sigrl_inv_sign(kShortSigRlFile);
+ sigrl_inv_sign[sigrl_inv_sign.size() - 1] =
+ sigrl_inv_sign[sigrl_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidSigInvalid,
+ Epid11ParseSigRlFile((void*)sigrl_inv_sign.data(), sigrl_inv_sign.size(),
+ &this->kCert, (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, RejectsGivenInsufficientOutputBufSize) {
+ size_t rl_len = this->kShortSigRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (Epid11SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, ReturnsProperSizeGivenOversizedSigRlBuf) {
+ size_t rl_len = this->kShortSigRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (Epid11SigRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortSigRl, rl);
+ EXPECT_EQ(this->kShortSigRl.size(), rl_len);
+}
+//////////////////////////////////////////////////////////////////////////
+// Epid11ParseGroupRlFile Tests
+TEST_F(Epid11FileParser, GroupRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ nullptr, &rl_len));
+ EXPECT_EQ(this->kShortGroupRl.size(), rl_len);
+}
+
+TEST_F(Epid11FileParser, GroupRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile(nullptr, this->kShortGroupRlFile.size(),
+ &kCert, (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), nullptr,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ (Epid11GroupRl*)rl.data(), nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ nullptr, nullptr));
+}
+
+TEST_F(Epid11FileParser, GroupRlParseFailsGivenUnsupportedCurve) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve1(kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve1,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve2,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve3,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve4,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve5,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(),
+ &unsupported_curve6,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, GroupRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupRlFile(
+ (void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qx,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupRlFile(
+ (void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qy,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qx_qy,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, RejectsGroupRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptyGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kEmptyGroupRlFile.data(), 0,
+ &this->kCert, (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kEmptyGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size() - 1, &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size() + 1, &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, RejectsInvalidGroupRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, RejectsGroupRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortGroupRlFile);
+ unsupported_epidver_file[0] = {0x02};
+ EXPECT_EQ(kEpidBadArgErr, Epid11ParseGroupRlFile(
+ (void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, ParsesEmptyGroupRl) {
+ size_t rl_len = this->kEmptyGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseGroupRlFile(this->kEmptyGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kEmptyGroupRl);
+}
+
+TEST_F(Epid11FileParser, ParsesShortGroupRl) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11ParseGroupRlFile(this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kShortGroupRl);
+}
+
+TEST_F(Epid11FileParser, ParsesLongGroupRl) {
+ std::vector<uint8_t> gid = {0x00, 0x00, 0x00, 0x01};
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x64,
+ 0x0c, 0xa9, 0x25, 0xb2, 0x50, 0xc8, 0xd7, 0x9d, 0xb8, 0xb4, 0x37,
+ 0x30, 0x90, 0x53, 0x8f, 0x55, 0x50, 0xcf, 0xed, 0x9e, 0xaa, 0x31,
+ 0x4f, 0x7f, 0xb2, 0x27, 0xf9, 0xbb, 0xfa, 0x52, 0x70};
+ std::vector<uint8_t> long_grouprl_file = {
+ /// Intel(R) EPID version
+ 0x01, 0x00,
+ // File type
+ 0x00, 0x0f,
+ // RL ver
+ 0x00, 0x00, 0x00, 0x32,
+ // n3
+ 0x00, 0x00, 0x00, 0x32,
+ };
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : gid) {
+ long_grouprl_file.push_back(it);
+ }
+ gid[3]++;
+ }
+ for (auto it : signature.x.data) {
+ long_grouprl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_grouprl_file.push_back(it);
+ }
+
+ size_t rl_len = long_grouprl_file.size() - sizeof(signature) - 4;
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr, Epid11ParseGroupRlFile(
+ long_grouprl_file.data(), long_grouprl_file.size(),
+ &this->kCert, (Epid11GroupRl*)rl.data(), &rl_len));
+
+ std::vector<uint8_t> expected_long_gr_rl(std::vector<uint8_t>(
+ &long_grouprl_file[4],
+ &long_grouprl_file[long_grouprl_file.size() - sizeof(signature)]));
+
+ EXPECT_EQ(expected_long_gr_rl, rl);
+}
+
+TEST_F(Epid11FileParser, RejectsGroupRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> grouprl_inv_sign(this->kShortGroupRlFile);
+ grouprl_inv_sign[grouprl_inv_sign.size() - 1] =
+ grouprl_inv_sign[grouprl_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11ParseGroupRlFile((void*)grouprl_inv_sign.data(),
+ grouprl_inv_sign.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, GroupRlParseRejectsBufWithInsufficientSize) {
+ size_t rl_len = this->kShortGroupRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11ParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (Epid11GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(Epid11FileParser, ReturnsProperSizeGivenOversizedGroupRlBuf) {
+ size_t rl_len = this->kShortGroupRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr, Epid11ParseGroupRlFile(
+ (void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (Epid11GroupRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortGroupRl, rl);
+ EXPECT_EQ(this->kShortGroupRl.size(), rl_len);
+}
+
+} // namespace
diff --git a/epid/common/Makefile b/epid/common/Makefile
new file mode 100644
index 0000000..4dfe984
--- /dev/null
+++ b/epid/common/Makefile
@@ -0,0 +1,81 @@
+#!/usr/bin/make -f
+
+#define path variables
+IPP_INCLUDE_DIR = ../../ext/ipp/sources/ippcp/src
+GTEST_INCLUDE_DIR = ../../ext
+
+LIB_INSTALL_DIR = $(epidinstalldir)/lib/posix-$(ARCH)/
+TEST_INSTALL_DIR = $(epidinstalldir)/test/
+HEADERS_INSTALL_DIR := $(epidinstalldir)/include/epid/common/
+HEADERS_11_INSTALL_DIR := $(epidinstalldir)/include/epid/common/1.1
+
+API_HEADERS_INSTALL = $(wildcard ./*.h)
+
+API_11_HEADERS_INSTALL = $(wildcard ./1.1/*.h)
+
+COMMON_INCLUDE_DIR = ../../
+COMMON_MATH_INCLUDE_DIR = ./math
+COMMON_SRC = $(wildcard ./src/*.c)
+COMMON_SRC += $(wildcard ./math/src/*.c)
+COMMON_SRC += $(wildcard ./1.1/src/*.c)
+COMMON_OBJ = $(COMMON_SRC:.c=.o)
+COMMON_LIB = ./libcommon.a
+
+COMMON_UTEST_EXE = ./common-utest$(EXE_EXTENSION)
+COMMON_UTEST_SRC = $(wildcard ./math/unittests/*.cc)
+COMMON_UTEST_SRC += $(wildcard ./unittests/*.cc)
+COMMON_UTEST_SRC += $(wildcard ./1.1/unittests/*.cc)
+COMMON_UTEST_OBJ = $(COMMON_UTEST_SRC:.cc=.o)
+LIB_COMMON_DIR = .
+LIB_COMMON_TESTHELPER_DIR = ../common-testhelper
+LIB_IPPCP_DIR = ../../ext/ipp/sources/ippcp/src
+
+#set flags for linker
+LDFLAGS += -L$(GTEST_INCLUDE_DIR)/gtest -L$(LIB_COMMON_TESTHELPER_DIR) \
+ -L$(LIB_COMMON_DIR) -L$(LIB_IPPCP_DIR) \
+ -lgtest -lcommon-testhelper -lcommon -lippcp
+
+#target part
+$(COMMON_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(IPP_INCLUDE_DIR) -I$(COMMON_MATH_INCLUDE_DIR) -I$(COMMON_INCLUDE_DIR) -c $^ -o $@
+
+$(COMMON_LIB): $(COMMON_OBJ)
+ $(AR) rc $(COMMON_LIB) $(COMMON_OBJ)
+ $(RANLIB) $(COMMON_LIB)
+
+$(COMMON_UTEST_EXE): $(COMMON_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+$(COMMON_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(COMMON_INCLUDE_DIR) -I$(GTEST_INCLUDE_DIR) -c $^
+
+build: all
+
+all: $(COMMON_LIB)
+
+install:
+ mkdir -p '$(LIB_INSTALL_DIR)'
+ mkdir -p '$(HEADERS_INSTALL_DIR)'
+ mkdir -p '$(HEADERS_11_INSTALL_DIR)'
+ cp $(COMMON_LIB) '$(LIB_INSTALL_DIR)'
+ cp $(API_HEADERS_INSTALL) '$(HEADERS_INSTALL_DIR)'
+ cp $(API_11_HEADERS_INSTALL) '$(HEADERS_11_INSTALL_DIR)'
+#install tests if they exist
+ifneq (,$(wildcard $(COMMON_UTEST_EXE)))
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(COMMON_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+endif
+
+utest: $(COMMON_UTEST_EXE)
+
+run_utest:
+ $(COMMON_UTEST_EXE) $(GTEST_FLAGS)
+
+check: utest run_utest
+
+clean:
+ rm -f $(COMMON_OBJ) \
+ $(COMMON_LIB) \
+ $(COMMON_UTEST_OBJ) \
+ $(COMMON_UTEST_EXE) \
+ *.xml
diff --git a/epid/common/bitsupplier.h b/epid/common/bitsupplier.h
new file mode 100644
index 0000000..fb544a1
--- /dev/null
+++ b/epid/common/bitsupplier.h
@@ -0,0 +1,60 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_BITSUPPLIER_H_
+#define EPID_COMMON_BITSUPPLIER_H_
+/*!
+ * \file
+ * \brief Random data supplier interface.
+ */
+
+#if defined(_WIN32) || defined(_WIN64)
+#define __STDCALL __stdcall
+#else
+#define __STDCALL
+#endif
+
+/// Generates random data.
+/*!
+ The SDK provides the ::BitSupplier as a function
+ prototype so that you will know the requirements for your
+ own implementation of a random number generator.
+
+ You need to pass a pointer to your
+ implementation of the random number generator into
+ methods that require it.
+
+ For an example of how a BitSupplier is created, see
+ the `signmsg` example.
+
+ \param[out] rand_data destination buffer for random data
+ generated by BitSupplier. The buffer will receive
+ `num_bits` of random data.
+ \param[in] num_bits specifies the size of the random
+ data, in bits, to be generated.
+ \param[in] user_data user data that will be passed to the
+ random number generator. The usage of this data is specific
+ to the implementation of the BitSupplier. For example, this
+ could be used to pass a pointer to a data structure
+ that maintains state across calls to your BitSupplier.
+
+ \returns zero on success and non-zero value on error.
+
+ \ingroup EpidCommon
+ */
+typedef int(__STDCALL* BitSupplier)(unsigned int* rand_data, int num_bits,
+ void* user_data);
+
+#endif // EPID_COMMON_BITSUPPLIER_H_
diff --git a/epid/common/common.parts b/epid/common/common.parts
new file mode 100644
index 0000000..dfa80b4
--- /dev/null
+++ b/epid/common/common.parts
@@ -0,0 +1,119 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+env.PartName('common')
+
+api_headers = Pattern(src_dir='.',
+ includes=['*.h'],
+ recursive=False).files()
+src_files = Pattern(src_dir='src',
+ includes=['*.c'],
+ recursive=False).files()
+internal_headers = Pattern(src_dir='src',
+ includes=['*.h', '*.inc'],
+ recursive=False).files()
+utest_files = Pattern(src_dir='unittests',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ recursive=False).files()
+
+epid11_headers = Pattern(src_dir='1.1',
+ includes=['*.h'],
+ recursive=False).files()
+epid11_src_files = Pattern(src_dir='1.1/src',
+ includes=['*.c'],
+ recursive=False).files()
+epid11_internal_headers = Pattern(src_dir='1.1/src',
+ includes=['*.h', '*.inc'],
+ recursive=False).files()
+epid11_utest_files = Pattern(src_dir='1.1/unittests',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ recursive=False).files()
+
+math_headers = Pattern(src_dir='math',
+ includes=['*.h'],
+ recursive=False).files()
+math_src_files = Pattern(src_dir='math/src',
+ includes=['*.c'],
+ recursive=False).files()
+math_internal_headers = Pattern(src_dir='math/src',
+ includes=['*.h'],
+ recursive=False).files()
+math_utest_files = Pattern(src_dir='math/unittests',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ recursive=False).files()
+
+build_files = Pattern(src_dir='.',
+ includes=['*.parts', 'Makefile'],
+ recursive=False).files()
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(api_headers, sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(src_files + internal_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(utest_files,
+ sub_dir='epid/${PART_SHORT_NAME}/unittests')
+
+
+ env.InstallTopLevel(epid11_headers, sub_dir='epid/${PART_SHORT_NAME}/1.1')
+ env.InstallTopLevel(epid11_src_files + epid11_internal_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1/src')
+ env.InstallTopLevel(epid11_utest_files,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1/unittests')
+
+ env.InstallTopLevel(math_headers, sub_dir='epid/${PART_SHORT_NAME}/math')
+ env.InstallTopLevel(math_src_files + math_internal_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/math/src')
+ env.InstallTopLevel(math_utest_files,
+ sub_dir='epid/${PART_SHORT_NAME}/math/unittests')
+
+ env.InstallTopLevel(build_files, sub_dir='epid/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('ippcp'),
+ ])
+ if 'use_memory_profiler' in env['MODE']:
+ env.DependsOn([Component('memory_profiler')])
+
+ env.Append(CPPPATH='#')
+
+ testenv = env.Clone()
+
+ env.SdkInclude(api_headers, sub_dir='epid/${PART_SHORT_NAME}')
+ env.SdkInclude(epid11_headers, sub_dir='epid/${PART_SHORT_NAME}/1.1')
+
+ outputs = env.Library('${PART_NAME}',
+ src_files + epid11_src_files + math_src_files)
+ env.Sdk(outputs)
+ if 'install_lib' in env['MODE']:
+ env.InstallLib(outputs)
+ env.InstallInclude(api_headers, sub_dir='${PART_SHORT_NAME}')
+ env.InstallInclude(epid11_headers, sub_dir='${PART_SHORT_NAME}/1.1')
+
+ # unit tests
+ testenv['UNIT_TEST_TARGET_NAME'] = "${PART_NAME}-${UNIT_TEST_TARGET}"
+ testenv.UnitTest("utest",
+ utest_files + math_utest_files + epid11_utest_files,
+ command_args=[
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ '--gtest_filter=**',
+ ],
+ make_pdb=(env.isConfigBasedOn('debug')),
+ depends=[Component('gtest'),
+ Component('common'),
+ Component('common-testhelper')],
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
diff --git a/epid/common/epiddefs.h b/epid/common/epiddefs.h
new file mode 100644
index 0000000..1ff7673
--- /dev/null
+++ b/epid/common/epiddefs.h
@@ -0,0 +1,39 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Common SDK macro definitions
+/*! \file */
+#ifndef EPID_COMMON_EPIDDEFS_H_
+#define EPID_COMMON_EPIDDEFS_H_
+
+#if defined(SHARED)
+#if defined(_WIN32)
+#ifdef EXPORT_EPID_APIS
+#define EPID_API __declspec(dllexport)
+#else
+#define EPID_API __declspec(dllimport)
+#endif
+#else // defined(_WIN32)
+#if __GNUC__ >= 4
+#define EPID_API __attribute__((visibility("default")))
+#else
+#define EPID_API
+#endif
+#endif // defined(_WIN32)
+#else // defined(SHARED)
+#define EPID_API
+#endif // defined(SHARED)
+
+#endif // EPID_COMMON_EPIDDEFS_H_
diff --git a/epid/common/errors.h b/epid/common/errors.h
new file mode 100644
index 0000000..7f4f485
--- /dev/null
+++ b/epid/common/errors.h
@@ -0,0 +1,74 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_ERRORS_H_
+#define EPID_COMMON_ERRORS_H_
+/*!
+ * \file
+ * \brief Error reporting.
+*/
+
+/// Error reporting interface.
+/*!
+ \defgroup ErrorCodes errors
+ This module defines the return status type. It also provides tools for
+ interactions with status values, such as converting them to a string.
+
+ \ingroup EpidCommon
+ @{
+*/
+
+/// Return status for SDK functions.
+/*!
+ Convention for status values is as follows:
+ - Zero indicates "success"
+ - Any positive number indicates "success with status"
+ - Any negative number indicates "failure"
+*/
+typedef enum {
+ kEpidNoErr = 0, //!< no error
+ kEpidSigValid = 0, //!< Signature is valid
+ kEpidSigInvalid = 1, //!< Signature is invalid
+ kEpidSigRevokedInGroupRl = 2, //!< Signature revoked in GroupRl
+ kEpidSigRevokedInPrivRl = 3, //!< Signature revoked in PrivRl
+ kEpidSigRevokedInSigRl = 4, //!< Signature revoked in SigRl
+ kEpidSigRevokedInVerifierRl = 5, //!< Signature revoked in VerifierRl
+ kEpidErr = -999, //!< unspecified error
+ kEpidNotImpl, //!< not implemented error
+ kEpidBadArgErr, //!< incorrect arg to function
+ kEpidNoMemErr, //!< not enough memory for the operation
+ kEpidMemAllocErr, //!< insufficient memory allocated for operation
+ kEpidMathErr, //!< internal math error
+ kEpidDivByZeroErr, //!< an attempt to divide by zero
+ kEpidUnderflowErr, //!< a value became less than minimum supported level
+ kEpidHashAlgorithmNotSupported, //!< unsupported hash algorithm type
+ kEpidRandMaxIterErr, //!< reached max iteration for random number generation
+ kEpidDuplicateErr, //!< argument would add duplicate entry
+ kEpidInconsistentBasenameSetErr, //!< set basename conflicts with arguments
+ kEpidMathQuadraticNonResidueError, //!< quadratic Non-Residue Error
+ kEpidOutOfSequenceError, //!< operation was performed out of sequence
+} EpidStatus;
+
+/// Returns string representation of error code.
+/*!
+ \param e
+ The status value.
+
+ \returns The string describing the status.
+*/
+char const* EpidStatusToString(EpidStatus e);
+
+/*! @} */
+#endif // EPID_COMMON_ERRORS_H_
diff --git a/epid/common/file_parser.h b/epid/common/file_parser.h
new file mode 100644
index 0000000..0cc7b3b
--- /dev/null
+++ b/epid/common/file_parser.h
@@ -0,0 +1,288 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID issuer material parsing utilities.
+ */
+#ifndef EPID_COMMON_FILE_PARSER_H_
+#define EPID_COMMON_FILE_PARSER_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// Parser for issuer material
+/*!
+ \defgroup FileParser fileparser
+ Provides an API for parsing buffers formatted according to the
+ various IoT Intel(R) EPID binary file formats.
+
+ To use this module, include the header epid/common/file_parser.h.
+
+ \ingroup EpidCommon
+ @{
+*/
+
+/// Recognized Intel(R) EPID versions
+typedef enum EpidVersion {
+ kEpid1x, ///< Intel(R) EPID version 1.x
+ kEpid2x, ///< Intel(R) EPID version 2.x
+ kNumEpidVersions, ///< Maximum number of versions
+} EpidVersion;
+
+/// Encoding of issuer material Intel(R) EPID versions
+extern const OctStr16 kEpidVersionCode[kNumEpidVersions];
+
+/// Recognized Intel(R) EPID file types
+typedef enum EpidFileType {
+ kIssuingCaPubKeyFile, ///< IoT Issuing CA public key file
+ kGroupPubKeyFile, ///< Group Public Key Output File Format
+ kPrivRlFile, ///< Binary Private Key Revocation List
+ kSigRlFile, ///< Binary Signature Revocation List
+ kGroupRlFile, ///< Binary Group Revocation List
+ kPrivRlRequestFile, ///< Binary Private Key Revocation Request
+ kSigRlRequestFile, ///< Binary Signature Revocation Request
+ kGroupRlRequestFile, ///< Binary Group Revocation Request
+ kNumFileTypes, ///< Maximum number of file types
+} EpidFileType;
+
+/// Encoding of issuer material file types
+extern const OctStr16 kEpidFileTypeCode[kNumFileTypes];
+
+#pragma pack(1)
+/// Intel(R) EPID binary file header
+typedef struct EpidFileHeader {
+ OctStr16 epid_version; ///< Intel(R) EPID Version
+ OctStr16 file_type; ///< File Type
+} EpidFileHeader;
+
+/// IoT CA Certificate binary format
+typedef struct EpidCaCertificate {
+ EpidFileHeader header; ///< Intel(R) EPID binary file header
+ OctStr512 pubkey; ///< Public Key (Qx, Qy)
+ OctStr256 prime; ///< Prime of GF(p)
+ OctStr256 a; ///< Coefficient of E Curve
+ OctStr256 b; ///< Coefficient of E Curve
+ OctStr256 x; ///< X coordinate of Base point G
+ OctStr256 y; ///< Y coordinate of Base point G
+ OctStr256 r; ///< Order of base point
+ EcdsaSignature signature; ///< ECDSA Signature on SHA-256 of above values
+} EpidCaCertificate;
+#pragma pack()
+
+/// Extracts Intel(R) EPID Binary Output File header information
+/*!
+ \param[in] buf
+ Pointer to buffer containing Intel(R) EPID Binary Output File to parse.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[out] epid_version
+ The extracted Intel(R) EPID version or kNumEpidVersions if Intel(R) EPID
+ version is unknown. Pass NULL to not extract.
+
+ \param[out] file_type
+ The extracted Intel(R) EPID file type or kNumFileTypes if file type is
+ unknown. Pass NULL to not extract.
+
+ \returns ::EpidStatus
+
+*/
+EpidStatus EpidParseFileHeader(void const* buf, size_t len,
+ EpidVersion* epid_version,
+ EpidFileType* file_type);
+
+/// Extracts group public key from buffer in issuer binary format
+/*!
+
+ Extracts the first group public key from a buffer with format of
+ Intel(R) EPID 2.0 Group Public Key Certificate Binary File. The
+ function validates that the first public key was signed by the
+ private key corresponding to the provided CA certificate and the
+ size of the input buffer is correct.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing public key to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] pubkey
+ The extracted group public key.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \b Examples
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EpidParseGroupPubKeyFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ GroupPubKey* pubkey);
+
+/// Extracts private key revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the private key revocation list from a buffer with format of
+ Binary Private Key Revocation List File. The function
+ validates that the revocation list was signed by the private
+ key corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidParsePrivRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, PrivRl* rl,
+ size_t* rl_len);
+
+/// Extracts signature revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the signature based revocation list from a buffer with
+ format of Binary Signature Revocation List File. The function
+ validates that the revocation list was signed by the private key
+ corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \b Examples
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EpidParseSigRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, SigRl* rl,
+ size_t* rl_len);
+
+/// Extracts group revocation list from buffer in issuer binary format
+/*!
+
+ Extracts the group revocation list from a buffer with format of
+ Binary Group Certificate Revocation List File. The function
+ validates that the revocation list was signed by the private key
+ corresponding to the provided CA certificate and the size of the
+ input buffer is correct.
+
+ To determine the required size of the revocation list output buffer,
+ provide a null pointer for the output buffer.
+
+ \warning
+ It is the responsibility of the caller to authenticate the
+ EpidCaCertificate.
+
+ \param[in] buf
+ Pointer to buffer containing the revocation list to extract.
+
+ \param[in] len
+ The size of buf in bytes.
+
+ \param[in] cert
+ The issuing CA public key certificate.
+
+ \param[out] rl
+ The extracted revocation list. If Null, rl_len is filled with
+ the required output buffer size.
+
+ \param[in,out] rl_len
+ The size of rl in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigInvalid
+ Parsing failed due to data authentication failure.
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidParseGroupRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, GroupRl* rl,
+ size_t* rl_len);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_FILE_PARSER_H_
diff --git a/epid/common/math/bignum.h b/epid/common/math/bignum.h
new file mode 100644
index 0000000..000d2a1
--- /dev/null
+++ b/epid/common/math/bignum.h
@@ -0,0 +1,207 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Big number interface.
+ */
+
+#ifndef EPID_COMMON_MATH_BIGNUM_H_
+#define EPID_COMMON_MATH_BIGNUM_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/// Big number operations
+/*!
+ \defgroup BigNumPrimitives bignum
+ This module provides an API for working with large numbers. BigNums
+ represent non-negative integers.
+
+ Each BigNum variable represents a number of a byte-size set when the variable
+ was created. BigNum variables cannot be re-sized after they are created.
+
+
+ \ingroup EpidMath
+ @{
+*/
+
+/// Internal representation of large numbers
+typedef struct BigNum BigNum;
+
+/// Constructs a new BigNum.
+/*!
+ Allocates memory and creates a new BigNum.
+
+ Use DeleteBigNum() to free memory.
+
+ \param[in] data_size_bytes
+ The size in bytes of the new number.
+ \param[out] bignum
+ The BigNum.
+
+ \returns ::EpidStatus
+
+ \see DeleteBigNum
+*/
+EpidStatus NewBigNum(size_t data_size_bytes, BigNum** bignum);
+
+/// Deletes a previously allocated BigNum.
+/*!
+ Frees memory pointed to by bignum. Nulls the pointer.
+
+ \param[in] bignum
+ The BigNum. Can be NULL.
+
+ \see NewBigNum
+*/
+void DeleteBigNum(BigNum** bignum);
+
+/// Deserializes a BigNum from a string.
+/*!
+ \param[in] bn_str
+ The serialized value.
+ \param[in] strlen
+ The size of bn_str in bytes.
+ \param[out] bn
+ The target BigNum.
+
+ \returns ::EpidStatus
+*/
+EpidStatus ReadBigNum(ConstOctStr bn_str, size_t strlen, BigNum* bn);
+
+/// Serializes a BigNum to a string.
+/*!
+ \param[in] bn
+ The BigNum to be serialized.
+ \param[in] strlen
+ The size of bn_str in bytes.
+ \param[out] bn_str
+ The target string.
+
+ \returns ::EpidStatus
+*/
+EpidStatus WriteBigNum(BigNum const* bn, size_t strlen, OctStr bn_str);
+
+/// Adds two BigNum values.
+/*!
+ \param[in] a
+ The first operand to be added.
+ \param[in] b
+ The second operand to be added.
+ \param[out] r
+ The result of adding a and b.
+
+ \returns ::EpidStatus
+*/
+EpidStatus BigNumAdd(BigNum const* a, BigNum const* b, BigNum* r);
+
+/// Subtracts two BigNum values.
+/*!
+ \param[in] a
+ The first operand to use in subtraction.
+ \param[in] b
+ The second operand to use in subtraction.
+ \param[out] r
+ The result of subtracting a and b.
+
+ \returns ::EpidStatus
+*/
+EpidStatus BigNumSub(BigNum const* a, BigNum const* b, BigNum* r);
+
+/// Multiplies two BigNum values.
+/*!
+ \param[in] a
+ The first operand to be multiplied.
+ \param[in] b
+ The second operand to be multiplied.
+ \param[out] r
+ The result of multiplying a and b.
+
+ \returns ::EpidStatus
+*/
+EpidStatus BigNumMul(BigNum const* a, BigNum const* b, BigNum* r);
+
+/// Divides two BigNum values.
+/*!
+\note Only needed for Intel(R) EPID 1.1 verification.
+
+\param[in] a
+Dividend parameter.
+\param[in] b
+Divisor parameter.
+\param[out] q
+Quotient of result.
+\param[out] r
+Remainder of result.
+
+\returns ::EpidStatus
+*/
+EpidStatus BigNumDiv(BigNum const* a, BigNum const* b, BigNum* q, BigNum* r);
+
+/// Computes modular reduction for BigNum value by specified modulus.
+/*!
+\param[in] a
+The BigNum value.
+\param[in] b
+The modulus.
+\param[out] r
+Modular reduction result.
+
+\returns ::EpidStatus
+*/
+EpidStatus BigNumMod(BigNum const* a, BigNum const* b, BigNum* r);
+
+/// Checks if a BigNum is even.
+/*!
+ \param[in] a
+ The BigNum to check.
+ \param[out] is_even
+ The result of the check.
+
+ \returns ::EpidStatus
+ */
+EpidStatus BigNumIsEven(BigNum const* a, bool* is_even);
+
+/// Checks if a BigNum is zero.
+/*!
+ \param[in] a
+ The BigNum to check.
+ \param[out] is_zero
+ The result of the check.
+
+ \returns ::EpidStatus
+ */
+EpidStatus BigNumIsZero(BigNum const* a, bool* is_zero);
+
+/// Raises 2 to the given power
+/*!
+ \param[in] n
+ The power.
+ \param[out] r
+ The result of 2^n.
+
+ \returns ::EpidStatus
+ */
+EpidStatus BigNumPow2N(unsigned int n, BigNum* r);
+
+/*!
+ @}
+*/
+#endif // EPID_COMMON_MATH_BIGNUM_H_
diff --git a/epid/common/math/ecdsa.h b/epid/common/math/ecdsa.h
new file mode 100644
index 0000000..92567f7
--- /dev/null
+++ b/epid/common/math/ecdsa.h
@@ -0,0 +1,114 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Ecdsa interface.
+ */
+
+#ifndef EPID_COMMON_MATH_ECDSA_H_
+#define EPID_COMMON_MATH_ECDSA_H_
+
+#include <stddef.h>
+
+#include "epid/common/bitsupplier.h"
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// Elliptic Curve Digital Signature Algorithm Primitives
+/*!
+ \defgroup EcdsaPrimitives ecdsa
+ Provides APIs for computing and checking buffer signatures using the
+ Elliptic Curve Digital Signature Algorithm.
+
+ \ingroup EpidMath
+ @{
+*/
+
+/// Verifies authenticity of a digital signature over a buffer
+/*!
+
+ Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to verify
+ that the SHA-256 hash of the input buffer was signed with the
+ private key corresponding to the provided public key.
+
+ The operation is over the standard secp256r1 curve.
+
+ \warning
+ It is the responsibility of the caller to verify the identity of
+ the public key.
+
+ \param[in] buf
+ Pointer to buffer containing message to verify.
+ \param[in] buf_len
+ The size of buf in bytes.
+ \param[in] pubkey
+ The ECDSA public key on secp256r1 curve.
+ \param[in] sig
+ The ECDSA signature to be verified.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigValid
+ EcdsaSignature is valid for the given buffer.
+ \retval ::kEpidSigInvalid
+ EcdsaSignature is invalid for the given buffer.
+
+ \see EcdsaSignBuffer
+ */
+EpidStatus EcdsaVerifyBuffer(ConstOctStr buf, size_t buf_len,
+ EcdsaPublicKey const* pubkey,
+ EcdsaSignature const* sig);
+
+/// Creates ECDSA signature of buffer
+/*!
+
+ Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to generate
+ a signature of the SHA-256 hash of the input buffer with the provided
+ private key.
+
+ The operation is over the standard secp256r1 curve.
+
+ \param[in] buf
+ Pointer to buffer containing message to sign.
+ \param[in] buf_len
+ The size of buf in bytes.
+ \param[in] privkey
+ The ECDSA private key on secp256r1 curve.
+ \param[in] rnd_func
+ Random number generator.
+ \param[in] rnd_param
+ Pass through context data for rnd_func.
+ \param[out] sig
+ The resulting ECDSA signature.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidRandMaxIterErr
+ Failed to sign after maximum number of iterations due to bad luck in
+ random number generation.
+
+ \see EcdsaSignBuffer
+ */
+EpidStatus EcdsaSignBuffer(ConstOctStr buf, size_t buf_len,
+ EcdsaPrivateKey const* privkey, BitSupplier rnd_func,
+ void* rnd_param, EcdsaSignature* sig);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_MATH_ECDSA_H_
diff --git a/epid/common/math/ecgroup.h b/epid/common/math/ecgroup.h
new file mode 100644
index 0000000..85e90b9
--- /dev/null
+++ b/epid/common/math/ecgroup.h
@@ -0,0 +1,490 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Elliptic curve group interface.
+ */
+
+#ifndef EPID_COMMON_MATH_ECGROUP_H_
+#define EPID_COMMON_MATH_ECGROUP_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/// Elliptic curve group operations
+/*!
+ \defgroup EcGroupPrimitives ecgroup
+ Provides APIs for working with Elliptic curve groups.
+ Elliptic curve groups allow simple mathematical operations based on points
+ that lie on a defined elliptic curve. The results of these operations also
+ lie on the same curve.
+
+ Curves themselves are defined based on elements (::FfElement) of a finite
+ field (::FiniteField).
+
+ \ingroup EpidMath
+@{
+*/
+
+/// Elliptic curve group over finite field.
+typedef struct EcGroup EcGroup;
+
+/// Constructs a new EcGroup.
+/*!
+
+ Allocates memory and creates a new elliptic curve group.
+
+ Use DeleteFiniteField() to free memory.
+
+ \param[in] ff
+ The finite field on which the curve is based.
+ \param[in] a
+ The A value of the elliptic curve.
+ \param[in] b
+ The B value of the elliptic curve.
+ \param[in] x
+ The X-coordinate of the base point of the elliptic curve.
+ \param[in] y
+ The Y-coordinate of the base point of the elliptic curve.
+ \param[in] order
+ The order of the elliptic curve group.
+ \param[in] cofactor
+ The co-factor of the elliptic curve.
+ \param[out] g
+ The newly constructed elliptic curve group.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ff exists
+ for the entire lifetime of the new EcGroup.
+
+ \see DeleteEcGroup
+*/
+EpidStatus NewEcGroup(FiniteField const* ff, FfElement const* a,
+ FfElement const* b, FfElement const* x,
+ FfElement const* y, BigNum const* order,
+ BigNum const* cofactor, EcGroup** g);
+
+/// Deletes a previously allocated EcGroup.
+/*!
+ Frees memory pointed to by elliptic curve group. Nulls the pointer.
+
+ \param[in] g
+ The elliptic curve group. Can be NULL.
+
+ \see NewEcGroup
+*/
+void DeleteEcGroup(EcGroup** g);
+
+/// Point on elliptic curve over finite field.
+typedef struct EcPoint EcPoint;
+
+/// Creates a new EcPoint.
+/*!
+ Allocates memory and creates a new point on elliptic curve group.
+
+ Use DeleteEcPoint() to free memory.
+
+ \param[in] g
+ Elliptic curve group.
+ \param[out] p
+ Newly constructed point on the elliptic curve group g.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that g exists
+ for the entire lifetime of the new EcPoint.
+
+ \see NewEcGroup
+ \see DeleteEcPoint
+*/
+EpidStatus NewEcPoint(EcGroup const* g, EcPoint** p);
+
+/// Deletes a previously allocated EcPoint.
+/*!
+
+ Frees memory used by a point on elliptic curve group. Nulls the pointer.
+
+ \param[in] p
+ The EcPoint. Can be NULL.
+
+ \see NewEcPoint
+*/
+void DeleteEcPoint(EcPoint** p);
+
+/// Deserializes an EcPoint from a string.
+/*!
+ \param[in] g
+ The elliptic curve group.
+ \param[in] p_str
+ The serialized value.
+ \param[in] strlen
+ The size of p_str in bytes.
+ \param[out] p
+ The target EcPoint.
+
+ \returns ::EpidStatus
+
+ \see NewEcPoint
+*/
+EpidStatus ReadEcPoint(EcGroup* g, ConstOctStr p_str, size_t strlen,
+ EcPoint* p);
+
+/// Serializes an EcPoint to a string.
+/*!
+ \param[in] g
+ The elliptic curve group.
+ \param[in] p
+ The EcPoint to be serialized.
+ \param[out] p_str
+ The target string.
+ \param[in] strlen
+ the size of p_str in bytes.
+
+ \returns ::EpidStatus
+
+ \see NewEcPoint
+*/
+EpidStatus WriteEcPoint(EcGroup* g, EcPoint const* p, OctStr p_str,
+ size_t strlen);
+
+/// Multiplies two elements in an elliptic curve group.
+/*!
+ This multiplication operation is also known as element addition for
+ elliptic curve groups.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ The first operand to be multiplied.
+ \param[in] b
+ The second operand to be multiplied.
+ \param[out] r
+ The result of multiplying a and b.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcMul(EcGroup* g, EcPoint const* a, EcPoint const* b, EcPoint* r);
+
+/// Raises a point in an elliptic curve group to a power.
+/*!
+ This exponentiation operation is also known as element multiplication
+ for elliptic curve groups.
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ The base.
+ \param[in] b
+ The power. Power must be less than the order of the elliptic curve
+ group.
+ \param[out] r
+ The result of raising a to the power b.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcExp(EcGroup* g, EcPoint const* a, BigNumStr const* b, EcPoint* r);
+
+/// Software side-channel mitigated implementation of EcExp.
+/*!
+ This exponentiation operation is also known as element multiplication
+ for elliptic curve groups.
+
+ \attention
+ The reference implementation of EcSscmExp calls EcExp directly because
+ the implementation of EcExp is already side channel mitigated. Implementers
+ providing their own versions of this function are responsible for ensuring
+ that EcSscmExp is side channel mitigated per section 8 of the
+ Intel(R) EPID 2.0 spec.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ The base.
+ \param[in] b
+ The power. Power must be less than the order of the elliptic curve
+ group.
+ \param[out] r
+ The result of raising a to the power b.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcSscmExp(EcGroup* g, EcPoint const* a, BigNumStr const* b,
+ EcPoint* r);
+
+/// Multi-exponentiates elements in elliptic curve group.
+/*!
+ Takes a group elements a[0], ... , a[m-1] in G and positive
+ integers b[0], ..., b[m-1], where m is a small positive integer.
+ Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ The bases.
+ \param[in] b
+ The powers. Power must be less than the order of the elliptic curve
+ group.
+ \param[in] m
+ Number of entries in a and b.
+ \param[out] r
+ The result of raising each a to the corresponding power b and multiplying
+ the results.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcMultiExp(EcGroup* g, EcPoint const** a, BigNumStr const** b,
+ size_t m, EcPoint* r);
+
+/// Multi-exponentiates elements in elliptic curve group.
+/*!
+Takes a group elements a[0], ... , a[m-1] in G and positive
+integers b[0], ..., b[m-1], where m is a small positive integer.
+Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).
+
+\param[in] g
+The elliptic curve group.
+\param[in] a
+The bases.
+\param[in] b
+The powers. Power must be less than the order of the elliptic curve
+group.
+\param[in] m
+Number of entries in a and b.
+\param[out] r
+The result of raising each a to the corresponding power b and multiplying
+the results.
+
+\returns ::EpidStatus
+
+\see NewEcGroup
+\see NewEcPoint
+*/
+EpidStatus EcMultiExpBn(EcGroup* g, EcPoint const** a, BigNum const** b,
+ size_t m, EcPoint* r);
+
+/// Software side-channel mitigated implementation of EcMultiExp.
+/*!
+ Takes a group elements a[0], ... , a[m-1] in G and positive
+ integers b[0], ..., b[m-1], where m is a small positive integer.
+ Outputs r (in G) = EcExp(a[0],b[0]) * ... * EcExp(a[m-1],b[m-1]).
+
+ \attention
+ The reference implementation of EcSscmMultiExp calls EcMultiExp
+ directly because the implementation of EcMultiExp is already side channel
+ mitigated. Implementers providing their own versions of this function are
+ responsible for ensuring that EcSscmMultiExp is side channel mitigated per
+ section 8 of the Intel(R) EPID 2.0 spec.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ The bases.
+ \param[in] b
+ The powers. Power must be less than the order of the elliptic curve
+ group.
+ \param[in] m
+ Number of entries in a and b.
+ \param[out] r
+ The result of raising each a to the corresponding power b and
+ multiplying the results.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcSscmMultiExp(EcGroup* g, EcPoint const** a, BigNumStr const** b,
+ size_t m, EcPoint* r);
+
+/// Generates a random element from an elliptic curve group.
+/*!
+ This function is only available for G1 and GT.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] rnd_func
+ Random number generator.
+ \param[in] rnd_func_param
+ Pass through context data for rnd_func.
+ \param[in,out] r
+ Output random elliptic curve element.
+
+ \returns ::EpidStatus
+
+ \see NewEcPoint
+ \see BitSupplier
+*/
+EpidStatus EcGetRandom(EcGroup* g, BitSupplier rnd_func, void* rnd_func_param,
+ EcPoint* r);
+
+/// Checks if a point is in an elliptic curve group.
+/*!
+ \param[in] g
+ The elliptic curve group.
+ \param[in] p_str
+ A serialized point. Must be a G1ElemStr or G2ElemStr.
+ \param[in] strlen
+ The size of p_str in bytes.
+ \param[out] in_group
+ The result of the check.
+
+ \returns ::EpidStatus
+
+ \see NewEcPoint
+*/
+EpidStatus EcInGroup(EcGroup* g, ConstOctStr p_str, size_t strlen,
+ bool* in_group);
+
+/// Hashes an arbitrary message to an Intel(R) EPID 1.1 element in an elliptic
+/// curve group.
+/*!
+\param[in] g
+The elliptic curve group.
+\param[in] msg
+The message.
+\param[in] msg_len
+The size of msg in bytes.
+\param[out] r
+The hashed value.
+
+\returns ::EpidStatus
+
+\see NewEcGroup
+\see NewEcPoint
+*/
+EpidStatus Epid11EcHash(EcGroup* g, ConstOctStr msg, size_t msg_len,
+ EcPoint* r);
+
+/// Hashes an arbitrary message to an element in an elliptic curve group.
+/*!
+ \param[in] g
+ The elliptic curve group.
+ \param[in] msg
+ The message.
+ \param[in] msg_len
+ The size of msg in bytes.
+ \param[in] hash_alg
+ The hash algorithm.
+ \param[out] r
+ The hashed value.
+ \param[out] iterations
+ The number of hash iterations needed to find a valid hash. Can be NULL.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcHash(EcGroup* g, ConstOctStr msg, size_t msg_len, HashAlg hash_alg,
+ EcPoint* r, uint32_t* iterations);
+
+/// Sets an EcPoint variable to a point on a curve.
+/*!
+ This function is only available for G1.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] x
+ The x coordinate.
+ \param[out] r
+ The point.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+ \see NewFfElement
+*/
+EpidStatus EcMakePoint(EcGroup* g, FfElement const* x, EcPoint* r);
+
+/// Computes the additive inverse of an EcPoint.
+/*!
+ This inverse operation is also known as element negation
+ for elliptic curve groups.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] p
+ The point.
+ \param[out] r
+ The inverted point.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcInverse(EcGroup* g, EcPoint const* p, EcPoint* r);
+
+/// Checks if two EcPoints are equal.
+/*!
+ \param[in] g
+ The elliptic curve group.
+ \param[in] a
+ A point to check.
+ \param[in] b
+ Another point to check.
+ \param[out] is_equal
+ The result of the check.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+ */
+EpidStatus EcIsEqual(EcGroup* g, EcPoint const* a, EcPoint const* b,
+ bool* is_equal);
+
+/// Checks if an EcPoint is the identity element.
+/*!
+
+ Takes a group element P as input. It outputs true if P is the
+ identity element of G. Otherwise, it outputs false.
+
+ \param[in] g
+ The elliptic curve group.
+ \param[in] p
+ The point to check.
+ \param[out] is_identity
+ The result of the check.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+*/
+EpidStatus EcIsIdentity(EcGroup* g, EcPoint const* p, bool* is_identity);
+
+/*!
+@}
+*/
+#endif // EPID_COMMON_MATH_ECGROUP_H_
diff --git a/epid/common/math/finitefield.h b/epid/common/math/finitefield.h
new file mode 100644
index 0000000..6a8d5a2
--- /dev/null
+++ b/epid/common/math/finitefield.h
@@ -0,0 +1,517 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Finite field interface.
+ */
+
+#ifndef EPID_COMMON_MATH_FINITEFIELD_H_
+#define EPID_COMMON_MATH_FINITEFIELD_H_
+
+#include "epid/common/bitsupplier.h"
+#include "epid/common/errors.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/// Finite field operations
+/*!
+\defgroup FiniteFieldPrimitives finitefield
+provides APIs for working with finite fields.
+Finite fields allow simple mathematical operations based on a finite set of
+discrete values. The results of these operations are also contained in the
+same set.
+
+A simple example of a finite field is all integers from zero that are less than
+a given value.
+
+The elements (::FfElement) of a finite field can be used in a variety of
+simple mathematical operations that result in elements of the same field.
+
+\ingroup EpidMath
+@{
+*/
+
+/// A finite field.
+typedef struct FiniteField FiniteField;
+
+/// An element in a finite field.
+typedef struct FfElement FfElement;
+
+/// Creates new finite field.
+/*!
+ Allocates memory and creates a new finite field GF(prime).
+
+ Use DeleteFiniteField() to free memory.
+
+ \param[in] prime
+ The order of the finite field.
+ \param[out] ff
+ The newly constructed finite field.
+
+ \returns ::EpidStatus
+
+ \see DeleteFiniteField
+*/
+EpidStatus NewFiniteField(BigNumStr const* prime, FiniteField** ff);
+
+/// Creates a new finite field using binomial extension.
+/*!
+ Allocates memory and creates a finite field using binomial extension.
+
+ Use DeleteFiniteField() to free memory.
+
+ \param[in] ground_field
+ The ground field.
+ \param[in] ground_element
+ The low-order term of the extension.
+ \param[in] degree
+ The degree of the extension.
+ \param[out] ff
+ The newly constructed finite field.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ground_field
+ exists for the entire lifetime of the new FiniteField.
+
+ \see DeleteFiniteField
+*/
+EpidStatus NewFiniteFieldViaBinomalExtension(FiniteField const* ground_field,
+ FfElement const* ground_element,
+ int degree, FiniteField** ff);
+
+/// Creates a new finite field using polynomial extension.
+/*!
+ Allocates memory and creates a finite field using polynomial extension.
+
+ Use DeleteFiniteField() to free memory.
+
+ \note Only needed for Intel(R) EPID 1.1 verification.
+
+ \param[in] ground_field
+ The ground field.
+ \param[in] irr_polynomial
+ Array with coefficients of the irreducible polynomial.
+ Number of elements must be equal to the degree of the extension.
+ \param[in] degree
+ The degree of the extension.
+ \param[out] ff
+ The newly constructed finite field.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ground_field
+ exists for the entire lifetime of the new FiniteField.
+
+ \see DeleteFiniteField
+*/
+EpidStatus NewFiniteFieldViaPolynomialExtension(FiniteField const* ground_field,
+ BigNumStr const* irr_polynomial,
+ int degree, FiniteField** ff);
+
+/// Frees a previously allocated FiniteField.
+/*!
+ Frees memory pointed to by finite field. Nulls the pointer.
+
+ \param[in] ff
+ The Finite field. Can be NULL.
+
+ \see NewFiniteField
+*/
+void DeleteFiniteField(FiniteField** ff);
+
+/// Creates a new finite field element.
+/*!
+ Allocates memory and creates a new finite field
+ element.
+
+ Use DeleteFfElement() to free memory.
+
+ \param[in] ff
+ The finite field.
+ \param[out] new_ff_elem
+The Newly constructed finite field element.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ff
+ exists for the entire lifetime of the new FfElement.
+
+ \see NewFiniteField
+ \see DeleteFfElement
+ */
+EpidStatus NewFfElement(FiniteField const* ff, FfElement** new_ff_elem);
+
+/// Frees a previously allocated FfElement.
+/*!
+ Frees memory pointed to by ff_elem. Nulls the pointer.
+
+ \param[in] ff_elem
+ The finite field element. Can be NULL.
+
+ \see NewFfElement
+*/
+void DeleteFfElement(FfElement** ff_elem);
+
+/// Deserializes a FfElement from a string.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] ff_elem_str
+ The serialized value.
+ \param[in] strlen
+ The size of ff_elem_str in bytes.
+ \param[out] ff_elem
+ The target FfElement.
+
+ \returns ::EpidStatus
+
+ \see NewFfElement
+ \see WriteFfElement
+*/
+EpidStatus ReadFfElement(FiniteField* ff, ConstOctStr ff_elem_str,
+ size_t strlen, FfElement* ff_elem);
+
+/// Initializes an existing FfElement from a BigNum.
+/*!
+ \param[in] ff
+ The finite field. Must be a Prime Field.
+ \param[in] bn
+ The value to read.
+ \param[out] ff_elem
+ The target FfElement.
+
+ \returns ::EpidStatus
+
+ \see NewFfElement
+ \see WriteFfElement
+*/
+EpidStatus InitFfElementFromBn(FiniteField* ff, BigNum* bn, FfElement* ff_elem);
+
+/// Serializes a finite field element to a string.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] ff_elem
+ The FfElement to be serialized.
+ \param[out] ff_elem_str
+ The target string.
+ \param[in] strlen
+ The size of ff_elem_str in bytes.
+
+ \returns ::EpidStatus
+
+ \see NewFfElement
+ \see FpElemStr
+ \see FqElemStr
+ \see GtElemStr
+*/
+EpidStatus WriteFfElement(FiniteField* ff, FfElement const* ff_elem,
+ OctStr ff_elem_str, size_t strlen);
+
+/// Calculates the additive inverse of a finite field element.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] a
+ The element.
+ \param[out] r
+ The inverted element.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfNeg(FiniteField* ff, FfElement const* a, FfElement* r);
+
+/// Calculates the multiplicative inverse of a finite field element.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] a
+ The element.
+ \param[out] r
+ The inverted element.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfInv(FiniteField* ff, FfElement const* a, FfElement* r);
+
+/// Adds two finite field elements.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[out] a
+ The first operand to be added.
+ \param[out] b
+ The second operand to be added.
+ \param[out] r
+ The result of adding a and b.
+
+ \returns ::EpidStatus
+ */
+EpidStatus FfAdd(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r);
+
+/// Subtracts two finite field elements.
+/*!
+
+\note Only needed for Intel(R) EPID 1.1 verification.
+
+\param[in] ff
+The finite field.
+\param[out] a
+The first operand to use in subtraction.
+\param[out] b
+The second operand to use in subtraction.
+\param[out] r
+The result of subtracting a and b.
+
+\returns ::EpidStatus
+*/
+EpidStatus FfSub(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r);
+
+/// Multiplies two finite field elements.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[out] a
+ The first operand to be multplied.
+ \param[out] b
+ The second operand to be multiplied. If ff is an extension field of a
+ field F then this parameter may be an element of either ff or F.
+ \param[out] r
+ The result of multiplying a and b.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfMul(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r);
+
+/// Checks if given finite field element is the additive identity (zero).
+/*!
+ \param[in] ff
+ The finite field.
+ \param[out] a
+ The element.
+ \param[out] is_zero
+ The result of the check.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfIsZero(FiniteField* ff, FfElement const* a, bool* is_zero);
+
+/// Raises an element of a finite field to a power.
+/*!
+ \param[in] ff
+ The finite field in which to perform the operation
+ \param[in] a
+ The base.
+ \param[in] b
+ The power.
+ \param[out] r
+ The result of raising a to the power b.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfExp(FiniteField* ff, FfElement const* a, BigNum const* b,
+ FfElement* r);
+
+/// Multi-exponentiates finite field elements.
+/*!
+ Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m > 1
+
+ \param[in] ff
+ The finite field in which to perform the operation
+ \param[in] a
+ The bases.
+ \param[in] b
+ The powers.
+ \param[in] m
+ Number of entries in a and b.
+ \param[out] r
+ The result of raising each a to the corresponding power b and multiplying
+ the results.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+*/
+EpidStatus FfMultiExp(FiniteField* ff, FfElement const** a, BigNumStr const** b,
+ size_t m, FfElement* r);
+
+/// Multi-exponentiates finite field elements.
+/*!
+ Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m > 1
+
+ \param[in] ff
+ The finite field in which to perform the operation
+ \param[in] a
+ The bases.
+ \param[in] b
+ The powers.
+ \param[in] m
+ Number of entries in a and b.
+ \param[out] r
+ The result of raising each a to the corresponding power b and multiplying
+ the results.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+*/
+EpidStatus FfMultiExpBn(FiniteField* ff, FfElement const** a, BigNum const** b,
+ size_t m, FfElement* r);
+
+/// Software side-channel mitigated implementation of FfMultiExp.
+/*!
+ Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m > 1
+
+ \attention
+ The reference implementation of FfSscmMultiExp calls FfMultiExp
+ directly because the implementation of FfMultiExp is already side channel
+ mitigated. Implementers providing their own versions of this function are
+ responsible for ensuring that FfSscmMultiExp is side channel mitigated per
+ section 8 of the Intel(R) EPID 2.0 spec.
+
+ \param[in] ff
+ The finite field in which to perform the operation.
+ \param[in] a
+ The bases.
+ \param[in] b
+ The powers.
+ \param[in] m
+ Number of entries in a and b.
+ \param[out] r
+ The result of raising each a to the corresponding power b and multiplying
+ the results.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+*/
+
+EpidStatus FfSscmMultiExp(FiniteField* ff, FfElement const** a,
+ BigNumStr const** b, size_t m, FfElement* r);
+
+/// Checks if two finite field elements are equal.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] a
+ An element to check.
+ \param[in] b
+ Another element to check.
+ \param[out] is_equal
+ The result of the check.
+
+ \returns ::EpidStatus
+
+ \see NewEcGroup
+ \see NewEcPoint
+ */
+EpidStatus FfIsEqual(FiniteField* ff, FfElement const* a, FfElement const* b,
+ bool* is_equal);
+
+/// Hashes an arbitrary message to an element in a finite field.
+/*!
+ \param[in] ff
+ The finite field.
+ \param[in] msg
+ The message.
+ \param[in] msg_len
+ The size of msg in bytes.
+ \param[in] hash_alg
+ The hash algorithm.
+ \param[out] r
+ The hashed value.
+
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+ */
+EpidStatus FfHash(FiniteField* ff, ConstOctStr msg, size_t msg_len,
+ HashAlg hash_alg, FfElement* r);
+
+/// Generate random finite field element.
+/*!
+ \param[in] ff
+ The finite field associated with the random finite field element.
+ \param[in] low_bound
+ Lower bound of the random finite field to be generated.
+ \param[in] rnd_func
+ Random number generator.
+ \param[in] rnd_param
+ Pass through context data for rnd_func.
+ \param[in,out] r
+ The random finite field element.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidRandMaxIterErr the function should be called again with
+ different random data.
+
+ \see NewFfElement
+ \see BitSupplier
+ */
+EpidStatus FfGetRandom(FiniteField* ff, BigNumStr const* low_bound,
+ BitSupplier rnd_func, void* rnd_param, FfElement* r);
+
+/// Finds a square root of a finite field element.
+/*!
+ This function calculates the square root by the method of false position.
+
+ \param[in] ff
+ The finite field in which to perform the operation
+ \param[in] a
+ The bases.
+ \param[out] r
+ The result of raising each a to the corresponding power b and multiplying
+ the results.
+
+ \retval kEpidMathQuadraticNonResidueError No square root could be found.
+ \returns ::EpidStatus
+
+ \see NewFiniteField
+ \see NewFfElement
+*/
+EpidStatus FfSqrt(FiniteField* ff, FfElement const* a, FfElement* r);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_MATH_FINITEFIELD_H_
diff --git a/epid/common/math/hash.h b/epid/common/math/hash.h
new file mode 100644
index 0000000..014f6a5
--- /dev/null
+++ b/epid/common/math/hash.h
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Hash primitives.
+ */
+
+#ifndef EPID_COMMON_MATH_HASH_H_
+#define EPID_COMMON_MATH_HASH_H_
+
+#include <limits.h> // for CHAR_BIT
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/errors.h"
+
+/// Hash primitives
+/*!
+ \defgroup HashPrimitives hash
+ Provides APIs for computing digests of messages.
+
+ \ingroup EpidMath
+ @{
+*/
+
+#pragma pack(1)
+/// SHA256 digest
+typedef struct Sha256Digest {
+ unsigned char data[256 / CHAR_BIT]; ///< 256 bit data
+} Sha256Digest;
+#pragma pack()
+
+/// Computes SHA256 digest of a message.
+/*!
+ \param[in] msg
+ Message to compute digest for.
+ \param[in] len
+ The size of msg in bytes.
+ \param[out] digest
+ The resulting message digest.
+
+ \returns ::EpidStatus
+*/
+EpidStatus Sha256MessageDigest(void const* msg, size_t len,
+ Sha256Digest* digest);
+
+/*!
+ @}
+*/
+#endif // EPID_COMMON_MATH_HASH_H_
diff --git a/epid/common/math/pairing.h b/epid/common/math/pairing.h
new file mode 100644
index 0000000..ff41a76
--- /dev/null
+++ b/epid/common/math/pairing.h
@@ -0,0 +1,105 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pairing interface.
+ */
+
+#ifndef EPID_COMMON_MATH_PAIRING_H_
+#define EPID_COMMON_MATH_PAIRING_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/types.h"
+
+/// Pairing operations
+/*!
+ \defgroup PairingPrimitives pairing
+ Provides APIs for defining and using a pairing relationship between two
+ elliptic curve groups.
+
+ \ingroup EpidMath
+ @{
+*/
+
+/// A pairing
+typedef struct PairingState PairingState;
+
+/// Constructs a new pairing state.
+/*!
+ Allocates memory and creates a new pairing state for Optimal Ate Pairing.
+
+ Use DeletePairingState() to free memory.
+
+ \param[in] ga
+ The EcGroup from which the first parameter of the pairing is taken.
+ \param[in] gb
+ The EcGroup from which the second parameter of the pairing is taken.
+ \param[in] ff
+ The result finite field. Must be a Fq12 field.
+ \param[in] t
+ A positive integer such that 6(t^2) == q - p, where p and q are parameters
+ of G1.
+ \param[in] neg
+ Select the alternate "negate" processing path for Optimal Ate Pairing.
+ \param[out] ps
+ Newly constructed pairing state.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ga, gb, and
+ ff exist for the entire lifetime of the new PairingState.
+
+ \see DeletePairingState
+*/
+EpidStatus NewPairingState(EcGroup const* ga, EcGroup const* gb,
+ FiniteField* ff, BigNumStr const* t, bool neg,
+ PairingState** ps);
+
+/// Frees a previously allocated by PairingState.
+/*!
+ Frees memory pointed to by pairing state. Nulls the pointer.
+
+ \param[in] ps
+ The pairing state. Can be NULL.
+
+ \see NewPairingState
+*/
+void DeletePairingState(PairingState** ps);
+
+/// Computes an Optimal Ate Pairing for two parameters.
+/*!
+ \param[in] ps
+ The pairing state.
+ \param[in] a
+ The first value to pair. Must be in ga used to create ps.
+ \param[in] b
+ The second value to pair. Must be in gb used to create ps
+ \param[out] d
+ The result of the pairing. Will be in ff used to create the pairing state.
+
+ \returns ::EpidStatus
+*/
+EpidStatus Pairing(PairingState* ps, EcPoint const* a, EcPoint const* b,
+ FfElement* d);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_MATH_PAIRING_H_
diff --git a/epid/common/math/printutils.h b/epid/common/math/printutils.h
new file mode 100644
index 0000000..9c2efd4
--- /dev/null
+++ b/epid/common/math/printutils.h
@@ -0,0 +1,288 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Print helper interface.
+ */
+#ifndef EPID_COMMON_MATH_PRINTUTILS_H_
+#define EPID_COMMON_MATH_PRINTUTILS_H_
+
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/types.h"
+
+/// Debug print routines
+/*!
+ \defgroup EpidPrint print_utils
+ Defines an API to print formatted versions of the types used for
+ mathematical operations.
+
+ If the symbol EPID_ENABLE_DEBUG_PRINT is not defined, all calls to the
+ functions in this module are ignored.
+
+ \ingroup EpidCommon
+ @{
+*/
+
+/// Print format
+typedef enum {
+ kPrintUtilUnannotated = 0, //!< Unannotated output format
+ kPrintUtilAnnotated = 1, //!< Annotated output format
+ kPrintUtilFormatCount = 2, //!< Count of print formats.
+} PrintUtilFormat;
+
+#if !defined(EPID_ENABLE_DEBUG_PRINT)
+
+/// Do not print bignum if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintBigNum(...)
+
+/// Do not print ff element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFfElement(...)
+
+/// Do not print ec point if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintEcPoint(...)
+
+/// Do not print serialized bignum if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintBigNumStr(...)
+
+/// Do not print Fp element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFpElemStr(...)
+
+/// Do not print Fq element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFqElemStr(...)
+
+/// Do not print Fq2 element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFq2ElemStr(...)
+
+/// Do not print Fq6 element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFq6ElemStr(...)
+
+/// Do not print Fq12 element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintFq12ElemStr(...)
+
+/// Do not print G1 element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintG1ElemStr(...)
+
+/// Do not print G2 element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintG2ElemStr(...)
+
+/// Do not print Gt element if EPID_ENABLE_DEBUG_PRINT is undefined
+#define PrintGtElemStr(...)
+
+#else
+
+/// Prints BigNum
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] big_num
+ BigNum to be printed
+ \param[in] var_name
+ Result variable name
+
+*/
+void PrintBigNum(BigNum const* big_num, char const* var_name);
+
+/// Prints finite field element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] ff
+ Finite field that element to be printed belongs to
+ \param[in] ff_element
+ Finite field element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintFfElement(FiniteField const* ff, FfElement const* ff_element,
+ char const* var_name, PrintUtilFormat format);
+
+/// Prints elliptic curve group element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] g
+ Elliptic curve group that element to be printed belongs to
+ \param[in] ec_point
+ Elliptic curve group element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintEcPoint(EcGroup const* g, EcPoint const* ec_point,
+ char const* var_name, PrintUtilFormat format);
+
+/// Prints serialized BigNum
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] big_num_str
+ Serialized BigNum to be printed
+ \param[in] var_name
+ Result variable name
+
+*/
+void PrintBigNumStr(BigNumStr const* big_num_str, char const* var_name);
+
+/// Prints serialized Fp element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] fp_elem_str
+ Serialized Fp element to be printed
+ \param[in] var_name
+ Result variable name
+
+*/
+void PrintFpElemStr(FpElemStr const* fp_elem_str, char const* var_name);
+
+/// Prints serialized Fq element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] fq_elem_str
+ Serialized Fq element to be printed
+ \param[in] var_name
+ Result variable name
+
+*/
+void PrintFqElemStr(FqElemStr const* fq_elem_str, char const* var_name);
+
+/// Prints serialized Fq2 element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] fq2_elem_str
+ Serialized Fq2 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintFq2ElemStr(Fq2ElemStr const* fq2_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+/// Prints serialized Fq6 element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] fq6_elem_str
+ Serialized Fq6 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintFq6ElemStr(Fq6ElemStr const* fq6_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+/// Prints serialized Fq12 element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] fq12_elem_str
+ Serialized Intel(R) EPID Fq12 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintFq12ElemStr(Fq12ElemStr const* fq12_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+/// Prints serialized G1 element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] g1_elem_str
+ Serialized G1 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintG1ElemStr(G1ElemStr const* g1_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+/// Prints serialized G2 element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] g2_elem_str
+ Serialized G2 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintG2ElemStr(G2ElemStr const* g2_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+/// Prints serialized Gt element
+/*!
+ Macro EPID_ENABLE_DEBUG_PRINT needs to be defined
+ in order to activate this routine; otherwise,
+ it prints nothing.
+
+ \param[in] gt_elem_str
+ Serialized G2 element to be printed
+ \param[in] var_name
+ Result variable name
+ \param[in] format
+ Output format
+
+*/
+void PrintGtElemStr(GtElemStr const* gt_elem_str, char const* var_name,
+ PrintUtilFormat format);
+
+#endif // !defined( EPID_ENABLE_DEBUG_PRINT )
+/*! @} */
+
+#endif // EPID_COMMON_MATH_PRINTUTILS_H_
diff --git a/epid/common/math/src/bignum-internal.h b/epid/common/math/src/bignum-internal.h
new file mode 100644
index 0000000..fcddee9
--- /dev/null
+++ b/epid/common/math/src/bignum-internal.h
@@ -0,0 +1,74 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Big number private interface.
+ */
+
+#ifndef EPID_COMMON_MATH_SRC_BIGNUM_INTERNAL_H_
+#define EPID_COMMON_MATH_SRC_BIGNUM_INTERNAL_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+#include "ext/ipp/include/ippcp.h"
+
+typedef void* BNU;
+typedef void const* ConstBNU;
+typedef Ipp32u* IppBNU;
+typedef Ipp32u const* ConstIppBNU;
+typedef Ipp8u* IppOctStr;
+typedef Ipp8u const* ConstIppOctStr;
+
+/// Big Number
+struct BigNum {
+ /// Internal implementation of bignum
+ IppsBigNumState* ipp_bn;
+};
+
+/// convert octet string into "big number unsigned" representation
+/*!
+
+This is an internal function, used to convert an octet string (uint8_t
+array) into a big number unsigned representation (uint32_t array).
+For example, octet string {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+0x08} is converted to {0x05060708, 0x01020304}
+
+\param[out] bnu_ptr
+Output big number unsigned array
+\param[in] octstr_ptr
+Input octal string
+\param[in] octstr_len
+Length of octet string, should be multiple of 4
+
+\returns length of big number unsigned in uint32_t chunks
+\returns -1 in case of any error
+*/
+int OctStr2Bnu(BNU bnu_ptr, ConstOctStr octstr_ptr, int octstr_len);
+
+/// Get octet string size in bits
+/*!
+\param[in] octstr_ptr
+Input octet string.
+\param[in] octstr_len
+Length of octet string in bytes.
+
+\returns bit size of big number value from octet string
+*/
+size_t OctStrBitSize(ConstOctStr octstr_ptr, size_t octstr_len);
+
+#endif // EPID_COMMON_MATH_SRC_BIGNUM_INTERNAL_H_
diff --git a/epid/common/math/src/bignum.c b/epid/common/math/src/bignum.c
new file mode 100644
index 0000000..4ea62d7
--- /dev/null
+++ b/epid/common/math/src/bignum.c
@@ -0,0 +1,398 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Big number implementation.
+ */
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+EpidStatus NewBigNum(size_t data_size_bytes, BigNum** bignum) {
+ EpidStatus result = kEpidErr;
+ IppsBigNumState* ipp_bn_ctx = NULL;
+ BigNum* bn = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ unsigned int ctxsize;
+ unsigned int wordsize =
+ (unsigned int)((data_size_bytes + sizeof(Ipp32u) - 1) / sizeof(Ipp32u));
+
+ if (!bignum) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // Determine the memory requirement for bignum context
+ sts = ippsBigNumGetSize(wordsize, (int*)&ctxsize);
+ if (ippStsNoErr != sts) {
+ if (ippStsLengthErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ // Allocate space for ipp bignum context
+ ipp_bn_ctx = (IppsBigNumState*)SAFE_ALLOC(ctxsize);
+ if (!ipp_bn_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Initialize ipp bignum context
+ sts = ippsBigNumInit(wordsize, ipp_bn_ctx);
+ if (ippStsNoErr != sts) {
+ if (ippStsLengthErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ bn = (BigNum*)SAFE_ALLOC(sizeof(BigNum));
+ if (!bn) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ bn->ipp_bn = ipp_bn_ctx;
+
+ *bignum = bn;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ SAFE_FREE(ipp_bn_ctx);
+ SAFE_FREE(bn);
+ }
+ return result;
+}
+
+void DeleteBigNum(BigNum** bignum) {
+ if (bignum) {
+ if (*bignum) {
+ SAFE_FREE((*bignum)->ipp_bn);
+ }
+ SAFE_FREE(*bignum);
+ }
+}
+
+EpidStatus ReadBigNum(ConstOctStr bn_str, size_t strlen, BigNum* bn) {
+ IppStatus sts;
+ size_t i;
+ bool is_zero = true;
+ Ipp8u const* byte_str = (Ipp8u const*)bn_str;
+ int ipp_strlen = (int)strlen;
+
+ if (!bn || !bn_str) return kEpidBadArgErr;
+
+ if (!bn->ipp_bn) return kEpidBadArgErr;
+
+ if (INT_MAX < strlen || strlen <= 0) return kEpidBadArgErr;
+
+ /*
+ Some versions of ippsSetOctString_BN have bug:
+ When called for octet string with all bits set to zero the resulted BigNumber
+ state initialize incorrectly which leads to unpredictable behaviour
+ if used.
+
+ Workaround:
+ Test the input string before ippsSetOctStringSet_BN() call.
+ If length of the string is zero or it does not contain any significant
+ bits, then set BN to zero. Keep in mind that ippsBigNumInit() set BN
+ value to zero.
+ */
+ for (i = 0; i < strlen; ++i)
+ if (0 != byte_str[i]) {
+ is_zero = false;
+ break;
+ }
+ if (is_zero) {
+ Ipp32u zero32 = 0;
+ sts = ippsSet_BN(IppsBigNumPOS, 1, &zero32, bn->ipp_bn);
+ } else {
+ sts = ippsSetOctString_BN(bn_str, ipp_strlen, bn->ipp_bn);
+ }
+ if (sts != ippStsNoErr) {
+ if (ippStsContextMatchErr == sts || ippStsSizeErr == sts ||
+ ippStsLengthErr == sts || ippStsOutOfRangeErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus WriteBigNum(BigNum const* bn, size_t strlen, OctStr bn_str) {
+ IppStatus sts;
+ int ipp_strlen = (int)strlen;
+ if (!bn || !bn_str) return kEpidBadArgErr;
+
+ if (!bn->ipp_bn) return kEpidBadArgErr;
+
+ sts = ippsGetOctString_BN((OctStr)bn_str, ipp_strlen, bn->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+
+ return kEpidNoErr;
+}
+
+/// convert octet string into "big number unsigned" representation
+int OctStr2Bnu(BNU bnu_ptr, ConstOctStr octstr_ptr, int octstr_len) {
+ int bnusize = 0;
+ ConstIppOctStr byte_str = (ConstIppOctStr)octstr_ptr;
+ IppBNU bnu = (IppBNU)bnu_ptr;
+ if (!bnu_ptr || !octstr_ptr) {
+ return -1;
+ }
+ if (octstr_len < 4 || octstr_len % 4 != 0) return -1;
+
+ *bnu = 0;
+ /* start from the end of string */
+ for (; octstr_len >= 4; bnusize++, octstr_len -= 4) {
+ /* pack 4 bytes into single Ipp32u value*/
+ *bnu++ = (byte_str[octstr_len - 4] << (8 * 3)) +
+ (byte_str[octstr_len - 3] << (8 * 2)) +
+ (byte_str[octstr_len - 2] << (8 * 1)) + byte_str[octstr_len - 1];
+ }
+ return bnusize ? bnusize : -1;
+}
+
+/// Get octet string size in bits
+size_t OctStrBitSize(ConstOctStr octstr_ptr, size_t octstr_len) {
+ uint8_t byte;
+ size_t bitsize = 0;
+ ConstIppOctStr octstr = (ConstIppOctStr)octstr_ptr;
+
+ // find highest non zero byte
+ size_t i = 0;
+ while (i < octstr_len && !octstr[i]) i++;
+ if (i == octstr_len) return 0;
+ byte = octstr[i];
+
+ // refine bit size
+ if (0 == byte) return 0;
+ bitsize = (octstr_len - i) << 3;
+ if (0 == (byte & 0xF0)) {
+ bitsize -= 4;
+ byte <<= 4;
+ }
+ if (0 == (byte & 0xC0)) {
+ bitsize -= 2;
+ byte <<= 2;
+ }
+ if (0 == (byte & 0x80)) {
+ bitsize--;
+ }
+
+ return bitsize;
+}
+
+EpidStatus BigNumAdd(BigNum const* a, BigNum const* b, BigNum* r) {
+ IppStatus sts;
+
+ if (!r || !a || !b) return kEpidBadArgErr;
+
+ if (!r->ipp_bn || !a->ipp_bn || !b->ipp_bn) return kEpidBadArgErr;
+
+ sts = ippsAdd_BN(a->ipp_bn, b->ipp_bn, r->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumSub(BigNum const* a, BigNum const* b, BigNum* r) {
+ IppStatus sts;
+ Ipp32u sign = IS_ZERO;
+ if (!r || !a || !b) return kEpidBadArgErr;
+
+ if (!r->ipp_bn || !a->ipp_bn || !b->ipp_bn) return kEpidBadArgErr;
+
+ sts = ippsSub_BN(a->ipp_bn, b->ipp_bn, r->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ sts = ippsCmpZero_BN(r->ipp_bn, &sign);
+ if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ if (sign == LESS_THAN_ZERO) {
+ return kEpidUnderflowErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumMul(BigNum const* a, BigNum const* b, BigNum* r) {
+ IppStatus sts;
+
+ if (!r || !a || !b) return kEpidBadArgErr;
+
+ if (!r->ipp_bn || !a->ipp_bn || !b->ipp_bn) return kEpidBadArgErr;
+
+ sts = ippsMul_BN(a->ipp_bn, b->ipp_bn, r->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts || ippStsOutOfRangeErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumDiv(BigNum const* a, BigNum const* b, BigNum* q, BigNum* r) {
+ IppStatus sts;
+
+ if (!a || !b || !q || !r) return kEpidBadArgErr;
+
+ if (!a->ipp_bn || !b->ipp_bn || !q->ipp_bn || !r->ipp_bn)
+ return kEpidBadArgErr;
+
+ sts = ippsDiv_BN(a->ipp_bn, b->ipp_bn, q->ipp_bn, r->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts || ippStsOutOfRangeErr == sts ||
+ ippStsDivByZeroErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumMod(BigNum const* a, BigNum const* b, BigNum* r) {
+ IppStatus sts;
+
+ if (!r || !a || !b) return kEpidBadArgErr;
+
+ if (!r->ipp_bn || !a->ipp_bn || !b->ipp_bn) return kEpidBadArgErr;
+
+ sts = ippsMod_BN(a->ipp_bn, b->ipp_bn, r->ipp_bn);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsLengthErr == sts || ippStsOutOfRangeErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumIsEven(BigNum const* a, bool* is_even) {
+ IppStatus sts = ippStsNoErr;
+ IppsBigNumSGN sgn;
+ int bit_size;
+ IppBNU data;
+ // Check required parameters
+ if (!a || !is_even) {
+ return kEpidBadArgErr;
+ }
+ if (!a->ipp_bn) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsRef_BN(&sgn, &bit_size, &data, a->ipp_bn);
+ if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ *is_even = !(data[0] & 1);
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumIsZero(BigNum const* a, bool* is_zero) {
+ IppStatus sts = ippStsNoErr;
+ Ipp32u sign = 0;
+ // Check required parameters
+ if (!a || !is_zero) {
+ return kEpidBadArgErr;
+ }
+ if (!a->ipp_bn) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsCmpZero_BN(a->ipp_bn, &sign);
+ if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ *is_zero = (IS_ZERO == sign);
+ return kEpidNoErr;
+}
+
+EpidStatus BigNumPow2N(unsigned int n, BigNum* r) {
+ EpidStatus result = kEpidErr;
+ Ipp8u two_str = 2;
+ Ipp8u one_str = 1;
+ BigNum* two = NULL;
+ do {
+ if (n == 0) {
+ result = ReadBigNum(&one_str, sizeof(one_str), r);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } else {
+ result = NewBigNum(sizeof(BigNumStr), &two);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&two_str, sizeof(two_str), two);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&two_str, sizeof(two_str), r);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ while (n > 1) {
+ result = BigNumMul(r, two, r);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ n -= 1;
+ }
+ if (kEpidNoErr != result) {
+ break;
+ }
+ }
+ result = kEpidNoErr;
+ } while (0);
+ DeleteBigNum(&two);
+ return result;
+}
diff --git a/epid/common/math/src/ecdsa_sign.c b/epid/common/math/src/ecdsa_sign.c
new file mode 100644
index 0000000..2225ea5
--- /dev/null
+++ b/epid/common/math/src/ecdsa_sign.c
@@ -0,0 +1,205 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcdsaSignBuffer implementation.
+ */
+
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecdsa.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// The number of attempts to generate ephemeral key pair
+#define EPHKEYGEN_WATCHDOG (10)
+
+EpidStatus EcdsaSignBuffer(ConstOctStr buf, size_t buf_len,
+ EcdsaPrivateKey const* privkey, BitSupplier rnd_func,
+ void* rnd_param, EcdsaSignature* sig) {
+ EpidStatus result = kEpidMathErr;
+
+ IppsECCPState* ec_ctx = NULL;
+ BigNum* bn_ec_order = NULL;
+
+ BigNum* bn_hash = NULL;
+
+ BigNum* bn_reg_private = NULL;
+ BigNum* bn_eph_private = NULL;
+ IppsECCPPointState* ecp_eph_public = NULL;
+
+ BigNum* bn_sig_x = NULL;
+ BigNum* bn_sig_y = NULL;
+
+ do {
+ EpidStatus epid_status = kEpidNoErr;
+ IppStatus sts = ippStsNoErr;
+ int ctxsize = 0;
+ // order of EC secp256r1
+ const uint8_t secp256r1_r[32] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17,
+ 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51};
+ Ipp8u hash[IPP_SHA256_DIGEST_BITSIZE / 8] = {0};
+ unsigned int gen_loop_count = EPHKEYGEN_WATCHDOG;
+ Ipp32u cmp0 = IS_ZERO;
+ Ipp32u cmp_order = IS_ZERO;
+
+ if ((0 != buf_len && !buf) || !privkey || !rnd_func || !sig) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (buf_len > INT_MAX) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Define standard elliptic curve secp256r1
+ sts = ippsECCPGetSizeStd256r1(&ctxsize);
+ if (ippStsNoErr != sts) break;
+ ec_ctx = (IppsECCPState*)SAFE_ALLOC(ctxsize);
+ if (!ec_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ sts = ippsECCPInitStd256r1(ec_ctx);
+ if (ippStsNoErr != sts) break;
+ sts = ippsECCPSetStd256r1(ec_ctx);
+ if (ippStsNoErr != sts) break;
+
+ // Create big number for order of elliptic curve secp256r1
+ epid_status = NewBigNum(sizeof(secp256r1_r), &bn_ec_order);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+ epid_status = ReadBigNum(secp256r1_r, sizeof(secp256r1_r), bn_ec_order);
+ if (kEpidNoErr != epid_status) break;
+
+ // Calculate hash for input message
+ sts = ippsSHA256MessageDigest(buf, (int)buf_len, hash);
+ if (ippStsNoErr != sts) break;
+
+ // Create big number for hash
+ epid_status = NewBigNum(sizeof(hash), &bn_hash);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+ epid_status = ReadBigNum(hash, sizeof(hash), bn_hash);
+ if (kEpidNoErr != epid_status) break;
+ sts = ippsMod_BN(bn_hash->ipp_bn, bn_ec_order->ipp_bn, bn_hash->ipp_bn);
+ if (ippStsNoErr != sts) break;
+
+ // Create big number for regular private key
+ epid_status = NewBigNum(sizeof(*privkey), &bn_reg_private);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+ epid_status = ReadBigNum(privkey, sizeof(*privkey), bn_reg_private);
+ if (kEpidNoErr != epid_status) break;
+
+ // Validate private key is in range [1, bn_ec_order-1]
+ sts = ippsCmpZero_BN(bn_reg_private->ipp_bn, &cmp0);
+ if (ippStsNoErr != sts) break;
+ sts = ippsCmp_BN(bn_reg_private->ipp_bn, bn_ec_order->ipp_bn, &cmp_order);
+ if (ippStsNoErr != sts) break;
+ if (IS_ZERO == cmp0 || LESS_THAN_ZERO != cmp_order) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Create big number for ephemeral private key
+ epid_status = NewBigNum(sizeof(secp256r1_r), &bn_eph_private);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+
+ // Create EC point for ephemeral public key
+ sts = ippsECCPPointGetSize(256, &ctxsize);
+ if (ippStsNoErr != sts) break;
+ ecp_eph_public = (IppsECCPPointState*)SAFE_ALLOC(ctxsize);
+ if (!ecp_eph_public) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ sts = ippsECCPPointInit(256, ecp_eph_public);
+ if (ippStsNoErr != sts) break;
+
+ // Create big numbers for signature
+ epid_status = NewBigNum(sizeof(secp256r1_r), &bn_sig_x);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+ epid_status = NewBigNum(sizeof(secp256r1_r), &bn_sig_y);
+ if (kEpidMemAllocErr == epid_status) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (kEpidNoErr != epid_status) break;
+
+ do {
+ // Generate ephemeral key pair
+ sts = ippsECCPGenKeyPair(bn_eph_private->ipp_bn, ecp_eph_public, ec_ctx,
+ (IppBitSupplier)rnd_func, rnd_param);
+ if (ippStsNoErr != sts) break;
+
+ // Set ephemeral key pair
+ sts = ippsECCPSetKeyPair(bn_eph_private->ipp_bn, ecp_eph_public, ippFalse,
+ ec_ctx);
+ if (ippStsNoErr != sts) break;
+
+ // Compute signature
+ sts = ippsECCPSignDSA(bn_hash->ipp_bn, bn_reg_private->ipp_bn,
+ bn_sig_x->ipp_bn, bn_sig_y->ipp_bn, ec_ctx);
+ if (ippStsEphemeralKeyErr != sts) break;
+ } while (--gen_loop_count);
+ if (ippStsEphemeralKeyErr == sts) {
+ result = kEpidRandMaxIterErr;
+ break;
+ }
+ if (ippStsNoErr != sts) break;
+
+ sts = ippsGetOctString_BN(sig->x.data, sizeof(sig->x), bn_sig_x->ipp_bn);
+ if (ippStsNoErr != sts) break;
+ sts = ippsGetOctString_BN(sig->y.data, sizeof(sig->y), bn_sig_y->ipp_bn);
+ if (ippStsNoErr != sts) break;
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&bn_ec_order);
+ DeleteBigNum(&bn_hash);
+ DeleteBigNum(&bn_reg_private);
+ DeleteBigNum(&bn_eph_private);
+ DeleteBigNum(&bn_sig_x);
+ DeleteBigNum(&bn_sig_y);
+
+ SAFE_FREE(ec_ctx);
+ SAFE_FREE(ecp_eph_public);
+
+ return result;
+}
diff --git a/epid/common/math/src/ecdsa_verify.c b/epid/common/math/src/ecdsa_verify.c
new file mode 100644
index 0000000..3bebfb9
--- /dev/null
+++ b/epid/common/math/src/ecdsa_verify.c
@@ -0,0 +1,362 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcdsaVerifyBuffer implementation.
+ */
+
+#include "epid/common/math/ecdsa.h"
+
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Handle Ipp Errors with Break
+#define BREAK_ON_IPP_ERROR(sts, ret) \
+ { \
+ IppStatus temp_sts = (sts); \
+ if (ippStsNoErr != temp_sts) { \
+ (ret) = kEpidMathErr; \
+ break; \
+ } \
+ }
+
+static EpidStatus NewSecp256r1Curve(IppsECCPState** ec);
+
+static void DeleteSecp256r1Curve(IppsECCPState** ec);
+
+static EpidStatus NewCurvePoint(IppsECCPState const* ec,
+ IppsECCPPointState** p);
+
+static EpidStatus ReadCurvePoint(IppsECCPState* ec,
+ EcdsaPublicKey const* pubkey,
+ IppsECCPPointState* p);
+
+static EpidStatus CalcHashBn(ConstOctStr buf, size_t buf_len,
+ BigNum* bn_digest);
+
+static void DeleteCurvePoint(IppsECCPPointState** p);
+
+static EpidStatus ValidateSignature(BigNum const* bn_sig_x,
+ BigNum const* bn_sig_y);
+
+EpidStatus EcdsaVerifyBuffer(ConstOctStr buf, size_t buf_len,
+ EcdsaPublicKey const* pubkey,
+ EcdsaSignature const* sig) {
+ EpidStatus result = kEpidErr;
+ IppsECCPState* ec_state = NULL;
+ IppsECCPPointState* ecp_pubkey = NULL;
+ BigNum* bn_sig_x = NULL;
+ BigNum* bn_sig_y = NULL;
+ BigNum* bn_digest = NULL;
+
+ if (!pubkey || !sig || (!buf && (0 != buf_len))) return kEpidBadArgErr;
+ if (INT_MAX < buf_len) return kEpidBadArgErr;
+
+ do {
+ EpidStatus epid_status = kEpidNoErr;
+ IppStatus ipp_status = ippStsNoErr;
+ IppECResult ec_result = ippECValid;
+
+ epid_status = NewBigNum(sizeof(sig->x), &bn_sig_x);
+ if (kEpidNoErr != epid_status) break;
+
+ epid_status = ReadBigNum(&sig->x, sizeof(sig->x), bn_sig_x);
+ if (kEpidNoErr != epid_status) break;
+
+ epid_status = NewBigNum(sizeof(sig->y), &bn_sig_y);
+ if (kEpidNoErr != epid_status) break;
+
+ epid_status = ReadBigNum(&sig->y, sizeof(sig->y), bn_sig_y);
+ if (kEpidNoErr != epid_status) break;
+
+ // check for invalid signature
+ epid_status = ValidateSignature(bn_sig_x, bn_sig_y);
+ if (kEpidSigValid != epid_status) {
+ if (kEpidSigInvalid == epid_status) {
+ result = kEpidBadArgErr;
+ } else {
+ result = epid_status;
+ }
+ break;
+ }
+
+ // setup curve
+ epid_status = NewSecp256r1Curve(&ec_state);
+ if (kEpidNoErr != epid_status) break;
+
+ // load pubkey
+ epid_status = NewCurvePoint(ec_state, &ecp_pubkey);
+ if (kEpidNoErr != epid_status) break;
+ epid_status = ReadCurvePoint(ec_state, pubkey, ecp_pubkey);
+ if (kEpidBadArgErr == epid_status) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (kEpidNoErr != epid_status) {
+ break;
+ }
+
+ // check for invalid pubkey
+ ipp_status = ippsECCPCheckPoint(ecp_pubkey, &ec_result, ec_state);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+ if (ippECValid != ec_result) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // hash message
+ epid_status = NewBigNum(IPP_SHA256_DIGEST_BITSIZE / 8, &bn_digest);
+ if (kEpidNoErr != epid_status) break;
+ epid_status = CalcHashBn(buf, buf_len, bn_digest);
+ if (kEpidNoErr != epid_status) break;
+
+ // configure key
+ ipp_status = ippsECCPSetKeyPair(NULL, ecp_pubkey, ippTrue, ec_state);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ // verify message
+ ipp_status = ippsECCPVerifyDSA(bn_digest->ipp_bn, bn_sig_x->ipp_bn,
+ bn_sig_y->ipp_bn, &ec_result, ec_state);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ if (ippECValid == ec_result)
+ result = kEpidSigValid;
+ else
+ result = kEpidSigInvalid;
+ } while (0);
+
+ DeleteSecp256r1Curve(&ec_state);
+ DeleteCurvePoint(&ecp_pubkey);
+ DeleteBigNum(&bn_digest);
+ DeleteBigNum(&bn_sig_x);
+ DeleteBigNum(&bn_sig_y);
+
+ return result;
+}
+
+static EpidStatus NewSecp256r1Curve(IppsECCPState** ec) {
+ EpidStatus result = kEpidNoErr;
+ IppsECCPState* ec_state = NULL;
+
+ if (!ec) return kEpidBadArgErr;
+
+ do {
+ int size = 0;
+ IppStatus ipp_status = ippStsNoErr;
+ ipp_status = ippsECCPGetSizeStd256r1(&size);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ ec_state = (IppsECCPState*)SAFE_ALLOC(size);
+ if (!ec_state) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ ipp_status = ippsECCPInitStd256r1(ec_state);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ ipp_status = ippsECCPSetStd256r1(ec_state);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ *ec = ec_state;
+ } while (0);
+ if (kEpidNoErr != result) {
+ SAFE_FREE(ec_state);
+ }
+ return result;
+}
+
+static void DeleteSecp256r1Curve(IppsECCPState** ec) {
+ if (!ec || !(*ec)) {
+ return;
+ }
+ SAFE_FREE(*ec);
+ *ec = NULL;
+}
+
+static EpidStatus NewCurvePoint(IppsECCPState const* ec,
+ IppsECCPPointState** p) {
+ EpidStatus result = kEpidNoErr;
+ IppsECCPPointState* point = NULL;
+
+ if (!ec || !p) return kEpidBadArgErr;
+
+ do {
+ const int kFeBitSize = 256;
+ IppStatus ipp_status = ippStsNoErr;
+ int size = 0;
+
+ ipp_status = ippsECCPPointGetSize(kFeBitSize, &size);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ point = (IppsECCPPointState*)SAFE_ALLOC(size);
+ if (!point) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ ipp_status = ippsECCPPointInit(kFeBitSize, point);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ *p = point;
+ } while (0);
+ if (kEpidNoErr != result) {
+ SAFE_FREE(point);
+ }
+ return result;
+}
+static void DeleteCurvePoint(IppsECCPPointState** p) {
+ if (!p || !(*p)) {
+ return;
+ }
+ SAFE_FREE(*p);
+ *p = NULL;
+}
+
+static EpidStatus ReadCurvePoint(IppsECCPState* ec,
+ EcdsaPublicKey const* pubkey,
+ IppsECCPPointState* p) {
+ EpidStatus result = kEpidNoErr;
+ BigNum* bn_pubkey_x = NULL;
+ BigNum* bn_pubkey_y = NULL;
+
+ if (!ec || !pubkey || !p) return kEpidBadArgErr;
+
+ do {
+ IppStatus ipp_status = ippStsNoErr;
+
+ result = NewBigNum(sizeof(pubkey->x), &bn_pubkey_x);
+ if (kEpidNoErr != result) break;
+
+ result = ReadBigNum(&pubkey->x, sizeof(pubkey->x), bn_pubkey_x);
+ if (kEpidNoErr != result) break;
+
+ result = NewBigNum(sizeof(pubkey->y), &bn_pubkey_y);
+ if (kEpidNoErr != result) break;
+
+ result = ReadBigNum(&pubkey->y, sizeof(pubkey->y), bn_pubkey_y);
+ if (kEpidNoErr != result) break;
+
+ ipp_status =
+ ippsECCPSetPoint(bn_pubkey_x->ipp_bn, bn_pubkey_y->ipp_bn, p, ec);
+ if (ipp_status == ippStsOutOfRangeErr) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (ipp_status != ippStsNoErr) {
+ result = kEpidMathErr;
+ break;
+ }
+ } while (0);
+
+ DeleteBigNum(&bn_pubkey_x);
+ DeleteBigNum(&bn_pubkey_y);
+
+ return result;
+}
+
+static EpidStatus CalcHashBn(ConstOctStr buf, size_t buf_len,
+ BigNum* bn_digest) {
+ EpidStatus result = kEpidErr;
+ BigNum* bn_ec_order = NULL;
+
+ if (!bn_digest || (!buf && (0 != buf_len))) return kEpidBadArgErr;
+
+ do {
+ IppStatus ipp_status = ippStsNoErr;
+ Ipp8u digest[IPP_SHA256_DIGEST_BITSIZE / 8] = {0};
+
+ const uint8_t secp256r1_r[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17,
+ 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51};
+
+ ipp_status = ippsSHA256MessageDigest(buf, (int)buf_len, digest);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ // convert hash to BigNum for use by ipp
+ result = ReadBigNum(digest, sizeof(digest), bn_digest);
+ if (kEpidNoErr != result) break;
+
+ result = NewBigNum(sizeof(secp256r1_r), &bn_ec_order);
+ if (kEpidNoErr != result) break;
+
+ result = ReadBigNum(secp256r1_r, sizeof(secp256r1_r), bn_ec_order);
+ if (kEpidNoErr != result) break;
+
+ ipp_status =
+ ippsMod_BN(bn_digest->ipp_bn, bn_ec_order->ipp_bn, bn_digest->ipp_bn);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&bn_ec_order);
+
+ return result;
+}
+
+static EpidStatus ValidateSignature(BigNum const* bn_sig_x,
+ BigNum const* bn_sig_y) {
+ EpidStatus result = kEpidSigInvalid;
+
+ BigNum* bn_ec_order = NULL;
+
+ if (!bn_sig_x || !bn_sig_y) return kEpidBadArgErr;
+
+ do {
+ IppStatus ipp_status = ippStsNoErr;
+ Ipp32u sig_x_cmp0 = IS_ZERO;
+ Ipp32u sig_y_cmp0 = IS_ZERO;
+ Ipp32u sig_x_cmp_order = IS_ZERO;
+ Ipp32u sig_y_cmp_order = IS_ZERO;
+ const uint8_t secp256r1_r[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17,
+ 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51};
+
+ result = NewBigNum(sizeof(secp256r1_r), &bn_ec_order);
+ if (kEpidNoErr != result) break;
+
+ result = ReadBigNum(secp256r1_r, sizeof(secp256r1_r), bn_ec_order);
+ if (kEpidNoErr != result) break;
+
+ ipp_status = ippsCmpZero_BN(bn_sig_x->ipp_bn, &sig_x_cmp0);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+ ipp_status = ippsCmpZero_BN(bn_sig_y->ipp_bn, &sig_y_cmp0);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+ ipp_status =
+ ippsCmp_BN(bn_sig_x->ipp_bn, bn_ec_order->ipp_bn, &sig_x_cmp_order);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+ ipp_status =
+ ippsCmp_BN(bn_sig_y->ipp_bn, bn_ec_order->ipp_bn, &sig_y_cmp_order);
+ BREAK_ON_IPP_ERROR(ipp_status, result);
+
+ if (IS_ZERO == sig_x_cmp0 || IS_ZERO == sig_y_cmp0 ||
+ LESS_THAN_ZERO != sig_x_cmp_order ||
+ LESS_THAN_ZERO != sig_y_cmp_order) {
+ result = kEpidSigInvalid;
+ break;
+ } else {
+ result = kEpidSigValid;
+ }
+ } while (0);
+
+ DeleteBigNum(&bn_ec_order);
+
+ return result;
+}
diff --git a/epid/common/math/src/ecgroup-internal.h b/epid/common/math/src/ecgroup-internal.h
new file mode 100644
index 0000000..55dbab4
--- /dev/null
+++ b/epid/common/math/src/ecgroup-internal.h
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Elliptic curve group private interface.
+ */
+
+#ifndef EPID_COMMON_MATH_SRC_ECGROUP_INTERNAL_H_
+#define EPID_COMMON_MATH_SRC_ECGROUP_INTERNAL_H_
+
+#include "epid/common/math/src/finitefield-internal.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Elpitic Curve Group
+struct EcGroup {
+ /// Internal implementation of elliptic curve group
+ IppsGFpECState* ipp_ec;
+ /// Scratch buffer for operations over elliptic curve group
+ OctStr scratch_buffer;
+ /// Information about finite field of elliptic curve group
+ struct FiniteField* ff;
+};
+
+/// Elpitic Curve Point
+struct EcPoint {
+ /// Internal implementation of elliptic curve point
+ IppsGFpECPoint* ipp_ec_pt;
+ /// length of the finite field element of elliptic curve group
+ int element_len;
+};
+#endif // EPID_COMMON_MATH_SRC_ECGROUP_INTERNAL_H_
diff --git a/epid/common/math/src/ecgroup.c b/epid/common/math/src/ecgroup.c
new file mode 100644
index 0000000..ba6b5c3
--- /dev/null
+++ b/epid/common/math/src/ecgroup.c
@@ -0,0 +1,1238 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Elliptic curve group implementation.
+ */
+
+#include "epid/common/math/ecgroup.h"
+#include <string.h>
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/hash.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+#include "ext/ipp/include/ippcpdefs.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ } /// Handle Ipp Errors with Break
+#define BREAK_ON_IPP_ERROR(sts, ret) \
+ { \
+ IppStatus temp_sts = (sts); \
+ if (ippStsNoErr != temp_sts) { \
+ if (ippStsContextMatchErr == temp_sts) { \
+ (ret) = kEpidMathErr; \
+ } else { \
+ (ret) = kEpidBadArgErr; \
+ } \
+ break; \
+ } \
+ }
+
+EpidStatus NewEcGroup(FiniteField const* ff, FfElement const* a,
+ FfElement const* b, FfElement const* x,
+ FfElement const* y, BigNum const* order,
+ BigNum const* cofactor, EcGroup** g) {
+ EpidStatus result = kEpidNoErr;
+ IppsGFpECState* state = NULL;
+ OctStr scratch_buffer = NULL;
+ EcGroup* grp = NULL;
+ do {
+ IppStatus ipp_status;
+ int stateSize = 0;
+ int scratch_size = 0;
+ IppBNU order_bnu;
+ IppBNU cofactor_bnu;
+ int order_bnu_size;
+ int cofactor_bnu_size;
+ IppsBigNumSGN sgn;
+ // validate input pointers
+ if (!ff || !a || !b || !x || !y || !order || !cofactor || !g) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (ff->element_len != a->element_len ||
+ ff->element_len != b->element_len ||
+ ff->element_len != x->element_len ||
+ ff->element_len != y->element_len) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // construct the ECPrimeField
+ ipp_status = ippsGFpECGetSize(ff->ipp_ff, &stateSize);
+ if (ippStsNoErr != ipp_status) {
+ if (ippStsSizeErr == ipp_status) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ grp = (EcGroup*)SAFE_ALLOC(sizeof(EcGroup));
+ if (!grp) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ state = (IppsGFpECState*)SAFE_ALLOC(stateSize);
+ if (!state) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ ipp_status = ippsRef_BN(&sgn, &order_bnu_size, &order_bnu, order->ipp_bn);
+ order_bnu_size /= sizeof(CHAR_BIT) * 4;
+ if (ippStsNoErr != ipp_status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ ipp_status =
+ ippsRef_BN(&sgn, &cofactor_bnu_size, &cofactor_bnu, cofactor->ipp_bn);
+ cofactor_bnu_size /= sizeof(CHAR_BIT) * 4;
+ if (ippStsNoErr != ipp_status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ ipp_status =
+ ippsGFpECInit(ff->ipp_ff, a->ipp_ff_elem, b->ipp_ff_elem, state);
+ if (ippStsNoErr != ipp_status) {
+ result = kEpidMathErr;
+ break;
+ }
+ ipp_status = ippsGFpECSetSubgroup(x->ipp_ff_elem, y->ipp_ff_elem,
+ order->ipp_bn, cofactor->ipp_bn, state);
+ if (ippStsNoErr != ipp_status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ // allocate scratch buffer
+ ipp_status = ippsGFpECScratchBufferSize(1, state, &scratch_size);
+ // check return codes
+ if (ippStsNoErr != ipp_status) {
+ // ippStsContextMatchErr not possible since we create the state
+ // in this function
+ result = kEpidMathErr;
+ break;
+ }
+
+ // allocate scratch buffer
+ scratch_buffer = (OctStr)SAFE_ALLOC(scratch_size);
+ if (!scratch_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Warning: once assigned ground field must never be modified. this was not
+ // made const
+ // to allow the FiniteField structure to be used in context when we want to
+ // modify the parameters.
+ grp->ff = (FiniteField*)ff;
+ grp->ipp_ec = state;
+ grp->scratch_buffer = scratch_buffer;
+ *g = grp;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ // we had a problem during init, free any allocated memory
+ SAFE_FREE(state);
+ SAFE_FREE(scratch_buffer);
+ SAFE_FREE(grp);
+ }
+ return result;
+}
+
+void DeleteEcGroup(EcGroup** g) {
+ if (!g || !(*g)) {
+ return;
+ }
+ if ((*g)->ipp_ec) {
+ SAFE_FREE((*g)->ipp_ec);
+ (*g)->ipp_ec = NULL;
+ }
+ if ((*g)->scratch_buffer) {
+ SAFE_FREE((*g)->scratch_buffer);
+ (*g)->scratch_buffer = NULL;
+ }
+ SAFE_FREE(*g);
+ *g = NULL;
+}
+
+EpidStatus NewEcPoint(EcGroup const* g, EcPoint** p) {
+ EpidStatus result = kEpidErr;
+ IppsGFpECPoint* ec_pt_context = NULL;
+ EcPoint* ecpoint = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ int sizeInBytes = 0;
+ // validate inputs
+ if (!g || !p) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (!g->ipp_ec) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // get size
+ sts = ippsGFpECPointGetSize(g->ipp_ec, &sizeInBytes);
+ if (ippStsContextMatchErr == sts) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ // allocate memory
+ ec_pt_context = (IppsGFpECPoint*)SAFE_ALLOC(sizeInBytes);
+ if (!ec_pt_context) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Initialize
+ sts = ippsGFpECPointInit(NULL, NULL, ec_pt_context, g->ipp_ec);
+ if (ippStsContextMatchErr == sts) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ ecpoint = SAFE_ALLOC(sizeof(EcPoint));
+ if (!ecpoint) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ if (!g->ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ ecpoint->element_len = g->ff->element_len;
+ ecpoint->ipp_ec_pt = ec_pt_context;
+ *p = ecpoint;
+ result = kEpidNoErr;
+ } while (0);
+ if (kEpidNoErr != result) {
+ SAFE_FREE(ec_pt_context);
+ SAFE_FREE(ecpoint);
+ }
+ return result;
+}
+
+void DeleteEcPoint(EcPoint** p) {
+ if (p) {
+ if (*p) {
+ SAFE_FREE((*p)->ipp_ec_pt);
+ }
+ SAFE_FREE(*p);
+ }
+}
+
+/// Check and initialize element if it is in elliptic curve group.
+/*!
+ This is internal function.
+ Takes a value p as input. If p is indeed an element of g, it
+ outputs true, otherwise, it outputs false.
+
+ This is only used to check if input buffer are actually valid
+ elements in group. If p is in g, this fills p and initializes it to
+ internal FfElement format.
+
+ \param[in] g
+ The eliptic curve group in which to perform the check
+ \param[in] p_str
+ Serialized eliptic curve group element to check
+ \param[in] strlen
+ The size of p_str in bytes.
+ \param[out] p
+ Deserialized value of p_str
+ \param[out] in_group
+ Result of the check
+
+ \returns ::EpidStatus
+
+ \see NewEcPoint
+*/
+EpidStatus eccontains(EcGroup* g, ConstOctStr p_str, size_t strlen, EcPoint* p,
+ bool* in_group) {
+ EpidStatus result = kEpidErr;
+ IppStatus sts = ippStsNoErr;
+ FiniteField* fp = NULL;
+ FfElement* fp_x = NULL;
+ FfElement* fp_y = NULL;
+ ConstIppOctStr byte_str = (ConstIppOctStr)p_str;
+ IppECResult ec_result = ippECPointIsNotValid;
+ int ipp_half_strlen = (int)strlen / 2;
+
+ if (!g || !p_str || !p || !in_group) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !p->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+
+ if (INT_MAX < strlen || strlen <= 0 || strlen & 0x1) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ size_t i = 0;
+ // if the string is all zeros then we take it as point at infinity
+ for (i = 0; i < strlen; i++) {
+ if (0 != byte_str[i]) {
+ break;
+ }
+ }
+ if (i >= strlen) {
+ // p_str is point at infinity! Set it and we are done
+ sts = ippsGFpECSetPointAtInfinity(p->ipp_ec_pt, g->ipp_ec);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ *in_group = true;
+ result = kEpidNoErr;
+ break;
+ }
+ // get finite field
+ fp = g->ff;
+ // create element X
+ result = NewFfElement(fp, &fp_x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // create element Y
+ result = NewFfElement(fp, &fp_y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set element X data
+ result = SetFfElementOctString(byte_str, ipp_half_strlen, fp_x, fp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set element Y data
+ result = SetFfElementOctString(byte_str + ipp_half_strlen, ipp_half_strlen,
+ fp_y, fp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set point from elements
+ sts = ippsGFpECSetPoint(fp_x->ipp_ff_elem, fp_y->ipp_ff_elem, p->ipp_ec_pt,
+ g->ipp_ec);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+
+ // verify the point is actually on the curve
+ sts = ippsGFpECTstPoint(p->ipp_ec_pt, &ec_result, g->ipp_ec);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ *in_group = (ippECValid == ec_result);
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&fp_x);
+ DeleteFfElement(&fp_y);
+ return result;
+}
+
+EpidStatus ReadEcPoint(EcGroup* g, ConstOctStr p_str, size_t strlen,
+ EcPoint* p) {
+ EpidStatus result;
+ bool in_group = false;
+
+ if (!g || !p_str || !p) {
+ return kEpidBadArgErr;
+ }
+ if (0 == strlen) {
+ return kEpidBadArgErr;
+ }
+
+ result = eccontains(g, p_str, strlen, p, &in_group);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ if (in_group == false) {
+ IppStatus sts = ippsGFpECPointInit(NULL, NULL, p->ipp_ec_pt, g->ipp_ec);
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus WriteEcPoint(EcGroup* g, EcPoint const* p, OctStr p_str,
+ size_t strlen) {
+ EpidStatus result = kEpidErr;
+ FiniteField* fp = NULL;
+ FfElement* fp_x = NULL;
+ FfElement* fp_y = NULL;
+ IppOctStr byte_str = (IppOctStr)p_str;
+ IppStatus sts = ippStsNoErr;
+ int ipp_half_strlen = (int)strlen / 2;
+
+ if (!g || !p || !p_str) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !p->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (INT_MAX < strlen) {
+ return kEpidBadArgErr;
+ }
+
+ if (INT_MAX < strlen || strlen <= 0 || strlen & 0x1) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ // get finite field
+ fp = g->ff;
+
+ // create element X
+ result = NewFfElement(fp, &fp_x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // create element Y
+ result = NewFfElement(fp, &fp_y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // get elements from point
+ sts = ippsGFpECGetPoint(p->ipp_ec_pt, fp_x->ipp_ff_elem, fp_y->ipp_ff_elem,
+ g->ipp_ec);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsPointAtInfinity == sts) {
+ memset(p_str, 0, strlen);
+ result = kEpidNoErr;
+ } else if (ippStsContextMatchErr == sts || ippStsOutOfRangeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ // get element X data
+ sts = ippsGFpGetElementOctString(fp_x->ipp_ff_elem, byte_str,
+ ipp_half_strlen, fp->ipp_ff);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+
+ // get element Y data
+ sts = ippsGFpGetElementOctString(fp_y->ipp_ff_elem,
+ byte_str + ipp_half_strlen,
+ ipp_half_strlen, fp->ipp_ff);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&fp_x);
+ DeleteFfElement(&fp_y);
+
+ return result;
+}
+
+EpidStatus EcMul(EcGroup* g, EcPoint const* a, EcPoint const* b, EcPoint* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!g || !a || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!g->ff || !g->ipp_ec || !a->ipp_ec_pt || !b->ipp_ec_pt ||
+ !r->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (g->ff->element_len != a->element_len ||
+ g->ff->element_len != b->element_len ||
+ g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ // Multiplies elliptic curve points
+ sts = ippsGFpECAddPoint(a->ipp_ec_pt, b->ipp_ec_pt, r->ipp_ec_pt, g->ipp_ec);
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus EcExp(EcGroup* g, EcPoint const* a, BigNumStr const* b, EcPoint* r) {
+ EpidStatus result = kEpidErr;
+ BigNum* b_bn = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+
+ // Check required parameters
+ if (!g || !a || !b || !r) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (!g->ff || !g->ipp_ec || !a->ipp_ec_pt || !r->ipp_ec_pt) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (g->ff->element_len != a->element_len ||
+ g->ff->element_len != r->element_len) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Create and initialize big number element for ipp call
+ result = NewBigNum(sizeof(((BigNumStr*)0)->data.data), &b_bn);
+ if (kEpidNoErr != result) break;
+ result = ReadBigNum(b, sizeof(*b), b_bn);
+ if (kEpidNoErr != result) break;
+ sts = ippsGFpECMulPoint(a->ipp_ec_pt, b_bn->ipp_bn, r->ipp_ec_pt, g->ipp_ec,
+ g->scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsOutOfRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ result = kEpidNoErr;
+ } while (0);
+ DeleteBigNum(&b_bn);
+ return result;
+}
+
+EpidStatus EcSscmExp(EcGroup* g, EcPoint const* a, BigNumStr const* b,
+ EcPoint* r) {
+ // call EcExp directly because its implementation is side channel
+ // mitigated already
+ return EcExp(g, a, b, r);
+}
+
+EpidStatus EcMultiExp(EcGroup* g, EcPoint const** a, BigNumStr const** b,
+ size_t m, EcPoint* r) {
+ EpidStatus result = kEpidErr;
+ BigNum* b_bn = NULL;
+ EcPoint* ecp_t = NULL;
+ size_t i = 0;
+ size_t ii = 0;
+
+ if (!g || !a || !b || !r) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || m <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that ec points are not NULL
+ for (i = 0; i < m; i++) {
+ if (!a[i]) {
+ return kEpidBadArgErr;
+ }
+ if (!a[i]->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (g->ff->element_len != a[i]->element_len) {
+ return kEpidBadArgErr;
+ }
+ for (ii = 0; ii < i; ii++) {
+ if (a[i]->element_len != a[ii]->element_len) {
+ return kEpidBadArgErr;
+ }
+ }
+ }
+
+ if (g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ IppStatus sts = ippStsNoErr;
+
+ // Create big number element for ipp call
+ result = NewBigNum(sizeof(((BigNumStr*)0)->data.data), &b_bn);
+ if (kEpidNoErr != result) break;
+ // Create temporal EcPoint element
+ result = NewEcPoint(g, &ecp_t);
+ if (kEpidNoErr != result) break;
+
+ for (i = 0; i < m; i++) {
+ // Initialize big number element for ipp call
+ result = ReadBigNum(b[i], sizeof(BigNumStr), b_bn);
+ if (kEpidNoErr != result) break;
+ sts = ippsGFpECMulPoint(a[i]->ipp_ec_pt, b_bn->ipp_bn, ecp_t->ipp_ec_pt,
+ g->ipp_ec, g->scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsOutOfRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ if (i == 0) {
+ sts = ippsGFpECCpyPoint(ecp_t->ipp_ec_pt, r->ipp_ec_pt, g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ } else {
+ sts = ippsGFpECAddPoint(ecp_t->ipp_ec_pt, r->ipp_ec_pt, r->ipp_ec_pt,
+ g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ }
+ }
+ if (kEpidNoErr != result) break;
+
+ result = kEpidNoErr;
+ } while (0);
+ DeleteBigNum(&b_bn);
+ DeleteEcPoint(&ecp_t);
+
+ return result;
+}
+
+EpidStatus EcMultiExpBn(EcGroup* g, EcPoint const** a, BigNum const** b,
+ size_t m, EcPoint* r) {
+ EpidStatus result = kEpidErr;
+ EcPoint* ecp_t = NULL;
+ size_t i = 0;
+ size_t ii = 0;
+
+ if (!g || !a || !b || !r) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || m <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that ec points are not NULL
+ for (i = 0; i < m; i++) {
+ if (!a[i]) {
+ return kEpidBadArgErr;
+ }
+ if (!a[i]->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (!b[i]) {
+ return kEpidBadArgErr;
+ }
+ if (!b[i]->ipp_bn) {
+ return kEpidBadArgErr;
+ }
+
+ if (g->ff->element_len != a[i]->element_len) {
+ return kEpidBadArgErr;
+ }
+ for (ii = 0; ii < i; ii++) {
+ if (a[i]->element_len != a[ii]->element_len) {
+ return kEpidBadArgErr;
+ }
+ }
+ }
+
+ if (g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ // Create temporal EcPoint element
+ result = NewEcPoint(g, &ecp_t);
+ if (kEpidNoErr != result) break;
+
+ for (i = 0; i < m; i++) {
+ sts = ippsGFpECMulPoint(a[i]->ipp_ec_pt, b[i]->ipp_bn, ecp_t->ipp_ec_pt,
+ g->ipp_ec, g->scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
+ ippStsOutOfRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ if (i == 0) {
+ sts = ippsGFpECCpyPoint(ecp_t->ipp_ec_pt, r->ipp_ec_pt, g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ } else {
+ sts = ippsGFpECAddPoint(ecp_t->ipp_ec_pt, r->ipp_ec_pt, r->ipp_ec_pt,
+ g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ }
+ }
+ if (kEpidNoErr != result) break;
+
+ result = kEpidNoErr;
+ } while (0);
+ DeleteEcPoint(&ecp_t);
+
+ return result;
+}
+
+EpidStatus EcSscmMultiExp(EcGroup* g, EcPoint const** a, BigNumStr const** b,
+ size_t m, EcPoint* r) {
+ // call EcMultiExp directly because its implementation is side channel
+ // mitigated already
+ return EcMultiExp(g, a, b, m, r);
+}
+
+EpidStatus EcGetRandom(EcGroup* g, BitSupplier rnd_func, void* rnd_func_param,
+ EcPoint* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!g || !rnd_func || !r) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !g->scratch_buffer) {
+ return kEpidBadArgErr;
+ }
+
+ if (g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts =
+ ippsGFpECSetPointRandom(r->ipp_ec_pt, g->ipp_ec, (IppBitSupplier)rnd_func,
+ rnd_func_param, g->scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus EcInGroup(EcGroup* g, ConstOctStr p_str, size_t strlen,
+ bool* in_group) {
+ EpidStatus result = kEpidErr;
+ EcPoint* p = NULL;
+
+ if (!g || !p_str || !in_group) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff) {
+ return kEpidBadArgErr;
+ }
+ if (0 == strlen) {
+ return kEpidBadArgErr;
+ }
+
+ if (strlen != sizeof(G1ElemStr) && strlen != sizeof(G2ElemStr)) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ } else {
+ if (strlen == sizeof(G1ElemStr)) {
+ // check finitefield.elementlen with strlen
+ // multiply by 2 for x,y and 4 multiply to convert dword to bytes
+ size_t info_elementLen_in_byte = (g->ff->element_len) * 2 * 4;
+ if (info_elementLen_in_byte != strlen) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+ // check Fq basic and ground degree
+ if (g->ff->basic_degree != 1 || g->ff->ground_degree != 1) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+ }
+ if (strlen == sizeof(G2ElemStr)) {
+ // check info.elementlen with strlen
+ // multiply by 2 for x,y and 4 multiply to convert dword to bytes
+ size_t info_elementLen_in_byte = (g->ff->element_len) * 2 * 4;
+ FiniteField* ground_ff = NULL;
+ if (info_elementLen_in_byte != strlen) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+ // check Fq2 basic and ground degree
+ if (g->ff->basic_degree != 2 || g->ff->ground_degree != 2) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+ // check Fq basic and ground degree
+ ground_ff = g->ff->ground_ff;
+ if (ground_ff == NULL) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+
+ if (ground_ff->basic_degree != 1 || ground_ff->ground_degree != 1) {
+ *in_group = false;
+ return kEpidBadArgErr;
+ }
+ }
+ }
+
+ do {
+ result = NewEcPoint(g, &p);
+ if (kEpidNoErr != result) break;
+
+ result = eccontains(g, p_str, strlen, p, in_group);
+ if (kEpidNoErr != result) break;
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteEcPoint(&p);
+
+ return result;
+}
+
+/// The number of attempts to hash a message to an element
+#define EPID_ECHASH_WATCHDOG (50)
+
+#pragma pack(1)
+/// 336 bit octet string
+typedef struct OctStr336 {
+ unsigned char data[336 / CHAR_BIT]; ///< 336 bit data
+} OctStr336;
+#pragma pack()
+
+/*!
+Returns the first bit and the next 336 bits of str in octet string.
+
+\param[in] str hash string
+\param[in] str_len hash string lengh in bytes
+\param[out] first_bit first bit of str
+\param[out] t pointer to the first 336 bits of input str after the first bit
+\param[in] t_len length of t octet string
+
+\returns ::EpidStatus
+*/
+static EpidStatus SplitHashBits(ConstOctStr str, size_t str_len,
+ uint32_t* first_bit, OctStr336* t) {
+ // this is 336bits /8 bits per byte = 42 bytes
+ OctStr336 next336 = {0};
+ size_t i = 0;
+ ConstIppOctStr data = (ConstIppOctStr)str;
+ if (!str || !first_bit || !t) return kEpidBadArgErr;
+ if (str_len < sizeof(next336) + 1) {
+ // we need at least 337 bits!
+ return kEpidBadArgErr;
+ }
+ for (i = 0; i < sizeof(next336); i++) {
+ // This is not overflowing since str length was assured to
+ // be at least one byte greater than needed for 336 bits. We are
+ // carrying in the first bit of that byte.
+ uint8_t carry = ((data[i + 1] & 0x80) >> 7);
+ next336.data[i] = (((data[i] << 1) & 0xFF) | carry) & 0xFF;
+ }
+ *first_bit = ((data[0] & 0x80) >> 7);
+ *t = next336;
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11EcHash(EcGroup* g, ConstOctStr msg, size_t msg_len,
+ EcPoint* r) {
+ EpidStatus result = kEpidErr;
+
+#pragma pack(1)
+ struct {
+ uint32_t msg_len;
+ uint8_t msg[1];
+ }* hash_buf = NULL;
+#pragma pack()
+ size_t hash_buf_size = 0;
+
+ FfElement* a = NULL;
+ FfElement* b = NULL;
+
+ FfElement* rx = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+
+ BigNum* q = NULL;
+ BigNum* t_bn = NULL;
+ BigNum* h_bn = NULL;
+
+ FiniteField* ff = NULL;
+
+ // check parameters
+ if ((!msg && msg_len > 0) || !r || !g) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !r->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+
+ if (g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ // mitigate hash_buf_size and msg_len overflow
+ if (INT_MAX - sizeof(uint32_t) < msg_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ IppStatus sts;
+ uint32_t i = 0;
+ uint32_t ip1 = 0;
+ uint32_t high_bit = 0;
+
+ IppsGFpState* ipp_ff = NULL;
+
+ int sqrt_loop_count = 2 * EPID_ECHASH_WATCHDOG;
+ Sha256Digest message_digest[2] = {0};
+ OctStr336 t = {0};
+
+ hash_buf_size = sizeof(*hash_buf) - sizeof(hash_buf->msg) + msg_len;
+ hash_buf = SAFE_ALLOC(hash_buf_size);
+ if (!hash_buf) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ result = NewBigNum(sizeof(BigNumStr), &h_bn);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpECGet(&ipp_ff, 0, 0, g->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpECGetSubgroup(&ipp_ff, 0, 0, 0, h_bn->ipp_bn, g->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ ff = g->ff;
+
+ result = NewFfElement(ff, &a);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ff, &b);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ff, &rx);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ff, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ff, &t2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(t), &t_bn);
+ BREAK_ON_EPID_ERROR(result);
+
+ sts = ippsGFpECGet(0, a->ipp_ff_elem, b->ipp_ff_elem, g->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ // compute H = hash (i || m) || Hash (i+1 || m) where (i =ipp32u)
+ // copy variable length message to the buffer to hash
+ if (0 != memcpy_S(hash_buf->msg,
+ hash_buf_size - sizeof(*hash_buf) + sizeof(hash_buf->msg),
+ msg, msg_len)) {
+ result = kEpidErr;
+ break;
+ }
+
+ do {
+ result = kEpidErr;
+
+ // set hash (i || m) portion
+ hash_buf->msg_len = ntohl(i);
+ result = Sha256MessageDigest(hash_buf, hash_buf_size, &message_digest[0]);
+ BREAK_ON_EPID_ERROR(result);
+ // set hash (i+1 || m) portion
+ ip1 = i + 1;
+ hash_buf->msg_len = ntohl(ip1);
+ result = Sha256MessageDigest(hash_buf, hash_buf_size, &message_digest[1]);
+ BREAK_ON_EPID_ERROR(result);
+ // let b = first bit of H
+ // t = next 336bits of H (336 = length(q) + slen)
+ result =
+ SplitHashBits(message_digest, sizeof(message_digest), &high_bit, &t);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(&t, sizeof(t), t_bn);
+ BREAK_ON_EPID_ERROR(result);
+ // compute rx = t mod q (aka prime field based on q)
+ result = InitFfElementFromBn(ff, t_bn, rx);
+ BREAK_ON_EPID_ERROR(result);
+
+ // t1 = (rx^3 + a*rx + b) mod q
+ result = FfMul(ff, rx, rx, t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ff, t1, rx, t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ff, a, rx, t2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ff, t1, t2, t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ff, t1, b, t1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // t2 = &ff.sqrt(t1)
+ result = FfSqrt(ff, t1, t2);
+ if (kEpidMathQuadraticNonResidueError == result) {
+ // if sqrt fail set i = i+ 2 and repeat from top
+ i += 2;
+ continue;
+ } else if (kEpidNoErr != result) {
+ result = kEpidErr;
+ }
+ break;
+ } while (--sqrt_loop_count);
+
+ BREAK_ON_EPID_ERROR(result);
+ // reset to fail to catch other errors
+ result = kEpidErr;
+
+ // y[0] = min (t2, q-t2), y[1] = max(t2, q-t2)
+ if (0 == high_bit) {
+ // q-t2 = &ff.neg(t2)
+ result = FfNeg(ff, t2, t2);
+ BREAK_ON_EPID_ERROR(result);
+ }
+
+ // Ry = y[b]
+ sts = ippsGFpECSetPoint(rx->ipp_ff_elem, t2->ipp_ff_elem, r->ipp_ec_pt,
+ g->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // R = E(&ff).exp(R,h)
+ sts = ippsGFpECMulPoint(r->ipp_ec_pt, h_bn->ipp_bn, r->ipp_ec_pt, g->ipp_ec,
+ g->scratch_buffer);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ result = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(hash_buf);
+ DeleteFfElement(&a);
+ DeleteFfElement(&b);
+ DeleteFfElement(&rx);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+ DeleteBigNum(&h_bn);
+ DeleteBigNum(&t_bn);
+ DeleteBigNum(&q);
+
+ return result;
+}
+
+EpidStatus EcHash(EcGroup* g, ConstOctStr msg, size_t msg_len, HashAlg hash_alg,
+ EcPoint* r, uint32_t* iterations) {
+ IppStatus sts = ippStsNoErr;
+ IppHashAlgId hash_id;
+ int ipp_msg_len = 0;
+ Ipp32u ipp_i = 0;
+ if (!g || (!msg && msg_len > 0) || !r) {
+ return kEpidBadArgErr;
+ } else if (!g->ff || !g->ipp_ec || !r->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ // because we use ipp function with message length parameter
+ // defined as "int" we need to verify that input length
+ // do not exceed INT_MAX to avoid overflow
+ if (msg_len > INT_MAX) {
+ return kEpidBadArgErr;
+ }
+ ipp_msg_len = (int)msg_len;
+ if (kSha256 == hash_alg) {
+ hash_id = ippHashAlg_SHA256;
+ } else if (kSha384 == hash_alg) {
+ hash_id = ippHashAlg_SHA384;
+ } else if (kSha512 == hash_alg) {
+ hash_id = ippHashAlg_SHA512;
+ } else if (kSha512_256 == hash_alg) {
+ hash_id = ippHashAlg_SHA512_256;
+ } else {
+ return kEpidHashAlgorithmNotSupported;
+ }
+
+ if (g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ sts = ippsGFpECSetPointHash(ipp_i, msg, ipp_msg_len, r->ipp_ec_pt,
+ g->ipp_ec, hash_id, g->scratch_buffer);
+ } while (ippStsQuadraticNonResidueErr == sts &&
+ ipp_i++ < EPID_ECHASH_WATCHDOG);
+
+ if (iterations) {
+ *iterations = (uint32_t)ipp_i;
+ }
+
+ if (ippStsContextMatchErr == sts || ippStsBadArgErr == sts ||
+ ippStsLengthErr == sts) {
+ return kEpidBadArgErr;
+ }
+ if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus EcMakePoint(EcGroup* g, FfElement const* x, EcPoint* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!g || !x || !r) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !x->ipp_ff_elem || !r->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+
+ if (g->ff->element_len != x->element_len ||
+ g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsGFpECMakePoint(x->ipp_ff_elem, r->ipp_ec_pt, g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsQuadraticNonResidueErr == sts ||
+ ippStsBadArgErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus EcInverse(EcGroup* g, EcPoint const* p, EcPoint* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!g || !p || !r) {
+ return kEpidBadArgErr;
+ } else if (!g->ff || !g->ipp_ec || !p->ipp_ec_pt || !r->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+
+ if (g->ff->element_len != p->element_len ||
+ g->ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ // Inverses elliptic curve point
+ sts = ippsGFpECNegPoint(p->ipp_ec_pt, r->ipp_ec_pt, g->ipp_ec);
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus EcIsEqual(EcGroup* g, EcPoint const* a, EcPoint const* b,
+ bool* is_equal) {
+ IppStatus sts;
+ IppECResult result;
+
+ if (!g || !a || !b || !is_equal) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !a->ipp_ec_pt || !b->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (g->ff->element_len != a->element_len ||
+ g->ff->element_len != b->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsGFpECCmpPoint(a->ipp_ec_pt, b->ipp_ec_pt, &result, g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ *is_equal = ippECPointIsEqual == result;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EcIsIdentity(EcGroup* g, EcPoint const* p, bool* is_identity) {
+ IppStatus sts;
+ IppECResult result;
+
+ if (!g || !p || !is_identity) {
+ return kEpidBadArgErr;
+ }
+ if (!g->ff || !g->ipp_ec || !p->ipp_ec_pt) {
+ return kEpidBadArgErr;
+ }
+ if (g->ff->element_len != p->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsGFpECTstPoint(p->ipp_ec_pt, &result, g->ipp_ec);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ sts = ippsGFpECTstPointInSubgroup(p->ipp_ec_pt, &result, g->ipp_ec,
+ g->scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ *is_identity = ippECPointIsAtInfinite == result;
+
+ return kEpidNoErr;
+}
diff --git a/epid/common/math/src/finitefield-internal.h b/epid/common/math/src/finitefield-internal.h
new file mode 100644
index 0000000..1123f3d
--- /dev/null
+++ b/epid/common/math/src/finitefield-internal.h
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Finite field private interface.
+ */
+
+#ifndef EPID_COMMON_MATH_SRC_FINITEFIELD_INTERNAL_H_
+#define EPID_COMMON_MATH_SRC_FINITEFIELD_INTERNAL_H_
+
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Finite Field
+struct FiniteField {
+ /// Internal implementation of finite field
+ IppsGFpState* ipp_ff;
+ /// Previous finitefield
+ struct FiniteField* ground_ff;
+ /// Degree of basic field
+ int basic_degree;
+ /// Degree of current field
+ int ground_degree;
+ /// Size of element in BNU units
+ int element_len;
+ /// Minimum number of bytes needed to serialize an element
+ size_t element_strlen_required;
+ /*!
+ Galois field prime or free standing coefficient of
+ irreducible polynomial of finite field extension.
+ */
+ BigNum* modulus_0;
+};
+
+/// Finite Field Element
+struct FfElement {
+ /// Internal implementation of finite field element
+ IppsGFpElement* ipp_ff_elem;
+ /// Element size of Finite Field element
+ int element_len;
+ /// Degree of Finite Field element
+ int degree;
+};
+
+EpidStatus SetFfElementOctString(ConstOctStr ff_elem_str, int strlen,
+ struct FfElement* ff_elem,
+ struct FiniteField* ff);
+
+#endif // EPID_COMMON_MATH_SRC_FINITEFIELD_INTERNAL_H_
diff --git a/epid/common/math/src/finitefield.c b/epid/common/math/src/finitefield.c
new file mode 100644
index 0000000..5589e75
--- /dev/null
+++ b/epid/common/math/src/finitefield.c
@@ -0,0 +1,1659 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Finite field implementation.
+ */
+
+#include "epid/common/math/finitefield.h"
+#include <limits.h>
+#include <stdint.h>
+#include <string.h>
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/src/memory.h"
+
+#ifndef MIN
+/// Evaluate to minimum of two values
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif // MIN
+
+/// Number of leading zero bits in 32 bit integer x.
+static size_t Nlz32(uint32_t x) {
+ size_t nlz = sizeof(x) * 8;
+ if (x) {
+ nlz = 0;
+ if (0 == (x & 0xFFFF0000)) {
+ nlz += 16;
+ x <<= 16;
+ }
+ if (0 == (x & 0xFF000000)) {
+ nlz += 8;
+ x <<= 8;
+ }
+ if (0 == (x & 0xF0000000)) {
+ nlz += 4;
+ x <<= 4;
+ }
+ if (0 == (x & 0xC0000000)) {
+ nlz += 2;
+ x <<= 2;
+ }
+ if (0 == (x & 0x80000000)) {
+ nlz++;
+ }
+ }
+ return nlz;
+}
+
+/// Bit size of bit number representated as array of Ipp32u.
+#define BNU_BITSIZE(bnu, len) \
+ ((len) * sizeof(Ipp32u) * 8 - Nlz32((bnu)[(len)-1]))
+
+/// Convert bit size to byte size
+#define BIT2BYTE_SIZE(bits) (((bits) + 7) >> 3)
+
+EpidStatus NewFiniteField(BigNumStr const* prime, FiniteField** ff) {
+ EpidStatus result = kEpidErr;
+ IppsGFpState* ipp_finitefield_ctx = NULL;
+ FiniteField* finitefield_ptr = NULL;
+ BigNum* prime_bn = NULL;
+ do {
+ EpidStatus status = kEpidErr;
+ IppStatus sts = ippStsNoErr;
+ Ipp32u bnu[sizeof(BigNumStr) / sizeof(Ipp32u)];
+ int bnu_size;
+ int bit_size = CHAR_BIT * sizeof(BigNumStr);
+ int state_size_in_bytes = 0;
+
+ if (!prime || !ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ bit_size = (int)OctStrBitSize(prime->data.data, sizeof(prime->data.data));
+
+ bnu_size = OctStr2Bnu(bnu, prime, sizeof(*prime));
+ if (bnu_size < 0) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ // skip high order zeros from BNU
+ while (bnu_size > 1 && 0 == bnu[bnu_size - 1]) {
+ bnu_size--;
+ }
+
+ // Determine the memory requirement for finite field context
+ sts = ippsGFpGetSize(bit_size, &state_size_in_bytes);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ // Allocate space for ipp bignum context
+ ipp_finitefield_ctx = (IppsGFpState*)SAFE_ALLOC(state_size_in_bytes);
+ if (!ipp_finitefield_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ status = NewBigNum(sizeof(BigNumStr), &prime_bn);
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ status = ReadBigNum(prime, sizeof(BigNumStr), prime_bn);
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+ // Initialize ipp finite field context
+ sts = ippsGFpInit(prime_bn->ipp_bn, bit_size, ippsGFpMethod_pArb(),
+ ipp_finitefield_ctx);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ finitefield_ptr = (FiniteField*)SAFE_ALLOC(sizeof(FiniteField));
+ if (!finitefield_ptr) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ finitefield_ptr->element_strlen_required =
+ BIT2BYTE_SIZE(BNU_BITSIZE(bnu, bnu_size));
+ finitefield_ptr->modulus_0 = prime_bn;
+ finitefield_ptr->basic_degree = 1;
+ finitefield_ptr->ground_degree = 1;
+ finitefield_ptr->element_len = bnu_size;
+ finitefield_ptr->ground_ff = NULL;
+ finitefield_ptr->ipp_ff = ipp_finitefield_ctx;
+ *ff = finitefield_ptr;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ SAFE_FREE(finitefield_ptr);
+ SAFE_FREE(prime_bn);
+ SAFE_FREE(ipp_finitefield_ctx);
+ }
+ return result;
+}
+
+EpidStatus NewFiniteFieldViaBinomalExtension(FiniteField const* ground_field,
+ FfElement const* ground_element,
+ int degree, FiniteField** ff) {
+ EpidStatus result = kEpidErr;
+ IppsGFpState* ipp_finitefield_ctx = NULL;
+ IppOctStr ff_elem_str = NULL;
+ FiniteField* finitefield_ptr = NULL;
+ BigNum* modulus_0 = NULL;
+ do {
+ EpidStatus status = kEpidErr;
+ IppStatus sts = ippStsNoErr;
+ int state_size_in_bytes = 0;
+ if (!ground_field || !ground_element || !ff) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (degree < 2 || !ground_field->ipp_ff ||
+ !ground_element->ipp_ff_elem) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Determine the memory requirement for finite field context
+ sts = ippsGFpxGetSize(ground_field->ipp_ff, degree, &state_size_in_bytes);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ // Allocate space for ipp finite field context
+ ipp_finitefield_ctx = (IppsGFpState*)SAFE_ALLOC(state_size_in_bytes);
+ if (!ipp_finitefield_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // Initialize ipp binomial extension finite field context
+ sts = ippsGFpxInitBinomial(
+ ground_field->ipp_ff, degree, ground_element->ipp_ff_elem,
+ 2 == degree
+ ? (3 == ground_field->basic_degree ? ippsGFpxMethod_binom2()
+ : ippsGFpxMethod_binom2_epid2())
+ : ippsGFpxMethod_binom3_epid2(),
+ ipp_finitefield_ctx);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ finitefield_ptr = (FiniteField*)SAFE_ALLOC(sizeof(FiniteField));
+ if (!finitefield_ptr) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ finitefield_ptr->element_strlen_required =
+ ground_field->element_strlen_required * degree;
+ ff_elem_str =
+ (IppOctStr)SAFE_ALLOC(ground_field->element_len * sizeof(Ipp32u));
+ if (!ff_elem_str) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ status = NewBigNum(ground_field->element_len * sizeof(Ipp32u), &modulus_0);
+ if (kEpidNoErr != status) {
+ break;
+ }
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+ result =
+ WriteFfElement((FiniteField*)ground_field, ground_element, ff_elem_str,
+ ground_field->element_len * sizeof(Ipp32u));
+ if (kEpidNoErr != result) break;
+ status = ReadBigNum(ff_elem_str, ground_field->element_len * sizeof(Ipp32u),
+ modulus_0);
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ finitefield_ptr->basic_degree = ground_field->basic_degree * degree;
+ finitefield_ptr->ground_degree = degree;
+ finitefield_ptr->element_len = ground_field->element_len * degree;
+ finitefield_ptr->modulus_0 = modulus_0;
+ // Warning: once assigned ground field must never be modified. this was not
+ // made const
+ // to allow the FiniteField structure to be used in context when we want to
+ // modify the parameters.
+ finitefield_ptr->ground_ff = (FiniteField*)ground_field;
+ finitefield_ptr->ipp_ff = ipp_finitefield_ctx;
+ *ff = finitefield_ptr;
+ result = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(ff_elem_str);
+
+ if (kEpidNoErr != result) {
+ SAFE_FREE(finitefield_ptr);
+ SAFE_FREE(modulus_0);
+ SAFE_FREE(ipp_finitefield_ctx);
+ }
+ return result;
+}
+
+EpidStatus NewFiniteFieldViaPolynomialExtension(FiniteField const* ground_field,
+ BigNumStr const* irr_polynomial,
+ int degree, FiniteField** ff) {
+ EpidStatus result = kEpidErr;
+ IppsGFpState* ipp_finitefield_ctx = NULL;
+ FiniteField* finitefield_ptr = NULL;
+ FfElement** ff_elems = NULL;
+ IppsGFpElement** ff_elems_state = NULL;
+ BigNum* modulus_0 = NULL;
+ int i;
+ do {
+ EpidStatus status = kEpidErr;
+ IppStatus sts = ippStsNoErr;
+ int state_size_in_bytes = 0;
+ if (!ground_field || !irr_polynomial || !ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (degree < 1 || degree > (int)(INT_MAX / sizeof(BigNumStr)) ||
+ !ground_field->ipp_ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Determine the memory requirement for finite field context
+ sts = ippsGFpxGetSize(ground_field->ipp_ff, degree, &state_size_in_bytes);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+
+ // Allocate space for ipp finite field context
+ ipp_finitefield_ctx = (IppsGFpState*)SAFE_ALLOC(state_size_in_bytes);
+ if (!ipp_finitefield_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ ff_elems = (FfElement**)SAFE_ALLOC(sizeof(FfElement*) * degree);
+ if (!ff_elems) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ ff_elems_state =
+ (IppsGFpElement**)SAFE_ALLOC(sizeof(IppsGFpElement*) * degree);
+ if (!ff_elems_state) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ for (i = 0; i < degree; ++i) {
+ status = NewFfElement(ground_field, &ff_elems[i]);
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ status = ReadFfElement((FiniteField*)ground_field, &irr_polynomial[i],
+ sizeof(BigNumStr), ff_elems[i]);
+ if (kEpidNoErr != status) {
+ result = kEpidMathErr;
+ break;
+ }
+ ff_elems_state[i] = ff_elems[i]->ipp_ff_elem;
+ }
+ // Initialize ipp binomial extension finite field context
+ sts = ippsGFpxInit(ground_field->ipp_ff, degree,
+ (const IppsGFpElement* const*)ff_elems_state, degree,
+ ippsGFpxMethod_com(), ipp_finitefield_ctx);
+ if (ippStsNoErr != sts) {
+ if (ippStsSizeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ status = NewBigNum(sizeof(irr_polynomial[0]), &modulus_0);
+ if (kEpidNoErr != status) {
+ break;
+ }
+ status =
+ ReadBigNum(&irr_polynomial[0], sizeof(irr_polynomial[0]), modulus_0);
+ if (kEpidNoErr != status) {
+ break;
+ }
+ finitefield_ptr = (FiniteField*)SAFE_ALLOC(sizeof(FiniteField));
+ if (!finitefield_ptr) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ finitefield_ptr->element_strlen_required =
+ ground_field->element_len * sizeof(Ipp32u) * degree;
+ finitefield_ptr->modulus_0 = modulus_0;
+ finitefield_ptr->basic_degree = ground_field->basic_degree * degree;
+ finitefield_ptr->ground_degree = degree;
+ finitefield_ptr->element_len = ground_field->element_len * degree;
+ // Warning: once assigned ground field must never be modified. this was not
+ // made const
+ // to allow the FiniteField structure to be used in context when we want to
+ // modify the parameters.
+ finitefield_ptr->ground_ff = (FiniteField*)ground_field;
+ finitefield_ptr->ipp_ff = ipp_finitefield_ctx;
+ *ff = finitefield_ptr;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (ff_elems != NULL) {
+ for (i = 0; i < degree; i++) {
+ DeleteFfElement(&ff_elems[i]);
+ }
+ }
+ SAFE_FREE(ff_elems);
+ SAFE_FREE(ff_elems_state);
+
+ if (kEpidNoErr != result) {
+ SAFE_FREE(finitefield_ptr);
+ SAFE_FREE(modulus_0)
+ SAFE_FREE(ipp_finitefield_ctx);
+ }
+ return result;
+}
+
+void DeleteFiniteField(FiniteField** ff) {
+ if (ff) {
+ if (*ff) {
+ SAFE_FREE((*ff)->ipp_ff);
+ DeleteBigNum(&(*ff)->modulus_0);
+ }
+ SAFE_FREE((*ff));
+ }
+}
+
+EpidStatus NewFfElement(FiniteField const* ff, FfElement** new_ff_elem) {
+ EpidStatus result = kEpidErr;
+ IppsGFpElement* ipp_ff_elem = NULL;
+ FfElement* ff_elem = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ unsigned int ctxsize = 0;
+ Ipp32u zero = 0;
+ // check parameters
+ if (!ff || !new_ff_elem) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (!ff->ipp_ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // Determine the memory requirement for finite field element context
+ sts = ippsGFpElementGetSize(ff->ipp_ff, (int*)&ctxsize);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ // Allocate space for ipp bignum context
+ ipp_ff_elem = (IppsGFpElement*)SAFE_ALLOC(ctxsize);
+ if (!ipp_ff_elem) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Initialize ipp bignum context
+ // initialize state
+ sts = ippsGFpElementInit(&zero, 1, ipp_ff_elem, ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ ff_elem = (FfElement*)SAFE_ALLOC(sizeof(FfElement));
+ if (!ff_elem) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ ff_elem->ipp_ff_elem = ipp_ff_elem;
+ ff_elem->element_len = ff->element_len;
+ ff_elem->degree = ff->ground_degree;
+
+ *new_ff_elem = ff_elem;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ SAFE_FREE(ipp_ff_elem);
+ SAFE_FREE(ff_elem);
+ }
+ return result;
+}
+
+void DeleteFfElement(FfElement** ff_elem) {
+ if (ff_elem) {
+ if (*ff_elem) {
+ SAFE_FREE((*ff_elem)->ipp_ff_elem);
+ }
+ SAFE_FREE(*ff_elem);
+ }
+}
+
+EpidStatus IsValidFfElemOctString(ConstOctStr ff_elem_str, int strlen,
+ FiniteField const* ff) {
+ int i;
+ EpidStatus result = kEpidNoErr;
+ IppStatus sts = ippStsNoErr;
+ FiniteField const* basic_ff;
+ BigNum* pData = NULL;
+ int prime_length;
+ IppOctStr ff_elem_str_p;
+ Ipp32u cmp_res;
+ int tmp_strlen = strlen;
+ if (!ff || !ff_elem_str) {
+ return kEpidBadArgErr;
+ }
+ basic_ff = ff;
+ while (basic_ff->ground_ff != NULL) {
+ basic_ff = basic_ff->ground_ff;
+ }
+ prime_length = basic_ff->element_len * sizeof(Ipp32u);
+ ff_elem_str_p = (IppOctStr)ff_elem_str;
+ for (i = 0; (i < ff->basic_degree) && (tmp_strlen > 0); i++) {
+ int length;
+ length = MIN(prime_length, tmp_strlen);
+ result = NewBigNum(length, &pData);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(ff_elem_str_p, length, pData);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ sts = ippsCmp_BN(basic_ff->modulus_0->ipp_bn, pData->ipp_bn, &cmp_res);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ if (cmp_res != IPP_IS_GT) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ DeleteBigNum(&pData);
+ tmp_strlen -= length;
+ ff_elem_str_p += length;
+ }
+ DeleteBigNum(&pData);
+ return result;
+}
+
+EpidStatus SetFfElementOctString(ConstOctStr ff_elem_str, int strlen,
+ FfElement* ff_elem, FiniteField* ff) {
+ EpidStatus result = kEpidErr;
+ IppOctStr extended_ff_elem_str = NULL;
+ if (!ff || !ff_elem || !ff_elem_str) {
+ return kEpidBadArgErr;
+ }
+ do {
+ IppStatus sts;
+ // Ipp2017u2 contians a bug in ippsGFpSetElementOctString, does not check
+ // whether ff_elem_str < modulus
+ result = IsValidFfElemOctString(ff_elem_str, strlen, ff);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // workaround because of bug in ipp2017u2
+ if (strlen < (int)(ff->element_len * sizeof(Ipp32u))) {
+ int length = ff->element_len * sizeof(Ipp32u);
+ extended_ff_elem_str = (IppOctStr)SAFE_ALLOC(length);
+ if (!extended_ff_elem_str) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ memset(extended_ff_elem_str, 0, length);
+ memcpy_S(extended_ff_elem_str, length, ff_elem_str, strlen);
+ strlen = length;
+ sts = ippsGFpSetElementOctString(extended_ff_elem_str, strlen,
+ ff_elem->ipp_ff_elem, ff->ipp_ff);
+ } else {
+ sts = ippsGFpSetElementOctString(ff_elem_str, strlen,
+ ff_elem->ipp_ff_elem, ff->ipp_ff);
+ }
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsOutOfRangeErr == sts) {
+ result = kEpidBadArgErr;
+ } else {
+ result = kEpidMathErr;
+ }
+ break;
+ }
+ } while (0);
+ SAFE_FREE(extended_ff_elem_str);
+ return result;
+}
+
+EpidStatus ReadFfElement(FiniteField* ff, ConstOctStr ff_elem_str,
+ size_t strlen, FfElement* ff_elem) {
+ size_t strlen_required = 0;
+ int ipp_str_size = 0;
+ EpidStatus result = kEpidNoErr;
+ ConstIppOctStr str = (ConstIppOctStr)ff_elem_str;
+
+ if (!ff || !ff_elem_str || !ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (!ff_elem->ipp_ff_elem || !ff->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+
+ if (ff->element_len != ff_elem->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ strlen_required = ff->element_strlen_required;
+
+ // Remove leading zeros when de-serializing finite field of degree 1.
+ // This takes care of serialization chunk size adjustments when importing
+ // a big numbers.
+ if (1 == ff->basic_degree) {
+ while (strlen_required < strlen && 0 == *str) {
+ str++;
+ strlen--;
+ }
+ }
+
+ // Check if serialized value does not exceed ippsGFpSetElementOctString
+ // expected size.
+ if (strlen_required < strlen) {
+ return kEpidBadArgErr;
+ }
+
+ ipp_str_size = (int)strlen;
+ if (ipp_str_size <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ result = SetFfElementOctString(str, ipp_str_size, ff_elem, ff);
+
+ return result;
+}
+
+/// Gets the prime value of a finite field
+/*!
+ This function returns a reference to the bignum containing the field's prime
+ value.
+
+ This function only works with non-composite fields.
+
+ \param[in] ff
+ The field.
+ \param[out] bn
+ The target BigNum.
+
+ \returns ::EpidStatus
+*/
+EpidStatus GetFiniteFieldPrime(FiniteField* ff, BigNum** bn) {
+ if (!ff || !bn) {
+ return kEpidBadArgErr;
+ }
+ if (!ff->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+ if (ff->basic_degree != 1 || ff->ground_degree != 1) {
+ return kEpidBadArgErr;
+ }
+ *bn = ff->modulus_0;
+ return kEpidNoErr;
+}
+
+EpidStatus InitFfElementFromBn(FiniteField* ff, BigNum* bn,
+ FfElement* ff_elem) {
+ EpidStatus result = kEpidErr;
+ BigNum* prime_bn = NULL; // non-owning reference
+ BigNum* mod_bn = NULL;
+ BNU mod_str = NULL;
+
+ if (!ff || !bn || !ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (!ff_elem->ipp_ff_elem || !ff->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+ if (ff->basic_degree != 1 || ff->ground_degree != 1) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != ff_elem->element_len) {
+ return kEpidBadArgErr;
+ }
+ do {
+ size_t elem_size = ff->element_len * sizeof(Ipp32u);
+ result = NewBigNum(elem_size, &mod_bn);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = GetFiniteFieldPrime(ff, &prime_bn);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ result = BigNumMod(bn, prime_bn, mod_bn);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ mod_str = (BNU)SAFE_ALLOC(elem_size);
+ if (NULL == mod_str) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ result = WriteBigNum(mod_bn, elem_size, mod_str);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(ff, mod_str, elem_size, ff_elem);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = kEpidNoErr;
+ } while (0);
+ SAFE_FREE(mod_str);
+ prime_bn = NULL;
+ DeleteBigNum(&mod_bn);
+ return result;
+}
+
+EpidStatus WriteFfElement(FiniteField* ff, FfElement const* ff_elem,
+ OctStr ff_elem_str, size_t strlen) {
+ IppStatus sts;
+ size_t strlen_required = 0;
+ size_t pad = 0;
+ IppOctStr str = (IppOctStr)ff_elem_str;
+
+ if (!ff || !ff_elem_str || !ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (!ff_elem->ipp_ff_elem || !ff->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+ if (INT_MAX < strlen) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != ff_elem->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ strlen_required = ff->element_strlen_required;
+
+ // add zero padding for extension of a degree 1 (a prime field)
+ // so it can be deserialized into big number correctly.
+ if (1 == ff->basic_degree && strlen_required < strlen) {
+ pad = strlen - strlen_required;
+ memset(str, 0, pad);
+ strlen -= pad;
+ str += pad;
+ }
+
+ // Check if output buffer meets ippsGFpGetElementOctString expectations.
+ if (strlen_required != strlen) return kEpidBadArgErr;
+
+ // get the data
+ sts = ippsGFpGetElementOctString(ff_elem->ipp_ff_elem, str, (int)strlen,
+ ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus FfNeg(FiniteField* ff, FfElement const* a, FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!ff || !a || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !r->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != a->element_len || ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsGFpNeg(a->ipp_ff_elem, r->ipp_ff_elem, ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfInv(FiniteField* ff, FfElement const* a, FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ // Check required parametersWriteFfElement
+ if (!ff || !a || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !r->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != a->element_len || ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ // Invert the element
+ sts = ippsGFpInv(a->ipp_ff_elem, r->ipp_ff_elem, ff->ipp_ff);
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ return kEpidBadArgErr;
+ else if (ippStsDivByZeroErr == sts)
+ return kEpidDivByZeroErr;
+ else
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfAdd(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!ff || !a || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !b->ipp_ff_elem ||
+ !r->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != a->element_len || ff->element_len != b->element_len ||
+ ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsGFpAdd(a->ipp_ff_elem, b->ipp_ff_elem, r->ipp_ff_elem, ff->ipp_ff);
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfSub(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ if (!ff || !a || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !b->ipp_ff_elem ||
+ !r->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+
+ if (ff->element_len != a->element_len || ff->element_len != b->element_len ||
+ ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsGFpSub(a->ipp_ff_elem, b->ipp_ff_elem, r->ipp_ff_elem, ff->ipp_ff);
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else if (ippStsNoErr != sts) {
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfMul(FiniteField* ff, FfElement const* a, FfElement const* b,
+ FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ // Check required parametersWriteFfElement
+ if (!ff || !a || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !b->ipp_ff_elem ||
+ !r->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ // Multiplies elements
+ if (a->element_len != b->element_len &&
+ a->element_len == a->degree * b->element_len) {
+ sts = ippsGFpMul_PE(a->ipp_ff_elem, b->ipp_ff_elem, r->ipp_ff_elem,
+ ff->ipp_ff);
+ } else {
+ if (ff->element_len != a->element_len ||
+ ff->element_len != b->element_len ||
+ ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ sts =
+ ippsGFpMul(a->ipp_ff_elem, b->ipp_ff_elem, r->ipp_ff_elem, ff->ipp_ff);
+ }
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfIsZero(FiniteField* ff, FfElement const* a, bool* is_zero) {
+ IppStatus sts = ippStsNoErr;
+ int ipp_result = IPP_IS_NE;
+ // Check required parameters
+ if (!ff || !a || !is_zero) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != a->element_len) {
+ return kEpidBadArgErr;
+ }
+ // Check if the element is zero
+ sts = ippsGFpIsZeroElement(a->ipp_ff_elem, &ipp_result, ff->ipp_ff);
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts)
+ return kEpidBadArgErr;
+ else
+ return kEpidMathErr;
+ }
+ if (IPP_IS_EQ == ipp_result) {
+ *is_zero = true;
+ } else {
+ *is_zero = false;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus FfExp(FiniteField* ff, FfElement const* a, BigNum const* b,
+ FfElement* r) {
+ EpidStatus result = kEpidErr;
+ OctStr scratch_buffer = NULL;
+ int exp_bit_size = 0;
+ int element_size = 0;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ // Check required parameters
+ if (!ff || !a || !b || !r) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (!ff->ipp_ff || !a->ipp_ff_elem || !r->ipp_ff_elem) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (ff->element_len != a->element_len ||
+ ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsRef_BN(0, &exp_bit_size, 0, b->ipp_bn);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ sts = ippsGFpScratchBufferSize(1, exp_bit_size, ff->ipp_ff, &element_size);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ scratch_buffer = (OctStr)SAFE_ALLOC(element_size);
+ if (!scratch_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ sts = ippsGFpExp(a->ipp_ff_elem, b->ipp_bn, r->ipp_ff_elem, ff->ipp_ff,
+ scratch_buffer);
+ // Check return codes
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ result = kEpidNoErr;
+ } while (0);
+ SAFE_FREE(scratch_buffer);
+ return result;
+}
+
+EpidStatus FfMultiExp(FiniteField* ff, FfElement const** p, BigNumStr const** b,
+ size_t m, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ IppsGFpElement** ipp_p = NULL;
+ IppsBigNumState** ipp_b = NULL;
+ BigNum** bignums = NULL;
+ OctStr scratch_buffer = NULL;
+ int i = 0;
+ int ipp_m = 0;
+
+ // Check required parameters
+ if (!ff || !p || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !r->ipp_ff_elem || m <= 0) {
+ return kEpidBadArgErr;
+ }
+ // because we use ipp function with number of items parameter
+ // defined as "int" we need to verify that input length
+ // do not exceed INT_MAX to avoid overflow
+ if (m > INT_MAX) {
+ return kEpidBadArgErr;
+ }
+ ipp_m = (int)m;
+
+ for (i = 0; i < ipp_m; i++) {
+ if (!p[i]) {
+ return kEpidBadArgErr;
+ }
+ if (!p[i]->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != p[i]->element_len) {
+ return kEpidBadArgErr;
+ }
+ }
+ if (ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ int scratch_buffer_size = 0;
+ const int exp_bit_size = CHAR_BIT * sizeof(BigNumStr);
+
+ // Allocate memory for finite field elements for ipp call
+ ipp_p = (IppsGFpElement**)SAFE_ALLOC(ipp_m * sizeof(IppsGFpElement*));
+ if (!ipp_p) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ for (i = 0; i < ipp_m; i++) {
+ ipp_p[i] = p[i]->ipp_ff_elem;
+ }
+
+ // Create big number elements for ipp call
+ // Allocate memory for finite field elements for ipp call
+ bignums = (BigNum**)SAFE_ALLOC(ipp_m * sizeof(BigNum*));
+ if (!bignums) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ ipp_b = (IppsBigNumState**)SAFE_ALLOC(ipp_m * sizeof(IppsBigNumState*));
+ if (!ipp_b) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // Initialize BigNum and fill ipp array for ipp call
+ for (i = 0; i < ipp_m; i++) {
+ result = NewBigNum(sizeof(BigNumStr), &bignums[i]);
+ if (kEpidNoErr != result) break;
+ result = ReadBigNum(b[i], sizeof(BigNumStr), bignums[i]);
+ if (kEpidNoErr != result) break;
+ ipp_b[i] = bignums[i]->ipp_bn;
+ }
+ if (kEpidNoErr != result) break;
+
+ // calculate scratch buffer size
+ sts = ippsGFpScratchBufferSize(ipp_m, exp_bit_size, ff->ipp_ff,
+ &scratch_buffer_size);
+ if (sts != ippStsNoErr) {
+ result = kEpidMathErr;
+ break;
+ }
+ // allocate memory for scratch buffer
+ scratch_buffer = (OctStr)SAFE_ALLOC(scratch_buffer_size);
+ if (!scratch_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ sts = ippsGFpMultiExp((const IppsGFpElement* const*)ipp_p,
+ (const IppsBigNumState* const*)ipp_b, ipp_m,
+ r->ipp_ff_elem, ff->ipp_ff, scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+ result = kEpidNoErr;
+ } while (0);
+ if (NULL != bignums) { // delete big nums only if it was really allocated
+ for (i = 0; i < ipp_m; i++) {
+ DeleteBigNum(&bignums[i]);
+ }
+ }
+ SAFE_FREE(bignums);
+ SAFE_FREE(ipp_p);
+ SAFE_FREE(ipp_b);
+ SAFE_FREE(scratch_buffer);
+ return result;
+}
+
+EpidStatus FfMultiExpBn(FiniteField* ff, FfElement const** p, BigNum const** b,
+ size_t m, FfElement* r) {
+ IppStatus sts = ippStsNoErr;
+ EpidStatus result = kEpidErr;
+ IppsGFpElement** ipp_p = NULL;
+ IppsBigNumState** ipp_b = NULL;
+ OctStr scratch_buffer = NULL;
+
+ int exp_bit_size = 0;
+ size_t i = 0;
+ int ipp_m = 0;
+
+ // Check required parameters
+ if (!ff || !p || !b || !r) {
+ return kEpidBadArgErr;
+ } else if (!ff->ipp_ff || !r->ipp_ff_elem || m <= 0) {
+ return kEpidBadArgErr;
+ } else if (ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ // because we use ipp function with number of items parameter
+ // defined as "int" we need to verify that input length
+ // do not exceed INT_MAX to avoid overflow
+ if (m > INT_MAX) {
+ return kEpidBadArgErr;
+ }
+ ipp_m = (int)m;
+ for (i = 0; i < m; i++) {
+ int b_size = 0;
+ if (!p[i] || !p[i]->ipp_ff_elem || !b[i] || !b[i]->ipp_bn) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != p[i]->element_len) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsGetSize_BN(b[i]->ipp_bn, &b_size);
+ if (ippStsNoErr != sts) {
+ return kEpidBadArgErr;
+ }
+ b_size *= (sizeof(Ipp32u) * CHAR_BIT);
+ if (b_size > exp_bit_size) {
+ exp_bit_size = b_size;
+ }
+ }
+
+ do {
+ int scratch_buffer_size = 0;
+
+ // Allocate memory for finite field elements for ipp call
+ ipp_p = (IppsGFpElement**)SAFE_ALLOC(m * sizeof(IppsGFpElement*));
+ if (!ipp_p) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ for (i = 0; i < m; i++) {
+ ipp_p[i] = p[i]->ipp_ff_elem;
+ }
+
+ ipp_b = (IppsBigNumState**)SAFE_ALLOC(m * sizeof(IppsBigNumState*));
+ if (!ipp_b) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // fill ipp array for ipp call
+ for (i = 0; i < m; i++) {
+ ipp_b[i] = b[i]->ipp_bn;
+ }
+
+ // calculate scratch buffer size
+ sts = ippsGFpScratchBufferSize(ipp_m, exp_bit_size, ff->ipp_ff,
+ &scratch_buffer_size);
+ if (sts != ippStsNoErr) {
+ result = kEpidMathErr;
+ break;
+ }
+ // allocate memory for scratch buffer
+ scratch_buffer = (OctStr)SAFE_ALLOC(scratch_buffer_size);
+ if (!scratch_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ sts = ippsGFpMultiExp((const IppsGFpElement* const*)ipp_p,
+ (const IppsBigNumState* const*)ipp_b, ipp_m,
+ r->ipp_ff_elem, ff->ipp_ff, scratch_buffer);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsRangeErr == sts)
+ result = kEpidBadArgErr;
+ else
+ result = kEpidMathErr;
+ break;
+ }
+
+ result = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(scratch_buffer);
+ SAFE_FREE(ipp_b);
+ SAFE_FREE(ipp_p);
+ return result;
+}
+
+EpidStatus FfSscmMultiExp(FiniteField* ff, FfElement const** p,
+ BigNumStr const** b, size_t m, FfElement* r) {
+ // call EcMultiExp directly because its implementation is side channel
+ // mitigated already
+ return FfMultiExp(ff, p, b, m, r);
+}
+
+EpidStatus FfIsEqual(FiniteField* ff, FfElement const* a, FfElement const* b,
+ bool* is_equal) {
+ IppStatus sts;
+ int result;
+
+ if (!ff || !a || !b || !is_equal) {
+ return kEpidBadArgErr;
+ }
+ if (!ff->ipp_ff || !a->ipp_ff_elem || !b->ipp_ff_elem) {
+ return kEpidBadArgErr;
+ }
+ if (ff->element_len != a->element_len || ff->element_len != b->element_len) {
+ return kEpidBadArgErr;
+ }
+
+ sts = ippsGFpCmpElement(a->ipp_ff_elem, b->ipp_ff_elem, &result, ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ *is_equal = IPP_IS_EQ == result;
+
+ return kEpidNoErr;
+}
+
+EpidStatus FfHash(FiniteField* ff, ConstOctStr msg, size_t msg_len,
+ HashAlg hash_alg, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ do {
+ IppStatus sts = ippStsNoErr;
+ IppHashAlgId hash_id;
+ int ipp_msg_len = 0;
+ if (!ff || !msg || !r) {
+ result = kEpidBadArgErr;
+ break;
+ } else if (!ff->ipp_ff || !r->ipp_ff_elem || msg_len <= 0) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // because we use ipp function with message length parameter
+ // defined as "int" we need to verify that input length
+ // do not exceed INT_MAX to avoid overflow
+ if (msg_len > INT_MAX) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ ipp_msg_len = (int)msg_len;
+
+ if (kSha256 == hash_alg) {
+ hash_id = ippHashAlg_SHA256;
+ } else if (kSha384 == hash_alg) {
+ hash_id = ippHashAlg_SHA384;
+ } else if (kSha512 == hash_alg) {
+ hash_id = ippHashAlg_SHA512;
+ } else if (kSha512_256 == hash_alg) {
+ hash_id = ippHashAlg_SHA512_256;
+ } else {
+ result = kEpidHashAlgorithmNotSupported;
+ break;
+ }
+ if (ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ sts = ippsGFpSetElementHash(msg, ipp_msg_len, r->ipp_ff_elem, ff->ipp_ff,
+ hash_id);
+ if (ippStsNoErr != sts) {
+ if (ippStsContextMatchErr == sts || ippStsBadArgErr == sts ||
+ ippStsLengthErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+ result = kEpidNoErr;
+ } while (0);
+ return result;
+}
+
+/// Number of tries for RNG
+#define RNG_WATCHDOG (10)
+EpidStatus FfGetRandom(FiniteField* ff, BigNumStr const* low_bound,
+ BitSupplier rnd_func, void* rnd_param, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ FfElement* low = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ unsigned int rngloopCount = RNG_WATCHDOG;
+ if (!ff || !low_bound || !rnd_func || !r) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!ff->ipp_ff || !r->ipp_ff_elem) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (ff->element_len != r->element_len) {
+ return kEpidBadArgErr;
+ }
+ // create a new FfElement to hold low_bound
+ result = NewFfElement(ff, &low);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(ff, low_bound, sizeof(*low_bound), low);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ do {
+ int cmpResult = IPP_IS_NE;
+ sts = ippsGFpSetElementRandom(r->ipp_ff_elem, ff->ipp_ff,
+ (IppBitSupplier)rnd_func, rnd_param);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ sts = ippsGFpCmpElement(r->ipp_ff_elem, low->ipp_ff_elem, &cmpResult,
+ ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+ if (IPP_IS_LT != cmpResult) {
+ // we have a valid value, proceed
+ result = kEpidNoErr;
+ break;
+ } else {
+ result = kEpidRandMaxIterErr;
+ continue;
+ }
+ } while (--rngloopCount);
+ } while (0);
+ DeleteFfElement(&low);
+ return result;
+}
+
+EpidStatus FfSqrt(FiniteField* ff, FfElement const* a, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ BigNum* qm1 = NULL;
+ BigNum* one = NULL;
+ FfElement* qm1_ffe = NULL;
+ BigNum* two = NULL;
+ BigNum* qm1d2 = NULL;
+ BigNum* remainder = NULL;
+ FfElement* g = NULL;
+ FfElement* gg = NULL;
+ BigNum* t = NULL;
+ BigNum* e = NULL;
+ BigNum* j = NULL;
+ BigNum* qm1dj = NULL;
+ FfElement* ge = NULL;
+ FfElement* h = NULL;
+ FfElement* temp = NULL;
+ FfElement* one_ffe = NULL;
+ BigNum* ed2 = NULL;
+ FfElement* ged2 = NULL;
+ BigNum* tp1d2 = NULL;
+ FfElement* gtp1d2 = NULL;
+ FfElement* dd = NULL;
+
+ if (!ff || !a || !r) {
+ return kEpidBadArgErr;
+ }
+ do {
+ BigNum* prime = NULL; // non-owning reference
+ bool is_equal = false;
+ unsigned int s;
+ bool is_even = false;
+ unsigned int i;
+ Ipp8u one_str = 1;
+ BigNumStr qm1_str;
+ const BigNumStr zero_str = {0};
+
+ result = GetFiniteFieldPrime(ff, &prime);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &qm1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &one);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &qm1_ffe);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &two);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &qm1d2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &g);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &gg);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &t);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &e);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &j);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &qm1dj);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &ge);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &h);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &temp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &one_ffe);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &ed2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &ged2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(BigNumStr) * CHAR_BIT, &tp1d2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &gtp1d2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(ff, &dd);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&one_str, sizeof(one_str), one);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumSub(prime, one, qm1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumAdd(one, one, two);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = InitFfElementFromBn(ff, one, one_ffe);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = WriteBigNum(qm1, sizeof(qm1_str), &qm1_str);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = InitFfElementFromBn(ff, qm1, qm1_ffe);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumDiv(qm1, two, qm1d2, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // 1. Choose an element g in Fq.
+ result = ReadFfElement(ff, &one_str, sizeof(one_str), g);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // try small values for g starting from 2 until
+ // it meets the requirements from the step 2
+ do {
+ result = FfAdd(ff, g, one_ffe, g);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // 2. Check whether g^((q-1)/2) mod q = q-1. If not, go to step 1.
+ result = FfExp(ff, g, qm1d2, gg);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ result = FfIsEqual(ff, gg, qm1_ffe, &is_equal);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } while (!is_equal);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // 3. Set t = q-1, s = 0.
+ result = ReadBigNum(&qm1_str, sizeof(qm1_str), t);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ s = 0;
+ // 4. While (t is even number)
+ // t = t/2, s = s+1.
+ result = BigNumIsEven(t, &is_even);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ while (is_even) {
+ result = BigNumDiv(t, two, t, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ s = s + 1;
+ result = BigNumIsEven(t, &is_even);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ }
+ // 5. Note that g, s, t can be pre-computed and used for all
+ // future computations.
+ // Also note that q-1 = (2^s)*t where t is an odd integer.
+
+ // 6. e = 0.
+ result = ReadBigNum(&zero_str, sizeof(zero_str), e);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // 7. For i = 2, ..., s
+ // j = 2^i,
+ // if (a ? g^(-e))^((q-1)/j) mod q != 1, then set e = e + j/2.
+ for (i = 2; i <= s; i++) {
+ result = BigNumPow2N(i, j);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumDiv(qm1, j, qm1dj, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfExp(ff, g, e, ge);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 8. Compute h = (a * g^(-e)) mod q.
+ result = FfInv(ff, ge, ge);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfMul(ff, a, ge, h);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfExp(ff, h, qm1dj, temp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfIsEqual(ff, temp, one_ffe, &is_equal);
+ if (!is_equal) {
+ result = BigNumDiv(j, two, j, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumAdd(e, j, e);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ }
+ }
+
+ // 8. Compute h = (a * g^(-e)) mod q.
+ result = FfExp(ff, g, e, ge);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfInv(ff, ge, ge);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfMul(ff, a, ge, h);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // 9. Compute r = d = (g^(e/2) * h^((t+1)/2)) mod q.
+ result = BigNumDiv(e, two, ed2, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfExp(ff, g, ed2, ged2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumAdd(t, one, tp1d2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumDiv(tp1d2, two, tp1d2, remainder);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfExp(ff, h, tp1d2, gtp1d2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfMul(ff, ged2, gtp1d2, r);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 10. Verify whether a = d^2 mod q. If so, return r, otherwise, return
+ // fail.
+ result = FfMul(ff, r, r, dd);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfIsEqual(ff, dd, a, &is_equal);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ if (!is_equal) {
+ result = kEpidMathQuadraticNonResidueError;
+ break;
+ }
+ result = kEpidNoErr;
+ prime = NULL;
+ } while (0);
+ DeleteFfElement(&dd);
+ DeleteFfElement(&gtp1d2);
+ DeleteBigNum(&tp1d2);
+ DeleteFfElement(&ged2);
+ DeleteBigNum(&ed2);
+ DeleteFfElement(&one_ffe);
+ DeleteFfElement(&temp);
+ DeleteFfElement(&h);
+ DeleteFfElement(&ge);
+ DeleteBigNum(&qm1dj);
+ DeleteBigNum(&j);
+ DeleteBigNum(&e);
+ DeleteBigNum(&t);
+ DeleteFfElement(&gg);
+ DeleteFfElement(&g);
+ DeleteBigNum(&remainder);
+ DeleteBigNum(&qm1d2);
+ DeleteBigNum(&two);
+ DeleteFfElement(&qm1_ffe);
+ DeleteBigNum(&one);
+ DeleteBigNum(&qm1);
+ return result;
+}
diff --git a/epid/common/math/src/pairing-internal.h b/epid/common/math/src/pairing-internal.h
new file mode 100644
index 0000000..af14ac6
--- /dev/null
+++ b/epid/common/math/src/pairing-internal.h
@@ -0,0 +1,39 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pairing private interface.
+ */
+
+#ifndef EPID_COMMON_MATH_SRC_PAIRING_INTERNAL_H_
+#define EPID_COMMON_MATH_SRC_PAIRING_INTERNAL_H_
+
+/// Pairing State
+struct PairingState {
+ EcGroup* ga; ///< elliptic curve group G1
+ EcGroup* gb; ///< elliptic curve group G1
+ FiniteField* ff; ///< finite field Fq12 GT
+ BigNum* t; ///< positive integer such that 6t^2 = p-q, where p and q are
+ /// parameters of G1
+ bool neg; ///< 8-bit integer representing a Boolean value
+ FfElement* g[3][5]; ///< 15 elements in Fq2
+ FiniteField* Fq; ///< Fq
+ FiniteField* Fq2; ///< Fq2
+ FiniteField* Fq6; ///< Fq6
+};
+
+#endif // EPID_COMMON_MATH_SRC_PAIRING_INTERNAL_H_
diff --git a/epid/common/math/src/pairing.c b/epid/common/math/src/pairing.c
new file mode 100644
index 0000000..b8da1d3
--- /dev/null
+++ b/epid/common/math/src/pairing.c
@@ -0,0 +1,2434 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pairing implementation.
+ */
+
+#include "epid/common/math/pairing.h"
+#include <limits.h>
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/math/src/pairing-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Handle Ipp Errors with Break
+#define BREAK_ON_IPP_ERROR(sts, ret) \
+ { \
+ IppStatus temp_sts = (sts); \
+ if (ippStsNoErr != temp_sts) { \
+ if (ippStsContextMatchErr == temp_sts) { \
+ (ret) = kEpidMathErr; \
+ } else { \
+ (ret) = kEpidBadArgErr; \
+ } \
+ break; \
+ } \
+ }
+/// Handle Ipp Errors with Return
+#define RETURN_ON_IPP_ERROR(sts) \
+ { \
+ IppStatus temp_sts = (sts); \
+ if (ippStsNoErr != temp_sts) { \
+ if (ippStsContextMatchErr == temp_sts) { \
+ return kEpidMathErr; \
+ } else { \
+ return kEpidBadArgErr; \
+ } \
+ } \
+ }
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+#pragma pack(1)
+/// Data for element in Fq
+typedef struct FqElemDat {
+ Ipp32u x[sizeof(FqElemStr) / sizeof(Ipp32u)]; ///< element in Fq
+} FqElemDat;
+/// Data for element in Fq2
+typedef struct Fq2ElemDat {
+ FqElemDat x[2]; ///< element in Fq2
+} Fq2ElemDat;
+/// Data for element in Fq2^3
+typedef struct Fq6ElemDat {
+ Fq2ElemDat x[3]; ///< element in Fq6
+} Fq6ElemDat;
+/// Data for element in Fq2^3^2
+typedef struct Fq12ElemDat {
+ Fq6ElemDat x[2]; ///< element in Fq12
+} Fq12ElemDat;
+#pragma pack()
+
+// Forward Declarations
+static EpidStatus FinalExp(PairingState* ps, FfElement* d, FfElement const* h);
+
+static EpidStatus PiOp(PairingState* ps, FfElement* x_out, FfElement* y_out,
+ FfElement const* x, FfElement const* y, const int e);
+
+static EpidStatus FrobeniusOp(PairingState* ps, FfElement* d_out,
+ FfElement const* a, const int e);
+
+static EpidStatus Line(FiniteField* gt, FfElement* f, FfElement* x_out,
+ FfElement* y_out, FfElement* z_out, FfElement* z2_out,
+ FfElement const* px, FfElement const* py,
+ FfElement const* x, FfElement const* y,
+ FfElement const* z, FfElement const* z2,
+ FfElement const* qx, FfElement const* qy);
+
+static EpidStatus Tangent(FiniteField* gt, FfElement* f, FfElement* x_out,
+ FfElement* y_out, FfElement* z_out, FfElement* z2_out,
+ FfElement const* px, FfElement const* py,
+ FfElement const* x, FfElement const* y,
+ FfElement const* z, FfElement const* z2);
+
+static EpidStatus Ternary(int* s, int* n, int max_elements, BigNum const* x);
+
+static int Bit(Ipp32u const* num, Ipp32u bit_index);
+
+static EpidStatus MulXiFast(FfElement* e, FfElement const* a, PairingState* ps);
+
+static EpidStatus MulV(FfElement* e, FfElement* a, PairingState* ps);
+
+static EpidStatus Fq6MulGFpE2(FfElement* e, FfElement* a, FfElement* b0,
+ FfElement* b1, PairingState* ps);
+
+static EpidStatus MulSpecial(FfElement* e, FfElement const* a,
+ FfElement const* b, PairingState* ps);
+
+static EpidStatus SquareCyclotomic(PairingState* ps, FfElement* e_out,
+ FfElement const* a_in);
+
+static EpidStatus ExpCyclotomic(PairingState* ps, FfElement* e,
+ FfElement const* a, BigNum const* b);
+
+// Implementation
+
+EpidStatus NewPairingState(EcGroup const* ga, EcGroup const* gb,
+ FiniteField* ff, BigNumStr const* t, bool neg,
+ PairingState** ps) {
+ EpidStatus result = kEpidErr;
+ FfElement* xi = NULL;
+ PairingState* pairing_state_ctx = NULL;
+ BigNum* e = NULL;
+ BigNum* one = NULL;
+ BigNum* six = NULL;
+ OctStr scratch_buffer = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ IppsGFpState* Fq6 = NULL;
+ IppsGFpState* Fq2 = NULL;
+ IppsGFpState* Fq = NULL;
+ FiniteField* Ffq6 = NULL;
+ FiniteField* Ffq2 = NULL;
+ FiniteField* Ffq = NULL;
+ Fq2ElemDat Fq6IrrPolynomial = {0};
+ uint8_t one_str[] = {1};
+ uint8_t six_str[] = {6};
+ int i = 0;
+ int j = 0;
+ int bufferSize = 0;
+ int bitSize = 0;
+ // validate inputs
+ if (!ga || !gb || !ff || !t || !ps) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!ga->ipp_ec || !gb->ipp_ec || !ff->ipp_ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // get Fq6, Fq2, Fq
+ Ffq6 = ff->ground_ff;
+ if (!Ffq6) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq6 = Ffq6->ipp_ff;
+ Ffq2 = Ffq6->ground_ff;
+ if (!Ffq2) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq2 = Ffq2->ipp_ff;
+ Ffq = Ffq2->ground_ff;
+ if (!Ffq) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq = Ffq->ipp_ff;
+ // extract xi from Fq6 irr poly
+ result = NewFfElement(Ffq2, &xi);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteBigNum(Ffq6->modulus_0, sizeof(Fq6IrrPolynomial),
+ &Fq6IrrPolynomial);
+ BREAK_ON_EPID_ERROR(result);
+ result = SetFfElementOctString(&Fq6IrrPolynomial, sizeof(Fq6IrrPolynomial),
+ xi, Ffq2);
+ BREAK_ON_EPID_ERROR(result);
+ // first coefficent is -xi
+ sts = ippsGFpNeg(xi->ipp_ff_elem, xi->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ pairing_state_ctx = (PairingState*)SAFE_ALLOC(sizeof(PairingState));
+ if (!pairing_state_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // 1. Set param(pairing) = (param(G1), param(G2), param(GT), t, neg)
+ pairing_state_ctx->ga = (EcGroup*)ga;
+ pairing_state_ctx->gb = (EcGroup*)gb;
+ pairing_state_ctx->ff = ff;
+ result = NewBigNum(sizeof(BigNumStr), &pairing_state_ctx->t);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(t, sizeof(BigNumStr), pairing_state_ctx->t);
+ BREAK_ON_EPID_ERROR(result);
+ pairing_state_ctx->neg = neg;
+ pairing_state_ctx->Fq6 = Ffq6;
+ pairing_state_ctx->Fq2 = Ffq2;
+ pairing_state_ctx->Fq = Ffq;
+ // 2. Let g[0][0], ..., g[0][4], g[1][0], ..., g[1][4], g[2][0], ...,
+ // g[2][4] be 15 elements in Fq2.
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 5; j++) {
+ result = NewFfElement(Ffq2, &pairing_state_ctx->g[i][j]);
+ BREAK_ON_EPID_ERROR(result);
+ }
+ }
+ // 3. Compute a big integer e = (q - 1)/6.
+ result = NewBigNum(sizeof(BigNumStr), &one);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(one_str, sizeof(one_str), one);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(BigNumStr), &e);
+ BREAK_ON_EPID_ERROR(result);
+ // q - 1
+ sts = ippsSub_BN(Ffq->modulus_0->ipp_bn, one->ipp_bn, e->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = NewBigNum(sizeof(BigNumStr), &six);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(six_str, sizeof(six_str), six);
+ BREAK_ON_EPID_ERROR(result);
+ // e = (q - 1)/6
+ // reusing one as remainder here
+ sts = ippsDiv_BN(e->ipp_bn, six->ipp_bn, e->ipp_bn, one->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Compute g[0][0] = Fq2.exp(xi, e).
+ sts = ippsRef_BN(0, &bitSize, 0, e->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpScratchBufferSize(1, bitSize, Fq2, &bufferSize);
+ BREAK_ON_IPP_ERROR(sts, result);
+ scratch_buffer = (OctStr)SAFE_ALLOC(bufferSize);
+ if (!scratch_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ sts = ippsGFpExp(xi->ipp_ff_elem, e->ipp_bn,
+ pairing_state_ctx->g[0][0]->ipp_ff_elem, Fq2,
+ scratch_buffer);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 5. For i = 0, ..., 4, compute
+ for (i = 0; i < 5; i++) {
+ // a. If i > 0, compute g[0][i] = Fq2.mul(g[0][i-1], g[0][0]).
+ if (i > 0) {
+ sts = ippsGFpMul(pairing_state_ctx->g[0][i - 1]->ipp_ff_elem,
+ pairing_state_ctx->g[0][0]->ipp_ff_elem,
+ pairing_state_ctx->g[0][i]->ipp_ff_elem, Fq2);
+ }
+ // b. Compute g[1][i] = Fq2.conjugate(g[0][i]),
+ sts = ippsGFpConj(pairing_state_ctx->g[0][i]->ipp_ff_elem,
+ pairing_state_ctx->g[1][i]->ipp_ff_elem, Fq2);
+ // c. Compute g[1][i] = Fq2.mul(g[0][i], g[1][i]),
+ sts = ippsGFpMul(pairing_state_ctx->g[0][i]->ipp_ff_elem,
+ pairing_state_ctx->g[1][i]->ipp_ff_elem,
+ pairing_state_ctx->g[1][i]->ipp_ff_elem, Fq2);
+ // d. Compute g[2][i] = Fq2.mul(g[0][i], g[1][i]).
+ sts = ippsGFpMul(pairing_state_ctx->g[0][i]->ipp_ff_elem,
+ pairing_state_ctx->g[1][i]->ipp_ff_elem,
+ pairing_state_ctx->g[2][i]->ipp_ff_elem, Fq2);
+ }
+ // 6. Save g[0][0], ..., g[0][4], g[1][0], ..., g[1][4], g[2][0], ...,
+ // g[2][4]
+ // for the pairing operations.
+ *ps = pairing_state_ctx;
+ result = kEpidNoErr;
+ } while (0);
+ SAFE_FREE(scratch_buffer)
+ DeleteBigNum(&six);
+ DeleteBigNum(&e);
+ DeleteBigNum(&one);
+ DeleteFfElement(&xi);
+ if (kEpidNoErr != result) {
+ if (pairing_state_ctx) {
+ int i = 0;
+ int j = 0;
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 5; j++) {
+ DeleteFfElement(&pairing_state_ctx->g[i][j]);
+ }
+ }
+ DeleteBigNum(&pairing_state_ctx->t);
+ SAFE_FREE(pairing_state_ctx);
+ }
+ }
+ return result;
+}
+
+void DeletePairingState(PairingState** ps) {
+ if (!ps) {
+ return;
+ }
+ if (!*ps) {
+ return;
+ }
+ if (ps) {
+ if (*ps) {
+ int i = 0;
+ int j = 0;
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 5; j++) {
+ DeleteFfElement(&(*ps)->g[i][j]);
+ }
+ }
+ DeleteBigNum(&(*ps)->t);
+ (*ps)->ga = NULL;
+ (*ps)->gb = NULL;
+ (*ps)->ff = NULL;
+ }
+ SAFE_FREE(*ps);
+ }
+}
+
+EpidStatus Pairing(PairingState* ps, EcPoint const* a, EcPoint const* b,
+ FfElement* d) {
+ EpidStatus result = kEpidErr;
+ FfElement* ax = NULL;
+ FfElement* ay = NULL;
+ FfElement* bx = NULL;
+ FfElement* by = NULL;
+ FfElement* x = NULL;
+ FfElement* y = NULL;
+ FfElement* z = NULL;
+ FfElement* z2 = NULL;
+ FfElement* bx_ = NULL;
+ FfElement* by_ = NULL;
+ FfElement* f = NULL;
+ BigNum* s = NULL;
+ BigNum* two = NULL;
+ BigNum* six = NULL;
+ FfElement* neg_qy = NULL;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ Ipp32u two_dat[] = {2};
+ Ipp32u six_dat[] = {6};
+ Ipp32u one_dat[] = {1};
+ G1ElemStr first_val_str = {0};
+ G2ElemStr second_val_str = {0};
+ bool in_group = true;
+ int s_ternary[sizeof(BigNumStr) * CHAR_BIT] = {0};
+ int i = 0;
+ int n = 0;
+ // check parameters
+ if (!ps || !d || !a || !b) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!ps->Fq || !ps->Fq2) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!d->ipp_ff_elem || !a->ipp_ec_pt || !b->ipp_ec_pt || !ps->ff ||
+ !ps->ff->ipp_ff || !ps->Fq->ipp_ff || !ps->Fq2->ipp_ff || !ps->t ||
+ !ps->t->ipp_bn || !ps->ga || !ps->ga->ipp_ec || !ps->gb ||
+ !ps->gb->ipp_ec) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // Let ax, ay be elements in Fq. Let bx, by, x, y, z, z2, bx', by'
+ // be elements in Fq2. Let f be a variable in GT.
+ result = NewFfElement(ps->Fq, &ax);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &ay);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &bx);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &by);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &x);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &y);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &z);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &z2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &bx_);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &by_);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &f);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &neg_qy);
+ BREAK_ON_EPID_ERROR(result);
+
+ // 1. If neg = 0, compute integer s = 6t + 2, otherwise, compute
+ // s = 6t - 2
+ result = NewBigNum(sizeof(BigNumStr), &s);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(BigNumStr), &two);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsSet_BN(IppsBigNumPOS, sizeof(two_dat) / sizeof(Ipp32u), two_dat,
+ two->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = NewBigNum(sizeof(BigNumStr), &six);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsSet_BN(IppsBigNumPOS, sizeof(six_dat) / sizeof(Ipp32u), six_dat,
+ six->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsMul_BN(six->ipp_bn, ps->t->ipp_bn, s->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ if (ps->neg) {
+ sts = ippsSub_BN(s->ipp_bn, two->ipp_bn, s->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ } else {
+ sts = ippsAdd_BN(s->ipp_bn, two->ipp_bn, s->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 2. Let sn...s1s0 be the ternary representation of s, that is s =
+ // s0 + 2*s1 + ... + 2^n*sn, where si is in {-1, 0, 1}.
+ result =
+ Ternary(s_ternary, &n, sizeof(s_ternary) / sizeof(s_ternary[0]), s);
+ BREAK_ON_EPID_ERROR(result);
+ // 3. Set (ax, ay) = E(Fq).outputPoint(a)
+ // check if a is in ga that was used to create ps
+ result = WriteEcPoint(ps->ga, a, &first_val_str, sizeof(first_val_str));
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ EcInGroup(ps->ga, &first_val_str, sizeof(first_val_str), &in_group);
+ BREAK_ON_EPID_ERROR(result);
+ if (false == in_group) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ sts = ippsGFpECGetPoint(a->ipp_ec_pt, ax->ipp_ff_elem, ay->ipp_ff_elem,
+ ps->ga->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Set (bx, by) = E(Fq2).outputPoint(b).
+ // check if b is in gb that was used to create ps
+ result = WriteEcPoint(ps->gb, b, &second_val_str, sizeof(second_val_str));
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ EcInGroup(ps->gb, &second_val_str, sizeof(second_val_str), &in_group);
+ BREAK_ON_EPID_ERROR(result);
+ if (false == in_group) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ sts = ippsGFpECGetPoint(b->ipp_ec_pt, bx->ipp_ff_elem, by->ipp_ff_elem,
+ ps->gb->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 5. Set X = bx, Y = by, Z = Z2 = 1.
+ sts = ippsGFpCpyElement(bx->ipp_ff_elem, x->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpCpyElement(by->ipp_ff_elem, y->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement(one_dat, sizeof(one_dat) / sizeof(Ipp32u),
+ z->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement(one_dat, sizeof(one_dat) / sizeof(Ipp32u),
+ z2->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 6. Set d = 1.
+ sts = ippsGFpSetElement(one_dat, sizeof(one_dat) / sizeof(Ipp32u),
+ d->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 7. For i = n-1, ..., 0, do the following:
+ for (i = n - 1; i >= 0; i--) {
+ // a. Set (f, x, y, z, z2) = tangent(ax, ay, x, y, z, z2),
+ result = Tangent(ps->ff, f, x, y, z, z2, ax, ay, x, y, z, z2);
+ BREAK_ON_EPID_ERROR(result);
+ // b. Set d = Fq12.square(d),
+ sts = ippsGFpMul(d->ipp_ff_elem, d->ipp_ff_elem, d->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // c. Set d = Fq12.mulSpecial(d, f),
+ result = MulSpecial(d, d, f, ps);
+ BREAK_ON_EPID_ERROR(result);
+ // d. If s[i] = -1 then
+ if (-1 == s_ternary[i]) {
+ // i. Set (f, x, y, z, z2) = line(ax, ay, x, y, z, z2, bx,
+ // -by),
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpNeg(by->ipp_ff_elem, neg_qy->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = Line(ps->ff, f, x, y, z, z2, ax, ay, x, y, z, z2, bx, neg_qy);
+ BREAK_ON_EPID_ERROR(result);
+ // ii. Set d = Fq12.mulSpecial(d, f).
+ result = MulSpecial(d, d, f, ps);
+ BREAK_ON_EPID_ERROR(result);
+ }
+ // e. If s[i] = 1 then
+ if (1 == s_ternary[i]) {
+ // i. Set (f, x, y, z, z2) = line(ax, ay, x, y, z, z2, bx,
+ // by),
+ result = Line(ps->ff, f, x, y, z, z2, ax, ay, x, y, z, z2, bx, by);
+ BREAK_ON_EPID_ERROR(result);
+ // ii. Set d = Fq12.mulSpecial(d, f).
+ result = MulSpecial(d, d, f, ps);
+ BREAK_ON_EPID_ERROR(result);
+ }
+ }
+
+ // 8. if neg = true,
+ if (ps->neg) {
+ // a. Set Y = Fq2.negate(y),
+ sts = ippsGFpNeg(y->ipp_ff_elem, y->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // b. Set d = Fq12.conjugate(d).
+ sts = ippsGFpConj(d->ipp_ff_elem, d->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 9. Set (bx', by') = Pi-op(bx, by, 1).
+ result = PiOp(ps, bx_, by_, bx, by, 1);
+ BREAK_ON_EPID_ERROR(result);
+ // 10. Set (f, x, y, z, z2) = line(ax, ay, x, y, z, z2, bx', by').
+ result = Line(ps->ff, f, x, y, z, z2, ax, ay, x, y, z, z2, bx_, by_);
+ BREAK_ON_EPID_ERROR(result);
+ // 11. Set d = Fq12.mulSpecial(d, f).
+ result = MulSpecial(d, d, f, ps);
+ BREAK_ON_EPID_ERROR(result);
+ // 12. Set (bx', by') = piOp(bx, by, 2).
+ result = PiOp(ps, bx_, by_, bx, by, 2);
+ BREAK_ON_EPID_ERROR(result);
+ // 13. Set by' = Fq2.negate(by').
+ sts = ippsGFpNeg(by_->ipp_ff_elem, by_->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 14. Set (f, x, y, z, z2) = line(ax, ay, x, y, z, z2, bx', by').
+ result = Line(ps->ff, f, x, y, z, z2, ax, ay, x, y, z, z2, bx_, by_);
+ BREAK_ON_EPID_ERROR(result);
+ // 15. Set d = Fq12.mulSpecial(d, f).
+ result = MulSpecial(d, d, f, ps);
+ BREAK_ON_EPID_ERROR(result);
+ // 16. Set d = finalExp(d).
+ result = FinalExp(ps, d, d);
+ BREAK_ON_EPID_ERROR(result);
+ // 17. Return d.
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&ax);
+ DeleteFfElement(&ay);
+ DeleteFfElement(&bx);
+ DeleteFfElement(&by);
+ DeleteFfElement(&x);
+ DeleteFfElement(&y);
+ DeleteFfElement(&z);
+ DeleteFfElement(&z2);
+ DeleteFfElement(&bx_);
+ DeleteFfElement(&by_);
+ DeleteFfElement(&f);
+ DeleteFfElement(&neg_qy);
+
+ DeleteBigNum(&s);
+ DeleteBigNum(&two);
+ DeleteBigNum(&six);
+
+ return result;
+}
+
+/*
+d = finalExp(h)
+Input: h (an element in GT)
+Output: d (an element in GT) where d = GT.exp(h, (q^12-1)/p)
+*/
+static EpidStatus FinalExp(PairingState* ps, FfElement* d, FfElement const* h) {
+ EpidStatus result = kEpidErr;
+ FfElement* f = NULL;
+ FfElement* f1 = NULL;
+ FfElement* f2 = NULL;
+ FfElement* f3 = NULL;
+ FfElement* ft1 = NULL;
+ FfElement* ft2 = NULL;
+ FfElement* ft3 = NULL;
+ FfElement* fp1 = NULL;
+ FfElement* fp2 = NULL;
+ FfElement* fp3 = NULL;
+ FfElement* y0 = NULL;
+ FfElement* y1 = NULL;
+ FfElement* y2 = NULL;
+ FfElement* y3 = NULL;
+ FfElement* y4 = NULL;
+ FfElement* y5 = NULL;
+ FfElement* y6 = NULL;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ do {
+ IppStatus sts = ippStsNoErr;
+ // Check parameters
+ if (!ps || !d || !h) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!d->ipp_ff_elem || !h->ipp_ff_elem || !ps->ff || !ps->ff->ipp_ff ||
+ !ps->t || !ps->t->ipp_bn) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // Let f, f1, f2, f3, ft1, ft2, ft3, fp1, fp2, fp3, y0, y1, y2,
+ // y3, y4, y5, y6, t0, t1 be temporary variables in GT. All the
+ // following operations are computed in Fq12 unless explicitly
+ // specified.
+ result = NewFfElement(ps->ff, &f);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &f1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &f2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &f3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &ft1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &ft2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &ft3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &fp1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &fp2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &fp3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y0);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y4);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y5);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &y6);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &t0);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ // 1. Set f1 = Fq12.conjugate(h).
+ sts = ippsGFpConj(h->ipp_ff_elem, f1->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Set f2 = Fq12.inverse(h).
+ sts = ippsGFpInv(h->ipp_ff_elem, f2->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 3. Set f = f1 * f2.
+ sts = ippsGFpMul(f1->ipp_ff_elem, f2->ipp_ff_elem, f->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Set f3 = frobeniusOp(f, 2).
+ result = FrobeniusOp(ps, f3, f, 2);
+ BREAK_ON_EPID_ERROR(result);
+ // 5. Set f = f3 * f.
+ sts = ippsGFpMul(f3->ipp_ff_elem, f->ipp_ff_elem, f->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 6. Set ft1 = Fq12.expCyclotomic (f, t).
+ result = ExpCyclotomic(ps, ft1, f, ps->t);
+ BREAK_ON_EPID_ERROR(result);
+ // 7. If neg = true, ft1 = Fq12.conjugate(ft1).
+ if (ps->neg) {
+ sts = ippsGFpConj(ft1->ipp_ff_elem, ft1->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 8. Set ft2 = Fq12.expCyclotomic (ft1, t).
+ result = ExpCyclotomic(ps, ft2, ft1, ps->t);
+ BREAK_ON_EPID_ERROR(result);
+ // 9. If neg = true, ft2 = Fq12.conjugate(ft2).
+ if (ps->neg) {
+ sts = ippsGFpConj(ft2->ipp_ff_elem, ft2->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 10. Set ft3 = Fq12.expCyclotomic (ft2, t).
+ result = ExpCyclotomic(ps, ft3, ft2, ps->t);
+ BREAK_ON_EPID_ERROR(result);
+ // 11. If neg = true, ft3 = Fq12.conjugate(ft3).
+ if (ps->neg) {
+ sts = ippsGFpConj(ft3->ipp_ff_elem, ft3->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 12. Set fp1 = frobeniusOp(f, 1).
+ result = FrobeniusOp(ps, fp1, f, 1);
+ BREAK_ON_EPID_ERROR(result);
+ // 13. Set fp2 = frobeniusOp(f, 2).
+ result = FrobeniusOp(ps, fp2, f, 2);
+ BREAK_ON_EPID_ERROR(result);
+ // 14. Set fp3 = frobeniusOp(f, 3).
+ result = FrobeniusOp(ps, fp3, f, 3);
+ BREAK_ON_EPID_ERROR(result);
+ // 15. Set y0 = fp1 * fp2 * fp3.
+ sts = ippsGFpMul(fp1->ipp_ff_elem, fp2->ipp_ff_elem, y0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(y0->ipp_ff_elem, fp3->ipp_ff_elem, y0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 16. Set y1 = Fq12.conjugate(f).
+ sts = ippsGFpConj(f->ipp_ff_elem, y1->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 17. Set y2 = frobeniusOp(ft2, 2).
+ result = FrobeniusOp(ps, y2, ft2, 2);
+ BREAK_ON_EPID_ERROR(result);
+ // 18. Set y3 = frobeniusOp(ft1, 1).
+ result = FrobeniusOp(ps, y3, ft1, 1);
+ BREAK_ON_EPID_ERROR(result);
+ // 19. Set y3 = Fq12.conjugate(y3).
+ sts = ippsGFpConj(y3->ipp_ff_elem, y3->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 20. Set y4 = frobeniusOp(ft2, 1).
+ result = FrobeniusOp(ps, y4, ft2, 1);
+ BREAK_ON_EPID_ERROR(result);
+ // 21. Set y4 = y4 * ft1.
+ sts = ippsGFpMul(y4->ipp_ff_elem, ft1->ipp_ff_elem, y4->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 22. Set y4 = Fq12.conjugate(y4).
+ sts = ippsGFpConj(y4->ipp_ff_elem, y4->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 23. Set y5 = Fq12.conjugate(ft2).
+ sts = ippsGFpConj(ft2->ipp_ff_elem, y5->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 24. Set y6 = frobeniusOp(ft3, 1).
+ result = FrobeniusOp(ps, y6, ft3, 1);
+ BREAK_ON_EPID_ERROR(result);
+ // 25. Set y6 = y6 * ft3.
+ sts = ippsGFpMul(y6->ipp_ff_elem, ft3->ipp_ff_elem, y6->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 26. Set y6 = Fq12.conjugate(y6).
+ sts = ippsGFpConj(y6->ipp_ff_elem, y6->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 27. Set t0 = Fq12.squareCyclotomic(y6).
+ result = SquareCyclotomic(ps, t0, y6);
+ BREAK_ON_EPID_ERROR(result);
+ // 28. Set t0 = t0 * y4 * y5.
+ sts = ippsGFpMul(t0->ipp_ff_elem, y4->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(t0->ipp_ff_elem, y5->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 29. Set t1 = y3 * y5 * t0.
+ sts = ippsGFpMul(y3->ipp_ff_elem, y5->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(t1->ipp_ff_elem, t0->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 30. Set t0 = t0 * y2.
+ sts = ippsGFpMul(t0->ipp_ff_elem, y2->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 31. Set t1 = Fq12.squareCyclotomic(t1).
+ result = SquareCyclotomic(ps, t1, t1);
+ BREAK_ON_EPID_ERROR(result);
+ // 32. Set t1 = t1 * t0.
+ sts = ippsGFpMul(t1->ipp_ff_elem, t0->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 33. Set t1 = Fq12.squareCyclotomic(t1).
+ result = SquareCyclotomic(ps, t1, t1);
+ BREAK_ON_EPID_ERROR(result);
+ // 34. Set t0 = t1 * y1.
+ sts = ippsGFpMul(t1->ipp_ff_elem, y1->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 35. Set t1 = t1 * y0.
+ sts = ippsGFpMul(t1->ipp_ff_elem, y0->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 36. Set t0 = Fq12.squareCyclotomic(t0).
+ result = SquareCyclotomic(ps, t0, t0);
+ BREAK_ON_EPID_ERROR(result);
+ // 37. Set d = t1 * t0.
+ sts = ippsGFpMul(t1->ipp_ff_elem, t0->ipp_ff_elem, d->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 38. Return d.
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&f);
+ DeleteFfElement(&f1);
+ DeleteFfElement(&f2);
+ DeleteFfElement(&f3);
+ DeleteFfElement(&ft1);
+ DeleteFfElement(&ft2);
+ DeleteFfElement(&ft3);
+ DeleteFfElement(&fp1);
+ DeleteFfElement(&fp2);
+ DeleteFfElement(&fp3);
+ DeleteFfElement(&y0);
+ DeleteFfElement(&y1);
+ DeleteFfElement(&y2);
+ DeleteFfElement(&y3);
+ DeleteFfElement(&y4);
+ DeleteFfElement(&y5);
+ DeleteFfElement(&y6);
+ DeleteFfElement(&t0);
+ DeleteFfElement(&t1);
+
+ return result;
+}
+
+/*
+(x', y') = piOp(x, y, e)
+Input: x, y (elements in Fq2), e (an integer of value 1 or 2)
+Output: x', y' (elements in Fq2)
+*/
+static EpidStatus PiOp(PairingState* ps, FfElement* x_out, FfElement* y_out,
+ FfElement const* x, FfElement const* y, const int e) {
+ IppStatus sts = ippStsNoErr;
+ IppsGFpState* Fq2 = 0;
+ IppsGFpState* Fq6 = 0;
+ FiniteField* Ffq12 = 0;
+ FiniteField* Ffq6 = 0;
+ FiniteField* Ffq2 = 0;
+ // check parameters
+ if (!ps || !x_out || !y_out || !x || !y) {
+ return kEpidBadArgErr;
+ }
+ if (e < 1 || e > 3) {
+ return kEpidBadArgErr;
+ }
+ Ffq12 = ps->ff;
+ // get Fq6, Fq2
+ if (!Ffq12) {
+ return kEpidBadArgErr;
+ }
+ Ffq6 = Ffq12->ground_ff;
+ if (!Ffq6) {
+ return kEpidBadArgErr;
+ }
+ Fq6 = Ffq6->ipp_ff;
+ Ffq2 = Ffq6->ground_ff;
+ if (!Ffq2) {
+ return kEpidBadArgErr;
+ }
+ Fq2 = Ffq2->ipp_ff;
+ // 1. Set x' = x and y' = y.
+ sts = ippsGFpCpyElement(x->ipp_ff_elem, x_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ sts = ippsGFpCpyElement(y->ipp_ff_elem, y_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ if (1 == e) {
+ // 2. If e = 1,
+ // a. Compute x' = Fq2.conjugate(x').
+ sts = ippsGFpConj(x_out->ipp_ff_elem, x_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ // b. Compute y' = Fq2.conjugate(y').
+ sts = ippsGFpConj(y_out->ipp_ff_elem, y_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ }
+ // 3. Compute x' = Fq2.mul(x', g[e-1][1]).
+ sts = ippsGFpMul(x_out->ipp_ff_elem, ps->g[e - 1][1]->ipp_ff_elem,
+ x_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ // 4. Compute y' = Fq2.mul(y', g[e-1][2]).
+ sts = ippsGFpMul(y_out->ipp_ff_elem, ps->g[e - 1][2]->ipp_ff_elem,
+ y_out->ipp_ff_elem, Fq2);
+ RETURN_ON_IPP_ERROR(sts);
+ // 5. Return (x', y').
+ return kEpidNoErr;
+}
+
+/*
+d = frobeniusOp(a, e)
+Input: a (an element in GT), e (an integer of value 1, 2, or 3)
+Output: d (an element in GT) such that d = GT.exp(a, qe)
+
+*/
+static EpidStatus FrobeniusOp(PairingState* ps, FfElement* d_out,
+ FfElement const* a, const int e) {
+ EpidStatus result = kEpidErr;
+ FfElement* d[6] = {0};
+ size_t i = 0;
+ Fq12ElemDat a_dat = {0};
+ Fq12ElemDat d_dat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+ // check parameters
+ if (!ps || !d_out || !a) {
+ return kEpidBadArgErr;
+ }
+ if (!ps->ff || !ps->Fq2) {
+ return kEpidBadArgErr;
+ }
+ if (e < 1 || e > 3 || !d_out->ipp_ff_elem || !a->ipp_ff_elem ||
+ !ps->ff->ipp_ff || !ps->Fq2->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+
+ for (i = 0; i < sizeof(d) / sizeof(FfElement*); i++) {
+ result = NewFfElement(ps->Fq2, &d[i]);
+ BREAK_ON_EPID_ERROR(result);
+ }
+
+ // 1. Let a = ((a[0], a[2], a[4]), (a[1], a[3], a[5])).
+ sts = ippsGFpGetElement(a->ipp_ff_elem, (BNU)&a_dat,
+ sizeof(a_dat) / sizeof(Ipp32u), ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Let d = ((d[0], d[2], d[4]), (d[1], d[3], d[5])).
+ // 3. For i = 0, ..., 5,
+ // a. set d[i] = a[i].
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0].x[0],
+ sizeof(a_dat.x[0].x[0]) / sizeof(Ipp32u),
+ d[0]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0].x[1],
+ sizeof(a_dat.x[0].x[1]) / sizeof(Ipp32u),
+ d[2]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0].x[2],
+ sizeof(a_dat.x[0].x[2]) / sizeof(Ipp32u),
+ d[4]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1].x[0],
+ sizeof(a_dat.x[1].x[0]) / sizeof(Ipp32u),
+ d[1]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1].x[1],
+ sizeof(a_dat.x[1].x[1]) / sizeof(Ipp32u),
+ d[3]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1].x[2],
+ sizeof(a_dat.x[1].x[2]) / sizeof(Ipp32u),
+ d[5]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ // b. If e = 1 or 3, set d[i] = Fq2.conjugate(d[i]).
+ if (1 == e || 3 == e) {
+ for (i = 0; i < sizeof(d) / sizeof(FfElement*); i++) {
+ sts =
+ ippsGFpConj(d[i]->ipp_ff_elem, d[i]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ }
+ // 4. For i = 1, ..., 5, compute d[i] = Fq2.mul(d[i], g[e-1][i-1]).
+ for (i = 1; i < sizeof(d) / sizeof(FfElement*); i++) {
+ sts = ippsGFpMul(d[i]->ipp_ff_elem, ps->g[e - 1][i - 1]->ipp_ff_elem,
+ d[i]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 5. Return d.
+ sts = ippsGFpGetElement(d[0]->ipp_ff_elem, (BNU)&d_dat.x[0].x[0],
+ sizeof(d_dat.x[0].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(d[2]->ipp_ff_elem, (BNU)&d_dat.x[0].x[1],
+ sizeof(d_dat.x[0].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(d[4]->ipp_ff_elem, (BNU)&d_dat.x[0].x[2],
+ sizeof(d_dat.x[0].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(d[1]->ipp_ff_elem, (BNU)&d_dat.x[1].x[0],
+ sizeof(d_dat.x[1].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(d[3]->ipp_ff_elem, (BNU)&d_dat.x[1].x[1],
+ sizeof(d_dat.x[1].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(d[5]->ipp_ff_elem, (BNU)&d_dat.x[1].x[2],
+ sizeof(d_dat.x[1].x[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&d_dat, sizeof(d_dat) / sizeof(Ipp32u),
+ d_out->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_dat, sizeof(a_dat));
+ EpidZeroMemory(&d_dat, sizeof(d_dat));
+ for (i = 0; i < sizeof(d) / sizeof(FfElement*); i++) {
+ DeleteFfElement(&d[i]);
+ }
+
+ return result;
+}
+
+/*
+(f, X', Y', Z', Z2') = line(Px, Py, X, Y, Z, Z2, Qx, Qy)
+Input: Px, Py (elements in Fq), X, Y, Z, Z2, Qx, Qy (elements in Fq2)
+Output: f (an element in GT), X', Y', Z', Z2' (elements in Fq2)
+*/
+static EpidStatus Line(FiniteField* gt, FfElement* f, FfElement* x_out,
+ FfElement* y_out, FfElement* z_out, FfElement* z2_out,
+ FfElement const* px, FfElement const* py,
+ FfElement const* x, FfElement const* y,
+ FfElement const* z, FfElement const* z2,
+ FfElement const* qx, FfElement const* qy) {
+ EpidStatus result = kEpidNotImpl;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* t4 = NULL;
+ FfElement* t5 = NULL;
+ FfElement* t6 = NULL;
+ FfElement* t7 = NULL;
+ FfElement* t8 = NULL;
+ FfElement* t9 = NULL;
+ FfElement* t10 = NULL;
+ FfElement* t = NULL;
+ Fq12ElemDat fDat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+ IppsGFpState* Fq2 = 0;
+ IppsGFpState* Fq6 = 0;
+ FiniteField* Ffq6 = 0;
+ FiniteField* Ffq2 = 0;
+
+ // check parameters
+ if (!f || !x_out || !y_out || !z_out || !z2_out || !px || !py || !x || !y ||
+ !z || !z2 || !qx || !qy || !gt) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!f->ipp_ff_elem || !x_out->ipp_ff_elem || !y_out->ipp_ff_elem ||
+ !z_out->ipp_ff_elem || !z2_out->ipp_ff_elem || !px->ipp_ff_elem ||
+ !py->ipp_ff_elem || !x->ipp_ff_elem || !y->ipp_ff_elem ||
+ !z->ipp_ff_elem || !z2->ipp_ff_elem || !qx->ipp_ff_elem ||
+ !qy->ipp_ff_elem || !gt->ipp_ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // get Fq6, Fq2
+ Ffq6 = gt->ground_ff;
+ if (!Ffq6) {
+ return kEpidBadArgErr;
+ }
+ Fq6 = Ffq6->ipp_ff;
+ Ffq2 = Ffq6->ground_ff;
+ if (!Ffq2) {
+ return kEpidBadArgErr;
+ }
+ Fq2 = Ffq2->ipp_ff;
+ // Let t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 be temporary
+ // elements in Fq2. All the following operations are computed in
+ // Fq2 unless explicitly specified.
+ result = NewFfElement(Ffq2, &t0);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t3);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t4);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t5);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t6);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t7);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t8);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t9);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t10);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Ffq2, &t);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 1. Set t0 = Qx * Z2.
+ sts =
+ ippsGFpMul(qx->ipp_ff_elem, z2_out->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Set t1 = (Qy + Z)^2 - Qy * Qy - Z2.
+ sts = ippsGFpAdd(qy->ipp_ff_elem, z->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(t1->ipp_ff_elem, t1->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(qy->ipp_ff_elem, qy->ipp_ff_elem, t->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t1->ipp_ff_elem, t->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t1->ipp_ff_elem, z2->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 3. Set t1 = t1 * Z2.
+ sts =
+ ippsGFpMul(t1->ipp_ff_elem, z2_out->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Set t2 = t0 - X.
+ sts = ippsGFpSub(t0->ipp_ff_elem, x->ipp_ff_elem, t2->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 5. Set t3 = t2 * t2.
+ sts = ippsGFpMul(t2->ipp_ff_elem, t2->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 6. Set t4 = 4 * t3.
+ sts = ippsGFpAdd(t3->ipp_ff_elem, t3->ipp_ff_elem, t4->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(t4->ipp_ff_elem, t4->ipp_ff_elem, t4->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 7. Set t5 = t4 * t2.
+ sts = ippsGFpMul(t4->ipp_ff_elem, t2->ipp_ff_elem, t5->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 8. Set t6 = t1 - Y - Y.
+ sts = ippsGFpSub(t1->ipp_ff_elem, y->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t6->ipp_ff_elem, y->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 9. Set t9 = t6 * Qx.
+ sts = ippsGFpMul(t6->ipp_ff_elem, qx->ipp_ff_elem, t9->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 10. Set t7 = X * t4.
+ sts = ippsGFpMul(x->ipp_ff_elem, t4->ipp_ff_elem, t7->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 11. X' = t6 * t6 - t5 - t7 - t7.
+ sts = ippsGFpMul(t6->ipp_ff_elem, t6->ipp_ff_elem, x_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(x_out->ipp_ff_elem, t5->ipp_ff_elem, x_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(x_out->ipp_ff_elem, t7->ipp_ff_elem, x_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(x_out->ipp_ff_elem, t7->ipp_ff_elem, x_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 12. Set Z' = (Z + t2)^2 - Z2 - t3.
+ sts = ippsGFpAdd(z->ipp_ff_elem, t2->ipp_ff_elem, z_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(z_out->ipp_ff_elem, z_out->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(z_out->ipp_ff_elem, z2->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(z_out->ipp_ff_elem, t3->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 13. Set t10 = Qy + Z'.
+ sts =
+ ippsGFpAdd(qy->ipp_ff_elem, z_out->ipp_ff_elem, t10->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 14. Set t8 = (t7 - X') * t6.
+ sts = ippsGFpSub(t7->ipp_ff_elem, x_out->ipp_ff_elem, t8->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(t8->ipp_ff_elem, t6->ipp_ff_elem, t8->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 15. Set t0 = 2 * Y * t5.
+ sts = ippsGFpMul(y->ipp_ff_elem, t5->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(t0->ipp_ff_elem, t0->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 16. Set Y' = t8 - t0.
+ sts = ippsGFpSub(t8->ipp_ff_elem, t0->ipp_ff_elem, y_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 17. Set Z2' = Z' * Z'.
+ sts = ippsGFpMul(z_out->ipp_ff_elem, z_out->ipp_ff_elem,
+ z2_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 18. Set t10 = t10 * t10 - Qy * Qy - Z2'.
+ sts = ippsGFpMul(t10->ipp_ff_elem, t10->ipp_ff_elem, t10->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t10->ipp_ff_elem, t->ipp_ff_elem, t10->ipp_ff_elem,
+ Fq2); // t still Qy*Qy
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t10->ipp_ff_elem, z2_out->ipp_ff_elem, t10->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 19. Set t9 = t9 + t9 - t10.
+ sts = ippsGFpAdd(t9->ipp_ff_elem, t9->ipp_ff_elem, t9->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t9->ipp_ff_elem, t10->ipp_ff_elem, t9->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 20. Set t10 = Fq2.mul(Z', Py).
+ sts = ippsGFpMul_PE(z_out->ipp_ff_elem, py->ipp_ff_elem, t10->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 21. Set t10 = t10 + t10.
+ sts = ippsGFpAdd(t10->ipp_ff_elem, t10->ipp_ff_elem, t10->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 22. Set t6 = -t6.
+ sts = ippsGFpNeg(t6->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 23. Set t1 = Fq2.mul(t6, Px).
+ sts = ippsGFpMul_PE(t6->ipp_ff_elem, px->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 24. Set t1 = t1 + t1.
+ sts = ippsGFpAdd(t1->ipp_ff_elem, t1->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 25. Set f = ((t10, 0, 0), (t1, t9, 0)).
+ sts = ippsGFpGetElement(t10->ipp_ff_elem, (BNU)&fDat.x[0].x[0],
+ sizeof(fDat.x[0].x[0]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(t1->ipp_ff_elem, (BNU)&fDat.x[1].x[0],
+ sizeof(fDat.x[1].x[0]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(t9->ipp_ff_elem, (BNU)&fDat.x[1].x[1],
+ sizeof(fDat.x[1].x[1]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&fDat, sizeof(fDat) / sizeof(Ipp32u),
+ f->ipp_ff_elem, gt->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 26. Return (f, X', Y', Z', Z2').
+ } while (0);
+ EpidZeroMemory(&fDat, sizeof(fDat));
+ DeleteFfElement(&t);
+ DeleteFfElement(&t10);
+ DeleteFfElement(&t9);
+ DeleteFfElement(&t8);
+ DeleteFfElement(&t7);
+ DeleteFfElement(&t6);
+ DeleteFfElement(&t5);
+ DeleteFfElement(&t4);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t0);
+
+ return (result);
+}
+
+/*
+(f, X', Y', Z', Z2') = tangent(Px, Py, X, Y, Z, Z2)
+Input: Px, Py (elements in Fq), X, Y, Z, Z2 (elements in Fq2)
+Output: f (an element in GT), X', Y', Z', Z2' (elements in Fq2)
+Steps:
+*/
+static EpidStatus Tangent(FiniteField* gt, FfElement* f, FfElement* x_out,
+ FfElement* y_out, FfElement* z_out, FfElement* z2_out,
+ FfElement const* px, FfElement const* py,
+ FfElement const* x, FfElement const* y,
+ FfElement const* z, FfElement const* z2) {
+ EpidStatus result = kEpidErr;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* t4 = NULL;
+ FfElement* t5 = NULL;
+ FfElement* t6 = NULL;
+ Fq12ElemDat fDat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+ IppsGFpState* Fq2 = NULL;
+ IppsGFpState* Fq6 = NULL;
+ FiniteField* Ffq2 = NULL;
+ FiniteField* Ffq6 = NULL;
+
+ int i = 0;
+ // validate input
+ if (!gt || !f || !x_out || !y_out || !z_out || !z2_out || !px || !py ||
+ !x || !y || !z || !z2) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!gt->ipp_ff || !f->ipp_ff_elem || !x_out->ipp_ff_elem ||
+ !y_out->ipp_ff_elem || !z_out->ipp_ff_elem || !z2_out->ipp_ff_elem ||
+ !px->ipp_ff_elem || !py->ipp_ff_elem || !x->ipp_ff_elem ||
+ !y->ipp_ff_elem || !z->ipp_ff_elem || !z2->ipp_ff_elem) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ // get Fq2, Fq6
+ Ffq6 = gt->ground_ff;
+ if (!Ffq6) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq6 = Ffq6->ipp_ff;
+ Ffq2 = Ffq6->ground_ff;
+ if (!Ffq2) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq2 = Ffq2->ipp_ff;
+ // Let t0, t1, t2, t3, t4, t5, t6 be elements in Fq2. All the following
+ // operations are computed in Fq2 unless explicitly specified.
+ // 1. Set t0 = X * X.
+ result = NewFfElement(Ffq2, &t0);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpMul(x->ipp_ff_elem, x->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Set t1 = Y * Y.
+ result = NewFfElement(Ffq2, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpMul(y->ipp_ff_elem, y->ipp_ff_elem, t1->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 3. Set t2 = t1 * t1.
+ result = NewFfElement(Ffq2, &t2);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpMul(t1->ipp_ff_elem, t1->ipp_ff_elem, t2->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Set t3 = (t1 + X)^2 - t0 - t2.
+ result = NewFfElement(Ffq2, &t3);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpAdd(t1->ipp_ff_elem, x->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(t3->ipp_ff_elem, t3->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t3->ipp_ff_elem, t0->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t3->ipp_ff_elem, t2->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 5. Set t3 = t3 + t3.
+ sts = ippsGFpAdd(t3->ipp_ff_elem, t3->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 6. Set t4 = 3 * t0.
+ result = NewFfElement(Ffq2, &t4);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpAdd(t0->ipp_ff_elem, t0->ipp_ff_elem, t4->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(t4->ipp_ff_elem, t0->ipp_ff_elem, t4->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 7. Set t6 = X + t4.
+ result = NewFfElement(Ffq2, &t6);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpAdd(x->ipp_ff_elem, t4->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 8. Set t5 = t4 * t4.
+ result = NewFfElement(Ffq2, &t5);
+ BREAK_ON_EPID_ERROR(result);
+ sts = ippsGFpMul(t4->ipp_ff_elem, t4->ipp_ff_elem, t5->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 9. Set X' = t5 - t3 - t3.
+ sts = ippsGFpSub(t5->ipp_ff_elem, t3->ipp_ff_elem, x_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(x_out->ipp_ff_elem, t3->ipp_ff_elem, x_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 10.Set Z' = (Y + Z)^2 - t1 - Z2.
+ sts = ippsGFpAdd(y->ipp_ff_elem, z->ipp_ff_elem, z_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(z_out->ipp_ff_elem, z_out->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(z_out->ipp_ff_elem, t1->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(z_out->ipp_ff_elem, z2->ipp_ff_elem, z_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 11.Set Y' = (t3 - X') * t4 - 8 * t2.
+ sts = ippsGFpSub(t3->ipp_ff_elem, x_out->ipp_ff_elem, y_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpMul(y_out->ipp_ff_elem, t4->ipp_ff_elem, y_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ for (i = 0; i < 8; i++) {
+ sts = ippsGFpSub(y_out->ipp_ff_elem, t2->ipp_ff_elem, y_out->ipp_ff_elem,
+ Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 12.Set t3 = -2 * (t4 * Z2).
+ sts = ippsGFpMul(t4->ipp_ff_elem, z2->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(t3->ipp_ff_elem, t3->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpNeg(t3->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 13.Set t3 = Fq2.mul(t3, Px).
+ sts = ippsGFpMul_PE(t3->ipp_ff_elem, px->ipp_ff_elem, t3->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 14.Set t6 = t6 * t6 - t0 - t5 - 4 * t1.
+ sts = ippsGFpMul(t6->ipp_ff_elem, t6->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t6->ipp_ff_elem, t0->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(t6->ipp_ff_elem, t5->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ for (i = 0; i < 4; i++) {
+ sts = ippsGFpSub(t6->ipp_ff_elem, t1->ipp_ff_elem, t6->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 15.Set t0 = 2 * (Z' * Z2).
+ sts = ippsGFpMul(z_out->ipp_ff_elem, z2->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(t0->ipp_ff_elem, t0->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 16.Set t0 = Fq2.mul(t0, Py).
+ sts = ippsGFpMul_PE(t0->ipp_ff_elem, py->ipp_ff_elem, t0->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 17.Set f = ((t0, 0, 0), (t3, t6, 0)).
+ sts = ippsGFpGetElement(t0->ipp_ff_elem, (BNU)&fDat.x[0].x[0],
+ sizeof(fDat.x[0].x[0]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(t3->ipp_ff_elem, (BNU)&fDat.x[1].x[0],
+ sizeof(fDat.x[1].x[0]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(t6->ipp_ff_elem, (BNU)&fDat.x[1].x[1],
+ sizeof(fDat.x[1].x[1]) / sizeof(Ipp32u), Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&fDat, sizeof(fDat) / sizeof(Ipp32u),
+ f->ipp_ff_elem, gt->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 18.Set Z2' = Z' * Z'.
+ sts = ippsGFpMul(z_out->ipp_ff_elem, z_out->ipp_ff_elem,
+ z2_out->ipp_ff_elem, Fq2);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 19.Return (f, X', Y', Z', Z2').
+ } while (0);
+ EpidZeroMemory(&fDat, sizeof(fDat));
+ DeleteFfElement(&t6);
+ DeleteFfElement(&t5);
+ DeleteFfElement(&t4);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t0);
+ return result;
+}
+
+/*
+(sn...s1s0) = ternary(s)
+Input: s (big integer)
+Output: sn...s1s0 (ternary representation of s)
+*/
+static EpidStatus Ternary(int* s, int* n, int max_elements, BigNum const* x) {
+ /*
+ Let xn...x1x0 be binary representation of s.
+ Let flag be a Boolean variable.
+ 1. Set flag = false.
+ 2. For i = 0, ..., n, do the following:
+ a. If xi = 1
+ i. If flag = true, set si = 0,
+ ii. Else
+ 1. If xi+1 = 1, set si = -1 and set flag = true,
+ 2. Else si = 1.
+ b. Else
+ i. If flag = true, set si = 1 and set flag = false,
+ ii. Else set si = 0.
+ 3. If flag is true
+ a. Set n = n+1,
+ b. Set sn = 1.
+ 4. Return sn...s1s0.
+ */
+ EpidStatus result = kEpidErr;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ int flag = 0;
+ int i = 0;
+ int num_bits = 0;
+ IppBNU data = 0;
+
+ // check parameters
+ if (!s || !n || !x || !x->ipp_bn) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ sts = ippsRef_BN(0, &num_bits, &data, x->ipp_bn);
+ if (ippStsNoErr != sts) {
+ result = kEpidMathErr;
+ break;
+ }
+
+ if (num_bits + 1 > max_elements) {
+ // not enough room for ternary representation
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // Let xn...x1x0 be binary representation of s. Let flag be a
+ // Boolean variable.
+ *n = num_bits - 1;
+ // 1. Set flag = false.
+ flag = 0;
+ // 2. For i = 0, ..., n, do the following:
+ for (i = 0; i < num_bits; i++) {
+ if (1 == Bit(data, i)) {
+ // a. If x[i] = 1
+ if (flag) {
+ // i. If flag = true, set si = 0,
+ s[i] = 0;
+ } else {
+ // ii. Else
+ if ((i < num_bits - 2) && Bit(data, i + 1)) {
+ // 1. If x[i+1] = 1, set s[i] = -1 and set flag = true,
+ s[i] = -1;
+ flag = 1;
+ } else {
+ // 2. Else s[i] = 1.
+ s[i] = 1;
+ }
+ }
+ } else {
+ // b. Else
+ if (flag) {
+ // i. If flag = true, set s[i] = 1 and set flag = false,
+ s[i] = 1;
+ flag = 0;
+ } else {
+ // ii. Else set s[i] = 0.
+ s[i] = 0;
+ }
+ }
+ }
+ // 3. If flag is true
+ if (flag) {
+ // a. Set n = n+1,
+ *n = *n + 1;
+ // b. Set s[n] = 1.
+ s[*n] = 1;
+ }
+ // 4. Return sn...s1s0.
+ result = kEpidNoErr;
+ } while (0);
+
+ return (result);
+}
+
+static int Bit(Ipp32u const* num, Ipp32u bit_index) {
+ return 0 != (num[bit_index >> 5] & (1 << (bit_index & 0x1F)));
+}
+
+/*
+e = Fq2.mulXi(a)
+Input: a (an element in Fq2)
+Output: e (an element in Fq2) where e = a * xi
+
+\note THIS IMPLEMENTATION ASSUMES xi[0] = 2, xi[1] = 1, beta = -1
+
+\note only should work with Fq2
+
+*/
+static EpidStatus MulXiFast(FfElement* e, FfElement const* a,
+ PairingState* ps) {
+ EpidStatus retvalue = kEpidNotImpl;
+ FfElement* a0 = NULL;
+ FfElement* a1 = NULL;
+ FfElement* e0 = NULL;
+ FfElement* e1 = NULL;
+ Fq2ElemDat a_dat = {0};
+ Fq2ElemDat e_dat = {0};
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ // check parameters
+ if (!e || !a || !ps) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!ps->Fq || !ps->Fq2) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!e->ipp_ff_elem || !a->ipp_ff_elem || !ps->Fq->ipp_ff ||
+ !ps->Fq2->ipp_ff) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ // All the following arithmetic operations are in ps->Fq.
+ // 1. Let a = (a[0], a[1]), xi = (xi[0], xi[1]), and e = (e[0], e[1]).
+ retvalue = NewFfElement(ps->Fq, &a0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq, &a1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq, &e0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq, &e1);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ sts = ippsGFpGetElement(a->ipp_ff_elem, (BNU)&a_dat,
+ sizeof(a_dat) / sizeof(Ipp32u), ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0],
+ sizeof(a_dat.x[0]) / sizeof(Ipp32u),
+ a0->ipp_ff_elem, ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1],
+ sizeof(a_dat.x[1]) / sizeof(Ipp32u),
+ a1->ipp_ff_elem, ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+
+ // 4. If xi[0] = 2, xi[1] = 1, beta = -1, then e[0] and e[1] can
+ // be computed as
+ // a. e[0] = a[0] + a[0] - a[1].
+ sts = ippsGFpAdd(a0->ipp_ff_elem, a0->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSub(e0->ipp_ff_elem, a1->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // b. e[1] = a[0] + a[1] + a[1].
+ sts = ippsGFpAdd(a0->ipp_ff_elem, a1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpAdd(e1->ipp_ff_elem, a1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 5. Return e = (e[0], e[1]).
+ sts =
+ ippsGFpGetElement(e0->ipp_ff_elem, (BNU)&e_dat.x[0],
+ sizeof(e_dat.x[0]) / sizeof(Ipp32u), ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts =
+ ippsGFpGetElement(e1->ipp_ff_elem, (BNU)&e_dat.x[1],
+ sizeof(e_dat.x[1]) / sizeof(Ipp32u), ps->Fq->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&e_dat, sizeof(e_dat) / sizeof(Ipp32u),
+ e->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ retvalue = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_dat, sizeof(a_dat));
+ EpidZeroMemory(&e_dat, sizeof(e_dat));
+ DeleteFfElement(&a0);
+ DeleteFfElement(&a1);
+ DeleteFfElement(&e0);
+ DeleteFfElement(&e1);
+
+ return (retvalue);
+}
+
+/*
+e = Fq6.MulV(a)
+Input: a (element in Fq6)
+Output: e (an element in Fq6) where e = a * V, where V = 0 * v2 + 1 * v + 0
+
+\note only should work with Fq6
+*/
+static EpidStatus MulV(FfElement* e, FfElement* a, PairingState* ps) {
+ EpidStatus retvalue = kEpidNotImpl;
+ FfElement* a2 = NULL;
+ FfElement* e0 = NULL;
+ FfElement* e1 = NULL;
+ FfElement* e2 = NULL;
+ Fq6ElemDat a_dat = {0};
+ Fq6ElemDat e_dat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+ // check parameters
+ if (!e || !a || !ps) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!ps->Fq2 || !ps->Fq6) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!e->ipp_ff_elem || !a->ipp_ff_elem || !ps->Fq2->ipp_ff ||
+ !ps->Fq6->ipp_ff) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ // 1. Let a = (a[0], a[1], a[2]) and e = (e[0], e[1], e[2]).
+ retvalue = NewFfElement(ps->Fq2, &a2);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e2);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ sts = ippsGFpGetElement(a->ipp_ff_elem, (BNU)&a_dat,
+ sizeof(a_dat) / sizeof(Ipp32u), ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[2],
+ sizeof(a_dat.x[2]) / sizeof(Ipp32u),
+ a2->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 2. e[0] = Fq2.mulXi(a[2]).
+ retvalue = MulXiFast(e0, a2, ps);
+ BREAK_ON_EPID_ERROR(retvalue);
+ // 3. e[1] = a[0].
+ e_dat.x[1] = a_dat.x[0];
+ // 4. e[2] = a[1].
+ e_dat.x[2] = a_dat.x[1];
+
+ sts =
+ ippsGFpGetElement(e0->ipp_ff_elem, (BNU)&e_dat.x[0],
+ sizeof(e_dat.x[0]) / sizeof(Ipp32u), ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&e_dat, sizeof(e_dat) / sizeof(Ipp32u),
+ e->ipp_ff_elem, ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ retvalue = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_dat, sizeof(a_dat));
+ EpidZeroMemory(&e_dat, sizeof(e_dat));
+ DeleteFfElement(&a2);
+ DeleteFfElement(&e0);
+ DeleteFfElement(&e1);
+ DeleteFfElement(&e2);
+
+ return (retvalue);
+}
+
+/*
+helper for MulSpecial, special args form of Fq6Mul
+
+special args form of Fq6.mul(a,b[0],b[1])
+Input: a (elements in Fq6), b[0], b[1] (elements in Fq2)
+Output: e (an element in Fq6) where e = a * b, and b = b[1] * v + b[0]
+
+\note assumes a,e are Fq6 elements and b0,b1 are fq2 elements
+*/
+static EpidStatus Fq6MulGFpE2(FfElement* e, FfElement* a, FfElement* b0,
+ FfElement* b1, PairingState* ps) {
+ EpidStatus retvalue = kEpidNotImpl;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* t4 = NULL;
+ FfElement* a0 = NULL;
+ FfElement* a1 = NULL;
+ FfElement* a2 = NULL;
+ FfElement* e0 = NULL;
+ FfElement* e1 = NULL;
+ FfElement* e2 = NULL;
+ Fq6ElemDat a_dat = {0};
+ Fq6ElemDat e_dat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+ // check parameters
+ if (!e || !a || !b0 || !b1 || !ps) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!ps->Fq2 || !ps->Fq6) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!e->ipp_ff_elem || !a->ipp_ff_elem || !b0->ipp_ff_elem ||
+ !b1->ipp_ff_elem || !ps->Fq2->ipp_ff || !ps->Fq6->ipp_ff) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+
+ // Let t0, t1, t3, t4 be temporary variables in Fq2. All the
+ // following arithmetic operations are in Fq2.
+ retvalue = NewFfElement(ps->Fq2, &t0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &t1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &t2);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &t3);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &t4);
+ BREAK_ON_EPID_ERROR(retvalue);
+ // 1. Let a = (a[0], a[1], a[2]) and e = (e[0], e[1], e[2]).
+ retvalue = NewFfElement(ps->Fq2, &a0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &a1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &a2);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &e2);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ sts = ippsGFpGetElement(a->ipp_ff_elem, (BNU)&a_dat,
+ sizeof(a_dat) / sizeof(Ipp32u), ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0],
+ sizeof(a_dat.x[0]) / sizeof(Ipp32u),
+ a0->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1],
+ sizeof(a_dat.x[1]) / sizeof(Ipp32u),
+ a1->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[2],
+ sizeof(a_dat.x[2]) / sizeof(Ipp32u),
+ a2->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 2. t0 = a[0] * b[0].
+ sts = ippsGFpMul(a0->ipp_ff_elem, b0->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 3. t1 = a[1] * b[1].
+ sts = ippsGFpMul(a1->ipp_ff_elem, b1->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 4. t3 = a[1] + a[2].
+ sts = ippsGFpAdd(a1->ipp_ff_elem, a2->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 5. t3 = t3 * b[1].
+ sts = ippsGFpMul(t3->ipp_ff_elem, b1->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 6. t3 = t3 - t1.
+ sts = ippsGFpSub(t3->ipp_ff_elem, t1->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 7. e[0] = Fq2.mulXi(t3) + t0.
+ retvalue = MulXiFast(e0, t3, ps);
+ BREAK_ON_EPID_ERROR(retvalue);
+ sts = ippsGFpAdd(e0->ipp_ff_elem, t0->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 8. t3 = a[0] + a[1].
+ sts = ippsGFpAdd(a0->ipp_ff_elem, a1->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 9. t4 = b[0] + b[1].
+ sts = ippsGFpAdd(b0->ipp_ff_elem, b1->ipp_ff_elem, t4->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 10. t3 = t3 * t4.
+ sts = ippsGFpMul(t3->ipp_ff_elem, t4->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 11. e[1] = t3 - t0 - t1.
+ sts = ippsGFpSub(t3->ipp_ff_elem, t0->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSub(e1->ipp_ff_elem, t1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 12. t3 = a[2] * b[0].
+ sts = ippsGFpMul(a2->ipp_ff_elem, b0->ipp_ff_elem, t3->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 13. e[2] = t3 + t1.
+ sts = ippsGFpAdd(t3->ipp_ff_elem, t1->ipp_ff_elem, e2->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 14. Return e.
+ sts =
+ ippsGFpGetElement(e0->ipp_ff_elem, (BNU)&e_dat.x[0],
+ sizeof(e_dat.x[0]) / sizeof(Ipp32u), ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts =
+ ippsGFpGetElement(e1->ipp_ff_elem, (BNU)&e_dat.x[1],
+ sizeof(e_dat.x[1]) / sizeof(Ipp32u), ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts =
+ ippsGFpGetElement(e2->ipp_ff_elem, (BNU)&e_dat.x[2],
+ sizeof(e_dat.x[2]) / sizeof(Ipp32u), ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&e_dat, sizeof(e_dat) / sizeof(Ipp32u),
+ e->ipp_ff_elem, ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ retvalue = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_dat, sizeof(a_dat));
+ EpidZeroMemory(&e_dat, sizeof(e_dat));
+ DeleteFfElement(&t0);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t4);
+ DeleteFfElement(&a0);
+ DeleteFfElement(&a1);
+ DeleteFfElement(&a2);
+ DeleteFfElement(&e0);
+ DeleteFfElement(&e1);
+ DeleteFfElement(&e2);
+
+ return (retvalue);
+}
+
+/*
+e = Fq12.MulSpecial(a, b)
+Input: a, b (elements in Fq12) where b = ((b[0], b[2], b[4]), (b[1], b[3],
+b[5])) and b[2] = b[4] = b[5] = 0
+Output: e (an element in Fq12) where e = a * b
+*/
+static EpidStatus MulSpecial(FfElement* e, FfElement const* a,
+ FfElement const* b, PairingState* ps) {
+ EpidStatus retvalue = kEpidNotImpl;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* a0 = NULL;
+ FfElement* a1 = NULL;
+ FfElement* b0 = NULL;
+ FfElement* b1 = NULL;
+ FfElement* b3 = NULL;
+ FfElement* e0 = NULL;
+ FfElement* e1 = NULL;
+ FfElement* b0plusb1 = NULL;
+ Fq12ElemDat a_dat = {0};
+ Fq12ElemDat b_dat = {0};
+ Fq12ElemDat e_dat = {0};
+ do {
+ IppStatus sts = ippStsNoErr;
+
+ // check parameters
+ if (!e || !a || !b || !ps) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!ps->Fq2 || !ps->Fq6) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+ if (!e->ipp_ff_elem || !a->ipp_ff_elem || !b->ipp_ff_elem ||
+ !ps->Fq2->ipp_ff || !ps->Fq6->ipp_ff || !ps->ff || !ps->ff->ipp_ff) {
+ retvalue = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(retvalue);
+ }
+
+ // Let t0, t1, t2 be temporary variables in ps->Fq6.
+ retvalue = NewFfElement(ps->Fq6, &t0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq6, &t1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq6, &t2);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &b0plusb1);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ // 1. Let a = (a[0], a[1]) and e = (e[0], e[1]).
+ retvalue = NewFfElement(ps->Fq6, &a0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq6, &a1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq6, &e0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq6, &e1);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ sts = ippsGFpGetElement(a->ipp_ff_elem, (BNU)&a_dat,
+ sizeof(a_dat) / sizeof(Ipp32u), ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[0],
+ sizeof(a_dat.x[0]) / sizeof(Ipp32u),
+ a0->ipp_ff_elem, ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&a_dat.x[1],
+ sizeof(a_dat.x[1]) / sizeof(Ipp32u),
+ a1->ipp_ff_elem, ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+
+ // 2. Let b = ((b[0], b[2], b[4]), (b[1], b[3], b[5])) where
+ // b[0], ..., b[5] are elements in ps->Fq2 and b[2] = b[4] = b[5]
+ // = 0.
+ retvalue = NewFfElement(ps->Fq2, &b0);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &b1);
+ BREAK_ON_EPID_ERROR(retvalue);
+ retvalue = NewFfElement(ps->Fq2, &b3);
+ BREAK_ON_EPID_ERROR(retvalue);
+
+ sts = ippsGFpGetElement(b->ipp_ff_elem, (BNU)&b_dat,
+ sizeof(b_dat) / sizeof(Ipp32u), ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&b_dat.x[0].x[0],
+ sizeof(a_dat.x[0].x[0]) / sizeof(Ipp32u),
+ b0->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&b_dat.x[1].x[0],
+ sizeof(a_dat.x[1].x[0]) / sizeof(Ipp32u),
+ b1->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&b_dat.x[1].x[1],
+ sizeof(a_dat.x[1].x[1]) / sizeof(Ipp32u),
+ b3->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+
+ // 3. t0 = ps->Fq6.mul(a[0], b[0]).
+
+ sts = ippsGFpMul_PE(a0->ipp_ff_elem, b0->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 4. t1 = ps->Fq6.mul(a[1], b[1], b[3]).
+ retvalue = Fq6MulGFpE2(t1, a1, b1, b3, ps);
+ BREAK_ON_EPID_ERROR(retvalue);
+ // 5. e[0] = ps->Fq6.MulV(t1).
+ retvalue = MulV(e0, t1, ps);
+ BREAK_ON_EPID_ERROR(retvalue);
+ // 6. e[0] = ps->Fq6.add(t0, e[0]).
+ sts = ippsGFpAdd(t0->ipp_ff_elem, e0->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 7. t2 = ps->Fq6.add(a[0], a[1]).
+ sts = ippsGFpAdd(a0->ipp_ff_elem, a1->ipp_ff_elem, t2->ipp_ff_elem,
+ ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 8. e[1] = ps->Fq6.mul(t2, b[0] + b[1], b[3]).
+ sts = ippsGFpAdd(b0->ipp_ff_elem, b1->ipp_ff_elem, b0plusb1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ retvalue = Fq6MulGFpE2(e1, t2, b0plusb1, b3, ps);
+ BREAK_ON_EPID_ERROR(retvalue);
+ // 9. e[1] = ps->Fq6.subtract(e[1], t0).
+ sts = ippsGFpSub(e1->ipp_ff_elem, t0->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 10. e[1] = ps->Fq6.subtract(e[1], t1).
+ sts = ippsGFpSub(e1->ipp_ff_elem, t1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ // 11. Return e.
+ sts =
+ ippsGFpGetElement(e0->ipp_ff_elem, (BNU)&e_dat.x[0],
+ sizeof(e_dat.x[0]) / sizeof(Ipp32u), ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts =
+ ippsGFpGetElement(e1->ipp_ff_elem, (BNU)&e_dat.x[1],
+ sizeof(e_dat.x[1]) / sizeof(Ipp32u), ps->Fq6->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ sts = ippsGFpSetElement((Ipp32u*)&e_dat, sizeof(e_dat) / sizeof(Ipp32u),
+ e->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, retvalue);
+ retvalue = kEpidNoErr;
+ } while (0);
+ EpidZeroMemory(&a_dat, sizeof(a_dat));
+ EpidZeroMemory(&b_dat, sizeof(b_dat));
+ EpidZeroMemory(&e_dat, sizeof(e_dat));
+ DeleteFfElement(&t0);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&a0);
+ DeleteFfElement(&a1);
+ DeleteFfElement(&b0);
+ DeleteFfElement(&b1);
+ DeleteFfElement(&b3);
+ DeleteFfElement(&e0);
+ DeleteFfElement(&e1);
+ DeleteFfElement(&b0plusb1);
+
+ return (retvalue);
+}
+
+/*
+ (e0, e1) = Fq12.SquareForFq4(a0, a1)
+ Input: a0, a1 (elements in Fq2)
+ Output: e0, e1 (elements in Fq2) where e = a * a in Fq4
+*/
+static EpidStatus SquareForFq4(PairingState* ps, FfElement* e0, FfElement* e1,
+ FfElement const* a0, FfElement const* a1) {
+ EpidStatus result = kEpidErr;
+ FfElement* t0 = NULL;
+ FfElement* t1 = NULL;
+ FfElement* xi = NULL;
+ Fq2ElemStr Fq6IrrPolynomial = {0};
+
+ // check parameters
+ if (!e0 || !e1 || !a0 || !a1 || !ps) return kEpidBadArgErr;
+ if (!ps->Fq2 || !ps->Fq6) {
+ return kEpidBadArgErr;
+ }
+ if (!e0->ipp_ff_elem || !e1->ipp_ff_elem || !a0->ipp_ff_elem ||
+ !a1->ipp_ff_elem || !ps->ff || !ps->ff->ipp_ff || !ps->Fq2->ipp_ff ||
+ !ps->Fq6->ipp_ff)
+ return kEpidBadArgErr;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+
+ // extract xi from Fq6 irr poly
+ result = NewFfElement(ps->Fq2, &xi);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteBigNum(ps->Fq6->modulus_0, sizeof(Fq6IrrPolynomial),
+ &Fq6IrrPolynomial);
+ BREAK_ON_EPID_ERROR(result);
+ result = SetFfElementOctString(&Fq6IrrPolynomial, sizeof(Fq6IrrPolynomial),
+ xi, ps->Fq2);
+ BREAK_ON_EPID_ERROR(result);
+ // first coefficent is -xi
+ sts = ippsGFpNeg(xi->ipp_ff_elem, xi->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ // Let t0, t1 be temporary variables in Fq2. All the following
+ // operations are computed in Fq2.
+ result = NewFfElement(ps->Fq2, &t0);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // 1. Set t0 = a0 * a0.
+ sts = ippsGFpMul(a0->ipp_ff_elem, a0->ipp_ff_elem, t0->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Set t1 = a1 * a1.
+ sts = ippsGFpMul(a1->ipp_ff_elem, a1->ipp_ff_elem, t1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 3. Set e0 = t1 * xi.
+ sts = ippsGFpMul(t1->ipp_ff_elem, xi->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 4. Set e0 = e0 + t0.
+ sts = ippsGFpAdd(e0->ipp_ff_elem, t0->ipp_ff_elem, e0->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 5. Set e1 = a0 + a1.
+ sts = ippsGFpAdd(a0->ipp_ff_elem, a1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 6. Set e1 = e1 * e1 - t0 - t1.
+ sts = ippsGFpMul(e1->ipp_ff_elem, e1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e1->ipp_ff_elem, t0->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e1->ipp_ff_elem, t1->ipp_ff_elem, e1->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 7. Return (e0, e1).
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&Fq6IrrPolynomial, sizeof(Fq6IrrPolynomial));
+ DeleteFfElement(&t0);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&xi);
+
+ return (result);
+}
+
+/*
+ e = Fq12.squareCyclotomic(a)
+ Input: a (an element in Fq12)
+ Output: e (an element in Fq12) where e = a * a
+*/
+static EpidStatus SquareCyclotomic(PairingState* ps, FfElement* e_out,
+ FfElement const* a_in) {
+ EpidStatus result = kEpidErr;
+ FfElement* t00 = NULL;
+ FfElement* t01 = NULL;
+ FfElement* t02 = NULL;
+ FfElement* t10 = NULL;
+ FfElement* t11 = NULL;
+ FfElement* t12 = NULL;
+
+ FfElement* a[6] = {0};
+ FfElement* e[6] = {0};
+
+ FfElement* xi = NULL;
+ int i = 0;
+ Fq12ElemStr a_str = {0};
+ Fq12ElemStr e_str = {0};
+ Fq2ElemStr Fq6IrrPolynomial = {0};
+
+ // check parameters
+ if (!e_out || !a_in || !ps) return kEpidBadArgErr;
+ if (!ps->Fq || !ps->Fq2 || !ps->Fq6) {
+ return kEpidBadArgErr;
+ }
+ if (!e_out->ipp_ff_elem || !a_in->ipp_ff_elem || !ps->ff || !ps->ff->ipp_ff ||
+ !ps->Fq->ipp_ff || !ps->Fq2->ipp_ff || !ps->Fq6->ipp_ff)
+ return kEpidBadArgErr;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+
+ // extract xi from Fq6 irr poly
+ result = NewFfElement(ps->Fq2, &xi);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteBigNum(ps->Fq6->modulus_0, sizeof(Fq6IrrPolynomial),
+ &Fq6IrrPolynomial);
+ BREAK_ON_EPID_ERROR(result);
+ result = SetFfElementOctString(&Fq6IrrPolynomial, sizeof(Fq6IrrPolynomial),
+ xi, ps->Fq2);
+ BREAK_ON_EPID_ERROR(result);
+ // first coefficent is -xi
+ sts = ippsGFpNeg(xi->ipp_ff_elem, xi->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ // Let t00, t01, t02, t10, t11, t12 be temporary variables in
+ // Fq2. All the following operations are computed in Fq2 unless
+ // specified otherwise.
+ result = NewFfElement(ps->Fq2, &t00);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t01);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t02);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t10);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t11);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &t12);
+ BREAK_ON_EPID_ERROR(result);
+ for (i = 0; i < 6; i++) {
+ result = NewFfElement(ps->Fq2, &a[i]);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq2, &e[i]);
+ BREAK_ON_EPID_ERROR(result);
+ }
+ BREAK_ON_EPID_ERROR(result);
+ // 1. Let a = ((a[0], a[2], a[4]), (a[1], a[3], a[5])).
+ sts = ippsGFpGetElement(a_in->ipp_ff_elem, (BNU)&a_str,
+ sizeof(a_str) / sizeof(Ipp32u), ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[0].a[0],
+ sizeof(a_str.a[0].a[0]) / sizeof(Ipp32u),
+ a[0]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[0].a[1],
+ sizeof(a_str.a[0].a[1]) / sizeof(Ipp32u),
+ a[2]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[0].a[2],
+ sizeof(a_str.a[0].a[2]) / sizeof(Ipp32u),
+ a[4]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[1].a[0],
+ sizeof(a_str.a[1].a[0]) / sizeof(Ipp32u),
+ a[1]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[1].a[1],
+ sizeof(a_str.a[1].a[1]) / sizeof(Ipp32u),
+ a[3]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&a_str.a[1].a[2],
+ sizeof(a_str.a[1].a[2]) / sizeof(Ipp32u),
+ a[5]->ipp_ff_elem, ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Let e = ((e[0], e[2], e[4]), (e[1], e[3], e[5])).
+
+ // 3. (t00, t11) = Fq12.SquareForFq4(a[0], a[3]).
+ result = SquareForFq4(ps, t00, t11, a[0], a[3]);
+ BREAK_ON_EPID_ERROR(result);
+ // 4. (t01, t12) = Fq12.SquareForFq4(a[1], a[4]).
+ result = SquareForFq4(ps, t01, t12, a[1], a[4]);
+ BREAK_ON_EPID_ERROR(result);
+ // 5. (t02, t10) = Fq12.SquareForFq4(a[2], a[5]).
+ result = SquareForFq4(ps, t02, t10, a[2], a[5]);
+ BREAK_ON_EPID_ERROR(result);
+ // 6. Set t10 = t10 * xi.
+ sts = ippsGFpMul(t10->ipp_ff_elem, xi->ipp_ff_elem, t10->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 7. Set e[0] = 3 * t00 - 2 * a[0].
+ sts = ippsGFpAdd(t00->ipp_ff_elem, t00->ipp_ff_elem, e[0]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[0]->ipp_ff_elem, t00->ipp_ff_elem, e[0]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[0]->ipp_ff_elem, a[0]->ipp_ff_elem, e[0]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[0]->ipp_ff_elem, a[0]->ipp_ff_elem, e[0]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 8. Set e[2] = 3 * t01 - 2 * a[2].
+ sts = ippsGFpAdd(t01->ipp_ff_elem, t01->ipp_ff_elem, e[2]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[2]->ipp_ff_elem, t01->ipp_ff_elem, e[2]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[2]->ipp_ff_elem, a[2]->ipp_ff_elem, e[2]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[2]->ipp_ff_elem, a[2]->ipp_ff_elem, e[2]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 9. Set e[4] = 3 * t02 - 2 * a[4].
+ sts = ippsGFpAdd(t02->ipp_ff_elem, t02->ipp_ff_elem, e[4]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[4]->ipp_ff_elem, t02->ipp_ff_elem, e[4]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[4]->ipp_ff_elem, a[4]->ipp_ff_elem, e[4]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSub(e[4]->ipp_ff_elem, a[4]->ipp_ff_elem, e[4]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 10. Set e[1] = 3 * t10 + 2 * a[1].
+ sts = ippsGFpAdd(t10->ipp_ff_elem, t10->ipp_ff_elem, e[1]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[1]->ipp_ff_elem, t10->ipp_ff_elem, e[1]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[1]->ipp_ff_elem, a[1]->ipp_ff_elem, e[1]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[1]->ipp_ff_elem, a[1]->ipp_ff_elem, e[1]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 11. Set e[3] = 3 * t11 + 2 * a[3].
+ sts = ippsGFpAdd(t11->ipp_ff_elem, t11->ipp_ff_elem, e[3]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[3]->ipp_ff_elem, t11->ipp_ff_elem, e[3]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[3]->ipp_ff_elem, a[3]->ipp_ff_elem, e[3]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[3]->ipp_ff_elem, a[3]->ipp_ff_elem, e[3]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 12. Set e[5] = 3 * t12 + 2 * a[5].
+ sts = ippsGFpAdd(t12->ipp_ff_elem, t12->ipp_ff_elem, e[5]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[5]->ipp_ff_elem, t12->ipp_ff_elem, e[5]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[5]->ipp_ff_elem, a[5]->ipp_ff_elem, e[5]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpAdd(e[5]->ipp_ff_elem, a[5]->ipp_ff_elem, e[5]->ipp_ff_elem,
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 13. Return e.
+ sts = ippsGFpGetElement(e[0]->ipp_ff_elem, (BNU)&e_str.a[0].a[0],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(e[2]->ipp_ff_elem, (BNU)&e_str.a[0].a[1],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(e[4]->ipp_ff_elem, (BNU)&e_str.a[0].a[2],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(e[1]->ipp_ff_elem, (BNU)&e_str.a[1].a[0],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(e[3]->ipp_ff_elem, (BNU)&e_str.a[1].a[1],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpGetElement(e[5]->ipp_ff_elem, (BNU)&e_str.a[1].a[2],
+ sizeof(e_str.a[0].a[0]) / sizeof(Ipp32u),
+ ps->Fq2->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpSetElement((Ipp32u*)&e_str, sizeof(e_str) / sizeof(Ipp32u),
+ e_out->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_str, sizeof(a_str));
+ EpidZeroMemory(&e_str, sizeof(e_str));
+ EpidZeroMemory(&Fq6IrrPolynomial, sizeof(Fq6IrrPolynomial));
+ DeleteFfElement(&t00);
+ DeleteFfElement(&t01);
+ DeleteFfElement(&t02);
+ DeleteFfElement(&t10);
+ DeleteFfElement(&t11);
+ DeleteFfElement(&t12);
+
+ for (i = 0; i < 6; i++) {
+ DeleteFfElement(&a[i]);
+ DeleteFfElement(&e[i]);
+ }
+
+ DeleteFfElement(&xi);
+
+ return (result);
+}
+
+/*
+ e = Fq12.expCyclotomic(a, b)
+ Input: a (an element in Fq12), b (a non-negative integer)
+ Output: e (an element in Fq12) where e = a^b
+ Steps:
+
+ 2. Set e = a.
+ 3. For i = n-1, ..., 0, do the following:
+ e = Fq12.squareCyclotomic(e, e),
+ If bi = 1, compute e = Fq12.mul(e, a).
+ 4. Return e.
+*/
+static EpidStatus ExpCyclotomic(PairingState* ps, FfElement* e,
+ FfElement const* a, BigNum const* b) {
+ EpidStatus result = kEpidErr;
+
+ // check parameters
+ if (!e || !a || !b || !ps) return kEpidBadArgErr;
+ if (!ps->Fq || !ps->Fq2) {
+ return kEpidBadArgErr;
+ }
+ if (!e->ipp_ff_elem || !a->ipp_ff_elem || !ps->Fq->ipp_ff ||
+ !ps->Fq2->ipp_ff || !b->ipp_bn)
+ return kEpidBadArgErr;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ int num_bits = 0;
+ IppBNU b_str = 0;
+ int i = 0;
+
+ // 1. Let bn...b1b0 be the binary representation of b.
+ sts = ippsRef_BN(0, &num_bits, &b_str, b->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 2. Set e = a.
+ sts = ippsGFpCpyElement(a->ipp_ff_elem, e->ipp_ff_elem, ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // 3. For i = n-1, ..., 0, do the following:
+ for (i = num_bits - 2; i >= 0; i--) {
+ // e = Fq12.squareCyclotomic(e, e),
+ result = SquareCyclotomic(ps, e, e);
+ BREAK_ON_EPID_ERROR(result);
+ // If bi = 1, compute e = Fq12.mul(e, a).
+ if (1 == Bit(b_str, i)) {
+ sts = ippsGFpMul(e->ipp_ff_elem, a->ipp_ff_elem, e->ipp_ff_elem,
+ ps->ff->ipp_ff);
+ BREAK_ON_IPP_ERROR(sts, result);
+ }
+ // 4. Return e.
+ }
+ result = kEpidNoErr;
+ } while (0);
+
+ return (result);
+}
diff --git a/epid/common/math/src/printutils.c b/epid/common/math/src/printutils.c
new file mode 100644
index 0000000..cd47463
--- /dev/null
+++ b/epid/common/math/src/printutils.c
@@ -0,0 +1,598 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Print helper implementation.
+ */
+#ifndef EPID_ENABLE_DEBUG_PRINT
+#define EPID_ENABLE_DEBUG_PRINT
+#endif
+
+#include "epid/common/math/printutils.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Allowed number of characters printed in one line
+#define WIDTH 49
+
+/// Amount of identation added in the beginning of each line
+#define INDENT 2
+
+/// Number of charaters used to represent one byte. For example, "ab" or "05".
+#define BYTE_LENGTH 2
+
+/// Separator
+#define SEPARATOR (" ")
+
+/// Make configured number of identation
+#define MAKE_INDENT() \
+ { \
+ uint8_t ind = 0; \
+ for (ind = 0; ind < INDENT; ind++) { \
+ PRINT(" "); \
+ } \
+ }
+
+/// Print to specified stream
+#define PRINT(...) fprintf(stdout, __VA_ARGS__)
+
+static int PrintBuf(ConstOctStr buf, size_t size) {
+ size_t curr_column = 0;
+ size_t i = 0;
+ if (!buf || size == 0) {
+ return -1;
+ }
+ for (i = 0; i < size; i++) {
+ if (curr_column == 0) {
+ MAKE_INDENT();
+ curr_column += INDENT;
+ }
+ if (BYTE_LENGTH != PRINT("%.2x", ((unsigned char const*)buf)[i])) {
+ return -1;
+ }
+ curr_column += BYTE_LENGTH;
+ if (i < size - 1) {
+ if ((curr_column + BYTE_LENGTH + strlen(SEPARATOR)) > WIDTH) {
+ PRINT("\n");
+ curr_column = 0;
+ } else {
+ PRINT("%s", SEPARATOR);
+ curr_column += (uint8_t)strlen(SEPARATOR);
+ }
+ }
+ }
+ PRINT("\n");
+ return 0;
+}
+
+void PrintBigNum(BigNum const* big_num, char const* var_name) {
+ IppStatus sts = ippStsNoErr;
+ unsigned char* buf = NULL;
+ int ipp_word_buf_size;
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (BigNum):\n", var_name);
+ if (!big_num) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (!big_num->ipp_bn) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ sts = ippsGetSize_BN(big_num->ipp_bn, &ipp_word_buf_size);
+ if (ippStsNoErr != sts) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ do {
+ buf = SAFE_ALLOC(ipp_word_buf_size * sizeof(Ipp32u));
+ if (!buf) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ sts = ippsGetOctString_BN((OctStr)buf, ipp_word_buf_size * sizeof(Ipp32u),
+ big_num->ipp_bn);
+ if (ippStsNoErr != sts) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ if (0 != PrintBuf((ConstOctStr)buf, ipp_word_buf_size * sizeof(Ipp32u))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ } while (0);
+
+ SAFE_FREE(buf);
+}
+
+void PrintFfElement(FiniteField const* ff, FfElement const* ff_element,
+ char const* var_name, PrintUtilFormat format) {
+ IppStatus sts;
+ uint8_t ff_element_str[sizeof(Fq12ElemStr)];
+ int ipp_ff_element_size;
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ if (!ff_element || !ff) {
+ PRINT("%s (FfElement):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (!ff_element->ipp_ff_elem || !ff->ipp_ff ||
+ (format != kPrintUtilUnannotated && format != kPrintUtilAnnotated)) {
+ PRINT("%s (FfElement):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+
+ // get the data
+ ipp_ff_element_size = ff_element->element_len * sizeof(Ipp32u);
+ sts = ippsGFpGetElementOctString(ff_element->ipp_ff_elem,
+ (OctStr)&ff_element_str, ipp_ff_element_size,
+ ff->ipp_ff);
+ if (ippStsNoErr != sts) {
+ PRINT("%s (FfElement):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+
+ if (ipp_ff_element_size == sizeof(FqElemStr)) {
+ PrintFqElemStr((const FqElemStr*)&ff_element_str, var_name);
+ } else if (ipp_ff_element_size == sizeof(FpElemStr)) {
+ PrintFpElemStr((const FpElemStr*)&ff_element_str, var_name);
+ } else if (ipp_ff_element_size == sizeof(Fq2ElemStr)) {
+ PrintFq2ElemStr((const Fq2ElemStr*)&ff_element_str, var_name, format);
+ } else if (ipp_ff_element_size == sizeof(Fq6ElemStr)) {
+ PrintFq6ElemStr((const Fq6ElemStr*)&ff_element_str, var_name, format);
+ } else if (ipp_ff_element_size == sizeof(Fq6ElemStr)) {
+ PrintFq12ElemStr((const Fq12ElemStr*)&ff_element_str, var_name, format);
+ } else if (ipp_ff_element_size == sizeof(GtElemStr)) {
+ PrintGtElemStr((const GtElemStr*)&ff_element_str, var_name, format);
+ } else {
+ PRINT("%s (FfElement):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ }
+}
+
+void PrintEcPoint(EcGroup const* g, EcPoint const* ec_point,
+ char const* var_name, PrintUtilFormat format) {
+ FiniteField* fp = NULL;
+ FfElement* fp_x = NULL;
+ FfElement* fp_y = NULL;
+ uint8_t ec_point_str[sizeof(G2ElemStr)];
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ if (!ec_point || !g) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (!ec_point->ipp_ec_pt || !g->ff || !g->ipp_ec) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ do {
+ IppStatus sts = ippStsNoErr;
+ int ipp_half_strlen;
+ // get finite field
+ fp = g->ff;
+
+ // create element X
+ if (kEpidNoErr != NewFfElement(fp, &fp_x)) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ // create element Y
+ if (kEpidNoErr != NewFfElement(fp, &fp_y)) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+
+ ipp_half_strlen = fp_x->element_len * sizeof(Ipp32u);
+
+ // get elements from point
+ sts = ippsGFpECGetPoint(ec_point->ipp_ec_pt, fp_x->ipp_ff_elem,
+ fp_y->ipp_ff_elem, g->ipp_ec);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+
+ // get element X data
+ sts =
+ ippsGFpGetElementOctString(fp_x->ipp_ff_elem, (IppOctStr)&ec_point_str,
+ ipp_half_strlen, fp->ipp_ff);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ // get element Y data
+ sts = ippsGFpGetElementOctString(fp_y->ipp_ff_elem,
+ (IppOctStr)&ec_point_str + ipp_half_strlen,
+ ipp_half_strlen, fp->ipp_ff);
+ // check return codes
+ if (ippStsNoErr != sts) {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+
+ if (2 * ipp_half_strlen == sizeof(G1ElemStr)) {
+ PrintG1ElemStr((const G1ElemStr*)&ec_point_str, var_name, format);
+ } else if (2 * ipp_half_strlen == sizeof(G2ElemStr)) {
+ PrintG2ElemStr((const G2ElemStr*)&ec_point_str, var_name, format);
+ } else {
+ PRINT("%s (EcPoint):\n", var_name);
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ break;
+ }
+ } while (0);
+
+ DeleteFfElement(&fp_x);
+ DeleteFfElement(&fp_y);
+}
+
+void PrintBigNumStr(BigNumStr const* big_num_str, char const* var_name) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (BigNumStr):\n", var_name);
+ if (!big_num_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (0 != PrintBuf((ConstOctStr)big_num_str, sizeof(*big_num_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintFpElemStr(FpElemStr const* fp_elem_str, char const* var_name) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (FpElemStr):\n", var_name);
+ if (!fp_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (0 != PrintBuf((ConstOctStr)fp_elem_str, sizeof(*fp_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintFqElemStr(FqElemStr const* fq_elem_str, char const* var_name) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (FqElemStr):\n", var_name);
+ if (!fq_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (0 != PrintBuf((ConstOctStr)fq_elem_str, sizeof(*fq_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintFq2ElemStr(Fq2ElemStr const* fq2_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (Fq2ElemStr):\n", var_name);
+ if (!fq2_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ MAKE_INDENT();
+ PRINT("a0:\n");
+ if (0 != PrintBuf((ConstOctStr)&fq2_elem_str->a[0],
+ sizeof(fq2_elem_str->a[0]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ MAKE_INDENT();
+ PRINT("a1:\n");
+ if (0 != PrintBuf((ConstOctStr)&fq2_elem_str->a[1],
+ sizeof(fq2_elem_str->a[1]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)fq2_elem_str, sizeof(*fq2_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintFq6ElemStr(Fq6ElemStr const* fq6_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (Fq6ElemStr):\n", var_name);
+ if (!fq6_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ unsigned int i = 0;
+ unsigned int j = 0;
+ for (i = 0; i < sizeof(fq6_elem_str->a) / sizeof(fq6_elem_str->a[0]); i++) {
+ for (j = 0;
+ j < sizeof(fq6_elem_str->a[0]) / sizeof(fq6_elem_str->a[0].a[0]);
+ j++) {
+ MAKE_INDENT();
+ PRINT("a%u.%u:\n", i, j);
+ if (0 != PrintBuf((ConstOctStr)&fq6_elem_str->a[i].a[j],
+ sizeof(fq6_elem_str->a[i].a[j]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ }
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)fq6_elem_str, sizeof(*fq6_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintFq12ElemStr(Fq12ElemStr const* fq12_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (Fq12ElemStr):\n", var_name);
+ if (!fq12_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ unsigned int i = 0;
+ unsigned int j = 0;
+ unsigned int k = 0;
+ for (i = 0; i < sizeof(fq12_elem_str->a) / sizeof(fq12_elem_str->a[0]);
+ i++) {
+ for (j = 0;
+ j < sizeof(fq12_elem_str->a[0]) / sizeof(fq12_elem_str->a[0].a[0]);
+ j++) {
+ for (k = 0; k < sizeof(fq12_elem_str->a[0].a[0]) /
+ sizeof(fq12_elem_str->a[0].a[0].a[0]);
+ k++) {
+ MAKE_INDENT();
+ PRINT("a%u.%u.%u:\n", i, j, k);
+ if (0 != PrintBuf((ConstOctStr)&fq12_elem_str->a[i].a[j].a[k],
+ sizeof(fq12_elem_str->a[i].a[j].a[k]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ }
+ }
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)fq12_elem_str, sizeof(*fq12_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintG1ElemStr(G1ElemStr const* g1_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (G1ElemStr):\n", var_name);
+ if (!g1_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ MAKE_INDENT();
+ PRINT("x:\n");
+ if (0 != PrintBuf((ConstOctStr)&g1_elem_str->x, sizeof(g1_elem_str->x))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ MAKE_INDENT();
+ PRINT("y:\n");
+ if (0 != PrintBuf((ConstOctStr)&g1_elem_str->y, sizeof(g1_elem_str->y))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)g1_elem_str, sizeof(*g1_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintG2ElemStr(G2ElemStr const* g2_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (G2ElemStr):\n", var_name);
+ if (!g2_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ MAKE_INDENT();
+ PRINT("x0:\n");
+ if (0 !=
+ PrintBuf((ConstOctStr)&g2_elem_str->x[0], sizeof(g2_elem_str->x[0]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ MAKE_INDENT();
+ PRINT("x1:\n");
+ if (0 !=
+ PrintBuf((ConstOctStr)&g2_elem_str->x[1], sizeof(g2_elem_str->x[1]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ MAKE_INDENT();
+ PRINT("y0:\n");
+ if (0 !=
+ PrintBuf((ConstOctStr)&g2_elem_str->y[0], sizeof(g2_elem_str->y[0]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ MAKE_INDENT();
+ PRINT("y1:\n");
+ if (0 !=
+ PrintBuf((ConstOctStr)&g2_elem_str->y[1], sizeof(g2_elem_str->y[1]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)g2_elem_str, sizeof(*g2_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+void PrintGtElemStr(GtElemStr const* gt_elem_str, char const* var_name,
+ PrintUtilFormat format) {
+ if (!var_name) {
+ var_name = "<no name>";
+ }
+ PRINT("%s (GtElemStr):\n", var_name);
+ if (!gt_elem_str) {
+ MAKE_INDENT();
+ PRINT("<null>\n");
+ return;
+ }
+ if (format == kPrintUtilAnnotated) {
+ unsigned int i = 0;
+ for (i = 0; i < sizeof(gt_elem_str->x) / sizeof(gt_elem_str->x[0]); i++) {
+ MAKE_INDENT();
+ PRINT("x%u:\n", i);
+ if (0 != PrintBuf((ConstOctStr)&gt_elem_str->x[i],
+ sizeof(gt_elem_str->x[i]))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ }
+ } else if (format == kPrintUtilUnannotated) {
+ if (0 != PrintBuf((ConstOctStr)gt_elem_str, sizeof(*gt_elem_str))) {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+ } else {
+ MAKE_INDENT();
+ PRINT("<invalid>\n");
+ return;
+ }
+}
+
+#ifdef EPID_ENABLE_DEBUG_PRINT
+#undef EPID_ENABLE_DEBUG_PRINT
+#endif
diff --git a/epid/common/math/src/sha256.c b/epid/common/math/src/sha256.c
new file mode 100644
index 0000000..cea65de
--- /dev/null
+++ b/epid/common/math/src/sha256.c
@@ -0,0 +1,44 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief SHA256 implementation.
+*/
+#include "epid/common/math/hash.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "ext/ipp/include/ippcp.h"
+
+EpidStatus Sha256MessageDigest(void const* msg, size_t len,
+ Sha256Digest* digest) {
+ IppStatus sts;
+ int ipp_len = (int)len;
+
+ if ((len && !msg) || !digest) return kEpidBadArgErr;
+
+ if (INT_MAX < len) return kEpidBadArgErr;
+
+ sts = ippsSHA256MessageDigest(msg, ipp_len, (IppOctStr)digest);
+ if (ippStsNoErr != sts) {
+ if (ippStsLengthErr == sts) {
+ return kEpidBadArgErr;
+ } else {
+ return kEpidMathErr;
+ }
+ }
+
+ return kEpidNoErr;
+}
diff --git a/epid/common/math/src/tatepairing-internal.h b/epid/common/math/src/tatepairing-internal.h
new file mode 100644
index 0000000..163f4f3
--- /dev/null
+++ b/epid/common/math/src/tatepairing-internal.h
@@ -0,0 +1,41 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 pairing private interface.
+ */
+
+#ifndef EPID_COMMON_MATH_SRC_TATEPAIRING_INTERNAL_H_
+#define EPID_COMMON_MATH_SRC_TATEPAIRING_INTERNAL_H_
+
+/// Pairing State
+struct Epid11PairingState {
+ EcGroup* ga; ///< elliptic curve group G1
+ EcGroup* gb; ///< elliptic curve group G2
+ FiniteField* ff; ///< finite field GT
+ BigNumStr p; ///< Intel(R) EPID 1.1 p parameter value
+ size_t p_bitsize; ///< Length of p in bits
+ FfElement* a; ///< Intel(R) EPID 1.1 a parameter value
+ BigNum* final_exp_constant; ///< (q^2 - q + 1)/p
+ FfElement* fq3_inv_constant; ///< (inverse(qnr), 0) in Fq3
+ FfElement* fq3_inv2_constant; ///< (inverse(qnr)^2, 0) in Fq3
+ FiniteField* Fq; ///< Fq
+ FiniteField* Fq3; ///< Fq3
+ FfElement* alpha_q[3]; ///< {t^(0*q), t^(1*q), t^(2*q)}
+};
+
+#endif // EPID_COMMON_MATH_SRC_TATEPAIRING_INTERNAL_H_
diff --git a/epid/common/math/src/tatepairing.c b/epid/common/math/src/tatepairing.c
new file mode 100644
index 0000000..adc42eb
--- /dev/null
+++ b/epid/common/math/src/tatepairing.c
@@ -0,0 +1,925 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Intel(R) EPID 1.1 pairing implementation.
+*/
+
+#include "epid/common/math/tatepairing.h"
+#include "epid/common/1.1/types.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/math/src/tatepairing-internal.h"
+#include "epid/common/src/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+/// Handle Ipp Errors with Break
+#define BREAK_ON_IPP_ERROR(sts, ret) \
+ { \
+ IppStatus temp_sts = (sts); \
+ if (ippStsNoErr != temp_sts) { \
+ if (ippStsContextMatchErr == temp_sts) { \
+ (ret) = kEpidMathErr; \
+ } else { \
+ (ret) = kEpidBadArgErr; \
+ } \
+ break; \
+ } \
+ }
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(a) (sizeof(a) / sizeof((a)[0]))
+
+#pragma pack(1)
+/// Data for element in Fq
+typedef struct FqElemDat {
+ Ipp32u x[sizeof(FqElemStr) / sizeof(Ipp32u)]; ///< element in Fq
+} FqElemDat;
+/// Data for element in Fq
+typedef struct Fq3ElemDat {
+ FqElemDat x[3]; ///< element in Fq3
+} Fq3ElemDat;
+#pragma pack()
+
+// Forward Declarations
+static EpidStatus Fq6FromFq(FiniteField* fq6, FiniteField* fq,
+ FfElement const* a, FfElement* r);
+
+static EpidStatus JoinFq3(Epid11PairingState* ps, FfElement const* a,
+ FfElement const* b, FfElement* r);
+
+static EpidStatus SplitFq6(Epid11PairingState* ps, FfElement const* a,
+ FfElement* a0, FfElement* a1);
+
+static EpidStatus FinalExp(Epid11PairingState* ps, FfElement const* r,
+ FfElement* d);
+
+static EpidStatus Transform(Epid11PairingState* ps, FfElement const* a,
+ FfElement* b);
+
+EpidStatus NewEpid11PairingState(EcGroup const* ga, EcGroup const* gb,
+ FiniteField const* ff,
+ Epid11PairingState** ps) {
+ EpidStatus result = kEpidErr;
+ Epid11PairingState* pairing_state_ctx = NULL;
+ BigNum* tmp = NULL;
+ BigNum* p = NULL;
+ FfElement* qnr = NULL;
+ FfElement* inv_qnr = NULL;
+ FfElement* neg_qnr = NULL;
+ Fq3ElemStr fq3_str = {0};
+ int i = 0;
+
+ do {
+ IppStatus sts = ippStsNoErr;
+ IppsGFpState* Fq3 = NULL;
+ IppsGFpState* Fq = NULL;
+ Fq3ElemDat ff_modulus = {0};
+ uint8_t one_str[] = {1};
+ uint8_t remainder_str = 0xff;
+ Fq3ElemStr trans_100 = {0};
+ Fq3ElemStr trans_010 = {0};
+ FiniteField* Ffq = NULL;
+
+ // validate inputs
+ if (!ga || !gb || !ff || !ps) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (!ga->ff || !ga->ipp_ec || !gb->ff || !gb->ipp_ec || !ff->ipp_ff) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ if (1 != ga->ff->basic_degree || 3 != gb->ff->basic_degree ||
+ 6 != ff->basic_degree ||
+ sizeof(Epid11G1ElemStr) != (ga->ff->element_len << 3) ||
+ sizeof(Epid11G2ElemStr) != (gb->ff->element_len << 3) ||
+ sizeof(Epid11GtElemStr) != (ff->element_len << 2)) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ pairing_state_ctx =
+ (Epid11PairingState*)SAFE_ALLOC(sizeof(Epid11PairingState));
+ if (!pairing_state_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // store Intel(R) EPID fields and groups
+ pairing_state_ctx->ga = (EcGroup*)ga;
+ pairing_state_ctx->gb = (EcGroup*)gb;
+ pairing_state_ctx->ff = (FiniteField*)ff;
+
+ // get Fq3, Fq
+ pairing_state_ctx->Fq3 = ff->ground_ff;
+ if (!pairing_state_ctx->Fq3) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq3 = pairing_state_ctx->Fq3->ipp_ff;
+ pairing_state_ctx->Fq = pairing_state_ctx->Fq3->ground_ff;
+ Ffq = pairing_state_ctx->Fq;
+ if (!pairing_state_ctx->Fq) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ Fq = pairing_state_ctx->Fq->ipp_ff;
+
+ // compute fq3_inv_constant = (inverse(qnr), 0, 0)
+ result = NewFfElement(pairing_state_ctx->Fq3,
+ &pairing_state_ctx->fq3_inv_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(pairing_state_ctx->Fq, &neg_qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(pairing_state_ctx->Fq, &qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(pairing_state_ctx->Fq, &inv_qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteBigNum(ff->modulus_0, sizeof(ff_modulus), &ff_modulus);
+ BREAK_ON_EPID_ERROR(result);
+ result = SetFfElementOctString((ConstOctStr)ff_modulus.x[0].x,
+ sizeof(ff_modulus.x[0].x), neg_qnr,
+ pairing_state_ctx->Fq);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfNeg(pairing_state_ctx->Fq, neg_qnr, qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfInv(pairing_state_ctx->Fq, qnr, inv_qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteFfElement(pairing_state_ctx->Fq, inv_qnr, &fq3_str.a[0],
+ sizeof(fq3_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(pairing_state_ctx->Fq3, &fq3_str, sizeof(fq3_str),
+ pairing_state_ctx->fq3_inv_constant);
+ BREAK_ON_EPID_ERROR(result);
+
+ // compute fq3_inv2_constant = (inverse(qnr)^2, 0, 0)
+ // inv_qnr = inv_qnr^2
+ result = NewFfElement(pairing_state_ctx->Fq3,
+ &pairing_state_ctx->fq3_inv2_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(pairing_state_ctx->Fq, inv_qnr, inv_qnr, inv_qnr);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteFfElement(pairing_state_ctx->Fq, inv_qnr, &fq3_str.a[0],
+ sizeof(fq3_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(pairing_state_ctx->Fq3, &fq3_str, sizeof(fq3_str),
+ pairing_state_ctx->fq3_inv2_constant);
+ BREAK_ON_EPID_ERROR(result);
+
+ // save parameters a and p for future use
+ result = NewFfElement(pairing_state_ctx->Fq, &pairing_state_ctx->a);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(BigNumStr), &p);
+ BREAK_ON_EPID_ERROR(result);
+ sts =
+ ippsGFpECGet(NULL, pairing_state_ctx->a->ipp_ff_elem, NULL, ga->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpECGetSubgroup(NULL, NULL, NULL, p->ipp_bn, NULL, ga->ipp_ec);
+ BREAK_ON_IPP_ERROR(sts, result);
+ // compute p bit size requred for pairing
+ sts = ippsGetOctString_BN((OctStr)&pairing_state_ctx->p,
+ sizeof(pairing_state_ctx->p), p->ipp_bn);
+ BREAK_ON_IPP_ERROR(sts, result);
+ pairing_state_ctx->p_bitsize = OctStrBitSize(
+ pairing_state_ctx->p.data.data, sizeof(pairing_state_ctx->p.data.data));
+
+ // compute final_exp_constant = (q^2 - q + 1)/p
+ result = NewBigNum(2 * sizeof(BigNumStr),
+ &pairing_state_ctx->final_exp_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(BigNumStr), &tmp);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(one_str, sizeof(one_str), tmp);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = BigNumMul(Ffq->modulus_0, Ffq->modulus_0,
+ pairing_state_ctx->final_exp_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = BigNumSub(pairing_state_ctx->final_exp_constant, Ffq->modulus_0,
+ pairing_state_ctx->final_exp_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = BigNumAdd(pairing_state_ctx->final_exp_constant, tmp,
+ pairing_state_ctx->final_exp_constant);
+ BREAK_ON_EPID_ERROR(result);
+ result = BigNumDiv(pairing_state_ctx->final_exp_constant, p,
+ pairing_state_ctx->final_exp_constant, tmp);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteBigNum(tmp, sizeof(remainder_str), &remainder_str);
+ if (kEpidNoErr != result || 0 != remainder_str) {
+ result = kEpidBadArgErr; // p does not divide (q^2 - q + 1)
+ break;
+ }
+
+ for (i = 0; i < 3; i++) {
+ result = NewFfElement(pairing_state_ctx->Fq3,
+ &(pairing_state_ctx->alpha_q[i]));
+ BREAK_ON_EPID_ERROR(result);
+ }
+ BREAK_ON_EPID_ERROR(result);
+ /* t^(0*q) */
+ trans_100.a[0].data.data[31] = 1;
+ result = ReadFfElement(pairing_state_ctx->Fq3, &trans_100,
+ sizeof(trans_100), pairing_state_ctx->alpha_q[0]);
+ BREAK_ON_EPID_ERROR(result);
+ /* t^(1*q) */
+ trans_010.a[1].data.data[31] = 1;
+ result = ReadFfElement(pairing_state_ctx->Fq3, &trans_010,
+ sizeof(trans_010), pairing_state_ctx->alpha_q[1]);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfExp(pairing_state_ctx->Fq3, pairing_state_ctx->alpha_q[1],
+ Ffq->modulus_0, pairing_state_ctx->alpha_q[1]);
+ BREAK_ON_EPID_ERROR(result);
+ /* t^(2*q) */
+ result =
+ FfMul(pairing_state_ctx->Fq3, pairing_state_ctx->alpha_q[1],
+ pairing_state_ctx->alpha_q[1], pairing_state_ctx->alpha_q[2]);
+ BREAK_ON_EPID_ERROR(result);
+
+ *ps = pairing_state_ctx;
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&fq3_str, sizeof(fq3_str));
+ DeleteBigNum(&p);
+ DeleteBigNum(&tmp);
+ DeleteFfElement(&qnr);
+ DeleteFfElement(&inv_qnr);
+ DeleteFfElement(&neg_qnr);
+ if (kEpidNoErr != result) {
+ if (pairing_state_ctx) {
+ DeleteFfElement(&pairing_state_ctx->a);
+ DeleteFfElement(&pairing_state_ctx->fq3_inv_constant);
+ DeleteFfElement(&pairing_state_ctx->fq3_inv2_constant);
+ DeleteBigNum(&pairing_state_ctx->final_exp_constant);
+ for (i = 0; i < 3; i++) {
+ DeleteFfElement(&(pairing_state_ctx->alpha_q[i]));
+ }
+ SAFE_FREE(pairing_state_ctx);
+ }
+ }
+ return result;
+}
+
+void DeleteEpid11PairingState(Epid11PairingState** ps) {
+ size_t i;
+ if (ps && *ps) {
+ DeleteFfElement(&(*ps)->a);
+ DeleteFfElement(&(*ps)->fq3_inv_constant);
+ DeleteFfElement(&(*ps)->fq3_inv2_constant);
+ DeleteBigNum(&(*ps)->final_exp_constant);
+ for (i = 0; i < 3; i++) {
+ DeleteFfElement(&(*ps)->alpha_q[i]);
+ }
+ SAFE_FREE(*ps);
+ }
+}
+
+EpidStatus Epid11Pairing(Epid11PairingState* ps, EcPoint const* a,
+ EcPoint const* b, FfElement* d) {
+ EpidStatus result = kEpidErr;
+ IppStatus sts;
+ FfElement* b0 = NULL;
+ FfElement* b1 = NULL;
+ FfElement* pQx = NULL;
+ FfElement* pQy = NULL;
+ FfElement* px = NULL;
+ FfElement* py = NULL;
+ FfElement* X = NULL;
+ FfElement* Y = NULL;
+ FfElement* Z = NULL;
+ FfElement* X2 = NULL;
+ FfElement* Y2 = NULL;
+ FfElement* Z2 = NULL;
+ FfElement* w = NULL;
+ FfElement* v = NULL;
+ FfElement* ty = NULL;
+ FfElement* ry = NULL;
+ FfElement* tx = NULL;
+ FfElement* rx = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* tt1 = NULL;
+ FfElement* tt2 = NULL;
+ FfElement* r = NULL;
+ Epid11G1ElemStr a_str = {0};
+ Epid11G2ElemStr b_str = {0};
+ Epid11GtElemStr bx_str = {0};
+ Epid11GtElemStr by_str = {0};
+ bool is_identity;
+ int i;
+
+ if (!ps || !a || !b || !d) return kEpidBadArgErr;
+ if (!ps->Fq || !ps->Fq3) {
+ return kEpidBadArgErr;
+ }
+ if (!ps->Fq->ipp_ff || !ps->Fq3->ipp_ff) {
+ return kEpidBadArgErr;
+ }
+ do {
+ Epid11GtElemStr one_fq6 = {0};
+ FqElemStr one_fq = {0};
+ one_fq6.a[0].a[0].data.data[31] = 1;
+ one_fq.data.data[31] = 1;
+
+ // If P = O, point at infinity, then return r = 1
+ result = EcIsIdentity(ps->ga, a, &is_identity);
+ BREAK_ON_EPID_ERROR(result);
+ if (is_identity) {
+ result = ReadFfElement(ps->ff, &one_fq6, sizeof(one_fq6), d);
+ BREAK_ON_EPID_ERROR(result);
+ result = kEpidNoErr;
+ break;
+ }
+
+ // Let Q = (Q.x, Q.y), where Q.x and Q.y are elements in Fqd.
+ result = NewFfElement(ps->Fq3, &b0);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq3, &b1);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteEcPoint(ps->gb, b, &b_str, sizeof(b_str));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq3, &b_str.x, sizeof(b_str.x), b0);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq3, &b_str.y, sizeof(b_str.y), b1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Now we compute Qx, Qy, two elements in GT, as follows.
+ result = NewFfElement(ps->ff, &pQx);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &pQy);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Compute Qx = (inv * Q.x, 0).
+ result = FfMul(ps->Fq3, ps->fq3_inv_constant, b0, b0);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteFfElement(ps->Fq3, b0, &bx_str.a[0], sizeof(bx_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->ff, &bx_str, sizeof(bx_str), pQx);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Compute Qy = (0, inv^2 * Q.y).
+ result = FfMul(ps->Fq3, ps->fq3_inv2_constant, b1, b1);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteFfElement(ps->Fq3, b1, &by_str.a[1], sizeof(by_str.a[1]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->ff, &by_str, sizeof(by_str), pQy);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Let P = (px, py), where px, py are big integers.
+ result = NewFfElement(ps->Fq, &px);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &py);
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteEcPoint(ps->ga, a, &a_str, sizeof(a_str));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq, &a_str.x, sizeof(a_str.x), px);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq, &a_str.y, sizeof(a_str.y), py);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Let X, Y, Z, X', Y', Z', w, v, ty, ry be elements in Fq.
+ result = NewFfElement(ps->Fq, &X);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &Y);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &Z);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &X2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &Y2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &Z2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &w);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &v);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &ty);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &ry);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &t2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq, &t3);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Let tx, rx be elements in GT.
+ result = NewFfElement(ps->ff, &tx);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &rx);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &tt1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &r);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Set X = px,
+ result = ReadFfElement(ps->Fq, &a_str.x, sizeof(a_str.x), X);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Y = py,
+ result = ReadFfElement(ps->Fq, &a_str.y, sizeof(a_str.y), Y);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Z = 1,
+ result = ReadFfElement(ps->Fq, &one_fq, sizeof(one_fq), Z);
+ BREAK_ON_EPID_ERROR(result);
+
+ // ry = 1.
+ result = ReadFfElement(ps->Fq, &one_fq, sizeof(one_fq), ry);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Set rx = 1, identity element of GT.
+ result = ReadFfElement(ps->ff, &one_fq6, sizeof(one_fq6), rx);
+ BREAK_ON_EPID_ERROR(result);
+
+ // Let pn ... p1 p0 be the binary representation of p
+ // For i = n-1, ..., 0 do
+ for (i = (int)ps->p_bitsize - 2; i >= 0; i--) {
+ bool pi = ps->p.data.data[sizeof(ps->p) - 1 - (i >> 3)] & (1 << (i & 7));
+
+ result = FfMul(ps->Fq, Z, Z, ty); // ty = Z^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, ty, ty, t1); // t1 = Z^4
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, t1, ps->a, t1); // t1 = a*Z^4
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, X, X, w); // w = X^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, w, w, t2); // t2 = 2 * X^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, w, t2, w); // w = 3 * X^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, w, t1, w); // w = 3 * X^2 + a * Z^4
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfMul(ps->Fq, Y, Y, t1); // t1 = Y^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, t1, t1, t3); // t3 = 2* Y^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, t3, X, v); // v = 2 * X * Y^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, v, v, v); // v = 4 * X * Y^2
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfMul(ps->Fq, w, w, X2); // X2 = w^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, X2, v, X2); // X2 = w^2 - v
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, X2, v, X2); // X2 = w^2 - 2 * w
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfMul(ps->Fq, t3, t3, t3); // t3 = 4 * Y^4
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, t3, t3, t3); // t3 = 8 * Y^4
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, v, X2, Y2); // Y2 = v - X2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, Y2, w, Y2); // Y2 = w * (v - X2)
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, Y2, t3, Y2); // Y2 = w * (v - X2) - 8 * Y^4
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfMul(ps->Fq, Y, Z, Z2); // Z2 = Y * Z
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->Fq, Z2, Z2, Z2); // Z2 = 2 * Y * Z
+ BREAK_ON_EPID_ERROR(result);
+
+ /* compute line */
+ result = FfMul(ps->Fq, ty, w, t2); // t2 = w * Z^2
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, t2, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, pQx, tt2, tt1); // tt1 = w * Z^2 * Qx
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, w, X, t2); // t2 = w * X
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, t2, t1, t2); // t2 = w * X - Y^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, t2, t1, t2); // t2 = w * X - 2 * Y^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, ty, Z2, ty); // ty = Z2 * Z^2
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, ty, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, pQy, tt2, tx); // tx = ty * Qy
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->ff, tx, tt1, tx); // tx = ty * Qy - w * Z^2 * Qx
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, t2, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfAdd(ps->ff, tx, tt2,
+ tx); // tx = ty * Qy - w * Z^2 * Qx + w * X - 2 * Y^2
+ BREAK_ON_EPID_ERROR(result);
+
+ sts = ippsGFpCpyElement(X2->ipp_ff_elem, X->ipp_ff_elem,
+ ps->Fq->ipp_ff); // X = X2
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpCpyElement(Y2->ipp_ff_elem, Y->ipp_ff_elem,
+ ps->Fq->ipp_ff); // Y = Y2
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpCpyElement(Z2->ipp_ff_elem, Z->ipp_ff_elem,
+ ps->Fq->ipp_ff); // Z = Z2
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ /* udpate rx, ry */
+ result = FfMul(ps->ff, rx, rx, tt1); // tt1 = rx * rx
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, tx, tt1, rx); // rx = tx * rx * rx
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, ry, ry, t1); // t1 = ry * ry
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, ty, t1, ry); // ry = ty * ry * ry
+ BREAK_ON_EPID_ERROR(result);
+
+ if (pi && i) {
+ result = FfMul(ps->Fq, Z, Z, t1); // t1 = Z^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, px, t1, w); // w = px * Z^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, w, X, w); // w = px * Z^2 - X
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, t1, Z, t1); // t1 = Z^3
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, py, t1, v); // v = py * Z^3
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, v, Y, v); // v = py * Z^3 - Y
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfMul(ps->Fq, w, w, t1); // t1 = w^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, w, t1, t2); // t2 = w^3
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, X, t1, t3); // t3 = X * w^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, v, v, X2); // X2 = v^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, X2, t2, X2); // X2 = v^2 - w^3
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, X2, t3, X2); // X2 = v^2 - w^3 - X * w^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, X2, t3, X2); // X2 = v^2 - w^3 - 2 * X * w^2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->Fq, t3, X2, Y2); // Y2 = X * w^2 - X2
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, Y2, v, Y2); // Y2 = v * (X * w^2 - X2)
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, t2, Y, t2); // t2 = Y * w^3
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ FfSub(ps->Fq, Y2, t2, Y2); // Y2 = v * (X * w^2 - X2) - Y * w^3
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, w, Z, Z2); // Z2 = w * Z
+ BREAK_ON_EPID_ERROR(result);
+
+ /* compute tx, ty */
+ sts = ippsGFpCpyElement(Z2->ipp_ff_elem, ty->ipp_ff_elem,
+ ps->Fq->ipp_ff); // ty = Z2
+ BREAK_ON_IPP_ERROR(sts, result);
+ result = Fq6FromFq(ps->ff, ps->Fq, py, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->ff, pQy, tt2, tx); // tx = Qy - py
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, Z2, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, tx, tt2, tx); // tx = Z2 * (Qy - py)
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, px, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfSub(ps->ff, pQx, tt2, tt1); // tt1 = Qx - px
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, v, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, tt1, tt2, tt1); // tt1 = v * (Qx - px)
+ BREAK_ON_EPID_ERROR(result);
+ result =
+ FfSub(ps->ff, tx, tt1, tx); // tx = Z2 * (Qy - py) - v * (Qx - px)
+ BREAK_ON_EPID_ERROR(result);
+
+ sts = ippsGFpCpyElement(X2->ipp_ff_elem, X->ipp_ff_elem,
+ ps->Fq->ipp_ff); // X = X2
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpCpyElement(Y2->ipp_ff_elem, Y->ipp_ff_elem,
+ ps->Fq->ipp_ff); // Y = Y2
+ BREAK_ON_IPP_ERROR(sts, result);
+ sts = ippsGFpCpyElement(Z2->ipp_ff_elem, Z->ipp_ff_elem,
+ ps->Fq->ipp_ff); // Z = Z2
+ BREAK_ON_IPP_ERROR(sts, result);
+
+ /* udpate rx, ry */
+ result = FfMul(ps->ff, rx, tx, rx); // rx = rx * tx
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->Fq, ry, ty, ry); // ry = ry * ty
+ BREAK_ON_EPID_ERROR(result);
+ }
+ }
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FfInv(ps->Fq, ry, ry); // ry = ry^-1
+ BREAK_ON_EPID_ERROR(result);
+ result = Fq6FromFq(ps->ff, ps->Fq, ry, tt2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, rx, tt2, r); // r = rx * ry
+ BREAK_ON_EPID_ERROR(result);
+
+ result = FinalExp(ps, r, d);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = kEpidNoErr;
+ BREAK_ON_EPID_ERROR(result);
+ } while (0);
+
+ EpidZeroMemory(&a_str, sizeof(a_str));
+ EpidZeroMemory(&b_str, sizeof(b_str));
+ EpidZeroMemory(&bx_str, sizeof(bx_str));
+ EpidZeroMemory(&by_str, sizeof(by_str));
+ DeleteFfElement(&b0);
+ DeleteFfElement(&b1);
+ DeleteFfElement(&pQx);
+ DeleteFfElement(&pQy);
+ DeleteFfElement(&px);
+ DeleteFfElement(&py);
+ DeleteFfElement(&X);
+ DeleteFfElement(&Y);
+ DeleteFfElement(&Z);
+ DeleteFfElement(&X2);
+ DeleteFfElement(&Y2);
+ DeleteFfElement(&Z2);
+ DeleteFfElement(&w);
+ DeleteFfElement(&v);
+ DeleteFfElement(&ty);
+ DeleteFfElement(&ry);
+ DeleteFfElement(&tx);
+ DeleteFfElement(&rx);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&tt1);
+ DeleteFfElement(&tt2);
+ DeleteFfElement(&r);
+ return result;
+}
+
+static EpidStatus Fq6FromFq(FiniteField* fq6, FiniteField* fq,
+ FfElement const* a, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ // initialize all Fq6 coefficients to 0
+ Fq6ElemStr r_str = {0};
+
+ if (!fq6 || !fq || !a || !r) return kEpidBadArgErr;
+
+ do {
+ // set Fq6 degree zero coefficient to 'a'
+ result = WriteFfElement(fq, a, &r_str.a[0].a[0], sizeof(r_str.a[0].a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(fq6, &r_str, sizeof(r_str), r);
+ BREAK_ON_EPID_ERROR(result);
+ result = kEpidNoErr;
+ } while (0);
+ EpidZeroMemory(&r_str, sizeof(r_str));
+ return result;
+}
+
+/// Set r from Fq6 to (a, b), where a and b from Fq3
+static EpidStatus JoinFq3(Epid11PairingState* ps, FfElement const* a,
+ FfElement const* b, FfElement* r) {
+ EpidStatus result = kEpidErr;
+ Epid11GtElemStr r_str = {0};
+
+ do {
+ // validate inputs
+ if (!ps || !a || !b || !r) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ result = WriteFfElement(ps->Fq3, a, &r_str.a[0], sizeof(r_str.a[0]));
+ BREAK_ON_EPID_ERROR(result);
+ result = WriteFfElement(ps->Fq3, b, &r_str.a[1], sizeof(r_str.a[1]));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->ff, &r_str, sizeof(r_str), r);
+ BREAK_ON_EPID_ERROR(result);
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&r_str, sizeof(r_str));
+ return result;
+}
+
+/// Set a0 and a1 from Fq3 to a0' and a1', where a = (a0', a1') from Fq6
+static EpidStatus SplitFq6(Epid11PairingState* ps, FfElement const* a,
+ FfElement* a0, FfElement* a1) {
+ EpidStatus result = kEpidErr;
+ Epid11GtElemStr a_str = {0};
+
+ do {
+ // validate inputs
+ if (!ps || !a0 || !a1 || !a) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ result = WriteFfElement(ps->ff, a, &a_str, sizeof(a_str));
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq3, &a_str.a[0], sizeof(a_str.a[0]), a0);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadFfElement(ps->Fq3, &a_str.a[1], sizeof(a_str.a[1]), a1);
+ BREAK_ON_EPID_ERROR(result);
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_str, sizeof(a_str));
+ return result;
+}
+
+static EpidStatus FinalExp(Epid11PairingState* ps, FfElement const* r,
+ FfElement* d) {
+ EpidStatus result = kEpidErr;
+ FfElement* r0 = NULL;
+ FfElement* r1 = NULL;
+ FfElement* neg_r1 = NULL;
+ FfElement* x = NULL;
+ FfElement* y = NULL;
+ FfElement* neg_y = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* t4 = NULL;
+ FfElement* d1 = NULL;
+ FfElement* d2 = NULL;
+ FfElement* inv_d2 = NULL;
+ do {
+ // validate inputs
+ if (!ps || !r || !d) {
+ result = kEpidBadArgErr;
+ break;
+ }
+
+ // a.Let r = (r[0], r[1]), where r[0] and r[1] are elements in Fqd,
+ result = NewFfElement(ps->Fq3, &r0);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq3, &r1);
+ BREAK_ON_EPID_ERROR(result);
+ result = SplitFq6(ps, r, r0, r1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // b.Compute x = transform(r[0]), where x is an element in Fqd,
+ result = NewFfElement(ps->Fq3, &x);
+ BREAK_ON_EPID_ERROR(result);
+ result = Transform(ps, r0, x);
+ BREAK_ON_EPID_ERROR(result);
+
+ // c.Compute y = transform(r[1]), where x is an element in Fqd,
+ result = NewFfElement(ps->Fq3, &y);
+ BREAK_ON_EPID_ERROR(result);
+ result = Transform(ps, r1, y);
+ BREAK_ON_EPID_ERROR(result);
+
+ // d.Let t1, t2, t3, t4 be four variables in GT,
+ result = NewFfElement(ps->ff, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &t2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &t3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->ff, &t4);
+
+ //
+ // e.t1 = (x, y), t2 = (r[0], -r[1]), t3 = (x, -y), t4 = (r[0], r[1]),
+ //
+
+ // t1 = (x, y)
+ result = JoinFq3(ps, x, y, t1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // t2 = (r[0], -r[1])
+ result = NewFfElement(ps->Fq3, &neg_r1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfNeg(ps->Fq3, r1, neg_r1);
+ BREAK_ON_EPID_ERROR(result);
+ result = JoinFq3(ps, r0, neg_r1, t2);
+ BREAK_ON_EPID_ERROR(result);
+
+ // t3 = (x, -y)
+ result = NewFfElement(ps->Fq3, &neg_y);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfNeg(ps->Fq3, y, neg_y);
+ BREAK_ON_EPID_ERROR(result);
+ result = JoinFq3(ps, x, neg_y, t3);
+ BREAK_ON_EPID_ERROR(result);
+
+ // t4 = (r[0], r[1])
+ result = JoinFq3(ps, r0, r1, t4);
+ BREAK_ON_EPID_ERROR(result);
+
+ //
+ // f. d = (t1 * t2) / (t3 * t4),
+ //
+
+ // d1 = t1 * t2
+ result = NewFfElement(ps->ff, &d1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, t1, t2, d1);
+ BREAK_ON_EPID_ERROR(result);
+
+ // d2 = t3 * t4
+ result = NewFfElement(ps->ff, &d2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, t3, t4, d2);
+ BREAK_ON_EPID_ERROR(result);
+
+ // d = d1 / d2
+ result = NewFfElement(ps->ff, &inv_d2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfInv(ps->ff, d2, inv_d2);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfMul(ps->ff, d1, inv_d2, d);
+ BREAK_ON_EPID_ERROR(result);
+
+ // g.Compute d = GT.exp(d, (q2 - q + 1) / p).
+ result = FfExp(ps->ff, d, ps->final_exp_constant, d);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&r0);
+ DeleteFfElement(&r1);
+ DeleteFfElement(&neg_r1);
+ DeleteFfElement(&x);
+ DeleteFfElement(&y);
+ DeleteFfElement(&neg_y);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t4);
+ DeleteFfElement(&d1);
+ DeleteFfElement(&d2);
+ DeleteFfElement(&inv_d2);
+ return result;
+}
+
+static EpidStatus Transform(Epid11PairingState* ps, FfElement const* a,
+ FfElement* b) {
+ EpidStatus result = kEpidErr;
+ FfElement* tmp = NULL;
+ Fq3ElemStr zero = {0};
+ Fq3ElemStr a_str = {0};
+ Fq3ElemStr tmp_str = {0};
+ int i = 0;
+
+ if (!ps || !a || !b) return kEpidBadArgErr;
+
+ do {
+ result = WriteFfElement(ps->Fq3, a, &a_str, sizeof(a_str));
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(ps->Fq3, &tmp);
+ BREAK_ON_EPID_ERROR(result);
+ // b = 0
+ result = ReadFfElement(ps->Fq3, &zero, sizeof(zero), b);
+ BREAK_ON_EPID_ERROR(result);
+ for (i = 0; i < 3; i++) {
+ // tmp = (a[0][i], 0, 0)
+ tmp_str.a[0] = a_str.a[i];
+ result = ReadFfElement(ps->Fq3, &tmp_str, sizeof(tmp_str), tmp);
+ BREAK_ON_EPID_ERROR(result);
+ // tmp *= alpha_q[i]
+ result = FfMul(ps->Fq3, ps->alpha_q[i], tmp, tmp);
+ BREAK_ON_EPID_ERROR(result);
+ // b += tmp
+ result = FfAdd(ps->Fq3, tmp, b, b);
+ BREAK_ON_EPID_ERROR(result);
+ }
+ BREAK_ON_EPID_ERROR(result);
+ result = kEpidNoErr;
+ } while (0);
+
+ EpidZeroMemory(&a_str, sizeof(a_str));
+ EpidZeroMemory(&tmp_str, sizeof(tmp_str));
+ DeleteFfElement(&tmp);
+ return result;
+}
diff --git a/epid/common/math/tatepairing.h b/epid/common/math/tatepairing.h
new file mode 100644
index 0000000..4ac09e8
--- /dev/null
+++ b/epid/common/math/tatepairing.h
@@ -0,0 +1,124 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 Pairing interface.
+ */
+
+#ifndef EPID_COMMON_MATH_TATEPAIRING_H_
+#define EPID_COMMON_MATH_TATEPAIRING_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/types.h"
+
+/// Intel(R) EPID 1.1 pairing operations
+/*!
+
+ \defgroup Epid11PairingPrimitives Intel(R) EPID 1.1 specific pairing
+ Provides APIs for defining and using a pairing relationship between two
+ Elliptic curve groups.
+
+ These pairing operations are intended to support Intel(R) EPID
+ 1.1 verification.
+
+ \ingroup PairingPrimitives
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID
+ 1.1
+ support</b></a>
+ @{
+*/
+
+/// A pairing
+typedef struct Epid11PairingState Epid11PairingState;
+
+/// Constructs a new Tate pairing state.
+/*!
+ Allocates memory and creates a new pairing state for Tate pairing.
+
+ Use DeleteEpid11PairingState() to free memory.
+
+ This pairing operation is intended to support Intel(R) EPID
+ 1.1 verification.
+
+ \param[in] ga
+ The EcGroup from which the first parameter of the pairing will be taken.
+ \param[in] gb
+ The EcGroup from which the second parameter of the pairing will be taken.
+ \param[in] ff
+ The result finite field. Must be a Fq12 field.
+ \param[out] ps
+ Newly constructed pairing state.
+
+ \returns ::EpidStatus
+
+ \attention It is the responsibility of the caller to ensure that ga, gb, and
+ ff exist for the entire lifetime of the new Epid11PairingState.
+
+ \see DeleteEpid11PairingState
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+ support</b></a>
+*/
+EpidStatus NewEpid11PairingState(EcGroup const* ga, EcGroup const* gb,
+ FiniteField const* ff,
+ Epid11PairingState** ps);
+
+/// Frees a previously allocated by Epid11PairingState.
+/*!
+ Frees memory pointed to by pairing state. Nulls the pointer.
+
+ This pairing operation is intended to support Intel(R) EPID
+ 1.1 verification.
+
+ \param[in] ps
+ The pairing state. Can be NULL.
+
+ \see NewEpid11PairingState
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+ support</b></a>
+*/
+void DeleteEpid11PairingState(Epid11PairingState** ps);
+
+/// Computes a Tate Pairing for two parameters.
+/*!
+This pairing operation is intended to support Intel(R) EPID
+1.1 verification. It frees memory pointed to by an Intel(R) EPID
+1.1 pairing state.
+
+ \param[in] ps
+ The pairing state.
+ \param[in] a
+ The first value to pair. Must be in ga.
+ \param[in] b
+ The second value to pair. Must be in gb.
+ \param[out] d
+ The result of the pairing. Must be in ff.
+
+ \returns ::EpidStatus
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+ support</b></a>
+*/
+EpidStatus Epid11Pairing(Epid11PairingState* ps, EcPoint const* a,
+ EcPoint const* b, FfElement* d);
+
+/*!
+ @}
+*/
+
+#endif // EPID_COMMON_MATH_TATEPAIRING_H_
diff --git a/epid/common/math/unittests/bignum-test.cc b/epid/common/math/unittests/bignum-test.cc
new file mode 100644
index 0000000..5de5c17
--- /dev/null
+++ b/epid/common/math/unittests/bignum-test.cc
@@ -0,0 +1,534 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief BigNum unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+}
+
+namespace {
+
+// Use Test Fixture for SetUp and TearDown
+class BigNumTest : public ::testing::Test {
+ public:
+ static const BigNumStr str_0;
+ static const BigNumStr str_1;
+ static const BigNumStr str_2;
+ static const BigNumStr str_big;
+ static const BigNumStr str_2big;
+ static const BigNumStr str_large_m1;
+ static const BigNumStr str_large;
+ static const BigNumStr str_large_p1;
+ static const BigNumStr str_32byte_high_bit_set;
+ static const BigNumStr str_32byte_high;
+ static const std::vector<unsigned char> vec_33byte_low;
+ virtual void SetUp() {}
+
+ virtual void TearDown() {}
+
+ ::testing::AssertionResult CompareBigNumStr(const BigNumStr* expected,
+ const BigNumStr* actual);
+
+ ::testing::AssertionResult CompareBigNum(const BigNum* expected,
+ const BigNum* actual);
+};
+
+const BigNumStr BigNumTest::str_0{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+const BigNumStr BigNumTest::str_1{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+const BigNumStr BigNumTest::str_2{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
+const BigNumStr BigNumTest::str_big{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const BigNumStr BigNumTest::str_2big{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const BigNumStr BigNumTest::str_large_m1{
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0C};
+
+/// Intel(R) EPID 2.0 parameter p
+const BigNumStr BigNumTest::str_large{
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+const BigNumStr BigNumTest::str_large_p1{
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0E};
+const BigNumStr BigNumTest::str_32byte_high{
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+const BigNumStr BigNumTest::str_32byte_high_bit_set{
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const std::vector<unsigned char> BigNumTest::vec_33byte_low{
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+::testing::AssertionResult BigNumTest::CompareBigNumStr(
+ const BigNumStr* expected, const BigNumStr* actual) {
+ int size = sizeof(BigNumStr);
+ unsigned char* expected_str = (unsigned char*)expected;
+ unsigned char* actual_str = (unsigned char*)actual;
+ for (int i = 0; i < size; ++i) {
+ if (expected_str[i] != actual_str[i]) {
+ return ::testing::AssertionFailure()
+ << "Mismatch at " << i << " : Expected " << std::hex
+ << expected_str[i] << " Found " << std::hex << actual_str[i];
+ }
+ }
+
+ return ::testing::AssertionSuccess();
+}
+
+::testing::AssertionResult BigNumTest::CompareBigNum(const BigNum* expected_bn,
+ const BigNum* actual_bn) {
+ size_t size = 0;
+ std::vector<unsigned char> expected_str;
+ std::vector<unsigned char> actual_str;
+ // Use an extra huge size so we have plenty of room to check
+ // overflow tests. This assumes no tests try to create a number
+ // bigger than 64 bytes.
+ size = sizeof(BigNumStr) * 2;
+ expected_str.resize(size, 0);
+ actual_str.resize(size, 0);
+
+ THROW_ON_EPIDERR(WriteBigNum(expected_bn, size, &expected_str[0]));
+ THROW_ON_EPIDERR(WriteBigNum(actual_bn, size, &actual_str[0]));
+
+ for (size_t i = 0; i < size; ++i) {
+ if (expected_str[i] != actual_str[i]) {
+ return ::testing::AssertionFailure() << "Numbers do not match";
+ }
+ }
+
+ return ::testing::AssertionSuccess();
+}
+
+///////////////////////////////////////////////////////////////////////
+// Create / Destroy
+
+TEST_F(BigNumTest, NewCanCreate256BitBigNum) {
+ BigNum* bn = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewBigNum(32, &bn));
+ DeleteBigNum(&bn);
+}
+
+TEST_F(BigNumTest, NewFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, NewBigNum(sizeof(BigNumStr), NULL));
+}
+
+TEST_F(BigNumTest, NewFailsGivenSizeZero) {
+ BigNum* bn = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewBigNum(0, &bn));
+ DeleteBigNum(&bn);
+}
+
+TEST_F(BigNumTest, DeleteBigNumNullsPointer) {
+ BigNum* bn = nullptr;
+ THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
+ DeleteBigNum(&bn);
+ EXPECT_EQ(nullptr, bn);
+}
+
+TEST_F(BigNumTest, DeleteWorksGivenNullPointer) {
+ BigNum* bn = nullptr;
+ DeleteBigNum(nullptr);
+ EXPECT_EQ(nullptr, bn);
+}
+
+///////////////////////////////////////////////////////////////////////
+// Serialization
+
+TEST_F(BigNumTest, ReadFailsGivenNullPtr) {
+ BigNum* bn = nullptr;
+ THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
+ EXPECT_EQ(kEpidBadArgErr, ReadBigNum(NULL, sizeof(BigNumStr), bn));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadBigNum(&this->str_large, sizeof(BigNumStr), NULL));
+ DeleteBigNum(&bn);
+}
+
+TEST_F(BigNumTest, ReadFailsGivenInvalidBufferSize) {
+ BigNumObj bn(32);
+ EXPECT_EQ(kEpidBadArgErr, ReadBigNum(&this->str_0, 0, bn));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadBigNum(&this->str_0, std::numeric_limits<size_t>::max(), bn));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr, ReadBigNum(&this->str_0, 0x100000001, bn));
+#endif
+}
+
+TEST_F(BigNumTest, ReadFailsGivenTooBigBuffer) {
+ BigNum* bn = nullptr;
+ THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
+ EXPECT_NE(kEpidNoErr, ReadBigNum(&this->vec_33byte_low[0],
+ this->vec_33byte_low.size(), bn));
+ DeleteBigNum(&bn);
+}
+
+TEST_F(BigNumTest, WriteFailsGivenNullPtr) {
+ BigNum* bn = nullptr;
+ BigNumStr str = {0};
+ THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
+ EXPECT_EQ(kEpidBadArgErr, WriteBigNum(NULL, sizeof(str), &str));
+ EXPECT_EQ(kEpidBadArgErr, WriteBigNum(bn, 0, NULL));
+ DeleteBigNum(&bn);
+}
+
+TEST_F(BigNumTest, WriteFailsGivenTooSmallBuffer) {
+ BigNumStr str;
+ BigNumObj bn(this->vec_33byte_low);
+ EXPECT_NE(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
+}
+
+TEST_F(BigNumTest, ReadCanDeSerializeBigNumStrZero) {
+ BigNumObj bn_ref;
+ BigNumObj bn;
+ EXPECT_EQ(kEpidNoErr, ReadBigNum(&this->str_0, sizeof(this->str_0), bn));
+ // No way to check this yet
+}
+
+TEST_F(BigNumTest, ReadCanDeSerializeBigNum) {
+ BigNumObj bn;
+ EXPECT_EQ(kEpidNoErr,
+ ReadBigNum(&this->str_large, sizeof(this->str_large), bn));
+ // No way to check this yet
+}
+
+TEST_F(BigNumTest, WriteCanSerializeBigNumZero) {
+ BigNumObj bn; // defaults to 0
+ BigNumStr str;
+ EXPECT_EQ(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
+ EXPECT_TRUE(CompareBigNumStr(&str, &this->str_0));
+}
+
+TEST_F(BigNumTest, DeSerializeFollowedBySerializeHasSameValue) {
+ BigNumStr str;
+ BigNumObj bn;
+ EXPECT_EQ(kEpidNoErr,
+ ReadBigNum(&this->str_large, sizeof(this->str_large), bn));
+ EXPECT_EQ(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
+ EXPECT_TRUE(CompareBigNumStr(&this->str_large, &str));
+}
+
+///////////////////////////////////////////////////////////////////////
+// Addition
+
+TEST_F(BigNumTest, AddBadArgumentsFail) {
+ BigNumObj bn;
+ EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(bn, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, nullptr, bn));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(bn, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, bn, bn));
+ EXPECT_NE(kEpidNoErr, BigNumAdd(bn, nullptr, bn));
+}
+
+TEST_F(BigNumTest, AddZeroIsIdentity) {
+ BigNumObj bn;
+ BigNumObj bn_0(this->str_0);
+ BigNumObj bn_large(this->str_large);
+ EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_large, bn_0, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_large));
+}
+
+TEST_F(BigNumTest, AddOneIncrements) {
+ BigNumObj bn;
+ BigNumObj bn_1(this->str_1);
+ BigNumObj bn_large(this->str_large);
+ BigNumObj bn_large_p1(this->str_large_p1);
+ EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_large, bn_1, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_large_p1));
+}
+
+TEST_F(BigNumTest, AddOneTo32ByteInTo32BytesFails) {
+ BigNumObj bn(32);
+ BigNumObj bn_1(this->str_1);
+ BigNumObj bn_32high(this->str_32byte_high);
+ EXPECT_NE(kEpidNoErr, BigNumAdd(bn_32high, bn_1, bn));
+}
+
+TEST_F(BigNumTest, AddOneTo32ByteInTo33BytesIncrements) {
+ BigNumObj bn(33);
+ BigNumObj bn_1(this->str_1);
+ BigNumObj bn_32high(this->str_32byte_high);
+ BigNumObj bn_33low(this->vec_33byte_low);
+ EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_32high, bn_1, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_33low));
+}
+
+///////////////////////////////////////////////////////////////////////
+// Subtraction
+
+TEST_F(BigNumTest, SubBadArgumentsFail) {
+ BigNumObj bn;
+ EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumSub(bn, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, nullptr, bn));
+ EXPECT_NE(kEpidNoErr, BigNumSub(bn, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, bn, bn));
+ EXPECT_NE(kEpidNoErr, BigNumSub(bn, nullptr, bn));
+}
+
+TEST_F(BigNumTest, SubOneFromZeroFails) {
+ BigNumObj bn;
+ BigNumObj bn_0(this->str_0);
+ BigNumObj bn_1(this->str_1);
+ EXPECT_EQ(kEpidUnderflowErr, BigNumSub(bn_0, bn_1, bn));
+}
+
+TEST_F(BigNumTest, SubZeroIsIdentity) {
+ BigNumObj bn;
+ BigNumObj bn_0(this->str_0);
+ BigNumObj bn_large(this->str_large);
+ EXPECT_EQ(kEpidNoErr, BigNumSub(bn_large, bn_0, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_large));
+}
+
+TEST_F(BigNumTest, SubOneDecrements) {
+ BigNumObj bn;
+ BigNumObj bn_1(this->str_1);
+ BigNumObj bn_large(this->str_large);
+ BigNumObj bn_large_m1(this->str_large_m1);
+ EXPECT_EQ(kEpidNoErr, BigNumSub(bn_large, bn_1, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_large_m1));
+}
+
+///////////////////////////////////////////////////////////////////////
+// Multiplication
+
+TEST_F(BigNumTest, MulBadArgumentsFail) {
+ BigNumObj bn;
+ EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumMul(bn, nullptr, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, nullptr, bn));
+ EXPECT_NE(kEpidNoErr, BigNumMul(bn, bn, nullptr));
+ EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, bn, bn));
+ EXPECT_NE(kEpidNoErr, BigNumMul(bn, nullptr, bn));
+}
+
+TEST_F(BigNumTest, MulOneIsIdentity) {
+ BigNumObj bn;
+ BigNumObj bn_1(this->str_1);
+ BigNumObj bn_large(this->str_large);
+ EXPECT_EQ(kEpidNoErr, BigNumMul(bn_large, bn_1, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_large));
+}
+
+TEST_F(BigNumTest, MulTwoIsDouble) {
+ BigNumObj bn;
+ BigNumObj bn_2(this->str_2);
+ BigNumObj bn_big(this->str_big);
+ BigNumObj bn_2big(this->str_2big);
+ EXPECT_EQ(kEpidNoErr, BigNumMul(bn_big, bn_2, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_2big));
+}
+
+TEST_F(BigNumTest, MulZeroIsZero) {
+ BigNumObj bn;
+ BigNumObj bn_0(this->str_0);
+ BigNumObj bn_large(this->str_large);
+ EXPECT_EQ(kEpidNoErr, BigNumMul(bn_large, bn_0, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_0));
+}
+
+TEST_F(BigNumTest, MulReportsErrorGivenOverflow) {
+ BigNumObj bn(32);
+ BigNumObj bn_2(this->str_2);
+ BigNumObj bn_high_bit_set(this->str_32byte_high_bit_set);
+ EXPECT_EQ(kEpidBadArgErr, BigNumMul(bn_high_bit_set, bn_2, bn));
+}
+
+TEST_F(BigNumTest, MulWorksWith264BitValue) {
+ BigNumObj bn(33);
+ BigNumObj bn_2(this->str_2);
+ BigNumObj bn_high_bit_set(this->str_32byte_high_bit_set);
+ BigNumObj bn_33low(this->vec_33byte_low);
+ EXPECT_EQ(kEpidNoErr, BigNumMul(bn_high_bit_set, bn_2, bn));
+ EXPECT_TRUE(CompareBigNum(bn, bn_33low));
+}
+
+///////////////////////////////////////////////////////////////////////
+// Division
+
+TEST_F(BigNumTest, DivFailsGivenNullPointer) {
+ BigNumObj a, b, q, r;
+ EXPECT_EQ(kEpidBadArgErr, BigNumDiv(nullptr, b, q, r));
+ EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, nullptr, q, r));
+ EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, b, nullptr, r));
+ EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, b, q, nullptr));
+}
+
+TEST_F(BigNumTest, DivFailsGivenDivByZero) {
+ BigNumObj a;
+ BigNumObj zero(this->str_0);
+ BigNumObj q, r;
+ EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, zero, q, r));
+}
+
+TEST_F(BigNumTest, DivToOneKeepsOriginal) {
+ BigNumObj a(this->str_large);
+ BigNumObj zero(this->str_0);
+ BigNumObj one(this->str_1);
+ BigNumObj q, r;
+ EXPECT_EQ(kEpidNoErr, BigNumDiv(a, one, q, r));
+ EXPECT_TRUE(CompareBigNum(a, q));
+ EXPECT_TRUE(CompareBigNum(zero, r));
+}
+
+TEST_F(BigNumTest, DivToItselfIsIdentity) {
+ BigNumObj a(this->str_large);
+ BigNumObj zero(this->str_0);
+ BigNumObj one(this->str_1);
+ BigNumObj q, r;
+ EXPECT_EQ(kEpidNoErr, BigNumDiv(a, a, q, r));
+ EXPECT_TRUE(CompareBigNum(one, q));
+ EXPECT_TRUE(CompareBigNum(zero, r));
+}
+
+TEST_F(BigNumTest, DivOneByTwoIsZero) {
+ BigNumObj zero(this->str_0);
+ BigNumObj one(this->str_1);
+ BigNumObj two(this->str_2);
+ BigNumObj q, r;
+ EXPECT_EQ(kEpidNoErr, BigNumDiv(one, two, q, r));
+ EXPECT_TRUE(CompareBigNum(zero, q));
+ EXPECT_TRUE(CompareBigNum(one, r));
+}
+
+///////////////////////////////////////////////////////////////////////
+// IsEven
+
+TEST_F(BigNumTest, IsEvenFailsGivenNullPointer) {
+ BigNumObj zero(this->str_0);
+ bool r;
+ EXPECT_EQ(kEpidBadArgErr, BigNumIsEven(nullptr, &r));
+ EXPECT_EQ(kEpidBadArgErr, BigNumIsEven(zero, nullptr));
+}
+
+TEST_F(BigNumTest, IsEvenPassesEvenNumbers) {
+ BigNumObj zero(this->str_0);
+ BigNumObj two(this->str_2);
+ BigNumObj big(this->str_big);
+ bool r;
+ EXPECT_EQ(kEpidNoErr, BigNumMul(big, two, big));
+ EXPECT_EQ(kEpidNoErr, BigNumIsEven(zero, &r));
+ EXPECT_EQ(kEpidNoErr, BigNumIsEven(two, &r));
+ EXPECT_EQ(kEpidNoErr, BigNumIsEven(big, &r));
+}
+
+TEST_F(BigNumTest, IsEvenFailsOddNumbers) {
+ BigNumObj zero(this->str_0);
+ BigNumObj one(this->str_1);
+ BigNumObj two(this->str_2);
+ BigNumObj big(this->str_big);
+ bool r;
+ EXPECT_EQ(kEpidNoErr, BigNumMul(big, two, big));
+ EXPECT_EQ(kEpidNoErr, BigNumAdd(big, one, big));
+ EXPECT_EQ(kEpidNoErr, BigNumIsEven(one, &r));
+ EXPECT_EQ(kEpidNoErr, BigNumIsEven(big, &r));
+}
+
+///////////////////////////////////////////////////////////////////////
+// IsZero
+TEST_F(BigNumTest, IsZeroFailsGivenNullPointer) {
+ BigNumObj zero(this->str_0);
+ bool r;
+ EXPECT_EQ(kEpidBadArgErr, BigNumIsZero(nullptr, &r));
+ EXPECT_EQ(kEpidBadArgErr, BigNumIsZero(zero, nullptr));
+}
+
+TEST_F(BigNumTest, IsZeroPassesZero) {
+ BigNumObj zero(this->str_0);
+ bool r;
+ EXPECT_EQ(kEpidNoErr, BigNumIsZero(zero, &r));
+}
+
+TEST_F(BigNumTest, IsZeroFailsNonZero) {
+ BigNumObj one(this->str_1);
+ BigNumObj two(this->str_2);
+ BigNumObj big(this->str_big);
+ bool r;
+ EXPECT_EQ(kEpidNoErr, BigNumIsZero(one, &r));
+ EXPECT_EQ(kEpidNoErr, BigNumIsZero(two, &r));
+ EXPECT_EQ(kEpidNoErr, BigNumIsZero(big, &r));
+}
+
+///////////////////////////////////////////////////////////////////////
+// Pow2N
+TEST_F(BigNumTest, Pow2NFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, BigNumPow2N(1, nullptr));
+}
+
+TEST_F(BigNumTest, Pow2NZeroGivesOne) {
+ BigNumObj r;
+ BigNumObj one(this->str_1);
+ EXPECT_EQ(kEpidNoErr, BigNumPow2N(0, r));
+ EXPECT_TRUE(CompareBigNum(one, r));
+}
+
+TEST_F(BigNumTest, Pow2NOneGivesTwo) {
+ BigNumObj r;
+ BigNumObj two(this->str_2);
+ EXPECT_EQ(kEpidNoErr, BigNumPow2N(1, r));
+ EXPECT_TRUE(CompareBigNum(two, r));
+}
+
+TEST_F(BigNumTest, Pow2NGivesPow2n) {
+ unsigned int n = 2;
+ BigNumObj r;
+ BigNumObj two(this->str_2);
+ BigNumObj expect;
+ EXPECT_EQ(kEpidNoErr, BigNumMul(two, two, expect));
+ for (n = 2; n < 4; n++) {
+ EXPECT_EQ(kEpidNoErr, BigNumPow2N(n, r));
+ EXPECT_TRUE(CompareBigNum(expect, r));
+ EXPECT_EQ(kEpidNoErr, BigNumMul(expect, two, expect));
+ n++;
+ }
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/ecdsa_sign-test.cc b/epid/common/math/unittests/ecdsa_sign-test.cc
new file mode 100644
index 0000000..167b65a
--- /dev/null
+++ b/epid/common/math/unittests/ecdsa_sign-test.cc
@@ -0,0 +1,229 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcdsaSignBuffer unit tests.
+ */
+
+#include <cstdint>
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/ecdsa.h"
+}
+
+#include "epid/common-testhelper/prng-testhelper.h"
+
+bool operator==(EcdsaSignature const& lhs, EcdsaSignature const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+/// Fill message buffer
+/*!
+
+ Fill a message buffer
+
+ \param[in] buf
+ pointer to buffer to be filled
+ \param[in] buf_len
+ size of buffer in bytes
+
+ \returns ::EpidStatus
+*/
+static EpidStatus FillMessage(uint8_t* buf, size_t buf_len) {
+ if (!buf) return kEpidBadArgErr;
+ if (buf_len <= 0) return kEpidBadArgErr;
+ for (size_t n = 0; n < buf_len; n++) {
+ buf[n] = (uint8_t)n;
+ }
+ return kEpidNoErr;
+}
+class EcdsaSignBufferTest : public ::testing::Test {
+ public:
+ /// Signer's static private key (ECDSA-256 RFC 4754 Test Vector)
+ static const EcdsaPrivateKey kPrivkey0;
+ /// Signer's static public key (ECDSA-256 RFC 4754 Test Vector)
+ static const EcdsaPublicKey kPubkey0;
+ /// Signer's ephemeral private key (ECDSA-256 RFC 4754 Test Vector)
+ static const EcdsaPrivateKey kEphPrivkey0;
+ /// Message (ECDSA-256 RFC 4754 Test Vector)
+ static const std::vector<uint8_t> kMsg0;
+ /// Signature of msg0 with privkey0 and kEphPrivkey0
+ static const EcdsaSignature kSig_msg0_key0;
+ /// Signature of empty msg with privkey0 and kEphPrivkey0
+ static const EcdsaSignature kSig_emptymsg_key0;
+ /// Signature of 1M msg with privkey0 and kEphPrivkey0
+ static const EcdsaSignature kSig_1Mmsg_key0;
+};
+
+const EcdsaPrivateKey EcdsaSignBufferTest::kPrivkey0 = {
+ 0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD, 0xE3, 0x3D, 0x96,
+ 0xF9, 0x92, 0xFC, 0xA9, 0x9D, 0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7,
+ 0x09, 0x75, 0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F};
+const EcdsaPublicKey EcdsaSignBufferTest::kPubkey0 = {
+ 0x24, 0x42, 0xA5, 0xCC, 0x0E, 0xCD, 0x01, 0x5F, 0xA3, 0xCA, 0x31,
+ 0xDC, 0x8E, 0x2B, 0xBC, 0x70, 0xBF, 0x42, 0xD6, 0x0C, 0xBC, 0xA2,
+ 0x00, 0x85, 0xE0, 0x82, 0x2C, 0xB0, 0x42, 0x35, 0xE9, 0x70, 0x6F,
+ 0xC9, 0x8B, 0xD7, 0xE5, 0x02, 0x11, 0xA4, 0xA2, 0x71, 0x02, 0xFA,
+ 0x35, 0x49, 0xDF, 0x79, 0xEB, 0xCB, 0x4B, 0xF2, 0x46, 0xB8, 0x09,
+ 0x45, 0xCD, 0xDF, 0xE7, 0xD5, 0x09, 0xBB, 0xFD, 0x7D};
+const EcdsaPrivateKey EcdsaSignBufferTest::kEphPrivkey0 = {
+ 0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9, 0x63, 0xD1, 0xC0,
+ 0xA4, 0x01, 0x51, 0x0E, 0xE7, 0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0,
+ 0x4B, 0x15, 0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE};
+/*
+
+Ephemeral public key expected to be generated for kEphPrivkey0:
+gkx: ephemeral public key:
+CB28E099 9B9C7715 FD0A80D8 E47A7707 9716CBBF 917DD72E 97566EA1 C066957C
+gky: ephemeral public key:
+2B57C023 5FB74897 68D058FF 4911C20F DBE71E36 99D91339 AFBB903E E17255DC
+*/
+
+const std::vector<uint8_t> EcdsaSignBufferTest::kMsg0 = {'a', 'b', 'c'};
+
+const EcdsaSignature EcdsaSignBufferTest::kSig_msg0_key0 = {
+ 0xCB, 0x28, 0xE0, 0x99, 0x9B, 0x9C, 0x77, 0x15, 0xFD, 0x0A, 0x80,
+ 0xD8, 0xE4, 0x7A, 0x77, 0x07, 0x97, 0x16, 0xCB, 0xBF, 0x91, 0x7D,
+ 0xD7, 0x2E, 0x97, 0x56, 0x6E, 0xA1, 0xC0, 0x66, 0x95, 0x7C, 0x86,
+ 0xFA, 0x3B, 0xB4, 0xE2, 0x6C, 0xAD, 0x5B, 0xF9, 0x0B, 0x7F, 0x81,
+ 0x89, 0x92, 0x56, 0xCE, 0x75, 0x94, 0xBB, 0x1E, 0xA0, 0xC8, 0x92,
+ 0x12, 0x74, 0x8B, 0xFF, 0x3B, 0x3D, 0x5B, 0x03, 0x15,
+};
+const EcdsaSignature EcdsaSignBufferTest::kSig_emptymsg_key0 = {
+ 0xCB, 0x28, 0xE0, 0x99, 0x9B, 0x9C, 0x77, 0x15, 0xFD, 0x0A, 0x80,
+ 0xD8, 0xE4, 0x7A, 0x77, 0x07, 0x97, 0x16, 0xCB, 0xBF, 0x91, 0x7D,
+ 0xD7, 0x2E, 0x97, 0x56, 0x6E, 0xA1, 0xC0, 0x66, 0x95, 0x7C, 0x8c,
+ 0x09, 0x5c, 0xec, 0xd5, 0xcf, 0xec, 0x1e, 0xa5, 0xb6, 0xa6, 0x44,
+ 0x1e, 0x12, 0x3d, 0x30, 0xff, 0x97, 0xdd, 0x4b, 0x44, 0xc1, 0x70,
+ 0x7c, 0x95, 0x9d, 0x7f, 0x46, 0x86, 0x73, 0x55, 0xae,
+};
+const EcdsaSignature EcdsaSignBufferTest::kSig_1Mmsg_key0 = {
+ 0xCB, 0x28, 0xE0, 0x99, 0x9B, 0x9C, 0x77, 0x15, 0xFD, 0x0A, 0x80,
+ 0xD8, 0xE4, 0x7A, 0x77, 0x07, 0x97, 0x16, 0xCB, 0xBF, 0x91, 0x7D,
+ 0xD7, 0x2E, 0x97, 0x56, 0x6E, 0xA1, 0xC0, 0x66, 0x95, 0x7C, 0xf9,
+ 0xa5, 0x3a, 0xbf, 0x22, 0xe7, 0xf3, 0x97, 0x5a, 0x8c, 0xce, 0xb8,
+ 0xca, 0x7b, 0xae, 0x9d, 0xd8, 0x7f, 0x43, 0xa9, 0xef, 0x40, 0x78,
+ 0x56, 0x37, 0xcc, 0xb2, 0xda, 0x1e, 0x04, 0x31, 0x03,
+};
+
+static int __STDCALL constant_32byte_endianswap_prng(unsigned int* random_data,
+ int num_bits,
+ void* user_data) {
+ if (256 != num_bits) return -1;
+ for (int i = 0; i < 32; i++) {
+ ((uint8_t*)random_data)[i] = ((uint8_t*)user_data)[31 - i];
+ }
+ return 0;
+}
+
+static int __STDCALL contextless_kEphPrivkey0_prng(unsigned int* random_data,
+ int num_bits,
+ void* user_data) {
+ (void)user_data;
+ return constant_32byte_endianswap_prng(
+ random_data, num_bits,
+ (void*)(EcdsaSignBufferTest::kEphPrivkey0.data.data));
+}
+
+TEST_F(EcdsaSignBufferTest, FailsGivenNullPtr) {
+ uint8_t msg[1];
+ Prng prng;
+ BitSupplier rnd_func = Prng::Generate;
+ void* rnd_param = &prng;
+ EcdsaSignature signature;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EcdsaSignBuffer(nullptr, sizeof(msg), &this->kPrivkey0, rnd_func,
+ rnd_param, &signature));
+ EXPECT_EQ(kEpidBadArgErr, EcdsaSignBuffer(msg, sizeof(msg), nullptr, rnd_func,
+ rnd_param, &signature));
+ EXPECT_EQ(kEpidBadArgErr, EcdsaSignBuffer(msg, sizeof(msg), &this->kPrivkey0,
+ nullptr, rnd_param, &signature));
+ EXPECT_EQ(kEpidBadArgErr, EcdsaSignBuffer(msg, sizeof(msg), &this->kPrivkey0,
+ rnd_func, rnd_param, nullptr));
+}
+
+TEST_F(EcdsaSignBufferTest, SignsEmptyMessage) {
+ uint8_t msg[1];
+ EcdsaSignature signature;
+
+ EXPECT_EQ(
+ kEpidNoErr,
+ EcdsaSignBuffer(msg, 0, &this->kPrivkey0, constant_32byte_endianswap_prng,
+ (void*)&(this->kEphPrivkey0), &signature));
+ EXPECT_EQ(this->kSig_emptymsg_key0, signature);
+ EXPECT_EQ(kEpidNoErr,
+ EcdsaSignBuffer(nullptr, 0, &this->kPrivkey0,
+ constant_32byte_endianswap_prng,
+ (void*)&(this->kEphPrivkey0), &signature));
+ EXPECT_EQ(this->kSig_emptymsg_key0, signature);
+}
+
+TEST_F(EcdsaSignBufferTest, WorksGivenNoRndParam) {
+ EcdsaSignature signature;
+
+ EXPECT_EQ(
+ kEpidNoErr,
+ EcdsaSignBuffer(this->kMsg0.data(), this->kMsg0.size(), &this->kPrivkey0,
+ contextless_kEphPrivkey0_prng, nullptr, &signature));
+ EXPECT_EQ(this->kSig_msg0_key0, signature);
+}
+
+TEST_F(EcdsaSignBufferTest, SignsShortMessage) {
+ EcdsaSignature signature;
+
+ EXPECT_EQ(kEpidNoErr,
+ EcdsaSignBuffer(this->kMsg0.data(), this->kMsg0.size(),
+ &this->kPrivkey0, constant_32byte_endianswap_prng,
+ (void*)&(this->kEphPrivkey0), &signature));
+ EXPECT_EQ(this->kSig_msg0_key0, signature);
+}
+
+TEST_F(EcdsaSignBufferTest, SignsLongMessage) {
+ std::vector<uint8_t> msg_1mb(0x100000);
+ FillMessage(msg_1mb.data(), msg_1mb.size());
+
+ EcdsaSignature signature;
+
+ EXPECT_EQ(kEpidNoErr,
+ EcdsaSignBuffer(msg_1mb.data(), msg_1mb.size(), &this->kPrivkey0,
+ constant_32byte_endianswap_prng,
+ (void*)&(this->kEphPrivkey0), &signature));
+ EXPECT_EQ(this->kSig_1Mmsg_key0, signature);
+}
+
+TEST_F(EcdsaSignBufferTest, FailsGivenInvalidPrivateKey) {
+ uint8_t msg[1] = {0x00};
+ Prng prng;
+ BitSupplier rnd_func = Prng::Generate;
+ void* rnd_param = &prng;
+ EcdsaSignature signature;
+
+ EcdsaPrivateKey invalid_prikey;
+ memset(&invalid_prikey, 0xff, sizeof(invalid_prikey));
+
+ EXPECT_EQ(kEpidBadArgErr, EcdsaSignBuffer(msg, sizeof(msg), &invalid_prikey,
+ rnd_func, rnd_param, &signature));
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/ecdsa_verify-test.cc b/epid/common/math/unittests/ecdsa_verify-test.cc
new file mode 100644
index 0000000..e7cb2bf
--- /dev/null
+++ b/epid/common/math/unittests/ecdsa_verify-test.cc
@@ -0,0 +1,279 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcdsaVerifyBuffer unit tests.
+ */
+
+#include <cstdint>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/ecdsa.h"
+}
+
+namespace {
+
+/// Fill message buffer
+/*!
+
+ Fill a message buffer
+
+ \param[in] buf
+ pointer to buffer to be filled
+ \param[in] buf_len
+ size of buffer in bytes
+
+ \returns ::EpidStatus
+*/
+static EpidStatus fill_message(uint8_t* buf, size_t buf_len) {
+ if (!buf) return kEpidBadArgErr;
+ if (buf_len <= 0) return kEpidBadArgErr;
+ for (size_t n = 0; n < buf_len; n++) {
+ buf[n] = (uint8_t)n;
+ }
+ return kEpidNoErr;
+}
+class EcdsaVerifyBufferTest : public ::testing::Test {
+ public:
+ /// an Ecdsa key pair
+ /// Regular
+ static const EcdsaPrivateKey kPrivkey0;
+ static const EcdsaPublicKey kPubkey0;
+ /// an Ecdsa key pair
+ // Regular
+ static const EcdsaPrivateKey kPrivkey1;
+ static const EcdsaPublicKey kPubkey1;
+ /// a message
+ static const std::vector<uint8_t> kMsg0;
+ /// a message
+ static const std::vector<uint8_t> kMsg1;
+ /// signature of msg0 with privkey0
+ static const EcdsaSignature kSig_msg0_key0;
+ /// signature of msg0 with privkey1
+ static const EcdsaSignature kSig_msg0_key1;
+ /// signature of msg1 with privkey0
+ static const EcdsaSignature kSig_msg1_key0;
+ /// signature of msg1 with privkey1
+ static const EcdsaSignature kSig_msg1_key1;
+ /// signature of empty msg with privkey0
+ static const EcdsaSignature kSig_emptymsg_key0;
+ /// signature of empty msg with privkey1
+ static const EcdsaSignature kSig_emptymsg_key1;
+ /// signature of 1M msg with privkey0
+ static const EcdsaSignature kSig_1Mmsg_key0;
+ /// signature of 1M msg with privkey1
+ static const EcdsaSignature kSig_1Mmsg_key1;
+};
+
+const EcdsaPrivateKey EcdsaVerifyBufferTest::kPrivkey0 = {
+ 0xfc, 0x0e, 0x32, 0x3b, 0x5d, 0xf6, 0x95, 0x43, 0x99, 0x0f, 0x46,
+ 0x37, 0xb0, 0x19, 0xb3, 0xbb, 0xba, 0xd5, 0x91, 0x63, 0x2d, 0x4a,
+ 0x5a, 0x1e, 0xd8, 0x09, 0x4f, 0x44, 0xa9, 0x5c, 0xd8, 0x87,
+};
+const EcdsaPublicKey EcdsaVerifyBufferTest::kPubkey0 = {
+ 0x32, 0x05, 0x28, 0x50, 0x53, 0x0c, 0x62, 0xdf, 0x17, 0xc7, 0xcb,
+ 0x8c, 0xd3, 0x6f, 0x05, 0xe8, 0xbb, 0xbb, 0x6a, 0xf4, 0x43, 0x82,
+ 0x59, 0xad, 0xd2, 0x56, 0x6c, 0x63, 0xde, 0x06, 0x37, 0x69, 0x7b,
+ 0x42, 0x9a, 0xda, 0x3c, 0x91, 0xf3, 0xc0, 0xdd, 0xc1, 0xd4, 0x9e,
+ 0xc2, 0x24, 0x32, 0x09, 0x07, 0x8c, 0xb9, 0xfc, 0xd8, 0x7b, 0x69,
+ 0xf9, 0x17, 0x1e, 0x35, 0xb4, 0x20, 0x23, 0x45, 0x94,
+};
+
+const EcdsaPrivateKey EcdsaVerifyBufferTest::kPrivkey1 = {
+ 0xd6, 0x5a, 0x82, 0x5d, 0xd4, 0xad, 0x28, 0x6f, 0x09, 0x2c, 0x96,
+ 0x07, 0x0a, 0x96, 0xac, 0x13, 0xc9, 0xfd, 0xcf, 0xf0, 0xbe, 0x08,
+ 0xcb, 0xbb, 0x4b, 0xba, 0x7e, 0x9e, 0xac, 0x02, 0xe9, 0x7c,
+};
+const EcdsaPublicKey EcdsaVerifyBufferTest::kPubkey1 = {
+ 0x34, 0xb0, 0x88, 0xcc, 0xb7, 0xf3, 0x56, 0xe0, 0x5c, 0x7c, 0xfc,
+ 0x03, 0x5d, 0x62, 0x72, 0xe4, 0x70, 0x08, 0xcd, 0x6f, 0x4b, 0x29,
+ 0x0e, 0x2d, 0x86, 0x26, 0x93, 0x52, 0x55, 0xef, 0xb4, 0x45, 0x11,
+ 0x07, 0xe9, 0xbe, 0x1e, 0x5d, 0xdb, 0x92, 0x64, 0xb6, 0xbf, 0x67,
+ 0x83, 0x1f, 0xde, 0xaa, 0x72, 0x84, 0xe9, 0x27, 0x5c, 0xd5, 0xbc,
+ 0x82, 0x07, 0xc9, 0x81, 0xd1, 0x70, 0x07, 0xaa, 0xd5,
+};
+
+const std::vector<uint8_t> EcdsaVerifyBufferTest::kMsg0 = {'m', 's', 'g', '0'};
+const std::vector<uint8_t> EcdsaVerifyBufferTest::kMsg1 = {'m', 's', 'g', '1'};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_msg0_key0 = {
+ 0x81, 0xDD, 0x1A, 0x18, 0x35, 0x1E, 0x22, 0x99, 0x85, 0xC5, 0xAA,
+ 0xE4, 0x78, 0x02, 0xC5, 0x65, 0xF1, 0x39, 0x80, 0x45, 0xF5, 0xFC,
+ 0xBD, 0xC6, 0x67, 0xBD, 0xC1, 0x93, 0x42, 0xF6, 0x17, 0x0E, 0x45,
+ 0x19, 0x39, 0xD3, 0x27, 0x1F, 0xA9, 0x2A, 0x14, 0xDD, 0xF1, 0x5A,
+ 0x81, 0xA8, 0xEC, 0x3B, 0xB4, 0x0B, 0xF8, 0xC9, 0x9A, 0x06, 0xEB,
+ 0x04, 0x77, 0x19, 0xCB, 0x57, 0x9C, 0xB9, 0xE9, 0x2F,
+};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_msg0_key1 = {
+ 0xA9, 0xFC, 0x44, 0x2D, 0x09, 0x9E, 0x15, 0x6C, 0x25, 0xD9, 0x74,
+ 0x9D, 0xD9, 0xAD, 0xC2, 0x7A, 0xFB, 0xC0, 0xD4, 0xFE, 0xC2, 0x48,
+ 0x41, 0x80, 0x47, 0x4A, 0x74, 0x8A, 0x62, 0x71, 0x68, 0xFF, 0x51,
+ 0xDF, 0x47, 0x76, 0xAB, 0xD7, 0xE2, 0xA0, 0x97, 0x6B, 0x04, 0x51,
+ 0x2B, 0x8F, 0x4D, 0x7E, 0xDB, 0x7B, 0x60, 0x08, 0xC6, 0x51, 0x81,
+ 0x5E, 0x92, 0x9E, 0x11, 0xDB, 0x9C, 0x16, 0x64, 0x79,
+};
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_msg1_key0 = {
+ 0xA4, 0xD7, 0xF9, 0x80, 0xBA, 0x93, 0x25, 0xA4, 0x43, 0xD4, 0xCE,
+ 0x6F, 0x7C, 0xD9, 0xA9, 0xD2, 0x24, 0x1B, 0xB8, 0x32, 0xDE, 0xE0,
+ 0x26, 0x01, 0xA6, 0xC8, 0x57, 0x21, 0xD7, 0x1E, 0xBC, 0x88, 0xA2,
+ 0x27, 0x8B, 0x51, 0x93, 0x90, 0xC0, 0x0A, 0x3B, 0xA4, 0x7A, 0x9B,
+ 0x8C, 0x5E, 0xC8, 0x8B, 0x39, 0x5F, 0x3D, 0x82, 0xCE, 0x57, 0x9F,
+ 0xF7, 0x9A, 0x32, 0x82, 0xEF, 0xF8, 0xC5, 0x8B, 0x22,
+};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_msg1_key1 = {
+ 0xC1, 0x0A, 0x01, 0xB3, 0x81, 0x47, 0x02, 0xA4, 0xD2, 0xB1, 0xD6,
+ 0xF9, 0x25, 0x1F, 0xDF, 0x16, 0x7F, 0x28, 0x7F, 0x04, 0x38, 0xAE,
+ 0x6D, 0x6E, 0xE7, 0xFC, 0xCB, 0x9E, 0xB6, 0xA4, 0xF6, 0x41, 0x2B,
+ 0xEA, 0x6B, 0x53, 0x32, 0x7B, 0xB0, 0xB6, 0x8F, 0x21, 0x07, 0x0A,
+ 0x4C, 0xB7, 0xA9, 0xDE, 0x9F, 0x27, 0x3A, 0xEE, 0x4F, 0xE2, 0xF4,
+ 0xE3, 0x1E, 0xC3, 0x3F, 0xAA, 0x41, 0xD4, 0xFA, 0xA2,
+};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_emptymsg_key0 = {
+ 0xB7, 0xDC, 0x55, 0x35, 0x12, 0xB9, 0xAE, 0x59, 0xAE, 0xE1, 0xB5,
+ 0x50, 0x20, 0x65, 0x18, 0x84, 0x3B, 0x1E, 0x54, 0xF4, 0x11, 0x4B,
+ 0x71, 0xBD, 0x12, 0x5E, 0x05, 0x41, 0xAB, 0x6A, 0xF9, 0x20, 0x26,
+ 0xC9, 0x2B, 0x21, 0x56, 0x62, 0x3F, 0xC3, 0x62, 0xA0, 0xD2, 0x9D,
+ 0x27, 0x97, 0xF8, 0xE2, 0x59, 0xE7, 0x0E, 0x7E, 0xEE, 0xA7, 0xB5,
+ 0x11, 0x66, 0xD0, 0xF3, 0x6E, 0x41, 0x76, 0x3C, 0xFE,
+};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_emptymsg_key1 = {
+ 0xCB, 0xED, 0xEF, 0xEE, 0x11, 0x68, 0x21, 0x7D, 0x57, 0x4A, 0x37,
+ 0xB1, 0x96, 0xF0, 0xF8, 0x42, 0x46, 0x00, 0x64, 0xEF, 0x19, 0xA7,
+ 0xFF, 0x38, 0x8F, 0x3A, 0x25, 0xD5, 0xC4, 0xF3, 0xD0, 0xC4, 0xB0,
+ 0xC4, 0xC5, 0xB0, 0x58, 0xAD, 0x74, 0xF2, 0x19, 0xEE, 0x0C, 0x98,
+ 0x6D, 0x5F, 0x4F, 0xB7, 0x9A, 0xE8, 0x25, 0x1B, 0xAD, 0x9E, 0x26,
+ 0x22, 0xF2, 0xED, 0xB1, 0x8D, 0x3B, 0x02, 0x7F, 0xB1,
+};
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_1Mmsg_key0 = {
+ 0x4A, 0x45, 0xE3, 0xA5, 0xFC, 0x73, 0x86, 0xAF, 0xD8, 0x21, 0x25,
+ 0x35, 0x13, 0xEB, 0x1B, 0xA7, 0x39, 0x08, 0x21, 0x2A, 0x2A, 0x09,
+ 0x79, 0x3C, 0xEA, 0x17, 0x67, 0x53, 0x6C, 0xE4, 0xA0, 0x97, 0x36,
+ 0x98, 0x79, 0x69, 0x1C, 0xF1, 0x21, 0x42, 0x56, 0x48, 0x38, 0x35,
+ 0x3C, 0xC1, 0x30, 0x7C, 0x49, 0x4F, 0xC9, 0xFA, 0xE1, 0x69, 0xF9,
+ 0x42, 0x3D, 0x7D, 0x4B, 0x6D, 0xB1, 0xEE, 0x9D, 0x4B,
+};
+
+const EcdsaSignature EcdsaVerifyBufferTest::kSig_1Mmsg_key1 = {
+ 0x87, 0xE0, 0x27, 0x51, 0xC1, 0x16, 0x79, 0x8F, 0xCF, 0x82, 0x60,
+ 0x48, 0x72, 0x04, 0xE1, 0xC4, 0xDA, 0xEE, 0x31, 0x4D, 0x12, 0xF9,
+ 0xCA, 0x19, 0x1B, 0xDC, 0xA4, 0xCA, 0x8C, 0xCC, 0xBD, 0x2A, 0xD4,
+ 0x73, 0x2B, 0x6B, 0xE4, 0x9B, 0xA1, 0x56, 0xF2, 0x28, 0x4A, 0xBD,
+ 0x41, 0x69, 0x98, 0xAB, 0x62, 0x3D, 0x8D, 0xC9, 0x77, 0xE1, 0x98,
+ 0xF1, 0x53, 0xF5, 0xD0, 0x97, 0x80, 0x89, 0xCB, 0x97,
+};
+TEST_F(EcdsaVerifyBufferTest, FailsGivenNullParameters) {
+ // tests using a trivial message
+ EXPECT_EQ(kEpidBadArgErr,
+ EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(), &kPubkey0, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ nullptr, &kSig_msg0_key0));
+ // tests using a null message
+ EXPECT_EQ(kEpidBadArgErr, EcdsaVerifyBuffer(nullptr, 0, &kPubkey0, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcdsaVerifyBuffer(nullptr, 0, nullptr, &kSig_msg0_key0));
+}
+
+TEST_F(EcdsaVerifyBufferTest, VerifiesZeroLengthMsg) {
+ // tests using a non-null message buffer
+ EXPECT_EQ(kEpidSigValid,
+ EcdsaVerifyBuffer(kMsg0.data(), 0, &kPubkey0, &kSig_emptymsg_key0));
+ EXPECT_EQ(kEpidSigValid,
+ EcdsaVerifyBuffer(kMsg0.data(), 0, &kPubkey1, &kSig_emptymsg_key1));
+ // tests using a null message buffer
+ EXPECT_EQ(kEpidSigValid,
+ EcdsaVerifyBuffer(nullptr, 0, &kPubkey0, &kSig_emptymsg_key0));
+ EXPECT_EQ(kEpidSigValid,
+ EcdsaVerifyBuffer(nullptr, 0, &kPubkey1, &kSig_emptymsg_key1));
+}
+
+TEST_F(EcdsaVerifyBufferTest, VerifiesShortMessage) {
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey0, &kSig_msg0_key0));
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey1, &kSig_msg0_key1));
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey0, &kSig_msg1_key0));
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey1, &kSig_msg1_key1));
+}
+
+TEST_F(EcdsaVerifyBufferTest, VerifiesLongMessage) {
+ std::vector<uint8_t> msg_1mb(0x100000);
+ fill_message(msg_1mb.data(), msg_1mb.size());
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(msg_1mb.data(), msg_1mb.size(),
+ &kPubkey0, &kSig_1Mmsg_key0));
+ EXPECT_EQ(kEpidSigValid, EcdsaVerifyBuffer(msg_1mb.data(), msg_1mb.size(),
+ &kPubkey1, &kSig_1Mmsg_key1));
+}
+
+TEST_F(EcdsaVerifyBufferTest, FailsGivenWrongKey) {
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey1, &kSig_msg0_key0));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey0, &kSig_msg0_key1));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey1, &kSig_msg1_key0));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey0, &kSig_msg1_key1));
+}
+
+TEST_F(EcdsaVerifyBufferTest, FailsGivenWrongMsg) {
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey0, &kSig_msg0_key0));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(),
+ &kPubkey1, &kSig_msg0_key1));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey0, &kSig_msg1_key0));
+ EXPECT_EQ(kEpidSigInvalid, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey1, &kSig_msg1_key1));
+}
+
+TEST_F(EcdsaVerifyBufferTest, FailsGivenInvalidKey) {
+ // define a public key with the high half set to all FF. This will
+ // not be on the curve specified for this API
+ EcdsaPublicKey invalid_pubkey = kPubkey0;
+ for (size_t i = 0; i < sizeof(invalid_pubkey.x); i++) {
+ invalid_pubkey.x.data[i] = 0xff;
+ }
+ EXPECT_EQ(kEpidBadArgErr,
+ EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(), &invalid_pubkey,
+ &kSig_msg0_key0));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcdsaVerifyBuffer(kMsg1.data(), kMsg1.size(), &invalid_pubkey,
+ &kSig_msg1_key0));
+}
+
+TEST_F(EcdsaVerifyBufferTest, FailsGivenInvalidSignature) {
+ // define a signature with the high half set to all FF. This will
+ // not be on the curve specified for this API
+ EcdsaSignature invalid_sig = kSig_msg0_key0;
+ for (size_t i = 0; i < sizeof(invalid_sig.x); i++) {
+ invalid_sig.x.data[i] = 0xff;
+ }
+ EXPECT_EQ(kEpidBadArgErr, EcdsaVerifyBuffer(kMsg0.data(), kMsg0.size(),
+ &kPubkey0, &invalid_sig));
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/ecgroup-test.cc b/epid/common/math/unittests/ecgroup-test.cc
new file mode 100644
index 0000000..426b32a
--- /dev/null
+++ b/epid/common/math/unittests/ecgroup-test.cc
@@ -0,0 +1,2171 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EcGroup unit tests.
+ */
+
+#include <cstring>
+#include <memory>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+}
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares G2ElemStr values
+bool operator==(G2ElemStr const& lhs, G2ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+class EFq2Params {
+ public:
+ FiniteFieldObj fq2;
+ FfElementObj a;
+ FfElementObj b;
+ FfElementObj x;
+ FfElementObj y;
+ BigNumObj order;
+ BigNumObj cofactor;
+
+ explicit EFq2Params(FiniteFieldObj* fq) {
+ // Intel(R) EPID 2.0 parameters for EC(Fq2)
+ static const FqElemStr param_beta = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}}};
+ static const G2ElemStr param_g2 = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
+ static const Fq2ElemStr param_xi0xi1 = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}}};
+ static const FqElemStr param_b = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
+
+ // Setup Fq2 with parameters (q, beta)
+ // Fq^2 = Fq[u] / (u^2 - beta)
+ FfElementObj neg_beta(fq);
+ THROW_ON_EPIDERR(FfNeg(*fq, FfElementObj(fq, param_beta), neg_beta));
+ fq2 = FiniteFieldObj(*fq, neg_beta, 2);
+
+ // set x to (g2.x[0], g2.x[1]) and y to (g2.y[0], g2.y[1])
+ x = FfElementObj(&fq2, &param_g2.x, sizeof(param_g2.x));
+ y = FfElementObj(&fq2, &param_g2.y, sizeof(param_g2.y));
+
+ // set a to identity, NewFfElement does it by default
+ a = FfElementObj(&fq2);
+
+ // set b to inv(xi)*param_b, where xi is (xi0, xi1) element in Fq2
+ FfElementObj neg_xi(&fq2);
+ THROW_ON_EPIDERR(FfInv(fq2, FfElementObj(&fq2, param_xi0xi1), neg_xi));
+ b = FfElementObj(&fq2);
+ THROW_ON_EPIDERR(FfMul(fq2, neg_xi.get(), FfElementObj(fq, param_b), b));
+
+ // set h = 2q - p, aka cofactor
+ std::vector<uint8_t> cofactor_str(
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xcd, 0x46, 0xe5, 0xf2, 0x5e,
+ 0xee, 0x71, 0xa4, 0xa0, 0x0c, 0xdc, 0x65, 0xfb, 0x12, 0x96, 0x82,
+ 0xea, 0xb0, 0x25, 0x08, 0x4a, 0x8c, 0x9b, 0x10, 0x19});
+ cofactor = BigNumObj(cofactor_str);
+
+ // set n = p * h, AKA order
+ std::vector<uint8_t> order_str(
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe1, 0x9a, 0x8d, 0xcb, 0xe4,
+ 0xc7, 0x38, 0xfa, 0x9b, 0x98, 0x4d, 0x1c, 0x12, 0x9f, 0x64, 0x97,
+ 0xe8, 0x54, 0xa3, 0x0a, 0x81, 0xac, 0x42, 0xf9, 0x39, 0x16, 0xa7,
+ 0x70, 0x21, 0xdc, 0xfb, 0xb6, 0xe7, 0x7e, 0x1f, 0x5b, 0x55, 0xcc,
+ 0x4e, 0x84, 0xcd, 0x19, 0x4f, 0x49, 0x20, 0x94, 0xb5, 0xd8, 0x12,
+ 0xa0, 0x2e, 0x7f, 0x40, 0x13, 0xb2, 0xfa, 0xa1, 0x45});
+ order = BigNumObj(order_str);
+ }
+
+ virtual ~EFq2Params() {}
+
+ private:
+ // This class is not meant to be copied or assigned
+ EFq2Params(const EFq2Params&);
+ EFq2Params& operator=(const EFq2Params&);
+};
+
+class EcGroupTest : public ::testing::Test {
+ public:
+ static const G1ElemStr g1_str;
+ static const G2ElemStr g2_str;
+
+ static const FqElemStr a1;
+ static const FqElemStr b1;
+ static const BigNumStr h1;
+ static const BigNumStr p;
+ static const BigNumStr q;
+
+ static const G1ElemStr efq_a_str;
+ static const G1ElemStr efq_b_str;
+ static const BigNumStr x_str;
+ static const BigNumStr y_str;
+ static const G1ElemStr efq_mul_ab_str;
+ static const G1ElemStr efq_exp_ax_str;
+ static const G1ElemStr efq_multiexp_abxy_str;
+ static const G1ElemStr efq_inv_a_str;
+ static const G1ElemStr efq_identity_str;
+ static const G1ElemStr efq_r_sha256_str;
+ static const G1ElemStr efq_r_sha384_str;
+ static const G1ElemStr efq_r_sha512_str;
+ static const G1ElemStr efq_r_sha512256_str;
+ static const uint8_t sha_msg[];
+
+ static const G2ElemStr efq2_a_str;
+ static const G2ElemStr efq2_b_str;
+ static const G2ElemStr efq2_mul_ab_str;
+ static const G2ElemStr efq2_exp_ax_str;
+ static const G2ElemStr efq2_multiexp_abxy_str;
+ static const G2ElemStr efq2_inv_a_str;
+ static const G2ElemStr efq2_identity_str;
+
+ // Intel(R) EPID 1.1 hash of message "aad"
+ static const Epid11G3ElemStr kAadHash;
+ // Intel(R) EPID 1.1 hash of message "bsn0"
+ static const Epid11G3ElemStr kBsn0Hash;
+ // Intel(R) EPID 1.1 hash of message "test"
+ static const Epid11G3ElemStr kTestHash;
+ // Intel(R) EPID 1.1 hash of message "aac"
+ static const Epid11G3ElemStr kAacHash;
+
+ virtual void SetUp() {
+ Epid11Params epid11_params_str = {
+#include "epid/common/1.1/src/epid11params_tate.inc"
+ };
+
+ fq = FiniteFieldObj(q);
+ fq_a = FfElementObj(&fq, a1);
+ fq_b = FfElementObj(&fq, b1);
+ g1_x = FfElementObj(&fq, g1_str.x);
+ g1_y = FfElementObj(&fq, g1_str.y);
+
+ bn_p = BigNumObj(p);
+ bn_h = BigNumObj(h1);
+
+ efq = EcGroupObj(&fq, fq_a, fq_b, g1_x, g1_y, bn_p, bn_h);
+
+ efq_a = EcPointObj(&efq, efq_a_str);
+ efq_b = EcPointObj(&efq, efq_b_str);
+ efq_r = EcPointObj(&efq);
+ efq_identity = EcPointObj(&efq, efq_identity_str);
+
+ efq2_par.reset(new EFq2Params(&fq));
+
+ efq2 = EcGroupObj(&efq2_par->fq2, efq2_par->a, efq2_par->b, efq2_par->x,
+ efq2_par->y, efq2_par->order, efq2_par->cofactor);
+
+ efq2_a = EcPointObj(&efq2, efq2_a_str);
+ efq2_b = EcPointObj(&efq2, efq2_b_str);
+ efq2_r = EcPointObj(&efq2);
+ efq2_identity = EcPointObj(&efq2, efq_identity_str);
+
+ epid11_Fq_tick = FiniteFieldObj(epid11_params_str.q_tick);
+ epid11_a_tick = FfElementObj(&epid11_Fq_tick, epid11_params_str.a_tick);
+ epid11_b_tick = FfElementObj(&epid11_Fq_tick, epid11_params_str.b_tick);
+ epid11_g3_x = FfElementObj(&epid11_Fq_tick, epid11_params_str.g3.x);
+ epid11_g3_y = FfElementObj(&epid11_Fq_tick, epid11_params_str.g3.y);
+ epid11_p_tick = BigNumObj(epid11_params_str.p_tick);
+ BigNumStr h_tick_str = {0};
+ ((OctStr32*)
+ h_tick_str.data.data)[sizeof(BigNumStr) / sizeof(OctStr32) - 1] =
+ epid11_params_str.h_tick;
+ epid11_h_tick = BigNumObj(h_tick_str);
+
+ epid11_G3 =
+ EcGroupObj(&epid11_Fq_tick, epid11_a_tick, epid11_b_tick, epid11_g3_x,
+ epid11_g3_y, epid11_p_tick, epid11_h_tick);
+ epid11_G3_r = EcPointObj(&epid11_G3);
+ }
+
+ FiniteFieldObj fq;
+ FfElementObj fq_a;
+ FfElementObj fq_b;
+ FfElementObj g1_x;
+ FfElementObj g1_y;
+
+ BigNumObj bn_p;
+ BigNumObj bn_h;
+
+ EcGroupObj efq;
+ EcPointObj efq_a;
+ EcPointObj efq_b;
+ EcPointObj efq_r;
+ EcPointObj efq_identity;
+
+ std::unique_ptr<EFq2Params> efq2_par;
+ EcGroupObj efq2;
+ EcPointObj efq2_a;
+ EcPointObj efq2_b;
+ EcPointObj efq2_r;
+ EcPointObj efq2_identity;
+
+ FiniteFieldObj epid11_Fq_tick;
+ FfElementObj epid11_a_tick;
+ FfElementObj epid11_b_tick;
+ FfElementObj epid11_g3_x;
+ FfElementObj epid11_g3_y;
+ BigNumObj epid11_p_tick;
+ BigNumObj epid11_h_tick;
+
+ EcGroupObj epid11_G3;
+ EcPointObj epid11_G3_r;
+};
+
+const G1ElemStr EcGroupTest::g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+const G2ElemStr EcGroupTest::g2_str = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
+
+const FqElemStr EcGroupTest::a1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}};
+const FqElemStr EcGroupTest::b1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}};
+const BigNumStr EcGroupTest::h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+const BigNumStr EcGroupTest::p = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+const BigNumStr EcGroupTest::q = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}}};
+
+const G1ElemStr EcGroupTest::efq_a_str = {
+ {{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0x78, 0x65, 0x28, 0xCB, 0xAF, 0x07, 0x52, 0x50, 0x55, 0x7A, 0x5F,
+ 0x30, 0x0A, 0xC0, 0xB4, 0x6B, 0xEA, 0x6F, 0xE2, 0xF6, 0x6D, 0x96,
+ 0xF7, 0xCD, 0xC8, 0xD3, 0x12, 0x7F, 0x1F, 0x3A, 0x8B, 0x42}}}};
+
+const G1ElemStr EcGroupTest::efq_b_str = {
+ {{{0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2,
+ 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E,
+ 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2}}},
+ {{{0x63, 0xB0, 0xAD, 0xB8, 0x2C, 0xE8, 0x14, 0xFD, 0xA2, 0x39, 0x0E,
+ 0x66, 0xB7, 0xD0, 0x6A, 0xAB, 0xEE, 0xFA, 0x2E, 0x24, 0x9B, 0xB5,
+ 0x14, 0x35, 0xFE, 0xB6, 0xB0, 0xFF, 0xFD, 0x5F, 0x73, 0x19}}}};
+
+const BigNumStr EcGroupTest::x_str = {
+ {{0xFF, 0xFB, 0x3E, 0x5D, 0xFF, 0x9A, 0xFF, 0x02, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xF2, 0xE1, 0x85, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x81, 0xFF, 0xFD, 0xFF, 0xEB, 0xFF, 0x29, 0xA7, 0xFF}}};
+
+const BigNumStr EcGroupTest::y_str = {
+ {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3, 0x6B, 0x08, 0xFF,
+ 0xFF, 0x0B, 0xF3, 0xAF, 0x27, 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF,
+ 0xEB, 0xFF, 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}}};
+
+const G1ElemStr EcGroupTest::efq_mul_ab_str = {
+ {{{0x30, 0xF8, 0x33, 0xB7, 0x1C, 0x85, 0x94, 0x6D, 0x6F, 0x3C, 0x97,
+ 0x77, 0x81, 0xA5, 0xC2, 0x98, 0x93, 0x5C, 0x8C, 0xC1, 0xFF, 0x35,
+ 0x9E, 0x68, 0xF6, 0x4D, 0x18, 0xDD, 0x65, 0xA9, 0xC0, 0x60}}},
+ {{{0x89, 0xE5, 0x08, 0x2D, 0xD1, 0xD8, 0xC7, 0xBF, 0xDE, 0x16, 0x24,
+ 0xA7, 0x2F, 0xF1, 0x48, 0x00, 0x26, 0xAF, 0x89, 0xEA, 0xC9, 0x94,
+ 0x78, 0xFF, 0x2A, 0xB0, 0x20, 0xED, 0x33, 0x0C, 0x4E, 0x88}}}};
+
+const G1ElemStr EcGroupTest::efq_exp_ax_str = {
+ {{{0x44, 0x45, 0xFA, 0x16, 0x23, 0x66, 0x26, 0x9D, 0x44, 0xB9, 0x43,
+ 0xAB, 0x87, 0xE3, 0x56, 0xCA, 0x9C, 0x89, 0x44, 0x8E, 0xE8, 0x19,
+ 0x29, 0x4D, 0x4D, 0x59, 0x7D, 0xBE, 0x46, 0x3F, 0x55, 0x0D}}},
+ {{{0x98, 0x09, 0xCF, 0x43, 0x46, 0x75, 0xB8, 0x71, 0xFF, 0x37, 0xBA,
+ 0xA0, 0x63, 0xE2, 0xAC, 0x09, 0x38, 0x10, 0x70, 0xAC, 0x15, 0x52,
+ 0x28, 0xF4, 0x77, 0x68, 0x32, 0x7B, 0x6E, 0xFB, 0xC1, 0x43}}}};
+
+const G1ElemStr EcGroupTest::efq_multiexp_abxy_str = {
+ {{{0x63, 0x4A, 0xD4, 0xC1, 0x6B, 0x90, 0x67, 0xA2, 0x0B, 0xE2, 0xB3,
+ 0xE9, 0x95, 0x3F, 0x82, 0x7E, 0x21, 0xBF, 0x9F, 0xCD, 0xA0, 0x16,
+ 0x56, 0x6B, 0x31, 0x66, 0x68, 0xBB, 0x25, 0xF8, 0xBD, 0xF3}}},
+ {{{0xBD, 0x5F, 0xF8, 0x48, 0xD4, 0xBF, 0x35, 0x2D, 0xDC, 0xD1, 0x78,
+ 0x74, 0xFF, 0xB1, 0x47, 0xD5, 0x6B, 0x21, 0xE5, 0x15, 0x01, 0xA8,
+ 0xDC, 0x8B, 0x3C, 0x9D, 0x96, 0xC7, 0xC6, 0xB0, 0x05, 0x20}}}};
+
+const G1ElemStr EcGroupTest::efq_inv_a_str = {
+ {{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0x87, 0x9A, 0xD7, 0x34, 0x50, 0xF5, 0x9E, 0x7C, 0xF1, 0x6B, 0x93,
+ 0x2E, 0xE3, 0xB0, 0xF0, 0x33, 0x22, 0x6C, 0x83, 0x04, 0xA5, 0x01,
+ 0x12, 0xB5, 0x0A, 0x56, 0x1B, 0x5C, 0x8F, 0x98, 0xA4, 0xD1}}}};
+
+const G1ElemStr EcGroupTest::efq_identity_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}};
+
+const uint8_t EcGroupTest::sha_msg[] = {'a', 'b', 'c'};
+
+const G1ElemStr EcGroupTest::efq_r_sha256_str = {
+ {{{0x2E, 0xBB, 0x50, 0x4D, 0x88, 0xFF, 0x25, 0x62, 0xF3, 0x71, 0x65,
+ 0x81, 0xAD, 0xBE, 0x83, 0x6E, 0x54, 0xF5, 0xA6, 0x2A, 0x70, 0xE6,
+ 0x18, 0x6B, 0xD5, 0x4A, 0x10, 0x3C, 0x80, 0x08, 0x95, 0x3D}}},
+ {{{0x8A, 0x43, 0xA1, 0x04, 0xB1, 0x3F, 0x3C, 0xB4, 0xBD, 0x67, 0x38,
+ 0xB1, 0x07, 0xF0, 0x7A, 0x32, 0x7E, 0xCD, 0xF0, 0x2E, 0x62, 0x3E,
+ 0x2C, 0x1F, 0x48, 0xAA, 0x0D, 0x6C, 0xDC, 0x48, 0xF9, 0xF7}}}};
+
+const G1ElemStr EcGroupTest::efq_r_sha384_str = {
+ {{{0xE1, 0xC8, 0x28, 0xB1, 0x9A, 0xDF, 0x5D, 0x4B, 0xC4, 0x25, 0x90,
+ 0xFB, 0x38, 0x20, 0xD4, 0x8B, 0x30, 0x8F, 0x95, 0x76, 0xC3, 0x7F,
+ 0x9D, 0xAD, 0x94, 0xC4, 0x31, 0x80, 0xD7, 0xDF, 0xD5, 0xFE}}},
+ {{{0x0E, 0x86, 0x11, 0x90, 0xAF, 0xEF, 0xEB, 0x79, 0x4B, 0x3E, 0x80,
+ 0x92, 0x94, 0x3B, 0x2F, 0x5E, 0x72, 0x21, 0xEF, 0xF8, 0xBC, 0xE3,
+ 0x48, 0xA9, 0xD0, 0x31, 0x19, 0xAC, 0xD1, 0xD7, 0x49, 0x87}}}};
+
+const G1ElemStr EcGroupTest::efq_r_sha512_str = {
+ {{{0x8C, 0x62, 0xA0, 0x2D, 0x55, 0x55, 0x55, 0x86, 0xBC, 0x82, 0xA6,
+ 0xA2, 0x21, 0x97, 0x9B, 0x9B, 0xB4, 0x03, 0x3D, 0x83, 0xF3, 0xBA,
+ 0xDA, 0x9C, 0x42, 0xF7, 0xB3, 0x94, 0x99, 0x2A, 0x96, 0xE4}}},
+ {{{0x4C, 0x0E, 0xA7, 0x62, 0x17, 0xB9, 0xFB, 0xE5, 0x21, 0x7D, 0x54,
+ 0x24, 0xE0, 0x2B, 0x87, 0xF7, 0x69, 0x54, 0x0C, 0xC6, 0xAD, 0xF2,
+ 0xF2, 0x7B, 0xE6, 0x91, 0xD8, 0xF3, 0x40, 0x6C, 0x8F, 0x03}}}};
+
+const G1ElemStr EcGroupTest::efq_r_sha512256_str = {
+ {{{0x63, 0x28, 0x40, 0x14, 0x73, 0xd5, 0x91, 0xc4, 0xa2, 0xa4, 0xb6,
+ 0xd8, 0xa8, 0x75, 0x21, 0xd1, 0x26, 0x4e, 0x42, 0x13, 0x1f, 0xfa,
+ 0xed, 0x90, 0x8d, 0x56, 0x34, 0x57, 0x8a, 0x3a, 0x47, 0xa0}}},
+ {{{0x30, 0xbe, 0x3f, 0x12, 0x00, 0x74, 0x48, 0xaa, 0x91, 0x90, 0x84,
+ 0x12, 0x4d, 0x58, 0x54, 0xe7, 0x04, 0x65, 0x37, 0x97, 0x88, 0xcf,
+ 0x67, 0xa0, 0x8c, 0x56, 0x93, 0xa7, 0x7f, 0xe8, 0x74, 0xfc}}}};
+
+const G2ElemStr EcGroupTest::efq2_a_str = {
+ {
+ {0x2F, 0x8C, 0xC7, 0xD7, 0xD4, 0x1E, 0x4A, 0xCB, 0x82, 0x92, 0xC7,
+ 0x9C, 0x0F, 0xA2, 0xF2, 0x1B, 0xDF, 0xEA, 0x96, 0x64, 0x8B, 0xA2,
+ 0x32, 0x7C, 0xDF, 0xD8, 0x89, 0x10, 0xFD, 0xBB, 0x38, 0xCD},
+ {0xB1, 0x23, 0x46, 0x13, 0x4D, 0x9B, 0x8E, 0x8A, 0x95, 0x64, 0xDD,
+ 0x37, 0x29, 0x44, 0x1F, 0x76, 0xB5, 0x3A, 0x47, 0xD3, 0xE0, 0x18,
+ 0x1E, 0x60, 0xE9, 0x94, 0x13, 0xA4, 0x47, 0xCD, 0xBE, 0x03},
+ },
+ {
+ {0xD3, 0x67, 0xA5, 0xCC, 0xEF, 0x7B, 0xD1, 0x8D, 0x4A, 0x7F, 0xF1,
+ 0x8F, 0x66, 0xCB, 0x5E, 0x86, 0xAC, 0xCB, 0x36, 0x5F, 0x29, 0x90,
+ 0x28, 0x55, 0xF0, 0xDC, 0x6E, 0x8B, 0x87, 0xB5, 0xD8, 0x32},
+ {0x6C, 0x0A, 0xC5, 0x58, 0xB1, 0x4E, 0xCA, 0x85, 0x44, 0x3E, 0xDE,
+ 0x71, 0x9B, 0xC7, 0x90, 0x19, 0x06, 0xD2, 0xA0, 0x4E, 0xC7, 0x33,
+ 0xF4, 0x5C, 0xE8, 0x16, 0xE2, 0x67, 0xDB, 0xBF, 0x64, 0x84},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_b_str = {
+ {
+ {0x16, 0xF1, 0x61, 0x76, 0x06, 0x3E, 0xE9, 0xC0, 0xB9, 0xB1, 0x3A,
+ 0x75, 0xFC, 0xDB, 0x90, 0xCD, 0x01, 0xF4, 0x9F, 0xCC, 0xAA, 0x24,
+ 0x69, 0x83, 0xBE, 0x20, 0x44, 0x87, 0x58, 0x90, 0x0F, 0x4F},
+ {0xC7, 0x50, 0x37, 0xC1, 0xB9, 0x2D, 0xE1, 0xE3, 0x79, 0x20, 0x7B,
+ 0x62, 0x90, 0xF8, 0xC7, 0xF0, 0xD7, 0x5A, 0xE7, 0xAD, 0x65, 0xE1,
+ 0xC7, 0x50, 0x59, 0xA1, 0xFC, 0x49, 0xBC, 0x2A, 0xE5, 0xD7},
+ },
+ {
+ {0x12, 0x73, 0x3B, 0xA4, 0xDD, 0x0F, 0xBB, 0x35, 0x38, 0x4A, 0xE0,
+ 0x3D, 0x79, 0x63, 0x66, 0x73, 0x9C, 0x07, 0xE1, 0xEC, 0x71, 0x16,
+ 0x50, 0x75, 0xA1, 0xBA, 0xE5, 0x37, 0x45, 0x1A, 0x0C, 0x59},
+ {0xC9, 0x49, 0xB9, 0xDB, 0x7E, 0x76, 0xC5, 0xC5, 0x0A, 0x87, 0xB7,
+ 0x56, 0x88, 0x09, 0x21, 0xC6, 0xF6, 0x6C, 0xCC, 0x5E, 0x80, 0xFD,
+ 0x05, 0xD0, 0x5F, 0xC6, 0x2E, 0x06, 0xA1, 0xBE, 0x5B, 0xA0},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_mul_ab_str = {
+ {
+ {0x25, 0xCC, 0x11, 0x80, 0x8F, 0x08, 0x1D, 0x66, 0xF8, 0xDB, 0xBC,
+ 0x98, 0x26, 0x24, 0x26, 0xCF, 0x04, 0x02, 0xB6, 0x99, 0x1B, 0x52,
+ 0xA8, 0xE3, 0x4E, 0x9A, 0x85, 0xB0, 0x5C, 0xCE, 0xDD, 0xC5},
+ {0xFC, 0x3C, 0xC2, 0x2C, 0x4B, 0x63, 0x72, 0x5F, 0xA9, 0xF9, 0x8C,
+ 0x62, 0xF4, 0xE7, 0x30, 0x71, 0x6F, 0x78, 0xF5, 0xFE, 0xF6, 0xDF,
+ 0xF7, 0xB5, 0x21, 0x69, 0x7C, 0x50, 0xAC, 0x56, 0xD9, 0xB5},
+ },
+ {
+ {0xA5, 0xD6, 0xAB, 0x2D, 0xED, 0x8E, 0xFE, 0x43, 0xCB, 0xC9, 0xEF,
+ 0x09, 0xC8, 0x2D, 0xE8, 0xD0, 0x3B, 0xC0, 0x5C, 0x7F, 0xE5, 0x3A,
+ 0x1D, 0x72, 0xF2, 0xF5, 0x03, 0xBD, 0xE5, 0xEB, 0x08, 0xA0},
+ {0xE6, 0xF3, 0x59, 0xE4, 0xD2, 0x52, 0xFD, 0x4F, 0xEC, 0xCE, 0x49,
+ 0x9F, 0x86, 0x50, 0x2D, 0x4A, 0x59, 0x2C, 0xA2, 0x4E, 0xE3, 0xFE,
+ 0xF2, 0xFC, 0xB9, 0xF4, 0x22, 0x88, 0xBC, 0x79, 0x21, 0xD0},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_exp_ax_str = {
+ {
+ {0xC0, 0x5A, 0x37, 0xAD, 0x08, 0xAB, 0x22, 0xCF, 0xF7, 0xF9, 0xCC,
+ 0xD4, 0x5A, 0x47, 0x38, 0x82, 0xE1, 0xC2, 0x06, 0x35, 0x4D, 0x5B,
+ 0x95, 0xA1, 0xA3, 0xC1, 0x83, 0x6C, 0x0F, 0x31, 0x24, 0xD2},
+ {0xC7, 0x86, 0xE1, 0x59, 0x63, 0xCE, 0x21, 0x2A, 0x57, 0x77, 0xE5,
+ 0x48, 0xF7, 0x60, 0x21, 0x00, 0x40, 0x2F, 0x09, 0x18, 0x5C, 0x32,
+ 0x32, 0x75, 0xD7, 0xB9, 0xE7, 0xB1, 0x95, 0xD5, 0xDF, 0x02},
+ },
+ {
+ {0xE5, 0xDE, 0xC6, 0x3E, 0x05, 0xFC, 0x6F, 0x7A, 0xE3, 0x2D, 0x7D,
+ 0x90, 0x5F, 0x43, 0xE2, 0xB0, 0x9E, 0xCD, 0xEC, 0x7B, 0x37, 0x4C,
+ 0x0A, 0x3E, 0x87, 0x4E, 0xE6, 0xDA, 0xD1, 0x90, 0xC0, 0xD1},
+ {0x70, 0x90, 0x54, 0x7F, 0x78, 0x93, 0xFA, 0xC4, 0xF7, 0x3A, 0x4D,
+ 0xBC, 0x03, 0x5E, 0x83, 0xDF, 0xEF, 0xF7, 0x52, 0xF9, 0x64, 0x7F,
+ 0x17, 0xC1, 0x69, 0xD6, 0xD7, 0x96, 0x18, 0x62, 0x46, 0xD1},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_multiexp_abxy_str = {
+ {
+ {0xE8, 0x6E, 0x02, 0x7A, 0xEC, 0xEA, 0xBA, 0x7E, 0xE5, 0x7C, 0xAD,
+ 0x98, 0x37, 0x54, 0xB2, 0x15, 0x64, 0x9C, 0x81, 0xFF, 0x69, 0xCC,
+ 0xD6, 0xA6, 0xAA, 0xA7, 0x10, 0x4F, 0x9B, 0x0C, 0x50, 0x14},
+ {0x7C, 0xAF, 0xC0, 0x6F, 0xC8, 0x87, 0xFF, 0x4A, 0x6F, 0xB5, 0x9E,
+ 0x63, 0x74, 0x20, 0xB5, 0xC6, 0x4F, 0x14, 0x0B, 0x6C, 0xBF, 0x00,
+ 0x71, 0xE2, 0x6D, 0x6C, 0x41, 0x6A, 0x0B, 0xA5, 0x5B, 0xCF},
+ },
+ {
+ {0x16, 0xCC, 0x9B, 0x37, 0xE7, 0xCB, 0x16, 0x5C, 0x39, 0x7C, 0x10,
+ 0x7E, 0xE0, 0xDD, 0x34, 0x90, 0xBE, 0x56, 0x28, 0x76, 0x27, 0x59,
+ 0xCE, 0xB3, 0xD7, 0xB4, 0x56, 0xD4, 0x0D, 0xD1, 0xB8, 0xFB},
+ {0x5E, 0x9E, 0x27, 0x30, 0x60, 0x87, 0x3B, 0xA4, 0x9B, 0x15, 0xEE,
+ 0x86, 0x15, 0x1D, 0xF4, 0xF3, 0x07, 0x31, 0x46, 0xFD, 0xB7, 0x51,
+ 0xFF, 0xC0, 0x42, 0x94, 0x38, 0xB7, 0x84, 0x5F, 0x86, 0x3A},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_inv_a_str = {
+ {
+ {0x2F, 0x8C, 0xC7, 0xD7, 0xD4, 0x1E, 0x4A, 0xCB, 0x82, 0x92, 0xC7,
+ 0x9C, 0x0F, 0xA2, 0xF2, 0x1B, 0xDF, 0xEA, 0x96, 0x64, 0x8B, 0xA2,
+ 0x32, 0x7C, 0xDF, 0xD8, 0x89, 0x10, 0xFD, 0xBB, 0x38, 0xCD},
+ {0xB1, 0x23, 0x46, 0x13, 0x4D, 0x9B, 0x8E, 0x8A, 0x95, 0x64, 0xDD,
+ 0x37, 0x29, 0x44, 0x1F, 0x76, 0xB5, 0x3A, 0x47, 0xD3, 0xE0, 0x18,
+ 0x1E, 0x60, 0xE9, 0x94, 0x13, 0xA4, 0x47, 0xCD, 0xBE, 0x03},
+ },
+ {
+ {0x2C, 0x98, 0x5A, 0x33, 0x10, 0x81, 0x1F, 0x3F, 0xFC, 0x66, 0x00,
+ 0xCF, 0x87, 0xA6, 0x46, 0x18, 0x60, 0x11, 0x2F, 0x9B, 0xE9, 0x07,
+ 0xE2, 0x2C, 0xE2, 0x4C, 0xBF, 0x50, 0x27, 0x1D, 0x57, 0xE1},
+ {0x93, 0xF5, 0x3A, 0xA7, 0x4E, 0xAE, 0x26, 0x48, 0x02, 0xA7, 0x13,
+ 0xED, 0x52, 0xAA, 0x14, 0x86, 0x06, 0x09, 0xC5, 0xAC, 0x4B, 0x64,
+ 0x16, 0x25, 0xEB, 0x12, 0x4B, 0x73, 0xD3, 0x13, 0xCB, 0x8F},
+ },
+};
+
+const G2ElemStr EcGroupTest::efq2_identity_str = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ },
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ },
+};
+
+// msg=aad, size=3
+// algorithm code path: sqrt result <= modulus/2, high bit is 0
+const G1ElemStr EcGroupTest::kAadHash = {
+ 0xB2, 0x12, 0x39, 0x3A, 0xA0, 0xCF, 0xA0, 0xDE, 0xB8, 0x85, 0xE7,
+ 0x5B, 0x1C, 0x13, 0x01, 0x0D, 0x0D, 0xA2, 0xBA, 0xC5, 0xB4, 0x3F,
+ 0x5E, 0xC7, 0x5B, 0x5A, 0xE2, 0x49, 0x1B, 0x3F, 0x65, 0x08, 0xC2,
+ 0x47, 0x40, 0xF3, 0xC7, 0x08, 0xA2, 0x41, 0x61, 0x99, 0x65, 0x4D,
+ 0x82, 0x2B, 0x9A, 0x06, 0x2C, 0xDF, 0x07, 0x71, 0xCC, 0xFA, 0x73,
+ 0x51, 0x45, 0x87, 0x55, 0x07, 0x17, 0xD1, 0x9C, 0x0B};
+
+// msg=bsn0, size=4
+// algorithm code path: sqrt result <= modulus/2, high bit is 1
+const G1ElemStr EcGroupTest::kBsn0Hash = {
+ 0x04, 0x0C, 0xB6, 0x57, 0x26, 0xD0, 0xE1, 0x48, 0x23, 0xC2, 0x40,
+ 0x5A, 0x91, 0x7C, 0xC6, 0x33, 0xFE, 0x0C, 0xC2, 0x2B, 0x52, 0x9D,
+ 0x6B, 0x87, 0xF9, 0xA7, 0x82, 0xCB, 0x36, 0x90, 0xFB, 0x09, 0x10,
+ 0xB1, 0x55, 0xAD, 0x98, 0x0D, 0x4F, 0x94, 0xDD, 0xBE, 0x52, 0x21,
+ 0x87, 0xC6, 0x3E, 0x52, 0x22, 0x83, 0xE3, 0x10, 0x36, 0xEF, 0xF8,
+ 0x6B, 0x04, 0x4D, 0x9F, 0x14, 0xA8, 0x51, 0xAF, 0xC3};
+
+// msg=test, size=4
+// algorithm code path: sqrt result > modulus/2, high bit is 0
+const G1ElemStr EcGroupTest::kTestHash = {
+ 0x82, 0x14, 0xAD, 0xE2, 0x0E, 0xCC, 0x95, 0x27, 0x14, 0xD0, 0x70,
+ 0xF1, 0x70, 0x17, 0xC2, 0xC2, 0x8C, 0x9F, 0x05, 0x79, 0xCD, 0xC8,
+ 0x72, 0x55, 0xFE, 0xAB, 0x80, 0x6F, 0x40, 0x5A, 0x6E, 0x64, 0x37,
+ 0x14, 0x7F, 0x8B, 0xF9, 0xD7, 0xEB, 0xA4, 0x5D, 0x9E, 0x57, 0x85,
+ 0xFF, 0x0F, 0xE5, 0xC6, 0x73, 0x4F, 0x17, 0x19, 0x96, 0x31, 0x3A,
+ 0xD1, 0xE1, 0x4E, 0xA8, 0xF9, 0x56, 0xD4, 0xBA, 0x4D};
+
+// msg=aac, size=3
+const G1ElemStr EcGroupTest::kAacHash = {
+ 0xAF, 0x5C, 0xBC, 0xD4, 0x88, 0x18, 0xD0, 0x35, 0xBD, 0xE0, 0x2F,
+ 0x77, 0x8B, 0x76, 0x52, 0x78, 0x92, 0x66, 0x36, 0x3A, 0x72, 0x15,
+ 0x20, 0x84, 0xE7, 0x1E, 0xFE, 0x94, 0x77, 0xFD, 0x83, 0x08, 0xEF,
+ 0x4B, 0x6B, 0xDE, 0x24, 0xD8, 0x42, 0x34, 0x88, 0xB8, 0x87, 0x4A,
+ 0xA8, 0x5D, 0x5A, 0xC1, 0x82, 0xFF, 0xE5, 0x25, 0xD7, 0x20, 0x2D,
+ 0x99, 0x49, 0xFE, 0x72, 0x34, 0xAA, 0xC9, 0xD2, 0xAA};
+
+///////////////////////////////////////////////////////////////////////
+// NewEcGroup
+TEST_F(EcGroupTest, NewFailsGivenArgumentsMismatch) {
+ // construct Fq^2 finite field
+ FqElemStr beta_str = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}};
+ FfElementObj neg_beta(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, beta_str), neg_beta));
+ FiniteFieldObj fq2(fq, neg_beta, 2);
+
+ FfElementObj fq2_a(&fq2);
+ FfElementObj fq2_b(&fq2);
+ FfElementObj g2_x(&fq2);
+ FfElementObj g2_y(&fq2);
+
+ EcGroup* g = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewEcGroup(fq2, this->fq_a, this->fq_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+ DeleteEcGroup(&g);
+ EXPECT_EQ(kEpidBadArgErr, NewEcGroup(this->fq, fq2_a, this->fq_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+ DeleteEcGroup(&g);
+ EXPECT_EQ(kEpidBadArgErr, NewEcGroup(this->fq, this->fq_a, fq2_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+ DeleteEcGroup(&g);
+ EXPECT_EQ(kEpidBadArgErr, NewEcGroup(this->fq, this->fq_a, this->fq_b, g2_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+ DeleteEcGroup(&g);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x, g2_y,
+ this->bn_p, this->bn_h, &g));
+ DeleteEcGroup(&g);
+}
+TEST_F(EcGroupTest, NewFailsGivenNullParameters) {
+ EcGroup* g;
+ EpidStatus sts;
+ sts = NewEcGroup(this->fq, nullptr, this->fq_b, this->g1_x, this->g1_y,
+ this->bn_p, this->bn_h, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, nullptr, this->g1_x, this->g1_y,
+ this->bn_p, this->bn_h, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, nullptr, this->g1_y,
+ this->bn_p, this->bn_h, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x, nullptr,
+ this->bn_p, this->bn_h, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x, this->g1_y,
+ nullptr, this->bn_h, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x, this->g1_y,
+ this->bn_p, nullptr, &g);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x, this->g1_y,
+ this->bn_p, this->bn_h, nullptr);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+}
+TEST_F(EcGroupTest, CanCreateEcGroupBasedOnFq) {
+ EcGroup* g;
+ EpidStatus sts = NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g);
+ EXPECT_EQ(kEpidNoErr, sts);
+
+ DeleteEcGroup(&g);
+}
+TEST_F(EcGroupTest, CanCreateEcGroupBasedOnFq2) {
+ EcGroup* g;
+ EXPECT_EQ(kEpidNoErr,
+ NewEcGroup(efq2_par->fq2, efq2_par->a, efq2_par->b, efq2_par->x,
+ efq2_par->y, efq2_par->order, efq2_par->cofactor, &g));
+
+ DeleteEcGroup(&g);
+}
+
+///////////////////////////////////////////////////////////////////////
+// DeleteEcGroup
+TEST_F(EcGroupTest, DeleteWorksGivenNewlyCreatedEcGroup) {
+ EcGroup* g;
+ THROW_ON_EPIDERR(NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+ EXPECT_NO_THROW(DeleteEcGroup(&g));
+}
+TEST_F(EcGroupTest, DeleteWorksGivenNewlyCreatedEcGroupFq2) {
+ EcGroup* g;
+ THROW_ON_EPIDERR(NewEcGroup(efq2_par->fq2, efq2_par->a, efq2_par->b,
+ efq2_par->x, efq2_par->y, efq2_par->order,
+ efq2_par->cofactor, &g));
+ EXPECT_NO_THROW(DeleteEcGroup(&g));
+}
+TEST_F(EcGroupTest, DeleteNullsPointer) {
+ EcGroup* g = nullptr;
+ THROW_ON_EPIDERR(NewEcGroup(this->fq, this->fq_a, this->fq_b, this->g1_x,
+ this->g1_y, this->bn_p, this->bn_h, &g));
+
+ EXPECT_NO_THROW(DeleteEcGroup(&g));
+ EXPECT_EQ(nullptr, g);
+}
+TEST_F(EcGroupTest, DeleteWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeleteEcGroup(nullptr));
+ EcGroup* g = nullptr;
+ EXPECT_NO_THROW(DeleteEcGroup(&g));
+}
+///////////////////////////////////////////////////////////////////////
+// NewEcPoint
+TEST_F(EcGroupTest, NewEcPointSucceedsGivenEcGroupBasedOnFq) {
+ EcPoint* point = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewEcPoint(this->efq, &point));
+ DeleteEcPoint(&point);
+}
+TEST_F(EcGroupTest, NewEcPointFailsGivenNullPointer) {
+ EcPoint* point = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewEcPoint(nullptr, &point));
+ EXPECT_EQ(kEpidBadArgErr, NewEcPoint(this->efq, nullptr));
+ DeleteEcPoint(&point);
+}
+TEST_F(EcGroupTest, NewEcPointSucceedsGivenEcGroupBasedOnFq2) {
+ EcPoint* point = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewEcPoint(this->efq2, &point));
+ DeleteEcPoint(&point);
+}
+TEST_F(EcGroupTest, DefaultEcPointIsIdentity) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EcPoint* point = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewEcPoint(this->efq, &point));
+ EpidStatus sts =
+ WriteEcPoint(this->efq, point, &g1_elem_str, sizeof(g1_elem_str));
+ EXPECT_EQ(this->efq_identity_str, g1_elem_str);
+ DeleteEcPoint(&point);
+ THROW_ON_EPIDERR(sts);
+
+ G2ElemStr g2_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, NewEcPoint(this->efq2, &point));
+ sts = WriteEcPoint(this->efq2, point, &g2_elem_str, sizeof(g2_elem_str));
+ EXPECT_EQ(this->efq2_identity_str, g2_elem_str);
+ DeleteEcPoint(&point);
+ THROW_ON_EPIDERR(sts);
+}
+///////////////////////////////////////////////////////////////////////
+// DeleteEcPoint
+TEST_F(EcGroupTest, DeleteEcPointNullsPointer) {
+ EcPoint* point = nullptr;
+ THROW_ON_EPIDERR(NewEcPoint(this->efq, &point));
+ EXPECT_NO_THROW(DeleteEcPoint(&point));
+ EXPECT_EQ(nullptr, point);
+}
+TEST_F(EcGroupTest, DeleteEcPointWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeleteEcPoint(nullptr));
+ EcPoint* point = nullptr;
+ EXPECT_NO_THROW(DeleteEcPoint(&point));
+ EXPECT_EQ(nullptr, point);
+}
+///////////////////////////////////////////////////////////////////////
+// ReadEcPoint
+TEST_F(EcGroupTest, ReadFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, ReadEcPoint(nullptr, &(this->efq_a_str),
+ sizeof(this->efq_a_str), this->efq_a));
+ EXPECT_EQ(kEpidBadArgErr, ReadEcPoint(this->efq, nullptr,
+ sizeof(this->efq_a_str), this->efq_a));
+ EXPECT_EQ(kEpidBadArgErr, ReadEcPoint(this->efq, &(this->efq_a_str),
+ sizeof(this->efq_a_str), nullptr));
+}
+TEST_F(EcGroupTest, ReadFailsGivenInvalidBufferSize) {
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadEcPoint(this->efq, &(this->efq_a_str), 0, this->efq_a));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadEcPoint(this->efq, &(this->efq_a_str),
+ sizeof(this->efq_a_str) - 1, this->efq_a));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadEcPoint(this->efq, &(this->efq_a_str),
+ std::numeric_limits<size_t>::max(), this->efq_a));
+}
+TEST_F(EcGroupTest, ReadEcPointReadsG1PointCorrectly) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, ReadEcPoint(this->efq, &this->efq_a_str,
+ sizeof(this->efq_a_str), this->efq_a));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_a, &g1_elem_str, sizeof(g1_elem_str)));
+ EXPECT_EQ(this->efq_a_str, g1_elem_str);
+}
+TEST_F(EcGroupTest, ReadEcPointReadsG1IdentityPointCorrectly) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr,
+ ReadEcPoint(this->efq, &this->efq_identity_str,
+ sizeof(this->efq_identity_str), this->efq_a));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_a, &g1_elem_str, sizeof(g1_elem_str)));
+ EXPECT_EQ(this->efq_identity_str, g1_elem_str);
+}
+TEST_F(EcGroupTest, ReadEcPointReadsG2IdentityPointCorrectly) {
+ G2ElemStr g2_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr,
+ ReadEcPoint(this->efq2, &this->efq2_identity_str,
+ sizeof(this->efq2_identity_str), this->efq2_r));
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq2, this->efq2_r, &g2_elem_str,
+ sizeof(g2_elem_str)));
+ EXPECT_EQ(this->efq2_identity_str, g2_elem_str);
+}
+TEST_F(EcGroupTest, ReadEcPointReadsG2PointCorrectly) {
+ G2ElemStr g2_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, ReadEcPoint(this->efq2, &this->efq2_a_str,
+ sizeof(this->efq2_a_str), this->efq2_r));
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq2, this->efq2_r, &g2_elem_str,
+ sizeof(g2_elem_str)));
+ EXPECT_EQ(this->efq2_a_str, g2_elem_str);
+}
+
+TEST_F(EcGroupTest, ReadFailsGivenPointDoesNotBelongToEcGroup) {
+ G1ElemStr bad_g1_point = this->efq_a_str;
+ bad_g1_point.x.data.data[31]++; // make point not belong to the group
+ EXPECT_EQ(kEpidBadArgErr, ReadEcPoint(this->efq, &bad_g1_point,
+ sizeof(bad_g1_point), this->efq_a));
+
+ G2ElemStr bad_g2_point = this->efq2_a_str;
+ bad_g2_point.x[0].data.data[31]++; // make point not belong to the group
+ EXPECT_EQ(kEpidBadArgErr, ReadEcPoint(this->efq2, &bad_g2_point,
+ sizeof(bad_g2_point), this->efq2_a));
+}
+///////////////////////////////////////////////////////////////////////
+// WriteEcPoint
+TEST_F(EcGroupTest, WriteFailsGivenNullPointer) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidBadArgErr, WriteEcPoint(nullptr, this->efq_a, &g1_elem_str,
+ sizeof(g1_elem_str)));
+ EXPECT_EQ(kEpidBadArgErr, WriteEcPoint(this->efq, nullptr, &g1_elem_str,
+ sizeof(g1_elem_str)));
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteEcPoint(this->efq, this->efq_a, nullptr, sizeof(g1_elem_str)));
+}
+TEST_F(EcGroupTest, WriteFailsGivenInvalidBufferSize) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteEcPoint(this->efq, this->efq_a, &g1_elem_str, 0));
+ EXPECT_EQ(kEpidBadArgErr, WriteEcPoint(this->efq, this->efq_a, &g1_elem_str,
+ sizeof(g1_elem_str) - 1));
+ EXPECT_EQ(kEpidBadArgErr, WriteEcPoint(this->efq, this->efq_a, &g1_elem_str,
+ std::numeric_limits<size_t>::max()));
+}
+TEST_F(EcGroupTest, WriteEcPointWritesG1PointCorrectly) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, WriteEcPoint(this->efq, this->efq_a, &g1_elem_str,
+ sizeof(g1_elem_str)));
+ EXPECT_EQ(this->efq_a_str, g1_elem_str);
+}
+TEST_F(EcGroupTest, WriteEcPointWritesG1IdentityPointCorrectly) {
+ G1ElemStr g1_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, WriteEcPoint(this->efq, this->efq_identity,
+ &g1_elem_str, sizeof(g1_elem_str)));
+ EXPECT_EQ(this->efq_identity_str, g1_elem_str);
+}
+TEST_F(EcGroupTest, WriteEcPointWritesG2IdentityPointCorrectly) {
+ G2ElemStr g2_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, WriteEcPoint(this->efq2, this->efq2_identity,
+ &g2_elem_str, sizeof(g2_elem_str)));
+ EXPECT_EQ(this->efq2_identity_str, g2_elem_str);
+}
+TEST_F(EcGroupTest, WriteEcPointWritesG2PointCorrectly) {
+ G2ElemStr g2_elem_str = {{{{0}}}, {{{0}}}};
+ EXPECT_EQ(kEpidNoErr, WriteEcPoint(this->efq2, this->efq2_a, &g2_elem_str,
+ sizeof(g2_elem_str)));
+ EXPECT_EQ(this->efq2_a_str, g2_elem_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcMul
+TEST_F(EcGroupTest, MulFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq2, this->efq_a, this->efq_b, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, this->efq2_a, this->efq_b, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, this->efq_a, this->efq2_b, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, this->efq_a, this->efq_b, this->efq2_r));
+}
+TEST_F(EcGroupTest, MulFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(nullptr, this->efq_a, this->efq_b, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, nullptr, this->efq_b, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, this->efq_a, nullptr, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMul(this->efq, this->efq_a, this->efq_b, nullptr));
+}
+TEST_F(EcGroupTest, MulSucceedsGivenIdentityElement) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq, this->efq_a, this->efq_identity, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_a_str, efq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq, this->efq_identity, this->efq_a, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_a_str, efq_r_str);
+}
+
+TEST_F(EcGroupTest, MulSucceedsGivenTwoElements) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq, this->efq_a, this->efq_b, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_mul_ab_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MulSucceedsGivenG2IdentityElement) {
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq2, this->efq2_a, this->efq2_identity, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_a_str, efq2_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq2, this->efq2_identity, this->efq2_a, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_a_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MulSucceedsGivenTwoG2Elements) {
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcMul(this->efq2, this->efq2_a, this->efq2_b, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_mul_ab_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcExp
+TEST_F(EcGroupTest, ExpFailsGivenArgumentsMismatch) {
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq2, this->efq_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq, this->efq2_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq, this->efq_a, &zero_bn_str, this->efq2_r));
+}
+TEST_F(EcGroupTest, ExpFailsGivenNullPointer) {
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(nullptr, this->efq_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq, nullptr, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq, this->efq_a, nullptr, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcExp(this->efq, this->efq_a, &zero_bn_str, nullptr));
+}
+TEST_F(EcGroupTest, ExpSucceedsGivenZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidNoErr,
+ EcExp(this->efq, this->efq_a, &zero_bn_str, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, ExpResultIsCorrect) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcExp(this->efq, this->efq_a, &this->x_str, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_exp_ax_str, efq_r_str);
+}
+TEST_F(EcGroupTest, ExpSucceedsGivenG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidNoErr,
+ EcExp(this->efq2, this->efq2_a, &zero_bn_str, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, ExpResultIsCorrectForG2) {
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcExp(this->efq2, this->efq2_a, &this->x_str, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_exp_ax_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcSscmExp
+TEST_F(EcGroupTest, SscmExpFailsGivenArgumentsMismatch) {
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq2, this->efq_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq, this->efq2_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq, this->efq_a, &zero_bn_str, this->efq2_r));
+}
+TEST_F(EcGroupTest, SscmExpFailsGivenNullPointer) {
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(nullptr, this->efq_a, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq, nullptr, &zero_bn_str, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq, this->efq_a, nullptr, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmExp(this->efq, this->efq_a, &zero_bn_str, nullptr));
+}
+TEST_F(EcGroupTest, SscmExpSucceedsGivenZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidNoErr,
+ EcSscmExp(this->efq, this->efq_a, &zero_bn_str, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmExpResultIsCorrect) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcSscmExp(this->efq, this->efq_a, &this->x_str, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_exp_ax_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmExpSucceedsGivenG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EXPECT_EQ(kEpidNoErr,
+ EcSscmExp(this->efq2, this->efq2_a, &zero_bn_str, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmExpResultIsCorrectForG2) {
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcSscmExp(this->efq2, this->efq2_a, &this->x_str, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_exp_ax_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcMultiExp
+TEST_F(EcGroupTest, MultiExpFailsGivenArgumentsMismatch) {
+ EcPoint const* pts_ec1[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_ec2[] = {this->efq2_a, this->efq2_b};
+ EcPoint const* pts_ec1_ec2[] = {this->efq_a, this->efq2_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumStr const* b[] = {&bnm0, &bnm1};
+ size_t m = 2;
+
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(this->efq2, pts_ec1, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(this->efq, pts_ec2, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(this->efq, pts_ec1, b, m, this->efq2_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExp(this->efq, pts_ec1_ec2, b, m, this->efq_r));
+}
+TEST_F(EcGroupTest, MultiExpFailsGivenNullPointer) {
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_withnull[] = {nullptr, this->efq_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumStr const* b[] = {&bnm0, &bnm1};
+ BigNumStr const* b_withnull[] = {nullptr, &bnm1};
+ size_t m = 2;
+
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(nullptr, pts, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(this->efq, nullptr, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExp(this->efq, pts, nullptr, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExp(this->efq, pts, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExp(this->efq, pts_withnull, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExp(this->efq, pts, b_withnull, m, this->efq_r));
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenOneZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenTwoZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenSixZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a, this->efq_a,
+ this->efq_a, this->efq_a, this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str, &zero_bn_str,
+ &zero_bn_str, &zero_bn_str, &zero_bn_str};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenOneG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenTwoG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenSixG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a, this->efq2_a,
+ this->efq2_a, this->efq2_a, this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str, &zero_bn_str,
+ &zero_bn_str, &zero_bn_str, &zero_bn_str};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenOneExponent) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumStr const* b[] = {&this->x_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_exp_ax_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenTwoExponents) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_multiexp_abxy_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenOneG2Exponent) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumStr const* b[] = {&this->x_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_exp_ax_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksGivenTwoG2Exponents) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_multiexp_abxy_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpWorksTwiceGivenSameOutputBuf) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EcPointObj temp(&this->efq2);
+ G2ElemStr temp_str;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ temp = this->efq2_r;
+ EXPECT_EQ(kEpidNoErr, EcMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq2, temp, &temp_str, sizeof(temp_str)));
+ EXPECT_EQ(temp_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcMultiExpBn
+TEST_F(EcGroupTest, MultiExpBnFailsGivenArgumentsMismatch) {
+ EcPoint const* pts_ec1[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_ec2[] = {this->efq2_a, this->efq2_b};
+ EcPoint const* pts_ec1_ec2[] = {this->efq_a, this->efq2_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumObj bno0(bnm0);
+ BigNumObj bno1(bnm1);
+ BigNum const* b[] = {bno0, bno1};
+ size_t m = 2;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq2, pts_ec1, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts_ec2, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts_ec1, b, m, this->efq2_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts_ec1_ec2, b, m, this->efq_r));
+}
+TEST_F(EcGroupTest, MultiExpBnFailsGivenNullPointer) {
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_withnull[] = {nullptr, this->efq_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumObj bno0(bnm0);
+ BigNumObj bno1(bnm1);
+ BigNum const* b[] = {bno0, bno1};
+ BigNum const* b_withnull[] = {nullptr, bno1};
+ size_t m = 2;
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExpBn(nullptr, pts, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, nullptr, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts, nullptr, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMultiExpBn(this->efq, pts, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts_withnull, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMultiExpBn(this->efq, pts, b_withnull, m, this->efq_r));
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenOneZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumObj bno_zero(zero_bn_str);
+ BigNum const* b[] = {bno_zero};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenTwoZeroExponents) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a};
+ BigNumObj bno_zero0(zero_bn_str);
+ BigNumObj bno_zero1(zero_bn_str);
+ BigNum const* b[] = {bno_zero0, bno_zero1};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenSixZeroExponents) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a, this->efq_a,
+ this->efq_a, this->efq_a, this->efq_a};
+ BigNumObj bno_zero0(zero_bn_str);
+ BigNumObj bno_zero1(zero_bn_str);
+ BigNumObj bno_zero2(zero_bn_str);
+ BigNumObj bno_zero3(zero_bn_str);
+ BigNumObj bno_zero4(zero_bn_str);
+ BigNumObj bno_zero5(zero_bn_str);
+ BigNum const* b[] = {bno_zero0, bno_zero1, bno_zero2,
+ bno_zero3, bno_zero4, bno_zero5};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenOneG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumObj bno_zero(zero_bn_str);
+ BigNum const* b[] = {bno_zero};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenTwoG2ZeroExponents) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a};
+ BigNumObj bno_zero0(zero_bn_str);
+ BigNumObj bno_zero1(zero_bn_str);
+ BigNum const* b[] = {bno_zero0, bno_zero1};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenSixG2ZeroExponents) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ BigNumObj bno_zero0(zero_bn_str);
+ BigNumObj bno_zero1(zero_bn_str);
+ BigNumObj bno_zero2(zero_bn_str);
+ BigNumObj bno_zero3(zero_bn_str);
+ BigNumObj bno_zero4(zero_bn_str);
+ BigNumObj bno_zero5(zero_bn_str);
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a, this->efq2_a,
+ this->efq2_a, this->efq2_a, this->efq2_a};
+ BigNum const* b[] = {bno_zero0, bno_zero1, bno_zero2,
+ bno_zero3, bno_zero4, bno_zero5};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenOneExponent) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumObj bno_x(this->x_str);
+ BigNum const* b[] = {bno_x};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_exp_ax_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenTwoExponents) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ BigNumObj bno_x(this->x_str);
+ BigNumObj bno_y(this->y_str);
+ BigNum const* b[] = {bno_x, bno_y};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_multiexp_abxy_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenOneG2Exponent) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumObj bno_x(this->x_str);
+ BigNum const* b[] = {bno_x};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_exp_ax_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenTwoG2Exponents) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumObj bno_x(this->x_str);
+ BigNumObj bno_y(this->y_str);
+ BigNum const* b[] = {bno_x, bno_y};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_multiexp_abxy_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksTwiceGivenSameOutputBuf) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumObj bno_x(this->x_str);
+ BigNumObj bno_y(this->y_str);
+ BigNum const* b[] = {bno_x, bno_y};
+ size_t m = 2;
+ EcPointObj temp(&this->efq2);
+ G2ElemStr temp_str;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ temp = this->efq2_r;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq2, temp, &temp_str, sizeof(temp_str)));
+ EXPECT_EQ(temp_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, MultiExpBnWorksGivenTwoDifferentSizeG3Exponents) {
+ const G1ElemStr g3_b_str = {
+ {{{
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b,
+ 0x0e, 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd,
+ 0xb6, 0xe6, 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72,
+ }}},
+ {{{
+ 0xfa, 0x85, 0x0f, 0x5c, 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6,
+ 0x64, 0xda, 0xa9, 0x8e, 0xf5, 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2,
+ 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0, 0x33, 0xec, 0x2a, 0x70,
+ }}}};
+ const G1ElemStr g3_k_str = {
+ {{{
+ 0x41, 0xb7, 0xa4, 0xc8, 0x43, 0x3f, 0x0b, 0xc2, 0x80, 0x31, 0xbe,
+ 0x75, 0x65, 0xe9, 0xbb, 0x81, 0x73, 0x5b, 0x91, 0x4f, 0x3f, 0xd7,
+ 0xbe, 0xb5, 0x19, 0x56, 0x3f, 0x18, 0x95, 0xea, 0xc1, 0xd7,
+ }}},
+ {{{
+ 0xa4, 0x5e, 0xb9, 0x86, 0xfc, 0xe5, 0xc4, 0x0f, 0x54, 0x37, 0xab,
+ 0xed, 0x59, 0x20, 0xce, 0x67, 0x68, 0x3c, 0x25, 0x4d, 0xbc, 0x5f,
+ 0x6a, 0x4d, 0x5a, 0xa7, 0x93, 0xce, 0x90, 0x2d, 0x3e, 0x5a,
+ }}}};
+ EcPointObj B(&this->epid11_G3, g3_b_str);
+ EcPointObj K(&this->epid11_G3, g3_k_str);
+ EcPoint const* pts[] = {B, K};
+ const std::vector<uint8_t> bnm_sf_str = {
+ 0x00, 0x3c, 0xc1, 0x73, 0x35, 0x3c, 0x99, 0x61, 0xb0, 0x80, 0x9a,
+ 0x0e, 0x8d, 0xbf, 0x5d, 0x0b, 0xa9, 0x18, 0x2b, 0x36, 0x3c, 0x06,
+ 0xbc, 0x1c, 0xc7, 0x9f, 0x76, 0xba, 0x5a, 0x26, 0xcd, 0x5e, 0x24,
+ 0xb9, 0x68, 0xde, 0x47, 0x72, 0xf9, 0xf9, 0x1e, 0xaa, 0x74, 0x17,
+ 0x31, 0xe4, 0x66, 0x59, 0x69, 0xe5, 0x9e, 0x27, 0x1d, 0x57, 0xe5,
+ 0x39, 0x57, 0xd4, 0xc5, 0x78, 0xf2, 0x77, 0x5c, 0x9f, 0x6c, 0xfe,
+ 0x12, 0x00, 0xa8, 0xe0, 0xd3, 0x81, 0x38, 0xaa, 0x5a};
+ const BigNumStr bnm_nc_tick_str = {{{
+ 0xcd, 0x2e, 0xe8, 0xf4, 0x85, 0x95, 0x04, 0x09, 0xbd, 0xa4, 0xfa,
+ 0x07, 0xe3, 0x1c, 0xb9, 0x5a, 0x82, 0x73, 0xa6, 0xea, 0x47, 0x5c,
+ 0x31, 0x74, 0x3c, 0x0a, 0xeb, 0x62, 0x94, 0x2f, 0x7b, 0x10,
+ }}};
+ BigNumObj bno_sf(bnm_sf_str);
+ // In order to callculate exp sf data should be devided by group order
+ THROW_ON_EPIDERR(BigNumMod(bno_sf, epid11_p_tick, bno_sf));
+ BigNumObj bno_nc_tick(bnm_nc_tick_str);
+ BigNum const* b[] = {bno_sf, bno_nc_tick};
+ EcPointObj R3 = EcPointObj(&this->epid11_G3);
+ const std::vector<uint8_t> expected_r_str = {
+ // X
+ 0x1E, 0xDF, 0x9E, 0xA5, 0xF5, 0xED, 0xB3, 0x3F, 0xCC, 0x83, 0x10, 0x5E,
+ 0x3E, 0xB7, 0xE5, 0x06, 0x5F, 0x19, 0xF9, 0xFD, 0xE9, 0x57, 0x0B, 0x31,
+ 0xC8, 0xDA, 0x0A, 0x7B, 0xCD, 0xB5, 0xAA, 0x2E,
+ // Y
+ 0x6A, 0x6B, 0x5A, 0x8D, 0x48, 0x5F, 0x2F, 0x72, 0x77, 0x93, 0xD6, 0xD0,
+ 0x49, 0xE1, 0x84, 0x35, 0x98, 0xF1, 0xDE, 0x71, 0xC5, 0xF4, 0x40, 0xFB,
+ 0x1C, 0x75, 0x83, 0xD7, 0x4F, 0x58, 0x0A, 0x8D};
+ std::vector<uint8_t> g3_r_str;
+ g3_r_str.resize(expected_r_str.size(), 0);
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcMultiExpBn(this->epid11_G3, pts, b, m, R3));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->epid11_G3, R3, g3_r_str.data(), g3_r_str.size()));
+ EXPECT_EQ(g3_r_str, expected_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcSscmMultiExp
+TEST_F(EcGroupTest, SscmMultiExpFailsGivenArgumentsMismatch) {
+ EcPoint const* pts_ec1[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_ec2[] = {this->efq2_a, this->efq2_b};
+ EcPoint const* pts_ec1_ec2[] = {this->efq_a, this->efq2_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumStr const* b[] = {&bnm0, &bnm1};
+ size_t m = 2;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq2, pts_ec1, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts_ec2, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts_ec1, b, m, this->efq2_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts_ec1_ec2, b, m, this->efq_r));
+}
+TEST_F(EcGroupTest, SscmMultiExpFailsGivenNullPointer) {
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ EcPoint const* pts_withnull[] = {nullptr, this->efq_b};
+ const BigNumStr bnm0 = {{0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3,
+ 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27,
+ 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF,
+ 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}};
+ const BigNumStr bnm1 = {{0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB,
+ 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF,
+ 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+ BigNumStr const* b[] = {&bnm0, &bnm1};
+ BigNumStr const* b_withnull[] = {nullptr, &bnm1};
+ size_t m = 2;
+
+ EXPECT_EQ(kEpidBadArgErr, EcSscmMultiExp(nullptr, pts, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, nullptr, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts, nullptr, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcSscmMultiExp(this->efq, pts, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts_withnull, b, m, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcSscmMultiExp(this->efq, pts, b_withnull, m, this->efq_r));
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenOneZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenTwoZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenSixZeroExponent) {
+ G1ElemStr efq_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq_a, this->efq_a, this->efq_a,
+ this->efq_a, this->efq_a, this->efq_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str, &zero_bn_str,
+ &zero_bn_str, &zero_bn_str, &zero_bn_str};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenOneG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenTwoG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenSixG2ZeroExponent) {
+ G2ElemStr efq2_r_str;
+ BigNumStr zero_bn_str = {0};
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_a, this->efq2_a,
+ this->efq2_a, this->efq2_a, this->efq2_a};
+ BigNumStr const* b[] = {&zero_bn_str, &zero_bn_str, &zero_bn_str,
+ &zero_bn_str, &zero_bn_str, &zero_bn_str};
+ size_t m = 6;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenOneExponent) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a};
+ BigNumStr const* b[] = {&this->x_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_exp_ax_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenTwoExponents) {
+ G1ElemStr efq_r_str;
+ EcPoint const* pts[] = {this->efq_a, this->efq_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq, pts, b, m, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_multiexp_abxy_str, efq_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenOneG2Exponent) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a};
+ BigNumStr const* b[] = {&this->x_str};
+ size_t m = 1;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_exp_ax_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksGivenTwoG2Exponents) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_multiexp_abxy_str, efq2_r_str);
+}
+TEST_F(EcGroupTest, SscmMultiExpWorksTwiceGivenSameOutputBuf) {
+ G2ElemStr efq2_r_str;
+ EcPoint const* pts[] = {this->efq2_a, this->efq2_b};
+ BigNumStr const* b[] = {&this->x_str, &this->y_str};
+ size_t m = 2;
+ EcPointObj temp(&this->efq2);
+ G2ElemStr temp_str;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ temp = this->efq2_r;
+ EXPECT_EQ(kEpidNoErr, EcSscmMultiExp(this->efq2, pts, b, m, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq2, temp, &temp_str, sizeof(temp_str)));
+ EXPECT_EQ(temp_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcGetRandom
+TEST_F(EcGroupTest, GetRandomFailsGivenArgumentsMismatch) {
+ Prng my_prng;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcGetRandom(this->efq2, &Prng::Generate, &my_prng, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcGetRandom(this->efq, &Prng::Generate, &my_prng, this->efq2_r));
+}
+TEST_F(EcGroupTest, GetRandomFailsGivenNullPointer) {
+ Prng my_prng;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcGetRandom(nullptr, &Prng::Generate, &my_prng, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcGetRandom(this->efq, nullptr, &my_prng, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcGetRandom(this->efq, &Prng::Generate, &my_prng, nullptr));
+}
+TEST_F(EcGroupTest, GetRandomGeneratesDifferentECPoints) {
+ Prng my_prng;
+ EcPointObj r1(&this->efq);
+ EcPointObj r2(&this->efq);
+ bool result;
+ // __LINE__ makes sure that r1 and r2 are generated using distinct seeds
+ my_prng.set_seed(__LINE__);
+ EXPECT_EQ(kEpidNoErr, EcGetRandom(this->efq, &Prng::Generate, &my_prng, r1));
+ my_prng.set_seed(__LINE__);
+ EXPECT_EQ(kEpidNoErr, EcGetRandom(this->efq, &Prng::Generate, &my_prng, r2));
+ THROW_ON_EPIDERR(EcIsEqual(this->efq, r1, r2, &result));
+ EXPECT_FALSE(result);
+}
+///////////////////////////////////////////////////////////////////////
+// EcInGroup
+TEST_F(EcGroupTest, InGroupFailsGivenNullPointer) {
+ bool in_group;
+ EXPECT_EQ(kEpidBadArgErr, EcInGroup(nullptr, &(this->efq_a_str),
+ sizeof(this->efq_a_str), &in_group));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcInGroup(this->efq, nullptr, sizeof(this->efq_a_str), &in_group));
+ EXPECT_EQ(kEpidBadArgErr, EcInGroup(this->efq, &(this->efq_a_str),
+ sizeof(this->efq_a_str), nullptr));
+}
+TEST_F(EcGroupTest, InGroupFailsGivenInvalidBufferSize) {
+ bool in_group;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcInGroup(this->efq, &(this->efq_a_str), 0, &in_group));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcInGroup(this->efq, &(this->efq_a_str),
+ std::numeric_limits<size_t>::max(), &in_group));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr,
+ EcInGroup(this->efq, &(this->efq_a_str), 0x100000001, &in_group));
+#endif
+}
+TEST_F(EcGroupTest, InGroupDetectsElementNotInGroup) {
+ // element be not in group if Y coordinate increased by 1
+ G1ElemStr p_str = this->efq_a_str;
+ p_str.y.data.data[31] -= 1;
+
+ bool in_group;
+ EXPECT_EQ(kEpidNoErr, EcInGroup(this->efq, &p_str, sizeof(p_str), &in_group));
+ EXPECT_FALSE(in_group);
+
+ G2ElemStr p2_str = this->efq2_a_str;
+ p2_str.y[0].data.data[31] -= 1;
+
+ EXPECT_EQ(kEpidNoErr,
+ EcInGroup(this->efq2, &p2_str, sizeof(p2_str), &in_group));
+ EXPECT_FALSE(in_group);
+}
+TEST_F(EcGroupTest, InGroupDetectsIdentityElementInGroup) {
+ bool in_group;
+ EXPECT_EQ(kEpidNoErr, EcInGroup(this->efq, &(this->efq_identity_str),
+ sizeof(this->efq_identity_str), &in_group));
+ EXPECT_TRUE(in_group);
+
+ EXPECT_EQ(kEpidNoErr, EcInGroup(this->efq2, &(this->efq2_identity_str),
+ sizeof(this->efq2_identity_str), &in_group));
+ EXPECT_TRUE(in_group);
+}
+TEST_F(EcGroupTest, InGroupFailsGivenContextMismatch) {
+ bool in_group;
+ EXPECT_EQ(kEpidBadArgErr, EcInGroup(this->efq2, &(this->efq_a_str),
+ sizeof(this->efq_a_str), &in_group));
+ EXPECT_FALSE(in_group);
+
+ EXPECT_EQ(kEpidBadArgErr, EcInGroup(this->efq, &(this->efq2_a_str),
+ sizeof(this->efq2_a_str), &in_group));
+ EXPECT_FALSE(in_group);
+}
+///////////////////////////////////////////////////////////////////////
+// EcHash
+TEST_F(EcGroupTest, HashFailsGivenArgumentsMismatch) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(this->efq2, msg, sizeof(msg), kSha256, this->efq_r, NULL));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(this->efq, msg, sizeof(msg), kSha256, this->efq2_r, NULL));
+}
+TEST_F(EcGroupTest, HashFailsGivenNullPointer) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(nullptr, msg, sizeof(msg), kSha256, this->efq_r, NULL));
+ EXPECT_EQ(kEpidBadArgErr, EcHash(this->efq, nullptr, sizeof(msg), kSha256,
+ this->efq_r, NULL));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(this->efq, msg, sizeof(msg), kSha256, nullptr, NULL));
+}
+TEST_F(EcGroupTest, HashFailsGivenUnsupportedHashAlg) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ EcHash(this->efq, msg, sizeof(msg), kSha3_256, this->efq_r, NULL));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ EcHash(this->efq, msg, sizeof(msg), kSha3_384, this->efq_r, NULL));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ EcHash(this->efq, msg, sizeof(msg), kSha3_512, this->efq_r, NULL));
+}
+TEST_F(EcGroupTest, HashFailsGivenIncorrectMsgLen) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(this->efq, nullptr, 1, kSha256, this->efq_r, NULL));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcHash(this->efq, msg, std::numeric_limits<size_t>::max(), kSha256,
+ this->efq_r, NULL));
+ EXPECT_EQ(kEpidBadArgErr, EcHash(this->efq, msg, (size_t)INT_MAX + 1, kSha256,
+ this->efq_r, NULL));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr, EcHash(this->efq, msg, (size_t)0x100000001, kSha256,
+ this->efq_r, NULL));
+#endif
+}
+TEST_F(EcGroupTest, HashAcceptsZeroLengthMessage) {
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, "", 0, kSha256, this->efq_r, NULL));
+}
+TEST_F(EcGroupTest, HashWorksGivenSHA256HashAlg) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha256,
+ this->efq_r, NULL));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_r_sha256_str, efq_r_str);
+}
+TEST_F(EcGroupTest, HashWorksGivenSHA384HashAlg) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha384,
+ this->efq_r, NULL));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_r_sha384_str, efq_r_str);
+}
+TEST_F(EcGroupTest, HashWorksGivenSHA512HashAlg) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha512,
+ this->efq_r, NULL));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_r_sha512_str, efq_r_str);
+}
+TEST_F(EcGroupTest, HashWorksGivenSHA512256HashAlg) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha512_256,
+ this->efq_r, NULL));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_r_sha512256_str, efq_r_str);
+}
+TEST_F(EcGroupTest, HashReturnsValidISha256) {
+ uint32_t i = 0;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha256,
+ this->efq_r, &i));
+ EXPECT_EQ((uint32_t)4, i);
+}
+TEST_F(EcGroupTest, HashReturnsValidISha384) {
+ uint32_t i = 0;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha384,
+ this->efq_r, &i));
+ EXPECT_EQ((uint32_t)0, i);
+}
+TEST_F(EcGroupTest, HashReturnsValidISha512) {
+ uint32_t i = 0;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha512,
+ this->efq_r, &i));
+ EXPECT_EQ((uint32_t)1, i);
+}
+TEST_F(EcGroupTest, HashReturnsValidISha512256) {
+ uint32_t i = 0;
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, sha_msg, sizeof(sha_msg), kSha512_256,
+ this->efq_r, &i));
+ EXPECT_EQ((uint32_t)0, i);
+}
+TEST_F(EcGroupTest, HashWorksForArbitraryMsg) {
+ uint32_t i = 0;
+ std::vector<uint8_t> msg_aad = {'a', 'a', 'd'};
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, msg_aad.data(), msg_aad.size(),
+ kSha512, this->efq_r, &i));
+ G1ElemStr exp_aad = {
+ 0x5e, 0x73, 0xbe, 0x39, 0x6b, 0xd8, 0x50, 0x2f, 0xb1, 0x93, 0xbf,
+ 0x9a, 0x3f, 0x42, 0x9d, 0x2a, 0xeb, 0xb7, 0x89, 0xb6, 0xcf, 0x52,
+ 0x78, 0x61, 0x19, 0x24, 0xae, 0x56, 0xb3, 0x15, 0xd6, 0x7e, 0x0d,
+ 0xb4, 0x3c, 0x33, 0xf3, 0x0a, 0xf1, 0x80, 0x21, 0x23, 0xd5, 0x6c,
+ 0x4a, 0xb6, 0x68, 0xcf, 0xa9, 0xcd, 0x44, 0x91, 0xc9, 0x6b, 0x50,
+ 0x96, 0x0f, 0x13, 0x47, 0x2d, 0x0b, 0xd5, 0x19, 0x68};
+ G1ElemStr res_aad;
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &res_aad, sizeof(res_aad)));
+ EXPECT_EQ(exp_aad, res_aad);
+ i = 0;
+ std::vector<uint8_t> msg_1_MB(1024 * 1024); // exactly 1 MB;
+ uint8_t c = 0;
+ for (size_t j = 0; j < msg_1_MB.size(); ++j) {
+ msg_1_MB[j] = c++;
+ }
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, msg_1_MB.data(), msg_1_MB.size(),
+ kSha512, this->efq_r, &i));
+ G1ElemStr exp_1_MB = {
+ 0xd8, 0xf7, 0xcd, 0x26, 0xa1, 0x86, 0x2e, 0x25, 0xa5, 0x17, 0x84,
+ 0x98, 0x80, 0x5b, 0xb6, 0x10, 0x1c, 0x0d, 0xe1, 0xf4, 0xaa, 0x50,
+ 0xfa, 0xdd, 0x67, 0x2f, 0xfd, 0x96, 0x95, 0x57, 0x1d, 0x0f, 0x92,
+ 0xcd, 0xd1, 0x99, 0x27, 0x29, 0xbe, 0x7c, 0x66, 0x27, 0x8e, 0x5b,
+ 0xc7, 0x0f, 0x9f, 0xad, 0xd7, 0x29, 0x54, 0x0f, 0xea, 0xa8, 0x01,
+ 0x42, 0xf9, 0x47, 0x1d, 0xec, 0x5c, 0x0c, 0x2e, 0xdb};
+ G1ElemStr res_1_MB;
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &res_1_MB, sizeof(res_1_MB)));
+ EXPECT_EQ(exp_1_MB, res_1_MB);
+ i = 0;
+ std::vector<uint8_t> msg_1_MB_Minus_2(1024 * 1024 - 2); // exactly 1 MB;
+ c = 0;
+ for (size_t j = 0; j < msg_1_MB_Minus_2.size(); ++j) {
+ msg_1_MB_Minus_2[j] = c++;
+ }
+ EXPECT_EQ(kEpidNoErr,
+ EcHash(this->efq, msg_1_MB_Minus_2.data(), msg_1_MB_Minus_2.size(),
+ kSha512, this->efq_r, &i));
+ G1ElemStr exp_1_MB_Minus_2 = {
+ 0x96, 0x31, 0xc8, 0xf7, 0x63, 0x82, 0x4b, 0x69, 0xae, 0xcd, 0x7a,
+ 0x54, 0xed, 0x66, 0x45, 0x22, 0xa1, 0xd3, 0x5a, 0x07, 0x56, 0xf4,
+ 0xfb, 0x47, 0xc7, 0xdf, 0x07, 0xf7, 0x21, 0xfb, 0x77, 0x2b, 0x65,
+ 0xe1, 0xa2, 0x2e, 0x3b, 0x1a, 0xc8, 0x62, 0x0b, 0xb8, 0xac, 0x32,
+ 0x21, 0xce, 0xa1, 0x74, 0x50, 0x55, 0xc2, 0x03, 0x91, 0x35, 0x63,
+ 0x25, 0x45, 0xb3, 0xc6, 0x3c, 0xe0, 0xe8, 0x74, 0xb4};
+ G1ElemStr res_1_MB_Minus_2;
+ THROW_ON_EPIDERR(WriteEcPoint(this->efq, this->efq_r, &res_1_MB_Minus_2,
+ sizeof(res_1_MB_Minus_2)));
+ EXPECT_EQ(exp_1_MB_Minus_2, res_1_MB_Minus_2);
+ i = 0;
+ std::vector<uint8_t> msg_102(102); // exactly 1 MB;
+ c = 0;
+ for (size_t j = 0; j < msg_102.size(); ++j) {
+ msg_102[j] = c++;
+ }
+ EXPECT_EQ(kEpidNoErr, EcHash(this->efq, msg_102.data(), msg_102.size(),
+ kSha512, this->efq_r, &i));
+ G1ElemStr exp_102 = {
+ 0x21, 0xf6, 0xb5, 0x2c, 0xbc, 0xb7, 0x90, 0x2b, 0x36, 0xe1, 0x43,
+ 0xb6, 0xca, 0x66, 0x7e, 0x0a, 0x87, 0x66, 0x32, 0xe0, 0x70, 0x74,
+ 0x2b, 0x20, 0x92, 0x8f, 0x8b, 0x3d, 0xd7, 0xe1, 0x95, 0xc7, 0xa9,
+ 0x1b, 0x46, 0x94, 0xab, 0xfc, 0x59, 0x0e, 0x63, 0x9d, 0x42, 0x15,
+ 0x85, 0xcb, 0x91, 0x12, 0xca, 0x19, 0x54, 0xa3, 0xe9, 0x77, 0xd0,
+ 0x1b, 0x2a, 0x97, 0x1e, 0xd0, 0x59, 0x33, 0xe1, 0x1d};
+ G1ElemStr res_102;
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &res_102, sizeof(res_102)));
+ EXPECT_EQ(exp_102, res_102);
+}
+///////////////////////////////////////////////////////////////////////
+// 1.1 EcHash
+TEST_F(EcGroupTest, Epid11HashFailsGivenMismatchedArguments) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->efq2, msg, sizeof(msg), this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->efq, msg, sizeof(msg), this->efq2_r));
+}
+TEST_F(EcGroupTest, Epid11HashFailsGivenNullPointer) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(nullptr, msg, sizeof(msg), this->epid11_G3_r));
+ EXPECT_EQ(kEpidBadArgErr, Epid11EcHash(this->epid11_G3, nullptr, sizeof(msg),
+ this->epid11_G3_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->epid11_G3, msg, sizeof(msg), nullptr));
+}
+TEST_F(EcGroupTest, Epid11HashFailsGivenInvalidMsgLen) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->epid11_G3, nullptr, 1, this->epid11_G3_r));
+ EXPECT_EQ(kEpidBadArgErr, Epid11EcHash(this->epid11_G3, msg,
+ std::numeric_limits<size_t>::max(),
+ this->epid11_G3_r));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->epid11_G3, msg, (size_t)INT_MAX + 1,
+ this->epid11_G3_r));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11EcHash(this->epid11_G3, msg, (size_t)0x100000001,
+ this->epid11_G3_r));
+#endif
+}
+TEST_F(EcGroupTest, Epid11HashAcceptsZeroLengthMessage) {
+ EXPECT_EQ(kEpidNoErr,
+ Epid11EcHash(this->epid11_G3, "", 0, this->epid11_G3_r));
+}
+TEST_F(EcGroupTest, Epid11HashWorksGivenValidParameters) {
+ Epid11G3ElemStr r_str;
+
+ uint8_t const msg0[] = {'a', 'a', 'd'};
+ EXPECT_EQ(kEpidNoErr, Epid11EcHash(this->epid11_G3, msg0, sizeof(msg0),
+ this->epid11_G3_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->epid11_G3, this->epid11_G3_r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(this->kAadHash, r_str);
+
+ uint8_t const msg1[] = {'b', 's', 'n', '0'};
+ EXPECT_EQ(kEpidNoErr, Epid11EcHash(this->epid11_G3, msg1, sizeof(msg1),
+ this->epid11_G3_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->epid11_G3, this->epid11_G3_r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(this->kBsn0Hash, r_str);
+
+ uint8_t const msg2[] = {'t', 'e', 's', 't'};
+ EXPECT_EQ(kEpidNoErr, Epid11EcHash(this->epid11_G3, msg2, sizeof(msg2),
+ this->epid11_G3_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->epid11_G3, this->epid11_G3_r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(this->kTestHash, r_str);
+
+ uint8_t const msg3[] = {'a', 'a', 'c'};
+ EXPECT_EQ(kEpidNoErr, Epid11EcHash(this->epid11_G3, msg3, sizeof(msg3),
+ this->epid11_G3_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->epid11_G3, this->epid11_G3_r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(this->kAacHash, r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcMakePoint
+TEST_F(EcGroupTest, MakePointFailsGivenArgumentsMismatch) {
+ FfElementObj fq2_a(&this->efq2_par->fq2);
+
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(this->efq2, this->fq_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(this->efq, fq2_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(this->efq2, this->fq_a, this->efq2_r));
+}
+TEST_F(EcGroupTest, MakePointFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(nullptr, this->fq_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(this->efq, nullptr, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcMakePoint(this->efq, this->fq_a, nullptr));
+}
+TEST_F(EcGroupTest, MakePointSucceedsGivenElement) {
+ Prng my_prng;
+ G1ElemStr efq_r_str;
+
+ // a pre-computed point in eqf
+ G1ElemStr efq_ref_str = {
+ {{0X1C, 0X53, 0X40, 0X69, 0X8B, 0X77, 0X75, 0XAA, 0X2B, 0X7D, 0X91,
+ 0XD6, 0X29, 0X49, 0X05, 0X7F, 0XF6, 0X4C, 0X63, 0X90, 0X58, 0X22,
+ 0X06, 0XF5, 0X1F, 0X3B, 0X9F, 0XA2, 0X04, 0X39, 0XA9, 0X67}},
+ {{0X3B, 0X65, 0X58, 0XAC, 0X97, 0X46, 0X47, 0XC9, 0X84, 0X57, 0X3F,
+ 0XFA, 0X4F, 0XB0, 0X64, 0X8D, 0X48, 0XC8, 0X14, 0XEB, 0XF1, 0X94,
+ 0X87, 0XDC, 0XB3, 0X73, 0X90, 0X1D, 0X75, 0XAD, 0XD5, 0X56}}};
+
+ // create a point with x == ref.x
+ FfElementObj elem(&this->fq, efq_ref_str.x);
+ EXPECT_EQ(kEpidNoErr, EcMakePoint(this->efq, elem, this->efq_r));
+
+ // check that the point matches ref
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(efq_ref_str, efq_r_str);
+}
+TEST_F(EcGroupTest, MakePointFailsGivenZeroElement) {
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMakePoint(this->efq, FfElementObj(&this->fq), this->efq_r));
+ // EcMakePoint is only defined for G1
+ EXPECT_EQ(kEpidBadArgErr,
+ EcMakePoint(this->efq2, FfElementObj(&this->efq2_par->fq2),
+ this->efq2_r));
+}
+///////////////////////////////////////////////////////////////////////
+// EcInverse
+TEST_F(EcGroupTest, InverseFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(this->efq2, this->efq_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(this->efq, this->efq2_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(this->efq, this->efq_a, this->efq2_r));
+}
+
+TEST_F(EcGroupTest, InverseFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(nullptr, this->efq_a, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(this->efq, nullptr, this->efq_r));
+ EXPECT_EQ(kEpidBadArgErr, EcInverse(this->efq, this->efq_a, nullptr));
+}
+
+TEST_F(EcGroupTest, InverseSucceedsGivenIdentity) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcInverse(this->efq, this->efq_identity, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_identity_str, efq_r_str);
+
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr,
+ EcInverse(this->efq2, this->efq2_identity, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_identity_str, efq2_r_str);
+}
+
+TEST_F(EcGroupTest, InverseSucceedsGivenElement) {
+ G1ElemStr efq_r_str;
+ EXPECT_EQ(kEpidNoErr, EcInverse(this->efq, this->efq_a, this->efq_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq, this->efq_r, &efq_r_str, sizeof(efq_r_str)));
+ EXPECT_EQ(this->efq_inv_a_str, efq_r_str);
+
+ G2ElemStr efq2_r_str;
+ EXPECT_EQ(kEpidNoErr, EcInverse(this->efq2, this->efq2_a, this->efq2_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(this->efq2, this->efq2_r, &efq2_r_str, sizeof(efq2_r_str)));
+ EXPECT_EQ(this->efq2_inv_a_str, efq2_r_str);
+}
+///////////////////////////////////////////////////////////////////////
+// EcIsEqual
+TEST_F(EcGroupTest, IsEqualFailsGivenArgumentsMismatch) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq2, this->efq_a, this->efq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq, this->efq2_a, this->efq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq, this->efq_a, this->efq2_a, &result));
+}
+TEST_F(EcGroupTest, IsEqualFailsGivenNullPointer) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(nullptr, this->efq_a, this->efq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq, nullptr, this->efq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq, this->efq_a, nullptr, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsEqual(this->efq, this->efq_a, this->efq_a, nullptr));
+}
+TEST_F(EcGroupTest, IsEqualCanCompareElementWithItself) {
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq, this->efq_a, this->efq_a, &result));
+ EXPECT_TRUE(result);
+
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq2, this->efq2_a, this->efq2_a, &result));
+ EXPECT_TRUE(result);
+}
+TEST_F(EcGroupTest, DifferentEFqElementsAreNotEqual) {
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq, this->efq_a, this->efq_b, &result));
+ EXPECT_FALSE(result);
+}
+TEST_F(EcGroupTest, SameEFqElementsAreEqual) {
+ THROW_ON_EPIDERR(ReadEcPoint(this->efq, &(this->efq_a_str),
+ sizeof(this->efq_a_str), this->efq_b));
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq, this->efq_a, this->efq_b, &result));
+ EXPECT_TRUE(result);
+}
+TEST_F(EcGroupTest, IsEqualCanCompareIdentityEFqElements) {
+ THROW_ON_EPIDERR(ReadEcPoint(this->efq, &(this->efq_identity_str),
+ sizeof(this->efq_identity_str), this->efq_b));
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq, this->efq_identity, this->efq_b, &result));
+ EXPECT_TRUE(result);
+}
+
+TEST_F(EcGroupTest, DifferentEFq2ElementsAreNotEqual) {
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq2, this->efq2_a, this->efq2_b, &result));
+ EXPECT_FALSE(result);
+}
+TEST_F(EcGroupTest, SameEFq2ElementsAreEqual) {
+ THROW_ON_EPIDERR(ReadEcPoint(this->efq2, &(this->efq2_a_str),
+ sizeof(this->efq2_a_str), this->efq2_b));
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq2, this->efq2_a, this->efq2_b, &result));
+ EXPECT_TRUE(result);
+}
+TEST_F(EcGroupTest, IsEqualCanCompareIdentityEFq2Elements) {
+ THROW_ON_EPIDERR(ReadEcPoint(this->efq2, &(this->efq2_identity_str),
+ sizeof(this->efq2_identity_str), this->efq2_b));
+ bool result;
+ ASSERT_EQ(kEpidNoErr,
+ EcIsEqual(this->efq2, this->efq2_identity, this->efq2_b, &result));
+ EXPECT_TRUE(result);
+}
+///////////////////////////////////////////////////////////////////////
+// EcIsIdentity
+TEST_F(EcGroupTest, IsIdentityFailsGivenArgumentsMismatch) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsIdentity(this->efq2, this->efq_identity, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsIdentity(this->efq, this->efq2_identity, &result));
+}
+TEST_F(EcGroupTest, IsIdentityFailsGivenNullPointer) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr, EcIsIdentity(nullptr, this->efq_identity, &result));
+ EXPECT_EQ(kEpidBadArgErr, EcIsIdentity(this->efq, nullptr, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ EcIsIdentity(this->efq, this->efq_identity, nullptr));
+}
+TEST_F(EcGroupTest, IsIdentityDetectsIdentityElement) {
+ bool result;
+ EXPECT_EQ(kEpidNoErr, EcIsIdentity(this->efq, this->efq_identity, &result));
+ EXPECT_TRUE(result);
+ EXPECT_EQ(kEpidNoErr, EcIsIdentity(this->efq2, this->efq2_identity, &result));
+ EXPECT_TRUE(result);
+}
+TEST_F(EcGroupTest, IsIdentityDetectsNonIdentityElement) {
+ bool result;
+ EXPECT_EQ(kEpidNoErr, EcIsIdentity(this->efq, this->efq_a, &result));
+ EXPECT_FALSE(result);
+ EXPECT_EQ(kEpidNoErr, EcIsIdentity(this->efq2, this->efq2_a, &result));
+ EXPECT_FALSE(result);
+}
+} // namespace
diff --git a/epid/common/math/unittests/ffelement-test.cc b/epid/common/math/unittests/ffelement-test.cc
new file mode 100644
index 0000000..212e09e
--- /dev/null
+++ b/epid/common/math/unittests/ffelement-test.cc
@@ -0,0 +1,3003 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FfElement unit tests.
+ */
+
+#include <algorithm>
+#include <cstring>
+#include <limits>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common-testhelper/octstr-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/finitefield.h"
+}
+
+#include "epid/common/types.h"
+
+#ifndef COUNT_OF
+#define COUNT_OF(a) (sizeof(a) / sizeof((a)[0]))
+#endif // COUNT_OF
+
+/// compares BigNumStr values
+bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares BigNumStr to FqElemStr values
+bool operator==(BigNumStr const& lhs, FqElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares FqElemStr to BigNumStr values
+bool operator==(FqElemStr const& lhs, BigNumStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares FqElemStr values
+bool operator==(FqElemStr const& lhs, FqElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares Fq2ElemStr values
+bool operator==(Fq2ElemStr const& lhs, Fq2ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares Fq6ElemStr values
+bool operator==(Fq6ElemStr const& lhs, Fq6ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares Fq12ElemStr values
+bool operator==(Fq12ElemStr const& lhs, Fq12ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares FpElemStr values
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares FfElementObj values
+bool operator==(FfElementObj const& lhs, FfElementObj const& rhs) {
+ auto lhs_data = lhs.data();
+ auto rhs_data = rhs.data();
+ return lhs_data.size() == rhs_data.size() &&
+ std::equal(lhs_data.begin(), lhs_data.end(), rhs_data.begin());
+}
+
+namespace {
+
+class FfElementTest : public ::testing::Test {
+ public:
+ virtual void SetUp() {
+ fq = FiniteFieldObj(bn_q_str);
+
+ // construct Fq^2 finite field
+ FfElementObj neg_beta(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, fq_qm1_str), neg_beta));
+ fq2 = FiniteFieldObj(fq, neg_beta, 2);
+
+ // construct Fq^6 finite field
+ FfElementObj neg_xi(&fq2);
+ THROW_ON_EPIDERR(FfNeg(fq2, FfElementObj(&fq2, this->fq2_2_1_str), neg_xi));
+ fq6 = FiniteFieldObj(fq2, neg_xi, 3);
+
+ // construct Fq^12 finite field
+ FfElementObj neg_v(&fq6);
+ THROW_ON_EPIDERR(
+ FfNeg(fq6, FfElementObj(&fq6, this->fq6_0_0_1_0_0_0_str), neg_v));
+ fq12 = FiniteFieldObj(fq6, neg_v, 2);
+
+ fq_0 = FfElementObj(&fq, &bn_0_str, sizeof(bn_0_str));
+ fq_2 = FfElementObj(&fq, &fq_2_str, sizeof(fq_2_str));
+ fq_qm2 = FfElementObj(&fq, &fq_qm2_str, sizeof(fq_qm2_str));
+ fq_3 = FfElementObj(&fq, &fq_3_str, sizeof(fq_3_str));
+ fq_4 = FfElementObj(&fq, &fq_4_str, sizeof(fq_4_str));
+ fq_5 = FfElementObj(&fq, &fq_5_str, sizeof(fq_5_str));
+ fq_a = FfElementObj(&fq, &bn_a_str, sizeof(bn_a_str));
+ // construct Intel(R) EPID 1.1 Fq finite field
+ epid11_fq = FiniteFieldObj(bn_epid11_bn_q_str);
+
+ // construct Intel(R) EPID 1.1 Fqd finite field
+ epid11_fqd = FiniteFieldObj(epid11_fq, bn_epid11_fq_coeffs,
+ COUNT_OF(bn_epid11_fq_coeffs));
+
+ // Fqk ground element is {-qnr, 0, 0}
+ FfElementObj epid11_neg_qnr(&epid11_fq);
+ THROW_ON_EPIDERR(FfNeg(
+ epid11_fq, FfElementObj(&epid11_fq, fq_epid11_fq_qnr), epid11_neg_qnr));
+ Fq3ElemStr epid11_ground_element_str = {0};
+ THROW_ON_EPIDERR(WriteFfElement(epid11_fq, epid11_neg_qnr,
+ &epid11_ground_element_str.a[0],
+ sizeof(epid11_ground_element_str.a[0])));
+ // construct Intel(R) EPID 1.1 Fqk finite field
+ epid11_GT = FiniteFieldObj(
+ epid11_fqd, FfElementObj(&epid11_fqd, epid11_ground_element_str), 2);
+
+ fq_0 = FfElementObj(&fq, &bn_0_str, sizeof((bn_0_str)));
+ fq_1 = FfElementObj(&fq, &bn_1_str, sizeof(bn_1_str));
+ fq_a = FfElementObj(&fq, &bn_a_str, sizeof(bn_a_str));
+ fq_b = FfElementObj(&fq, &bn_b_str, sizeof(bn_b_str));
+ fq_result = FfElementObj(&fq);
+ fq_sum_ab = FfElementObj(&fq, &fq_sum_ab_str, sizeof(fq_sum_ab_str));
+
+ fp = FiniteFieldObj(bn_p_str);
+
+ bn_0 = BigNumObj(bn_0_str);
+ bn_1 = BigNumObj(bn_1_str);
+ bn_a = BigNumObj(bn_a_str);
+
+ fq2_a = FfElementObj(&fq2, &fq2_a_str, sizeof(fq2_a_str));
+ fq2_result = FfElementObj(&fq2);
+
+ fq12_g = FfElementObj(&fq12, &fq12_g_str, sizeof(fq12_g_str));
+ fq12_h = FfElementObj(&fq12, &fq12_h_str, sizeof(fq12_h_str));
+ fq12_i = FfElementObj(&fq12, &fq12_i_str, sizeof(fq12_i_str));
+ fq12_j = FfElementObj(&fq12, &fq12_j_str, sizeof(fq12_j_str));
+ fq12_k = FfElementObj(&fq12, &fq12_k_str, sizeof(fq12_k_str));
+ fq12_result = FfElementObj(&fq12);
+ }
+
+ FiniteFieldObj fq;
+ FiniteFieldObj fq2;
+ FiniteFieldObj fq6;
+ FiniteFieldObj fq12;
+ FiniteFieldObj epid11_fq;
+ FiniteFieldObj epid11_fqd;
+ FiniteFieldObj epid11_GT;
+
+ FfElementObj fq_0;
+ FfElementObj fq_1;
+ FfElementObj fq_2;
+ FfElementObj fq_qm2; // Intel(R) EPID 2.0 parameter q - 2
+ FfElementObj fq_3;
+ FfElementObj fq_4;
+ FfElementObj fq_5;
+ FfElementObj fq_a;
+ FfElementObj fq_b;
+ FfElementObj fq_result;
+ FfElementObj fq_sum_ab;
+
+ FfElementObj fq2_a;
+ FfElementObj fq2_result;
+
+ FfElementObj fq12_g;
+ FfElementObj fq12_h;
+ FfElementObj fq12_i;
+ FfElementObj fq12_j;
+ FfElementObj fq12_k;
+ FfElementObj fq12_result;
+
+ FiniteFieldObj fp;
+
+ BigNumObj bn_0;
+ BigNumObj bn_1;
+ BigNumObj bn_a;
+
+ // Intel(R) EPID 2.0 parameter p
+ static const BigNumStr bn_p_str;
+ static const FpElemStr fp_p_str;
+
+ // Intel(R) EPID 2.0 parameter p - 1
+ static const BigNumStr fp_pm1_str;
+
+ // Intel(R) EPID 2.0 parameter q
+ static const BigNumStr bn_q_str;
+
+ // Intel(R) EPID 2.0 parameter q - 1
+ static const FqElemStr fq_qm1_str;
+ static const BigNumStr bn_qm1_str;
+
+ // Intel(R) EPID 2.0 parameter q - 2
+ static const FqElemStr fq_qm2_str;
+
+ // Intel(R) EPID 2.0 parameter q + 1
+ static const BigNumStr bn_qp1_str;
+
+ // Intel(R) EPID 2.0 parameter q - 0x3013
+ static const BigNumStr fq_qm0x3013_str;
+
+ // Intel(R) EPID 1.1 parameter q
+ static const BigNumStr bn_epid11_bn_q_str;
+
+ // Intel(R) EPID 1.1 parameter qnr
+ static const FqElemStr fq_epid11_fq_qnr;
+
+ // Intel(R) EPID 1.1 parameter coeff
+ static const BigNumStr bn_epid11_fq_coeffs[3];
+
+ // zero
+ static const BigNumStr bn_0_str;
+ static const FqElemStr fq_0_str;
+
+ // one
+ static const BigNumStr bn_1_str;
+ static const FqElemStr fq_1_str;
+
+ // two
+ static const BigNumStr bn_2_str;
+ static const FqElemStr fq_2_str;
+
+ // three
+ static const FqElemStr fq_3_str;
+
+ // four
+ static const FqElemStr fq_4_str;
+
+ // five
+ static const FqElemStr fq_5_str;
+
+ // 0x0000FFFF
+ static const BigNumStr bn_0xffff_str;
+
+ // Fq2 element containing {2, 1}
+ static const Fq2ElemStr fq2_2_1_str;
+
+ // Fq6 element containing {0, 0, 1, 0, 0, 0}
+ static const Fq6ElemStr fq6_0_0_1_0_0_0_str;
+
+ // arbitrary constant a (256 bit value)
+ static const BigNumStr bn_a_str;
+ static const FqElemStr fq_a_str;
+ static const Fq2ElemStr fq2_a_str;
+
+ // arbitrary constant b (256 bit value)
+ static const BigNumStr bn_b_str;
+ static const FqElemStr fq_b_str;
+
+ // a + b
+ static const FqElemStr fq_sum_ab_str;
+ static const Fq2ElemStr fq2_sum_ab_str;
+ static const Fq6ElemStr fq6_sum_ab_str;
+ static const Fq12ElemStr fq12_sum_ab_str;
+
+ // a * b
+ static const FqElemStr fq_mul_ab_str;
+ static const Fq2ElemStr fq2_mul_ab_str;
+
+ // 1/a
+ static const FqElemStr fq_inv_a_str;
+
+ // -a
+ static const FqElemStr fq_neg_a_str;
+
+ // pow(a, b), that is a raised to the power b
+ static const FqElemStr fq_exp_ab_str;
+
+ static const uint8_t sha_msg[3]; // predefined message for tests "abc"
+ static const FqElemStr fq_abc_sha256_str;
+ static const FqElemStr fq_abc_sha384_str;
+ static const FqElemStr fq_abc_sha512_str;
+ static const FqElemStr fq_abc_sha512256_str;
+
+ // arbitrary Fq12 constant a (unrelated to a above)
+ static const Fq12ElemStr fq12_g_str;
+ // arbitrary Fq12 constant b (unrelated to a above)
+ static const Fq12ElemStr fq12_h_str;
+ // arbitrary Fq12 constant c
+ static const Fq12ElemStr fq12_i_str;
+ // arbitrary Fq12 constant d
+ static const Fq12ElemStr fq12_j_str;
+ // arbitrary Fq12 constant e
+ static const Fq12ElemStr fq12_k_str;
+ // c * d
+ static const Fq12ElemStr fq12_mul_ij_str;
+ // e * b
+ static const Fq12ElemStr fq12_mul_gb_str;
+
+ // Fq Multi Exp Data
+ static const FqElemStr fq_multi_exp_base_1[1];
+ static const BigNumStr fq_multi_exp_exp_1[1];
+ static const FqElemStr fq_multi_exp_res_1;
+ static const std::vector<uint8_t> fq_multi_exp_exp_1_264;
+ static const FqElemStr fq_multi_exp_res_1_264;
+ static const FqElemStr fq_multi_exp_res_1_256_264;
+ static const FqElemStr fq_multi_exp_base_2[2];
+ static const BigNumStr fq_multi_exp_exp_2[2];
+ static const FqElemStr fq_multi_exp_res_2;
+ static const FqElemStr fq_multi_exp_base_3[3];
+ static const BigNumStr fq_multi_exp_exp_3[3];
+ static const FqElemStr fq_multi_exp_res_3;
+ static const FqElemStr fq_multi_exp_base_4[4];
+ static const BigNumStr fq_multi_exp_exp_4[4];
+ static const FqElemStr fq_multi_exp_res_4;
+ static const FqElemStr fq_multi_exp_base_5[5];
+ static const BigNumStr fq_multi_exp_exp_5[5];
+ static const FqElemStr fq_multi_exp_res_5;
+ static const FqElemStr fq_multi_exp_base_6[6];
+ static const BigNumStr fq_multi_exp_exp_6[6];
+ static const FqElemStr fq_multi_exp_res_6;
+
+ // Intel(R) EPID 1.1 GT Multi Exp Data
+ static const Fq6ElemStr epid11_GT_multi_exp_base_3[3];
+ static const std::vector<uint8_t> epid11_GT_multi_exp_exp_3[3];
+ static const Fq6ElemStr epid11_GT_multi_exp_res_3;
+
+ // Fq12 Multi Exp Data
+ static const Fq12ElemStr fq12_multi_exp_base_4[4];
+ static const BigNumStr fq12_multi_exp_exp_4[4];
+ static const Fq12ElemStr fq12_multi_exp_res_4;
+};
+
+const Fq2ElemStr FfElementTest::fq2_2_1_str = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}}};
+const Fq6ElemStr FfElementTest::fq6_0_0_1_0_0_0_str = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+
+// Intel(R) EPID 2.0 parameter p
+const BigNumStr FfElementTest::bn_p_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+
+// Intel(R) EPID 2.0 parameter p - 0x0D
+const FpElemStr FfElementTest::fp_p_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x00};
+
+// Intel(R) EPID 2.0 parameter p - 1
+const BigNumStr FfElementTest::fp_pm1_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0C,
+};
+
+// Intel(R) EPID 2.0 parameter q
+const BigNumStr FfElementTest::bn_q_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13};
+
+// Intel(R) EPID 2.0 parameter q - 1
+const FqElemStr FfElementTest::fq_qm1_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12};
+
+const BigNumStr FfElementTest::bn_qm1_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12};
+
+// Intel(R) EPID 2.0 parameter q - 2
+const FqElemStr FfElementTest::fq_qm2_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x11};
+
+// Intel(R) EPID 2.0 parameter q + 1
+const BigNumStr FfElementTest::bn_qp1_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x14};
+
+// Intel(R) EPID 2.0 parameter q - 0x3013
+const BigNumStr FfElementTest::fq_qm0x3013_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x00, 0x00};
+
+// Intel(R) EPID 1.1 parameter q
+const BigNumStr FfElementTest::bn_epid11_bn_q_str = {
+ 0x09, 0xF9, 0x24, 0xE5, 0xD9, 0xBC, 0x67, 0x7F, 0x81, 0x0D, 0xF0,
+ 0x25, 0x58, 0xF7, 0x53, 0x13, 0xA9, 0x8A, 0xA6, 0x10, 0x47, 0x65,
+ 0x5D, 0x73, 0x9E, 0xF1, 0x94, 0xEB, 0x05, 0xB1, 0xA7, 0x11};
+
+// Intel(R) EPID 1.1 parameter qnr
+const FqElemStr FfElementTest::fq_epid11_fq_qnr = {
+ {0x08, 0x66, 0xA7, 0x67, 0x36, 0x6E, 0x62, 0x71, 0xB7, 0xA6, 0x52,
+ 0x94, 0x8F, 0xFB, 0x25, 0x9E, 0xE6, 0x4F, 0x25, 0xE5, 0x26, 0x9A,
+ 0x2B, 0x6E, 0x7E, 0xF8, 0xA6, 0x39, 0xAE, 0x46, 0xAA, 0x24}};
+
+// Intel(R) EPID 1.1 parameter coeff
+const BigNumStr FfElementTest::bn_epid11_fq_coeffs[3] = {
+ {{{0x02, 0x16, 0x7A, 0x61, 0x53, 0xDD, 0xF6, 0xE2, 0x89, 0x15, 0xA0,
+ 0x94, 0xF1, 0xB5, 0xDC, 0x65, 0x21, 0x15, 0x62, 0xE1, 0x7D, 0xC5,
+ 0x43, 0x89, 0xEE, 0xB4, 0xEF, 0xC8, 0xA0, 0x8E, 0x34, 0x0F}}},
+
+ {{{0x04, 0x82, 0x27, 0xE1, 0xEB, 0x98, 0x64, 0xC2, 0x8D, 0x8F, 0xDD,
+ 0x0E, 0x82, 0x40, 0xAE, 0xD4, 0x31, 0x63, 0xD6, 0x46, 0x32, 0x16,
+ 0x85, 0x7A, 0xB7, 0x18, 0x68, 0xB8, 0x17, 0x02, 0x81, 0xA6}}},
+
+ {{{0x06, 0x20, 0x76, 0xE8, 0x54, 0x54, 0x53, 0xB4, 0xA9, 0xD8, 0x44,
+ 0x4B, 0xAA, 0xFB, 0x1C, 0xFD, 0xAE, 0x15, 0xCA, 0x29, 0x79, 0xA6,
+ 0x24, 0xA4, 0x0A, 0xF6, 0x1E, 0xAC, 0xED, 0xFB, 0x10, 0x41}}}};
+
+// zero
+const BigNumStr FfElementTest::bn_0_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+const FqElemStr FfElementTest::fq_0_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+// one
+const BigNumStr FfElementTest::bn_1_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+
+const FqElemStr FfElementTest::fq_1_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+
+// two
+const BigNumStr FfElementTest::bn_2_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
+
+const FqElemStr FfElementTest::fq_2_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
+
+// three
+const FqElemStr FfElementTest::fq_3_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
+
+// four
+const FqElemStr FfElementTest::fq_4_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04};
+
+// five
+const FqElemStr FfElementTest::fq_5_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05};
+
+const BigNumStr FfElementTest::bn_0xffff_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff};
+
+// arbitrary constant a (256 bit value)
+const BigNumStr FfElementTest::bn_a_str = {
+ 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A};
+
+const FqElemStr FfElementTest::fq_a_str = {
+ 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A};
+
+const Fq2ElemStr FfElementTest::fq2_a_str = {
+ {{{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0xDD, 0x2B, 0xE9, 0x59, 0x24, 0xA5, 0xB3, 0xFD, 0xEB, 0xE1, 0x3C,
+ 0xC0, 0x73, 0x4E, 0x99, 0xEE, 0x36, 0xF6, 0xC0, 0x1A, 0x76, 0x01,
+ 0x0A, 0xF0, 0xCB, 0xB4, 0x71, 0x88, 0x95, 0xCB, 0x35, 0xBA}}}}};
+
+// arbitrary constant b (256 bit value)
+const BigNumStr FfElementTest::bn_b_str = {
+ 0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2,
+ 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E,
+ 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2};
+
+const FqElemStr FfElementTest::fq_b_str = {
+ 0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2,
+ 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E,
+ 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2};
+
+// a + b
+const FqElemStr FfElementTest::fq_sum_ab_str = {
+ 0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F,
+ 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79,
+ 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C};
+
+const Fq2ElemStr FfElementTest::fq2_sum_ab_str = {
+ {{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F,
+ 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79,
+ 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+
+const Fq6ElemStr FfElementTest::fq6_sum_ab_str = {
+ {{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F,
+ 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79,
+ 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+
+const Fq12ElemStr FfElementTest::fq12_sum_ab_str = {
+ {{{{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F,
+ 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79,
+ 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}},
+
+ {{{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}}}};
+
+// a * b
+const FqElemStr FfElementTest::fq_mul_ab_str = {
+ 0xE4, 0xAB, 0xE3, 0xE4, 0x08, 0xC3, 0x8A, 0x00, 0x78, 0x50, 0x01,
+ 0xA9, 0x4A, 0xFC, 0x43, 0x15, 0xA2, 0x99, 0x51, 0x20, 0x6B, 0x9C,
+ 0x00, 0xCF, 0x82, 0x88, 0xBD, 0x39, 0x0B, 0xA2, 0x0B, 0x58};
+
+const Fq2ElemStr FfElementTest::fq2_mul_ab_str = {
+ {{{{0xE4, 0xAB, 0xE3, 0xE4, 0x08, 0xC3, 0x8A, 0x00, 0x78, 0x50, 0x01,
+ 0xA9, 0x4A, 0xFC, 0x43, 0x15, 0xA2, 0x99, 0x51, 0x20, 0x6B, 0x9C,
+ 0x00, 0xCF, 0x82, 0x88, 0xBD, 0x39, 0x0B, 0xA2, 0x0B, 0x58}}},
+ {{{0xB4, 0xE4, 0x39, 0xEA, 0x70, 0xDE, 0x15, 0xC3, 0xC6, 0x91, 0xFD,
+ 0x7F, 0xBE, 0x2B, 0xF5, 0xD2, 0xC0, 0xB7, 0x20, 0xFC, 0x1F, 0x02,
+ 0x33, 0xC9, 0x39, 0x93, 0xB9, 0x5E, 0x55, 0x51, 0xB6, 0x46}}}}};
+
+// 1/a
+const FqElemStr FfElementTest::fq_inv_a_str = {
+ 0x15, 0x17, 0x1A, 0x1E, 0x93, 0x71, 0x1B, 0x39, 0xC5, 0x97, 0xEF,
+ 0x78, 0xA5, 0x51, 0x34, 0x62, 0x44, 0xAD, 0x8D, 0x51, 0xDF, 0x90,
+ 0x7C, 0x6F, 0x56, 0xB6, 0xAB, 0x63, 0x5A, 0x68, 0x6D, 0xF6};
+
+// -a
+const FqElemStr FfElementTest::fq_neg_a_str = {
+ 0xED, 0x59, 0xA4, 0x29, 0x6E, 0x6F, 0xA0, 0x25, 0xDF, 0xFA, 0x75,
+ 0x0C, 0x0B, 0x31, 0x8D, 0x3E, 0x8C, 0xFC, 0xF9, 0x59, 0xE6, 0x7D,
+ 0xD2, 0xA2, 0x40, 0x68, 0x36, 0x22, 0x38, 0x27, 0x7E, 0x89};
+
+// pow(a, b)
+const FqElemStr FfElementTest::fq_exp_ab_str = {
+ 0x29, 0x65, 0x68, 0x0E, 0x56, 0xB9, 0x8F, 0xBA, 0xA6, 0xEA, 0x8F,
+ 0xE1, 0x13, 0x44, 0x3B, 0x12, 0x5C, 0xB9, 0xF8, 0x76, 0x42, 0x12,
+ 0xCB, 0xB2, 0xED, 0xC0, 0x23, 0xA3, 0x5C, 0xAD, 0x38, 0xD1};
+
+const uint8_t FfElementTest::sha_msg[] = {'a', 'b', 'c'};
+
+const FqElemStr FfElementTest::fq_abc_sha256_str = {
+ 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, 0x41, 0x41, 0x40,
+ 0xDE, 0x5D, 0xAE, 0x22, 0x23, 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17,
+ 0x7A, 0x9C, 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD,
+};
+const FqElemStr FfElementTest::fq_abc_sha384_str = {
+ 0x10, 0xAC, 0xE4, 0xE8, 0x8F, 0xBB, 0x96, 0xBF, 0x53, 0xB6, 0xAF,
+ 0xE4, 0x4E, 0x95, 0xDE, 0xA5, 0x98, 0x8F, 0x10, 0xBF, 0x59, 0xC4,
+ 0x11, 0xFE, 0x1F, 0x7A, 0xA6, 0x1E, 0x57, 0x3E, 0xE3, 0x3C,
+};
+const FqElemStr FfElementTest::fq_abc_sha512_str = {
+ 0x14, 0xB4, 0x28, 0x89, 0xD2, 0x86, 0xA4, 0x79, 0xE3, 0x5B, 0xC4,
+ 0x50, 0xD1, 0x3B, 0xF2, 0x35, 0xF7, 0x97, 0x91, 0x05, 0x3D, 0x64,
+ 0xC0, 0x06, 0x45, 0x9F, 0xEC, 0xD8, 0xDB, 0x53, 0x3E, 0xC3,
+};
+
+const FqElemStr FfElementTest::fq_abc_sha512256_str = {
+ 0x53, 0x04, 0x8E, 0x26, 0x81, 0x94, 0x1E, 0xF9, 0x9B, 0x2E, 0x29,
+ 0xB7, 0x6B, 0x4C, 0x7D, 0xAB, 0xE4, 0xC2, 0xD0, 0xC6, 0x34, 0xFC,
+ 0x6D, 0x46, 0xE0, 0xE2, 0xF1, 0x31, 0x07, 0xE7, 0xAF, 0x23,
+};
+
+const Fq12ElemStr FfElementTest::fq12_g_str = {
+ {{{{{{0xBA, 0x10, 0x1F, 0xF6, 0x46, 0x8B, 0xE9, 0x32, 0x4F, 0xC0, 0xA5,
+ 0x01, 0xAD, 0x5E, 0xE2, 0x31, 0x16, 0x29, 0x96, 0xED, 0xA7, 0xDE,
+ 0x4C, 0xE1, 0xD2, 0x8D, 0x33, 0xCA, 0x50, 0xAB, 0x7B, 0xC6},
+ {0x15, 0xEB, 0x79, 0xF4, 0xEB, 0xDE, 0x30, 0xB6, 0xC4, 0x07, 0x7C,
+ 0x42, 0xCB, 0x04, 0x54, 0xF2, 0x1F, 0x4D, 0x1F, 0xC0, 0xDF, 0xA2,
+ 0x2B, 0x9E, 0x34, 0xC4, 0x4C, 0x84, 0x14, 0xD3, 0x62, 0x07}}},
+ {{{0xF1, 0x8B, 0x84, 0xD1, 0x46, 0x57, 0xB6, 0xE7, 0x80, 0xE1, 0x46,
+ 0x49, 0x1C, 0x0D, 0xEF, 0x81, 0x31, 0xB0, 0xBE, 0x8C, 0xB9, 0x08,
+ 0xD0, 0xD3, 0xC4, 0x56, 0xCA, 0xAD, 0xF9, 0x1D, 0x75, 0x19},
+ {0x3F, 0xEE, 0x7C, 0x43, 0xC1, 0xFA, 0x4E, 0x50, 0xB7, 0x19, 0x01,
+ 0x00, 0x6F, 0xD5, 0x16, 0xB6, 0xF4, 0x85, 0xE0, 0xEB, 0x2E, 0x5F,
+ 0x0A, 0x7E, 0xF8, 0xAC, 0xBC, 0x05, 0xEC, 0x73, 0xB5, 0x57}}},
+ {{{0xE3, 0xB3, 0x18, 0x29, 0xBB, 0xEF, 0x86, 0x50, 0x87, 0xCF, 0x70,
+ 0xBA, 0x13, 0x8B, 0xB1, 0xB6, 0x2D, 0x6F, 0x65, 0x3D, 0xA1, 0x0B,
+ 0xE3, 0x92, 0xC5, 0x72, 0x86, 0x6A, 0xB3, 0xEB, 0xE0, 0xE5},
+ {0xDA, 0x0E, 0x57, 0x87, 0xD5, 0xA9, 0x61, 0xA5, 0x1E, 0xCB, 0x04,
+ 0x86, 0xCD, 0xC3, 0x18, 0x2A, 0x36, 0xA0, 0x81, 0x73, 0xE7, 0x13,
+ 0x87, 0x80, 0x8D, 0x1A, 0xFE, 0x6E, 0x4B, 0xA3, 0x13, 0x03}}}}},
+ {{{{{0x66, 0x9E, 0x80, 0x4D, 0x8A, 0xAA, 0x00, 0x95, 0x72, 0xCE, 0xBB,
+ 0x51, 0xE8, 0x01, 0x09, 0x41, 0xD3, 0x63, 0x28, 0x05, 0xA4, 0xBE,
+ 0xD6, 0x41, 0xA6, 0x2F, 0x5F, 0xBF, 0x0B, 0x13, 0xB4, 0x54},
+ {0x5B, 0x50, 0x65, 0xDC, 0x6F, 0x29, 0xD6, 0xDA, 0xBF, 0xC2, 0x06,
+ 0xEA, 0x3B, 0xB2, 0xF1, 0xD4, 0x26, 0x5C, 0x92, 0x6B, 0x95, 0x6D,
+ 0x88, 0xAB, 0x8F, 0xC6, 0x9D, 0x31, 0xE4, 0x9B, 0x71, 0x49}}},
+ {{{0xE0, 0xCE, 0x97, 0x8F, 0xC9, 0x9F, 0xBC, 0xA8, 0x4A, 0xC6, 0xAA,
+ 0x4A, 0xC8, 0x0D, 0x2A, 0x60, 0x1A, 0x43, 0x40, 0x03, 0xB3, 0x53,
+ 0x30, 0x98, 0x1F, 0x3F, 0xDF, 0x5C, 0x0F, 0xF0, 0x84, 0x8E},
+ {0x5A, 0x5D, 0x41, 0xD2, 0x47, 0x78, 0x6D, 0x9F, 0x89, 0xCE, 0xF5,
+ 0x8E, 0xB6, 0x54, 0xA2, 0x26, 0xE5, 0x40, 0x39, 0x5C, 0x59, 0x08,
+ 0xB3, 0xDA, 0xF5, 0xF8, 0xA0, 0x18, 0x33, 0x57, 0xD1, 0x72}}},
+ {{{0xBB, 0xBA, 0x6C, 0xED, 0xE8, 0xA0, 0x5E, 0xC8, 0x81, 0xC5, 0xAC,
+ 0x15, 0x1B, 0xD0, 0xE6, 0xC8, 0x92, 0xF9, 0x43, 0x03, 0x5A, 0x00,
+ 0x42, 0xE3, 0x49, 0xA5, 0xF7, 0x19, 0x78, 0x8A, 0x39, 0x89},
+ {0x32, 0xAE, 0xBF, 0x4D, 0x4B, 0xB3, 0x33, 0x76, 0x16, 0xFD, 0x0B,
+ 0xFE, 0x42, 0x1E, 0x17, 0x37, 0x2A, 0x04, 0xEA, 0x26, 0xBA, 0x6E,
+ 0x2C, 0x36, 0xAF, 0x35, 0x1B, 0x75, 0x6D, 0x17, 0xDC, 0x8E}}}}}}};
+
+const Fq12ElemStr FfElementTest::fq12_h_str = {
+ {{{{{{0x41, 0xFB, 0xBE, 0xD2, 0x20, 0x95, 0xE5, 0xBA, 0x87, 0x54, 0x23,
+ 0xCC, 0x04, 0x97, 0x38, 0x4B, 0x69, 0x28, 0x18, 0x6D, 0xAE, 0x19,
+ 0xE3, 0x3D, 0xFE, 0x39, 0xE2, 0x1C, 0xC2, 0x53, 0x17, 0xF6},
+ {0xEA, 0xA3, 0x0F, 0x62, 0x6E, 0xBF, 0x6F, 0x8F, 0xBC, 0xFA, 0x6E,
+ 0x07, 0xD3, 0xD3, 0xAE, 0x5C, 0xAA, 0xB5, 0x9C, 0xD7, 0xB8, 0x5B,
+ 0x1B, 0x69, 0x52, 0x93, 0xBF, 0xDB, 0x87, 0x5C, 0x19, 0x07}}},
+ {{{0x1B, 0x03, 0xE1, 0x79, 0x3C, 0x10, 0x0B, 0x65, 0xBF, 0xD7, 0xF3,
+ 0x45, 0x1A, 0xD4, 0xDD, 0xB8, 0x67, 0x1A, 0x8F, 0x41, 0x1A, 0xD4,
+ 0x04, 0x3C, 0xD2, 0xA4, 0x3B, 0x47, 0xFE, 0xBD, 0xEA, 0x87},
+ {0xDF, 0x7F, 0x94, 0x9C, 0xB8, 0x65, 0x54, 0x8D, 0xD7, 0x0B, 0x33,
+ 0x26, 0x25, 0x89, 0xD4, 0x60, 0x0C, 0x89, 0x5F, 0x2C, 0x00, 0x7F,
+ 0xAF, 0x89, 0x35, 0xE5, 0xB9, 0x23, 0x7F, 0x79, 0x1A, 0x86}}},
+ {{{0xCE, 0x01, 0x4F, 0x24, 0x3C, 0x3A, 0xC3, 0x61, 0x5B, 0xD9, 0x2D,
+ 0x87, 0x94, 0xA3, 0xD2, 0x8B, 0x57, 0xC4, 0x07, 0xF8, 0x29, 0x5E,
+ 0x09, 0x23, 0xCA, 0xE9, 0x85, 0xA1, 0xDB, 0xF2, 0x0C, 0x8F},
+ {0xC2, 0xFB, 0x9A, 0xCC, 0xD9, 0x82, 0x63, 0x28, 0x83, 0xB7, 0x4F,
+ 0x99, 0x3A, 0x19, 0x11, 0xB0, 0xB4, 0xE7, 0x73, 0x94, 0x35, 0x19,
+ 0x6B, 0xC2, 0x5D, 0x2E, 0x8C, 0x33, 0xFF, 0x13, 0xCD, 0xBE}}}}},
+ {{{{{0x29, 0x43, 0xF6, 0xA0, 0xE9, 0xDC, 0x27, 0x27, 0x9B, 0x0A, 0x33,
+ 0xBC, 0x85, 0x6A, 0xBF, 0x8B, 0xC5, 0x89, 0x10, 0x92, 0xAE, 0x73,
+ 0xC9, 0x32, 0x46, 0x8D, 0x24, 0x1F, 0x32, 0x96, 0xED, 0x0B},
+ {0x44, 0x8C, 0x6D, 0xF6, 0x1A, 0x2F, 0xCA, 0x18, 0x8E, 0x84, 0xFF,
+ 0x5F, 0x5F, 0xAF, 0xC0, 0x52, 0x35, 0xA1, 0xB3, 0xA0, 0xDE, 0xEE,
+ 0x97, 0xBF, 0xB8, 0xFA, 0x8B, 0x9E, 0x00, 0x13, 0xE7, 0x26}}},
+ {{{0xFB, 0x78, 0xA1, 0x6D, 0x41, 0x92, 0xA6, 0xC6, 0x7F, 0xAD, 0xB7,
+ 0xFC, 0x4F, 0x5F, 0x48, 0x94, 0x7D, 0xB7, 0xF5, 0xCC, 0xB5, 0x7E,
+ 0x08, 0xCD, 0xBF, 0x58, 0xC9, 0x30, 0xEB, 0xE4, 0xA0, 0xBF},
+ {0x0C, 0x6A, 0x89, 0x18, 0x97, 0x37, 0x54, 0x76, 0x79, 0x3E, 0x8E,
+ 0xA6, 0x5B, 0x77, 0xCE, 0x4A, 0xCB, 0xD9, 0x8B, 0x7B, 0x32, 0x1A,
+ 0x30, 0x40, 0x49, 0xFF, 0x84, 0xE7, 0xBE, 0xD8, 0xCF, 0xFD}}},
+ {{{0x2D, 0x23, 0x54, 0xB5, 0x2E, 0x29, 0xE9, 0xC7, 0x62, 0x1B, 0x03,
+ 0x34, 0x3A, 0xEB, 0xC9, 0x69, 0x38, 0x9F, 0xD1, 0x2B, 0xDA, 0x8B,
+ 0x07, 0x58, 0x30, 0xF8, 0x38, 0x08, 0x09, 0x07, 0xCA, 0x5B},
+ {0x3A, 0x13, 0xED, 0xF4, 0x5D, 0xC9, 0x23, 0x66, 0x85, 0x8C, 0x6A,
+ 0x7D, 0xE9, 0x11, 0x17, 0xE6, 0x43, 0x2F, 0x12, 0xC5, 0x07, 0x63,
+ 0x84, 0x98, 0xA0, 0x1C, 0xDC, 0xF3, 0x91, 0x91, 0x11, 0x55}}}}}}};
+
+const Fq12ElemStr FfElementTest::fq12_i_str = {
+ {{{{{{0x0F, 0xD0, 0x1C, 0x59, 0x98, 0x52, 0x5A, 0x40, 0xFF, 0x26, 0x0A,
+ 0xFD, 0x70, 0xEC, 0x23, 0x48, 0x1B, 0x4B, 0x70, 0xA0, 0x15, 0xC5,
+ 0xB1, 0x8B, 0xA5, 0x75, 0xAC, 0xCE, 0xF3, 0x6C, 0xE8, 0xBA},
+ {0xA7, 0xFB, 0xF9, 0xEA, 0x18, 0x70, 0xD8, 0x9B, 0x3C, 0xC3, 0x66,
+ 0x10, 0x38, 0xAC, 0x16, 0x32, 0xDC, 0x9D, 0xF0, 0xD4, 0x2C, 0xE7,
+ 0xF6, 0x69, 0x47, 0x69, 0x84, 0xEE, 0x39, 0x5F, 0xD8, 0xCC}}},
+ {{{0x1B, 0xEF, 0x81, 0x13, 0x81, 0xB9, 0x56, 0xAE, 0xD0, 0xD4, 0xAE,
+ 0xCB, 0x24, 0x7C, 0x7B, 0x7F, 0xC0, 0x41, 0x42, 0x0A, 0x9D, 0x90,
+ 0x6B, 0x1E, 0x3A, 0xAD, 0x39, 0x7A, 0x1F, 0xEF, 0x56, 0x9E},
+ {0xBD, 0x84, 0x48, 0xAF, 0x65, 0x66, 0x33, 0xE5, 0x67, 0xF1, 0xC4,
+ 0x48, 0xF0, 0xB6, 0x61, 0x06, 0xC7, 0x78, 0xB3, 0xC1, 0x12, 0xB8,
+ 0x31, 0xD4, 0x69, 0x2E, 0x0E, 0xD3, 0xD4, 0x91, 0x81, 0x9A}}},
+ {{{0x23, 0x62, 0x9B, 0x83, 0x95, 0xF6, 0x7F, 0xF6, 0xCC, 0x6B, 0xEE,
+ 0x84, 0xF0, 0x5B, 0x93, 0xA6, 0x90, 0x48, 0x1A, 0xA7, 0xA8, 0xE8,
+ 0x10, 0xA5, 0x53, 0x7E, 0x4F, 0xD5, 0x0D, 0xB0, 0x86, 0xF7},
+ {0x1F, 0xB8, 0xB7, 0xD4, 0x2E, 0x41, 0x83, 0x2C, 0xFC, 0x62, 0x14,
+ 0xB8, 0xC2, 0xF6, 0xC1, 0x5E, 0xC1, 0xC1, 0x40, 0x8B, 0x28, 0xB5,
+ 0x1B, 0x85, 0xEE, 0x71, 0xC8, 0x14, 0x56, 0xB9, 0x3B, 0x90}}}}},
+ {{{{{0x4A, 0xFE, 0x73, 0xFA, 0xCF, 0x20, 0x67, 0x0E, 0x89, 0x1D, 0xCB,
+ 0x05, 0x38, 0x27, 0x1C, 0xD5, 0x7A, 0x0C, 0xAC, 0x92, 0x17, 0x94,
+ 0x7F, 0x10, 0x3E, 0xFF, 0x97, 0x23, 0x66, 0x8D, 0x70, 0xAE},
+ {0x80, 0x97, 0xFF, 0x88, 0xF8, 0x01, 0x2B, 0x99, 0x81, 0xEB, 0xF8,
+ 0x19, 0xEF, 0xDA, 0xE3, 0xAE, 0xD9, 0x9B, 0x4C, 0x13, 0xFC, 0x9E,
+ 0x18, 0xD6, 0xB0, 0xCF, 0x4E, 0x29, 0xA8, 0xCF, 0x01, 0xFA}}},
+ {{{0xDA, 0x22, 0x85, 0x18, 0x9A, 0x51, 0x17, 0xAC, 0x26, 0x57, 0xF6,
+ 0x73, 0x59, 0x24, 0xD5, 0xC9, 0x4D, 0xAC, 0xB6, 0xE4, 0x51, 0xF7,
+ 0x5E, 0x30, 0x5B, 0x25, 0x3D, 0x52, 0xA3, 0xE0, 0x4B, 0xA2},
+ {0xC3, 0x4C, 0x2F, 0x53, 0xD5, 0x92, 0x33, 0x7E, 0x8B, 0x66, 0x5F,
+ 0x48, 0x48, 0xCA, 0xA8, 0x98, 0x0F, 0x73, 0xD3, 0x60, 0xAF, 0x25,
+ 0x02, 0xEE, 0x64, 0xE7, 0x02, 0x89, 0x9A, 0xD2, 0x96, 0x45}}},
+ {{{0x04, 0xE1, 0x30, 0x9B, 0xD8, 0x85, 0xF0, 0x99, 0x7C, 0x01, 0xD5,
+ 0x58, 0x5A, 0x74, 0x0B, 0xD4, 0xF2, 0xFA, 0xC7, 0x59, 0x36, 0xFD,
+ 0x91, 0x07, 0x60, 0xF7, 0xDC, 0x11, 0x3E, 0x8A, 0xC6, 0x48},
+ {0x0D, 0x02, 0x30, 0x18, 0xD0, 0xB9, 0x6B, 0xD6, 0x39, 0x6A, 0x41,
+ 0x82, 0xDD, 0xE3, 0xCE, 0xB8, 0xB6, 0xF5, 0x61, 0x80, 0x61, 0x16,
+ 0xF4, 0x9A, 0xB8, 0x58, 0x1D, 0x3F, 0x4D, 0xC2, 0xCA, 0xCF}}}}}}};
+
+const Fq12ElemStr FfElementTest::fq12_j_str = {
+ {{{{{{0x3A, 0x30, 0x33, 0xA2, 0x14, 0xDF, 0xDC, 0x70, 0x48, 0xF3, 0xBA,
+ 0x3F, 0xCE, 0xFC, 0x69, 0x24, 0xAE, 0xA1, 0xF3, 0xCF, 0xD8, 0x77,
+ 0x69, 0x38, 0x38, 0xF4, 0x8E, 0xFB, 0x51, 0xFB, 0x10, 0x7C},
+ {0x73, 0xB4, 0xEE, 0xF9, 0x76, 0xBB, 0x45, 0xEC, 0x07, 0x24, 0x23,
+ 0xA3, 0x38, 0x64, 0x39, 0x4C, 0x03, 0x94, 0xF5, 0xEE, 0x5F, 0xC9,
+ 0x83, 0x4F, 0xD1, 0xA6, 0x4A, 0x05, 0x25, 0x0C, 0x46, 0x33}}},
+ {{{0xD4, 0x40, 0x47, 0xAE, 0xEC, 0xDA, 0x30, 0xF9, 0xE1, 0x28, 0xFB,
+ 0xB1, 0x4C, 0x62, 0xFB, 0x6C, 0x90, 0x0D, 0xB1, 0xEC, 0xAF, 0x2D,
+ 0x95, 0x64, 0x11, 0x93, 0xDA, 0x8E, 0xB8, 0x7D, 0xE4, 0xA3},
+ {0x8E, 0xA6, 0x9B, 0xAA, 0x58, 0xD5, 0xDC, 0x59, 0x1A, 0x51, 0x53,
+ 0x47, 0x30, 0x1C, 0x2B, 0xB0, 0xBB, 0x57, 0x57, 0x0A, 0x8C, 0x5F,
+ 0x62, 0x9C, 0x52, 0x28, 0xC0, 0x25, 0x27, 0xAE, 0xCD, 0x36}}},
+ {{{0xBF, 0x2D, 0x03, 0xB1, 0x33, 0xFD, 0x24, 0x81, 0x3C, 0x91, 0x43,
+ 0x90, 0x0C, 0x20, 0xC4, 0xE3, 0x69, 0x3F, 0xA9, 0xA2, 0x7C, 0xC2,
+ 0x48, 0x28, 0x1B, 0xF0, 0x81, 0x1F, 0x2B, 0x8F, 0x8D, 0x43},
+ {0x38, 0x18, 0x12, 0xA3, 0x89, 0xF1, 0xD7, 0x60, 0x89, 0x68, 0x6A,
+ 0xC4, 0xCC, 0x5D, 0xF4, 0xCE, 0x43, 0x95, 0x84, 0xCD, 0x01, 0x55,
+ 0xB8, 0x5D, 0x24, 0x50, 0xCD, 0xE3, 0x68, 0x1C, 0xFF, 0x59}}}}},
+ {{{{{0x0D, 0xAC, 0xCB, 0xE7, 0x9D, 0x68, 0x0F, 0x4A, 0xAF, 0xEB, 0xB5,
+ 0xFB, 0xF9, 0xB1, 0x58, 0x80, 0xD5, 0x71, 0x53, 0x26, 0x2E, 0x9C,
+ 0xCE, 0x10, 0xAC, 0xD2, 0x0A, 0xEB, 0xB4, 0x5C, 0xC8, 0xD7},
+ {0x16, 0x26, 0x66, 0x71, 0xDD, 0x67, 0xBA, 0xDB, 0x35, 0x76, 0x64,
+ 0xC6, 0x0B, 0x0B, 0x07, 0x4B, 0x65, 0xA2, 0xF7, 0x68, 0x9E, 0xFE,
+ 0xE8, 0xE3, 0xA7, 0x09, 0x79, 0xC5, 0xDF, 0x5E, 0x9C, 0xEC}}},
+ {{{0xEE, 0x83, 0x59, 0xB5, 0x89, 0x81, 0xA2, 0x87, 0xD7, 0x75, 0x65,
+ 0x90, 0xDE, 0x78, 0x37, 0x59, 0x04, 0x9B, 0x50, 0xC3, 0xBA, 0x90,
+ 0x09, 0x15, 0xAB, 0x17, 0xC5, 0xBF, 0x5B, 0xB9, 0xE4, 0x6C},
+ {0xA9, 0xB1, 0x49, 0x76, 0x25, 0x74, 0x5D, 0x9C, 0x78, 0xC5, 0x09,
+ 0xEE, 0xEB, 0xEB, 0x9D, 0x1C, 0x6C, 0xC0, 0x27, 0x9D, 0x66, 0xE6,
+ 0x7F, 0x31, 0xCD, 0xB0, 0x8A, 0xE4, 0x9E, 0xBD, 0x70, 0x18}}},
+ {{{0x88, 0xA1, 0x08, 0x39, 0xA2, 0x48, 0xA5, 0x98, 0xB6, 0xAD, 0x10,
+ 0x54, 0x07, 0xCD, 0xFC, 0x6D, 0xB1, 0x02, 0xFF, 0xE3, 0x92, 0xD7,
+ 0x9D, 0x48, 0xFB, 0xCE, 0x88, 0x46, 0x92, 0x07, 0x02, 0xBA},
+ {0xEE, 0xEB, 0xAE, 0x88, 0xB1, 0x4E, 0xD0, 0xF2, 0xCE, 0xD7, 0x57,
+ 0x07, 0xD4, 0x39, 0xD2, 0x7D, 0x1A, 0x0C, 0xEF, 0xF2, 0x84, 0x84,
+ 0x22, 0x8A, 0xB1, 0x80, 0x0D, 0xDC, 0x64, 0x86, 0xFD, 0x70}}}}}}};
+
+const Fq12ElemStr FfElementTest::fq12_mul_ij_str = {
+ {{{{{{0x4A, 0x0E, 0x83, 0x4F, 0x62, 0xCA, 0x56, 0x0B, 0x0F, 0x2E, 0xF3,
+ 0x1A, 0xC6, 0xFC, 0x76, 0x4F, 0x4B, 0x85, 0x78, 0x6F, 0x9D, 0xB9,
+ 0xBD, 0xC8, 0xBB, 0x7C, 0x73, 0x12, 0x28, 0xFF, 0xBC, 0x8F},
+ {0x18, 0x8E, 0x5E, 0x4B, 0x72, 0xA5, 0x4A, 0x99, 0xFC, 0xE7, 0x05,
+ 0xE5, 0xD2, 0x2C, 0x06, 0x95, 0xF5, 0xE4, 0xA5, 0x87, 0xCB, 0x85,
+ 0x25, 0xF8, 0xDA, 0x71, 0x7B, 0x9A, 0xF1, 0x52, 0xF9, 0x33}}},
+ {{{0x05, 0x5F, 0x15, 0x72, 0xA3, 0x61, 0xA6, 0x6C, 0xB8, 0x43, 0xBB,
+ 0xCA, 0x33, 0xB2, 0xDB, 0x59, 0xCA, 0xAB, 0xAD, 0xA0, 0x4D, 0xE3,
+ 0xB8, 0xF5, 0xC9, 0x8C, 0x06, 0x91, 0xE5, 0xE4, 0x5A, 0xAD},
+ {0xE7, 0x66, 0xCC, 0x2B, 0x2C, 0x11, 0x88, 0x29, 0xB1, 0x3C, 0x52,
+ 0xFE, 0x50, 0xDF, 0x8F, 0x15, 0x6A, 0x6B, 0xB8, 0x32, 0x96, 0x90,
+ 0x85, 0x03, 0x78, 0x88, 0x97, 0x7B, 0x5B, 0x50, 0x2E, 0xDE}}},
+ {{{0xE7, 0x53, 0x22, 0x11, 0xEB, 0xFF, 0x1B, 0x19, 0xAE, 0x5F, 0x58,
+ 0x3A, 0x4F, 0x6F, 0x34, 0xFB, 0x2A, 0x49, 0xCA, 0x4B, 0x9C, 0x31,
+ 0xFC, 0x74, 0x0F, 0x11, 0xCC, 0x45, 0xCD, 0xA2, 0x12, 0xCA},
+ {0xF4, 0x2F, 0x30, 0x9A, 0x6A, 0xCB, 0xEE, 0x88, 0x15, 0x56, 0x29,
+ 0x2A, 0xBF, 0x33, 0x7B, 0xDB, 0x59, 0x74, 0x4D, 0xC0, 0x64, 0xF0,
+ 0x0B, 0x9F, 0xF2, 0x65, 0xB7, 0x3A, 0xDA, 0xE2, 0xB5, 0x63}}}}},
+ {{{{{0x3A, 0x3E, 0x06, 0xEF, 0x73, 0xA3, 0xBC, 0xEA, 0xCC, 0x68, 0xD9,
+ 0xF5, 0x6E, 0x94, 0x1C, 0x54, 0x47, 0xF1, 0x99, 0x2C, 0x44, 0x64,
+ 0x45, 0x84, 0x50, 0x10, 0xFD, 0xC5, 0x16, 0x65, 0x89, 0xEC},
+ {0x72, 0xA6, 0x7E, 0x82, 0x7F, 0xE2, 0xE3, 0xEA, 0x82, 0xA3, 0x18,
+ 0xF4, 0x9B, 0x93, 0x4D, 0x79, 0xA0, 0x2C, 0xBF, 0x90, 0x0E, 0xDB,
+ 0x41, 0x09, 0x27, 0x44, 0x19, 0xD1, 0xB4, 0xE5, 0xC6, 0x8C}}},
+ {{{0xA5, 0xC7, 0x82, 0xBF, 0x00, 0x7B, 0x8D, 0x7A, 0x05, 0x7B, 0x7E,
+ 0x33, 0x60, 0x28, 0x34, 0x9C, 0x86, 0x5A, 0x6B, 0xCE, 0xA5, 0xED,
+ 0x26, 0x22, 0x63, 0x4A, 0xE9, 0x57, 0xCD, 0x55, 0xD2, 0xD3},
+ {0x0E, 0x73, 0x14, 0xE4, 0xEE, 0xE7, 0x3C, 0x43, 0xFC, 0xAE, 0x84,
+ 0x59, 0x2F, 0xEA, 0x35, 0x84, 0xA5, 0x77, 0xCE, 0xA8, 0xC5, 0xAA,
+ 0xB8, 0xDC, 0xB9, 0xD6, 0x71, 0x11, 0xE2, 0x95, 0x00, 0x97}}},
+ {{{0xBD, 0x50, 0xDA, 0x58, 0x1B, 0xDA, 0xB3, 0x25, 0x19, 0x2F, 0x9D,
+ 0xFA, 0x2C, 0xFB, 0x96, 0x26, 0xBB, 0x4A, 0x41, 0x82, 0xA9, 0x45,
+ 0x24, 0xEE, 0xEE, 0xEA, 0xD3, 0xC5, 0x94, 0xFC, 0x2A, 0x37},
+ {0x6A, 0x43, 0xB8, 0x6C, 0xBB, 0x98, 0xB7, 0x17, 0x03, 0xC0, 0x3D,
+ 0x6D, 0x59, 0x56, 0x3D, 0x23, 0x42, 0x94, 0x25, 0x64, 0xB9, 0x62,
+ 0xAD, 0x4D, 0x84, 0x9B, 0x3C, 0x05, 0x8C, 0xF0, 0xD3, 0xD3}}}}}},
+};
+
+const Fq12ElemStr FfElementTest::fq12_k_str = {
+ {{{{{{0xE4, 0xCA, 0x0B, 0xA8, 0x9C, 0x70, 0xE2, 0x20, 0x24, 0xD9, 0x8F,
+ 0x09, 0x12, 0x79, 0x55, 0x44, 0x8C, 0x58, 0x42, 0x8F, 0x18, 0x97,
+ 0x0A, 0xC3, 0x0A, 0x40, 0x68, 0x0E, 0x1E, 0x21, 0x7F, 0xB4},
+ {0x73, 0xCF, 0x8D, 0x54, 0x68, 0xAE, 0x1C, 0xC4, 0x95, 0x01, 0xE3,
+ 0x52, 0x33, 0xFE, 0x69, 0xB5, 0x23, 0x45, 0xEF, 0xFF, 0x79, 0x14,
+ 0xEF, 0x98, 0xA8, 0x4E, 0xB1, 0x2E, 0xE1, 0x15, 0x81, 0x0C}}},
+ {{{0x9F, 0x65, 0x90, 0x6A, 0x53, 0xD7, 0xF6, 0x73, 0x08, 0xDA, 0x45,
+ 0x11, 0xDE, 0xCF, 0xED, 0x4C, 0x8C, 0x21, 0x02, 0xF5, 0x3F, 0x97,
+ 0xB6, 0xB2, 0xF5, 0xC6, 0x58, 0xFC, 0x9A, 0xA6, 0xBB, 0xF9},
+ {0x3C, 0xD8, 0xFC, 0x86, 0x09, 0x1C, 0x16, 0xA4, 0x6F, 0x5E, 0x7A,
+ 0x81, 0x01, 0xF9, 0x8A, 0x6D, 0x38, 0xB5, 0xC9, 0x5F, 0xE9, 0x7D,
+ 0x6F, 0x46, 0x92, 0x49, 0x5B, 0xB8, 0x61, 0x03, 0x6F, 0x5E}}},
+ {{{0xDA, 0x53, 0xCB, 0x62, 0xCD, 0x82, 0x63, 0x96, 0xC7, 0xC0, 0x39,
+ 0xA4, 0x31, 0xEE, 0x15, 0x26, 0x1C, 0xE6, 0x4E, 0xE4, 0xB4, 0x40,
+ 0xFA, 0x65, 0xA3, 0xF4, 0x73, 0x03, 0x85, 0x84, 0x41, 0xF9},
+ {0x77, 0xF3, 0x90, 0xDC, 0x88, 0x26, 0xBD, 0x27, 0x9A, 0x9D, 0x37,
+ 0xF0, 0x80, 0xEE, 0x02, 0x1D, 0x3E, 0x4F, 0x88, 0xED, 0x8F, 0x89,
+ 0x90, 0xF1, 0x6D, 0x5D, 0x70, 0x49, 0x99, 0x07, 0x61, 0x22}}}}},
+ {{{{{0x43, 0x52, 0xBA, 0xEE, 0xA8, 0xE9, 0x8E, 0x2E, 0x83, 0x30, 0x41,
+ 0x85, 0xE3, 0x51, 0xB0, 0x8C, 0x86, 0x31, 0xEC, 0x02, 0x76, 0xE8,
+ 0x41, 0x1F, 0x88, 0xBC, 0x39, 0xA2, 0xE4, 0xC1, 0x34, 0xA7},
+ {0x1D, 0x5F, 0x8C, 0x23, 0x0F, 0xF0, 0xDC, 0xCD, 0xBA, 0x67, 0xD5,
+ 0x78, 0xD6, 0x8D, 0x32, 0x6A, 0xC1, 0x7F, 0x6F, 0x97, 0xCF, 0x46,
+ 0xF0, 0x04, 0x7B, 0xE3, 0x5A, 0xEE, 0x31, 0xC4, 0xC0, 0x79}}},
+ {{{0x96, 0xBC, 0x01, 0x78, 0x9F, 0xBE, 0x8B, 0xBA, 0x59, 0x22, 0xFB,
+ 0x64, 0x1B, 0x37, 0x5C, 0x33, 0x57, 0xAF, 0x83, 0x5A, 0x96, 0xEA,
+ 0x56, 0xAA, 0x6E, 0x9C, 0xFA, 0xE6, 0xF9, 0xDF, 0xD8, 0x44},
+ {0xBB, 0x4E, 0xBF, 0xA8, 0xEC, 0x0F, 0x16, 0xA8, 0x59, 0x1F, 0x49,
+ 0xF4, 0x8C, 0x80, 0x6C, 0x52, 0x7F, 0x74, 0x94, 0xC2, 0xE3, 0x29,
+ 0x34, 0x9C, 0x97, 0xB9, 0x5E, 0xED, 0xFD, 0x59, 0x9D, 0xD4}}},
+ {{{0x83, 0xFB, 0xC2, 0xAD, 0x72, 0xE8, 0xF3, 0x68, 0x43, 0xD0, 0xD4,
+ 0xDC, 0xB2, 0x36, 0xC1, 0xDB, 0x03, 0x29, 0xEE, 0x8C, 0x1A, 0x10,
+ 0xD7, 0xFB, 0xC2, 0xEA, 0xDA, 0xBA, 0x42, 0x18, 0xE6, 0xE4},
+ {0x63, 0x41, 0x6E, 0x8C, 0xB3, 0x14, 0x68, 0x9A, 0x0F, 0x64, 0x87,
+ 0x16, 0x02, 0xA3, 0x59, 0xF4, 0x60, 0x80, 0x04, 0x2B, 0xA4, 0xE6,
+ 0x10, 0x2D, 0x61, 0x59, 0x14, 0xFE, 0xAF, 0x84, 0xA0, 0x67}}}}}}};
+const Fq12ElemStr FfElementTest::fq12_mul_gb_str = {
+ {{{{{{0xE4, 0xCA, 0x0B, 0xA8, 0x9C, 0x70, 0xE2, 0x20, 0x24, 0xD9, 0x8F,
+ 0x09, 0x12, 0x79, 0x55, 0x44, 0x8C, 0x58, 0x42, 0x8F, 0x18, 0x97,
+ 0x0A, 0xC3, 0x0A, 0x40, 0x68, 0x0E, 0x1E, 0x21, 0x7F, 0xB4},
+ {0x73, 0xCF, 0x8D, 0x54, 0x68, 0xAE, 0x1C, 0xC4, 0x95, 0x01, 0xE3,
+ 0x52, 0x33, 0xFE, 0x69, 0xB5, 0x23, 0x45, 0xEF, 0xFF, 0x79, 0x14,
+ 0xEF, 0x98, 0xA8, 0x4E, 0xB1, 0x2E, 0xE1, 0x15, 0x81, 0x0C}}},
+ {{{0x9F, 0x65, 0x90, 0x6A, 0x53, 0xD7, 0xF6, 0x73, 0x08, 0xDA, 0x45,
+ 0x11, 0xDE, 0xCF, 0xED, 0x4C, 0x8C, 0x21, 0x02, 0xF5, 0x3F, 0x97,
+ 0xB6, 0xB2, 0xF5, 0xC6, 0x58, 0xFC, 0x9A, 0xA6, 0xBB, 0xF9},
+ {0x3C, 0xD8, 0xFC, 0x86, 0x09, 0x1C, 0x16, 0xA4, 0x6F, 0x5E, 0x7A,
+ 0x81, 0x01, 0xF9, 0x8A, 0x6D, 0x38, 0xB5, 0xC9, 0x5F, 0xE9, 0x7D,
+ 0x6F, 0x46, 0x92, 0x49, 0x5B, 0xB8, 0x61, 0x03, 0x6F, 0x5E}}},
+ {{{0xDA, 0x53, 0xCB, 0x62, 0xCD, 0x82, 0x63, 0x96, 0xC7, 0xC0, 0x39,
+ 0xA4, 0x31, 0xEE, 0x15, 0x26, 0x1C, 0xE6, 0x4E, 0xE4, 0xB4, 0x40,
+ 0xFA, 0x65, 0xA3, 0xF4, 0x73, 0x03, 0x85, 0x84, 0x41, 0xF9},
+ {0x77, 0xF3, 0x90, 0xDC, 0x88, 0x26, 0xBD, 0x27, 0x9A, 0x9D, 0x37,
+ 0xF0, 0x80, 0xEE, 0x02, 0x1D, 0x3E, 0x4F, 0x88, 0xED, 0x8F, 0x89,
+ 0x90, 0xF1, 0x6D, 0x5D, 0x70, 0x49, 0x99, 0x07, 0x61, 0x22}}}}},
+ {{{{{0xBC, 0xAD, 0x45, 0x11, 0x57, 0x13, 0x62, 0x9E, 0xC3, 0xB5, 0xB0,
+ 0xD9, 0x0B, 0x1F, 0xF4, 0x12, 0x86, 0xAA, 0x79, 0xF8, 0x9B, 0xAF,
+ 0xC9, 0x63, 0x4A, 0x6C, 0xF4, 0x38, 0xCA, 0x11, 0xFB, 0x6C},
+ {0xE2, 0xA0, 0x73, 0xDC, 0xF0, 0x0C, 0x13, 0xFF, 0x8C, 0x7E, 0x1C,
+ 0xE6, 0x17, 0xE4, 0x72, 0x34, 0x4B, 0x5C, 0xF6, 0x63, 0x43, 0x51,
+ 0x1A, 0x7E, 0x57, 0x45, 0xD2, 0xED, 0x7D, 0x0E, 0x6F, 0x9A}}},
+ {{{0x69, 0x43, 0xFE, 0x87, 0x60, 0x3E, 0x65, 0x12, 0xED, 0xC2, 0xF6,
+ 0xFA, 0xD3, 0x3A, 0x48, 0x6B, 0xB5, 0x2C, 0xE2, 0xA0, 0x7B, 0xAD,
+ 0xB3, 0xD8, 0x64, 0x8C, 0x32, 0xF4, 0xB4, 0xF3, 0x57, 0xCF},
+ {0x44, 0xB1, 0x40, 0x57, 0x13, 0xED, 0xDA, 0x24, 0xED, 0xC6, 0xA8,
+ 0x6A, 0x61, 0xF1, 0x38, 0x4C, 0x8D, 0x67, 0xD1, 0x38, 0x2F, 0x6E,
+ 0xD5, 0xE6, 0x3B, 0x6F, 0xCE, 0xED, 0xB1, 0x79, 0x92, 0x3F}}},
+ {{{0x7C, 0x04, 0x3D, 0x52, 0x8D, 0x13, 0xFD, 0x65, 0x03, 0x15, 0x1D,
+ 0x82, 0x3C, 0x3A, 0xE2, 0xC4, 0x09, 0xB2, 0x77, 0x6E, 0xF8, 0x87,
+ 0x32, 0x87, 0x10, 0x3E, 0x53, 0x21, 0x6C, 0xBA, 0x49, 0x2F},
+ {0x9C, 0xBE, 0x91, 0x73, 0x4C, 0xE8, 0x88, 0x33, 0x37, 0x81, 0x6B,
+ 0x48, 0xEB, 0xCE, 0x4A, 0xAA, 0xAC, 0x5C, 0x61, 0xCF, 0x6D, 0xB1,
+ 0xFA, 0x55, 0x71, 0xD0, 0x18, 0xDC, 0xFF, 0x4E, 0x8F, 0xAC}}}}}},
+};
+
+const FqElemStr FfElementTest::fq_multi_exp_base_1[1] = {{
+ 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A,
+}};
+const BigNumStr FfElementTest::fq_multi_exp_exp_1[1] = {{
+ 0xFF, 0xFB, 0x3E, 0x5D, 0xFF, 0x9A, 0xFF, 0x02, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xF2, 0xE1, 0x85, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x81, 0xFF, 0xFD, 0xFF, 0xEB, 0xFF, 0x29, 0xA7, 0xFF,
+}};
+const FqElemStr FfElementTest::fq_multi_exp_res_1 = {
+ 0x6A, 0x21, 0xEC, 0x89, 0xCC, 0x13, 0x2F, 0x6F, 0x29, 0x1B, 0x3A,
+ 0x94, 0xF6, 0xE6, 0xA8, 0xBD, 0x98, 0x25, 0x43, 0x7A, 0xDC, 0xC1,
+ 0x20, 0xBA, 0x30, 0xD8, 0x1C, 0x8E, 0x79, 0xFC, 0xDA, 0x67,
+};
+
+const std::vector<uint8_t> FfElementTest::fq_multi_exp_exp_1_264({
+ 0x08, 0xFF, 0xFB, 0x3E, 0x5D, 0xFF, 0x9A, 0xFF, 0x02, 0x00, 0xFF,
+ 0xFF, 0xFF, 0xF2, 0xE1, 0x85, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x81, 0xFF, 0xFD, 0xFF, 0xEB, 0xFF, 0x29, 0xA7, 0xFF,
+});
+const FqElemStr FfElementTest::fq_multi_exp_res_1_264 = {
+ 0x71, 0x41, 0xa1, 0xdb, 0xd1, 0xd1, 0x50, 0xc2, 0x73, 0x07, 0xc1,
+ 0x93, 0xeb, 0xae, 0x89, 0x4c, 0x6e, 0x49, 0x74, 0xf7, 0x46, 0x23,
+ 0x75, 0xca, 0xc8, 0x67, 0x82, 0xaf, 0xcf, 0x35, 0x34, 0x1c};
+const FqElemStr FfElementTest::fq_multi_exp_res_1_256_264 = {
+ 0x10, 0x2f, 0x3a, 0xe5, 0x6e, 0x95, 0x92, 0x8f, 0x98, 0x03, 0x67,
+ 0x79, 0xec, 0x0c, 0xc9, 0x46, 0x07, 0xd9, 0xd9, 0x40, 0x46, 0x29,
+ 0x99, 0xe9, 0x23, 0xf9, 0x6b, 0x10, 0x35, 0x7c, 0xf1, 0xa3};
+
+const FqElemStr FfElementTest::fq_multi_exp_base_2[2] = {
+ {0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2,
+ 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E,
+ 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2},
+ {0xDD, 0x2B, 0xE9, 0x59, 0x24, 0xA5, 0xB3, 0xFD, 0xEB, 0xE1, 0x3C,
+ 0xC0, 0x73, 0x4E, 0x99, 0xEE, 0x36, 0xF6, 0xC0, 0x1A, 0x76, 0x01,
+ 0x0A, 0xF0, 0xCB, 0xB4, 0x71, 0x88, 0x95, 0xCB, 0x35, 0xBA}};
+const BigNumStr FfElementTest::fq_multi_exp_exp_2[2] = {
+ {0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3, 0x6B, 0x08, 0xFF,
+ 0xFF, 0x0B, 0xF3, 0xAF, 0x27, 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF,
+ 0xEB, 0xFF, 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF},
+ {0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB, 0xFF, 0xFF, 0x6B,
+ 0xD5, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C,
+ 0x7C, 0xFF, 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}};
+const FqElemStr FfElementTest::fq_multi_exp_res_2 = {
+ 0x8A, 0xF7, 0x96, 0x53, 0x9C, 0xC3, 0x57, 0x89, 0x50, 0xE3, 0xAB,
+ 0x12, 0x62, 0xEA, 0x0C, 0xE4, 0x65, 0xA6, 0x91, 0x09, 0x93, 0x81,
+ 0xFC, 0xBB, 0x0E, 0xFA, 0xC1, 0xC4, 0xDC, 0x3F, 0x0A, 0xD1,
+};
+
+const FqElemStr FfElementTest::fq_multi_exp_base_3[3] = {
+ {0x24, 0x9D, 0xDD, 0x1A, 0xC0, 0x07, 0x1F, 0x65, 0xDF, 0xBB, 0xC7,
+ 0x39, 0x99, 0x44, 0x63, 0x8E, 0x7E, 0xB2, 0x85, 0x82, 0xC6, 0x4E,
+ 0x2D, 0x39, 0xA8, 0x3F, 0x12, 0xB4, 0xE9, 0x9D, 0x67, 0x28},
+ {0x6B, 0x51, 0x6B, 0x33, 0x0B, 0x2E, 0x2A, 0x94, 0x34, 0xCC, 0x7E,
+ 0x97, 0xFA, 0x85, 0x51, 0x44, 0x30, 0xE5, 0xF2, 0x68, 0x23, 0x31,
+ 0x84, 0xFF, 0xBB, 0x95, 0x9A, 0xB2, 0x80, 0x95, 0xC4, 0x91},
+ {0x77, 0xED, 0xA2, 0x53, 0xA3, 0xBF, 0x6C, 0x58, 0x16, 0x7D, 0xEF,
+ 0x8A, 0x7D, 0x38, 0x65, 0x3F, 0x92, 0xA6, 0x85, 0xD7, 0x9F, 0x80,
+ 0xA4, 0xA1, 0x70, 0x02, 0xE5, 0x66, 0xF2, 0xD8, 0xD7, 0xD2}};
+const BigNumStr FfElementTest::fq_multi_exp_exp_3[3] = {
+ {0xFF, 0xFF, 0xFF, 0xB4, 0x48, 0xFF, 0xFF, 0xFF, 0xA3, 0xFF, 0xE3,
+ 0xFF, 0x61, 0xFF, 0xA2, 0x97, 0x9A, 0xFF, 0x6F, 0x04, 0xC6, 0xB9,
+ 0xFF, 0x22, 0xFF, 0x20, 0x9E, 0xFF, 0x43, 0xFF, 0xFF, 0xFF},
+ {0xB1, 0x19, 0xBF, 0xFF, 0x74, 0x7F, 0xCC, 0x34, 0x1E, 0x30, 0x7D,
+ 0xC5, 0xC4, 0xFF, 0xE7, 0xF8, 0xFF, 0x5F, 0xFF, 0x73, 0xFF, 0x58,
+ 0xFF, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xFF, 0xFF},
+ {0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x26, 0xA8, 0xFF, 0xFF,
+ 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0xE0, 0x4F, 0xFF, 0xE3, 0xFF, 0xFF,
+ 0xEB, 0x04, 0x4B, 0xFF, 0x5D, 0x55, 0xFF, 0x2D, 0xFF, 0xFF}};
+const FqElemStr FfElementTest::fq_multi_exp_res_3 = {
+ 0x04, 0x22, 0x21, 0xE7, 0x9F, 0xE3, 0x07, 0x2F, 0xA4, 0xBB, 0x56,
+ 0x84, 0xD5, 0x93, 0x4A, 0xDA, 0x5B, 0x89, 0x07, 0xBE, 0xC5, 0x5F,
+ 0xE6, 0x5C, 0x18, 0xF0, 0xF8, 0x8E, 0x8E, 0x00, 0xB9, 0x87,
+};
+const FqElemStr FfElementTest::fq_multi_exp_base_4[4] = {
+ {0x81, 0xEE, 0x78, 0x31, 0x4C, 0xC0, 0x3C, 0xDD, 0x16, 0x52, 0xC6,
+ 0x7E, 0x07, 0x4C, 0xFE, 0xC4, 0x50, 0x63, 0x5A, 0x40, 0xC8, 0xDF,
+ 0x94, 0x23, 0x1A, 0x90, 0xDD, 0x24, 0x61, 0x23, 0xDD, 0x87},
+ {0x76, 0xBB, 0x2C, 0x1C, 0xB3, 0x78, 0x93, 0x7E, 0x10, 0x29, 0xC3,
+ 0xEC, 0xBD, 0xA3, 0x75, 0x3A, 0xF1, 0x0B, 0xE1, 0xCA, 0xEE, 0x02,
+ 0x58, 0x74, 0xC7, 0xDC, 0xB8, 0x4F, 0x3F, 0x7B, 0xA2, 0xFC},
+ {0x3A, 0xD3, 0x04, 0xAA, 0x9D, 0x2A, 0xDE, 0x86, 0x56, 0x84, 0x80,
+ 0x42, 0xA5, 0x68, 0xD8, 0x6E, 0x65, 0xC4, 0x08, 0x07, 0x87, 0x4B,
+ 0xC1, 0x92, 0xCB, 0x68, 0x52, 0x6C, 0x5A, 0x4F, 0x7C, 0xFB},
+ {0x56, 0xE7, 0xBD, 0x59, 0x54, 0xCC, 0x20, 0x16, 0xAE, 0x36, 0xD1,
+ 0xB0, 0xE4, 0x82, 0x47, 0x27, 0x32, 0xD1, 0x38, 0x7C, 0x53, 0x7F,
+ 0xDD, 0xF4, 0xDE, 0xFA, 0xF7, 0x0F, 0xDD, 0xDF, 0x48, 0xA9}};
+const BigNumStr FfElementTest::fq_multi_exp_exp_4[4] = {
+ {0xFF, 0xA5, 0xC3, 0xFF, 0xFF, 0x09, 0x18, 0x18, 0x95, 0x40, 0xFF,
+ 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0xFF, 0x25, 0xFF, 0xFF,
+ 0x42, 0x07, 0xB5, 0xFF, 0x26, 0xE0, 0x4F, 0xB5, 0xB4, 0xFF},
+ {0x1F, 0xFF, 0xAA, 0xF1, 0xFF, 0xFF, 0x7E, 0xFF, 0xFF, 0xFF, 0x07,
+ 0xFF, 0xE7, 0xDF, 0xFF, 0xEE, 0xFF, 0x57, 0xFF, 0xFF, 0xFF, 0xB8,
+ 0xB3, 0x9C, 0xFF, 0x8A, 0x89, 0xFF, 0xFE, 0x32, 0xFF, 0xC1},
+ {0x9A, 0xFF, 0xFF, 0x9B, 0xFF, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x36, 0xF0, 0xC5, 0xAE, 0x87, 0x41, 0xFF, 0x5C, 0xDD,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x59, 0xC9, 0xFF, 0x44, 0x5C, 0x58},
+ {0x00, 0xFF, 0x95, 0xFF, 0x21, 0xFF, 0xFF, 0x1D, 0x1A, 0x06, 0xD3,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x31, 0xFF,
+ 0xFF, 0x1F, 0x61, 0x48, 0xFF, 0xFF, 0xFF, 0x17, 0xC9, 0x79}};
+const FqElemStr FfElementTest::fq_multi_exp_res_4 = {
+ 0x26, 0x2C, 0x23, 0x55, 0xD5, 0xBD, 0x7B, 0x67, 0x60, 0xFE, 0x06,
+ 0x7B, 0xCC, 0xB8, 0x6B, 0xC9, 0x00, 0x81, 0xAE, 0xCB, 0xEC, 0x91,
+ 0x6D, 0x1B, 0x9E, 0x1C, 0xD8, 0xC0, 0x8D, 0x3F, 0x1B, 0x20,
+};
+const Fq12ElemStr FfElementTest::fq12_multi_exp_base_4[4] = {
+ {
+ {{{{{{0x2C, 0x86, 0xEE, 0x80, 0x61, 0x45, 0x8F, 0xFD, 0x96, 0xC2, 0x81,
+ 0x11, 0xE8, 0x96, 0xE2, 0xCA, 0x21, 0x78, 0xF7, 0xA3, 0x4B, 0xBA,
+ 0xDC, 0x0D, 0x34, 0x8A, 0x56, 0x12, 0x67, 0x8D, 0x72, 0x37},
+ {0xA8, 0xEB, 0x5F, 0x1A, 0x1B, 0xF0, 0x5C, 0xC6, 0x6F, 0xC2, 0xC5,
+ 0x03, 0xC4, 0x19, 0x85, 0xA6, 0xE0, 0x64, 0xFE, 0x71, 0x51, 0x46,
+ 0xDF, 0xC2, 0xD6, 0xF9, 0xA0, 0xD6, 0x84, 0xC1, 0x4A, 0x11}}},
+ {{{0xE0, 0x33, 0xA3, 0x1C, 0x73, 0x71, 0x62, 0x17, 0x10, 0x4C, 0xD8,
+ 0x3E, 0xEE, 0xA1, 0x38, 0x9F, 0xA5, 0xFB, 0x1D, 0xC4, 0x9D, 0x2F,
+ 0x08, 0x4A, 0xD3, 0x61, 0x37, 0x79, 0xAB, 0xC1, 0x37, 0x7E},
+ {0x90, 0xFD, 0xA3, 0x9D, 0x0C, 0x81, 0x52, 0xF4, 0x58, 0x24, 0x89,
+ 0xC4, 0xF4, 0xD4, 0x82, 0x33, 0xCA, 0x5D, 0xB4, 0x58, 0xA6, 0x1E,
+ 0xE6, 0x2B, 0x86, 0xEF, 0x56, 0xC4, 0x4F, 0x9B, 0x27, 0x3C}}},
+ {{{0x96, 0x54, 0xDA, 0xB5, 0x32, 0x23, 0x8A, 0x93, 0xCC, 0xA5, 0x7D,
+ 0x28, 0x4A, 0x97, 0xA4, 0x30, 0xA8, 0x11, 0xBC, 0x43, 0x22, 0x7F,
+ 0x02, 0x73, 0x0E, 0x5C, 0x63, 0x52, 0x2F, 0x4B, 0x5F, 0x7D},
+ {0xC3, 0x1E, 0x30, 0xAE, 0xAC, 0x8C, 0xE8, 0x93, 0xD6, 0xCE, 0x05,
+ 0x4B, 0x6B, 0x21, 0x01, 0x14, 0x4A, 0x1D, 0xD9, 0x08, 0x0C, 0xA1,
+ 0x4C, 0x0B, 0x44, 0x28, 0x9C, 0xB6, 0xD1, 0x96, 0xBD, 0x07}}}}},
+ {{{{{0x8B, 0x3D, 0x77, 0x4E, 0xBD, 0x7B, 0x9F, 0x65, 0x20, 0xDB, 0xA0,
+ 0x95, 0x25, 0x44, 0x44, 0x7A, 0xE3, 0xDC, 0xDD, 0x2F, 0xBA, 0x75,
+ 0x16, 0x19, 0xCB, 0x90, 0x31, 0x79, 0x38, 0xB6, 0x1A, 0x82},
+ {0xBC, 0xB6, 0x85, 0xCD, 0xEB, 0xB9, 0x13, 0x43, 0xEA, 0xC2, 0x78,
+ 0xBE, 0x25, 0x97, 0x1C, 0x6E, 0x18, 0x55, 0xFD, 0xCB, 0xE6, 0x7E,
+ 0x1E, 0x92, 0xAD, 0x48, 0xE7, 0xA7, 0x02, 0x87, 0x0B, 0x8F}}},
+ {{{0x16, 0xD7, 0x8E, 0x95, 0x8E, 0x62, 0x0A, 0xAD, 0x20, 0x2D, 0x6A,
+ 0x2B, 0x4E, 0x6F, 0xC1, 0xC2, 0x63, 0xBA, 0x82, 0xF3, 0x8C, 0xD0,
+ 0xA2, 0x09, 0xD3, 0xE5, 0xBA, 0x1F, 0x65, 0x35, 0xD0, 0x1C},
+ {0x09, 0x98, 0x47, 0x65, 0xF2, 0x90, 0xD4, 0xE2, 0xD0, 0x6F, 0x9E,
+ 0xDB, 0xA2, 0x14, 0x9B, 0x4B, 0x3D, 0xAA, 0x75, 0x25, 0x67, 0xF4,
+ 0x7D, 0x77, 0xE9, 0x24, 0xED, 0xEE, 0x1B, 0x07, 0x7F, 0xE0}}},
+ {{{0x7A, 0x34, 0xB7, 0x3C, 0x36, 0x0D, 0xCE, 0xF9, 0xBF, 0xF9, 0xE5,
+ 0x09, 0x86, 0xEB, 0xB9, 0xD8, 0xC4, 0x67, 0xC5, 0xCD, 0xD4, 0xBC,
+ 0xEE, 0x45, 0xF7, 0x11, 0x68, 0xD9, 0x23, 0x6D, 0xD6, 0x24},
+ {0x6E, 0x97, 0x83, 0x13, 0x76, 0x9F, 0x35, 0xEA, 0xB8, 0x47, 0x57,
+ 0x9B, 0x74, 0x47, 0x1F, 0x19, 0xE7, 0x97, 0x74, 0x1B, 0xB1, 0xA0,
+ 0xF3, 0x92, 0xDC, 0x35, 0xFD, 0x7F, 0x4F, 0x07, 0x22, 0xAC}}}}}},
+ },
+ {{{{{{{0xFD, 0x05, 0x41, 0x27, 0x00, 0x7A, 0xAD, 0x17, 0xBC, 0xBF, 0x22,
+ 0x5E, 0xDA, 0xEB, 0x7D, 0xAA, 0xB5, 0x2D, 0xC8, 0x61, 0xFE, 0x2C,
+ 0xBA, 0x9E, 0x54, 0x43, 0x94, 0xDC, 0xFD, 0x0E, 0x6D, 0x6D},
+ {0xA1, 0x5E, 0x05, 0xA5, 0x05, 0x55, 0xE7, 0x2A, 0xF7, 0x53, 0x37,
+ 0x2C, 0xEF, 0x44, 0x95, 0xCA, 0x2C, 0xE8, 0xEB, 0xAE, 0x61, 0x05,
+ 0x33, 0xE7, 0x0F, 0x30, 0x67, 0xBE, 0xCD, 0xB2, 0x93, 0x44}}},
+ {{{0x44, 0x31, 0x96, 0x4D, 0x72, 0x61, 0xCD, 0x23, 0x1F, 0x7B, 0x57,
+ 0x33, 0x39, 0xAC, 0x57, 0x53, 0x3D, 0x70, 0x57, 0xB3, 0x6D, 0xD5,
+ 0x8A, 0x89, 0x30, 0xBC, 0xED, 0x29, 0x19, 0x39, 0x6E, 0x6A},
+ {0x80, 0x21, 0x1E, 0xB7, 0x84, 0xB1, 0x0A, 0xA4, 0xD0, 0xFF, 0x59,
+ 0x31, 0xE9, 0xBA, 0x39, 0xF7, 0x81, 0xDF, 0x1B, 0x7B, 0xD9, 0xDB,
+ 0x02, 0x17, 0xBE, 0x97, 0x63, 0xBD, 0x37, 0x14, 0xB8, 0x8B}}},
+ {{{0x6C, 0xCC, 0x5B, 0xA3, 0xEE, 0xC8, 0x0B, 0x7B, 0xF5, 0xDE, 0xBC,
+ 0xB7, 0xA8, 0x25, 0x35, 0xAE, 0x0B, 0x30, 0x96, 0x33, 0x52, 0x13,
+ 0xA3, 0x89, 0x3A, 0x2E, 0xA4, 0x7E, 0x5F, 0x4E, 0xB1, 0xF7},
+ {0x87, 0xBA, 0x08, 0xB0, 0xFB, 0xCB, 0x31, 0xA6, 0x2B, 0x3E, 0xE7,
+ 0xC4, 0xCC, 0xA5, 0x14, 0x61, 0xC9, 0x18, 0xFC, 0x74, 0x59, 0x06,
+ 0xF4, 0xAD, 0xFC, 0x2D, 0x0C, 0x7D, 0xDB, 0x2A, 0xEC, 0xD4}}}}},
+ {{{{{0xE9, 0x31, 0x31, 0x50, 0x25, 0xB7, 0x0C, 0x48, 0x30, 0xD5, 0x78,
+ 0xB1, 0x10, 0xEA, 0x5D, 0xAA, 0xAA, 0x03, 0xEC, 0xE3, 0x0F, 0x36,
+ 0xA6, 0xBC, 0x18, 0x3A, 0x76, 0x87, 0xA3, 0xE9, 0x33, 0xDA},
+ {0x48, 0x78, 0x93, 0x64, 0x72, 0x9B, 0x2A, 0x1E, 0x0D, 0x50, 0x9F,
+ 0x6F, 0xBD, 0xA5, 0x18, 0xB1, 0xA8, 0x14, 0x9A, 0x1B, 0xB9, 0xB4,
+ 0x2C, 0x1F, 0x46, 0xB8, 0x9B, 0x7A, 0xC7, 0x84, 0xAE, 0x27}}},
+ {{{0xD1, 0xEC, 0x1C, 0xEC, 0x69, 0xF0, 0x35, 0x40, 0x77, 0x7E, 0x27,
+ 0x22, 0x36, 0x38, 0xDF, 0x15, 0xC2, 0xB3, 0xB8, 0x63, 0x4A, 0x6E,
+ 0x68, 0x8C, 0xC1, 0x39, 0x3C, 0x02, 0x4C, 0x2A, 0x31, 0x18},
+ {0x2E, 0x35, 0xF5, 0xCA, 0xA2, 0xE9, 0x24, 0x92, 0xD5, 0xE5, 0x2E,
+ 0x5D, 0x1C, 0x94, 0xD9, 0xC7, 0xF0, 0x22, 0x16, 0x20, 0xA8, 0x37,
+ 0xDD, 0x0E, 0xAB, 0x1B, 0x5E, 0x8B, 0xEE, 0x81, 0xC6, 0x17}}},
+ {{{0xF1, 0x29, 0x5D, 0x1D, 0x6F, 0x53, 0x5A, 0xB2, 0x20, 0x88, 0x3D,
+ 0xA4, 0x98, 0x81, 0xA4, 0xEF, 0x11, 0x1B, 0x64, 0x9E, 0x2C, 0x95,
+ 0xDD, 0xD7, 0x57, 0xB3, 0x95, 0xCA, 0x40, 0xB9, 0x0D, 0x62},
+ {0xDC, 0x86, 0x8B, 0xE6, 0xD3, 0x7B, 0x33, 0xEA, 0x50, 0x25, 0xE2,
+ 0x77, 0xE3, 0x0B, 0x5A, 0xC8, 0x81, 0xFC, 0xAE, 0x74, 0x38, 0x69,
+ 0x07, 0xF8, 0x4E, 0xD7, 0x85, 0xA6, 0x2F, 0x13, 0xB7, 0x0A}}}}}}},
+ {{{{{{{0xF4, 0xDC, 0xAC, 0x02, 0xC0, 0x95, 0x07, 0xDC, 0x12, 0x4F, 0x3A,
+ 0x01, 0xA9, 0xEE, 0xF3, 0x07, 0x46, 0x94, 0x47, 0x15, 0x63, 0xA6,
+ 0x8E, 0x0A, 0xC4, 0xC4, 0xE4, 0x23, 0x85, 0x63, 0xE4, 0x4E},
+ {0x9A, 0x9E, 0x9F, 0xC1, 0xED, 0x4E, 0x94, 0x10, 0xFE, 0x7D, 0x90,
+ 0xEF, 0x82, 0x21, 0xAC, 0x67, 0x24, 0x99, 0x86, 0xC6, 0x85, 0x8B,
+ 0x19, 0x9A, 0x9B, 0x90, 0x0B, 0xA4, 0x90, 0x78, 0x34, 0x53}}},
+ {{{0xB1, 0x4C, 0xBA, 0xB8, 0xC6, 0x40, 0x71, 0xC2, 0x17, 0x51, 0x05,
+ 0xC2, 0xC9, 0xBC, 0x03, 0x10, 0x4E, 0xFE, 0x2F, 0x94, 0xED, 0x13,
+ 0x35, 0x7B, 0x20, 0xA6, 0x59, 0x44, 0x81, 0xD0, 0xEC, 0x12},
+ {0x74, 0xA2, 0x4A, 0xFB, 0xD7, 0x28, 0x70, 0xAD, 0xDE, 0x86, 0x2F,
+ 0xEF, 0xF9, 0x50, 0x5D, 0x1E, 0x46, 0x3B, 0x82, 0x1C, 0x6A, 0xC9,
+ 0x3F, 0x32, 0xAE, 0xCD, 0x93, 0x2C, 0xA5, 0x70, 0x45, 0x24}}},
+ {{{0x38, 0x19, 0x79, 0xBF, 0x35, 0xF5, 0xC1, 0x53, 0x06, 0x42, 0xAA,
+ 0x6B, 0xF3, 0xB7, 0x8F, 0xFB, 0xFC, 0x28, 0x46, 0x9A, 0x65, 0x2A,
+ 0x45, 0x3D, 0x4C, 0x3C, 0x6B, 0x9C, 0x44, 0xC5, 0x82, 0xB8},
+ {0x80, 0xF9, 0xB3, 0x44, 0x95, 0x17, 0x39, 0x01, 0x6B, 0xD6, 0x1D,
+ 0x73, 0x22, 0x94, 0xFF, 0x6F, 0x7B, 0x4E, 0xB6, 0xA4, 0xE4, 0x6C,
+ 0xA8, 0xDB, 0x38, 0x74, 0x0B, 0xDB, 0xFA, 0x14, 0x99, 0x39}}}}},
+ {{{{{0x28, 0xEE, 0xFC, 0x62, 0xE5, 0x33, 0x9C, 0x63, 0xD5, 0x7F, 0x2C,
+ 0x4C, 0xF4, 0x76, 0x4C, 0xF7, 0x7B, 0x27, 0x2C, 0xA9, 0xB9, 0x01,
+ 0x3C, 0x58, 0xF7, 0xCE, 0xAA, 0x0A, 0x21, 0xC0, 0xA3, 0xA7},
+ {0xA1, 0x85, 0xBC, 0xFE, 0x55, 0xFC, 0x3B, 0x9B, 0x3D, 0xEF, 0x14,
+ 0x85, 0x8A, 0x4E, 0x5E, 0x1F, 0x4F, 0xC9, 0x86, 0xB8, 0xF2, 0xB2,
+ 0xE3, 0xE7, 0x7E, 0x87, 0xE2, 0x20, 0xD7, 0x85, 0x2C, 0xD1}}},
+ {{{0x13, 0xCB, 0x46, 0xAD, 0xD7, 0xEC, 0x66, 0xD5, 0x2B, 0x6E, 0x87,
+ 0x92, 0x13, 0xB2, 0x7D, 0x18, 0x69, 0x35, 0xCB, 0xF1, 0xBE, 0xC2,
+ 0x9D, 0xEB, 0xF5, 0x00, 0x0B, 0x73, 0xA3, 0xFD, 0x51, 0xDC},
+ {0x91, 0x0E, 0xE4, 0x46, 0x41, 0x23, 0xDD, 0x85, 0x53, 0x0C, 0xAE,
+ 0xF9, 0x74, 0xCF, 0x1C, 0x32, 0x22, 0xDA, 0x4A, 0x14, 0x80, 0x71,
+ 0x51, 0x23, 0xC3, 0xAB, 0x7E, 0xEC, 0x77, 0xCC, 0x59, 0x12}}},
+ {{{0x1C, 0x0F, 0x65, 0x6B, 0xD8, 0x41, 0xE0, 0x1B, 0x51, 0x9C, 0x89,
+ 0x26, 0xAB, 0x88, 0x63, 0x5D, 0xBB, 0x95, 0x92, 0x5B, 0x2C, 0x1D,
+ 0xDE, 0xC1, 0x88, 0xD6, 0xF1, 0x02, 0x48, 0xE0, 0xE2, 0xD1},
+ {0x40, 0x7F, 0xF1, 0x23, 0x4A, 0xCF, 0x36, 0xD5, 0xCF, 0x76, 0x0D,
+ 0x00, 0x2A, 0xF7, 0x5F, 0x31, 0xBB, 0xCC, 0x46, 0x84, 0x07, 0x04,
+ 0x98, 0x9C, 0xB4, 0x31, 0x15, 0x2D, 0x91, 0xF6, 0x29, 0x33}}}}}}},
+ {{{{{{{0xA8, 0x8E, 0x9A, 0xF9, 0x25, 0x12, 0x98, 0xE2, 0xC3, 0x61, 0x2E,
+ 0xE8, 0xD6, 0xA6, 0x77, 0x16, 0x49, 0x04, 0x75, 0x69, 0xD1, 0x83,
+ 0x2D, 0x3F, 0x2A, 0x79, 0xB6, 0x9B, 0xC9, 0x1D, 0x03, 0x90},
+ {0x2A, 0xD8, 0x11, 0x9F, 0x26, 0x36, 0xE7, 0xE9, 0x3A, 0x05, 0x4C,
+ 0x15, 0x49, 0x93, 0xDA, 0xE9, 0xD0, 0x5A, 0xE4, 0x8D, 0x8A, 0xFA,
+ 0x04, 0xF1, 0x20, 0x84, 0x56, 0xEC, 0x3C, 0x27, 0x19, 0x5C}}},
+ {{{0xF1, 0xAF, 0xBF, 0xF6, 0x0E, 0x58, 0x84, 0x2D, 0x94, 0x11, 0xF4,
+ 0xB5, 0xF4, 0x14, 0x51, 0xB0, 0x90, 0x46, 0x1A, 0x81, 0xED, 0xCF,
+ 0x91, 0x66, 0x58, 0xA6, 0x36, 0x3A, 0x52, 0x18, 0x5A, 0xC1},
+ {0x08, 0x4C, 0x99, 0xD3, 0xDC, 0xCE, 0x7F, 0xCE, 0x78, 0xE0, 0x38,
+ 0x87, 0x32, 0xF1, 0x80, 0x3C, 0x7B, 0x67, 0xAA, 0x6F, 0xDD, 0xE0,
+ 0xFC, 0xCB, 0xD0, 0xB0, 0x3A, 0x59, 0x52, 0x2A, 0x84, 0xE4}}},
+ {{{0xF8, 0x4A, 0xFF, 0x50, 0xA0, 0x65, 0xC4, 0xEE, 0xF4, 0x9C, 0xAA,
+ 0x34, 0x46, 0xF9, 0xD2, 0x6C, 0xA1, 0x61, 0x71, 0x49, 0x32, 0x25,
+ 0x84, 0x54, 0x90, 0x44, 0xBE, 0xA4, 0x0B, 0xF7, 0xFE, 0x26},
+ {0x81, 0x63, 0x73, 0xF7, 0x2F, 0xF2, 0xFA, 0x24, 0x52, 0xA4, 0xD9,
+ 0x4C, 0xC1, 0xA7, 0xA5, 0xC3, 0x03, 0x36, 0x13, 0x9B, 0x16, 0x45,
+ 0x16, 0xCB, 0x4B, 0x99, 0x38, 0xF3, 0x6D, 0xC8, 0x7E, 0xAB}}}}},
+ {{{{{0xB3, 0x53, 0xDF, 0xB6, 0x82, 0x60, 0x12, 0x11, 0x36, 0x69, 0x0E,
+ 0x05, 0x31, 0x8E, 0xCF, 0xD7, 0x3F, 0x32, 0xE7, 0x95, 0x84, 0x1D,
+ 0xC8, 0xB5, 0xBE, 0x49, 0x17, 0x9D, 0xCF, 0xA9, 0x5A, 0x2A},
+ {0xC4, 0x11, 0x86, 0xE8, 0x6C, 0x02, 0x56, 0xB0, 0x25, 0x2F, 0xA0,
+ 0x06, 0xB3, 0x62, 0xB2, 0x11, 0xAF, 0xBE, 0xA4, 0xE8, 0x61, 0x64,
+ 0x85, 0xFB, 0xEB, 0x1C, 0xF1, 0xBC, 0x2C, 0xAE, 0x10, 0x51}}},
+ {{{0x16, 0xA6, 0xC0, 0xB3, 0x86, 0x8E, 0x6D, 0x79, 0xB6, 0xBD, 0xDE,
+ 0x1E, 0x26, 0x06, 0x46, 0x65, 0x82, 0x84, 0x5A, 0x97, 0xD3, 0xB7,
+ 0x93, 0x78, 0x6B, 0x9D, 0x14, 0x33, 0x94, 0x43, 0x34, 0x04},
+ {0x45, 0xD1, 0x47, 0xD4, 0x2F, 0x17, 0xCF, 0xF1, 0xDD, 0xEA, 0x11,
+ 0x52, 0xAE, 0x01, 0x88, 0x3A, 0x10, 0xEE, 0x5C, 0x16, 0xCD, 0xB5,
+ 0x48, 0xE9, 0x16, 0x2C, 0x70, 0xB4, 0x1E, 0x19, 0x38, 0xE0}}},
+ {{{0x18, 0xE9, 0xAE, 0xC5, 0xDA, 0x74, 0x41, 0x2D, 0x70, 0x07, 0x60,
+ 0x37, 0x27, 0x66, 0xF7, 0x00, 0xBB, 0x79, 0x51, 0xF3, 0x7C, 0x8A,
+ 0x2B, 0xB5, 0x69, 0x6E, 0x10, 0x1F, 0xE0, 0x0A, 0x5E, 0xBE},
+ {0xB4, 0x4E, 0x0E, 0x02, 0x59, 0xB5, 0xCB, 0x4A, 0x6A, 0x86, 0x8B,
+ 0xCC, 0xA2, 0x13, 0xA0, 0xE9, 0xF2, 0x5C, 0xB0, 0x23, 0xB2, 0x15,
+ 0xF9, 0xBB, 0x43, 0xC1, 0x54, 0xF4, 0xC8, 0xAB, 0x16, 0xA6}}}}}}},
+};
+const BigNumStr FfElementTest::fq12_multi_exp_exp_4[4] = {
+ {
+ 0x14, 0x92, 0xD1, 0x1F, 0xAC, 0x90, 0x4D, 0xC3, 0x3E, 0xB8, 0xA7,
+ 0xFE, 0x35, 0x98, 0xDA, 0x94, 0xD6, 0xF3, 0x27, 0x29, 0x4B, 0x70,
+ 0xCF, 0x0F, 0xDA, 0x14, 0x97, 0xA1, 0x9B, 0x6B, 0x24, 0x08,
+ },
+ {
+ 0x76, 0x8D, 0xE5, 0xC2, 0xAB, 0x78, 0xD9, 0x76, 0x98, 0xFF, 0x92,
+ 0xEA, 0x95, 0x58, 0xC5, 0x0C, 0x6F, 0x1B, 0x35, 0xC4, 0xBF, 0x4A,
+ 0x9E, 0xC2, 0x6A, 0xEC, 0xE2, 0xF6, 0xAF, 0xEB, 0xAC, 0x06,
+ },
+ {
+ 0x50, 0x38, 0x60, 0x31, 0xAB, 0x05, 0xCC, 0xB1, 0xC2, 0x06, 0xA0,
+ 0xD7, 0x92, 0x12, 0xBD, 0x17, 0x81, 0xB9, 0x7E, 0x07, 0x9B, 0xD4,
+ 0x3B, 0x2D, 0x3C, 0x15, 0x3A, 0x5A, 0xF1, 0xC0, 0xC4, 0x75,
+ },
+ {
+ 0xA1, 0x3F, 0xEA, 0x99, 0x7E, 0xC7, 0x65, 0xF5, 0x41, 0xA6, 0xD6,
+ 0xD3, 0x77, 0xEC, 0x27, 0xF8, 0x6C, 0x18, 0x28, 0x69, 0x97, 0x08,
+ 0x0E, 0x63, 0x5A, 0xDA, 0xFE, 0x9F, 0xD1, 0x4A, 0x61, 0x4F,
+ },
+};
+const Fq12ElemStr FfElementTest::fq12_multi_exp_res_4 = {
+ {{{{{{0x3A, 0x30, 0x33, 0xA2, 0x14, 0xDF, 0xDC, 0x70, 0x48, 0xF3, 0xBA,
+ 0x3F, 0xCE, 0xFC, 0x69, 0x24, 0xAE, 0xA1, 0xF3, 0xCF, 0xD8, 0x77,
+ 0x69, 0x38, 0x38, 0xF4, 0x8E, 0xFB, 0x51, 0xFB, 0x10, 0x7C},
+ {0x73, 0xB4, 0xEE, 0xF9, 0x76, 0xBB, 0x45, 0xEC, 0x07, 0x24, 0x23,
+ 0xA3, 0x38, 0x64, 0x39, 0x4C, 0x03, 0x94, 0xF5, 0xEE, 0x5F, 0xC9,
+ 0x83, 0x4F, 0xD1, 0xA6, 0x4A, 0x05, 0x25, 0x0C, 0x46, 0x33}}},
+ {{{0xD4, 0x40, 0x47, 0xAE, 0xEC, 0xDA, 0x30, 0xF9, 0xE1, 0x28, 0xFB,
+ 0xB1, 0x4C, 0x62, 0xFB, 0x6C, 0x90, 0x0D, 0xB1, 0xEC, 0xAF, 0x2D,
+ 0x95, 0x64, 0x11, 0x93, 0xDA, 0x8E, 0xB8, 0x7D, 0xE4, 0xA3},
+ {0x8E, 0xA6, 0x9B, 0xAA, 0x58, 0xD5, 0xDC, 0x59, 0x1A, 0x51, 0x53,
+ 0x47, 0x30, 0x1C, 0x2B, 0xB0, 0xBB, 0x57, 0x57, 0x0A, 0x8C, 0x5F,
+ 0x62, 0x9C, 0x52, 0x28, 0xC0, 0x25, 0x27, 0xAE, 0xCD, 0x36}}},
+ {{{0xBF, 0x2D, 0x03, 0xB1, 0x33, 0xFD, 0x24, 0x81, 0x3C, 0x91, 0x43,
+ 0x90, 0x0C, 0x20, 0xC4, 0xE3, 0x69, 0x3F, 0xA9, 0xA2, 0x7C, 0xC2,
+ 0x48, 0x28, 0x1B, 0xF0, 0x81, 0x1F, 0x2B, 0x8F, 0x8D, 0x43},
+ {0x38, 0x18, 0x12, 0xA3, 0x89, 0xF1, 0xD7, 0x60, 0x89, 0x68, 0x6A,
+ 0xC4, 0xCC, 0x5D, 0xF4, 0xCE, 0x43, 0x95, 0x84, 0xCD, 0x01, 0x55,
+ 0xB8, 0x5D, 0x24, 0x50, 0xCD, 0xE3, 0x68, 0x1C, 0xFF, 0x59}}}}},
+ {{{{{0x0D, 0xAC, 0xCB, 0xE7, 0x9D, 0x68, 0x0F, 0x4A, 0xAF, 0xEB, 0xB5,
+ 0xFB, 0xF9, 0xB1, 0x58, 0x80, 0xD5, 0x71, 0x53, 0x26, 0x2E, 0x9C,
+ 0xCE, 0x10, 0xAC, 0xD2, 0x0A, 0xEB, 0xB4, 0x5C, 0xC8, 0xD7},
+ {0x16, 0x26, 0x66, 0x71, 0xDD, 0x67, 0xBA, 0xDB, 0x35, 0x76, 0x64,
+ 0xC6, 0x0B, 0x0B, 0x07, 0x4B, 0x65, 0xA2, 0xF7, 0x68, 0x9E, 0xFE,
+ 0xE8, 0xE3, 0xA7, 0x09, 0x79, 0xC5, 0xDF, 0x5E, 0x9C, 0xEC}}},
+ {{{0xEE, 0x83, 0x59, 0xB5, 0x89, 0x81, 0xA2, 0x87, 0xD7, 0x75, 0x65,
+ 0x90, 0xDE, 0x78, 0x37, 0x59, 0x04, 0x9B, 0x50, 0xC3, 0xBA, 0x90,
+ 0x09, 0x15, 0xAB, 0x17, 0xC5, 0xBF, 0x5B, 0xB9, 0xE4, 0x6C},
+ {0xA9, 0xB1, 0x49, 0x76, 0x25, 0x74, 0x5D, 0x9C, 0x78, 0xC5, 0x09,
+ 0xEE, 0xEB, 0xEB, 0x9D, 0x1C, 0x6C, 0xC0, 0x27, 0x9D, 0x66, 0xE6,
+ 0x7F, 0x31, 0xCD, 0xB0, 0x8A, 0xE4, 0x9E, 0xBD, 0x70, 0x18}}},
+ {{{0x88, 0xA1, 0x08, 0x39, 0xA2, 0x48, 0xA5, 0x98, 0xB6, 0xAD, 0x10,
+ 0x54, 0x07, 0xCD, 0xFC, 0x6D, 0xB1, 0x02, 0xFF, 0xE3, 0x92, 0xD7,
+ 0x9D, 0x48, 0xFB, 0xCE, 0x88, 0x46, 0x92, 0x07, 0x02, 0xBA},
+ {0xEE, 0xEB, 0xAE, 0x88, 0xB1, 0x4E, 0xD0, 0xF2, 0xCE, 0xD7, 0x57,
+ 0x07, 0xD4, 0x39, 0xD2, 0x7D, 0x1A, 0x0C, 0xEF, 0xF2, 0x84, 0x84,
+ 0x22, 0x8A, 0xB1, 0x80, 0x0D, 0xDC, 0x64, 0x86, 0xFD, 0x70}}}}}}};
+const FqElemStr FfElementTest::fq_multi_exp_base_5[5] = {
+ {0x7B, 0x26, 0x96, 0x84, 0x04, 0x0D, 0x6F, 0x10, 0xAA, 0x7F, 0xD0,
+ 0x0C, 0x41, 0x3A, 0x68, 0x48, 0xBF, 0x3D, 0xB5, 0xCE, 0x3A, 0x9C,
+ 0xA9, 0x10, 0xA4, 0x67, 0x7C, 0xC0, 0x41, 0x52, 0xCA, 0xE7},
+ {0x2E, 0xD9, 0xEF, 0x86, 0xB6, 0x32, 0x72, 0x89, 0x37, 0xCF, 0x16,
+ 0xCE, 0x27, 0x15, 0x7A, 0x95, 0xCF, 0x94, 0x1B, 0xF3, 0xCE, 0x49,
+ 0x20, 0x29, 0x9A, 0x61, 0x2E, 0x0A, 0xF5, 0xE1, 0xDC, 0x9F},
+ {0xE0, 0x19, 0x37, 0x44, 0xA7, 0x45, 0x49, 0x7E, 0x19, 0x02, 0x09,
+ 0x78, 0xBE, 0xA4, 0x65, 0x60, 0x7A, 0xF5, 0xC8, 0xAF, 0x97, 0x5E,
+ 0xDA, 0x3A, 0xB4, 0x16, 0x70, 0x31, 0xE3, 0xB4, 0x18, 0xA8},
+ {0xBC, 0x92, 0x29, 0x92, 0x14, 0xD3, 0x3F, 0xB8, 0xB8, 0x8C, 0x41,
+ 0xDF, 0xC5, 0xA1, 0xCA, 0x77, 0xE5, 0x73, 0xFE, 0xA7, 0xAC, 0x81,
+ 0x66, 0x11, 0x5A, 0x6D, 0x7D, 0x97, 0x13, 0x92, 0x8D, 0x1D},
+ {0xE1, 0xA0, 0x0D, 0xDC, 0x8F, 0x20, 0xF5, 0x2D, 0x1D, 0x1F, 0xBD,
+ 0x24, 0x8C, 0xC2, 0x26, 0x06, 0x89, 0xE9, 0x46, 0xA9, 0xD2, 0x44,
+ 0x8F, 0x1A, 0x8D, 0xAF, 0x20, 0x73, 0x60, 0x0B, 0x66, 0x9C}};
+
+const BigNumStr FfElementTest::fq_multi_exp_exp_5[5] = {
+ {0x78, 0xE6, 0x3F, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7,
+ 0x6E, 0xE9, 0xFF, 0x4F, 0xFF, 0x23, 0xFF, 0x67, 0xB4, 0xED, 0xEE,
+ 0xD7, 0xC6, 0xFF, 0x4B, 0x0B, 0x6F, 0x1F, 0xD6, 0xFD, 0x7F},
+ {0xA1, 0x87, 0xFF, 0x1B, 0xFF, 0x85, 0x68, 0xFF, 0x1C, 0xFF, 0xD5,
+ 0xFF, 0x95, 0x73, 0xFF, 0xFF, 0xFF, 0x9E, 0x7E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x5E, 0x9E, 0x62, 0xFF, 0xFF, 0x97, 0xFF, 0xFF, 0xF3},
+ {0x2E, 0xE8, 0x1E, 0x35, 0xFF, 0x82, 0x0B, 0x99, 0xEC, 0x30, 0x2B,
+ 0xCE, 0xEC, 0x83, 0x05, 0xFF, 0x9E, 0x3C, 0xFF, 0xFF, 0xA1, 0xFF,
+ 0xFF, 0xFF, 0x57, 0x26, 0x5B, 0x6C, 0xFF, 0xE6, 0x94, 0xFF},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xFF, 0xFF, 0x79, 0xFC, 0xFF, 0x83,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xFF, 0x2F, 0x6B, 0xD1, 0xE7,
+ 0xFF, 0xFF, 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0x63, 0x53, 0x53, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0x09,
+ 0xFF, 0xC0, 0xD8, 0x17, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x45, 0xFF, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x06}};
+
+const FqElemStr FfElementTest::fq_multi_exp_res_5 = {
+ 0x8F, 0x6D, 0x54, 0xCA, 0x00, 0x85, 0xD8, 0x78, 0xA4, 0x45, 0x36,
+ 0x7C, 0x23, 0xD0, 0x3C, 0x2D, 0x20, 0x78, 0xD9, 0xD7, 0xF1, 0xC3,
+ 0x99, 0xD9, 0xD3, 0x0A, 0x0E, 0x86, 0x98, 0xC2, 0xA7, 0x97,
+};
+const FqElemStr FfElementTest::fq_multi_exp_base_6[6] = {
+ {0x75, 0x18, 0x6A, 0x3D, 0xCC, 0x76, 0x33, 0x92, 0xD0, 0x57, 0xDA,
+ 0xE0, 0x37, 0x6F, 0x71, 0xD5, 0x9E, 0x7E, 0x65, 0xED, 0xD7, 0xFD,
+ 0x82, 0xC0, 0x6C, 0x83, 0x60, 0x30, 0xC1, 0xD3, 0x3D, 0x4D},
+ {0xF5, 0x3A, 0x20, 0xAB, 0x22, 0x47, 0x07, 0xAE, 0x71, 0xC1, 0x91,
+ 0x73, 0xEF, 0x1F, 0x1D, 0x76, 0x2E, 0xEE, 0x0D, 0xDE, 0xD9, 0xF8,
+ 0x5C, 0x85, 0xC7, 0x5B, 0x93, 0x88, 0xF6, 0xFF, 0x4C, 0xA5},
+ {0x21, 0xB3, 0x5E, 0xE8, 0xD2, 0xDA, 0x14, 0x1C, 0xB5, 0x2C, 0xFC,
+ 0x61, 0x9D, 0xEB, 0x65, 0x87, 0xBB, 0x5B, 0xBC, 0xFD, 0x37, 0x54,
+ 0x6B, 0xDC, 0xD9, 0xFA, 0x7A, 0xCD, 0x18, 0x7E, 0x8B, 0x89},
+ {0x70, 0xB7, 0x19, 0x42, 0xB4, 0x41, 0x2C, 0x1B, 0xBD, 0x7B, 0x25,
+ 0x06, 0xA2, 0x95, 0xB5, 0xB6, 0x70, 0xDF, 0x58, 0x71, 0xCA, 0x09,
+ 0x12, 0x66, 0x5A, 0x7B, 0xF0, 0x5F, 0x43, 0x69, 0x32, 0xF6},
+ {0x3D, 0x57, 0xE8, 0x3F, 0x1E, 0x39, 0x2B, 0xE5, 0xD0, 0xCF, 0xA9,
+ 0xC8, 0x72, 0x10, 0x7F, 0xC5, 0x4F, 0xAE, 0xE9, 0x73, 0x28, 0x4C,
+ 0xFC, 0x3F, 0xD5, 0xFF, 0xE8, 0xCF, 0x2C, 0xEB, 0x33, 0xD3},
+ {0x51, 0x80, 0x15, 0x1C, 0xE6, 0x9C, 0x4B, 0x80, 0x40, 0xBA, 0x40,
+ 0x29, 0x3A, 0x86, 0xA8, 0xB2, 0x66, 0x08, 0x97, 0x8D, 0xEB, 0x8B,
+ 0xA7, 0x93, 0xE3, 0x49, 0xC6, 0xC0, 0x46, 0x93, 0xC1, 0x75}};
+const BigNumStr FfElementTest::fq_multi_exp_exp_6[6] = {
+ {0xFF, 0xFF, 0xFF, 0x49, 0x50, 0xFF, 0x19, 0xFF, 0xEB, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x28, 0x4A, 0x0E, 0xFF, 0x74, 0xFF, 0xC7, 0xFF, 0xD9,
+ 0x81, 0xFF, 0xFF, 0xFF, 0xD5, 0x2C, 0xFF, 0xFF, 0xFF, 0xAE},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x0C, 0x03, 0xFF, 0x95, 0xFF, 0x11, 0x9D, 0xFF, 0x9B,
+ 0xFF, 0xFF, 0x68, 0x44, 0xFF, 0xC9, 0xFF, 0x10, 0xC7, 0xBF},
+ {0x64, 0xFF, 0x89, 0x4A, 0xFF, 0x20, 0xFF, 0xE7, 0xFF, 0x36, 0x23,
+ 0xDD, 0xFF, 0xFF, 0xFC, 0xFF, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0x48,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xD3, 0x59, 0xBE},
+ {0x0F, 0xFF, 0x76, 0xA5, 0x9E, 0x02, 0x9B, 0xFF, 0xA1, 0xFF, 0xC2,
+ 0xFF, 0x9D, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0x81, 0x2A,
+ 0xFF, 0x98, 0xFF, 0xFF, 0xB9, 0xFF, 0xB7, 0x78, 0xE6, 0xFF},
+ {0xAF, 0xF3, 0xFF, 0x3C, 0xA8, 0xFF, 0xB9, 0x3A, 0xFF, 0xFF, 0xFF,
+ 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0xFF,
+ 0xFF, 0x52, 0xFF, 0x41, 0x10, 0x62, 0xFF, 0x51, 0x35, 0xFF},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xC3, 0xD9, 0xFF, 0xFF, 0x3A, 0x44,
+ 0x88, 0x04, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x64, 0xFF, 0xFF, 0x52,
+ 0xFF, 0x7D, 0x6B, 0x24, 0x6E, 0xFF, 0xFF, 0xFF, 0xA7, 0x71}};
+const FqElemStr FfElementTest::fq_multi_exp_res_6 = {
+ 0xFB, 0x89, 0x4F, 0xBB, 0x91, 0xEE, 0xD6, 0x57, 0x2D, 0x34, 0xF9,
+ 0x0B, 0xE3, 0xEB, 0x71, 0x1D, 0x63, 0x74, 0x96, 0x3B, 0xD4, 0x02,
+ 0x2F, 0x08, 0xDB, 0x95, 0x6A, 0x40, 0x68, 0xD4, 0x55, 0x76,
+};
+
+const Fq6ElemStr FfElementTest::epid11_GT_multi_exp_base_3[3] = {
+ {0x02, 0x7C, 0xAC, 0xE1, 0x58, 0x08, 0x6A, 0x83, 0x50, 0xD8, 0xBA, 0xBA,
+ 0x4B, 0x60, 0x6C, 0xEB, 0x51, 0xCE, 0x7E, 0x6D, 0x8E, 0xA8, 0x56, 0x41,
+ 0x33, 0xF3, 0xB0, 0xA6, 0xFC, 0xCD, 0xC8, 0x41, 0x05, 0x9E, 0xCC, 0x4F,
+ 0x51, 0x77, 0xD9, 0xEC, 0x57, 0x34, 0x48, 0x47, 0x22, 0x7A, 0x7C, 0xA1,
+ 0x14, 0xB8, 0x2A, 0xC9, 0x16, 0x0A, 0xB4, 0xB3, 0x5D, 0x44, 0x28, 0x23,
+ 0x80, 0x7A, 0x3E, 0xDA, 0x02, 0x6D, 0x03, 0x47, 0xCD, 0x2A, 0xAB, 0xA4,
+ 0xCE, 0x63, 0x0B, 0x5E, 0x3A, 0xF2, 0x96, 0x86, 0xA9, 0x9F, 0x2A, 0x9A,
+ 0xFF, 0x8F, 0x94, 0x91, 0xC8, 0x3C, 0xF2, 0x5A, 0xAA, 0xDA, 0x6B, 0x8E,
+ 0x02, 0xFC, 0x42, 0x4B, 0xFE, 0xF3, 0x23, 0x0A, 0xF8, 0x1A, 0x5C, 0x9A,
+ 0x5C, 0x0D, 0x71, 0xEF, 0x85, 0x64, 0xA6, 0x4D, 0x6A, 0x8B, 0x82, 0x58,
+ 0x2E, 0xBC, 0xFB, 0xB9, 0xDF, 0xB8, 0xCE, 0x3D, 0x03, 0xF3, 0x07, 0x18,
+ 0x4A, 0x13, 0x82, 0x8A, 0xEA, 0x24, 0x57, 0x72, 0xE2, 0x33, 0x9D, 0xB3,
+ 0x0C, 0x57, 0xCF, 0xAB, 0xDD, 0xEE, 0xF8, 0xD7, 0x2A, 0x75, 0xF5, 0xD7,
+ 0x28, 0xED, 0x0F, 0xB7, 0x02, 0xEC, 0x5F, 0xED, 0x50, 0xAE, 0x6B, 0xF3,
+ 0x80, 0x29, 0x7B, 0xA2, 0x75, 0x61, 0xFD, 0x20, 0x01, 0x2B, 0xDF, 0x8B,
+ 0x3C, 0x2A, 0xB9, 0x1D, 0x92, 0xED, 0x0F, 0xAD, 0x73, 0x74, 0x1E, 0xD8},
+ {0x06, 0xA6, 0x4A, 0x6B, 0x89, 0xD0, 0x07, 0x2A, 0xE6, 0x0B, 0x56, 0xD3,
+ 0x48, 0x17, 0xF6, 0x99, 0x31, 0x41, 0x21, 0x99, 0x51, 0xF6, 0xB1, 0x6C,
+ 0x02, 0xCD, 0x11, 0xE7, 0xCC, 0xD3, 0xC5, 0x6C, 0x06, 0xF4, 0x39, 0x62,
+ 0x37, 0x88, 0x37, 0xAD, 0x1F, 0x36, 0x81, 0xFA, 0xD7, 0x4B, 0x9F, 0x57,
+ 0x0F, 0x5B, 0xC3, 0x53, 0x14, 0x53, 0x41, 0x3A, 0x2B, 0xAB, 0x6E, 0xF4,
+ 0xD8, 0x7F, 0xC5, 0x67, 0x08, 0x70, 0xD7, 0x9B, 0x59, 0xE1, 0xE0, 0x57,
+ 0xE2, 0xF4, 0x04, 0x82, 0x06, 0x6A, 0xD5, 0xA2, 0x76, 0x64, 0x41, 0x7F,
+ 0x3B, 0xE6, 0x33, 0xB9, 0x39, 0x68, 0xDA, 0x0D, 0x13, 0x03, 0x63, 0xC8,
+ 0x07, 0x94, 0x70, 0xF9, 0xFB, 0xD8, 0x99, 0x31, 0xA1, 0x53, 0x1C, 0x20,
+ 0x43, 0x12, 0xEB, 0xFF, 0xA4, 0x5D, 0x64, 0x7C, 0x24, 0x9E, 0xE0, 0x03,
+ 0x80, 0x8E, 0xFB, 0xDC, 0xEE, 0xFD, 0x1F, 0xEF, 0x03, 0x43, 0x07, 0x44,
+ 0xEF, 0xB3, 0x71, 0x39, 0x77, 0x61, 0x5C, 0xA9, 0x32, 0x54, 0x33, 0x98,
+ 0xA2, 0x14, 0x6A, 0x13, 0x53, 0x22, 0x94, 0xA2, 0xCE, 0x15, 0xE7, 0xD0,
+ 0x30, 0xF2, 0x6B, 0x07, 0x02, 0x56, 0x28, 0xC3, 0xB1, 0x39, 0xF9, 0xC7,
+ 0xDA, 0xE2, 0xFD, 0xD0, 0xA8, 0x1B, 0xE8, 0xB2, 0xE3, 0x75, 0x02, 0xB8,
+ 0x90, 0xA4, 0xA5, 0x8F, 0x23, 0xA1, 0xCD, 0x75, 0xE7, 0x51, 0x37, 0xE5},
+ {0x09, 0x27, 0x38, 0x30, 0x06, 0x44, 0x13, 0xEF, 0xFE, 0x70, 0x5C, 0x4A,
+ 0x21, 0xFF, 0xF8, 0xF5, 0xBB, 0xC9, 0x6E, 0xA8, 0x7E, 0x00, 0xB1, 0xD7,
+ 0x5E, 0x55, 0xCF, 0xC7, 0x34, 0x6B, 0x8D, 0xD5, 0x04, 0xCE, 0x6E, 0xCA,
+ 0x11, 0x5A, 0xB3, 0x0C, 0x33, 0x79, 0x5F, 0xDE, 0xD9, 0xDB, 0x8C, 0xFA,
+ 0x73, 0x4E, 0x1E, 0xFA, 0xA1, 0x21, 0x6D, 0xA3, 0x6D, 0xE8, 0x69, 0x02,
+ 0x9E, 0xCC, 0x4D, 0x14, 0x09, 0xB5, 0x7C, 0xBA, 0x98, 0xC2, 0xE3, 0xAA,
+ 0x82, 0x6A, 0x0F, 0x1E, 0x4C, 0x6C, 0x9E, 0xB8, 0xB6, 0xA3, 0x5D, 0x06,
+ 0xFE, 0x99, 0x5C, 0x62, 0xA9, 0x19, 0x4E, 0x84, 0x61, 0xC7, 0xF9, 0x78,
+ 0x04, 0x39, 0xDA, 0xB4, 0x79, 0x32, 0x63, 0x60, 0xA6, 0x69, 0x86, 0x5C,
+ 0xFF, 0xB0, 0x71, 0xD0, 0xF5, 0x5E, 0x3C, 0xB2, 0x5D, 0x81, 0x4F, 0x9F,
+ 0xE4, 0xF7, 0x3B, 0xC7, 0xC5, 0x80, 0x5E, 0x8E, 0x01, 0x23, 0xFA, 0xFC,
+ 0x09, 0xAE, 0x12, 0x55, 0xF2, 0xD0, 0x50, 0x5C, 0xED, 0xC6, 0xD6, 0x81,
+ 0x9A, 0xA7, 0x93, 0xA3, 0xF4, 0xAC, 0xE5, 0x3E, 0xDB, 0x5A, 0x05, 0xB7,
+ 0x0B, 0x80, 0xAD, 0xA9, 0x08, 0xF1, 0x5A, 0xB5, 0x09, 0x23, 0x52, 0x65,
+ 0x46, 0x64, 0x79, 0xF2, 0x47, 0x04, 0x72, 0x48, 0x4E, 0x01, 0x55, 0x4A,
+ 0x67, 0x8D, 0x1E, 0x07, 0xC7, 0x46, 0x87, 0xF6, 0x50, 0xC3, 0xA6, 0x6B}};
+
+const std::vector<uint8_t> FfElementTest::epid11_GT_multi_exp_exp_3[3] = {
+ {0x00, 0x00, 0xAF, 0x5B, 0x22, 0x71, 0x98, 0xB6, 0xEB, 0x67, 0x3D,
+ 0x94, 0x4A, 0xB6, 0x5E, 0x99, 0x81, 0xC5, 0x96, 0x91, 0x55, 0xBA,
+ 0x2F, 0x16, 0x01, 0x4E, 0xE1, 0x25, 0xAD, 0xCA, 0x94, 0x88, 0x60,
+ 0x3B, 0xA2, 0x56, 0x0A, 0x94, 0x0B, 0x2C, 0x3E, 0xD0, 0x8F, 0x15,
+ 0x07, 0x3D, 0xD5, 0xBE, 0x72, 0x3E, 0x2D, 0x06, 0x74, 0xFF, 0x06,
+ 0xED, 0x47, 0x28, 0x08, 0x0C, 0xA0, 0x6F, 0xDB, 0x75, 0x55, 0x32,
+ 0xDC, 0x97, 0x47, 0x60, 0x4E, 0x6F, 0xB4, 0x29, 0x89, 0x0C},
+
+ {0x00, 0x00, 0x01, 0xB8, 0x40, 0xBB, 0xE1, 0x1C, 0x84, 0x8E, 0x02,
+ 0xC0, 0xEF, 0x69, 0x84, 0x90, 0xED, 0xEB, 0x99, 0x94, 0xBC, 0x79,
+ 0x48, 0xC8, 0x08, 0x3C, 0x25, 0xDA, 0xAC, 0xFF, 0x3A, 0xDD},
+
+ {0x00, 0x00, 0x37, 0x1E, 0xCD, 0x0F, 0x66, 0x09, 0x7D, 0x33, 0x9A,
+ 0xDC, 0x47, 0x28, 0xF7, 0x91, 0xF3, 0xC2, 0xBC, 0x3A, 0xA9, 0x05,
+ 0x62, 0xFC, 0xDD, 0x8C, 0x65, 0xC2, 0xA8, 0x14, 0x55, 0x52},
+};
+
+const Fq6ElemStr FfElementTest::epid11_GT_multi_exp_res_3 = {
+ 0x09, 0xCF, 0x1D, 0xB6, 0x97, 0x14, 0x58, 0xAA, 0x29, 0x7E, 0x03, 0x96,
+ 0xD2, 0xDC, 0xD4, 0x2C, 0x1F, 0x2F, 0xB0, 0xC1, 0x5E, 0x71, 0xFB, 0x0C,
+ 0x8D, 0xDB, 0xBD, 0x1D, 0x20, 0xD9, 0x9A, 0xA5, 0x02, 0x69, 0x62, 0x1C,
+ 0x5C, 0xE8, 0x12, 0x11, 0xB1, 0x49, 0x93, 0x29, 0x23, 0xAF, 0xB4, 0xFF,
+ 0x77, 0x1E, 0xC9, 0xA6, 0xA0, 0x6D, 0xD9, 0x38, 0x89, 0x1A, 0xC7, 0xB9,
+ 0xF9, 0x66, 0x25, 0xD3, 0x00, 0x59, 0xE1, 0xAC, 0x0D, 0xDE, 0xCF, 0xC0,
+ 0xCF, 0x50, 0x48, 0x6B, 0xCE, 0x32, 0x15, 0x79, 0x13, 0x71, 0x12, 0x9B,
+ 0x63, 0x09, 0x4D, 0x20, 0xD9, 0x4A, 0xCD, 0x4F, 0x00, 0x7F, 0x8A, 0x19,
+ 0x06, 0x3F, 0x0F, 0x3E, 0x83, 0xA3, 0xEE, 0x0F, 0xAB, 0x72, 0xC9, 0x9A,
+ 0x5D, 0xD1, 0x67, 0xBF, 0xF1, 0x0E, 0xAB, 0x9C, 0xE8, 0x50, 0x04, 0xA7,
+ 0x20, 0xAA, 0xF6, 0xB9, 0x8E, 0x2F, 0x69, 0x44, 0x02, 0x68, 0x7A, 0x2E,
+ 0x70, 0xD4, 0x7E, 0x83, 0x8F, 0xAB, 0x58, 0x3E, 0xD2, 0x95, 0xA0, 0x1A,
+ 0x61, 0xC8, 0x93, 0xA0, 0xCC, 0xA4, 0x90, 0xFB, 0x73, 0xC2, 0xD2, 0x91,
+ 0x70, 0x34, 0x6A, 0x67, 0x03, 0x67, 0x49, 0x84, 0xEE, 0x3B, 0x9E, 0x8B,
+ 0x6D, 0x47, 0x95, 0xBD, 0x0E, 0x47, 0x97, 0x9E, 0x0A, 0x87, 0x61, 0x83,
+ 0x80, 0xEF, 0x4F, 0x91, 0xA8, 0xA6, 0xB7, 0xC0, 0x44, 0xE2, 0x21, 0x8D};
+
+////////////////////////////////////////////////
+// NewFfElement
+
+TEST_F(FfElementTest, NewFailsGivenNullPointer) {
+ FfElement* ff_elem = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewFfElement(nullptr, &ff_elem));
+ EXPECT_EQ(kEpidBadArgErr, NewFfElement(this->fq, nullptr));
+ DeleteFfElement(&ff_elem);
+}
+
+TEST_F(FfElementTest, NewSucceedsGiven256BitFiniteField) {
+ FfElement* ff_elem = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewFfElement(this->fq, &ff_elem));
+ DeleteFfElement(&ff_elem);
+}
+
+TEST_F(FfElementTest, Default256BitElementIsZero) {
+ FfElement* ff_elem = nullptr;
+ THROW_ON_EPIDERR(NewFfElement(this->fq, &ff_elem));
+ FqElemStr ff_elem_str;
+ EpidStatus sts =
+ WriteFfElement(this->fq, ff_elem, &ff_elem_str, sizeof(ff_elem_str));
+ DeleteFfElement(&ff_elem);
+ THROW_ON_EPIDERR(sts);
+
+ FqElemStr fq_zero_str = {0};
+ EXPECT_EQ(fq_zero_str, ff_elem_str);
+}
+
+////////////////////////////////////////////////
+// DeleteFfElement
+
+TEST_F(FfElementTest, DeleteNullsPointer) {
+ FfElement* ff_elem = nullptr;
+ EpidStatus sts = NewFfElement(this->fq, &ff_elem);
+ DeleteFfElement(&ff_elem);
+ THROW_ON_EPIDERR(sts);
+ EXPECT_EQ(nullptr, ff_elem);
+}
+
+TEST_F(FfElementTest, DeleteWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeleteFfElement(nullptr));
+ FfElement* ff_elem = nullptr;
+ EXPECT_NO_THROW(DeleteFfElement(&ff_elem));
+}
+
+////////////////////////////////////////////////
+// ReadFfElement
+
+TEST_F(FfElementTest, ReadFailsGivenArgumentsMismatch) {
+ uint8_t buf[sizeof(Fq12ElemStr)] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq12, buf, sizeof(Fq12ElemStr), this->fq_a));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq, buf, sizeof(FqElemStr), this->fq12_result));
+}
+
+TEST_F(FfElementTest, ReadFailsGivenNullPointer) {
+ FqElemStr ff_elem_str;
+ EXPECT_EQ(kEpidBadArgErr, ReadFfElement(nullptr, &ff_elem_str,
+ sizeof(ff_elem_str), this->fq_a));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq, nullptr, sizeof(ff_elem_str), this->fq_a));
+ EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &ff_elem_str,
+ sizeof(ff_elem_str), nullptr));
+}
+
+TEST_F(FfElementTest, ReadFailsGivenInvalidBufferSize) {
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq, &this->fq_qm1_str, 0, this->fq_a));
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq, &this->fq_qm1_str,
+ std::numeric_limits<size_t>::max(), this->fq_a));
+}
+
+TEST_F(FfElementTest, ReadFailsGivenElementDoesNotBelongToFF) {
+ // q does not belong to Fq
+ EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &this->bn_q_str,
+ sizeof(this->bn_q_str), this->fq_a));
+}
+
+TEST_F(FfElementTest, Read256BitElementCorrectly) {
+ // q-1 is valid element of Fq
+ ASSERT_EQ(kEpidNoErr, ReadFfElement(this->fq, &this->fq_qm1_str,
+ sizeof(this->fq_qm1_str), this->fq_a));
+
+ FqElemStr buf;
+ EXPECT_EQ(kEpidNoErr,
+ WriteFfElement(this->fq, this->fq_a, &buf, sizeof(buf)));
+ EXPECT_EQ(this->fq_qm1_str, buf);
+}
+
+TEST_F(FfElementTest, ReadIgnoreLeadingZerosForPrimeField) {
+ // q-1 is valid element of Fq
+ std::vector<uint8_t> ff_elem_str = {
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5,
+ 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12,
+ 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12};
+ ASSERT_EQ(kEpidNoErr, ReadFfElement(this->fq, ff_elem_str.data(),
+ ff_elem_str.size(), this->fq_a));
+
+ FqElemStr buf;
+ EXPECT_EQ(kEpidNoErr,
+ WriteFfElement(this->fq, this->fq_a, &buf, sizeof(buf)));
+ EXPECT_EQ(this->fq_qm1_str, buf);
+}
+
+TEST_F(FfElementTest, ReadExpectExactSizeForFieldExtensions) {
+ uint8_t buf[sizeof(Fq2ElemStr) + 1] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ ReadFfElement(this->fq2, buf, sizeof(buf), this->fq2_a));
+}
+
+///////////////////////////////////////////////////////////////////////
+// InitFfElementFromBn
+
+TEST_F(FfElementTest, InitFromBnFailsGivenNonPrimeField) {
+ BigNumStr str = {0x01};
+ FfElementObj ffe(&this->fq2);
+ BigNumObj bn(sizeof(str), str);
+ EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq2, bn, ffe));
+}
+
+TEST_F(FfElementTest, InitFromBnFailsGivenNullPointer) {
+ BigNumStr str = {0x01};
+ FfElementObj ffe(&this->fq);
+ BigNumObj bn(sizeof(str), str);
+ EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(nullptr, bn, ffe));
+ EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq, nullptr, ffe));
+ EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq, bn, nullptr));
+}
+
+TEST_F(FfElementTest, InitFromBnInFieldElementCorrectly) {
+ FfElementObj ffe(&this->fq);
+ BigNumObj qm1_bn(this->bn_qm1_str);
+ FqElemStr buf;
+
+ EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, qm1_bn, ffe));
+ EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf)));
+ EXPECT_EQ(this->fq_qm1_str, buf);
+}
+
+TEST_F(FfElementTest, InitFromBnOutOfFieldElementCorrectly) {
+ FfElementObj ffe(&this->fq);
+ BigNumObj q_bn(this->bn_q_str);
+ BigNumObj qp1_bn(this->bn_qp1_str);
+ FqElemStr buf;
+
+ EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, q_bn, ffe));
+ EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf)));
+ EXPECT_EQ(this->bn_0_str, buf);
+
+ EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, qp1_bn, ffe));
+ EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf)));
+ EXPECT_EQ(this->bn_1_str, buf);
+}
+
+///////////////////////////////////////////////////////////////////////
+// FfIsEqual
+
+TEST_F(FfElementTest, FfIsEqualFailsGivenArgumentsMismatch) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr,
+ FfIsEqual(this->fq12, this->fq_a, this->fq_b, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfIsEqual(this->fq, this->fq12_g, this->fq_b, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfIsEqual(this->fq, this->fq_a, this->fq12_h, &result));
+}
+
+TEST_F(FfElementTest, FfIsEqualFailsGivenNullPointer) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr,
+ FfIsEqual(nullptr, this->fq_a, this->fq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, nullptr, this->fq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, this->fq_a, nullptr, &result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfIsEqual(this->fq, this->fq_a, this->fq_a, nullptr));
+}
+
+TEST_F(FfElementTest, FfIsEqualCanCompareElementWithItself) {
+ bool result;
+ EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, this->fq_a, &result));
+ EXPECT_TRUE(result);
+}
+
+TEST_F(FfElementTest, Different256BitFiniteFieldElementsAreNotEqual) {
+ bool result;
+ EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, this->fq_b, &result));
+ EXPECT_FALSE(result);
+}
+
+TEST_F(FfElementTest, Same256BitFiniteFieldElementsAreEqual) {
+ FfElementObj fq_a_local(&this->fq, &this->fq_a_str, sizeof(this->fq_a_str));
+ bool result;
+ EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, fq_a_local, &result));
+ EXPECT_TRUE(result);
+}
+
+TEST_F(FfElementTest, DifferentFq12ElementsAreNotEqual) {
+ bool result;
+ EXPECT_EQ(kEpidNoErr,
+ FfIsEqual(this->fq12, this->fq12_g, this->fq12_h, &result));
+ EXPECT_FALSE(result);
+}
+
+TEST_F(FfElementTest, SameFq12ElementsAreEqual) {
+ FfElementObj fq12_g_local(&this->fq12, &this->fq12_g_str,
+ sizeof(this->fq12_g_str));
+ bool result;
+ EXPECT_EQ(kEpidNoErr,
+ FfIsEqual(this->fq12, this->fq12_g, fq12_g_local, &result));
+ EXPECT_TRUE(result);
+}
+
+////////////////////////////////////////////////
+// WriteFfElement
+
+TEST_F(FfElementTest, WriteFailsGivenArgumentsMismatch) {
+ uint8_t buf[sizeof(Fq12ElemStr)] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteFfElement(this->fq12, this->fq_a, buf, sizeof(Fq12ElemStr)));
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteFfElement(this->fq, this->fq12_g, buf, sizeof(Fq12ElemStr)));
+}
+
+TEST_F(FfElementTest, WriteFailsGivenNullPointer) {
+ FqElemStr ff_elem_str;
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(nullptr, this->fq_a, &ff_elem_str,
+ sizeof(ff_elem_str)));
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, nullptr, &ff_elem_str,
+ sizeof(ff_elem_str)));
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteFfElement(this->fq, this->fq_a, nullptr, sizeof(ff_elem_str)));
+}
+
+TEST_F(FfElementTest, WriteFailsGivenInvalidBufferSize) {
+ FqElemStr ff_elem_str;
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteFfElement(this->fq, this->fq_a, &ff_elem_str, 0));
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str,
+ sizeof(ff_elem_str) - 1));
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str,
+ std::numeric_limits<size_t>::max()));
+}
+
+TEST_F(FfElementTest, WriteWorksGiven256BitElement) {
+ FqElemStr ff_elem_str;
+ EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str,
+ sizeof(ff_elem_str)));
+ EXPECT_EQ(this->fq_a_str, ff_elem_str);
+}
+
+TEST_F(FfElementTest, WritePadPrimeFieldElement) {
+ FqElemStr ff_elem_str[2] = {0xcd};
+ EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str[0],
+ sizeof(ff_elem_str)));
+ EXPECT_EQ(this->fq_0_str, ff_elem_str[0]);
+ EXPECT_EQ(this->fq_a_str, ff_elem_str[1]);
+}
+
+TEST_F(FfElementTest, WriteExpectExactSizeForFieldExtensions) {
+ uint8_t buf[sizeof(Fq12ElemStr) + 1] = {0};
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq12_g, buf,
+ sizeof(Fq12ElemStr) + 1));
+ EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq12_g, buf,
+ sizeof(Fq12ElemStr) - 1));
+ EXPECT_EQ(kEpidBadArgErr,
+ WriteFfElement(this->fq12, this->fq12_g, buf, sizeof(FqElemStr)));
+}
+
+///////////////////////////////////////////////////////////////////////
+// FfNeg
+
+TEST_F(FfElementTest, FfNegFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq12, this->fq_a, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq12_g, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq_a, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfNegFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(nullptr, this->fq_a, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq_a, nullptr));
+}
+
+TEST_F(FfElementTest, FfNegSucceedsGivenElementZero) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfNeg(this->fq, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str)
+ << "FfNeg: Negate element does not match to reference neg zero value";
+}
+
+TEST_F(FfElementTest, FfNegSucceedsGivenNonZeroElement) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfNeg(this->fq, this->fq_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_neg_a_str, fq_r_str)
+ << "FfNeg: Negate element does not match to reference neg value";
+}
+
+////////////////////////////////////////////////
+// FfIsZero
+
+TEST_F(FfElementTest, FfIsZeroFailsGivenNullPointer) {
+ bool result = false;
+ EXPECT_EQ(kEpidBadArgErr, FfIsZero(nullptr, this->fq_0, &result));
+ EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, nullptr, &result));
+ EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, this->fq_0, nullptr));
+}
+
+TEST_F(FfElementTest, FfIsZeroFailsGivenArgumentsMismatch) {
+ bool result;
+ EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq12, this->fq_a, &result));
+ EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, this->fq12_g, &result));
+}
+
+TEST_F(FfElementTest, FfIsZeroSucceedsGivenZeroElement) {
+ bool result = false;
+ EXPECT_EQ(kEpidNoErr, FfIsZero(this->fq, this->fq_0, &result));
+ EXPECT_TRUE(result);
+}
+
+TEST_F(FfElementTest, FfIsZeroSucceedsGivenNonZeroElement) {
+ bool result = false;
+ EXPECT_EQ(kEpidNoErr, FfIsZero(this->fq, this->fq_1, &result));
+ EXPECT_FALSE(result);
+}
+
+////////////////////////////////////////////////
+// FfMul
+
+TEST_F(FfElementTest, FfMulFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(nullptr, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq, nullptr, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq, this->fq_a, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq_a, this->fq_b, nullptr));
+}
+
+TEST_F(FfElementTest, FfMulFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq12, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq, this->fq12_g, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq, this->fq_a, this->fq12_h, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq, this->fq_a, this->fq_b, this->fq12_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMul(this->fq2, this->fq_a, this->fq2_a, this->fq2_result));
+}
+
+TEST_F(FfElementTest, FfMulSucceedsGivenElementZero) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq, this->fq_0, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq, this->fq_a, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfMulSucceedsGivenElementOne) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq, this->fq_1, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_b_str, fq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq, this->fq_a, this->fq_1, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_a_str, fq_a_str);
+}
+
+TEST_F(FfElementTest, FfMulSucceedsGivenTwoElements) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq, this->fq_a, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_mul_ab_str, fq_r_str);
+
+ Fq2ElemStr fq2_r_str;
+
+ THROW_ON_EPIDERR(
+ ReadFfElement(this->fq, &(fq_b_str), sizeof(fq_b_str), this->fq_b));
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq2, this->fq2_a, this->fq_b, this->fq2_result));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq2, this->fq2_result, &fq2_r_str,
+ sizeof(fq2_r_str)));
+ EXPECT_EQ(this->fq2_mul_ab_str, fq2_r_str);
+
+ Fq12ElemStr fq12_r_str;
+ THROW_ON_EPIDERR(ReadFfElement(this->fq12, &(this->fq12_i_str),
+ sizeof(this->fq12_i_str), this->fq12_i));
+ THROW_ON_EPIDERR(ReadFfElement(this->fq12, &(fq12_j_str), sizeof(fq12_j_str),
+ this->fq12_j));
+ EXPECT_EQ(kEpidNoErr,
+ FfMul(this->fq12, this->fq12_i, this->fq12_j, this->fq12_result));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq12, this->fq12_result, &fq12_r_str,
+ sizeof(fq12_r_str)));
+ EXPECT_EQ(fq12_mul_ij_str, fq12_r_str);
+}
+
+////////////////////////////////////////////////
+// FfSub
+TEST_F(FfElementTest, FfSubFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq12, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq, this->fq12_g, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq, this->fq_a, this->fq12_h, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq, this->fq_a, this->fq_b, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfSubFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(nullptr, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq, nullptr, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSub(this->fq, this->fq_a, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq_a, this->fq_b, nullptr));
+}
+
+TEST_F(FfElementTest, FfSubSucceedsGivenElementZero) {
+ FqElemStr fq_r_str = {0x0};
+
+ // additive identity
+ EXPECT_EQ(kEpidNoErr,
+ FfSub(this->fq, this->fq_a, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_a_str, fq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfSub(this->fq, this->fq_0, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfSubSucceedsGivenTwoEqualElements) {
+ FqElemStr fq_r_str = {0x0};
+
+ EXPECT_EQ(kEpidNoErr,
+ FfSub(this->fq, this->fq_a, this->fq_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfSubSucceedsGivenTwoElements) {
+ FqElemStr fq_r_str = {0x0};
+
+ EXPECT_EQ(kEpidNoErr,
+ FfSub(this->fq, this->fq_sum_ab, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_a_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq2) {
+ FfElementObj a(&this->fq2, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq2, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj sum_ab(&this->fq2, this->fq2_sum_ab_str);
+ FfElementObj r(&this->fq2);
+
+ EXPECT_EQ(kEpidNoErr, FfSub(this->fq2, sum_ab, b, r));
+ EXPECT_EQ(a, r);
+}
+TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq6) {
+ FfElementObj a(&this->fq6, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq6, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj sum_ab(&this->fq6, this->fq6_sum_ab_str);
+ FfElementObj r(&this->fq6);
+
+ EXPECT_EQ(kEpidNoErr, FfSub(this->fq6, sum_ab, b, r));
+ EXPECT_EQ(a, r);
+}
+TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq12) {
+ FfElementObj a(&this->fq12, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq12, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj sum_ab(&this->fq12, this->fq12_sum_ab_str);
+ FfElementObj r(&this->fq12);
+
+ EXPECT_EQ(kEpidNoErr, FfSub(this->fq12, sum_ab, b, r));
+ EXPECT_EQ(a, r);
+}
+
+////////////////////////////////////////////////
+// FfAdd
+TEST_F(FfElementTest, FfAddFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq12, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq, this->fq12_g, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq, this->fq_a, this->fq12_h, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq, this->fq_a, this->fq_b, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfAddFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(nullptr, this->fq_a, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq, nullptr, this->fq_b, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfAdd(this->fq, this->fq_a, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq_a, this->fq_b, nullptr));
+}
+
+TEST_F(FfElementTest, FfAddSucceedsGivenElementZero) {
+ FqElemStr fq_r_str = {0x0};
+
+ // additive identity
+ EXPECT_EQ(kEpidNoErr,
+ FfAdd(this->fq, this->fq_a, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_a_str, fq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfAdd(this->fq, this->fq_0, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_b_str, fq_r_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfAdd(this->fq, this->fq_0, this->fq_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfAddSucceedsGivenTwoElements) {
+ FqElemStr fq_r_str = {0x0};
+
+ EXPECT_EQ(kEpidNoErr,
+ FfAdd(this->fq, this->fq_a, this->fq_b, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_sum_ab_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq2) {
+ FfElementObj a(&this->fq2, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq2, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj r(&this->fq2);
+
+ EXPECT_EQ(kEpidNoErr, FfAdd(this->fq2, a, b, r));
+ EXPECT_EQ(FfElementObj(&this->fq2, this->fq2_sum_ab_str), r);
+}
+TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq6) {
+ FfElementObj a(&this->fq6, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq6, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj r(&this->fq6);
+
+ EXPECT_EQ(kEpidNoErr, FfAdd(this->fq6, a, b, r));
+ EXPECT_EQ(FfElementObj(&this->fq6, this->fq6_sum_ab_str), r);
+}
+TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq12) {
+ FfElementObj a(&this->fq12, &this->bn_a_str, sizeof(this->bn_a_str));
+ FfElementObj b(&this->fq12, &this->bn_b_str, sizeof(this->bn_b_str));
+ FfElementObj r(&this->fq12);
+
+ EXPECT_EQ(kEpidNoErr, FfAdd(this->fq12, a, b, r));
+ EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_sum_ab_str), r);
+}
+
+////////////////////////////////////////////////
+// FfInv
+
+TEST_F(FfElementTest, FfInvFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, FfInv(nullptr, (this->fq_a), this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq_a, nullptr));
+}
+
+TEST_F(FfElementTest, FfInvFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq12, this->fq_a, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq12_g, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq_a, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfInvFailsGivenElementZero) {
+ EXPECT_EQ(kEpidDivByZeroErr, FfInv(this->fq, this->fq_0, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfInvSucceedsGivenElementOne) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr, FfInv(this->fq, this->fq_1, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_1_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfInvSucceedsGivenAnElement) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr, FfInv(this->fq, this->fq_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_inv_a_str, fq_r_str);
+}
+
+////////////////////////////////////////////////
+// FfExp
+
+TEST_F(FfElementTest, FfExpFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(nullptr, this->fq_a, this->bn_a, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(this->fq, nullptr, this->bn_a, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(this->fq, this->fq_a, nullptr, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, this->fq_a, this->bn_a, nullptr));
+}
+
+TEST_F(FfElementTest, FfExpFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(this->fq12, this->fq_a, this->bn_0, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(this->fq, this->fq12_g, this->bn_0, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfExp(this->fq, this->fq_a, this->bn_0, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfExpSucceedsGivenElementZero) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq, this->fq_0, this->bn_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_0_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfExpSucceedsGivenExponentZero) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq, this->fq_a, this->bn_0, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_1_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfExpSucceedsGivenElementOne) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq, this->fq_1, this->bn_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_1_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfExpSucceedsGivenExponentOne) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq, this->fq_a, this->bn_1, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_a_str, fq_r_str);
+}
+
+TEST_F(FfElementTest, FfExpSucceedsGivenAnElement) {
+ FqElemStr fq_r_str;
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq, this->fq_a, this->bn_a, this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_exp_ab_str, fq_r_str);
+
+ Fq12ElemStr fq12_r_str;
+
+ BigNumObj bn_pm1(sizeof(this->fp_pm1_str), this->fp_pm1_str);
+
+ EXPECT_EQ(kEpidNoErr,
+ FfExp(this->fq12, this->fq12_k, bn_pm1, this->fq12_result));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq12, this->fq12_result, &fq12_r_str,
+ sizeof(fq12_r_str)));
+ EXPECT_EQ(this->fq12_mul_gb_str, fq12_r_str);
+}
+
+////////////////////////////////////////////////
+// FfHash
+
+TEST_F(FfElementTest, FfHashFailsGivenArgumentsMismatch) {
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(this->fq12, this->sha_msg, sizeof(this->sha_msg), kSha256,
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(this->fq, this->sha_msg, sizeof(this->sha_msg), kSha256,
+ this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfHashFailsGivenNullPointer) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(nullptr, msg, sizeof(msg), kSha256, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(this->fq, nullptr, sizeof(msg), kSha256, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(this->fq, msg, sizeof(msg), kSha256, nullptr));
+}
+
+TEST_F(FfElementTest, FfHashFailsGivenUnsupportedHashAlg) {
+ uint8_t const msg[] = {0};
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ FfHash(this->fq, msg, sizeof(msg), kSha3_256, this->fq_result));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ FfHash(this->fq, msg, sizeof(msg), kSha3_384, this->fq_result));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported,
+ FfHash(this->fq, msg, sizeof(msg), kSha3_512, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfHashFailsGivenIncorrectMsgLen) {
+ uint8_t const msg[] = {0};
+ size_t len_greater_int_max = (size_t)INT_MAX + 1;
+ EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, 0, kSha256, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfHash(this->fq, msg, std::numeric_limits<size_t>::max(), kSha256,
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, len_greater_int_max, kSha256,
+ this->fq_result));
+}
+
+TEST_F(FfElementTest, FfHashWorksGivenSHA256HashAlg) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha256,
+ this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_abc_sha256_str, fq_r_str)
+ << "FfHash: Hash element does not match to reference value";
+}
+
+TEST_F(FfElementTest, FfHashWorksGivenSHA384HashAlg) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha384,
+ this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_abc_sha384_str, fq_r_str)
+ << "FfHash: Hash element does not match to reference value";
+}
+
+TEST_F(FfElementTest, FfHashWorksGivenSHA512HashAlg) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha512,
+ this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_abc_sha512_str, fq_r_str)
+ << "FfHash: Hash element does not match to reference value";
+}
+TEST_F(FfElementTest, FfHashWorksGivenSHA512256HashAlg) {
+ FqElemStr fq_r_str;
+ EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha512_256,
+ this->fq_result));
+ THROW_ON_EPIDERR(
+ WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str)));
+ EXPECT_EQ(this->fq_abc_sha512256_str, fq_r_str)
+ << "FfHash: Hash element does not match to reference value";
+}
+////////////////////////////////////////////////
+// FfMultiExp
+
+TEST_F(FfElementTest, FfMultiExpFailsGivenArgumentsMismatch) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p12[] = {this->fq12_g, this->fq12_h};
+ BigNumStr const* b[] = {&this->bn_0_str, &this->bn_0_str};
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq12, p, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p12, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, 2, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpFailsGivenNullPointer) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p_withnull[] = {nullptr, this->fq_b};
+ BigNumStr const* b[] = {&fq_multi_exp_exp_2[0], &this->fq_multi_exp_exp_2[1]};
+ BigNumStr const* b_withnull[] = {nullptr, &this->fq_multi_exp_exp_2[1]};
+ size_t m = 2;
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(nullptr, p, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, nullptr, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, p, nullptr, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, p_withnull, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, p, b_withnull, m, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpFailsGivenIncorrectMLen) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0],
+ &this->fq_multi_exp_exp_2[1]};
+ size_t len_greater_int_max = (size_t)INT_MAX + 1;
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, 0, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, p, b, std::numeric_limits<size_t>::max(),
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExp(this->fq, p, b, len_greater_int_max, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenOneExponent) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[1];
+ FfElement const* p[1];
+ BigNumStr const* b[1];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 1; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_1[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 1, r));
+ // verify calculation is correct
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenTwoExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[2];
+ FfElement const* p[2];
+ BigNumStr const* b[2];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 2; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_2[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 2, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenThreeExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[3];
+ FfElement const* p[3];
+ BigNumStr const* b[3];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 3; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_3[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 3, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenFourExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[4];
+ FfElement const* p[4];
+ BigNumStr const* b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 4; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_4[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 4, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenFourFq12Exponents) {
+ FfElementObj r12(&this->fq12);
+ FfElementObj fq12_exp[4];
+ FfElement const* p[4];
+ BigNumStr const* b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 4; m++) {
+ fq12_exp[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]);
+ // initialize data for test
+ p[m] = fq12_exp[m];
+ b[m] = &this->fq12_multi_exp_exp_4[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq12, p, b, 4, r12));
+ EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_multi_exp_res_4), r12)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenFiveExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[5];
+ FfElement const* p[5];
+ BigNumStr const* b[5];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 5; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_5[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 5, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpWorksGivenSixExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[6];
+ FfElement const* p[6];
+ BigNumStr const* b[6];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 6; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_6[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 6, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r)
+ << "FfMultiExp: Finite field element does not match with reference value";
+}
+
+///////////////////////////////////////////////////////////////////////
+// FfMultiExpBn
+
+TEST_F(FfElementTest, FfMultiExpBnFailsGivenArgumentsMismatch) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p12[] = {this->fq12_g, this->fq12_h};
+ BigNum const* b[] = {bn_0, bn_0};
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq12, p, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p12, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, 2, this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpBnFailsGivenNullPointer) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p_withnull[] = {nullptr, this->fq_b};
+ BigNumObj bn_exp_0(this->fq_multi_exp_exp_2[0]);
+ BigNumObj bn_exp_1(this->fq_multi_exp_exp_2[1]);
+ BigNum const* b[] = {bn_exp_0, bn_exp_1};
+ BigNum const* b_withnull[] = {nullptr, bn_exp_1};
+ size_t m = 2;
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(nullptr, p, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, nullptr, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, p, nullptr, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, p_withnull, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, p, b_withnull, m, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpBnFailsGivenIncorrectMLen) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ BigNumObj bn_exp_0(this->fq_multi_exp_exp_2[0]);
+ BigNumObj bn_exp_1(this->fq_multi_exp_exp_2[1]);
+ BigNum const* b[] = {bn_exp_0, bn_exp_1};
+ size_t len_greater_int_max = (size_t)INT_MAX + 1;
+ EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, 0, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, p, b, std::numeric_limits<size_t>::max(),
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfMultiExpBn(this->fq, p, b, len_greater_int_max, this->fq_result));
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenOneExponent) {
+ const int items = 1;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[1];
+ BigNumObj bn_exp[1];
+ FfElement const* p[1];
+ BigNum const* b[1];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_1[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r)
+ << "FfMultiExpBn: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenTwoExponents) {
+ const int items = 2;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[2];
+ BigNumObj bn_exp[2];
+ FfElement const* p[2];
+ BigNum const* b[2];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_2[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r)
+ << "FfMultiExpBn: Finite field element does not "
+ "match with reference value";
+}
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenThreeExponents) {
+ const int items = 3;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[3];
+ BigNumObj bn_exp[3];
+ FfElement const* p[3];
+ BigNum const* b[3];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_3[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r)
+ << "FfMultiExpBn: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenFourExponents) {
+ const int items = 4;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[4];
+ BigNumObj bn_exp[4];
+ FfElement const* p[4];
+ BigNum const* b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_4[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r)
+ << "FfMultiExpBn: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, DISABLED_FfMultiExpBnWorksGivenFourFq12Exponents) {
+ const int items = 4;
+ FfElementObj fq12_r(&this->fq12);
+ FfElementObj fq12_base[4];
+ BigNumObj fq12_bn_exp[4];
+ FfElement const* fq12_p[4];
+ BigNum const* fq12_b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq12_base[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]);
+ fq12_bn_exp[m] = BigNumObj(this->fq12_multi_exp_exp_4[m]);
+ // initialize data for test
+ fq12_p[m] = fq12_base[m];
+ fq12_b[m] = fq12_bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr,
+ FfMultiExpBn(this->fq12, fq12_p, fq12_b, items, fq12_r));
+ EXPECT_EQ(FfElementObj(&this->fq12, this->fq_multi_exp_res_4), fq12_r)
+ << "FfMultiExpBn: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenFiveExponents) {
+ const int items = 5;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[5];
+ BigNumObj bn_exp[5];
+ FfElement const* p[5];
+ BigNum const* b[5];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_5[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksGivenSixExponents) {
+ const int items = 6;
+ FfElementObj r(&this->fq);
+ FfElementObj fq_base[6];
+ BigNumObj bn_exp[6];
+ FfElement const* p[6];
+ BigNum const* b[6];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]);
+ bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_6[m]);
+ // initialize data for test
+ p[m] = fq_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, FfMultiExpBnWorksOverEpid11GT) {
+ const int items = 3;
+ FfElementObj r(&this->epid11_GT);
+ FfElementObj ff_base[3];
+ BigNumObj bn_exp[3];
+ FfElement const* p[3];
+ BigNum const* b[3];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < items; m++) {
+ ff_base[m] =
+ FfElementObj(&this->epid11_GT, this->epid11_GT_multi_exp_base_3[m]);
+ bn_exp[m] = BigNumObj(this->epid11_GT_multi_exp_exp_3[m]);
+ // initialize data for test
+ p[m] = ff_base[m];
+ b[m] = bn_exp[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->epid11_GT, p, b, items, r));
+ EXPECT_EQ(FfElementObj(&this->epid11_GT, this->epid11_GT_multi_exp_res_3), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+///////////////////////////////////////////////////////////////////////
+// FfSscmMultiExp
+
+TEST_F(FfElementTest, SscmFfMultiExpFailsGivenArgumentsMismatch) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p12[] = {this->fq12_g, this->fq12_h};
+ BigNumStr const* b[] = {&this->bn_0_str, &this->bn_0_str};
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq12, p, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p12, b, 2, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p, b, 2, this->fq12_result));
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpFailsGivenNullPointer) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ FfElement const* p_withnull[] = {nullptr, this->fq_b};
+ BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0],
+ &this->fq_multi_exp_exp_2[1]};
+ BigNumStr const* b_withnull[] = {nullptr, &this->fq_multi_exp_exp_2[1]};
+ size_t m = 2;
+ EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(nullptr, p, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, nullptr, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p, nullptr, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, m, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p_withnull, b, m, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p, b_withnull, m, this->fq_result));
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpFailsGivenIncorrectMLen) {
+ FfElement const* p[] = {this->fq_a, this->fq_b};
+ BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0],
+ &this->fq_multi_exp_exp_2[1]};
+ size_t len_greater_int_max = (size_t)INT_MAX + 1;
+ EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, 0, this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfSscmMultiExp(this->fq, p, b, std::numeric_limits<size_t>::max(),
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, len_greater_int_max,
+ this->fq_result));
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenOneExponent) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[1];
+ FfElement const* p[1];
+ BigNumStr const* b[1];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 1; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_1[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 1, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenTwoExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[2];
+ FfElement const* p[2];
+ BigNumStr const* b[2];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 2; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_2[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 2, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenThreeExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[3];
+ FfElement const* p[3];
+ BigNumStr const* b[3];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 3; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_3[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 3, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFourExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[4];
+ FfElement const* p[4];
+ BigNumStr const* b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 4; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_4[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 4, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFourFq12Exponents) {
+ FfElementObj r12(&this->fq12);
+ FfElementObj fq12_exp[4];
+ FfElement const* p[4];
+ BigNumStr const* b[4];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 4; m++) {
+ fq12_exp[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]);
+ // initialize data for test
+ p[m] = fq12_exp[m];
+ b[m] = &this->fq12_multi_exp_exp_4[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq12, p, b, 4, r12));
+ EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_multi_exp_res_4), r12)
+ << "FfSscmMultiExp: Finite field element does not match with reference "
+ "value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFiveExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[5];
+ FfElement const* p[5];
+ BigNumStr const* b[5];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 5; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_5[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 5, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+
+TEST_F(FfElementTest, SscmFfMultiExpWorksGivenSixExponents) {
+ FfElementObj r(&this->fq);
+ FfElementObj fq_exp[6];
+ FfElement const* p[6];
+ BigNumStr const* b[6];
+ int m = 0;
+ // prepare data for test
+ for (m = 0; m < 6; m++) {
+ fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]);
+ // initialize data for test
+ p[m] = fq_exp[m];
+ b[m] = &this->fq_multi_exp_exp_6[m];
+ }
+ // do test
+ EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 6, r));
+ EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r)
+ << "FfSscmMultiExp: Finite field element does not "
+ "match with reference value";
+}
+////////////////////////////////////////////////
+// FfGetRandom
+
+TEST_F(FfElementTest, FfGetRandomFailsGivenArgumentsMismatch) {
+ Prng my_prng;
+ EXPECT_EQ(kEpidBadArgErr,
+ FfGetRandom(this->fq12, &this->bn_1_str, &Prng::Generate, &my_prng,
+ this->fq_result));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng,
+ this->fq12_result));
+}
+
+TEST_F(FfElementTest, FfGetRandomFailsGivenNullPtr) {
+ Prng my_prng;
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidBadArgErr, FfGetRandom(nullptr, &this->bn_1_str,
+ &Prng::Generate, &my_prng, r));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfGetRandom(this->fq, nullptr, &Prng::Generate, &my_prng, r));
+ EXPECT_EQ(kEpidBadArgErr,
+ FfGetRandom(this->fq, &this->bn_1_str, nullptr, &my_prng, r));
+ EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq, &this->bn_1_str,
+ &Prng::Generate, &my_prng, nullptr));
+}
+TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq2) {
+ Prng my_prng;
+ FfElementObj r(&this->fq2);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq2, &this->bn_1_str, &Prng::Generate,
+ &my_prng, r));
+}
+TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq6) {
+ Prng my_prng;
+ FfElementObj r(&this->fq6);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq6, &this->bn_1_str, &Prng::Generate,
+ &my_prng, r));
+}
+TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq12) {
+ Prng my_prng;
+ FfElementObj r(&this->fq12);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq12, &this->bn_1_str,
+ &Prng::Generate, &my_prng, r));
+}
+
+TEST_F(FfElementTest, FfGetRandomSuccedsGivenLowBound) {
+ Prng my_prng;
+ FfElementObj r(&this->fq);
+ FqElemStr buf;
+ unsigned int result;
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate,
+ &my_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf)));
+ THROW_ON_EPIDERR(Cmp_OctStr256(&this->bn_1_str.data, &buf.data, &result));
+ EXPECT_EQ(result, (unsigned int)2);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_2_str, &Prng::Generate,
+ &my_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf)));
+ THROW_ON_EPIDERR(Cmp_OctStr256(&this->bn_2_str.data, &buf.data, &result));
+ EXPECT_EQ(result, (unsigned int)2);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_0xffff_str,
+ &Prng::Generate, &my_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf)));
+ THROW_ON_EPIDERR(
+ Cmp_OctStr256(&this->bn_0xffff_str.data, &buf.data, &result));
+ EXPECT_EQ(result, (unsigned int)2);
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_0xffff_str,
+ &Prng::Generate, &my_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf)));
+ THROW_ON_EPIDERR(
+ Cmp_OctStr256(&this->bn_0xffff_str.data, &buf.data, &result));
+ EXPECT_EQ(result, (unsigned int)2);
+}
+
+TEST_F(FfElementTest, FfGetRandomGeneratesDifferentNumbers) {
+ Prng my_prng;
+ FfElementObj r1(&this->fq);
+ FfElementObj r2(&this->fq);
+ bool result;
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate,
+ &my_prng, r1));
+ EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate,
+ &my_prng, r2));
+ THROW_ON_EPIDERR(FfIsEqual(this->fq, r1, r2, &result));
+ EXPECT_FALSE(result);
+}
+TEST_F(FfElementTest, FfGetRandomFailsOnMaxIterGivenLargeLowBound) {
+ Prng my_prng;
+ FfElementObj r(&this->fq);
+ // FfGetRandom generates random data between [low_bound, modulus-1]
+ // modulus in this case is Intel(R) EPID 2.0 parameter q
+ // giving low_bound = modulus - {0x30, 0x13} should get kEpidRandMaxIterErr
+ EXPECT_EQ(kEpidRandMaxIterErr, FfGetRandom(this->fq, &this->fq_qm0x3013_str,
+ &Prng::Generate, &my_prng, r));
+}
+
+////////////////////////////////////////////////
+// FfSqrt
+TEST_F(FfElementTest, FfSqrtFailsGivenNullPtr) {
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidBadArgErr, FfSqrt(nullptr, this->fq_4, r));
+ EXPECT_EQ(kEpidBadArgErr, FfSqrt(this->fq, nullptr, r));
+ EXPECT_EQ(kEpidBadArgErr, FfSqrt(this->fq, this->fq_4, nullptr));
+}
+
+TEST_F(FfElementTest, FfSqrtWorksForOne) {
+ FfElementObj r(&this->fq);
+ FfElementObj s(&this->fq);
+ EXPECT_EQ(kEpidNoErr, FfSqrt(this->fq, this->fq_1, r));
+ EXPECT_EQ(this->fq_1, r);
+}
+
+TEST_F(FfElementTest, FfSqrtFailsForTwo) {
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_2, r));
+}
+
+TEST_F(FfElementTest, FfSqrtFailsForThree) {
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_3, r));
+}
+
+TEST_F(FfElementTest, FfSqrtWorksForFour) {
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidNoErr, FfSqrt(this->fq, this->fq_4, r));
+ EXPECT_EQ(this->fq_qm2, r);
+}
+
+TEST_F(FfElementTest, FfSqrtFailsForFive) {
+ FfElementObj r(&this->fq);
+ EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_5, r));
+}
+
+TEST_F(FfElementTest, FfSqrtWorksForEpid11Prime) {
+ // given b_str value ensure sqrt algorithm step 7 if clause is triggered
+ const BigNumStr b_str = {0x06, 0xc1, 0x26, 0xe8, 0xa5, 0xa5, 0x21, 0x19,
+ 0x07, 0x42, 0x49, 0x77, 0x7c, 0x5c, 0x98, 0x7f,
+ 0xd4, 0x0c, 0x42, 0xf5, 0x25, 0x2c, 0xac, 0xb9,
+ 0x7e, 0x09, 0x70, 0xf0, 0x84, 0x3b, 0x81, 0x46};
+ FfElementObj b(&this->epid11_fq, &b_str, sizeof((b_str)));
+
+ FfElementObj r(&this->epid11_fq);
+ FfElementObj s(&this->epid11_fq);
+ FfElementObj r2(&this->epid11_fq);
+
+ EXPECT_EQ(kEpidNoErr, FfMul(this->epid11_fq, b, b, s));
+ EXPECT_EQ(kEpidNoErr, FfSqrt(this->epid11_fq, s, r));
+ EXPECT_EQ(kEpidNoErr, FfMul(this->epid11_fq, r, r, r2));
+ EXPECT_EQ(s, r2);
+}
+
+TEST_F(FfElementTest, FfSqrtReturnsARoot) {
+ Prng my_prng;
+ FfElementObj r(&this->fq);
+ FfElementObj b(&this->fq);
+ FfElementObj s(&this->fq);
+ FfElementObj r2(&this->fq);
+ unsigned int i;
+ for (i = 0; i < 1000; i++) {
+ ASSERT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_2_str,
+ &Prng::Generate, &my_prng, b));
+ ASSERT_EQ(kEpidNoErr, FfMul(this->fq, b, b, s));
+ ASSERT_EQ(kEpidNoErr, FfSqrt(this->fq, s, r));
+ ASSERT_EQ(kEpidNoErr, FfMul(this->fq, r, r, r2));
+ ASSERT_EQ(s, r2);
+ }
+}
+
+TEST_F(FfElementTest, FfSqrtReturnsARootInEpid11) {
+ Prng my_prng;
+ FfElementObj r(&this->epid11_fq);
+ FfElementObj b(&this->epid11_fq);
+ FfElementObj s(&this->epid11_fq);
+ FfElementObj r2(&this->epid11_fq);
+ unsigned int i;
+ for (i = 0; i < 1000; i++) {
+ ASSERT_EQ(kEpidNoErr, FfGetRandom(this->epid11_fq, &this->bn_2_str,
+ &Prng::Generate, &my_prng, b));
+ ASSERT_EQ(kEpidNoErr, FfMul(this->epid11_fq, b, b, s));
+ ASSERT_EQ(kEpidNoErr, FfSqrt(this->epid11_fq, s, r));
+ ASSERT_EQ(kEpidNoErr, FfMul(this->epid11_fq, r, r, r2));
+ ASSERT_EQ(s, r2);
+ }
+}
+
+TEST_F(FfElementTest, FfSqrtReturnsARoot224Prime) {
+ const BigNumStr prime_224r1 = {
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+ FiniteFieldObj f_q(prime_224r1);
+
+ Prng my_prng;
+ FfElementObj r(&f_q);
+ FfElementObj b(&f_q);
+ FfElementObj s(&f_q);
+ FfElementObj r2(&f_q);
+ unsigned int i;
+ for (i = 0; i < 100; i++) {
+ EXPECT_EQ(kEpidNoErr,
+ FfGetRandom(f_q, &this->bn_2_str, &Prng::Generate, &my_prng, b));
+ EXPECT_EQ(kEpidNoErr, FfMul(f_q, b, b, s));
+ EXPECT_EQ(kEpidNoErr, FfSqrt(f_q, s, r));
+ EXPECT_EQ(kEpidNoErr, FfMul(f_q, r, r, r2));
+ EXPECT_EQ(s, r2);
+ }
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/finitefield-test.cc b/epid/common/math/unittests/finitefield-test.cc
new file mode 100644
index 0000000..b39cd5c
--- /dev/null
+++ b/epid/common/math/unittests/finitefield-test.cc
@@ -0,0 +1,252 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief FiniteField unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/finitefield.h"
+}
+
+#ifndef COUNT_OF
+#define COUNT_OF(a) (sizeof(a) / sizeof((a)[0]))
+#endif // COUNT_OF
+
+namespace {
+/// Intel(R) EPID 2.0 parameters q, beta, xi and v
+BigNumStr q = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}};
+FqElemStr beta = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}};
+Fq2ElemStr xi = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}}};
+Fq6ElemStr v = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+
+FqElemStr qnr = {{0x08, 0x66, 0xA7, 0x67, 0x36, 0x6E, 0x62, 0x71,
+ 0xB7, 0xA6, 0x52, 0x94, 0x8F, 0xFB, 0x25, 0x9E,
+ 0xE6, 0x4F, 0x25, 0xE5, 0x26, 0x9A, 0x2B, 0x6E,
+ 0x7E, 0xF8, 0xA6, 0x39, 0xAE, 0x46, 0xAA, 0x24}};
+
+const BigNumStr coeffs[3] = {
+ {{{0x02, 0x16, 0x7A, 0x61, 0x53, 0xDD, 0xF6, 0xE2, 0x89, 0x15, 0xA0,
+ 0x94, 0xF1, 0xB5, 0xDC, 0x65, 0x21, 0x15, 0x62, 0xE1, 0x7D, 0xC5,
+ 0x43, 0x89, 0xEE, 0xB4, 0xEF, 0xC8, 0xA0, 0x8E, 0x34, 0x0F}}},
+
+ {{{0x04, 0x82, 0x27, 0xE1, 0xEB, 0x98, 0x64, 0xC2, 0x8D, 0x8F, 0xDD,
+ 0x0E, 0x82, 0x40, 0xAE, 0xD4, 0x31, 0x63, 0xD6, 0x46, 0x32, 0x16,
+ 0x85, 0x7A, 0xB7, 0x18, 0x68, 0xB8, 0x17, 0x02, 0x81, 0xA6}}},
+
+ {{{0x06, 0x20, 0x76, 0xE8, 0x54, 0x54, 0x53, 0xB4, 0xA9, 0xD8, 0x44,
+ 0x4B, 0xAA, 0xFB, 0x1C, 0xFD, 0xAE, 0x15, 0xCA, 0x29, 0x79, 0xA6,
+ 0x24, 0xA4, 0x0A, 0xF6, 0x1E, 0xAC, 0xED, 0xFB, 0x10, 0x41}}}};
+
+TEST(FiniteField, DeleteWorksGivenNewlyCreatedFiniteField) {
+ FiniteField* finitefield = nullptr;
+ EpidStatus sts = NewFiniteField(&q, &finitefield);
+ EXPECT_EQ(kEpidNoErr, sts);
+ EXPECT_NO_THROW(DeleteFiniteField(&finitefield));
+}
+TEST(FiniteField, DeleteWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeleteFiniteField(nullptr));
+ FiniteField* finitefield = nullptr;
+ EXPECT_NO_THROW(DeleteFiniteField(&finitefield));
+}
+TEST(FiniteField, NewFailsGivenNullBigNumStr) {
+ FiniteField* finitefield = nullptr;
+ EpidStatus sts = NewFiniteField(nullptr, &finitefield);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ DeleteFiniteField(&finitefield);
+}
+
+TEST(FiniteField, NewFailsGivenNullFiniteField) {
+ EpidStatus sts = NewFiniteField(&q, nullptr);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+}
+
+TEST(FiniteField, NewSucceedsGivenNewlyCreatedBigNumStr) {
+ FiniteField* finitefield = nullptr;
+ EpidStatus sts = NewFiniteField(&q, &finitefield);
+ EXPECT_EQ(kEpidNoErr, sts);
+ DeleteFiniteField(&finitefield);
+}
+
+// the following test reproduces a bug in IPP.
+TEST(FiniteField, DISABLED_NewSucceedsGivenAllFFBigNumStr) {
+ const BigNumStr test_prime = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+ FiniteField* finitefield = nullptr;
+ EpidStatus sts = NewFiniteField(&test_prime, &finitefield);
+ EXPECT_EQ(kEpidNoErr, sts);
+ DeleteFiniteField(&finitefield);
+}
+
+TEST(FiniteField, BinomialExtensionFailsGivenNullPointer) {
+ FiniteField* binom_ext_finite_field_ptr = nullptr;
+ FiniteFieldObj ground_field(q);
+ FfElementObj ground_element(&ground_field, beta);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(nullptr, ground_element, 2,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(ground_field, nullptr, 2,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr, NewFiniteFieldViaBinomalExtension(
+ ground_field, ground_element, 2, nullptr));
+}
+
+TEST(FiniteField, BinomialExtensionFailsGivenBadDegree) {
+ FiniteField* binom_ext_finite_field_ptr = nullptr;
+ FiniteFieldObj ground_field(q);
+ FfElementObj ground_element(&ground_field, beta);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(ground_field, ground_element, 1,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(ground_field, ground_element, 0,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(ground_field, ground_element, -1,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaBinomalExtension(ground_field, ground_element, -99,
+ &binom_ext_finite_field_ptr));
+ DeleteFiniteField(&binom_ext_finite_field_ptr);
+}
+
+TEST(FiniteField, BinomialExtensionCanBuildEpid2GtField) {
+ // construct Fq finite field
+ FiniteFieldObj fq(q);
+
+ // construct Fq^2 finite field
+ FfElementObj neg_beta(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, beta), neg_beta));
+ FiniteFieldObj fq2(fq, neg_beta, 2);
+
+ // construct Fq^6 finite field
+ FfElementObj neg_xi(&fq2);
+ THROW_ON_EPIDERR(FfNeg(fq2, FfElementObj(&fq2, xi), neg_xi));
+ FiniteFieldObj fq6(fq2, neg_xi, 3);
+
+ // construct Fq^12 finite field
+ FfElementObj neg_v(&fq6);
+ THROW_ON_EPIDERR(FfNeg(fq6, FfElementObj(&fq6, v), neg_v));
+ FiniteFieldObj fq12(fq6, neg_v, 2);
+
+ FiniteField* binom_ext_fq12_ptr = nullptr;
+ EXPECT_EQ(kEpidNoErr, NewFiniteFieldViaBinomalExtension(fq6, neg_v, 2,
+ &binom_ext_fq12_ptr));
+ DeleteFiniteField(&binom_ext_fq12_ptr);
+}
+
+TEST(FiniteField, PolynomialExtensionFailsGivenNullPointer) {
+ FiniteField* ext_finite_field_ptr = nullptr;
+ FiniteFieldObj ground_field(q);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaPolynomialExtension(
+ nullptr, coeffs, COUNT_OF(coeffs), &ext_finite_field_ptr));
+ DeleteFiniteField(&ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaPolynomialExtension(ground_field, nullptr, 2,
+ &ext_finite_field_ptr));
+ DeleteFiniteField(&ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr, NewFiniteFieldViaPolynomialExtension(
+ ground_field, coeffs, 2, nullptr));
+}
+
+TEST(FiniteField, PolynomialExtensionFailsGivenBadDegree) {
+ FiniteField* ext_finite_field_ptr = nullptr;
+ FiniteFieldObj ground_field(q);
+ FfElementObj ground_element(&ground_field, beta);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaPolynomialExtension(ground_field, coeffs, 0,
+ &ext_finite_field_ptr));
+ DeleteFiniteField(&ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaPolynomialExtension(ground_field, coeffs, -1,
+ &ext_finite_field_ptr));
+ DeleteFiniteField(&ext_finite_field_ptr);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewFiniteFieldViaPolynomialExtension(ground_field, coeffs, -99,
+ &ext_finite_field_ptr));
+ DeleteFiniteField(&ext_finite_field_ptr);
+}
+
+TEST(FiniteField, CanBuildEpid11GtField) {
+ // construct Fq finite field
+ FiniteFieldObj fq(q);
+
+ // construct Fqd finite field
+ FiniteFieldObj fqd(fq, coeffs, COUNT_OF(coeffs));
+
+ // Fqk ground element is {-qnr, 0, 0}
+ FfElementObj neg_qnr(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, qnr), neg_qnr));
+ Fq3ElemStr ground_element_str = {0};
+ THROW_ON_EPIDERR(WriteFfElement(fq, neg_qnr, &ground_element_str.a[0],
+ sizeof(ground_element_str.a[0])));
+ FfElementObj ground_element(&fqd, ground_element_str);
+
+ // construct Fqk finite field
+ FiniteField* gt_ptr = nullptr;
+ EXPECT_EQ(kEpidNoErr,
+ NewFiniteFieldViaBinomalExtension(fqd, ground_element, 2, &gt_ptr));
+ DeleteFiniteField(&gt_ptr);
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/hash-test.cc b/epid/common/math/unittests/hash-test.cc
new file mode 100644
index 0000000..69127f9
--- /dev/null
+++ b/epid/common/math/unittests/hash-test.cc
@@ -0,0 +1,88 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Hash unit tests.
+ */
+
+#include <cstring>
+#include <limits>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/hash.h"
+}
+
+/// compares Sha256Digest values
+bool operator==(Sha256Digest const& lhs, Sha256Digest const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+///////////////////////////////////////////////////////////////////////
+// SHA256
+TEST(Hash, Sha256MessageDigestFailsGivenNullPtr) {
+ char msg[] = "abc";
+ Sha256Digest digest;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Sha256MessageDigest(nullptr, sizeof(msg) - 1, &digest));
+ EXPECT_EQ(kEpidBadArgErr, Sha256MessageDigest(msg, sizeof(msg) - 1, nullptr));
+}
+
+TEST(Hash, Sha256MessageDigestFailsGivenInvalidBufferSize) {
+ char msg[] = "abc";
+ Sha256Digest digest;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Sha256MessageDigest(msg, std::numeric_limits<size_t>::max(), &digest));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr, Sha256MessageDigest(msg, 0x100000001, &digest));
+#endif
+}
+
+TEST(Hash, Sha256MessageDigestComputesCorrectDigest) {
+ // Test vectors here are taken from
+ // http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA256.pdf
+
+ Sha256Digest digest;
+
+ char msg_abc[] = "abc";
+ Sha256Digest digest_abc = {{0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
+ 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
+ 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
+ 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD}};
+ EXPECT_EQ(kEpidNoErr,
+ Sha256MessageDigest(msg_abc, sizeof(msg_abc) - 1, &digest));
+ EXPECT_EQ(digest_abc, digest);
+
+ char msg_long[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+ Sha256Digest digest_long = {{0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
+ 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
+ 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
+ 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1}};
+ EXPECT_EQ(kEpidNoErr,
+ Sha256MessageDigest(msg_long, sizeof(msg_long) - 1, &digest));
+ EXPECT_EQ(digest_long, digest);
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/main-test.cc b/epid/common/math/unittests/main-test.cc
new file mode 100644
index 0000000..a8bb2fa
--- /dev/null
+++ b/epid/common/math/unittests/main-test.cc
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Main entry point for unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/common/math/unittests/octstrconvert-test.cc b/epid/common/math/unittests/octstrconvert-test.cc
new file mode 100644
index 0000000..129c907
--- /dev/null
+++ b/epid/common/math/unittests/octstrconvert-test.cc
@@ -0,0 +1,76 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief OctStr2Bnu unit tests.
+ *
+ * OctStr2Bnu is an internal function used in the IPP implementation of the
+ * math libraries. These tests can be omitted if you do not use this function.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common/stdtypes.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/src/bignum-internal.h"
+}
+
+namespace {
+
+const uint8_t bnstr1[] = {0x01, 0x02, 0x03, 0x04};
+const uint8_t bnstr2[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
+uint32_t bnustr1[sizeof(bnstr1) / sizeof(uint32_t)] = {0x01020304};
+uint32_t bnustr2[sizeof(bnstr2) / sizeof(uint32_t)] = {0x05060708, 0x01020304};
+
+TEST(OctStr2Bnu, octstr2bnuFailsGivenNullBnu) {
+ int len = OctStr2Bnu(nullptr, bnstr1, sizeof(bnstr1) / sizeof(uint8_t));
+ EXPECT_EQ(-1, len);
+}
+TEST(OctStr2Bnu, octstr2bnuFailsGivenNullOctstr) {
+ uint32_t bnustr_res[sizeof(bnstr1) / sizeof(uint32_t)] = {0};
+ int len = OctStr2Bnu(bnustr_res, nullptr, sizeof(bnstr1) / sizeof(uint8_t));
+ EXPECT_EQ(-1, len);
+}
+TEST(OctStr2Bnu, octstr2bnuFailsGivenInvalidOctsrtLen) {
+ uint32_t bnustr_res[sizeof(bnstr1) / sizeof(uint32_t)] = {0};
+ int len = OctStr2Bnu(bnustr_res, bnstr1, -1);
+ EXPECT_EQ(-1, len);
+ len = OctStr2Bnu(bnustr_res, bnstr1, 0);
+ EXPECT_EQ(-1, len);
+ len = OctStr2Bnu(bnustr_res, bnstr1, 3);
+ EXPECT_EQ(-1, len);
+ len = OctStr2Bnu(bnustr_res, bnstr1, 5);
+ EXPECT_EQ(-1, len);
+}
+TEST(OctStr2Bnu, octstr2bnuWorksGivenOctstr1) {
+ uint32_t bnustr_res[sizeof(bnstr1) / sizeof(uint32_t)] = {0};
+ int len = OctStr2Bnu(bnustr_res, bnstr1, sizeof(bnstr1) / sizeof(uint8_t));
+ EXPECT_EQ(1, len);
+ EXPECT_EQ(0,
+ memcmp(bnustr1, bnustr_res, sizeof(bnustr_res) / sizeof(uint32_t)))
+ << "OctStr2Bnu: bnu string result does not match with predefined value\n";
+}
+TEST(OctStr2Bnu, octstr2bnuWorksGivenOctstr2) {
+ uint32_t bnustr_res[sizeof(bnstr2) / sizeof(uint32_t)] = {0};
+ int len = OctStr2Bnu(bnustr_res, bnstr2, sizeof(bnstr2) / sizeof(uint8_t));
+ EXPECT_EQ(2, len);
+ EXPECT_EQ(0,
+ memcmp(bnustr2, bnustr_res, sizeof(bnustr_res) / sizeof(uint32_t)))
+ << "OctStr2Bnu: bnu string result does not match with predefined value\n";
+}
+} // namespace
diff --git a/epid/common/math/unittests/pairing-test.cc b/epid/common/math/unittests/pairing-test.cc
new file mode 100644
index 0000000..5eac8c2
--- /dev/null
+++ b/epid/common/math/unittests/pairing-test.cc
@@ -0,0 +1,274 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pairing unit tests.
+ */
+
+#include <cstring>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/pairing.h"
+#include "epid/common/math/src/ecgroup-internal.h"
+#include "epid/common/math/src/finitefield-internal.h"
+#include "epid/common/math/src/pairing-internal.h"
+}
+
+/// compares Fq12ElemStr values
+bool operator==(GtElemStr const& lhs, GtElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+class PairingTest : public Epid20Params, public ::testing::Test {
+ public:
+ static const BigNumStr t_str;
+ static const G1ElemStr ga_elem_str;
+ static const G2ElemStr gb_elem_str;
+
+ virtual void SetUp() { params = new Epid20Params(); }
+ virtual void TearDown() { delete params; }
+
+ Epid20Params* params;
+};
+
+const BigNumStr PairingTest::t_str = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x68, 0x82, 0xF5, 0xC0, 0x30, 0xB0, 0xA8, 0x01};
+
+const G1ElemStr PairingTest::ga_elem_str = {
+ 0xd7, 0xe2, 0xf9, 0x37, 0x21, 0x0f, 0x09, 0x97, 0x0f, 0xca, 0xa6,
+ 0x03, 0x7d, 0x91, 0xc3, 0x75, 0x8a, 0xc9, 0x44, 0x11, 0xfc, 0xaa,
+ 0x55, 0x67, 0xba, 0xce, 0xaf, 0x8d, 0xf6, 0x7c, 0x84, 0x83, 0x04,
+ 0xb7, 0xa6, 0xff, 0x9f, 0x0d, 0x26, 0x73, 0xaf, 0x6c, 0xd0, 0x0a,
+ 0xf6, 0x13, 0xc9, 0x44, 0x3f, 0xf0, 0x82, 0x58, 0x48, 0x59, 0x03,
+ 0x3f, 0x88, 0xe2, 0x46, 0xd6, 0x0f, 0x93, 0x42, 0x4b,
+};
+const G2ElemStr PairingTest::gb_elem_str = {
+ 0x3f, 0x4c, 0xb5, 0x2d, 0xbc, 0x72, 0xb0, 0x9c, 0x6f, 0xb2, 0xb5, 0xc1,
+ 0xdc, 0xfb, 0xda, 0x35, 0x91, 0xa6, 0x8d, 0x51, 0x37, 0x70, 0xe2, 0x17,
+ 0xad, 0x53, 0x23, 0xdc, 0xa3, 0xc3, 0xfd, 0x4c, 0x90, 0xfa, 0x4f, 0xa2,
+ 0xcb, 0x35, 0xf3, 0x50, 0x5e, 0x8e, 0xf4, 0xce, 0x7f, 0xb0, 0x8a, 0x69,
+ 0x49, 0xdf, 0xf5, 0x4f, 0xb0, 0xc1, 0xd7, 0xf9, 0xb8, 0xfb, 0x89, 0xd1,
+ 0xb6, 0xf8, 0x74, 0x04, 0xef, 0xc6, 0x60, 0x05, 0x62, 0xf3, 0x17, 0x5a,
+ 0x80, 0xf4, 0x4b, 0x97, 0x08, 0x3e, 0x43, 0xa1, 0x44, 0x4c, 0x54, 0x86,
+ 0x16, 0x20, 0xb9, 0xcc, 0xfb, 0xbd, 0x00, 0x5f, 0xc8, 0x01, 0xfb, 0x5b,
+ 0xc1, 0x6e, 0x2b, 0x46, 0xe2, 0x04, 0x70, 0xeb, 0xa2, 0xaa, 0x86, 0x5a,
+ 0x35, 0x14, 0x0e, 0xc9, 0xdf, 0xba, 0x9b, 0x6f, 0x3a, 0xca, 0x94, 0x9c,
+ 0x44, 0x89, 0x94, 0xa3, 0xeb, 0x61, 0x8b, 0x01,
+};
+///////////////////////////////////////////////////////////////////////
+// NewPairingState / DeletePairingState
+
+// test that delete works in a "normal" valid case.
+TEST_F(PairingTest, DeleteWorksGivenNewlyCreatedPairingState) {
+ PairingState* ps = nullptr;
+ EpidStatus sts = kEpidNoErr;
+ EXPECT_EQ(kEpidNoErr,
+ NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, true, &ps));
+ EXPECT_EQ(kEpidNoErr, sts);
+ EXPECT_NO_THROW(DeletePairingState(&ps));
+}
+
+// test that delete works if there is nothing to do
+TEST_F(PairingTest, DeleteWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeletePairingState(nullptr));
+ PairingState* ps = nullptr;
+ EXPECT_NO_THROW(DeletePairingState(&ps));
+}
+
+// test that new succeeds with valid parameters
+TEST_F(PairingTest, NewSucceedsGivenValidParameters) {
+ PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidNoErr,
+ NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+}
+
+// test that new fails if any options are NULL
+TEST_F(PairingTest, NewFailsGivenNullParameters) {
+ PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(nullptr, this->params->G2, this->params->GT,
+ &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(this->params->G1, nullptr, this->params->GT,
+ &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr, NewPairingState(this->params->G1, this->params->G2,
+ nullptr, &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, nullptr, true, &ps));
+ DeletePairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, true, nullptr));
+}
+
+// test that new checks that G1 is valid
+TEST_F(PairingTest, NewFailsGivenInvalidG1) {
+ PairingState* ps = nullptr;
+ EcGroup ga;
+ ga.ipp_ec = nullptr;
+ ga.scratch_buffer = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(&ga, this->params->G2, this->params->GT,
+ &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+}
+
+// test that new checks that G2 is valid
+TEST_F(PairingTest, NewFailsGivenInvalidG2) {
+ PairingState* ps = nullptr;
+ EcGroup gb;
+ gb.ipp_ec = nullptr;
+ gb.scratch_buffer = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ NewPairingState(this->params->G1, &gb, this->params->GT,
+ &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+}
+
+// test that new checks that GT is valid
+TEST_F(PairingTest, NewFailsGivenInvalidGT) {
+ PairingState* ps = nullptr;
+ FiniteField ff;
+ ff.ipp_ff = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewPairingState(this->params->G1, this->params->G2,
+ &ff, &this->t_str, true, &ps));
+ DeletePairingState(&ps);
+}
+///////////////////////////////////////////////////////////////////////
+// Pairing
+TEST_F(PairingTest, PairingWorksFromG1AndG2ToGt) {
+ const bool neg = true;
+
+ GtElemStr r_expected_str = {
+ 0xba, 0x10, 0x1f, 0xf6, 0x46, 0x8b, 0xe9, 0x32, 0x4f, 0xc0, 0xa5, 0x01,
+ 0xad, 0x5e, 0xe2, 0x31, 0x16, 0x29, 0x96, 0xed, 0xa7, 0xde, 0x4c, 0xe1,
+ 0xd2, 0x8d, 0x33, 0xca, 0x50, 0xab, 0x7b, 0xc6, 0x15, 0xeb, 0x79, 0xf4,
+ 0xeb, 0xde, 0x30, 0xb6, 0xc4, 0x07, 0x7c, 0x42, 0xcb, 0x04, 0x54, 0xf2,
+ 0x1f, 0x4d, 0x1f, 0xc0, 0xdf, 0xa2, 0x2b, 0x9e, 0x34, 0xc4, 0x4c, 0x84,
+ 0x14, 0xd3, 0x62, 0x07, 0xf1, 0x8b, 0x84, 0xd1, 0x46, 0x57, 0xb6, 0xe7,
+ 0x80, 0xe1, 0x46, 0x49, 0x1c, 0x0d, 0xef, 0x81, 0x31, 0xb0, 0xbe, 0x8c,
+ 0xb9, 0x08, 0xd0, 0xd3, 0xc4, 0x56, 0xca, 0xad, 0xf9, 0x1d, 0x75, 0x19,
+ 0x3f, 0xee, 0x7c, 0x43, 0xc1, 0xfa, 0x4e, 0x50, 0xb7, 0x19, 0x01, 0x00,
+ 0x6f, 0xd5, 0x16, 0xb6, 0xf4, 0x85, 0xe0, 0xeb, 0x2e, 0x5f, 0x0a, 0x7e,
+ 0xf8, 0xac, 0xbc, 0x05, 0xec, 0x73, 0xb5, 0x57, 0xe3, 0xb3, 0x18, 0x29,
+ 0xbb, 0xef, 0x86, 0x50, 0x87, 0xcf, 0x70, 0xba, 0x13, 0x8b, 0xb1, 0xb6,
+ 0x2d, 0x6f, 0x65, 0x3d, 0xa1, 0x0b, 0xe3, 0x92, 0xc5, 0x72, 0x86, 0x6a,
+ 0xb3, 0xeb, 0xe0, 0xe5, 0xda, 0x0e, 0x57, 0x87, 0xd5, 0xa9, 0x61, 0xa5,
+ 0x1e, 0xcb, 0x04, 0x86, 0xcd, 0xc3, 0x18, 0x2a, 0x36, 0xa0, 0x81, 0x73,
+ 0xe7, 0x13, 0x87, 0x80, 0x8d, 0x1a, 0xfe, 0x6e, 0x4b, 0xa3, 0x13, 0x03,
+ 0x66, 0x9e, 0x80, 0x4d, 0x8a, 0xaa, 0x00, 0x95, 0x72, 0xce, 0xbb, 0x51,
+ 0xe8, 0x01, 0x09, 0x41, 0xd3, 0x63, 0x28, 0x05, 0xa4, 0xbe, 0xd6, 0x41,
+ 0xa6, 0x2f, 0x5f, 0xbf, 0x0b, 0x13, 0xb4, 0x54, 0x5b, 0x50, 0x65, 0xdc,
+ 0x6f, 0x29, 0xd6, 0xda, 0xbf, 0xc2, 0x06, 0xea, 0x3b, 0xb2, 0xf1, 0xd4,
+ 0x26, 0x5c, 0x92, 0x6b, 0x95, 0x6d, 0x88, 0xab, 0x8f, 0xc6, 0x9d, 0x31,
+ 0xe4, 0x9b, 0x71, 0x49, 0xe0, 0xce, 0x97, 0x8f, 0xc9, 0x9f, 0xbc, 0xa8,
+ 0x4a, 0xc6, 0xaa, 0x4a, 0xc8, 0x0d, 0x2a, 0x60, 0x1a, 0x43, 0x40, 0x03,
+ 0xb3, 0x53, 0x30, 0x98, 0x1f, 0x3f, 0xdf, 0x5c, 0x0f, 0xf0, 0x84, 0x8e,
+ 0x5a, 0x5d, 0x41, 0xd2, 0x47, 0x78, 0x6d, 0x9f, 0x89, 0xce, 0xf5, 0x8e,
+ 0xb6, 0x54, 0xa2, 0x26, 0xe5, 0x40, 0x39, 0x5c, 0x59, 0x08, 0xb3, 0xda,
+ 0xf5, 0xf8, 0xa0, 0x18, 0x33, 0x57, 0xd1, 0x72, 0xbb, 0xba, 0x6c, 0xed,
+ 0xe8, 0xa0, 0x5e, 0xc8, 0x81, 0xc5, 0xac, 0x15, 0x1b, 0xd0, 0xe6, 0xc8,
+ 0x92, 0xf9, 0x43, 0x03, 0x5a, 0x00, 0x42, 0xe3, 0x49, 0xa5, 0xf7, 0x19,
+ 0x78, 0x8a, 0x39, 0x89, 0x32, 0xae, 0xbf, 0x4d, 0x4b, 0xb3, 0x33, 0x76,
+ 0x16, 0xfd, 0x0b, 0xfe, 0x42, 0x1e, 0x17, 0x37, 0x2a, 0x04, 0xea, 0x26,
+ 0xba, 0x6e, 0x2c, 0x36, 0xaf, 0x35, 0x1b, 0x75, 0x6d, 0x17, 0xdc, 0x8e,
+ };
+
+ GtElemStr r_str = {0};
+
+ FfElementObj r(&this->params->GT);
+ EcPointObj ga_elem(&this->params->G1, this->ga_elem_str);
+ EcPointObj gb_elem(&this->params->G2, this->gb_elem_str);
+
+ PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, neg, &ps));
+ EXPECT_EQ(kEpidNoErr, Pairing(ps, ga_elem, gb_elem, r));
+ DeletePairingState(&ps);
+
+ THROW_ON_EPIDERR(WriteFfElement(this->params->GT, r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+// test that pairing fails if any options are NULL
+TEST_F(PairingTest, PairingFailsGivenNullParameters) {
+ const bool neg = true;
+
+ FfElementObj r(&this->params->GT);
+ EcPointObj ga_elem(&this->params->G1, this->ga_elem_str);
+ EcPointObj gb_elem(&this->params->G2, this->gb_elem_str);
+
+ PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, neg, &ps));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(NULL, ga_elem, gb_elem, r));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(ps, NULL, gb_elem, r));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(ps, ga_elem, NULL, r));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(ps, ga_elem, gb_elem, NULL));
+ DeletePairingState(&ps);
+}
+// test that pairing checks that the first parameter of the pairing is in a
+// EcGroup, that was used to create pairing state.
+TEST_F(PairingTest, PairingFailsGivenInvalidGaElem) {
+ const bool neg = true;
+
+ FfElementObj r(&this->params->GT);
+ // put G2 element instead of G1
+ EcPointObj mismatched_ga_elem(&this->params->G2, this->gb_elem_str);
+ EcPointObj gb_elem(&this->params->G2, this->gb_elem_str);
+ PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, neg, &ps));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(ps, mismatched_ga_elem, gb_elem, r));
+ DeletePairingState(&ps);
+}
+// test that pairing checks that the second parameter of the pairing is in a
+// EcGroup, that was used to create pairing state.
+TEST_F(PairingTest, PairingFailsGivenInvalidGbElem) {
+ const bool neg = true;
+
+ FfElementObj r(&this->params->GT);
+ EcPointObj ga_elem(&this->params->G1, this->ga_elem_str);
+ // put G1 element instead of G2
+ EcPointObj mismatched_gb_elem(&this->params->G1, this->ga_elem_str);
+ PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewPairingState(this->params->G1, this->params->G2,
+ this->params->GT, &this->t_str, neg, &ps));
+ EXPECT_EQ(kEpidBadArgErr, Pairing(ps, ga_elem, mismatched_gb_elem, r));
+ DeletePairingState(&ps);
+}
+} // namespace
diff --git a/epid/common/math/unittests/printutils-test.cc b/epid/common/math/unittests/printutils-test.cc
new file mode 100644
index 0000000..f012f9d
--- /dev/null
+++ b/epid/common/math/unittests/printutils-test.cc
@@ -0,0 +1,380 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Printutils unit tests.
+ */
+
+#ifndef EPID_ENABLE_DEBUG_PRINT
+#define EPID_ENABLE_DEBUG_PRINT
+#endif
+
+#include <cstring>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/printutils.h"
+}
+#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+
+namespace {
+
+class PrintutilsTest : public ::testing::Test {
+ public:
+ /// Intel(R) EPID 2.0 parameter q
+ static const BigNumStr epid20_q;
+ static const BigNumStr epid20_p;
+ static const FpElemStr p_str;
+ static const FqElemStr beta_str;
+ static const Fq2ElemStr xi_str;
+ static const Fq6ElemStr v_str;
+ static const Fq12ElemStr a_str;
+ static const G1ElemStr g1_str;
+ static const G2ElemStr g2_str;
+ static const FqElemStr a1;
+ static const FqElemStr b1;
+ static const BigNumStr h1;
+ static const G1ElemStr efq_a_str;
+ static const G2ElemStr efq2_a_str;
+
+ BigNumObj q;
+
+ FiniteFieldObj fp;
+ FiniteFieldObj fq;
+ FiniteFieldObj fq2;
+ FiniteFieldObj fq6;
+ FiniteFieldObj fq12;
+
+ FfElementObj fp_elem;
+ FfElementObj fq_beta;
+ FfElementObj fq2_xi;
+ FfElementObj fq6_v;
+ FfElementObj fq12_a;
+
+ EcGroupObj efq;
+ EcPointObj efq_a;
+
+ EcGroupObj efq2;
+ EcPointObj efq2_a;
+
+ public:
+ virtual void SetUp() {
+ q = BigNumObj(epid20_q);
+
+ ConstructFiniteFields();
+ ConstructEllipticCurveGroups();
+ }
+
+ private:
+ void ConstructFiniteFields() {
+ // construct Fp finite field
+ fp = FiniteFieldObj(epid20_p);
+ fp_elem = FfElementObj(&fp, p_str);
+
+ // construct Fq finite field
+ fq = FiniteFieldObj(epid20_q);
+ fq_beta = FfElementObj(&fq, beta_str);
+
+ // construct Fq^2 finite field
+ FfElementObj neg_beta(&fq);
+ THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, beta_str), neg_beta));
+ fq2 = FiniteFieldObj(fq, neg_beta, 2);
+ fq2_xi = FfElementObj(&fq2, xi_str);
+
+ // construct Fq^6 finite field
+ FfElementObj neg_xi(&fq2);
+ THROW_ON_EPIDERR(FfNeg(fq2, FfElementObj(&fq2, xi_str), neg_xi));
+ fq6 = FiniteFieldObj(fq2, neg_xi, 3);
+ fq6_v = FfElementObj(&fq6, v_str);
+
+ // construct Fq^12 finite field
+ FfElementObj neg_v(&fq6);
+ THROW_ON_EPIDERR(FfNeg(fq6, FfElementObj(&fq6, v_str), neg_v));
+ fq12 = FiniteFieldObj(fq6, neg_v, 2);
+ fq12_a = FfElementObj(&fq12, a_str);
+ }
+
+ void ConstructEllipticCurveGroups() {
+ // Create G1
+ // G1 is an elliptic curve group E(Fq).It can be initialized as follows :
+ // Set G1 = E(Fq).init(p, q, n = p, h = 1, a = 0, b, g1.x, g1.y).
+ efq = EcGroupObj(&fq, FfElementObj(&fq), FfElementObj(&fq, b1),
+ FfElementObj(&fq, g1_str.x), FfElementObj(&fq, g1_str.y),
+ BigNumObj(epid20_p), BigNumObj(h1));
+
+ // set h = 2q - p, aka cofactor
+ std::vector<uint8_t> cofactor_str(
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xcd, 0x46, 0xe5, 0xf2, 0x5e,
+ 0xee, 0x71, 0xa4, 0xa0, 0x0c, 0xdc, 0x65, 0xfb, 0x12, 0x96, 0x82,
+ 0xea, 0xb0, 0x25, 0x08, 0x4a, 0x8c, 0x9b, 0x10, 0x19});
+ // set n = p * h, AKA order
+ std::vector<uint8_t> order_str(
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe1, 0x9a, 0x8d, 0xcb, 0xe4,
+ 0xc7, 0x38, 0xfa, 0x9b, 0x98, 0x4d, 0x1c, 0x12, 0x9f, 0x64, 0x97,
+ 0xe8, 0x54, 0xa3, 0x0a, 0x81, 0xac, 0x42, 0xf9, 0x39, 0x16, 0xa7,
+ 0x70, 0x21, 0xdc, 0xfb, 0xb6, 0xe7, 0x7e, 0x1f, 0x5b, 0x55, 0xcc,
+ 0x4e, 0x84, 0xcd, 0x19, 0x4f, 0x49, 0x20, 0x94, 0xb5, 0xd8, 0x12,
+ 0xa0, 0x2e, 0x7f, 0x40, 0x13, 0xb2, 0xfa, 0xa1, 0x45});
+
+ // Compute xi' = Fq2.inverse(xi).
+ FfElementObj inv_xi(&fq2);
+ THROW_ON_EPIDERR(FfInv(fq2, FfElementObj(&fq2, xi_str), inv_xi));
+ // Compute b' = Fq2.mul(xi', b).
+ FfElementObj b_dash(&fq2);
+ THROW_ON_EPIDERR(FfMul(fq2, inv_xi.get(), FfElementObj(&fq, b1), b_dash));
+
+ // Set G2 = E(Fq2).init(p, param(Fq2), n, h, 0, b', g2.x, g2.y)
+ efq2 = EcGroupObj(&fq2, FfElementObj(&fq2), b_dash,
+ FfElementObj(&fq2, &g2_str.x, sizeof(g2_str.x)),
+ FfElementObj(&fq2, &g2_str.y, sizeof(g2_str.y)),
+ BigNumObj(order_str), BigNumObj(cofactor_str));
+
+ efq_a = EcPointObj(&efq, efq_a_str);
+ efq2_a = EcPointObj(&efq2, efq2_a_str);
+ }
+};
+/// Intel(R) EPID 2.0 parameter q
+const BigNumStr PrintutilsTest::epid20_q = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13};
+const BigNumStr PrintutilsTest::epid20_p = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+const FpElemStr PrintutilsTest::p_str = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x00};
+const FqElemStr PrintutilsTest::beta_str = {
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98,
+ 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}};
+const Fq2ElemStr PrintutilsTest::xi_str = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}}};
+const Fq6ElemStr PrintutilsTest::v_str = {
+ {{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}};
+const Fq12ElemStr PrintutilsTest::a_str = {
+ 0xba, 0x10, 0x1f, 0xf6, 0x46, 0x8b, 0xe9, 0x32, 0x4f, 0xc0, 0xa5, 0x01,
+ 0xad, 0x5e, 0xe2, 0x31, 0x16, 0x29, 0x96, 0xed, 0xa7, 0xde, 0x4c, 0xe1,
+ 0xd2, 0x8d, 0x33, 0xca, 0x50, 0xab, 0x7b, 0xc6, 0x15, 0xeb, 0x79, 0xf4,
+ 0xeb, 0xde, 0x30, 0xb6, 0xc4, 0x07, 0x7c, 0x42, 0xcb, 0x04, 0x54, 0xf2,
+ 0x1f, 0x4d, 0x1f, 0xc0, 0xdf, 0xa2, 0x2b, 0x9e, 0x34, 0xc4, 0x4c, 0x84,
+ 0x14, 0xd3, 0x62, 0x07, 0xf1, 0x8b, 0x84, 0xd1, 0x46, 0x57, 0xb6, 0xe7,
+ 0x80, 0xe1, 0x46, 0x49, 0x1c, 0x0d, 0xef, 0x81, 0x31, 0xb0, 0xbe, 0x8c,
+ 0xb9, 0x08, 0xd0, 0xd3, 0xc4, 0x56, 0xca, 0xad, 0xf9, 0x1d, 0x75, 0x19,
+ 0x3f, 0xee, 0x7c, 0x43, 0xc1, 0xfa, 0x4e, 0x50, 0xb7, 0x19, 0x01, 0x00,
+ 0x6f, 0xd5, 0x16, 0xb6, 0xf4, 0x85, 0xe0, 0xeb, 0x2e, 0x5f, 0x0a, 0x7e,
+ 0xf8, 0xac, 0xbc, 0x05, 0xec, 0x73, 0xb5, 0x57, 0xe3, 0xb3, 0x18, 0x29,
+ 0xbb, 0xef, 0x86, 0x50, 0x87, 0xcf, 0x70, 0xba, 0x13, 0x8b, 0xb1, 0xb6,
+ 0x2d, 0x6f, 0x65, 0x3d, 0xa1, 0x0b, 0xe3, 0x92, 0xc5, 0x72, 0x86, 0x6a,
+ 0xb3, 0xeb, 0xe0, 0xe5, 0xda, 0x0e, 0x57, 0x87, 0xd5, 0xa9, 0x61, 0xa5,
+ 0x1e, 0xcb, 0x04, 0x86, 0xcd, 0xc3, 0x18, 0x2a, 0x36, 0xa0, 0x81, 0x73,
+ 0xe7, 0x13, 0x87, 0x80, 0x8d, 0x1a, 0xfe, 0x6e, 0x4b, 0xa3, 0x13, 0x03,
+ 0x66, 0x9e, 0x80, 0x4d, 0x8a, 0xaa, 0x00, 0x95, 0x72, 0xce, 0xbb, 0x51,
+ 0xe8, 0x01, 0x09, 0x41, 0xd3, 0x63, 0x28, 0x05, 0xa4, 0xbe, 0xd6, 0x41,
+ 0xa6, 0x2f, 0x5f, 0xbf, 0x0b, 0x13, 0xb4, 0x54, 0x5b, 0x50, 0x65, 0xdc,
+ 0x6f, 0x29, 0xd6, 0xda, 0xbf, 0xc2, 0x06, 0xea, 0x3b, 0xb2, 0xf1, 0xd4,
+ 0x26, 0x5c, 0x92, 0x6b, 0x95, 0x6d, 0x88, 0xab, 0x8f, 0xc6, 0x9d, 0x31,
+ 0xe4, 0x9b, 0x71, 0x49, 0xe0, 0xce, 0x97, 0x8f, 0xc9, 0x9f, 0xbc, 0xa8,
+ 0x4a, 0xc6, 0xaa, 0x4a, 0xc8, 0x0d, 0x2a, 0x60, 0x1a, 0x43, 0x40, 0x03,
+ 0xb3, 0x53, 0x30, 0x98, 0x1f, 0x3f, 0xdf, 0x5c, 0x0f, 0xf0, 0x84, 0x8e,
+ 0x5a, 0x5d, 0x41, 0xd2, 0x47, 0x78, 0x6d, 0x9f, 0x89, 0xce, 0xf5, 0x8e,
+ 0xb6, 0x54, 0xa2, 0x26, 0xe5, 0x40, 0x39, 0x5c, 0x59, 0x08, 0xb3, 0xda,
+ 0xf5, 0xf8, 0xa0, 0x18, 0x33, 0x57, 0xd1, 0x72, 0xbb, 0xba, 0x6c, 0xed,
+ 0xe8, 0xa0, 0x5e, 0xc8, 0x81, 0xc5, 0xac, 0x15, 0x1b, 0xd0, 0xe6, 0xc8,
+ 0x92, 0xf9, 0x43, 0x03, 0x5a, 0x00, 0x42, 0xe3, 0x49, 0xa5, 0xf7, 0x19,
+ 0x78, 0x8a, 0x39, 0x89, 0x32, 0xae, 0xbf, 0x4d, 0x4b, 0xb3, 0x33, 0x76,
+ 0x16, 0xfd, 0x0b, 0xfe, 0x42, 0x1e, 0x17, 0x37, 0x2a, 0x04, 0xea, 0x26,
+ 0xba, 0x6e, 0x2c, 0x36, 0xaf, 0x35, 0x1b, 0x75, 0x6d, 0x17, 0xdc, 0x8e,
+};
+const FqElemStr PrintutilsTest::a1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}};
+const FqElemStr PrintutilsTest::b1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}};
+const BigNumStr PrintutilsTest::h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+const G1ElemStr PrintutilsTest::g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+const G2ElemStr PrintutilsTest::g2_str = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
+const G1ElemStr PrintutilsTest::efq_a_str = {
+ {{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0x78, 0x65, 0x28, 0xCB, 0xAF, 0x07, 0x52, 0x50, 0x55, 0x7A, 0x5F,
+ 0x30, 0x0A, 0xC0, 0xB4, 0x6B, 0xEA, 0x6F, 0xE2, 0xF6, 0x6D, 0x96,
+ 0xF7, 0xCD, 0xC8, 0xD3, 0x12, 0x7F, 0x1F, 0x3A, 0x8B, 0x42}}}};
+const G2ElemStr PrintutilsTest::efq2_a_str = {
+ {
+ {0x2F, 0x8C, 0xC7, 0xD7, 0xD4, 0x1E, 0x4A, 0xCB, 0x82, 0x92, 0xC7,
+ 0x9C, 0x0F, 0xA2, 0xF2, 0x1B, 0xDF, 0xEA, 0x96, 0x64, 0x8B, 0xA2,
+ 0x32, 0x7C, 0xDF, 0xD8, 0x89, 0x10, 0xFD, 0xBB, 0x38, 0xCD},
+ {0xB1, 0x23, 0x46, 0x13, 0x4D, 0x9B, 0x8E, 0x8A, 0x95, 0x64, 0xDD,
+ 0x37, 0x29, 0x44, 0x1F, 0x76, 0xB5, 0x3A, 0x47, 0xD3, 0xE0, 0x18,
+ 0x1E, 0x60, 0xE9, 0x94, 0x13, 0xA4, 0x47, 0xCD, 0xBE, 0x03},
+ },
+ {
+ {0xD3, 0x67, 0xA5, 0xCC, 0xEF, 0x7B, 0xD1, 0x8D, 0x4A, 0x7F, 0xF1,
+ 0x8F, 0x66, 0xCB, 0x5E, 0x86, 0xAC, 0xCB, 0x36, 0x5F, 0x29, 0x90,
+ 0x28, 0x55, 0xF0, 0xDC, 0x6E, 0x8B, 0x87, 0xB5, 0xD8, 0x32},
+ {0x6C, 0x0A, 0xC5, 0x58, 0xB1, 0x4E, 0xCA, 0x85, 0x44, 0x3E, 0xDE,
+ 0x71, 0x9B, 0xC7, 0x90, 0x19, 0x06, 0xD2, 0xA0, 0x4E, 0xC7, 0x33,
+ 0xF4, 0x5C, 0xE8, 0x16, 0xE2, 0x67, 0xDB, 0xBF, 0x64, 0x84},
+ },
+};
+
+TEST_F(PrintutilsTest, DISABLED_PrintutilsWorkWithAnnotatedFormat) {
+ // Test intentionally disabled and has no predicate.
+ // Enable for manual output inspection.
+
+ PrintBigNum(q, "q");
+ PrintFfElement(fp, fp_elem, "fp_elem", kPrintUtilAnnotated);
+ PrintFfElement(fq, fq_beta, "fq_beta", kPrintUtilAnnotated);
+ PrintFfElement(fq2, fq2_xi, "fq2_xi", kPrintUtilAnnotated);
+ PrintFfElement(fq6, fq6_v, "fq6_v", kPrintUtilAnnotated);
+ PrintFfElement(fq12, fq12_a, "fq12_a", kPrintUtilAnnotated);
+ PrintEcPoint(efq, efq_a, "efq_a", kPrintUtilAnnotated);
+ PrintEcPoint(efq2, efq2_a, "efq2_a", kPrintUtilAnnotated);
+
+ PrintBigNumStr(&epid20_q, "q_str");
+ PrintFqElemStr(&beta_str, "fq_beta_str");
+ PrintFq2ElemStr(&xi_str, "fq2_xi_str", kPrintUtilAnnotated);
+ PrintFq6ElemStr(&v_str, "fq6_v_str", kPrintUtilAnnotated);
+ PrintFq12ElemStr(&a_str, "fq12_a_str", kPrintUtilAnnotated);
+ PrintG1ElemStr(&efq_a_str, "efq_a_str", kPrintUtilAnnotated);
+ PrintG2ElemStr(&efq2_a_str, "efq_a_str", kPrintUtilAnnotated);
+}
+
+TEST_F(PrintutilsTest, DISABLED_PrintutilsWorkWithUnannotatedFormat) {
+ // Test intentionally disabled and has no predicate.
+ // Enable for manual output inspection.
+
+ PrintFfElement(fp, fp_elem, "fp_elem", kPrintUtilUnannotated);
+ PrintFfElement(fq, fq_beta, "fq_beta", kPrintUtilUnannotated);
+ PrintFfElement(fq2, fq2_xi, "fq2_xi", kPrintUtilUnannotated);
+ PrintFfElement(fq6, fq6_v, "fq6_v", kPrintUtilUnannotated);
+ PrintFfElement(fq12, fq12_a, "fq12_a", kPrintUtilUnannotated);
+ PrintEcPoint(efq, efq_a, "efq_a", kPrintUtilUnannotated);
+ PrintEcPoint(efq2, efq2_a, "efq2_a", kPrintUtilUnannotated);
+
+ PrintFq2ElemStr(&xi_str, "fq2_xi_str", kPrintUtilUnannotated);
+ PrintFq6ElemStr(&v_str, "fq6_v_str", kPrintUtilUnannotated);
+ PrintFq12ElemStr(&a_str, "fq12_a_str", kPrintUtilUnannotated);
+ PrintG1ElemStr(&efq_a_str, "efq_a_str", kPrintUtilUnannotated);
+ PrintG2ElemStr(&efq2_a_str, "efq_a_str", kPrintUtilUnannotated);
+}
+
+TEST_F(PrintutilsTest, DISABLED_PrintutilsReportNullPtr) {
+ // Test intentionally disabled and has no predicate.
+ // Enable for manual output inspection.
+
+ PrintBigNum(nullptr, "q");
+
+ PrintFfElement(nullptr, fp_elem, "fp_elem", kPrintUtilUnannotated);
+ PrintFfElement(fp, nullptr, "fp_elem", kPrintUtilUnannotated);
+
+ PrintFfElement(nullptr, fq_beta, "fq_beta", kPrintUtilUnannotated);
+ PrintFfElement(fq, nullptr, "fq_beta", kPrintUtilUnannotated);
+
+ PrintEcPoint(nullptr, efq_a, "efq_a", kPrintUtilUnannotated);
+ PrintEcPoint(efq, nullptr, "efq_a", kPrintUtilUnannotated);
+
+ PrintBigNumStr(nullptr, "q_str");
+ PrintFqElemStr(nullptr, "fq_beta_str");
+ PrintFq2ElemStr(nullptr, "fq2_xi_str", kPrintUtilAnnotated);
+ PrintFq6ElemStr(nullptr, "fq6_v_str", kPrintUtilAnnotated);
+ PrintFq12ElemStr(nullptr, "fq12_a_str", kPrintUtilAnnotated);
+ PrintG1ElemStr(nullptr, "efq_a_str", kPrintUtilAnnotated);
+ PrintG2ElemStr(nullptr, "efq_a_str", kPrintUtilAnnotated);
+}
+
+TEST_F(PrintutilsTest, DISABLED_PrintutilsReportInvalidArgument) {
+ // Test intentionally disabled and has no predicate.
+ // Enable for manual output inspection.
+
+ PrintFfElement(fp, fp_elem, "fp_elem", (PrintUtilFormat)100);
+ PrintFfElement(fq, fq_beta, "fq_beta", (PrintUtilFormat)100);
+ PrintFfElement(fq2, fq2_xi, "fq2_xi", (PrintUtilFormat)100);
+ PrintFfElement(fq6, fq6_v, "fq6_v", (PrintUtilFormat)100);
+ PrintFfElement(fq12, fq12_a, "fq12_a", (PrintUtilFormat)100);
+ PrintEcPoint(efq, efq_a, "efq_a", (PrintUtilFormat)100);
+ PrintEcPoint(efq2, efq2_a, "efq2_a", (PrintUtilFormat)100);
+
+ PrintFq2ElemStr(&xi_str, "fq2_xi_str", (PrintUtilFormat)100);
+ PrintFq6ElemStr(&v_str, "fq6_v_str", (PrintUtilFormat)100);
+ PrintFq12ElemStr(&a_str, "fq12_a_str", (PrintUtilFormat)100);
+ PrintG1ElemStr(&efq_a_str, "efq_a_str", (PrintUtilFormat)100);
+ PrintG2ElemStr(&efq2_a_str, "efq_a_str", (PrintUtilFormat)100);
+}
+
+} // namespace
diff --git a/epid/common/math/unittests/tatepairing-test.cc b/epid/common/math/unittests/tatepairing-test.cc
new file mode 100644
index 0000000..8eb6f06
--- /dev/null
+++ b/epid/common/math/unittests/tatepairing-test.cc
@@ -0,0 +1,232 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 Pairing unit tests.
+ */
+
+#include <cstring>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/1.1/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+
+extern "C" {
+#include "epid/common/math/tatepairing.h"
+}
+
+/// compares Epid11GtElemStr values
+bool operator==(Epid11GtElemStr const& lhs, Epid11GtElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+class Epid11PairingTest : public ::testing::Test {
+ public:
+ virtual void SetUp() { params = new Epid11ParamsObj(); }
+ virtual void TearDown() { delete params; }
+
+ static const Epid11G1ElemStr kGaElemStr;
+ static const Epid11G2ElemStr kGbElemStr;
+ Epid11ParamsObj* params;
+};
+
+const Epid11G1ElemStr Epid11PairingTest::kGaElemStr = {
+ 0x02, 0x5A, 0xC4, 0xC5, 0xCD, 0x7D, 0xAA, 0xFD, 0x26, 0xE5, 0x0B,
+ 0xA9, 0xB4, 0xE1, 0x72, 0xA1, 0x65, 0x2D, 0x84, 0xAD, 0x34, 0x34,
+ 0xF8, 0x62, 0x98, 0x6A, 0x15, 0xBE, 0xEA, 0xE3, 0xCC, 0x56, 0x05,
+ 0x70, 0x5F, 0x4F, 0x11, 0xAF, 0x45, 0xCF, 0x04, 0x1B, 0x96, 0xAD,
+ 0xEB, 0x26, 0xEE, 0x95, 0x65, 0x4B, 0xD3, 0xD6, 0x5C, 0x13, 0x76,
+ 0xB7, 0x7A, 0xA1, 0xC6, 0xDA, 0xED, 0x5A, 0x40, 0xCE};
+
+const Epid11G2ElemStr Epid11PairingTest::kGbElemStr = {
+ 0x02, 0x10, 0x9A, 0xF4, 0x06, 0x32, 0x30, 0x89, 0xCB, 0x95, 0xE9, 0x55,
+ 0x0E, 0x9D, 0xAF, 0x0E, 0x98, 0xCD, 0xCA, 0xDC, 0xB1, 0xFF, 0xFC, 0xD1,
+ 0x45, 0x66, 0xBB, 0x86, 0x46, 0x1E, 0x8C, 0x30, 0x04, 0x78, 0x53, 0xE1,
+ 0x3F, 0x96, 0xC5, 0xE4, 0x15, 0x23, 0x7B, 0x1F, 0x3F, 0x2C, 0xD3, 0x95,
+ 0x40, 0xBC, 0x7A, 0x31, 0x1F, 0x14, 0x38, 0x9E, 0x1A, 0xA5, 0xD6, 0x63,
+ 0x10, 0x91, 0xE4, 0xD3, 0x00, 0xB4, 0x02, 0xBC, 0x47, 0xFA, 0xA6, 0x29,
+ 0x82, 0x0B, 0xB1, 0xD5, 0xFF, 0xF2, 0xE6, 0xB0, 0xC6, 0xAE, 0xE8, 0x7B,
+ 0x91, 0xD9, 0xEE, 0x66, 0x07, 0x1F, 0xFD, 0xA2, 0xE7, 0x02, 0x66, 0xDD,
+ 0x05, 0x2E, 0xF8, 0xC6, 0xC1, 0x6A, 0xEF, 0x3C, 0xC1, 0x95, 0xF6, 0x26,
+ 0xCE, 0x5E, 0x55, 0xD1, 0x64, 0x13, 0x28, 0xB1, 0x18, 0x57, 0xD8, 0x1B,
+ 0x84, 0xFA, 0xEC, 0x7E, 0x5D, 0x99, 0x06, 0x49, 0x05, 0x73, 0x35, 0xA9,
+ 0xA7, 0xF2, 0xA1, 0x92, 0x5F, 0x3E, 0x7C, 0xDF, 0xAC, 0xFE, 0x0F, 0xF5,
+ 0x08, 0xD0, 0x3C, 0xAE, 0xCD, 0x58, 0x00, 0x5F, 0xD0, 0x84, 0x7E, 0xEA,
+ 0x63, 0x57, 0xFE, 0xC6, 0x01, 0x56, 0xDA, 0xF3, 0x72, 0x61, 0xDA, 0xC6,
+ 0x93, 0xB0, 0xAC, 0xEF, 0xAA, 0xD4, 0x51, 0x6D, 0xCA, 0x71, 0x1E, 0x06,
+ 0x73, 0xEA, 0x83, 0xB2, 0xB1, 0x99, 0x4A, 0x4D, 0x4A, 0x0D, 0x35, 0x07};
+
+///////////////////////////////////////////////////////////////////////
+// NewEpid11PairingState / DeleteEpid11PairingState
+
+// test that delete works in a "normal" valid case.
+TEST_F(Epid11PairingTest, DeleteWorksGivenNewlyCreatedPairingState) {
+ Epid11PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ EXPECT_NO_THROW(DeleteEpid11PairingState(&ps));
+}
+
+// test that delete works if there is nothing to do
+TEST_F(Epid11PairingTest, DeleteWorksGivenNullPointer) {
+ EXPECT_NO_THROW(DeleteEpid11PairingState(nullptr));
+ Epid11PairingState* ps = nullptr;
+ EXPECT_NO_THROW(DeleteEpid11PairingState(&ps));
+}
+
+// test that new succeeds with valid parameters
+TEST_F(Epid11PairingTest, NewSucceedsGivenValidParameters) {
+ Epid11PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidNoErr,
+ NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ DeleteEpid11PairingState(&ps);
+}
+
+// test that new fails if any options are NULL
+TEST_F(Epid11PairingTest, NewFailsGivenNullParameters) {
+ Epid11PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewEpid11PairingState(nullptr, this->params->G2,
+ this->params->GT, &ps));
+ DeleteEpid11PairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr, NewEpid11PairingState(this->params->G1, nullptr,
+ this->params->GT, &ps));
+ DeleteEpid11PairingState(&ps);
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ NewEpid11PairingState(this->params->G1, this->params->G2, nullptr, &ps));
+ DeleteEpid11PairingState(&ps);
+ EXPECT_EQ(kEpidBadArgErr,
+ NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, nullptr));
+}
+
+// test that new checks that G1 is valid
+TEST_F(Epid11PairingTest, NewFailsGivenInvalidG1) {
+ Epid11PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ NewEpid11PairingState(this->params->G2, this->params->G2,
+ this->params->GT, &ps));
+ DeleteEpid11PairingState(&ps);
+}
+
+// test that new checks that G2 is valid
+TEST_F(Epid11PairingTest, NewFailsGivenInvalidG2) {
+ Epid11PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ NewEpid11PairingState(this->params->G1, this->params->G1,
+ this->params->GT, &ps));
+ DeleteEpid11PairingState(&ps);
+}
+
+// test that new checks that GT is valid
+TEST_F(Epid11PairingTest, NewFailsGivenInvalidGT) {
+ FiniteFieldObj GFp;
+ Epid11PairingState* ps = nullptr;
+ EXPECT_EQ(kEpidBadArgErr, NewEpid11PairingState(this->params->G1,
+ this->params->G2, GFp, &ps));
+ DeleteEpid11PairingState(&ps);
+}
+///////////////////////////////////////////////////////////////////////
+// Pairing
+TEST_F(Epid11PairingTest, PairingWorksFromG1AndG2ToGt) {
+ Epid11GtElemStr r_expected_str = {
+ 0x02, 0xE1, 0x84, 0x16, 0x53, 0x10, 0x0E, 0xEC, 0xFB, 0xDE, 0xF3, 0x5E,
+ 0x2E, 0x26, 0xEE, 0x45, 0x0C, 0xD7, 0x97, 0xA7, 0x35, 0x43, 0x08, 0x5E,
+ 0x03, 0xB9, 0xFE, 0x91, 0x8A, 0x02, 0x14, 0xB4, 0x07, 0x7F, 0x8A, 0x5E,
+ 0xFD, 0xE1, 0x83, 0xC9, 0xCE, 0x1C, 0xC9, 0xF1, 0xCC, 0xB0, 0x52, 0x81,
+ 0xAD, 0x80, 0x2D, 0x13, 0x1C, 0x32, 0xEC, 0xAF, 0xA0, 0x8B, 0x66, 0x05,
+ 0x0A, 0x89, 0x26, 0xAD, 0x06, 0x75, 0x3B, 0x3B, 0xE5, 0xFB, 0x62, 0x20,
+ 0xA8, 0xC3, 0x91, 0xC6, 0x26, 0xC6, 0x58, 0x71, 0xB1, 0x85, 0x06, 0xBD,
+ 0xAE, 0x06, 0x51, 0xF9, 0x86, 0x2A, 0xC1, 0x5A, 0x11, 0xBA, 0x17, 0xE1,
+ 0x01, 0x4B, 0x22, 0x66, 0xEB, 0xCF, 0x7E, 0x2B, 0xE7, 0x0A, 0xF2, 0x77,
+ 0x1C, 0xE6, 0x48, 0x8F, 0x3E, 0xD8, 0x7D, 0x71, 0xF1, 0x78, 0x4C, 0x80,
+ 0x93, 0xF8, 0x08, 0xB7, 0xCB, 0xAF, 0x04, 0xDF, 0x04, 0x5C, 0x19, 0x3C,
+ 0xD3, 0x29, 0x11, 0xE7, 0xC5, 0x58, 0x68, 0xEA, 0x65, 0xBB, 0x48, 0x5F,
+ 0x3A, 0x62, 0xD9, 0x62, 0x40, 0x57, 0x53, 0x19, 0x9B, 0xB5, 0x6C, 0x52,
+ 0x0C, 0x33, 0x27, 0x14, 0x06, 0x6A, 0xAD, 0xB0, 0x38, 0x41, 0xD0, 0xA5,
+ 0x37, 0x54, 0xC5, 0x3E, 0x3B, 0x5F, 0x1A, 0xAF, 0x75, 0x8F, 0xCA, 0x42,
+ 0xB9, 0xA6, 0x1E, 0x18, 0xB2, 0x6B, 0x31, 0x7D, 0x5C, 0xC6, 0xE8, 0xDC};
+
+ Epid11GtElemStr r_str = {0};
+
+ FfElementObj r(&this->params->GT);
+ EcPointObj ga_elem(&this->params->G1, this->kGaElemStr);
+ EcPointObj gb_elem(&this->params->G2, this->kGbElemStr);
+
+ Epid11PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ EXPECT_EQ(kEpidNoErr, Epid11Pairing(ps, ga_elem, gb_elem, r));
+ DeleteEpid11PairingState(&ps);
+
+ THROW_ON_EPIDERR(WriteFfElement(this->params->GT, r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+
+TEST_F(Epid11PairingTest, PairingGivenPointAtInfinityReturns1) {
+ Epid11GtElemStr r_expected_str = {0};
+ r_expected_str.a[0].a[0].data.data[31] = 1;
+
+ Epid11GtElemStr r_str = {0};
+
+ FfElementObj r(&this->params->GT);
+ EcPointObj ga_elem(&this->params->G1);
+ EcPointObj gb_elem(&this->params->G2, this->kGbElemStr);
+
+ Epid11PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ EXPECT_EQ(kEpidNoErr, Epid11Pairing(ps, ga_elem, gb_elem, r));
+ DeleteEpid11PairingState(&ps);
+
+ THROW_ON_EPIDERR(WriteFfElement(this->params->GT, r, &r_str, sizeof(r_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+
+TEST_F(Epid11PairingTest, PairingFailsOnPointMissmatch) {
+ FfElementObj r(&this->params->GT);
+
+ EcPointObj ga_elem(&this->params->G1, this->kGaElemStr);
+ EcPointObj gb_elem(&this->params->G2, this->kGbElemStr);
+
+ Epid11PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ EXPECT_EQ(kEpidBadArgErr, Epid11Pairing(ps, gb_elem, ga_elem, r));
+ DeleteEpid11PairingState(&ps);
+}
+
+TEST_F(Epid11PairingTest, PairingFailsOnInvalidPointInG1) {
+ FfElementObj r(&this->params->GT);
+
+ EcPointObj ga_elem(&this->params->G3);
+ EcPointObj gb_elem(&this->params->G2, this->kGbElemStr);
+
+ Epid11PairingState* ps = nullptr;
+ THROW_ON_EPIDERR(NewEpid11PairingState(this->params->G1, this->params->G2,
+ this->params->GT, &ps));
+ EXPECT_EQ(kEpidBadArgErr, Epid11Pairing(ps, gb_elem, ga_elem, r));
+ DeleteEpid11PairingState(&ps);
+}
+
+} // namespace
diff --git a/epid/common/src/commitment.c b/epid/common/src/commitment.c
new file mode 100644
index 0000000..24b8936
--- /dev/null
+++ b/epid/common/src/commitment.c
@@ -0,0 +1,124 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Commitment hash implementation.
+ */
+#include "epid/common/src/commitment.h"
+
+#include <limits.h>
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/memory.h"
+
+EpidStatus SetKeySpecificCommitValues(GroupPubKey const* pub_key,
+ CommitValues* values) {
+ static const Epid2Params params = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ if (!pub_key || !values) return kEpidBadArgErr;
+
+ values->p = params.p;
+ values->g1 = params.g1;
+ values->g2 = params.g2;
+ values->h1 = pub_key->h1;
+ values->h2 = pub_key->h2;
+ values->w = pub_key->w;
+
+ return kEpidNoErr;
+}
+
+EpidStatus SetCalculatedCommitValues(G1ElemStr const* B, G1ElemStr const* K,
+ G1ElemStr const* T, EcPoint const* R1,
+ EcGroup* G1, FfElement const* R2,
+ FiniteField* GT, CommitValues* values) {
+ EpidStatus sts;
+
+ if (!B || !K || !T || !R1 || !G1 || !R2 || !GT || !values) {
+ return kEpidBadArgErr;
+ }
+
+ values->B = *B;
+ values->K = *K;
+ values->T = *T;
+
+ sts = WriteEcPoint(G1, R1, &values->R1, sizeof(values->R1));
+ if (kEpidNoErr != sts) return sts;
+ sts = WriteFfElement(GT, R2, &values->R2, sizeof(values->R2));
+ if (kEpidNoErr != sts) return sts;
+
+ return kEpidNoErr;
+}
+
+EpidStatus CalculateCommitmentHash(CommitValues const* values, FiniteField* Fp,
+ HashAlg hash_alg, void const* msg,
+ size_t msg_len, FfElement* c) {
+ EpidStatus sts;
+
+ FfElement* t3 = NULL;
+ size_t t3mconcat_size = sizeof(FpElemStr) + msg_len;
+ uint8_t* t3mconcat_buf = NULL;
+
+ if (!values || !Fp || !c) return kEpidBadArgErr;
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (SIZE_MAX - sizeof(FpElemStr) < msg_len) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ sts = NewFfElement(Fp, &t3);
+ if (kEpidNoErr != sts) break;
+
+ // compute t3 = Fp.hash(p || g1 || g2 || h1 ||
+ // h2 || w || B || K || T || R1 || R2).
+ sts = FfHash(Fp, values, sizeof(*values), hash_alg, t3);
+ if (kEpidNoErr != sts) break;
+
+ // compute c = Fp.hash(t3 || m).
+ t3mconcat_buf = SAFE_ALLOC(t3mconcat_size);
+ if (!t3mconcat_buf) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ // get t3 into buffer
+ sts = WriteFfElement(Fp, t3, t3mconcat_buf, sizeof(FpElemStr));
+ if (kEpidNoErr != sts) break;
+ // get m into buffer
+ if (msg) {
+ // Memory copy is used to copy a message of variable length
+ if (0 != memcpy_S(t3mconcat_buf + sizeof(FpElemStr),
+ t3mconcat_size - sizeof(FpElemStr), msg, msg_len)) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ }
+
+ sts = FfHash(Fp, t3mconcat_buf, t3mconcat_size, hash_alg, c);
+ if (kEpidNoErr != sts) break;
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(t3mconcat_buf);
+ DeleteFfElement(&t3);
+
+ return sts;
+}
diff --git a/epid/common/src/commitment.h b/epid/common/src/commitment.h
new file mode 100644
index 0000000..d23274e
--- /dev/null
+++ b/epid/common/src/commitment.h
@@ -0,0 +1,125 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_COMMITMENT_H_
+#define EPID_COMMON_SRC_COMMITMENT_H_
+/*!
+ * \file
+ * \brief Commitment hash interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+typedef struct FiniteField FiniteField;
+typedef struct EcPoint EcPoint;
+typedef struct EcGroup EcGroup;
+typedef struct FfElement FfElement;
+
+#pragma pack(1)
+/// Storage for values to create commitment in Sign and Verify algorithms
+typedef struct CommitValues {
+ BigNumStr p; ///< Intel(R) EPID2.0 parameter p
+ G1ElemStr g1; ///< Intel(R) EPID2.0 parameter g1
+ G2ElemStr g2; ///< Intel(R) EPID2.0 parameter g2
+ G1ElemStr h1; ///< Group public key value h1
+ G1ElemStr h2; ///< Group public key value h2
+ G2ElemStr w; ///< Group public key value w
+ G1ElemStr B; ///< Variable B computed in algorithm
+ G1ElemStr K; ///< Variable K computed in algorithm
+ G1ElemStr T; ///< Variable T computed in algorithm
+ G1ElemStr R1; ///< Variable R1 computed in algorithm
+ GtElemStr R2; ///< Variable R2 computed in algorithm
+} CommitValues;
+#pragma pack()
+
+/// Set group public key related fields from CommitValues structure
+/*!
+ Set p, g1, g2, h1, h2 and w fields of values argument.
+
+ \param[in] pub_key
+ Group public key
+ \param[out] values
+ Pointer to CommitValues structure to fill.
+
+ \returns ::EpidStatus
+
+ \see CalculateCommitmentHash
+*/
+EpidStatus SetKeySpecificCommitValues(GroupPubKey const* pub_key,
+ CommitValues* values);
+
+/// Set CommitValues structure fields calculated in algorithm
+/*!
+ Set B, K, T, R1 and R2 fields of values argument.
+
+ \param[in] B
+ Value of B to set
+ \param[in] K
+ Value of K to set
+ \param[in] T
+ Value of T to set
+ \param[in] R1
+ Value of R1 to set
+ \param[in] G1
+ EcGroup containing element R1
+ \param[in] R2
+ Value of R2 to set
+ \param[in] GT
+ FiniteField containing element R2
+ \param[out] values
+ Pointer to CommitValues structure to fill.
+
+ \returns ::EpidStatus
+
+ \see CalculateCommitmentHash
+*/
+EpidStatus SetCalculatedCommitValues(G1ElemStr const* B, G1ElemStr const* K,
+ G1ElemStr const* T, EcPoint const* R1,
+ EcGroup* G1, FfElement const* R2,
+ FiniteField* GT, CommitValues* values);
+
+/// Calculate Fp.hash(t3 || m) for Sign and Verfiy algorithms
+/*!
+ Calculate c = Fp.hash(t3 || m) where t3 is
+ Fp.hash(p || g1 || g2 || h1 || h2 || w || B || K || T || R1 || R2).
+
+ \param[in] values
+ Commit values to hash
+ \param[in] Fp
+ Finite field to perfom hash operation in
+ \param[in] hash_alg
+ Hash algorithm to use
+ \param[in] msg
+ Message to hash
+ \param[in] msg_len
+ Size of msg buffer in bytes
+ \param[out] c
+ Result of calculation
+
+ \returns ::EpidStatus
+
+ \see SetKeySpecificCommitValues
+ \see SetCalculatedCommitValues
+*/
+EpidStatus CalculateCommitmentHash(CommitValues const* values, FiniteField* Fp,
+ HashAlg hash_alg, void const* msg,
+ size_t msg_len, FfElement* c);
+
+/*! @} */
+#endif // EPID_COMMON_SRC_COMMITMENT_H_
diff --git a/epid/common/src/endian_convert.h b/epid/common/src/endian_convert.h
new file mode 100644
index 0000000..2336f7e
--- /dev/null
+++ b/epid/common/src/endian_convert.h
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_ENDIAN_CONVERT_H_
+#define EPID_COMMON_SRC_ENDIAN_CONVERT_H_
+
+#include <stdint.h>
+
+/*!
+ * \file
+ * \brief Endianness conversion interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+
+#if !defined(ntohl)
+/// Macro to transform oct str 32 into uint_32
+#define ntohl(u32) \
+ ((uint32_t)(((((unsigned char*)&(u32))[0]) << 24) + \
+ ((((unsigned char*)&(u32))[1]) << 16) + \
+ ((((unsigned char*)&(u32))[2]) << 8) + \
+ (((unsigned char*)&(u32))[3])))
+#endif
+
+#if !defined(htonl)
+/// Macro to transform uint_32 to network order
+#define htonl(u32) \
+ (uint32_t)(((((uint32_t)(u32)) & 0xFF) << 24) | \
+ ((((uint32_t)(u32)) & 0xFF00) << 8) | \
+ ((((uint32_t)(u32)) & 0xFF0000) >> 8) | \
+ ((((uint32_t)(u32)) & 0xFF000000) >> 24))
+#endif
+
+/*! @} */
+#endif // EPID_COMMON_SRC_ENDIAN_CONVERT_H_
diff --git a/epid/common/src/epid2params.c b/epid/common/src/epid2params.c
new file mode 100644
index 0000000..2679935
--- /dev/null
+++ b/epid/common/src/epid2params.c
@@ -0,0 +1,586 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 2.0 constant parameters implementation.
+ */
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+
+/// create a new Finite Field Fp
+static EpidStatus NewFp(Epid2Params const* param, FiniteField** Fp);
+/// create a new Finite Field Fq
+static EpidStatus NewFq(Epid2Params const* param, FiniteField** Fq);
+/// create a new Finite Field Fq2
+static EpidStatus NewFq2(Epid2Params const* param, FiniteField* Fq,
+ FiniteField** Fq2);
+/// create a new Finite Field Fq6
+EpidStatus NewFq6(Epid2Params const* param, FiniteField* Fq2, FfElement* xi,
+ FiniteField** Fq6);
+/// create a new Elliptic curve group G1 over Fq
+static EpidStatus NewG1(Epid2Params const* param, FiniteField* Fq,
+ EcGroup** G1);
+/// create a new Elliptic curve group G2 over Fq2
+static EpidStatus NewG2(Epid2Params const* param, BigNum* p, BigNum* q,
+ FiniteField* Fq, FiniteField* Fq2, EcGroup** G2);
+/// create a new Finite Field Fq12
+static EpidStatus NewGT(FiniteField* Fq6, FiniteField** GT);
+/// create a new pairing state
+
+/// Deallocate Finite Field Fp
+static void DeleteFp(FiniteField** Fp);
+
+/// Deallocate Finite Field Fq
+static void DeleteFq(FiniteField** Fq);
+/// Deallocate Finite Field Fq2
+static void DeleteFq2(FiniteField** Fq2);
+/// Deallocate Finite Field Fq6
+static void DeleteFq6(FiniteField** Fq6);
+/// Deallocate Elliptic curve group G1 over Fq
+static void DeleteG1(EcGroup** G1);
+/// Deallocate Elliptic curve group G2 over Fq2
+static void DeleteG2(EcGroup** G2);
+/// Deallocate Finite Field Fq12
+static void DeleteGT(FiniteField** GT);
+
+EpidStatus CreateEpid2Params(Epid2Params_** params) {
+ EpidStatus result = kEpidErr;
+ Epid2Params_* internal_param = NULL;
+ BigNumStr t_str = {0};
+ Epid2Params params_str = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+ if (!params) {
+ return kEpidBadArgErr;
+ }
+ do {
+ internal_param = SAFE_ALLOC(sizeof(Epid2Params_));
+ if (!internal_param) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ result = NewBigNum(sizeof(params_str.p), &internal_param->p);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&params_str.p, sizeof(params_str.p), internal_param->p);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(params_str.q), &internal_param->q);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&params_str.q, sizeof(params_str.q), internal_param->q);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewBigNum(sizeof(params_str.t), &internal_param->t);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&params_str.t, sizeof(params_str.t), internal_param->t);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ internal_param->neg = (params_str.neg.data[0]) ? true : false;
+
+ result = NewFp(&params_str, &internal_param->Fp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFq(&params_str, &internal_param->Fq);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFq2(&params_str, internal_param->Fq, &internal_param->Fq2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(internal_param->Fq, &internal_param->b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(internal_param->Fq, &params_str.b,
+ sizeof(params_str.b), internal_param->b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(internal_param->Fq2, &internal_param->xi);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(internal_param->Fq2, &params_str.xi,
+ sizeof(params_str.xi), internal_param->xi);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFq6(&params_str, internal_param->Fq2, internal_param->xi,
+ &internal_param->Fq6);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewGT(internal_param->Fq6, &internal_param->GT);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewG1(&params_str, internal_param->Fq, &internal_param->G1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(internal_param->G1, &internal_param->g1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadEcPoint(internal_param->G1, &params_str.g1,
+ sizeof(params_str.g1), internal_param->g1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result =
+ NewG2(&params_str, internal_param->p, internal_param->q,
+ internal_param->Fq, internal_param->Fq2, &internal_param->G2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(internal_param->G2, &internal_param->g2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadEcPoint(internal_param->G2, &params_str.g2,
+ sizeof(params_str.g2), internal_param->g2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = WriteBigNum(internal_param->t, sizeof(t_str), &t_str);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewPairingState(internal_param->G1, internal_param->G2,
+ internal_param->GT, &t_str, internal_param->neg,
+ &internal_param->pairing_state);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *params = internal_param;
+ result = kEpidNoErr;
+ } while (0);
+ if (kEpidNoErr != result && internal_param) {
+ DeletePairingState(&internal_param->pairing_state);
+
+ DeleteEcPoint(&internal_param->g2);
+ DeleteEcPoint(&internal_param->g1);
+
+ DeleteBigNum(&internal_param->p);
+ DeleteBigNum(&internal_param->q);
+ DeleteFfElement(&internal_param->b);
+ DeleteBigNum(&internal_param->t);
+
+ DeleteFp(&internal_param->Fp);
+ DeleteFq(&internal_param->Fq);
+ DeleteFq2(&internal_param->Fq2);
+ DeleteFq6(&internal_param->Fq6);
+ DeleteGT(&internal_param->GT);
+
+ DeleteG1(&internal_param->G1);
+ DeleteG2(&internal_param->G2);
+
+ SAFE_FREE(internal_param);
+ }
+ return result;
+}
+
+void DeleteEpid2Params(Epid2Params_** epid_params) {
+ if (epid_params && *epid_params) {
+ DeletePairingState(&(*epid_params)->pairing_state);
+
+ DeleteBigNum(&(*epid_params)->p);
+ DeleteBigNum(&(*epid_params)->q);
+ DeleteFfElement(&(*epid_params)->b);
+ DeleteBigNum(&(*epid_params)->t);
+ DeleteFfElement(&(*epid_params)->xi);
+ DeleteEcPoint(&(*epid_params)->g1);
+ DeleteEcPoint(&(*epid_params)->g2);
+
+ DeleteFp(&(*epid_params)->Fp);
+ DeleteFq(&(*epid_params)->Fq);
+ DeleteFq2(&(*epid_params)->Fq2);
+ DeleteFq6(&(*epid_params)->Fq6);
+ DeleteGT(&(*epid_params)->GT);
+
+ DeleteG1(&(*epid_params)->G1);
+ DeleteG2(&(*epid_params)->G2);
+
+ SAFE_FREE(*epid_params);
+ }
+}
+
+static EpidStatus NewFp(Epid2Params const* param, FiniteField** Fp) {
+ EpidStatus result = kEpidErr;
+ if (!param || !Fp) {
+ return kEpidBadArgErr;
+ }
+ result = NewFiniteField(&param->p, Fp);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
+
+static EpidStatus NewFq(Epid2Params const* param, FiniteField** Fq) {
+ EpidStatus result = kEpidErr;
+ if (!param || !Fq) {
+ return kEpidBadArgErr;
+ }
+ result = NewFiniteField(&param->q, Fq);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
+EpidStatus NewFq2(Epid2Params const* param, FiniteField* Fq,
+ FiniteField** Fq2) {
+ EpidStatus result = kEpidErr;
+ FiniteField* Ff = NULL;
+ FfElement* beta = NULL;
+ FfElement* neg_beta = NULL;
+ if (!param || !Fq || !Fq2) {
+ return kEpidBadArgErr;
+ }
+ do {
+ result = NewFfElement(Fq, &beta);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Fq, &neg_beta);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq, &param->beta, sizeof(param->beta), beta);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfNeg(Fq, beta, neg_beta);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFiniteFieldViaBinomalExtension(Fq, neg_beta, 2, &Ff);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *Fq2 = Ff;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&neg_beta);
+ DeleteFfElement(&beta);
+
+ return result;
+}
+EpidStatus NewFq6(Epid2Params const* param, FiniteField* Fq2, FfElement* xi,
+ FiniteField** Fq6) {
+ EpidStatus result = kEpidErr;
+ FiniteField* Ff = NULL;
+ FfElement* neg_xi = NULL;
+ if (!param || !Fq2 || !Fq6) {
+ return kEpidBadArgErr;
+ }
+ do {
+ result = NewFfElement(Fq2, &neg_xi);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfNeg(Fq2, xi, neg_xi);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFiniteFieldViaBinomalExtension(Fq2, neg_xi, 3, &Ff);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *Fq6 = Ff;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&neg_xi);
+
+ return result;
+}
+EpidStatus NewG1(Epid2Params const* param, FiniteField* Fq, EcGroup** G1) {
+ EpidStatus result = kEpidErr;
+ EcGroup* ec = NULL;
+ FfElement* fq_a = NULL;
+ FfElement* fq_b = NULL;
+ FfElement* g1_x = NULL;
+ FfElement* g1_y = NULL;
+ BigNum* order = NULL;
+ BigNum* cofactor = NULL;
+ // h = 1;
+ const BigNumStr h1 = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}};
+
+ if (!param || !Fq || !G1) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // Create G1
+ // G1 is an elliptic curve group E(Fq).It can be initialized as follows :
+ // 1. Set G1 = E(Fq).init(p, q, n = p, h = 1, a = 0, b, g1.x, g1.y).
+ // a = 0
+ // NewFfelement is Identidy
+ result = NewFfElement(Fq, &fq_a);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // b
+ result = NewFfElement(Fq, &fq_b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq, &param->b, sizeof(param->b), fq_b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // g1.x
+ result = NewFfElement(Fq, &g1_x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq, &param->g1.x, sizeof(param->g1.x), g1_x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // g1.y
+ result = NewFfElement(Fq, &g1_y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq, &param->g1.y, sizeof(param->g1.y), g1_y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // order
+ result = NewBigNum(sizeof(BigNumStr), &order);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadBigNum(&param->p, sizeof(param->p), order);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // cofactor
+ result = NewBigNum(sizeof(BigNumStr), &cofactor);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ result = ReadBigNum(&h1, sizeof(h1), cofactor);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcGroup(Fq, fq_a, fq_b, g1_x, g1_y, order, cofactor, &ec);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *G1 = ec;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&cofactor);
+ DeleteBigNum(&order);
+ DeleteFfElement(&g1_y);
+ DeleteFfElement(&g1_x);
+ DeleteFfElement(&fq_b);
+ DeleteFfElement(&fq_a);
+
+ return result;
+}
+EpidStatus NewG2(Epid2Params const* param, BigNum* p, BigNum* q,
+ FiniteField* Fq, FiniteField* Fq2, EcGroup** G2) {
+ EpidStatus result = kEpidErr;
+ EcGroup* ec = NULL;
+ FfElement* a = NULL;
+ FfElement* b = NULL;
+ FfElement* fq_param_b = NULL;
+ FfElement* x = NULL;
+ FfElement* y = NULL;
+ BigNum* order = NULL;
+ BigNum* cofactor = NULL;
+ if (!param || !Fq || !Fq2 || !G2) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // 2. Set xi = (xi0, xi1) an element of Fq2.
+ // 3. Let b', xi' be a temporary variable in Fq2.
+ // 4. Compute xi' = Fq2.inverse(xi).
+ // 5. Compute b' = Fq2.mul(xi', b).
+ result = NewFfElement(Fq2, &b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq2, &param->xi, sizeof(param->xi), b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfInv(Fq2, b, b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Fq, &fq_param_b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq, &param->b, sizeof(param->b), fq_param_b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfMul(Fq2, b, fq_param_b, b); // ??? overflow fq2*fq
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 6. Set g2.x = (g2.x[0], g2.x[1]) an element of Fq2.
+ // 7. Set g2.y = (g2.y[0], g2.y[1]) an element of Fq2.
+ result = NewFfElement(Fq2, &x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq2, &param->g2.x, sizeof(param->g2.x), x);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Fq2, &y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq2, &param->g2.y, sizeof(param->g2.y), y);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 8. set h = 2q - p, aka cofactor
+ result = NewBigNum(2 * sizeof(param->q), &cofactor);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumAdd(q, q, cofactor);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumSub(cofactor, p, cofactor);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 9. set n = p * h, AKA order
+ result = NewBigNum(2 * sizeof(param->q), &order);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = BigNumMul(p, cofactor, order);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // set a to identity, NewFfElement does it by default
+ result = NewFfElement(Fq2, &a);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // 10. Set G2 = E(Fq2).init(p, param(Fq2), n, h, 0, b', g2.x, g2.y)
+ result = NewEcGroup(Fq2, a, b, x, y, order, cofactor, &ec);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *G2 = ec;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&cofactor);
+ DeleteBigNum(&order);
+ DeleteFfElement(&y);
+ DeleteFfElement(&x);
+ DeleteFfElement(&b);
+ DeleteFfElement(&a);
+ DeleteFfElement(&fq_param_b);
+
+ return result;
+}
+EpidStatus NewGT(FiniteField* Fq6, FiniteField** GT) {
+ EpidStatus result = kEpidErr;
+ FiniteField* Ff = NULL;
+ FfElement* v = NULL;
+ FfElement* neg_v = NULL;
+
+ const Fq6ElemStr v_str = {
+ {{{{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}},
+ {{{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}},
+ {{{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}}}}};
+
+ if (!Fq6 || !GT) {
+ return kEpidBadArgErr;
+ }
+ do {
+ result = NewFfElement(Fq6, &v);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFfElement(Fq6, &neg_v);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadFfElement(Fq6, &v_str, sizeof(v_str), v);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = FfNeg(Fq6, v, neg_v);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewFiniteFieldViaBinomalExtension(Fq6, neg_v, 2, &Ff);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ *GT = Ff;
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&v);
+ DeleteFfElement(&neg_v);
+
+ return result;
+}
+static void DeleteFp(FiniteField** Fp) { DeleteFiniteField(Fp); }
+static void DeleteFq(FiniteField** Fq) { DeleteFiniteField(Fq); }
+static void DeleteFq2(FiniteField** Fq2) { DeleteFiniteField(Fq2); }
+static void DeleteFq6(FiniteField** Fq6) { DeleteFiniteField(Fq6); }
+static void DeleteG1(EcGroup** G1) { DeleteEcGroup(G1); }
+static void DeleteG2(EcGroup** G2) { DeleteEcGroup(G2); }
+static void DeleteGT(FiniteField** GT) { DeleteFiniteField(GT); }
diff --git a/epid/common/src/epid2params.h b/epid/common/src/epid2params.h
new file mode 100644
index 0000000..ad2393a
--- /dev/null
+++ b/epid/common/src/epid2params.h
@@ -0,0 +1,76 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_EPID2PARAMS_H_
+#define EPID_COMMON_SRC_EPID2PARAMS_H_
+/*!
+ * \file
+ * \brief Intel(R) EPID 2.0 constant parameters interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/math/pairing.h"
+
+/// Internal representation of Epid2Params
+typedef struct Epid2Params_ {
+ BigNum* p; ///< a prime
+ BigNum* q; ///< a prime
+ FfElement* b; ///< an integer between [0, q-1]
+ BigNum* t; ///< an integer
+ bool neg; ///< a boolean
+ FfElement* xi; ///< array of integers between [0, q-1]
+ EcPoint* g1; ///< a generator (an element) of G1
+ EcPoint* g2; ///< a generator (an element) of G2
+
+ FiniteField* Fp; ///< Finite field Fp
+
+ FiniteField* Fq; ///< Finite field Fq
+ FiniteField* Fq2; ///< Finite field Fq2
+ FiniteField* Fq6; ///< Finite field Fq6
+ FiniteField* GT; ///< Finite field GT(Fq12 )
+
+ EcGroup* G1; ///< Elliptic curve group over finite field Fq
+ EcGroup* G2; ///< Elliptic curve group over finite field Fq2
+
+ PairingState* pairing_state; ///< Pairing state
+} Epid2Params_;
+
+/// Constructs the internal representation of Epid2Params
+/*!
+ Allocates memory for the internal representation of Epid2Params. Initialize
+ the Epid2Params. Use DeleteEpid2Params() to deallocate memory.
+
+ \param[in,out] params
+ Internal Epid2Params
+
+ \returns ::EpidStatus
+ \see DeleteEpid2Params
+*/
+EpidStatus CreateEpid2Params(Epid2Params_** params);
+/// Deallocates storage for internal representation of Epid2Params
+/*!
+ Frees the memory and nulls the pointer.
+
+ \param[in,out] epid_params
+ params to be deallocated
+
+ \see CreateEpid2Params
+*/
+void DeleteEpid2Params(Epid2Params_** epid_params);
+/*! @} */
+#endif // EPID_COMMON_SRC_EPID2PARAMS_H_
diff --git a/epid/common/src/epid2params_ate.inc b/epid/common/src/epid2params_ate.inc
new file mode 100644
index 0000000..c13c95d
--- /dev/null
+++ b/epid/common/src/epid2params_ate.inc
@@ -0,0 +1,111 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Intel(R) EPID 2.0 constant parameters data.
+ *
+ */
+
+ {{{ // p
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A,
+ 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D,
+ }}},
+ {{{ // q
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13,
+ }}},
+ {{{ // b
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ }}},
+ {{ // t
+ 0x68, 0x82, 0xF5, 0xC0, 0x30, 0xB0, 0xA8, 0x01,
+ }},
+ {{ // neg
+ 0x01,
+ }},
+ {{{ // beta
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12,
+ }}},
+ {
+ {{{ // xi0
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ }}},
+ {{{ // xi1
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ }}}
+ },
+ { // g1 *********EPIDG1Element
+ {{{ // x
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
+ }}},
+ {{{ // y
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ }}},
+ },
+ { // g2 *********EPIDG2Element
+ {
+ {{{ // x0
+ 0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05,
+ 0x21, 0x67, 0x04, 0x13, 0x74, 0x3C, 0xCF, 0x22,
+ 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32, 0x47, 0x0E,
+ 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94,
+ }}},
+ {{{ // x1
+ 0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80,
+ 0x46, 0xCC, 0xDC, 0x25, 0x4F, 0xBB, 0x56, 0x56,
+ 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96, 0x53, 0xE2,
+ 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE,
+ }}}
+ },
+ {
+ {{{ // y0
+ 0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50,
+ 0xC6, 0x21, 0xE7, 0x03, 0x31, 0x28, 0x26, 0xBD,
+ 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91, 0x68, 0x38,
+ 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE,
+ }}},
+ {{{ // y1
+ 0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD,
+ 0xF8, 0x02, 0x74, 0xF8, 0x76, 0x45, 0xE2, 0x53,
+ 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93, 0xD6, 0x13,
+ 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21,
+ }}}
+ },
+ }
diff --git a/epid/common/src/errors.c b/epid/common/src/errors.c
new file mode 100644
index 0000000..fbec3db
--- /dev/null
+++ b/epid/common/src/errors.c
@@ -0,0 +1,66 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Error reporting implementation.
+ */
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// Record mapping status code to string
+struct ErrorTextEntry {
+ /// error code
+ EpidStatus value;
+ /// string associated with error code
+ char const* text;
+};
+
+/// Mapping of status codes to strings
+static const struct ErrorTextEntry kEnumToText[] = {
+ {kEpidNoErr, "no error"},
+ {kEpidErr, "unspecified error"},
+ {kEpidSigInvalid, "invalid signature"},
+ {kEpidSigRevokedInGroupRl, "signature revoked in GroupRl"},
+ {kEpidSigRevokedInPrivRl, "signature revoked in PrivRl"},
+ {kEpidSigRevokedInSigRl, "signature revoked in SigRl"},
+ {kEpidSigRevokedInVerifierRl, "signature revoked in VerifierRl"},
+ {kEpidNotImpl, "not implemented"},
+ {kEpidBadArgErr, "bad arguments"},
+ {kEpidNoMemErr, "could not allocate memory"},
+ {kEpidMemAllocErr, "insufficient memory provided"},
+ {kEpidMathErr, "internal math error"},
+ {kEpidDivByZeroErr, "attempt to divide by zero"},
+ {kEpidUnderflowErr, "underflow"},
+ {kEpidHashAlgorithmNotSupported, "unsupported hash algorithm type"},
+ {kEpidRandMaxIterErr, "reached max iteration for random number generation"},
+ {kEpidDuplicateErr, "argument would add duplicate entry"},
+ {kEpidInconsistentBasenameSetErr,
+ "the set basename is inconsistent with supplied parameters"}};
+
+char const* EpidStatusToString(EpidStatus e) {
+ size_t i = 0;
+ const size_t num_entries = sizeof(kEnumToText) / sizeof(kEnumToText[0]);
+ for (i = 0; i < num_entries; i++) {
+ if (e == kEnumToText[i].value) {
+ return kEnumToText[i].text;
+ }
+ }
+ return "unknown error";
+}
diff --git a/epid/common/src/file_parser-internal.h b/epid/common/src/file_parser-internal.h
new file mode 100644
index 0000000..67086a9
--- /dev/null
+++ b/epid/common/src/file_parser-internal.h
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Internal functions of Intel(R) EPID issuer material parsing utilities.
+/*!
+ * \file
+ */
+#ifndef EPID_COMMON_SRC_FILE_PARSER_INTERNAL_H_
+#define EPID_COMMON_SRC_FILE_PARSER_INTERNAL_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/file_parser.h"
+#include "epid/common/types.h"
+
+/// Verifies CA certificate to contain EC secp256r1 parameters
+/*!
+
+Verifies that certificate contains EC secp256r1 parameters,
+creates static copies of these parameters and compares them with
+ones in cert. Also verifies that certificate contains correct file header.
+
+\param[in] cert
+The issuing CA public key certificate.
+
+\returns ::EpidStatus
+
+\retval ::kEpidBadArgErr
+Verification failed.
+
+*/
+EpidStatus EpidVerifyCaCertificate(EpidCaCertificate const* cert);
+
+#endif // EPID_COMMON_SRC_FILE_PARSER_INTERNAL_H_
diff --git a/epid/common/src/file_parser.c b/epid/common/src/file_parser.c
new file mode 100644
index 0000000..a25beba
--- /dev/null
+++ b/epid/common/src/file_parser.c
@@ -0,0 +1,335 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Implementation of issuer material file parsing utilities.
+ *
+ */
+#include "epid/common/file_parser.h"
+
+#include <string.h>
+
+#include "epid/common/math/ecdsa.h"
+#include "epid/common/src/file_parser-internal.h"
+#include "epid/common/src/memory.h"
+
+const OctStr16 kEpidVersionCode[kNumEpidVersions] = {
+ {0x01, 0x00}, {0x02, 0x00},
+};
+
+const OctStr16 kEpidFileTypeCode[kNumFileTypes] = {
+ {0x00, 0x11}, {0x00, 0x0C}, {0x00, 0x0D}, {0x00, 0x0E},
+ {0x00, 0x0F}, {0x00, 0x03}, {0x00, 0x0B}, {0x00, 0x13},
+};
+
+/// Intel(R) EPID 2.0 Group Public Key binary format
+typedef struct EpidGroupPubKeyCertificate {
+ EpidFileHeader header; ///< Intel(R) EPID binary file header
+ GroupId gid; ///< group ID
+ G1ElemStr h1; ///< an element in G1
+ G1ElemStr h2; ///< an element in G1
+ G2ElemStr w; ///< an element in G2
+ EcdsaSignature signature; ///< ECDSA Signature on SHA-256 of above values
+} EpidGroupPubKeyCertificate;
+
+/// Intel(R) EPID version
+static const OctStr16 kEpidVersion = {0x02, 0x00};
+
+/// Verify that certificate contains of EC secp256r1 parameters
+EpidStatus EpidVerifyCaCertificate(EpidCaCertificate const* cert) {
+ // Prime of GF(p) for secp256r1
+ static const unsigned char secp256r1_p[] = {
+ // 2^256 -2^224 +2^192 +2^96 -1
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+ // Coefficient of E Curve secp256r1
+ static const unsigned char secp256r1_a[] = {
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc};
+
+ // Coefficient of E Curve secp256r1
+ static const unsigned char secp256r1_b[] = {
+ 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, 0xb3, 0xeb, 0xbd,
+ 0x55, 0x76, 0x98, 0x86, 0xbc, 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53,
+ 0xb0, 0xf6, 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b};
+
+ // X coordinate of Base point G of secp256r1
+ static const unsigned char secp256r1_gx[] = {
+ 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, 0xe6,
+ 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb,
+ 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96};
+
+ // Y coordinate of Base point G of secp256r1
+ static const unsigned char secp256r1_gy[] = {
+ 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb,
+ 0x4a, 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31,
+ 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5};
+
+ // Order of base point of secp256r1
+ static const unsigned char secp256r1_r[] = {
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
+ 0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51,
+ };
+
+ if (!cert) return kEpidBadArgErr;
+
+ // Verify that certificate contains of correct file header
+ if (0 !=
+ memcmp(&cert->header.epid_version, &kEpidVersion, sizeof(kEpidVersion))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->header.file_type,
+ &kEpidFileTypeCode[kIssuingCaPubKeyFile],
+ sizeof(cert->header.file_type))) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that certificate contains of EC secp256r1 parameters
+ if (0 != memcmp(&cert->prime, secp256r1_p, sizeof(secp256r1_p))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->a, secp256r1_a, sizeof(secp256r1_a))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->b, secp256r1_b, sizeof(secp256r1_b))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->x, secp256r1_gx, sizeof(secp256r1_gx))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->y, secp256r1_gy, sizeof(secp256r1_gy))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&cert->r, secp256r1_r, sizeof(secp256r1_r))) {
+ return kEpidBadArgErr;
+ }
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidParseFileHeader(void const* buf, size_t len,
+ EpidVersion* epid_version,
+ EpidFileType* file_type) {
+ EpidFileHeader* header = (EpidFileHeader*)buf;
+ if (!buf || len < sizeof(EpidFileHeader)) return kEpidBadArgErr;
+
+ if (epid_version) {
+ if (0 == memcmp((void*)&header->epid_version, &kEpidVersionCode[kEpid1x],
+ sizeof(header->epid_version))) {
+ *epid_version = kEpid1x;
+ } else if (0 == memcmp((void*)&header->epid_version,
+ &kEpidVersionCode[kEpid2x],
+ sizeof(header->epid_version))) {
+ *epid_version = kEpid2x;
+ } else {
+ // set default value
+ *epid_version = kNumEpidVersions;
+ }
+ }
+ if (file_type) {
+ if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kIssuingCaPubKeyFile],
+ sizeof(header->file_type))) {
+ *file_type = kIssuingCaPubKeyFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kGroupPubKeyFile],
+ sizeof(header->file_type))) {
+ *file_type = kGroupPubKeyFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kPrivRlFile],
+ sizeof(header->file_type))) {
+ *file_type = kPrivRlFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kSigRlFile],
+ sizeof(header->file_type))) {
+ *file_type = kSigRlFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kGroupRlFile],
+ sizeof(header->file_type))) {
+ *file_type = kGroupRlFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kPrivRlRequestFile],
+ sizeof(header->file_type))) {
+ *file_type = kPrivRlRequestFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kSigRlRequestFile],
+ sizeof(header->file_type))) {
+ *file_type = kSigRlRequestFile;
+ } else if (0 == memcmp((void*)&header->file_type,
+ &kEpidFileTypeCode[kGroupRlRequestFile],
+ sizeof(header->file_type))) {
+ *file_type = kGroupRlRequestFile;
+ } else {
+ // set default value
+ *file_type = kNumFileTypes;
+ }
+ }
+ return kEpidNoErr;
+}
+
+/// Parse a file with a revocation list of any type
+static EpidStatus EpidParseRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, void* rl,
+ size_t* rl_len, EpidFileType file_type) {
+ size_t min_rl_file_size = 0;
+ size_t empty_rl_size = 0;
+ size_t rl_entry_size = 0;
+ EpidStatus result = kEpidErr;
+ EpidFileHeader const* file_header = (EpidFileHeader*)buf;
+ void const* buf_rl =
+ (void const*)((unsigned char*)buf + sizeof(EpidFileHeader));
+ size_t buf_rl_len = 0;
+ EcdsaSignature const* signature = NULL;
+
+ if (!buf || !cert || !rl_len) return kEpidBadArgErr;
+
+ switch (file_type) {
+ case kPrivRlFile:
+ empty_rl_size = sizeof(PrivRl) - sizeof(((PrivRl*)0)->f[0]);
+ rl_entry_size = sizeof(((PrivRl*)0)->f[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(PrivRl) -
+ sizeof(((PrivRl*)0)->f[0]) + sizeof(EcdsaSignature);
+ break;
+ case kSigRlFile:
+ empty_rl_size = sizeof(SigRl) - sizeof(((SigRl*)0)->bk[0]);
+ rl_entry_size = sizeof(((SigRl*)0)->bk[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(SigRl) -
+ sizeof(((SigRl*)0)->bk[0]) + sizeof(EcdsaSignature);
+ break;
+ case kGroupRlFile:
+ empty_rl_size = sizeof(GroupRl) - sizeof(((GroupRl*)0)->gid[0]);
+ rl_entry_size = sizeof(((GroupRl*)0)->gid[0]);
+ min_rl_file_size = sizeof(EpidFileHeader) + sizeof(GroupRl) -
+ sizeof(((GroupRl*)0)->gid[0]) + sizeof(EcdsaSignature);
+ break;
+ default:
+ return kEpidErr;
+ }
+
+ if (min_rl_file_size > len) return kEpidBadArgErr;
+
+ // Verify that Intel(R) EPID file header in the buffer is correct
+ if (0 !=
+ memcmp(&file_header->epid_version, &kEpidVersion, sizeof(kEpidVersion))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&file_header->file_type, &kEpidFileTypeCode[file_type],
+ sizeof(file_header->file_type))) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that CA certificate is correct
+ result = EpidVerifyCaCertificate(cert);
+ if (kEpidNoErr != result) return result;
+
+ // Verify that RL in file buffer contains of integer number of entries
+ buf_rl_len = len - sizeof(EpidFileHeader) - sizeof(EcdsaSignature);
+ if (0 != ((buf_rl_len - empty_rl_size) % rl_entry_size)) {
+ return kEpidBadArgErr;
+ }
+
+ signature =
+ (EcdsaSignature*)((unsigned char*)buf + len - sizeof(EcdsaSignature));
+ // Authenticate signature for buffer
+ result = EcdsaVerifyBuffer(buf, len - sizeof(EcdsaSignature),
+ (EcdsaPublicKey*)&cert->pubkey, signature);
+ if (kEpidSigValid != result) return result;
+
+ buf_rl_len = len - sizeof(EpidFileHeader) - sizeof(EcdsaSignature);
+
+ // If pointer to output buffer is NULL it should return required size of RL
+ if (!rl) {
+ *rl_len = buf_rl_len;
+ return kEpidNoErr;
+ }
+
+ if (*rl_len < buf_rl_len) return kEpidBadArgErr;
+ *rl_len = buf_rl_len;
+
+ // Copy revocation list from file buffer to output
+ // Memory copy is used to copy a revocation list of variable length
+ if (0 != memcpy_S(rl, *rl_len, buf_rl, buf_rl_len)) return kEpidBadArgErr;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidParseGroupPubKeyFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert,
+ GroupPubKey* pubkey) {
+ EpidStatus result;
+ EpidGroupPubKeyCertificate* buf_pubkey = (EpidGroupPubKeyCertificate*)buf;
+
+ if (!buf || !cert || !pubkey) {
+ return kEpidBadArgErr;
+ }
+
+ if (len == 0 || len % sizeof(EpidGroupPubKeyCertificate) != 0) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that Intel(R) EPID file header in the buffer is correct
+ if (0 != memcmp(&buf_pubkey->header.epid_version, &kEpidVersion,
+ sizeof(kEpidVersion))) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&buf_pubkey->header.file_type,
+ &kEpidFileTypeCode[kGroupPubKeyFile],
+ sizeof(buf_pubkey->header.file_type))) {
+ return kEpidBadArgErr;
+ }
+
+ // Verify that CA certificate is correct
+ result = EpidVerifyCaCertificate(cert);
+ if (kEpidNoErr != result) return result;
+
+ // Authenticate signature for buffer
+ result = EcdsaVerifyBuffer(
+ buf_pubkey, sizeof(EpidGroupPubKeyCertificate) - sizeof(EcdsaSignature),
+ (EcdsaPublicKey*)&cert->pubkey, &buf_pubkey->signature);
+ if (kEpidSigValid != result) return result;
+
+ // Copy public from the buffer to output
+ pubkey->gid = buf_pubkey->gid;
+ pubkey->h1 = buf_pubkey->h1;
+ pubkey->h2 = buf_pubkey->h2;
+ pubkey->w = buf_pubkey->w;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidParsePrivRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, PrivRl* rl,
+ size_t* rl_len) {
+ return EpidParseRlFile(buf, len, cert, rl, rl_len, kPrivRlFile);
+}
+
+EpidStatus EpidParseSigRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, SigRl* rl,
+ size_t* rl_len) {
+ return EpidParseRlFile(buf, len, cert, rl, rl_len, kSigRlFile);
+}
+
+EpidStatus EpidParseGroupRlFile(void const* buf, size_t len,
+ EpidCaCertificate const* cert, GroupRl* rl,
+ size_t* rl_len) {
+ return EpidParseRlFile(buf, len, cert, rl, rl_len, kGroupRlFile);
+}
diff --git a/epid/common/src/grouppubkey.c b/epid/common/src/grouppubkey.c
new file mode 100644
index 0000000..8a2752f
--- /dev/null
+++ b/epid/common/src/grouppubkey.c
@@ -0,0 +1,86 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Group public key implementation.
+ */
+#include "epid/common/src/grouppubkey.h"
+#include "epid/common/src/memory.h"
+
+EpidStatus CreateGroupPubKey(GroupPubKey const* pub_key_str, EcGroup* G1,
+ EcGroup* G2, GroupPubKey_** pub_key) {
+ EpidStatus result = kEpidErr;
+ GroupPubKey_* pubkey = NULL;
+ if (!pub_key_str || !G1 || !G2 || !pub_key) {
+ return kEpidBadArgErr;
+ }
+ do {
+ pubkey = SAFE_ALLOC(sizeof(GroupPubKey_));
+ if (!pubkey) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ result = NewEcPoint(G1, &pubkey->h1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result =
+ ReadEcPoint(G1, &pub_key_str->h1, sizeof(pub_key_str->h1), pubkey->h1);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(G1, &pubkey->h2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result =
+ ReadEcPoint(G1, &pub_key_str->h2, sizeof(pub_key_str->h2), pubkey->h2);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(G2, &pubkey->w);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result =
+ ReadEcPoint(G2, &pub_key_str->w, sizeof(pub_key_str->w), pubkey->w);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ pubkey->gid = pub_key_str->gid;
+ *pub_key = pubkey;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result && pubkey) {
+ DeleteEcPoint(&pubkey->w);
+ DeleteEcPoint(&pubkey->h2);
+ DeleteEcPoint(&pubkey->h1);
+ SAFE_FREE(pubkey);
+ }
+ return result;
+}
+
+void DeleteGroupPubKey(GroupPubKey_** pub_key) {
+ if (pub_key && *pub_key) {
+ DeleteEcPoint(&(*pub_key)->w);
+ DeleteEcPoint(&(*pub_key)->h2);
+ DeleteEcPoint(&(*pub_key)->h1);
+
+ SAFE_FREE(*pub_key);
+ }
+}
diff --git a/epid/common/src/grouppubkey.h b/epid/common/src/grouppubkey.h
new file mode 100644
index 0000000..a47ebcb
--- /dev/null
+++ b/epid/common/src/grouppubkey.h
@@ -0,0 +1,67 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_GROUPPUBKEY_H_
+#define EPID_COMMON_SRC_GROUPPUBKEY_H_
+/*!
+ * \file
+ * \brief Group public key interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/types.h"
+
+/// Internal representation of GroupPubKey
+typedef struct GroupPubKey_ {
+ GroupId gid; ///< group ID
+ EcPoint* h1; ///< an element in G1
+ EcPoint* h2; ///< an element in G1
+ EcPoint* w; ///< an element in G2
+} GroupPubKey_;
+
+/// Constructs internal representation of GroupPubKey
+/*!
+ Allocates memory and initializes gid, h1, h2, w parameters. Use
+ DeleteGroupPubKey() to deallocate memory
+
+ \param[in] pub_key_str
+ Oct string representation of group public key
+ \param[in] G1
+ EcGroup containing elements h1 and h2
+ \param[in] G2
+ EcGroup containing element w
+ \param[out] pub_key
+ Group public key: (gid, h1, h2, w)
+
+ \returns ::EpidStatus
+ \see DeleteGroupPubKey
+*/
+EpidStatus CreateGroupPubKey(GroupPubKey const* pub_key_str, EcGroup* G1,
+ EcGroup* G2, GroupPubKey_** pub_key);
+
+/// Deallocates storage for internal representation of GroupPubKey
+/*!
+ Frees memory pointed to by Group public key. Nulls the pointer.
+
+ \param[in] pub_key
+ Group public key to be freed
+
+ \see CreateGroupPubKey
+*/
+void DeleteGroupPubKey(GroupPubKey_** pub_key);
+/*! @} */
+#endif // EPID_COMMON_SRC_GROUPPUBKEY_H_
diff --git a/epid/common/src/hashsize.c b/epid/common/src/hashsize.c
new file mode 100644
index 0000000..322de7a
--- /dev/null
+++ b/epid/common/src/hashsize.c
@@ -0,0 +1,44 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidGetHashSize implementation.
+ */
+
+#include "epid/common/src/hashsize.h"
+#include <limits.h>
+
+size_t EpidGetHashSize(HashAlg hash_alg) {
+ switch (hash_alg) {
+ case kSha256:
+ return EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha384:
+ return EPID_SHA384_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha512:
+ return EPID_SHA512_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha512_256:
+ return EPID_SHA512_256_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha3_256:
+ return EPID_SHA3_256_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha3_384:
+ return EPID_SHA3_384_DIGEST_BITSIZE / CHAR_BIT;
+ case kSha3_512:
+ return EPID_SHA3_512_DIGEST_BITSIZE / CHAR_BIT;
+ default:
+ return 0;
+ }
+}
diff --git a/epid/common/src/hashsize.h b/epid/common/src/hashsize.h
new file mode 100644
index 0000000..0fc7c20
--- /dev/null
+++ b/epid/common/src/hashsize.h
@@ -0,0 +1,46 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidGetHashSize definition.
+ */
+
+#ifndef EPID_COMMON_SRC_HASHSIZE_H_
+#define EPID_COMMON_SRC_HASHSIZE_H_
+
+#include <stddef.h>
+#include "epid/common/types.h"
+
+/// Size of SHA-256 digest in bits
+#define EPID_SHA256_DIGEST_BITSIZE 256
+/// Size of SHA-384 digest in bits
+#define EPID_SHA384_DIGEST_BITSIZE 385
+/// Size of SHA-512 digest in bits
+#define EPID_SHA512_DIGEST_BITSIZE 512
+/// Size of SHA-512/256 digest in bits
+#define EPID_SHA512_256_DIGEST_BITSIZE 256
+/// Size of SHA3-256 digest in bits
+#define EPID_SHA3_256_DIGEST_BITSIZE 256
+/// Size of SHA3-384 digest in bits
+#define EPID_SHA3_384_DIGEST_BITSIZE 385
+/// Size of SHA3-512 digest in bits
+#define EPID_SHA3_512_DIGEST_BITSIZE 512
+
+/// Gets hash digest size in bytes.
+size_t EpidGetHashSize(HashAlg hash_alg);
+
+#endif // EPID_COMMON_SRC_HASHSIZE_H_
diff --git a/epid/common/src/memory.c b/epid/common/src/memory.c
new file mode 100644
index 0000000..99a48a8
--- /dev/null
+++ b/epid/common/src/memory.c
@@ -0,0 +1,123 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Memory access implementation.
+ */
+
+#include "epid/common/src/memory.h"
+
+#include <stdint.h>
+#include <string.h>
+
+/// Maximum size of the destination buffer
+#ifndef RSIZE_MAX
+#define RSIZE_MAX ((SIZE_MAX) >> 1)
+#endif
+
+#ifndef MIN
+/// Evaluate to minimum of two values
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif // MIN
+
+/// Copies count of character from dest to src
+/*! \note Implementation follows C11 memcpy_s but with checks always enabled
+ */
+int memcpy_S(void* dest, size_t destsz, void const* src, size_t count) {
+ size_t i;
+ if (!dest || destsz > RSIZE_MAX) return -1;
+ if (!src || count > RSIZE_MAX || count > destsz ||
+ count > (dest > src ? ((uintptr_t)dest - (uintptr_t)src)
+ : ((uintptr_t)src - (uintptr_t)dest))) {
+ // zero out dest if error detected
+ memset(dest, 0, destsz);
+ return -1;
+ }
+
+ for (i = 0; i < count; i++) ((uint8_t*)dest)[i] = ((uint8_t*)src)[i];
+ return 0;
+}
+
+void EpidZeroMemory(void* ptr, size_t size) { memset(ptr, 0, size); }
+
+#if defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+
+#if !defined(EPID_ALLOC_ALIGN)
+/// Alignment constant for EpidAlloc, must be a power of two
+#define EPID_ALLOC_ALIGN sizeof(size_t)
+#endif // !defined(EPID_ALLOC_ALIGN)
+
+#pragma pack(1)
+/// Allocated memory block information
+typedef struct EpidAllocHeader {
+ size_t length; ///< number of bytes memory block is allocated for
+ void* ptr; ///< pointer to whole memory block including EpidAllocHeader
+} EpidAllocHeader;
+#pragma pack()
+
+#endif // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+
+void* EpidAlloc(size_t size) {
+#if defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ void* ptr = NULL;
+ if (size <= 0) return NULL;
+ // Allocate memory enough to store size bytes and EpidAllocHeader
+ ptr = calloc(1, size + EPID_ALLOC_ALIGN - 1 + sizeof(EpidAllocHeader));
+ if (ptr) {
+ void* aligned_pointer = (void*)(((uintptr_t)ptr + EPID_ALLOC_ALIGN +
+ sizeof(EpidAllocHeader) - 1) &
+ (~(EPID_ALLOC_ALIGN - 1)));
+ ((EpidAllocHeader*)aligned_pointer)[-1].length = size;
+ ((EpidAllocHeader*)aligned_pointer)[-1].ptr = ptr;
+ return aligned_pointer;
+ }
+ return NULL;
+#else // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ return calloc(1, size);
+#endif // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+}
+
+void* EpidRealloc(void* ptr, size_t new_size) {
+#if defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ void* new_ptr = EpidAlloc(new_size);
+ if (!new_ptr) return NULL;
+ if (ptr) {
+ // Memory copy is used to copy a buffer of variable length
+ if (0 != memcpy_S(new_ptr, ((EpidAllocHeader*)new_ptr)[-1].length, ptr,
+ MIN(((EpidAllocHeader*)ptr)[-1].length,
+ ((EpidAllocHeader*)new_ptr)[-1].length))) {
+ EpidFree(new_ptr);
+ return NULL;
+ }
+ EpidFree(ptr);
+ }
+ return new_ptr;
+#else // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ return realloc(ptr, new_size);
+#endif // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+}
+
+void EpidFree(void* ptr) {
+#if defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ if (ptr) {
+ EpidZeroMemory(ptr, ((EpidAllocHeader*)ptr)[-1].length);
+ free(((EpidAllocHeader*)ptr)[-1].ptr);
+ }
+#else // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+ free(ptr);
+#endif // defined(EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE)
+}
diff --git a/epid/common/src/memory.h b/epid/common/src/memory.h
new file mode 100644
index 0000000..8c2fd7f
--- /dev/null
+++ b/epid/common/src/memory.h
@@ -0,0 +1,123 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_MEMORY_H_
+#define EPID_COMMON_SRC_MEMORY_H_
+
+#include <stdlib.h>
+#include <string.h>
+
+/*!
+ * \file
+ * \brief Memory access interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+
+/// When enabled secrets are wiped out from the memory by EpidFree
+#define EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE
+
+/// Clear information stored in block of memory pointer to by ptr
+/*!
+
+ \warning
+ This function may be optimized away by some compilers. If it is, you
+ should consider using a compiler or operating system specific memory
+ sanitization function (e.g. memcpy_s or SecureZeroMemory).
+
+ \param[in] ptr
+ pointer to memory block
+ \param[in] size
+ number of bytes to clear
+ */
+void EpidZeroMemory(void* ptr, size_t size);
+
+/// Allocates memory of size bytes
+/*!
+ The content of memory is initialized with zeros.
+ Memory must be freed with EpidFree function.
+
+ \param[in] size
+ number of bytes to allocate
+
+ \returns pointer to allocated memory.
+ */
+void* EpidAlloc(size_t size);
+
+/// Reallocates memory allocated by EpidAlloc
+/*!
+ In case of error NULL pointer is returned and input memory block
+ is not changed.
+ Memory must be freed with EpidFree function.
+
+ \param[in] ptr
+ pointer to memory block to reallocate
+ \param[in] new_size
+ number of bytes to reallocate for
+
+ \returns pointer to allocated memory.
+ */
+void* EpidRealloc(void* ptr, size_t new_size);
+
+/// Frees memory allocated by EpidAlloc
+/*!
+ Clears information stored in the block of memory.
+
+ \param[in] ptr
+ pointer to allocated memory block
+ */
+void EpidFree(void* ptr);
+
+#if !defined(SAFE_ALLOC)
+/// Allocates zero initalized block of memory
+#define SAFE_ALLOC(size) EpidAlloc(size);
+#endif // !defined(SAFE_ALLOC)
+#if !defined(SAFE_FREE)
+/// Deallocates space allocated by SAFE_ALLOC() and nulls pointer
+#define SAFE_FREE(ptr) \
+ { \
+ if (NULL != (ptr)) { \
+ EpidFree(ptr); \
+ (ptr) = NULL; \
+ } \
+ }
+#endif // !defined(SAFE_FREE)
+
+#if !defined(SAFE_REALLOC)
+/// Changes the size of the memory block pointed to by ptr
+#define SAFE_REALLOC(ptr, size) EpidRealloc((ptr), (size))
+#endif // !defined(SAFE_REALLOC)
+
+/// Copies bytes between buffers with security ehancements
+/*!
+ Copies count bytes from src to dest. If the source and destination
+ overlap, the behavior is undefined.
+
+ \param[out] dest
+ pointer to the object to copy to
+ \param[in] destsz
+ max number of bytes to modify in the destination (typically the size
+ of the destination object)
+ \param[in] src
+ pointer to the object to copy from
+ \param[in] count
+ number of bytes to copy
+
+ \returns zero on success and non-zero value on error.
+ */
+int memcpy_S(void* dest, size_t destsz, void const* src, size_t count);
+
+/*! @} */
+#endif // EPID_COMMON_SRC_MEMORY_H_
diff --git a/epid/common/src/sigrlvalid.c b/epid/common/src/sigrlvalid.c
new file mode 100644
index 0000000..9287648
--- /dev/null
+++ b/epid/common/src/sigrlvalid.c
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief SigRl validity checking implementation.
+ */
+
+#include <string.h>
+
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/sigrlvalid.h"
+
+bool IsSigRlValid(GroupId const* gid, SigRl const* sig_rl, size_t sig_rl_size) {
+ const size_t kMinSigRlSize = sizeof(SigRl) - sizeof(SigRlEntry);
+ size_t input_sig_rl_size = 0;
+ if (!gid || !sig_rl || kMinSigRlSize > sig_rl_size) {
+ return false;
+ }
+ if (ntohl(sig_rl->n2) > (SIZE_MAX - kMinSigRlSize) / sizeof(sig_rl->bk[0])) {
+ return false;
+ }
+ // sanity check of intput SigRl size
+ input_sig_rl_size = kMinSigRlSize + ntohl(sig_rl->n2) * sizeof(sig_rl->bk[0]);
+ if (input_sig_rl_size != sig_rl_size) {
+ return false;
+ }
+ // verify that gid given and gid in SigRl match
+ if (0 != memcmp(gid, &sig_rl->gid, sizeof(*gid))) {
+ return false;
+ }
+ return true;
+}
diff --git a/epid/common/src/sigrlvalid.h b/epid/common/src/sigrlvalid.h
new file mode 100644
index 0000000..610abaa
--- /dev/null
+++ b/epid/common/src/sigrlvalid.h
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_SIGRLVALID_H_
+#define EPID_COMMON_SRC_SIGRLVALID_H_
+/*!
+ * \file
+ * \brief SigRl validity checking interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+
+#include <stddef.h>
+
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/// Function to verify if signature based revocation list is valid
+/*!
+
+ \param[in] gid
+ Group id
+ \param[in] sig_rl
+ Signature based revocation list
+ \param[in] sig_rl_size
+ Size of signature based revocation list
+
+ \returns true if revocation list is valid
+ \returns false if revocation list is invalid
+*/
+bool IsSigRlValid(GroupId const* gid, SigRl const* sig_rl, size_t sig_rl_size);
+
+/*! @} */
+#endif // EPID_COMMON_SRC_SIGRLVALID_H_
diff --git a/epid/common/src/stack.c b/epid/common/src/stack.c
new file mode 100644
index 0000000..314face
--- /dev/null
+++ b/epid/common/src/stack.c
@@ -0,0 +1,95 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Stack container implementation.
+ */
+#include "epid/common/src/stack.h"
+#include <limits.h>
+#include "epid/common/src/memory.h"
+
+/// Internal representation of a Stack
+struct Stack {
+ size_t element_size; ///< Size of element in bytes
+ void* buf; ///< Buffer to store elements
+ size_t max_size; ///< Numbers of elements buffer was allocated to
+ size_t top; ///< Stack top, the number of elements in the stack
+};
+
+bool CreateStack(size_t element_size, Stack** stack) {
+ if (!stack || 0 == element_size) return false;
+ *stack = SAFE_ALLOC(sizeof(Stack));
+ if (!*stack) return false;
+ (*stack)->element_size = element_size;
+ return true;
+}
+
+void* StackPushN(Stack* stack, size_t n, void* elements) {
+ if (!stack) return 0;
+ if (n > 0) {
+ size_t max_size_required = stack->top + n;
+ if (n > (SIZE_MAX / stack->element_size) - stack->top)
+ return 0; // integer overflow
+ if (max_size_required > stack->max_size) {
+ void* reallocated =
+ SAFE_REALLOC(stack->buf, max_size_required * stack->element_size);
+ if (!reallocated) return 0;
+ stack->buf = reallocated;
+ stack->max_size = max_size_required;
+ }
+ if (elements) {
+ // Memory copy is used to copy variable number of elements to stack
+ if (0 != memcpy_S((uint8_t*)stack->buf + stack->top * stack->element_size,
+ (stack->max_size - stack->top) * stack->element_size,
+ elements, n * stack->element_size)) {
+ return 0;
+ }
+ }
+ stack->top += n;
+ }
+ return (uint8_t*)stack->buf + (stack->top - n) * stack->element_size;
+}
+
+bool StackPopN(Stack* stack, size_t n, void* elements) {
+ if (!stack) return false;
+ if (n > 0) {
+ if (n > stack->top) return false;
+ if (elements) {
+ // Memory copy is used to copy variable number of elements from stack
+ if (0 != memcpy_S(elements, n * stack->element_size,
+ (uint8_t*)stack->buf +
+ (stack->top - n) * stack->element_size,
+ n * stack->element_size)) {
+ return false;
+ }
+ stack->top -= n;
+ }
+ }
+ return true;
+}
+
+size_t StackGetSize(Stack const* stack) {
+ return stack ? stack->top : (size_t)0;
+}
+
+void* StackGetBuf(Stack const* stack) { return stack ? stack->buf : NULL; }
+
+void DeleteStack(Stack** stack) {
+ if (stack && *stack) {
+ SAFE_FREE((*stack)->buf);
+ SAFE_FREE(*stack);
+ }
+}
diff --git a/epid/common/src/stack.h b/epid/common/src/stack.h
new file mode 100644
index 0000000..4ac1592
--- /dev/null
+++ b/epid/common/src/stack.h
@@ -0,0 +1,106 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_SRC_STACK_H_
+#define EPID_COMMON_SRC_STACK_H_
+/*!
+ * \file
+ * \brief Stack container interface.
+ * \addtogroup EpidCommon
+ * @{
+ */
+#include <stddef.h>
+#include "epid/common/stdtypes.h"
+
+/// A stack
+typedef struct Stack Stack;
+
+/// Create stack
+/*!
+ \param[in] element_size
+ Size of stack element
+ \param[out] stack
+ Stack context to be created
+
+ \returns true is operation succeed, false if stack were failed to allocate
+
+ \see DeleteStack
+*/
+bool CreateStack(size_t element_size, Stack** stack);
+
+/// Push multiple elements to the stack
+/*!
+ \param[in,out] stack
+ Stack context
+ \param[in] n
+ Number of elements to push to the stack
+ \param[in] elements
+ Array of elements to push to the stack. Can be NULL
+
+ \returns A pointer to an array of new elements in the stack or NULL if
+ stack is empty or push operation were failed.
+
+ \see CreateStack
+*/
+void* StackPushN(Stack* stack, size_t n, void* elements);
+
+/// Pop multiple elements from the stack
+/*!
+ \param[in,out] stack
+ Stack context
+ \param[in] n
+ Number of elements to pop from the stack
+ \param[out] elements
+ Pointer to a buffer to store elements removed from the stack
+
+ \returns true is operation succeed, false otherwise
+
+ \see CreateStack
+*/
+bool StackPopN(Stack* stack, size_t n, void* elements);
+
+/// Get number of elements in the stack
+/*!
+ \param[in] stack
+ Stack context
+
+ \returns Number of elements in the stack or 0 if stack is NULL
+
+ \see CreateStack
+*/
+size_t StackGetSize(Stack const* stack);
+
+/// Get number of elements in the stack
+/*!
+ \param[in] stack
+ Stack context
+
+ \returns Pointer to the buffer, returns NULL if stack is NULL
+
+ \see CreateStack
+*/
+void* StackGetBuf(Stack const* stack);
+
+/// Deallocates memory used for the stack.
+/*!
+ \param[in,out] stack
+ Stack context
+
+ \see CreateStack
+*/
+void DeleteStack(Stack** stack);
+
+/*! @} */
+#endif // EPID_COMMON_SRC_STACK_H_
diff --git a/epid/common/stdtypes.h b/epid/common/stdtypes.h
new file mode 100644
index 0000000..3bc05e3
--- /dev/null
+++ b/epid/common/stdtypes.h
@@ -0,0 +1,39 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_STDTYPES_H_
+#define EPID_COMMON_STDTYPES_H_
+
+/*!
+ * \file
+ * \brief C99 standard data types.
+ */
+
+#include <stdint.h> // Fixed-width integer types
+
+#ifndef __cplusplus
+#ifndef _Bool
+/// C99 standard name for bool
+#define _Bool char
+/// Boolean type
+typedef char bool;
+/// integer constant 1
+#define true 1
+/// integer constant 0
+#define false 0
+#endif //
+#endif // ifndef __cplusplus
+
+#endif // EPID_COMMON_STDTYPES_H_
diff --git a/epid/common/tinycommon.parts b/epid/common/tinycommon.parts
new file mode 100644
index 0000000..3e9f00b
--- /dev/null
+++ b/epid/common/tinycommon.parts
@@ -0,0 +1,46 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build confioguration for include-only common
+
+Needed to avoid linking to avoid listing ipp in dependencies when only
+depending on headers. Eventually should unify this into single header.
+
+"""
+Import('*')
+env.PartName('tinycommon')
+
+include_files = Pattern(src_dir='.',
+ includes=['*.h'],
+ recursive=False).files()
+
+install_files = Pattern(src_dir='.',
+ includes=[
+ '*.h',
+ '*.c',
+ '*-test.cc',
+ '*-testhelper.cc',
+ '*.parts'
+ 'Makefile'],
+ recursive=True)
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(install_files,
+ sub_dir='epid/common')
+else:
+ env.SdkInclude(include_files, sub_dir='epid/common')
+ if 'install_lib' in env['MODE']:
+ env.InstallInclude(include_files, sub_dir='epid/common')
diff --git a/epid/common/types.h b/epid/common/types.h
new file mode 100644
index 0000000..3d648fb
--- /dev/null
+++ b/epid/common/types.h
@@ -0,0 +1,363 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_COMMON_TYPES_H_
+#define EPID_COMMON_TYPES_H_
+
+#include <limits.h> // for CHAR_BIT
+
+/*!
+ * \file
+ * \brief SDK data types.
+*/
+
+/// SDK data types.
+/*!
+ \defgroup EpidTypes types
+ Defines serialized data types used by the SDK.
+
+ Most of the types defined here are fixed size binary buffers of various sizes
+ that are semantically mapped to the types of various inputs to the
+ Intel(R) EPID APIs.
+
+ For example ::GtElemStr is a 384 byte buffer that represents a serialized
+ value that is compatible with a ::FfElement belonging to the ::FiniteField
+ GT.
+
+ \ingroup EpidCommon
+ @{
+*/
+
+/// Generic Octet String Style Number
+typedef void* OctStr;
+
+/// Generic Const Octet String Style Number
+typedef void const* ConstOctStr;
+
+/// Recognized hash algorithms
+typedef enum {
+ /// Invalid
+ kInvalidHashAlg = -1,
+ /// SHA-256
+ kSha256 = 0,
+ /// SHA-384
+ kSha384 = 1,
+ /// SHA-512
+ kSha512 = 2,
+ /// SHA-512/256
+ kSha512_256 = 3,
+ /// Reserved for SHA3/256
+ kSha3_256 = 4,
+ /// Reserved for SHA3/384
+ kSha3_384 = 5,
+ /// Reserved for SHA3/512
+ kSha3_512 = 6,
+} HashAlg;
+
+#pragma pack(1)
+/// 8 bit octet string
+typedef struct OctStr8 {
+ unsigned char data[8 / CHAR_BIT]; ///< 8 bit data
+} OctStr8;
+/// 16 bit octet string
+typedef struct OctStr16 {
+ unsigned char data[16 / CHAR_BIT]; ///< 16 bit data
+} OctStr16;
+/// 32 bit octet string
+typedef struct OctStr32 {
+ unsigned char data[32 / CHAR_BIT]; ///< 32 bit data
+} OctStr32;
+/// 64 bit octet string
+typedef struct OctStr64 {
+ unsigned char data[64 / CHAR_BIT]; ///< 64 bit data
+} OctStr64;
+/// 128 bit octet string
+typedef struct OctStr128 {
+ unsigned char data[128 / CHAR_BIT]; ///< 128 bit data
+} OctStr128;
+/// 256 bit octet string
+typedef struct OctStr256 {
+ unsigned char data[256 / CHAR_BIT]; ///< 256 bit data
+} OctStr256;
+/// 512 bit octet string
+typedef struct OctStr512 {
+ unsigned char data[512 / CHAR_BIT]; ///< 512 bit data
+} OctStr512;
+
+/// Serialized BigNum
+typedef struct BigNumStr {
+ OctStr256 data; ///< 256 bit octet string
+} BigNumStr;
+/// a number in [0, p-1]
+typedef struct FpElemStr {
+ OctStr256 data; ///< 256 bit octet string
+} FpElemStr;
+/// a number in [0, q-1]
+typedef struct FqElemStr {
+ OctStr256 data; ///< 256 bit octet string
+} FqElemStr;
+
+/// Serialized G1 element
+typedef struct G1ElemStr {
+ FqElemStr x; ///< an integer between [0, q-1]
+ FqElemStr y; ///< an integer between [0, q-1]
+} G1ElemStr;
+
+/// Serialized G2 element
+typedef struct G2ElemStr {
+ FqElemStr x[2]; ///< an integer between [0, q-1]
+ FqElemStr y[2]; ///< an integer between [0, q-1]
+} G2ElemStr;
+
+/// Serialized GT element
+typedef struct GtElemStr {
+ FqElemStr x[12]; ///< an integer between [0, q-1]
+} GtElemStr;
+
+/// Intel(R) EPID 2.0 Parameters.
+/*!
+ * Intel(R) EPID 2.0 parameters: (p, q, b, t, neg, beta, xi0, xi1,
+ * g1, g2)
+ */
+typedef struct Epid2Params {
+ BigNumStr p; ///< a prime
+ BigNumStr q; ///< a prime
+ FqElemStr b; ///< an integer between [0, q-1]
+ OctStr64 t; ///< an integer
+ OctStr8 neg; ///< a boolean
+ FqElemStr beta; ///< an integer between [0, q-1]
+ FqElemStr xi[2]; ///< array of integers between [0, q-1]
+ G1ElemStr g1; ///< a generator (an element) of G1
+ G2ElemStr g2; ///< a generator (an element) of G2
+} Epid2Params;
+
+/// group ID
+typedef OctStr128 GroupId;
+
+/// Intel(R) EPID 2.0 group public key
+/*!
+ * Group public key: (gid, h1, h2, w)
+ */
+typedef struct GroupPubKey {
+ GroupId gid; ///< group ID
+ G1ElemStr h1; ///< an element in G1
+ G1ElemStr h2; ///< an element in G1
+ G2ElemStr w; ///< an element in G2
+} GroupPubKey;
+
+/// Intel(R) EPID 2.0 issuing private key
+/*!
+ * Issuing private key: (gid, gamma)
+ */
+typedef struct IPrivKey {
+ GroupId gid; ///< group ID
+ FpElemStr gamma; ///< an integer between [0, p-1]
+} IPrivKey;
+
+/// Intel(R) EPID 2.0 private key
+/*!
+ * Private key: (gid, A, x, f)
+ */
+typedef struct PrivKey {
+ GroupId gid; ///< group ID
+ G1ElemStr A; ///< an element in G1
+ FpElemStr x; ///< an integer between [0, p-1]
+ FpElemStr f; ///< an integer between [0, p-1]
+} PrivKey;
+
+/// 256 bit seed derived from fuse key
+typedef OctStr256 Seed;
+
+/// Compressed private key
+/*!
+ * Compressed Private key: (gid, A.x, seed)
+ */
+typedef struct CompressedPrivKey {
+ GroupId gid; ///< group ID
+ FqElemStr ax; ///< an integer between [0, p-1]
+ Seed seed; ///< 256 bit rekey seed
+} CompressedPrivKey;
+
+/// Membership credential
+/*!
+ * Membership credential: (gid, A, x)
+ */
+typedef struct MembershipCredential {
+ GroupId gid; ///< group ID
+ G1ElemStr A; ///< an element in G1
+ FpElemStr x; ///< an integer between [0, p-1]
+} MembershipCredential;
+
+/// 256 bit nonce chosen by issuer
+typedef OctStr256 IssuerNonce;
+
+/// Join request
+/*!
+ * Join request: (F, c, s)
+ */
+typedef struct JoinRequest {
+ G1ElemStr F; ///< an element in G1
+ FpElemStr c; ///< an integer between [0, p-1]
+ FpElemStr s; ///< an integer between [0, p-1]
+} JoinRequest;
+
+////////////////////////
+
+/// Intel(R) EPID 2.0 basic signature.
+/*!
+ * Basic signature: (B, K, T, c, sx, sf, sa, sb)
+ */
+typedef struct BasicSignature {
+ G1ElemStr B; ///< an element in G1
+ G1ElemStr K; ///< an element in G1
+ G1ElemStr T; ///< an element in G1
+ FpElemStr c; ///< an integer between [0, p-1]
+ FpElemStr sx; ///< an integer between [0, p-1]
+ FpElemStr sf; ///< an integer between [0, p-1]
+ FpElemStr sa; ///< an integer between [0, p-1]
+ FpElemStr sb; ///< an integer between [0, p-1]
+} BasicSignature;
+
+///
+/*!
+ * \brief
+ * non-revoked Proof.
+ *
+ * Non-revoked Proof: (T, c, smu, snu)
+ */
+typedef struct NrProof {
+ G1ElemStr T; ///< an element in G1
+ FpElemStr c; ///< an integer between [0, p-1]
+ FpElemStr smu; ///< an integer between [0, p-1]
+ FpElemStr snu; ///< an integer between [0, p-1]
+} NrProof;
+
+/// Intel(R) EPID 2.0 Signature
+/*!
+ * Signature: (sigma0, RLver, n2, sigma[0], ..., sigma[n2-1])
+ */
+typedef struct EpidSignature {
+ BasicSignature sigma0; ///< basic signature
+ OctStr32 rl_ver; ///< revocation list version number
+ OctStr32 n2; ///< number of entries in SigRL
+ NrProof sigma[1]; ///< array of non-revoked proofs (flexible array)
+} EpidSignature;
+
+/// private-key based revocation list.
+/*!
+ * Private-key based revocation list PrivRL: (gid, RLver, n1, f[0],
+ * ..., f[n1-1])
+ */
+typedef struct PrivRl {
+ GroupId gid; ///< group ID
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n1; ///< number of entries in PrivRL
+ FpElemStr f[1]; ///< integers between [1, p-1] (flexible array)
+} PrivRl;
+
+/// entry in SigRL (B,K)
+typedef struct SigRlEntry {
+ G1ElemStr b; ///< an element of G1
+ G1ElemStr k; ///< an element of G1
+} SigRlEntry;
+
+/// signature based revocation list
+/*!
+ * Signature based revocation list SigRL: (gid, RLver, n2, B[0],
+ * K[0], ..., B[n2-1], K[n2-1])
+ */
+typedef struct SigRl {
+ GroupId gid; ///< group ID
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n2; ///< number of entries in SigRL
+ SigRlEntry bk[1]; ///< revoked Bs and Ks (flexible array)
+} SigRl;
+
+/// group revocation list
+/*!
+ * Group revocation list GroupRL: (RLver, n3, gid[0], ...,
+ * gid[n3-1])
+ */
+typedef struct GroupRl {
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n3; ///< number of entries in GroupRL
+ GroupId gid[1]; ///< revoked group IDs (flexible array)
+} GroupRl;
+
+/*! verifier revocation list
+ * Verifier revocation list VerifierRL: (gid, B, RLver, n4, K[0],
+ * ..., K[n4-1])
+ */
+typedef struct VerifierRl {
+ GroupId gid; ///< group ID
+ G1ElemStr B; ///< an element in G1
+ OctStr32 version; ///< revocation list version number
+ OctStr32 n4; ///< number of entries in VerifierRL
+ G1ElemStr K[1]; ///< elements in G1 (flexible array)
+} VerifierRl;
+
+/// Pre-computed member settings.
+/*!
+ * Serialized form of the information about a member that remains
+ * stable for a given set of keys.
+ *
+ * \note e12 = 0 implies that this data is not valid
+ */
+typedef struct MemberPrecomp {
+ GtElemStr e12; ///< an element in GT
+ GtElemStr e22; ///< an element in GT
+ GtElemStr e2w; ///< an element in GT
+ GtElemStr ea2; ///< an element in GT
+} MemberPrecomp;
+
+/// element to store seed values for later rekey
+typedef G1ElemStr ReKeySeed;
+
+/// Serialized Fq2 element
+typedef struct Fq2ElemStr {
+ FqElemStr a[2]; ///< polynomial coefficient
+} Fq2ElemStr;
+
+/// Serialized Fq2^3 element
+typedef struct Fq6ElemStr {
+ Fq2ElemStr a[3]; ///< polynomial coefficient
+} Fq6ElemStr;
+
+/// Serialized Fq2^3^2 element
+typedef struct Fq12ElemStr {
+ Fq6ElemStr a[2]; ///< polynomial coefficient
+} Fq12ElemStr;
+
+/// ECDSA Signature using NIST 256-bit curve secp256r1
+typedef struct EcdsaSignature {
+ OctStr256 x; ///< 256-bit integer
+ OctStr256 y; ///< 256-bit integer
+} EcdsaSignature;
+
+/// ECDSA Public Key
+typedef struct EcdsaPublicKey {
+ OctStr256 x; ///< 256-bit integer
+ OctStr256 y; ///< 256-bit integer
+} EcdsaPublicKey;
+
+/// ECDSA Private Key
+typedef struct EcdsaPrivateKey {
+ OctStr256 data; ///< 256-bit integer
+} EcdsaPrivateKey;
+#pragma pack()
+
+/*! @} */
+
+#endif // EPID_COMMON_TYPES_H_
diff --git a/epid/common/unittests/file_parser-test.cc b/epid/common/unittests/file_parser-test.cc
new file mode 100644
index 0000000..5024b8e
--- /dev/null
+++ b/epid/common/unittests/file_parser-test.cc
@@ -0,0 +1,1367 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Issuer material file parsing unit tests.
+ */
+#include <cstdint>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+extern "C" {
+#include "epid/common/file_parser.h"
+}
+
+namespace {
+
+/// Test fixture class for EpidFileParser
+class EpidFileParser : public ::testing::Test {
+ public:
+ /// Cert used to sign legitimate test data
+ static const EpidCaCertificate kCert;
+
+ /// A file with short GroupPublicKey signed with kCert
+ static const std::vector<uint8_t> kGroupPublicKeyFile;
+ /// A file with two Epid11GroupPublicKey signed with kCert
+ static const std::vector<uint8_t> kGroupMultiPublicKeyFile;
+ /// Expected short GroupPublicKey
+ static const std::vector<uint8_t> kGroupPublicKey;
+
+ /// A file with short privrl signed with cert
+ static const std::vector<uint8_t> kShortPrivRlFile;
+ /// Expected short privrl
+ static const std::vector<uint8_t> kShortPrivRl;
+
+ /// A file with empty privrl signed with cert
+ static const std::vector<uint8_t> kEmptyPrivRlFile;
+
+ /// Expected empty privrl
+ static const std::vector<uint8_t> kEmptyPrivRl;
+
+ /// A file with empty SigRl signed with kCert
+ static const std::vector<uint8_t> kEmptySigRlFile;
+ /// Expected empty SigRl
+ static const std::vector<uint8_t> kEmptySigRl;
+ /// A file with short SigRl signed with kCert
+ static const std::vector<uint8_t> kShortSigRlFile;
+ /// Expected short SigRl
+ static const std::vector<uint8_t> kShortSigRl;
+
+ /// A file with empty GroupRl signed with kCert
+ static const std::vector<uint8_t> kEmptyGroupRlFile;
+ /// Expected empty GroupRl
+ static const std::vector<uint8_t> kEmptyGroupRl;
+ /// A file with short GroupRl signed with kCert
+ static const std::vector<uint8_t> kShortGroupRlFile;
+ /// Expected short GroupRl
+ static const std::vector<uint8_t> kShortGroupRl;
+};
+
+const EpidCaCertificate EpidFileParser::kCert = {
+ 0x02, 0x00, 0x00, 0x11, 0x24, 0x42, 0xa5, 0xcc, 0x0e, 0xcd, 0x01, 0x5f,
+ 0xa3, 0xca, 0x31, 0xdc, 0x8e, 0x2b, 0xbc, 0x70, 0xbf, 0x42, 0xd6, 0x0c,
+ 0xbc, 0xa2, 0x00, 0x85, 0xe0, 0x82, 0x2c, 0xb0, 0x42, 0x35, 0xe9, 0x70,
+ 0x6f, 0xc9, 0x8b, 0xd7, 0xe5, 0x02, 0x11, 0xa4, 0xa2, 0x71, 0x02, 0xfa,
+ 0x35, 0x49, 0xdf, 0x79, 0xeb, 0xcb, 0x4b, 0xf2, 0x46, 0xb8, 0x09, 0x45,
+ 0xcd, 0xdf, 0xe7, 0xd5, 0x09, 0xbb, 0xfd, 0x7d, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
+ 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, 0xb3, 0xeb, 0xbd, 0x55,
+ 0x76, 0x98, 0x86, 0xbc, 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
+ 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b, 0x6b, 0x17, 0xd1, 0xf2,
+ 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
+ 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45,
+ 0xd8, 0x98, 0xc2, 0x96, 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b,
+ 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57,
+ 0x6b, 0x31, 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e, 0x84,
+ 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51, 0xfb, 0x57, 0x6f, 0x15,
+ 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b,
+ 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32,
+ 0xb9, 0x3a, 0x76, 0xe7, 0x94, 0x03, 0x1d, 0x90, 0x6b, 0x6f, 0xcd, 0x99,
+ 0xef, 0x2c, 0xdb, 0x8b, 0xa9, 0x8a, 0xef, 0x7e, 0xf0, 0x77, 0xba, 0xb5,
+ 0x11, 0x43, 0x0d, 0x28, 0x1c, 0x01, 0x5b, 0xc9, 0x08, 0xce, 0x3e, 0x68};
+
+const std::vector<uint8_t> EpidFileParser::kEmptySigRlFile = {
+ 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47,
+ 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9,
+ 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0x7d, 0x04, 0xa1, 0x29, 0x28, 0xc3, 0x4d, 0x30, 0x8d, 0x67, 0xe4, 0xe8,
+ 0x62, 0x71, 0xe8, 0x4f, 0x0d, 0x45, 0x46, 0xc9, 0xde, 0x67, 0x30, 0x47,
+ 0xb5, 0xfb, 0xb5, 0x66, 0xf5, 0x8f, 0x0d, 0xfb};
+const std::vector<uint8_t> EpidFileParser::kEmptySigRl = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const std::vector<uint8_t> EpidFileParser::kShortSigRlFile = {
+ 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x03, 0x92, 0xb0, 0x8b, 0x6d, 0x6b, 0xa4, 0x32, 0x4e,
+ 0xd1, 0x83, 0x26, 0x24, 0x73, 0x70, 0x80, 0xd3, 0x72, 0xe3, 0xab, 0xfe,
+ 0xbc, 0x86, 0x9f, 0x55, 0x9e, 0x56, 0x57, 0xa5, 0x1f, 0x06, 0x6c, 0x1b,
+ 0x2a, 0x55, 0xb6, 0xb2, 0x13, 0xe9, 0xe8, 0x88, 0x6c, 0xbd, 0xe7, 0xca,
+ 0x81, 0xcb, 0x92, 0x10, 0xa7, 0xef, 0xdc, 0x88, 0xf1, 0x7c, 0x91, 0x07,
+ 0xcc, 0xf0, 0x63, 0x39, 0xae, 0x5c, 0xb9, 0x78, 0xcd, 0x54, 0xdd, 0x98,
+ 0x3e, 0xa6, 0xc9, 0x2f, 0x83, 0x78, 0xc8, 0x64, 0xc9, 0x92, 0x41, 0x52,
+ 0xb9, 0xf9, 0x59, 0x91, 0x46, 0x89, 0x78, 0xda, 0xc3, 0x26, 0xdd, 0x9d,
+ 0x1f, 0x0c, 0x8e, 0xea, 0xba, 0xa8, 0xde, 0xa5, 0x33, 0x8c, 0x2e, 0xaa,
+ 0x0e, 0x2c, 0x13, 0x36, 0xb3, 0x7b, 0xa6, 0x12, 0x98, 0x0a, 0x13, 0x35,
+ 0xa3, 0x9e, 0x52, 0xaf, 0x43, 0xf4, 0x1c, 0x79, 0xcf, 0x46, 0xc6, 0xcd,
+ 0xc4, 0xc4, 0x0d, 0x19, 0xac, 0x77, 0xc7, 0x12, 0xcb, 0x22, 0x4a, 0x65,
+ 0xdb, 0x26, 0xcb, 0x1b, 0x27, 0xbf, 0x25, 0x6f, 0x47, 0xff, 0x2e, 0x59,
+ 0x11, 0x72, 0x0f, 0x42, 0x70, 0x64, 0xd0, 0x78, 0x6c, 0x09, 0xe6, 0xce,
+ 0xd4, 0xd9, 0x7b, 0x80, 0x9a, 0xe9, 0x3e, 0x8f, 0x73, 0x77, 0x84, 0x67,
+ 0x1f, 0xf2, 0x74, 0xbc, 0xcf, 0x9c, 0xb4, 0x58, 0xaa, 0xe2, 0x7b, 0x6f,
+ 0xb6, 0xfe, 0x9a, 0x40, 0x1e, 0x84, 0xab, 0x5f, 0xe8, 0x73, 0xc6, 0x87,
+ 0xcc, 0x9b, 0xb4, 0xf4, 0xd9, 0x5a, 0x9c, 0x2d, 0xea, 0xf3, 0x04, 0x9f,
+ 0xc3, 0xbf, 0x2a, 0xf2, 0x9d, 0xe5, 0x38, 0x2c, 0xf2, 0xcc, 0x46, 0xd9,
+ 0x3e, 0x52, 0xb2, 0x3e, 0x49, 0xf4, 0x08, 0x14, 0x10, 0x31, 0x9c, 0xeb,
+ 0x10, 0xe5, 0x26, 0xaa, 0x4d, 0x76, 0x12, 0xb2, 0xc3, 0x8e, 0x15, 0x4b,
+ 0x28, 0x51, 0xe9, 0x30, 0x00, 0x2c, 0x74, 0xb1, 0x33, 0x71, 0x1c, 0x19,
+ 0xb8, 0x6b, 0x5c, 0xde, 0x30, 0x4f, 0x36, 0x29, 0x29, 0xaf, 0x1d, 0x41,
+ 0xd1, 0xcd, 0xa0, 0x4f, 0xb2, 0x8c, 0xb7, 0x76, 0xc2, 0x60, 0xc8, 0xf7,
+ 0x72, 0x98, 0xe1, 0x75, 0x3c, 0xfb, 0xd7, 0x3c, 0x7c, 0x3a, 0x91, 0x92,
+ 0xb8, 0x83, 0x25, 0xf3, 0x3b, 0xa6, 0x64, 0x4f, 0xa7, 0x70, 0x68, 0x7c,
+ 0xcc, 0x47, 0xdb, 0xbc, 0x0f, 0x54, 0x36, 0x2d, 0xea, 0xde, 0x6f, 0x96,
+ 0xdc, 0xa9, 0xca, 0xa1, 0xb0, 0x80, 0x2e, 0xf8, 0x84, 0x12, 0x84, 0xf6,
+ 0xf7, 0x8c, 0xa3, 0x45, 0xee, 0x87, 0x59, 0xd9, 0x88, 0xa4, 0xbd, 0x1f,
+ 0x0a, 0x41, 0xd7, 0x17, 0x42, 0xc2, 0x8f, 0x46, 0x40, 0xa9, 0x3d, 0x00,
+ 0x99, 0xb4, 0x1d, 0x8f, 0xea, 0xac, 0x86, 0xc1, 0x06, 0x03, 0x02, 0x74,
+ 0x85, 0x78, 0xe6, 0xc3, 0x4b, 0xc1, 0x60, 0x1b, 0xf5, 0xb1, 0xda, 0xd6,
+ 0x03, 0x75, 0xad, 0xd1, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47,
+ 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9,
+ 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0xcb, 0x1d, 0x80, 0xda, 0x3d, 0xd1, 0x68, 0x14, 0x90, 0xa6, 0x4a, 0x33,
+ 0x16, 0x7c, 0x82, 0x86, 0xfb, 0xfa, 0x46, 0x14, 0x51, 0xef, 0xa5, 0x80,
+ 0x1d, 0x97, 0x0a, 0xb6, 0x9d, 0x77, 0x69, 0x6c};
+const std::vector<uint8_t> EpidFileParser::kShortSigRl = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x92, 0xb0, 0x8b, 0x6d, 0x6b, 0xa4, 0x32, 0x4e, 0xd1, 0x83, 0x26, 0x24,
+ 0x73, 0x70, 0x80, 0xd3, 0x72, 0xe3, 0xab, 0xfe, 0xbc, 0x86, 0x9f, 0x55,
+ 0x9e, 0x56, 0x57, 0xa5, 0x1f, 0x06, 0x6c, 0x1b, 0x2a, 0x55, 0xb6, 0xb2,
+ 0x13, 0xe9, 0xe8, 0x88, 0x6c, 0xbd, 0xe7, 0xca, 0x81, 0xcb, 0x92, 0x10,
+ 0xa7, 0xef, 0xdc, 0x88, 0xf1, 0x7c, 0x91, 0x07, 0xcc, 0xf0, 0x63, 0x39,
+ 0xae, 0x5c, 0xb9, 0x78, 0xcd, 0x54, 0xdd, 0x98, 0x3e, 0xa6, 0xc9, 0x2f,
+ 0x83, 0x78, 0xc8, 0x64, 0xc9, 0x92, 0x41, 0x52, 0xb9, 0xf9, 0x59, 0x91,
+ 0x46, 0x89, 0x78, 0xda, 0xc3, 0x26, 0xdd, 0x9d, 0x1f, 0x0c, 0x8e, 0xea,
+ 0xba, 0xa8, 0xde, 0xa5, 0x33, 0x8c, 0x2e, 0xaa, 0x0e, 0x2c, 0x13, 0x36,
+ 0xb3, 0x7b, 0xa6, 0x12, 0x98, 0x0a, 0x13, 0x35, 0xa3, 0x9e, 0x52, 0xaf,
+ 0x43, 0xf4, 0x1c, 0x79, 0xcf, 0x46, 0xc6, 0xcd, 0xc4, 0xc4, 0x0d, 0x19,
+ 0xac, 0x77, 0xc7, 0x12, 0xcb, 0x22, 0x4a, 0x65, 0xdb, 0x26, 0xcb, 0x1b,
+ 0x27, 0xbf, 0x25, 0x6f, 0x47, 0xff, 0x2e, 0x59, 0x11, 0x72, 0x0f, 0x42,
+ 0x70, 0x64, 0xd0, 0x78, 0x6c, 0x09, 0xe6, 0xce, 0xd4, 0xd9, 0x7b, 0x80,
+ 0x9a, 0xe9, 0x3e, 0x8f, 0x73, 0x77, 0x84, 0x67, 0x1f, 0xf2, 0x74, 0xbc,
+ 0xcf, 0x9c, 0xb4, 0x58, 0xaa, 0xe2, 0x7b, 0x6f, 0xb6, 0xfe, 0x9a, 0x40,
+ 0x1e, 0x84, 0xab, 0x5f, 0xe8, 0x73, 0xc6, 0x87, 0xcc, 0x9b, 0xb4, 0xf4,
+ 0xd9, 0x5a, 0x9c, 0x2d, 0xea, 0xf3, 0x04, 0x9f, 0xc3, 0xbf, 0x2a, 0xf2,
+ 0x9d, 0xe5, 0x38, 0x2c, 0xf2, 0xcc, 0x46, 0xd9, 0x3e, 0x52, 0xb2, 0x3e,
+ 0x49, 0xf4, 0x08, 0x14, 0x10, 0x31, 0x9c, 0xeb, 0x10, 0xe5, 0x26, 0xaa,
+ 0x4d, 0x76, 0x12, 0xb2, 0xc3, 0x8e, 0x15, 0x4b, 0x28, 0x51, 0xe9, 0x30,
+ 0x00, 0x2c, 0x74, 0xb1, 0x33, 0x71, 0x1c, 0x19, 0xb8, 0x6b, 0x5c, 0xde,
+ 0x30, 0x4f, 0x36, 0x29, 0x29, 0xaf, 0x1d, 0x41, 0xd1, 0xcd, 0xa0, 0x4f,
+ 0xb2, 0x8c, 0xb7, 0x76, 0xc2, 0x60, 0xc8, 0xf7, 0x72, 0x98, 0xe1, 0x75,
+ 0x3c, 0xfb, 0xd7, 0x3c, 0x7c, 0x3a, 0x91, 0x92, 0xb8, 0x83, 0x25, 0xf3,
+ 0x3b, 0xa6, 0x64, 0x4f, 0xa7, 0x70, 0x68, 0x7c, 0xcc, 0x47, 0xdb, 0xbc,
+ 0x0f, 0x54, 0x36, 0x2d, 0xea, 0xde, 0x6f, 0x96, 0xdc, 0xa9, 0xca, 0xa1,
+ 0xb0, 0x80, 0x2e, 0xf8, 0x84, 0x12, 0x84, 0xf6, 0xf7, 0x8c, 0xa3, 0x45,
+ 0xee, 0x87, 0x59, 0xd9, 0x88, 0xa4, 0xbd, 0x1f, 0x0a, 0x41, 0xd7, 0x17,
+ 0x42, 0xc2, 0x8f, 0x46, 0x40, 0xa9, 0x3d, 0x00, 0x99, 0xb4, 0x1d, 0x8f,
+ 0xea, 0xac, 0x86, 0xc1, 0x06, 0x03, 0x02, 0x74, 0x85, 0x78, 0xe6, 0xc3,
+ 0x4b, 0xc1, 0x60, 0x1b, 0xf5, 0xb1, 0xda, 0xd6, 0x03, 0x75, 0xad, 0xd1};
+
+const std::vector<uint8_t> EpidFileParser::kEmptyPrivRlFile = {
+ 0x02, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47,
+ 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9,
+ 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0x47, 0x18, 0x86, 0x03, 0xfe, 0x8a, 0xb8, 0x4a, 0x9c, 0xb6, 0xcd, 0x8b,
+ 0x1f, 0x68, 0x1c, 0x61, 0x4c, 0xa2, 0x30, 0x95, 0xec, 0x76, 0xc4, 0xa7,
+ 0x00, 0x6c, 0x6e, 0x3c, 0xc6, 0xf9, 0x32, 0xfc};
+
+const std::vector<uint8_t> EpidFileParser::kEmptyPrivRl = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> EpidFileParser::kShortPrivRlFile = {
+ 0x02, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x03, 0x3a, 0x03, 0xb4, 0x95, 0xd3, 0x86, 0xf7, 0xb9,
+ 0x7e, 0x88, 0x79, 0xd8, 0xce, 0x30, 0x44, 0xf3, 0x35, 0xed, 0x0c, 0xb1,
+ 0x80, 0x67, 0xeb, 0x1b, 0x24, 0x7f, 0xe0, 0x0c, 0xc7, 0xe8, 0xae, 0x54,
+ 0xd1, 0xcd, 0x66, 0x2b, 0x11, 0x4e, 0x04, 0x9c, 0xe9, 0x1f, 0xac, 0xb5,
+ 0xdd, 0x74, 0xa4, 0x9f, 0x8e, 0x66, 0x31, 0x4c, 0xde, 0xb2, 0x11, 0x25,
+ 0xcc, 0x8e, 0xee, 0x1e, 0xa2, 0x89, 0x1a, 0xae, 0x7a, 0x98, 0x8e, 0x0a,
+ 0xd7, 0x01, 0xc4, 0xd3, 0x49, 0xb8, 0x56, 0x9a, 0x7b, 0xf4, 0xab, 0x52,
+ 0xb1, 0x1a, 0x84, 0xbd, 0x96, 0xd9, 0x17, 0xb0, 0xe9, 0x38, 0xff, 0xc7,
+ 0x7a, 0x50, 0x0c, 0x8a, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47,
+ 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9,
+ 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0x1c, 0xfb, 0xad, 0x9f, 0x47, 0x4d, 0x46, 0x53, 0x18, 0x05, 0x51, 0x04,
+ 0x31, 0x90, 0x95, 0x33, 0x57, 0xc0, 0x19, 0x64, 0x80, 0xbf, 0x23, 0x4c,
+ 0x92, 0xb6, 0x52, 0xd2, 0xd0, 0x05, 0xbe, 0x58};
+
+const std::vector<uint8_t> EpidFileParser::kShortPrivRl = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x3a, 0x03, 0xb4, 0x95, 0xd3, 0x86, 0xf7, 0xb9, 0x7e, 0x88, 0x79, 0xd8,
+ 0xce, 0x30, 0x44, 0xf3, 0x35, 0xed, 0x0c, 0xb1, 0x80, 0x67, 0xeb, 0x1b,
+ 0x24, 0x7f, 0xe0, 0x0c, 0xc7, 0xe8, 0xae, 0x54, 0xd1, 0xcd, 0x66, 0x2b,
+ 0x11, 0x4e, 0x04, 0x9c, 0xe9, 0x1f, 0xac, 0xb5, 0xdd, 0x74, 0xa4, 0x9f,
+ 0x8e, 0x66, 0x31, 0x4c, 0xde, 0xb2, 0x11, 0x25, 0xcc, 0x8e, 0xee, 0x1e,
+ 0xa2, 0x89, 0x1a, 0xae, 0x7a, 0x98, 0x8e, 0x0a, 0xd7, 0x01, 0xc4, 0xd3,
+ 0x49, 0xb8, 0x56, 0x9a, 0x7b, 0xf4, 0xab, 0x52, 0xb1, 0x1a, 0x84, 0xbd,
+ 0x96, 0xd9, 0x17, 0xb0, 0xe9, 0x38, 0xff, 0xc7, 0x7a, 0x50, 0x0c, 0x8a};
+
+const std::vector<uint8_t> EpidFileParser::kGroupPublicKeyFile = {
+ 0x02, 0x00, 0x00, 0x0c, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x89, 0x33, 0xa7, 0x86,
+ 0xd7, 0x71, 0xcc, 0x80, 0x46, 0x4b, 0x42, 0xc3, 0xe7, 0xba, 0x1a, 0x54,
+ 0x85, 0x8a, 0x21, 0x8e, 0x29, 0x91, 0xa9, 0x60, 0x41, 0xf9, 0xa5, 0xd9,
+ 0x7b, 0x5f, 0x54, 0x49, 0x2a, 0x89, 0x8c, 0x10, 0x0e, 0x26, 0x0d, 0xe8,
+ 0x36, 0x6a, 0x9e, 0x6f, 0x79, 0xff, 0xf1, 0xcd, 0xa7, 0xcd, 0xac, 0x1f,
+ 0x92, 0x33, 0x3a, 0xd9, 0x7c, 0xf5, 0xcd, 0x38, 0x48, 0x01, 0x4f, 0xc5,
+ 0x6f, 0xea, 0x50, 0x60, 0x59, 0x09, 0xda, 0x44, 0x21, 0xc2, 0xd0, 0x86,
+ 0xe6, 0x00, 0x63, 0x59, 0xa9, 0xfb, 0x35, 0x13, 0x4e, 0x13, 0xb1, 0x47,
+ 0x36, 0xd7, 0xbd, 0xf6, 0x0a, 0x35, 0x74, 0x7d, 0x36, 0xc5, 0x67, 0xa2,
+ 0x03, 0xb7, 0x38, 0x31, 0x16, 0xa8, 0x5d, 0x64, 0x3f, 0xe6, 0xf1, 0x94,
+ 0x37, 0x09, 0x8c, 0x20, 0x17, 0xac, 0x2f, 0x55, 0x9e, 0xed, 0xb3, 0xc7,
+ 0x73, 0xc0, 0x1c, 0xbb, 0xbf, 0xf7, 0x18, 0xce, 0x4f, 0xd4, 0xe3, 0x67,
+ 0x75, 0xe4, 0xd9, 0x51, 0xfb, 0x1b, 0x22, 0xf9, 0x72, 0x2e, 0xc1, 0x76,
+ 0x2a, 0xe1, 0x4a, 0x6e, 0x88, 0xd6, 0x2d, 0x71, 0xf4, 0xc4, 0x6d, 0xac,
+ 0x8c, 0xbd, 0xe7, 0x2b, 0xb1, 0x40, 0x15, 0x93, 0xbd, 0x97, 0xd4, 0x84,
+ 0x90, 0xef, 0x4e, 0xfd, 0x78, 0x25, 0xab, 0xdf, 0x16, 0xf3, 0x46, 0x52,
+ 0x16, 0x96, 0xae, 0x50, 0x88, 0x96, 0x18, 0x73, 0xc1, 0xd1, 0x73, 0xf0,
+ 0x67, 0xc8, 0x8d, 0xbb, 0x4e, 0xbc, 0x6a, 0x40, 0xe6, 0x1e, 0x7d, 0x36,
+ 0x8c, 0xf4, 0xb1, 0xf1, 0x5f, 0x26, 0x4f, 0x43, 0x0a, 0x36, 0xd4, 0x67,
+ 0xd4, 0x79, 0x3f, 0xb8, 0x69, 0x6f, 0x9c, 0x33, 0xd3, 0xdb, 0xc6, 0xce,
+ 0x42, 0xe3, 0x46, 0x87, 0xd6, 0x65, 0xac, 0xc9, 0x71, 0xf1, 0xa9, 0x8f,
+ 0x78, 0x45, 0x9a, 0xef, 0x1c, 0xe4, 0x45, 0x84, 0x3d, 0x8a, 0x27, 0x51,
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x58, 0x2a, 0xf6, 0x06,
+ 0xed, 0x55, 0xd6, 0x86, 0x4f, 0x99, 0x57, 0x9e, 0x8c, 0xfc, 0xea, 0x5e,
+ 0x7d, 0xc3, 0x41, 0xa2, 0x51, 0x19, 0x47, 0x4b, 0x56, 0x4e, 0x46, 0x3e,
+ 0xca, 0xd3, 0xb5, 0x89};
+const std::vector<uint8_t> EpidFileParser::kGroupPublicKey = {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff, 0xee, 0xdd, 0xcc,
+ 0xbb, 0xaa, 0x99, 0x88, 0x89, 0x33, 0xa7, 0x86, 0xd7, 0x71, 0xcc, 0x80,
+ 0x46, 0x4b, 0x42, 0xc3, 0xe7, 0xba, 0x1a, 0x54, 0x85, 0x8a, 0x21, 0x8e,
+ 0x29, 0x91, 0xa9, 0x60, 0x41, 0xf9, 0xa5, 0xd9, 0x7b, 0x5f, 0x54, 0x49,
+ 0x2a, 0x89, 0x8c, 0x10, 0x0e, 0x26, 0x0d, 0xe8, 0x36, 0x6a, 0x9e, 0x6f,
+ 0x79, 0xff, 0xf1, 0xcd, 0xa7, 0xcd, 0xac, 0x1f, 0x92, 0x33, 0x3a, 0xd9,
+ 0x7c, 0xf5, 0xcd, 0x38, 0x48, 0x01, 0x4f, 0xc5, 0x6f, 0xea, 0x50, 0x60,
+ 0x59, 0x09, 0xda, 0x44, 0x21, 0xc2, 0xd0, 0x86, 0xe6, 0x00, 0x63, 0x59,
+ 0xa9, 0xfb, 0x35, 0x13, 0x4e, 0x13, 0xb1, 0x47, 0x36, 0xd7, 0xbd, 0xf6,
+ 0x0a, 0x35, 0x74, 0x7d, 0x36, 0xc5, 0x67, 0xa2, 0x03, 0xb7, 0x38, 0x31,
+ 0x16, 0xa8, 0x5d, 0x64, 0x3f, 0xe6, 0xf1, 0x94, 0x37, 0x09, 0x8c, 0x20,
+ 0x17, 0xac, 0x2f, 0x55, 0x9e, 0xed, 0xb3, 0xc7, 0x73, 0xc0, 0x1c, 0xbb,
+ 0xbf, 0xf7, 0x18, 0xce, 0x4f, 0xd4, 0xe3, 0x67, 0x75, 0xe4, 0xd9, 0x51,
+ 0xfb, 0x1b, 0x22, 0xf9, 0x72, 0x2e, 0xc1, 0x76, 0x2a, 0xe1, 0x4a, 0x6e,
+ 0x88, 0xd6, 0x2d, 0x71, 0xf4, 0xc4, 0x6d, 0xac, 0x8c, 0xbd, 0xe7, 0x2b,
+ 0xb1, 0x40, 0x15, 0x93, 0xbd, 0x97, 0xd4, 0x84, 0x90, 0xef, 0x4e, 0xfd,
+ 0x78, 0x25, 0xab, 0xdf, 0x16, 0xf3, 0x46, 0x52, 0x16, 0x96, 0xae, 0x50,
+ 0x88, 0x96, 0x18, 0x73, 0xc1, 0xd1, 0x73, 0xf0, 0x67, 0xc8, 0x8d, 0xbb,
+ 0x4e, 0xbc, 0x6a, 0x40, 0xe6, 0x1e, 0x7d, 0x36, 0x8c, 0xf4, 0xb1, 0xf1,
+ 0x5f, 0x26, 0x4f, 0x43, 0x0a, 0x36, 0xd4, 0x67, 0xd4, 0x79, 0x3f, 0xb8,
+ 0x69, 0x6f, 0x9c, 0x33, 0xd3, 0xdb, 0xc6, 0xce, 0x42, 0xe3, 0x46, 0x87,
+ 0xd6, 0x65, 0xac, 0xc9, 0x71, 0xf1, 0xa9, 0x8f, 0x78, 0x45, 0x9a, 0xef,
+ 0x1c, 0xe4, 0x45, 0x84, 0x3d, 0x8a, 0x27, 0x51};
+const std::vector<uint8_t> EpidFileParser::kGroupMultiPublicKeyFile = {
+ // Public key1
+ 0x02, 0x00, 0x00, 0x0c, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x89, 0x33, 0xa7, 0x86,
+ 0xd7, 0x71, 0xcc, 0x80, 0x46, 0x4b, 0x42, 0xc3, 0xe7, 0xba, 0x1a, 0x54,
+ 0x85, 0x8a, 0x21, 0x8e, 0x29, 0x91, 0xa9, 0x60, 0x41, 0xf9, 0xa5, 0xd9,
+ 0x7b, 0x5f, 0x54, 0x49, 0x2a, 0x89, 0x8c, 0x10, 0x0e, 0x26, 0x0d, 0xe8,
+ 0x36, 0x6a, 0x9e, 0x6f, 0x79, 0xff, 0xf1, 0xcd, 0xa7, 0xcd, 0xac, 0x1f,
+ 0x92, 0x33, 0x3a, 0xd9, 0x7c, 0xf5, 0xcd, 0x38, 0x48, 0x01, 0x4f, 0xc5,
+ 0x6f, 0xea, 0x50, 0x60, 0x59, 0x09, 0xda, 0x44, 0x21, 0xc2, 0xd0, 0x86,
+ 0xe6, 0x00, 0x63, 0x59, 0xa9, 0xfb, 0x35, 0x13, 0x4e, 0x13, 0xb1, 0x47,
+ 0x36, 0xd7, 0xbd, 0xf6, 0x0a, 0x35, 0x74, 0x7d, 0x36, 0xc5, 0x67, 0xa2,
+ 0x03, 0xb7, 0x38, 0x31, 0x16, 0xa8, 0x5d, 0x64, 0x3f, 0xe6, 0xf1, 0x94,
+ 0x37, 0x09, 0x8c, 0x20, 0x17, 0xac, 0x2f, 0x55, 0x9e, 0xed, 0xb3, 0xc7,
+ 0x73, 0xc0, 0x1c, 0xbb, 0xbf, 0xf7, 0x18, 0xce, 0x4f, 0xd4, 0xe3, 0x67,
+ 0x75, 0xe4, 0xd9, 0x51, 0xfb, 0x1b, 0x22, 0xf9, 0x72, 0x2e, 0xc1, 0x76,
+ 0x2a, 0xe1, 0x4a, 0x6e, 0x88, 0xd6, 0x2d, 0x71, 0xf4, 0xc4, 0x6d, 0xac,
+ 0x8c, 0xbd, 0xe7, 0x2b, 0xb1, 0x40, 0x15, 0x93, 0xbd, 0x97, 0xd4, 0x84,
+ 0x90, 0xef, 0x4e, 0xfd, 0x78, 0x25, 0xab, 0xdf, 0x16, 0xf3, 0x46, 0x52,
+ 0x16, 0x96, 0xae, 0x50, 0x88, 0x96, 0x18, 0x73, 0xc1, 0xd1, 0x73, 0xf0,
+ 0x67, 0xc8, 0x8d, 0xbb, 0x4e, 0xbc, 0x6a, 0x40, 0xe6, 0x1e, 0x7d, 0x36,
+ 0x8c, 0xf4, 0xb1, 0xf1, 0x5f, 0x26, 0x4f, 0x43, 0x0a, 0x36, 0xd4, 0x67,
+ 0xd4, 0x79, 0x3f, 0xb8, 0x69, 0x6f, 0x9c, 0x33, 0xd3, 0xdb, 0xc6, 0xce,
+ 0x42, 0xe3, 0x46, 0x87, 0xd6, 0x65, 0xac, 0xc9, 0x71, 0xf1, 0xa9, 0x8f,
+ 0x78, 0x45, 0x9a, 0xef, 0x1c, 0xe4, 0x45, 0x84, 0x3d, 0x8a, 0x27, 0x51,
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed, 0x2a,
+ 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a, 0x6c, 0x06,
+ 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x58, 0x2a, 0xf6, 0x06,
+ 0xed, 0x55, 0xd6, 0x86, 0x4f, 0x99, 0x57, 0x9e, 0x8c, 0xfc, 0xea, 0x5e,
+ 0x7d, 0xc3, 0x41, 0xa2, 0x51, 0x19, 0x47, 0x4b, 0x56, 0x4e, 0x46, 0x3e,
+ 0xca, 0xd3, 0xb5, 0x89,
+ // Public key 2
+ 0x02, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78, 0x8a, 0xb6, 0x0f,
+ 0x9a, 0xf5, 0xe4, 0xd1, 0xe7, 0x39, 0x6a, 0x79, 0x6c, 0xb5, 0xd1, 0xa1,
+ 0x83, 0xec, 0xa1, 0x01, 0xfe, 0xe8, 0x72, 0xce, 0xce, 0x05, 0x9a, 0x4f,
+ 0xa5, 0x17, 0x1b, 0xed, 0x30, 0xc5, 0x00, 0xc0, 0xb4, 0xdb, 0x5e, 0xa6,
+ 0xe2, 0x24, 0x23, 0xab, 0xf5, 0x09, 0xf2, 0x4a, 0x7e, 0x72, 0xfa, 0xc3,
+ 0xbf, 0x33, 0x93, 0x23, 0x48, 0x89, 0xd2, 0x98, 0x08, 0xe1, 0x01, 0xba,
+ 0x9d, 0xa9, 0xe5, 0x41, 0x46, 0x2e, 0xbb, 0x9e, 0x6a, 0xfd, 0x28, 0x85,
+ 0x94, 0xd5, 0x6e, 0x5a, 0xfa, 0x42, 0x71, 0x6e, 0xdc, 0x7e, 0xdb, 0xd1,
+ 0xf2, 0x84, 0x11, 0x08, 0x4f, 0x0f, 0x22, 0x1f, 0x32, 0xbe, 0xd7, 0x6f,
+ 0x55, 0x17, 0x17, 0x4a, 0xa7, 0x46, 0xeb, 0xca, 0x02, 0x65, 0x53, 0xca,
+ 0xd7, 0x93, 0x03, 0x01, 0xe1, 0x54, 0xfc, 0xdd, 0xb4, 0x95, 0x5a, 0x5c,
+ 0x0c, 0x8c, 0x13, 0x65, 0x02, 0x16, 0xf0, 0xfc, 0xbb, 0x02, 0x5f, 0x87,
+ 0x83, 0x8c, 0xd0, 0x3e, 0x69, 0xc8, 0xf5, 0x7c, 0x09, 0xdd, 0x48, 0x65,
+ 0x82, 0x48, 0x6f, 0xb5, 0x35, 0x0c, 0xc4, 0x04, 0x2d, 0x83, 0x0a, 0x3e,
+ 0xa0, 0x0f, 0x5f, 0x8e, 0x61, 0xf7, 0xc3, 0xb5, 0x5c, 0x66, 0xf8, 0xf8,
+ 0xa3, 0x0a, 0xc1, 0x50, 0xcd, 0xb0, 0x44, 0x19, 0x14, 0x07, 0xf1, 0xad,
+ 0x7a, 0xec, 0x73, 0xac, 0x55, 0x01, 0x8a, 0xa6, 0x62, 0x9b, 0x30, 0xf3,
+ 0xf9, 0xc5, 0xd1, 0x3d, 0xf2, 0x36, 0x13, 0x28, 0x4d, 0xbf, 0x95, 0x88,
+ 0x76, 0x6b, 0xb0, 0x18, 0xd8, 0x3f, 0xa6, 0x22, 0x69, 0x13, 0x06, 0xa4,
+ 0x04, 0xbf, 0x52, 0x8e, 0xf0, 0x11, 0x99, 0x65, 0xb9, 0xf8, 0x57, 0x0b,
+ 0xf6, 0xc2, 0xe8, 0xaf, 0xee, 0xd4, 0x6e, 0xa7, 0x49, 0x7b, 0xeb, 0x8f,
+ 0x92, 0x66, 0x45, 0xda, 0xb4, 0x01, 0xa8, 0xee, 0x7c, 0xdf, 0x8e, 0x08,
+ 0xdf, 0x69, 0x19, 0x8c, 0xfa, 0x23, 0x52, 0x71, 0x12, 0x10, 0xfb, 0x13,
+ 0x2f, 0x17, 0x16, 0x9c, 0x7e, 0xc0, 0xe5, 0x22, 0x74, 0x81, 0x38, 0xed,
+ 0x3f, 0xe1, 0x72, 0xc9, 0x46, 0x4c, 0x03, 0x7a, 0x79, 0xe0, 0x84, 0x32,
+ 0x34, 0x59, 0x46, 0x98, 0xe7, 0xc6, 0x5f, 0xd8, 0x5f, 0xf0, 0xee, 0x1b,
+ 0x53, 0x4c, 0xce, 0x61, 0xb7, 0x91, 0xbf, 0x71, 0xb3, 0xeb, 0x73, 0x66,
+ 0x47, 0x28, 0x1d, 0x20};
+const std::vector<uint8_t> EpidFileParser::kEmptyGroupRlFile = {
+ 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71,
+ 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70,
+ 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0x30, 0x9f, 0x8c, 0xae, 0x9b, 0x2a, 0xab, 0xcf, 0xb9, 0x85, 0x6f,
+ 0x16, 0x21, 0x92, 0xb8, 0x9a, 0x31, 0x2c, 0xb8, 0x04, 0x20, 0xc8,
+ 0x2a, 0x98, 0x8f, 0xd5, 0xaf, 0xc7, 0x27, 0xe5, 0x04, 0x0c};
+const std::vector<uint8_t> EpidFileParser::kEmptyGroupRl = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const std::vector<uint8_t> EpidFileParser::kShortGroupRlFile = {
+ 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x9a, 0xbc, 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47,
+ 0x51, 0x71, 0xed, 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9,
+ 0x70, 0x2a, 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7,
+ 0x09, 0x15, 0x86, 0xd7, 0x24, 0x47, 0xfc, 0x1e, 0x44, 0xc0, 0xfb, 0x9e,
+ 0x4f, 0xe4, 0x92, 0x85, 0x79, 0x94, 0x9c, 0x80, 0xd1, 0xa1, 0x66, 0x34,
+ 0x79, 0xb6, 0xb3, 0x3b, 0x66, 0xad, 0x2e, 0x40};
+const std::vector<uint8_t> EpidFileParser::kShortGroupRl = {
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xbc};
+
+//////////////////////////////////////////////////////////////////////////
+// EpidParseGroupPubKeyFile Tests
+TEST_F(EpidFileParser, GroupPubKeyParseFailsGivenNullParameters) {
+ GroupPubKey pubkey;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile(nullptr, this->kGroupPublicKeyFile.size(),
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(), nullptr,
+ &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &this->kCert, nullptr));
+}
+
+TEST_F(EpidFileParser, GroupPubKeyParseFailsGivenUnsupportedCurve) {
+ GroupPubKey pubkey;
+ EpidCaCertificate unsupported_curve1(this->kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve1, &pubkey));
+ EpidCaCertificate unsupported_curve2(this->kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve2, &pubkey));
+ EpidCaCertificate unsupported_curve3(this->kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve3, &pubkey));
+ EpidCaCertificate unsupported_curve4(this->kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve4, &pubkey));
+ EpidCaCertificate unsupported_curve5(this->kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve5, &pubkey));
+ EpidCaCertificate unsupported_curve6(this->kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &unsupported_curve6, &pubkey));
+}
+
+TEST_F(EpidFileParser, GroupPubKeyParseFailsGivenInvalidKeyInCertificate) {
+ GroupPubKey pubkey;
+ EpidCaCertificate invalid_key_qx(this->kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qx, &pubkey));
+ EpidCaCertificate invalid_key_qy(this->kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qy, &pubkey));
+ EpidCaCertificate invalid_key_qx_qy(this->kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &invalid_key_qx_qy, &pubkey));
+}
+
+TEST_F(EpidFileParser, RejectsGroupPubKeyFileWithInvalidSize) {
+ GroupPubKey pubkey;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(), 0,
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size() - 1,
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr, EpidParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size() - 1,
+ &this->kCert, &pubkey));
+ EXPECT_EQ(kEpidBadArgErr, EpidParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size() + 1,
+ &this->kCert, &pubkey));
+}
+
+TEST_F(EpidFileParser, RejectsInvalidGroupPubKeyFileType) {
+ GroupPubKey pubkey;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)this->kShortPrivRlFile.data(),
+ this->kGroupPublicKeyFile.size(),
+ &this->kCert, &pubkey));
+}
+
+TEST_F(EpidFileParser, RejectsGroupPubKeyFileWithUnsupportedEpidVersion) {
+ GroupPubKey pubkey;
+
+ std::vector<uint8_t> unsupported_epidver_file(this->kGroupPublicKeyFile);
+ unsupported_epidver_file[0] = {0x01};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupPubKeyFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(),
+ &this->kCert, &pubkey));
+}
+
+TEST_F(EpidFileParser, ParsesValidPubKeyFile) {
+ std::vector<uint8_t> pubkey(sizeof(GroupPubKey), 0);
+ EXPECT_EQ(kEpidNoErr, EpidParseGroupPubKeyFile(
+ (void*)this->kGroupPublicKeyFile.data(),
+ this->kGroupPublicKeyFile.size(), &this->kCert,
+ (GroupPubKey*)pubkey.data()));
+ EXPECT_EQ(this->kGroupPublicKey, pubkey);
+}
+
+TEST_F(EpidFileParser, ParsesValidMultiPubKeyFile) {
+ std::vector<uint8_t> pubkey(sizeof(GroupPubKey), 0);
+ EXPECT_EQ(kEpidNoErr, EpidParseGroupPubKeyFile(
+ (void*)this->kGroupMultiPublicKeyFile.data(),
+ this->kGroupMultiPublicKeyFile.size(), &this->kCert,
+ (GroupPubKey*)pubkey.data()));
+ EXPECT_EQ(this->kGroupPublicKey, pubkey);
+}
+
+TEST_F(EpidFileParser, RejectsGroupPubKeyFileWithInvalidSignature) {
+ GroupPubKey pubkey;
+ std::vector<uint8_t> pubkey_inv_sign(this->kGroupPublicKeyFile);
+ pubkey_inv_sign[pubkey_inv_sign.size() - 1] =
+ pubkey_inv_sign[pubkey_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidSigInvalid,
+ EpidParseGroupPubKeyFile((void*)pubkey_inv_sign.data(),
+ pubkey_inv_sign.size(), &this->kCert, &pubkey));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidParsePrivRlFile Tests
+TEST_F(EpidFileParser, PrivRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ nullptr, &rl_len));
+ EXPECT_EQ(this->kShortPrivRl.size(), rl_len);
+}
+
+TEST_F(EpidFileParser, PrivRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ // null input buffer
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile(nullptr, this->kShortPrivRlFile.size(),
+ &this->kCert, (PrivRl*)rl.data(), &rl_len));
+ // null cert
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), nullptr,
+ (PrivRl*)rl.data(), &rl_len));
+ // null rl_length
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (PrivRl*)rl.data(), nullptr));
+ // null rl_length with null dest
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ nullptr, nullptr));
+}
+
+TEST_F(EpidFileParser, PrivRlParseFailsGivenUnsupportedCurve) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve(kCert);
+ unsupported_curve.a.data[0] = unsupported_curve.a.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve,
+ (PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve2,
+ (PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve3,
+ (PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve4,
+ (PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve5,
+ (PrivRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &unsupported_curve6,
+ (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, PrivRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qx,
+ (PrivRl*)rl.data(), &rl_len));
+
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qy,
+ (PrivRl*)rl.data(), &rl_len));
+
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &invalid_key_qx_qy,
+ (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsPrivRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptyPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kEmptyPrivRlFile.data(),
+ this->kEmptyPrivRlFile.size() - 1, &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kEmptyPrivRlFile.data(), 0,
+ &this->kCert, (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsInvalidPrivRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsPrivRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortPrivRlFile);
+ unsupported_epidver_file[0] = {0x01};
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ParsesEmptyPrivRl) {
+ size_t rl_len = this->kEmptyPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParsePrivRlFile((void*)this->kEmptyPrivRlFile.data(),
+ this->kEmptyPrivRlFile.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(this->kEmptyPrivRl, rl);
+}
+
+TEST_F(EpidFileParser, ParsesShortPrivRl) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(this->kShortPrivRl, rl);
+}
+
+TEST_F(EpidFileParser, ParsesLongPrivRl) {
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x02,
+ 0xd7, 0x14, 0x3e, 0xce, 0x36, 0x24, 0xb2, 0xe5, 0x14, 0x94, 0x17,
+ 0xdf, 0x8d, 0x0f, 0xda, 0xff, 0x8c, 0xb9, 0x7f, 0xb6, 0x05, 0x09,
+ 0x08, 0x80, 0xb0, 0xb8, 0x45, 0x92, 0x15, 0xb6, 0x08,
+ };
+
+ std::vector<uint8_t> long_privrl_file = {// Intel(R) EPID Version
+ 0x02, 0x00,
+ // File Type
+ 0x00, 0x0d,
+ // Group ID
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2a,
+ // Revocation list version number
+ 0x00, 0x00, 0x00, 0x00,
+ // Number of entries
+ 0x00, 0x00, 0x00, 0x32};
+ const std::vector<uint8_t> FToCreateLongRl = {
+ 0x8a, 0xdc, 0xc0, 0xc8, 0xcd, 0x29, 0x9e, 0x08, 0x9e, 0x4e, 0x0d,
+ 0xa7, 0xf6, 0x46, 0xee, 0x80, 0xca, 0x91, 0x86, 0x54, 0x3c, 0x7f,
+ 0x8d, 0xb5, 0x49, 0xf9, 0x6d, 0x00, 0x39, 0x39, 0x62, 0xc7,
+ };
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : FToCreateLongRl) {
+ long_privrl_file.push_back(it);
+ }
+ }
+ for (auto it : signature.x.data) {
+ long_privrl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_privrl_file.push_back(it);
+ }
+ size_t rl_len = long_privrl_file.size() - 68;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParsePrivRlFile((void*)long_privrl_file.data(),
+ long_privrl_file.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+ EXPECT_EQ(
+ std::vector<uint8_t>(&long_privrl_file[4],
+ &long_privrl_file[long_privrl_file.size() - 64]),
+ rl);
+}
+
+TEST_F(EpidFileParser, RejectsPrivRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> privrl_inv_sign(kShortPrivRlFile);
+ privrl_inv_sign[privrl_inv_sign.size() - 1] =
+ privrl_inv_sign[privrl_inv_sign.size() - 1] ^ 0xFF;
+
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidParsePrivRlFile(privrl_inv_sign.data(), privrl_inv_sign.size(),
+ &this->kCert, (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, PrivRlParseRejectsBufWithInsufficientSize) {
+ size_t rl_len = this->kShortPrivRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (PrivRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ReturnsProperSizeGivenOversizedPrivRlBuf) {
+ size_t rl_len = this->kShortPrivRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParsePrivRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (PrivRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortPrivRl, rl);
+ EXPECT_EQ(this->kShortPrivRl.size(), rl_len);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidParseSigRlFile Tests
+TEST_F(EpidFileParser, SigRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr, EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert,
+ nullptr, &rl_len));
+ EXPECT_EQ(rl_len, this->kShortSigRl.size());
+}
+
+TEST_F(EpidFileParser, SigRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile(nullptr, this->kShortSigRlFile.size(), &kCert,
+ (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), nullptr,
+ (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert,
+ (SigRl*)rl.data(), nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &kCert, nullptr,
+ nullptr));
+}
+
+TEST_F(EpidFileParser, SigRlParseFailsGivenUnsupportedCurve) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve1(kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve1,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve2,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve3,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve4,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve5,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &unsupported_curve6,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, SigRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qx,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qy,
+ (SigRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &invalid_key_qx_qy,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsSigRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptySigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kEmptySigRlFile.data(), 0,
+ &this->kCert, (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kEmptySigRlFile.data(),
+ this->kEmptySigRlFile.size() - 1, &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kEmptySigRlFile.size() + 1, &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, SigRlParseRejectsInvalidSigRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsSigRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortSigRlFile);
+ unsupported_epidver_file[0] = {0x01};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ParsesEmptySigRl) {
+ size_t rl_len = this->kEmptySigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseSigRlFile(this->kEmptySigRlFile.data(),
+ this->kEmptySigRlFile.size(), &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kEmptySigRl);
+}
+
+TEST_F(EpidFileParser, ParsesShortSigRl) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseSigRlFile(this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kShortSigRl);
+}
+
+TEST_F(EpidFileParser, ParsesLongSigRl) {
+ std::vector<uint8_t> b = {
+ 0x92, 0xb0, 0x8b, 0x6d, 0x6b, 0xa4, 0x32, 0x4e, 0xd1, 0x83, 0x26, 0x24,
+ 0x73, 0x70, 0x80, 0xd3, 0x72, 0xe3, 0xab, 0xfe, 0xbc, 0x86, 0x9f, 0x55,
+ 0x9e, 0x56, 0x57, 0xa5, 0x1f, 0x06, 0x6c, 0x1b, 0x2a, 0x55, 0xb6, 0xb2,
+ 0x13, 0xe9, 0xe8, 0x88, 0x6c, 0xbd, 0xe7, 0xca, 0x81, 0xcb, 0x92, 0x10,
+ 0xa7, 0xef, 0xdc, 0x88, 0xf1, 0x7c, 0x91, 0x07, 0xcc, 0xf0, 0x63, 0x39,
+ 0xae, 0x5c, 0xb9, 0x78, 0xcd, 0x54, 0xdd, 0x98, 0x3e, 0xa6, 0xc9, 0x2f,
+ 0x83, 0x78, 0xc8, 0x64, 0xc9, 0x92, 0x41, 0x52, 0xb9, 0xf9, 0x59, 0x91,
+ 0x46, 0x89, 0x78, 0xda, 0xc3, 0x26, 0xdd, 0x9d, 0x1f, 0x0c, 0x8e, 0xea,
+ 0xba, 0xa8, 0xde, 0xa5, 0x33, 0x8c, 0x2e, 0xaa, 0x0e, 0x2c, 0x13, 0x36,
+ 0xb3, 0x7b, 0xa6, 0x12, 0x98, 0x0a, 0x13, 0x35, 0xa3, 0x9e, 0x52, 0xaf,
+ 0x43, 0xf4, 0x1c, 0x79, 0xcf, 0x46, 0xc6, 0xcd};
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0x35,
+ 0xb4, 0x20, 0x07, 0x4e, 0xed, 0xc3, 0xb1, 0x60, 0xd8, 0x78, 0x32,
+ 0xb3, 0xa0, 0x8e, 0xc2, 0xab, 0xdb, 0x46, 0x6b, 0x03, 0x94, 0xd7,
+ 0x90, 0xd3, 0xfd, 0xd3, 0x5a, 0x9a, 0xc3, 0x66, 0xab,
+ };
+ std::vector<uint8_t> long_sigrl_file = {
+ // Intel(R) EPID Version
+ 0x02, 0x00,
+ // File Type
+ 0x00, 0x0e,
+ // Group ID
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0x34,
+ // Revocation list version number
+ 0x00, 0x00, 0x00, 0x03,
+ // Number of revocation list entries N
+ 0x00, 0x00, 0x00, 0x32,
+ };
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : b) {
+ long_sigrl_file.push_back(it);
+ }
+ }
+ for (auto it : signature.x.data) {
+ long_sigrl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_sigrl_file.push_back(it);
+ }
+ size_t rl_len = long_sigrl_file.size() - sizeof(signature) - 4;
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseSigRlFile(long_sigrl_file.data(), long_sigrl_file.size(),
+ &this->kCert, (SigRl*)rl.data(), &rl_len));
+
+ std::vector<uint8_t> expected_long_sig_rl(std::vector<uint8_t>(
+ &long_sigrl_file[4],
+ &long_sigrl_file[long_sigrl_file.size() - sizeof(signature)]));
+
+ EXPECT_EQ(expected_long_sig_rl, rl);
+}
+
+TEST_F(EpidFileParser, RejectsSigRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortSigRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> sigrl_inv_sign(kShortSigRlFile);
+ sigrl_inv_sign[sigrl_inv_sign.size() - 1] =
+ sigrl_inv_sign[sigrl_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidSigInvalid,
+ EpidParseSigRlFile((void*)sigrl_inv_sign.data(), sigrl_inv_sign.size(),
+ &this->kCert, (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, SigRlParseRejectsBufWithInsufficientSize) {
+ size_t rl_len = this->kShortSigRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (SigRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ReturnsProperSizeGivenOversizedSigRlBuf) {
+ size_t rl_len = this->kShortSigRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseSigRlFile((void*)this->kShortSigRlFile.data(),
+ this->kShortSigRlFile.size(), &this->kCert,
+ (SigRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortSigRl, rl);
+ EXPECT_EQ(this->kShortSigRl.size(), rl_len);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidParseGroupRlFile Tests
+TEST_F(EpidFileParser, GroupRlParseProvidesRequiredLenWithNullDest) {
+ size_t rl_len = 0;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ nullptr, &rl_len));
+ EXPECT_EQ(rl_len, this->kShortGroupRl.size());
+}
+
+TEST_F(EpidFileParser, GroupRlParseFailsGivenNullParameters) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile(nullptr, this->kShortGroupRlFile.size(),
+ &kCert, (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), nullptr,
+ (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ (GroupRl*)rl.data(), nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &kCert,
+ nullptr, nullptr));
+}
+
+TEST_F(EpidFileParser, GroupRlParseFailsGivenUnsupportedCurve) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate unsupported_curve1(kCert);
+ unsupported_curve1.a.data[0] = unsupported_curve1.a.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve1,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve2(kCert);
+ unsupported_curve2.b.data[0] = unsupported_curve2.b.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve2,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve3(kCert);
+ unsupported_curve3.x.data[0] = unsupported_curve3.x.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve3,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve4(kCert);
+ unsupported_curve4.y.data[0] = unsupported_curve4.y.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve4,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve5(kCert);
+ unsupported_curve5.r.data[0] = unsupported_curve5.r.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve5,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate unsupported_curve6(kCert);
+ unsupported_curve6.prime.data[0] = unsupported_curve6.prime.data[0] ^ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &unsupported_curve6,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, GroupRlParseFailsGivenInvalidKeyInCertificate) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EpidCaCertificate invalid_key_qx(kCert);
+ invalid_key_qx.pubkey.data[0] = invalid_key_qx.pubkey.data[0] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr, EpidParseGroupRlFile(
+ (void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qx,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qy(kCert);
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] =
+ invalid_key_qy.pubkey.data[sizeof(invalid_key_qy.pubkey) - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidBadArgErr, EpidParseGroupRlFile(
+ (void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qy,
+ (GroupRl*)rl.data(), &rl_len));
+ EpidCaCertificate invalid_key_qx_qy(kCert);
+ invalid_key_qx_qy.pubkey.data[0] = invalid_key_qx_qy.pubkey.data[0] ^ 0xFF;
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] =
+ invalid_key_qx_qy.pubkey.data[sizeof(invalid_key_qx_qy.pubkey) - 1] ^
+ 0xFF;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &invalid_key_qx_qy,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsGroupRlFileWithInvalidSize) {
+ size_t rl_len = this->kEmptyGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kEmptyGroupRlFile.data(), 0,
+ &this->kCert, (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kEmptyGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size() - 1,
+ &this->kCert, (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size() + 1,
+ &this->kCert, (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsInvalidGroupRlFileType) {
+ size_t rl_len = this->kShortPrivRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortPrivRlFile.data(),
+ this->kShortPrivRlFile.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, RejectsGroupRlFileWithUnsupportedEpidVersion) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> unsupported_epidver_file(this->kShortGroupRlFile);
+ unsupported_epidver_file[0] = {0x01};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)unsupported_epidver_file.data(),
+ unsupported_epidver_file.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ParsesEmptyGroupRl) {
+ size_t rl_len = this->kEmptyGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseGroupRlFile(this->kEmptyGroupRlFile.data(),
+ this->kEmptyGroupRlFile.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kEmptyGroupRl);
+}
+
+TEST_F(EpidFileParser, ParsesShortGroupRl) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseGroupRlFile(this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+ EXPECT_EQ(rl, this->kShortGroupRl);
+}
+
+TEST_F(EpidFileParser, ParsesLongGroupRl) {
+ std::vector<uint8_t> gid = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xbc};
+ EcdsaSignature signature = {
+ 0xfb, 0x57, 0x6f, 0x15, 0x3e, 0xf8, 0x41, 0x47, 0x51, 0x71, 0xed,
+ 0x2a, 0x9b, 0x88, 0x99, 0x5b, 0x85, 0x3b, 0xdf, 0xf9, 0x70, 0x2a,
+ 0x6c, 0x06, 0x3b, 0x72, 0x02, 0x32, 0xb9, 0x3a, 0x76, 0xe7, 0xa4,
+ 0xaa, 0x8c, 0x1c, 0x91, 0xa2, 0x57, 0x07, 0x67, 0x0e, 0x58, 0xae,
+ 0xc7, 0x25, 0x15, 0x36, 0xda, 0xa0, 0xea, 0xc1, 0x15, 0x2b, 0xf2,
+ 0xc2, 0x33, 0x43, 0x3f, 0xc6, 0x56, 0xc1, 0x57, 0xbd,
+ };
+ std::vector<uint8_t> long_grouprl_file = {
+ /// Intel(R) EPID Version
+ 0x02, 0x00,
+ // File type
+ 0x00, 0x0f,
+ // RLver: revocation list version number
+ 0x00, 0x00, 0x00, 0x01,
+ // n3: number of entries in GroupRL
+ 0x00, 0x00, 0x00, 0x32,
+ };
+ for (int i = 0; i < 50; ++i) {
+ for (auto it : gid) {
+ long_grouprl_file.push_back(it);
+ }
+ }
+ for (auto it : signature.x.data) {
+ long_grouprl_file.push_back(it);
+ }
+ for (auto it : signature.y.data) {
+ long_grouprl_file.push_back(it);
+ }
+
+ size_t rl_len = long_grouprl_file.size() - sizeof(signature) - 4;
+ std::vector<uint8_t> rl(rl_len);
+ EXPECT_EQ(kEpidNoErr, EpidParseGroupRlFile(
+ long_grouprl_file.data(), long_grouprl_file.size(),
+ &this->kCert, (GroupRl*)rl.data(), &rl_len));
+
+ std::vector<uint8_t> expected_long_gr_rl(std::vector<uint8_t>(
+ &long_grouprl_file[4],
+ &long_grouprl_file[long_grouprl_file.size() - sizeof(signature)]));
+
+ EXPECT_EQ(expected_long_gr_rl, rl);
+}
+
+TEST_F(EpidFileParser, RejectsGroupRlFileWithInvalidSignature) {
+ size_t rl_len = this->kShortGroupRl.size();
+ std::vector<uint8_t> rl(rl_len);
+ std::vector<uint8_t> grouprl_inv_sign(this->kShortGroupRlFile);
+ grouprl_inv_sign[grouprl_inv_sign.size() - 1] =
+ grouprl_inv_sign[grouprl_inv_sign.size() - 1] ^ 0xFF;
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidParseGroupRlFile((void*)grouprl_inv_sign.data(),
+ grouprl_inv_sign.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, GroupRlParseRejectsBufWithInsufficientSize) {
+ size_t rl_len = this->kShortGroupRl.size() - 1;
+ std::vector<uint8_t> rl(rl_len);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (GroupRl*)rl.data(), &rl_len));
+}
+
+TEST_F(EpidFileParser, ReturnsProperSizeGivenOversizedGroupRlBuf) {
+ size_t rl_len = this->kShortGroupRl.size() + 1;
+ std::vector<uint8_t> oversized_rl(rl_len);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseGroupRlFile((void*)this->kShortGroupRlFile.data(),
+ this->kShortGroupRlFile.size(), &this->kCert,
+ (GroupRl*)oversized_rl.data(), &rl_len));
+ std::vector<uint8_t> rl(oversized_rl.begin(), oversized_rl.end() - 1);
+ EXPECT_EQ(this->kShortGroupRl, rl);
+ EXPECT_EQ(this->kShortGroupRl.size(), rl_len);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidParseFileHeader Tests
+TEST_F(EpidFileParser, ParseFileHeaderFailsGivenNullInParameters) {
+ EpidVersion epid_version = kNumEpidVersions;
+ EpidFileType file_type = kNumFileTypes;
+ EXPECT_EQ(kEpidBadArgErr, EpidParseFileHeader(nullptr, sizeof(EpidFileHeader),
+ &epid_version, &file_type));
+}
+
+TEST_F(EpidFileParser, ParseFileHeaderFailsGivenInvalidSize) {
+ EpidVersion epid_version = kNumEpidVersions;
+ EpidFileType file_type = kNumFileTypes;
+ EpidFileHeader epid_header = this->kCert.header;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header) - 1,
+ &epid_version, &file_type));
+}
+
+TEST_F(EpidFileParser, ParseFileHeaderReportsUnknownEpidVersion) {
+ // Since this variable must contain kNumEpidVersions after the function call,
+ // assign something different from kNumEpidVersions
+ EpidVersion epid_version = kEpid1x;
+ EpidFileType file_type = kNumFileTypes;
+ EpidFileHeader epid_header = this->kCert.header;
+ epid_header.epid_version.data[0] = 0x00;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ &epid_version, &file_type));
+ EXPECT_EQ(kNumEpidVersions, epid_version);
+ EXPECT_EQ(kIssuingCaPubKeyFile, file_type);
+}
+
+TEST_F(EpidFileParser, ParseFileHeaderReportsUnknownFileType) {
+ EpidVersion epid_version = kNumEpidVersions;
+ // Since this variable must contain kNumFileTypes after the function call,
+ // assign something not kNumFileTypes
+ EpidFileType file_type = kIssuingCaPubKeyFile;
+ EpidFileHeader epid_header = this->kCert.header;
+ epid_header.file_type.data[1] = 0x00;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ &epid_version, &file_type));
+ EXPECT_EQ(kEpid2x, epid_version);
+ EXPECT_EQ(kNumFileTypes, file_type);
+}
+
+TEST_F(EpidFileParser, ParseFileHeaderCanSkipExtractingSomeValues) {
+ EpidVersion epid_version = kNumEpidVersions;
+ EpidFileType file_type = kNumFileTypes;
+ EpidFileHeader epid_header = this->kCert.header;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ nullptr, &file_type));
+ EXPECT_EQ(kIssuingCaPubKeyFile, file_type);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ &epid_version, nullptr));
+ EXPECT_EQ(kEpid2x, epid_version);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ nullptr, nullptr));
+}
+
+TEST_F(EpidFileParser, ParseFileHeaderParsesCorrectly) {
+ EpidVersion epid_version = kNumEpidVersions;
+ EpidFileType file_type = kNumFileTypes;
+ EpidFileHeader epid_header = this->kCert.header;
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header, sizeof(epid_header),
+ &epid_version, &file_type));
+ EXPECT_EQ(kEpid2x, epid_version);
+ EXPECT_EQ(kIssuingCaPubKeyFile, file_type);
+
+ EpidFileHeader epid_header2 = {0x01, 0x00, 0x00, 0x0B};
+ EXPECT_EQ(kEpidNoErr,
+ EpidParseFileHeader((void*)&epid_header2, sizeof(epid_header2),
+ &epid_version, &file_type));
+ EXPECT_EQ(kEpid1x, epid_version);
+ EXPECT_EQ(kSigRlRequestFile, file_type);
+}
+} // namespace
diff --git a/epid/member/Makefile b/epid/member/Makefile
new file mode 100644
index 0000000..29e0cf3
--- /dev/null
+++ b/epid/member/Makefile
@@ -0,0 +1,186 @@
+#!/usr/bin/make -f
+
+#define path variables
+IPP_SRC_INCLUDE_DIR = ../../ext/ipp/sources/ippcp/src/
+IPP_INCLUDE_DIR = ../../ext/ipp/sources/include/
+GTEST_INCLUDE_DIR = ../../ext/
+
+LIB_INSTALL_DIR = $(epidinstalldir)/lib/posix-$(ARCH)/
+TEST_INSTALL_DIR = $(epidinstalldir)/test/
+HEADERS_INSTALL_DIR := $(epidinstalldir)/include/epid/member/
+
+API_HEADERS_INSTALL = $(wildcard ./*.h)
+
+MEMBER_INCLUDE_DIR = ../../
+TINY_MEMBER_INCLUDE_DIR = ./tiny/
+
+MEMBER_SRC = $(wildcard ./src/*.c)
+TINY_MEMBER_SRC = $(wildcard ./tiny/src/*.c)
+TINY_MEMBER_MATH_SRC = $(wildcard ./tiny/math/src/*.c)
+TINY_STDLIB_MEMBER_SRC = $(wildcard ./tiny/stdlib/src/*.c)
+MEMBER_TPM2_TSS_UTEST_SRC = $(wildcard ./tpm2/unittests/*.cc)
+ifneq ($(TSS_PATH),)
+ MEMBER_TPM2_SRC = $(wildcard ./tpm2/ibm_tss/*.c)
+ MEMBER_TPM2_UTEST_SRC = $(filter-out $(wildcard ./tpm2/unittests/*-simulator-test.cc), \
+ $(MEMBER_TPM2_TSS_UTEST_SRC))
+ MEMBER_INCLUDE_DIR += -I$(TSS_PATH)
+ CFLAGS += -DTPM_TSS
+ CXXFLAGS += -DTPM_TSS
+else
+ MEMBER_TPM2_SRC = $(wildcard ./tpm2/src/*.c)
+ MEMBER_TPM2_UTEST_SRC = $(filter-out $(wildcard ./tpm2/unittests/*-tss-test.cc), \
+ $(MEMBER_TPM2_TSS_UTEST_SRC))
+endif
+MEMBER_SRC += $(MEMBER_TPM2_SRC)
+MEMBER_LIB = ./libmember.a
+MATH_LIB = ./libmath.a
+STDLIB_LIB = ./libtiny_stdlib.a
+
+MEMBER_UTEST_EXE = ./member-utest$(EXE_EXTENSION)
+MEMBER_UTEST_SRC = $(wildcard ./unittests/*.cc) \
+ ./tpm2/unittests/tpm2_wrapper-testhelper.cc
+TINY_MEMBER_UTEST_SRC = $(wildcard ./tiny/unittests/*.cc)
+TINY_MEMBER_MATH_UTEST_SRC = $(wildcard ./tiny/math/unittests/*.cc)
+ifneq ($(TINY),)
+ MEMBER_OBJ = $(TINY_MEMBER_SRC:.c=.o)
+ MATH_OBJ = $(TINY_MEMBER_MATH_SRC:.c=.o)
+ STDLIB_OBJ = $(TINY_STDLIB_MEMBER_SRC:.c=.o)
+ MEMBER_UTEST_OBJ = $(TINY_MEMBER_UTEST_SRC:.cc=.o)
+ TINY_MEMBER_MATH_UTEST_OBJ = $(TINY_MEMBER_MATH_UTEST_SRC:.cc=.o)
+ MEMBER_INCLUDE_DIR += -I$(TINY_MEMBER_INCLUDE_DIR)
+else
+ MEMBER_OBJ = $(MEMBER_SRC:.c=.o)
+ MEMBER_UTEST_OBJ = $(MEMBER_UTEST_SRC:.cc=.o)
+ MEMBER_TPM2_UTEST_OBJ = $(MEMBER_TPM2_UTEST_SRC:.cc=.o)
+endif
+
+LIB_MEMBER_DIR = .
+LIB_VERIFIER_DIR = ../verifier
+LIB_COMMON_TESTHELPER_DIR = ../common-testhelper
+LIB_COMMON_DIR = ../common
+LIB_IPPCP_DIR = ../../ext/ipp/sources/ippcp/src
+
+#set flags for linker
+LDFLAGS += -L$(GTEST_INCLUDE_DIR)/gtest -L$(LIB_COMMON_TESTHELPER_DIR) \
+ -L$(LIB_MEMBER_DIR) -L$(LIB_VERIFIER_DIR) -L$(LIB_COMMON_DIR) \
+ -L$(LIB_IPPCP_DIR) -lgtest -lcommon-testhelper \
+ -lmember -lverifier -lcommon -lippcp
+
+ifneq ($(TSS_PATH),)
+ LDFLAGS += -L$(TSS_PATH) -ltss -lcrypto
+endif
+
+ifneq ($(TINY),)
+ CPPDEFINES := -DNDEBUG
+ LDFLAGS += -lmath -ltiny_stdlib
+ CFLAGS := -Os -fno-builtin -fno-stack-protector -fomit-frame-pointer -fno-asynchronous-unwind-tables \
+ -fdata-sections -ffunction-sections -fvisibility=hidden -Werror -Wall -Wextra
+ ifneq ($(OS),Windows_NT)
+ CFLAGS += -fPIC
+ endif
+ ifeq ($(findstring gcc,$(CC)),gcc)
+ CFLAGS += -Wno-missing-braces
+ endif
+ ifeq ($(ARCH), x86)
+ CFLAGS += -m32
+ endif
+endif
+
+$(MEMBER_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(IPP_INCLUDE_DIR) -I$(IPP_SRC_INCLUDE_DIR) \
+ -I$(MEMBER_INCLUDE_DIR) -c $^ -o $@
+
+$(MEMBER_LIB): $(MEMBER_OBJ)
+ $(AR) rc $(MEMBER_LIB) $(MEMBER_OBJ)
+ $(RANLIB) $(MEMBER_LIB)
+
+$(MEMBER_UTEST_EXE): $(MEMBER_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+$(MEMBER_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(MEMBER_INCLUDE_DIR) \
+ -I$(GTEST_INCLUDE_DIR) -c $^
+
+ifneq ($(TINY),)
+ $(MATH_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(MEMBER_INCLUDE_DIR) -c $^ -o $@
+
+ $(STDLIB_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(MEMBER_INCLUDE_DIR) -c $^ -o $@
+
+ $(MATH_LIB): $(MATH_OBJ)
+ $(AR) rc $(MATH_LIB) $(MATH_OBJ)
+ $(RANLIB) $(MATH_LIB)
+
+ $(STDLIB_LIB): $(STDLIB_OBJ)
+ $(AR) rc $(STDLIB_LIB) $(STDLIB_OBJ)
+ $(RANLIB) $(STDLIB_LIB)
+
+ TINY_MEMBER_MATH_UTEST_EXE = ./member.math-utest$(EXE_EXTENSION)
+ $(TINY_MEMBER_MATH_UTEST_EXE): $(TINY_MEMBER_MATH_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+ $(TINY_MEMBER_MATH_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(MEMBER_INCLUDE_DIR) \
+ -I$(GTEST_INCLUDE_DIR) -c $^
+else
+ MEMBER_TPM2_UTEST_EXE = ./member.tpm2-utest$(EXE_EXTENSION)
+ $(MEMBER_TPM2_UTEST_EXE): $(MEMBER_TPM2_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+ $(MEMBER_TPM2_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(MEMBER_INCLUDE_DIR) \
+ -I$(GTEST_INCLUDE_DIR) -c $^
+endif
+
+build: all
+LIBS = $(MEMBER_LIB)
+ifneq ($(TINY),)
+ LIBS += $(STDLIB_LIB) $(MATH_LIB)
+endif
+all: $(LIBS)
+install:
+ mkdir -p '$(LIB_INSTALL_DIR)'
+ mkdir -p '$(HEADERS_INSTALL_DIR)'
+ cp $(MEMBER_LIB) '$(LIB_INSTALL_DIR)'
+ifneq ($(TINY),)
+ cp $(MATH_LIB) '$(LIB_INSTALL_DIR)'
+ cp $(STDLIB_LIB) '$(LIB_INSTALL_DIR)'
+endif
+ cp $(API_HEADERS_INSTALL) '$(HEADERS_INSTALL_DIR)'
+#install tests if they exist
+ifneq (,$(wildcard $(MEMBER_UTEST_EXE)))
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(MEMBER_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+endif
+ifneq ($(TINY),)
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(TINY_MEMBER_MATH_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+else
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(MEMBER_TPM2_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+endif
+
+utest: $(MEMBER_UTEST_EXE) $(MEMBER_TPM2_UTEST_EXE) $(TINY_MEMBER_MATH_UTEST_EXE)
+
+run_utest:
+ $(MEMBER_UTEST_EXE) $(GTEST_FLAGS)
+ $(MEMBER_TPM2_UTEST_EXE) $(GTEST_FLAGS)
+ $(TINY_MEMBER_MATH_UTEST_EXE) $(GTEST_FLAGS)
+
+check: utest run_utest
+
+clean:
+ rm -f $(MEMBER_OBJ) \
+ $(MEMBER_LIB) \
+ $(MATH_OBJ) \
+ $(MATH_LIB) \
+ $(STDLIB_OBJ) \
+ $(STDLIB_LIB) \
+ $(MEMBER_UTEST_OBJ) \
+ $(MEMBER_UTEST_EXE) \
+ $(MEMBER_TPM2_UTEST_OBJ) \
+ $(MEMBER_TPM2_UTEST_EXE) \
+ $(TINY_MEMBER_MATH_UTEST_OBJ) \
+ $(TINY_MEMBER_MATH_UTEST_EXE) \
+ *.xml
diff --git a/epid/member/api.h b/epid/member/api.h
new file mode 100644
index 0000000..b6c8dd0
--- /dev/null
+++ b/epid/member/api.h
@@ -0,0 +1,443 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Intel(R) EPID SDK member API.
+/*! \file */
+#ifndef EPID_MEMBER_API_H_
+#define EPID_MEMBER_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stddef.h>
+#include "epid/common/bitsupplier.h"
+#include "epid/common/epiddefs.h"
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// Internal context of member.
+typedef struct MemberCtx MemberCtx;
+
+/// Implementation specific configuration parameters.
+typedef struct MemberParams MemberParams;
+
+/// Member functionality
+/*!
+ \defgroup EpidMemberModule member
+
+ Defines the APIs needed by Intel(R) EPID members. Each member
+ context (::MemberCtx) represents membership in a single group.
+
+ To use this module, include the header epid/member/api.h.
+
+ \ingroup EpidModule
+ @{
+*/
+
+/// Allocates and initializes a new member context.
+/*!
+ \param[in] params
+ Implementation specific configuration parameters.
+ \param[out] ctx
+ Newly constructed member context.
+
+ \warning buffers allocated using this function should not be
+ initialized with ::EpidMemberInit.
+
+ \deprecated This API has been superseded by ::EpidMemberGetSize
+ and ::EpidMemberInit.
+
+ \returns ::EpidStatus
+ */
+EpidStatus EPID_API EpidMemberCreate(MemberParams const* params,
+ MemberCtx** ctx);
+
+/// Computes the size in bytes required for a member context
+/*!
+ \param[in] params
+ Implementation specific configuration parameters.
+ \param[out] context_size
+ Number of bytes required for a ::MemberCtx buffer
+
+ \returns ::EpidStatus
+ \see EpidMemberInit
+ */
+EpidStatus EPID_API EpidMemberGetSize(MemberParams const* params,
+ size_t* context_size);
+
+/// Initializes a new member context.
+/*!
+ \param[in] params
+ Implementation specific configuration parameters.
+ \param[in,out] ctx
+ An existing buffer that will be used as a ::MemberCtx.
+
+ \warning ctx must be a buffer of at least the size reported by
+ ::EpidMemberGetSize for the same parameters.
+
+ \returns ::EpidStatus
+ \see EpidMemberGetSize
+ */
+EpidStatus EPID_API EpidMemberInit(MemberParams const* params, MemberCtx* ctx);
+
+/// Creates a request to join a group.
+/*!
+The created request is part of the interaction with an issuer needed to join
+a group. This interaction with the issuer is outside the scope of this API.
+
+\param[in,out] ctx
+The member context.
+\param[in] pub_key
+The group certificate of group to join.
+\param[in] ni
+The nonce chosen by issuer as part of join protocol.
+\param[out] join_request
+The join request.
+
+\returns ::EpidStatus
+*/
+EpidStatus EPID_API EpidCreateJoinRequest(MemberCtx* ctx,
+ GroupPubKey const* pub_key,
+ IssuerNonce const* ni,
+ JoinRequest* join_request);
+
+/// Provisions a member context from a membership credential
+/*!
+\param[in,out] ctx
+The member context.
+\param[in] pub_key
+The group certificate of group to provision.
+\param[in] credential
+membership credential.
+\param[in] precomp_str
+Precomputed state (implementation specific optional)
+
+\returns ::EpidStatus
+*/
+EpidStatus EPID_API EpidProvisionCredential(
+ MemberCtx* ctx, GroupPubKey const* pub_key,
+ MembershipCredential const* credential, MemberPrecomp const* precomp_str);
+
+/// Provisions a member context from a compressed private key
+/*!
+\param[in,out] ctx
+The member context.
+\param[in] pub_key
+The group certificate of group to provision.
+\param[in] compressed_privkey
+private key.
+\param[in] precomp_str
+Precomputed state (implementation specific optional)
+
+\returns ::EpidStatus
+*/
+EpidStatus EPID_API
+EpidProvisionCompressed(MemberCtx* ctx, GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ MemberPrecomp const* precomp_str);
+
+/// Provisions a member context from a private key
+/*!
+\param[in,out] ctx
+The member context.
+\param[in] pub_key
+The group certificate of group to provision.
+\param[in] priv_key
+private key.
+\param[in] precomp_str
+Precomputed state (implementation specific optional)
+
+\returns ::EpidStatus
+*/
+EpidStatus EPID_API EpidProvisionKey(MemberCtx* ctx, GroupPubKey const* pub_key,
+ PrivKey const* priv_key,
+ MemberPrecomp const* precomp_str);
+
+/// Change member from setup state to normal operation
+/*!
+\param[in,out] ctx
+The member context.
+
+\returns ::EpidStatus
+*/
+EpidStatus EPID_API EpidMemberStartup(MemberCtx* ctx);
+
+/// De-initializes an existing member context buffer.
+/*!
+ Must be called to safely release a member context initialized using
+ ::EpidMemberInit.
+
+ De-initializes the context.
+
+ \param[in,out] ctx
+ The member context. Can be NULL.
+
+ \warning This function should not be used on buffers allocated with
+ ::EpidMemberCreate. Those buffers should be released using ::EpidMemberDelete
+
+ \see EpidMemberInit
+ */
+void EPID_API EpidMemberDeinit(MemberCtx* ctx);
+
+/// Deletes an existing member context.
+/*!
+ Must be called to safely release a member context created using
+ ::EpidMemberCreate.
+
+ De-initializes the context, frees memory used by the context, and sets the
+ context pointer to NULL.
+
+ \param[in,out] ctx
+ The member context. Can be NULL.
+
+ \deprecated This API has been superseded by ::EpidMemberDeinit.
+
+ \see EpidMemberCreate
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+void EPID_API EpidMemberDelete(MemberCtx** ctx);
+
+/// Sets the hash algorithm to be used by a member.
+/*!
+ \param[in] ctx
+ The member context.
+ \param[in] hash_alg
+ The hash algorithm to use.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr, the hash algorithm used by the member is
+ undefined.
+
+ \see EpidMemberInit
+ \see ::HashAlg
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EPID_API EpidMemberSetHashAlg(MemberCtx* ctx, HashAlg hash_alg);
+
+/// Sets the signature based revocation list to be used by a member.
+/*!
+ The caller is responsible for ensuring the revocation list is authorized,
+ e.g. signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call fails if trying to set an older version
+ of the revocation list than was last set.
+
+ \attention
+ The memory pointed to by sig_rl is accessed directly by the member
+ until a new list is set or the member is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list is undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by sig_rl
+ after the member is no longer using it.
+
+ \param[in] ctx
+ The member context.
+ \param[in] sig_rl
+ The signature based revocation list.
+ \param[in] sig_rl_size
+ The size of the signature based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the signature based revocation list pointed
+ to by the member is not changed.
+
+ \see EpidMemberInit
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EPID_API EpidMemberSetSigRl(MemberCtx* ctx, SigRl const* sig_rl,
+ size_t sig_rl_size);
+
+/// Computes the size in bytes required for an Intel(R) EPID signature.
+/*!
+ \param[in] sig_rl
+ The signature based revocation list that is used. NULL is treated as
+ a zero length list.
+
+ \returns
+ Size in bytes of an Intel(R) EPID signature including proofs for each entry
+ in the signature based revocation list.
+
+ \see ::SigRl
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+*/
+size_t EPID_API EpidGetSigSize(SigRl const* sig_rl);
+
+/// Writes an Intel(R) EPID signature.
+/*!
+ \param[in] ctx
+ The member context.
+ \param[in] msg
+ The message to sign.
+ \param[in] msg_len
+ The length in bytes of message.
+ \param[in] basename
+ Optional basename. If basename is NULL a random basename is used.
+ Signatures generated using random basenames are anonymous. Signatures
+ generated using the same basename are linkable by the verifier. If a
+ basename is provided, it must already be registered, or
+ ::kEpidBadArgErr is returned.
+ \param[in] basename_len
+ The size of basename in bytes. Must be 0 if basename is NULL.
+ \param[out] sig
+ The generated signature
+ \param[in] sig_len
+ The size of signature in bytes. Must be equal to value returned by
+ EpidGetSigSize().
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the content of sig is undefined.
+
+ \see EpidMemberInit
+ \see EpidMemberSetHashAlg
+ \see EpidMemberSetSigRl
+ \see EpidGetSigSize
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EPID_API EpidSign(MemberCtx const* ctx, void const* msg,
+ size_t msg_len, void const* basename,
+ size_t basename_len, EpidSignature* sig,
+ size_t sig_len);
+
+/// Registers a basename with a member.
+/*!
+
+ To prevent loss of privacy, the member keeps a list of basenames
+ (corresponding to authorized verifiers). The member signs a message
+ with a basename only if the basename is in the member's basename
+ list.
+
+ \warning
+ The use of a name-based signature creates a platform unique
+ pseudonymous identifier. Because it reduces the member's privacy, the
+ user should be notified when it is used and should have control over
+ its use.
+
+ \param[in] ctx
+ The member context.
+ \param[in] basename
+ The basename.
+ \param[in] basename_len
+ Length of the basename.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidDuplicateErr
+ The basename was already registered.
+
+ \note
+ If the result is not ::kEpidNoErr or ::kEpidDuplicateErr it is undefined if the
+ basename is registered.
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EPID_API EpidRegisterBasename(MemberCtx* ctx, void const* basename,
+ size_t basename_len);
+
+/// Clears registered basenames.
+/*!
+
+ Allows clearing registered basenames without recreating member.
+
+ \param[in,out] ctx
+ The member context.
+
+ \returns ::EpidStatus
+
+ \see ::EpidRegisterBasename
+ */
+EpidStatus EPID_API EpidClearRegisteredBasenames(MemberCtx* ctx);
+
+/// Extends the member's pool of pre-computed signatures.
+/*!
+ Generate new pre-computed signatures and add them to the internal pool.
+
+ \param[in] ctx
+ The member context.
+ \param[in] number_presigs
+ The number of pre-computed signatures to add to the internal pool.
+
+ \returns ::EpidStatus
+
+ \see ::EpidMemberInit
+ */
+EpidStatus EPID_API EpidAddPreSigs(MemberCtx* ctx, size_t number_presigs);
+
+/// Gets the number of pre-computed signatures in the member's pool.
+/*!
+ \param[in] ctx
+ The member context.
+
+ \returns
+ Number of remaining pre-computed signatures. Returns 0 if ctx is NULL.
+
+ \see ::EpidMemberInit
+*/
+size_t EPID_API EpidGetNumPreSigs(MemberCtx const* ctx);
+
+/// Decompresses compressed member private key.
+/*!
+
+ Converts a compressed member private key into a member
+ private key for use by other member APIs.
+
+ \param[in] pub_key
+ The public key of the group.
+ \param[in] compressed_privkey
+ The compressed member private key to be decompressed.
+ \param[out] priv_key
+ The member private key.
+
+ \returns ::EpidStatus
+
+ \b Example
+
+ \ref UserManual_GeneratingAnIntelEpidSignature
+ */
+EpidStatus EPID_API EpidDecompressPrivKey(
+ GroupPubKey const* pub_key, CompressedPrivKey const* compressed_privkey,
+ PrivKey* priv_key);
+
+/*! @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // EPID_MEMBER_API_H_
diff --git a/epid/member/member.parts b/epid/member/member.parts
new file mode 100644
index 0000000..f7fd2db
--- /dev/null
+++ b/epid/member/member.parts
@@ -0,0 +1,181 @@
+############################################################################
+# Copyright 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+import os
+
+Import('*')
+env.PartName('member')
+
+api_headers = Pattern(src_dir='.', includes=['*.h'], recursive=False).files()
+src_files = Pattern(src_dir='src', includes=['*.c'], recursive=False).files()
+internal_headers = Pattern(
+ src_dir='src', includes=['*.h'], recursive=False).files()
+
+tpm_utest_wrapper_files = Pattern(
+ src_dir='tpm2/unittests',
+ includes=['tpm2_wrapper-testhelper.cc'],
+ recursive=False).files()
+
+utest_files = Pattern(
+ src_dir='unittests',
+ includes=[
+ '*-test.cc',
+ '*-testhelper.cc',
+ ],
+ recursive=False).files()
+utest_headers = Pattern(
+ src_dir='unittests', includes=[
+ '*-testhelper.h',
+ ], recursive=False).files()
+
+build_files = Pattern(
+ src_dir='.', includes=['*.parts', 'Makefile'], recursive=False).files()
+
+tpm2_install_files = Pattern(src_dir='tpm2',
+ includes=[
+ '*.h',
+ '*.c',
+ '*-test.cc',
+ '*-testhelper.cc',
+ '*.parts'],
+ recursive=True)
+tpm2_include_files = Pattern(src_dir='.',
+ includes=['*.h'],
+ recursive=False).files()
+
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(api_headers, sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(
+ src_files + internal_headers, sub_dir='epid/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(
+ utest_files + utest_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/unittests')
+ env.InstallTopLevel(build_files, sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(tpm2_install_files,
+ sub_dir='epid/${PART_SHORT_NAME}/tpm2')
+
+else:
+ env.DependsOn([
+ Component('common'),
+ ])
+
+ if 'use_tss' in env['MODE']:
+ env.Append(CPPDEFINES=['TPM_TSS'])
+
+ tpm2_src_files = Pattern(src_dir='tpm2/ibm_tss',
+ includes=['*.c'],
+ recursive=False).files()
+ tpm2_utest_files = Pattern(src_dir='tpm2/unittests',
+ includes=['*-test.cc',
+ '*-testhelper.cc'],
+ excludes=['*-simulator-test.cc'],
+ recursive=False).files()
+ if (env['TARGET_ARCH'] == 'x86_64' and
+ env['TARGET_PLATFORM']['OS'] == 'win32'):
+ PrintError("--use-tss is not compatiable with x86_64 target. "
+ "Try an x86 build.")
+ try:
+ TSSROOT = os.environ['TSSROOT']
+ except KeyError, e:
+ env.PrintError("Necessary environment variable not set: ",
+ e, show_stack=False)
+ env.Append(CPPPATH=TSSROOT)
+ env.Append(LIBPATH=TSSROOT)
+ if 'cl' in env['CC']:
+ env.Append(CCFLAGS=['/wd4201', # allow nameless struct
+ '/wd4200', # allow zero-sized array in struct
+ ])
+ env.Append(CPPDEFINES=['TPM_TSS'])
+
+ else:
+ tpm2_src_files = Pattern(src_dir='tpm2/src',
+ includes=['*.c'],
+ recursive=False).files()
+
+ tpm2_utest_files = Pattern(src_dir='tpm2/unittests',
+ includes=['*-test.cc',
+ '*-testhelper.cc'],
+ excludes=['*-tss-test.cc'],
+ recursive=False).files()
+
+ env.Append(CPPPATH='#')
+
+
+ testenv = env.Clone()
+
+ outputs = env.Library('${PART_NAME}', src_files + tpm2_src_files)
+ env.Sdk(outputs)
+ env.SdkInclude(api_headers, sub_dir='epid/${PART_SHORT_NAME}')
+
+ if 'install_lib' in env['MODE']:
+ env.InstallLib(outputs)
+ env.InstallInclude(api_headers, sub_dir='${PART_SHORT_NAME}')
+
+ #unit tests
+ testenv['UNIT_TEST_TARGET_NAME'] = "${PART_NAME}-${UNIT_TEST_TARGET}"
+ testenv.UnitTest(
+ "utest",
+ utest_files + tpm_utest_wrapper_files,
+ command_args=[
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ '--gtest_filter=**',
+ ],
+ make_pdb=(env.isConfigBasedOn('debug') or
+ env.isConfigBasedOn('static_crt_debug')),
+ depends=[
+ Component('gtest'), Component('common-testhelper'),
+ Component('member'), Component('verifier')
+ ],
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
+
+ testenv['UNIT_TEST_TARGET_NAME'] = "${UNIT_TEST_TARGET}"
+
+ utest = testenv.UnitTest("member.tpm2-utest",
+ tpm2_utest_files,
+ command_args=[
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ '--gtest_filter=**',
+ ],
+ make_pdb=(env.isConfigBasedOn('debug') or
+ env.isConfigBasedOn('static_crt_debug')),
+ depends=[Component('gtest'),
+ Component('common-testhelper'),
+ Component('member')],
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
+
+ if 'use_tss' in env['MODE']:
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ libpost = env['LIBSUFFIX']
+ shlibpost = env['SHLIBSUFFIX']
+ else:
+ libpost = env['SHLIBSUFFIX']
+ shlibpost = libpost
+
+ tss_libname = env['LIBPREFIX'] + 'tss' + libpost
+ env.SdkLib(os.path.join(TSSROOT, tss_libname))
+
+ if env['TARGET_PLATFORM']['OS'] != 'win32':
+ env.ExportLIBS(['crypto'])
+
+ tss_shlibname = env['SHLIBPREFIX'] + 'tss' + shlibpost
+ runtime_lib = testenv.CCopy("${INSTALL_TEST_BIN}",
+ os.path.join(TSSROOT, tss_shlibname))
+ Depends(utest, runtime_lib)
diff --git a/epid/member/software_member.h b/epid/member/software_member.h
new file mode 100644
index 0000000..4e86175
--- /dev/null
+++ b/epid/member/software_member.h
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member creation parameters for software only implementation.
+/*!
+ * \file
+ */
+#ifndef EPID_MEMBER_SOFTWARE_MEMBER_H_
+#define EPID_MEMBER_SOFTWARE_MEMBER_H_
+
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+
+/*!
+ \addtogroup EpidMemberModule member
+ @{
+ */
+
+/// Software only specific member parameters
+/*!
+ You need to use a cryptographically secure random
+ number generator to create a member context using
+ ::EpidMemberGetSize and ::EpidMemberInit. The ::BitSupplier is provided
+ as a function prototype for your own implementation
+ of the random number generator.
+*/
+typedef struct MemberParams {
+ BitSupplier rnd_func; ///< Random number generator.
+ void* rnd_param; ///< User data that will be passed to the user_data
+ /// parameter of the random number generator.
+ FpElemStr const* f; ///< Secret part of the private key. If NULL a random
+ /// value will be generated using rnd_func.
+} MemberParams;
+/*! @} */
+
+#endif // EPID_MEMBER_SOFTWARE_MEMBER_H_
diff --git a/epid/member/src/allowed_basenames.c b/epid/member/src/allowed_basenames.c
new file mode 100644
index 0000000..e3da4e6
--- /dev/null
+++ b/epid/member/src/allowed_basenames.c
@@ -0,0 +1,117 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename management implementation
+/*! \file */
+
+#include "epid/member/src/allowed_basenames.h"
+
+#include <stdint.h>
+
+#include "epid/common/src/memory.h"
+
+typedef struct AllowedBasename {
+ struct AllowedBasename* next; ///< pointer to the next base name
+ size_t length; ///< size of base name
+ uint8_t name[1]; ///< base name (flexible array)
+} AllowedBasename;
+
+typedef struct AllowedBasenames { AllowedBasename* data; } AllowedBasenames;
+
+/// Creates empty list of allowed basenames
+EpidStatus CreateBasenames(AllowedBasenames** basename_container) {
+ AllowedBasenames* new_container = NULL;
+ if (!basename_container) {
+ return kEpidBadArgErr;
+ }
+ new_container = SAFE_ALLOC(sizeof(AllowedBasenames));
+ if (!new_container) {
+ return kEpidMemAllocErr;
+ }
+ new_container->data = NULL;
+ *basename_container = new_container;
+
+ return kEpidNoErr;
+}
+
+/// Checks if given basename is in the allowed list
+bool IsBasenameAllowed(AllowedBasenames const* basenames, void const* basename,
+ size_t length) {
+ if (!basenames || !length) {
+ return false;
+ } else {
+ AllowedBasename* rootnode = basenames->data;
+ while (rootnode != NULL) {
+ if (rootnode->length == length) {
+ if (!memcmp(rootnode->name, basename, length)) {
+ return true;
+ }
+ }
+ rootnode = rootnode->next;
+ }
+ }
+ return false;
+}
+
+/// Adds a new allowed basename
+EpidStatus AllowBasename(AllowedBasenames* basenames, void const* basename,
+ size_t length) {
+ AllowedBasename* newnode = NULL;
+
+ if (length > (SIZE_MAX - sizeof(AllowedBasename)) + 1) {
+ return kEpidBadArgErr;
+ }
+ if (!basenames || !basename) {
+ return kEpidBadArgErr;
+ }
+
+ newnode = SAFE_ALLOC(sizeof(AllowedBasename) + (length - 1));
+ if (!newnode) {
+ return kEpidMemAllocErr;
+ }
+
+ newnode->next = NULL;
+ newnode->length = length;
+ // Memory copy is used to copy a flexible array
+ if (0 != memcpy_S(newnode->name, length, basename, length)) {
+ SAFE_FREE(newnode);
+ return kEpidBadArgErr;
+ }
+
+ if (!basenames->data) {
+ basenames->data = newnode;
+ } else {
+ AllowedBasename* currentnode = basenames->data;
+ while (NULL != currentnode->next) {
+ currentnode = currentnode->next;
+ }
+ currentnode->next = newnode;
+ }
+ return kEpidNoErr;
+}
+
+/// Deletes list of allowed basenames
+void DeleteBasenames(AllowedBasenames** basename_container) {
+ if (basename_container && *basename_container) {
+ AllowedBasename* rootnode = (*basename_container)->data;
+ while (rootnode) {
+ AllowedBasename* deletenode = rootnode;
+ rootnode = rootnode->next;
+ SAFE_FREE(deletenode);
+ }
+ (*basename_container)->data = NULL;
+ SAFE_FREE(*basename_container);
+ }
+}
diff --git a/epid/member/src/allowed_basenames.h b/epid/member/src/allowed_basenames.h
new file mode 100644
index 0000000..8600eff
--- /dev/null
+++ b/epid/member/src/allowed_basenames.h
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename management APIs
+/*! \file */
+
+#ifndef EPID_MEMBER_SRC_ALLOWED_BASENAMES_H_
+#define EPID_MEMBER_SRC_ALLOWED_BASENAMES_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// \cond
+typedef struct AllowedBasenames AllowedBasenames;
+typedef struct AllowedBasename AllowedBasename;
+/// \endcond
+
+/// Creates empty list of allowed basenames
+EpidStatus CreateBasenames(AllowedBasenames** basename_container);
+
+/// Checks if given basename is in the allowed list
+bool IsBasenameAllowed(AllowedBasenames const* basenames, void const* basename,
+ size_t length);
+
+/// Adds a new allowed basename
+EpidStatus AllowBasename(AllowedBasenames* basenames, void const* basename,
+ size_t length);
+
+/// Deletes list of allowed basenames
+void DeleteBasenames(AllowedBasenames** basename_container);
+
+#endif // EPID_MEMBER_SRC_ALLOWED_BASENAMES_H_
diff --git a/epid/member/src/context.c b/epid/member/src/context.c
new file mode 100644
index 0000000..73d181c
--- /dev/null
+++ b/epid/member/src/context.c
@@ -0,0 +1,289 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member context implementation.
+ */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/src/sigrlvalid.h"
+#include "epid/common/src/stack.h"
+#include "epid/common/types.h"
+#include "epid/member/software_member.h"
+#include "epid/member/src/allowed_basenames.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/precomp.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/createprimary.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus EpidMemberGetSize(MemberParams const* params, size_t* context_size) {
+ if (!params || !context_size) {
+ return kEpidBadArgErr;
+ }
+ *context_size = sizeof(MemberCtx);
+ return kEpidNoErr;
+}
+
+EpidStatus EpidMemberInit(MemberParams const* params, MemberCtx* ctx) {
+ EpidStatus sts = kEpidErr;
+
+ if (!params || !ctx) {
+ return kEpidBadArgErr;
+ }
+ memset(ctx, 0, sizeof(*ctx));
+ do {
+ const FpElemStr* f = NULL;
+
+ // set the default hash algorithm to sha512
+ ctx->hash_alg = kSha512;
+#ifdef TPM_TSS // if build for TSS, make Sha256 default
+ ctx->hash_alg = kSha256;
+#endif
+ ctx->sig_rl = NULL;
+ ctx->precomp_ready = false;
+ ctx->is_initially_provisioned = false;
+ ctx->is_provisioned = false;
+ ctx->primary_key_set = false;
+
+ sts = CreateBasenames(&ctx->allowed_basenames);
+ BREAK_ON_EPID_ERROR(sts);
+ // Internal representation of Epid2Params
+ sts = CreateEpid2Params(&ctx->epid2_params);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // create TPM2 context
+ sts = Tpm2CreateContext(params, ctx->epid2_params, &ctx->rnd_func,
+ &ctx->rnd_param, &f, &ctx->tpm2_ctx);
+ BREAK_ON_EPID_ERROR(sts);
+
+ if (!CreateStack(sizeof(PreComputedSignature), &ctx->presigs)) {
+ sts = kEpidMemAllocErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ ctx->f = f;
+ ctx->join_ctr = 0;
+ ctx->rf_ctr = 0;
+ ctx->rnu_ctr = 0;
+
+ sts = NewEcPoint(ctx->epid2_params->G1, (EcPoint**)&ctx->A);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(ctx->epid2_params->Fp, (FfElement**)&ctx->x);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewEcPoint(ctx->epid2_params->G1, (EcPoint**)&ctx->h1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(ctx->epid2_params->G1, (EcPoint**)&ctx->h2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(ctx->epid2_params->G2, (EcPoint**)&ctx->w);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(ctx->epid2_params->GT, (FfElement**)&ctx->e12);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(ctx->epid2_params->GT, (FfElement**)&ctx->e22);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(ctx->epid2_params->GT, (FfElement**)&ctx->e2w);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(ctx->epid2_params->GT, (FfElement**)&ctx->ea2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = Tpm2SetHashAlg(ctx->tpm2_ctx, ctx->hash_alg);
+ BREAK_ON_EPID_ERROR(sts);
+ ctx->primary_key_set = true;
+ sts = kEpidNoErr;
+ } while (0);
+ if (kEpidNoErr != sts) {
+ EpidMemberDeinit(ctx);
+ }
+
+ return (sts);
+}
+
+void EpidMemberDeinit(MemberCtx* ctx) {
+ size_t i = 0;
+ size_t presig_size = 0;
+ PreComputedSignature* buf = NULL;
+ if (!ctx) {
+ return;
+ }
+ presig_size = StackGetSize(ctx->presigs);
+ buf = StackGetBuf(ctx->presigs);
+ for (i = 0; i < presig_size; ++i) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, (buf++)->rf_ctr);
+ }
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, ctx->join_ctr);
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, ctx->rf_ctr);
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, ctx->rnu_ctr);
+ DeleteStack(&ctx->presigs);
+ ctx->rnd_param = NULL;
+ DeleteEcPoint((EcPoint**)&(ctx->h1));
+ DeleteEcPoint((EcPoint**)&(ctx->h2));
+ DeleteEcPoint((EcPoint**)&(ctx->A));
+ DeleteFfElement((FfElement**)&ctx->x);
+ DeleteEcPoint((EcPoint**)&(ctx->w));
+ DeleteFfElement((FfElement**)&ctx->e12);
+ DeleteFfElement((FfElement**)&ctx->e22);
+ DeleteFfElement((FfElement**)&ctx->e2w);
+ DeleteFfElement((FfElement**)&ctx->ea2);
+ Tpm2DeleteContext(&ctx->tpm2_ctx);
+ DeleteEpid2Params(&ctx->epid2_params);
+ DeleteBasenames(&ctx->allowed_basenames);
+}
+
+EpidStatus EpidMemberCreate(MemberParams const* params, MemberCtx** ctx) {
+ size_t context_size = 0;
+ EpidStatus sts = kEpidErr;
+ MemberCtx* member_ctx = NULL;
+ if (!params || !ctx) {
+ return kEpidBadArgErr;
+ }
+ do {
+ sts = EpidMemberGetSize(params, &context_size);
+ BREAK_ON_EPID_ERROR(sts);
+ member_ctx = SAFE_ALLOC(context_size);
+ if (!member_ctx) {
+ BREAK_ON_EPID_ERROR(kEpidMemAllocErr);
+ }
+ sts = EpidMemberInit(params, member_ctx);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ if (kEpidNoErr != sts) {
+ SAFE_FREE(member_ctx);
+ member_ctx = NULL;
+ }
+ *ctx = member_ctx;
+ return sts;
+}
+
+EpidStatus EpidMemberInitialProvision(MemberCtx* ctx) {
+ EpidStatus sts = kEpidErr;
+
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (ctx->is_initially_provisioned) {
+ return kEpidOutOfSequenceError;
+ }
+ do {
+ if (ctx->f) {
+ sts = Tpm2LoadExternal(ctx->tpm2_ctx, ctx->f);
+ BREAK_ON_EPID_ERROR(sts);
+ } else {
+ G1ElemStr f;
+ sts = Tpm2CreatePrimary(ctx->tpm2_ctx, &f);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ ctx->is_initially_provisioned = true;
+ // f value was set into TPM
+ ctx->primary_key_set = true;
+ sts = kEpidNoErr;
+ } while (0);
+
+ return (sts);
+}
+
+void EpidMemberDelete(MemberCtx** ctx) {
+ if (!ctx) {
+ return;
+ }
+ EpidMemberDeinit(*ctx);
+ SAFE_FREE(*ctx);
+ *ctx = NULL;
+}
+
+EpidStatus EpidMemberSetHashAlg(MemberCtx* ctx, HashAlg hash_alg) {
+ EpidStatus sts = kEpidErr;
+ if (!ctx) return kEpidBadArgErr;
+ if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg &&
+ kSha512_256 != hash_alg)
+ return kEpidBadArgErr;
+ do {
+ sts = Tpm2SetHashAlg(ctx->tpm2_ctx, hash_alg);
+ BREAK_ON_EPID_ERROR(sts);
+ ctx->hash_alg = hash_alg;
+ } while (0);
+ return sts;
+}
+
+EpidStatus EpidMemberSetSigRl(MemberCtx* ctx, SigRl const* sig_rl,
+ size_t sig_rl_size) {
+ if (!ctx || !sig_rl) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->is_provisioned) {
+ return kEpidOutOfSequenceError;
+ }
+ if (!IsSigRlValid(&ctx->pub_key.gid, sig_rl, sig_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of sig rl
+ if (ctx->sig_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->sig_rl->version);
+ incoming_ver = ntohl(sig_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->sig_rl = sig_rl;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidRegisterBasename(MemberCtx* ctx, void const* basename,
+ size_t basename_len) {
+ EpidStatus sts = kEpidErr;
+ if (basename_len == 0) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx || !basename) {
+ return kEpidBadArgErr;
+ }
+
+ if (IsBasenameAllowed(ctx->allowed_basenames, basename, basename_len)) {
+ return kEpidDuplicateErr;
+ }
+
+ sts = AllowBasename(ctx->allowed_basenames, basename, basename_len);
+
+ return sts;
+}
+
+EpidStatus EpidClearRegisteredBasenames(MemberCtx* ctx) {
+ EpidStatus sts = kEpidErr;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ DeleteBasenames(&ctx->allowed_basenames);
+ sts = CreateBasenames(&ctx->allowed_basenames);
+ return sts;
+}
diff --git a/epid/member/src/context.h b/epid/member/src/context.h
new file mode 100644
index 0000000..6e667ae
--- /dev/null
+++ b/epid/member/src/context.h
@@ -0,0 +1,99 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_MEMBER_SRC_CONTEXT_H_
+#define EPID_MEMBER_SRC_CONTEXT_H_
+/*!
+ * \file
+ * \brief Member context interface.
+ */
+
+#include <epid/member/api.h>
+
+#include <stddef.h>
+#include "epid/common/bitsupplier.h"
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct AllowedBasenames AllowedBasenames;
+typedef struct Stack Stack;
+typedef struct EcPoint EcPoint;
+typedef struct FfElement FfElement;
+/// \endcond
+
+/// Member context definition
+struct MemberCtx {
+ Epid2Params_* epid2_params; ///< Intel(R) EPID 2.0 params
+ Tpm2Ctx* tpm2_ctx; ///< TPM2 context
+ GroupPubKey pub_key; ///< group public key
+ MemberPrecomp precomp; ///< Member pre-computed data
+ BitSupplier rnd_func; ///< Pseudo random number generation function
+ void* rnd_param; ///< Pointer to user context for rnd_func
+ SigRl const* sig_rl; ///< Signature based revocation list - not owned
+ AllowedBasenames* allowed_basenames; ///< Base name list
+ HashAlg hash_alg; ///< Hash algorithm to use
+ MembershipCredential credential; ///< Membership credential
+ bool primary_key_set; ///< primary key is set
+ bool precomp_ready; ///< provisioned precomputed value is ready for use
+ bool is_initially_provisioned; ///< f initialized
+ bool is_provisioned; ///< member fully provisioned with key material
+ EcPoint const* h1; ///< Group public key h1 value
+ EcPoint const* h2; ///< Group group public key h2 value
+ EcPoint const* A; ///< Membership Credential A value
+ FfElement const* x; ///< Membership Credential x value
+ EcPoint const* w; ///< Group group public key w value
+ FfElement const* e12; ///< an element in GT, = pairing (h1, g2)
+ FfElement const* e22; ///< an element in GT, = pairing (h2, g2)
+ FfElement const* e2w; ///< an element in GT, = pairing (h2, w)
+ FfElement const* ea2; ///< an element in GT, = pairing (g1, g2)
+ uint16_t join_ctr; ///< counter for join commands
+ uint16_t rf_ctr; ///< a TPM commit counter for rf
+ uint16_t rnu_ctr; ///< TPM counter pointing to Nr Proof related random value
+ FpElemStr const* f; ///< If NULL an EPS based f is used otherwise f is
+ /// stored in TPM using load external
+ Stack* presigs; ///< Pre-computed signature pool
+};
+
+/// Pre-computed signature.
+/*!
+ Serialized form of an intermediate signature that does not depend on
+ basename or message. This can be used to time-shift compute time needed to
+ sign a message.
+ */
+#pragma pack(1)
+typedef struct PreComputedSignature {
+ G1ElemStr B; ///< an element in G1
+ G1ElemStr K; ///< an element in G1
+ G1ElemStr T; ///< an element in G1
+ G1ElemStr R1; ///< an element in G1
+ GtElemStr R2; ///< an element in G1
+ FpElemStr a; ///< an integer between [0, p-1]
+ FpElemStr b; ///< an integer between [0, p-1]
+ FpElemStr rx; ///< an integer between [0, p-1]
+ uint16_t rf_ctr; ///< a TPM commit counter for rf
+ FpElemStr ra; ///< an integer between [0, p-1]
+ FpElemStr rb; ///< an integer between [0, p-1]
+ BigNumStr rnd_bsn; ///< random basename
+} PreComputedSignature;
+#pragma pack()
+
+/// Minimally provision member with f
+EpidStatus EpidMemberInitialProvision(MemberCtx* ctx);
+
+#endif // EPID_MEMBER_SRC_CONTEXT_H_
diff --git a/epid/member/src/decompress_privkey.c b/epid/member/src/decompress_privkey.c
new file mode 100644
index 0000000..db40214
--- /dev/null
+++ b/epid/member/src/decompress_privkey.c
@@ -0,0 +1,308 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief EpidDecompressPrivKey implementation.
+*/
+
+#include "epid/member/api.h"
+
+#include "epid/common/errors.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/hash.h"
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/*!
+* \brief
+* Internal implementation of PrivKey
+*/
+typedef struct PrivKey_ {
+ GroupId gid; ///< group ID
+ EcPoint* A; ///< an element in G1
+ FfElement* x; ///< an integer between [0, p-1]
+ FfElement* f; ///< an integer between [0, p-1]
+} PrivKey_;
+
+/// Implements the derivation method used by private key decompression
+/// Derives two integers x, f between [1, p-1] from the seed value
+static EpidStatus DeriveXF(FpElemStr* x, FpElemStr* f, Seed const* seed,
+ FpElemStr const* p);
+
+EpidStatus EpidDecompressPrivKey(GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ PrivKey* priv_key) {
+ EpidStatus result = kEpidErr;
+ Epid2Params_* epid2_params = 0;
+ PrivKey_ priv_key_ = {{{0}}, 0, 0, 0};
+ FfElement* Ax = 0;
+ EcPoint* t1 = 0;
+ EcPoint* t2 = 0;
+ FfElement* t3 = 0;
+ FfElement* t4 = 0;
+ BigNum* bn_pminus1 = 0;
+ BigNum* bn_one = 0;
+ EcPoint* h1 = 0;
+ EcPoint* w = 0;
+
+ // check parameters
+ if (!pub_key || !compressed_privkey || !priv_key) {
+ return kEpidBadArgErr;
+ }
+
+ // Internal representation of Epid2Params
+ result = CreateEpid2Params(&epid2_params);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+
+ do {
+ uint8_t bn_one_str = 1;
+ FpElemStr p_str = {0};
+ bool is_valid = false;
+ // shortcuts
+ EcGroup* G1 = epid2_params->G1;
+ EcGroup* G2 = epid2_params->G2;
+ FiniteField* GT = epid2_params->GT;
+ EcPoint* g1 = epid2_params->g1;
+ EcPoint* g2 = epid2_params->g2;
+ PairingState* ps_ctx = epid2_params->pairing_state;
+ FiniteField* Fp = epid2_params->Fp;
+ FiniteField* Fq = epid2_params->Fq;
+ BigNum* p = epid2_params->p;
+
+ // In the following process, temporary variables t1 (an element of
+ // G2), t2 (an element of G1), t3, t4 (elements of GT) are used.
+ // Let the compressed private key be (gid, A.x, seed). Let the
+ // Intel(R) EPID public key be (gid, h1, h2, w).
+
+ // Create a new Priv Key
+ result = NewEcPoint(G1, &priv_key_.A);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(Fp, &priv_key_.x);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(Fp, &priv_key_.f);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewFfElement(Fq, &Ax);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewEcPoint(G2, &t1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewEcPoint(G1, &t2);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(GT, &t3);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewFfElement(GT, &t4);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(BigNumStr), &bn_pminus1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(bn_one_str), &bn_one);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewEcPoint(G1, &h1);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadEcPoint(G1, &(pub_key->h1), sizeof(pub_key->h1), h1);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewEcPoint(G2, &w);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadEcPoint(G2, &(pub_key->w), sizeof(pub_key->w), w);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = WriteBigNum(p, sizeof(p_str), &p_str);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = ReadBigNum(&bn_one_str, sizeof(bn_one_str), bn_one);
+ BREAK_ON_EPID_ERROR(result);
+
+ // 1. The member derives x and f from seed. The derivation
+ // function must be the same as the one used in the key
+ // generation above. This step is out of scope of this
+ // specification.
+ result =
+ DeriveXF(&priv_key->x, &priv_key->f, &compressed_privkey->seed, &p_str);
+ BREAK_ON_EPID_ERROR(result);
+ // 2. The member computes A = G1.makePoint(A.x).
+ result = ReadFfElement(Fq, &compressed_privkey->ax,
+ sizeof(compressed_privkey->ax), Ax);
+ BREAK_ON_EPID_ERROR(result);
+ result = EcMakePoint(G1, Ax, priv_key_.A);
+ BREAK_ON_EPID_ERROR(result);
+ // 3. The member tests whether (A, x, f) is a valid Intel(R) EPID
+ // private key as follows:
+ // a. It computes t1 = G2.sscmExp(g2, x).
+ result = EcSscmExp(G2, g2, (BigNumStr const*)&priv_key->x, t1);
+ BREAK_ON_EPID_ERROR(result);
+ // b. It computes t1 = G2.mul(t1, w).
+ result = EcMul(G2, t1, w, t1);
+ BREAK_ON_EPID_ERROR(result);
+ // c. It computes t3 = pairing(A, t1).
+ result = Pairing(ps_ctx, priv_key_.A, t1, t3);
+ BREAK_ON_EPID_ERROR(result);
+ // d. It computes t2 = G1.sscmExp(h1, f).
+ result = EcSscmExp(G1, h1, (BigNumStr const*)&priv_key->f, t2);
+ BREAK_ON_EPID_ERROR(result);
+ // e. It computes t2 = G1.mul(t2, g1).
+ result = EcMul(G1, t2, g1, t2);
+ BREAK_ON_EPID_ERROR(result);
+ // f. It computes t4 = pairing(t2, g2).
+ result = Pairing(ps_ctx, t2, g2, t4);
+ BREAK_ON_EPID_ERROR(result);
+ // g. If GT.isEqual(t3, t4) = false
+ result = FfIsEqual(GT, t3, t4, &is_valid);
+ BREAK_ON_EPID_ERROR(result);
+ if (!is_valid) {
+ // i. It computes t3 = GT.exp(t3, p-1).
+ result = BigNumSub(p, bn_one, bn_pminus1);
+ BREAK_ON_EPID_ERROR(result);
+ result = FfExp(GT, t3, bn_pminus1, t3);
+ BREAK_ON_EPID_ERROR(result);
+ // ii. If GT.isEqual(t3, t4) = false again, it reports bad
+ // Intel(R) EPID private key and exits.
+ result = FfIsEqual(GT, t3, t4, &is_valid);
+ BREAK_ON_EPID_ERROR(result);
+ if (!is_valid) {
+ result = kEpidBadArgErr; // Invalid Member key
+ break;
+ }
+ // iii. It sets A = G1.inverse(A).
+ result = EcInverse(G1, priv_key_.A, priv_key_.A);
+ BREAK_ON_EPID_ERROR(result);
+ // NOTE A is modified here in this step.
+ }
+ // 4. The decompressed Intel(R) EPID private key is (gid, A, x, f).
+ // x, f already filled in.
+ priv_key->gid = pub_key->gid;
+ result = WriteEcPoint(G1, priv_key_.A, &priv_key->A, sizeof(priv_key->A));
+ BREAK_ON_EPID_ERROR(result);
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteEcPoint(&priv_key_.A);
+ DeleteFfElement(&priv_key_.x);
+ DeleteFfElement(&priv_key_.f);
+ DeleteFfElement(&Ax);
+ DeleteEcPoint(&t1);
+ DeleteEcPoint(&t2);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t4);
+ DeleteBigNum(&bn_pminus1);
+ DeleteBigNum(&bn_one);
+ DeleteEcPoint(&h1);
+ DeleteEcPoint(&w);
+ DeleteEpid2Params(&epid2_params);
+
+ return result;
+}
+
+/// Hash message buffer
+typedef struct HashMsg {
+ /// Message to be hashed
+ char data[11];
+} HashMsg;
+
+static EpidStatus DeriveXF(FpElemStr* x, FpElemStr* f, Seed const* seed,
+ FpElemStr const* p) {
+ EpidStatus result = kEpidErr;
+
+ BigNum* bn_x = 0;
+ BigNum* bn_f = 0;
+ BigNum* bn_p = 0;
+
+ do {
+ HashMsg msgstr = {{
+ 0x00, 0x45, 0x43, 0x43, 0x2d, 0x53, 0x61, 0x66, 0x65, 0x49, 0x44,
+ }};
+#pragma pack(1)
+ struct {
+ Seed seed;
+ HashMsg msg;
+ } hashbuf;
+#pragma pack()
+
+ Sha256Digest digest[2];
+ Ipp8u str512[512 / 8];
+
+ result = NewBigNum(sizeof(*p), &bn_p);
+ BREAK_ON_EPID_ERROR(result);
+ result = ReadBigNum(p, sizeof(*p), bn_p);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = NewBigNum(sizeof(digest), &bn_x);
+ BREAK_ON_EPID_ERROR(result);
+ result = NewBigNum(sizeof(digest), &bn_f);
+ BREAK_ON_EPID_ERROR(result);
+
+ // compute x
+ hashbuf.seed = *seed;
+ hashbuf.msg = msgstr;
+ hashbuf.msg.data[0] = 0x06;
+ result = Sha256MessageDigest(&hashbuf, sizeof(hashbuf), &digest[0]);
+ BREAK_ON_EPID_ERROR(result);
+ hashbuf.msg.data[0] = 0x07;
+ result = Sha256MessageDigest(&hashbuf, sizeof(hashbuf), &digest[1]);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = ReadBigNum(&digest, sizeof(digest), bn_x);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = BigNumMod(bn_x, bn_p, bn_x);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = WriteBigNum(bn_x, sizeof(str512), str512);
+ BREAK_ON_EPID_ERROR(result);
+
+ *x = *(FpElemStr*)&str512[sizeof(str512) / 2];
+
+ // compute f
+ hashbuf.seed = *seed;
+ hashbuf.msg = msgstr;
+ hashbuf.msg.data[0] = 0x08;
+ result = Sha256MessageDigest(&hashbuf, sizeof(hashbuf), &digest[0]);
+ BREAK_ON_EPID_ERROR(result);
+ hashbuf.msg.data[0] = 0x09;
+ result = Sha256MessageDigest(&hashbuf, sizeof(hashbuf), &digest[1]);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = ReadBigNum(&digest, sizeof(digest), bn_f);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = BigNumMod(bn_f, bn_p, bn_f);
+ BREAK_ON_EPID_ERROR(result);
+
+ result = WriteBigNum(bn_f, sizeof(str512), str512);
+ BREAK_ON_EPID_ERROR(result);
+
+ *f = *(FpElemStr*)&str512[sizeof(str512) / 2];
+
+ result = kEpidNoErr;
+ } while (0);
+
+ DeleteBigNum(&bn_x);
+ DeleteBigNum(&bn_f);
+ DeleteBigNum(&bn_p);
+
+ return result;
+}
diff --git a/epid/member/src/get_sigsize.c b/epid/member/src/get_sigsize.c
new file mode 100644
index 0000000..10fafcd
--- /dev/null
+++ b/epid/member/src/get_sigsize.c
@@ -0,0 +1,35 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidGetSigSize implementation.
+ */
+#include "epid/common/src/endian_convert.h"
+#include "epid/member/api.h"
+
+size_t EpidGetSigSize(SigRl const* sig_rl) {
+ const size_t kMinSigSize = sizeof(EpidSignature) - sizeof(NrProof);
+ if (!sig_rl) {
+ return kMinSigSize;
+ } else {
+ if (ntohl(sig_rl->n2) > (SIZE_MAX - kMinSigSize) / sizeof(NrProof)) {
+ return kMinSigSize;
+ } else {
+ return kMinSigSize + ntohl(sig_rl->n2) * sizeof(NrProof);
+ }
+ }
+}
diff --git a/epid/member/src/hash_basename.c b/epid/member/src/hash_basename.c
new file mode 100644
index 0000000..1329960
--- /dev/null
+++ b/epid/member/src/hash_basename.c
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename hashing helper implementation
+/*! \file */
+
+#include "epid/member/src/hash_basename.h"
+
+#include "epid/common/math/ecgroup.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus HashBaseName(EcGroup* G1, HashAlg hash_alg, void const* basename,
+ size_t basename_len, G1ElemStr* B_str,
+ uint32_t* iterations) {
+ EpidStatus sts = kEpidErr;
+ EcPoint* B = NULL;
+
+ if (!G1 || (0 != basename_len && !basename) || !B_str) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ sts = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = EcHash(G1, basename, basename_len, hash_alg, B, iterations);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, B, B_str, sizeof(*B_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ DeleteEcPoint(&B);
+
+ return sts;
+}
diff --git a/epid/member/src/hash_basename.h b/epid/member/src/hash_basename.h
new file mode 100644
index 0000000..4d196c2
--- /dev/null
+++ b/epid/member/src/hash_basename.h
@@ -0,0 +1,59 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename hashing helper API
+/*! \file */
+#ifndef EPID_MEMBER_SRC_HASH_BASENAME_H_
+#define EPID_MEMBER_SRC_HASH_BASENAME_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h" // HashAlg
+
+/// \cond
+typedef struct EcGroup EcGroup;
+typedef struct G1ElemStr G1ElemStr;
+/// \endcond
+
+/// Calculates hash of basename
+/*!
+
+ \param[in] G1
+ The elliptic curve group.
+
+ \param[in] hash_alg
+ The hash algorithm.
+
+ \param[in] basename
+ The basename.
+
+ \param[in] basename_len
+ The size of the basename in bytes.
+
+ \param[out] B_str
+ The resulting hashed basename.
+
+ \param[out] iterations
+ The number of hash iterations needed to find a valid hash. Can be NULL.
+
+ \returns ::EpidStatus
+
+*/
+EpidStatus HashBaseName(EcGroup* G1, HashAlg hash_alg, void const* basename,
+ size_t basename_len, G1ElemStr* B_str,
+ uint32_t* iterations);
+
+#endif // EPID_MEMBER_SRC_HASH_BASENAME_H_
diff --git a/epid/member/src/join.c b/epid/member/src/join.c
new file mode 100644
index 0000000..bda9e8d
--- /dev/null
+++ b/epid/member/src/join.c
@@ -0,0 +1,152 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Join Request related implementation.
+/*! \file */
+
+#include <epid/member/api.h>
+
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/grouppubkey.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/join_commitment.h"
+#include "epid/member/src/privateexp.h"
+#include "epid/member/src/resize.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus EpidCreateJoinRequest(MemberCtx* ctx, GroupPubKey const* pub_key,
+ IssuerNonce const* ni,
+ JoinRequest* join_request) {
+ EpidStatus sts = kEpidErr;
+ GroupPubKey_* pub_key_ = NULL;
+ EcPoint* t = NULL; // temporary used for F and R
+ EcPoint* h1 = NULL;
+ EcPoint* K = NULL;
+ EcPoint* l = NULL;
+ EcPoint* e = NULL;
+
+ FfElement* k = NULL;
+ FfElement* s = NULL;
+ uint8_t* digest = NULL;
+
+ if (!ctx || !pub_key || !ni || !join_request || !ctx->epid2_params) {
+ return kEpidBadArgErr;
+ }
+
+ if (kSha256 != ctx->hash_alg && kSha384 != ctx->hash_alg &&
+ kSha512 != ctx->hash_alg && kSha512_256 != ctx->hash_alg) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ JoinRequest request = {0};
+ G1ElemStr R = {0};
+ EcGroup* G1 = ctx->epid2_params->G1;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ size_t digest_size = 0;
+
+ if (!ctx->is_provisioned && !ctx->is_initially_provisioned) {
+ sts = EpidMemberInitialProvision(ctx);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ // validate public key by creating
+ sts = CreateGroupPubKey(pub_key, ctx->epid2_params->G1,
+ ctx->epid2_params->G2, &pub_key_);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewEcPoint(G1, &t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &h1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &pub_key->h1, sizeof(pub_key->h1), h1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 2. The member computes F = G1.sscmExp(h1, f).
+ sts = EpidPrivateExp(ctx, h1, t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, t, &request.F, sizeof(request.F));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 1. The member chooses a random integer r from [1, p-1].
+ // 3. The member computes R = G1.sscmExp(h1, r).
+ sts = NewEcPoint(G1, &K);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &l);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts =
+ Tpm2Commit(ctx->tpm2_ctx, h1, NULL, 0, NULL, K, l, e, &(ctx->join_ctr));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, e, &R, sizeof(R));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = HashJoinCommitment(ctx->epid2_params->Fp, ctx->hash_alg, pub_key,
+ &request.F, &R, ni, &request.c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // Extend value c to be of a digest size.
+ digest_size = EpidGetHashSize(ctx->hash_alg);
+ digest = (uint8_t*)SAFE_ALLOC(digest_size);
+ if (!digest) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+ sts = ResizeOctStr(&request.c, sizeof(request.c), digest, digest_size);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // Step 5. The member computes s = (r + c * f) mod p.
+ sts = NewFfElement(Fp, &k);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &s);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Tpm2Sign(ctx->tpm2_ctx, digest, digest_size, ctx->join_ctr, k, s);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, s, &request.s, sizeof(request.s));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // Step 6. The output join request is (F, c, s).
+ *join_request = request;
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ if (sts != kEpidNoErr) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, ctx->join_ctr);
+ }
+
+ DeleteEcPoint(&t);
+ DeleteEcPoint(&h1);
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&l);
+ DeleteEcPoint(&e);
+ DeleteFfElement(&k);
+ DeleteFfElement(&s);
+ SAFE_FREE(digest);
+ DeleteGroupPubKey(&pub_key_);
+
+ return sts;
+}
diff --git a/epid/member/src/join_commitment.c b/epid/member/src/join_commitment.c
new file mode 100644
index 0000000..62e6dab
--- /dev/null
+++ b/epid/member/src/join_commitment.c
@@ -0,0 +1,89 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host join helper implementation
+/*! \file */
+
+#include "epid/member/src/join_commitment.h"
+
+#include "epid/common/math/finitefield.h"
+#include "epid/common/types.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+#pragma pack(1)
+/// Storage for values to create commitment in Sign and Verify algorithms
+typedef struct JoinPCommitValues {
+ BigNumStr p; ///< Intel(R) EPID 2.0 parameter p
+ G1ElemStr g1; ///< Intel(R) EPID 2.0 parameter g1
+ G2ElemStr g2; ///< Intel(R) EPID 2.0 parameter g2
+ G1ElemStr h1; ///< Group public key value h1
+ G1ElemStr h2; ///< Group public key value h2
+ G2ElemStr w; ///< Group public key value w
+ G1ElemStr F; ///< Variable F computed in algorithm
+ G1ElemStr R; ///< Variable R computed in algorithm
+ IssuerNonce NI; ///< Nonce
+} JoinPCommitValues;
+#pragma pack()
+
+EpidStatus HashJoinCommitment(FiniteField* Fp, HashAlg hash_alg,
+ GroupPubKey const* pub_key,
+ G1ElemStr const* F_str, G1ElemStr const* R_str,
+ IssuerNonce const* NI, FpElemStr* c_str) {
+ EpidStatus sts = kEpidErr;
+ FfElement* c = NULL;
+
+ if (!Fp || !pub_key || !F_str || !R_str || !NI || !c_str) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ JoinPCommitValues commit_values = {0};
+ Epid2Params params = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ commit_values.p = params.p;
+ commit_values.g1 = params.g1;
+ commit_values.g2 = params.g2;
+ commit_values.h1 = pub_key->h1;
+ commit_values.h2 = pub_key->h2;
+ commit_values.w = pub_key->w;
+ commit_values.F = *F_str;
+ commit_values.R = *R_str;
+ commit_values.NI = *NI;
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // Step 4. The member computes c = Fp.hash(p || g1 || g2 || h1 ||
+ // h2 || w || F || R || NI).
+ sts = FfHash(Fp, &commit_values, sizeof(commit_values), hash_alg, c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, c, c_str, sizeof(*c_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&c);
+
+ return sts;
+}
diff --git a/epid/member/src/join_commitment.h b/epid/member/src/join_commitment.h
new file mode 100644
index 0000000..e42873d
--- /dev/null
+++ b/epid/member/src/join_commitment.h
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host join helper APIs
+/*! \file */
+#ifndef EPID_MEMBER_SRC_JOIN_COMMITMENT_H_
+#define EPID_MEMBER_SRC_JOIN_COMMITMENT_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/types.h" // HashAlg
+
+/// \cond
+typedef struct FiniteField FiniteField;
+typedef struct G1ElemStr G1ElemStr;
+typedef struct FpElemStr FpElemStr;
+typedef struct OctStr256 OctStr256;
+typedef struct OctStr256 IssuerNonce;
+/// \endcond
+
+/// Calculates commitment hash of join commit
+/*!
+
+ \param[in] Fp
+ The finite field.
+
+ \param[in] hash_alg
+ The hash algorithm.
+
+ \param[in] pub_key
+ The public key of the group being joined.
+
+ \param[in] F_str
+ The F value of the join commit.
+
+ \param[in] R_str
+ The R value of the join commit.
+
+ \param[in] NI
+ The nonce chosen by issuer as part of join protocol.
+
+ \param[out] c_str
+ The resulting commitment hash.
+
+ \returns ::EpidStatus
+
+ */
+EpidStatus HashJoinCommitment(FiniteField* Fp, HashAlg hash_alg,
+ GroupPubKey const* pub_key,
+ G1ElemStr const* F_str, G1ElemStr const* R_str,
+ IssuerNonce const* NI, FpElemStr* c_str);
+
+#endif // EPID_MEMBER_SRC_JOIN_COMMITMENT_H_
diff --git a/epid/member/src/nrprove.c b/epid/member/src/nrprove.c
new file mode 100644
index 0000000..c7780bc
--- /dev/null
+++ b/epid/member/src/nrprove.c
@@ -0,0 +1,293 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidNrProve implementation.
+/*! \file */
+#include "epid/member/src/nrprove.h"
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/nrprove_commitment.h"
+#include "epid/member/src/privateexp.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+static bool IsIdentity(G1ElemStr const* elem_str) {
+ unsigned char* bytes = (unsigned char*)elem_str;
+ if (!bytes) {
+ return false;
+ } else {
+ size_t i = 0;
+ for (i = 0; i < sizeof(*elem_str); i++) {
+ if (0 != bytes[i]) return false;
+ }
+ }
+ return true;
+}
+
+EpidStatus EpidNrProve(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ BasicSignature const* sig, SigRlEntry const* sigrl_entry,
+ NrProof* proof) {
+ EpidStatus sts = kEpidErr;
+
+ EcPoint* B = NULL;
+ EcPoint* K = NULL;
+ EcPoint* rlB = NULL;
+ EcPoint* rlK = NULL;
+ EcPoint* t = NULL; // temp value in G1 either T, R1, R2
+ EcPoint* k_tpm = NULL;
+ EcPoint* l_tpm = NULL;
+ EcPoint* e_tpm = NULL;
+ EcPoint* D = NULL;
+ FfElement* y2 = NULL;
+ uint8_t* s2 = NULL;
+ FfElement* mu = NULL;
+ FfElement* nu = NULL;
+ FfElement* rmu = NULL;
+
+ FfElement* t2 = NULL; // temporary for multiplication
+ FfElement* c = NULL;
+ uint8_t* digest = NULL;
+
+ BigNumStr mu_str = {0};
+ BigNumStr nu_str = {0};
+ BigNumStr rmu_str = {0};
+
+ if (!ctx || (0 != msg_len && !msg) || !sig || !sigrl_entry || !proof)
+ return kEpidBadArgErr;
+ if (!basename || 0 == basename_len) {
+ // basename should not be empty
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params) return kEpidBadArgErr;
+
+ do {
+ NrProveCommitOutput commit_out = {0};
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ FiniteField* Fq = ctx->epid2_params->Fq;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ BitSupplier rnd_func = ctx->rnd_func;
+ void* rnd_param = ctx->rnd_param;
+ uint32_t i = 0;
+ G1ElemStr B_str = {0};
+ const BigNumStr kOne = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ FpElemStr c_str = {0};
+ uint16_t rnu_ctr =
+ 0; ///< TPM counter pointing to Nr Proof related random value
+ size_t digest_len = EpidGetHashSize(ctx->hash_alg);
+
+ sts = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &K);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &rlB);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &rlK);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &D);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &t);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(Fp, &y2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &k_tpm);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &l_tpm);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &e_tpm);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(Fp, &mu);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &nu);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &rmu);
+ BREAK_ON_EPID_ERROR(sts);
+
+ s2 = SAFE_ALLOC(basename_len + sizeof(i));
+ if (!s2) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+ sts = ReadEcPoint(G1, &sig->K, sizeof(sig->K), K);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadEcPoint(G1, &(sigrl_entry->b), sizeof(sigrl_entry->b), rlB);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &(sigrl_entry->k), sizeof(sigrl_entry->k), rlK);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 1. The member chooses random mu from [1, p-1].
+ sts = FfGetRandom(Fp, &kOne, rnd_func, rnd_param, mu);
+ BREAK_ON_EPID_ERROR(sts);
+ // 2. The member computes nu = -mu mod p.
+ sts = FfNeg(Fp, mu, nu);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 3.1. The member computes D = G1.privateExp(B', f)
+ sts = EpidPrivateExp((MemberCtx*)ctx, rlB, D);
+ BREAK_ON_EPID_ERROR(sts);
+ // 3.2.The member computes T = G1.sscmMultiExp(K', mu, D, nu).
+ sts = WriteFfElement(Fp, mu, &mu_str, sizeof(mu_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, nu, &nu_str, sizeof(nu_str));
+ BREAK_ON_EPID_ERROR(sts);
+ {
+ EcPoint const* points[2];
+ BigNumStr const* exponents[2];
+ points[0] = rlK;
+ points[1] = D;
+ exponents[0] = &mu_str;
+ exponents[1] = &nu_str;
+ sts = EcSscmMultiExp(G1, points, exponents, COUNT_OF(points), t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, t, &commit_out.T, sizeof(commit_out.T));
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ // 4.1. The member chooses rmu randomly from[1, p - 1].
+ sts = FfGetRandom(Fp, &kOne, rnd_func, rnd_param, rmu);
+ BREAK_ON_EPID_ERROR(sts);
+ // 4.2. (KTPM, LTPM, ETPM, counterTPM) = TPM2_Commit(P1 = B', P2 = B)
+ sts = EcHash(G1, basename, basename_len, ctx->hash_alg, B, &i);
+ BREAK_ON_EPID_ERROR(sts);
+ *(uint32_t*)s2 = ntohl(i);
+ sts = WriteEcPoint(G1, B, &B_str, sizeof(B_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fq, &B_str.y, sizeof(B_str.y), y2);
+ BREAK_ON_EPID_ERROR(sts);
+ if (0 != memcpy_S(s2 + sizeof(i), basename_len, basename, basename_len)) {
+ sts = kEpidErr;
+ break;
+ }
+ sts = Tpm2Commit(ctx->tpm2_ctx, rlB, s2, basename_len + sizeof(i), y2,
+ k_tpm, l_tpm, e_tpm, &rnu_ctr);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 5.1. The member computes R1 = G1.sscmExp(K, rmu).
+ sts = WriteFfElement(Fp, rmu, &rmu_str, sizeof(rmu_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcSscmExp(G1, K, &rmu_str, t);
+ BREAK_ON_EPID_ERROR(sts);
+ // 5.2. The member computes R1 = G1.mul(R1, LTPM).
+ sts = EcMul(G1, t, l_tpm, t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, t, &commit_out.R1, sizeof(commit_out.R1));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 6.1. The member computes R2 = G1.sscmExp(K', rmu).
+ sts = EcSscmExp(G1, rlK, &rmu_str, t);
+ BREAK_ON_EPID_ERROR(sts);
+ // 6.2. The member computes R2 = G1.mul(R2, ETPM).
+ sts = EcMul(G1, t, e_tpm, t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, t, &commit_out.R2, sizeof(commit_out.R2));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = HashNrProveCommitment(Fp, ctx->hash_alg, &sig->B, &sig->K,
+ sigrl_entry, &commit_out, msg, msg_len, &c_str);
+ BREAK_ON_EPID_ERROR(sts);
+
+ digest = SAFE_ALLOC(digest_len);
+ if (!digest) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ sts = NewFfElement(Fp, &t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(Fp, &c_str, sizeof(c_str), c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 8. The member computes smu = (rmu + c * mu) mod p.
+ sts = FfMul(Fp, c, mu, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, rmu, t2, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t2, &proof->smu, sizeof(proof->smu));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 9.1. The member computes c' = (c * nu) mod p
+ sts = FfMul(Fp, c, nu, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ // 9.2. snu = TPM2_Sign(c = c', counterTPM)
+ sts = WriteFfElement(Fp, t2, digest, digest_len);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Tpm2Sign(ctx->tpm2_ctx, digest, digest_len, rnu_ctr, NULL, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t2, &proof->snu, sizeof(proof->snu));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 10. The member outputs sigma = (T, c, smu, snu), a non-revoked
+ // proof. If G1.is_identity(T) = true, the member also outputs
+ // "failed".
+
+ proof->T = commit_out.T;
+ proof->c = c_str;
+
+ if (IsIdentity(&proof->T)) {
+ sts = kEpidSigRevokedInSigRl;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(s2);
+ EpidZeroMemory(&mu_str, sizeof(mu_str));
+ EpidZeroMemory(&nu_str, sizeof(nu_str));
+ EpidZeroMemory(&rmu_str, sizeof(rmu_str));
+ DeleteFfElement(&y2);
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&rlB);
+ DeleteEcPoint(&rlK);
+ DeleteEcPoint(&D);
+ DeleteEcPoint(&t);
+ DeleteEcPoint(&e_tpm);
+ DeleteEcPoint(&l_tpm);
+ DeleteEcPoint(&k_tpm);
+ DeleteFfElement(&mu);
+ DeleteFfElement(&nu);
+ DeleteFfElement(&rmu);
+ DeleteFfElement(&t2);
+ DeleteFfElement(&c);
+ SAFE_FREE(digest);
+
+ return sts;
+}
diff --git a/epid/member/src/nrprove.h b/epid/member/src/nrprove.h
new file mode 100644
index 0000000..3a1a70e
--- /dev/null
+++ b/epid/member/src/nrprove.h
@@ -0,0 +1,71 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidNrProve interface.
+/*! \file */
+#ifndef EPID_MEMBER_SRC_NRPROVE_H_
+#define EPID_MEMBER_SRC_NRPROVE_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct BasicSignature BasicSignature;
+typedef struct SigRlEntry SigRlEntry;
+typedef struct NrProof NrProof;
+/// \endcond
+
+/// Calculates a non-revoked proof for a single signature based revocation
+/// list entry.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The member context.
+ \param[in] msg
+ The message.
+ \param[in] msg_len
+ The length of message in bytes.
+ \param[in] basename
+ The basename used in EpidSignBasic.
+ \param[in] basename_len
+ The length of the basename.
+ \param[in] sig
+ The basic signature.
+ \param[in] sigrl_entry
+ The signature based revocation list entry.
+ \param[out] proof
+ The generated non-revoked proof.
+
+ \returns ::EpidStatus
+
+ \note
+ This function should be used in conjunction with EpidSignBasic().
+
+ \note
+ If the result is not ::kEpidNoErr, the content of proof is undefined.
+
+ \see EpidMemberInit
+ \see EpidSignBasic
+ */
+EpidStatus EpidNrProve(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ BasicSignature const* sig, SigRlEntry const* sigrl_entry,
+ NrProof* proof);
+
+#endif // EPID_MEMBER_SRC_NRPROVE_H_
diff --git a/epid/member/src/nrprove_commitment.c b/epid/member/src/nrprove_commitment.c
new file mode 100644
index 0000000..41618b8
--- /dev/null
+++ b/epid/member/src/nrprove_commitment.c
@@ -0,0 +1,113 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host non-revoked proof helper implementation
+/*! \file */
+
+#include "epid/member/src/nrprove_commitment.h"
+
+#include <stdint.h>
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/memory.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+#pragma pack(1)
+/// Storage for values to create commitment in NrProve algorithm
+typedef struct NrProveCommitValues {
+ BigNumStr p; //!< A large prime (256-bit)
+ G1ElemStr g1; //!< Generator of G1 (512-bit)
+ G1ElemStr B; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr K; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr rlB; //!< (element of G1): one entry in SigRL
+ G1ElemStr rlK; //!< (element of G1): one entry in SigRL
+ NrProveCommitOutput commit_out; //!< output of NrProveCommit
+ uint8_t msg[1]; //!< message
+} NrProveCommitValues;
+#pragma pack()
+
+EpidStatus HashNrProveCommitment(FiniteField* Fp, HashAlg hash_alg,
+ G1ElemStr const* B_str, G1ElemStr const* K_str,
+ SigRlEntry const* sigrl_entry,
+ NrProveCommitOutput const* commit_out,
+ void const* msg, size_t msg_len,
+ FpElemStr* c_str) {
+ EpidStatus sts = kEpidErr;
+ FfElement* c = NULL;
+ NrProveCommitValues* commit_values = NULL;
+
+ if (!Fp || !B_str || !K_str || !sigrl_entry || !commit_out ||
+ (0 != msg_len && !msg) || !c_str) {
+ return kEpidBadArgErr;
+ }
+
+ if (msg_len >
+ ((SIZE_MAX - sizeof(*commit_values)) + sizeof(*commit_values->msg)))
+ return kEpidBadArgErr;
+
+ do {
+ size_t const commit_len =
+ sizeof(*commit_values) - sizeof(*commit_values->msg) + msg_len;
+ Epid2Params params = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ commit_values = SAFE_ALLOC(commit_len);
+ if (!commit_values) {
+ sts = kEpidMemAllocErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ commit_values->p = params.p;
+ commit_values->g1 = params.g1;
+ commit_values->B = *B_str;
+ commit_values->K = *K_str;
+ commit_values->rlB = sigrl_entry->b;
+ commit_values->rlK = sigrl_entry->k;
+ commit_values->commit_out = *commit_out;
+
+ // commit_values is allocated such that there are msg_len bytes available
+ // starting at commit_values->msg
+ if (msg) {
+ // Memory copy is used to copy a message of variable length
+ if (0 != memcpy_S(&commit_values->msg[0], msg_len, msg, msg_len)) {
+ sts = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ }
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 7. The member computes c = Fp.hash(p || g1 || B || K || B' ||
+ // K' || T || R1 || R2 || m).
+ sts = FfHash(Fp, commit_values, commit_len, hash_alg, c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, c, c_str, sizeof(*c_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(commit_values);
+ DeleteFfElement(&c);
+
+ return sts;
+}
diff --git a/epid/member/src/nrprove_commitment.h b/epid/member/src/nrprove_commitment.h
new file mode 100644
index 0000000..91f0cb4
--- /dev/null
+++ b/epid/member/src/nrprove_commitment.h
@@ -0,0 +1,82 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host non-revoked proof helper APIs
+/*! \file */
+#ifndef EPID_MEMBER_SRC_NRPROVE_COMMITMENT_H_
+#define EPID_MEMBER_SRC_NRPROVE_COMMITMENT_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h" // HashAlg, G1ElemStr
+
+/// \cond
+typedef struct FiniteField FiniteField;
+typedef struct FpElemStr FpElemStr;
+typedef struct SigRlEntry SigRlEntry;
+typedef struct NrProveCommitOutput NrProveCommitOutput;
+/// \endcond
+
+#pragma pack(1)
+/// Result of NrProve Commit
+typedef struct NrProveCommitOutput {
+ G1ElemStr T; ///< T value for NrProof
+ G1ElemStr R1; ///< Serialized G1 element
+ G1ElemStr R2; ///< Serialized G1 element
+} NrProveCommitOutput;
+#pragma pack()
+
+/// Calculates commitment hash of NrProve commit
+/*!
+
+ \param[in] Fp
+ The finite field.
+
+ \param[in] hash_alg
+ The hash algorithm.
+
+ \param[in] B_str
+ The B value from the ::BasicSignature.
+
+ \param[in] K_str
+ The K value from the ::BasicSignature.
+
+ \param[in] sigrl_entry
+ The signature based revocation list entry corresponding to this
+ proof.
+
+ \param[in] commit_out
+ The output from the NrProve commit.
+
+ \param[in] msg
+ The message.
+
+ \param[in] msg_len
+ The size of message in bytes.
+
+ \param[out] c_str
+ The resulting commitment hash.
+
+ \returns ::EpidStatus
+
+ */
+EpidStatus HashNrProveCommitment(FiniteField* Fp, HashAlg hash_alg,
+ G1ElemStr const* B_str, G1ElemStr const* K_str,
+ SigRlEntry const* sigrl_entry,
+ NrProveCommitOutput const* commit_out,
+ void const* msg, size_t msg_len,
+ FpElemStr* c_str);
+
+#endif // EPID_MEMBER_SRC_NRPROVE_COMMITMENT_H_
diff --git a/epid/member/src/precomp.c b/epid/member/src/precomp.c
new file mode 100644
index 0000000..c87f479
--- /dev/null
+++ b/epid/member/src/precomp.c
@@ -0,0 +1,91 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member pre-computation implementation
+/*! \file */
+#include "epid/member/src/precomp.h"
+
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/grouppubkey.h"
+#include "epid/common/types.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus PrecomputeMemberPairing(Epid2Params_ const* epid2_params,
+ GroupPubKey const* pub_key,
+ G1ElemStr const* A_str,
+ MemberPrecomp* precomp) {
+ EpidStatus sts = kEpidErr;
+
+ GroupPubKey_* pub_key_ = NULL;
+ EcPoint* A = NULL;
+ FfElement* e = NULL;
+
+ if (!epid2_params || !pub_key || !A_str || !precomp) return kEpidBadArgErr;
+
+ do {
+ EcGroup* G1 = epid2_params->G1;
+ EcGroup* G2 = epid2_params->G2;
+ FiniteField* GT = epid2_params->GT;
+ PairingState* ps_ctx = epid2_params->pairing_state;
+ EcPoint* g2 = epid2_params->g2;
+
+ sts = CreateGroupPubKey(pub_key, G1, G2, &pub_key_);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(GT, &e);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 1. The member computes e12 = pairing(h1, g2).
+ sts = Pairing(ps_ctx, pub_key_->h1, g2, e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(GT, e, &precomp->e12, sizeof(precomp->e12));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 2. The member computes e22 = pairing(h2, g2).
+ sts = Pairing(ps_ctx, pub_key_->h2, g2, e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(GT, e, &precomp->e22, sizeof(precomp->e22));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 3. The member computes e2w = pairing(h2, w).
+ sts = Pairing(ps_ctx, pub_key_->h2, pub_key_->w, e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(GT, e, &precomp->e2w, sizeof(precomp->e2w));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4. The member computes ea2 = pairing(A, g2).
+ sts = NewEcPoint(G1, &A);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, A_str, sizeof(*A_str), A);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Pairing(ps_ctx, A, g2, e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(GT, e, &precomp->ea2, sizeof(precomp->ea2));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ DeleteGroupPubKey(&pub_key_);
+ DeleteEcPoint(&A);
+ DeleteFfElement(&e);
+
+ return sts;
+}
diff --git a/epid/member/src/precomp.h b/epid/member/src/precomp.h
new file mode 100644
index 0000000..58a8c40
--- /dev/null
+++ b/epid/member/src/precomp.h
@@ -0,0 +1,59 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member pre-computation API
+/*! \file */
+#ifndef EPID_MEMBER_SRC_PRECOMP_H_
+#define EPID_MEMBER_SRC_PRECOMP_H_
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct GroupPubKey GroupPubKey;
+typedef struct G1ElemStr G1ElemStr;
+typedef struct MemberPrecomp MemberPrecomp;
+/// \endcond
+
+/// Precomputes pairing values for member
+/*!
+
+ The the result of the expensive pairing operations can be
+ pre-computed. The pre-computation result can be saved for future
+ sign operations using the same group and private key.
+
+ \param[in] epid2_params
+ The field and group parameters.
+
+ \param[in] pub_key
+ The public key of the group.
+
+ \param[in] A_str
+ The A value of the member private key.
+
+ \param[out] precomp
+ The member pre-computed data.
+
+ \returns ::EpidStatus
+
+ \see CreateEpid2Params
+
+ */
+EpidStatus PrecomputeMemberPairing(Epid2Params_ const* epid2_params,
+ GroupPubKey const* pub_key,
+ G1ElemStr const* A_str,
+ MemberPrecomp* precomp);
+
+#endif // EPID_MEMBER_SRC_PRECOMP_H_
diff --git a/epid/member/src/presig-internal.h b/epid/member/src/presig-internal.h
new file mode 100644
index 0000000..8620505
--- /dev/null
+++ b/epid/member/src/presig-internal.h
@@ -0,0 +1,53 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Internal pre-computed signature APIs
+/*! \file */
+
+#ifndef EPID_MEMBER_SRC_PRESIG_INTERNAL_H_
+#define EPID_MEMBER_SRC_PRESIG_INTERNAL_H_
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct PreComputedSignature PreComputedSignature;
+/// \endcond
+
+/// Provides a precomputed signature
+/*!
+
+ Provides and removes a pre-computed signatures from members's pool if
+ available, otherwise provides a newly calculated a precomputed
+ signature.
+
+ \warning
+ Pre-computed signatures must not be accessed outside of the secure
+ boundary.
+
+ \param[in,out] ctx
+ The member context.
+
+ \param[out] presig
+ The pre-computed signature removed from members's pool
+
+ \returns ::EpidStatus
+
+ */
+EpidStatus MemberGetPreSig(MemberCtx* ctx, PreComputedSignature* presig);
+
+///@}
+/*! @} */
+#endif // EPID_MEMBER_SRC_PRESIG_INTERNAL_H_
diff --git a/epid/member/src/presig.c b/epid/member/src/presig.c
new file mode 100644
index 0000000..4cd4c81
--- /dev/null
+++ b/epid/member/src/presig.c
@@ -0,0 +1,295 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Sensitive pre-computed signature implementation
+/*! \file */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/src/stack.h"
+#include "epid/member/src/context.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/getrandom.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+static EpidStatus MemberComputePreSig(MemberCtx const* ctx,
+ PreComputedSignature* precompsig);
+
+EpidStatus EpidAddPreSigs(MemberCtx* ctx, size_t number_presigs) {
+ PreComputedSignature* new_presigs = NULL;
+ size_t i = 0;
+ if (!ctx || !ctx->presigs) return kEpidBadArgErr;
+
+ if (0 == number_presigs) return kEpidNoErr;
+
+ new_presigs =
+ (PreComputedSignature*)StackPushN(ctx->presigs, number_presigs, NULL);
+ if (!new_presigs) return kEpidMemAllocErr;
+
+ for (i = 0; i < number_presigs; i++) {
+ EpidStatus sts = MemberComputePreSig(ctx, &new_presigs[i]);
+ if (kEpidNoErr != sts) {
+ // roll back pre-computed-signature pool
+ StackPopN(ctx->presigs, number_presigs, 0);
+ return sts;
+ }
+ }
+
+ return kEpidNoErr;
+}
+
+size_t EpidGetNumPreSigs(MemberCtx const* ctx) {
+ return (ctx && ctx->presigs) ? StackGetSize(ctx->presigs) : (size_t)0;
+}
+
+EpidStatus MemberGetPreSig(MemberCtx* ctx, PreComputedSignature* presig) {
+ if (!ctx || !presig) {
+ return kEpidBadArgErr;
+ }
+
+ if (StackGetSize(ctx->presigs)) {
+ // Use existing pre-computed signature
+ if (!StackPopN(ctx->presigs, 1, presig)) {
+ return kEpidErr;
+ }
+ return kEpidNoErr;
+ }
+ // generate a new pre-computed signature
+ return MemberComputePreSig(ctx, presig);
+}
+
+/// Performs Pre-computation that can be used to speed up signing
+EpidStatus MemberComputePreSig(MemberCtx const* ctx,
+ PreComputedSignature* precompsig) {
+ EpidStatus sts = kEpidErr;
+
+ EcPoint* B = NULL;
+ EcPoint* k = NULL;
+ EcPoint* t = NULL; // temporary, used for K, T, R1
+ EcPoint* e = NULL;
+
+ FfElement* R2 = NULL;
+
+ FfElement* a = NULL;
+ FfElement* rx = NULL; // reused for rf
+ FfElement* rb = NULL; // reused for ra
+
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+ BigNumStr t1_str = {0};
+ BigNumStr t2_str = {0};
+ struct {
+ uint32_t i;
+ BigNumStr bsn;
+ } p2x = {0};
+ FfElement* p2y = NULL;
+
+ if (!ctx || !precompsig || !ctx->epid2_params) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ // handy shorthands:
+ Tpm2Ctx* tpm = ctx->tpm2_ctx;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ FiniteField* GT = ctx->epid2_params->GT;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ FiniteField* Fq = ctx->epid2_params->Fq;
+ EcPoint const* h2 = ctx->h2;
+ EcPoint const* A = ctx->A;
+ FfElement const* x = ctx->x;
+ PairingState* ps_ctx = ctx->epid2_params->pairing_state;
+
+ const BigNumStr kOne = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ // 1. The member expects the pre-computation is done (e12, e22, e2w,
+ // ea2). Refer to Section 3.5 for the computation of these
+ // values.
+
+ sts = NewFfElement(Fq, &p2y);
+ // The following variables B, K, T, R1 (elements of G1), R2
+ // (elements of GT), a, b, rx, rf, ra, rb, t1, t2 (256-bit
+ // integers) are used.
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &k);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(GT, &R2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &a);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &rx);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &rb);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &t1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 3. The member computes B = G1.getRandom().
+ // 4.a. If bsn is not provided, the member chooses randomly an integer bsn
+ // from [1, p-1].
+ sts = Tpm2GetRandom(tpm, sizeof(p2x.bsn) * 8, &p2x.bsn);
+ BREAK_ON_EPID_ERROR(sts);
+ precompsig->rnd_bsn = p2x.bsn;
+
+ // 4.b. The member computes (B, i2, y2) = G1.tpmHash(bsn).
+ sts = EcHash(G1, (const void*)&p2x.bsn, sizeof(p2x.bsn), ctx->hash_alg, B,
+ &p2x.i);
+ BREAK_ON_EPID_ERROR(sts);
+ p2x.i = htonl(p2x.i);
+ sts = WriteEcPoint(G1, B, &precompsig->B, sizeof(precompsig->B));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fq, &precompsig->B.y, sizeof(precompsig->B.y), p2y);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.c. (KTPM, LTPM, ETPM, counterTPM) = TPM2_Commit(P1=h1, (s2, y2) = (i1
+ // || bsn, y2)), K = KTPM
+ sts = Tpm2Commit(tpm, ctx->h1, &p2x, sizeof(p2x), p2y, k, t, e,
+ &precompsig->rf_ctr);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, k, &precompsig->K, sizeof(precompsig->K));
+ BREAK_ON_EPID_ERROR(sts);
+ // 4.k. The member computes R1 = LTPM.
+ sts = WriteEcPoint(G1, t, &precompsig->R1, sizeof(precompsig->R1));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.d. The member chooses randomly an integer a from [1, p-1].
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, a);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, a, &precompsig->a, sizeof(precompsig->a));
+ BREAK_ON_EPID_ERROR(sts);
+ // 4.e. The member computes T = G1.sscmExp(h2, a).
+ sts = EcExp(G1, h2, (BigNumStr*)&precompsig->a, t);
+ BREAK_ON_EPID_ERROR(sts);
+ // 4.k. The member computes T = G1.mul(T, A).
+ sts = EcMul(G1, t, A, t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, t, &precompsig->T, sizeof(precompsig->T));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.h. The member chooses rx, ra, rb randomly from [1, p-1].
+
+ // note : rb are reused as ra
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, rx);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, rb);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, rx, &precompsig->rx, sizeof(precompsig->rx));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, rb, &precompsig->rb, sizeof(precompsig->rb));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.i. The member computes t1 = (- rx) mod p.
+ sts = FfNeg(Fp, rx, t1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.j. The member computes t2 = (rb - a * rx) mod p.
+ sts = FfMul(Fp, a, rx, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfNeg(Fp, t2, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, rb, t2, t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.g. The member computes b = (a * x) mod p.
+ sts = FfMul(Fp, a, x, a);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, a, &precompsig->b, sizeof(precompsig->b));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // reusing rb as ra
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, rb);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, rb, &precompsig->ra, sizeof(precompsig->ra));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.l.i e12rf = pairing(ETPM, g2)
+ sts = Pairing(ps_ctx, e, ctx->epid2_params->g2, R2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4.l.ii. The member computes R2 = GT.sscmMultiExp(ea2, t1, e12rf, 1,
+ // e22, t2, e2w, ra).
+ sts = WriteFfElement(Fp, t1, &t1_str, sizeof(t1_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t2, &t2_str, sizeof(t2_str));
+ BREAK_ON_EPID_ERROR(sts);
+ {
+ FfElement const* points[4];
+ BigNumStr const* exponents[4];
+ points[0] = ctx->ea2;
+ points[1] = R2;
+ points[2] = ctx->e22;
+ points[3] = ctx->e2w;
+ exponents[0] = &t1_str;
+ exponents[1] = &kOne;
+ exponents[2] = &t2_str;
+ exponents[3] = (BigNumStr*)&precompsig->ra;
+ sts = FfMultiExp(GT, points, exponents, COUNT_OF(points), R2);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ sts = WriteFfElement(GT, R2, &precompsig->R2, sizeof(precompsig->R2));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ if (sts != kEpidNoErr) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, precompsig->rf_ctr);
+ }
+
+ EpidZeroMemory(&t1_str, sizeof(t1_str));
+ EpidZeroMemory(&t2_str, sizeof(t2_str));
+ EpidZeroMemory(&p2x, sizeof(p2x));
+
+ DeleteFfElement(&p2y);
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&k);
+ DeleteEcPoint(&t);
+ DeleteEcPoint(&e);
+ DeleteFfElement(&R2);
+ DeleteFfElement(&a);
+ DeleteFfElement(&rx);
+ DeleteFfElement(&rb);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+
+ return sts;
+}
diff --git a/epid/member/src/privateexp.c b/epid/member/src/privateexp.c
new file mode 100644
index 0000000..9c1f0d9
--- /dev/null
+++ b/epid/member/src/privateexp.c
@@ -0,0 +1,141 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member private exponentiation implementation
+/*! \file */
+
+#include "epid/member/src/privateexp.h"
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus EpidPrivateExp(MemberCtx* ctx, EcPoint const* a, EcPoint* r) {
+ EpidStatus sts = kEpidErr;
+
+ BigNumStr tmp_ff_str = {0};
+ uint16_t counter = 0;
+
+ EcPoint* k_pt = NULL;
+ EcPoint* l_pt = NULL;
+ EcPoint* e_pt = NULL;
+ EcPoint* t1 = NULL;
+ EcPoint* h = NULL;
+
+ FfElement* k = NULL;
+ FfElement* s = NULL;
+
+ size_t digest_len = 0;
+ uint8_t* digest = NULL;
+
+ if (!ctx || !ctx->epid2_params || !a || !r) {
+ return kEpidBadArgErr;
+ }
+
+ digest_len = EpidGetHashSize(ctx->hash_alg);
+ digest = SAFE_ALLOC(digest_len);
+ if (!digest) {
+ return kEpidMemAllocErr;
+ }
+
+ memset(digest, 0, digest_len);
+ digest[digest_len - 1] = 1;
+
+ do {
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ EcGroup* G1 = ctx->epid2_params->G1;
+
+ if (!ctx->is_provisioned && !ctx->is_initially_provisioned) {
+ sts = EpidMemberInitialProvision(ctx);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ // (K_PT, L_PT, E_PT, counter) = TPM2_Commit(P1=B')
+ sts = NewEcPoint(G1, &k_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &l_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &e_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &t1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &h);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts =
+ Tpm2Commit(ctx->tpm2_ctx, a, NULL, 0, NULL, k_pt, l_pt, e_pt, &counter);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // (k, s) = TPM2_Sign(c=1, counter)
+ sts = NewFfElement(Fp, &k);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &s);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = Tpm2Sign(ctx->tpm2_ctx, digest, digest_len, counter, k, s);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // k = Fq.inv(k)
+ sts = FfInv(Fp, k, k);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // t1 = G1.sscmExp(B', s)
+ sts = WriteFfElement(Fp, s, &tmp_ff_str, sizeof(tmp_ff_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcSscmExp(G1, a, &tmp_ff_str, t1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // E_PT = G1.inv(E_PT)
+ sts = EcInverse(G1, e_pt, e_pt);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // h = G1.mul(t1, E_PT)
+ sts = EcMul(G1, t1, e_pt, h);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // h = G1.sscmExp(h, k)
+ sts = WriteFfElement(Fp, k, &tmp_ff_str, sizeof(tmp_ff_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcSscmExp(G1, h, &tmp_ff_str, r);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+
+ if (sts != kEpidNoErr) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, counter);
+ }
+ DeleteFfElement(&s);
+ DeleteFfElement(&k);
+
+ DeleteEcPoint(&e_pt);
+ DeleteEcPoint(&l_pt);
+ DeleteEcPoint(&k_pt);
+ DeleteEcPoint(&t1);
+ DeleteEcPoint(&h);
+
+ EpidZeroMemory(&tmp_ff_str, sizeof(tmp_ff_str));
+ SAFE_FREE(digest);
+ return sts;
+}
diff --git a/epid/member/src/privateexp.h b/epid/member/src/privateexp.h
new file mode 100644
index 0000000..415bb1a
--- /dev/null
+++ b/epid/member/src/privateexp.h
@@ -0,0 +1,42 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member private exponentiation API
+/*! \file */
+#ifndef EPID_MEMBER_SRC_PRIVATEEXP_H_
+#define EPID_MEMBER_SRC_PRIVATEEXP_H_
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct EcPoint EcPoint;
+typedef struct MemberCtx MemberCtx;
+/// \endcond
+
+/// Raises a point in an elliptic curve group G1 to a private key f.
+/*!
+ \param[in] ctx
+ The member context.
+ \param[in] a
+ The base.
+ \param[out] r
+ The result of exponentiation.
+
+ \returns ::EpidStatus
+*/
+
+EpidStatus EpidPrivateExp(MemberCtx* ctx, EcPoint const* a, EcPoint* r);
+
+#endif // EPID_MEMBER_SRC_PRIVATEEXP_H_
diff --git a/epid/member/src/provision_bulk.c b/epid/member/src/provision_bulk.c
new file mode 100644
index 0000000..2c9a382
--- /dev/null
+++ b/epid/member/src/provision_bulk.c
@@ -0,0 +1,88 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidProvisionKey implementation.
+/*!
+ * \file
+ */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/src/memory.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/storage.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/load_external.h"
+
+EpidStatus EpidProvisionKey(MemberCtx* ctx, GroupPubKey const* pub_key,
+ PrivKey const* priv_key,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts = kEpidErr;
+ uint32_t const nv_index = 0x01c10100;
+ MembershipCredential credential = {0};
+
+ if (!pub_key || !priv_key || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ // The member verifies that gid in public key and in private key
+ // match. If mismatch, abort and return operation failed.
+ if (memcmp(&pub_key->gid, &priv_key->gid, sizeof(GroupId))) {
+ return kEpidBadArgErr;
+ }
+
+ sts = Tpm2LoadExternal(ctx->tpm2_ctx, &priv_key->f);
+ if (kEpidNoErr != sts) {
+ return sts;
+ }
+
+ credential.A = priv_key->A;
+ credential.x = priv_key->x;
+ credential.gid = priv_key->gid;
+
+ if (ctx->primary_key_set) {
+ Tpm2ResetContext(&ctx->tpm2_ctx);
+ ctx->primary_key_set = false;
+ }
+ sts = Tpm2LoadExternal(ctx->tpm2_ctx, &priv_key->f);
+ if (kEpidNoErr != sts) {
+ return sts;
+ }
+ ctx->primary_key_set = true;
+
+ sts = EpidNvWriteMembershipCredential(ctx->tpm2_ctx, pub_key, &credential,
+ nv_index);
+
+ if (kEpidNoErr == sts) {
+ if (precomp_str) {
+ ctx->precomp = *precomp_str;
+ ctx->precomp_ready = true;
+ } else {
+ EpidZeroMemory(&ctx->precomp, sizeof(ctx->precomp));
+ ctx->precomp_ready = false;
+ }
+
+ ctx->pub_key = *pub_key;
+ ctx->is_provisioned = true;
+
+ ctx->credential.A = credential.A;
+ ctx->credential.x = credential.x;
+ ctx->credential.gid = credential.gid;
+ }
+ return sts;
+}
diff --git a/epid/member/src/provision_compressed.c b/epid/member/src/provision_compressed.c
new file mode 100644
index 0000000..b582e53
--- /dev/null
+++ b/epid/member/src/provision_compressed.c
@@ -0,0 +1,41 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidProvisionCompressed implementation.
+/*!
+ * \file
+ */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+
+EpidStatus EpidProvisionCompressed(MemberCtx* ctx, GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts = kEpidErr;
+ PrivKey priv_key;
+ if (!pub_key || !compressed_privkey || !ctx) {
+ return kEpidBadArgErr;
+ }
+ sts = EpidDecompressPrivKey(pub_key, compressed_privkey, &priv_key);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidProvisionKey(ctx, pub_key, &priv_key, precomp_str);
+ return sts;
+}
diff --git a/epid/member/src/provision_join.c b/epid/member/src/provision_join.c
new file mode 100644
index 0000000..49bc96e
--- /dev/null
+++ b/epid/member/src/provision_join.c
@@ -0,0 +1,85 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidProvisionCredential implementation.
+/*!
+ * \file
+ */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/storage.h"
+#include "epid/member/src/validatekey.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/createprimary.h"
+
+EpidStatus EpidProvisionCredential(MemberCtx* ctx, GroupPubKey const* pub_key,
+ MembershipCredential const* credential,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts = kEpidErr;
+ uint32_t const nv_index = 0x01c10100;
+ G1ElemStr f_str;
+
+ if (!pub_key || !credential || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ if (memcmp(&pub_key->gid, &credential->gid, sizeof(GroupId))) {
+ return kEpidBadArgErr;
+ }
+
+ if (!ctx->is_provisioned && !ctx->is_initially_provisioned) {
+ sts = EpidMemberInitialProvision(ctx);
+ if (kEpidNoErr != sts) return sts;
+ }
+
+ if (!EpidMemberIsKeyValid(ctx, &credential->A, &credential->x, &pub_key->h1,
+ &pub_key->w)) {
+ return kEpidBadArgErr;
+ }
+
+ sts = EpidNvWriteMembershipCredential(ctx->tpm2_ctx, pub_key, credential,
+ nv_index);
+
+ if (ctx->primary_key_set) {
+ Tpm2ResetContext(&ctx->tpm2_ctx);
+ ctx->primary_key_set = false;
+ }
+ sts = Tpm2CreatePrimary(ctx->tpm2_ctx, &f_str);
+ if (kEpidNoErr != sts) {
+ return sts;
+ }
+ ctx->primary_key_set = true;
+ if (kEpidNoErr == sts) {
+ if (precomp_str) {
+ ctx->precomp = *precomp_str;
+ ctx->precomp_ready = true;
+ } else {
+ EpidZeroMemory(&ctx->precomp, sizeof(ctx->precomp));
+ ctx->precomp_ready = false;
+ }
+
+ ctx->credential.A = credential->A;
+ ctx->credential.x = credential->x;
+ ctx->credential.gid = credential->gid;
+ ctx->pub_key = *pub_key;
+ ctx->is_provisioned = true;
+ }
+ return sts;
+}
diff --git a/epid/member/src/resize.c b/epid/member/src/resize.c
new file mode 100644
index 0000000..fb4a168
--- /dev/null
+++ b/epid/member/src/resize.c
@@ -0,0 +1,40 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implements ResizeOctStr
+/*! \file */
+
+#include "epid/member/src/resize.h"
+
+#include <stdint.h>
+#include "epid/common/src/memory.h"
+
+EpidStatus ResizeOctStr(ConstOctStr a, size_t a_size, OctStr r, size_t r_size) {
+ if (!a || !a_size || !r || !r_size) return kEpidBadArgErr;
+ if (a_size <= r_size) {
+ memset(r, 0, r_size - a_size);
+ if (memcpy_S((uint8_t*)r + (r_size - a_size), a_size, a, a_size))
+ return kEpidErr;
+ } else {
+ size_t i;
+ for (i = 0; i < a_size - r_size; i++) {
+ if (((uint8_t*)a)[i])
+ return kEpidBadArgErr; // a does not fit into r_size
+ }
+ if (memcpy_S(r, r_size, (uint8_t*)a + (a_size - r_size), r_size))
+ return kEpidErr;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/src/resize.h b/epid/member/src/resize.h
new file mode 100644
index 0000000..ee4b9f1
--- /dev/null
+++ b/epid/member/src/resize.h
@@ -0,0 +1,45 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Declares ResizeOctStr
+/*! \file */
+
+#ifndef EPID_MEMBER_SRC_RESIZE_H_
+#define EPID_MEMBER_SRC_RESIZE_H_
+
+#include <string.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// Resizes octet string number
+/*!
+Prepends input number with zeros when increasing the size.
+Removes leading zeros when decreasing the size.
+Return error if input number does not fit the new size.
+
+\param[in] a
+Octet string to resize
+\param[in] a_size
+Size of the a
+\param[out] r
+Result octet string
+\param[in] r_size
+New size
+
+\returns ::EpidStatus
+*/
+EpidStatus ResizeOctStr(ConstOctStr a, size_t a_size, OctStr r, size_t r_size);
+
+#endif // EPID_MEMBER_SRC_RESIZE_H_
diff --git a/epid/member/src/sign.c b/epid/member/src/sign.c
new file mode 100644
index 0000000..2c49aa5
--- /dev/null
+++ b/epid/member/src/sign.c
@@ -0,0 +1,111 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidSign implementation.
+/*! \file */
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/src/sigrlvalid.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/nrprove.h"
+#include "epid/member/src/signbasic.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus EpidSign(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ EpidSignature* sig, size_t sig_len) {
+ EpidStatus sts = kEpidErr;
+ uint32_t num_sig_rl = 0;
+ OctStr32 octstr32_0 = {{0x00, 0x00, 0x00, 0x00}};
+ BigNumStr rnd_bsn = {0};
+ if (!ctx || !sig) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!basename && (0 != basename_len)) {
+ // if basename is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!ctx->is_provisioned) {
+ return kEpidOutOfSequenceError;
+ }
+ if (EpidGetSigSize(ctx->sig_rl) > sig_len) {
+ return kEpidBadArgErr;
+ }
+
+ // 11. The member sets sigma0 = (B, K, T, c, sx, sf, sa, sb).
+ sts = EpidSignBasic(ctx, msg, msg_len, basename, basename_len, &sig->sigma0,
+ &rnd_bsn);
+ if (kEpidNoErr != sts) {
+ return sts;
+ }
+
+ if (!ctx->sig_rl) {
+ // 12. If SigRL is not provided as input,
+ // a. The member sets RLver = 0 and n2 = 0.
+ // b. The member outputs (sigma0, RLver, n2) and returns "succeeded".
+ sig->rl_ver = octstr32_0;
+ sig->n2 = octstr32_0;
+ return kEpidNoErr;
+ } else {
+ uint32_t i = 0;
+ EpidStatus nr_prove_status = kEpidNoErr;
+ // 13. If SigRL is provided as input, the member proceeds with
+ // the following steps:
+ // a. The member verifies that gid in public key and in SigRL
+ // match.
+ // This was done under EpidMemberSetSigRl function.
+ // b. The member copies RLver and n2 values in SigRL to the
+ // signature.
+ sig->rl_ver = ctx->sig_rl->version;
+ sig->n2 = ctx->sig_rl->n2;
+ // c. For i = 0, ..., n2-1, the member computes sigma[i] =
+ // nrProve(f, B, K, B[i], K[i]). The details of nrProve()
+ // will be given in the next subsection.
+ num_sig_rl = ntohl(ctx->sig_rl->n2);
+ for (i = 0; i < num_sig_rl; i++) {
+ if (basename) {
+ sts = EpidNrProve(ctx, msg, msg_len, basename, basename_len,
+ &sig->sigma0, &ctx->sig_rl->bk[i], &sig->sigma[i]);
+ } else {
+ sts = EpidNrProve(ctx, msg, msg_len, &rnd_bsn, sizeof(rnd_bsn),
+ &sig->sigma0, &ctx->sig_rl->bk[i], &sig->sigma[i]);
+ }
+ if (kEpidNoErr != sts) {
+ nr_prove_status = sts;
+ }
+ }
+ if (kEpidNoErr != nr_prove_status) {
+ memset(&sig->sigma[0], 0, num_sig_rl * sizeof(sig->sigma[0]));
+ return nr_prove_status;
+ }
+ }
+ // d. The member outputs (sigma0, RLver, n2, sigma[0], ...,
+ // sigma[n2-1]).
+ // e. If any of the nrProve() functions outputs "failed", the
+ // member returns "revoked", otherwise returns "succeeded".
+ return kEpidNoErr;
+}
diff --git a/epid/member/src/sign_commitment.c b/epid/member/src/sign_commitment.c
new file mode 100644
index 0000000..f317cb6
--- /dev/null
+++ b/epid/member/src/sign_commitment.c
@@ -0,0 +1,71 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host signing helper implementation
+/*! \file */
+
+#include "epid/member/src/sign_commitment.h"
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/commitment.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus HashSignCommitment(FiniteField* Fp, HashAlg hash_alg,
+ GroupPubKey const* pub_key,
+ SignCommitOutput const* commit_out,
+ void const* msg, size_t msg_len,
+ FpElemStr* c_str) {
+ EpidStatus sts = kEpidErr;
+ FfElement* c = NULL;
+
+ if (!Fp || !commit_out || (0 != msg_len && !msg) || !c_str) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ CommitValues values = {0};
+ sts = SetKeySpecificCommitValues(pub_key, &values);
+ BREAK_ON_EPID_ERROR(sts);
+
+ values.B = commit_out->B;
+ values.K = commit_out->K;
+ values.T = commit_out->T;
+ values.R1 = commit_out->R1;
+ values.R2 = commit_out->R2;
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 5. The member computes t3 = Fp.hash(p || g1 || g2 || h1 || h2
+ // || w || B || K || T || R1 || R2).
+ // 6. The member computes c = Fp.hash(t3 || m).
+ sts = CalculateCommitmentHash(&values, Fp, hash_alg, msg, msg_len, c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, c, c_str, sizeof(*c_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&c);
+
+ return sts;
+}
diff --git a/epid/member/src/sign_commitment.h b/epid/member/src/sign_commitment.h
new file mode 100644
index 0000000..45b0b20
--- /dev/null
+++ b/epid/member/src/sign_commitment.h
@@ -0,0 +1,73 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Host signing helper APIs
+/*! \file */
+#ifndef EPID_MEMBER_SRC_SIGN_COMMITMENT_H_
+#define EPID_MEMBER_SRC_SIGN_COMMITMENT_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h" // HashAlg
+
+#pragma pack(1)
+/// Result of Sign Commit
+typedef struct SignCommitOutput {
+ G1ElemStr B; ///< B value for signature
+ G1ElemStr K; ///< K value for signature
+ G1ElemStr T; ///< T value for signature
+ G1ElemStr R1; ///< Serialized G1 element
+ GtElemStr R2; ///< Serialized GT element
+} SignCommitOutput;
+#pragma pack()
+
+typedef struct SignCommitOutput SignCommitOutput;
+
+/// \cond
+typedef struct FiniteField FiniteField;
+typedef struct FpElemStr FpElemStr;
+/// \endcond
+
+/// Calculates commitment hash of sign commit
+/*!
+
+ \param[in] Fp
+ The finite field.
+
+ \param[in] hash_alg
+ The hash algorithm.
+
+ \param[in] commit_out
+ The output from the sign commit.
+
+ \param[in] msg
+ The message.
+
+ \param[in] msg_len
+ The size of message in bytes.
+
+ \param[out] c_str
+ The resulting commitment hash.
+
+ \returns ::EpidStatus
+
+ */
+EpidStatus HashSignCommitment(FiniteField* Fp, HashAlg hash_alg,
+ GroupPubKey const* pub_key,
+ SignCommitOutput const* commit_out,
+ void const* msg, size_t msg_len,
+ FpElemStr* c_str);
+
+#endif // EPID_MEMBER_SRC_SIGN_COMMITMENT_H_
diff --git a/epid/member/src/signbasic.c b/epid/member/src/signbasic.c
new file mode 100644
index 0000000..1e4d76b
--- /dev/null
+++ b/epid/member/src/signbasic.c
@@ -0,0 +1,340 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidSignBasic implementation.
+/*! \file */
+#include "epid/member/src/signbasic.h"
+
+#include <string.h> // memset
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/api.h"
+#include "epid/member/src/allowed_basenames.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/hash_basename.h"
+#include "epid/member/src/presig-internal.h"
+#include "epid/member/src/sign_commitment.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/sign.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+EpidStatus EpidSignBasic(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ BasicSignature* sig, BigNumStr* rnd_bsn) {
+ EpidStatus sts = kEpidErr;
+
+ EcPoint* B = NULL;
+ EcPoint* t = NULL; // temp value in G1
+ EcPoint* k = NULL;
+ EcPoint* e = NULL;
+ FfElement* R2 = NULL;
+ FfElement* p2y = NULL;
+ FfElement* t1 = NULL;
+ FfElement* t2 = NULL;
+
+ FfElement* a = NULL;
+ FfElement* b = NULL;
+ FfElement* rx = NULL;
+ FfElement* ra = NULL;
+ FfElement* rb = NULL;
+
+ struct p2x_t {
+ uint32_t i;
+ uint8_t bsn[1];
+ }* p2x = NULL;
+
+ FfElement* t3 = NULL; // temporary for multiplication
+ FfElement* c = NULL;
+ uint8_t* digest = NULL;
+
+ PreComputedSignature curr_presig = {0};
+
+ if (!ctx || !sig) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!basename && (0 != basename_len)) {
+ // if basename is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ SignCommitOutput commit_out = {0};
+ FpElemStr c_str = {0};
+ EcGroup* G1 = ctx->epid2_params->G1;
+ FiniteField* GT = ctx->epid2_params->GT;
+
+ FiniteField* Fq = ctx->epid2_params->Fq;
+ PairingState* ps_ctx = ctx->epid2_params->pairing_state;
+ const BigNumStr kOne = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ BigNumStr t1_str = {0};
+ BigNumStr t2_str = {0};
+ size_t digest_size = 0;
+ uint16_t* rf_ctr = (uint16_t*)&ctx->rf_ctr;
+ FfElement const* x = ctx->x;
+
+ if (basename) {
+ if (!IsBasenameAllowed(ctx->allowed_basenames, basename, basename_len)) {
+ sts = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ }
+
+ sts = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &k);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &t);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &e);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(GT, &R2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fq, &p2y);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &t1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &t2);
+ BREAK_ON_EPID_ERROR(sts);
+ p2x = (struct p2x_t*)SAFE_ALLOC(sizeof(struct p2x_t) + basename_len - 1);
+ if (!p2x) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ sts = NewFfElement(Fp, &a);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &b);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &rx);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &ra);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &rb);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = MemberGetPreSig((MemberCtx*)ctx, &curr_presig);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 3. If the pre-computed signature pre-sigma exists, the member
+ // loads (B, K, T, a, b, rx, rf, ra, rb, R1, R2) from
+ // pre-sigma. Refer to Section 4.4 for the computation of
+ // these values.
+ sts = ReadFfElement(Fp, &curr_presig.a, sizeof(curr_presig.a), a);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &curr_presig.b, sizeof(curr_presig.b), b);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &curr_presig.rx, sizeof(curr_presig.rx), rx);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &curr_presig.ra, sizeof(curr_presig.ra), ra);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &curr_presig.rb, sizeof(curr_presig.rb), rb);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // If the basename is provided, use it, otherwise use presig B
+ if (basename) {
+ // 3.a. The member computes (B, i2, y2) = G1.tpmHash(bsn).
+ sts = EcHash(G1, basename, basename_len, ctx->hash_alg, B, &p2x->i);
+ BREAK_ON_EPID_ERROR(sts);
+ p2x->i = htonl(p2x->i);
+ sts = WriteEcPoint(G1, B, &commit_out.B, sizeof(commit_out.B));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fq, &commit_out.B.y, sizeof(commit_out.B.y), p2y);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // b.i. (KTPM, LTPM, ETPM, counterTPM) = TPM2_Commit(P1=h1,(s2, y2) = (i2
+ // || bsn, y2)).
+ // b.ii.K = KTPM.
+ if (0 !=
+ memcpy_S((void*)p2x->bsn, basename_len, basename, basename_len)) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts =
+ Tpm2Commit(ctx->tpm2_ctx, ctx->h1, p2x, sizeof(p2x->i) + basename_len,
+ p2y, k, t, e, (uint16_t*)&ctx->rf_ctr);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteEcPoint(G1, k, &commit_out.K, sizeof(commit_out.K));
+ BREAK_ON_EPID_ERROR(sts);
+ // c.i. The member computes R1 = LTPM.
+ sts = WriteEcPoint(G1, t, &commit_out.R1, sizeof(commit_out.R1));
+ BREAK_ON_EPID_ERROR(sts);
+ // c.ii. e12rf = pairing(ETPM, g2)
+ sts = Pairing(ps_ctx, e, ctx->epid2_params->g2, R2);
+ BREAK_ON_EPID_ERROR(sts);
+ // c.iii. R2 = GT.sscmMultiExp(ea2, t1, e12rf, 1, e22, t2, e2w,ra).
+ // 4.i. The member computes t1 = (- rx) mod p.
+ sts = FfNeg(Fp, rx, t1);
+ BREAK_ON_EPID_ERROR(sts);
+ // 4.j. The member computes t2 = (rb - a * rx) mod p.
+ sts = FfMul(Fp, a, rx, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfNeg(Fp, t2, t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, rb, t2, t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, t1, &t1_str, sizeof(t1_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t2, &t2_str, sizeof(t2_str));
+ BREAK_ON_EPID_ERROR(sts);
+ {
+ FfElement const* points[4];
+ BigNumStr const* exponents[4];
+ points[0] = ctx->ea2;
+ points[1] = R2;
+ points[2] = ctx->e22;
+ points[3] = ctx->e2w;
+ exponents[0] = &t1_str;
+ exponents[1] = &kOne;
+ exponents[2] = &t2_str;
+ exponents[3] = (BigNumStr*)&curr_presig.ra;
+ sts = FfMultiExp(GT, points, exponents, COUNT_OF(points), R2);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ sts = WriteFfElement(GT, R2, &commit_out.R2, sizeof(commit_out.R2));
+ BREAK_ON_EPID_ERROR(sts);
+ // d. The member over-writes the counterTPM, B, K, R1 and R2 values.
+ } else {
+ if (!rnd_bsn) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts = ReadEcPoint(G1, &curr_presig.B, sizeof(curr_presig.B), B);
+ BREAK_ON_EPID_ERROR(sts);
+ commit_out.B = curr_presig.B;
+ commit_out.K = curr_presig.K;
+ commit_out.R1 = curr_presig.R1;
+ ((MemberCtx*)ctx)->rf_ctr = curr_presig.rf_ctr;
+ commit_out.R2 = curr_presig.R2;
+ *rnd_bsn = curr_presig.rnd_bsn;
+ }
+
+ commit_out.T = curr_presig.T;
+
+ sts = HashSignCommitment(Fp, ctx->hash_alg, &ctx->pub_key, &commit_out, msg,
+ msg_len, &c_str);
+ BREAK_ON_EPID_ERROR(sts);
+
+ digest_size = EpidGetHashSize(ctx->hash_alg);
+ digest = (uint8_t*)SAFE_ALLOC(digest_size);
+ if (!digest) {
+ sts = kEpidNoMemErr;
+ break;
+ }
+ memcpy_S(digest + digest_size - sizeof(c_str), sizeof(c_str), &c_str,
+ sizeof(c_str));
+
+ sts = NewFfElement(Fp, &t3);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(Fp, &c_str, sizeof(c_str), c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 7. The member computes sx = (rx + c * x) mod p.
+ sts = FfMul(Fp, c, x, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, rx, t3, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t3, &sig->sx, sizeof(sig->sx));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 8. The member computes sf = (rf + c * f) mod p.
+ sts = Tpm2Sign(ctx->tpm2_ctx, digest, digest_size, *rf_ctr, NULL, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t3, &sig->sf, sizeof(sig->sf));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 9. The member computes sa = (ra + c * a) mod p.
+ sts = FfMul(Fp, c, a, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, ra, t3, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t3, &sig->sa, sizeof(sig->sa));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 10. The member computes sb = (rb + c * b) mod p.
+ sts = FfMul(Fp, c, b, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, rb, t3, t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, t3, &sig->sb, sizeof(sig->sb));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sig->B = commit_out.B;
+ sig->K = commit_out.K;
+ sig->T = commit_out.T;
+ sig->c = c_str;
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ if (sts != kEpidNoErr) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, (uint16_t)ctx->rf_ctr);
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, curr_presig.rf_ctr);
+ } else if (basename) {
+ (void)Tpm2ReleaseCounter(ctx->tpm2_ctx, curr_presig.rf_ctr);
+ }
+
+ EpidZeroMemory(&curr_presig, sizeof(curr_presig));
+
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&k);
+ DeleteEcPoint(&t);
+ DeleteEcPoint(&e);
+ DeleteFfElement(&R2);
+ DeleteFfElement(&p2y);
+ DeleteFfElement(&t1);
+ DeleteFfElement(&t2);
+
+ DeleteFfElement(&a);
+ DeleteFfElement(&b);
+ DeleteFfElement(&rx);
+ DeleteFfElement(&ra);
+ DeleteFfElement(&rb);
+
+ SAFE_FREE(p2x);
+
+ DeleteFfElement(&t3);
+ DeleteFfElement(&c);
+ SAFE_FREE(digest);
+
+ return sts;
+}
diff --git a/epid/member/src/signbasic.h b/epid/member/src/signbasic.h
new file mode 100644
index 0000000..2d26a29
--- /dev/null
+++ b/epid/member/src/signbasic.h
@@ -0,0 +1,70 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidSignBasic interface.
+/*! \file */
+#ifndef EPID_MEMBER_SRC_SIGNBASIC_H_
+#define EPID_MEMBER_SRC_SIGNBASIC_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct BasicSignature BasicSignature;
+typedef struct BigNumStr BigNumStr;
+/// \endcond
+
+/// Creates a basic signature for use in constrained environment.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The member context.
+ \param[in] msg
+ The message.
+ \param[in] msg_len
+ The length of message in bytes.
+ \param[in] basename
+ Optional basename. If basename is NULL a random basename is used.
+ Signatures generated using random basenames are anonymous. Signatures
+ generated using the same basename are linkable by the verifier. If a
+ basename is provided it must already be registered or
+ ::kEpidBadArgErr is returned.
+ \param[in] basename_len
+ The size of basename in bytes. Must be 0 if basename is NULL.
+ \param[out] sig
+ The generated basic signature
+ \param[out] rnd_bsn
+ Random basename, can be NULL if basename is provided.
+
+ \returns ::EpidStatus
+
+ \note
+ This function should be used in conjunction with EpidNrProve()
+
+ \note
+ If the result is not ::kEpidNoErr the content of sig, is undefined.
+
+ \see EpidMemberInit
+ \see EpidNrProve
+ */
+EpidStatus EpidSignBasic(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ BasicSignature* sig, BigNumStr* rnd_bsn);
+
+#endif // EPID_MEMBER_SRC_SIGNBASIC_H_
diff --git a/epid/member/src/startup.c b/epid/member/src/startup.c
new file mode 100644
index 0000000..ba310c5
--- /dev/null
+++ b/epid/member/src/startup.c
@@ -0,0 +1,127 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidMemberStartup implementation.
+/*!
+ * \file
+ */
+
+#include <epid/member/api.h>
+
+#include <string.h>
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/types.h" // MemberPrecomp
+#include "epid/member/src/context.h"
+#include "epid/member/src/precomp.h"
+#include "epid/member/src/storage.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+static EpidStatus MemberReadPrecomputation(MemberCtx* ctx,
+ MemberPrecomp const* precomp);
+
+EpidStatus EpidMemberStartup(MemberCtx* ctx) {
+ EpidStatus sts = kEpidErr;
+ uint32_t const nv_index = 0x01c10100;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ EcGroup* G1 = ctx->epid2_params->G1;
+ EcGroup* G2 = ctx->epid2_params->G2;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ EcPoint* A = (EcPoint*)ctx->A;
+ FfElement* x = (FfElement*)ctx->x;
+ EcPoint* h1 = (EcPoint*)ctx->h1;
+ EcPoint* h2 = (EcPoint*)ctx->h2;
+ EcPoint* w = (EcPoint*)ctx->w;
+ sts = EpidNvReadMembershipCredential(ctx->tpm2_ctx, nv_index, &ctx->pub_key,
+ &ctx->credential);
+ BREAK_ON_EPID_ERROR(sts);
+ if (!ctx->precomp_ready) {
+ sts = PrecomputeMemberPairing(ctx->epid2_params, &ctx->pub_key,
+ &ctx->credential.A, &ctx->precomp);
+ BREAK_ON_EPID_ERROR(sts);
+ ctx->precomp_ready = true;
+ }
+
+ if (!ctx->is_provisioned && !ctx->is_initially_provisioned) {
+ sts = EpidMemberInitialProvision(ctx);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ sts = ReadEcPoint(G1, &ctx->credential.A, sizeof(ctx->credential.A), A);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(Fp, &ctx->credential.x, sizeof(ctx->credential.x), x);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadEcPoint(G1, &ctx->pub_key.h1, sizeof(ctx->pub_key.h1), h1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadEcPoint(G1, &ctx->pub_key.h2, sizeof(ctx->pub_key.h2), h2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadEcPoint(G2, &ctx->pub_key.w, sizeof(ctx->pub_key.w), w);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = MemberReadPrecomputation(ctx, &ctx->precomp);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ return sts;
+}
+
+static EpidStatus MemberReadPrecomputation(MemberCtx* ctx,
+ MemberPrecomp const* precomp) {
+ EpidStatus sts = kEpidErr;
+
+ if (!ctx || !precomp || !ctx->epid2_params || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ FiniteField* GT = ctx->epid2_params->GT;
+ FfElement* e12 = (FfElement*)ctx->e12;
+ FfElement* e22 = (FfElement*)ctx->e22;
+ FfElement* e2w = (FfElement*)ctx->e2w;
+ FfElement* ea2 = (FfElement*)ctx->ea2;
+
+ sts = ReadFfElement(GT, &precomp->e12, sizeof(precomp->e12), e12);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(GT, &precomp->e22, sizeof(precomp->e22), e22);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(GT, &precomp->e2w, sizeof(precomp->e2w), e2w);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = ReadFfElement(GT, &precomp->ea2, sizeof(precomp->ea2), ea2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ return sts;
+}
diff --git a/epid/member/src/storage.c b/epid/member/src/storage.c
new file mode 100644
index 0000000..618faef
--- /dev/null
+++ b/epid/member/src/storage.c
@@ -0,0 +1,71 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief Member credentials storage helper API implementation.
+ */
+
+#include "epid/member/src/storage.h"
+
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/tpm2/nv.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus EpidNvWriteMembershipCredential(
+ Tpm2Ctx* ctx, GroupPubKey const* pub_key,
+ MembershipCredential const* credential, uint32_t nv_index) {
+ EpidStatus sts = kEpidErr;
+ uint8_t tmp;
+ if (!ctx || !pub_key || !credential) return kEpidBadArgErr;
+
+ do {
+ if (kEpidNoErr != Tpm2NvRead(ctx, nv_index, 1, 0, &tmp)) {
+ sts = Tpm2NvDefineSpace(ctx, nv_index,
+ sizeof(*pub_key) + sizeof(*credential));
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ sts = Tpm2NvWrite(ctx, nv_index, sizeof(*pub_key), 0, pub_key);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Tpm2NvWrite(ctx, nv_index, sizeof(*credential), sizeof(*pub_key),
+ credential);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ if (kEpidNoErr != sts) Tpm2NvUndefineSpace(ctx, nv_index);
+ EpidZeroMemory(&tmp, sizeof(tmp));
+ return sts;
+}
+
+EpidStatus EpidNvReadMembershipCredential(Tpm2Ctx* ctx, uint32_t nv_index,
+ GroupPubKey* pub_key,
+ MembershipCredential* credential) {
+ EpidStatus sts = kEpidErr;
+ if (!ctx || !pub_key || !credential) return kEpidBadArgErr;
+ do {
+ sts = Tpm2NvRead(ctx, nv_index, sizeof(*pub_key), 0, pub_key);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Tpm2NvRead(ctx, nv_index, sizeof(*credential), sizeof(*pub_key),
+ credential);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ return sts;
+}
diff --git a/epid/member/src/storage.h b/epid/member/src/storage.h
new file mode 100644
index 0000000..2db7a5c
--- /dev/null
+++ b/epid/member/src/storage.h
@@ -0,0 +1,72 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Member credentials storage helper API
+/*! \file */
+#ifndef EPID_MEMBER_SRC_STORAGE_H_
+#define EPID_MEMBER_SRC_STORAGE_H_
+
+#include <stdint.h>
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct GroupPubKey GroupPubKey;
+typedef struct MembershipCredential MembershipCredential;
+/// \endcond
+
+/// Write membership credential to TPM non-volatile memory.
+/*!
+Allocates TPM non volatile memory for nv_index for membership credentials.
+Write group public key and member private key parameters A and x into
+space allocated.
+
+\param[in] ctx
+The TPM context.
+\param[in] pub_key
+Group public key.
+\param[in] credential
+Membership credential.
+\param[in] nv_index
+Handle of the data area to be defined.
+
+\returns ::EpidStatus
+
+\see EpidNvReadMembershipCredential
+*/
+EpidStatus EpidNvWriteMembershipCredential(
+ Tpm2Ctx* ctx, GroupPubKey const* pub_key,
+ MembershipCredential const* credential, uint32_t nv_index);
+
+/// Read membership credential from TPM non-volatile memory.
+/*!
+\param[in] ctx
+The TPM context.
+\param[in] nv_index
+Handle of the data area.
+\param[out] pub_key
+Group public key.
+\param[out] credential
+Membership credential.
+
+\returns ::EpidStatus
+
+\see EpidNvWriteMembershipCredential
+*/
+EpidStatus EpidNvReadMembershipCredential(Tpm2Ctx* ctx, uint32_t nv_index,
+ GroupPubKey* pub_key,
+ MembershipCredential* credential);
+
+#endif // EPID_MEMBER_SRC_STORAGE_H_
diff --git a/epid/member/src/validatekey.c b/epid/member/src/validatekey.c
new file mode 100644
index 0000000..d7c5bd2
--- /dev/null
+++ b/epid/member/src/validatekey.c
@@ -0,0 +1,130 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Non-sensitive member context implementation
+/*! \file */
+
+#include "epid/member/src/validatekey.h"
+
+#include <stddef.h>
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/math/pairing.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h" // MemberPrecomp
+#include "epid/member/src/context.h"
+#include "epid/member/src/privateexp.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+bool EpidMemberIsKeyValid(MemberCtx* ctx, G1ElemStr const* A_str,
+ FpElemStr const* x_str, G1ElemStr const* h1_str,
+ G2ElemStr const* w_str) {
+ bool key_is_valid = false;
+ EcPoint* t1 = NULL;
+ EcPoint* t2 = NULL;
+ FfElement* t3 = NULL;
+ FfElement* t4 = NULL;
+ EcPoint* A = NULL;
+ EcPoint* h1 = NULL;
+ EcPoint* w = NULL;
+
+ if (!ctx || !A_str || !x_str || !h1_str || !w_str || !ctx->epid2_params) {
+ return false;
+ }
+
+ do {
+ EpidStatus sts = kEpidErr;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ EcGroup* G2 = ctx->epid2_params->G2;
+ FiniteField* GT = ctx->epid2_params->GT;
+ EcPoint* g1 = ctx->epid2_params->g1;
+ EcPoint* g2 = ctx->epid2_params->g2;
+ PairingState* ps_ctx = ctx->epid2_params->pairing_state;
+
+ if (!ctx->is_provisioned && !ctx->is_initially_provisioned) {
+ sts = EpidMemberInitialProvision(ctx);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ // 2. The member computes t1 = G2.sscmExp(g2, x).
+ sts = NewEcPoint(G2, &t1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = EcSscmExp(G2, g2, (BigNumStr const*)x_str, t1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 3. The member computes t1 = G2.mul(t1, w).
+ sts = NewEcPoint(G2, &w);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G2, w_str, sizeof(*w_str), w);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcMul(G2, t1, w, t1);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4. The member computes t3 = pairing(A, t1).
+ sts = NewFfElement(GT, &t3);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &A);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, A_str, sizeof(*A_str), A);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Pairing(ps_ctx, A, t1, t3);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 5. The member computes t2 = G1.sscmExp(h1, f).
+ sts = NewEcPoint(G1, &t2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &h1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, h1_str, sizeof(*h1_str), h1);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EpidPrivateExp(ctx, h1, t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 6. The member computes t2 = G1.mul(t2, g1).
+ sts = EcMul(G1, t2, g1, t2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // Step 7. The member computes t4 = pairing(t2, g2).
+ sts = NewFfElement(GT, &t4);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = Pairing(ps_ctx, t2, g2, t4);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 8. If GT.isEqual(t3, t4) = false, reports bad private key.
+ sts = FfIsEqual(GT, t3, t4, &key_is_valid);
+ if (kEpidNoErr != sts) {
+ key_is_valid = false;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ } while (0);
+
+ DeleteEcPoint(&t1);
+ DeleteEcPoint(&t2);
+ DeleteFfElement(&t3);
+ DeleteFfElement(&t4);
+ DeleteEcPoint(&A);
+ DeleteEcPoint(&h1);
+ DeleteEcPoint(&w);
+
+ return key_is_valid;
+}
diff --git a/epid/member/src/validatekey.h b/epid/member/src/validatekey.h
new file mode 100644
index 0000000..b7ff66e
--- /dev/null
+++ b/epid/member/src/validatekey.h
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Non-sensitive member context APIs
+/*! \file */
+
+#ifndef EPID_MEMBER_SRC_VALIDATEKEY_H_
+#define EPID_MEMBER_SRC_VALIDATEKEY_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct G1ElemStr G1ElemStr;
+typedef struct G2ElemStr G2ElemStr;
+typedef struct FpElemStr FpElemStr;
+/// \endcond
+
+/// Checks if provided parameters result in a valid key
+/*!
+
+
+ \param[in,out] ctx
+ The member context.
+
+ \param[in] A_str
+ The A value of the member private key.
+
+ \param[in] x_str
+ The x value of the member private key.
+
+ \param[in] h1_str
+ The h1 value of the group public key.
+
+ \param[in] w_str
+ The w value of the group public key.
+
+ \retval true
+ if the input values would result in a valid member private key
+
+ \retval false
+ if the input values would result in an invalid member private key
+
+ \see MemberCreate
+
+ */
+bool EpidMemberIsKeyValid(MemberCtx* ctx, G1ElemStr const* A_str,
+ FpElemStr const* x_str, G1ElemStr const* h1_str,
+ G2ElemStr const* w_str);
+
+#endif // EPID_MEMBER_SRC_VALIDATEKEY_H_
diff --git a/epid/member/src/write_precomp.c b/epid/member/src/write_precomp.c
new file mode 100644
index 0000000..bd36983
--- /dev/null
+++ b/epid/member/src/write_precomp.c
@@ -0,0 +1,36 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidMemberWritePrecomp implementation.
+/*! \file */
+#include "epid/member/src/write_precomp.h"
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "epid/member/src/context.h"
+
+EpidStatus EpidMemberWritePrecomp(MemberCtx const* ctx,
+ MemberPrecomp* precomp) {
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!precomp) {
+ return kEpidBadArgErr;
+ }
+
+ *precomp = ctx->precomp;
+ return kEpidNoErr;
+}
diff --git a/epid/member/src/write_precomp.h b/epid/member/src/write_precomp.h
new file mode 100644
index 0000000..9cf2b5b
--- /dev/null
+++ b/epid/member/src/write_precomp.h
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidMemberWritePrecomp interface.
+/*! \file */
+#ifndef EPID_MEMBER_SRC_WRITE_PRECOMP_H_
+#define EPID_MEMBER_SRC_WRITE_PRECOMP_H_
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct MemberPrecomp MemberPrecomp;
+/// \endcond
+
+/// Serializes the pre-computed member settings.
+/*!
+\param[in] ctx
+The member context.
+\param[out] precomp
+The Serialized pre-computed member settings.
+
+\returns ::EpidStatus
+
+\note
+If the result is not ::kEpidNoErr, the content of precomp is undefined.
+
+\b Example
+
+\ref UserManual_GeneratingAnIntelEpidSignature
+*/
+EpidStatus EpidMemberWritePrecomp(MemberCtx const* ctx, MemberPrecomp* precomp);
+
+#endif // EPID_MEMBER_SRC_WRITE_PRECOMP_H_
diff --git a/epid/member/tiny/math/efq.h b/epid/member/tiny/math/efq.h
new file mode 100644
index 0000000..f9805e1
--- /dev/null
+++ b/epid/member/tiny/math/efq.h
@@ -0,0 +1,254 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of EFq math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_EFQ_H_
+#define EPID_MEMBER_TINY_MATH_EFQ_H_
+#include <stddef.h>
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+
+/// \cond
+typedef struct EccPointFq EccPointFq;
+typedef struct EccPointJacobiFq EccPointJacobiFq;
+typedef struct FpElem FpElem;
+typedef struct FqElem FqElem;
+/// \endcond
+
+/// Multiply two points in EFq.
+/*!
+This function is mitigated against software side-channel
+attacks.
+
+\param[out] result of multiplying left and right.
+\param[in] base The first operand to be multiplied.
+\param[in] exp The second operand to be multiplied.
+*/
+void EFqMulSSCM(EccPointJacobiFq* result, EccPointJacobiFq const* base,
+ FpElem const* exp);
+
+/// Exponentiate a point in EFq by an element of Fp.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+
+\returns 1 on success, 0 on failure
+*/
+int EFqAffineExp(EccPointFq* result, EccPointFq const* base, FpElem const* exp);
+
+/// Sum the results of exponentiating two points in EFq by elements of Fp.
+/*!
+\param[out] result target.
+\param[in] base0 the first base.
+\param[in] exp0 the first exponent.
+\param[in] base1 the second base.
+\param[in] exp1 the second exponent.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqAffineMultiExp(EccPointFq* result, EccPointFq const* base0,
+ FpElem const* exp0, EccPointFq const* base1,
+ FpElem const* exp1);
+
+/// Sum the results of exponentiating two points in EFq by elements of Fp.
+/*!
+\param[out] result target.
+\param[in] base0 the first base.
+\param[in] exp0 the first exponent.
+\param[in] base1 the second base.
+\param[in] exp1 the second exponent.
+\returns 1 on success, 0 on failure
+*/
+void EFqMultiExp(EccPointJacobiFq* result, EccPointJacobiFq const* base0,
+ FpElem const* exp0, EccPointJacobiFq const* base1,
+ FpElem const* exp1);
+
+/// Add two points in EFq.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqAffineAdd(EccPointFq* result, EccPointFq const* left,
+ EccPointFq const* right);
+
+/// Double a point in EFq.
+/*!
+\param[out] result target.
+\param[in] in the value to double.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqAffineDbl(EccPointFq* result, EccPointFq const* in);
+
+/// Double a point in EFq.
+/*!
+\param[out] result target.
+\param[in] in the value to double.
+*/
+void EFqDbl(EccPointJacobiFq* result, EccPointJacobiFq const* in);
+
+/// Add two points in EFq.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void EFqAdd(EccPointJacobiFq* result, EccPointJacobiFq const* left,
+ EccPointJacobiFq const* right);
+
+/// Generate a random point in EFq.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqRand(EccPointFq* result, BitSupplier rnd_func, void* rnd_param);
+
+/// Set a point's value.
+/*!
+\param[out] result target.
+\param[in] x value to set.
+\param[in] y value to set.
+*/
+void EFqSet(EccPointJacobiFq* result, FqElem const* x, FqElem const* y);
+
+/// Test if a point is infinity.
+/*!
+\param[in] in the point to test.
+\returns A value different from zero (i.e., true) indeed
+ the value is infinity. Zero (i.e., false) otherwise.
+*/
+int EFqIsInf(EccPointJacobiFq const* in);
+
+/// Convert a point from Affine to Jacobi representation.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void EFqFromAffine(EccPointJacobiFq* result, EccPointFq const* in);
+
+/// Convert a point from Jacobi to Affine representation.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqToAffine(EccPointFq* result, EccPointJacobiFq const* in);
+
+/// Negate a point on EFq.
+/*!
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void EFqNeg(EccPointJacobiFq* result, EccPointJacobiFq const* in);
+
+/// Test if two points on EFq are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int EFqEq(EccPointJacobiFq const* left, EccPointJacobiFq const* right);
+
+/// Hashes an arbitrary message to a point on EFq.
+/*!
+\param[out] result target.
+\param[in] msg buffer to reinterpret.
+\param[in] len length of msg in bytes.
+\param[in] hashalg hash algorithm to use.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqHash(EccPointFq* result, unsigned char const* msg, size_t len,
+ HashAlg hashalg);
+
+/// Copy a point's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void EFqCp(EccPointFq* result, EccPointFq const* in);
+
+/// Test if two points on EFq are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int EFqEqAffine(EccPointFq const* left, EccPointFq const* right);
+
+/// Conditionally Set a point's value to one of two values.
+/*!
+\param[out] result target.
+\param[in] true_val value to set if condition is true.
+\param[in] false_val value to set if condition is false.
+\param[in] truth_val value of condition.
+*/
+void EFqCondSet(EccPointJacobiFq* result, EccPointJacobiFq const* true_val,
+ EccPointJacobiFq const* false_val, int truth_val);
+
+/// Copy a point's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void EFqJCp(EccPointJacobiFq* result, EccPointJacobiFq const* in);
+
+/// Set an element's value to infinity.
+/*!
+\param[out] result element to set.
+*/
+void EFqInf(EccPointJacobiFq* result);
+
+/// Test if a point is on EFq.
+/*!
+\param[in] in the point to test.
+\returns A value different from zero (i.e., true) indeed
+ the point is on the curve. Zero (i.e., false) otherwise.
+*/
+int EFqOnCurve(EccPointFq const* in);
+
+/// Test if a point is on EFq.
+/*!
+\param[in] in the point to test.
+\returns A value different from zero (i.e., true) indeed
+ the point is on the curve. Zero (i.e., false) otherwise.
+*/
+int EFqJOnCurve(EccPointJacobiFq const* in);
+
+/// Generate a random point in EFq.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int EFqJRand(EccPointJacobiFq* result, BitSupplier rnd_func, void* rnd_param);
+
+#endif // EPID_MEMBER_TINY_MATH_EFQ_H_
diff --git a/epid/member/tiny/math/efq2.h b/epid/member/tiny/math/efq2.h
new file mode 100644
index 0000000..ca9dcb6
--- /dev/null
+++ b/epid/member/tiny/math/efq2.h
@@ -0,0 +1,103 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of EFq2 math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_EFQ2_H_
+#define EPID_MEMBER_TINY_MATH_EFQ2_H_
+
+/// \cond
+typedef struct EccPointFq2 EccPointFq2;
+typedef struct EccPointJacobiFq2 EccPointJacobiFq2;
+typedef struct FpElem FpElem;
+/// \endcond
+
+/// Test if a point is infinity.
+/*!
+\param[in] in the point to test.
+\returns A value different from zero (i.e., true) indeed
+ the value is infinity. Zero (i.e., false) otherwise.
+*/
+int EFq2IsInf(EccPointJacobiFq2 const* in);
+
+/// Convert a point from Affine to Jacobi representation.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void EFq2FromAffine(EccPointJacobiFq2* result, EccPointFq2 const* in);
+
+/// Convert a point from Jacobi to Affine representation.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+\returns 1 on success, 0 on failure
+*/
+int EFq2ToAffine(EccPointFq2* result, EccPointJacobiFq2 const* in);
+
+/// Double a point in EFq2.
+/*!
+\param[out] result target.
+\param[in] in the value to double.
+*/
+void EFq2Dbl(EccPointJacobiFq2* result, EccPointJacobiFq2 const* in);
+
+/// Add two points in EFq2.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void EFq2Add(EccPointJacobiFq2* result, EccPointJacobiFq2 const* left,
+ EccPointJacobiFq2 const* right);
+
+/// Negate a point on EFq2.
+/*!
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void EFq2Neg(EccPointJacobiFq2* result, EccPointJacobiFq2 const* in);
+
+/// Multiply two points in EFq.
+/*!
+This function is mitigated against software side-channel
+attacks.
+
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void EFq2MulSSCM(EccPointJacobiFq2* result, EccPointJacobiFq2 const* left,
+ FpElem const* right);
+
+/// Test if two points on EFq2 are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int EFq2Eq(EccPointJacobiFq2 const* left, EccPointJacobiFq2 const* right);
+
+/// Test if a point is in EFq2.
+/*!
+\param[in] in the point to test.
+\returns A value different from zero (i.e., true) indeed
+ the point is on the curve. Zero (i.e., false) otherwise.
+*/
+int EFq2OnCurve(EccPointFq2 const* in);
+
+#endif // EPID_MEMBER_TINY_MATH_EFQ2_H_
diff --git a/epid/member/tiny/math/fp.h b/epid/member/tiny/math/fp.h
new file mode 100644
index 0000000..00820f5
--- /dev/null
+++ b/epid/member/tiny/math/fp.h
@@ -0,0 +1,135 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Fp math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_FP_H_
+#define EPID_MEMBER_TINY_MATH_FP_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/bitsupplier.h"
+
+/// \cond
+typedef struct FpElem FpElem;
+typedef struct VeryLargeInt VeryLargeInt;
+/// \endcond
+
+/// Test if an element is in Fp
+/*!
+\param[in] in the element to test
+\returns A value different from zero (i.e., true) indeed
+ the value is in the field. Zero (i.e., false) otherwise.
+*/
+int FpInField(FpElem const* in);
+
+/// Add two elements of Fp
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void FpAdd(FpElem* result, FpElem const* left, FpElem const* right);
+
+/// Multiply two elements of Fp.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void FpMul(FpElem* result, FpElem const* left, FpElem const* right);
+
+/// Subtract two elements of Fp.
+/*!
+\param[out] result of subtracting left from right.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+*/
+void FpSub(FpElem* result, FpElem const* left, FpElem const* right);
+
+/// Exponentiate an element of Fp by a large integer.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+*/
+void FpExp(FpElem* result, FpElem const* base, VeryLargeInt const* exp);
+
+/// Negate an element of Fp.
+/*!
+\param[out] result target.
+\param[in] in the value to negate.
+*/
+void FpNeg(FpElem* result, FpElem const* in);
+
+/// Test if two elements in Fp are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int FpEq(FpElem const* left, FpElem const* right);
+
+/// Invert an element of Fp.
+/*!
+\param[out] result target.
+\param[in] in the value to invert.
+*/
+void FpInv(FpElem* result, FpElem const* in);
+
+/// Generate a random element of Fp.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int FpRand(FpElem* result, BitSupplier rnd_func, void* rnd_param);
+
+/// Generate a non-zero random element of Fp.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int FpRandNonzero(FpElem* result, BitSupplier rnd_func, void* rnd_param);
+
+/// Clear an element of Fp.
+/*!
+\param[out] result value to clear.
+*/
+void FpClear(FpElem* result);
+
+/// Set a element of Fp's value.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void FpSet(FpElem* result, uint32_t in);
+
+/// Reinterpret a buffer as an element of Fp
+/*!
+\param[out] result target.
+\param[in] hash buffer to reinterpret.
+\param[in] len length of hash in bytes.
+*/
+void FpFromHash(FpElem* result, unsigned char const* hash, size_t len);
+
+#endif // EPID_MEMBER_TINY_MATH_FP_H_
diff --git a/epid/member/tiny/math/fq.h b/epid/member/tiny/math/fq.h
new file mode 100644
index 0000000..a813c41
--- /dev/null
+++ b/epid/member/tiny/math/fq.h
@@ -0,0 +1,168 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Fq math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_FQ_H_
+#define EPID_MEMBER_TINY_MATH_FQ_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/bitsupplier.h"
+
+/// \cond
+typedef struct FqElem FqElem;
+typedef struct VeryLargeInt VeryLargeInt;
+/// \endcond
+
+/// Test if an element is in Fq.
+/*!
+\param[in] in the element to test.
+\returns A value different from zero (i.e., true) indeed
+ the value is in the field. Zero (i.e., false) otherwise.
+*/
+int FqInField(FqElem const* in);
+
+/// Add two elements of Fq.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void FqAdd(FqElem* result, FqElem const* left, FqElem const* right);
+
+/// Subtract two elements of Fq.
+/*!
+\param[out] result of subtracting left from right.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+*/
+void FqSub(FqElem* result, FqElem const* left, FqElem const* right);
+
+/// Multiply two elements of Fq.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void FqMul(FqElem* result, FqElem const* left, FqElem const* right);
+
+/// Exponentiate an element of Fq by a large integer.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+*/
+void FqExp(FqElem* result, FqElem const* base, VeryLargeInt const* exp);
+
+/// Copy an element's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void FqCp(FqElem* result, FqElem const* in);
+
+/// Test if an element is zero.
+/*!
+\param[in] value the element to test.
+\returns A value different from zero (i.e., true) if indeed
+ the value is zero. Zero (i.e., false) otherwise.
+*/
+int FqIsZero(FqElem const* value);
+
+/// Invert an element of Fq.
+/*!
+\param[out] result the inverse of the element.
+\param[in] in the element to invert.
+*/
+void FqInv(FqElem* result, FqElem const* in);
+
+/// Negate an element of Fq.
+/*!
+This function was formerly called as FqConst.
+
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void FqNeg(FqElem* result, FqElem const* in);
+
+/// Square an element of Fq.
+/*!
+\param[out] result the square of the element.
+\param[in] in the element to square.
+*/
+void FqSquare(FqElem* result, FqElem const* in);
+
+/// Clear an element's value.
+/*!
+\param[out] result element to clear.
+*/
+void FqClear(FqElem* result);
+
+/// Set an element's value.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void FqSet(FqElem* result, uint32_t in);
+
+/// Test if two elements in Fq are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int FqEq(FqElem const* left, FqElem const* right);
+
+/// Conditionally Set an element's value to one of two values.
+/*!
+\param[out] result target.
+\param[in] true_val value to set if condition is true.
+\param[in] false_val value to set if condition is false.
+\param[in] truth_val value of condition.
+*/
+void FqCondSet(FqElem* result, FqElem const* true_val, FqElem const* false_val,
+ int truth_val);
+
+/// Compute the Square root of an element of Fq.
+/*!
+\param[out] result the square root of the element.
+\param[in] in the element to find the square root of.
+\returns A value different from zero (i.e., true) if the square root
+ exists. Zero (i.e., false) otherwise.
+*/
+int FqSqrt(FqElem* result, FqElem const* in);
+
+/// Generate a random element of Fq.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int FqRand(FqElem* result, BitSupplier rnd_func, void* rnd_param);
+
+/// Reinterpret a buffer as an element of Fq
+/*!
+\param[out] result target.
+\param[in] hash buffer to reinterpret.
+\param[in] len length of hash in bytes.
+*/
+void FqFromHash(FqElem* result, unsigned char const* hash, size_t len);
+
+#endif // EPID_MEMBER_TINY_MATH_FQ_H_
diff --git a/epid/member/tiny/math/fq12.h b/epid/member/tiny/math/fq12.h
new file mode 100644
index 0000000..861596e
--- /dev/null
+++ b/epid/member/tiny/math/fq12.h
@@ -0,0 +1,165 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Fq12 math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_FQ12_H_
+#define EPID_MEMBER_TINY_MATH_FQ12_H_
+
+#include <stdint.h>
+
+/// \cond
+typedef struct Fq12Elem Fq12Elem;
+typedef struct VeryLargeInt VeryLargeInt;
+/// \endcond
+
+/// Add two elements of Fq12.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void Fq12Add(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right);
+
+/// Subtract two elements of Fq12.
+/*!
+\param[out] result of subtracting left from right.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+*/
+void Fq12Sub(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right);
+
+/// Square an element of Fq12.
+/*!
+\param[out] result the square of the element.
+\param[in] in the element to square.
+*/
+void Fq12Square(Fq12Elem* result, Fq12Elem const* in);
+
+/// Multiply two elements of Fq12.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void Fq12Mul(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right);
+
+/// Invert an element of Fq12.
+/*!
+\param[out] result the inverse of the element.
+\param[in] in the element to invert.
+*/
+void Fq12Inv(Fq12Elem* result, Fq12Elem const* in);
+
+/// Negate an element of Fq12.
+/*!
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void Fq12Neg(Fq12Elem* result, Fq12Elem const* in);
+
+/// Set an element's value.
+/*!
+\param[out] result target.
+\param[in] val value to set.
+*/
+void Fq12Set(Fq12Elem* result, uint32_t val);
+
+/// Exponentiate an element of Fq12 by a large integer.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+*/
+void Fq12Exp(Fq12Elem* result, Fq12Elem const* base, VeryLargeInt const* exp);
+
+/// Multiply of exponentiation of elements of Fq12 by a large integers.
+/*!
+\param[out] result target.
+\param[in] base0 the base.
+\param[in] exp0 the exponent.
+\param[in] base1 the base.
+\param[in] exp1 the exponent.
+\param[in] base2 the base.
+\param[in] exp2 the exponent.
+\param[in] base3 the base.
+\param[in] exp3 the exponent.
+*/
+void Fq12MultiExp(Fq12Elem* result, Fq12Elem const* base0,
+ VeryLargeInt const* exp0, Fq12Elem const* base1,
+ VeryLargeInt const* exp1, Fq12Elem const* base2,
+ VeryLargeInt const* exp2, Fq12Elem const* base3,
+ VeryLargeInt const* exp3);
+
+/// Test if two elements in Fq12 are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int Fq12Eq(Fq12Elem const* left, Fq12Elem const* right);
+
+/// Calculate the conjugate of an element of Fq2.
+/*!
+\param[out] result the conjugate of the element.
+\param[in] in the element.
+*/
+void Fq12Conj(Fq12Elem* result, Fq12Elem const* in);
+
+/// Calculate the cyclotomic exponentiation of an element of Fq12
+/// by another element of Fq12.
+/*!
+\param[in,out] result the base of the exponentiation. This will
+ receive the result.
+\param[in] in the exponent.
+\param[in] t pairing parameter t
+*/
+void Fq12ExpCyc(Fq12Elem* result, Fq12Elem const* in, VeryLargeInt const* t);
+
+/// Calculate the cyclotomic square of an element of fq12.
+/*!
+\param[in,out] result result of the cyclotomic square.
+\param[in] in the base.
+*/
+void Fq12SqCyc(Fq12Elem* result, Fq12Elem const* in);
+
+/// Multiply two elements of Fq12.
+/*!
+Requires that b[2] = b[4] = b[5] = 0.
+where right = ((b[0], b[2], b[4]), (b[1], b[3], b[5]))
+
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void Fq12MulSpecial(Fq12Elem* result, Fq12Elem const* left,
+ Fq12Elem const* right);
+
+/// Copy an element's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void Fq12Cp(Fq12Elem* result, Fq12Elem const* in);
+
+/// Clear an element's value.
+/*!
+\param[out] result element to clear.
+*/
+void Fq12Clear(Fq12Elem* result);
+
+#endif // EPID_MEMBER_TINY_MATH_FQ12_H_
diff --git a/epid/member/tiny/math/fq2.h b/epid/member/tiny/math/fq2.h
new file mode 100644
index 0000000..02efb71
--- /dev/null
+++ b/epid/member/tiny/math/fq2.h
@@ -0,0 +1,155 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Fq2 math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_FQ2_H_
+#define EPID_MEMBER_TINY_MATH_FQ2_H_
+
+#include <stdint.h>
+
+/// \cond
+typedef struct Fq2Elem Fq2Elem;
+typedef struct FqElem FqElem;
+typedef struct VeryLargeInt VeryLargeInt;
+/// \endcond
+
+/// Copy an element's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void Fq2Cp(Fq2Elem* result, Fq2Elem const* in);
+
+/// Set an element's value.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void Fq2Set(Fq2Elem* result, uint32_t in);
+
+/// Clear an element's value.
+/*!
+\param[out] result element to clear.
+*/
+void Fq2Clear(Fq2Elem* result);
+
+/// Add two elements of Fq2.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void Fq2Add(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right);
+
+/// Exponentiate an element of Fq2 by a large integer.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+*/
+void Fq2Exp(Fq2Elem* result, Fq2Elem const* base, VeryLargeInt const* exp);
+
+/// Subtract two elements of Fq2.
+/*!
+\param[out] result of subtracting left from right.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+*/
+void Fq2Sub(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right);
+
+/// Multiply two elements of Fq2.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void Fq2Mul(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right);
+
+/// Invert an element of Fq2.
+/*!
+\param[out] result the inverse of the element.
+\param[in] in the element to invert.
+*/
+void Fq2Inv(Fq2Elem* result, Fq2Elem const* in);
+
+/// Negate an element of Fq2.
+/*!
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void Fq2Neg(Fq2Elem* result, Fq2Elem const* in);
+
+/// Calculate the conjugate of an element of Fq2.
+/*!
+\param[out] result the conjugate of the element.
+\param[in] in the element.
+*/
+void Fq2Conj(Fq2Elem* result, Fq2Elem const* in);
+
+/// Square an element of Fq2.
+/*!
+\param[out] result the square of the element.
+\param[in] in the element to square.
+*/
+void Fq2Square(Fq2Elem* result, Fq2Elem const* in);
+
+/// Multiply an element of Fq2 by and element of Fq.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void Fq2MulScalar(Fq2Elem* result, Fq2Elem const* left, FqElem const* right);
+
+/// Conditionally Set an element's value to one of two values.
+/*!
+\param[out] result target.
+\param[in] true_val value to set if condition is true.
+\param[in] false_val value to set if condition is false.
+\param[in] truth_val value of condition.
+*/
+void Fq2CondSet(Fq2Elem* result, Fq2Elem const* true_val,
+ Fq2Elem const* false_val, int truth_val);
+
+/// Test if two elements in Fq2 are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int Fq2Eq(Fq2Elem const* left, Fq2Elem const* right);
+
+/// Multiply an element of Fq2 by xi.
+/*!
+This function was formerly called as Fq2Const.
+
+\param[out] result of multiplying in by xi.
+\param[in] in The first operand to be multiplied.
+
+*/
+void Fq2MulXi(Fq2Elem* result, Fq2Elem const* in);
+
+/// Test if an element is zero.
+/*!
+\param[in] value the element to test.
+\returns A value different from zero (i.e., true) if indeed
+ the value is zero. Zero (i.e., false) otherwise.
+*/
+int Fq2IsZero(Fq2Elem const* value);
+
+#endif // EPID_MEMBER_TINY_MATH_FQ2_H_
diff --git a/epid/member/tiny/math/fq6.h b/epid/member/tiny/math/fq6.h
new file mode 100644
index 0000000..72901dd
--- /dev/null
+++ b/epid/member/tiny/math/fq6.h
@@ -0,0 +1,137 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Fq6 math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_FQ6_H_
+#define EPID_MEMBER_TINY_MATH_FQ6_H_
+#include <stdint.h>
+
+/// \cond
+typedef struct Fq2Elem Fq2Elem;
+typedef struct Fq6Elem Fq6Elem;
+/// \endcond
+
+/// Add two elements of Fq6.
+/*!
+\param[out] result of adding left and right.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+*/
+void Fq6Add(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right);
+
+/// Subtract two elements of Fq6.
+/*!
+\param[out] result of subtracting left from right.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+*/
+void Fq6Sub(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right);
+
+/// Multiply two elements of Fq6.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void Fq6Mul(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right);
+
+/// Invert an element of Fq6.
+/*!
+\param[out] result the inverse of the element.
+\param[in] in the element to invert.
+*/
+void Fq6Inv(Fq6Elem* result, Fq6Elem const* in);
+
+/// Negate an element of Fq6.
+/*!
+\param[out] result the negative of the element.
+\param[in] in the element to negate.
+*/
+void Fq6Neg(Fq6Elem* result, Fq6Elem const* in);
+
+/// Clear an element's value.
+/*!
+\param[out] result element to clear.
+*/
+void Fq6Clear(Fq6Elem* result);
+
+/// Multiply an element of Fq6 by and element of Fq2.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] in The first operand to be multiplied.
+\param[in] scalar The second operand to be multiplied.
+*/
+void Fq6MulScalar(Fq6Elem* result, Fq6Elem const* in, Fq2Elem const* scalar);
+
+/// Multiply an element of Fq6 by V.
+/*!
+This function was formerly called as Fq2Const.
+
+\param[out] result of multiplying in and V.
+\param[in] in The first operand to be multiplied.
+*/
+void Fq6MulV(Fq6Elem* result, Fq6Elem const* in);
+
+/// Test if two elements in Fq6 are equal
+/*!
+\param[in] left The first operand to be tested.
+\param[in] right The second operand to be tested.
+\returns A value different from zero (i.e., true) if indeed
+ the values are equal. Zero (i.e., false) otherwise.
+*/
+int Fq6Eq(Fq6Elem const* left, Fq6Elem const* right);
+
+/// Test if an element is zero.
+/*!
+\param[in] in the element to test.
+\returns A value different from zero (i.e., true) if indeed
+ the value is zero. Zero (i.e., false) otherwise.
+*/
+int Fq6IsZero(Fq6Elem const* in);
+
+/// Square an element of Fq6.
+/*!
+\param[out] result the square of the element.
+\param[in] in the element to square.
+*/
+void Fq6Square(Fq6Elem* result, Fq6Elem const* in);
+
+/// Copy an element's value
+/*!
+\param[out] result copy target.
+\param[in] in copy source.
+*/
+void Fq6Cp(Fq6Elem* result, Fq6Elem const* in);
+
+/// Conditionally Set an element's value to one of two values.
+/*!
+\param[out] result target.
+\param[in] true_val value to set if condition is true.
+\param[in] false_val value to set if condition is false.
+\param[in] truth_val value of condition.
+*/
+void Fq6CondSet(Fq6Elem* result, Fq6Elem const* true_val,
+ Fq6Elem const* false_val, int truth_val);
+
+/// Set an element's value.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void Fq6Set(Fq6Elem* result, uint32_t in);
+
+#endif // EPID_MEMBER_TINY_MATH_FQ6_H_
diff --git a/epid/member/tiny/math/hashwrap.h b/epid/member/tiny/math/hashwrap.h
new file mode 100644
index 0000000..bbba01a
--- /dev/null
+++ b/epid/member/tiny/math/hashwrap.h
@@ -0,0 +1,109 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+#ifndef EPID_MEMBER_TINY_MATH_HASHWRAP_H_
+#define EPID_MEMBER_TINY_MATH_HASHWRAP_H_
+/// Decleration of hash wrap function
+/*! \file */
+#include <stddef.h>
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+#define SHA512_SUPPORT
+#define SHA256_SUPPORT
+
+#ifdef SHA512_SUPPORT
+#include "epid/member/tiny/math/sha512.h"
+#endif
+
+#ifdef SHA256_SUPPORT
+#include "epid/member/tiny/math/sha256.h"
+#endif
+
+/// Sha Digest Element
+typedef union sha_digest {
+#ifdef SHA512_SUPPORT
+ uint8_t sha512_digest[SHA512_DIGEST_SIZE]; ///< Support digest for sha512
+#endif
+#ifdef SHA256_SUPPORT
+ uint8_t sha256_digest[SHA256_DIGEST_SIZE]; ///< Support digest for sha256
+#endif
+ uint8_t digest[1]; ///< Pointer to digest
+} sha_digest;
+
+/// Tiny Sha wrapper Element
+typedef struct tiny_sha {
+ union {
+#ifdef SHA512_SUPPORT
+ sha512_state sha512s; ///< The state of sha512 if supported
+#endif
+#ifdef SHA256_SUPPORT
+ sha256_state sha256s; ///< The state of sha256 if supported
+#endif
+ } sha_state_t; ///< Store state of hash algorithm
+ HashAlg hash_alg; ///< The hash algorithem which selected
+} tiny_sha;
+
+/// Initializes the hash state
+/*!
+
+\param[in] sha_type
+Type of hash algorithm
+
+\param[in,out] s
+The hash state to initialize.
+*/
+void tinysha_init(HashAlg sha_type, tiny_sha* s);
+
+/// Hashes data into state using a chosen hash algorithm
+/*!
+
+\param[in,out] s
+The hash state. Must be non-null or behavior is undefined.
+
+\param[in] data
+The data to hash into s.
+
+\param[in] data_length
+The size of data in bytes.
+
+
+*/
+void tinysha_update(tiny_sha* s, void const* data, size_t data_length);
+
+/// Computes the hash algorithm in the digest buffer
+/*!
+
+\param[out] digest
+The computed digest. Must be non-null or behavior is undefined.
+
+\param[in] s
+The hash state. Must be non-null or behavior is undefined.
+*/
+void tinysha_final(unsigned char* digest, tiny_sha* s);
+
+/// Returns size of digest depending on hash algorithm
+/*!
+
+\param[in] s
+The hash state. Must be non-null or behavior is undefined.
+
+\returns
+Size of digest
+
+*/
+size_t tinysha_digest_size(tiny_sha* s);
+
+#endif // EPID_MEMBER_TINY_MATH_HASHWRAP_H_
diff --git a/epid/member/tiny/math/math.parts b/epid/member/tiny/math/math.parts
new file mode 100644
index 0000000..ff17e73
--- /dev/null
+++ b/epid/member/tiny/math/math.parts
@@ -0,0 +1,51 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build configuration for tiny math library.
+"""
+Import('*')
+env.PartName('math')
+
+env.DependsOn([
+ Component('member.tiny_stdlib'),
+ Component('tinycommon', requires=REQ.HEADERS)
+])
+
+include_files = Pattern(src_dir='.',
+ includes=['*.h'],
+ recursive=False).files()
+
+src_files = Pattern(src_dir='src',
+ includes=['*.c'],
+ recursive=False).files()
+
+env.Append(CPPPATH='#')
+
+outputs = env.Library('${PART_SHORT_NAME}', src_files)
+
+sdk_outs = env.Sdk(outputs)
+env.SdkInclude(include_files, sub_dir='${PART_SHORT_NAME}')
+
+if 'install_lib' in env['MODE'] and 'shared' not in env['MODE']:
+ env.InstallLib(outputs)
+
+is_utest_build = False
+for i in BUILD_TARGETS:
+ if "utest::" in str(i):
+ is_utest_build = True
+if is_utest_build:
+ env.Part(parts_file='unittests/utest.parts',
+ CONFIG=DefaultEnvironment().subst('$CONFIG'))
diff --git a/epid/member/tiny/math/mathdefs.h b/epid/member/tiny/math/mathdefs.h
new file mode 100644
index 0000000..0331cf9
--- /dev/null
+++ b/epid/member/tiny/math/mathdefs.h
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Common public definitions for math headers
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_MATHDEFS_H_
+#define EPID_MEMBER_TINY_MATH_MATHDEFS_H_
+
+/// Return code representing failure of math function
+#define MATH_FAIL 0
+/// Return code representing success of math function
+#define MATH_SUCCESS 1
+
+#endif // EPID_MEMBER_TINY_MATH_MATHDEFS_H_
diff --git a/epid/member/tiny/math/mathtypes.h b/epid/member/tiny/math/mathtypes.h
new file mode 100644
index 0000000..5ea1a49
--- /dev/null
+++ b/epid/member/tiny/math/mathtypes.h
@@ -0,0 +1,101 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of math types in tiny Intel(R) EPID.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_MATHTYPES_H_
+#define EPID_MEMBER_TINY_MATH_MATHTYPES_H_
+
+/// number of 32bit words in a very large integer
+#define NUM_ECC_DIGITS 8
+
+#include <stdint.h>
+
+/// Large integer.
+/*!
+VeryLargeInt* is always expected to point to a buffer
+with NUM_ECC_DIGITS uint32_t sized words.
+*/
+typedef struct VeryLargeInt {
+ uint32_t word[NUM_ECC_DIGITS]; ///< Large integer data
+} VeryLargeInt;
+
+/// Used for multiplication
+typedef struct VeryLargeIntProduct {
+ uint32_t word[2 * NUM_ECC_DIGITS]; ///< Large integer data
+} VeryLargeIntProduct;
+
+/// Element of Fp.
+typedef struct FpElem {
+ VeryLargeInt limbs; ///< An integer in [0, p-1]
+} FpElem;
+
+/// Element of Fq.
+typedef struct FqElem {
+ VeryLargeInt limbs; ///< An integer in [0, q-1]
+} FqElem;
+
+/// Element of Fq2.
+typedef struct Fq2Elem {
+ FqElem x0; ///< A coefficent in Fq
+ FqElem x1; ///< A coefficent in Fq
+} Fq2Elem;
+
+/// Point in EFq.
+typedef struct EccPointFq {
+ FqElem x; ///< x coordinate
+ FqElem y; ///< y coordinate
+} EccPointFq;
+
+/// Point in EFq2.
+typedef struct EccPointFq2 {
+ Fq2Elem x; ///< x coordinate
+ Fq2Elem y; ///< y coordinate
+} EccPointFq2;
+
+/// Element of Fq6.
+typedef struct Fq6Elem {
+ Fq2Elem y0; ///< A coefficent in Fq2
+ Fq2Elem y1; ///< A coefficent in Fq2
+ Fq2Elem y2; ///< A coefficent in Fq2
+} Fq6Elem;
+
+/// Element of Fq12.
+typedef struct Fq12Elem {
+ Fq6Elem z0; ///< A coefficent in Fq6
+ Fq6Elem z1; ///< A coefficent in Fq6
+} Fq12Elem;
+
+/// Element of EFq in Jacobi format.
+typedef struct EccPointJacobiFq {
+ FqElem X; ///< x coordinate
+ FqElem Y; ///< y coordinate
+ FqElem Z; ///< z coordinate
+} EccPointJacobiFq;
+
+/// Element of EFq2 in Jacobi format.
+typedef struct EccPointJacobiFq2 {
+ Fq2Elem X; ///< x coordinate
+ Fq2Elem Y; ///< y coordinate
+ Fq2Elem Z; ///< z coordinate
+} EccPointJacobiFq2;
+
+/// A scratch buffer for stateful pairing calls.
+typedef struct PairingState {
+ Fq2Elem g[3][5]; ///< pairing scratch data
+} PairingState;
+
+#endif // EPID_MEMBER_TINY_MATH_MATHTYPES_H_
diff --git a/epid/member/tiny/math/pairing.h b/epid/member/tiny/math/pairing.h
new file mode 100644
index 0000000..a8a6de6
--- /dev/null
+++ b/epid/member/tiny/math/pairing.h
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Definition of pairing math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_PAIRING_H_
+#define EPID_MEMBER_TINY_MATH_PAIRING_H_
+/*!
+ * \file
+ * \brief Tiny portable implementations of standard library functions
+ */
+/// \cond
+typedef struct Fq12Elem Fq12Elem;
+typedef struct EccPointFq EccPointFq;
+typedef struct EccPointFq2 EccPointFq2;
+typedef struct PairingState PairingState;
+/// \endcond
+
+/// Initializes pairing environment.
+/*!
+\param[out] state pairing state information.
+*/
+void PairingInit(PairingState* state);
+
+/// Computes a pairing according to the Optimal Ate pairing computation
+/*!
+\param[out] d target, an element in GT.
+\param[in] P an element in G1.
+\param[in] Q an element in G2.
+\param[in,out] state pairing state information.
+*/
+void PairingCompute(Fq12Elem* d, EccPointFq const* P, EccPointFq2 const* Q,
+ PairingState const* state);
+
+#endif // EPID_MEMBER_TINY_MATH_PAIRING_H_
diff --git a/epid/member/tiny/math/serialize.h b/epid/member/tiny/math/serialize.h
new file mode 100644
index 0000000..6008f3c
--- /dev/null
+++ b/epid/member/tiny/math/serialize.h
@@ -0,0 +1,183 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of de/serialize functionality.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_SERIALIZE_H_
+#define EPID_MEMBER_TINY_MATH_SERIALIZE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+/// \cond
+typedef struct OctStr32 OctStr32;
+
+typedef struct VeryLargeInt VeryLargeInt;
+typedef struct BigNumStr BigNumStr;
+
+typedef struct FqElem FqElem;
+typedef struct FqElemStr FqElemStr;
+
+typedef struct FpElem FpElem;
+typedef struct FpElemStr FpElemStr;
+
+typedef struct EccPointFq EccPointFq;
+typedef struct G1ElemStr G1ElemStr;
+
+typedef struct EccPointFq2 EccPointFq2;
+typedef struct G2ElemStr G2ElemStr;
+
+typedef struct Fq12Elem Fq12Elem;
+typedef struct Fq12ElemStr Fq12ElemStr;
+/// \endcond
+
+#if !defined(UNOPTIMIZED_SERIALIZATION)
+
+/// Serialize or deserailize a sequence of math objects
+/*!
+Converts layouts between native and portable or between portable and
+native of the following types: VeryLargeInt and BigNumStr,
+FqElem and FqElemStr, FpElem and FpElemStr, EccPointFq and G1ElemStr,
+Fq12Elem and Fq12ElemStr.
+
+If input contain multiple values of supported types all will be converted.
+
+\note The following types are not supported: VeryLargeIntProduct.
+
+\note This function have the assumptions that the input structures are packed
+such that consequent 32 byte fields would have no gap in between.
+
+\param[out] dest target buffer
+\param [in] dest_size size of dest buffer
+\param [in] src source data
+\param [in] src_size size of src buffer
+*/
+void SwapNativeAndPortableLayout(void* dest, size_t dest_size, void const* src,
+ size_t src_size);
+#endif // !defined(UNOPTIMIZED_SERIALIZATION)
+
+/// Write a uint32_t to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* Uint32Serialize(OctStr32* dest, uint32_t src);
+
+/// Read a uint32_t from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* Uint32Deserialize(uint32_t* dest, OctStr32 const* src);
+
+/// Write a large integer to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* VliSerialize(BigNumStr* dest, VeryLargeInt const* src);
+
+/// Read a large integer from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* VliDeserialize(VeryLargeInt* dest, BigNumStr const* src);
+
+/// Write an element of Fq to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* FqSerialize(FqElemStr* dest, FqElem const* src);
+
+/// Read an element of Fq from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* FqDeserialize(FqElem* dest, FqElemStr const* src);
+
+/// Write an element of Fq12 to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* Fq12Serialize(Fq12ElemStr* dest, Fq12Elem const* src);
+
+/// Read an element of Fq12 from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* Fq12Deserialize(Fq12Elem* dest, Fq12ElemStr const* src);
+
+/// Write an element of Fp to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* FpSerialize(FpElemStr* dest, FpElem const* src);
+
+/// Read an element of Fp from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* FpDeserialize(FpElem* dest, FpElemStr const* src);
+
+/// Write a point on EFq to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* EFqSerialize(G1ElemStr* dest, EccPointFq const* src);
+
+/// Read a point on EFq from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* EFqDeserialize(EccPointFq* dest, G1ElemStr const* src);
+
+/// Write a point on EFq2 to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data written to dest
+*/
+void* EFq2Serialize(G2ElemStr* dest, EccPointFq2 const* src);
+
+/// Read a point on EFq2 from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\returns pointer to next byte after final data read from to src
+*/
+void const* EFq2Deserialize(EccPointFq2* dest, G2ElemStr const* src);
+
+#endif // EPID_MEMBER_TINY_MATH_SERIALIZE_H_
diff --git a/epid/member/tiny/math/sha256.h b/epid/member/tiny/math/sha256.h
new file mode 100644
index 0000000..0c1e7cc
--- /dev/null
+++ b/epid/member/tiny/math/sha256.h
@@ -0,0 +1,133 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a SHA-256 implementation.
+ *
+ * Overview: SHA-256 is a NIST approved cryptographic hashing algorithm
+ * specified in FIPS 180. A hash algorithm maps data of arbitrary
+ * size to data of fixed length.
+ *
+ * Security: SHA-256 provides 128 bits of security against collision attacks
+ * and 256 bits of security against pre-image attacks. SHA-256 does
+ * NOT behave like a random oracle, but it can be used as one if
+ * the string being hashed is prefix-free encoded before hashing.
+ *
+ * Usage: 1) call tc_sha256_init to initialize a struct
+ * tc_sha256_state_struct before hashing a new string.
+ *
+ * 2) call tc_sha256_update to hash the next string segment;
+ * tc_sha256_update can be called as many times as needed to hash
+ * all of the segments of a string; the order is important.
+ *
+ * 3) call tc_sha256_final to out put the digest from a hashing
+ * operation.
+ */
+
+#ifndef EPID_MEMBER_TINY_MATH_SHA256_H_
+#define EPID_MEMBER_TINY_MATH_SHA256_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/// Block size
+#define SHA256_BLOCK_SIZE (64)
+/// Digest size
+#define SHA256_DIGEST_SIZE (32)
+/// Number of blocks in state
+#define SHA256_STATE_BLOCKS (SHA256_DIGEST_SIZE / 4)
+
+/// The SHA state
+/// \cond
+typedef struct sha256_state {
+ unsigned int iv[SHA256_STATE_BLOCKS];
+ uint64_t bits_hashed;
+ uint8_t leftover[SHA256_BLOCK_SIZE];
+ size_t leftover_offset;
+} sha256_state;
+/// \endcond
+
+/**
+ * @brief SHA256 initialization procedure
+ * Initializes s
+ * @param s Sha256 state struct
+ */
+void tc_sha256_init(sha256_state* s);
+
+/**
+ * @brief SHA256 update procedure
+ * Hashes data_length bytes addressed by data into state s
+
+ * @note Assumes s has been initialized by tc_sha256_init
+ * @warning The state buffer 'leftover' is left in memory after processing
+ * If your application intends to have sensitive data in this
+ * buffer, remind to erase it after the data has been processed
+ * @param s Sha256 state struct
+ * @param data message to hash
+ * @param datalen length of message to hash
+ */
+void tc_sha256_update(sha256_state* s, const uint8_t* data, size_t datalen);
+
+/**
+ * @brief SHA256 final procedure
+ * Inserts the completed hash computation into digest
+ * @return returns 1
+ * returns 0 if:
+ * s == NULL,
+ * s->iv == NULL,
+ * digest == NULL
+ * @note Assumes: s has been initialized by tc_sha256_init
+ * digest points to at least SHA256_DIGEST_SIZE bytes
+ * @warning The state buffer 'leftover' is left in memory after processing
+ * If your application intends to have sensitive data in this
+ * buffer, remind to erase it after the data has been processed
+ * @param digest unsigned eight bit integer
+ * @param s Sha256 state struct
+ */
+void tc_sha256_final(uint8_t* digest, sha256_state* s);
+
+#endif // EPID_MEMBER_TINY_MATH_SHA256_H_
diff --git a/epid/member/tiny/math/sha512.h b/epid/member/tiny/math/sha512.h
new file mode 100644
index 0000000..8aa152b
--- /dev/null
+++ b/epid/member/tiny/math/sha512.h
@@ -0,0 +1,89 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Interface to a SHA-512 implementation.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_SHA512_H_
+#define EPID_MEMBER_TINY_MATH_SHA512_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/// block size
+#define SHA512_BLOCK_SIZE (128)
+/// digest size
+#define SHA512_DIGEST_SIZE (64)
+/// number of words in SHA state
+#define SHA512_DIGEST_WORDS (8)
+
+/// The SHA state
+/// \cond
+typedef struct sha512_state {
+ uint64_t iv[SHA512_DIGEST_WORDS];
+ uint64_t bits_hashed_low;
+ uint64_t bits_hashed_high;
+ unsigned char leftover[SHA512_BLOCK_SIZE];
+ unsigned int leftover_offset;
+} sha512_state;
+/// \endcond
+
+/// Initializes the hash state
+/*!
+
+ \param[in,out] s
+ The hash state to initialize.
+ */
+void tinysha512_init(sha512_state* s);
+
+/// Hashes data into state using SHA-512
+/*!
+
+ \warning
+ The state buffer 'leftover' is left in memory after processing. If
+ your application intends to have sensitive data in this buffer,
+ remember to erase it after the data has been processed
+
+ \param[in,out] s
+ The hash state. Must be non-null or behavior is undefined.
+
+ \param[in] data
+ The data to hash into s.
+
+ \param[in] data_length
+ The size of data in bytes.
+ */
+void tinysha512_update(sha512_state* s, void const* data, size_t data_length);
+
+/// Computes the SHA-512 hash in the digest buffer
+/*!
+
+ \note Assumes SHA512_DIGEST_SIZE bytes are available to accept the
+ digest.
+
+ \warning
+ The state buffer 'leftover' is left in memory after processing. If
+ your application intends to have sensitive data in this buffer,
+ remember to erase it after the data has been processed
+
+ \param[out] digest
+ The computed digest. Must be non-null or behavior is undefined.
+
+ \param[in] s
+ The hash state. Must be non-null or behavior is undefined.
+ */
+void tinysha512_final(unsigned char* digest, sha512_state* s);
+
+#endif // EPID_MEMBER_TINY_MATH_SHA512_H_
diff --git a/epid/member/tiny/math/src/efq.c b/epid/member/tiny/math/src/efq.c
new file mode 100644
index 0000000..90867dc
--- /dev/null
+++ b/epid/member/tiny/math/src/efq.c
@@ -0,0 +1,412 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of EFq math
+/*! \file */
+
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/hashwrap.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static int EFqMakePoint(EccPointFq* output, FqElem* in) {
+ FqElem fq_sqrt = {0};
+ FqElem fq_tmp = {0};
+ FqSet(&fq_tmp, 3);
+ FqSquare(&fq_sqrt, in);
+ FqMul(&fq_sqrt, &fq_sqrt, in);
+ FqAdd(&fq_sqrt, &fq_sqrt, &fq_tmp);
+ if (!FqSqrt(&output->y, &fq_sqrt)) {
+ return 0;
+ }
+ FqCp(&output->x, in);
+
+ return 1;
+}
+
+void EFqMulSSCM(EccPointJacobiFq* result, EccPointJacobiFq const* base,
+ FpElem const* exp) {
+ EccPointJacobiFq efqj_1;
+ EccPointJacobiFq efqj_2;
+
+ uint32_t position;
+ EFqInf(&efqj_1);
+ EFqJCp(&efqj_2, base);
+ for (position = 32 * NUM_ECC_DIGITS; position > 0; --position) {
+ EFqDbl(&efqj_1, &efqj_1);
+ EFqAdd(&efqj_2, base, &efqj_1);
+ EFqCondSet(&efqj_1, &efqj_2, &efqj_1,
+ VliTestBit(&(exp->limbs), position - 1));
+ }
+ EFqJCp(result, &efqj_1);
+}
+
+int EFqAffineExp(EccPointFq* result, EccPointFq const* base,
+ FpElem const* exp) {
+ EccPointJacobiFq efqj;
+ EFqFromAffine(&efqj, base);
+ EFqMulSSCM(&efqj, &efqj, exp);
+ return EFqToAffine(result, &efqj);
+}
+
+int EFqAffineMultiExp(EccPointFq* result, EccPointFq const* base0,
+ FpElem const* exp0, EccPointFq const* base1,
+ FpElem const* exp1) {
+ EccPointJacobiFq efqj_base0;
+ EccPointJacobiFq efqj_base1;
+ EFqFromAffine(&efqj_base0, base0);
+ EFqFromAffine(&efqj_base1, base1);
+ EFqMultiExp(&efqj_base0, &efqj_base0, exp0, &efqj_base1, exp1);
+ return EFqToAffine(result, &efqj_base0);
+}
+
+void EFqMultiExp(EccPointJacobiFq* result, EccPointJacobiFq const* base0,
+ FpElem const* exp0, EccPointJacobiFq const* base1,
+ FpElem const* exp1) {
+ EccPointJacobiFq efqj_base0;
+ EccPointJacobiFq efqj_a;
+ EccPointJacobiFq efqj_b;
+ int i, j;
+
+ EFqAdd(&efqj_base0, base0, base1);
+ EFqInf(&efqj_a);
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
+ for (j = 31; j >= 0; j--) {
+ EFqAdd(&efqj_a, &efqj_a, &efqj_a);
+ EFqInf(&efqj_b);
+ EFqJCp(&efqj_b, base0);
+
+ EFqCondSet(&efqj_b, base1, &efqj_b,
+ (int)((exp1->limbs.word[i] >> j) & (0x1)));
+
+ EFqCondSet(&efqj_b, &efqj_base0, &efqj_b,
+ (int)((exp0->limbs.word[i] >> j) & (exp1->limbs.word[i] >> j) &
+ (0x1)));
+
+ EFqAdd(&efqj_b, &efqj_a, &efqj_b);
+
+ EFqCondSet(&efqj_a, &efqj_b, &efqj_a, (int)(((exp0->limbs.word[i] >> j) |
+ (exp1->limbs.word[i] >> j)) &
+ (0x1)));
+ }
+ }
+ EFqJCp(result, &efqj_a);
+}
+
+int EFqAffineAdd(EccPointFq* result, EccPointFq const* left,
+ EccPointFq const* right) {
+ EccPointJacobiFq efqj_a;
+ EccPointJacobiFq efqj_b;
+ if (EFqEqAffine(left, right)) return EFqAffineDbl(result, left);
+
+ EFqFromAffine(&efqj_a, left);
+ EFqFromAffine(&efqj_b, right);
+ EFqAdd(&efqj_a, &efqj_a, &efqj_b);
+
+ return EFqToAffine(result, &efqj_a);
+}
+
+int EFqAffineDbl(EccPointFq* result, EccPointFq const* in) {
+ EccPointJacobiFq efqj_a;
+ EFqFromAffine(&efqj_a, in);
+ EFqAdd(&efqj_a, &efqj_a, &efqj_a);
+
+ return EFqToAffine(result, &efqj_a);
+}
+
+void EFqDbl(EccPointJacobiFq* result, EccPointJacobiFq const* in) {
+ FqElem fq_a;
+ FqElem fq_b;
+
+ FqAdd(&(result->Z), &(in->Z), &(in->Z));
+ FqMul(&(result->Z), &(result->Z), &(in->Y));
+ FqSquare(&fq_a, &(in->X));
+ FqAdd(&fq_b, &fq_a, &fq_a);
+ FqAdd(&fq_b, &fq_b, &fq_a);
+ FqSquare(&fq_a, &(in->Y));
+ FqAdd(&fq_a, &fq_a, &fq_a);
+ FqSquare(&(result->Y), &fq_a);
+ FqAdd(&(result->Y), &(result->Y), &(result->Y));
+ FqAdd(&fq_a, &fq_a, &fq_a);
+ FqMul(&fq_a, &fq_a, &(in->X));
+ FqSquare(&(result->X), &fq_b);
+ FqSub(&(result->X), &(result->X), &fq_a);
+ FqSub(&(result->X), &(result->X), &fq_a);
+ FqSub(&fq_a, &fq_a, &(result->X));
+ FqMul(&fq_a, &fq_a, &fq_b);
+ FqSub(&(result->Y), &fq_a, &(result->Y));
+}
+
+void EFqAdd(EccPointJacobiFq* result, EccPointJacobiFq const* left,
+ EccPointJacobiFq const* right) {
+ FqElem fq0;
+ FqElem fq1;
+ FqElem fq2;
+ FqElem fq3;
+ FqElem fq4;
+ FqElem fq5;
+
+ if (FqIsZero(&(left->Z))) {
+ EFqJCp(result, right);
+ return;
+ }
+ if (FqIsZero(&(right->Z))) {
+ EFqJCp(result, left);
+ return;
+ }
+
+ FqSquare(&fq2, &(right->Z));
+ FqSquare(&fq3, &(left->Z));
+ // P.X * Q.Z^2
+ FqMul(&fq0, &(left->X), &fq2);
+ // Q.X * P.Z^2
+ FqMul(&fq1, &(right->X), &fq3);
+ // Q.X*P.Z^2 - P*X+Q*Z^2
+ FqSub(&fq5, &fq1, &fq0);
+ FqMul(&fq3, &(right->Y), &fq3);
+ // P.Y * Q.Z^3
+ FqMul(&fq3, &(left->Z), &fq3);
+ FqMul(&fq2, &(left->Y), &fq2);
+ // Q.Y * P.Z^3
+ FqMul(&fq2, &(right->Z), &fq2);
+ FqSub(&fq4, &fq3, &fq2);
+
+ if (FqIsZero(&fq5)) {
+ if (FqIsZero(&fq4)) {
+ EFqDbl(result, left);
+ return;
+ } else {
+ EFqInf(result);
+ return;
+ }
+ }
+ FqMul(&(result->Z), &(left->Z), &(right->Z));
+ FqMul(&(result->Z), &(result->Z), &fq5);
+ // Q.X*P.Z^2 + P*X+Q*Z^2
+ FqAdd(&fq1, &fq0, &fq1);
+ FqMul(&fq2, &fq2, &fq5);
+ FqSquare(&fq5, &fq5);
+ FqMul(&fq1, &fq1, &fq5);
+ FqSquare(&(result->X), &fq4);
+ FqSub(&(result->X), &(result->X), &fq1);
+ FqMul(&fq2, &fq2, &fq5);
+ FqMul(&fq0, &fq0, &fq5);
+ FqSub(&fq0, &fq0, &(result->X));
+ FqMul(&(result->Y), &fq4, &fq0);
+ FqSub(&(result->Y), &(result->Y), &fq2);
+}
+
+int EFqRand(EccPointFq* result, BitSupplier rnd_func, void* rnd_param) {
+ FqElem fq;
+ do {
+ if (!FqRand(&fq, rnd_func, rnd_param)) {
+ return 0;
+ }
+ } while (!EFqMakePoint(result, &fq));
+ return 1;
+}
+
+void EFqSet(EccPointJacobiFq* result, FqElem const* x, FqElem const* y) {
+ FqCp(&result->X, x);
+ FqCp(&result->Y, y);
+ FqSet(&result->Z, 1);
+}
+
+int EFqIsInf(EccPointJacobiFq const* in) {
+ return FqIsZero(&in->X) && FqIsZero(&in->Z) && (!FqIsZero(&in->Y));
+}
+
+void EFqFromAffine(EccPointJacobiFq* result, EccPointFq const* in) {
+ FqCp(&result->X, &in->x);
+ FqCp(&result->Y, &in->y);
+ FqSet(&result->Z, 1);
+}
+
+int EFqToAffine(EccPointFq* result, EccPointJacobiFq const* in) {
+ FqElem fq_inv;
+ if (EFqIsInf(in)) {
+ return 0;
+ }
+ FqInv(&fq_inv, &in->Z);
+ FqMul(&result->x, &in->X, &fq_inv);
+ FqMul(&result->x, &result->x, &fq_inv);
+ FqMul(&result->y, &in->Y, &fq_inv);
+ FqMul(&result->y, &result->y, &fq_inv);
+ FqMul(&result->y, &result->y, &fq_inv);
+
+ return 1;
+}
+
+void EFqNeg(EccPointJacobiFq* result, EccPointJacobiFq const* in) {
+ FqCp(&result->X, &in->X);
+ FqNeg(&result->Y, &in->Y);
+ FqCp(&result->Z, &in->Z);
+}
+
+int EFqEq(EccPointJacobiFq const* left, EccPointJacobiFq const* right) {
+ FqElem fq1;
+ FqElem fq2;
+ FqElem fq3;
+ FqElem fq4;
+ if (EFqIsInf(left) && EFqIsInf(right)) {
+ return 1;
+ }
+ if (EFqIsInf(left) || EFqIsInf(right)) {
+ return 0;
+ }
+ // Z1^2
+ FqSquare(&fq1, &left->Z);
+ // Z2^2
+ FqSquare(&fq2, &right->Z);
+ // (Z1^2)*X2
+ FqMul(&fq3, &fq1, &right->X);
+ // (Z2^2)*X1
+ FqMul(&fq4, &fq2, &left->X);
+ // Z1^3
+ FqMul(&fq1, &fq1, &left->Z);
+ // Z2^3
+ FqMul(&fq2, &fq2, &right->Z);
+ // (Z1^3)*Y2
+ FqMul(&fq1, &fq1, &right->Y);
+ // (Z2^3)*Y1
+ FqMul(&fq2, &fq2, &left->Y);
+ // (Z1^2)*X2 == (Z2^2)*X1 && (Z1^3)*Y2 == (Z2^3)*Y1
+ return FqEq(&fq1, &fq2) && FqEq(&fq3, &fq4);
+}
+
+int EFqHash(EccPointFq* result, unsigned char const* msg, size_t len,
+ HashAlg hashalg) {
+ tiny_sha hash_context;
+ FqElem three;
+ FqElem tmp;
+ uint32_t hash_salt = 0;
+ uint32_t buf = 0;
+ sha_digest hash_buf;
+ // 1/q in Fq
+ FqElem montgomery_r = {
+ 0x512ccfed, 0x2cd6d224, 0xed67f57d, 0xf3239a04,
+ 0x118e5b60, 0xb91a0da1, 0x00030f32, 0,
+ };
+ if ((kSha512 != hashalg) && (kSha256 != hashalg)) {
+ return 0;
+ }
+ FqSet(&three, 3);
+
+ for (hash_salt = 0; hash_salt < 0xFFFFFFFF; ++hash_salt) {
+ tinysha_init(hashalg, &hash_context);
+
+ Uint32Serialize((OctStr32*)&buf, hash_salt);
+ tinysha_update(&hash_context, &buf, sizeof(buf));
+ tinysha_update(&hash_context, msg, len);
+
+ tinysha_final(hash_buf.digest, &hash_context);
+
+ FqFromHash(&result->x, hash_buf.digest, tinysha_digest_size(&hash_context));
+ FqSquare(&tmp, &result->x);
+ FqMul(&tmp, &tmp, &result->x);
+ FqAdd(&tmp, &tmp, &three);
+ if (FqSqrt(&result->y, &tmp)) {
+ FqNeg(&tmp, &result->y);
+ // Verify and Non-tiny member use montgomery representation to determine
+ // if negation is needed: this is to be compatible with them
+ FqMul(&montgomery_r, &result->y, &montgomery_r);
+ FqCondSet(&result->y, &tmp, &result->y, montgomery_r.limbs.word[0] & 1);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void EFqCp(EccPointFq* result, EccPointFq const* in) {
+ FqCp(&result->x, &in->x);
+ FqCp(&result->y, &in->y);
+}
+
+int EFqEqAffine(EccPointFq const* left, EccPointFq const* right) {
+ return FqEq(&left->x, &right->x) && FqEq(&left->y, &right->y);
+}
+
+void EFqCondSet(EccPointJacobiFq* result, EccPointJacobiFq const* true_val,
+ EccPointJacobiFq const* false_val, int truth_val) {
+ FqCondSet(&result->X, &true_val->X, &false_val->X, truth_val);
+ FqCondSet(&result->Y, &true_val->Y, &false_val->Y, truth_val);
+ FqCondSet(&result->Z, &true_val->Z, &false_val->Z, truth_val);
+}
+
+void EFqJCp(EccPointJacobiFq* result, EccPointJacobiFq const* in) {
+ FqCp(&result->X, &in->X);
+ FqCp(&result->Y, &in->Y);
+ FqCp(&result->Z, &in->Z);
+}
+
+void EFqInf(EccPointJacobiFq* result) {
+ FqSet(&result->X, 0);
+ FqSet(&result->Y, 1);
+ FqSet(&result->Z, 0);
+}
+
+int EFqOnCurve(EccPointFq const* in) {
+ // test that Y^2 mod q == (X^3 + a*Z^4*X + b*Z^6) mod q
+ // This simplifies to: Y^2 mod q == (X^3 + 3) mod q
+ // since: Z = 1
+ // a = 0
+ // b = 3
+ FqElem t1;
+ FqElem t2;
+ FqSquare(&t1, &in->x);
+ FqMul(&t2, &in->x, &t1);
+ FqSquare(&t1, &in->y);
+ FqSub(&t1, &t1, &t2);
+ t1.limbs.word[0] -= 3; // check equal to curve b
+ // this operation will not always
+ // result in the same value as T1 - 3
+ // however it will always result in a correct
+ // value for the zero check below
+ return FqIsZero(&t1);
+}
+
+int EFqJOnCurve(EccPointJacobiFq const* in) {
+ FqElem fq1;
+ FqElem fq2;
+
+ FqSquare(&fq1, &in->Z);
+ FqSquare(&fq2, &fq1);
+ FqMul(&fq2, &fq2, &fq1); // T2 = Z^6
+ FqAdd(&fq1, &fq2, &fq2);
+ FqAdd(&fq1, &fq1, &fq2); // T1 = 3 * Z^6
+ FqSquare(&fq2, &in->X);
+ FqMul(&fq2, &fq2, &in->X); // T2 = X^3
+ FqAdd(&fq1, &fq1, &fq2); // T1 = X^3 + 3 Z^6
+ FqSquare(&fq2, &in->Y);
+ FqMul(&fq1, &fq1, &in->Z);
+ FqMul(&fq2, &fq2, &in->Z);
+ return FqEq(&fq1, &fq2); // check Y^2 = X^3 + 3 Z^6
+}
+
+int EFqJRand(EccPointJacobiFq* result, BitSupplier rnd_func, void* rnd_param) {
+ FqElem fq;
+ do {
+ if (!FqRand(&fq, rnd_func, rnd_param)) {
+ return 0;
+ }
+ } while (!EFqMakePoint((EccPointFq*)result, &fq));
+
+ FqSet(&result->Z, 1);
+
+ return 1;
+}
diff --git a/epid/member/tiny/math/src/efq2.c b/epid/member/tiny/math/src/efq2.c
new file mode 100644
index 0000000..80c66fe
--- /dev/null
+++ b/epid/member/tiny/math/src/efq2.c
@@ -0,0 +1,253 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of EFq2 math
+/*! \file */
+
+#include "epid/member/tiny/math/efq2.h"
+
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/fq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/vli.h"
+
+static void EFq2CondSet(EccPointJacobiFq2* result,
+ EccPointJacobiFq2 const* true_val,
+ EccPointJacobiFq2 const* false_val, int truth_val) {
+ Fq2CondSet(&result->X, &true_val->X, &false_val->X, truth_val);
+ Fq2CondSet(&result->Y, &true_val->Y, &false_val->Y, truth_val);
+ Fq2CondSet(&result->Z, &true_val->Z, &false_val->Z, truth_val);
+}
+
+static void EFq2Cp(EccPointJacobiFq2* result, EccPointJacobiFq2 const* in) {
+ Fq2Cp(&result->X, &in->X);
+ Fq2Cp(&result->Y, &in->Y);
+ Fq2Cp(&result->Z, &in->Z);
+}
+
+static void EFq2Inf(EccPointJacobiFq2* result) {
+ Fq2Set(&result->X, 0);
+ Fq2Set(&result->Y, 1);
+ Fq2Set(&result->Z, 0);
+}
+
+int EFq2IsInf(EccPointJacobiFq2 const* in) {
+ return Fq2IsZero(&in->X) && Fq2IsZero(&in->Z) && (!Fq2IsZero(&in->Y));
+}
+
+void EFq2FromAffine(EccPointJacobiFq2* result, EccPointFq2 const* in) {
+ Fq2Cp(&result->X, &in->x);
+ Fq2Cp(&result->Y, &in->y);
+ Fq2Set(&result->Z, 1);
+}
+
+int EFq2ToAffine(EccPointFq2* result, EccPointJacobiFq2 const* in) {
+ Fq2Elem inverted_z;
+ if (EFq2IsInf(in)) {
+ return 0;
+ }
+ Fq2Inv(&inverted_z, &in->Z);
+ Fq2Mul(&result->x, &in->X, &inverted_z);
+ Fq2Mul(&result->x, &result->x, &inverted_z);
+ Fq2Mul(&result->y, &in->Y, &inverted_z);
+ Fq2Mul(&result->y, &result->y, &inverted_z);
+ Fq2Mul(&result->y, &result->y, &inverted_z);
+ return 1;
+}
+
+void EFq2Dbl(EccPointJacobiFq2* result, EccPointJacobiFq2 const* in) {
+ Fq2Elem a;
+ Fq2Elem b;
+ // Z3 = 2Z1
+ Fq2Add(&(result->Z), &(in->Z), &(in->Z));
+ // Z3 = 2*Z1*Y1
+ Fq2Mul(&(result->Z), &(result->Z), &(in->Y));
+ // A = X1^2
+ Fq2Square(&a, &(in->X));
+ // B = 2(X1^2)
+ Fq2Add(&b, &a, &a);
+ // B = 3(X1^2)
+ Fq2Add(&b, &b, &a);
+ // A = Y1^2
+ Fq2Square(&a, &(in->Y));
+ // A = 2*(Y1^2)
+ Fq2Add(&a, &a, &a);
+ // Y3 = 4*(Y1^4)
+ Fq2Square(&(result->Y), &a);
+ // Y3 = 8*(Y1^4)
+ Fq2Add(&(result->Y), &(result->Y), &(result->Y));
+ // A = 4(Y1^2)
+ Fq2Add(&a, &a, &a);
+ // A = 4(Y1^2)*X1
+ Fq2Mul(&a, &a, &(in->X));
+ // X3 = B^2
+ Fq2Square(&(result->X), &b);
+ // X3 = (B^2) - A
+ Fq2Sub(&(result->X), &(result->X), &a);
+ // X3 = (B^2) - 2A
+ Fq2Sub(&(result->X), &(result->X), &a);
+ // A = A - X3
+ Fq2Sub(&a, &a, &(result->X));
+ // A = B*(A-X3)
+ Fq2Mul(&a, &a, &b);
+ // Y3 = B*(A-X3) - 8*(Y1^4)
+ Fq2Sub(&(result->Y), &a, &(result->Y));
+}
+
+void EFq2Add(EccPointJacobiFq2* result, EccPointJacobiFq2 const* left,
+ EccPointJacobiFq2 const* right) {
+ Fq2Elem A;
+ Fq2Elem B;
+ Fq2Elem C;
+ Fq2Elem D;
+ Fq2Elem W;
+ Fq2Elem V;
+
+ if (Fq2IsZero(&left->Z)) {
+ // If P = O, set R = Q and return
+ EFq2Cp(result, right);
+ return;
+ }
+ if (Fq2IsZero(&right->Z)) {
+ // If Q = O, set R = P and return.
+ EFq2Cp(result, left);
+ return;
+ }
+ // A = P.X * Q.Z^2
+ Fq2Square(&C, &right->Z);
+ Fq2Mul(&A, &left->X, &C);
+ // B = Q.X * P.Z^2
+ Fq2Square(&D, &left->Z);
+ Fq2Mul(&B, &right->X, &D);
+ // C = P.Y * Q.Z^3
+ Fq2Mul(&C, &right->Z, &C);
+ Fq2Mul(&C, &left->Y, &C);
+ // D = Q.Y * P.Z^3
+ Fq2Mul(&D, &left->Z, &D);
+ Fq2Mul(&D, &right->Y, &D);
+ // W = B - A
+ Fq2Sub(&W, &B, &A);
+ // V = D - C
+ Fq2Sub(&V, &D, &C);
+ if (Fq2IsZero(&W)) {
+ if (Fq2IsZero(&V)) {
+ EFq2Dbl(result, left);
+ return;
+ } else {
+ EFq2Inf(result);
+ return;
+ }
+ }
+ // R.Z = P.Z * Q.Z * W
+ Fq2Mul(&result->Z, &left->Z, &right->Z);
+ Fq2Mul(&result->Z, &result->Z, &W);
+ // R.X = V^2 - (A + B) * W^2
+ Fq2Square(&result->X, &V);
+ Fq2Add(&B, &A, &B);
+ // Before squaring W save (C * W) to use in compitation of R.Y
+ Fq2Mul(&C, &C, &W);
+ Fq2Square(&W, &W);
+ Fq2Mul(&B, &B, &W);
+ Fq2Sub(&result->X, &result->X, &B);
+ // R.Y = V * (A * W^2 - R.X) - C * W^3
+ Fq2Mul(&A, &A, &W);
+ Fq2Sub(&A, &A, &result->X);
+ Fq2Mul(&result->Y, &V, &A);
+ Fq2Mul(&C, &C, &W);
+ Fq2Sub(&result->Y, &result->Y, &C);
+}
+
+void EFq2Neg(EccPointJacobiFq2* result, EccPointJacobiFq2 const* in) {
+ Fq2Cp(&result->X, &in->X);
+ Fq2Neg(&result->Y, &in->Y);
+ Fq2Cp(&result->Z, &in->Z);
+}
+
+void EFq2MulSSCM(EccPointJacobiFq2* result, EccPointJacobiFq2 const* left,
+ FpElem const* right) {
+ int position;
+ EccPointJacobiFq2 nv;
+ EccPointJacobiFq2 mv;
+ EFq2Inf(&nv);
+ EFq2Cp(&mv, left);
+ for (position = 32 * NUM_ECC_DIGITS - 1; position >= 0; position--) {
+ EFq2Dbl(&nv, &nv);
+ EFq2Add(&mv, left, &nv);
+ EFq2CondSet(&nv, &mv, &nv,
+ (int)(VliTestBit(&right->limbs, (uint32_t)position)));
+ }
+ EFq2Cp(result, &nv);
+}
+
+int EFq2Eq(EccPointJacobiFq2 const* left, EccPointJacobiFq2 const* right) {
+ Fq2Elem t1;
+ Fq2Elem t2;
+ Fq2Elem t3;
+ Fq2Elem t4;
+
+ if (EFq2IsInf(left) && EFq2IsInf(right)) {
+ return 1;
+ }
+ // if either left or right equals to inf return 0
+ if (EFq2IsInf(left) || EFq2IsInf(right)) {
+ return 0;
+ }
+ Fq2Square(&t1, &(left->Z));
+ Fq2Square(&t2, &(right->Z));
+ Fq2Mul(&t3, &t1, &(right->X));
+ Fq2Mul(&t4, &t2, &(left->X));
+ Fq2Mul(&t1, &t1, &(left->Z));
+ Fq2Mul(&t2, &t2, &(right->Z));
+ Fq2Mul(&t1, &t1, &(right->Y));
+ Fq2Mul(&t2, &t2, &(left->Y));
+ return Fq2Eq(&t1, &t2) && Fq2Eq(&t3, &t4);
+}
+
+int EFq2OnCurve(EccPointFq2 const* in) {
+ // test that Y^2 mod q == (X^3 + a*Z^4*X + b'*Z^6) mod q
+ // This simplifies to: Y^2 mod q == (X^3 + b') mod q
+ // since: Z = 1
+ // a = 0
+ // b = 3
+ Fq2Elem t1;
+ Fq2Elem t2;
+ FqElem three;
+ // Fq2xi
+ Fq2Elem bp = {{{{0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000}}},
+ {{{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000}}}};
+ Fq2Elem const* x = &in->x;
+ Fq2Elem const* y = &in->y;
+
+ // b' = b * inv(x1)
+ FqSet(&three, 3);
+ Fq2Inv(&bp, &bp);
+ Fq2MulScalar(&bp, &bp, &three);
+
+ // set t2 = X^3
+ Fq2Square(&t1, x);
+ Fq2Mul(&t2, x, &t1);
+ // set t2 = X^3 + b'
+ Fq2Add(&t2, &t2, &bp);
+
+ // set t1 = Y^2
+ Fq2Square(&t1, y);
+
+ // set t1 = Y^2 - (X^3 + b')
+ Fq2Sub(&t1, &t1, &t2);
+ // return if t1 is zero
+ return Fq2IsZero(&t1);
+}
diff --git a/epid/member/tiny/math/src/fp.c b/epid/member/tiny/math/src/fp.c
new file mode 100644
index 0000000..a785122
--- /dev/null
+++ b/epid/member/tiny/math/src/fp.c
@@ -0,0 +1,120 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Fp math
+/*! \file */
+
+#include "epid/member/tiny/math/fp.h"
+
+#include <limits.h> // for CHAR_BIT
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+/// A security parameter. In this version of Intel(R) EPID SDK, slen = 128
+#define EPID_SLEN 128
+/// buffer size of random integer t in INT32
+#define RAND_NUM_WORDS \
+ ((sizeof(FpElem) + EPID_SLEN / CHAR_BIT) / sizeof(uint32_t))
+
+static VeryLargeInt const epid20_p = {{0xD10B500D, 0xF62D536C, 0x1299921A,
+ 0x0CDC65FB, 0xEE71A49E, 0x46E5F25E,
+ 0xFFFCF0CD, 0xFFFFFFFF}};
+static FpElem const one = {{{1, 0, 0, 0, 0, 0, 0, 0}}};
+static VeryLargeInt const p_minus_one = {{0xD10B500C, 0xF62D536C, 0x1299921A,
+ 0x0CDC65FB, 0xEE71A49E, 0x46E5F25E,
+ 0xFFFCF0CD, 0xFFFFFFFF}};
+
+int FpInField(FpElem const* in) { return (VliCmp(&in->limbs, &epid20_p) < 0); }
+
+void FpAdd(FpElem* result, FpElem const* left, FpElem const* right) {
+ VliModAdd(&result->limbs, &left->limbs, &right->limbs, &epid20_p);
+}
+
+void FpMul(FpElem* result, FpElem const* left, FpElem const* right) {
+ VliModMul(&result->limbs, &left->limbs, &right->limbs, &epid20_p);
+}
+
+void FpSub(FpElem* result, FpElem const* left, FpElem const* right) {
+ VliModSub(&result->limbs, &left->limbs, &right->limbs, &epid20_p);
+}
+
+void FpExp(FpElem* result, FpElem const* base, VeryLargeInt const* exp) {
+ VliModExp(&result->limbs, &base->limbs, exp, &epid20_p);
+}
+
+void FpNeg(FpElem* result, FpElem const* in) {
+ VliCondSet(&result->limbs, &epid20_p, &in->limbs, VliIsZero(&in->limbs));
+ VliSub(&result->limbs, &epid20_p, &result->limbs);
+}
+
+int FpEq(FpElem const* left, FpElem const* right) {
+ return (VliCmp(&left->limbs, &right->limbs) == 0);
+}
+
+void FpInv(FpElem* result, FpElem const* in) {
+ VliModInv(&result->limbs, &in->limbs, &epid20_p);
+}
+
+int FpRand(FpElem* result, BitSupplier rnd_func, void* rnd_param) {
+ VeryLargeIntProduct deserialized_t = {{0}};
+ uint32_t t[RAND_NUM_WORDS] = {0};
+ OctStr32 const* src = (OctStr32 const*)t;
+
+ int i;
+ if (rnd_func(t, sizeof(FpElem) * CHAR_BIT + EPID_SLEN, rnd_param)) {
+ return 0;
+ }
+ for (i = RAND_NUM_WORDS - 1; i >= 0; i--) {
+ src = Uint32Deserialize(deserialized_t.word + i, src);
+ }
+ VliModBarrett(&result->limbs, &deserialized_t, &epid20_p);
+ return 1;
+}
+
+int FpRandNonzero(FpElem* result, BitSupplier rnd_func, void* rnd_param) {
+ VeryLargeIntProduct deserialized_t = {{0}};
+ uint32_t t[RAND_NUM_WORDS] = {0};
+ OctStr32 const* src = (OctStr32 const*)t;
+ int i;
+ if (rnd_func(t, sizeof(FpElem) * CHAR_BIT + EPID_SLEN, rnd_param)) {
+ return 0;
+ }
+ for (i = RAND_NUM_WORDS - 1; i >= 0; i--) {
+ src = Uint32Deserialize(deserialized_t.word + i, src);
+ }
+ VliModBarrett(&result->limbs, &deserialized_t, &p_minus_one);
+ // (t mod(p-1)) + 1 gives number in [1,p-1]
+ FpAdd(result, result, &one);
+ return 1;
+}
+
+void FpClear(FpElem* result) { VliClear(&result->limbs); }
+
+void FpSet(FpElem* result, uint32_t in) {
+ FpClear(result);
+ *(uint32_t*)(result->limbs.word) = in;
+}
+
+void FpFromHash(FpElem* result, unsigned char const* hash, size_t len) {
+ size_t i;
+ VeryLargeIntProduct vli;
+ memset(&vli, 0, sizeof(vli));
+ for (i = 0; i < len; i++) {
+ ((uint8_t*)vli.word)[len - i - 1] = hash[i];
+ }
+ VliModBarrett(&result->limbs, &vli, &epid20_p);
+}
diff --git a/epid/member/tiny/math/src/fq.c b/epid/member/tiny/math/src/fq.c
new file mode 100644
index 0000000..33a7367
--- /dev/null
+++ b/epid/member/tiny/math/src/fq.c
@@ -0,0 +1,126 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Fq math
+/*! \file */
+
+#include "epid/member/tiny/math/fq.h"
+
+#include <limits.h> // for CHAR_BIT
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+/// A security parameter. In this version of Intel(R) EPID SDK, slen = 128
+#define EPID_SLEN 128
+/// buffer size of random integer t in INT32
+#define RAND_NUM_WORDS \
+ ((sizeof(FpElem) + EPID_SLEN / CHAR_BIT) / sizeof(uint32_t))
+
+static VeryLargeInt const epid20_q = {{0xAED33013, 0xD3292DDB, 0x12980A82,
+ 0x0CDC65FB, 0xEE71A49F, 0x46E5F25E,
+ 0xFFFCF0CD, 0xFFFFFFFF}};
+
+int FqInField(FqElem const* in) { return (VliCmp(&in->limbs, &epid20_q) < 0); }
+
+void FqAdd(FqElem* result, FqElem const* left, FqElem const* right) {
+ VliModAdd(&result->limbs, &left->limbs, &right->limbs, &epid20_q);
+}
+
+void FqSub(FqElem* result, FqElem const* left, FqElem const* right) {
+ VliModSub(&result->limbs, &left->limbs, &right->limbs, &epid20_q);
+}
+
+void FqMul(FqElem* result, FqElem const* left, FqElem const* right) {
+ VliModMul(&result->limbs, &left->limbs, &right->limbs, &epid20_q);
+}
+
+void FqExp(FqElem* result, FqElem const* base, VeryLargeInt const* exp) {
+ VliModExp(&result->limbs, &base->limbs, exp, &epid20_q);
+}
+
+void FqCp(FqElem* result, FqElem const* in) {
+ VliSet(&result->limbs, &in->limbs);
+}
+
+int FqIsZero(FqElem const* value) { return VliIsZero(&value->limbs); }
+
+void FqInv(FqElem* result, FqElem const* in) {
+ VliModInv(&result->limbs, &in->limbs, &epid20_q);
+}
+
+void FqNeg(FqElem* result, FqElem const* in) {
+ VliCondSet(&result->limbs, &epid20_q, &in->limbs, VliIsZero(&in->limbs));
+ VliSub(&result->limbs, &epid20_q, &result->limbs);
+}
+
+void FqSquare(FqElem* result, FqElem const* in) {
+ VliModSquare(&result->limbs, &in->limbs, &epid20_q);
+}
+
+void FqClear(FqElem* result) { VliClear(&result->limbs); }
+
+void FqSet(FqElem* result, uint32_t in) {
+ FqClear(result);
+ *(uint32_t*)(result->limbs.word) = in;
+}
+
+int FqEq(FqElem const* left, FqElem const* right) {
+ return (VliCmp(&left->limbs, &right->limbs) == 0);
+}
+
+void FqCondSet(FqElem* result, FqElem const* true_val, FqElem const* false_val,
+ int truth_val) {
+ VliCondSet(&result->limbs, &true_val->limbs, &false_val->limbs, truth_val);
+}
+
+int FqSqrt(FqElem* result, FqElem const* in) {
+ VeryLargeInt tmp;
+ // Intel(R) EPID 2.0 parameter q meets q = 3 mod 4.
+ // Square root can be computed as in^((q+1)/4) mod q.
+ VliRShift(&tmp, &epid20_q, 2); // tmp = (q-3)/4
+ (tmp.word[0])++; // tmp = (q+1)/4
+ FqExp(result, in, &tmp); // result = in^((q+1)/4) mod q
+ // validate sqrt exists
+ VliModSquare(&tmp, &result->limbs, &epid20_q);
+ return 0 == VliCmp(&tmp, &in->limbs);
+}
+
+int FqRand(FqElem* result, BitSupplier rnd_func, void* rnd_param) {
+ VeryLargeIntProduct deserialized_t = {{0}};
+ uint32_t t[RAND_NUM_WORDS] = {0};
+ OctStr32 const* src = (OctStr32 const*)t;
+ int i;
+
+ if (rnd_func(t, sizeof(FpElem) * CHAR_BIT + EPID_SLEN, rnd_param)) {
+ return 0;
+ }
+ for (i = RAND_NUM_WORDS - 1; i >= 0; i--) {
+ src = Uint32Deserialize(deserialized_t.word + i, src);
+ }
+ VliModBarrett(&result->limbs, &deserialized_t, &epid20_q);
+ return 1;
+}
+
+void FqFromHash(FqElem* result, unsigned char const* hash, size_t len) {
+ size_t i;
+ VeryLargeIntProduct vli;
+ memset(&vli, 0, sizeof(vli));
+ for (i = 0; i < len; i++) {
+ ((uint8_t*)vli.word)[len - i - 1] = hash[i];
+ }
+ VliModBarrett(&result->limbs, &vli, &epid20_q);
+}
diff --git a/epid/member/tiny/math/src/fq12.c b/epid/member/tiny/math/src/fq12.c
new file mode 100644
index 0000000..dd7176b
--- /dev/null
+++ b/epid/member/tiny/math/src/fq12.c
@@ -0,0 +1,282 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Fq12 math
+/*! \file */
+
+#include "epid/member/tiny/math/fq12.h"
+
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/fq2.h"
+#include "epid/member/tiny/math/fq6.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static void Fq12MulScalar(Fq12Elem* result, Fq12Elem const* left,
+ Fq6Elem const* right) {
+ Fq6Mul(&result->z0, &left->z0, right);
+ Fq6Mul(&result->z1, &left->z1, right);
+}
+
+static void Fq4Square(Fq2Elem* out0, Fq2Elem* out1, Fq2Elem const* in0,
+ Fq2Elem const* in1) {
+ Fq2Elem tmp;
+ Fq2Elem* temp = &tmp;
+ Fq2Square(temp, in1);
+ Fq2Add(out1, in0, in1);
+ Fq2Square(out0, in0);
+ Fq2Square(out1, out1);
+ Fq2Sub(out1, out1, temp);
+ Fq2Sub(out1, out1, out0);
+ Fq2MulXi(temp, temp);
+ Fq2Add(out0, out0, temp);
+}
+
+static void Fq12CondSet(Fq12Elem* result, Fq12Elem const* true_val,
+ Fq12Elem const* false_val, int truth_val) {
+ Fq6CondSet(&result->z0, &true_val->z0, &false_val->z0, truth_val);
+ Fq6CondSet(&result->z1, &true_val->z1, &false_val->z1, truth_val);
+}
+
+void Fq12Add(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right) {
+ Fq6Add(&result->z0, &left->z0, &right->z0);
+ Fq6Add(&result->z1, &left->z1, &right->z1);
+}
+
+void Fq12Sub(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right) {
+ Fq6Sub(&result->z0, &left->z0, &right->z0);
+ Fq6Sub(&result->z1, &left->z1, &right->z1);
+}
+
+void Fq12Square(Fq12Elem* result, Fq12Elem const* in) {
+ Fq6Elem tmpa;
+ Fq6Elem* temp_a = &tmpa;
+ Fq6Square(temp_a, &in->z1);
+ Fq6Add(&result->z1, &in->z0, &in->z1);
+ Fq6Square(&result->z0, &in->z0);
+ Fq6Square(&result->z1, &result->z1);
+ Fq6Sub(&result->z1, &result->z1, (&result->z0));
+ Fq6Sub(&result->z1, &result->z1, temp_a);
+ Fq6MulV(temp_a, temp_a);
+ Fq6Add((&result->z0), (&result->z0), temp_a);
+}
+
+void Fq12Mul(Fq12Elem* result, Fq12Elem const* left, Fq12Elem const* right) {
+ Fq6Elem A;
+ Fq6Elem B;
+ Fq6Elem* t0 = &A;
+ Fq6Elem* t1 = &B;
+
+ Fq6Add(t0, &left->z0, &left->z1);
+ Fq6Add(t1, &right->z0, &right->z1);
+ Fq6Mul(t0, t0, t1);
+ Fq6Mul(&result->z0, &left->z0, &right->z0);
+ Fq6Sub(t0, t0, &result->z0);
+ Fq6Mul(t1, &left->z1, &right->z1);
+ Fq6Sub(&result->z1, t0, t1);
+ Fq6MulV(t1, t1);
+ Fq6Add(&result->z0, &result->z0, t1);
+}
+
+void Fq12Inv(Fq12Elem* result, Fq12Elem const* in) {
+ Fq12Elem tmp3;
+ Fq12Elem tmp4;
+ Fq12Elem* const temp3 = &tmp3;
+ Fq12Elem* const temp4 = &tmp4;
+ Fq12Conj(temp3, in);
+ Fq12Mul(temp4, temp3, in);
+ Fq6Inv(&temp4->z0, &temp4->z0);
+ Fq12MulScalar(result, temp3, &temp4->z0);
+}
+
+void Fq12Neg(Fq12Elem* result, Fq12Elem const* in) {
+ Fq6Neg(&result->z0, &in->z0);
+ Fq6Neg(&result->z1, &in->z1);
+}
+
+void Fq12Set(Fq12Elem* result, uint32_t val) {
+ Fq12Clear(result);
+ FqSet(&(*result).z0.y0.x0, val);
+}
+
+void Fq12Exp(Fq12Elem* result, Fq12Elem const* base, VeryLargeInt const* exp) {
+ int i;
+ Fq12Elem tmp, tmp2, *const temp = &tmp, *const temp2 = &tmp2;
+ Fq12Clear(temp);
+ temp->z0.y0.x0.limbs.word[0]++;
+ for (i = NUM_ECC_DIGITS * 32 - 1; i >= 0; i--) {
+ Fq12Square(temp, temp);
+ Fq12Mul(temp2, temp, base);
+
+ Fq12CondSet(temp, temp2, temp,
+ (int)((exp->word[i / 32] >> (i & 31)) & (0x1)));
+ }
+ Fq12Cp(result, temp);
+}
+
+void Fq12MultiExp(Fq12Elem* result, Fq12Elem const* base0,
+ VeryLargeInt const* exp0, Fq12Elem const* base1,
+ VeryLargeInt const* exp1, Fq12Elem const* base2,
+ VeryLargeInt const* exp2, Fq12Elem const* base3,
+ VeryLargeInt const* exp3) {
+ Fq12Elem tmp;
+ Fq12Exp(result, base0, exp0);
+ Fq12Exp(&tmp, base1, exp1);
+ Fq12Mul(result, result, &tmp);
+ Fq12Exp(&tmp, base2, exp2);
+ Fq12Mul(result, result, &tmp);
+ Fq12Exp(&tmp, base3, exp3);
+ Fq12Mul(result, result, &tmp);
+}
+
+int Fq12Eq(Fq12Elem const* left, Fq12Elem const* right) {
+ return Fq6Eq(&left->z0, &right->z0) && Fq6Eq(&left->z0, &right->z0);
+}
+
+void Fq12Conj(Fq12Elem* result, Fq12Elem const* in) {
+ Fq6Cp(&result->z0, &in->z0);
+ Fq6Neg(&result->z1, &in->z1);
+}
+
+void Fq12ExpCyc(Fq12Elem* result, Fq12Elem const* in, VeryLargeInt const* t) {
+ int i = 0;
+ Fq12Elem ac;
+ Fq12Elem* const acc = &ac;
+ Fq12Cp(acc, in);
+ Fq12Cp(result, in);
+
+ for (i = 61; i >= 0; i--) {
+ Fq12SqCyc(result, result);
+
+ if (VliTestBit(t, (uint32_t)i)) {
+ Fq12Mul(result, result, acc);
+ }
+ }
+}
+
+void Fq12SqCyc(Fq12Elem* result, Fq12Elem const* in) {
+ Fq2Elem const* a0 = &(in->z0).y0;
+ Fq2Elem const* a1 = &(in->z1).y0;
+ Fq2Elem const* a2 = &(in->z0).y1;
+ Fq2Elem const* a3 = &(in->z1).y1;
+ Fq2Elem const* a4 = &(in->z0).y2;
+ Fq2Elem const* a5 = &(in->z1).y2;
+ Fq2Elem* e0 = &(result->z0).y0;
+ Fq2Elem* e1 = &(result->z1).y0;
+ Fq2Elem* e2 = &(result->z0).y1;
+ Fq2Elem* e3 = &(result->z1).y1;
+ Fq2Elem* e4 = &(result->z0).y2;
+ Fq2Elem* e5 = &(result->z1).y2;
+ Fq2Elem tmp1;
+ Fq2Elem tmp2;
+ Fq2Elem tmp3;
+ Fq2Elem tmp4;
+ Fq2Elem* temp1 = &tmp1;
+ Fq2Elem* temp2 = &tmp2;
+ Fq2Elem* temp3 = &tmp3;
+ Fq2Elem* temp4 = &tmp4;
+
+ Fq4Square(temp1, temp2, a0, a3); // t00,t11 = sq(a0,a3)
+ Fq2Add(e0, a0, a0); // e0 = 3*t00 - 2*a0
+ Fq2Sub(e0, temp1, e0);
+ Fq2Add(e0, temp1, e0);
+ Fq2Add(e0, temp1, e0);
+ Fq2Add(e3, a3, a3); // e3 = 3*t11 - 2*a3
+ Fq2Add(e3, temp2, e3);
+ Fq2Add(e3, temp2, e3);
+ Fq2Add(e3, temp2, e3);
+
+ Fq4Square(temp1, temp2, a2, a5); // t02, t10 = sq(a2,a5)
+ Fq2MulXi(temp2, temp2);
+ Fq4Square(temp3, temp4, a1, a4); // t01, t12 = sq(a1,a4)
+
+ Fq2Add(e4, a4, a4);
+ Fq2Sub(e4, temp1, e4);
+ Fq2Add(e4, temp1, e4);
+ Fq2Add(e4, temp1, e4);
+ Fq2Add(e1, a1, a1);
+ Fq2Add(e1, temp2, e1);
+ Fq2Add(e1, temp2, e1);
+ Fq2Add(e1, temp2, e1);
+
+ Fq2Add(e2, a2, a2);
+ Fq2Sub(e2, temp3, e2);
+ Fq2Add(e2, temp3, e2);
+ Fq2Add(e2, temp3, e2);
+ Fq2Add(e5, a5, a5);
+ Fq2Add(e5, temp4, e5);
+ Fq2Add(e5, temp4, e5);
+ Fq2Add(e5, temp4, e5);
+}
+
+void Fq12MulSpecial(Fq12Elem* result, Fq12Elem const* left,
+ Fq12Elem const* right) {
+ Fq2Elem T3;
+ Fq2Elem* t3 = &T3;
+ Fq2Elem const* b0 = &(right->z0.y0);
+ Fq2Elem const* b1 = &right->z1.y0;
+ Fq2Elem const* b3 = &right->z1.y1;
+ Fq6Elem T0;
+ Fq6Elem T1;
+ Fq6Elem T2;
+ Fq6Elem* t0 = &T0;
+ Fq6Elem* t1 = &T1;
+ Fq6Elem* t2 = &T2;
+ Fq6Elem const* a0 = &left->z0;
+ Fq6Elem const* a1 = &left->z1;
+ Fq6Elem* r0 = &result->z0;
+ Fq6Elem* r1 = &result->z1;
+
+#if defined(DEBUG)
+ // validate algorithm precondition
+ if (!Fq2IsZero(&right->z0.y1) || !Fq2IsZero(&right->z0.y2) ||
+ !Fq2IsZero(&right->z1.y2)) {
+ memset(&result, 0xff, sizeof(result));
+ return;
+ }
+#endif // defined(DEBUG)
+
+ Fq6Add(t0, a0, a1);
+ Fq2Add(t3, b0, b1);
+ Fq6MulScalar(t0, t0, t3);
+
+ Fq6MulScalar(t2, a1, b3);
+ Fq6MulV(t2, t2);
+
+ Fq6MulScalar(t1, a1, b1);
+ Fq6Sub(t0, t0, t1);
+ Fq6Add(t2, t2, t1);
+ Fq6MulV(t2, t2);
+
+ Fq6MulScalar(t1, a0, b0);
+ Fq6Add(t2, t2, t1);
+ Fq6Sub(t0, t0, t1);
+
+ Fq6MulScalar(t1, a0, b3);
+ Fq6MulV(t1, t1);
+ Fq6Add(r1, t1, t0);
+ Fq6Cp(r0, t2);
+}
+
+void Fq12Cp(Fq12Elem* result, Fq12Elem const* in) {
+ Fq6Cp(&result->z0, &in->z0);
+ Fq6Cp(&result->z1, &in->z1);
+}
+
+void Fq12Clear(Fq12Elem* result) {
+ Fq6Clear(&result->z0);
+ Fq6Clear(&result->z1);
+}
diff --git a/epid/member/tiny/math/src/fq2.c b/epid/member/tiny/math/src/fq2.c
new file mode 100644
index 0000000..754c334
--- /dev/null
+++ b/epid/member/tiny/math/src/fq2.c
@@ -0,0 +1,150 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Fq2 math
+/*! \file */
+
+#include "epid/member/tiny/math/fq2.h"
+
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+void Fq2Cp(Fq2Elem* result, Fq2Elem const* in) {
+ FqCp(&(result->x0), &(in->x0));
+ FqCp(&(result->x1), &(in->x1));
+}
+
+void Fq2Set(Fq2Elem* result, uint32_t in) {
+ FqSet(&(result->x0), in);
+ FqClear(&(result->x1));
+}
+
+void Fq2Clear(Fq2Elem* result) {
+ FqClear(&result->x0);
+ FqClear(&result->x1);
+}
+
+void Fq2Add(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
+ FqAdd(&(result->x0), &(left->x0), &(right->x0));
+ FqAdd(&(result->x1), &(left->x1), &(right->x1));
+}
+
+void Fq2Exp(Fq2Elem* result, Fq2Elem const* base, VeryLargeInt const* exp) {
+ int i, j;
+ Fq2Elem tmp;
+ Fq2Elem tmp2;
+ Fq2Elem* temp = &tmp;
+ Fq2Elem* temp2 = &tmp2;
+ FqSet(&(temp->x0), 1);
+ FqClear(&(temp->x1));
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
+ for (j = 31; j >= 0; j--) {
+ Fq2Square(temp, temp);
+ Fq2Mul(temp2, temp, base);
+
+ Fq2CondSet(temp, temp2, temp, (int)((exp->word[i] >> j) & (0x1)));
+ }
+ }
+ Fq2Cp(result, temp);
+}
+
+void Fq2Sub(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
+ FqSub(&(result->x0), &(left->x0), &(right->x0));
+ FqSub(&(result->x1), &(left->x1), &(right->x1));
+}
+
+void Fq2Mul(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
+ FqElem A;
+ FqElem B;
+ FqElem* a = &A;
+ FqElem* b = &B;
+
+ FqAdd(a, &left->x0, &left->x1);
+ FqAdd(b, &right->x0, &right->x1);
+ FqMul(a, a, b);
+ FqMul(&result->x0, &left->x0, &right->x0);
+ FqSub(a, a, &result->x0);
+ FqMul(b, &left->x1, &right->x1);
+ FqSub(&result->x1, a, b);
+ FqNeg(b, b); // b = b*beta
+ FqAdd(&result->x0, &result->x0, b);
+}
+
+void Fq2Inv(Fq2Elem* result, Fq2Elem const* in) {
+ FqElem tmp;
+ FqElem tmp2;
+ FqElem* temp = &tmp;
+ FqElem* temp2 = &tmp2;
+ FqSquare(temp, &in->x1);
+ FqSquare(temp2, &in->x0);
+ FqAdd(temp, temp, temp2);
+ FqInv(temp, temp);
+ FqMul(&result->x0, temp, &in->x0);
+ FqNeg(temp, temp);
+ FqMul(&result->x1, temp, &in->x1);
+}
+
+void Fq2Neg(Fq2Elem* result, Fq2Elem const* in) {
+ FqNeg(&(result->x0), &(in->x0));
+ FqNeg(&(result->x1), &(in->x1));
+}
+
+void Fq2Conj(Fq2Elem* result, Fq2Elem const* in) {
+ FqCp(&result->x0, &in->x0);
+ FqNeg(&result->x1, &in->x1);
+}
+
+void Fq2Square(Fq2Elem* result, Fq2Elem const* in) {
+ FqElem tmpa;
+ FqElem* temp_a = &tmpa;
+ FqElem tmpb;
+ FqElem* temp_b = &tmpb;
+ FqAdd(temp_a, &in->x0, &in->x1);
+ FqMul(temp_b, &in->x0, &in->x1);
+ FqSub(&result->x0, &in->x0, &in->x1);
+ FqMul(&result->x0, temp_a, &result->x0);
+ FqAdd(&result->x1, temp_b, temp_b);
+}
+
+void Fq2MulScalar(Fq2Elem* result, Fq2Elem const* left, FqElem const* right) {
+ FqMul(&(result->x0), &(left->x0), right);
+ FqMul(&(result->x1), &(left->x1), right);
+}
+
+void Fq2CondSet(Fq2Elem* result, Fq2Elem const* true_val,
+ Fq2Elem const* false_val, int truth_val) {
+ FqCondSet(&(result->x0), &(true_val->x0), &(false_val->x0), truth_val);
+ FqCondSet(&(result->x1), &(true_val->x1), &(false_val->x1), truth_val);
+}
+
+int Fq2Eq(Fq2Elem const* left, Fq2Elem const* right) {
+ return FqEq(&(left->x0), &(right->x0)) && FqEq(&(left->x1), &(right->x1));
+}
+
+void Fq2MulXi(Fq2Elem* result, Fq2Elem const* in) {
+ // has the same effect as Fq2Mul(result, in, &Fq2xi) with better speed, low
+ // space;
+ FqElem tmp;
+ FqElem* temp = &tmp;
+ FqAdd(temp, &in->x0, &in->x0);
+ FqSub(temp, temp, &in->x1);
+ FqAdd(&result->x1, &in->x1, &in->x1);
+ FqAdd(&result->x1, &result->x1, &in->x0);
+ FqCp(&result->x0, temp);
+}
+
+int Fq2IsZero(Fq2Elem const* value) {
+ return FqIsZero(&value->x0) && FqIsZero(&value->x1);
+}
diff --git a/epid/member/tiny/math/src/fq6.c b/epid/member/tiny/math/src/fq6.c
new file mode 100644
index 0000000..b013037
--- /dev/null
+++ b/epid/member/tiny/math/src/fq6.c
@@ -0,0 +1,192 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Fq6 math
+/*! \file */
+
+#include "epid/member/tiny/math/fq6.h"
+
+#include "epid/member/tiny/math/fq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+void Fq6Add(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right) {
+ Fq2Add(&result->y0, &left->y0, &right->y0);
+ Fq2Add(&result->y1, &left->y1, &right->y1);
+ Fq2Add(&result->y2, &left->y2, &right->y2);
+}
+
+void Fq6Sub(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right) {
+ Fq2Sub(&result->y0, &left->y0, &right->y0);
+ Fq2Sub(&result->y1, &left->y1, &right->y1);
+ Fq2Sub(&result->y2, &left->y2, &right->y2);
+}
+
+void Fq6Mul(Fq6Elem* result, Fq6Elem const* left, Fq6Elem const* right) {
+ Fq2Elem tmpa;
+ Fq2Elem tmpb;
+ Fq2Elem tmpc;
+ Fq2Elem tmpd;
+ Fq2Elem tmpe;
+ Fq2Elem* temp_a = &tmpa;
+ Fq2Elem* temp_b = &tmpb;
+ Fq2Elem* temp_c = &tmpc;
+ Fq2Elem* temp_d = &tmpd;
+ Fq2Elem* temp_e = &tmpe;
+ Fq2Mul(temp_a, &left->y0, &right->y0); // temp_a = t0 = a[0] * b[0]
+ Fq2Mul(temp_b, &left->y1, &right->y1); // temp_b = t1
+ Fq2Mul(temp_c, &left->y2, &right->y2); // temp_c = t2
+ Fq2Add(temp_d, &left->y1, &left->y2); // temp_d = t3
+ Fq2Add(temp_e, &right->y1, &right->y2); // temp_e = t4
+ Fq2Mul(temp_d, temp_d, temp_e); // temp_d = t3
+ Fq2Sub(temp_d, temp_d, temp_b);
+ Fq2Sub(temp_d, temp_d, temp_c);
+ Fq2MulXi(temp_e, temp_d);
+ Fq2Add(temp_d, &left->y0, &left->y1);
+ Fq2Add(&result->y1, &right->y0, &right->y1); // &result->y1 = t4
+ Fq2Mul(temp_d, temp_d, &result->y1);
+ Fq2MulXi(&result->y1, temp_c); // result->y1 = Fq2.mulXi(t2)
+ Fq2Add(&result->y1, &result->y1, temp_d);
+ Fq2Sub(&result->y1, &result->y1, temp_a);
+ Fq2Sub(&result->y1, &result->y1, temp_b);
+ Fq2Add(temp_d, &left->y0, &left->y2);
+ Fq2Sub(temp_b, temp_b, temp_c);
+ Fq2Add(temp_c, &right->y0, &right->y2);
+ Fq2Add(&result->y0, temp_e, temp_a); // temp_e = e[0], reordered instruction
+ Fq2Mul(temp_d, temp_d, temp_c);
+ Fq2Sub(temp_d, temp_d, temp_a);
+ Fq2Add(&result->y2, temp_d, temp_b);
+}
+
+void Fq6Inv(Fq6Elem* result, Fq6Elem const* in) {
+ Fq2Elem tmpa;
+ Fq2Elem tmpb;
+ Fq2Elem tmpc;
+ Fq2Elem tmpd;
+ Fq2Elem* temp_a = &tmpa;
+ Fq2Elem* temp_b = &tmpb;
+ Fq2Elem* temp_c = &tmpc;
+ Fq2Elem* temp_d = &tmpd;
+ Fq2Square(temp_a, &in->y0);
+ Fq2Mul(temp_d, &in->y1, &in->y2);
+ Fq2MulXi(temp_d, temp_d);
+ Fq2Sub(temp_a, temp_a, temp_d);
+ Fq2Square(temp_b, &in->y2);
+ Fq2Mul(temp_d, &in->y0, &in->y1);
+ Fq2MulXi(temp_b, temp_b);
+ Fq2Sub(temp_b, temp_b, temp_d);
+ Fq2Square(temp_c, &in->y1);
+ Fq2Mul(temp_d, &in->y0, &in->y2);
+ Fq2Sub(temp_c, temp_c, temp_d);
+ // using the results as temporary variables
+ Fq2Mul(&result->y0, &in->y0, temp_a);
+ Fq2Mul(&result->y1, &in->y1, temp_c);
+ Fq2Mul(&result->y2, &in->y2, temp_b);
+ Fq2MulXi(&result->y1, &result->y1);
+ Fq2MulXi(&result->y2, &result->y2);
+ Fq2Add(temp_d, &result->y0, &result->y1);
+ Fq2Add(temp_d, temp_d, &result->y2);
+ Fq2Inv(temp_d, temp_d);
+ Fq2Mul(&result->y0, temp_a, temp_d);
+ Fq2Mul(&result->y1, temp_b, temp_d);
+ Fq2Mul(&result->y2, temp_c, temp_d);
+}
+
+void Fq6Neg(Fq6Elem* result, Fq6Elem const* in) {
+ Fq2Neg(&result->y0, &in->y0);
+ Fq2Neg(&result->y1, &in->y1);
+ Fq2Neg(&result->y2, &in->y2);
+}
+
+void Fq6Clear(Fq6Elem* result) {
+ Fq2Clear(&result->y0);
+ Fq2Clear(&result->y1);
+ Fq2Clear(&result->y2);
+}
+
+void Fq6MulScalar(Fq6Elem* result, Fq6Elem const* in, Fq2Elem const* scalar) {
+ Fq2Mul(&result->y0, &in->y0, scalar);
+ Fq2Mul(&result->y1, &in->y1, scalar);
+ Fq2Mul(&result->y2, &in->y2, scalar);
+}
+
+void Fq6MulV(Fq6Elem* result, Fq6Elem const* in) {
+ Fq2Elem tmp;
+ Fq2Elem* temp = &tmp;
+ Fq2MulXi(temp, &in->y2);
+ Fq2Cp(&result->y2, &in->y1);
+ Fq2Cp(&result->y1, &in->y0);
+ Fq2Cp(&result->y0, temp);
+}
+
+int Fq6Eq(Fq6Elem const* left, Fq6Elem const* right) {
+ return Fq2Eq(&left->y0, &right->y0) && Fq2Eq(&left->y1, &right->y1) &&
+ Fq2Eq(&left->y2, &right->y2);
+}
+
+int Fq6IsZero(Fq6Elem const* in) {
+ return Fq2IsZero(&in->y0) && Fq2IsZero(&in->y1) && Fq2IsZero(&in->y2);
+}
+
+void Fq6Square(Fq6Elem* result, Fq6Elem const* in) {
+ Fq2Elem T0;
+ Fq2Elem T2;
+ Fq2Elem T3;
+ Fq2Elem* t0 = &T0;
+ Fq2Elem* t1 = &result->y1;
+ Fq2Elem* t2 = &T2;
+ Fq2Elem* t3 = &T3;
+ Fq2Add(t0, &in->y1, &in->y2);
+ Fq2Square(t3, &in->y1);
+ Fq2Add(t1, &in->y0, &in->y1);
+ Fq2Add(t2, &in->y0, &in->y2);
+ Fq2Square(t0, t0);
+ Fq2Square(t1, t1);
+ Fq2Square(t2, t2);
+
+ // using result from Fq2Square(t3, in->y1):
+ Fq2Sub(t0, t0, t3);
+ Fq2Sub(t1, t1, t3);
+ Fq2Add(t2, t2, t3);
+
+ Fq2Square(t3, &in->y2);
+ Fq2Sub(t0, t0, t3);
+ Fq2Sub(t2, t2, t3);
+ Fq2MulXi(t3, t3);
+ Fq2Add(t1, t1, t3);
+
+ Fq2Square(t3, &in->y0);
+ Fq2MulXi(t0, t0);
+ Fq2Add(&result->y0, t0, t3);
+ Fq2Sub(&result->y1, t1, t3);
+ Fq2Sub(&result->y2, t2, t3);
+}
+
+void Fq6Cp(Fq6Elem* result, Fq6Elem const* in) {
+ Fq2Cp(&result->y0, &in->y0);
+ Fq2Cp(&result->y1, &in->y1);
+ Fq2Cp(&result->y2, &in->y2);
+}
+
+void Fq6CondSet(Fq6Elem* result, Fq6Elem const* true_val,
+ Fq6Elem const* false_val, int truth_val) {
+ Fq2CondSet(&result->y0, &true_val->y0, &false_val->y0, truth_val);
+ Fq2CondSet(&result->y1, &true_val->y1, &false_val->y1, truth_val);
+ Fq2CondSet(&result->y2, &true_val->y2, &false_val->y2, truth_val);
+}
+
+void Fq6Set(Fq6Elem* result, uint32_t in) {
+ Fq6Clear(result);
+ Fq2Set(&result->y0, in);
+}
diff --git a/epid/member/tiny/math/src/hashwrap.c b/epid/member/tiny/math/src/hashwrap.c
new file mode 100644
index 0000000..7f3c8be
--- /dev/null
+++ b/epid/member/tiny/math/src/hashwrap.c
@@ -0,0 +1,86 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of hash wrap function
+/*! \file */
+#include "epid/member/tiny/math/hashwrap.h"
+
+void tinysha_init(HashAlg sha_type, tiny_sha* s) {
+ switch (sha_type) {
+#ifdef SHA512_SUPPORT
+ case kSha512:
+ tinysha512_init(&s->sha_state_t.sha512s);
+ break;
+#endif
+#ifdef SHA256_SUPPORT
+ case kSha256:
+ tc_sha256_init(&s->sha_state_t.sha256s);
+ break;
+#endif
+ default:
+ s->hash_alg = kInvalidHashAlg;
+ return;
+ }
+ s->hash_alg = sha_type;
+}
+
+void tinysha_update(tiny_sha* s, void const* data, size_t data_length) {
+ switch (s->hash_alg) {
+#ifdef SHA512_SUPPORT
+ case kSha512:
+ tinysha512_update(&s->sha_state_t.sha512s, data, data_length);
+ break;
+#endif
+#ifdef SHA256_SUPPORT
+ case kSha256:
+ tc_sha256_update(&s->sha_state_t.sha256s, data, data_length);
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+void tinysha_final(unsigned char* digest, tiny_sha* s) {
+ switch (s->hash_alg) {
+#ifdef SHA512_SUPPORT
+ case kSha512:
+ tinysha512_final(digest, &s->sha_state_t.sha512s);
+ break;
+#endif
+#ifdef SHA256_SUPPORT
+ case kSha256:
+ tc_sha256_final(digest, &s->sha_state_t.sha256s);
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+size_t tinysha_digest_size(tiny_sha* s) {
+ switch (s->hash_alg) {
+#ifdef SHA512_SUPPORT
+ case kSha512:
+ return SHA512_DIGEST_SIZE;
+#endif
+#ifdef SHA256_SUPPORT
+ case kSha256:
+ return SHA256_DIGEST_SIZE;
+#endif
+ default:
+ return 0;
+ }
+}
diff --git a/epid/member/tiny/math/src/pairing.c b/epid/member/tiny/math/src/pairing.c
new file mode 100644
index 0000000..6b2f261
--- /dev/null
+++ b/epid/member/tiny/math/src/pairing.c
@@ -0,0 +1,300 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Implementation of Tate pairing
+/*! \file */
+
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/fq12.h"
+#include "epid/member/tiny/math/fq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/vli.h"
+
+static const VeryLargeInt epid_e = {{0xf2788803, 0x7886dcf9, 0x2dc401c0,
+ 0xd77a10ff, 0x27bd9b6f, 0x367ba865,
+ 0xaaaa2822, 0x2aaaaaaa}};
+static const VeryLargeInt epid_t = {{0x30B0A801, 0x6882F5C0, 0, 0, 0, 0, 0, 0}};
+static const Fq2Elem epid_xi = {
+ {{{0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}},
+ {{{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}}};
+static const int neg = 1;
+
+void PairingInit(PairingState* state) {
+ int i;
+ Fq2Exp(&state->g[0][0], &epid_xi, &epid_e);
+ for (i = 1; i < 5; i++) {
+ Fq2Mul(&state->g[0][i], &state->g[0][i - 1], &state->g[0][0]);
+ }
+ for (i = 0; i < 5; i++) {
+ FqSquare(&state->g[1][i].x0, &state->g[0][i].x0);
+ FqSquare(&state->g[1][i].x1, &state->g[0][i].x1);
+ FqAdd(&state->g[1][i].x0, &state->g[1][i].x0, &state->g[1][i].x1);
+ FqClear(&state->g[1][i].x1);
+ Fq2Mul(&state->g[2][i], &state->g[0][i], &state->g[1][i]);
+ }
+}
+
+static void piOp(EccPointFq2* Qout, EccPointFq2 const* Qin, int e,
+ PairingState const* scratch) {
+ if (e == 1) {
+ Fq2Conj(&Qout->x, &Qin->x);
+ Fq2Conj(&Qout->y, &Qin->y);
+ } else {
+ Fq2Cp(&Qout->x, &Qin->x);
+ Fq2Cp(&Qout->y, &Qin->y);
+ }
+ Fq2Mul(&Qout->x, &Qout->x, &scratch->g[e - 1][1]);
+ Fq2Mul(&Qout->y, &Qout->y, &scratch->g[e - 1][2]);
+}
+
+/*
+ * Computes the Frobenius endomorphism Pout = Pin^(p^e)
+ */
+static void frob_op(Fq12Elem* Pout, Fq12Elem const* Pin, int e,
+ PairingState const* state) {
+ if (e == 1 || e == 3) {
+ Fq2Conj(&Pout->z0.y0, &Pin->z0.y0);
+ Fq2Conj(&Pout->z1.y0, &Pin->z1.y0);
+ Fq2Conj(&Pout->z0.y1, &Pin->z0.y1);
+ Fq2Conj(&Pout->z1.y1, &Pin->z1.y1);
+ Fq2Conj(&Pout->z0.y2, &Pin->z0.y2);
+ Fq2Conj(&Pout->z1.y2, &Pin->z1.y2);
+ } else {
+ Fq2Cp(&Pout->z0.y0, &Pin->z0.y0);
+ Fq2Cp(&Pout->z1.y0, &Pin->z1.y0);
+ Fq2Cp(&Pout->z0.y1, &Pin->z0.y1);
+ Fq2Cp(&Pout->z1.y1, &Pin->z1.y1);
+ Fq2Cp(&Pout->z0.y2, &Pin->z0.y2);
+ Fq2Cp(&Pout->z1.y2, &Pin->z1.y2);
+ }
+ Fq2Mul(&Pout->z1.y0, &Pout->z1.y0, &state->g[e - 1][0]);
+ Fq2Mul(&Pout->z0.y1, &Pout->z0.y1, &state->g[e - 1][1]);
+ Fq2Mul(&Pout->z1.y1, &Pout->z1.y1, &state->g[e - 1][2]);
+ Fq2Mul(&Pout->z0.y2, &Pout->z0.y2, &state->g[e - 1][3]);
+ Fq2Mul(&Pout->z1.y2, &Pout->z1.y2, &state->g[e - 1][4]);
+}
+
+static void finalExp(Fq12Elem* f, PairingState const* state) {
+ Fq12Elem t3;
+ Fq12Elem t2;
+ Fq12Elem t1;
+ Fq12Elem t0;
+
+ Fq12Conj(&t1, f);
+ Fq12Inv(&t2, f);
+ Fq12Mul(f, &t1, &t2);
+ frob_op(&t2, f, 2, state);
+ Fq12Mul(f, f, &t2);
+ Fq12ExpCyc(&t1, f, &epid_t);
+ if (neg) {
+ Fq12Conj(&t1, &t1);
+ }
+ Fq12ExpCyc(&t3, &t1, &epid_t);
+ if (neg) {
+ Fq12Conj(&t3, &t3);
+ }
+ Fq12ExpCyc(&t0, &t3, &epid_t);
+ if (neg) {
+ Fq12Conj(&t0, &t0);
+ }
+ frob_op(&t2, &t0, 1, state);
+ Fq12Mul(&t2, &t2, &t0);
+ Fq12Conj(&t2, &t2);
+ Fq12SqCyc(&t0, &t2);
+ frob_op(&t2, &t3, 1, state);
+ Fq12Mul(&t2, &t2, &t1);
+ Fq12Conj(&t2, &t2);
+ Fq12Mul(&t0, &t0, &t2);
+ Fq12Conj(&t2, &t3);
+ Fq12Mul(&t0, &t0, &t2);
+ frob_op(&t1, &t1, 1, state);
+ Fq12Conj(&t1, &t1);
+ Fq12Mul(&t1, &t1, &t2);
+ Fq12Mul(&t1, &t1, &t0);
+ frob_op(&t2, &t3, 2, state);
+ Fq12Mul(&t0, &t0, &t2);
+ Fq12SqCyc(&t1, &t1);
+ Fq12Mul(&t1, &t1, &t0);
+ Fq12SqCyc(&t1, &t1);
+ Fq12Conj(&t2, f);
+ Fq12Mul(&t0, &t1, &t2);
+ frob_op(&t2, f, 1, state);
+ Fq12Mul(&t1, &t1, &t2);
+ frob_op(&t2, f, 2, state);
+ Fq12Mul(&t1, &t1, &t2);
+ frob_op(&t2, f, 3, state);
+ Fq12Mul(&t1, &t1, &t2);
+ Fq12SqCyc(&t0, &t0);
+ Fq12Mul(f, &t1, &t0);
+}
+
+static void pair_tangent(Fq12Elem* f, Fq2Elem* X, Fq2Elem* Y, Fq2Elem* Z,
+ Fq2Elem* Z2, EccPointFq const* P) {
+ Fq2Mul(&f->z0.y0, X, X);
+ Fq2Add(&f->z0.y2, &f->z0.y0, &f->z0.y0);
+ Fq2Add(&f->z0.y2, &f->z0.y2, &f->z0.y0);
+ Fq2Add(&f->z1.y1, X, &f->z0.y2);
+ Fq2Mul(&f->z1.y1, &f->z1.y1, &f->z1.y1);
+ Fq2Sub(&f->z1.y1, &f->z1.y1, &f->z0.y0);
+ Fq2Mul(&f->z0.y1, Y, Y);
+ Fq2Add(&f->z1.y0, &f->z0.y1, X);
+ Fq2Mul(&f->z1.y0, &f->z1.y0, &f->z1.y0);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, &f->z0.y0);
+ Fq2Mul(&f->z0.y0, &f->z0.y1, &f->z0.y1);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, &f->z0.y0);
+ Fq2Add(&f->z1.y0, &f->z1.y0, &f->z1.y0);
+ Fq2Mul(&f->z1.y2, &f->z0.y2, &f->z0.y2);
+ Fq2Add(Z, Y, Z);
+ Fq2Mul(Z, Z, Z);
+ Fq2Sub(Z, Z, &f->z0.y1);
+ Fq2Sub(Z, Z, Z2);
+ Fq2Add(&f->z0.y1, &f->z0.y1, &f->z0.y1);
+ Fq2Add(&f->z0.y1, &f->z0.y1, &f->z0.y1);
+ Fq2Sub(&f->z1.y1, &f->z1.y1, &f->z1.y2);
+ Fq2Sub(&f->z1.y1, &f->z1.y1, &f->z0.y1);
+ Fq2Sub(X, &f->z1.y2, &f->z1.y0);
+ Fq2Sub(X, X, &f->z1.y0);
+ Fq2Add(&f->z0.y0, &f->z0.y0, &f->z0.y0);
+ Fq2Add(&f->z0.y0, &f->z0.y0, &f->z0.y0);
+ Fq2Add(&f->z0.y0, &f->z0.y0, &f->z0.y0);
+ Fq2Sub(Y, &f->z1.y0, X);
+ Fq2Mul(Y, Y, &f->z0.y2);
+ Fq2Sub(Y, Y, &f->z0.y0);
+ Fq2Mul(&f->z1.y0, &f->z0.y2, Z2);
+ Fq2Neg(&f->z1.y0, &f->z1.y0);
+ Fq2Add(&f->z1.y0, &f->z1.y0, &f->z1.y0);
+ Fq2MulScalar(&f->z1.y0, &f->z1.y0, &P->x);
+ Fq2Mul(&f->z0.y0, Z, Z2);
+ Fq2Add(&f->z0.y0, &f->z0.y0, &f->z0.y0);
+ Fq2MulScalar(&f->z0.y0, &f->z0.y0, &P->y);
+ Fq2Mul(Z2, Z, Z);
+ Fq2Clear(&f->z0.y1);
+ Fq2Clear(&f->z0.y2);
+ Fq2Clear(&f->z1.y2);
+ Fq2Square(Z2, Z);
+}
+
+static void pair_line(Fq12Elem* f, Fq2Elem* X, Fq2Elem* Y, Fq2Elem* Z,
+ Fq2Elem* Z2, EccPointFq const* P, EccPointFq2 const* Q) {
+ Fq2Mul(&f->z0.y1, &Q->x, Z2);
+ Fq2Add(&f->z1.y0, &Q->y, Z);
+ Fq2Mul(&f->z1.y0, &f->z1.y0, &f->z1.y0);
+ Fq2Square(&f->z0.y0, &Q->y);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, &f->z0.y0);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, Z2);
+ Fq2Mul(&f->z1.y0, &f->z1.y0, Z2);
+ Fq2Sub(&f->z0.y1, &f->z0.y1, X);
+ Fq2Mul(&f->z0.y2, &f->z0.y1, &f->z0.y1);
+ Fq2Add(Z, Z, &f->z0.y1);
+ Fq2Square(Z, Z);
+ Fq2Sub(Z, Z, Z2);
+ Fq2Sub(Z, Z, &f->z0.y2);
+ Fq2Mul(Z2, Z, Z);
+ Fq2Add(&f->z1.y2, &Q->y, Z);
+ Fq2Mul(&f->z1.y2, &f->z1.y2, &f->z1.y2);
+ Fq2Sub(&f->z1.y2, &f->z1.y2, &f->z0.y0);
+ Fq2Sub(&f->z1.y2, &f->z1.y2, Z2);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, Y);
+ Fq2Sub(&f->z1.y0, &f->z1.y0, Y);
+ Fq2Mul(&f->z1.y1, &f->z1.y0, &Q->x);
+ Fq2Add(&f->z1.y1, &f->z1.y1, &f->z1.y1);
+ Fq2Sub(&f->z1.y1, &f->z1.y1, &f->z1.y2);
+ Fq2Add(&f->z0.y2, &f->z0.y2, &f->z0.y2);
+ Fq2Add(&f->z0.y2, &f->z0.y2, &f->z0.y2);
+ Fq2Mul(&f->z0.y1, &f->z0.y2, &f->z0.y1);
+ Fq2Mul(&f->z0.y2, X, &f->z0.y2);
+ Fq2Mul(X, &f->z1.y0, &f->z1.y0);
+ Fq2Sub(X, X, &f->z0.y1);
+ Fq2Sub(X, X, &f->z0.y2);
+ Fq2Sub(X, X, &f->z0.y2);
+ Fq2Sub(&f->z0.y2, &f->z0.y2, X);
+ Fq2Mul(&f->z0.y2, &f->z0.y2, &f->z1.y0);
+ Fq2Mul(&f->z0.y1, Y, &f->z0.y1);
+ Fq2Add(&f->z0.y1, &f->z0.y1, &f->z0.y1);
+ Fq2Sub(Y, &f->z0.y2, &f->z0.y1);
+ Fq2MulScalar(&f->z0.y0, Z, &P->y);
+ Fq2Add(&f->z0.y0, &f->z0.y0, &f->z0.y0);
+ Fq2Neg(&f->z1.y0, &f->z1.y0);
+ Fq2MulScalar(&f->z1.y0, &f->z1.y0, &P->x);
+ Fq2Add(&f->z1.y0, &f->z1.y0, &f->z1.y0);
+ Fq2Clear(&f->z0.y1);
+ Fq2Clear(&f->z0.y2);
+ Fq2Clear(&f->z1.y2);
+}
+
+void PairingCompute(Fq12Elem* d, EccPointFq const* P, EccPointFq2 const* Q,
+ PairingState const* state) {
+ Fq2Elem X;
+ Fq2Elem Y;
+ Fq2Elem Z;
+ Fq2Elem Z2;
+ EccPointFq2 Qp;
+ Fq12Elem f;
+ VeryLargeInt s;
+ const VeryLargeInt two = {{2}};
+ uint32_t i;
+
+ VliAdd(&s, &epid_t, &epid_t); // s = 2*t
+ VliAdd(&s, &s, &epid_t); // s = 3*t
+ VliAdd(&s, &s, &s); // s = 6*t
+ if (neg) {
+ VliSub(&s, &s, &two);
+ } else {
+ VliAdd(&s, &s, &two);
+ }
+ Fq2Cp(&X, &Q->x);
+ Fq2Cp(&Y, &Q->y);
+ Fq2Set(&Z, 1);
+ Fq2Set(&Z2, 1);
+ Fq12Set(d, 1);
+
+ Fq12Clear(&f);
+ // s has 66 bits, 0 through 65, so starting point is bit 64
+ i = 65;
+ while (i > 0) {
+ i -= 1;
+ pair_tangent(&f, &X, &Y, &Z, &Z2, P);
+ Fq12Square(d, d);
+ Fq12MulSpecial(d, d, &f);
+ if (VliTestBit(&s, i)) {
+ pair_line(&f, &X, &Y, &Z, &Z2, P, Q);
+ Fq12MulSpecial(d, d, &f);
+ }
+ }
+ if (neg) {
+ Fq2Neg(&Y, &Y);
+ Fq12Conj(d, d);
+ }
+ piOp(&Qp, Q, 1, state);
+ pair_line(&f, &X, &Y, &Z, &Z2, P, &Qp);
+ Fq12MulSpecial(d, d, &f);
+ piOp(&Qp, Q, 2, state);
+ Fq2Neg(&Qp.y, &Qp.y);
+ pair_line(&f, &X, &Y, &Z, &Z2, P, &Qp);
+ Fq12MulSpecial(d, d, &f);
+ finalExp(d, state);
+ // s doesn't have secret information; no need to clear it.
+ Fq12Clear(&f);
+ Fq2Clear(&X);
+ Fq2Clear(&Y);
+ Fq2Clear(&Z);
+ Fq2Clear(&Z2);
+ Fq2Clear(&Qp.x);
+ Fq2Clear(&Qp.y);
+}
diff --git a/epid/member/tiny/math/src/serialize.c b/epid/member/tiny/math/src/serialize.c
new file mode 100644
index 0000000..3cdc5e9
--- /dev/null
+++ b/epid/member/tiny/math/src/serialize.c
@@ -0,0 +1,232 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Implementation of de/serialize functionality.
+/*! \file */
+
+#include "epid/member/tiny/math/serialize.h"
+#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/stdlib/endian.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+#if !defined(UNOPTIMIZED_SERIALIZATION)
+void SwapNativeAndPortableLayout(void* dest, size_t dest_size, void const* src,
+ size_t src_size) {
+ size_t i, j;
+#if defined(DEBUG)
+ if (dest_size != src_size || 0 != src_size % 32) {
+ memset(dest, 0xff, dest_size);
+ return;
+ }
+#else // defined(DEBUG)
+ (void)dest_size;
+#endif // defined(DEBUG)
+ for (i = 0; i < src_size; i += 32) {
+ for (j = 0; j < 32 / 2; j += sizeof(uint32_t)) {
+ uint32_t tmp = htobe32(
+ *(uint32_t*)((uint8_t*)src + i + j)); // handle src==dest case
+ *(uint32_t*)((uint8_t*)dest + i + j) =
+ htobe32(*(uint32_t*)((uint8_t*)src + i + 32 - sizeof(uint32_t) - j));
+ *(uint32_t*)((uint8_t*)dest + i + 32 - sizeof(uint32_t) - j) = tmp;
+ }
+ }
+}
+#endif // !defined(UNOPTIMIZED_SERIALIZATION)
+
+void* Uint32Serialize(OctStr32* dest, uint32_t src) {
+ int i;
+ for (i = 0; i < 4; i++)
+ dest->data[i] =
+ (char)((src >> (24 - 8 * i)) &
+ 0x000000FF); // get the ith byte of num, in little-endian order
+ return dest->data + 4;
+}
+
+void const* Uint32Deserialize(uint32_t* dest, OctStr32 const* src) {
+ int i;
+ *dest = 0;
+ for (i = 0; i < 4; i++) {
+ *dest <<= 8;
+ *dest |= (uint32_t)(*(&src->data[i]) & 0x000000FF);
+ }
+ return src->data + 4;
+}
+
+void* VliSerialize(BigNumStr* dest, VeryLargeInt const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ int i;
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
+ dest = Uint32Serialize((OctStr32*)dest, src->word[i]);
+ }
+ return dest;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* VliDeserialize(VeryLargeInt* dest, BigNumStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ int i;
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
+ src = Uint32Deserialize(dest->word + i, (OctStr32 const*)src);
+ }
+ return src;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* FqSerialize(FqElemStr* dest, FqElem const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ dest = VliSerialize((BigNumStr*)dest, &src->limbs);
+ return dest;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* FqDeserialize(FqElem* dest, FqElemStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ src = VliDeserialize(&dest->limbs, (BigNumStr const*)src);
+ return src;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+#if defined(UNOPTIMIZED_SERIALIZATION)
+static void* Fq2Serialize(Fq2ElemStr* dest, Fq2Elem const* src) {
+ FqSerialize(&dest->a[0], &src->x0);
+ FqSerialize(&dest->a[1], &src->x1);
+ return dest + sizeof(*dest);
+}
+
+static void const* Fq2Deserialize(Fq2Elem* dest, Fq2ElemStr const* src) {
+ FqDeserialize(&dest->x0, &src->a[0]);
+ FqDeserialize(&dest->x1, &src->a[1]);
+ return src + sizeof(*src);
+}
+
+static void* Fq6Serialize(Fq6ElemStr* dest, Fq6Elem const* src) {
+ Fq2Serialize(&dest->a[0], &src->y0);
+ Fq2Serialize(&dest->a[1], &src->y1);
+ Fq2Serialize(&dest->a[2], &src->y2);
+ return dest + sizeof(*dest);
+}
+
+static void const* Fq6Deserialize(Fq6Elem* dest, Fq6ElemStr const* src) {
+ Fq2Deserialize(&dest->y0, &src->a[0]);
+ Fq2Deserialize(&dest->y1, &src->a[1]);
+ Fq2Deserialize(&dest->y2, &src->a[2]);
+ return src + sizeof(*src);
+}
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+
+void const* Fq12Deserialize(Fq12Elem* dest, Fq12ElemStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ Fq6Deserialize(&dest->z0, &src->a[0]);
+ Fq6Deserialize(&dest->z1, &src->a[1]);
+ return src + sizeof(*src);
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* Fq12Serialize(Fq12ElemStr* dest, Fq12Elem const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ Fq6Serialize(&dest->a[0], &src->z0);
+ Fq6Serialize(&dest->a[1], &src->z1);
+ return dest + sizeof(*dest);
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* FpSerialize(FpElemStr* dest, FpElem const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ dest = VliSerialize((BigNumStr*)dest, &src->limbs);
+ return dest;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* FpDeserialize(FpElem* dest, FpElemStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ src = VliDeserialize(&dest->limbs, (BigNumStr const*)src);
+ return src;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* EFqSerialize(G1ElemStr* dest, EccPointFq const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ dest = FqSerialize((FqElemStr*)dest, &src->x);
+ dest = FqSerialize((FqElemStr*)dest, &src->y);
+ return dest;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* EFqDeserialize(EccPointFq* dest, G1ElemStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ src = FqDeserialize(&dest->x, (FqElemStr const*)src);
+ src = FqDeserialize(&dest->y, (FqElemStr const*)src);
+ return src;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* EFq2Serialize(G2ElemStr* dest, EccPointFq2 const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ dest = FqSerialize((FqElemStr*)dest, &src->x.x0);
+ dest = FqSerialize((FqElemStr*)dest, &src->x.x1);
+ dest = FqSerialize((FqElemStr*)dest, &src->y.x0);
+ dest = FqSerialize((FqElemStr*)dest, &src->y.x1);
+ return dest;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* EFq2Deserialize(EccPointFq2* dest, G2ElemStr const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ src = FqDeserialize(&dest->x.x0, (FqElemStr const*)src);
+ src = FqDeserialize(&dest->x.x1, (FqElemStr const*)src);
+ src = FqDeserialize(&dest->y.x0, (FqElemStr const*)src);
+ src = FqDeserialize(&dest->y.x1, (FqElemStr const*)src);
+ return src;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
diff --git a/epid/member/tiny/math/src/sha256.c b/epid/member/tiny/math/src/sha256.c
new file mode 100644
index 0000000..22b6fd1
--- /dev/null
+++ b/epid/member/tiny/math/src/sha256.c
@@ -0,0 +1,225 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/// A SHA-256 implementation.
+/*! \file */
+
+#include "epid/member/tiny/math/sha256.h"
+
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static void sha256_compress(unsigned int* iv, const uint8_t* data);
+
+void tc_sha256_init(sha256_state* s) {
+ /*
+ * Setting the initial state values.
+ * These values correspond to the first 32 bits of the fractional parts
+ * of the square roots of the first 8 primes: 2, 3, 5, 7, 11, 13, 17
+ * and 19.
+ */
+ (void)memset((uint8_t*)s, 0x00, sizeof(*s));
+ s->iv[0] = 0x6a09e667;
+ s->iv[1] = 0xbb67ae85;
+ s->iv[2] = 0x3c6ef372;
+ s->iv[3] = 0xa54ff53a;
+ s->iv[4] = 0x510e527f;
+ s->iv[5] = 0x9b05688c;
+ s->iv[6] = 0x1f83d9ab;
+ s->iv[7] = 0x5be0cd19;
+}
+
+void tc_sha256_update(sha256_state* s, const uint8_t* data, size_t datalen) {
+ while (datalen-- > 0) {
+ s->leftover[s->leftover_offset++] = *(data++);
+ if (s->leftover_offset >= SHA256_BLOCK_SIZE) {
+ sha256_compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ s->bits_hashed += (SHA256_BLOCK_SIZE << 3);
+ }
+ }
+}
+
+void tc_sha256_final(uint8_t* digest, sha256_state* s) {
+ unsigned int i;
+
+ s->bits_hashed += (s->leftover_offset << 3);
+
+ s->leftover[s->leftover_offset++] = 0x80; /* always room for one byte */
+ if (s->leftover_offset > (sizeof(s->leftover) - 8)) {
+ /* there is not room for all the padding in this block */
+ (void)memset(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - s->leftover_offset);
+ sha256_compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ }
+
+ /* add the padding and the length in big-Endian format */
+ (void)memset(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - 8 - s->leftover_offset);
+ s->leftover[sizeof(s->leftover) - 1] = (uint8_t)(s->bits_hashed);
+ s->leftover[sizeof(s->leftover) - 2] = (uint8_t)(s->bits_hashed >> 8);
+ s->leftover[sizeof(s->leftover) - 3] = (uint8_t)(s->bits_hashed >> 16);
+ s->leftover[sizeof(s->leftover) - 4] = (uint8_t)(s->bits_hashed >> 24);
+ s->leftover[sizeof(s->leftover) - 5] = (uint8_t)(s->bits_hashed >> 32);
+ s->leftover[sizeof(s->leftover) - 6] = (uint8_t)(s->bits_hashed >> 40);
+ s->leftover[sizeof(s->leftover) - 7] = (uint8_t)(s->bits_hashed >> 48);
+ s->leftover[sizeof(s->leftover) - 8] = (uint8_t)(s->bits_hashed >> 56);
+
+ /* hash the padding and length */
+ sha256_compress(s->iv, s->leftover);
+
+ /* copy the iv out to digest */
+ for (i = 0; i < SHA256_STATE_BLOCKS; ++i) {
+ unsigned int t = *((unsigned int*)&s->iv[i]);
+ *digest++ = (uint8_t)(t >> 24);
+ *digest++ = (uint8_t)(t >> 16);
+ *digest++ = (uint8_t)(t >> 8);
+ *digest++ = (uint8_t)(t);
+ }
+
+ /* destroy the current state */
+ (void)memset(s, 0, sizeof(*s));
+}
+
+/*
+ * Initializing SHA-256 Hash constant words K.
+ * These values correspond to the first 32 bits of the fractional parts of the
+ * cube roots of the first 64 primes between 2 and 311.
+ */
+static const unsigned int k256[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
+ 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
+ 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
+ 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
+ 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
+ 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
+
+static unsigned int ROTR(unsigned int a, unsigned int n) {
+ return (((a) >> n) | ((a) << (32 - n)));
+}
+
+#define Sigma0(a) (ROTR((a), 2) ^ ROTR((a), 13) ^ ROTR((a), 22))
+#define Sigma1(a) (ROTR((a), 6) ^ ROTR((a), 11) ^ ROTR((a), 25))
+#define sigma0(a) (ROTR((a), 7) ^ ROTR((a), 18) ^ ((a) >> 3))
+#define sigma1(a) (ROTR((a), 17) ^ ROTR((a), 19) ^ ((a) >> 10))
+
+#define Ch(a, b, c) (((a) & (b)) ^ ((~(a)) & (c)))
+#define Maj(a, b, c) (((a) & (b)) ^ ((a) & (c)) ^ ((b) & (c)))
+
+static unsigned int BigEndian(const uint8_t** c) {
+ unsigned int n = 0;
+
+ n = (((unsigned int)(*((*c)++))) << 24);
+ n |= ((unsigned int)(*((*c)++)) << 16);
+ n |= ((unsigned int)(*((*c)++)) << 8);
+ n |= ((unsigned int)(*((*c)++)));
+ return n;
+}
+
+static void sha256_compress(unsigned int* iv, const uint8_t* data) {
+ unsigned int a, b, c, d, e, f, g, h;
+ unsigned int s0, s1;
+ unsigned int t1, t2;
+ unsigned int work_space[16];
+ unsigned int n;
+ unsigned int i;
+
+ a = iv[0];
+ b = iv[1];
+ c = iv[2];
+ d = iv[3];
+ e = iv[4];
+ f = iv[5];
+ g = iv[6];
+ h = iv[7];
+
+ for (i = 0; i < 16; ++i) {
+ n = BigEndian(&data);
+ t1 = work_space[i] = n;
+ t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i];
+ t2 = Sigma0(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ for (; i < 64; ++i) {
+ s0 = work_space[(i + 1) & 0x0f];
+ s0 = sigma0(s0);
+ s1 = work_space[(i + 14) & 0x0f];
+ s1 = sigma1(s1);
+
+ t1 = work_space[i & 0xf] += s0 + s1 + work_space[(i + 9) & 0xf];
+ t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i];
+ t2 = Sigma0(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ iv[0] += a;
+ iv[1] += b;
+ iv[2] += c;
+ iv[3] += d;
+ iv[4] += e;
+ iv[5] += f;
+ iv[6] += g;
+ iv[7] += h;
+}
diff --git a/epid/member/tiny/math/src/sha512.c b/epid/member/tiny/math/src/sha512.c
new file mode 100644
index 0000000..e18cd03
--- /dev/null
+++ b/epid/member/tiny/math/src/sha512.c
@@ -0,0 +1,169 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// A SHA-512 implementation.
+/*! \file */
+
+#include "epid/member/tiny/math/sha512.h"
+
+#include <stdint.h>
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static void sha512_compress(uint64_t* iv, void const* in);
+
+void tinysha512_init(sha512_state* s) {
+ s->iv[0] = 0x6a09e667f3bcc908ULL;
+ s->iv[1] = 0xbb67ae8584caa73bULL;
+ s->iv[2] = 0x3c6ef372fe94f82bULL;
+ s->iv[3] = 0xa54ff53a5f1d36f1ULL;
+ s->iv[4] = 0x510e527fade682d1ULL;
+ s->iv[5] = 0x9b05688c2b3e6c1fULL;
+ s->iv[6] = 0x1f83d9abfb41bd6bULL;
+ s->iv[7] = 0x5be0cd19137e2179ULL;
+
+ s->bits_hashed_high = s->bits_hashed_low = (uint64_t)0;
+ s->leftover_offset = 0;
+}
+
+void tinysha512_update(sha512_state* s, void const* data, size_t data_length) {
+ unsigned char const* tmp_data = (unsigned char const*)data;
+
+ while (data_length-- > 0) {
+ s->leftover[s->leftover_offset++] = *(tmp_data++);
+ if (s->leftover_offset >= SHA512_BLOCK_SIZE) {
+ sha512_compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ s->bits_hashed_low += (SHA512_BLOCK_SIZE << 3);
+ }
+ }
+}
+
+void tinysha512_final(unsigned char* digest, sha512_state* s) {
+ size_t i, j;
+
+ s->bits_hashed_low += (s->leftover_offset << 3);
+
+ s->leftover[s->leftover_offset++] = 0x80;
+ /* there is always room for one byte */
+ if (s->leftover_offset > (sizeof(s->leftover) - 16)) {
+ /* the data's bit length cannot be encoded in the last block */
+ (void)memset(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - s->leftover_offset);
+ sha512_compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ }
+
+ (void)memset(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - 16 - s->leftover_offset);
+ for (i = 0; i < 8; i++) {
+ s->leftover[sizeof(s->leftover) - (i + 1)] =
+ (unsigned char)(s->bits_hashed_low >> (8 * i));
+ s->leftover[sizeof(s->leftover) - (i + 1) - 8] =
+ (unsigned char)(s->bits_hashed_high >> (8 * i));
+ }
+ sha512_compress(s->iv, s->leftover);
+
+ for (i = 0; i < SHA512_DIGEST_WORDS; ++i) {
+ uint64_t w = s->iv[i];
+ for (j = 0; j < 8; j++) {
+ digest[j] = (unsigned char)(w >> (8 * (7 - j)));
+ }
+ digest += 8;
+ }
+}
+
+#define B(x, j) \
+ (((uint64_t)(*(((unsigned char const*)(&x)) + j))) << ((7 - j) * 8))
+
+static uint64_t pull64(const uint64_t x) {
+ int16_t i;
+ uint64_t result = 0;
+ for (i = 0; i < 8; i++) result |= B(x, i);
+ return result;
+}
+static uint64_t ROTR(const uint64_t x, unsigned char s) {
+ return (x >> s) | (x << (64 - s));
+}
+
+#define Sigma0(x) (ROTR((x), 28) ^ ROTR((x), 34) ^ ROTR((x), 39))
+
+#define Sigma1(x) (ROTR((x), 14) ^ ROTR((x), 18) ^ ROTR((x), 41))
+#define sigma0(x) (ROTR((x), 1) ^ ROTR((x), 8) ^ ((x) >> 7))
+#define sigma1(x) (ROTR((x), 19) ^ ROTR((x), 61) ^ ((x) >> 6))
+
+#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+static const uint64_t k512[80] = {
+ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL,
+ 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
+ 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL,
+ 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+ 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL,
+ 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
+ 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL,
+ 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+ 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL,
+ 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
+ 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL,
+ 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+ 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL,
+ 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
+ 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL,
+ 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+ 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL,
+ 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
+ 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL,
+ 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+ 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL,
+ 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
+ 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL,
+ 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+ 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL,
+ 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
+ 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
+
+static void sha512_compress(uint64_t* iv, void const* in) {
+ const uint64_t* w = (const uint64_t*)in;
+ uint64_t a, e, t;
+ uint64_t work_space[80 + 9];
+ uint64_t* work_ptr;
+ int i;
+ volatile int j;
+
+ work_ptr = work_space + 80;
+ // j is declared volatile to prevent the optimizer from replacing the for loop
+ // with a memcpy
+ for (j = 0; j < 8; j++) work_ptr[j] = iv[j];
+
+ for (i = 0; i < 80; i++, work_ptr--) {
+ if (i < 16) {
+ t = pull64(w[i]);
+ } else {
+ t = sigma0(work_ptr[8 + 16 - 1]);
+ t += sigma1(work_ptr[8 + 16 - 14]);
+ t += work_ptr[8 + 16] + work_ptr[8 + 16 - 9];
+ }
+ work_ptr[8] = t;
+ t += work_ptr[7] + Sigma1(work_ptr[4]) +
+ Ch(work_ptr[4], work_ptr[5], work_ptr[6]) + k512[i];
+ e = work_ptr[3] + t;
+ a = t + Sigma0(work_ptr[0]) + Maj(work_ptr[0], work_ptr[1], work_ptr[2]);
+ work_ptr[-1] = a;
+ work_ptr[3] = e;
+ }
+
+ for (i = 0; i < 8; i++) iv[i] += work_ptr[i];
+}
diff --git a/epid/member/tiny/math/src/vli.c b/epid/member/tiny/math/src/vli.c
new file mode 100644
index 0000000..1ec9400
--- /dev/null
+++ b/epid/member/tiny/math/src/vli.c
@@ -0,0 +1,316 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/*
+===============================================================================
+
+Copyright (c) 2013, Kenneth MacKay
+All rights reserved.
+https://github.com/kmackay/micro-ecc
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===============================================================================
+*/
+/// Implementation of Large Integer math
+
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+
+uint32_t VliAdd(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right) {
+ uint32_t carry = 0;
+ uint32_t i;
+ for (i = 0; i < NUM_ECC_DIGITS; ++i) {
+ uint32_t sum = left->word[i] + right->word[i] + carry;
+ carry = (sum < left->word[i]) | ((sum == left->word[i]) && carry);
+ result->word[i] = sum;
+ }
+ return carry;
+}
+
+void VliMul(VeryLargeIntProduct* result, VeryLargeInt const* left,
+ VeryLargeInt const* right) {
+ uint64_t tmp_r1 = 0;
+ uint32_t tmp_r2 = 0;
+ uint32_t i, k;
+ /* Compute each digit of result in sequence, maintaining the carries. */
+ for (k = 0; k < (uint32_t)(NUM_ECC_DIGITS * 2 - 1); ++k) {
+ uint32_t min_idx =
+ (k < (uint32_t)NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
+ for (i = min_idx; i <= k && i < (uint32_t)NUM_ECC_DIGITS; ++i) {
+ uint64_t product = (uint64_t)left->word[i] * right->word[k - i];
+ tmp_r1 += product;
+ tmp_r2 += (tmp_r1 < product);
+ }
+ result->word[k] = (uint32_t)tmp_r1;
+ tmp_r1 = (tmp_r1 >> 32) | (((uint64_t)tmp_r2) << 32);
+ tmp_r2 = 0;
+ }
+ result->word[NUM_ECC_DIGITS * 2 - 1] = (uint32_t)tmp_r1;
+}
+
+void VliRShift(VeryLargeInt* result, VeryLargeInt const* in, uint32_t shift) {
+ uint32_t i;
+ for (i = 0; i < NUM_ECC_DIGITS - 1; i++) {
+ result->word[i] = (in->word[i] >> shift) | in->word[i + 1] << (32 - shift);
+ }
+ result->word[NUM_ECC_DIGITS - 1] = in->word[NUM_ECC_DIGITS - 1] >> shift;
+}
+
+uint32_t VliSub(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right) {
+ uint32_t borrow = 0;
+
+ int i;
+ for (i = 0; i < NUM_ECC_DIGITS; ++i) {
+ uint32_t diff = left->word[i] - right->word[i] - borrow;
+ borrow = (diff > left->word[i]) | ((diff == left->word[i]) && borrow);
+ result->word[i] = diff;
+ }
+ return borrow;
+}
+
+void VliSet(VeryLargeInt* result, VeryLargeInt const* in) {
+ uint32_t i;
+ for (i = 0; i < NUM_ECC_DIGITS; ++i) {
+ result->word[i] = in->word[i];
+ }
+}
+
+void VliClear(VeryLargeInt* result) {
+ uint32_t i;
+ for (i = 0; i < NUM_ECC_DIGITS; ++i) {
+ result->word[i] = 0;
+ }
+}
+
+int VliIsZero(VeryLargeInt const* in) {
+ uint32_t i, acc = 0;
+ for (i = 0; i < NUM_ECC_DIGITS; ++i) {
+ acc += (in->word[i] != 0);
+ }
+ return (!acc);
+}
+
+void VliCondSet(VeryLargeInt* result, VeryLargeInt const* true_val,
+ VeryLargeInt const* false_val, int truth_val) {
+ int i;
+ for (i = 0; i < NUM_ECC_DIGITS; i++)
+ result->word[i] = (!truth_val) * false_val->word[i] +
+ (truth_val != 0) * true_val->word[i];
+}
+
+uint32_t VliTestBit(VeryLargeInt const* in, uint32_t bit) {
+ return ((in->word[bit >> 5] >> (bit & 31)) &
+ 1); // p_bit % 32 = p_bit & 0x0000001F = 31
+}
+
+int VliRand(VeryLargeInt* result, BitSupplier rnd_func, void* rnd_param) {
+ uint32_t t[NUM_ECC_DIGITS] = {0};
+ if (rnd_func(t, sizeof(VeryLargeInt) * 8, rnd_param)) {
+ return 0;
+ }
+ VliDeserialize(result, (BigNumStr const*)t);
+ return 1;
+}
+
+int VliCmp(VeryLargeInt const* left, VeryLargeInt const* right) {
+ int i, cmp = 0;
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; --i) {
+ cmp |=
+ ((left->word[i] > right->word[i]) - (left->word[i] < right->word[i])) *
+ (!cmp);
+ }
+ return cmp;
+}
+
+void VliModAdd(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod) {
+ VeryLargeInt tmp;
+ uint32_t carry = VliAdd(result, left, right);
+ carry = VliSub(&tmp, result, mod) - carry;
+ VliCondSet(result, result, &tmp, carry);
+}
+
+void VliModSub(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod) {
+ VeryLargeInt tmp;
+ uint32_t borrow = VliSub(result, left, right);
+ VliAdd(&tmp, result, mod);
+ VliCondSet(result, &tmp, result, borrow);
+}
+
+void VliModMul(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod) {
+ VeryLargeIntProduct product;
+ VliMul(&product, left, right);
+ VliModBarrett(result, &product, mod);
+}
+
+static void vliSquare(VeryLargeIntProduct* p_result,
+ VeryLargeInt const* p_left) {
+ uint64_t tmp_r1 = 0;
+ uint32_t tmp_r2 = 0;
+ uint32_t i, k;
+ for (k = 0; k < NUM_ECC_DIGITS * 2 - 1; ++k) {
+ uint32_t min_idx = (k < NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
+ for (i = min_idx; i <= k && i <= k - i; ++i) {
+ uint64_t l_product = (uint64_t)p_left->word[i] * p_left->word[k - i];
+ if (i < k - i) {
+ tmp_r2 += l_product >> 63;
+ l_product *= 2;
+ }
+ tmp_r1 += l_product;
+ tmp_r2 += (tmp_r1 < l_product);
+ }
+ p_result->word[k] = (uint32_t)tmp_r1;
+ tmp_r1 = (tmp_r1 >> 32) | (((uint64_t)tmp_r2) << 32);
+ tmp_r2 = 0;
+ }
+
+ p_result->word[NUM_ECC_DIGITS * 2 - 1] = (uint32_t)tmp_r1;
+}
+
+void VliModExp(VeryLargeInt* result, VeryLargeInt const* base,
+ VeryLargeInt const* exp, VeryLargeInt const* mod) {
+ VeryLargeInt acc, tmp;
+ VeryLargeIntProduct product;
+ uint32_t j;
+ int i;
+ VliClear(&acc);
+ acc.word[0] = 1;
+ for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
+ for (j = 1U << 31; j > 0; j = j >> 1) {
+ vliSquare(&product, &acc);
+ VliModBarrett(&acc, &product, mod);
+ VliMul(&product, &acc, base);
+ VliModBarrett(&tmp, &product, mod);
+ VliCondSet(&acc, &tmp, &acc, j & (exp->word[i]));
+ }
+ }
+ VliSet(result, &acc);
+}
+
+void VliModInv(VeryLargeInt* result, VeryLargeInt const* input,
+ VeryLargeInt const* mod) {
+ VeryLargeInt power;
+ VliSet(&power, mod);
+ power.word[0] -= 2;
+ VliModExp(result, input, &power, mod);
+}
+
+void VliModSquare(VeryLargeInt* result, VeryLargeInt const* input,
+ VeryLargeInt const* mod) {
+ VeryLargeIntProduct product;
+ vliSquare(&product, input);
+ VliModBarrett(result, &product, mod);
+}
+
+/* Computes p_result = p_in << c, returning carry.
+ * Can modify in place (if p_result == p_in). 0 < p_shift < 32. */
+static uint32_t vliLShift(VeryLargeIntProduct* p_result,
+ VeryLargeIntProduct const* p_in, uint32_t p_shift) {
+ int i;
+ uint32_t carry = p_in->word[NUM_ECC_DIGITS * 2 - 1];
+ for (i = NUM_ECC_DIGITS * 2 - 1; i > 0; --i)
+ p_result->word[i] =
+ ((p_in->word[i] << p_shift) | (p_in->word[i - 1] >> (32 - p_shift)));
+ p_result->word[0] = p_in->word[0] << p_shift;
+ return carry >> (32 - p_shift);
+}
+
+static void vliScalarMult(VeryLargeInt* p_result, VeryLargeInt* p_left,
+ uint32_t p_right) {
+ int i;
+ uint64_t tmpresult;
+ uint32_t left = 0, right;
+ for (i = 0; i < NUM_ECC_DIGITS - 1; i++) {
+ tmpresult = p_left->word[i] * ((uint64_t)p_right);
+ right = left + ((uint32_t)tmpresult);
+ left = (right < left) + ((uint32_t)(tmpresult >> 32));
+ p_result->word[i] = right;
+ }
+ p_result->word[NUM_ECC_DIGITS - 1] = left;
+}
+
+static void vliProdRShift(VeryLargeIntProduct* result,
+ VeryLargeIntProduct const* in, uint32_t shift,
+ uint32_t len) {
+ uint32_t i;
+ for (i = 0; i < len - 1; i++) {
+ result->word[i] = (in->word[i] >> shift) | in->word[i + 1] << (32 - shift);
+ }
+ result->word[len - 1] = in->word[len - 1] >> shift;
+}
+
+/* WARNING THIS METHOD MAKES STRONG ASSUMPTIONS ABOUT THE INVOLVED PRIMES
+ * All primes used for computations in Intel(R) EPID 2.0 begin with 32 ones.
+ * This method assumes 2^256 - p_mod
+ * begins with 32 zeros, and is tuned to this assumption. Violating this
+ * assumption will cause it not
+ * to work. It also assumes that it does not end with 32 zeros.
+ */
+void VliModBarrett(VeryLargeInt* result, VeryLargeIntProduct const* input,
+ VeryLargeInt const* mod) {
+ int i;
+ VeryLargeIntProduct tmpprod;
+ VeryLargeInt negprime, linear;
+ uint32_t carry = 0;
+ VliSet((VeryLargeInt*)&tmpprod.word[0], (VeryLargeInt const*)&input->word[0]);
+ VliSet((VeryLargeInt*)&tmpprod.word[NUM_ECC_DIGITS],
+ (VeryLargeInt const*)&input->word[NUM_ECC_DIGITS]);
+ // negative prime is ~q + 1, so we store this in
+ for (i = 0; i < NUM_ECC_DIGITS - 1; i++) negprime.word[i] = ~mod->word[i];
+ negprime.word[0]++;
+ for (i = 0; i < NUM_ECC_DIGITS; i++) {
+ vliScalarMult(&linear, &negprime, tmpprod.word[2 * NUM_ECC_DIGITS - 1]);
+ tmpprod.word[2 * NUM_ECC_DIGITS - 1] = 0;
+ tmpprod.word[2 * NUM_ECC_DIGITS - 1] =
+ VliAdd((VeryLargeInt*)&tmpprod.word[NUM_ECC_DIGITS - 1],
+ (VeryLargeInt const*)&tmpprod.word[7], &linear);
+ vliLShift(&tmpprod, &tmpprod, 31);
+ }
+ // shift the 256+32-NUM_ECC_DIGITS-1 bits in the largest 9 limbs back to the
+ // base
+ vliProdRShift(&tmpprod,
+ (VeryLargeIntProduct const*)&tmpprod.word[NUM_ECC_DIGITS - 1],
+ (31 * 8) % 32, NUM_ECC_DIGITS + 1);
+ vliScalarMult(&linear, &negprime, tmpprod.word[NUM_ECC_DIGITS]);
+ carry = VliAdd((VeryLargeInt*)&tmpprod.word[0],
+ (VeryLargeInt const*)&tmpprod.word[0],
+ (VeryLargeInt const*)&linear);
+ carry |= (-1 < VliCmp((VeryLargeInt const*)&tmpprod.word[0], mod));
+ vliScalarMult(&linear, &negprime, carry);
+ VliAdd(result, (VeryLargeInt const*)&tmpprod.word[0], &linear);
+}
diff --git a/epid/member/tiny/math/unittests/cmp-testhelper.cc b/epid/member/tiny/math/unittests/cmp-testhelper.cc
new file mode 100644
index 0000000..8956f75
--- /dev/null
+++ b/epid/member/tiny/math/unittests/cmp-testhelper.cc
@@ -0,0 +1,71 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Comparators for tiny math types.
+/*! \file */
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+#include <cstring>
+
+extern "C" {
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+bool operator==(VeryLargeInt const& lhs, VeryLargeInt const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(VeryLargeIntProduct const& lhs,
+ VeryLargeIntProduct const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+bool operator==(FpElem const& lhs, FpElem const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(FqElem const& lhs, FqElem const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(Fq2Elem const& lhs, Fq2Elem const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(Fq6Elem const& lhs, Fq6Elem const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(Fq12Elem const& lhs, Fq12Elem const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(EccPointFq const& lhs, EccPointFq const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(EccPointJacobiFq const& lhs, EccPointJacobiFq const& rhs) {
+ return 0 != EFqEq(&lhs, &rhs);
+}
+
+bool operator==(EccPointFq2 const& lhs, EccPointFq2 const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(EccPointJacobiFq2 const& lhs, EccPointJacobiFq2 const& rhs) {
+ return 0 != EFq2Eq(&lhs, &rhs);
+}
diff --git a/epid/member/tiny/math/unittests/cmp-testhelper.h b/epid/member/tiny/math/unittests/cmp-testhelper.h
new file mode 100644
index 0000000..c8a688f
--- /dev/null
+++ b/epid/member/tiny/math/unittests/cmp-testhelper.h
@@ -0,0 +1,65 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Comparators for tiny math types.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_UNITTESTS_CMP_TESTHELPER_H_
+#define EPID_MEMBER_TINY_MATH_UNITTESTS_CMP_TESTHELPER_H_
+
+typedef struct VeryLargeInt VeryLargeInt;
+typedef struct VeryLargeIntProduct VeryLargeIntProduct;
+typedef struct FpElem FpElem;
+typedef struct FqElem FqElem;
+typedef struct Fq2Elem Fq2Elem;
+typedef struct Fq6Elem Fq6Elem;
+typedef struct Fq12Elem Fq12Elem;
+typedef struct EccPointFq EccPointFq;
+typedef struct EccPointJacobiFq EccPointJacobiFq;
+typedef struct EccPointFq2 EccPointFq2;
+typedef struct EccPointJacobiFq2 EccPointJacobiFq2;
+
+/// compares VeryLargeInt values
+bool operator==(VeryLargeInt const& lhs, VeryLargeInt const& rhs);
+bool operator==(VeryLargeIntProduct const& lhs, VeryLargeIntProduct const& rhs);
+
+/// compares FpElem values
+bool operator==(FpElem const& lhs, FpElem const& rhs);
+
+/// compares FqElem values
+bool operator==(FqElem const& lhs, FqElem const& rhs);
+
+/// compares Fq2Elem values
+bool operator==(Fq2Elem const& lhs, Fq2Elem const& rhs);
+
+/// compares Fq6Elem values
+bool operator==(Fq6Elem const& lhs, Fq6Elem const& rhs);
+
+/// compares Fq12Elem values
+bool operator==(Fq12Elem const& lhs, Fq12Elem const& rhs);
+
+/// compares EccPointFq values
+bool operator==(EccPointFq const& lhs, EccPointFq const& rhs);
+
+/// compares EccPointJacobiFq values
+bool operator==(EccPointJacobiFq const& lhs, EccPointJacobiFq const& rhs);
+
+/// compares EccPointFq2 values
+bool operator==(EccPointFq2 const& lhs, EccPointFq2 const& rhs);
+
+/// compares EccPointJacobiFq2 values
+bool operator==(EccPointJacobiFq2 const& lhs, EccPointJacobiFq2 const& rhs);
+
+#endif // EPID_MEMBER_TINY_MATH_UNITTESTS_CMP_TESTHELPER_H_
diff --git a/epid/member/tiny/math/unittests/efq-test.cc b/epid/member/tiny/math/unittests/efq-test.cc
new file mode 100644
index 0000000..b33e5d6
--- /dev/null
+++ b/epid/member/tiny/math/unittests/efq-test.cc
@@ -0,0 +1,714 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of EFq implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+#include <cstring>
+#include <random>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+#include "epid/member/tiny/math/unittests/onetimepad.h"
+
+extern "C" {
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/vli.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// EFqMulSSCM
+TEST(TinyEFqTest, EFqMulSSCMWorks) {
+ const EccPointJacobiFq expected = {
+ {0xacd848b1, 0xe3d60553, 0x69271cd1, 0x7cf6090e, 0x16c63bcd, 0xdb0c6cf0,
+ 0x2ab60283, 0x38fc72a8},
+ {0xf7e0f7d1, 0x6b0cf194, 0x5cf18c77, 0x82a4b960, 0xa6c40a30, 0xf0b3b20f,
+ 0x5f1a477b, 0x7e2a6668},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+ const EccPointJacobiFq left = {
+ {0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357, 0x4780716c,
+ 0xffd94b0f, 0x5e643124},
+ {0x5e9cb480, 0x6d4aaf9c, 0x99f1f606, 0x222d89b0, 0x30b79eab, 0x88844bd6,
+ 0xc65e7c30, 0x4830c4ec},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+ const FpElem power = {0x0adf9a12, 0x5cbc9ef4, 0x91762984, 0xa08a22fb,
+ 0x52a6fddf, 0xf51e743e, 0x7b47b24b, 0x389f865f};
+
+ EccPointJacobiFq actual = {0};
+
+ EFqMulSSCM(&actual, &left, &power);
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(TinyEFqTest, EFqMulSSCMWorksInPlace) {
+ const EccPointJacobiFq expected = {
+ {0xacd848b1, 0xe3d60553, 0x69271cd1, 0x7cf6090e, 0x16c63bcd, 0xdb0c6cf0,
+ 0x2ab60283, 0x38fc72a8},
+ {0xf7e0f7d1, 0x6b0cf194, 0x5cf18c77, 0x82a4b960, 0xa6c40a30, 0xf0b3b20f,
+ 0x5f1a477b, 0x7e2a6668},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+ EccPointJacobiFq left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x5e9cb480, 0x6d4aaf9c, 0x99f1f606, 0x222d89b0,
+ 0x30b79eab, 0x88844bd6, 0xc65e7c30, 0x4830c4ec},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}};
+ const FpElem power = {0x0adf9a12, 0x5cbc9ef4, 0x91762984, 0xa08a22fb,
+ 0x52a6fddf, 0xf51e743e, 0x7b47b24b, 0x389f865f};
+
+ EFqMulSSCM(&left, &left, &power);
+ EXPECT_EQ(expected, left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqMultiExp
+
+TEST(TinyEFqTest, EFqAffineExpWorks) {
+ EccPointFq efq_left = {0};
+ EccPointFq efq_right = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq efq_expect = {{{0x79171d4b, 0x0f5ac562, 0x3b911d03, 0x0992a2dc,
+ 0x3130dd84, 0x16344c80, 0x436ca13c, 0xaf1d9819}},
+ {{0x742268cd, 0x070b4ac7, 0x7f2b13b7, 0xe167da7f,
+ 0xd84d16af, 0x9e824ebe, 0x6b5dc0f0, 0x90bd1aa3}}};
+
+ FpElem fp_exp = {3};
+
+ EFqAffineExp(&efq_left, &efq_right, &fp_exp);
+
+ EXPECT_EQ(efq_expect, efq_left);
+}
+TEST(TinyEFqTest, EFqAffineExpWorksInPlace) {
+ EccPointFq efq_right = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq efq_expect = {{{0x79171d4b, 0x0f5ac562, 0x3b911d03, 0x0992a2dc,
+ 0x3130dd84, 0x16344c80, 0x436ca13c, 0xaf1d9819}},
+ {{0x742268cd, 0x070b4ac7, 0x7f2b13b7, 0xe167da7f,
+ 0xd84d16af, 0x9e824ebe, 0x6b5dc0f0, 0x90bd1aa3}}};
+
+ FpElem fp_exp = {3};
+
+ EFqAffineExp(&efq_right, &efq_right, &fp_exp);
+
+ EXPECT_EQ(efq_expect, efq_right);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqAffineMultiExp
+TEST(TinyEFqTest, EFqAffineMultiExpWorks) {
+ // eFq2^3*eFq2^3
+ EccPointFq efq_left = {0};
+ EccPointFq efq_right = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq efq_expect = {{{0x1a178986, 0xeeb06c08, 0x857d79f0, 0x246d0ed6,
+ 0xed31a3b2, 0x7bf832a0, 0x81a8a27b, 0x3d0cab80}},
+ {{0xfe2a1509, 0x41cda394, 0x42b33efb, 0x2811fa22,
+ 0x0ad56486, 0xe52b1a56, 0xf6dc881c, 0x6fee593f}}};
+
+ FpElem fp_exp = {3};
+
+ EFqAffineMultiExp(&efq_left, &efq_right, &fp_exp, &efq_right, &fp_exp);
+
+ EXPECT_EQ(efq_expect, efq_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqMultiExp
+TEST(TinyEFqTest, EFqMultiExpWorks) {
+ EccPointFq efq_left = {0};
+ EccPointFq efq_right = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq efq_expect = {{{0x1a178986, 0xeeb06c08, 0x857d79f0, 0x246d0ed6,
+ 0xed31a3b2, 0x7bf832a0, 0x81a8a27b, 0x3d0cab80}},
+ {{0xfe2a1509, 0x41cda394, 0x42b33efb, 0x2811fa22,
+ 0x0ad56486, 0xe52b1a56, 0xf6dc881c, 0x6fee593f}}};
+
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq efqj_right;
+
+ FpElem fp_exp = {3};
+
+ EFqFromAffine(&efqj_right, &efq_right);
+ EFqMultiExp(&efqj_left, &efqj_right, &fp_exp, &efqj_right, &fp_exp);
+ EFqToAffine(&efq_left, &efqj_left);
+
+ EXPECT_EQ(efq_expect, efq_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqAffineAdd
+TEST(TinyEFqTest, EFqAffineAddWorks) {
+ EccPointFq efq_left = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq const efq_expect = {
+ {{0x7305f782, 0x84101559, 0xe065da04, 0xfd373fcf, 0x31d2f725, 0x9b420bdc,
+ 0x622ac9c3, 0xba0ef378}},
+ {{0x97b2adf0, 0x2935c14b, 0xfc6415b0, 0x48ba036a, 0x61ca7383, 0xcff7f03d,
+ 0x23a2c3e6, 0x0df0d4a5}}};
+
+ EFqAffineAdd(&efq_left, &efq_left, &efq_left);
+ EXPECT_EQ(efq_expect, efq_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqAffineDbl
+TEST(TinyEFqTest, EFqAffineDblWorks) {
+ EccPointFq efq_left = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6,
+ 0x0ac0b46b, 0x557a5f30, 0xaf075250, 0x786528cb}}};
+
+ EccPointFq const efq_expect = {
+ {{0x7305f782, 0x84101559, 0xe065da04, 0xfd373fcf, 0x31d2f725, 0x9b420bdc,
+ 0x622ac9c3, 0xba0ef378}},
+ {{0x97b2adf0, 0x2935c14b, 0xfc6415b0, 0x48ba036a, 0x61ca7383, 0xcff7f03d,
+ 0x23a2c3e6, 0x0df0d4a5}}};
+
+ EFqAffineDbl(&efq_left, &efq_left);
+ EXPECT_EQ(efq_expect, efq_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqDbl
+TEST(TinyEFqTest, EFqDblWorks) {
+ EccPointJacobiFq efqj_left = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EccPointJacobiFq const efqj_expect = {
+ {{0x7305f782, 0x84101559, 0xe065da04, 0xfd373fcf, 0x31d2f725, 0x9b420bdc,
+ 0x622ac9c3, 0xba0ef378}},
+ {{0x97b2adf0, 0x2935c14b, 0xfc6415b0, 0x48ba036a, 0x61ca7383, 0xcff7f03d,
+ 0x23a2c3e6, 0x0df0d4a5}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EFqDbl(&efqj_left, &efqj_left);
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqAdd
+TEST(TinyEFqTest, EFqAddWorks) {
+ EccPointJacobiFq efqj_left = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EccPointJacobiFq const efqj_expect = {
+ {{0x7305f782, 0x84101559, 0xe065da04, 0xfd373fcf, 0x31d2f725, 0x9b420bdc,
+ 0x622ac9c3, 0xba0ef378}},
+ {{0x97b2adf0, 0x2935c14b, 0xfc6415b0, 0x48ba036a, 0x61ca7383, 0xcff7f03d,
+ 0x23a2c3e6, 0x0df0d4a5}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EFqAdd(&efqj_left, &efqj_left, &efqj_left);
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqRand
+
+// Checks if EFqRand can generate points with Y >= q+1
+TEST(TinyEFqTest, EFqRandCanGenerateBigY) {
+ OneTimePad otp({
+ 0x25, 0xeb, 0x8c, 0x48, 0xff, 0x89, 0xcb, 0x85, 0x4f, 0xc0, 0x90, 0x81,
+ 0xcc, 0x47, 0xed, 0xfc, 0x86, 0x19, 0xb2, 0x14, 0xfe, 0x65, 0x92, 0xd4,
+ 0x8b, 0xfc, 0xea, 0x9c, 0x9d, 0x8e, 0x32, 0x44, 0xd7, 0xd7, 0xe9, 0xf1,
+ 0xf7, 0xde, 0x60, 0x56, 0x8d, 0xe9, 0x89, 0x07, 0x3f, 0x3d, 0x16, 0x39,
+ });
+
+ // expected.y >= q+1
+ EccPointFq expected = {{0xd78542d3, 0xf824c127, 0x81eea621, 0x6990833d,
+ 0x9d843df6, 0x3df36126, 0x435e8eda, 0x2d267586},
+ {0x1B8DC14B, 0x5967C520, 0x61CECE5D, 0x0290B5BC,
+ 0x49278859, 0x2C523D9A, 0x6D0AE6DE, 0xAE5590C9}};
+
+ EccPointFq actual = {0};
+ EXPECT_TRUE(EFqRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+// Checks if EFqRand can generate points with Y <= q-1
+TEST(TinyEFqTest, EFqRandCanGenerateSmallY) {
+ OneTimePad otp({
+ 0x47, 0xe7, 0xb0, 0x36, 0x0f, 0x85, 0x91, 0xaa, 0x14, 0x76, 0xb0, 0x16,
+ 0xe5, 0x8d, 0xf1, 0x72, 0x61, 0xb5, 0x54, 0x0a, 0x60, 0xb7, 0x3d, 0x38,
+ 0xd9, 0x95, 0xe7, 0x60, 0xf9, 0xd3, 0x19, 0xf1, 0x8e, 0x8d, 0xd4, 0x74,
+ 0x2b, 0x86, 0xcd, 0xb8, 0xbb, 0x8f, 0x18, 0xfb, 0x89, 0xc2, 0xc7, 0x35,
+ });
+
+ // expected.y <= q-1
+ EccPointFq expected = {{0x5f65199e, 0x59366f56, 0xb1d35d89, 0xf42fdc1f,
+ 0x07fd66d6, 0x95f32cb3, 0xc4ef7101, 0xeb426988},
+ {0x834171f5, 0xca1c1f05, 0xdcb4d142, 0xbe060756,
+ 0x9185652b, 0xb3b9ede1, 0x671f682e, 0x22d0c94c}};
+
+ EccPointFq actual = {0};
+ EXPECT_TRUE(EFqRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+TEST(TinyEFqTest, EFqRandWorksForFailedSquareRoot) {
+ // Only last 48 bytes of the given otp will result in x such that
+ // Fq.sqrt of (x^3 + a*x + b) exists.
+ OneTimePad otp({
+ 0x01, 0x80, 0x3c, 0xd1, 0x08, 0xd8, 0x8d, 0x73, 0xaf, 0xea, 0x79, 0xc8,
+ 0x1e, 0x47, 0x83, 0xc6, 0x95, 0x31, 0x39, 0x03, 0xc4, 0x18, 0xf1, 0x2b,
+ 0x4c, 0x1a, 0x34, 0x50, 0x6d, 0x73, 0x29, 0xd2, 0x0f, 0x40, 0xc4, 0x19,
+ 0x6f, 0xe2, 0xd7, 0x87, 0x1a, 0x99, 0x68, 0x16, 0x09, 0xc3, 0xe7, 0x7e,
+ 0x17, 0x7d, 0x64, 0x9b, 0xa5, 0x39, 0x53, 0xa6, 0x88, 0x20, 0xa2, 0x0a,
+ 0x17, 0x8f, 0xef, 0x57, 0x19, 0xc7, 0xf3, 0x5c, 0x4a, 0xbe, 0x2e, 0xa0,
+ 0xd8, 0x97, 0xb7, 0x41, 0x71, 0x4d, 0x03, 0x80, 0xf8, 0xfd, 0xcd, 0x06,
+ 0x34, 0xd5, 0xc6, 0x02, 0x4c, 0xdb, 0x95, 0xcb, 0x07, 0x4d, 0xc8, 0x4b,
+ 0x4c, 0x2b, 0x14, 0x1e, 0x24, 0x67, 0x07, 0x2d, 0xc4, 0x39, 0xf0, 0xfc,
+ 0xd2, 0x60, 0x0d, 0x0a, 0x17, 0x7c, 0x51, 0x87, 0x79, 0x98, 0xca, 0xdc,
+ 0x94, 0xa0, 0x8c, 0xc1, 0x5e, 0x3c, 0xe9, 0x98, 0x52, 0x73, 0x61, 0x82,
+ 0xec, 0xdc, 0x67, 0x62, 0x0a, 0xb6, 0x60, 0xe9, 0x52, 0xd6, 0xc6, 0xc2,
+ 0x47, 0xe7, 0xb0, 0x36, 0x0f, 0x85, 0x91, 0xaa, 0x14, 0x76, 0xb0, 0x16,
+ 0xe5, 0x8d, 0xf1, 0x72, 0x61, 0xb5, 0x54, 0x0a, 0x60, 0xb7, 0x3d, 0x38,
+ 0xd9, 0x95, 0xe7, 0x60, 0xf9, 0xd3, 0x19, 0xf1, 0x8e, 0x8d, 0xd4, 0x74,
+ 0x2b, 0x86, 0xcd, 0xb8, 0xbb, 0x8f, 0x18, 0xfb, 0x89, 0xc2, 0xc7, 0x35,
+ });
+
+ EccPointFq expected = {{0x5f65199e, 0x59366f56, 0xb1d35d89, 0xf42fdc1f,
+ 0x07fd66d6, 0x95f32cb3, 0xc4ef7101, 0xeb426988},
+ {0x834171f5, 0xca1c1f05, 0xdcb4d142, 0xbe060756,
+ 0x9185652b, 0xb3b9ede1, 0x671f682e, 0x22d0c94c}};
+
+ EccPointFq actual = {0};
+
+ EXPECT_TRUE(EFqRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(1536u, otp.BitsConsumed());
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqSet
+
+TEST(TinyEFqTest, EFqSetWorks) {
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq const efqj_expect = {{{1}}, {{2}}, {{1}}};
+
+ FqElem x = {1};
+ FqElem y = {2};
+
+ EFqSet(&efqj_left, &x, &y);
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqIsInf
+TEST(TinyEFqTest, EFqIsInfPasses) {
+ EccPointJacobiFq const efqj_inf = {{{0}}, {{1}}, {{0}}};
+
+ EXPECT_TRUE(EFqIsInf(&efqj_inf));
+}
+
+TEST(TinyEFqTest, EFqIsInfFails) {
+ EccPointJacobiFq const efqj_noninf = {{{1}}, {{2}}, {{1}}};
+
+ EXPECT_FALSE(EFqIsInf(&efqj_noninf));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqFromAffine
+TEST(TinyEFqTest, FqFromAffineWorks) {
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq const efqj_expect = {{{1}}, {{2}}, {{1}}};
+ EccPointFq efq_left = {{{1}}, {{2}}};
+
+ EFqFromAffine(&efqj_left, &efq_left);
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFqToAffine
+
+TEST(TinyEFqTest, EFqToAffineWorks) {
+ EccPointFq efq_left = {0};
+ EccPointFq const efq_expect = {{{1}}, {{2}}};
+ EccPointJacobiFq efqj_left = {{{1}}, {{2}}, {{1}}};
+
+ EFqToAffine(&efq_left, &efqj_left);
+ EXPECT_EQ(efq_expect, efq_left);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqNeg
+
+TEST(TinyEFqTest, EFqNegWorks) {
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq efqj_right = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EccPointJacobiFq const efqj_expect = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x8f98a4d1, 0x0a561b5c, 0xa50112b5, 0x226c8304, 0xe3b0f033, 0xf16b932e,
+ 0x50f59e7c, 0x879ad734}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EFqNeg(&efqj_left, &efqj_right);
+
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqEq
+
+TEST(TinyEFqTest, EFqEqPasses) {
+ EccPointJacobiFq const efqj_left = {{{1}}, {{2}}, {{1}}};
+
+ EccPointJacobiFq const efqj_right = {{{1}}, {{2}}, {{1}}};
+
+ EXPECT_TRUE(EFqEq(&efqj_left, &efqj_right));
+}
+
+TEST(TinyEFqTest, EFqEqFails) {
+ EccPointJacobiFq const efqj_left = {{{1}}, {{2}}, {{1}}};
+
+ EccPointJacobiFq const efqj_right = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EXPECT_FALSE(EFqEq(&efqj_left, &efqj_right));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqHash
+
+TEST(TinyEFqTest, EFqHashWithSha512Works) {
+ EccPointFq efq_result = {0};
+ EccPointFq efq_expect = {{{0x992a96e4, 0x42f7b394, 0xf3bada9c, 0xb4033d83,
+ 0x21979b9b, 0xbc82a6a2, 0x55555586, 0x8c62a02d}},
+ {{0x406c8f03, 0xe691d8f3, 0xadf2f27b, 0x69540cc6,
+ 0xe02b87f7, 0x217d5424, 0x17b9fbe5, 0x4c0ea762}}};
+ unsigned char const msg_buf[] = {'a', 'b', 'c'};
+ size_t len = sizeof(msg_buf);
+ HashAlg hashalg = kSha512;
+ EXPECT_TRUE(EFqHash(&efq_result, msg_buf, len, hashalg));
+ EXPECT_EQ(efq_expect, efq_result);
+}
+
+TEST(TinyEFqTest, EFqHashWithSha256Works) {
+ EccPointFq efq_result = {0};
+ EccPointFq efq_expect = {{{0x8008953d, 0xd54a103c, 0x70e6186b, 0x54f5a62a,
+ 0xadbe836e, 0xf3716581, 0x88ff2562, 0x2ebb504d}},
+ {{0xdc48f9f7, 0x48aa0d6c, 0x623e2c1f, 0x7ecdf02e,
+ 0x07f07a32, 0xbd6738b1, 0xb13f3cb4, 0x8a43a104}}};
+ unsigned char const msg_buf[] = {'a', 'b', 'c'};
+ size_t len = sizeof(msg_buf);
+ HashAlg hashalg = kSha256;
+ EXPECT_TRUE(EFqHash(&efq_result, msg_buf, len, hashalg));
+ EXPECT_EQ(efq_expect, efq_result);
+}
+
+TEST(TinyEFqTest, HashWorksForResultYSmallerThanHalfOfQAndEven) {
+ std::vector<uint8_t> msg = {'a', 'a', 'd'};
+ EccPointFq result;
+ EccPointFq expected = {{0xb315d67e, 0x1924ae56, 0xcf527861, 0xebb789b6,
+ 0x3f429d2a, 0xb193bf9a, 0x6bd8502f, 0x5e73be39},
+ {0x0bd51968, 0x0f13472d, 0xc96b5096, 0xa9cd4491,
+ 0x4ab668cf, 0x2123d56c, 0xf30af180, 0x0db43c33}};
+ EXPECT_TRUE(EFqHash(&result, msg.data(), msg.size(), kSha512));
+ EXPECT_EQ(expected, result);
+}
+TEST(TinyEFqTest, HashWorksForResultYSmallerThanHalfOfQAndOdd) {
+ std::vector<uint8_t> msg = {'a', 'a', 'c'};
+ EccPointFq result;
+ EccPointFq expected = {{0x81D359E2, 0xF438B2AC, 0xAA4342EB, 0x80042B18,
+ 0x850E1C62, 0x90860717, 0xC79A1AB8, 0xF8F4F2F6},
+ {0xC1A2BA30, 0x369C0D70, 0x03EAF9DD, 0x4F93FC67,
+ 0xBB6E5D10, 0x441B22F9, 0xEC70C946, 0xE8D39BD4}};
+ EXPECT_TRUE(EFqHash(&result, msg.data(), msg.size(), kSha512));
+ EXPECT_EQ(expected, result);
+}
+
+TEST(TinyEFqTest, HashWorksForResultYLargerThanHalfOfQAndOdd) {
+ std::vector<uint8_t> msg = {'a', 'a', 'b'};
+ EccPointFq result;
+ EccPointFq expected = {{0x31F874DA, 0x62DB014E, 0x4A4FC69A, 0xC1DCC122,
+ 0xC423DAF8, 0x27AB3AAC, 0xF1DE0993, 0x07906282},
+ {0x8DA507A4, 0x568E1D1E, 0x6D373E90, 0x99A18DA4,
+ 0xC5717AA2, 0x98C222F5, 0x0A2ADDF2, 0xA1212A44}};
+ EFqHash(&result, msg.data(), msg.size(), kSha512);
+ EXPECT_EQ(expected, result);
+}
+
+TEST(TinyEFqTest, HashWorksForResultYLargerThanHalfOfQAndEven) {
+ std::vector<uint8_t> msg = {'a', 'a', 'e'};
+ EccPointFq result;
+ EccPointFq expected = {{0xA798F97C, 0xF24EC264, 0xD4C051F4, 0xBA4A5B45,
+ 0xD2CF5996, 0x121A3F66, 0x222279F0, 0x208E4FD4},
+ {0x3C816617, 0x6CF621EB, 0x8B8DAFC4, 0x63EB39C7,
+ 0xE6C8AF5C, 0x32C732D0, 0xC5C46152, 0x114E8AE0}};
+ EFqHash(&result, msg.data(), msg.size(), kSha512);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqCp
+
+TEST(TinyEFqTest, EFqCpWorks) {
+ const EccPointFq ecfq_point = {
+ {{0x76ABB18A, 0x92C0F7B9, 0x2C1A37E0, 0x7FDF6CA1, 0xE3401760, 0x66EB7D52,
+ 0x918D50A7, 0x12A65BD6}},
+ {{0x1F3A8B42, 0xC8D3127F, 0x6D96F7CD, 0xEA6FE2F6, 0x0AC0B46B, 0x557A5F30,
+ 0xAF075250, 0x786528CB}}};
+ EccPointFq result_ecfq_point = {0};
+ EFqCp(&result_ecfq_point, &ecfq_point);
+ EXPECT_EQ(ecfq_point, result_ecfq_point);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqEqAffine
+
+TEST(TinyEFqTest, EFqEqAffinePasses) {
+ EccPointFq efq_left = {{{1}}, {{2}}};
+ EccPointFq efq_right = {{{1}}, {{2}}};
+
+ EXPECT_TRUE(EFqEqAffine(&efq_left, &efq_right));
+}
+
+TEST(TinyEFqTest, EFqEqAffineFails) {
+ EccPointFq efq_left = {{{1}}, {{2}}};
+ EccPointFq efq_right = {{{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6}},
+ {{0x8f98a4d1, 0x0a561b5c, 0xa50112b5, 0x226c8304,
+ 0xe3b0f033, 0xf16b932e, 0x50f59e7c, 0x879ad734}}};
+
+ EXPECT_FALSE(EFqEqAffine(&efq_left, &efq_right));
+}
+////////////////////////////////////////////////////////////////////////
+// EFqCondSet
+
+TEST(TinyEFqTest, EFqCondSetWorksForTrue) {
+#define TRUE 1
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq efqj_right = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointJacobiFq efqj_expect = {{{1}}, {{2}}, {{1}}};
+
+ EFqCondSet(&efqj_left, &efqj_expect, &efqj_right, TRUE);
+ EXPECT_EQ(efqj_left, efqj_expect);
+}
+
+TEST(TinyEFqTest, EFqCondSetWorksForFalse) {
+#define FALSE 0
+ EccPointJacobiFq efqj_left = {0};
+ EccPointJacobiFq efqj_right = {{{1}}, {{2}}, {{1}}};
+ EccPointJacobiFq efqj_expect = {
+ {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760, 0x66eb7d52,
+ 0x918d50a7, 0x12a65bd6}},
+ {{0x1f3a8b42, 0xc8d3127f, 0x6d96f7cd, 0xea6fe2f6, 0x0ac0b46b, 0x557a5f30,
+ 0xaf075250, 0x786528cb}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+ EFqCondSet(&efqj_left, &efqj_right, &efqj_expect, FALSE);
+ EXPECT_EQ(efqj_left, efqj_expect);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqJCp
+
+TEST(TinyEFqTest, EFqJCpWorks) {
+ const EccPointJacobiFq efqj = {{{1}}, {{2}}, {{1}}};
+ EccPointJacobiFq efqj_result = {0};
+ EFqJCp(&efqj_result, &efqj);
+ EXPECT_EQ(efqj, efqj_result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqInf
+
+TEST(TinyEFqTest, EFqInfWorks) {
+ EccPointJacobiFq efqj_left;
+ EccPointJacobiFq efqj_expect = {{{0}}, {{1}}, {{0}}};
+ EFqInf(&efqj_left);
+
+ EXPECT_EQ(efqj_expect, efqj_left);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqOnCurve
+
+TEST(TinyEFqTest, EFqOnCurvePasses) {
+ const EccPointFq ecfq_point = {
+ {{0x76ABB18A, 0x92C0F7B9, 0x2C1A37E0, 0x7FDF6CA1, 0xE3401760, 0x66EB7D52,
+ 0x918D50A7, 0x12A65BD6}},
+ {{0x1F3A8B42, 0xC8D3127F, 0x6D96F7CD, 0xEA6FE2F6, 0x0AC0B46B, 0x557A5F30,
+ 0xAF075250, 0x786528CB}}};
+ EXPECT_EQ(1, EFqOnCurve(&ecfq_point));
+}
+
+TEST(TinyEFqTest, EFqOnCurveFails) {
+ EccPointFq bad_ecfq_point = {
+ {{0x76ABB18A, 0x92C0F7B9, 0x2C1A37E0, 0x7FDF6CA1, 0xE3401760, 0x66EB7D52,
+ 0x918D50A7, 0x12A65BD6}},
+ {{0x1F3A8B42, 0xC8D3127F, 0x6D96F7CD, 0xEA6FE2F6, 0x0AC0B46B, 0x557A5F30,
+ 0xAF075250, 0x786528CB}}};
+ uint8_t* ecpq_vec = (uint8_t*)bad_ecfq_point.x.limbs.word;
+ ecpq_vec[31]++;
+ EXPECT_EQ(0, EFqOnCurve(&bad_ecfq_point));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqJOnCurve
+
+TEST(TinyEFqTest, EFqJOnCurvePasses) {
+ EccPointJacobiFq efqj = {{{1}}, {{2}}, {{1}}};
+
+ EXPECT_TRUE(EFqJOnCurve(&efqj));
+}
+
+TEST(TinyEFqTest, EFqJOnCurveFails) {
+ EccPointJacobiFq efqj = {{{1}}, {{4}}, {{1}}};
+
+ EXPECT_FALSE(EFqJOnCurve(&efqj));
+}
+
+TEST(TinyEFqTest, EFqJOnCurveAcceptsPointAtInfinity) {
+ EccPointJacobiFq infinity = {{{0}}, {{1}}, {{0}}};
+
+ EXPECT_TRUE(EFqJOnCurve(&infinity));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqJRand
+
+// Checks if EFqJRand can generate points with Y >= q+1
+TEST(TinyEFqTest, EFqJRandCanGenerateBigY) {
+ OneTimePad otp({
+ 0x25, 0xeb, 0x8c, 0x48, 0xff, 0x89, 0xcb, 0x85, 0x4f, 0xc0, 0x90, 0x81,
+ 0xcc, 0x47, 0xed, 0xfc, 0x86, 0x19, 0xb2, 0x14, 0xfe, 0x65, 0x92, 0xd4,
+ 0x8b, 0xfc, 0xea, 0x9c, 0x9d, 0x8e, 0x32, 0x44, 0xd7, 0xd7, 0xe9, 0xf1,
+ 0xf7, 0xde, 0x60, 0x56, 0x8d, 0xe9, 0x89, 0x07, 0x3f, 0x3d, 0x16, 0x39,
+ });
+
+ // expected.y >= q+1
+ EccPointJacobiFq expected = {
+ {0xd78542d3, 0xf824c127, 0x81eea621, 0x6990833d, 0x9d843df6, 0x3df36126,
+ 0x435e8eda, 0x2d267586},
+ {0x1B8DC14B, 0x5967C520, 0x61CECE5D, 0x0290B5BC, 0x49278859, 0x2C523D9A,
+ 0x6D0AE6DE, 0xAE5590C9},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+
+ EccPointJacobiFq actual = {0};
+ EXPECT_TRUE(EFqJRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+// Checks if EFqJRand can generate points with Y <= q-1
+TEST(TinyEFqTest, EFqJRandCanGenerateSmallY) {
+ OneTimePad otp({
+ 0x47, 0xe7, 0xb0, 0x36, 0x0f, 0x85, 0x91, 0xaa, 0x14, 0x76, 0xb0, 0x16,
+ 0xe5, 0x8d, 0xf1, 0x72, 0x61, 0xb5, 0x54, 0x0a, 0x60, 0xb7, 0x3d, 0x38,
+ 0xd9, 0x95, 0xe7, 0x60, 0xf9, 0xd3, 0x19, 0xf1, 0x8e, 0x8d, 0xd4, 0x74,
+ 0x2b, 0x86, 0xcd, 0xb8, 0xbb, 0x8f, 0x18, 0xfb, 0x89, 0xc2, 0xc7, 0x35,
+ });
+
+ // expected.y <= q-1
+ EccPointJacobiFq expected = {
+ {0x5f65199e, 0x59366f56, 0xb1d35d89, 0xf42fdc1f, 0x07fd66d6, 0x95f32cb3,
+ 0xc4ef7101, 0xeb426988},
+ {0x834171f5, 0xca1c1f05, 0xdcb4d142, 0xbe060756, 0x9185652b, 0xb3b9ede1,
+ 0x671f682e, 0x22d0c94c},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+
+ EccPointJacobiFq actual = {0};
+ EXPECT_TRUE(EFqJRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+TEST(TinyEFqTest, EFqJRandWorksForFailedSquareRoot) {
+ // Only last 48 bytes of the given otp will result in x such that
+ // Fq.sqrt of (x^3 + a*x + b) exists.
+ OneTimePad otp({
+ 0x01, 0x80, 0x3c, 0xd1, 0x08, 0xd8, 0x8d, 0x73, 0xaf, 0xea, 0x79, 0xc8,
+ 0x1e, 0x47, 0x83, 0xc6, 0x95, 0x31, 0x39, 0x03, 0xc4, 0x18, 0xf1, 0x2b,
+ 0x4c, 0x1a, 0x34, 0x50, 0x6d, 0x73, 0x29, 0xd2, 0x0f, 0x40, 0xc4, 0x19,
+ 0x6f, 0xe2, 0xd7, 0x87, 0x1a, 0x99, 0x68, 0x16, 0x09, 0xc3, 0xe7, 0x7e,
+ 0x17, 0x7d, 0x64, 0x9b, 0xa5, 0x39, 0x53, 0xa6, 0x88, 0x20, 0xa2, 0x0a,
+ 0x17, 0x8f, 0xef, 0x57, 0x19, 0xc7, 0xf3, 0x5c, 0x4a, 0xbe, 0x2e, 0xa0,
+ 0xd8, 0x97, 0xb7, 0x41, 0x71, 0x4d, 0x03, 0x80, 0xf8, 0xfd, 0xcd, 0x06,
+ 0x34, 0xd5, 0xc6, 0x02, 0x4c, 0xdb, 0x95, 0xcb, 0x07, 0x4d, 0xc8, 0x4b,
+ 0x4c, 0x2b, 0x14, 0x1e, 0x24, 0x67, 0x07, 0x2d, 0xc4, 0x39, 0xf0, 0xfc,
+ 0xd2, 0x60, 0x0d, 0x0a, 0x17, 0x7c, 0x51, 0x87, 0x79, 0x98, 0xca, 0xdc,
+ 0x94, 0xa0, 0x8c, 0xc1, 0x5e, 0x3c, 0xe9, 0x98, 0x52, 0x73, 0x61, 0x82,
+ 0xec, 0xdc, 0x67, 0x62, 0x0a, 0xb6, 0x60, 0xe9, 0x52, 0xd6, 0xc6, 0xc2,
+ 0x47, 0xe7, 0xb0, 0x36, 0x0f, 0x85, 0x91, 0xaa, 0x14, 0x76, 0xb0, 0x16,
+ 0xe5, 0x8d, 0xf1, 0x72, 0x61, 0xb5, 0x54, 0x0a, 0x60, 0xb7, 0x3d, 0x38,
+ 0xd9, 0x95, 0xe7, 0x60, 0xf9, 0xd3, 0x19, 0xf1, 0x8e, 0x8d, 0xd4, 0x74,
+ 0x2b, 0x86, 0xcd, 0xb8, 0xbb, 0x8f, 0x18, 0xfb, 0x89, 0xc2, 0xc7, 0x35,
+ });
+
+ EccPointJacobiFq expected = {
+ {0x5f65199e, 0x59366f56, 0xb1d35d89, 0xf42fdc1f, 0x07fd66d6, 0x95f32cb3,
+ 0xc4ef7101, 0xeb426988},
+ {0x834171f5, 0xca1c1f05, 0xdcb4d142, 0xbe060756, 0x9185652b, 0xb3b9ede1,
+ 0x671f682e, 0x22d0c94c},
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}};
+
+ EccPointJacobiFq actual = {0};
+
+ EXPECT_TRUE(EFqJRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(1536u, otp.BitsConsumed());
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/efq2-test.cc b/epid/member/tiny/math/unittests/efq2-test.cc
new file mode 100644
index 0000000..0aef737
--- /dev/null
+++ b/epid/member/tiny/math/unittests/efq2-test.cc
@@ -0,0 +1,406 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of EFq2 implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// EFq2IsInf
+
+TEST(TinyEFq2Test, EFq2IsInfAcceptsPointAtInfinity) {
+ const EccPointJacobiFq2 infinity = {
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EXPECT_TRUE(EFq2IsInf(&infinity));
+}
+
+TEST(TinyEFq2Test, EFq2IsInfRejectsPointNotAtInfinity) {
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EXPECT_FALSE(EFq2IsInf(&left));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2FromAffine
+
+TEST(TinyEFq2Test, EFq2FromAffineWorks) {
+ const EccPointJacobiFq2 expected = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointFq2 left_affine = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}}};
+ EccPointJacobiFq2 actual = {0};
+ EFq2FromAffine(&actual, &left_affine);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2ToAffine
+
+TEST(TinyEFq2Test, EFq2ToAffineWorks) {
+ const EccPointFq2 expected = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}}};
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointFq2 actual = {0};
+ EFq2ToAffine(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2Dbl
+
+TEST(TinyEFq2Test, EFq2DblWorks) {
+ const EccPointJacobiFq2 expected = {
+ {{0xca2899c2, 0x38294bdb, 0xcf0b6b44, 0x270787b1, 0x28e6e40a, 0x2b848c15,
+ 0x03729665, 0xd042f637},
+ {0xda226e33, 0x9e951b73, 0x7df4afb1, 0x4b44fcd5, 0x133d08f1, 0x703ec2c1,
+ 0x93fe9a4c, 0x014c1d38}},
+ {{0xbd697392, 0x2bed001e, 0xde312107, 0x1c7a00ac, 0xc1c7c40e, 0xd720bece,
+ 0x6e98a67e, 0xaac006b6},
+ {0x43a25c32, 0x51296e80, 0x318d99a6, 0xd60e60d3, 0xdb3084d0, 0x0625d792,
+ 0x25f4ca7e, 0x0a310fe4}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointJacobiFq2 actual = {0};
+ EFq2Dbl(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2Add
+
+TEST(TinyEFq2Test, EFq2AddWorks) {
+ const EccPointJacobiFq2 expected = {
+ {{0x39d576f0, 0x314c3e0a, 0xdc7933c4, 0xb93a1af7, 0xa0b903f1, 0xd5648523,
+ 0x4745740d, 0xcd182581},
+ {0x32365bad, 0x8351f42f, 0xd587f58a, 0x46b5c664, 0x11a71e4f, 0x8fde4189,
+ 0xa0dbb9b6, 0x35a921cf}},
+ {{0xb1d07f87, 0x27fca861, 0xeb87751b, 0x40dee15b, 0x7abc2d89, 0xde6431b7,
+ 0x23bcc963, 0x79a7d75a},
+ {0x5adc76e4, 0xb6a78fa4, 0xb4e50dbd, 0xd503cacd, 0xf188a97f, 0xc89769d8,
+ 0xd3da3cb0, 0x4e50dbe9}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 right = {
+ {{0x4103138f, 0xfa13e67e, 0x6837bfdf, 0x00565944, 0x11264453, 0x23f40661,
+ 0x673da0e0, 0xed12700d},
+ {0x98f68547, 0x9cb87218, 0xc5ec70e5, 0x0c893388, 0x21dd4d22, 0x53386c5c,
+ 0x2b310753, 0xeca20f0e}},
+ {{0x17a5237e, 0x3f8bfc68, 0xfd8f3ccc, 0xa630561a, 0xbf57703a, 0x68135f32,
+ 0xe230d781, 0xd544af99},
+ {0x92ebeb94, 0x99b0cff6, 0xeebac3e7, 0x7d7aa73f, 0x7064674d, 0x25d8834a,
+ 0x7c64ff8b, 0x97e6a2ac}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointJacobiFq2 actual = {0};
+ EFq2Add(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2Neg
+
+TEST(TinyEFq2Test, EFq2NegWorks) {
+ const EccPointJacobiFq2 expected = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x876cdaca, 0x1d7a77aa, 0x730fb243, 0x1817c20a, 0x66f6a147, 0x7a82f2b1,
+ 0xb83b6256, 0x08963678},
+ {0xd6e605ff, 0x3585805b, 0x9ecba21a, 0x921d0bd7, 0x033c1324, 0x8b6f68a7,
+ 0xb9cb5b5f, 0xb8809ef0}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointJacobiFq2 actual = {0};
+ EFq2Neg(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2MulSSCM
+
+TEST(TinyEFq2Test, EFq2MultSSCMWorks) {
+ const EccPointJacobiFq2 expected = {
+ {{0x75e057c7, 0x324aeb39, 0x0246ce8a, 0xe467356d, 0x4fcae21a, 0xeb58c86e,
+ 0x12447362, 0x1c02af0c},
+ {0xfc9e5806, 0x790f79e8, 0xeffb940f, 0x44b942aa, 0xce364572, 0x8f1d0b6d,
+ 0xf2238fe0, 0x4c281551}},
+ {{0x8e525052, 0x840bf78d, 0xf0a1e53a, 0xd43b1688, 0x1566bee6, 0x715cb6d2,
+ 0x27f8a10c, 0x62806aa5},
+ {0xfe573502, 0x1b24a341, 0xffab4d71, 0x445e2e0c, 0x7f3aa342, 0x3013d966,
+ 0x69b239fa, 0x074a471c}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const FpElem power = {0xeb515e82, 0xda641a2f, 0x642e3fdc, 0x242d1caf,
+ 0xfd1cd76b, 0x60558750, 0x13fd607c, 0xd4a85a40};
+ EccPointJacobiFq2 actual = {0};
+ EFq2MulSSCM(&actual, &left, &power);
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(TinyEFq2Test, EFq2MultSSCMWorksInPlace) {
+ const EccPointJacobiFq2 expected = {
+ {{0x75e057c7, 0x324aeb39, 0x0246ce8a, 0xe467356d, 0x4fcae21a, 0xeb58c86e,
+ 0x12447362, 0x1c02af0c},
+ {0xfc9e5806, 0x790f79e8, 0xeffb940f, 0x44b942aa, 0xce364572, 0x8f1d0b6d,
+ 0xf2238fe0, 0x4c281551}},
+ {{0x8e525052, 0x840bf78d, 0xf0a1e53a, 0xd43b1688, 0x1566bee6, 0x715cb6d2,
+ 0x27f8a10c, 0x62806aa5},
+ {0xfe573502, 0x1b24a341, 0xffab4d71, 0x445e2e0c, 0x7f3aa342, 0x3013d966,
+ 0x69b239fa, 0x074a471c}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EccPointJacobiFq2 left = {{{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790,
+ 0x5303da83, 0x693bbb16, 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c,
+ 0xa7b61e37, 0x209517cf, 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0,
+ 0x877b0357, 0xcc62ffad, 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23,
+ 0xeb35917a, 0xbb7689b7, 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}}};
+ const FpElem power = {0xeb515e82, 0xda641a2f, 0x642e3fdc, 0x242d1caf,
+ 0xfd1cd76b, 0x60558750, 0x13fd607c, 0xd4a85a40};
+ EFq2MulSSCM(&left, &left, &power);
+ EXPECT_EQ(expected, left);
+}
+////////////////////////////////////////////////////////////////////////
+// EFq2Eq
+
+TEST(TinyEFq2Test, EFq2EqConfirmsPointsAreEqual) {
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 left_2 = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EXPECT_TRUE(EFq2Eq(&left, &left_2));
+}
+
+TEST(TinyEFq2Test, EFq2EqDeniesPointsAreEqual) {
+ const EccPointJacobiFq2 left = {
+ {{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790, 0x5303da83, 0x693bbb16,
+ 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c, 0xa7b61e37, 0x209517cf,
+ 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0, 0x877b0357, 0xcc62ffad,
+ 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23, 0xeb35917a, 0xbb7689b7,
+ 0x4631956d, 0x477f610f}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ const EccPointJacobiFq2 right = {
+ {{0x4103138f, 0xfa13e67e, 0x6837bfdf, 0x00565944, 0x11264453, 0x23f40661,
+ 0x673da0e0, 0xed12700d},
+ {0x98f68547, 0x9cb87218, 0xc5ec70e5, 0x0c893388, 0x21dd4d22, 0x53386c5c,
+ 0x2b310753, 0xeca20f0e}},
+ {{0x17a5237e, 0x3f8bfc68, 0xfd8f3ccc, 0xa630561a, 0xbf57703a, 0x68135f32,
+ 0xe230d781, 0xd544af99},
+ {0x92ebeb94, 0x99b0cff6, 0xeebac3e7, 0x7d7aa73f, 0x7064674d, 0x25d8834a,
+ 0x7c64ff8b, 0x97e6a2ac}},
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+ EXPECT_FALSE(EFq2Eq(&left, &right));
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2OnCurve
+
+TEST(TinyEFq2Test, EFq2OnCurveConfirmsPointOnCurve) {
+ const EccPointFq2 left = {{{0xbf501131, 0x84025734, 0xe72a81d4, 0x0a3da790,
+ 0x5303da83, 0x693bbb16, 0x679b2a8a, 0x06f54dd4},
+ {0xa15aebed, 0x5eabe073, 0x5585c8aa, 0xc27f168c,
+ 0xa7b61e37, 0x209517cf, 0x534cd776, 0x4759d7f6}},
+ {{0x27665549, 0xb5aeb631, 0x9f88583f, 0xf4c4a3f0,
+ 0x877b0357, 0xcc62ffad, 0x47c18e76, 0xf769c987},
+ {0xd7ed2a14, 0x9da3ad7f, 0x73cc6868, 0x7abf5a23,
+ 0xeb35917a, 0xbb7689b7, 0x4631956d, 0x477f610f}}};
+ EXPECT_TRUE(EFq2OnCurve(&left));
+}
+
+TEST(TinyEFq2Test, EFq2OnCurveRejectsPointOffCurve) {
+ const EccPointFq2 invalid = {
+ {{0x705eb0a4, 0xf30863e3, 0x6127e751, 0x15adee42, 0xb00baac0, 0x194dee74,
+ 0xb39bf2f3, 0x88b75019},
+ {0x60d7ec1d, 0xd80f96dd, 0x731c01d7, 0xbf697161, 0x087e5f87, 0x91f4fe08,
+ 0xd1942d15, 0x62b03177}},
+ {{0x38f6d02a, 0xae5274db, 0xb7eddcf3, 0xcf4ff611, 0x589140a6, 0xcbacb49c,
+ 0x48c50543, 0x1da802e9},
+ {0x45b0c6f3, 0x52393bf1, 0xc70746b0, 0xa08caeba, 0x5cb44254, 0x53ebeb2a,
+ 0x620ea440, 0x2c3a40f1}}};
+ EXPECT_FALSE(EFq2OnCurve(&invalid));
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/fp-test.cc b/epid/member/tiny/math/unittests/fp-test.cc
new file mode 100644
index 0000000..b13d233
--- /dev/null
+++ b/epid/member/tiny/math/unittests/fp-test.cc
@@ -0,0 +1,263 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of Fp implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+#include "epid/member/tiny/math/unittests/onetimepad.h"
+
+extern "C" {
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// FpInField
+
+TEST(TinyFpTest, FpInFieldPasses) {
+ FpElem zero = {0};
+ FpElem p_minus_one = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_TRUE(FpInField(&zero));
+ EXPECT_TRUE(FpInField(&p_minus_one));
+}
+
+TEST(TinyFpTest, FpInFieldFails) {
+ FpElem p = {{0xD10B500D, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_FALSE(FpInField(&p));
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpAdd
+
+TEST(TinyFpTest, FpAddWorks) {
+ FpElem result = {0}, expected = {0}, left = {0}, right = {0};
+ left.limbs.word[5] = 1;
+ right.limbs.word[5] = 2;
+ expected.limbs.word[5] = 3;
+ FpAdd(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+
+ FpElem p_minus_one = {0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ right = {2, 0, 0, 0, 0, 0, 0, 0};
+ expected = {1, 0, 0, 0, 0, 0, 0, 0};
+ FpAdd(&result, &p_minus_one, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpMul
+
+TEST(TinyFpTest, FpMultWorks) {
+ FpElem left = {0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124};
+ FpElem right = {0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161};
+ FpElem expected = {0x3f172ebf, 0xf2219fce, 0x73591802, 0x7a7dbc7f,
+ 0xf82ed0df, 0xb8c0c56d, 0x3395ff68, 0x83d64983};
+ FpElem result = {0};
+ FpMul(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpSub
+
+TEST(TinyFpTest, FpSubWorks) {
+ FpElem result = {0}, expected = {0}, left = {0}, right = {0};
+ left.limbs.word[4] = 2;
+ right.limbs.word[4] = 1;
+ expected.limbs.word[4] = 1;
+ FpSub(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+
+ left = {1, 0, 0, 0, 0, 0, 0, 0};
+ right = {2, 0, 0, 0, 0, 0, 0, 0};
+ FpElem p_minus_one = {0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ FpSub(&result, &left, &right);
+ EXPECT_EQ(p_minus_one, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpExp
+TEST(TinyFpTest, FpExpWorks) {
+ FpElem result = {0}, expected = {0}, in = {0};
+ VeryLargeInt exp = {0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ in.limbs.word[0] = 1;
+ expected.limbs.word[0] = 1;
+ FpExp(&result, &in, &exp);
+ EXPECT_EQ(expected, result);
+
+ exp = {4, 0, 0, 0, 0, 0, 0, 0};
+ in = {{0x0000007B, 0, 0, 0, 0, 0, 0, 0}};
+ expected = {{0x0DA48871, 0, 0, 0, 0, 0, 0, 0}};
+ FpExp(&result, &in, &exp);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpNeg
+TEST(TinyFpTest, FpNegWorks) {
+ FpElem const pairing_p = {{0xD10B500D, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpElem neg_value = {0};
+ FpElem one = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ FpElem minus_one = pairing_p;
+ --minus_one.limbs.word[0];
+ FpNeg(&neg_value, &one);
+ EXPECT_EQ(minus_one, neg_value);
+
+ FpElem value = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpNeg(&neg_value, &value);
+ FpNeg(&neg_value, &neg_value);
+ EXPECT_EQ(value, neg_value);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpEq
+
+TEST(TinyFpTest, FpEqPasses) {
+ FpElem a = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpElem c = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_TRUE(FpEq(&a, &c));
+}
+
+TEST(TinyFpTest, FpEqFails) {
+ FpElem a = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpElem b = {{0, 0, 0, 0, 0, 0, 1, 0}};
+ EXPECT_FALSE(FpEq(&a, &b));
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpInv
+
+TEST(TinyFpTest, FpInvWorks) {
+ FpElem a = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124}};
+ FpElem expected = {{0xd97deaf7, 0xa6011d83, 0x3c381713, 0x92472e34,
+ 0x997861e8, 0xc1dfdc87, 0x157eb11b, 0xc9cd1238}};
+ FpElem result;
+ FpInv(&result, &a);
+ EXPECT_EQ(result, expected);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpRand
+
+TEST(TinyFpTest, FpRandConsumes384BitsOfEntropy) {
+ OneTimePad otp(64);
+ FpElem actual = {0};
+ EXPECT_TRUE(FpRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+TEST(TinyFpTest, FpRandWorks) {
+ OneTimePad otp({// slen bits
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // p + 1
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5,
+ 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB,
+ 0x12, 0x99, 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B,
+ 0x50, 0x0E});
+ FpElem expected = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ FpElem actual = {0};
+ EXPECT_TRUE(FpRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpRandNonzero
+
+TEST(TinyFpTest, FpRandNonzeroConsumes384BitsOfEntropy) {
+ OneTimePad otp(64);
+ FpElem actual = {0};
+ EXPECT_TRUE(FpRandNonzero(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+TEST(TinyFpTest, FpRandNonzeroWorks) {
+ OneTimePad otp({// slen bits
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // p - 1
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5,
+ 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB,
+ 0x12, 0x99, 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B,
+ 0x50, 0x0C});
+ FpElem expected = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ FpElem actual = {0};
+ EXPECT_TRUE(FpRandNonzero(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpClear
+
+TEST(TinyFpTest, FpClearWorks) {
+ FpElem zero = {0};
+ FpElem a = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpClear(&a);
+ EXPECT_EQ(zero, a);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpSet
+
+TEST(TinyFpTest, FpSetWorks) {
+ uint32_t small = 0xffffffff;
+ FpElem expected = {{small, 0, 0, 0, 0, 0, 0, 0}};
+ FpElem result = {{0xD10B500C, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FpSet(&result, small);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpFromHash
+
+TEST(TinyFpTest, FpFromHashWorks) {
+ FpElem p_mod_p;
+ FpElem zero = {0};
+ uint8_t p_str[32] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A,
+ 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
+ FpFromHash(&p_mod_p, p_str, sizeof(p_str));
+ EXPECT_EQ(zero, p_mod_p);
+
+ FpElem one = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ uint8_t one_str[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ FpElem one_mod_p;
+ FpFromHash(&one_mod_p, one_str, sizeof(one_str));
+ EXPECT_EQ(one, one_mod_p);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/fq-test.cc b/epid/member/tiny/math/unittests/fq-test.cc
new file mode 100644
index 0000000..4db75e2
--- /dev/null
+++ b/epid/member/tiny/math/unittests/fq-test.cc
@@ -0,0 +1,329 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of Fq implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+#include "epid/member/tiny/math/unittests/onetimepad.h"
+
+extern "C" {
+#include "epid/member/tiny/math/fq.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// FqInField
+
+TEST(TinyFqTest, FqInFieldPasses) {
+ FqElem zero = {0};
+ FqElem q_minus_one = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_TRUE(FqInField(&zero));
+ EXPECT_TRUE(FqInField(&q_minus_one));
+}
+
+TEST(TinyFqTest, FqInFieldFails) {
+ FqElem q = {{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_FALSE(FqInField(&q));
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqAdd
+
+TEST(TinyFqTest, FqAddWorks) {
+ FqElem result = {0}, expected = {0}, left = {0}, right = {0};
+ left.limbs.word[5] = 1;
+ right.limbs.word[5] = 2;
+ expected.limbs.word[5] = 3;
+ FqAdd(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+
+ FqElem q_minus_one = {0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ right = {2, 0, 0, 0, 0, 0, 0, 0};
+ expected = {1, 0, 0, 0, 0, 0, 0, 0};
+ FqAdd(&result, &q_minus_one, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqSub
+
+TEST(TinyFqTest, FqSubWorks) {
+ FqElem result = {0}, expected = {0}, left = {0}, right = {0};
+ left.limbs.word[4] = 2;
+ right.limbs.word[4] = 1;
+ expected.limbs.word[4] = 1;
+ FqSub(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+
+ left = {1, 0, 0, 0, 0, 0, 0, 0};
+ right = {2, 0, 0, 0, 0, 0, 0, 0};
+ FqElem q_minus_one = {0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ FqSub(&result, &left, &right);
+ EXPECT_EQ(q_minus_one, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqMul
+
+TEST(TinyFqTest, FqMulWorks) {
+ FqElem left = {0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124};
+ FqElem right = {0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161};
+ FqElem expected = {0x28f2f1dd, 0x2cb2b611, 0xa24767b3, 0x4e880c0e,
+ 0xed7f7b9e, 0x6ff4a7f2, 0x25fb15d0, 0x7b8c4fed};
+ FqElem result = {0};
+ FqMul(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqExp
+TEST(TinyFqTest, FqExpWorks) {
+ FqElem result = {0}, expected = {0}, in = {0};
+ VeryLargeInt exp = {0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ in.limbs.word[0] = 1;
+ expected.limbs.word[0] = 1;
+ FqExp(&result, &in, &exp);
+ EXPECT_EQ(expected, result);
+
+ exp = {4, 0, 0, 0, 0, 0, 0, 0};
+ in = {{0x0000007B, 0, 0, 0, 0, 0, 0, 0}};
+ expected = {{0x0DA48871, 0, 0, 0, 0, 0, 0, 0}};
+ FqExp(&result, &in, &exp);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqCp
+
+TEST(TinyFqTest, FqCpWorks) {
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem result = {0};
+ FqCp(&result, &a);
+ EXPECT_EQ(a, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqIsZero
+
+TEST(TinyFqTest, FqIsZeroPasses) {
+ FqElem zero = {0};
+ EXPECT_TRUE(FqIsZero(&zero));
+}
+
+TEST(TinyFqTest, FqIsZeroFails) {
+ FqElem non_zero = {{0, 0, 0, 0, 0, 0, 1, 0}};
+ EXPECT_FALSE(FqIsZero(&non_zero));
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqInv
+
+TEST(TinyFqTest, FqInvWorks) {
+ FqElem a = {{0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1, 0xe3401760,
+ 0x66eb7d52, 0x918d50a7, 0x12a65bd6}};
+ FqElem expected = {{0x5a686df6, 0x56b6ab63, 0xdf907c6f, 0x44ad8d51,
+ 0xa5513462, 0xc597ef78, 0x93711b39, 0x15171a1e}};
+ FqElem result;
+ FqInv(&result, &a);
+ EXPECT_EQ(result, expected);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqNeg
+TEST(TinyFqTest, FqNegWorks) {
+ FqElem const pairing_q = {{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem neg_value = {0};
+ FqElem one = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ FqElem minus_one = pairing_q;
+ --minus_one.limbs.word[0];
+ FqNeg(&neg_value, &one);
+ EXPECT_EQ(minus_one, neg_value);
+
+ FqElem value = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqNeg(&neg_value, &value);
+ FqNeg(&neg_value, &neg_value);
+ EXPECT_EQ(value, neg_value);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqSquare
+
+TEST(TinyFqTest, FqSquareWorks) {
+ FqElem const pairing_q = {{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem four = {{4, 0, 0, 0, 0, 0, 0, 0}}, result = {0};
+ FqElem minus_two = pairing_q;
+ minus_two.limbs.word[0] -= 2;
+ FqSquare(&result, &minus_two);
+ EXPECT_EQ(four, result);
+
+ FqElem in = {{0x00003039, 0, 0, 0, 0, 0, 0, 0}};
+ FqElem expected = {{0x09156CB1, 0, 0, 0, 0, 0, 0, 0}};
+ FqSquare(&result, &in);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqClear
+
+TEST(TinyFqTest, FqClearWorks) {
+ FqElem zero = {0};
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqClear(&a);
+ EXPECT_EQ(zero, a);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqSet
+
+TEST(TinyFqTest, FqSetWorks) {
+ uint32_t small = 0xffffffff;
+ FqElem expected = {{small, 0, 0, 0, 0, 0, 0, 0}};
+ FqElem result = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqSet(&result, small);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqEq
+
+TEST(TinyFqTest, FqEqPasses) {
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem c = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ EXPECT_TRUE(FqEq(&a, &c));
+}
+
+TEST(TinyFqTest, FqEqFails) {
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem b = {{0, 0, 0, 0, 0, 0, 1, 0}};
+ EXPECT_FALSE(FqEq(&a, &b));
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqCondSet
+
+TEST(TinyFqTest, FqCondSetWorksForTrue) {
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem b = {{0, 0, 0, 0, 0, 0, 1, 0}};
+ FqElem result = {0};
+ FqCondSet(&result, &a, &b, true);
+ EXPECT_EQ(a, result);
+}
+
+TEST(TinyFqTest, FqCondSetWorksForFalse) {
+ FqElem a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem b = {{0, 0, 0, 0, 0, 0, 1, 0}};
+ FqElem result = {0};
+ FqCondSet(&result, &a, &b, false);
+ EXPECT_EQ(b, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqSqrt
+
+TEST(TinyFqTest, FqSqrtWorks) {
+ FqElem actual = {0};
+ FqElem in = {0x02869F4A, 0xDF28D8AC, 0x2B4BD20F, 0xB158EA77,
+ 0x89D86073, 0x4D6F2CE1, 0x0211F496, 0x9C977A80};
+ FqElem expected = {0x0E41765B, 0x7E2AEDF6, 0x7C01BC1B, 0xB1C0F3E4,
+ 0x95CB5637, 0x8B275494, 0x3FBF1556, 0x8DAE1450};
+
+ EXPECT_TRUE(FqSqrt(&actual, &in));
+ EXPECT_EQ(expected, actual);
+}
+TEST(TinyFqTest, FqSqrtWorksForFour) {
+ FqElem actual = {0};
+ FqElem in = {0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000};
+ FqElem expected = {0xAED33011, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ EXPECT_TRUE(FqSqrt(&actual, &in));
+ EXPECT_EQ(expected, actual);
+}
+TEST(TinyFqTest, FqSqrtFailsForFive) {
+ FqElem actual = {0};
+ FqElem in = {0x00000005, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000};
+ EXPECT_FALSE(FqSqrt(&actual, &in));
+}
+////////////////////////////////////////////////////////////////////////
+// FqRand
+
+TEST(TinyFqTest, FqRandConsumes384BitsOfEntropy) {
+ OneTimePad otp(64);
+ FqElem actual = {0};
+ EXPECT_TRUE(FqRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(384u, otp.BitsConsumed());
+}
+
+TEST(TinyFqTest, FqRandWorks) {
+ OneTimePad otp({// slen bits
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // q + 1
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5,
+ 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB,
+ 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3,
+ 0x30, 0x14});
+ FqElem expected = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ FqElem actual = {0};
+ EXPECT_TRUE(FqRand(&actual, OneTimePad::Generate, &otp));
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqFromHash
+
+TEST(TinyFqTest, FqFromHashWorks) {
+ FqElem q_mod_q;
+ FqElem zero = {0};
+ uint8_t q_str[32] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD,
+ 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F,
+ 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82,
+ 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13};
+ FqFromHash(&q_mod_q, q_str, sizeof(q_str));
+ EXPECT_EQ(zero, q_mod_q);
+
+ FqElem one = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ uint8_t one_str[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ FqElem one_mod_q;
+ FqFromHash(&one_mod_q, one_str, sizeof(one_str));
+ EXPECT_EQ(one, one_mod_q);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/fq12-test.cc b/epid/member/tiny/math/unittests/fq12-test.cc
new file mode 100644
index 0000000..9ec6d66
--- /dev/null
+++ b/epid/member/tiny/math/unittests/fq12-test.cc
@@ -0,0 +1,1058 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of Fq12 implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/member/tiny/math/fq12.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Add
+
+TEST(TinyFq12Test, Fq12AddWorks) {
+ Fq12Elem expected = {{{{0xf8898202, 0xb45883e0, 0x8d18168d, 0xf67a4288,
+ 0xec7c2a8a, 0xfa6f0441, 0xff5583e2, 0x32d88286},
+ {0x304722d5, 0x113e09d3, 0xeaf32297, 0x32d71c16,
+ 0x1cb0685b, 0xe3315524, 0xafd38377, 0xfeae3272}},
+ {{0xc82d8518, 0x99cec06c, 0xe8d7d62b, 0x2f00d5c5,
+ 0x0620146e, 0x2741e62b, 0x9e7557ca, 0xeb019297},
+ {0x15cfc66e, 0x55ba87c0, 0xf1060150, 0xb91180f6,
+ 0xb0d77f5f, 0xc7fa8733, 0x7dc697f1, 0x1e6b8e24}},
+ {{0x1400db26, 0x0760a0b1, 0x1a64565f, 0x27b5641e,
+ 0xd96484ed, 0x54b02297, 0xa2a57172, 0xc3a04c1c},
+ {0x17ff87fb, 0x6294fcdb, 0x8f7c4bc2, 0xd0802fe6,
+ 0xee3d7f1b, 0xf19d63af, 0xdb1d00ae, 0x80df53e6}}},
+ {{{0xc8c6cded, 0x0a290583, 0xd4ab7f8b, 0x867f6ac5,
+ 0x791662bb, 0x893f1baa, 0xfc911068, 0xe97be9e3},
+ {0xdb9666f2, 0x1ff150ee, 0xd8691261, 0x5efee8a7,
+ 0x0c67c4e5, 0x1501f7e4, 0xde7e72d8, 0x01ab1a71}},
+ {{0x85a5659c, 0xcfd4464f, 0xea3b0e64, 0x4a85994f,
+ 0x0e842121, 0x939ca516, 0x55e1a4b6, 0xb92af8fa},
+ {0xb2bfc7eb, 0x71e5dd9d, 0x16b23032, 0x8590e174,
+ 0x88a246af, 0x7d317c63, 0xc8f3a39a, 0x903a091d}},
+ {{0xf0df5efe, 0x5a88ee12, 0xb0d81569, 0x70172a9f,
+ 0xa330fbf2, 0x36a7ea66, 0x95287dc2, 0x99c6386b},
+ {0x875888c7, 0xa3fa338b, 0x52d41dbe, 0x36960893,
+ 0xfdf09874, 0x3986d2ba, 0xa9eb891e, 0x5cf05c6f}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem right = {{{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966,
+ 0xe7d31209, 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337,
+ 0x97589d24, 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a,
+ 0x4f48fed2, 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156,
+ 0x6b0c7ee2, 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086,
+ 0xc750dfa2, 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}},
+ {{{0x771f4d50, 0x113c642f, 0x983d5b97, 0xd8fed4c2,
+ 0x166e53b0, 0x4797d81c, 0x9955788c, 0xbd7c6c23},
+ {0xd9d2246a, 0x092e1780, 0xd8a1ac25, 0xc23607e5,
+ 0x8c58b02e, 0x2c543c7e, 0x4c082083, 0xc4577f4d}},
+ {{0xb433c5de, 0x6ab7893e, 0x5ff5e970, 0x24de35b6,
+ 0x65b8022c, 0x89c649d3, 0x7629ec0b, 0x6046bfbd},
+ {0xcdab3158, 0xefd0e691, 0xeb7ca8b3, 0xbbe4015c,
+ 0xcb5d6828, 0xd313d3ec, 0x0b0125d2, 0xac823c7f}},
+ {{0x3e500486, 0xd17db7a2, 0x8d174e88, 0x8504ae57,
+ 0x1d09fdcb, 0xeda97288, 0xd8a573c9, 0x32233b3f},
+ {0x41145b9e, 0x4f61f713, 0xd1caf67d, 0x3299a2ff,
+ 0x3586b78d, 0x6b31995f, 0xe51708e4, 0x9eab4090}}}};
+ Fq12Elem actual = {0};
+ Fq12Add(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Sub
+
+TEST(TinyFq12Test, Fq12SubWorks) {
+ Fq12Elem expected = {{{{0x4d162b42, 0x9377da5b, 0x1d041212, 0xda2d8e91,
+ 0x72d07c24, 0x9491de97, 0x005d123b, 0x89efdfc3},
+ {0x69ff7029, 0x1ffd54c7, 0x2a986659, 0x3830a949,
+ 0x4d0a4447, 0x5440929c, 0x8c6aff8a, 0x169a8577}},
+ {{0x970c6506, 0x259580a0, 0x4547416c, 0xbc76db4c,
+ 0xb4522362, 0xea130cd9, 0xc0e74ff6, 0xeeace017},
+ {0x97b9f013, 0xc4ec0fd2, 0x1dcfb36c, 0x97f1207d,
+ 0x00b72659, 0x218e308a, 0xc0c7c429, 0x093f2175}},
+ {{0x318f88cb, 0x503725ee, 0x5c9a3d68, 0xba67a76b,
+ 0xf1bd2bc6, 0x6413020d, 0xa06fe769, 0xecbd7182},
+ {0xa54e2ad8, 0xd2613407, 0x5c778439, 0x2bd154d5,
+ 0x4e0d6476, 0xe6ae1ad3, 0x18b00add, 0xaf4062dc}}},
+ {{{0x895b6360, 0xbad96b00, 0xb6c8d2df, 0xe15e273b,
+ 0x3aab5ff8, 0x40f55dd1, 0xc9e3101d, 0x6e83119c},
+ {0x85987e44, 0xb3e77da4, 0x4c55cf1c, 0xf44ba4d2,
+ 0xd099adc5, 0x4a2563a4, 0x4668136c, 0x78fc1bd7}},
+ {{0xcc1109f3, 0xcd8e61ad, 0x3ce74606, 0x0da593de,
+ 0x3185c168, 0xc6f603ce, 0x698abd6c, 0xf89d797f},
+ {0xc63c954e, 0x656d3e55, 0x5250e94d, 0x1aa544b5,
+ 0xe0591afd, 0x1defc6e8, 0xb2ee48c2, 0x3735901f}},
+ {{0x743f55f2, 0xb78d7ece, 0x96a97857, 0x660dcdf0,
+ 0x691d005b, 0x5b550556, 0xe3dd962e, 0x357fc1eb},
+ {0xb403019e, 0xd85f7340, 0xc1d63b46, 0xde3f288e,
+ 0x8154cdf8, 0xaa09925b, 0xdfba6822, 0x1f99db4d}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem right = {{{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966,
+ 0xe7d31209, 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337,
+ 0x97589d24, 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a,
+ 0x4f48fed2, 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156,
+ 0x6b0c7ee2, 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086,
+ 0xc750dfa2, 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}},
+ {{{0x771f4d50, 0x113c642f, 0x983d5b97, 0xd8fed4c2,
+ 0x166e53b0, 0x4797d81c, 0x9955788c, 0xbd7c6c23},
+ {0xd9d2246a, 0x092e1780, 0xd8a1ac25, 0xc23607e5,
+ 0x8c58b02e, 0x2c543c7e, 0x4c082083, 0xc4577f4d}},
+ {{0xb433c5de, 0x6ab7893e, 0x5ff5e970, 0x24de35b6,
+ 0x65b8022c, 0x89c649d3, 0x7629ec0b, 0x6046bfbd},
+ {0xcdab3158, 0xefd0e691, 0xeb7ca8b3, 0xbbe4015c,
+ 0xcb5d6828, 0xd313d3ec, 0x0b0125d2, 0xac823c7f}},
+ {{0x3e500486, 0xd17db7a2, 0x8d174e88, 0x8504ae57,
+ 0x1d09fdcb, 0xeda97288, 0xd8a573c9, 0x32233b3f},
+ {0x41145b9e, 0x4f61f713, 0xd1caf67d, 0x3299a2ff,
+ 0x3586b78d, 0x6b31995f, 0xe51708e4, 0x9eab4090}}}};
+ Fq12Elem actual = {0};
+ Fq12Sub(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Square
+
+TEST(TinyFq12Test, Fq12SquareWorks) {
+ Fq12Elem expected = {{{{0xb2718e2f, 0x5acdc81c, 0x00964828, 0x20087676,
+ 0x5ae15b61, 0x4fd4da11, 0xe092dfeb, 0x58534fb6},
+ {0xccc9dc07, 0x1004c642, 0x4d95229d, 0x82350b1c,
+ 0x9771ce95, 0xd9a24ede, 0xbd10467b, 0xc7ed3445}},
+ {{0xbde22884, 0x8354762f, 0x86ba1554, 0x63db32bb,
+ 0x0bae02fd, 0x6d0d96e8, 0xcf9ffd11, 0xb8fe4b31},
+ {0x2d04f196, 0x23e1a987, 0x99e976e3, 0xa037f309,
+ 0xe90221d9, 0x201fec2a, 0x46d79de9, 0xc93a6bd2}},
+ {{0x5c58af07, 0xd9343489, 0xb4f19136, 0xff508b82,
+ 0xc14265f4, 0xa4d22c7b, 0x6e928f38, 0xe279749e},
+ {0xa1d790b2, 0xcf37602c, 0xc842e733, 0x72c2773a,
+ 0xc4d0ad50, 0x707594fb, 0x969b8864, 0x0979561b}}},
+ {{{0x24a687fb, 0xfb396e79, 0xc34718eb, 0x2b491ee6,
+ 0xba812deb, 0xc6dfa2d8, 0x4c2bd958, 0x692fc435},
+ {0x0b3d5a09, 0xb3310b79, 0xcb0179fe, 0x8e8a4e82,
+ 0x79cf9278, 0x1b884773, 0xe7bfdc35, 0xb64b17bf}},
+ {{0x7928c472, 0xbc2fe39f, 0xa4eff880, 0xd700813f,
+ 0x555725f0, 0x43a4f63e, 0x857b8b39, 0x96614e14},
+ {0x0ba1d9bb, 0x78f7e930, 0x13c1d603, 0xe2f9587b,
+ 0x19c67a04, 0x3931bdf3, 0x3c6271ae, 0xdde60cd5}},
+ {{0xa376e35d, 0xd157352f, 0x040e0af6, 0x0e36afd1,
+ 0x9cfbfb84, 0x9cd3d83a, 0x94b83ec5, 0x1de41161},
+ {0xf1424d67, 0x5ecaee6f, 0x25a809b2, 0x00abd96d,
+ 0x2b2da6c7, 0xbcfeab22, 0x6072fb3a, 0x75474592}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+
+ Fq12Elem actual = {0};
+ Fq12Square(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Mul
+
+TEST(TinyFq12Test, Fq12MultWorks) {
+ Fq12Elem expected = {{{{0x054b2248, 0x40490d13, 0xa309fba1, 0xcda4a1ef,
+ 0xe6efd6b9, 0x6dbdd131, 0xfde112e9, 0xaf90b12e},
+ {0x4e21c944, 0x03e20ec3, 0xed4543f5, 0x7a577659,
+ 0x81d1fd42, 0xea9a8c1c, 0x791b36af, 0x870740ff}},
+ {{0x8d2c2a6e, 0xe8ce5ca0, 0xe528c957, 0x84cd9406,
+ 0x34a3c63a, 0x2b928ab5, 0x66655119, 0x91ff61ee},
+ {0x4c30c782, 0x4fd5522a, 0xfd8d17f1, 0xa3a6f430,
+ 0x37bf9b7b, 0x72928155, 0x66037689, 0x4c8e67bc}},
+ {{0x35a5ce87, 0x1b25e22e, 0x2313705b, 0x9e3e6eb6,
+ 0x8675e450, 0x33d9cdc4, 0x569c1b3e, 0xd9027fce},
+ {0x4f74f503, 0xecbc164d, 0x48ce7250, 0x32b9fb72,
+ 0x8b726b18, 0xc0872542, 0xcb8d6a0b, 0xfecc8ed3}}},
+ {{{0x1a907f78, 0x04356cb2, 0x03360ad2, 0xba867ae8,
+ 0xa1d5266f, 0xb5896fcf, 0x7013d8a3, 0x587b138f},
+ {0x30de9fe0, 0xacde6ad3, 0xdb1dcd3d, 0x765f2eac,
+ 0x7f665d4e, 0xedc431a0, 0xd9057e43, 0x1bd63b89}},
+ {{0x16e913c4, 0xdc0a393e, 0xa9780dac, 0xa0e35293,
+ 0x99e4eb2f, 0x80654405, 0x9a51d4b9, 0x890d2fa3},
+ {0x7a415a23, 0x7252917f, 0xb05a73ac, 0xe8a7f092,
+ 0x9e68afd0, 0xfe5b63d2, 0x68ecfa20, 0xe3a9f4e0}},
+ {{0x3a77ca45, 0x282422b7, 0x613276da, 0x5bc45097,
+ 0x95ea8ee4, 0x4a7a7633, 0xc9bb3324, 0xe396b7b4},
+ {0xf37c26a1, 0x8009faaa, 0x0779b7c1, 0x6ef10242,
+ 0xcd5a86eb, 0x2dd2897e, 0x2b5f0b01, 0x0b79178d}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem right = {{{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966,
+ 0xe7d31209, 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337,
+ 0x97589d24, 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a,
+ 0x4f48fed2, 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156,
+ 0x6b0c7ee2, 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086,
+ 0xc750dfa2, 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}},
+ {{{0x771f4d50, 0x113c642f, 0x983d5b97, 0xd8fed4c2,
+ 0x166e53b0, 0x4797d81c, 0x9955788c, 0xbd7c6c23},
+ {0xd9d2246a, 0x092e1780, 0xd8a1ac25, 0xc23607e5,
+ 0x8c58b02e, 0x2c543c7e, 0x4c082083, 0xc4577f4d}},
+ {{0xb433c5de, 0x6ab7893e, 0x5ff5e970, 0x24de35b6,
+ 0x65b8022c, 0x89c649d3, 0x7629ec0b, 0x6046bfbd},
+ {0xcdab3158, 0xefd0e691, 0xeb7ca8b3, 0xbbe4015c,
+ 0xcb5d6828, 0xd313d3ec, 0x0b0125d2, 0xac823c7f}},
+ {{0x3e500486, 0xd17db7a2, 0x8d174e88, 0x8504ae57,
+ 0x1d09fdcb, 0xeda97288, 0xd8a573c9, 0x32233b3f},
+ {0x41145b9e, 0x4f61f713, 0xd1caf67d, 0x3299a2ff,
+ 0x3586b78d, 0x6b31995f, 0xe51708e4, 0x9eab4090}}}};
+ Fq12Elem actual = {0};
+ Fq12Mul(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Inv
+
+TEST(TinyFq12Test, Fq12InvWorks) {
+ Fq12Elem expected = {{{{0xcf7ba426, 0x4bb2c4c3, 0xfb50fa73, 0xb70c280d,
+ 0xb5cf02c7, 0xb047bc29, 0x7cd8b4d1, 0xc238e14d},
+ {0xd1bc45de, 0xc113277d, 0x5189b836, 0x49694d5b,
+ 0xc4084edb, 0xc837f717, 0xf65566eb, 0x519dad22}},
+ {{0x62b12d6e, 0xc2a49558, 0x0f36f3b8, 0x2274fc44,
+ 0xd7ef63a2, 0x7a0f59da, 0xc4fa06c3, 0x812be980},
+ {0xc887fc84, 0xbeb1803c, 0x5ec3d49f, 0x7c32ae46,
+ 0x97fb66b2, 0x470acb13, 0x2e9d2992, 0x88dd93d5}},
+ {{0x47087924, 0x143c1bba, 0x4fe23ddb, 0x6be4e322,
+ 0x3cabd640, 0xdf2f66c9, 0x2d309380, 0xa244260f},
+ {0xf899db8a, 0xb5a83982, 0x264e1961, 0xe8a8ce8c,
+ 0xe94ceacf, 0xd18bd271, 0x67f10894, 0xc82e0f88}}},
+ {{{0x61170257, 0x9740a14e, 0xdd90ec1f, 0xfc1a7d8b,
+ 0x2a37d62c, 0xa6577bc2, 0xe610b5d6, 0xe0b70389},
+ {0x8192b447, 0x2fd37cbc, 0xc3f80c5b, 0x618f95a1,
+ 0x21e22c0c, 0xf35bd82b, 0xbf635e7d, 0x990ac1f2}},
+ {{0x790d6584, 0xf40c0f6e, 0x83ca3d0f, 0x96f7c28d,
+ 0x8a2662fa, 0xc83bfe45, 0x8be01843, 0x87a00b86},
+ {0x6020320a, 0x73199db4, 0x4d5dd850, 0x14cf247d,
+ 0x34fb1d44, 0x8ababc0d, 0x7c849de5, 0x81226e85}},
+ {{0x6453b966, 0xbbd595ea, 0x704c45e2, 0x5d4cd2a1,
+ 0x8ee6cc5e, 0x336a21d8, 0x87955196, 0xc9e0915a},
+ {0x83330d6a, 0x200dbac0, 0x6b9e8ee8, 0xe6a33cf8,
+ 0x4dc48908, 0xd0a02fdb, 0x0f715987, 0x5f4b9d5b}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem actual = {0};
+ Fq12Inv(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Neg
+
+TEST(TinyFq12Test, Fq12NegWorks) {
+ Fq12Elem expected = {{{{0x8c035971, 0xaf40febd, 0x3d89f632, 0x24887d6e,
+ 0x3ecb5147, 0xff6580f2, 0x0023a5bd, 0xa19bcedb},
+ {0x61afe694, 0xba8b7e8e, 0x07d2460a, 0xd758834b,
+ 0xb9944e4d, 0x2b2cfe7e, 0xe1ddaf4c, 0x755ba40a}},
+ {{0xff363b04, 0xf3770d54, 0xfb887eb6, 0x97208d71,
+ 0x913888b6, 0xbe3b78dc, 0x504e9cec, 0x1328c6a8},
+ {0x80a4bcc9, 0xdc414b24, 0x81e12ae2, 0xddece243,
+ 0x9e717f72, 0x2eae9d50, 0xe0b74a59, 0x6c2aa832}},
+ {{0xe3749624, 0x90f1e179, 0xe064c5e0, 0xa23c1333,
+ 0x80199e94, 0x0df7593b, 0x5e70bcc6, 0xa7d12130},
+ {0x2795eeb3, 0x2242ac58, 0xa5ea27c6, 0x9521d69a,
+ 0xc7850525, 0x7e332c4c, 0x8614e36d, 0xe7f0249e}}},
+ {{{0x5d2baf76, 0xda3c8c87, 0xd629e68e, 0x5f5bcff7,
+ 0x8bc99594, 0x053eaed0, 0x9cc158f1, 0xd400823f},
+ {0xfe3bbd78, 0xe93cc691, 0x003899c3, 0x63371f3e,
+ 0x7ff0eb49, 0x1752449a, 0x6d89adab, 0xc2ac64db}},
+ {{0xdd619055, 0x6e0c70ca, 0x8852e58e, 0xe7350261,
+ 0x45a585a9, 0x3d0f971c, 0x20453822, 0xa71bc6c3},
+ {0x1aeb696d, 0x7deb08f4, 0xd4ca7881, 0x36531fe8,
+ 0x42bb2179, 0x55e25789, 0x420d8238, 0x1c483361}},
+ {{0xfc43d59b, 0x4a1df76a, 0xeed743a2, 0x21c9e9b2,
+ 0x684aa678, 0xfde77a80, 0x4379e6d4, 0x985d02d4},
+ {0xb9bbd2d7, 0xab67c387, 0x7ef6d8be, 0xfc039a6c,
+ 0x37961f18, 0x31aac6a4, 0x3b2b7fc6, 0x41bae421}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem actual = {0};
+ Fq12Neg(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Set
+
+TEST(TinyFq12Test, Fq12SetWorks) {
+ Fq12Elem result = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem expected = {{{{0x00000010, 0}, {0}}}};
+ uint32_t val = 0x10;
+ Fq12Set(&result, val);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Exp
+
+TEST(TinyFq12Test, Fq12ExpWorks) {
+ Fq12Elem expected = {{{{0x07770c93, 0x5820d5a9, 0x65189432, 0x5f5d67ff,
+ 0xe257644a, 0x41318fa0, 0x6ab6be96, 0xf104adf8},
+ {0x6d5cae3a, 0x2e43c14b, 0xede9dbfe, 0x6743d276,
+ 0x35d13a61, 0xf25d3672, 0x6a36930c, 0x9bdbed9d}},
+ {{0x12fc551f, 0x9ff0f349, 0x4131b828, 0x50c353ed,
+ 0x785d7e8b, 0xbb894c96, 0xee86c2d1, 0x8af21330},
+ {0x45a7337a, 0xb0f0d8c5, 0xacfb0dbd, 0x1f775366,
+ 0x12303719, 0x6f7208bd, 0x68c1bf17, 0x14b60ae7}},
+ {{0xcdf00f9c, 0xbd6529d8, 0x693b8a51, 0xcb9eb968,
+ 0x46c25f48, 0x39cbf307, 0xd7283cd4, 0x8cbb7dd9},
+ {0xb18b24c2, 0x5a98714f, 0x0782ea19, 0x8af18c94,
+ 0x22373570, 0xe24e7fef, 0x0510369a, 0xc5399438}}},
+ {{{0x141a7578, 0x05e94e05, 0x08ec385f, 0x3a5ae1ef,
+ 0xccd4f61a, 0x3291d9f6, 0xb7b07242, 0xb1742404},
+ {0xec5f69b1, 0x68fbad6b, 0x167e8ec8, 0x67c97e56,
+ 0x1ac21584, 0x783e2b30, 0x8c2dd9dd, 0xd4ed7488}},
+ {{0xb591926f, 0x97f68a1f, 0xd3bccfb8, 0x9a58152b,
+ 0x9e12cf14, 0x0a82dfd6, 0x8c246e88, 0x94bcbc8a},
+ {0xa95962fe, 0x342b7e99, 0xddc1c0d9, 0x15a4e0f8,
+ 0x64475d29, 0xbce1bd39, 0xa79dd2ee, 0xee505176}},
+ {{0xdb49f8cf, 0x10cdb302, 0xf5c48053, 0x83ce1f18,
+ 0x988d4d5c, 0xd305fb4e, 0xbb11f2bb, 0x2f391894},
+ {0x084c02ad, 0x26eae084, 0x4d81e78d, 0x9750454d,
+ 0xdb062196, 0xae6ad23e, 0x18588c31, 0xb3d78420}}}};
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ VeryLargeInt exponent = {0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6};
+ Fq12Elem actual = {0};
+ Fq12Exp(&actual, &left, &exponent);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12MultiExp
+
+TEST(TinyFq12Test, Fq12MultiExpWorks) {
+ Fq12Elem expected = {{{{0x9b800ac0, 0x1fb360b8, 0x9af601c4, 0x4931f447,
+ 0x31152f7c, 0x7f6b2489, 0x2fbeed91, 0xcc7a6ac0},
+ {0xb76c0d77, 0x5b09b4be, 0x4a8fc1d4, 0x2e5222d1,
+ 0x6b6e41e6, 0x9ea53fff, 0x6daabae4, 0x591274a2}},
+ {{0xb669c611, 0xc8b0430b, 0xa7c054c3, 0x360bd4bc,
+ 0xf09ef81c, 0x4d5bb8b1, 0x9333c78f, 0x32ff73b8},
+ {0x90ec74e4, 0xe1e77b28, 0xb453b94a, 0xf7bf242c,
+ 0xdbee7487, 0x29b8c962, 0x31bcb2b5, 0x06737ced}},
+ {{0x26f4def9, 0xc706336d, 0x18aae9bf, 0x9b568de1,
+ 0x4e0fa721, 0x10695d37, 0x44a446e4, 0x1f90fc31},
+ {0xec9525dc, 0x4f63a5d6, 0x07e9f19c, 0x982ac0b8,
+ 0x818c07fc, 0x2603a2c4, 0x44e6a144, 0xb8a617a5}}},
+ {{{0x34f08dcb, 0x0afd33cc, 0x38921139, 0x10c707ef,
+ 0x1bcd1d79, 0x1cee939a, 0x08831471, 0x2318f2b4},
+ {0x8e4f9261, 0x37304a70, 0xb24df55d, 0xd93a8a20,
+ 0x32ff13b2, 0x342ce4a7, 0x25185cd0, 0xd974dca3}},
+ {{0x0a83a8aa, 0xf2e71e4e, 0x0e0af78b, 0x85363dfa,
+ 0xf825e945, 0x01d733f5, 0xf54d7f42, 0x3c77fa71},
+ {0xb5a7931b, 0x25c5c577, 0x6d21b52e, 0xbc951e9b,
+ 0x51dd45b9, 0x743e886f, 0x6bc839d4, 0xd7deccd5}},
+ {{0x947af194, 0xd0239f95, 0x1dde9421, 0x59369d3e,
+ 0xd9863881, 0xb9c24b75, 0xcbdb4021, 0x4c940810},
+ {0x96070307, 0x4f68fbf2, 0x5a719a10, 0x73b7cc22,
+ 0x4ef192e7, 0xbb5b635e, 0xdeb5746b, 0x89b5a530}}}};
+ Fq12Elem pairing_out = {{{{0x50ab7bc6, 0xd28d33ca, 0xa7de4ce1, 0x162996ed,
+ 0xad5ee231, 0x4fc0a501, 0x468be932, 0xba101ff6},
+ {0x14d36207, 0x34c44c84, 0xdfa22b9e, 0x1f4d1fc0,
+ 0xcb0454f2, 0xc4077c42, 0xebde30b6, 0x15eb79f4}},
+ {{0xf91d7519, 0xc456caad, 0xb908d0d3, 0x31b0be8c,
+ 0x1c0def81, 0x80e14649, 0x4657b6e7, 0xf18b84d1},
+ {0xec73b557, 0xf8acbc05, 0x2e5f0a7e, 0xf485e0eb,
+ 0x6fd516b6, 0xb7190100, 0xc1fa4e50, 0x3fee7c43}},
+ {{0xb3ebe0e5, 0xc572866a, 0xa10be392, 0x2d6f653d,
+ 0x138bb1b6, 0x87cf70ba, 0xbbef8650, 0xe3b31829},
+ {0x4ba31303, 0x8d1afe6e, 0xe7138780, 0x36a08173,
+ 0xcdc3182a, 0x1ecb0486, 0xd5a961a5, 0xda0e5787}}},
+ {{{0x0b13b454, 0xa62f5fbf, 0xa4bed641, 0xd3632805,
+ 0xe8010941, 0x72cebb51, 0x8aaa0095, 0x669e804d},
+ {0xe49b7149, 0x8fc69d31, 0x956d88ab, 0x265c926b,
+ 0x3bb2f1d4, 0xbfc206ea, 0x6f29d6da, 0x5b5065dc}},
+ {{0x0ff0848e, 0x1f3fdf5c, 0xb3533098, 0x1a434003,
+ 0xc80d2a60, 0x4ac6aa4a, 0xc99fbca8, 0xe0ce978f},
+ {0x3357d172, 0xf5f8a018, 0x5908b3da, 0xe540395c,
+ 0xb654a226, 0x89cef58e, 0x47786d9f, 0x5a5d41d2}},
+ {{0x788a3989, 0x49a5f719, 0x5a0042e3, 0x92f94303,
+ 0x1bd0e6c8, 0x81c5ac15, 0xe8a05ec8, 0xbbba6ced},
+ {0x6d17dc8e, 0xaf351b75, 0xba6e2c36, 0x2a04ea26,
+ 0x421e1737, 0x16fd0bfe, 0x4bb33376, 0x32aebf4d}}}};
+ Fq12Elem pairing_inv = {{{{0x50ab7bc6, 0xd28d33ca, 0xa7de4ce1, 0x162996ed,
+ 0xad5ee231, 0x4fc0a501, 0x468be932, 0xba101ff6},
+ {0x14d36207, 0x34c44c84, 0xdfa22b9e, 0x1f4d1fc0,
+ 0xcb0454f2, 0xc4077c42, 0xebde30b6, 0x15eb79f4}},
+ {{0xf91d7519, 0xc456caad, 0xb908d0d3, 0x31b0be8c,
+ 0x1c0def81, 0x80e14649, 0x4657b6e7, 0xf18b84d1},
+ {0xec73b557, 0xf8acbc05, 0x2e5f0a7e, 0xf485e0eb,
+ 0x6fd516b6, 0xb7190100, 0xc1fa4e50, 0x3fee7c43}},
+ {{0xb3ebe0e5, 0xc572866a, 0xa10be392, 0x2d6f653d,
+ 0x138bb1b6, 0x87cf70ba, 0xbbef8650, 0xe3b31829},
+ {0x4ba31303, 0x8d1afe6e, 0xe7138780, 0x36a08173,
+ 0xcdc3182a, 0x1ecb0486, 0xd5a961a5, 0xda0e5787}}},
+ {{{0xa3bf7bbf, 0x2cf9ce1c, 0x6dd93441, 0x39793df5,
+ 0x06709b5d, 0xd417370d, 0x7552f037, 0x99617fb2},
+ {0xca37beca, 0x436290a9, 0x7d2a81d7, 0xe67fd38f,
+ 0xb2beb2ca, 0x8723eb74, 0x90d319f2, 0xa4af9a23}},
+ {{0x9ee2ab85, 0xb3e94e7f, 0x5f44d9ea, 0xf29925f7,
+ 0x26647a3e, 0xfc1f4814, 0x365d3424, 0x1f316870},
+ {0x7b7b5ea1, 0xdd308dc3, 0xb98f56a7, 0x279c2c9e,
+ 0x381d0278, 0xbd16fcd0, 0xb884832d, 0xa5a2be2d}},
+ {{0x3648f68a, 0x898336c2, 0xb897c79f, 0x79e322f7,
+ 0xd2a0bdd6, 0xc5204649, 0x175c9204, 0x44459312},
+ {0x41bb5385, 0x23f41266, 0x5829de4c, 0xe2d77bd4,
+ 0xac538d67, 0x2fe8e660, 0xb449bd57, 0xcd5140b2}}}};
+ VeryLargeInt exponent = {0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6};
+ Fq12Elem b1 = pairing_inv;
+ Fq12Elem b2 = pairing_out;
+ Fq12Elem b3 = pairing_out;
+ VeryLargeInt e1 = exponent;
+ VeryLargeInt e2 = {0};
+ VeryLargeInt e3 = exponent;
+ // pairing_out^exp * pairing_out^(-exp) * pairing_out^0 * pairing_out^exp ==
+ // pairing_out^exp
+ Fq12Elem actual = {0};
+ Fq12MultiExp(&actual, &pairing_out, &exponent, &b1, &e1, &b2, &e2, &b3, &e3);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Eq
+
+TEST(TinyFq12Test, Fq12EqPasses) {
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem left2 = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ EXPECT_TRUE(Fq12Eq(&left, &left2));
+}
+
+TEST(TinyFq12Test, Fq12EqFails) {
+ Fq12Elem left = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem right = {{{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966,
+ 0xe7d31209, 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337,
+ 0x97589d24, 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a,
+ 0x4f48fed2, 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156,
+ 0x6b0c7ee2, 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086,
+ 0xc750dfa2, 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}},
+ {{{0x771f4d50, 0x113c642f, 0x983d5b97, 0xd8fed4c2,
+ 0x166e53b0, 0x4797d81c, 0x9955788c, 0xbd7c6c23},
+ {0xd9d2246a, 0x092e1780, 0xd8a1ac25, 0xc23607e5,
+ 0x8c58b02e, 0x2c543c7e, 0x4c082083, 0xc4577f4d}},
+ {{0xb433c5de, 0x6ab7893e, 0x5ff5e970, 0x24de35b6,
+ 0x65b8022c, 0x89c649d3, 0x7629ec0b, 0x6046bfbd},
+ {0xcdab3158, 0xefd0e691, 0xeb7ca8b3, 0xbbe4015c,
+ 0xcb5d6828, 0xd313d3ec, 0x0b0125d2, 0xac823c7f}},
+ {{0x3e500486, 0xd17db7a2, 0x8d174e88, 0x8504ae57,
+ 0x1d09fdcb, 0xeda97288, 0xd8a573c9, 0x32233b3f},
+ {0x41145b9e, 0x4f61f713, 0xd1caf67d, 0x3299a2ff,
+ 0x3586b78d, 0x6b31995f, 0xe51708e4, 0x9eab4090}}}};
+ EXPECT_FALSE(Fq12Eq(&left, &right));
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Conj
+
+TEST(TinyFq12Test, Fq12ConjWorks) {
+ Fq12Elem expected = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x5d2baf76, 0xda3c8c87, 0xd629e68e, 0x5f5bcff7,
+ 0x8bc99594, 0x053eaed0, 0x9cc158f1, 0xd400823f},
+ {0xfe3bbd78, 0xe93cc691, 0x003899c3, 0x63371f3e,
+ 0x7ff0eb49, 0x1752449a, 0x6d89adab, 0xc2ac64db}},
+ {{0xdd619055, 0x6e0c70ca, 0x8852e58e, 0xe7350261,
+ 0x45a585a9, 0x3d0f971c, 0x20453822, 0xa71bc6c3},
+ {0x1aeb696d, 0x7deb08f4, 0xd4ca7881, 0x36531fe8,
+ 0x42bb2179, 0x55e25789, 0x420d8238, 0x1c483361}},
+ {{0xfc43d59b, 0x4a1df76a, 0xeed743a2, 0x21c9e9b2,
+ 0x684aa678, 0xfde77a80, 0x4379e6d4, 0x985d02d4},
+ {0xb9bbd2d7, 0xab67c387, 0x7ef6d8be, 0xfc039a6c,
+ 0x37961f18, 0x31aac6a4, 0x3b2b7fc6, 0x41bae421}}}};
+ Fq12Elem input = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0,
+ 0x34dd5651, 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889,
+ 0x5d391be8, 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7,
+ 0x5000252c, 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7,
+ 0x6e58060a, 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60,
+ 0x26ec9f79, 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603,
+ 0x62a80f0a, 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd,
+ 0x6e80b955, 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399,
+ 0xa8cc1ef5, 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612,
+ 0xabb68325, 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48,
+ 0x8626fe26, 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e,
+ 0xb6db8586, 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem actual = {0};
+ Fq12Conj(&actual, &input);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12ExpCyc
+
+TEST(TinyFq12Test, Fq12ExpCycWorks) {
+ Fq12Elem expected = {{{{0x44415742, 0xce586503, 0xe5cc514f, 0x731d97a3,
+ 0xe8c98357, 0xb1de361d, 0x15cf9bfc, 0x4ca54124},
+ {0x7decae5a, 0x572ae946, 0x4244f518, 0x1490b9e4,
+ 0xbbbafdb2, 0xb2d13f3f, 0xae1de024, 0xe224dc2f}},
+ {{0x876377f0, 0x2c75d3ab, 0x5aa65a1d, 0x42ff41fa,
+ 0x2729ff86, 0x8f76d40f, 0x2c224666, 0xce3d5926},
+ {0x4f0b47eb, 0xa45887d9, 0xf4407be2, 0xaaedbf4a,
+ 0x9f8a426e, 0x809a601a, 0xea000edd, 0x4fe97056}},
+ {{0x7eb3ea97, 0xd6769b11, 0x2f2bed07, 0x6fbb5801,
+ 0x1e67136e, 0x2fd1e9a3, 0x242559de, 0x5a018155},
+ {0xb66ad800, 0x51924848, 0xdecddaa8, 0x3eed0649,
+ 0xcf7f3edb, 0x17dcaa6e, 0x27cd41c7, 0x055a6039}}},
+ {{{0x09d45f4f, 0x3d360f00, 0x7561c4fb, 0x70500d0f,
+ 0x20851a64, 0x5c5ed2a6, 0x6118fe9e, 0xfa05dc75},
+ {0x57b872d1, 0x9a19e54d, 0x3395e069, 0x29d98c64,
+ 0xcdbdda55, 0x001f07e7, 0x8aeaca7f, 0x747c1dc8}},
+ {{0x0c0cb22d, 0x75ca59be, 0x202684e4, 0xec1b56c5,
+ 0x46434c3f, 0x55f52f7a, 0xfcb5686b, 0x0a1172be},
+ {0xf0b043af, 0xbb2ae039, 0xccbdac3c, 0x8f42a6f2,
+ 0x06c264ab, 0xa47599b7, 0xc6a8c454, 0xa5b257e3}},
+ {{0x8700f8b7, 0x4090b69d, 0x20e35539, 0xfd30e911,
+ 0xa08ecbf5, 0xb038eb7b, 0x6ea872c3, 0xdfa0f669},
+ {0x5600be7b, 0x43ec3905, 0xc830ae6e, 0xd9780bec,
+ 0xe7d288c3, 0xcff72a6e, 0x059b9c31, 0x66ebb803}}}};
+ Fq12Elem input = {{{{0x4200e30a, 0xebf627b9, 0x607ebce6, 0x7848a894,
+ 0xe1b736d1, 0x4c9dd307, 0x9e1301e3, 0x07256eb7},
+ {0xe17a0b54, 0x0e02f2d5, 0x3df772e0, 0x9155aaa2,
+ 0x3c5ffcc6, 0x8427940b, 0x362f51ee, 0x331e0c73}},
+ {{0x954eecdb, 0x970bc820, 0x92d1776a, 0x02f81e51,
+ 0x8a7a9216, 0x6172111f, 0x9bd29665, 0x9612d47d},
+ {0x8fceb2c7, 0xb3f7eced, 0xa3d0a21e, 0xd66c6583,
+ 0xf273f385, 0x827df9e6, 0x503de81c, 0x5b2cae32}},
+ {{0xf08207ed, 0x7ab76686, 0xb681b701, 0x9d19d066,
+ 0x81956e08, 0x2ca17f37, 0x65d1d24e, 0x0cff7cb8},
+ {0xf9cd6e9e, 0x4821363b, 0xb0bc2b8c, 0xa380ecbb,
+ 0x7b04aea0, 0x396f0948, 0x93619efe, 0x42aa1fd4}}},
+ {{{0x805b8aa4, 0x23ab6f9a, 0x937ea209, 0x9dba1ab2,
+ 0x426d02b7, 0x36782ff4, 0xe371d373, 0x66873347},
+ {0x51d27dea, 0xd40cd434, 0xd5627a4d, 0xbcc747de,
+ 0xa54b31ec, 0x3e2c2fa4, 0x4f07b689, 0xb33b79bc}},
+ {{0xfeea300c, 0x26ab30d9, 0x92c098e9, 0x192c191b,
+ 0xeefd498c, 0x3cd4e4ac, 0xe9a3f142, 0x00bdca46},
+ {0xeb1edad0, 0xd4c2439e, 0x51025e46, 0x006cfb7c,
+ 0x04b6efda, 0x159f7c19, 0xa1085a5e, 0x459833d5}},
+ {{0xeb08632d, 0x3c4ecf58, 0x02624178, 0xf65dbcf5,
+ 0xeb320af5, 0xce34c3db, 0x799ea805, 0x1f944aa2},
+ {0x6f488ba6, 0x07f9f8dc, 0x690e6d4b, 0xa45b11be,
+ 0x8d39f017, 0x96619fec, 0x6100af71, 0x16201c36}}}};
+ VeryLargeInt pairing_t = {0x30b0a801, 0x6882f5c0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000};
+ Fq12Elem actual = {0};
+ Fq12ExpCyc(&actual, &input, &pairing_t);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12SqCyc
+
+TEST(TinyFq12Test, Fq12SqCycWorks) {
+ const Fq12Elem a = {{{{0x4200e30a, 0xebf627b9, 0x607ebce6, 0x7848a894,
+ 0xe1b736d1, 0x4c9dd307, 0x9e1301e3, 0x07256eb7},
+ {0xe17a0b54, 0x0e02f2d5, 0x3df772e0, 0x9155aaa2,
+ 0x3c5ffcc6, 0x8427940b, 0x362f51ee, 0x331e0c73}},
+ {{0x954eecdb, 0x970bc820, 0x92d1776a, 0x02f81e51,
+ 0x8a7a9216, 0x6172111f, 0x9bd29665, 0x9612d47d},
+ {0x8fceb2c7, 0xb3f7eced, 0xa3d0a21e, 0xd66c6583,
+ 0xf273f385, 0x827df9e6, 0x503de81c, 0x5b2cae32}},
+ {{0xf08207ed, 0x7ab76686, 0xb681b701, 0x9d19d066,
+ 0x81956e08, 0x2ca17f37, 0x65d1d24e, 0x0cff7cb8},
+ {0xf9cd6e9e, 0x4821363b, 0xb0bc2b8c, 0xa380ecbb,
+ 0x7b04aea0, 0x396f0948, 0x93619efe, 0x42aa1fd4}}},
+ {{{0x805b8aa4, 0x23ab6f9a, 0x937ea209, 0x9dba1ab2,
+ 0x426d02b7, 0x36782ff4, 0xe371d373, 0x66873347},
+ {0x51d27dea, 0xd40cd434, 0xd5627a4d, 0xbcc747de,
+ 0xa54b31ec, 0x3e2c2fa4, 0x4f07b689, 0xb33b79bc}},
+ {{0xfeea300c, 0x26ab30d9, 0x92c098e9, 0x192c191b,
+ 0xeefd498c, 0x3cd4e4ac, 0xe9a3f142, 0x00bdca46},
+ {0xeb1edad0, 0xd4c2439e, 0x51025e46, 0x006cfb7c,
+ 0x04b6efda, 0x159f7c19, 0xa1085a5e, 0x459833d5}},
+ {{0xeb08632d, 0x3c4ecf58, 0x02624178, 0xf65dbcf5,
+ 0xeb320af5, 0xce34c3db, 0x799ea805, 0x1f944aa2},
+ {0x6f488ba6, 0x07f9f8dc, 0x690e6d4b, 0xa45b11be,
+ 0x8d39f017, 0x96619fec, 0x6100af71, 0x16201c36}}}};
+ const Fq12Elem expected = {
+ {{{0x526a44b5, 0x9ad9e0d5, 0x7fc8d87d, 0xdac7f569, 0xb7160629, 0xc5073804,
+ 0x217aac0c, 0x71b7efa7},
+ {0xd0accd40, 0x66aed48f, 0x3e8cb003, 0x54d56ad9, 0x5f6d6996, 0x0be42117,
+ 0xa36948ed, 0xbb155b11}},
+ {{0x806eec23, 0xf4e66785, 0xaffdc175, 0xa19e8e95, 0xa11edc9d, 0xfad5f701,
+ 0x4bf831bc, 0xe743b59e},
+ {0xfc57a415, 0xb843987c, 0x3aabe4e3, 0xb23ed43d, 0xc418a1cd, 0xc46cc003,
+ 0xb646c6b0, 0x32af93c9}},
+ {{0x20c76439, 0xc9915b9f, 0x34fae4ad, 0x952c702a, 0xf2edbbd9, 0x06aa03db,
+ 0x10219f83, 0x905d0b4c},
+ {0xab64286e, 0xb368606d, 0xa469d731, 0xbc1f7604, 0xeae89f06, 0xd6d6b335,
+ 0x68da2258, 0x4ab0021e}}},
+ {{{0xa69a08d7, 0xbac72f6e, 0xaf9c76c7, 0x67d54f71, 0x41aea080, 0x36129b92,
+ 0xd25549e1, 0xa261f5ef},
+ {0xd663885e, 0xd0de96b5, 0x6631c5ab, 0x1826eea2, 0xab116580, 0xc41e9bd7,
+ 0x935a4539, 0x1283ccf4}},
+ {{0xc279b3a5, 0x750dcbe7, 0x8f96e4ba, 0xd3321942, 0xf837f073, 0x11ed32b8,
+ 0x26691990, 0x06c077da},
+ {0x4d690c41, 0x47d447a7, 0xb0ecd6ca, 0xbab6e94b, 0xb1984cb4, 0xb104eb7f,
+ 0xd0b8e924, 0xe8c70bef}},
+ {{0x1c750b7c, 0x9923d34c, 0xc88a0dda, 0x2e14c6ca, 0x6748bad3, 0x50d05e2b,
+ 0x14f32504, 0x2dc7a9d3},
+ {0xa1c4328d, 0x9e8f16d8, 0xd31d739a, 0x0c9da028, 0x613f8c91, 0x75fbf7f3,
+ 0x78575301, 0x496c9a7b}}}};
+ Fq12Elem res;
+ Fq12SqCyc(&res, &a);
+ EXPECT_EQ(expected, res);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12MulSpecial
+
+TEST(TinyFq12Test, Fq12MulSpecialWorks) {
+ const Fq12Elem left = {{{{0xbee28a1d, 0x57d6402c, 0x61cd0458, 0x194e2452,
+ 0x1c223de9, 0x6546ced9, 0xdcd0878f, 0xc55048e3},
+ {0x6a8d5fe2, 0xfcf17083, 0xb608693b, 0x981bd9fe,
+ 0x54a9e8fa, 0x0e8250f4, 0x93430f47, 0xf862d9af}},
+ {{0x57975e42, 0xf57416a0, 0x08a35031, 0x9d28f11c,
+ 0xa9467df1, 0x58159cfa, 0x48cb43f1, 0x7f6f1e63},
+ {0xb6199d76, 0xf0ee74eb, 0xc2413051, 0x5ee7af00,
+ 0xed646e81, 0xa34adbc8, 0xb30cb947, 0xc256758a}},
+ {{0xd2100f2c, 0x34bef28c, 0xe6ffd998, 0x3f8de361,
+ 0x711229db, 0x143ccdbf, 0x4fad6107, 0x35365f92},
+ {0xea2fbf36, 0x14a160b2, 0x5051bd0f, 0x6f056434,
+ 0x2d53ef9f, 0x00d84656, 0xc8535c97, 0x23aaa4e4}}},
+ {{{0xfa291b36, 0xdff94440, 0xc016a92d, 0xe44a0e69,
+ 0xdb2d97f6, 0xb1747475, 0x1cbc7fc4, 0x0e94ef53},
+ {0x0ea6037c, 0x9a639210, 0xd84404c5, 0x4b8c16ef,
+ 0xfc9e6161, 0x3914ae4c, 0xd1b76423, 0x63ef638b}},
+ {{0xfbe030a1, 0x2a114147, 0x6639fbac, 0x0349a4a5,
+ 0x5c7d47de, 0x63888f75, 0x7224cc85, 0x4c1bfeb3},
+ {0xb214f453, 0x403afc2f, 0xa61d5e45, 0x4392c48a,
+ 0xc4f5aec3, 0xce77b85a, 0xc8d59c7e, 0xd0060196}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}}}};
+ const Fq12Elem right = {{{{0xd878f624, 0xb6e07457, 0x64c79fdf, 0x0b8cebe9,
+ 0x97be762b, 0xbc4aea64, 0xf72d75cc, 0xdc8ed85d},
+ {0x65847e3a, 0x2a2ff0f3, 0x87af7204, 0xfb4cba91,
+ 0x0df3d736, 0x77e1a4e0, 0x138efcca, 0xc427f6ab}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}}},
+ {{{0x163784b5, 0x2a7d4fd5, 0x1f5a1a18, 0xe89cba68,
+ 0xc233b435, 0xa20456c0, 0x6397ae08, 0x7b76d157},
+ {0xb68f8337, 0x079302c1, 0x99e4326a, 0xc14686de,
+ 0x866e7108, 0x685e797e, 0x3a4b03e5, 0x9aab4042}},
+ {{0x2cd4fe4d, 0xb4660e9a, 0xf99f415d, 0x627f9703,
+ 0x902301e4, 0xcf3c4224, 0xaca9779d, 0x917a2609},
+ {0x9da1e8ac, 0xadb15382, 0x6d31577a, 0xcfd95901,
+ 0xf4fdf69b, 0x8ebf8ef3, 0xc15f4a65, 0x0d6458ec}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000}}}};
+ const Fq12Elem expected = {
+ {{{0x9f8d4cd8, 0x00fcb121, 0xb1383622, 0xff83d7d7, 0xa4b229fb, 0xcece9321,
+ 0x81ef1f73, 0x05137d4e},
+ {0x9f6177a7, 0x050a266e, 0x73bb8d3b, 0xc99e1d33, 0x678d1f52, 0xc63568f1,
+ 0x1920273f, 0x11a25307}},
+ {{0xcf70c64d, 0x99892381, 0xf6f6a6de, 0xfec24fa5, 0x8d18873e, 0x4f621aad,
+ 0x7d3599d0, 0x128407fe},
+ {0x33e6c086, 0xa85bf06c, 0x2edfd568, 0xc2426dbe, 0xdbbd397c, 0x2b6e80b2,
+ 0x63dd5f45, 0x98bc904e}},
+ {{0xb56c9e77, 0x84063128, 0x830da180, 0xa3d9be01, 0x7ec1cfe7, 0x817c7cc1,
+ 0x409da3aa, 0xb05dcc43},
+ {0x356380bf, 0x72eb335a, 0xb6f2b26c, 0x080613dc, 0x67720d78, 0x488a988f,
+ 0xee0e1bff, 0x0758479e}}},
+ {{{0xa640a57d, 0xc171805c, 0xd1c81064, 0xef2644a8, 0xe28b6e89, 0xd031ff2f,
+ 0xf734a21b, 0x0d8e465e},
+ {0x609de07b, 0x1d248226, 0x19fed7c8, 0x2b378e3d, 0xd55d1461, 0x719d0037,
+ 0x6fe515b8, 0x34f03c08}},
+ {{0xdcdcb9d0, 0x814badfe, 0x01405a2a, 0x2e1a5295, 0x3d08cb46, 0xd0dc0d2b,
+ 0x4ca64738, 0x2b2e5180},
+ {0x503385b0, 0x030d5f71, 0xd24ad48c, 0x4f246e0b, 0x9e904a36, 0x302748d6,
+ 0x1c034d23, 0xf6aa74f6}},
+ {{0x05fc0305, 0xfb7ba8fd, 0x4a8425a1, 0xd69ff60a, 0x356d1941, 0x4559a790,
+ 0xcf1088e9, 0x63784e99},
+ {0xa8a6d207, 0x6e6ed383, 0xf8a9804e, 0x0be13d11, 0xcef9010b, 0x90c8c91a,
+ 0x0b1302ef, 0xe2ce5b67}}}};
+ Fq12Elem res;
+ Fq12MulSpecial(&res, &left, &right);
+ EXPECT_EQ(expected, res);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Cp
+
+TEST(TinyFq12Test, Fq12CpWorks) {
+ Fq12Elem a = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603, 0x62a80f0a,
+ 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd, 0x6e80b955,
+ 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399, 0xa8cc1ef5,
+ 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612, 0xabb68325,
+ 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48, 0x8626fe26,
+ 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e, 0xb6db8586,
+ 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Elem result = {0};
+ Fq12Cp(&result, &a);
+ EXPECT_EQ(a, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Clear
+
+TEST(TinyFq12Test, Fq12ClearWorks) {
+ Fq12Elem zero = {0};
+ Fq12Elem a = {{{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}},
+ {{{0x51a7809d, 0xf8eca154, 0x3c6e23f3, 0xad809603, 0x62a80f0a,
+ 0x41a7438e, 0x633b97dc, 0x2bff7dc0},
+ {0xb097729b, 0xe9ec6749, 0x125f70be, 0xa9a546bd, 0x6e80b955,
+ 0x2f93adc4, 0x92734322, 0x3d539b24}},
+ {{0xd1719fbe, 0x651cbd10, 0x8a4524f4, 0x25a76399, 0xa8cc1ef5,
+ 0x09d65b42, 0xdfb7b8ab, 0x58e4393c},
+ {0x93e7c6a6, 0x553e24e7, 0x3dcd9201, 0xd6894612, 0xabb68325,
+ 0xf1039ad5, 0xbdef6e94, 0xe3b7cc9e}},
+ {{0xb28f5a78, 0x890b3670, 0x23c0c6e0, 0xeb127c48, 0x8626fe26,
+ 0x48fe77de, 0xbc8309f8, 0x67a2fd2b},
+ {0xf5175d3c, 0x27c16a53, 0x93a131c4, 0x10d8cb8e, 0xb6db8586,
+ 0x153b2bba, 0xc4d17107, 0xbe451bde}}}};
+ Fq12Clear(&a);
+ EXPECT_EQ(zero, a);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/fq2-test.cc b/epid/member/tiny/math/unittests/fq2-test.cc
new file mode 100644
index 0000000..3e33b63
--- /dev/null
+++ b/epid/member/tiny/math/unittests/fq2-test.cc
@@ -0,0 +1,352 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of Fq2 implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/member/tiny/math/fq2.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Cp
+
+TEST(TinyFq2Test, Fq2CpWorks) {
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem a = {fq, fq};
+ Fq2Elem result = {0};
+ Fq2Cp(&result, &a);
+ EXPECT_EQ(a, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Set
+
+TEST(TinyFq2Test, Fq2SetWorks) {
+ uint32_t small = 0xffffffff;
+ Fq2Elem expected = {0};
+ expected.x0.limbs.word[0] = small;
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem result = {fq, fq};
+ Fq2Set(&result, small);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Clear
+
+TEST(TinyFq2Test, Fq2ClearWorks) {
+ Fq2Elem expected = {0};
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem result = {fq, fq};
+ Fq2Clear(&result);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Add
+
+TEST(TinyFq2Test, Fq2AddWorks) {
+ Fq2Elem result = {0};
+ Fq2Elem left = {{0, 0, 0, 0, 0, 5, 0, 0}, {0, 0, 0, 0, 0, 0, 9, 0}};
+ Fq2Elem right = {{0, 0, 0, 0, 0, 20, 0, 0}, {0, 0, 0, 0, 0, 0, 30, 0}};
+ Fq2Elem expected = {{0, 0, 0, 0, 0, 25, 0, 0}, {0, 0, 0, 0, 0, 0, 39, 0}};
+ Fq2Add(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Exp
+
+TEST(TinyFq2Test, Fq2ExpWorks) {
+ Fq2Elem one = {1};
+ Fq2Elem in = {0};
+ VeryLargeInt exp = {0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ Fq2Elem result = {{0xb06f3418, 0x16043dfc, 0x7884a9ca, 0x0ab1a427, 0x309307b5,
+ 0x23133f6d, 0x250c3dc4, 0x005c4818},
+ {0x3b6f652c, 0x6435c0fd, 0x509b8d30, 0x13fe4bef, 0x5f4ffc14,
+ 0x81dde5fd, 0x02b77b89, 0x5b38b2a5}};
+ Fq2Exp(&result, &in, &exp);
+ EXPECT_EQ(in, result);
+
+ in = {exp, exp};
+ exp = {0};
+ Fq2Exp(&result, &in, &exp);
+ EXPECT_EQ(one, result);
+
+ exp = {2};
+ in = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357, 0x4780716c,
+ 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651, 0x1bb8f3e0,
+ 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem expected = {{0xb06f3418, 0x16043dfc, 0x7884a9ca, 0x0ab1a427,
+ 0x309307b5, 0x23133f6d, 0x250c3dc4, 0x005c4818},
+ {0x3b6f652c, 0x6435c0fd, 0x509b8d30, 0x13fe4bef,
+ 0x5f4ffc14, 0x81dde5fd, 0x02b77b89, 0x5b38b2a5}};
+ Fq2Exp(&result, &in, &exp);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Sub
+
+TEST(TinyFq2Test, Fq2SubWorks) {
+ Fq2Elem result = {0};
+ Fq2Elem left = {{0, 0, 0, 0, 0, 20, 0, 0}, {0, 0, 0, 0, 0, 0, 30, 0}};
+ Fq2Elem right = {{0, 0, 0, 0, 0, 5, 0, 0}, {0, 0, 0, 0, 0, 0, 9, 0}};
+ Fq2Elem expected = {{0, 0, 0, 0, 0, 15, 0, 0}, {0, 0, 0, 0, 0, 0, 21, 0}};
+ Fq2Sub(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Mul
+
+TEST(TinyFq2Test, Fq2MultWorks) {
+ Fq2Elem expected = {{0x37861727, 0x52822db7, 0x8005ec64, 0xc0b0bc96,
+ 0xd60e07a4, 0x65eee0a2, 0x780dbc26, 0x7b36e4cb},
+ {0x8201d4ed, 0xbf8ed473, 0xc5c09cbe, 0xba9d0095,
+ 0x3d91414a, 0xa8ebb728, 0x66bc029b, 0x5b6ca52b}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem right = {{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6, 0x2b477bd2,
+ 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966, 0xe7d31209,
+ 0xc7786143, 0x91b441f6, 0x7409d67d}};
+ Fq2Elem actual = {0};
+ Fq2Mul(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Inv
+
+TEST(TinyFq2Test, Fq2InvWorks) {
+ Fq2Elem expected = {{0xffa2241d, 0x37481517, 0x4bc3ad3a, 0x3c57cefe,
+ 0xb7a57680, 0xaef8eb15, 0x6a1f7923, 0x2e6a7077},
+ {0xdc8eb865, 0xe264dc4c, 0xa2a174dc, 0xa18b8fe8,
+ 0x31ee8433, 0xdea6fa81, 0x7ec16a0e, 0x1b0f8f81}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem actual = {0};
+ Fq2Inv(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(TinyFq2Test, Fq2InvWorksInPlace) {
+ Fq2Elem expected = {{0xffa2241d, 0x37481517, 0x4bc3ad3a, 0x3c57cefe,
+ 0xb7a57680, 0xaef8eb15, 0x6a1f7923, 0x2e6a7077},
+ {0xdc8eb865, 0xe264dc4c, 0xa2a174dc, 0xa18b8fe8,
+ 0x31ee8433, 0xdea6fa81, 0x7ec16a0e, 0x1b0f8f81}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Inv(&left, &left);
+ EXPECT_EQ(expected, left);
+}
+////////////////////////////////////////////////////////////////////////
+// Fq2Neg
+
+TEST(TinyFq2Test, Fq2NegWorks) {
+ FqElem const q = {{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem neg_value = {0};
+ Fq2Elem one = {{1}, {1}};
+ Fq2Elem minus_one = {q, q};
+ --minus_one.x0.limbs.word[0];
+ --minus_one.x1.limbs.word[0];
+ Fq2Neg(&neg_value, &one);
+ EXPECT_EQ(minus_one, neg_value);
+
+ Fq2Elem value = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF},
+ {0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Neg(&neg_value, &value);
+ Fq2Neg(&neg_value, &neg_value);
+ EXPECT_EQ(value, neg_value);
+ value = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem expected = {{0x8c035971, 0xaf40febd, 0x3d89f632, 0x24887d6e,
+ 0x3ecb5147, 0xff6580f2, 0x0023a5bd, 0xa19bcedb},
+ {0x61afe694, 0xba8b7e8e, 0x07d2460a, 0xd758834b,
+ 0xb9944e4d, 0x2b2cfe7e, 0xe1ddaf4c, 0x755ba40a}};
+ Fq2Neg(&neg_value, &value);
+ EXPECT_EQ(expected, neg_value);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Conj
+
+TEST(TinyFq2Test, Fq2ConjWorks) {
+ Fq2Elem expected = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c,
+ 0xafa65357, 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x61afe694, 0xba8b7e8e, 0x07d2460a, 0xd758834b,
+ 0xb9944e4d, 0x2b2cfe7e, 0xe1ddaf4c, 0x755ba40a}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem actual = {0};
+ Fq2Conj(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Square
+
+TEST(TinyFq2Test, Fq2SquareWorks) {
+ Fq2Elem expected = {{0xb06f3418, 0x16043dfc, 0x7884a9ca, 0x0ab1a427,
+ 0x309307b5, 0x23133f6d, 0x250c3dc4, 0x005c4818},
+ {0x3b6f652c, 0x6435c0fd, 0x509b8d30, 0x13fe4bef,
+ 0x5f4ffc14, 0x81dde5fd, 0x02b77b89, 0x5b38b2a5}};
+ Fq2Elem result = {0};
+ Fq2Elem in = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Square(&result, &in);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2MulScalar
+
+TEST(TinyFq2Test, Fq2MulScalarWorks) {
+ Fq2Elem expected = {{0x28f2f1dd, 0x2cb2b611, 0xa24767b3, 0x4e880c0e,
+ 0xed7f7b9e, 0x6ff4a7f2, 0x25fb15d0, 0x7b8c4fed},
+ {0}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0}};
+ FqElem scalar = {0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161};
+ Fq2Elem actual = {0};
+ Fq2MulScalar(&actual, &left, &scalar);
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(TinyFq2Test, Fq2MulScalarWorksInPlace) {
+ Fq2Elem expected = {{0x28f2f1dd, 0x2cb2b611, 0xa24767b3, 0x4e880c0e,
+ 0xed7f7b9e, 0x6ff4a7f2, 0x25fb15d0, 0x7b8c4fed},
+ {0}};
+ Fq2Elem left = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0}};
+ FqElem scalar = {0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6,
+ 0x2b477bd2, 0xf9d48534, 0xff7929a0, 0xd4745161};
+ Fq2MulScalar(&left, &left, &scalar);
+ EXPECT_EQ(expected, left);
+}
+////////////////////////////////////////////////////////////////////////
+// Fq2CondSet
+
+TEST(TinyFq2Test, Fq2CondSetWorksForTrue) {
+ Fq2Elem a = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e64364},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem b = {{0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}};
+ Fq2Elem result = {0};
+ Fq2CondSet(&result, &a, &b, true);
+ EXPECT_EQ(a, result);
+}
+
+TEST(TinyFq2Test, Fq2CondSetWorksForFalse) {
+ Fq2Elem a = {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e64364},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}};
+ Fq2Elem b = {{0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}};
+ Fq2Elem result = {0};
+ Fq2CondSet(&result, &a, &b, false);
+ EXPECT_EQ(b, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2Eq
+
+TEST(TinyFq2Test, Fq2EqPasses) {
+ FqElem fq_a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem fq_b = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem a = {fq_a, fq_a};
+ Fq2Elem b = {fq_b, fq_b};
+ EXPECT_TRUE(Fq2Eq(&a, &b));
+}
+
+TEST(TinyFq2Test, Fq2EqFails) {
+ FqElem fq_a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem fq_b = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq2Elem a = {fq_a, fq_a};
+ Fq2Elem b = {fq_b, fq_b};
+ --b.x1.limbs.word[5];
+ EXPECT_FALSE(Fq2Eq(&a, &b));
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2MulXi
+
+TEST(TinyFq2Test, Fq2MultXiWorks) {
+ const Fq2Elem a = {{0xbca2b7aa, 0xc0e43294, 0x6199e561, 0xefdb7a39,
+ 0xd57bcbba, 0x03154f2a, 0xdf9e1797, 0xf52d29c1},
+ {0x77cb909b, 0x906d8657, 0xfea2ffb3, 0x7810e964,
+ 0x022e47c1, 0x862bdbe6, 0xe4f5d59b, 0xa677247d}};
+ const Fq2Elem expected = {{0x52a6aea6, 0x1e31b0f6, 0xb1f8c08d, 0x5ac9a512,
+ 0xba57ab15, 0x3918d010, 0xda4968c5, 0x43e32f05},
+ {0x4e9378ba, 0x3b6ce38c, 0x39afcfc3, 0xc644810d,
+ 0xfcf511ff, 0x81a12238, 0xa98fe133, 0x421b72bd}};
+
+ Fq2Elem res;
+ Fq2MulXi(&res, &a);
+ EXPECT_EQ(expected, res);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq2IsZero
+
+TEST(TinyFq2Test, Fq2IsZeroPasses) {
+ Fq2Elem zero = {0};
+ EXPECT_TRUE(Fq2IsZero(&zero));
+}
+
+TEST(TinyFq2Test, Fq2IsZeroFails) {
+ Fq2Elem non_zero = {0};
+ ++non_zero.x0.limbs.word[6];
+ EXPECT_FALSE(Fq2IsZero(&non_zero));
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/fq6-test.cc b/epid/member/tiny/math/unittests/fq6-test.cc
new file mode 100644
index 0000000..5a47bbf
--- /dev/null
+++ b/epid/member/tiny/math/unittests/fq6-test.cc
@@ -0,0 +1,452 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of Fq6 implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/member/tiny/math/fq6.h"
+#include "epid/member/tiny/math/mathtypes.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Add
+
+TEST(TinyFq6Test, Fq6AddWorks) {
+ Fq6Elem expected = {{{0xf8898202, 0xb45883e0, 0x8d18168d, 0xf67a4288,
+ 0xec7c2a8a, 0xfa6f0441, 0xff5583e2, 0x32d88286},
+ {0x304722d5, 0x113e09d3, 0xeaf32297, 0x32d71c16,
+ 0x1cb0685b, 0xe3315524, 0xafd38377, 0xfeae3272}},
+ {{0xc82d8518, 0x99cec06c, 0xe8d7d62b, 0x2f00d5c5,
+ 0x0620146e, 0x2741e62b, 0x9e7557ca, 0xeb019297},
+ {0x15cfc66e, 0x55ba87c0, 0xf1060150, 0xb91180f6,
+ 0xb0d77f5f, 0xc7fa8733, 0x7dc697f1, 0x1e6b8e24}},
+ {{0x1400db26, 0x0760a0b1, 0x1a64565f, 0x27b5641e,
+ 0xd96484ed, 0x54b02297, 0xa2a57172, 0xc3a04c1c},
+ {0x17ff87fb, 0x6294fcdb, 0x8f7c4bc2, 0xd0802fe6,
+ 0xee3d7f1b, 0xf19d63af, 0xdb1d00ae, 0x80df53e6}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem right = {{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6, 0x2b477bd2,
+ 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966, 0xe7d31209,
+ 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337, 0x97589d24,
+ 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a, 0x4f48fed2,
+ 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156, 0x6b0c7ee2,
+ 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086, 0xc750dfa2,
+ 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}};
+ Fq6Elem actual = {0};
+ Fq6Add(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Sub
+
+TEST(TinyFq6Test, Fq6SubWorks) {
+ Fq6Elem expected = {{{0x4d162b42, 0x9377da5b, 0x1d041212, 0xda2d8e91,
+ 0x72d07c24, 0x9491de97, 0x005d123b, 0x89efdfc3},
+ {0x69ff7029, 0x1ffd54c7, 0x2a986659, 0x3830a949,
+ 0x4d0a4447, 0x5440929c, 0x8c6aff8a, 0x169a8577}},
+ {{0x970c6506, 0x259580a0, 0x4547416c, 0xbc76db4c,
+ 0xb4522362, 0xea130cd9, 0xc0e74ff6, 0xeeace017},
+ {0x97b9f013, 0xc4ec0fd2, 0x1dcfb36c, 0x97f1207d,
+ 0x00b72659, 0x218e308a, 0xc0c7c429, 0x093f2175}},
+ {{0x318f88cb, 0x503725ee, 0x5c9a3d68, 0xba67a76b,
+ 0xf1bd2bc6, 0x6413020d, 0xa06fe769, 0xecbd7182},
+ {0xa54e2ad8, 0xd2613407, 0x5c778439, 0x2bd154d5,
+ 0x4e0d6476, 0xe6ae1ad3, 0x18b00add, 0xaf4062dc}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem right = {{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6, 0x2b477bd2,
+ 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966, 0xe7d31209,
+ 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337, 0x97589d24,
+ 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a, 0x4f48fed2,
+ 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156, 0x6b0c7ee2,
+ 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086, 0xc750dfa2,
+ 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}};
+ Fq6Elem actual = {0};
+ Fq6Sub(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Mul
+
+TEST(TinyFq6Test, Fq6MultWorks) {
+ Fq6Elem expected = {{{0xf45502f6, 0x81c1eb6d, 0xb43cb376, 0xd0da40d4,
+ 0xd6156988, 0x6cd4b676, 0x68079d3e, 0x5030f7d9},
+ {0x8e5857ea, 0x042705fb, 0xac87e99c, 0x10dba783,
+ 0xc8a7141b, 0xf742b852, 0x007d20f9, 0x0f6497d4}},
+ {{0xf30a6588, 0xa558efef, 0xe2dac9b0, 0x1586ed6a,
+ 0x21de4041, 0xc02e9d19, 0x6707fbb5, 0xbe0be53f},
+ {0x13920431, 0x4935916a, 0x939a8ef8, 0x12230898,
+ 0xecbf17a9, 0x0934361c, 0x148c5974, 0x73a766d6}},
+ {{0xb989db6c, 0xc1c3c771, 0xc1a12757, 0xad67b5d9,
+ 0xed10d66b, 0x9611f300, 0x3874e3cf, 0x9384e9bf},
+ {0x7acace21, 0x0efe39f0, 0x495ed747, 0xd48f3503,
+ 0x6b032eeb, 0xb6430ee5, 0x1a864a16, 0xe497f2b6}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem right = {{{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6, 0x2b477bd2,
+ 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966, 0xe7d31209,
+ 0xc7786143, 0x91b441f6, 0x7409d67d}},
+ {{0xc763c01c, 0x8d45cdc1, 0xe46054e2, 0xc6216337, 0x97589d24,
+ 0xe57d5f07, 0xeec3f4b6, 0xfe2a593f},
+ {0x96748337, 0x31fbd2e4, 0x72e72c33, 0x96fe633a, 0x4f48fed2,
+ 0xf6a92484, 0x5e7de24a, 0x8a963657}},
+ {{0x48a24137, 0xc529544f, 0xe83111bc, 0xbd151156, 0x6b0c7ee2,
+ 0x1bc18974, 0x01193d6b, 0x6b716d4d},
+ {0x90c2469b, 0xb1ae7b57, 0x22ce6905, 0x58c5a086, 0xc750dfa2,
+ 0x28ea9d9d, 0x6134f34f, 0x68cf7885}}};
+ Fq6Elem actual = {0};
+ Fq6Mul(&actual, &left, &right);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Inv
+
+TEST(TinyFq6Test, Fq6InvWorks) {
+ Fq6Elem expected = {{{0x4b9d2361, 0x22a3edb2, 0x4234b1bc, 0x15d4ba45,
+ 0x035c34fb, 0xd041dd56, 0x0ac1e096, 0x0352ad8d},
+ {0x4e25c70f, 0x3dc912a9, 0x97a1aa56, 0x32b6e93d,
+ 0x19c793ce, 0x951b4bb8, 0x3982345f, 0xec9e815e}},
+ {{0x3d413679, 0x4cdeca84, 0x33e1c617, 0xc8851545,
+ 0x51625f1e, 0xcb8421ce, 0xd0a7ea78, 0xbb8a0cd6},
+ {0x77d7ca2e, 0x6a51fadc, 0xec063983, 0xf9a311be,
+ 0x28fe40b2, 0x30433e0f, 0x1ed97598, 0x9a82a67f}},
+ {{0x58db3fa8, 0xa999913c, 0x5bef2263, 0x1dba2103,
+ 0x0082518b, 0x3d5a20fc, 0x41913c0f, 0x708bddf4},
+ {0x20a372b3, 0x2ebb41eb, 0x9fdb3fa2, 0x473986ff,
+ 0x0f5835a9, 0x06121385, 0x8e24ac7e, 0x95b8ca14}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem actual = {0};
+ Fq6Inv(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Neg
+
+TEST(TinyFq6Test, Fq6NegWorks) {
+ Fq6Elem expected = {{{0x8c035971, 0xaf40febd, 0x3d89f632, 0x24887d6e,
+ 0x3ecb5147, 0xff6580f2, 0x0023a5bd, 0xa19bcedb},
+ {0x61afe694, 0xba8b7e8e, 0x07d2460a, 0xd758834b,
+ 0xb9944e4d, 0x2b2cfe7e, 0xe1ddaf4c, 0x755ba40a}},
+ {{0xff363b04, 0xf3770d54, 0xfb887eb6, 0x97208d71,
+ 0x913888b6, 0xbe3b78dc, 0x504e9cec, 0x1328c6a8},
+ {0x80a4bcc9, 0xdc414b24, 0x81e12ae2, 0xddece243,
+ 0x9e717f72, 0x2eae9d50, 0xe0b74a59, 0x6c2aa832}},
+ {{0xe3749624, 0x90f1e179, 0xe064c5e0, 0xa23c1333,
+ 0x80199e94, 0x0df7593b, 0x5e70bcc6, 0xa7d12130},
+ {0x2795eeb3, 0x2242ac58, 0xa5ea27c6, 0x9521d69a,
+ 0xc7850525, 0x7e332c4c, 0x8614e36d, 0xe7f0249e}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem actual = {0};
+ Fq6Neg(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Clear
+
+TEST(TinyFq6Test, Fq6ClearWorks) {
+ Fq6Elem expected = {0};
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq6Elem result = {fq, fq, fq, fq, fq, fq};
+ Fq6Clear(&result);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6MulScalar
+
+TEST(TinyFq6Test, Fq6MulScalarWorks) {
+ Fq6Elem expected = {{{0x37861727, 0x52822db7, 0x8005ec64, 0xc0b0bc96,
+ 0xd60e07a4, 0x65eee0a2, 0x780dbc26, 0x7b36e4cb},
+ {0x8201d4ed, 0xbf8ed473, 0xc5c09cbe, 0xba9d0095,
+ 0x3d91414a, 0xa8ebb728, 0x66bc029b, 0x5b6ca52b}},
+ {{0x37861727, 0x52822db7, 0x8005ec64, 0xc0b0bc96,
+ 0xd60e07a4, 0x65eee0a2, 0x780dbc26, 0x7b36e4cb},
+ {0x8201d4ed, 0xbf8ed473, 0xc5c09cbe, 0xba9d0095,
+ 0x3d91414a, 0xa8ebb728, 0x66bc029b, 0x5b6ca52b}},
+ {{0}, {0}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0}, {0}}};
+ Fq2Elem scalar = {{0x848cdb73, 0x6399829e, 0xcaa20cc0, 0x1b02bff6, 0x2b477bd2,
+ 0xf9d48534, 0xff7929a0, 0xd4745161},
+ {0xe323d956, 0xf8a05a85, 0xe02d5e1e, 0xfd533966, 0xe7d31209,
+ 0xc7786143, 0x91b441f6, 0x7409d67d}};
+ Fq6Elem actual = {0};
+ Fq6MulScalar(&actual, &left, &scalar);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6MulV
+
+TEST(TinyFq6Test, Fq6MulVWorks) {
+ const Fq6Elem a = {{{0x747a9232, 0xb91bf0cd, 0x1c5aa24e, 0x1c3c7860,
+ 0x40b4d7ca, 0x26094519, 0xe29e50db, 0x67da0b88},
+ {0x1e540333, 0xc03c243c, 0x55d91627, 0xfcc36017,
+ 0x5876fc39, 0xf0590ba2, 0x47ce59ac, 0x9cc0760e}},
+ {{0xaf2c16be, 0x4036bf3d, 0xd8ecc7eb, 0x4fdd0128,
+ 0x4faf6ca1, 0xc55bc411, 0xa26b3ac5, 0x1338fc1c},
+ {0x0936baf1, 0xc2254b98, 0x84993186, 0xa7a46e79,
+ 0xf2ed3380, 0xa1a5dad1, 0x2046667a, 0x348362a5}},
+ {{0xbca2b7aa, 0xc0e43294, 0x6199e561, 0xefdb7a39,
+ 0xd57bcbba, 0x03154f2a, 0xdf9e1797, 0xf52d29c1},
+ {0x77cb909b, 0x906d8657, 0xfea2ffb3, 0x7810e964,
+ 0x022e47c1, 0x862bdbe6, 0xe4f5d59b, 0xa677247d}}};
+ const Fq6Elem expected = {{{0x52a6aea6, 0x1e31b0f6, 0xb1f8c08d, 0x5ac9a512,
+ 0xba57ab15, 0x3918d010, 0xda4968c5, 0x43e32f05},
+ {0x4e9378ba, 0x3b6ce38c, 0x39afcfc3, 0xc644810d,
+ 0xfcf511ff, 0x81a12238, 0xa98fe133, 0x421b72bd}},
+ {{0x747a9232, 0xb91bf0cd, 0x1c5aa24e, 0x1c3c7860,
+ 0x40b4d7ca, 0x26094519, 0xe29e50db, 0x67da0b88},
+ {0x1e540333, 0xc03c243c, 0x55d91627, 0xfcc36017,
+ 0x5876fc39, 0xf0590ba2, 0x47ce59ac, 0x9cc0760e}},
+ {{0xaf2c16be, 0x4036bf3d, 0xd8ecc7eb, 0x4fdd0128,
+ 0x4faf6ca1, 0xc55bc411, 0xa26b3ac5, 0x1338fc1c},
+ {0x0936baf1, 0xc2254b98, 0x84993186, 0xa7a46e79,
+ 0xf2ed3380, 0xa1a5dad1, 0x2046667a, 0x348362a5}}};
+
+ Fq6Elem res;
+ Fq6MulV(&res, &a);
+ EXPECT_EQ(expected, res);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Eq
+
+TEST(TinyFq6Test, Fq6EqPasses) {
+ FqElem fq_a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem fq_b = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq6Elem a = {fq_a, fq_a, fq_a, fq_a, fq_a, fq_a};
+ Fq6Elem b = {fq_b, fq_b, fq_b, fq_b, fq_b, fq_b};
+ EXPECT_TRUE(Fq6Eq(&a, &b));
+}
+
+TEST(TinyFq6Test, Fq6EqFails) {
+ FqElem fq_a = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ FqElem fq_b = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq6Elem a = {fq_a, fq_a, fq_a, fq_a, fq_a, fq_a};
+ Fq6Elem b = {fq_b, fq_b, fq_b, fq_b, fq_b, fq_b};
+ --b.y2.x1.limbs.word[5];
+ EXPECT_FALSE(Fq6Eq(&a, &b));
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6IsZero
+
+TEST(TinyFq6Test, Fq6IsZeroPasses) {
+ Fq6Elem zero = {0};
+ EXPECT_TRUE(Fq6IsZero(&zero));
+}
+
+TEST(TinyFq6Test, Fq6IsZeroFails) {
+ Fq6Elem non_zero = {0};
+ ++non_zero.y2.x1.limbs.word[4];
+ EXPECT_FALSE(Fq6IsZero(&non_zero));
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Square
+
+TEST(TinyFq6Test, Fq6SquareWorks) {
+ Fq6Elem expected = {{{0xd33e098c, 0xf56a0ddf, 0x1a07b1f1, 0x5c9f80e4,
+ 0x0f4cab4b, 0x18c856b8, 0x4c614650, 0xdd44c9f1},
+ {0x5210a238, 0x934c3474, 0x8d6f7915, 0x7bfe3252,
+ 0x907c0c7d, 0x6cb28259, 0xeab6a4de, 0xb37400f3}},
+ {{0xed8e6c82, 0xfcb0be62, 0x686dcd3b, 0xfdfbb0b6,
+ 0x30744d0a, 0x408cd48e, 0x1cd63084, 0xa246ad21},
+ {0xc823a4b3, 0x4add0b26, 0x68c1bd68, 0x67140391,
+ 0xb0fe9dd7, 0xbae08890, 0xac5aac76, 0xb2547efa}},
+ {{0xb1eae872, 0xc22e7b27, 0x3b972d7a, 0x894e0e3a,
+ 0xbc67f9b5, 0xc8a56674, 0x82ba5f56, 0xfbeb546b},
+ {0x6e6c8c17, 0x634cdd65, 0xc3678b6f, 0x08e820dc,
+ 0x166dbab9, 0xb0c34885, 0x0b952acd, 0xffc1173e}}};
+ Fq6Elem left = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e643124},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c612, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem actual = {0};
+ Fq6Square(&actual, &left);
+ EXPECT_EQ(expected, actual);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Cp
+
+TEST(TinyFq6Test, Fq6CpWorks) {
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq6Elem a = {fq, fq, fq, fq, fq, fq};
+ Fq6Elem result = {0};
+ Fq6Cp(&result, &a);
+ EXPECT_EQ(a, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6CondSet
+
+TEST(TinyFq6Test, Fq6CondSetWorksForTrue) {
+ Fq6Elem a = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e64364},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c66, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem b = {{{1, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}},
+ {{0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}},
+ {{0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}};
+
+ Fq6Elem result = {0};
+ Fq6CondSet(&result, &a, &b, true);
+ EXPECT_EQ(a, result);
+}
+
+TEST(TinyFq6Test, Fq6CondSetWorksForFalse) {
+ Fq6Elem a = {{{0x22cfd6a2, 0x23e82f1e, 0xd50e1450, 0xe853e88c, 0xafa65357,
+ 0x4780716c, 0xffd94b0f, 0x5e64364},
+ {0x4d23497f, 0x189daf4d, 0x0ac5c478, 0x3583e2b0, 0x34dd5651,
+ 0x1bb8f3e0, 0x1e1f4181, 0x8aa45bf5}},
+ {{0xaf9cf50f, 0xdfb22086, 0x170f8bcb, 0x75bbd889, 0x5d391be8,
+ 0x88aa7982, 0xafae53e0, 0xecd73957},
+ {0x2e2e734a, 0xf6e7e2b7, 0x90b6df9f, 0x2eef83b7, 0x5000252c,
+ 0x1837550e, 0x1f45a674, 0x93d557cd}},
+ {{0xcb5e99ef, 0x42374c61, 0x323344a2, 0x6aa052c7, 0x6e58060a,
+ 0x38ee9923, 0xa18c3407, 0x582edecf},
+ {0x873d4160, 0xb0e68183, 0x6cade2bc, 0x77ba8f60, 0x26ec9f79,
+ 0xc8b2c66, 0x79e80d5f, 0x180fdb61}}};
+ Fq6Elem b = {{{1, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}},
+ {{0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}},
+ {{0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}};
+
+ Fq6Elem result = {0};
+ Fq6CondSet(&result, &a, &b, false);
+ EXPECT_EQ(b, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq6Set
+
+TEST(TinyFq6Test, Fq6SetWorks) {
+ uint32_t small = 0xffffffff;
+ Fq6Elem expected = {0};
+ expected.y0.x0.limbs.word[0] = small;
+ FqElem fq = {{0xAED33012, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}};
+ Fq6Elem result = {fq, fq, fq, fq, fq, fq};
+ Fq6Set(&result, small);
+ EXPECT_EQ(expected, result);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/internal/onetimepad-test.cc b/epid/member/tiny/math/unittests/internal/onetimepad-test.cc
new file mode 100644
index 0000000..66907e0
--- /dev/null
+++ b/epid/member/tiny/math/unittests/internal/onetimepad-test.cc
@@ -0,0 +1,130 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests for OneTimePad.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/onetimepad.h"
+
+namespace {
+
+TEST(OneTimePadTest, GenerateFailsWhenDefaultConstructedWithoutInit) {
+ OneTimePad otp;
+ EXPECT_EQ(0u, otp.BitsConsumed());
+ std::vector<unsigned int> actual({0, 0});
+ EXPECT_NE(0, OneTimePad::Generate(actual.data(), 8, &otp));
+}
+
+TEST(OneTimePadTest, GeneratesCorrectDataWhenConstructedWithUint8s) {
+ std::vector<unsigned int> actual1({0, 0});
+ std::vector<unsigned int> actual2({0, 0});
+ const std::vector<unsigned int> expected1({0x07050301, 0});
+ const std::vector<unsigned int> expected2({0x0e0c0a09, 0});
+ OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e});
+ EXPECT_EQ(0u, otp.BitsConsumed());
+ EXPECT_EQ(0, OneTimePad::Generate(actual1.data(), 32, &otp));
+ EXPECT_EQ(expected1, actual1);
+ EXPECT_EQ(32u, otp.BitsConsumed());
+ EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp));
+ EXPECT_EQ(expected2, actual2);
+ EXPECT_EQ(64u, otp.BitsConsumed());
+}
+
+TEST(OneTimePadTest, GeneratesCorrectDataWhenInitilizedWithUint8s) {
+ std::vector<unsigned int> actual1({0, 0});
+ std::vector<unsigned int> actual2({0, 0});
+ const std::vector<unsigned int> expected1({0x07050301, 0});
+ const std::vector<unsigned int> expected2({0x0e0c0a09, 0});
+ OneTimePad otp;
+ otp.InitUint8({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e});
+ EXPECT_EQ(0u, otp.BitsConsumed());
+ EXPECT_EQ(0, OneTimePad::Generate(actual1.data(), 32, &otp));
+ EXPECT_EQ(expected1, actual1);
+ EXPECT_EQ(32u, otp.BitsConsumed());
+ EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp));
+ EXPECT_EQ(expected2, actual2);
+ EXPECT_EQ(64u, otp.BitsConsumed());
+}
+TEST(OneTimePadTest, GeneratesCorrectDataWhenInitilizedWithUint32s) {
+ std::vector<uint32_t> actual({0x00});
+ const std::vector<uint32_t> expected({0x01});
+ std::vector<uint32_t> actual2({0x00});
+ const std::vector<uint32_t> expected2({0x01020304});
+ OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e});
+ otp.InitUint32({0x01, 0x01020304});
+ EXPECT_EQ(0u, otp.BitsConsumed());
+ EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp));
+ EXPECT_EQ(32u, otp.BitsConsumed());
+ EXPECT_EQ(expected, actual);
+ EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp));
+ EXPECT_EQ(expected2, actual2);
+ EXPECT_EQ(64u, otp.BitsConsumed());
+}
+TEST(OneTimePadTest, GeneratesSingleBytesCorrectly) {
+ OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e});
+ std::vector<uint8_t> expected1({0x01, 0x00, 0x00, 0x00});
+ std::vector<uint8_t> expected2({0x03, 0x00, 0x00, 0x00});
+ std::vector<uint8_t> expected3({0x05, 0x00, 0x00, 0x00});
+ std::vector<uint8_t> actual({0, 0, 0, 0});
+ EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp));
+ EXPECT_EQ(8u, otp.BitsConsumed());
+ EXPECT_EQ(expected1, actual);
+ EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp));
+ EXPECT_EQ(16u, otp.BitsConsumed());
+ EXPECT_EQ(expected2, actual);
+ EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp));
+ EXPECT_EQ(24u, otp.BitsConsumed());
+ EXPECT_EQ(expected3, actual);
+}
+
+TEST(OneTimePadTest, GenerateRejectsNullPtr) {
+ OneTimePad otp(8);
+ EXPECT_NE(0, OneTimePad::Generate(nullptr, 32, &otp));
+}
+TEST(OneTimePadTest, GenerateRejectsNegativeBits) {
+ OneTimePad otp(8);
+ std::vector<unsigned int> actual({0, 0});
+ EXPECT_NE(0, OneTimePad::Generate(actual.data(), -32, &otp));
+}
+TEST(OneTimePadTest, GenerateRejectsZeroBits) {
+ OneTimePad otp(8);
+ std::vector<unsigned int> actual({0, 0});
+ EXPECT_NE(0, OneTimePad::Generate(actual.data(), 0, &otp));
+}
+TEST(OneTimePadTest, GenerateRejectsTooLargeRequest) {
+ OneTimePad otp(8);
+ std::vector<unsigned int> actual({0, 0});
+ EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp));
+ EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp));
+ EXPECT_NE(0, OneTimePad::Generate(actual.data(), 32, &otp));
+}
+
+TEST(OneTimePadTest, GenerateRejectsUnsupportedBitRequest) {
+ OneTimePad otp(8);
+ std::vector<unsigned int> actual({0, 0});
+ EXPECT_NE(0, OneTimePad::Generate(actual.data(), 31, &otp));
+}
+
+TEST(OneTimePadTest, GenerateCoddlesDevelopersWhoDoNotCheckReturnValues) {
+ OneTimePad otp(4);
+ uint32_t word;
+ EXPECT_EQ(0, OneTimePad::Generate(&word, 32, &otp));
+ EXPECT_NE(0, OneTimePad::Generate(&word, 32, &otp));
+ EXPECT_THROW(OneTimePad::Generate(&word, 32, &otp), std::runtime_error);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/main-testhelper.cc b/epid/member/tiny/math/unittests/main-testhelper.cc
new file mode 100644
index 0000000..c67c612
--- /dev/null
+++ b/epid/member/tiny/math/unittests/main-testhelper.cc
@@ -0,0 +1,24 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Main entry point for tiny math unit tests
+/*! \file */
+
+#include <gtest/gtest.h>
+
+int main(int argc, char* argv[]) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/member/tiny/math/unittests/onetimepad.h b/epid/member/tiny/math/unittests/onetimepad.h
new file mode 100644
index 0000000..24215e1
--- /dev/null
+++ b/epid/member/tiny/math/unittests/onetimepad.h
@@ -0,0 +1,122 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// One time pad class
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_UNITTESTS_ONETIMEPAD_H_
+#define EPID_MEMBER_TINY_MATH_UNITTESTS_ONETIMEPAD_H_
+
+#include <climits> // for CHAR_BIT
+#include <cstdint>
+#include <random>
+#include <stdexcept>
+#include <vector>
+
+#if defined(_WIN32) || defined(_WIN64)
+#define __STDCALL __stdcall
+#else
+#define __STDCALL
+#endif
+
+/// One time pad with Bitsupplier interface
+class OneTimePad {
+ public:
+ /// Default constructor
+ OneTimePad() : bytes_consumed_(0), reported_having_no_data_(false) {}
+ /// Construct using mersenne twister
+ explicit OneTimePad(size_t num_bytes)
+ : bytes_consumed_(0), reported_having_no_data_(false) {
+ data_.resize(num_bytes);
+ std::mt19937 generator;
+ generator.seed(1);
+ for (size_t i = 0; i < num_bytes; i++)
+ data_[i] = static_cast<uint8_t>(generator() & 0x000000ff);
+ }
+ /// Construct with data
+ explicit OneTimePad(std::vector<uint8_t> const& uint8_data)
+ : reported_having_no_data_(false) {
+ InitUint8(uint8_data);
+ }
+ /// Re-initialize with unit8 data
+ void InitUint8(std::vector<uint8_t> const& uint8_data) {
+ if (uint8_data.size() > SIZE_MAX / CHAR_BIT)
+ throw std::invalid_argument("input exceeded SIZE_MAX bits");
+ bytes_consumed_ = 0;
+ data_.clear();
+ data_ = uint8_data;
+ reported_having_no_data_ = false;
+ }
+ /// Re-initialize with unit32 data
+ void InitUint32(std::vector<uint32_t> const& uint32_data) {
+ if (uint32_data.size() * sizeof(uint32_t) > SIZE_MAX / CHAR_BIT)
+ throw std::invalid_argument("input exceeded SIZE_MAX bits");
+ bytes_consumed_ = 0;
+ data_.clear();
+ for (auto u32 : uint32_data) {
+ data_.push_back((uint8_t)(u32 & 0xFF));
+ data_.push_back((uint8_t)((u32 & 0xFF00) >> 8));
+ data_.push_back((uint8_t)((u32 & 0xFF0000) >> 16));
+ data_.push_back((uint8_t)((u32 & 0xFF000000) >> 24));
+ reported_having_no_data_ = false;
+ }
+ }
+ /// Destructor
+ ~OneTimePad() {}
+ /// returns bits consumed
+ size_t BitsConsumed() const { return bytes_consumed_ * CHAR_BIT; }
+ /// Generates random number
+ static int __STDCALL Generate(unsigned int* random_data, int num_bits,
+ void* user_data) {
+ size_t num_bytes = num_bits / CHAR_BIT;
+ size_t extra_bits = num_bits % CHAR_BIT;
+ uint8_t* random_bytes = reinterpret_cast<uint8_t*>(random_data);
+ OneTimePad* myprng = (OneTimePad*)user_data;
+ if ((!random_data) || (num_bits <= 0)) {
+ return -5; // bad arg
+ }
+ if (myprng->reported_having_no_data_) {
+ throw std::runtime_error(
+ "request for random data after being informed random data was "
+ "exhausted");
+ }
+ if ((size_t)num_bits > myprng->BitsAvailable()) {
+ // cause an exception to be thrown on next invocation
+ myprng->reported_having_no_data_ = true;
+ return -1; // out of random data
+ }
+ if (0 != extra_bits) {
+ // can only handle even number of byte requests
+ return -5;
+ }
+
+ for (unsigned int n = 0; n < num_bytes; n++) {
+ random_bytes[n] = myprng->data_[myprng->bytes_consumed_++];
+ }
+ return 0;
+ }
+
+ private:
+ /// returns bits available
+ size_t BitsAvailable() const {
+ return (data_.size() - bytes_consumed_) * CHAR_BIT;
+ }
+
+ size_t bytes_consumed_ = 0;
+ std::vector<uint8_t> data_;
+ bool reported_having_no_data_ = false;
+};
+
+#endif // EPID_MEMBER_TINY_MATH_UNITTESTS_ONETIMEPAD_H_
diff --git a/epid/member/tiny/math/unittests/pairing-test.cc b/epid/member/tiny/math/unittests/pairing-test.cc
new file mode 100644
index 0000000..c976334
--- /dev/null
+++ b/epid/member/tiny/math/unittests/pairing-test.cc
@@ -0,0 +1,79 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of pairing implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/pairing.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// PairingCompute
+
+TEST(TinyPairingTest, PairingComputeWorks) {
+ const EccPointFq a = {{0xf67c8483, 0xbaceaf8d, 0xfcaa5567, 0x8ac94411,
+ 0x7d91c375, 0x0fcaa603, 0x210f0997, 0xd7e2f937},
+ {0x0f93424b, 0x88e246d6, 0x4859033f, 0x3ff08258,
+ 0xf613c944, 0xaf6cd00a, 0x9f0d2673, 0x04b7a6ff}};
+ const EccPointFq2 b = {{{0xa3c3fd4c, 0xad5323dc, 0x3770e217, 0x91a68d51,
+ 0xdcfbda35, 0x6fb2b5c1, 0xbc72b09c, 0x3f4cb52d},
+ {0xb6f87404, 0xb8fb89d1, 0xb0c1d7f9, 0x49dff54f,
+ 0x7fb08a69, 0x5e8ef4ce, 0xcb35f350, 0x90fa4fa2}},
+ {{0xc801fb5b, 0xfbbd005f, 0x1620b9cc, 0x444c5486,
+ 0x083e43a1, 0x80f44b97, 0x62f3175a, 0xefc66005},
+ {0xeb618b01, 0x448994a3, 0x3aca949c, 0xdfba9b6f,
+ 0x35140ec9, 0xa2aa865a, 0xe20470eb, 0xc16e2b46}}};
+ const Fq12Elem expected = {
+ {{{0x50ab7bc6, 0xd28d33ca, 0xa7de4ce1, 0x162996ed, 0xad5ee231, 0x4fc0a501,
+ 0x468be932, 0xba101ff6},
+ {0x14d36207, 0x34c44c84, 0xdfa22b9e, 0x1f4d1fc0, 0xcb0454f2, 0xc4077c42,
+ 0xebde30b6, 0x15eb79f4}},
+ {{0xf91d7519, 0xc456caad, 0xb908d0d3, 0x31b0be8c, 0x1c0def81, 0x80e14649,
+ 0x4657b6e7, 0xf18b84d1},
+ {0xec73b557, 0xf8acbc05, 0x2e5f0a7e, 0xf485e0eb, 0x6fd516b6, 0xb7190100,
+ 0xc1fa4e50, 0x3fee7c43}},
+ {{0xb3ebe0e5, 0xc572866a, 0xa10be392, 0x2d6f653d, 0x138bb1b6, 0x87cf70ba,
+ 0xbbef8650, 0xe3b31829},
+ {0x4ba31303, 0x8d1afe6e, 0xe7138780, 0x36a08173, 0xcdc3182a, 0x1ecb0486,
+ 0xd5a961a5, 0xda0e5787}}},
+ {{{0x0b13b454, 0xa62f5fbf, 0xa4bed641, 0xd3632805, 0xe8010941, 0x72cebb51,
+ 0x8aaa0095, 0x669e804d},
+ {0xe49b7149, 0x8fc69d31, 0x956d88ab, 0x265c926b, 0x3bb2f1d4, 0xbfc206ea,
+ 0x6f29d6da, 0x5b5065dc}},
+ {{0x0ff0848e, 0x1f3fdf5c, 0xb3533098, 0x1a434003, 0xc80d2a60, 0x4ac6aa4a,
+ 0xc99fbca8, 0xe0ce978f},
+ {0x3357d172, 0xf5f8a018, 0x5908b3da, 0xe540395c, 0xb654a226, 0x89cef58e,
+ 0x47786d9f, 0x5a5d41d2}},
+ {{0x788a3989, 0x49a5f719, 0x5a0042e3, 0x92f94303, 0x1bd0e6c8, 0x81c5ac15,
+ 0xe8a05ec8, 0xbbba6ced},
+ {0x6d17dc8e, 0xaf351b75, 0xba6e2c36, 0x2a04ea26, 0x421e1737, 0x16fd0bfe,
+ 0x4bb33376, 0x32aebf4d}}}};
+
+ PairingState ps;
+ PairingInit(&ps);
+ Fq12Elem res = {0};
+ PairingCompute(&res, &a, &b, &ps);
+ EXPECT_EQ(expected, res);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/serialize-test.cc b/epid/member/tiny/math/unittests/serialize-test.cc
new file mode 100644
index 0000000..66e188b
--- /dev/null
+++ b/epid/member/tiny/math/unittests/serialize-test.cc
@@ -0,0 +1,423 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of serialization implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+#include <stdint.h>
+#include <cstring>
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+
+extern "C" {
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+}
+
+bool operator==(OctStr32 const& lhs, OctStr32 const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(FqElemStr const& lhs, FqElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(G2ElemStr const& lhs, G2ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(Fq12ElemStr const& lhs, Fq12ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+////////////////////////////////////////////////////////////////////////
+// Uint32Serialize
+
+TEST(TinySerializeTest, Uint32SerializeWorks) {
+ OctStr32 octstr = {0};
+ const OctStr32 expected_octstr = {0x01, 0x02, 0x03, 0x04};
+ const uint32_t num = 0x01020304;
+ Uint32Serialize(&octstr, num);
+ EXPECT_EQ(expected_octstr, octstr);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Uint32Deserialize
+
+TEST(TinySerializeTest, Uint32DeserializeWorks) {
+ const OctStr32 octstr = {0x01, 0x02, 0x03, 0x04};
+ uint32_t num = 0;
+ const uint32_t expected_num = 0x01020304;
+ Uint32Deserialize(&num, &octstr);
+ EXPECT_EQ(expected_num, num);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliSerialize
+
+TEST(TinySerializeTest, VliSerializeWorks) {
+ const VeryLargeInt vli = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ BigNumStr serialize_vli = {0};
+ const BigNumStr expected_serialize_vli = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ VliSerialize(&serialize_vli, &vli);
+ EXPECT_EQ(expected_serialize_vli, serialize_vli);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliDeserialize
+
+TEST(TinySerializeTest, VliDeserializeWorks) {
+ VeryLargeInt vli = {0};
+ const VeryLargeInt expected_vli = {0x01020304, 0x05060708, 0x090A0B0C,
+ 0x0D0E0F10, 0x11121314, 0x15161718,
+ 0x191A1B1C, 0x1D1E1F20};
+ const BigNumStr serialize_vli = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ VliDeserialize(&vli, &serialize_vli);
+ EXPECT_EQ(expected_vli, vli);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqSerialize
+
+TEST(TinySerializeTest, FqSerializeWorks) {
+ const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ FqElemStr serialize_fqelm = {0};
+ const FqElemStr expected_serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ FqSerialize(&serialize_fqelm, &fqelm);
+ EXPECT_EQ(expected_serialize_fqelm, serialize_fqelm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FqDeserialize
+
+TEST(TinySerializeTest, FqDeserializeWorks) {
+ const FqElemStr serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ FqElem fqelm = {0};
+ const FqElem expected_fqelm = {0x01020304, 0x05060708, 0x090A0B0C,
+ 0x0D0E0F10, 0x11121314, 0x15161718,
+ 0x191A1B1C, 0x1D1E1F20};
+ FqDeserialize(&fqelm, &serialize_fqelm);
+ EXPECT_EQ(expected_fqelm, fqelm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Serialize
+
+TEST(TinySerializeTest, Fq12SerializeWorks) {
+ const Fq12Elem fq12elm = {
+ {{
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ }},
+ {{
+ {0x00000000, 0x00070000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000000, 0x00000009, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000A00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000000, 0x000B0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x0C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ }}};
+ Fq12ElemStr serialized_fq12elm = {0};
+ const Fq12ElemStr expected_serialized_fq12elm = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ Fq12Serialize(&serialized_fq12elm, &fq12elm);
+ EXPECT_EQ(expected_serialized_fq12elm, serialized_fq12elm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Fq12Deserialize
+
+TEST(TinySerializeTest, Fq12DeserializeWorks) {
+ const Fq12ElemStr serialized_fq12elm = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ Fq12Elem fq12elm = {0};
+ const Fq12Elem expected_fq12elm = {
+ {{
+ {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ }},
+ {{
+ {0x00000000, 0x00070000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000000, 0x00000009, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000A00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ },
+ {
+ {0x00000000, 0x00000000, 0x000B0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0x0C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000},
+ }}};
+ Fq12Deserialize(&fq12elm, &serialized_fq12elm);
+ EXPECT_EQ(expected_fq12elm, fq12elm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpSerialize
+
+TEST(TinySerializeTest, FpSerializeWorks) {
+ const FpElem fpelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ FpElemStr serialize_fpelm = {0};
+ const FpElemStr expected_serialize_fpelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ FpSerialize(&serialize_fpelm, &fpelm);
+ EXPECT_EQ(expected_serialize_fpelm, serialize_fpelm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FpDeserialize
+
+TEST(TinySerializeTest, FpDeserializeWorks) {
+ const FpElemStr serialize_fpelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ FpElem fpelm = {0};
+ const FpElem expected_fpelm = {0x01020304, 0x05060708, 0x090A0B0C,
+ 0x0D0E0F10, 0x11121314, 0x15161718,
+ 0x191A1B1C, 0x1D1E1F20};
+ FpDeserialize(&fpelm, &serialize_fpelm);
+ EXPECT_EQ(expected_fpelm, fpelm);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqSerialize
+
+TEST(TinySerializeTest, EFqSerializeWorks) {
+ const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ const EccPointFq efq_point = {fqelm, fqelm};
+ const FqElemStr serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ G1ElemStr efq_point_serialize = {0};
+ const G1ElemStr expected_efq_point_serialize = {serialize_fqelm,
+ serialize_fqelm};
+ EFqSerialize(&efq_point_serialize, &efq_point);
+ EXPECT_EQ(expected_efq_point_serialize, efq_point_serialize);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFqDeserialize
+
+TEST(TinySerializeTest, EFqDeserializeWorks) {
+ const FqElemStr serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ const G1ElemStr serialize_efq_point = {serialize_fqelm, serialize_fqelm};
+ EccPointFq efq_point = {0};
+ const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ const EccPointFq expected_efq_point = {fqelm, fqelm};
+ EFqDeserialize(&efq_point, &serialize_efq_point);
+ EXPECT_EQ(expected_efq_point, efq_point);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2Serialize
+
+TEST(TinySerializeTest, EFq2SerializeWorks) {
+ const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ const EccPointFq2 efq2_point = {{fqelm, fqelm}, {fqelm, fqelm}};
+ const FqElemStr serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ G2ElemStr efq2_point_serialize = {0};
+ const G2ElemStr expected_efq2_point_serialize = {
+ {serialize_fqelm, serialize_fqelm}, {serialize_fqelm, serialize_fqelm}};
+ EFq2Serialize(&efq2_point_serialize, &efq2_point);
+ EXPECT_EQ(expected_efq2_point_serialize, efq2_point_serialize);
+}
+
+////////////////////////////////////////////////////////////////////////
+// EFq2Deserialize
+
+TEST(TinySerializeTest, EFq2DeserializeWorks) {
+ const FqElemStr serialize_fqelm = {
+ 0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
+ 0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
+ 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
+ const G2ElemStr serialize_efq2_point = {{serialize_fqelm, serialize_fqelm},
+ {serialize_fqelm, serialize_fqelm}};
+ EccPointFq2 efq2_point = {0};
+ const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
+ 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
+ const EccPointFq2 expected_efq2_point = {{fqelm, fqelm}, {fqelm, fqelm}};
+ EFq2Deserialize(&efq2_point, &serialize_efq2_point);
+ EXPECT_EQ(expected_efq2_point, efq2_point);
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/sha256-test.cc b/epid/member/tiny/math/unittests/sha256-test.cc
new file mode 100644
index 0000000..532c27e
--- /dev/null
+++ b/epid/member/tiny/math/unittests/sha256-test.cc
@@ -0,0 +1,350 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ DESCRIPTION
+ This module tests the following SHA256 routines:
+
+ Scenarios tested include:
+ - NIST SHA256 test vectors
+*/
+#include <gtest/gtest.h>
+
+namespace {
+extern "C" {
+#include "epid/member/tiny/math/sha256.h"
+}
+
+TEST(TinySha256Test, tc_sha256_update_SucceedsGivenZeroMessageLength) {
+ const uint8_t expected[32] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
+ 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
+ 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
+ 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};
+ const char* m = "";
+ sha256_state s;
+ uint8_t digest[32];
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, (const uint8_t*)m, 0);
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+/*
+ * NIST SHA256 test vector 1.
+ */
+TEST(TinySha256Test, tc_sha256_WorksGivenNistTestVector1) {
+ const uint8_t expected[32] = {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
+ 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
+ 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
+ const char* m = "abc";
+ uint8_t digest[32];
+ sha256_state s;
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, (const uint8_t*)m, strlen(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+/*
+ * NIST SHA256 test vector 2.
+ */
+TEST(TinySha256Test, tc_sha256_WorksGivenNistTestVector2) {
+ const uint8_t expected[32] = {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
+ 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
+ 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
+ 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1};
+ const char* m = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+ uint8_t digest[32];
+ sha256_state s;
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, (const uint8_t*)m, strlen(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven1NonZeroChar) {
+ const uint8_t expected[32] = {0x68, 0x32, 0x57, 0x20, 0xaa, 0xbd, 0x7c, 0x82,
+ 0xf3, 0x0f, 0x55, 0x4b, 0x31, 0x3d, 0x05, 0x70,
+ 0xc9, 0x5a, 0xcc, 0xbb, 0x7d, 0xc4, 0xb5, 0xaa,
+ 0xe1, 0x12, 0x04, 0xc0, 0x8f, 0xfe, 0x73, 0x2b};
+ const uint8_t m[1] = {0xbd};
+ uint8_t digest[32];
+ sha256_state s;
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven4NonZeroChars) {
+ const uint8_t expected[32] = {0x7a, 0xbc, 0x22, 0xc0, 0xae, 0x5a, 0xf2, 0x6c,
+ 0xe9, 0x3d, 0xbb, 0x94, 0x43, 0x3a, 0x0e, 0x0b,
+ 0x2e, 0x11, 0x9d, 0x01, 0x4f, 0x8e, 0x7f, 0x65,
+ 0xbd, 0x56, 0xc6, 0x1c, 0xcc, 0xcd, 0x95, 0x04};
+ const uint8_t m[4] = {0xc9, 0x8c, 0x8e, 0x55};
+ uint8_t digest[32];
+ sha256_state s;
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven55ZeroChars) {
+ const uint8_t expected[32] = {0x02, 0x77, 0x94, 0x66, 0xcd, 0xec, 0x16, 0x38,
+ 0x11, 0xd0, 0x78, 0x81, 0x5c, 0x63, 0x3f, 0x21,
+ 0x90, 0x14, 0x13, 0x08, 0x14, 0x49, 0x00, 0x2f,
+ 0x24, 0xaa, 0x3e, 0x80, 0xf0, 0xb8, 0x8e, 0xf7};
+ uint8_t m[55];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven56ZeroChars) {
+ const uint8_t expected[32] = {0xd4, 0x81, 0x7a, 0xa5, 0x49, 0x76, 0x28, 0xe7,
+ 0xc7, 0x7e, 0x6b, 0x60, 0x61, 0x07, 0x04, 0x2b,
+ 0xbb, 0xa3, 0x13, 0x08, 0x88, 0xc5, 0xf4, 0x7a,
+ 0x37, 0x5e, 0x61, 0x79, 0xbe, 0x78, 0x9f, 0xbb};
+ uint8_t m[56];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven57ZeroChars) {
+ const uint8_t expected[32] = {0x65, 0xa1, 0x6c, 0xb7, 0x86, 0x13, 0x35, 0xd5,
+ 0xac, 0xe3, 0xc6, 0x07, 0x18, 0xb5, 0x05, 0x2e,
+ 0x44, 0x66, 0x07, 0x26, 0xda, 0x4c, 0xd1, 0x3b,
+ 0xb7, 0x45, 0x38, 0x1b, 0x23, 0x5a, 0x17, 0x85};
+ uint8_t m[57];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven64ZeroChars) {
+ const uint8_t expected[32] = {0xf5, 0xa5, 0xfd, 0x42, 0xd1, 0x6a, 0x20, 0x30,
+ 0x27, 0x98, 0xef, 0x6e, 0xd3, 0x09, 0x97, 0x9b,
+ 0x43, 0x00, 0x3d, 0x23, 0x20, 0xd9, 0xf0, 0xe8,
+ 0xea, 0x98, 0x31, 0xa9, 0x27, 0x59, 0xfb, 0x4b};
+ uint8_t m[64];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven1000ZeroChars) {
+ const uint8_t expected[32] = {0x54, 0x1b, 0x3e, 0x9d, 0xaa, 0x09, 0xb2, 0x0b,
+ 0xf8, 0x5f, 0xa2, 0x73, 0xe5, 0xcb, 0xd3, 0xe8,
+ 0x01, 0x85, 0xaa, 0x4e, 0xc2, 0x98, 0xe7, 0x65,
+ 0xdb, 0x87, 0x74, 0x2b, 0x70, 0x13, 0x8a, 0x53};
+ uint8_t m[1000];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven1000NonZeroChars) {
+ const uint8_t expected[32] = {0xc2, 0xe6, 0x86, 0x82, 0x34, 0x89, 0xce, 0xd2,
+ 0x01, 0x7f, 0x60, 0x59, 0xb8, 0xb2, 0x39, 0x31,
+ 0x8b, 0x63, 0x64, 0xf6, 0xdc, 0xd8, 0x35, 0xd0,
+ 0xa5, 0x19, 0x10, 0x5a, 0x1e, 0xad, 0xd6, 0xe4};
+ uint8_t m[1000];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x41, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven1005NonZeroChars) {
+ const uint8_t expected[32] = {0xf4, 0xd6, 0x2d, 0xde, 0xc0, 0xf3, 0xdd, 0x90,
+ 0xea, 0x13, 0x80, 0xfa, 0x16, 0xa5, 0xff, 0x8d,
+ 0xc4, 0xc5, 0x4b, 0x21, 0x74, 0x06, 0x50, 0xf2,
+ 0x4a, 0xfc, 0x41, 0x20, 0x90, 0x35, 0x52, 0xb0};
+ uint8_t m[1005];
+ uint8_t digest[32];
+ sha256_state s;
+
+ (void)memset(m, 0x55, sizeof(m));
+
+ tc_sha256_init(&s);
+ tc_sha256_update(&s, m, sizeof(m));
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test, tc_sha256_WorksGiven1000ZeroCharsUpdated1000Times) {
+ const uint8_t expected[32] = {0xd2, 0x97, 0x51, 0xf2, 0x64, 0x9b, 0x32, 0xff,
+ 0x57, 0x2b, 0x5e, 0x0a, 0x9f, 0x54, 0x1e, 0xa6,
+ 0x60, 0xa5, 0x0f, 0x94, 0xff, 0x0b, 0xee, 0xdf,
+ 0xb0, 0xb6, 0x92, 0xb9, 0x24, 0xcc, 0x80, 0x25};
+ uint8_t m[1000];
+ uint8_t digest[32];
+ sha256_state s;
+ unsigned int i;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ for (i = 0; i < 1000; ++i) {
+ tc_sha256_update(&s, m, sizeof(m));
+ }
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test,
+ DISABLED_SLOW_tc_sha256_WorksGiven32768NonZeroCharsUpdated16384Times) {
+ const uint8_t expected[32] = {0x15, 0xa1, 0x86, 0x8c, 0x12, 0xcc, 0x53, 0x95,
+ 0x1e, 0x18, 0x23, 0x44, 0x27, 0x74, 0x47, 0xcd,
+ 0x09, 0x79, 0x53, 0x6b, 0xad, 0xcc, 0x51, 0x2a,
+ 0xd2, 0x4c, 0x67, 0xe9, 0xb2, 0xd4, 0xf3, 0xdd};
+ uint8_t m[32768];
+ uint8_t digest[32];
+ sha256_state s;
+ unsigned int i;
+
+ (void)memset(m, 0x5a, sizeof(m));
+
+ tc_sha256_init(&s);
+ for (i = 0; i < 16384; ++i) {
+ tc_sha256_update(&s, m, sizeof(m));
+ }
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha256Test,
+ DISABLED_SLOW_tc_sha256_WorksGiven32768NonZeroCharsUpdated33280Times) {
+ const uint8_t expected[32] = {0x46, 0x1c, 0x19, 0xa9, 0x3b, 0xd4, 0x34, 0x4f,
+ 0x92, 0x15, 0xf5, 0xec, 0x64, 0x35, 0x70, 0x90,
+ 0x34, 0x2b, 0xc6, 0x6b, 0x15, 0xa1, 0x48, 0x31,
+ 0x7d, 0x27, 0x6e, 0x31, 0xcb, 0xc2, 0x0b, 0x53};
+ uint8_t m[32768];
+ uint8_t digest[32];
+ sha256_state s;
+ unsigned int i;
+
+ (void)memset(m, 0x00, sizeof(m));
+
+ tc_sha256_init(&s);
+ for (i = 0; i < 33280; ++i) {
+ tc_sha256_update(&s, m, sizeof(m));
+ }
+ tc_sha256_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+} // namespace
diff --git a/epid/member/tiny/math/unittests/sha512-test.cc b/epid/member/tiny/math/unittests/sha512-test.cc
new file mode 100644
index 0000000..654c057
--- /dev/null
+++ b/epid/member/tiny/math/unittests/sha512-test.cc
@@ -0,0 +1,108 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of SHA-512 implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+
+namespace {
+extern "C" {
+#include "epid/member/tiny/math/sha512.h"
+}
+
+TEST(TinySha512Test, WorksGivenTinyTestVector1) {
+ const uint8_t expected[SHA512_DIGEST_SIZE] = {
+ 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73,
+ 0x49, 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9,
+ 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21,
+ 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23,
+ 0xa3, 0xfe, 0xeb, 0xbd, 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8,
+ 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f};
+ const char* m = "abc";
+ uint8_t digest[SHA512_DIGEST_SIZE];
+ sha512_state s;
+
+ tinysha512_init(&s);
+ tinysha512_update(&s, (const uint8_t*)m, strlen(m));
+ tinysha512_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha512Test, WorksGivenTinyTestVector2) {
+ const uint8_t expected[SHA512_DIGEST_SIZE] = {
+ 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28,
+ 0x50, 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57,
+ 0x15, 0xdc, 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47,
+ 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2,
+ 0x87, 0x7e, 0xec, 0x2f, 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a,
+ 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e};
+ const char* m = "";
+ uint8_t digest[SHA512_DIGEST_SIZE];
+ sha512_state s;
+
+ tinysha512_init(&s);
+ tinysha512_update(&s, (const uint8_t*)m, strlen(m));
+ tinysha512_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha512Test, WorksGivenTinyTestVector3) {
+ const uint8_t expected[SHA512_DIGEST_SIZE] = {
+ 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a, 0x0c, 0xed, 0x7b,
+ 0xeb, 0x8e, 0x08, 0xa4, 0x16, 0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2,
+ 0x28, 0xa8, 0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35, 0x96,
+ 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9, 0xaa, 0x1d, 0x3b, 0xea,
+ 0x57, 0x78, 0x9c, 0xa0, 0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7,
+ 0x03, 0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45};
+ const char* m = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+ uint8_t digest[SHA512_DIGEST_SIZE];
+ sha512_state s;
+
+ tinysha512_init(&s);
+ tinysha512_update(&s, (const uint8_t*)m, strlen(m));
+ tinysha512_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+TEST(TinySha512Test, WorksGivenTinyTestVector4) {
+ const uint8_t expected[SHA512_DIGEST_SIZE] = {
+ 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda, 0x8c, 0xf4, 0xf7,
+ 0x28, 0x14, 0xfc, 0x14, 0x3f, 0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f,
+ 0x7f, 0xa1, 0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18, 0x50,
+ 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4, 0x33, 0x1b, 0x99, 0xde,
+ 0xc4, 0xb5, 0x43, 0x3a, 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26,
+ 0x54, 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09};
+ const char* m =
+ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnop"
+ "jklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
+ uint8_t digest[SHA512_DIGEST_SIZE];
+ sha512_state s;
+
+ tinysha512_init(&s);
+ tinysha512_update(&s, (const uint8_t*)m, strlen(m));
+ tinysha512_final(digest, &s);
+ EXPECT_TRUE(0 == memcmp(expected, digest, sizeof(digest)))
+ << digest << std::endl
+ << expected;
+}
+
+} // namespace
diff --git a/epid/member/tiny/math/unittests/utest.parts b/epid/member/tiny/math/unittests/utest.parts
new file mode 100644
index 0000000..2709baf
--- /dev/null
+++ b/epid/member/tiny/math/unittests/utest.parts
@@ -0,0 +1,47 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build configuration for unit test of tiny math library.
+"""
+Import('*')
+env.PartName('utest')
+
+env.DependsOn([Component('gtest'),
+ Component(env.subst('${PART_PARENT_NAME}'))])
+
+utest_files = Pattern(src_dir='.',
+ includes=['*-test.cc',
+ '*-testhelper.cc'],
+ recursive=True).files()
+
+env.Append(CPPPATH='#')
+
+env['UNIT_TEST_TARGET_NAME'] = "${PART_PARENT_NAME}-${UNIT_TEST_TARGET}"
+
+utest = env.UnitTest('${PART_SHORT_NAME}',
+ utest_files,
+ command_args=[
+ '--gtest_filter=**',
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ #'--gtest_break_on_failure',
+ #'--gtest_catch_exceptions=0',
+ ],
+ data_src=[],
+ make_pdb=(env.isConfigBasedOn('debug')),
+ INSTALL_BIN='${INSTALL_TEST_BIN}',
+ )
diff --git a/epid/member/tiny/math/unittests/vli-test.cc b/epid/member/tiny/math/unittests/vli-test.cc
new file mode 100644
index 0000000..0d15c10
--- /dev/null
+++ b/epid/member/tiny/math/unittests/vli-test.cc
@@ -0,0 +1,379 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Unit tests of large integer implementation.
+/*! \file */
+
+#include <gtest/gtest.h>
+#include <limits.h> // for CHAR_BIT
+#include <cstring>
+#include <random>
+
+#include "epid/member/tiny/math/unittests/cmp-testhelper.h"
+#include "epid/member/tiny/math/unittests/onetimepad.h"
+
+extern "C" {
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/vli.h"
+}
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////
+// VliAdd
+
+TEST(TinyVliTest, VliAddWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt expected = {0};
+ VeryLargeInt left = {0};
+ VeryLargeInt right = {0};
+ left.word[0] = 1;
+ right.word[0] = 2;
+ expected.word[0] = 3;
+ VliAdd(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+TEST(TinyVliTest, VliAddCalculatesCarry) {
+ VeryLargeInt left = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VeryLargeInt right = {{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}};
+ VeryLargeInt expected = {{0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}};
+ uint32_t expected_carry = 0x1;
+ uint32_t carry = 0;
+ VeryLargeInt result = {0};
+ carry = VliAdd(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+ EXPECT_EQ(expected_carry, carry);
+}
+////////////////////////////////////////////////////////////////////////
+// VliMul
+TEST(TinyVliTest, VliMultWorks) {
+ VeryLargeIntProduct result = {0};
+ VeryLargeIntProduct expected = {0};
+ VeryLargeInt left = {0}, right = {0};
+ left.word[0] = 2;
+ right.word[0] = 2;
+ expected.word[0] = 4;
+ VliMul(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+TEST(TinyVliTest, VliMultWorksWithOverflow) {
+ VeryLargeIntProduct result = {0};
+ VeryLargeIntProduct expected = {
+ {0xfffffffe, 0xfffffffd, 0xfffffffd, 0xfffffffd, 0xfffffffd, 0xfffffffd,
+ 0xfffffffd, 0xfffffffd, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}};
+ VeryLargeInt left = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VeryLargeInt right = {{0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}};
+ VliMul(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliRShift
+TEST(TinyVliTest, VliRShiftWorks) {
+ VeryLargeInt result = {0}, expected = {0};
+ VeryLargeInt in = {0};
+ uint32_t shift = 1;
+ in.word[0] = 4;
+ expected.word[0] = 2;
+ VliRShift(&result, &in, shift);
+ EXPECT_EQ(expected, result);
+}
+TEST(TinyVliTest, VliRShiftWorksWithOverlap) {
+ VeryLargeInt result = {0}, expected = {0};
+ VeryLargeInt in = {0};
+ uint32_t shift = 4;
+ in.word[0] = 0x00000008;
+ in.word[1] = 0xffffffff;
+ expected.word[0] = 0xf0000000;
+ expected.word[1] = 0x0fffffff;
+ VliRShift(&result, &in, shift);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliSub
+TEST(TinyVliTest, VliSubWorks) {
+ VeryLargeInt result = {0}, expected = {0};
+ VeryLargeInt left = {0}, right = {0};
+ uint32_t borrow = 0;
+ uint32_t expected_borrow = 0;
+ left.word[0] = 4;
+ right.word[0] = 2;
+ expected.word[0] = 2;
+ borrow = VliSub(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+ EXPECT_EQ(expected_borrow, borrow);
+}
+TEST(TinyVliTest, VliSubWorksWithBorrow) {
+ VeryLargeInt result = {0};
+ VeryLargeInt expected = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VeryLargeInt left = {0}, right = {0};
+ uint32_t borrow = 0;
+ uint32_t expected_borrow = 1;
+ left.word[0] = 2;
+ right.word[0] = 3;
+ borrow = VliSub(&result, &left, &right);
+ EXPECT_EQ(expected, result);
+ EXPECT_EQ(expected_borrow, borrow);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliSet
+
+TEST(TinyVliTest, VliSetWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt in = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VliSet(&result, &in);
+ EXPECT_EQ(in, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliClear
+
+TEST(TinyVliTest, VliClearWorks) {
+ VeryLargeInt expected = {0};
+ VeryLargeInt in_out = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VliClear(&in_out);
+ EXPECT_EQ(expected, in_out);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliIsZero
+
+TEST(TinyVliTest, VliIsZeroAcceptsZero) {
+ int is_zero = 0;
+ VeryLargeInt in_zero = {0};
+ is_zero = VliIsZero(&in_zero);
+ EXPECT_TRUE(is_zero);
+}
+TEST(TinyVliTest, VliIsZeroRejectsNonZero) {
+ int is_zero = 0;
+ VeryLargeInt in_nonzero = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ is_zero = VliIsZero(&in_nonzero);
+ EXPECT_FALSE(is_zero);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliCondSet
+
+TEST(TinyVliTest, VliCondSetWorksForTrue) {
+ VeryLargeInt result = {0};
+ VeryLargeInt true_val = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VeryLargeInt false_val = {{0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa,
+ 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa}};
+ VliCondSet(&result, &true_val, &false_val, 1);
+ EXPECT_EQ(true_val, result);
+}
+TEST(TinyVliTest, VliCondSetWorksForFalse) {
+ VeryLargeInt result = {0};
+ VeryLargeInt true_val = {{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}};
+ VeryLargeInt false_val = {{0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa,
+ 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa}};
+ VliCondSet(&result, &true_val, &false_val, 0);
+ EXPECT_EQ(false_val, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliTestBit
+
+TEST(TinyVliTest, VliTestBitWorks) {
+ VeryLargeInt in = {0};
+ uint32_t bit_set = 0;
+ in.word[0] = 4;
+ bit_set = VliTestBit(&in, 1);
+ EXPECT_EQ((uint32_t)0, bit_set);
+ bit_set = VliTestBit(&in, 2);
+ EXPECT_EQ((uint32_t)1, bit_set);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliRand
+
+TEST(TinyVliTest, VliRandWorks) {
+ OneTimePad my_prng;
+ VeryLargeInt expected_rand_val1 = {{1, 0, 0, 0, 0, 0, 0, 0}};
+ my_prng.InitUint8({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1});
+ VeryLargeInt rand_val1 = {0};
+ EXPECT_TRUE(VliRand(&rand_val1, &OneTimePad::Generate, &my_prng));
+ EXPECT_EQ(expected_rand_val1, rand_val1);
+ EXPECT_EQ(256u, my_prng.BitsConsumed());
+
+ VeryLargeInt expected_rand_val2 = {{0x1c6f5a0f, 0xeaa878b3, 0xc71dab6b,
+ 0x1a101ad6, 0x1fe6394f, 0x1bec36ab,
+ 0x07a3e97f, 0x36507914}};
+ VeryLargeInt rand_val2 = {0};
+ my_prng.InitUint32({0x14795036, 0x7fe9a307, 0xab36ec1b, 0x4f39e61f,
+ 0xd61a101a, 0x6bab1dc7, 0xb378a8ea, 0x0f5a6f1c});
+ EXPECT_TRUE(VliRand(&rand_val2, &OneTimePad::Generate, &my_prng));
+ EXPECT_EQ(expected_rand_val2, rand_val2);
+ EXPECT_EQ(256u, my_prng.BitsConsumed());
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliCmp
+
+TEST(TinyVliTest, VliCmpWorksForLessThan) {
+ VeryLargeInt in_val1 = {0};
+ VeryLargeInt in_val2 = {0};
+ int res = 0;
+ in_val1.word[0] = 1;
+ in_val2.word[0] = 2;
+ res = VliCmp(&in_val1, &in_val2);
+ EXPECT_EQ(-1, res);
+}
+TEST(TinyVliTest, VliCmpWorksForEqual) {
+ VeryLargeInt in_val1 = {0};
+ VeryLargeInt in_val2 = {0};
+ int res = 0;
+ in_val1.word[0] = 2;
+ in_val2.word[0] = 2;
+ res = VliCmp(&in_val1, &in_val2);
+ EXPECT_EQ(0, res);
+}
+TEST(TinyVliTest, VliCmpWorksGreaterThan) {
+ VeryLargeInt in_val1 = {0};
+ VeryLargeInt in_val2 = {0};
+ int res = 0;
+ in_val1.word[0] = 1;
+ in_val2.word[0] = 2;
+ res = VliCmp(&in_val2, &in_val1);
+ EXPECT_EQ(1, res);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModAdd
+
+TEST(TinyVliTest, VliModAddWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt left = {0};
+ VeryLargeInt right = {0};
+ VeryLargeInt expected = {0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ left.word[0] = 0x9;
+ right.word[0] = 0x8;
+ expected.word[0] = 0x11;
+ VliModAdd(&result, &left, &right, &mod);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModSub
+
+TEST(TinyVliTest, VliModSubWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt left = {0};
+ VeryLargeInt right = {0};
+ VeryLargeInt expected = {0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ left.word[0] = 0x18;
+ right.word[0] = 0x12;
+ expected.word[0] = 0x6;
+ VliModSub(&result, &left, &right, &mod);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModMul
+
+TEST(TinyVliTest, VliModMultWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt left = {0};
+ VeryLargeInt right = {0};
+ VeryLargeInt expected = {0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ left.word[0] = 0x10;
+ right.word[0] = 0x2;
+ expected.word[0] = 0x20;
+ VliModMul(&result, &left, &right, &mod);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModExp
+
+TEST(TinyVliTest, VliModExpWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt base = {0};
+ VeryLargeInt exp = {0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ VeryLargeInt expected = {0};
+ base.word[0] = 0x4;
+ exp.word[0] = 0x2;
+ expected.word[0] = 0x10;
+ VliModExp(&result, &base, &exp, &mod);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModInv
+
+TEST(TinyVliTest, VliModInvWorks) {
+ VeryLargeInt a = {0x76abb18a, 0x92c0f7b9, 0x2c1a37e0, 0x7fdf6ca1,
+ 0xe3401760, 0x66eb7d52, 0x918d50a7, 0x12a65bd6};
+ VeryLargeInt q = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ VeryLargeInt expected = {0x5a686df6, 0x56b6ab63, 0xdf907c6f, 0x44ad8d51,
+ 0xa5513462, 0xc597ef78, 0x93711b39, 0x15171a1e};
+ VeryLargeInt result;
+ VliModInv(&result, &a, &q);
+ EXPECT_EQ(result, expected);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModSquare
+
+TEST(TinyVliTest, VliModSquareWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeInt input = {0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ VeryLargeInt expected = {0};
+ input.word[0] = 0x4;
+ expected.word[0] = 0x10;
+ VliModSquare(&result, &input, &mod);
+ EXPECT_EQ(expected, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// VliModBarrett
+
+TEST(TinyVliTest, VliModBarrettWorks) {
+ VeryLargeInt result = {0};
+ VeryLargeIntProduct product = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF,
+ 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0};
+ VeryLargeInt mod = {0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB,
+ 0xEE71A49F, 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF};
+ VeryLargeInt expected = {0};
+ product.word[0] += 0xF;
+ expected.word[0] = 0xF;
+ VliModBarrett(&result, &product, &mod);
+ EXPECT_EQ(expected, result);
+}
+} // namespace
diff --git a/epid/member/tiny/math/vli.h b/epid/member/tiny/math/vli.h
new file mode 100644
index 0000000..5ea61db
--- /dev/null
+++ b/epid/member/tiny/math/vli.h
@@ -0,0 +1,196 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of Large Integer math
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_MATH_VLI_H_
+#define EPID_MEMBER_TINY_MATH_VLI_H_
+
+#include <stdint.h>
+#include "epid/common/bitsupplier.h"
+/// \cond
+typedef struct VeryLargeInt VeryLargeInt;
+typedef struct VeryLargeIntProduct VeryLargeIntProduct;
+/// \endcond
+
+/// Add two large integers.
+/*!
+\param[out] result target.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+
+\returns the carry portion of the addition.
+*/
+uint32_t VliAdd(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right);
+
+/// Multiply two large integers.
+/*!
+\param[out] result of multiplying left and right.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+*/
+void VliMul(VeryLargeIntProduct* result, VeryLargeInt const* left,
+ VeryLargeInt const* right);
+
+/// Right shift a large integers.
+/*!
+\param[out] result target.
+\param[in] in The value to be shifted.
+\param[in] shift The number of bits to shift.
+*/
+void VliRShift(VeryLargeInt* result, VeryLargeInt const* in, uint32_t shift);
+
+/// Subtract two large integers.
+/*!
+\param[out] result target.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+\returns 1 on success, 0 on failure
+*/
+uint32_t VliSub(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right);
+
+/// Set a large integer's value.
+/*!
+\param[out] result target.
+\param[in] in value to set.
+*/
+void VliSet(VeryLargeInt* result, VeryLargeInt const* in);
+
+/// Clear a large integer's value.
+/*!
+\param[out] result value to clear.
+*/
+void VliClear(VeryLargeInt* result);
+
+/// Test if a large integer is zero.
+/*!
+\param[in] in the value to test.
+\returns A value different from zero (i.e., true) if indeed
+ the value is zero. Zero (i.e., false) otherwise.
+*/
+int VliIsZero(VeryLargeInt const* in);
+
+/// Conditionally Set a large inter's value to one of two values.
+/*!
+\param[out] result target.
+\param[in] true_val value to set if condition is true.
+\param[in] false_val value to set if condition is false.
+\param[in] truth_val value of condition.
+*/
+void VliCondSet(VeryLargeInt* result, VeryLargeInt const* true_val,
+ VeryLargeInt const* false_val, int truth_val);
+
+/// Test the value of a bit in a large integer.
+/*!
+\param[in] in the value to test.
+\param[in] bit the bit index.
+
+\returns value of the bit (1 or 0).
+*/
+uint32_t VliTestBit(VeryLargeInt const* in, uint32_t bit);
+
+/// Generate a random large integer.
+/*!
+\param[in] result the random value.
+\param[in] rnd_func Random number generator.
+\param[in] rnd_param Pass through context data for rnd_func.
+\returns A value different from zero (i.e., true) if on success.
+ Zero (i.e., false) otherwise.
+*/
+int VliRand(VeryLargeInt* result, BitSupplier rnd_func, void* rnd_param);
+
+/// compare two large integers.
+/*!
+\param[in] left the left hand value.
+\param[in] right the right hand value.
+
+\returns the sign of left - right
+*/
+int VliCmp(VeryLargeInt const* left, VeryLargeInt const* right);
+
+/// Add two large integers modulo a value.
+/*!
+\param[out] result target.
+\param[in] left The first operand to be added.
+\param[in] right The second operand to be added.
+\param[in] mod The modulo.
+*/
+void VliModAdd(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod);
+
+/// Subtract two large integers modulo a value.
+/*!
+\param[out] result target.
+\param[in] left The operand to be subtracted from.
+\param[in] right The operand to subtract.
+\param[in] mod The modulo.
+*/
+void VliModSub(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod);
+
+/// Multiply two large integers modulo a value.
+/*!
+\param[out] result target.
+\param[in] left The first operand to be multiplied.
+\param[in] right The second operand to be multiplied.
+\param[in] mod The modulo.
+*/
+void VliModMul(VeryLargeInt* result, VeryLargeInt const* left,
+ VeryLargeInt const* right, VeryLargeInt const* mod);
+
+/// Exponentiate a large integer modulo a value.
+/*!
+\param[out] result target.
+\param[in] base the base.
+\param[in] exp the exponent.
+\param[in] mod The modulo.
+*/
+void VliModExp(VeryLargeInt* result, VeryLargeInt const* base,
+ VeryLargeInt const* exp, VeryLargeInt const* mod);
+
+/// Invert a large integer modulo a value.
+/*!
+\param[out] result target.
+\param[in] input the value to invert.
+\param[in] mod The modulo.
+*/
+void VliModInv(VeryLargeInt* result, VeryLargeInt const* input,
+ VeryLargeInt const* mod);
+
+/// Square a large integer modulo a value.
+/*!
+\param[out] result target.
+\param[in] input the base.
+\param[in] mod The modulo.
+*/
+void VliModSquare(VeryLargeInt* result, VeryLargeInt const* input,
+ VeryLargeInt const* mod);
+
+/// Reduce a value to a modulo.
+/*!
+\param[out] result target.
+\param[in] input the base.
+\param[in] mod The modulo.
+
+\warning This function makes significant assumptions about
+the range of values input
+*/
+void VliModBarrett(VeryLargeInt* result, VeryLargeIntProduct const* input,
+ VeryLargeInt const* mod);
+
+#endif // EPID_MEMBER_TINY_MATH_VLI_H_
diff --git a/epid/member/tiny/src/allowed_basenames.c b/epid/member/tiny/src/allowed_basenames.c
new file mode 100644
index 0000000..9812988
--- /dev/null
+++ b/epid/member/tiny/src/allowed_basenames.c
@@ -0,0 +1,76 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename management implementation
+/*! \file */
+
+#include "epid/member/tiny/src/allowed_basenames.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+#if defined(SHA256_SUPPORT)
+#define BASENAME_SHA_ALG kSha256
+#elif defined(SHA512_SUPPORT)
+#define BASENAME_SHA_ALG kSha512
+#endif
+
+size_t BasenamesGetSize(size_t num_basenames) {
+ return sizeof(AllowedBasenames) - sizeof(sha_digest) +
+ sizeof(sha_digest) * (num_basenames);
+}
+
+void InitBasenames(AllowedBasenames* basename_container, size_t num_basenames) {
+ basename_container->current_bsn_number = 0;
+ basename_container->max_bsn_number = num_basenames;
+ memset(basename_container->basename_digest->digest, 0,
+ sizeof(basename_container->basename_digest) * num_basenames);
+}
+
+int IsBasenameAllowed(AllowedBasenames const* basename_container,
+ void const* basename, size_t length) {
+ size_t d = 0;
+ tiny_sha sha_state;
+ sha_digest digest;
+ // calculate hash of input basename
+ tinysha_init(BASENAME_SHA_ALG, &sha_state);
+ tinysha_update(&sha_state, basename, length);
+ tinysha_final(digest.digest, &sha_state);
+ // compare hash of input basename with stored hashes
+ for (d = 0; d < basename_container->current_bsn_number; d++) {
+ if (!memcmp(digest.digest, &basename_container->basename_digest[d].digest,
+ tinysha_digest_size(&sha_state))) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int AllowBasename(AllowedBasenames* basename_container, void const* basename,
+ size_t length) {
+ tiny_sha sha_state;
+ sha_digest digest;
+ if (basename_container->max_bsn_number <=
+ basename_container->current_bsn_number) {
+ return 0;
+ }
+ // calculate hash of input basename
+ tinysha_init(BASENAME_SHA_ALG, &sha_state);
+ tinysha_update(&sha_state, basename, length);
+ tinysha_final(digest.digest, &sha_state);
+ // copy hash of input basename into digest buffer
+ basename_container->basename_digest[basename_container->current_bsn_number] =
+ digest;
+ basename_container->current_bsn_number++;
+ return 1;
+}
diff --git a/epid/member/tiny/src/allowed_basenames.h b/epid/member/tiny/src/allowed_basenames.h
new file mode 100644
index 0000000..aed9c6c
--- /dev/null
+++ b/epid/member/tiny/src/allowed_basenames.h
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Basename management APIs
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_SRC_ALLOWED_BASENAMES_H_
+#define EPID_MEMBER_TINY_SRC_ALLOWED_BASENAMES_H_
+
+#include <stddef.h>
+#include "epid/member/tiny/math/hashwrap.h"
+
+typedef struct AllowedBasenames {
+ size_t current_bsn_number; ///< Number of basenames registered
+ size_t max_bsn_number; ///< Maximum number of basenames to store
+ sha_digest
+ basename_digest[1]; ///< digest of registrered basenames (flexible array)
+} AllowedBasenames;
+
+/// Get allowed basenames container size
+size_t BasenamesGetSize(size_t num_basenames);
+
+/// Initilize allowed basenames container
+void InitBasenames(AllowedBasenames* basename_container, size_t num_basenames);
+
+/// Checks if given basename is allowed
+int IsBasenameAllowed(AllowedBasenames const* basename_container,
+ void const* basename, size_t length);
+
+/// Adds a new allowed basename
+int AllowBasename(AllowedBasenames* basename_container, void const* basename,
+ size_t length);
+
+#endif // EPID_MEMBER_TINY_SRC_ALLOWED_BASENAMES_H_
diff --git a/epid/member/tiny/src/context.h b/epid/member/tiny/src/context.h
new file mode 100644
index 0000000..1627026
--- /dev/null
+++ b/epid/member/tiny/src/context.h
@@ -0,0 +1,75 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member context interface.
+/*! \file */
+#ifndef EPID_MEMBER_TINY_SRC_CONTEXT_H_
+#define EPID_MEMBER_TINY_SRC_CONTEXT_H_
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/src/allowed_basenames.h"
+#include "epid/member/tiny/src/native_types.h"
+
+/// Size of SigRl with zero entries
+#define MIN_SIGRL_SIZE (sizeof(SigRl) - sizeof(SigRlEntry))
+
+#ifdef USE_SIGRL_BY_REFERENCE
+
+// SIZE_MAX is not guaranteed in C89/90
+#define SIZE_T_MAX ((size_t)(-1))
+
+/// Maximum number of possible entries in SigRl used by reference
+#define MAX_SIGRL_ENTRIES ((SIZE_T_MAX - MIN_SIGRL_SIZE) / sizeof(SigRlEntry))
+
+/// Maximum space needed to store SigRl data in context
+#define SIGRL_HEAP_SIZE (0)
+
+#else // !defined(USE_SIGRL_BY_REFERENCE)
+
+#ifndef MAX_SIGRL_ENTRIES
+/// Maximum number of possible entries in SigRl copied by value
+#define MAX_SIGRL_ENTRIES (5)
+#endif
+
+/// Maximum space needed to store SigRl data in context
+#define SIGRL_HEAP_SIZE \
+ (MIN_SIGRL_SIZE + MAX_SIGRL_ENTRIES * sizeof(SigRlEntry))
+
+#endif // !defined(USE_SIGRL_BY_REFERENCE)
+
+#ifndef MAX_ALLOWED_BASENAMES
+/// Maximum number of allowed base names
+#define MAX_ALLOWED_BASENAMES (5)
+#endif
+
+/// Member context definition
+typedef struct MemberCtx {
+ GroupPubKey pub_key; ///< group public key
+ HashAlg hash_alg; ///< Hash algorithm to use
+ MembershipCredential credential; ///< Membership credential
+ FpElem f; ///< secret f value
+ NativeMemberPrecomp precomp; ///< Precomputed pairing values
+ PairingState pairing_state; ///< pairing state
+ int f_is_set; ///< f initialized
+ int is_provisioned; ///< member fully provisioned with key material
+ BitSupplier rnd_func; ///< Pseudo random number generation function
+ void* rnd_param; ///< Pointer to user context for rnd_func
+ AllowedBasenames* allowed_basenames; ///< Allowed basenames
+ SigRl* sig_rl; ///< Pointer to Signature based revocation list
+ unsigned char heap[1]; ///< Bulk storage space (flexible array)
+} MemberCtx;
+
+#endif // EPID_MEMBER_TINY_SRC_CONTEXT_H_
diff --git a/epid/member/tiny/src/createjoinrequest.c b/epid/member/tiny/src/createjoinrequest.c
new file mode 100644
index 0000000..0dee709
--- /dev/null
+++ b/epid/member/tiny/src/createjoinrequest.c
@@ -0,0 +1,121 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member CreateJoinRequest implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/hashwrap.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/validate.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static const FpElemStr epid20_p_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+
+static const G2ElemStr epid20_g2_str = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
+
+static const G1ElemStr epid20_g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+
+EpidStatus EPID_API EpidCreateJoinRequest(MemberCtx* ctx,
+ GroupPubKey const* pub_key,
+ IssuerNonce const* ni,
+ JoinRequest* join_request) {
+ EccPointFq F;
+ EccPointFq R_str;
+ FpElem r;
+ FpElem c;
+ FpElem t;
+ tiny_sha sha_state;
+ sha_digest digest;
+ G1ElemStr g1_str;
+ NativeGroupPubKey deserialized_pkey;
+
+ if (!ctx || !pub_key || !ni || !join_request) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->f_is_set) {
+ return kEpidBadArgErr;
+ }
+
+ GroupPubKeyDeserialize(&deserialized_pkey, pub_key);
+ if (!GroupPubKeyIsInRange(&deserialized_pkey)) {
+ return kEpidBadArgErr;
+ }
+ // pick number r between 1 - (p-1)
+ if (!FpRandNonzero(&r, ctx->rnd_func, ctx->rnd_param)) {
+ return kEpidMathErr;
+ }
+
+ // F = h1^f
+ EFqAffineExp(&F, &deserialized_pkey.h1, &ctx->f);
+ // R_str = h1^r
+ EFqAffineExp(&R_str, &deserialized_pkey.h1, &r);
+
+ // c = hash(p || g1 || g2 || h1 || h2 || w || F || R || NI) mod p
+ tinysha_init(ctx->hash_alg, &sha_state);
+ tinysha_update(&sha_state, (void const*)&epid20_p_str, sizeof(epid20_p_str));
+ tinysha_update(&sha_state, (void const*)&epid20_g1_str,
+ sizeof(epid20_g1_str));
+ tinysha_update(&sha_state, (void const*)&epid20_g2_str,
+ sizeof(epid20_g2_str));
+ tinysha_update(&sha_state, (void const*)&pub_key->h1, sizeof(pub_key->h1));
+ tinysha_update(&sha_state, (void const*)&pub_key->h2, sizeof(pub_key->h2));
+ tinysha_update(&sha_state, (void const*)&pub_key->w, sizeof(pub_key->w));
+ EFqSerialize(&join_request->F, &F);
+ tinysha_update(&sha_state, (void const*)&join_request->F,
+ sizeof(join_request->F));
+ EFqSerialize(&g1_str, &R_str);
+ tinysha_update(&sha_state, (void const*)&g1_str, sizeof(g1_str));
+ tinysha_update(&sha_state, (void const*)ni, sizeof(*ni));
+ tinysha_final(digest.digest, &sha_state);
+ FpFromHash(&c, digest.digest, tinysha_digest_size(&sha_state));
+ FpSerialize(&join_request->c, &c);
+
+ // computes s = (r + c * f) mod p
+ FpMul(&t, &c, &ctx->f);
+ FpAdd(&t, &t, &r);
+ FpSerialize(&join_request->s, &t);
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/decompresskey.c b/epid/member/tiny/src/decompresskey.c
new file mode 100644
index 0000000..2af6e7d
--- /dev/null
+++ b/epid/member/tiny/src/decompresskey.c
@@ -0,0 +1,29 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member DecompressPrivKey implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+EpidStatus EPID_API EpidDecompressPrivKey(
+ GroupPubKey const* pub_key, CompressedPrivKey const* compressed_privkey,
+ PrivKey* priv_key) {
+ (void)pub_key;
+ (void)compressed_privkey;
+ (void)priv_key;
+ return kEpidNotImpl;
+}
diff --git a/epid/member/tiny/src/init.c b/epid/member/tiny/src/init.c
new file mode 100644
index 0000000..845d0a1
--- /dev/null
+++ b/epid/member/tiny/src/init.c
@@ -0,0 +1,94 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member Init/Deinit implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+#include <stdint.h>
+#include "epid/common/types.h"
+#include "epid/member/software_member.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+EpidStatus EPID_API EpidMemberGetSize(MemberParams const* params,
+ size_t* context_size) {
+ const size_t kMinContextSize =
+ sizeof(MemberCtx) - sizeof(((MemberCtx*)0)->heap);
+ if (!params || !context_size) {
+ return kEpidBadArgErr;
+ }
+ *context_size = kMinContextSize + SIGRL_HEAP_SIZE +
+ BasenamesGetSize(MAX_ALLOWED_BASENAMES);
+ return kEpidNoErr;
+}
+
+EpidStatus EPID_API EpidMemberInit(MemberParams const* params, MemberCtx* ctx) {
+ EpidStatus sts = kEpidNoErr;
+ size_t context_size = 0;
+ if (!params || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ sts = EpidMemberGetSize(params, &context_size);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+
+ memset(ctx, 0, context_size);
+
+ ctx->is_provisioned = 0;
+ ctx->f_is_set = 0;
+
+ // set the default hash algorithm to sha512
+ ctx->hash_alg = kSha512;
+ ctx->f_is_set = 0;
+ // set allowed basenames pointer to the heap
+ ctx->allowed_basenames = (AllowedBasenames*)&ctx->heap[SIGRL_HEAP_SIZE];
+ InitBasenames(ctx->allowed_basenames, MAX_ALLOWED_BASENAMES);
+ if (params->f) {
+ FpDeserialize(&ctx->f, params->f);
+ if (!FpInField(&ctx->f)) {
+ memset(&ctx->f, 0, sizeof(ctx->f));
+ return kEpidBadArgErr;
+ }
+ ctx->f_is_set = 1;
+ }
+ ctx->rnd_func = params->rnd_func;
+ ctx->rnd_param = params->rnd_param;
+ PairingInit(&ctx->pairing_state);
+ return kEpidNoErr;
+}
+
+void EPID_API EpidMemberDeinit(MemberCtx* ctx) {
+ (void)ctx;
+ return;
+}
+
+EpidStatus EPID_API EpidMemberCreate(MemberParams const* params,
+ MemberCtx** ctx) {
+ (void)params;
+ (void)ctx;
+ return kEpidNotImpl;
+}
+
+void EPID_API EpidMemberDelete(MemberCtx** ctx) { (void)ctx; }
diff --git a/epid/member/tiny/src/native_types.h b/epid/member/tiny/src/native_types.h
new file mode 100644
index 0000000..1ce611a
--- /dev/null
+++ b/epid/member/tiny/src/native_types.h
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Types in the native format
+/*! \file */
+#ifndef EPID_MEMBER_TINY_SRC_NATIVE_TYPES_H_
+#define EPID_MEMBER_TINY_SRC_NATIVE_TYPES_H_
+
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+/// Group public key in unserialized format
+typedef struct NativeGroupPubKey {
+ GroupId gid; ///< group ID
+ EccPointFq h1; ///< an element in G1
+ EccPointFq h2; ///< an element in G1
+ EccPointFq2 w; ///< an element in G2
+} NativeGroupPubKey;
+
+/// Membership credential in unserialized format
+typedef struct NativeMembershipCredential {
+ GroupId gid; ///< group ID
+ EccPointFq A; ///< an element in G1
+ FpElem x; ///< an integer between [0, p-1]
+} NativeMembershipCredential;
+
+/// Private key in unserialized format
+typedef struct NativePrivKey {
+ NativeMembershipCredential cred; ///< membership credential
+ FpElem f; ///< an integer between [0, p-1]
+} NativePrivKey;
+
+/// Precomputed pairing values
+typedef struct NativeMemberPrecomp {
+ Fq12Elem e12; ///< an element in GT
+ Fq12Elem e22; ///< an element in GT
+ Fq12Elem e2w; ///< an element in GT
+ Fq12Elem ea2; ///< an element in GT
+} NativeMemberPrecomp;
+
+/// Intel(R) EPID Basic Signature
+typedef struct NativeBasicSignature {
+ EccPointFq B; ///< an element in G1
+ EccPointFq K; ///< an element in G1
+ EccPointFq T; ///< an element in G1
+ FpElem c; ///< an integer between [0, p-1]
+ FpElem sx; ///< an integer between [0, p-1]
+ FpElem sf; ///< an integer between [0, p-1]
+ FpElem sa; ///< an integer between [0, p-1]
+ FpElem sb; ///< an integer between [0, p-1]
+} NativeBasicSignature;
+#endif // EPID_MEMBER_TINY_SRC_NATIVE_TYPES_H_
diff --git a/epid/member/tiny/src/nrprove.c b/epid/member/tiny/src/nrprove.c
new file mode 100644
index 0000000..c912465
--- /dev/null
+++ b/epid/member/tiny/src/nrprove.c
@@ -0,0 +1,136 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny EpidNrProve implementation.
+/*! \file */
+
+#include "epid/member/tiny/src/nrprove.h"
+#include "epid/common/errors.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/hashwrap.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+static const FpElem epid20_p = {
+ {{0xD10B500D, 0xF62D536C, 0x1299921A, 0x0CDC65FB, 0xEE71A49E, 0x46E5F25E,
+ 0xFFFCF0CD, 0xFFFFFFFF}}};
+static const EccPointFq epid20_g1 = {
+ {{{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}},
+ {{{0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}}};
+EpidStatus EpidNrProve(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ NativeBasicSignature const* sig,
+ SigRlEntry const* sigrl_entry, NrProof* proof) {
+ EpidStatus sts = kEpidBadArgErr;
+ FpElem mu;
+ FpElem rmu;
+ FpElem smu;
+ FpElem nu;
+ FpElem rnu;
+ FpElem snu;
+ EccPointFq tmp_efq;
+ EccPointFq B_tick;
+ EccPointFq K_tick;
+ BigNumStr p;
+ G1ElemStr tmp_str;
+ G1ElemStr T_str;
+ G1ElemStr R1_str;
+ G1ElemStr R2_str;
+ FpElem c;
+ tiny_sha sha_state;
+ sha_digest digest;
+ EFqDeserialize(&B_tick, &sigrl_entry->b);
+ EFqDeserialize(&K_tick, &sigrl_entry->k);
+ if (!EFqOnCurve(&B_tick) || !EFqOnCurve(&K_tick) || !EFqOnCurve(&sig->B) ||
+ !EFqOnCurve(&sig->K)) {
+ return kEpidBadArgErr;
+ }
+ // 1. The member chooses random mu from [1, p-1].
+ if (!FpRandNonzero(&mu, ctx->rnd_func, ctx->rnd_param)) {
+ return kEpidMathErr;
+ }
+ // 2. The member computes nu = (- f * mu) mod p.
+ FpNeg(&rmu, &ctx->f);
+ FpMul(&nu, &rmu, &mu);
+ do {
+ // 3. The member computes T = G1.sscmMultiExp(K', mu, B', nu). If
+ // G1.isIdentity(T) = true, the member also outputs "failed".
+ if (!EFqAffineMultiExp(&tmp_efq, &K_tick, &mu, &B_tick, &nu)) {
+ sts = kEpidSigRevokedInSigRl;
+ break;
+ }
+ EFqSerialize(&T_str, &tmp_efq);
+ // 4. The member chooses rmu, rnu randomly from[1, p - 1].
+ if (!FpRandNonzero(&rmu, ctx->rnd_func, ctx->rnd_param)) {
+ sts = kEpidMathErr;
+ break;
+ }
+ if (!FpRandNonzero(&rnu, ctx->rnd_func, ctx->rnd_param)) {
+ sts = kEpidMathErr;
+ break;
+ }
+ // 5. The member computes R1 = G1.sscmMultiExp(K, rmu, B, rnu).
+ if (!EFqAffineMultiExp(&tmp_efq, &sig->K, &rmu, &sig->B, &rnu)) {
+ break;
+ }
+ EFqSerialize(&R1_str, &tmp_efq);
+ // 6. The member computes R2 = G1.sscmMultiExp(K', rmu, B', rnu).
+ if (!EFqAffineMultiExp(&tmp_efq, &K_tick, &rmu, &B_tick, &rnu)) {
+ break;
+ }
+ EFqSerialize(&R2_str, &tmp_efq);
+ // 7. The member computes c = Fp.hash(p || g1 || B || K || B' || K' || T ||
+ // R1 || R2 || m)
+ tinysha_init(ctx->hash_alg, &sha_state);
+ VliSerialize(&p, &(epid20_p.limbs));
+ tinysha_update(&sha_state, (void const*)&p, sizeof(p));
+ EFqSerialize(&tmp_str, &epid20_g1);
+ tinysha_update(&sha_state, (void const*)&tmp_str, sizeof(tmp_str));
+ EFqSerialize(&tmp_str, &sig->B);
+ tinysha_update(&sha_state, (void const*)&tmp_str, sizeof(tmp_str));
+ EFqSerialize(&tmp_str, &sig->K);
+ tinysha_update(&sha_state, (void const*)&tmp_str, sizeof(tmp_str));
+ tinysha_update(&sha_state, (void const*)&sigrl_entry->b,
+ sizeof(sigrl_entry->b));
+ tinysha_update(&sha_state, (void const*)&sigrl_entry->k,
+ sizeof(sigrl_entry->k));
+ tinysha_update(&sha_state, (void const*)&T_str, sizeof(T_str));
+ tinysha_update(&sha_state, (void const*)&R1_str, sizeof(R1_str));
+ tinysha_update(&sha_state, (void const*)&R2_str, sizeof(R2_str));
+ tinysha_update(&sha_state, msg, msg_len);
+ tinysha_final(digest.digest, &sha_state);
+ FpFromHash(&c, digest.digest, tinysha_digest_size(&sha_state));
+ // 8. The member computes smu = (rmu + c * mu) mod p.
+ FpMul(&smu, &c, &mu);
+ FpAdd(&smu, &rmu, &smu);
+ // 9. The member computes snu = (rnu + c * nu) mod p.
+ FpMul(&snu, &c, &nu);
+ FpAdd(&snu, &rnu, &snu);
+ // 10. The member outputs proof = (T, c, smu, snu), a non - revoked proof
+ FpSerialize(&proof->c, &c);
+ FpSerialize(&proof->smu, &smu);
+ FpSerialize(&proof->snu, &snu);
+ proof->T = T_str;
+ sts = kEpidNoErr;
+ } while (0);
+ FpClear(&mu);
+ FpClear(&nu);
+ FpClear(&rmu);
+ FpClear(&rnu);
+ return sts;
+}
diff --git a/epid/member/tiny/src/nrprove.h b/epid/member/tiny/src/nrprove.h
new file mode 100644
index 0000000..b6e200a
--- /dev/null
+++ b/epid/member/tiny/src/nrprove.h
@@ -0,0 +1,66 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// EpidNrProve interface.
+/*! \file */
+#ifndef EPID_MEMBER_TINY_SRC_NRPROVE_H_
+#define EPID_MEMBER_TINY_SRC_NRPROVE_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct NativeBasicSignature NativeBasicSignature;
+typedef struct SigRlEntry SigRlEntry;
+typedef struct NrProof NrProof;
+/// \endcond
+
+/// Calculates a non-revoked proof for a single signature based revocation
+/// list entry.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The member context.
+ \param[in] msg
+ The message.
+ \param[in] msg_len
+ The length of message in bytes.
+ \param[in] sig
+ The basic signature.
+ \param[in] sigrl_entry
+ The signature based revocation list entry.
+ \param[out] proof
+ The generated non-revoked proof.
+
+ \returns ::EpidStatus
+
+ \note
+ This function should be used in conjunction with EpidSignBasic().
+
+ \note
+ If the result is not ::kEpidNoErr, the content of proof is undefined.
+
+ \see EpidMemberInit
+ \see EpidSignBasic
+ */
+EpidStatus EpidNrProve(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ NativeBasicSignature const* sig,
+ SigRlEntry const* sigrl_entry, NrProof* proof);
+
+#endif // EPID_MEMBER_TINY_SRC_NRPROVE_H_
diff --git a/epid/member/tiny/src/presig.c b/epid/member/tiny/src/presig.c
new file mode 100644
index 0000000..a27c78b
--- /dev/null
+++ b/epid/member/tiny/src/presig.c
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Precomputed signature management implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+EpidStatus EPID_API EpidAddPreSigs(MemberCtx* ctx, size_t number_presigs) {
+ (void)ctx;
+ (void)number_presigs;
+ return kEpidNotImpl;
+}
+
+size_t EPID_API EpidGetNumPreSigs(MemberCtx const* ctx) {
+ (void)ctx;
+ return 0;
+}
diff --git a/epid/member/tiny/src/presig_compute.c b/epid/member/tiny/src/presig_compute.c
new file mode 100644
index 0000000..2093ad9
--- /dev/null
+++ b/epid/member/tiny/src/presig_compute.c
@@ -0,0 +1,100 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Precomputed signature computation.
+/*! \file */
+
+#include "epid/member/tiny/src/presig_compute.h"
+
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/fq12.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/math/vli.h"
+#include "epid/member/tiny/src/context.h"
+
+static const EccPointFq epid20_g1 = {
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}},
+ {{0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+static const FpElem epid20_p = {{0xD10B500D, 0xF62D536C, 0x1299921A, 0x0CDC65FB,
+ 0xEE71A49E, 0x46E5F25E, 0xFFFCF0CD,
+ 0xFFFFFFFF}};
+
+EpidStatus EpidMemberComputePreSig(MemberCtx const* ctx,
+ PreComputedSignatureData* presig) {
+ /* B and K are not computed by this precomputation.
+ *This differs from the Intel(R) EPID 2.0 spec.
+ *On IoT and especially accelerated platforms,
+ *the extra latency is likely less expensive
+ *than the space and possibly redundant computation
+ *needed to compute and store these values.
+ */
+ EpidStatus sts = kEpidMathErr;
+ EccPointFq t;
+
+ EccPointJacobiFq tmp1;
+ EccPointJacobiFq tmp2;
+ do {
+ if (!FpRandNonzero(&presig->a, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+
+ // T = A * h2^a
+ EFqDeserialize(&t, &ctx->pub_key.h2);
+ EFqFromAffine(&tmp1, &t);
+ EFqMulSSCM(&tmp2, &tmp1, &presig->a);
+ EFqDeserialize(&t, &ctx->credential.A);
+ EFqFromAffine(&tmp1, &t);
+ EFqAdd(&tmp2, &tmp2, &tmp1);
+ if (EFqToAffine(&presig->T, &tmp2) != 1) {
+ break;
+ }
+
+ FpDeserialize((FpElem*)&t.x, &ctx->credential.x);
+ FpMul(&presig->b, &presig->a, (FpElem*)&t.x);
+
+ if (!FpRandNonzero(&presig->rx, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+ if (!FpRandNonzero(&presig->rf, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+ if (!FpRandNonzero(&presig->ra, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+ if (!FpRandNonzero(&presig->rb, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+ VliSub(&t.x.limbs, &epid20_p.limbs,
+ &presig->rx.limbs); // FpNeg(&t.x, rx), but this is fast.
+ FpMul((FpElem*)&t.y, &presig->a, &presig->rx);
+ FpSub((FpElem*)&t.y, &presig->rb, (FpElem*)&t.y);
+
+ // R2 = ea2^&t.x * e12^rf * e22 ^ &t.y * e2w ^ ra
+ Fq12MultiExp(&presig->R2, &ctx->precomp.ea2, &t.x.limbs, &ctx->precomp.e12,
+ &presig->rf.limbs, &ctx->precomp.e22, &t.y.limbs,
+ &ctx->precomp.e2w, &presig->ra.limbs);
+ sts = kEpidNoErr;
+ } while (0);
+
+ // Zero sensitive stack variables
+ FpClear((FpElem*)&t.x);
+ FpClear((FpElem*)&t.y);
+ EFqFromAffine(&tmp1, &epid20_g1);
+ EFqFromAffine(&tmp2, &epid20_g1);
+ return sts;
+}
diff --git a/epid/member/tiny/src/presig_compute.h b/epid/member/tiny/src/presig_compute.h
new file mode 100644
index 0000000..3c98301
--- /dev/null
+++ b/epid/member/tiny/src/presig_compute.h
@@ -0,0 +1,51 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Precomputed signature computation.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_SRC_PRESIG_COMPUTE_H_
+#define EPID_MEMBER_TINY_SRC_PRESIG_COMPUTE_H_
+
+#include "epid/common/errors.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+/// \cond
+typedef struct MembershipCredentialData MembershipCredentialData;
+typedef struct MemberPairPrecomp MemberPairPrecomp;
+typedef struct MemberCtx MemberCtx;
+/// \endcond
+
+/*! Tiny pre-computed signature.
+B and K values are not included into signeture pre-computation,
+as compared with Intel(R) EPID 2.0 spec, to favor small size.
+*/
+typedef struct PreComputedSignatureData {
+ EccPointFq T; ///< an element in G1
+ EccPointFq R1; ///< an element in G1
+ Fq12Elem R2; ///< an element in G1
+ FpElem a; ///< an integer between [0, p-1]
+ FpElem b; ///< an integer between [0, p-1]
+ FpElem rx; ///< an integer between [0, p-1]
+ FpElem rf; ///< an integer between [0, p-1]
+ FpElem ra; ///< an integer between [0, p-1]
+ FpElem rb; ///< an integer between [0, p-1]
+} PreComputedSignatureData;
+
+/// Performs signature pre-computation
+EpidStatus EpidMemberComputePreSig(MemberCtx const* ctx,
+ PreComputedSignatureData* presig);
+
+#endif // EPID_MEMBER_TINY_SRC_PRESIG_COMPUTE_H_
diff --git a/epid/member/tiny/src/provisioncompressed.c b/epid/member/tiny/src/provisioncompressed.c
new file mode 100644
index 0000000..8aa0eec
--- /dev/null
+++ b/epid/member/tiny/src/provisioncompressed.c
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member ProvisionCompressed implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+EpidStatus EPID_API
+EpidProvisionCompressed(MemberCtx* ctx, GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ MemberPrecomp const* precomp_str) {
+ (void)ctx;
+ (void)pub_key;
+ (void)compressed_privkey;
+ (void)precomp_str;
+ return kEpidNotImpl;
+}
diff --git a/epid/member/tiny/src/provisioncredential.c b/epid/member/tiny/src/provisioncredential.c
new file mode 100644
index 0000000..a1c68fc
--- /dev/null
+++ b/epid/member/tiny/src/provisioncredential.c
@@ -0,0 +1,81 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member ProvisionCredentialal implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include "epid/member/api.h"
+#include "epid/member/software_member.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/validate.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static EccPointFq2 const epid20_g2 = {
+ {{{{0xBF282394, 0xF6021343, 0x3D32470E, 0xD25D5268, 0x743CCF22, 0x21670413,
+ 0x4AA3DA05, 0xE20171C5}}},
+ {{{0xBAA189BE, 0x7DF7B212, 0x289653E2, 0x43433BF6, 0x4FBB5656, 0x46CCDC25,
+ 0x53A85A80, 0x592D1EF6}}}},
+ {{{{0xDD2335AE, 0x414DB822, 0x4D916838, 0x55E8B59A, 0x312826BD, 0xC621E703,
+ 0x51FFD350, 0xAE60A4E7}}},
+ {{{0x51B92421, 0x2C90FE89, 0x9093D613, 0x2CDC6181, 0x7645E253, 0xF80274F8,
+ 0x89AFE5AD, 0x1AB442F9}}}}};
+
+EpidStatus EPID_API EpidProvisionCredential(
+ MemberCtx* ctx, GroupPubKey const* pub_key,
+ MembershipCredential const* credential, MemberPrecomp const* precomp_str) {
+ NativeGroupPubKey native_pub_key;
+ NativeMembershipCredential native_cred;
+ if (!pub_key || !credential || !ctx) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&pub_key->gid, &credential->gid, sizeof(GroupId))) {
+ return kEpidBadArgErr;
+ }
+ GroupPubKeyDeserialize(&native_pub_key, pub_key);
+ MembershipCredentialDeserialize(&native_cred, credential);
+ if (!GroupPubKeyIsInRange(&native_pub_key) ||
+ !MembershipCredentialIsInRange(&native_cred) || !ctx->f_is_set ||
+ !MembershipCredentialIsInGroup(&native_cred, &ctx->f, &native_pub_key,
+ &ctx->pairing_state)) {
+ return kEpidBadArgErr;
+ }
+
+ ctx->credential = *credential;
+ ctx->pub_key = *pub_key;
+ ctx->is_provisioned = 1;
+
+ if (precomp_str) {
+ PreCompDeserialize(&ctx->precomp, precomp_str);
+ } else {
+ PairingCompute(&ctx->precomp.ea2, &native_cred.A, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e12, &native_pub_key.h1, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e22, &native_pub_key.h2, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e2w, &native_pub_key.h2, &native_pub_key.w,
+ &ctx->pairing_state);
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/provisionkey.c b/epid/member/tiny/src/provisionkey.c
new file mode 100644
index 0000000..74971b2
--- /dev/null
+++ b/epid/member/tiny/src/provisionkey.c
@@ -0,0 +1,90 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member ProvisionKey implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include "epid/member/api.h"
+#include "epid/member/software_member.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/validate.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static EccPointFq2 const epid20_g2 = {
+ {{{{0xBF282394, 0xF6021343, 0x3D32470E, 0xD25D5268, 0x743CCF22, 0x21670413,
+ 0x4AA3DA05, 0xE20171C5}}},
+ {{{0xBAA189BE, 0x7DF7B212, 0x289653E2, 0x43433BF6, 0x4FBB5656, 0x46CCDC25,
+ 0x53A85A80, 0x592D1EF6}}}},
+ {{{{0xDD2335AE, 0x414DB822, 0x4D916838, 0x55E8B59A, 0x312826BD, 0xC621E703,
+ 0x51FFD350, 0xAE60A4E7}}},
+ {{{0x51B92421, 0x2C90FE89, 0x9093D613, 0x2CDC6181, 0x7645E253, 0xF80274F8,
+ 0x89AFE5AD, 0x1AB442F9}}}}};
+
+EpidStatus EPID_API EpidProvisionKey(MemberCtx* ctx, GroupPubKey const* pub_key,
+ PrivKey const* priv_key,
+ MemberPrecomp const* precomp_str) {
+ NativeGroupPubKey native_pub_key;
+ NativePrivKey native_priv_key;
+ if (!pub_key || !priv_key || !ctx) {
+ return kEpidBadArgErr;
+ }
+ if (0 != memcmp(&pub_key->gid, &priv_key->gid, sizeof(GroupId))) {
+ return kEpidBadArgErr;
+ }
+ GroupPubKeyDeserialize(&native_pub_key, pub_key);
+ if (!GroupPubKeyIsInRange(&native_pub_key)) {
+ return kEpidBadArgErr;
+ }
+
+ PrivKeyDeserialize(&native_priv_key, priv_key);
+ if (!PrivKeyIsInRange(&native_priv_key) ||
+ !PrivKeyIsInGroup(&native_priv_key, &native_pub_key,
+ &ctx->pairing_state)) {
+ memset(&native_priv_key.f, 0, sizeof(native_priv_key.f));
+ return kEpidBadArgErr;
+ }
+ ctx->f = native_priv_key.f;
+ memset(&native_priv_key.f, 0, sizeof(native_priv_key.f));
+ ctx->f_is_set = 1;
+
+ ctx->credential.gid = priv_key->gid;
+ ctx->credential.A = priv_key->A;
+ ctx->credential.x = priv_key->x;
+ ctx->pub_key = *pub_key;
+ ctx->is_provisioned = 1;
+
+ if (precomp_str) {
+ PreCompDeserialize(&ctx->precomp, precomp_str);
+ } else {
+ PairingCompute(&ctx->precomp.ea2, &native_priv_key.cred.A, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e12, &native_pub_key.h1, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e22, &native_pub_key.h2, &epid20_g2,
+ &ctx->pairing_state);
+ PairingCompute(&ctx->precomp.e2w, &native_pub_key.h2, &native_pub_key.w,
+ &ctx->pairing_state);
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/registerbasename.c b/epid/member/tiny/src/registerbasename.c
new file mode 100644
index 0000000..f253650
--- /dev/null
+++ b/epid/member/tiny/src/registerbasename.c
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member RegisterBaseName implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include "epid/member/api.h"
+#include "epid/member/tiny/src/allowed_basenames.h"
+#include "epid/member/tiny/src/context.h"
+
+EpidStatus EPID_API EpidRegisterBasename(MemberCtx* ctx, void const* basename,
+ size_t basename_len) {
+ if (basename_len == 0) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx || !basename) {
+ return kEpidBadArgErr;
+ }
+
+ if (IsBasenameAllowed(ctx->allowed_basenames, basename, basename_len)) {
+ return kEpidDuplicateErr;
+ }
+ return AllowBasename(ctx->allowed_basenames, basename, basename_len)
+ ? kEpidNoErr
+ : kEpidNoMemErr;
+}
+
+EpidStatus EPID_API EpidClearRegisteredBasenames(MemberCtx* ctx) {
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ InitBasenames(ctx->allowed_basenames, MAX_ALLOWED_BASENAMES);
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/serialize.c b/epid/member/tiny/src/serialize.c
new file mode 100644
index 0000000..54b21db
--- /dev/null
+++ b/epid/member/tiny/src/serialize.c
@@ -0,0 +1,141 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny portable implementations of standard library functions
+/*! \file */
+
+#include "epid/member/tiny/src/serialize.h"
+#include <stddef.h>
+
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/signbasic.h"
+
+void* BasicSignatureSerialize(BasicSignature* dest,
+ NativeBasicSignature const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqSerialize(&dest->B, &src->B);
+ EFqSerialize(&dest->K, &src->K);
+ EFqSerialize(&dest->T, &src->T);
+ FpSerialize(&dest->c, &src->c);
+ FpSerialize(&dest->sx, &src->sx);
+ FpSerialize(&dest->sf, &src->sf);
+ FpSerialize(&dest->sa, &src->sa);
+ FpSerialize(&dest->sb, &src->sb);
+ return dest + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* BasicSignatureDeserialize(NativeBasicSignature* dest,
+ BasicSignature const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqDeserialize(&dest->B, &src->B);
+ EFqDeserialize(&dest->K, &src->K);
+ EFqDeserialize(&dest->T, &src->T);
+ FpDeserialize(&dest->c, &src->c);
+ FpDeserialize(&dest->sx, &src->sx);
+ FpDeserialize(&dest->sf, &src->sf);
+ FpDeserialize(&dest->sa, &src->sa);
+ FpDeserialize(&dest->sb, &src->sb);
+ return src + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void* GroupPubKeySerialize(GroupPubKey* dest, NativeGroupPubKey const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqSerialize(&dest->h1, &src->h1);
+ EFqSerialize(&dest->h2, &src->h2);
+ EFq2Serialize(&dest->w, &src->w);
+ dest->gid = src->gid;
+ return dest + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ dest->gid = src->gid;
+ SwapNativeAndPortableLayout(
+ (uint8_t*)dest + sizeof(dest->gid), sizeof(*dest) - sizeof(dest->gid),
+ (uint8_t*)src + sizeof(src->gid), sizeof(*src) - sizeof(src->gid));
+ return dest + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* GroupPubKeyDeserialize(NativeGroupPubKey* dest,
+ GroupPubKey const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqDeserialize(&dest->h1, &src->h1);
+ EFqDeserialize(&dest->h2, &src->h2);
+ EFq2Deserialize(&dest->w, &src->w);
+ dest->gid = src->gid;
+ return src + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ dest->gid = src->gid;
+ SwapNativeAndPortableLayout(
+ (uint8_t*)dest + sizeof(dest->gid), sizeof(*dest) - sizeof(dest->gid),
+ (uint8_t*)src + sizeof(src->gid), sizeof(*src) - sizeof(src->gid));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* PrivKeyDeserialize(NativePrivKey* dest, PrivKey const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqDeserialize(&dest->cred.A, &src->A);
+ FpDeserialize(&dest->cred.x, &src->x);
+ FpDeserialize(&dest->f, &src->f);
+ dest->cred.gid = src->gid;
+ return src + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ dest->cred.gid = src->gid;
+ SwapNativeAndPortableLayout((uint8_t*)dest + sizeof(dest->cred.gid),
+ sizeof(*dest) - sizeof(dest->cred.gid),
+ (uint8_t*)src + sizeof(src->gid),
+ sizeof(*src) - sizeof(src->gid));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* PreCompDeserialize(NativeMemberPrecomp* dest,
+ MemberPrecomp const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ Fq12Deserialize(&dest->ea2, (Fq12ElemStr*)&src->ea2);
+ Fq12Deserialize(&dest->e12, (Fq12ElemStr*)&src->e12);
+ Fq12Deserialize(&dest->e22, (Fq12ElemStr*)&src->e22);
+ Fq12Deserialize(&dest->e2w, (Fq12ElemStr*)&src->e2w);
+ return src + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
+
+void const* MembershipCredentialDeserialize(NativeMembershipCredential* dest,
+ MembershipCredential const* src) {
+#if defined(UNOPTIMIZED_SERIALIZATION)
+ EFqDeserialize(&dest->A, &src->A);
+ FpDeserialize(&dest->x, &src->x);
+ dest->gid = src->gid;
+ return src + 1;
+#else // defined(UNOPTIMIZED_SERIALIZATION)
+ dest->gid = src->gid;
+ SwapNativeAndPortableLayout(
+ (uint8_t*)dest + sizeof(dest->gid), sizeof(*dest) - sizeof(dest->gid),
+ (uint8_t*)src + sizeof(src->gid), sizeof(*src) - sizeof(src->gid));
+ return src + 1;
+#endif // defined(UNOPTIMIZED_SERIALIZATION)
+}
diff --git a/epid/member/tiny/src/serialize.h b/epid/member/tiny/src/serialize.h
new file mode 100644
index 0000000..caed32f
--- /dev/null
+++ b/epid/member/tiny/src/serialize.h
@@ -0,0 +1,98 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Definition of de/serialize functionality.
+
+#ifndef EPID_MEMBER_TINY_SRC_SERIALIZE_H_
+#define EPID_MEMBER_TINY_SRC_SERIALIZE_H_
+
+/// \cond
+typedef struct BasicSignature BasicSignature;
+typedef struct NativeBasicSignature NativeBasicSignature;
+
+typedef struct GroupPubKey GroupPubKey;
+typedef struct NativeGroupPubKey NativeGroupPubKey;
+
+typedef struct PrivKey PrivKey;
+typedef struct NativePrivKey NativePrivKey;
+
+typedef struct MembershipCredential MembershipCredential;
+typedef struct NativeMembershipCredential NativeMembershipCredential;
+
+typedef struct MemberPrecomp MemberPrecomp;
+typedef struct NativeMemberPrecomp NativeMemberPrecomp;
+/// \endcond
+
+/// Write a basic signature to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data written to dest
+*/
+void* BasicSignatureSerialize(BasicSignature* dest,
+ NativeBasicSignature const* src);
+
+/// Read a basic signature from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data read from to src
+*/
+void const* BasicSignatureDeserialize(NativeBasicSignature* dest,
+ BasicSignature const* src);
+
+/// Write a group public key to a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data written to dest
+*/
+void* GroupPubKeySerialize(GroupPubKey* dest, NativeGroupPubKey const* src);
+
+/// Read a group public key from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data read from to src
+*/
+void const* GroupPubKeyDeserialize(NativeGroupPubKey* dest,
+ GroupPubKey const* src);
+
+/// Read a member private key from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data read from to src
+*/
+void const* PrivKeyDeserialize(NativePrivKey* dest, PrivKey const* src);
+
+/// Read pairing pre-computation data from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data read from to src
+*/
+void const* PreCompDeserialize(NativeMemberPrecomp* dest,
+ MemberPrecomp const* src);
+
+/// Read a membership credential from a portable buffer
+/*!
+\param[out] dest target buffer
+\param [in] src source data
+\result pointer to next byte after final data read from to src
+*/
+void const* MembershipCredentialDeserialize(NativeMembershipCredential* dest,
+ MembershipCredential const* src);
+#endif // EPID_MEMBER_TINY_SRC_SERIALIZE_H_
diff --git a/epid/member/tiny/src/sethashalg.c b/epid/member/tiny/src/sethashalg.c
new file mode 100644
index 0000000..105eba2
--- /dev/null
+++ b/epid/member/tiny/src/sethashalg.c
@@ -0,0 +1,33 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member SetHashAlg implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+#include "epid/member/tiny/src/context.h"
+
+EpidStatus EPID_API EpidMemberSetHashAlg(MemberCtx* ctx, HashAlg hash_alg) {
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if ((kSha512 != hash_alg) && (kSha256 != hash_alg)) {
+ return kEpidBadArgErr;
+ }
+ ctx->hash_alg = hash_alg;
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/setsigrl.c b/epid/member/tiny/src/setsigrl.c
new file mode 100644
index 0000000..8378a9a
--- /dev/null
+++ b/epid/member/tiny/src/setsigrl.c
@@ -0,0 +1,79 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member SetSigRl implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/stdlib/endian.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+EpidStatus EPID_API EpidMemberSetSigRl(MemberCtx* ctx, SigRl const* sig_rl,
+ size_t sig_rl_size) {
+ uint32_t n2_in = 0;
+ size_t calculated_sig_rl_size = 0;
+ uint32_t i = 0;
+ if (!ctx || !sig_rl) {
+ return kEpidBadArgErr;
+ }
+
+ if (!ctx->is_provisioned) {
+ return kEpidOutOfSequenceError;
+ }
+
+ n2_in = be32toh(sig_rl->n2);
+
+ // sanity check SigRl size
+ if (n2_in > MAX_SIGRL_ENTRIES) {
+ return kEpidBadArgErr;
+ }
+ calculated_sig_rl_size = MIN_SIGRL_SIZE + n2_in * sizeof(sig_rl->bk[0]);
+ if (calculated_sig_rl_size != sig_rl_size) {
+ return kEpidBadArgErr;
+ }
+ // verify that gid given and gid in SigRl match
+ if (0 != memcmp(&ctx->pub_key.gid, &sig_rl->gid, sizeof(sig_rl->gid))) {
+ return kEpidBadArgErr;
+ }
+
+ // ensure version is not being reverted
+ if (ctx->sig_rl) {
+ uint32_t current_ver = be32toh(ctx->sig_rl->version);
+ uint32_t incoming_ver = be32toh(sig_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+
+#ifdef USE_SIGRL_BY_REFERENCE
+ ctx->sig_rl = (SigRl*)sig_rl;
+ (void)i;
+#else
+ if (!ctx->sig_rl) {
+ ctx->sig_rl = (SigRl*)ctx->heap;
+ }
+ ctx->sig_rl->version = sig_rl->version;
+ ctx->sig_rl->n2 = sig_rl->n2;
+ memset(ctx->sig_rl->bk, 0, MAX_SIGRL_ENTRIES * sizeof(*ctx->sig_rl->bk));
+
+ for (i = 0; i < n2_in; i++) {
+ ctx->sig_rl->bk[i] = sig_rl->bk[i];
+ }
+#endif
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/sign.c b/epid/member/tiny/src/sign.c
new file mode 100644
index 0000000..c6836b3
--- /dev/null
+++ b/epid/member/tiny/src/sign.c
@@ -0,0 +1,117 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member sign implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/nrprove.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/signbasic.h"
+#include "epid/member/tiny/stdlib/endian.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+// SIZE_MAX is not guaranteed in C89/90
+#define SIZE_T_MAX ((size_t)(-1))
+
+size_t EPID_API EpidGetSigSize(SigRl const* sig_rl) {
+ const size_t kMinSigSize = sizeof(EpidSignature) - sizeof(NrProof);
+ if (!sig_rl) {
+ return kMinSigSize;
+ } else {
+ uint32_t n2 = be32toh(sig_rl->n2);
+ if (n2 > (SIZE_T_MAX - kMinSigSize) / sizeof(NrProof)) {
+ return kMinSigSize;
+ } else {
+ return kMinSigSize + n2 * sizeof(NrProof);
+ }
+ }
+}
+
+EpidStatus EPID_API EpidSign(MemberCtx const* ctx, void const* msg,
+ size_t msg_len, void const* basename,
+ size_t basename_len, EpidSignature* sig,
+ size_t sig_len) {
+ EpidStatus sts = kEpidErr;
+ OctStr32 octstr32_0 = {{0x00, 0x00, 0x00, 0x00}};
+ NativeBasicSignature sigma0;
+ if (!ctx || !sig) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!ctx->is_provisioned) {
+ return kEpidOutOfSequenceError;
+ }
+ if (!basename && (0 != basename_len)) {
+ // if basename is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (EpidGetSigSize(ctx->sig_rl) > sig_len) {
+ return kEpidBadArgErr;
+ }
+
+ // 11. The member sets sigma0 = (B, K, T, c, sx, sf, sa, sb).
+ sts = EpidSignBasic(ctx, msg, msg_len, basename, basename_len, &sigma0);
+ if (kEpidNoErr != sts) {
+ return sts;
+ }
+ BasicSignatureSerialize(&sig->sigma0, &sigma0);
+ if (ctx->sig_rl) {
+ uint32_t i = 0;
+ uint32_t num_sig_rl = 0;
+ EpidStatus nr_prove_status = kEpidNoErr;
+ // 13. If SigRL is provided as input, the member proceeds with
+ // the following steps:
+ // a. The member verifies that gid in public key and in SigRL
+ // match.
+ // This was done under EpidMemberSetSigRl function.
+ // b. The member copies RLver and n2 values in SigRL to the
+ // signature.
+ sig->rl_ver = ctx->sig_rl->version;
+ sig->n2 = ctx->sig_rl->n2;
+ // c. For i = 0, ..., n2-1, the member computes sigma[i] =
+ // nrProve(f, B, K, B[i], K[i]). The details of nrProve()
+ // will be given in the next subsection.
+ num_sig_rl = be32toh(ctx->sig_rl->n2);
+ for (i = 0; i < num_sig_rl; i++) {
+ sts = EpidNrProve(ctx, msg, msg_len, &sigma0, &ctx->sig_rl->bk[i],
+ &sig->sigma[i]);
+ if (kEpidNoErr != sts) {
+ nr_prove_status = sts;
+ }
+ }
+ if (kEpidNoErr != nr_prove_status) {
+ memset(&sig->sigma[0], 0, num_sig_rl * sizeof(sig->sigma[0]));
+ return nr_prove_status;
+ }
+ } else {
+ // 12. If SigRL is not provided as input,
+ // a. The member sets RLver = 0 and n2 = 0.
+ // b. The member outputs (sigma0, RLver, n2) and returns "succeeded".
+ sig->rl_ver = octstr32_0;
+ sig->n2 = octstr32_0;
+ }
+ // d. The member outputs (sigma0, RLver, n2, sigma[0], ...,
+ // sigma[n2-1]).
+ // e. If any of the nrProve() functions outputs "failed", the
+ // member returns "revoked", otherwise returns "succeeded".
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/signbasic.c b/epid/member/tiny/src/signbasic.c
new file mode 100644
index 0000000..bc374cc
--- /dev/null
+++ b/epid/member/tiny/src/signbasic.c
@@ -0,0 +1,159 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Basic signature computation.
+/*! \file */
+
+#include "epid/member/tiny/src/signbasic.h"
+
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/hashwrap.h"
+#include "epid/member/tiny/math/serialize.h"
+#include "epid/member/tiny/src/context.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/presig_compute.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static const FpElemStr epid20_p_str = {
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
+ 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
+ 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}}};
+
+static const G2ElemStr epid20_g2_str = {
+ {{{{0xE2, 0x01, 0x71, 0xC5, 0x4A, 0xA3, 0xDA, 0x05, 0x21, 0x67, 0x04,
+ 0x13, 0x74, 0x3C, 0xCF, 0x22, 0xD2, 0x5D, 0x52, 0x68, 0x3D, 0x32,
+ 0x47, 0x0E, 0xF6, 0x02, 0x13, 0x43, 0xBF, 0x28, 0x23, 0x94}}},
+ {{{0x59, 0x2D, 0x1E, 0xF6, 0x53, 0xA8, 0x5A, 0x80, 0x46, 0xCC, 0xDC,
+ 0x25, 0x4F, 0xBB, 0x56, 0x56, 0x43, 0x43, 0x3B, 0xF6, 0x28, 0x96,
+ 0x53, 0xE2, 0x7D, 0xF7, 0xB2, 0x12, 0xBA, 0xA1, 0x89, 0xBE}}}},
+ {{{{0xAE, 0x60, 0xA4, 0xE7, 0x51, 0xFF, 0xD3, 0x50, 0xC6, 0x21, 0xE7,
+ 0x03, 0x31, 0x28, 0x26, 0xBD, 0x55, 0xE8, 0xB5, 0x9A, 0x4D, 0x91,
+ 0x68, 0x38, 0x41, 0x4D, 0xB8, 0x22, 0xDD, 0x23, 0x35, 0xAE}}},
+ {{{0x1A, 0xB4, 0x42, 0xF9, 0x89, 0xAF, 0xE5, 0xAD, 0xF8, 0x02, 0x74,
+ 0xF8, 0x76, 0x45, 0xE2, 0x53, 0x2C, 0xDC, 0x61, 0x81, 0x90, 0x93,
+ 0xD6, 0x13, 0x2C, 0x90, 0xFE, 0x89, 0x51, 0xB9, 0x24, 0x21}}}}};
+
+static const G1ElemStr epid20_g1_str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+
+EpidStatus EpidSignBasic(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ NativeBasicSignature* sig) {
+ EpidStatus sts = kEpidErr;
+ PreComputedSignatureData presig;
+ tiny_sha sha_state;
+ sha_digest digest;
+ G1ElemStr g1_str;
+ Fq12ElemStr fq12_str;
+ FpElemStr fp_str;
+ FpElem x;
+
+ FpDeserialize(&x, &ctx->credential.x);
+ do {
+ sts = EpidMemberComputePreSig(ctx, &presig);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ // B <- random
+ if (basename) {
+ if (!IsBasenameAllowed(ctx->allowed_basenames, basename, basename_len)) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ /* Basename, K is linked to fixed B */
+ if (!EFqHash(&sig->B, (const unsigned char*)basename, basename_len,
+ ctx->hash_alg)) {
+ break;
+ }
+ } else {
+ /* No basename, B is random */
+ if (!EFqRand(&sig->B, ctx->rnd_func, ctx->rnd_param)) {
+ break;
+ }
+ }
+ // K <- B^f
+ // guaranteed not to fail, based on f nonzero, B not identity
+ EFqAffineExp(&sig->K, &sig->B, &ctx->f);
+ EFqCp(&sig->T, &presig.T);
+
+ // R1 = B^rf
+ // guaranteed not to fail, if rf != p or 0, but bad inputs could cause it to
+ // fail
+ if (!EFqAffineExp(&presig.R1, &sig->B, &presig.rf)) {
+ break;
+ }
+
+ // 5. The member computes
+ // t3 = Fp.hash(p || g1 || g2 || h1 || h2 || w || B || K || T || R1 || R2).
+ tinysha_init(ctx->hash_alg, &sha_state);
+
+ tinysha_update(&sha_state, (void const*)&epid20_p_str,
+ sizeof(epid20_p_str));
+ tinysha_update(&sha_state, (void const*)&epid20_g1_str,
+ sizeof(epid20_g1_str));
+ tinysha_update(&sha_state, (void const*)&epid20_g2_str,
+ sizeof(epid20_g2_str));
+ tinysha_update(&sha_state, (void const*)&ctx->pub_key.h1,
+ sizeof(ctx->pub_key.h1));
+ tinysha_update(&sha_state, (void const*)&ctx->pub_key.h2,
+ sizeof(ctx->pub_key.h2));
+ tinysha_update(&sha_state, (void const*)&ctx->pub_key.w,
+ sizeof(ctx->pub_key.w));
+ EFqSerialize(&g1_str, &sig->B);
+ tinysha_update(&sha_state, (void const*)&g1_str, sizeof(g1_str));
+ EFqSerialize(&g1_str, &sig->K);
+ tinysha_update(&sha_state, (void const*)&g1_str, sizeof(g1_str));
+ EFqSerialize(&g1_str, &sig->T);
+ tinysha_update(&sha_state, (void const*)&g1_str, sizeof(g1_str));
+ EFqSerialize(&g1_str, &presig.R1);
+ tinysha_update(&sha_state, (void const*)&g1_str, sizeof(g1_str));
+ Fq12Serialize(&fq12_str, &presig.R2);
+ tinysha_update(&sha_state, (void const*)&fq12_str, sizeof(fq12_str));
+ tinysha_final(digest.digest, &sha_state);
+ FpFromHash(&sig->c, digest.digest, tinysha_digest_size(&sha_state));
+
+ // 6. The member computes c = Fp.hash(t3 || m).
+ tinysha_init(ctx->hash_alg, &sha_state);
+ FpSerialize(&fp_str, &sig->c);
+ tinysha_update(&sha_state, (void const*)&fp_str, sizeof(fp_str));
+ tinysha_update(&sha_state, msg, msg_len);
+ tinysha_final(digest.digest, &sha_state);
+
+ FpFromHash(&sig->c, digest.digest, tinysha_digest_size(&sha_state));
+ // The variables sx, sf, sa, sb are computed from x, f, a, b with random
+ // elements
+ // This randomness allows verification but means that the s variables reveal
+ // no secret information
+ FpMul(&sig->sx, &sig->c, &x);
+ FpMul(&sig->sf, &sig->c, &ctx->f);
+ FpMul(&sig->sa, &sig->c, &presig.a);
+ FpMul(&sig->sb, &sig->c, &presig.b);
+ FpAdd(&sig->sx, &sig->sx, &presig.rx);
+ FpAdd(&sig->sf, &sig->sf, &presig.rf);
+ FpAdd(&sig->sa, &sig->sa, &presig.ra);
+ FpAdd(&sig->sb, &sig->sb, &presig.rb);
+ sts = kEpidNoErr;
+ } while (0);
+ // clearing stack-allocated variables before function return
+ (void)memset(&presig, 0, sizeof(presig));
+ return sts;
+}
diff --git a/epid/member/tiny/src/signbasic.h b/epid/member/tiny/src/signbasic.h
new file mode 100644
index 0000000..092501a
--- /dev/null
+++ b/epid/member/tiny/src/signbasic.h
@@ -0,0 +1,37 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Basic signature computation
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_SRC_SIGNBASIC_H_
+#define EPID_MEMBER_TINY_SRC_SIGNBASIC_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/member/tiny/math/mathtypes.h"
+
+/// \cond
+typedef struct MemberCtx MemberCtx;
+typedef struct NativeBasicSignature NativeBasicSignature;
+/// \endcond
+
+/// Compute Intel(R) EPID Basic Signature.
+EpidStatus EpidSignBasic(MemberCtx const* ctx, void const* msg, size_t msg_len,
+ void const* basename, size_t basename_len,
+ NativeBasicSignature* sig);
+
+#endif // EPID_MEMBER_TINY_SRC_SIGNBASIC_H_
diff --git a/epid/member/tiny/src/startup.c b/epid/member/tiny/src/startup.c
new file mode 100644
index 0000000..ce8f4ec
--- /dev/null
+++ b/epid/member/tiny/src/startup.c
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny member Startup implementation.
+/*! \file */
+
+#define EXPORT_EPID_APIS
+#include <epid/member/api.h>
+
+EpidStatus EPID_API EpidMemberStartup(MemberCtx* ctx) {
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tiny/src/validate.c b/epid/member/tiny/src/validate.c
new file mode 100644
index 0000000..75903f1
--- /dev/null
+++ b/epid/member/tiny/src/validate.c
@@ -0,0 +1,101 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Validate native types
+/*! \file */
+
+#include "epid/member/tiny/src/validate.h"
+#include "epid/member/tiny/math/efq.h"
+#include "epid/member/tiny/math/efq2.h"
+#include "epid/member/tiny/math/fp.h"
+#include "epid/member/tiny/math/fq12.h"
+#include "epid/member/tiny/math/mathtypes.h"
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+static EccPointFq2 const epid20_g2 = {
+ {{{{0xBF282394, 0xF6021343, 0x3D32470E, 0xD25D5268, 0x743CCF22, 0x21670413,
+ 0x4AA3DA05, 0xE20171C5}}},
+ {{{0xBAA189BE, 0x7DF7B212, 0x289653E2, 0x43433BF6, 0x4FBB5656, 0x46CCDC25,
+ 0x53A85A80, 0x592D1EF6}}}},
+ {{{{0xDD2335AE, 0x414DB822, 0x4D916838, 0x55E8B59A, 0x312826BD, 0xC621E703,
+ 0x51FFD350, 0xAE60A4E7}}},
+ {{{0x51B92421, 0x2C90FE89, 0x9093D613, 0x2CDC6181, 0x7645E253, 0xF80274F8,
+ 0x89AFE5AD, 0x1AB442F9}}}}};
+
+static EccPointFq const epid20_g1 = {
+ {{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}},
+ {{0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000}}};
+
+int GroupPubKeyIsInRange(NativeGroupPubKey const* input) {
+ return EFqOnCurve(&input->h1) && EFqOnCurve(&input->h2) &&
+ EFq2OnCurve(&input->w);
+}
+
+int MembershipCredentialIsInRange(NativeMembershipCredential const* input) {
+ return EFqOnCurve(&input->A) && FpInField(&input->x);
+}
+
+int MembershipCredentialIsInGroup(NativeMembershipCredential const* input,
+ FpElem const* f,
+ NativeGroupPubKey const* pubkey,
+ PairingState const* pairing_state) {
+ EccPointJacobiFq g1;
+ EccPointJacobiFq t2;
+ EccPointFq t2_affine;
+ Fq12Elem t3;
+ Fq12Elem t4;
+ // to save stack space, reuse t4 and parts of t3
+ EccPointFq2* t1_affine = (EccPointFq2*)&t4;
+ // the following casts rely on EccPointJacobiFq2 and Fq6Elem having same size
+ EccPointJacobiFq2* w = (EccPointJacobiFq2*)&t3.z0;
+ EccPointJacobiFq2* t1 = (EccPointJacobiFq2*)&t3.z1;
+ int result = 0;
+ if (0 != memcmp(&input->gid, &pubkey->gid, sizeof(pubkey->gid))) {
+ return 0;
+ }
+ EFqFromAffine(&g1, &epid20_g1);
+ EFq2FromAffine(t1, &epid20_g2);
+ EFq2FromAffine(w, &pubkey->w);
+ EFq2MulSSCM(t1, t1, &input->x);
+ EFq2Add(t1, t1, w);
+ EFq2ToAffine(t1_affine, t1);
+ PairingCompute(&t3, &input->A, t1_affine, pairing_state);
+ EFqFromAffine(&t2, &pubkey->h1);
+ EFqMulSSCM(&t2, &t2, f);
+ EFqAdd(&t2, &t2, &g1);
+ EFqToAffine(&t2_affine, &t2);
+ PairingCompute(&t4, &t2_affine, &epid20_g2, pairing_state);
+ result = Fq12Eq(&t3, &t4);
+ memset(&t2, 0, sizeof(t2));
+ memset(&t2_affine, 0, sizeof(t2_affine));
+ memset(&t4, 0, sizeof(t4));
+ return result;
+}
+
+int PrivKeyIsInRange(NativePrivKey const* input) {
+ return EFqOnCurve(&input->cred.A) && FpInField(&input->f) &&
+ FpInField(&input->cred.x);
+}
+
+int PrivKeyIsInGroup(NativePrivKey const* input,
+ NativeGroupPubKey const* pubkey,
+ PairingState const* pairing_state) {
+ return MembershipCredentialIsInGroup(&input->cred, &input->f, pubkey,
+ pairing_state);
+}
diff --git a/epid/member/tiny/src/validate.h b/epid/member/tiny/src/validate.h
new file mode 100644
index 0000000..933ba05
--- /dev/null
+++ b/epid/member/tiny/src/validate.h
@@ -0,0 +1,86 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Validate native types
+/*! \file */
+#ifndef EPID_MEMBER_TINY_SRC_VALIDATE_H_
+#define EPID_MEMBER_TINY_SRC_VALIDATE_H_
+
+/// \cond
+typedef struct FpElem FpElem;
+
+typedef struct GroupPubKey GroupPubKey;
+typedef struct NativeGroupPubKey NativeGroupPubKey;
+
+typedef struct PrivKey PrivKey;
+typedef struct NativePrivKey NativePrivKey;
+
+typedef struct MembershipCredential MembershipCredential;
+typedef struct NativeMembershipCredential NativeMembershipCredential;
+
+typedef struct PairingState PairingState;
+/// \endcond
+
+/// Test if the elements of a Group Public Key are in appropriate ranges.
+/*!
+\param[in] input the value to test.
+\returns A value different from zero (i.e., true) if indeed
+ all elements are in range. Zero (i.e., false) otherwise.
+*/
+int GroupPubKeyIsInRange(NativeGroupPubKey const* input);
+
+/// Test if the elements of a Membership Credential are in appropriate ranges.
+/*!
+\param[in] input the value to test.
+\returns A value different from zero (i.e., true) if indeed
+ all elements are in range. Zero (i.e., false) otherwise.
+*/
+int MembershipCredentialIsInRange(NativeMembershipCredential const* input);
+
+/// Test if a Membership Credential is in fact in the specified group.
+/*!
+\param[in] input the value to test.
+\param[in] f the f value.
+\param[in] pubkey the group key.
+\param[in] pairing_state previously computed pairing state.
+\returns A value different from zero (i.e., true) if indeed
+ it is in the group. Zero (i.e., false) otherwise.
+*/
+int MembershipCredentialIsInGroup(NativeMembershipCredential const* input,
+ FpElem const* f,
+ NativeGroupPubKey const* pubkey,
+ PairingState const* pairing_state);
+
+/// Test if the elements of a Private Key are in appropriate ranges.
+/*!
+\param[in] input the value to test.
+\returns A value different from zero (i.e., true) if indeed
+ all elements are in range. Zero (i.e., false) otherwise.
+*/
+int PrivKeyIsInRange(NativePrivKey const* input);
+
+/// Test if a Private Key is in fact in the specified group.
+/*!
+\param[in] input the value to test.
+\param[in] pubkey the group key.
+\param[in] pairing_state previously computed pairing state.
+\returns A value different from zero (i.e., true) if indeed
+ it is in the group. Zero (i.e., false) otherwise.
+*/
+int PrivKeyIsInGroup(NativePrivKey const* input,
+ NativeGroupPubKey const* pubkey,
+ PairingState const* pairing_state);
+
+#endif // EPID_MEMBER_TINY_SRC_VALIDATE_H_
diff --git a/epid/member/tiny/stdlib/endian.h b/epid/member/tiny/stdlib/endian.h
new file mode 100644
index 0000000..1f606cf
--- /dev/null
+++ b/epid/member/tiny/stdlib/endian.h
@@ -0,0 +1,38 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Convert values between host and big-/little-endian byte order.
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_STDLIB_ENDIAN_H_
+#define EPID_MEMBER_TINY_STDLIB_ENDIAN_H_
+
+#include <stdint.h>
+
+/// Transform big endian uint32_t to host uint32_t
+#define be32toh(big_endian_32bits) \
+ ((uint32_t)(((((unsigned char*)&(big_endian_32bits))[0]) << 24) + \
+ ((((unsigned char*)&(big_endian_32bits))[1]) << 16) + \
+ ((((unsigned char*)&(big_endian_32bits))[2]) << 8) + \
+ (((unsigned char*)&(big_endian_32bits))[3])))
+
+/// Transform host uint32_t to big endian uint32_t
+#define htobe32(host_32bits) \
+ (uint32_t)(((((uint32_t)(host_32bits)) & 0xFF) << 24) | \
+ ((((uint32_t)(host_32bits)) & 0xFF00) << 8) | \
+ ((((uint32_t)(host_32bits)) & 0xFF0000) >> 8) | \
+ ((((uint32_t)(host_32bits)) & 0xFF000000) >> 24))
+
+#endif // EPID_MEMBER_TINY_STDLIB_ENDIAN_H_
diff --git a/epid/member/tiny/stdlib/src/tiny_stdlib.c b/epid/member/tiny/stdlib/src/tiny_stdlib.c
new file mode 100644
index 0000000..a3faca6
--- /dev/null
+++ b/epid/member/tiny/stdlib/src/tiny_stdlib.c
@@ -0,0 +1,46 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny portable implementations of standard library functions
+/*! \file */
+
+#include "epid/member/tiny/stdlib/tiny_stdlib.h"
+
+#ifdef SHARED
+
+void* memset(void* ptr, int value, size_t num) {
+ unsigned char* p = ptr;
+ size_t i = num;
+ while (i != 0) {
+ i -= 1;
+ p[i] = (unsigned char)value;
+ }
+ return ptr;
+}
+
+int memcmp(const void* ptr1, const void* ptr2, size_t num) {
+ const unsigned char* p1 = (const unsigned char*)ptr1;
+ const unsigned char* p2 = (const unsigned char*)ptr2;
+ int d = 0;
+ while (num != 0 && d == 0) {
+ d = (*p1 == *p2) ? 0 : ((*p1 < *p2) ? -1 : 1);
+ p1 += 1;
+ p2 += 1;
+ num -= 1;
+ }
+ return d;
+}
+
+#endif // SHARED
diff --git a/epid/member/tiny/stdlib/tiny_stdlib.h b/epid/member/tiny/stdlib/tiny_stdlib.h
new file mode 100644
index 0000000..906a250
--- /dev/null
+++ b/epid/member/tiny/stdlib/tiny_stdlib.h
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny portable implementations of standard library functions
+/*! \file */
+
+#ifndef EPID_MEMBER_TINY_STDLIB_TINY_STDLIB_H_
+#define EPID_MEMBER_TINY_STDLIB_TINY_STDLIB_H_
+
+#include <stddef.h>
+
+/// Fill block of memory
+/*!
+ * Sets the first num bytes of the block of memory pointed by ptr
+ * to the specified value (interpreted as an unsigned char)
+ *
+ * \param ptr Pointer to the block of memory to fill.
+ * \param value Value to be set. The value is passed as an int,
+ * but the function fills the block of memory using the
+ * unsigned char conversion of this value.
+ * \param num Number of bytes to be set to the value. size_t is
+ * an unsigned integral type.
+ * \result ptr is returned.
+ */
+void* memset(void* ptr, int value, size_t num);
+
+/// Compare two blocks of memory
+/*!
+ * Compares the first num bytes of the block of memory pointed by
+ * ptr1 to the first num bytes pointed by ptr2, returning zero if
+ * they all match or a value different from zero representing which
+ * is greater if they do not.
+ *
+ * Notice that, unlike strcmp, the function does not stop comparing
+ * after finding a null character.
+ *
+ * \param ptr1 Pointer to block of memory.
+ * \param ptr2 Pointer to block of memory.
+ * \param num Number of bytes to compare.
+ * \result an integral value indicating the relationship between the
+ * content of the memory blocks:
+ * \retval <0 the first byte that does not match in both memory
+ * blocks has a lower value in ptr1 than in ptr2 (if
+ * evaluated as unsigned char values)
+ * \retval 0 the contents of both memory blocks are equal
+ * \retval >0 the first byte that does not match in both memory blocks
+ * has a greater value in ptr1 than in ptr2 (if evaluated
+ * as unsigned char values)
+ */
+int memcmp(const void* ptr1, const void* ptr2, size_t num);
+
+#endif // EPID_MEMBER_TINY_STDLIB_TINY_STDLIB_H_
diff --git a/epid/member/tiny/stdlib/tiny_stdlib.parts b/epid/member/tiny/stdlib/tiny_stdlib.parts
new file mode 100644
index 0000000..0ddc8bc
--- /dev/null
+++ b/epid/member/tiny/stdlib/tiny_stdlib.parts
@@ -0,0 +1,37 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build configuration for tiny standard library.
+"""
+Import('*')
+env.PartName('tiny_stdlib')
+
+include_files = Pattern(src_dir='.', includes=['*.h'], recursive=False).files()
+
+src_files = Pattern(src_dir='src', includes=['*.c'], recursive=True).files()
+
+env.Append(CPPPATH='#')
+
+if 'shared' in env['MODE']:
+ env.Append(CPPDEFINES=['SHARED'])
+
+outputs = env.Library('${PART_SHORT_NAME}', src_files)
+
+sdk_outs = env.Sdk(outputs)
+env.SdkInclude(include_files, sub_dir='${PART_SHORT_NAME}')
+
+if 'install_lib' in env['MODE'] and 'shared' not in env['MODE']:
+ env.InstallLib(outputs)
diff --git a/epid/member/tiny/unittests/allowed_basenames-test.cc b/epid/member/tiny/unittests/allowed_basenames-test.cc
new file mode 100644
index 0000000..dc4e93c
--- /dev/null
+++ b/epid/member/tiny/unittests/allowed_basenames-test.cc
@@ -0,0 +1,117 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief Basename management unit tests.
+ */
+#ifndef SHARED
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tiny/src/allowed_basenames.h"
+}
+
+namespace {
+
+TEST(AllowedBasenames, GetBasenamesSizeSucceeds) {
+ size_t bsn_count = 10;
+ size_t expected_bsn_size =
+ sizeof(size_t) // current_bsn_number
+ + sizeof(size_t) // max_bsn_number
+ + sizeof(sha_digest) * bsn_count; // digest * max_bsn_number
+ size_t bsn_size = BasenamesGetSize(bsn_count);
+ EXPECT_EQ(expected_bsn_size, bsn_size);
+}
+
+TEST(AllowedBasenames, ReportsRegisteredBasename) {
+ const std::vector<uint8_t> bsn0 = {'b', 's', 'n', '0'};
+ const std::vector<uint8_t> bsn1 = {'b', 's', 'n', '1'};
+
+ AllowedBasenames* base_names = nullptr;
+ std::vector<uint8_t> base_names_buf;
+ size_t bsn_size = BasenamesGetSize(2);
+ base_names_buf.resize(bsn_size);
+ memset(base_names_buf.data(), 1, bsn_size);
+ base_names = (AllowedBasenames*)&base_names_buf[0];
+ InitBasenames(base_names, 2);
+
+ EXPECT_TRUE(AllowBasename(base_names, bsn0.data(), bsn0.size()));
+ EXPECT_TRUE(AllowBasename(base_names, bsn1.data(), bsn1.size()));
+ EXPECT_TRUE(IsBasenameAllowed(base_names, bsn0.data(), bsn0.size()));
+}
+
+TEST(AllowedBasenames, ReportsUnregisteredBasename) {
+ const std::vector<uint8_t> bsn0 = {'b', 's', 'n', '0'};
+ const std::vector<uint8_t> bsn1 = {'b', 's', 'n', '1'};
+
+ AllowedBasenames* base_names = nullptr;
+ std::vector<uint8_t> base_names_buf;
+ size_t bsn_size = BasenamesGetSize(1);
+ base_names_buf.resize(bsn_size);
+ base_names = (AllowedBasenames*)&base_names_buf[0];
+ InitBasenames(base_names, 1);
+
+ EXPECT_TRUE(AllowBasename(base_names, bsn0.data(), bsn0.size()));
+ EXPECT_FALSE(IsBasenameAllowed(base_names, bsn1.data(), bsn1.size()));
+}
+
+TEST(AllowedBasenames, IsBasenameAllowedReturnsFalseWhenNoBasenamesRegistered) {
+ const std::vector<uint8_t> bsn0 = {'b', 's', 'n', '0'};
+
+ AllowedBasenames* base_names = nullptr;
+ std::vector<uint8_t> base_names_buf;
+ size_t bsn_size = BasenamesGetSize(1);
+ base_names_buf.resize(bsn_size);
+ base_names = (AllowedBasenames*)&base_names_buf[0];
+ InitBasenames(base_names, 1);
+
+ EXPECT_FALSE(IsBasenameAllowed(base_names, bsn0.data(), bsn0.size()));
+}
+
+TEST(AllowedBasenames, AllowBasenameReturnsFalseForMoreThanMaxBasenames) {
+ const std::vector<uint8_t> bsn0 = {'b', 's', 'n', '0'};
+
+ AllowedBasenames* base_names = nullptr;
+ std::vector<uint8_t> base_names_buf;
+ size_t bsn_size = BasenamesGetSize(5);
+ base_names_buf.resize(bsn_size);
+ base_names = (AllowedBasenames*)&base_names_buf[0];
+ InitBasenames(base_names, 5);
+
+ for (int n = 0; n < 5; n++) {
+ EXPECT_TRUE(AllowBasename(base_names, &n, sizeof(n)));
+ }
+ // One more basename should not fit into storage
+ EXPECT_FALSE(AllowBasename(base_names, bsn0.data(), bsn0.size()));
+}
+
+TEST(AllowedBasenames, AllowBasenameCanReturnTrue) {
+ const std::vector<uint8_t> bsn0 = {'b', 's', 'n', '0'};
+
+ AllowedBasenames* base_names = nullptr;
+ std::vector<uint8_t> base_names_buf;
+ size_t bsn_size = BasenamesGetSize(1);
+ base_names_buf.resize(bsn_size);
+ base_names = (AllowedBasenames*)&base_names_buf[0];
+ InitBasenames(base_names, 1);
+
+ EXPECT_TRUE(AllowBasename(base_names, bsn0.data(), bsn0.size()));
+}
+
+} // namespace
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/context-test.cc b/epid/member/tiny/unittests/context-test.cc
new file mode 100644
index 0000000..dafa4cf
--- /dev/null
+++ b/epid/member/tiny/unittests/context-test.cc
@@ -0,0 +1,484 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+bool operator==(MemberPrecomp const& lhs, MemberPrecomp const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares GroupPubKey values
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs);
+
+/// compares MembershipCredential values
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs);
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberDeinit Tests
+TEST_F(EpidMemberTest, DeinitWorksGivenNullMemberCtx) {
+ EpidMemberDeinit(nullptr);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberGetSize Tests
+TEST_F(EpidMemberTest, GetSizeFailsGivenNullParams) {
+ size_t ctx_size = 0;
+ MemberParams params = {0};
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(&params, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(nullptr, &ctx_size));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(nullptr, nullptr));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberGetSize Tests
+TEST_F(EpidMemberTest, GetSizeWorksGivenValidParams) {
+ size_t ctx_size = 0;
+ Prng my_prng;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberInit Tests
+TEST_F(EpidMemberTest, InitFailsGivenNullParameters) {
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(nullptr, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(&params, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(nullptr, ctx));
+}
+
+TEST_F(EpidMemberTest, InitFailsGivenInvalidParameters) {
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, &f, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(&params, ctx));
+}
+
+TEST_F(EpidMemberTest, InitSucceedsGivenValidParameters) {
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, &f, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidNoErr, EpidMemberInit(&params, ctx));
+ EpidMemberDeinit(ctx);
+}
+
+TEST_F(EpidMemberTest, InitSucceedsGivenValidParametersWithNoF) {
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidNoErr, EpidMemberInit(&params, ctx));
+ EpidMemberDeinit(ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberCreate Tests
+TEST_F(EpidMemberTest, CreateIsNotImplemented) {
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNotImpl, EpidMemberCreate(&params, &ctx));
+ EpidMemberDelete(&ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberStartup
+TEST_F(EpidMemberTest, StartupFailsGivenNullParameters) {
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberStartup(nullptr));
+}
+
+TEST_F(EpidMemberTest, StartupSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+
+ EXPECT_EQ(kEpidNoErr, EpidMemberStartup(member));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberSetHashAlg
+TEST_F(EpidMemberTest, SetHashAlgFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(nullptr, kSha256));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA256) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha256));
+}
+TEST_F(EpidMemberTest, DISABLED_CanSetHashAlgoToSHA384) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha384));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA512) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha512));
+}
+TEST_F(EpidMemberTest, DISABLED_CanSetHashAlgoToSHA512256) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha512_256));
+}
+TEST_F(EpidMemberTest, SetHashAlgFailsForNonSupportedAlgorithm) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_256));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_384));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_512));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, (HashAlg)-1));
+}
+
+TEST_F(EpidMemberTest, SetHashAlgRejectsSHA384) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha384));
+}
+
+TEST_F(EpidMemberTest, SetHashAlgRejectsSHA512256) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha512_256));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberSetSigRl
+TEST_F(EpidMemberTest, SetSigRlFailsGivenNullPointer) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(nullptr, &srl, sizeof(SigRl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, nullptr, sizeof(SigRl)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenZeroSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(member_ctx, &srl, 0));
+}
+// Size parameter must be at least big enough for n2 == 0 case
+TEST_F(EpidMemberTest, SetSigRlFailsGivenTooSmallSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenN2TooBigForSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenN2TooSmallForSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenBadGroupId) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.gid.data[0] = ~srl.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenEmptySigRlFromDifferentGroup) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenOldVersion) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ srl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlPreservesOldRlOnFailure) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXSigrevokedMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+ // wrong sigrl contains revoked member0 and has lower version
+ SigRl const* wrong_sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrpXSigRlSingleEntry.data());
+ size_t wrong_sig_rl_size = this->kGrpXSigRlSingleEntry.size();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, wrong_sig_rl, wrong_sig_rl_size));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(sig_rl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ // Check that sigrevoked member is still in SigRl
+ EXPECT_EQ(kEpidSigRevokedInSigRl, EpidSign(member_ctx, msg.data(), msg.size(),
+ nullptr, 0, sig, sig_len));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsIfNotProvisioned) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ SigRl const* sig_rl = &srl;
+ size_t sig_rl_size = sizeof(srl) - sizeof(srl.bk);
+ EXPECT_EQ(kEpidOutOfSequenceError,
+ EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenValidSigRl) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenEmptySigRl) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ uint8_t sig_rl_data_n2_zero[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl* sig_rl = reinterpret_cast<SigRl*>(sig_rl_data_n2_zero);
+ size_t sig_rl_size = sizeof(sig_rl_data_n2_zero);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenSigRlWithOneEntry) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrpXSigRlSingleEntry.data());
+ size_t sig_rl_size = this->kGrpXSigRlSingleEntry.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidRegisterBasename
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenNullPtr) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'_', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(member, nullptr, basename.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(nullptr, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenDuplicateBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'d', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenInvalidBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {};
+ std::vector<uint8_t> basename2 = {'b', 's', 'n'};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidBadArgErr, EpidRegisterBasename(member, basename2.data(), 0));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameSucceedsGivenUniqueBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'b', 's', 'n', '0', '1'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameSucceedsGivenMultipleUniqueBaseNames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename1 = {'b', 's', 'n', '0', '1'};
+ std::vector<uint8_t> basename2 = {'b', 's', 'n', '0', '2'};
+ std::vector<uint8_t> basename3 = {'b', 's', 'n', '0', '3'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename1.data(), basename1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename2.data(), basename2.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename3.data(), basename3.size()));
+ // Verify that basenames registered succesfully
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename1.data(), basename1.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename2.data(), basename2.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename3.data(), basename3.size()));
+}
+TEST_F(EpidMemberTest,
+ RegisterBaseNameSucceedsGivenBsnContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidRegisterBasename(member, this->kData_0_255.data(),
+ this->kData_0_255.size()));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidClearRegisteredBasenames
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr, EpidClearRegisteredBasenames(nullptr));
+}
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesClearsBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, this->kData_0_255.data(),
+ this->kData_0_255.size()));
+ EXPECT_EQ(kEpidNoErr, EpidClearRegisteredBasenames(member));
+ // check, that after clearing EpidRegisterBasename works correctly
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, this->kData_0_255.data(),
+ this->kData_0_255.size()));
+}
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesClearsAllBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ for (int i = 0; i < 3; ++i) {
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, &i, sizeof(i)));
+ }
+ EXPECT_EQ(kEpidNoErr, EpidClearRegisteredBasenames(member));
+ for (int i = 0; i < 3; ++i) {
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, &i, sizeof(i)));
+ }
+}
+TEST_F(EpidMemberTest,
+ EpidClearRegisteredBasenamesCausesSignWithBasenameAfterItToFail) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ THROW_ON_EPIDERR(EpidClearRegisteredBasenames(member));
+ ASSERT_EQ(kEpidBadArgErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+}
+} // namespace
diff --git a/epid/member/tiny/unittests/decompress_privkey-test.cc b/epid/member/tiny/unittests/decompress_privkey-test.cc
new file mode 100644
index 0000000..25a65ef
--- /dev/null
+++ b/epid/member/tiny/unittests/decompress_privkey-test.cc
@@ -0,0 +1,99 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief DecompressPrivKey unit tests.
+ */
+#include <cstring>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+bool operator==(PrivKey const& lhs, PrivKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+namespace {
+
+TEST_F(EpidMemberTest, DISABLED_DecompressPrivKeyFailsGivenNullParameters) {
+ auto const& pub_key = this->kGrpXKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(nullptr, &compressed_privkey, &priv_key));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, nullptr, &priv_key));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, nullptr));
+}
+
+TEST_F(EpidMemberTest, DISABLED_CanDecompressPrivKeyGivenValidCompressedKey) {
+ auto const& pub_key = this->kGrpXKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ auto const& expected_decompressed_key = this->kGrpXMember9PrivKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidNoErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, &priv_key));
+ EXPECT_EQ(expected_decompressed_key, priv_key);
+}
+
+TEST_F(EpidMemberTest, DISABLED_DecompressPrivKeyFailsGivenKeysMissmatch) {
+ auto const& pub_key = this->kGrpYKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, &priv_key));
+}
+
+TEST_F(EpidMemberTest, DISABLED_DecompressPrivKeyFailsGivenInvalidGroupKey) {
+ // Test for cases when h1 or w of group public key are invalid.
+ // Note h2 of group public key is not used for key decompression.
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+
+ auto pub_key_h1 = this->kGrpXKey;
+ pub_key_h1.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key_h1, &compressed_privkey, &priv_key));
+
+ auto pub_key_w = this->kGrpXKey;
+ pub_key_w.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key_w, &compressed_privkey, &priv_key));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_DecompressPrivKeyFailsGivenInvalidCompressedKey) {
+ auto const& pub_key = this->kGrpXKey;
+ PrivKey priv_key = {};
+
+ auto compressed_privkey_ax = this->kGrpXMember9CompressedKey;
+ compressed_privkey_ax.ax.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey_ax, &priv_key));
+
+ auto compressed_privkey_seed = this->kGrpXMember9CompressedKey;
+ compressed_privkey_seed.seed.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, EpidDecompressPrivKey(
+ &pub_key, &compressed_privkey_seed, &priv_key));
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/get_sigsize-test.cc b/epid/member/tiny/unittests/get_sigsize-test.cc
new file mode 100644
index 0000000..52657af
--- /dev/null
+++ b/epid/member/tiny/unittests/get_sigsize-test.cc
@@ -0,0 +1,94 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// GetSigSize unit tests.
+/*!\file */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+namespace {
+
+TEST_F(EpidMemberTest, GetSigSizeReturnsSizeofBasicSigGivenNullPointer) {
+ size_t sig_size_without_sig_rl = sizeof(EpidSignature) - sizeof(NrProof);
+ EXPECT_EQ(sig_size_without_sig_rl, EpidGetSigSize(nullptr));
+}
+
+TEST_F(EpidMemberTest, GetSigSizeReturnsCorrectValueGivenValidSigRl) {
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ OctStr32 octstr32_1 = {0x00, 0x00, 0x00, 0x01};
+ OctStr32 octstr32_2 = {0x00, 0x00, 0x00, 0x02};
+ OctStr32 octstr32_16 = {0x00, 0x00, 0x00, 0x10};
+ OctStr32 octstr32_256 = {0x00, 0x00, 0x01, 0x00};
+ OctStr32 octstr32_65536 = {0x00, 0x01, 0x00, 0x00};
+ OctStr32 octstr32_4294967295 = {0xff, 0xff, 0xff, 0xff};
+
+ size_t one_entry_size = sizeof(NrProof);
+ size_t sig_size_0_entries = sizeof(EpidSignature) - one_entry_size;
+ size_t sig_size_1_entry = sig_size_0_entries + one_entry_size;
+ size_t sig_size_2_entries = sig_size_0_entries + 2 * one_entry_size;
+ size_t sig_size_16_entries = sig_size_0_entries + 16 * one_entry_size;
+ size_t sig_size_256_entries = sig_size_0_entries + 256 * one_entry_size;
+ size_t sig_size_65536_entries = sig_size_0_entries + 65536 * one_entry_size;
+ // no entries
+ srl.n2 = octstr32_0;
+ EXPECT_EQ(sig_size_0_entries, EpidGetSigSize(&srl));
+ // 1 entry
+ srl.n2 = octstr32_1;
+ EXPECT_EQ(sig_size_1_entry, EpidGetSigSize(&srl));
+ // 2 entries
+ srl.n2 = octstr32_2;
+ EXPECT_EQ(sig_size_2_entries, EpidGetSigSize(&srl));
+ // 16 entries
+ srl.n2 = octstr32_16;
+ EXPECT_EQ(sig_size_16_entries, EpidGetSigSize(&srl));
+ // 256 entries
+ srl.n2 = octstr32_256;
+ EXPECT_EQ(sig_size_256_entries, EpidGetSigSize(&srl));
+ // 65536 entries
+ srl.n2 = octstr32_65536;
+ EXPECT_EQ(sig_size_65536_entries, EpidGetSigSize(&srl));
+ // 4294967295 entries
+ srl.n2 = octstr32_4294967295;
+#if (SIZE_MAX <= 0xFFFFFFFF) // When size_t value is 32 bit or lower
+ EXPECT_EQ(sig_size_0_entries, EpidGetSigSize(&srl));
+#else
+ size_t sig_size_4294967295_entries =
+ sig_size_0_entries + 4294967295 * one_entry_size;
+ EXPECT_EQ(sig_size_4294967295_entries, EpidGetSigSize(&srl));
+#endif
+}
+
+TEST_F(EpidMemberTest,
+ GetSigSizeReturnsCorrectValueGivenValidSigRlUsingIKGFData) {
+ const std::vector<uint8_t> sigrl_bin = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+ };
+
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(sigrl_bin.data());
+ size_t sig_size_3_entries =
+ sizeof(EpidSignature) - sizeof(NrProof) + 3 * sizeof(NrProof);
+ // 3 entries
+ EXPECT_EQ(sig_size_3_entries, EpidGetSigSize(sig_rl));
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/internal/nr_prove-test.cc b/epid/member/tiny/unittests/internal/nr_prove-test.cc
new file mode 100644
index 0000000..e95cf24
--- /dev/null
+++ b/epid/member/tiny/unittests/internal/nr_prove-test.cc
@@ -0,0 +1,181 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Tiny NrProve unit tests.
+/*! \file */
+
+#ifndef SHARED
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/nrprove.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/signbasic.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+namespace {
+
+TEST_F(EpidMemberTest, NrProveFailsGivenInvalidSigRlEntry) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ NrProof proof;
+ // make sure that can generate NrProof using incorrupt sig_rl_enty
+ THROW_ON_EPIDERR(EpidNrProve(member, msg.data(), msg.size(), &this->kBasicSig,
+ &sig_rl->bk[0], &proof));
+ SigRlEntry sig_rl_enty_invalid_k = sig_rl->bk[0];
+ sig_rl_enty_invalid_k.k.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), &this->kBasicSig,
+ &sig_rl_enty_invalid_k, &proof));
+
+ SigRlEntry sig_rl_enty_invalid_b = sig_rl->bk[0];
+ sig_rl_enty_invalid_b.b.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), &this->kBasicSig,
+ &sig_rl_enty_invalid_b, &proof));
+}
+
+TEST_F(EpidMemberTest, NrProveFailsGivenInvalidBasicSig) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+ // make sure that can generate NrProof using incorrupt basic sig
+ THROW_ON_EPIDERR(EpidNrProve(member, msg.data(), msg.size(), &this->kBasicSig,
+ &sig_rl->bk[0], &proof));
+ // invalid basic sig is only when K value is invalid!!
+ NativeBasicSignature basic_sig_invalid_K = this->kBasicSig;
+ basic_sig_invalid_K.K.x.limbs.word[0]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), &basic_sig_invalid_K,
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofForEmptyMessage) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+
+ EXPECT_EQ(kEpidNoErr, EpidNrProve(member, nullptr, 0, &this->kBasicSig,
+ &sig_rl->bk[0], &proof));
+
+ BasicSignatureSerialize(&basic_sig, &this->kBasicSig);
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrVerify(ctx, &basic_sig, nullptr, 0, &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofForMsgContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kData_0_255;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+ EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(),
+ &this->kBasicSig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ BasicSignatureSerialize(&basic_sig, &this->kBasicSig);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProof) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+ EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(),
+ &this->kBasicSig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ BasicSignatureSerialize(&basic_sig, &this->kBasicSig);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha512) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ NrProof proof;
+ EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(),
+ &this->kBasicSig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ BasicSignatureSerialize(&basic_sig, &this->kBasicSig);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha256) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ NrProof proof;
+ EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(),
+ &this->kBasicSig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ BasicSignatureSerialize(&basic_sig, &this->kBasicSig);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+} // namespace
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/internal/presig_compute-test.cc b/epid/member/tiny/unittests/internal/presig_compute-test.cc
new file mode 100644
index 0000000..bd608fe
--- /dev/null
+++ b/epid/member/tiny/unittests/internal/presig_compute-test.cc
@@ -0,0 +1,44 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief tiny EpidMemberComputePreSig unit tests.
+ */
+
+#ifndef SHARED
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tiny/src/presig_compute.h"
+}
+
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+namespace {
+
+TEST_F(EpidMemberTest, SuccessfullyComputePresig) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ PreComputedSignatureData presig = {0};
+ EXPECT_EQ(kEpidNoErr, EpidMemberComputePreSig(member, &presig));
+}
+
+} // namespace
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/internal/serialize-test.cc b/epid/member/tiny/unittests/internal/serialize-test.cc
new file mode 100644
index 0000000..bbd29f6
--- /dev/null
+++ b/epid/member/tiny/unittests/internal/serialize-test.cc
@@ -0,0 +1,409 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief native type serialization unit tests.
+ *
+ * \warning to run the tests in this file you must build a non-shared mode.
+ */
+
+#ifndef SHARED
+
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/types.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/signbasic.h"
+}
+
+/// compares BasicSignature values
+bool operator==(BasicSignature const& lhs, BasicSignature const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(NativeBasicSignature const& lhs,
+ NativeBasicSignature const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(NativeGroupPubKey const& lhs, NativeGroupPubKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(NativePrivKey const& lhs, NativePrivKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(NativeMembershipCredential const& lhs,
+ NativeMembershipCredential const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+////////////////////////////////////////////////////////////////////////
+// BasicSignatureSerialize
+
+TEST(TinySerializeTest, BasicSignatureSerializeWorks) {
+ const NativeBasicSignature serialized_BaseSig = {
+ // B
+ {{0xB315D67E, 0x1924AE56, 0xCF527861, 0xEBB789B6, 0x3F429D2A, 0xB193BF9A,
+ 0x6BD8502F, 0x5E73BE39},
+ {0x0BD51968, 0x0F13472D, 0xC96B5096, 0xA9CD4491, 0x4AB668CF, 0x2123D56C,
+ 0xF30AF180, 0x0DB43C33}},
+ // K
+ {{0x9C3524E3, 0x4E4CA66B, 0x58731363, 0xB57BC920, 0x1317EBFA, 0xBD71A2D6,
+ 0x046B29FE, 0x64B5A803},
+ {0x86A7A14A, 0xDE584912, 0xFEFD476A, 0x8559EF80, 0x34D8E1D2, 0x81F6BF1D,
+ 0xE0C42E4B, 0x477FEC10}},
+ // T
+ {{0x444DB42F, 0xB57CFAA0, 0x3FB8C069, 0x3593EC91, 0xB968BBAA, 0x02D2BFBB,
+ 0xCF2E5D4A, 0xE57236B5},
+ {0x23C435BE, 0x92D96415, 0x6A552F32, 0x5E071AA9, 0xBBC76EDC, 0xC1C5D18A,
+ 0x654CA5AE, 0xB96FEBB0}},
+ // c
+ {0xD03D247B, 0x8C2A93E5, 0xCBB14B7A, 0x85919691, 0xC7009CFC, 0xEFD5278B,
+ 0x82D2F470, 0xA2CDE297},
+ // xs
+ {0xEB24D967, 0xDC578F59, 0x58C76405, 0x1958415E, 0xF08890BD, 0xDB47D06A,
+ 0x7257B3F5, 0x6346AA98},
+ // sf
+ {0x11B85D46, 0xBEA435F3, 0x11E85329, 0xDD10B17B, 0xC41B1647, 0x268C5DDC,
+ 0x4E39F40C, 0x25421795},
+ // sa
+ {0xCDA62A84, 0x3CC19531, 0xDCC526F5, 0x3A248BB8, 0xF973B761, 0x3E009735,
+ 0x6FC46BCC, 0x4EBDEDE8},
+ // sb
+ {0x2E0B26CF, 0x6193CD96, 0xED6E97F8, 0xBB9D186E, 0xB37A5227, 0xF82B38E5,
+ 0x610CAF48, 0x92A3681B}};
+ BasicSignature result = {0};
+ const BasicSignature expected_BaseSig = {
+ // B
+ {{0x5E, 0x73, 0xBE, 0x39, 0x6B, 0xD8, 0x50, 0x2F, 0xB1, 0x93, 0xBF,
+ 0x9A, 0x3F, 0x42, 0x9D, 0x2A, 0xEB, 0xB7, 0x89, 0xB6, 0xCF, 0x52,
+ 0x78, 0x61, 0x19, 0x24, 0xAE, 0x56, 0xB3, 0x15, 0xD6, 0x7E},
+ {0x0D, 0xB4, 0x3C, 0x33, 0xF3, 0x0A, 0xF1, 0x80, 0x21, 0x23, 0xD5,
+ 0x6C, 0x4A, 0xB6, 0x68, 0xCF, 0xA9, 0xCD, 0x44, 0x91, 0xC9, 0x6B,
+ 0x50, 0x96, 0x0F, 0x13, 0x47, 0x2D, 0x0B, 0xD5, 0x19, 0x68}},
+ // K
+ {{0x64, 0xB5, 0xA8, 0x03, 0x04, 0x6B, 0x29, 0xFE, 0xBD, 0x71, 0xA2,
+ 0xD6, 0x13, 0x17, 0xEB, 0xFA, 0xB5, 0x7B, 0xC9, 0x20, 0x58, 0x73,
+ 0x13, 0x63, 0x4E, 0x4C, 0xA6, 0x6B, 0x9C, 0x35, 0x24, 0xE3},
+ {0x47, 0x7F, 0xEC, 0x10, 0xE0, 0xC4, 0x2E, 0x4B, 0x81, 0xF6, 0xBF,
+ 0x1D, 0x34, 0xD8, 0xE1, 0xD2, 0x85, 0x59, 0xEF, 0x80, 0xFE, 0xFD,
+ 0x47, 0x6A, 0xDE, 0x58, 0x49, 0x12, 0x86, 0xA7, 0xA1, 0x4A}},
+ // T
+ {{0xE5, 0x72, 0x36, 0xB5, 0xCF, 0x2E, 0x5D, 0x4A, 0x02, 0xD2, 0xBF,
+ 0xBB, 0xB9, 0x68, 0xBB, 0xAA, 0x35, 0x93, 0xEC, 0x91, 0x3F, 0xB8,
+ 0xC0, 0x69, 0xB5, 0x7C, 0xFA, 0xA0, 0x44, 0x4D, 0xB4, 0x2F},
+ {0xB9, 0x6F, 0xEB, 0xB0, 0x65, 0x4C, 0xA5, 0xAE, 0xC1, 0xC5, 0xD1,
+ 0x8A, 0xBB, 0xC7, 0x6E, 0xDC, 0x5E, 0x07, 0x1A, 0xA9, 0x6A, 0x55,
+ 0x2F, 0x32, 0x92, 0xD9, 0x64, 0x15, 0x23, 0xC4, 0x35, 0xBE}},
+ // c
+ {0xA2, 0xCD, 0xE2, 0x97, 0x82, 0xD2, 0xF4, 0x70, 0xEF, 0xD5, 0x27,
+ 0x8B, 0xC7, 0x00, 0x9C, 0xFC, 0x85, 0x91, 0x96, 0x91, 0xCB, 0xB1,
+ 0x4B, 0x7A, 0x8C, 0x2A, 0x93, 0xE5, 0xD0, 0x3D, 0x24, 0x7B},
+ // sx
+ {0x63, 0x46, 0xAA, 0x98, 0x72, 0x57, 0xB3, 0xF5, 0xDB, 0x47, 0xD0,
+ 0x6A, 0xF0, 0x88, 0x90, 0xBD, 0x19, 0x58, 0x41, 0x5E, 0x58, 0xC7,
+ 0x64, 0x05, 0xDC, 0x57, 0x8F, 0x59, 0xEB, 0x24, 0xD9, 0x67},
+ // sf
+ {0x25, 0x42, 0x17, 0x95, 0x4E, 0x39, 0xF4, 0x0C, 0x26, 0x8C, 0x5D,
+ 0xDC, 0xC4, 0x1B, 0x16, 0x47, 0xDD, 0x10, 0xB1, 0x7B, 0x11, 0xE8,
+ 0x53, 0x29, 0xBE, 0xA4, 0x35, 0xF3, 0x11, 0xB8, 0x5D, 0x46},
+ // sa
+ {0x4E, 0xBD, 0xED, 0xE8, 0x6F, 0xC4, 0x6B, 0xCC, 0x3E, 0x00, 0x97,
+ 0x35, 0xF9, 0x73, 0xB7, 0x61, 0x3A, 0x24, 0x8B, 0xB8, 0xDC, 0xC5,
+ 0x26, 0xF5, 0x3C, 0xC1, 0x95, 0x31, 0xCD, 0xA6, 0x2A, 0x84},
+ // sb
+ {0x92, 0xA3, 0x68, 0x1B, 0x61, 0x0C, 0xAF, 0x48, 0xF8, 0x2B, 0x38,
+ 0xE5, 0xB3, 0x7A, 0x52, 0x27, 0xBB, 0x9D, 0x18, 0x6E, 0xED, 0x6E,
+ 0x97, 0xF8, 0x61, 0x93, 0xCD, 0x96, 0x2E, 0x0B, 0x26, 0xCF}};
+ BasicSignatureSerialize(&result, &serialized_BaseSig);
+ EXPECT_EQ(expected_BaseSig, result);
+}
+
+////////////////////////////////////////////////////////////////////////
+// BasicSignatureDeserialize
+
+TEST(TinySerializeTest, BasicSignatureDeserializeWorks) {
+ const BasicSignature deserialized_BaseSig = {
+ // B
+ {{0x5E, 0x73, 0xBE, 0x39, 0x6B, 0xD8, 0x50, 0x2F, 0xB1, 0x93, 0xBF,
+ 0x9A, 0x3F, 0x42, 0x9D, 0x2A, 0xEB, 0xB7, 0x89, 0xB6, 0xCF, 0x52,
+ 0x78, 0x61, 0x19, 0x24, 0xAE, 0x56, 0xB3, 0x15, 0xD6, 0x7E},
+ {0x0D, 0xB4, 0x3C, 0x33, 0xF3, 0x0A, 0xF1, 0x80, 0x21, 0x23, 0xD5,
+ 0x6C, 0x4A, 0xB6, 0x68, 0xCF, 0xA9, 0xCD, 0x44, 0x91, 0xC9, 0x6B,
+ 0x50, 0x96, 0x0F, 0x13, 0x47, 0x2D, 0x0B, 0xD5, 0x19, 0x68}},
+ // K
+ {{0x64, 0xB5, 0xA8, 0x03, 0x04, 0x6B, 0x29, 0xFE, 0xBD, 0x71, 0xA2,
+ 0xD6, 0x13, 0x17, 0xEB, 0xFA, 0xB5, 0x7B, 0xC9, 0x20, 0x58, 0x73,
+ 0x13, 0x63, 0x4E, 0x4C, 0xA6, 0x6B, 0x9C, 0x35, 0x24, 0xE3},
+ {0x47, 0x7F, 0xEC, 0x10, 0xE0, 0xC4, 0x2E, 0x4B, 0x81, 0xF6, 0xBF,
+ 0x1D, 0x34, 0xD8, 0xE1, 0xD2, 0x85, 0x59, 0xEF, 0x80, 0xFE, 0xFD,
+ 0x47, 0x6A, 0xDE, 0x58, 0x49, 0x12, 0x86, 0xA7, 0xA1, 0x4A}},
+ // T
+ {{0xE5, 0x72, 0x36, 0xB5, 0xCF, 0x2E, 0x5D, 0x4A, 0x02, 0xD2, 0xBF,
+ 0xBB, 0xB9, 0x68, 0xBB, 0xAA, 0x35, 0x93, 0xEC, 0x91, 0x3F, 0xB8,
+ 0xC0, 0x69, 0xB5, 0x7C, 0xFA, 0xA0, 0x44, 0x4D, 0xB4, 0x2F},
+ {0xB9, 0x6F, 0xEB, 0xB0, 0x65, 0x4C, 0xA5, 0xAE, 0xC1, 0xC5, 0xD1,
+ 0x8A, 0xBB, 0xC7, 0x6E, 0xDC, 0x5E, 0x07, 0x1A, 0xA9, 0x6A, 0x55,
+ 0x2F, 0x32, 0x92, 0xD9, 0x64, 0x15, 0x23, 0xC4, 0x35, 0xBE}},
+ // c
+ {0xA2, 0xCD, 0xE2, 0x97, 0x82, 0xD2, 0xF4, 0x70, 0xEF, 0xD5, 0x27,
+ 0x8B, 0xC7, 0x00, 0x9C, 0xFC, 0x85, 0x91, 0x96, 0x91, 0xCB, 0xB1,
+ 0x4B, 0x7A, 0x8C, 0x2A, 0x93, 0xE5, 0xD0, 0x3D, 0x24, 0x7B},
+ // sx
+ {0x63, 0x46, 0xAA, 0x98, 0x72, 0x57, 0xB3, 0xF5, 0xDB, 0x47, 0xD0,
+ 0x6A, 0xF0, 0x88, 0x90, 0xBD, 0x19, 0x58, 0x41, 0x5E, 0x58, 0xC7,
+ 0x64, 0x05, 0xDC, 0x57, 0x8F, 0x59, 0xEB, 0x24, 0xD9, 0x67},
+ // sf
+ {0x25, 0x42, 0x17, 0x95, 0x4E, 0x39, 0xF4, 0x0C, 0x26, 0x8C, 0x5D,
+ 0xDC, 0xC4, 0x1B, 0x16, 0x47, 0xDD, 0x10, 0xB1, 0x7B, 0x11, 0xE8,
+ 0x53, 0x29, 0xBE, 0xA4, 0x35, 0xF3, 0x11, 0xB8, 0x5D, 0x46},
+ // sa
+ {0x4E, 0xBD, 0xED, 0xE8, 0x6F, 0xC4, 0x6B, 0xCC, 0x3E, 0x00, 0x97,
+ 0x35, 0xF9, 0x73, 0xB7, 0x61, 0x3A, 0x24, 0x8B, 0xB8, 0xDC, 0xC5,
+ 0x26, 0xF5, 0x3C, 0xC1, 0x95, 0x31, 0xCD, 0xA6, 0x2A, 0x84},
+ // sb
+ {0x92, 0xA3, 0x68, 0x1B, 0x61, 0x0C, 0xAF, 0x48, 0xF8, 0x2B, 0x38,
+ 0xE5, 0xB3, 0x7A, 0x52, 0x27, 0xBB, 0x9D, 0x18, 0x6E, 0xED, 0x6E,
+ 0x97, 0xF8, 0x61, 0x93, 0xCD, 0x96, 0x2E, 0x0B, 0x26, 0xCF}};
+ const NativeBasicSignature expected_BaseSig = {
+ // B
+ {{0xB315D67E, 0x1924AE56, 0xCF527861, 0xEBB789B6, 0x3F429D2A, 0xB193BF9A,
+ 0x6BD8502F, 0x5E73BE39},
+ {0x0BD51968, 0x0F13472D, 0xC96B5096, 0xA9CD4491, 0x4AB668CF, 0x2123D56C,
+ 0xF30AF180, 0x0DB43C33}},
+ // K
+ {{0x9C3524E3, 0x4E4CA66B, 0x58731363, 0xB57BC920, 0x1317EBFA, 0xBD71A2D6,
+ 0x046B29FE, 0x64B5A803},
+ {0x86A7A14A, 0xDE584912, 0xFEFD476A, 0x8559EF80, 0x34D8E1D2, 0x81F6BF1D,
+ 0xE0C42E4B, 0x477FEC10}},
+ // T
+ {{0x444DB42F, 0xB57CFAA0, 0x3FB8C069, 0x3593EC91, 0xB968BBAA, 0x02D2BFBB,
+ 0xCF2E5D4A, 0xE57236B5},
+ {0x23C435BE, 0x92D96415, 0x6A552F32, 0x5E071AA9, 0xBBC76EDC, 0xC1C5D18A,
+ 0x654CA5AE, 0xB96FEBB0}},
+ // c
+ {0xD03D247B, 0x8C2A93E5, 0xCBB14B7A, 0x85919691, 0xC7009CFC, 0xEFD5278B,
+ 0x82D2F470, 0xA2CDE297},
+ // xs
+ {0xEB24D967, 0xDC578F59, 0x58C76405, 0x1958415E, 0xF08890BD, 0xDB47D06A,
+ 0x7257B3F5, 0x6346AA98},
+ // sf
+ {0x11B85D46, 0xBEA435F3, 0x11E85329, 0xDD10B17B, 0xC41B1647, 0x268C5DDC,
+ 0x4E39F40C, 0x25421795},
+ // sa
+ {0xCDA62A84, 0x3CC19531, 0xDCC526F5, 0x3A248BB8, 0xF973B761, 0x3E009735,
+ 0x6FC46BCC, 0x4EBDEDE8},
+ // sb
+ {0x2E0B26CF, 0x6193CD96, 0xED6E97F8, 0xBB9D186E, 0xB37A5227, 0xF82B38E5,
+ 0x610CAF48, 0x92A3681B}};
+ NativeBasicSignature result = {0};
+ BasicSignatureDeserialize(&result, &deserialized_BaseSig);
+ EXPECT_EQ(expected_BaseSig, result);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// GroupPubKeySerialize Tests
+TEST_F(EpidMemberTest, GroupPubKeySerializeWorks) {
+ NativeGroupPubKey const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ GroupPubKey const expected = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x7, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+ };
+ GroupPubKey actual = {0};
+ GroupPubKeySerialize(&actual, &input);
+ EXPECT_EQ(expected, actual);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// GroupPubKeyDeserialize Tests
+TEST_F(EpidMemberTest, GroupPubKeyDeserializeWorks) {
+ GroupPubKey const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x7, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+ };
+ NativeGroupPubKey const expected = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ NativeGroupPubKey actual = {0};
+ GroupPubKeyDeserialize(&actual, &input);
+ EXPECT_EQ(expected, actual);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PrivKeyDeserialize Tests
+TEST_F(EpidMemberTest, PrivKeyDeserializeWorks) {
+ PrivKey const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x46, 0xc9, 0x69, 0xee, 0xf4, 0x68, 0xe1, 0x5f, 0xac, 0xbf, 0xdd,
+ 0x77, 0xeb, 0x4c, 0xaf, 0x8a, 0x87, 0x68, 0x3f, 0x4e, 0xda, 0xf2,
+ 0x96, 0xec, 0x57, 0x08, 0x90, 0xe8, 0x19, 0x62, 0x54, 0xdb}}},
+ {{{0x1e, 0x52, 0x23, 0x16, 0x91, 0xe4, 0xa8, 0x1d, 0x9a, 0x1b, 0x8a,
+ 0xad, 0x0a, 0xcf, 0x36, 0x4f, 0xae, 0x43, 0xde, 0x62, 0xff, 0xa6,
+ 0x4b, 0xa8, 0x16, 0x24, 0x98, 0x80, 0x82, 0x80, 0x37, 0x77}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x48, 0x40, 0xb5, 0x6c, 0x6d, 0x47, 0x09, 0x0b, 0x05, 0xd6, 0x43,
+ 0x56, 0xe0, 0x7c, 0xc6, 0x8e, 0xa1, 0x65, 0x67, 0xfd, 0xa7, 0x07,
+ 0x87, 0x9b, 0x36, 0x2d, 0x41, 0x35, 0x63, 0x61, 0x31, 0xc7} // f
+ };
+ NativePrivKey const expected = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086,
+ 0x105eafd8, 0xa1e0d7df, 0x0a30ae43} // x
+ },
+ {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd, 0xe07cc68e, 0x05d64356,
+ 0x6d47090b, 0x4840b56c} // f
+ };
+ NativePrivKey actual = {0};
+ PrivKeyDeserialize(&actual, &input);
+ EXPECT_EQ(expected, actual);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// MembershipCredentialDeserialize Tests
+TEST_F(EpidMemberTest, MembershipCredentialDeserializeWorks) {
+ MembershipCredential const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x46, 0xc9, 0x69, 0xee, 0xf4, 0x68, 0xe1, 0x5f, 0xac, 0xbf, 0xdd,
+ 0x77, 0xeb, 0x4c, 0xaf, 0x8a, 0x87, 0x68, 0x3f, 0x4e, 0xda, 0xf2,
+ 0x96, 0xec, 0x57, 0x08, 0x90, 0xe8, 0x19, 0x62, 0x54, 0xdb}}},
+ {{{0x1e, 0x52, 0x23, 0x16, 0x91, 0xe4, 0xa8, 0x1d, 0x9a, 0x1b, 0x8a,
+ 0xad, 0x0a, 0xcf, 0x36, 0x4f, 0xae, 0x43, 0xde, 0x62, 0xff, 0xa6,
+ 0x4b, 0xa8, 0x16, 0x24, 0x98, 0x80, 0x82, 0x80, 0x37, 0x77}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77} // x
+ };
+ NativeMembershipCredential const expected = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086, 0x105eafd8,
+ 0xa1e0d7df, 0x0a30ae43} // x
+ };
+ NativeMembershipCredential actual = {0};
+ MembershipCredentialDeserialize(&actual, &input);
+ EXPECT_EQ(expected, actual);
+}
+
+} // namespace
+
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/internal/signbasic-test.cc b/epid/member/tiny/unittests/internal/signbasic-test.cc
new file mode 100644
index 0000000..9c364ac
--- /dev/null
+++ b/epid/member/tiny/unittests/internal/signbasic-test.cc
@@ -0,0 +1,109 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief tiny SignBasic unit tests.
+ */
+
+#ifndef SHARED
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/serialize.h"
+#include "epid/member/tiny/src/signbasic.h"
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+namespace {
+
+/////////////////////////////////////////////////////////////////////////
+// SignBasic
+
+TEST_F(EpidMemberTest, BasicSignaturesOfSameMessageAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ NativeBasicSignature basic_sig1 = {0};
+ NativeBasicSignature basic_sig2 = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig1));
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig2));
+ EXPECT_NE(0, memcmp(&basic_sig1, &basic_sig2, sizeof(NativeBasicSignature)));
+}
+
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingRandomBase) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ NativeBasicSignature native_basic_sig = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &native_basic_sig));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ BasicSignature basic_sig = {0};
+ BasicSignatureSerialize(&basic_sig, &native_basic_sig);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha512) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ NativeBasicSignature native_basic_sig = {0};
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &native_basic_sig));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ BasicSignature basic_sig = {0};
+ BasicSignatureSerialize(&basic_sig, &native_basic_sig);
+ EpidVerifierSetHashAlg(ctx, kSha512);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha256) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ NativeBasicSignature native_basic_sig = {0};
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &native_basic_sig));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ BasicSignature basic_sig = {0};
+ BasicSignatureSerialize(&basic_sig, &native_basic_sig);
+ EpidVerifierSetHashAlg(ctx, kSha256);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+} // namespace
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/internal/validate-test.cc b/epid/member/tiny/unittests/internal/validate-test.cc
new file mode 100644
index 0000000..b090959
--- /dev/null
+++ b/epid/member/tiny/unittests/internal/validate-test.cc
@@ -0,0 +1,317 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief native type validation unit tests.
+ *
+ * \warning to run the tests in this file you must build a non-shared mode.
+ */
+
+#ifndef SHARED
+
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/types.h"
+#include "epid/member/tiny/math/pairing.h"
+#include "epid/member/tiny/src/native_types.h"
+#include "epid/member/tiny/src/validate.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// GroupPubKeyIsInRange Tests
+TEST_F(EpidMemberTest, GroupPubKeyIsInRangePasses) {
+ NativeGroupPubKey const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_TRUE(GroupPubKeyIsInRange(&input));
+}
+
+TEST_F(EpidMemberTest, GroupPubKeyIsInRangeFails) {
+ NativeGroupPubKey const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}}}, //< q
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_FALSE(GroupPubKeyIsInRange(&input));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// MembershipCredentialIsInRange Tests
+TEST_F(EpidMemberTest, MembershipCredentialIsInRangePasses) {
+ NativeMembershipCredential const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086, 0x105eafd8,
+ 0xa1e0d7df, 0x0a30ae43} // x
+ };
+ EXPECT_TRUE(MembershipCredentialIsInRange(&input));
+}
+
+TEST_F(EpidMemberTest, MembershipCredentialIsInRangeFails) {
+ NativeMembershipCredential const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}}}, //< q
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086, 0x105eafd8,
+ 0xa1e0d7df, 0x0a30ae43} // x
+ };
+ EXPECT_FALSE(MembershipCredentialIsInRange(&input));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// MembershipCredentialIsInGroup Tests
+TEST_F(EpidMemberTest, MembershipCredentialIsInGroupPasses) {
+ PairingState pairing_state;
+ PairingInit(&pairing_state);
+ NativeMembershipCredential const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086, 0x105eafd8,
+ 0xa1e0d7df, 0x0a30ae43} // x
+ };
+ FpElem const f = {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd,
+ 0xe07cc68e, 0x05d64356, 0x6d47090b, 0x4840b56c}; // f
+ NativeGroupPubKey const pubkey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_TRUE(
+ MembershipCredentialIsInGroup(&input, &f, &pubkey, &pairing_state));
+}
+
+TEST_F(EpidMemberTest, MembershipCredentialIsInGroupFails) {
+ PairingState pairing_state;
+ PairingInit(&pairing_state);
+ NativeMembershipCredential const input = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086, 0x105eafd8,
+ 0xa1e0d7df, 0x0a30ae43} // x
+ };
+ FpElem const f = {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd,
+ 0xe07cc68e, 0x05d64356, 0x6d47090b, 0x4840b56c}; // f
+ NativeGroupPubKey const pubkey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_FALSE(
+ MembershipCredentialIsInGroup(&input, &f, &pubkey, &pairing_state));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PrivKeyIsInRange Tests
+TEST_F(EpidMemberTest, PrivKeyIsInRangePasses) {
+ NativePrivKey const input = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086,
+ 0x105eafd8, 0xa1e0d7df, 0x0a30ae43} // x
+ },
+ {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd, 0xe07cc68e, 0x05d64356,
+ 0x6d47090b, 0x4840b56c} // f
+ };
+ EXPECT_TRUE(PrivKeyIsInRange(&input));
+}
+
+TEST_F(EpidMemberTest, PrivKeyIsInRangeRangeFails) {
+ NativePrivKey const input = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xAED33013, 0xD3292DDB, 0x12980A82, 0x0CDC65FB, 0xEE71A49F,
+ 0x46E5F25E, 0xFFFCF0CD, 0xFFFFFFFF}}}, //< q
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086,
+ 0x105eafd8, 0xa1e0d7df, 0x0a30ae43} // x
+ },
+ {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd, 0xe07cc68e, 0x05d64356,
+ 0x6d47090b, 0x4840b56c} // f
+ };
+ EXPECT_FALSE(PrivKeyIsInRange(&input));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PrivKeyIsInGroup Tests
+TEST_F(EpidMemberTest, PrivKeyIsInGroupPasses) {
+ PairingState pairing_state;
+ PairingInit(&pairing_state);
+ NativePrivKey const input = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086,
+ 0x105eafd8, 0xa1e0d7df, 0x0a30ae43} // x
+ },
+ {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd, 0xe07cc68e, 0x05d64356,
+ 0x6d47090b, 0x4840b56c} // f
+ };
+ NativeGroupPubKey const pubkey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_TRUE(PrivKeyIsInGroup(&input, &pubkey, &pairing_state));
+}
+
+TEST_F(EpidMemberTest, PrivKeyIsInGroupFails) {
+ PairingState pairing_state;
+ PairingInit(&pairing_state);
+ NativePrivKey const input = {
+ {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02}, // group id
+ {{{{0x196254db, 0x570890e8, 0xdaf296ec, 0x87683f4e, 0xeb4caf8a,
+ 0xacbfdd77, 0xf468e15f, 0x46c969ee}}},
+ {{{0x82803777, 0x16249880, 0xffa64ba8, 0xae43de62, 0x0acf364f,
+ 0x9a1b8aad, 0x91e4a81d, 0x1e522316}}}}, // A
+ {0x1372c377, 0x00147c6b, 0x46ddb71b, 0xd09db9e4, 0x5a611086,
+ 0x105eafd8, 0xa1e0d7df, 0x0a30ae43} // x
+ },
+ {0x636131c7, 0x362d4135, 0xa707879b, 0xa16567fd, 0xe07cc68e, 0x05d64356,
+ 0x6d47090b, 0x4840b56c} // f
+ };
+ NativeGroupPubKey const pubkey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb580e099, 0x434c62fd, 0x64cee3ce, 0xd06d8f9d, 0x7e27b0cb,
+ 0x3d753d61, 0xe21b17eb, 0xb36fff81}}},
+ {{{0x74f459ee, 0xd8693ea1, 0x82457e7f, 0xee3d6642, 0xe94dae9c,
+ 0xfdb5b79d, 0xe08859a4, 0x3a075680}}}}, // h1
+ {{{{0xbcdd7fe1, 0x29666163, 0xd55ba704, 0xdc99ed42, 0x5474107b,
+ 0xd5dbca1c, 0x63c2518e, 0xd2742e9f}}},
+ {{{0xe78e1084, 0x93a56ecc, 0xde4ceacb, 0xda3f517d, 0xe85b087b,
+ 0x48120aa6, 0xe314ac72, 0x765dc06e}}}}, // h2
+ {{{{{0x0728e896, 0x8dcd3688, 0x6a95cac6, 0x788753f6, 0x401ba5b6,
+ 0x50719451, 0xe20fca1c, 0xbd195a95}}},
+ {{{0xe2f4b3a1, 0x22d9fde0, 0x0f6c56f5, 0x2414cfd1, 0x15d775f8,
+ 0xa6657a68, 0xb86ae7e5, 0xca78115b}}}},
+ {{{{0x57e4f33c, 0x0a3b5896, 0x89c2399c, 0x898846dd, 0x5deef56a,
+ 0xbc077230, 0xe8b3c725, 0x9021a7e0}}},
+ {{{0xee1140a9, 0x837d3e31, 0x8e25c6ad, 0xba6bf0da, 0x1f3deaa2,
+ 0x5d0a88db, 0x1bb6f705, 0x79516936}}}}}};
+ EXPECT_FALSE(PrivKeyIsInGroup(&input, &pubkey, &pairing_state));
+}
+
+} // namespace
+
+#endif // SHARED
diff --git a/epid/member/tiny/unittests/join_request-test.cc b/epid/member/tiny/unittests/join_request-test.cc
new file mode 100644
index 0000000..9d45d8d
--- /dev/null
+++ b/epid/member/tiny/unittests/join_request-test.cc
@@ -0,0 +1,369 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Join Request related unit tests.
+ */
+
+#include <cstring>
+#include <memory>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/member/api.h"
+}
+
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+/// compares FpElemStr values
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares JoinRequest values
+bool operator==(JoinRequest const& lhs, JoinRequest const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares JoinRequest values for inequality
+bool operator!=(JoinRequest const& lhs, JoinRequest const& rhs) {
+ return 0 != std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+// local constant for Join Request tests. This can be hoisted later if needed
+// avoids cpplint warning about multiple includes.
+const GroupPubKey kPubKey = {
+#include "epid/common-testhelper/testdata/grp01/gpubkey.inc"
+};
+
+const FpElemStr kFEps1 = {0x56, 0x57, 0xda, 0x39, 0x9f, 0x69, 0x17, 0x84,
+ 0xac, 0xf9, 0xf6, 0xdf, 0xfe, 0xd2, 0x41, 0xe8,
+ 0x02, 0x30, 0xf8, 0xd8, 0x72, 0x35, 0xd3, 0x0e,
+ 0x76, 0x2e, 0xda, 0x4b, 0xf4, 0xc5, 0x31, 0x0f};
+/// Validates join request.
+void ValidateJoinRequest(JoinRequest const& request, HashAlg hash_alg,
+ GroupPubKey const& grp_public_key, FpElemStr const& f,
+ IssuerNonce const& ni) {
+ Epid2Params params_values = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ Epid20Params params;
+
+ // h1^f ?= F
+ EcPointObj F_expected(&params.G1, grp_public_key.h1);
+ THROW_ON_EPIDERR(EcExp(params.G1, F_expected, (BigNumStr*)&f, F_expected));
+ ASSERT_EQ(*(G1ElemStr*)(F_expected.data().data()), request.F);
+
+ // H(p|g1|g2|h1|h2|w|F|R|ni) ?= c, where R = h1^s * F^(-c)
+ FfElementObj nc(&params.fp, request.c);
+ THROW_ON_EPIDERR(FfNeg(params.fp, nc, nc));
+ EcPointObj a(&params.G1, grp_public_key.h1);
+ EcPointObj b(&params.G1, request.F);
+ THROW_ON_EPIDERR(EcExp(params.G1, a, (BigNumStr*)&request.s, a));
+ THROW_ON_EPIDERR(EcExp(params.G1, b, (BigNumStr*)nc.data().data(), b));
+ THROW_ON_EPIDERR(EcMul(params.G1, a, b, a));
+
+#pragma pack(1)
+ struct {
+ BigNumStr p; // Intel(R) EPID 2.0 parameter p
+ G1ElemStr g1; // Intel(R) EPID 2.0 parameter g1
+ G2ElemStr g2; // Intel(R) EPID 2.0 parameter g2
+ G1ElemStr h1; // Group public key value h1
+ G1ElemStr h2; // Group public key value h2
+ G2ElemStr w; // Group public key value w
+ G1ElemStr F; // Variable F computed in algorithm
+ G1ElemStr R; // Variable R computed in algorithm
+ IssuerNonce NI; // Issuer Nonce
+ } commitment_values = {params_values.p,
+ params_values.g1,
+ params_values.g2,
+ grp_public_key.h1,
+ grp_public_key.h2,
+ grp_public_key.w,
+ request.F,
+ *(G1ElemStr*)(a.data().data()),
+ ni};
+#pragma pack()
+
+ FfElementObj commitment(&params.fp);
+ THROW_ON_EPIDERR(FfHash(params.fp, &commitment_values,
+ sizeof commitment_values, hash_alg, commitment));
+ ASSERT_EQ(*(FpElemStr*)(commitment.data().data()), request.c);
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenNullParameters) {
+ GroupPubKey pub_key = kPubKey;
+ IssuerNonce ni;
+ MemberParams params;
+ Prng prng;
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj ctx(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(nullptr, &pub_key, &ni, &join_request));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(ctx, nullptr, &ni, &join_request));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(ctx, &pub_key, nullptr, &join_request));
+ EXPECT_EQ(kEpidBadArgErr, EpidCreateJoinRequest(ctx, &pub_key, &ni, nullptr));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenNoF) {
+ GroupPubKey pub_key = kPubKey;
+ IssuerNonce ni;
+ MemberParams params;
+ Prng prng;
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj ctx(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(ctx, &pub_key, &ni, &join_request));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenInvalidGroupKey) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ pub_key.h1.x.data.data[15] = 0xff;
+ Epid20Params epid_params;
+ EcPointObj pt(&epid_params.G1);
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ ASSERT_NE(kEpidNoErr, ReadEcPoint(epid_params.G1, (uint8_t*)&pub_key.h1,
+ sizeof(pub_key.h1), pt));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenInvalidFValue) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ EpidStatus sts;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+
+ std::unique_ptr<uint8_t[]> member;
+ size_t context_size = 0;
+ sts = EpidMemberGetSize(&params, &context_size);
+ EXPECT_TRUE(kEpidNoErr == sts || kEpidBadArgErr == sts)
+ << "Actual value " << sts;
+
+ if (kEpidNoErr == sts) {
+ member.reset(new uint8_t[context_size]());
+ sts = EpidMemberInit(&params, (MemberCtx*)member.get());
+ EXPECT_TRUE(kEpidNoErr == sts || kEpidBadArgErr == sts)
+ << "Actual value " << sts;
+ }
+
+ if (kEpidNoErr == sts) {
+ sts = EpidCreateJoinRequest((MemberCtx*)member.get(), &pub_key, &ni,
+ &join_request);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ }
+
+ EpidMemberDeinit((MemberCtx*)member.get());
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestWorksUsingSha512) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha512, pub_key, f, ni));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestWorksUsingSha256) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha256, pub_key, f, ni));
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestGeneratesDiffJoinRequestsOnMultipleCalls) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request1;
+ JoinRequest join_request2;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request1));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request1, kSha512, pub_key, f, ni));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request2));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request2, kSha512, pub_key, f, ni));
+ EXPECT_NE(join_request1, join_request2);
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestGeneratesDiffJoinRequestsGivenDiffHashAlgs) {
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request1;
+ JoinRequest join_request2;
+ // Ensure that two members created with equal seed and do not
+ // interfere each other. Member1 is deleted by the time member2
+ // is created.
+ {
+ Prng prng;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member1(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member1, kSha256));
+ prng.set_seed(0x1234);
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member1, &pub_key, &ni, &join_request1));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request1, kSha256, pub_key, f, ni));
+ }
+ {
+ Prng prng;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member2(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member2, kSha512));
+ prng.set_seed(0x1234);
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member2, &pub_key, &ni, &join_request2));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request2, kSha512, pub_key, f, ni));
+ }
+ EXPECT_NE(join_request1, join_request2);
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestWorksGivenValidParametersUsingIKGFData) {
+ Prng prng;
+ MemberParams params = {0};
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha512, *pub_key, f, ni));
+}
+} // namespace
diff --git a/epid/member/tiny/unittests/main-testhelper.cc b/epid/member/tiny/unittests/main-testhelper.cc
new file mode 100644
index 0000000..2ea1d21
--- /dev/null
+++ b/epid/member/tiny/unittests/main-testhelper.cc
@@ -0,0 +1,24 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Main entry point for tiny member unit tests
+/*! \file */
+
+#include <gtest/gtest.h>
+
+int main(int argc, char* argv[]) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/member/tiny/unittests/member-testhelper.cc b/epid/member/tiny/unittests/member-testhelper.cc
new file mode 100644
index 0000000..870b29c
--- /dev/null
+++ b/epid/member/tiny/unittests/member-testhelper.cc
@@ -0,0 +1,468 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidMemberTest test fixture implementation.
+ */
+
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+#include <cstdio>
+#include <cstring>
+#include <string>
+
+extern "C" {
+#include "epid/common/types.h"
+#include "epid/member/tiny/src/native_types.h"
+}
+
+#include "epid/common-testhelper/mem_params-testhelper.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// Arbitrary test data were generated based on Intel(R) EPID 2.0 parameters
+const GroupPubKey EpidMemberTest::kGroupPublicKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x7, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+};
+
+const PrivKey EpidMemberTest::kMemberPrivateKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x46, 0xc9, 0x69, 0xee, 0xf4, 0x68, 0xe1, 0x5f, 0xac, 0xbf, 0xdd,
+ 0x77, 0xeb, 0x4c, 0xaf, 0x8a, 0x87, 0x68, 0x3f, 0x4e, 0xda, 0xf2,
+ 0x96, 0xec, 0x57, 0x08, 0x90, 0xe8, 0x19, 0x62, 0x54, 0xdb}}},
+ {{{0x1e, 0x52, 0x23, 0x16, 0x91, 0xe4, 0xa8, 0x1d, 0x9a, 0x1b, 0x8a,
+ 0xad, 0x0a, 0xcf, 0x36, 0x4f, 0xae, 0x43, 0xde, 0x62, 0xff, 0xa6,
+ 0x4b, 0xa8, 0x16, 0x24, 0x98, 0x80, 0x82, 0x80, 0x37, 0x77}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x48, 0x40, 0xb5, 0x6c, 0x6d, 0x47, 0x09, 0x0b, 0x05, 0xd6, 0x43,
+ 0x56, 0xe0, 0x7c, 0xc6, 0x8e, 0xa1, 0x65, 0x67, 0xfd, 0xa7, 0x07,
+ 0x87, 0x9b, 0x36, 0x2d, 0x41, 0x35, 0x63, 0x61, 0x31, 0xc7} // f
+};
+
+const MemberPrecomp EpidMemberTest::kMemberPrecomp = {
+ {0xd8, 0x14, 0xba, 0x4b, 0x44, 0x03, 0x55, 0x6c, 0xf6, 0x42, 0xe8,
+ 0xf0, 0x4c, 0xb5, 0xe7, 0xd4, 0xa2, 0xa3, 0x69, 0x47, 0xf5, 0xd4,
+ 0xc8, 0xe9, 0xc5, 0x5a, 0x39, 0xb5, 0x55, 0xa5, 0xd3, 0xfb, 0xf3,
+ 0x85, 0x5a, 0x0d, 0xd5, 0xee, 0xde, 0xf4, 0xa8, 0xb1, 0x8b, 0xcf,
+ 0xa9, 0x0d, 0x29, 0xbf, 0x86, 0x27, 0x9c, 0x1f, 0x96, 0xed, 0xd8,
+ 0x44, 0x01, 0x35, 0x1a, 0xce, 0xfd, 0x4e, 0x6f, 0xa1, 0x66, 0x0d,
+ 0x59, 0x08, 0x6d, 0xa2, 0xe4, 0x99, 0x83, 0xdc, 0x39, 0x28, 0xb7,
+ 0x1c, 0x1a, 0x33, 0xad, 0xca, 0x5c, 0x35, 0x26, 0x1f, 0xab, 0xba,
+ 0x0d, 0x53, 0xaf, 0xe0, 0x72, 0x14, 0xc5, 0xa7, 0x2e, 0x58, 0x26,
+ 0xc9, 0x8e, 0xfa, 0x6f, 0x62, 0xfc, 0xf0, 0x08, 0x3e, 0xa3, 0x11,
+ 0x3a, 0xf0, 0xb8, 0x3b, 0x2d, 0x3e, 0xec, 0xd5, 0xbc, 0xf2, 0x05,
+ 0x68, 0xf4, 0x40, 0xce, 0x2c, 0x8f, 0xdd, 0xa4, 0xe5, 0xe1, 0xb5,
+ 0xbe, 0xbd, 0x3e, 0xd4, 0xf6, 0x9a, 0xb3, 0x37, 0x24, 0x0d, 0xea,
+ 0x13, 0xd7, 0x1f, 0xa2, 0x75, 0x68, 0xa1, 0xbe, 0x2c, 0x01, 0x42,
+ 0x2a, 0xae, 0x6f, 0xae, 0x7a, 0x72, 0x3a, 0x11, 0x03, 0x58, 0x02,
+ 0x0d, 0xf0, 0xb0, 0xd9, 0x6f, 0xb1, 0xe4, 0xf2, 0x70, 0xb8, 0xff,
+ 0x22, 0x56, 0x7c, 0xb3, 0x80, 0xfd, 0xdf, 0xe5, 0xab, 0xcc, 0x18,
+ 0x7a, 0xfd, 0x91, 0xd0, 0xb0, 0x63, 0x40, 0xd4, 0x71, 0xfa, 0x03,
+ 0xf5, 0xf1, 0x26, 0xe1, 0xa5, 0x5a, 0xd9, 0x6d, 0xf5, 0x5a, 0x7b,
+ 0x2a, 0x3a, 0xfe, 0x94, 0x9e, 0x74, 0x41, 0x79, 0x49, 0x7e, 0x48,
+ 0x1d, 0x58, 0x5e, 0xf6, 0x98, 0xa3, 0x6e, 0x61, 0x8e, 0x9f, 0x1f,
+ 0xcd, 0x15, 0x01, 0x16, 0xa5, 0xe0, 0xab, 0xd6, 0xd6, 0x1f, 0x1c,
+ 0xf5, 0x81, 0x76, 0xc1, 0xec, 0x10, 0xc2, 0xcc, 0x68, 0x59, 0x4d,
+ 0x47, 0xef, 0x4b, 0x7f, 0xd8, 0x78, 0x9c, 0xfe, 0x9a, 0x86, 0x7e,
+ 0x0c, 0xfd, 0x3e, 0x0a, 0x7a, 0x72, 0x8b, 0x14, 0x5f, 0xe6, 0x5f,
+ 0x19, 0xa3, 0x0a, 0x1b, 0x71, 0xdc, 0xd2, 0xae, 0x35, 0xc3, 0x11,
+ 0xa5, 0xd3, 0xea, 0xe1, 0xa9, 0xe7, 0x70, 0x0c, 0x7a, 0x39, 0x56,
+ 0x3c, 0xe4, 0xe7, 0xf9, 0xb6, 0xf1, 0x15, 0x40, 0xab, 0xb6, 0xc4,
+ 0xad, 0xbd, 0xf4, 0xcc, 0x13, 0xb7, 0xa8, 0xb6, 0x92, 0x1e, 0x72,
+ 0x27, 0xa7, 0xff, 0xd9, 0xea, 0x2f, 0x91, 0x96, 0x22, 0xd2, 0xc4,
+ 0x4d, 0x80, 0xdc, 0x47, 0x66, 0x87, 0xcc, 0xcf, 0xc5, 0x64, 0xf7,
+ 0xb2, 0x34, 0xed, 0xd5, 0x44, 0x44, 0xcc, 0x57, 0x41, 0xc7, 0x92,
+ 0xb7, 0x5c, 0x12, 0xf7, 0x81, 0xf2, 0x92, 0x35, 0x3e, 0x4b, 0xdf,
+ 0xf8, 0xda, 0x68, 0xac, 0x30, 0xe3, 0xdd, 0x9e, 0x22, 0xaa, 0x6d,
+ 0x77, 0xdd, 0xac, 0xd9, 0x11, 0x6e, 0xfb, 0x1a, 0x88, 0xb3}, // e12
+ {
+ 0x07, 0x3f, 0x9d, 0x47, 0x82, 0xb8, 0x3d, 0x6a, 0xe0, 0x36, 0xab, 0xa6,
+ 0xfa, 0xe6, 0xd2, 0x1c, 0xc8, 0xb2, 0xd0, 0x01, 0xd4, 0x96, 0xdc, 0x2e,
+ 0xf8, 0x19, 0xdc, 0x70, 0x1b, 0xf9, 0x73, 0x0c, 0x2b, 0xc2, 0xe2, 0x1d,
+ 0x85, 0x53, 0x81, 0x51, 0xfb, 0xca, 0x16, 0x86, 0xd4, 0x4e, 0xfd, 0x1a,
+ 0x59, 0xe3, 0x97, 0xc4, 0x7f, 0x99, 0xd8, 0x66, 0x08, 0xa1, 0xe4, 0x9f,
+ 0xbb, 0x3a, 0xce, 0xa5, 0x23, 0x9c, 0x83, 0x13, 0xc5, 0xc8, 0xf2, 0x16,
+ 0x1e, 0xe8, 0xe6, 0xc5, 0x36, 0x57, 0x2c, 0xdf, 0x73, 0xb4, 0xe2, 0xb2,
+ 0xcb, 0xeb, 0xbb, 0xf7, 0x45, 0xd1, 0x44, 0xbd, 0x6e, 0x92, 0x95, 0x00,
+ 0xe5, 0x89, 0xb5, 0x91, 0x78, 0xc7, 0x44, 0xb1, 0x2f, 0x37, 0xdf, 0xfb,
+ 0xe7, 0x8a, 0x44, 0x3f, 0x3d, 0x06, 0x5f, 0x5b, 0x1c, 0x5f, 0xce, 0x11,
+ 0x05, 0x35, 0x3c, 0xad, 0x92, 0x7e, 0x79, 0xb8, 0xff, 0x28, 0x05, 0xe4,
+ 0x04, 0x2c, 0xb6, 0x1d, 0x22, 0xab, 0x36, 0x00, 0x5f, 0x74, 0xf1, 0xe3,
+ 0xf6, 0xa6, 0x68, 0xe6, 0x7b, 0x25, 0xb8, 0xcf, 0x19, 0xb0, 0x1a, 0xdd,
+ 0x0f, 0xad, 0x63, 0x73, 0x62, 0x1b, 0xe7, 0x94, 0x5d, 0xbf, 0x3d, 0xf1,
+ 0xf9, 0x8e, 0xab, 0x59, 0xe5, 0xd1, 0x7c, 0x62, 0xdd, 0xbc, 0x40, 0x07,
+ 0x70, 0x5b, 0x13, 0xf6, 0x12, 0x09, 0xb4, 0x0d, 0x3e, 0xab, 0x8b, 0x70,
+ 0x60, 0x1d, 0xd4, 0x61, 0x37, 0x28, 0x98, 0x3e, 0x7e, 0xdc, 0xfd, 0xd2,
+ 0xc0, 0x2f, 0x4b, 0x71, 0x31, 0x34, 0xd7, 0x69, 0x41, 0x5e, 0xaa, 0x72,
+ 0xe4, 0xdf, 0xeb, 0xfe, 0x8d, 0xcd, 0x68, 0xfc, 0x68, 0x55, 0xbe, 0x32,
+ 0x7d, 0x24, 0xc5, 0x07, 0x0f, 0xa8, 0xbd, 0x5a, 0xfe, 0xe7, 0xec, 0xdb,
+ 0xfd, 0x19, 0xc8, 0xa9, 0x20, 0xa2, 0x7f, 0x6c, 0xa6, 0x62, 0xec, 0xed,
+ 0x9b, 0x79, 0xbf, 0x9c, 0x0e, 0x31, 0x0b, 0x25, 0x2f, 0xd3, 0xcc, 0xa0,
+ 0xdd, 0xb2, 0xf2, 0x69, 0x26, 0x85, 0x21, 0x06, 0x94, 0x56, 0x5f, 0x59,
+ 0x5c, 0xf5, 0xb7, 0x82, 0xce, 0x0f, 0xdd, 0x40, 0xdb, 0x83, 0xac, 0x3c,
+ 0x41, 0xa0, 0x1b, 0xb1, 0xaf, 0xda, 0x55, 0xbf, 0x6b, 0x1a, 0xef, 0xe6,
+ 0x90, 0xe7, 0xaa, 0x0f, 0x04, 0x3c, 0x9f, 0x5b, 0xb7, 0xcd, 0x98, 0xa8,
+ 0x9e, 0xff, 0x54, 0x26, 0xc8, 0xd5, 0x5c, 0x30, 0x5e, 0xa2, 0x99, 0x8e,
+ 0x34, 0xd5, 0x98, 0x9f, 0xcd, 0x57, 0xd1, 0x4d, 0x1d, 0xee, 0x01, 0x5d,
+ 0x5a, 0x6d, 0xb2, 0xf1, 0xcf, 0x4b, 0xc0, 0x21, 0x23, 0x96, 0x05, 0xf9,
+ 0xc9, 0x66, 0xe5, 0x25, 0x9d, 0xa3, 0x8e, 0x78, 0x43, 0x19, 0xc1, 0x7f,
+ 0x7b, 0xef, 0xf5, 0xed, 0x00, 0xb7, 0x45, 0x1f, 0x4e, 0xa9, 0xfa, 0xe3,
+ 0xff, 0x54, 0xf2, 0x21, 0x73, 0xf8, 0x6b, 0xa1, 0xc7, 0x31, 0x4d, 0x6a,
+ }, // e22
+ {
+ 0x49, 0x0d, 0x0f, 0x2a, 0x5c, 0x6a, 0x3b, 0xad, 0x71, 0xc9, 0x22, 0x49,
+ 0xe8, 0x08, 0xdd, 0xba, 0x79, 0x57, 0xb7, 0xc7, 0x61, 0xe4, 0xdb, 0x84,
+ 0x68, 0x57, 0xb9, 0x30, 0x83, 0xa4, 0xdc, 0xef, 0x70, 0x93, 0x28, 0xe2,
+ 0x6f, 0xb9, 0xbc, 0x15, 0x28, 0x3a, 0x30, 0xbd, 0x96, 0x83, 0xdb, 0xf2,
+ 0x9d, 0x1e, 0xc7, 0x64, 0x6d, 0x2e, 0x7c, 0xa2, 0xf3, 0xaa, 0x2f, 0x4b,
+ 0x6d, 0x86, 0x9e, 0x48, 0x20, 0x29, 0x4b, 0x1f, 0x8d, 0xc2, 0x93, 0xc3,
+ 0x55, 0x25, 0x8e, 0xb0, 0x8a, 0x7e, 0x64, 0x45, 0x3f, 0xf4, 0x1d, 0x16,
+ 0x4c, 0x88, 0x2d, 0x54, 0xbe, 0xa8, 0x67, 0x70, 0x81, 0xc5, 0xb9, 0x5c,
+ 0x16, 0x00, 0xef, 0x78, 0xf6, 0x4d, 0x6a, 0xeb, 0xfd, 0xa2, 0x0d, 0x52,
+ 0x86, 0xf3, 0x04, 0x4b, 0xd8, 0xf0, 0x7d, 0x50, 0x8b, 0xad, 0xc0, 0x37,
+ 0xdb, 0x38, 0xf2, 0x7d, 0x1f, 0x8b, 0x13, 0x83, 0x7b, 0xcc, 0xe8, 0x25,
+ 0xfe, 0xfa, 0x0c, 0x02, 0x05, 0x2e, 0x75, 0x12, 0xa1, 0x0a, 0x89, 0xab,
+ 0xf1, 0xb2, 0x08, 0x47, 0x9a, 0xea, 0xef, 0x1d, 0xa4, 0x9f, 0xde, 0x89,
+ 0x47, 0x3e, 0x7c, 0x5e, 0x4a, 0x40, 0xdc, 0xec, 0xc5, 0x1b, 0x7e, 0x33,
+ 0x0a, 0x19, 0x69, 0x27, 0xa6, 0xcc, 0x25, 0xfc, 0xf9, 0xeb, 0xbd, 0xb7,
+ 0x8a, 0xdb, 0x45, 0x5f, 0x9d, 0x9e, 0x01, 0xde, 0x3d, 0x91, 0x10, 0x99,
+ 0x13, 0xbf, 0xc0, 0xfa, 0x9d, 0xd4, 0x0f, 0xb3, 0x09, 0xf3, 0xa1, 0xae,
+ 0x68, 0xe1, 0x1b, 0x48, 0x85, 0x9f, 0x81, 0x66, 0x91, 0xe2, 0xf0, 0x7b,
+ 0x29, 0xdb, 0x8f, 0x5d, 0x99, 0xa9, 0xd3, 0x39, 0x30, 0xd9, 0x1b, 0x94,
+ 0x2a, 0x1c, 0x5c, 0xe9, 0xc0, 0x3f, 0x6e, 0xb2, 0x27, 0xbe, 0x74, 0x7a,
+ 0xca, 0xe1, 0x0f, 0x6a, 0x43, 0x2e, 0x98, 0x65, 0xaf, 0x7f, 0x6e, 0x5a,
+ 0x55, 0x98, 0xc1, 0x58, 0x29, 0xb3, 0x86, 0x54, 0x0f, 0x57, 0x91, 0x89,
+ 0x29, 0xb1, 0x98, 0x79, 0xcc, 0x95, 0x39, 0xd0, 0xab, 0xe0, 0x9f, 0xf3,
+ 0xda, 0xf9, 0x5e, 0xd9, 0x34, 0xbb, 0x72, 0xda, 0xe5, 0x72, 0xd3, 0xf8,
+ 0x9b, 0xf9, 0x14, 0x84, 0x48, 0x81, 0x54, 0x4f, 0xe6, 0x2b, 0x80, 0xc8,
+ 0xc1, 0x79, 0xfe, 0x83, 0xff, 0x76, 0xa3, 0x6d, 0xfe, 0x37, 0x78, 0xc5,
+ 0x30, 0x7a, 0x50, 0xe2, 0x5d, 0x12, 0xdc, 0x72, 0xe9, 0x58, 0x7c, 0x07,
+ 0x4f, 0xff, 0x15, 0x8a, 0x97, 0x3b, 0xcb, 0x60, 0xfa, 0x4e, 0xde, 0x8c,
+ 0x80, 0x3a, 0x8b, 0x0b, 0xc6, 0x1d, 0xa3, 0xce, 0x6a, 0xb3, 0x50, 0x69,
+ 0x03, 0x96, 0xca, 0xc0, 0xb6, 0x94, 0x6f, 0x8f, 0xab, 0x6f, 0x5b, 0x00,
+ 0x2a, 0x1d, 0x90, 0xa7, 0x81, 0xc6, 0x15, 0x77, 0x79, 0xf3, 0x36, 0x23,
+ 0xd1, 0x46, 0x25, 0x58, 0x6f, 0x7b, 0x22, 0xac, 0x4c, 0x7a, 0xf3, 0x9f,
+ }, // e2w
+ {
+ 0x8d, 0x71, 0xe2, 0xb0, 0x73, 0x2f, 0x4a, 0xba, 0x64, 0xe8, 0x7a, 0x12,
+ 0xaf, 0xe4, 0x4f, 0xdb, 0x6b, 0x3e, 0x38, 0x07, 0x0c, 0x79, 0x22, 0x48,
+ 0x1b, 0x9d, 0x33, 0x53, 0x5c, 0x75, 0x3b, 0x40, 0x5e, 0x18, 0xd1, 0x92,
+ 0x4a, 0xd1, 0x82, 0x1c, 0xc7, 0x3a, 0xf7, 0x7e, 0x32, 0x19, 0x99, 0x5d,
+ 0x01, 0x0e, 0xb0, 0xf2, 0x8f, 0x80, 0xc6, 0xb9, 0xeb, 0x1f, 0x9e, 0xae,
+ 0x9e, 0xe0, 0x99, 0xfd, 0xe8, 0x93, 0x11, 0x61, 0x7d, 0xc2, 0x49, 0xdb,
+ 0xa8, 0x73, 0xa4, 0xa9, 0x33, 0xe2, 0x04, 0xd1, 0x7d, 0x8b, 0xe1, 0xd6,
+ 0x2b, 0x10, 0x6c, 0x79, 0x02, 0xbf, 0xfc, 0x53, 0x03, 0xa9, 0xbc, 0x30,
+ 0x4d, 0x4d, 0xf4, 0x32, 0xce, 0x9a, 0x4a, 0xfa, 0xd6, 0x7f, 0x26, 0x17,
+ 0xc5, 0xf6, 0xed, 0xe4, 0xcc, 0xb9, 0x79, 0xe2, 0xa8, 0x86, 0xbb, 0xd7,
+ 0xfb, 0x05, 0xd2, 0x81, 0xbe, 0x07, 0x1c, 0x47, 0x48, 0x4f, 0x6d, 0x6b,
+ 0x52, 0x42, 0xe4, 0xc6, 0x20, 0x46, 0xa3, 0xae, 0x5b, 0x55, 0x55, 0xfe,
+ 0x4a, 0xad, 0xf2, 0x32, 0x07, 0x0f, 0x91, 0xa9, 0xe5, 0xd3, 0x86, 0x08,
+ 0x73, 0x93, 0xc7, 0x1e, 0x6b, 0xcd, 0x69, 0xd0, 0xfb, 0xc1, 0x74, 0xc2,
+ 0xb8, 0x90, 0xc8, 0xf8, 0x93, 0xbf, 0x08, 0x0f, 0x15, 0x19, 0x26, 0x71,
+ 0x4a, 0x9e, 0xdf, 0xdf, 0xca, 0x6f, 0xca, 0xfd, 0x67, 0xec, 0x4d, 0x21,
+ 0x5b, 0x99, 0xbd, 0x4b, 0x79, 0x22, 0x2d, 0xe4, 0x24, 0x72, 0x88, 0x93,
+ 0xce, 0xe6, 0x7f, 0xef, 0x35, 0x83, 0x67, 0x39, 0xb9, 0x34, 0x80, 0x64,
+ 0x0a, 0xf4, 0xff, 0x42, 0x9d, 0xee, 0xda, 0xb8, 0xd3, 0xdc, 0x1d, 0x0d,
+ 0x9f, 0x45, 0xe9, 0xbe, 0xf4, 0x3e, 0xa6, 0x58, 0x8b, 0xf0, 0xfd, 0x01,
+ 0x73, 0x63, 0xd0, 0xc6, 0x9d, 0xb9, 0x32, 0xd1, 0x91, 0xfe, 0xb1, 0xf5,
+ 0x4b, 0x48, 0xb4, 0x46, 0xae, 0x61, 0xd7, 0x90, 0xfe, 0x86, 0x74, 0x68,
+ 0xee, 0x78, 0x86, 0x65, 0x99, 0x6d, 0x7b, 0xf0, 0x17, 0x1a, 0x4c, 0xb0,
+ 0x37, 0x73, 0xdc, 0x38, 0x41, 0xfa, 0x02, 0xd2, 0x13, 0x8f, 0x71, 0xb4,
+ 0x0a, 0x72, 0x70, 0x0f, 0xe1, 0x2c, 0x9a, 0xa9, 0x51, 0xfa, 0xb2, 0xbf,
+ 0x84, 0xf2, 0xa6, 0xfb, 0xc3, 0x83, 0x16, 0x7e, 0x27, 0xec, 0x06, 0x5d,
+ 0x64, 0x79, 0xe7, 0x42, 0x30, 0xf8, 0x2d, 0xbc, 0x0f, 0x07, 0x8b, 0xf2,
+ 0x99, 0xda, 0x91, 0x4c, 0x65, 0xcf, 0x7f, 0x57, 0x2d, 0x2f, 0x67, 0xe7,
+ 0xfb, 0x75, 0xe9, 0xb2, 0xa3, 0x72, 0x60, 0x88, 0x2b, 0x14, 0x31, 0x62,
+ 0xbc, 0x45, 0x59, 0x5c, 0x58, 0x39, 0xb3, 0x4a, 0xeb, 0xb9, 0x18, 0x24,
+ 0x05, 0xcb, 0xda, 0xd3, 0x5e, 0x54, 0xba, 0xda, 0xfd, 0xfc, 0xa0, 0x02,
+ 0xb3, 0xde, 0x52, 0x3e, 0xc0, 0xd0, 0xb8, 0x19, 0x85, 0x1b, 0x7b, 0xe3,
+ } // ea2
+};
+const NativeBasicSignature EpidMemberTest::kBasicSig = {
+ // B
+ {{0xD2E7034F, 0xDE132705, 0x532E403A, 0x9D6C5CAB, 0x6AA4231B, 0x16C48B8A,
+ 0x3784FC01, 0x1A4456B3},
+ {0xD0BB1EEC, 0x417952E2, 0x71755350, 0xE39B1B6F, 0x10ABCD80, 0x89EAF58F,
+ 0xE68604BC, 0x1F308883}},
+ // K
+ {{0x7BA80706, 0x3A0326CB, 0xBFB2C975, 0xF362D12D, 0xBD15EC31, 0x832BB024,
+ 0x583ED765, 0x6F6C3E01},
+ {0xFBEDFF07, 0x4450A702, 0xB80EAC00, 0x6B2E31AE, 0xE49B1639, 0xC7E70FED,
+ 0x2FEC671D, 0x923A7258}},
+ // T
+ {{0x931C950D, 0xEF075B6B, 0x126CB51A, 0x6278696A, 0xB5BEE13B, 0x2D682765,
+ 0xA9C2B37D, 0xCDECCBBA},
+ {0xE8953E8D, 0x151E3984, 0x276EC430, 0x33327946, 0x7F32E500, 0x07C3D873,
+ 0x27E7E4D3, 0xFA0A9ED2}},
+ // c
+ {0x2FDCAC88, 0x432C5EC5, 0x532F10A9, 0x5FE27AF0, 0xEE0657AB, 0x97884AF7,
+ 0x0897633B, 0xE5C33EEF},
+ // sx
+ {0x86639266, 0x80D60A98, 0x80AB6BB6, 0x87066083, 0x9D029C65, 0xD7550AE6,
+ 0x94D81487, 0xD9FDF300},
+ // sf
+ {0xCD23A7BC, 0x2C2F28D5, 0xDCC46E40, 0x951B6719, 0x988B676D, 0xD7DC015A,
+ 0xEBBEA941, 0xAAEFA83A},
+ // sa
+ {0xB706055E, 0xA1280802, 0xE9EB52AF, 0x1D147522, 0x952A12B2, 0x7744D263,
+ 0x76E80259, 0x55422EA1},
+ // sb
+ {0xF8EE5D60, 0xDB85B38E, 0xD57C2B9F, 0x3F0A58C0, 0x3A0AB12C, 0xB9971C02,
+ 0x69E22FF7, 0xBAAF3219}};
+
+const std::vector<uint8_t> EpidMemberTest::kGroupPublicKeyDataIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kMemberPrivateKeyDataIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc"
+};
+
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha256 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha384 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha512 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kTest1Msg = {'t', 'e', 's', 't',
+ '1'};
+std::vector<uint8_t> EpidMemberTest::kSigRlData = {
+#include "epid/common-testhelper/testdata/grp01/sigrl.inc"
+};
+std::vector<uint8_t> EpidMemberTest::kSigRl5EntryData = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x05,
+ // bk's
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd, 0x8,
+ 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea, 0x2e,
+ 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94, 0x67,
+ 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57, 0x9d, 0xc7,
+ 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad, 0x7d, 0xfe,
+ 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2, 0x89, 0xb2,
+ 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9, 0xcf, 0xd, 0x40,
+ 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d, 0x4f, 0x7a, 0xb5,
+ 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a, 0x33, 0xad, 0xf6,
+ 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37, 0xce, 0xec, 0xd1,
+ 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10, 0xfe,
+ 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60, 0x3e, 0xc0,
+ 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82, 0xc4, 0x49,
+ 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5, 0x77, 0x16, 0x4,
+ 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8, 0x40, 0xbd, 0x69,
+ 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9, 0xdd, 0x97, 0x6c,
+ 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2, 0xca, 0x5, 0x44, 0x9b,
+ 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa, 0xcf, 0xa4, 0x4, 0xe9, 0xf3,
+ 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3, 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37,
+ 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60, 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40,
+ 0x11,
+
+ 0x6e, 0x22, 0xaa, 0x10, 0x84, 0x58, 0x8b, 0xff, 0xd8, 0x37, 0x8, 0xa9, 0xe9,
+ 0xdb, 0xf6, 0x1f, 0x69, 0x10, 0x95, 0x6c, 0xbf, 0xd, 0x11, 0x48, 0x6f, 0x1b,
+ 0x3c, 0x62, 0x46, 0x13, 0x89, 0x13, 0x5f, 0xa1, 0x3, 0x62, 0xed, 0x62, 0xdf,
+ 0x3d, 0xbf, 0xcd, 0xb7, 0x41, 0x48, 0x81, 0x3, 0x9f, 0x54, 0xa, 0xe, 0xb3,
+ 0x35, 0xf9, 0xde, 0x24, 0xba, 0x6d, 0x4c, 0x7f, 0xfc, 0xc1, 0xb4, 0xce,
+ 0x6d, 0xa1, 0x73, 0x7c, 0xaa, 0xb, 0xad, 0x2, 0xd6, 0x37, 0x85, 0xe, 0xbb,
+ 0x48, 0x11, 0x38, 0xc4, 0xaa, 0x1b, 0xf, 0xcf, 0xc1, 0x9c, 0x26, 0xcc, 0x95,
+ 0xc2, 0x5b, 0x49, 0x9, 0x3d, 0xe9, 0x7d, 0xce, 0xc7, 0xa6, 0x4, 0x3e, 0x7c,
+ 0x9e, 0x28, 0xde, 0x8, 0x11, 0xe, 0x61, 0x3b, 0xc0, 0x9c, 0x6b, 0x58, 0x23,
+ 0xe6, 0x40, 0x7b, 0xbd, 0xb8, 0x72, 0xf, 0xe0, 0xee, 0xcf, 0xba, 0xb4,
+
+ 0xc4, 0xff, 0xaf, 0x48, 0x15, 0xda, 0x60, 0x40, 0xcc, 0xd7, 0xf2, 0x68,
+ 0xf7, 0xe2, 0x70, 0x12, 0x8d, 0x15, 0xa5, 0xb7, 0xe6, 0x4c, 0x23, 0xea,
+ 0x4d, 0x8a, 0x51, 0x6, 0x67, 0x3, 0x4c, 0x83, 0x6f, 0x28, 0x67, 0xcf, 0x63,
+ 0x46, 0x3e, 0x8a, 0x45, 0x9f, 0xed, 0x1a, 0xde, 0xa7, 0xad, 0xb2, 0x2b, 0xf,
+ 0x8b, 0xab, 0x7c, 0x70, 0xff, 0xc3, 0xa8, 0x6e, 0x8c, 0xaa, 0xb1, 0xf6,
+ 0x20, 0xe3, 0xb9, 0xf1, 0xc3, 0x3d, 0x5, 0x6a, 0x1e, 0x26, 0x2d, 0xf4, 0xd,
+ 0xe4, 0x53, 0x63, 0x67, 0x23, 0x48, 0xa8, 0x1, 0xa8, 0xee, 0xe1, 0x5f, 0x64,
+ 0xe3, 0x2c, 0x71, 0xe2, 0x10, 0x82, 0x0, 0x52, 0xd7, 0x74, 0x87, 0xff, 0x1c,
+ 0x0, 0x19, 0xe6, 0x4d, 0x15, 0x91, 0x6d, 0xf3, 0x38, 0x3b, 0xee, 0xf3, 0xd5,
+ 0xd1, 0xc7, 0x6d, 0xd9, 0x8e, 0x55, 0x70, 0x90, 0xb0, 0xb, 0x3c, 0x4a, 0x67,
+ 0x19,
+
+ 0x4f, 0x98, 0x92, 0xf9, 0x18, 0x38, 0xf5, 0xb4, 0xf7, 0x2f, 0xa7, 0x21,
+ 0x71, 0x52, 0x27, 0xd0, 0x57, 0x4f, 0x9c, 0x30, 0xe, 0xb2, 0x27, 0xce, 0xd7,
+ 0xb2, 0x9f, 0xc0, 0xf6, 0xc3, 0xb0, 0x7c, 0x40, 0x18, 0x75, 0x4a, 0xde,
+ 0xb0, 0x9f, 0x46, 0x8a, 0x5a, 0xeb, 0x4f, 0xcb, 0x5e, 0x60, 0xf5, 0xca,
+ 0xf4, 0x98, 0xaf, 0x62, 0x9b, 0x7e, 0x10, 0xda, 0xba, 0x2f, 0x47, 0x64,
+ 0xf2, 0xc0, 0x84, 0x19, 0x75, 0xe0, 0xe4, 0xff, 0x20, 0xda, 0x7d, 0xe5, 0xd,
+ 0xc8, 0xf8, 0xe3, 0x83, 0x61, 0x19, 0x17, 0xf1, 0xa9, 0x1b, 0xff, 0x39,
+ 0x79, 0x88, 0x1, 0xfb, 0xe7, 0x23, 0xd2, 0xac, 0xe0, 0x49, 0x12, 0x2a, 0x38,
+ 0xb4, 0x7c, 0xc2, 0x1b, 0x88, 0x5f, 0x68, 0x32, 0x11, 0xd9, 0xfd, 0xdc,
+ 0x65, 0x2, 0xb3, 0x74, 0x2c, 0x13, 0xf2, 0xd8, 0xf1, 0x45, 0xc5, 0xd1, 0xf4,
+ 0xa3, 0x38, 0x81, 0x92};
+const std::vector<uint8_t> EpidMemberTest::kMsg0 = {'m', 's', 'g', '0'};
+const std::vector<uint8_t> EpidMemberTest::kBsn0 = {'b', 's', 'n', '0'};
+const std::vector<uint8_t> EpidMemberTest::kMsg1 = {'m', 's', 'g', '1'};
+const std::vector<uint8_t> EpidMemberTest::kBsn1 = {'b', 's', 'n', '1'};
+const std::vector<uint8_t> EpidMemberTest::kData_0_255 = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
+ 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
+ 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+const GroupPubKey EpidMemberTest::kGrpXKey = {
+#include "epid/common-testhelper/testdata/grp_x/pubkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXMember0PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXSigrevokedMember0PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrpXSigRl = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrpXSigRlSingleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc"
+};
+
+const CompressedPrivKey EpidMemberTest::kGrpXMember9CompressedKey = {
+#include "epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXMember9PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc"
+};
+
+const GroupPubKey EpidMemberTest::kGrpYKey = {
+#include "epid/common-testhelper/testdata/grp_y/pubkey.inc"
+};
+
+const CompressedPrivKey EpidMemberTest::kGrpYMember9CompressedKey = {
+#include "epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc"
+};
+
+const OctStr32 EpidMemberTest::kOctStr32_1 = {0x00, 0x00, 0x00, 0x01};
+
+/// Arbitrary test data were generated based on Intel(R) EPID 2.0 parameters
+const GroupPubKey EpidMemberTest::kEps0GroupPublicKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x07, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+};
+
+const PrivKey EpidMemberTest::kEps0MemberPrivateKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xae, 0x5a, 0x18, 0x8d, 0xc8, 0xa9, 0xe2, 0x5c, 0xdf, 0xef, 0x62,
+ 0x6b, 0x34, 0xdf, 0x0d, 0xf2, 0xf6, 0xcf, 0x6a, 0x4d, 0x68, 0x88,
+ 0xc8, 0x12, 0x08, 0xae, 0xb6, 0x30, 0x54, 0xdf, 0xa7, 0xdc}}},
+ {{{0xec, 0x39, 0x86, 0x7b, 0x5c, 0x5e, 0x28, 0x17, 0x5b, 0xfe, 0x93,
+ 0xa1, 0x31, 0x8a, 0x82, 0x99, 0xb0, 0x84, 0x8c, 0x90, 0xc5, 0x54,
+ 0x2c, 0x6d, 0xff, 0x75, 0xcf, 0x05, 0x6e, 0x2b, 0x6c, 0xf3}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x7a, 0x57, 0x41, 0x5b, 0x85, 0x44, 0x0e, 0x2b, 0xb3, 0xcc, 0xa7,
+ 0x99, 0x6d, 0x19, 0x79, 0x45, 0x04, 0xb8, 0x94, 0x07, 0x47, 0x14,
+ 0xed, 0x8d, 0xf4, 0x1e, 0x7d, 0xa0, 0x17, 0xc5, 0xc4, 0x10} // f
+};
diff --git a/epid/member/tiny/unittests/member-testhelper.h b/epid/member/tiny/unittests/member-testhelper.h
new file mode 100644
index 0000000..b9c38c9
--- /dev/null
+++ b/epid/member/tiny/unittests/member-testhelper.h
@@ -0,0 +1,119 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidMemberTest test fixture.
+ */
+#ifndef EPID_MEMBER_TINY_UNITTESTS_MEMBER_TESTHELPER_H_
+#define EPID_MEMBER_TINY_UNITTESTS_MEMBER_TESTHELPER_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common-testhelper/member_wrapper-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+typedef struct G1ElemStr G1ElemStr;
+typedef struct NativeBasicSignature NativeBasicSignature;
+
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs);
+
+/// compares MembershipCredential values
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs);
+
+/// compares GroupPubKey values
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs);
+
+/// Test fixture class for EpidMember
+class EpidMemberTest : public ::testing::Test {
+ public:
+ /// test data
+ static const GroupPubKey kGroupPublicKey;
+ /// test data
+ static const PrivKey kMemberPrivateKey;
+ /// test data
+ static const std::vector<uint8_t> kGroupPublicKeyDataIkgf;
+ /// test data
+ static const std::vector<uint8_t> kMemberPrivateKeyDataIkgf;
+ /// test data
+ static const MemberPrecomp kMemberPrecomp;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha256;
+ /// test data
+ static const NativeBasicSignature kBasicSig;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha384;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha512;
+ /// test data
+ static const std::vector<uint8_t> kTest1Msg;
+ /// signature based revocation list with 50 entries
+ static std::vector<uint8_t> kSigRlData;
+ /// signature based revocation list with 5 entries
+ static std::vector<uint8_t> kSigRl5EntryData;
+ /// a message
+ static const std::vector<uint8_t> kMsg0;
+ /// a message
+ static const std::vector<uint8_t> kMsg1;
+ /// a basename
+ static const std::vector<uint8_t> kBsn0;
+ /// a basename
+ static const std::vector<uint8_t> kBsn1;
+ /// a data with bytes [0,255]
+ static const std::vector<uint8_t> kData_0_255;
+ /// a group key in group X
+ static const GroupPubKey kGrpXKey;
+ /// a member 0 private key in group X
+ static const PrivKey kGrpXMember0PrivKey;
+ /// a member private key in group X revoked in SigRl
+ static const PrivKey kGrpXSigrevokedMember0PrivKey;
+ /// a SigRl of group X
+ static const std::vector<uint8_t> kGrpXSigRl;
+ /// a SigRl with single entry of group X
+ static const std::vector<uint8_t> kGrpXSigRlSingleEntry;
+ /// a compressed private key in group X
+ static const CompressedPrivKey kGrpXMember9CompressedKey;
+ /// a private key in group X
+ static const PrivKey kGrpXMember9PrivKey;
+
+ /// a group key in group Y
+ static const GroupPubKey kGrpYKey;
+ /// a compressed private key in group Y
+ static const CompressedPrivKey kGrpYMember9CompressedKey;
+
+ /// value "1" represented as an octstr constant
+ static const OctStr32 kOctStr32_1;
+
+ /// EPS specific group public key
+ static const GroupPubKey kEps0GroupPublicKey;
+ /// EPS specific member private key
+ static const PrivKey kEps0MemberPrivateKey;
+
+ /// setup called before each TEST_F starts
+ virtual void SetUp() {}
+ /// teardown called after each TEST_F finishes
+ virtual void TearDown() {}
+};
+
+#endif // EPID_MEMBER_TINY_UNITTESTS_MEMBER_TESTHELPER_H_
diff --git a/epid/member/tiny/unittests/presig-test.cc b/epid/member/tiny/unittests/presig-test.cc
new file mode 100644
index 0000000..4e1f538
--- /dev/null
+++ b/epid/member/tiny/unittests/presig-test.cc
@@ -0,0 +1,117 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief ComputePreSig unit tests.
+ */
+#include <algorithm>
+#include <cstring>
+#include <limits>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+namespace {
+
+///////////////////////////////////////////////////////////////////////
+// EpidAddPreSigs
+TEST_F(EpidMemberTest, DISABLED_AddPreSigsFailsGivenNullPointer) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ EXPECT_EQ(kEpidBadArgErr, EpidAddPreSigs(nullptr, 1));
+}
+
+TEST_F(EpidMemberTest, DISABLED_AddPreSigsFailsGivenHugeNumberOfPreSigs) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ // number_presigs = 0x80..01 of size equal to sizeof(size_t)
+ EXPECT_NE(kEpidNoErr, EpidAddPreSigs(member, (SIZE_MAX >> 1) + 2));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_AddPreSigsComputesSpecifiedNumberOfPresigsIfInputPresigsNull) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 2));
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 1));
+ // request to generate 0 pre-computed signatures do nothing
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 0));
+ EXPECT_EQ((size_t)3, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_AddPreSigsAddsCorrectNumberOfPresigsGivenValidInput) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ const size_t presigs1_added = 2;
+ const size_t presigs2_added = 3;
+
+ // add
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, presigs1_added));
+ // extend
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, presigs2_added));
+ // add empty pre-computed signatures array does not affect internal pool
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 0));
+ EXPECT_EQ(presigs1_added + presigs2_added, EpidGetNumPreSigs(member));
+}
+
+///////////////////////////////////////////////////////////////////////
+// EpidGetNumPreSigs
+TEST_F(EpidMemberTest, DISABLED_GetNumPreSigsReturnsZeroGivenNullptr) {
+ EXPECT_EQ((size_t)0, EpidGetNumPreSigs(nullptr));
+}
+
+TEST_F(EpidMemberTest, DISABLED_NumPreSigsForNewleyCreatedContextIsZero) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ EXPECT_EQ((size_t)0, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, DISABLED_GetNumPreSigsReturnsNumberOfAddedPresigs) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ const size_t presigs_added = 5;
+
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, presigs_added));
+ EXPECT_EQ(presigs_added, EpidGetNumPreSigs(member));
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/provision_compressed-test.cc b/epid/member/tiny/unittests/provision_compressed-test.cc
new file mode 100644
index 0000000..7df36ec
--- /dev/null
+++ b/epid/member/tiny/unittests/provision_compressed-test.cc
@@ -0,0 +1,176 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision compressed unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+namespace {
+
+EpidStatus ProvisionCompressedAndStart(
+ MemberCtx* ctx, GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionCompressed(ctx, pub_key, compressed_privkey, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, DISABLED_ProvisionCompressedFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(nullptr, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, nullptr, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(nullptr, &pub_key, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, nullptr, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_ProvisionCompressedSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionCompressed(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionCompressed(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, DISABLED_ProvisionCompressedFailsForInvalidGroupPubKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGrpXKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, DISABLED_ProvisionCompressedFailsForInvalidPrivateKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kGrpXMember9CompressedKey;
+ priv_key.ax.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ priv_key = this->kGrpXMember9CompressedKey;
+ priv_key.seed.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/provision_credential-test.cc b/epid/member/tiny/unittests/provision_credential-test.cc
new file mode 100644
index 0000000..67167aa
--- /dev/null
+++ b/epid/member/tiny/unittests/provision_credential-test.cc
@@ -0,0 +1,317 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision credential unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+namespace {
+
+EpidStatus ProvisionCredentialAndStart(MemberCtx* ctx,
+ GroupPubKey const* pub_key,
+ MembershipCredential const* credential,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionCredential(ctx, pub_key, credential, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(nullptr, &pub_key, &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, nullptr, &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(nullptr, &pub_key, &credential, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, nullptr, &credential, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsInvalidCredential) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ MembershipCredential base_credential;
+ base_credential.A = this->kGrpXMember9PrivKey.A;
+ base_credential.gid = this->kGrpXMember9PrivKey.gid;
+ base_credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ credential = base_credential;
+ credential.A.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ credential = base_credential;
+ credential.A.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ credential = base_credential;
+ credential.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsInvalidGroupKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsCredentialNotInGroup) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ MembershipCredential base_credential;
+ base_credential.A = this->kGrpXMember9PrivKey.A;
+ base_credential.gid = this->kGrpXMember9PrivKey.gid;
+ base_credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ credential = base_credential;
+ credential.gid.data[0] = ~credential.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingMembershipCredentialPrecomp) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingMembershipCredentialNoPrecomp) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+// test that create succeeds with valid IKGF given parameters
+TEST_F(EpidMemberTest, CanProvisionUsingIKGFMembershipCredentialPrecomp) {
+ Prng prng;
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey* priv_key =
+ reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ FpElemStr f = priv_key->f;
+ MembershipCredential credential;
+ credential.A = priv_key->A;
+ credential.gid = priv_key->gid;
+ credential.x = priv_key->x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, pub_key,
+ &credential, &precomp));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingIKGFMembershipCredentialNoPrecomp) {
+ Prng prng;
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey* priv_key =
+ reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ FpElemStr f = priv_key->f;
+ MembershipCredential credential;
+ credential.A = priv_key->A;
+ credential.gid = priv_key->gid;
+ credential.x = priv_key->x;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ ProvisionCredentialAndStart(member, pub_key, &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_ProvisionCredentialCanStoreMembershipCredentialNoPrecomp) {
+ Prng prng;
+ MembershipCredential const orig_credential =
+ *(MembershipCredential*)&this->kGrpXMember9PrivKey;
+
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &orig_credential, nullptr));
+
+ FAIL() << "todo(developer): implement verification that credentials are "
+ "provisioned";
+ // MembershipCredential credential;
+ // uint32_t nv_index = 0x01c10100;
+ // EXPECT_EQ(kEpidNoErr, EpidNvReadMembershipCredential(
+ // member->tpm2_ctx, nv_index, &pub_key,
+ // &credential));
+ // EXPECT_EQ(orig_credential, credential);
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/provision_key-test.cc b/epid/member/tiny/unittests/provision_key-test.cc
new file mode 100644
index 0000000..c8a692b
--- /dev/null
+++ b/epid/member/tiny/unittests/provision_key-test.cc
@@ -0,0 +1,243 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision key unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+namespace {
+
+EpidStatus ProvisionBulkAndStart(MemberCtx* ctx, GroupPubKey const* pub_key,
+ PrivKey const* priv_key,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionKey(ctx, pub_key, priv_key, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(nullptr, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, nullptr, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(nullptr, &pub_key, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, nullptr, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+}
+
+// test that create succeeds with valid IKGF given parameters
+TEST_F(EpidMemberTest, ProvisionBulkSucceedsGivenValidParametersUsingIKGFData) {
+ Prng prng;
+ const GroupPubKey pub_key = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc"
+ };
+ const PrivKey priv_key = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc"
+ };
+
+ const MemberPrecomp precomp = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc"
+ };
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidGroupPubKey) {
+ Prng prng;
+
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidF) {
+ Prng prng;
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.f = f;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidPrivateKey) {
+ Prng prng;
+
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.A.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.A.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, DISABLED_ProvisionBulkCanStoreMembershipCredential) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &priv_key.f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ FAIL() << "todo(developer): implement verification that credentials are "
+ "provisioned";
+ // uint32_t nv_index = 0x01c10100;
+ // MembershipCredential credential;
+ // MembershipCredential const orig_credential{ priv_key.gid, priv_key.A,
+ // priv_key.x };
+ // EXPECT_EQ(kEpidNoErr, EpidNvReadMembershipCredential(
+ // member->tpm2_ctx, nv_index, &pub_key,
+ // &credential));
+ // EXPECT_EQ(orig_credential, credential);
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/sign-test.cc b/epid/member/tiny/unittests/sign-test.cc
new file mode 100644
index 0000000..542a80d
--- /dev/null
+++ b/epid/member/tiny/unittests/sign-test.cc
@@ -0,0 +1,1082 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Sign unit tests.
+ */
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/tiny/unittests/member-testhelper.h"
+namespace {
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+/////////////////////////////////////////////////////////////////////////
+// Simple error cases
+
+TEST_F(EpidMemberTest, SignFailsGivenNullParameters) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(nullptr, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+ EXPECT_EQ(kEpidBadArgErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), nullptr, sig.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, nullptr, msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+
+TEST_F(EpidMemberTest, SignFailsGivenNonZeroMessageLenWithNullMessage) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, nullptr, msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+
+TEST_F(EpidMemberTest, SignFailsGivenNonZeroBasenameLenWithNullBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+TEST_F(EpidMemberTest, SignFailsGivenWrongSigLen) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+
+ // signature buffer one byte less than needed
+ std::vector<uint8_t> sig_small(EpidGetSigSize(&srl) - 1);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig_small.data(), sig_small.size()));
+
+ // signature buffer is one byte - a less than allowed for EpidSignature
+ std::vector<uint8_t> sig_one(1);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig_one.data(), sig_one.size()));
+}
+
+TEST_F(EpidMemberTest, SignFailsGivenUnregisteredBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& bsn1 = this->kBsn1;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn1.data(), bsn1.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+TEST_F(EpidMemberTest, SignsFailsIfNotProvisioned) {
+ Prng my_prng;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidOutOfSequenceError,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+}
+/////////////////////////////////////////////////////////////////////////
+// Anonymity
+
+TEST_F(EpidMemberTest, SignaturesOfSameMessageAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig1(EpidGetSigSize(nullptr));
+ std::vector<uint8_t> sig2(EpidGetSigSize(nullptr));
+ // without signature based revocation list
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig1.data(), sig1.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig2.data(), sig2.size()));
+ EXPECT_TRUE(sig1.size() == sig2.size() &&
+ 0 != memcmp(sig1.data(), sig2.data(), sig1.size()));
+ // with signature based revocation list
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x01,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b};
+ SigRl* srl1 = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl1_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig3(EpidGetSigSize(srl1));
+ std::vector<uint8_t> sig4(EpidGetSigSize(srl1));
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl1, srl1_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig3.data(), sig3.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig4.data(), sig4.size()));
+ EXPECT_TRUE(sig3.size() == sig4.size() &&
+ 0 != memcmp(sig3.data(), sig4.data(), sig3.size()));
+}
+TEST_F(EpidMemberTest, SignaturesOfSameMessageWithSameBasenameAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ std::vector<uint8_t> sig1(EpidGetSigSize(nullptr));
+ std::vector<uint8_t> sig2(EpidGetSigSize(nullptr));
+ // without signature based revocation list
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig1.data(), sig1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig2.data(), sig2.size()));
+ EXPECT_TRUE(sig1.size() == sig2.size() &&
+ 0 != memcmp(sig1.data(), sig2.data(), sig1.size()));
+
+ // with signature based revocation list
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x01,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b};
+ SigRl* srl1 = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl1_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig3(EpidGetSigSize(srl1));
+ std::vector<uint8_t> sig4(EpidGetSigSize(srl1));
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl1, srl1_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig3.data(), sig3.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig4.data(), sig4.size()));
+ EXPECT_TRUE(sig3.size() == sig4.size() &&
+ 0 != memcmp(sig3.data(), sig4.data(), sig3.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable basename
+
+TEST_F(EpidMemberTest, SignsMessageUsingRandomBaseNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageUsingRandomBaseWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingBasenameNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingBasenameWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithRegisteredBasenamesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithRegisteredBasenamesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithoutRegisteredBasenamesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ SignsUsingRandomBaseWithoutRegisteredBasenamesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+#ifndef TPM_TSS
+TEST_F(EpidMemberTest, SignsMessageUsingHugeBasenameNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024); // exactly 1 MB
+ uint8_t c = 0;
+ for (size_t i = 0; i < bsn.size(); ++i) {
+ bsn[i] = c++;
+ }
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageUsingHugeBasenameWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024); // exactly 1 MB
+ uint8_t c = 0;
+ for (size_t i = 0; i < bsn.size(); ++i) {
+ bsn[i] = c++;
+ }
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t srl_size = this->kGrpXSigRl.size() * sizeof(this->kGrpXSigRl[0]);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+}
+
+TEST_F(EpidMemberTest, SignsMsgUsingBsnContainingAllPossibleBytesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kData_0_255;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+#endif
+
+/////////////////////////////////////////////////////////////////////////
+// Variable sigRL
+
+TEST_F(EpidMemberTest, SignsMessageGivenNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+
+ size_t sig_len = EpidGetSigSize(nullptr);
+ std::vector<uint8_t> newsig(sig_len);
+ EpidSignature* sig = (EpidSignature*)newsig.data();
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageGivenNoSigRlUsingIKGFData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+
+ size_t sig_len = EpidGetSigSize(nullptr);
+ std::vector<uint8_t> newsig(sig_len);
+ // using ikgf keys
+ MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ EpidSignature* sig = (EpidSignature*)newsig.data();
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(grp_public_key);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithNoEntries) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+
+ uint8_t sig_rl_data_n2_zero[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl const* srl = reinterpret_cast<SigRl const*>(sig_rl_data_n2_zero);
+ size_t srl_size = sizeof(sig_rl_data_n2_zero);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithNoEntriesUsingIkgfData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+ // using ikgf keys
+ MemberCtxObj member_ikgf(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ uint8_t sig_rl_data_n2_one_gid0[] = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc"
+ };
+ SigRl* srl_ikgf = reinterpret_cast<SigRl*>(sig_rl_data_n2_one_gid0);
+ size_t srl_size = sizeof(sig_rl_data_n2_one_gid0);
+ std::vector<uint8_t> sig_data_ikgf(EpidGetSigSize(srl_ikgf));
+ EpidSignature* sig_ikgf =
+ reinterpret_cast<EpidSignature*>(sig_data_ikgf.data());
+ size_t sig_len = sig_data_ikgf.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member_ikgf, msg.data(), msg.size(), nullptr,
+ 0, sig_ikgf, sig_len));
+ VerifierCtxObj ctx_ikgf(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx_ikgf, sig_ikgf, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithEntries) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x02,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10,
+ 0xfe, 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60,
+ 0x3e, 0xc0, 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82,
+ 0xc4, 0x49, 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5,
+ 0x77, 0x16, 0x4, 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8,
+ 0x40, 0xbd, 0x69, 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9,
+ 0xdd, 0x97, 0x6c, 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2,
+ 0xca, 0x5, 0x44, 0x9b, 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa,
+ 0xcf, 0xa4, 0x4, 0xe9, 0xf3, 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3,
+ 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37, 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60,
+ 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40, 0x11};
+ SigRl* srl = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithEntriesUsingIKGFData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+ // using ikgf keys
+ MemberCtxObj member_ikgf(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ uint8_t sig_rl_data_n2_one_gid0[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x02,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10,
+ 0xfe, 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60,
+ 0x3e, 0xc0, 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82,
+ 0xc4, 0x49, 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5,
+ 0x77, 0x16, 0x4, 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8,
+ 0x40, 0xbd, 0x69, 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9,
+ 0xdd, 0x97, 0x6c, 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2,
+ 0xca, 0x5, 0x44, 0x9b, 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa,
+ 0xcf, 0xa4, 0x4, 0xe9, 0xf3, 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3,
+ 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37, 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60,
+ 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40, 0x11};
+ SigRl* srl_ikgf = reinterpret_cast<SigRl*>(sig_rl_data_n2_one_gid0);
+ size_t srl_size = sizeof(sig_rl_data_n2_one_gid0);
+ std::vector<uint8_t> sig_data_ikgf(EpidGetSigSize(srl_ikgf));
+ EpidSignature* sig_ikgf =
+ reinterpret_cast<EpidSignature*>(sig_data_ikgf.data());
+ size_t sig_len = sig_data_ikgf.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member_ikgf, msg.data(), msg.size(), nullptr,
+ 0, sig_ikgf, sig_len));
+ VerifierCtxObj ctx_ikgf(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx_ikgf, sig_ikgf, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignMessageReportsIfMemberRevoked) {
+ // note: a complete sig + nr proof should still be returned!!
+ auto& pub_key = this->kGrpXKey;
+ auto& priv_key = this->kGrpXMember0PrivKey;
+ auto& msg = this->kMsg0;
+ Prng my_prng;
+ MemberCtxObj member(pub_key, priv_key, &Prng::Generate, &my_prng);
+ const std::vector<uint8_t> kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc"
+ };
+ auto srl = reinterpret_cast<SigRl const*>(
+ kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry.data());
+ size_t srl_size = kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry.size();
+
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+
+ VerifierCtxObj ctx(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignMessageReportsIfMemberRevokedUsingIKGFData) {
+ // note: a complete sig + nr proof should still be returned!!
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey member_private_key_revoked_by_sig = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc"
+ };
+ Prng my_prng;
+ MemberCtxObj member(grp_public_key, member_private_key_revoked_by_sig,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ const std::vector<uint8_t> sig_Rl = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+ };
+ auto srl = reinterpret_cast<SigRl const*>(sig_Rl.data());
+ size_t srl_size = sig_Rl.size();
+
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+
+ VerifierCtxObj ctx(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable hash alg
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, DISABLED_SignsMessageUsingSha384HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha512HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, DISABLED_SignsMessageUsingSha512256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ kSha512_256, this->kMemberPrecomp, &Prng::Generate,
+ &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable precomputed signatures
+
+TEST_F(EpidMemberTest, DISABLED_SignConsumesPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 3));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, DISABLED_SignConsumesPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 3));
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, DISABLED_SignsMessageWithPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_SignsMessageWithPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithoutPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ // test sign without precomputed signatures
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithoutPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ // test sign without precomputed signatures
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable messages
+
+TEST_F(EpidMemberTest, SignsEmptyMessageNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), 0, bsn.data(), bsn.size(),
+ sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), 0));
+}
+
+TEST_F(EpidMemberTest, SignsEmptyMessageWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), 0, nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), 0));
+}
+
+TEST_F(EpidMemberTest, SignsShortMessageNoSigRl) {
+ // check: 1, 13, 128, 256, 512, 1021, 1024 bytes
+ // 13 and 1021 are primes
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ size_t lengths[] = {1, 13, 128, 256,
+ 512, 1021, 1024}; // have desired lengths to loop over
+ std::vector<uint8_t> msg(
+ lengths[COUNT_OF(lengths) - 1]); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg[n] = (uint8_t)n;
+ }
+ for (auto length : lengths) {
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), length, nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << length << " failed";
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), length))
+ << "EpidVerify for message_len: " << length << " failed";
+ }
+}
+
+TEST_F(EpidMemberTest, SignsShortMessageWithSigRl) {
+ // check: 1, 13, 128, 256, 512, 1021, 1024 bytes
+ // 13 and 1021 are primes
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ size_t message_len = 0;
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ size_t lengths[] = {1, 13, 128, 256,
+ 512, 1021, 1024}; // have desired lengths to loop over
+ std::vector<uint8_t> msg(
+ lengths[COUNT_OF(lengths) - 1]); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ for (auto length : lengths) {
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), length, nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << message_len << " failed";
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), length))
+ << "EpidVerify for message_len: " << message_len << " failed";
+ }
+}
+
+TEST_F(EpidMemberTest, SignsLongMessageNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ std::vector<uint8_t> msg(1000000); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << 1000000 << " failed";
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()))
+ << "EpidVerify for message_len: " << 1000000 << " failed";
+}
+
+TEST_F(EpidMemberTest, SignsLongMessageWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ std::vector<uint8_t> msg(1000000); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << 1000000 << " failed";
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()))
+ << "EpidVerify for message_len: " << 1000000 << " failed";
+}
+
+TEST_F(EpidMemberTest, SignsMsgContainingAllPossibleBytesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ std::vector<uint8_t> msg = this->kData_0_255;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/member/tiny/unittests/utest.parts b/epid/member/tiny/unittests/utest.parts
new file mode 100644
index 0000000..aee3023
--- /dev/null
+++ b/epid/member/tiny/unittests/utest.parts
@@ -0,0 +1,64 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build configuration for unit test of minimal library.
+"""
+Import('*')
+env.PartName('utest')
+
+env.DependsOn([Component(env.subst('${PART_PARENT_NAME}'),
+ requires=REQ.EXISTS|REQ.DEFAULT),
+ Component('gtest'),
+ Component('common-testhelper'),
+ Component('verifier')])
+
+utest_files = Pattern(src_dir='.',
+ includes=['*-test.cc',
+ '*-testhelper.cc'],
+ recursive=True).files()
+
+env.Append(CPPPATH='#')
+
+env['UNIT_TEST_TARGET_NAME'] = "${PART_PARENT_NAME}-${UNIT_TEST_TARGET}"
+
+shlib = []
+
+if 'shared' in env['MODE']:
+ if env['TARGET_OS'] == 'win32':
+ dependent_shlib = env.subst("${{DEPENDS.{0}.SDKBIN}}"
+ .format(env.subst("${PART_PARENT_NAME}")))
+ shlib = env.CCopy("${INSTALL_TEST_BIN}", dependent_shlib)
+ else:
+ dependent_shlib = env.subst("${{DEPENDS.{0}.SDKLIB}}"
+ .format(env.subst("${PART_PARENT_NAME}")))
+ shlib = env.CCopy("${INSTALL_LIB}", dependent_shlib)
+
+
+utest = env.UnitTest('${PART_SHORT_NAME}',
+ utest_files,
+ command_args=[
+ '--gtest_filter=**',
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ #'--gtest_break_on_failure',
+ #'--gtest_catch_exceptions=0',
+ ],
+ data_src=[],
+ make_pdb=(env.isConfigBasedOn('debug')),
+ INSTALL_BIN='${INSTALL_TEST_BIN}'
+ )
+Depends(utest, shlib)
diff --git a/epid/member/tinymember.parts b/epid/member/tinymember.parts
new file mode 100644
index 0000000..9f79f67
--- /dev/null
+++ b/epid/member/tinymember.parts
@@ -0,0 +1,98 @@
+# pylint:disable=I0011,W0401,W0614,C0103,E0602
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""Build configuration for tiny member library.
+"""
+Import('*')
+env.PartName('member')
+
+default_build_mode = 'static'
+
+include_files = Pattern(src_dir='.', includes=['*.h'], recursive=False).files()
+
+src_files = Pattern(
+ src_dir='tiny/src', includes=['*.c'], recursive=False).files()
+
+install_files = Pattern(
+ src_dir='tiny',
+ includes=[
+ '*.h', '*.c', '*-test.cc', '*-testhelper.cc', '*-testhelper.h',
+ '*.parts', 'Makefile'
+ ],
+ excludes=['*/platform_specific*/'],
+ recursive=True)
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(install_files, sub_dir='epid/member/tiny')
+
+else:
+ env.Part(parts_file='tiny/stdlib/tiny_stdlib.parts')
+ env.Part(parts_file='tiny/math/math.parts')
+ env.DependsOn([
+ Component('tinycommon', requires=REQ.HEADERS),
+ Component('member.tiny_stdlib'), Component('member.math')
+ ])
+
+ env.Append(CPPPATH='#')
+
+ if 'use-sigrl-by-reference' in env['MODE']:
+ env.Append(CPPDEFINES=['USE_SIGRL_BY_REFERENCE'])
+ else:
+ max_sigrl_entries = ARGUMENTS.get('MAX_SIGRL_ENTRIES', 0)
+ n2_max = int(max_sigrl_entries)
+ if n2_max:
+ env.Append(CPPDEFINES=['MAX_SIGRL_ENTRIES={0}'.format(n2_max)])
+
+ if 'static' in env['MODE'] and 'shared' in env['MODE']:
+ PrintError("both shared and static build mode specified for '{}'. "
+ .format(env.subst('$PART_SHORT_NAME')))
+ if 'static' not in env['MODE'] and 'shared' not in env['MODE']:
+ PrintMessage(
+ "build mode not specified for '{}'. Defaulting to '{}'"
+ .format(env.subst('$PART_SHORT_NAME'), default_build_mode))
+ env['MODE'].append(default_build_mode)
+
+ if 'shared' in env['MODE']:
+ env.Append(CPPDEFINES=['SHARED'])
+ env.ExportCPPDEFINES(['SHARED'])
+ outputs = env.SharedLibrary('${PART_SHORT_NAME}', src_files)
+ elif 'static' in env['MODE']:
+ outputs = env.Library('${PART_SHORT_NAME}', src_files)
+ else:
+ print env.subst('$PART_SHORT_NAME')
+ PrintError("build mode not specified for '{}'. {}".format(
+ env.subst('$PART_SHORT_NAME'),
+ "Specify either 'shared' or 'static'."))
+
+ sdk_outs = env.Sdk(outputs)
+ env.SdkInclude(include_files, sub_dir='epid/${PART_SHORT_NAME}')
+
+ if 'shared' in env['MODE']:
+ env.InstallTarget(outputs)
+
+ if 'install_lib' in env['MODE']:
+ env.InstallInclude(include_files, sub_dir='epid/${PART_SHORT_NAME}')
+ if 'static' in env['MODE']:
+ env.InstallLib(outputs)
+
+ is_utest_build = False
+ for i in BUILD_TARGETS:
+ if "utest::" in str(i):
+ is_utest_build = True
+ if is_utest_build:
+ env.Part(
+ parts_file='tiny/unittests/utest.parts',
+ CONFIG=DefaultEnvironment().subst('$CONFIG'))
diff --git a/epid/member/tpm2/commit.h b/epid/member/tpm2/commit.h
new file mode 100644
index 0000000..145e50f
--- /dev/null
+++ b/epid/member/tpm2/commit.h
@@ -0,0 +1,72 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// SDK TPM Commit API.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_COMMIT_H_
+#define EPID_MEMBER_TPM2_COMMIT_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct FfElement FfElement;
+typedef struct EcPoint EcPoint;
+/// \endcond
+
+/*!
+\addtogroup Tpm2Module tpm2
+\ingroup EpidMemberModule
+@{
+*/
+
+/// Performs TPM2_Commit TPM operation.
+/*!
+Generates random r and compute K, L and E points.
+
+\param[in] ctx
+The TPM context.
+\param[in] p1
+A point P1 on G1 curve.
+\param[in] s2
+Octet array used to derive x-coordinate of a point P2.
+\param[in] s2_len
+Length of s2 buffer.
+\param[in] y2
+y coordinate of the point associated with s2.
+\param[out] k
+Result of G1.exp(P2, private key f).
+\param[out] l
+Result of G1.exp(P2, random r).
+\param[out] e
+Result of G1.exp(P1, random r).
+\param[out] counter
+A value associated with the random r. Should be initialized with zero.
+
+\returns ::EpidStatus
+
+\see Tpm2CreateContext
+*/
+EpidStatus Tpm2Commit(Tpm2Ctx* ctx, EcPoint const* p1, void const* s2,
+ size_t s2_len, FfElement const* y2, EcPoint* k,
+ EcPoint* l, EcPoint* e, uint16_t* counter);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_COMMIT_H_
diff --git a/epid/member/tpm2/context.h b/epid/member/tpm2/context.h
new file mode 100644
index 0000000..83e9f92
--- /dev/null
+++ b/epid/member/tpm2/context.h
@@ -0,0 +1,123 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// SDK TPM API.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_CONTEXT_H_
+#define EPID_MEMBER_TPM2_CONTEXT_H_
+
+#include "epid/common/bitsupplier.h"
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct FpElemStr FpElemStr;
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct MemberParams MemberParams;
+/// \endcond
+
+/*!
+ \addtogroup Tpm2Module tpm2
+ \ingroup EpidMemberModule
+ @{
+*/
+
+/// Creates a new Tpm context
+/*!
+
+ Must be called to create the TPM context that is used by other TPM
+ APIs.
+
+ You need to use a cryptographically secure random number generator
+ to create a TPM context. The ::BitSupplier is provided as a function
+ prototype for your own implementation of the random number generator.
+
+ ::Tpm2DeleteContext must be called to safely release the TPM context.
+
+ \param[in] params
+ member parameters to initialize rnd_func, rnd_param, ff_elem, ctx.
+
+ \param[in] epid2_params
+ The field and group parameters.
+
+ \param[out] rnd_func
+ random function if exists in MemberParms
+
+ \param[out] rnd_param
+ random parameters if exists in MemberParms
+
+ \param[out] f
+ seed f if exists in MemberParams
+
+ \param[out] ctx
+ Newly constructed TPM context.
+
+ \returns ::EpidStatus
+
+ \see Tpm2DeleteContext
+*/
+EpidStatus Tpm2CreateContext(MemberParams const* params,
+ Epid2Params_ const* epid2_params,
+ BitSupplier* rnd_func, void** rnd_param,
+ const FpElemStr** f, Tpm2Ctx** ctx);
+
+/// Deletes an existing Tpm context.
+/*!
+
+ Must be called to safely release a TPM context created using
+ ::Tpm2CreateContext.
+
+ De-initializes the context, frees memory used by the context, and
+ sets the context pointer to NULL.
+
+ \param[in,out] ctx
+ The TPM context. Can be NULL.
+
+ \see Tpm2CreateContext
+*/
+void Tpm2DeleteContext(Tpm2Ctx** ctx);
+
+/// Sets the hash algorithm to be used by a TPM2.
+/*!
+
+ \param[in] ctx
+ The TPM2 context.
+ \param[in] hash_alg
+ The hash algorithm to use.
+
+ \returns ::EpidStatus
+*/
+EpidStatus Tpm2SetHashAlg(Tpm2Ctx* ctx, HashAlg hash_alg);
+
+/// Reset an existing Tpm context.
+/*!
+
+Must be called to reset a TPM context created using
+::Tpm2CreateContext.
+
+Re-initializes the context, reset memory used for primary key.
+
+\param[in,out] ctx
+The TPM context. Can be NULL.
+
+\see Tpm2CreateContext
+*/
+void Tpm2ResetContext(Tpm2Ctx** ctx);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_CONTEXT_H_
diff --git a/epid/member/tpm2/createprimary.h b/epid/member/tpm2/createprimary.h
new file mode 100644
index 0000000..16bd582
--- /dev/null
+++ b/epid/member/tpm2/createprimary.h
@@ -0,0 +1,39 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM2_CreatePrimary command interface.
+/*! \file */
+#ifndef EPID_MEMBER_TPM2_CREATEPRIMARY_H_
+#define EPID_MEMBER_TPM2_CREATEPRIMARY_H_
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct G1ElemStr G1ElemStr;
+/// \endcond
+
+/// Creates Primary key
+/*!
+
+\param[in,out] ctx
+TPM context.
+\param[out] p_str
+Primary key: g1^f
+\returns ::EpidStatus
+*/
+EpidStatus Tpm2CreatePrimary(Tpm2Ctx* ctx, G1ElemStr* p_str);
+
+#endif // EPID_MEMBER_TPM2_CREATEPRIMARY_H_
diff --git a/epid/member/tpm2/getrandom.h b/epid/member/tpm2/getrandom.h
new file mode 100644
index 0000000..b7f7980
--- /dev/null
+++ b/epid/member/tpm2/getrandom.h
@@ -0,0 +1,57 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+#ifndef EPID_MEMBER_TPM2_GETRANDOM_H_
+#define EPID_MEMBER_TPM2_GETRANDOM_H_
+
+/*!
+ * \file
+ * \brief SDK TPM API.
+ */
+
+#include "epid/common/errors.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+/// \endcond
+
+/*!
+\addtogroup Tpm2Module tpm2
+\ingroup EpidMemberModule
+@{
+*/
+
+/// Get random data
+/*!
+This command returns the next num_bits from the random number generator (RNG).
+
+\param[in,out] ctx
+TPM context.
+
+\param[in] num_bits
+Number of bits to return.
+
+\param[out] random_data
+Output random bits.
+
+\returns ::EpidStatus
+
+\see Tpm2CreateContext
+*/
+EpidStatus Tpm2GetRandom(Tpm2Ctx* ctx, int const num_bits, void* random_data);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_GETRANDOM_H_
diff --git a/epid/member/tpm2/ibm_tss/commit.c b/epid/member/tpm2/ibm_tss/commit.c
new file mode 100644
index 0000000..6e00cdd
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/commit.c
@@ -0,0 +1,147 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Commit implementation.
+/*! \file */
+
+#include "epid/member/tpm2/commit.h"
+#include <tss2/TPM_Types.h>
+#include <tss2/tss.h>
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Bit 7 binary mask
+#define BIT7 0x080
+/// Binary 00011111
+#define BITS0500 0x3f
+
+EpidStatus Tpm2Commit(Tpm2Ctx* ctx, EcPoint const* p1, void const* s2,
+ size_t s2_len, FfElement const* y2, EcPoint* k,
+ EcPoint* l, EcPoint* e, uint16_t* counter) {
+ EpidStatus sts = kEpidErr;
+ TPM_RC rc = TPM_RC_SUCCESS;
+
+ if (!ctx || !ctx->epid2_params || !ctx->key_handle) {
+ return kEpidBadArgErr;
+ }
+
+ if (s2 && s2_len <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ if ((!s2 && y2) || (s2 && !y2)) {
+ return kEpidBadArgErr;
+ }
+
+ if (s2 && (!k || !l)) {
+ return kEpidBadArgErr;
+ }
+
+ if (!e || !counter) {
+ return kEpidBadArgErr;
+ }
+
+ if (s2_len > UINT16_MAX) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ FiniteField* Fq = ctx->epid2_params->Fq;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ Commit_In in = {0};
+ Commit_Out out;
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ unsigned int sessionAttributes0 = 0;
+
+ in.signHandle = ctx->key_handle;
+ if (p1) {
+ G1ElemStr p1_str = {0};
+ sts = WriteEcPoint(G1, p1, &p1_str, sizeof(p1_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadTpm2EcPoint(&p1_str, &in.P1);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ if (s2) {
+ FqElemStr y2_str = {0};
+ sts = WriteFfElement(Fq, y2, &y2_str, sizeof(y2_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadTpm2FfElement(&y2_str.data, &in.y2);
+ BREAK_ON_EPID_ERROR(sts);
+ in.s2.t.size = (UINT16)s2_len;
+ if (0 != memcpy_S(&in.s2.t.buffer, sizeof(in.s2.t.buffer), s2, s2_len)) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ }
+ rc = TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_Commit,
+ sessionHandle0, NULL, sessionAttributes0, TPM_RH_NULL,
+ NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_Commit", rc);
+ // workaround based on Table 2:15 to filter response code format defining
+ // handle, session, or parameter number modifier if bit 7 is 1 error is
+ // RC_FMT1
+ if ((rc & BIT7) != 0) {
+ rc = rc & (BITS0500 | RC_FMT1);
+ if (TPM_RC_ATTRIBUTES == rc || TPM_RC_ECC_POINT == rc ||
+ TPM_RC_HASH == rc || TPM_RC_KEY == rc || TPM_RC_SCHEME == rc ||
+ TPM_RC_SIZE == rc)
+ sts = kEpidBadArgErr;
+ else
+ sts = kEpidErr;
+ } else {
+ if (TPM_RC_NO_RESULT == rc)
+ sts = kEpidBadArgErr;
+ else
+ sts = kEpidErr;
+ }
+ break;
+ }
+ if (out.E.size > 0) {
+ G1ElemStr e_str = {0};
+ sts = WriteTpm2EcPoint(&out.E, &e_str);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &e_str, sizeof(e_str), e);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ if (out.K.size > 0 && k) {
+ G1ElemStr k_str = {0};
+ sts = WriteTpm2EcPoint(&out.K, &k_str);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &k_str, sizeof(k_str), k);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ if (out.L.size > 0 && l) {
+ G1ElemStr l_str = {0};
+ sts = WriteTpm2EcPoint(&out.L, &l_str);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &l_str, sizeof(l_str), l);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ *counter = out.counter;
+ } while (0);
+ return sts;
+}
diff --git a/epid/member/tpm2/ibm_tss/context.c b/epid/member/tpm2/ibm_tss/context.c
new file mode 100644
index 0000000..b0d6421
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/context.c
@@ -0,0 +1,150 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM context implementation.
+/*! \file */
+
+#include "epid/member/tpm2/context.h"
+
+#include <tss2/TPM_Types.h>
+#include <tss2/tss.h>
+
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/getrandom.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+#include "epid/member/tpm_member.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Deletes key from TPM
+/*!
+\param[in,out] ctx
+TPM context.
+
+\returns ::EpidStatus
+*/
+void Tpm2FlushKey(Tpm2Ctx* ctx);
+
+/// Flag that indicates that context was already created
+bool is_context_already_created = false;
+
+/// Internal Random function as a BitSupplier
+static int __STDCALL tpm2_rnd_func(unsigned int* rand_data, int num_bits,
+ void* user_data) {
+ return Tpm2GetRandom((Tpm2Ctx*)user_data, num_bits, rand_data);
+}
+
+EpidStatus Tpm2CreateContext(MemberParams const* params,
+ Epid2Params_ const* epid2_params,
+ BitSupplier* rnd_func, void** rnd_param,
+ const FpElemStr** f, Tpm2Ctx** ctx) {
+ EpidStatus sts = kEpidNoErr;
+ TPM_RC rc = TPM_RC_FAILURE;
+ Tpm2Ctx* tpm_ctx = NULL;
+ FfElement* ff_elem = NULL;
+ if (!params || !epid2_params || !rnd_func || !rnd_param || !f || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ if (is_context_already_created) {
+ return kEpidBadArgErr;
+ }
+ is_context_already_created = true;
+
+ tpm_ctx = SAFE_ALLOC(sizeof(Tpm2Ctx));
+ if (!tpm_ctx) {
+ return kEpidMemAllocErr;
+ }
+
+ do {
+ if (params->f) {
+ FiniteField* Fp = epid2_params->Fp;
+ // Validate f
+ sts = NewFfElement(Fp, &ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, params->f, sizeof(*params->f), ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ tpm_ctx->epid2_params = epid2_params;
+ tpm_ctx->key_handle = 0;
+ tpm_ctx->hash_alg = kInvalidHashAlg;
+
+ rc = TSS_Create(&tpm_ctx->tss);
+ if (rc != TPM_RC_SUCCESS) {
+ sts = kEpidErr;
+ break;
+ }
+
+ *ctx = tpm_ctx;
+ *rnd_func = tpm2_rnd_func;
+ *rnd_param = *ctx;
+ *f = params->f;
+ sts = kEpidNoErr;
+ } while (0);
+ DeleteFfElement(&ff_elem);
+ if (kEpidNoErr != sts) {
+ Tpm2DeleteContext(&tpm_ctx);
+ *ctx = NULL;
+ }
+ return sts;
+}
+
+void Tpm2DeleteContext(Tpm2Ctx** ctx) {
+ is_context_already_created = false;
+ if (ctx && *ctx) {
+ Tpm2FlushKey(*ctx);
+ TSS_Delete((*ctx)->tss);
+ SAFE_FREE(*ctx);
+ }
+}
+
+EpidStatus Tpm2SetHashAlg(Tpm2Ctx* ctx, HashAlg hash_alg) {
+ if (!ctx) return kEpidBadArgErr;
+ if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg &&
+ kSha512_256 != hash_alg)
+ return kEpidHashAlgorithmNotSupported;
+ // can not change hash alg of existing TPM2 key object
+ if (ctx->key_handle) return kEpidOutOfSequenceError;
+ ctx->hash_alg = hash_alg;
+ return kEpidNoErr;
+}
+
+void Tpm2ResetContext(Tpm2Ctx** ctx) {
+ if (ctx && *ctx) {
+ Tpm2FlushKey(*ctx);
+ }
+}
+
+void Tpm2FlushKey(Tpm2Ctx* ctx) {
+ if (ctx->key_handle) {
+ TPM_RC rc;
+ FlushContext_In in;
+ in.flushHandle = ctx->key_handle;
+ rc = TSS_Execute(ctx->tss, NULL, (COMMAND_PARAMETERS*)&in, NULL,
+ TPM_CC_FlushContext, TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_FlushContext", rc);
+ }
+ ctx->key_handle = 0;
+ }
+}
diff --git a/epid/member/tpm2/ibm_tss/conversion.c b/epid/member/tpm2/ibm_tss/conversion.c
new file mode 100644
index 0000000..e453107
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/conversion.c
@@ -0,0 +1,134 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM-SDK data conversion implementation.
+/*! \file */
+
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+#include <string.h>
+#include <tss2/TPM_Types.h>
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+
+TPMI_ALG_HASH EpidtoTpm2HashAlg(HashAlg hash_alg) {
+ switch (hash_alg) {
+ case kSha256:
+ return TPM_ALG_SHA256;
+ case kSha384:
+ return TPM_ALG_SHA384;
+ case kSha512:
+ return TPM_ALG_SHA512;
+ default:
+ return TPM_ALG_NULL;
+ }
+}
+
+HashAlg Tpm2toEpidHashAlg(TPMI_ALG_HASH tpm_hash_alg) {
+ switch (tpm_hash_alg) {
+ case TPM_ALG_SHA256:
+ return kSha256;
+ case TPM_ALG_SHA384:
+ return kSha384;
+ case TPM_ALG_SHA512:
+ return kSha512;
+ default:
+ return kInvalidHashAlg;
+ }
+}
+
+EpidStatus ReadTpm2FfElement(OctStr256 const* str,
+ TPM2B_ECC_PARAMETER* tpm_data) {
+ if (!str || !tpm_data) {
+ return kEpidBadArgErr;
+ }
+ if (0 !=
+ memcpy_S(tpm_data->b.buffer, MAX_ECC_KEY_BYTES, str, sizeof(OctStr256))) {
+ return kEpidBadArgErr;
+ }
+ tpm_data->b.size = (UINT16)sizeof(OctStr256);
+ return kEpidNoErr;
+}
+
+EpidStatus WriteTpm2FfElement(TPM2B_ECC_PARAMETER const* tpm_data,
+ OctStr256* str) {
+ if (!tpm_data || !str || tpm_data->b.size > (UINT16)sizeof(OctStr256)) {
+ return kEpidBadArgErr;
+ }
+ uint8_t* buf = (uint8_t*)str;
+ size_t real_size = sizeof(OctStr256);
+ if (tpm_data->b.size < real_size) {
+ memset(buf, 0x00, real_size - tpm_data->b.size);
+ buf += real_size - tpm_data->b.size;
+ real_size = tpm_data->b.size;
+ }
+ if (0 != memcpy_S(buf, real_size, tpm_data->b.buffer, tpm_data->b.size)) {
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus ReadTpm2EcPoint(G1ElemStr const* p_str, TPM2B_ECC_POINT* tpm_point) {
+ if (!p_str || !tpm_point) {
+ return kEpidBadArgErr;
+ }
+
+ // copy X
+ if (0 != memcpy_S(tpm_point->point.x.t.buffer, MAX_ECC_KEY_BYTES, &p_str->x,
+ sizeof(G1ElemStr) / 2)) {
+ return kEpidErr;
+ }
+ tpm_point->point.x.t.size = sizeof(G1ElemStr) / 2;
+
+ // copy Y
+ if (0 != memcpy_S(tpm_point->point.y.t.buffer, MAX_ECC_KEY_BYTES, &p_str->y,
+ sizeof(G1ElemStr) / 2)) {
+ return kEpidErr;
+ }
+ tpm_point->point.y.t.size = sizeof(G1ElemStr) / 2;
+
+ tpm_point->size = sizeof(tpm_point->point);
+ return kEpidNoErr;
+}
+
+EpidStatus WriteTpm2EcPoint(TPM2B_ECC_POINT const* tpm_point,
+ G1ElemStr* p_str) {
+ if (!p_str || !tpm_point) {
+ return kEpidBadArgErr;
+ }
+
+ if (tpm_point->point.x.t.size > sizeof(G1ElemStr) / 2 ||
+ tpm_point->point.y.t.size > sizeof(G1ElemStr) / 2) {
+ return kEpidBadArgErr;
+ }
+
+ memset(p_str, '\0', sizeof(G1ElemStr));
+
+ // copy X
+ if (0 !=
+ memcpy_S(&p_str->x + (sizeof(G1ElemStr) / 2 - tpm_point->point.x.t.size),
+ tpm_point->point.x.t.size, tpm_point->point.x.t.buffer,
+ tpm_point->point.x.t.size)) {
+ return kEpidErr;
+ }
+ // copy Y
+ if (0 !=
+ memcpy_S(&p_str->y + (sizeof(G1ElemStr) / 2 - tpm_point->point.y.t.size),
+ tpm_point->point.y.t.size, tpm_point->point.y.t.buffer,
+ tpm_point->point.y.t.size)) {
+ return kEpidErr;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tpm2/ibm_tss/conversion.h b/epid/member/tpm2/ibm_tss/conversion.h
new file mode 100644
index 0000000..8e6ba2e
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/conversion.h
@@ -0,0 +1,117 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM-SDK data conversion interface.
+/*! \file */
+#ifndef EPID_MEMBER_TPM2_IBM_TSS_CONVERSION_H_
+#define EPID_MEMBER_TPM2_IBM_TSS_CONVERSION_H_
+
+#include <tss2/TPM_Types.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+#ifndef TPM_ALG_SHA256
+/// TPM code of SHA 256 algorithm
+#define TPM_ALG_SHA256 (TPM_ALG_ID)(0x000B)
+#endif
+#ifndef TPM_ALG_SHA384
+/// TPM code of SHA 384 algorithm
+#define TPM_ALG_SHA384 (TPM_ALG_ID)(0x000C)
+#endif
+#ifndef TPM_ALG_SHA512
+/// TPM code of SHA 512 algorithm
+#define TPM_ALG_SHA512 (TPM_ALG_ID)(0x000D)
+#endif
+#ifndef TPM_ALG_NULL
+/// TPM code of Null algorithm
+#define TPM_ALG_NULL (TPM_ALG_ID)(0x0010)
+#endif
+
+/// \cond
+typedef struct G1ElemStr G1ElemStr;
+/// \endcond
+
+/// Maps HashAlg to TPM type
+/*!
+Maps Intel(R) EPID SDK HashAlg into TPMI_ALG_HASH.
+
+\param[in] hash_alg
+Code of the hash algorithm
+\returns TPMI_ALG_HASH
+*/
+TPMI_ALG_HASH EpidtoTpm2HashAlg(HashAlg hash_alg);
+
+/// Maps TPMI_ALG_HASH to HashAlg
+/*!
+Maps TPM hash code TPMI_ALG_HASH into HashAlg.
+
+\param[in] tpm_hash_alg
+Code of the hash algorithm in TPM
+
+\returns HashAlg
+*/
+HashAlg Tpm2toEpidHashAlg(TPMI_ALG_HASH tpm_hash_alg);
+
+/// Converts serialized FfElement into TPM type
+/*!
+
+\param[in] str
+Serialized Intel(R) EPID SDK FfElement
+\param[out] tpm_data
+tpm type data.
+\returns ::EpidStatus
+*/
+EpidStatus ReadTpm2FfElement(OctStr256 const* str,
+ TPM2B_ECC_PARAMETER* tpm_data);
+
+/// Converts TPM finite field element types into serialized FfElement
+/*!
+
+\param[in] tpm_data
+The TPM finite field data, typically TPM2B_DIGEST or
+TPM2B_ECC_PARAMETER.
+\param[out] str
+The target buffer.
+
+\returns ::EpidStatus
+*/
+EpidStatus WriteTpm2FfElement(TPM2B_ECC_PARAMETER const* tpm_data,
+ OctStr256* str);
+
+/// Converts ECPoint string to TMP ECPoint structure.
+/*!
+
+ \param[in] p_str
+ The serialized EcPoint to convert.
+ \param[out] tpm_point
+ The TPM EC point representation.
+
+ \returns ::EpidStatus
+*/
+EpidStatus ReadTpm2EcPoint(G1ElemStr const* p_str, TPM2B_ECC_POINT* tpm_point);
+
+/// Serializes TMP ECPoint to ECPoint string.
+/*!
+
+ \param[in] tpm_point
+ The TPM EC point to convert.
+ \param[in] p_str
+ The target string.
+
+\returns ::EpidStatus
+*/
+EpidStatus WriteTpm2EcPoint(TPM2B_ECC_POINT const* tpm_point, G1ElemStr* p_str);
+
+#endif // EPID_MEMBER_TPM2_IBM_TSS_CONVERSION_H_
diff --git a/epid/member/tpm2/ibm_tss/createprimary.c b/epid/member/tpm2/ibm_tss/createprimary.c
new file mode 100644
index 0000000..dc52b1f
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/createprimary.c
@@ -0,0 +1,100 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \brief TPM2_CreatePrimary command implementation.
+ * \file
+ */
+#include "epid/member/tpm2/createprimary.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+#include "tss2/TPM_Types.h"
+#include "tss2/tss.h"
+
+EpidStatus Tpm2CreatePrimary(Tpm2Ctx* ctx, G1ElemStr* p_str) {
+ if (!ctx || !ctx->epid2_params || !p_str) {
+ return kEpidBadArgErr;
+ }
+ CreatePrimary_In in = {0};
+ CreatePrimary_Out out;
+ TPM_RC rc = TPM_RC_SUCCESS;
+ TPMI_ALG_PUBLIC algPublic = TPM_ALG_ECC;
+ TPMI_ECC_CURVE curveID = TPM_ECC_BN_P256;
+ TPMI_ALG_HASH halg = TPM_ALG_NULL;
+ TPMI_ALG_HASH nalg = TPM_ALG_NULL;
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ TPM2B_ECC_POINT public_area;
+ unsigned int sessionAttributes0 = 0;
+ const char* parentPasswordPtr = NULL;
+
+ in.primaryHandle = TPM_RH_ENDORSEMENT;
+ halg = EpidtoTpm2HashAlg(ctx->hash_alg);
+ if (halg == TPM_ALG_NULL) {
+ return kEpidHashAlgorithmNotSupported;
+ }
+ nalg = halg;
+ /* Table 185 - TPM2B_PUBLIC inPublic */
+ /* Table 184 - TPMT_PUBLIC in.inPublic.publicArea */
+ in.inPublic.publicArea.type = algPublic;
+ in.inPublic.publicArea.nameAlg = nalg;
+
+ /* Table 32 - TPMA_OBJECT objectAttributes */
+ in.inPublic.publicArea.objectAttributes.val |= TPMA_OBJECT_NODA;
+ in.inPublic.publicArea.objectAttributes.val |= TPMA_OBJECT_FIXEDTPM;
+ in.inPublic.publicArea.objectAttributes.val |= TPMA_OBJECT_FIXEDPARENT;
+ in.inPublic.publicArea.objectAttributes.val |=
+ TPMA_OBJECT_SENSITIVEDATAORIGIN;
+ in.inPublic.publicArea.parameters.eccDetail.symmetric.algorithm =
+ TPM_ALG_NULL;
+ in.inPublic.publicArea.parameters.eccDetail.scheme.scheme = TPM_ALG_ECDAA;
+ in.inPublic.publicArea.parameters.eccDetail.scheme.details.ecdaa.hashAlg =
+ halg;
+ in.inPublic.publicArea.parameters.eccDetail.scheme.details.ecdaa.count = 1;
+ in.inPublic.publicArea.parameters.eccDetail.curveID = curveID;
+ in.inPublic.publicArea.parameters.eccDetail.kdf.scheme = TPM_ALG_NULL;
+ in.inSensitive.sensitive.userAuth.t.size = 0;
+ in.inSensitive.sensitive.data.t.size = 0;
+ in.inPublic.publicArea.objectAttributes.val |=
+ TPMA_OBJECT_SENSITIVEDATAORIGIN;
+ in.inPublic.publicArea.objectAttributes.val |= TPMA_OBJECT_USERWITHAUTH;
+ in.inPublic.publicArea.objectAttributes.val &= ~TPMA_OBJECT_ADMINWITHPOLICY;
+ in.inPublic.publicArea.objectAttributes.val |= TPMA_OBJECT_SIGN;
+ in.inPublic.publicArea.objectAttributes.val &= ~TPMA_OBJECT_DECRYPT;
+ in.inPublic.publicArea.objectAttributes.val &= ~TPMA_OBJECT_RESTRICTED;
+ in.inPublic.publicArea.unique.ecc.y.t.size = 0;
+ in.inPublic.publicArea.unique.ecc.x.t.size = 0;
+ in.inPublic.publicArea.authPolicy.t.size = 0;
+ in.inPublic.publicArea.unique.rsa.t.size = 0;
+ in.outsideInfo.t.size = 0;
+ in.creationPCR.count = 0;
+ rc = TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_CreatePrimary,
+ sessionHandle0, parentPasswordPtr, sessionAttributes0,
+ TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_CreatePrimary", rc);
+ if (TPM_RC_ATTRIBUTES == rc || TPM_RC_KDF == rc || TPM_RC_SYMMETRIC == rc ||
+ TPM_RC_TYPE == rc || TPM_RC_SCHEME == rc || TPM_RC_SIZE == rc ||
+ TPM_RC_KEY == rc)
+ return kEpidBadArgErr;
+ return kEpidErr;
+ }
+ ctx->key_handle = out.objectHandle;
+ public_area.point = out.outPublic.publicArea.unique.ecc;
+ return WriteTpm2EcPoint(&public_area, p_str);
+}
diff --git a/epid/member/tpm2/ibm_tss/getrandom.c b/epid/member/tpm2/ibm_tss/getrandom.c
new file mode 100644
index 0000000..1487750
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/getrandom.c
@@ -0,0 +1,78 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TPM2_GetRandom command implementation.
+ */
+#include <limits.h>
+
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/getrandom.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+
+#include "tss2/TPM_Types.h"
+#include "tss2/tss.h"
+
+EpidStatus Tpm2GetRandom(Tpm2Ctx* ctx, int const num_bits, void* random_data) {
+ EpidStatus sts = kEpidNoErr;
+ TPM_RC rc = TPM_RC_FAILURE;
+ int num_bytes = (num_bits + CHAR_BIT - 1) / CHAR_BIT;
+ BYTE* buf = (BYTE*)random_data;
+
+ if (!ctx || !random_data) {
+ return kEpidBadArgErr;
+ }
+
+ if (num_bits <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ GetRandom_In in;
+ GetRandom_Out out;
+ size_t max_digest_size = sizeof(((TPM2B_DIGEST*)0)->t.buffer);
+ UINT16 bytes_to_reqest = ((size_t)num_bytes > max_digest_size)
+ ? (UINT16)max_digest_size
+ : (UINT16)num_bytes;
+ in.bytesRequested = bytes_to_reqest;
+
+ rc = TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_GetRandom,
+ TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_GetRandom", rc);
+ sts = kEpidErr;
+ break;
+ }
+ if (!out.randomBytes.t.size || out.randomBytes.t.size > bytes_to_reqest) {
+ sts = kEpidErr;
+ break;
+ }
+
+ if (0 != memcpy_S(buf, (size_t)num_bytes, out.randomBytes.t.buffer,
+ out.randomBytes.t.size)) {
+ sts = kEpidErr;
+ break;
+ }
+
+ num_bytes -= out.randomBytes.t.size;
+ buf += out.randomBytes.t.size;
+ } while (num_bytes > 0);
+
+ return sts;
+}
diff --git a/epid/member/tpm2/ibm_tss/load_external.c b/epid/member/tpm2/ibm_tss/load_external.c
new file mode 100644
index 0000000..dd0c67a
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/load_external.c
@@ -0,0 +1,137 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TPM2_LoadExternal command implementation.
+ */
+
+#include "epid/member/tpm2/load_external.h"
+
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+#include "tss2/TPM_Types.h"
+#include "tss2/tss.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus Tpm2LoadExternal(Tpm2Ctx* ctx, FpElemStr const* f_str) {
+ EpidStatus sts = kEpidErr;
+ TPM_RC rc = TPM_RC_SUCCESS;
+ EcPoint* pub = NULL;
+ FfElement* f = NULL;
+ TPMI_ALG_HASH tpm_hash_alg = TPM_ALG_NULL;
+
+ if (!ctx || !ctx->epid2_params || !f_str) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ LoadExternal_In in = {0};
+ LoadExternal_Out out;
+ G1ElemStr pub_str = {0};
+ TPMS_ECC_PARMS* ecc_details = &in.inPublic.publicArea.parameters.eccDetail;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ EcPoint* g1 = ctx->epid2_params->g1;
+
+ sts = NewFfElement(ctx->epid2_params->Fp, &f);
+ BREAK_ON_EPID_ERROR(sts);
+ // verify that f is valid
+ sts = ReadFfElement(ctx->epid2_params->Fp, f_str, sizeof(*f_str), f);
+ BREAK_ON_EPID_ERROR(sts);
+ if (ctx->key_handle) {
+ FlushContext_In in_fc;
+ in_fc.flushHandle = ctx->key_handle;
+ TSS_Execute(ctx->tss, NULL, (COMMAND_PARAMETERS*)&in_fc, NULL,
+ TPM_CC_FlushContext, TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_FlushContext", rc);
+ }
+ ctx->key_handle = 0;
+ }
+
+ sts = NewEcPoint(G1, &pub);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = EcExp(G1, g1, (BigNumStr const*)f_str, pub);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteEcPoint(G1, pub, &pub_str, sizeof(pub_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ tpm_hash_alg = EpidtoTpm2HashAlg(ctx->hash_alg);
+ if (tpm_hash_alg == TPM_ALG_NULL) {
+ sts = kEpidHashAlgorithmNotSupported;
+ break;
+ }
+
+ in.hierarchy = TPM_RH_NULL;
+ in.inPublic.size = sizeof(TPM2B_PUBLIC);
+ in.inPublic.publicArea.type = TPM_ALG_ECC;
+ in.inPublic.publicArea.nameAlg = tpm_hash_alg;
+ in.inPublic.publicArea.objectAttributes.val =
+ TPMA_OBJECT_NODA | TPMA_OBJECT_USERWITHAUTH | TPMA_OBJECT_SIGN;
+ in.inPublic.publicArea.authPolicy.t.size = 0;
+
+ ecc_details->symmetric.algorithm = TPM_ALG_NULL;
+ ecc_details->scheme.scheme = TPM_ALG_ECDAA;
+ ecc_details->scheme.details.ecdaa.hashAlg = tpm_hash_alg;
+ ecc_details->scheme.details.ecdaa.count = 0;
+ ecc_details->curveID = TPM_ECC_BN_P256;
+ ecc_details->kdf.scheme = TPM_ALG_NULL;
+
+ sts = ReadTpm2FfElement(&pub_str.x.data,
+ &in.inPublic.publicArea.unique.ecc.x);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadTpm2FfElement(&pub_str.y.data,
+ &in.inPublic.publicArea.unique.ecc.y);
+ BREAK_ON_EPID_ERROR(sts);
+
+ in.inPrivate.t.size = sizeof(in.inPrivate.t.sensitiveArea);
+ in.inPrivate.t.sensitiveArea.sensitiveType = TPM_ALG_ECC;
+ sts = ReadTpm2FfElement(&f_str->data,
+ &in.inPrivate.t.sensitiveArea.sensitive.ecc);
+ BREAK_ON_EPID_ERROR(sts);
+
+ rc = TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_LoadExternal,
+ TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_LoadExternal", rc);
+ if (TPM_RC_BINDING == rc || TPM_RC_ECC_POINT == rc ||
+ TPM_RC_KEY_SIZE == rc)
+ sts = kEpidBadArgErr;
+ else
+ sts = kEpidErr;
+ break;
+ }
+
+ ctx->key_handle = out.objectHandle;
+ } while (0);
+
+ DeleteEcPoint(&pub);
+ DeleteFfElement(&f);
+
+ return sts;
+}
diff --git a/epid/member/tpm2/ibm_tss/nv.c b/epid/member/tpm2/ibm_tss/nv.c
new file mode 100644
index 0000000..15a9254
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/nv.c
@@ -0,0 +1,166 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TSS NV API implementation.
+ */
+
+#include "epid/member/tpm2/nv.h"
+#include <tss2/tss.h>
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+
+EpidStatus Tpm2NvUndefineSpace(Tpm2Ctx* ctx, uint32_t nv_index) {
+ TPM_RC rc = 0;
+ NV_UndefineSpace_In in;
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if ((nv_index >> 24) != TPM_HT_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+
+ in.authHandle = TPM_RH_OWNER;
+ // the NV Index to remove from NV space
+ in.nvIndex = nv_index;
+ rc = TSS_Execute(ctx->tss, NULL, (COMMAND_PARAMETERS*)&in, NULL,
+ TPM_CC_NV_UndefineSpace, sessionHandle0, NULL, 0,
+ TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_NV_UndefineSpace", rc);
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvDefineSpace(Tpm2Ctx* ctx, uint32_t nv_index, size_t size) {
+ TPM_RC rc = 0;
+ NV_DefineSpace_In in = {0};
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ if (!ctx || size == 0 || size > MAX_NV_BUFFER_SIZE) {
+ return kEpidBadArgErr;
+ }
+ if ((nv_index >> 24) != TPM_HT_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+
+ in.authHandle = TPM_RH_OWNER;
+ // the handle of the data area
+ in.publicInfo.nvPublic.nvIndex = nv_index;
+ // hash algorithm used to compute the name of the Index and used for the
+ // authPolicy
+ in.publicInfo.nvPublic.nameAlg = TPM_ALG_SHA256;
+ in.publicInfo.nvPublic.attributes.val = TPMA_NVA_NO_DA | TPMA_NVA_AUTHWRITE |
+ TPMA_NVA_AUTHREAD | TPMA_NVA_ORDINARY;
+ // the size of the data area
+ in.publicInfo.nvPublic.dataSize = (uint16_t)size;
+ rc = TSS_Execute(ctx->tss, NULL, (COMMAND_PARAMETERS*)&in, NULL,
+ TPM_CC_NV_DefineSpace, sessionHandle0, NULL, 0, TPM_RH_NULL,
+ NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_NV_DefineSpace", rc);
+ if (rc == TPM_RC_NV_DEFINED) {
+ return kEpidDuplicateErr;
+ }
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvRead(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void* data) {
+ TPM_RC rc = 0;
+ NV_Read_In in;
+ NV_Read_Out out;
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ int done = FALSE;
+ // bytes read so far
+ uint16_t bytes_read_so_far = 0;
+
+ if (!ctx || !data || size == 0 || size > MAX_NV_BUFFER_SIZE) {
+ return kEpidBadArgErr;
+ }
+ if ((nv_index >> 24) != TPM_HT_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+
+ if ((nv_index >> 24) != TPM_HT_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+ // Authorization handle
+ in.authHandle = nv_index;
+ in.nvIndex = nv_index;
+ in.offset = offset;
+ while ((rc == TPM_RC_SUCCESS) && !done) {
+ in.offset = offset + bytes_read_so_far;
+ if ((uint32_t)(size - bytes_read_so_far) < MAX_NV_BUFFER_SIZE) {
+ // last chunk
+ in.size = (uint16_t)size - bytes_read_so_far;
+ } else {
+ // next chunk
+ in.size = MAX_NV_BUFFER_SIZE;
+ }
+ rc = TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_NV_Read,
+ sessionHandle0, NULL, 0, TPM_RH_NULL, NULL, 0);
+ if (rc == TPM_RC_SUCCESS) {
+ // copy the results to the read buffer
+ memcpy_S((uint8_t*)data + bytes_read_so_far, size - bytes_read_so_far,
+ out.data.b.buffer, out.data.b.size);
+ bytes_read_so_far += out.data.b.size;
+ if (bytes_read_so_far == size) {
+ done = TRUE;
+ }
+ } else {
+ print_tpm2_response_code("TPM2_NV_Read", rc);
+ }
+ }
+ if (rc != TPM_RC_SUCCESS) {
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvWrite(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void const* data) {
+ TPM_RC rc = TPM_RC_SUCCESS;
+ NV_Write_In in = {0};
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ if (!ctx || !data || size == 0 || size > MAX_NV_BUFFER_SIZE) {
+ return kEpidBadArgErr;
+ }
+ if ((nv_index >> 24) != TPM_HT_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+
+ in.authHandle = nv_index;
+ in.data.b.size = (uint16_t)size;
+ memcpy(in.data.b.buffer, data, size);
+ in.nvIndex = nv_index;
+ // beginning offset
+ in.offset = offset;
+ rc = TSS_Execute(ctx->tss, NULL, (COMMAND_PARAMETERS*)&in, NULL,
+ TPM_CC_NV_Write, sessionHandle0, NULL, 0, TPM_RH_NULL, NULL,
+ 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_NV_Write", rc);
+ return kEpidBadArgErr;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tpm2/ibm_tss/printtss.c b/epid/member/tpm2/ibm_tss/printtss.c
new file mode 100644
index 0000000..90ae9af
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/printtss.c
@@ -0,0 +1,37 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM context implementation.
+/*! \file */
+#ifndef EPID_ENABLE_DEBUG_PRINT
+#define EPID_ENABLE_DEBUG_PRINT
+#endif
+
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include <tss2/TPM_Types.h>
+#include <tss2/tss.h>
+#include <tss2/tssresponsecode.h>
+
+void print_tpm2_response_code(char const* operation, TPM_RC rc) {
+ const char* msg;
+ const char* submsg;
+ const char* num;
+ TSS_ResponseCode_toString(&msg, &submsg, &num, rc);
+ printf("%s: %s%s%s\n", operation, msg, submsg, num);
+}
+
+#ifdef EPID_ENABLE_DEBUG_PRINT
+#undef EPID_ENABLE_DEBUG_PRINT
+#endif
diff --git a/epid/member/tpm2/ibm_tss/printtss.h b/epid/member/tpm2/ibm_tss/printtss.h
new file mode 100644
index 0000000..83269a2
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/printtss.h
@@ -0,0 +1,36 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM log error prints
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_IBM_TSS_PRINTTSS_H_
+#define EPID_MEMBER_TPM2_IBM_TSS_PRINTTSS_H_
+
+#if !defined(EPID_ENABLE_DEBUG_PRINT)
+/// Do not print tpm2 response error if EPID_ENABLE_DEBUG_PRINT is undefined
+#define print_tpm2_response_code(...)
+#else
+#include <tss2/TPM_Types.h>
+#include <tss2/tss.h>
+/// Print TPM 2.0 response code as human readable message
+/*!
+ * \param[in] operation The operation that returned the code
+ * \param[in] rc The response code
+ */
+void print_tpm2_response_code(char const* operation, TPM_RC rc);
+#endif
+
+#endif // EPID_MEMBER_TPM2_IBM_TSS_PRINTTSS_H_
diff --git a/epid/member/tpm2/ibm_tss/sign.c b/epid/member/tpm2/ibm_tss/sign.c
new file mode 100644
index 0000000..fb6eb39
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/sign.c
@@ -0,0 +1,155 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Sign implementation.
+/*! \file */
+
+#include "epid/member/tpm2/sign.h"
+#include <stddef.h>
+#include <string.h>
+#include <tss2/tss.h>
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/tpm2/getrandom.h"
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+#include "epid/member/tpm2/ibm_tss/printtss.h"
+#include "epid/member/tpm2/ibm_tss/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Bit 7 binary mask
+#define BIT7 0x080
+/// Binary 00011111
+#define BITS0500 0x3f
+
+EpidStatus Tpm2Sign(Tpm2Ctx* ctx, void const* digest, size_t digest_len,
+ uint16_t counter, FfElement* k, FfElement* s) {
+ EpidStatus sts = kEpidErr;
+ TPM_RC rc = TPM_RC_SUCCESS;
+
+ if (!ctx || !ctx->epid2_params || !digest || !s) {
+ return kEpidBadArgErr;
+ }
+ if (0 == digest_len || EpidGetHashSize(ctx->hash_alg) != digest_len) {
+ return kEpidBadArgErr;
+ }
+ if (ctx->key_handle == 0) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ unsigned int sessionAttributes0 = 0;
+ Sign_In in = {0};
+ Sign_Out out;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ FpElemStr k_str;
+ FpElemStr s_str;
+ in.keyHandle = ctx->key_handle;
+ if (0 != memcpy_S(in.digest.t.buffer, sizeof(in.digest.t.buffer), digest,
+ digest_len)) {
+ sts = kEpidErr;
+ break;
+ }
+ in.digest.t.size = (uint16_t)digest_len;
+ in.inScheme.scheme = TPM_ALG_ECDAA;
+ in.inScheme.details.ecdaa.hashAlg = EpidtoTpm2HashAlg(ctx->hash_alg);
+ in.inScheme.details.ecdaa.count = counter;
+ /* proof that digest was created by the TPM (NULL ticket) */
+ /* Table 91 - Definition of TPMT_TK_HASHCHECK Structure */
+ in.validation.tag = TPM_ST_HASHCHECK;
+ in.validation.hierarchy = TPM_RH_NULL;
+ in.validation.digest.t.size = 0;
+ rc =
+ TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_Sign, sessionHandle0,
+ NULL, sessionAttributes0, TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS) {
+ print_tpm2_response_code("TPM2_Sign", rc);
+ // workaround based on Table 2:15 to filter response code format defining
+ // handle, session, or parameter number modifier if bit 7 is 1 error is
+ // RC_FMT1
+ if ((rc & BIT7) != 0) {
+ rc = rc & (BITS0500 | RC_FMT1);
+ if (TPM_RC_VALUE == rc) {
+ sts = kEpidBadArgErr;
+ }
+ } else {
+ sts = kEpidErr;
+ }
+ break;
+ }
+
+ if (k) {
+ sts = WriteTpm2FfElement(&out.signature.signature.ecdaa.signatureR,
+ (OctStr256*)&k_str);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &k_str, sizeof(k_str), k);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ sts = WriteTpm2FfElement(&out.signature.signature.ecdaa.signatureS,
+ (OctStr256*)&s_str);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &s_str, sizeof(s_str), s);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ return sts;
+}
+
+EpidStatus Tpm2ReleaseCounter(Tpm2Ctx* ctx, uint16_t counter) {
+ EpidStatus sts = kEpidErr;
+
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ TPM_RC rc = TPM_RC_SUCCESS;
+ TPMI_SH_AUTH_SESSION sessionHandle0 = TPM_RS_PW;
+ unsigned int sessionAttributes0 = 0;
+ Sign_In in = {0};
+ Sign_Out out;
+ in.keyHandle = ctx->key_handle;
+
+ in.digest.t.size = (uint16_t)EpidGetHashSize(ctx->hash_alg);
+ memset(in.digest.t.buffer, 0x1, (size_t)in.digest.t.size);
+ in.inScheme.scheme = TPM_ALG_ECDAA;
+ in.inScheme.details.ecdaa.hashAlg = EpidtoTpm2HashAlg(ctx->hash_alg);
+ in.inScheme.details.ecdaa.count = counter;
+ in.validation.tag = TPM_ST_HASHCHECK;
+ in.validation.hierarchy = TPM_RH_NULL;
+ in.validation.digest.t.size = 0;
+ rc =
+ TSS_Execute(ctx->tss, (RESPONSE_PARAMETERS*)&out,
+ (COMMAND_PARAMETERS*)&in, NULL, TPM_CC_Sign, sessionHandle0,
+ NULL, sessionAttributes0, TPM_RH_NULL, NULL, 0);
+ if (rc != TPM_RC_SUCCESS && (rc & (BITS0500 | RC_FMT1)) != TPM_RC_VALUE) {
+ print_tpm2_response_code("Tpm2ReleaseCounter: TPM2_Sign", rc);
+ sts = kEpidErr;
+ break;
+ }
+ sts = kEpidNoErr;
+ } while (0);
+
+ return sts;
+}
diff --git a/epid/member/tpm2/ibm_tss/state.h b/epid/member/tpm2/ibm_tss/state.h
new file mode 100644
index 0000000..5f570bb
--- /dev/null
+++ b/epid/member/tpm2/ibm_tss/state.h
@@ -0,0 +1,39 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM internal state.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_IBM_TSS_STATE_H_
+#define EPID_MEMBER_TPM2_IBM_TSS_STATE_H_
+
+#include "epid/common/types.h"
+#include "tss2/TPM_Types.h"
+
+/// \cond
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct FfElement FfElement;
+typedef struct TSS_CONTEXT TSS_CONTEXT;
+/// \endcond
+
+/// TPM TSS context definition
+typedef struct Tpm2Ctx {
+ TSS_CONTEXT* tss; ///< TSS context
+ Epid2Params_ const* epid2_params; ///< Intel(R) EPID 2.0 params
+ TPM_HANDLE key_handle; ///< Handle to f value of private key
+ HashAlg hash_alg; ///< Hash algorithm to use
+} Tpm2Ctx;
+
+#endif // EPID_MEMBER_TPM2_IBM_TSS_STATE_H_
diff --git a/epid/member/tpm2/load_external.h b/epid/member/tpm2/load_external.h
new file mode 100644
index 0000000..64e8199
--- /dev/null
+++ b/epid/member/tpm2/load_external.h
@@ -0,0 +1,54 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// SDK TPM API.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_LOAD_EXTERNAL_H_
+#define EPID_MEMBER_TPM2_LOAD_EXTERNAL_H_
+
+#include "epid/common/errors.h"
+#include "epid/common/types.h" // HashAlg
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct FpElemStr FpElemStr;
+/// \endcond
+
+/*!
+ \addtogroup Tpm2Module tpm2
+ \ingroup EpidMemberModule
+ @{
+*/
+
+/// Invokes TPM2_LoadExternal command
+/*!
+ This command is used to load an object that is not a Protected Object into the
+ TPM. The command allows loading of a public area or both a public and sensitive
+ area.
+
+ \param[in,out] ctx
+ TPM context.
+
+ \param[in] f_str
+ The f value of the member private key.
+
+ \returns ::EpidStatus
+*/
+EpidStatus Tpm2LoadExternal(Tpm2Ctx* ctx, FpElemStr const* f_str);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_LOAD_EXTERNAL_H_
diff --git a/epid/member/tpm2/nv.h b/epid/member/tpm2/nv.h
new file mode 100644
index 0000000..4b70fdb
--- /dev/null
+++ b/epid/member/tpm2/nv.h
@@ -0,0 +1,110 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// SDK TPM non volatile memory API.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_NV_H_
+#define EPID_MEMBER_TPM2_NV_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+/// \endcond
+
+/*!
+ \addtogroup Tpm2Module tpm2
+ \ingroup EpidMemberModule
+ @{
+*/
+
+/// Performs TPM2_NV_DefineSpace TPM command.
+/*!
+ \param[in] ctx
+ The TPM context.
+ \param[in] nv_index
+ Handle of the data area.
+ \param[in] size
+ Size of the data area.
+
+ \returns ::EpidStatus
+
+ \see Tpm2NvRead
+ \see Tpm2NvWrite
+*/
+EpidStatus Tpm2NvDefineSpace(Tpm2Ctx* ctx, uint32_t nv_index, size_t size);
+
+/// Performs TPM2_NV_UndefineSpace TPM command.
+/*!
+ \param[in] ctx
+ The TPM context.
+ \param[in] nv_index
+ Handle of the data area to undefine.
+
+ \returns ::EpidStatus
+
+ \see Tpm2NvDefineSpace
+*/
+EpidStatus Tpm2NvUndefineSpace(Tpm2Ctx* ctx, uint32_t nv_index);
+
+/// Performs TPM2_NV_Write TPM command.
+/*!
+ An area in NV memory must be defined prior writing.
+
+ \param[in] ctx
+ The TPM context.
+ \param[in] nv_index
+ NV Index to be write.
+ \param[in] size
+ Number of bytes to write.
+ \param[in] offset
+ Offset into the area.
+ \param[in] data
+ Data to write.
+
+ \returns ::EpidStatus
+
+ \see Tpm2NvDefineSpace
+*/
+EpidStatus Tpm2NvWrite(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void const* data);
+
+/// Performs TPM2_NV_Read TPM command.
+/*!
+ \param[in] ctx
+ The TPM context.
+ \param[in] nv_index
+ NV Index to be read.
+ \param[in] size
+ Number of bytes to read.
+ \param[in] offset
+ Offset into the area.
+ \param[out] data
+ Data read.
+
+ \returns ::EpidStatus
+
+ \see Tpm2NvWrite
+*/
+EpidStatus Tpm2NvRead(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void* data);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_NV_H_
diff --git a/epid/member/tpm2/sign.h b/epid/member/tpm2/sign.h
new file mode 100644
index 0000000..ddbc2ce
--- /dev/null
+++ b/epid/member/tpm2/sign.h
@@ -0,0 +1,85 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// SDK TPM Sign API.
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_SIGN_H_
+#define EPID_MEMBER_TPM2_SIGN_H_
+
+#include <stddef.h>
+
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+
+/// \cond
+typedef struct Tpm2Ctx Tpm2Ctx;
+typedef struct FfElement FfElement;
+/// \endcond
+
+/*!
+\addtogroup Tpm2Module tpm2
+\ingroup EpidMemberModule
+@{
+*/
+
+/// Performs TPM2_Sign TPM command.
+/*!
+Calculate a pair (k, s) an ECDAA signature.
+
+Private key f must exist in the TPM context.
+
+\param[in] ctx
+The TPM context.
+\param[in] digest
+Digest to be signed.
+\param[in] digest_len
+The size of digest in bytes.
+\param[in] counter
+A value associated with the random r generated during TPM2_Commit.
+\param[out] k
+The ECDAA signature k value. Nonce produced by the TPM during signing.
+\param[out] s
+The ECDAA signature s value.
+
+\returns ::EpidStatus
+
+\see Tpm2CreateContext
+\see Tpm2Commit
+*/
+EpidStatus Tpm2Sign(Tpm2Ctx* ctx, void const* digest, size_t digest_len,
+ uint16_t counter, FfElement* k, FfElement* s);
+
+/// Erases random r value assosiated with counter.
+/*!
+
+\param[in] ctx
+The TPM context.
+\param[in] counter
+To be released value associated with the random r generated during TPM2_Commit.
+
+\note
+This function should be used if Tpm2Sign wasn't called after Tpm2Commit
+which created counter.
+
+\returns ::EpidStatus
+
+\see Tpm2Commit
+*/
+EpidStatus Tpm2ReleaseCounter(Tpm2Ctx* ctx, uint16_t counter);
+
+/*! @} */
+
+#endif // EPID_MEMBER_TPM2_SIGN_H_
diff --git a/epid/member/tpm2/src/commit.c b/epid/member/tpm2/src/commit.c
new file mode 100644
index 0000000..5715082
--- /dev/null
+++ b/epid/member/tpm2/src/commit.c
@@ -0,0 +1,188 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Commit implementation.
+/*! \file */
+
+#include "epid/member/tpm2/commit.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+static EpidStatus InsertR(Tpm2Ctx* ctx, FfElement* r, uint16_t* counter) {
+ uint16_t index = 0;
+ if (!ctx || !r || !counter) {
+ return kEpidBadArgErr;
+ }
+ for (index = 0; index < MAX_COMMIT_COUNT; ++index) {
+ if (!ctx->commit_data[index]) {
+ ctx->commit_data[index] = r;
+ break;
+ }
+ }
+ if (index == MAX_COMMIT_COUNT) {
+ return kEpidMemAllocErr;
+ }
+ *counter = index + 1; // counter == 0 should be invalid
+ return kEpidNoErr;
+}
+
+static void DeleteR(Tpm2Ctx* ctx, uint16_t* counter) {
+ if (counter && *counter != 0 && *counter <= MAX_COMMIT_COUNT) {
+ DeleteFfElement(&ctx->commit_data[*counter - 1]);
+ *counter = 0;
+ }
+}
+
+EpidStatus Tpm2Commit(Tpm2Ctx* ctx, EcPoint const* p1, void const* s2,
+ size_t s2_len, FfElement const* y2, EcPoint* k,
+ EcPoint* l, EcPoint* e, uint16_t* counter) {
+ EpidStatus sts = kEpidErr;
+ FiniteField* Fp = NULL;
+ FiniteField* Fq = NULL;
+ EcGroup* G1 = NULL;
+ FfElement* x2 = NULL;
+ FfElement* r = NULL;
+ EcPoint* point = NULL;
+ EcPoint* infinity = NULL;
+ uint16_t ctr = 0;
+
+ if (!ctx || !ctx->epid2_params || !ctx->f) {
+ return kEpidBadArgErr;
+ }
+
+ if (s2 && s2_len <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ if ((!s2 && y2) || (s2 && !y2)) {
+ return kEpidBadArgErr;
+ }
+
+ if (s2 && (!k || !l)) {
+ return kEpidBadArgErr;
+ }
+
+ if (!e || !counter) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ G1ElemStr point_str = {0};
+ BigNumStr r_str = {0};
+ const BigNumStr kOne = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ bool is_equal = false;
+ Fp = ctx->epid2_params->Fp;
+ Fq = ctx->epid2_params->Fq;
+ G1 = ctx->epid2_params->G1;
+
+ sts = NewEcPoint(G1, &infinity);
+ BREAK_ON_EPID_ERROR(sts);
+ // step b
+ if (s2) {
+ // step c: compute x2 := HnameAlg(s2) mod p
+ sts = NewFfElement(Fq, &x2);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfHash(Fq, s2, s2_len, ctx->hash_alg, x2);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // step d: if (x2, y2) is not a point on the curve of signHandle, return
+ // TPM_RC_ECC_POINT
+ sts = NewEcPoint(G1, &point);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fq, x2, &point_str.x, sizeof(point_str.x));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fq, y2, &point_str.y, sizeof(point_str.y));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadEcPoint(G1, &point_str, sizeof(point_str), point);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ // step e: if p1 is not an Empty Point and p1 is not a point on the curve of
+ // signHandle, return TPM_RC_ECC_POINT
+ // This step is guranteed by ReadEcPoint SDK function
+
+ // step g: generate or derive r (see C.2.2)
+ // step h: set r = r mod n
+ sts = NewFfElement(Fp, &r);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, r);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = InsertR(ctx, r, &ctr);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, r, &r_str, sizeof(r_str));
+ BREAK_ON_EPID_ERROR(sts);
+ // step i: if s2 is not an Empty Buffer, set K = [ds](x2, y2) and L =
+ // [r](x2, y2)
+ if (s2) {
+ BigNumStr f_str = {0};
+ do {
+ sts = WriteFfElement(Fp, ctx->f, &f_str, sizeof(f_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcExp(G1, point, &f_str, k);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ EpidZeroMemory(&f_str, sizeof(f_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcExp(G1, point, &r_str, l);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = EcIsEqual(G1, k, infinity, &is_equal);
+ BREAK_ON_EPID_ERROR(sts);
+ if (is_equal) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts = EcIsEqual(G1, l, infinity, &is_equal);
+ BREAK_ON_EPID_ERROR(sts);
+ if (is_equal) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ }
+ // step j: if p1 is not an Empty Point, set E = [r](p1 )
+ if (p1) {
+ sts = EcExp(G1, p1, &r_str, e);
+ BREAK_ON_EPID_ERROR(sts);
+ } else {
+ // step k: if p1 is an Empty Point and s2 is an Empty Buffer, set E = [r]G
+ sts = EcExp(G1, ctx->epid2_params->g1, &r_str, e);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ sts = EcIsEqual(G1, e, infinity, &is_equal);
+ BREAK_ON_EPID_ERROR(sts);
+ if (is_equal) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ *counter = ctr;
+ } while (0);
+
+ if (sts != kEpidNoErr) {
+ DeleteR(ctx, &ctr);
+ }
+ DeleteEcPoint(&infinity);
+ DeleteEcPoint(&point);
+ DeleteFfElement(&x2);
+ return sts;
+}
diff --git a/epid/member/tpm2/src/context.c b/epid/member/tpm2/src/context.c
new file mode 100644
index 0000000..e6121a0
--- /dev/null
+++ b/epid/member/tpm2/src/context.c
@@ -0,0 +1,119 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM context implementation.
+/*! \file */
+
+#include <stddef.h>
+
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/software_member.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus Tpm2CreateContext(MemberParams const* params,
+ Epid2Params_ const* epid2_params,
+ BitSupplier* rnd_func, void** rnd_param,
+ const FpElemStr** f, Tpm2Ctx** ctx) {
+ Tpm2Ctx* tpm_ctx = NULL;
+ EpidStatus sts = kEpidNoErr;
+ FfElement* ff_elem = NULL;
+
+ if (!params || !epid2_params || !rnd_func || !rnd_param || !f || !ctx) {
+ return kEpidBadArgErr;
+ }
+
+ tpm_ctx = SAFE_ALLOC(sizeof(Tpm2Ctx));
+ if (!tpm_ctx) {
+ return kEpidMemAllocErr;
+ }
+
+ do {
+ int i;
+
+ if (params->f) {
+ FiniteField* Fp = epid2_params->Fp;
+ // Validate f
+ sts = NewFfElement(Fp, &ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, params->f, sizeof(*params->f), ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ tpm_ctx->epid2_params = epid2_params;
+ tpm_ctx->rnd_func = params->rnd_func;
+ tpm_ctx->rnd_param = params->rnd_param;
+ tpm_ctx->f = NULL;
+ *rnd_func = params->rnd_func;
+ *rnd_param = params->rnd_param;
+ *f = params->f;
+
+ for (i = 0; i < MAX_NV_NUMBER; ++i) {
+ tpm_ctx->nv->nv_index = 0;
+ tpm_ctx->nv->data = NULL;
+ tpm_ctx->nv->data_size = 0;
+ }
+
+ memset(tpm_ctx->commit_data, 0, sizeof(tpm_ctx->commit_data));
+
+ *ctx = tpm_ctx;
+ sts = kEpidNoErr;
+ } while (0);
+ DeleteFfElement(&ff_elem);
+ if (kEpidNoErr != sts) {
+ Tpm2DeleteContext(&tpm_ctx);
+ *ctx = NULL;
+ }
+ return sts;
+}
+
+void Tpm2DeleteContext(Tpm2Ctx** ctx) {
+ if (ctx && *ctx) {
+ int i;
+ (*ctx)->rnd_param = NULL;
+ DeleteFfElement(&(*ctx)->f);
+ for (i = 0; i < MAX_COMMIT_COUNT; ++i) {
+ DeleteFfElement(&(*ctx)->commit_data[i]);
+ }
+ for (i = 0; i < MAX_NV_NUMBER; ++i) {
+ (*ctx)->nv->nv_index = 0;
+ SAFE_FREE((*ctx)->nv->data);
+ (*ctx)->nv->data_size = 0;
+ }
+ SAFE_FREE(*ctx);
+ }
+}
+
+EpidStatus Tpm2SetHashAlg(Tpm2Ctx* ctx, HashAlg hash_alg) {
+ if (!ctx) return kEpidBadArgErr;
+ if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg &&
+ kSha512_256 != hash_alg)
+ return kEpidHashAlgorithmNotSupported;
+ ctx->hash_alg = hash_alg;
+ return kEpidNoErr;
+}
+
+void Tpm2ResetContext(Tpm2Ctx** ctx) {
+ if (ctx && *ctx) {
+ DeleteFfElement(&(*ctx)->f);
+ }
+}
diff --git a/epid/member/tpm2/src/createprimary.c b/epid/member/tpm2/src/createprimary.c
new file mode 100644
index 0000000..6a893cb
--- /dev/null
+++ b/epid/member/tpm2/src/createprimary.c
@@ -0,0 +1,58 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \brief TPM2_CreatePrimary command implementation.
+ * \file
+ */
+#include "epid/member/tpm2/createprimary.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/member/software_member.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus Tpm2CreatePrimary(Tpm2Ctx* ctx, G1ElemStr* p_str) {
+ EpidStatus sts = kEpidErr;
+ FfElement* ff_elem;
+ FpElemStr ff_elem_str;
+ if (!ctx || !ctx->epid2_params) {
+ return kEpidBadArgErr;
+ }
+ (void)p_str;
+ do {
+ const BigNumStr kOne = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ sts = NewFfElement(Fp, &ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfGetRandom(Fp, &kOne, ctx->rnd_func, ctx->rnd_param, ff_elem);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = WriteFfElement(Fp, ff_elem, &ff_elem_str, sizeof(ff_elem_str));
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+ DeleteFfElement(&ff_elem);
+ if (kEpidNoErr == sts) {
+ sts = Tpm2LoadExternal(ctx, &ff_elem_str);
+ }
+ return sts;
+}
diff --git a/epid/member/tpm2/src/getrandom.c b/epid/member/tpm2/src/getrandom.c
new file mode 100644
index 0000000..1ded2cf
--- /dev/null
+++ b/epid/member/tpm2/src/getrandom.c
@@ -0,0 +1,43 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TPM2_GetRandom command implementation.
+ */
+
+#include "epid/member/tpm2/getrandom.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/src/state.h"
+
+EpidStatus Tpm2GetRandom(Tpm2Ctx* ctx, int const num_bits, void* random_data) {
+ int rand_ret = -1;
+
+ if (!ctx || !random_data) {
+ return kEpidBadArgErr;
+ }
+
+ if (num_bits <= 0) {
+ return kEpidBadArgErr;
+ }
+
+ rand_ret = ctx->rnd_func(random_data, num_bits, ctx->rnd_param);
+ if (rand_ret != 0) {
+ return kEpidErr;
+ }
+
+ return kEpidNoErr;
+}
diff --git a/epid/member/tpm2/src/load_external.c b/epid/member/tpm2/src/load_external.c
new file mode 100644
index 0000000..e294eae
--- /dev/null
+++ b/epid/member/tpm2/src/load_external.c
@@ -0,0 +1,54 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TPM2_LoadExternal command implementation.
+ */
+
+#include "epid/member/tpm2/load_external.h"
+
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+EpidStatus Tpm2LoadExternal(Tpm2Ctx* ctx, FpElemStr const* f_str) {
+ EpidStatus sts = kEpidErr;
+ if (!ctx || !ctx->epid2_params || !f_str) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ FiniteField* Fp = ctx->epid2_params->Fp;
+
+ if (ctx->f) {
+ DeleteFfElement(&ctx->f);
+ }
+
+ sts = NewFfElement(Fp, &ctx->f);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, f_str, sizeof(*f_str), ctx->f);
+ BREAK_ON_EPID_ERROR(sts);
+ } while (0);
+
+ return sts;
+}
diff --git a/epid/member/tpm2/src/nv.c b/epid/member/tpm2/src/nv.c
new file mode 100644
index 0000000..4d1e122
--- /dev/null
+++ b/epid/member/tpm2/src/nv.c
@@ -0,0 +1,134 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief TPM NV API implementation.
+ */
+
+#include "epid/member/tpm2/nv.h"
+
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Find nv_index in nv array
+int EpidFindNvIndex(Tpm2Ctx* ctx, uint32_t nv_index) {
+ int i;
+ for (i = 0; i < MAX_NV_NUMBER; ++i) {
+ if (ctx->nv[i].nv_index == nv_index) return i;
+ }
+ return -1;
+}
+
+/// Find empty node in nv array
+int EpidFindFirstEmptyNvIndex(Tpm2Ctx* ctx) {
+ int i;
+ for (i = 0; i < MAX_NV_NUMBER; ++i) {
+ if (!ctx->nv[i].data_size) return i;
+ }
+ return -1;
+}
+
+EpidStatus Tpm2NvDefineSpace(Tpm2Ctx* ctx, uint32_t nv_index, size_t size) {
+ int index = 0;
+ if (!ctx || size <= 0) {
+ return kEpidBadArgErr;
+ }
+ if (nv_index < MIN_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+ if (EpidFindNvIndex(ctx, nv_index) != -1) {
+ return kEpidDuplicateErr;
+ }
+ index = EpidFindFirstEmptyNvIndex(ctx);
+ if (index == -1) {
+ return kEpidBadArgErr;
+ }
+ ctx->nv[index].nv_index = nv_index;
+ // memory will be allocated on first NvWrite call
+ ctx->nv[index].data_size = size;
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvUndefineSpace(Tpm2Ctx* ctx, uint32_t nv_index) {
+ int index = 0;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (nv_index < MIN_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+ index = EpidFindNvIndex(ctx, nv_index);
+ if (index == -1) {
+ return kEpidBadArgErr;
+ }
+ ctx->nv[index].nv_index = 0;
+ SAFE_FREE(ctx->nv[index].data);
+ ctx->nv[index].data_size = 0;
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvRead(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void* data) {
+ uint8_t* buf = NULL;
+ int index = 0;
+ if (!ctx || !data || size <= 0) {
+ return kEpidBadArgErr;
+ }
+ if (nv_index < MIN_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+ index = EpidFindNvIndex(ctx, nv_index);
+ if (index == -1 || !ctx->nv[index].data) {
+ return kEpidBadArgErr;
+ }
+ if (offset + size > ctx->nv[index].data_size) {
+ return kEpidBadArgErr;
+ }
+ buf = (uint8_t*)ctx->nv[index].data + offset;
+ if (0 != memcpy_S(data, size, buf, size)) {
+ return kEpidErr;
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus Tpm2NvWrite(Tpm2Ctx* ctx, uint32_t nv_index, size_t size,
+ uint16_t offset, void const* data) {
+ uint8_t* buf = NULL;
+ int index = 0;
+ if (!ctx || !data || size <= 0) {
+ return kEpidBadArgErr;
+ }
+ if (nv_index < MIN_NV_INDEX) {
+ return kEpidBadArgErr;
+ }
+ index = EpidFindNvIndex(ctx, nv_index);
+ if (index == -1) {
+ return kEpidBadArgErr;
+ }
+ if (offset + size > ctx->nv[index].data_size) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->nv[index].data) {
+ ctx->nv[index].data = SAFE_ALLOC(ctx->nv[index].data_size);
+ if (!ctx->nv[index].data) return kEpidMemAllocErr;
+ }
+ buf = (uint8_t*)ctx->nv[index].data + offset;
+ if (0 != memcpy_S(buf, size, data, size)) {
+ return kEpidErr;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/member/tpm2/src/sign.c b/epid/member/tpm2/src/sign.c
new file mode 100644
index 0000000..9d2ad6b
--- /dev/null
+++ b/epid/member/tpm2/src/sign.c
@@ -0,0 +1,127 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Sign implementation.
+/*! \file */
+
+#include "epid/member/tpm2/sign.h"
+
+#include <string.h>
+
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/types.h"
+#include "epid/member/tpm2/src/state.h"
+
+/// Handle Intel(R) EPID Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+static EpidStatus GetCommitNonce(Tpm2Ctx* ctx, uint16_t counter,
+ FfElement** r) {
+ if (!ctx || counter == 0 || !r) {
+ return kEpidBadArgErr;
+ }
+ if (counter >= MAX_COMMIT_COUNT) {
+ return kEpidBadArgErr;
+ }
+ *r = ctx->commit_data[counter - 1];
+ return kEpidNoErr;
+}
+
+static void ClearCommitNonce(Tpm2Ctx* ctx, uint16_t counter) {
+ if (ctx && counter > 0 && counter < MAX_COMMIT_COUNT) {
+ DeleteFfElement(&ctx->commit_data[counter - 1]);
+ }
+}
+
+EpidStatus Tpm2Sign(Tpm2Ctx* ctx, void const* digest, size_t digest_len,
+ uint16_t counter, FfElement* k, FfElement* s) {
+ EpidStatus sts = kEpidErr;
+ FfElement* t = NULL;
+ BigNum* digest_bn = NULL;
+ FfElement* commit_nonce = NULL;
+
+ if (!ctx || !digest || !s || !ctx->epid2_params) {
+ return kEpidBadArgErr;
+ }
+ if (0 == digest_len || EpidGetHashSize(ctx->hash_alg) != digest_len) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->f) {
+ return kEpidBadArgErr;
+ }
+
+ do {
+ FpElemStr tmp_str;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ const FpElemStr zero = {0};
+
+ sts = GetCommitNonce(ctx, counter, &commit_nonce);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = NewBigNum(digest_len, &digest_bn);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &t);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // a. set T = digest (mod p)
+ sts = ReadBigNum(digest, digest_len, digest_bn);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = InitFfElementFromBn(Fp, digest_bn, t);
+ BREAK_ON_EPID_ERROR(sts);
+ // b. compute integer s = (r + T*f)(mod p)
+ sts = FfMul(Fp, ctx->f, t, s);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfAdd(Fp, commit_nonce, s, s);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // d. if s = 0, output failure (negligible probability)
+ sts = WriteFfElement(Fp, s, &tmp_str, sizeof(tmp_str));
+ BREAK_ON_EPID_ERROR(sts);
+ if (0 == memcmp(&zero, &tmp_str, sizeof(tmp_str))) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+
+ if (k) {
+ // k = T
+ sts = WriteFfElement(Fp, t, &tmp_str, sizeof(tmp_str));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &tmp_str, sizeof(tmp_str), k);
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ ClearCommitNonce(ctx, counter);
+ sts = kEpidNoErr;
+ } while (0);
+
+ DeleteFfElement(&t);
+ DeleteBigNum(&digest_bn);
+
+ return sts;
+}
+
+EpidStatus Tpm2ReleaseCounter(Tpm2Ctx* ctx, uint16_t counter) {
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+
+ ClearCommitNonce(ctx, counter);
+ return kEpidNoErr;
+}
diff --git a/epid/member/tpm2/src/state.h b/epid/member/tpm2/src/state.h
new file mode 100644
index 0000000..660019a
--- /dev/null
+++ b/epid/member/tpm2/src/state.h
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM internal state
+/*! \file */
+
+#ifndef EPID_MEMBER_TPM2_SRC_STATE_H_
+#define EPID_MEMBER_TPM2_SRC_STATE_H_
+
+#include <stddef.h>
+#include "epid/common/bitsupplier.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h" // HashAlg
+
+/// \cond
+typedef struct Epid2Params_ Epid2Params_;
+typedef struct FfElement FfElement;
+/// \endcond
+
+/// Maximum NV index
+#define MAX_NV_NUMBER 10
+/// Minimal possible NV index in TPM
+#define MIN_NV_INDEX 0x01000000
+/// Maximum number of Tpm2Commit random values that can exist in memory
+/// simultaneously
+#define MAX_COMMIT_COUNT 100
+
+#if (MAX_COMMIT_COUNT >= UINT16_MAX)
+#error "MAX_COMMIT_COUNT maximum commit count is restricted by uint16_t"
+#endif
+
+/// One NV entry
+typedef struct NvEntry {
+ uint32_t nv_index;
+ void* data;
+ size_t data_size;
+} NvEntry;
+
+/// TPM State
+typedef struct Tpm2Ctx {
+ Epid2Params_ const* epid2_params; ///< Intel(R) EPID 2.0 params
+ FfElement* f; ///< Member private key f value
+ BitSupplier rnd_func; ///< Pseudo random number generation function
+ void* rnd_param; ///< Pointer to user context for rnd_func
+ HashAlg hash_alg; ///< Hash algorithm to use
+ FfElement* commit_data[MAX_COMMIT_COUNT]; ///< Tpm2Commit random value
+ ///< corresponding to counter
+ NvEntry nv[MAX_NV_NUMBER]; ///< NV memory
+} Tpm2Ctx;
+
+#endif // EPID_MEMBER_TPM2_SRC_STATE_H_
diff --git a/epid/member/tpm2/unittests/commit-simulator-test.cc b/epid/member/tpm2/unittests/commit-simulator-test.cc
new file mode 100644
index 0000000..c576427
--- /dev/null
+++ b/epid/member/tpm2/unittests/commit-simulator-test.cc
@@ -0,0 +1,292 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Commit unit tests.
+/*! \file */
+
+#include <cstring>
+
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/epid2params.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/sign.h"
+#include "epid/member/tpm2/src/state.h"
+}
+
+namespace {
+
+TEST_F(EpidTpm2Test, CommitComputeKLESha256) {
+ // Testing step i and j of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+ EcPointObj p1_exp_r(&params.G1), p2_exp_r(&params.G1);
+ G1ElemStr p1_exp_r_str, p2_exp_r_str;
+ EcPointObj p2(&params.G1, this->kP2Sha256Str);
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p1, (BigNumStr const*)&r_str, p1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p1_exp_r, &p1_exp_r_str, sizeof(p1_exp_r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p2, (BigNumStr const*)&r_str, p2_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p2_exp_r, &p2_exp_r_str, sizeof(p2_exp_r_str)));
+
+ G1ElemStr k_str, l_str, e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, k, &k_str, sizeof(k_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, l, &l_str, sizeof(l_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(this->kP2Sha256ExpF, k_str);
+ EXPECT_EQ(p2_exp_r_str, l_str);
+ EXPECT_EQ(p1_exp_r_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitComputeKLESha384) {
+ // Testing step i and j of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha384Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha384));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha384.data(), this->kS2Sha384.size(),
+ y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ EcPointObj p1_exp_r(&params.G1), p2_exp_r(&params.G1);
+ G1ElemStr p1_exp_r_str, p2_exp_r_str;
+ EcPointObj p2(&params.G1, this->kP2Sha384Str);
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p1, (BigNumStr const*)&r_str, p1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p1_exp_r, &p1_exp_r_str, sizeof(p1_exp_r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p2, (BigNumStr const*)&r_str, p2_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p2_exp_r, &p2_exp_r_str, sizeof(p2_exp_r_str)));
+
+ G1ElemStr k_str, l_str, e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, k, &k_str, sizeof(k_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, l, &l_str, sizeof(l_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(this->kP2Sha384ExpF, k_str);
+ EXPECT_EQ(p2_exp_r_str, l_str);
+ EXPECT_EQ(p1_exp_r_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitComputeKLESha512) {
+ // Testing step i and j of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha512Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha512));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha512.data(), this->kS2Sha512.size(),
+ y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ EcPointObj p1_exp_r(&params.G1), p2_exp_r(&params.G1);
+ G1ElemStr p1_exp_r_str, p2_exp_r_str;
+ EcPointObj p2(&params.G1, this->kP2Sha512Str);
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p1, (BigNumStr const*)&r_str, p1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p1_exp_r, &p1_exp_r_str, sizeof(p1_exp_r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p2, (BigNumStr const*)&r_str, p2_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p2_exp_r, &p2_exp_r_str, sizeof(p2_exp_r_str)));
+
+ G1ElemStr k_str, l_str, e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, k, &k_str, sizeof(k_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, l, &l_str, sizeof(l_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(this->kP2Sha512ExpF, k_str);
+ EXPECT_EQ(p2_exp_r_str, l_str);
+ EXPECT_EQ(p1_exp_r_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitComputeKLESha512256) {
+ // Testing step i and j of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha512256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha512_256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha512256.data(),
+ this->kS2Sha512256.size(), y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ EcPointObj p1_exp_r(&params.G1), p2_exp_r(&params.G1);
+ G1ElemStr p1_exp_r_str, p2_exp_r_str;
+ EcPointObj p2(&params.G1, this->kP2Sha512256Str);
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p1, (BigNumStr const*)&r_str, p1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p1_exp_r, &p1_exp_r_str, sizeof(p1_exp_r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p2, (BigNumStr const*)&r_str, p2_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p2_exp_r, &p2_exp_r_str, sizeof(p2_exp_r_str)));
+
+ G1ElemStr k_str, l_str, e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, k, &k_str, sizeof(k_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, l, &l_str, sizeof(l_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(this->kP2Sha512256ExpF, k_str);
+ EXPECT_EQ(p2_exp_r_str, l_str);
+ EXPECT_EQ(p1_exp_r_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitComputeEOnly) {
+ // Testing step j excuding i of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha512Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha512));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p1, nullptr, 0, nullptr, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ EcPointObj p1_exp_r(&params.G1);
+ G1ElemStr p1_exp_r_str;
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, p1, (BigNumStr const*)&r_str, p1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, p1_exp_r, &p1_exp_r_str, sizeof(p1_exp_r_str)));
+
+ G1ElemStr e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(p1_exp_r_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitComputeEOnlyWithDefaultP1) {
+ // Testing step k excuding i of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha512Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha512));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, nullptr,
+ nullptr, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ EcPointObj g1(&params.G1, this->kg1Str);
+ EcPointObj g1_exp_r(&params.G1);
+ G1ElemStr g1_exp_r_str;
+ Prng the_same_prng;
+ FfElementObj r(&params.fp);
+ BigNumStr zero = {0};
+ FpElemStr r_str = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r));
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(EcExp(params.G1, g1, (BigNumStr const*)&r_str, g1_exp_r));
+ THROW_ON_EPIDERR(
+ WriteEcPoint(params.G1, g1_exp_r, &g1_exp_r_str, sizeof(g1_exp_r_str)));
+
+ G1ElemStr e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(g1_exp_r_str, e_str);
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/commit-test.cc b/epid/member/tpm2/unittests/commit-test.cc
new file mode 100644
index 0000000..dca23f3
--- /dev/null
+++ b/epid/member/tpm2/unittests/commit-test.cc
@@ -0,0 +1,321 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Commit unit tests.
+/*! \file */
+
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/endian_convert.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/sign.h"
+}
+
+namespace {
+
+TEST_F(EpidTpm2Test, CommitFailsGivenNullParameters) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(nullptr, p1, this->kS2Sha256.data(),
+ this->kS2Sha256.size(), y2, k, l, e, &counter));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2Commit(tpm, p1, nullptr, this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+ // Testing step a of the "C.2.3 Tpm2Commit()"
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ nullptr, k, l, e, &counter));
+ // Testing step a of the "C.2.3 Tpm2Commit()"
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, nullptr, l, e, &counter));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, nullptr, e, &counter));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, nullptr, &counter));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, nullptr));
+}
+
+TEST_F(EpidTpm2Test, CommitFailsGivenInvalidLength) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidBadArgErr, Tpm2Commit(tpm, p1, this->kS2Sha256.data(), 0, y2,
+ k, l, e, &counter));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), sizeof(uint16_t) - 1,
+ y2, k, l, e, &counter));
+}
+
+TEST_F(EpidTpm2Test, CommitFailsGivenPrivateKeyDoesNotExists) {
+ // Testing step d of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, NULL, epid2params);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+}
+
+TEST_F(EpidTpm2Test, CommitFailsGivenS2y2NotOnCurve) {
+ // Testing step d of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ EcPointObj p1(&params.G1, this->kP1Str);
+ FqElemStr invalid_kY2Sha256Str = this->kY2Sha256Str;
+ invalid_kY2Sha256Str.data.data[31]++; // make point not belong to the group
+ FfElementObj invalid_y2(&params.fq, invalid_kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, p1, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ invalid_y2, k, l, e, &counter));
+}
+
+TEST_F(EpidTpm2Test, CommitFailsIfResultIsAtInfinity) {
+ // Testing step l of the "C.2.3 Tpm2Commit()"
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ G1ElemStr infinity_str = {0};
+ EcPointObj infinity(&params.G1, infinity_str);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Commit(tpm, infinity, this->kS2Sha256.data(),
+ this->kS2Sha256.size(), y2, k, l, e, &counter));
+}
+
+TEST_F(EpidTpm2Test, CommitCanUseKeyLoadedByLoadExternal) {
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ Epid20Params params;
+ FpElemStr f_str = this->kMemberFValue;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ uint16_t counter = 0;
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, nullptr, this->kS2Sha256.data(),
+ this->kS2Sha256.size(), y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ // k = (x2, y2) ^ f, where x2 = Hash(s2)
+ G1ElemStr k_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, k, &k_str, sizeof(k_str)));
+ EXPECT_EQ(this->kP2Sha256ExpF, k_str);
+}
+
+TEST_F(EpidTpm2Test, CommitReturnsSameLEForSameP1P2) {
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ Epid20Params params;
+ FpElemStr f_str = this->kMemberFValue;
+ // create TPM context
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ // load f value
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ // commit(P1=p2, P2=p2) => k = p2^f, l = p2^r, e = p2^r
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ EcPointObj p2(&params.G1, kP2Sha256Str);
+ EcPointObj p2_exp_f(&params.G1, kP2Sha256ExpF);
+
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ uint16_t counter = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p2, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+
+ G1ElemStr l_str, e_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, l, &l_str, sizeof(l_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, e, &e_str, sizeof(e_str)));
+ EXPECT_EQ(l_str, e_str);
+}
+
+TEST_F(EpidTpm2Test, CommitCanBeUsedTwice) {
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ Epid20Params params;
+ FpElemStr f_str = this->kMemberFValue;
+ // create TPM context
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ // load f value
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ EcPointObj p1(&params.G1, this->kP1Str);
+ EcPointObj e(&params.G1);
+ uint16_t ctr1 = 0, ctr2 = 0;
+
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, p1, nullptr, 0, nullptr, nullptr,
+ nullptr, e, &ctr1));
+
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, p1, nullptr, 0, nullptr, nullptr,
+ nullptr, e, &ctr2));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, ctr1));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, ctr2));
+}
+TEST_F(EpidTpm2Test, CommitCanUseHashFromEcHashSha256) {
+ HashAlg halg = kSha256;
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ Epid20Params params;
+ EcPointObj R(&params.G1), k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj y(&params.fq);
+ uint32_t i = 0;
+ uint16_t counter = 0;
+ G1ElemStr R_str = {0};
+ std::vector<uint8_t> bsn = {'b', 's', 'n', '0'};
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, halg));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ EXPECT_EQ(kEpidNoErr,
+ EcHash(epid2params.G1(), bsn.data(), bsn.size(), halg, R, &i));
+ i = ntohl(i);
+ THROW_ON_EPIDERR(WriteEcPoint(epid2params.G1(), R, &R_str, sizeof(R_str)));
+ THROW_ON_EPIDERR(
+ ReadFfElement(params.fq.get(), &R_str.y, sizeof(R_str.y), y));
+
+ std::vector<uint8_t> digest((uint8_t*)&i, (uint8_t*)&i + sizeof(i));
+ digest.reserve(digest.size() + bsn.size());
+ digest.insert(digest.end(), bsn.begin(), bsn.end());
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, nullptr, digest.data(), digest.size(),
+ y, k, l, e, &counter));
+ Tpm2ReleaseCounter(tpm, counter);
+}
+#ifndef TPM_TSS
+TEST_F(EpidTpm2Test, CommitCanUseHashFromEcHashSha384) {
+ HashAlg halg = kSha384;
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ Epid20Params params;
+ EcPointObj R(&params.G1), k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj y(&params.fq);
+ uint32_t i = 0;
+ uint16_t counter = 0;
+ G1ElemStr R_str = {0};
+ std::vector<uint8_t> bsn = {'b', 's', 'n', '0'};
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, halg));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ EXPECT_EQ(kEpidNoErr,
+ EcHash(epid2params.G1(), bsn.data(), bsn.size(), halg, R, &i));
+ i = ntohl(i);
+ THROW_ON_EPIDERR(WriteEcPoint(epid2params.G1(), R, &R_str, sizeof(R_str)));
+ THROW_ON_EPIDERR(
+ ReadFfElement(params.fq.get(), &R_str.y, sizeof(R_str.y), y));
+
+ std::vector<uint8_t> digest((uint8_t*)&i, (uint8_t*)&i + sizeof(i));
+ digest.reserve(digest.size() + bsn.size());
+ digest.insert(digest.end(), bsn.begin(), bsn.end());
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, nullptr, digest.data(), digest.size(),
+ y, k, l, e, &counter));
+ Tpm2ReleaseCounter(tpm, counter);
+}
+TEST_F(EpidTpm2Test, CommitCanUseHashFromEcHashSha512) {
+ HashAlg halg = kSha512;
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, &f_str, epid2params);
+ Epid20Params params;
+ EcPointObj R(&params.G1), k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj y(&params.fq);
+ uint32_t i = 0;
+ uint16_t counter = 0;
+ G1ElemStr R_str = {0};
+ std::vector<uint8_t> bsn = {'b', 's', 'n', '0'};
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, halg));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f_str));
+
+ EXPECT_EQ(kEpidNoErr,
+ EcHash(epid2params.G1(), bsn.data(), bsn.size(), halg, R, &i));
+ i = ntohl(i);
+ THROW_ON_EPIDERR(WriteEcPoint(epid2params.G1(), R, &R_str, sizeof(R_str)));
+ THROW_ON_EPIDERR(
+ ReadFfElement(params.fq.get(), &R_str.y, sizeof(R_str.y), y));
+
+ std::vector<uint8_t> digest((uint8_t*)&i, (uint8_t*)&i + sizeof(i));
+ digest.reserve(digest.size() + bsn.size());
+ digest.insert(digest.end(), bsn.begin(), bsn.end());
+ EXPECT_EQ(kEpidNoErr, Tpm2Commit(tpm, nullptr, digest.data(), digest.size(),
+ y, k, l, e, &counter));
+ Tpm2ReleaseCounter(tpm, counter);
+}
+#endif // TPM_TSS
+} // namespace
diff --git a/epid/member/tpm2/unittests/context-test.cc b/epid/member/tpm2/unittests/context-test.cc
new file mode 100644
index 0000000..3b7d98a
--- /dev/null
+++ b/epid/member/tpm2/unittests/context-test.cc
@@ -0,0 +1,105 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM Context unit tests.
+/*! \file */
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/epid2params.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/load_external.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2CreateContext Tests
+TEST_F(EpidTpm2Test, CreateFailsGivenNullParameters) {
+ Tpm2Ctx* ctx = nullptr;
+ Prng my_prng;
+ BitSupplier rnd_func = NULL;
+ void* rnd_param = NULL;
+ const FpElemStr* f = NULL;
+ MemberParams mem_params = {0};
+ Epid2ParamsObj epid_params;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &mem_params);
+
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreateContext(nullptr, epid_params, &rnd_func,
+ &rnd_param, &f, &ctx));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreateContext(&mem_params, nullptr, &rnd_func,
+ &rnd_param, &f, &ctx));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreateContext(&mem_params, epid_params, nullptr,
+ &rnd_param, &f, &ctx));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreateContext(&mem_params, epid_params,
+ &rnd_func, nullptr, &f, &ctx));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2CreateContext(&mem_params, epid_params, &rnd_func, &rnd_param,
+ nullptr, &ctx));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2CreateContext(&mem_params, epid_params, &rnd_func, &rnd_param,
+ &f, nullptr));
+}
+
+TEST_F(EpidTpm2Test, CreateSucceedsGivenValidParameters) {
+ Tpm2Ctx* ctx = nullptr;
+ Prng my_prng;
+ BitSupplier rnd_func = NULL;
+ void* rnd_param = NULL;
+ const FpElemStr* f = NULL;
+ MemberParams mem_params = {0};
+ Epid2ParamsObj epid_params;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &mem_params);
+
+ EXPECT_EQ(kEpidNoErr, Tpm2CreateContext(&mem_params, epid_params, &rnd_func,
+ &rnd_param, &f, &ctx));
+ Tpm2DeleteContext(&ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2DeleteContext Tests
+TEST_F(EpidTpm2Test, DeleteWorksGivenNullTpm2Ctx) {
+ Tpm2DeleteContext(nullptr);
+ Tpm2Ctx* ctx = nullptr;
+ Tpm2DeleteContext(&ctx);
+}
+
+TEST_F(EpidTpm2Test, DeleteNullsTpm2Ctx) {
+ Tpm2Ctx* ctx = nullptr;
+ Prng my_prng;
+ BitSupplier rnd_func = NULL;
+ void* rnd_param = NULL;
+ const FpElemStr* f = NULL;
+ MemberParams mem_params = {0};
+ Epid2ParamsObj epid_params;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &mem_params);
+ Tpm2CreateContext(&mem_params, epid_params, &rnd_func, &rnd_param, &f, &ctx);
+ Tpm2DeleteContext(&ctx);
+ EXPECT_EQ(nullptr, ctx);
+}
+
+TEST_F(EpidTpm2Test, PROTECTED_SampleTest) { SUCCEED(); }
+
+TEST_F(EpidTpm2Test, PROTECTED_EPS1_SampleTest) { SUCCEED(); }
+
+TEST_F(EpidTpm2Test, PROTECTED_EPSOther_SampleTest) { SUCCEED(); }
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/conversion-tss-test.cc b/epid/member/tpm2/unittests/conversion-tss-test.cc
new file mode 100644
index 0000000..5279058
--- /dev/null
+++ b/epid/member/tpm2/unittests/conversion-tss-test.cc
@@ -0,0 +1,160 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM mapper unit tests.
+/*! \file */
+
+#include <cstring>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+#include "gtest/gtest.h"
+extern "C" {
+#include "epid/member/tpm2/ibm_tss/conversion.h"
+}
+
+bool operator==(OctStr256 const& lhs, OctStr256 const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(OctStr256));
+}
+
+bool operator==(G1ElemStr const& epid_point, TPM2B_ECC_POINT const& tpm_point) {
+ if (std::memcmp(&epid_point.x, tpm_point.point.x.t.buffer,
+ sizeof(G1ElemStr) / 2) != 0)
+ return false;
+
+ return 0 == std::memcmp(&epid_point.y, tpm_point.point.y.t.buffer,
+ sizeof(G1ElemStr) / 2);
+}
+
+////////////////////////////////////////////////
+// EpidtoTpm2HashAlg
+TEST_F(EpidTpm2Test, EpidtoTpm2HashAlgWorksCorrectly) {
+ EXPECT_EQ(TPM_ALG_SHA256, EpidtoTpm2HashAlg(kSha256));
+ EXPECT_EQ(TPM_ALG_SHA384, EpidtoTpm2HashAlg(kSha384));
+ EXPECT_EQ(TPM_ALG_SHA512, EpidtoTpm2HashAlg(kSha512));
+ EXPECT_EQ(TPM_ALG_NULL, EpidtoTpm2HashAlg(kSha512_256));
+ EXPECT_EQ(TPM_ALG_NULL, EpidtoTpm2HashAlg(kInvalidHashAlg));
+ EXPECT_EQ(TPM_ALG_NULL, EpidtoTpm2HashAlg((HashAlg)10));
+}
+////////////////////////////////////////////////
+// Tpm2toEpidHashAlg
+TEST_F(EpidTpm2Test, Tpm2toEpidHashAlgWorksCorrectly) {
+ EXPECT_EQ(kSha256, Tpm2toEpidHashAlg(TPM_ALG_SHA256));
+ EXPECT_EQ(kSha384, Tpm2toEpidHashAlg(TPM_ALG_SHA384));
+ EXPECT_EQ(kSha512, Tpm2toEpidHashAlg(TPM_ALG_SHA512));
+ EXPECT_EQ(kInvalidHashAlg, Tpm2toEpidHashAlg(TPM_ALG_NULL));
+ EXPECT_EQ(kInvalidHashAlg, Tpm2toEpidHashAlg((TPMI_ALG_HASH)0x0020));
+}
+////////////////////////////////////////////////
+// ReadTpm2FfElement
+TEST_F(EpidTpm2Test, ReadTpm2FfElementFailsGivenNullPointer) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ OctStr256 stub = {0};
+ EXPECT_EQ(kEpidBadArgErr, ReadTpm2FfElement(nullptr, &ecc_parameter));
+ EXPECT_EQ(kEpidBadArgErr, ReadTpm2FfElement(&stub, nullptr));
+}
+
+TEST_F(EpidTpm2Test, ReadTpm2FfElementMapsGivenValidArguments) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ EXPECT_EQ(kEpidNoErr,
+ ReadTpm2FfElement((OctStr256*)this->kTpmFfElemStrData.data(),
+ &ecc_parameter));
+ EXPECT_EQ((uint16_t)this->kTpmFfElemStrData.size(), ecc_parameter.b.size);
+ EXPECT_EQ(*(OctStr256*)this->kTpmFfElemStrData.data(),
+ *(OctStr256*)ecc_parameter.b.buffer);
+}
+
+////////////////////////////////////////////////
+// WriteTpm2FfElement
+
+TEST_F(EpidTpm2Test, WriteTpm2FfElementFailsGivenNullPointer) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ OctStr256 result = {0};
+ EXPECT_EQ(kEpidBadArgErr, WriteTpm2FfElement(nullptr, &result));
+ EXPECT_EQ(kEpidBadArgErr, WriteTpm2FfElement(&ecc_parameter, nullptr));
+}
+
+TEST_F(EpidTpm2Test, WriteTpm2FfElementfailsGivenSmallBufSize) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ OctStr256 result = {0};
+ THROW_ON_EPIDERR(ReadTpm2FfElement((OctStr256*)this->kTpmFfElemStrData.data(),
+ &ecc_parameter));
+
+ ecc_parameter.b.size++;
+ EXPECT_EQ(kEpidBadArgErr, WriteTpm2FfElement(&ecc_parameter, &result));
+}
+
+TEST_F(EpidTpm2Test, WriteTpm2FfElementWorksGivenLargerBufSize) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ OctStr256 result = {0};
+ THROW_ON_EPIDERR(ReadTpm2FfElement((OctStr256*)this->kTpmFfElemStrData.data(),
+ &ecc_parameter));
+
+ std::vector<uint8_t> expected(ecc_parameter.b.size);
+ for (size_t i = 1; i < expected.size(); ++i) {
+ expected[i] = this->kTpmFfElemStrData[i - 1];
+ }
+ ecc_parameter.b.size--;
+ expected[0] = 0x00;
+ EXPECT_EQ(kEpidNoErr, WriteTpm2FfElement(&ecc_parameter, &result));
+
+ EXPECT_EQ(*(OctStr256*)expected.data(), result);
+}
+
+TEST_F(EpidTpm2Test, WriteTpm2FfElementWorksGivenValidArguments) {
+ TPM2B_ECC_PARAMETER ecc_parameter = {0};
+ OctStr256 result = {0};
+ THROW_ON_EPIDERR(ReadTpm2FfElement((OctStr256*)this->kTpmFfElemStrData.data(),
+ &ecc_parameter));
+
+ EXPECT_EQ(kEpidNoErr, WriteTpm2FfElement(&ecc_parameter, &result));
+ EXPECT_EQ(*(OctStr256*)this->kTpmFfElemStrData.data(), result);
+}
+
+////////////////////////////////////////////////
+// ReadTpmFromEcPoint
+TEST_F(EpidTpm2Test, ReadTpm2EcPointFailsGivenNullPointer) {
+ TPM2B_ECC_POINT tpm_point;
+
+ EXPECT_EQ(kEpidBadArgErr, ReadTpm2EcPoint(nullptr, &tpm_point));
+ EXPECT_EQ(kEpidBadArgErr, ReadTpm2EcPoint(&this->kEpidPointStr, nullptr));
+}
+
+TEST_F(EpidTpm2Test, ReadTpm2EcPointWorksGivenValidArguments) {
+ TPM2B_ECC_POINT tpm_point;
+
+ EXPECT_EQ(kEpidNoErr, ReadTpm2EcPoint(&this->kEpidPointStr, &tpm_point));
+
+ EXPECT_EQ(this->kEpidPointStr, tpm_point);
+}
+
+////////////////////////////////////////////////
+// WriteTpm2EcPoint
+TEST_F(EpidTpm2Test, WriteTpm2EcPointFailsGivenNullPointer) {
+ TPM2B_ECC_POINT tpm_point;
+ G1ElemStr str = {0};
+ EXPECT_EQ(kEpidBadArgErr, WriteTpm2EcPoint(nullptr, &str));
+ EXPECT_EQ(kEpidBadArgErr, WriteTpm2EcPoint(&tpm_point, nullptr));
+}
+
+TEST_F(EpidTpm2Test, WriteTpm2EcPointWorksGivenValidArguments) {
+ TPM2B_ECC_POINT tpm_point;
+ G1ElemStr str = {0};
+ EXPECT_EQ(kEpidNoErr, ReadTpm2EcPoint(&this->kEpidPointStr, &tpm_point));
+
+ EXPECT_EQ(kEpidNoErr, WriteTpm2EcPoint(&tpm_point, &str));
+
+ EXPECT_EQ(str, tpm_point);
+}
diff --git a/epid/member/tpm2/unittests/createprimary-test.cc b/epid/member/tpm2/unittests/createprimary-test.cc
new file mode 100644
index 0000000..c1e4f41
--- /dev/null
+++ b/epid/member/tpm2/unittests/createprimary-test.cc
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM2_CreatePrimary unit tests.
+/*! \file */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/member/tpm2/createprimary.h"
+}
+namespace {
+
+TEST_F(EpidTpm2Test, CreatePrimaryFailsGivenNullParameters) {
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tss(nullptr, nullptr, nullptr, epid2params);
+ G1ElemStr res = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreatePrimary(tss, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2CreatePrimary(nullptr, &res));
+}
+TEST_F(EpidTpm2Test, CreatePrimaryWorksGivenValidParameter) {
+ Prng prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tss(Prng::Generate, &prng, nullptr, epid2params);
+ G1ElemStr res = {0};
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tss, kSha256));
+ EXPECT_EQ(kEpidNoErr, Tpm2CreatePrimary(tss, &res));
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/getrandom-simulator-test.cc b/epid/member/tpm2/unittests/getrandom-simulator-test.cc
new file mode 100644
index 0000000..da6c274
--- /dev/null
+++ b/epid/member/tpm2/unittests/getrandom-simulator-test.cc
@@ -0,0 +1,53 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM GetRandom unit tests.
+/*! \file */
+#include <vector>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/getrandom.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2GetRandom Tests
+
+// Test if GetRandom can get deterministic data for known seed
+TEST_F(EpidTpm2Test, GetRandomGetsExpectedDataForGivenSeed) {
+ std::vector<uint8_t> expected_digest = {
+ 0x76, 0x90, 0x2c, 0x3b, 0xa5, 0x25, 0xd7, 0x1e, 0x66, 0x67, 0xaa, 0xb9,
+ 0x80, 0x50, 0x9c, 0x17, 0x65, 0x19, 0x06, 0x2a, 0x53, 0x49, 0x7d, 0x1b,
+ 0xe5, 0xf4, 0xec, 0xf3, 0xf0, 0x69, 0x81, 0xdc, 0x0f, 0x5a, 0x6f, 0x1c,
+ 0xb3, 0x78, 0xa8, 0xea, 0x6b, 0xab, 0x1d, 0xc7, 0xd6, 0x1a, 0x10, 0x1a};
+ std::vector<uint8_t> output(48);
+ Prng my_prng;
+ my_prng.set_seed(0x1234);
+ Epid2ParamsObj epid2params;
+ int num_bits = (int)expected_digest.size() * 8;
+ Tpm2CtxObj tpm2(&Prng::Generate, &my_prng, NULL, epid2params);
+ my_prng.set_seed(0x1234);
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tpm2, num_bits, output.data()));
+ EXPECT_EQ(expected_digest, output);
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/getrandom-test.cc b/epid/member/tpm2/unittests/getrandom-test.cc
new file mode 100644
index 0000000..3bde88b
--- /dev/null
+++ b/epid/member/tpm2/unittests/getrandom-test.cc
@@ -0,0 +1,67 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM GetRandom unit tests.
+/*! \file */
+#include <vector>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/getrandom.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2GetRandom Tests
+TEST_F(EpidTpm2Test, GetRandomFailsGivenNullParameters) {
+ uint8_t output[48] = {0};
+ Prng my_prng;
+ my_prng.set_seed(0x1234);
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ EXPECT_EQ(kEpidBadArgErr, Tpm2GetRandom(nullptr, 48 * 8, output));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2GetRandom(tpm, 48 * 8, nullptr));
+}
+
+TEST_F(EpidTpm2Test, GetRandomReturnsDifferentBufs) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ int length = 10;
+ std::vector<uint8_t> buf1(length, (uint8_t)0);
+ std::vector<uint8_t> buf2(length, (uint8_t)0);
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tpm, length * CHAR_BIT, buf1.data()));
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tpm, length * CHAR_BIT, buf2.data()));
+ EXPECT_NE(buf1, buf2);
+}
+
+TEST_F(EpidTpm2Test, GetRandomCanGenerateLongStream) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ int length = 1000;
+ std::vector<uint8_t> zeros(length, (uint8_t)0);
+ std::vector<uint8_t> buf = zeros;
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tpm, length * CHAR_BIT, buf.data()));
+ EXPECT_NE(buf, zeros);
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/getrandom-tss-test.cc b/epid/member/tpm2/unittests/getrandom-tss-test.cc
new file mode 100644
index 0000000..021fce4
--- /dev/null
+++ b/epid/member/tpm2/unittests/getrandom-tss-test.cc
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM Context unit tests.
+/*! \file */
+
+#include <limits.h>
+#include <stdint.h>
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/getrandom.h"
+}
+
+namespace {
+
+TEST_F(EpidTpm2Test, GetRandomOnTssReturnsDifferentBufs) {
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tss(nullptr, nullptr, nullptr, epid2params);
+ size_t length = 10;
+ std::vector<uint8_t> buf1(length, (uint8_t)0);
+ std::vector<uint8_t> buf2(length, (uint8_t)0);
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tss, length * CHAR_BIT, buf1.data()));
+ EXPECT_EQ(kEpidNoErr, Tpm2GetRandom(tss, length * CHAR_BIT, buf2.data()));
+ EXPECT_NE(buf1, buf2);
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/load_external-simulator-test.cc b/epid/member/tpm2/unittests/load_external-simulator-test.cc
new file mode 100644
index 0000000..ec58080
--- /dev/null
+++ b/epid/member/tpm2/unittests/load_external-simulator-test.cc
@@ -0,0 +1,58 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2LoadExternal unit tests.
+/*! \file */
+
+#include <stdint.h>
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tpm2/load_external.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2LoadExternal Tests
+TEST_F(EpidTpm2Test, LoadExternalCanLoadFValueSha384) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(ctx, &f_str));
+}
+TEST_F(EpidTpm2Test, LoadExternalCanLoadFValueSha512) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(ctx, &f_str));
+}
+TEST_F(EpidTpm2Test, LoadExternalCanLoadFValueSha512_256) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(ctx, kSha512_256));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(ctx, &f_str));
+}
+} // namespace
diff --git a/epid/member/tpm2/unittests/load_external-test.cc b/epid/member/tpm2/unittests/load_external-test.cc
new file mode 100644
index 0000000..8405e27
--- /dev/null
+++ b/epid/member/tpm2/unittests/load_external-test.cc
@@ -0,0 +1,60 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2LoadExternal unit tests.
+/*! \file */
+
+#include <stdint.h>
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/tpm2/load_external.h"
+}
+
+namespace {
+TEST_F(EpidTpm2Test, SetHashAlgFailsIfHashAlgNotSupported) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported, Tpm2SetHashAlg(ctx, kSha3_256));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported, Tpm2SetHashAlg(ctx, kSha3_384));
+ EXPECT_EQ(kEpidHashAlgorithmNotSupported, Tpm2SetHashAlg(ctx, kSha3_512));
+}
+//////////////////////////////////////////////////////////////////////////
+// Tpm2LoadExternal Tests
+TEST_F(EpidTpm2Test, LoadExternalFailsGivenNullParameters) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2LoadExternal(nullptr, &f_str));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2LoadExternal(ctx, nullptr));
+}
+TEST_F(EpidTpm2Test, LoadExternalCanLoadFValueSha256) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f_str = this->kMemberFValue;
+ Tpm2CtxObj ctx(&Prng::Generate, &my_prng, &f_str, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(ctx, &f_str));
+}
+} // namespace
diff --git a/epid/member/tpm2/unittests/main-testhelper.cc b/epid/member/tpm2/unittests/main-testhelper.cc
new file mode 100644
index 0000000..1d49165
--- /dev/null
+++ b/epid/member/tpm2/unittests/main-testhelper.cc
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Main entry point for unit tests.
+/*! \file */
+
+#include "epid/common-testhelper/testapp-testhelper.h"
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ std::vector<std::string> positive;
+ std::vector<std::string> negative;
+ std::vector<char*> argv_new;
+ argv_new.push_back(argv[0]);
+ bool include_protected = false;
+ bool print_help = false;
+ for (int i = 1; i < argc; i++) {
+ std::string arg(argv[i]);
+ if (arg == std::string("--also_run_protected_tests")) {
+ include_protected = true;
+ } else if (arg == std::string("--help")) {
+ print_help = true;
+ argv_new.push_back(argv[i]);
+ } else if (arg.compare(0, 15, "--gtest_filter=") == 0) {
+ split_filter(&positive, &negative, arg.substr(15));
+ } else {
+ argv_new.push_back(argv[i]);
+ }
+ }
+ if (!include_protected) {
+ negative.push_back("*.*_PROTECTED_*");
+ negative.push_back("*.PROTECTED_*");
+ }
+ std::string filter = join_filter(positive, negative);
+ if (filter != "") {
+ argv_new.push_back(&filter[0]);
+ }
+ int argc_new = (int)argv_new.size();
+ argv_new.push_back(nullptr);
+ testing::InitGoogleTest(&argc_new, argv_new.data());
+ if (print_help) {
+ printf("\n");
+ printf("Custom Options:\n");
+ printf(" --also_run_protected_tests\n");
+ printf(" similar to --gtest_also_run_disabled_tests, but for\n");
+ printf(" protected tests (PROTECTED_ instead of DISABLED_)\n");
+ printf("\n");
+ printf("Protected tests are tests where some data is protected\n");
+ printf("(i.e. hidden) from the code and can only be used indirectly.\n");
+ }
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/member/tpm2/unittests/nv-test.cc b/epid/member/tpm2/unittests/nv-test.cc
new file mode 100644
index 0000000..5c30abf
--- /dev/null
+++ b/epid/member/tpm2/unittests/nv-test.cc
@@ -0,0 +1,326 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM non volatile memory API unit tests.
+/*! \file */
+#include <array>
+#include <cstring>
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/member/tpm2/nv.h"
+}
+
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+TEST(NvTest, CanStoreMembershipCredential) {
+ // Demonstrate NV API usage
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+
+ MembershipCredential const credential = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x46, 0xc9, 0x69, 0xee, 0xf4, 0x68, 0xe1, 0x5f, 0xac, 0xbf, 0xdd,
+ 0x77, 0xeb, 0x4c, 0xaf, 0x8a, 0x87, 0x68, 0x3f, 0x4e, 0xda, 0xf2,
+ 0x96, 0xec, 0x57, 0x08, 0x90, 0xe8, 0x19, 0x62, 0x54, 0xdb}}},
+ {{{0x1e, 0x52, 0x23, 0x16, 0x91, 0xe4, 0xa8, 0x1d, 0x9a, 0x1b, 0x8a,
+ 0xad, 0x0a, 0xcf, 0x36, 0x4f, 0xae, 0x43, 0xde, 0x62, 0xff, 0xa6,
+ 0x4b, 0xa8, 0x16, 0x24, 0x98, 0x80, 0x82, 0x80, 0x37, 0x77}}}}, // A
+ {{{0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}}} // x
+ };
+ MembershipCredential data = {0};
+
+ // probe is nv_index is defined
+ if (kEpidNoErr != Tpm2NvRead(tpm, nv_index, sizeof(data), 0, &data)) {
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+ }
+ // write
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvWrite(tpm, nv_index, sizeof(credential), 0, &credential));
+
+ // read
+ EXPECT_EQ(kEpidNoErr, Tpm2NvRead(tpm, nv_index, sizeof(data), 0, &data));
+ EXPECT_EQ(credential, data);
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, CanUseOffset) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+
+ std::array<uint8_t, 3> const data1_src = {1, 2, 3};
+ std::array<uint8_t, 5> const data2_src = {4, 5, 6, 7, 8};
+ std::array<uint8_t, 3> data1_dst = {0};
+ std::array<uint8_t, 5> data2_dst = {0};
+
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, data1_src.size() + data2_src.size()));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvWrite(tpm, nv_index, data1_src.size(), 0, data1_src.data()));
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvWrite(tpm, nv_index, data2_src.size(),
+ (uint16_t)data1_src.size(), data2_src.data()));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvRead(tpm, nv_index, data1_dst.size(), 0, data1_dst.data()));
+ EXPECT_EQ(data1_src, data1_dst);
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvRead(tpm, nv_index, data2_dst.size(),
+ (uint16_t)data1_dst.size(), data2_dst.data()));
+ EXPECT_EQ(data2_src, data2_dst);
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2NvDefineSpace Tests
+TEST(NvTest, NvDefineSpaceFailsGivenNullParameters) {
+ uint32_t nv_index = 0x01000000;
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvDefineSpace(nullptr, nv_index, sizeof(MembershipCredential)));
+}
+
+TEST(NvTest, NvDefineSpaceCanAllocateSpace) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvDefineSpaceCatchReDefinition) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000002;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+ EXPECT_EQ(kEpidDuplicateErr,
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2NvUndefineSpace Tests
+TEST(NvTest, NvUndefineSpaceFailsGivenNullParameters) {
+ uint32_t nv_index = 0x01000000;
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvUndefineSpace(nullptr, nv_index));
+}
+
+TEST(NvTest, NvUndefineSpaceCanDeallocateSpace) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ MembershipCredential data = {0};
+ THROW_ON_EPIDERR(Tpm2NvDefineSpace(tpm, nv_index, sizeof(data)));
+ EXPECT_EQ(kEpidNoErr, Tpm2NvUndefineSpace(tpm, nv_index));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvRead(tpm, nv_index, sizeof(data), 0, &data));
+}
+
+TEST(NvTest, NvUndefineSpaceCatchReDefinition) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidNoErr, Tpm2NvDefineSpace(tpm, nv_index, sizeof(data)));
+ EXPECT_EQ(kEpidNoErr, Tpm2NvUndefineSpace(tpm, nv_index));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2NvWrite Tests
+TEST(NvTest, NvWriteFailsGivenNullParameters) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvWrite(nullptr, nv_index, sizeof(data), 0, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvWrite(tpm, nv_index, sizeof(data), 0, nullptr));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvWriteCanWrite) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidNoErr, Tpm2NvWrite(tpm, nv_index, sizeof(data), 0, &data));
+ EXPECT_EQ(kEpidNoErr, Tpm2NvWrite(tpm, nv_index, sizeof(data) - 1, 1, &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvWriteFailsGivenOverflow) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvWrite(tpm, nv_index, sizeof(data), 1, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvWrite(tpm, nv_index, sizeof(data) + 1, 1, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvWrite(tpm, nv_index, 1, sizeof(MembershipCredential), &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvWriteFailsGivenInvalidLength) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvWrite(tpm, nv_index, 0, 0, &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvWriteFailsGivenIndexUndefined) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000003;
+
+ MembershipCredential const data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvWrite(tpm, nv_index, 1, 0, &data));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2NvRead Tests
+TEST(NvTest, NvReadFailsGivenNullParameters) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential data = {0};
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvRead(nullptr, nv_index, sizeof(data), 0, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvRead(tpm, nv_index, sizeof(data), 0, nullptr));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvReadCanRead) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ std::vector<uint8_t> const data_src = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::vector<uint8_t> data_dst(data_src.size());
+ THROW_ON_EPIDERR(Tpm2NvDefineSpace(tpm, nv_index, data_src.size()));
+ THROW_ON_EPIDERR(
+ Tpm2NvWrite(tpm, nv_index, data_src.size(), 0, data_src.data()));
+
+ EXPECT_EQ(kEpidNoErr, Tpm2NvRead(tpm, nv_index, 3, 0, data_dst.data()));
+ EXPECT_EQ(kEpidNoErr, Tpm2NvRead(tpm, nv_index, data_src.size() - 3, 3,
+ data_dst.data() + 3));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+ EXPECT_EQ(data_src, data_dst);
+}
+
+TEST(NvTest, NvReadFailIfWriteWasNotCalled) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvRead(tpm, nv_index, sizeof(data), 0, &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvReadFailsGivenOverflow) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvRead(tpm, nv_index, sizeof(data), 1, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvRead(tpm, nv_index, sizeof(data) + 1, 0, &data));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2NvRead(tpm, nv_index, 1, sizeof(MembershipCredential), &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvReadFailsGivenInvalidLength) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000000;
+ THROW_ON_EPIDERR(
+ Tpm2NvDefineSpace(tpm, nv_index, sizeof(MembershipCredential)));
+
+ MembershipCredential data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvRead(tpm, nv_index, 0, 0, &data));
+ THROW_ON_EPIDERR(Tpm2NvUndefineSpace(tpm, nv_index));
+}
+
+TEST(NvTest, NvReadFailsGivenIndexUndefined) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+ uint32_t nv_index = 0x01000003;
+
+ MembershipCredential data = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2NvRead(tpm, nv_index, 1, 0, &data));
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/sign-simulator-test.cc b/epid/member/tpm2/unittests/sign-simulator-test.cc
new file mode 100644
index 0000000..d5876d1
--- /dev/null
+++ b/epid/member/tpm2/unittests/sign-simulator-test.cc
@@ -0,0 +1,75 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM Sign unit tests.
+/*! \file */
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/sign.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2Sign Tests
+
+TEST_F(EpidTpm2Test, SignProducesKnownSignature) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+ THROW_ON_EPIDERR(
+ Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, k, l, e, &counter));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+
+ Prng the_same_prng;
+ FfElementObj f(&params.fp, this->kMemberFValue);
+ FfElementObj t(&params.fp);
+ FfElementObj r1(&params.fp), s_expected(&params.fp);
+ BigNumStr zero = {0};
+ THROW_ON_EPIDERR(
+ FfGetRandom(params.fp, &zero, &Prng::Generate, &the_same_prng, r1));
+ THROW_ON_EPIDERR(ReadFfElement(params.fp, this->kDigestSha256,
+ sizeof(this->kDigestSha256), t));
+ THROW_ON_EPIDERR(FfMul(params.fp, f, t, s_expected));
+ THROW_ON_EPIDERR(FfAdd(params.fp, r1, s_expected, s_expected));
+ FpElemStr s_expected_str = {0};
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, s_expected, &s_expected_str,
+ sizeof(s_expected_str)));
+
+ FpElemStr s_str = {0};
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, sig_s, &s_str, sizeof(s_str)));
+ EXPECT_EQ(s_expected_str, s_str);
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/sign-test.cc b/epid/member/tpm2/unittests/sign-test.cc
new file mode 100644
index 0000000..a04a444
--- /dev/null
+++ b/epid/member/tpm2/unittests/sign-test.cc
@@ -0,0 +1,320 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// TPM Sign unit tests.
+/*! \file */
+#include <climits>
+
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/hashsize.h"
+#include "epid/common/src/memory.h"
+#include "epid/member/tpm2/commit.h"
+#include "epid/member/tpm2/load_external.h"
+#include "epid/member/tpm2/sign.h"
+}
+
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Tpm2Sign Tests
+// Verify signature computed by TPM ECDAA scheme:
+// sign_k ?= digest mod p
+// point^sign_s ?= random_exp * private_exp^sign_k
+bool IsSignatureValid(void const* digest, size_t digest_len,
+ FfElement const* sign_k, FfElement const* sign_s,
+ EcPoint const* point, EcPoint const* private_exp,
+ EcPoint const* random_exp, HashAlg hash_alg) {
+ (void)hash_alg;
+
+ Epid20Params params;
+
+ BigNumObj digest_bn(digest_len);
+ THROW_ON_EPIDERR(ReadBigNum(digest, digest_len, digest_bn));
+ FfElementObj t(&params.fp);
+ THROW_ON_EPIDERR(InitFfElementFromBn(params.fp, digest_bn, t));
+ FpElemStr t_str, sign_k_str;
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, t, &t_str, sizeof(t_str)));
+ THROW_ON_EPIDERR(
+ WriteFfElement(params.fp, sign_k, &sign_k_str, sizeof(sign_k_str)));
+ if (!(t_str == sign_k_str)) return false;
+
+ BigNumStr exp;
+ // v1 = p2^s
+ EcPointObj v1(&params.G1);
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, sign_s, &exp, sizeof(exp)));
+ THROW_ON_EPIDERR(EcExp(params.G1, point, &exp, v1));
+ // v2 = k^sign_k
+ EcPointObj v2(&params.G1);
+ THROW_ON_EPIDERR(WriteFfElement(params.fp, sign_k, &exp, sizeof(exp)));
+ THROW_ON_EPIDERR(EcExp(params.G1, private_exp, &exp, v2));
+ // v2 = l * k^digest
+ THROW_ON_EPIDERR(EcMul(params.G1, random_exp, v2, v2));
+ // v1 ?= v2
+ G1ElemStr v1_str, v2_str;
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, v1, &v1_str, sizeof(v1_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, v2, &v2_str, sizeof(v2_str)));
+ return v1_str == v2_str;
+}
+
+TEST_F(EpidTpm2Test, SignProducesValidSignature) {
+ Epid20Params params;
+
+ // create TPM context
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &f, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ // load f value
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f));
+
+ // commit(P1=p2, P2=p2) => k = p2^f, l = p2^r, e = p2^r
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ EcPointObj p2(&params.G1, kP2Sha256Str);
+ EcPointObj p2_exp_f(&params.G1, kP2Sha256ExpF);
+
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ uint16_t counter = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p2, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+
+ // sign(digest) => sign_k = sign_k, sign_s = r + c * f,
+ // where c = H(sign_k||digest)
+ FfElementObj sign_k(&params.fp), sign_s(&params.fp);
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sign_k, sign_s));
+
+ EXPECT_TRUE(IsSignatureValid(this->kDigestSha256, sizeof(this->kDigestSha256),
+ sign_k, sign_s, p2, k, l, kSha256));
+}
+
+TEST_F(EpidTpm2Test, SignProducesValidSignatureTwoTimes) {
+ Epid20Params params;
+
+ // create TPM context
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &f, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ // load f value
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f));
+
+ // commit(P1=p2, P2=p2) => k = p2^f, l = p2^r, e = p2^r
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ EcPointObj p2(&params.G1, kP2Sha256Str);
+ EcPointObj p2_exp_f(&params.G1, kP2Sha256ExpF);
+
+ EcPointObj k1(&params.G1), l1(&params.G1), e1(&params.G1);
+ EcPointObj k2(&params.G1), l2(&params.G1), e2(&params.G1);
+ uint16_t ctr1 = 0, ctr2 = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p2, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k1, l1, e1, &ctr1));
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p2, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k2, l2, e2, &ctr2));
+
+ // sign(digest) => sign_k = sign_k, sign_s = r + c * f,
+ // where c = H(sign_k||digest)
+ FfElementObj sign_k1(&params.fp), sign_s1(&params.fp);
+ FfElementObj sign_k2(&params.fp), sign_s2(&params.fp);
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ ctr1, sign_k1, sign_s1));
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ ctr2, sign_k2, sign_s2));
+
+ EXPECT_TRUE(IsSignatureValid(this->kDigestSha256, sizeof(this->kDigestSha256),
+ sign_k1, sign_s1, p2, k1, l1, kSha256));
+ EXPECT_TRUE(IsSignatureValid(this->kDigestSha256, sizeof(this->kDigestSha256),
+ sign_k2, sign_s2, p2, k2, l2, kSha256));
+}
+
+TEST_F(EpidTpm2Test, SignFailsGivenNullParameters) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+ THROW_ON_EPIDERR(
+ Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, k, l, e, &counter));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(nullptr, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr, Tpm2Sign(tpm, nullptr, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, nullptr));
+}
+
+TEST_F(EpidTpm2Test, SignFailsGivenInvalidDigestLen) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+ THROW_ON_EPIDERR(
+ Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, k, l, e, &counter));
+
+ uint8_t digest[EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT + 1] = {0};
+ EXPECT_EQ(kEpidBadArgErr, Tpm2Sign(tpm, digest, 0, counter, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, digest, EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT + 1,
+ counter, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, digest, EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT - 1,
+ counter, sig_k, sig_s));
+}
+
+TEST_F(EpidTpm2Test, SignFailsGivenUnrecognizedCounter) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+ uint16_t zero = 0;
+ uint16_t one = 1;
+ uint16_t minus_one = (uint16_t)-1;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ zero, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256), one,
+ sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ minus_one, sig_k, sig_s));
+
+ THROW_ON_EPIDERR(
+ Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, k, l, e, &counter));
+
+ uint16_t counter_plus_1 = counter + 1;
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter_plus_1, sig_k, sig_s));
+ THROW_ON_EPIDERR(Tpm2ReleaseCounter(tpm, counter));
+}
+
+TEST_F(EpidTpm2Test, SignFailsGivenPreviouslyUsedCounter) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &this->kMemberFValue, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ THROW_ON_EPIDERR(Tpm2LoadExternal(tpm, &this->kMemberFValue));
+ THROW_ON_EPIDERR(
+ Tpm2Commit(tpm, nullptr, nullptr, 0, nullptr, k, l, e, &counter));
+
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+}
+
+TEST_F(EpidTpm2Test, SignFailsIfKeyNotSet) {
+ Epid20Params params;
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ FfElementObj sig_k(&params.fp), sig_s(&params.fp);
+ uint16_t counter = 0;
+
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sig_k, sig_s));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Tpm2ReleaseCounter Tests
+TEST_F(EpidTpm2Test, ReleaseCounterFailsGivenNullPtr) {
+ // create TPM context
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &f, epid2params);
+ uint16_t ctr = 0;
+
+ EXPECT_EQ(kEpidBadArgErr, Tpm2ReleaseCounter(nullptr, ctr));
+}
+TEST_F(EpidTpm2Test, ReleaseCounterSuccessfullyReleasesCounter) {
+ Epid20Params params;
+
+ // create TPM context
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ FpElemStr f = this->kMemberFValue;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, &f, epid2params);
+ THROW_ON_EPIDERR(Tpm2SetHashAlg(tpm, kSha256));
+ // load f value
+ EXPECT_EQ(kEpidNoErr, Tpm2LoadExternal(tpm, &f));
+
+ // commit(P1=p2, P2=p2) => k = p2^f, l = p2^r, e = p2^r
+ FfElementObj y2(&params.fq, this->kY2Sha256Str);
+ EcPointObj p2(&params.G1, kP2Sha256Str);
+ EcPointObj p2_exp_f(&params.G1, kP2Sha256ExpF);
+
+ EcPointObj k(&params.G1), l(&params.G1), e(&params.G1);
+ uint16_t counter = 0;
+ EXPECT_EQ(kEpidNoErr,
+ Tpm2Commit(tpm, p2, this->kS2Sha256.data(), this->kS2Sha256.size(),
+ y2, k, l, e, &counter));
+ EXPECT_EQ(kEpidNoErr, Tpm2ReleaseCounter(tpm, counter));
+
+ // sign(digest) => sign_k = sign_k, sign_s = r + c * f,
+ // where c = H(sign_k||digest)
+ FfElementObj sign_k(&params.fp), sign_s(&params.fp);
+ EXPECT_EQ(kEpidBadArgErr,
+ Tpm2Sign(tpm, this->kDigestSha256, sizeof(this->kDigestSha256),
+ counter, sign_k, sign_s));
+}
+
+} // namespace
diff --git a/epid/member/tpm2/unittests/tpm2-testhelper.cc b/epid/member/tpm2/unittests/tpm2-testhelper.cc
new file mode 100644
index 0000000..1190936
--- /dev/null
+++ b/epid/member/tpm2/unittests/tpm2-testhelper.cc
@@ -0,0 +1,157 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM fixture class implementation.
+/*! \file */
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+
+#include <climits>
+#include <cstring>
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+
+extern "C" {
+#include "epid/common/types.h"
+}
+
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+const std::vector<uint8_t> EpidTpm2Test::kTpmFfElemStrData = {
+ 0x98, 0x34, 0x87, 0x6d, 0xcf, 0xb0, 0x5c, 0xb1, 0x67, 0xa5, 0xc2,
+ 0x49, 0x53, 0xeb, 0xa5, 0x8c, 0x4a, 0xc8, 0x9b, 0x1a, 0xdf, 0x57,
+ 0xf2, 0x8f, 0x2f, 0x9d, 0x09, 0xaf, 0x10, 0x7e, 0xe8, 0xf0};
+
+const G1ElemStr EpidTpm2Test::kEpidPointStr = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+
+const uint8_t
+ EpidTpm2Test::kDigestSha256[EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT] = {
+ 0x11, 0x40, 0xb5, 0x6c, 0x6d, 0x47, 0x09, 0x0b, 0x05, 0xd6, 0x43,
+ 0x56, 0xe0, 0x7c, 0xc6, 0x8e, 0xa1, 0x65, 0x67, 0xfd, 0xa7, 0x07,
+ 0x87, 0x9b, 0x36, 0x2d, 0x41, 0x35, 0x63, 0x61, 0x31, 0x22};
+
+const FpElemStr EpidTpm2Test::kMemberFValue = {
+ 0x48, 0x40, 0xb5, 0x6c, 0x6d, 0x47, 0x09, 0x0b, 0x05, 0xd6, 0x43,
+ 0x56, 0xe0, 0x7c, 0xc6, 0x8e, 0xa1, 0x65, 0x67, 0xfd, 0xa7, 0x07,
+ 0x87, 0x9b, 0x36, 0x2d, 0x41, 0x35, 0x63, 0x61, 0x31, 0xc7};
+const G1ElemStr EpidTpm2Test::kP1Str = {
+ {{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D,
+ 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A,
+ 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}},
+ {{{0x78, 0x65, 0x28, 0xCB, 0xAF, 0x07, 0x52, 0x50, 0x55, 0x7A, 0x5F,
+ 0x30, 0x0A, 0xC0, 0xB4, 0x6B, 0xEA, 0x6F, 0xE2, 0xF6, 0x6D, 0x96,
+ 0xF7, 0xCD, 0xC8, 0xD3, 0x12, 0x7F, 0x1F, 0x3A, 0x8B, 0x42}}}};
+const G1ElemStr EpidTpm2Test::kg1Str = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}};
+
+const std::vector<uint8_t> EpidTpm2Test::kS2Sha256 = {0, 0, 0, 4,
+ 'a', 'b', 'c'};
+const FqElemStr EpidTpm2Test::kY2Sha256Str = {
+ {{0x8A, 0x43, 0xA1, 0x04, 0xB1, 0x3F, 0x3C, 0xB4, 0xBD, 0x67, 0x38,
+ 0xB1, 0x07, 0xF0, 0x7A, 0x32, 0x7E, 0xCD, 0xF0, 0x2E, 0x62, 0x3E,
+ 0x2C, 0x1F, 0x48, 0xAA, 0x0D, 0x6C, 0xDC, 0x48, 0xF9, 0xF7}}};
+const G1ElemStr EpidTpm2Test::kP2Sha256Str = {
+ {{{0x2E, 0xBB, 0x50, 0x4D, 0x88, 0xFF, 0x25, 0x62, 0xF3, 0x71, 0x65,
+ 0x81, 0xAD, 0xBE, 0x83, 0x6E, 0x54, 0xF5, 0xA6, 0x2A, 0x70, 0xE6,
+ 0x18, 0x6B, 0xD5, 0x4A, 0x10, 0x3C, 0x80, 0x08, 0x95, 0x3D}}},
+ {{{0x8A, 0x43, 0xA1, 0x04, 0xB1, 0x3F, 0x3C, 0xB4, 0xBD, 0x67, 0x38,
+ 0xB1, 0x07, 0xF0, 0x7A, 0x32, 0x7E, 0xCD, 0xF0, 0x2E, 0x62, 0x3E,
+ 0x2C, 0x1F, 0x48, 0xAA, 0x0D, 0x6C, 0xDC, 0x48, 0xF9, 0xF7}}}};
+const G1ElemStr EpidTpm2Test::kP2Sha256ExpF = {
+ {{{0xd0, 0xf3, 0xd9, 0xea, 0x45, 0x24, 0x96, 0xb8, 0x3e, 0x2f, 0xf2,
+ 0x18, 0x12, 0xad, 0xa7, 0xab, 0xe3, 0x1e, 0xff, 0xe7, 0xf7, 0x61,
+ 0x28, 0xae, 0x0a, 0x7c, 0x0f, 0xd9, 0x74, 0x0f, 0x4a, 0x94}}},
+ {{{0xb7, 0xda, 0xd5, 0x97, 0x33, 0xab, 0xb6, 0x3c, 0xf7, 0x3b, 0xec,
+ 0xa4, 0x7f, 0xe6, 0x23, 0xd4, 0xf6, 0xe2, 0x9b, 0xdb, 0xa6, 0xbb,
+ 0xdf, 0xee, 0x62, 0x33, 0xcd, 0x88, 0x25, 0x52, 0xba, 0x99}}}};
+
+const std::vector<uint8_t> EpidTpm2Test::kS2Sha384 = {0, 0, 0, 0,
+ 'a', 'b', 'c'};
+const FqElemStr EpidTpm2Test::kY2Sha384Str = {
+ {{0x0E, 0x86, 0x11, 0x90, 0xAF, 0xEF, 0xEB, 0x79, 0x4B, 0x3E, 0x80,
+ 0x92, 0x94, 0x3B, 0x2F, 0x5E, 0x72, 0x21, 0xEF, 0xF8, 0xBC, 0xE3,
+ 0x48, 0xA9, 0xD0, 0x31, 0x19, 0xAC, 0xD1, 0xD7, 0x49, 0x87}}};
+const G1ElemStr EpidTpm2Test::kP2Sha384Str = {
+ {{{0xE1, 0xC8, 0x28, 0xB1, 0x9A, 0xDF, 0x5D, 0x4B, 0xC4, 0x25, 0x90,
+ 0xFB, 0x38, 0x20, 0xD4, 0x8B, 0x30, 0x8F, 0x95, 0x76, 0xC3, 0x7F,
+ 0x9D, 0xAD, 0x94, 0xC4, 0x31, 0x80, 0xD7, 0xDF, 0xD5, 0xFE}}},
+ {{{0x0E, 0x86, 0x11, 0x90, 0xAF, 0xEF, 0xEB, 0x79, 0x4B, 0x3E, 0x80,
+ 0x92, 0x94, 0x3B, 0x2F, 0x5E, 0x72, 0x21, 0xEF, 0xF8, 0xBC, 0xE3,
+ 0x48, 0xA9, 0xD0, 0x31, 0x19, 0xAC, 0xD1, 0xD7, 0x49, 0x87}}}};
+const G1ElemStr EpidTpm2Test::kP2Sha384ExpF = {
+ {{{0x97, 0x90, 0xaf, 0xe1, 0xc3, 0x7d, 0x6f, 0xf3, 0x71, 0x88, 0x6c,
+ 0x8b, 0x20, 0xc8, 0x50, 0x0d, 0x74, 0x31, 0x2a, 0x7e, 0x7c, 0x8c,
+ 0xba, 0xf1, 0xd9, 0xac, 0x2f, 0xb9, 0x7a, 0xbc, 0xbb, 0x58}}},
+ {{{0xad, 0x2b, 0xcf, 0x14, 0x2f, 0x60, 0xbb, 0xc8, 0xea, 0x9d, 0x8a,
+ 0x54, 0xa6, 0x3b, 0x3b, 0x46, 0x84, 0xdf, 0x72, 0xe2, 0xa9, 0x91,
+ 0x2b, 0x06, 0xe5, 0x7f, 0x63, 0x0e, 0x99, 0x7a, 0xe7, 0xd2}}}};
+
+const std::vector<uint8_t> EpidTpm2Test::kS2Sha512 = {0, 0, 0, 1,
+ 'a', 'b', 'c'};
+const FqElemStr EpidTpm2Test::kY2Sha512Str = {
+ {{0x4C, 0x0E, 0xA7, 0x62, 0x17, 0xB9, 0xFB, 0xE5, 0x21, 0x7D, 0x54,
+ 0x24, 0xE0, 0x2B, 0x87, 0xF7, 0x69, 0x54, 0x0C, 0xC6, 0xAD, 0xF2,
+ 0xF2, 0x7B, 0xE6, 0x91, 0xD8, 0xF3, 0x40, 0x6C, 0x8F, 0x03}}};
+const G1ElemStr EpidTpm2Test::kP2Sha512Str = {
+ {{{0x8C, 0x62, 0xA0, 0x2D, 0x55, 0x55, 0x55, 0x86, 0xBC, 0x82, 0xA6,
+ 0xA2, 0x21, 0x97, 0x9B, 0x9B, 0xB4, 0x03, 0x3D, 0x83, 0xF3, 0xBA,
+ 0xDA, 0x9C, 0x42, 0xF7, 0xB3, 0x94, 0x99, 0x2A, 0x96, 0xE4}}},
+ {{{0x4C, 0x0E, 0xA7, 0x62, 0x17, 0xB9, 0xFB, 0xE5, 0x21, 0x7D, 0x54,
+ 0x24, 0xE0, 0x2B, 0x87, 0xF7, 0x69, 0x54, 0x0C, 0xC6, 0xAD, 0xF2,
+ 0xF2, 0x7B, 0xE6, 0x91, 0xD8, 0xF3, 0x40, 0x6C, 0x8F, 0x03}}}};
+const G1ElemStr EpidTpm2Test::kP2Sha512ExpF = {
+ {{{0xb4, 0xbc, 0x3d, 0x8c, 0x7b, 0xc3, 0x08, 0x89, 0xa3, 0x0e, 0x66,
+ 0x7f, 0x6d, 0x89, 0xab, 0x9b, 0xc4, 0xda, 0x14, 0x93, 0x62, 0x32,
+ 0x0d, 0xe2, 0x95, 0xb5, 0x71, 0x2d, 0x75, 0xbe, 0x63, 0xd4}}},
+ {{{0xf6, 0x20, 0x85, 0x93, 0x3f, 0xfb, 0xf3, 0xad, 0xa9, 0x7e, 0xd3,
+ 0x93, 0x29, 0x22, 0x1b, 0x88, 0x56, 0xf0, 0xbd, 0x62, 0xbd, 0x63,
+ 0x8b, 0xcf, 0xe1, 0x62, 0x83, 0xb6, 0x1c, 0x56, 0x29, 0xc3}}}};
+
+const std::vector<uint8_t> EpidTpm2Test::kS2Sha512256 = {0, 0, 0, 0,
+ 'a', 'b', 'c'};
+const FqElemStr EpidTpm2Test::kY2Sha512256Str = {
+ {{0x30, 0xbe, 0x3f, 0x12, 0x00, 0x74, 0x48, 0xaa, 0x91, 0x90, 0x84,
+ 0x12, 0x4d, 0x58, 0x54, 0xe7, 0x04, 0x65, 0x37, 0x97, 0x88, 0xcf,
+ 0x67, 0xa0, 0x8c, 0x56, 0x93, 0xa7, 0x7f, 0xe8, 0x74, 0xfc}}};
+const G1ElemStr EpidTpm2Test::kP2Sha512256Str = {
+ {{{0x63, 0x28, 0x40, 0x14, 0x73, 0xd5, 0x91, 0xc4, 0xa2, 0xa4, 0xb6,
+ 0xd8, 0xa8, 0x75, 0x21, 0xd1, 0x26, 0x4e, 0x42, 0x13, 0x1f, 0xfa,
+ 0xed, 0x90, 0x8d, 0x56, 0x34, 0x57, 0x8a, 0x3a, 0x47, 0xa0}}},
+ {{{0x30, 0xbe, 0x3f, 0x12, 0x00, 0x74, 0x48, 0xaa, 0x91, 0x90, 0x84,
+ 0x12, 0x4d, 0x58, 0x54, 0xe7, 0x04, 0x65, 0x37, 0x97, 0x88, 0xcf,
+ 0x67, 0xa0, 0x8c, 0x56, 0x93, 0xa7, 0x7f, 0xe8, 0x74, 0xfc}}}};
+const G1ElemStr EpidTpm2Test::kP2Sha512256ExpF = {
+ {{{0xa7, 0xef, 0x09, 0x07, 0x5e, 0xf1, 0xce, 0x85, 0xe8, 0x85, 0x03,
+ 0xbe, 0xdd, 0x2e, 0x32, 0x25, 0xab, 0x58, 0x90, 0xc4, 0x59, 0x60,
+ 0x1c, 0x17, 0x3b, 0x8c, 0x62, 0x35, 0xd3, 0x9f, 0x77, 0x8f}}},
+ {{{0x38, 0xce, 0x8b, 0x36, 0xc1, 0xb1, 0xae, 0xc5, 0x61, 0x60, 0x12,
+ 0xf0, 0x5b, 0xc1, 0xb8, 0x5e, 0xf3, 0xb9, 0xa6, 0x26, 0x7f, 0x27,
+ 0x5b, 0x78, 0x61, 0x27, 0xe6, 0x0b, 0x38, 0x37, 0x89, 0x56}}}};
diff --git a/epid/member/tpm2/unittests/tpm2-testhelper.h b/epid/member/tpm2/unittests/tpm2-testhelper.h
new file mode 100644
index 0000000..208a343
--- /dev/null
+++ b/epid/member/tpm2/unittests/tpm2-testhelper.h
@@ -0,0 +1,78 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// TPM fixture class.
+/*! \file */
+#ifndef EPID_MEMBER_TPM2_UNITTESTS_TPM2_TESTHELPER_H_
+#define EPID_MEMBER_TPM2_UNITTESTS_TPM2_TESTHELPER_H_
+
+#include <stdint.h>
+#include <climits>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/bitsupplier.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/member/tpm2/context.h"
+}
+
+typedef struct FqElemStr FqElemStr;
+typedef struct FpElemStr FpElemStr;
+typedef struct G1ElemStr G1ElemStr;
+
+/// Test fixture class for Tpm
+class EpidTpm2Test : public ::testing::Test {
+ public:
+ // tpm digest
+ static const std::vector<uint8_t> kTpmFfElemStrData;
+ static const G1ElemStr kEpidPointStr;
+ static const uint8_t kDigestSha256[EPID_SHA256_DIGEST_BITSIZE / CHAR_BIT];
+
+ static const FpElemStr kMemberFValue;
+ static const G1ElemStr kP1Str;
+ static const G1ElemStr kg1Str;
+ static const std::vector<uint8_t> kS2Sha256;
+ static const FqElemStr kY2Sha256Str;
+ static const G1ElemStr kP2Sha256Str;
+ static const G1ElemStr kP2Sha256ExpF;
+ static const std::vector<uint8_t> kS2Sha384;
+ static const FqElemStr kY2Sha384Str;
+ static const G1ElemStr kP2Sha384Str;
+ static const G1ElemStr kP2Sha384ExpF;
+ static const std::vector<uint8_t> kS2Sha512;
+ static const FqElemStr kY2Sha512Str;
+ static const G1ElemStr kP2Sha512Str;
+ static const G1ElemStr kP2Sha512ExpF;
+ static const std::vector<uint8_t> kS2Sha512256;
+ static const FqElemStr kY2Sha512256Str;
+ static const G1ElemStr kP2Sha512256Str;
+ static const G1ElemStr kP2Sha512256ExpF;
+ /// setup called before each TEST_F starts
+ virtual void SetUp() {}
+ /// teardown called after each TEST_F finishes
+ virtual void TearDown() {}
+};
+
+/// compares FpElemStr values
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs);
+
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs);
+
+#endif // EPID_MEMBER_TPM2_UNITTESTS_TPM2_TESTHELPER_H_
diff --git a/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.cc b/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.cc
new file mode 100644
index 0000000..6090c47
--- /dev/null
+++ b/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.cc
@@ -0,0 +1,61 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Ctx wrapper class implementation.
+/*! \file */
+#include "epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h"
+
+#include <cstring>
+#include <string>
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+
+extern "C" {
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/hashsize.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+#include "epid/member/tpm2/context.h"
+#include "epid/member/tpm2/sign.h"
+}
+
+Tpm2CtxObj::Tpm2CtxObj(BitSupplier rnd_func, void* rnd_param,
+ const FpElemStr* f, Epid2ParamsObj const& params)
+ : ctx_(nullptr) {
+ EpidStatus sts = kEpidNoErr;
+ BitSupplier rnd_func_ = NULL;
+ void* rnd_param_ = NULL;
+ const FpElemStr* f_ = NULL;
+ MemberParams mem_params = {0};
+ SetMemberParams(rnd_func, rnd_param, f, &mem_params);
+
+ sts = Tpm2CreateContext(&mem_params, params, &rnd_func_, &rnd_param_, &f_,
+ &ctx_);
+ if (kEpidNoErr != sts) {
+ printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:");
+ throw std::logic_error(std::string("Failed to call: ") +
+ "Tpm2CreateContext()");
+ }
+}
+
+Tpm2CtxObj::~Tpm2CtxObj() { Tpm2DeleteContext(&ctx_); }
+
+Tpm2Ctx* Tpm2CtxObj::ctx() const { return ctx_; }
+
+Tpm2CtxObj::operator Tpm2Ctx*() const { return ctx_; }
+
+Tpm2CtxObj::operator const Tpm2Ctx*() const { return ctx_; }
diff --git a/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h b/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h
new file mode 100644
index 0000000..0e9904f
--- /dev/null
+++ b/epid/member/tpm2/unittests/tpm2_wrapper-testhelper.h
@@ -0,0 +1,58 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// Tpm2Ctx wrapper class.
+/*! \file */
+#ifndef EPID_MEMBER_TPM2_UNITTESTS_TPM2_WRAPPER_TESTHELPER_H_
+#define EPID_MEMBER_TPM2_UNITTESTS_TPM2_WRAPPER_TESTHELPER_H_
+
+#include <stdint.h>
+#include <vector>
+
+extern "C" {
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+}
+
+typedef struct Tpm2Ctx Tpm2Ctx;
+class Epid2ParamsObj;
+
+/// C++ Wrapper to manage memory for Tpm2Ctx via RAII
+class Tpm2CtxObj {
+ public:
+ /// Create a Tpm2Ctx
+ Tpm2CtxObj(BitSupplier rnd_func, void* rnd_param, const FpElemStr* f,
+ class Epid2ParamsObj const& params);
+
+ // This class instances are not meant to be copied.
+ // Explicitly delete copy constructor and assignment operator.
+ Tpm2CtxObj(const Tpm2CtxObj&) = delete;
+ Tpm2CtxObj& operator=(const Tpm2CtxObj&) = delete;
+
+ /// Destroy the Tpm2Ctx
+ ~Tpm2CtxObj();
+ /// get a pointer to the stored Tpm2Ctx
+ Tpm2Ctx* ctx() const;
+ /// cast operator to get the pointer to the stored Tpm2Ctx
+ operator Tpm2Ctx*() const;
+ /// const cast operator to get the pointer to the stored Tpm2Ctx
+ operator const Tpm2Ctx*() const;
+
+ private:
+ /// The stored Tpm2Ctx
+ Tpm2Ctx* ctx_;
+};
+
+#endif // EPID_MEMBER_TPM2_UNITTESTS_TPM2_WRAPPER_TESTHELPER_H_
diff --git a/epid/member/tpm_member.h b/epid/member/tpm_member.h
new file mode 100644
index 0000000..372377d
--- /dev/null
+++ b/epid/member/tpm_member.h
@@ -0,0 +1,48 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Member creation parameters for TPM implementation.
+/*!
+ * \file
+ */
+#ifndef EPID_MEMBER_TPM_MEMBER_H_
+#define EPID_MEMBER_TPM_MEMBER_H_
+/*!
+* \cond
+*/
+
+#include "epid/common/bitsupplier.h"
+#include "epid/common/types.h"
+
+/*!
+\addtogroup EpidMemberModule member
+@{
+*/
+
+/// TPM specific member parameters
+/*!
+ \class TPMMemberParams
+*/
+typedef struct MemberParams {
+ FpElemStr const* f; ///< Secret part of the private key. If NULL an
+ /// EPS based primary will be used.
+} MemberParams;
+
+/*!
+ * @}
+ * \endcond
+ */
+
+#endif // EPID_MEMBER_TPM_MEMBER_H_
diff --git a/epid/member/unittests/context-test.cc b/epid/member/unittests/context-test.cc
new file mode 100644
index 0000000..14540b3
--- /dev/null
+++ b/epid/member/unittests/context-test.cc
@@ -0,0 +1,620 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/storage.h"
+#include "epid/member/src/write_precomp.h"
+#include "epid/member/tpm2/nv.h"
+}
+bool operator==(MemberPrecomp const& lhs, MemberPrecomp const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+/// compares GroupPubKey values
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs);
+
+/// compares MembershipCredential values
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs);
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberDeinit Tests
+TEST_F(EpidMemberTest, DeinitWorksGivenNullMemberCtx) {
+ EpidMemberDeinit(nullptr);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberGetSize Tests
+TEST_F(EpidMemberTest, GetSizeFailsGivenNullParams) {
+ size_t ctx_size = 0;
+ MemberParams params = {0};
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(&params, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(nullptr, &ctx_size));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberGetSize(nullptr, nullptr));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberGetSize Tests
+TEST_F(EpidMemberTest, GetSizeWorksGivenValidParams) {
+ size_t ctx_size = 0;
+ Prng my_prng;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberInit Tests
+TEST_F(EpidMemberTest, InitFailsGivenNullParameters) {
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(nullptr, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(&params, nullptr));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(nullptr, ctx));
+}
+
+TEST_F(EpidMemberTest, InitFailsGivenInvalidParameters) {
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, &f, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberInit(&params, ctx));
+}
+
+TEST_F(EpidMemberTest, InitSucceedsGivenValidParameters) {
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, &f, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidNoErr, EpidMemberInit(&params, ctx));
+ EpidMemberDeinit(ctx);
+}
+
+TEST_F(EpidMemberTest, InitSucceedsGivenValidParametersWithNoF) {
+ size_t ctx_size = 0;
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ std::vector<uint8_t> ctx_buf;
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberGetSize(&params, &ctx_size));
+ ctx_buf.resize(ctx_size);
+ ctx = (MemberCtx*)&ctx_buf[0];
+
+ EXPECT_EQ(kEpidNoErr, EpidMemberInit(&params, ctx));
+ EpidMemberDeinit(ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberDelete Tests
+TEST_F(EpidMemberTest, DeleteWorksGivenNullMemberCtx) {
+ EpidMemberDelete(nullptr);
+ MemberCtx* member_ctx = nullptr;
+ EpidMemberDelete(&member_ctx);
+}
+TEST_F(EpidMemberTest, DeleteNullsMemberCtx) {
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ THROW_ON_EPIDERR(EpidMemberCreate(&params, &ctx));
+ EpidMemberDelete(&ctx);
+ EXPECT_EQ(nullptr, ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberCreate Tests
+// test that create fails if any mandatory parameters are NULL
+TEST_F(EpidMemberTest, CreateFailsGivenNullParameters) {
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberCreate(nullptr, &ctx));
+
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberCreate(&params, nullptr));
+
+ SetMemberParams(nullptr, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberCreate(&params, nullptr));
+}
+
+TEST_F(EpidMemberTest, CreateFailsGivenInvalidParameters) {
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ SetMemberParams(&Prng::Generate, &my_prng, &f, &params);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberCreate(&params, &ctx));
+ EpidMemberDelete(&ctx);
+}
+
+TEST_F(EpidMemberTest, CreateSucceedsGivenValidParameters) {
+ MemberCtx* ctx = nullptr;
+ Prng my_prng;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &my_prng, nullptr, &params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberCreate(&params, &ctx));
+ EpidMemberDelete(&ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberStartup
+TEST_F(EpidMemberTest, StartupFailsGivenNullParameters) {
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberStartup(nullptr));
+}
+
+TEST_F(EpidMemberTest, StartupSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+ MembershipCredential credential_expected = ((MemberCtx*)member)->credential;
+ // reset member credential to test if startup reads them from NV memory
+ // correctly
+ ((MemberCtx*)member)->pub_key = {0};
+ ((MemberCtx*)member)->credential = {0};
+ EXPECT_EQ(kEpidNoErr, EpidMemberStartup(member));
+ EXPECT_EQ(pub_key, ((MemberCtx*)member)->pub_key);
+ EXPECT_EQ(credential_expected, ((MemberCtx*)member)->credential);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberSetHashAlg
+TEST_F(EpidMemberTest, SetHashAlgFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(nullptr, kSha256));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA256) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha256));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA384) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha384));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA512) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha512));
+}
+TEST_F(EpidMemberTest, CanSetHashAlgoToSHA512256) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha512_256));
+}
+TEST_F(EpidMemberTest, SetHashAlgFailsForNonSupportedAlgorithm) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_256));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_384));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_512));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, (HashAlg)-1));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberSetSigRl
+TEST_F(EpidMemberTest, SetSigRlFailsGivenNullPointer) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(nullptr, &srl, sizeof(SigRl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, nullptr, sizeof(SigRl)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenZeroSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(member_ctx, &srl, 0));
+}
+// Size parameter must be at least big enough for n2 == 0 case
+TEST_F(EpidMemberTest, SetSigRlFailsGivenTooSmallSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenN2TooBigForSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenN2TooSmallForSize) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenBadGroupId) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.gid.data[0] = ~srl.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenEmptySigRlFromDifferentGroup) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsGivenOldVersion) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ srl.version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ srl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+TEST_F(EpidMemberTest, SetSigRlPreservesOldRlOnFailure) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXSigrevokedMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+ // wrong sigrl contains revoked member0 and has lower version
+ SigRl const* wrong_sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrpXSigRlSingleEntry.data());
+ size_t wrong_sig_rl_size = this->kGrpXSigRlSingleEntry.size();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidMemberSetSigRl(member_ctx, wrong_sig_rl, wrong_sig_rl_size));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(sig_rl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ // Check that sigrevoked member is still in SigRl
+ EXPECT_EQ(kEpidSigRevokedInSigRl, EpidSign(member_ctx, msg.data(), msg.size(),
+ nullptr, 0, sig, sig_len));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenValidSigRl) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t sig_rl_size = this->kGrpXSigRl.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenEmptySigRl) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ uint8_t sig_rl_data_n2_zero[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl* sig_rl = reinterpret_cast<SigRl*>(sig_rl_data_n2_zero);
+ size_t sig_rl_size = sizeof(sig_rl_data_n2_zero);
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlWorksGivenSigRlWithOneEntry) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrpXSigRlSingleEntry.data());
+ size_t sig_rl_size = this->kGrpXSigRlSingleEntry.size();
+ EXPECT_EQ(kEpidNoErr, EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+TEST_F(EpidMemberTest, SetSigRlFailsIfNotProvisioned) {
+ Prng my_prng;
+ MemberCtxObj member_ctx(&Prng::Generate, &my_prng);
+ uint8_t sig_rl_data[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl* sig_rl = reinterpret_cast<SigRl*>(sig_rl_data);
+ size_t sig_rl_size = sizeof(sig_rl_data);
+ EXPECT_EQ(kEpidOutOfSequenceError,
+ EpidMemberSetSigRl(member_ctx, sig_rl, sig_rl_size));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidRegisterBasename
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenNullPtr) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'_', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(member, nullptr, basename.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(nullptr, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenDuplicateBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'d', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenInvalidBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {};
+ std::vector<uint8_t> basename2 = {'b', 's', 'n'};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidBadArgErr, EpidRegisterBasename(member, basename2.data(), 0));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameSucceedsGivenUniqueBaseName) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename = {'b', 's', 'n', '0', '1'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename.data(), basename.size()));
+}
+TEST_F(EpidMemberTest, RegisterBaseNameSucceedsGivenMultipleUniqueBaseNames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> basename1 = {'b', 's', 'n', '0', '1'};
+ std::vector<uint8_t> basename2 = {'b', 's', 'n', '0', '2'};
+ std::vector<uint8_t> basename3 = {'b', 's', 'n', '0', '3'};
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename1.data(), basename1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename2.data(), basename2.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidRegisterBasename(member, basename3.data(), basename3.size()));
+ // Verify that basenames registered succesfully
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename1.data(), basename1.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename2.data(), basename2.size()));
+ EXPECT_EQ(kEpidDuplicateErr,
+ EpidRegisterBasename(member, basename3.data(), basename3.size()));
+}
+TEST_F(EpidMemberTest,
+ RegisterBaseNameSucceedsGivenBsnContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ EXPECT_EQ(kEpidNoErr, EpidRegisterBasename(member, this->kData_0_255.data(),
+ this->kData_0_255.size()));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidClearRegisteredBasenames
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesFailsGivenNullPtr) {
+ EXPECT_EQ(kEpidBadArgErr, EpidClearRegisteredBasenames(nullptr));
+}
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesClearsBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(
+ EpidRegisterBasename(member, this->kBsn0.data(), this->kBsn0.size()));
+ EXPECT_EQ(kEpidNoErr, EpidClearRegisteredBasenames(member));
+ // check, that after clearing EpidRegisterBasename works correctly
+ THROW_ON_EPIDERR(
+ EpidRegisterBasename(member, this->kBsn0.data(), this->kBsn0.size()));
+}
+TEST_F(EpidMemberTest, EpidClearRegisteredBasenamesClearsAllBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ for (int i = 0; i < 3; ++i) {
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, &i, sizeof(i)));
+ }
+ EXPECT_EQ(kEpidNoErr, EpidClearRegisteredBasenames(member));
+ for (int i = 0; i < 3; ++i) {
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, &i, sizeof(i)));
+ }
+}
+TEST_F(EpidMemberTest,
+ EpidClearRegisteredBasenamesCausesSignWithBasenameAfterItToFail) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ THROW_ON_EPIDERR(EpidClearRegisteredBasenames(member));
+ ASSERT_EQ(kEpidBadArgErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidMemberWritePrecomp
+TEST_F(EpidMemberTest, MemberWritePrecompFailsGivenNullPointer) {
+ MemberPrecomp precomp;
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ MemberCtx* ctx = member;
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberWritePrecomp(nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, EpidMemberWritePrecomp(ctx, nullptr));
+}
+TEST_F(EpidMemberTest,
+ MemberWritePrecompSucceedGivenValidArgumentWithLoadedPrecomp) {
+ MemberPrecomp precomp;
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ MemberCtx* ctx = member;
+ EXPECT_EQ(kEpidNoErr, EpidMemberWritePrecomp(ctx, &precomp));
+ MemberPrecomp expected_precomp = this->kMemberPrecomp;
+ EXPECT_EQ(expected_precomp, precomp);
+}
+TEST_F(EpidMemberTest,
+ MemberWritePrecompSucceedGivenValidArgumentWithCalcPrecomp) {
+ MemberPrecomp precomp;
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ MemberCtx* ctx = member;
+ EXPECT_EQ(kEpidNoErr, EpidMemberWritePrecomp(ctx, &precomp));
+ MemberPrecomp expected_precomp = this->kMemberPrecomp;
+ EXPECT_EQ(expected_precomp, precomp);
+}
+TEST_F(EpidMemberTest, DefaultHashAlgIsSha512) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ MemberCtx* ctx = member;
+ EXPECT_EQ(kSha512, ctx->hash_alg);
+}
+#ifdef TPM_TSS
+//////////////////////////////////////////////////////////////////////////
+// MemberCanLoadMembershipCredentialFromTpm
+TEST_F(EpidMemberTest,
+ MemberCanLoadPreviouslyProvisionedMembershipCredentialFromTpm) {
+ // Not clear that this test is valid or in the right place.
+ Prng prng;
+ Epid2ParamsObj epid2params;
+
+ uint32_t const nv_index = 0x01c10100;
+ GroupPubKey pub_key_expected = this->kGrpXKey;
+ GroupPubKey pub_key;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential_expected = {this->kGrpXMember9PrivKey.gid,
+ this->kGrpXMember9PrivKey.A,
+ this->kGrpXMember9PrivKey.x};
+ MembershipCredential credential;
+ // Tpm2CtxObj calls Tpm2CreateContext() and sets
+ // is_context_already_created=true. To call this function in
+ // EpidMemberInit() successfully Tpm2DeleteContext() must be called.
+ // Putting creation of Tpm2CtxObj object in a block solves it
+ {
+ // write credentials
+ Tpm2CtxObj tpm(&Prng::Generate, &prng, nullptr, epid2params);
+ THROW_ON_EPIDERR(EpidNvWriteMembershipCredential(
+ tpm, &pub_key_expected, &credential_expected, nv_index));
+
+ // read credentials to confirm that credential has been really inserted
+ EXPECT_EQ(kEpidNoErr, EpidNvReadMembershipCredential(
+ tpm, nv_index, &pub_key, &credential));
+ EXPECT_EQ(pub_key_expected, pub_key);
+ EXPECT_EQ(credential_expected, credential);
+ }
+
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, EpidMemberStartup(member));
+ EXPECT_EQ(pub_key_expected, ((MemberCtx*)member)->pub_key);
+ EXPECT_EQ(credential_expected, ((MemberCtx*)member)->credential);
+
+ Tpm2NvUndefineSpace(((MemberCtx*)member)->tpm2_ctx, nv_index);
+}
+#endif
+} // namespace
diff --git a/epid/member/unittests/decompress_privkey-test.cc b/epid/member/unittests/decompress_privkey-test.cc
new file mode 100644
index 0000000..1ba2453
--- /dev/null
+++ b/epid/member/unittests/decompress_privkey-test.cc
@@ -0,0 +1,98 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief DecompressPrivKey unit tests.
+ */
+#include <cstring>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/member/unittests/member-testhelper.h"
+
+bool operator==(PrivKey const& lhs, PrivKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+namespace {
+
+TEST_F(EpidMemberTest, DecompressPrivKeyFailsGivenNullParameters) {
+ auto const& pub_key = this->kGrpXKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(nullptr, &compressed_privkey, &priv_key));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, nullptr, &priv_key));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, nullptr));
+}
+
+TEST_F(EpidMemberTest, CanDecompressPrivKeyGivenValidCompressedKey) {
+ auto const& pub_key = this->kGrpXKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ auto const& expected_decompressed_key = this->kGrpXMember9PrivKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidNoErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, &priv_key));
+ EXPECT_EQ(expected_decompressed_key, priv_key);
+}
+
+TEST_F(EpidMemberTest, DecompressPrivKeyFailsGivenKeysMissmatch) {
+ auto const& pub_key = this->kGrpYKey;
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey, &priv_key));
+}
+
+TEST_F(EpidMemberTest, DecompressPrivKeyFailsGivenInvalidGroupKey) {
+ // Test for cases when h1 or w of group public key are invalid.
+ // Note h2 of group public key is not used for key decompression.
+ auto const& compressed_privkey = this->kGrpXMember9CompressedKey;
+ PrivKey priv_key = {};
+
+ auto pub_key_h1 = this->kGrpXKey;
+ pub_key_h1.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key_h1, &compressed_privkey, &priv_key));
+
+ auto pub_key_w = this->kGrpXKey;
+ pub_key_w.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key_w, &compressed_privkey, &priv_key));
+}
+
+TEST_F(EpidMemberTest, DecompressPrivKeyFailsGivenInvalidCompressedKey) {
+ auto const& pub_key = this->kGrpXKey;
+ PrivKey priv_key = {};
+
+ auto compressed_privkey_ax = this->kGrpXMember9CompressedKey;
+ compressed_privkey_ax.ax.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidDecompressPrivKey(&pub_key, &compressed_privkey_ax, &priv_key));
+
+ auto compressed_privkey_seed = this->kGrpXMember9CompressedKey;
+ compressed_privkey_seed.seed.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, EpidDecompressPrivKey(
+ &pub_key, &compressed_privkey_seed, &priv_key));
+}
+
+} // namespace
diff --git a/epid/member/unittests/get_sigsize-test.cc b/epid/member/unittests/get_sigsize-test.cc
new file mode 100644
index 0000000..50858b9
--- /dev/null
+++ b/epid/member/unittests/get_sigsize-test.cc
@@ -0,0 +1,97 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief GetSigSize unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/member/unittests/member-testhelper.h"
+
+namespace {
+
+TEST_F(EpidMemberTest, GetSigSizeReturnsSizeofBasicSigGivenNullPointer) {
+ size_t sig_size_without_sig_rl = sizeof(EpidSignature) - sizeof(NrProof);
+ EXPECT_EQ(sig_size_without_sig_rl, EpidGetSigSize(nullptr));
+}
+
+TEST_F(EpidMemberTest, GetSigSizeReturnsCorrectValueGivenValidSigRl) {
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ OctStr32 octstr32_1 = {0x00, 0x00, 0x00, 0x01};
+ OctStr32 octstr32_2 = {0x00, 0x00, 0x00, 0x02};
+ OctStr32 octstr32_16 = {0x00, 0x00, 0x00, 0x10};
+ OctStr32 octstr32_256 = {0x00, 0x00, 0x01, 0x00};
+ OctStr32 octstr32_65536 = {0x00, 0x01, 0x00, 0x00};
+ OctStr32 octstr32_4294967295 = {0xff, 0xff, 0xff, 0xff};
+
+ size_t one_entry_size = sizeof(NrProof);
+ size_t sig_size_0_entries = sizeof(EpidSignature) - one_entry_size;
+ size_t sig_size_1_entry = sig_size_0_entries + one_entry_size;
+ size_t sig_size_2_entries = sig_size_0_entries + 2 * one_entry_size;
+ size_t sig_size_16_entries = sig_size_0_entries + 16 * one_entry_size;
+ size_t sig_size_256_entries = sig_size_0_entries + 256 * one_entry_size;
+ size_t sig_size_65536_entries = sig_size_0_entries + 65536 * one_entry_size;
+ // no entries
+ srl.n2 = octstr32_0;
+ EXPECT_EQ(sig_size_0_entries, EpidGetSigSize(&srl));
+ // 1 entry
+ srl.n2 = octstr32_1;
+ EXPECT_EQ(sig_size_1_entry, EpidGetSigSize(&srl));
+ // 2 entries
+ srl.n2 = octstr32_2;
+ EXPECT_EQ(sig_size_2_entries, EpidGetSigSize(&srl));
+ // 16 entries
+ srl.n2 = octstr32_16;
+ EXPECT_EQ(sig_size_16_entries, EpidGetSigSize(&srl));
+ // 256 entries
+ srl.n2 = octstr32_256;
+ EXPECT_EQ(sig_size_256_entries, EpidGetSigSize(&srl));
+ // 65536 entries
+ srl.n2 = octstr32_65536;
+ EXPECT_EQ(sig_size_65536_entries, EpidGetSigSize(&srl));
+ // 4294967295 entries
+ srl.n2 = octstr32_4294967295;
+#if (SIZE_MAX <= 0xFFFFFFFF) // When size_t value is 32 bit or lower
+ EXPECT_EQ(sig_size_0_entries, EpidGetSigSize(&srl));
+#else
+ size_t sig_size_4294967295_entries =
+ sig_size_0_entries + 4294967295 * one_entry_size;
+ EXPECT_EQ(sig_size_4294967295_entries, EpidGetSigSize(&srl));
+#endif
+}
+
+TEST_F(EpidMemberTest,
+ GetSigSizeReturnsCorrectValueGivenValidSigRlUsingIKGFData) {
+ const std::vector<uint8_t> sigrl_bin = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+ };
+
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(sigrl_bin.data());
+ size_t sig_size_3_entries =
+ sizeof(EpidSignature) - sizeof(NrProof) + 3 * sizeof(NrProof);
+ // 3 entries
+ EXPECT_EQ(sig_size_3_entries, EpidGetSigSize(sig_rl));
+}
+
+} // namespace
diff --git a/epid/member/unittests/iskeyvalid-test.cc b/epid/member/unittests/iskeyvalid-test.cc
new file mode 100644
index 0000000..87c8837
--- /dev/null
+++ b/epid/member/unittests/iskeyvalid-test.cc
@@ -0,0 +1,198 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// IsKeyValid unit tests.
+/*! \file */
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/src/validatekey.h"
+}
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+namespace {
+
+////////////////////////////////////////////////
+// EpidMemberIsKeyValid
+TEST_F(EpidMemberTest, EpidMemberIsKeyValidFailsGivenNullPointer) {
+ // create
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+
+ // provision
+ HashAlg hash_alg = kSha256;
+ const GroupPubKey pub_key = this->kGroupPublicKey;
+ const PrivKey priv_key = this->kMemberPrivateKey;
+
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, hash_alg));
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey, &this->kMemberPrecomp));
+
+ EXPECT_FALSE(EpidMemberIsKeyValid(nullptr, &priv_key.A, &priv_key.x,
+ &pub_key.h1, &pub_key.w));
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, nullptr, &priv_key.x, &pub_key.h1,
+ &pub_key.w));
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &priv_key.A, nullptr, &pub_key.h1,
+ &pub_key.w));
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &priv_key.A, &priv_key.x, nullptr,
+ &pub_key.w));
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &priv_key.A, &priv_key.x,
+ &pub_key.h1, nullptr));
+}
+
+TEST_F(EpidMemberTest, EpidMemberIsKeyValidSucceedsForSha256) {
+ // create
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+
+ // provision
+ HashAlg hash_alg = kSha256;
+ const GroupPubKey pub_key = this->kGroupPublicKey;
+ const PrivKey priv_key = this->kMemberPrivateKey;
+
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, hash_alg));
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey, &this->kMemberPrecomp));
+ EXPECT_TRUE(EpidMemberIsKeyValid(member, &priv_key.A, &priv_key.x,
+ &pub_key.h1, &pub_key.w));
+}
+
+TEST_F(EpidMemberTest, EpidMemberIsKeyValidFailsGivenIncorrectKeys) {
+ // create
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+
+ // provision
+ HashAlg hash_alg = kSha256;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, hash_alg));
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey, &this->kMemberPrecomp));
+
+ // check the key is valid
+ EXPECT_TRUE(EpidMemberIsKeyValid(member, &priv_key.A, &priv_key.x,
+ &pub_key.h1, &pub_key.w));
+
+ // check key is invalid with incorrect data
+ PrivKey tmp_priv_key = priv_key;
+ tmp_priv_key.A.x.data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &priv_key.x,
+ &pub_key.h1, &pub_key.w));
+
+ tmp_priv_key = priv_key;
+ tmp_priv_key.A.y.data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &tmp_priv_key.x,
+ &pub_key.h1, &pub_key.w));
+
+ tmp_priv_key = priv_key;
+ tmp_priv_key.x.data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &tmp_priv_key.x,
+ &pub_key.h1, &pub_key.w));
+
+ GroupPubKey tmp_pub_key = pub_key;
+ tmp_pub_key.h1.x.data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &priv_key.x,
+ &tmp_pub_key.h1, &tmp_pub_key.w));
+
+ tmp_pub_key = pub_key;
+ tmp_pub_key.h1.y.data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &priv_key.x,
+ &tmp_pub_key.h1, &tmp_pub_key.w));
+
+ tmp_pub_key = pub_key;
+ tmp_pub_key.w.x->data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &priv_key.x,
+ &tmp_pub_key.h1, &tmp_pub_key.w));
+
+ tmp_pub_key = pub_key;
+ tmp_pub_key.w.y->data.data[31] -= 1;
+ EXPECT_FALSE(EpidMemberIsKeyValid(member, &tmp_priv_key.A, &priv_key.x,
+ &tmp_pub_key.h1, &tmp_pub_key.w));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_EpidMemberIsKeyValidSucceedsByCredentialForSha256_EPS0) {
+ // create
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+
+ // provision
+ HashAlg hash_alg = kSha256;
+ const GroupPubKey eps0_pub_key = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x07, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+ };
+
+ const PrivKey eps0_priv_key = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xae, 0x5a, 0x18, 0x8d, 0xc8, 0xa9, 0xe2, 0x5c, 0xdf, 0xef, 0x62,
+ 0x6b, 0x34, 0xdf, 0x0d, 0xf2, 0xf6, 0xcf, 0x6a, 0x4d, 0x68, 0x88,
+ 0xc8, 0x12, 0x08, 0xae, 0xb6, 0x30, 0x54, 0xdf, 0xa7, 0xdc}}},
+ {{{0xec, 0x39, 0x86, 0x7b, 0x5c, 0x5e, 0x28, 0x17, 0x5b, 0xfe, 0x93,
+ 0xa1, 0x31, 0x8a, 0x82, 0x99, 0xb0, 0x84, 0x8c, 0x90, 0xc5, 0x54,
+ 0x2c, 0x6d, 0xff, 0x75, 0xcf, 0x05, 0x6e, 0x2b, 0x6c, 0xf3}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x7a, 0x57, 0x41, 0x5b, 0x85, 0x44, 0x0e, 0x2b, 0xb3, 0xcc, 0xa7,
+ 0x99, 0x6d, 0x19, 0x79, 0x45, 0x04, 0xb8, 0x94, 0x07, 0x47, 0x14,
+ 0xed, 0x8d, 0xf4, 0x1e, 0x7d, 0xa0, 0x17, 0xc5, 0xc4, 0x10} // f
+ };
+
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, hash_alg));
+ EXPECT_TRUE(EpidMemberIsKeyValid(member, &eps0_priv_key.A, &eps0_priv_key.x,
+ &eps0_pub_key.h1, &eps0_pub_key.w));
+}
+} // namespace
diff --git a/epid/member/unittests/join_request-test.cc b/epid/member/unittests/join_request-test.cc
new file mode 100644
index 0000000..d61347a
--- /dev/null
+++ b/epid/member/unittests/join_request-test.cc
@@ -0,0 +1,380 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Join Request related unit tests.
+ */
+
+#include <cstring>
+#include <memory>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/member/api.h"
+}
+
+#include "epid/common-testhelper/ecgroup_wrapper-testhelper.h"
+#include "epid/common-testhelper/ecpoint_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/ffelement_wrapper-testhelper.h"
+#include "epid/common-testhelper/finite_field_wrapper-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/src/context.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+/// compares FpElemStr values
+bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares JoinRequest values
+bool operator==(JoinRequest const& lhs, JoinRequest const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// compares JoinRequest values for inequality
+bool operator!=(JoinRequest const& lhs, JoinRequest const& rhs) {
+ return 0 != std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+namespace {
+
+// local constant for Join Request tests. This can be hoisted later if needed
+// avoids cpplint warning about multiple includes.
+const GroupPubKey kPubKey = {
+#include "epid/common-testhelper/testdata/grp01/gpubkey.inc"
+};
+
+const FpElemStr kFEps1 = {0x56, 0x57, 0xda, 0x39, 0x9f, 0x69, 0x17, 0x84,
+ 0xac, 0xf9, 0xf6, 0xdf, 0xfe, 0xd2, 0x41, 0xe8,
+ 0x02, 0x30, 0xf8, 0xd8, 0x72, 0x35, 0xd3, 0x0e,
+ 0x76, 0x2e, 0xda, 0x4b, 0xf4, 0xc5, 0x31, 0x0f};
+/// Validates join request.
+void ValidateJoinRequest(JoinRequest const& request, HashAlg hash_alg,
+ GroupPubKey const& grp_public_key, FpElemStr const& f,
+ IssuerNonce const& ni) {
+ Epid2Params params_values = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ Epid20Params params;
+
+ // h1^f ?= F
+ EcPointObj F_expected(&params.G1, grp_public_key.h1);
+ THROW_ON_EPIDERR(EcExp(params.G1, F_expected, (BigNumStr*)&f, F_expected));
+ ASSERT_EQ(*(G1ElemStr*)(F_expected.data().data()), request.F);
+
+ // H(p|g1|g2|h1|h2|w|F|R|ni) ?= c, where R = h1^s * F^(-c)
+ FfElementObj nc(&params.fp, request.c);
+ THROW_ON_EPIDERR(FfNeg(params.fp, nc, nc));
+ EcPointObj a(&params.G1, grp_public_key.h1);
+ EcPointObj b(&params.G1, request.F);
+ THROW_ON_EPIDERR(EcExp(params.G1, a, (BigNumStr*)&request.s, a));
+ THROW_ON_EPIDERR(EcExp(params.G1, b, (BigNumStr*)nc.data().data(), b));
+ THROW_ON_EPIDERR(EcMul(params.G1, a, b, a));
+
+#pragma pack(1)
+ struct {
+ BigNumStr p; // Intel(R) EPID 2.0 parameter p
+ G1ElemStr g1; // Intel(R) EPID 2.0 parameter g1
+ G2ElemStr g2; // Intel(R) EPID 2.0 parameter g2
+ G1ElemStr h1; // Group public key value h1
+ G1ElemStr h2; // Group public key value h2
+ G2ElemStr w; // Group public key value w
+ G1ElemStr F; // Variable F computed in algorithm
+ G1ElemStr R; // Variable R computed in algorithm
+ IssuerNonce NI; // Issuer Nonce
+ } commitment_values = {params_values.p,
+ params_values.g1,
+ params_values.g2,
+ grp_public_key.h1,
+ grp_public_key.h2,
+ grp_public_key.w,
+ request.F,
+ *(G1ElemStr*)(a.data().data()),
+ ni};
+#pragma pack()
+
+ FfElementObj commitment(&params.fp);
+ THROW_ON_EPIDERR(FfHash(params.fp, &commitment_values,
+ sizeof commitment_values, hash_alg, commitment));
+ ASSERT_EQ(*(FpElemStr*)(commitment.data().data()), request.c);
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenNullParameters) {
+ GroupPubKey pub_key = kPubKey;
+ IssuerNonce ni;
+ MemberParams params;
+ Prng prng;
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj ctx(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(nullptr, &pub_key, &ni, &join_request));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(ctx, nullptr, &ni, &join_request));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(ctx, &pub_key, nullptr, &join_request));
+ EXPECT_EQ(kEpidBadArgErr, EpidCreateJoinRequest(ctx, &pub_key, &ni, nullptr));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenInvalidGroupKey) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ pub_key.h1.x.data.data[15] = 0xff;
+ Epid20Params epid_params;
+ EcPointObj pt(&epid_params.G1);
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ ASSERT_NE(kEpidNoErr, ReadEcPoint(epid_params.G1, (uint8_t*)&pub_key.h1,
+ sizeof(pub_key.h1), pt));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestFailsGivenInvalidFValue) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ EpidStatus sts;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+
+ std::unique_ptr<uint8_t[]> member;
+ size_t context_size = 0;
+ sts = EpidMemberGetSize(&params, &context_size);
+ EXPECT_TRUE(kEpidNoErr == sts || kEpidBadArgErr == sts)
+ << "Actual value " << sts;
+
+ if (kEpidNoErr == sts) {
+ member.reset(new uint8_t[context_size]());
+ sts = EpidMemberInit(&params, (MemberCtx*)member.get());
+ EXPECT_TRUE(kEpidNoErr == sts || kEpidBadArgErr == sts)
+ << "Actual value " << sts;
+ }
+
+ if (kEpidNoErr == sts) {
+ sts = EpidCreateJoinRequest((MemberCtx*)member.get(), &pub_key, &ni,
+ &join_request);
+ EXPECT_EQ(kEpidBadArgErr, sts);
+ }
+
+ EpidMemberDeinit((MemberCtx*)member.get());
+}
+
+TEST_F(EpidMemberTest, CreateJoinRequestWorksGivenValidParameters) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha256, pub_key, f, ni));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_EPS1_CreateJoinRequestUsingWorksGivenValidParameters) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha256, pub_key, kFEps1, ni));
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestGeneratesDiffJoinRequestsOnMultipleCalls) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request1;
+ JoinRequest join_request2;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request1));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request1, kSha256, pub_key, f, ni));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request2));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request2, kSha256, pub_key, f, ni));
+ EXPECT_NE(join_request1, join_request2);
+}
+
+TEST_F(
+ EpidMemberTest,
+ PROTECTED_EPS1_CreateJoinRequestGeneratesDiffJoinRequestsOnMultipleCalls) {
+ Prng prng;
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request1;
+ JoinRequest join_request2;
+ SetMemberParams(Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request1));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request1, kSha256, pub_key, kFEps1, ni));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, &pub_key, &ni, &join_request2));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request2, kSha256, pub_key, kFEps1, ni));
+ EXPECT_NE(join_request1, join_request2);
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestGeneratesDiffJoinRequestsGivenDiffHashAlgs) {
+ MemberParams params = {0};
+ GroupPubKey pub_key = kPubKey;
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request1;
+ JoinRequest join_request2;
+ // Ensure that two members created with equal seed and do not
+ // interfere each other. Member1 is deleted by the time member2
+ // is created.
+ {
+ Prng prng;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member1(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member1, kSha256));
+ prng.set_seed(0x1234);
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member1, &pub_key, &ni, &join_request1));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request1, kSha256, pub_key, f, ni));
+ }
+ {
+ Prng prng;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member2(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member2, kSha384));
+ prng.set_seed(0x1234);
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member2, &pub_key, &ni, &join_request2));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request2, kSha384, pub_key, f, ni));
+ }
+ EXPECT_NE(join_request1, join_request2);
+}
+
+TEST_F(EpidMemberTest,
+ CreateJoinRequestWorksGivenValidParametersUsingIKGFData) {
+ Prng prng;
+ MemberParams params = {0};
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ FpElemStr f = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ };
+ IssuerNonce ni = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
+ };
+ JoinRequest join_request;
+ SetMemberParams(Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidCreateJoinRequest(member, pub_key, &ni, &join_request));
+ EXPECT_NO_FATAL_FAILURE(
+ ValidateJoinRequest(join_request, kSha256, *pub_key, f, ni));
+}
+} // namespace
diff --git a/epid/member/unittests/main-test.cc b/epid/member/unittests/main-test.cc
new file mode 100644
index 0000000..eb29e33
--- /dev/null
+++ b/epid/member/unittests/main-test.cc
@@ -0,0 +1,66 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Main entry point for unit tests.
+ */
+
+#include "epid/common-testhelper/testapp-testhelper.h"
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ std::vector<std::string> positive;
+ std::vector<std::string> negative;
+ std::vector<char*> argv_new;
+ argv_new.push_back(argv[0]);
+ bool include_protected = false;
+ bool print_help = false;
+ for (int i = 1; i < argc; i++) {
+ std::string arg(argv[i]);
+ if (arg == std::string("--also_run_protected_tests")) {
+ include_protected = true;
+ } else if (arg == std::string("--help")) {
+ print_help = true;
+ argv_new.push_back(argv[i]);
+ } else if (arg.compare(0, 15, "--gtest_filter=") == 0) {
+ split_filter(&positive, &negative, arg.substr(15));
+ } else {
+ argv_new.push_back(argv[i]);
+ }
+ }
+ if (!include_protected) {
+ negative.push_back("*.*_PROTECTED_*");
+ negative.push_back("*.PROTECTED_*");
+ }
+ std::string filter = join_filter(positive, negative);
+ if (filter != "") {
+ argv_new.push_back(&filter[0]);
+ }
+ int argc_new = (int)argv_new.size();
+ argv_new.push_back(nullptr);
+ testing::InitGoogleTest(&argc_new, argv_new.data());
+ if (print_help) {
+ printf("\n");
+ printf("Custom Options:\n");
+ printf(" --also_run_protected_tests\n");
+ printf(" similar to --gtest_also_run_disabled_tests, but for\n");
+ printf(" protected tests (PROTECTED_ instead of DISABLED_)\n");
+ printf("\n");
+ printf("Protected tests are tests where some data is protected\n");
+ printf("(i.e. hidden) from the code and can only be used indirectly.\n");
+ }
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/member/unittests/member-testhelper.cc b/epid/member/unittests/member-testhelper.cc
new file mode 100644
index 0000000..3503f1f
--- /dev/null
+++ b/epid/member/unittests/member-testhelper.cc
@@ -0,0 +1,436 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member C++ wrapper implementation.
+ */
+
+#include "epid/member/unittests/member-testhelper.h"
+
+#include <cstdio>
+#include <cstring>
+#include <string>
+
+extern "C" {
+#include "epid/common/types.h"
+}
+
+#include "epid/common-testhelper/mem_params-testhelper.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+/// Arbitrary test data were generated based on Intel(R) EPID 2.0 parameters
+const GroupPubKey EpidMemberTest::kGroupPublicKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x7, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+};
+
+const PrivKey EpidMemberTest::kMemberPrivateKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0x46, 0xc9, 0x69, 0xee, 0xf4, 0x68, 0xe1, 0x5f, 0xac, 0xbf, 0xdd,
+ 0x77, 0xeb, 0x4c, 0xaf, 0x8a, 0x87, 0x68, 0x3f, 0x4e, 0xda, 0xf2,
+ 0x96, 0xec, 0x57, 0x08, 0x90, 0xe8, 0x19, 0x62, 0x54, 0xdb}}},
+ {{{0x1e, 0x52, 0x23, 0x16, 0x91, 0xe4, 0xa8, 0x1d, 0x9a, 0x1b, 0x8a,
+ 0xad, 0x0a, 0xcf, 0x36, 0x4f, 0xae, 0x43, 0xde, 0x62, 0xff, 0xa6,
+ 0x4b, 0xa8, 0x16, 0x24, 0x98, 0x80, 0x82, 0x80, 0x37, 0x77}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x48, 0x40, 0xb5, 0x6c, 0x6d, 0x47, 0x09, 0x0b, 0x05, 0xd6, 0x43,
+ 0x56, 0xe0, 0x7c, 0xc6, 0x8e, 0xa1, 0x65, 0x67, 0xfd, 0xa7, 0x07,
+ 0x87, 0x9b, 0x36, 0x2d, 0x41, 0x35, 0x63, 0x61, 0x31, 0xc7} // f
+};
+
+const MemberPrecomp EpidMemberTest::kMemberPrecomp = {
+ {0xd8, 0x14, 0xba, 0x4b, 0x44, 0x03, 0x55, 0x6c, 0xf6, 0x42, 0xe8,
+ 0xf0, 0x4c, 0xb5, 0xe7, 0xd4, 0xa2, 0xa3, 0x69, 0x47, 0xf5, 0xd4,
+ 0xc8, 0xe9, 0xc5, 0x5a, 0x39, 0xb5, 0x55, 0xa5, 0xd3, 0xfb, 0xf3,
+ 0x85, 0x5a, 0x0d, 0xd5, 0xee, 0xde, 0xf4, 0xa8, 0xb1, 0x8b, 0xcf,
+ 0xa9, 0x0d, 0x29, 0xbf, 0x86, 0x27, 0x9c, 0x1f, 0x96, 0xed, 0xd8,
+ 0x44, 0x01, 0x35, 0x1a, 0xce, 0xfd, 0x4e, 0x6f, 0xa1, 0x66, 0x0d,
+ 0x59, 0x08, 0x6d, 0xa2, 0xe4, 0x99, 0x83, 0xdc, 0x39, 0x28, 0xb7,
+ 0x1c, 0x1a, 0x33, 0xad, 0xca, 0x5c, 0x35, 0x26, 0x1f, 0xab, 0xba,
+ 0x0d, 0x53, 0xaf, 0xe0, 0x72, 0x14, 0xc5, 0xa7, 0x2e, 0x58, 0x26,
+ 0xc9, 0x8e, 0xfa, 0x6f, 0x62, 0xfc, 0xf0, 0x08, 0x3e, 0xa3, 0x11,
+ 0x3a, 0xf0, 0xb8, 0x3b, 0x2d, 0x3e, 0xec, 0xd5, 0xbc, 0xf2, 0x05,
+ 0x68, 0xf4, 0x40, 0xce, 0x2c, 0x8f, 0xdd, 0xa4, 0xe5, 0xe1, 0xb5,
+ 0xbe, 0xbd, 0x3e, 0xd4, 0xf6, 0x9a, 0xb3, 0x37, 0x24, 0x0d, 0xea,
+ 0x13, 0xd7, 0x1f, 0xa2, 0x75, 0x68, 0xa1, 0xbe, 0x2c, 0x01, 0x42,
+ 0x2a, 0xae, 0x6f, 0xae, 0x7a, 0x72, 0x3a, 0x11, 0x03, 0x58, 0x02,
+ 0x0d, 0xf0, 0xb0, 0xd9, 0x6f, 0xb1, 0xe4, 0xf2, 0x70, 0xb8, 0xff,
+ 0x22, 0x56, 0x7c, 0xb3, 0x80, 0xfd, 0xdf, 0xe5, 0xab, 0xcc, 0x18,
+ 0x7a, 0xfd, 0x91, 0xd0, 0xb0, 0x63, 0x40, 0xd4, 0x71, 0xfa, 0x03,
+ 0xf5, 0xf1, 0x26, 0xe1, 0xa5, 0x5a, 0xd9, 0x6d, 0xf5, 0x5a, 0x7b,
+ 0x2a, 0x3a, 0xfe, 0x94, 0x9e, 0x74, 0x41, 0x79, 0x49, 0x7e, 0x48,
+ 0x1d, 0x58, 0x5e, 0xf6, 0x98, 0xa3, 0x6e, 0x61, 0x8e, 0x9f, 0x1f,
+ 0xcd, 0x15, 0x01, 0x16, 0xa5, 0xe0, 0xab, 0xd6, 0xd6, 0x1f, 0x1c,
+ 0xf5, 0x81, 0x76, 0xc1, 0xec, 0x10, 0xc2, 0xcc, 0x68, 0x59, 0x4d,
+ 0x47, 0xef, 0x4b, 0x7f, 0xd8, 0x78, 0x9c, 0xfe, 0x9a, 0x86, 0x7e,
+ 0x0c, 0xfd, 0x3e, 0x0a, 0x7a, 0x72, 0x8b, 0x14, 0x5f, 0xe6, 0x5f,
+ 0x19, 0xa3, 0x0a, 0x1b, 0x71, 0xdc, 0xd2, 0xae, 0x35, 0xc3, 0x11,
+ 0xa5, 0xd3, 0xea, 0xe1, 0xa9, 0xe7, 0x70, 0x0c, 0x7a, 0x39, 0x56,
+ 0x3c, 0xe4, 0xe7, 0xf9, 0xb6, 0xf1, 0x15, 0x40, 0xab, 0xb6, 0xc4,
+ 0xad, 0xbd, 0xf4, 0xcc, 0x13, 0xb7, 0xa8, 0xb6, 0x92, 0x1e, 0x72,
+ 0x27, 0xa7, 0xff, 0xd9, 0xea, 0x2f, 0x91, 0x96, 0x22, 0xd2, 0xc4,
+ 0x4d, 0x80, 0xdc, 0x47, 0x66, 0x87, 0xcc, 0xcf, 0xc5, 0x64, 0xf7,
+ 0xb2, 0x34, 0xed, 0xd5, 0x44, 0x44, 0xcc, 0x57, 0x41, 0xc7, 0x92,
+ 0xb7, 0x5c, 0x12, 0xf7, 0x81, 0xf2, 0x92, 0x35, 0x3e, 0x4b, 0xdf,
+ 0xf8, 0xda, 0x68, 0xac, 0x30, 0xe3, 0xdd, 0x9e, 0x22, 0xaa, 0x6d,
+ 0x77, 0xdd, 0xac, 0xd9, 0x11, 0x6e, 0xfb, 0x1a, 0x88, 0xb3}, // e12
+ {
+ 0x07, 0x3f, 0x9d, 0x47, 0x82, 0xb8, 0x3d, 0x6a, 0xe0, 0x36, 0xab, 0xa6,
+ 0xfa, 0xe6, 0xd2, 0x1c, 0xc8, 0xb2, 0xd0, 0x01, 0xd4, 0x96, 0xdc, 0x2e,
+ 0xf8, 0x19, 0xdc, 0x70, 0x1b, 0xf9, 0x73, 0x0c, 0x2b, 0xc2, 0xe2, 0x1d,
+ 0x85, 0x53, 0x81, 0x51, 0xfb, 0xca, 0x16, 0x86, 0xd4, 0x4e, 0xfd, 0x1a,
+ 0x59, 0xe3, 0x97, 0xc4, 0x7f, 0x99, 0xd8, 0x66, 0x08, 0xa1, 0xe4, 0x9f,
+ 0xbb, 0x3a, 0xce, 0xa5, 0x23, 0x9c, 0x83, 0x13, 0xc5, 0xc8, 0xf2, 0x16,
+ 0x1e, 0xe8, 0xe6, 0xc5, 0x36, 0x57, 0x2c, 0xdf, 0x73, 0xb4, 0xe2, 0xb2,
+ 0xcb, 0xeb, 0xbb, 0xf7, 0x45, 0xd1, 0x44, 0xbd, 0x6e, 0x92, 0x95, 0x00,
+ 0xe5, 0x89, 0xb5, 0x91, 0x78, 0xc7, 0x44, 0xb1, 0x2f, 0x37, 0xdf, 0xfb,
+ 0xe7, 0x8a, 0x44, 0x3f, 0x3d, 0x06, 0x5f, 0x5b, 0x1c, 0x5f, 0xce, 0x11,
+ 0x05, 0x35, 0x3c, 0xad, 0x92, 0x7e, 0x79, 0xb8, 0xff, 0x28, 0x05, 0xe4,
+ 0x04, 0x2c, 0xb6, 0x1d, 0x22, 0xab, 0x36, 0x00, 0x5f, 0x74, 0xf1, 0xe3,
+ 0xf6, 0xa6, 0x68, 0xe6, 0x7b, 0x25, 0xb8, 0xcf, 0x19, 0xb0, 0x1a, 0xdd,
+ 0x0f, 0xad, 0x63, 0x73, 0x62, 0x1b, 0xe7, 0x94, 0x5d, 0xbf, 0x3d, 0xf1,
+ 0xf9, 0x8e, 0xab, 0x59, 0xe5, 0xd1, 0x7c, 0x62, 0xdd, 0xbc, 0x40, 0x07,
+ 0x70, 0x5b, 0x13, 0xf6, 0x12, 0x09, 0xb4, 0x0d, 0x3e, 0xab, 0x8b, 0x70,
+ 0x60, 0x1d, 0xd4, 0x61, 0x37, 0x28, 0x98, 0x3e, 0x7e, 0xdc, 0xfd, 0xd2,
+ 0xc0, 0x2f, 0x4b, 0x71, 0x31, 0x34, 0xd7, 0x69, 0x41, 0x5e, 0xaa, 0x72,
+ 0xe4, 0xdf, 0xeb, 0xfe, 0x8d, 0xcd, 0x68, 0xfc, 0x68, 0x55, 0xbe, 0x32,
+ 0x7d, 0x24, 0xc5, 0x07, 0x0f, 0xa8, 0xbd, 0x5a, 0xfe, 0xe7, 0xec, 0xdb,
+ 0xfd, 0x19, 0xc8, 0xa9, 0x20, 0xa2, 0x7f, 0x6c, 0xa6, 0x62, 0xec, 0xed,
+ 0x9b, 0x79, 0xbf, 0x9c, 0x0e, 0x31, 0x0b, 0x25, 0x2f, 0xd3, 0xcc, 0xa0,
+ 0xdd, 0xb2, 0xf2, 0x69, 0x26, 0x85, 0x21, 0x06, 0x94, 0x56, 0x5f, 0x59,
+ 0x5c, 0xf5, 0xb7, 0x82, 0xce, 0x0f, 0xdd, 0x40, 0xdb, 0x83, 0xac, 0x3c,
+ 0x41, 0xa0, 0x1b, 0xb1, 0xaf, 0xda, 0x55, 0xbf, 0x6b, 0x1a, 0xef, 0xe6,
+ 0x90, 0xe7, 0xaa, 0x0f, 0x04, 0x3c, 0x9f, 0x5b, 0xb7, 0xcd, 0x98, 0xa8,
+ 0x9e, 0xff, 0x54, 0x26, 0xc8, 0xd5, 0x5c, 0x30, 0x5e, 0xa2, 0x99, 0x8e,
+ 0x34, 0xd5, 0x98, 0x9f, 0xcd, 0x57, 0xd1, 0x4d, 0x1d, 0xee, 0x01, 0x5d,
+ 0x5a, 0x6d, 0xb2, 0xf1, 0xcf, 0x4b, 0xc0, 0x21, 0x23, 0x96, 0x05, 0xf9,
+ 0xc9, 0x66, 0xe5, 0x25, 0x9d, 0xa3, 0x8e, 0x78, 0x43, 0x19, 0xc1, 0x7f,
+ 0x7b, 0xef, 0xf5, 0xed, 0x00, 0xb7, 0x45, 0x1f, 0x4e, 0xa9, 0xfa, 0xe3,
+ 0xff, 0x54, 0xf2, 0x21, 0x73, 0xf8, 0x6b, 0xa1, 0xc7, 0x31, 0x4d, 0x6a,
+ }, // e22
+ {
+ 0x49, 0x0d, 0x0f, 0x2a, 0x5c, 0x6a, 0x3b, 0xad, 0x71, 0xc9, 0x22, 0x49,
+ 0xe8, 0x08, 0xdd, 0xba, 0x79, 0x57, 0xb7, 0xc7, 0x61, 0xe4, 0xdb, 0x84,
+ 0x68, 0x57, 0xb9, 0x30, 0x83, 0xa4, 0xdc, 0xef, 0x70, 0x93, 0x28, 0xe2,
+ 0x6f, 0xb9, 0xbc, 0x15, 0x28, 0x3a, 0x30, 0xbd, 0x96, 0x83, 0xdb, 0xf2,
+ 0x9d, 0x1e, 0xc7, 0x64, 0x6d, 0x2e, 0x7c, 0xa2, 0xf3, 0xaa, 0x2f, 0x4b,
+ 0x6d, 0x86, 0x9e, 0x48, 0x20, 0x29, 0x4b, 0x1f, 0x8d, 0xc2, 0x93, 0xc3,
+ 0x55, 0x25, 0x8e, 0xb0, 0x8a, 0x7e, 0x64, 0x45, 0x3f, 0xf4, 0x1d, 0x16,
+ 0x4c, 0x88, 0x2d, 0x54, 0xbe, 0xa8, 0x67, 0x70, 0x81, 0xc5, 0xb9, 0x5c,
+ 0x16, 0x00, 0xef, 0x78, 0xf6, 0x4d, 0x6a, 0xeb, 0xfd, 0xa2, 0x0d, 0x52,
+ 0x86, 0xf3, 0x04, 0x4b, 0xd8, 0xf0, 0x7d, 0x50, 0x8b, 0xad, 0xc0, 0x37,
+ 0xdb, 0x38, 0xf2, 0x7d, 0x1f, 0x8b, 0x13, 0x83, 0x7b, 0xcc, 0xe8, 0x25,
+ 0xfe, 0xfa, 0x0c, 0x02, 0x05, 0x2e, 0x75, 0x12, 0xa1, 0x0a, 0x89, 0xab,
+ 0xf1, 0xb2, 0x08, 0x47, 0x9a, 0xea, 0xef, 0x1d, 0xa4, 0x9f, 0xde, 0x89,
+ 0x47, 0x3e, 0x7c, 0x5e, 0x4a, 0x40, 0xdc, 0xec, 0xc5, 0x1b, 0x7e, 0x33,
+ 0x0a, 0x19, 0x69, 0x27, 0xa6, 0xcc, 0x25, 0xfc, 0xf9, 0xeb, 0xbd, 0xb7,
+ 0x8a, 0xdb, 0x45, 0x5f, 0x9d, 0x9e, 0x01, 0xde, 0x3d, 0x91, 0x10, 0x99,
+ 0x13, 0xbf, 0xc0, 0xfa, 0x9d, 0xd4, 0x0f, 0xb3, 0x09, 0xf3, 0xa1, 0xae,
+ 0x68, 0xe1, 0x1b, 0x48, 0x85, 0x9f, 0x81, 0x66, 0x91, 0xe2, 0xf0, 0x7b,
+ 0x29, 0xdb, 0x8f, 0x5d, 0x99, 0xa9, 0xd3, 0x39, 0x30, 0xd9, 0x1b, 0x94,
+ 0x2a, 0x1c, 0x5c, 0xe9, 0xc0, 0x3f, 0x6e, 0xb2, 0x27, 0xbe, 0x74, 0x7a,
+ 0xca, 0xe1, 0x0f, 0x6a, 0x43, 0x2e, 0x98, 0x65, 0xaf, 0x7f, 0x6e, 0x5a,
+ 0x55, 0x98, 0xc1, 0x58, 0x29, 0xb3, 0x86, 0x54, 0x0f, 0x57, 0x91, 0x89,
+ 0x29, 0xb1, 0x98, 0x79, 0xcc, 0x95, 0x39, 0xd0, 0xab, 0xe0, 0x9f, 0xf3,
+ 0xda, 0xf9, 0x5e, 0xd9, 0x34, 0xbb, 0x72, 0xda, 0xe5, 0x72, 0xd3, 0xf8,
+ 0x9b, 0xf9, 0x14, 0x84, 0x48, 0x81, 0x54, 0x4f, 0xe6, 0x2b, 0x80, 0xc8,
+ 0xc1, 0x79, 0xfe, 0x83, 0xff, 0x76, 0xa3, 0x6d, 0xfe, 0x37, 0x78, 0xc5,
+ 0x30, 0x7a, 0x50, 0xe2, 0x5d, 0x12, 0xdc, 0x72, 0xe9, 0x58, 0x7c, 0x07,
+ 0x4f, 0xff, 0x15, 0x8a, 0x97, 0x3b, 0xcb, 0x60, 0xfa, 0x4e, 0xde, 0x8c,
+ 0x80, 0x3a, 0x8b, 0x0b, 0xc6, 0x1d, 0xa3, 0xce, 0x6a, 0xb3, 0x50, 0x69,
+ 0x03, 0x96, 0xca, 0xc0, 0xb6, 0x94, 0x6f, 0x8f, 0xab, 0x6f, 0x5b, 0x00,
+ 0x2a, 0x1d, 0x90, 0xa7, 0x81, 0xc6, 0x15, 0x77, 0x79, 0xf3, 0x36, 0x23,
+ 0xd1, 0x46, 0x25, 0x58, 0x6f, 0x7b, 0x22, 0xac, 0x4c, 0x7a, 0xf3, 0x9f,
+ }, // e2w
+ {
+ 0x8d, 0x71, 0xe2, 0xb0, 0x73, 0x2f, 0x4a, 0xba, 0x64, 0xe8, 0x7a, 0x12,
+ 0xaf, 0xe4, 0x4f, 0xdb, 0x6b, 0x3e, 0x38, 0x07, 0x0c, 0x79, 0x22, 0x48,
+ 0x1b, 0x9d, 0x33, 0x53, 0x5c, 0x75, 0x3b, 0x40, 0x5e, 0x18, 0xd1, 0x92,
+ 0x4a, 0xd1, 0x82, 0x1c, 0xc7, 0x3a, 0xf7, 0x7e, 0x32, 0x19, 0x99, 0x5d,
+ 0x01, 0x0e, 0xb0, 0xf2, 0x8f, 0x80, 0xc6, 0xb9, 0xeb, 0x1f, 0x9e, 0xae,
+ 0x9e, 0xe0, 0x99, 0xfd, 0xe8, 0x93, 0x11, 0x61, 0x7d, 0xc2, 0x49, 0xdb,
+ 0xa8, 0x73, 0xa4, 0xa9, 0x33, 0xe2, 0x04, 0xd1, 0x7d, 0x8b, 0xe1, 0xd6,
+ 0x2b, 0x10, 0x6c, 0x79, 0x02, 0xbf, 0xfc, 0x53, 0x03, 0xa9, 0xbc, 0x30,
+ 0x4d, 0x4d, 0xf4, 0x32, 0xce, 0x9a, 0x4a, 0xfa, 0xd6, 0x7f, 0x26, 0x17,
+ 0xc5, 0xf6, 0xed, 0xe4, 0xcc, 0xb9, 0x79, 0xe2, 0xa8, 0x86, 0xbb, 0xd7,
+ 0xfb, 0x05, 0xd2, 0x81, 0xbe, 0x07, 0x1c, 0x47, 0x48, 0x4f, 0x6d, 0x6b,
+ 0x52, 0x42, 0xe4, 0xc6, 0x20, 0x46, 0xa3, 0xae, 0x5b, 0x55, 0x55, 0xfe,
+ 0x4a, 0xad, 0xf2, 0x32, 0x07, 0x0f, 0x91, 0xa9, 0xe5, 0xd3, 0x86, 0x08,
+ 0x73, 0x93, 0xc7, 0x1e, 0x6b, 0xcd, 0x69, 0xd0, 0xfb, 0xc1, 0x74, 0xc2,
+ 0xb8, 0x90, 0xc8, 0xf8, 0x93, 0xbf, 0x08, 0x0f, 0x15, 0x19, 0x26, 0x71,
+ 0x4a, 0x9e, 0xdf, 0xdf, 0xca, 0x6f, 0xca, 0xfd, 0x67, 0xec, 0x4d, 0x21,
+ 0x5b, 0x99, 0xbd, 0x4b, 0x79, 0x22, 0x2d, 0xe4, 0x24, 0x72, 0x88, 0x93,
+ 0xce, 0xe6, 0x7f, 0xef, 0x35, 0x83, 0x67, 0x39, 0xb9, 0x34, 0x80, 0x64,
+ 0x0a, 0xf4, 0xff, 0x42, 0x9d, 0xee, 0xda, 0xb8, 0xd3, 0xdc, 0x1d, 0x0d,
+ 0x9f, 0x45, 0xe9, 0xbe, 0xf4, 0x3e, 0xa6, 0x58, 0x8b, 0xf0, 0xfd, 0x01,
+ 0x73, 0x63, 0xd0, 0xc6, 0x9d, 0xb9, 0x32, 0xd1, 0x91, 0xfe, 0xb1, 0xf5,
+ 0x4b, 0x48, 0xb4, 0x46, 0xae, 0x61, 0xd7, 0x90, 0xfe, 0x86, 0x74, 0x68,
+ 0xee, 0x78, 0x86, 0x65, 0x99, 0x6d, 0x7b, 0xf0, 0x17, 0x1a, 0x4c, 0xb0,
+ 0x37, 0x73, 0xdc, 0x38, 0x41, 0xfa, 0x02, 0xd2, 0x13, 0x8f, 0x71, 0xb4,
+ 0x0a, 0x72, 0x70, 0x0f, 0xe1, 0x2c, 0x9a, 0xa9, 0x51, 0xfa, 0xb2, 0xbf,
+ 0x84, 0xf2, 0xa6, 0xfb, 0xc3, 0x83, 0x16, 0x7e, 0x27, 0xec, 0x06, 0x5d,
+ 0x64, 0x79, 0xe7, 0x42, 0x30, 0xf8, 0x2d, 0xbc, 0x0f, 0x07, 0x8b, 0xf2,
+ 0x99, 0xda, 0x91, 0x4c, 0x65, 0xcf, 0x7f, 0x57, 0x2d, 0x2f, 0x67, 0xe7,
+ 0xfb, 0x75, 0xe9, 0xb2, 0xa3, 0x72, 0x60, 0x88, 0x2b, 0x14, 0x31, 0x62,
+ 0xbc, 0x45, 0x59, 0x5c, 0x58, 0x39, 0xb3, 0x4a, 0xeb, 0xb9, 0x18, 0x24,
+ 0x05, 0xcb, 0xda, 0xd3, 0x5e, 0x54, 0xba, 0xda, 0xfd, 0xfc, 0xa0, 0x02,
+ 0xb3, 0xde, 0x52, 0x3e, 0xc0, 0xd0, 0xb8, 0x19, 0x85, 0x1b, 0x7b, 0xe3,
+ } // ea2
+};
+
+const std::vector<uint8_t> EpidMemberTest::kGroupPublicKeyDataIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kMemberPrivateKeyDataIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc"
+};
+
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha256 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha384 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrp01Member0SigTest1Sha512 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kTest1Msg = {'t', 'e', 's', 't',
+ '1'};
+std::vector<uint8_t> EpidMemberTest::kSigRlData = {
+#include "epid/common-testhelper/testdata/grp01/sigrl.inc"
+};
+std::vector<uint8_t> EpidMemberTest::kSigRl5EntryData = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x05,
+ // bk's
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd, 0x8,
+ 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea, 0x2e,
+ 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94, 0x67,
+ 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57, 0x9d, 0xc7,
+ 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad, 0x7d, 0xfe,
+ 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2, 0x89, 0xb2,
+ 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9, 0xcf, 0xd, 0x40,
+ 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d, 0x4f, 0x7a, 0xb5,
+ 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a, 0x33, 0xad, 0xf6,
+ 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37, 0xce, 0xec, 0xd1,
+ 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10, 0xfe,
+ 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60, 0x3e, 0xc0,
+ 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82, 0xc4, 0x49,
+ 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5, 0x77, 0x16, 0x4,
+ 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8, 0x40, 0xbd, 0x69,
+ 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9, 0xdd, 0x97, 0x6c,
+ 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2, 0xca, 0x5, 0x44, 0x9b,
+ 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa, 0xcf, 0xa4, 0x4, 0xe9, 0xf3,
+ 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3, 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37,
+ 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60, 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40,
+ 0x11,
+
+ 0x6e, 0x22, 0xaa, 0x10, 0x84, 0x58, 0x8b, 0xff, 0xd8, 0x37, 0x8, 0xa9, 0xe9,
+ 0xdb, 0xf6, 0x1f, 0x69, 0x10, 0x95, 0x6c, 0xbf, 0xd, 0x11, 0x48, 0x6f, 0x1b,
+ 0x3c, 0x62, 0x46, 0x13, 0x89, 0x13, 0x5f, 0xa1, 0x3, 0x62, 0xed, 0x62, 0xdf,
+ 0x3d, 0xbf, 0xcd, 0xb7, 0x41, 0x48, 0x81, 0x3, 0x9f, 0x54, 0xa, 0xe, 0xb3,
+ 0x35, 0xf9, 0xde, 0x24, 0xba, 0x6d, 0x4c, 0x7f, 0xfc, 0xc1, 0xb4, 0xce,
+ 0x6d, 0xa1, 0x73, 0x7c, 0xaa, 0xb, 0xad, 0x2, 0xd6, 0x37, 0x85, 0xe, 0xbb,
+ 0x48, 0x11, 0x38, 0xc4, 0xaa, 0x1b, 0xf, 0xcf, 0xc1, 0x9c, 0x26, 0xcc, 0x95,
+ 0xc2, 0x5b, 0x49, 0x9, 0x3d, 0xe9, 0x7d, 0xce, 0xc7, 0xa6, 0x4, 0x3e, 0x7c,
+ 0x9e, 0x28, 0xde, 0x8, 0x11, 0xe, 0x61, 0x3b, 0xc0, 0x9c, 0x6b, 0x58, 0x23,
+ 0xe6, 0x40, 0x7b, 0xbd, 0xb8, 0x72, 0xf, 0xe0, 0xee, 0xcf, 0xba, 0xb4,
+
+ 0xc4, 0xff, 0xaf, 0x48, 0x15, 0xda, 0x60, 0x40, 0xcc, 0xd7, 0xf2, 0x68,
+ 0xf7, 0xe2, 0x70, 0x12, 0x8d, 0x15, 0xa5, 0xb7, 0xe6, 0x4c, 0x23, 0xea,
+ 0x4d, 0x8a, 0x51, 0x6, 0x67, 0x3, 0x4c, 0x83, 0x6f, 0x28, 0x67, 0xcf, 0x63,
+ 0x46, 0x3e, 0x8a, 0x45, 0x9f, 0xed, 0x1a, 0xde, 0xa7, 0xad, 0xb2, 0x2b, 0xf,
+ 0x8b, 0xab, 0x7c, 0x70, 0xff, 0xc3, 0xa8, 0x6e, 0x8c, 0xaa, 0xb1, 0xf6,
+ 0x20, 0xe3, 0xb9, 0xf1, 0xc3, 0x3d, 0x5, 0x6a, 0x1e, 0x26, 0x2d, 0xf4, 0xd,
+ 0xe4, 0x53, 0x63, 0x67, 0x23, 0x48, 0xa8, 0x1, 0xa8, 0xee, 0xe1, 0x5f, 0x64,
+ 0xe3, 0x2c, 0x71, 0xe2, 0x10, 0x82, 0x0, 0x52, 0xd7, 0x74, 0x87, 0xff, 0x1c,
+ 0x0, 0x19, 0xe6, 0x4d, 0x15, 0x91, 0x6d, 0xf3, 0x38, 0x3b, 0xee, 0xf3, 0xd5,
+ 0xd1, 0xc7, 0x6d, 0xd9, 0x8e, 0x55, 0x70, 0x90, 0xb0, 0xb, 0x3c, 0x4a, 0x67,
+ 0x19,
+
+ 0x4f, 0x98, 0x92, 0xf9, 0x18, 0x38, 0xf5, 0xb4, 0xf7, 0x2f, 0xa7, 0x21,
+ 0x71, 0x52, 0x27, 0xd0, 0x57, 0x4f, 0x9c, 0x30, 0xe, 0xb2, 0x27, 0xce, 0xd7,
+ 0xb2, 0x9f, 0xc0, 0xf6, 0xc3, 0xb0, 0x7c, 0x40, 0x18, 0x75, 0x4a, 0xde,
+ 0xb0, 0x9f, 0x46, 0x8a, 0x5a, 0xeb, 0x4f, 0xcb, 0x5e, 0x60, 0xf5, 0xca,
+ 0xf4, 0x98, 0xaf, 0x62, 0x9b, 0x7e, 0x10, 0xda, 0xba, 0x2f, 0x47, 0x64,
+ 0xf2, 0xc0, 0x84, 0x19, 0x75, 0xe0, 0xe4, 0xff, 0x20, 0xda, 0x7d, 0xe5, 0xd,
+ 0xc8, 0xf8, 0xe3, 0x83, 0x61, 0x19, 0x17, 0xf1, 0xa9, 0x1b, 0xff, 0x39,
+ 0x79, 0x88, 0x1, 0xfb, 0xe7, 0x23, 0xd2, 0xac, 0xe0, 0x49, 0x12, 0x2a, 0x38,
+ 0xb4, 0x7c, 0xc2, 0x1b, 0x88, 0x5f, 0x68, 0x32, 0x11, 0xd9, 0xfd, 0xdc,
+ 0x65, 0x2, 0xb3, 0x74, 0x2c, 0x13, 0xf2, 0xd8, 0xf1, 0x45, 0xc5, 0xd1, 0xf4,
+ 0xa3, 0x38, 0x81, 0x92};
+const std::vector<uint8_t> EpidMemberTest::kMsg0 = {'m', 's', 'g', '0'};
+const std::vector<uint8_t> EpidMemberTest::kBsn0 = {'b', 's', 'n', '0'};
+const std::vector<uint8_t> EpidMemberTest::kMsg1 = {'m', 's', 'g', '1'};
+const std::vector<uint8_t> EpidMemberTest::kBsn1 = {'b', 's', 'n', '1'};
+const std::vector<uint8_t> EpidMemberTest::kData_0_255 = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
+ 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
+ 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+const GroupPubKey EpidMemberTest::kGrpXKey = {
+#include "epid/common-testhelper/testdata/grp_x/pubkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXMember0PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/member0/mprivkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXSigrevokedMember0PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/sigrevoked/mprivatekey000.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrpXSigRl = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl.inc"
+};
+const std::vector<uint8_t> EpidMemberTest::kGrpXSigRlSingleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc"
+};
+
+const CompressedPrivKey EpidMemberTest::kGrpXMember9CompressedKey = {
+#include "epid/common-testhelper/testdata/grp_x/cmember9/cmpprivkey.inc"
+};
+const PrivKey EpidMemberTest::kGrpXMember9PrivKey = {
+#include "epid/common-testhelper/testdata/grp_x/cmember9/mprivkey.inc"
+};
+
+const GroupPubKey EpidMemberTest::kGrpYKey = {
+#include "epid/common-testhelper/testdata/grp_y/pubkey.inc"
+};
+
+const CompressedPrivKey EpidMemberTest::kGrpYMember9CompressedKey = {
+#include "epid/common-testhelper/testdata/grp_y/cmember9/cmpprivkey.inc"
+};
+
+const OctStr32 EpidMemberTest::kOctStr32_1 = {0x00, 0x00, 0x00, 0x01};
+
+/// Arbitrary test data were generated based on Intel(R) EPID 2.0 parameters
+const GroupPubKey EpidMemberTest::kEps0GroupPublicKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xb3, 0x6f, 0xff, 0x81, 0xe2, 0x1b, 0x17, 0xeb, 0x3d, 0x75, 0x3d,
+ 0x61, 0x7e, 0x27, 0xb0, 0xcb, 0xd0, 0x6d, 0x8f, 0x9d, 0x64, 0xce,
+ 0xe3, 0xce, 0x43, 0x4c, 0x62, 0xfd, 0xb5, 0x80, 0xe0, 0x99}}},
+ {{{0x3a, 0x07, 0x56, 0x80, 0xe0, 0x88, 0x59, 0xa4, 0xfd, 0xb5, 0xb7,
+ 0x9d, 0xe9, 0x4d, 0xae, 0x9c, 0xee, 0x3d, 0x66, 0x42, 0x82, 0x45,
+ 0x7e, 0x7f, 0xd8, 0x69, 0x3e, 0xa1, 0x74, 0xf4, 0x59, 0xee}}}}, // h1
+ {{{{0xd2, 0x74, 0x2e, 0x9f, 0x63, 0xc2, 0x51, 0x8e, 0xd5, 0xdb, 0xca,
+ 0x1c, 0x54, 0x74, 0x10, 0x7b, 0xdc, 0x99, 0xed, 0x42, 0xd5, 0x5b,
+ 0xa7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xbc, 0xdd, 0x7f, 0xe1}}},
+ {{{0x76, 0x5d, 0xc0, 0x6e, 0xe3, 0x14, 0xac, 0x72, 0x48, 0x12, 0x0a,
+ 0xa6, 0xe8, 0x5b, 0x08, 0x7b, 0xda, 0x3f, 0x51, 0x7d, 0xde, 0x4c,
+ 0xea, 0xcb, 0x93, 0xa5, 0x6e, 0xcc, 0xe7, 0x8e, 0x10, 0x84}}}}, // h2
+ {{{{{0xbd, 0x19, 0x5a, 0x95, 0xe2, 0x0f, 0xca, 0x1c, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1b, 0xa5, 0xb6, 0x78, 0x87, 0x53, 0xf6, 0x6a, 0x95,
+ 0xca, 0xc6, 0x8d, 0xcd, 0x36, 0x88, 0x07, 0x28, 0xe8, 0x96}}},
+ {{{0xca, 0x78, 0x11, 0x5b, 0xb8, 0x6a, 0xe7, 0xe5, 0xa6, 0x65, 0x7a,
+ 0x68, 0x15, 0xd7, 0x75, 0xf8, 0x24, 0x14, 0xcf, 0xd1, 0x0f, 0x6c,
+ 0x56, 0xf5, 0x22, 0xd9, 0xfd, 0xe0, 0xe2, 0xf4, 0xb3, 0xa1}}}},
+ {{{{0x90, 0x21, 0xa7, 0xe0, 0xe8, 0xb3, 0xc7, 0x25, 0xbc, 0x07, 0x72,
+ 0x30, 0x5d, 0xee, 0xf5, 0x6a, 0x89, 0x88, 0x46, 0xdd, 0x89, 0xc2,
+ 0x39, 0x9c, 0x0a, 0x3b, 0x58, 0x96, 0x57, 0xe4, 0xf3, 0x3c}}},
+ {{{0x79, 0x51, 0x69, 0x36, 0x1b, 0xb6, 0xf7, 0x05, 0x5d, 0x0a, 0x88,
+ 0xdb, 0x1f, 0x3d, 0xea, 0xa2, 0xba, 0x6b, 0xf0, 0xda, 0x8e, 0x25,
+ 0xc6, 0xad, 0x83, 0x7d, 0x3e, 0x31, 0xee, 0x11, 0x40, 0xa9}}}}} // w
+};
+
+const PrivKey EpidMemberTest::kEps0MemberPrivateKey = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01}, // group id
+ {{{{0xae, 0x5a, 0x18, 0x8d, 0xc8, 0xa9, 0xe2, 0x5c, 0xdf, 0xef, 0x62,
+ 0x6b, 0x34, 0xdf, 0x0d, 0xf2, 0xf6, 0xcf, 0x6a, 0x4d, 0x68, 0x88,
+ 0xc8, 0x12, 0x08, 0xae, 0xb6, 0x30, 0x54, 0xdf, 0xa7, 0xdc}}},
+ {{{0xec, 0x39, 0x86, 0x7b, 0x5c, 0x5e, 0x28, 0x17, 0x5b, 0xfe, 0x93,
+ 0xa1, 0x31, 0x8a, 0x82, 0x99, 0xb0, 0x84, 0x8c, 0x90, 0xc5, 0x54,
+ 0x2c, 0x6d, 0xff, 0x75, 0xcf, 0x05, 0x6e, 0x2b, 0x6c, 0xf3}}}}, // A
+ {0x0a, 0x30, 0xae, 0x43, 0xa1, 0xe0, 0xd7, 0xdf, 0x10, 0x5e, 0xaf,
+ 0xd8, 0x5a, 0x61, 0x10, 0x86, 0xd0, 0x9d, 0xb9, 0xe4, 0x46, 0xdd,
+ 0xb7, 0x1b, 0x00, 0x14, 0x7c, 0x6b, 0x13, 0x72, 0xc3, 0x77}, // x
+ {0x7a, 0x57, 0x41, 0x5b, 0x85, 0x44, 0x0e, 0x2b, 0xb3, 0xcc, 0xa7,
+ 0x99, 0x6d, 0x19, 0x79, 0x45, 0x04, 0xb8, 0x94, 0x07, 0x47, 0x14,
+ 0xed, 0x8d, 0xf4, 0x1e, 0x7d, 0xa0, 0x17, 0xc5, 0xc4, 0x10} // f
+};
diff --git a/epid/member/unittests/member-testhelper.h b/epid/member/unittests/member-testhelper.h
new file mode 100644
index 0000000..226fc07
--- /dev/null
+++ b/epid/member/unittests/member-testhelper.h
@@ -0,0 +1,115 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Member C++ wrapper interface.
+ */
+#ifndef EPID_MEMBER_UNITTESTS_MEMBER_TESTHELPER_H_
+#define EPID_MEMBER_UNITTESTS_MEMBER_TESTHELPER_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common-testhelper/member_wrapper-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+typedef struct G1ElemStr G1ElemStr;
+/// compares G1ElemStr values
+bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs);
+
+/// compares MembershipCredential values
+bool operator==(MembershipCredential const& lhs,
+ MembershipCredential const& rhs);
+
+/// compares GroupPubKey values
+bool operator==(GroupPubKey const& lhs, GroupPubKey const& rhs);
+
+/// Test fixture class for EpidMember
+class EpidMemberTest : public ::testing::Test {
+ public:
+ /// test data
+ static const GroupPubKey kGroupPublicKey;
+ /// test data
+ static const PrivKey kMemberPrivateKey;
+ /// test data
+ static const std::vector<uint8_t> kGroupPublicKeyDataIkgf;
+ /// test data
+ static const std::vector<uint8_t> kMemberPrivateKeyDataIkgf;
+ /// test data
+ static const MemberPrecomp kMemberPrecomp;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha256;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha384;
+ /// test data
+ static const std::vector<uint8_t> kGrp01Member0SigTest1Sha512;
+ /// test data
+ static const std::vector<uint8_t> kTest1Msg;
+ /// signature based revocation list with 50 entries
+ static std::vector<uint8_t> kSigRlData;
+ /// signature based revocation list with 5 entries
+ static std::vector<uint8_t> kSigRl5EntryData;
+ /// a message
+ static const std::vector<uint8_t> kMsg0;
+ /// a message
+ static const std::vector<uint8_t> kMsg1;
+ /// a basename
+ static const std::vector<uint8_t> kBsn0;
+ /// a basename
+ static const std::vector<uint8_t> kBsn1;
+ /// a data with bytes [0,255]
+ static const std::vector<uint8_t> kData_0_255;
+ /// a group key in group X
+ static const GroupPubKey kGrpXKey;
+ /// a member 0 private key in group X
+ static const PrivKey kGrpXMember0PrivKey;
+ /// a member private key in group X revoked in SigRl
+ static const PrivKey kGrpXSigrevokedMember0PrivKey;
+ /// a SigRl of group X
+ static const std::vector<uint8_t> kGrpXSigRl;
+ /// a SigRl with single entry of group X
+ static const std::vector<uint8_t> kGrpXSigRlSingleEntry;
+ /// a compressed private key in group X
+ static const CompressedPrivKey kGrpXMember9CompressedKey;
+ /// a private key in group X
+ static const PrivKey kGrpXMember9PrivKey;
+
+ /// a group key in group Y
+ static const GroupPubKey kGrpYKey;
+ /// a compressed private key in group Y
+ static const CompressedPrivKey kGrpYMember9CompressedKey;
+
+ /// value "1" represented as an octstr constant
+ static const OctStr32 kOctStr32_1;
+
+ /// EPS specific group public key
+ static const GroupPubKey kEps0GroupPublicKey;
+ /// EPS specific member private key
+ static const PrivKey kEps0MemberPrivateKey;
+
+ /// setup called before each TEST_F starts
+ virtual void SetUp() {}
+ /// teardown called after each TEST_F finishes
+ virtual void TearDown() {}
+};
+
+#endif // EPID_MEMBER_UNITTESTS_MEMBER_TESTHELPER_H_
diff --git a/epid/member/unittests/nr_prove-test.cc b/epid/member/unittests/nr_prove-test.cc
new file mode 100644
index 0000000..339b26b
--- /dev/null
+++ b/epid/member/unittests/nr_prove-test.cc
@@ -0,0 +1,413 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// NrProve unit tests.
+/*! \file */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/src/nrprove.h"
+#include "epid/member/src/signbasic.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+namespace {
+
+TEST_F(EpidMemberTest, NrProveFailsGivenNullParameters) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature const* basic_sig =
+ &reinterpret_cast<EpidSignature const*>(
+ this->kGrp01Member0SigTest1Sha256.data())
+ ->sigma0;
+ auto& msg = this->kTest1Msg;
+ auto& bsn = this->kBsn0;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(nullptr, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ basic_sig, &sig_rl->bk[0], &proof));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, nullptr, msg.size(), bsn.data(), bsn.size(),
+ basic_sig, &sig_rl->bk[0], &proof));
+ EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), nullptr,
+ 0, basic_sig, &sig_rl->bk[0], &proof));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), bsn.data(), 0,
+ basic_sig, &sig_rl->bk[0], &proof));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ nullptr, &sig_rl->bk[0], &proof));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ basic_sig, nullptr, &proof));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ basic_sig, &sig_rl->bk[0], nullptr));
+}
+
+TEST_F(EpidMemberTest, NrProveFailsGivenInvalidSigRlEntry) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ NrProof proof;
+ BigNumStr rnd_bsn = {0};
+
+ THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0,
+ &basic_sig, &rnd_bsn));
+
+ SigRlEntry sig_rl_enty_invalid_k = sig_rl->bk[0];
+ sig_rl_enty_invalid_k.k.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(),
+ &rnd_bsn, sizeof(rnd_bsn), &basic_sig,
+ &sig_rl_enty_invalid_k, &proof));
+
+ SigRlEntry sig_rl_enty_invalid_b = sig_rl->bk[0];
+ sig_rl_enty_invalid_b.b.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(),
+ &rnd_bsn, sizeof(rnd_bsn), &basic_sig,
+ &sig_rl_enty_invalid_b, &proof));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_NrProveFailsWithInvalidSigRlEntryAndCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ NrProof proof;
+ BigNumStr rnd_bsn = {0};
+
+ THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0,
+ &basic_sig, &rnd_bsn));
+
+ SigRlEntry sig_rl_enty_invalid_k = sig_rl->bk[0];
+ sig_rl_enty_invalid_k.k.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(),
+ &rnd_bsn, sizeof(rnd_bsn), &basic_sig,
+ &sig_rl_enty_invalid_k, &proof));
+
+ SigRlEntry sig_rl_enty_invalid_b = sig_rl->bk[0];
+ sig_rl_enty_invalid_b.b.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(),
+ &rnd_bsn, sizeof(rnd_bsn), &basic_sig,
+ &sig_rl_enty_invalid_b, &proof));
+}
+
+TEST_F(EpidMemberTest, NrProveFailsGivenInvalidBasicSig) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ NrProof proof;
+ BigNumStr rnd_bsn = {0};
+
+ THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0,
+ &basic_sig, &rnd_bsn));
+
+ // invalid basic sig is only when K value is invalid!!
+ BasicSignature basic_sig_invalid_K = basic_sig;
+ basic_sig_invalid_K.K.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn),
+ &basic_sig_invalid_K, &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_NrProveFailsGivenInvalidBasicSigAndCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ NrProof proof;
+ BigNumStr rnd_bsn = {0};
+
+ THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0,
+ &basic_sig, &rnd_bsn));
+
+ // invalid basic sig is only when K value is invalid!!
+ BasicSignature basic_sig_invalid_K = basic_sig;
+ basic_sig_invalid_K.K.x.data.data[31]++; // make it not in EC group
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn),
+ &basic_sig_invalid_K, &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofForEmptyMessage) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, nullptr, 0, nullptr, 0,
+ &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, nullptr, 0, &rnd_bsn, sizeof(rnd_bsn),
+ &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrVerify(ctx, &basic_sig, nullptr, 0, &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofForMsgContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kData_0_255;
+ auto& bsn = this->kBsn0;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+
+ NrProof proof;
+
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ ASSERT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProof) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, PROTECTED_GeneratesNrProofWithCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingDefaultHashAlgUsingIKGFData) {
+ Prng my_prng;
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ const std::vector<uint8_t> sigrl_bin = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+ };
+
+ MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(sigrl_bin.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(grp_public_key);
+
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha384HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha512HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+TEST_F(EpidMemberTest, GeneratesNrProofUsingSha512256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ kSha512_256, this->kMemberPrecomp, &Prng::Generate,
+ &my_prng);
+
+ BasicSignature basic_sig;
+ auto msg = this->kTest1Msg;
+ SigRl const* sig_rl = reinterpret_cast<const SigRl*>(this->kSigRlData.data());
+ BigNumStr rnd_bsn = {0};
+
+ NrProof proof;
+
+ ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr,
+ EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn,
+ sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof));
+
+ // Check proof by doing an NrVerify
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256));
+ EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(),
+ &sig_rl->bk[0], &proof));
+}
+
+} // namespace
diff --git a/epid/member/unittests/presig-test.cc b/epid/member/unittests/presig-test.cc
new file mode 100644
index 0000000..ca51762
--- /dev/null
+++ b/epid/member/unittests/presig-test.cc
@@ -0,0 +1,116 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief ComputePreSig unit tests.
+ */
+#include <algorithm>
+#include <cstring>
+#include <limits>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+namespace {
+
+///////////////////////////////////////////////////////////////////////
+// EpidAddPreSigs
+TEST_F(EpidMemberTest, AddPreSigsFailsGivenNullPointer) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ EXPECT_EQ(kEpidBadArgErr, EpidAddPreSigs(nullptr, 1));
+}
+
+TEST_F(EpidMemberTest, AddPreSigsFailsGivenHugeNumberOfPreSigs) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ // number_presigs = 0x80..01 of size equal to sizeof(size_t)
+ EXPECT_NE(kEpidNoErr, EpidAddPreSigs(member, (SIZE_MAX >> 1) + 2));
+}
+
+TEST_F(EpidMemberTest,
+ AddPreSigsComputesSpecifiedNumberOfPresigsIfInputPresigsNull) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 2));
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 1));
+ // request to generate 0 pre-computed signatures do nothing
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 0));
+ EXPECT_EQ((size_t)3, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, AddPreSigsAddsCorrectNumberOfPresigsGivenValidInput) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ const size_t presigs1_added = 2;
+ const size_t presigs2_added = 3;
+
+ // add
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, presigs1_added));
+ // extend
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, presigs2_added));
+ // add empty pre-computed signatures array does not affect internal pool
+ ASSERT_EQ(kEpidNoErr, EpidAddPreSigs(member, 0));
+ EXPECT_EQ(presigs1_added + presigs2_added, EpidGetNumPreSigs(member));
+}
+
+///////////////////////////////////////////////////////////////////////
+// EpidGetNumPreSigs
+TEST_F(EpidMemberTest, GetNumPreSigsReturnsZeroGivenNullptr) {
+ EXPECT_EQ((size_t)0, EpidGetNumPreSigs(nullptr));
+}
+
+TEST_F(EpidMemberTest, NumPreSigsForNewleyCreatedContextIsZero) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ EXPECT_EQ((size_t)0, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, GetNumPreSigsReturnsNumberOfAddedPresigs) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+
+ const size_t presigs_added = 5;
+
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, presigs_added));
+ EXPECT_EQ(presigs_added, EpidGetNumPreSigs(member));
+}
+
+} // namespace
diff --git a/epid/member/unittests/privateexp-test.cc b/epid/member/unittests/privateexp-test.cc
new file mode 100644
index 0000000..5f413cb
--- /dev/null
+++ b/epid/member/unittests/privateexp-test.cc
@@ -0,0 +1,155 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// EpidPrivateExp unit tests.
+/*! \file */
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/src/privateexp.h"
+}
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/epid_params-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+namespace {
+
+////////////////////////////////////////////////
+// EpidPrivateExp
+TEST_F(EpidMemberTest, EpidPrivateExpFailsGivenNullPointer) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ THROW_ON_EPIDERR(EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey,
+ &this->kMemberPrecomp));
+ THROW_ON_EPIDERR(EpidMemberStartup(member));
+
+ Epid20Params params;
+ EcPointObj a(&params.G1, this->kGroupPublicKey.h1), r(&params.G1);
+
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(nullptr, a, r));
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(member, nullptr, r));
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(member, a, nullptr));
+}
+
+TEST_F(EpidMemberTest, EpidPrivateExpFailsArgumentsMismatch) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ THROW_ON_EPIDERR(EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey,
+ &this->kMemberPrecomp));
+ THROW_ON_EPIDERR(EpidMemberStartup(member));
+
+ Epid20Params params;
+ EcPointObj a(&params.G1, this->kGroupPublicKey.h1), r(&params.G1);
+ EcPointObj g2(&params.G2, this->kGroupPublicKey.w);
+
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(member, g2, r));
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(member, a, g2));
+ EXPECT_EQ(kEpidBadArgErr, EpidPrivateExp(member, g2, g2));
+}
+
+TEST_F(EpidMemberTest, EpidPrivateExpSucceedsGivenValidParametersForSha256) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+ THROW_ON_EPIDERR(EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey,
+ &this->kMemberPrecomp));
+ THROW_ON_EPIDERR(EpidMemberStartup(member));
+
+ Epid20Params params;
+ EcPointObj a(&params.G1, this->kGroupPublicKey.h1), r(&params.G1),
+ r_expected(&params.G1);
+
+ G1ElemStr r_str, r_expected_str;
+
+ EXPECT_EQ(kEpidNoErr, EpidPrivateExp(member, a, r));
+
+ THROW_ON_EPIDERR(EcExp(
+ params.G1, a, (BigNumStr const*)&this->kMemberPrivateKey.f, r_expected));
+
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r_expected, &r_expected_str,
+ sizeof(r_expected_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+
+#ifndef TPM_TSS
+TEST_F(EpidMemberTest, EpidPrivateExpSucceedsGivenValidParametersForSha384) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha384));
+ THROW_ON_EPIDERR(EpidProvisionKey(member, &this->kGroupPublicKey,
+ &this->kMemberPrivateKey,
+ &this->kMemberPrecomp));
+ THROW_ON_EPIDERR(EpidMemberStartup(member));
+
+ Epid20Params params;
+ EcPointObj a(&params.G1, this->kGroupPublicKey.h1), r(&params.G1),
+ r_expected(&params.G1);
+
+ G1ElemStr r_str, r_expected_str;
+
+ EXPECT_EQ(kEpidNoErr, EpidPrivateExp(member, a, r));
+
+ THROW_ON_EPIDERR(EcExp(
+ params.G1, a, (BigNumStr const*)&this->kMemberPrivateKey.f, r_expected));
+
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r_expected, &r_expected_str,
+ sizeof(r_expected_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+#endif
+
+TEST_F(EpidMemberTest,
+ PROTECTED_EpidPrivateExpSucceedsByCredentialForSha256_EPS0) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ BigNumStr const f_str = {0x7a, 0x57, 0x41, 0x5b, 0x85, 0x44, 0x0e, 0x2b,
+ 0xb3, 0xcc, 0xa7, 0x99, 0x6d, 0x19, 0x79, 0x45,
+ 0x04, 0xb8, 0x94, 0x07, 0x47, 0x14, 0xed, 0x8d,
+ 0xf4, 0x1e, 0x7d, 0xa0, 0x17, 0xc5, 0xc4, 0x10};
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha256));
+
+ Epid20Params params;
+ EcPointObj a(&params.G1, this->kGroupPublicKey.h1), r(&params.G1),
+ r_expected(&params.G1);
+
+ G1ElemStr r_str, r_expected_str;
+
+ EXPECT_EQ(kEpidNoErr, EpidPrivateExp(member, a, r));
+
+ THROW_ON_EPIDERR(EcExp(params.G1, a, (BigNumStr const*)&f_str, r_expected));
+
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r, &r_str, sizeof(r_str)));
+ THROW_ON_EPIDERR(WriteEcPoint(params.G1, r_expected, &r_expected_str,
+ sizeof(r_expected_str)));
+ EXPECT_EQ(r_expected_str, r_str);
+}
+
+} // namespace
diff --git a/epid/member/unittests/provision_compressed-test.cc b/epid/member/unittests/provision_compressed-test.cc
new file mode 100644
index 0000000..001129e
--- /dev/null
+++ b/epid/member/unittests/provision_compressed-test.cc
@@ -0,0 +1,178 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision compressed unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/context.h"
+}
+
+namespace {
+
+EpidStatus ProvisionCompressedAndStart(
+ MemberCtx* ctx, GroupPubKey const* pub_key,
+ CompressedPrivKey const* compressed_privkey,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionCompressed(ctx, pub_key, compressed_privkey, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, ProvisionCompressedFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(nullptr, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, nullptr, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(nullptr, &pub_key, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, nullptr, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCompressed(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCompressedSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionCompressed(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionCompressed(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCompressedFailsForInvalidGroupPubKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGrpXKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGrpXKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCompressedFailsForInvalidPrivateKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ CompressedPrivKey priv_key = this->kGrpXMember9CompressedKey;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kGrpXMember9CompressedKey;
+ priv_key.ax.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+
+ priv_key = this->kGrpXMember9CompressedKey;
+ priv_key.seed.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionCompressedAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+} // namespace
diff --git a/epid/member/unittests/provision_credential-test.cc b/epid/member/unittests/provision_credential-test.cc
new file mode 100644
index 0000000..c8ec7ad
--- /dev/null
+++ b/epid/member/unittests/provision_credential-test.cc
@@ -0,0 +1,318 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision credential unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/storage.h"
+}
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+namespace {
+
+EpidStatus ProvisionCredentialAndStart(MemberCtx* ctx,
+ GroupPubKey const* pub_key,
+ MembershipCredential const* credential,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionCredential(ctx, pub_key, credential, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(nullptr, &pub_key, &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, nullptr, &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(nullptr, &pub_key, &credential, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, nullptr, &credential, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionCredential(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsInvalidCredential) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ MembershipCredential base_credential;
+ base_credential.A = this->kGrpXMember9PrivKey.A;
+ base_credential.gid = this->kGrpXMember9PrivKey.gid;
+ base_credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ credential = base_credential;
+ credential.A.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ credential = base_credential;
+ credential.A.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ credential = base_credential;
+ credential.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsInvalidGroupKey) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionCredentialRejectsCredentialNotInGroup) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ MembershipCredential base_credential;
+ base_credential.A = this->kGrpXMember9PrivKey.A;
+ base_credential.gid = this->kGrpXMember9PrivKey.gid;
+ base_credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+
+ credential = base_credential;
+ credential.gid.data[0] = ~credential.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingMembershipCredentialPrecomp) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, &precomp));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingMembershipCredentialNoPrecomp) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+ MembershipCredential credential;
+ credential.A = this->kGrpXMember9PrivKey.A;
+ credential.gid = this->kGrpXMember9PrivKey.gid;
+ credential.x = this->kGrpXMember9PrivKey.x;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &credential, nullptr));
+}
+
+// test that create succeeds with valid IKGF given parameters
+TEST_F(EpidMemberTest, CanProvisionUsingIKGFMembershipCredentialPrecomp) {
+ Prng prng;
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey* priv_key =
+ reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ FpElemStr f = priv_key->f;
+ MembershipCredential credential;
+ credential.A = priv_key->A;
+ credential.gid = priv_key->gid;
+ credential.x = priv_key->x;
+ // Note: this MemberPrecomp is for the wrong group, however it should not
+ // be checked in Provision because doing so would negate the performance
+ // boost of using the precomp.
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, pub_key,
+ &credential, &precomp));
+}
+
+TEST_F(EpidMemberTest, CanProvisionUsingIKGFMembershipCredentialNoPrecomp) {
+ Prng prng;
+ const GroupPubKey* pub_key = reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey* priv_key =
+ reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ FpElemStr f = priv_key->f;
+ MembershipCredential credential;
+ credential.A = priv_key->A;
+ credential.gid = priv_key->gid;
+ credential.x = priv_key->x;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ ProvisionCredentialAndStart(member, pub_key, &credential, nullptr));
+}
+
+TEST_F(EpidMemberTest,
+ ProvisionCredentialCanStoreMembershipCredentialNoPrecomp) {
+ Prng prng;
+ uint32_t nv_index = 0x01c10100;
+
+ MembershipCredential const orig_credential =
+ *(MembershipCredential*)&this->kGrpXMember9PrivKey;
+ MembershipCredential credential;
+
+ GroupPubKey pub_key = this->kGrpXKey;
+ FpElemStr f = this->kGrpXMember9PrivKey.f;
+
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr, ProvisionCredentialAndStart(member, &pub_key,
+ &orig_credential, nullptr));
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidNvReadMembershipCredential(((MemberCtx*)member)->tpm2_ctx,
+ nv_index, &pub_key, &credential));
+ EXPECT_EQ(orig_credential, credential);
+}
+
+} // namespace
diff --git a/epid/member/unittests/provision_key-test.cc b/epid/member/unittests/provision_key-test.cc
new file mode 100644
index 0000000..113de5f
--- /dev/null
+++ b/epid/member/unittests/provision_key-test.cc
@@ -0,0 +1,244 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Provision key unit tests.
+ */
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/mem_params-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/context.h"
+#include "epid/member/src/storage.h"
+}
+
+namespace {
+
+EpidStatus ProvisionBulkAndStart(MemberCtx* ctx, GroupPubKey const* pub_key,
+ PrivKey const* priv_key,
+ MemberPrecomp const* precomp_str) {
+ EpidStatus sts;
+ sts = EpidProvisionKey(ctx, pub_key, priv_key, precomp_str);
+ if (sts != kEpidNoErr) {
+ return sts;
+ }
+ sts = EpidMemberStartup(ctx);
+ return sts;
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsGivenNullParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(nullptr, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, nullptr, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, &pub_key, nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(nullptr, &pub_key, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, nullptr, &priv_key, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidProvisionKey(member, &pub_key, nullptr, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkSucceedsGivenValidParameters) {
+ Prng prng;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+}
+
+// test that create succeeds with valid IKGF given parameters
+TEST_F(EpidMemberTest, ProvisionBulkSucceedsGivenValidParametersUsingIKGFData) {
+ Prng prng;
+ const GroupPubKey pub_key = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc"
+ };
+ const PrivKey priv_key = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc"
+ };
+
+ const MemberPrecomp precomp = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc"
+ };
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ EpidProvisionKey(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidNoErr, EpidProvisionKey(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidGroupPubKey) {
+ Prng prng;
+
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h1.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.h2.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.x[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[0].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ pub_key = this->kGroupPublicKey;
+ pub_key.w.y[1].data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidF) {
+ Prng prng;
+ FpElemStr f = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ };
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.f = f;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkFailsForInvalidPrivateKey) {
+ Prng prng;
+
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MemberPrecomp precomp = this->kMemberPrecomp;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, nullptr, &params);
+ MemberCtxObj member(&params);
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.A.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ priv_key = this->kMemberPrivateKey;
+ priv_key.A.y.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, &precomp));
+ EXPECT_EQ(kEpidBadArgErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+}
+
+TEST_F(EpidMemberTest, ProvisionBulkCanStoreMembershipCredential) {
+ Prng prng;
+ uint32_t nv_index = 0x01c10100;
+
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ PrivKey priv_key = this->kMemberPrivateKey;
+ MembershipCredential const orig_credential{priv_key.gid, priv_key.A,
+ priv_key.x};
+ MembershipCredential credential;
+ MemberParams params = {0};
+ SetMemberParams(&Prng::Generate, &prng, &priv_key.f, &params);
+ MemberCtxObj member(&params);
+ EXPECT_EQ(kEpidNoErr,
+ ProvisionBulkAndStart(member, &pub_key, &priv_key, nullptr));
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidNvReadMembershipCredential(((MemberCtx*)member)->tpm2_ctx,
+ nv_index, &pub_key, &credential));
+ EXPECT_EQ(orig_credential, credential);
+}
+
+} // namespace
diff --git a/epid/member/unittests/resize-test.cc b/epid/member/unittests/resize-test.cc
new file mode 100644
index 0000000..f674aab
--- /dev/null
+++ b/epid/member/unittests/resize-test.cc
@@ -0,0 +1,63 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+/// ResizeOctStr unit tests.
+/*! \file */
+#include <vector>
+
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/src/resize.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+namespace {
+TEST(ResizeOctStr, FailsGivenNullPointer) {
+ uint8_t a[3] = {0, 1, 2};
+ uint8_t r[3] = {0};
+ EXPECT_EQ(kEpidBadArgErr, ResizeOctStr(nullptr, sizeof(a), r, sizeof(r)));
+ EXPECT_EQ(kEpidBadArgErr, ResizeOctStr(a, sizeof(a), nullptr, sizeof(r)));
+}
+
+TEST(ResizeOctStr, FailsGivenInvalidSize) {
+ uint8_t a[3] = {0, 1, 2};
+ uint8_t r[3] = {0};
+ EXPECT_EQ(kEpidBadArgErr, ResizeOctStr(a, 0, r, sizeof(r)));
+ EXPECT_EQ(kEpidBadArgErr, ResizeOctStr(a, sizeof(a), r, 0));
+}
+
+TEST(ResizeOctStr, FailsGivenResultIsTooSmall) {
+ uint8_t a[3] = {0, 1, 2};
+ uint8_t r[1] = {0};
+ EXPECT_EQ(kEpidBadArgErr, ResizeOctStr(a, sizeof(a), r, sizeof(r)));
+}
+
+TEST(ResizeOctStr, CanShrink) {
+ uint8_t a[3] = {0, 1, 2};
+ std::vector<uint8_t> r(2);
+ std::vector<uint8_t> r_expected = {1, 2};
+ EXPECT_EQ(kEpidNoErr, ResizeOctStr(a, sizeof(a), r.data(), r.size()));
+ EXPECT_EQ(r_expected, r);
+}
+
+TEST(ResizeOctStr, CanExtend) {
+ uint8_t a[3] = {0, 1, 2};
+ std::vector<uint8_t> r(5);
+ std::vector<uint8_t> r_expected = {0, 0, 0, 1, 2};
+ EXPECT_EQ(kEpidNoErr, ResizeOctStr(a, sizeof(a), r.data(), r.size()));
+ EXPECT_EQ(r_expected, r);
+}
+} // namespace
diff --git a/epid/member/unittests/sign-test.cc b/epid/member/unittests/sign-test.cc
new file mode 100644
index 0000000..54f2faf
--- /dev/null
+++ b/epid/member/unittests/sign-test.cc
@@ -0,0 +1,1160 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Sign unit tests.
+ */
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/context.h"
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+namespace {
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+/////////////////////////////////////////////////////////////////////////
+// Simple error cases
+
+TEST_F(EpidMemberTest, SignFailsGivenNullParameters) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(nullptr, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+ EXPECT_EQ(kEpidBadArgErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), nullptr, sig.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, nullptr, msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, bsn.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+
+TEST_F(EpidMemberTest, SignFailsGivenWrongSigLen) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+
+ // signature buffer one byte less than needed
+ std::vector<uint8_t> sig_small(EpidGetSigSize(&srl) - 1);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig_small.data(), sig_small.size()));
+
+ // signature buffer is one byte - a less than allowed for EpidSignature
+ std::vector<uint8_t> sig_one(1);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig_one.data(), sig_one.size()));
+}
+
+TEST_F(EpidMemberTest, SignFailsGivenUnregisteredBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& bsn1 = this->kBsn1;
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kGroupPublicKey.gid;
+ std::vector<uint8_t> sig(EpidGetSigSize(&srl));
+ THROW_ON_EPIDERR(
+ EpidMemberSetSigRl(member, &srl, sizeof(srl) - sizeof(srl.bk)));
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSign(member, msg.data(), msg.size(), bsn1.data(), bsn1.size(),
+ (EpidSignature*)sig.data(), sig.size()));
+}
+TEST_F(EpidMemberTest, SignsFailsIfNotProvisioned) {
+ Prng my_prng;
+ MemberCtxObj member(&Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidOutOfSequenceError,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Anonymity
+
+TEST_F(EpidMemberTest, SignaturesOfSameMessageAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig1(EpidGetSigSize(nullptr));
+ std::vector<uint8_t> sig2(EpidGetSigSize(nullptr));
+ // without signature based revocation list
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig1.data(), sig1.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig2.data(), sig2.size()));
+ EXPECT_TRUE(sig1.size() == sig2.size() &&
+ 0 != memcmp(sig1.data(), sig2.data(), sig1.size()));
+ // with signature based revocation list
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x01,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b};
+ SigRl* srl1 = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl1_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig3(EpidGetSigSize(srl1));
+ std::vector<uint8_t> sig4(EpidGetSigSize(srl1));
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl1, srl1_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig3.data(), sig3.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), nullptr, 0,
+ (EpidSignature*)sig4.data(), sig4.size()));
+ EXPECT_TRUE(sig3.size() == sig4.size() &&
+ 0 != memcmp(sig3.data(), sig4.data(), sig3.size()));
+}
+TEST_F(EpidMemberTest, SignaturesOfSameMessageWithSameBasenameAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ std::vector<uint8_t> sig1(EpidGetSigSize(nullptr));
+ std::vector<uint8_t> sig2(EpidGetSigSize(nullptr));
+ // without signature based revocation list
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig1.data(), sig1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig2.data(), sig2.size()));
+ EXPECT_TRUE(sig1.size() == sig2.size() &&
+ 0 != memcmp(sig1.data(), sig2.data(), sig1.size()));
+
+ // with signature based revocation list
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x01,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b};
+ SigRl* srl1 = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl1_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig3(EpidGetSigSize(srl1));
+ std::vector<uint8_t> sig4(EpidGetSigSize(srl1));
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl1, srl1_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig3.data(), sig3.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), bsn.data(), bsn.size(),
+ (EpidSignature*)sig4.data(), sig4.size()));
+ EXPECT_TRUE(sig3.size() == sig4.size() &&
+ 0 != memcmp(sig3.data(), sig4.data(), sig3.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable basename
+
+TEST_F(EpidMemberTest, SignsMessageUsingRandomBaseNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageUsingRandomBaseWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingBasenameNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingBasenameWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithRegisteredBasenamesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithRegisteredBasenamesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsUsingRandomBaseWithoutRegisteredBasenamesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ SignsUsingRandomBaseWithoutRegisteredBasenamesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+#ifndef TPM_TSS
+TEST_F(EpidMemberTest, SignsMessageUsingHugeBasenameNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024); // exactly 1 MB
+ uint8_t c = 0;
+ for (size_t i = 0; i < bsn.size(); ++i) {
+ bsn[i] = c++;
+ }
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageUsingHugeBasenameWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGrpXKey, this->kGrpXMember0PrivKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024); // exactly 1 MB
+ uint8_t c = 0;
+ for (size_t i = 0; i < bsn.size(); ++i) {
+ bsn[i] = c++;
+ }
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ SigRl const* srl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ size_t srl_size = this->kGrpXSigRl.size() * sizeof(this->kGrpXSigRl[0]);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+}
+
+TEST_F(EpidMemberTest, SignsMsgUsingBsnContainingAllPossibleBytesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kData_0_255;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+#endif
+
+/////////////////////////////////////////////////////////////////////////
+// Variable sigRL
+
+TEST_F(EpidMemberTest, SignsMessageGivenNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+
+ size_t sig_len = EpidGetSigSize(nullptr);
+ std::vector<uint8_t> newsig(sig_len);
+ EpidSignature* sig = (EpidSignature*)newsig.data();
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignsMessageGivenNoSigRlUsingIKGFData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+
+ size_t sig_len = EpidGetSigSize(nullptr);
+ std::vector<uint8_t> newsig(sig_len);
+ // using ikgf keys
+ MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ EpidSignature* sig = (EpidSignature*)newsig.data();
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(grp_public_key);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithNoEntries) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+
+ uint8_t sig_rl_data_n2_zero[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl const* srl = reinterpret_cast<SigRl const*>(sig_rl_data_n2_zero);
+ size_t srl_size = sizeof(sig_rl_data_n2_zero);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithNoEntriesUsingIkgfData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+ // using ikgf keys
+ MemberCtxObj member_ikgf(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ uint8_t sig_rl_data_n2_one_gid0[] = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc"
+ };
+ SigRl* srl_ikgf = reinterpret_cast<SigRl*>(sig_rl_data_n2_one_gid0);
+ size_t srl_size = sizeof(sig_rl_data_n2_one_gid0);
+ std::vector<uint8_t> sig_data_ikgf(EpidGetSigSize(srl_ikgf));
+ EpidSignature* sig_ikgf =
+ reinterpret_cast<EpidSignature*>(sig_data_ikgf.data());
+ size_t sig_len = sig_data_ikgf.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member_ikgf, msg.data(), msg.size(), nullptr,
+ 0, sig_ikgf, sig_len));
+ VerifierCtxObj ctx_ikgf(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx_ikgf, sig_ikgf, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithEntries) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x02,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10,
+ 0xfe, 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60,
+ 0x3e, 0xc0, 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82,
+ 0xc4, 0x49, 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5,
+ 0x77, 0x16, 0x4, 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8,
+ 0x40, 0xbd, 0x69, 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9,
+ 0xdd, 0x97, 0x6c, 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2,
+ 0xca, 0x5, 0x44, 0x9b, 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa,
+ 0xcf, 0xa4, 0x4, 0xe9, 0xf3, 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3,
+ 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37, 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60,
+ 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40, 0x11};
+ SigRl* srl = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t srl_size = sizeof(sig_rl_data_n2_one);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageGivenSigRlWithEntriesUsingIKGFData) {
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ Prng my_prng;
+ auto& msg = this->kMsg0;
+ // using ikgf keys
+ MemberCtxObj member_ikgf(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ uint8_t sig_rl_data_n2_one_gid0[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x02,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+
+ 0x71, 0x8a, 0xb5, 0x1, 0x7f, 0x7c, 0x92, 0x9a, 0xa2, 0xc9, 0x81, 0x10,
+ 0xfe, 0xbf, 0xc, 0x53, 0xa4, 0x43, 0xaf, 0x31, 0x74, 0x12, 0x25, 0x60,
+ 0x3e, 0xc0, 0x21, 0xe6, 0x63, 0x9a, 0xd2, 0x67, 0x2d, 0xb5, 0xd5, 0x82,
+ 0xc4, 0x49, 0x29, 0x51, 0x42, 0x8f, 0xe0, 0xe, 0xd1, 0x73, 0x27, 0xf5,
+ 0x77, 0x16, 0x4, 0x40, 0x8a, 0x0, 0xe, 0x3a, 0x5d, 0x37, 0x42, 0xd3, 0x8,
+ 0x40, 0xbd, 0x69, 0xf7, 0x5f, 0x74, 0x21, 0x50, 0xf4, 0xce, 0xfe, 0xd9,
+ 0xdd, 0x97, 0x6c, 0xa8, 0xa5, 0x60, 0x6b, 0xf8, 0x1b, 0xba, 0x2, 0xb2,
+ 0xca, 0x5, 0x44, 0x9b, 0xb1, 0x5e, 0x3a, 0xa4, 0x35, 0x7a, 0x51, 0xfa,
+ 0xcf, 0xa4, 0x4, 0xe9, 0xf3, 0xbf, 0x38, 0xd4, 0x24, 0x9, 0x52, 0xf3,
+ 0x58, 0x3d, 0x9d, 0x4b, 0xb3, 0x37, 0x4b, 0xec, 0x87, 0xe1, 0x64, 0x60,
+ 0x3c, 0xb6, 0xf7, 0x7b, 0xff, 0x40, 0x11};
+ SigRl* srl_ikgf = reinterpret_cast<SigRl*>(sig_rl_data_n2_one_gid0);
+ size_t srl_size = sizeof(sig_rl_data_n2_one_gid0);
+ std::vector<uint8_t> sig_data_ikgf(EpidGetSigSize(srl_ikgf));
+ EpidSignature* sig_ikgf =
+ reinterpret_cast<EpidSignature*>(sig_data_ikgf.data());
+ size_t sig_len = sig_data_ikgf.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member_ikgf, msg.data(), msg.size(), nullptr,
+ 0, sig_ikgf, sig_len));
+ VerifierCtxObj ctx_ikgf(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx_ikgf, srl_ikgf, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx_ikgf, sig_ikgf, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignMessageReportsIfMemberRevoked) {
+ // note: a complete sig + nr proof should still be returned!!
+ auto& pub_key = this->kGrpXKey;
+ auto& priv_key = this->kGrpXMember0PrivKey;
+ auto& msg = this->kMsg0;
+ Prng my_prng;
+ MemberCtxObj member(pub_key, priv_key, &Prng::Generate, &my_prng);
+ const std::vector<uint8_t> kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha512_rndbase_msg0_revoked_middle_entry.inc"
+ };
+ auto srl = reinterpret_cast<SigRl const*>(
+ kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry.data());
+ size_t srl_size = kGrpXSigRlMember0Sha512Rndbase0Msg0MiddleEntry.size();
+
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+
+ VerifierCtxObj ctx(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignMessageReportsIfMemberRevokedUsingIKGFData) {
+ // note: a complete sig + nr proof should still be returned!!
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ const PrivKey member_private_key_revoked_by_sig = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc"
+ };
+ Prng my_prng;
+ MemberCtxObj member(grp_public_key, member_private_key_revoked_by_sig,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ const std::vector<uint8_t> sig_Rl = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+ };
+ auto srl = reinterpret_cast<SigRl const*>(sig_Rl.data());
+ size_t srl_size = sig_Rl.size();
+
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+
+ VerifierCtxObj ctx(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Revoked member by sigRL for TPM case
+
+TEST_F(EpidMemberTest,
+ PROTECTED_SignMessageByCedentialReportsIfMemberRevoked_EPS0) {
+ // note: a complete sig + nr proof should still be returned!!
+ auto& pub_key = this->kEps0GroupPublicKey;
+ auto credential = *(MembershipCredential const*)&this->kEps0MemberPrivateKey;
+ const std::vector<uint8_t> msg = {'t', 'e', 's', 't', '2'};
+ Prng my_prng;
+ MemberCtxObj member(pub_key, credential, &Prng::Generate, &my_prng);
+ const std::vector<uint8_t> kEps0SigRlMember0Sha256Rndbase0Msg0FirstEntry = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x39, 0x97, 0x09, 0x11, 0x30, 0xb0, 0x2a, 0x29, 0xa7, 0x9b, 0xf1, 0xef,
+ 0xe9, 0xe5, 0xc7, 0x03, 0x17, 0xe6, 0x4f, 0x6f, 0x49, 0x4d, 0xeb, 0x0f,
+ 0xfd, 0x1c, 0x3f, 0xce, 0xcc, 0xc8, 0x40, 0x6b, 0x23, 0xd3, 0xec, 0x78,
+ 0x78, 0x15, 0x4a, 0x34, 0x0f, 0xd1, 0xd3, 0xfa, 0xd2, 0xb2, 0x5a, 0xc9,
+ 0xec, 0xa2, 0x41, 0xe1, 0x46, 0x6d, 0xed, 0xb3, 0x4a, 0xa6, 0xdf, 0xb6,
+ 0xc2, 0x11, 0x49, 0x0d, 0x8b, 0xc4, 0xdc, 0xe0, 0x3f, 0x86, 0x59, 0xb6,
+ 0x47, 0x0e, 0x72, 0xd9, 0x04, 0x91, 0x06, 0x8d, 0xe7, 0xb0, 0x4e, 0x40,
+ 0x4a, 0x72, 0xe2, 0x99, 0xcc, 0xf2, 0x93, 0x1f, 0xcb, 0x32, 0x2e, 0xa3,
+ 0x62, 0xf5, 0x35, 0x51, 0x8b, 0x8e, 0xc8, 0xf4, 0x1e, 0xbe, 0xc9, 0xf4,
+ 0xa9, 0xc4, 0x63, 0xd3, 0x86, 0x5d, 0xf6, 0x44, 0x36, 0x5c, 0x44, 0x11,
+ 0xb4, 0xa3, 0x85, 0xd5, 0x9e, 0xaf, 0x56, 0x83};
+ auto srl = reinterpret_cast<SigRl const*>(
+ kEps0SigRlMember0Sha256Rndbase0Msg0FirstEntry.data());
+ size_t srl_size = kEps0SigRlMember0Sha256Rndbase0Msg0FirstEntry.size();
+
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+
+ VerifierCtxObj ctx(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable hash alg
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha384HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha512HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageUsingSha512256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ kSha512_256, this->kMemberPrecomp, &Prng::Generate,
+ &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable hash alg for TPM data
+
+TEST_F(EpidMemberTest,
+ PROTECTED_SignsMessageByCredentialUsingSha256HashAlg_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_PROTECTED_SignsMessageByCredentialUsingSha384HashAlg_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha384));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest,
+ DISABLED_PROTECTED_SignsMessageByCredentialUsingSha512HashAlg_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetHashAlg(member, kSha512));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable precomputed signatures
+
+TEST_F(EpidMemberTest, SignConsumesPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 3));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, SignConsumesPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 3));
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithoutPrecomputedSignaturesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ // test sign without precomputed signatures
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignsMessageWithoutPrecomputedSignaturesWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ // test sign without precomputed signatures
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Variable messages
+
+TEST_F(EpidMemberTest, SignsEmptyMessageNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidSign(member, msg.data(), 0, bsn.data(), bsn.size(),
+ sig, sig_len));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), 0));
+}
+
+TEST_F(EpidMemberTest, SignsEmptyMessageWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), 0, nullptr, 0, sig, sig_len));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), 0));
+}
+
+TEST_F(EpidMemberTest, SignsShortMessageNoSigRl) {
+ // check: 1, 13, 128, 256, 512, 1021, 1024 bytes
+ // 13 and 1021 are primes
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ size_t lengths[] = {1, 13, 128, 256,
+ 512, 1021, 1024}; // have desired lengths to loop over
+ std::vector<uint8_t> msg(
+ lengths[COUNT_OF(lengths) - 1]); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg[n] = (uint8_t)n;
+ }
+ for (auto length : lengths) {
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), length, nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << length << " failed";
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), length))
+ << "EpidVerify for message_len: " << length << " failed";
+ }
+}
+
+TEST_F(EpidMemberTest, SignsShortMessageWithSigRl) {
+ // check: 1, 13, 128, 256, 512, 1021, 1024 bytes
+ // 13 and 1021 are primes
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ size_t message_len = 0;
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ size_t lengths[] = {1, 13, 128, 256,
+ 512, 1021, 1024}; // have desired lengths to loop over
+ std::vector<uint8_t> msg(
+ lengths[COUNT_OF(lengths) - 1]); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ for (auto length : lengths) {
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), length, nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << message_len << " failed";
+ EXPECT_EQ(kEpidSigValid, EpidVerify(ctx, sig, sig_len, msg.data(), length))
+ << "EpidVerify for message_len: " << message_len << " failed";
+ }
+}
+
+TEST_F(EpidMemberTest, SignsLongMessageNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ std::vector<uint8_t> msg(1000000); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << 1000000 << " failed";
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()))
+ << "EpidVerify for message_len: " << 1000000 << " failed";
+}
+
+TEST_F(EpidMemberTest, SignsLongMessageWithSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ SigRl const* srl =
+ reinterpret_cast<SigRl const*>(this->kSigRl5EntryData.data());
+ size_t srl_size = this->kSigRl5EntryData.size() * sizeof(uint8_t);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(srl));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(ctx, srl, srl_size));
+ std::vector<uint8_t> msg(1000000); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ THROW_ON_EPIDERR(EpidMemberSetSigRl(member, srl, srl_size));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len))
+ << "EpidSign for message_len: " << 1000000 << " failed";
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()))
+ << "EpidVerify for message_len: " << 1000000 << " failed";
+}
+
+TEST_F(EpidMemberTest, SignsMsgContainingAllPossibleBytesNoSigRl) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ std::vector<uint8_t> sig_data(EpidGetSigSize(nullptr));
+ EpidSignature* sig = reinterpret_cast<EpidSignature*>(sig_data.data());
+ size_t sig_len = sig_data.size() * sizeof(uint8_t);
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ std::vector<uint8_t> msg = this->kData_0_255;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSign(member, msg.data(), msg.size(), nullptr, 0, sig, sig_len));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(ctx, sig, sig_len, msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/member/unittests/signbasic-test.cc b/epid/member/unittests/signbasic-test.cc
new file mode 100644
index 0000000..1f51508
--- /dev/null
+++ b/epid/member/unittests/signbasic-test.cc
@@ -0,0 +1,609 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// SignBasic unit tests.
+/*! \file */
+
+#include <cstring>
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/member/api.h"
+#include "epid/member/src/signbasic.h"
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+namespace {
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+/////////////////////////////////////////////////////////////////////////
+// Simple error cases
+TEST_F(EpidMemberTest, SignBasicFailsGivenNullParameters) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(nullptr, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), nullptr, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(member, nullptr, msg.size(), bsn.data(), bsn.size(),
+ &basic_sig, nullptr));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(member, msg.data(), msg.size(), nullptr, bsn.size(),
+ &basic_sig, nullptr));
+}
+TEST_F(EpidMemberTest, SignBasicFailsGivenNullBasenameAndNullRandomBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(),
+ nullptr, 0, &basic_sig, nullptr));
+}
+TEST_F(EpidMemberTest, SignBasicDoesNotComputeRandomBasenameGivenBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BigNumStr rnd_bsn = {0};
+ BigNumStr zero = {0};
+ BasicSignature basic_sig;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, &rnd_bsn));
+ EXPECT_EQ(zero, rnd_bsn);
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicFailsForBasenameWithoutRegisteredBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+}
+TEST_F(EpidMemberTest, SignBasicFailsForUnregisteredBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn0 = this->kBsn0;
+ auto& bsn1 = this->kBsn1;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn0.data(), bsn0.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn1.data(),
+ bsn1.size(), &basic_sig, nullptr));
+}
+/////////////////////////////////////////////////////////////////////////
+// Anonymity
+TEST_F(EpidMemberTest, BasicSignaturesOfSameMessageAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig1 = {0};
+ BasicSignature basic_sig2 = {0};
+ BigNumStr rnd_bsn = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig1, &rnd_bsn));
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig2, &rnd_bsn));
+ EXPECT_NE(0, memcmp(&basic_sig1, &basic_sig2, sizeof(BasicSignature)));
+}
+TEST_F(EpidMemberTest,
+ BasicSignaturesOfSameMessageWithSameBasenameAreDifferent) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig1;
+ BasicSignature basic_sig2;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig1, nullptr));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig2, nullptr));
+ EXPECT_NE(0, memcmp(&basic_sig1, &basic_sig2, sizeof(BasicSignature)));
+}
+/////////////////////////////////////////////////////////////////////////
+// Variable basename
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingRandomBase) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ BigNumStr zero = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_NE(0, memcmp(&rnd_bsn, &zero, sizeof(BigNumStr)));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsUsingRandomBaseWithCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ BigNumStr zero = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ EXPECT_NE(0, memcmp(&rnd_bsn, &zero, sizeof(BigNumStr)));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingBasename) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsUsingBasenameWithCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingBasenameUsingIKGFData) {
+ Prng my_prng;
+ GroupPubKey grp_public_key = *reinterpret_cast<const GroupPubKey*>(
+ this->kGroupPublicKeyDataIkgf.data());
+ PrivKey mbr_private_key =
+ *reinterpret_cast<const PrivKey*>(this->kMemberPrivateKeyDataIkgf.data());
+ MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate,
+ &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(grp_public_key);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ SignBasicSucceedsUsingRandomBaseWithRegisteredBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ SignBasicSucceedsUsingRandomBaseWithoutRegisteredBasenames) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+#ifndef TPM_TSS
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingBsnContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kData_0_255;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+#endif
+
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsAllPossibleBytesForCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kData_0_255;
+ // 0 - 123
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), 124));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(),
+ bsn.data(), 124, &basic_sig, nullptr));
+ VerifierCtxObj ctx1(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx1, bsn.data(), 124));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx1, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx1, &basic_sig, msg.data(), msg.size()));
+
+ // 124 - 247
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data() + 124, 124));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data() + 124, 124,
+ &basic_sig, nullptr));
+ VerifierCtxObj ctx2(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx2, bsn.data() + 124, 124));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx2, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx2, &basic_sig, msg.data(), msg.size()));
+
+ // 248 - 255
+ THROW_ON_EPIDERR(
+ EpidRegisterBasename(member, bsn.data() + 124 * 2, 256 - 124 * 2));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data() + 124 * 2,
+ 256 - 124 * 2, &basic_sig, nullptr));
+ VerifierCtxObj ctx3(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(ctx3, bsn.data() + 124 * 2, 256 - 124 * 2));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx3, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx3, &basic_sig, msg.data(), msg.size()));
+}
+/////////////////////////////////////////////////////////////////////////
+// Variable hash alg
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsUsingSha256HashAlgWithCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey, kSha256,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha384HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha512HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha512256HashAlg) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ kSha512_256, this->kMemberPrecomp, &Prng::Generate,
+ &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+/////////////////////////////////////////////////////////////////////////
+TEST_F(EpidMemberTest, SignBasicConsumesPrecomputedSignatures) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 3));
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ // use 1 precomputed signature
+ ASSERT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsWithPrecomputedSignatures) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsUsingPrecompSigWithCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+
+ auto& msg = this->kMsg0;
+
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn));
+
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsWithoutPrecomputedSignatures) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ THROW_ON_EPIDERR(EpidAddPreSigs(member, 1));
+ auto& msg = this->kMsg0;
+ BasicSignature basic_sig;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ ASSERT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // test sign without precomputed signatures
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ // verify basic signature
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+/////////////////////////////////////////////////////////////////////////
+// Variable messages
+TEST_F(EpidMemberTest, SignBasicSucceedsGivenEmptyMessage) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), 0, bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), 0));
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsWithShortMessage) {
+ // check: 1, 13, 128, 256, 512, 1021, 1024 bytes
+ // 13 and 1021 are primes
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ size_t lengths[] = {1, 13, 128, 256,
+ 512, 1021, 1024}; // have desired lengths to loop over
+ std::vector<uint8_t> msg(
+ lengths[COUNT_OF(lengths) - 1]); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ for (auto length : lengths) {
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), length, nullptr, 0,
+ &basic_sig, &rnd_bsn))
+ << "EpidSignBasic for message_len: " << length << " failed";
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), length))
+ << "EpidVerifyBasicSig for message_len: " << length << " failed";
+ }
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsWithLongMessage) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ BasicSignature basic_sig;
+ BigNumStr rnd_bsn = {0};
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ { // 1000000
+ std::vector<uint8_t> msg(1000000); // allocate message for max size
+ for (size_t n = 0; n < msg.size(); n++) {
+ msg.at(n) = (uint8_t)n;
+ }
+ EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr,
+ 0, &basic_sig, &rnd_bsn))
+ << "EpidSignBasic for message_len: " << 1000000 << " failed";
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()))
+ << "EpidVerifyBasicSig for message_len: " << 1000000 << " failed";
+ }
+}
+TEST_F(EpidMemberTest, SignBasicSucceedsWithMsgContainingAllPossibleBytes) {
+ Prng my_prng;
+ MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
+ this->kMemberPrecomp, &Prng::Generate, &my_prng);
+ auto& msg = this->kData_0_255;
+ auto& bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ BasicSignature basic_sig;
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ VerifierCtxObj ctx(this->kGroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidMemberTest,
+ PROTECTED_SignBasicSucceedsMsgAllPossibleBytesForCredential_EPS0) {
+ Prng my_prng;
+ MemberCtxObj member(
+ this->kEps0GroupPublicKey,
+ *(MembershipCredential const*)&this->kEps0MemberPrivateKey,
+ &Prng::Generate, &my_prng);
+ auto& msg = this->kData_0_255;
+ auto& bsn = this->kBsn0;
+ BasicSignature basic_sig;
+ THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidSignBasic(member, msg.data(), msg.size(), bsn.data(),
+ bsn.size(), &basic_sig, nullptr));
+ VerifierCtxObj ctx(this->kEps0GroupPublicKey);
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size()));
+}
+} // namespace
diff --git a/epid/member/unittests/storage-test.cc b/epid/member/unittests/storage-test.cc
new file mode 100644
index 0000000..0548e2b
--- /dev/null
+++ b/epid/member/unittests/storage-test.cc
@@ -0,0 +1,126 @@
+/*############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+ * \file
+ * \brief Member credentials storage helper API unit tests.
+ */
+#include <cstring>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+#include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/prng-testhelper.h"
+#include "epid/member/tpm2/unittests/tpm2-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+
+extern "C" {
+#include "epid/member/src/storage.h"
+#include "epid/member/tpm2/nv.h"
+}
+
+namespace {
+
+TEST_F(EpidMemberTest, NvWriteMembershipCredentialFailsGivenNullPointer) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+
+ uint32_t nv_index = 0x01c10100;
+ GroupPubKey const pub_key = this->kGroupPublicKey;
+ // PrivKey can be trimed to MembershipCredential
+ MembershipCredential const credential =
+ *(MembershipCredential*)&this->kMemberPrivateKey;
+
+ EXPECT_EQ(kEpidBadArgErr, EpidNvWriteMembershipCredential(
+ nullptr, &pub_key, &credential, nv_index));
+ EXPECT_EQ(kEpidBadArgErr, EpidNvWriteMembershipCredential(
+ tpm, nullptr, &credential, nv_index));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNvWriteMembershipCredential(tpm, &pub_key, nullptr, nv_index));
+ // cleanup nv_index for next test
+ Tpm2NvUndefineSpace(tpm, nv_index);
+}
+
+TEST_F(EpidMemberTest, NvReadMembershipCredentialFailsGivenNoCredentials) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+
+ uint32_t nv_index = 0x01c10101;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ // PrivKey can be trimed to MembershipCredential
+ MembershipCredential credential =
+ *(MembershipCredential*)&this->kMemberPrivateKey;
+
+ EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
+ tpm, nv_index, &pub_key, &credential));
+}
+
+TEST_F(EpidMemberTest, NvReadMembershipCredentialFailsGivenNullPointer) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+
+ uint32_t nv_index = 0x01c10100;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ // PrivKey can be trimed to MembershipCredential
+ MembershipCredential credential =
+ *(MembershipCredential*)&this->kMemberPrivateKey;
+
+ // write credentials
+ EXPECT_EQ(kEpidNoErr, EpidNvWriteMembershipCredential(tpm, &pub_key,
+ &credential, nv_index));
+
+ EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
+ nullptr, nv_index, &pub_key, &credential));
+ EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
+ tpm, nv_index, nullptr, &credential));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNvReadMembershipCredential(tpm, nv_index, &pub_key, nullptr));
+ // cleanup nv_index for next test
+ Tpm2NvUndefineSpace(tpm, nv_index);
+}
+
+TEST_F(EpidMemberTest, WrittenMembershipCredentialCanBeRead) {
+ Prng my_prng;
+ Epid2ParamsObj epid2params;
+ Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
+
+ uint32_t nv_index = 0x01c10100;
+ GroupPubKey pub_key = this->kGroupPublicKey;
+ // PrivKey can be trimed to MembershipCredential
+ MembershipCredential credential_expected =
+ *(MembershipCredential*)&this->kMemberPrivateKey;
+ MembershipCredential credential;
+
+ // write credentials
+ EXPECT_EQ(kEpidNoErr, EpidNvWriteMembershipCredential(
+ tpm, &pub_key, &credential_expected, nv_index));
+
+ // read credentials
+ EXPECT_EQ(kEpidNoErr, EpidNvReadMembershipCredential(tpm, nv_index, &pub_key,
+ &credential));
+
+ EXPECT_EQ(this->kGroupPublicKey, pub_key);
+ EXPECT_EQ(credential_expected, credential);
+ // cleanup nv_index for next test
+ Tpm2NvUndefineSpace(tpm, nv_index);
+}
+
+} // namespace
diff --git a/epid/verifier/1.1/api.h b/epid/verifier/1.1/api.h
new file mode 100644
index 0000000..ef8aa5b
--- /dev/null
+++ b/epid/verifier/1.1/api.h
@@ -0,0 +1,493 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_VERIFIER_1_1_API_H_
+#define EPID_VERIFIER_1_1_API_H_
+
+#include <stddef.h>
+#include "epid/common/1.1/types.h"
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/verifier/api.h"
+
+/*!
+ * \file
+ * \brief Intel(R) EPID SDK verifier Intel(R) EPID 1.1 API.
+ */
+
+/// Intel(R) EPID 1.1 Verifier functionality
+/*!
+ \defgroup Epid11VerifierModule Intel(R) EPID 1.1 support
+
+ To verify signatures coming from member devices that belong to an
+ Intel&reg; EPID 1.1 group, you need to use Intel&reg; EPID 1.1
+ verifier APIs.
+
+ If you are acting as a verifier for both Intel&reg; EPID 1.1 and 2.0
+ members, you can determine if you need version 1.1 or 2.0
+ verification by checking the Intel&reg; EPID version field in the
+ group public key file (see ::EpidParseFileHeader). You can also
+ check the version in other binary issuer material, such as the
+ GroupRL and SigRL.
+
+ The 1.1 verifier APIs take a verifier context as input. Each
+ verifier context (::Epid11VerifierCtx) represents a verifier for a
+ single group.
+
+ The Intel&reg; EPID 1.1 specification does not provide hash algorithm
+ selection and verifier blacklist revocation. Therefore, APIs such as
+ ::EpidVerifierSetHashAlg and ::EpidVerifierSetVerifierRl are not
+ available.
+
+ You can find the Intel&reg; EPID 1.1 API headers in the 1.1
+ directories, for example, `epid/verifier/1.1/api.h`.
+
+ Intel&reg; EPID 1.1 APIs and data structures are indicated with the
+ "Epid11" prefix. For example, the Intel&reg; EPID 1.1 version of
+ ::EpidParseGroupPubKeyFile is called ::Epid11ParseGroupPubKeyFile,
+ and the Intel&reg; EPID 1.1 version of `GroupRl` is `Epid11GroupRl`.
+
+ \ingroup EpidVerifierModule
+ @{
+*/
+
+/// Internal context of Intel(R) EPID 1.1 verifier.
+typedef struct Epid11VerifierCtx Epid11VerifierCtx;
+
+/// Intel(R) EPID 1.1 Pre-computed verifier settings.
+/*!
+ Serialized form of the information about a verifier that remains stable for
+ a given set of keys.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \note e12 = 0 implies that this data is not valid
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+#pragma pack(1)
+typedef struct Epid11VerifierPrecomp {
+ Epid11GroupId gid; ///< group ID
+ Epid11GtElemStr e12; ///< an element in GT
+ Epid11GtElemStr e22; ///< an element in GT
+ Epid11GtElemStr e2w; ///< an element in GT
+} Epid11VerifierPrecomp;
+#pragma pack()
+
+/// Creates a new Intel(R) EPID 1.1 verifier context.
+/*!
+ Must be called to create the verifier context that is used by
+ other "Verifier" APIs.
+
+ Allocates memory for the context, then initialize it.
+
+ Epid11VerifierDelete() must be called to safely release the member context.
+
+ \param[in] pub_key
+ The group certificate.
+ \param[in] precomp
+ Optional pre-computed data. If NULL the value is computed internally and is
+ readable using Epid11VerifierWritePrecomp().
+ \param[out] ctx
+ Newly constructed verifier context.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the content of ctx is undefined.
+
+ \see Epid11VerifierDelete
+ \see Epid11VerifierWritePrecomp
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11VerifierCreate(Epid11GroupPubKey const* pub_key,
+ Epid11VerifierPrecomp const* precomp,
+ Epid11VerifierCtx** ctx);
+
+/// Deletes an existing Intel(R) EPID 1.1 verifier context.
+/*!
+ Must be called to safely release a verifier context created using
+ Epid11VerifierCreate().
+
+ De-initializes the context, frees memory used by the context, and sets the
+ context pointer to NULL.
+
+ \param[in,out] ctx
+ The verifier context. Can be NULL.
+
+ \see Epid11VerifierCreate
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+void Epid11VerifierDelete(Epid11VerifierCtx** ctx);
+
+/// Serializes the pre-computed Intel(R) EPID 1.1 verifier settings.
+/*!
+
+ \param[in] ctx
+ The verifier context.
+ \param[out] precomp
+ The Serialized pre-computed verifier settings.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the content of precomp is undefined.
+
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11VerifierWritePrecomp(Epid11VerifierCtx const* ctx,
+ Epid11VerifierPrecomp* precomp);
+
+/// Sets the Intel(R) EPID 1.1 private key based revocation list.
+/*!
+ The caller is responsible to for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call will fail if trying to set an older version
+ of the revocation list than was last set.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \attention
+ The memory pointed to by priv_rl will be accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list will be undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by priv_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] priv_rl
+ The private key based revocation list.
+ \param[in] priv_rl_size
+ The size of the private key based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the private key based revocation list
+ pointed to by the verifier is undefined.
+
+ \see Epid11VerifierCreate
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11VerifierSetPrivRl(Epid11VerifierCtx* ctx,
+ Epid11PrivRl const* priv_rl,
+ size_t priv_rl_size);
+
+/// Sets the Intel(R) EPID 1.1 signature based revocation list.
+/*!
+ The caller is responsible to for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call will fail if trying to set an older version
+ of the revocation list than was last set.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \attention
+ The memory pointed to by sig_rl will be accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list will be undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by sig_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] sig_rl
+ The signature based revocation list.
+ \param[in] sig_rl_size
+ The size of the signature based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the signature based revocation list pointed
+ to by the verifier is undefined.
+
+ \see Epid11VerifierCreate
+ \see SdkOverview_11Verifier \see <a
+ href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+ support</b></a>
+ */
+EpidStatus Epid11VerifierSetSigRl(Epid11VerifierCtx* ctx,
+ Epid11SigRl const* sig_rl,
+ size_t sig_rl_size);
+
+/// Sets the Intel(R) EPID 1.1 group based revocation list.
+/*!
+ The caller is responsible to for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call will fail if trying to set an older version
+ of the revocation list than was last set.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \attention
+ The memory pointed to by grp_rl will be accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list will be undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by grp_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] grp_rl
+ The group based revocation list.
+ \param[in] grp_rl_size
+ The size of the group based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the group based revocation list pointed
+ to by the verifier is undefined.
+
+ \see Epid11VerifierCreate
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11VerifierSetGroupRl(Epid11VerifierCtx* ctx,
+ Epid11GroupRl const* grp_rl,
+ size_t grp_rl_size);
+
+/// Sets the basename to be used by a verifier.
+/*!
+ This API allows setting a zero length base name.
+
+ \warning
+ Not all members in the Intel(R) EPID 1.1 ecosystem may support zero length
+ basenames. They may interpret a zero length basename as random base.
+
+ \param[in, out] ctx
+ The verifier context.
+ \param[in] basename
+ The basename. Pass NULL for random base.
+ \param[in] basename_len
+ Number of bytes in basename buffer. Must be 0 if basename is NULL.
+
+ \returns ::EpidStatus
+
+ \see Epid11VerifierCreate
+
+*/
+EpidStatus Epid11VerifierSetBasename(Epid11VerifierCtx* ctx,
+ void const* basename, size_t basename_len);
+
+/// Verifies an Intel(R) EPID 1.1 signature and checks revocation status.
+/*!
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The signature.
+ \param[in] sig_len
+ The size of sig in bytes.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigValid
+ Signature validated successfully
+ \retval ::kEpidSigInvalid
+ Signature is invalid
+ \retval ::kEpidSigRevokedInGroupRl
+ Signature revoked in GroupRl
+ \retval ::kEpidSigRevokedInPrivRl
+ Signature revoked in PrivRl
+ \retval ::kEpidSigRevokedInSigRl
+ Signature revoked in SigRl
+
+ \note
+ If the result is not ::kEpidNoErr or one of the values listed above the
+ verify should de considered to have failed.
+
+ \see Epid11VerifierCreate
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11Verify(Epid11VerifierCtx const* ctx,
+ Epid11Signature const* sig, size_t sig_len,
+ void const* msg, size_t msg_len);
+
+/// Determines if two Intel(R) EPID 1.1 signatures are linked.
+/*!
+ The Intel(R) EPID scheme allows signatures to be linked. If basename
+ option is specified when signing signatures with the same basename will be
+ linkable. This linking capability allows the verifier, or anyone, to know
+ whether two Intel(R) EPID signatures are generated by the same member.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \param[in] sig1
+ A basic signature.
+ \param[in] sig2
+ A basic signature.
+
+ \result bool
+
+ \retval true
+ if the signatures were generated by the same member
+ \retval false
+ if it couldn't be determined if the signatures were generated by
+ the same member
+
+ \note
+ The input signatures should be verified using Epid11VerifyBasicSig() before
+ invocation. Behavior is undefined if either of the signatures cannot be
+ verified.
+
+ \see Epid11VerifyBasicSig
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+bool Epid11AreSigsLinked(Epid11BasicSignature const* sig1,
+ Epid11BasicSignature const* sig2);
+
+/// Verifies an Intel(R) EPID 1.1 member signature without revocation checks.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ This function should be used in conjunction with Epid11NrVerify() and
+ Epid11CheckPrivRlEntry().
+
+ \note
+ If the result is not ::kEpidNoErr the verify should be considered to have
+ failed.
+
+ \see Epid11VerifierCreate
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11VerifyBasicSig(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig,
+ void const* msg, size_t msg_len);
+
+/// Verifies the non-revoked proof for a single Intel(R) EPID 1.1 signature
+/// based revocation list entry.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+ \param[in] sigrl_entry
+ The signature based revocation list entry.
+ \param[in] proof
+ The non-revoked proof.
+
+ \returns ::EpidStatus
+
+ \note
+ Sig should be verified using Epid11VerifyBasicSig() before invocation. Behavior
+ is undefined if sig cannot be verified.
+
+ \note
+ This function should be used in conjunction with Epid11VerifyBasicSig() and
+ Epid11CheckPrivRlEntry().
+
+ \note
+ If the result is not ::kEpidNoErr the verify should de considered to have
+ failed.
+
+ \see Epid11VerifierCreate
+ \see Epid11VerifyBasicSig
+ \see Epid11CheckPrivRlEntry
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11NrVerify(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig, void const* msg,
+ size_t msg_len, Epid11SigRlEntry const* sigrl_entry,
+ Epid11NrProof const* proof);
+
+/// Verifies an Intel(R) EPID 1.1 signature has not been revoked in the
+/// private key based revocation list.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ This API supports Intel(R) EPID 1.1 verification.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] f
+ The private key based revocation list entry.
+
+ \note
+ Sig should be verified using Epid11VerifyBasicSig() before invocation. Behavior
+ is undefined if sig cannot be verified.
+
+ \note
+ This function should be used in conjunction with Epid11NrVerify() and
+ Epid11VerifyBasicSig().
+
+ \note
+ If the result is not ::kEpidNoErr the verify should de considered to have
+ failed.
+
+ \returns ::EpidStatus
+ \see Epid11VerifierCreate
+ \see Epid11NrVerify
+ \see Epid11VerifyBasicSig
+ \see <a href="group___epid11_verifier_module.html#details"><b>Intel(R) EPID 1.1
+support</b></a>
+ */
+EpidStatus Epid11CheckPrivRlEntry(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig,
+ FpElemStr const* f);
+
+/*! @} */
+#endif // EPID_VERIFIER_1_1_API_H_
diff --git a/epid/verifier/1.1/src/check_privrl_entry.c b/epid/verifier/1.1/src/check_privrl_entry.c
new file mode 100644
index 0000000..1b56ca7
--- /dev/null
+++ b/epid/verifier/1.1/src/check_privrl_entry.c
@@ -0,0 +1,90 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11CheckPrivRlEntry implementation.
+*/
+
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+EpidStatus Epid11CheckPrivRlEntry(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig,
+ FpElemStr const* f) {
+ EpidStatus result = kEpidErr;
+ EcPoint* b = NULL;
+ EcPoint* k = NULL;
+ EcPoint* t5 = NULL;
+ EcGroup* G3 = NULL;
+ if (!ctx || !sig || !f) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid11_params || !ctx->epid11_params->G3) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // Section 4.1.2 Step 31. The verifier computes t5 = G3.exp(B, f)
+ // and verifies that G3.isEqual(t5, K) = false
+ bool compare_result = false;
+ G3 = ctx->epid11_params->G3;
+ result = NewEcPoint(G3, &b);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = NewEcPoint(G3, &k);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = NewEcPoint(G3, &t5);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = ReadEcPoint(G3, &sig->B, sizeof(sig->B), b);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = ReadEcPoint(G3, &sig->K, sizeof(sig->K), k);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = EcExp(G3, b, (BigNumStr const*)f, t5);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ result = EcIsEqual(G3, t5, k, &compare_result);
+ if (kEpidNoErr != result) {
+ result = kEpidMathErr;
+ break;
+ }
+ // if t5 == k, sig revoked in PrivRl
+ if (compare_result) {
+ result = kEpidSigRevokedInPrivRl;
+ } else {
+ result = kEpidNoErr;
+ }
+ } while (0);
+
+ DeleteEcPoint(&t5);
+ DeleteEcPoint(&k);
+ DeleteEcPoint(&b);
+ return result;
+}
diff --git a/epid/verifier/1.1/src/context.c b/epid/verifier/1.1/src/context.c
new file mode 100644
index 0000000..3b80007
--- /dev/null
+++ b/epid/verifier/1.1/src/context.c
@@ -0,0 +1,450 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Intel Intel(R) EPID 1.1 Verifier context implementation.
+*/
+
+#include "epid/verifier/1.1/src/context.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/memory.h"
+#include "epid/verifier/1.1/api.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// create Verifier precomp of the Epid11VerifierCtx
+static EpidStatus DoPrecomputation(Epid11VerifierCtx* ctx);
+
+/// Read Verifier precomp
+static EpidStatus ReadPrecomputation(Epid11VerifierPrecomp const* precomp_str,
+ Epid11VerifierCtx* ctx);
+
+/// Internal function to prove if group based revocation list is valid
+static bool Epid11IsGroupRlValid(Epid11GroupRl const* group_rl,
+ size_t grp_rl_size) {
+ const size_t kMinGroupRlSize = sizeof(Epid11GroupRl) - sizeof(Epid11GroupId);
+ size_t input_grp_rl_size = 0;
+
+ if (!group_rl) {
+ return false;
+ }
+ if (grp_rl_size < kMinGroupRlSize) {
+ return false;
+ }
+ if (ntohl(group_rl->n3) >
+ (SIZE_MAX - kMinGroupRlSize) / sizeof(Epid11GroupId)) {
+ return false;
+ }
+ input_grp_rl_size =
+ kMinGroupRlSize + (ntohl(group_rl->n3) * sizeof(Epid11GroupId));
+ if (input_grp_rl_size != grp_rl_size) {
+ return false;
+ }
+ return true;
+}
+/// Internal function to prove if signature based revocation list is valid
+bool Epid11IsSigRlValid(Epid11GroupId const* gid, Epid11SigRl const* sig_rl,
+ size_t sig_rl_size) {
+ const size_t kMinSigRlSize = sizeof(Epid11SigRl) - sizeof(Epid11SigRlEntry);
+ size_t input_sig_rl_size = 0;
+ if (!gid || !sig_rl || kMinSigRlSize > sig_rl_size) {
+ return false;
+ }
+ if (ntohl(sig_rl->n2) > (SIZE_MAX - kMinSigRlSize) / sizeof(sig_rl->bk[0])) {
+ return false;
+ }
+ // sanity check of intput SigRl size
+ input_sig_rl_size = kMinSigRlSize + ntohl(sig_rl->n2) * sizeof(sig_rl->bk[0]);
+ if (input_sig_rl_size != sig_rl_size) {
+ return false;
+ }
+ // verify that gid given and gid in SigRl match
+ if (0 != memcmp(gid, &sig_rl->gid, sizeof(*gid))) {
+ return false;
+ }
+ return true;
+}
+/// Internal function to verify if Intel(R) EPID 1.1 private key based
+/// revocation list is valid
+static bool IsEpid11PrivRlValid(Epid11GroupId const* gid,
+ Epid11PrivRl const* priv_rl,
+ size_t priv_rl_size) {
+ const size_t kMinPrivRlSize = sizeof(Epid11PrivRl) - sizeof(FpElemStr);
+ size_t input_priv_rl_size = 0;
+
+ if (!gid || !priv_rl || kMinPrivRlSize > priv_rl_size) {
+ return false;
+ }
+ if (ntohl(priv_rl->n1) >
+ (SIZE_MAX - kMinPrivRlSize) / sizeof(priv_rl->f[0])) {
+ return false;
+ }
+ // sanity check of input Epid11PrivRl size
+ input_priv_rl_size =
+ kMinPrivRlSize + ntohl(priv_rl->n1) * sizeof(priv_rl->f[0]);
+ if (input_priv_rl_size != priv_rl_size) {
+ return false;
+ }
+ // verify that gid given and gid in Epid11PrivRl match
+ if (0 != memcmp(gid, &priv_rl->gid, sizeof(*gid))) {
+ return false;
+ }
+ return true;
+}
+
+EpidStatus Epid11VerifierCreate(Epid11GroupPubKey const* pub_key,
+ Epid11VerifierPrecomp const* precomp,
+ Epid11VerifierCtx** ctx) {
+ EpidStatus result = kEpidErr;
+ Epid11VerifierCtx* verifier_ctx = NULL;
+ if (!pub_key || !ctx) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // Allocate memory for VerifierCtx
+ verifier_ctx = SAFE_ALLOC(sizeof(Epid11VerifierCtx));
+ if (!verifier_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // Internal representation of Epid11Params
+ result = CreateEpid11Params(&verifier_ctx->epid11_params);
+ BREAK_ON_EPID_ERROR(result);
+ // Internal representation of Group Pub Key
+ result = CreateEpid11GroupPubKey(pub_key, verifier_ctx->epid11_params->G1,
+ verifier_ctx->epid11_params->G2,
+ &verifier_ctx->pub_key);
+ BREAK_ON_EPID_ERROR(result);
+ // Store group public key strings for later use
+ result =
+ SetKeySpecificEpid11CommitValues(pub_key, &verifier_ctx->commit_values);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Allocate verifier_ctx->e12
+ result = NewFfElement(verifier_ctx->epid11_params->GT, &verifier_ctx->e12);
+ BREAK_ON_EPID_ERROR(result);
+ // Allocate verifier_ctx->e22
+ result = NewFfElement(verifier_ctx->epid11_params->GT, &verifier_ctx->e22);
+ BREAK_ON_EPID_ERROR(result);
+ // Allocate verifier_ctx->e2w
+ result = NewFfElement(verifier_ctx->epid11_params->GT, &verifier_ctx->e2w);
+ BREAK_ON_EPID_ERROR(result);
+ // precomputation
+ if (precomp != NULL) {
+ result = ReadPrecomputation(precomp, verifier_ctx);
+ } else {
+ result = DoPrecomputation(verifier_ctx);
+ }
+ BREAK_ON_EPID_ERROR(result);
+ verifier_ctx->sig_rl = NULL;
+ verifier_ctx->group_rl = NULL;
+ verifier_ctx->priv_rl = NULL;
+ *ctx = verifier_ctx;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result && verifier_ctx) {
+ DeleteFfElement(&verifier_ctx->e2w);
+ DeleteFfElement(&verifier_ctx->e22);
+ DeleteFfElement(&verifier_ctx->e12);
+ DeleteEpid11GroupPubKey(&verifier_ctx->pub_key);
+ DeleteEpid11Params(&verifier_ctx->epid11_params);
+ SAFE_FREE(verifier_ctx);
+ }
+ return result;
+}
+
+void Epid11VerifierDelete(Epid11VerifierCtx** ctx) {
+ if (ctx && *ctx) {
+ DeleteFfElement(&(*ctx)->e2w);
+ DeleteFfElement(&(*ctx)->e22);
+ DeleteFfElement(&(*ctx)->e12);
+ DeleteEpid11GroupPubKey(&(*ctx)->pub_key);
+ DeleteEpid11Params(&(*ctx)->epid11_params);
+ (*ctx)->priv_rl = NULL;
+ (*ctx)->sig_rl = NULL;
+ (*ctx)->group_rl = NULL;
+ DeleteEcPoint(&(*ctx)->basename_hash);
+ SAFE_FREE((*ctx)->basename);
+ (*ctx)->basename_len = 0;
+ SAFE_FREE(*ctx);
+ }
+}
+
+EpidStatus Epid11VerifierWritePrecomp(Epid11VerifierCtx const* ctx,
+ Epid11VerifierPrecomp* precomp) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL; // an element in GT
+ FfElement* e22 = NULL; // an element in GT
+ FfElement* e2w = NULL; // an element in GT
+ FiniteField* GT = NULL; // Finite field GT(Fq6)
+ if (!ctx || !ctx->e12 || !ctx->e22 || !ctx->e2w || !ctx->epid11_params ||
+ !(ctx->epid11_params->GT) || !ctx->pub_key || !precomp) {
+ return kEpidBadArgErr;
+ }
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+ GT = ctx->epid11_params->GT;
+
+ precomp->gid = ctx->pub_key->gid;
+ result = WriteFfElement(GT, e12, &(precomp->e12), sizeof(precomp->e12));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = WriteFfElement(GT, e22, &(precomp->e22), sizeof(precomp->e22));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = WriteFfElement(GT, e2w, &(precomp->e2w), sizeof(precomp->e2w));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return result;
+}
+
+EpidStatus Epid11VerifierSetPrivRl(Epid11VerifierCtx* ctx,
+ Epid11PrivRl const* priv_rl,
+ size_t priv_rl_size) {
+ if (!ctx || !priv_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!IsEpid11PrivRlValid(&ctx->pub_key->gid, priv_rl, priv_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of Epid11PrivRl
+ if (ctx->priv_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->priv_rl->version);
+ incoming_ver = ntohl(priv_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->priv_rl = priv_rl;
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11VerifierSetSigRl(Epid11VerifierCtx* ctx,
+ Epid11SigRl const* sig_rl,
+ size_t sig_rl_size) {
+ if (!ctx || !sig_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of sig rl
+ if (ctx->sig_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->sig_rl->version);
+ incoming_ver = ntohl(sig_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ if (!Epid11IsSigRlValid(&ctx->pub_key->gid, sig_rl, sig_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ ctx->sig_rl = sig_rl;
+
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11VerifierSetGroupRl(Epid11VerifierCtx* ctx,
+ Epid11GroupRl const* grp_rl,
+ size_t grp_rl_size) {
+ if (!ctx || !grp_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!Epid11IsGroupRlValid(grp_rl, grp_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of group rl
+ if (ctx->group_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->group_rl->version);
+ incoming_ver = ntohl(grp_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->group_rl = grp_rl;
+
+ return kEpidNoErr;
+}
+
+EpidStatus Epid11VerifierSetBasename(Epid11VerifierCtx* ctx,
+ void const* basename,
+ size_t basename_len) {
+ EpidStatus result = kEpidErr;
+ EcPoint* basename_hash = NULL;
+ uint8_t* basename_buffer = NULL;
+
+ if (!ctx || !ctx->epid11_params || !ctx->epid11_params->G3) {
+ return kEpidBadArgErr;
+ }
+ if (!basename && basename_len > 0) {
+ return kEpidBadArgErr;
+ }
+
+ if (!basename) {
+ ctx->basename_len = 0;
+ DeleteEcPoint(&ctx->basename_hash);
+ SAFE_FREE(ctx->basename);
+ return kEpidNoErr;
+ }
+
+ do {
+ EcGroup* G3 = ctx->epid11_params->G3;
+ result = NewEcPoint(G3, &basename_hash);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ result = Epid11EcHash(G3, basename, basename_len, basename_hash);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ if (basename_len > 0) {
+ basename_buffer = SAFE_ALLOC(basename_len);
+ if (!basename_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ }
+
+ ctx->basename_len = basename_len;
+
+ if (basename_len > 0) {
+ // memcpy is used to copy variable length basename
+ if (0 != memcpy_S(basename_buffer, ctx->basename_len, basename,
+ basename_len)) {
+ result = kEpidErr;
+ break;
+ }
+ }
+ DeleteEcPoint(&ctx->basename_hash);
+ SAFE_FREE(ctx->basename);
+ ctx->basename = basename_buffer;
+ ctx->basename_hash = basename_hash;
+
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ DeleteEcPoint(&basename_hash);
+ SAFE_FREE(basename_buffer);
+ }
+ return result;
+}
+
+static EpidStatus DoPrecomputation(Epid11VerifierCtx* ctx) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL;
+ FfElement* e22 = NULL;
+ FfElement* e2w = NULL;
+ Epid11Params_* params = NULL;
+ Epid11GroupPubKey_* pub_key = NULL;
+ Epid11PairingState* ps_ctx = NULL;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid11_params || !ctx->epid11_params->GT ||
+ !ctx->epid11_params->pairing_state || !ctx->pub_key || !ctx->e12 ||
+ !ctx->e22 || !ctx->e2w) {
+ return kEpidBadArgErr;
+ }
+ pub_key = ctx->pub_key;
+ params = ctx->epid11_params;
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+ ps_ctx = params->pairing_state;
+ // do precomputation
+ // 1. The verifier computes e12 = pairing(h1, g2).
+ result = Epid11Pairing(ps_ctx, pub_key->h1, params->g2, e12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ // 2. The verifier computes e22 = pairing(h2, g2).
+ result = Epid11Pairing(ps_ctx, pub_key->h2, params->g2, e22);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ // 3. The verifier computes e2w = pairing(h2, w).
+ result = Epid11Pairing(ps_ctx, pub_key->h2, pub_key->w, e2w);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
+static EpidStatus ReadPrecomputation(Epid11VerifierPrecomp const* precomp_str,
+ Epid11VerifierCtx* ctx) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL;
+ FfElement* e22 = NULL;
+ FfElement* e2w = NULL;
+ FiniteField* GT = NULL;
+ Epid11Params_* params = NULL;
+ unsigned int current_gid = 0;
+ unsigned int incoming_gid = 0;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid11_params || !ctx->epid11_params->GT || !ctx->e12 ||
+ !ctx->e22 || !ctx->e2w) {
+ return kEpidBadArgErr;
+ }
+
+ if (!ctx->pub_key || !precomp_str) return kEpidBadArgErr;
+
+ current_gid = ntohl(ctx->pub_key->gid);
+ incoming_gid = ntohl(precomp_str->gid);
+
+ if (current_gid != incoming_gid) {
+ return kEpidBadArgErr;
+ }
+
+ params = ctx->epid11_params;
+ GT = params->GT;
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+
+ result = ReadFfElement(GT, &precomp_str->e12, sizeof(precomp_str->e12), e12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = ReadFfElement(GT, &precomp_str->e22, sizeof(precomp_str->e22), e22);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = ReadFfElement(GT, &precomp_str->e2w, sizeof(precomp_str->e2w), e2w);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/verifier/1.1/src/context.h b/epid/verifier/1.1/src/context.h
new file mode 100644
index 0000000..653048b
--- /dev/null
+++ b/epid/verifier/1.1/src/context.h
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_VERIFIER_1_1_SRC_CONTEXT_H_
+#define EPID_VERIFIER_1_1_SRC_CONTEXT_H_
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 Verifier context interface.
+ */
+#include "epid/common/1.1/src/commitment.h"
+#include "epid/common/1.1/src/epid11params.h"
+#include "epid/common/1.1/src/grouppubkey.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+
+/// Verifier context definition
+struct Epid11VerifierCtx {
+ Epid11GroupPubKey_* pub_key; ///< Group public key
+ /// Verifier pre-computation
+ FfElement* e12; ///< an element in GT
+ FfElement* e22; ///< an element in GT
+ FfElement* e2w; ///< an element in GT
+ /// Revocation lists
+ Epid11PrivRl const* priv_rl; ///< Private key based RL - not owned
+ Epid11SigRl const* sig_rl; ///< Signature based RL - not owned
+ Epid11GroupRl const* group_rl; ///< Group RL - not owned
+
+ Epid11Params_* epid11_params; ///< Intel(R) EPID 1.1 params
+ Epid11CommitValues commit_values; ///< Hashed values to create commitment
+ uint8_t* basename; ///< Basename to use - NULL for random base
+ size_t basename_len; ///< Number of bytes in basename
+ EcPoint* basename_hash; ///< Epid11EcHash of the basename
+};
+
+#endif // EPID_VERIFIER_1_1_SRC_CONTEXT_H_
diff --git a/epid/verifier/1.1/src/nrverify.c b/epid/verifier/1.1/src/nrverify.c
new file mode 100644
index 0000000..7dd7126
--- /dev/null
+++ b/epid/verifier/1.1/src/nrverify.c
@@ -0,0 +1,253 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11NrVerify implementation.
+*/
+#include "epid/common/math/hash.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/memory.h"
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+#include "ext/ipp/include/ippcp.h"
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+#pragma pack(1)
+/// Storage for values to create commitment in NrVerify algorithm
+typedef struct Epid11NrVerifyCommitValues {
+ BigNumStr p_tick; //!< A large prime (256-bit)
+ Epid11G3ElemStr g3; //!< Generator of G3 (512-bit)
+ Epid11G3ElemStr B; //!< (element of G3): part of basic signature Sigma0
+ Epid11G3ElemStr K; //!< (element of G3): part of basic signature Sigma0
+ Epid11G3ElemStr B_tick; //!< (element of G3): one entry in SigRL
+ Epid11G3ElemStr K_tick; //!< (element of G3): one entry in SigRL
+ Epid11G3ElemStr T; //!< element of G3
+ Epid11G3ElemStr R1; //!< element of G3
+ Epid11G3ElemStr R2; //!< element of G3
+ uint32_t msg_len; //!< length of the message
+ uint8_t msg[1]; //!< message
+} Epid11NrVerifyCommitValues;
+#pragma pack()
+
+EpidStatus Epid11NrVerify(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig, void const* msg,
+ size_t msg_len, Epid11SigRlEntry const* sigrl_entry,
+ Epid11NrProof const* proof) {
+ size_t const cv_header_len =
+ sizeof(Epid11NrVerifyCommitValues) - sizeof(uint8_t);
+ Epid11NrVerifyCommitValues* commit_values = NULL;
+ size_t const commit_len = sizeof(Epid11NrVerifyCommitValues) + msg_len - 1;
+ EpidStatus res = kEpidErr;
+ // Epid11 G3 elements
+ EcPoint* T = NULL;
+ EcPoint* R1 = NULL;
+ EcPoint* R2 = NULL;
+
+ EcPoint* K = NULL;
+ EcPoint* B = NULL;
+ EcPoint* K_tick = NULL;
+ EcPoint* B_tick = NULL;
+
+ // Big integers
+ BigNum* smu = NULL;
+ BigNum* snu = NULL;
+ BigNum* nc_tick_bn = NULL;
+ Sha256Digest commit_hash;
+
+ if (!ctx || !sig || !proof || !sigrl_entry) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ return kEpidBadArgErr;
+ }
+ if (msg_len > (UINT_MAX - cv_header_len)) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid11_params) {
+ return kEpidBadArgErr;
+ }
+ do {
+ bool cmp_result = false;
+ // handy shorthands:
+ EcGroup* G3 = ctx->epid11_params->G3;
+ BigNum* p_tick_bn = ctx->epid11_params->p_tick;
+
+ if (!G3 || !p_tick_bn) {
+ res = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(res);
+ }
+
+ commit_values = SAFE_ALLOC(commit_len);
+ if (commit_values == NULL) {
+ res = kEpidMemAllocErr;
+ break;
+ }
+ // 1. We use the following variables T, R1, R2 (elements of G3), and c, smu,
+ // snu, nc (big integers).
+ res = NewEcPoint(G3, &T);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &R1);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &R2);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewEcPoint(G3, &K);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &B);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &K_tick);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &B_tick);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewBigNum(sizeof(proof->smu), &smu);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(proof->smu), &snu);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewBigNum(sizeof(FpElemStr), &nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 2. The verifier verifies that G3.inGroup(T) = true.
+ res = ReadEcPoint(G3, &(proof->T), sizeof(proof->T), T);
+ if (kEpidNoErr != res) {
+ res = kEpidBadArgErr;
+ break;
+ }
+
+ // 3. The verifier verifies that G3.isIdentity(T) = false.
+ res = EcIsIdentity(G3, T, &(cmp_result));
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result) {
+ res = kEpidBadArgErr;
+ break;
+ }
+
+ // 4. The verifier verifies that smu, snu in [0, p'-1].
+ res = WriteBigNum(ctx->epid11_params->p_tick, sizeof(commit_values->p_tick),
+ &commit_values->p_tick);
+ BREAK_ON_EPID_ERROR(res);
+ if (memcmp(&proof->smu, &commit_values->p_tick, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&proof->snu, &commit_values->p_tick, sizeof(FpElemStr)) >= 0) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ // 5. The verifier computes nc = (- c) mod p'.
+ res = ReadBigNum(&(proof->c), sizeof(proof->c), nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumMod(nc_tick_bn, p_tick_bn, nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ // (-c) mod p' == p' - (c mod p')
+ res = BigNumSub(p_tick_bn, nc_tick_bn, nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 6. The verifier computes R1 = G3.multiExp(K, smu, B, snu).
+ res = ReadEcPoint(G3, &(sig->K), sizeof(sig->K), K);
+ if (kEpidNoErr != res) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ res = ReadEcPoint(G3, &(sig->B), sizeof(sig->B), B);
+ if (kEpidNoErr != res) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ res = ReadBigNum(&(proof->smu), sizeof(proof->smu), smu);
+ BREAK_ON_EPID_ERROR(res);
+ res = ReadBigNum(&(proof->snu), sizeof(proof->snu), snu);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[2];
+ BigNum const* exponents[2];
+ points[0] = K;
+ points[1] = B;
+ exponents[0] = smu;
+ exponents[1] = snu;
+ res = EcMultiExpBn(G3, points, exponents, COUNT_OF(points), R1);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 7. The verifier computes R2 = G3.multiExp(K', smu, B', snu, T, nc).
+ res = ReadEcPoint(G3, &(sigrl_entry->k), sizeof(sigrl_entry->k), K_tick);
+ if (kEpidNoErr != res) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ res = ReadEcPoint(G3, &(sigrl_entry->b), sizeof(sigrl_entry->b), B_tick);
+ if (kEpidNoErr != res) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ {
+ EcPoint const* points[3];
+ BigNum const* exponents[3];
+ points[0] = K_tick;
+ points[1] = B_tick;
+ points[2] = T;
+ exponents[0] = smu;
+ exponents[1] = snu;
+ exponents[2] = nc_tick_bn;
+ res = EcMultiExpBn(G3, points, exponents, COUNT_OF(points), R2);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 8. The verifier verifies c = Hash(p' || g3 || B || K || B' || K' || T ||
+ // R1 || R2 || mSize || m).
+ if (msg) {
+ // Memory copy is used to copy a message of variable length
+ if (0 != memcpy_S(&commit_values->msg[0], msg_len, msg, msg_len)) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ }
+ commit_values->g3 = ctx->commit_values.g3;
+ commit_values->B = sig->B;
+ commit_values->K = sig->K;
+ commit_values->B_tick = sigrl_entry->b;
+ commit_values->K_tick = sigrl_entry->k;
+ commit_values->T = proof->T;
+ commit_values->msg_len = ntohl(msg_len);
+ res = WriteEcPoint(G3, R1, &commit_values->R1, sizeof(commit_values->R1));
+ BREAK_ON_EPID_ERROR(res);
+ res = WriteEcPoint(G3, R2, &commit_values->R2, sizeof(commit_values->R2));
+ BREAK_ON_EPID_ERROR(res);
+ res = Sha256MessageDigest(commit_values, commit_len, &commit_hash);
+ if (0 != memcmp(&proof->c, &commit_hash, sizeof(proof->c))) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ } while (0);
+ SAFE_FREE(commit_values);
+ DeleteEcPoint(&T);
+ DeleteEcPoint(&R1);
+ DeleteEcPoint(&R2);
+
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&K_tick);
+ DeleteEcPoint(&B_tick);
+
+ DeleteBigNum(&smu);
+ DeleteBigNum(&snu);
+
+ DeleteBigNum(&nc_tick_bn);
+
+ return res;
+}
diff --git a/epid/verifier/1.1/src/sigs_linked.c b/epid/verifier/1.1/src/sigs_linked.c
new file mode 100644
index 0000000..96863f6
--- /dev/null
+++ b/epid/verifier/1.1/src/sigs_linked.c
@@ -0,0 +1,29 @@
+/*############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11AreSigsLinked implementation.
+*/
+
+#include <string.h>
+#include "epid/verifier/1.1/api.h"
+
+bool Epid11AreSigsLinked(Epid11BasicSignature const* sig1,
+ Epid11BasicSignature const* sig2) {
+ return (sig1 && sig2 && 0 == memcmp(&sig1->B, &sig2->B, sizeof(sig2->B)) &&
+ 0 == memcmp(&sig1->K, &sig2->K, sizeof(sig2->K)));
+}
diff --git a/epid/verifier/1.1/src/verify.c b/epid/verifier/1.1/src/verify.c
new file mode 100644
index 0000000..257aee0
--- /dev/null
+++ b/epid/verifier/1.1/src/verify.c
@@ -0,0 +1,246 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11Verify implementation.
+*/
+
+#include <string.h>
+#include "epid/common/src/endian_convert.h"
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+
+static size_t Epid11GetSignatureRlCount(Epid11Signature const* sig) {
+ return (!sig) ? 0 : ntohl(sig->n2);
+}
+
+static size_t Epid11GetGroupRlCount(Epid11GroupRl const* rl) {
+ return (!rl) ? 0 : ntohl(rl->n3);
+}
+
+static size_t Epid11GetSigRlCount(Epid11SigRl const* rl) {
+ return (!rl) ? 0 : ntohl(rl->n2);
+}
+
+static size_t Epid11GetPrivRlCount(Epid11PrivRl const* rl) {
+ return (!rl) ? 0 : ntohl(rl->n1);
+}
+
+/// Check PrivRL status of a signature for one PrivRl entry
+/*!
+computes t5 =G3.exp(B, f[i]) and verifies that G3.isEqual(t5, K) = false.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] f_str
+ priv_rl entry to check.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidNoErr
+ Signature was not revoked
+ \retval ::kEpidSigRevokedInPrivRl
+ Signature revoked in PrivRl
+*/
+EpidStatus Epid11PrVerify(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig, BigNumStr* f_str) {
+ EpidStatus sts = kEpidErr;
+ EcPoint* B = NULL;
+ EcPoint* K = NULL;
+ EcPoint* t5 = NULL;
+ FfElement* f = NULL;
+ EcGroup* G3 = ctx->epid11_params->G3;
+ FiniteField* Fp = ctx->epid11_params->Fp;
+ bool eq = false;
+ do {
+ sts = NewFfElement(Fp, &f);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = NewEcPoint(G3, &B);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = NewEcPoint(G3, &K);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = NewEcPoint(G3, &t5);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ // ReadFfElement checks that the value f_str is in the field
+ sts = ReadFfElement(Fp, f_str, sizeof(BigNumStr), f);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = ReadEcPoint(G3, &sig->B, sizeof(sig->B), B);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = ReadEcPoint(G3, &sig->K, sizeof(sig->K), K);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = EcExp(G3, B, f_str, t5);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ sts = EcIsEqual(G3, t5, K, &eq);
+ if (kEpidNoErr != sts) {
+ sts = kEpidMathErr;
+ break;
+ }
+ if (eq) {
+ sts = kEpidSigRevokedInPrivRl;
+ } else {
+ sts = kEpidNoErr;
+ }
+ } while (0);
+ DeleteFfElement(&f);
+ DeleteEcPoint(&t5);
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&B);
+ return sts;
+}
+
+EpidStatus Epid11Verify(Epid11VerifierCtx const* ctx,
+ Epid11Signature const* sig, size_t sig_len,
+ void const* msg, size_t msg_len) {
+ // Step 1. Setup
+ size_t const sig_header_len =
+ (sizeof(Epid11Signature) - sizeof(Epid11NrProof));
+ EpidStatus sts = kEpidErr;
+ size_t rl_count = 0;
+ size_t i;
+ if (!sig || !ctx || !ctx->epid11_params || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (sig_len < sig_header_len) {
+ return kEpidBadArgErr;
+ }
+ rl_count = Epid11GetSignatureRlCount(sig);
+ if (rl_count > (SIZE_MAX - sig_header_len) / sizeof(sig->sigma[0]) ||
+ (rl_count * sizeof(sig->sigma[0])) + sig_header_len != sig_len) {
+ return kEpidBadArgErr;
+ }
+ // Check if signature has NrPoofs but SigRl is not set
+ if (0 < rl_count && !ctx->sig_rl) {
+ return kEpidBadArgErr;
+ }
+
+ // Step 3. The verifier verifies gid in the public key, PRIV-RL, and
+ // SIG-RL (if provided) and the verifier pre-computation blob all match.
+ if (ctx->priv_rl) {
+ if (0 != memcmp(&ctx->pub_key->gid, &ctx->priv_rl->gid,
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidBadArgErr;
+ }
+ }
+
+ if (ctx->sig_rl) {
+ if (0 != memcmp(&ctx->pub_key->gid, &ctx->sig_rl->gid,
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidBadArgErr;
+ }
+ }
+ // Verification of gid value in precomputation blob
+ // and public key is done in ReadPrecomp
+
+ // Step 4. The verifier verifies the signatures of PRIV-RL,
+ // SIG-RL (if provided), and Group-RL (if provided) using IVK.
+ // Data is already verified.
+
+ // Step 5. If GroupRL is provided as input,...
+ if (ctx->group_rl) {
+ // ...the verifier verifies that gid has not been revoked, i.e.,
+ // gid does not match any entry in Group-RL.
+ size_t grouprl_count = Epid11GetGroupRlCount(ctx->group_rl);
+ for (i = 0; i < grouprl_count; ++i) {
+ if (0 == memcmp(&ctx->pub_key->gid, &ctx->group_rl->gid[i],
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidSigRevokedInGroupRl;
+ }
+ }
+ }
+
+ // Step 6. If SIG-RL is provided as input,...
+ if (ctx->sig_rl) {
+ size_t sigrl_count = Epid11GetSigRlCount(ctx->sig_rl);
+
+ // ...the verifier verifies that RLver and n2
+ // values in s match with the values in SIG-RL....
+ if (0 != memcmp(&ctx->sig_rl->version, &sig->rl_ver,
+ sizeof(ctx->sig_rl->version))) {
+ return kEpidErr;
+ }
+
+ if (sigrl_count != rl_count) {
+ return kEpidBadArgErr;
+ }
+ }
+
+ // Step 7-30. The verifier verifies the basic signature.
+ sts = Epid11VerifyBasicSig(ctx, &sig->sigma0, msg, msg_len);
+ if (sts != kEpidNoErr) {
+ return kEpidSigInvalid;
+ }
+
+ // Step 31. For i = 0, ..., n1-1, the verifier computes t5 =G3.exp(B, f[i])
+ // and verifies that G3.isEqual(t5, K) = false.
+ if (ctx->priv_rl) {
+ size_t privrl_count = Epid11GetPrivRlCount(ctx->priv_rl);
+ for (i = 0; i < privrl_count; ++i) {
+ sts = Epid11PrVerify(ctx, &sig->sigma0, (BigNumStr*)&ctx->priv_rl->f[i]);
+ if (sts != kEpidNoErr) {
+ return kEpidSigRevokedInPrivRl;
+ }
+ }
+ }
+
+ // Step 32. For i = 0, ..., n2-1, the verifier verifies nrVerify(B, K, B[i],
+ // K[i], Sigma[i]) = true. The details of nrVerify() will be given in the
+ // next subsection.
+ if (ctx->sig_rl) {
+ size_t sigrl_count = Epid11GetSigRlCount(ctx->sig_rl);
+
+ for (i = 0; i < sigrl_count; ++i) {
+ sts = Epid11NrVerify(ctx, &sig->sigma0, msg, msg_len, &ctx->sig_rl->bk[i],
+ &sig->sigma[i]);
+ if (sts != kEpidNoErr) {
+ return kEpidSigRevokedInSigRl;
+ }
+ }
+ }
+
+ // Step 33. If all the above verifications succeed, the verifier outputs true.
+ return kEpidSigValid;
+}
diff --git a/epid/verifier/1.1/src/verifybasic.c b/epid/verifier/1.1/src/verifybasic.c
new file mode 100644
index 0000000..2569a65
--- /dev/null
+++ b/epid/verifier/1.1/src/verifybasic.c
@@ -0,0 +1,412 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Epid11VerifyBasicSig implementation.
+ */
+#include <stdio.h>
+#include <string.h>
+#include "epid/common/math/src/bignum-internal.h"
+#include "epid/common/src/memory.h"
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+/// Convert bit size into 32-bit words
+#ifndef BITS2BYTES
+#define BITS2BYTES(n) ((((n) + 7) / 8))
+#endif
+
+/// The EPID11 "sf" value must never be larger than 2**593
+#define EPID11_SF_MAX_SIZE_BITS (593)
+
+EpidStatus Epid11VerifyBasicSig(Epid11VerifierCtx const* ctx,
+ Epid11BasicSignature const* sig,
+ void const* msg, size_t msg_len) {
+ EpidStatus res = kEpidNoErr;
+
+ // Epid11 G1 elements
+ EcPoint* T1 = NULL;
+ EcPoint* T2 = NULL;
+ EcPoint* R1 = NULL;
+ EcPoint* R2 = NULL;
+ EcPoint* t1 = NULL;
+ EcPoint* t2 = NULL;
+
+ // Epid11 GT elements
+ FfElement* R4 = NULL;
+ FfElement* t3 = NULL;
+
+ // Epid11 G3 elements
+ EcPoint* B = NULL;
+ EcPoint* K = NULL;
+ EcPoint* R3 = NULL;
+ EcPoint* t5 = NULL;
+
+ BigNum* c_bn = NULL;
+ BigNum* sa_bn = NULL;
+ BigNum* sb_bn = NULL;
+ BigNum* nc_bn = NULL;
+ BigNum* salpha_bn = NULL;
+ BigNum* sbeta_bn = NULL;
+ BigNum* nsx_bn = NULL;
+ BigNum* sf_bn = NULL;
+ BigNum* sf_tick_bn = NULL;
+ BigNum* nc_tick_bn = NULL;
+ BigNum* syalpha_bn = NULL;
+
+ Sha256Digest c_hash = {0};
+
+ if (!ctx || !sig) return kEpidBadArgErr;
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (msg_len > UINT_MAX) return kEpidBadArgErr;
+ if (!ctx->epid11_params || !ctx->pub_key) return kEpidBadArgErr;
+
+ do {
+ bool cmp_result = false;
+ BigNumStr nc_str = {0};
+ // handy shorthands:
+ EcGroup* G1 = ctx->epid11_params->G1;
+ EcGroup* G3 = ctx->epid11_params->G3;
+ FiniteField* GT = ctx->epid11_params->GT;
+ BigNum* p_bn = ctx->epid11_params->p;
+ BigNum* p_tick_bn = ctx->epid11_params->p_tick;
+ EcPoint* g1 = ctx->epid11_params->g1;
+ EcPoint* g2 = ctx->epid11_params->g2;
+ EcPoint* w = ctx->pub_key->w;
+ Epid11CommitValues commit_values = ctx->commit_values;
+ EcPoint* basename_hash = ctx->basename_hash;
+
+ if (!G1 || !G3 || !GT || !p_bn || !p_tick_bn || !g1 || !g2 || !w) {
+ res = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(res);
+ }
+
+ // 1. We use the following variables T1, T2, R1, R2, t1,
+ // t2 (elements of G1), R4, t3 (elements of GT), B, K, R3,
+ // t5 (elements of G3), c, sx, sy, sa, sb, salpha, sbeta,
+ // nc, nc_tick, nsx, syalpha, t4 (256-bit big integers),
+ // nd (80-bit big integer), and sf (600-bit big integer).
+ res = NewEcPoint(G1, &T1);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &T2);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &R1);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &R2);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &t1);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &t2);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewFfElement(GT, &R4);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(GT, &t3);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewEcPoint(G3, &B);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &K);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &R3);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G3, &t5);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewBigNum(sizeof(FpElemStr), &c_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &sa_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &sb_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &nc_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &salpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &sbeta_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &nsx_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(OctStr600), &sf_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(OctStr600), &sf_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr), &nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewBigNum(sizeof(FpElemStr) * 2, &syalpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // Steps 2-6 done in Epid11Create
+
+ // 8. If bsnSize = 0, the verifier verifies G3.inGroup(B) = true.
+ res = ReadEcPoint(G3, &(sig->B), sizeof(sig->B), B);
+ if (kEpidNoErr != res) {
+ if (ctx->basename_len == 0 && kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+
+ // 7. The verifier verifies that G3.isIdentity(B) is false
+ res = EcIsIdentity(G3, B, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result != false) {
+ res = kEpidSigInvalid;
+ break;
+ }
+
+ // 9. If bsnSize > 0, the verifier verifies B = G3.hash(bsn).
+ if (basename_hash) {
+ res = EcIsEqual(G3, basename_hash, B, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result != true) {
+ res = kEpidSigInvalid;
+ break;
+ }
+ }
+ // 10. The verifier verifies G3.inGroup(K) = true.
+ res = ReadEcPoint(G3, &(sig->K), sizeof(sig->K), K);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+
+ // 11. The verifier verifies G1.inGroup(T1) = true.
+ res = ReadEcPoint(G1, &(sig->T1), sizeof(sig->T1), T1);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+
+ // 12. The verifier verifies G1.inGroup(T2) = true.
+ res = ReadEcPoint(G1, &(sig->T2), sizeof(sig->T2), T2);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+
+ // 13. The verifier verifies sx, sy, sa, sb, salpha, sbeta in [0, p-1].
+ if (memcmp(&sig->sx, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&sig->sy, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&sig->sa, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&sig->sb, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&sig->salpha, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0 ||
+ memcmp(&sig->sbeta, &ctx->commit_values.p, sizeof(FpElemStr)) >= 0) {
+ res = kEpidSigInvalid;
+ break;
+ }
+
+ // 14. The verifier verifies that sf is an (at-most) 593-bit unsigned
+ // integer, in other words, sf < 2**593.
+
+ if (EPID11_SF_MAX_SIZE_BITS <=
+ OctStrBitSize(sig->sf.data, sizeof(sig->sf.data))) {
+ res = kEpidSigInvalid;
+ break;
+ }
+
+ // 15. The verifier computes nc = (-c) mod p.
+ res = ReadBigNum(&(sig->c), sizeof(sig->c), c_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumMod(c_bn, p_bn, nc_bn);
+ BREAK_ON_EPID_ERROR(res);
+ // (-c) mod p == p - (c mod p)
+ res = BigNumSub(p_bn, nc_bn, nc_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 16. The verifier computes nc_tick = (-c) mod p_tick.
+ res = BigNumMod(c_bn, p_tick_bn, nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumSub(p_tick_bn, nc_tick_bn, nc_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 17. The verifier computes nsx = (-sx) mod p.
+ res = ReadBigNum(&(sig->sx), sizeof(sig->sx), nsx_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumSub(p_bn, nsx_bn, nsx_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 18. The verifier computes syalpha = (sy + salpha) mod p.
+ res = ReadBigNum(&(sig->salpha), sizeof(sig->salpha), salpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = ReadBigNum(&(sig->sy), sizeof(sig->sy), syalpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumAdd(salpha_bn, syalpha_bn, syalpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = BigNumMod(syalpha_bn, p_bn, syalpha_bn);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 19. The verifier computes R1 = G1.multiexp(h1, sa, h2, sb, T2, nc).
+ res = ReadBigNum(&sig->sa, sizeof(sig->sa), sa_bn);
+ BREAK_ON_EPID_ERROR(res);
+ res = ReadBigNum(&sig->sb, sizeof(sig->sb), sb_bn);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[3];
+ BigNum const* exponents[3];
+ points[0] = ctx->pub_key->h1;
+ points[1] = ctx->pub_key->h2;
+ points[2] = T2;
+ exponents[0] = sa_bn;
+ exponents[1] = sb_bn;
+ exponents[2] = nc_bn;
+ res = EcMultiExpBn(G1, points, exponents, COUNT_OF(points), R1);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 20. The verifier computes
+ // R2 = G1.multiexp(h1, salpha, h2, sbeta, T2, nsx).
+ res = ReadBigNum(&sig->sbeta, sizeof(sig->sbeta), sbeta_bn);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[3];
+ BigNum const* exponents[3];
+ points[0] = ctx->pub_key->h1;
+ points[1] = ctx->pub_key->h2;
+ points[2] = T2;
+ exponents[0] = salpha_bn;
+ exponents[1] = sbeta_bn;
+ exponents[2] = nsx_bn;
+ res = EcMultiExpBn(G1, points, exponents, COUNT_OF(points), R2);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 21. The verifier computes R3 = G3.multiexp(B, sf, K, nc_tick).
+ res = ReadBigNum(&sig->sf, sizeof(sig->sf), sf_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ // G3.exp(B, sf) = G3(B, sf mod G3.order)
+ res = BigNumMod(sf_tick_bn, p_tick_bn, sf_tick_bn);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[2];
+ BigNum const* exponents[2];
+ points[0] = B;
+ points[1] = K;
+ exponents[0] = sf_tick_bn;
+ exponents[1] = nc_tick_bn;
+ res = EcMultiExpBn(G3, points, exponents, COUNT_OF(points), R3);
+ BREAK_ON_EPID_ERROR(res);
+ }
+
+ // 22. The verifier computes t1 = G1.multiexp(T1, nsx, g1, c).
+ res = BigNumMod(c_bn, p_bn, c_bn);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[2];
+ BigNum const* exponents[2];
+ points[0] = T1;
+ points[1] = g1;
+ exponents[0] = nsx_bn;
+ exponents[1] = c_bn;
+ res = EcMultiExpBn(G1, points, exponents, COUNT_OF(points), t1);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 23. The verifier computes t2 = G1.exp(T1, nc).
+ res = WriteBigNum(nc_bn, sizeof(nc_str), &nc_str);
+ BREAK_ON_EPID_ERROR(res);
+ res = EcExp(G1, T1, &nc_str, t2);
+ BREAK_ON_EPID_ERROR(res);
+ // 24. The verifier computes R4 = pairing(t1, g2).
+ res = Epid11Pairing(ctx->epid11_params->pairing_state, t1, g2, R4);
+ BREAK_ON_EPID_ERROR(res);
+ // 25. The verifier computes t3 = pairing(t2, w).
+ res = Epid11Pairing(ctx->epid11_params->pairing_state, t2, w, t3);
+ BREAK_ON_EPID_ERROR(res);
+ // 26. The verifier computes R4 = GT.mul(R4, t3).
+ res = FfMul(GT, R4, t3, R4);
+ BREAK_ON_EPID_ERROR(res);
+ // 27. The verifier compute
+ // t3 = GT.multiexp(e12, sf, e22, syalpha, e2w, sa).
+ res = ReadBigNum(&sig->sf, sizeof(sig->sf), sf_bn);
+ BREAK_ON_EPID_ERROR(res);
+ {
+ FfElement const* points[3];
+ BigNum const* exponents[3];
+ points[0] = ctx->e12;
+ points[1] = ctx->e22;
+ points[2] = ctx->e2w;
+ exponents[0] = sf_bn;
+ exponents[1] = syalpha_bn;
+ exponents[2] = sa_bn;
+ res = FfMultiExpBn(GT, points, exponents, COUNT_OF(points), t3);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // 28. The verifier compute R4 = GT.mul(R4, t3).
+ res = FfMul(GT, R4, t3, R4);
+ BREAK_ON_EPID_ERROR(res);
+ // 29. The verifier compute t4 = Hash(p || g1 || g2 || g3 || h1 || h2 || w
+ // || B || K || T1 || T2 || R1 || R2 || R3 || R4).
+ // 30. The verifier verifies c = H(t4 || nd || mSize || m).
+ res = SetCalculatedEpid11CommitValues(&sig->B, &sig->K, &sig->T1, &sig->T2,
+ R1, R2, R3, R4, G1, G3, GT,
+ &commit_values);
+ BREAK_ON_EPID_ERROR(res);
+ res = CalculateEpid11CommitmentHash(&commit_values, msg, (uint32_t)msg_len,
+ &sig->nd, &c_hash);
+ BREAK_ON_EPID_ERROR(res);
+ if (0 != memcmp(&sig->c, &c_hash, sizeof(sig->c))) {
+ res = kEpidSigInvalid;
+ break;
+ }
+ res = kEpidNoErr;
+ } while (0);
+ EpidZeroMemory(&c_hash, sizeof(c_hash));
+
+ DeleteEcPoint(&T1);
+ DeleteEcPoint(&T2);
+ DeleteEcPoint(&R1);
+ DeleteEcPoint(&R2);
+ DeleteEcPoint(&t1);
+ DeleteEcPoint(&t2);
+
+ DeleteFfElement(&R4);
+ DeleteFfElement(&t3);
+
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&R3);
+ DeleteEcPoint(&t5);
+
+ DeleteBigNum(&c_bn);
+ DeleteBigNum(&sa_bn);
+ DeleteBigNum(&sb_bn);
+ DeleteBigNum(&nc_bn);
+ DeleteBigNum(&salpha_bn);
+ DeleteBigNum(&sbeta_bn);
+ DeleteBigNum(&nsx_bn);
+ DeleteBigNum(&sf_bn);
+ DeleteBigNum(&sf_tick_bn);
+ DeleteBigNum(&nc_tick_bn);
+ DeleteBigNum(&syalpha_bn);
+
+ return (res);
+}
diff --git a/epid/verifier/1.1/unittests/check_privrl_entry-test.cc b/epid/verifier/1.1/unittests/check_privrl_entry-test.cc
new file mode 100644
index 0000000..f5c9645
--- /dev/null
+++ b/epid/verifier/1.1/unittests/check_privrl_entry-test.cc
@@ -0,0 +1,84 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Epid11CheckPrivRlEntry unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+}
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(Epid11VerifierTest, CheckPrivRlEntryFailsGivenNullPtr) {
+ // check ctx, sig, f for NULL
+ auto& pub_key = this->kPubKeyStr;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((Epid11PrivRl const*)priv_rl.data())->f[0];
+ Epid11BasicSignature basic_signature =
+ ((Epid11Signature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11CheckPrivRlEntry(nullptr, &basic_signature, &fp_str));
+ EXPECT_EQ(kEpidBadArgErr, Epid11CheckPrivRlEntry(verifier, nullptr, &fp_str));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11CheckPrivRlEntry(verifier, &basic_signature, nullptr));
+}
+
+TEST_F(Epid11VerifierTest, CheckPrivRlEntryFailsGivenRevokedPrivKey) {
+ // test a revoked priv key
+ // check ctx, sig, f for NULL
+ auto& pub_key = this->kPubKeyStr;
+ auto& priv_rl = this->kGrpXPrivRl;
+ // signed using revoked key
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((Epid11PrivRl const*)priv_rl.data())->f[0];
+ Epid11BasicSignature basic_signature =
+ ((Epid11Signature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11CheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+
+TEST_F(Epid11VerifierTest, CheckPrivRlEntrySucceedsGivenUnRevokedPrivKey) {
+ // test a non revoked priv key
+ auto& pub_key = this->kPubKeyStr;
+ auto& priv_rl = this->kGrpXPrivRl;
+ // signed using un revoked key
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((Epid11PrivRl const*)priv_rl.data())->f[0];
+ Epid11BasicSignature basic_signature =
+ ((Epid11Signature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11CheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+} // namespace
diff --git a/epid/verifier/1.1/unittests/context-test.cc b/epid/verifier/1.1/unittests/context-test.cc
new file mode 100644
index 0000000..56620fa
--- /dev/null
+++ b/epid/verifier/1.1/unittests/context-test.cc
@@ -0,0 +1,489 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Epid11VerifierCreate unit tests.
+ */
+
+#include <cstring>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+}
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+bool operator==(Epid11VerifierPrecomp const& lhs,
+ Epid11VerifierPrecomp const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierCreate Tests
+TEST_F(Epid11VerifierTest, CreateFailsGivenNullPointer) {
+ Epid11VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(&this->kPubKeyStr, &this->kVerifierPrecompStr,
+ nullptr));
+ Epid11VerifierDelete(&ctx);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(nullptr, &this->kVerifierPrecompStr, &ctx));
+ Epid11VerifierDelete(&ctx);
+}
+TEST_F(Epid11VerifierTest, CreateSucceedsGivenNullPrecomp) {
+ Epid11VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierCreate(&this->kPubKeyStr, nullptr, &ctx));
+ Epid11VerifierDelete(&ctx);
+}
+TEST_F(Epid11VerifierTest, CreateSucceedsGivenValidPrecomp) {
+ Epid11VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierCreate(&this->kPubKeyStr,
+ &this->kVerifierPrecompStr, &ctx));
+ Epid11VerifierDelete(&ctx);
+}
+TEST_F(Epid11VerifierTest, CreateFailsGivenInvalidPubkey) {
+ Epid11VerifierCtx* ctx = nullptr;
+ Epid11GroupPubKey pubkey_with_bad_h1 = this->kPubKeyStr;
+ pubkey_with_bad_h1.h1.x.data.data[31]++; // munge h1 so not in G1
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(&pubkey_with_bad_h1, nullptr, &ctx));
+ Epid11VerifierDelete(&ctx);
+ Epid11GroupPubKey pubkey_with_bad_h2 = this->kPubKeyStr;
+ pubkey_with_bad_h2.h2.x.data.data[31]++; // munge h2 so not in G1
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(&pubkey_with_bad_h2, nullptr, &ctx));
+ Epid11VerifierDelete(&ctx);
+ Epid11GroupPubKey pubkey_with_bad_w = this->kPubKeyStr;
+ pubkey_with_bad_w.w.x[0].data.data[31]++; // munge w so not in G2
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(&pubkey_with_bad_w, nullptr, &ctx));
+ Epid11VerifierDelete(&ctx);
+}
+TEST_F(Epid11VerifierTest, CreateFailsGivenBadGroupIdInPrecomp) {
+ Epid11VerifierCtx* ctx = nullptr;
+ // tweak GID
+ auto verifier_precomp = this->kVerifierPrecompStr;
+ verifier_precomp.gid.data[0] = ~verifier_precomp.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierCreate(&this->kPubKeyStr, &verifier_precomp, &ctx));
+}
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierDelete Tests
+TEST_F(Epid11VerifierTest, DeleteNullsVerifierCtx) {
+ Epid11VerifierCtx* ctx = nullptr;
+ THROW_ON_EPIDERR(Epid11VerifierCreate(&this->kPubKeyStr, nullptr, &ctx));
+ Epid11VerifierDelete(&ctx);
+ EXPECT_EQ(nullptr, ctx);
+}
+TEST_F(Epid11VerifierTest, DeleteWorksGivenNullVerifierCtx) {
+ Epid11VerifierDelete(nullptr);
+ Epid11VerifierCtx* ctx = nullptr;
+ Epid11VerifierDelete(&ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierWritePrecomp
+TEST_F(Epid11VerifierTest, WritePrecompFailsGivenNullPointer) {
+ Epid11VerifierPrecomp precomp;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierWritePrecomp(nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierWritePrecomp(ctx, nullptr));
+}
+TEST_F(Epid11VerifierTest, WritePrecompSucceedGivenValidArgument) {
+ Epid11VerifierPrecomp precomp;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierWritePrecomp(ctx, &precomp));
+ Epid11VerifierPrecomp expected_precomp = this->kVerifierPrecompStr;
+ EXPECT_EQ(expected_precomp, precomp);
+
+ Epid11VerifierCtxObj verifier2(this->kPubKeyStr);
+ Epid11VerifierCtx* ctx2 = verifier2;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierWritePrecomp(ctx2, &precomp));
+ EXPECT_EQ(expected_precomp, precomp);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierSetPrivRl
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenNullPointer) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(nullptr, &prl, sizeof(prl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(verifier, nullptr, sizeof(prl)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenZeroSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetPrivRl(verifier, &prl, 0));
+}
+
+// Size parameter must be at least big enough for n1 == 0 case
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenTooSmallSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(verifier, &prl,
+ (sizeof(prl) - sizeof(prl.f)) - 1));
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(verifier, &prl,
+ (sizeof(prl) - sizeof(prl.f)) - 1));
+}
+
+// Size parameter must be cross-checked with n1 value in priv_rl
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenN1TooBigForSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetPrivRl(
+ verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenN1TooSmallForSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlPassesGivenDefaultPrivRl) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetPrivRl(verifier, &prl,
+ sizeof(prl) - sizeof(prl.f)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlPassesGivenPrivRlWithSingleElement) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenBadGroupId) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.gid.data[0] = ~prl.gid.data[0];
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(Epid11VerifierTest, SetPrivRlFailsGivenOldVersion) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11PrivRl prl = {0};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetPrivRl(verifier, &prl,
+ sizeof(prl) - sizeof(prl.f)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ prl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetPrivRl(
+ verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierSetSigRl
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenNullPointer) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)this->kEmptySigRl.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetSigRl(nullptr, empty_sig_rl, sizeof(Epid11SigRl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetSigRl(verifier, nullptr, sizeof(Epid11SigRl)));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenZeroSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)this->kEmptySigRl.data();
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetSigRl(verifier, empty_sig_rl, 0));
+}
+
+// Size parameter must be at least big enough for n2 == 0 case
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenTooSmallSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetSigRl(
+ verifier, empty_sig_rl,
+ (sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)) - 1));
+ empty_sig_rl->n2 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetSigRl(
+ verifier, empty_sig_rl,
+ (sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)) - 1));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenN2TooBigForSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ empty_sig_rl->n2 = this->kOctStr32_1;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11VerifierSetSigRl(verifier, empty_sig_rl,
+ sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenN2TooSmallForSize) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetSigRl(verifier, empty_sig_rl,
+ sizeof(*empty_sig_rl)));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlWorksGivenSigRlWithNoElements) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ size_t sig_rl_size = empty_sig_rl_buf.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifierSetSigRl(verifier, empty_sig_rl, sig_rl_size));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlWorksGivenSigRlWithOneElement) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x7b,
+ // rev
+ 0x00, 0x00, 0x00, 0x7b,
+ // n2
+ 0x00, 0x00, 0x00, 0x01,
+ // bks
+ // bk1
+ 0x67, 0x58, 0xb2, 0x9c, 0xad, 0x61, 0x1f, 0xfb, 0x74, 0x23, 0xea, 0x40,
+ 0xe9, 0x66, 0x26, 0xb0, 0x43, 0xdc, 0x7e, 0xc7, 0x48, 0x88, 0x56, 0x59,
+ 0xf3, 0x35, 0x9f, 0xdb, 0xfa, 0xa2, 0x49, 0x51, 0x85, 0x35, 0x42, 0x50,
+ 0x8e, 0x79, 0x79, 0xc0, 0x6c, 0xcc, 0x39, 0x0b, 0xad, 0x3b, 0x39, 0x33,
+ 0xae, 0xb2, 0xa1, 0xc5, 0x28, 0x6f, 0x48, 0x3a, 0xd2, 0x63, 0x5d, 0xfb,
+ 0x1b, 0x1f, 0x8a, 0x63, 0x84, 0xdc, 0x2d, 0xad, 0x3b, 0x98, 0x3f, 0xc3,
+ 0x8e, 0x18, 0xd7, 0xea, 0x18, 0x50, 0x0c, 0x50, 0x42, 0x77, 0xb2, 0x59,
+ 0xf5, 0xd5, 0x38, 0xc3, 0x8d, 0x57, 0xf4, 0xe7, 0xb8, 0x74, 0x5a, 0x9e,
+ 0x32, 0x75, 0xd1, 0xb4, 0xb3, 0x64, 0xbc, 0x23, 0xcd, 0x98, 0x29, 0x7a,
+ 0x77, 0x51, 0xfc, 0x26, 0x81, 0x41, 0x9b, 0xf6, 0x21, 0xad, 0xc1, 0xd9,
+ 0xab, 0x30, 0x25, 0x8d, 0x0c, 0x3b, 0x62, 0xe2};
+ Epid11SigRl* sig_rl = reinterpret_cast<Epid11SigRl*>(sig_rl_data_n2_one);
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifierSetSigRl(verifier, sig_rl, sizeof(*sig_rl)));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlWorksGivenSigRlWithTwoElement) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ size_t sig_rl_size = this->kSigRl.size() * sizeof(uint8_t);
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetSigRl(ctx, sig_rl, sig_rl_size));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenBadGroupId) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ empty_sig_rl->gid.data[0] = ~empty_sig_rl->gid.data[0];
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11VerifierSetSigRl(verifier, empty_sig_rl,
+ sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)));
+}
+
+TEST_F(Epid11VerifierTest, SetSigRlFailsGivenOldVersion) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> empty_sig_rl_buf(this->kEmptySigRl);
+ Epid11SigRl* empty_sig_rl = (Epid11SigRl*)empty_sig_rl_buf.data();
+ empty_sig_rl->version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetSigRl(
+ verifier, empty_sig_rl,
+ sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ empty_sig_rl->version = octstr32_0;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11VerifierSetSigRl(verifier, empty_sig_rl,
+ sizeof(*empty_sig_rl) - sizeof(empty_sig_rl->bk)));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierSetGroupRl
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenNullPointer) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl(this->kGroupRl3GidBuf);
+ Epid11GroupRl* grl = (Epid11GroupRl*)group_rl.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(nullptr, grl, group_rl.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, nullptr, group_rl.size()));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenSizeZero) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl(this->kGroupRl3GidBuf);
+ Epid11GroupRl* grl = (Epid11GroupRl*)group_rl.data();
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetGroupRl(verifier, grl, 0));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenSizeTooSmall) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl(this->kGroupRl3GidBuf);
+ Epid11GroupRl* grl = (Epid11GroupRl*)group_rl.data();
+ size_t grl_size = group_rl.size() - sizeof(grl->gid[0]);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, grl, grl_size - 1));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenSizeTooLarge) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl(this->kGroupRl3GidBuf);
+ Epid11GroupRl* grl = (Epid11GroupRl*)group_rl.data();
+ size_t grl_size = group_rl.size() - sizeof(grl->gid[0]);
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, grl, grl_size + 1));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenN3ZeroAndGroupRLSizeTooBig) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl_3gid_n0_buf(this->kGroupRl3GidBuf);
+ group_rl_3gid_n0_buf[7] = 0x00;
+ Epid11GroupRl* group_rl = (Epid11GroupRl*)group_rl_3gid_n0_buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, group_rl,
+ group_rl_3gid_n0_buf.size()));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenN3TooSmall) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl_3gid_n2_buf(this->kGroupRl3GidBuf);
+ group_rl_3gid_n2_buf[7] = 0x02;
+ Epid11GroupRl* group_rl = (Epid11GroupRl*)group_rl_3gid_n2_buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, group_rl,
+ group_rl_3gid_n2_buf.size()));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenN3TooLarge) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> group_rl_3gid_n4_buf(this->kGroupRl3GidBuf);
+ group_rl_3gid_n4_buf[7] = 0x04;
+ Epid11GroupRl* group_rl = (Epid11GroupRl*)group_rl_3gid_n4_buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, group_rl,
+ group_rl_3gid_n4_buf.size()));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlSucceedsGivenEmptyRL) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11GroupRl* empty_grl = (Epid11GroupRl*)this->kGroupRlEmptyBuf.data();
+ size_t grl_size = this->kGroupRlEmptyBuf.size();
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifierSetGroupRl(verifier, empty_grl, grl_size));
+}
+TEST_F(Epid11VerifierTest, SetGroupRlSucceedsGivenRLWith3gid) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11GroupRl* group_rl = (Epid11GroupRl*)this->kGroupRl3GidBuf.data();
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidBuf.size()));
+}
+
+TEST_F(Epid11VerifierTest, SetGroupRlFailsGivenOldVersion) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11GroupRl* group_rl = (Epid11GroupRl*)this->kGroupRl3GidBuf.data();
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidBuf.size()));
+ Epid11GroupRl* empty_grl = (Epid11GroupRl*)this->kGroupRlEmptyBuf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetGroupRl(verifier, empty_grl,
+ this->kGroupRlEmptyBuf.size()));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Epid11VerifierSetBasename
+TEST_F(Epid11VerifierTest, DefaultBasenameIsNull) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ EXPECT_EQ(nullptr, ctx->basename);
+}
+TEST_F(Epid11VerifierTest, SetBasenameFailsGivenNullContext) {
+ auto& basename = this->kBsn0;
+ EXPECT_EQ(kEpidBadArgErr, Epid11VerifierSetBasename(nullptr, basename.data(),
+ basename.size()));
+}
+TEST_F(Epid11VerifierTest, SetBasenameFailsGivenNullBasenameAndNonzeroLength) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ auto& basename = this->kBsn0;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifierSetBasename(ctx, nullptr, basename.size()));
+}
+TEST_F(Epid11VerifierTest, SetBasenameSucceedsGivenValidParameters) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ auto& basename = this->kBsn0;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifierSetBasename(ctx, basename.data(), basename.size()));
+ EXPECT_EQ(basename.size(), ctx->basename_len);
+ EXPECT_EQ(0, memcmp(basename.data(), ctx->basename, ctx->basename_len));
+ EXPECT_NE(nullptr, ctx->basename_hash);
+}
+TEST_F(Epid11VerifierTest, SetBasenameAcceptsZeroLengthBasename) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidNoErr, Epid11VerifierSetBasename(ctx, "", 0));
+ EXPECT_EQ((size_t)0, ctx->basename_len);
+ EXPECT_NE(nullptr, ctx->basename_hash);
+}
+TEST_F(Epid11VerifierTest, SetBasenameResetsBasenameGivenNullBasename) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ auto& basename = this->kBsn0;
+ THROW_ON_EPIDERR(
+ Epid11VerifierSetBasename(ctx, basename.data(), basename.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(ctx, nullptr, 0));
+ EXPECT_EQ(nullptr, ctx->basename_hash);
+}
+TEST_F(Epid11VerifierTest, SetBasenameAcceptsBsnContainingAllPossibleBytes) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStrForMsg0_255,
+ this->kVerifierPrecompStr);
+ Epid11VerifierCtx* ctx = verifier;
+ auto& basename = this->kData_0_255;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifierSetBasename(ctx, basename.data(), basename.size()));
+ EXPECT_EQ(basename.size(), ctx->basename_len);
+ EXPECT_EQ(0, memcmp(basename.data(), ctx->basename, ctx->basename_len));
+ EXPECT_NE(nullptr, ctx->basename_hash);
+}
+} // namespace
diff --git a/epid/verifier/1.1/unittests/nrverify-test.cc b/epid/verifier/1.1/unittests/nrverify-test.cc
new file mode 100644
index 0000000..9d572e6
--- /dev/null
+++ b/epid/verifier/1.1/unittests/nrverify-test.cc
@@ -0,0 +1,232 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11NrVerify unit tests.
+*/
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/1.1/types.h"
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/1.1/src/context.h"
+}
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+
+namespace {
+
+/////////////////////////////////////////////////////////////////////////
+// Simple Errors
+
+TEST_F(Epid11VerifierTest, NrVerifyFailsGivenNullParameters) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11NrVerify(nullptr, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, nullptr, this->kMsg0.data(), this->kMsg0.size(),
+ &sig_rl->bk[0], &epid_signature->sigma[0]));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, nullptr,
+ this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), nullptr, &epid_signature->sigma[0]));
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0], nullptr));
+}
+
+/////////////////////////////////////////////////////////////////////
+// Reject
+TEST_F(Epid11VerifierTest, NrVerifyRejectsTotalMsgSizeOutOfRangeOfInt) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ // Since before hashing some other data will be concatenated to commit
+ // message, passing msg with size==UINT_MAX is causes out of range for
+ // this concatenated msg
+ Epid11NrProof nr_proof = epid_signature->sigma[0];
+ EXPECT_EQ(kEpidBadArgErr, Epid11NrVerify(verifier, &epid_signature->sigma0,
+ this->kMsg0.data(), 0xffffffff,
+ &sig_rl->bk[0], &nr_proof));
+#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
+ EXPECT_EQ(kEpidBadArgErr, Epid11NrVerify(verifier, &epid_signature->sigma0,
+ this->kMsg0.data(), 0x100000001,
+ &sig_rl->bk[0], &nr_proof));
+#endif
+}
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithTNotInG3) {
+ // 4.2.2 step 2 - The verifier verifies that G3.inGroup(T) = true.
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ Epid11NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.T.x.data.data[0]++;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithTIdentityOfG3) {
+ // 4.2.2 step 3 - The verifier verifies that G3.isIdentity(T) = false.
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ Epid11NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.T = this->kG3IdentityStr;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithSmuNotInRange) {
+ // 4.2.2 step 4 - The verifier verifies that smu, snu in [0, p'-1].
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ Epid11NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.smu.data = this->kParamsStr.p.data;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithSnuNotInRange) {
+ // 4.2.2 step 4 - The verifier verifies that smu, snu in [0, p'-1].
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ Epid11NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.snu.data = this->kParamsStr.p.data;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+// 4.2.2 step 5 - The verifier computes nc = (- c) mod p'.
+// This Step is not testable
+
+// 4.2.2 step 6 - The verifier computes R1 = G3.multiExp(K, smu, B, snu).
+// This Step is not testable
+
+// 4.2.2 step 7 - The verifier computes R2 = G3.multiExp(K', smu, B', snu,
+// T, nc).
+// This Step is not testable
+
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithInvalidCommitment) {
+ // 4.2.2 step 8 - The verifier verifies c = Hash(p' || g3 || B || K || B' ||
+ // K' || T || R1 || R2 || mSize || m).
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ std::vector<uint8_t> test_msg = this->kMsg0;
+ test_msg[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, test_msg.data(),
+ test_msg.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+
+TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithMismatchCommitmentSize) {
+ // 4.2.2 step 8 - The verifier verifies c = Hash(p' || g3 || B || K || B' ||
+ // K' || T || R1 || R2 || mSize || m).
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ std::vector<uint8_t> test_msg = this->kMsg0;
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11NrVerify(verifier, &epid_signature->sigma0, test_msg.data(),
+ test_msg.size() - 1, &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+/////////////////////////////////////////////////////////////////////
+// Accept
+// 4.2.2 step 9 - If all the above verifications succeed, the verifier
+// outputs true. If any of the above verifications fails,
+// the verifier aborts and outputs false
+
+TEST_F(Epid11VerifierTest, NrVerifyAcceptsSigWithRandomBaseName) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11Signature const* epid_signature =
+ reinterpret_cast<Epid11Signature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data());
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data());
+ EXPECT_EQ(kEpidSigValid,
+ Epid11NrVerify(verifier, &epid_signature->sigma0,
+ this->kMsg0.data(), this->kMsg0.size(),
+ &sig_rl->bk[0], &epid_signature->sigma[0]));
+}
+
+TEST_F(Epid11VerifierTest, NrVerifyAcceptsMsgContainingAllPossibleBytes) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStrForMsg0_255);
+ Epid11Signature const* epid_signature =
+ (Epid11Signature*)kSigGrp01Member0Sha256kBsn0Data_0_255.data();
+ Epid11SigRl const* sig_rl =
+ reinterpret_cast<Epid11SigRl const*>(this->kSigRlForMsg0_255.data());
+ EXPECT_EQ(kEpidSigValid,
+ Epid11NrVerify(verifier, &epid_signature->sigma0,
+ this->kData_0_255.data(), this->kData_0_255.size(),
+ &sig_rl->bk[0], &epid_signature->sigma[0]));
+}
+
+} // namespace
diff --git a/epid/verifier/1.1/unittests/sigs_linked-test.cc b/epid/verifier/1.1/unittests/sigs_linked-test.cc
new file mode 100644
index 0000000..edebf6d
--- /dev/null
+++ b/epid/verifier/1.1/unittests/sigs_linked-test.cc
@@ -0,0 +1,72 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Epid11AreSigsLinkable unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+}
+
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(Epid11VerifierTest, AreSigsLinkedReturnsFalseGivenNullParameters) {
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ EXPECT_FALSE(Epid11AreSigsLinked(nullptr, nullptr));
+ EXPECT_FALSE(
+ Epid11AreSigsLinked((Epid11BasicSignature const*)sig.data(), nullptr));
+ EXPECT_FALSE(
+ Epid11AreSigsLinked(nullptr, (Epid11BasicSignature const*)sig.data()));
+}
+
+TEST_F(Epid11VerifierTest, SigsBySameMemberWithRandomBaseAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256RandbaseMsg1;
+ EXPECT_FALSE(Epid11AreSigsLinked((Epid11BasicSignature const*)sig1.data(),
+ (Epid11BasicSignature const*)sig2.data()));
+}
+
+TEST_F(Epid11VerifierTest, SigsBySameMemberWithSameBasenameAreLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256Bsn0Msg1;
+ EXPECT_TRUE(Epid11AreSigsLinked((Epid11BasicSignature const*)sig1.data(),
+ (Epid11BasicSignature const*)sig2.data()));
+}
+
+TEST_F(Epid11VerifierTest,
+ SigsBySameMemberWithDifferentBasenameAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256Bsn1Msg0;
+ EXPECT_FALSE(Epid11AreSigsLinked((Epid11BasicSignature const*)sig1.data(),
+ (Epid11BasicSignature const*)sig2.data()));
+}
+
+TEST_F(Epid11VerifierTest,
+ SigsByDifferentMembersWithSameBasenameAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember1Sha256Bsn0Msg0;
+ EXPECT_FALSE(Epid11AreSigsLinked((Epid11BasicSignature const*)sig1.data(),
+ (Epid11BasicSignature const*)sig2.data()));
+}
+
+} // namespace
diff --git a/epid/verifier/1.1/unittests/testdata/verifier_precmp.inc b/epid/verifier/1.1/unittests/testdata/verifier_precmp.inc
new file mode 100644
index 0000000..76a8908
--- /dev/null
+++ b/epid/verifier/1.1/unittests/testdata/verifier_precmp.inc
@@ -0,0 +1,73 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Test data.
+ *
+ * Type : Intel(R) EPID 1.1 verifier precomp data
+ */
+// unsigned char epid_v_precmp_dat[] = {
+0x00, 0x00, 0x00, 0x7b,
+0x02, 0x7c, 0xac, 0xe1, 0x58, 0x08, 0x6a, 0x83, 0x50, 0xd8, 0xba, 0xba,
+0x4b, 0x60, 0x6c, 0xeb, 0x51, 0xce, 0x7e, 0x6d, 0x8e, 0xa8, 0x56, 0x41,
+0x33, 0xf3, 0xb0, 0xa6, 0xfc, 0xcd, 0xc8, 0x41, 0x05, 0x9e, 0xcc, 0x4f,
+0x51, 0x77, 0xd9, 0xec, 0x57, 0x34, 0x48, 0x47, 0x22, 0x7a, 0x7c, 0xa1,
+0x14, 0xb8, 0x2a, 0xc9, 0x16, 0x0a, 0xb4, 0xb3, 0x5d, 0x44, 0x28, 0x23,
+0x80, 0x7a, 0x3e, 0xda, 0x02, 0x6d, 0x03, 0x47, 0xcd, 0x2a, 0xab, 0xa4,
+0xce, 0x63, 0x0b, 0x5e, 0x3a, 0xf2, 0x96, 0x86, 0xa9, 0x9f, 0x2a, 0x9a,
+0xff, 0x8f, 0x94, 0x91, 0xc8, 0x3c, 0xf2, 0x5a, 0xaa, 0xda, 0x6b, 0x8e,
+0x02, 0xfc, 0x42, 0x4b, 0xfe, 0xf3, 0x23, 0x0a, 0xf8, 0x1a, 0x5c, 0x9a,
+0x5c, 0x0d, 0x71, 0xef, 0x85, 0x64, 0xa6, 0x4d, 0x6a, 0x8b, 0x82, 0x58,
+0x2e, 0xbc, 0xfb, 0xb9, 0xdf, 0xb8, 0xce, 0x3d, 0x03, 0xf3, 0x07, 0x18,
+0x4a, 0x13, 0x82, 0x8a, 0xea, 0x24, 0x57, 0x72, 0xe2, 0x33, 0x9d, 0xb3,
+0x0c, 0x57, 0xcf, 0xab, 0xdd, 0xee, 0xf8, 0xd7, 0x2a, 0x75, 0xf5, 0xd7,
+0x28, 0xed, 0x0f, 0xb7, 0x02, 0xec, 0x5f, 0xed, 0x50, 0xae, 0x6b, 0xf3,
+0x80, 0x29, 0x7b, 0xa2, 0x75, 0x61, 0xfd, 0x20, 0x01, 0x2b, 0xdf, 0x8b,
+0x3c, 0x2a, 0xb9, 0x1d, 0x92, 0xed, 0x0f, 0xad, 0x73, 0x74, 0x1e, 0xd8,
+0x06, 0xa6, 0x4a, 0x6b, 0x89, 0xd0, 0x07, 0x2a, 0xe6, 0x0b, 0x56, 0xd3,
+0x48, 0x17, 0xf6, 0x99, 0x31, 0x41, 0x21, 0x99, 0x51, 0xf6, 0xb1, 0x6c,
+0x02, 0xcd, 0x11, 0xe7, 0xcc, 0xd3, 0xc5, 0x6c, 0x06, 0xf4, 0x39, 0x62,
+0x37, 0x88, 0x37, 0xad, 0x1f, 0x36, 0x81, 0xfa, 0xd7, 0x4b, 0x9f, 0x57,
+0x0f, 0x5b, 0xc3, 0x53, 0x14, 0x53, 0x41, 0x3a, 0x2b, 0xab, 0x6e, 0xf4,
+0xd8, 0x7f, 0xc5, 0x67, 0x08, 0x70, 0xd7, 0x9b, 0x59, 0xe1, 0xe0, 0x57,
+0xe2, 0xf4, 0x04, 0x82, 0x06, 0x6a, 0xd5, 0xa2, 0x76, 0x64, 0x41, 0x7f,
+0x3b, 0xe6, 0x33, 0xb9, 0x39, 0x68, 0xda, 0x0d, 0x13, 0x03, 0x63, 0xc8,
+0x07, 0x94, 0x70, 0xf9, 0xfb, 0xd8, 0x99, 0x31, 0xa1, 0x53, 0x1c, 0x20,
+0x43, 0x12, 0xeb, 0xff, 0xa4, 0x5d, 0x64, 0x7c, 0x24, 0x9e, 0xe0, 0x03,
+0x80, 0x8e, 0xfb, 0xdc, 0xee, 0xfd, 0x1f, 0xef, 0x03, 0x43, 0x07, 0x44,
+0xef, 0xb3, 0x71, 0x39, 0x77, 0x61, 0x5c, 0xa9, 0x32, 0x54, 0x33, 0x98,
+0xa2, 0x14, 0x6a, 0x13, 0x53, 0x22, 0x94, 0xa2, 0xce, 0x15, 0xe7, 0xd0,
+0x30, 0xf2, 0x6b, 0x07, 0x02, 0x56, 0x28, 0xc3, 0xb1, 0x39, 0xf9, 0xc7,
+0xda, 0xe2, 0xfd, 0xd0, 0xa8, 0x1b, 0xe8, 0xb2, 0xe3, 0x75, 0x02, 0xb8,
+0x90, 0xa4, 0xa5, 0x8f, 0x23, 0xa1, 0xcd, 0x75, 0xe7, 0x51, 0x37, 0xe5,
+0x09, 0x27, 0x38, 0x30, 0x06, 0x44, 0x13, 0xef, 0xfe, 0x70, 0x5c, 0x4a,
+0x21, 0xff, 0xf8, 0xf5, 0xbb, 0xc9, 0x6e, 0xa8, 0x7e, 0x00, 0xb1, 0xd7,
+0x5e, 0x55, 0xcf, 0xc7, 0x34, 0x6b, 0x8d, 0xd5, 0x04, 0xce, 0x6e, 0xca,
+0x11, 0x5a, 0xb3, 0x0c, 0x33, 0x79, 0x5f, 0xde, 0xd9, 0xdb, 0x8c, 0xfa,
+0x73, 0x4e, 0x1e, 0xfa, 0xa1, 0x21, 0x6d, 0xa3, 0x6d, 0xe8, 0x69, 0x02,
+0x9e, 0xcc, 0x4d, 0x14, 0x09, 0xb5, 0x7c, 0xba, 0x98, 0xc2, 0xe3, 0xaa,
+0x82, 0x6a, 0x0f, 0x1e, 0x4c, 0x6c, 0x9e, 0xb8, 0xb6, 0xa3, 0x5d, 0x06,
+0xfe, 0x99, 0x5c, 0x62, 0xa9, 0x19, 0x4e, 0x84, 0x61, 0xc7, 0xf9, 0x78,
+0x04, 0x39, 0xda, 0xb4, 0x79, 0x32, 0x63, 0x60, 0xa6, 0x69, 0x86, 0x5c,
+0xff, 0xb0, 0x71, 0xd0, 0xf5, 0x5e, 0x3c, 0xb2, 0x5d, 0x81, 0x4f, 0x9f,
+0xe4, 0xf7, 0x3b, 0xc7, 0xc5, 0x80, 0x5e, 0x8e, 0x01, 0x23, 0xfa, 0xfc,
+0x09, 0xae, 0x12, 0x55, 0xf2, 0xd0, 0x50, 0x5c, 0xed, 0xc6, 0xd6, 0x81,
+0x9a, 0xa7, 0x93, 0xa3, 0xf4, 0xac, 0xe5, 0x3e, 0xdb, 0x5a, 0x05, 0xb7,
+0x0b, 0x80, 0xad, 0xa9, 0x08, 0xf1, 0x5a, 0xb5, 0x09, 0x23, 0x52, 0x65,
+0x46, 0x64, 0x79, 0xf2, 0x47, 0x04, 0x72, 0x48, 0x4e, 0x01, 0x55, 0x4a,
+0x67, 0x8d, 0x1e, 0x07, 0xc7, 0x46, 0x87, 0xf6, 0x50, 0xc3, 0xa6, 0x6b
+// };
+// unsigned int epid_v_precmp_dat_len = 576;
diff --git a/epid/verifier/1.1/unittests/verifier-testhelper.cc b/epid/verifier/1.1/unittests/verifier-testhelper.cc
new file mode 100644
index 0000000..9c3906a
--- /dev/null
+++ b/epid/verifier/1.1/unittests/verifier-testhelper.cc
@@ -0,0 +1,304 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Test fixture class for EpidVerifier.
+*/
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+#include <vector>
+const Epid11G3ElemStr Epid11VerifierTest::kG3IdentityStr = {0};
+const Epid11GroupPubKey Epid11VerifierTest::kPubKeyStr = {
+ // gid
+ {
+ 0x00, 0x00, 0x00, 0x7b,
+ },
+ // h1
+ {{0x08, 0x4a, 0x9d, 0x2e, 0xf9, 0x4f, 0x78, 0x02, 0xd7, 0x89, 0x75,
+ 0xb4, 0xe7, 0x25, 0x26, 0x9f, 0x00, 0x57, 0xad, 0x33, 0x30, 0xea,
+ 0xa9, 0x6c, 0x00, 0x9e, 0x8b, 0xc8, 0x13, 0x23, 0xcb, 0x06},
+ {0x04, 0xbe, 0x42, 0x74, 0x11, 0x07, 0xb1, 0x06, 0xd7, 0xef, 0x5f,
+ 0x66, 0x87, 0xd9, 0xfa, 0xdd, 0x53, 0xae, 0xd7, 0xf4, 0x54, 0xf8,
+ 0xd0, 0x21, 0x75, 0xe0, 0x07, 0x44, 0xc9, 0xc3, 0x4e, 0xf7}},
+ // h2
+ {{0x06, 0xd8, 0xa9, 0x90, 0x02, 0x8f, 0xca, 0xa5, 0x73, 0x36, 0x24,
+ 0x03, 0xc9, 0xa8, 0x7e, 0x9d, 0x64, 0x12, 0xac, 0xa7, 0xbd, 0x17,
+ 0x7f, 0x7c, 0x96, 0x8d, 0x2e, 0x13, 0xd9, 0xb2, 0x69, 0x47},
+ {0x09, 0xdb, 0xe3, 0xbf, 0xbc, 0xa1, 0x34, 0x0f, 0xc6, 0xe2, 0x00,
+ 0x3d, 0x98, 0xa3, 0x7d, 0xab, 0xd4, 0x0e, 0xec, 0xde, 0x4f, 0x97,
+ 0xa9, 0xbb, 0xdd, 0x60, 0x94, 0x24, 0x7b, 0xb3, 0xf5, 0x94}},
+ // w
+ {{{0x02, 0x43, 0x78, 0x9f, 0x54, 0xc1, 0x21, 0x3a, 0x2b, 0x4d, 0x12,
+ 0x65, 0x2f, 0x51, 0x94, 0xc6, 0x34, 0x24, 0xd9, 0x7b, 0x06, 0x3a,
+ 0xc4, 0xf5, 0x56, 0xeb, 0x32, 0xe3, 0xee, 0x7b, 0xad, 0x6b},
+ {0x04, 0x90, 0x86, 0x31, 0x18, 0x2a, 0xa4, 0xcf, 0xa3, 0x90, 0xa5,
+ 0x80, 0x7b, 0xae, 0x3b, 0xb1, 0x77, 0x03, 0xe7, 0x7e, 0xf2, 0xfc,
+ 0x6d, 0x3a, 0xab, 0x8f, 0xbf, 0x95, 0x40, 0xed, 0x08, 0x03},
+ {0x01, 0x05, 0x86, 0xf5, 0x42, 0xea, 0x4d, 0xf7, 0x4f, 0xef, 0x46,
+ 0xdf, 0x8f, 0xe8, 0x2d, 0xbb, 0x5d, 0x0d, 0x2f, 0x4f, 0xf4, 0xd8,
+ 0x31, 0xc6, 0x5a, 0x97, 0x98, 0x44, 0xcf, 0x42, 0x5a, 0xf3}},
+ {{0x03, 0x5f, 0xb6, 0x38, 0x45, 0x5a, 0x15, 0x1e, 0xb9, 0x54, 0xfa,
+ 0x2c, 0x3f, 0x68, 0x7b, 0x4e, 0x85, 0x35, 0xf3, 0x5b, 0xe5, 0xdc,
+ 0x96, 0x2b, 0x18, 0x84, 0x5e, 0x1e, 0x53, 0xdc, 0x22, 0x23},
+ {0x06, 0x08, 0x91, 0x5a, 0x2d, 0x27, 0xe2, 0x12, 0x69, 0xfa, 0xab,
+ 0x19, 0x7c, 0x47, 0x6b, 0xec, 0xde, 0xc6, 0x25, 0xd4, 0x43, 0xb4,
+ 0x65, 0x23, 0x61, 0x0f, 0x1f, 0x2d, 0xfd, 0xb1, 0x18, 0xb0},
+ {0x04, 0x8e, 0x1a, 0xc5, 0x95, 0x9a, 0x0e, 0x37, 0x7c, 0x5e, 0x95,
+ 0x38, 0xc2, 0xcf, 0xfa, 0x1f, 0xe3, 0x3a, 0x2b, 0x85, 0xa5, 0xfd,
+ 0x6b, 0xc4, 0x1d, 0xfb, 0x47, 0x27, 0xaf, 0xc1, 0x94, 0xcd}}}};
+const Epid11GroupPubKey Epid11VerifierTest::kPubKeyStrForMsg0_255 = {
+ // gid
+ {
+ 0x00, 0x00, 0x00, 0x7b,
+ },
+ // h1
+ {{0x02, 0x5a, 0xc4, 0xc5, 0xcd, 0x7d, 0xaa, 0xfd, 0x26, 0xe5, 0x0b,
+ 0xa9, 0xb4, 0xe1, 0x72, 0xa1, 0x65, 0x2d, 0x84, 0xad, 0x34, 0x34,
+ 0xf8, 0x62, 0x98, 0x6a, 0x15, 0xbe, 0xea, 0xe3, 0xcc, 0x56},
+ {0x05, 0x70, 0x5f, 0x4f, 0x11, 0xaf, 0x45, 0xcf, 0x04, 0x1b, 0x96,
+ 0xad, 0xeb, 0x26, 0xee, 0x95, 0x65, 0x4b, 0xd3, 0xd6, 0x5c, 0x13,
+ 0x76, 0xb7, 0x7a, 0xa1, 0xc6, 0xda, 0xed, 0x5a, 0x40, 0xce}},
+ // h2
+ {{0x06, 0x0e, 0x26, 0xa3, 0xe8, 0xbd, 0xca, 0x35, 0x9d, 0x48, 0x66,
+ 0xc2, 0x2d, 0x38, 0xf6, 0x57, 0xec, 0x46, 0xec, 0x42, 0x21, 0xd9,
+ 0x8f, 0x3f, 0x5b, 0x9a, 0xcf, 0xb8, 0x69, 0x2a, 0x40, 0x8f},
+ {0x03, 0x20, 0x3d, 0x12, 0x7f, 0x00, 0xe9, 0x84, 0x29, 0x4a, 0x96,
+ 0xfa, 0x69, 0x61, 0x34, 0x0f, 0x3d, 0x98, 0x67, 0x2f, 0x65, 0xf9,
+ 0x67, 0x09, 0xa1, 0x2e, 0xe7, 0x81, 0x9f, 0xe1, 0x2f, 0x1f}},
+ // w
+ {{{0x03, 0x05, 0xff, 0x49, 0x41, 0x48, 0xcf, 0x6d, 0x38, 0xce, 0x94,
+ 0xe8, 0xcd, 0xae, 0x18, 0x44, 0xba, 0x54, 0x0f, 0x84, 0xa5, 0x8a,
+ 0xb6, 0x58, 0x70, 0x39, 0xe3, 0x33, 0xfb, 0x75, 0xce, 0x98},
+ {0x08, 0xb1, 0x96, 0x12, 0xc7, 0x01, 0x20, 0x57, 0x40, 0x42, 0xdc,
+ 0x83, 0x59, 0xee, 0xdf, 0xf8, 0x20, 0x01, 0x84, 0xa6, 0x15, 0x3c,
+ 0xfe, 0x46, 0x23, 0xac, 0x2b, 0xcd, 0xb8, 0xab, 0x9f, 0x46},
+ {0x06, 0x60, 0xef, 0xd9, 0x2a, 0x5b, 0xb1, 0x96, 0x92, 0x63, 0xe7,
+ 0x46, 0x23, 0x8b, 0x8f, 0xa2, 0x91, 0xa3, 0x0c, 0x7c, 0x81, 0x75,
+ 0x1b, 0xc4, 0x38, 0x10, 0x18, 0x2a, 0xc4, 0xe6, 0xe3, 0x7e}},
+ {{0x08, 0xeb, 0x6b, 0x8d, 0x0d, 0x4e, 0x40, 0xb2, 0x15, 0xa0, 0x0a,
+ 0x2d, 0x70, 0xb6, 0x5e, 0xe8, 0xcf, 0xff, 0xcf, 0x59, 0x7f, 0xed,
+ 0x6c, 0x6a, 0x92, 0xd9, 0x2d, 0x61, 0xbb, 0x22, 0x12, 0x9e},
+ {0x08, 0xe2, 0x50, 0x02, 0x97, 0x31, 0x1e, 0xd0, 0x4d, 0xf2, 0x39,
+ 0xe1, 0xb6, 0x04, 0xce, 0x5f, 0x05, 0xe9, 0xab, 0x38, 0xb3, 0x22,
+ 0x63, 0x5e, 0xc8, 0x89, 0x88, 0x8f, 0x2c, 0x5b, 0xc0, 0xf6},
+ {0x06, 0x4a, 0x1d, 0x49, 0x98, 0x02, 0x1e, 0x42, 0x1c, 0xf2, 0x8d,
+ 0x0c, 0x7a, 0x86, 0x76, 0x2d, 0xc1, 0x74, 0x53, 0x7a, 0x7c, 0x65,
+ 0xad, 0x57, 0x1c, 0x92, 0xa8, 0xd3, 0x8a, 0x9b, 0x91, 0xe6}}}};
+const Epid11Params Epid11VerifierTest::kParamsStr = {
+#include "epid/common/1.1/src/epid11params_tate.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpXPrivRl = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/privrl.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpXCorruptedPrivRl = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/corrupted_privrl.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpXPrivRlSingleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/privrl_single_entry.inc"
+};
+
+const Epid11VerifierPrecomp Epid11VerifierTest::kVerifierPrecompStr = {
+#include "epid/verifier/1.1/unittests/testdata/verifier_precmp.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kSigRl = {
+ // gid
+ 0x00, 0x00, 0x00, 0x7b,
+ // rev
+ 0x00, 0x00, 0x00, 0x02,
+ // n2
+ 0x00, 0x00, 0x00, 0x02,
+ // bks
+ // bk1
+ 0x09, 0x0d, 0x6f, 0x82, 0x77, 0x88, 0x49, 0x53, 0xba, 0x1e, 0x1b, 0x0e,
+ 0x5e, 0xae, 0xc0, 0x27, 0xad, 0xe3, 0xb1, 0x09, 0x4f, 0xcd, 0xb6, 0xe6,
+ 0x6f, 0x7f, 0xa3, 0x1a, 0x1e, 0xfb, 0x52, 0x72, 0xfa, 0x85, 0x0f, 0x5c,
+ 0x97, 0x61, 0xbf, 0x46, 0x7e, 0xec, 0xd6, 0x64, 0xda, 0xa9, 0x8e, 0xf5,
+ 0xd3, 0xdf, 0xfa, 0x13, 0x5a, 0xb2, 0x3e, 0xeb, 0x0a, 0x9d, 0x02, 0xc0,
+ 0x33, 0xec, 0x2a, 0x70, 0x41, 0xb7, 0xa4, 0xc8, 0x43, 0x3f, 0x0b, 0xc2,
+ 0x80, 0x31, 0xbe, 0x75, 0x65, 0xe9, 0xbb, 0x81, 0x73, 0x5b, 0x91, 0x4f,
+ 0x3f, 0xd7, 0xbe, 0xb5, 0x19, 0x56, 0x3f, 0x18, 0x95, 0xea, 0xc1, 0xd7,
+ 0xa4, 0x5e, 0xb9, 0x86, 0xfc, 0xe5, 0xc4, 0x0f, 0x54, 0x37, 0xab, 0xed,
+ 0x59, 0x20, 0xce, 0x67, 0x68, 0x3c, 0x25, 0x4d, 0xbc, 0x5f, 0x6a, 0x4d,
+ 0x5a, 0xa7, 0x93, 0xce, 0x90, 0x2d, 0x3e, 0x5a,
+ // bk2
+ 0x67, 0x58, 0xb2, 0x9c, 0xad, 0x61, 0x1f, 0xfb, 0x74, 0x23, 0xea, 0x40,
+ 0xe9, 0x66, 0x26, 0xb0, 0x43, 0xdc, 0x7e, 0xc7, 0x48, 0x88, 0x56, 0x59,
+ 0xf3, 0x35, 0x9f, 0xdb, 0xfa, 0xa2, 0x49, 0x51, 0x85, 0x35, 0x42, 0x50,
+ 0x8e, 0x79, 0x79, 0xc0, 0x6c, 0xcc, 0x39, 0x0b, 0xad, 0x3b, 0x39, 0x33,
+ 0xae, 0xb2, 0xa1, 0xc5, 0x28, 0x6f, 0x48, 0x3a, 0xd2, 0x63, 0x5d, 0xfb,
+ 0x1b, 0x1f, 0x8a, 0x63, 0x5b, 0x9f, 0xe7, 0x93, 0x5f, 0xc6, 0x1e, 0xe5,
+ 0x9b, 0x52, 0x04, 0x03, 0x85, 0x28, 0x5c, 0x24, 0x96, 0xaa, 0xbb, 0xe1,
+ 0xdd, 0x03, 0x90, 0x68, 0xe0, 0x13, 0xe8, 0x90, 0x9e, 0x68, 0x8e, 0xa0,
+ 0xec, 0x7b, 0xf5, 0xe9, 0x29, 0x4a, 0x3e, 0x78, 0xbd, 0xb6, 0x3c, 0x10,
+ 0xf8, 0xec, 0xc6, 0x2c, 0x4b, 0x4d, 0x8a, 0xc1, 0x3d, 0x65, 0xf5, 0x93,
+ 0x8d, 0x5b, 0x07, 0x3f, 0x78, 0x92, 0x1c, 0xfa};
+
+const std::vector<uint8_t> Epid11VerifierTest::kSigRlForMsg0_255 = {
+ // gid
+ 0x00, 0x00, 0x00, 0x7b,
+ // rev
+ 0x00, 0x00, 0x00, 0x01,
+ // n2
+ 0x00, 0x00, 0x00, 0x01,
+ // bks
+ 0x73, 0x2c, 0x11, 0x04, 0x16, 0x77, 0x2b, 0x90, 0xe3, 0x35, 0x3b, 0x99,
+ 0xf0, 0x26, 0x09, 0x90, 0x8d, 0xb8, 0xa8, 0x73, 0x94, 0xf9, 0x05, 0x1b,
+ 0x28, 0xc9, 0x11, 0xdc, 0xf7, 0x44, 0xea, 0x94, 0x80, 0x22, 0x4a, 0x18,
+ 0x86, 0x42, 0x3e, 0x4c, 0x68, 0x07, 0x91, 0xab, 0x62, 0xbb, 0xd1, 0xb7,
+ 0x2b, 0xa0, 0xbe, 0x3d, 0x9f, 0xda, 0x1c, 0xf3, 0x6e, 0xe7, 0x08, 0x0e,
+ 0x5e, 0xcc, 0xb9, 0x28, 0xfb, 0xc9, 0x6e, 0x9c, 0x58, 0x1b, 0xb9, 0x0b,
+ 0x1b, 0xac, 0x16, 0x81, 0xef, 0x02, 0x02, 0x6f, 0x16, 0xa8, 0x6a, 0xbb,
+ 0x54, 0xcd, 0xef, 0x1f, 0xbc, 0xd4, 0xd5, 0x84, 0x96, 0xe8, 0x7f, 0x19,
+ 0xc7, 0xfe, 0xac, 0xc6, 0xc1, 0xd8, 0xed, 0x64, 0xa6, 0xcd, 0x2d, 0xa1,
+ 0x37, 0x0f, 0x37, 0x41, 0xd9, 0xb5, 0xec, 0x95, 0x13, 0xc6, 0x1d, 0x4b,
+ 0xe2, 0x35, 0x7f, 0x42, 0x5e, 0xf5, 0x20, 0x71};
+const std::vector<uint8_t> Epid11VerifierTest::kEmptySigRl = {
+ // gid
+ 0x00, 0x00, 0x00, 0x7b,
+ // rev
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x00,
+ // not bk's
+};
+
+const OctStr32 Epid11VerifierTest::kOctStr32_1 = {0x00, 0x00, 0x00, 0x01};
+
+const std::vector<uint8_t> Epid11VerifierTest::kGroupRlEmptyBuf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x00,
+ // n3
+ 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> Epid11VerifierTest::kGroupRl3GidBuf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x03,
+ // gid[0]
+ 0x00, 0x00, 0x00, 0x01,
+ // gid[1]
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[2]
+ 0x00, 0x00, 0x00, 0x03,
+};
+
+const std::vector<uint8_t> Epid11VerifierTest::kMsg0 = {
+ 't', 'e', 's', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e'};
+const std::vector<uint8_t> Epid11VerifierTest::kBsn0 = {'b', 'a', 's', 'e', 'n',
+ 'a', 'm', 'e', '1'};
+
+const std::vector<uint8_t> Epid11VerifierTest::kData_0_255 = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
+ 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
+ 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff,
+};
+const std::vector<uint8_t> Epid11VerifierTest::kSigGrpXMember0Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXMember0Sha256Bsn0Msg0SingleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_single_entry.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg0_three_entry.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kSigGrpXMember0Sha256Bsn0Msg1 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kSigGrpXMember0Sha256Bsn1Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXMember0Sha256RandbaseMsg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXMember0Sha256RandbaseMsg0N2One = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/sig_sha256_bsnrnd_msg0.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXMember0Sha256RandbaseMsg1 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc"
+};
+
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrp01Member0Sha256kBsn0Data_0_255 = {
+#include "epid/common-testhelper/1.1/testdata/grp01/member0/sig_bsn0_msg_0_255_sha256.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kSigGrpXMember1Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpRlRevokedGrpXSingleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_single_entry.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpRlRevokedGrpXFirstEntry = {
+#include "epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_first_entry.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpRlRevokedGrpXMiddleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_middle_entry.inc"
+};
+const std::vector<uint8_t> Epid11VerifierTest::kGrpRlRevokedGrpXLastEntry = {
+#include "epid/common-testhelper/1.1/testdata/grprl_revoked_grp_x_last_entry.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kGrpXSigRlMember0Bsn0Msg0SingleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_single_entry.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kGrpXSigRlMember0Bsn0Msg0FirstEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_first_entry.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kGrpXSigRlMember0Bsn0Msg0MiddleEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_middle_entry.inc"
+};
+const std::vector<uint8_t>
+ Epid11VerifierTest::kGrpXSigRlMember0Bsn0Msg0LastEntry = {
+#include "epid/common-testhelper/1.1/testdata/grp_x/sigrl_member0_sig_bsn0_msg0_revoked_last_entry.inc"
+};
diff --git a/epid/verifier/1.1/unittests/verifier-testhelper.h b/epid/verifier/1.1/unittests/verifier-testhelper.h
new file mode 100644
index 0000000..58db1de
--- /dev/null
+++ b/epid/verifier/1.1/unittests/verifier-testhelper.h
@@ -0,0 +1,128 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Test fixture class for Epid11Verifier.
+ */
+#ifndef EPID_VERIFIER_1_1_UNITTESTS_VERIFIER_TESTHELPER_H_
+#define EPID_VERIFIER_1_1_UNITTESTS_VERIFIER_TESTHELPER_H_
+
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+}
+
+/// Test fixture class for Epid11Verifier
+class Epid11VerifierTest : public ::testing::Test {
+ public:
+ /// Serialized identity element in G3
+ static const Epid11G3ElemStr kG3IdentityStr;
+ /// test public key
+ static const Epid11GroupPubKey kPubKeyStr;
+ /// test public key for tests of msg containing all bytes
+ static const Epid11GroupPubKey kPubKeyStrForMsg0_255;
+ /// the message "test message"
+ static const std::vector<uint8_t> kMsg0;
+ /// the basename "basename1"
+ static const std::vector<uint8_t> kBsn0;
+ /// a data with bytes [0,255]
+ static const std::vector<uint8_t> kData_0_255;
+ /// Signature of kData_0_255 with kBsn0 by Grp01 Member0 using Sha256
+ static const std::vector<uint8_t> kSigGrp01Member0Sha256kBsn0Data_0_255;
+ /// the privrl of group X
+ static const std::vector<uint8_t> kGrpXPrivRl;
+ /// currpted privrl of group X
+ static const std::vector<uint8_t> kGrpXCorruptedPrivRl;
+ /// a single entry privrl for group X
+ static const std::vector<uint8_t> kGrpXPrivRlSingleEntry;
+ /// verifier pre-computation data associated with pub_key_str
+ static const Epid11VerifierPrecomp kVerifierPrecompStr;
+ /// Intel(R) EPID 1.1 parameters
+ static const Epid11Params kParamsStr;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg0;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 with one NrProof
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg0SingleEntry;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 with three NrProof
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry;
+ /// signature of msg1 by member0 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg1;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn1
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn1Msg0;
+ /// signature of msg0 by member0 of groupX with Sha256 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256RandbaseMsg0;
+ /// signature of msg0 by member0 of groupX with Sha256 rnd base with n2==1
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256RandbaseMsg0N2One;
+ /// signature of msg1 by member0 of groupX with Sha256 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256RandbaseMsg1;
+ /// signature of msg0 by member1 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember1Sha256Bsn0Msg0;
+ /// signature of msg0 by priv revoked member 0 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+ /// signature of msg0 by priv revoked member 1 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0;
+ /// signature of msg0 by priv revoked member 2 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0;
+
+ /// group based rl test data (empty rl)
+ static const std::vector<uint8_t> kGroupRlEmptyBuf;
+ /// group based rl test data (v=3, n=3, 3 revoked gid)
+ static const std::vector<uint8_t> kGroupRl3GidBuf;
+
+ /// a group revocation list with single group revoked
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXSingleEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXFirstEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXMiddleEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXLastEntry;
+
+ /// signature based revocation list
+ static const std::vector<uint8_t> kSigRl;
+ /// signature based revocation list for tests of msg containing all bytes
+ static const std::vector<uint8_t> kSigRlForMsg0_255;
+ /// signature based revocation list (empty rl)
+ static const std::vector<uint8_t> kEmptySigRl;
+
+ /// setup called before each TEST_F starts
+ virtual void SetUp() {}
+ /// teardown called after each TEST_F finishes
+ virtual void TearDown() {}
+
+ /// value "1" represented as an octstr constant
+ /*!
+ this value is used frequently to set 32 bit fields. describing as a constant
+ here
+ to reduce replication in code.
+ */
+ static const OctStr32 kOctStr32_1;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Bsn0Msg0SingleEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Bsn0Msg0FirstEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Bsn0Msg0MiddleEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Bsn0Msg0LastEntry;
+};
+
+#endif // EPID_VERIFIER_1_1_UNITTESTS_VERIFIER_TESTHELPER_H_
diff --git a/epid/verifier/1.1/unittests/verify-test.cc b/epid/verifier/1.1/unittests/verify-test.cc
new file mode 100644
index 0000000..84dbae8
--- /dev/null
+++ b/epid/verifier/1.1/unittests/verify-test.cc
@@ -0,0 +1,772 @@
+/*############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+
+/*!
+* \file
+* \brief Epid11Verify unit tests.
+*/
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/src/endian_convert.h"
+#include "epid/verifier/1.1/api.h"
+}
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(Epid11VerifierTest, VerifyFailsGivenNullParameters) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(nullptr, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr, Epid11Verify(verifier, nullptr, sig.size(),
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), nullptr, msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyFailsGivenTooShortSigLen) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(), 0,
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sizeof(Epid11Signature) - sizeof(Epid11NrProof) - 1,
+ msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyFailsGivenSigLenTooShortForRlCount) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11VerifierSetSigRl(verifier, (Epid11SigRl const*)this->kSigRl.data(),
+ this->kSigRl.size());
+ auto sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto n2 = ntohl(((Epid11SigRl const*)this->kSigRl.data())->n2.data);
+ sig.resize(sizeof(Epid11Signature) +
+ (n2 - 2) * sizeof(((Epid11Signature*)0)->sigma));
+ auto msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyFailsGivenSigLenTooLongForRlCount) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11VerifierSetSigRl(verifier, (Epid11SigRl const*)this->kSigRl.data(),
+ this->kSigRl.size());
+ auto sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto n2 = ntohl(((Epid11SigRl const*)this->kSigRl.data())->n2.data);
+ sig.resize(sizeof(Epid11Signature) +
+ n2 * sizeof(((Epid11Signature*)0)->sigma));
+ auto msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+#if (SIZE_MAX <= 0xFFFFFFFF) // When size_t value is 32 bit or lower
+TEST_F(Epid11VerifierTest, VerifyFailsGivenRlCountTooBig) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ Epid11VerifierSetSigRl(verifier, (Epid11SigRl const*)this->kSigRl.data(),
+ this->kSigRl.size());
+ auto sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ uint32_t n2 = SIZE_MAX / sizeof(Epid11NrProof) + 1;
+ uint32_t n2_ = ntohl(n2);
+ Epid11Signature* sig_struct = (Epid11Signature*)sig.data();
+ sig_struct->n2 = *(OctStr32*)&n2_;
+ sig.resize(sizeof(Epid11Signature) + (n2 - 1) * sizeof(Epid11NrProof));
+ auto msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+#endif
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 1 - We use the following variables T1, T2, R1, R2,
+// t1, t2 (elements of G1), R4, t3 (elements of GT),
+// B, K, R3, t5 (elements of G3), c, sx, sy, sa, sb,
+// salpha, sbeta, nc, nc', nsx, syalpha,
+// t4 (256-bit big integers), nd (80-bit big integer),
+// and sf (600-bit big integer).
+// This Step is not testable
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 2 - The verifier reads the verifier pre-computation
+// blob (gid, e12, e22, e2w) from its storage.
+// Refer to Section 3.4 for the computation of
+// these values.
+// This Step is not testable
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 3 - The verifier verifies gid in the public key,
+// PRIV-RL, and SIG-RL (if provided) and the verifier
+// pre-computation blob all match.
+// This step tested with SetPrivRl, SetSigRl and ReadPrecomp functions tests
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 4 - The verifier verifies the signatures of PRIV-RL,
+// SIG-RL (if provided), and Group-RL (if provided)
+// using IVK.
+// This Step is not testable
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 5 - If Group-RL is provided as input, the verifier
+// verifies that gid has not been revoked, i.e.,
+// gid does not match any entry in Group-RL.
+
+TEST_F(Epid11VerifierTest, VerifyRejectsFromGroupRlSingleEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXSingleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsFromGroupRlFirstEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXFirstEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsFromGroupRlMiddleEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXMiddleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsFromGroupRlLastEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXLastEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 6 - If SIG-RL is provided as input, the verifier
+// verifies that RLver and n2 values in s match with
+// the values in SIG-RL. If SIG-RL is not provided
+// as input, but the input signature is a not basic
+// signature, the verifier aborts and outputs false.
+
+TEST_F(Epid11VerifierTest, VerifyFailsOnSigRlverNotMatchSigRlRlver) {
+ // The verifier verifies that RLver in Sigma and in SigRL
+ // match. If mismatch, abort and output "operation failed".
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto sig_rl = this->kGrpXSigRlMember0Bsn0Msg0SingleEntry;
+ auto sig_rl_size = sig_rl.size();
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ Epid11SigRl sig_rl_wrong_ver = *(Epid11SigRl const*)sig_rl.data();
+ sig_rl_wrong_ver.version.data[0]++;
+ THROW_ON_EPIDERR(
+ Epid11VerifierSetSigRl(verifier, &sig_rl_wrong_ver, sig_rl_size));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidErr, Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyFailsOnSigN2NotMatchSigRlN2) {
+ // The verifier verifies that n2 in Sigma and in SigRL
+ // match. If mismatch, abort and output "operation failed".
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto* sig_rl =
+ (Epid11SigRl const*)this->kGrpXSigRlMember0Bsn0Msg0MiddleEntry.data();
+ size_t sig_rl_size = this->kGrpXSigRlMember0Bsn0Msg0MiddleEntry.size();
+ auto sig_raw = this->kSigGrpXMember0Sha256Bsn0Msg0SingleEntry;
+ Epid11Signature* sig = (Epid11Signature*)sig_raw.data();
+ sig->rl_ver = sig_rl->version;
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(verifier, sig_rl, sig_rl_size));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr, Epid11Verify(verifier, sig, sig_raw.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyFailsSigIsNotBasicAndSigRlIsNotProvided) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry;
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 7 - The verifier verifies that G3.isIdentity(B) is false.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsIdentityB) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256Bsn0Msg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256Bsn0Msg0.size();
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ memset(&sig.sigma0.B, 0, sizeof(sig.sigma0.B));
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 8 - If bsnSize = 0, the verifier verifies G3.inGroup(B) = true.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsBNotInG3) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.B.x.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 9 - If bsnSize > 0, the verifier verifies B = G3.hash(bsn).
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsBNotMatchingBasename) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256Bsn0Msg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256Bsn0Msg0.size();
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ bsn.push_back('x');
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 10 - The verifier verifies G3.inGroup(K) = true.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsKNotInG3) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.K.x.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 11 - The verifier verifies G1.inGroup(T1) = true.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsT1NotInG1) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.T1.x.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 12 - The verifier verifies G1.inGroup(T2) = true.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsT2NotInG1) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.T2.x.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 13 - The verifier verifies sx, sy, sa, sb, salpha, sbeta
+// in [0, p-1].
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsSxNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.sx.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSyNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.sy.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSaNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.sa.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSbNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.sb.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSalphaNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.salpha.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSbetaNotInFp) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ sig.sigma0.sbeta.data.data[0] = 0xEE;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 14 - The verifier verifies that sf is an (at-most) 593-bit
+// unsigned integer, in other words, sf < 2^593.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsSfMoreThan592Bits) {
+ auto& pub_key = this->kPubKeyStr;
+ Epid11Signature sig = {0};
+ sig.sigma0 =
+ *(Epid11BasicSignature*)(this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto& msg = this->kMsg0;
+ memset(&sig.sigma0.sf, 0, sizeof(sig.sigma0.sf));
+ sig.sigma0.sf.data[593 / CHAR_BIT] = 1 << ((593 % CHAR_BIT) - 1);
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, &sig, sig_len, msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 15 - The verifier computes nc = (-c) mod p.
+// 4.1.2 step 16 - The verifier computes nc' = (-c) mod p'.
+// 4.1.2 step 17 - The verifier computes nsx = (-sx) mod p.
+// 4.1.2 step 18 - The verifier computes syalpha = (sy + salpha) mod p.
+// 4.1.2 step 19 - The verifier computes R1 = G1.multiexp(h1, sa, h2, sb, T2,
+// nc).
+// 4.1.2 step 20 - The verifier computes R2 = G1.multiexp(h1, salpha, h2,
+// sbeta, T2, nsx).
+// 4.1.2 step 21 - The verifier computes R3 = G3.multiexp(B, sf, K, nc').
+// 4.1.2 step 22 - The verifier computes t1 = G1.multiexp(T1, nsx, g1, c).
+// 4.1.2 step 23 - The verifier computes t2 = G1.exp(T1, nc).
+// 4.1.2 step 24 - The verifier computes R4 = pairing(t1, g2).
+// 4.1.2 step 25 - The verifier computes t3 = pairing(t2, w).
+// 4.1.2 step 26 - The verifier computes R4 = GT.mul(R4, t3).
+// 4.1.2 step 27 - The verifier compute t3 = GT.multiexp(e12, sf, e22,
+// syalpha, e2w, sa).
+// 4.1.2 step 28 - The verifier compute R4 = GT.mul(R4, t3).
+// 4.1.2 step 29 - The verifier compute t4 = Hash(p || g1 || g2 || g3
+// || h1 || h2 || w || B || K
+// || T1 || T2 || R1 || R2
+// || R3 || R4).
+// These steps are not testable
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 30 - The verifier verifies c = H(t4 || nd || mSize || m).
+// It is not practical to test all inputs to this hash
+TEST_F(Epid11VerifierTest, VerifyRejectsSigWithMismatchedMsg) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ size_t sig_len = this->kSigGrpXMember0Sha256RandbaseMsg0.size();
+ auto msg = this->kMsg0;
+ msg.push_back('x');
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(), sig_len,
+ msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 31 - For i = 0, ..., n1-1, the verifier computes
+// t5 = G3.exp(B, f[i]) and verifies that
+// G3.isEqual(t5, K) = false.
+//
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromPrivRlSingleEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRlSingleEntry;
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromPrivRlFirstEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromPrivRlMiddleEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0;
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromPrivRlLastEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0;
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigUsingCorruptedPrivRlEntry) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXCorruptedPrivRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 32 - For i = 0, ..., n2-1, the verifier verifies
+// nr-verify(B, K, B[i], K[i], s[i]) = true.
+// The details of nr-verify will be given in the
+// next subsection.
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromSigRlSingleEntry) {
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Bsn0Msg0SingleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0SingleEntry;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromSigRlFirstEntry) {
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Bsn0Msg0FirstEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromSigRlMiddleEntry) {
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Bsn0Msg0MiddleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyRejectsSigFromSigRlLastEntry) {
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Bsn0Msg0LastEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0ThreeEntry;
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 33 - If all the above verifications succeed, the
+// verifier outputs true. If any of the above
+// verifications fails, the verifier immediately
+// aborts and outputs false.
+
+TEST_F(Epid11VerifierTest, VerifyAcceptsSigWithBaseNameNoRl) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyAcceptsSigWithBaseNameAllRl) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGroupRlEmptyBuf;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kEmptySigRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetBasename(verifier, bsn.data(), bsn.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyAcceptsSigWithRandomBaseNameNoRl) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto& msg = this->kMsg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ EXPECT_EQ(kEpidSigValid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyAcceptsSigWithRandomBaseNameAllRl) {
+ auto& pub_key = this->kPubKeyStr;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGroupRlEmptyBuf;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kEmptySigRl;
+ auto& sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)sig_rl.data(), sig_rl.size()));
+ EXPECT_EQ(kEpidSigValid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyAcceptsSigGivenMsgContainingAllPossibleBytes) {
+ auto& pub_key = this->kPubKeyStrForMsg0_255;
+ auto& msg = this->kData_0_255;
+ auto& grp_rl = this->kGroupRlEmptyBuf;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrp01Member0Sha256kBsn0Data_0_255;
+
+ Epid11VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(Epid11VerifierSetGroupRl(
+ verifier, (Epid11GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetPrivRl(
+ verifier, (Epid11PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(Epid11VerifierSetSigRl(
+ verifier, (Epid11SigRl const*)this->kSigRlForMsg0_255.data(),
+ this->kSigRlForMsg0_255.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ Epid11Verify(verifier, (Epid11Signature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/verifier/1.1/unittests/verifybasic-test.cc b/epid/verifier/1.1/unittests/verifybasic-test.cc
new file mode 100644
index 0000000..d76a00a
--- /dev/null
+++ b/epid/verifier/1.1/unittests/verifybasic-test.cc
@@ -0,0 +1,112 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Epid11VerifyBasicSig unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/1.1/api.h"
+}
+
+#include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h"
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/verifier/1.1/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(Epid11VerifierTest, VerifyBasicSigFailsGivenNullPtr) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto const& sig =
+ (Epid11Signature const*)this->kSigGrpXMember0Sha256RandbaseMsg0.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifyBasicSig(nullptr, &basic_sig, msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifyBasicSig(verifier, nullptr, msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ Epid11VerifyBasicSig(verifier, &basic_sig, nullptr, msg.size()));
+}
+
+TEST_F(Epid11VerifierTest,
+ VerifyBasicSigCanVerifyValidSignatureWithSHA256AsDefault) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto const& sig =
+ (Epid11Signature const*)this->kSigGrpXMember0Sha256RandbaseMsg0.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kMsg0;
+
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest,
+ VerifyBasicSigDetectsInvalidSignatureGivenMatchingMessage) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto const& sig =
+ (Epid11Signature const*)this->kSigGrpXMember0Sha256RandbaseMsg0.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kMsg0;
+ Epid11BasicSignature corrupted_basic_sig = basic_sig;
+ corrupted_basic_sig.B.x.data.data[0]++;
+ EXPECT_NE(kEpidNoErr, Epid11VerifyBasicSig(verifier, &corrupted_basic_sig,
+ msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest,
+ VerifyBasicSigDetectsInvalidSignatureGivenMessageMismatch) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto const& sig =
+ (Epid11Signature const*)this->kSigGrpXMember0Sha256RandbaseMsg0.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+ auto msg = this->kMsg0;
+ msg[0]++; // change message for signature verification to fail
+ EXPECT_EQ(kEpidSigInvalid,
+ Epid11VerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest, VerifyBasicSigCanVerifyWithBasename) {
+ Epid11VerifierCtxObj verifier(this->kPubKeyStr);
+ auto const& sig =
+ (Epid11Signature const*)this->kSigGrpXMember0Sha256Bsn0Msg0.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kMsg0;
+ auto& basename = this->kBsn0;
+ THROW_ON_EPIDERR(
+ Epid11VerifierSetBasename(verifier, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(Epid11VerifierTest,
+ VerifyBasicSigCanVerifyMsgContainingAllPossibleBytes) {
+ Epid11VerifierCtxObj verifier(kPubKeyStrForMsg0_255);
+ auto const& sig = (Epid11Signature const*)this
+ ->kSigGrp01Member0Sha256kBsn0Data_0_255.data();
+ const Epid11BasicSignature basic_sig = sig->sigma0;
+
+ auto& msg = this->kData_0_255;
+ EXPECT_EQ(kEpidNoErr,
+ Epid11VerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/verifier/Makefile b/epid/verifier/Makefile
new file mode 100644
index 0000000..ee3386b
--- /dev/null
+++ b/epid/verifier/Makefile
@@ -0,0 +1,90 @@
+#!/usr/bin/make -f
+
+#define variables
+IPP_SRC_INCLUDE_DIR = ../../ext/ipp/sources/ippcp/src/
+IPP_INCLUDE_DIR = ../../ext/ipp/sources/include/
+GTEST_INCLUDE_DIR = ../../ext/
+
+LIB_INSTALL_DIR = $(epidinstalldir)/lib/posix-$(ARCH)/
+TEST_INSTALL_DIR = $(epidinstalldir)/test/
+HEADERS_INSTALL_DIR = $(epidinstalldir)/include/epid/verifier/
+HEADERS_11_INSTALL_DIR = $(epidinstalldir)/include/epid/verifier/1.1/
+
+API_HEADERS_INSTALL = ./api.h
+
+API_11_HEADERS_INSTALL = ./1.1/api.h
+
+VERIFIER_INCLUDE_DIR = ../../
+VERIFIER_11_INCLUDE_DIR = ../../1.1
+
+VERIFIER_SRC = $(wildcard ./src/*.c)
+VERIFIER_SRC += $(wildcard ./1.1/src/*.c)
+VERIFIER_OBJ = $(VERIFIER_SRC:.c=.o)
+VERIFIER_LIB = ./libverifier.a
+
+VERIFIER_UTEST_EXE = ./verifier-utest$(EXE_EXTENSION)
+VERIFIER_UTEST_SRC = $(wildcard ./unittests/*.cc)
+VERIFIER_UTEST_SRC += $(wildcard ./1.1/unittests/*.cc)
+VERIFIER_UTEST_OBJ = $(VERIFIER_UTEST_SRC:.cc=.o)
+LIB_VERIFIER_DIR = .
+LIB_COMMON_TESTHELPER_DIR = ../common-testhelper
+LIB_COMMON_DIR = ../common
+LIB_IPPCP_DIR = ../../ext/ipp/sources/ippcp/src
+
+#set flags for linker
+LDFLAGS += -L$(GTEST_INCLUDE_DIR)/gtest -L$(LIB_COMMON_TESTHELPER_DIR) \
+ -L$(LIB_VERIFIER_DIR) -L$(LIB_COMMON_DIR) \
+ -L$(LIB_IPPCP_DIR) -lgtest -lcommon-testhelper -lverifier -lcommon \
+ -lippcp
+
+ifneq ($(TSS_PATH),)
+ CFLAGS += -DTPM_TSS
+endif
+
+#target part
+$(VERIFIER_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(IPP_INCLUDE_DIR) -I$(IPP_SRC_INCLUDE_DIR) \
+ -I$(VERIFIER_INCLUDE_DIR) -I$(VERIFIER_11_INCLUDE_DIR) -c $^ -o $@
+
+$(VERIFIER_LIB): $(VERIFIER_OBJ)
+ $(AR) rc $(VERIFIER_LIB) $(VERIFIER_OBJ)
+ $(RANLIB) $(VERIFIER_LIB)
+
+$(VERIFIER_UTEST_EXE): $(VERIFIER_UTEST_OBJ)
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+$(VERIFIER_UTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ $(CXXFLAGS) $(GTEST_DEFINES) -I$(VERIFIER_INCLUDE_DIR) \
+ -I$(VERIFIER_11_INCLUDE_DIR) -I$(GTEST_INCLUDE_DIR) -c $^
+
+
+build: all
+
+all: $(VERIFIER_LIB)
+
+install:
+ mkdir -p '$(LIB_INSTALL_DIR)'
+ mkdir -p '$(HEADERS_INSTALL_DIR)'
+ mkdir -p '$(HEADERS_11_INSTALL_DIR)'
+ cp $(VERIFIER_LIB) '$(LIB_INSTALL_DIR)'
+ cp $(API_HEADERS_INSTALL) '$(HEADERS_INSTALL_DIR)'
+ cp $(API_11_HEADERS_INSTALL) '$(HEADERS_11_INSTALL_DIR)'
+#install tests if they exist
+ifneq (,$(wildcard $(VERIFIER_UTEST_EXE)))
+ mkdir -p '$(TEST_INSTALL_DIR)'
+ cp $(VERIFIER_UTEST_EXE) '$(TEST_INSTALL_DIR)'
+endif
+
+utest: $(VERIFIER_UTEST_EXE)
+
+run_utest:
+ $(VERIFIER_UTEST_EXE) $(GTEST_FLAGS)
+
+check: utest run_utest
+
+clean:
+ rm -f $(VERIFIER_OBJ) \
+ $(VERIFIER_LIB) \
+ $(VERIFIER_UTEST_OBJ) \
+ $(VERIFIER_UTEST_EXE) \
+ *.xml
diff --git a/epid/verifier/api.h b/epid/verifier/api.h
new file mode 100644
index 0000000..48db5bd
--- /dev/null
+++ b/epid/verifier/api.h
@@ -0,0 +1,588 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_VERIFIER_API_H_
+#define EPID_VERIFIER_API_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+/*!
+ * \file
+ * \brief Intel(R) EPID SDK verifier API.
+ */
+
+/// Verifier functionality
+/*!
+ \defgroup EpidVerifierModule verifier
+
+ Defines the APIs needed by Intel(R) EPID verifiers. Each verifier
+ context (::VerifierCtx) represents a verifier for a single group.
+
+ To use this module, include the header epid/verifier/api.h.
+
+ \ingroup EpidModule
+ @{
+*/
+
+/// Internal context of verifier.
+typedef struct VerifierCtx VerifierCtx;
+
+/// Pre-computed verifier settings.
+/*!
+ Serialized form of the information about a verifier that remains stable for
+ a given set of keys.
+
+ \note e12 = 0 implies that this data is not valid
+ */
+#pragma pack(1)
+typedef struct VerifierPrecomp {
+ GroupId gid; ///< group ID
+ GtElemStr e12; ///< an element in GT
+ GtElemStr e22; ///< an element in GT
+ GtElemStr e2w; ///< an element in GT
+ GtElemStr eg12; ///< an element in GT
+} VerifierPrecomp;
+#pragma pack()
+
+/// Creates a new verifier context.
+/*!
+ Must be called to create the verifier context that is used by
+ other "Verifier" APIs.
+
+ Allocates memory for the context, then initializes it.
+
+ EpidVerifierDelete() must be called to safely release the member context.
+
+
+ \param[in] pub_key
+ The group certificate.
+ \param[in] precomp
+ Optional pre-computed data. If NULL the value is computed internally and is
+ readable using EpidVerifierWritePrecomp().
+ \param[out] ctx
+ Newly constructed verifier context.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the content of ctx is undefined.
+
+ \see EpidVerifierDelete
+ \see EpidVerifierWritePrecomp
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierCreate(GroupPubKey const* pub_key,
+ VerifierPrecomp const* precomp,
+ VerifierCtx** ctx);
+
+/// Deletes an existing verifier context.
+/*!
+ Must be called to safely release a verifier context created using
+ EpidVerifierCreate().
+
+ De-initializes the context, frees memory used by the context, and sets the
+ context pointer to NULL.
+
+ \param[in,out] ctx
+ The verifier context. Can be NULL.
+
+ \see EpidVerifierCreate
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+void EpidVerifierDelete(VerifierCtx** ctx);
+
+/// Serializes the pre-computed verifier settings.
+/*!
+ \param[in] ctx
+ The verifier context.
+ \param[out] precomp
+ The Serialized pre-computed verifier settings.
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the content of precomp is undefined.
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierWritePrecomp(VerifierCtx const* ctx,
+ VerifierPrecomp* precomp);
+
+/// Sets the private key based revocation list.
+/*!
+ The caller is responsible for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call fails if trying to set an older version
+ of the revocation list than was last set.
+
+ \attention
+ The memory pointed to by priv_rl is accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list is undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by priv_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] priv_rl
+ The private key based revocation list.
+ \param[in] priv_rl_size
+ The size of the private key based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the private key based revocation list
+ pointed to by the verifier is undefined.
+
+ \see EpidVerifierCreate
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetPrivRl(VerifierCtx* ctx, PrivRl const* priv_rl,
+ size_t priv_rl_size);
+
+/// Sets the signature based revocation list.
+/*!
+ The caller is responsible for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call fails if trying to set an older version
+ of the revocation list than was last set.
+
+ \attention
+ The memory pointed to by sig_rl is accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list is undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by sig_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] sig_rl
+ The signature based revocation list.
+ \param[in] sig_rl_size
+ The size of the signature based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the signature based revocation list pointed
+ to by the verifier is undefined.
+
+ \see EpidVerifierCreate
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetSigRl(VerifierCtx* ctx, SigRl const* sig_rl,
+ size_t sig_rl_size);
+
+/// Sets the group based revocation list.
+/*!
+ The caller is responsible for ensuring the revocation list is authorized,
+ e.g signed by the issuer. The caller is also responsible checking the version
+ of the revocation list. The call fails if trying to set an older version
+ of the revocation list than was last set.
+
+ \attention
+ The memory pointed to by grp_rl is accessed directly by the verifier
+ until a new list is set or the verifier is destroyed. Do not modify the
+ contents of this memory. The behavior of subsequent operations that rely on
+ the revocation list is undefined if the memory is modified.
+
+ \attention
+ It is the responsibility of the caller to free the memory pointed to by grp_rl
+ after the verifier is no longer using it.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] grp_rl
+ The group based revocation list.
+ \param[in] grp_rl_size
+ The size of the group based revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the group based revocation list pointed
+ to by the verifier is undefined.
+
+ \see EpidVerifierCreate
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetGroupRl(VerifierCtx* ctx, GroupRl const* grp_rl,
+ size_t grp_rl_size);
+
+/// Sets the verifier revocation list.
+/*!
+
+ The caller is responsible for ensuring the revocation list is
+ authorized. The caller is also responsible for checking the version
+ of the revocation list. The call fails if trying to set an older
+ version of the same revocation list than was last set.
+
+ Once ::EpidVerifierSetVerifierRl returns, callers are free to release
+ the memory pointed to by ver_rl.
+
+ \param[in,out] ctx
+ The verifier context.
+ \param[in] ver_rl
+ The verifier revocation list.
+ \param[in] ver_rl_size
+ The size of the verifier revocation list in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr the verifier revocation list pointed
+ to by the verifier is undefined.
+
+ \see EpidVerifierCreate
+ \see EpidBlacklistSig
+ \see EpidWriteVerifierRl
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetVerifierRl(VerifierCtx* ctx, VerifierRl const* ver_rl,
+ size_t ver_rl_size);
+
+/// Sets the hash algorithm to be used by a verifier.
+/*!
+ \param[in] ctx
+ The verifier context.
+ \param[in] hash_alg
+ The hash algorithm to use.
+
+ \returns ::EpidStatus
+
+ \note
+ If the result is not ::kEpidNoErr, the hash algorithm used by the
+ verifier is undefined.
+
+ \see EpidVerifierCreate
+ \see ::HashAlg
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetHashAlg(VerifierCtx* ctx, HashAlg hash_alg);
+
+/// Sets the basename to be used by a verifier.
+/*!
+
+ \note
+ A successful call to this function will clear the current verifier
+ blacklist.
+
+ \param[in, out] ctx
+ The verifier context.
+ \param[in] basename
+ The basename. Pass NULL for random base.
+ \param[in] basename_len
+ Number of bytes in basename buffer. Must be 0 if basename is NULL.
+
+ \returns ::EpidStatus
+
+ \see EpidVerifierCreate
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerifierSetBasename(VerifierCtx* ctx, void const* basename,
+ size_t basename_len);
+
+/// Verifies a signature and checks revocation status.
+/*!
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The signature.
+ \param[in] sig_len
+ The size of sig in bytes.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+
+ \returns ::EpidStatus
+
+ \retval ::kEpidSigValid
+ Signature validated successfully
+ \retval ::kEpidSigInvalid
+ Signature is invalid
+ \retval ::kEpidSigRevokedInGroupRl
+ Signature revoked in GroupRl
+ \retval ::kEpidSigRevokedInPrivRl
+ Signature revoked in PrivRl
+ \retval ::kEpidSigRevokedInSigRl
+ Signature revoked in SigRl
+ \retval ::kEpidSigRevokedInVerifierRl
+ Signature revoked in VerifierRl
+
+ \note
+ If the result is not ::kEpidNoErr or one of the values listed above the
+ verify should be considered to have failed.
+
+ \see EpidVerifierCreate
+ \see EpidSignBasic
+ \see EpidSign
+
+ \b Example
+
+ \ref UserManual_VerifyingAnIntelEpidSignature
+ */
+EpidStatus EpidVerify(VerifierCtx const* ctx, EpidSignature const* sig,
+ size_t sig_len, void const* msg, size_t msg_len);
+
+/// Determines if two signatures are linked.
+/*!
+
+ The Intel(R) EPID scheme allows signatures to be linked. If basename
+ option is specified when signing, signatures with the same basename
+ are linkable. This linking capability allows the verifier, or
+ anyone, to know whether two Intel(R) EPID signatures are generated
+ by the same member.
+
+ \param[in] sig1
+ A basic signature.
+ \param[in] sig2
+ A basic signature.
+
+ \result bool
+
+ \retval true
+ if the signatures were generated by the same member
+ \retval false
+ if it couldn't be determined if the signatures were generated by
+ the same member
+
+ \note
+ The input signatures should be verified using EpidVerifyBasicSig() before
+ invocation. Behavior is undefined if either of the signatures cannot be
+ verified.
+
+ \see EpidVerifyBasicSig
+ \see EpidSignBasic
+ \see EpidSign
+ */
+bool EpidAreSigsLinked(BasicSignature const* sig1, BasicSignature const* sig2);
+
+/// Verifies a member signature without revocation checks.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+
+ \returns ::EpidStatus
+
+ \note
+ This function should be used in conjunction with EpidNrVerify() and
+ EpidCheckPrivRlEntry().
+
+ \note
+ If the result is not ::kEpidNoErr the verify should be considered to have
+ failed.
+
+ \see EpidVerifierCreate
+ \see EpidSignBasic
+ \see EpidSign
+ */
+EpidStatus EpidVerifyBasicSig(VerifierCtx const* ctx, BasicSignature const* sig,
+ void const* msg, size_t msg_len);
+
+/// Verifies the non-revoked proof for a single signature based revocation list
+/// entry.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+ \param[in] sigrl_entry
+ The signature based revocation list entry.
+ \param[in] proof
+ The non-revoked proof.
+
+ \returns ::EpidStatus
+
+ \note
+ Sig should be verified using EpidVerifyBasicSig() before invocation. Behavior
+ is undefined if sig cannot be verified.
+
+ \note
+ This function should be used in conjunction with EpidVerifyBasicSig() and
+ EpidCheckPrivRlEntry().
+
+ \note
+ If the result is not ::kEpidNoErr, the verification should be
+ considered to have failed.
+
+ \see EpidVerifierCreate
+ \see EpidVerifyBasicSig
+ \see EpidCheckPrivRlEntry
+ */
+EpidStatus EpidNrVerify(VerifierCtx const* ctx, BasicSignature const* sig,
+ void const* msg, size_t msg_len,
+ SigRlEntry const* sigrl_entry, NrProof const* proof);
+
+/// Verifies a signature has not been revoked in the private key based
+/// revocation list.
+/*!
+ Used in constrained environments where, due to limited memory, it may not
+ be possible to process through a large and potentially unbounded revocation
+ list.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The basic signature.
+ \param[in] f
+ The private key based revocation list entry.
+
+ \note
+ Sig should be verified using EpidVerifyBasicSig() before invocation. Behavior
+ is undefined if sig cannot be verified.
+
+ \note
+ This function should be used in conjunction with EpidNrVerify() and
+ EpidVerifyBasicSig().
+
+ \note
+ If the result is not ::kEpidNoErr the verify should be considered to have
+ failed.
+
+ \returns ::EpidStatus
+ \see EpidVerifierCreate
+ \see EpidNrVerify
+ \see EpidVerifyBasicSig
+ */
+EpidStatus EpidCheckPrivRlEntry(VerifierCtx const* ctx,
+ BasicSignature const* sig, FpElemStr const* f);
+
+/// Returns the number of bytes required to serialize the verifier blacklist
+/*!
+
+ Use this function to determine the buffer size required by
+ ::EpidWriteVerifierRl.
+
+ \param[in] ctx
+ The verifier context.
+
+ \returns
+ Size in bytes required to serialize the verifier blacklist
+
+ \see EpidVerifierCreate
+ \see EpidVerifierSetVerifierRl
+ \see EpidBlacklistSig
+ \see EpidWriteVerifierRl
+*/
+size_t EpidGetVerifierRlSize(VerifierCtx const* ctx);
+
+/// Serializes the verifier blacklist to a buffer.
+/*!
+
+ If the current blacklist is empty or not set a valid empty verifier
+ blacklist will be serialized.
+
+ Use ::EpidGetVerifierRlSize to determine the buffer size required to
+ serialize the verifier blacklist.
+
+ \param[in] ctx
+ The verifier context.
+ \param[out] ver_rl
+ An existing buffer in which to write the verifier revocation list.
+ \param[in] ver_rl_size
+ The size of the caller allocated output buffer in bytes.
+
+ \returns ::EpidStatus
+
+ \see EpidVerifierCreate
+ \see EpidVerifierSetVerifierRl
+ \see EpidBlacklistSig
+ \see EpidGetVerifierRlSize
+*/
+EpidStatus EpidWriteVerifierRl(VerifierCtx const* ctx, VerifierRl* ver_rl,
+ size_t ver_rl_size);
+
+/// Adds a valid name-based signature to the verifier blacklist.
+/*!
+
+ If the signature is not valid it will not be added to the blacklist.
+
+ \param[in] ctx
+ The verifier context.
+ \param[in] sig
+ The name-based signature to revoke.
+ \param[in] sig_len
+ The size of sig in bytes.
+ \param[in] msg
+ The message that was signed.
+ \param[in] msg_len
+ The size of msg in bytes.
+
+ \returns ::EpidStatus
+
+ \see EpidVerifierCreate
+ \see EpidVerifierSetVerifierRl
+ \see EpidWriteVerifierRl
+*/
+EpidStatus EpidBlacklistSig(VerifierCtx* ctx, EpidSignature const* sig,
+ size_t sig_len, void const* msg, size_t msg_len);
+
+/*! @} */
+
+#endif // EPID_VERIFIER_API_H_
diff --git a/epid/verifier/src/check_privrl_entry.c b/epid/verifier/src/check_privrl_entry.c
new file mode 100644
index 0000000..23577ae
--- /dev/null
+++ b/epid/verifier/src/check_privrl_entry.c
@@ -0,0 +1,93 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief EpidCheckPrivRlEntry implementation.
+ */
+
+#include "epid/verifier/api.h"
+#include "epid/verifier/src/context.h"
+EpidStatus EpidCheckPrivRlEntry(VerifierCtx const* ctx,
+ BasicSignature const* sig, FpElemStr const* f) {
+ EpidStatus result = kEpidErr;
+ EcPoint* b = NULL;
+ EcPoint* k = NULL;
+ EcPoint* t4 = NULL;
+ EcGroup* G1 = NULL;
+ FfElement* ff_elem = NULL;
+ if (!ctx || !sig || !f) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->epid2_params->G1) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // Section 4.1.2 Step 4.b For i = 0, ... , n1-1, the verifier computes t4
+ // =G1.exp(B, f[i]) and verifies that G1.isEqual(t4, K) = false.
+ bool compare_result = false;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ G1 = ctx->epid2_params->G1;
+ result = NewFfElement(Fp, &ff_elem);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(G1, &b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(G1, &k);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = NewEcPoint(G1, &t4);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // ReadFfElement checks that the value f is in the field
+ result = ReadFfElement(Fp, (BigNumStr const*)f, sizeof(BigNumStr), ff_elem);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadEcPoint(G1, &sig->B, sizeof(sig->B), b);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = ReadEcPoint(G1, &sig->K, sizeof(sig->K), k);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = EcExp(G1, b, (BigNumStr const*)f, t4);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ result = EcIsEqual(G1, t4, k, &compare_result);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // if t4 == k, sig revoked in PrivRl
+ if (compare_result) {
+ result = kEpidSigRevokedInPrivRl;
+ } else {
+ result = kEpidNoErr;
+ }
+ } while (0);
+ DeleteFfElement(&ff_elem);
+ DeleteEcPoint(&t4);
+ DeleteEcPoint(&k);
+ DeleteEcPoint(&b);
+ return result;
+}
diff --git a/epid/verifier/src/context.c b/epid/verifier/src/context.c
new file mode 100644
index 0000000..c5737d1
--- /dev/null
+++ b/epid/verifier/src/context.c
@@ -0,0 +1,687 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verifier context implementation.
+ */
+#include "epid/verifier/src/context.h"
+#include <string.h>
+#include "epid/common/math/pairing.h"
+#include "epid/common/src/endian_convert.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/memory.h"
+#include "epid/common/src/sigrlvalid.h"
+#include "epid/verifier/api.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+/// create Verifier precomp of the VerifierCtx
+static EpidStatus DoPrecomputation(VerifierCtx* ctx);
+
+/// Read Verifier precomp
+static EpidStatus ReadPrecomputation(VerifierPrecomp const* precomp_str,
+ VerifierCtx* ctx);
+
+/// Internal function to prove if group based revocation list is valid
+static bool IsGroupRlValid(GroupRl const* group_rl, size_t grp_rl_size) {
+ const size_t kMinGroupRlSize = sizeof(GroupRl) - sizeof(GroupId);
+ size_t input_grp_rl_size = 0;
+
+ if (!group_rl || grp_rl_size < kMinGroupRlSize) {
+ return false;
+ }
+ if (ntohl(group_rl->n3) > (SIZE_MAX - kMinGroupRlSize) / sizeof(GroupId)) {
+ return false;
+ }
+ input_grp_rl_size = kMinGroupRlSize + (ntohl(group_rl->n3) * sizeof(GroupId));
+ if (input_grp_rl_size != grp_rl_size) {
+ return false;
+ }
+ return true;
+}
+
+/// Internal function to verify if private key based revocation list is valid
+static bool IsPrivRlValid(GroupId const* gid, PrivRl const* priv_rl,
+ size_t priv_rl_size) {
+ const size_t kMinPrivRlSize = sizeof(PrivRl) - sizeof(FpElemStr);
+ size_t input_priv_rl_size = 0;
+
+ if (!gid || !priv_rl || kMinPrivRlSize > priv_rl_size) {
+ return false;
+ }
+ if (ntohl(priv_rl->n1) >
+ (SIZE_MAX - kMinPrivRlSize) / sizeof(priv_rl->f[0])) {
+ return false;
+ }
+ // sanity check of input PrivRl size
+ input_priv_rl_size =
+ kMinPrivRlSize + ntohl(priv_rl->n1) * sizeof(priv_rl->f[0]);
+ if (input_priv_rl_size != priv_rl_size) {
+ return false;
+ }
+ // verify that gid given and gid in PrivRl match
+ if (0 != memcmp(gid, &priv_rl->gid, sizeof(*gid))) {
+ return false;
+ }
+ return true;
+}
+
+/// Internal function to verify if verifier revocation list is valid
+static bool IsVerifierRlValid(GroupId const* gid, VerifierRl const* ver_rl,
+ size_t ver_rl_size) {
+ const size_t kMinVerifierRlSize = sizeof(VerifierRl) - sizeof(G1ElemStr);
+ size_t expected_verifier_rl_size = 0;
+
+ if (!gid || !ver_rl || kMinVerifierRlSize > ver_rl_size) {
+ return false;
+ }
+ if (ntohl(ver_rl->n4) >
+ (SIZE_MAX - kMinVerifierRlSize) / sizeof(ver_rl->K[0])) {
+ return false;
+ }
+ // sanity check of input VerifierRl size
+ expected_verifier_rl_size =
+ kMinVerifierRlSize + ntohl(ver_rl->n4) * sizeof(ver_rl->K[0]);
+ if (expected_verifier_rl_size != ver_rl_size) {
+ return false;
+ }
+
+ // verify that gid in public key and gid in SigRl match
+ if (0 != memcmp(gid, &ver_rl->gid, sizeof(*gid))) {
+ return false;
+ }
+
+ return true;
+}
+
+EpidStatus EpidVerifierCreate(GroupPubKey const* pubkey,
+ VerifierPrecomp const* precomp,
+ VerifierCtx** ctx) {
+ EpidStatus result = kEpidErr;
+ VerifierCtx* verifier_ctx = NULL;
+ if (!pubkey || !ctx) {
+ return kEpidBadArgErr;
+ }
+ do {
+ // Allocate memory for VerifierCtx
+ verifier_ctx = SAFE_ALLOC(sizeof(VerifierCtx));
+ if (!verifier_ctx) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // set the default hash algorithm
+ verifier_ctx->hash_alg = kSha512;
+#ifdef TPM_TSS // if build for TSS, make Sha256 default
+ verifier_ctx->hash_alg = kSha256;
+#endif
+
+ // Internal representation of Epid2Params
+ result = CreateEpid2Params(&verifier_ctx->epid2_params);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Internal representation of Group Pub Key
+ result = CreateGroupPubKey(pubkey, verifier_ctx->epid2_params->G1,
+ verifier_ctx->epid2_params->G2,
+ &verifier_ctx->pub_key);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Store group public key strings for later use
+ result = SetKeySpecificCommitValues(pubkey, &verifier_ctx->commit_values);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Allocate verifier_ctx->e12
+ result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e12);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Allocate verifier_ctx->e22
+ result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e22);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Allocate verifier_ctx->e2w
+ result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e2w);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // Allocate verifier_ctx->eg12
+ result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->eg12);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // precomputation
+ if (precomp != NULL) {
+ result = ReadPrecomputation(precomp, verifier_ctx);
+ } else {
+ result = DoPrecomputation(verifier_ctx);
+ }
+ if (kEpidNoErr != result) {
+ break;
+ }
+ verifier_ctx->sig_rl = NULL;
+ verifier_ctx->group_rl = NULL;
+ verifier_ctx->priv_rl = NULL;
+ verifier_ctx->verifier_rl = NULL;
+ verifier_ctx->was_verifier_rl_updated = false;
+ verifier_ctx->basename_hash = NULL;
+ verifier_ctx->basename = NULL;
+ verifier_ctx->basename_len = 0;
+ *ctx = verifier_ctx;
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result && verifier_ctx) {
+ DeleteFfElement(&verifier_ctx->eg12);
+ DeleteFfElement(&verifier_ctx->e2w);
+ DeleteFfElement(&verifier_ctx->e22);
+ DeleteFfElement(&verifier_ctx->e12);
+ DeleteEpid2Params(&verifier_ctx->epid2_params);
+ DeleteGroupPubKey(&verifier_ctx->pub_key);
+ SAFE_FREE(verifier_ctx);
+ }
+ return result;
+}
+
+void EpidVerifierDelete(VerifierCtx** ctx) {
+ if (ctx && *ctx) {
+ DeleteFfElement(&(*ctx)->eg12);
+ DeleteFfElement(&(*ctx)->e2w);
+ DeleteFfElement(&(*ctx)->e22);
+ DeleteFfElement(&(*ctx)->e12);
+ DeleteGroupPubKey(&(*ctx)->pub_key);
+ DeleteEpid2Params(&(*ctx)->epid2_params);
+ (*ctx)->priv_rl = NULL;
+ (*ctx)->sig_rl = NULL;
+ (*ctx)->group_rl = NULL;
+ SAFE_FREE((*ctx)->verifier_rl);
+ DeleteEcPoint(&(*ctx)->basename_hash);
+ SAFE_FREE((*ctx)->basename);
+ (*ctx)->basename_len = 0;
+ SAFE_FREE(*ctx);
+ }
+}
+
+EpidStatus EpidVerifierWritePrecomp(VerifierCtx const* ctx,
+ VerifierPrecomp* precomp) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL; // an element in GT
+ FfElement* e22 = NULL; // an element in GT
+ FfElement* e2w = NULL; // an element in GT
+ FfElement* eg12 = NULL; // an element in GT
+ FiniteField* GT = NULL; // Finite field GT(Fq12 )
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!precomp) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->e12 || !ctx->e22 || !ctx->e2w || !ctx->eg12 || !ctx->epid2_params ||
+ !ctx->epid2_params->GT || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+ eg12 = ctx->eg12;
+ GT = ctx->epid2_params->GT;
+ precomp->gid = ctx->pub_key->gid;
+ result = WriteFfElement(GT, e12, &(precomp->e12), sizeof(precomp->e12));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = WriteFfElement(GT, e22, &(precomp->e22), sizeof(precomp->e22));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = WriteFfElement(GT, e2w, &(precomp->e2w), sizeof(precomp->e2w));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = WriteFfElement(GT, eg12, &(precomp->eg12), sizeof(precomp->eg12));
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return result;
+}
+
+EpidStatus EpidVerifierSetPrivRl(VerifierCtx* ctx, PrivRl const* priv_rl,
+ size_t priv_rl_size) {
+ if (!ctx || !priv_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!IsPrivRlValid(&ctx->pub_key->gid, priv_rl, priv_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of priv rl
+ if (ctx->priv_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->priv_rl->version);
+ incoming_ver = ntohl(priv_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->priv_rl = priv_rl;
+ return kEpidNoErr;
+}
+
+EpidStatus EpidVerifierSetSigRl(VerifierCtx* ctx, SigRl const* sig_rl,
+ size_t sig_rl_size) {
+ if (!ctx || !sig_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!IsSigRlValid(&ctx->pub_key->gid, sig_rl, sig_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of sig rl
+ if (ctx->sig_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->sig_rl->version);
+ incoming_ver = ntohl(sig_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->sig_rl = sig_rl;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidVerifierSetGroupRl(VerifierCtx* ctx, GroupRl const* grp_rl,
+ size_t grp_rl_size) {
+ if (!ctx || !grp_rl || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (!IsGroupRlValid(grp_rl, grp_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // Do not set an older version of group rl
+ if (ctx->group_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->group_rl->version);
+ incoming_ver = ntohl(grp_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ ctx->group_rl = grp_rl;
+
+ return kEpidNoErr;
+}
+
+EpidStatus EpidVerifierSetVerifierRl(VerifierCtx* ctx, VerifierRl const* ver_rl,
+ size_t ver_rl_size) {
+ VerifierRl* verifier_rl = NULL;
+ EpidStatus res = kEpidErr;
+ EcPoint* B = NULL;
+ bool cmp_result = false;
+ EcGroup* G1 = NULL;
+ if (!ctx || !ver_rl || !ctx->pub_key || !ctx->epid2_params ||
+ !ctx->epid2_params->G1) {
+ return kEpidBadArgErr;
+ }
+ if (!IsVerifierRlValid(&ctx->pub_key->gid, ver_rl, ver_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // if random basename
+ if (!ctx->basename_hash) {
+ return kEpidInconsistentBasenameSetErr;
+ }
+ // Do not set an older version of verifier rl
+ if (ctx->verifier_rl) {
+ unsigned int current_ver = 0;
+ unsigned int incoming_ver = 0;
+ current_ver = ntohl(ctx->verifier_rl->version);
+ incoming_ver = ntohl(ver_rl->version);
+ if (current_ver >= incoming_ver) {
+ return kEpidBadArgErr;
+ }
+ }
+ do {
+ G1 = ctx->epid2_params->G1;
+ res = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(res);
+ res = ReadEcPoint(G1, &(ver_rl->B), sizeof(ver_rl->B), B);
+ BREAK_ON_EPID_ERROR(res);
+ // verify B = G1.hash(bsn)
+ res = EcIsEqual(G1, ctx->basename_hash, B, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (true != cmp_result) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ verifier_rl = SAFE_ALLOC(ver_rl_size);
+ if (!verifier_rl) {
+ res = kEpidMemAllocErr;
+ break;
+ }
+ if (0 != memcpy_S(verifier_rl, ver_rl_size, ver_rl, ver_rl_size)) {
+ res = kEpidBadArgErr;
+ break;
+ }
+ res = kEpidNoErr;
+ } while (0);
+ DeleteEcPoint(&B);
+ SAFE_FREE(ctx->verifier_rl);
+ if (kEpidNoErr == res) {
+ ctx->verifier_rl = verifier_rl;
+ ctx->was_verifier_rl_updated = false;
+ }
+ return res;
+}
+
+size_t EpidGetVerifierRlSize(VerifierCtx const* ctx) {
+ size_t empty_size = 0;
+ if (!ctx || !ctx->basename_hash) return 0;
+ empty_size = sizeof(VerifierRl) - sizeof(((VerifierRl*)0)->K[0]);
+ if (!ctx->verifier_rl) return empty_size;
+ return empty_size +
+ ntohl(ctx->verifier_rl->n4) * sizeof(ctx->verifier_rl->K[0]);
+}
+
+EpidStatus EpidWriteVerifierRl(VerifierCtx const* ctx, VerifierRl* ver_rl,
+ size_t ver_rl_size) {
+ EpidStatus res = kEpidErr;
+ size_t real_ver_rl_size = 0;
+ if (!ctx || !ver_rl || !ctx->pub_key || !ctx->epid2_params ||
+ !ctx->epid2_params->G1) {
+ return kEpidBadArgErr;
+ }
+ real_ver_rl_size = EpidGetVerifierRlSize(ctx);
+ if (real_ver_rl_size == 0) {
+ return kEpidErr;
+ }
+ if (real_ver_rl_size != ver_rl_size) {
+ return kEpidBadArgErr;
+ }
+ if (ctx->verifier_rl) {
+ // serialize
+ if (0 !=
+ memcpy_S(ver_rl, ver_rl_size, ctx->verifier_rl, real_ver_rl_size)) {
+ return kEpidBadArgErr;
+ }
+ // update rl version if it has changed
+ if (ctx->was_verifier_rl_updated) {
+ uint32_t prior_rl_version = ntohl(ver_rl->version);
+ *((uint32_t*)(&ver_rl->version)) = htonl(prior_rl_version + 1);
+ ((VerifierCtx*)ctx)->was_verifier_rl_updated = false;
+ }
+ } else {
+ // write empty rl
+ res = WriteEcPoint(ctx->epid2_params->G1, ctx->basename_hash, &(ver_rl->B),
+ sizeof(ver_rl->B));
+ if (kEpidNoErr != res) {
+ return res;
+ }
+ ver_rl->gid = ctx->pub_key->gid;
+ memset(&ver_rl->version, 0, sizeof(ver_rl->version));
+ memset(&ver_rl->n4, 0, sizeof(ver_rl->n4));
+ }
+ return kEpidNoErr;
+}
+
+EpidStatus EpidBlacklistSig(VerifierCtx* ctx, EpidSignature const* sig,
+ size_t sig_len, void const* msg, size_t msg_len) {
+ EpidStatus result = kEpidErr;
+ VerifierRl* ver_rl = NULL;
+ if (!ctx || !sig || (!msg && msg_len > 0) || !ctx->epid2_params ||
+ !ctx->epid2_params->G1) {
+ return kEpidBadArgErr;
+ }
+ if (sig_len < sizeof(EpidSignature) - sizeof(((EpidSignature*)0)->sigma[0])) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->basename_hash) {
+ return kEpidInconsistentBasenameSetErr;
+ }
+
+ do {
+ EcGroup* G1 = ctx->epid2_params->G1;
+ uint32_t n4 = 0;
+ result = EpidVerify(ctx, sig, sig_len, msg, msg_len);
+ BREAK_ON_EPID_ERROR(result);
+
+ if (!ctx->verifier_rl) {
+ ver_rl = SAFE_ALLOC(sizeof(VerifierRl));
+ if (!ver_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ // write empty rl
+ ver_rl->gid = ctx->pub_key->gid;
+ result =
+ WriteEcPoint(G1, ctx->basename_hash, &(ver_rl->B), sizeof(ver_rl->B));
+ BREAK_ON_EPID_ERROR(result);
+ } else {
+ uint32_t prior_rl_version = ntohl(ctx->verifier_rl->version);
+ n4 = ntohl(ctx->verifier_rl->n4);
+
+ if (prior_rl_version == UINT32_MAX || n4 == UINT32_MAX) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ ver_rl = SAFE_REALLOC(
+ ctx->verifier_rl,
+ EpidGetVerifierRlSize(ctx) + sizeof(((VerifierRl*)0)->K[0]));
+ if (!ver_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ }
+
+ ctx->was_verifier_rl_updated = true;
+ ++n4;
+ ver_rl->K[n4 - 1] = sig->sigma0.K;
+
+ *((uint32_t*)(&ver_rl->n4)) = htonl(n4);
+ ctx->verifier_rl = ver_rl;
+ result = kEpidNoErr;
+ } while (0);
+ if (kEpidNoErr != result) SAFE_FREE(ver_rl);
+ return result;
+}
+
+EpidStatus EpidVerifierSetHashAlg(VerifierCtx* ctx, HashAlg hash_alg) {
+ EpidStatus result = kEpidErr;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg &&
+ kSha512_256 != hash_alg)
+ return kEpidBadArgErr;
+
+ if (ctx->hash_alg != hash_alg) {
+ HashAlg previous_hash_alg = ctx->hash_alg;
+ ctx->hash_alg = hash_alg;
+
+ result = EpidVerifierSetBasename(ctx, ctx->basename, ctx->basename_len);
+ if (kEpidNoErr != result) {
+ ctx->hash_alg = previous_hash_alg;
+ return result;
+ }
+ }
+ result = kEpidNoErr;
+ return result;
+}
+
+EpidStatus EpidVerifierSetBasename(VerifierCtx* ctx, void const* basename,
+ size_t basename_len) {
+ EpidStatus result = kEpidErr;
+ EcPoint* basename_hash = NULL;
+ uint8_t* basename_buffer = NULL;
+
+ if (!ctx || !ctx->epid2_params || !ctx->epid2_params->G1) {
+ return kEpidBadArgErr;
+ }
+ if (!basename && basename_len > 0) {
+ return kEpidBadArgErr;
+ }
+
+ if (!basename) {
+ DeleteEcPoint(&ctx->basename_hash);
+ ctx->basename_hash = NULL;
+ ctx->was_verifier_rl_updated = false;
+ SAFE_FREE(ctx->basename);
+ ctx->basename_len = 0;
+ return kEpidNoErr;
+ }
+
+ do {
+ size_t i = 0;
+ EcGroup* G1 = ctx->epid2_params->G1;
+ result = NewEcPoint(G1, &basename_hash);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ result =
+ EcHash(G1, basename, basename_len, ctx->hash_alg, basename_hash, NULL);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ if (basename_len > 0) {
+ basename_buffer = SAFE_ALLOC(basename_len);
+ if (!basename_buffer) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+ }
+
+ SAFE_FREE(ctx->verifier_rl);
+
+ DeleteEcPoint(&ctx->basename_hash);
+ ctx->basename_hash = basename_hash;
+ SAFE_FREE(ctx->basename);
+ ctx->basename = basename_buffer;
+ ctx->basename_len = basename_len;
+ for (i = 0; i < basename_len; i++) {
+ ctx->basename[i] = ((uint8_t*)basename)[i];
+ }
+ result = kEpidNoErr;
+ } while (0);
+
+ if (kEpidNoErr != result) {
+ DeleteEcPoint(&basename_hash);
+ SAFE_FREE(basename_buffer);
+ }
+ return result;
+}
+
+static EpidStatus DoPrecomputation(VerifierCtx* ctx) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL;
+ FfElement* e22 = NULL;
+ FfElement* e2w = NULL;
+ FfElement* eg12 = NULL;
+ Epid2Params_* params = NULL;
+ GroupPubKey_* pub_key = NULL;
+ PairingState* ps_ctx = NULL;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->epid2_params->GT ||
+ !ctx->epid2_params->pairing_state || !ctx->pub_key || !ctx->e12 ||
+ !ctx->e22 || !ctx->e2w || !ctx->eg12) {
+ return kEpidBadArgErr;
+ }
+ pub_key = ctx->pub_key;
+ params = ctx->epid2_params;
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+ eg12 = ctx->eg12;
+ ps_ctx = params->pairing_state;
+ // do precomputation
+ // 1. The verifier computes e12 = pairing(h1, g2).
+ result = Pairing(ps_ctx, pub_key->h1, params->g2, e12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ // 2. The verifier computes e22 = pairing(h2, g2).
+ result = Pairing(ps_ctx, pub_key->h2, params->g2, e22);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ // 3. The verifier computes e2w = pairing(h2, w).
+ result = Pairing(ps_ctx, pub_key->h2, pub_key->w, e2w);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ // 4. The verifier computes eg12 = pairing(g1, g2).
+ result = Pairing(ps_ctx, params->g1, params->g2, eg12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
+static EpidStatus ReadPrecomputation(VerifierPrecomp const* precomp_str,
+ VerifierCtx* ctx) {
+ EpidStatus result = kEpidErr;
+ FfElement* e12 = NULL;
+ FfElement* e22 = NULL;
+ FfElement* e2w = NULL;
+ FfElement* eg12 = NULL;
+ FiniteField* GT = NULL;
+ Epid2Params_* params = NULL;
+ if (!ctx) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->epid2_params->GT || !ctx->e12 || !ctx->e22 ||
+ !ctx->e2w || !ctx->eg12 || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (0 !=
+ memcmp(&precomp_str->gid, &ctx->pub_key->gid, sizeof(precomp_str->gid))) {
+ return kEpidBadArgErr;
+ }
+ params = ctx->epid2_params;
+ GT = params->GT;
+ e12 = ctx->e12;
+ e22 = ctx->e22;
+ e2w = ctx->e2w;
+ eg12 = ctx->eg12;
+
+ result = ReadFfElement(GT, &precomp_str->e12, sizeof(precomp_str->e12), e12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = ReadFfElement(GT, &precomp_str->e22, sizeof(precomp_str->e22), e22);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result = ReadFfElement(GT, &precomp_str->e2w, sizeof(precomp_str->e2w), e2w);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ result =
+ ReadFfElement(GT, &precomp_str->eg12, sizeof(precomp_str->eg12), eg12);
+ if (kEpidNoErr != result) {
+ return result;
+ }
+ return kEpidNoErr;
+}
diff --git a/epid/verifier/src/context.h b/epid/verifier/src/context.h
new file mode 100644
index 0000000..783e451
--- /dev/null
+++ b/epid/verifier/src/context.h
@@ -0,0 +1,47 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EPID_VERIFIER_SRC_CONTEXT_H_
+#define EPID_VERIFIER_SRC_CONTEXT_H_
+/*!
+ * \file
+ * \brief Verifier context interface.
+ */
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/commitment.h"
+#include "epid/common/src/epid2params.h"
+#include "epid/common/src/grouppubkey.h"
+
+/// Verifier context definition
+struct VerifierCtx {
+ GroupPubKey_* pub_key; ///< group public key
+ FfElement* e12; ///< an element in GT
+ FfElement* e22; ///< an element in GT
+ FfElement* e2w; ///< an element in GT
+ FfElement* eg12; ///< an element in GT
+ PrivRl const* priv_rl; ///< Private key based revocation list - not owned
+ SigRl const* sig_rl; ///< Signature based revocation list - not owned
+ GroupRl const* group_rl; ///< Group revocation list - not owned
+ VerifierRl* verifier_rl; ///< Verifier revocation list
+ bool was_verifier_rl_updated; ///< Indicates if blacklist was updated
+ Epid2Params_* epid2_params; ///< Intel(R) EPID 2.0 params
+ CommitValues commit_values; ///< Values that are hashed to create commitment
+ HashAlg hash_alg; ///< Hash algorithm to use
+ EcPoint* basename_hash; ///< EcHash of the basename (NULL = random base)
+ uint8_t* basename; ///< Basename to use
+ size_t basename_len; ///< Number of bytes in basename
+};
+#endif // EPID_VERIFIER_SRC_CONTEXT_H_
diff --git a/epid/verifier/src/nrverify.c b/epid/verifier/src/nrverify.c
new file mode 100644
index 0000000..d02d4a6
--- /dev/null
+++ b/epid/verifier/src/nrverify.c
@@ -0,0 +1,244 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief NrVerfy implementation.
+ */
+
+#include "epid/common/src/memory.h"
+#include "epid/verifier/api.h"
+#include "epid/verifier/src/context.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+#pragma pack(1)
+/// Storage for values to create commitment in NrVerify algorithm
+typedef struct NrVerifyCommitValues {
+ BigNumStr p; //!< A large prime (256-bit)
+ G1ElemStr g1; //!< Generator of G1 (512-bit)
+ G1ElemStr b; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr k; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr bp; //!< (element of G1): one entry in SigRL
+ G1ElemStr kp; //!< (element of G1): one entry in SigRL
+ G1ElemStr t; //!< element of G1
+ G1ElemStr r1; //!< element of G1
+ G1ElemStr r2; //!< element of G1
+ uint8_t msg[1]; //!< message
+} NrVerifyCommitValues;
+#pragma pack()
+
+EpidStatus EpidNrVerify(VerifierCtx const* ctx, BasicSignature const* sig,
+ void const* msg, size_t msg_len,
+ SigRlEntry const* sigrl_entry, NrProof const* proof) {
+ size_t const cv_header_len = sizeof(NrVerifyCommitValues) - sizeof(uint8_t);
+ EpidStatus sts = kEpidErr;
+ NrVerifyCommitValues* commit_values = NULL;
+ size_t const commit_len = sizeof(*commit_values) + msg_len - 1;
+ EcPoint* t_pt = NULL;
+ EcPoint* k_pt = NULL;
+ EcPoint* b_pt = NULL;
+ EcPoint* kp_pt = NULL;
+ EcPoint* bp_pt = NULL;
+ EcPoint* r1_pt = NULL;
+ EcPoint* r2_pt = NULL;
+ FfElement* c_el = NULL;
+ FfElement* nc_el = NULL;
+ FfElement* smu_el = NULL;
+ FfElement* snu_el = NULL;
+ FfElement* commit_hash = NULL;
+ if (!ctx || !sig || !proof || !sigrl_entry) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ return kEpidBadArgErr;
+ }
+ if (msg_len > (SIZE_MAX - cv_header_len)) {
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->epid2_params->G1 || !ctx->epid2_params->Fp) {
+ return kEpidBadArgErr;
+ }
+ do {
+ EcGroup* G1 = ctx->epid2_params->G1;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ G1ElemStr const* b = &sig->B;
+ G1ElemStr const* k = &sig->K;
+ G1ElemStr const* bp = &sigrl_entry->b;
+ G1ElemStr const* kp = &sigrl_entry->k;
+ EcPoint const* r1p[2];
+ FpElemStr const* r1b[2];
+ EcPoint const* r2p[3];
+ FpElemStr const* r2b[3];
+ FpElemStr nc_str;
+ bool t_is_identity;
+ bool c_is_equal;
+
+ commit_values = SAFE_ALLOC(commit_len);
+ if (commit_values == NULL) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ // allocate local memory
+ sts = NewEcPoint(G1, &t_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &k_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &b_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &kp_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &bp_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &r1_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewEcPoint(G1, &r2_pt);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &c_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &nc_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &smu_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &snu_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = NewFfElement(Fp, &commit_hash);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 1. The verifier verifies that G1.inGroup(T) = true.
+ sts = ReadEcPoint(G1, &proof->T, sizeof(proof->T), t_pt);
+ if (kEpidNoErr != sts) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+
+ // 2. The verifier verifies that G1.isIdentity(T) = false.
+ sts = EcIsIdentity(G1, t_pt, &t_is_identity);
+ BREAK_ON_EPID_ERROR(sts);
+ if (t_is_identity) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+
+ // 3. The verifier verifies that c, smu, snu in [0, p-1].
+ sts = ReadFfElement(Fp, &proof->c, sizeof(proof->c), c_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &proof->smu, sizeof(proof->smu), smu_el);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = ReadFfElement(Fp, &proof->snu, sizeof(proof->snu), snu_el);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 4. The verifier computes nc = (- c) mod p.
+ sts = FfNeg(Fp, c_el, nc_el);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, nc_el, &nc_str, sizeof(nc_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 5. The verifier computes R1 = G1.multiExp(K, smu, B, snu).
+ sts = ReadEcPoint(G1, k, sizeof(*k), k_pt);
+ if (kEpidNoErr != sts) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts = ReadEcPoint(G1, b, sizeof(*b), b_pt);
+ if (kEpidNoErr != sts) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ r1p[0] = k_pt;
+ r1p[1] = b_pt;
+ r1b[0] = &proof->smu;
+ r1b[1] = &proof->snu;
+ sts = EcMultiExp(G1, r1p, (const BigNumStr**)r1b, 2, r1_pt);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 6. The verifier computes R2 = G1.multiExp(K', smu, B', snu, T, nc).
+ sts = ReadEcPoint(G1, kp, sizeof(*kp), kp_pt);
+ if (kEpidNoErr != sts) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts = ReadEcPoint(G1, bp, sizeof(*bp), bp_pt);
+ if (kEpidNoErr != sts) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ r2p[0] = kp_pt;
+ r2p[1] = bp_pt;
+ r2p[2] = t_pt;
+ r2b[0] = &proof->smu;
+ r2b[1] = &proof->snu;
+ r2b[2] = &nc_str;
+ sts = EcMultiExp(G1, r2p, (const BigNumStr**)r2b, 3, r2_pt);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 7. The verifier verifies c = Fp.hash(p || g1 || B || K ||
+ // B' || K' || T || R1 || R2 || m).
+ // Refer to Section 7.1 for hash operation over a prime field.
+
+ // commit_values is allocated such that there are msg_len bytes available
+ // starting at commit_values->msg
+ if (msg) {
+ // Memory copy is used to copy a message of variable length
+ if (0 != memcpy_S(&commit_values->msg[0], msg_len, msg, msg_len)) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ }
+ commit_values->p = ctx->commit_values.p;
+ commit_values->g1 = ctx->commit_values.g1;
+ commit_values->b = sig->B;
+ commit_values->k = sig->K;
+ commit_values->bp = sigrl_entry->b;
+ commit_values->kp = sigrl_entry->k;
+ commit_values->t = proof->T;
+ sts =
+ WriteEcPoint(G1, r1_pt, &commit_values->r1, sizeof(commit_values->r1));
+ BREAK_ON_EPID_ERROR(sts);
+ sts =
+ WriteEcPoint(G1, r2_pt, &commit_values->r2, sizeof(commit_values->r2));
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfHash(Fp, commit_values, commit_len, ctx->hash_alg, commit_hash);
+ BREAK_ON_EPID_ERROR(sts);
+ sts = FfIsEqual(Fp, c_el, commit_hash, &c_is_equal);
+ BREAK_ON_EPID_ERROR(sts);
+ if (!c_is_equal) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+ sts = kEpidNoErr;
+ } while (0);
+ SAFE_FREE(commit_values);
+ DeleteFfElement(&commit_hash);
+ DeleteFfElement(&snu_el);
+ DeleteFfElement(&smu_el);
+ DeleteFfElement(&nc_el);
+ DeleteFfElement(&c_el);
+ DeleteEcPoint(&r2_pt);
+ DeleteEcPoint(&r1_pt);
+ DeleteEcPoint(&bp_pt);
+ DeleteEcPoint(&kp_pt);
+ DeleteEcPoint(&b_pt);
+ DeleteEcPoint(&k_pt);
+ DeleteEcPoint(&t_pt);
+ return sts;
+}
diff --git a/epid/verifier/src/sigs_linked.c b/epid/verifier/src/sigs_linked.c
new file mode 100644
index 0000000..733233c
--- /dev/null
+++ b/epid/verifier/src/sigs_linked.c
@@ -0,0 +1,31 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief AreSigsLinked implementation.
+ */
+
+#include <epid/verifier/api.h>
+
+#include <string.h>
+
+// implements section 4.3 "Signature Linking" from Intel(R) EPID 2.0 Spec
+bool EpidAreSigsLinked(BasicSignature const* sig1, BasicSignature const* sig2) {
+ // Step 1. If B1 = B2 and K1 = K2, output true, otherwise output false.
+ return (sig1 && sig2 && 0 == memcmp(&sig1->B, &sig2->B, sizeof(sig2->B)) &&
+ 0 == memcmp(&sig1->K, &sig2->K, sizeof(sig2->K)));
+}
diff --git a/epid/verifier/src/verify.c b/epid/verifier/src/verify.c
new file mode 100644
index 0000000..b0b60ae
--- /dev/null
+++ b/epid/verifier/src/verify.c
@@ -0,0 +1,198 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verify implementation.
+ */
+#include <string.h>
+#include "epid/common/src/endian_convert.h"
+#include "epid/verifier/api.h"
+#include "epid/verifier/src/context.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+static size_t EpidGetSignatureRlCount(EpidSignature const* sig) {
+ if (!sig)
+ return 0;
+ else
+ return ntohl(sig->n2);
+}
+
+static size_t EpidGetGroupRlCount(GroupRl const* rl) {
+ if (!rl)
+ return 0;
+ else
+ return ntohl(rl->n3);
+}
+
+static size_t EpidGetPrivRlCount(PrivRl const* rl) {
+ if (!rl)
+ return 0;
+ else
+ return ntohl(rl->n1);
+}
+
+static size_t EpidGetSigRlCount(SigRl const* rl) {
+ if (!rl)
+ return 0;
+ else
+ return ntohl(rl->n2);
+}
+
+static size_t EpidGetVerifierRlCount(VerifierRl const* rl) {
+ if (!rl)
+ return 0;
+ else
+ return ntohl(rl->n4);
+}
+
+// implements section 4.1.2 "Verify algorithm" from Intel(R) EPID 2.0 Spec
+EpidStatus EpidVerify(VerifierCtx const* ctx, EpidSignature const* sig,
+ size_t sig_len, void const* msg, size_t msg_len) {
+ // Step 1. Setup
+ size_t const sig_header_len = (sizeof(EpidSignature) - sizeof(NrProof));
+ EpidStatus sts = kEpidErr;
+ size_t rl_count = 0;
+ size_t i;
+ if (!ctx || !sig) {
+ return kEpidBadArgErr;
+ }
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->pub_key) {
+ return kEpidBadArgErr;
+ }
+ if (sig_len < sig_header_len) {
+ return kEpidBadArgErr;
+ }
+ rl_count = EpidGetSignatureRlCount(sig);
+ if (rl_count > (SIZE_MAX - sig_header_len) / sizeof(sig->sigma[0]) ||
+ (rl_count * sizeof(sig->sigma[0])) + sig_header_len != sig_len) {
+ return kEpidBadArgErr;
+ }
+ // Step 2. The verifier verifies the basic signature Sigma0 as follows:
+ sts = EpidVerifyBasicSig(ctx, &sig->sigma0, msg, msg_len);
+ if (sts != kEpidNoErr) {
+ // p. If any of the above verifications fails, the verifier aborts and
+ // outputs 1
+ return kEpidSigInvalid;
+ }
+
+ // Step 3. If GroupRL is provided,
+ if (ctx->group_rl) {
+ // a. The verifier verifies that gid does not match any entry in GroupRL.
+ size_t grouprl_count = EpidGetGroupRlCount(ctx->group_rl);
+ for (i = 0; i < grouprl_count; ++i) {
+ if (0 == memcmp(&ctx->pub_key->gid, &ctx->group_rl->gid[i],
+ sizeof(ctx->pub_key->gid))) {
+ // b. If gid matches an entry in GroupRL, aborts and returns 2.
+ return kEpidSigRevokedInGroupRl;
+ }
+ }
+ }
+
+ // Step 4. If PrivRL is provided,
+ if (ctx->priv_rl) {
+ size_t privrl_count = EpidGetPrivRlCount(ctx->priv_rl);
+ // a. The verifier verifies that gid in the public key and in PrivRL match.
+ // If mismatch, abort and return "operation failed".
+ if (0 != memcmp(&ctx->pub_key->gid, &ctx->priv_rl->gid,
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidBadArgErr;
+ }
+ // b. For i = 0, ..., n1-1, the verifier computes t4 =G1.exp(B, f[i]) and
+ // verifies that G1.isEqual(t4, K) = false. A faster private-key revocation
+ // check algorithm is provided in Section 4.5.
+ for (i = 0; i < privrl_count; ++i) {
+ sts = EpidCheckPrivRlEntry(ctx, &sig->sigma0, &ctx->priv_rl->f[i]);
+ if (sts != kEpidNoErr) {
+ // c. If the above step fails, the verifier aborts and output 3.
+ return kEpidSigRevokedInPrivRl;
+ }
+ }
+ }
+
+ // Step 5. If SigRL is provided,
+ if (ctx->sig_rl) {
+ size_t sigrl_count = EpidGetSigRlCount(ctx->sig_rl);
+ // a. The verifier verifies that gid in the public key and in SigRL match.
+ // If mismatch, abort and return "operation failed".
+ if (0 != memcmp(&ctx->pub_key->gid, &ctx->sig_rl->gid,
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidBadArgErr;
+ }
+
+ // b. The verifier verifies that RLver in Sigma and in SigRL match. If
+ // mismatch, abort and output "operation failed".
+ if (0 != memcmp(&ctx->sig_rl->version, &sig->rl_ver,
+ sizeof(ctx->sig_rl->version))) {
+ return kEpidErr;
+ }
+
+ // c. The verifier verifies that n2 in Sigma and in SigRL match. If
+ // mismatch, abort and output "operation failed".
+ if (sigrl_count != rl_count) {
+ return kEpidBadArgErr;
+ }
+
+ // d. For i = 0, ..., n2-1, the verifier verifies nrVerify(B, K, B[i],
+ // K[i], Sigma[i]) = true. The details of nrVerify() will be given in the
+ // next subsection.
+ for (i = 0; i < sigrl_count; ++i) {
+ sts = EpidNrVerify(ctx, &sig->sigma0, msg, msg_len, &ctx->sig_rl->bk[i],
+ &sig->sigma[i]);
+ if (sts != kEpidNoErr) {
+ // e. If the above step fails, the verifier aborts and output 4.
+ return kEpidSigRevokedInSigRl;
+ }
+ }
+ }
+
+ // Step 6. If VerifierRL is provided,
+ if (ctx->verifier_rl) {
+ // a. The verifier verifies that gid in the public key and in VerifierRL
+ // match. If mismatch, abort and return "operation failed".
+ if (0 != memcmp(&ctx->pub_key->gid, &ctx->verifier_rl->gid,
+ sizeof(ctx->pub_key->gid))) {
+ return kEpidBadArgErr;
+ }
+
+ // b. The verifier verifies that B in the signature and in VerifierRL
+ // match. If mismatch, go to step 7.
+ if (0 ==
+ memcmp(&ctx->verifier_rl->B, &sig->sigma0.B, sizeof(sig->sigma0.B))) {
+ size_t verifierrl_count = EpidGetVerifierRlCount(ctx->verifier_rl);
+ // c. For i = 0, ..., n4-1, the verifier verifies that K != K[i].
+ for (i = 0; i < verifierrl_count; ++i) {
+ if (0 == memcmp(&ctx->verifier_rl->K[i], &sig->sigma0.K,
+ sizeof(sig->sigma0.K))) {
+ // d. If the above step fails, the verifier aborts and output 5.
+ return kEpidSigRevokedInVerifierRl;
+ }
+ }
+ }
+ }
+
+ // Step 7. If all the above verifications succeed, the verifier outputs 0.
+ return kEpidSigValid;
+}
diff --git a/epid/verifier/src/verifybasic.c b/epid/verifier/src/verifybasic.c
new file mode 100644
index 0000000..119f7ee
--- /dev/null
+++ b/epid/verifier/src/verifybasic.c
@@ -0,0 +1,316 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief VerifyBasicSig implementation.
+ */
+
+#include "epid/common/src/memory.h"
+#include "epid/verifier/api.h"
+#include "epid/verifier/src/context.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+/// Count of elements in array
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+EpidStatus EpidVerifyBasicSig(VerifierCtx const* ctx, BasicSignature const* sig,
+ void const* msg, size_t msg_len) {
+ EpidStatus res = kEpidNotImpl;
+
+ EcPoint* B = NULL;
+ EcPoint* K = NULL;
+ EcPoint* T = NULL;
+ EcPoint* R1 = NULL;
+ EcPoint* t4 = NULL;
+
+ EcPoint* t1 = NULL;
+
+ FfElement* R2 = NULL;
+ FfElement* t2 = NULL;
+
+ FfElement* c = NULL;
+ FfElement* sx = NULL;
+ FfElement* sf = NULL;
+ FfElement* sa = NULL;
+ FfElement* sb = NULL;
+ FfElement* nc = NULL;
+ FfElement* nsx = NULL;
+ FfElement* c_hash = NULL;
+
+ if (!ctx || !sig) return kEpidBadArgErr;
+ if (!msg && (0 != msg_len)) {
+ // if message is non-empty it must have both length and content
+ return kEpidBadArgErr;
+ }
+ if (!ctx->epid2_params || !ctx->pub_key) return kEpidBadArgErr;
+
+ do {
+ bool cmp_result = false;
+ BigNumStr c_str = {0};
+ BigNumStr sf_str = {0};
+ BigNumStr nc_str = {0};
+ BigNumStr nsx_str = {0};
+ BigNumStr sb_str = {0};
+ BigNumStr sa_str = {0};
+ // handy shorthands:
+ EcGroup* G1 = ctx->epid2_params->G1;
+ EcGroup* G2 = ctx->epid2_params->G2;
+ FiniteField* GT = ctx->epid2_params->GT;
+ FiniteField* Fp = ctx->epid2_params->Fp;
+ EcPoint* g1 = ctx->epid2_params->g1;
+ EcPoint* g2 = ctx->epid2_params->g2;
+ EcPoint* w = ctx->pub_key->w;
+ CommitValues commit_values = ctx->commit_values;
+ EcPoint* basename_hash = ctx->basename_hash;
+
+ if (!G1 || !G2 || !GT || !Fp || !g1 || !g2 || !w) {
+ res = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(res);
+ }
+
+ // The following variables B, K, T, R1, t4 (elements of G1), t1
+ // (element of G2), R2, t2 (elements of GT), c, sx, sf, sa, sb,
+ // nc, nsx, t3 (256-bit integers) are used.
+ res = NewEcPoint(G1, &B);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &K);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &T);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &R1);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewEcPoint(G1, &t4);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewEcPoint(G2, &t1);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewFfElement(GT, &R2);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(GT, &t2);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &sx);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &sf);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &sa);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &sb);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &nc);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &nsx);
+ BREAK_ON_EPID_ERROR(res);
+ res = NewFfElement(Fp, &c_hash);
+ BREAK_ON_EPID_ERROR(res);
+
+ // 1. The verifier expect pre-computation is done (e12, e22, e2w,
+ // eg12). Refer to Section 3.6 for the computation of these
+ // values.
+
+ // 2. The verifier verifies the basic signature sigma0 as follows:
+ // a. The verifier verifies G1.inGroup(B) = true.
+ res = ReadEcPoint(G1, &(sig->B), sizeof(sig->B), B);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ // b. The verifier verifies that G1.isIdentity(B) is false.
+ res = EcIsIdentity(G1, B, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result != false) {
+ res = kEpidSigInvalid;
+ break;
+ }
+ // c. If bsn is provided, the verifier verifies B =
+ // G1.hash(bsn).
+ if (basename_hash) {
+ res = EcIsEqual(G1, basename_hash, B, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result != true) {
+ res = kEpidSigInvalid;
+ break;
+ }
+ }
+ // d. The verifier verifies G1.inGroup(K) = true.
+ res = ReadEcPoint(G1, &(sig->K), sizeof(sig->K), K);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ // e. The verifier verifies G1.inGroup(T) = true.
+ res = ReadEcPoint(G1, &(sig->T), sizeof(sig->T), T);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ // f. The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ res = ReadFfElement(Fp, &(sig->c), sizeof(sig->c), c);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ res = WriteFfElement(Fp, c, &c_str, sizeof(c_str));
+ BREAK_ON_EPID_ERROR(res);
+ res = ReadFfElement(Fp, &(sig->sx), sizeof(sig->sx), sx);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ res = ReadFfElement(Fp, &(sig->sf), sizeof(sig->sf), sf);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ res = ReadFfElement(Fp, &(sig->sa), sizeof(sig->sa), sa);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ res = ReadFfElement(Fp, &(sig->sb), sizeof(sig->sb), sb);
+ if (kEpidNoErr != res) {
+ if (kEpidBadArgErr == res) {
+ res = kEpidSigInvalid;
+ }
+ break;
+ }
+ // g. The verifier computes nc = (-c) mod p.
+ res = FfNeg(Fp, c, nc);
+ BREAK_ON_EPID_ERROR(res);
+ // h. The verifier computes nsx = (-sx) mod p.
+ res = FfNeg(Fp, sx, nsx);
+ BREAK_ON_EPID_ERROR(res);
+ // i. The verifier computes R1 = G1.multiExp(B, sf, K, nc).
+ res = WriteFfElement(Fp, sf, &sf_str, sizeof(sf_str));
+ BREAK_ON_EPID_ERROR(res);
+ res = WriteFfElement(Fp, nc, &nc_str, sizeof(nc_str));
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[2];
+ BigNumStr const* exponents[2];
+ points[0] = B;
+ points[1] = K;
+ exponents[0] = &sf_str;
+ exponents[1] = &nc_str;
+ res = EcMultiExp(G1, points, exponents, COUNT_OF(points), R1);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // j. The verifier computes t1 = G2.multiExp(g2, nsx, w, nc).
+ res = WriteFfElement(Fp, nsx, &nsx_str, sizeof(nsx_str));
+ BREAK_ON_EPID_ERROR(res);
+ {
+ EcPoint const* points[2];
+ BigNumStr const* exponents[2];
+ points[0] = g2;
+ points[1] = w;
+ exponents[0] = &nsx_str;
+ exponents[1] = &nc_str;
+ res = EcMultiExp(G2, points, exponents, COUNT_OF(points), t1);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // k. The verifier computes R2 = pairing(T, t1).
+ res = Pairing(ctx->epid2_params->pairing_state, T, t1, R2);
+ BREAK_ON_EPID_ERROR(res);
+ // l. The verifier compute t2 = GT.multiExp(e12, sf, e22, sb,
+ // e2w, sa, eg12, c).
+ res = WriteFfElement(Fp, sb, &sb_str, sizeof(sb_str));
+ BREAK_ON_EPID_ERROR(res);
+ res = WriteFfElement(Fp, sa, &sa_str, sizeof(sa_str));
+ BREAK_ON_EPID_ERROR(res);
+ {
+ FfElement const* points[4];
+ BigNumStr const* exponents[4];
+ points[0] = ctx->e12;
+ points[1] = ctx->e22;
+ points[2] = ctx->e2w;
+ points[3] = ctx->eg12;
+ exponents[0] = &sf_str;
+ exponents[1] = &sb_str;
+ exponents[2] = &sa_str;
+ exponents[3] = &c_str;
+ res = FfMultiExp(GT, points, exponents, COUNT_OF(points), t2);
+ BREAK_ON_EPID_ERROR(res);
+ }
+ // m. The verifier compute R2 = GT.mul(R2, t2).
+ res = FfMul(GT, R2, t2, R2);
+ BREAK_ON_EPID_ERROR(res);
+ // n. The verifier compute t3 = Fp.hash(p || g1 || g2 || h1 ||
+ // h2 || w || B || K || T || R1 || R2).
+ // o. The verifier verifies c = Fp.hash(t3 || m).
+ res = SetCalculatedCommitValues(&sig->B, &sig->K, &sig->T, R1, G1, R2, GT,
+ &commit_values);
+ BREAK_ON_EPID_ERROR(res);
+ res = CalculateCommitmentHash(&commit_values, Fp, ctx->hash_alg, msg,
+ msg_len, c_hash);
+ BREAK_ON_EPID_ERROR(res);
+
+ res = FfIsEqual(Fp, c, c_hash, &cmp_result);
+ BREAK_ON_EPID_ERROR(res);
+ if (cmp_result != true) {
+ // p. If any of the above verifications fails, the verifier
+ // aborts and outputs 1.
+ res = kEpidSigInvalid;
+ break;
+ }
+
+ res = kEpidNoErr;
+ } while (0);
+
+ DeleteEcPoint(&B);
+ DeleteEcPoint(&K);
+ DeleteEcPoint(&T);
+ DeleteEcPoint(&R1);
+ DeleteEcPoint(&t4);
+
+ DeleteEcPoint(&t1);
+
+ DeleteFfElement(&R2);
+ DeleteFfElement(&t2);
+
+ DeleteFfElement(&c);
+ DeleteFfElement(&sx);
+ DeleteFfElement(&sf);
+ DeleteFfElement(&sa);
+ DeleteFfElement(&sb);
+ DeleteFfElement(&nc);
+ DeleteFfElement(&nsx);
+ DeleteFfElement(&c_hash);
+
+ return (res);
+}
diff --git a/epid/verifier/unittests/check_privrl_entry-test.cc b/epid/verifier/unittests/check_privrl_entry-test.cc
new file mode 100644
index 0000000..4efc40e
--- /dev/null
+++ b/epid/verifier/unittests/check_privrl_entry-test.cc
@@ -0,0 +1,117 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief CheckPrivRlEntry unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(EpidVerifierTest, CheckPrivRlEntryFailsGivenNullPtr) {
+ // check ctx, sig, f for NULL
+ auto& pub_key = this->kGrpXKey;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((PrivRl const*)priv_rl.data())->f[0];
+ BasicSignature basic_signature = ((EpidSignature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCheckPrivRlEntry(nullptr, &basic_signature, &fp_str));
+ EXPECT_EQ(kEpidBadArgErr, EpidCheckPrivRlEntry(verifier, nullptr, &fp_str));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidCheckPrivRlEntry(verifier, &basic_signature, nullptr));
+}
+
+TEST_F(EpidVerifierTest, CheckPrivRlEntryFailsGivenRevokedPrivKey) {
+ // test a revoked priv key
+ // check ctx, sig, f for NULL
+ auto& pub_key = this->kGrpXKey;
+ auto& priv_rl = this->kGrpXPrivRl;
+ // signed using revoked key
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((PrivRl const*)priv_rl.data())->f[0];
+ BasicSignature basic_signature = ((EpidSignature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidCheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+
+TEST_F(EpidVerifierTest,
+ CheckPrivRlEntryFailsGivenRevokedPrivKeyUsingIkgfData) {
+ // test a revoked priv key
+ // check ctx, sig, f for NULL
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& priv_rl = this->kPrivRlIkgf;
+ // signed using revoked key
+ auto& sig = this->kSigRevokedPrivKeySha256Bsn0Msg0Ikgf;
+
+ VerifierCtxObj verifier(pub_key);
+
+ FpElemStr fp_str = ((PrivRl const*)priv_rl.data())->f[2];
+ BasicSignature basic_signature = ((EpidSignature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidCheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+
+TEST_F(EpidVerifierTest, CheckPrivRlEntrySucceedsGivenUnRevokedPrivKey) {
+ // test a non revoked priv key
+ auto& pub_key = this->kGrpXKey;
+ auto& priv_rl = this->kGrpXPrivRl;
+ // signed using un revoked key
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((PrivRl const*)priv_rl.data())->f[0];
+ BasicSignature basic_signature = ((EpidSignature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidCheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+
+TEST_F(EpidVerifierTest,
+ CheckPrivRlEntrySucceedsGivenUnRevokedPrivKeyUsingIkgfData) {
+ // test a non revoked priv key
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& priv_rl = this->kPrivRlIkgf;
+ // signed using un revoked key
+ auto& sig = this->kSigMember0Sha256Bsn0Msg0Ikgf;
+
+ VerifierCtxObj verifier(pub_key);
+ FpElemStr fp_str = ((PrivRl const*)priv_rl.data())->f[0];
+ BasicSignature basic_signature = ((EpidSignature const*)sig.data())->sigma0;
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidCheckPrivRlEntry(verifier, &basic_signature, &fp_str));
+}
+
+} // namespace
diff --git a/epid/verifier/unittests/context-test.cc b/epid/verifier/unittests/context-test.cc
new file mode 100644
index 0000000..1054bd5
--- /dev/null
+++ b/epid/verifier/unittests/context-test.cc
@@ -0,0 +1,1111 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief VerifierCreate unit tests.
+ */
+
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/src/endian_convert.h"
+#include "epid/verifier/api.h"
+#include "epid/verifier/src/context.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+bool operator==(VerifierPrecomp const& lhs, VerifierPrecomp const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+
+bool operator==(OctStr32 const& lhs, OctStr32 const& rhs) {
+ return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
+}
+namespace {
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierCreate Tests
+TEST_F(EpidVerifierTest, CreateFailsGivenNullPointer) {
+ VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(&this->kPubKeyStr, &this->kVerifierPrecompStr,
+ nullptr));
+ EpidVerifierDelete(&ctx);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(nullptr, &this->kVerifierPrecompStr, &ctx));
+ EpidVerifierDelete(&ctx);
+}
+TEST_F(EpidVerifierTest, CreateSucceedsGivenNullPrecomp) {
+ VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidNoErr, EpidVerifierCreate(&this->kPubKeyStr, nullptr, &ctx));
+ EpidVerifierDelete(&ctx);
+}
+TEST_F(EpidVerifierTest, CreateSucceedsGivenNullPrecompUsingIkgfData) {
+ VerifierCtx* ctx = nullptr;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierCreate(&this->kPubKeyIkgfStr, nullptr, &ctx));
+ EpidVerifierDelete(&ctx);
+}
+TEST_F(EpidVerifierTest, CreateFailsGivenInvalidPubkey) {
+ VerifierCtx* ctx = nullptr;
+ GroupPubKey pubkey_with_bad_h1 = this->kPubKeyStr;
+ pubkey_with_bad_h1.h1.x.data.data[31]++; // munge h1 so not in G1
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(&pubkey_with_bad_h1, nullptr, &ctx));
+ EpidVerifierDelete(&ctx);
+ GroupPubKey pubkey_with_bad_h2 = this->kPubKeyStr;
+ pubkey_with_bad_h2.h2.x.data.data[31]++; // munge h2 so not in G1
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(&pubkey_with_bad_h2, nullptr, &ctx));
+ EpidVerifierDelete(&ctx);
+ GroupPubKey pubkey_with_bad_w = this->kPubKeyStr;
+ pubkey_with_bad_w.w.x[0].data.data[31]++; // munge w so not in G2
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(&pubkey_with_bad_w, nullptr, &ctx));
+ EpidVerifierDelete(&ctx);
+}
+TEST_F(EpidVerifierTest, CreateFailsGivenBadGroupIdInPrecomp) {
+ VerifierCtx* ctx = nullptr;
+ // tweak GID
+ auto verifier_precomp = this->kVerifierPrecompStr;
+ verifier_precomp.gid.data[0] = ~verifier_precomp.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierCreate(&this->kPubKeyStr, &verifier_precomp, &ctx));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierDelete Tests
+TEST_F(EpidVerifierTest, DeleteNullsVerifierCtx) {
+ VerifierCtx* ctx = nullptr;
+ EpidVerifierCreate(&this->kPubKeyStr, nullptr, &ctx);
+ EpidVerifierDelete(&ctx);
+ EXPECT_EQ(nullptr, ctx);
+}
+TEST_F(EpidVerifierTest, DeleteWorksGivenNullVerifierCtx) {
+ EpidVerifierDelete(nullptr);
+ VerifierCtx* ctx = nullptr;
+ EpidVerifierDelete(&ctx);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierWritePrecomp
+TEST_F(EpidVerifierTest, WritePrecompFailsGivenNullPointer) {
+ VerifierPrecomp precomp;
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierWritePrecomp(nullptr, &precomp));
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierWritePrecomp(ctx, nullptr));
+}
+TEST_F(EpidVerifierTest, WritePrecompSucceedGivenValidArgument) {
+ VerifierPrecomp precomp;
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidNoErr, EpidVerifierWritePrecomp(ctx, &precomp));
+ VerifierPrecomp expected_precomp = this->kVerifierPrecompStr;
+ EXPECT_EQ(expected_precomp, precomp);
+
+ VerifierCtxObj verifier2(this->kPubKeyStr);
+ VerifierCtx* ctx2 = verifier2;
+ EXPECT_EQ(kEpidNoErr, EpidVerifierWritePrecomp(ctx2, &precomp));
+ EXPECT_EQ(expected_precomp, precomp);
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetPrivRl
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetPrivRl(nullptr, &prl, sizeof(prl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, nullptr, sizeof(prl)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenZeroSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetPrivRl(verifier, &prl, 0));
+}
+
+// Size parameter must be at least big enough for n1 == 0 case
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenTooSmallSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, &prl, (sizeof(prl) - sizeof(prl.f)) - 1));
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, &prl, (sizeof(prl) - sizeof(prl.f)) - 1));
+}
+
+// Size parameter must be cross-checked with n1 value in priv_rl
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenN1TooBigForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenN1TooSmallForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlPassesGivenDefaultPrivRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlPassesGivenDefaultPrivRlUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr, this->kVerifierPrecompIkgfStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyIkgfStr.gid;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlPassesGivenEmptyPrivRlUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr, this->kVerifierPrecompIkgfStr);
+
+ uint8_t priv_rl_data_n1_zero_ikgf[] = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc"
+ };
+ PrivRl* priv_rl = reinterpret_cast<PrivRl*>(priv_rl_data_n1_zero_ikgf);
+ size_t priv_rl_size = sizeof(priv_rl_data_n1_zero_ikgf);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetPrivRl(verifier, priv_rl, priv_rl_size));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlPassesGivenPrivRlWithSingleElement) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenBadGroupId) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.gid.data[0] = ~prl.gid.data[0];
+ prl.n1 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl)));
+}
+
+TEST_F(EpidVerifierTest,
+ SetPrivRlFailsGivenEmptyPrivRlFromDifferentGroupUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyRevGroupIkgfStr);
+ auto& priv_rl = this->kEmptyPrivRlIkgf;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, (PrivRl const*)priv_rl.data(),
+ priv_rl.size()));
+}
+
+TEST_F(EpidVerifierTest, SetPrivRlFailsGivenOldVersion) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ PrivRl prl = {{0}, {0}, {0}, {0}};
+ prl.gid = this->kPubKeyStr.gid;
+ prl.version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ prl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetPrivRl(verifier, &prl, sizeof(prl) - sizeof(prl.f)));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetSigRl
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetSigRl(nullptr, &srl, sizeof(SigRl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, nullptr, sizeof(SigRl)));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenZeroSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetSigRl(verifier, &srl, 0));
+}
+
+// Size parameter must be at least big enough for n2 == 0 case
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenTooSmallSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, &srl, (sizeof(srl) - sizeof(srl.bk)) - 1));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenN2TooBigForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ srl.n2 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenN2TooSmallForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetSigRl(verifier, &srl, sizeof(srl)));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlWorksGivenDefaultSigRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ size_t sig_rl_size = this->kGrp01SigRl.size();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetSigRl(ctx, sig_rl, sig_rl_size));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlWorksGivenDefaultSigRlUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr, this->kVerifierPrecompIkgfStr);
+ VerifierCtx* ctx = verifier;
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kSigRlIkgf.data());
+ size_t sig_rl_size = this->kSigRlIkgf.size();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetSigRl(ctx, sig_rl, sig_rl_size));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlWorksGivenSigRlWithNoElements) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+
+ uint8_t sig_rl_data_n2_zero[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x00,
+ // not bk's
+ };
+ SigRl* sig_rl = reinterpret_cast<SigRl*>(sig_rl_data_n2_zero);
+ size_t sig_rl_size = sizeof(sig_rl_data_n2_zero);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetSigRl(verifier, sig_rl, sig_rl_size));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlWorksGivenSigRlWithNoElementsUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr, this->kVerifierPrecompIkgfStr);
+ auto& sig_rl = this->kEmptySigRlIkgf;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlWorksGivenSigRlWithOneElement) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+
+ uint8_t sig_rl_data_n2_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x0, 0x00, 0x00, 0x01,
+ // one bk
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b};
+ SigRl* sig_rl = reinterpret_cast<SigRl*>(sig_rl_data_n2_one);
+ size_t sig_rl_size = sizeof(sig_rl_data_n2_one);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetSigRl(verifier, sig_rl, sig_rl_size));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenBadGroupId) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ srl.gid.data[0] = ~srl.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+
+TEST_F(EpidVerifierTest,
+ SetPrivRlFailsGivenEmptySigRlFromDifferentGroupUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyRevGroupIkgfStr);
+ auto& sig_rl = this->kEmptySigRlIkgf;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+}
+
+TEST_F(EpidVerifierTest, SetSigRlFailsGivenOldVersion) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ SigRl srl = {{{0}}, {{0}}, {{0}}, {{{{0}, {0}}, {{0}, {0}}}}};
+ srl.gid = this->kPubKeyStr.gid;
+ srl.version = this->kOctStr32_1;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetSigRl(verifier, &srl, sizeof(srl) - sizeof(srl.bk)));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ srl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetSigRl(verifier, &srl, sizeof(srl) - sizeof(srl.bk)));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetGroupRl
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl grl = {{0}, {0}, {0}};
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetGroupRl(nullptr, &grl, sizeof(grl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, nullptr, sizeof(grl)));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenSizeZero) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl grl = {{0}, {0}, {0}};
+ size_t grl_size = 0;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetGroupRl(verifier, &grl, grl_size));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenSizeTooSmall) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl grl = {{0}, {0}, {0}};
+ size_t grl_size = sizeof(grl) - sizeof(grl.gid[0]);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, &grl, grl_size - 1));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenSizeTooLarge) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl grl = {{0}, {0}, {0}};
+ size_t grl_size = sizeof(grl) - sizeof(grl.gid[0]);
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, &grl, grl_size + 1));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenN3ZeroAndGroupRLSizeTooBig) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* group_rl = (GroupRl*)this->kGroupRl3GidN0Buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidN0Buf.size()));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenN3TooSmall) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* group_rl = (GroupRl*)this->kGroupRl3GidN2Buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidN2Buf.size()));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenN3TooLarge) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* group_rl = (GroupRl*)this->kGroupRl3GidN4Buf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidN4Buf.size()));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlSucceedsGivenEmptyRL) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* empty_grl = (GroupRl*)this->kGroupRlEmptyBuf.data();
+ size_t grl_size = this->kGroupRlEmptyBuf.size();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetGroupRl(verifier, empty_grl, grl_size));
+}
+TEST_F(EpidVerifierTest, SetGroupRlSucceedsGivenDefaultGroupRLUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr, this->kVerifierPrecompIkgfStr);
+ GroupRl* empty_grl = (GroupRl*)this->kGroupRlEmptyBuf.data();
+ size_t grl_size = this->kGroupRlEmptyBuf.size();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetGroupRl(verifier, empty_grl, grl_size));
+}
+TEST_F(EpidVerifierTest, SetGroupRlSucceedsGivenRLWith3gid) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* group_rl = (GroupRl*)this->kGroupRl3GidBuf.data();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidBuf.size()));
+}
+
+TEST_F(EpidVerifierTest, SetGroupRlFailsGivenOldVersion) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ GroupRl* group_rl = (GroupRl*)this->kGroupRl3GidBuf.data();
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetGroupRl(verifier, group_rl,
+ this->kGroupRl3GidBuf.size()));
+ GroupRl* empty_grl = (GroupRl*)this->kGroupRlEmptyBuf.data();
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetGroupRl(verifier, empty_grl,
+ this->kGroupRlEmptyBuf.size()));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetVerifierRl
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(nullptr, &ver_rl, sizeof(ver_rl)));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(verifier, nullptr, sizeof(ver_rl)));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenMismatchedBasename) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ std::vector<uint8_t> wrong_bsn = this->kBasename1;
+ wrong_bsn[wrong_bsn.size() - 1] ^= 1;
+
+ VerifierCtx* ctx(verifier);
+ size_t res_ver_rl_size = this->kGrp01VerRl.size();
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(ctx, wrong_bsn.data(), wrong_bsn.size()));
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl const*)this->kGrp01VerRl.data(), res_ver_rl_size));
+}
+TEST_F(EpidVerifierTest, SerVerifierRlFailsGivenRandomBase) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ VerifierCtx* ctx(verifier);
+ size_t res_ver_rl_size = this->kGrp01VerRl.size();
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, nullptr, 0));
+ EXPECT_EQ(
+ kEpidInconsistentBasenameSetErr,
+ EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl const*)this->kGrp01VerRl.data(), res_ver_rl_size));
+}
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenSizeZero) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetVerifierRl(verifier, &ver_rl, 0));
+}
+
+// Size parameter must be at least equal to minimum value for n4 == 0 case
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenSizeTooSmall) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(
+ verifier, &ver_rl, sizeof(ver_rl) - sizeof(ver_rl.K[0]) - 1));
+ ver_rl.n4 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(
+ verifier, &ver_rl, sizeof(ver_rl) - sizeof(ver_rl.K[0]) - 1));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenN4TooBigForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ ver_rl.n4 = this->kOctStr32_1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(verifier, &ver_rl,
+ sizeof(ver_rl) - sizeof(ver_rl.K[0])));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenN4TooSmallForSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(verifier, &ver_rl, sizeof(ver_rl)));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlWorksGivenDefaultVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl const* ver_rl_ptr =
+ reinterpret_cast<VerifierRl const*>(this->kGrp01VerRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetVerifierRl(verifier, ver_rl_ptr,
+ this->kGrp01VerRl.size()));
+}
+TEST_F(EpidVerifierTest, SetVerifierRlCopiesGivenValidVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx(verifier);
+ VerifierRl* ver_rl_ptr = (VerifierRl*)(this->kGrp01VerRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetVerifierRl(
+ ctx, ver_rl_ptr, this->kGrp01VerRl.size() * sizeof(uint8_t)));
+ EXPECT_NE(ver_rl_ptr, ctx->verifier_rl);
+}
+TEST_F(EpidVerifierTest, SetVerifierRlWorksGivenVerifierRlWithNoElements) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl* ver_rl_ptr = (VerifierRl*)(this->kEmptyGrp01VerRl.data());
+
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetVerifierRl(verifier, ver_rl_ptr,
+ this->kEmptyGrp01VerRl.size()));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlWorksGivenVerifierRlWithOneElement) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ uint8_t ver_rl_data_n4_one[] = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // B
+ 0x41, 0x63, 0xfd, 0x06, 0xb8, 0xb1, 0xa6, 0x32, 0xa5, 0xe3, 0xeb, 0xc4,
+ 0x40, 0x11, 0x37, 0xc0, 0x62, 0x0d, 0xe1, 0xca, 0xe9, 0x79, 0xad, 0xff,
+ 0x1d, 0x13, 0xb3, 0xda, 0xa0, 0x10, 0x8a, 0xa8, 0x30, 0x72, 0xa4, 0xe8,
+ 0x27, 0xb5, 0xad, 0xdb, 0xac, 0x89, 0xd8, 0x37, 0x79, 0xd9, 0x8c, 0xd0,
+ 0xb3, 0xef, 0x94, 0x17, 0x4f, 0x05, 0x53, 0x4c, 0x4d, 0xf0, 0x77, 0xf7,
+ 0xb6, 0xaf, 0xb8, 0xfa,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n4
+ 0x00, 0x00, 0x00, 0x01,
+ // k's
+ 0xdc, 0x41, 0x24, 0xe7, 0xb8, 0xf2, 0x6d, 0xc4, 0x01, 0xf9, 0x5d, 0xf8,
+ 0xd9, 0x23, 0x32, 0x29, 0x0a, 0xe1, 0xf6, 0xdc, 0xa1, 0xef, 0x52, 0xf7,
+ 0x3a, 0x3c, 0xe6, 0x7e, 0x3d, 0x0e, 0xe8, 0x86, 0xa9, 0x58, 0xf4, 0xfe,
+ 0xfa, 0x8b, 0xe4, 0x1c, 0xad, 0x58, 0x5b, 0x1c, 0xc7, 0x54, 0xee, 0x7e,
+ 0xe7, 0x12, 0x6a, 0x4b, 0x01, 0x63, 0xb4, 0xdb, 0x6e, 0xe7, 0x7a, 0xe9,
+ 0x62, 0xa5, 0xb4, 0xe3,
+ };
+ VerifierRl* ver_rl_ptr = reinterpret_cast<VerifierRl*>(ver_rl_data_n4_one);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetVerifierRl(verifier, ver_rl_ptr,
+ sizeof(ver_rl_data_n4_one)));
+}
+
+TEST_F(EpidVerifierTest, CanSetVerifierRlTwice) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBsn0.data(),
+ this->kBsn0.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetVerifierRl(
+ verifier, reinterpret_cast<VerifierRl const*>(
+ this->kGrpXBsn0VerRlSingleEntry.data()),
+ this->kGrpXBsn0VerRlSingleEntry.size()));
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetVerifierRl(
+ verifier, reinterpret_cast<VerifierRl const*>(
+ this->kGrpXBsn0Sha256VerRl.data()),
+ this->kGrpXBsn0Sha256VerRl.size()));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenBadGroupId) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ ver_rl.gid = this->kPubKeyStr.gid;
+ VerifierRl* valid_ver_rl = (VerifierRl*)(this->kEmptyGrp01VerRl.data());
+ ver_rl.B = valid_ver_rl->B;
+ ver_rl.gid.data[0] = ~ver_rl.gid.data[0];
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(verifier, &ver_rl,
+ sizeof(ver_rl) - sizeof(ver_rl.K[0])));
+}
+
+TEST_F(EpidVerifierTest, SetVerifierRlFailsGivenOldVersion) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierRl ver_rl = {{0}, {{0}, {0}}, {0}, {0}, {{{0}, {0}}}};
+ VerifierRl* valid_ver_rl = (VerifierRl*)(this->kEmptyGrp01VerRl.data());
+ ver_rl.B = valid_ver_rl->B;
+ ver_rl.gid = this->kPubKeyStr.gid;
+ ver_rl.version = this->kOctStr32_1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetVerifierRl(verifier, &ver_rl,
+ sizeof(ver_rl) - sizeof(ver_rl.K[0])));
+ OctStr32 octstr32_0 = {0x00, 0x00, 0x00, 0x00};
+ ver_rl.version = octstr32_0;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetVerifierRl(verifier, &ver_rl,
+ sizeof(ver_rl) - sizeof(ver_rl.K[0])));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidGetVerifierRlSize
+TEST_F(EpidVerifierTest, GetVerifierRlSizeReturnsZeroGivenNoContext) {
+ EXPECT_EQ((size_t)0, EpidGetVerifierRlSize(nullptr));
+}
+TEST_F(EpidVerifierTest, GetVerifierRlSizeReturnsZeroGivenRandomBase) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ((size_t)0, EpidGetVerifierRlSize(verifier));
+}
+TEST_F(EpidVerifierTest, GetVerifierRlSizeReturnsSizeOfEmptyOnNoVerRlSet) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ EXPECT_EQ(sizeof(VerifierRl) - sizeof(((VerifierRl*)0)->K[0]),
+ EpidGetVerifierRlSize(verifier));
+}
+TEST_F(EpidVerifierTest, GetVerifierRlSizeWorksForEmptyVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+
+ VerifierRl* ver_rl_ptr = (VerifierRl*)(this->kEmptyGrp01VerRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(verifier, ver_rl_ptr,
+ this->kEmptyGrp01VerRl.size()));
+ EXPECT_EQ(this->kEmptyGrp01VerRl.size(), EpidGetVerifierRlSize(verifier));
+}
+TEST_F(EpidVerifierTest, GetVerifierRlSizeWorksForShortVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl*)this->kGrp01VerRlOneEntry.data(),
+ this->kGrp01VerRlOneEntry.size()));
+ EXPECT_EQ(this->kGrp01VerRlOneEntry.size(), EpidGetVerifierRlSize(verifier));
+}
+TEST_F(EpidVerifierTest, GetVerifierRlSizeWorksForLongVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ std::vector<uint8_t> ver_rl_data_long = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // B
+ 0x41, 0x63, 0xfd, 0x06, 0xb8, 0xb1, 0xa6, 0x32, 0xa5, 0xe3, 0xeb, 0xc4,
+ 0x40, 0x11, 0x37, 0xc0, 0x62, 0x0d, 0xe1, 0xca, 0xe9, 0x79, 0xad, 0xff,
+ 0x1d, 0x13, 0xb3, 0xda, 0xa0, 0x10, 0x8a, 0xa8, 0x30, 0x72, 0xa4, 0xe8,
+ 0x27, 0xb5, 0xad, 0xdb, 0xac, 0x89, 0xd8, 0x37, 0x79, 0xd9, 0x8c, 0xd0,
+ 0xb3, 0xef, 0x94, 0x17, 0x4f, 0x05, 0x53, 0x4c, 0x4d, 0xf0, 0x77, 0xf7,
+ 0xb6, 0xaf, 0xb8, 0xfa,
+ // version
+ 0x00, 0x00, 0x00, 0x32,
+ // n4
+ 0x00, 0x00, 0x00, 0x32};
+ const std::vector<uint8_t> entry = {
+ 0xdc, 0x41, 0x24, 0xe7, 0xb8, 0xf2, 0x6d, 0xc4, 0x01, 0xf9, 0x5d,
+ 0xf8, 0xd9, 0x23, 0x32, 0x29, 0x0a, 0xe1, 0xf6, 0xdc, 0xa1, 0xef,
+ 0x52, 0xf7, 0x3a, 0x3c, 0xe6, 0x7e, 0x3d, 0x0e, 0xe8, 0x86, 0xa9,
+ 0x58, 0xf4, 0xfe, 0xfa, 0x8b, 0xe4, 0x1c, 0xad, 0x58, 0x5b, 0x1c,
+ 0xc7, 0x54, 0xee, 0x7e, 0xe7, 0x12, 0x6a, 0x4b, 0x01, 0x63, 0xb4,
+ 0xdb, 0x6e, 0xe7, 0x7a, 0xe9, 0x62, 0xa5, 0xb4, 0xe3};
+ for (uint32_t i = 0; i < ntohl(((VerifierRl*)ver_rl_data_long.data())->n4);
+ ++i) {
+ for (auto it : entry) {
+ ver_rl_data_long.push_back(it);
+ }
+ }
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl*)ver_rl_data_long.data(), ver_rl_data_long.size()));
+ EXPECT_EQ(ver_rl_data_long.size(), EpidGetVerifierRlSize(verifier));
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidWriteVerifierRl
+TEST_F(EpidVerifierTest, WriteVerifierRlFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ VerifierCtx* ctx(verifier);
+ VerifierRl res_ver_rl = {0};
+ size_t res_ver_rl_size = this->kGrp01VerRl.size();
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl const*)this->kGrp01VerRl.data(), res_ver_rl_size));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidWriteVerifierRl(nullptr, &res_ver_rl, res_ver_rl_size));
+ EXPECT_EQ(kEpidBadArgErr, EpidWriteVerifierRl(ctx, nullptr, res_ver_rl_size));
+}
+TEST_F(EpidVerifierTest, WriteVerifierRlFailsGivenInvalidSize) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ VerifierCtx* ctx(verifier);
+ VerifierRl res_ver_rl = {0};
+ size_t res_ver_rl_size = this->kGrp01VerRl.size();
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl const*)this->kGrp01VerRl.data(), res_ver_rl_size));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidWriteVerifierRl(ctx, &res_ver_rl, res_ver_rl_size - 1));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidWriteVerifierRl(ctx, &res_ver_rl, res_ver_rl_size + 1));
+}
+TEST_F(EpidVerifierTest, WriteVerifierRlWorksForEmptyVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ VerifierCtx* ctx(verifier);
+
+ size_t res_ver_rl_size = sizeof(VerifierRl) - sizeof(((VerifierRl*)0)->K[0]);
+ std::vector<uint8_t> expected_ver_rl_buf = this->kEmptyGrp01VerRl;
+ std::vector<uint8_t> res_ver_rl_buf(res_ver_rl_size);
+ VerifierRl* res_ver_rl = (VerifierRl*)res_ver_rl_buf.data();
+
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl*)this->kEmptyGrp01VerRl.data(), res_ver_rl_size));
+ EXPECT_EQ(kEpidNoErr, EpidWriteVerifierRl(ctx, res_ver_rl, res_ver_rl_size));
+ EXPECT_EQ(expected_ver_rl_buf, res_ver_rl_buf);
+}
+TEST_F(EpidVerifierTest, WriteVerifierRlCanSerializeDefaultVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename1.data(),
+ this->kBasename1.size()));
+ VerifierCtx* ctx(verifier);
+ size_t res_ver_rl_size = sizeof(VerifierRl) - sizeof(((VerifierRl*)0)->K[0]);
+
+ std::vector<uint8_t> empty_verifier_rl_buf(res_ver_rl_size);
+ std::vector<uint8_t> res_ver_rl_buf(res_ver_rl_size);
+ VerifierRl* empty_verifier_rl = (VerifierRl*)empty_verifier_rl_buf.data();
+ VerifierRl* res_ver_rl = (VerifierRl*)res_ver_rl_buf.data();
+
+ empty_verifier_rl->gid = ctx->pub_key->gid;
+ empty_verifier_rl->B =
+ ((EpidSignature const*)this->kSigGrp01Member0Sha256Basename1Test1NoSigRl
+ .data())
+ ->sigma0.B;
+ empty_verifier_rl->n4 = {0};
+ empty_verifier_rl->version = {0};
+ EXPECT_EQ(kEpidNoErr, EpidWriteVerifierRl(ctx, res_ver_rl, res_ver_rl_size));
+ EXPECT_EQ(empty_verifier_rl_buf, res_ver_rl_buf);
+}
+TEST_F(EpidVerifierTest, WriteVerifierRlWorksForNonEmptyVerifierRl) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, this->kBasename.data(),
+ this->kBasename.size()));
+ VerifierCtx* ctx(verifier);
+ auto expected_ver_rl = this->kGrp01VerRl;
+ std::vector<uint8_t> resultant_ver_rl_buf(this->kGrp01VerRl.size());
+ VerifierRl* resultant_ver_rl = (VerifierRl*)resultant_ver_rl_buf.data();
+
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ ctx, (VerifierRl const*)this->kGrp01VerRl.data(),
+ this->kGrp01VerRl.size()));
+ EXPECT_EQ(kEpidNoErr, EpidWriteVerifierRl(ctx, resultant_ver_rl,
+ resultant_ver_rl_buf.size()));
+ EXPECT_EQ(expected_ver_rl, resultant_ver_rl_buf);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// EpidBlacklistSig
+TEST_F(EpidVerifierTest, BlacklistSigFailsGivenNullPointer) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(nullptr, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr, EpidBlacklistSig(verifier, nullptr, sig.size(),
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ nullptr, 1));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsGivenInvalidSignatureLength) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), 0,
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(),
+ sig.size() - 1, msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(),
+ sig.size() + 1, msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsGivenSigFromDiffGroup) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrp01Member0Sha256Basename1Test1NoSigRl;
+ auto msg = this->kTest1;
+ auto bsn = this->kBasename1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsGivenSigFromDiffBasename) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBasename1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsGivenSigWithDiffHashAlg) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsOnSigAlreadyInVerRl) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXVerRevokedMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto ver_rl = this->kGrpXBsn0VerRlSingleEntry;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl*)ver_rl.data(), ver_rl.size()));
+ EXPECT_EQ(kEpidSigRevokedInVerifierRl,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsOnSigRevokedInSigRl) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0SingleEntrySigRl;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto sig_rl = this->kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetSigRl(verifier, (SigRl*)sig_rl.data(), sig_rl.size()));
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigFailsOnSigRevokedInPrivRl) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto priv_rl = this->kGrpXPrivRl;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetPrivRl(verifier, (PrivRl*)priv_rl.data(), priv_rl.size()));
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidBlacklistSig(verifier, (EpidSignature*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+TEST_F(EpidVerifierTest, BlacklistSigWorksForValidSigGivenEmptyBlacklist) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidBlacklistSig(verifier, (EpidSignature*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+
+ std::vector<uint8_t> ver_rl_vec(EpidGetVerifierRlSize(verifier));
+ VerifierRl* ver_rl = (VerifierRl*)ver_rl_vec.data();
+ size_t ver_rl_size = ver_rl_vec.size();
+
+ THROW_ON_EPIDERR(EpidWriteVerifierRl(verifier, ver_rl, ver_rl_size));
+
+ OctStr32 n4_expected = {0x00, 0x00, 0x00, 0x01};
+ OctStr32 rlver_expected = {0x00, 0x00, 0x00, 0x01};
+ EXPECT_EQ(n4_expected, ver_rl->n4);
+ EXPECT_EQ(rlver_expected, ver_rl->version);
+ // missing K checks here
+}
+TEST_F(EpidVerifierTest,
+ MultipleBlacklistFollowedBySerializeIncrementsRlVersionByOne) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ auto sig2 = this->kSigGrpXMember1Sha256Bsn0Msg0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidBlacklistSig(verifier, (EpidSignature*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+ EXPECT_EQ(kEpidNoErr, EpidBlacklistSig(verifier, (EpidSignature*)sig2.data(),
+ sig2.size(), msg.data(), msg.size()));
+ std::vector<uint8_t> ver_rl_vec(EpidGetVerifierRlSize(verifier));
+ VerifierRl* ver_rl = (VerifierRl*)ver_rl_vec.data();
+ size_t ver_rl_size = ver_rl_vec.size();
+
+ THROW_ON_EPIDERR(EpidWriteVerifierRl(verifier, ver_rl, ver_rl_size));
+
+ OctStr32 n4_expected = {0x00, 0x00, 0x00, 0x02};
+ OctStr32 rlver_expected = {0x00, 0x00, 0x00, 0x01};
+ EXPECT_EQ(n4_expected, ver_rl->n4);
+ EXPECT_EQ(rlver_expected, ver_rl->version);
+ // missing K checks
+}
+TEST_F(EpidVerifierTest, BlacklistSigWorksForMsgContainingAllPossibleBytes) {
+ VerifierCtxObj verifier(this->kPubKeySigRlVerify);
+ auto sig = this->kSigGrp01Member0Sha512kBsn0Data_0_255;
+ auto msg = this->kData_0_255;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidNoErr, EpidBlacklistSig(verifier, (EpidSignature*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+
+ std::vector<uint8_t> ver_rl_vec(EpidGetVerifierRlSize(verifier));
+ VerifierRl* ver_rl = (VerifierRl*)ver_rl_vec.data();
+ size_t ver_rl_size = ver_rl_vec.size();
+
+ THROW_ON_EPIDERR(EpidWriteVerifierRl(verifier, ver_rl, ver_rl_size));
+
+ OctStr32 n4_expected = {0x00, 0x00, 0x00, 0x01};
+ OctStr32 rlver_expected = {0x00, 0x00, 0x00, 0x01};
+ EXPECT_EQ(n4_expected, ver_rl->n4);
+ EXPECT_EQ(rlver_expected, ver_rl->version);
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetHashAlg
+TEST_F(EpidVerifierTest, SetHashAlgFailsGivenNullPointer) {
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetHashAlg(nullptr, kSha256));
+}
+TEST_F(EpidVerifierTest, CanSetHashAlgoToSHA256) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetHashAlg(verifier, kSha256));
+}
+TEST_F(EpidVerifierTest, CanSetHashAlgoToSHA384) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetHashAlg(verifier, kSha384));
+}
+TEST_F(EpidVerifierTest, CanSetHashAlgoToSHA512) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetHashAlg(verifier, kSha512));
+}
+TEST_F(EpidVerifierTest, CanSetHashAlgoToSHA512256) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetHashAlg(verifier, kSha512_256));
+}
+TEST_F(EpidVerifierTest, SetHashAlgCanFailForNonSupportedAlgoritms) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetHashAlg(verifier, kSha3_256));
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetHashAlg(verifier, kSha3_384));
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetHashAlg(verifier, kSha3_512));
+ EXPECT_EQ(kEpidBadArgErr, EpidVerifierSetHashAlg(verifier, (HashAlg)-1));
+}
+TEST_F(EpidVerifierTest, DefaultHashAlgIsSha512) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kSha512, ctx->hash_alg);
+}
+//////////////////////////////////////////////////////////////////////////
+// EpidVerifierSetBasename
+TEST_F(EpidVerifierTest, DefaultBasenameIsNull) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ EXPECT_EQ(nullptr, ctx->basename_hash);
+}
+TEST_F(EpidVerifierTest, SetBasenameFailsGivenNullContext) {
+ auto& basename = this->kBasename1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetBasename(nullptr, basename.data(), basename.size()));
+}
+TEST_F(EpidVerifierTest, SetBasenameFailsGivenNullBasenameAndNonzeroLength) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ auto& basename = this->kBasename1;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifierSetBasename(ctx, nullptr, basename.size()));
+}
+TEST_F(EpidVerifierTest, SetBasenameSucceedsGivenValidParameters) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ auto& basename = this->kBasename1;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetBasename(ctx, basename.data(), basename.size()));
+}
+TEST_F(EpidVerifierTest, SetBasenameAcceptsZeroLengthBasename) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ EXPECT_EQ(kEpidNoErr, EpidVerifierSetBasename(ctx, "", 0));
+}
+TEST_F(EpidVerifierTest, SetBasenameResetsBasenameGivenNullBasename) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ auto& basename = this->kBasename1;
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(ctx, basename.data(), basename.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, nullptr, 0));
+ EXPECT_EQ(nullptr, ctx->basename_hash);
+}
+TEST_F(EpidVerifierTest, SetBasenameResetsVerifierBlacklist) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, this->kBasename.data(),
+ this->kBasename.size()));
+ auto& basename = this->kBasename;
+ VerifierRl const* ver_rl_ptr =
+ reinterpret_cast<VerifierRl const*>(this->kGrp01VerRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(verifier, ver_rl_ptr,
+ this->kGrp01VerRl.size()));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(ctx, basename.data(), basename.size()));
+ EXPECT_EQ(nullptr, ctx->verifier_rl);
+}
+
+TEST_F(EpidVerifierTest, SetBasenameAcceptsBsnContainingAllPossibleBytes) {
+ VerifierCtxObj verifier(this->kPubKeyStr, this->kVerifierPrecompStr);
+ VerifierCtx* ctx = verifier;
+ auto& basename = this->kData_0_255;
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifierSetBasename(ctx, basename.data(), basename.size()));
+}
+} // namespace
diff --git a/epid/verifier/unittests/main-test.cc b/epid/verifier/unittests/main-test.cc
new file mode 100644
index 0000000..a8bb2fa
--- /dev/null
+++ b/epid/verifier/unittests/main-test.cc
@@ -0,0 +1,27 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/*!
+ * \file
+ * \brief Main entry point for unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/epid/verifier/unittests/nrverify-test.cc b/epid/verifier/unittests/nrverify-test.cc
new file mode 100644
index 0000000..2b0f553
--- /dev/null
+++ b/epid/verifier/unittests/nrverify-test.cc
@@ -0,0 +1,292 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief NrVerify unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+namespace {
+
+/////////////////////////////////////////////////////////////////////////
+// Simple Errors
+
+TEST_F(EpidVerifierTest, NrVerifyFailsGivenNullParameters) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(nullptr, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+
+ EXPECT_EQ(kEpidBadArgErr, EpidNrVerify(verifier, nullptr, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, nullptr,
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), nullptr, &epid_signature->sigma[0]));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], nullptr));
+}
+
+/////////////////////////////////////////////////////////////////////
+// Reject
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithTNotInG1) {
+ // * 4.2.2 step 1 - The verifier verifies that G1.inGroup(T) = true.
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.T.x.data.data[0]++;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithTIdentityOfG1) {
+ // * 4.2.2 step 2 - The verifier verifies that G1.isIdentity(T) = false.
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.T = this->kG1IdentityStr;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithCNotInRange) {
+ // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.c.data = this->kParamsStr.p.data;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithSmuNotInRange) {
+ // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.smu.data = this->kParamsStr.p.data;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithSnuNotInRange) {
+ // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ NrProof nr_proof = epid_signature->sigma[0];
+ nr_proof.snu.data = this->kParamsStr.p.data;
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
+}
+
+// 4.2.2 step 4 - The verifier computes nc = (- c) mod p.
+// This Step is not testable
+
+// 4.2.2 step 5 - The verifier computes R1 = G1.multiExp(K, smu, B, snu).
+// This Step is not testable
+
+// 4.2.2 step 6 - The verifier computes R2 = G1.multiExp(K', smu, B', snu,
+// T, nc).
+// This Step is not testable
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithInvalidCommitment) {
+ // * 4.2.2 step 7 - The verifier verifies c = Fp.hash(p || g1 || B || K ||
+ // B' || K' || T || R1 || R2 || m).
+ // Refer to Section 7.1 for hash operation over a
+ // prime field.
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ std::vector<uint8_t> test_msg = this->kTest0;
+ test_msg[0]++;
+ EXPECT_EQ(
+ kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature->sigma0, test_msg.data(),
+ test_msg.size(), &sig_rl->bk[0], &epid_signature->sigma[0]));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithValidCommitmentDiffHashAlg) {
+ // * 4.2.2 step 7 - The verifier verifies c = Fp.hash(p || g1 || B || K ||
+ // B' || K' || T || R1 || R2 || m).
+ // Refer to Section 7.1 for hash operation over a
+ // prime field.
+ // result must be kEpidBadArgErr
+ VerifierCtxObj verifier(this->kGrpXKey);
+ EpidSignature const* epid_signature_sha256 =
+ reinterpret_cast<EpidSignature const*>(
+ this->kSigGrpXMember0Sha256RandbaseMsg0.data());
+ EpidSignature const* epid_signature_sha384 =
+ reinterpret_cast<EpidSignature const*>(
+ this->kSigGrpXMember0Sha384RandbaseMsg0.data());
+ EpidSignature const* epid_signature_sha512 =
+ reinterpret_cast<EpidSignature const*>(
+ this->kSigGrpXMember0Sha512RandbaseMsg0.data());
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature_sha256->sigma0,
+ this->kMsg0.data(), this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature_sha256->sigma[0]));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature_sha384->sigma0,
+ this->kMsg0.data(), this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature_sha384->sigma[0]));
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidNrVerify(verifier, &epid_signature_sha512->sigma0,
+ this->kMsg0.data(), this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature_sha512->sigma[0]));
+}
+
+/////////////////////////////////////////////////////////////////////
+// Accept
+// 4.2.2 step 8 - If all the above verifications succeed, the verifier
+// outputs true. If any of the above verifications fails,
+// the verifier aborts and outputs false
+
+TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha256) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha256RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+
+TEST_F(EpidVerifierTest,
+ NrVerifyAcceptsSigWithRandomBaseNameSha256UsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigMember0Sha256RandombaseMsg0Ikgf.data());
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kSigRlIkgf.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[2],
+ &epid_signature->sigma[2]));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha384) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha384RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha512) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
+ this->kTest0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha512256) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
+ this->kSigGrpXMember0Sha512256RandombaseMsg0.data());
+ SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kGrpXSigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
+ this->kMsg0.size(), &sig_rl->bk[0],
+ &epid_signature->sigma[0]));
+}
+
+TEST_F(EpidVerifierTest, NrVerifyAcceptsMsgContainingAllPossibleBytes) {
+ VerifierCtxObj verifier(this->kPubKeySigRlVerify);
+ EpidSignature const* epid_signature =
+ (EpidSignature*)kSigGrp01Member0Sha512kBsn0Data_0_255.data();
+ SigRl const* sig_rl =
+ reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ EXPECT_EQ(kEpidSigValid,
+ EpidNrVerify(verifier, &epid_signature->sigma0,
+ this->kData_0_255.data(), this->kData_0_255.size(),
+ &sig_rl->bk[0], &epid_signature->sigma[0]));
+}
+
+} // namespace
diff --git a/epid/verifier/unittests/sigs_linked-test.cc b/epid/verifier/unittests/sigs_linked-test.cc
new file mode 100644
index 0000000..a7c7598
--- /dev/null
+++ b/epid/verifier/unittests/sigs_linked-test.cc
@@ -0,0 +1,69 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief AreSigsLinkable unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(EpidVerifierTest, AreSigsLinkedReturnsFalseGivenNullParameters) {
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ EXPECT_FALSE(EpidAreSigsLinked(nullptr, nullptr));
+ EXPECT_FALSE(EpidAreSigsLinked((BasicSignature const*)sig.data(), nullptr));
+ EXPECT_FALSE(EpidAreSigsLinked(nullptr, (BasicSignature const*)sig.data()));
+}
+
+TEST_F(EpidVerifierTest, SigsBySameMemberWithRandomBaseAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256RandbaseMsg1;
+ EXPECT_FALSE(EpidAreSigsLinked((BasicSignature const*)sig1.data(),
+ (BasicSignature const*)sig2.data()));
+}
+
+TEST_F(EpidVerifierTest, SigsBySameMemberWithSameBasenameAreLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256Bsn0Msg1;
+ EXPECT_TRUE(EpidAreSigsLinked((BasicSignature const*)sig1.data(),
+ (BasicSignature const*)sig2.data()));
+}
+
+TEST_F(EpidVerifierTest, SigsBySameMemberWithDifferentBasenameAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember0Sha256Bsn1Msg0;
+ EXPECT_FALSE(EpidAreSigsLinked((BasicSignature const*)sig1.data(),
+ (BasicSignature const*)sig2.data()));
+}
+
+TEST_F(EpidVerifierTest, SigsByDifferentMembersWithSameBasenameAreNotLinkable) {
+ auto& sig1 = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& sig2 = this->kSigGrpXMember1Sha256Bsn0Msg0;
+ EXPECT_FALSE(EpidAreSigsLinked((BasicSignature const*)sig1.data(),
+ (BasicSignature const*)sig2.data()));
+}
+
+} // namespace
diff --git a/epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc b/epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc
new file mode 100644
index 0000000..1f5b34e
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc
@@ -0,0 +1,39 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+// group_pub_key
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2a, 0xB3, 0x6F, 0xFF, 0x81, 0xE2, 0x1B, 0x17, 0xEB, 0x3D,
+ 0x75, 0x3D, 0x61, 0x7E, 0x27, 0xB0, 0xCB, 0xD0, 0x6D, 0x8F, 0x9D, 0x64,
+ 0xCE, 0xE3, 0xCE, 0x43, 0x4C, 0x62, 0xFD, 0xB5, 0x80, 0xE0, 0x99, 0x3A,
+ 0x07, 0x56, 0x80, 0xE0, 0x88, 0x59, 0xA4, 0xFD, 0xB5, 0xB7, 0x9D, 0xE9,
+ 0x4D, 0xAE, 0x9C, 0xEE, 0x3D, 0x66, 0x42, 0x82, 0x45, 0x7E, 0x7F, 0xD8,
+ 0x69, 0x3E, 0xA1, 0x74, 0xF4, 0x59, 0xEE, 0xD2, 0x74, 0x2E, 0x9F, 0x63,
+ 0xC2, 0x51, 0x8E, 0xD5, 0xDB, 0xCA, 0x1C, 0x54, 0x74, 0x10, 0x7B, 0xDC,
+ 0x99, 0xED, 0x42, 0xD5, 0x5B, 0xA7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xBC,
+ 0xDD, 0x7F, 0xE1, 0x76, 0x5D, 0xC0, 0x6E, 0xE3, 0x14, 0xAC, 0x72, 0x48,
+ 0x12, 0x0A, 0xA6, 0xE8, 0x5B, 0x08, 0x7B, 0xDA, 0x3F, 0x51, 0x7D, 0xDE,
+ 0x4C, 0xEA, 0xCB, 0x93, 0xA5, 0x6E, 0xCC, 0xE7, 0x8E, 0x10, 0x84, 0xBD,
+ 0x19, 0x5A, 0x95, 0xE2, 0x0F, 0xCA, 0x1C, 0x50, 0x71, 0x94, 0x51, 0x40,
+ 0x1B, 0xA5, 0xB6, 0x78, 0x87, 0x53, 0xF6, 0x6A, 0x95, 0xCA, 0xC6, 0x8D,
+ 0xCD, 0x36, 0x88, 0x07, 0x28, 0xE8, 0x96, 0xCA, 0x78, 0x11, 0x5B, 0xB8,
+ 0x6A, 0xE7, 0xE5, 0xA6, 0x65, 0x7A, 0x68, 0x15, 0xD7, 0x75, 0xF8, 0x24,
+ 0x14, 0xCF, 0xD1, 0x0F, 0x6C, 0x56, 0xF5, 0x22, 0xD9, 0xFD, 0xE0, 0xE2,
+ 0xF4, 0xB3, 0xA1, 0x90, 0x21, 0xA7, 0xE0, 0xE8, 0xB3, 0xC7, 0x25, 0xBC,
+ 0x07, 0x72, 0x30, 0x5D, 0xEE, 0xF5, 0x6A, 0x89, 0x88, 0x46, 0xDD, 0x89,
+ 0xC2, 0x39, 0x9C, 0x0A, 0x3B, 0x58, 0x96, 0x57, 0xE4, 0xF3, 0x3C, 0x79,
+ 0x51, 0x69, 0x36, 0x1B, 0xB6, 0xF7, 0x05, 0x5D, 0x0A, 0x88, 0xDB, 0x1F,
+ 0x3D, 0xEA, 0xA2, 0xBA, 0x6B, 0xF0, 0xDA, 0x8E, 0x25, 0xC6, 0xAD, 0x83,
+ 0x7D, 0x3E, 0x31, 0xEE, 0x11, 0x40, 0xA9,
diff --git a/epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc
new file mode 100644
index 0000000..3491a22
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+// Intel(R) EPID signature
+{{{0xFA, 0x09, 0xAF, 0x0D, 0x5C, 0x89, 0x0F, 0x27, 0x03, 0xD2, 0xC1, 0xEB, 0xC8,
+ 0x74, 0xA0, 0x40, 0x32, 0x94, 0xCD, 0x5B, 0xC6, 0xCD, 0xA6, 0x4B, 0xC6, 0xF2,
+ 0x4B, 0xB9, 0xB6, 0xC8, 0x41, 0x49},
+ {0x71, 0xAC, 0x52, 0x30, 0xF0, 0xFE, 0x70, 0xF9, 0x95, 0x50, 0xAA, 0xE0, 0xD5,
+ 0xC9, 0xE2, 0x1A, 0xEA, 0xB9, 0xB2, 0x0D, 0x6C, 0xB4, 0x40, 0x41, 0x06, 0x83,
+ 0x82, 0xE6, 0x69, 0x72, 0xB3, 0x51}},
+ {{0x54, 0x96, 0x07, 0xF0, 0xB8, 0x0D, 0x39, 0x25, 0x4E, 0x11, 0x81, 0xA1, 0xF8,
+ 0xFE, 0x39, 0xF6, 0xAA, 0x70, 0x6C, 0x1D, 0x44, 0x38, 0x08, 0x6F, 0x4E, 0x0F,
+ 0xA3, 0x6B, 0x8D, 0xD2, 0x29, 0x88},
+ {0x23, 0x18, 0x56, 0x3E, 0x6D, 0x67, 0xDF, 0x54, 0x38, 0xCD, 0x42, 0x5B, 0x13,
+ 0x2B, 0x32, 0xC6, 0x77, 0x19, 0x42, 0x0A, 0x04, 0x91, 0xBF, 0xFF, 0x90, 0x60,
+ 0x83, 0xD9, 0x60, 0x4B, 0xBA, 0x93}},
+ {{0x0C, 0xA6, 0x30, 0x03, 0xEF, 0x58, 0x49, 0x0C, 0xD4, 0x62, 0x3E, 0x25, 0xD5,
+ 0x91, 0xFA, 0xCD, 0xB0, 0xC9, 0xE6, 0x94, 0x34, 0xDF, 0xEC, 0x8A, 0x4C, 0x9F,
+ 0xE0, 0xDB, 0x43, 0x01, 0x53, 0xC5},
+ {0x78, 0x82, 0x0A, 0x4B, 0x38, 0xBA, 0x32, 0x39, 0x9A, 0x7C, 0x84, 0xC9, 0x27,
+ 0x74, 0x35, 0x5B, 0x01, 0x5A, 0x6E, 0x32, 0x6B, 0x12, 0xEF, 0x40, 0xC9, 0xB8,
+ 0x31, 0xFD, 0x73, 0x55, 0x2A, 0x15}},
+ {0x70, 0xB9, 0xA5, 0xCA, 0x38, 0x6F, 0x05, 0xB7, 0x0A, 0xD8, 0x89, 0xD8, 0xDA,
+ 0x6B, 0xB3, 0xE8, 0x9E, 0xFB, 0x3B, 0xDC, 0xE5, 0xBB, 0x4D, 0x43, 0x90, 0xB0,
+ 0x4F, 0xC2, 0xDA, 0x90, 0x63, 0x2D},
+ {0xDE, 0x00, 0x1F, 0xFC, 0x9E, 0x3D, 0x21, 0x64, 0x3D, 0x69, 0x60, 0x16, 0x23,
+ 0x6F, 0x84, 0x19, 0xCB, 0x62, 0x98, 0x59, 0xC0, 0xB2, 0xED, 0x66, 0xE8, 0x87,
+ 0xB5, 0xAB, 0x7C, 0xDB, 0x86, 0x45},
+ {0x27, 0x08, 0xE3, 0xA6, 0x5F, 0x94, 0x29, 0xA4, 0x0F, 0x49, 0xF1, 0xF6, 0x84,
+ 0xB6, 0xF0, 0x8F, 0x1C, 0x6E, 0x0A, 0xE4, 0x32, 0x73, 0xCD, 0x91, 0x28, 0x74,
+ 0x7F, 0x71, 0x76, 0x9F, 0x44, 0x52},
+ {0xD6, 0x16, 0xAD, 0x45, 0x86, 0x2B, 0xE8, 0x85, 0xC4, 0x8B, 0x39, 0xB2, 0x5E,
+ 0xCC, 0x86, 0x1E, 0xD2, 0x9E, 0x4D, 0xA0, 0x17, 0x3D, 0xF7, 0xD1, 0x2D, 0xC2,
+ 0x7E, 0x22, 0xFA, 0x8D, 0xC7, 0xF3},
+ {0xC5, 0x75, 0x8E, 0x8F, 0x17, 0xFD, 0x10, 0x24, 0x83, 0xCA, 0x22, 0xEB, 0x85,
+ 0xB6, 0x07, 0xD5, 0x9A, 0xEE, 0xC2, 0xC5, 0x87, 0x5B, 0xF3, 0x58, 0xDE, 0x1E,
+ 0x34, 0xBC, 0xBD, 0x61, 0xEB, 0x01}},
+ {0}, {0}, {
+ {
+ {{0}, {0}}, {0}, {0}, { 0 }
+ }
+}
diff --git a/epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc
new file mode 100644
index 0000000..1aab431
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+// Intel(R) EPID signature
+{{{0x72, 0x78, 0x08, 0xEE, 0x07, 0xE2, 0x27, 0x1F, 0x7B, 0x96, 0x64, 0xED, 0x20,
+ 0x8E, 0x41, 0x4C, 0x3A, 0x03, 0x3D, 0x9E, 0x4C, 0xA2, 0x60, 0x9D, 0xD2, 0x3D,
+ 0x03, 0x0D, 0xF6, 0x2D, 0x9A, 0x65},
+ {0x30, 0xAB, 0x45, 0x2C, 0x1E, 0xA1, 0xE7, 0x3E, 0x2E, 0xFD, 0x13, 0x1B, 0xF0,
+ 0x45, 0x04, 0xBB, 0x1B, 0x18, 0xCA, 0x11, 0x8B, 0xC8, 0xB7, 0x89, 0x27, 0x4E,
+ 0xC4, 0x52, 0xA9, 0x2C, 0x1B, 0x4F}},
+ {{0x86, 0x05, 0x9B, 0x8B, 0x5E, 0x75, 0xA7, 0x24, 0x03, 0x85, 0xCB, 0xAB, 0x84,
+ 0xAD, 0x79, 0xCE, 0x89, 0x0F, 0x8D, 0x96, 0x9F, 0xBE, 0xDE, 0xF3, 0xA8, 0xA2,
+ 0x1C, 0x96, 0x83, 0xB2, 0xC9, 0xC4},
+ {0x2F, 0xB9, 0x68, 0x42, 0x5D, 0x40, 0x2F, 0x99, 0x7A, 0xFB, 0x7B, 0xD4, 0x69,
+ 0x94, 0xA1, 0x27, 0x79, 0xD1, 0x25, 0xD5, 0x68, 0xB4, 0xB1, 0x6A, 0x6D, 0xCC,
+ 0x0E, 0xB4, 0x28, 0xBA, 0x1C, 0x6D}},
+ {{0x08, 0x51, 0xF0, 0xA5, 0x64, 0x13, 0xF3, 0x72, 0xF2, 0xBB, 0xE4, 0x00, 0x35,
+ 0x9D, 0x29, 0x89, 0x99, 0x8F, 0x02, 0x38, 0xD9, 0xD0, 0xCF, 0x66, 0xF1, 0xAD,
+ 0x96, 0x3A, 0xC1, 0xD3, 0x76, 0x58},
+ {0x56, 0xA1, 0x3F, 0x96, 0x44, 0x87, 0xAA, 0x12, 0xB7, 0x10, 0xAB, 0xF1, 0x1D,
+ 0x6B, 0x58, 0x26, 0xDA, 0x7A, 0x7D, 0x24, 0xBC, 0x2B, 0xAA, 0x30, 0x33, 0x7E,
+ 0x33, 0x05, 0x21, 0x77, 0xD6, 0x3A}},
+ {0x3A, 0xEA, 0x90, 0x08, 0x1B, 0x15, 0xDB, 0x87, 0x3A, 0x16, 0xB6, 0x3E, 0xDE,
+ 0x08, 0x66, 0x19, 0x05, 0x9C, 0x0C, 0xB5, 0xE1, 0x05, 0x77, 0x91, 0x4B, 0xFC,
+ 0x17, 0x9F, 0xDB, 0x80, 0xBF, 0x39},
+ {0x3B, 0x19, 0x01, 0x50, 0x5C, 0x7E, 0x3E, 0x36, 0x07, 0xF2, 0x98, 0xE0, 0x0D,
+ 0x7A, 0x22, 0x04, 0x56, 0x1E, 0xAD, 0x30, 0xEB, 0x4D, 0xD1, 0x58, 0xEC, 0xF8,
+ 0xA1, 0x98, 0xE7, 0x26, 0x07, 0x02},
+ {0x82, 0x25, 0x94, 0x87, 0xE3, 0x9F, 0xA9, 0x8E, 0x3C, 0xEC, 0x28, 0x34, 0x9D,
+ 0xDC, 0x84, 0x29, 0xEB, 0x62, 0x12, 0xBB, 0x88, 0x7B, 0xE1, 0x21, 0x6C, 0x77,
+ 0xE3, 0xA2, 0x92, 0x78, 0x29, 0xB0},
+ {0x0D, 0xAF, 0xF4, 0x8A, 0xA8, 0xBF, 0xAE, 0x8A, 0xDE, 0xBC, 0x24, 0x65, 0xD0,
+ 0x3A, 0x67, 0x31, 0xA4, 0xFD, 0xF9, 0xE2, 0xF2, 0x42, 0xD1, 0xDB, 0x1D, 0xEB,
+ 0xC3, 0x15, 0x06, 0x86, 0xD6, 0xE9},
+ {0xE4, 0x24, 0x70, 0x13, 0x7D, 0xD0, 0xF3, 0x75, 0xF8, 0xEE, 0xD9, 0xAB, 0x7A,
+ 0x3C, 0xF0, 0x5D, 0xCB, 0xBA, 0x53, 0x06, 0x91, 0xD3, 0xCA, 0xB7, 0x56, 0x26,
+ 0x2F, 0xD1, 0x94, 0x5F, 0x48, 0x92}},
+ {0}, {0}, {
+ {
+ {{0}, {0}}, {0}, {0}, { 0 }
+ }
+}
diff --git a/epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc
new file mode 100644
index 0000000..956eed2
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+// Intel(R) EPID signature
+{{{0x76, 0xD1, 0xFF, 0xBE, 0xD4, 0xE4, 0x71, 0x78, 0x1A, 0xD4, 0x98, 0xFD, 0x00,
+ 0x2C, 0x71, 0x76, 0x13, 0xB9, 0xF4, 0xF0, 0x22, 0x0A, 0xA1, 0x22, 0xDB, 0x59,
+ 0x6A, 0xEC, 0xBC, 0x25, 0xDC, 0xAB},
+ {0x14, 0x9B, 0x0A, 0x4E, 0x1C, 0x15, 0xD0, 0x6A, 0xD4, 0x3C, 0xDD, 0xE5, 0x26,
+ 0x13, 0x6B, 0xB0, 0xAF, 0xD0, 0x93, 0xFF, 0x3A, 0x6A, 0xDC, 0x39, 0x64, 0x73,
+ 0x77, 0x1F, 0x86, 0xAF, 0x69, 0x80}},
+ {{0x1D, 0x85, 0x34, 0xF2, 0x71, 0x94, 0xDE, 0x90, 0xD5, 0xA8, 0x7B, 0x7D, 0x6F,
+ 0xB5, 0xA8, 0x36, 0xD0, 0x2D, 0x85, 0xDE, 0x6E, 0x4D, 0xB8, 0x41, 0x57, 0x56,
+ 0x33, 0xCA, 0xF3, 0x42, 0xA9, 0x04},
+ {0x87, 0x38, 0x46, 0xC6, 0x8C, 0x29, 0x65, 0x53, 0xFC, 0xD6, 0x2C, 0xE7, 0x9B,
+ 0x29, 0xDD, 0x70, 0x0C, 0xBE, 0x84, 0xE6, 0x7B, 0x97, 0xC0, 0x48, 0x61, 0x01,
+ 0x97, 0x7A, 0xE4, 0x5C, 0xD5, 0xFB}},
+ {{0xDA, 0xDB, 0xDB, 0xED, 0x12, 0x7D, 0x7D, 0x19, 0xF1, 0xF8, 0x6A, 0xE5, 0xE5,
+ 0xCD, 0xD4, 0x79, 0xDD, 0xE7, 0x40, 0xC0, 0xD2, 0xC7, 0x6A, 0xEA, 0x24, 0x88,
+ 0x56, 0x3A, 0xDF, 0xFB, 0x3C, 0x91},
+ {0x5D, 0x24, 0x8F, 0x61, 0xA8, 0xDD, 0x06, 0x92, 0x26, 0x75, 0xA1, 0xC9, 0x66,
+ 0x56, 0x89, 0x01, 0x06, 0x72, 0x0F, 0xA6, 0x2D, 0x5B, 0x66, 0x6E, 0x39, 0x7E,
+ 0x68, 0xF0, 0x5E, 0x63, 0x90, 0x11}},
+ {0x69, 0x35, 0x27, 0xED, 0x5F, 0x25, 0xD5, 0x19, 0x08, 0x2F, 0x40, 0xDD, 0x9F,
+ 0x1F, 0xEA, 0x9E, 0x5E, 0x50, 0xAF, 0x26, 0x99, 0x0F, 0x75, 0x27, 0xAB, 0x70,
+ 0x84, 0x23, 0xE9, 0x52, 0xB8, 0x4B},
+ {0x17, 0x57, 0x3F, 0x46, 0xC0, 0x89, 0xD9, 0x49, 0x99, 0xFC, 0x73, 0x44, 0x59,
+ 0xBC, 0x85, 0x57, 0x0D, 0x0F, 0x1A, 0xAC, 0x8F, 0xF3, 0xA0, 0xEF, 0x32, 0xC0,
+ 0x8E, 0xA8, 0xC1, 0xA7, 0x54, 0x8D},
+ {0x9B, 0xF7, 0x93, 0xB0, 0x4C, 0x8C, 0x99, 0x4F, 0x56, 0x7B, 0xE8, 0xF0, 0x09,
+ 0x83, 0xFC, 0x8A, 0x3E, 0x25, 0x3F, 0xED, 0x5B, 0xE2, 0x7B, 0xE9, 0x8B, 0x6B,
+ 0x58, 0xCC, 0x81, 0x54, 0x87, 0x82},
+ {0xC2, 0xDD, 0xF2, 0xD6, 0x89, 0xFB, 0x5A, 0x33, 0x51, 0xD5, 0x83, 0x12, 0x0C,
+ 0xAF, 0x6D, 0x30, 0xFF, 0x8C, 0xAD, 0x2A, 0x6E, 0x6C, 0xFB, 0x9C, 0x23, 0x53,
+ 0x45, 0x59, 0x56, 0x01, 0x78, 0x9B},
+ {0x2A, 0xB0, 0xCD, 0xDE, 0x0D, 0xB1, 0xB7, 0x25, 0x8D, 0xEF, 0xE6, 0x1D, 0x0E,
+ 0x69, 0xE3, 0x5F, 0xDF, 0xA9, 0xD4, 0x4D, 0xB9, 0x0C, 0x0C, 0xBA, 0xCC, 0x5E,
+ 0xEE, 0x95, 0x49, 0x52, 0x88, 0xEB}},
+ {0}, {0}, {
+ {
+ {{0}, {0}}, {0}, {0}, { 0 }
+ }
+}
diff --git a/epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc b/epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc
new file mode 100644
index 0000000..11ba8c8
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc
@@ -0,0 +1,113 @@
+/*############################################################################
+ # Copyright 2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+// sigRL 5 entry
+
+// gid
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+
+// version
+0x00, 0x00, 0x00, 0x05,
+
+// n2
+0x00, 0x00, 0x00, 0x05,
+
+// bk's
+0xFA, 0x09, 0xAF, 0x0D, 0x5C, 0x89, 0x0F, 0x27,
+0x03, 0xD2, 0xC1, 0xEB, 0xC8, 0x74, 0xA0, 0x40,
+0x32, 0x94, 0xCD, 0x5B, 0xC6, 0xCD, 0xA6, 0x4B,
+0xC6, 0xF2, 0x4B, 0xB9, 0xB6, 0xC8, 0x41, 0x49,
+0x71, 0xAC, 0x52, 0x30, 0xF0, 0xFE, 0x70, 0xF9,
+0x95, 0x50, 0xAA, 0xE0, 0xD5, 0xC9, 0xE2, 0x1A,
+0xEA, 0xB9, 0xB2, 0x0D, 0x6C, 0xB4, 0x40, 0x41,
+0x06, 0x83, 0x82, 0xE6, 0x69, 0x72, 0xB3, 0x51,
+0x54, 0x96, 0x07, 0xF0, 0xB8, 0x0D, 0x39, 0x25,
+0x4E, 0x11, 0x81, 0xA1, 0xF8, 0xFE, 0x39, 0xF6,
+0xAA, 0x70, 0x6C, 0x1D, 0x44, 0x38, 0x08, 0x6F,
+0x4E, 0x0F, 0xA3, 0x6B, 0x8D, 0xD2, 0x29, 0x88,
+0x23, 0x18, 0x56, 0x3E, 0x6D, 0x67, 0xDF, 0x54,
+0x38, 0xCD, 0x42, 0x5B, 0x13, 0x2B, 0x32, 0xC6,
+0x77, 0x19, 0x42, 0x0A, 0x04, 0x91, 0xBF, 0xFF,
+0x90, 0x60, 0x83, 0xD9, 0x60, 0x4B, 0xBA, 0x93,
+
+0x39, 0x97, 0x09, 0x11, 0x30, 0xB0, 0x2A, 0x29,
+0xA7, 0x9B, 0xF1, 0xEF, 0xE9, 0xE5, 0xC7, 0x03,
+0x17, 0xE6, 0x4F, 0x6F, 0x49, 0x4D, 0xEB, 0x0F,
+0xFD, 0x1C, 0x3F, 0xCE, 0xCC, 0xC8, 0x40, 0x6B,
+0x23, 0xD3, 0xEC, 0x78, 0x78, 0x15, 0x4A, 0x34,
+0x0F, 0xD1, 0xD3, 0xFA, 0xD2, 0xB2, 0x5A, 0xC9,
+0xEC, 0xA2, 0x41, 0xE1, 0x46, 0x6D, 0xED, 0xB3,
+0x4A, 0xA6, 0xDF, 0xB6, 0xC2, 0x11, 0x49, 0x0D,
+0xC9, 0x23, 0xD9, 0x1D, 0x7A, 0xC8, 0x45, 0xAA,
+0x02, 0xBA, 0x44, 0xE0, 0xA4, 0xF0, 0xC0, 0x51,
+0xAE, 0x67, 0xB3, 0x88, 0x58, 0xB2, 0x92, 0xEA,
+0x1D, 0x12, 0x6E, 0x49, 0xC3, 0x13, 0xEA, 0x8E,
+0xB7, 0x99, 0x4F, 0x57, 0x7E, 0x06, 0x99, 0xE1,
+0x3B, 0x59, 0x2C, 0xD1, 0x43, 0x5D, 0x9E, 0x68,
+0xF2, 0x8E, 0x0C, 0xAF, 0x3E, 0x68, 0x6B, 0xD5,
+0xD9, 0x3A, 0x30, 0xF4, 0x0B, 0x01, 0x49, 0x9B,
+
+0x76, 0xD1, 0xFF, 0xBE, 0xD4, 0xE4, 0x71, 0x78,
+0x1A, 0xD4, 0x98, 0xFD, 0x00, 0x2C, 0x71, 0x76,
+0x13, 0xB9, 0xF4, 0xF0, 0x22, 0x0A, 0xA1, 0x22,
+0xDB, 0x59, 0x6A, 0xEC, 0xBC, 0x25, 0xDC, 0xAB,
+0x14, 0x9B, 0x0A, 0x4E, 0x1C, 0x15, 0xD0, 0x6A,
+0xD4, 0x3C, 0xDD, 0xE5, 0x26, 0x13, 0x6B, 0xB0,
+0xAF, 0xD0, 0x93, 0xFF, 0x3A, 0x6A, 0xDC, 0x39,
+0x64, 0x73, 0x77, 0x1F, 0x86, 0xAF, 0x69, 0x80,
+0x1D, 0x85, 0x34, 0xF2, 0x71, 0x94, 0xDE, 0x90,
+0xD5, 0xA8, 0x7B, 0x7D, 0x6F, 0xB5, 0xA8, 0x36,
+0xD0, 0x2D, 0x85, 0xDE, 0x6E, 0x4D, 0xB8, 0x41,
+0x57, 0x56, 0x33, 0xCA, 0xF3, 0x42, 0xA9, 0x04,
+0x87, 0x38, 0x46, 0xC6, 0x8C, 0x29, 0x65, 0x53,
+0xFC, 0xD6, 0x2C, 0xE7, 0x9B, 0x29, 0xDD, 0x70,
+0x0C, 0xBE, 0x84, 0xE6, 0x7B, 0x97, 0xC0, 0x48,
+0x61, 0x01, 0x97, 0x7A, 0xE4, 0x5C, 0xD5, 0xFB,
+
+0xFC, 0xF6, 0x00, 0xD1, 0xB9, 0x82, 0xAA, 0x79,
+0x6C, 0x96, 0xE1, 0xB6, 0x15, 0x93, 0x4D, 0xF4,
+0xFB, 0xBF, 0xBC, 0x3E, 0xE3, 0x87, 0xB6, 0xA3,
+0xB5, 0xFD, 0x25, 0x42, 0xBC, 0x58, 0x52, 0x09,
+0x4E, 0x99, 0x15, 0x66, 0x56, 0x44, 0x1C, 0x5D,
+0xDE, 0x8F, 0xE0, 0x40, 0x08, 0x49, 0xDB, 0x4E,
+0xDA, 0x8B, 0x77, 0x44, 0x3F, 0x77, 0xEE, 0x7B,
+0x48, 0x0E, 0xCC, 0x5F, 0x1C, 0x05, 0x74, 0x6B,
+0x2F, 0xD8, 0x1C, 0x01, 0x7E, 0xDF, 0x65, 0x7B,
+0x17, 0x8F, 0xA7, 0xC3, 0x03, 0x04, 0x27, 0xEC,
+0xFA, 0x0A, 0x22, 0x8E, 0x4E, 0xBF, 0x67, 0x9D,
+0x81, 0xA2, 0x6D, 0xF4, 0x21, 0x66, 0xC5, 0x17,
+0x3D, 0x55, 0x29, 0xF3, 0x53, 0x61, 0x26, 0x8D,
+0xB5, 0x32, 0xF4, 0xD0, 0x94, 0x5D, 0xA9, 0x0E,
+0x52, 0x2C, 0x48, 0x7B, 0xA4, 0xFE, 0x4F, 0x98,
+0x5F, 0xF1, 0x4D, 0xD9, 0x69, 0xC4, 0x94, 0x70,
+
+0x72, 0x78, 0x08, 0xEE, 0x07, 0xE2, 0x27, 0x1F,
+0x7B, 0x96, 0x64, 0xED, 0x20, 0x8E, 0x41, 0x4C,
+0x3A, 0x03, 0x3D, 0x9E, 0x4C, 0xA2, 0x60, 0x9D,
+0xD2, 0x3D, 0x03, 0x0D, 0xF6, 0x2D, 0x9A, 0x65,
+0x30, 0xAB, 0x45, 0x2C, 0x1E, 0xA1, 0xE7, 0x3E,
+0x2E, 0xFD, 0x13, 0x1B, 0xF0, 0x45, 0x04, 0xBB,
+0x1B, 0x18, 0xCA, 0x11, 0x8B, 0xC8, 0xB7, 0x89,
+0x27, 0x4E, 0xC4, 0x52, 0xA9, 0x2C, 0x1B, 0x4F,
+0x86, 0x05, 0x9B, 0x8B, 0x5E, 0x75, 0xA7, 0x24,
+0x03, 0x85, 0xCB, 0xAB, 0x84, 0xAD, 0x79, 0xCE,
+0x89, 0x0F, 0x8D, 0x96, 0x9F, 0xBE, 0xDE, 0xF3,
+0xA8, 0xA2, 0x1C, 0x96, 0x83, 0xB2, 0xC9, 0xC4,
+0x2F, 0xB9, 0x68, 0x42, 0x5D, 0x40, 0x2F, 0x99,
+0x7A, 0xFB, 0x7B, 0xD4, 0x69, 0x94, 0xA1, 0x27,
+0x79, 0xD1, 0x25, 0xD5, 0x68, 0xB4, 0xB1, 0x6A,
+0x6D, 0xCC, 0x0E, 0xB4, 0x28, 0xBA, 0x1C, 0x6D,
diff --git a/epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc b/epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc
new file mode 100644
index 0000000..7e41dc8
--- /dev/null
+++ b/epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc
@@ -0,0 +1,29 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+// sigrl 1 entry
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xFA,
+ 0x09, 0xAF, 0x0D, 0x5C, 0x89, 0x0F, 0x27, 0x03, 0xD2, 0xC1, 0xEB, 0xC8,
+ 0x74, 0xA0, 0x40, 0x32, 0x94, 0xCD, 0x5B, 0xC6, 0xCD, 0xA6, 0x4B, 0xC6,
+ 0xF2, 0x4B, 0xB9, 0xB6, 0xC8, 0x41, 0x49, 0x71, 0xAC, 0x52, 0x30, 0xF0,
+ 0xFE, 0x70, 0xF9, 0x95, 0x50, 0xAA, 0xE0, 0xD5, 0xC9, 0xE2, 0x1A, 0xEA,
+ 0xB9, 0xB2, 0x0D, 0x6C, 0xB4, 0x40, 0x41, 0x06, 0x83, 0x82, 0xE6, 0x69,
+ 0x72, 0xB3, 0x51, 0x54, 0x96, 0x07, 0xF0, 0xB8, 0x0D, 0x39, 0x25, 0x4E,
+ 0x11, 0x81, 0xA1, 0xF8, 0xFE, 0x39, 0xF6, 0xAA, 0x70, 0x6C, 0x1D, 0x44,
+ 0x38, 0x08, 0x6F, 0x4E, 0x0F, 0xA3, 0x6B, 0x8D, 0xD2, 0x29, 0x88, 0x23,
+ 0x18, 0x56, 0x3E, 0x6D, 0x67, 0xDF, 0x54, 0x38, 0xCD, 0x42, 0x5B, 0x13,
+ 0x2B, 0x32, 0xC6, 0x77, 0x19, 0x42, 0x0A, 0x04, 0x91, 0xBF, 0xFF, 0x90,
+ 0x60, 0x83, 0xD9, 0x60, 0x4B, 0xBA, 0x93,
diff --git a/epid/verifier/unittests/verifier-testhelper.cc b/epid/verifier/unittests/verifier-testhelper.cc
new file mode 100644
index 0000000..68130dc
--- /dev/null
+++ b/epid/verifier/unittests/verifier-testhelper.cc
@@ -0,0 +1,768 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Test fixture class for EpidVerifier.
+ */
+
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+const G1ElemStr EpidVerifierTest::kG1IdentityStr = {
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
+ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}};
+
+const GroupPubKey EpidVerifierTest::kPubKeyStr = {
+ // gid
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ },
+ // h1
+ {{0xB3, 0x6F, 0xFF, 0x81, 0xE2, 0x1B, 0x17, 0xEB, 0x3D, 0x75, 0x3D,
+ 0x61, 0x7E, 0x27, 0xB0, 0xCB, 0xD0, 0x6D, 0x8F, 0x9D, 0x64, 0xCE,
+ 0xE3, 0xCE, 0x43, 0x4C, 0x62, 0xFD, 0xB5, 0x80, 0xE0, 0x99},
+ {0x3A, 0x07, 0x56, 0x80, 0xE0, 0x88, 0x59, 0xA4, 0xFD, 0xB5, 0xB7,
+ 0x9D, 0xE9, 0x4D, 0xAE, 0x9C, 0xEE, 0x3D, 0x66, 0x42, 0x82, 0x45,
+ 0x7E, 0x7F, 0xD8, 0x69, 0x3E, 0xA1, 0x74, 0xF4, 0x59, 0xEE}},
+ // h2
+ {{0xD2, 0x74, 0x2E, 0x9F, 0x63, 0xC2, 0x51, 0x8E, 0xD5, 0xDB, 0xCA,
+ 0x1C, 0x54, 0x74, 0x10, 0x7B, 0xDC, 0x99, 0xED, 0x42, 0xD5, 0x5B,
+ 0xA7, 0x04, 0x29, 0x66, 0x61, 0x63, 0xBC, 0xDD, 0x7F, 0xE1},
+ {0x76, 0x5D, 0xC0, 0x6E, 0xE3, 0x14, 0xAC, 0x72, 0x48, 0x12, 0x0A,
+ 0xA6, 0xE8, 0x5B, 0x08, 0x7B, 0xDA, 0x3F, 0x51, 0x7D, 0xDE, 0x4C,
+ 0xEA, 0xCB, 0x93, 0xA5, 0x6E, 0xCC, 0xE7, 0x8E, 0x10, 0x84}},
+ // w
+ {{{0xBD, 0x19, 0x5A, 0x95, 0xE2, 0x0F, 0xCA, 0x1C, 0x50, 0x71, 0x94,
+ 0x51, 0x40, 0x1B, 0xA5, 0xB6, 0x78, 0x87, 0x53, 0xF6, 0x6A, 0x95,
+ 0xCA, 0xC6, 0x8D, 0xCD, 0x36, 0x88, 0x07, 0x28, 0xE8, 0x96},
+ {0xCA, 0x78, 0x11, 0x5B, 0xB8, 0x6A, 0xE7, 0xE5, 0xA6, 0x65, 0x7A,
+ 0x68, 0x15, 0xD7, 0x75, 0xF8, 0x24, 0x14, 0xCF, 0xD1, 0x0F, 0x6C,
+ 0x56, 0xF5, 0x22, 0xD9, 0xFD, 0xE0, 0xE2, 0xF4, 0xB3, 0xA1}},
+ {{0x90, 0x21, 0xA7, 0xE0, 0xE8, 0xB3, 0xC7, 0x25, 0xBC, 0x07, 0x72,
+ 0x30, 0x5D, 0xEE, 0xF5, 0x6A, 0x89, 0x88, 0x46, 0xDD, 0x89, 0xC2,
+ 0x39, 0x9C, 0x0A, 0x3B, 0x58, 0x96, 0x57, 0xE4, 0xF3, 0x3C},
+ {0x79, 0x51, 0x69, 0x36, 0x1B, 0xB6, 0xF7, 0x05, 0x5D, 0x0A, 0x88,
+ 0xDB, 0x1F, 0x3D, 0xEA, 0xA2, 0xBA, 0x6B, 0xF0, 0xDA, 0x8E, 0x25,
+ 0xC6, 0xAD, 0x83, 0x7D, 0x3E, 0x31, 0xEE, 0x11, 0x40, 0xA9}}}};
+
+const GroupPubKey EpidVerifierTest::kPubKeyIkgfStr = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00}, // group id
+ {{{{0x45, 0xcb, 0x06, 0x04, 0xb3, 0xf7, 0x23, 0xb2, 0xd1, 0xd1, 0x0d,
+ 0x4f, 0x51, 0x7b, 0xbb, 0x8f, 0x71, 0x15, 0xd7, 0xf1, 0xdc, 0x15,
+ 0x37, 0xc8, 0xb8, 0x3d, 0x68, 0x0a, 0x18, 0xa5, 0x34, 0x14}}},
+ {{{0x0c, 0xdc, 0xd9, 0x15, 0x7e, 0xba, 0x56, 0xc5, 0xe5, 0x61, 0xfa,
+ 0x6a, 0x86, 0xa0, 0xac, 0x6a, 0x81, 0x36, 0x6d, 0x01, 0x5f, 0x86,
+ 0xc0, 0x04, 0x8b, 0x1e, 0xff, 0x49, 0xd9, 0x37, 0x96, 0x66}}}}, // h1
+ {{{{0xf1, 0xc3, 0x16, 0xb5, 0xc5, 0x1c, 0x67, 0xb6, 0xff, 0x28, 0x23,
+ 0x79, 0x59, 0xea, 0x80, 0xe6, 0x09, 0x07, 0xe7, 0xd3, 0x38, 0xec,
+ 0xb9, 0x16, 0x83, 0x88, 0xda, 0x64, 0xdd, 0xc4, 0x9d, 0x6a}}},
+ {{{0x5c, 0xb2, 0x1c, 0x88, 0x97, 0xea, 0xaf, 0xa9, 0xf3, 0x3e, 0x07,
+ 0xea, 0xb6, 0x2a, 0xd5, 0x7a, 0xed, 0x32, 0xd9, 0x3d, 0x90, 0xd7,
+ 0xb9, 0x91, 0x08, 0x05, 0x9e, 0xe3, 0x22, 0x75, 0x06, 0x35}}}}, // h2
+ {{{{{0xe5, 0xc4, 0x77, 0xad, 0x52, 0xb9, 0x7c, 0x04, 0x2d, 0x7e, 0x81,
+ 0xf2, 0x5d, 0x5d, 0x52, 0x7d, 0xd7, 0x1d, 0x29, 0xfb, 0x6a, 0xa7,
+ 0xbc, 0xb5, 0xa9, 0x1a, 0xa6, 0xfd, 0x20, 0xea, 0xf2, 0x98}}},
+ {{{0xe2, 0x67, 0x33, 0x28, 0x67, 0x5f, 0xbe, 0x23, 0xa0, 0x43, 0xe8,
+ 0x71, 0xaa, 0xab, 0xf6, 0xf0, 0x6a, 0x2b, 0x52, 0xa8, 0x61, 0x51,
+ 0x22, 0x44, 0x00, 0x91, 0xd7, 0xf1, 0x7e, 0x05, 0x48, 0xdc}}}},
+ {{{{0x51, 0x0c, 0xef, 0xa0, 0xf3, 0x72, 0xcd, 0x59, 0xd4, 0x7a, 0x2a,
+ 0x60, 0xa3, 0x62, 0x54, 0xa8, 0xb6, 0x8f, 0xed, 0x90, 0xdf, 0x3e,
+ 0x94, 0xe8, 0xa4, 0x89, 0x32, 0xaa, 0x52, 0x5a, 0x97, 0xae}}},
+ {{{0x4c, 0x86, 0xf4, 0xba, 0xec, 0xc6, 0x36, 0x13, 0x87, 0x42, 0x5d,
+ 0x16, 0x49, 0x12, 0x66, 0xc5, 0xe0, 0xe4, 0x9b, 0xf9, 0x68, 0xaa,
+ 0xa9, 0x95, 0x81, 0x16, 0x5c, 0xd2, 0xca, 0xd4, 0x2e, 0x61}}}}} // w
+};
+
+const GroupPubKey EpidVerifierTest::kPubKeyRevGroupIkgfStr = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x78, 0x8a, 0xb6, 0x0f, 0x9a, 0xf5, 0xe4, 0xd1,
+ 0xe7, 0x39, 0x6a, 0x79, 0x6c, 0xb5, 0xd1, 0xa1, 0x83, 0xec, 0xa1, 0x01,
+ 0xfe, 0xe8, 0x72, 0xce, 0xce, 0x05, 0x9a, 0x4f, 0xa5, 0x17, 0x1b, 0xed,
+ 0x30, 0xc5, 0x00, 0xc0, 0xb4, 0xdb, 0x5e, 0xa6, 0xe2, 0x24, 0x23, 0xab,
+ 0xf5, 0x09, 0xf2, 0x4a, 0x7e, 0x72, 0xfa, 0xc3, 0xbf, 0x33, 0x93, 0x23,
+ 0x48, 0x89, 0xd2, 0x98, 0x08, 0xe1, 0x01, 0xba, 0x9d, 0xa9, 0xe5, 0x41,
+ 0x46, 0x2e, 0xbb, 0x9e, 0x6a, 0xfd, 0x28, 0x85, 0x94, 0xd5, 0x6e, 0x5a,
+ 0xfa, 0x42, 0x71, 0x6e, 0xdc, 0x7e, 0xdb, 0xd1, 0xf2, 0x84, 0x11, 0x08,
+ 0x4f, 0x0f, 0x22, 0x1f, 0x32, 0xbe, 0xd7, 0x6f, 0x55, 0x17, 0x17, 0x4a,
+ 0xa7, 0x46, 0xeb, 0xca, 0x02, 0x65, 0x53, 0xca, 0xd7, 0x93, 0x03, 0x01,
+ 0xe1, 0x54, 0xfc, 0xdd, 0xb4, 0x95, 0x5a, 0x5c, 0x0c, 0x8c, 0x13, 0x65,
+ 0x02, 0x16, 0xf0, 0xfc, 0xbb, 0x02, 0x5f, 0x87, 0x83, 0x8c, 0xd0, 0x3e,
+ 0x69, 0xc8, 0xf5, 0x7c, 0x09, 0xdd, 0x48, 0x65, 0x82, 0x48, 0x6f, 0xb5,
+ 0x35, 0x0c, 0xc4, 0x04, 0x2d, 0x83, 0x0a, 0x3e, 0xa0, 0x0f, 0x5f, 0x8e,
+ 0x61, 0xf7, 0xc3, 0xb5, 0x5c, 0x66, 0xf8, 0xf8, 0xa3, 0x0a, 0xc1, 0x50,
+ 0xcd, 0xb0, 0x44, 0x19, 0x14, 0x07, 0xf1, 0xad, 0x7a, 0xec, 0x73, 0xac,
+ 0x55, 0x01, 0x8a, 0xa6, 0x62, 0x9b, 0x30, 0xf3, 0xf9, 0xc5, 0xd1, 0x3d,
+ 0xf2, 0x36, 0x13, 0x28, 0x4d, 0xbf, 0x95, 0x88, 0x76, 0x6b, 0xb0, 0x18,
+ 0xd8, 0x3f, 0xa6, 0x22, 0x69, 0x13, 0x06, 0xa4, 0x04, 0xbf, 0x52, 0x8e,
+ 0xf0, 0x11, 0x99, 0x65, 0xb9, 0xf8, 0x57, 0x0b, 0xf6, 0xc2, 0xe8, 0xaf,
+ 0xee, 0xd4, 0x6e, 0xa7, 0x49, 0x7b, 0xeb, 0x8f, 0x92, 0x66, 0x45, 0xda,
+ 0xb4, 0x01, 0xa8, 0xee, 0x7c, 0xdf, 0x8e, 0x08};
+
+const VerifierPrecomp EpidVerifierTest::kVerifierPrecompStr = {
+ // gid
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ },
+ // e12
+ {0xD8, 0x14, 0xBA, 0x4B, 0x44, 0x03, 0x55, 0x6C, 0xF6, 0x42, 0xE8, 0xF0,
+ 0x4C, 0xB5, 0xE7, 0xD4, 0xA2, 0xA3, 0x69, 0x47, 0xF5, 0xD4, 0xC8, 0xE9,
+ 0xC5, 0x5A, 0x39, 0xB5, 0x55, 0xA5, 0xD3, 0xFB, 0xF3, 0x85, 0x5A, 0x0D,
+ 0xD5, 0xEE, 0xDE, 0xF4, 0xA8, 0xB1, 0x8B, 0xCF, 0xA9, 0x0D, 0x29, 0xBF,
+ 0x86, 0x27, 0x9C, 0x1F, 0x96, 0xED, 0xD8, 0x44, 0x01, 0x35, 0x1A, 0xCE,
+ 0xFD, 0x4E, 0x6F, 0xA1, 0x66, 0x0D, 0x59, 0x08, 0x6D, 0xA2, 0xE4, 0x99,
+ 0x83, 0xDC, 0x39, 0x28, 0xB7, 0x1C, 0x1A, 0x33, 0xAD, 0xCA, 0x5C, 0x35,
+ 0x26, 0x1F, 0xAB, 0xBA, 0x0D, 0x53, 0xAF, 0xE0, 0x72, 0x14, 0xC5, 0xA7,
+ 0x2E, 0x58, 0x26, 0xC9, 0x8E, 0xFA, 0x6F, 0x62, 0xFC, 0xF0, 0x08, 0x3E,
+ 0xA3, 0x11, 0x3A, 0xF0, 0xB8, 0x3B, 0x2D, 0x3E, 0xEC, 0xD5, 0xBC, 0xF2,
+ 0x05, 0x68, 0xF4, 0x40, 0xCE, 0x2C, 0x8F, 0xDD, 0xA4, 0xE5, 0xE1, 0xB5,
+ 0xBE, 0xBD, 0x3E, 0xD4, 0xF6, 0x9A, 0xB3, 0x37, 0x24, 0x0D, 0xEA, 0x13,
+ 0xD7, 0x1F, 0xA2, 0x75, 0x68, 0xA1, 0xBE, 0x2C, 0x01, 0x42, 0x2A, 0xAE,
+ 0x6F, 0xAE, 0x7A, 0x72, 0x3A, 0x11, 0x03, 0x58, 0x02, 0x0D, 0xF0, 0xB0,
+ 0xD9, 0x6F, 0xB1, 0xE4, 0xF2, 0x70, 0xB8, 0xFF, 0x22, 0x56, 0x7C, 0xB3,
+ 0x80, 0xFD, 0xDF, 0xE5, 0xAB, 0xCC, 0x18, 0x7A, 0xFD, 0x91, 0xD0, 0xB0,
+ 0x63, 0x40, 0xD4, 0x71, 0xFA, 0x03, 0xF5, 0xF1, 0x26, 0xE1, 0xA5, 0x5A,
+ 0xD9, 0x6D, 0xF5, 0x5A, 0x7B, 0x2A, 0x3A, 0xFE, 0x94, 0x9E, 0x74, 0x41,
+ 0x79, 0x49, 0x7E, 0x48, 0x1D, 0x58, 0x5E, 0xF6, 0x98, 0xA3, 0x6E, 0x61,
+ 0x8E, 0x9F, 0x1F, 0xCD, 0x15, 0x01, 0x16, 0xA5, 0xE0, 0xAB, 0xD6, 0xD6,
+ 0x1F, 0x1C, 0xF5, 0x81, 0x76, 0xC1, 0xEC, 0x10, 0xC2, 0xCC, 0x68, 0x59,
+ 0x4D, 0x47, 0xEF, 0x4B, 0x7F, 0xD8, 0x78, 0x9C, 0xFE, 0x9A, 0x86, 0x7E,
+ 0x0C, 0xFD, 0x3E, 0x0A, 0x7A, 0x72, 0x8B, 0x14, 0x5F, 0xE6, 0x5F, 0x19,
+ 0xA3, 0x0A, 0x1B, 0x71, 0xDC, 0xD2, 0xAE, 0x35, 0xC3, 0x11, 0xA5, 0xD3,
+ 0xEA, 0xE1, 0xA9, 0xE7, 0x70, 0x0C, 0x7A, 0x39, 0x56, 0x3C, 0xE4, 0xE7,
+ 0xF9, 0xB6, 0xF1, 0x15, 0x40, 0xAB, 0xB6, 0xC4, 0xAD, 0xBD, 0xF4, 0xCC,
+ 0x13, 0xB7, 0xA8, 0xB6, 0x92, 0x1E, 0x72, 0x27, 0xA7, 0xFF, 0xD9, 0xEA,
+ 0x2F, 0x91, 0x96, 0x22, 0xD2, 0xC4, 0x4D, 0x80, 0xDC, 0x47, 0x66, 0x87,
+ 0xCC, 0xCF, 0xC5, 0x64, 0xF7, 0xB2, 0x34, 0xED, 0xD5, 0x44, 0x44, 0xCC,
+ 0x57, 0x41, 0xC7, 0x92, 0xB7, 0x5C, 0x12, 0xF7, 0x81, 0xF2, 0x92, 0x35,
+ 0x3E, 0x4B, 0xDF, 0xF8, 0xDA, 0x68, 0xAC, 0x30, 0xE3, 0xDD, 0x9E, 0x22,
+ 0xAA, 0x6D, 0x77, 0xDD, 0xAC, 0xD9, 0x11, 0x6E, 0xFB, 0x1A, 0x88, 0xB3},
+ // e22
+ {0x07, 0x3F, 0x9D, 0x47, 0x82, 0xB8, 0x3D, 0x6A, 0xE0, 0x36, 0xAB, 0xA6,
+ 0xFA, 0xE6, 0xD2, 0x1C, 0xC8, 0xB2, 0xD0, 0x01, 0xD4, 0x96, 0xDC, 0x2E,
+ 0xF8, 0x19, 0xDC, 0x70, 0x1B, 0xF9, 0x73, 0x0C, 0x2B, 0xC2, 0xE2, 0x1D,
+ 0x85, 0x53, 0x81, 0x51, 0xFB, 0xCA, 0x16, 0x86, 0xD4, 0x4E, 0xFD, 0x1A,
+ 0x59, 0xE3, 0x97, 0xC4, 0x7F, 0x99, 0xD8, 0x66, 0x08, 0xA1, 0xE4, 0x9F,
+ 0xBB, 0x3A, 0xCE, 0xA5, 0x23, 0x9C, 0x83, 0x13, 0xC5, 0xC8, 0xF2, 0x16,
+ 0x1E, 0xE8, 0xE6, 0xC5, 0x36, 0x57, 0x2C, 0xDF, 0x73, 0xB4, 0xE2, 0xB2,
+ 0xCB, 0xEB, 0xBB, 0xF7, 0x45, 0xD1, 0x44, 0xBD, 0x6E, 0x92, 0x95, 0x00,
+ 0xE5, 0x89, 0xB5, 0x91, 0x78, 0xC7, 0x44, 0xB1, 0x2F, 0x37, 0xDF, 0xFB,
+ 0xE7, 0x8A, 0x44, 0x3F, 0x3D, 0x06, 0x5F, 0x5B, 0x1C, 0x5F, 0xCE, 0x11,
+ 0x05, 0x35, 0x3C, 0xAD, 0x92, 0x7E, 0x79, 0xB8, 0xFF, 0x28, 0x05, 0xE4,
+ 0x04, 0x2C, 0xB6, 0x1D, 0x22, 0xAB, 0x36, 0x00, 0x5F, 0x74, 0xF1, 0xE3,
+ 0xF6, 0xA6, 0x68, 0xE6, 0x7B, 0x25, 0xB8, 0xCF, 0x19, 0xB0, 0x1A, 0xDD,
+ 0x0F, 0xAD, 0x63, 0x73, 0x62, 0x1B, 0xE7, 0x94, 0x5D, 0xBF, 0x3D, 0xF1,
+ 0xF9, 0x8E, 0xAB, 0x59, 0xE5, 0xD1, 0x7C, 0x62, 0xDD, 0xBC, 0x40, 0x07,
+ 0x70, 0x5B, 0x13, 0xF6, 0x12, 0x09, 0xB4, 0x0D, 0x3E, 0xAB, 0x8B, 0x70,
+ 0x60, 0x1D, 0xD4, 0x61, 0x37, 0x28, 0x98, 0x3E, 0x7E, 0xDC, 0xFD, 0xD2,
+ 0xC0, 0x2F, 0x4B, 0x71, 0x31, 0x34, 0xD7, 0x69, 0x41, 0x5E, 0xAA, 0x72,
+ 0xE4, 0xDF, 0xEB, 0xFE, 0x8D, 0xCD, 0x68, 0xFC, 0x68, 0x55, 0xBE, 0x32,
+ 0x7D, 0x24, 0xC5, 0x07, 0x0F, 0xA8, 0xBD, 0x5A, 0xFE, 0xE7, 0xEC, 0xDB,
+ 0xFD, 0x19, 0xC8, 0xA9, 0x20, 0xA2, 0x7F, 0x6C, 0xA6, 0x62, 0xEC, 0xED,
+ 0x9B, 0x79, 0xBF, 0x9C, 0x0E, 0x31, 0x0B, 0x25, 0x2F, 0xD3, 0xCC, 0xA0,
+ 0xDD, 0xB2, 0xF2, 0x69, 0x26, 0x85, 0x21, 0x06, 0x94, 0x56, 0x5F, 0x59,
+ 0x5C, 0xF5, 0xB7, 0x82, 0xCE, 0x0F, 0xDD, 0x40, 0xDB, 0x83, 0xAC, 0x3C,
+ 0x41, 0xA0, 0x1B, 0xB1, 0xAF, 0xDA, 0x55, 0xBF, 0x6B, 0x1A, 0xEF, 0xE6,
+ 0x90, 0xE7, 0xAA, 0x0F, 0x04, 0x3C, 0x9F, 0x5B, 0xB7, 0xCD, 0x98, 0xA8,
+ 0x9E, 0xFF, 0x54, 0x26, 0xC8, 0xD5, 0x5C, 0x30, 0x5E, 0xA2, 0x99, 0x8E,
+ 0x34, 0xD5, 0x98, 0x9F, 0xCD, 0x57, 0xD1, 0x4D, 0x1D, 0xEE, 0x01, 0x5D,
+ 0x5A, 0x6D, 0xB2, 0xF1, 0xCF, 0x4B, 0xC0, 0x21, 0x23, 0x96, 0x05, 0xF9,
+ 0xC9, 0x66, 0xE5, 0x25, 0x9D, 0xA3, 0x8E, 0x78, 0x43, 0x19, 0xC1, 0x7F,
+ 0x7B, 0xEF, 0xF5, 0xED, 0x00, 0xB7, 0x45, 0x1F, 0x4E, 0xA9, 0xFA, 0xE3,
+ 0xFF, 0x54, 0xF2, 0x21, 0x73, 0xF8, 0x6B, 0xA1, 0xC7, 0x31, 0x4D, 0x6A},
+ // e2w
+ {0x49, 0x0D, 0x0F, 0x2A, 0x5C, 0x6A, 0x3B, 0xAD, 0x71, 0xC9, 0x22, 0x49,
+ 0xE8, 0x08, 0xDD, 0xBA, 0x79, 0x57, 0xB7, 0xC7, 0x61, 0xE4, 0xDB, 0x84,
+ 0x68, 0x57, 0xB9, 0x30, 0x83, 0xA4, 0xDC, 0xEF, 0x70, 0x93, 0x28, 0xE2,
+ 0x6F, 0xB9, 0xBC, 0x15, 0x28, 0x3A, 0x30, 0xBD, 0x96, 0x83, 0xDB, 0xF2,
+ 0x9D, 0x1E, 0xC7, 0x64, 0x6D, 0x2E, 0x7C, 0xA2, 0xF3, 0xAA, 0x2F, 0x4B,
+ 0x6D, 0x86, 0x9E, 0x48, 0x20, 0x29, 0x4B, 0x1F, 0x8D, 0xC2, 0x93, 0xC3,
+ 0x55, 0x25, 0x8E, 0xB0, 0x8A, 0x7E, 0x64, 0x45, 0x3F, 0xF4, 0x1D, 0x16,
+ 0x4C, 0x88, 0x2D, 0x54, 0xBE, 0xA8, 0x67, 0x70, 0x81, 0xC5, 0xB9, 0x5C,
+ 0x16, 0x00, 0xEF, 0x78, 0xF6, 0x4D, 0x6A, 0xEB, 0xFD, 0xA2, 0x0D, 0x52,
+ 0x86, 0xF3, 0x04, 0x4B, 0xD8, 0xF0, 0x7D, 0x50, 0x8B, 0xAD, 0xC0, 0x37,
+ 0xDB, 0x38, 0xF2, 0x7D, 0x1F, 0x8B, 0x13, 0x83, 0x7B, 0xCC, 0xE8, 0x25,
+ 0xFE, 0xFA, 0x0C, 0x02, 0x05, 0x2E, 0x75, 0x12, 0xA1, 0x0A, 0x89, 0xAB,
+ 0xF1, 0xB2, 0x08, 0x47, 0x9A, 0xEA, 0xEF, 0x1D, 0xA4, 0x9F, 0xDE, 0x89,
+ 0x47, 0x3E, 0x7C, 0x5E, 0x4A, 0x40, 0xDC, 0xEC, 0xC5, 0x1B, 0x7E, 0x33,
+ 0x0A, 0x19, 0x69, 0x27, 0xA6, 0xCC, 0x25, 0xFC, 0xF9, 0xEB, 0xBD, 0xB7,
+ 0x8A, 0xDB, 0x45, 0x5F, 0x9D, 0x9E, 0x01, 0xDE, 0x3D, 0x91, 0x10, 0x99,
+ 0x13, 0xBF, 0xC0, 0xFA, 0x9D, 0xD4, 0x0F, 0xB3, 0x09, 0xF3, 0xA1, 0xAE,
+ 0x68, 0xE1, 0x1B, 0x48, 0x85, 0x9F, 0x81, 0x66, 0x91, 0xE2, 0xF0, 0x7B,
+ 0x29, 0xDB, 0x8F, 0x5D, 0x99, 0xA9, 0xD3, 0x39, 0x30, 0xD9, 0x1B, 0x94,
+ 0x2A, 0x1C, 0x5C, 0xE9, 0xC0, 0x3F, 0x6E, 0xB2, 0x27, 0xBE, 0x74, 0x7A,
+ 0xCA, 0xE1, 0x0F, 0x6A, 0x43, 0x2E, 0x98, 0x65, 0xAF, 0x7F, 0x6E, 0x5A,
+ 0x55, 0x98, 0xC1, 0x58, 0x29, 0xB3, 0x86, 0x54, 0x0F, 0x57, 0x91, 0x89,
+ 0x29, 0xB1, 0x98, 0x79, 0xCC, 0x95, 0x39, 0xD0, 0xAB, 0xE0, 0x9F, 0xF3,
+ 0xDA, 0xF9, 0x5E, 0xD9, 0x34, 0xBB, 0x72, 0xDA, 0xE5, 0x72, 0xD3, 0xF8,
+ 0x9B, 0xF9, 0x14, 0x84, 0x48, 0x81, 0x54, 0x4F, 0xE6, 0x2B, 0x80, 0xC8,
+ 0xC1, 0x79, 0xFE, 0x83, 0xFF, 0x76, 0xA3, 0x6D, 0xFE, 0x37, 0x78, 0xC5,
+ 0x30, 0x7A, 0x50, 0xE2, 0x5D, 0x12, 0xDC, 0x72, 0xE9, 0x58, 0x7C, 0x07,
+ 0x4F, 0xFF, 0x15, 0x8A, 0x97, 0x3B, 0xCB, 0x60, 0xFA, 0x4E, 0xDE, 0x8C,
+ 0x80, 0x3A, 0x8B, 0x0B, 0xC6, 0x1D, 0xA3, 0xCE, 0x6A, 0xB3, 0x50, 0x69,
+ 0x03, 0x96, 0xCA, 0xC0, 0xB6, 0x94, 0x6F, 0x8F, 0xAB, 0x6F, 0x5B, 0x00,
+ 0x2A, 0x1D, 0x90, 0xA7, 0x81, 0xC6, 0x15, 0x77, 0x79, 0xF3, 0x36, 0x23,
+ 0xD1, 0x46, 0x25, 0x58, 0x6F, 0x7B, 0x22, 0xAC, 0x4C, 0x7A, 0xF3, 0x9F},
+ // eg12
+ {0xA8, 0x8E, 0x9A, 0xF9, 0x25, 0x12, 0x98, 0xE2, 0xC3, 0x61, 0x2E, 0xE8,
+ 0xD6, 0xA6, 0x77, 0x16, 0x49, 0x04, 0x75, 0x69, 0xD1, 0x83, 0x2D, 0x3F,
+ 0x2A, 0x79, 0xB6, 0x9B, 0xC9, 0x1D, 0x03, 0x90, 0x2A, 0xD8, 0x11, 0x9F,
+ 0x26, 0x36, 0xE7, 0xE9, 0x3A, 0x05, 0x4C, 0x15, 0x49, 0x93, 0xDA, 0xE9,
+ 0xD0, 0x5A, 0xE4, 0x8D, 0x8A, 0xFA, 0x04, 0xF1, 0x20, 0x84, 0x56, 0xEC,
+ 0x3C, 0x27, 0x19, 0x5C, 0xF1, 0xAF, 0xBF, 0xF6, 0x0E, 0x58, 0x84, 0x2D,
+ 0x94, 0x11, 0xF4, 0xB5, 0xF4, 0x14, 0x51, 0xB0, 0x90, 0x46, 0x1A, 0x81,
+ 0xED, 0xCF, 0x91, 0x66, 0x58, 0xA6, 0x36, 0x3A, 0x52, 0x18, 0x5A, 0xC1,
+ 0x08, 0x4C, 0x99, 0xD3, 0xDC, 0xCE, 0x7F, 0xCE, 0x78, 0xE0, 0x38, 0x87,
+ 0x32, 0xF1, 0x80, 0x3C, 0x7B, 0x67, 0xAA, 0x6F, 0xDD, 0xE0, 0xFC, 0xCB,
+ 0xD0, 0xB0, 0x3A, 0x59, 0x52, 0x2A, 0x84, 0xE4, 0xF8, 0x4A, 0xFF, 0x50,
+ 0xA0, 0x65, 0xC4, 0xEE, 0xF4, 0x9C, 0xAA, 0x34, 0x46, 0xF9, 0xD2, 0x6C,
+ 0xA1, 0x61, 0x71, 0x49, 0x32, 0x25, 0x84, 0x54, 0x90, 0x44, 0xBE, 0xA4,
+ 0x0B, 0xF7, 0xFE, 0x26, 0x81, 0x63, 0x73, 0xF7, 0x2F, 0xF2, 0xFA, 0x24,
+ 0x52, 0xA4, 0xD9, 0x4C, 0xC1, 0xA7, 0xA5, 0xC3, 0x03, 0x36, 0x13, 0x9B,
+ 0x16, 0x45, 0x16, 0xCB, 0x4B, 0x99, 0x38, 0xF3, 0x6D, 0xC8, 0x7E, 0xAB,
+ 0xB3, 0x53, 0xDF, 0xB6, 0x82, 0x60, 0x12, 0x11, 0x36, 0x69, 0x0E, 0x05,
+ 0x31, 0x8E, 0xCF, 0xD7, 0x3F, 0x32, 0xE7, 0x95, 0x84, 0x1D, 0xC8, 0xB5,
+ 0xBE, 0x49, 0x17, 0x9D, 0xCF, 0xA9, 0x5A, 0x2A, 0xC4, 0x11, 0x86, 0xE8,
+ 0x6C, 0x02, 0x56, 0xB0, 0x25, 0x2F, 0xA0, 0x06, 0xB3, 0x62, 0xB2, 0x11,
+ 0xAF, 0xBE, 0xA4, 0xE8, 0x61, 0x64, 0x85, 0xFB, 0xEB, 0x1C, 0xF1, 0xBC,
+ 0x2C, 0xAE, 0x10, 0x51, 0x16, 0xA6, 0xC0, 0xB3, 0x86, 0x8E, 0x6D, 0x79,
+ 0xB6, 0xBD, 0xDE, 0x1E, 0x26, 0x06, 0x46, 0x65, 0x82, 0x84, 0x5A, 0x97,
+ 0xD3, 0xB7, 0x93, 0x78, 0x6B, 0x9D, 0x14, 0x33, 0x94, 0x43, 0x34, 0x04,
+ 0x45, 0xD1, 0x47, 0xD4, 0x2F, 0x17, 0xCF, 0xF1, 0xDD, 0xEA, 0x11, 0x52,
+ 0xAE, 0x01, 0x88, 0x3A, 0x10, 0xEE, 0x5C, 0x16, 0xCD, 0xB5, 0x48, 0xE9,
+ 0x16, 0x2C, 0x70, 0xB4, 0x1E, 0x19, 0x38, 0xE0, 0x18, 0xE9, 0xAE, 0xC5,
+ 0xDA, 0x74, 0x41, 0x2D, 0x70, 0x07, 0x60, 0x37, 0x27, 0x66, 0xF7, 0x00,
+ 0xBB, 0x79, 0x51, 0xF3, 0x7C, 0x8A, 0x2B, 0xB5, 0x69, 0x6E, 0x10, 0x1F,
+ 0xE0, 0x0A, 0x5E, 0xBE, 0xB4, 0x4E, 0x0E, 0x02, 0x59, 0xB5, 0xCB, 0x4A,
+ 0x6A, 0x86, 0x8B, 0xCC, 0xA2, 0x13, 0xA0, 0xE9, 0xF2, 0x5C, 0xB0, 0x23,
+ 0xB2, 0x15, 0xF9, 0xBB, 0x43, 0xC1, 0x54, 0xF4, 0xC8, 0xAB, 0x16, 0xA6}};
+
+const VerifierPrecomp EpidVerifierTest::kVerifierPrecompIkgfStr = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xbc, 0x74, 0xd9, 0xd2, 0xcc, 0x56, 0x28, 0xfd,
+ 0x3d, 0x0b, 0x2b, 0x86, 0xf4, 0xc6, 0xb2, 0x25, 0x19, 0x6b, 0x5b, 0x42,
+ 0x35, 0x6a, 0xd9, 0x9c, 0xf9, 0xb4, 0x30, 0xcb, 0xff, 0x39, 0xbb, 0x92,
+ 0x41, 0x71, 0xf4, 0x49, 0xc3, 0xfd, 0x36, 0xa3, 0xe0, 0xdd, 0x83, 0xf1,
+ 0x34, 0x53, 0x2e, 0x16, 0x2f, 0x45, 0x06, 0x10, 0x3d, 0x9a, 0xfd, 0x22,
+ 0xb8, 0xf1, 0xfd, 0x52, 0x3a, 0x24, 0xc5, 0x9c, 0xdd, 0x54, 0x9c, 0xff,
+ 0xb0, 0x4d, 0xb9, 0xe5, 0x21, 0x62, 0x61, 0xaa, 0x76, 0xc3, 0xc1, 0x25,
+ 0x47, 0xe4, 0x3b, 0x62, 0xab, 0x5f, 0x2c, 0x56, 0xe1, 0x24, 0x9c, 0x21,
+ 0xec, 0x6b, 0x1d, 0x80, 0x1d, 0xca, 0xc5, 0x45, 0x34, 0xee, 0x4e, 0xc6,
+ 0x20, 0x94, 0x14, 0x98, 0x0e, 0xd6, 0x88, 0x1d, 0x69, 0xfd, 0x25, 0xd3,
+ 0xe3, 0x08, 0x3f, 0x62, 0x82, 0xa9, 0xf2, 0x13, 0xd6, 0x54, 0xda, 0x12,
+ 0xec, 0x4e, 0xd2, 0x92, 0xe1, 0x82, 0x3f, 0x54, 0xf8, 0xc7, 0x0e, 0x21,
+ 0x90, 0x49, 0xa1, 0x73, 0xa2, 0x03, 0xd0, 0xc7, 0x1c, 0xc2, 0x36, 0x1f,
+ 0xb5, 0x8e, 0x22, 0xaf, 0xb5, 0x96, 0xad, 0xba, 0xde, 0xe6, 0x45, 0xb9,
+ 0xee, 0x39, 0x74, 0x53, 0x62, 0x68, 0xa6, 0x37, 0x33, 0x65, 0x47, 0x3b,
+ 0xf2, 0xa3, 0x35, 0xd0, 0xe9, 0x50, 0x49, 0x68, 0x23, 0x9a, 0xa0, 0x33,
+ 0x66, 0x2f, 0x84, 0x23, 0x43, 0x95, 0x35, 0xea, 0x1d, 0xfe, 0x3a, 0xe4,
+ 0x45, 0x6f, 0xad, 0x86, 0x7a, 0x4b, 0xf8, 0xb7, 0x32, 0xaf, 0x79, 0x7c,
+ 0x45, 0x8d, 0xd9, 0x36, 0x0d, 0x66, 0xcb, 0x47, 0x07, 0xf4, 0x75, 0xae,
+ 0x38, 0xe1, 0x32, 0x67, 0x80, 0x73, 0x0b, 0x98, 0xb7, 0x8d, 0xa3, 0x03,
+ 0x94, 0x59, 0x0c, 0x04, 0xa8, 0x3e, 0xf8, 0x39, 0xc9, 0x25, 0x74, 0xb5,
+ 0x9c, 0x62, 0x79, 0xb9, 0xf0, 0x20, 0x0b, 0x41, 0xb1, 0x76, 0x2a, 0x93,
+ 0x15, 0xfa, 0x7a, 0x55, 0xe4, 0x50, 0xf3, 0xe1, 0x54, 0xf8, 0x9e, 0x42,
+ 0x84, 0xaf, 0xb6, 0xc2, 0x2e, 0x98, 0xd5, 0xfd, 0x31, 0xe4, 0x16, 0x2b,
+ 0x4d, 0x32, 0x96, 0x04, 0x4f, 0xca, 0x8b, 0x8d, 0x3c, 0x24, 0xb4, 0xc3,
+ 0x86, 0x3b, 0x06, 0xc9, 0x45, 0xc9, 0xb1, 0x90, 0xac, 0xc3, 0xd6, 0xec,
+ 0x80, 0x5b, 0x84, 0xcb, 0x5e, 0x7b, 0xc4, 0xcb, 0x63, 0x9e, 0xca, 0x09,
+ 0x92, 0xca, 0x70, 0xfd, 0x24, 0x2a, 0x81, 0x37, 0x5a, 0x85, 0x72, 0x4a,
+ 0x46, 0x2d, 0x29, 0x38, 0x8f, 0xc3, 0x59, 0xc7, 0xe9, 0x76, 0x24, 0xea,
+ 0xd4, 0xef, 0x06, 0x12, 0xf5, 0xab, 0xab, 0xa1, 0x59, 0x13, 0xc8, 0x1d,
+ 0xdf, 0x0f, 0x41, 0xbe, 0x98, 0x65, 0x00, 0x11, 0x41, 0x7c, 0x6e, 0x29,
+ 0x83, 0x73, 0xfd, 0x81, 0xff, 0xe8, 0xd8, 0x7f, 0xa1, 0x00, 0x62, 0x11,
+ 0x14, 0x38, 0x06, 0x57, 0x20, 0x81, 0xaa, 0x9e, 0xaf, 0xfe, 0xee, 0x68,
+ 0xee, 0x30, 0x1a, 0x83, 0xe7, 0x32, 0xc3, 0xfc, 0x69, 0xe5, 0x19, 0x29,
+ 0x4e, 0xee, 0xb0, 0xf1, 0x63, 0xaf, 0x41, 0x3d, 0x3b, 0xb9, 0xbb, 0x2e,
+ 0xde, 0xd7, 0x0b, 0xbe, 0x11, 0x8f, 0x4a, 0x94, 0x4c, 0x57, 0xf3, 0x64,
+ 0x38, 0x5a, 0xc6, 0xb8, 0x5d, 0xa1, 0x9d, 0xc8, 0xfa, 0x32, 0xe2, 0x08,
+ 0xf4, 0x26, 0x3f, 0x75, 0xb5, 0x35, 0x9a, 0xe9, 0xd6, 0x1d, 0x35, 0x41,
+ 0x9b, 0x20, 0x2b, 0x54, 0xb9, 0x66, 0x6c, 0xc6, 0xb7, 0x44, 0x82, 0x9b,
+ 0x74, 0xe8, 0x09, 0x04, 0xa4, 0xf2, 0x7a, 0x8f, 0xe8, 0x6f, 0x3c, 0xa0,
+ 0x18, 0xab, 0x66, 0xf6, 0x39, 0x34, 0x70, 0xf3, 0xa6, 0xd3, 0xc9, 0xe1,
+ 0x97, 0xe2, 0xdc, 0x4d, 0xca, 0x02, 0xb6, 0x73, 0x07, 0xf3, 0x8c, 0xd0,
+ 0xab, 0xd9, 0x12, 0x45, 0x70, 0x7c, 0x3a, 0x24, 0x64, 0xce, 0x9e, 0x38,
+ 0x4d, 0x5d, 0xe1, 0x9d, 0xf2, 0x4b, 0x58, 0xdc, 0x71, 0xb3, 0x61, 0x56,
+ 0x14, 0x62, 0x2a, 0x1b, 0x36, 0x5e, 0xc9, 0x15, 0xf3, 0x50, 0xe6, 0xc0,
+ 0x93, 0x62, 0xd0, 0x69, 0xab, 0xd4, 0xe5, 0x9b, 0xa6, 0xa7, 0xa3, 0x0c,
+ 0x51, 0xad, 0xf7, 0x38, 0x6f, 0x1d, 0xcf, 0x43, 0xda, 0x83, 0x95, 0xc6,
+ 0xfb, 0xd8, 0x90, 0x5e, 0x35, 0x30, 0x0b, 0x7b, 0x45, 0xd0, 0x12, 0x32,
+ 0x95, 0xc3, 0x96, 0xdc, 0x0a, 0x68, 0xcc, 0xcf, 0x19, 0x0b, 0x13, 0xc7,
+ 0x6a, 0x7a, 0x53, 0x36, 0x5b, 0x24, 0xc5, 0x84, 0x5c, 0xeb, 0x9e, 0xeb,
+ 0xdc, 0x91, 0x17, 0xb3, 0x29, 0xfd, 0xee, 0x55, 0xc9, 0x8c, 0xcd, 0xbe,
+ 0x3a, 0x66, 0xf3, 0xba, 0x79, 0xfe, 0xc7, 0xf8, 0x08, 0xeb, 0xd2, 0x3a,
+ 0x17, 0x3c, 0x36, 0x29, 0xc1, 0xde, 0xa9, 0xab, 0x80, 0xdb, 0x6c, 0xdd,
+ 0xfb, 0xe5, 0xb1, 0x12, 0x25, 0x2f, 0xa3, 0x3d, 0x0e, 0x72, 0xde, 0xaf,
+ 0x86, 0x93, 0x35, 0x18, 0x96, 0x19, 0x47, 0xfd, 0x8f, 0xae, 0x7b, 0xe7,
+ 0xac, 0x6e, 0x53, 0x10, 0x1e, 0x66, 0x54, 0xc0, 0x36, 0x0e, 0x73, 0x35,
+ 0xb3, 0x20, 0xf9, 0xaa, 0x25, 0x4a, 0x66, 0xaf, 0xc9, 0x2f, 0xd1, 0x19,
+ 0x8b, 0x8f, 0x93, 0xbe, 0x3a, 0x30, 0xa5, 0x24, 0xc2, 0xad, 0x30, 0xfc,
+ 0x97, 0xfe, 0x6c, 0xe0, 0x7f, 0x98, 0x71, 0x37, 0x33, 0x26, 0xc3, 0x75,
+ 0xc8, 0x51, 0xe6, 0xf2, 0x99, 0xf0, 0x0f, 0x7d, 0x5d, 0x12, 0x26, 0x9d,
+ 0x96, 0xeb, 0xd5, 0x08, 0x28, 0x34, 0x90, 0x1c, 0xdb, 0x98, 0xbd, 0x8a,
+ 0xeb, 0x93, 0x0d, 0xd0, 0x57, 0x3e, 0xb8, 0x65, 0xdd, 0xa6, 0xa9, 0x81,
+ 0xd6, 0xca, 0x62, 0x4b, 0x24, 0xed, 0xf4, 0x36, 0xf0, 0x83, 0xd6, 0x0e,
+ 0x53, 0xf2, 0x50, 0x89, 0x70, 0x23, 0x19, 0x7b, 0xd0, 0x7e, 0x67, 0xa3,
+ 0x45, 0x72, 0x9d, 0x11, 0xbe, 0xbb, 0xe1, 0x72, 0x51, 0xf6, 0x5f, 0x4e,
+ 0x2c, 0xca, 0x61, 0x3d, 0xaa, 0xfd, 0xb7, 0x61, 0xbc, 0x3a, 0xd2, 0x20,
+ 0x18, 0xa2, 0xee, 0x04, 0xe4, 0x6b, 0xf3, 0x84, 0x26, 0xc2, 0x43, 0xa4,
+ 0xfe, 0x4e, 0x14, 0x5c, 0xbe, 0xe7, 0x11, 0x4a, 0x61, 0x33, 0x7d, 0xeb,
+ 0x71, 0x98, 0x7c, 0xf0, 0x44, 0xe2, 0x41, 0x17, 0x39, 0xd0, 0x4e, 0xe2,
+ 0x9c, 0xcc, 0x8d, 0x76, 0x3c, 0xb8, 0x0f, 0x63, 0x4a, 0x56, 0x7c, 0xf8,
+ 0xab, 0xbd, 0x87, 0xcc, 0xa2, 0x29, 0xb9, 0x3c, 0xcc, 0x12, 0xd2, 0x9d,
+ 0x6f, 0xbd, 0x28, 0xc3, 0x0c, 0x2f, 0x83, 0x8c, 0xf3, 0xad, 0x3d, 0xc6,
+ 0x92, 0xba, 0x0b, 0x28, 0x47, 0x81, 0x78, 0xbe, 0x2b, 0xe0, 0x6a, 0x47,
+ 0xba, 0xf3, 0xbe, 0x39, 0x30, 0x49, 0x0b, 0x35, 0x34, 0x80, 0x70, 0xc2,
+ 0x75, 0x54, 0x65, 0xd8, 0xc8, 0x1c, 0x26, 0xb8, 0x97, 0x61, 0x57, 0xcf,
+ 0x2d, 0xb8, 0xd1, 0xdd, 0xb0, 0xf1, 0xa9, 0x0f, 0x3f, 0x7e, 0xfe, 0xd3,
+ 0xee, 0xdc, 0x75, 0xbf, 0xc2, 0xf1, 0x30, 0xd6, 0x60, 0x1b, 0xcd, 0x7b,
+ 0x87, 0xde, 0x0b, 0x58, 0x5c, 0xac, 0x84, 0xda, 0xef, 0x86, 0x86, 0x8d,
+ 0x8e, 0xfd, 0x6f, 0x93, 0x32, 0x8d, 0xac, 0x7b, 0x8f, 0x2a, 0x8a, 0x5f,
+ 0xf1, 0xea, 0xbb, 0x8e, 0x6d, 0xbf, 0xe0, 0x59, 0x90, 0xc2, 0xd3, 0x3d,
+ 0x8a, 0x03, 0x64, 0x11, 0xdd, 0xf1, 0xfc, 0x2d, 0x26, 0x8a, 0x6f, 0x39,
+ 0x25, 0xa9, 0xaa, 0x61, 0x45, 0x5b, 0x7b, 0x36, 0xfd, 0x82, 0xd2, 0x6a,
+ 0x8c, 0x9a, 0xf1, 0xc2};
+
+const std::vector<uint8_t> EpidVerifierTest::kGroupRlEmptyBuf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x00,
+ // n3
+ 0x00, 0x00, 0x00, 0x00};
+
+const std::vector<uint8_t> EpidVerifierTest::kGroupRl3GidBuf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x03,
+ // gid[0]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // gid[1]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[2]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03,
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGroupRl3GidN0Buf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x00,
+ // gid[0]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // gid[1]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[2]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03,
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGroupRl3GidN2Buf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[0]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // gid[1]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[2]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03,
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGroupRl3GidN4Buf = {
+ // RLVer
+ 0x00, 0x00, 0x00, 0x03,
+ // n3
+ 0x00, 0x00, 0x00, 0x04,
+ // gid[0]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ // gid[1]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02,
+ // gid[2]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03,
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGrp01VerRlOneEntry = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // B
+ 0x41, 0x63, 0xfd, 0x06, 0xb8, 0xb1, 0xa6, 0x32, 0xa5, 0xe3, 0xeb, 0xc4,
+ 0x40, 0x11, 0x37, 0xc0, 0x62, 0x0d, 0xe1, 0xca, 0xe9, 0x79, 0xad, 0xff,
+ 0x1d, 0x13, 0xb3, 0xda, 0xa0, 0x10, 0x8a, 0xa8, 0x30, 0x72, 0xa4, 0xe8,
+ 0x27, 0xb5, 0xad, 0xdb, 0xac, 0x89, 0xd8, 0x37, 0x79, 0xd9, 0x8c, 0xd0,
+ 0xb3, 0xef, 0x94, 0x17, 0x4f, 0x05, 0x53, 0x4c, 0x4d, 0xf0, 0x77, 0xf7,
+ 0xb6, 0xaf, 0xb8, 0xfa,
+ // version
+ 0x00, 0x00, 0x00, 0x01,
+ // n4
+ 0x00, 0x00, 0x00, 0x01,
+ // k's
+ 0xdc, 0x41, 0x24, 0xe7, 0xb8, 0xf2, 0x6d, 0xc4, 0x01, 0xf9, 0x5d, 0xf8,
+ 0xd9, 0x23, 0x32, 0x29, 0x0a, 0xe1, 0xf6, 0xdc, 0xa1, 0xef, 0x52, 0xf7,
+ 0x3a, 0x3c, 0xe6, 0x7e, 0x3d, 0x0e, 0xe8, 0x86, 0xa9, 0x58, 0xf4, 0xfe,
+ 0xfa, 0x8b, 0xe4, 0x1c, 0xad, 0x58, 0x5b, 0x1c, 0xc7, 0x54, 0xee, 0x7e,
+ 0xe7, 0x12, 0x6a, 0x4b, 0x01, 0x63, 0xb4, 0xdb, 0x6e, 0xe7, 0x7a, 0xe9,
+ 0x62, 0xa5, 0xb4, 0xe3};
+const std::vector<uint8_t> EpidVerifierTest::kEmptyGrp01VerRl = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // B
+ 0xa6, 0x13, 0x29, 0xb6, 0x61, 0xa2, 0xb8, 0xd7, 0x49, 0x86, 0xcb, 0xaf,
+ 0x94, 0x4d, 0x9e, 0x51, 0xcf, 0xd3, 0x5d, 0x0f, 0x33, 0x9a, 0x59, 0x0d,
+ 0xe7, 0xc9, 0xb9, 0x7f, 0x83, 0xae, 0x27, 0xe6, 0x40, 0xf0, 0x88, 0x13,
+ 0xe2, 0xb6, 0x6a, 0x43, 0x26, 0xa3, 0x21, 0xea, 0x00, 0x78, 0xcd, 0xce,
+ 0x0e, 0x14, 0x7a, 0xde, 0xcf, 0xaa, 0x7b, 0xc5, 0x7e, 0x7c, 0xaf, 0xe4,
+ 0x5e, 0x8a, 0xdd, 0xc7,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n4
+ 0x00, 0x00, 0x00, 0x00,
+ // no k's
+};
+const Epid2Params EpidVerifierTest::kParamsStr = {
+#include "epid/common/src/epid2params_ate.inc"
+};
+const GroupPubKey EpidVerifierTest::kGrp01Key = {
+#include "epid/common-testhelper/testdata/grp01/gpubkey.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrp01PrivRl = {
+#include "epid/common-testhelper/testdata/grp01/privrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrp01SigRl = {
+#include "epid/common-testhelper/testdata/grp01/sigrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kEmptySigRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sigrl_empty.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrp01VerRl = {
+#include "epid/common-testhelper/testdata/grp01/verrl.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha256RandombaseTest0 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test0_sha256_sigrl.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha512kBsn0Data_0_255 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_bsn0_msg_0_255_sha512.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigMember0Sha256RandombaseMsg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha384RandombaseTest0 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test0_sha384_sigrl.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha512RandombaseTest0 = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test0_sha512_sigrl.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXMember0Sha512256RandombaseMsg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha256RandombaseTest1NoSigRl = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha256.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha256Basename1Test1NoSigRl = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_basename1_sha256.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigSha256Basename1Test1NoSigRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha384RandombaseTest1NoSigRl = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha384.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrp01Member0Sha512RandombaseTest1NoSigRl = {
+#include "epid/common-testhelper/testdata/grp01/member0/sig_test1_sha512.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXMember0Sha512256RandombaseMsg0NoSigRl = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_rndbase_msg0_no_sigrl.inc"
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kTest0 = {
+ 't', 'e', 's', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e', 0x0};
+const std::vector<uint8_t> EpidVerifierTest::kTest1 = {'t', 'e', 's', 't', '1'};
+const std::vector<uint8_t> EpidVerifierTest::kBasename = {'b', 'a', 's', 'e',
+ 'n', 'a', 'm', 'e'};
+const std::vector<uint8_t> EpidVerifierTest::kBasename1 = {
+ 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e', '1'};
+
+const std::vector<uint8_t> EpidVerifierTest::kData_0_255 = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
+ 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
+ 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff,
+};
+const OctStr32 EpidVerifierTest::kOctStr32_1 = {0x00, 0x00, 0x00, 0x01};
+
+const GroupPubKey EpidVerifierTest::kPubKeySigRlVerify = {
+#include "epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigRlSingleEntry = {
+#include "epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigRlFiveEntries = {
+#include "epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc"
+};
+const EpidSignature EpidVerifierTest::kSignatureSigrlFirst = {
+#include "epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc"
+};
+const EpidSignature EpidVerifierTest::kSignatureSigrlMiddle = {
+#include "epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc"
+};
+const EpidSignature EpidVerifierTest::kSignatureSigrlLast = {
+#include "epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc"
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGrpRl = {
+#include "epid/common-testhelper/testdata/grprl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/grprl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpRlRevokedGrpXOnlyEntry = {
+#include "epid/common-testhelper/testdata/grprl_single_entry_revoked_grp_x.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpRlRevokedGrpXFirstEntry = {
+#include "epid/common-testhelper/testdata/grprl_revoked_grp_x_first_entry.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpRlRevokedGrpXMiddleEntry = {
+#include "epid/common-testhelper/testdata/grprl_revoked_grp_x_middle_entry.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpRlRevokedGrpXLastEntry = {
+#include "epid/common-testhelper/testdata/grprl_revoked_grp_x_last_entry.inc"
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kBsn0 = {'b', 's', 'n', '0'};
+const std::vector<uint8_t> EpidVerifierTest::kMsg0 = {'m', 's', 'g', '0'};
+
+const GroupPubKey EpidVerifierTest::kGrpXKey = {
+#include "epid/common-testhelper/testdata/grp_x/pubkey.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXPrivRl = {
+#include "epid/common-testhelper/testdata/grp_x/privrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXCorruptedPrivRl = {
+#include "epid/common-testhelper/testdata/grp_x/corrupted_privrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kPrivRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/privrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kEmptyPrivRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/privrl_empty.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kGrpXPrivRlRevokedPrivKey000OnlyEntry = {
+#include "epid/common-testhelper/testdata/grp_x/privrl_single_entry_revoked_key000.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXSigRl = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl.inc"
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGrpXSigRlVersion2 = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_ver_2.inc"
+};
+
+const std::vector<uint8_t>
+ EpidVerifierTest::kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_single_entry.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kGrpXSigRlMember0Sha256Bsn0Msg0FirstEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kGrpXSigRlMember0Sha256Bsn0Msg0MiddleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kGrpXSigRlMember0Sha256Bsn0Msg0LastEntry = {
+#include "epid/common-testhelper/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc"
+};
+
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn0Sha256VerRl = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn0Sha384VerRl = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha384.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn0Sha512VerRl = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn0Sha512256VerRl = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_sha512_256.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn0VerRlSingleEntry = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn1VerRl = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kGrpXBsn1VerRl_012 = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc"
+};
+// clang-format off
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXVerRevokedMember0Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXVerRevokedMember1Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXVerRevokedMember2Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXVerRevokedMember3Sha256Bsn1Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember0Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigMember0Sha256Bsn0Msg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigMember0Sha256Bsn0Msg0EmptySigRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_empty_sigrl.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigMember0Sha256Bsn0Msg0NoSigRlIkgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_nosigrl.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigRevSigMember0Sha256Bsn0Msg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kRevGroupSigMember0Sha256Bsn0Msg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+ EpidVerifierTest::kSigGrpXMember0Sha256Bsn0Msg0SingleEntrySigRl = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigRevokedPrivKeySha256Bsn0Msg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember0Sha256Bsn0Msg1 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember0Sha256Bsn1Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha256RandbaseMsg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigMember0Sha256RandbaseMsg0Ikgf = {
+#include "epid/common-testhelper/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha256RandbaseMsg1 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember0Sha384Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha384RandbaseMsg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc"
+};
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember0Sha512Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha512HugeBsnMsg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_huge_bsn_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha512RandbaseMsg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha512256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member0/sig_sha512_256_bsn0_msg0.inc"
+};
+const std::vector<uint8_t>
+EpidVerifierTest::kSigGrpXMember0Sha512256RandbaseMsg0 =
+ kSigGrpXMember0Sha512256RandombaseMsg0;
+const std::vector<uint8_t> EpidVerifierTest::kSigGrpXMember1Sha256Bsn0Msg0 = {
+#include "epid/common-testhelper/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc"
+};
diff --git a/epid/verifier/unittests/verifier-testhelper.h b/epid/verifier/unittests/verifier-testhelper.h
new file mode 100644
index 0000000..5e3f9f9
--- /dev/null
+++ b/epid/verifier/unittests/verifier-testhelper.h
@@ -0,0 +1,280 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Test fixture class for EpidVerifier.
+ */
+#ifndef EPID_VERIFIER_UNITTESTS_VERIFIER_TESTHELPER_H_
+#define EPID_VERIFIER_UNITTESTS_VERIFIER_TESTHELPER_H_
+
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+/// Test fixture class for EpidVerifier
+class EpidVerifierTest : public ::testing::Test {
+ public:
+ /// Serialized identity element in G1
+ static const G1ElemStr kG1IdentityStr;
+ /// test public key
+ static const GroupPubKey kPubKeyStr;
+ /// test public key from Ikgf
+ static const GroupPubKey kPubKeyIkgfStr;
+ /// test public key of revoked group from Ikgf
+ static const GroupPubKey kPubKeyRevGroupIkgfStr;
+ /// verifier pre-computation data associated with pub_key_str
+ static const VerifierPrecomp kVerifierPrecompStr;
+ /// verifier pre-computation data associated with pub_key_str from Ikgf
+ static const VerifierPrecomp kVerifierPrecompIkgfStr;
+ /// Intel(R) EPID 2.0 parameters
+ static const Epid2Params kParamsStr;
+ /// public key in Grp01
+ static const GroupPubKey kGrp01Key;
+ /// private key based revocation list in Grp01
+ static const std::vector<uint8_t> kGrp01PrivRl;
+ /// signature based revocation list in Grp01
+ static const std::vector<uint8_t> kGrp01SigRl;
+ /// signature based revocation list from Ikgf
+ static const std::vector<uint8_t> kSigRlIkgf;
+ /// empty signature based revocation list from Ikgf
+ static const std::vector<uint8_t> kEmptySigRlIkgf;
+ /// number of SigRl entries for Grp01
+ static const uint32_t kGrp01SigRlN2 = 50;
+ /// verifier revocation list in Grp01 with one entry
+ static const std::vector<uint8_t> kGrp01VerRlOneEntry;
+ /// verifier revocation list in Grp01
+ static const std::vector<uint8_t> kGrp01VerRl;
+ /// empty verifier revocation in Grp01
+ static const std::vector<uint8_t> kEmptyGrp01VerRl;
+ /// C string with a message "test message"
+ static const std::vector<uint8_t> kTest0;
+ /// the message "test1"
+ static const std::vector<uint8_t> kTest1;
+ /// the basename "basename"
+ static const std::vector<uint8_t> kBasename;
+ /// the basename "basename1"
+ static const std::vector<uint8_t> kBasename1;
+ /// a data with bytes [0,255]
+ static const std::vector<uint8_t> kData_0_255;
+ /// Signature of kData_0_255 with kBsn0 by Grp01 Member0 using Sha512
+ static const std::vector<uint8_t> kSigGrp01Member0Sha512kBsn0Data_0_255;
+ /// Signature of Test0 with RandomBase by Grp01 Member0 using Sha256
+ static const std::vector<uint8_t> kSigGrp01Member0Sha256RandombaseTest0;
+ /// Signature of Test with RandomBase, Member0 using Sha256 from Ikgf
+ static const std::vector<uint8_t> kSigMember0Sha256RandombaseMsg0Ikgf;
+ /// Signature of Test1 with RandomBase by Grp01 Member0 using Sha384
+ static const std::vector<uint8_t> kSigGrp01Member0Sha384RandombaseTest0;
+ /// Signature of Test1 with RandomBase by Grp01 Member0 using Sha512
+ static const std::vector<uint8_t> kSigGrp01Member0Sha512RandombaseTest0;
+ /// Signature of msg0 with RandomBase by GrpX Member0 using Sha512/256
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512256RandombaseMsg0;
+ /// Sig of Test1 with RandomBase by Grp01(no SigRl) Member0 using Sha256
+ static const std::vector<uint8_t>
+ kSigGrp01Member0Sha256RandombaseTest1NoSigRl;
+ /// Sig of Test1 with Basename1 by Grp01(no SigRl) Member0 using Sha256
+ static const std::vector<uint8_t> kSigGrp01Member0Sha256Basename1Test1NoSigRl;
+ /// Sig of Test1 with Basename1 by Member0 using Sha256 from Ikgf
+ static const std::vector<uint8_t> kSigSha256Basename1Test1NoSigRlIkgf;
+ /// Sig of Test1 with RandomBase by Grp01(no SigRl) Member0 using Sha384
+ static const std::vector<uint8_t>
+ kSigGrp01Member0Sha384RandombaseTest1NoSigRl;
+ /// Sig of Test1 with RandomBase by Grp01(no SigRl) Member0 using Sha512
+ static const std::vector<uint8_t>
+ kSigGrp01Member0Sha512RandombaseTest1NoSigRl;
+ /// Sig of msg0 with RandomBase by GrpX(no SigRl) Member0 using Sha512/256
+ static const std::vector<uint8_t>
+ kSigGrpXMember0Sha512256RandombaseMsg0NoSigRl;
+ /// group based rl test data (empty rl)
+ static const std::vector<uint8_t> kGroupRlEmptyBuf;
+ /// group based rl test data (v=3, n=3, 3 revoked gid)
+ static const std::vector<uint8_t> kGroupRl3GidBuf;
+ /// group based rl test data (v=3, n=0, 3 revoked gid)
+ static const std::vector<uint8_t> kGroupRl3GidN0Buf;
+ /// group based rl test data (v=3, n=2, 3 revoked gid)
+ static const std::vector<uint8_t> kGroupRl3GidN2Buf;
+ /// group based rl test data (v=3, n=4, 3 revoked gid)
+ static const std::vector<uint8_t> kGroupRl3GidN4Buf;
+ /// a message
+ static const std::vector<uint8_t> kMsg0;
+ /// a message
+ static const std::vector<uint8_t> kMsg1;
+ /// a basename
+ static const std::vector<uint8_t> kBsn0;
+ /// a basename
+ static const std::vector<uint8_t> kBsn1;
+
+ /// a group revocation list
+ static const std::vector<uint8_t> kGrpRl;
+ /// a group revocation list from Ikgf
+ static const std::vector<uint8_t> kGrpRlIkgf;
+ /// a group revocation list with single group revoked
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXOnlyEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXFirstEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXMiddleEntry;
+ /// a group revocation list with multiple entries
+ static const std::vector<uint8_t> kGrpRlRevokedGrpXLastEntry;
+ /// private key based revocation list from Ikgf
+ static const std::vector<uint8_t> kPrivRlIkgf;
+ /// empty private key based revocation list from Ikgf
+ static const std::vector<uint8_t> kEmptyPrivRlIkgf;
+
+ /// a group key in group X
+ static const GroupPubKey kGrpXKey;
+ /// the privrl of group X
+ static const std::vector<uint8_t> kGrpXPrivRl;
+ /// currpted privrl of group X
+ static const std::vector<uint8_t> kGrpXCorruptedPrivRl;
+ /// the privrl of group X with single entry PrivKey000 revoked
+ static const std::vector<uint8_t> kGrpXPrivRlRevokedPrivKey000OnlyEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRl;
+ /// a verifierrl of group X with bsn0 and SHA256 for some verifier
+ static const std::vector<uint8_t> kGrpXBsn0Sha256VerRl;
+ /// a verifierrl of group X with bsn0 and SHA384 for some verifier
+ static const std::vector<uint8_t> kGrpXBsn0Sha384VerRl;
+ /// a verifierrl of group X with bsn0 and SHA512 for some verifier
+ static const std::vector<uint8_t> kGrpXBsn0Sha512VerRl;
+ /// a verifierrl of group X with bsn0 and SHA512/256 for some verifier
+ static const std::vector<uint8_t> kGrpXBsn0Sha512256VerRl;
+ /// a verifierrl of group X with bsn0 for some verifier with single entry
+ static const std::vector<uint8_t> kGrpXBsn0VerRlSingleEntry;
+ /// a verifierrl of group X with bsn1 for some verifier
+ static const std::vector<uint8_t> kGrpXBsn1VerRl;
+ /// a verifierrl of group X with bsn1 for some verifier with 0-2 revoked
+ static const std::vector<uint8_t> kGrpXBsn1VerRl_012;
+
+ /// the sigrl of group X corrputed
+ static const std::vector<uint8_t> kGrpXSigRlVersion2;
+
+ /// a group key in group Y
+ static const GroupPubKey kGrpYKey;
+ /// the privrl of group Y
+ static const std::vector<uint8_t> kGrpYPrivRl;
+ /// the sigrl of group Y
+ static const std::vector<uint8_t> kGrpYSigRl;
+ /// a verifierrl of group Y for some verifier
+ static const std::vector<uint8_t> kGrpYVerRl;
+
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Sha256Bsn0Msg0FirstEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Sha256Bsn0Msg0MiddleEntry;
+ /// the sigrl of group X
+ static const std::vector<uint8_t> kGrpXSigRlMember0Sha256Bsn0Msg0LastEntry;
+
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg0;
+ /// signature of msg0 by member0 with Sha256 bsn0 from Ikgf
+ static const std::vector<uint8_t> kSigMember0Sha256Bsn0Msg0Ikgf;
+ /// signature of msg0 by member0 with Sha256 bsn0 from Ikgf with empty SigRl
+ static const std::vector<uint8_t> kSigMember0Sha256Bsn0Msg0EmptySigRlIkgf;
+ /// signature of msg0 by member0 with Sha256 bsn0 from Ikgf without SigRl
+ static const std::vector<uint8_t> kSigMember0Sha256Bsn0Msg0NoSigRlIkgf;
+ /// signature of msg0 by member0 from SigRl first entry with Sha256 bsn0 from
+ /// Ikgf
+ static const std::vector<uint8_t> kSigRevSigMember0Sha256Bsn0Msg0Ikgf;
+ /// signature of msg0 by member0 from revoked Group with Sha256 bsn0 from Ikgf
+ static const std::vector<uint8_t> kRevGroupSigMember0Sha256Bsn0Msg0Ikgf;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 single entry sigrl
+ static const std::vector<uint8_t>
+ kSigGrpXMember0Sha256Bsn0Msg0SingleEntrySigRl;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 with revoked key
+ /// 000
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+ /// signature of msg0 by member0 with Sha256 bsn0 with revoked key from Ikgf
+ static const std::vector<uint8_t> kSigRevokedPrivKeySha256Bsn0Msg0Ikgf;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 with revoked key
+ /// 001
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn0 with revoked key
+ /// 002
+ static const std::vector<uint8_t> kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0;
+ /// signature of msg1 by member0 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn0Msg1;
+ /// signature of msg0 by member0 of groupX with Sha256 bsn1
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256Bsn1Msg0;
+ /// signature of msg0 by member0 of groupX with Sha256 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256RandbaseMsg0;
+ /// signature of msg0 by member0 of groupA with Sha256 rnd base
+ static const std::vector<uint8_t> kSigMember0Sha256RandbaseMsg0Ikgf;
+ /// signature of msg1 by member0 of groupX with Sha256 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha256RandbaseMsg1;
+ /// signature of msg0 by member0 of groupX with Sha384 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha384Bsn0Msg0;
+ /// signature of msg0 by member0 of groupX with Sha384 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha384RandbaseMsg0;
+ /// signature of msg0 by member0 of groupX with Sha512 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512Bsn0Msg0;
+ /// signature of msg0 by member0 of groupX with Sha512 huge bsn
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512HugeBsnMsg0;
+ /// signature of msg0 by member0 of groupX with Sha512 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512RandbaseMsg0;
+ /// signature of msg0 by member0 of groupX with Sha512256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512256Bsn0Msg0;
+ /// signature of msg0 by member0 of groupX with Sha512256 rnd base
+ static const std::vector<uint8_t> kSigGrpXMember0Sha512256RandbaseMsg0;
+
+ /// signature of msg0 by verrevokedmember0 of groupX Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXVerRevokedMember0Sha256Bsn0Msg0;
+ /// signature of msg0 by verrevokedmember1 of groupX Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXVerRevokedMember1Sha256Bsn0Msg0;
+ /// signature of msg0 by verrevokedmember2 of groupX Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXVerRevokedMember2Sha256Bsn0Msg0;
+ /// signature of msg0 by verrevokedmember3 of groupX Sha256 bsn1
+ static const std::vector<uint8_t> kSigGrpXVerRevokedMember3Sha256Bsn1Msg0;
+ /// signature of msg0 by member1 of groupX with Sha256 bsn0
+ static const std::vector<uint8_t> kSigGrpXMember1Sha256Bsn0Msg0;
+
+ /////////////////////////////////////////////////////////////////////
+ // EpidVerify Signature Based Revocation List Reject
+ /// GroupPubKey to be used for EpidVerify Signature Based Revocation List
+ /// Reject tests
+ static const GroupPubKey kPubKeySigRlVerify;
+ /// SigRl with 1 entry
+ static const std::vector<uint8_t> kSigRlSingleEntry;
+ /// SigRl with 1 entry
+ static const std::vector<uint8_t> kSigRlFiveEntries;
+ /// First entry in sigrl_five_entries
+ static const EpidSignature kSignatureSigrlFirst;
+ /// Middle entry in sigrl_five_entries
+ static const EpidSignature kSignatureSigrlMiddle;
+ /// Last entry in sigrl_five_entries
+ static const EpidSignature kSignatureSigrlLast;
+
+ /// setup called before each TEST_F starts
+ virtual void SetUp() {}
+ /// teardown called after each TEST_F finishes
+ virtual void TearDown() {}
+
+ /// value "1" represented as an octstr constant
+ /*!
+ this value is used frequently to set 32 bit fields. describing as a constant
+ here to reduce replication in code.
+ */
+ static const OctStr32 kOctStr32_1;
+};
+
+#endif // EPID_VERIFIER_UNITTESTS_VERIFIER_TESTHELPER_H_
diff --git a/epid/verifier/unittests/verify-test.cc b/epid/verifier/unittests/verify-test.cc
new file mode 100644
index 0000000..d221742
--- /dev/null
+++ b/epid/verifier/unittests/verify-test.cc
@@ -0,0 +1,1317 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verify unit tests.
+ */
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/common/src/endian_convert.h"
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+namespace {
+
+/////////////////////////////////////////////////////////////////////////
+// Simple Errors
+
+TEST_F(EpidVerifierTest, VerifyFailsGivenNullParameters) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+ auto& msg = this->kTest0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(nullptr, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, nullptr, sig.size(), msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ nullptr, msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyFailsGivenTooShortSigLen) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+ auto& msg = this->kTest0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), 0,
+ msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(),
+ sizeof(EpidSignature) - sizeof(NrProof) - 1, msg.data(),
+ msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyFailsGivenSigLenTooShortForRlCount) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidVerifierSetSigRl(verifier, (SigRl const*)this->kGrp01SigRl.data(),
+ this->kGrp01SigRl.size());
+ auto sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+ auto n2 = this->kGrp01SigRlN2;
+ sig.resize(sizeof(EpidSignature) +
+ (n2 - 2) * sizeof(((EpidSignature*)0)->sigma));
+ auto& msg = this->kTest0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyFailsGivenSigLenTooLongForRlCount) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidVerifierSetSigRl(verifier, (SigRl const*)this->kGrp01SigRl.data(),
+ this->kGrp01SigRl.size());
+ auto sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+ auto n2 = this->kGrp01SigRlN2;
+ sig.resize(sizeof(EpidSignature) + n2 * sizeof(((EpidSignature*)0)->sigma));
+ auto& msg = this->kTest0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+#if (SIZE_MAX <= 0xFFFFFFFF) // When size_t value is 32 bit or lower
+TEST_F(EpidVerifierTest, VerifyFailsGivenRlCountTooBig) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ EpidVerifierSetSigRl(verifier, (SigRl const*)this->kGrp01SigRl.data(),
+ this->kGrp01SigRl.size());
+ auto sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+ uint32_t n2 = SIZE_MAX / sizeof(NrProof) + 1;
+ uint32_t n2_ = ntohl(n2);
+ EpidSignature* sig_struct = (EpidSignature*)sig.data();
+ sig_struct->n2 = *(OctStr32*)&n2_;
+ sig.resize(sizeof(EpidSignature) + (n2 - 1) * sizeof(NrProof));
+ auto& msg = this->kTest0;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+#endif
+
+/////////////////////////////////////////////////////////////////////
+//
+// 4.1.2 step 1 - The verifier reads the pre-computed (e12, e22, e2w, eg12).
+// Refer to Section 3.6 for the computation of these values.
+// This Step is not testable
+
+/////////////////////////////////////////////////////////////////////
+// Non-Revocation List Reject
+// 4.1.2 step 2 - The verifier verifies the basic signature Sigma0 as
+// follows:
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithBNotInG1) {
+ // * 4.1.2 step 2.a - The verifier verifies G1.inGroup(B) = true.
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.B.x.data.data[31]++;
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithBIdentityOfG1) {
+ // * 4.1.2 step 2.b - The verifier verifies that G1.isIdentity(B) is false.
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.B = this->kG1IdentityStr;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithDiffBaseNameSameHashAlg) {
+ // * 4.1.2 step 2.c - If bsn is provided, the verifier verifies
+ // B = G1.hash(bsn).
+ // result must be kEpidSigInvalid
+ auto& pub_key = this->kGrpXKey;
+ auto& sig = this->kSigGrpXMember0Sha512Bsn0Msg0;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBasename1;
+
+ VerifierCtxObj verifier(pub_key);
+
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithSameBaseNameDiffHashAlg) {
+ // * 4.1.2 step 2.c - If bsn is provided, the verifier verifies
+ // B = G1.hash(bsn).
+ // result must be kEpidSigInvalid
+ auto& pub_key = this->kGrpXKey;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithDifferentHugeBaseName) {
+ // * 4.1.2 step 2.c - If bsn is provided, the verifier verifies
+ // B = G1.hash(bsn).
+ // result must be kEpidSigInvalid
+ auto& pub_key = this->kGrpXKey;
+ auto& sig = this->kSigGrpXMember0Sha512HugeBsnMsg0;
+ auto& msg = this->kMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024);
+ uint8_t c = 0;
+ for (size_t i = 0; i < bsn.size(); ++i) {
+ // change middle kilobyte
+ if (i == 512 * 1024) c++;
+ if (i == 513 * 1024) c--;
+ bsn[i] = c++;
+ }
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithKNotInG1) {
+ // * 4.1.2 step 2.d - The verifier verifies G1.inGroup(K) = true.
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.K.x.data.data[31]++;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithTNotInG1) {
+ // * 4.1.2 step 2.e - The verifier verifies G1.inGroup(T) = true.
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.T.x.data.data[31]++;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithCNotInRange) {
+ // * 4.1.2 step 2.f - The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.c.data = this->kParamsStr.p.data;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithSxNotInRange) {
+ // * 4.1.2 step 2.f - The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.sx.data = this->kParamsStr.p.data;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithSfNotInRange) {
+ // * 4.1.2 step 2.f - The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.sf.data = this->kParamsStr.p.data;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithSaNotInRange) {
+ // * 4.1.2 step 2.f - The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.sa.data = this->kParamsStr.p.data;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigWithSbNotInRange) {
+ // * 4.1.2 step 2.f - The verifier verifies c, sx, sf, sa, sb in [0, p-1].
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+
+ EpidSignature sig = *(
+ const EpidSignature*)(this->kSigGrp01Member0Sha512RandombaseTest0.data());
+ sig.sigma0.sb.data = this->kParamsStr.p.data;
+ size_t size = this->kSigGrp01Member0Sha512RandombaseTest0.size();
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, &sig, size, msg.data(), msg.size()));
+}
+
+// 4.1.2 step 2.g - The verifier computes nc = (-c) mod p.
+// This Step is not testable
+
+// 4.1.2 step 2.h - The verifier computes nsx = (-sx) mod p.
+// This Step is not testable
+
+// 4.1.2 step 2.i - The verifier computes R1 = G1.multiExp(B, sf, K, nc).
+// This Step is not testable
+
+// 4.1.2 step 2.j - The verifier computes t1 = G2.multiExp(g2, nsx, w, nc).
+// This Step is not testable
+
+// 4.1.2 step 2.k - The verifier computes R2 = pairing(T, t1).
+// This Step is not testable
+
+// 4.1.2 step 2.l - The verifier compute t2 = GT.multiExp(e12, sf, e22, sb,
+// e2w, sa, eg12, c).
+// This Step is not testable
+
+// 4.1.2 step 2.m - The verifier compute R2 = GT.mul(R2, t2).
+// This Step is not testable
+
+// 4.1.2 step 2.n - The verifier compute t3 = Fp.hash(p || g1 || g2 || h1
+// || h2 || w || B || K || T || R1 || R2).
+// Refer to Section 7.1 for hash operation over a prime
+// field.
+// This Step is not testable
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigDifferingOnlyInMsg) {
+ // * 4.1.2 step 2.o - The verifier verifies c = Fp.hash(t3 || m).
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& sig = this->kSigGrp01Member0Sha512RandombaseTest0;
+
+ auto msg = this->kTest0;
+ msg[0]++;
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigDifferingOnlyInBaseName) {
+ // * 4.1.2 step 2.o - The verifier verifies c = Fp.hash(t3 || m).
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrpXKey);
+
+ // copy sig data to a local buffer
+ auto sig_data = this->kSigGrpXMember0Sha512Bsn0Msg0;
+ EpidSignature* sig = (EpidSignature*)sig_data.data();
+ // simulate change to basename
+ sig->sigma0.B.x.data.data[0] += 1;
+ auto msg = this->kMsg0;
+ auto bsn = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, sig, sig_data.size(), msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigDifferingOnlyInGroup) {
+ // * 4.1.2 step 2.o - The verifier verifies c = Fp.hash(t3 || m).
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrpXKey);
+
+ // copy sig data to a local buffer
+ auto sig_data = this->kSigGrpXMember0Sha512RandbaseMsg0;
+ EpidSignature* sig = (EpidSignature*)sig_data.data();
+ // simulate change to h1
+ sig->sigma0.T.x.data.data[0] += 1;
+ auto msg = this->kMsg0;
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, sig, sig_data.size(), msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigDifferingOnlyInHashAlg) {
+ // * 4.1.2 step 2.o - The verifier verifies c = Fp.hash(t3 || m).
+ // result must be kEpidSigInvalid
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto& msg = this->kTest0;
+ auto& sig = this->kSigGrp01Member0Sha256RandombaseTest0;
+
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+// 4.1.2 step 2.p - If any of the above verifications fails, the verifier
+// aborts and outputs 1.
+// This Step is an aggregate of the above steps
+
+/////////////////////////////////////////////////////////////////////
+// Group Based Revocation List Reject
+// 4.1.2 step 3 - If GroupRL is provided
+
+TEST_F(EpidVerifierTest, VerifyRejectsFromGroupRlSingleEntry) {
+ // * 4.1.2 step 3.a - The verifier verifies that gid does not match any entry
+ // in GroupRL.
+ // result must be kEpidSigRevokedInGroupRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXOnlyEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsFromGroupRlFirstEntry) {
+ // * 4.1.2 step 3.a - The verifier verifies that gid does not match any entry
+ // in GroupRL.
+ // result must be kEpidSigRevokedInGroupRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXFirstEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsFromGroupRlFirstEntryUsingIkgfData) {
+ // result must be kEpidSigRevokedInGroupRl
+ auto& pub_key = this->kPubKeyRevGroupIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlIkgf;
+ auto& sig = this->kRevGroupSigMember0Sha256Bsn0Msg0Ikgf;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsFromGroupRlMiddleEntry) {
+ // * 4.1.2 step 3.a - The verifier verifies that gid does not match any entry
+ // in GroupRL.
+ // result must be kEpidSigRevokedInGroupRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXMiddleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsFromGroupRlLastEntry) {
+ // * 4.1.2 step 3.a - The verifier verifies that gid does not match any entry
+ // in GroupRL.
+ // result must be kEpidSigRevokedInGroupRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRlRevokedGrpXLastEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInGroupRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+// 4.1.2 step 3.b - If gid matches an entry in GroupRL, aborts and returns 2.
+// This Step is an aggregate of the above steps
+
+/////////////////////////////////////////////////////////////////////
+// Private Based Revocation List Reject
+// 4.1.2 step 4 - If PrivRL is provided
+
+// * 4.1.2 step 4.a - The verifier verifies that gid in the public key and in
+// PrivRL match. If mismatch, abort and return
+// "operation failed".
+// Not possible, checked in EpidVerifierSetPrivRl
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromPrivRlSingleEntry) {
+ // * 4.1.2 step 4.b - For i = 0, ?, n1-1,
+ // the verifier computes t4 =G1.exp(B, f[i])
+ // and verifies that G1.isEqual(t4, K) = false.
+ // A faster private-key revocation check algorithm is
+ // provided in Section 4.5.
+ // result must be kEpidSigRevokedInPrivRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRlRevokedPrivKey000OnlyEntry;
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromPrivRlFirstEntry) {
+ // * 4.1.2 step 4.b - For i = 0, ?, n1-1,
+ // the verifier computes t4 =G1.exp(B, f[i])
+ // and verifies that G1.isEqual(t4, K) = false.
+ // A faster private-key revocation check algorithm is
+ // provided in Section 4.5.
+ // result must be kEpidSigRevokedInPrivRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey000Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromPrivRlFirstEntryUsingIkgfData) {
+ // * 4.1.2 step 4.b - For i = 0, ?, n1-1,
+ // the verifier computes t4 =G1.exp(B, f[i])
+ // and verifies that G1.isEqual(t4, K) = false.
+ // A faster private-key revocation check algorithm is
+ // provided in Section 4.5.
+ // result must be kEpidSigRevokedInPrivRl
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kPrivRlIkgf;
+ auto& sig = this->kSigRevokedPrivKeySha256Bsn0Msg0Ikgf;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromPrivRlMiddleEntry) {
+ // * 4.1.2 step 4.b - For i = 0, ?, n1-1,
+ // the verifier computes t4 =G1.exp(B, f[i])
+ // and verifies that G1.isEqual(t4, K) = false.
+ // A faster private-key revocation check algorithm is
+ // provided in Section 4.5.
+ // result must be kEpidSigRevokedInPrivRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey001Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromPrivRlLastEntry) {
+ // * 4.1.2 step 4.b - For i = 0, ?, n1-1,
+ // the verifier computes t4 =G1.exp(B, f[i])
+ // and verifies that G1.isEqual(t4, K) = false.
+ // A faster private-key revocation check algorithm is
+ // provided in Section 4.5.
+ // result must be kEpidSigRevokedInPrivRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig = this->kSigGrpXRevokedPrivKey002Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigUsingCorruptedPrivRlEntry) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kGrpXCorruptedPrivRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInPrivRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigFromEmptyPrivRlUsingIkgfData) {
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& priv_rl = this->kEmptyPrivRlIkgf;
+ auto& sig = this->kSigMember0Sha256Bsn0Msg0NoSigRlIkgf;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+
+ EXPECT_EQ(kEpidNoErr, EpidVerify(verifier, (EpidSignature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+// 4.1.2 step 4.c - If the above step fails, the verifier aborts and
+// output 3.
+// This Step is an aggregate of the above steps
+
+/////////////////////////////////////////////////////////////////////
+// Signature Based Revocation List Reject
+// 4.1.2 step 5 - If SigRL is provided
+
+// * 4.1.2 step 5.a - The verifier verifies that gid in the public key and in
+// SigRL match. If mismatch, abort and return
+// "operation failed".
+// Not possible, checked in EpidVerifierSetSigRl
+
+TEST_F(EpidVerifierTest, VerifyFailsOnSigRlverNotMatchSigRlRlver) {
+ // * 4.1.2 step 5.b - The verifier verifies that RLver in Sigma and in SigRL
+ // match. If mismatch, abort and output "operation failed".
+ // result must be "operation failed" (not kEpidSig*)
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlVersion2;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidErr, EpidVerify(verifier, (EpidSignature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyFailsOnSigN2NotMatchSigRlN2) {
+ // * 4.1.2 step 5.c - The verifier verifies that n2 in Sigma and in SigRL
+ // match. If mismatch, abort and output "operation failed".
+ // result must be "operation failed" (not kEpidSig*)
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto* sig_rl =
+ (SigRl const*)this->kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry.data();
+ size_t sig_rl_size = this->kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry.size();
+ auto sig_raw = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ EpidSignature* sig = (EpidSignature*)sig_raw.data();
+ sig->rl_ver = sig_rl->version;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, sig_rl, sig_rl_size));
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerify(verifier, sig, sig_raw.size(), msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromSigRlSingleEntry) {
+ // * 4.1.2 step 5.d - For i = 0, ..., n2-1, the verifier verifies
+ // nrVerify(B, K, B[i], K[i], Sigma[i]) = true. The details
+ // of nrVerify() will be given in the next subsection.
+ // result must be kEpidSigRevokedInSigRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Sha256Bsn0Msg0OnlyEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0SingleEntrySigRl;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromSigRlFirstEntry) {
+ // * 4.1.2 step 5.d - For i = 0, ..., n2-1, the verifier verifies
+ // nrVerify(B, K, B[i], K[i], Sigma[i]) = true. The details
+ // of nrVerify() will be given in the next subsection.
+ // result must be kEpidSigRevokedInSigRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Sha256Bsn0Msg0FirstEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromSigRlFirstEntryUsingIkgfData) {
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kSigRlIkgf;
+ auto& sig = this->kSigRevSigMember0Sha256Bsn0Msg0Ikgf;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromSigRlMiddleEntry) {
+ // * 4.1.2 step 5.d - For i = 0, ..., n2-1, the verifier verifies
+ // nrVerify(B, K, B[i], K[i], Sigma[i]) = true. The details
+ // of nrVerify() will be given in the next subsection.
+ // result must be kEpidSigRevokedInSigRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Sha256Bsn0Msg0MiddleEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromSigRlLastEntry) {
+ // * 4.1.2 step 5.d - For i = 0, ..., n2-1, the verifier verifies
+ // nrVerify(B, K, B[i], K[i], Sigma[i]) = true. The details
+ // of nrVerify() will be given in the next subsection.
+ // result must be kEpidSigRevokedInSigRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kGrpXSigRlMember0Sha256Bsn0Msg0LastEntry;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInSigRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest,
+ RejectsSigFromNonemptySigRlGivenEmptySigRlUsingIkgfData) {
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kEmptySigRlIkgf;
+ auto& sig = this->kSigMember0Sha256Bsn0Msg0Ikgf;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidErr, EpidVerify(verifier, (EpidSignature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigFromEmptySigRlUsingIkgfData) {
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& sig_rl = this->kEmptySigRlIkgf;
+ auto& sig = this->kSigMember0Sha256Bsn0Msg0EmptySigRlIkgf;
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidNoErr, EpidVerify(verifier, (EpidSignature const*)sig.data(),
+ sig.size(), msg.data(), msg.size()));
+}
+
+// 4.1.2 step 5.e - If the above step fails, the verifier aborts and
+// output 4.
+// This Step is an aggregate of the above steps
+
+/////////////////////////////////////////////////////////////////////
+// Verifier Based Revocation List Reject
+// 4.1.2 step 6 - If VerifierRL is provided
+
+// * 4.1.2 step 6.a - The verifier verifies that gid in the public key and in
+// VerifierRL match. If mismatch, abort and return
+// "operation failed".
+// Not possible, checked in EpidVerifierSetVerifierRl
+
+// * 4.1.2 step 6.b - The verifier verifies that B in the signature and in
+// VerifierRL match. If mismatch, go to step 7.
+// result must be "operation failed" (not kEpidSig*)
+// Not possible, checked in EpidVerifierSetVerifierRl
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromVerifierRlSingleEntry) {
+ // * 4.1.2 step 6.c - For i = 0, ..., n4-1, the verifier verifies that
+ // K != K[i].
+ // result must be kEpidSigRevokedInVerifierRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0VerRlSingleEntry;
+ auto& sig = this->kSigGrpXVerRevokedMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInVerifierRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromVerifierRlFirstEntry) {
+ // * 4.1.2 step 6.c - For i = 0, ..., n4-1, the verifier verifies that
+ // K != K[i].
+ // result must be kEpidSigRevokedInVerifierRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha256VerRl;
+ auto& sig = this->kSigGrpXVerRevokedMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInVerifierRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromVerifierRlMiddleEntry) {
+ // * 4.1.2 step 6.c - For i = 0, ..., n4-1, the verifier verifies that
+ // K != K[i].
+ // result must be kEpidSigRevokedInVerifierRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha256VerRl;
+ auto& sig = this->kSigGrpXVerRevokedMember1Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInVerifierRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyRejectsSigFromVerifierRlLastEntry) {
+ // * 4.1.2 step 6.c - For i = 0, ..., n4-1, the verifier verifies that
+ // K != K[i].
+ // result must be kEpidSigRevokedInVerifierRl
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha256VerRl;
+ auto& sig = this->kSigGrpXVerRevokedMember2Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigRevokedInVerifierRl,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+// 4.1.2 step 6.d - If the above step fails, the verifier aborts and
+// output 5
+// This Step is an aggregate of the above steps
+
+/////////////////////////////////////////////////////////////////////
+// Accept
+// 4.1.2 step 7 - If all the above verifications succeed, the verifier
+// outputs 0
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithBaseNameNoRlSha256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithBaseNameAllRlSha256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha256VerRl;
+ auto& sig = this->kSigGrpXMember0Sha256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithRandomBaseNameNoRlSha256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+ auto& msg = this->kMsg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithRandomBaseNameAllRlSha256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& sig = this->kSigGrpXMember0Sha256RandbaseMsg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest,
+ VerifyAcceptsSigWithRandomBaseNameAllRlSha256UsingIkgfData) {
+ auto& pub_key = this->kPubKeyIkgfStr;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGrpRlIkgf;
+ auto& priv_rl = this->kPrivRlIkgf;
+ auto& sig_rl = this->kSigRlIkgf;
+ auto& sig = this->kSigMember0Sha256RandbaseMsg0Ikgf;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithBaseNameAllRlSha384) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha384VerRl;
+ auto& sig = this->kSigGrpXMember0Sha384Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithRandomBaseNameAllRlSha384) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& sig = this->kSigGrpXMember0Sha384RandbaseMsg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithBaseNameAllRlSha512) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha512VerRl;
+ auto& sig = this->kSigGrpXMember0Sha512Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithHugeBaseNameNoRlSha512) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& sig = this->kSigGrpXMember0Sha512HugeBsnMsg0;
+ std::vector<uint8_t> bsn(1024 * 1024);
+ uint8_t c = 0;
+ for (int i = 0; i < 1024 * 1024; ++i) {
+ bsn[i] = c++;
+ }
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithRandomBaseNameAllRlSha512) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& sig = this->kSigGrpXMember0Sha512RandbaseMsg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithBaseNameAllRlSha512256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& ver_rl = this->kGrpXBsn0Sha512256VerRl;
+ auto& sig = this->kSigGrpXMember0Sha512256Bsn0Msg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetVerifierRl(
+ verifier, (VerifierRl const*)ver_rl.data(), ver_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigWithRandomBaseNameAllRlSha512256) {
+ auto& pub_key = this->kGrpXKey;
+ auto& msg = this->kMsg0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrpXPrivRl;
+ auto& sig_rl = this->kGrpXSigRl;
+ auto& sig = this->kSigGrpXMember0Sha512256RandbaseMsg0;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyAcceptsSigGivenMsgContainingAllPossibleBytes) {
+ auto& pub_key = this->kPubKeySigRlVerify;
+ auto& msg = this->kData_0_255;
+ auto& bsn = this->kBsn0;
+ auto& grp_rl = this->kGrpRl;
+ auto& priv_rl = this->kGrp01PrivRl;
+ std::vector<uint8_t> sig_rl = {
+ // gid
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2A,
+ // version
+ 0x00, 0x00, 0x00, 0x00,
+ // n2
+ 0x00, 0x00, 0x00, 0x01,
+ // bk's
+ 0x9c, 0xa5, 0xe5, 0xae, 0x5f, 0xae, 0x51, 0x59, 0x33, 0x35, 0x27, 0xd,
+ 0x8, 0xb1, 0xbe, 0x5d, 0x69, 0x50, 0x84, 0xc5, 0xfe, 0xe2, 0x87, 0xea,
+ 0x2e, 0xef, 0xfa, 0xee, 0x67, 0xf2, 0xd8, 0x28, 0x56, 0x43, 0xc6, 0x94,
+ 0x67, 0xa6, 0x72, 0xf6, 0x41, 0x15, 0x4, 0x58, 0x42, 0x16, 0x88, 0x57,
+ 0x9d, 0xc7, 0x71, 0xd1, 0xc, 0x84, 0x13, 0xa, 0x90, 0x23, 0x18, 0x8, 0xad,
+ 0x7d, 0xfe, 0xf5, 0xc8, 0xae, 0xfc, 0x51, 0x40, 0xa7, 0xd1, 0x28, 0xc2,
+ 0x89, 0xb2, 0x6b, 0x4e, 0xb4, 0xc1, 0x55, 0x87, 0x98, 0xbd, 0x72, 0xf9,
+ 0xcf, 0xd, 0x40, 0x15, 0xee, 0x32, 0xc, 0xf3, 0x56, 0xc5, 0xc, 0x61, 0x9d,
+ 0x4f, 0x7a, 0xb5, 0x2b, 0x16, 0xa9, 0xa3, 0x97, 0x38, 0xe2, 0xdd, 0x3a,
+ 0x33, 0xad, 0xf6, 0x7b, 0x68, 0x8b, 0x68, 0xcf, 0xa3, 0xd3, 0x98, 0x37,
+ 0xce, 0xec, 0xd1, 0xa8, 0xc, 0x8b,
+ };
+ auto& sig = this->kSigGrp01Member0Sha512kBsn0Data_0_255;
+
+ VerifierCtxObj verifier(pub_key);
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(EpidVerifierSetBasename(verifier, bsn.data(), bsn.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetGroupRl(
+ verifier, (GroupRl const*)grp_rl.data(), grp_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetPrivRl(
+ verifier, (PrivRl const*)priv_rl.data(), priv_rl.size()));
+ THROW_ON_EPIDERR(EpidVerifierSetSigRl(verifier, (SigRl const*)sig_rl.data(),
+ sig_rl.size()));
+
+ EXPECT_EQ(kEpidSigValid,
+ EpidVerify(verifier, (EpidSignature const*)sig.data(), sig.size(),
+ msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/verifier/unittests/verifybasic-test.cc b/epid/verifier/unittests/verifybasic-test.cc
new file mode 100644
index 0000000..20c1bac
--- /dev/null
+++ b/epid/verifier/unittests/verifybasic-test.cc
@@ -0,0 +1,179 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief VerifyBasicSig unit tests.
+ */
+
+#include <cstring>
+#include <vector>
+
+#include "epid/common-testhelper/epid_gtest-testhelper.h"
+#include "gtest/gtest.h"
+
+extern "C" {
+#include "epid/verifier/api.h"
+}
+
+#include "epid/common-testhelper/errors-testhelper.h"
+#include "epid/common-testhelper/verifier_wrapper-testhelper.h"
+#include "epid/member/unittests/member-testhelper.h"
+#include "epid/verifier/unittests/verifier-testhelper.h"
+
+namespace {
+
+TEST_F(EpidVerifierTest, VerifyBasicSigFailsGivenNullPtr) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha256RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifyBasicSig(nullptr, &basic_sig, msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifyBasicSig(verifier, nullptr, msg.data(), msg.size()));
+ EXPECT_EQ(kEpidBadArgErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, nullptr, msg.size()));
+}
+
+TEST_F(EpidVerifierTest,
+ VerifyBasicSigCanVerifyValidSignatureWithSHA512AsDefault) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha512RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyValidSignatureWithSHA256) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha256RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyValidSignatureWithSHA384) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha384RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyValidSignatureWithSHA512) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha512RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyValidSignatureWithSHA512256) {
+ VerifierCtxObj verifier(this->kGrpXKey);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrpXMember0Sha512256RandombaseMsg0NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kMsg0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest,
+ VerifyBasicSigDetectsInvalidSignatureGivenMatchingMessage) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha256RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+ BasicSignature corrupted_basic_sig = basic_sig;
+ corrupted_basic_sig.B.x.data.data[0]++;
+ EXPECT_NE(kEpidNoErr, EpidVerifyBasicSig(verifier, &corrupted_basic_sig,
+ msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest,
+ VerifyBasicSigDetectsInvalidSignatureGivenMessageMismatch) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha256RandombaseTest1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto msg = this->kTest1;
+ msg[0]++; // change message for signature verification to fail
+ EXPECT_EQ(kEpidSigInvalid,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyWithBasename) {
+ VerifierCtxObj verifier(this->kGrp01Key);
+ auto const& sig = (EpidSignature const*)this
+ ->kSigGrp01Member0Sha256Basename1Test1NoSigRl.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+ auto& basename = this->kBasename1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(verifier, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyWithBasenameUsingIkgfData) {
+ VerifierCtxObj verifier(this->kPubKeyIkgfStr);
+ auto const& sig =
+ (EpidSignature const*)this->kSigSha256Basename1Test1NoSigRlIkgf.data();
+ const BasicSignature basic_sig = sig->sigma0;
+ auto& msg = this->kTest1;
+ auto& basename = this->kBasename1;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(verifier, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+TEST_F(EpidVerifierTest, VerifyBasicSigCanVerifyMsgContainingAllPossibleBytes) {
+ VerifierCtxObj verifier(this->kPubKeySigRlVerify);
+ auto const& sig =
+ (EpidSignature const*)this->kSigGrp01Member0Sha512kBsn0Data_0_255.data();
+ const BasicSignature basic_sig = sig->sigma0;
+
+ auto& msg = this->kData_0_255;
+ auto& basename = this->kBsn0;
+ THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
+ THROW_ON_EPIDERR(
+ EpidVerifierSetBasename(verifier, basename.data(), basename.size()));
+ EXPECT_EQ(kEpidNoErr,
+ EpidVerifyBasicSig(verifier, &basic_sig, msg.data(), msg.size()));
+}
+
+} // namespace
diff --git a/epid/verifier/verifier.parts b/epid/verifier/verifier.parts
new file mode 100644
index 0000000..2671811
--- /dev/null
+++ b/epid/verifier/verifier.parts
@@ -0,0 +1,120 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+env.PartName('verifier')
+
+api_headers = Pattern(src_dir='.',
+ includes=['*.h'],
+ recursive=False).files()
+src_files = Pattern(src_dir='src',
+ includes=['*.c'],
+ recursive=False).files()
+internal_headers = Pattern(src_dir='src',
+ includes=['*.h', '*.inc'],
+ recursive=False).files()
+utest_files = Pattern(src_dir='unittests',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ recursive=False).files()
+utest_headers = Pattern(src_dir='unittests',
+ includes=['*-testhelper.h',],
+ recursive=False).files()
+utest_data_files = Pattern(src_dir='unittests/testdata/sigrl',
+ includes=['*.inc'],
+ excludes=[],
+ recursive=False).files()
+
+epid11_headers = Pattern(src_dir='1.1',
+ includes=['*.h'],
+ recursive=False).files()
+epid11_src_files = Pattern(src_dir='1.1/src',
+ includes=['*.c'],
+ recursive=False).files()
+epid11_internal_headers = Pattern(src_dir='1.1/src',
+ includes=['*.h', '*.inc'],
+ recursive=False).files()
+epid11_utest_files = Pattern(src_dir='1.1/unittests',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ recursive=False).files()
+epid11_utest_headers = Pattern(src_dir='1.1/unittests',
+ includes=['*-testhelper.h',],
+ recursive=False).files()
+epid11_utest_data_files = Pattern(src_dir='1.1/unittests/testdata',
+ includes=['*.inc'],
+ recursive=False).files()
+
+build_files = Pattern(src_dir='.',
+ includes=['*.parts', 'Makefile'],
+ recursive=False).files()
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(api_headers,
+ sub_dir='epid/${PART_SHORT_NAME}')
+ env.InstallTopLevel(src_files + internal_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(utest_files + utest_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/unittests')
+ env.InstallTopLevel(
+ utest_data_files,
+ sub_dir='epid/${PART_SHORT_NAME}/unittests/testdata/sigrl')
+
+ env.InstallTopLevel(epid11_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1')
+ env.InstallTopLevel(epid11_src_files + epid11_internal_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1/src')
+ env.InstallTopLevel(epid11_utest_files + epid11_utest_headers,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1/unittests')
+ env.InstallTopLevel(
+ epid11_utest_data_files,
+ sub_dir='epid/${PART_SHORT_NAME}/1.1/unittests/testdata')
+
+ env.InstallTopLevel(build_files, sub_dir='epid/${PART_SHORT_NAME}')
+
+else:
+ env.DependsOn([
+ Component('common'),
+ ])
+
+ env.Append(CPPPATH='#')
+
+ if 'use_tss' in env['MODE']:
+ env.Append(CPPDEFINES=['TPM_TSS'])
+
+ testenv = env.Clone()
+ outputs = env.Library('${PART_NAME}', src_files + epid11_src_files)
+ env.Sdk(outputs)
+ env.SdkInclude(api_headers, sub_dir='epid/${PART_SHORT_NAME}')
+ env.SdkInclude(epid11_headers, sub_dir='epid/${PART_SHORT_NAME}/1.1')
+
+ if 'install_lib' in env['MODE']:
+ env.InstallLib(outputs)
+ env.InstallInclude(api_headers, sub_dir='${PART_SHORT_NAME}')
+ env.InstallInclude(epid11_headers, sub_dir='${PART_SHORT_NAME}/1.1')
+
+ testenv['UNIT_TEST_TARGET_NAME'] = "${PART_NAME}-${UNIT_TEST_TARGET}"
+ testenv.UnitTest("utest",
+ utest_files + epid11_utest_files,
+ command_args=[
+ '--gtest_color=yes',
+ '--gtest_print_time=1',
+ '--gtest_output=xml',
+ '--gtest_filter=**',
+ ],
+ make_pdb=(env.isConfigBasedOn('debug') or
+ env.isConfigBasedOn('static_crt_debug')),
+ depends=[Component('gtest'),
+ Component('common-testhelper'),
+ Component('verifier')],
+ INSTALL_BIN='${INSTALL_TEST_BIN}')
diff --git a/example/Makefile b/example/Makefile
new file mode 100644
index 0000000..5ee6f06
--- /dev/null
+++ b/example/Makefile
@@ -0,0 +1,90 @@
+#!/usr/bin/make -f
+
+#define variables
+IPP_API_INCLUDE_DIR = ../ext/ipp/include
+EXAMPLE_INSTALL_DIR = $(epidinstalldir)/example
+COMPRESSED_DEFAULT_FILES_INSTALL_DIR = $(epidinstalldir)/compressed_example
+
+SIGNMSG_INCLUDE_DIR = ./signmsg
+SIGNMSG_SRC = $(wildcard ./signmsg/src/*.c)
+SIGNMSG_OBJ = $(SIGNMSG_SRC:.c=.o)
+SIGNMSG_EXE = ./signmsg/src/signmsg$(EXE_EXTENSION)
+
+VERIFYSIG_INCLUDE_DIR = ./verifysig
+VERIFYSIG_SRC = $(wildcard ./verifysig/src/*.c)
+VERIFYSIG_OBJ = $(VERIFYSIG_SRC:.c=.o)
+VERIFYSIG_EXE = ./verifysig/src/verifysig$(EXE_EXTENSION)
+
+
+LIB_UTIL_DIR = ./util/src
+LIB_ARGTABLE_DIR = ../ext/argtable3
+LIB_IPPCP_DIR = ../ext/ipp/sources/ippcp/src
+LIB_MEMBER_DIR = ../epid/member
+LIB_VERIFIER_DIR = ../epid/verifier
+LIB_COMMON_DIR = ../epid/common
+
+#set linker flags
+LDFLAGS += -L$(LIB_UTIL_DIR) \
+ -L$(LIB_ARGTABLE_DIR) \
+ -L$(LIB_IPPCP_DIR) \
+ -L$(LIB_COMMON_DIR) \
+ -lcommon \
+ -lippcp -lutil -largtable3
+
+ifneq ($(TSS_PATH),)
+ LDFLAGS += -L$(TSS_PATH) -ltss -lcrypto
+endif
+
+ifneq ($(TINY),)
+ LDFLAGS += -L$(LIB_MEMBER_DIR) -lmath -ltiny_stdlib
+endif
+
+$(VERIFYSIG_EXE): $(VERIFYSIG_OBJ)
+ $(CC) -o $@ $^ -L$(LIB_VERIFIER_DIR) -lverifier $(LDFLAGS)
+
+$(VERIFYSIG_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(LIB_UTIL_DIR)/../.. \
+ -I$(LIB_ARGTABLE_DIR) \
+ -I$(LIB_VERIFIER_DIR)/../.. \
+ -I$(VERIFYSIG_INCLUDE_DIR) \
+ -I$(IPP_API_INCLUDE_DIR) -c $^
+
+
+$(SIGNMSG_EXE): $(SIGNMSG_OBJ)
+ $(CC) -o $@ $^ -L$(LIB_MEMBER_DIR) -lmember $(LDFLAGS)
+
+$(SIGNMSG_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(LIB_UTIL_DIR)/../.. \
+ -I$(LIB_ARGTABLE_DIR) \
+ -I$(LIB_MEMBER_DIR)/../.. \
+ -I$(SIGNMSG_INCLUDE_DIR) \
+ -I$(IPP_API_INCLUDE_DIR) -c $^
+
+#target part
+build: all install
+
+all: $(VERIFYSIG_EXE) $(SIGNMSG_EXE)
+
+install:
+ mkdir -p '$(EXAMPLE_INSTALL_DIR)/data'
+ cp -r ./data/group* ./data/grprl_empty.bin \
+ ./data/*.md '$(EXAMPLE_INSTALL_DIR)/data'
+ cp ./data/cacert.bin ./data/grprl.bin \
+ ./data/privrl.bin ./data/sigrl.bin \
+ ./data/mprivkey.dat ./data/pubkey.bin \
+ '$(EXAMPLE_INSTALL_DIR)'
+ mkdir -p '$(EXAMPLE_INSTALL_DIR)/compressed_data'
+ cp -r ./compressed_data/group* ./compressed_data/grprl_empty.bin \
+ ./compressed_data/*.md '$(EXAMPLE_INSTALL_DIR)/compressed_data'
+ mkdir -p '$(COMPRESSED_DEFAULT_FILES_INSTALL_DIR)'
+ cp ./compressed_data/cacert.bin ./compressed_data/grprl.bin \
+ ./compressed_data/privrl.bin ./compressed_data/sigrl.bin \
+ ./compressed_data/mprivkey.dat ./compressed_data/pubkey.bin \
+ '$(COMPRESSED_DEFAULT_FILES_INSTALL_DIR)'
+ cp $(VERIFYSIG_EXE) $(SIGNMSG_EXE) '$(EXAMPLE_INSTALL_DIR)'
+
+clean:
+ rm -f $(VERIFYSIG_OBJ) \
+ $(VERIFYSIG_EXE) \
+ $(SIGNMSG_OBJ) \
+ $(SIGNMSG_EXE)
diff --git a/example/compressed_data/README.md b/example/compressed_data/README.md
new file mode 100644
index 0000000..74c3341
--- /dev/null
+++ b/example/compressed_data/README.md
@@ -0,0 +1,179 @@
+# Sample Issuer Material
+
+This folder contains compressed key sample issuer material for use with the
+Intel(R) EPID SDK. All data files are in binary format.
+
+_Note: The groups and members provided here are distinct from the
+corresponding uncompressed groups and members._
+
+## Directory Structure
+
+ compressed_data
+ |__ groupa
+ | |__ member0
+ | | |__ mprivkey.dat
+ | |
+ | |__ member1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember2
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember1
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember2
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrl.bin
+ | |__ privrl_empty.bin
+ | |__ pubkey.bin
+ | |__ sigrl.bin
+ | |__ sigrl_empty.bin
+ |
+ |__ groupb
+ | |__ member0
+ | | |__ mprivkey.dat
+ | |
+ | |__ member1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrl.bin
+ | |__ privrl_empty.bin
+ | |__ pubkey.bin
+ | |__ sigrl.bin
+ | |__ sigrl_empty.bin
+ |
+ |__ grprl.bin
+ |__ grprl_empty.bin
+ |__ mprivkey.dat
+ |__ privrl.bin
+ |__ pubkey.bin
+ |__ cacert.bin
+ |__ sigrl.bin
+
+
+## Description
+
+There are 2 groups
+
+- **groupa**
+
+- **groupb**
+
+### Group A
+
+**groupa** contains 8 members. Each member has a member private key
+`mprivkey.dat`. Here are the members:
+
+- **member0** - a member in good standing
+
+- **member1** - a member in good standing
+
+- **privrevokedmember0** - a member revoked using its private key
+
+- **privrevokedmember1** - a member revoked using its private key
+
+- **privrevokedmember2** - a member revoked using its private key
+
+- **sigrevokedmember0** - a member revoked using a signature
+
+- **sigrevokedmember1** - a member revoked using a signature
+
+- **sigrevokedmember2** - a member revoked using a signature
+
+
+In addition, **groupa** contain the following revocation lists:
+
+- `pubkey.bin` - group public key
+
+- `privrl.bin` - private key based revocation list with 3 entries -
+ **privrevokedmember0**, **privrevokedmember1** and
+ **privrevokedmember2**
+
+- `sigrl.bin` - signature based revocation list with 3 entries -
+ **sigrevokedmember0**, **sigrevokedmember2** and
+ **sigrevokedmember2**
+
+- `privrl_empty.bin` - private key based revocation list with 0 entries
+
+- `sigrl_empty.bin` - signature based revocation list with 0 entries
+
+
+### Group B
+
+**groupb** contains 3 members. Each member has a member private key
+`mprivkey.dat`. Here are the members:
+
+- **member0** - a member in good standing
+
+- **privrevokedmember0** - a member whose private key is revoked
+
+- **sigrevokedmember0** - a member whose signature is revoked
+
+
+In addition, **groupb** contain the following revocation lists:
+
+- `pubkey.bin` - group public key
+
+- `privrl.bin` - private key based revocation list with 1 entry -
+ **privrevokedmember0**
+
+- `sigrl.bin` - signature based revocation list with 1 entry -
+ **sigrevokedmember0**
+
+- `privrl_empty.bin` - private key based revocation list with 0 entries
+
+- `sigrl_empty.bin` - signature based revocation list with 0 entries
+
+
+### Default files
+
+- `cacert.bin` - CA certificate used as default input to signmsg
+ and `verifysig`
+
+- `grprl.bin` - group revocation list with one entry **groupb** used
+ as default input to `verifysig`
+
+- `pubkey.bin` - public key in **groupa** used as default input
+ to signmsg and `verifysig`
+
+- `mprivkey.dat` - private key of a **member0** in the
+ **groupa** used as default input to `signmsg`
+
+- `privrl.bin` - private key based revocation list in the
+ **groupa** with 3 entries used as default input to `verifysig`
+
+- `sigrl.bin` - signature based revocation list in the
+ **groupa** with 3 entries used as default input to `signmsg`
+ and `verifysig`
+
+### Group revocation lists
+
+There are 2 group revocation lists:
+
+- `grprl.bin` - group revocation list with 100 entries
+
+- `grprl_empty.bin` - group revocation list with 0 entries
+
+
+### IoT Issuing CA certificate
+
+- `cacert.bin` - CA certificate used to check that revocation
+ lists and group public keys are authorized by the issuer, e.g.,
+ signed by the issuer
diff --git a/example/compressed_data/cacert.bin b/example/compressed_data/cacert.bin
new file mode 100644
index 0000000..fcbcc1f
--- /dev/null
+++ b/example/compressed_data/cacert.bin
Binary files differ
diff --git a/example/compressed_data/compressed_data.parts b/example/compressed_data/compressed_data.parts
new file mode 100644
index 0000000..b263763
--- /dev/null
+++ b/example/compressed_data/compressed_data.parts
@@ -0,0 +1,72 @@
+############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+# Normal stuff that all Parts should have
+env.PartName("sample_compressed_data")
+
+#files
+data_files = Pattern(src_dir='.',
+ includes=[
+ 'grprl_empty.bin',
+ 'README.md',
+ 'groupa/privrl.bin',
+ 'groupa/pubkey.bin',
+ 'groupa/sigrl.bin',
+ 'groupa/privrl_empty.bin',
+ 'groupa/sigrl_empty.bin',
+ 'groupa/member0/mprivkey.dat',
+ 'groupa/member1/mprivkey.dat',
+ 'groupa/privrevokedmember0/mprivkey.dat',
+ 'groupa/privrevokedmember1/mprivkey.dat',
+ 'groupa/privrevokedmember2/mprivkey.dat',
+ 'groupa/sigrevokedmember0/mprivkey.dat',
+ 'groupa/sigrevokedmember1/mprivkey.dat',
+ 'groupa/sigrevokedmember2/mprivkey.dat',
+ 'groupb/privrl.bin',
+ 'groupb/pubkey.bin',
+ 'groupb/sigrl.bin',
+ 'groupb/privrl_empty.bin',
+ 'groupb/sigrl_empty.bin',
+ 'groupb/member0/mprivkey.dat',
+ 'groupb/privrevokedmember0/mprivkey.dat',
+ 'groupb/sigrevokedmember0/mprivkey.dat',
+ ],
+ recursive=True)
+
+sample_default_files = Pattern(src_dir='.',
+ includes=[
+ 'mprivkey.dat',
+ 'pubkey.bin',
+ 'cacert.bin',
+ 'grprl.bin',
+ 'privrl.bin',
+ 'sigrl.bin',
+ ],
+ recursive=True)
+
+part_file = ['compressed_data.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(data_files, sub_dir='example/compressed_data')
+ env.InstallTopLevel(part_file, sub_dir='example/compressed_data')
+ env.InstallTopLevel(sample_default_files, sub_dir='example/compressed_data')
+else:
+ env.InstallData(data_files,
+ sub_dir='compressed_data',
+ no_pkg=False)
+ env.InstallTopLevel(sample_default_files, sub_dir='compressed_example')
diff --git a/example/compressed_data/groupa/member0/mprivkey.dat b/example/compressed_data/groupa/member0/mprivkey.dat
new file mode 100644
index 0000000..b418a28
--- /dev/null
+++ b/example/compressed_data/groupa/member0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/member1/mprivkey.dat b/example/compressed_data/groupa/member1/mprivkey.dat
new file mode 100644
index 0000000..26ad92e
--- /dev/null
+++ b/example/compressed_data/groupa/member1/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/privrevokedmember0/mprivkey.dat b/example/compressed_data/groupa/privrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..7067865
--- /dev/null
+++ b/example/compressed_data/groupa/privrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/privrevokedmember1/mprivkey.dat b/example/compressed_data/groupa/privrevokedmember1/mprivkey.dat
new file mode 100644
index 0000000..aa11c36
--- /dev/null
+++ b/example/compressed_data/groupa/privrevokedmember1/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/privrevokedmember2/mprivkey.dat b/example/compressed_data/groupa/privrevokedmember2/mprivkey.dat
new file mode 100644
index 0000000..8bbb26e
--- /dev/null
+++ b/example/compressed_data/groupa/privrevokedmember2/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/privrl.bin b/example/compressed_data/groupa/privrl.bin
new file mode 100644
index 0000000..dbec4b1
--- /dev/null
+++ b/example/compressed_data/groupa/privrl.bin
Binary files differ
diff --git a/example/compressed_data/groupa/privrl_empty.bin b/example/compressed_data/groupa/privrl_empty.bin
new file mode 100644
index 0000000..da1d047
--- /dev/null
+++ b/example/compressed_data/groupa/privrl_empty.bin
Binary files differ
diff --git a/example/compressed_data/groupa/pubkey.bin b/example/compressed_data/groupa/pubkey.bin
new file mode 100644
index 0000000..1f395ea
--- /dev/null
+++ b/example/compressed_data/groupa/pubkey.bin
Binary files differ
diff --git a/example/compressed_data/groupa/sigrevokedmember0/mprivkey.dat b/example/compressed_data/groupa/sigrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..586c5c7
--- /dev/null
+++ b/example/compressed_data/groupa/sigrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/sigrevokedmember1/mprivkey.dat b/example/compressed_data/groupa/sigrevokedmember1/mprivkey.dat
new file mode 100644
index 0000000..01cb952
--- /dev/null
+++ b/example/compressed_data/groupa/sigrevokedmember1/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/sigrevokedmember2/mprivkey.dat b/example/compressed_data/groupa/sigrevokedmember2/mprivkey.dat
new file mode 100644
index 0000000..30c03e5
--- /dev/null
+++ b/example/compressed_data/groupa/sigrevokedmember2/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupa/sigrl.bin b/example/compressed_data/groupa/sigrl.bin
new file mode 100644
index 0000000..dd1a036
--- /dev/null
+++ b/example/compressed_data/groupa/sigrl.bin
Binary files differ
diff --git a/example/compressed_data/groupa/sigrl_empty.bin b/example/compressed_data/groupa/sigrl_empty.bin
new file mode 100644
index 0000000..4943750
--- /dev/null
+++ b/example/compressed_data/groupa/sigrl_empty.bin
Binary files differ
diff --git a/example/compressed_data/groupb/member0/mprivkey.dat b/example/compressed_data/groupb/member0/mprivkey.dat
new file mode 100644
index 0000000..e2ba729
--- /dev/null
+++ b/example/compressed_data/groupb/member0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupb/privrevokedmember0/mprivkey.dat b/example/compressed_data/groupb/privrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..d2ee1b7
--- /dev/null
+++ b/example/compressed_data/groupb/privrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupb/privrl.bin b/example/compressed_data/groupb/privrl.bin
new file mode 100644
index 0000000..4d7ebd4
--- /dev/null
+++ b/example/compressed_data/groupb/privrl.bin
Binary files differ
diff --git a/example/compressed_data/groupb/privrl_empty.bin b/example/compressed_data/groupb/privrl_empty.bin
new file mode 100644
index 0000000..9bcc1ce
--- /dev/null
+++ b/example/compressed_data/groupb/privrl_empty.bin
Binary files differ
diff --git a/example/compressed_data/groupb/pubkey.bin b/example/compressed_data/groupb/pubkey.bin
new file mode 100644
index 0000000..1791b75
--- /dev/null
+++ b/example/compressed_data/groupb/pubkey.bin
Binary files differ
diff --git a/example/compressed_data/groupb/sigrevokedmember0/mprivkey.dat b/example/compressed_data/groupb/sigrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..1100871
--- /dev/null
+++ b/example/compressed_data/groupb/sigrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/groupb/sigrl.bin b/example/compressed_data/groupb/sigrl.bin
new file mode 100644
index 0000000..949692a
--- /dev/null
+++ b/example/compressed_data/groupb/sigrl.bin
Binary files differ
diff --git a/example/compressed_data/groupb/sigrl_empty.bin b/example/compressed_data/groupb/sigrl_empty.bin
new file mode 100644
index 0000000..70762da
--- /dev/null
+++ b/example/compressed_data/groupb/sigrl_empty.bin
Binary files differ
diff --git a/example/compressed_data/grprl.bin b/example/compressed_data/grprl.bin
new file mode 100644
index 0000000..c9a3d71
--- /dev/null
+++ b/example/compressed_data/grprl.bin
Binary files differ
diff --git a/example/compressed_data/grprl_empty.bin b/example/compressed_data/grprl_empty.bin
new file mode 100644
index 0000000..14536de
--- /dev/null
+++ b/example/compressed_data/grprl_empty.bin
Binary files differ
diff --git a/example/compressed_data/mprivkey.dat b/example/compressed_data/mprivkey.dat
new file mode 100644
index 0000000..b418a28
--- /dev/null
+++ b/example/compressed_data/mprivkey.dat
Binary files differ
diff --git a/example/compressed_data/privrl.bin b/example/compressed_data/privrl.bin
new file mode 100644
index 0000000..dbec4b1
--- /dev/null
+++ b/example/compressed_data/privrl.bin
Binary files differ
diff --git a/example/compressed_data/pubkey.bin b/example/compressed_data/pubkey.bin
new file mode 100644
index 0000000..1f395ea
--- /dev/null
+++ b/example/compressed_data/pubkey.bin
Binary files differ
diff --git a/example/compressed_data/sigrl.bin b/example/compressed_data/sigrl.bin
new file mode 100644
index 0000000..dd1a036
--- /dev/null
+++ b/example/compressed_data/sigrl.bin
Binary files differ
diff --git a/example/data/README.md b/example/data/README.md
new file mode 100644
index 0000000..f1c0aa3
--- /dev/null
+++ b/example/data/README.md
@@ -0,0 +1,179 @@
+# Sample Issuer Material
+
+This folder contains sample issuer material for use with the Intel(R)
+EPID SDK. All data files are in binary format.
+
+## Directory Structure
+
+ data
+ |__ groupa
+ | |__ member0
+ | | |__ mprivkey.dat
+ | |
+ | |__ member1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember2
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember1
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember2
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrl.bin
+ | |__ privrl_empty.bin
+ | |__ pubkey.bin
+ | |__ sigrl.bin
+ | |__ sigrl_empty.bin
+ |
+ |__ groupb
+ | |__ member0
+ | | |__ mprivkey.dat
+ | |
+ | |__ member1
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ sigrevokedmember0
+ | | |__ mprivkey.dat
+ | |
+ | |__ privrl.bin
+ | |__ privrl_empty.bin
+ | |__ pubkey.bin
+ | |__ sigrl.bin
+ | |__ sigrl_empty.bin
+ |
+ |__ grprl.bin
+ |__ grprl_empty.bin
+ |__ mprivkey.dat
+ |__ privrl.bin
+ |__ pubkey.bin
+ |__ cacert.bin
+ |__ sigrl.bin
+
+
+## Description
+
+There are 2 groups
+
+- **groupa**
+
+- **groupb**
+
+
+_Note: No compressed key sample material is included in this folder._
+
+### Group A
+
+**groupa** contains 8 members. Each member has a member private key
+`mprivkey.dat`. Here are the members:
+
+- **member0** - a member in good standing
+
+- **member1** - a member in good standing
+
+- **privrevokedmember0** - a member revoked using its private key
+
+- **privrevokedmember1** - a member revoked using its private key
+
+- **privrevokedmember2** - a member revoked using its private key
+
+- **sigrevokedmember0** - a member revoked using a signature
+
+- **sigrevokedmember1** - a member revoked using a signature
+
+- **sigrevokedmember2** - a member revoked using a signature
+
+
+In addition, **groupa** contain the following revocation lists:
+
+- `pubkey.bin` - group public key
+
+- `privrl.bin` - private key based revocation list with 3 entries -
+ **privrevokedmember0**, **privrevokedmember1** and
+ **privrevokedmember2**
+
+- `sigrl.bin` - signature based revocation list with 3 entries -
+ **sigrevokedmember0**, **sigrevokedmember2** and
+ **sigrevokedmember2**
+
+- `privrl_empty.bin` - private key based revocation list with 0 entries
+
+- `sigrl_empty.bin` - signature based revocation list with 0 entries
+
+
+### Group B
+
+**groupb** contains 3 members. Each member has a member private key
+`mprivkey.dat`. Here are the members:
+
+- **member0** - a member in good standing
+
+- **privrevokedmember0** - a member whose private key is revoked
+
+- **sigrevokedmember0** - a member whose signature is revoked
+
+
+In addition, **groupb** contain the following revocation lists:
+
+- `pubkey.bin` - group public key
+
+- `privrl.bin` - private key based revocation list with 1 entry -
+ **privrevokedmember0**
+
+- `sigrl.bin` - signature based revocation list with 1 entry -
+ **sigrevokedmember0**
+
+- `privrl_empty.bin` - private key based revocation list with 0 entries
+
+- `sigrl_empty.bin` - signature based revocation list with 0 entries
+
+
+### Default files
+
+- `/data/cacert.bin` - CA certificate used as default input to signmsg
+ and `verifysig`
+
+- `/data/grprl.bin` - group revocation list with one entry **groupb** used
+ as default input to `verifysig`
+
+- `/data/pubkey.bin` - public key in **groupa** used as default input
+ to signmsg and `verifysig`
+
+- `/data/mprivkey.dat` - private key of a **member0** in the
+ **groupa** used as default input to `signmsg`
+
+- `/data/privrl.bin` - private key based revocation list in the
+ **groupa** with 0 entries used as default input to `verifysig`
+
+- `/data/sigrl.bin` - signature based revocation list in the
+ **groupa** with 0 entries used as default input to `signmsg`
+ and `verifysig`
+
+### Group revocation lists
+
+There are 2 group revocation lists:
+
+- `grprl.bin` - group revocation list with 50 entries
+
+- `grprl_empty.bin` - group revocation list with 0 entries
+
+
+### IoT Intel(R) EPID Issuing CA certificate
+
+- `/data/cacert.bin` - CA certificate used to check that revocation
+ lists and group public keys are authorized by the issuer, e.g.,
+ signed by the issuer
diff --git a/example/data/cacert.bin b/example/data/cacert.bin
new file mode 100644
index 0000000..fcbcc1f
--- /dev/null
+++ b/example/data/cacert.bin
Binary files differ
diff --git a/example/data/data.parts b/example/data/data.parts
new file mode 100644
index 0000000..28a6b11
--- /dev/null
+++ b/example/data/data.parts
@@ -0,0 +1,72 @@
+############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+# Normal stuff that all Parts should have
+env.PartName("sample_data")
+
+#files
+data_files = Pattern(src_dir='.',
+ includes=[
+ 'grprl_empty.bin',
+ 'README.md',
+ 'groupa/privrl.bin',
+ 'groupa/pubkey.bin',
+ 'groupa/sigrl.bin',
+ 'groupa/privrl_empty.bin',
+ 'groupa/sigrl_empty.bin',
+ 'groupa/member0/mprivkey.dat',
+ 'groupa/member1/mprivkey.dat',
+ 'groupa/privrevokedmember0/mprivkey.dat',
+ 'groupa/privrevokedmember1/mprivkey.dat',
+ 'groupa/privrevokedmember2/mprivkey.dat',
+ 'groupa/sigrevokedmember0/mprivkey.dat',
+ 'groupa/sigrevokedmember1/mprivkey.dat',
+ 'groupa/sigrevokedmember2/mprivkey.dat',
+ 'groupb/privrl.bin',
+ 'groupb/pubkey.bin',
+ 'groupb/sigrl.bin',
+ 'groupb/privrl_empty.bin',
+ 'groupb/sigrl_empty.bin',
+ 'groupb/member0/mprivkey.dat',
+ 'groupb/privrevokedmember0/mprivkey.dat',
+ 'groupb/sigrevokedmember0/mprivkey.dat',
+ ],
+ recursive=True)
+
+sample_default_files = Pattern(src_dir='.',
+ includes=[
+ 'mprivkey.dat',
+ 'pubkey.bin',
+ 'cacert.bin',
+ 'grprl.bin',
+ 'privrl.bin',
+ 'sigrl.bin',
+ ],
+ recursive=True)
+
+part_file = ['data.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(data_files, sub_dir='example/data')
+ env.InstallTopLevel(part_file, sub_dir='example/data')
+ env.InstallTopLevel(sample_default_files, sub_dir='example/data')
+else:
+ env.InstallData(data_files,
+ sub_dir='data',
+ no_pkg=False)
+ env.InstallTopLevel(sample_default_files, sub_dir='example')
diff --git a/example/data/groupa/member0/mprivkey.dat b/example/data/groupa/member0/mprivkey.dat
new file mode 100644
index 0000000..8bf5d47
--- /dev/null
+++ b/example/data/groupa/member0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/member1/mprivkey.dat b/example/data/groupa/member1/mprivkey.dat
new file mode 100644
index 0000000..c11c0ca
--- /dev/null
+++ b/example/data/groupa/member1/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/privrevokedmember0/mprivkey.dat b/example/data/groupa/privrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..bbb3bde
--- /dev/null
+++ b/example/data/groupa/privrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/privrevokedmember1/mprivkey.dat b/example/data/groupa/privrevokedmember1/mprivkey.dat
new file mode 100644
index 0000000..b2694cd
--- /dev/null
+++ b/example/data/groupa/privrevokedmember1/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/privrevokedmember2/mprivkey.dat b/example/data/groupa/privrevokedmember2/mprivkey.dat
new file mode 100644
index 0000000..38a2eac
--- /dev/null
+++ b/example/data/groupa/privrevokedmember2/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/privrl.bin b/example/data/groupa/privrl.bin
new file mode 100644
index 0000000..e3bca59
--- /dev/null
+++ b/example/data/groupa/privrl.bin
Binary files differ
diff --git a/example/data/groupa/privrl_empty.bin b/example/data/groupa/privrl_empty.bin
new file mode 100644
index 0000000..27bdd70
--- /dev/null
+++ b/example/data/groupa/privrl_empty.bin
Binary files differ
diff --git a/example/data/groupa/pubkey.bin b/example/data/groupa/pubkey.bin
new file mode 100644
index 0000000..5f766c8
--- /dev/null
+++ b/example/data/groupa/pubkey.bin
Binary files differ
diff --git a/example/data/groupa/sigrevokedmember0/mprivkey.dat b/example/data/groupa/sigrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..c4c273c
--- /dev/null
+++ b/example/data/groupa/sigrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/sigrevokedmember1/mprivkey.dat b/example/data/groupa/sigrevokedmember1/mprivkey.dat
new file mode 100644
index 0000000..cdc7911
--- /dev/null
+++ b/example/data/groupa/sigrevokedmember1/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/sigrevokedmember2/mprivkey.dat b/example/data/groupa/sigrevokedmember2/mprivkey.dat
new file mode 100644
index 0000000..b5b9ede
--- /dev/null
+++ b/example/data/groupa/sigrevokedmember2/mprivkey.dat
Binary files differ
diff --git a/example/data/groupa/sigrl.bin b/example/data/groupa/sigrl.bin
new file mode 100644
index 0000000..bc9ef56
--- /dev/null
+++ b/example/data/groupa/sigrl.bin
Binary files differ
diff --git a/example/data/groupa/sigrl_empty.bin b/example/data/groupa/sigrl_empty.bin
new file mode 100644
index 0000000..2797822
--- /dev/null
+++ b/example/data/groupa/sigrl_empty.bin
Binary files differ
diff --git a/example/data/groupb/member0/mprivkey.dat b/example/data/groupb/member0/mprivkey.dat
new file mode 100644
index 0000000..faa4a6f
--- /dev/null
+++ b/example/data/groupb/member0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupb/privrevokedmember0/mprivkey.dat b/example/data/groupb/privrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..0e5990a
--- /dev/null
+++ b/example/data/groupb/privrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupb/privrl.bin b/example/data/groupb/privrl.bin
new file mode 100644
index 0000000..5ff658f
--- /dev/null
+++ b/example/data/groupb/privrl.bin
Binary files differ
diff --git a/example/data/groupb/privrl_empty.bin b/example/data/groupb/privrl_empty.bin
new file mode 100644
index 0000000..3638c81
--- /dev/null
+++ b/example/data/groupb/privrl_empty.bin
Binary files differ
diff --git a/example/data/groupb/pubkey.bin b/example/data/groupb/pubkey.bin
new file mode 100644
index 0000000..0d0ba52
--- /dev/null
+++ b/example/data/groupb/pubkey.bin
Binary files differ
diff --git a/example/data/groupb/sigrevokedmember0/mprivkey.dat b/example/data/groupb/sigrevokedmember0/mprivkey.dat
new file mode 100644
index 0000000..ef59eb2
--- /dev/null
+++ b/example/data/groupb/sigrevokedmember0/mprivkey.dat
Binary files differ
diff --git a/example/data/groupb/sigrl.bin b/example/data/groupb/sigrl.bin
new file mode 100644
index 0000000..b55ea33
--- /dev/null
+++ b/example/data/groupb/sigrl.bin
Binary files differ
diff --git a/example/data/groupb/sigrl_empty.bin b/example/data/groupb/sigrl_empty.bin
new file mode 100644
index 0000000..3232377
--- /dev/null
+++ b/example/data/groupb/sigrl_empty.bin
Binary files differ
diff --git a/example/data/grprl.bin b/example/data/grprl.bin
new file mode 100644
index 0000000..2774f2b
--- /dev/null
+++ b/example/data/grprl.bin
Binary files differ
diff --git a/example/data/grprl_empty.bin b/example/data/grprl_empty.bin
new file mode 100644
index 0000000..14536de
--- /dev/null
+++ b/example/data/grprl_empty.bin
Binary files differ
diff --git a/example/data/mprivkey.dat b/example/data/mprivkey.dat
new file mode 100644
index 0000000..8bf5d47
--- /dev/null
+++ b/example/data/mprivkey.dat
Binary files differ
diff --git a/example/data/privrl.bin b/example/data/privrl.bin
new file mode 100644
index 0000000..27bdd70
--- /dev/null
+++ b/example/data/privrl.bin
Binary files differ
diff --git a/example/data/pubkey.bin b/example/data/pubkey.bin
new file mode 100644
index 0000000..5f766c8
--- /dev/null
+++ b/example/data/pubkey.bin
Binary files differ
diff --git a/example/data/sigrl.bin b/example/data/sigrl.bin
new file mode 100644
index 0000000..2797822
--- /dev/null
+++ b/example/data/sigrl.bin
Binary files differ
diff --git a/example/signmsg/signmsg.parts b/example/signmsg/signmsg.parts
new file mode 100644
index 0000000..2f07baa
--- /dev/null
+++ b/example/signmsg/signmsg.parts
@@ -0,0 +1,53 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+# Normal stuff that all Parts should have
+env.PartName("signmsg")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+inc_files = Pattern(src_dir='src/',
+ includes=['*.h'],
+ recursive=True).files()
+parts_file = ['signmsg.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(inc_files + src_files,
+ sub_dir='example/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='example/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('member'),
+ Component('common'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ env.Append(CPPPATH='#/example/signmsg')
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}')
diff --git a/example/signmsg/src/main.c b/example/signmsg/src/main.c
new file mode 100644
index 0000000..193929a
--- /dev/null
+++ b/example/signmsg/src/main.c
@@ -0,0 +1,409 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Signmsg example implementation.
+ */
+
+#include <argtable3.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "src/signmsg.h"
+#include "util/buffutil.h"
+#include "util/convutil.h"
+#include "util/envutil.h"
+
+// Defaults
+#define PROGRAM_NAME "signmsg"
+#define MPRIVKEYFILE_DEFAULT "mprivkey.dat"
+#define PUBKEYFILE_DEFAULT "pubkey.bin"
+#define SIG_DEFAULT "sig.dat"
+#define CACERT_DEFAULT "cacert.bin"
+#define HASHALG_DEFAULT "SHA-512"
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 14
+
+bool IsCaCertAuthorizedByRootCa(void const* data, size_t size) {
+ // Implementation of this function is out of scope of the sample.
+ // In an actual implementation Issuing CA certificate must be validated
+ // with CA Root certificate before using it in parse functions.
+ (void)data;
+ (void)size;
+ return true;
+}
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_SUCCESS;
+
+ // intermediate return value for Intel(R) EPID functions
+ EpidStatus result = kEpidErr;
+
+ // User Settings
+
+ // Message string parameter
+ static char* msg_str = NULL;
+ size_t msg_size = 0;
+ char* msg_buf = NULL; // message loaded from msg_file
+
+ // Basename string parameter
+ static char* basename_str = NULL;
+ size_t basename_size = 0;
+ char* basename_buf = NULL; // basename loaded from basename_file
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ // Buffers and computed values
+
+ // Signature buffer
+ EpidSignature* sig = NULL;
+ size_t sig_size = 0;
+
+ // SigRl file
+ unsigned char* signed_sig_rl = NULL;
+ size_t signed_sig_rl_size = 0;
+
+ // Group public key file
+ unsigned char* signed_pubkey = NULL;
+ size_t signed_pubkey_size = 0;
+
+ // CA certificate
+ EpidCaCertificate cacert = {0};
+
+ // Member private key buffer
+ unsigned char* mprivkey = NULL;
+ size_t mprivkey_size = 0;
+
+ // Member pre-computed settings
+ MemberPrecomp member_precmp = {0};
+ MemberPrecomp* member_precmp_ptr = NULL;
+
+ // Hash algorithm
+ static HashAlg hashalg = kInvalidHashAlg;
+
+ // Argument variables
+ struct arg_file* sig_file =
+ arg_file0(NULL, "sig", "FILE",
+ "write signature to FILE (default: " SIG_DEFAULT ")");
+ struct arg_str* msg = arg_str0(NULL, "msg", "MESSAGE", "MESSAGE to sign");
+ struct arg_file* msg_file =
+ arg_file0(NULL, "msgfile", "FILE", "FILE containing message to sign");
+ struct arg_str* basename = arg_str0(
+ NULL, "bsn", "BASENAME", "BASENAME to sign with (default: random)");
+ struct arg_file* basename_file = arg_file0(
+ NULL, "bsnfile", "FILE", "FILE containing basename to sign with");
+ struct arg_file* sigrl_file = arg_file0(
+ NULL, "sigrl", "FILE", "load signature based revocation list from FILE");
+ struct arg_file* pubkey_file = arg_file0(
+ NULL, "gpubkey", "FILE",
+ "load group public key from FILE (default: " PUBKEYFILE_DEFAULT ")");
+ struct arg_file* mprivkey_file = arg_file0(
+ NULL, "mprivkey", "FILE",
+ "load member private key from FILE (default: " MPRIVKEYFILE_DEFAULT ")");
+ struct arg_file* mprecmpi_file = arg_file0(
+ NULL, "mprecmpi", "FILE", "load pre-computed member data from FILE");
+ struct arg_file* cacert_file = arg_file0(
+ NULL, "capubkey", "FILE",
+ "load IoT Issuing CA public key from FILE (default: " CACERT_DEFAULT ")");
+ struct arg_str* hashalg_str =
+ arg_str0(NULL, "hashalg", "{SHA-256 | SHA-384 | SHA-512 | SHA-512/256}",
+ "use specified hash algorithm (default: " HASHALG_DEFAULT ")");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = sig_file;
+ argtable[1] = msg;
+ argtable[2] = msg_file;
+ argtable[3] = basename;
+ argtable[4] = basename_file;
+ argtable[5] = sigrl_file;
+ argtable[6] = pubkey_file;
+ argtable[7] = mprivkey_file;
+ argtable[8] = mprecmpi_file;
+ argtable[9] = cacert_file;
+ argtable[10] = hashalg_str;
+ argtable[11] = help;
+ argtable[12] = verbose;
+ argtable[13] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* set any command line default values prior to parsing */
+ sig_file->filename[0] = SIG_DEFAULT;
+ pubkey_file->filename[0] = PUBKEYFILE_DEFAULT;
+ mprivkey_file->filename[0] = MPRIVKEYFILE_DEFAULT;
+ cacert_file->filename[0] = CACERT_DEFAULT;
+ hashalg_str->sval[0] = HASHALG_DEFAULT;
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]...\n"
+ "Create Intel(R) EPID signature of message\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (msg->count > 0 && msg_file->count > 0) {
+ log_error("options --msg and --msgfile cannot be used together");
+ ret_value = EXIT_FAILURE;
+ break;
+ } else if (msg->count > 0) {
+ msg_str = (char*)msg->sval[0];
+ msg_size = strlen(msg_str);
+ } else if (msg_file->count > 0) {
+ msg_buf = NewBufferFromFile(msg_file->filename[0], &msg_size);
+ if (!msg_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ msg_str = msg_buf;
+ } else {
+ msg_size = 0;
+ }
+
+ if (basename->count > 0 && basename_file->count > 0) {
+ log_error("options --bsn and --bsnfile cannot be used together");
+ ret_value = EXIT_FAILURE;
+ break;
+ } else if (basename->count > 0) {
+ basename_str = (char*)basename->sval[0];
+ basename_size = strlen(basename_str);
+ } else if (basename_file->count > 0) {
+ basename_buf =
+ NewBufferFromFile(basename_file->filename[0], &basename_size);
+ if (!basename_buf) {
+ log_error("Failed in reading basename from %s", basename_file);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ basename_str = basename_buf;
+ } else {
+ basename_size = 0;
+ }
+
+ if (!StringToHashAlg(hashalg_str->sval[0], &hashalg)) {
+ log_error("invalid hashalg: %s", hashalg_str->sval[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (verbose_flag) {
+ log_msg("\nOption values:");
+ log_msg(" sig_file : %s", sig_file->filename[0]);
+ log_msg(" msg_str : %s", msg_str);
+ log_msg(" basename_str : %s", basename_str);
+ log_msg(" pubkey_file : %s", pubkey_file->filename[0]);
+ log_msg(" mprivkey_file : %s", mprivkey_file->filename[0]);
+ log_msg(" mprecmpi_file : %s", mprecmpi_file->filename[0]);
+ log_msg(" hashalg : %s", HashAlgToString(hashalg));
+ log_msg(" cacert_file : %s", cacert_file->filename[0]);
+ log_msg("");
+ }
+ // convert command line args to usable formats
+
+ // CA certificate
+ if (0 != ReadLoud(cacert_file->filename[0], &cacert, sizeof(cacert))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // Security note:
+ // Application must confirm that IoT Intel(R) EPID Issuing CA certificate
+ // is authorized by IoT Intel(R) EPID Root CA, e.g.,
+ // signed by IoT Intel(R) EPID Root CA.
+ if (!IsCaCertAuthorizedByRootCa(&cacert, sizeof(cacert))) {
+ log_error("CA certificate is not authorized");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // SigRl
+ if (sigrl_file->count > 0) {
+ if (FileExists(sigrl_file->filename[0])) {
+ signed_sig_rl =
+ NewBufferFromFile(sigrl_file->filename[0], &signed_sig_rl_size);
+ if (!signed_sig_rl) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (0 != ReadLoud(sigrl_file->filename[0], signed_sig_rl,
+ signed_sig_rl_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ } else {
+ log_error("SigRL file %s does not exist", sigrl_file->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+ // Group public key file
+ signed_pubkey =
+ NewBufferFromFile(pubkey_file->filename[0], &signed_pubkey_size);
+ if (!signed_pubkey) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (0 !=
+ ReadLoud(pubkey_file->filename[0], signed_pubkey, signed_pubkey_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // Member private key
+ mprivkey = NewBufferFromFile(mprivkey_file->filename[0], &mprivkey_size);
+ if (!mprivkey) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (mprivkey_size != sizeof(PrivKey) &&
+ mprivkey_size != sizeof(CompressedPrivKey) &&
+ mprivkey_size != sizeof(MembershipCredential)) {
+ log_error("Private Key file size is inconsistent");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (0 != ReadLoud(mprivkey_file->filename[0], mprivkey, mprivkey_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // Load Member pre-computed settings
+ if (mprecmpi_file->count > 0) {
+ if (sizeof(MemberPrecomp) != GetFileSize(mprecmpi_file->filename[0])) {
+ log_error("incorrect input precomp size");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (0 != ReadLoud(mprecmpi_file->filename[0], &member_precmp,
+ sizeof(MemberPrecomp))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ member_precmp_ptr = &member_precmp;
+ }
+
+ // Report Settings
+ if (verbose_flag) {
+ log_msg("==============================================");
+ log_msg("Signing Message:");
+ log_msg("");
+ log_msg(" [in] Message Len: %d", (int)msg_size);
+ log_msg(" [in] Message: ");
+ PrintBuffer(msg_str, msg_size);
+ log_msg("");
+ log_msg(" [in] BaseName Len: %d", (int)basename_size);
+ log_msg(" [in] BaseName: ");
+ PrintBuffer(basename_str, basename_size);
+ log_msg("");
+ log_msg(" [in] SigRl Len: %d", (int)signed_sig_rl_size);
+ log_msg(" [in] SigRl: ");
+ PrintBuffer(signed_sig_rl, signed_sig_rl_size);
+ log_msg("");
+ log_msg(" [in] Group Public Key: ");
+ PrintBuffer(signed_pubkey, signed_pubkey_size);
+ log_msg("");
+ log_msg(" [in] Member Private Key: ");
+ PrintBuffer(mprivkey, mprivkey_size);
+ log_msg("");
+ log_msg(" [in] Hash Algorithm: %s", HashAlgToString(hashalg));
+ log_msg("");
+ log_msg(" [in] IoT Intel(R) EPID Issuing CA Certificate: ");
+ PrintBuffer(&cacert, sizeof(cacert));
+ if (member_precmp_ptr) {
+ log_msg("");
+ log_msg(" [in] Member PreComp: ");
+ PrintBuffer(member_precmp_ptr, sizeof(member_precmp));
+ }
+ log_msg("==============================================");
+ }
+
+ // Sign
+ result = SignMsg(msg_str, msg_size, basename_str, basename_size,
+ signed_sig_rl, signed_sig_rl_size, signed_pubkey,
+ signed_pubkey_size, mprivkey, mprivkey_size, hashalg,
+ member_precmp_ptr, &sig, &sig_size, &cacert);
+
+ // Report Result
+ if (kEpidNoErr != result) {
+ if (kEpidSigRevokedInSigRl == result) {
+ log_error("signature revoked in SigRL");
+ } else {
+ log_error("function SignMsg returned %s", EpidStatusToString(result));
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ if (sig && sig_size != 0) {
+ // Store signature
+ if (0 != WriteLoud(sig, sig_size, sig_file->filename[0])) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Success
+ ret_value = EXIT_SUCCESS;
+ } while (0);
+
+ // Free allocated buffers
+ if (sig) free(sig);
+ if (msg_buf) free(msg_buf);
+ if (basename_buf) free(basename_buf);
+ if (signed_sig_rl) free(signed_sig_rl);
+ if (signed_pubkey) free(signed_pubkey);
+ if (mprivkey) free(mprivkey);
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
diff --git a/example/signmsg/src/prng.c b/example/signmsg/src/prng.c
new file mode 100644
index 0000000..129b859
--- /dev/null
+++ b/example/signmsg/src/prng.c
@@ -0,0 +1,98 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pseudo random number generator implementation.
+ */
+#include <ippcp.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "src/prng.h"
+
+EpidStatus PrngCreate(void** prng) {
+ // Security note:
+ // Random number generator used in the samples not claimed to be a
+ // cryptographically secure pseudo-random number generator.
+ EpidStatus sts = kEpidErr;
+ int prng_ctx_size = 0;
+ IppsPRNGState* prng_ctx = NULL;
+ int seed_ctx_size = 0;
+ IppsBigNumState* seed_ctx = NULL;
+ time_t seed_value;
+
+ if (!prng) return kEpidBadArgErr;
+
+ if (ippStsNoErr != ippsPRNGGetSize(&prng_ctx_size)) return kEpidErr;
+ if (ippStsNoErr !=
+ ippsBigNumGetSize((sizeof(seed_value) + 3) / 4, &seed_ctx_size))
+ return kEpidErr;
+
+ do {
+ prng_ctx = (IppsPRNGState*)calloc(1, prng_ctx_size);
+
+ if (!prng_ctx) {
+ sts = kEpidNoMemErr;
+ break;
+ }
+ if (ippStsNoErr != ippsPRNGInit(sizeof(seed_value) * 8, prng_ctx)) {
+ sts = kEpidErr;
+ break;
+ }
+
+ // seed PRNG
+ seed_ctx = (IppsBigNumState*)calloc(1, seed_ctx_size);
+ if (!seed_ctx) {
+ sts = kEpidNoMemErr;
+ break;
+ }
+ if (ippStsNoErr != ippsBigNumInit((sizeof(seed_value) + 3) / 4, seed_ctx)) {
+ sts = kEpidErr;
+ break;
+ }
+ time(&seed_value);
+ if (ippStsNoErr !=
+ ippsSetOctString_BN((void*)&seed_value, sizeof(seed_value), seed_ctx)) {
+ sts = kEpidErr;
+ break;
+ }
+ if (ippStsNoErr != ippsPRNGSetSeed(seed_ctx, prng_ctx)) {
+ sts = kEpidErr;
+ break;
+ }
+
+ *prng = prng_ctx;
+ prng_ctx = NULL;
+ sts = kEpidNoErr;
+ } while (0);
+
+ if (seed_ctx) free(seed_ctx);
+ if (prng_ctx) free(prng_ctx);
+ return sts;
+}
+
+void PrngDelete(void** prng) {
+ if (prng && *prng) {
+ free(*prng);
+ *prng = NULL;
+ }
+}
+
+// simple wrapper to hide IPP implementation.
+int __STDCALL PrngGen(unsigned int* rand_data, int num_bits, void* user_data) {
+ return ippsPRNGen(rand_data, num_bits, (IppsPRNGState*)user_data);
+}
diff --git a/example/signmsg/src/prng.h b/example/signmsg/src/prng.h
new file mode 100644
index 0000000..cca94cb
--- /dev/null
+++ b/example/signmsg/src/prng.h
@@ -0,0 +1,42 @@
+/*############################################################################
+ # Copyright 2016-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Pseudo random number generator interface.
+ */
+
+#ifndef EXAMPLE_SIGNMSG_SRC_PRNG_H_
+#define EXAMPLE_SIGNMSG_SRC_PRNG_H_
+
+#if defined(_WIN32) || defined(_WIN64)
+#define __STDCALL __stdcall
+#else
+#define __STDCALL
+#endif
+
+#include "epid/common/errors.h"
+
+/// Creates Pseudo Random Number Generator for ::PrngGen()
+EpidStatus PrngCreate(void** prng);
+
+/// Delete object allocated with ::PrngCreate()
+void PrngDelete(void** prng);
+
+/// BitSupplier type of function
+int __STDCALL PrngGen(unsigned int* rand_data, int num_bits, void* user_data);
+
+#endif // EXAMPLE_SIGNMSG_SRC_PRNG_H_
diff --git a/example/signmsg/src/signmsg.c b/example/signmsg/src/signmsg.c
new file mode 100644
index 0000000..8dd37bc
--- /dev/null
+++ b/example/signmsg/src/signmsg.c
@@ -0,0 +1,196 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+/// Message signing implementation.
+/*!
+ * \file
+ *
+ * This file has a corresponding walk-through in the SDK documentation.
+ *
+ * Review the walk-through for correctness after making changes to this
+ * file.
+ */
+#include "src/signmsg.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "epid/common/file_parser.h"
+#include "epid/member/api.h"
+#include "src/prng.h"
+#include "util/convutil.h"
+
+EpidStatus SignMsg(void const* msg, size_t msg_len, void const* basename,
+ size_t basename_len, unsigned char const* signed_sig_rl,
+ size_t signed_sig_rl_size,
+ unsigned char const* signed_pubkey,
+ size_t signed_pubkey_size, unsigned char const* priv_key_ptr,
+ size_t privkey_size, HashAlg hash_alg,
+ MemberPrecomp* member_precomp, EpidSignature** sig,
+ size_t* sig_len, EpidCaCertificate const* cacert) {
+ EpidStatus sts = kEpidErr;
+ void* prng = NULL;
+ MemberCtx* member = NULL;
+ SigRl* sig_rl = NULL;
+
+ do {
+ GroupPubKey pub_key = {0};
+ PrivKey priv_key = {0};
+ MembershipCredential member_credential = {0};
+ size_t sig_rl_size = 0;
+ MemberParams params = {0};
+ size_t member_size = 0;
+
+ if (!sig) {
+ sts = kEpidBadArgErr;
+ break;
+ }
+
+ // authenticate and extract group public key
+ sts = EpidParseGroupPubKeyFile(signed_pubkey, signed_pubkey_size, cacert,
+ &pub_key);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ // handle compressed private key or membership credential
+ if (privkey_size == sizeof(PrivKey)) {
+ priv_key = *(PrivKey*)priv_key_ptr;
+ } else if (privkey_size == sizeof(CompressedPrivKey)) {
+ sts = EpidDecompressPrivKey(&pub_key, (CompressedPrivKey*)priv_key_ptr,
+ &priv_key);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ } else if (privkey_size == sizeof(MembershipCredential)) {
+ member_credential = *(MembershipCredential*)priv_key_ptr;
+ } else {
+ sts = kEpidErr;
+ break;
+ } // if (privkey_size == sizeof(PrivKey))
+
+ // acquire PRNG
+ sts = PrngCreate(&prng);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+
+ SetMemberParams(&PrngGen, prng, NULL, &params);
+ // create member
+ sts = EpidMemberGetSize(&params, &member_size);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ member = (MemberCtx*)calloc(1, member_size);
+ if (!member) {
+ sts = kEpidNoMemErr;
+ break;
+ }
+ sts = EpidMemberInit(&params, member);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+
+ sts = EpidMemberSetHashAlg(member, hash_alg);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+
+ if (privkey_size == sizeof(PrivKey) ||
+ privkey_size == sizeof(CompressedPrivKey)) {
+ sts = EpidProvisionKey(member, &pub_key, &priv_key, member_precomp);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ } else if (privkey_size == sizeof(MembershipCredential)) {
+ sts = EpidProvisionCredential(member, &pub_key, &member_credential,
+ member_precomp);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ } // if (privkey_size == sizeof(PrivKey))
+ // start member
+ sts = EpidMemberStartup(member);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+
+ // register any provided basename as allowed
+ if (0 != basename_len) {
+ sts = EpidRegisterBasename(member, basename, basename_len);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ }
+
+ if (signed_sig_rl) {
+ // authenticate and determine space needed for SigRl
+ sts = EpidParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert, NULL,
+ &sig_rl_size);
+ if (kEpidSigInvalid == sts) {
+ // authentication failure
+ break;
+ }
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ sig_rl = calloc(1, sig_rl_size);
+ if (!sig_rl) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the SigRl
+ sts = EpidParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert,
+ sig_rl, &sig_rl_size);
+ if (kEpidSigInvalid == sts) {
+ // authentication failure
+ break;
+ }
+ if (kEpidNoErr != sts) {
+ break;
+ }
+
+ sts = EpidMemberSetSigRl(member, sig_rl, sig_rl_size);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ } // if (signed_sig_rl)
+
+ // Signature
+ // Note: Signature size must be computed after sig_rl is loaded.
+ *sig_len = EpidGetSigSize(sig_rl);
+
+ *sig = calloc(1, *sig_len);
+ if (!*sig) {
+ sts = kEpidMemAllocErr;
+ break;
+ }
+
+ // sign message
+ sts =
+ EpidSign(member, msg, msg_len, basename, basename_len, *sig, *sig_len);
+ if (kEpidNoErr != sts) {
+ break;
+ }
+ sts = kEpidNoErr;
+ } while (0);
+
+ PrngDelete(&prng);
+ EpidMemberDeinit(member);
+ if (member) free(member);
+
+ if (sig_rl) free(sig_rl);
+
+ return sts;
+}
diff --git a/example/signmsg/src/signmsg.h b/example/signmsg/src/signmsg.h
new file mode 100644
index 0000000..376b42a
--- /dev/null
+++ b/example/signmsg/src/signmsg.h
@@ -0,0 +1,42 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Message signing interface.
+ */
+
+#ifndef EXAMPLE_SIGNMSG_SRC_SIGNMSG_H_
+#define EXAMPLE_SIGNMSG_SRC_SIGNMSG_H_
+
+#include "epid/common/file_parser.h"
+#include "epid/common/stdtypes.h"
+#include "epid/member/api.h"
+
+/// Check if opaque data blob containing CA certificate is authorized
+bool IsCaCertAuthorizedByRootCa(void const* data, size_t size);
+
+/// Create Intel(R) EPID signature of message
+EpidStatus SignMsg(void const* msg, size_t msg_len, void const* basename,
+ size_t basename_len, unsigned char const* signed_sig_rl,
+ size_t signed_sig_rl_size,
+ unsigned char const* signed_pubkey,
+ size_t signed_pubkey_size, unsigned char const* priv_key_ptr,
+ size_t privkey_size, HashAlg hash_alg,
+ MemberPrecomp* member_precomp, EpidSignature** sig,
+ size_t* sig_len, EpidCaCertificate const* cacert);
+
+#endif // EXAMPLE_SIGNMSG_SRC_SIGNMSG_H_
diff --git a/example/util/Makefile b/example/util/Makefile
new file mode 100644
index 0000000..0c32769
--- /dev/null
+++ b/example/util/Makefile
@@ -0,0 +1,32 @@
+#!/usr/bin/make -f
+
+#define variables
+COMMON_INCLUDE_DIR = ../../
+UTIL_INCLUDE_DIR = ../
+
+UTIL_SRC = $(wildcard ./src/*.c)
+UTIL_OBJ = $(UTIL_SRC:.c=.o)
+UTIL_LIB = ./src/libutil.a
+
+#set additional compiler flag
+CFLAGS += -D_CRT_SECURE_NO_WARNINGS
+
+#target part
+$(UTIL_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) -I$(COMMON_INCLUDE_DIR) \
+ -I$(UTIL_INCLUDE_DIR) \
+ -c $^ -o $@
+
+$(UTIL_LIB): $(UTIL_OBJ)
+ $(AR) rc $(UTIL_LIB) $(UTIL_OBJ)
+ $(RANLIB) $(UTIL_LIB)
+
+build: all
+
+all: $(UTIL_LIB)
+
+install:
+
+clean:
+ rm -f $(UTIL_OBJ) $(UTIL_LIB)
+
diff --git a/example/util/buffutil.h b/example/util/buffutil.h
new file mode 100644
index 0000000..6c50eb6
--- /dev/null
+++ b/example/util/buffutil.h
@@ -0,0 +1,159 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Buffer handling utilities interface.
+ */
+#ifndef EXAMPLE_UTIL_BUFFUTIL_H_
+#define EXAMPLE_UTIL_BUFFUTIL_H_
+
+#include <stddef.h>
+#include "util/stdtypes.h"
+
+/// Options controlling how a buffer should be printed.
+typedef struct BufferPrintOptions {
+ bool show_header;
+ bool show_offset;
+ bool show_hex;
+ bool show_ascii;
+ size_t bytes_per_group;
+ size_t groups_per_line;
+} BufferPrintOptions;
+
+/// Toggle verbose logging
+bool ToggleVerbosity();
+
+/// Test if file exists
+/*!
+ \param[in] filename
+ The file path.
+
+ \returns bool
+*/
+bool FileExists(char const* filename);
+
+/// Get file size
+/*!
+ \param[in] filename
+
+ The file path.
+ \returns size of the file in bytes
+*/
+size_t GetFileSize(char const* filename);
+
+/// Get file size
+/*!
+ checks the size against an expected maximum size.
+ \param[in] filename
+
+ The file path.
+ \param[in] max_size
+
+ the maximum expected size of the file.
+ \returns size of the file in bytes
+*/
+size_t GetFileSize_S(char const* filename, size_t max_size);
+
+/// Allocate a buffer of a fixed size
+/*!
+ Logs an error message on failure.
+
+ \param[out] buffer
+ A pointer to the buffer to allocate.
+ \param[in] size
+ the requested size of the buffer in bytes.
+
+ \returns
+ A pointer to the allocated buffer or NULL if the allocation failed.
+
+*/
+void* AllocBuffer(size_t size);
+
+/// Allocate a buffer to hold the content of a file and load
+/*!
+ Logs an error message on failure.
+
+ \param[in] filename
+ The file path.
+ \param[out] size
+ The allocated size of the buffer in bytes (same as file size).
+
+ \returns
+ A pointer to the allocated buffer or NULL if the allocation failed.
+
+ \see ToggleVerbosity()
+*/
+void* NewBufferFromFile(const char* filename, size_t* size);
+
+/// Read a buffer from a file with logging
+/*!
+
+ Verbosity of logging controlled by verbosity state
+
+
+ \param[in] filename
+ The file path.
+ \param[in,out] buf
+ The buffer.
+ \param[in] size
+ The size of the buffer in bytes.
+
+ \returns 0 on success, non-zero failure
+
+ \see ToggleVerbosity()
+*/
+int ReadLoud(char const* filename, void* buf, size_t size);
+
+/// write a buffer from a file with logging
+/*!
+
+ Verbosity of logging controlled by verbosity state
+
+ \param[in] buf
+ The buffer.
+ \param[in] size
+ The size of the buffer in bytes.
+ \param[in] filename
+ The file path.
+
+ \returns 0 on success, non-zero failure
+
+ \see ToggleVerbosity()
+*/
+int WriteLoud(void* buf, size_t size, char const* filename);
+
+/// print a buffer to standard out using user provided options
+/*!
+ \param[in] buf
+ The buffer.
+ \param[in] size
+ The size of the buffer in bytes.
+ \param[in] opts
+ The formatting options.
+*/
+void PrintBufferOpt(const void* buffer, size_t size, BufferPrintOptions opts);
+
+/// print a buffer to standard out using default options
+/*!
+ \param[in] buf
+ The buffer.
+ \param[in] size
+ The size of the buffer in bytes.
+*/
+void PrintBuffer(const void* buffer, size_t size);
+
+#endif // EXAMPLE_UTIL_BUFFUTIL_H_
diff --git a/example/util/convutil.h b/example/util/convutil.h
new file mode 100644
index 0000000..15df691
--- /dev/null
+++ b/example/util/convutil.h
@@ -0,0 +1,98 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Conversion utilities interface.
+ */
+#ifndef EXAMPLE_UTIL_CONVUTIL_H_
+#define EXAMPLE_UTIL_CONVUTIL_H_
+
+#include <stddef.h>
+#include "epid/common/bitsupplier.h"
+#include "epid/common/file_parser.h"
+#include "epid/common/types.h"
+#include "util/stdtypes.h"
+#ifdef TPM_TSS
+#include "epid/member/tpm_member.h"
+#else
+#include "epid/member/software_member.h"
+#endif
+
+/// Implementation specific configuration parameters.
+typedef struct MemberParams MemberParams;
+
+/// convert a hash algorithm to a string
+/*!
+ \param[in] alg a hash algorithm
+ \returns string representing the algorithm
+*/
+char const* HashAlgToString(HashAlg alg);
+
+/// convert a string to a hash algorithm
+/*!
+ \param[in] str a string
+ \param[out] alg a hash algorithm
+ \retval true string represents a hash algorithm
+ \retval false string does not represent a hash algorithm
+*/
+bool StringToHashAlg(char const* str, HashAlg* alg);
+
+/// convert an Intel(R) EPID version to a string
+/*!
+\param[in] version an Intel(R) EPID version
+\returns string representing the version
+*/
+char const* EpidVersionToString(EpidVersion version);
+
+/// convert a string to an Intel(R) EPID version
+/*!
+\param[in] str a string
+\param[out] version an Intel(R) EPID version
+\retval true string represents an Intel(R) EPID version
+\retval false string does not represent an Intel(R) EPID version
+*/
+bool StringToEpidVersion(char const* str, EpidVersion* version);
+
+/// convert an Intel(R) EPID file type to a string
+/*!
+\param[in] type an Intel(R) EPID file type
+\returns string representing the algorithm
+*/
+char const* EpidFileTypeToString(EpidFileType type);
+
+/// convert a string to an Intel(R) EPID file type
+/*!
+\param[in] str a string
+\param[out] type an Intel(R) EPID file type
+\retval true string represents an Intel(R) EPID file type
+\retval false string does not represent an Intel(R) EPID file type
+*/
+bool StringToEpidFileType(char const* str, EpidFileType* type);
+
+/// set MemberParams to encapsulate different structure of Memparams
+/// in case of TPM mode and none TPM mode
+/*!
+\param[in] rnd_func a Intel(R) EPID BitSupplier
+\param[in] rnd_param a random parameters for BitSupplier
+\param[in] f is Intel(R) EPID FpElemStr
+\param[out] params is Intel(R) EPID MemberParams
+\returns void
+*/
+void SetMemberParams(BitSupplier rnd_func, void* rnd_param, FpElemStr* f,
+ MemberParams* params);
+
+#endif // EXAMPLE_UTIL_CONVUTIL_H_
diff --git a/example/util/envutil.h b/example/util/envutil.h
new file mode 100644
index 0000000..794f229
--- /dev/null
+++ b/example/util/envutil.h
@@ -0,0 +1,54 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Environment utilities interface.
+ */
+#ifndef EXAMPLE_UTIL_ENVUTIL_H_
+#define EXAMPLE_UTIL_ENVUTIL_H_
+
+/// set the program name
+void set_prog_name(char const* name);
+
+/// get the program name
+char const* get_prog_name();
+
+/// log an error
+/*!
+This function may add or format the message before writing it out
+
+output is written to the error stream
+*/
+int log_error(char const* msg, ...);
+
+/// log a message
+/*!
+This function may add or format the message before writing it out
+
+output is written to the standard output stream
+*/
+int log_msg(char const* msg, ...);
+
+/// log a formatted message
+/*!
+This function will not add or format the message before writing it out
+
+output is written to the standard output stream
+*/
+int log_fmt(char const* msg, ...);
+
+#endif // EXAMPLE_UTIL_ENVUTIL_H_
diff --git a/example/util/src/bufutil.c b/example/util/src/bufutil.c
new file mode 100644
index 0000000..6e87cda
--- /dev/null
+++ b/example/util/src/bufutil.c
@@ -0,0 +1,364 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Buffer handling utilities implementation.
+ */
+
+#include <util/buffutil.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "util/envutil.h"
+
+/// file static variable that indicates verbose logging
+static bool g_bufutil_verbose = false;
+
+bool ToggleVerbosity() {
+ g_bufutil_verbose = (g_bufutil_verbose) ? false : true;
+ return g_bufutil_verbose;
+}
+
+bool FileExists(char const* filename) {
+ FILE* fp = NULL;
+ if (!filename || !filename[0]) {
+ return false;
+ }
+ fp = fopen(filename, "rb");
+ if (fp) {
+ fclose(fp);
+ return true;
+ }
+ return false;
+}
+
+size_t GetFileSize(char const* filename) {
+ size_t file_length = 0;
+ FILE* fp = fopen(filename, "rb");
+ if (fp) {
+ fseek(fp, 0, SEEK_END);
+ file_length = ftell(fp);
+ fclose(fp);
+ }
+ return file_length;
+}
+
+size_t GetFileSize_S(char const* filename, size_t max_size) {
+ size_t size = GetFileSize(filename);
+ if (size > max_size) {
+ return 0;
+ } else {
+ return size;
+ }
+}
+
+void* AllocBuffer(size_t size) {
+ void* buffer = NULL;
+ if (size) {
+ buffer = malloc(size);
+ }
+ if (!buffer) {
+ log_error("failed to allocate memory");
+ }
+ return buffer;
+}
+
+void* NewBufferFromFile(const char* filename, size_t* size) {
+ void* buffer = NULL;
+
+ do {
+ size_t len = 0;
+
+ if (!FileExists(filename)) {
+ log_error("cannot access '%s'", filename);
+ break;
+ }
+
+ len = GetFileSize_S(filename, SIZE_MAX);
+ if (len == 0) {
+ log_error("cannot load empty file '%s'", filename);
+ break;
+ }
+
+ buffer = AllocBuffer(len);
+
+ if (buffer) {
+ if (0 != ReadLoud(filename, buffer, len)) {
+ free(buffer);
+ buffer = NULL;
+ break;
+ }
+ }
+
+ if (size) {
+ *size = len;
+ }
+ } while (0);
+ return buffer;
+}
+
+int ReadBufferFromFile(const char* filename, void* buffer, size_t size) {
+ int result = 0;
+ FILE* file = NULL;
+ do {
+ size_t bytes_read = 0;
+ size_t file_size = 0;
+ file = fopen(filename, "rb");
+ if (!file) {
+ result = -1;
+ break;
+ }
+ fseek(file, 0, SEEK_END);
+ file_size = ftell(file);
+ fseek(file, 0, SEEK_SET);
+ if ((size_t)file_size != size) {
+ result = -1;
+ break;
+ }
+
+ if (buffer && (0 != size)) {
+ bytes_read = fread(buffer, 1, size, file);
+ if (bytes_read != size) {
+ result = -1;
+ break;
+ }
+ }
+ } while (0);
+
+ if (file) {
+ fclose(file);
+ }
+
+ return result;
+}
+
+int WriteBufferToFile(const void* buffer, size_t size, const char* filename) {
+ int result = 0;
+ FILE* file = NULL;
+ do {
+ size_t bytes_written = 0;
+
+ file = fopen(filename, "wb");
+ if (!file) {
+ result = -1;
+ break;
+ }
+ bytes_written = fwrite(buffer, 1, size, file);
+ if (bytes_written != size) {
+ result = -1;
+ break;
+ }
+ } while (0);
+
+ if (file) {
+ fclose(file);
+ }
+
+ return result;
+}
+
+int ReadLoud(char const* filename, void* buf, size_t size) {
+ int result;
+
+ if (!buf || 0 == size) {
+ log_error("internal error: invalid buffer to ReadLoud");
+ return -1;
+ }
+
+ if (g_bufutil_verbose) {
+ log_msg("reading %s", filename);
+ }
+
+ if (!FileExists(filename)) {
+ log_error("cannot access '%s' for reading", filename);
+ return -1;
+ }
+
+ if (size != GetFileSize(filename)) {
+ log_error("unexpected file size for '%s'. Expected: %d; got: %d", filename,
+ (int)size, (int)GetFileSize(filename));
+ return -1;
+ }
+
+ result = ReadBufferFromFile(filename, buf, size);
+ if (0 != result) {
+ log_error("failed to read from `%s`", filename);
+ return result;
+ }
+
+ if (g_bufutil_verbose) {
+ PrintBuffer(buf, size);
+ }
+
+ return result;
+}
+
+int WriteLoud(void* buf, size_t size, char const* filename) {
+ int result = -1;
+
+ if (!buf || 0 == size) {
+ log_error("internal error: invalid buffer to WriteLoud");
+ return -1;
+ }
+
+ if (g_bufutil_verbose) {
+ log_msg("writing %s", filename);
+ }
+
+ result = WriteBufferToFile(buf, size, filename);
+
+ if (0 != result) {
+ log_error("failed to write to `%s`", filename);
+ return result;
+ }
+
+ if (g_bufutil_verbose) {
+ PrintBuffer(buf, size);
+ }
+
+ return result;
+}
+
+void PrintBuffer(const void* buffer, size_t size) {
+ BufferPrintOptions opts;
+ opts.show_header = true;
+ opts.show_offset = true;
+ opts.show_hex = true;
+ opts.show_ascii = true;
+ opts.bytes_per_group = 2;
+ opts.groups_per_line = 8;
+ PrintBufferOpt(buffer, size, opts);
+}
+
+void PrintBufferOpt(const void* buffer, size_t size, BufferPrintOptions opts) {
+ unsigned char* bytes = (unsigned char*)buffer;
+ size_t bytes_per_line = opts.bytes_per_group * opts.groups_per_line;
+ size_t line_offset = 0;
+ size_t byte_offset = 0;
+ size_t byte_col = 0;
+ if (opts.show_header) {
+ if (opts.show_offset) {
+ log_fmt(" offset");
+ log_fmt(": ");
+ }
+
+ if (opts.show_hex) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ log_fmt("%x%x", (int)byte_col, (int)byte_col);
+ if (0 == (byte_col + 1) % opts.bytes_per_group) {
+ log_fmt(" ");
+ }
+ byte_col += 1;
+ }
+ }
+
+ if (opts.show_hex && opts.show_ascii) {
+ log_fmt("| ");
+ }
+
+ if (opts.show_ascii) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ log_fmt("%x", (int)byte_col);
+ byte_col += 1;
+ }
+ }
+
+ log_fmt("\n");
+
+ if (opts.show_offset) {
+ log_fmt("--------");
+ log_fmt(": ");
+ }
+
+ if (opts.show_hex) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ log_fmt("--");
+ if (0 == (byte_col + 1) % opts.bytes_per_group) {
+ log_fmt("-");
+ }
+ byte_col += 1;
+ }
+ }
+
+ if (opts.show_hex && opts.show_ascii) {
+ log_fmt("|-");
+ }
+
+ if (opts.show_ascii) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ log_fmt("-");
+ byte_col += 1;
+ }
+ }
+ log_fmt("\n");
+ }
+
+ line_offset = 0;
+
+ while (line_offset < size) {
+ if (opts.show_offset) {
+ log_fmt("%08x", (int)line_offset);
+ log_fmt(": ");
+ }
+
+ if (opts.show_hex) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ byte_offset = line_offset + byte_col;
+ if (byte_offset < size) {
+ log_fmt("%02x", (int)bytes[byte_offset]);
+ } else {
+ log_fmt(" ");
+ }
+ if (0 == (byte_col + 1) % opts.bytes_per_group) {
+ log_fmt(" ");
+ }
+ byte_col += 1;
+ }
+ }
+
+ if (opts.show_hex && opts.show_ascii) {
+ log_fmt("| ");
+ }
+
+ if (opts.show_ascii) {
+ byte_col = 0;
+ while (byte_col < bytes_per_line) {
+ byte_offset = line_offset + byte_col;
+ if (byte_offset < size) {
+ unsigned char ch = bytes[byte_offset];
+ if (isprint(ch)) {
+ log_fmt("%c", ch);
+ } else {
+ log_fmt(".");
+ }
+ } else {
+ log_fmt(" ");
+ }
+ byte_col += 1;
+ }
+ }
+
+ log_fmt("\n");
+ line_offset += bytes_per_line;
+ }
+}
diff --git a/example/util/src/convutil.c b/example/util/src/convutil.c
new file mode 100644
index 0000000..c3bf2bc
--- /dev/null
+++ b/example/util/src/convutil.c
@@ -0,0 +1,108 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Conversion utilities implementation.
+ *
+ */
+
+#include "util/convutil.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "util/envutil.h"
+
+const char* hash_alg_to_string[] = {"SHA-256", "SHA-384", "SHA-512",
+ "SHA-512/256", "SHA3/256", "SHA3/384",
+ "SHA3/512"};
+
+#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
+
+char const* HashAlgToString(HashAlg alg) {
+ if ((int)alg < 0 || (size_t)alg >= COUNT_OF(hash_alg_to_string))
+ return "unknown";
+ return hash_alg_to_string[alg];
+}
+
+bool StringToHashAlg(char const* str, HashAlg* alg) {
+ size_t i;
+ if (!alg || !str) return false;
+ for (i = 0; i < COUNT_OF(hash_alg_to_string); i++) {
+ if (0 == strcmp(str, hash_alg_to_string[i])) {
+ *alg = (HashAlg)i;
+ return true;
+ }
+ }
+ return false;
+}
+
+const char* epid_version_to_string[kNumEpidVersions] = {"1", "2"};
+
+char const* EpidVersionToString(EpidVersion version) {
+ if ((int)version < 0 || (size_t)version >= COUNT_OF(epid_version_to_string))
+ return "unknown";
+ return epid_version_to_string[version];
+}
+
+bool StringToEpidVersion(char const* str, EpidVersion* version) {
+ size_t i;
+ if (!version || !str) return false;
+ for (i = 0; i < COUNT_OF(epid_version_to_string); i++) {
+ if (0 == strcmp(str, epid_version_to_string[i])) {
+ *version = (EpidVersion)i;
+ return true;
+ }
+ }
+ log_error("epid version \"%s\" is unknown", str);
+ return false;
+}
+
+const char* epid_file_type_to_string[kNumFileTypes] = {
+ "IssuingCaPubKey", "GroupPubKey", "PrivRl", "SigRl", "GroupRl"};
+
+char const* EpidFileTypeToString(EpidFileType type) {
+ if ((int)type < 0 || (size_t)type >= COUNT_OF(epid_file_type_to_string))
+ return "unknown";
+ return epid_file_type_to_string[type];
+}
+
+bool StringToEpidFileType(char const* str, EpidFileType* type) {
+ size_t i;
+ if (!type || !str) return false;
+ for (i = 0; i < COUNT_OF(epid_file_type_to_string); i++) {
+ if (0 == strcmp(str, epid_file_type_to_string[i])) {
+ *type = (EpidFileType)i;
+ return true;
+ }
+ }
+ log_error("epid file type \"%s\" is unknown", str);
+ return false;
+}
+
+void SetMemberParams(BitSupplier rnd_func, void* rnd_param, FpElemStr* f,
+ MemberParams* params) {
+#ifdef TPM_TSS
+ (void)rnd_func;
+ (void)rnd_param;
+ params->f = f;
+#else
+ params->rnd_func = rnd_func;
+ params->rnd_param = rnd_param;
+ params->f = f;
+#endif
+}
diff --git a/example/util/src/envutil.c b/example/util/src/envutil.c
new file mode 100644
index 0000000..f594e35
--- /dev/null
+++ b/example/util/src/envutil.c
@@ -0,0 +1,91 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Environment utilities implementation.
+ */
+
+#include "util/envutil.h"
+#include <stdarg.h>
+#include <stdio.h>
+
+static char const* prog_name = NULL;
+
+void set_prog_name(char const* name) { prog_name = name; }
+
+char const* get_prog_name() { return prog_name; }
+
+int log_error(char const* msg, ...) {
+ int result = 0;
+ int local_result = 0;
+ va_list args;
+ va_start(args, msg);
+ do {
+ local_result = fprintf(stderr, "%s: ", prog_name);
+ if (local_result < 0) {
+ result = local_result;
+ break;
+ }
+ result += local_result;
+ local_result = vfprintf(stderr, msg, args);
+ if (local_result < 0) {
+ result = local_result;
+ break;
+ }
+ result += local_result;
+ local_result = fprintf(stderr, "\n");
+ if (local_result < 0) {
+ result = local_result;
+ break;
+ }
+ result += local_result;
+ } while (0);
+ va_end(args);
+ return result;
+}
+
+int log_msg(char const* msg, ...) {
+ int result = 0;
+ int local_result = 0;
+ va_list args;
+ va_start(args, msg);
+ do {
+ local_result = vfprintf(stdout, msg, args);
+ if (local_result < 0) {
+ result = local_result;
+ break;
+ }
+ result += local_result;
+ local_result = fprintf(stdout, "\n");
+ if (local_result < 0) {
+ result = local_result;
+ break;
+ }
+ result += local_result;
+ } while (0);
+ va_end(args);
+ return result;
+}
+
+int log_fmt(char const* msg, ...) {
+ int result = 0;
+ va_list args;
+ va_start(args, msg);
+ result = vfprintf(stdout, msg, args);
+ va_end(args);
+ return result;
+}
diff --git a/example/util/src/strutil.c b/example/util/src/strutil.c
new file mode 100644
index 0000000..2080fc1
--- /dev/null
+++ b/example/util/src/strutil.c
@@ -0,0 +1,53 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Buffer handling utilities implementation.
+ */
+
+#include <stdarg.h>
+#include <util/strutil.h>
+
+#include <stdio.h>
+#if defined(_MSC_VER) && _MSC_VER < 1900
+int vsnprintf(char* outBuf, size_t size, const char* format, va_list ap) {
+ int count = -1;
+
+ if (0 != size) {
+ count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
+ }
+ if (-1 == count) {
+ // vsnprintf returns "The number of characters that would have been
+ // written if n had been sufficiently large" however _vsnprintf_s
+ // returns -1 if the content was truncated.
+ // _vscprintf calculates that value
+ count = _vscprintf(format, ap);
+ }
+ return count;
+}
+
+int snprintf(char* outBuf, size_t size, const char* format, ...) {
+ int count;
+ va_list ap;
+
+ va_start(ap, format);
+ count = vsnprintf(outBuf, size, format, ap);
+ va_end(ap);
+
+ return count;
+}
+#endif
diff --git a/example/util/stdtypes.h b/example/util/stdtypes.h
new file mode 100644
index 0000000..72cead8
--- /dev/null
+++ b/example/util/stdtypes.h
@@ -0,0 +1,39 @@
+/*############################################################################
+ # Copyright 2016 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#ifndef EXAMPLE_UTIL_STDTYPES_H_
+#define EXAMPLE_UTIL_STDTYPES_H_
+
+/*!
+ * \file
+ * \brief C99 standard data types.
+ */
+
+#include <stdint.h> // Fixed-width integer types
+
+#ifndef __cplusplus
+#ifndef _Bool
+/// C99 standard name for bool
+#define _Bool char
+/// Boolean type
+typedef char bool;
+/// integer constant 1
+#define true 1
+/// integer constant 0
+#define false 0
+#endif //
+#endif // ifndef __cplusplus
+
+#endif // EXAMPLE_UTIL_STDTYPES_H_
diff --git a/example/util/strutil.h b/example/util/strutil.h
new file mode 100644
index 0000000..1cfe5b3
--- /dev/null
+++ b/example/util/strutil.h
@@ -0,0 +1,33 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Buffer handling utilities interface.
+ */
+#ifndef EXAMPLE_UTIL_STRUTIL_H_
+#define EXAMPLE_UTIL_STRUTIL_H_
+
+#include <stdarg.h>
+#include <stdio.h>
+
+// Prior to version 14.0 snprintf was not supported in MSVC
+#if defined(_MSC_VER) && _MSC_VER < 1900
+int vsnprintf(char* outBuf, size_t size, const char* format, va_list ap);
+int snprintf(char* outBuf, size_t size, const char* format, ...);
+#endif
+
+#endif // EXAMPLE_UTIL_STRUTIL_H_
diff --git a/example/util/util.parts b/example/util/util.parts
new file mode 100644
index 0000000..289475b
--- /dev/null
+++ b/example/util/util.parts
@@ -0,0 +1,64 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("util")
+
+src_files = Pattern(src_dir='src', includes=['*.c'], recursive=True).files()
+
+api_headers = Pattern(src_dir='.', includes=['*.h'], recursive=False).files()
+parts_file = ['util.parts']
+
+makefile = ['Makefile']
+#unit tests
+utest_files = Pattern(
+ src_dir='.',
+ includes=['*-test.cc', '*-testhelper.cc'],
+ excludes=[],
+ recursive=True).files()
+
+if 'use_tss' in env['MODE']:
+ env.Append(CPPDEFINES=['TPM_TSS'])
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='example/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(api_headers, sub_dir='example/${PART_SHORT_NAME}')
+ env.InstallTopLevel(
+ utest_files, sub_dir='example/${PART_SHORT_NAME}/utest')
+ env.InstallTopLevel(parts_file, sub_dir='example/${PART_SHORT_NAME}')
+ env.InstallTopLevel(makefile, sub_dir='example/${PART_SHORT_NAME}')
+else:
+ env.DependsOn(
+ [Component('common', requires=REQ.HEADERS),
+ Component('member', requires=REQ.HEADERS)])
+
+ env.Append(CPPPATH='#/example')
+
+ testenv = env.Clone()
+
+ env.SdkInclude(api_headers, sub_dir='${PART_SHORT_NAME}')
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ #env.Append(CPPDEFINES = 'ENABLE_UTIL_DEBUG_PRINT_')
+ env.Append(CPPDEFINES='_CRT_SECURE_NO_WARNINGS')
+
+ outputs = env.Library('${PART_NAME}', src_files)
+
+ env.Sdk(outputs)
diff --git a/example/verifysig/src/main.c b/example/verifysig/src/main.c
new file mode 100644
index 0000000..c154db2
--- /dev/null
+++ b/example/verifysig/src/main.c
@@ -0,0 +1,515 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Verifysig example implementation.
+ */
+
+#include <argtable3.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "epid/common/file_parser.h"
+#include "epid/verifier/1.1/api.h"
+#include "epid/verifier/api.h"
+#include "src/verifysig.h"
+#include "src/verifysig11.h"
+#include "util/buffutil.h"
+#include "util/convutil.h"
+#include "util/envutil.h"
+
+// Defaults
+#define PROGRAM_NAME "verifysig"
+#define PUBKEYFILE_DEFAULT "pubkey.bin"
+#define PRIVRL_DEFAULT NULL
+#define SIGRL_DEFAULT NULL
+#define GRPRL_DEFAULT "grprl.bin"
+#define VERIFIERRL_DEFAULT NULL
+#define SIG_DEFAULT "sig.dat"
+#define CACERT_DEFAULT "cacert.bin"
+#define HASHALG_DEFAULT "SHA-512"
+#define VPRECMPI_DEFAULT NULL
+#define VPRECMPO_DEFAULT NULL
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 17
+
+bool IsCaCertAuthorizedByRootCa(void const* data, size_t size) {
+ // Implementation of this function is out of scope of the sample.
+ // In an actual implementation Issuing CA certificate must be validated
+ // with CA Root certificate before using it in parse functions.
+ (void)data;
+ (void)size;
+ return true;
+}
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_SUCCESS;
+ // intermediate return value for Intel(R) EPID functions
+ EpidStatus result = kEpidErr;
+
+ // User Settings
+
+ // Message string parameter
+ static char* msg_str = NULL;
+ size_t msg_size = 0;
+ char* msg_buf = NULL; // message loaded from msg_file
+
+ // Basename string parameter
+ static char* basename_str = NULL;
+ size_t basename_size = 0;
+ char* basename_buf = NULL; // basename loaded from basename_file
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ // Buffers and computed values
+
+ // Signature buffer
+ void* sig = NULL;
+ size_t sig_size = 0;
+
+ // PrivRl buffer
+ void* signed_priv_rl = NULL;
+ size_t signed_priv_rl_size = 0;
+
+ // SigRl buffer
+ void* signed_sig_rl = NULL;
+ size_t signed_sig_rl_size = 0;
+
+ // GrpRl buffer
+ void* signed_grp_rl = NULL;
+ size_t signed_grp_rl_size = 0;
+
+ // VerRl buffer
+ VerifierRl* ver_rl = NULL;
+ size_t ver_rl_size = 0;
+
+ // Group public key buffer
+ void* signed_pubkey = NULL;
+ size_t signed_pubkey_size = 0;
+
+ // Verifier pre-computed settings
+ void* verifier_precmp = NULL;
+ size_t vprecmpi_file_size = 0;
+
+ // CA certificate
+ EpidCaCertificate cacert = {0};
+ // Hash algorithm
+ static HashAlg hashalg = kInvalidHashAlg;
+
+ // Argument variables
+ struct arg_file* sig_file =
+ arg_file0(NULL, "sig", "FILE",
+ "load signature from FILE (default: " SIG_DEFAULT ")");
+ struct arg_str* msg = arg_str0(NULL, "msg", "MESSAGE",
+ "MESSAGE that was signed (default: empty)");
+ struct arg_file* msg_file = arg_file0(
+ NULL, "msgfile", "FILE", "FILE containing message that was signed");
+ struct arg_str* basename = arg_str0(
+ NULL, "bsn", "BASENAME", "BASENAME used in signature (default: random)");
+ struct arg_file* basename_file = arg_file0(
+ NULL, "bsnfile", "FILE", "FILE containing basename used in signature");
+ struct arg_file* privrl_file = arg_file0(
+ NULL, "privrl", "FILE", "load private key revocation list from FILE");
+ struct arg_file* sigrl_file = arg_file0(
+ NULL, "sigrl", "FILE", "load signature based revocation list from FILE");
+ struct arg_file* grprl_file = arg_file0(
+ NULL, "grprl", "FILE",
+ "load group revocation list from FILE (default: " GRPRL_DEFAULT ")");
+ struct arg_file* verrl_file = arg_file0(
+ NULL, "verifierrl", "FILE", "load verifier revocation list from FILE");
+ struct arg_file* pubkey_file = arg_file0(
+ NULL, "gpubkey", "FILE",
+ "load group public key from FILE (default: " PUBKEYFILE_DEFAULT ")");
+ struct arg_file* vprecmpi_file = arg_file0(
+ NULL, "vprecmpi", "FILE", "load pre-computed verifier data from FILE");
+ struct arg_file* vprecmpo_file = arg_file0(
+ NULL, "vprecmpo", "FILE", "write pre-computed verifier data to FILE");
+ struct arg_file* cacert_file = arg_file0(
+ NULL, "capubkey", "FILE",
+ "load IoT Issuing CA public key from FILE (default: " CACERT_DEFAULT ")");
+ struct arg_str* hashalg_str = arg_str0(
+ NULL, "hashalg", "{SHA-256 | SHA-384 | SHA-512 | SHA-512/256}",
+ "use specified hash algorithm for 2.0 groups (default: " HASHALG_DEFAULT
+ ")");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = sig_file;
+ argtable[1] = msg;
+ argtable[2] = msg_file;
+ argtable[3] = basename;
+ argtable[4] = basename_file;
+ argtable[5] = privrl_file;
+ argtable[6] = sigrl_file;
+ argtable[7] = grprl_file;
+ argtable[8] = verrl_file;
+ argtable[9] = pubkey_file;
+ argtable[10] = vprecmpi_file;
+ argtable[11] = vprecmpo_file;
+ argtable[12] = cacert_file;
+ argtable[13] = hashalg_str;
+ argtable[14] = help;
+ argtable[15] = verbose;
+ argtable[16] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ EpidVersion epid_version = kNumEpidVersions;
+ // Read command line args
+
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* set any command line default values prior to parsing */
+ sig_file->filename[0] = SIG_DEFAULT;
+ grprl_file->filename[0] = GRPRL_DEFAULT;
+ pubkey_file->filename[0] = PUBKEYFILE_DEFAULT;
+ cacert_file->filename[0] = CACERT_DEFAULT;
+ hashalg_str->sval[0] = HASHALG_DEFAULT;
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]...\n"
+ "Verify signature was created by group member in good standing\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (msg->count > 0 && msg_file->count > 0) {
+ log_error("options --msg and --msgfile cannot be used together");
+ ret_value = EXIT_FAILURE;
+ break;
+ } else if (msg->count > 0) {
+ msg_str = (char*)msg->sval[0];
+ msg_size = strlen(msg_str);
+ } else if (msg_file->count > 0) {
+ msg_buf = NewBufferFromFile(msg_file->filename[0], &msg_size);
+ if (!msg_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ msg_str = msg_buf;
+ } else {
+ msg_size = 0;
+ }
+
+ if (basename->count > 0 && basename_file->count > 0) {
+ log_error("options --bsn and --bsnfile cannot be used together");
+ ret_value = EXIT_FAILURE;
+ break;
+ } else if (basename->count > 0) {
+ basename_str = (char*)basename->sval[0];
+ basename_size = strlen(basename_str);
+ } else if (basename_file->count > 0) {
+ basename_buf =
+ NewBufferFromFile(basename_file->filename[0], &basename_size);
+ if (!basename_buf) {
+ log_error("Failed in reading basename from %s", basename_file);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ basename_str = basename_buf;
+ } else {
+ basename_size = 0;
+ }
+
+ if (!StringToHashAlg(hashalg_str->sval[0], &hashalg)) {
+ log_error("invalid hashalg: %s", hashalg_str->sval[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (verbose_flag) {
+ log_msg("\nOption values:");
+ log_msg(" sig_file : %s", sig_file->filename[0]);
+ log_msg(" msg_str : %s", msg_str);
+ log_msg(" basename_str : %s", basename_str);
+ log_msg(" privrl_file : %s", privrl_file->filename[0]);
+ log_msg(" sigrl_file : %s", sigrl_file->filename[0]);
+ log_msg(" grprl_file : %s", grprl_file->filename[0]);
+ log_msg(" verrl_file : %s", verrl_file->filename[0]);
+ log_msg(" vprecmpi_file : %s", vprecmpi_file->filename[0]);
+ log_msg(" vprecmpo_file : %s", vprecmpo_file->filename[0]);
+ log_msg(" hashalg : %s", HashAlgToString(hashalg));
+ log_msg(" cacert_file : %s", cacert_file->filename[0]);
+ log_msg("");
+ }
+ // convert command line args to usable formats
+
+ // Signature
+ sig = NewBufferFromFile(sig_file->filename[0], &sig_size);
+ if (!sig) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // PrivRl
+ if (privrl_file->count > 0) {
+ signed_priv_rl =
+ NewBufferFromFile(privrl_file->filename[0], &signed_priv_rl_size);
+ if (!signed_priv_rl) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // SigRl
+ if (sigrl_file->count > 0) {
+ signed_sig_rl =
+ NewBufferFromFile(sigrl_file->filename[0], &signed_sig_rl_size);
+ if (!signed_sig_rl) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // GrpRl
+ signed_grp_rl =
+ NewBufferFromFile(grprl_file->filename[0], &signed_grp_rl_size);
+ if (!signed_grp_rl) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // VerRl
+ if (verrl_file->count > 0) {
+ ver_rl =
+ (VerifierRl*)NewBufferFromFile(verrl_file->filename[0], &ver_rl_size);
+ if (!ver_rl) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Group public key
+ signed_pubkey =
+ NewBufferFromFile(pubkey_file->filename[0], &signed_pubkey_size);
+ if (!signed_pubkey) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // CA certificate
+ if (0 != ReadLoud(cacert_file->filename[0], &cacert, sizeof(cacert))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Security note:
+ // Application must confirm that IoT Issuing CA
+ // certificate is authorized by IoT Root CA,
+ // e.g., signed by IoT Root CA.
+ if (!IsCaCertAuthorizedByRootCa(&cacert, sizeof(cacert))) {
+ log_error("CA certificate is not authorized");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Detect Intel(R) EPID version
+ result = EpidParseFileHeader(signed_pubkey, signed_pubkey_size,
+ &epid_version, NULL);
+ if (kEpidNoErr != result || kNumEpidVersions <= epid_version) {
+ log_error("EPID version can not be detected");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Configure hashalg based on group
+ if (kEpid1x == epid_version) {
+ if (kSha256 != hashalg && hashalg_str->count > 0) {
+ log_error(
+ "unsupported hash algorithm: %s only supported for 2.0 groups",
+ HashAlgToString(hashalg));
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Load Verifier pre-computed settings
+
+ if (vprecmpi_file->count > 0) {
+ vprecmpi_file_size = GetFileSize_S(vprecmpi_file->filename[0], SIZE_MAX);
+ verifier_precmp = AllocBuffer(vprecmpi_file_size);
+
+ if (0 != ReadLoud(vprecmpi_file->filename[0], verifier_precmp,
+ vprecmpi_file_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Report Settings
+ if (verbose_flag) {
+ log_msg("==============================================");
+ log_msg("Verifying Message:");
+ log_msg("");
+ log_msg(" [in] Intel(R) EPID version: %s",
+ EpidVersionToString(epid_version));
+ log_msg("");
+ log_msg(" [in] Signature Len: %d", (int)sig_size);
+ log_msg(" [in] Signature: ");
+ PrintBuffer(sig, sig_size);
+ log_msg("");
+ log_msg(" [in] Message Len: %d", (int)msg_size);
+ log_msg(" [in] Message: ");
+ PrintBuffer(msg_str, msg_size);
+ log_msg("");
+ log_msg(" [in] BaseName Len: %d", (int)basename_size);
+ log_msg(" [in] BaseName: ");
+ PrintBuffer(basename_str, basename_size);
+ log_msg("");
+ log_msg(" [in] PrivRl Len: %d", (int)signed_priv_rl_size);
+ log_msg(" [in] PrivRl: ");
+ PrintBuffer(signed_priv_rl, signed_priv_rl_size);
+ log_msg("");
+ log_msg(" [in] SigRl Len: %d", (int)signed_sig_rl_size);
+ log_msg(" [in] SigRl: ");
+ PrintBuffer(signed_sig_rl, signed_sig_rl_size);
+ log_msg("");
+ log_msg(" [in] GrpRl Len: %d", (int)signed_grp_rl_size);
+ log_msg(" [in] GrpRl: ");
+ PrintBuffer(signed_grp_rl, signed_grp_rl_size);
+ log_msg("");
+ log_msg(" [in] VerRl Len: %d", (int)ver_rl_size);
+ log_msg(" [in] VerRl: ");
+ PrintBuffer(ver_rl, ver_rl_size);
+ log_msg("");
+ log_msg(" [in] Group Public Key: ");
+ PrintBuffer(signed_pubkey, sizeof(signed_pubkey_size));
+ log_msg("");
+ log_msg(" [in] Hash Algorithm: %s", HashAlgToString(hashalg));
+ if (vprecmpi_file->count > 0) {
+ log_msg("");
+ log_msg(" [in] Verifier PreComp: ");
+ PrintBuffer(verifier_precmp, vprecmpi_file_size);
+ }
+ log_msg("==============================================");
+ }
+
+ // Verify
+ if (kEpid2x == epid_version) {
+ if (verifier_precmp && vprecmpi_file_size != sizeof(VerifierPrecomp)) {
+ if (vprecmpi_file_size == sizeof(VerifierPrecomp) - sizeof(GroupId)) {
+ log_error(
+ "incorrect input precomp size: precomp format may have changed, "
+ "try regenerating it");
+ } else {
+ log_error("incorrect input precomp size");
+ }
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ result =
+ Verify(sig, sig_size, msg_str, msg_size, basename_str, basename_size,
+ signed_priv_rl, signed_priv_rl_size, signed_sig_rl,
+ signed_sig_rl_size, signed_grp_rl, signed_grp_rl_size, ver_rl,
+ ver_rl_size, signed_pubkey, signed_pubkey_size, &cacert,
+ hashalg, &verifier_precmp, &vprecmpi_file_size);
+ } else if (kEpid1x == epid_version) {
+ if (verifier_precmp &&
+ vprecmpi_file_size != sizeof(Epid11VerifierPrecomp)) {
+ log_error("incorrect input precomp size");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ result = Verify11(sig, sig_size, msg_str, msg_size, basename_str,
+ basename_size, signed_priv_rl, signed_priv_rl_size,
+ signed_sig_rl, signed_sig_rl_size, signed_grp_rl,
+ signed_grp_rl_size, signed_pubkey, signed_pubkey_size,
+ &cacert, &verifier_precmp, &vprecmpi_file_size);
+ } else {
+ log_error("EPID version %s is not supported",
+ EpidVersionToString(epid_version));
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // Report Result
+ if (kEpidNoErr == result) {
+ log_msg("signature verified successfully");
+ } else if (kEpidErr == result) {
+ log_error(
+ "signature verification failed: "
+ "member did not prove it was not revoked");
+ ret_value = result;
+ break;
+ } else {
+ log_error("signature verification failed: %s",
+ EpidStatusToString(result));
+ ret_value = result;
+ break;
+ }
+
+ // Store Verifier pre-computed settings
+ if (vprecmpo_file->count > 0) {
+ if (0 != WriteLoud(verifier_precmp, vprecmpi_file_size,
+ vprecmpo_file->filename[0])) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Success
+ ret_value = EXIT_SUCCESS;
+ } while (0);
+
+ // Free allocated buffers
+ if (sig) free(sig);
+ if (msg_buf) free(msg_buf);
+ if (basename_buf) free(basename_buf);
+ if (signed_priv_rl) free(signed_priv_rl);
+ if (signed_sig_rl) free(signed_sig_rl);
+ if (signed_grp_rl) free(signed_grp_rl);
+ if (ver_rl) free(ver_rl);
+ if (signed_pubkey) free(signed_pubkey);
+ if (verifier_precmp) free(verifier_precmp);
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
diff --git a/example/verifysig/src/verifysig.c b/example/verifysig/src/verifysig.c
new file mode 100644
index 0000000..d8dae5b
--- /dev/null
+++ b/example/verifysig/src/verifysig.c
@@ -0,0 +1,196 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Signature verification implementation.
+ */
+
+#include "src/verifysig.h"
+
+#include <stdlib.h>
+
+#include "epid/common/file_parser.h"
+#include "epid/verifier/api.h"
+
+EpidStatus Verify(EpidSignature const* sig, size_t sig_len, void const* msg,
+ size_t msg_len, void const* basename, size_t basename_len,
+ void const* signed_priv_rl, size_t signed_priv_rl_size,
+ void const* signed_sig_rl, size_t signed_sig_rl_size,
+ void const* signed_grp_rl, size_t signed_grp_rl_size,
+ VerifierRl const* ver_rl, size_t ver_rl_size,
+ void const* signed_pub_key, size_t signed_pub_key_size,
+ EpidCaCertificate const* cacert, HashAlg hash_alg,
+ void** verifier_precomp, size_t* verifier_precomp_size) {
+ EpidStatus result = kEpidErr;
+ VerifierCtx* ctx = NULL;
+ PrivRl* priv_rl = NULL;
+ SigRl* sig_rl = NULL;
+ GroupRl* grp_rl = NULL;
+
+ do {
+ GroupPubKey pub_key = {0};
+ // authenticate and extract group public key
+ result = EpidParseGroupPubKeyFile(signed_pub_key, signed_pub_key_size,
+ cacert, &pub_key);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // ensure the pre-computation blob is not in a legacy format
+ if (*verifier_precomp &&
+ *verifier_precomp_size != sizeof(VerifierPrecomp)) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ *verifier_precomp_size = sizeof(VerifierPrecomp);
+
+ // create verifier
+ result = EpidVerifierCreate(&pub_key, *verifier_precomp, &ctx);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // serialize verifier pre-computation blob
+ if (!*verifier_precomp) {
+ *verifier_precomp = calloc(1, *verifier_precomp_size);
+ }
+ result = EpidVerifierWritePrecomp(ctx, *verifier_precomp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set hash algorithm used for signing
+ result = EpidVerifierSetHashAlg(ctx, hash_alg);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set the basename used for signing
+ result = EpidVerifierSetBasename(ctx, basename, basename_len);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ if (signed_priv_rl) {
+ // authenticate and determine space needed for RL
+ size_t priv_rl_size = 0;
+ result = EpidParsePrivRlFile(signed_priv_rl, signed_priv_rl_size, cacert,
+ NULL, &priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ priv_rl = calloc(1, priv_rl_size);
+ if (!priv_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = EpidParsePrivRlFile(signed_priv_rl, signed_priv_rl_size, cacert,
+ priv_rl, &priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set private key based revocation list
+ result = EpidVerifierSetPrivRl(ctx, priv_rl, priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_priv_rl)
+
+ if (signed_sig_rl) {
+ // authenticate and determine space needed for RL
+ size_t sig_rl_size = 0;
+ result = EpidParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert,
+ NULL, &sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ sig_rl = calloc(1, sig_rl_size);
+ if (!sig_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = EpidParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert,
+ sig_rl, &sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set signature based revocation list
+ result = EpidVerifierSetSigRl(ctx, sig_rl, sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_sig_rl)
+
+ if (signed_grp_rl) {
+ // authenticate and determine space needed for RL
+ size_t grp_rl_size = 0;
+ result = EpidParseGroupRlFile(signed_grp_rl, signed_grp_rl_size, cacert,
+ NULL, &grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ grp_rl = calloc(1, grp_rl_size);
+ if (!grp_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = EpidParseGroupRlFile(signed_grp_rl, signed_grp_rl_size, cacert,
+ grp_rl, &grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // set group revocation list
+ result = EpidVerifierSetGroupRl(ctx, grp_rl, grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_grp_rl)
+
+ if (ver_rl) {
+ // set verifier based revocation list
+ result = EpidVerifierSetVerifierRl(ctx, ver_rl, ver_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ }
+
+ // verify signature
+ result = EpidVerify(ctx, sig, sig_len, msg, msg_len);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } while (0);
+
+ // delete verifier
+ EpidVerifierDelete(&ctx);
+
+ if (priv_rl) free(priv_rl);
+ if (sig_rl) free(sig_rl);
+ if (grp_rl) free(grp_rl);
+
+ return result;
+}
diff --git a/example/verifysig/src/verifysig.h b/example/verifysig/src/verifysig.h
new file mode 100644
index 0000000..6ee95b7
--- /dev/null
+++ b/example/verifysig/src/verifysig.h
@@ -0,0 +1,45 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Signature verification interface.
+ */
+#ifndef EXAMPLE_VERIFYSIG_SRC_VERIFYSIG_H_
+#define EXAMPLE_VERIFYSIG_SRC_VERIFYSIG_H_
+
+#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/stdtypes.h"
+#include "epid/common/types.h"
+
+struct EpidCaCertificate;
+
+/// Check if opaque data blob containing CA certificate is authorized
+bool IsCaCertAuthorizedByRootCa(void const* data, size_t size);
+
+/// verify Intel(R) EPID 2.x signature
+EpidStatus Verify(EpidSignature const* sig, size_t sig_len, void const* msg,
+ size_t msg_len, void const* basename, size_t basename_len,
+ void const* signed_priv_rl, size_t signed_priv_rl_size,
+ void const* signed_sig_rl, size_t signed_sig_rl_size,
+ void const* signed_grp_rl, size_t signed_grp_rl_size,
+ VerifierRl const* ver_rl, size_t ver_rl_size,
+ void const* signed_pub_key, size_t signed_pub_key_size,
+ struct EpidCaCertificate const* cacert, HashAlg hash_alg,
+ void** verifier_precomp, size_t* verifier_precomp_size);
+
+#endif // EXAMPLE_VERIFYSIG_SRC_VERIFYSIG_H_
diff --git a/example/verifysig/src/verifysig11.c b/example/verifysig/src/verifysig11.c
new file mode 100644
index 0000000..5e5f8df
--- /dev/null
+++ b/example/verifysig/src/verifysig11.c
@@ -0,0 +1,181 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 signature verification implementation.
+ */
+
+#include "src/verifysig11.h"
+
+#include <stdlib.h>
+
+#include "epid/common/1.1/file_parser.h"
+#include "epid/verifier/1.1/api.h"
+
+EpidStatus Verify11(Epid11Signature const* sig, size_t sig_len, void const* msg,
+ size_t msg_len, void const* basename, size_t basename_len,
+ void const* signed_priv_rl, size_t signed_priv_rl_size,
+ void const* signed_sig_rl, size_t signed_sig_rl_size,
+ void const* signed_grp_rl, size_t signed_grp_rl_size,
+ void const* signed_pub_key, size_t signed_pub_key_size,
+ EpidCaCertificate const* cacert, void** verifier_precomp,
+ size_t* verifier_precomp_size) {
+ EpidStatus result = kEpidErr;
+ Epid11VerifierCtx* ctx = NULL;
+ Epid11PrivRl* priv_rl = NULL;
+ Epid11SigRl* sig_rl = NULL;
+ Epid11GroupRl* grp_rl = NULL;
+
+ do {
+ Epid11GroupPubKey pub_key = {0};
+ // authenticate and extract group public key
+ result = Epid11ParseGroupPubKeyFile(signed_pub_key, signed_pub_key_size,
+ cacert, &pub_key);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ if (*verifier_precomp &&
+ *verifier_precomp_size != sizeof(Epid11VerifierPrecomp)) {
+ result = kEpidBadArgErr;
+ break;
+ }
+ *verifier_precomp_size = sizeof(Epid11VerifierPrecomp);
+
+ // create verifier
+ result = Epid11VerifierCreate(&pub_key, *verifier_precomp, &ctx);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // serialize verifier pre-computation blob
+ if (!*verifier_precomp) {
+ *verifier_precomp = calloc(1, *verifier_precomp_size);
+ }
+ result = Epid11VerifierWritePrecomp(ctx, *verifier_precomp);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set the basename used for signing
+ result = Epid11VerifierSetBasename(ctx, basename, basename_len);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ if (signed_priv_rl) {
+ // authenticate and determine space needed for RL
+ size_t priv_rl_size = 0;
+ result = Epid11ParsePrivRlFile(signed_priv_rl, signed_priv_rl_size,
+ cacert, NULL, &priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ priv_rl = calloc(1, priv_rl_size);
+ if (!priv_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = Epid11ParsePrivRlFile(signed_priv_rl, signed_priv_rl_size,
+ cacert, priv_rl, &priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set private key based revocation list
+ result = Epid11VerifierSetPrivRl(ctx, priv_rl, priv_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_priv_rl)
+
+ if (signed_sig_rl) {
+ // authenticate and determine space needed for RL
+ size_t sig_rl_size = 0;
+ result = Epid11ParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert,
+ NULL, &sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ sig_rl = calloc(1, sig_rl_size);
+ if (!sig_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = Epid11ParseSigRlFile(signed_sig_rl, signed_sig_rl_size, cacert,
+ sig_rl, &sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ // set signature based revocation list
+ result = Epid11VerifierSetSigRl(ctx, sig_rl, sig_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_sig_rl)
+
+ if (signed_grp_rl) {
+ // authenticate and determine space needed for RL
+ size_t grp_rl_size = 0;
+ result = Epid11ParseGroupRlFile(signed_grp_rl, signed_grp_rl_size, cacert,
+ NULL, &grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+
+ grp_rl = calloc(1, grp_rl_size);
+ if (!grp_rl) {
+ result = kEpidMemAllocErr;
+ break;
+ }
+
+ // fill the rl
+ result = Epid11ParseGroupRlFile(signed_grp_rl, signed_grp_rl_size, cacert,
+ grp_rl, &grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ // set group revocation list
+ result = Epid11VerifierSetGroupRl(ctx, grp_rl, grp_rl_size);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } // if (signed_grp_rl)
+
+ // verify signature
+ result = Epid11Verify(ctx, sig, sig_len, msg, msg_len);
+ if (kEpidNoErr != result) {
+ break;
+ }
+ } while (0);
+
+ // delete verifier
+ Epid11VerifierDelete(&ctx);
+
+ if (priv_rl) free(priv_rl);
+ if (sig_rl) free(sig_rl);
+ if (grp_rl) free(grp_rl);
+
+ return result;
+}
diff --git a/example/verifysig/src/verifysig11.h b/example/verifysig/src/verifysig11.h
new file mode 100644
index 0000000..9a3665f
--- /dev/null
+++ b/example/verifysig/src/verifysig11.h
@@ -0,0 +1,40 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ * \brief Intel(R) EPID 1.1 signature verification interface.
+ */
+#ifndef EXAMPLE_VERIFYSIG_SRC_VERIFYSIG11_H_
+#define EXAMPLE_VERIFYSIG_SRC_VERIFYSIG11_H_
+
+#include <stddef.h>
+#include "epid/common/1.1/types.h"
+#include "epid/common/errors.h"
+
+struct EpidCaCertificate;
+
+/// verify Intel(R) EPID 1.x signature
+EpidStatus Verify11(Epid11Signature const* sig, size_t sig_len, void const* msg,
+ size_t msg_len, void const* basename, size_t basename_len,
+ void const* signed_priv_rl, size_t signed_priv_rl_size,
+ void const* signed_sig_rl, size_t signed_sig_rl_size,
+ void const* signed_grp_rl, size_t signed_grp_rl_size,
+ void const* signed_pub_key, size_t signed_pub_key_size,
+ struct EpidCaCertificate const* cacert,
+ void** verifier_precomp, size_t* verifier_precomp_size);
+
+#endif // EXAMPLE_VERIFYSIG_SRC_VERIFYSIG11_H_
diff --git a/example/verifysig/verifysig.parts b/example/verifysig/verifysig.parts
new file mode 100644
index 0000000..2890ed2
--- /dev/null
+++ b/example/verifysig/verifysig.parts
@@ -0,0 +1,53 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("verifysig")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+inc_files = Pattern(src_dir='src/',
+ includes=['*.h'],
+ recursive=True).files()
+
+parts_file = ['verifysig.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files + inc_files, sub_dir='example/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='example/${PART_SHORT_NAME}')
+
+else:
+ env.DependsOn([
+ Component('verifier'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ env.Append(CPPPATH='#/example/verifysig')
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_SAMPLE_BIN}')
diff --git a/ext/argtable3/LICENSE b/ext/argtable3/LICENSE
new file mode 100644
index 0000000..1a28ef9
--- /dev/null
+++ b/ext/argtable3/LICENSE
@@ -0,0 +1,26 @@
+Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+<sheitmann@users.sourceforge.net>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of STEWART HEITMANN nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/ext/argtable3/Makefile b/ext/argtable3/Makefile
new file mode 100644
index 0000000..db76127
--- /dev/null
+++ b/ext/argtable3/Makefile
@@ -0,0 +1,22 @@
+#!/usr/bin/make -f
+
+ARGTABLE_SRC = $(wildcard *.c)
+ARGTABLE_OBJ = $(ARGTABLE_SRC:.c=.o)
+
+ARGTABLE_LIB = libargtable3.a
+
+$(ARGTABLE_OBJ): %.o: %.c
+ $(CC) -o $@ -c $(CFLAGS) $<
+
+$(ARGTABLE_LIB): $(ARGTABLE_OBJ)
+ $(AR) rc $@ $^
+ $(RANLIB) $@
+
+build: all
+
+all: $(ARGTABLE_LIB)
+
+install:
+
+clean:
+ rm -f $(ARGTABLE_OBJ) $(ARGTABLE_LIB)
diff --git a/ext/argtable3/argtable3.c b/ext/argtable3/argtable3.c
new file mode 100644
index 0000000..a551005
--- /dev/null
+++ b/ext/argtable3/argtable3.c
@@ -0,0 +1,5062 @@
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+ // THIS FILE HAS BEEN ALTERED from original version to:
+ // * fix warnings
+ // * fix issues found by static code analisys:
+ // - Null pointer dereference in trex_compile
+
+#include "argtable3.h"
+
+// On Windows isspace crashes app in case of using Unicode character set and string to be above ASCII
+// so you have to use _istspace instead of space
+#ifdef UNICODE
+#include <tchar.h>
+ #define ISSPACE _istspace
+#else
+ #define ISSPACE isspace
+#endif
+
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 2013 Tom G. Huang
+ * <tomghuang@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#ifndef ARG_UTILS_H
+#define ARG_UTILS_H
+
+#define ARG_ENABLE_TRACE 0
+#define ARG_ENABLE_LOG 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+{
+ EMINCOUNT = 1,
+ EMAXCOUNT,
+ EBADINT,
+ // The same name define EOVERFLOW in errno.h on windows platform
+#ifdef __STDC_WANT_SECURE_LIB__
+ EOVERFLOW_,
+#else
+ EOVERFLOW,
+#endif
+ EBADDOUBLE,
+ EBADDATE,
+ EREGNOMATCH
+};
+
+
+#if defined(_MSC_VER)
+#define ARG_TRACE(x) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0) \
+ __pragma(warning(pop))
+
+#define ARG_LOG(x) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0) \
+ __pragma(warning(pop))
+#else
+#define ARG_TRACE(x) \
+ do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0)
+
+#define ARG_LOG(x) \
+ do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0)
+#endif
+
+extern void dbg_printf(const char *fmt, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdarg.h>
+#include <stdio.h>
+
+
+void dbg_printf(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+/* $Id: getopt.h,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */
+/* $OpenBSD: getopt.h,v 1.1 2002/12/03 20:24:29 millert Exp $ */
+/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _GETOPT_H_
+#define _GETOPT_H_
+
+#if 0
+#include <sys/cdefs.h>
+#endif
+
+/*
+ * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions
+ */
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+struct option {
+ /* name of long option */
+ const char *name;
+ /*
+ * one of no_argument, required_argument, and optional_argument:
+ * whether option takes an argument
+ */
+ int has_arg;
+ /* if not NULL, set *flag to val when option found */
+ int *flag;
+ /* if flag not NULL, value to set *flag to; else return value */
+ int val;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int getopt_long(int, char * const *, const char *,
+ const struct option *, int *);
+int getopt_long_only(int, char * const *, const char *,
+ const struct option *, int *);
+#ifndef _GETOPT_DEFINED
+#define _GETOPT_DEFINED
+int getopt(int, char * const *, const char *);
+int getsubopt(char **, char * const *, char **);
+
+extern char *optarg; /* getopt(3) external variables */
+extern int opterr;
+extern int optind;
+extern int optopt;
+extern int optreset;
+extern char *suboptarg; /* getsubopt(3) external variable */
+#endif /* _GETOPT_DEFINED */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !_GETOPT_H_ */
+/* $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */
+/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */
+/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */
+
+/*
+ * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
+ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if 0
+#include <err.h>
+#endif
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */
+
+#ifdef REPLACE_GETOPT
+int opterr = 1; /* if error message should be printed */
+int optind = 1; /* index into parent argv vector */
+int optopt = '?'; /* character checked for validity */
+int optreset; /* reset getopt */
+char *optarg; /* argument associated with option */
+#endif
+
+#define PRINT_ERROR ((opterr) && (*options != ':'))
+
+#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */
+#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */
+#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */
+
+/* return values */
+#define BADCH (int)'?'
+#define BADARG ((*options == ':') ? (int)':' : (int)'?')
+#define INORDER (int)1
+
+#define EMSG ""
+
+static int getopt_internal(int, char * const *, const char *,
+ const struct option *, int *, int);
+static int parse_long_options(char * const *, const char *,
+ const struct option *, int *, int);
+static int gcd(int, int);
+static void permute_args(int, int, int, char * const *);
+
+static char *place = EMSG; /* option letter processing */
+
+/* XXX: set optreset to 1 rather than these two */
+static int nonopt_start = -1; /* first non option argument (for permute) */
+static int nonopt_end = -1; /* first option after non options (for permute) */
+
+/* Error messages */
+static const char recargchar[] = "option requires an argument -- %c";
+static const char recargstring[] = "option requires an argument -- %s";
+static const char ambig[] = "ambiguous option -- %.*s";
+static const char noarg[] = "option doesn't take an argument -- %.*s";
+static const char illoptchar[] = "unknown option -- %c";
+static const char illoptstring[] = "unknown option -- %s";
+
+
+
+#ifdef _WIN32
+
+/* Windows needs warnx(). We change the definition though:
+ * 1. (another) global is defined, opterrmsg, which holds the error message
+ * 2. errors are always printed out on stderr w/o the program name
+ * Note that opterrmsg always gets set no matter what opterr is set to. The
+ * error message will not be printed if opterr is 0 as usual.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#define MAX_OPTER_MSG_SIZE 128
+
+extern char opterrmsg[MAX_OPTER_MSG_SIZE];
+char opterrmsg[MAX_OPTER_MSG_SIZE]; /* buffer for the last error message */
+
+static void warnx(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ /*
+ Make sure opterrmsg is always zero-terminated despite the _vsnprintf()
+ implementation specifics and manually suppress the warning.
+ */
+ memset(opterrmsg, 0, sizeof opterrmsg);
+ if (fmt != NULL)
+#ifdef __STDC_WANT_SECURE_LIB__
+ _vsnprintf_s(opterrmsg, MAX_OPTER_MSG_SIZE, sizeof(opterrmsg) - 1, fmt, ap);
+#else
+ _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap);
+#endif
+ va_end(ap);
+
+#ifndef __ICL
+#pragma warning(suppress: 6053)
+#endif
+ fprintf(stderr, "%s\n", opterrmsg);
+}
+
+#else
+#include <err.h>
+#endif /*_WIN32*/
+
+
+/*
+ * Compute the greatest common divisor of a and b.
+ */
+static int
+gcd(int a, int b)
+{
+ int c;
+
+ c = a % b;
+ while (c != 0) {
+ a = b;
+ b = c;
+ c = a % b;
+ }
+
+ return (b);
+}
+
+/*
+ * Exchange the block from nonopt_start to nonopt_end with the block
+ * from nonopt_end to opt_end (keeping the same order of arguments
+ * in each block).
+ */
+static void
+permute_args(int panonopt_start, int panonopt_end, int opt_end,
+ char * const *nargv)
+{
+ int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+ char *swap;
+
+ /*
+ * compute lengths of blocks and number and size of cycles
+ */
+ nnonopts = panonopt_end - panonopt_start;
+ nopts = opt_end - panonopt_end;
+ ncycle = gcd(nnonopts, nopts);
+ cyclelen = (opt_end - panonopt_start) / ncycle;
+
+ for (i = 0; i < ncycle; i++) {
+ cstart = panonopt_end+i;
+ pos = cstart;
+ for (j = 0; j < cyclelen; j++) {
+ if (pos >= panonopt_end)
+ pos -= nnonopts;
+ else
+ pos += nopts;
+ swap = nargv[pos];
+ /* LINTED const cast */
+ ((char **) nargv)[pos] = nargv[cstart];
+ /* LINTED const cast */
+ ((char **)nargv)[cstart] = swap;
+ }
+ }
+}
+
+/*
+ * parse_long_options --
+ * Parse long options in argc/argv argument vector.
+ * Returns -1 if short_too is set and the option does not match long_options.
+ */
+static int
+parse_long_options(char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int short_too)
+{
+ char *current_argv, *has_equal;
+ size_t current_argv_len;
+ int i, match;
+
+ current_argv = place;
+ match = -1;
+
+ optind++;
+
+ if ((has_equal = strchr(current_argv, '=')) != NULL) {
+ /* argument found (--option=arg) */
+ current_argv_len = has_equal - current_argv;
+ has_equal++;
+ } else
+ current_argv_len = strlen(current_argv);
+
+ for (i = 0; long_options[i].name; i++) {
+ /* find matching long option */
+ if (strncmp(current_argv, long_options[i].name,
+ current_argv_len))
+ continue;
+
+ if (strlen(long_options[i].name) == current_argv_len) {
+ /* exact match */
+ match = i;
+ break;
+ }
+ /*
+ * If this is a known short option, don't allow
+ * a partial match of a single character.
+ */
+ if (short_too && current_argv_len == 1)
+ continue;
+
+ if (match == -1) /* partial match */
+ match = i;
+ else {
+ /* ambiguous abbreviation */
+ if (PRINT_ERROR)
+ warnx(ambig, (int)current_argv_len,
+ current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ }
+ if (match != -1) { /* option found */
+ if (long_options[match].has_arg == no_argument
+ && has_equal) {
+ if (PRINT_ERROR)
+ warnx(noarg, (int)current_argv_len,
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+ return (BADARG);
+ }
+ if (long_options[match].has_arg == required_argument ||
+ long_options[match].has_arg == optional_argument) {
+ if (has_equal)
+ optarg = has_equal;
+ else if (long_options[match].has_arg ==
+ required_argument) {
+ /*
+ * optional argument doesn't use next nargv
+ */
+ optarg = nargv[optind++];
+ }
+ }
+ if ((long_options[match].has_arg == required_argument)
+ && (optarg == NULL)) {
+ /*
+ * Missing argument; leading ':' indicates no error
+ * should be generated.
+ */
+ if (PRINT_ERROR)
+ warnx(recargstring,
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+ --optind;
+ return (BADARG);
+ }
+ } else { /* unknown option */
+ if (short_too) {
+ --optind;
+ return (-1);
+ }
+ if (PRINT_ERROR)
+ warnx(illoptstring, current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ if (idx)
+ *idx = match;
+ if (long_options[match].flag) {
+ *long_options[match].flag = long_options[match].val;
+ return (0);
+ } else
+ return (long_options[match].val);
+}
+
+/*
+ * getopt_internal --
+ * Parse argc/argv argument vector. Called by user level routines.
+ */
+static int
+getopt_internal(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int flags)
+{
+ char *oli; /* option letter list index */
+ int optchar, short_too;
+ static int posixly_correct = -1;
+#ifdef __STDC_WANT_SECURE_LIB__
+ char* buffer = NULL;
+ size_t buffer_size = 0;
+ errno_t err = 0;
+#endif
+
+ if (options == NULL)
+ return (-1);
+
+ /*
+ * Disable GNU extensions if POSIXLY_CORRECT is set or options
+ * string begins with a '+'.
+ */
+
+#ifdef __STDC_WANT_SECURE_LIB__
+ if (posixly_correct == -1) {
+ err = _dupenv_s(&buffer, &buffer_size, "POSIXLY_CORRECT") == 0;
+ posixly_correct = buffer != NULL;
+ if(buffer != NULL && err == 0) {
+ free(buffer);
+ }
+ }
+#else
+ if (posixly_correct == -1)
+ posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
+#endif
+ if (posixly_correct || *options == '+')
+ flags &= ~FLAG_PERMUTE;
+ else if (*options == '-')
+ flags |= FLAG_ALLARGS;
+ if (*options == '+' || *options == '-')
+ options++;
+
+ /*
+ * XXX Some GNU programs (like cvs) set optind to 0 instead of
+ * XXX using optreset. Work around this braindamage.
+ */
+ if (optind == 0)
+ optind = optreset = 1;
+
+ optarg = NULL;
+ if (optreset)
+ nonopt_start = nonopt_end = -1;
+start:
+ if (optreset || !*place) { /* update scanning pointer */
+ optreset = 0;
+ if (optind >= nargc) { /* end of argument vector */
+ place = EMSG;
+ if (nonopt_end != -1) {
+ /* do permutation, if we have to */
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ else if (nonopt_start != -1) {
+ /*
+ * If we skipped non-options, set optind
+ * to the first of them.
+ */
+ optind = nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ if (*(place = nargv[optind]) != '-' ||
+ (place[1] == '\0' && strchr(options, '-') == NULL)) {
+ place = EMSG; /* found non-option */
+ if (flags & FLAG_ALLARGS) {
+ /*
+ * GNU extension:
+ * return non-option as argument to option 1
+ */
+ optarg = nargv[optind++];
+ return (INORDER);
+ }
+ if (!(flags & FLAG_PERMUTE)) {
+ /*
+ * If no permutation wanted, stop parsing
+ * at first non-option.
+ */
+ return (-1);
+ }
+ /* do permutation */
+ if (nonopt_start == -1)
+ nonopt_start = optind;
+ else if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ nonopt_start = optind -
+ (nonopt_end - nonopt_start);
+ nonopt_end = -1;
+ }
+ optind++;
+ /* process next argument */
+ goto start;
+ }
+ if (nonopt_start != -1 && nonopt_end == -1)
+ nonopt_end = optind;
+
+ /*
+ * If we have "-" do nothing, if "--" we are done.
+ */
+ if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
+ optind++;
+ place = EMSG;
+ /*
+ * We found an option (--), so if we skipped
+ * non-options, we have to permute.
+ */
+ if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ }
+
+ /*
+ * Check long options if:
+ * 1) we were passed some
+ * 2) the arg is not just "-"
+ * 3) either the arg starts with -- we are getopt_long_only()
+ */
+ if (long_options != NULL && place != nargv[optind] &&
+ (*place == '-' || (flags & FLAG_LONGONLY))) {
+ short_too = 0;
+ if (*place == '-')
+ place++; /* --foo long option */
+ else if (*place != ':' && strchr(options, *place) != NULL)
+ short_too = 1; /* could be short option too */
+
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, short_too);
+ if (optchar != -1) {
+ place = EMSG;
+ return (optchar);
+ }
+ }
+
+ if ((optchar = (int)*place++) == (int)':' ||
+ (optchar == (int)'-' && *place != '\0') ||
+ (oli = strchr(options, optchar)) == NULL) {
+ /*
+ * If the user specified "-" and '-' isn't listed in
+ * options, return -1 (non-option) as per POSIX.
+ * Otherwise, it is an unknown option character (or ':').
+ */
+ if (optchar == (int)'-' && *place == '\0')
+ return (-1);
+ if (!*place)
+ ++optind;
+ if (PRINT_ERROR)
+ warnx(illoptchar, optchar);
+ optopt = optchar;
+ return (BADCH);
+ }
+ if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
+ /* -W long-option */
+ if (*place) /* no space */
+ /* NOTHING */;
+ else if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else /* white space */
+ place = nargv[optind];
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, 0);
+ place = EMSG;
+ return (optchar);
+ }
+ if (*++oli != ':') { /* doesn't take argument */
+ if (!*place)
+ ++optind;
+ } else { /* takes (optional) argument */
+ optarg = NULL;
+ if (*place) /* no white space */
+ optarg = place;
+ else if (oli[1] != ':') { /* arg not optional */
+ if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else
+ optarg = nargv[optind];
+ }
+ place = EMSG;
+ ++optind;
+ }
+ /* dump back option letter */
+ return (optchar);
+}
+
+#ifdef REPLACE_GETOPT
+/*
+ * getopt --
+ * Parse argc/argv argument vector.
+ *
+ * [eventually this will replace the BSD getopt]
+ */
+int
+getopt(int nargc, char * const *nargv, const char *options)
+{
+
+ /*
+ * We don't pass FLAG_PERMUTE to getopt_internal() since
+ * the BSD getopt(3) (unlike GNU) has never done this.
+ *
+ * Furthermore, since many privileged programs call getopt()
+ * before dropping privileges it makes sense to keep things
+ * as simple (and bug-free) as possible.
+ */
+ return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
+}
+#endif /* REPLACE_GETOPT */
+
+/*
+ * getopt_long --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE));
+}
+
+/*
+ * getopt_long_only --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long_only(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE|FLAG_LONGONLY));
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "argtable3.h"
+
+
+char * arg_strptime(const char *buf, const char *fmt, struct tm *tm);
+
+
+static void arg_date_resetfn(struct arg_date *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+static int arg_date_scanfn(struct arg_date *parent, const char *argval)
+{
+ int errorcode = 0;
+
+ if (parent->count == parent->hdr.maxcount)
+ {
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* no argument value was given, leave parent->tmval[] unaltered but still count it */
+ parent->count++;
+ }
+ else
+ {
+ const char *pend;
+ struct tm tm = parent->tmval[parent->count];
+
+ /* parse the given argument value, store result in parent->tmval[] */
+ pend = arg_strptime(argval, parent->format, &tm);
+ if (pend && pend[0] == '\0')
+ parent->tmval[parent->count++] = tm;
+ else
+ errorcode = EBADDATE;
+ }
+
+ ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static int arg_date_checkfn(struct arg_date *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+
+ ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static void arg_date_errorfn(
+ struct arg_date *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ case EBADDATE:
+ {
+ struct tm tm;
+ char buff[200];
+
+ fprintf(fp, "illegal timestamp format \"%s\"\n", argval);
+ memset(&tm, 0, sizeof(tm));
+ arg_strptime("1999-12-31 23:59:59", "%F %H:%M:%S", &tm);
+ strftime(buff, sizeof(buff), parent->format, &tm);
+ printf("correct format is \"%s\"\n", buff);
+ break;
+ }
+ }
+}
+
+
+struct arg_date * arg_date0(
+ const char * shortopts,
+ const char * longopts,
+ const char * format,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_daten(shortopts, longopts, format, datatype, 0, 1, glossary);
+}
+
+
+struct arg_date * arg_date1(
+ const char * shortopts,
+ const char * longopts,
+ const char * format,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_daten(shortopts, longopts, format, datatype, 1, 1, glossary);
+}
+
+
+struct arg_date * arg_daten(
+ const char * shortopts,
+ const char * longopts,
+ const char * format,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_date *result;
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ /* default time format is the national date format for the locale */
+ if (!format)
+ format = "%x";
+
+ nbytes = sizeof(struct arg_date) /* storage for struct arg_date */
+ + maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */
+
+ /* allocate storage for the arg_date struct + tmval[] array. */
+ /* we use calloc because we want the tmval[] array zero filled. */
+ result = (struct arg_date *)calloc(1, nbytes);
+ if (result)
+ {
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = datatype ? datatype : format;
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_date_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_date_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_date_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_date_errorfn;
+
+ /* store the tmval[maxcount] array immediately after the arg_date struct */
+ result->tmval = (struct tm *)(result + 1);
+
+ /* init the remaining arg_date member variables */
+ result->count = 0;
+ result->format = format;
+ }
+
+ ARG_TRACE(("arg_daten() returns %p\n", result));
+ return result;
+}
+
+
+/*-
+ * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code was contributed to The NetBSD Foundation by Klaus Klein.
+ * Heavily optimised by David Laight
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+
+/*
+ * We do not implement alternate representations. However, we always
+ * check whether a given modifier is allowed for a certain conversion.
+ */
+#define ALT_E 0x01
+#define ALT_O 0x02
+#define LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); }
+#define TM_YEAR_BASE (1900)
+
+static int conv_num(const char * *, int *, int, int);
+
+static const char *day[7] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday"
+};
+
+static const char *abday[7] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+static const char *mon[12] = {
+ "January", "February", "March", "April", "May", "June", "July",
+ "August", "September", "October", "November", "December"
+};
+
+static const char *abmon[12] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+static const char *am_pm[2] = {
+ "AM", "PM"
+};
+
+
+static int arg_strcasecmp(const char *s1, const char *s2)
+{
+ const unsigned char *us1 = (const unsigned char *)s1;
+ const unsigned char *us2 = (const unsigned char *)s2;
+ while (tolower(*us1) == tolower(*us2++))
+ if (*us1++ == '\0')
+ return 0;
+
+ return tolower(*us1) - tolower(*--us2);
+}
+
+
+static int arg_strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ if (n != 0)
+ {
+ const unsigned char *us1 = (const unsigned char *)s1;
+ const unsigned char *us2 = (const unsigned char *)s2;
+ do
+ {
+ if (tolower(*us1) != tolower(*us2++))
+ return tolower(*us1) - tolower(*--us2);
+
+ if (*us1++ == '\0')
+ break;
+ } while (--n != 0);
+ }
+
+ return 0;
+}
+
+
+char * arg_strptime(const char *buf, const char *fmt, struct tm *tm)
+{
+ char c;
+ const char *bp;
+ size_t len = 0;
+ int alt_format, i, split_year = 0;
+
+ bp = buf;
+
+ while ((c = *fmt) != '\0') {
+ /* Clear `alternate' modifier prior to new conversion. */
+ alt_format = 0;
+
+ /* Eat up white-space. */
+ if (ISSPACE(c)) {
+ while (ISSPACE(*bp))
+ bp++;
+
+ fmt++;
+ continue;
+ }
+
+ if ((c = *fmt++) != '%')
+ goto literal;
+
+
+again:
+ switch (c = *fmt++)
+ {
+ case '%': /* "%%" is converted to "%". */
+literal:
+ if (c != *bp++)
+ return (0);
+ break;
+
+ /*
+ * "Alternative" modifiers. Just set the appropriate flag
+ * and start over again.
+ */
+ case 'E': /* "%E?" alternative conversion modifier. */
+ LEGAL_ALT(0);
+ alt_format |= ALT_E;
+ goto again;
+
+ case 'O': /* "%O?" alternative conversion modifier. */
+ LEGAL_ALT(0);
+ alt_format |= ALT_O;
+ goto again;
+
+ /*
+ * "Complex" conversion rules, implemented through recursion.
+ */
+ case 'c': /* Date and time, using the locale's format. */
+ LEGAL_ALT(ALT_E);
+ bp = arg_strptime(bp, "%x %X", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'D': /* The date as "%m/%d/%y". */
+ LEGAL_ALT(0);
+ bp = arg_strptime(bp, "%m/%d/%y", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'R': /* The time as "%H:%M". */
+ LEGAL_ALT(0);
+ bp = arg_strptime(bp, "%H:%M", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'r': /* The time in 12-hour clock representation. */
+ LEGAL_ALT(0);
+ bp = arg_strptime(bp, "%I:%M:%S %p", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'T': /* The time as "%H:%M:%S". */
+ LEGAL_ALT(0);
+ bp = arg_strptime(bp, "%H:%M:%S", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'X': /* The time, using the locale's format. */
+ LEGAL_ALT(ALT_E);
+ bp = arg_strptime(bp, "%H:%M:%S", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ case 'x': /* The date, using the locale's format. */
+ LEGAL_ALT(ALT_E);
+ bp = arg_strptime(bp, "%m/%d/%y", tm);
+ if (!bp)
+ return (0);
+ break;
+
+ /*
+ * "Elementary" conversion rules.
+ */
+ case 'A': /* The day of week, using the locale's form. */
+ case 'a':
+ LEGAL_ALT(0);
+ for (i = 0; i < 7; i++) {
+ /* Full name. */
+ len = strlen(day[i]);
+ if (arg_strncasecmp(day[i], bp, len) == 0)
+ break;
+
+ /* Abbreviated name. */
+ len = strlen(abday[i]);
+ if (arg_strncasecmp(abday[i], bp, len) == 0)
+ break;
+ }
+
+ /* Nothing matched. */
+ if (i == 7)
+ return (0);
+
+ tm->tm_wday = i;
+ bp += len;
+ break;
+
+ case 'B': /* The month, using the locale's form. */
+ case 'b':
+ case 'h':
+ LEGAL_ALT(0);
+ for (i = 0; i < 12; i++) {
+ /* Full name. */
+ len = strlen(mon[i]);
+ if (arg_strncasecmp(mon[i], bp, len) == 0)
+ break;
+
+ /* Abbreviated name. */
+ len = strlen(abmon[i]);
+ if (arg_strncasecmp(abmon[i], bp, len) == 0)
+ break;
+ }
+
+ /* Nothing matched. */
+ if (i == 12)
+ return (0);
+
+ tm->tm_mon = i;
+ bp += len;
+ break;
+
+ case 'C': /* The century number. */
+ LEGAL_ALT(ALT_E);
+ if (!(conv_num(&bp, &i, 0, 99)))
+ return (0);
+
+ if (split_year) {
+ tm->tm_year = (tm->tm_year % 100) + (i * 100);
+ } else {
+ tm->tm_year = i * 100;
+ split_year = 1;
+ }
+ break;
+
+ case 'd': /* The day of month. */
+ case 'e':
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_mday, 1, 31)))
+ return (0);
+ break;
+
+ case 'k': /* The hour (24-hour clock representation). */
+ LEGAL_ALT(0);
+ /* FALLTHROUGH */
+ case 'H':
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_hour, 0, 23)))
+ return (0);
+ break;
+
+ case 'l': /* The hour (12-hour clock representation). */
+ LEGAL_ALT(0);
+ /* FALLTHROUGH */
+ case 'I':
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_hour, 1, 12)))
+ return (0);
+ if (tm->tm_hour == 12)
+ tm->tm_hour = 0;
+ break;
+
+ case 'j': /* The day of year. */
+ LEGAL_ALT(0);
+ if (!(conv_num(&bp, &i, 1, 366)))
+ return (0);
+ tm->tm_yday = i - 1;
+ break;
+
+ case 'M': /* The minute. */
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_min, 0, 59)))
+ return (0);
+ break;
+
+ case 'm': /* The month. */
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &i, 1, 12)))
+ return (0);
+ tm->tm_mon = i - 1;
+ break;
+
+ case 'p': /* The locale's equivalent of AM/PM. */
+ LEGAL_ALT(0);
+ /* AM? */
+ if (arg_strcasecmp(am_pm[0], bp) == 0) {
+ if (tm->tm_hour > 11)
+ return (0);
+
+ bp += strlen(am_pm[0]);
+ break;
+ }
+ /* PM? */
+ else if (arg_strcasecmp(am_pm[1], bp) == 0) {
+ if (tm->tm_hour > 11)
+ return (0);
+
+ tm->tm_hour += 12;
+ bp += strlen(am_pm[1]);
+ break;
+ }
+
+ /* Nothing matched. */
+ return (0);
+
+ case 'S': /* The seconds. */
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_sec, 0, 61)))
+ return (0);
+ break;
+
+ case 'U': /* The week of year, beginning on sunday. */
+ case 'W': /* The week of year, beginning on monday. */
+ LEGAL_ALT(ALT_O);
+ /*
+ * XXX This is bogus, as we can not assume any valid
+ * information present in the tm structure at this
+ * point to calculate a real value, so just check the
+ * range for now.
+ */
+ if (!(conv_num(&bp, &i, 0, 53)))
+ return (0);
+ break;
+
+ case 'w': /* The day of week, beginning on sunday. */
+ LEGAL_ALT(ALT_O);
+ if (!(conv_num(&bp, &tm->tm_wday, 0, 6)))
+ return (0);
+ break;
+
+ case 'Y': /* The year. */
+ LEGAL_ALT(ALT_E);
+ if (!(conv_num(&bp, &i, 0, 9999)))
+ return (0);
+
+ tm->tm_year = i - TM_YEAR_BASE;
+ break;
+
+ case 'y': /* The year within 100 years of the epoch. */
+ LEGAL_ALT(ALT_E | ALT_O);
+ if (!(conv_num(&bp, &i, 0, 99)))
+ return (0);
+
+ if (split_year) {
+ tm->tm_year = ((tm->tm_year / 100) * 100) + i;
+ break;
+ }
+ split_year = 1;
+ if (i <= 68)
+ tm->tm_year = i + 2000 - TM_YEAR_BASE;
+ else
+ tm->tm_year = i + 1900 - TM_YEAR_BASE;
+ break;
+
+ /*
+ * Miscellaneous conversions.
+ */
+ case 'n': /* Any kind of white-space. */
+ case 't':
+ LEGAL_ALT(0);
+ while (ISSPACE(*bp))
+ bp++;
+ break;
+
+
+ default: /* Unknown/unsupported conversion. */
+ return (0);
+ }
+
+
+ }
+
+ /* LINTED functional specification */
+ return ((char *)bp);
+}
+
+
+static int conv_num(const char * *buf, int *dest, int llim, int ulim)
+{
+ int result = 0;
+
+ /* The limit also determines the number of valid digits. */
+ int rulim = ulim;
+
+ if (**buf < '0' || **buf > '9')
+ return (0);
+
+ do {
+ result *= 10;
+ result += *(*buf)++ - '0';
+ rulim /= 10;
+ } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9');
+
+ if (result < llim || result > ulim)
+ return (0);
+
+ *dest = result;
+ return (1);
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+
+static void arg_dbl_resetfn(struct arg_dbl *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval)
+{
+ int errorcode = 0;
+
+ if (parent->count == parent->hdr.maxcount)
+ {
+ /* maximum number of arguments exceeded */
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* a valid argument with no argument value was given. */
+ /* This happens when an optional argument value was invoked. */
+ /* leave parent argument value unaltered but still count the argument. */
+ parent->count++;
+ }
+ else
+ {
+ double val;
+ char *end;
+
+ /* extract double from argval into val */
+ val = strtod(argval, &end);
+
+ /* if success then store result in parent->dval[] array otherwise return error*/
+ if (*end == 0)
+ parent->dval[parent->count++] = val;
+ else
+ errorcode = EBADDOUBLE;
+ }
+
+ ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static int arg_dbl_checkfn(struct arg_dbl *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+
+ ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static void arg_dbl_errorfn(
+ struct arg_dbl *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ case EBADDOUBLE:
+ fprintf(fp, "invalid argument \"%s\" to option ", argval);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+ }
+}
+
+
+struct arg_dbl * arg_dbl0(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_dbln(shortopts, longopts, datatype, 0, 1, glossary);
+}
+
+
+struct arg_dbl * arg_dbl1(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_dbln(shortopts, longopts, datatype, 1, 1, glossary);
+}
+
+
+struct arg_dbl * arg_dbln(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_dbl *result;
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */
+ + (maxcount + 1) * sizeof(double); /* storage for dval[maxcount] array plus one extra for padding to memory boundary */
+
+ result = (struct arg_dbl *)malloc(nbytes);
+ if (result)
+ {
+ size_t addr;
+ size_t rem;
+
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = datatype ? datatype : "<double>";
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_dbl_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_dbl_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_dbl_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_dbl_errorfn;
+
+ /* Store the dval[maxcount] array on the first double boundary that
+ * immediately follows the arg_dbl struct. We do the memory alignment
+ * purely for SPARC and Motorola systems. They require floats and
+ * doubles to be aligned on natural boundaries.
+ */
+ addr = (size_t)(result + 1);
+ rem = addr % sizeof(double);
+ result->dval = (double *)(addr + sizeof(double) - rem);
+ ARG_TRACE(("addr=%p, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem));
+
+ result->count = 0;
+ }
+
+ ARG_TRACE(("arg_dbln() returns %p\n", result));
+ return result;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+
+static void arg_end_resetfn(struct arg_end *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+static void arg_end_errorfn(
+ void *parent,
+ FILE *fp,
+ int error,
+ const char *argval,
+ const char *progname)
+{
+ /* suppress unreferenced formal parameter warning */
+ (void)parent;
+
+ progname = progname ? progname : "";
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(error)
+ {
+ case ARG_ELIMIT:
+ fputs("too many errors to display", fp);
+ break;
+ case ARG_EMALLOC:
+ fputs("insufficent memory", fp);
+ break;
+ case ARG_ENOMATCH:
+ fprintf(fp, "unexpected argument \"%s\"", argval);
+ break;
+ case ARG_EMISSARG:
+ fprintf(fp, "option \"%s\" requires an argument", argval);
+ break;
+ case ARG_ELONGOPT:
+ fprintf(fp, "invalid option \"%s\"", argval);
+ break;
+ default:
+ fprintf(fp, "invalid option \"-%c\"", error);
+ break;
+ }
+
+ fputc('\n', fp);
+}
+
+
+struct arg_end * arg_end(int maxcount)
+{
+ size_t nbytes;
+ struct arg_end *result;
+
+ nbytes = sizeof(struct arg_end)
+ + maxcount * sizeof(int) /* storage for int error[maxcount] array*/
+ + maxcount * sizeof(void *) /* storage for void* parent[maxcount] array */
+ + maxcount * sizeof(char *); /* storage for char* argval[maxcount] array */
+
+ result = (struct arg_end *)malloc(nbytes);
+ if (result)
+ {
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_TERMINATOR;
+ result->hdr.shortopts = NULL;
+ result->hdr.longopts = NULL;
+ result->hdr.datatype = NULL;
+ result->hdr.glossary = NULL;
+ result->hdr.mincount = 1;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_end_resetfn;
+ result->hdr.scanfn = NULL;
+ result->hdr.checkfn = NULL;
+ result->hdr.errorfn = (arg_errorfn *)arg_end_errorfn;
+
+ /* store error[maxcount] array immediately after struct arg_end */
+ result->error = (int *)(result + 1);
+
+ /* store parent[maxcount] array immediately after error[] array */
+ result->parent = (void * *)(result->error + maxcount );
+
+ /* store argval[maxcount] array immediately after parent[] array */
+ result->argval = (const char * *)(result->parent + maxcount );
+ }
+
+ ARG_TRACE(("arg_end(%d) returns %p\n", maxcount, result));
+ return result;
+}
+
+
+void arg_print_errors(FILE * fp, struct arg_end * end, const char * progname)
+{
+ int i;
+ ARG_TRACE(("arg_errors()\n"));
+ for (i = 0; i < end->count; i++)
+ {
+ struct arg_hdr *errorparent = (struct arg_hdr *)(end->parent[i]);
+ if (errorparent->errorfn)
+ errorparent->errorfn(end->parent[i],
+ fp,
+ end->error[i],
+ end->argval[i],
+ progname);
+ }
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+// THIS FILE HAS BEEN ALTERED from original version to:
+// * fix issues found by static code analisys:
+// - Possible null pointer dereference at arg_basename
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+#ifdef WIN32
+# define FILESEPARATOR1 '\\'
+# define FILESEPARATOR2 '/'
+#else
+# define FILESEPARATOR1 '/'
+# define FILESEPARATOR2 '/'
+#endif
+
+
+static void arg_file_resetfn(struct arg_file *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+/* Returns ptr to the base filename within *filename */
+static const char * arg_basename(const char *filename)
+{
+ const char *result = NULL, *result1, *result2;
+
+ /* Find the last occurrence of eother file separator character. */
+ /* Two alternative file separator chars are supported as legal */
+ /* file separators but not both together in the same filename. */
+ result1 = (filename ? strrchr(filename, FILESEPARATOR1) : NULL);
+ result2 = (filename ? strrchr(filename, FILESEPARATOR2) : NULL);
+
+ if (result2)
+ result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */
+
+ if (result1)
+ result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */
+
+ if (!result)
+ result = filename; /* neither file separator was found so basename is the whole filename */
+
+ /* special cases of "." and ".." are not considered basenames */
+ if (filename && result &&
+ (strcmp(".", result) == 0 || strcmp("..", result) == 0))
+ result = filename + strlen(filename);
+
+ return result;
+}
+
+
+/* Returns ptr to the file extension within *basename */
+static const char * arg_extension(const char *basename)
+{
+ /* find the last occurrence of '.' in basename */
+ const char *result = (basename ? strrchr(basename, '.') : NULL);
+
+ /* if no '.' was found then return pointer to end of basename */
+ if (basename && !result)
+ result = basename + strlen(basename);
+
+ /* special case: basenames with a single leading dot (eg ".foo") are not considered as true extensions */
+ if (basename && result == basename)
+ result = basename + strlen(basename);
+
+ /* special case: empty extensions (eg "foo.","foo..") are not considered as true extensions */
+ if (basename && result && result[1] == '\0')
+ result = basename + strlen(basename);
+
+ return result;
+}
+
+
+static int arg_file_scanfn(struct arg_file *parent, const char *argval)
+{
+ int errorcode = 0;
+
+ if (parent->count == parent->hdr.maxcount)
+ {
+ /* maximum number of arguments exceeded */
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* a valid argument with no argument value was given. */
+ /* This happens when an optional argument value was invoked. */
+ /* leave parent arguiment value unaltered but still count the argument. */
+ parent->count++;
+ }
+ else
+ {
+ parent->filename[parent->count] = argval;
+ parent->basename[parent->count] = arg_basename(argval);
+ parent->extension[parent->count] =
+ arg_extension(parent->basename[parent->count]); /* only seek extensions within the basename (not the file path)*/
+ parent->count++;
+ }
+
+ ARG_TRACE(("%s4:scanfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static int arg_file_checkfn(struct arg_file *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+
+ ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static void arg_file_errorfn(
+ struct arg_file *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ default:
+ fprintf(fp, "unknown error at \"%s\"\n", argval);
+ }
+}
+
+
+struct arg_file * arg_file0(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_filen(shortopts, longopts, datatype, 0, 1, glossary);
+}
+
+
+struct arg_file * arg_file1(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_filen(shortopts, longopts, datatype, 1, 1, glossary);
+}
+
+
+struct arg_file * arg_filen(
+ const char * shortopts,
+ const char * longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_file *result;
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ nbytes = sizeof(struct arg_file) /* storage for struct arg_file */
+ + sizeof(char *) * maxcount /* storage for filename[maxcount] array */
+ + sizeof(char *) * maxcount /* storage for basename[maxcount] array */
+ + sizeof(char *) * maxcount; /* storage for extension[maxcount] array */
+
+ result = (struct arg_file *)malloc(nbytes);
+ if (result)
+ {
+ int i;
+
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.glossary = glossary;
+ result->hdr.datatype = datatype ? datatype : "<file>";
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_file_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_file_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_file_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_file_errorfn;
+
+ /* store the filename,basename,extension arrays immediately after the arg_file struct */
+ result->filename = (const char * *)(result + 1);
+ result->basename = result->filename + maxcount;
+ result->extension = result->basename + maxcount;
+ result->count = 0;
+
+ /* foolproof the string pointers by initialising them with empty strings */
+ for (i = 0; i < maxcount; i++)
+ {
+ result->filename[i] = "";
+ result->basename[i] = "";
+ result->extension[i] = "";
+ }
+ }
+
+ ARG_TRACE(("arg_filen() returns %p\n", result));
+ return result;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <limits.h>
+#include <ctype.h>
+
+#include "argtable3.h"
+
+
+static void arg_int_resetfn(struct arg_int *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+/* strtol0x() is like strtol() except that the numeric string is */
+/* expected to be prefixed by "0X" where X is a user supplied char. */
+/* The string may optionally be prefixed by white space and + or - */
+/* as in +0X123 or -0X123. */
+/* Once the prefix has been scanned, the remainder of the numeric */
+/* string is converted using strtol() with the given base. */
+/* eg: to parse hex str="-0X12324", specify X='X' and base=16. */
+/* eg: to parse oct str="+0o12324", specify X='O' and base=8. */
+/* eg: to parse bin str="-0B01010", specify X='B' and base=2. */
+/* Failure of conversion is indicated by result where *endptr==str. */
+static long int strtol0X(const char * str,
+ const char * *endptr,
+ char X,
+ int base)
+{
+ long int val; /* stores result */
+ int s = 1; /* sign is +1 or -1 */
+ const char *ptr = str; /* ptr to current position in str */
+
+ /* skip leading whitespace */
+ while (ISSPACE(*ptr))
+ ptr++;
+ /* printf("1) %s\n",ptr); */
+
+ /* scan optional sign character */
+ switch (*ptr)
+ {
+ case '+':
+ ptr++;
+ s = 1;
+ break;
+ case '-':
+ ptr++;
+ s = -1;
+ break;
+ default:
+ s = 1;
+ break;
+ }
+ /* printf("2) %s\n",ptr); */
+
+ /* '0X' prefix */
+ if ((*ptr++) != '0')
+ {
+ /* printf("failed to detect '0'\n"); */
+ *endptr = str;
+ return 0;
+ }
+ /* printf("3) %s\n",ptr); */
+ if (toupper(*ptr++) != toupper(X))
+ {
+ /* printf("failed to detect '%c'\n",X); */
+ *endptr = str;
+ return 0;
+ }
+ /* printf("4) %s\n",ptr); */
+
+ /* attempt conversion on remainder of string using strtol() */
+ val = strtol(ptr, (char * *)endptr, base);
+ if (*endptr == ptr)
+ {
+ /* conversion failed */
+ *endptr = str;
+ return 0;
+ }
+
+ /* success */
+ return s * val;
+}
+
+
+/* Returns 1 if str matches suffix (case insensitive). */
+/* Str may contain trailing whitespace, but nothing else. */
+static int detectsuffix(const char *str, const char *suffix)
+{
+ /* scan pairwise through strings until mismatch detected */
+ while( toupper(*str) == toupper(*suffix) )
+ {
+ /* printf("'%c' '%c'\n", *str, *suffix); */
+
+ /* return 1 (success) if match persists until the string terminator */
+ if (*str == '\0')
+ return 1;
+
+ /* next chars */
+ str++;
+ suffix++;
+ }
+ /* printf("'%c' '%c' mismatch\n", *str, *suffix); */
+
+ /* return 0 (fail) if the matching did not consume the entire suffix */
+ if (*suffix != 0)
+ return 0; /* failed to consume entire suffix */
+
+ /* skip any remaining whitespace in str */
+ while (ISSPACE(*str))
+ str++;
+
+ /* return 1 (success) if we have reached end of str else return 0 (fail) */
+ return (*str == '\0') ? 1 : 0;
+}
+
+
+static int arg_int_scanfn(struct arg_int *parent, const char *argval)
+{
+ int errorcode = 0;
+
+ if (parent->count == parent->hdr.maxcount)
+ {
+ /* maximum number of arguments exceeded */
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* a valid argument with no argument value was given. */
+ /* This happens when an optional argument value was invoked. */
+ /* leave parent arguiment value unaltered but still count the argument. */
+ parent->count++;
+ }
+ else
+ {
+ long int val;
+ const char *end;
+
+ /* attempt to extract hex integer (eg: +0x123) from argval into val conversion */
+ val = strtol0X(argval, &end, 'X', 16);
+ if (end == argval)
+ {
+ /* hex failed, attempt octal conversion (eg +0o123) */
+ val = strtol0X(argval, &end, 'O', 8);
+ if (end == argval)
+ {
+ /* octal failed, attempt binary conversion (eg +0B101) */
+ val = strtol0X(argval, &end, 'B', 2);
+ if (end == argval)
+ {
+ /* binary failed, attempt decimal conversion with no prefix (eg 1234) */
+ val = strtol(argval, (char * *)&end, 10);
+ if (end == argval)
+ {
+ /* all supported number formats failed */
+ return EBADINT;
+ }
+ }
+ }
+ }
+
+ /* Safety check for integer overflow. WARNING: this check */
+ /* achieves nothing on machines where size(int)==size(long). */
+ if ( val > INT_MAX || val < INT_MIN )
+#ifdef __STDC_WANT_SECURE_LIB__
+ errorcode = EOVERFLOW_;
+#else
+ errorcode = EOVERFLOW;
+#endif
+
+ /* Detect any suffixes (KB,MB,GB) and multiply argument value appropriately. */
+ /* We need to be mindful of integer overflows when using such big numbers. */
+ if (detectsuffix(end, "KB")) /* kilobytes */
+ {
+ if ( val > (INT_MAX / 1024) || val < (INT_MIN / 1024) )
+#ifdef __STDC_WANT_SECURE_LIB__
+ errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */
+#else
+ errorcode = EOVERFLOW; /* Overflow would occur if we proceed */
+#endif
+ else
+ val *= 1024; /* 1KB = 1024 */
+ }
+ else if (detectsuffix(end, "MB")) /* megabytes */
+ {
+ if ( val > (INT_MAX / 1048576) || val < (INT_MIN / 1048576) )
+#ifdef __STDC_WANT_SECURE_LIB__
+ errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */
+#else
+ errorcode = EOVERFLOW; /* Overflow would occur if we proceed */
+#endif
+ else
+ val *= 1048576; /* 1MB = 1024*1024 */
+ }
+ else if (detectsuffix(end, "GB")) /* gigabytes */
+ {
+ if ( val > (INT_MAX / 1073741824) || val < (INT_MIN / 1073741824) )
+#ifdef __STDC_WANT_SECURE_LIB__
+ errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */
+#else
+ errorcode = EOVERFLOW; /* Overflow would occur if we proceed */
+#endif
+ else
+ val *= 1073741824; /* 1GB = 1024*1024*1024 */
+ }
+ else if (!detectsuffix(end, ""))
+ errorcode = EBADINT; /* invalid suffix detected */
+
+ /* if success then store result in parent->ival[] array */
+ if (errorcode == 0)
+ parent->ival[parent->count++] = val;
+ }
+
+ /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); */
+ return errorcode;
+}
+
+
+static int arg_int_checkfn(struct arg_int *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+ /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
+ return errorcode;
+}
+
+
+static void arg_int_errorfn(
+ struct arg_int *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ case EBADINT:
+ fprintf(fp, "invalid argument \"%s\" to option ", argval);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+#ifdef __STDC_WANT_SECURE_LIB__
+ case EOVERFLOW_:
+#else
+ case EOVERFLOW:
+#endif
+ fputs("integer overflow at option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, " ");
+ fprintf(fp, "(%s is too large)\n", argval);
+ break;
+ }
+}
+
+
+struct arg_int * arg_int0(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_intn(shortopts, longopts, datatype, 0, 1, glossary);
+}
+
+
+struct arg_int * arg_int1(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_intn(shortopts, longopts, datatype, 1, 1, glossary);
+}
+
+
+struct arg_int * arg_intn(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_int *result;
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ nbytes = sizeof(struct arg_int) /* storage for struct arg_int */
+ + maxcount * sizeof(int); /* storage for ival[maxcount] array */
+
+ result = (struct arg_int *)malloc(nbytes);
+ if (result)
+ {
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = datatype ? datatype : "<int>";
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_int_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_int_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_int_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_int_errorfn;
+
+ /* store the ival[maxcount] array immediately after the arg_int struct */
+ result->ival = (int *)(result + 1);
+ result->count = 0;
+ }
+
+ ARG_TRACE(("arg_intn() returns %p\n", result));
+ return result;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+
+static void arg_lit_resetfn(struct arg_lit *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+static int arg_lit_scanfn(struct arg_lit *parent, const char *argval)
+{
+ int errorcode = 0;
+ if (parent->count < parent->hdr.maxcount )
+ parent->count++;
+ else
+ errorcode = EMAXCOUNT;
+
+ ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval,
+ errorcode));
+ return errorcode;
+}
+
+
+static int arg_lit_checkfn(struct arg_lit *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+ ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static void arg_lit_errorfn(
+ struct arg_lit *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fprintf(fp, "%s: missing option ", progname);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ fprintf(fp, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fprintf(fp, "%s: extraneous option ", progname);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+ }
+
+ ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, fp,
+ errorcode, argval, progname));
+}
+
+
+struct arg_lit * arg_lit0(
+ const char * shortopts,
+ const char * longopts,
+ const char * glossary)
+{
+ return arg_litn(shortopts, longopts, 0, 1, glossary);
+}
+
+
+struct arg_lit * arg_lit1(
+ const char *shortopts,
+ const char *longopts,
+ const char *glossary)
+{
+ return arg_litn(shortopts, longopts, 1, 1, glossary);
+}
+
+
+struct arg_lit * arg_litn(
+ const char *shortopts,
+ const char *longopts,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ struct arg_lit *result;
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ result = (struct arg_lit *)malloc(sizeof(struct arg_lit));
+ if (result)
+ {
+ /* init the arg_hdr struct */
+ result->hdr.flag = 0;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = NULL;
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_lit_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_lit_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_lit_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_lit_errorfn;
+
+ /* init local variables */
+ result->count = 0;
+ }
+
+ ARG_TRACE(("arg_litn() returns %p\n", result));
+ return result;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+struct arg_rem *arg_rem(const char *datatype, const char *glossary)
+{
+ struct arg_rem *result = (struct arg_rem *)malloc(sizeof(struct arg_rem));
+ if (result)
+ {
+ result->hdr.flag = 0;
+ result->hdr.shortopts = NULL;
+ result->hdr.longopts = NULL;
+ result->hdr.datatype = datatype;
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = 1;
+ result->hdr.maxcount = 1;
+ result->hdr.parent = result;
+ result->hdr.resetfn = NULL;
+ result->hdr.scanfn = NULL;
+ result->hdr.checkfn = NULL;
+ result->hdr.errorfn = NULL;
+ }
+
+ ARG_TRACE(("arg_rem() returns %p\n", result));
+ return result;
+}
+
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "argtable3.h"
+
+
+#ifndef _TREX_H_
+#define _TREX_H_
+/***************************************************************
+ T-Rex a tiny regular expression library
+
+ Copyright (C) 2003-2006 Alberto Demichelis
+
+ This software is provided 'as-is', without any express
+ or implied warranty. In no event will the authors be held
+ liable for any damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for
+ any purpose, including commercial applications, and to alter
+ it and redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but
+ is not required.
+
+ 2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any
+ source distribution.
+
+****************************************************************/
+// THIS FILE HAS BEEN ALTERED from original version to:
+// * fix issues found by static code analisys:
+// - Null pointer dereference in trex_newnode, arg_rex_scanfn and trex_compile
+// * Fix implicit-fallthrough GCC error in trex_charnode
+// * Fix clobbered GCC error in trex_compile
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _UNICODE
+#define TRexChar unsigned short
+#define MAX_CHAR 0xFFFF
+#define _TREXC(c) L##c
+#define trex_strlen wcslen
+#define trex_printf wprintf
+#else
+#define TRexChar char
+#define MAX_CHAR 0xFF
+#define _TREXC(c) (c)
+#define trex_strlen strlen
+#define trex_printf printf
+#endif
+
+#ifndef TREX_API
+#define TREX_API extern
+#endif
+
+#define TRex_True 1
+#define TRex_False 0
+
+#define TREX_ICASE ARG_REX_ICASE
+
+typedef unsigned int TRexBool;
+typedef struct TRex TRex;
+
+typedef struct {
+ const TRexChar *begin;
+ int len;
+} TRexMatch;
+
+TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags);
+TREX_API void trex_free(TRex *exp);
+TREX_API TRexBool trex_match(TRex* exp, const TRexChar* text);
+TREX_API TRexBool trex_search(TRex* exp, const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end);
+TREX_API TRexBool trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* text_end, const TRexChar** out_begin, const TRexChar** out_end);
+TREX_API int trex_getsubexpcount(TRex* exp);
+TREX_API TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch *subexp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
+
+struct privhdr
+{
+ const char *pattern;
+ int flags;
+};
+
+
+static void arg_rex_resetfn(struct arg_rex *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+static int arg_rex_scanfn(struct arg_rex *parent, const char *argval)
+{
+ int errorcode = 0;
+ const TRexChar *error = NULL;
+ TRex *rex = NULL;
+ TRexBool is_match = TRex_False;
+
+ if (parent->count == parent->hdr.maxcount )
+ {
+ /* maximum number of arguments exceeded */
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* a valid argument with no argument value was given. */
+ /* This happens when an optional argument value was invoked. */
+ /* leave parent argument value unaltered but still count the argument. */
+ parent->count++;
+ }
+ else
+ {
+ struct privhdr *priv = (struct privhdr *)parent->hdr.priv;
+
+ /* test the current argument value for a match with the regular expression */
+ /* if a match is detected, record the argument value in the arg_rex struct */
+
+ rex = trex_compile(priv->pattern, &error, priv->flags);
+ if (!rex)
+ {
+ errorcode = EREGNOMATCH;
+ }
+ else
+ {
+ is_match = trex_match(rex, argval);
+ if (!is_match)
+ errorcode = EREGNOMATCH;
+ else
+ parent->sval[parent->count++] = argval;
+
+ trex_free(rex);
+ }
+ }
+
+ ARG_TRACE(("%s:scanfn(%p) returns %d\n",__FILE__,parent,errorcode));
+ return errorcode;
+}
+
+static int arg_rex_checkfn(struct arg_rex *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+ //struct privhdr *priv = (struct privhdr*)parent->hdr.priv;
+
+ /* free the regex "program" we constructed in resetfn */
+ //regfree(&(priv->regex));
+
+ /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
+ return errorcode;
+}
+
+static void arg_rex_errorfn(struct arg_rex *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ case EREGNOMATCH:
+ fputs("illegal value ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+
+ default:
+ {
+ //char errbuff[256];
+ //regerror(errorcode, NULL, errbuff, sizeof(errbuff));
+ //printf("%s\n", errbuff);
+ }
+ break;
+ }
+}
+
+
+struct arg_rex * arg_rex0(const char * shortopts,
+ const char * longopts,
+ const char * pattern,
+ const char *datatype,
+ int flags,
+ const char *glossary)
+{
+ return arg_rexn(shortopts,
+ longopts,
+ pattern,
+ datatype,
+ 0,
+ 1,
+ flags,
+ glossary);
+}
+
+struct arg_rex * arg_rex1(const char * shortopts,
+ const char * longopts,
+ const char * pattern,
+ const char *datatype,
+ int flags,
+ const char *glossary)
+{
+ return arg_rexn(shortopts,
+ longopts,
+ pattern,
+ datatype,
+ 1,
+ 1,
+ flags,
+ glossary);
+}
+
+
+struct arg_rex * arg_rexn(const char * shortopts,
+ const char * longopts,
+ const char * pattern,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ int flags,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_rex *result;
+ struct privhdr *priv;
+ int i;
+ const TRexChar *error = NULL;
+ TRex *rex = NULL;
+
+ if (!pattern)
+ {
+ printf(
+ "argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n");
+ printf("argtable: Bad argument table.\n");
+ return NULL;
+ }
+
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */
+ + sizeof(struct privhdr) /* storage for private arg_rex data */
+ + maxcount * sizeof(char *); /* storage for sval[maxcount] array */
+
+ result = (struct arg_rex *)malloc(nbytes);
+ if (result == NULL)
+ return result;
+
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = datatype ? datatype : pattern;
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_rex_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_rex_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_rex_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_rex_errorfn;
+
+ /* store the arg_rex_priv struct immediately after the arg_rex struct */
+ result->hdr.priv = result + 1;
+ priv = (struct privhdr *)(result->hdr.priv);
+ priv->pattern = pattern;
+ priv->flags = flags;
+
+ /* store the sval[maxcount] array immediately after the arg_rex_priv struct */
+ result->sval = (const char * *)(priv + 1);
+ result->count = 0;
+
+ /* foolproof the string pointers by initializing them to reference empty strings */
+ for (i = 0; i < maxcount; i++)
+ result->sval[i] = "";
+
+ /* here we construct and destroy a regex representation of the regular
+ * expression for no other reason than to force any regex errors to be
+ * trapped now rather than later. If we don't, then errors may go undetected
+ * until an argument is actually parsed.
+ */
+
+ rex = trex_compile(priv->pattern, &error, priv->flags);
+ if (rex == NULL)
+ {
+ ARG_LOG(("argtable: %s \"%s\"\n", error ? error : _TREXC("undefined"), priv->pattern));
+ ARG_LOG(("argtable: Bad argument table.\n"));
+ }
+
+ trex_free(rex);
+
+ ARG_TRACE(("arg_rexn() returns %p\n", result));
+ return result;
+}
+
+
+
+/* see copyright notice in trex.h */
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <setjmp.h>
+
+#ifdef _UINCODE
+#define scisprint iswprint
+#define scstrlen wcslen
+#define scprintf wprintf
+#define _SC(x) L(x)
+#else
+#define scisprint isprint
+#define scstrlen strlen
+#define scprintf printf
+#define _SC(x) (x)
+#endif
+
+#ifdef _DEBUG
+#include <stdio.h>
+
+static const TRexChar *g_nnames[] =
+{
+ _SC("NONE"),_SC("OP_GREEDY"), _SC("OP_OR"),
+ _SC("OP_EXPR"),_SC("OP_NOCAPEXPR"),_SC("OP_DOT"), _SC("OP_CLASS"),
+ _SC("OP_CCLASS"),_SC("OP_NCLASS"),_SC("OP_RANGE"),_SC("OP_CHAR"),
+ _SC("OP_EOL"),_SC("OP_BOL"),_SC("OP_WB")
+};
+
+#endif
+#define OP_GREEDY (MAX_CHAR+1) // * + ? {n}
+#define OP_OR (MAX_CHAR+2)
+#define OP_EXPR (MAX_CHAR+3) //parentesis ()
+#define OP_NOCAPEXPR (MAX_CHAR+4) //parentesis (?:)
+#define OP_DOT (MAX_CHAR+5)
+#define OP_CLASS (MAX_CHAR+6)
+#define OP_CCLASS (MAX_CHAR+7)
+#define OP_NCLASS (MAX_CHAR+8) //negates class the [^
+#define OP_RANGE (MAX_CHAR+9)
+#define OP_CHAR (MAX_CHAR+10)
+#define OP_EOL (MAX_CHAR+11)
+#define OP_BOL (MAX_CHAR+12)
+#define OP_WB (MAX_CHAR+13)
+
+#define TREX_SYMBOL_ANY_CHAR ('.')
+#define TREX_SYMBOL_GREEDY_ONE_OR_MORE ('+')
+#define TREX_SYMBOL_GREEDY_ZERO_OR_MORE ('*')
+#define TREX_SYMBOL_GREEDY_ZERO_OR_ONE ('?')
+#define TREX_SYMBOL_BRANCH ('|')
+#define TREX_SYMBOL_END_OF_STRING ('$')
+#define TREX_SYMBOL_BEGINNING_OF_STRING ('^')
+#define TREX_SYMBOL_ESCAPE_CHAR ('\\')
+
+
+typedef int TRexNodeType;
+
+typedef struct tagTRexNode{
+ TRexNodeType type;
+ int left;
+ int right;
+ int next;
+}TRexNode;
+
+struct TRex{
+ const TRexChar *_eol;
+ const TRexChar *_bol;
+ const TRexChar *_p;
+ int _first;
+ int _op;
+ TRexNode *_nodes;
+ int _nallocated;
+ int _nsize;
+ int _nsubexpr;
+ TRexMatch *_matches;
+ int _currsubexp;
+ void *_jmpbuf;
+ const TRexChar **_error;
+ int _flags;
+};
+
+static int trex_list(TRex *exp);
+
+static int trex_newnode(TRex *exp, TRexNodeType type)
+{
+ TRexNode n;
+ int newid;
+ n.type = type;
+ n.next = n.right = n.left = -1;
+ if(type == OP_EXPR)
+ n.right = exp->_nsubexpr++;
+ if(exp->_nallocated < (exp->_nsize + 1)) {
+ TRexNode *new_nodes = NULL;
+ exp->_nallocated *= 2;
+ new_nodes = (TRexNode *)realloc(exp->_nodes, exp->_nallocated * sizeof(TRexNode));
+ if (!new_nodes)
+ return 0; // return id of _nodes[0] in case of re-allocation failure
+ exp->_nodes = new_nodes;
+ }
+ exp->_nodes[exp->_nsize++] = n;
+ newid = exp->_nsize - 1;
+ return (int)newid;
+}
+
+static void trex_error(TRex *exp,const TRexChar *error)
+{
+ if(exp->_error) *exp->_error = error;
+ longjmp(*((jmp_buf*)exp->_jmpbuf),-1);
+}
+
+static void trex_expect(TRex *exp, int n){
+ if((*exp->_p) != n)
+ trex_error(exp, _SC("expected paren"));
+ exp->_p++;
+}
+
+static TRexChar trex_escapechar(TRex *exp)
+{
+ if(*exp->_p == TREX_SYMBOL_ESCAPE_CHAR){
+ exp->_p++;
+ switch(*exp->_p) {
+ case 'v': exp->_p++; return '\v';
+ case 'n': exp->_p++; return '\n';
+ case 't': exp->_p++; return '\t';
+ case 'r': exp->_p++; return '\r';
+ case 'f': exp->_p++; return '\f';
+ default: return (*exp->_p++);
+ }
+ } else if(!scisprint(*exp->_p)) trex_error(exp,_SC("letter expected"));
+ return (*exp->_p++);
+}
+
+static int trex_charclass(TRex *exp,int classid)
+{
+ int n = trex_newnode(exp,OP_CCLASS);
+ exp->_nodes[n].left = classid;
+ return n;
+}
+
+static int trex_charnode(TRex *exp,TRexBool isclass)
+{
+ TRexChar t;
+ if(*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) {
+ exp->_p++;
+ switch(*exp->_p) {
+ case 'n': exp->_p++; return trex_newnode(exp,'\n');
+ case 't': exp->_p++; return trex_newnode(exp,'\t');
+ case 'r': exp->_p++; return trex_newnode(exp,'\r');
+ case 'f': exp->_p++; return trex_newnode(exp,'\f');
+ case 'v': exp->_p++; return trex_newnode(exp,'\v');
+ case 'a': case 'A': case 'w': case 'W': case 's': case 'S':
+ case 'd': case 'D': case 'x': case 'X': case 'c': case 'C':
+ case 'p': case 'P': case 'l': case 'u':
+ {
+ t = *exp->_p; exp->_p++;
+ return trex_charclass(exp,t);
+ }
+ case 'b':
+ case 'B':
+ if(!isclass) {
+ int node = trex_newnode(exp,OP_WB);
+ exp->_nodes[node].left = *exp->_p;
+ exp->_p++;
+ return node;
+ } // fallthrough
+ //else default
+ default:
+ t = *exp->_p; exp->_p++;
+ return trex_newnode(exp,t);
+ }
+ }
+ else if(!scisprint(*exp->_p)) {
+
+ trex_error(exp,_SC("letter expected"));
+ }
+ t = *exp->_p; exp->_p++;
+ return trex_newnode(exp,t);
+}
+static int trex_class(TRex *exp)
+{
+ int ret = -1;
+ int first = -1,chain;
+ if(*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING){
+ ret = trex_newnode(exp,OP_NCLASS);
+ exp->_p++;
+ }else ret = trex_newnode(exp,OP_CLASS);
+
+ if(*exp->_p == ']') trex_error(exp,_SC("empty class"));
+ chain = ret;
+ while(*exp->_p != ']' && exp->_p != exp->_eol) {
+ if(*exp->_p == '-' && first != -1){
+ int r,t;
+ if(*exp->_p++ == ']') trex_error(exp,_SC("unfinished range"));
+ r = trex_newnode(exp,OP_RANGE);
+ if(first>*exp->_p) trex_error(exp,_SC("invalid range"));
+ if(exp->_nodes[first].type == OP_CCLASS) trex_error(exp,_SC("cannot use character classes in ranges"));
+ exp->_nodes[r].left = exp->_nodes[first].type;
+ t = trex_escapechar(exp);
+ exp->_nodes[r].right = t;
+ exp->_nodes[chain].next = r;
+ chain = r;
+ first = -1;
+ }
+ else{
+ if(first!=-1){
+ int c = first;
+ exp->_nodes[chain].next = c;
+ chain = c;
+ first = trex_charnode(exp,TRex_True);
+ }
+ else{
+ first = trex_charnode(exp,TRex_True);
+ }
+ }
+ }
+ if(first!=-1){
+ int c = first;
+ exp->_nodes[chain].next = c;
+ chain = c;
+ first = -1;
+ }
+ /* hack? */
+ exp->_nodes[ret].left = exp->_nodes[ret].next;
+ exp->_nodes[ret].next = -1;
+ return ret;
+}
+
+static int trex_parsenumber(TRex *exp)
+{
+ int ret = *exp->_p-'0';
+ int positions = 10;
+ exp->_p++;
+ while(isdigit(*exp->_p)) {
+ ret = ret*10+(*exp->_p++-'0');
+ if(positions==1000000000) trex_error(exp,_SC("overflow in numeric constant"));
+ positions *= 10;
+ };
+ return ret;
+}
+
+static int trex_element(TRex *exp)
+{
+ int ret = -1;
+ switch(*exp->_p)
+ {
+ case '(': {
+ int expr,newn;
+ exp->_p++;
+
+
+ if(*exp->_p =='?') {
+ exp->_p++;
+ trex_expect(exp,':');
+ expr = trex_newnode(exp,OP_NOCAPEXPR);
+ }
+ else
+ expr = trex_newnode(exp,OP_EXPR);
+ newn = trex_list(exp);
+ exp->_nodes[expr].left = newn;
+ ret = expr;
+ trex_expect(exp,')');
+ }
+ break;
+ case '[':
+ exp->_p++;
+ ret = trex_class(exp);
+ trex_expect(exp,']');
+ break;
+ case TREX_SYMBOL_END_OF_STRING: exp->_p++; ret = trex_newnode(exp,OP_EOL);break;
+ case TREX_SYMBOL_ANY_CHAR: exp->_p++; ret = trex_newnode(exp,OP_DOT);break;
+ default:
+ ret = trex_charnode(exp,TRex_False);
+ break;
+ }
+
+ {
+ TRexBool isgreedy = TRex_False;
+ unsigned short p0 = 0, p1 = 0;
+ switch(*exp->_p){
+ case TREX_SYMBOL_GREEDY_ZERO_OR_MORE: p0 = 0; p1 = 0xFFFF; exp->_p++; isgreedy = TRex_True; break;
+ case TREX_SYMBOL_GREEDY_ONE_OR_MORE: p0 = 1; p1 = 0xFFFF; exp->_p++; isgreedy = TRex_True; break;
+ case TREX_SYMBOL_GREEDY_ZERO_OR_ONE: p0 = 0; p1 = 1; exp->_p++; isgreedy = TRex_True; break;
+ case '{':
+ exp->_p++;
+ if(!isdigit(*exp->_p)) trex_error(exp,_SC("number expected"));
+ p0 = (unsigned short)trex_parsenumber(exp);
+ /*******************************/
+ switch(*exp->_p) {
+ case '}':
+ p1 = p0; exp->_p++;
+ break;
+ case ',':
+ exp->_p++;
+ p1 = 0xFFFF;
+ if(isdigit(*exp->_p)){
+ p1 = (unsigned short)trex_parsenumber(exp);
+ }
+ trex_expect(exp,'}');
+ break;
+ default:
+ trex_error(exp,_SC(", or } expected"));
+ }
+ /*******************************/
+ isgreedy = TRex_True;
+ break;
+
+ }
+ if(isgreedy) {
+ int nnode = trex_newnode(exp,OP_GREEDY);
+ exp->_nodes[nnode].left = ret;
+ exp->_nodes[nnode].right = ((p0)<<16)|p1;
+ ret = nnode;
+ }
+ }
+ if((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) {
+ int nnode = trex_element(exp);
+ exp->_nodes[ret].next = nnode;
+ }
+
+ return ret;
+}
+
+static int trex_list(TRex *exp)
+{
+ int ret=-1,e;
+ if(*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) {
+ exp->_p++;
+ ret = trex_newnode(exp,OP_BOL);
+ }
+ e = trex_element(exp);
+ if(ret != -1) {
+ exp->_nodes[ret].next = e;
+ }
+ else ret = e;
+
+ if(*exp->_p == TREX_SYMBOL_BRANCH) {
+ int temp,tright;
+ exp->_p++;
+ temp = trex_newnode(exp,OP_OR);
+ exp->_nodes[temp].left = ret;
+ tright = trex_list(exp);
+ exp->_nodes[temp].right = tright;
+ ret = temp;
+ }
+ return ret;
+}
+
+static TRexBool trex_matchcclass(int cclass,TRexChar c)
+{
+ switch(cclass) {
+ case 'a': return isalpha(c)?TRex_True:TRex_False;
+ case 'A': return !isalpha(c)?TRex_True:TRex_False;
+ case 'w': return (isalnum(c) || c == '_')?TRex_True:TRex_False;
+ case 'W': return (!isalnum(c) && c != '_')?TRex_True:TRex_False;
+ case 's': return ISSPACE(c)?TRex_True:TRex_False;
+ case 'S': return !ISSPACE(c)?TRex_True:TRex_False;
+ case 'd': return isdigit(c)?TRex_True:TRex_False;
+ case 'D': return !isdigit(c)?TRex_True:TRex_False;
+ case 'x': return isxdigit(c)?TRex_True:TRex_False;
+ case 'X': return !isxdigit(c)?TRex_True:TRex_False;
+ case 'c': return iscntrl(c)?TRex_True:TRex_False;
+ case 'C': return !iscntrl(c)?TRex_True:TRex_False;
+ case 'p': return ispunct(c)?TRex_True:TRex_False;
+ case 'P': return !ispunct(c)?TRex_True:TRex_False;
+ case 'l': return islower(c)?TRex_True:TRex_False;
+ case 'u': return isupper(c)?TRex_True:TRex_False;
+ }
+ return TRex_False; /*cannot happen*/
+}
+
+#ifdef _MSC_VER
+#pragma warning( push )
+#pragma warning( disable : 4706 )
+#endif
+
+static TRexBool trex_matchclass(TRex* exp,TRexNode *node,TRexChar c)
+{
+ do {
+ switch(node->type) {
+ case OP_RANGE:
+ if (exp->_flags & TREX_ICASE)
+ {
+ if(c >= toupper(node->left) && c <= toupper(node->right)) return TRex_True;
+ if(c >= tolower(node->left) && c <= tolower(node->right)) return TRex_True;
+ }
+ else
+ {
+ if(c >= node->left && c <= node->right) return TRex_True;
+ }
+ break;
+ case OP_CCLASS:
+ if(trex_matchcclass(node->left,c)) return TRex_True;
+ break;
+ default:
+ if (exp->_flags & TREX_ICASE)
+ {
+ if (c == tolower(node->type) || c == toupper(node->type)) return TRex_True;
+ }
+ else
+ {
+ if(c == node->type)return TRex_True;
+ }
+
+ }
+ } while((node->next != -1) && (node = &exp->_nodes[node->next]));
+ return TRex_False;
+}
+
+static const TRexChar *trex_matchnode(TRex* exp,TRexNode *node,const TRexChar *str,TRexNode *next)
+{
+
+ TRexNodeType type = node->type;
+ switch(type) {
+ case OP_GREEDY: {
+ //TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL;
+ TRexNode *greedystop = NULL;
+ int p0 = (node->right >> 16)&0x0000FFFF, p1 = node->right&0x0000FFFF, nmaches = 0;
+ const TRexChar *s=str, *good = str;
+
+ if(node->next != -1) {
+ greedystop = &exp->_nodes[node->next];
+ }
+ else {
+ greedystop = next;
+ }
+
+ while((nmaches == 0xFFFF || nmaches < p1)) {
+
+ const TRexChar *stop;
+ if(!(s = trex_matchnode(exp,&exp->_nodes[node->left],s,greedystop)))
+ break;
+ nmaches++;
+ good=s;
+ if(greedystop) {
+ //checks that 0 matches satisfy the expression(if so skips)
+ //if not would always stop(for instance if is a '?')
+ if(greedystop->type != OP_GREEDY ||
+ (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0))
+ {
+ TRexNode *gnext = NULL;
+ if(greedystop->next != -1) {
+ gnext = &exp->_nodes[greedystop->next];
+ }else if(next && next->next != -1){
+ gnext = &exp->_nodes[next->next];
+ }
+ stop = trex_matchnode(exp,greedystop,s,gnext);
+ if(stop) {
+ //if satisfied stop it
+ if(p0 == p1 && p0 == nmaches) break;
+ else if(nmaches >= p0 && p1 == 0xFFFF) break;
+ else if(nmaches >= p0 && nmaches <= p1) break;
+ }
+ }
+ }
+
+ if(s >= exp->_eol)
+ break;
+ }
+ if(p0 == p1 && p0 == nmaches) return good;
+ else if(nmaches >= p0 && p1 == 0xFFFF) return good;
+ else if(nmaches >= p0 && nmaches <= p1) return good;
+ return NULL;
+ }
+ case OP_OR: {
+ const TRexChar *asd = str;
+ TRexNode *temp=&exp->_nodes[node->left];
+ while( (asd = trex_matchnode(exp,temp,asd,NULL)) ) {
+ if(temp->next != -1)
+ temp = &exp->_nodes[temp->next];
+ else
+ return asd;
+ }
+ asd = str;
+ temp = &exp->_nodes[node->right];
+ while( (asd = trex_matchnode(exp,temp,asd,NULL)) ) {
+ if(temp->next != -1)
+ temp = &exp->_nodes[temp->next];
+ else
+ return asd;
+ }
+ return NULL;
+ break;
+ }
+ case OP_EXPR:
+ case OP_NOCAPEXPR:{
+ TRexNode *n = &exp->_nodes[node->left];
+ const TRexChar *cur = str;
+ int capture = -1;
+ if(node->type != OP_NOCAPEXPR && node->right == exp->_currsubexp) {
+ capture = exp->_currsubexp;
+ exp->_matches[capture].begin = cur;
+ exp->_currsubexp++;
+ }
+
+ do {
+ TRexNode *subnext = NULL;
+ if(n->next != -1) {
+ subnext = &exp->_nodes[n->next];
+ }else {
+ subnext = next;
+ }
+ if(!(cur = trex_matchnode(exp,n,cur,subnext))) {
+ if(capture != -1){
+ exp->_matches[capture].begin = 0;
+ exp->_matches[capture].len = 0;
+ }
+ return NULL;
+ }
+ } while((n->next != -1) && (n = &exp->_nodes[n->next]));
+
+ if(capture != -1)
+ exp->_matches[capture].len = (int)(cur - exp->_matches[capture].begin);
+ return cur;
+ }
+ case OP_WB:
+ if((str == exp->_bol && !ISSPACE(*str))
+ || ((str == exp->_eol && !ISSPACE(*(str-1))))
+ || ((!ISSPACE(*str) && ISSPACE(*(str+1))))
+ || ((ISSPACE(*str) && !ISSPACE(*(str+1)))) ) {
+ return (node->left == 'b')?str:NULL;
+ }
+ return (node->left == 'b')?NULL:str;
+ case OP_BOL:
+ if(str == exp->_bol) return str;
+ return NULL;
+ case OP_EOL:
+ if(str == exp->_eol) return str;
+ return NULL;
+ case OP_DOT:
+ str++;
+ return str;
+ case OP_NCLASS:
+ case OP_CLASS:
+ if(trex_matchclass(exp,&exp->_nodes[node->left],*str)?(type == OP_CLASS?TRex_True:TRex_False):(type == OP_NCLASS?TRex_True:TRex_False)) {
+ str++;
+ return str;
+ }
+ return NULL;
+ case OP_CCLASS:
+ if(trex_matchcclass(node->left,*str)) {
+ str++;
+ return str;
+ }
+ return NULL;
+ default: /* char */
+ if (exp->_flags & TREX_ICASE)
+ {
+ if(*str != tolower(node->type) && *str != toupper(node->type)) return NULL;
+ }
+ else
+ {
+ if (*str != node->type) return NULL;
+ }
+ str++;
+ return str;
+ }
+}
+#ifdef _MSC_VER
+#pragma warning( pop )
+#endif
+
+/* public api */
+TRex *trex_compile(const TRexChar *pattern,const TRexChar **error,int flags)
+{
+ // allocated data is volatile, its safe to setjmp
+ TRex * volatile exp = NULL;
+ do {
+ exp = (TRex *)malloc(sizeof(TRex));
+ if (!exp) break;
+ memset((void*)exp, 0, sizeof(TRex));
+
+ exp->_eol = exp->_bol = NULL;
+ exp->_p = pattern;
+ exp->_nallocated = (int)scstrlen(pattern) * sizeof(TRexChar);
+ exp->_nodes = (TRexNode *)malloc(exp->_nallocated * sizeof(TRexNode));
+ if (!exp->_nodes) break;
+ exp->_nsize = 0;
+ exp->_matches = 0;
+ exp->_nsubexpr = 0;
+ exp->_first = trex_newnode((TRex*)exp,OP_EXPR);
+ exp->_error = error;
+ exp->_jmpbuf = malloc(sizeof(jmp_buf));
+ if (!exp->_jmpbuf) break;
+ exp->_flags = flags;
+ if(setjmp(*((jmp_buf*)exp->_jmpbuf)) == 0) {
+ int res = trex_list((TRex*)exp);
+ exp->_nodes[exp->_first].left = res;
+ if(*exp->_p!='\0')
+ trex_error((TRex*)exp,_SC("unexpected character"));
+#ifdef _DEBUG
+ {
+ int nsize,i;
+ TRexNode *t;
+ nsize = exp->_nsize;
+ t = &exp->_nodes[0];
+ scprintf(_SC("\n"));
+ for(i = 0;i < nsize; i++) {
+ if(exp->_nodes[i].type>MAX_CHAR)
+ scprintf(_SC("[%02d] %10s "),i,g_nnames[exp->_nodes[i].type-MAX_CHAR]);
+ else
+ scprintf(_SC("[%02d] %10c "),i,exp->_nodes[i].type);
+ scprintf(_SC("left %02d right %02d next %02d\n"),exp->_nodes[i].left,exp->_nodes[i].right,exp->_nodes[i].next);
+ }
+ scprintf(_SC("\n"));
+ }
+#endif
+ exp->_matches = (TRexMatch *) malloc(exp->_nsubexpr * sizeof(TRexMatch));
+ if (!exp->_matches) break;
+ memset(exp->_matches,0,exp->_nsubexpr * sizeof(TRexMatch));
+ }
+ else {
+ break;
+ }
+ return (TRex*)exp;
+ } while (0);
+
+ trex_free((TRex*)exp);
+ return NULL;
+}
+
+void trex_free(TRex *exp)
+{
+ if(exp) {
+ if(exp->_nodes) free(exp->_nodes);
+ if(exp->_jmpbuf) free(exp->_jmpbuf);
+ if(exp->_matches) free(exp->_matches);
+ free(exp);
+ }
+}
+
+TRexBool trex_match(TRex* exp,const TRexChar* text)
+{
+ const TRexChar* res = NULL;
+ exp->_bol = text;
+ exp->_eol = text + scstrlen(text);
+ exp->_currsubexp = 0;
+ res = trex_matchnode(exp,exp->_nodes,text,NULL);
+ if(res == NULL || res != exp->_eol)
+ return TRex_False;
+ return TRex_True;
+}
+
+TRexBool trex_searchrange(TRex* exp,const TRexChar* text_begin,const TRexChar* text_end,const TRexChar** out_begin, const TRexChar** out_end)
+{
+ const TRexChar *cur = NULL;
+ int node = exp->_first;
+ if(text_begin >= text_end) return TRex_False;
+ exp->_bol = text_begin;
+ exp->_eol = text_end;
+ do {
+ cur = text_begin;
+ while(node != -1) {
+ exp->_currsubexp = 0;
+ cur = trex_matchnode(exp,&exp->_nodes[node],cur,NULL);
+ if(!cur)
+ break;
+ node = exp->_nodes[node].next;
+ }
+ text_begin++;
+ } while(cur == NULL && text_begin != text_end);
+
+ if(cur == NULL)
+ return TRex_False;
+
+ --text_begin;
+
+ if(out_begin) *out_begin = text_begin;
+ if(out_end) *out_end = cur;
+ return TRex_True;
+}
+
+TRexBool trex_search(TRex* exp,const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end)
+{
+ return trex_searchrange(exp,text,text + scstrlen(text),out_begin,out_end);
+}
+
+int trex_getsubexpcount(TRex* exp)
+{
+ return exp->_nsubexpr;
+}
+
+TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch *subexp)
+{
+ if( n<0 || n >= exp->_nsubexpr) return TRex_False;
+ *subexp = exp->_matches[n];
+ return TRex_True;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+
+#include "argtable3.h"
+
+
+static void arg_str_resetfn(struct arg_str *parent)
+{
+ ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
+ parent->count = 0;
+}
+
+
+static int arg_str_scanfn(struct arg_str *parent, const char *argval)
+{
+ int errorcode = 0;
+
+ if (parent->count == parent->hdr.maxcount)
+ {
+ /* maximum number of arguments exceeded */
+ errorcode = EMAXCOUNT;
+ }
+ else if (!argval)
+ {
+ /* a valid argument with no argument value was given. */
+ /* This happens when an optional argument value was invoked. */
+ /* leave parent arguiment value unaltered but still count the argument. */
+ parent->count++;
+ }
+ else
+ {
+ parent->sval[parent->count++] = argval;
+ }
+
+ ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static int arg_str_checkfn(struct arg_str *parent)
+{
+ int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
+
+ ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode));
+ return errorcode;
+}
+
+
+static void arg_str_errorfn(
+ struct arg_str *parent,
+ FILE *fp,
+ int errorcode,
+ const char *argval,
+ const char *progname)
+{
+ const char *shortopts = parent->hdr.shortopts;
+ const char *longopts = parent->hdr.longopts;
+ const char *datatype = parent->hdr.datatype;
+
+ /* make argval NULL safe */
+ argval = argval ? argval : "";
+
+ fprintf(fp, "%s: ", progname);
+ switch(errorcode)
+ {
+ case EMINCOUNT:
+ fputs("missing option ", fp);
+ arg_print_option(fp, shortopts, longopts, datatype, "\n");
+ break;
+
+ case EMAXCOUNT:
+ fputs("excess option ", fp);
+ arg_print_option(fp, shortopts, longopts, argval, "\n");
+ break;
+ }
+}
+
+
+struct arg_str * arg_str0(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_strn(shortopts, longopts, datatype, 0, 1, glossary);
+}
+
+
+struct arg_str * arg_str1(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ const char *glossary)
+{
+ return arg_strn(shortopts, longopts, datatype, 1, 1, glossary);
+}
+
+
+struct arg_str * arg_strn(
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary)
+{
+ size_t nbytes;
+ struct arg_str *result;
+
+ /* should not allow this stupid error */
+ /* we should return an error code warning this logic error */
+ /* foolproof things by ensuring maxcount is not less than mincount */
+ maxcount = (maxcount < mincount) ? mincount : maxcount;
+
+ nbytes = sizeof(struct arg_str) /* storage for struct arg_str */
+ + maxcount * sizeof(char *); /* storage for sval[maxcount] array */
+
+ result = (struct arg_str *)malloc(nbytes);
+ if (result)
+ {
+ int i;
+
+ /* init the arg_hdr struct */
+ result->hdr.flag = ARG_HASVALUE;
+ result->hdr.shortopts = shortopts;
+ result->hdr.longopts = longopts;
+ result->hdr.datatype = datatype ? datatype : "<string>";
+ result->hdr.glossary = glossary;
+ result->hdr.mincount = mincount;
+ result->hdr.maxcount = maxcount;
+ result->hdr.parent = result;
+ result->hdr.resetfn = (arg_resetfn *)arg_str_resetfn;
+ result->hdr.scanfn = (arg_scanfn *)arg_str_scanfn;
+ result->hdr.checkfn = (arg_checkfn *)arg_str_checkfn;
+ result->hdr.errorfn = (arg_errorfn *)arg_str_errorfn;
+
+ /* store the sval[maxcount] array immediately after the arg_str struct */
+ result->sval = (const char * *)(result + 1);
+ result->count = 0;
+
+ /* foolproof the string pointers by initialising them to reference empty strings */
+ for (i = 0; i < maxcount; i++)
+ result->sval[i] = "";
+ }
+
+ ARG_TRACE(("arg_strn() returns %p\n", result));
+ return result;
+}
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "argtable3.h"
+
+static
+void arg_register_error(struct arg_end *end,
+ void *parent,
+ int error,
+ const char *argval)
+{
+ /* printf("arg_register_error(%p,%p,%d,%s)\n",end,parent,error,argval); */
+ if (end->count < end->hdr.maxcount)
+ {
+ end->error[end->count] = error;
+ end->parent[end->count] = parent;
+ end->argval[end->count] = argval;
+ end->count++;
+ }
+ else
+ {
+ end->error[end->hdr.maxcount - 1] = ARG_ELIMIT;
+ end->parent[end->hdr.maxcount - 1] = end;
+ end->argval[end->hdr.maxcount - 1] = NULL;
+ }
+}
+
+
+/*
+ * Return index of first table entry with a matching short option
+ * or -1 if no match was found.
+ */
+static
+int find_shortoption(struct arg_hdr * *table, char shortopt)
+{
+ int tabindex;
+ for(tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ if (table[tabindex]->shortopts &&
+ strchr(table[tabindex]->shortopts, shortopt))
+ return tabindex;
+ }
+ return -1;
+}
+
+
+struct longoptions
+{
+ int getoptval;
+ int noptions;
+ struct option *options;
+};
+
+#if 0
+static
+void dump_longoptions(struct longoptions * longoptions)
+{
+ int i;
+ printf("getoptval = %d\n", longoptions->getoptval);
+ printf("noptions = %d\n", longoptions->noptions);
+ for (i = 0; i < longoptions->noptions; i++)
+ {
+ printf("options[%d].name = \"%s\"\n",
+ i,
+ longoptions->options[i].name);
+ printf("options[%d].has_arg = %d\n", i, longoptions->options[i].has_arg);
+ printf("options[%d].flag = %p\n", i, longoptions->options[i].flag);
+ printf("options[%d].val = %d\n", i, longoptions->options[i].val);
+ }
+}
+#endif
+
+static
+struct longoptions * alloc_longoptions(struct arg_hdr * *table)
+{
+ struct longoptions *result;
+ size_t nbytes;
+ int noptions = 1;
+ size_t longoptlen = 0;
+ int tabindex;
+
+ /*
+ * Determine the total number of option structs required
+ * by counting the number of comma separated long options
+ * in all table entries and return the count in noptions.
+ * note: noptions starts at 1 not 0 because we getoptlong
+ * requires a NULL option entry to terminate the option array.
+ * While we are at it, count the number of chars required
+ * to store private copies of all the longoption strings
+ * and return that count in logoptlen.
+ */
+ tabindex = 0;
+ do
+ {
+ const char *longopts = table[tabindex]->longopts;
+ longoptlen += (longopts ? strlen(longopts) : 0) + 1;
+ while (longopts)
+ {
+ noptions++;
+ longopts = strchr(longopts + 1, ',');
+ }
+ } while(!(table[tabindex++]->flag & ARG_TERMINATOR));
+ /*printf("%d long options consuming %d chars in total\n",noptions,longoptlen);*/
+
+
+ /* allocate storage for return data structure as: */
+ /* (struct longoptions) + (struct options)[noptions] + char[longoptlen] */
+ nbytes = sizeof(struct longoptions)
+ + sizeof(struct option) * noptions
+ + longoptlen;
+ result = (struct longoptions *)malloc(nbytes);
+ if (result)
+ {
+ int option_index = 0;
+ char *store;
+
+ result->getoptval = 0;
+ result->noptions = noptions;
+ result->options = (struct option *)(result + 1);
+ store = (char *)(result->options + noptions);
+
+ for(tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ const char *longopts = table[tabindex]->longopts;
+
+ while(longopts && *longopts)
+ {
+ char *storestart = store;
+
+ /* copy progressive longopt strings into the store */
+ while (*longopts != 0 && *longopts != ',')
+ *store++ = *longopts++;
+ *store++ = 0;
+ if (*longopts == ',')
+ longopts++;
+ /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/
+
+ result->options[option_index].name = storestart;
+ result->options[option_index].flag = &(result->getoptval);
+ result->options[option_index].val = tabindex;
+ if (table[tabindex]->flag & ARG_HASOPTVALUE)
+ result->options[option_index].has_arg = 2;
+ else if (table[tabindex]->flag & ARG_HASVALUE)
+ result->options[option_index].has_arg = 1;
+ else
+ result->options[option_index].has_arg = 0;
+
+ option_index++;
+ }
+ }
+ /* terminate the options array with a zero-filled entry */
+ result->options[option_index].name = 0;
+ result->options[option_index].has_arg = 0;
+ result->options[option_index].flag = 0;
+ result->options[option_index].val = 0;
+ }
+
+ /*dump_longoptions(result);*/
+ return result;
+}
+
+static
+char * alloc_shortoptions(struct arg_hdr * *table)
+{
+ char *result;
+ size_t len = 2;
+ int tabindex;
+
+ /* determine the total number of option chars required */
+ for(tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ struct arg_hdr *hdr = table[tabindex];
+ len += 3 * (hdr->shortopts ? strlen(hdr->shortopts) : 0);
+ }
+
+ result = malloc(len);
+ if (result)
+ {
+ char *res = result;
+
+ /* add a leading ':' so getopt return codes distinguish */
+ /* unrecognised option and options missing argument values */
+ *res++ = ':';
+
+ for(tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ struct arg_hdr *hdr = table[tabindex];
+ const char *shortopts = hdr->shortopts;
+ while(shortopts && *shortopts)
+ {
+ *res++ = *shortopts++;
+ if (hdr->flag & ARG_HASVALUE)
+ *res++ = ':';
+ if (hdr->flag & ARG_HASOPTVALUE)
+ *res++ = ':';
+ }
+ }
+ /* null terminate the string */
+ *res = 0;
+ }
+
+ /*printf("alloc_shortoptions() returns \"%s\"\n",(result?result:"NULL"));*/
+ return result;
+}
+
+
+/* return index of the table terminator entry */
+static
+int arg_endindex(struct arg_hdr * *table)
+{
+ int tabindex = 0;
+ while (!(table[tabindex]->flag & ARG_TERMINATOR))
+ tabindex++;
+ return tabindex;
+}
+
+
+static
+void arg_parse_tagged(int argc,
+ char * *argv,
+ struct arg_hdr * *table,
+ struct arg_end *endtable)
+{
+ struct longoptions *longoptions;
+ char *shortoptions;
+ int copt;
+
+ /*printf("arg_parse_tagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/
+
+ /* allocate short and long option arrays for the given opttable[]. */
+ /* if the allocs fail then put an error msg in the last table entry. */
+ longoptions = alloc_longoptions(table);
+ shortoptions = alloc_shortoptions(table);
+ if (!longoptions || !shortoptions)
+ {
+ /* one or both memory allocs failed */
+ arg_register_error(endtable, endtable, ARG_EMALLOC, NULL);
+ /* free anything that was allocated (this is null safe) */
+ free(shortoptions);
+ free(longoptions);
+ return;
+ }
+
+ /*dump_longoptions(longoptions);*/
+
+ /* reset getopts internal option-index to zero, and disable error reporting */
+ optind = 0;
+ opterr = 0;
+
+ /* fetch and process args using getopt_long */
+ while( (copt =
+ getopt_long(argc, argv, shortoptions, longoptions->options,
+ NULL)) != -1)
+ {
+ /*
+ printf("optarg='%s'\n",optarg);
+ printf("optind=%d\n",optind);
+ printf("copt=%c\n",(char)copt);
+ printf("optopt=%c (%d)\n",optopt, (int)(optopt));
+ */
+ switch(copt)
+ {
+ case 0:
+ {
+ int tabindex = longoptions->getoptval;
+ void *parent = table[tabindex]->parent;
+ /*printf("long option detected from argtable[%d]\n", tabindex);*/
+ if (optarg && optarg[0] == 0 &&
+ (table[tabindex]->flag & ARG_HASVALUE))
+ {
+ /* printf(": long option %s requires an argument\n",argv[optind-1]); */
+ arg_register_error(endtable, endtable, ARG_EMISSARG,
+ argv[optind - 1]);
+ /* continue to scan the (empty) argument value to enforce argument count checking */
+ }
+ if (table[tabindex]->scanfn)
+ {
+ int errorcode = table[tabindex]->scanfn(parent, optarg);
+ if (errorcode != 0)
+ arg_register_error(endtable, parent, errorcode, optarg);
+ }
+ }
+ break;
+
+ case '?':
+ /*
+ * getopt_long() found an unrecognised short option.
+ * if it was a short option its value is in optopt
+ * if it was a long option then optopt=0
+ */
+ switch (optopt)
+ {
+ case 0:
+ /*printf("?0 unrecognised long option %s\n",argv[optind-1]);*/
+ arg_register_error(endtable, endtable, ARG_ELONGOPT,
+ argv[optind - 1]);
+ break;
+ default:
+ /*printf("?* unrecognised short option '%c'\n",optopt);*/
+ arg_register_error(endtable, endtable, optopt, NULL);
+ break;
+ }
+ break;
+
+ case ':':
+ /*
+ * getopt_long() found an option with its argument missing.
+ */
+ /*printf(": option %s requires an argument\n",argv[optind-1]); */
+ arg_register_error(endtable, endtable, ARG_EMISSARG,
+ argv[optind - 1]);
+ break;
+
+ default:
+ {
+ /* getopt_long() found a valid short option */
+ int tabindex = find_shortoption(table, (char)copt);
+ /*printf("short option detected from argtable[%d]\n", tabindex);*/
+ if (tabindex == -1)
+ {
+ /* should never get here - but handle it just in case */
+ /*printf("unrecognised short option %d\n",copt);*/
+ arg_register_error(endtable, endtable, copt, NULL);
+ }
+ else
+ {
+ if (table[tabindex]->scanfn)
+ {
+ void *parent = table[tabindex]->parent;
+ int errorcode = table[tabindex]->scanfn(parent, optarg);
+ if (errorcode != 0)
+ arg_register_error(endtable, parent, errorcode, optarg);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ free(shortoptions);
+ free(longoptions);
+}
+
+
+static
+void arg_parse_untagged(int argc,
+ char * *argv,
+ struct arg_hdr * *table,
+ struct arg_end *endtable)
+{
+ int tabindex = 0;
+ int errorlast = 0;
+ const char *optarglast = NULL;
+ void *parentlast = NULL;
+
+ /*printf("arg_parse_untagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/
+ while (!(table[tabindex]->flag & ARG_TERMINATOR))
+ {
+ void *parent;
+ int errorcode;
+
+ /* if we have exhausted our argv[optind] entries then we have finished */
+ if (optind >= argc)
+ {
+ /*printf("arg_parse_untagged(): argv[] exhausted\n");*/
+ return;
+ }
+
+ /* skip table entries with non-null long or short options (they are not untagged entries) */
+ if (table[tabindex]->longopts || table[tabindex]->shortopts)
+ {
+ /*printf("arg_parse_untagged(): skipping argtable[%d] (tagged argument)\n",tabindex);*/
+ tabindex++;
+ continue;
+ }
+
+ /* skip table entries with NULL scanfn */
+ if (!(table[tabindex]->scanfn))
+ {
+ /*printf("arg_parse_untagged(): skipping argtable[%d] (NULL scanfn)\n",tabindex);*/
+ tabindex++;
+ continue;
+ }
+
+ /* attempt to scan the current argv[optind] with the current */
+ /* table[tabindex] entry. If it succeeds then keep it, otherwise */
+ /* try again with the next table[] entry. */
+ parent = table[tabindex]->parent;
+ errorcode = table[tabindex]->scanfn(parent, argv[optind]);
+ if (errorcode == 0)
+ {
+ /* success, move onto next argv[optind] but stay with same table[tabindex] */
+ /*printf("arg_parse_untagged(): argtable[%d] successfully matched\n",tabindex);*/
+ optind++;
+
+ /* clear the last tentative error */
+ errorlast = 0;
+ }
+ else
+ {
+ /* failure, try same argv[optind] with next table[tabindex] entry */
+ /*printf("arg_parse_untagged(): argtable[%d] failed match\n",tabindex);*/
+ tabindex++;
+
+ /* remember this as a tentative error we may wish to reinstate later */
+ errorlast = errorcode;
+ optarglast = argv[optind];
+ parentlast = parent;
+ }
+
+ }
+
+ /* if a tenative error still remains at this point then register it as a proper error */
+ if (errorlast)
+ {
+ arg_register_error(endtable, parentlast, errorlast, optarglast);
+ optind++;
+ }
+
+ /* only get here when not all argv[] entries were consumed */
+ /* register an error for each unused argv[] entry */
+ while (optind < argc)
+ {
+ /*printf("arg_parse_untagged(): argv[%d]=\"%s\" not consumed\n",optind,argv[optind]);*/
+ arg_register_error(endtable, endtable, ARG_ENOMATCH, argv[optind++]);
+ }
+
+ return;
+}
+
+
+static
+void arg_parse_check(struct arg_hdr * *table, struct arg_end *endtable)
+{
+ int tabindex = 0;
+ /* printf("arg_parse_check()\n"); */
+ do
+ {
+ if (table[tabindex]->checkfn)
+ {
+ void *parent = table[tabindex]->parent;
+ int errorcode = table[tabindex]->checkfn(parent);
+ if (errorcode != 0)
+ arg_register_error(endtable, parent, errorcode, NULL);
+ }
+ } while(!(table[tabindex++]->flag & ARG_TERMINATOR));
+}
+
+
+static
+void arg_reset(void * *argtable)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int tabindex = 0;
+ /*printf("arg_reset(%p)\n",argtable);*/
+ do
+ {
+ if (table[tabindex]->resetfn)
+ table[tabindex]->resetfn(table[tabindex]->parent);
+ } while(!(table[tabindex++]->flag & ARG_TERMINATOR));
+}
+
+
+int arg_parse(int argc, char * *argv, void * *argtable)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ struct arg_end *endtable;
+ int endindex;
+ char * *argvcopy = NULL;
+
+ /*printf("arg_parse(%d,%p,%p)\n",argc,argv,argtable);*/
+
+ /* reset any argtable data from previous invocations */
+ arg_reset(argtable);
+
+ /* locate the first end-of-table marker within the array */
+ endindex = arg_endindex(table);
+ endtable = (struct arg_end *)table[endindex];
+
+ /* Special case of argc==0. This can occur on Texas Instruments DSP. */
+ /* Failure to trap this case results in an unwanted NULL result from */
+ /* the malloc for argvcopy (next code block). */
+ if (argc == 0)
+ {
+ /* We must still perform post-parse checks despite the absence of command line arguments */
+ arg_parse_check(table, endtable);
+
+ /* Now we are finished */
+ return endtable->count;
+ }
+
+ argvcopy = (char **)malloc(sizeof(char *) * (argc + 1));
+ if (argvcopy)
+ {
+ int i;
+
+ /*
+ Fill in the local copy of argv[]. We need a local copy
+ because getopt rearranges argv[] which adversely affects
+ susbsequent parsing attempts.
+ */
+ for (i = 0; i < argc; i++)
+ argvcopy[i] = argv[i];
+
+ argvcopy[argc] = NULL;
+
+ /* parse the command line (local copy) for tagged options */
+ arg_parse_tagged(argc, argvcopy, table, endtable);
+
+ /* parse the command line (local copy) for untagged options */
+ arg_parse_untagged(argc, argvcopy, table, endtable);
+
+ /* if no errors so far then perform post-parse checks otherwise dont bother */
+ if (endtable->count == 0)
+ arg_parse_check(table, endtable);
+
+ /* release the local copt of argv[] */
+ free(argvcopy);
+ }
+ else
+ {
+ /* memory alloc failed */
+ arg_register_error(endtable, endtable, ARG_EMALLOC, NULL);
+ }
+
+ return endtable->count;
+}
+
+
+/*
+ * Concatenate contents of src[] string onto *pdest[] string.
+ * The *pdest pointer is altered to point to the end of the
+ * target string and *pndest is decremented by the same number
+ * of chars.
+ * Does not append more than *pndest chars into *pdest[]
+ * so as to prevent buffer overruns.
+ * Its something like strncat() but more efficient for repeated
+ * calls on the same destination string.
+ * Example of use:
+ * char dest[30] = "good"
+ * size_t ndest = sizeof(dest);
+ * char *pdest = dest;
+ * arg_char(&pdest,"bye ",&ndest);
+ * arg_char(&pdest,"cruel ",&ndest);
+ * arg_char(&pdest,"world!",&ndest);
+ * Results in:
+ * dest[] == "goodbye cruel world!"
+ * ndest == 10
+ */
+static
+void arg_cat(char * *pdest, const char *src, size_t *pndest)
+{
+ char *dest = *pdest;
+ char *end = dest + *pndest;
+
+ /*locate null terminator of dest string */
+ while(dest < end && *dest != 0)
+ dest++;
+
+ /* concat src string to dest string */
+ while(dest < end && *src != 0)
+ *dest++ = *src++;
+
+ /* null terminate dest string */
+ *dest = 0;
+
+ /* update *pdest and *pndest */
+ *pndest = end - dest;
+ *pdest = dest;
+}
+
+
+static
+void arg_cat_option(char *dest,
+ size_t ndest,
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ int optvalue)
+{
+ if (shortopts)
+ {
+ char option[3];
+
+ /* note: option array[] is initialiazed dynamically here to satisfy */
+ /* a deficiency in the watcom compiler wrt static array initializers. */
+ option[0] = '-';
+ option[1] = shortopts[0];
+ option[2] = 0;
+
+ arg_cat(&dest, option, &ndest);
+ if (datatype)
+ {
+ arg_cat(&dest, " ", &ndest);
+ if (optvalue)
+ {
+ arg_cat(&dest, "[", &ndest);
+ arg_cat(&dest, datatype, &ndest);
+ arg_cat(&dest, "]", &ndest);
+ }
+ else
+ arg_cat(&dest, datatype, &ndest);
+ }
+ }
+ else if (longopts)
+ {
+ size_t ncspn;
+
+ /* add "--" tag prefix */
+ arg_cat(&dest, "--", &ndest);
+
+ /* add comma separated option tag */
+ ncspn = strcspn(longopts, ",");
+#ifdef __STDC_WANT_SECURE_LIB__
+ strncat_s(dest, ndest, longopts, (ncspn < ndest) ? ncspn : ndest);
+#else
+ strncat(dest, longopts, (ncspn < ndest) ? ncspn : ndest);
+#endif
+
+ if (datatype)
+ {
+ arg_cat(&dest, "=", &ndest);
+ if (optvalue)
+ {
+ arg_cat(&dest, "[", &ndest);
+ arg_cat(&dest, datatype, &ndest);
+ arg_cat(&dest, "]", &ndest);
+ }
+ else
+ arg_cat(&dest, datatype, &ndest);
+ }
+ }
+ else if (datatype)
+ {
+ if (optvalue)
+ {
+ arg_cat(&dest, "[", &ndest);
+ arg_cat(&dest, datatype, &ndest);
+ arg_cat(&dest, "]", &ndest);
+ }
+ else
+ arg_cat(&dest, datatype, &ndest);
+ }
+}
+
+static
+void arg_cat_optionv(char *dest,
+ size_t ndest,
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ int optvalue,
+ const char *separator)
+{
+ separator = separator ? separator : "";
+
+ if (shortopts)
+ {
+ const char *c = shortopts;
+ while(*c)
+ {
+ /* "-a|-b|-c" */
+ char shortopt[3];
+
+ /* note: shortopt array[] is initialiazed dynamically here to satisfy */
+ /* a deficiency in the watcom compiler wrt static array initializers. */
+ shortopt[0] = '-';
+ shortopt[1] = *c;
+ shortopt[2] = 0;
+
+ arg_cat(&dest, shortopt, &ndest);
+ if (*++c)
+ arg_cat(&dest, separator, &ndest);
+ }
+ }
+
+ /* put separator between long opts and short opts */
+ if (shortopts && longopts)
+ arg_cat(&dest, separator, &ndest);
+
+ if (longopts)
+ {
+ const char *c = longopts;
+ while(*c)
+ {
+ size_t ncspn;
+
+ /* add "--" tag prefix */
+ arg_cat(&dest, "--", &ndest);
+
+ /* add comma separated option tag */
+ ncspn = strcspn(c, ",");
+#ifdef __STDC_WANT_SECURE_LIB__
+ strncat_s(dest, ndest, c, (ncspn < ndest) ? ncspn : ndest);
+#else
+ strncat(dest, c, (ncspn < ndest) ? ncspn : ndest);
+#endif
+ c += ncspn;
+
+ /* add given separator in place of comma */
+ if (*c == ',')
+ {
+ arg_cat(&dest, separator, &ndest);
+ c++;
+ }
+ }
+ }
+
+ if (datatype)
+ {
+ if (longopts)
+ arg_cat(&dest, "=", &ndest);
+ else if (shortopts)
+ arg_cat(&dest, " ", &ndest);
+
+ if (optvalue)
+ {
+ arg_cat(&dest, "[", &ndest);
+ arg_cat(&dest, datatype, &ndest);
+ arg_cat(&dest, "]", &ndest);
+ }
+ else
+ arg_cat(&dest, datatype, &ndest);
+ }
+}
+
+
+/* this function should be deprecated because it doesnt consider optional argument values (ARG_HASOPTVALUE) */
+void arg_print_option(FILE *fp,
+ const char *shortopts,
+ const char *longopts,
+ const char *datatype,
+ const char *suffix)
+{
+ char syntax[200] = "";
+ suffix = suffix ? suffix : "";
+
+ /* there is no way of passing the proper optvalue for optional argument values here, so we must ignore it */
+ arg_cat_optionv(syntax,
+ sizeof(syntax),
+ shortopts,
+ longopts,
+ datatype,
+ 0,
+ "|");
+
+ fputs(syntax, fp);
+ fputs(suffix, fp);
+}
+
+
+/*
+ * Print a GNU style [OPTION] string in which all short options that
+ * do not take argument values are presented in abbreviated form, as
+ * in: -xvfsd, or -xvf[sd], or [-xvsfd]
+ */
+static
+void arg_print_gnuswitch(FILE *fp, struct arg_hdr * *table)
+{
+ int tabindex;
+ char *format1 = " -%c";
+ char *format2 = " [-%c";
+ char *suffix = "";
+
+ /* print all mandatory switches that are without argument values */
+ for(tabindex = 0;
+ table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR);
+ tabindex++)
+ {
+ /* skip optional options */
+ if (table[tabindex]->mincount < 1)
+ continue;
+
+ /* skip non-short options */
+ if (table[tabindex]->shortopts == NULL)
+ continue;
+
+ /* skip options that take argument values */
+ if (table[tabindex]->flag & ARG_HASVALUE)
+ continue;
+
+ /* print the short option (only the first short option char, ignore multiple choices)*/
+ fprintf(fp, format1, table[tabindex]->shortopts[0]);
+ format1 = "%c";
+ format2 = "[%c";
+ }
+
+ /* print all optional switches that are without argument values */
+ for(tabindex = 0;
+ table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR);
+ tabindex++)
+ {
+ /* skip mandatory args */
+ if (table[tabindex]->mincount > 0)
+ continue;
+
+ /* skip args without short options */
+ if (table[tabindex]->shortopts == NULL)
+ continue;
+
+ /* skip args with values */
+ if (table[tabindex]->flag & ARG_HASVALUE)
+ continue;
+
+ /* print first short option */
+ fprintf(fp, format2, table[tabindex]->shortopts[0]);
+ format2 = "%c";
+ suffix = "]";
+ }
+
+ fprintf(fp, "%s", suffix);
+}
+
+
+void arg_print_syntax(FILE *fp, void * *argtable, const char *suffix)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int i, tabindex;
+
+ /* print GNU style [OPTION] string */
+ arg_print_gnuswitch(fp, table);
+
+ /* print remaining options in abbreviated style */
+ for(tabindex = 0;
+ table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR);
+ tabindex++)
+ {
+ char syntax[200] = "";
+ const char *shortopts, *longopts, *datatype;
+
+ /* skip short options without arg values (they were printed by arg_print_gnu_switch) */
+ if (table[tabindex]->shortopts &&
+ !(table[tabindex]->flag & ARG_HASVALUE))
+ continue;
+
+ shortopts = table[tabindex]->shortopts;
+ longopts = table[tabindex]->longopts;
+ datatype = table[tabindex]->datatype;
+ arg_cat_option(syntax,
+ sizeof(syntax),
+ shortopts,
+ longopts,
+ datatype,
+ table[tabindex]->flag & ARG_HASOPTVALUE);
+
+ if (strlen(syntax) > 0)
+ {
+ /* print mandatory instances of this option */
+ for (i = 0; i < table[tabindex]->mincount; i++)
+ fprintf(fp, " %s", syntax);
+
+ /* print optional instances enclosed in "[..]" */
+ switch ( table[tabindex]->maxcount - table[tabindex]->mincount )
+ {
+ case 0:
+ break;
+ case 1:
+ fprintf(fp, " [%s]", syntax);
+ break;
+ case 2:
+ fprintf(fp, " [%s] [%s]", syntax, syntax);
+ break;
+ default:
+ fprintf(fp, " [%s]...", syntax);
+ break;
+ }
+ }
+ }
+
+ if (suffix)
+ fprintf(fp, "%s", suffix);
+}
+
+
+void arg_print_syntaxv(FILE *fp, void * *argtable, const char *suffix)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int i, tabindex;
+
+ /* print remaining options in abbreviated style */
+ for(tabindex = 0;
+ table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR);
+ tabindex++)
+ {
+ char syntax[200] = "";
+ const char *shortopts, *longopts, *datatype;
+
+ shortopts = table[tabindex]->shortopts;
+ longopts = table[tabindex]->longopts;
+ datatype = table[tabindex]->datatype;
+ arg_cat_optionv(syntax,
+ sizeof(syntax),
+ shortopts,
+ longopts,
+ datatype,
+ table[tabindex]->flag & ARG_HASOPTVALUE,
+ "|");
+
+ /* print mandatory options */
+ for (i = 0; i < table[tabindex]->mincount; i++)
+ fprintf(fp, " %s", syntax);
+
+ /* print optional args enclosed in "[..]" */
+ switch ( table[tabindex]->maxcount - table[tabindex]->mincount )
+ {
+ case 0:
+ break;
+ case 1:
+ fprintf(fp, " [%s]", syntax);
+ break;
+ case 2:
+ fprintf(fp, " [%s] [%s]", syntax, syntax);
+ break;
+ default:
+ fprintf(fp, " [%s]...", syntax);
+ break;
+ }
+ }
+
+ if (suffix)
+ fprintf(fp, "%s", suffix);
+}
+
+
+void arg_print_glossary(FILE *fp, void * *argtable, const char *format)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int tabindex;
+
+ format = format ? format : " %-20s %s\n";
+ for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ if (table[tabindex]->glossary)
+ {
+ char syntax[200] = "";
+ const char *shortopts = table[tabindex]->shortopts;
+ const char *longopts = table[tabindex]->longopts;
+ const char *datatype = table[tabindex]->datatype;
+ const char *glossary = table[tabindex]->glossary;
+ arg_cat_optionv(syntax,
+ sizeof(syntax),
+ shortopts,
+ longopts,
+ datatype,
+ table[tabindex]->flag & ARG_HASOPTVALUE,
+ ", ");
+ fprintf(fp, format, syntax, glossary);
+ }
+ }
+}
+
+
+/**
+ * Print a piece of text formatted, which means in a column with a
+ * left and a right margin. The lines are wrapped at whitspaces next
+ * to right margin. The function does not indent the first line, but
+ * only the following ones.
+ *
+ * Example:
+ * arg_print_formatted( fp, 0, 5, "Some text that doesn't fit." )
+ * will result in the following output:
+ *
+ * Some
+ * text
+ * that
+ * doesn'
+ * t fit.
+ *
+ * Too long lines will be wrapped in the middle of a word.
+ *
+ * arg_print_formatted( fp, 2, 7, "Some text that doesn't fit." )
+ * will result in the following output:
+ *
+ * Some
+ * text
+ * that
+ * doesn'
+ * t fit.
+ *
+ * As you see, the first line is not indented. This enables output of
+ * lines, which start in a line where output already happened.
+ *
+ * Author: Uli Fouquet
+ */
+static
+void arg_print_formatted( FILE *fp,
+ const unsigned lmargin,
+ const unsigned rmargin,
+ const char *text )
+{
+ const unsigned textlen = (unsigned)strlen( text );
+ unsigned line_start = 0;
+ unsigned line_end = textlen + 1;
+ const unsigned colwidth = (rmargin - lmargin) + 1;
+
+ /* Someone doesn't like us... */
+ if ( line_end < line_start )
+ { fprintf( fp, "%s\n", text ); }
+
+ while (line_end - 1 > line_start )
+ {
+ /* Eat leading whitespaces. This is essential because while
+ wrapping lines, there will often be a whitespace at beginning
+ of line */
+ while ( ISSPACE(*(text + line_start)) )
+ { line_start++; }
+
+ if ((line_end - line_start) > colwidth )
+ { line_end = line_start + colwidth; }
+
+ /* Find last whitespace, that fits into line */
+ while ( ( line_end > line_start )
+ && ( line_end - line_start > colwidth )
+ && !ISSPACE(*(text + line_end)))
+ { line_end--; }
+
+ /* Do not print trailing whitespace. If this text
+ has got only one line, line_end now points to the
+ last char due to initialization. */
+ line_end--;
+
+ /* Output line of text */
+ while ( line_start < line_end )
+ {
+ fputc(*(text + line_start), fp );
+ line_start++;
+ }
+ fputc( '\n', fp );
+
+ /* Initialize another line */
+ if ( line_end + 1 < textlen )
+ {
+ unsigned i;
+
+ for (i = 0; i < lmargin; i++ )
+ { fputc( ' ', fp ); }
+
+ line_end = textlen;
+ }
+
+ /* If we have to print another line, get also the last char. */
+ line_end++;
+
+ } /* lines of text */
+}
+
+/**
+ * Prints the glossary in strict GNU format.
+ * Differences to arg_print_glossary() are:
+ * - wraps lines after 80 chars
+ * - indents lines without shortops
+ * - does not accept formatstrings
+ *
+ * Contributed by Uli Fouquet
+ */
+void arg_print_glossary_gnu(FILE *fp, void * *argtable )
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int tabindex;
+
+ for(tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++)
+ {
+ if (table[tabindex]->glossary)
+ {
+ char syntax[200] = "";
+ const char *shortopts = table[tabindex]->shortopts;
+ const char *longopts = table[tabindex]->longopts;
+ const char *datatype = table[tabindex]->datatype;
+ const char *glossary = table[tabindex]->glossary;
+
+ if ( !shortopts && longopts )
+ {
+ /* Indent trailing line by 4 spaces... */
+ memset( syntax, ' ', 4 );
+ *(syntax + 4) = '\0';
+ }
+
+ arg_cat_optionv(syntax,
+ sizeof(syntax),
+ shortopts,
+ longopts,
+ datatype,
+ table[tabindex]->flag & ARG_HASOPTVALUE,
+ ", ");
+
+ /* If syntax fits not into column, print glossary in new line... */
+ if ( strlen(syntax) > 25 )
+ {
+ fprintf( fp, " %-25s %s\n", syntax, "" );
+ *syntax = '\0';
+ }
+
+ fprintf( fp, " %-25s ", syntax );
+ arg_print_formatted( fp, 28, 79, glossary );
+ }
+ } /* for each table entry */
+
+ fputc( '\n', fp );
+}
+
+
+/**
+ * Checks the argtable[] array for NULL entries and returns 1
+ * if any are found, zero otherwise.
+ */
+int arg_nullcheck(void * *argtable)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int tabindex;
+ /*printf("arg_nullcheck(%p)\n",argtable);*/
+
+ if (!table)
+ return 1;
+
+ tabindex = 0;
+ do
+ {
+ /*printf("argtable[%d]=%p\n",tabindex,argtable[tabindex]);*/
+ if (!table[tabindex])
+ return 1;
+ } while(!(table[tabindex++]->flag & ARG_TERMINATOR));
+
+ return 0;
+}
+
+
+/*
+ * arg_free() is deprecated in favour of arg_freetable() due to a flaw in its design.
+ * The flaw results in memory leak in the (very rare) case that an intermediate
+ * entry in the argtable array failed its memory allocation while others following
+ * that entry were still allocated ok. Those subsequent allocations will not be
+ * deallocated by arg_free().
+ * Despite the unlikeliness of the problem occurring, and the even unlikelier event
+ * that it has any deliterious effect, it is fixed regardless by replacing arg_free()
+ * with the newer arg_freetable() function.
+ * We still keep arg_free() for backwards compatibility.
+ */
+void arg_free(void * *argtable)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ int tabindex = 0;
+ int flag;
+ /*printf("arg_free(%p)\n",argtable);*/
+ do
+ {
+ /*
+ if we encounter a NULL entry then somewhat incorrectly we presume
+ we have come to the end of the array. It isnt strictly true because
+ an intermediate entry could be NULL with other non-NULL entries to follow.
+ The subsequent argtable entries would then not be freed as they should.
+ */
+ if (table[tabindex] == NULL)
+ break;
+
+ flag = table[tabindex]->flag;
+ free(table[tabindex]);
+ table[tabindex++] = NULL;
+
+ } while(!(flag & ARG_TERMINATOR));
+}
+
+/* frees each non-NULL element of argtable[], where n is the size of the number of entries in the array */
+void arg_freetable(void * *argtable, size_t n)
+{
+ struct arg_hdr * *table = (struct arg_hdr * *)argtable;
+ size_t tabindex = 0;
+ /*printf("arg_freetable(%p)\n",argtable);*/
+ for (tabindex = 0; tabindex < n; tabindex++)
+ {
+ if (table[tabindex] == NULL)
+ continue;
+
+ free(table[tabindex]);
+ table[tabindex] = NULL;
+ };
+}
+
diff --git a/ext/argtable3/argtable3.h b/ext/argtable3/argtable3.h
new file mode 100644
index 0000000..1107de2
--- /dev/null
+++ b/ext/argtable3/argtable3.h
@@ -0,0 +1,305 @@
+/*******************************************************************************
+ * This file is part of the argtable3 library.
+ *
+ * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann
+ * <sheitmann@users.sourceforge.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of STEWART HEITMANN nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#ifndef ARGTABLE3
+#define ARGTABLE3
+
+#include <stdio.h> /* FILE */
+#include <time.h> /* struct tm */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ARG_REX_ICASE 1
+
+/* bit masks for arg_hdr.flag */
+enum
+{
+ ARG_TERMINATOR=0x1,
+ ARG_HASVALUE=0x2,
+ ARG_HASOPTVALUE=0x4
+};
+
+typedef void (arg_resetfn)(void *parent);
+typedef int (arg_scanfn)(void *parent, const char *argval);
+typedef int (arg_checkfn)(void *parent);
+typedef void (arg_errorfn)(void *parent, FILE *fp, int error, const char *argval, const char *progname);
+
+
+/*
+* The arg_hdr struct defines properties that are common to all arg_xxx structs.
+* The argtable library requires each arg_xxx struct to have an arg_hdr
+* struct as its first data member.
+* The argtable library functions then use this data to identify the
+* properties of the command line option, such as its option tags,
+* datatype string, and glossary strings, and so on.
+* Moreover, the arg_hdr struct contains pointers to custom functions that
+* are provided by each arg_xxx struct which perform the tasks of parsing
+* that particular arg_xxx arguments, performing post-parse checks, and
+* reporting errors.
+* These functions are private to the individual arg_xxx source code
+* and are the pointer to them are initiliased by that arg_xxx struct's
+* constructor function. The user could alter them after construction
+* if desired, but the original intention is for them to be set by the
+* constructor and left unaltered.
+*/
+struct arg_hdr
+{
+ char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */
+ const char *shortopts; /* String defining the short options */
+ const char *longopts; /* String defiing the long options */
+ const char *datatype; /* Description of the argument data type */
+ const char *glossary; /* Description of the option as shown by arg_print_glossary function */
+ int mincount; /* Minimum number of occurences of this option accepted */
+ int maxcount; /* Maximum number of occurences if this option accepted */
+ void *parent; /* Pointer to parent arg_xxx struct */
+ arg_resetfn *resetfn; /* Pointer to parent arg_xxx reset function */
+ arg_scanfn *scanfn; /* Pointer to parent arg_xxx scan function */
+ arg_checkfn *checkfn; /* Pointer to parent arg_xxx check function */
+ arg_errorfn *errorfn; /* Pointer to parent arg_xxx error function */
+ void *priv; /* Pointer to private header data for use by arg_xxx functions */
+};
+
+struct arg_rem
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+};
+
+struct arg_lit
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args */
+};
+
+struct arg_int
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args */
+ int *ival; /* Array of parsed argument values */
+};
+
+struct arg_dbl
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args */
+ double *dval; /* Array of parsed argument values */
+};
+
+struct arg_str
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args */
+ const char **sval; /* Array of parsed argument values */
+};
+
+struct arg_rex
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args */
+ const char **sval; /* Array of parsed argument values */
+};
+
+struct arg_file
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of matching command line args*/
+ const char **filename; /* Array of parsed filenames (eg: /home/foo.bar) */
+ const char **basename; /* Array of parsed basenames (eg: foo.bar) */
+ const char **extension; /* Array of parsed extensions (eg: .bar) */
+};
+
+struct arg_date
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ const char *format; /* strptime format string used to parse the date */
+ int count; /* Number of matching command line args */
+ struct tm *tmval; /* Array of parsed time values */
+};
+
+enum {ARG_ELIMIT=1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG};
+struct arg_end
+{
+ struct arg_hdr hdr; /* The mandatory argtable header struct */
+ int count; /* Number of errors encountered */
+ int *error; /* Array of error codes */
+ void **parent; /* Array of pointers to offending arg_xxx struct */
+ const char **argval; /* Array of pointers to offending argv[] string */
+};
+
+
+/**** arg_xxx constructor functions *********************************/
+
+struct arg_rem* arg_rem(const char* datatype, const char* glossary);
+
+struct arg_lit* arg_lit0(const char* shortopts,
+ const char* longopts,
+ const char* glossary);
+struct arg_lit* arg_lit1(const char* shortopts,
+ const char* longopts,
+ const char *glossary);
+struct arg_lit* arg_litn(const char* shortopts,
+ const char* longopts,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_key* arg_key0(const char* keyword,
+ int flags,
+ const char* glossary);
+struct arg_key* arg_key1(const char* keyword,
+ int flags,
+ const char* glossary);
+struct arg_key* arg_keyn(const char* keyword,
+ int flags,
+ int mincount,
+ int maxcount,
+ const char* glossary);
+
+struct arg_int* arg_int0(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char* glossary);
+struct arg_int* arg_int1(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char *glossary);
+struct arg_int* arg_intn(const char* shortopts,
+ const char* longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_dbl* arg_dbl0(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char* glossary);
+struct arg_dbl* arg_dbl1(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char *glossary);
+struct arg_dbl* arg_dbln(const char* shortopts,
+ const char* longopts,
+ const char *datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_str* arg_str0(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char* glossary);
+struct arg_str* arg_str1(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char *glossary);
+struct arg_str* arg_strn(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_rex* arg_rex0(const char* shortopts,
+ const char* longopts,
+ const char* pattern,
+ const char* datatype,
+ int flags,
+ const char* glossary);
+struct arg_rex* arg_rex1(const char* shortopts,
+ const char* longopts,
+ const char* pattern,
+ const char* datatype,
+ int flags,
+ const char *glossary);
+struct arg_rex* arg_rexn(const char* shortopts,
+ const char* longopts,
+ const char* pattern,
+ const char* datatype,
+ int mincount,
+ int maxcount,
+ int flags,
+ const char *glossary);
+
+struct arg_file* arg_file0(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char* glossary);
+struct arg_file* arg_file1(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ const char *glossary);
+struct arg_file* arg_filen(const char* shortopts,
+ const char* longopts,
+ const char* datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_date* arg_date0(const char* shortopts,
+ const char* longopts,
+ const char* format,
+ const char* datatype,
+ const char* glossary);
+struct arg_date* arg_date1(const char* shortopts,
+ const char* longopts,
+ const char* format,
+ const char* datatype,
+ const char *glossary);
+struct arg_date* arg_daten(const char* shortopts,
+ const char* longopts,
+ const char* format,
+ const char* datatype,
+ int mincount,
+ int maxcount,
+ const char *glossary);
+
+struct arg_end* arg_end(int maxerrors);
+
+
+/**** other functions *******************************************/
+int arg_nullcheck(void **argtable);
+int arg_parse(int argc, char **argv, void **argtable);
+void arg_print_option(FILE *fp, const char *shortopts, const char *longopts, const char *datatype, const char *suffix);
+void arg_print_syntax(FILE *fp, void **argtable, const char *suffix);
+void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix);
+void arg_print_glossary(FILE *fp, void **argtable, const char *format);
+void arg_print_glossary_gnu(FILE *fp, void **argtable);
+void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname);
+void arg_freetable(void **argtable, size_t n);
+
+/**** deprecated functions, for back-compatibility only ********/
+void arg_free(void **argtable);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/ext/argtable3/argtable3.parts b/ext/argtable3/argtable3.parts
new file mode 100644
index 0000000..f6a3528
--- /dev/null
+++ b/ext/argtable3/argtable3.parts
@@ -0,0 +1,45 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+
+env.PartVersion("3.0.3")
+env.PartName("argtable3")
+
+# sourcefiles
+src_files = Pattern(src_dir='.',
+ includes=['argtable3.c']).files()
+
+#includes to install
+install_headers = Pattern(src_dir='.',
+ includes=['argtable3.h']).files()
+
+parts_file = ['argtable3.parts']
+license_file = ['LICENSE']
+makefile = ['Makefile']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='ext/argtable3')
+ env.InstallTopLevel(install_headers, sub_dir='ext/argtable3')
+ env.InstallTopLevel(parts_file, sub_dir='ext/argtable3')
+ env.InstallTopLevel(license_file, sub_dir='ext/argtable3')
+ env.InstallTopLevel(makefile, sub_dir='ext/argtable3')
+else:
+ env.Append(CPPPATH='.')
+
+ outputs = env.Library('${PART_NAME}', src_files)
+ sdk_outs = env.Sdk(outputs)
+
+ env.SdkInclude(install_headers)
diff --git a/ext/gtest/LICENSE b/ext/gtest/LICENSE
new file mode 100644
index 0000000..1941a11
--- /dev/null
+++ b/ext/gtest/LICENSE
@@ -0,0 +1,28 @@
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ext/gtest/Makefile b/ext/gtest/Makefile
new file mode 100644
index 0000000..0d4a4ca
--- /dev/null
+++ b/ext/gtest/Makefile
@@ -0,0 +1,23 @@
+#!/usr/bin/make -f
+
+GTEST_INCLUDE_DIR = ..
+GTEST_SRC = $(wildcard ./*.cc)
+GTEST_OBJ = $(GTEST_SRC:.cc=.o)
+
+GTEST_LIB = libgtest.a
+
+$(GTEST_OBJ): %.o: %.cc
+ $(CXX) -o $@ -c $(CXXFLAGS) $(GTEST_DEFINES) -I$(GTEST_INCLUDE_DIR) $<
+
+$(GTEST_LIB): $(GTEST_OBJ)
+ $(AR) rc $@ $^
+ $(RANLIB) $@
+
+build: all
+
+all: $(GTEST_LIB)
+
+install:
+
+clean:
+ rm -f $(GTEST_OBJ) $(GTEST_LIB)
diff --git a/ext/gtest/gtest-all.cc b/ext/gtest/gtest-all.cc
new file mode 100644
index 0000000..983bd02
--- /dev/null
+++ b/ext/gtest/gtest-all.cc
@@ -0,0 +1,10407 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule@google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ // The two possible mocking modes of this object.
+ enum InterceptMode {
+ INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
+ INTERCEPT_ALL_THREADS // Intercepts all failures.
+ };
+
+ // The c'tor sets this object as the test part result reporter used
+ // by Google Test. The 'result' parameter specifies where to report the
+ // results. This reporter will only catch failures generated in the current
+ // thread. DEPRECATED
+ explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+ // Same as above, but you can choose the interception scope of this object.
+ ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+ TestPartResultArray* result);
+
+ // The d'tor restores the previous test part result reporter.
+ virtual ~ScopedFakeTestPartResultReporter();
+
+ // Appends the TestPartResult object to the TestPartResultArray
+ // received in the constructor.
+ //
+ // This method is from the TestPartResultReporterInterface
+ // interface.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+ void Init();
+
+ const InterceptMode intercept_mode_;
+ TestPartResultReporterInterface* old_reporter_;
+ TestPartResultArray* const result_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring. If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+ // The constructor remembers the arguments.
+ SingleFailureChecker(const TestPartResultArray* results,
+ TestPartResult::Type type,
+ const string& substr);
+ ~SingleFailureChecker();
+ private:
+ const TestPartResultArray* const results_;
+ const TestPartResult::Type type_;
+ const string substr_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+} // namespace internal
+
+} // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures. It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+// - 'statement' cannot reference local non-static variables or
+// non-static members of the current object.
+// - 'statement' cannot return a value.
+// - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+ do { \
+ class GTestExpectFatalFailureHelper {\
+ public:\
+ static void Execute() { statement; }\
+ };\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+ GTestExpectFatalFailureHelper::Execute();\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+ do { \
+ class GTestExpectFatalFailureHelper {\
+ public:\
+ static void Execute() { statement; }\
+ };\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ALL_THREADS, &gtest_failures);\
+ GTestExpectFatalFailureHelper::Execute();\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures. It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+// - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works. If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma. The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+// if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+ do {\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+ (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+ if (::testing::internal::AlwaysTrue()) { statement; }\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+ do {\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+ (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+ &gtest_failures);\
+ if (::testing::internal::AlwaysTrue()) { statement; }\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <list>
+#include <map>
+#include <ostream> // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton@google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h> // NOLINT
+# include <limits.h> // NOLINT
+# include <sched.h> // NOLINT
+// Declares vsnprintf(). This header is not available on Windows.
+# include <strings.h> // NOLINT
+# include <sys/mman.h> // NOLINT
+# include <sys/time.h> // NOLINT
+# include <unistd.h> // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h> // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
+
+# include <windows.h> // NOLINT
+# undef min
+
+#elif GTEST_OS_WINDOWS // We are on Windows proper.
+
+# include <io.h> // NOLINT
+# include <sys/timeb.h> // NOLINT
+# include <sys/types.h> // NOLINT
+# include <sys/stat.h> // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton@google.com): Use autoconf to detect availability of
+// gettimeofday().
+// TODO(kenton@google.com): There are other ways to get the time on
+// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
+// supports these. consider using them instead.
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+# endif // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h> // NOLINT
+# undef min
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton@google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h> // NOLINT
+# include <unistd.h> // NOLINT
+
+#endif // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h> // NOLINT
+# include <netdb.h> // NOLINT
+# include <sys/socket.h> // NOLINT
+# include <sys/types.h> // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation. Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// If this file is included from the user's code, just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h> // For strtoll/_strtoul64/malloc/free.
+#include <string.h> // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h> // NOLINT
+# include <netdb.h> // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h> // NOLINT
+#endif // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library. This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+const char kFlagfileFlag[] = "flagfile";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information. N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe. Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+ const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+ const unsigned int raw_seed = (random_seed_flag == 0) ?
+ static_cast<unsigned int>(GetTimeInMillis()) :
+ static_cast<unsigned int>(random_seed_flag);
+
+ // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+ // it's easy to type.
+ const int normalized_seed =
+ static_cast<int>((raw_seed - 1U) %
+ static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+ return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'. The behavior is
+// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+ GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+ << "Invalid random seed " << seed << " - must be in [1, "
+ << kMaxRandomSeed << "].";
+ const int next_seed = seed + 1;
+ return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+ // The c'tor.
+ GTestFlagSaver() {
+ also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+ break_on_failure_ = GTEST_FLAG(break_on_failure);
+ catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+ color_ = GTEST_FLAG(color);
+ death_test_style_ = GTEST_FLAG(death_test_style);
+ death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+ filter_ = GTEST_FLAG(filter);
+ internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+ list_tests_ = GTEST_FLAG(list_tests);
+ output_ = GTEST_FLAG(output);
+ print_time_ = GTEST_FLAG(print_time);
+ random_seed_ = GTEST_FLAG(random_seed);
+ repeat_ = GTEST_FLAG(repeat);
+ shuffle_ = GTEST_FLAG(shuffle);
+ stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+ stream_result_to_ = GTEST_FLAG(stream_result_to);
+ throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+ }
+
+ // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
+ ~GTestFlagSaver() {
+ GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+ GTEST_FLAG(break_on_failure) = break_on_failure_;
+ GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+ GTEST_FLAG(color) = color_;
+ GTEST_FLAG(death_test_style) = death_test_style_;
+ GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+ GTEST_FLAG(filter) = filter_;
+ GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+ GTEST_FLAG(list_tests) = list_tests_;
+ GTEST_FLAG(output) = output_;
+ GTEST_FLAG(print_time) = print_time_;
+ GTEST_FLAG(random_seed) = random_seed_;
+ GTEST_FLAG(repeat) = repeat_;
+ GTEST_FLAG(shuffle) = shuffle_;
+ GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+ GTEST_FLAG(stream_result_to) = stream_result_to_;
+ GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+ }
+
+ private:
+ // Fields for saving the original values of flags.
+ bool also_run_disabled_tests_;
+ bool break_on_failure_;
+ bool catch_exceptions_;
+ std::string color_;
+ std::string death_test_style_;
+ bool death_test_use_fork_;
+ std::string filter_;
+ std::string internal_run_death_test_;
+ bool list_tests_;
+ std::string output_;
+ bool print_time_;
+ internal::Int32 random_seed_;
+ internal::Int32 repeat_;
+ bool shuffle_;
+ internal::Int32 stack_trace_depth_;
+ std::string stream_result_to_;
+ bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+ const char* shard_index_str,
+ bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+ int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+ // Implemented as an explicit loop since std::count_if() in libCstd on
+ // Solaris has a non-standard signature.
+ int count = 0;
+ for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+ if (predicate(*it))
+ ++count;
+ }
+ return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+ std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+ return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+ std::vector<E>* v) {
+ const int size = static_cast<int>(v->size());
+ GTEST_CHECK_(0 <= begin && begin <= size)
+ << "Invalid shuffle range start " << begin << ": must be in range [0, "
+ << size << "].";
+ GTEST_CHECK_(begin <= end && end <= size)
+ << "Invalid shuffle range finish " << end << ": must be in range ["
+ << begin << ", " << size << "].";
+
+ // Fisher-Yates shuffle, from
+ // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+ for (int range_width = end - begin; range_width >= 2; range_width--) {
+ const int last_in_range = begin + range_width - 1;
+ const int selected = begin + random->Generate(range_width);
+ std::swap((*v)[selected], (*v)[last_in_range]);
+ }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+ ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object. Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+ delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+ // Constructor.
+ //
+ // TestPropertyKeyIs has NO default constructor.
+ explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+ // Returns true iff the test name of test property matches on key_.
+ bool operator()(const TestProperty& test_property) const {
+ return test_property.key() == key_;
+ }
+
+ private:
+ std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests. It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag. E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter. If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+ // Functions for processing the gtest_output flag.
+
+ // Returns the output format, or "" for normal printed output.
+ static std::string GetOutputFormat();
+
+ // Returns the absolute path of the requested output file, or the
+ // default (test_detail.xml in the original working directory) if
+ // none was explicitly specified.
+ static std::string GetAbsolutePathToOutputFile();
+
+ // Functions for processing the gtest_filter flag.
+
+ // Returns true iff the wildcard pattern matches the string. The
+ // first ':' or '\0' character in pattern marks the end of it.
+ //
+ // This recursive algorithm isn't very efficient, but is clear and
+ // works well enough for matching test names, which are short.
+ static bool PatternMatchesString(const char *pattern, const char *str);
+
+ // Returns true iff the user-specified filter matches the test case
+ // name and the test name.
+ static bool FilterMatchesTest(const std::string &test_case_name,
+ const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+ // Function for supporting the gtest_catch_exception flag.
+
+ // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+ // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+ // This function is useful as an __except condition.
+ static int GTestShouldProcessSEH(DWORD exception_code);
+#endif // GTEST_OS_WINDOWS
+
+ // Returns true if "name" matches the ':' separated list of glob-style
+ // filters in "filter".
+ static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present. Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+ OsStackTraceGetterInterface() {}
+ virtual ~OsStackTraceGetterInterface() {}
+
+ // Returns the current OS stack trace as an std::string. Parameters:
+ //
+ // max_depth - the maximum number of stack frames to be included
+ // in the trace.
+ // skip_count - the number of top frames to be skipped; doesn't count
+ // against max_depth.
+ virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+ // UponLeavingGTest() should be called immediately before Google Test calls
+ // user code. It saves some information about the current stack that
+ // CurrentStackTrace() will use to find and hide Google Test stack frames.
+ virtual void UponLeavingGTest() = 0;
+
+ // This string is inserted in place of stack frames that are part of
+ // Google Test's implementation.
+ static const char* const kElidedFramesMarker;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+ OsStackTraceGetter() {}
+
+ virtual string CurrentStackTrace(int max_depth, int skip_count);
+ virtual void UponLeavingGTest();
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+ const char* file;
+ int line;
+ std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+ // Implements the TestPartResultReporterInterface. Reports the test part
+ // result in the current test.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+ UnitTestImpl* const unit_test_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+ // Implements the TestPartResultReporterInterface. The implementation just
+ // delegates to the current global test part result reporter of *unit_test_.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+ UnitTestImpl* const unit_test_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class. We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+ explicit UnitTestImpl(UnitTest* parent);
+ virtual ~UnitTestImpl();
+
+ // There are two different ways to register your own TestPartResultReporter.
+ // You can register your own repoter to listen either only for test results
+ // from the current thread or for results from all threads.
+ // By default, each per-thread test result repoter just passes a new
+ // TestPartResult to the global test result reporter, which registers the
+ // test part result for the currently running test.
+
+ // Returns the global test part result reporter.
+ TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+ // Sets the global test part result reporter.
+ void SetGlobalTestPartResultReporter(
+ TestPartResultReporterInterface* reporter);
+
+ // Returns the test part result reporter for the current thread.
+ TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+ // Sets the test part result reporter for the current thread.
+ void SetTestPartResultReporterForCurrentThread(
+ TestPartResultReporterInterface* reporter);
+
+ // Gets the number of successful test cases.
+ int successful_test_case_count() const;
+
+ // Gets the number of failed test cases.
+ int failed_test_case_count() const;
+
+ // Gets the number of all test cases.
+ int total_test_case_count() const;
+
+ // Gets the number of all test cases that contain at least one test
+ // that should run.
+ int test_case_to_run_count() const;
+
+ // Gets the number of successful tests.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Gets the number of all tests.
+ int total_test_count() const;
+
+ // Gets the number of tests that should run.
+ int test_to_run_count() const;
+
+ // Gets the time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+ // Gets the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns true iff the unit test passed (i.e. all test cases passed).
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the unit test failed (i.e. some test case failed
+ // or something outside of all tests failed).
+ bool Failed() const {
+ return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+ }
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ const TestCase* GetTestCase(int i) const {
+ const int index = GetElementOr(test_case_indices_, i, -1);
+ return index < 0 ? NULL : test_cases_[i];
+ }
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ TestCase* GetMutableTestCase(int i) {
+ const int index = GetElementOr(test_case_indices_, i, -1);
+ return index < 0 ? NULL : test_cases_[index];
+ }
+
+ // Provides access to the event listener list.
+ TestEventListeners* listeners() { return &listeners_; }
+
+ // Returns the TestResult for the test that's currently running, or
+ // the TestResult for the ad hoc test if no test is running.
+ TestResult* current_test_result();
+
+ // Returns the TestResult for the ad hoc test.
+ const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+ // Sets the OS stack trace getter.
+ //
+ // Does nothing if the input and the current OS stack trace getter
+ // are the same; otherwise, deletes the old getter and makes the
+ // input the current getter.
+ void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+ // Returns the current OS stack trace getter if it is not NULL;
+ // otherwise, creates an OsStackTraceGetter, makes it the current
+ // getter, and returns it.
+ OsStackTraceGetterInterface* os_stack_trace_getter();
+
+ // Returns the current OS stack trace as an std::string.
+ //
+ // The maximum number of stack frames to be included is specified by
+ // the gtest_stack_trace_depth flag. The skip_count parameter
+ // specifies the number of top frames to be skipped, which doesn't
+ // count against the number of frames to be included.
+ //
+ // For example, if Foo() calls Bar(), which in turn calls
+ // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+ // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+ std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+ // Finds and returns a TestCase with the given name. If one doesn't
+ // exist, creates one and returns it.
+ //
+ // Arguments:
+ //
+ // test_case_name: name of the test case
+ // type_param: the name of the test's type parameter, or NULL if
+ // this is not a typed or a type-parameterized test.
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ TestCase* GetTestCase(const char* test_case_name,
+ const char* type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc);
+
+ // Adds a TestInfo to the unit test.
+ //
+ // Arguments:
+ //
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ // test_info: the TestInfo object
+ void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc,
+ TestInfo* test_info) {
+ // In order to support thread-safe death tests, we need to
+ // remember the original working directory when the test program
+ // was first invoked. We cannot do this in RUN_ALL_TESTS(), as
+ // the user may have changed the current directory before calling
+ // RUN_ALL_TESTS(). Therefore we capture the current directory in
+ // AddTestInfo(), which is called to register a TEST or TEST_F
+ // before main() is reached.
+ if (original_working_dir_.IsEmpty()) {
+ original_working_dir_.Set(FilePath::GetCurrentDir());
+ GTEST_CHECK_(!original_working_dir_.IsEmpty())
+ << "Failed to get the current working directory.";
+ }
+
+ GetTestCase(test_info->test_case_name(),
+ test_info->type_param(),
+ set_up_tc,
+ tear_down_tc)->AddTestInfo(test_info);
+ }
+
+#if GTEST_HAS_PARAM_TEST
+ // Returns ParameterizedTestCaseRegistry object used to keep track of
+ // value-parameterized tests and instantiate and register them.
+ internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+ return parameterized_test_registry_;
+ }
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Sets the TestCase object for the test that's currently running.
+ void set_current_test_case(TestCase* a_current_test_case) {
+ current_test_case_ = a_current_test_case;
+ }
+
+ // Sets the TestInfo object for the test that's currently running. If
+ // current_test_info is NULL, the assertion results will be stored in
+ // ad_hoc_test_result_.
+ void set_current_test_info(TestInfo* a_current_test_info) {
+ current_test_info_ = a_current_test_info;
+ }
+
+ // Registers all parameterized tests defined using TEST_P and
+ // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+ // combination. This method can be called more then once; it has guards
+ // protecting from registering the tests more then once. If
+ // value-parameterized tests are disabled, RegisterParameterizedTests is
+ // present but does nothing.
+ void RegisterParameterizedTests();
+
+ // Runs all tests in this UnitTest object, prints the result, and
+ // returns true if all tests are successful. If any exception is
+ // thrown during a test, this test is considered to be failed, but
+ // the rest of the tests will still be run.
+ bool RunAllTests();
+
+ // Clears the results of all tests, except the ad hoc tests.
+ void ClearNonAdHocTestResult() {
+ ForEach(test_cases_, TestCase::ClearTestCaseResult);
+ }
+
+ // Clears the results of ad-hoc test assertions.
+ void ClearAdHocTestResult() {
+ ad_hoc_test_result_.Clear();
+ }
+
+ // Adds a TestProperty to the current TestResult object when invoked in a
+ // context of a test or a test case, or to the global property set. If the
+ // result already contains a property with the same key, the value will be
+ // updated.
+ void RecordProperty(const TestProperty& test_property);
+
+ enum ReactionToSharding {
+ HONOR_SHARDING_PROTOCOL,
+ IGNORE_SHARDING_PROTOCOL
+ };
+
+ // Matches the full name of each test against the user-specified
+ // filter to decide whether the test should run, then records the
+ // result in each TestCase and TestInfo object.
+ // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+ // based on sharding variables in the environment.
+ // Returns the number of tests that should run.
+ int FilterTests(ReactionToSharding shard_tests);
+
+ // Prints the names of the tests matching the user-specified filter flag.
+ void ListTestsMatchingFilter();
+
+ const TestCase* current_test_case() const { return current_test_case_; }
+ TestInfo* current_test_info() { return current_test_info_; }
+ const TestInfo* current_test_info() const { return current_test_info_; }
+
+ // Returns the vector of environments that need to be set-up/torn-down
+ // before/after the tests are run.
+ std::vector<Environment*>& environments() { return environments_; }
+
+ // Getters for the per-thread Google Test trace stack.
+ std::vector<TraceInfo>& gtest_trace_stack() {
+ return *(gtest_trace_stack_.pointer());
+ }
+ const std::vector<TraceInfo>& gtest_trace_stack() const {
+ return gtest_trace_stack_.get();
+ }
+
+#if GTEST_HAS_DEATH_TEST
+ void InitDeathTestSubprocessControlInfo() {
+ internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+ }
+ // Returns a pointer to the parsed --gtest_internal_run_death_test
+ // flag, or NULL if that flag was not specified.
+ // This information is useful only in a death test child process.
+ // Must not be called before a call to InitGoogleTest.
+ const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+ return internal_run_death_test_flag_.get();
+ }
+
+ // Returns a pointer to the current death test factory.
+ internal::DeathTestFactory* death_test_factory() {
+ return death_test_factory_.get();
+ }
+
+ void SuppressTestEventsIfInSubprocess();
+
+ friend class ReplaceDeathTestFactory;
+#endif // GTEST_HAS_DEATH_TEST
+
+ // Initializes the event listener performing XML output as specified by
+ // UnitTestOptions. Must not be called before InitGoogleTest.
+ void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+ // Initializes the event listener for streaming test results to a socket.
+ // Must not be called before InitGoogleTest.
+ void ConfigureStreamingOutput();
+#endif
+
+ // Performs initialization dependent upon flag values obtained in
+ // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
+ // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
+ // this function is also called from RunAllTests. Since this function can be
+ // called more than once, it has to be idempotent.
+ void PostFlagParsingInit();
+
+ // Gets the random seed used at the start of the current test iteration.
+ int random_seed() const { return random_seed_; }
+
+ // Gets the random number generator.
+ internal::Random* random() { return &random_; }
+
+ // Shuffles all test cases, and the tests within each test case,
+ // making sure that death tests are still run first.
+ void ShuffleTests();
+
+ // Restores the test cases and tests to their order before the first shuffle.
+ void UnshuffleTests();
+
+ // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+ // UnitTest::Run() starts.
+ bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+ friend class ::testing::UnitTest;
+
+ // Used by UnitTest::Run() to capture the state of
+ // GTEST_FLAG(catch_exceptions) at the moment it starts.
+ void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+ // The UnitTest object that owns this implementation object.
+ UnitTest* const parent_;
+
+ // The working directory when the first TEST() or TEST_F() was
+ // executed.
+ internal::FilePath original_working_dir_;
+
+ // The default test part result reporters.
+ DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+ DefaultPerThreadTestPartResultReporter
+ default_per_thread_test_part_result_reporter_;
+
+ // Points to (but doesn't own) the global test part result reporter.
+ TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+ // Protects read and write access to global_test_part_result_reporter_.
+ internal::Mutex global_test_part_result_reporter_mutex_;
+
+ // Points to (but doesn't own) the per-thread test part result reporter.
+ internal::ThreadLocal<TestPartResultReporterInterface*>
+ per_thread_test_part_result_reporter_;
+
+ // The vector of environments that need to be set-up/torn-down
+ // before/after the tests are run.
+ std::vector<Environment*> environments_;
+
+ // The vector of TestCases in their original order. It owns the
+ // elements in the vector.
+ std::vector<TestCase*> test_cases_;
+
+ // Provides a level of indirection for the test case list to allow
+ // easy shuffling and restoring the test case order. The i-th
+ // element of this vector is the index of the i-th test case in the
+ // shuffled order.
+ std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+ // ParameterizedTestRegistry object used to register value-parameterized
+ // tests.
+ internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+ // Indicates whether RegisterParameterizedTests() has been called already.
+ bool parameterized_tests_registered_;
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Index of the last death test case registered. Initially -1.
+ int last_death_test_case_;
+
+ // This points to the TestCase for the currently running test. It
+ // changes as Google Test goes through one test case after another.
+ // When no test is running, this is set to NULL and Google Test
+ // stores assertion results in ad_hoc_test_result_. Initially NULL.
+ TestCase* current_test_case_;
+
+ // This points to the TestInfo for the currently running test. It
+ // changes as Google Test goes through one test after another. When
+ // no test is running, this is set to NULL and Google Test stores
+ // assertion results in ad_hoc_test_result_. Initially NULL.
+ TestInfo* current_test_info_;
+
+ // Normally, a user only writes assertions inside a TEST or TEST_F,
+ // or inside a function called by a TEST or TEST_F. Since Google
+ // Test keeps track of which test is current running, it can
+ // associate such an assertion with the test it belongs to.
+ //
+ // If an assertion is encountered when no TEST or TEST_F is running,
+ // Google Test attributes the assertion result to an imaginary "ad hoc"
+ // test, and records the result in ad_hoc_test_result_.
+ TestResult ad_hoc_test_result_;
+
+ // The list of event listeners that can be used to track events inside
+ // Google Test.
+ TestEventListeners listeners_;
+
+ // The OS stack trace getter. Will be deleted when the UnitTest
+ // object is destructed. By default, an OsStackTraceGetter is used,
+ // but the user can set this field to use a custom getter if that is
+ // desired.
+ OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+ // True iff PostFlagParsingInit() has been called.
+ bool post_flag_parse_init_performed_;
+
+ // The random number seed used at the beginning of the test run.
+ int random_seed_;
+
+ // Our random number generator.
+ internal::Random random_;
+
+ // The time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp_;
+
+ // How long the test took to run, in milliseconds.
+ TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+ // The decomposed components of the gtest_internal_run_death_test flag,
+ // parsed when RUN_ALL_TESTS is called.
+ internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+ internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif // GTEST_HAS_DEATH_TEST
+
+ // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+ internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+ // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+ // starts.
+ bool catch_exceptions_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+}; // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+ return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+ bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter. Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+ // Fail fast if the given string does not begin with a digit;
+ // this bypasses strtoXXX's "optional leading whitespace and plus
+ // or minus sign" semantics, which are undesirable here.
+ if (str.empty() || !IsDigit(str[0])) {
+ return false;
+ }
+ errno = 0;
+
+ char* end;
+ // BiggestConvertible is the largest integer type that system-provided
+ // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+ // MSVC and C++ Builder define __int64 instead of the standard long long.
+ typedef unsigned __int64 BiggestConvertible;
+ const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+ typedef unsigned long long BiggestConvertible; // NOLINT
+ const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+ const bool parse_success = *end == '\0' && errno == 0;
+
+ // TODO(vladl@google.com): Convert this to compile time assertion when it is
+ // available.
+ GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+ const Integer result = static_cast<Integer>(parsed);
+ if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+ *number = result;
+ return true;
+ }
+ return false;
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+ static void RecordProperty(TestResult* test_result,
+ const std::string& xml_element,
+ const TestProperty& property) {
+ test_result->RecordProperty(xml_element, property);
+ }
+
+ static void ClearTestPartResults(TestResult* test_result) {
+ test_result->ClearTestPartResults();
+ }
+
+ static const std::vector<testing::TestPartResult>& test_part_results(
+ const TestResult& test_result) {
+ return test_result.test_part_results();
+ }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class GTEST_API_ StreamingListener : public EmptyTestEventListener {
+ public:
+ // Abstract base class for writing strings to a socket.
+ class AbstractSocketWriter {
+ public:
+ virtual ~AbstractSocketWriter() {}
+
+ // Sends a string to the socket.
+ virtual void Send(const string& message) = 0;
+
+ // Closes the socket.
+ virtual void CloseConnection() {}
+
+ // Sends a string and a newline to the socket.
+ void SendLn(const string& message) {
+ Send(message + "\n");
+ }
+ };
+
+ // Concrete class for actually writing strings to a socket.
+ class SocketWriter : public AbstractSocketWriter {
+ public:
+ SocketWriter(const string& host, const string& port)
+ : sockfd_(-1), host_name_(host), port_num_(port) {
+ MakeConnection();
+ }
+
+ virtual ~SocketWriter() {
+ if (sockfd_ != -1)
+ CloseConnection();
+ }
+
+ // Sends a string to the socket.
+ virtual void Send(const string& message) {
+ GTEST_CHECK_(sockfd_ != -1)
+ << "Send() can be called only when there is a connection.";
+
+ const int len = static_cast<int>(message.length());
+ if (write(sockfd_, message.c_str(), len) != len) {
+ GTEST_LOG_(WARNING)
+ << "stream_result_to: failed to stream to "
+ << host_name_ << ":" << port_num_;
+ }
+ }
+
+ private:
+ // Creates a client socket and connects to the server.
+ void MakeConnection();
+
+ // Closes the socket.
+ void CloseConnection() {
+ GTEST_CHECK_(sockfd_ != -1)
+ << "CloseConnection() can be called only when there is a connection.";
+
+ close(sockfd_);
+ sockfd_ = -1;
+ }
+
+ int sockfd_; // socket file descriptor
+ const string host_name_;
+ const string port_num_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+ }; // class SocketWriter
+
+ // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+ static string UrlEncode(const char* str);
+
+ StreamingListener(const string& host, const string& port)
+ : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+ explicit StreamingListener(AbstractSocketWriter* socket_writer)
+ : socket_writer_(socket_writer) { Start(); }
+
+ void OnTestProgramStart(const UnitTest& /* unit_test */) {
+ SendLn("event=TestProgramStart");
+ }
+
+ void OnTestProgramEnd(const UnitTest& unit_test) {
+ // Note that Google Test current only report elapsed time for each
+ // test iteration, not for the entire test program.
+ SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+ // Notify the streaming server to stop.
+ socket_writer_->CloseConnection();
+ }
+
+ void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+ SendLn("event=TestIterationStart&iteration=" +
+ StreamableToString(iteration));
+ }
+
+ void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+ SendLn("event=TestIterationEnd&passed=" +
+ FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+ StreamableToString(unit_test.elapsed_time()) + "ms");
+ }
+
+ void OnTestCaseStart(const TestCase& test_case) {
+ SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+ }
+
+ void OnTestCaseEnd(const TestCase& test_case) {
+ SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+ + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+ + "ms");
+ }
+
+ void OnTestStart(const TestInfo& test_info) {
+ SendLn(std::string("event=TestStart&name=") + test_info.name());
+ }
+
+ void OnTestEnd(const TestInfo& test_info) {
+ SendLn("event=TestEnd&passed=" +
+ FormatBool((test_info.result())->Passed()) +
+ "&elapsed_time=" +
+ StreamableToString((test_info.result())->elapsed_time()) + "ms");
+ }
+
+ void OnTestPartResult(const TestPartResult& test_part_result) {
+ const char* file_name = test_part_result.file_name();
+ if (file_name == NULL)
+ file_name = "";
+ SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+ "&line=" + StreamableToString(test_part_result.line_number()) +
+ "&message=" + UrlEncode(test_part_result.message()));
+ }
+
+ private:
+ // Sends the given message and a newline to the socket.
+ void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+ // Called at the start of streaming to notify the receiver what
+ // protocol we are using.
+ void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+ string FormatBool(bool value) { return value ? "1" : "0"; }
+
+ const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+}; // class StreamingListener
+
+#endif // GTEST_CAN_STREAM_RESULTS_
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+} // namespace internal
+
+static const char* GetDefaultFilter() {
+#ifdef GTEST_TEST_FILTER_ENV_VAR_
+ const char* const testbridge_test_only = getenv(GTEST_TEST_FILTER_ENV_VAR_);
+ if (testbridge_test_only != NULL) {
+ return testbridge_test_only;
+ }
+#endif // GTEST_TEST_FILTER_ENV_VAR_
+ return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+ also_run_disabled_tests,
+ internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+ "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+ break_on_failure,
+ internal::BoolFromGTestEnv("break_on_failure", false),
+ "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+ catch_exceptions,
+ internal::BoolFromGTestEnv("catch_exceptions", true),
+ "True iff " GTEST_NAME_
+ " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+ color,
+ internal::StringFromGTestEnv("color", "auto"),
+ "Whether to use colors in the output. Valid values: yes, no, "
+ "and auto. 'auto' means to use colors if the output is "
+ "being sent to a terminal and the TERM environment variable "
+ "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+ filter,
+ internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+ "A colon-separated list of glob (not regex) patterns "
+ "for filtering the tests to run, optionally followed by a "
+ "'-' and a : separated list of negative patterns (tests to "
+ "exclude). A test is run if it matches one of the positive "
+ "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+ "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+ output,
+ internal::StringFromGTestEnv("output", ""),
+ "A format (currently must be \"xml\"), optionally followed "
+ "by a colon and an output file name or directory. A directory "
+ "is indicated by a trailing pathname separator. "
+ "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+ "If a directory is specified, output files will be created "
+ "within that directory, with file-names based on the test "
+ "executable's name and, if necessary, made unique by adding "
+ "digits.");
+
+GTEST_DEFINE_bool_(
+ print_time,
+ internal::BoolFromGTestEnv("print_time", true),
+ "True iff " GTEST_NAME_
+ " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+ random_seed,
+ internal::Int32FromGTestEnv("random_seed", 0),
+ "Random number seed to use when shuffling test orders. Must be in range "
+ "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+ repeat,
+ internal::Int32FromGTestEnv("repeat", 1),
+ "How many times to repeat each test. Specify a negative number "
+ "for repeating forever. Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+ show_internal_stack_frames, false,
+ "True iff " GTEST_NAME_ " should include internal stack frames when "
+ "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+ shuffle,
+ internal::BoolFromGTestEnv("shuffle", false),
+ "True iff " GTEST_NAME_
+ " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+ stack_trace_depth,
+ internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+ "The maximum number of stack frames to print when an "
+ "assertion fails. The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+ stream_result_to,
+ internal::StringFromGTestEnv("stream_result_to", ""),
+ "This flag specifies the host name and the port number on which to stream "
+ "test results. Example: \"localhost:555\". The flag is effective only on "
+ "Linux.");
+
+GTEST_DEFINE_bool_(
+ throw_on_failure,
+ internal::BoolFromGTestEnv("throw_on_failure", false),
+ "When this flag is specified, a failed assertion will throw an exception "
+ "if exceptions are enabled or exit the program with a non-zero code "
+ "otherwise.");
+
+#if GTEST_USE_OWN_FLAGFILE_FLAG_
+GTEST_DEFINE_string_(
+ flagfile,
+ internal::StringFromGTestEnv("flagfile", ""),
+ "This flag specifies the flagfile to read command-line flags from.");
+#endif // GTEST_USE_OWN_FLAGFILE_FLAG_
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG). Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+ // These constants are the same as are used in glibc's rand(3).
+ state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+ GTEST_CHECK_(range > 0)
+ << "Cannot generate a number in the range [0, 0).";
+ GTEST_CHECK_(range <= kMaxRange)
+ << "Generation of a number in [0, " << range << ") was requested, "
+ << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+ // Converting via modulus introduces a bit of downward bias, but
+ // it's simple, and a linear congruential generator isn't too good
+ // to begin with.
+ return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test. Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+ int (TestCase::*method)() const) {
+ int sum = 0;
+ for (size_t i = 0; i < case_list.size(); i++) {
+ sum += (case_list[i]->*method)();
+ }
+ return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+ return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+ return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+ return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+ const char* file,
+ int line,
+ const char* message)
+ : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+ delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+ UnitTest::GetInstance()->
+ AddTestPartResult(data_->type, data_->file, data_->line,
+ AppendUserMessage(data_->message, message),
+ UnitTest::GetInstance()->impl()
+ ->CurrentOsStackTraceExceptTop(1)
+ // Skips the stack frame for this function itself.
+ ); // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// A copy of all command line arguments. Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+const ::std::vector<testing::internal::string>& GetArgvs() {
+#if defined(GTEST_CUSTOM_GET_ARGVS_)
+ return GTEST_CUSTOM_GET_ARGVS_();
+#else // defined(GTEST_CUSTOM_GET_ARGVS_)
+ return g_argvs;
+#endif // defined(GTEST_CUSTOM_GET_ARGVS_)
+}
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+ FilePath result;
+
+#if GTEST_OS_WINDOWS
+ result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe"));
+#else
+ result.Set(FilePath(GetArgvs()[0]));
+#endif // GTEST_OS_WINDOWS
+
+ return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+ const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+ if (gtest_output_flag == NULL) return std::string("");
+
+ const char* const colon = strchr(gtest_output_flag, ':');
+ return (colon == NULL) ?
+ std::string(gtest_output_flag) :
+ std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+ const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+ if (gtest_output_flag == NULL)
+ return "";
+
+ const char* const colon = strchr(gtest_output_flag, ':');
+ if (colon == NULL)
+ return internal::FilePath::ConcatPaths(
+ internal::FilePath(
+ UnitTest::GetInstance()->original_working_dir()),
+ internal::FilePath(kDefaultOutputFile)).string();
+
+ internal::FilePath output_name(colon + 1);
+ if (!output_name.IsAbsolutePath())
+ // TODO(wan@google.com): on Windows \some\path is not an absolute
+ // path (as its meaning depends on the current drive), yet the
+ // following logic for turning it into an absolute path is wrong.
+ // Fix it.
+ output_name = internal::FilePath::ConcatPaths(
+ internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+ internal::FilePath(colon + 1));
+
+ if (!output_name.IsDirectory())
+ return output_name.string();
+
+ internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+ output_name, internal::GetCurrentExecutableName(),
+ GetOutputFormat().c_str()));
+ return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string. The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+ const char *str) {
+ switch (*pattern) {
+ case '\0':
+ case ':': // Either ':' or '\0' marks the end of the pattern.
+ return *str == '\0';
+ case '?': // Matches any single character.
+ return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+ case '*': // Matches any string (possibly empty) of characters.
+ return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+ PatternMatchesString(pattern + 1, str);
+ default: // Non-special character. Matches itself.
+ return *pattern == *str &&
+ PatternMatchesString(pattern + 1, str + 1);
+ }
+}
+
+bool UnitTestOptions::MatchesFilter(
+ const std::string& name, const char* filter) {
+ const char *cur_pattern = filter;
+ for (;;) {
+ if (PatternMatchesString(cur_pattern, name.c_str())) {
+ return true;
+ }
+
+ // Finds the next pattern in the filter.
+ cur_pattern = strchr(cur_pattern, ':');
+
+ // Returns if no more pattern can be found.
+ if (cur_pattern == NULL) {
+ return false;
+ }
+
+ // Skips the pattern separater (the ':' character).
+ cur_pattern++;
+ }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+ const std::string &test_name) {
+ const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+ // Split --gtest_filter at '-', if there is one, to separate into
+ // positive filter and negative filter portions
+ const char* const p = GTEST_FLAG(filter).c_str();
+ const char* const dash = strchr(p, '-');
+ std::string positive;
+ std::string negative;
+ if (dash == NULL) {
+ positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter
+ negative = "";
+ } else {
+ positive = std::string(p, dash); // Everything up to the dash
+ negative = std::string(dash + 1); // Everything after the dash
+ if (positive.empty()) {
+ // Treat '-test1' as the same as '*-test1'
+ positive = kUniversalFilter;
+ }
+ }
+
+ // A filter is a colon-separated list of patterns. It matches a
+ // test if any pattern in it matches the test.
+ return (MatchesFilter(full_name, positive.c_str()) &&
+ !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+ // Google Test should handle a SEH exception if:
+ // 1. the user wants it to, AND
+ // 2. this is not a breakpoint exception, AND
+ // 3. this is not a C++ exception (VC++ implements them via SEH,
+ // apparently).
+ //
+ // SEH exception code for C++ exceptions.
+ // (see http://support.microsoft.com/kb/185294 for more information).
+ const DWORD kCxxExceptionCode = 0xe06d7363;
+
+ bool should_handle = true;
+
+ if (!GTEST_FLAG(catch_exceptions))
+ should_handle = false;
+ else if (exception_code == EXCEPTION_BREAKPOINT)
+ should_handle = false;
+ else if (exception_code == kCxxExceptionCode)
+ should_handle = false;
+
+ return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif // GTEST_HAS_SEH
+
+} // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test. The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+ TestPartResultArray* result)
+ : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+ result_(result) {
+ Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test. The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+ InterceptMode intercept_mode, TestPartResultArray* result)
+ : intercept_mode_(intercept_mode),
+ result_(result) {
+ Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+ old_reporter_ = impl->GetGlobalTestPartResultReporter();
+ impl->SetGlobalTestPartResultReporter(this);
+ } else {
+ old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+ impl->SetTestPartResultReporterForCurrentThread(this);
+ }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+ impl->SetGlobalTestPartResultReporter(old_reporter_);
+ } else {
+ impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+ }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test. We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test. This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X. The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code. GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+ return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library. This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+ const char* /* type_expr */,
+ const char* /* substr_expr */,
+ const TestPartResultArray& results,
+ TestPartResult::Type type,
+ const string& substr) {
+ const std::string expected(type == TestPartResult::kFatalFailure ?
+ "1 fatal failure" :
+ "1 non-fatal failure");
+ Message msg;
+ if (results.size() != 1) {
+ msg << "Expected: " << expected << "\n"
+ << " Actual: " << results.size() << " failures";
+ for (int i = 0; i < results.size(); i++) {
+ msg << "\n" << results.GetTestPartResult(i);
+ }
+ return AssertionFailure() << msg;
+ }
+
+ const TestPartResult& r = results.GetTestPartResult(0);
+ if (r.type() != type) {
+ return AssertionFailure() << "Expected: " << expected << "\n"
+ << " Actual:\n"
+ << r;
+ }
+
+ if (strstr(r.message(), substr.c_str()) == NULL) {
+ return AssertionFailure() << "Expected: " << expected << " containing \""
+ << substr << "\"\n"
+ << " Actual:\n"
+ << r;
+ }
+
+ return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+ const TestPartResultArray* results,
+ TestPartResult::Type type,
+ const string& substr)
+ : results_(results),
+ type_(type),
+ substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring. If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+ EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+ UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ unit_test_->current_test_result()->AddTestPartResult(result);
+ unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+ UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+ internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+ return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+ TestPartResultReporterInterface* reporter) {
+ internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+ global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+ return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+ TestPartResultReporterInterface* reporter) {
+ per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+ return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+ return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+ return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+ return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+ return SumOverTestCaseList(test_cases_,
+ &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+ return os_stack_trace_getter()->CurrentStackTrace(
+ static_cast<int>(GTEST_FLAG(stack_trace_depth)),
+ skip_count + 1
+ // Skips the user-specified number of frames plus this function
+ // itself.
+ ); // NOLINT
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+ // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+ // http://analogous.blogspot.com/2005/04/epoch.html
+ const TimeInMillis kJavaEpochToWinFileTimeDelta =
+ static_cast<TimeInMillis>(116444736UL) * 100000UL;
+ const DWORD kTenthMicrosInMilliSecond = 10000;
+
+ SYSTEMTIME now_systime;
+ FILETIME now_filetime;
+ ULARGE_INTEGER now_int64;
+ // TODO(kenton@google.com): Shouldn't this just use
+ // GetSystemTimeAsFileTime()?
+ GetSystemTime(&now_systime);
+ if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+ now_int64.LowPart = now_filetime.dwLowDateTime;
+ now_int64.HighPart = now_filetime.dwHighDateTime;
+ now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+ kJavaEpochToWinFileTimeDelta;
+ return now_int64.QuadPart;
+ }
+ return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+ __timeb64 now;
+
+ // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+ // (deprecated function) there.
+ // TODO(kenton@google.com): Use GetTickCount()? Or use
+ // SystemTimeToFileTime()
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)
+ _ftime64(&now);
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+ return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+ if (!ansi) return NULL;
+ const int length = strlen(ansi);
+ const int unicode_length =
+ MultiByteToWideChar(CP_ACP, 0, ansi, length,
+ NULL, 0);
+ WCHAR* unicode = new WCHAR[unicode_length + 1];
+ MultiByteToWideChar(CP_ACP, 0, ansi, length,
+ unicode, unicode_length);
+ unicode[unicode_length] = 0;
+ return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {
+ if (!utf16_str) return NULL;
+ const int ansi_length =
+ WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+ NULL, 0, NULL, NULL);
+ char* ansi = new char[ansi_length + 1];
+ WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+ ansi, ansi_length, NULL, NULL);
+ ansi[ansi_length] = 0;
+ return ansi;
+}
+
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings. Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s). A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+ if ( lhs == NULL ) return rhs == NULL;
+
+ if ( rhs == NULL ) return false;
+
+ return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+ Message* msg) {
+ for (size_t i = 0; i != length; ) { // NOLINT
+ if (wstr[i] != L'\0') {
+ *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+ while (i != length && wstr[i] != L'\0')
+ i++;
+ } else {
+ *msg << '\0';
+ i++;
+ }
+ }
+}
+
+#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+void SplitString(const ::std::string& str, char delimiter,
+ ::std::vector< ::std::string>* dest) {
+ ::std::vector< ::std::string> parsed;
+ ::std::string::size_type pos = 0;
+ while (::testing::internal::AlwaysTrue()) {
+ const ::std::string::size_type colon = str.find(delimiter, pos);
+ if (colon == ::std::string::npos) {
+ parsed.push_back(str.substr(pos));
+ break;
+ } else {
+ parsed.push_back(str.substr(pos, colon - pos));
+ pos = colon + 1;
+ }
+ }
+ dest->swap(parsed);
+}
+
+} // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+ // By default, we want there to be enough precision when printing
+ // a double to a Message.
+ *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+ return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+ return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+ internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+ return *this;
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+ internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+ return *this;
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+ return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+ : success_(other.success_),
+ message_(other.message_.get() != NULL ?
+ new ::std::string(*other.message_) :
+ static_cast< ::std::string*>(NULL)) {
+}
+
+// Swaps two AssertionResults.
+void AssertionResult::swap(AssertionResult& other) {
+ using std::swap;
+ swap(success_, other.success_);
+ swap(message_, other.message_);
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+ AssertionResult negation(!success_);
+ if (message_.get() != NULL)
+ negation << *message_;
+ return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+ return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+ return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+ return AssertionFailure() << message;
+}
+
+namespace internal {
+
+namespace edit_distance {
+std::vector<EditType> CalculateOptimalEdits(const std::vector<size_t>& left,
+ const std::vector<size_t>& right) {
+ std::vector<std::vector<double> > costs(
+ left.size() + 1, std::vector<double>(right.size() + 1));
+ std::vector<std::vector<EditType> > best_move(
+ left.size() + 1, std::vector<EditType>(right.size() + 1));
+
+ // Populate for empty right.
+ for (size_t l_i = 0; l_i < costs.size(); ++l_i) {
+ costs[l_i][0] = static_cast<double>(l_i);
+ best_move[l_i][0] = kRemove;
+ }
+ // Populate for empty left.
+ for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) {
+ costs[0][r_i] = static_cast<double>(r_i);
+ best_move[0][r_i] = kAdd;
+ }
+
+ for (size_t l_i = 0; l_i < left.size(); ++l_i) {
+ for (size_t r_i = 0; r_i < right.size(); ++r_i) {
+ if (left[l_i] == right[r_i]) {
+ // Found a match. Consume it.
+ costs[l_i + 1][r_i + 1] = costs[l_i][r_i];
+ best_move[l_i + 1][r_i + 1] = kMatch;
+ continue;
+ }
+
+ const double add = costs[l_i + 1][r_i];
+ const double remove = costs[l_i][r_i + 1];
+ const double replace = costs[l_i][r_i];
+ if (add < remove && add < replace) {
+ costs[l_i + 1][r_i + 1] = add + 1;
+ best_move[l_i + 1][r_i + 1] = kAdd;
+ } else if (remove < add && remove < replace) {
+ costs[l_i + 1][r_i + 1] = remove + 1;
+ best_move[l_i + 1][r_i + 1] = kRemove;
+ } else {
+ // We make replace a little more expensive than add/remove to lower
+ // their priority.
+ costs[l_i + 1][r_i + 1] = replace + 1.00001;
+ best_move[l_i + 1][r_i + 1] = kReplace;
+ }
+ }
+ }
+
+ // Reconstruct the best path. We do it in reverse order.
+ std::vector<EditType> best_path;
+ for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) {
+ EditType move = best_move[l_i][r_i];
+ best_path.push_back(move);
+ l_i -= move != kAdd;
+ r_i -= move != kRemove;
+ }
+ std::reverse(best_path.begin(), best_path.end());
+ return best_path;
+}
+
+namespace {
+
+// Helper class to convert string into ids with deduplication.
+class InternalStrings {
+ public:
+ size_t GetId(const std::string& str) {
+ IdMap::iterator it = ids_.find(str);
+ if (it != ids_.end()) return it->second;
+ size_t id = ids_.size();
+ return ids_[str] = id;
+ }
+
+ private:
+ typedef std::map<std::string, size_t> IdMap;
+ IdMap ids_;
+};
+
+} // namespace
+
+std::vector<EditType> CalculateOptimalEdits(
+ const std::vector<std::string>& left,
+ const std::vector<std::string>& right) {
+ std::vector<size_t> left_ids, right_ids;
+ {
+ InternalStrings intern_table;
+ for (size_t i = 0; i < left.size(); ++i) {
+ left_ids.push_back(intern_table.GetId(left[i]));
+ }
+ for (size_t i = 0; i < right.size(); ++i) {
+ right_ids.push_back(intern_table.GetId(right[i]));
+ }
+ }
+ return CalculateOptimalEdits(left_ids, right_ids);
+}
+
+namespace {
+
+// Helper class that holds the state for one hunk and prints it out to the
+// stream.
+// It reorders adds/removes when possible to group all removes before all
+// adds. It also adds the hunk header before printint into the stream.
+class Hunk {
+ public:
+ Hunk(size_t left_start, size_t right_start)
+ : left_start_(left_start),
+ right_start_(right_start),
+ adds_(),
+ removes_(),
+ common_() {}
+
+ void PushLine(char edit, const char* line) {
+ switch (edit) {
+ case ' ':
+ ++common_;
+ FlushEdits();
+ hunk_.push_back(std::make_pair(' ', line));
+ break;
+ case '-':
+ ++removes_;
+ hunk_removes_.push_back(std::make_pair('-', line));
+ break;
+ case '+':
+ ++adds_;
+ hunk_adds_.push_back(std::make_pair('+', line));
+ break;
+ }
+ }
+
+ void PrintTo(std::ostream* os) {
+ PrintHeader(os);
+ FlushEdits();
+ for (std::list<std::pair<char, const char*> >::const_iterator it =
+ hunk_.begin();
+ it != hunk_.end(); ++it) {
+ *os << it->first << it->second << "\n";
+ }
+ }
+
+ bool has_edits() const { return adds_ || removes_; }
+
+ private:
+ void FlushEdits() {
+ hunk_.splice(hunk_.end(), hunk_removes_);
+ hunk_.splice(hunk_.end(), hunk_adds_);
+ }
+
+ // Print a unified diff header for one hunk.
+ // The format is
+ // "@@ -<left_start>,<left_length> +<right_start>,<right_length> @@"
+ // where the left/right parts are ommitted if unnecessary.
+ void PrintHeader(std::ostream* ss) const {
+ *ss << "@@ ";
+ if (removes_) {
+ *ss << "-" << left_start_ << "," << (removes_ + common_);
+ }
+ if (removes_ && adds_) {
+ *ss << " ";
+ }
+ if (adds_) {
+ *ss << "+" << right_start_ << "," << (adds_ + common_);
+ }
+ *ss << " @@\n";
+ }
+
+ size_t left_start_, right_start_;
+ size_t adds_, removes_, common_;
+ std::list<std::pair<char, const char*> > hunk_, hunk_adds_, hunk_removes_;
+};
+
+} // namespace
+
+// Create a list of diff hunks in Unified diff format.
+// Each hunk has a header generated by PrintHeader above plus a body with
+// lines prefixed with ' ' for no change, '-' for deletion and '+' for
+// addition.
+// 'context' represents the desired unchanged prefix/suffix around the diff.
+// If two hunks are close enough that their contexts overlap, then they are
+// joined into one hunk.
+std::string CreateUnifiedDiff(const std::vector<std::string>& left,
+ const std::vector<std::string>& right,
+ size_t context) {
+ const std::vector<EditType> edits = CalculateOptimalEdits(left, right);
+
+ size_t l_i = 0, r_i = 0, edit_i = 0;
+ std::stringstream ss;
+ while (edit_i < edits.size()) {
+ // Find first edit.
+ while (edit_i < edits.size() && edits[edit_i] == kMatch) {
+ ++l_i;
+ ++r_i;
+ ++edit_i;
+ }
+
+ // Find the first line to include in the hunk.
+ const size_t prefix_context = std::min(l_i, context);
+ Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1);
+ for (size_t i = prefix_context; i > 0; --i) {
+ hunk.PushLine(' ', left[l_i - i].c_str());
+ }
+
+ // Iterate the edits until we found enough suffix for the hunk or the input
+ // is over.
+ size_t n_suffix = 0;
+ for (; edit_i < edits.size(); ++edit_i) {
+ if (n_suffix >= context) {
+ // Continue only if the next hunk is very close.
+ std::vector<EditType>::const_iterator it = edits.begin() + edit_i;
+ while (it != edits.end() && *it == kMatch) ++it;
+ if (it == edits.end() || (it - edits.begin()) - edit_i >= context) {
+ // There is no next edit or it is too far away.
+ break;
+ }
+ }
+
+ EditType edit = edits[edit_i];
+ // Reset count when a non match is found.
+ n_suffix = edit == kMatch ? n_suffix + 1 : 0;
+
+ if (edit == kMatch || edit == kRemove || edit == kReplace) {
+ hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str());
+ }
+ if (edit == kAdd || edit == kReplace) {
+ hunk.PushLine('+', right[r_i].c_str());
+ }
+
+ // Advance indices, depending on edit type.
+ l_i += edit != kAdd;
+ r_i += edit != kRemove;
+ }
+
+ if (!hunk.has_edits()) {
+ // We are done. We don't want this hunk.
+ break;
+ }
+
+ hunk.PrintTo(&ss);
+ }
+ return ss.str();
+}
+
+} // namespace edit_distance
+
+namespace {
+
+// The string representation of the values received in EqFailure() are already
+// escaped. Split them on escaped '\n' boundaries. Leave all other escaped
+// characters the same.
+std::vector<std::string> SplitEscapedString(const std::string& str) {
+ std::vector<std::string> lines;
+ size_t start = 0, end = str.size();
+ if (end > 2 && str[0] == '"' && str[end - 1] == '"') {
+ ++start;
+ --end;
+ }
+ bool escaped = false;
+ for (size_t i = start; i + 1 < end; ++i) {
+ if (escaped) {
+ escaped = false;
+ if (str[i] == 'n') {
+ lines.push_back(str.substr(start, i - start - 1));
+ start = i + 1;
+ }
+ } else {
+ escaped = str[i] == '\\';
+ }
+ }
+ lines.push_back(str.substr(start, end - start));
+ return lines;
+}
+
+} // namespace
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+// lhs_expression: "foo"
+// rhs_expression: "bar"
+// lhs_value: "5"
+// rhs_value: "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*. When it's true, the string "Ignoring case" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* lhs_expression,
+ const char* rhs_expression,
+ const std::string& lhs_value,
+ const std::string& rhs_value,
+ bool ignoring_case) {
+ Message msg;
+ msg << " Expected: " << lhs_expression;
+ if (lhs_value != lhs_expression) {
+ msg << "\n Which is: " << lhs_value;
+ }
+ msg << "\nTo be equal to: " << rhs_expression;
+ if (rhs_value != rhs_expression) {
+ msg << "\n Which is: " << rhs_value;
+ }
+
+ if (ignoring_case) {
+ msg << "\nIgnoring case";
+ }
+
+ if (!lhs_value.empty() && !rhs_value.empty()) {
+ const std::vector<std::string> lhs_lines =
+ SplitEscapedString(lhs_value);
+ const std::vector<std::string> rhs_lines =
+ SplitEscapedString(rhs_value);
+ if (lhs_lines.size() > 1 || rhs_lines.size() > 1) {
+ msg << "\nWith diff:\n"
+ << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines);
+ }
+ }
+
+ return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+ const AssertionResult& assertion_result,
+ const char* expression_text,
+ const char* actual_predicate_value,
+ const char* expected_predicate_value) {
+ const char* actual_message = assertion_result.message();
+ Message msg;
+ msg << "Value of: " << expression_text
+ << "\n Actual: " << actual_predicate_value;
+ if (actual_message[0] != '\0')
+ msg << " (" << actual_message << ")";
+ msg << "\nExpected: " << expected_predicate_value;
+ return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ double val1,
+ double val2,
+ double abs_error) {
+ const double diff = fabs(val1 - val2);
+ if (diff <= abs_error) return AssertionSuccess();
+
+ // TODO(wan): do not print the value of an expression if it's
+ // already a literal.
+ return AssertionFailure()
+ << "The difference between " << expr1 << " and " << expr2
+ << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+ << expr1 << " evaluates to " << val1 << ",\n"
+ << expr2 << " evaluates to " << val2 << ", and\n"
+ << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+ const char* expr2,
+ RawType val1,
+ RawType val2) {
+ // Returns success if val1 is less than val2,
+ if (val1 < val2) {
+ return AssertionSuccess();
+ }
+
+ // or if val1 is almost equal to val2.
+ const FloatingPoint<RawType> lhs(val1), rhs(val2);
+ if (lhs.AlmostEquals(rhs)) {
+ return AssertionSuccess();
+ }
+
+ // Note that the above two checks will both fail if either val1 or
+ // val2 is NaN, as the IEEE floating-point standard requires that
+ // any predicate involving a NaN must return false.
+
+ ::std::stringstream val1_ss;
+ val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << val1;
+
+ ::std::stringstream val2_ss;
+ val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << val2;
+
+ return AssertionFailure()
+ << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+ << " Actual: " << StringStreamToString(&val1_ss) << " vs "
+ << StringStreamToString(&val2_ss);
+}
+
+} // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+ float val1, float val2) {
+ return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+ double val1, double val2) {
+ return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* lhs_expression,
+ const char* rhs_expression,
+ BiggestInt lhs,
+ BiggestInt rhs) {
+ if (lhs == rhs) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ FormatForComparisonFailureMessage(lhs, rhs),
+ FormatForComparisonFailureMessage(rhs, lhs),
+ false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+ BiggestInt val1, BiggestInt val2) {\
+ if (val1 op val2) {\
+ return AssertionSuccess();\
+ } else {\
+ return AssertionFailure() \
+ << "Expected: (" << expr1 << ") " #op " (" << expr2\
+ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+ << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+ }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* lhs_expression,
+ const char* rhs_expression,
+ const char* lhs,
+ const char* rhs) {
+ if (String::CStringEquals(lhs, rhs)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ PrintToString(lhs),
+ PrintToString(rhs),
+ false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,
+ const char* rhs_expression,
+ const char* lhs,
+ const char* rhs) {
+ if (String::CaseInsensitiveCStringEquals(lhs, rhs)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ PrintToString(lhs),
+ PrintToString(rhs),
+ true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2) {
+ if (!String::CStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ } else {
+ return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << "), actual: \""
+ << s1 << "\" vs \"" << s2 << "\"";
+ }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2) {
+ if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ } else {
+ return AssertionFailure()
+ << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << ") (ignoring case), actual: \""
+ << s1 << "\" vs \"" << s2 << "\"";
+ }
+}
+
+} // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack. NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+ if (needle == NULL || haystack == NULL)
+ return needle == haystack;
+
+ return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+ if (needle == NULL || haystack == NULL)
+ return needle == haystack;
+
+ return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+ const StringType& haystack) {
+ return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+ bool expected_to_be_substring,
+ const char* needle_expr, const char* haystack_expr,
+ const StringType& needle, const StringType& haystack) {
+ if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+ return AssertionSuccess();
+
+ const bool is_wide_string = sizeof(needle[0]) > 1;
+ const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+ return AssertionFailure()
+ << "Value of: " << needle_expr << "\n"
+ << " Actual: " << begin_string_quote << needle << "\"\n"
+ << "Expected: " << (expected_to_be_substring ? "" : "not ")
+ << "a substring of " << haystack_expr << "\n"
+ << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+} // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+ const char* expected,
+ long hr) { // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+ // Windows CE doesn't support FormatMessage.
+ const char error_text[] = "";
+
+# else
+
+ // Looks up the human-readable system message for the HRESULT code
+ // and since we're not passing any params to FormatMessage, we don't
+ // want inserts expanded.
+ const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS;
+ const DWORD kBufSize = 4096;
+ // Gets the system's human readable message string for this HRESULT.
+ char error_text[kBufSize] = { '\0' };
+ DWORD message_length = ::FormatMessageA(kFlags,
+ 0, // no source, we're asking system
+ hr, // the error
+ 0, // no line width restrictions
+ error_text, // output buffer
+ kBufSize, // buf size
+ NULL); // no arguments for inserts
+ // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+ for (; message_length && IsSpace(error_text[message_length - 1]);
+ --message_length) {
+ error_text[message_length - 1] = '\0';
+ }
+
+# endif // GTEST_OS_WINDOWS_MOBILE
+
+ const std::string error_hex("0x" + String::FormatHexInt(hr));
+ return ::testing::AssertionFailure()
+ << "Expected: " << expr << " " << expected << ".\n"
+ << " Actual: " << error_hex << " " << error_text << "\n";
+}
+
+} // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT
+ if (SUCCEEDED(hr)) {
+ return AssertionSuccess();
+ }
+ return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT
+ if (FAILED(hr)) {
+ return AssertionSuccess();
+ }
+ return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length Encoding
+// 0 - 7 bits 0xxxxxxx
+// 8 - 11 bits 110xxxxx 10xxxxxx
+// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx
+// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern. Returns the n
+// lowest bits. As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+ const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+ *bits >>= n;
+ return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+ if (code_point > kMaxCodePoint4) {
+ return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+ }
+
+ char str[5]; // Big enough for the largest valid code point.
+ if (code_point <= kMaxCodePoint1) {
+ str[1] = '\0';
+ str[0] = static_cast<char>(code_point); // 0xxxxxxx
+ } else if (code_point <= kMaxCodePoint2) {
+ str[2] = '\0';
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx
+ } else if (code_point <= kMaxCodePoint3) {
+ str[3] = '\0';
+ str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx
+ } else { // code_point <= kMaxCodePoint4
+ str[4] = '\0';
+ str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx
+ }
+ return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+ return sizeof(wchar_t) == 2 &&
+ (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+ wchar_t second) {
+ const UInt32 mask = (1 << 10) - 1;
+ return (sizeof(wchar_t) == 2) ?
+ (((first & mask) << 10) | (second & mask)) + 0x10000 :
+ // This function should not be called when the condition is
+ // false, but we provide a sensible default in case it is.
+ static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+ if (num_chars == -1)
+ num_chars = static_cast<int>(wcslen(str));
+
+ ::std::stringstream stream;
+ for (int i = 0; i < num_chars; ++i) {
+ UInt32 unicode_code_point;
+
+ if (str[i] == L'\0') {
+ break;
+ } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+ unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+ str[i + 1]);
+ i++;
+ } else {
+ unicode_code_point = static_cast<UInt32>(str[i]);
+ }
+
+ stream << CodePointToUtf8(unicode_code_point);
+ }
+ return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+ if (wide_c_str == NULL) return "(null)";
+
+ return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings. Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s). A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+ if (lhs == NULL) return rhs == NULL;
+
+ if (rhs == NULL) return false;
+
+ return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* lhs_expression,
+ const char* rhs_expression,
+ const wchar_t* lhs,
+ const wchar_t* rhs) {
+ if (String::WideCStringEquals(lhs, rhs)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ PrintToString(lhs),
+ PrintToString(rhs),
+ false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const wchar_t* s1,
+ const wchar_t* s2) {
+ if (!String::WideCStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ }
+
+ return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << "), actual: "
+ << PrintToString(s1)
+ << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case. Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s). A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+ if (lhs == NULL)
+ return rhs == NULL;
+ if (rhs == NULL)
+ return false;
+ return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+ // Compares two wide C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike wcscasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL wide C string,
+ // including the empty string.
+ // NB: The implementations on different platforms slightly differ.
+ // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+ // environment variable. On GNU platform this method uses wcscasecmp
+ // which compares according to LC_CTYPE category of the current locale.
+ // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+ // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+ const wchar_t* rhs) {
+ if (lhs == NULL) return rhs == NULL;
+
+ if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+ return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+ return wcscasecmp(lhs, rhs) == 0;
+#else
+ // Android, Mac OS X and Cygwin don't define wcscasecmp.
+ // Other unknown OSes may not define it either.
+ wint_t left, right;
+ do {
+ left = towlower(*lhs++);
+ right = towlower(*rhs++);
+ } while (left && left == right);
+ return left == right;
+#endif // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+ const std::string& str, const std::string& suffix) {
+ const size_t str_len = str.length();
+ const size_t suffix_len = suffix.length();
+ return (str_len >= suffix_len) &&
+ CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+ suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+ std::stringstream ss;
+ ss << std::setfill('0') << std::setw(2) << value;
+ return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+ std::stringstream ss;
+ ss << std::hex << std::uppercase << value;
+ return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+ std::stringstream ss;
+ ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+ << static_cast<unsigned int>(value);
+ return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+ const ::std::string& str = ss->str();
+ const char* const start = str.c_str();
+ const char* const end = start + str.length();
+
+ std::string result;
+ result.reserve(2 * (end - start));
+ for (const char* ch = start; ch != end; ++ch) {
+ if (*ch == '\0') {
+ result += "\\0"; // Replaces NUL with "\\0";
+ } else {
+ result += *ch;
+ }
+ }
+
+ return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+ const Message& user_msg) {
+ // Appends the user message if it's non-empty.
+ const std::string user_msg_string = user_msg.GetString();
+ if (user_msg_string.empty()) {
+ return gtest_msg;
+ }
+
+ return gtest_msg + "\n" + user_msg_string;
+}
+
+} // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+ : death_test_count_(0),
+ elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+ if (i < 0 || i >= total_part_count())
+ internal::posix::Abort();
+ return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+ if (i < 0 || i >= test_property_count())
+ internal::posix::Abort();
+ return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+ test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+ test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+ const TestProperty& test_property) {
+ if (!ValidateTestProperty(xml_element, test_property)) {
+ return;
+ }
+ internal::MutexLock lock(&test_properites_mutex_);
+ const std::vector<TestProperty>::iterator property_with_matching_key =
+ std::find_if(test_properties_.begin(), test_properties_.end(),
+ internal::TestPropertyKeyIs(test_property.key()));
+ if (property_with_matching_key == test_properties_.end()) {
+ test_properties_.push_back(test_property);
+ return;
+ }
+ property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+ "disabled",
+ "errors",
+ "failures",
+ "name",
+ "random_seed",
+ "tests",
+ "time",
+ "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+ "disabled",
+ "errors",
+ "failures",
+ "name",
+ "tests",
+ "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+ "classname",
+ "name",
+ "status",
+ "time",
+ "type_param",
+ "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+ return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+ const std::string& xml_element) {
+ if (xml_element == "testsuites") {
+ return ArrayAsVector(kReservedTestSuitesAttributes);
+ } else if (xml_element == "testsuite") {
+ return ArrayAsVector(kReservedTestSuiteAttributes);
+ } else if (xml_element == "testcase") {
+ return ArrayAsVector(kReservedTestCaseAttributes);
+ } else {
+ GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+ }
+ // This code is unreachable but some compilers may not realizes that.
+ return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+ Message word_list;
+ for (size_t i = 0; i < words.size(); ++i) {
+ if (i > 0 && words.size() > 2) {
+ word_list << ", ";
+ }
+ if (i == words.size() - 1) {
+ word_list << "and ";
+ }
+ word_list << "'" << words[i] << "'";
+ }
+ return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+ const std::vector<std::string>& reserved_names) {
+ if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+ reserved_names.end()) {
+ ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+ << " (" << FormatWordList(reserved_names)
+ << " are reserved by " << GTEST_NAME_ << ")";
+ return false;
+ }
+ return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element. Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+ const TestProperty& test_property) {
+ return ValidateTestPropertyName(test_property.key(),
+ GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+ test_part_results_.clear();
+ test_properties_.clear();
+ death_test_count_ = 0;
+ elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+ for (int i = 0; i < total_part_count(); ++i) {
+ if (GetTestPartResult(i).failed())
+ return true;
+ }
+ return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+ return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+ return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+ return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+ return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts. This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+ return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+ return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the states of all flags.
+Test::Test()
+ : gtest_flag_saver_(new GTEST_FLAG_SAVER_) {
+}
+
+// The d'tor restores the states of all flags. The actual work is
+// done by the d'tor of the gtest_flag_saver_ field, and thus not
+// visible here.
+Test::~Test() {
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+ UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+ Message value_message;
+ value_message << value;
+ RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+ const std::string& message) {
+ // This function is a friend of UnitTest and as such has access to
+ // AddTestPartResult.
+ UnitTest::GetInstance()->AddTestPartResult(
+ result_type,
+ NULL, // No info about the source file where the exception occurred.
+ -1, // We have no info on which line caused the exception.
+ message,
+ ""); // No stack trace, either.
+}
+
+} // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class. This function checks if the current test has the
+// same fixture class as the first test in the current test case. If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ const TestCase* const test_case = impl->current_test_case();
+
+ // Info about the first test in the current test case.
+ const TestInfo* const first_test_info = test_case->test_info_list()[0];
+ const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+ const char* const first_test_name = first_test_info->name();
+
+ // Info about the current test.
+ const TestInfo* const this_test_info = impl->current_test_info();
+ const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+ const char* const this_test_name = this_test_info->name();
+
+ if (this_fixture_id != first_fixture_id) {
+ // Is the first test defined using TEST?
+ const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+ // Is this test defined using TEST?
+ const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+ if (first_is_TEST || this_is_TEST) {
+ // Both TEST and TEST_F appear in same test case, which is incorrect.
+ // Tell the user how to fix this.
+
+ // Gets the name of the TEST and the name of the TEST_F. Note
+ // that first_is_TEST and this_is_TEST cannot both be true, as
+ // the fixture IDs are different for the two tests.
+ const char* const TEST_name =
+ first_is_TEST ? first_test_name : this_test_name;
+ const char* const TEST_F_name =
+ first_is_TEST ? this_test_name : first_test_name;
+
+ ADD_FAILURE()
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class, so mixing TEST_F and TEST in the same test case is\n"
+ << "illegal. In test case " << this_test_info->test_case_name()
+ << ",\n"
+ << "test " << TEST_F_name << " is defined using TEST_F but\n"
+ << "test " << TEST_name << " is defined using TEST. You probably\n"
+ << "want to change the TEST to TEST_F or move it to another test\n"
+ << "case.";
+ } else {
+ // Two fixture classes with the same name appear in two different
+ // namespaces, which is not allowed. Tell the user how to fix this.
+ ADD_FAILURE()
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class. However, in test case "
+ << this_test_info->test_case_name() << ",\n"
+ << "you defined test " << first_test_name
+ << " and test " << this_test_name << "\n"
+ << "using two different test fixture classes. This can happen if\n"
+ << "the two classes are from different namespaces or translation\n"
+ << "units and have the same name. You should probably rename one\n"
+ << "of the classes to put the tests into different test cases.";
+ }
+ return false;
+ }
+
+ return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test. This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+ const char* location) {
+ Message message;
+ message << "SEH exception with code 0x" << std::setbase(16) <<
+ exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+ return new std::string(message.GetString());
+}
+
+#endif // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+ const char* location) {
+ Message message;
+ if (description != NULL) {
+ message << "C++ exception with description \"" << description << "\"";
+ } else {
+ message << "Unknown C++ exception";
+ }
+ message << " thrown in " << location << ".";
+
+ return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+ const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+ const TestPartResult& failure)
+ : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception. (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function. Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+ T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+ __try {
+ return (object->*method)();
+ } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT
+ GetExceptionCode())) {
+ // We create the exception message on the heap because VC++ prohibits
+ // creation of objects with destructors on stack in functions using __try
+ // (see error C2712).
+ std::string* exception_message = FormatSehExceptionMessage(
+ GetExceptionCode(), location);
+ internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+ *exception_message);
+ delete exception_message;
+ return static_cast<Result>(0);
+ }
+#else
+ (void)location;
+ return (object->*method)();
+#endif // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+ T* object, Result (T::*method)(), const char* location) {
+ // NOTE: The user code can affect the way in which Google Test handles
+ // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+ // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+ // after the exception is caught and either report or re-throw the
+ // exception based on the flag's value:
+ //
+ // try {
+ // // Perform the test method.
+ // } catch (...) {
+ // if (GTEST_FLAG(catch_exceptions))
+ // // Report the exception as failure.
+ // else
+ // throw; // Re-throws the original exception.
+ // }
+ //
+ // However, the purpose of this flag is to allow the program to drop into
+ // the debugger when the exception is thrown. On most platforms, once the
+ // control enters the catch block, the exception origin information is
+ // lost and the debugger will stop the program at the point of the
+ // re-throw in this function -- instead of at the point of the original
+ // throw statement in the code under test. For this reason, we perform
+ // the check early, sacrificing the ability to affect Google Test's
+ // exception handling in the method where the exception is thrown.
+ if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+ try {
+ return HandleSehExceptionsInMethodIfSupported(object, method, location);
+ } catch (const internal::GoogleTestFailureException&) { // NOLINT
+ // This exception type can only be thrown by a failed Google
+ // Test assertion with the intention of letting another testing
+ // framework catch it. Therefore we just re-throw it.
+ throw;
+ } catch (const std::exception& e) { // NOLINT
+ internal::ReportFailureInUnknownLocation(
+ TestPartResult::kFatalFailure,
+ FormatCxxExceptionMessage(e.what(), location));
+ } catch (...) { // NOLINT
+ internal::ReportFailureInUnknownLocation(
+ TestPartResult::kFatalFailure,
+ FormatCxxExceptionMessage(NULL, location));
+ }
+ return static_cast<Result>(0);
+#else
+ return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif // GTEST_HAS_EXCEPTIONS
+ } else {
+ return (object->*method)();
+ }
+}
+
+} // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+ if (!HasSameFixtureClass()) return;
+
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+ // We will run the test only if SetUp() was successful.
+ if (!HasFatalFailure()) {
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &Test::TestBody, "the test body");
+ }
+
+ // However, we want to clean up as much as possible. Hence we will
+ // always call TearDown(), even if SetUp() or the test body has
+ // failed.
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+ return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+ return internal::GetUnitTestImpl()->current_test_result()->
+ HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+ const std::string& a_name,
+ const char* a_type_param,
+ const char* a_value_param,
+ internal::CodeLocation a_code_location,
+ internal::TypeId fixture_class_id,
+ internal::TestFactoryBase* factory)
+ : test_case_name_(a_test_case_name),
+ name_(a_name),
+ type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+ value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+ location_(a_code_location),
+ fixture_class_id_(fixture_class_id),
+ should_run_(false),
+ is_disabled_(false),
+ matches_filter_(false),
+ factory_(factory),
+ result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// name: name of the test
+// type_param: the name of the test's type parameter, or NULL if
+// this is not a typed or a type-parameterized test.
+// value_param: text representation of the test's value parameter,
+// or NULL if this is not a value-parameterized test.
+// code_location: code location where the test is defined
+// fixture_class_id: ID of the test fixture class
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+// factory: pointer to the factory that creates a test object.
+// The newly created TestInfo instance will assume
+// ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ CodeLocation code_location,
+ TypeId fixture_class_id,
+ SetUpTestCaseFunc set_up_tc,
+ TearDownTestCaseFunc tear_down_tc,
+ TestFactoryBase* factory) {
+ TestInfo* const test_info =
+ new TestInfo(test_case_name, name, type_param, value_param,
+ code_location, fixture_class_id, factory);
+ GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+ return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+ CodeLocation code_location) {
+ Message errors;
+ errors
+ << "Attempted redefinition of test case " << test_case_name << ".\n"
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class. However, in test case " << test_case_name << ", you tried\n"
+ << "to define a test using a fixture class different from the one\n"
+ << "used earlier. This can happen if the two fixture classes are\n"
+ << "from different namespaces and have the same name. You should\n"
+ << "probably rename one of the classes to put the tests into different\n"
+ << "test cases.";
+
+ fprintf(stderr, "%s %s",
+ FormatFileLocation(code_location.file.c_str(),
+ code_location.line).c_str(),
+ errors.GetString().c_str());
+}
+#endif // GTEST_HAS_PARAM_TEST
+
+} // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only. We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+ // Constructor.
+ //
+ // TestNameIs has NO default constructor.
+ explicit TestNameIs(const char* name)
+ : name_(name) {}
+
+ // Returns true iff the test name of test_info matches name_.
+ bool operator()(const TestInfo * test_info) const {
+ // Next 2 lines are to avoid ICPC warning #177 functions operator() never
+ // used.
+ bool res = false;
+ res = &TestNameIs::operator();
+ return test_info && test_info->name() == name_;
+ }
+
+ private:
+ std::string name_;
+};
+
+} // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+ if (!parameterized_tests_registered_) {
+ parameterized_test_registry_.RegisterTests();
+ parameterized_tests_registered_ = true;
+ }
+#endif
+}
+
+} // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+ if (!should_run_) return;
+
+ // Tells UnitTest where to store test result.
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->set_current_test_info(this);
+
+ TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+ // Notifies the unit test event listeners that a test is about to start.
+ repeater->OnTestStart(*this);
+
+ const TimeInMillis start = internal::GetTimeInMillis();
+
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+
+ // Creates the test object.
+ Test* const test = internal::HandleExceptionsInMethodIfSupported(
+ factory_, &internal::TestFactoryBase::CreateTest,
+ "the test fixture's constructor");
+
+ // Runs the test only if the test object was created and its
+ // constructor didn't generate a fatal failure.
+ if ((test != NULL) && !Test::HasFatalFailure()) {
+ // This doesn't throw as all user code that can throw are wrapped into
+ // exception handling code.
+ test->Run();
+ }
+
+ // Deletes the test object.
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+ result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+ // Notifies the unit test event listener that a test has just finished.
+ repeater->OnTestEnd(*this);
+
+ // Tells UnitTest to stop associating assertion results to this
+ // test.
+ impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+ return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+ return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+ return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+ return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+ return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+ return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+ return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+// name: name of the test case
+// a_type_param: the name of the test case's type parameter, or NULL if
+// this is not a typed or a type-parameterized test case.
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc)
+ : name_(a_name),
+ type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+ set_up_tc_(set_up_tc),
+ tear_down_tc_(tear_down_tc),
+ should_run_(false),
+ elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+ // Deletes every Test in the collection.
+ ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+ const int index = GetElementOr(test_indices_, i, -1);
+ return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+ const int index = GetElementOr(test_indices_, i, -1);
+ return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case. Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+ test_info_list_.push_back(test_info);
+ test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+ if (!should_run_) return;
+
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->set_current_test_case(this);
+
+ TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+ repeater->OnTestCaseStart(*this);
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+ const internal::TimeInMillis start = internal::GetTimeInMillis();
+ for (int i = 0; i < total_test_count(); i++) {
+ GetMutableTestInfo(i)->Run();
+ }
+ elapsed_time_ = internal::GetTimeInMillis() - start;
+
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+ repeater->OnTestCaseEnd(*this);
+ impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+ ad_hoc_test_result_.Clear();
+ ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+ Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+ for (size_t i = 0; i < test_indices_.size(); i++) {
+ test_indices_[i] = static_cast<int>(i);
+ }
+}
+
+// Formats a countable noun. Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+ const char * singular_form,
+ const char * plural_form) {
+ return internal::StreamableToString(count) + " " +
+ (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+ return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+ return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation. Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+ switch (type) {
+ case TestPartResult::kSuccess:
+ return "Success";
+
+ case TestPartResult::kNonFatalFailure:
+ case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+ return "error: ";
+#else
+ return "Failure\n";
+#endif
+ default:
+ return "Unknown result type";
+ }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+ const TestPartResult& test_part_result) {
+ return (Message()
+ << internal::FormatFileLocation(test_part_result.file_name(),
+ test_part_result.line_number())
+ << " " << TestPartResultTypeToString(test_part_result.type())
+ << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+ const std::string& result =
+ PrintTestPartResultToString(test_part_result);
+ printf("%s\n", result.c_str());
+ fflush(stdout);
+ // If the test program runs in Visual Studio or a debugger, the
+ // following statements add the test part result message to the Output
+ // window such that the user can double-click on it to jump to the
+ // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+ // We don't call OutputDebugString*() on Windows Mobile, as printing
+ // to stdout is done by OutputDebugString() there already - we don't
+ // want the same message printed twice.
+ ::OutputDebugStringA(result.c_str());
+ ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+ COLOR_DEFAULT,
+ COLOR_RED,
+ COLOR_GREEN,
+ COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \
+ !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+ switch (color) {
+ case COLOR_RED: return FOREGROUND_RED;
+ case COLOR_GREEN: return FOREGROUND_GREEN;
+ case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+ default: return 0;
+ }
+}
+
+#else
+
+// Returns the ANSI color code for the given color. COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+ switch (color) {
+ case COLOR_RED: return "1";
+ case COLOR_GREEN: return "2";
+ case COLOR_YELLOW: return "3";
+ default: return NULL;
+ };
+}
+
+#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+ const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+ if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+ // On Windows the TERM variable is usually not set, but the
+ // console there does support colors.
+ return stdout_is_tty;
+#else
+ // On non-Windows platforms, we rely on the TERM variable.
+ const char* const term = posix::GetEnv("TERM");
+ const bool term_supports_color =
+ String::CStringEquals(term, "xterm") ||
+ String::CStringEquals(term, "xterm-color") ||
+ String::CStringEquals(term, "xterm-256color") ||
+ String::CStringEquals(term, "screen") ||
+ String::CStringEquals(term, "screen-256color") ||
+ String::CStringEquals(term, "tmux") ||
+ String::CStringEquals(term, "tmux-256color") ||
+ String::CStringEquals(term, "rxvt-unicode") ||
+ String::CStringEquals(term, "rxvt-unicode-256color") ||
+ String::CStringEquals(term, "linux") ||
+ String::CStringEquals(term, "cygwin");
+ return stdout_is_tty && term_supports_color;
+#endif // GTEST_OS_WINDOWS
+ }
+
+ return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+ String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+ String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+ String::CStringEquals(gtest_color, "1");
+ // We take "yes", "true", "t", and "1" as meaning "yes". If the
+ // value is neither one of these nor "auto", we treat it as "no" to
+ // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || \
+ GTEST_OS_IOS || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
+ const bool use_color = AlwaysFalse();
+#else
+ static const bool in_color_mode =
+ ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+ const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+ // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+ if (!use_color) {
+ vprintf(fmt, args);
+ va_end(args);
+ return;
+ }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \
+ !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+ const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ // Gets the current text color.
+ CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+ GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+ const WORD old_color_attrs = buffer_info.wAttributes;
+
+ // We need to flush the stream buffers into the console before each
+ // SetConsoleTextAttribute call lest it affect the text that is already
+ // printed but has not yet reached the console.
+ fflush(stdout);
+ SetConsoleTextAttribute(stdout_handle,
+ GetColorAttribute(color) | FOREGROUND_INTENSITY);
+ vprintf(fmt, args);
+
+ fflush(stdout);
+ // Restores the text color.
+ SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+ printf("\033[0;3%sm", GetAnsiColorCode(color));
+ vprintf(fmt, args);
+ printf("\033[m"); // Resets the terminal to default.
+#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+ va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+ const char* const type_param = test_info.type_param();
+ const char* const value_param = test_info.value_param();
+
+ if (type_param != NULL || value_param != NULL) {
+ printf(", where ");
+ if (type_param != NULL) {
+ printf("%s = %s", kTypeParamLabel, type_param);
+ if (value_param != NULL)
+ printf(" and ");
+ }
+ if (value_param != NULL) {
+ printf("%s = %s", kValueParamLabel, value_param);
+ }
+ }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+ PrettyUnitTestResultPrinter() {}
+ static void PrintTestName(const char * test_case, const char * test) {
+ printf("%s.%s", test_case, test);
+ }
+
+ // The following methods override what's in the TestEventListener class.
+ virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestCaseStart(const TestCase& test_case);
+ virtual void OnTestStart(const TestInfo& test_info);
+ virtual void OnTestPartResult(const TestPartResult& result);
+ virtual void OnTestEnd(const TestInfo& test_info);
+ virtual void OnTestCaseEnd(const TestCase& test_case);
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+ virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+ static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+ // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+ const UnitTest& unit_test, int iteration) {
+ if (GTEST_FLAG(repeat) != 1)
+ printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+ const char* const filter = GTEST_FLAG(filter).c_str();
+
+ // Prints the filter if it's not *. This reminds the user that some
+ // tests may be skipped.
+ if (!String::CStringEquals(filter, kUniversalFilter)) {
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: %s filter = %s\n", GTEST_NAME_, filter);
+ }
+
+ if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+ const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: This is test shard %d of %s.\n",
+ static_cast<int>(shard_index) + 1,
+ internal::posix::GetEnv(kTestTotalShards));
+ }
+
+ if (GTEST_FLAG(shuffle)) {
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: Randomizing tests' orders with a seed of %d .\n",
+ unit_test.random_seed());
+ }
+
+ ColoredPrintf(COLOR_GREEN, "[==========] ");
+ printf("Running %s from %s.\n",
+ FormatTestCount(unit_test.test_to_run_count()).c_str(),
+ FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+ const UnitTest& /*unit_test*/) {
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("Global test environment set-up.\n");
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+ const std::string counts =
+ FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("%s from %s", counts.c_str(), test_case.name());
+ if (test_case.type_param() == NULL) {
+ printf("\n");
+ } else {
+ printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+ }
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+ ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
+ PrintTestName(test_info.test_case_name(), test_info.name());
+ printf("\n");
+ fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+ const TestPartResult& result) {
+ // If the test part succeeded, we don't need to do anything.
+ if (result.type() == TestPartResult::kSuccess)
+ return;
+
+ // Print failure message from the assertion (e.g. expected this and got that).
+ PrintTestPartResult(result);
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+ if (test_info.result()->Passed()) {
+ ColoredPrintf(COLOR_GREEN, "[ OK ] ");
+ } else {
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ }
+ PrintTestName(test_info.test_case_name(), test_info.name());
+ if (test_info.result()->Failed())
+ PrintFullTestCommentIfPresent(test_info);
+
+ if (GTEST_FLAG(print_time)) {
+ printf(" (%s ms)\n", internal::StreamableToString(
+ test_info.result()->elapsed_time()).c_str());
+ } else {
+ printf("\n");
+ }
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+ if (!GTEST_FLAG(print_time)) return;
+
+ const std::string counts =
+ FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("%s from %s (%s ms total)\n\n",
+ counts.c_str(), test_case.name(),
+ internal::StreamableToString(test_case.elapsed_time()).c_str());
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+ const UnitTest& /*unit_test*/) {
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("Global test environment tear-down\n");
+ fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+ const int failed_test_count = unit_test.failed_test_count();
+ if (failed_test_count == 0) {
+ return;
+ }
+
+ for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+ const TestCase& test_case = *unit_test.GetTestCase(i);
+ if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+ continue;
+ }
+ for (int j = 0; j < test_case.total_test_count(); ++j) {
+ const TestInfo& test_info = *test_case.GetTestInfo(j);
+ if (!test_info.should_run() || test_info.result()->Passed()) {
+ continue;
+ }
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ printf("%s.%s", test_case.name(), test_info.name());
+ PrintFullTestCommentIfPresent(test_info);
+ printf("\n");
+ }
+ }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+ int /*iteration*/) {
+ ColoredPrintf(COLOR_GREEN, "[==========] ");
+ printf("%s from %s ran.",
+ FormatTestCount(unit_test.test_to_run_count()).c_str(),
+ FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+ if (GTEST_FLAG(print_time)) {
+ printf(" (%s ms total)",
+ internal::StreamableToString(unit_test.elapsed_time()).c_str());
+ }
+ printf("\n");
+ ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");
+ printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+ int num_failures = unit_test.failed_test_count();
+ if (!unit_test.Passed()) {
+ const int failed_test_count = unit_test.failed_test_count();
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+ PrintFailedTests(unit_test);
+ printf("\n%2d FAILED %s\n", num_failures,
+ num_failures == 1 ? "TEST" : "TESTS");
+ }
+
+ int num_disabled = unit_test.reportable_disabled_test_count();
+ if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+ if (!num_failures) {
+ printf("\n"); // Add a spacer if no FAILURE banner is displayed.
+ }
+ ColoredPrintf(COLOR_YELLOW,
+ " YOU HAVE %d DISABLED %s\n\n",
+ num_disabled,
+ num_disabled == 1 ? "TEST" : "TESTS");
+ }
+ // Ensure that Google Test output is printed before, e.g., heapchecker output.
+ fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+ TestEventRepeater() : forwarding_enabled_(true) {}
+ virtual ~TestEventRepeater();
+ void Append(TestEventListener *listener);
+ TestEventListener* Release(TestEventListener* listener);
+
+ // Controls whether events will be forwarded to listeners_. Set to false
+ // in death test child processes.
+ bool forwarding_enabled() const { return forwarding_enabled_; }
+ void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+ virtual void OnTestProgramStart(const UnitTest& unit_test);
+ virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+ virtual void OnTestCaseStart(const TestCase& test_case);
+ virtual void OnTestStart(const TestInfo& test_info);
+ virtual void OnTestPartResult(const TestPartResult& result);
+ virtual void OnTestEnd(const TestInfo& test_info);
+ virtual void OnTestCaseEnd(const TestCase& test_case);
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+ virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+ // Controls whether events will be forwarded to listeners_. Set to false
+ // in death test child processes.
+ bool forwarding_enabled_;
+ // The list of listeners that receive events.
+ std::vector<TestEventListener*> listeners_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+ ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+ listeners_.push_back(listener);
+}
+
+// TODO(vladl@google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+ for (size_t i = 0; i < listeners_.size(); ++i) {
+ if (listeners_[i] == listener) {
+ listeners_.erase(listeners_.begin() + i);
+ return listener;
+ }
+ }
+
+ return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+ if (forwarding_enabled_) { \
+ for (size_t i = 0; i < listeners_.size(); i++) { \
+ listeners_[i]->Name(parameter); \
+ } \
+ } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+ if (forwarding_enabled_) { \
+ for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+ listeners_[i]->Name(parameter); \
+ } \
+ } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+ int iteration) {
+ if (forwarding_enabled_) {
+ for (size_t i = 0; i < listeners_.size(); i++) {
+ listeners_[i]->OnTestIterationStart(unit_test, iteration);
+ }
+ }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+ int iteration) {
+ if (forwarding_enabled_) {
+ for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+ listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+ }
+ }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+ explicit XmlUnitTestResultPrinter(const char* output_file);
+
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+ // Is c a whitespace character that is normalized to a space character
+ // when it appears in an XML attribute value?
+ static bool IsNormalizableWhitespace(char c) {
+ return c == 0x9 || c == 0xA || c == 0xD;
+ }
+
+ // May c appear in a well-formed XML document?
+ static bool IsValidXmlCharacter(char c) {
+ return IsNormalizableWhitespace(c) || c >= 0x20;
+ }
+
+ // Returns an XML-escaped copy of the input string str. If
+ // is_attribute is true, the text is meant to appear as an attribute
+ // value, and normalizable whitespace is preserved by replacing it
+ // with character references.
+ static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+ // Returns the given string with all characters invalid in XML removed.
+ static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+ // Convenience wrapper around EscapeXml when str is an attribute value.
+ static std::string EscapeXmlAttribute(const std::string& str) {
+ return EscapeXml(str, true);
+ }
+
+ // Convenience wrapper around EscapeXml when str is not an attribute value.
+ static std::string EscapeXmlText(const char* str) {
+ return EscapeXml(str, false);
+ }
+
+ // Verifies that the given attribute belongs to the given element and
+ // streams the attribute as XML.
+ static void OutputXmlAttribute(std::ostream* stream,
+ const std::string& element_name,
+ const std::string& name,
+ const std::string& value);
+
+ // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+ static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+ // Streams an XML representation of a TestInfo object.
+ static void OutputXmlTestInfo(::std::ostream* stream,
+ const char* test_case_name,
+ const TestInfo& test_info);
+
+ // Prints an XML representation of a TestCase object
+ static void PrintXmlTestCase(::std::ostream* stream,
+ const TestCase& test_case);
+
+ // Prints an XML summary of unit_test to output stream out.
+ static void PrintXmlUnitTest(::std::ostream* stream,
+ const UnitTest& unit_test);
+
+ // Produces a string representing the test properties in a result as space
+ // delimited XML attributes based on the property key="value" pairs.
+ // When the std::string is not empty, it includes a space at the beginning,
+ // to delimit this attribute from prior attributes.
+ static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+ // The output file.
+ const std::string output_file_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+ : output_file_(output_file) {
+ if (output_file_.c_str() == NULL || output_file_.empty()) {
+ fprintf(stderr, "XML output file may not be null\n");
+ fflush(stderr);
+ exit(EXIT_FAILURE);
+ }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+ int /*iteration*/) {
+ FILE* xmlout = NULL;
+ FilePath output_file(output_file_);
+ FilePath output_dir(output_file.RemoveFileName());
+
+ if (output_dir.CreateDirectoriesRecursively()) {
+ xmlout = posix::FOpen(output_file_.c_str(), "w");
+ }
+ if (xmlout == NULL) {
+ // TODO(wan): report the reason of the failure.
+ //
+ // We don't do it for now as:
+ //
+ // 1. There is no urgent need for it.
+ // 2. It's a bit involved to make the errno variable thread-safe on
+ // all three operating systems (Linux, Windows, and Mac OS).
+ // 3. To interpret the meaning of errno in a thread-safe way,
+ // we need the strerror_r() function, which is not available on
+ // Windows.
+ fprintf(stderr,
+ "Unable to open file \"%s\"\n",
+ output_file_.c_str());
+ fflush(stderr);
+ exit(EXIT_FAILURE);
+ }
+ std::stringstream stream;
+ PrintXmlUnitTest(&stream, unit_test);
+ fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+ fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str. If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+ const std::string& str, bool is_attribute) {
+ Message m;
+
+ for (size_t i = 0; i < str.size(); ++i) {
+ const char ch = str[i];
+ switch (ch) {
+ case '<':
+ m << "&lt;";
+ break;
+ case '>':
+ m << "&gt;";
+ break;
+ case '&':
+ m << "&amp;";
+ break;
+ case '\'':
+ if (is_attribute)
+ m << "&apos;";
+ else
+ m << '\'';
+ break;
+ case '"':
+ if (is_attribute)
+ m << "&quot;";
+ else
+ m << '"';
+ break;
+ default:
+ if (IsValidXmlCharacter(ch)) {
+ if (is_attribute && IsNormalizableWhitespace(ch))
+ m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+ << ";";
+ else
+ m << ch;
+ }
+ break;
+ }
+ }
+
+ return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+ const std::string& str) {
+ std::string output;
+ output.reserve(str.size());
+ for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+ if (IsValidXmlCharacter(*it))
+ output.push_back(*it);
+
+ return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests"> <-- corresponds to a UnitTest object
+// <testsuite name="testcase-name"> <-- corresponds to a TestCase object
+// <testcase name="test-name"> <-- corresponds to a TestInfo object
+// <failure message="...">...</failure>
+// <failure message="...">...</failure>
+// <failure message="...">...</failure>
+// <-- individual assertion failures
+// </testcase>
+// </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+ ::std::stringstream ss;
+ ss << (static_cast<double>(ms) * 1e-3);
+ return ss.str();
+}
+
+static bool PortableLocaltime(time_t seconds, struct tm* out) {
+#if defined(_MSC_VER)
+ return localtime_s(out, &seconds) == 0;
+#elif defined(__MINGW32__) || defined(__MINGW64__)
+ // MINGW <time.h> provides neither localtime_r nor localtime_s, but uses
+ // Windows' localtime(), which has a thread-local tm buffer.
+ struct tm* tm_ptr = localtime(&seconds); // NOLINT
+ if (tm_ptr == NULL)
+ return false;
+ *out = *tm_ptr;
+ return true;
+#else
+ return localtime_r(&seconds, out) != NULL;
+#endif
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+ struct tm time_struct;
+ if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))
+ return "";
+ // YYYY-MM-DDThh:mm:ss
+ return StreamableToString(time_struct.tm_year + 1900) + "-" +
+ String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" +
+ String::FormatIntWidth2(time_struct.tm_mday) + "T" +
+ String::FormatIntWidth2(time_struct.tm_hour) + ":" +
+ String::FormatIntWidth2(time_struct.tm_min) + ":" +
+ String::FormatIntWidth2(time_struct.tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+ const char* data) {
+ const char* segment = data;
+ *stream << "<![CDATA[";
+ for (;;) {
+ const char* const next_segment = strstr(segment, "]]>");
+ if (next_segment != NULL) {
+ stream->write(
+ segment, static_cast<std::streamsize>(next_segment - segment));
+ *stream << "]]>]]&gt;<![CDATA[";
+ segment = next_segment + strlen("]]>");
+ } else {
+ *stream << segment;
+ break;
+ }
+ }
+ *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+ std::ostream* stream,
+ const std::string& element_name,
+ const std::string& name,
+ const std::string& value) {
+ const std::vector<std::string>& allowed_names =
+ GetReservedAttributesForElement(element_name);
+
+ GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+ allowed_names.end())
+ << "Attribute " << name << " is not allowed for element <" << element_name
+ << ">.";
+
+ *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+ const char* test_case_name,
+ const TestInfo& test_info) {
+ const TestResult& result = *test_info.result();
+ const std::string kTestcase = "testcase";
+
+ *stream << " <testcase";
+ OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+ if (test_info.value_param() != NULL) {
+ OutputXmlAttribute(stream, kTestcase, "value_param",
+ test_info.value_param());
+ }
+ if (test_info.type_param() != NULL) {
+ OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+ }
+
+ OutputXmlAttribute(stream, kTestcase, "status",
+ test_info.should_run() ? "run" : "notrun");
+ OutputXmlAttribute(stream, kTestcase, "time",
+ FormatTimeInMillisAsSeconds(result.elapsed_time()));
+ OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+ *stream << TestPropertiesAsXmlAttributes(result);
+
+ int failures = 0;
+ for (int i = 0; i < result.total_part_count(); ++i) {
+ const TestPartResult& part = result.GetTestPartResult(i);
+ if (part.failed()) {
+ if (++failures == 1) {
+ *stream << ">\n";
+ }
+ const string location = internal::FormatCompilerIndependentFileLocation(
+ part.file_name(), part.line_number());
+ const string summary = location + "\n" + part.summary();
+ *stream << " <failure message=\""
+ << EscapeXmlAttribute(summary.c_str())
+ << "\" type=\"\">";
+ const string detail = location + "\n" + part.message();
+ OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+ *stream << "</failure>\n";
+ }
+ }
+
+ if (failures == 0)
+ *stream << " />\n";
+ else
+ *stream << " </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+ const TestCase& test_case) {
+ const std::string kTestsuite = "testsuite";
+ *stream << " <" << kTestsuite;
+ OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+ OutputXmlAttribute(stream, kTestsuite, "tests",
+ StreamableToString(test_case.reportable_test_count()));
+ OutputXmlAttribute(stream, kTestsuite, "failures",
+ StreamableToString(test_case.failed_test_count()));
+ OutputXmlAttribute(
+ stream, kTestsuite, "disabled",
+ StreamableToString(test_case.reportable_disabled_test_count()));
+ OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+ OutputXmlAttribute(stream, kTestsuite, "time",
+ FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+ *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+ << ">\n";
+
+ for (int i = 0; i < test_case.total_test_count(); ++i) {
+ if (test_case.GetTestInfo(i)->is_reportable())
+ OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+ }
+ *stream << " </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+ const UnitTest& unit_test) {
+ const std::string kTestsuites = "testsuites";
+
+ *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ *stream << "<" << kTestsuites;
+
+ OutputXmlAttribute(stream, kTestsuites, "tests",
+ StreamableToString(unit_test.reportable_test_count()));
+ OutputXmlAttribute(stream, kTestsuites, "failures",
+ StreamableToString(unit_test.failed_test_count()));
+ OutputXmlAttribute(
+ stream, kTestsuites, "disabled",
+ StreamableToString(unit_test.reportable_disabled_test_count()));
+ OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+ OutputXmlAttribute(
+ stream, kTestsuites, "timestamp",
+ FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+ OutputXmlAttribute(stream, kTestsuites, "time",
+ FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+ if (GTEST_FLAG(shuffle)) {
+ OutputXmlAttribute(stream, kTestsuites, "random_seed",
+ StreamableToString(unit_test.random_seed()));
+ }
+
+ *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+ OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+ *stream << ">\n";
+
+ for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+ if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+ PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+ }
+ *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+ const TestResult& result) {
+ Message attributes;
+ for (int i = 0; i < result.test_property_count(); ++i) {
+ const TestProperty& property = result.GetTestProperty(i);
+ attributes << " " << property.key() << "="
+ << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+ }
+ return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D". This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+ string result;
+ result.reserve(strlen(str) + 1);
+ for (char ch = *str; ch != '\0'; ch = *++str) {
+ switch (ch) {
+ case '%':
+ case '=':
+ case '&':
+ case '\n':
+ result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+ break;
+ default:
+ result.push_back(ch);
+ break;
+ }
+ }
+ return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+ GTEST_CHECK_(sockfd_ == -1)
+ << "MakeConnection() can't be called when there is already a connection.";
+
+ addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses.
+ hints.ai_socktype = SOCK_STREAM;
+ addrinfo* servinfo = NULL;
+
+ // Use the getaddrinfo() to get a linked list of IP addresses for
+ // the given host name.
+ const int error_num = getaddrinfo(
+ host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+ if (error_num != 0) {
+ GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+ << gai_strerror(error_num);
+ }
+
+ // Loop through all the results and connect to the first we can.
+ for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+ cur_addr = cur_addr->ai_next) {
+ sockfd_ = socket(
+ cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+ if (sockfd_ != -1) {
+ // Connect the client socket to the server socket.
+ if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+ close(sockfd_);
+ sockfd_ = -1;
+ }
+ }
+ }
+
+ freeaddrinfo(servinfo); // all done with this structure
+
+ if (sockfd_ == -1) {
+ GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+ << host_name_ << ":" << port_num_;
+ }
+}
+
+// End of class Streaming Listener
+#endif // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+ GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+ TraceInfo trace;
+ trace.file = file;
+ trace.line = line;
+ trace.message = message.GetString();
+
+ UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+ GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+ UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+const char* const OsStackTraceGetterInterface::kElidedFramesMarker =
+ "... " GTEST_NAME_ " internal frames ...";
+
+string OsStackTraceGetter::CurrentStackTrace(int /*max_depth*/,
+ int /*skip_count*/) {
+ return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest() {}
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+ explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+ : premature_exit_filepath_(premature_exit_filepath) {
+ // If a path to the premature-exit file is specified...
+ if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+ // create the file with a single "0" character in it. I/O
+ // errors are ignored as there's nothing better we can do and we
+ // don't want to fail the test because of this.
+ FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+ fwrite("0", 1, 1, pfile);
+ fclose(pfile);
+ }
+ }
+
+ ~ScopedPrematureExitFile() {
+ if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+ remove(premature_exit_filepath_);
+ }
+ }
+
+ private:
+ const char* const premature_exit_filepath_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+} // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+ : repeater_(new internal::TestEventRepeater()),
+ default_result_printer_(NULL),
+ default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output. Can be removed from the listeners list to shut down default
+// console output. Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+ repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it. It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+ if (listener == default_result_printer_)
+ default_result_printer_ = NULL;
+ else if (listener == default_xml_generator_)
+ default_xml_generator_ = NULL;
+ return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+ if (default_result_printer_ != listener) {
+ // It is an error to pass this method a listener that is already in the
+ // list.
+ delete Release(default_result_printer_);
+ default_result_printer_ = listener;
+ if (listener != NULL)
+ Append(listener);
+ }
+}
+
+// Sets the default_xml_generator attribute to the provided listener. The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+ if (default_xml_generator_ != listener) {
+ // It is an error to pass this method a listener that is already in the
+ // list.
+ delete Release(default_xml_generator_);
+ default_xml_generator_ = listener;
+ if (listener != NULL)
+ Append(listener);
+ }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+ return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+ repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object. The first time this method is
+// called, a UnitTest object is constructed and returned. Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+ // When compiled with MSVC 7.1 in optimized mode, destroying the
+ // UnitTest object upon exiting the program messes up the exit code,
+ // causing successful tests to appear failed. We have to use a
+ // different implementation in this case to bypass the compiler bug.
+ // This implementation makes the compiler happy, at the cost of
+ // leaking the UnitTest object.
+
+ // CodeGear C++Builder insists on a public destructor for the
+ // default implementation. Use this implementation to keep good OO
+ // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+ static UnitTest* const instance = new UnitTest;
+ return instance;
+#else
+ static UnitTest instance;
+ return &instance;
+#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+ return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+ return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+ return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+ return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+ return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+ return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+ return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+ return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+ return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+ return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+ return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+ return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+ return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+ return *impl()->listeners();
+}
+
+// Registers and returns a global test environment. When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered. After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+ if (env == NULL) {
+ return NULL;
+ }
+
+ impl_->environments().push_back(env);
+ return env;
+}
+
+// Adds a TestPartResult to the current TestResult object. All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results. The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+ TestPartResult::Type result_type,
+ const char* file_name,
+ int line_number,
+ const std::string& message,
+ const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+ Message msg;
+ msg << message;
+
+ internal::MutexLock lock(&mutex_);
+ if (impl_->gtest_trace_stack().size() > 0) {
+ msg << "\n" << GTEST_NAME_ << " trace:";
+
+ for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+ i > 0; --i) {
+ const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+ msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+ << " " << trace.message;
+ }
+ }
+
+ if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+ msg << internal::kStackTraceMarker << os_stack_trace;
+ }
+
+ const TestPartResult result =
+ TestPartResult(result_type, file_name, line_number,
+ msg.GetString().c_str());
+ impl_->GetTestPartResultReporterForCurrentThread()->
+ ReportTestPartResult(result);
+
+ if (result_type != TestPartResult::kSuccess) {
+ // gtest_break_on_failure takes precedence over
+ // gtest_throw_on_failure. This allows a user to set the latter
+ // in the code (perhaps in order to use Google Test assertions
+ // with another testing framework) and specify the former on the
+ // command line for debugging.
+ if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+ // Using DebugBreak on Windows allows gtest to still break into a debugger
+ // when a failure happens and both the --gtest_break_on_failure and
+ // the --gtest_catch_exceptions flags are specified.
+ DebugBreak();
+#else
+ // Dereference NULL through a volatile pointer to prevent the compiler
+ // from removing. We use this rather than abort() or __builtin_trap() for
+ // portability: Symbian doesn't implement abort() well, and some debuggers
+ // don't correctly trap abort().
+ *static_cast<volatile int*>(NULL) = 1;
+#endif // GTEST_OS_WINDOWS
+ } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+ throw internal::GoogleTestFailureException(result);
+#else
+ // We cannot call abort() as it generates a pop-up in debug mode
+ // that cannot be suppressed in VC 7.1 or below.
+ exit(1);
+#endif
+ }
+ }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere. If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+ const std::string& value) {
+ impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+ const bool in_death_test_child_process =
+ internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+ // Google Test implements this protocol for catching that a test
+ // program exits before returning control to Google Test:
+ //
+ // 1. Upon start, Google Test creates a file whose absolute path
+ // is specified by the environment variable
+ // TEST_PREMATURE_EXIT_FILE.
+ // 2. When Google Test has finished its work, it deletes the file.
+ //
+ // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+ // running a Google-Test-based test program and check the existence
+ // of the file at the end of the test execution to see if it has
+ // exited prematurely.
+
+ // If we are in the child process of a death test, don't
+ // create/delete the premature exit file, as doing so is unnecessary
+ // and will confuse the parent process. Otherwise, create/delete
+ // the file upon entering/leaving this function. If the program
+ // somehow exits before this function has a chance to return, the
+ // premature-exit file will be left undeleted, causing a test runner
+ // that understands the premature-exit-file protocol to report the
+ // test as having failed.
+ const internal::ScopedPrematureExitFile premature_exit_file(
+ in_death_test_child_process ?
+ NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+ // Captures the value of GTEST_FLAG(catch_exceptions). This value will be
+ // used for the duration of the program.
+ impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+ // Either the user wants Google Test to catch exceptions thrown by the
+ // tests or this is executing in the context of death test child
+ // process. In either case the user does not want to see pop-up dialogs
+ // about crashes - they are expected.
+ if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+ // SetErrorMode doesn't exist on CE.
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+ SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+ // Death test children can be terminated with _abort(). On Windows,
+ // _abort() can show a dialog with a warning message. This forces the
+ // abort message to go to stderr instead.
+ _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+ // In the debug version, Visual Studio pops up a separate dialog
+ // offering a choice to debug the aborted program. We need to suppress
+ // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+ // executed. Google Test will notify the user of any unexpected
+ // failure via stderr.
+ //
+ // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+ // Users of prior VC versions shall suffer the agony and pain of
+ // clicking through the countless debug dialogs.
+ // TODO(vladl@google.com): find a way to suppress the abort dialog() in the
+ // debug mode when compiled with VC 7.1 or lower.
+ if (!GTEST_FLAG(break_on_failure))
+ _set_abort_behavior(
+ 0x0, // Clear the following flags:
+ _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
+# endif
+ }
+#endif // GTEST_HAS_SEH
+
+ return internal::HandleExceptionsInMethodIfSupported(
+ impl(),
+ &internal::UnitTestImpl::RunAllTests,
+ "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+ return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+ UnitTest::parameterized_test_registry()
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ return impl_->parameterized_test_registry();
+}
+#endif // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+ impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+ delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+ : parent_(parent),
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)
+ default_global_test_part_result_reporter_(this),
+ default_per_thread_test_part_result_reporter_(this),
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+ global_test_part_result_repoter_(
+ &default_global_test_part_result_reporter_),
+ per_thread_test_part_result_reporter_(
+ &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+ parameterized_test_registry_(),
+ parameterized_tests_registered_(false),
+#endif // GTEST_HAS_PARAM_TEST
+ last_death_test_case_(-1),
+ current_test_case_(NULL),
+ current_test_info_(NULL),
+ ad_hoc_test_result_(),
+ os_stack_trace_getter_(NULL),
+ post_flag_parse_init_performed_(false),
+ random_seed_(0), // Will be overridden by the flag before first use.
+ random_(0), // Will be reseeded before first use.
+ start_timestamp_(0),
+ elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+ death_test_factory_(new DefaultDeathTestFactory),
+#endif
+ // Will be overridden by the flag before first use.
+ catch_exceptions_(false) {
+ listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+ // Deletes every TestCase.
+ ForEach(test_cases_, internal::Delete<TestCase>);
+
+ // Deletes every Environment.
+ ForEach(environments_, internal::Delete<Environment>);
+
+ delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise. If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+ std::string xml_element;
+ TestResult* test_result; // TestResult appropriate for property recording.
+
+ if (current_test_info_ != NULL) {
+ xml_element = "testcase";
+ test_result = &(current_test_info_->result_);
+ } else if (current_test_case_ != NULL) {
+ xml_element = "testsuite";
+ test_result = &(current_test_case_->ad_hoc_test_result_);
+ } else {
+ xml_element = "testsuites";
+ test_result = &ad_hoc_test_result_;
+ }
+ test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+ if (internal_run_death_test_flag_.get() != NULL)
+ listeners()->SuppressEventForwarding();
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+ const std::string& output_format = UnitTestOptions::GetOutputFormat();
+ if (output_format == "xml") {
+ listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+ UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+ } else if (output_format != "") {
+ printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+ output_format.c_str());
+ fflush(stdout);
+ }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+ const std::string& target = GTEST_FLAG(stream_result_to);
+ if (!target.empty()) {
+ const size_t pos = target.find(':');
+ if (pos != std::string::npos) {
+ listeners()->Append(new StreamingListener(target.substr(0, pos),
+ target.substr(pos+1)));
+ } else {
+ printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+ target.c_str());
+ fflush(stdout);
+ }
+ }
+}
+#endif // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests. Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+ // Ensures that this function does not execute more than once.
+ if (!post_flag_parse_init_performed_) {
+ post_flag_parse_init_performed_ = true;
+
+#if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)
+ // Register to send notifications about key process state changes.
+ listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_());
+#endif // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)
+
+#if GTEST_HAS_DEATH_TEST
+ InitDeathTestSubprocessControlInfo();
+ SuppressTestEventsIfInSubprocess();
+#endif // GTEST_HAS_DEATH_TEST
+
+ // Registers parameterized tests. This makes parameterized tests
+ // available to the UnitTest reflection API without running
+ // RUN_ALL_TESTS.
+ RegisterParameterizedTests();
+
+ // Configures listeners for XML output. This makes it possible for users
+ // to shut down the default XML output before invoking RUN_ALL_TESTS.
+ ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+ // Configures listeners for streaming test results to the specified server.
+ ConfigureStreamingOutput();
+#endif // GTEST_CAN_STREAM_RESULTS_
+ }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only. We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+ // Constructor.
+ explicit TestCaseNameIs(const std::string& name)
+ : name_(name) {}
+
+ // Returns true iff the name of test_case matches name_.
+ bool operator()(const TestCase* test_case) const {
+ return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+ }
+
+ private:
+ std::string name_;
+};
+
+// Finds and returns a TestCase with the given name. If one doesn't
+// exist, creates one and returns it. It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// type_param: the name of the test case's type parameter, or NULL if
+// this is not a typed or a type-parameterized test case.
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+ const char* type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc) {
+ // Can we find a TestCase with the given name?
+ const std::vector<TestCase*>::const_iterator test_case =
+ std::find_if(test_cases_.begin(), test_cases_.end(),
+ TestCaseNameIs(test_case_name));
+
+ if (test_case != test_cases_.end())
+ return *test_case;
+
+ // No. Let's create one.
+ TestCase* const new_test_case =
+ new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+ // Is this a death test case?
+ if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+ kDeathTestCaseFilter)) {
+ // Yes. Inserts the test case after the last death test case
+ // defined so far. This only works when the test cases haven't
+ // been shuffled. Otherwise we may end up running a death test
+ // after a non-death test.
+ ++last_death_test_case_;
+ test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+ new_test_case);
+ } else {
+ // No. Appends to the end of the list.
+ test_cases_.push_back(new_test_case);
+ }
+
+ test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+ return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment. They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful. If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+ // Makes sure InitGoogleTest() was called.
+ if (!GTestIsInitialized()) {
+ printf("%s",
+ "\nThis test program did NOT call ::testing::InitGoogleTest "
+ "before calling RUN_ALL_TESTS(). Please fix it.\n");
+ return false;
+ }
+
+ // Do not run any test if the --help flag was specified.
+ if (g_help_flag)
+ return true;
+
+ // Repeats the call to the post-flag parsing initialization in case the
+ // user didn't call InitGoogleTest.
+ PostFlagParsingInit();
+
+ // Even if sharding is not on, test runners may want to use the
+ // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+ // protocol.
+ internal::WriteToShardStatusFileIfNeeded();
+
+ // True iff we are in a subprocess for running a thread-safe-style
+ // death test.
+ bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+ in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+# if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)
+ if (in_subprocess_for_death_test) {
+ GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();
+ }
+# endif // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)
+#endif // GTEST_HAS_DEATH_TEST
+
+ const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+ in_subprocess_for_death_test);
+
+ // Compares the full test names with the filter to decide which
+ // tests to run.
+ const bool has_tests_to_run = FilterTests(should_shard
+ ? HONOR_SHARDING_PROTOCOL
+ : IGNORE_SHARDING_PROTOCOL) > 0;
+
+ // Lists the tests and exits if the --gtest_list_tests flag was specified.
+ if (GTEST_FLAG(list_tests)) {
+ // This must be called *after* FilterTests() has been called.
+ ListTestsMatchingFilter();
+ return true;
+ }
+
+ random_seed_ = GTEST_FLAG(shuffle) ?
+ GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+ // True iff at least one test has failed.
+ bool failed = false;
+
+ TestEventListener* repeater = listeners()->repeater();
+
+ start_timestamp_ = GetTimeInMillis();
+ repeater->OnTestProgramStart(*parent_);
+
+ // How many times to repeat the tests? We don't want to repeat them
+ // when we are inside the subprocess of a death test.
+ const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+ // Repeats forever if the repeat count is negative.
+ const bool forever = repeat < 0;
+ for (int i = 0; forever || i != repeat; i++) {
+ // We want to preserve failures generated by ad-hoc test
+ // assertions executed before RUN_ALL_TESTS().
+ ClearNonAdHocTestResult();
+
+ const TimeInMillis start = GetTimeInMillis();
+
+ // Shuffles test cases and tests if requested.
+ if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+ random()->Reseed(random_seed_);
+ // This should be done before calling OnTestIterationStart(),
+ // such that a test event listener can see the actual test order
+ // in the event.
+ ShuffleTests();
+ }
+
+ // Tells the unit test event listeners that the tests are about to start.
+ repeater->OnTestIterationStart(*parent_, i);
+
+ // Runs each test case if there is at least one test to run.
+ if (has_tests_to_run) {
+ // Sets up all environments beforehand.
+ repeater->OnEnvironmentsSetUpStart(*parent_);
+ ForEach(environments_, SetUpEnvironment);
+ repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+ // Runs the tests only if there was no fatal failure during global
+ // set-up.
+ if (!Test::HasFatalFailure()) {
+ for (int test_index = 0; test_index < total_test_case_count();
+ test_index++) {
+ GetMutableTestCase(test_index)->Run();
+ }
+ }
+
+ // Tears down all environments in reverse order afterwards.
+ repeater->OnEnvironmentsTearDownStart(*parent_);
+ std::for_each(environments_.rbegin(), environments_.rend(),
+ TearDownEnvironment);
+ repeater->OnEnvironmentsTearDownEnd(*parent_);
+ }
+
+ elapsed_time_ = GetTimeInMillis() - start;
+
+ // Tells the unit test event listener that the tests have just finished.
+ repeater->OnTestIterationEnd(*parent_, i);
+
+ // Gets the result and clears it.
+ if (!Passed()) {
+ failed = true;
+ }
+
+ // Restores the original test order after the iteration. This
+ // allows the user to quickly repro a failure that happens in the
+ // N-th iteration without repeating the first (N - 1) iterations.
+ // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+ // case the user somehow changes the value of the flag somewhere
+ // (it's always safe to unshuffle the tests).
+ UnshuffleTests();
+
+ if (GTEST_FLAG(shuffle)) {
+ // Picks a new random seed for each iteration.
+ random_seed_ = GetNextRandomSeed(random_seed_);
+ }
+ }
+
+ repeater->OnTestProgramEnd(*parent_);
+
+ return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+ const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+ if (test_shard_file != NULL) {
+ FILE* const file = posix::FOpen(test_shard_file, "w");
+ if (file == NULL) {
+ ColoredPrintf(COLOR_RED,
+ "Could not write to the test shard status file \"%s\" "
+ "specified by the %s environment variable.\n",
+ test_shard_file, kTestShardStatusFile);
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ }
+ fclose(file);
+ }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+ const char* shard_index_env,
+ bool in_subprocess_for_death_test) {
+ if (in_subprocess_for_death_test) {
+ return false;
+ }
+
+ const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+ const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+ if (total_shards == -1 && shard_index == -1) {
+ return false;
+ } else if (total_shards == -1 && shard_index != -1) {
+ const Message msg = Message()
+ << "Invalid environment variables: you have "
+ << kTestShardIndex << " = " << shard_index
+ << ", but have left " << kTestTotalShards << " unset.\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ } else if (total_shards != -1 && shard_index == -1) {
+ const Message msg = Message()
+ << "Invalid environment variables: you have "
+ << kTestTotalShards << " = " << total_shards
+ << ", but have left " << kTestShardIndex << " unset.\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ } else if (shard_index < 0 || shard_index >= total_shards) {
+ const Message msg = Message()
+ << "Invalid environment variables: we require 0 <= "
+ << kTestShardIndex << " < " << kTestTotalShards
+ << ", but you have " << kTestShardIndex << "=" << shard_index
+ << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ }
+
+ return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+ const char* str_val = posix::GetEnv(var);
+ if (str_val == NULL) {
+ return default_val;
+ }
+
+ Int32 result;
+ if (!ParseInt32(Message() << "The value of environment variable " << var,
+ str_val, &result)) {
+ exit(EXIT_FAILURE);
+ }
+ return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+ return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+ const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+ Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+ const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+ Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+ // num_runnable_tests are the number of tests that will
+ // run across all shards (i.e., match filter and are not disabled).
+ // num_selected_tests are the number of tests to be run on
+ // this shard.
+ int num_runnable_tests = 0;
+ int num_selected_tests = 0;
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ TestCase* const test_case = test_cases_[i];
+ const std::string &test_case_name = test_case->name();
+ test_case->set_should_run(false);
+
+ for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+ TestInfo* const test_info = test_case->test_info_list()[j];
+ const std::string test_name(test_info->name());
+ // A test is disabled if test case name or test name matches
+ // kDisableTestFilter.
+ const bool is_disabled =
+ internal::UnitTestOptions::MatchesFilter(test_case_name,
+ kDisableTestFilter) ||
+ internal::UnitTestOptions::MatchesFilter(test_name,
+ kDisableTestFilter);
+ test_info->is_disabled_ = is_disabled;
+
+ const bool matches_filter =
+ internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+ test_name);
+ test_info->matches_filter_ = matches_filter;
+
+ const bool is_runnable =
+ (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+ matches_filter;
+
+ const bool is_selected = is_runnable &&
+ (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+ ShouldRunTestOnShard(total_shards, shard_index,
+ num_runnable_tests));
+
+ num_runnable_tests += is_runnable;
+ num_selected_tests += is_selected;
+
+ test_info->should_run_ = is_selected;
+ test_case->set_should_run(test_case->should_run() || is_selected);
+ }
+ }
+ return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n". If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+ if (str != NULL) {
+ for (int i = 0; *str != '\0'; ++str) {
+ if (i >= max_length) {
+ printf("...");
+ break;
+ }
+ if (*str == '\n') {
+ printf("\\n");
+ i += 2;
+ } else {
+ printf("%c", *str);
+ ++i;
+ }
+ }
+ }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+ // Print at most this many characters for each type/value parameter.
+ const int kMaxParamLength = 250;
+
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ const TestCase* const test_case = test_cases_[i];
+ bool printed_test_case_name = false;
+
+ for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+ const TestInfo* const test_info =
+ test_case->test_info_list()[j];
+ if (test_info->matches_filter_) {
+ if (!printed_test_case_name) {
+ printed_test_case_name = true;
+ printf("%s.", test_case->name());
+ if (test_case->type_param() != NULL) {
+ printf(" # %s = ", kTypeParamLabel);
+ // We print the type parameter on a single line to make
+ // the output easy to parse by a program.
+ PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+ }
+ printf("\n");
+ }
+ printf(" %s", test_info->name());
+ if (test_info->value_param() != NULL) {
+ printf(" # %s = ", kValueParamLabel);
+ // We print the value parameter on a single line to make the
+ // output easy to parse by a program.
+ PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+ }
+ printf("\n");
+ }
+ }
+ }
+ fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+ OsStackTraceGetterInterface* getter) {
+ if (os_stack_trace_getter_ != getter) {
+ delete os_stack_trace_getter_;
+ os_stack_trace_getter_ = getter;
+ }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+ if (os_stack_trace_getter_ == NULL) {
+#ifdef GTEST_OS_STACK_TRACE_GETTER_
+ os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;
+#else
+ os_stack_trace_getter_ = new OsStackTraceGetter;
+#endif // GTEST_OS_STACK_TRACE_GETTER_
+ }
+
+ return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+ return current_test_info_ ?
+ &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+ // Shuffles the death test cases.
+ ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+ // Shuffles the non-death test cases.
+ ShuffleRange(random(), last_death_test_case_ + 1,
+ static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+ // Shuffles the tests inside each test case.
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ test_cases_[i]->ShuffleTests(random());
+ }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ // Unshuffles the tests in each test case.
+ test_cases_[i]->UnshuffleTests();
+ // Resets the index of each test case.
+ test_case_indices_[i] = static_cast<int>(i);
+ }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+ int skip_count) {
+ // We pass skip_count + 1 to skip this wrapper function in addition
+ // to what the user really wants to skip.
+ return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+ // This condition is always false so AlwaysTrue() never actually throws,
+ // but it makes the compiler think that it may throw.
+ if (IsTrue(false))
+ throw ClassUniqueToAlwaysTrue();
+#endif // GTEST_HAS_EXCEPTIONS
+ return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false. None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+ const size_t prefix_len = strlen(prefix);
+ if (strncmp(*pstr, prefix, prefix_len) == 0) {
+ *pstr += prefix_len;
+ return true;
+ }
+ return false;
+}
+
+// Parses a string as a command line flag. The string should have
+// the format "--flag=value". When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+ const char* flag,
+ bool def_optional) {
+ // str and flag must not be NULL.
+ if (str == NULL || flag == NULL) return NULL;
+
+ // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+ const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+ const size_t flag_len = flag_str.length();
+ if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+ // Skips the flag name.
+ const char* flag_end = str + flag_len;
+
+ // When def_optional is true, it's OK to not have a "=value" part.
+ if (def_optional && (flag_end[0] == '\0')) {
+ return flag_end;
+ }
+
+ // If def_optional is true and there are more characters after the
+ // flag name, or if def_optional is false, there must be a '=' after
+ // the flag name.
+ if (flag_end[0] != '=') return NULL;
+
+ // Returns the string after "=".
+ return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, true);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Converts the string value to a bool.
+ *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+ return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, false);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Sets *value to the value of the flag.
+ return ParseInt32(Message() << "The value of flag --" << flag,
+ value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, false);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Sets *value to the value of the flag.
+ *value = value_str;
+ return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+ return (SkipPrefix("--", &str) ||
+ SkipPrefix("-", &str) ||
+ SkipPrefix("/", &str)) &&
+ !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+ (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+ SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text. The following escape
+// sequences can be used in the string to control the text color:
+//
+// @@ prints a single '@' character.
+// @R changes the color to red.
+// @G changes the color to green.
+// @Y changes the color to yellow.
+// @D changes to the default terminal text color.
+//
+// TODO(wan@google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+ GTestColor color = COLOR_DEFAULT; // The current color.
+
+ // Conceptually, we split the string into segments divided by escape
+ // sequences. Then we print one segment at a time. At the end of
+ // each iteration, the str pointer advances to the beginning of the
+ // next segment.
+ for (;;) {
+ const char* p = strchr(str, '@');
+ if (p == NULL) {
+ ColoredPrintf(color, "%s", str);
+ return;
+ }
+
+ ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+ const char ch = p[1];
+ str = p + 2;
+ if (ch == '@') {
+ ColoredPrintf(color, "@");
+ } else if (ch == 'D') {
+ color = COLOR_DEFAULT;
+ } else if (ch == 'R') {
+ color = COLOR_RED;
+ } else if (ch == 'G') {
+ color = COLOR_GREEN;
+ } else if (ch == 'Y') {
+ color = COLOR_YELLOW;
+ } else {
+ --str;
+ }
+ }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n"
+" List the names of all tests instead of running them. The name of\n"
+" TEST(Foo, Bar) is \"Foo.Bar\".\n"
+" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+ "[@G-@YNEGATIVE_PATTERNS]@D\n"
+" Run only the tests whose name matches one of the positive patterns but\n"
+" none of the negative patterns. '?' matches any single character; '*'\n"
+" matches any substring; ':' separates two patterns.\n"
+" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
+" Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+" Run the tests repeatedly; use a negative count to repeat forever.\n"
+" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n"
+" Randomize tests' orders on every iteration.\n"
+" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+" Random number seed to use for shuffling test orders (between 1 and\n"
+" 99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
+" Enable/disable colored output. The default is @Gauto@D.\n"
+" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n"
+" Don't print the elapsed time of each test.\n"
+" @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G"
+ GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+" Generate an XML report in the given directory or with the given file\n"
+" name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n"
+" Stream test results to the given server.\n"
+#endif // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
+" Set the default death test style.\n"
+#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n"
+" Turn assertion failures into debugger break-points.\n"
+" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n"
+" Turn assertion failures into C++ exceptions.\n"
+" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n"
+" Do not report exceptions as test failures. Instead, allow them\n"
+" to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set "
+ "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+ "color=no@D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+bool ParseGoogleTestFlag(const char* const arg) {
+ return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+ &GTEST_FLAG(also_run_disabled_tests)) ||
+ ParseBoolFlag(arg, kBreakOnFailureFlag,
+ &GTEST_FLAG(break_on_failure)) ||
+ ParseBoolFlag(arg, kCatchExceptionsFlag,
+ &GTEST_FLAG(catch_exceptions)) ||
+ ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+ ParseStringFlag(arg, kDeathTestStyleFlag,
+ &GTEST_FLAG(death_test_style)) ||
+ ParseBoolFlag(arg, kDeathTestUseFork,
+ &GTEST_FLAG(death_test_use_fork)) ||
+ ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+ ParseStringFlag(arg, kInternalRunDeathTestFlag,
+ &GTEST_FLAG(internal_run_death_test)) ||
+ ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+ ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+ ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+ ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+ ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+ ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+ ParseInt32Flag(arg, kStackTraceDepthFlag,
+ &GTEST_FLAG(stack_trace_depth)) ||
+ ParseStringFlag(arg, kStreamResultToFlag,
+ &GTEST_FLAG(stream_result_to)) ||
+ ParseBoolFlag(arg, kThrowOnFailureFlag,
+ &GTEST_FLAG(throw_on_failure));
+}
+
+#if GTEST_USE_OWN_FLAGFILE_FLAG_
+void LoadFlagsFromFile(const std::string& path) {
+ FILE* flagfile = posix::FOpen(path.c_str(), "r");
+ if (!flagfile) {
+ fprintf(stderr,
+ "Unable to open file \"%s\"\n",
+ GTEST_FLAG(flagfile).c_str());
+ fflush(stderr);
+ exit(EXIT_FAILURE);
+ }
+ std::string contents(ReadEntireFile(flagfile));
+ posix::FClose(flagfile);
+ std::vector<std::string> lines;
+ SplitString(contents, '\n', &lines);
+ for (size_t i = 0; i < lines.size(); ++i) {
+ if (lines[i].empty())
+ continue;
+ if (!ParseGoogleTestFlag(lines[i].c_str()))
+ g_help_flag = true;
+ }
+}
+#endif // GTEST_USE_OWN_FLAGFILE_FLAG_
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test. The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+ for (int i = 1; i < *argc; i++) {
+ const std::string arg_string = StreamableToString(argv[i]);
+ const char* const arg = arg_string.c_str();
+
+ using internal::ParseBoolFlag;
+ using internal::ParseInt32Flag;
+ using internal::ParseStringFlag;
+
+ bool remove_flag = false;
+ if (ParseGoogleTestFlag(arg)) {
+ remove_flag = true;
+#if GTEST_USE_OWN_FLAGFILE_FLAG_
+ } else if (ParseStringFlag(arg, kFlagfileFlag, &GTEST_FLAG(flagfile))) {
+ LoadFlagsFromFile(GTEST_FLAG(flagfile));
+ remove_flag = true;
+#endif // GTEST_USE_OWN_FLAGFILE_FLAG_
+ } else if (arg_string == "--help" || arg_string == "-h" ||
+ arg_string == "-?" || arg_string == "/?" ||
+ HasGoogleTestFlagPrefix(arg)) {
+ // Both help flag and unrecognized Google Test flags (excluding
+ // internal ones) trigger help display.
+ g_help_flag = true;
+ }
+
+ if (remove_flag) {
+ // Shift the remainder of the argv list left by one. Note
+ // that argv has (*argc + 1) elements, the last one always being
+ // NULL. The following loop moves the trailing NULL element as
+ // well.
+ for (int j = i; j != *argc; j++) {
+ argv[j] = argv[j + 1];
+ }
+
+ // Decrements the argument count.
+ (*argc)--;
+
+ // We also need to decrement the iterator as we just removed
+ // an element.
+ i--;
+ }
+ }
+
+ if (g_help_flag) {
+ // We print the help here instead of in RUN_ALL_TESTS(), as the
+ // latter may not be called at all if the user is using Google
+ // Test with another testing framework.
+ PrintColorEncoded(kColorEncodedHelpMessage);
+ }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+ ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+ ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+ // We don't want to run the initialization code twice.
+ if (GTestIsInitialized()) return;
+
+ if (*argc <= 0) return;
+
+ g_argvs.clear();
+ for (int i = 0; i != *argc; i++) {
+ g_argvs.push_back(StreamableToString(argv[i]));
+ }
+
+ ParseGoogleTestFlagsOnly(argc, argv);
+ GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+} // namespace internal
+
+// Initializes Google Test. This must be called before calling
+// RUN_ALL_TESTS(). In particular, it parses a command line for the
+// flags that Google Test recognizes. Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned. Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+ GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);
+#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+ internal::InitGoogleTestImpl(argc, argv);
+#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+ GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);
+#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+ internal::InitGoogleTestImpl(argc, argv);
+#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
+}
+
+} // namespace testing
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+# include <crt_externs.h>
+# endif // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+# include <signal.h>
+# endif // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+# include <windows.h>
+# else
+# include <sys/mman.h>
+# include <sys/wait.h>
+# endif // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+# include <spawn.h>
+# endif // GTEST_OS_QNX
+
+#endif // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick exists to
+// prevent the accidental inclusion of gtest-internal-inl.h in the
+// user's code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+ death_test_style,
+ internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+ "Indicates how to run a death test in a forked child process: "
+ "\"threadsafe\" (child process re-executes the test binary "
+ "from the beginning, running only the specific death test) or "
+ "\"fast\" (child process runs the death test immediately "
+ "after forking).");
+
+GTEST_DEFINE_bool_(
+ death_test_use_fork,
+ internal::BoolFromGTestEnv("death_test_use_fork", false),
+ "Instructs to use fork()/_exit() instead of clone() in death tests. "
+ "Ignored and always uses fork() on POSIX systems where clone() is not "
+ "implemented. Useful when running under valgrind or similar tools if "
+ "those do not support clone(). Valgrind 3.3.1 will just fail if "
+ "it sees an unsupported combination of clone() flags. "
+ "It is not recommended to use this flag w/o valgrind though it will "
+ "work in 99% of the cases. Once valgrind is fixed, this flag will "
+ "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+ internal_run_death_test, "",
+ "Indicates the file, line number, temporal index of "
+ "the single death test to run, and a file descriptor to "
+ "which a success code may be sent, all separated by "
+ "the '|' characters. This flag is specified if and only if the current "
+ "process is a sub-process launched for running a thread-safe "
+ "death test. FOR INTERNAL USE ONLY.");
+} // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+# if !GTEST_OS_WINDOWS
+static bool g_in_fast_death_test_child = false;
+# endif
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process. Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests. IMPORTANT: This is an internal utility. Using it may break the
+// implementation of death tests. User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+ // On Windows, death tests are thread-safe regardless of the value of the
+ // death_test_style flag.
+ return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe")
+ return !GTEST_FLAG(internal_run_death_test).empty();
+ else
+ return g_in_fast_death_test_child;
+#endif
+}
+
+} // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+ return exit_status == exit_code_;
+
+# else
+
+ return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+# if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
+ {
+ bool result;
+ if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) {
+ return result;
+ }
+ }
+# endif // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
+ return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+ Message m;
+
+# if GTEST_OS_WINDOWS
+
+ m << "Exited with exit status " << exit_code;
+
+# else
+
+ if (WIFEXITED(exit_code)) {
+ m << "Exited with exit status " << WEXITSTATUS(exit_code);
+ } else if (WIFSIGNALED(exit_code)) {
+ m << "Terminated by signal " << WTERMSIG(exit_code);
+ }
+# ifdef WCOREDUMP
+ if (WCOREDUMP(exit_code)) {
+ m << " (core dumped)";
+ }
+# endif
+# endif // GTEST_OS_WINDOWS
+
+ return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+ return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement. It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+ Message msg;
+ msg << "Death tests use fork(), which is unsafe particularly"
+ << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+ if (thread_count == 0)
+ msg << "couldn't detect the number of threads.";
+ else
+ msg << "detected " << thread_count << " threads.";
+ return msg.GetString();
+}
+# endif // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude. DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception. IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl@google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process. Otherwise, the
+// message is simply printed to stderr. In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+ // On a POSIX system, this function may be called from a threadsafe-style
+ // death test child process, which operates on a very small stack. Use
+ // the heap for any additional non-minuscule memory requirements.
+ const InternalRunDeathTestFlag* const flag =
+ GetUnitTestImpl()->internal_run_death_test_flag();
+ if (flag != NULL) {
+ FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+ fputc(kDeathTestInternalError, parent);
+ fprintf(parent, "%s", message.c_str());
+ fflush(parent);
+ _exit(1);
+ } else {
+ fprintf(stderr, "%s", message.c_str());
+ fflush(stderr);
+ posix::Abort();
+ }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+ do { \
+ if (!::testing::internal::IsTrue(expression)) { \
+ DeathTestAbort( \
+ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+ + ::testing::internal::StreamableToString(__LINE__) + ": " \
+ + #expression); \
+ } \
+ } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again. The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR. If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+ do { \
+ int gtest_retval; \
+ do { \
+ gtest_retval = (expression); \
+ } while (gtest_retval == -1 && errno == EINTR); \
+ if (gtest_retval == -1) { \
+ DeathTestAbort( \
+ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+ + ::testing::internal::StreamableToString(__LINE__) + ": " \
+ + #expression + " != -1"); \
+ } \
+ } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+ return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+ Message error;
+ char buffer[256];
+ int num_read;
+
+ do {
+ while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+ buffer[num_read] = '\0';
+ error << buffer;
+ }
+ } while (num_read == -1 && errno == EINTR);
+
+ if (num_read == 0) {
+ GTEST_LOG_(FATAL) << error.GetString();
+ } else {
+ const int last_error = errno;
+ GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+ << GetLastErrnoDescription() << " [" << last_error << "]";
+ }
+}
+
+// Death test constructor. Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+ TestInfo* const info = GetUnitTestImpl()->current_test_info();
+ if (info == NULL) {
+ DeathTestAbort("Cannot run a death test outside of a TEST or "
+ "TEST_F construct");
+ }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test) {
+ return GetUnitTestImpl()->death_test_factory()->Create(
+ statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+ return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+ last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+ DeathTestImpl(const char* a_statement, const RE* a_regex)
+ : statement_(a_statement),
+ regex_(a_regex),
+ spawned_(false),
+ status_(-1),
+ outcome_(IN_PROGRESS),
+ read_fd_(-1),
+ write_fd_(-1) {}
+
+ // read_fd_ is expected to be closed and cleared by a derived class.
+ ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+ void Abort(AbortReason reason);
+ virtual bool Passed(bool status_ok);
+
+ const char* statement() const { return statement_; }
+ const RE* regex() const { return regex_; }
+ bool spawned() const { return spawned_; }
+ void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+ int status() const { return status_; }
+ void set_status(int a_status) { status_ = a_status; }
+ DeathTestOutcome outcome() const { return outcome_; }
+ void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+ int read_fd() const { return read_fd_; }
+ void set_read_fd(int fd) { read_fd_ = fd; }
+ int write_fd() const { return write_fd_; }
+ void set_write_fd(int fd) { write_fd_ = fd; }
+
+ // Called in the parent process only. Reads the result code of the death
+ // test child process via a pipe, interprets it to set the outcome_
+ // member, and closes read_fd_. Outputs diagnostics and terminates in
+ // case of unexpected codes.
+ void ReadAndInterpretStatusByte();
+
+ private:
+ // The textual content of the code this object is testing. This class
+ // doesn't own this string and should not attempt to delete it.
+ const char* const statement_;
+ // The regular expression which test output must match. DeathTestImpl
+ // doesn't own this object and should not attempt to delete it.
+ const RE* const regex_;
+ // True if the death test child process has been successfully spawned.
+ bool spawned_;
+ // The exit status of the child process.
+ int status_;
+ // How the death test concluded.
+ DeathTestOutcome outcome_;
+ // Descriptor to the read end of the pipe to the child process. It is
+ // always -1 in the child process. The child keeps its write end of the
+ // pipe in write_fd_.
+ int read_fd_;
+ // Descriptor to the child's write end of the pipe to the parent process.
+ // It is always -1 in the parent process. The parent keeps its end of the
+ // pipe in read_fd_.
+ int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_. Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+ char flag;
+ int bytes_read;
+
+ // The read() here blocks until data is available (signifying the
+ // failure of the death test) or until the pipe is closed (signifying
+ // its success), so it's okay to call this in the parent before
+ // the child process has exited.
+ do {
+ bytes_read = posix::Read(read_fd(), &flag, 1);
+ } while (bytes_read == -1 && errno == EINTR);
+
+ if (bytes_read == 0) {
+ set_outcome(DIED);
+ } else if (bytes_read == 1) {
+ switch (flag) {
+ case kDeathTestReturned:
+ set_outcome(RETURNED);
+ break;
+ case kDeathTestThrew:
+ set_outcome(THREW);
+ break;
+ case kDeathTestLived:
+ set_outcome(LIVED);
+ break;
+ case kDeathTestInternalError:
+ FailFromInternalError(read_fd()); // Does not return.
+ break;
+ default:
+ GTEST_LOG_(FATAL) << "Death test child process reported "
+ << "unexpected status byte ("
+ << static_cast<unsigned int>(flag) << ")";
+ }
+ } else {
+ GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+ << GetLastErrnoDescription();
+ }
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+ set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+ // The parent process considers the death test to be a failure if
+ // it finds any data in our pipe. So, here we write a single flag byte
+ // to the pipe, then exit.
+ const char status_ch =
+ reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+ reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+ // We are leaking the descriptor here because on some platforms (i.e.,
+ // when built as Windows DLL), destructors of global objects will still
+ // run after calling _exit(). On such systems, write_fd_ will be
+ // indirectly closed from the destructor of UnitTestImpl, causing double
+ // close if it is also closed here. On debug configurations, double close
+ // may assert. As there are no in-process buffers to flush here, we are
+ // relying on the OS to close the descriptor after the process terminates
+ // when the destructors are not run.
+ _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+ ::std::string ret;
+ for (size_t at = 0; ; ) {
+ const size_t line_end = output.find('\n', at);
+ ret += "[ DEATH ] ";
+ if (line_end == ::std::string::npos) {
+ ret += output.substr(at);
+ break;
+ }
+ ret += output.substr(at, line_end + 1 - at);
+ at = line_end + 1;
+ }
+ return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+// outcome: An enumeration describing how the death test
+// concluded: DIED, LIVED, THREW, or RETURNED. The death test
+// fails in the latter three cases.
+// status: The exit status of the child process. On *nix, it is in the
+// in the format specified by wait(2). On Windows, this is the
+// value supplied to the ExitProcess() API or a numeric code
+// of the exception that terminated the program.
+// regex: A regular expression object to be applied to
+// the test's captured standard error output; the death test
+// fails if it does not match.
+//
+// Argument:
+// status_ok: true if exit_status is acceptable in the context of
+// this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met. Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+ if (!spawned())
+ return false;
+
+ const std::string error_message = GetCapturedStderr();
+
+ bool success = false;
+ Message buffer;
+
+ buffer << "Death test: " << statement() << "\n";
+ switch (outcome()) {
+ case LIVED:
+ buffer << " Result: failed to die.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case THREW:
+ buffer << " Result: threw an exception.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case RETURNED:
+ buffer << " Result: illegal return in test statement.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case DIED:
+ if (status_ok) {
+ const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+ if (matched) {
+ success = true;
+ } else {
+ buffer << " Result: died but not with expected error.\n"
+ << " Expected: " << regex()->pattern() << "\n"
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+ }
+ } else {
+ buffer << " Result: died but not with expected exit code:\n"
+ << " " << ExitSummary(status()) << "\n"
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+ }
+ break;
+ case IN_PROGRESS:
+ default:
+ GTEST_LOG_(FATAL)
+ << "DeathTest::Passed somehow called before conclusion of test";
+ }
+
+ DeathTest::set_last_death_test_message(buffer.GetString());
+ return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes: Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+// ends of it.
+// 2. The parent starts the child and provides it with the information
+// necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+// using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+// this is done before step 3, the object's reference count goes down to
+// 0 and it is destroyed, preventing the child from acquiring it. The
+// parent now has to release it, or read operations on the read end of
+// the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+// any possible error messages) from the pipe, and its stderr and then
+// determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+ WindowsDeathTest(const char* a_statement,
+ const RE* a_regex,
+ const char* file,
+ int line)
+ : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+ // All of these virtual functions are inherited from DeathTest.
+ virtual int Wait();
+ virtual TestRole AssumeRole();
+
+ private:
+ // The name of the file in which the death test is located.
+ const char* const file_;
+ // The line number on which the death test is located.
+ const int line_;
+ // Handle to the write end of the pipe to the child process.
+ AutoHandle write_handle_;
+ // Child process handle.
+ AutoHandle child_handle_;
+ // Event the child process uses to signal the parent that it has
+ // acquired the handle to the write end of the pipe. After seeing this
+ // event the parent can release its own handles to make sure its
+ // ReadFile() calls return when the child terminates.
+ AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists. As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+ if (!spawned())
+ return 0;
+
+ // Wait until the child either signals that it has acquired the write end
+ // of the pipe or it dies.
+ const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+ switch (::WaitForMultipleObjects(2,
+ wait_handles,
+ FALSE, // Waits for any of the handles.
+ INFINITE)) {
+ case WAIT_OBJECT_0:
+ case WAIT_OBJECT_0 + 1:
+ break;
+ default:
+ GTEST_DEATH_TEST_CHECK_(false); // Should not get here.
+ }
+
+ // The child has acquired the write end of the pipe or exited.
+ // We release the handle on our side and continue.
+ write_handle_.Reset();
+ event_handle_.Reset();
+
+ ReadAndInterpretStatusByte();
+
+ // Waits for the child process to exit if it haven't already. This
+ // returns immediately if the child has already exited, regardless of
+ // whether previous calls to WaitForMultipleObjects synchronized on this
+ // handle or not.
+ GTEST_DEATH_TEST_CHECK_(
+ WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+ INFINITE));
+ DWORD status_code;
+ GTEST_DEATH_TEST_CHECK_(
+ ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+ child_handle_.Reset();
+ set_status(static_cast<int>(status_code));
+ return status();
+}
+
+// The AssumeRole process for a Windows death test. It creates a child
+// process with the same executable as the current process to run the
+// death test. The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+ const UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const TestInfo* const info = impl->current_test_info();
+ const int death_test_index = info->result()->death_test_count();
+
+ if (flag != NULL) {
+ // ParseInternalRunDeathTestFlag() has performed all the necessary
+ // processing.
+ set_write_fd(flag->write_fd());
+ return EXECUTE_TEST;
+ }
+
+ // WindowsDeathTest uses an anonymous pipe to communicate results of
+ // a death test.
+ SECURITY_ATTRIBUTES handles_are_inheritable = {
+ sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+ HANDLE read_handle, write_handle;
+ GTEST_DEATH_TEST_CHECK_(
+ ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+ 0) // Default buffer size.
+ != FALSE);
+ set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+ O_RDONLY));
+ write_handle_.Reset(write_handle);
+ event_handle_.Reset(::CreateEvent(
+ &handles_are_inheritable,
+ TRUE, // The event will automatically reset to non-signaled state.
+ FALSE, // The initial state is non-signalled.
+ NULL)); // The even is unnamed.
+ GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+ const std::string filter_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+ info->test_case_name() + "." + info->name();
+ const std::string internal_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+ "=" + file_ + "|" + StreamableToString(line_) + "|" +
+ StreamableToString(death_test_index) + "|" +
+ StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+ // size_t has the same width as pointers on both 32-bit and 64-bit
+ // Windows platforms.
+ // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+ "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+ "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+ char executable_path[_MAX_PATH + 1]; // NOLINT
+ GTEST_DEATH_TEST_CHECK_(
+ _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+ executable_path,
+ _MAX_PATH));
+
+ std::string command_line =
+ std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+ internal_flag + "\"";
+
+ DeathTest::set_last_death_test_message("");
+
+ CaptureStderr();
+ // Flush the log buffers since the log streams are shared with the child.
+ FlushInfoLog();
+
+ // The child process will share the standard handles with the parent.
+ STARTUPINFOA startup_info;
+ memset(&startup_info, 0, sizeof(STARTUPINFO));
+ startup_info.dwFlags = STARTF_USESTDHANDLES;
+ startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+ startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+ startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+ PROCESS_INFORMATION process_info;
+ GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+ executable_path,
+ const_cast<char*>(command_line.c_str()),
+ NULL, // Retuned process handle is not inheritable.
+ NULL, // Retuned thread handle is not inheritable.
+ TRUE, // Child inherits all inheritable handles (for write_handle_).
+ 0x0, // Default creation flags.
+ NULL, // Inherit the parent's environment.
+ UnitTest::GetInstance()->original_working_dir(),
+ &startup_info,
+ &process_info) != FALSE);
+ child_handle_.Reset(process_info.hProcess);
+ ::CloseHandle(process_info.hThread);
+ set_spawned(true);
+ return OVERSEE_TEST;
+}
+# else // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface. Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+ ForkingDeathTest(const char* statement, const RE* regex);
+
+ // All of these virtual functions are inherited from DeathTest.
+ virtual int Wait();
+
+ protected:
+ void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+ // PID of child process during death test; 0 in the child process itself.
+ pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+ : DeathTestImpl(a_statement, a_regex),
+ child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists. As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+ if (!spawned())
+ return 0;
+
+ ReadAndInterpretStatusByte();
+
+ int status_value;
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+ set_status(status_value);
+ return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+ NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+ ForkingDeathTest(a_statement, a_regex) { }
+ virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test. It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+ const size_t thread_count = GetThreadCount();
+ if (thread_count != 1) {
+ GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+ }
+
+ int pipe_fd[2];
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+ DeathTest::set_last_death_test_message("");
+ CaptureStderr();
+ // When we fork the process below, the log file buffers are copied, but the
+ // file descriptors are shared. We flush all log files here so that closing
+ // the file descriptors in the child process doesn't throw off the
+ // synchronization between descriptors and buffers in the parent process.
+ // This is as close to the fork as possible to avoid a race condition in case
+ // there are multiple threads running before the death test, and another
+ // thread writes to the log file.
+ FlushInfoLog();
+
+ const pid_t child_pid = fork();
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+ set_child_pid(child_pid);
+ if (child_pid == 0) {
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+ set_write_fd(pipe_fd[1]);
+ // Redirects all logging to stderr in the child process to prevent
+ // concurrent writes to the log files. We capture stderr in the parent
+ // process and append the child process' output to a log.
+ LogToStderr();
+ // Event forwarding to the listeners of event listener API mush be shut
+ // down in death test subprocesses.
+ GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+ g_in_fast_death_test_child = true;
+ return EXECUTE_TEST;
+ } else {
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+ set_read_fd(pipe_fd[0]);
+ set_spawned(true);
+ return OVERSEE_TEST;
+ }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+ ExecDeathTest(const char* a_statement, const RE* a_regex,
+ const char* file, int line) :
+ ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+ virtual TestRole AssumeRole();
+ private:
+ static ::std::vector<testing::internal::string>
+ GetArgvsForDeathTestChildProcess() {
+ ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+# if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
+ ::std::vector<testing::internal::string> extra_args =
+ GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_();
+ args.insert(args.end(), extra_args.begin(), extra_args.end());
+# endif // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
+ return args;
+ }
+ // The name of the file in which the death test is located.
+ const char* const file_;
+ // The line number on which the death test is located.
+ const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+ Arguments() {
+ args_.push_back(NULL);
+ }
+
+ ~Arguments() {
+ for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+ ++i) {
+ free(*i);
+ }
+ }
+ void AddArgument(const char* argument) {
+ args_.insert(args_.end() - 1, posix::StrDup(argument));
+ }
+
+ template <typename Str>
+ void AddArguments(const ::std::vector<Str>& arguments) {
+ for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+ i != arguments.end();
+ ++i) {
+ args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+ }
+ }
+ char* const* Argv() {
+ return &args_[0];
+ }
+
+ private:
+ std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+ char* const* argv; // Command-line arguments for the child's call to exec
+ int close_fd; // File descriptor to close; the read end of a pipe
+};
+
+# if GTEST_OS_MAC
+inline char** GetEnviron() {
+ // When Google Test is built as a framework on MacOS X, the environ variable
+ // is unavailable. Apple's documentation (man environ) recommends using
+ // _NSGetEnviron() instead.
+ return *_NSGetEnviron();
+}
+# else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+# endif // GTEST_OS_MAC
+
+# if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+ ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+ // We need to execute the test program in the same environment where
+ // it was originally invoked. Therefore we change to the original
+ // working directory first.
+ const char* const original_dir =
+ UnitTest::GetInstance()->original_working_dir();
+ // We can safely call chdir() as it's a direct system call.
+ if (chdir(original_dir) != 0) {
+ DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+ }
+
+ // We can safely call execve() as it's a direct system call. We
+ // cannot use execvp() as it's a libc function and thus potentially
+ // unsafe. Since execve() doesn't search the PATH, the user must
+ // invoke the test program via a valid path that contains at least
+ // one path separator.
+ execve(args->argv[0], args->argv, GetEnviron());
+ DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+ original_dir + " failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+}
+# endif // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+ int dummy;
+ *result = (&dummy < ptr);
+}
+
+// Make sure AddressSanitizer does not tamper with the stack here.
+GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+bool StackGrowsDown() {
+ int dummy;
+ bool result;
+ StackLowerThanAddress(&dummy, &result);
+ return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test. The
+// implementation uses fork(2) + exec. On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe. On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead. The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+ ExecDeathTestArgs args = { argv, close_fd };
+ pid_t child_pid = -1;
+
+# if GTEST_OS_QNX
+ // Obtains the current directory and sets it to be closed in the child
+ // process.
+ const int cwd_fd = open(".", O_RDONLY);
+ GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+ // We need to execute the test program in the same environment where
+ // it was originally invoked. Therefore we change to the original
+ // working directory first.
+ const char* const original_dir =
+ UnitTest::GetInstance()->original_working_dir();
+ // We can safely call chdir() as it's a direct system call.
+ if (chdir(original_dir) != 0) {
+ DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+ }
+
+ int fd_flags;
+ // Set close_fd to be closed after spawn.
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+ fd_flags | FD_CLOEXEC));
+ struct inheritance inherit = {0};
+ // spawn is a system call.
+ child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+ // Restores the current working directory.
+ GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+# else // GTEST_OS_QNX
+# if GTEST_OS_LINUX
+ // When a SIGPROF signal is received while fork() or clone() are executing,
+ // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+ // it after the call to fork()/clone() is complete.
+ struct sigaction saved_sigprof_action;
+ struct sigaction ignore_sigprof_action;
+ memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+ sigemptyset(&ignore_sigprof_action.sa_mask);
+ ignore_sigprof_action.sa_handler = SIG_IGN;
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+ SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+# endif // GTEST_OS_LINUX
+
+# if GTEST_HAS_CLONE
+ const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+ if (!use_fork) {
+ static const bool stack_grows_down = StackGrowsDown();
+ const size_t stack_size = getpagesize();
+ // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+ void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+ // Maximum stack alignment in bytes: For a downward-growing stack, this
+ // amount is subtracted from size of the stack space to get an address
+ // that is within the stack space and is aligned on all systems we care
+ // about. As far as I know there is no ABI with stack alignment greater
+ // than 64. We assume stack and stack_size already have alignment of
+ // kMaxStackAlignment.
+ const size_t kMaxStackAlignment = 64;
+ void* const stack_top =
+ static_cast<char*>(stack) +
+ (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+ GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+ reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+ child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+ GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+ }
+# else
+ const bool use_fork = true;
+# endif // GTEST_HAS_CLONE
+
+ if (use_fork && (child_pid = fork()) == 0) {
+ ExecDeathTestChildMain(&args);
+ _exit(0);
+ }
+# endif // GTEST_OS_QNX
+# if GTEST_OS_LINUX
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(
+ sigaction(SIGPROF, &saved_sigprof_action, NULL));
+# endif // GTEST_OS_LINUX
+
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+ return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test. It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+ const UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const TestInfo* const info = impl->current_test_info();
+ const int death_test_index = info->result()->death_test_count();
+
+ if (flag != NULL) {
+ set_write_fd(flag->write_fd());
+ return EXECUTE_TEST;
+ }
+
+ int pipe_fd[2];
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+ // Clear the close-on-exec flag on the write end of the pipe, lest
+ // it be closed when the child process does an exec:
+ GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+ const std::string filter_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+ + info->test_case_name() + "." + info->name();
+ const std::string internal_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+ + file_ + "|" + StreamableToString(line_) + "|"
+ + StreamableToString(death_test_index) + "|"
+ + StreamableToString(pipe_fd[1]);
+ Arguments args;
+ args.AddArguments(GetArgvsForDeathTestChildProcess());
+ args.AddArgument(filter_flag.c_str());
+ args.AddArgument(internal_flag.c_str());
+
+ DeathTest::set_last_death_test_message("");
+
+ CaptureStderr();
+ // See the comment in NoExecDeathTest::AssumeRole for why the next line
+ // is necessary.
+ FlushInfoLog();
+
+ const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+ set_child_pid(child_pid);
+ set_read_fd(pipe_fd[0]);
+ set_spawned(true);
+ return OVERSEE_TEST;
+}
+
+# endif // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address. If the test should be
+// skipped, sets that pointer to NULL. Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+ const char* file, int line,
+ DeathTest** test) {
+ UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const int death_test_index = impl->current_test_info()
+ ->increment_death_test_count();
+
+ if (flag != NULL) {
+ if (death_test_index > flag->index()) {
+ DeathTest::set_last_death_test_message(
+ "Death test count (" + StreamableToString(death_test_index)
+ + ") somehow exceeded expected maximum ("
+ + StreamableToString(flag->index()) + ")");
+ return false;
+ }
+
+ if (!(flag->file() == file && flag->line() == line &&
+ flag->index() == death_test_index)) {
+ *test = NULL;
+ return true;
+ }
+ }
+
+# if GTEST_OS_WINDOWS
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+ GTEST_FLAG(death_test_style) == "fast") {
+ *test = new WindowsDeathTest(statement, regex, file, line);
+ }
+
+# else
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe") {
+ *test = new ExecDeathTest(statement, regex, file, line);
+ } else if (GTEST_FLAG(death_test_style) == "fast") {
+ *test = new NoExecDeathTest(statement, regex);
+ }
+
+# endif // GTEST_OS_WINDOWS
+
+ else { // NOLINT - this is more readable than unbalanced brackets inside #if.
+ DeathTest::set_last_death_test_message(
+ "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+ + "\" encountered");
+ return false;
+ }
+
+ return true;
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+ size_t write_handle_as_size_t,
+ size_t event_handle_as_size_t) {
+ AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+ FALSE, // Non-inheritable.
+ parent_process_id));
+ if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+ DeathTestAbort("Unable to open parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ // TODO(vladl@google.com): Replace the following check with a
+ // compile-time assertion when available.
+ GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+ const HANDLE write_handle =
+ reinterpret_cast<HANDLE>(write_handle_as_size_t);
+ HANDLE dup_write_handle;
+
+ // The newly initialized handle is accessible only in in the parent
+ // process. To obtain one accessible within the child, we need to use
+ // DuplicateHandle.
+ if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+ ::GetCurrentProcess(), &dup_write_handle,
+ 0x0, // Requested privileges ignored since
+ // DUPLICATE_SAME_ACCESS is used.
+ FALSE, // Request non-inheritable handler.
+ DUPLICATE_SAME_ACCESS)) {
+ DeathTestAbort("Unable to duplicate the pipe handle " +
+ StreamableToString(write_handle_as_size_t) +
+ " from the parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+ HANDLE dup_event_handle;
+
+ if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+ ::GetCurrentProcess(), &dup_event_handle,
+ 0x0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)) {
+ DeathTestAbort("Unable to duplicate the event handle " +
+ StreamableToString(event_handle_as_size_t) +
+ " from the parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ const int write_fd =
+ ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+ if (write_fd == -1) {
+ DeathTestAbort("Unable to convert pipe handle " +
+ StreamableToString(write_handle_as_size_t) +
+ " to a file descriptor");
+ }
+
+ // Signals the parent that the write end of the pipe has been acquired
+ // so the parent can release its own write end.
+ ::SetEvent(dup_event_handle);
+
+ return write_fd;
+}
+# endif // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+ if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+ // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+ // can use it here.
+ int line = -1;
+ int index = -1;
+ ::std::vector< ::std::string> fields;
+ SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+ int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+ unsigned int parent_process_id = 0;
+ size_t write_handle_as_size_t = 0;
+ size_t event_handle_as_size_t = 0;
+
+ if (fields.size() != 6
+ || !ParseNaturalNumber(fields[1], &line)
+ || !ParseNaturalNumber(fields[2], &index)
+ || !ParseNaturalNumber(fields[3], &parent_process_id)
+ || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+ || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+ DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+ GTEST_FLAG(internal_run_death_test));
+ }
+ write_fd = GetStatusFileDescriptor(parent_process_id,
+ write_handle_as_size_t,
+ event_handle_as_size_t);
+# else
+
+ if (fields.size() != 4
+ || !ParseNaturalNumber(fields[1], &line)
+ || !ParseNaturalNumber(fields[2], &index)
+ || !ParseNaturalNumber(fields[3], &write_fd)) {
+ DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+ + GTEST_FLAG(internal_run_death_test));
+ }
+
+# endif // GTEST_OS_WINDOWS
+
+ return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+} // namespace internal
+
+#endif // GTEST_HAS_DEATH_TEST
+
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray@gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits> // Some Linux distributions define PATH_MAX here.
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kCurrentDirectoryString[] = "./";
+#endif // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+ return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+ return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
+ // Windows CE doesn't have a current directory, so we just return
+ // something reasonable.
+ return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+ char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+ return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+ char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+ char* result = getcwd(cwd, sizeof(cwd));
+# if GTEST_OS_NACL
+ // getcwd will likely fail in NaCl due to the sandbox, so return something
+ // reasonable. The user may have provided a shim implementation for getcwd,
+ // however, so fallback only when failure is detected.
+ return FilePath(result == NULL ? kCurrentDirectoryString : cwd);
+# endif // GTEST_OS_NACL
+ return FilePath(result == NULL ? "" : cwd);
+#endif // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+ const std::string dot_extension = std::string(".") + extension;
+ if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+ return FilePath(pathname_.substr(
+ 0, pathname_.length() - dot_extension.length()));
+ }
+ return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+ const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+ // Comparing two pointers of which only one is NULL is undefined.
+ if (last_alt_sep != NULL &&
+ (last_sep == NULL || last_alt_sep > last_sep)) {
+ return last_alt_sep;
+ }
+#endif
+ return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+ const char* const last_sep = FindLastPathSeparator();
+ return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+ const char* const last_sep = FindLastPathSeparator();
+ std::string dir;
+ if (last_sep) {
+ dir = std::string(c_str(), last_sep + 1 - c_str());
+ } else {
+ dir = kCurrentDirectoryString;
+ }
+ return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+ const FilePath& base_name,
+ int number,
+ const char* extension) {
+ std::string file;
+ if (number == 0) {
+ file = base_name.string() + "." + extension;
+ } else {
+ file = base_name.string() + "_" + StreamableToString(number)
+ + "." + extension;
+ }
+ return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+ const FilePath& relative_path) {
+ if (directory.IsEmpty())
+ return relative_path;
+ const FilePath dir(directory.RemoveTrailingPathSeparator());
+ return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+ LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+ const DWORD attributes = GetFileAttributes(unicode);
+ delete [] unicode;
+ return attributes != kInvalidFileAttributes;
+#else
+ posix::StatStruct file_stat;
+ return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+ bool result = false;
+#if GTEST_OS_WINDOWS
+ // Don't strip off trailing separator if path is a root directory on
+ // Windows (like "C:\\").
+ const FilePath& path(IsRootDirectory() ? *this :
+ RemoveTrailingPathSeparator());
+#else
+ const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+ LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+ const DWORD attributes = GetFileAttributes(unicode);
+ delete [] unicode;
+ if ((attributes != kInvalidFileAttributes) &&
+ (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ result = true;
+ }
+#else
+ posix::StatStruct file_stat;
+ result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+ posix::IsDir(file_stat);
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+ return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+ // TODO(wan@google.com): on Windows a network share like
+ // \\server\share can be a root directory, although it cannot be the
+ // current directory. Handle this properly.
+ return pathname_.length() == 3 && IsAbsolutePath();
+#else
+ return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+ const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+ return pathname_.length() >= 3 &&
+ ((name[0] >= 'a' && name[0] <= 'z') ||
+ (name[0] >= 'A' && name[0] <= 'Z')) &&
+ name[1] == ':' &&
+ IsPathSeparator(name[2]);
+#else
+ return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+ const FilePath& base_name,
+ const char* extension) {
+ FilePath full_pathname;
+ int number = 0;
+ do {
+ full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+ } while (full_pathname.FileOrDirectoryExists());
+ return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+ return !pathname_.empty() &&
+ IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+ if (!this->IsDirectory()) {
+ return false;
+ }
+
+ if (pathname_.length() == 0 || this->DirectoryExists()) {
+ return true;
+ }
+
+ const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+ return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+ FilePath removed_sep(this->RemoveTrailingPathSeparator());
+ LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+ int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+ delete [] unicode;
+#elif GTEST_OS_WINDOWS
+ int result = _mkdir(pathname_.c_str());
+#else
+ int result = mkdir(pathname_.c_str(), 0777);
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+ if (result == -1) {
+ return this->DirectoryExists(); // An error is OK if the directory exists.
+ }
+ return true; // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+ return IsDirectory()
+ ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+ : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+ if (pathname_.c_str() == NULL) {
+ pathname_ = "";
+ return;
+ }
+ const char* src = pathname_.c_str();
+ char* const dest = new char[pathname_.length() + 1];
+ char* dest_ptr = dest;
+ memset(dest_ptr, 0, pathname_.length() + 1);
+
+ while (*src != '\0') {
+ *dest_ptr = *src;
+ if (!IsPathSeparator(*src)) {
+ src++;
+ } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+ if (*dest_ptr == kAlternatePathSeparator) {
+ *dest_ptr = kPathSeparator;
+ }
+#endif
+ while (IsPathSeparator(*src))
+ src++;
+ }
+ dest_ptr++;
+ }
+ *dest_ptr = '\0';
+ pathname_ = dest;
+ delete[] dest;
+}
+
+} // namespace internal
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fstream>
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>
+# include <io.h>
+# include <sys/stat.h>
+# include <map> // Used in ThreadLocal.
+#else
+# include <unistd.h>
+#endif // GTEST_OS_WINDOWS
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <fcntl.h>
+# include <sys/procfs.h>
+#endif // GTEST_OS_QNX
+
+#if GTEST_OS_AIX
+# include <procinfo.h>
+# include <sys/types.h>
+#endif // GTEST_OS_AIX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick exists to
+// prevent the accidental inclusion of gtest-internal-inl.h in the
+// user's code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif // _MSC_VER
+
+#if GTEST_OS_LINUX
+
+namespace {
+template <typename T>
+T ReadProcFileField(const string& filename, int field) {
+ std::string dummy;
+ std::ifstream file(filename.c_str());
+ while (field-- > 0) {
+ file >> dummy;
+ }
+ T output = 0;
+ file >> output;
+ return output;
+}
+} // namespace
+
+// Returns the number of active threads, or 0 when there is an error.
+size_t GetThreadCount() {
+ const string filename =
+ (Message() << "/proc/" << getpid() << "/stat").GetString();
+ return ReadProcFileField<int>(filename, 19);
+}
+
+#elif GTEST_OS_MAC
+
+size_t GetThreadCount() {
+ const task_t task = mach_task_self();
+ mach_msg_type_number_t thread_count;
+ thread_act_array_t thread_list;
+ const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+ if (status == KERN_SUCCESS) {
+ // task_threads allocates resources in thread_list and we need to free them
+ // to avoid leaks.
+ vm_deallocate(task,
+ reinterpret_cast<vm_address_t>(thread_list),
+ sizeof(thread_t) * thread_count);
+ return static_cast<size_t>(thread_count);
+ } else {
+ return 0;
+ }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+ const int fd = open("/proc/self/as", O_RDONLY);
+ if (fd < 0) {
+ return 0;
+ }
+ procfs_info process_info;
+ const int status =
+ devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+ close(fd);
+ if (status == EOK) {
+ return static_cast<size_t>(process_info.num_threads);
+ } else {
+ return 0;
+ }
+}
+
+#elif GTEST_OS_AIX
+
+size_t GetThreadCount() {
+ struct procentry64 entry;
+ pid_t pid = getpid();
+ int status = getprocs64(&entry, sizeof(entry), NULL, 0, &pid, 1);
+ if (status == 1) {
+ return entry.pi_thcount;
+ } else {
+ return 0;
+ }
+}
+
+#else
+
+size_t GetThreadCount() {
+ // There's no portable way to detect the number of threads, so we just
+ // return 0 to indicate that we cannot detect it.
+ return 0;
+}
+
+#endif // GTEST_OS_LINUX
+
+#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
+
+void SleepMilliseconds(int n) {
+ ::Sleep(n);
+}
+
+AutoHandle::AutoHandle()
+ : handle_(INVALID_HANDLE_VALUE) {}
+
+AutoHandle::AutoHandle(Handle handle)
+ : handle_(handle) {}
+
+AutoHandle::~AutoHandle() {
+ Reset();
+}
+
+AutoHandle::Handle AutoHandle::Get() const {
+ return handle_;
+}
+
+void AutoHandle::Reset() {
+ Reset(INVALID_HANDLE_VALUE);
+}
+
+void AutoHandle::Reset(HANDLE handle) {
+ // Resetting with the same handle we already own is invalid.
+ if (handle_ != handle) {
+ if (IsCloseable()) {
+ ::CloseHandle(handle_);
+ }
+ handle_ = handle;
+ } else {
+ GTEST_CHECK_(!IsCloseable())
+ << "Resetting a valid handle to itself is likely a programmer error "
+ "and thus not allowed.";
+ }
+}
+
+bool AutoHandle::IsCloseable() const {
+ // Different Windows APIs may use either of these values to represent an
+ // invalid handle.
+ return handle_ != NULL && handle_ != INVALID_HANDLE_VALUE;
+}
+
+Notification::Notification()
+ : event_(::CreateEvent(NULL, // Default security attributes.
+ TRUE, // Do not reset automatically.
+ FALSE, // Initially unset.
+ NULL)) { // Anonymous event.
+ GTEST_CHECK_(event_.Get() != NULL);
+}
+
+void Notification::Notify() {
+ GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE);
+}
+
+void Notification::WaitForNotification() {
+ GTEST_CHECK_(
+ ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0);
+}
+
+Mutex::Mutex()
+ : owner_thread_id_(0),
+ type_(kDynamic),
+ critical_section_init_phase_(0),
+ critical_section_(new CRITICAL_SECTION) {
+ ::InitializeCriticalSection(critical_section_);
+}
+
+Mutex::~Mutex() {
+ // Static mutexes are leaked intentionally. It is not thread-safe to try
+ // to clean them up.
+ // TODO(yukawa): Switch to Slim Reader/Writer (SRW) Locks, which requires
+ // nothing to clean it up but is available only on Vista and later.
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937.aspx
+ if (type_ == kDynamic) {
+ ::DeleteCriticalSection(critical_section_);
+ delete critical_section_;
+ critical_section_ = NULL;
+ }
+}
+
+void Mutex::Lock() {
+ ThreadSafeLazyInit();
+ ::EnterCriticalSection(critical_section_);
+ owner_thread_id_ = ::GetCurrentThreadId();
+}
+
+void Mutex::Unlock() {
+ ThreadSafeLazyInit();
+ // We don't protect writing to owner_thread_id_ here, as it's the
+ // caller's responsibility to ensure that the current thread holds the
+ // mutex when this is called.
+ owner_thread_id_ = 0;
+ ::LeaveCriticalSection(critical_section_);
+}
+
+// Does nothing if the current thread holds the mutex. Otherwise, crashes
+// with high probability.
+void Mutex::AssertHeld() {
+ ThreadSafeLazyInit();
+ GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId())
+ << "The current thread is not holding the mutex @" << this;
+}
+
+// Initializes owner_thread_id_ and critical_section_ in static mutexes.
+void Mutex::ThreadSafeLazyInit() {
+ // Dynamic mutexes are initialized in the constructor.
+ if (type_ == kStatic) {
+ switch (
+ ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) {
+ case 0:
+ // If critical_section_init_phase_ was 0 before the exchange, we
+ // are the first to test it and need to perform the initialization.
+ owner_thread_id_ = 0;
+ critical_section_ = new CRITICAL_SECTION;
+ ::InitializeCriticalSection(critical_section_);
+ // Updates the critical_section_init_phase_ to 2 to signal
+ // initialization complete.
+ GTEST_CHECK_(::InterlockedCompareExchange(
+ &critical_section_init_phase_, 2L, 1L) ==
+ 1L);
+ break;
+ case 1:
+ // Somebody else is already initializing the mutex; spin until they
+ // are done.
+ while (::InterlockedCompareExchange(&critical_section_init_phase_,
+ 2L,
+ 2L) != 2L) {
+ // Possibly yields the rest of the thread's time slice to other
+ // threads.
+ ::Sleep(0);
+ }
+ break;
+
+ case 2:
+ break; // The mutex is already initialized and ready for use.
+
+ default:
+ GTEST_CHECK_(false)
+ << "Unexpected value of critical_section_init_phase_ "
+ << "while initializing a static mutex.";
+ }
+ }
+}
+
+namespace {
+
+class ThreadWithParamSupport : public ThreadWithParamBase {
+ public:
+ static HANDLE CreateThread(Runnable* runnable,
+ Notification* thread_can_start) {
+ ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);
+ DWORD thread_id;
+ // TODO(yukawa): Consider to use _beginthreadex instead.
+ HANDLE thread_handle = ::CreateThread(
+ NULL, // Default security.
+ 0, // Default stack size.
+ &ThreadWithParamSupport::ThreadMain,
+ param, // Parameter to ThreadMainStatic
+ 0x0, // Default creation flags.
+ &thread_id); // Need a valid pointer for the call to work under Win98.
+ GTEST_CHECK_(thread_handle != NULL) << "CreateThread failed with error "
+ << ::GetLastError() << ".";
+ if (thread_handle == NULL) {
+ delete param;
+ }
+ return thread_handle;
+ }
+
+ private:
+ struct ThreadMainParam {
+ ThreadMainParam(Runnable* runnable, Notification* thread_can_start)
+ : runnable_(runnable),
+ thread_can_start_(thread_can_start) {
+ }
+ scoped_ptr<Runnable> runnable_;
+ // Does not own.
+ Notification* thread_can_start_;
+ };
+
+ static DWORD WINAPI ThreadMain(void* ptr) {
+ // Transfers ownership.
+ scoped_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));
+ if (param->thread_can_start_ != NULL)
+ param->thread_can_start_->WaitForNotification();
+ param->runnable_->Run();
+ return 0;
+ }
+
+ // Prohibit instantiation.
+ ThreadWithParamSupport();
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport);
+};
+
+} // namespace
+
+ThreadWithParamBase::ThreadWithParamBase(Runnable *runnable,
+ Notification* thread_can_start)
+ : thread_(ThreadWithParamSupport::CreateThread(runnable,
+ thread_can_start)) {
+}
+
+ThreadWithParamBase::~ThreadWithParamBase() {
+ Join();
+}
+
+void ThreadWithParamBase::Join() {
+ GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0)
+ << "Failed to join the thread with error " << ::GetLastError() << ".";
+}
+
+// Maps a thread to a set of ThreadIdToThreadLocals that have values
+// instantiated on that thread and notifies them when the thread exits. A
+// ThreadLocal instance is expected to persist until all threads it has
+// values on have terminated.
+class ThreadLocalRegistryImpl {
+ public:
+ // Registers thread_local_instance as having value on the current thread.
+ // Returns a value that can be used to identify the thread from other threads.
+ static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
+ const ThreadLocalBase* thread_local_instance) {
+ DWORD current_thread = ::GetCurrentThreadId();
+ MutexLock lock(&mutex_);
+ ThreadIdToThreadLocals* const thread_to_thread_locals =
+ GetThreadLocalsMapLocked();
+ ThreadIdToThreadLocals::iterator thread_local_pos =
+ thread_to_thread_locals->find(current_thread);
+ if (thread_local_pos == thread_to_thread_locals->end()) {
+ thread_local_pos = thread_to_thread_locals->insert(
+ std::make_pair(current_thread, ThreadLocalValues())).first;
+ StartWatcherThreadFor(current_thread);
+ }
+ ThreadLocalValues& thread_local_values = thread_local_pos->second;
+ ThreadLocalValues::iterator value_pos =
+ thread_local_values.find(thread_local_instance);
+ if (value_pos == thread_local_values.end()) {
+ value_pos =
+ thread_local_values
+ .insert(std::make_pair(
+ thread_local_instance,
+ linked_ptr<ThreadLocalValueHolderBase>(
+ thread_local_instance->NewValueForCurrentThread())))
+ .first;
+ }
+ return value_pos->second.get();
+ }
+
+ static void OnThreadLocalDestroyed(
+ const ThreadLocalBase* thread_local_instance) {
+ std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;
+ // Clean up the ThreadLocalValues data structure while holding the lock, but
+ // defer the destruction of the ThreadLocalValueHolderBases.
+ {
+ MutexLock lock(&mutex_);
+ ThreadIdToThreadLocals* const thread_to_thread_locals =
+ GetThreadLocalsMapLocked();
+ for (ThreadIdToThreadLocals::iterator it =
+ thread_to_thread_locals->begin();
+ it != thread_to_thread_locals->end();
+ ++it) {
+ ThreadLocalValues& thread_local_values = it->second;
+ ThreadLocalValues::iterator value_pos =
+ thread_local_values.find(thread_local_instance);
+ if (value_pos != thread_local_values.end()) {
+ value_holders.push_back(value_pos->second);
+ thread_local_values.erase(value_pos);
+ // This 'if' can only be successful at most once, so theoretically we
+ // could break out of the loop here, but we don't bother doing so.
+ }
+ }
+ }
+ // Outside the lock, let the destructor for 'value_holders' deallocate the
+ // ThreadLocalValueHolderBases.
+ }
+
+ static void OnThreadExit(DWORD thread_id) {
+ GTEST_CHECK_(thread_id != 0) << ::GetLastError();
+ std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;
+ // Clean up the ThreadIdToThreadLocals data structure while holding the
+ // lock, but defer the destruction of the ThreadLocalValueHolderBases.
+ {
+ MutexLock lock(&mutex_);
+ ThreadIdToThreadLocals* const thread_to_thread_locals =
+ GetThreadLocalsMapLocked();
+ ThreadIdToThreadLocals::iterator thread_local_pos =
+ thread_to_thread_locals->find(thread_id);
+ if (thread_local_pos != thread_to_thread_locals->end()) {
+ ThreadLocalValues& thread_local_values = thread_local_pos->second;
+ for (ThreadLocalValues::iterator value_pos =
+ thread_local_values.begin();
+ value_pos != thread_local_values.end();
+ ++value_pos) {
+ value_holders.push_back(value_pos->second);
+ }
+ thread_to_thread_locals->erase(thread_local_pos);
+ }
+ }
+ // Outside the lock, let the destructor for 'value_holders' deallocate the
+ // ThreadLocalValueHolderBases.
+ }
+
+ private:
+ // In a particular thread, maps a ThreadLocal object to its value.
+ typedef std::map<const ThreadLocalBase*,
+ linked_ptr<ThreadLocalValueHolderBase> > ThreadLocalValues;
+ // Stores all ThreadIdToThreadLocals having values in a thread, indexed by
+ // thread's ID.
+ typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;
+
+ // Holds the thread id and thread handle that we pass from
+ // StartWatcherThreadFor to WatcherThreadFunc.
+ typedef std::pair<DWORD, HANDLE> ThreadIdAndHandle;
+
+ static void StartWatcherThreadFor(DWORD thread_id) {
+ // The returned handle will be kept in thread_map and closed by
+ // watcher_thread in WatcherThreadFunc.
+ HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,
+ FALSE,
+ thread_id);
+ GTEST_CHECK_(thread != NULL);
+ // We need to to pass a valid thread ID pointer into CreateThread for it
+ // to work correctly under Win98.
+ DWORD watcher_thread_id;
+ HANDLE watcher_thread = ::CreateThread(
+ NULL, // Default security.
+ 0, // Default stack size
+ &ThreadLocalRegistryImpl::WatcherThreadFunc,
+ reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),
+ CREATE_SUSPENDED,
+ &watcher_thread_id);
+ GTEST_CHECK_(watcher_thread != NULL);
+ // Give the watcher thread the same priority as ours to avoid being
+ // blocked by it.
+ ::SetThreadPriority(watcher_thread,
+ ::GetThreadPriority(::GetCurrentThread()));
+ ::ResumeThread(watcher_thread);
+ ::CloseHandle(watcher_thread);
+ }
+
+ // Monitors exit from a given thread and notifies those
+ // ThreadIdToThreadLocals about thread termination.
+ static DWORD WINAPI WatcherThreadFunc(LPVOID param) {
+ const ThreadIdAndHandle* tah =
+ reinterpret_cast<const ThreadIdAndHandle*>(param);
+ GTEST_CHECK_(
+ ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0);
+ OnThreadExit(tah->first);
+ ::CloseHandle(tah->second);
+ delete tah;
+ return 0;
+ }
+
+ // Returns map of thread local instances.
+ static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
+ mutex_.AssertHeld();
+ static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals;
+ return map;
+ }
+
+ // Protects access to GetThreadLocalsMapLocked() and its return value.
+ static Mutex mutex_;
+ // Protects access to GetThreadMapLocked() and its return value.
+ static Mutex thread_map_mutex_;
+};
+
+Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex);
+Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex);
+
+ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread(
+ const ThreadLocalBase* thread_local_instance) {
+ return ThreadLocalRegistryImpl::GetValueOnCurrentThread(
+ thread_local_instance);
+}
+
+void ThreadLocalRegistry::OnThreadLocalDestroyed(
+ const ThreadLocalBase* thread_local_instance) {
+ ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance);
+}
+
+#endif // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE. Currently only needed for death tests.
+
+RE::~RE() {
+ if (is_valid_) {
+ // regfree'ing an invalid regex might crash because the content
+ // of the regex is undefined. Since the regex's are essentially
+ // the same, one cannot be valid (or invalid) without the other
+ // being so too.
+ regfree(&partial_regex_);
+ regfree(&full_regex_);
+ }
+ free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+ if (!re.is_valid_) return false;
+
+ regmatch_t match;
+ return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+ if (!re.is_valid_) return false;
+
+ regmatch_t match;
+ return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+ pattern_ = posix::StrDup(regex);
+
+ // Reserves enough bytes to hold the regular expression used for a
+ // full match.
+ const size_t full_regex_len = strlen(regex) + 10;
+ char* const full_pattern = new char[full_regex_len];
+
+ snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+ is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+ // We want to call regcomp(&partial_regex_, ...) even if the
+ // previous expression returns false. Otherwise partial_regex_ may
+ // not be properly initialized can may cause trouble when it's
+ // freed.
+ //
+ // Some implementation of POSIX regex (e.g. on at least some
+ // versions of Cygwin) doesn't accept the empty string as a valid
+ // regex. We change it to an equivalent form "()" to be safe.
+ if (is_valid_) {
+ const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+ is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+ }
+ EXPECT_TRUE(is_valid_)
+ << "Regular expression \"" << regex
+ << "\" is not a valid POSIX Extended regular expression.";
+
+ delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+ return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification. Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+ return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+ return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+ ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+ return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch. The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+ if (escaped) { // "\\p" where p is pattern_char.
+ switch (pattern_char) {
+ case 'd': return IsAsciiDigit(ch);
+ case 'D': return !IsAsciiDigit(ch);
+ case 'f': return ch == '\f';
+ case 'n': return ch == '\n';
+ case 'r': return ch == '\r';
+ case 's': return IsAsciiWhiteSpace(ch);
+ case 'S': return !IsAsciiWhiteSpace(ch);
+ case 't': return ch == '\t';
+ case 'v': return ch == '\v';
+ case 'w': return IsAsciiWordChar(ch);
+ case 'W': return !IsAsciiWordChar(ch);
+ }
+ return IsAsciiPunct(pattern_char) && pattern_char == ch;
+ }
+
+ return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+ return (Message() << "Syntax error at index " << index
+ << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+ if (regex == NULL) {
+ // TODO(wan@google.com): fix the source file location in the
+ // assertion failures to match where the regex is used in user
+ // code.
+ ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+ return false;
+ }
+
+ bool is_valid = true;
+
+ // True iff ?, *, or + can follow the previous atom.
+ bool prev_repeatable = false;
+ for (int i = 0; regex[i]; i++) {
+ if (regex[i] == '\\') { // An escape sequence
+ i++;
+ if (regex[i] == '\0') {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+ << "'\\' cannot appear at the end.";
+ return false;
+ }
+
+ if (!IsValidEscape(regex[i])) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+ << "invalid escape sequence \"\\" << regex[i] << "\".";
+ is_valid = false;
+ }
+ prev_repeatable = true;
+ } else { // Not an escape sequence.
+ const char ch = regex[i];
+
+ if (ch == '^' && i > 0) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'^' can only appear at the beginning.";
+ is_valid = false;
+ } else if (ch == '$' && regex[i + 1] != '\0') {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'$' can only appear at the end.";
+ is_valid = false;
+ } else if (IsInSet(ch, "()[]{}|")) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'" << ch << "' is unsupported.";
+ is_valid = false;
+ } else if (IsRepeat(ch) && !prev_repeatable) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'" << ch << "' can only follow a repeatable token.";
+ is_valid = false;
+ }
+
+ prev_repeatable = !IsInSet(ch, "^$?*+");
+ }
+ }
+
+ return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression. The regex atom is defined as c if escaped is false,
+// or \c otherwise. repeat is the repetition meta character (?, *,
+// or +). The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway. We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+ bool escaped, char c, char repeat, const char* regex,
+ const char* str) {
+ const size_t min_count = (repeat == '+') ? 1 : 0;
+ const size_t max_count = (repeat == '?') ? 1 :
+ static_cast<size_t>(-1) - 1;
+ // We cannot call numeric_limits::max() as it conflicts with the
+ // max() macro on Windows.
+
+ for (size_t i = 0; i <= max_count; ++i) {
+ // We know that the atom matches each of the first i characters in str.
+ if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+ // We have enough matches at the head, and the tail matches too.
+ // Since we only care about *whether* the pattern matches str
+ // (as opposed to *how* it matches), there is no need to find a
+ // greedy match.
+ return true;
+ }
+ if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+ return false;
+ }
+ return false;
+}
+
+// Returns true iff regex matches a prefix of str. regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+ if (*regex == '\0') // An empty regex matches a prefix of anything.
+ return true;
+
+ // "$" only matches the end of a string. Note that regex being
+ // valid guarantees that there's nothing after "$" in it.
+ if (*regex == '$')
+ return *str == '\0';
+
+ // Is the first thing in regex an escape sequence?
+ const bool escaped = *regex == '\\';
+ if (escaped)
+ ++regex;
+ if (IsRepeat(regex[1])) {
+ // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+ // here's an indirect recursion. It terminates as the regex gets
+ // shorter in each recursion.
+ return MatchRepetitionAndRegexAtHead(
+ escaped, regex[0], regex[1], regex + 2, str);
+ } else {
+ // regex isn't empty, isn't "$", and doesn't start with a
+ // repetition. We match the first atom of regex with the first
+ // character of str and recurse.
+ return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+ MatchRegexAtHead(regex + 1, str + 1);
+ }
+}
+
+// Returns true iff regex matches any substring of str. regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally. In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+ if (regex == NULL || str == NULL)
+ return false;
+
+ if (*regex == '^')
+ return MatchRegexAtHead(regex + 1, str);
+
+ // A successful match can be anywhere in str.
+ do {
+ if (MatchRegexAtHead(regex, str))
+ return true;
+ } while (*str++ != '\0');
+ return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+ free(const_cast<char*>(pattern_));
+ free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+ return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+ return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+ pattern_ = full_pattern_ = NULL;
+ if (regex != NULL) {
+ pattern_ = posix::StrDup(regex);
+ }
+
+ is_valid_ = ValidateRegex(regex);
+ if (!is_valid_) {
+ // No need to calculate the full pattern when the regex is invalid.
+ return;
+ }
+
+ const size_t len = strlen(regex);
+ // Reserves enough bytes to hold the regular expression used for a
+ // full match: we need space to prepend a '^', append a '$', and
+ // terminate the string with '\0'.
+ char* buffer = static_cast<char*>(malloc(len + 3));
+ full_pattern_ = buffer;
+
+ if (*regex != '^')
+ *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
+
+ // We don't use snprintf or strncpy, as they trigger a warning when
+ // compiled with VC++ 8.0.
+ memcpy(buffer, regex, len);
+ buffer += len;
+
+ if (len == 0 || regex[len - 1] != '$')
+ *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
+
+ *buffer = '\0';
+}
+
+#endif // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+ const std::string file_name(file == NULL ? kUnknownFile : file);
+
+ if (line < 0) {
+ return file_name + ":";
+ }
+#ifdef _MSC_VER
+ return file_name + "(" + StreamableToString(line) + "):";
+#else
+ return file_name + ":" + StreamableToString(line) + ":";
+#endif // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+ const char* file, int line) {
+ const std::string file_name(file == NULL ? kUnknownFile : file);
+
+ if (line < 0)
+ return file_name;
+ else
+ return file_name + ":" + StreamableToString(line);
+}
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+ : severity_(severity) {
+ const char* const marker =
+ severity == GTEST_INFO ? "[ INFO ]" :
+ severity == GTEST_WARNING ? "[WARNING]" :
+ severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
+ GetStream() << ::std::endl << marker << " "
+ << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+ GetStream() << ::std::endl;
+ if (severity_ == GTEST_FATAL) {
+ fflush(stderr);
+ posix::Abort();
+ }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+ // The ctor redirects the stream to a temporary file.
+ explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+ char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
+ char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
+
+ ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+ const UINT success = ::GetTempFileNameA(temp_dir_path,
+ "gtest_redir",
+ 0, // Generate unique file name.
+ temp_file_path);
+ GTEST_CHECK_(success != 0)
+ << "Unable to create a temporary file in " << temp_dir_path;
+ const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+ GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+ << temp_file_path;
+ filename_ = temp_file_path;
+# else
+ // There's no guarantee that a test has write access to the current
+ // directory, so we create the temporary file in the /tmp directory
+ // instead. We use /tmp on most systems, and /sdcard on Android.
+ // That's because Android doesn't have /tmp.
+# if GTEST_OS_LINUX_ANDROID
+ // Note: Android applications are expected to call the framework's
+ // Context.getExternalStorageDirectory() method through JNI to get
+ // the location of the world-writable SD Card directory. However,
+ // this requires a Context handle, which cannot be retrieved
+ // globally from native code. Doing so also precludes running the
+ // code as part of a regular standalone executable, which doesn't
+ // run in a Dalvik process (e.g. when running it through 'adb shell').
+ //
+ // The location /sdcard is directly accessible from native code
+ // and is the only location (unofficially) supported by the Android
+ // team. It's generally a symlink to the real SD Card mount point
+ // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+ // other OEM-customized locations. Never rely on these, and always
+ // use /sdcard.
+ char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+# else
+ char name_template[] = "/tmp/captured_stream.XXXXXX";
+# endif // GTEST_OS_LINUX_ANDROID
+ const int captured_fd = mkstemp(name_template);
+ filename_ = name_template;
+# endif // GTEST_OS_WINDOWS
+ fflush(NULL);
+ dup2(captured_fd, fd_);
+ close(captured_fd);
+ }
+
+ ~CapturedStream() {
+ remove(filename_.c_str());
+ }
+
+ std::string GetCapturedString() {
+ if (uncaptured_fd_ != -1) {
+ // Restores the original stream.
+ fflush(NULL);
+ dup2(uncaptured_fd_, fd_);
+ close(uncaptured_fd_);
+ uncaptured_fd_ = -1;
+ }
+
+ FILE* const file = posix::FOpen(filename_.c_str(), "r");
+ const std::string content = ReadEntireFile(file);
+ posix::FClose(file);
+ return content;
+ }
+
+ private:
+ const int fd_; // A stream to capture.
+ int uncaptured_fd_;
+ // Name of the temporary file holding the stderr output.
+ ::std::string filename_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+ if (*stream != NULL) {
+ GTEST_LOG_(FATAL) << "Only one " << stream_name
+ << " capturer can exist at a time.";
+ }
+ *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+ const std::string content = (*captured_stream)->GetCapturedString();
+
+ delete *captured_stream;
+ *captured_stream = NULL;
+
+ return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+ CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+ CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+ return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+ return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+std::string TempDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+ return "\\temp\\";
+#elif GTEST_OS_WINDOWS
+ const char* temp_dir = posix::GetEnv("TEMP");
+ if (temp_dir == NULL || temp_dir[0] == '\0')
+ return "\\temp\\";
+ else if (temp_dir[strlen(temp_dir) - 1] == '\\')
+ return temp_dir;
+ else
+ return std::string(temp_dir) + "\\";
+#elif GTEST_OS_LINUX_ANDROID
+ return "/sdcard/";
+#else
+ return "/tmp/";
+#endif // GTEST_OS_WINDOWS_MOBILE
+}
+
+size_t GetFileSize(FILE* file) {
+ fseek(file, 0, SEEK_END);
+ return static_cast<size_t>(ftell(file));
+}
+
+std::string ReadEntireFile(FILE* file) {
+ const size_t file_size = GetFileSize(file);
+ char* const buffer = new char[file_size];
+
+ size_t bytes_last_read = 0; // # of bytes read in the last fread()
+ size_t bytes_read = 0; // # of bytes read so far
+
+ fseek(file, 0, SEEK_SET);
+
+ // Keeps reading the file until we cannot read further or the
+ // pre-determined file size is reached.
+ do {
+ bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+ bytes_read += bytes_last_read;
+ } while (bytes_last_read > 0 && bytes_read < file_size);
+
+ const std::string content(buffer, bytes_read);
+ delete[] buffer;
+
+ return content;
+}
+
+#if GTEST_HAS_DEATH_TEST
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+ NULL; // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+ if (g_injected_test_argvs != argvs)
+ delete g_injected_test_argvs;
+ g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+ if (g_injected_test_argvs != NULL) {
+ return *g_injected_test_argvs;
+ }
+ return GetArgvs();
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+ DebugBreak();
+ TerminateProcess(GetCurrentProcess(), 1);
+}
+} // namespace posix
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag. For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+ const std::string full_flag =
+ (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+ Message env_var;
+ for (size_t i = 0; i != full_flag.length(); i++) {
+ env_var << ToUpper(full_flag.c_str()[i]);
+ }
+
+ return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer. If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+ // Parses the environment variable as a decimal integer.
+ char* end = NULL;
+ const long long_value = strtol(str, &end, 10); // NOLINT
+
+ // Has strtol() consumed all characters in the string?
+ if (*end != '\0') {
+ // No - an invalid character was encountered.
+ Message msg;
+ msg << "WARNING: " << src_text
+ << " is expected to be a 32-bit integer, but actually"
+ << " has value \"" << str << "\".\n";
+ printf("%s", msg.GetString().c_str());
+ fflush(stdout);
+ return false;
+ }
+
+ // Is the parsed value in the range of an Int32?
+ const Int32 result = static_cast<Int32>(long_value);
+ if (long_value == LONG_MAX || long_value == LONG_MIN ||
+ // The parsed value overflows as a long. (strtol() returns
+ // LONG_MAX or LONG_MIN when the input overflows.)
+ result != long_value
+ // The parsed value overflows as an Int32.
+ ) {
+ Message msg;
+ msg << "WARNING: " << src_text
+ << " is expected to be a 32-bit integer, but actually"
+ << " has value " << str << ", which overflows.\n";
+ printf("%s", msg.GetString().c_str());
+ fflush(stdout);
+ return false;
+ }
+
+ *value = result;
+ return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+#if defined(GTEST_GET_BOOL_FROM_ENV_)
+ return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);
+#endif // defined(GTEST_GET_BOOL_FROM_ENV_)
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* const string_value = posix::GetEnv(env_var.c_str());
+ return string_value == NULL ?
+ default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+#if defined(GTEST_GET_INT32_FROM_ENV_)
+ return GTEST_GET_INT32_FROM_ENV_(flag, default_value);
+#endif // defined(GTEST_GET_INT32_FROM_ENV_)
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* const string_value = posix::GetEnv(env_var.c_str());
+ if (string_value == NULL) {
+ // The environment variable is not set.
+ return default_value;
+ }
+
+ Int32 result = default_value;
+ if (!ParseInt32(Message() << "Environment variable " << env_var,
+ string_value, &result)) {
+ printf("The default value %s is used.\n",
+ (Message() << default_value).GetString().c_str());
+ fflush(stdout);
+ return default_value;
+ }
+
+ return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+std::string StringFromGTestEnv(const char* flag, const char* default_value) {
+#if defined(GTEST_GET_STRING_FROM_ENV_)
+ return GTEST_GET_STRING_FROM_ENV_(flag, default_value);
+#endif // defined(GTEST_GET_STRING_FROM_ENV_)
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* value = posix::GetEnv(env_var.c_str());
+ if (value != NULL) {
+ return value;
+ }
+
+ // As a special case for the 'output' flag, if GTEST_OUTPUT is not
+ // set, we look for XML_OUTPUT_FILE, which is set by the Bazel build
+ // system. The value of XML_OUTPUT_FILE is a filename without the
+ // "xml:" prefix of GTEST_OUTPUT.
+ //
+ // The net priority order after flag processing is thus:
+ // --gtest_output command line flag
+ // GTEST_OUTPUT environment variable
+ // XML_OUTPUT_FILE environment variable
+ // 'default_value'
+ if (strcmp(flag, "output") == 0) {
+ value = posix::GetEnv("XML_OUTPUT_FILE");
+ if (value != NULL) {
+ return std::string("xml:") + value;
+ }
+ }
+ return default_value;
+}
+
+} // namespace internal
+} // namespace testing
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise. A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <cwchar>
+#include <ostream> // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
+GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+ size_t count, ostream* os) {
+ char text[5] = "";
+ for (size_t i = 0; i != count; i++) {
+ const size_t j = start + i;
+ if (i != 0) {
+ // Organizes the bytes into groups of 2 for easy parsing by
+ // human.
+ if ((j % 2) == 0)
+ *os << ' ';
+ else
+ *os << '-';
+ }
+ GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+ *os << text;
+ }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+ ostream* os) {
+ // Tells the user how big the object is.
+ *os << count << "-byte object <";
+
+ const size_t kThreshold = 132;
+ const size_t kChunkSize = 64;
+ // If the object size is bigger than kThreshold, we'll have to omit
+ // some details by printing only the first and the last kChunkSize
+ // bytes.
+ // TODO(wan): let the user control the threshold using a flag.
+ if (count < kThreshold) {
+ PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+ } else {
+ PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+ *os << " ... ";
+ // Rounds up to 2-byte boundary.
+ const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+ PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+ }
+ *os << ">";
+}
+
+} // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object. The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+ ostream* os) {
+ PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+} // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+// - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+// - as a hexidecimal escape sequence (e.g. '\x7F'), or
+// - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+ kAsIs,
+ kHexEscape,
+ kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character. We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+ return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+ switch (static_cast<wchar_t>(c)) {
+ case L'\0':
+ *os << "\\0";
+ break;
+ case L'\'':
+ *os << "\\'";
+ break;
+ case L'\\':
+ *os << "\\\\";
+ break;
+ case L'\a':
+ *os << "\\a";
+ break;
+ case L'\b':
+ *os << "\\b";
+ break;
+ case L'\f':
+ *os << "\\f";
+ break;
+ case L'\n':
+ *os << "\\n";
+ break;
+ case L'\r':
+ *os << "\\r";
+ break;
+ case L'\t':
+ *os << "\\t";
+ break;
+ case L'\v':
+ *os << "\\v";
+ break;
+ default:
+ if (IsPrintableAscii(c)) {
+ *os << static_cast<char>(c);
+ return kAsIs;
+ } else {
+ *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+ return kHexEscape;
+ }
+ }
+ return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+ switch (c) {
+ case L'\'':
+ *os << "'";
+ return kAsIs;
+ case L'"':
+ *os << "\\\"";
+ return kSpecialEscape;
+ default:
+ return PrintAsCharLiteralTo<wchar_t>(c, os);
+ }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+ return PrintAsStringLiteralTo(
+ static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code. '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence. The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+ // First, print c as a literal in the most readable form we can find.
+ *os << ((sizeof(c) > 1) ? "L'" : "'");
+ const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+ *os << "'";
+
+ // To aid user debugging, we also print c's code in decimal, unless
+ // it's 0 (in which case c was printed as '\\0', making the code
+ // obvious).
+ if (c == 0)
+ return;
+ *os << " (" << static_cast<int>(c);
+
+ // For more convenience, we print c's code again in hexidecimal,
+ // unless c was already printed in the form '\x##' or the code is in
+ // [1, 9].
+ if (format == kHexEscape || (1 <= c && c <= 9)) {
+ // Do nothing.
+ } else {
+ *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+ }
+ *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+ PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+ PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code. L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+ PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream. CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
+GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
+static void PrintCharsAsStringTo(
+ const CharType* begin, size_t len, ostream* os) {
+ const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+ *os << kQuoteBegin;
+ bool is_previous_hex = false;
+ for (size_t index = 0; index < len; ++index) {
+ const CharType cur = begin[index];
+ if (is_previous_hex && IsXDigit(cur)) {
+ // Previous character is of '\x..' form and this character can be
+ // interpreted as another hexadecimal digit in its number. Break string to
+ // disambiguate.
+ *os << "\" " << kQuoteBegin;
+ }
+ is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+ }
+ *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'. CharType must be either char or wchar_t.
+template <typename CharType>
+GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
+GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
+static void UniversalPrintCharArray(
+ const CharType* begin, size_t len, ostream* os) {
+ // The code
+ // const char kFoo[] = "foo";
+ // generates an array of 4, not 3, elements, with the last one being '\0'.
+ //
+ // Therefore when printing a char array, we don't print the last element if
+ // it's '\0', such that the output matches the string literal as it's
+ // written in the source code.
+ if (len > 0 && begin[len - 1] == '\0') {
+ PrintCharsAsStringTo(begin, len - 1, os);
+ return;
+ }
+
+ // If, however, the last element in the array is not '\0', e.g.
+ // const char kFoo[] = { 'f', 'o', 'o' };
+ // we must print the entire array. We also print a message to indicate
+ // that the array is not NUL-terminated.
+ PrintCharsAsStringTo(begin, len, os);
+ *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+ UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+ UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+ if (s == NULL) {
+ *os << "NULL";
+ } else {
+ *os << ImplicitCast_<const void*>(s) << " pointing to ";
+ PrintCharsAsStringTo(s, strlen(s), os);
+ }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+ if (s == NULL) {
+ *os << "NULL";
+ } else {
+ *os << ImplicitCast_<const void*>(s) << " pointing to ";
+ PrintCharsAsStringTo(s, std::wcslen(s), os);
+ }
+}
+#endif // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+} // namespace internal
+
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule@google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick exists to
+// prevent the accidental inclusion of gtest-internal-inl.h in the
+// user's code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+ const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+ return stack_trace == NULL ? message :
+ std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+ return os
+ << result.file_name() << ":" << result.line_number() << ": "
+ << (result.type() == TestPartResult::kSuccess ? "Success" :
+ result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+ "Non-fatal failure") << ":\n"
+ << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+ array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+ if (index < 0 || index >= size()) {
+ printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+ internal::posix::Abort();
+ }
+
+ return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+ return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+ : has_new_fatal_failure_(false),
+ original_reporter_(GetUnitTestImpl()->
+ GetTestPartResultReporterForCurrentThread()) {
+ GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+ GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+ original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+ const TestPartResult& result) {
+ if (result.fatally_failed())
+ has_new_fatal_failure_ = true;
+ original_reporter_->ReportTestPartResult(result);
+}
+
+} // namespace internal
+
+} // namespace testing
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+ while (IsSpace(*str))
+ str++;
+ return str;
+}
+
+static std::vector<std::string> SplitIntoTestNames(const char* src) {
+ std::vector<std::string> name_vec;
+ src = SkipSpaces(src);
+ for (; src != NULL; src = SkipComma(src)) {
+ name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));
+ }
+ return name_vec;
+}
+
+// Verifies that registered_tests match the test names in
+// registered_tests_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+ const char* file, int line, const char* registered_tests) {
+ typedef RegisteredTestsMap::const_iterator RegisteredTestIter;
+ registered_ = true;
+
+ std::vector<std::string> name_vec = SplitIntoTestNames(registered_tests);
+
+ Message errors;
+
+ std::set<std::string> tests;
+ for (std::vector<std::string>::const_iterator name_it = name_vec.begin();
+ name_it != name_vec.end(); ++name_it) {
+ const std::string& name = *name_it;
+ if (tests.count(name) != 0) {
+ errors << "Test " << name << " is listed more than once.\n";
+ continue;
+ }
+
+ bool found = false;
+ for (RegisteredTestIter it = registered_tests_.begin();
+ it != registered_tests_.end();
+ ++it) {
+ if (name == it->first) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ tests.insert(name);
+ } else {
+ errors << "No test named " << name
+ << " can be found in this test case.\n";
+ }
+ }
+
+ for (RegisteredTestIter it = registered_tests_.begin();
+ it != registered_tests_.end();
+ ++it) {
+ if (tests.count(it->first) == 0) {
+ errors << "You forgot to list test " << it->first << ".\n";
+ }
+ }
+
+ const std::string& errors_str = errors.GetString();
+ if (errors_str != "") {
+ fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+ errors_str.c_str());
+ fflush(stderr);
+ posix::Abort();
+ }
+
+ return registered_tests;
+}
+
+#endif // GTEST_HAS_TYPED_TEST_P
+
+} // namespace internal
+} // namespace testing
diff --git a/ext/gtest/gtest.h b/ext/gtest/gtest.h
new file mode 100644
index 0000000..e0039f7
--- /dev/null
+++ b/ext/gtest/gtest.h
@@ -0,0 +1,21203 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test. It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test. They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan@google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms. All macros ending with _ and symbols defined in an
+// internal namespace are subject to change without notice. Code
+// outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't
+// end with _ are part of Google Test's public API and can be used by
+// code outside Google Test.
+//
+// This file is fundamental to Google Test. All other Google Test source
+// files are expected to #include this. Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// Environment-describing macros
+// -----------------------------
+//
+// Google Test can be used in many different environments. Macros in
+// this section tell Google Test what kind of environment it is being
+// used in, such that Google Test can provide environment-specific
+// features and implementations.
+//
+// Google Test tries to automatically detect the properties of its
+// environment, so users usually don't need to worry about these
+// macros. However, the automatic detection is not perfect.
+// Sometimes it's necessary for a user to define some of the following
+// macros in the build script to override Google Test's decisions.
+//
+// If the user doesn't define a macro in the list, Google Test will
+// provide a default definition. After this header is #included, all
+// macros in this list will be defined to either 1 or 0.
+//
+// Notes to maintainers:
+// - Each macro here is a user-tweakable knob; do not grow the list
+// lightly.
+// - Use #if to key off these macros. Don't use #ifdef or "#if
+// defined(...)", which will not work as these macros are ALWAYS
+// defined.
+//
+// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
+// is/isn't available.
+// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
+// are enabled.
+// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
+// is/isn't available (some systems define
+// ::string, which is different to std::string).
+// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+// is/isn't available (some systems define
+// ::wstring, which is different to std::wstring).
+// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
+// expressions are/aren't available.
+// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
+// is/isn't available.
+// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
+// enabled.
+// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
+// std::wstring does/doesn't work (Google Test can
+// be used where std::wstring is unavailable).
+// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
+// is/isn't available.
+// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
+// compiler supports Microsoft's "Structured
+// Exception Handling".
+// GTEST_HAS_STREAM_REDIRECTION
+// - Define it to 1/0 to indicate whether the
+// platform supports I/O stream redirection using
+// dup() and dup2().
+// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
+// Test's own tr1 tuple implementation should be
+// used. Unused when the user sets
+// GTEST_HAS_TR1_TUPLE to 0.
+// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test
+// is building in C++11/C++98 mode.
+// GTEST_LINKED_AS_SHARED_LIBRARY
+// - Define to 1 when compiling tests that use
+// Google Test as a shared library (known as
+// DLL on Windows).
+// GTEST_CREATE_SHARED_LIBRARY
+// - Define to 1 when compiling Google Test itself
+// as a shared library.
+
+// Platform-indicating macros
+// --------------------------
+//
+// Macros indicating the platform on which Google Test is being used
+// (a macro is defined to 1 if compiled on the given platform;
+// otherwise UNDEFINED -- it's never defined to 0.). Google Test
+// defines these macros automatically. Code outside Google Test MUST
+// NOT define them.
+//
+// GTEST_OS_AIX - IBM AIX
+// GTEST_OS_CYGWIN - Cygwin
+// GTEST_OS_FREEBSD - FreeBSD
+// GTEST_OS_HPUX - HP-UX
+// GTEST_OS_LINUX - Linux
+// GTEST_OS_LINUX_ANDROID - Google Android
+// GTEST_OS_MAC - Mac OS X
+// GTEST_OS_IOS - iOS
+// GTEST_OS_NACL - Google Native Client (NaCl)
+// GTEST_OS_OPENBSD - OpenBSD
+// GTEST_OS_QNX - QNX
+// GTEST_OS_SOLARIS - Sun Solaris
+// GTEST_OS_SYMBIAN - Symbian
+// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
+// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
+// GTEST_OS_WINDOWS_MINGW - MinGW
+// GTEST_OS_WINDOWS_MOBILE - Windows Mobile
+// GTEST_OS_WINDOWS_PHONE - Windows Phone
+// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT
+// GTEST_OS_ZOS - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support. Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable. If you notice any problems on your platform, please notify
+// googletestframework@googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// It is possible that none of the GTEST_OS_* macros are defined.
+
+// Feature-indicating macros
+// -------------------------
+//
+// Macros indicating which Google Test features are available (a macro
+// is defined to 1 if the corresponding feature is supported;
+// otherwise UNDEFINED -- it's never defined to 0.). Google Test
+// defines these macros automatically. Code outside Google Test MUST
+// NOT define them.
+//
+// These macros are public so that portable tests can be written.
+// Such tests typically surround code using a feature with an #if
+// which controls that code. For example:
+//
+// #if GTEST_HAS_DEATH_TEST
+// EXPECT_DEATH(DoSomethingDeadly());
+// #endif
+//
+// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
+// tests)
+// GTEST_HAS_DEATH_TEST - death tests
+// GTEST_HAS_PARAM_TEST - value-parameterized tests
+// GTEST_HAS_TYPED_TEST - typed tests
+// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+// GTEST_IS_THREADSAFE - Google Test is thread-safe.
+// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
+// GTEST_HAS_POSIX_RE (see above) which users can
+// define themselves.
+// GTEST_USES_SIMPLE_RE - our own simple regex is used;
+// the above two are mutually exclusive.
+// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+
+// Misc public macros
+// ------------------
+//
+// GTEST_FLAG(flag_name) - references the variable corresponding to
+// the given Google Test flag.
+
+// Internal utilities
+// ------------------
+//
+// The following macros and utilities are for Google Test's INTERNAL
+// use only. Code outside Google Test MUST NOT USE THEM DIRECTLY.
+//
+// Macros for basic C++ coding:
+// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
+// variable don't have to be used.
+// GTEST_DISALLOW_ASSIGN_ - disables operator=.
+// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
+// GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is
+// suppressed (constant conditional).
+// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
+// is suppressed.
+//
+// C++11 feature wrappers:
+//
+// testing::internal::move - portability wrapper for std::move.
+//
+// Synchronization:
+// Mutex, MutexLock, ThreadLocal, GetThreadCount()
+// - synchronization primitives.
+//
+// Template meta programming:
+// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
+// IteratorTraits - partial implementation of std::iterator_traits, which
+// is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+// scoped_ptr - as in TR2.
+//
+// Regular expressions:
+// RE - a simple regular expression class using the POSIX
+// Extended Regular Expression syntax on UNIX-like
+// platforms, or a reduced regular exception syntax on
+// other platforms, including Windows.
+//
+// Logging:
+// GTEST_LOG_() - logs messages at the specified severity level.
+// LogToStderr() - directs all log messages to stderr.
+// FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+// CaptureStdout() - starts capturing stdout.
+// GetCapturedStdout() - stops capturing stdout and returns the captured
+// string.
+// CaptureStderr() - starts capturing stderr.
+// GetCapturedStderr() - stops capturing stderr and returns the captured
+// string.
+//
+// Integer types:
+// TypeWithSize - maps an integer to a int type.
+// Int32, UInt32, Int64, UInt64, TimeInMillis
+// - integers of known sizes.
+// BiggestInt - the biggest signed integer type.
+//
+// Command-line utilities:
+// GTEST_DECLARE_*() - declares a flag.
+// GTEST_DEFINE_*() - defines a flag.
+// GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+// GetEnv() - gets the value of an environment variable.
+// BoolFromGTestEnv() - parses a bool environment variable.
+// Int32FromGTestEnv() - parses an Int32 environment variable.
+// StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h> // for isspace, etc
+#include <stddef.h> // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <algorithm> // NOLINT
+#include <iostream> // NOLINT
+#include <sstream> // NOLINT
+#include <string> // NOLINT
+#include <utility>
+#include <vector> // NOLINT
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the GTEST_OS_* macro.
+// It is separate from gtest-port.h so that custom/gtest-port.h can include it.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+# define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+# define GTEST_OS_WINDOWS_MINGW 1
+# elif defined(WINAPI_FAMILY)
+# include <winapifamily.h>
+# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+# define GTEST_OS_WINDOWS_DESKTOP 1
+# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
+# define GTEST_OS_WINDOWS_PHONE 1
+# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+# define GTEST_OS_WINDOWS_RT 1
+# else
+ // WINAPI_FAMILY defined but no known partition matched.
+ // Default to desktop.
+# define GTEST_OS_WINDOWS_DESKTOP 1
+# endif
+# else
+# define GTEST_OS_WINDOWS_DESKTOP 1
+# endif // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+# define GTEST_OS_IOS 1
+# endif
+#elif defined __FreeBSD__
+# define GTEST_OS_FREEBSD 1
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+# define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif // __CYGWIN__
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Injection point for custom user configurations.
+// The following macros can be defined:
+//
+// Flag related macros:
+// GTEST_FLAG(flag_name)
+// GTEST_USE_OWN_FLAGFILE_FLAG_ - Define to 0 when the system provides its
+// own flagfile flag parsing.
+// GTEST_DECLARE_bool_(name)
+// GTEST_DECLARE_int32_(name)
+// GTEST_DECLARE_string_(name)
+// GTEST_DEFINE_bool_(name, default_val, doc)
+// GTEST_DEFINE_int32_(name, default_val, doc)
+// GTEST_DEFINE_string_(name, default_val, doc)
+//
+// Test filtering:
+// GTEST_TEST_FILTER_ENV_VAR_ - The name of an environment variable that
+// will be used if --GTEST_FLAG(test_filter)
+// is not provided.
+//
+// Logging:
+// GTEST_LOG_(severity)
+// GTEST_CHECK_(condition)
+// Functions LogToStderr() and FlushInfoLog() have to be provided too.
+//
+// Threading:
+// GTEST_HAS_NOTIFICATION_ - Enabled if Notification is already provided.
+// GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - Enabled if Mutex and ThreadLocal are
+// already provided.
+// Must also provide GTEST_DECLARE_STATIC_MUTEX_(mutex) and
+// GTEST_DEFINE_STATIC_MUTEX_(mutex)
+//
+// GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+// GTEST_LOCK_EXCLUDED_(locks)
+//
+// ** Custom implementation starts here **
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
+
+#if !defined(GTEST_DEV_EMAIL_)
+# define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+# define GTEST_FLAG_PREFIX_ "gtest_"
+# define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+# define GTEST_NAME_ "Google Test"
+# define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
+#endif // !defined(GTEST_DEV_EMAIL_)
+
+#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
+# define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"
+#endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif // __GNUC__
+
+// Macros for disabling Microsoft Visual C++ warnings.
+//
+// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
+// /* code that triggers warnings C4800 and C4385 */
+// GTEST_DISABLE_MSC_WARNINGS_POP_()
+#if _MSC_VER >= 1500
+# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable: warnings))
+# define GTEST_DISABLE_MSC_WARNINGS_POP_() \
+ __pragma(warning(pop))
+#else
+// Older versions of MSVC don't have __pragma.
+# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
+# define GTEST_DISABLE_MSC_WARNINGS_POP_()
+#endif
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+# define GTEST_LANG_CXX11 1
+# else
+# define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Distinct from C++11 language support, some environments don't provide
+// proper C++11 library support. Notably, it's possible to build in
+// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++
+// with no C++11 support.
+//
+// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__
+// 20110325, but maintenance releases in the 4.4 and 4.5 series followed
+// this date, so check for those versions by their date stamps.
+// https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
+#if GTEST_LANG_CXX11 && \
+ (!defined(__GLIBCXX__) || ( \
+ __GLIBCXX__ >= 20110325ul && /* GCC >= 4.6.0 */ \
+ /* Blacklist of patch releases of older branches: */ \
+ __GLIBCXX__ != 20110416ul && /* GCC 4.4.6 */ \
+ __GLIBCXX__ != 20120313ul && /* GCC 4.4.7 */ \
+ __GLIBCXX__ != 20110428ul && /* GCC 4.5.3 */ \
+ __GLIBCXX__ != 20120702ul)) /* GCC 4.5.4 */
+# define GTEST_STDLIB_CXX11 1
+#endif
+
+// Only use C++11 library features if the library provides them.
+#if GTEST_STDLIB_CXX11
+# define GTEST_HAS_STD_BEGIN_AND_END_ 1
+# define GTEST_HAS_STD_FORWARD_LIST_ 1
+# define GTEST_HAS_STD_FUNCTION_ 1
+# define GTEST_HAS_STD_INITIALIZER_LIST_ 1
+# define GTEST_HAS_STD_MOVE_ 1
+# define GTEST_HAS_STD_SHARED_PTR_ 1
+# define GTEST_HAS_STD_TYPE_TRAITS_ 1
+# define GTEST_HAS_STD_UNIQUE_PTR_ 1
+#endif
+
+// C++11 specifies that <tuple> provides std::tuple.
+// Some platforms still might not have it, however.
+#if GTEST_LANG_CXX11
+# define GTEST_HAS_STD_TUPLE_ 1
+# if defined(__clang__)
+// Inspired by http://clang.llvm.org/docs/LanguageExtensions.html#__has_include
+# if defined(__has_include) && !__has_include(<tuple>)
+# undef GTEST_HAS_STD_TUPLE_
+# endif
+# elif defined(_MSC_VER)
+// Inspired by boost/config/stdlib/dinkumware.hpp
+# if defined(_CPPLIB_VER) && _CPPLIB_VER < 520
+# undef GTEST_HAS_STD_TUPLE_
+# endif
+# elif defined(__GLIBCXX__)
+// Inspired by boost/config/stdlib/libstdcpp3.hpp,
+// http://gcc.gnu.org/gcc-4.2/changes.html and
+// http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x
+# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
+# undef GTEST_HAS_STD_TUPLE_
+# endif
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if GTEST_OS_WINDOWS
+# if !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+# endif
+
+# if GTEST_OS_WINDOWS_MINGW
+ // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
+ // separate (equivalent) structs, instead of using typedef
+ typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
+# else
+ // In order to avoid having to include <windows.h>, use forward declaration
+ // assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
+ // This assumption is verified by
+ // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
+ struct _RTL_CRITICAL_SECTION;
+# endif
+#else
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#endif // GTEST_OS_WINDOWS
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+# include <android/api-level.h> // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_USES_PCRE
+// The appropriate headers have already been included.
+
+#elif GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise. We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h> // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows. Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform. Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif // GTEST_USES_PCRE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+# ifndef _HAS_EXCEPTIONS
+# define _HAS_EXCEPTIONS 1
+# endif // _HAS_EXCEPTIONS
+# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__clang__)
+// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,
+// but iff cleanups are enabled after that. In Obj-C++ files, there can be
+// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions
+// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++
+// exceptions starting at clang r206352, but which checked for cleanups prior to
+// that. To reliably check for C++ exception availability with clang, check for
+// __EXCEPTIONS && __has_feature(cxx_exceptions).
+# define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions. However, there is no compile-time way of
+// detecting whether they are enabled or not. Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+# define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+# define GTEST_HAS_EXCEPTIONS 0
+# endif // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
+// is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either. Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
+# define GTEST_HAS_RTTI 1
+# else
+# define GTEST_HAS_RTTI 0
+# endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+# ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+ !defined(__EXCEPTIONS)
+# define GTEST_HAS_RTTI 0
+# else
+# define GTEST_HAS_RTTI 1
+# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+# else
+# define GTEST_HAS_RTTI 0
+# endif // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+# define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+# ifdef __RTTI_ALL__
+# define GTEST_HAS_RTTI 1
+# else
+# define GTEST_HAS_RTTI 0
+# endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+# define GTEST_HAS_RTTI 1
+
+# endif // _MSC_VER
+
+#endif // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we make reasonable assumptions about
+// which platforms have pthreads support.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+ || GTEST_OS_QNX || GTEST_OS_FREEBSD || GTEST_OS_NACL)
+#endif // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h> // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h> // NOLINT
+#endif
+
+// Determines if hash_map/hash_set are available.
+// Only used for testing against those containers.
+#if !defined(GTEST_HAS_HASH_MAP_)
+# if _MSC_VER
+# define GTEST_HAS_HASH_MAP_ 1 // Indicates that hash_map is available.
+# define GTEST_HAS_HASH_SET_ 1 // Indicates that hash_set is available.
+# endif // _MSC_VER
+#endif // !defined(GTEST_HAS_HASH_MAP_)
+
+// Determines whether Google Test can use tr1/tuple. You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+# define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+# define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already. At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has. QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple. libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+ && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+# define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+# define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+# define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+# define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tuple.
+#if GTEST_HAS_STD_TUPLE_
+# include <tuple> // IWYU pragma: export
+# define GTEST_TUPLE_NAMESPACE_ ::std
+#endif // GTEST_HAS_STD_TUPLE_
+
+// We include tr1::tuple even if std::tuple is available to define printers for
+// them.
+#if GTEST_HAS_TR1_TUPLE
+# ifndef GTEST_TUPLE_NAMESPACE_
+# define GTEST_TUPLE_NAMESPACE_ ::std::tr1
+# endif // GTEST_TUPLE_NAMESPACE_
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+// pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility> // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined). This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+ template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+ private:
+#endif
+
+// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict
+// with our own definitions. Therefore using our own tuple does not work on
+// those compilers.
+#if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */
+# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \
+GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+ void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+ void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+ void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+ void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+ void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+ void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, \
+ typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, \
+ typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior. We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+ typename T3 = void, typename T4 = void, typename T5 = void,
+ typename T6 = void, typename T7 = void, typename T8 = void,
+ typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; }; // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; }; // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>. kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+ typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+ typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+ typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+ typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+ typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+ typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+ typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+ typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+ typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+ typedef T9 type;
+};
+
+} // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+ tuple() {}
+ tuple(const tuple& /* t */) {}
+ tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+ tuple(const tuple& t) : f0_(t.f0_) {}
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ return *this;
+ }
+
+ T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+ f1_(f1) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+ template <typename U0, typename U1>
+ tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+ template <typename U0, typename U1>
+ tuple& operator=(const ::std::pair<U0, U1>& p) {
+ f0_ = p.first;
+ f1_ = p.second;
+ return *this;
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+ GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_) {}
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_) {}
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+ GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5), f6_(f6), f7_(f7) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+ GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ f8_ = t.f8_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+ T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+ f9_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+ GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+ f9_(t.f9_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ f8_ = t.f8_;
+ f9_ = t.f9_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+ T8 f8_;
+ T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+ return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+ return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+ return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3) {
+ return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4) {
+ return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5) {
+ return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+ return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+ return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+ const T8& f8) {
+ return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+ const T8& f8, const T9& f9) {
+ return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+ static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+ static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+ static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+ static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+ static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+ static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+ static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+ static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+ static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+ static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+ static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+ typedef typename gtest_internal::TupleElement<
+ k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+ Field(Tuple& t) { return t.f0_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+ ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+ Field(Tuple& t) { return t.f1_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+ ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+ Field(Tuple& t) { return t.f2_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+ ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+ Field(Tuple& t) { return t.f3_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+ ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+ Field(Tuple& t) { return t.f4_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+ ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+ Field(Tuple& t) { return t.f5_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+ ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+ Field(Tuple& t) { return t.f6_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+ ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+ Field(Tuple& t) { return t.f7_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+ ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+ Field(Tuple& t) { return t.f8_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+ ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+ Field(Tuple& t) { return t.f9_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+ ConstField(const Tuple& t) { return t.f9_; }
+};
+
+} // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+ return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+ return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+ template <class Tuple1, class Tuple2>
+ static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+ return true;
+ }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+ template <class Tuple1, class Tuple2>
+ static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+ return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+ ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+ }
+};
+
+} // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+ const GTEST_10_TUPLE_(U)& u) {
+ return gtest_internal::SameSizeTuplePrefixComparator<
+ tuple_size<GTEST_10_TUPLE_(T) >::value,
+ tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+ const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+} // namespace tr1
+} // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+# include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1. gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+# ifdef BOOST_HAS_TR1_TUPLE
+# undef BOOST_HAS_TR1_TUPLE
+# endif // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+# include <tuple> // IWYU pragma: export // NOLINT
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled. _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>. Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+# define _TR1_FUNCTIONAL 1
+# include <tr1/tuple>
+# undef _TR1_FUNCTIONAL // Allows the user to #include
+ // <tr1/functional> if he chooses to.
+# else
+# include <tr1/tuple> // NOLINT
+# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+# include <tuple> // IWYU pragma: export // NOLINT
+# endif // GTEST_USE_OWN_TR1_TUPLE
+
+#endif // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+# if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+# if defined(__arm__) && __ANDROID_API__ >= 9
+# define GTEST_HAS_CLONE 1
+# else
+# define GTEST_HAS_CLONE 0
+# endif
+# else
+# define GTEST_HAS_CLONE 1
+# endif
+# else
+# define GTEST_HAS_CLONE 0
+# endif // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \
+ GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
+# define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+# define GTEST_HAS_STREAM_REDIRECTION 1
+# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+ (GTEST_OS_MAC && !GTEST_OS_IOS) || \
+ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+ GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD)
+# define GTEST_HAS_DEATH_TEST 1
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now. Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+ defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled. The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding. This leads to problems with code like:
+//
+// if (gate)
+// ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used. This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor. Example:
+//
+// struct Foo {
+// Foo() { ... }
+// } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#elif defined(__clang__)
+# if __has_attribute(unused)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+# endif
+#endif
+#ifndef GTEST_ATTRIBUTE_UNUSED_
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+ void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+ type(type const &);\
+ GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro. The macro should be used on function declarations
+// following the argument list:
+//
+// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// MS C++ compiler emits warning when a conditional expression is compile time
+// constant. In some contexts this warning is false positive and needs to be
+// suppressed. Use the following two macros in such cases:
+//
+// GTEST_INTENTIONAL_CONST_COND_PUSH_()
+// while (true) {
+// GTEST_INTENTIONAL_CONST_COND_POP_()
+// }
+# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
+# define GTEST_INTENTIONAL_CONST_COND_POP_() \
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling. This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+# define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+# define GTEST_HAS_SEH 0
+# endif
+
+#define GTEST_IS_THREADSAFE \
+ (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \
+ || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \
+ || GTEST_HAS_PTHREAD)
+
+#endif // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+# define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+# define GTEST_API_ __declspec(dllexport)
+# endif
+#elif __GNUC__ >= 4 || defined(__clang__)
+# define GTEST_API_ __attribute__((visibility ("default")))
+#endif // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+// A function level attribute to disable checking for use of uninitialized
+// memory when built with MemorySanitizer.
+#if defined(__clang__)
+# if __has_feature(memory_sanitizer)
+# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \
+ __attribute__((no_sanitize_memory))
+# else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
+# endif // __has_feature(memory_sanitizer)
+#else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
+#endif // __clang__
+
+// A function level attribute to disable AddressSanitizer instrumentation.
+#if defined(__clang__)
+# if __has_feature(address_sanitizer)
+# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \
+ __attribute__((no_sanitize_address))
+# else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+# endif // __has_feature(address_sanitizer)
+#else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
+#endif // __clang__
+
+// A function level attribute to disable ThreadSanitizer instrumentation.
+#if defined(__clang__)
+# if __has_feature(thread_sanitizer)
+# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \
+ __attribute__((no_sanitize_thread))
+# else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
+# endif // __has_feature(thread_sanitizer)
+#else
+# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
+#endif // __clang__
+
+namespace testing {
+
+class Message;
+
+#if defined(GTEST_TUPLE_NAMESPACE_)
+// Import tuple and friends into the ::testing namespace.
+// It is part of our interface, having them in ::testing allows us to change
+// their types as needed.
+using GTEST_TUPLE_NAMESPACE_::get;
+using GTEST_TUPLE_NAMESPACE_::make_tuple;
+using GTEST_TUPLE_NAMESPACE_::tuple;
+using GTEST_TUPLE_NAMESPACE_::tuple_size;
+using GTEST_TUPLE_NAMESPACE_::tuple_element;
+#endif // defined(GTEST_TUPLE_NAMESPACE_)
+
+namespace internal {
+
+// A secret type that Google Test users don't know about. It has no
+// definition on purpose. Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
+// names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+#if GTEST_LANG_CXX11
+# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
+#else // !GTEST_LANG_CXX11
+template <bool>
+ struct CompileAssert {
+};
+
+# define GTEST_COMPILE_ASSERT_(expr, msg) \
+ typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+ msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+#endif // !GTEST_LANG_CXX11
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// (In C++11, we simply use static_assert instead of the following)
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+// elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+// does not work, as gcc supports variable-length arrays whose sizes
+// are determined at run-time (this is gcc's extension and not part
+// of the C++ standard). As a result, gcc fails to reject the
+// following code with the simple definition:
+//
+// int foo;
+// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+// // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+// expr is a compile-time constant. (Template arguments must be
+// determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
+//
+// CompileAssert<bool(expr)>
+//
+// instead, these compilers will refuse to compile
+//
+// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+// (They seem to think the ">" in "5 > 0" marks the end of the
+// template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+// ((expr) ? 1 : -1).
+//
+// This is to avoid running into a bug in MS VC 7.1, which
+// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {
+ enum { value = true };
+};
+
+// Evaluates to the number of elements in 'array'.
+#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition. It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+ typedef T element_type;
+
+ explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+ ~scoped_ptr() { reset(); }
+
+ T& operator*() const { return *ptr_; }
+ T* operator->() const { return ptr_; }
+ T* get() const { return ptr_; }
+
+ T* release() {
+ T* const ptr = ptr_;
+ ptr_ = NULL;
+ return ptr;
+ }
+
+ void reset(T* p = NULL) {
+ if (p != ptr_) {
+ if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.
+ delete ptr_;
+ }
+ ptr_ = p;
+ }
+ }
+
+ friend void swap(scoped_ptr& a, scoped_ptr& b) {
+ using std::swap;
+ swap(a.ptr_, b.ptr_);
+ }
+
+ private:
+ T* ptr_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+ // A copy constructor is required by the Standard to initialize object
+ // references from r-values.
+ RE(const RE& other) { Init(other.pattern()); }
+
+ // Constructs an RE from a string.
+ RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+ RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+ RE(const char* regex) { Init(regex); } // NOLINT
+ ~RE();
+
+ // Returns the string representation of the regex.
+ const char* pattern() const { return pattern_; }
+
+ // FullMatch(str, re) returns true iff regular expression re matches
+ // the entire str.
+ // PartialMatch(str, re) returns true iff regular expression re
+ // matches a substring of str (including str itself).
+ //
+ // TODO(wan@google.com): make FullMatch() and PartialMatch() work
+ // when str contains NUL characters.
+ static bool FullMatch(const ::std::string& str, const RE& re) {
+ return FullMatch(str.c_str(), re);
+ }
+ static bool PartialMatch(const ::std::string& str, const RE& re) {
+ return PartialMatch(str.c_str(), re);
+ }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+ static bool FullMatch(const ::string& str, const RE& re) {
+ return FullMatch(str.c_str(), re);
+ }
+ static bool PartialMatch(const ::string& str, const RE& re) {
+ return PartialMatch(str.c_str(), re);
+ }
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+ static bool FullMatch(const char* str, const RE& re);
+ static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+ void Init(const char* regex);
+
+ // We use a const char* instead of an std::string, as Google Test used to be
+ // used where std::string is not available. TODO(wan@google.com): change to
+ // std::string.
+ const char* pattern_;
+ bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+ regex_t full_regex_; // For FullMatch().
+ regex_t partial_regex_; // For PartialMatch().
+
+#else // GTEST_USES_SIMPLE_RE
+
+ const char* full_pattern_; // For FullMatch();
+
+#endif
+
+ GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+ int line);
+
+// Defines logging utilities:
+// GTEST_LOG_(severity) - logs messages at the specified severity level. The
+// message itself is streamed into the macro.
+// LogToStderr() - directs all log messages to stderr.
+// FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+ GTEST_INFO,
+ GTEST_WARNING,
+ GTEST_ERROR,
+ GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+ GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+ // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+ ~GTestLog();
+
+ ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+ const GTestLogSeverity severity_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#if !defined(GTEST_LOG_)
+
+# define GTEST_LOG_(severity) \
+ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+ __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+#endif // !defined(GTEST_LOG_)
+
+#if !defined(GTEST_CHECK_)
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+// Synopsys:
+// GTEST_CHECK_(boolean_condition);
+// or
+// GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+// This checks the condition and if the condition is not satisfied
+// it prints message about the condition violation, including the
+// condition itself, plus additional message streamed into it, if any,
+// and then it aborts the program. It aborts the program irrespective of
+// whether it is built in the debug mode or not.
+# define GTEST_CHECK_(condition) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::IsTrue(condition)) \
+ ; \
+ else \
+ GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+#endif // !defined(GTEST_CHECK_)
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success). Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+ if (const int gtest_error = (posix_call)) \
+ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+ << gtest_error
+
+#if GTEST_HAS_STD_MOVE_
+using std::move;
+#else // GTEST_HAS_STD_MOVE_
+template <typename T>
+const T& move(const T& t) {
+ return t;
+}
+#endif // GTEST_HAS_STD_MOVE_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*). When you use ImplicitCast_, the compiler checks that
+// the cast is safe. Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+// ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late. It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed. When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo? It
+// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
+// when you downcast, you should use this macro. In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not). In normal mode, we do the efficient static_cast<>
+// instead. Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+// This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From> // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) { // so we only accept pointers
+ // Ensures that To is a sub-type of From *. This test is here only
+ // for compile-time type checking, and has no overhead in an
+ // optimized build at run-time, as it will be optimized away
+ // completely.
+ GTEST_INTENTIONAL_CONST_COND_PUSH_()
+ if (false) {
+ GTEST_INTENTIONAL_CONST_COND_POP_()
+ const To to = NULL;
+ ::testing::internal::ImplicitCast_<From*>(to);
+ }
+
+#if GTEST_HAS_RTTI
+ // RTTI: debug mode only!
+ GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+ return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+ GTEST_CHECK_(typeid(*base) == typeid(Derived));
+#endif
+
+#if GTEST_HAS_DOWNCAST_
+ return ::down_cast<Derived*>(base);
+#elif GTEST_HAS_RTTI
+ return dynamic_cast<Derived*>(base); // NOLINT
+#else
+ return static_cast<Derived*>(base); // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+// CaptureStdout - starts capturing stdout.
+// GetCapturedStdout - stops capturing stdout and returns the captured string.
+// CaptureStderr - starts capturing stderr.
+// GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+// Returns a path to temporary directory.
+GTEST_API_ std::string TempDir();
+
+// Returns the size (in bytes) of a file.
+GTEST_API_ size_t GetFileSize(FILE* file);
+
+// Reads the entire content of a file as a string.
+GTEST_API_ std::string ReadEntireFile(FILE* file);
+
+// All command line arguments.
+GTEST_API_ const ::std::vector<testing::internal::string>& GetArgvs();
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+ new_argvs);
+
+
+#endif // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+#if GTEST_IS_THREADSAFE
+# if GTEST_HAS_PTHREAD
+// Sleeps for (roughly) n milliseconds. This function is only for testing
+// Google Test's own constructs. Don't use it in user tests, either
+// directly or indirectly.
+inline void SleepMilliseconds(int n) {
+ const timespec time = {
+ 0, // 0 seconds.
+ n * 1000L * 1000L, // And n ms.
+ };
+ nanosleep(&time, NULL);
+}
+# endif // GTEST_HAS_PTHREAD
+
+# if GTEST_HAS_NOTIFICATION_
+// Notification has already been imported into the namespace.
+// Nothing to do here.
+
+# elif GTEST_HAS_PTHREAD
+// Allows a controller thread to pause execution of newly created
+// threads until notified. Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+ Notification() : notified_(false) {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+ }
+ ~Notification() {
+ pthread_mutex_destroy(&mutex_);
+ }
+
+ // Notifies all threads created with this notification to start. Must
+ // be called from the controller thread.
+ void Notify() {
+ pthread_mutex_lock(&mutex_);
+ notified_ = true;
+ pthread_mutex_unlock(&mutex_);
+ }
+
+ // Blocks until the controller thread notifies. Must be called from a test
+ // thread.
+ void WaitForNotification() {
+ for (;;) {
+ pthread_mutex_lock(&mutex_);
+ const bool notified = notified_;
+ pthread_mutex_unlock(&mutex_);
+ if (notified)
+ break;
+ SleepMilliseconds(10);
+ }
+ }
+
+ private:
+ pthread_mutex_t mutex_;
+ bool notified_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+
+GTEST_API_ void SleepMilliseconds(int n);
+
+// Provides leak-safe Windows kernel handle ownership.
+// Used in death tests and in threading support.
+class GTEST_API_ AutoHandle {
+ public:
+ // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to
+ // avoid including <windows.h> in this header file. Including <windows.h> is
+ // undesirable because it defines a lot of symbols and macros that tend to
+ // conflict with client code. This assumption is verified by
+ // WindowsTypesTest.HANDLEIsVoidStar.
+ typedef void* Handle;
+ AutoHandle();
+ explicit AutoHandle(Handle handle);
+
+ ~AutoHandle();
+
+ Handle Get() const;
+ void Reset();
+ void Reset(Handle handle);
+
+ private:
+ // Returns true iff the handle is a valid handle object that can be closed.
+ bool IsCloseable() const;
+
+ Handle handle_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified. Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class GTEST_API_ Notification {
+ public:
+ Notification();
+ void Notify();
+ void WaitForNotification();
+
+ private:
+ AutoHandle event_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+# endif // GTEST_HAS_NOTIFICATION_
+
+// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
+// defined, but we don't want to use MinGW's pthreads implementation, which
+// has conformance problems with some versions of the POSIX standard.
+# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+ virtual ~ThreadWithParamBase() {}
+ virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical. Some compilers (for
+// example, SunStudio) treat them as different types. Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+ static_cast<ThreadWithParamBase*>(thread)->Run();
+ return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+// void ThreadFunc(int param) { /* Do things with param */ }
+// Notification thread_can_start;
+// ...
+// // The thread_can_start parameter is optional; you can supply NULL.
+// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+// thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+ typedef void UserThreadFunc(T);
+
+ ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
+ : func_(func),
+ param_(param),
+ thread_can_start_(thread_can_start),
+ finished_(false) {
+ ThreadWithParamBase* const base = this;
+ // The thread can be created only after all fields except thread_
+ // have been initialized.
+ GTEST_CHECK_POSIX_SUCCESS_(
+ pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+ }
+ ~ThreadWithParam() { Join(); }
+
+ void Join() {
+ if (!finished_) {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+ finished_ = true;
+ }
+ }
+
+ virtual void Run() {
+ if (thread_can_start_ != NULL)
+ thread_can_start_->WaitForNotification();
+ func_(param_);
+ }
+
+ private:
+ UserThreadFunc* const func_; // User-supplied thread function.
+ const T param_; // User-supplied parameter to the thread function.
+ // When non-NULL, used to block execution until the controller thread
+ // notifies.
+ Notification* const thread_can_start_;
+ bool finished_; // true iff we know that the thread function has finished.
+ pthread_t thread_; // The native thread object.
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+# endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||
+ // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
+
+# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
+// Mutex and ThreadLocal have already been imported into the namespace.
+// Nothing to do here.
+
+# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+
+// Mutex implements mutex on Windows platforms. It is used in conjunction
+// with class MutexLock:
+//
+// Mutex mutex;
+// ...
+// MutexLock lock(&mutex); // Acquires the mutex and releases it at the
+// // end of the current scope.
+//
+// A static Mutex *must* be defined or declared using one of the following
+// macros:
+// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// (A non-static Mutex is defined/declared in the usual way).
+class GTEST_API_ Mutex {
+ public:
+ enum MutexType { kStatic = 0, kDynamic = 1 };
+ // We rely on kStaticMutex being 0 as it is to what the linker initializes
+ // type_ in static mutexes. critical_section_ will be initialized lazily
+ // in ThreadSafeLazyInit().
+ enum StaticConstructorSelector { kStaticMutex = 0 };
+
+ // This constructor intentionally does nothing. It relies on type_ being
+ // statically initialized to 0 (effectively setting it to kStatic) and on
+ // ThreadSafeLazyInit() to lazily initialize the rest of the members.
+ explicit Mutex(StaticConstructorSelector /*dummy*/) {}
+
+ Mutex();
+ ~Mutex();
+
+ void Lock();
+
+ void Unlock();
+
+ // Does nothing if the current thread holds the mutex. Otherwise, crashes
+ // with high probability.
+ void AssertHeld();
+
+ private:
+ // Initializes owner_thread_id_ and critical_section_ in static mutexes.
+ void ThreadSafeLazyInit();
+
+ // Per http://blogs.msdn.com/b/oldnewthing/archive/2004/02/23/78395.aspx,
+ // we assume that 0 is an invalid value for thread IDs.
+ unsigned int owner_thread_id_;
+
+ // For static mutexes, we rely on these members being initialized to zeros
+ // by the linker.
+ MutexType type_;
+ long critical_section_init_phase_; // NOLINT
+#if GTEST_OS_WINDOWS_MINGW
+ GTEST_CRITICAL_SECTION* critical_section_;
+#else
+ _RTL_CRITICAL_SECTION* critical_section_;
+#endif
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+ extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+ ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)
+
+// We cannot name this class MutexLock because the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms. That macro is used as a defensive measure to prevent against
+// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
+// "MutexLock l(&mu)". Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+ explicit GTestMutexLock(Mutex* mutex)
+ : mutex_(mutex) { mutex_->Lock(); }
+
+ ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+ Mutex* const mutex_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Base class for ValueHolder<T>. Allows a caller to hold and delete a value
+// without knowing its type.
+class ThreadLocalValueHolderBase {
+ public:
+ virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Provides a way for a thread to send notifications to a ThreadLocal
+// regardless of its parameter type.
+class ThreadLocalBase {
+ public:
+ // Creates a new ValueHolder<T> object holding a default value passed to
+ // this ThreadLocal<T>'s constructor and returns it. It is the caller's
+ // responsibility not to call this when the ThreadLocal<T> instance already
+ // has a value on the current thread.
+ virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0;
+
+ protected:
+ ThreadLocalBase() {}
+ virtual ~ThreadLocalBase() {}
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);
+};
+
+// Maps a thread to a set of ThreadLocals that have values instantiated on that
+// thread and notifies them when the thread exits. A ThreadLocal instance is
+// expected to persist until all threads it has values on have terminated.
+class GTEST_API_ ThreadLocalRegistry {
+ public:
+ // Registers thread_local_instance as having value on the current thread.
+ // Returns a value that can be used to identify the thread from other threads.
+ static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
+ const ThreadLocalBase* thread_local_instance);
+
+ // Invoked when a ThreadLocal instance is destroyed.
+ static void OnThreadLocalDestroyed(
+ const ThreadLocalBase* thread_local_instance);
+};
+
+class GTEST_API_ ThreadWithParamBase {
+ public:
+ void Join();
+
+ protected:
+ class Runnable {
+ public:
+ virtual ~Runnable() {}
+ virtual void Run() = 0;
+ };
+
+ ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
+ virtual ~ThreadWithParamBase();
+
+ private:
+ AutoHandle thread_;
+};
+
+// Helper class for testing Google Test's multi-threading constructs.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+ typedef void UserThreadFunc(T);
+
+ ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
+ : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {
+ }
+ virtual ~ThreadWithParam() {}
+
+ private:
+ class RunnableImpl : public Runnable {
+ public:
+ RunnableImpl(UserThreadFunc* func, T param)
+ : func_(func),
+ param_(param) {
+ }
+ virtual ~RunnableImpl() {}
+ virtual void Run() {
+ func_(param_);
+ }
+
+ private:
+ UserThreadFunc* const func_;
+ const T param_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);
+ };
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// Implements thread-local storage on Windows systems.
+//
+// // Thread 1
+// ThreadLocal<int> tl(100); // 100 is the default value for each thread.
+//
+// // Thread 2
+// tl.set(150); // Changes the value for thread 2 only.
+// EXPECT_EQ(150, tl.get());
+//
+// // Thread 1
+// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
+// tl.set(200);
+// EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// The users of a TheadLocal instance have to make sure that all but one
+// threads (including the main one) using that instance have exited before
+// destroying it. Otherwise, the per-thread objects managed for them by the
+// ThreadLocal instance are not guaranteed to be destroyed on all platforms.
+//
+// Google Test only uses global ThreadLocal objects. That means they
+// will die after main() has returned. Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal : public ThreadLocalBase {
+ public:
+ ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}
+ explicit ThreadLocal(const T& value)
+ : default_factory_(new InstanceValueHolderFactory(value)) {}
+
+ ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }
+
+ T* pointer() { return GetOrCreateValue(); }
+ const T* pointer() const { return GetOrCreateValue(); }
+ const T& get() const { return *pointer(); }
+ void set(const T& value) { *pointer() = value; }
+
+ private:
+ // Holds a value of T. Can be deleted via its base class without the caller
+ // knowing the type of T.
+ class ValueHolder : public ThreadLocalValueHolderBase {
+ public:
+ ValueHolder() : value_() {}
+ explicit ValueHolder(const T& value) : value_(value) {}
+
+ T* pointer() { return &value_; }
+
+ private:
+ T value_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+ };
+
+
+ T* GetOrCreateValue() const {
+ return static_cast<ValueHolder*>(
+ ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();
+ }
+
+ virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const {
+ return default_factory_->MakeNewHolder();
+ }
+
+ class ValueHolderFactory {
+ public:
+ ValueHolderFactory() {}
+ virtual ~ValueHolderFactory() {}
+ virtual ValueHolder* MakeNewHolder() const = 0;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
+ };
+
+ class DefaultValueHolderFactory : public ValueHolderFactory {
+ public:
+ DefaultValueHolderFactory() {}
+ virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
+ };
+
+ class InstanceValueHolderFactory : public ValueHolderFactory {
+ public:
+ explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
+ virtual ValueHolder* MakeNewHolder() const {
+ return new ValueHolder(value_);
+ }
+
+ private:
+ const T value_; // The value for each thread.
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
+ };
+
+ scoped_ptr<ValueHolderFactory> default_factory_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# elif GTEST_HAS_PTHREAD
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms.
+class MutexBase {
+ public:
+ // Acquires this mutex.
+ void Lock() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+ owner_ = pthread_self();
+ has_owner_ = true;
+ }
+
+ // Releases this mutex.
+ void Unlock() {
+ // Since the lock is being released the owner_ field should no longer be
+ // considered valid. We don't protect writing to has_owner_ here, as it's
+ // the caller's responsibility to ensure that the current thread holds the
+ // mutex when this is called.
+ has_owner_ = false;
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+ }
+
+ // Does nothing if the current thread holds the mutex. Otherwise, crashes
+ // with high probability.
+ void AssertHeld() const {
+ GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+ << "The current thread is not holding the mutex @" << this;
+ }
+
+ // A static mutex may be used before main() is entered. It may even
+ // be used before the dynamic initialization stage. Therefore we
+ // must be able to initialize a static mutex object at link time.
+ // This means MutexBase has to be a POD and its member variables
+ // have to be public.
+ public:
+ pthread_mutex_t mutex_; // The underlying pthread mutex.
+ // has_owner_ indicates whether the owner_ field below contains a valid thread
+ // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+ // accesses to the owner_ field should be protected by a check of this field.
+ // An alternative might be to memset() owner_ to all zeros, but there's no
+ // guarantee that a zero'd pthread_t is necessarily invalid or even different
+ // from pthread_self().
+ bool has_owner_;
+ pthread_t owner_; // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+ extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false, pthread_t() }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+ Mutex() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+ has_owner_ = false;
+ }
+ ~Mutex() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+ }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock because the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms. That macro is used as a defensive measure to prevent against
+// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
+// "MutexLock l(&mu)". Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+ explicit GTestMutexLock(MutexBase* mutex)
+ : mutex_(mutex) { mutex_->Lock(); }
+
+ ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+ MutexBase* const mutex_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage. Therefore it cannot be templatized to access
+// ThreadLocal<T>. Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+ virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+ delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+template <typename T>
+class ThreadLocal {
+ public:
+ ThreadLocal()
+ : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
+ explicit ThreadLocal(const T& value)
+ : key_(CreateKey()),
+ default_factory_(new InstanceValueHolderFactory(value)) {}
+
+ ~ThreadLocal() {
+ // Destroys the managed object for the current thread, if any.
+ DeleteThreadLocalValue(pthread_getspecific(key_));
+
+ // Releases resources associated with the key. This will *not*
+ // delete managed objects for other threads.
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+ }
+
+ T* pointer() { return GetOrCreateValue(); }
+ const T* pointer() const { return GetOrCreateValue(); }
+ const T& get() const { return *pointer(); }
+ void set(const T& value) { *pointer() = value; }
+
+ private:
+ // Holds a value of type T.
+ class ValueHolder : public ThreadLocalValueHolderBase {
+ public:
+ ValueHolder() : value_() {}
+ explicit ValueHolder(const T& value) : value_(value) {}
+
+ T* pointer() { return &value_; }
+
+ private:
+ T value_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+ };
+
+ static pthread_key_t CreateKey() {
+ pthread_key_t key;
+ // When a thread exits, DeleteThreadLocalValue() will be called on
+ // the object managed for that thread.
+ GTEST_CHECK_POSIX_SUCCESS_(
+ pthread_key_create(&key, &DeleteThreadLocalValue));
+ return key;
+ }
+
+ T* GetOrCreateValue() const {
+ ThreadLocalValueHolderBase* const holder =
+ static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+ if (holder != NULL) {
+ return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+ }
+
+ ValueHolder* const new_holder = default_factory_->MakeNewHolder();
+ ThreadLocalValueHolderBase* const holder_base = new_holder;
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+ return new_holder->pointer();
+ }
+
+ class ValueHolderFactory {
+ public:
+ ValueHolderFactory() {}
+ virtual ~ValueHolderFactory() {}
+ virtual ValueHolder* MakeNewHolder() const = 0;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
+ };
+
+ class DefaultValueHolderFactory : public ValueHolderFactory {
+ public:
+ DefaultValueHolderFactory() {}
+ virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
+ };
+
+ class InstanceValueHolderFactory : public ValueHolderFactory {
+ public:
+ explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
+ virtual ValueHolder* MakeNewHolder() const {
+ return new ValueHolder(value_);
+ }
+
+ private:
+ const T value_; // The value for each thread.
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
+ };
+
+ // A key pthreads uses for looking up per-thread values.
+ const pthread_key_t key_;
+ scoped_ptr<ValueHolderFactory> default_factory_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
+
+#else // GTEST_IS_THREADSAFE
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable). Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+ Mutex() {}
+ void Lock() {}
+ void Unlock() {}
+ void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+ extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+// We cannot name this class MutexLock because the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms. That macro is used as a defensive measure to prevent against
+// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
+// "MutexLock l(&mu)". Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+ explicit GTestMutexLock(Mutex*) {} // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+ ThreadLocal() : value_() {}
+ explicit ThreadLocal(const T& value) : value_(value) {}
+ T* pointer() { return &value_; }
+ const T* pointer() const { return &value_; }
+ const T& get() const { return value_; }
+ void set(const T& value) { value_ = value; }
+ private:
+ T value_;
+};
+
+#endif // GTEST_IS_THREADSAFE
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio. The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects. We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template. These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+ typedef bool_constant<bool_value> type;
+ static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+ typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+ typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+ typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt; // NOLINT
+#endif // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF. char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+ return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+ return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+ return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+ return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+ return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+ return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+ return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+ const unsigned char low_byte = static_cast<unsigned char>(ch);
+ return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+ return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+ return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+inline std::string StripTrailingSpaces(std::string str) {
+ std::string::iterator it = str.end();
+ while (it != str.begin() && IsSpace(*--it))
+ it = str.erase(it);
+ return str;
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions. These wrappers hide the differences between
+// Windows/MSVC and POSIX systems. Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else // !__BORLANDC__
+# if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+# else
+inline int IsATTY(int fd) { return _isatty(fd); }
+# endif // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+ return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */)
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+ return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+ return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+ return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+ return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+ return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE | GTEST_OS_WINDOWS_RT
+ // We are on Windows CE, which has no environment variables.
+ static_cast<void>(name); // To prevent 'unused argument' warning.
+ return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+ // Environment variables which we programmatically clear will be set to the
+ // empty string rather than unset (NULL). Handle that case.
+ const char* const env = getenv(name);
+ return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+ return getenv(name);
+#endif
+}
+
+GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+} // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used. In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that. We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+ _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent. This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+ ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type. It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+// TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs. Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+ // This prevents the user from using TypeWithSize<N> with incorrect
+ // values of N.
+ typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+ // unsigned int has size 4 in both gcc and MSVC.
+ //
+ // As base/basictypes.h doesn't compile on Windows, we cannot use
+ // uint32, uint64, and etc here.
+ typedef int Int;
+ typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+ typedef __int64 Int;
+ typedef unsigned __int64 UInt;
+#else
+ typedef long long Int; // NOLINT
+ typedef unsigned long long UInt; // NOLINT
+#endif // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#if !defined(GTEST_FLAG)
+# define GTEST_FLAG(name) FLAGS_gtest_##name
+#endif // !defined(GTEST_FLAG)
+
+#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
+# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1
+#endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
+
+#if !defined(GTEST_DECLARE_bool_)
+# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver
+
+// Macros for declaring flags.
+# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+# define GTEST_DECLARE_int32_(name) \
+ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+ GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+ GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+#endif // !defined(GTEST_DECLARE_bool_)
+
+// Thread annotations
+#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
+# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+# define GTEST_LOCK_EXCLUDED_(locks)
+#endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
+
+// Parses 'str' for a 32-bit signed integer. If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+std::string StringFromGTestEnv(const char* flag, const char* default_val);
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+// 1. You stream a bunch of values to a Message object.
+// It will remember the text in a stringstream.
+// 2. Then you stream the Message object to an ostream.
+// This causes the text in the Message to be streamed
+// to the ostream.
+//
+// For example;
+//
+// testing::Message foo;
+// foo << 1 << " != " << 2;
+// std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from. In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC. You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do). The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+ // The type of basic IO manipulators (endl, ends, and flush) for
+ // narrow streams.
+ typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+ // Constructs an empty Message.
+ Message();
+
+ // Copy constructor.
+ Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
+ *ss_ << msg.GetString();
+ }
+
+ // Constructs a Message from a C-string.
+ explicit Message(const char* str) : ss_(new ::std::stringstream) {
+ *ss_ << str;
+ }
+
+#if GTEST_OS_SYMBIAN
+ // Streams a value (either a pointer or not) to this object.
+ template <typename T>
+ inline Message& operator <<(const T& value) {
+ StreamHelper(typename internal::is_pointer<T>::type(), value);
+ return *this;
+ }
+#else
+ // Streams a non-pointer value to this object.
+ template <typename T>
+ inline Message& operator <<(const T& val) {
+ // Some libraries overload << for STL containers. These
+ // overloads are defined in the global namespace instead of ::std.
+ //
+ // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+ // overloads are visible in either the std namespace or the global
+ // namespace, but not other namespaces, including the testing
+ // namespace which Google Test's Message class is in.
+ //
+ // To allow STL containers (and other types that has a << operator
+ // defined in the global namespace) to be used in Google Test
+ // assertions, testing::Message must access the custom << operator
+ // from the global namespace. With this using declaration,
+ // overloads of << defined in the global namespace and those
+ // visible via Koenig lookup are both exposed in this function.
+ using ::operator <<;
+ *ss_ << val;
+ return *this;
+ }
+
+ // Streams a pointer value to this object.
+ //
+ // This function is an overload of the previous one. When you
+ // stream a pointer to a Message, this definition will be used as it
+ // is more specialized. (The C++ Standard, section
+ // [temp.func.order].) If you stream a non-pointer, then the
+ // previous definition will be used.
+ //
+ // The reason for this overload is that streaming a NULL pointer to
+ // ostream is undefined behavior. Depending on the compiler, you
+ // may get "0", "(nil)", "(null)", or an access violation. To
+ // ensure consistent result across compilers, we always treat NULL
+ // as "(null)".
+ template <typename T>
+ inline Message& operator <<(T* const& pointer) { // NOLINT
+ if (pointer == NULL) {
+ *ss_ << "(null)";
+ } else {
+ *ss_ << pointer;
+ }
+ return *this;
+ }
+#endif // GTEST_OS_SYMBIAN
+
+ // Since the basic IO manipulators are overloaded for both narrow
+ // and wide streams, we have to provide this specialized definition
+ // of operator <<, even though its body is the same as the
+ // templatized version above. Without this definition, streaming
+ // endl or other basic IO manipulators to Message will confuse the
+ // compiler.
+ Message& operator <<(BasicNarrowIoManip val) {
+ *ss_ << val;
+ return *this;
+ }
+
+ // Instead of 1/0, we want to see true/false for bool values.
+ Message& operator <<(bool b) {
+ return *this << (b ? "true" : "false");
+ }
+
+ // These two overloads allow streaming a wide C string to a Message
+ // using the UTF-8 encoding.
+ Message& operator <<(const wchar_t* wide_c_str);
+ Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+ // Converts the given wide string to a narrow string using the UTF-8
+ // encoding, and streams the result to this Message object.
+ Message& operator <<(const ::std::wstring& wstr);
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+ // Converts the given wide string to a narrow string using the UTF-8
+ // encoding, and streams the result to this Message object.
+ Message& operator <<(const ::wstring& wstr);
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+ // Gets the text streamed to this object so far as an std::string.
+ // Each '\0' character in the buffer is replaced with "\\0".
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+ // These are needed as the Nokia Symbian Compiler cannot decide between
+ // const T& and const T* in a function template. The Nokia compiler _can_
+ // decide between class template specializations for T and T*, so a
+ // tr1::type_traits-like is_pointer works, and we can overload on that.
+ template <typename T>
+ inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+ if (pointer == NULL) {
+ *ss_ << "(null)";
+ } else {
+ *ss_ << pointer;
+ }
+ }
+ template <typename T>
+ inline void StreamHelper(internal::false_type /*is_pointer*/,
+ const T& value) {
+ // See the comments in Message& operator <<(const T&) above for why
+ // we need this using statement.
+ using ::operator <<;
+ *ss_ << value;
+ }
+#endif // GTEST_OS_SYMBIAN
+
+ // We'll hold the text streamed to this object here.
+ const internal::scoped_ptr< ::std::stringstream> ss_;
+
+ // We declare (but don't implement) this to prevent the compiler
+ // from implementing the assignment operator.
+ void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+ return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string. A NULL pointer is
+// converted to "(null)". When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+ return (Message() << streamable).GetString();
+}
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test. They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+ // Static utility methods
+
+ // Clones a 0-terminated C string, allocating memory using new. The
+ // caller is responsible for deleting the return value using
+ // delete[]. Returns the cloned string, or NULL if the input is
+ // NULL.
+ //
+ // This is different from strdup() in string.h, which allocates
+ // memory using malloc().
+ static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+ // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+ // able to pass strings to Win32 APIs on CE we need to convert them
+ // to 'Unicode', UTF-16.
+
+ // Creates a UTF-16 wide string from the given ANSI string, allocating
+ // memory using new. The caller is responsible for deleting the return
+ // value using delete[]. Returns the wide string, or NULL if the
+ // input is NULL.
+ //
+ // The wide string is created using the ANSI codepage (CP_ACP) to
+ // match the behaviour of the ANSI versions of Win32 calls and the
+ // C runtime.
+ static LPCWSTR AnsiToUtf16(const char* c_str);
+
+ // Creates an ANSI string from the given wide string, allocating
+ // memory using new. The caller is responsible for deleting the return
+ // value using delete[]. Returns the ANSI string, or NULL if the
+ // input is NULL.
+ //
+ // The returned string is created using the ANSI codepage (CP_ACP) to
+ // match the behaviour of the ANSI versions of Win32 calls and the
+ // C runtime.
+ static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+ // Compares two C strings. Returns true iff they have the same content.
+ //
+ // Unlike strcmp(), this function can handle NULL argument(s). A
+ // NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool CStringEquals(const char* lhs, const char* rhs);
+
+ // Converts a wide C string to a String using the UTF-8 encoding.
+ // NULL will be converted to "(null)". If an error occurred during
+ // the conversion, "(failed to convert from wide string)" is
+ // returned.
+ static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+ // Compares two wide C strings. Returns true iff they have the same
+ // content.
+ //
+ // Unlike wcscmp(), this function can handle NULL argument(s). A
+ // NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+ // Compares two C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike strcasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool CaseInsensitiveCStringEquals(const char* lhs,
+ const char* rhs);
+
+ // Compares two wide C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike wcscasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL wide C string,
+ // including the empty string.
+ // NB: The implementations on different platforms slightly differ.
+ // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+ // environment variable. On GNU platform this method uses wcscasecmp
+ // which compares according to LC_CTYPE category of the current locale.
+ // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+ // current locale.
+ static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+ const wchar_t* rhs);
+
+ // Returns true iff the given string ends with the given suffix, ignoring
+ // case. Any string is considered to end with an empty suffix.
+ static bool EndsWithCaseInsensitive(
+ const std::string& str, const std::string& suffix);
+
+ // Formats an int value as "%02d".
+ static std::string FormatIntWidth2(int value); // "%02d" for width == 2
+
+ // Formats an int value as "%X".
+ static std::string FormatHexInt(int value);
+
+ // Formats a byte as "%02X".
+ static std::string FormatByte(unsigned char value);
+
+ private:
+ String(); // Not meant to be instantiated.
+}; // class String
+
+// Gets the content of the stringstream's buffer as an std::string. Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray@gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test. They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+ FilePath() : pathname_("") { }
+ FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+ explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+ Normalize();
+ }
+
+ FilePath& operator=(const FilePath& rhs) {
+ Set(rhs);
+ return *this;
+ }
+
+ void Set(const FilePath& rhs) {
+ pathname_ = rhs.pathname_;
+ }
+
+ const std::string& string() const { return pathname_; }
+ const char* c_str() const { return pathname_.c_str(); }
+
+ // Returns the current working directory, or "" if unsuccessful.
+ static FilePath GetCurrentDir();
+
+ // Given directory = "dir", base_name = "test", number = 0,
+ // extension = "xml", returns "dir/test.xml". If number is greater
+ // than zero (e.g., 12), returns "dir/test_12.xml".
+ // On Windows platform, uses \ as the separator rather than /.
+ static FilePath MakeFileName(const FilePath& directory,
+ const FilePath& base_name,
+ int number,
+ const char* extension);
+
+ // Given directory = "dir", relative_path = "test.xml",
+ // returns "dir/test.xml".
+ // On Windows, uses \ as the separator rather than /.
+ static FilePath ConcatPaths(const FilePath& directory,
+ const FilePath& relative_path);
+
+ // Returns a pathname for a file that does not currently exist. The pathname
+ // will be directory/base_name.extension or
+ // directory/base_name_<number>.extension if directory/base_name.extension
+ // already exists. The number will be incremented until a pathname is found
+ // that does not already exist.
+ // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+ // There could be a race condition if two or more processes are calling this
+ // function at the same time -- they could both pick the same filename.
+ static FilePath GenerateUniqueFileName(const FilePath& directory,
+ const FilePath& base_name,
+ const char* extension);
+
+ // Returns true iff the path is "".
+ bool IsEmpty() const { return pathname_.empty(); }
+
+ // If input name has a trailing separator character, removes it and returns
+ // the name, otherwise return the name string unmodified.
+ // On Windows platform, uses \ as the separator, other platforms use /.
+ FilePath RemoveTrailingPathSeparator() const;
+
+ // Returns a copy of the FilePath with the directory part removed.
+ // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+ // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+ // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+ // returns an empty FilePath ("").
+ // On Windows platform, '\' is the path separator, otherwise it is '/'.
+ FilePath RemoveDirectoryName() const;
+
+ // RemoveFileName returns the directory path with the filename removed.
+ // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+ // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+ // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+ // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+ // On Windows platform, '\' is the path separator, otherwise it is '/'.
+ FilePath RemoveFileName() const;
+
+ // Returns a copy of the FilePath with the case-insensitive extension removed.
+ // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+ // FilePath("dir/file"). If a case-insensitive extension is not
+ // found, returns a copy of the original FilePath.
+ FilePath RemoveExtension(const char* extension) const;
+
+ // Creates directories so that path exists. Returns true if successful or if
+ // the directories already exist; returns false if unable to create
+ // directories for any reason. Will also return false if the FilePath does
+ // not represent a directory (that is, it doesn't end with a path separator).
+ bool CreateDirectoriesRecursively() const;
+
+ // Create the directory so that path exists. Returns true if successful or
+ // if the directory already exists; returns false if unable to create the
+ // directory for any reason, including if the parent directory does not
+ // exist. Not named "CreateDirectory" because that's a macro on Windows.
+ bool CreateFolder() const;
+
+ // Returns true if FilePath describes something in the file-system,
+ // either a file, directory, or whatever, and that something exists.
+ bool FileOrDirectoryExists() const;
+
+ // Returns true if pathname describes a directory in the file-system
+ // that exists.
+ bool DirectoryExists() const;
+
+ // Returns true if FilePath ends with a path separator, which indicates that
+ // it is intended to represent a directory. Returns false otherwise.
+ // This does NOT check that a directory (or file) actually exists.
+ bool IsDirectory() const;
+
+ // Returns true if pathname describes a root directory. (Windows has one
+ // root directory per disk drive.)
+ bool IsRootDirectory() const;
+
+ // Returns true if pathname describes an absolute path.
+ bool IsAbsolutePath() const;
+
+ private:
+ // Replaces multiple consecutive separators with a single separator.
+ // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+ // redundancies that might be in a pathname involving "." or "..".
+ //
+ // A pathname with multiple consecutive separators may occur either through
+ // user error or as a result of some scripts or APIs that generate a pathname
+ // with a trailing separator. On other platforms the same API or script
+ // may NOT generate a pathname with a trailing "/". Then elsewhere that
+ // pathname may have another "/" and pathname components added to it,
+ // without checking for the separator already being there.
+ // The script language and operating system may allow paths like "foo//bar"
+ // but some of the functions in FilePath will not handle that correctly. In
+ // particular, RemoveTrailingPathSeparator() only removes one separator, and
+ // it is called in CreateDirectoriesRecursively() assuming that it will change
+ // a pathname from directory syntax (trailing separator) to filename syntax.
+ //
+ // On Windows this method also replaces the alternate path separator '/' with
+ // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+ // "bar\\foo".
+
+ void Normalize();
+
+ // Returns a pointer to the last occurence of a valid path separator in
+ // the FilePath. On Windows, for example, both '/' and '\' are valid path
+ // separators. Returns NULL if no path separator was found.
+ const char* FindLastPathSeparator() const;
+
+ std::string pathname_;
+}; // class FilePath
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+// pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework@googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+# include <cxxabi.h>
+# elif defined(__HP_aCC)
+# include <acxx_demangle.h>
+# endif // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+ const char* const name = typeid(T).name();
+# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+ int status = 0;
+ // gcc's implementation of typeid(T).name() mangles the type name,
+ // so we have to demangle it.
+# if GTEST_HAS_CXXABI_H_
+ using abi::__cxa_demangle;
+# endif // GTEST_HAS_CXXABI_H_
+ char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+ const std::string name_str(status == 0 ? readable_name : name);
+ free(readable_name);
+ return name_str;
+# else
+ return name;
+# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+ return "<type>";
+
+# endif // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type. This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+ typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types. This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists. In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+ typedef T1 Head;
+ typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+ typedef T1 Head;
+ typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+ typedef T1 Head;
+ typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+ typedef T1 Head;
+ typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+ typedef T1 Head;
+ typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+struct Types6 {
+ typedef T1 Head;
+ typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+struct Types7 {
+ typedef T1 Head;
+ typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+struct Types8 {
+ typedef T1 Head;
+ typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+ typedef T1 Head;
+ typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+ typedef T1 Head;
+ typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+struct Types11 {
+ typedef T1 Head;
+ typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+struct Types12 {
+ typedef T1 Head;
+ typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+struct Types13 {
+ typedef T1 Head;
+ typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+ typedef T1 Head;
+ typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+ typedef T1 Head;
+ typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+struct Types16 {
+ typedef T1 Head;
+ typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+struct Types17 {
+ typedef T1 Head;
+ typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+struct Types18 {
+ typedef T1 Head;
+ typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+ typedef T1 Head;
+ typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+ typedef T1 Head;
+ typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+struct Types21 {
+ typedef T1 Head;
+ typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+struct Types22 {
+ typedef T1 Head;
+ typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+struct Types23 {
+ typedef T1 Head;
+ typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+ typedef T1 Head;
+ typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+ typedef T1 Head;
+ typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+struct Types26 {
+ typedef T1 Head;
+ typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+struct Types27 {
+ typedef T1 Head;
+ typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+struct Types28 {
+ typedef T1 Head;
+ typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+ typedef T1 Head;
+ typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+ typedef T1 Head;
+ typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+struct Types31 {
+ typedef T1 Head;
+ typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+struct Types32 {
+ typedef T1 Head;
+ typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+struct Types33 {
+ typedef T1 Head;
+ typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+ typedef T1 Head;
+ typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+ typedef T1 Head;
+ typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+struct Types36 {
+ typedef T1 Head;
+ typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+struct Types37 {
+ typedef T1 Head;
+ typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+struct Types38 {
+ typedef T1 Head;
+ typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+ typedef T1 Head;
+ typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+ typedef T1 Head;
+ typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+struct Types41 {
+ typedef T1 Head;
+ typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+struct Types42 {
+ typedef T1 Head;
+ typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+struct Types43 {
+ typedef T1 Head;
+ typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+ typedef T1 Head;
+ typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+ typedef T1 Head;
+ typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+struct Types46 {
+ typedef T1 Head;
+ typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+struct Types47 {
+ typedef T1 Head;
+ typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+struct Types48 {
+ typedef T1 Head;
+ typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+ typedef T1 Head;
+ typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+ typedef T1 Head;
+ typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+} // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length. Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable. The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+ typename T3 = internal::None, typename T4 = internal::None,
+ typename T5 = internal::None, typename T6 = internal::None,
+ typename T7 = internal::None, typename T8 = internal::None,
+ typename T9 = internal::None, typename T10 = internal::None,
+ typename T11 = internal::None, typename T12 = internal::None,
+ typename T13 = internal::None, typename T14 = internal::None,
+ typename T15 = internal::None, typename T16 = internal::None,
+ typename T17 = internal::None, typename T18 = internal::None,
+ typename T19 = internal::None, typename T20 = internal::None,
+ typename T21 = internal::None, typename T22 = internal::None,
+ typename T23 = internal::None, typename T24 = internal::None,
+ typename T25 = internal::None, typename T26 = internal::None,
+ typename T27 = internal::None, typename T28 = internal::None,
+ typename T29 = internal::None, typename T30 = internal::None,
+ typename T31 = internal::None, typename T32 = internal::None,
+ typename T33 = internal::None, typename T34 = internal::None,
+ typename T35 = internal::None, typename T36 = internal::None,
+ typename T37 = internal::None, typename T38 = internal::None,
+ typename T39 = internal::None, typename T40 = internal::None,
+ typename T41 = internal::None, typename T42 = internal::None,
+ typename T43 = internal::None, typename T44 = internal::None,
+ typename T45 = internal::None, typename T46 = internal::None,
+ typename T47 = internal::None, typename T48 = internal::None,
+ typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+ typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, internal::None, internal::None, internal::None> {
+ typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, T48, internal::None, internal::None> {
+ typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, T48, T49, internal::None> {
+ typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>. This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+ template <typename T>
+ struct Bind {
+ typedef Tmpl<T> type;
+ };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+ TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates. This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists. In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN). Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4>
+struct Templates4 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7>
+struct Templates7 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10>
+struct Templates10 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13>
+struct Templates13 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16>
+struct Templates16 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19>
+struct Templates19 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22>
+struct Templates22 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25>
+struct Templates25 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28>
+struct Templates28 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31>
+struct Templates31 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34>
+struct Templates34 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37>
+struct Templates37 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40>
+struct Templates40 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43>
+struct Templates43 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46>
+struct Templates46 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49>
+struct Templates49 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length. Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable. The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+ GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+ GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+ GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+ GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+ GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+ GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+ GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+ GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+ GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+ GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+ GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+ GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+ GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+ GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+ GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+ GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+ GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+ GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+ GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+ GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+ GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+ GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+ GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+ GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+ typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, NoneT, NoneT, NoneT> {
+ typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, T48, NoneT, NoneT> {
+ typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, T48, T49, NoneT> {
+ typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+ typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> > {
+ typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__. Writing
+//
+// foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number. For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult; // Result of an assertion.
+class Message; // Represents a failure message.
+class Test; // Represents a test.
+class TestInfo; // Information about a test.
+class TestPartResult; // Result of a test part.
+class UnitTest; // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo; // Information about a trace point.
+class ScopedTrace; // Implements scoped trace.
+class TestInfoImpl; // Opaque implementation of TestInfo
+class UnitTestImpl; // Opaque implementation of UnitTest
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant). Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler. These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise. Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal. Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2]; // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+ const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled). We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time. Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+ explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+ // The c'tor pushes the given source file location and message onto
+ // a trace stack maintained by Google Test.
+ ScopedTrace(const char* file, int line, const Message& message);
+
+ // The d'tor pops the info pushed by the c'tor.
+ //
+ // Note that the d'tor is not virtual in order to be efficient.
+ // Don't inherit from ScopedTrace!
+ ~ScopedTrace();
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
+ // c'tor and d'tor. Therefore it doesn't
+ // need to be used otherwise.
+
+namespace edit_distance {
+// Returns the optimal edits to go from 'left' to 'right'.
+// All edits cost the same, with replace having lower priority than
+// add/remove.
+// Simple implementation of the Wagner–Fischer algorithm.
+// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm
+enum EditType { kMatch, kAdd, kRemove, kReplace };
+GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
+ const std::vector<size_t>& left, const std::vector<size_t>& right);
+
+// Same as above, but the input is represented as strings.
+GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
+ const std::vector<std::string>& left,
+ const std::vector<std::string>& right);
+
+// Create a diff of the input strings in Unified diff format.
+GTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left,
+ const std::vector<std::string>& right,
+ size_t context = 2);
+
+} // namespace edit_distance
+
+// Calculate the diff between 'left' and 'right' and return it in unified diff
+// format.
+// If not null, stores in 'total_line_count' the total number of lines found
+// in left + right.
+GTEST_API_ std::string DiffStrings(const std::string& left,
+ const std::string& right,
+ size_t* total_line_count);
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+// expected_expression: "foo"
+// actual_expression: "bar"
+// expected_value: "5"
+// actual_value: "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+ const char* actual_expression,
+ const std::string& expected_value,
+ const std::string& actual_value,
+ bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+ const AssertionResult& assertion_result,
+ const char* expression_text,
+ const char* actual_predicate_value,
+ const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison. (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly. Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+// The most-significant bit being the leftmost, an IEEE
+// floating-point looks like
+//
+// sign_bit exponent_bits fraction_bits
+//
+// Here, sign_bit is a single bit that designates the sign of the
+// number.
+//
+// For float, there are 8 exponent bits and 23 fraction bits.
+//
+// For double, there are 11 exponent bits and 52 fraction bits.
+//
+// More details can be found at
+// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+// RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+ // Defines the unsigned integer type that has the same size as the
+ // floating point number.
+ typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+ // Constants.
+
+ // # of bits in a number.
+ static const size_t kBitCount = 8*sizeof(RawType);
+
+ // # of fraction bits in a number.
+ static const size_t kFractionBitCount =
+ std::numeric_limits<RawType>::digits - 1;
+
+ // # of exponent bits in a number.
+ static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+ // The mask for the sign bit.
+ static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+ // The mask for the fraction bits.
+ static const Bits kFractionBitMask =
+ ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+ // The mask for the exponent bits.
+ static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+ // How many ULP's (Units in the Last Place) we want to tolerate when
+ // comparing two numbers. The larger the value, the more error we
+ // allow. A 0 value means that two numbers must be exactly the same
+ // to be considered equal.
+ //
+ // The maximum error of a single floating-point operation is 0.5
+ // units in the last place. On Intel CPU's, all floating-point
+ // calculations are done with 80-bit precision, while double has 64
+ // bits. Therefore, 4 should be enough for ordinary use.
+ //
+ // See the following article for more details on ULP:
+ // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+ static const size_t kMaxUlps = 4;
+
+ // Constructs a FloatingPoint from a raw floating-point number.
+ //
+ // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+ // around may change its bits, although the new value is guaranteed
+ // to be also a NAN. Therefore, don't expect this constructor to
+ // preserve the bits in x when x is a NAN.
+ explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+ // Static methods
+
+ // Reinterprets a bit pattern as a floating-point number.
+ //
+ // This function is needed to test the AlmostEquals() method.
+ static RawType ReinterpretBits(const Bits bits) {
+ FloatingPoint fp(0);
+ fp.u_.bits_ = bits;
+ return fp.u_.value_;
+ }
+
+ // Returns the floating-point number that represent positive infinity.
+ static RawType Infinity() {
+ return ReinterpretBits(kExponentBitMask);
+ }
+
+ // Returns the maximum representable finite floating-point number.
+ static RawType Max();
+
+ // Non-static methods
+
+ // Returns the bits that represents this number.
+ const Bits &bits() const { return u_.bits_; }
+
+ // Returns the exponent bits of this number.
+ Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+ // Returns the fraction bits of this number.
+ Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+ // Returns the sign bit of this number.
+ Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+ // Returns true iff this is NAN (not a number).
+ bool is_nan() const {
+ // It's a NAN if the exponent bits are all ones and the fraction
+ // bits are not entirely zeros.
+ return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+ }
+
+ // Returns true iff this number is at most kMaxUlps ULP's away from
+ // rhs. In particular, this function:
+ //
+ // - returns false if either number is (or both are) NAN.
+ // - treats really large numbers as almost equal to infinity.
+ // - thinks +0.0 and -0.0 are 0 DLP's apart.
+ bool AlmostEquals(const FloatingPoint& rhs) const {
+ // The IEEE standard says that any comparison operation involving
+ // a NAN must return false.
+ if (is_nan() || rhs.is_nan()) return false;
+
+ return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+ <= kMaxUlps;
+ }
+
+ private:
+ // The data type used to store the actual floating-point number.
+ union FloatingPointUnion {
+ RawType value_; // The raw floating-point number.
+ Bits bits_; // The bits that represent the number.
+ };
+
+ // Converts an integer from the sign-and-magnitude representation to
+ // the biased representation. More precisely, let N be 2 to the
+ // power of (kBitCount - 1), an integer x is represented by the
+ // unsigned number x + N.
+ //
+ // For instance,
+ //
+ // -N + 1 (the most negative number representable using
+ // sign-and-magnitude) is represented by 1;
+ // 0 is represented by N; and
+ // N - 1 (the biggest number representable using
+ // sign-and-magnitude) is represented by 2N - 1.
+ //
+ // Read http://en.wikipedia.org/wiki/Signed_number_representations
+ // for more details on signed number representations.
+ static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+ if (kSignBitMask & sam) {
+ // sam represents a negative number.
+ return ~sam + 1;
+ } else {
+ // sam represents a positive number.
+ return kSignBitMask | sam;
+ }
+ }
+
+ // Given two numbers in the sign-and-magnitude representation,
+ // returns the distance between them as an unsigned number.
+ static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+ const Bits &sam2) {
+ const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+ const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+ return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+ }
+
+ FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them. The TypeId type is
+// used to hold such IDs. The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+ // dummy_ must not have a const type. Otherwise an overly eager
+ // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+ // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+ static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T. Different values will be
+// returned for different types. Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+ // The compiler is required to allocate a different
+ // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+ // the template. Therefore, the address of dummy_ is guaranteed to
+ // be unique.
+ return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test. Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+ virtual ~TestFactoryBase() {}
+
+ // Creates a test instance to run. The instance is both created and destroyed
+ // within TestInfoImpl::Run()
+ virtual Test* CreateTest() = 0;
+
+ protected:
+ TestFactoryBase() {}
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+ virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+ long hr); // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+ long hr); // NOLINT
+
+#endif // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+struct CodeLocation {
+ CodeLocation(const string& a_file, int a_line) : file(a_file), line(a_line) {}
+
+ string file;
+ int line;
+};
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// name: name of the test
+// type_param the name of the test's type parameter, or NULL if
+// this is not a typed or a type-parameterized test.
+// value_param text representation of the test's value parameter,
+// or NULL if this is not a type-parameterized test.
+// code_location: code location where the test is defined
+// fixture_class_id: ID of the test fixture class
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+// factory: pointer to the factory that creates a test object.
+// The newly created TestInfo instance will assume
+// ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ CodeLocation code_location,
+ TypeId fixture_class_id,
+ SetUpTestCaseFunc set_up_tc,
+ TearDownTestCaseFunc tear_down_tc,
+ TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false. None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+ TypedTestCasePState() : registered_(false) {}
+
+ // Adds the given test name to defined_test_names_ and return true
+ // if the test case hasn't been registered; otherwise aborts the
+ // program.
+ bool AddTestName(const char* file, int line, const char* case_name,
+ const char* test_name) {
+ if (registered_) {
+ fprintf(stderr, "%s Test %s must be defined before "
+ "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+ FormatFileLocation(file, line).c_str(), test_name, case_name);
+ fflush(stderr);
+ posix::Abort();
+ }
+ registered_tests_.insert(
+ ::std::make_pair(test_name, CodeLocation(file, line)));
+ return true;
+ }
+
+ bool TestExists(const std::string& test_name) const {
+ return registered_tests_.count(test_name) > 0;
+ }
+
+ const CodeLocation& GetCodeLocation(const std::string& test_name) const {
+ RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);
+ GTEST_CHECK_(it != registered_tests_.end());
+ return it->second;
+ }
+
+ // Verifies that registered_tests match the test names in
+ // defined_test_names_; returns registered_tests if successful, or
+ // aborts the program otherwise.
+ const char* VerifyRegisteredTestNames(
+ const char* file, int line, const char* registered_tests);
+
+ private:
+ typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;
+
+ bool registered_;
+ RegisteredTestsMap registered_tests_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+ const char* comma = strchr(str, ',');
+ if (comma == NULL) {
+ return NULL;
+ }
+ while (IsSpace(*(++comma))) {}
+ return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+ const char* comma = strchr(str, ',');
+ return comma == NULL ? str : std::string(str, comma);
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.
+void SplitString(const ::std::string& str, char delimiter,
+ ::std::vector< ::std::string>* dest);
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test. The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter. It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+ // 'index' is the index of the test in the type list 'Types'
+ // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+ // Types). Valid values for 'index' are [0, N - 1] where N is the
+ // length of Types.
+ static bool Register(const char* prefix,
+ CodeLocation code_location,
+ const char* case_name, const char* test_names,
+ int index) {
+ typedef typename Types::Head Type;
+ typedef Fixture<Type> FixtureClass;
+ typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+ // First, registers the first type-parameterized test in the type
+ // list.
+ MakeAndRegisterTestInfo(
+ (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+ + StreamableToString(index)).c_str(),
+ StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
+ GetTypeName<Type>().c_str(),
+ NULL, // No value parameter.
+ code_location,
+ GetTypeId<FixtureClass>(),
+ TestClass::SetUpTestCase,
+ TestClass::TearDownTestCase,
+ new TestFactoryImpl<TestClass>);
+
+ // Next, recurses (at compile time) with the tail of the type list.
+ return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+ ::Register(prefix, code_location, case_name, test_names, index + 1);
+ }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+ static bool Register(const char* /*prefix*/, CodeLocation,
+ const char* /*case_name*/, const char* /*test_names*/,
+ int /*index*/) {
+ return true;
+ }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test. The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+ static bool Register(const char* prefix, CodeLocation code_location,
+ const TypedTestCasePState* state,
+ const char* case_name, const char* test_names) {
+ std::string test_name = StripTrailingSpaces(
+ GetPrefixUntilComma(test_names));
+ if (!state->TestExists(test_name)) {
+ fprintf(stderr, "Failed to get code location for test %s.%s at %s.",
+ case_name, test_name.c_str(),
+ FormatFileLocation(code_location.file.c_str(),
+ code_location.line).c_str());
+ fflush(stderr);
+ posix::Abort();
+ }
+ const CodeLocation& test_location = state->GetCodeLocation(test_name);
+
+ typedef typename Tests::Head Head;
+
+ // First, register the first test in 'Test' for each type in 'Types'.
+ TypeParameterizedTest<Fixture, Head, Types>::Register(
+ prefix, test_location, case_name, test_names, 0);
+
+ // Next, recurses (at compile time) with the tail of the test list.
+ return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+ ::Register(prefix, code_location, state,
+ case_name, SkipComma(test_names));
+ }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+ static bool Register(const char* /*prefix*/, CodeLocation,
+ const TypedTestCasePState* /*state*/,
+ const char* /*case_name*/, const char* /*test_names*/) {
+ return true;
+ }
+};
+
+#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+ UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+ ConstCharPtr(const char* str) : value(str) {}
+ operator bool() const { return true; }
+ const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution. Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code). Unlike rand_r(), it's portable. An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+ static const UInt32 kMaxRange = 1u << 31;
+
+ explicit Random(UInt32 seed) : state_(seed) {}
+
+ void Reseed(UInt32 seed) { state_ = seed; }
+
+ // Generates a random number from [0, range). Crashes if 'range' is
+ // 0 or greater than kMaxRange.
+ UInt32 Generate(UInt32 range);
+
+ private:
+ UInt32 state_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged. This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; }; // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; }; // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+ typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged. This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; }; // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; }; // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'. The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+ typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+ typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+ typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+ GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged. This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; }; // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+ typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary. For example,
+// it transforms
+//
+// char ==> const char&
+// const char ==> const char&
+// char& ==> const char&
+// const char& ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+ GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+ // We need the following helper functions only for their types.
+ // They have no implementations.
+
+ // MakeFrom() is an expression whose type is From. We cannot simply
+ // use From(), as the type From may not have a public default
+ // constructor.
+ static typename AddReference<From>::type MakeFrom();
+
+ // These two functions are overloaded. Given an expression
+ // Helper(x), the compiler will pick the first version if x can be
+ // implicitly converted to type To; otherwise it will pick the
+ // second version.
+ //
+ // The first version returns a value of size 1, and the second
+ // version returns a value of size 2. Therefore, by checking the
+ // size of Helper(x), which can be done at compile time, we can tell
+ // which version of Helper() is used, and hence whether x can be
+ // implicitly converted to type To.
+ static char Helper(To);
+ static char (&Helper(...))[2]; // NOLINT
+
+ // We have to put the 'public' section after the 'private' section,
+ // or MSVC refuses to compile the code.
+ public:
+#if defined(__BORLANDC__)
+ // C++Builder cannot use member overload resolution during template
+ // instantiation. The simplest workaround is to use its C++0x type traits
+ // functions (C++Builder 2009 and above only).
+ static const bool value = __is_convertible(From, To);
+#else
+ // MSVC warns about implicitly converting from double to int for
+ // possible loss of data, so we need to temporarily disable the
+ // warning.
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)
+ static const bool value =
+ sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+#endif // __BORLANDC__
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+ : public bool_constant<
+ ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+ ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them). It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0. If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked. Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator. The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator'). If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+ typename C::iterator* /* it */ = NULL,
+ typename C::const_iterator* /* const_it */ = NULL) {
+ return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false. To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; }; // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0. When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+ return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat. If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+ for (size_t i = 0; i != size; i++) {
+ if (!internal::ArrayEq(lhs[i], rhs[i]))
+ return false;
+ }
+ return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem. Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+ for (Iter it = begin; it != end; ++it) {
+ if (internal::ArrayEq(*it, elem))
+ return it;
+ }
+ return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0. When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+ internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat. If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+ for (size_t i = 0; i != size; i++) {
+ internal::CopyArray(from[i], to + i);
+ }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+// We use 2 different structs to allow non-copyable types to be used, as long
+// as RelationToSourceReference() is passed.
+struct RelationToSourceReference {};
+struct RelationToSourceCopy {};
+
+// Adapts a native array to a read-only STL-style container. Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers. New members
+// should be added as needed. To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier). It's the client's responsibility to satisfy
+// this requirement. Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+ // STL-style container typedefs.
+ typedef Element value_type;
+ typedef Element* iterator;
+ typedef const Element* const_iterator;
+
+ // Constructs from a native array. References the source.
+ NativeArray(const Element* array, size_t count, RelationToSourceReference) {
+ InitRef(array, count);
+ }
+
+ // Constructs from a native array. Copies the source.
+ NativeArray(const Element* array, size_t count, RelationToSourceCopy) {
+ InitCopy(array, count);
+ }
+
+ // Copy constructor.
+ NativeArray(const NativeArray& rhs) {
+ (this->*rhs.clone_)(rhs.array_, rhs.size_);
+ }
+
+ ~NativeArray() {
+ if (clone_ != &NativeArray::InitRef)
+ delete[] array_;
+ }
+
+ // STL-style container methods.
+ size_t size() const { return size_; }
+ const_iterator begin() const { return array_; }
+ const_iterator end() const { return array_ + size_; }
+ bool operator==(const NativeArray& rhs) const {
+ return size() == rhs.size() &&
+ ArrayEq(begin(), size(), rhs.begin());
+ }
+
+ private:
+ enum {
+ kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper<
+ Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value,
+ };
+
+ // Initializes this object with a copy of the input.
+ void InitCopy(const Element* array, size_t a_size) {
+ Element* const copy = new Element[a_size];
+ CopyArray(array, a_size, copy);
+ array_ = copy;
+ size_ = a_size;
+ clone_ = &NativeArray::InitCopy;
+ }
+
+ // Initializes this object with a reference of the input.
+ void InitRef(const Element* array, size_t a_size) {
+ array_ = array;
+ size_ = a_size;
+ clone_ = &NativeArray::InitRef;
+ }
+
+ const Element* array_;
+ size_t size_;
+ void (NativeArray::*clone_)(const Element*, size_t);
+
+ GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+} // namespace internal
+} // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+ ::testing::internal::AssertHelper(result_type, file, line, message) \
+ = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+ GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+ if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+ bool gtest_caught_expected = false; \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (expected_exception const&) { \
+ gtest_caught_expected = true; \
+ } \
+ catch (...) { \
+ gtest_msg.value = \
+ "Expected: " #statement " throws an exception of type " \
+ #expected_exception ".\n Actual: it throws a different type."; \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+ } \
+ if (!gtest_caught_expected) { \
+ gtest_msg.value = \
+ "Expected: " #statement " throws an exception of type " \
+ #expected_exception ".\n Actual: it throws nothing."; \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+ fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (...) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+ fail("Expected: " #statement " doesn't throw an exception.\n" \
+ " Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ bool gtest_caught_any = false; \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (...) { \
+ gtest_caught_any = true; \
+ } \
+ if (!gtest_caught_any) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+ fail("Expected: " #statement " throws an exception.\n" \
+ " Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (const ::testing::AssertionResult gtest_ar_ = \
+ ::testing::AssertionResult(expression)) \
+ ; \
+ else \
+ fail(::testing::internal::GetBoolAssertionFailureMessage(\
+ gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+ fail("Expected: " #statement " doesn't generate new fatal " \
+ "failures in the current thread.\n" \
+ " Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+ test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+ virtual void TestBody();\
+ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+ ::test_info_ =\
+ ::testing::internal::MakeAndRegisterTestInfo(\
+ #test_case_name, #test_name, NULL, NULL, \
+ ::testing::internal::CodeLocation(__FILE__, __LINE__), \
+ (parent_id), \
+ parent_class::SetUpTestCase, \
+ parent_class::TearDownTestCase, \
+ new ::testing::internal::TestFactoryImpl<\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests. It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests. They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status: The integer exit information in the format specified
+// by wait(2)
+// exit code: The integer code passed to exit(3), _exit(2), or
+// returned from main()
+class GTEST_API_ DeathTest {
+ public:
+ // Create returns false if there was an error determining the
+ // appropriate action to take for the current death test; for example,
+ // if the gtest_death_test_style flag is set to an invalid value.
+ // The LastMessage method will return a more detailed message in that
+ // case. Otherwise, the DeathTest pointer pointed to by the "test"
+ // argument is set. If the death test should be skipped, the pointer
+ // is set to NULL; otherwise, it is set to the address of a new concrete
+ // DeathTest object that controls the execution of the current test.
+ static bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test);
+ DeathTest();
+ virtual ~DeathTest() { }
+
+ // A helper class that aborts a death test when it's deleted.
+ class ReturnSentinel {
+ public:
+ explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+ ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+ private:
+ DeathTest* const test_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+ } GTEST_ATTRIBUTE_UNUSED_;
+
+ // An enumeration of possible roles that may be taken when a death
+ // test is encountered. EXECUTE means that the death test logic should
+ // be executed immediately. OVERSEE means that the program should prepare
+ // the appropriate environment for a child process to execute the death
+ // test, then wait for it to complete.
+ enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+ // An enumeration of the three reasons that a test might be aborted.
+ enum AbortReason {
+ TEST_ENCOUNTERED_RETURN_STATEMENT,
+ TEST_THREW_EXCEPTION,
+ TEST_DID_NOT_DIE
+ };
+
+ // Assumes one of the above roles.
+ virtual TestRole AssumeRole() = 0;
+
+ // Waits for the death test to finish and returns its status.
+ virtual int Wait() = 0;
+
+ // Returns true if the death test passed; that is, the test process
+ // exited during the test, its exit status matches a user-supplied
+ // predicate, and its stderr output matches a user-supplied regular
+ // expression.
+ // The user-supplied predicate may be a macro expression rather
+ // than a function pointer or functor, or else Wait and Passed could
+ // be combined.
+ virtual bool Passed(bool exit_status_ok) = 0;
+
+ // Signals that the death test did not die as expected.
+ virtual void Abort(AbortReason reason) = 0;
+
+ // Returns a human-readable outcome message regarding the outcome of
+ // the last death test.
+ static const char* LastMessage();
+
+ static void set_last_death_test_message(const std::string& message);
+
+ private:
+ // A string containing a description of the outcome of the last death test.
+ static std::string last_death_test_message_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests. May be mocked out for testing.
+class DeathTestFactory {
+ public:
+ virtual ~DeathTestFactory() { }
+ virtual bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+ virtual bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } catch (const ::std::exception& gtest_exception) { \
+ fprintf(\
+ stderr, \
+ "\n%s: Caught std::exception-derived exception escaping the " \
+ "death test statement. Exception message: %s\n", \
+ ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+ gtest_exception.what()); \
+ fflush(stderr); \
+ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+ } catch (...) { \
+ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+ }
+
+# else
+# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ const ::testing::internal::RE& gtest_regex = (regex); \
+ ::testing::internal::DeathTest* gtest_dt; \
+ if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+ __FILE__, __LINE__, &gtest_dt)) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+ } \
+ if (gtest_dt != NULL) { \
+ ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+ gtest_dt_ptr(gtest_dt); \
+ switch (gtest_dt->AssumeRole()) { \
+ case ::testing::internal::DeathTest::OVERSEE_TEST: \
+ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+ } \
+ break; \
+ case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+ ::testing::internal::DeathTest::ReturnSentinel \
+ gtest_sentinel(gtest_dt); \
+ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+ break; \
+ } \
+ default: \
+ break; \
+ } \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+ fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } else \
+ ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+ InternalRunDeathTestFlag(const std::string& a_file,
+ int a_line,
+ int an_index,
+ int a_write_fd)
+ : file_(a_file), line_(a_line), index_(an_index),
+ write_fd_(a_write_fd) {}
+
+ ~InternalRunDeathTestFlag() {
+ if (write_fd_ >= 0)
+ posix::Close(write_fd_);
+ }
+
+ const std::string& file() const { return file_; }
+ int line() const { return line_; }
+ int index() const { return index_; }
+ int write_fd() const { return write_fd_; }
+
+ private:
+ std::string file_;
+ int line_;
+ int index_;
+ int write_fd_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+// statement - A statement that a macro such as EXPECT_DEATH would test
+// for program termination. This macro has to make sure this
+// statement is compiled but not executed, to ensure that
+// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+// parameter iff EXPECT_DEATH compiles with it.
+// regex - A regex that a macro such as EXPECT_DEATH would use to test
+// the output of statement. This parameter has to be
+// compiled but not evaluated by this macro, to ensure that
+// this macro only accepts expressions that a macro such as
+// EXPECT_DEATH would accept.
+// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+// compile inside functions where ASSERT_DEATH doesn't
+// compile.
+//
+// The branch that has an always false condition is used to ensure that
+// statement and regex are compiled (and thus syntactically correct) but
+// never executed. The unreachable code macro protects the terminator
+// statement from generating an 'unreachable code' warning in case
+// statement unconditionally returns or throws. The Message constructor at
+// the end allows the syntax of streaming additional messages into the
+// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ GTEST_LOG_(WARNING) \
+ << "Death tests are not supported on this platform.\n" \
+ << "Statement '" #statement "' cannot be verified."; \
+ } else if (::testing::internal::AlwaysFalse()) { \
+ ::testing::internal::RE::PartialMatch(".*", (regex)); \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ terminator; \
+ } else \
+ ::testing::Message()
+
+#endif // GTEST_HAS_DEATH_TEST
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests. Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process. Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests. IMPORTANT: This is an internal utility. Using it may break the
+// implementation of death tests. User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+} // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+// 1. It generates a warning if there is more than one active
+// thread. This is because it's safe to fork() or clone() only
+// when there is a single thread.
+//
+// 2. The parent process clone()s a sub-process and runs the death
+// test in it; the sub-process exits with code 0 at the end of the
+// death test, if it hasn't exited already.
+//
+// 3. The parent process waits for the sub-process to terminate.
+//
+// 4. The parent process checks the exit code and error message of
+// the sub-process.
+//
+// Examples:
+//
+// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+// for (int i = 0; i < 5; i++) {
+// EXPECT_DEATH(server.ProcessRequest(i),
+// "Invalid request .* in ProcessRequest()")
+// << "Failed to die on request " << i;
+// }
+//
+// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+// bool KilledBySIGHUP(int exit_code) {
+// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+// }
+//
+// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+// On POSIX-compliant systems (*nix), we use the <regex.h> library,
+// which uses the POSIX extended regex syntax.
+//
+// On other platforms (e.g. Windows), we only support a simple regex
+// syntax implemented as part of Google Test. This limited
+// implementation should be enough most of the time when writing
+// death tests; though it lacks many features you can find in PCRE
+// or POSIX extended regex syntax. For example, we don't support
+// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+// repetition count ("x{5,7}"), among others.
+//
+// Below is the syntax that we do support. We chose it to be a
+// subset of both PCRE and POSIX extended regex, so it's easy to
+// learn wherever you come from. In the following: 'A' denotes a
+// literal character, period (.), or a single \\ escape sequence;
+// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
+// natural numbers.
+//
+// c matches any literal character c
+// \\d matches any decimal digit
+// \\D matches any character that's not a decimal digit
+// \\f matches \f
+// \\n matches \n
+// \\r matches \r
+// \\s matches any ASCII whitespace, including \n
+// \\S matches any character that's not a whitespace
+// \\t matches \t
+// \\v matches \v
+// \\w matches any letter, _, or decimal digit
+// \\W matches any character that \\w doesn't match
+// \\c matches any literal character c, which must be a punctuation
+// . matches any single character except \n
+// A? matches 0 or 1 occurrences of A
+// A* matches 0 or many occurrences of A
+// A+ matches 1 or many occurrences of A
+// ^ matches the beginning of a string (not that of each line)
+// $ matches the end of a string (not that of each line)
+// xy matches x followed by y
+//
+// If you accidentally use PCRE or POSIX extended regex features
+// not implemented by us, you will get a run-time failure. In that
+// case, please try to rewrite your regular expression within the
+// above syntax.
+//
+// This implementation is *not* meant to be as highly tuned or robust
+// as a compiled regex library, but should perform well enough for a
+// death test, which already incurs significant overhead by launching
+// a child process.
+//
+// Known caveats:
+//
+// A "threadsafe" style death test obtains the path to the test
+// program from argv[0] and re-executes it in the sub-process. For
+// simplicity, the current implementation doesn't search the PATH
+// when launching the sub-process. This means that the user must
+// invoke the test program via a path that contains at least one
+// path separator (e.g. path/to/foo_test and
+// /absolute/path/to/bar_test are fine, but foo_test is not). This
+// is rarely a problem as people usually don't put the test binary
+// directory in PATH.
+//
+// TODO(wan@google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+ explicit ExitedWithCode(int exit_code);
+ bool operator()(int exit_status) const;
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ExitedWithCode& other);
+
+ const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+ explicit KilledBySignal(int signum);
+ bool operator()(int exit_status) const;
+ private:
+ const int signum_;
+};
+# endif // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+// if (sideeffect) {
+// *sideeffect = 12;
+// }
+// LOG(DFATAL) << "death";
+// return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+// int sideeffect = 0;
+// // Only asserts in dbg.
+// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+// // opt-mode has sideeffect visible.
+// EXPECT_EQ(12, sideeffect);
+// #else
+// // dbg-mode no visible sideeffect.
+// EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects. A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+// // Side-effects here will have an effect after this statement in
+// // opt mode, but none in debug mode.
+// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+# define EXPECT_DEBUG_DEATH(statement, regex) \
+ GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# define ASSERT_DEBUG_DEATH(statement, regex) \
+ GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+# define EXPECT_DEBUG_DEATH(statement, regex) \
+ EXPECT_DEATH(statement, regex)
+
+# define ASSERT_DEBUG_DEATH(statement, regex) \
+ ASSERT_DEATH(statement, regex)
+
+# endif // NDEBUG for EXPECT_DEBUG_DEATH
+#endif // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning. This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+ EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+ ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+// pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl@google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+ // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+ // Inside a test, access the test parameter with the GetParam() method
+ // of the TestWithParam<T> class:
+ EXPECT_TRUE(foo.Blah(GetParam()));
+ ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+ ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a summary of them, which
+// are all in the testing namespace:
+//
+//
+// Range(begin, end [, step]) - Yields values {begin, begin+step,
+// begin+step+step, ...}. The values do not
+// include end. step defaults to 1.
+// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
+// ValuesIn(container) - Yields values from a C-style array, an STL
+// ValuesIn(begin,end) container, or an iterator range [begin, end).
+// Bool() - Yields sequence {false, true}.
+// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
+// for the math savvy) of the values generated
+// by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+ FooTest,
+ Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+// * InstantiationName/FooTest.DoesBlah/1 for "miny"
+// * InstantiationName/FooTest.DoesBlah/2 for "moe"
+// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+ // You can inherit all the usual members for a non-parameterized test
+ // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+ // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+ // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+ // GetParam works just the same here as if you inherit from TestWithParam.
+ EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl@google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <ctype.h>
+
+#include <iterator>
+#include <set>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor@google.com)
+//
+// A "smart" pointer type with reference tracking. Every pointer to a
+// particular object is kept on a circular linked list. When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+// object is traversed. This class is therefore NOT SUITABLE when there
+// will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+// will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+// Unlike other linked_ptr implementations, in this implementation
+// a linked_ptr object is thread-safe in the sense that:
+// - it's safe to copy linked_ptr objects concurrently,
+// - it's safe to copy *from* a linked_ptr and read its underlying
+// raw pointer (e.g. via get()) concurrently, and
+// - it's safe to write to two linked_ptrs that point to the same
+// shared object concurrently.
+// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>. It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+ // Create a new circle that includes only this instance.
+ void join_new() {
+ next_ = this;
+ }
+
+ // Many linked_ptr operations may change p.link_ for some linked_ptr
+ // variable p in the same circle as this object. Therefore we need
+ // to prevent two such operations from occurring concurrently.
+ //
+ // Note that different types of linked_ptr objects can coexist in a
+ // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+ // linked_ptr<Derived2>). Therefore we must use a single mutex to
+ // protect all linked_ptr objects. This can create serious
+ // contention in production code, but is acceptable in a testing
+ // framework.
+
+ // Join an existing circle.
+ void join(linked_ptr_internal const* ptr)
+ GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+ MutexLock lock(&g_linked_ptr_mutex);
+
+ linked_ptr_internal const* p = ptr;
+ while (p->next_ != ptr) {
+ assert(p->next_ != this &&
+ "Trying to join() a linked ring we are already in. "
+ "Is GMock thread safety enabled?");
+ p = p->next_;
+ }
+ p->next_ = this;
+ next_ = ptr;
+ }
+
+ // Leave whatever circle we're part of. Returns true if we were the
+ // last member of the circle. Once this is done, you can join() another.
+ bool depart()
+ GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+ MutexLock lock(&g_linked_ptr_mutex);
+
+ if (next_ == this) return true;
+ linked_ptr_internal const* p = next_;
+ while (p->next_ != this) {
+ assert(p->next_ != next_ &&
+ "Trying to depart() a linked ring we are not in. "
+ "Is GMock thread safety enabled?");
+ p = p->next_;
+ }
+ p->next_ = next_;
+ return false;
+ }
+
+ private:
+ mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+ typedef T element_type;
+
+ // Take over ownership of a raw pointer. This should happen as soon as
+ // possible after the object is created.
+ explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+ ~linked_ptr() { depart(); }
+
+ // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+ template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+ linked_ptr(linked_ptr const& ptr) { // NOLINT
+ assert(&ptr != this);
+ copy(&ptr);
+ }
+
+ // Assignment releases the old value and acquires the new.
+ template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+ depart();
+ copy(&ptr);
+ return *this;
+ }
+
+ linked_ptr& operator=(linked_ptr const& ptr) {
+ if (&ptr != this) {
+ depart();
+ copy(&ptr);
+ }
+ return *this;
+ }
+
+ // Smart pointer members.
+ void reset(T* ptr = NULL) {
+ depart();
+ capture(ptr);
+ }
+ T* get() const { return value_; }
+ T* operator->() const { return value_; }
+ T& operator*() const { return *value_; }
+
+ bool operator==(T* p) const { return value_ == p; }
+ bool operator!=(T* p) const { return value_ != p; }
+ template <typename U>
+ bool operator==(linked_ptr<U> const& ptr) const {
+ return value_ == ptr.get();
+ }
+ template <typename U>
+ bool operator!=(linked_ptr<U> const& ptr) const {
+ return value_ != ptr.get();
+ }
+
+ private:
+ template <typename U>
+ friend class linked_ptr;
+
+ T* value_;
+ linked_ptr_internal link_;
+
+ void depart() {
+ if (link_.depart()) delete value_;
+ }
+
+ void capture(T* ptr) {
+ value_ = ptr;
+ link_.join_new();
+ }
+
+ template <typename U> void copy(linked_ptr<U> const* ptr) {
+ value_ = ptr->get();
+ if (value_)
+ link_.join(&ptr->link_);
+ else
+ link_.join_new();
+ }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+ return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+ return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+ return linked_ptr<T>(ptr);
+}
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T. More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+// 1. foo::PrintTo(const T&, ostream*)
+// 2. operator<<(ostream&, const T&) defined in either foo or the
+// global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+// // Prints a value to a string. For a (const or not) char
+// // pointer, the NUL-terminated string (but not the pointer) is
+// // printed.
+// std::string ::testing::PrintToString(const T& value);
+//
+// // Prints a value tersely: for a reference type, the referenced
+// // value (but not the address) is printed; for a (const or not) char
+// // pointer, the NUL-terminated string (but not the pointer) is
+// // printed.
+// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+// // Prints value using the type inferred by the compiler. The difference
+// // from UniversalTersePrint() is that this function prints both the
+// // pointer and the NUL-terminated string for a (const or not) char pointer.
+// void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+// // Prints the fields of a tuple tersely to a string vector, one
+// // element for each field. Tuple support must be enabled in
+// // gtest-port.h.
+// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+// const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container. When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect. In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator. We'll fix this if there's an
+// actual need for it. Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream> // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+#if GTEST_HAS_STD_TUPLE_
+# include <tuple>
+#endif
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice. DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+ size_t count,
+ ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+ kProtobuf, // a protobuf type
+ kConvertibleToInteger, // a type implicitly convertible to BiggestInt
+ // (e.g. a named or unnamed enum type)
+ kOtherType // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+ // This default version is called when kTypeKind is kOtherType.
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+ sizeof(value), os);
+ }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ const ::testing::internal::string short_str = value.ShortDebugString();
+ const ::testing::internal::string pretty_str =
+ short_str.length() <= kProtobufOneLinerMaxLength ?
+ short_str : ("\n" + value.DebugString());
+ *os << ("<" + pretty_str + ">");
+ }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+ // Since T has no << operator or PrintTo() but can be implicitly
+ // converted to BiggestInt, we print it as a BiggestInt.
+ //
+ // Most likely T is an enum type (either named or unnamed), in which
+ // case printing it as an integer is the desired behavior. In case
+ // T is not an enum, printing it as an integer is the best we can do
+ // given that it has no user-defined printer.
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ const internal::BiggestInt kBigInt = value;
+ *os << kBigInt;
+ }
+};
+
+// Prints the given value to the given ostream. If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed. This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream. If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+ ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+ TypeWithoutFormatter<T,
+ (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+ internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+ kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+ return os;
+}
+
+} // namespace internal2
+} // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+ // With the following statement, during unqualified name lookup,
+ // testing::internal2::operator<< appears as if it was declared in
+ // the nearest enclosing namespace that contains both
+ // ::testing_internal and ::testing::internal2, i.e. the global
+ // namespace. For more details, refer to the C++ Standard section
+ // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
+ // testing::internal2::operator<< in case T doesn't come with a <<
+ // operator.
+ //
+ // We cannot write 'using ::testing::internal2::operator<<;', which
+ // gcc 3.3 fails to compile due to a compiler bug.
+ using namespace ::testing::internal2; // NOLINT
+
+ // Assuming T is defined in namespace foo, in the next statement,
+ // the compiler will consider all of:
+ //
+ // 1. foo::operator<< (thanks to Koenig look-up),
+ // 2. ::operator<< (as the current namespace is enclosed in ::),
+ // 3. testing::internal2::operator<< (thanks to the using statement above).
+ //
+ // The operator<< whose type matches T best will be picked.
+ //
+ // We deliberately allow #2 to be a candidate, as sometimes it's
+ // impossible to define #1 (e.g. when foo is ::std, defining
+ // anything in it is undefined behavior unless you are a compiler
+ // vendor.).
+ *os << value;
+}
+
+} // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value. In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object. If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+ static ::std::string Format(const ToPrint& value) {
+ return ::testing::PrintToString(value);
+ }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+ static ::std::string Format(const ToPrint* value) {
+ return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+ }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
+ template <typename OtherOperand> \
+ class FormatForComparison<CharType*, OtherOperand> { \
+ public: \
+ static ::std::string Format(CharType* value) { \
+ return ::testing::PrintToString(static_cast<const void*>(value)); \
+ } \
+ }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+ template <> \
+ class FormatForComparison<CharType*, OtherStringType> { \
+ public: \
+ static ::std::string Format(CharType* value) { \
+ return ::testing::PrintToString(value); \
+ } \
+ }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message. The type (but not value)
+// of the other operand may affect the format. This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+ const T1& value, const T2& /* other_operand */) {
+ return FormatForComparison<T1, T2>::Format(value);
+}
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream. The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+ false_type /* is not a pointer */,
+ const C& container, ::std::ostream* os) {
+ const size_t kMaxCount = 32; // The maximum number of elements to print.
+ *os << '{';
+ size_t count = 0;
+ for (typename C::const_iterator it = container.begin();
+ it != container.end(); ++it, ++count) {
+ if (count > 0) {
+ *os << ',';
+ if (count == kMaxCount) { // Enough has been printed.
+ *os << " ...";
+ break;
+ }
+ }
+ *os << ' ';
+ // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+ // handle *it being a native array.
+ internal::UniversalPrint(*it, os);
+ }
+
+ if (count > 0) {
+ *os << ' ';
+ }
+ *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it. (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space. Their representation is
+// implementation-defined. Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+ true_type /* is a pointer */,
+ T* p, ::std::ostream* os) {
+ if (p == NULL) {
+ *os << "NULL";
+ } else {
+ // C++ doesn't allow casting from a function pointer to any object
+ // pointer.
+ //
+ // IsTrue() silences warnings: "Condition is always true",
+ // "unreachable code".
+ if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+ // T is not a function type. We just call << to print p,
+ // relying on ADL to pick up user-defined << for their pointer
+ // types, if any.
+ *os << p;
+ } else {
+ // T is a function type, so '*os << p' doesn't do what we want
+ // (it just prints p as bool). We want to print p as a const
+ // void*. However, we cannot cast it to const void* directly,
+ // even using reinterpret_cast, as earlier versions of gcc
+ // (e.g. 3.4.5) cannot compile the cast when p is a function
+ // pointer. Casting to UInt64 first solves the problem.
+ *os << reinterpret_cast<const void*>(
+ /*reinterpret_cast<internal::UInt64>*/(p));
+ }
+ }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+ false_type /* is not a pointer */,
+ const T& value, ::std::ostream* os) {
+ ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it. This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined. We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+ // DefaultPrintTo() is overloaded. The type of its first two
+ // arguments determine which version will be picked. If T is an
+ // STL-style container, the version for container will be called; if
+ // T is a pointer, the pointer version will be called; otherwise the
+ // generic version will be called.
+ //
+ // Note that we check for container types here, prior to we check
+ // for protocol message types in our operator<<. The rationale is:
+ //
+ // For protocol messages, we want to give people a chance to
+ // override Google Mock's format by defining a PrintTo() or
+ // operator<<. For STL containers, other formats can be
+ // incompatible with Google Mock's format for the container
+ // elements; therefore we check for container types here to ensure
+ // that our format is used.
+ //
+ // The second argument of DefaultPrintTo() is needed to bypass a bug
+ // in Symbian's C++ compiler that prevents it from picking the right
+ // overload between:
+ //
+ // PrintTo(const T& x, ...);
+ // PrintTo(T* x, ...);
+ DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+ // When printing a plain char, we always treat it as unsigned. This
+ // way, the output won't be affected by whether the compiler thinks
+ // char is signed or not.
+ PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+ *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type. When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays. Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+ UniversalPrint(a[0], os);
+ for (size_t i = 1; i != count; i++) {
+ *os << ", ";
+ UniversalPrint(a[i], os);
+ }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+ PrintStringTo(s, os);
+}
+#endif // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+ PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+ PrintWideStringTo(s, os);
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+ PrintWideStringTo(s, os);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
+// Helper function for printing a tuple. T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+#endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple. Needed for printing function arguments,
+// which are packed as tuples.
+
+// Overloaded PrintTo() for tuples of various arities. We support
+// tuples of up-to 10 fields. The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+ const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+#endif // GTEST_HAS_TR1_TUPLE
+
+#if GTEST_HAS_STD_TUPLE_
+template <typename... Types>
+void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+#endif // GTEST_HAS_STD_TUPLE_
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+ *os << '(';
+ // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+ // a reference type. The same for printing value.second.
+ UniversalPrinter<T1>::Print(value.first, os);
+ *os << ", ";
+ UniversalPrinter<T2>::Print(value.second, os);
+ *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+ // MSVC warns about adding const to a function type, so we want to
+ // disable the warning.
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
+
+ // Note: we deliberately don't call this PrintTo(), as that name
+ // conflicts with ::testing::internal::PrintTo in the body of the
+ // function.
+ static void Print(const T& value, ::std::ostream* os) {
+ // By default, ::testing::internal::PrintTo() is used for printing
+ // the value.
+ //
+ // Thanks to Koenig look-up, if T is a class and has its own
+ // PrintTo() function defined in its namespace, that function will
+ // be visible here. Since it is more specific than the generic ones
+ // in ::testing::internal, it will be picked by the compiler in the
+ // following statement - exactly what we want.
+ PrintTo(value, os);
+ }
+
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+ if (len == 0) {
+ *os << "{}";
+ } else {
+ *os << "{ ";
+ const size_t kThreshold = 18;
+ const size_t kChunkSize = 8;
+ // If the array has more than kThreshold elements, we'll have to
+ // omit some details by printing only the first and the last
+ // kChunkSize elements.
+ // TODO(wan@google.com): let the user control the threshold using a flag.
+ if (len <= kThreshold) {
+ PrintRawArrayTo(begin, len, os);
+ } else {
+ PrintRawArrayTo(begin, kChunkSize, os);
+ *os << ", ..., ";
+ PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+ }
+ *os << " }";
+ }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+ const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+ const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+ // Prints the given array, omitting some elements when there are too
+ // many.
+ static void Print(const T (&a)[N], ::std::ostream* os) {
+ UniversalPrintArray(a, N, os);
+ }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+ // MSVC warns about adding const to a function type, so we want to
+ // disable the warning.
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
+
+ static void Print(const T& value, ::std::ostream* os) {
+ // Prints the address of the value. We use reinterpret_cast here
+ // as static_cast doesn't compile when T is a function type.
+ *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+ // Then prints the value itself.
+ UniversalPrint(value, os);
+ }
+
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+ static void Print(const T& value, ::std::ostream* os) {
+ UniversalPrint(value, os);
+ }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+ static void Print(const T& value, ::std::ostream* os) {
+ UniversalPrint(value, os);
+ }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+ static void Print(const T (&value)[N], ::std::ostream* os) {
+ UniversalPrinter<T[N]>::Print(value, os);
+ }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+ static void Print(const char* str, ::std::ostream* os) {
+ if (str == NULL) {
+ *os << "NULL";
+ } else {
+ UniversalPrint(string(str), os);
+ }
+ }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+ static void Print(char* str, ::std::ostream* os) {
+ UniversalTersePrinter<const char*>::Print(str, os);
+ }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+ static void Print(const wchar_t* str, ::std::ostream* os) {
+ if (str == NULL) {
+ *os << "NULL";
+ } else {
+ UniversalPrint(::std::wstring(str), os);
+ }
+ }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+ static void Print(wchar_t* str, ::std::ostream* os) {
+ UniversalTersePrinter<const wchar_t*>::Print(str, os);
+ }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+ UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler. The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+ // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+ // UniversalPrinter with T directly.
+ typedef T T1;
+ UniversalPrinter<T1>::Print(value, os);
+}
+
+typedef ::std::vector<string> Strings;
+
+// TuplePolicy<TupleT> must provide:
+// - tuple_size
+// size of tuple TupleT.
+// - get<size_t I>(const TupleT& t)
+// static function extracting element I of tuple TupleT.
+// - tuple_element<size_t I>::type
+// type of element I of tuple TupleT.
+template <typename TupleT>
+struct TuplePolicy;
+
+#if GTEST_HAS_TR1_TUPLE
+template <typename TupleT>
+struct TuplePolicy {
+ typedef TupleT Tuple;
+ static const size_t tuple_size = ::std::tr1::tuple_size<Tuple>::value;
+
+ template <size_t I>
+ struct tuple_element : ::std::tr1::tuple_element<I, Tuple> {};
+
+ template <size_t I>
+ static typename AddReference<
+ const typename ::std::tr1::tuple_element<I, Tuple>::type>::type get(
+ const Tuple& tuple) {
+ return ::std::tr1::get<I>(tuple);
+ }
+};
+template <typename TupleT>
+const size_t TuplePolicy<TupleT>::tuple_size;
+#endif // GTEST_HAS_TR1_TUPLE
+
+#if GTEST_HAS_STD_TUPLE_
+template <typename... Types>
+struct TuplePolicy< ::std::tuple<Types...> > {
+ typedef ::std::tuple<Types...> Tuple;
+ static const size_t tuple_size = ::std::tuple_size<Tuple>::value;
+
+ template <size_t I>
+ struct tuple_element : ::std::tuple_element<I, Tuple> {};
+
+ template <size_t I>
+ static const typename ::std::tuple_element<I, Tuple>::type& get(
+ const Tuple& tuple) {
+ return ::std::get<I>(tuple);
+ }
+};
+template <typename... Types>
+const size_t TuplePolicy< ::std::tuple<Types...> >::tuple_size;
+#endif // GTEST_HAS_STD_TUPLE_
+
+#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields. The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+//
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+ // Prints the first N fields of a tuple.
+ template <typename Tuple>
+ static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+ TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+ GTEST_INTENTIONAL_CONST_COND_PUSH_()
+ if (N > 1) {
+ GTEST_INTENTIONAL_CONST_COND_POP_()
+ *os << ", ";
+ }
+ UniversalPrinter<
+ typename TuplePolicy<Tuple>::template tuple_element<N - 1>::type>
+ ::Print(TuplePolicy<Tuple>::template get<N - 1>(t), os);
+ }
+
+ // Tersely prints the first N fields of a tuple to a string vector,
+ // one element for each field.
+ template <typename Tuple>
+ static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+ TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+ ::std::stringstream ss;
+ UniversalTersePrint(TuplePolicy<Tuple>::template get<N - 1>(t), &ss);
+ strings->push_back(ss.str());
+ }
+};
+
+// Base case.
+template <>
+struct TuplePrefixPrinter<0> {
+ template <typename Tuple>
+ static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+ template <typename Tuple>
+ static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+
+// Helper function for printing a tuple.
+// Tuple must be either std::tr1::tuple or std::tuple type.
+template <typename Tuple>
+void PrintTupleTo(const Tuple& t, ::std::ostream* os) {
+ *os << "(";
+ TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);
+ *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field. See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+ Strings result;
+ TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::
+ TersePrintPrefixToStrings(value, &result);
+ return result;
+}
+#endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
+
+} // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+ ::std::stringstream ss;
+ internal::UniversalTersePrinter<T>::Print(value, &ss);
+ return ss.str();
+}
+
+} // namespace testing
+
+// Include any custom printer added by the local installation.
+// We must include this header at the end to make sure it can use the
+// declarations from this file.
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// This file provides an injection point for custom printers in a local
+// installation of gTest.
+// It will be included from gtest-printers.h and the overrides in this file
+// will be visible to everyone.
+// See documentation at gtest/gtest-printers.h for details on how to define a
+// custom printer.
+//
+// ** Custom implementation starts here **
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Input to a parameterized test name generator, describing a test parameter.
+// Consists of the parameter value and the integer parameter index.
+template <class ParamType>
+struct TestParamInfo {
+ TestParamInfo(const ParamType& a_param, size_t an_index) :
+ param(a_param),
+ index(an_index) {}
+ ParamType param;
+ size_t index;
+};
+
+// A builtin parameterized test name generator which returns the result of
+// testing::PrintToString.
+struct PrintToStringParamName {
+ template <class ParamType>
+ std::string operator()(const TestParamInfo<ParamType>& info) const {
+ return PrintToString(info.param);
+ }
+};
+
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+ CodeLocation code_location);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+ virtual ~ParamIteratorInterface() {}
+ // A pointer to the base generator instance.
+ // Used only for the purposes of iterator comparison
+ // to make sure that two iterators belong to the same generator.
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+ // Advances iterator to point to the next element
+ // provided by the generator. The caller is responsible
+ // for not calling Advance() on an iterator equal to
+ // BaseGenerator()->End().
+ virtual void Advance() = 0;
+ // Clones the iterator object. Used for implementing copy semantics
+ // of ParamIterator<T>.
+ virtual ParamIteratorInterface* Clone() const = 0;
+ // Dereferences the current iterator and provides (read-only) access
+ // to the pointed value. It is the caller's responsibility not to call
+ // Current() on an iterator equal to BaseGenerator()->End().
+ // Used for implementing ParamGenerator<T>::operator*().
+ virtual const T* Current() const = 0;
+ // Determines whether the given iterator and other point to the same
+ // element in the sequence generated by the generator.
+ // Used for implementing ParamGenerator<T>::operator==().
+ virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+ typedef T value_type;
+ typedef const T& reference;
+ typedef ptrdiff_t difference_type;
+
+ // ParamIterator assumes ownership of the impl_ pointer.
+ ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+ ParamIterator& operator=(const ParamIterator& other) {
+ if (this != &other)
+ impl_.reset(other.impl_->Clone());
+ return *this;
+ }
+
+ const T& operator*() const { return *impl_->Current(); }
+ const T* operator->() const { return impl_->Current(); }
+ // Prefix version of operator++.
+ ParamIterator& operator++() {
+ impl_->Advance();
+ return *this;
+ }
+ // Postfix version of operator++.
+ ParamIterator operator++(int /*unused*/) {
+ ParamIteratorInterface<T>* clone = impl_->Clone();
+ impl_->Advance();
+ return ParamIterator(clone);
+ }
+ bool operator==(const ParamIterator& other) const {
+ return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+ }
+ bool operator!=(const ParamIterator& other) const {
+ return !(*this == other);
+ }
+
+ private:
+ friend class ParamGenerator<T>;
+ explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+ scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+ typedef T ParamType;
+
+ virtual ~ParamGeneratorInterface() {}
+
+ // Generator interface definition
+ virtual ParamIteratorInterface<T>* Begin() const = 0;
+ virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+ typedef ParamIterator<T> iterator;
+
+ explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+ ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+ ParamGenerator& operator=(const ParamGenerator& other) {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ iterator begin() const { return iterator(impl_->Begin()); }
+ iterator end() const { return iterator(impl_->End()); }
+
+ private:
+ linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+ RangeGenerator(T begin, T end, IncrementT step)
+ : begin_(begin), end_(end),
+ step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+ virtual ~RangeGenerator() {}
+
+ virtual ParamIteratorInterface<T>* Begin() const {
+ return new Iterator(this, begin_, 0, step_);
+ }
+ virtual ParamIteratorInterface<T>* End() const {
+ return new Iterator(this, end_, end_index_, step_);
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<T> {
+ public:
+ Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+ IncrementT step)
+ : base_(base), value_(value), index_(index), step_(step) {}
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+ return base_;
+ }
+ virtual void Advance() {
+ value_ = static_cast<T>(value_ + step_);
+ index_++;
+ }
+ virtual ParamIteratorInterface<T>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const T* Current() const { return &value_; }
+ virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const int other_index =
+ CheckedDowncastToActualType<const Iterator>(&other)->index_;
+ return index_ == other_index;
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : ParamIteratorInterface<T>(),
+ base_(other.base_), value_(other.value_), index_(other.index_),
+ step_(other.step_) {}
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<T>* const base_;
+ T value_;
+ int index_;
+ const IncrementT step_;
+ }; // class RangeGenerator::Iterator
+
+ static int CalculateEndIndex(const T& begin,
+ const T& end,
+ const IncrementT& step) {
+ int end_index = 0;
+ for (T i = begin; i < end; i = static_cast<T>(i + step))
+ end_index++;
+ return end_index;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const RangeGenerator& other);
+
+ const T begin_;
+ const T end_;
+ const IncrementT step_;
+ // The index for the end() iterator. All the elements in the generated
+ // sequence are indexed (0-based) to aid iterator comparison.
+ const int end_index_;
+}; // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+ template <typename ForwardIterator>
+ ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+ : container_(begin, end) {}
+ virtual ~ValuesInIteratorRangeGenerator() {}
+
+ virtual ParamIteratorInterface<T>* Begin() const {
+ return new Iterator(this, container_.begin());
+ }
+ virtual ParamIteratorInterface<T>* End() const {
+ return new Iterator(this, container_.end());
+ }
+
+ private:
+ typedef typename ::std::vector<T> ContainerType;
+
+ class Iterator : public ParamIteratorInterface<T> {
+ public:
+ Iterator(const ParamGeneratorInterface<T>* base,
+ typename ContainerType::const_iterator iterator)
+ : base_(base), iterator_(iterator) {}
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+ return base_;
+ }
+ virtual void Advance() {
+ ++iterator_;
+ value_.reset();
+ }
+ virtual ParamIteratorInterface<T>* Clone() const {
+ return new Iterator(*this);
+ }
+ // We need to use cached value referenced by iterator_ because *iterator_
+ // can return a temporary object (and of type other then T), so just
+ // having "return &*iterator_;" doesn't work.
+ // value_ is updated here and not in Advance() because Advance()
+ // can advance iterator_ beyond the end of the range, and we cannot
+ // detect that fact. The client code, on the other hand, is
+ // responsible for not calling Current() on an out-of-range iterator.
+ virtual const T* Current() const {
+ if (value_.get() == NULL)
+ value_.reset(new T(*iterator_));
+ return value_.get();
+ }
+ virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ return iterator_ ==
+ CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ // The explicit constructor call suppresses a false warning
+ // emitted by gcc when supplied with the -Wextra option.
+ : ParamIteratorInterface<T>(),
+ base_(other.base_),
+ iterator_(other.iterator_) {}
+
+ const ParamGeneratorInterface<T>* const base_;
+ typename ContainerType::const_iterator iterator_;
+ // A cached value of *iterator_. We keep it here to allow access by
+ // pointer in the wrapping iterator's operator->().
+ // value_ needs to be mutable to be accessed in Current().
+ // Use of scoped_ptr helps manage cached value's lifetime,
+ // which is bound by the lifespan of the iterator itself.
+ mutable scoped_ptr<const T> value_;
+ }; // class ValuesInIteratorRangeGenerator::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const ValuesInIteratorRangeGenerator& other);
+
+ const ContainerType container_;
+}; // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Default parameterized test name generator, returns a string containing the
+// integer test parameter index.
+template <class ParamType>
+std::string DefaultParamName(const TestParamInfo<ParamType>& info) {
+ Message name_stream;
+ name_stream << info.index;
+ return name_stream.GetString();
+}
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Parameterized test name overload helpers, which help the
+// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized
+// test name generator and user param name generator.
+template <class ParamType, class ParamNameGenFunctor>
+ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) {
+ return func;
+}
+
+template <class ParamType>
+struct ParamNameGenFunc {
+ typedef std::string Type(const TestParamInfo<ParamType>&);
+};
+
+template <class ParamType>
+typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {
+ return DefaultParamName;
+}
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+ typedef typename TestClass::ParamType ParamType;
+ explicit ParameterizedTestFactory(ParamType parameter) :
+ parameter_(parameter) {}
+ virtual Test* CreateTest() {
+ TestClass::SetParam(&parameter_);
+ return new TestClass();
+ }
+
+ private:
+ const ParamType parameter_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+ virtual ~TestMetaFactoryBase() {}
+
+ virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+ : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+ typedef typename TestCase::ParamType ParamType;
+
+ TestMetaFactory() {}
+
+ virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+ return new ParameterizedTestFactory<TestCase>(parameter);
+ }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+ virtual ~ParameterizedTestCaseInfoBase() {}
+
+ // Base part of test case name for display purposes.
+ virtual const string& GetTestCaseName() const = 0;
+ // Test case id to verify identity.
+ virtual TypeId GetTestCaseTypeId() const = 0;
+ // UnitTest class invokes this method to register tests in this
+ // test case right before running them in RUN_ALL_TESTS macro.
+ // This method should not be called more then once on any single
+ // instance of a ParameterizedTestCaseInfoBase derived class.
+ virtual void RegisterTests() = 0;
+
+ protected:
+ ParameterizedTestCaseInfoBase() {}
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+ // ParamType and GeneratorCreationFunc are private types but are required
+ // for declarations of public methods AddTestPattern() and
+ // AddTestCaseInstantiation().
+ typedef typename TestCase::ParamType ParamType;
+ // A function that returns an instance of appropriate generator type.
+ typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+ typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc;
+
+ explicit ParameterizedTestCaseInfo(
+ const char* name, CodeLocation code_location)
+ : test_case_name_(name), code_location_(code_location) {}
+
+ // Test case base name for display purposes.
+ virtual const string& GetTestCaseName() const { return test_case_name_; }
+ // Test case id to verify identity.
+ virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+ // TEST_P macro uses AddTestPattern() to record information
+ // about a single test in a LocalTestInfo structure.
+ // test_case_name is the base name of the test case (without invocation
+ // prefix). test_base_name is the name of an individual test without
+ // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+ // test case base name and DoBar is test base name.
+ void AddTestPattern(const char* test_case_name,
+ const char* test_base_name,
+ TestMetaFactoryBase<ParamType>* meta_factory) {
+ tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+ test_base_name,
+ meta_factory)));
+ }
+ // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+ // about a generator.
+ int AddTestCaseInstantiation(const string& instantiation_name,
+ GeneratorCreationFunc* func,
+ ParamNameGeneratorFunc* name_func,
+ const char* file,
+ int line) {
+ instantiations_.push_back(
+ InstantiationInfo(instantiation_name, func, name_func, file, line));
+ return 0; // Return value used only to run this method in namespace scope.
+ }
+ // UnitTest class invokes this method to register tests in this test case
+ // test cases right before running tests in RUN_ALL_TESTS macro.
+ // This method should not be called more then once on any single
+ // instance of a ParameterizedTestCaseInfoBase derived class.
+ // UnitTest has a guard to prevent from calling this method more then once.
+ virtual void RegisterTests() {
+ for (typename TestInfoContainer::iterator test_it = tests_.begin();
+ test_it != tests_.end(); ++test_it) {
+ linked_ptr<TestInfo> test_info = *test_it;
+ for (typename InstantiationContainer::iterator gen_it =
+ instantiations_.begin(); gen_it != instantiations_.end();
+ ++gen_it) {
+ const string& instantiation_name = gen_it->name;
+ ParamGenerator<ParamType> generator((*gen_it->generator)());
+ ParamNameGeneratorFunc* name_func = gen_it->name_func;
+ const char* file = gen_it->file;
+ int line = gen_it->line;
+
+ string test_case_name;
+ if ( !instantiation_name.empty() )
+ test_case_name = instantiation_name + "/";
+ test_case_name += test_info->test_case_base_name;
+
+ size_t i = 0;
+ std::set<std::string> test_param_names;
+ for (typename ParamGenerator<ParamType>::iterator param_it =
+ generator.begin();
+ param_it != generator.end(); ++param_it, ++i) {
+ Message test_name_stream;
+
+ std::string param_name = name_func(
+ TestParamInfo<ParamType>(*param_it, i));
+
+ GTEST_CHECK_(IsValidParamName(param_name))
+ << "Parameterized test name '" << param_name
+ << "' is invalid, in " << file
+ << " line " << line << std::endl;
+
+ GTEST_CHECK_(test_param_names.count(param_name) == 0)
+ << "Duplicate parameterized test name '" << param_name
+ << "', in " << file << " line " << line << std::endl;
+
+ test_param_names.insert(param_name);
+
+ test_name_stream << test_info->test_base_name << "/" << param_name;
+ MakeAndRegisterTestInfo(
+ test_case_name.c_str(),
+ test_name_stream.GetString().c_str(),
+ NULL, // No type parameter.
+ PrintToString(*param_it).c_str(),
+ code_location_,
+ GetTestCaseTypeId(),
+ TestCase::SetUpTestCase,
+ TestCase::TearDownTestCase,
+ test_info->test_meta_factory->CreateTestFactory(*param_it));
+ } // for param_it
+ } // for gen_it
+ } // for test_it
+ } // RegisterTests
+
+ private:
+ // LocalTestInfo structure keeps information about a single test registered
+ // with TEST_P macro.
+ struct TestInfo {
+ TestInfo(const char* a_test_case_base_name,
+ const char* a_test_base_name,
+ TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+ test_case_base_name(a_test_case_base_name),
+ test_base_name(a_test_base_name),
+ test_meta_factory(a_test_meta_factory) {}
+
+ const string test_case_base_name;
+ const string test_base_name;
+ const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+ };
+ typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+ // Records data received from INSTANTIATE_TEST_CASE_P macros:
+ // <Instantiation name, Sequence generator creation function,
+ // Name generator function, Source file, Source line>
+ struct InstantiationInfo {
+ InstantiationInfo(const std::string &name_in,
+ GeneratorCreationFunc* generator_in,
+ ParamNameGeneratorFunc* name_func_in,
+ const char* file_in,
+ int line_in)
+ : name(name_in),
+ generator(generator_in),
+ name_func(name_func_in),
+ file(file_in),
+ line(line_in) {}
+
+ std::string name;
+ GeneratorCreationFunc* generator;
+ ParamNameGeneratorFunc* name_func;
+ const char* file;
+ int line;
+ };
+ typedef ::std::vector<InstantiationInfo> InstantiationContainer;
+
+ static bool IsValidParamName(const std::string& name) {
+ // Check for empty string
+ if (name.empty())
+ return false;
+
+ // Check for invalid characters
+ for (std::string::size_type index = 0; index < name.size(); ++index) {
+ if (!isalnum(name[index]) && name[index] != '_')
+ return false;
+ }
+
+ return true;
+ }
+
+ const string test_case_name_;
+ CodeLocation code_location_;
+ TestInfoContainer tests_;
+ InstantiationContainer instantiations_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+}; // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+ ParameterizedTestCaseRegistry() {}
+ ~ParameterizedTestCaseRegistry() {
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ delete *it;
+ }
+ }
+
+ // Looks up or creates and returns a structure containing information about
+ // tests and instantiations of a particular test case.
+ template <class TestCase>
+ ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+ const char* test_case_name,
+ CodeLocation code_location) {
+ ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ if ((*it)->GetTestCaseName() == test_case_name) {
+ if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+ // Complain about incorrect usage of Google Test facilities
+ // and terminate the program since we cannot guaranty correct
+ // test case setup and tear-down in this case.
+ ReportInvalidTestCaseType(test_case_name, code_location);
+ posix::Abort();
+ } else {
+ // At this point we are sure that the object we found is of the same
+ // type we are looking for, so we downcast it to that type
+ // without further checks.
+ typed_test_info = CheckedDowncastToActualType<
+ ParameterizedTestCaseInfo<TestCase> >(*it);
+ }
+ break;
+ }
+ }
+ if (typed_test_info == NULL) {
+ typed_test_info = new ParameterizedTestCaseInfo<TestCase>(
+ test_case_name, code_location);
+ test_case_infos_.push_back(typed_test_info);
+ }
+ return typed_test_info;
+ }
+ void RegisterTests() {
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ (*it)->RegisterTests();
+ }
+ }
+
+ private:
+ typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+ TestCaseInfoContainer test_case_infos_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+// pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl@google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework@googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+ typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+ const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+ explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray1& other);
+
+ const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+ ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray2& other);
+
+ const T1 v1_;
+ const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+ ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray3& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+ ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray4& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+ ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray5& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+class ValueArray6 {
+ public:
+ ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray6& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+class ValueArray7 {
+ public:
+ ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray7& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+ ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray8& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+ ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray9& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+ ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray10& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+class ValueArray11 {
+ public:
+ ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray11& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+class ValueArray12 {
+ public:
+ ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray12& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+ ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray13& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+ ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray14& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+ ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray15& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+class ValueArray16 {
+ public:
+ ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray16& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+class ValueArray17 {
+ public:
+ ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray17& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+ ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray18& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+ ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray19& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+ ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray20& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+class ValueArray21 {
+ public:
+ ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray21& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+class ValueArray22 {
+ public:
+ ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray22& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+ ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray23& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+ ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray24& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+ ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray25& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+class ValueArray26 {
+ public:
+ ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray26& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+class ValueArray27 {
+ public:
+ ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray27& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+ ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray28& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+ ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray29& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+ ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray30& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+class ValueArray31 {
+ public:
+ ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray31& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+class ValueArray32 {
+ public:
+ ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray32& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+ ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+ T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray33& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+ ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray34& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+ ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+ v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray35& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+class ValueArray36 {
+ public:
+ ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+ v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray36& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+class ValueArray37 {
+ public:
+ ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+ v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+ v36_(v36), v37_(v37) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray37& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+ ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray38& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+ ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray39& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+ ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+ v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+ v40_(v40) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray40& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+class ValueArray41 {
+ public:
+ ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+ T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray41& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+class ValueArray42 {
+ public:
+ ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray42& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+ ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+ v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+ v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray43& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+ ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+ v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+ v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+ v43_(v43), v44_(v44) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray44& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+ ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+ v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+ v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+ v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray45& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+class ValueArray46 {
+ public:
+ ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+ v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray46& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+class ValueArray47 {
+ public:
+ ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+ v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+ v47_(v47) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray47& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+ ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+ v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+ v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+ v46_(v46), v47_(v47), v48_(v48) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray48& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+ ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+ T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+ v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_), static_cast<T>(v49_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray49& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+ const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+ ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+ T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+ v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray50& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+ const T49 v49_;
+ const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {
+ public:
+ typedef ::testing::tuple<T1, T2> ParamType;
+
+ CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2)
+ : g1_(g1), g2_(g2) {}
+ virtual ~CartesianProductGenerator2() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current2_;
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator2::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator2& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+}; // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3> ParamType;
+
+ CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+ : g1_(g1), g2_(g2), g3_(g3) {}
+ virtual ~CartesianProductGenerator3() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current3_;
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator3::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator3& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+}; // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4> ParamType;
+
+ CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+ virtual ~CartesianProductGenerator4() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current4_;
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator4::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator4& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+}; // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;
+
+ CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+ virtual ~CartesianProductGenerator5() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current5_;
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator5::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator5& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+}; // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+class CartesianProductGenerator6
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,
+ T6> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+ CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+ virtual ~CartesianProductGenerator6() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current6_;
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator6::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator6& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+}; // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+class CartesianProductGenerator7
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
+ T7> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+ CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+ virtual ~CartesianProductGenerator7() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current7_;
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator7::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator7& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+}; // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+ CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+ g8_(g8) {}
+ virtual ~CartesianProductGenerator8() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current8_;
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator8::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator8& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+}; // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8, T9> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+ CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9) {}
+ virtual ~CartesianProductGenerator9() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end(), g9_, g9_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8,
+ const ParamGenerator<T9>& g9,
+ const typename ParamGenerator<T9>::iterator& current9)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+ begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current9_;
+ if (current9_ == end9_) {
+ current9_ = begin9_;
+ ++current8_;
+ }
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_ &&
+ current9_ == typed_other->current9_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_),
+ begin9_(other.begin9_),
+ end9_(other.end9_),
+ current9_(other.current9_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_,
+ *current9_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_ ||
+ current9_ == end9_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ const typename ParamGenerator<T9>::iterator begin9_;
+ const typename ParamGenerator<T9>::iterator end9_;
+ typename ParamGenerator<T9>::iterator current9_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator9::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator9& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+ const ParamGenerator<T9> g9_;
+}; // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+ : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8, T9, T10> > {
+ public:
+ typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+ CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+ const ParamGenerator<T10>& g10)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9), g10_(g10) {}
+ virtual ~CartesianProductGenerator10() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8,
+ const ParamGenerator<T9>& g9,
+ const typename ParamGenerator<T9>::iterator& current9,
+ const ParamGenerator<T10>& g10,
+ const typename ParamGenerator<T10>::iterator& current10)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+ begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+ begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current10_;
+ if (current10_ == end10_) {
+ current10_ = begin10_;
+ ++current9_;
+ }
+ if (current9_ == end9_) {
+ current9_ = begin9_;
+ ++current8_;
+ }
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return &current_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_ &&
+ current9_ == typed_other->current9_ &&
+ current10_ == typed_other->current10_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_),
+ begin9_(other.begin9_),
+ end9_(other.end9_),
+ current9_(other.current9_),
+ begin10_(other.begin10_),
+ end10_(other.end10_),
+ current10_(other.current10_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_,
+ *current9_, *current10_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_ ||
+ current9_ == end9_ ||
+ current10_ == end10_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ const typename ParamGenerator<T9>::iterator begin9_;
+ const typename ParamGenerator<T9>::iterator end9_;
+ typename ParamGenerator<T9>::iterator current9_;
+ const typename ParamGenerator<T10>::iterator begin10_;
+ const typename ParamGenerator<T10>::iterator end10_;
+ typename ParamGenerator<T10>::iterator current10_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator10::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator10& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+ const ParamGenerator<T9> g9_;
+ const ParamGenerator<T10> g10_;
+}; // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+ : g1_(g1), g2_(g2) {}
+ template <typename T1, typename T2>
+ operator ParamGenerator< ::testing::tuple<T1, T2> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2> >(
+ new CartesianProductGenerator2<T1, T2>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder2& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+}; // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3)
+ : g1_(g1), g2_(g2), g3_(g3) {}
+ template <typename T1, typename T2, typename T3>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3> >(
+ new CartesianProductGenerator3<T1, T2, T3>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder3& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+}; // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+ template <typename T1, typename T2, typename T3, typename T4>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(
+ new CartesianProductGenerator4<T1, T2, T3, T4>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder4& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+}; // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(
+ new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder5& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+}; // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(
+ new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder6& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+}; // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,
+ T7> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+ new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder7& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+}; // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+ g8_(g8) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,
+ T8> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+ new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder8& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+}; // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8,
+ const Generator9& g9)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9> >(
+ new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_),
+ static_cast<ParamGenerator<T9> >(g9_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder9& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+ const Generator9 g9_;
+}; // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8,
+ const Generator9& g9, const Generator10& g10)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9), g10_(g10) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+ operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+ T10> >() const {
+ return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+ T10> >(
+ new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+ T10>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_),
+ static_cast<ParamGenerator<T9> >(g9_),
+ static_cast<ParamGenerator<T10> >(g10_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder10& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+ const Generator9 g9_;
+ const Generator10 g10_;
+}; // class CartesianProductHolder10
+
+# endif // GTEST_HAS_COMBINE
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+// - returns a generator producing a sequence of values {start, start+1,
+// start+2, ..., }.
+// Range(start, end, step)
+// - returns a generator producing a sequence of values {start, start+step,
+// start+step+step, ..., }.
+// Notes:
+// * The generated sequences never include end. For example, Range(1, 5)
+// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+// returns a generator producing {1, 3, 5, 7}.
+// * start and end must have the same type. That type may be any integral or
+// floating-point type or a user defined type satisfying these conditions:
+// * It must be assignable (have operator=() defined).
+// * It must have operator+() (operator+(int-compatible type) for
+// two-operand version).
+// * It must have operator<() defined.
+// Elements in the resulting sequences will also have that type.
+// * Condition start < end must be satisfied in order for resulting sequences
+// to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+ return internal::ParamGenerator<T>(
+ new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+ return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+// - returns a generator producing sequences with elements from
+// a C-style array.
+// ValuesIn(const Container& container)
+// - returns a generator producing sequences with elements from
+// an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+// - returns a generator producing sequences with elements from
+// a range [begin, end) defined by a pair of STL-style iterators. These
+// iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+// ::std::vector< ::std::string> v;
+// v.push_back("a");
+// v.push_back("b");
+// return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+// StlStringTest,
+// ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+// ::std::list<char> list;
+// list.push_back('a');
+// list.push_back('b');
+// return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+// CharTest,
+// ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+ typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+ typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+ ::value_type ParamType;
+ return internal::ParamGenerator<ParamType>(
+ new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+ return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+ const Container& container) {
+ return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+// - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+ return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+ return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+ return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+ return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5) {
+ return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6) {
+ return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7) {
+ return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+ v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+ return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+ v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+ return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+ return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+ T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11) {
+ return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+ T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12) {
+ return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13) {
+ return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+ return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+ return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16) {
+ return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17) {
+ return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18) {
+ return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+ return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+ return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+ return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22) {
+ return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23) {
+ return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24) {
+ return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+ v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+ v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+ T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+ T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+ return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+ v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26) {
+ return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+ v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27) {
+ return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+ v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28) {
+ return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+ v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29) {
+ return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+ v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+ return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+ v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+ return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+ v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32) {
+ return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33) {
+ return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+ T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+ T31 v31, T32 v32, T33 v33, T34 v34) {
+ return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+ v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+ return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+ v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+ return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37) {
+ return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37, T38 v38) {
+ return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+ v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+ v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+ v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37, T38 v38, T39 v39) {
+ return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+ v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+ v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+ T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+ T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+ T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+ T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+ return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+ v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+ v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+ return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+ v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+ v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42) {
+ return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+ v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+ v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43) {
+ return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+ v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+ v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44) {
+ return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+ v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+ v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+ T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+ T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+ return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+ v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+ v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+ return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+ v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+ return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+ v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+ T48 v48) {
+ return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+ v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+ v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+ T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+ T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+ T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+ T47 v47, T48 v48, T49 v49) {
+ return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+ v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+ v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+ T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+ T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+ return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+ v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+// - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+// virtual void SetUp() {
+// external_flag = GetParam();
+// }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+ return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+// - returns a generator producing sequences with elements coming from
+// the Cartesian product of elements from the sequences generated by
+// gen1, gen2, ..., genN. The sequence elements will have a type of
+// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+// of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+// : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+// Combine(Values("cat", "dog"),
+// Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+// : public testing::TestWithParam<tuple<bool, bool> > {
+// virtual void SetUp() {
+// // Assigns external_flag_1 and external_flag_2 values from the tuple.
+// tie(external_flag_1, external_flag_2) = GetParam();
+// }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+// // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+// Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+ const Generator1& g1, const Generator2& g2) {
+ return internal::CartesianProductHolder2<Generator1, Generator2>(
+ g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+ return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+ g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+ Generator4> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4) {
+ return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+ Generator4>(
+ g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+ Generator4, Generator5> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5) {
+ return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+ Generator4, Generator5>(
+ g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+ return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6>(
+ g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7) {
+ return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7>(
+ g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8) {
+ return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8>(
+ g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8,
+ Generator9> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+ return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+ g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8, typename Generator9,
+ typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+ Generator10> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8, const Generator9& g9,
+ const Generator10& g10) {
+ return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+ Generator10>(
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+ : public test_case_name { \
+ public: \
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+ virtual void TestBody(); \
+ private: \
+ static int AddToRegistry() { \
+ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+ GetTestCasePatternHolder<test_case_name>(\
+ #test_case_name, \
+ ::testing::internal::CodeLocation(\
+ __FILE__, __LINE__))->AddTestPattern(\
+ #test_case_name, \
+ #test_name, \
+ new ::testing::internal::TestMetaFactory< \
+ GTEST_TEST_CLASS_NAME_(\
+ test_case_name, test_name)>()); \
+ return 0; \
+ } \
+ static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+ }; \
+ int GTEST_TEST_CLASS_NAME_(test_case_name, \
+ test_name)::gtest_registering_dummy_ = \
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
+// to specify a function or functor that generates custom test name suffixes
+// based on the test parameters. The function should accept one argument of
+// type testing::TestParamInfo<class ParamType>, and return std::string.
+//
+// testing::PrintToStringParamName is a builtin test suffix generator that
+// returns the value of testing::PrintToString(GetParam()). It does not work
+// for std::string or C strings.
+//
+// Note: test names must be non-empty, unique, and may only contain ASCII
+// alphanumeric characters or underscore.
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
+ ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+ ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
+ const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
+ return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
+ (__VA_ARGS__)(info); \
+ } \
+ int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
+ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+ GetTestCasePatternHolder<test_case_name>(\
+ #test_case_name, \
+ ::testing::internal::CodeLocation(\
+ __FILE__, __LINE__))->AddTestCaseInstantiation(\
+ #prefix, \
+ &gtest_##prefix##test_case_name##_EvalGenerator_, \
+ &gtest_##prefix##test_case_name##_EvalGenerateName_, \
+ __FILE__, __LINE__)
+
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class. For example:
+//
+// class MyClass {
+// private:
+// void MyMethod();
+// FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+// // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+// // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule@google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+ // The possible outcomes of a test part (i.e. an assertion or an
+ // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+ enum Type {
+ kSuccess, // Succeeded.
+ kNonFatalFailure, // Failed but the test can continue.
+ kFatalFailure // Failed and the test should be terminated.
+ };
+
+ // C'tor. TestPartResult does NOT have a default constructor.
+ // Always use this constructor (with parameters) to create a
+ // TestPartResult object.
+ TestPartResult(Type a_type,
+ const char* a_file_name,
+ int a_line_number,
+ const char* a_message)
+ : type_(a_type),
+ file_name_(a_file_name == NULL ? "" : a_file_name),
+ line_number_(a_line_number),
+ summary_(ExtractSummary(a_message)),
+ message_(a_message) {
+ }
+
+ // Gets the outcome of the test part.
+ Type type() const { return type_; }
+
+ // Gets the name of the source file where the test part took place, or
+ // NULL if it's unknown.
+ const char* file_name() const {
+ return file_name_.empty() ? NULL : file_name_.c_str();
+ }
+
+ // Gets the line in the source file where the test part took place,
+ // or -1 if it's unknown.
+ int line_number() const { return line_number_; }
+
+ // Gets the summary of the failure message.
+ const char* summary() const { return summary_.c_str(); }
+
+ // Gets the message associated with the test part.
+ const char* message() const { return message_.c_str(); }
+
+ // Returns true iff the test part passed.
+ bool passed() const { return type_ == kSuccess; }
+
+ // Returns true iff the test part failed.
+ bool failed() const { return type_ != kSuccess; }
+
+ // Returns true iff the test part non-fatally failed.
+ bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+ // Returns true iff the test part fatally failed.
+ bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+ Type type_;
+
+ // Gets the summary of the failure message by omitting the stack
+ // trace in it.
+ static std::string ExtractSummary(const char* message);
+
+ // The name of the source file where the test part took place, or
+ // "" if the source file is unknown.
+ std::string file_name_;
+ // The line in the source file where the test part took place, or -1
+ // if the line number is unknown.
+ int line_number_;
+ std::string summary_; // The test failure summary.
+ std::string message_; // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+ TestPartResultArray() {}
+
+ // Appends the given TestPartResult to the array.
+ void Append(const TestPartResult& result);
+
+ // Returns the TestPartResult at the given index (0-based).
+ const TestPartResult& GetTestPartResult(int index) const;
+
+ // Returns the number of TestPartResult objects in the array.
+ int size() const;
+
+ private:
+ std::vector<TestPartResult> array_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+ virtual ~TestPartResultReporterInterface() {}
+
+ virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+ : public TestPartResultReporterInterface {
+ public:
+ HasNewFatalFailureHelper();
+ virtual ~HasNewFatalFailureHelper();
+ virtual void ReportTestPartResult(const TestPartResult& result);
+ bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+ bool has_new_fatal_failure_;
+ TestPartResultReporterInterface* original_reporter_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+} // namespace internal
+
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan@google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list. You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template. It should be parameterized
+// by a type. Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+ ...
+ typedef std::list<T> List;
+ static T shared_;
+ T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list. The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+// TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+ // Inside a test, refer to TypeParam to get the type parameter.
+ // Since we are inside a derived class template, C++ requires use to
+ // visit the members of FooTest via 'this'.
+ TypeParam n = this->value_;
+
+ // To visit static members of the fixture, add the TestFixture::
+ // prefix.
+ n += TestFixture::shared_;
+
+ // To refer to typedefs in the fixture, add the "typename
+ // TestFixture::" prefix.
+ typename TestFixture::List values;
+ values.push_back(n);
+ ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type. Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are. The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have. Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly. Here's an example:
+
+#if 0
+
+// First, define a fixture class template. It should be parameterized
+// by a type. Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+ // Inside a test, refer to TypeParam to get the type parameter.
+ TypeParam n = 0;
+ ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them. The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+ DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want. If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name. Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+ typedef ::testing::internal::TypeList< Types >::type \
+ GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+ template <typename gtest_TypeParam_> \
+ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+ : public CaseName<gtest_TypeParam_> { \
+ private: \
+ typedef CaseName<gtest_TypeParam_> TestFixture; \
+ typedef gtest_TypeParam_ TypeParam; \
+ virtual void TestBody(); \
+ }; \
+ bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+ ::testing::internal::TypeParameterizedTest< \
+ CaseName, \
+ ::testing::internal::TemplateSel< \
+ GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+ GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+ "", ::testing::internal::CodeLocation(__FILE__, __LINE__), \
+ #CaseName, #TestName, 0); \
+ template <typename gtest_TypeParam_> \
+ void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in. The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+ gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+ gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+ gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+ static ::testing::internal::TypedTestCasePState \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+ namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+ template <typename gtest_TypeParam_> \
+ class TestName : public CaseName<gtest_TypeParam_> { \
+ private: \
+ typedef CaseName<gtest_TypeParam_> TestFixture; \
+ typedef gtest_TypeParam_ TypeParam; \
+ virtual void TestBody(); \
+ }; \
+ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+ __FILE__, __LINE__, #CaseName, #TestName); \
+ } \
+ template <typename gtest_TypeParam_> \
+ void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+ namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+ } \
+ static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+ __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+ bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+ ::testing::internal::TypeParameterizedTestCase<CaseName, \
+ GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+ ::testing::internal::TypeList< Types >::type>::Register(\
+ #Prefix, \
+ ::testing::internal::CodeLocation(__FILE__, __LINE__), \
+ &GTEST_TYPED_TEST_CASE_P_STATE_(CaseName), \
+ #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif // GTEST_HAS_TYPED_TEST_P
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If ::std::string and ::string are the same class on your platform
+// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+ const std::string& message);
+
+} // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful. When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+// 1. Defining predicate functions to be used with Boolean test assertions
+// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+// 2. Defining predicate-format functions to be
+// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+// testing::AssertionResult IsEven(int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess();
+// else
+// return testing::AssertionFailure() << n << " is odd";
+// }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+// Value of: IsEven(Fib(5))
+// Actual: false (5 is odd)
+// Expected: true
+//
+// instead of a more opaque
+//
+// Value of: IsEven(Fib(5))
+// Actual: false
+// Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+// testing::AssertionResult IsEven(int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess() << n << " is even";
+// else
+// return testing::AssertionFailure() << n << " is odd";
+// }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+// Value of: IsEven(Fib(6))
+// Actual: true (8 is even)
+// Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+// // Verifies that Foo() returns an even number.
+// EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+// testing::AssertionResult IsEven(const char* expr, int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess();
+// else
+// return testing::AssertionFailure()
+// << "Expected: " << expr << " is even\n Actual: it's " << n;
+// }
+//
+// If Foo() returns 5, you will see the following message:
+//
+// Expected: Foo() is even
+// Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+ // Copy constructor.
+ // Used in EXPECT_TRUE/FALSE(assertion_result).
+ AssertionResult(const AssertionResult& other);
+
+ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)
+
+ // Used in the EXPECT_TRUE/FALSE(bool_expression).
+ //
+ // T must be contextually convertible to bool.
+ //
+ // The second parameter prevents this overload from being considered if
+ // the argument is implicitly convertible to AssertionResult. In that case
+ // we want AssertionResult's copy constructor to be used.
+ template <typename T>
+ explicit AssertionResult(
+ const T& success,
+ typename internal::EnableIf<
+ !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*
+ /*enabler*/ = NULL)
+ : success_(success) {}
+
+ GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+ // Assignment operator.
+ AssertionResult& operator=(AssertionResult other) {
+ swap(other);
+ return *this;
+ }
+
+ // Returns true iff the assertion succeeded.
+ operator bool() const { return success_; } // NOLINT
+
+ // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+ AssertionResult operator!() const;
+
+ // Returns the text streamed into this AssertionResult. Test assertions
+ // use it when they fail (i.e., the predicate's outcome doesn't match the
+ // assertion's expectation). When nothing has been streamed into the
+ // object, returns an empty string.
+ const char* message() const {
+ return message_.get() != NULL ? message_->c_str() : "";
+ }
+ // TODO(vladl@google.com): Remove this after making sure no clients use it.
+ // Deprecated; please use message() instead.
+ const char* failure_message() const { return message(); }
+
+ // Streams a custom failure message into this object.
+ template <typename T> AssertionResult& operator<<(const T& value) {
+ AppendMessage(Message() << value);
+ return *this;
+ }
+
+ // Allows streaming basic output manipulators such as endl or flush into
+ // this object.
+ AssertionResult& operator<<(
+ ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+ AppendMessage(Message() << basic_manipulator);
+ return *this;
+ }
+
+ private:
+ // Appends the contents of message to message_.
+ void AppendMessage(const Message& a_message) {
+ if (message_.get() == NULL)
+ message_.reset(new ::std::string);
+ message_->append(a_message.GetString().c_str());
+ }
+
+ // Swap the contents of this AssertionResult with other.
+ void swap(AssertionResult& other);
+
+ // Stores result of the assertion predicate.
+ bool success_;
+ // Stores the message describing the condition in case the expectation
+ // construct is not satisfied with the predicate's outcome.
+ // Referenced via a pointer to avoid taking too much stack frame space
+ // with test assertions.
+ internal::scoped_ptr< ::std::string> message_;
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F. For example:
+//
+// class FooTest : public testing::Test {
+// protected:
+// void SetUp() override { ... }
+// void TearDown() override { ... }
+// ...
+// };
+//
+// TEST_F(FooTest, Bar) { ... }
+// TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+ friend class TestInfo;
+
+ // Defines types for pointers to functions that set up and tear down
+ // a test case.
+ typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+ typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+ // The d'tor is virtual as we intend to inherit from Test.
+ virtual ~Test();
+
+ // Sets up the stuff shared by all tests in this test case.
+ //
+ // Google Test will call Foo::SetUpTestCase() before running the first
+ // test in test case Foo. Hence a sub-class can define its own
+ // SetUpTestCase() method to shadow the one defined in the super
+ // class.
+ static void SetUpTestCase() {}
+
+ // Tears down the stuff shared by all tests in this test case.
+ //
+ // Google Test will call Foo::TearDownTestCase() after running the last
+ // test in test case Foo. Hence a sub-class can define its own
+ // TearDownTestCase() method to shadow the one defined in the super
+ // class.
+ static void TearDownTestCase() {}
+
+ // Returns true iff the current test has a fatal failure.
+ static bool HasFatalFailure();
+
+ // Returns true iff the current test has a non-fatal failure.
+ static bool HasNonfatalFailure();
+
+ // Returns true iff the current test has a (either fatal or
+ // non-fatal) failure.
+ static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+ // Logs a property for the current test, test case, or for the entire
+ // invocation of the test program when used outside of the context of a
+ // test case. Only the last value for a given key is remembered. These
+ // are public static so they can be called from utility functions that are
+ // not members of the test fixture. Calls to RecordProperty made during
+ // lifespan of the test (from the moment its constructor starts to the
+ // moment its destructor finishes) will be output in XML as attributes of
+ // the <testcase> element. Properties recorded from fixture's
+ // SetUpTestCase or TearDownTestCase are logged as attributes of the
+ // corresponding <testsuite> element. Calls to RecordProperty made in the
+ // global context (before or after invocation of RUN_ALL_TESTS and from
+ // SetUp/TearDown method of Environment objects registered with Google
+ // Test) will be output as attributes of the <testsuites> element.
+ static void RecordProperty(const std::string& key, const std::string& value);
+ static void RecordProperty(const std::string& key, int value);
+
+ protected:
+ // Creates a Test object.
+ Test();
+
+ // Sets up the test fixture.
+ virtual void SetUp();
+
+ // Tears down the test fixture.
+ virtual void TearDown();
+
+ private:
+ // Returns true iff the current test has the same fixture class as
+ // the first test in the current test case.
+ static bool HasSameFixtureClass();
+
+ // Runs the test after the test fixture has been set up.
+ //
+ // A sub-class must implement this to define the test logic.
+ //
+ // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+ // Instead, use the TEST or TEST_F macro.
+ virtual void TestBody() = 0;
+
+ // Sets up, executes, and tears down the test.
+ void Run();
+
+ // Deletes self. We deliberately pick an unusual name for this
+ // internal method to avoid clashing with names used in user TESTs.
+ void DeleteSelf_() { delete this; }
+
+ const internal::scoped_ptr< GTEST_FLAG_SAVER_ > gtest_flag_saver_;
+
+ // Often a user misspells SetUp() as Setup() and spends a long time
+ // wondering why it is never called by Google Test. The declaration of
+ // the following method is solely for catching such an error at
+ // compile time:
+ //
+ // - The return type is deliberately chosen to be not void, so it
+ // will be a conflict if void Setup() is declared in the user's
+ // test fixture.
+ //
+ // - This method is private, so it will be another compiler error
+ // if the method is called from the user's test fixture.
+ //
+ // DO NOT OVERRIDE THIS FUNCTION.
+ //
+ // If you see an error about overriding the following function or
+ // about it being private, you have mis-spelled SetUp() as Setup().
+ struct Setup_should_be_spelled_SetUp {};
+ virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+ // We disallow copying Tests.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+ // C'tor. TestProperty does NOT have a default constructor.
+ // Always use this constructor (with parameters) to create a
+ // TestProperty object.
+ TestProperty(const std::string& a_key, const std::string& a_value) :
+ key_(a_key), value_(a_value) {
+ }
+
+ // Gets the user supplied key.
+ const char* key() const {
+ return key_.c_str();
+ }
+
+ // Gets the user supplied value.
+ const char* value() const {
+ return value_.c_str();
+ }
+
+ // Sets a new value, overriding the one supplied in the constructor.
+ void SetValue(const std::string& new_value) {
+ value_ = new_value;
+ }
+
+ private:
+ // The key supplied by the user.
+ std::string key_;
+ // The value supplied by the user.
+ std::string value_;
+};
+
+// The result of a single Test. This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+ // Creates an empty TestResult.
+ TestResult();
+
+ // D'tor. Do not inherit from TestResult.
+ ~TestResult();
+
+ // Gets the number of all test parts. This is the sum of the number
+ // of successful test parts and the number of failed test parts.
+ int total_part_count() const;
+
+ // Returns the number of the test properties.
+ int test_property_count() const;
+
+ // Returns true iff the test passed (i.e. no test part failed).
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the test failed.
+ bool Failed() const;
+
+ // Returns true iff the test fatally failed.
+ bool HasFatalFailure() const;
+
+ // Returns true iff the test has a non-fatal failure.
+ bool HasNonfatalFailure() const;
+
+ // Returns the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns the i-th test part result among all the results. i can range
+ // from 0 to test_property_count() - 1. If i is not in that range, aborts
+ // the program.
+ const TestPartResult& GetTestPartResult(int i) const;
+
+ // Returns the i-th test property. i can range from 0 to
+ // test_property_count() - 1. If i is not in that range, aborts the
+ // program.
+ const TestProperty& GetTestProperty(int i) const;
+
+ private:
+ friend class TestInfo;
+ friend class TestCase;
+ friend class UnitTest;
+ friend class internal::DefaultGlobalTestPartResultReporter;
+ friend class internal::ExecDeathTest;
+ friend class internal::TestResultAccessor;
+ friend class internal::UnitTestImpl;
+ friend class internal::WindowsDeathTest;
+
+ // Gets the vector of TestPartResults.
+ const std::vector<TestPartResult>& test_part_results() const {
+ return test_part_results_;
+ }
+
+ // Gets the vector of TestProperties.
+ const std::vector<TestProperty>& test_properties() const {
+ return test_properties_;
+ }
+
+ // Sets the elapsed time.
+ void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+ // Adds a test property to the list. The property is validated and may add
+ // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+ // key names). If a property is already recorded for the same key, the
+ // value will be updated, rather than storing multiple values for the same
+ // key. xml_element specifies the element for which the property is being
+ // recorded and is used for validation.
+ void RecordProperty(const std::string& xml_element,
+ const TestProperty& test_property);
+
+ // Adds a failure if the key is a reserved attribute of Google Test
+ // testcase tags. Returns true if the property is valid.
+ // TODO(russr): Validate attribute names are legal and human readable.
+ static bool ValidateTestProperty(const std::string& xml_element,
+ const TestProperty& test_property);
+
+ // Adds a test part result to the list.
+ void AddTestPartResult(const TestPartResult& test_part_result);
+
+ // Returns the death test count.
+ int death_test_count() const { return death_test_count_; }
+
+ // Increments the death test count, returning the new count.
+ int increment_death_test_count() { return ++death_test_count_; }
+
+ // Clears the test part results.
+ void ClearTestPartResults();
+
+ // Clears the object.
+ void Clear();
+
+ // Protects mutable state of the property vector and of owned
+ // properties, whose values may be updated.
+ internal::Mutex test_properites_mutex_;
+
+ // The vector of TestPartResults
+ std::vector<TestPartResult> test_part_results_;
+ // The vector of TestProperties
+ std::vector<TestProperty> test_properties_;
+ // Running count of death tests.
+ int death_test_count_;
+ // The elapsed time, in milliseconds.
+ TimeInMillis elapsed_time_;
+
+ // We disallow copying TestResult.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+}; // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+// Test case name
+// Test name
+// Whether the test should be run
+// A function pointer that creates the test object when invoked
+// Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+ // Destructs a TestInfo object. This function is not virtual, so
+ // don't inherit from TestInfo.
+ ~TestInfo();
+
+ // Returns the test case name.
+ const char* test_case_name() const { return test_case_name_.c_str(); }
+
+ // Returns the test name.
+ const char* name() const { return name_.c_str(); }
+
+ // Returns the name of the parameter type, or NULL if this is not a typed
+ // or a type-parameterized test.
+ const char* type_param() const {
+ if (type_param_.get() != NULL)
+ return type_param_->c_str();
+ return NULL;
+ }
+
+ // Returns the text representation of the value parameter, or NULL if this
+ // is not a value-parameterized test.
+ const char* value_param() const {
+ if (value_param_.get() != NULL)
+ return value_param_->c_str();
+ return NULL;
+ }
+
+ // Returns the file name where this test is defined.
+ const char* file() const { return location_.file.c_str(); }
+
+ // Returns the line where this test is defined.
+ int line() const { return location_.line; }
+
+ // Returns true if this test should run, that is if the test is not
+ // disabled (or it is disabled but the also_run_disabled_tests flag has
+ // been specified) and its full name matches the user-specified filter.
+ //
+ // Google Test allows the user to filter the tests by their full names.
+ // The full name of a test Bar in test case Foo is defined as
+ // "Foo.Bar". Only the tests that match the filter will run.
+ //
+ // A filter is a colon-separated list of glob (not regex) patterns,
+ // optionally followed by a '-' and a colon-separated list of
+ // negative patterns (tests to exclude). A test is run if it
+ // matches one of the positive patterns and does not match any of
+ // the negative patterns.
+ //
+ // For example, *A*:Foo.* is a filter that matches any string that
+ // contains the character 'A' or starts with "Foo.".
+ bool should_run() const { return should_run_; }
+
+ // Returns true iff this test will appear in the XML report.
+ bool is_reportable() const {
+ // For now, the XML report includes all tests matching the filter.
+ // In the future, we may trim tests that are excluded because of
+ // sharding.
+ return matches_filter_;
+ }
+
+ // Returns the result of the test.
+ const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+ friend class internal::DefaultDeathTestFactory;
+#endif // GTEST_HAS_DEATH_TEST
+ friend class Test;
+ friend class TestCase;
+ friend class internal::UnitTestImpl;
+ friend class internal::StreamingListenerTest;
+ friend TestInfo* internal::MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ internal::CodeLocation code_location,
+ internal::TypeId fixture_class_id,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc,
+ internal::TestFactoryBase* factory);
+
+ // Constructs a TestInfo object. The newly constructed instance assumes
+ // ownership of the factory object.
+ TestInfo(const std::string& test_case_name,
+ const std::string& name,
+ const char* a_type_param, // NULL if not a type-parameterized test
+ const char* a_value_param, // NULL if not a value-parameterized test
+ internal::CodeLocation a_code_location,
+ internal::TypeId fixture_class_id,
+ internal::TestFactoryBase* factory);
+
+ // Increments the number of death tests encountered in this test so
+ // far.
+ int increment_death_test_count() {
+ return result_.increment_death_test_count();
+ }
+
+ // Creates the test object, runs it, records its result, and then
+ // deletes it.
+ void Run();
+
+ static void ClearTestResult(TestInfo* test_info) {
+ test_info->result_.Clear();
+ }
+
+ // These fields are immutable properties of the test.
+ const std::string test_case_name_; // Test case name
+ const std::string name_; // Test name
+ // Name of the parameter type, or NULL if this is not a typed or a
+ // type-parameterized test.
+ const internal::scoped_ptr<const ::std::string> type_param_;
+ // Text representation of the value parameter, or NULL if this is not a
+ // value-parameterized test.
+ const internal::scoped_ptr<const ::std::string> value_param_;
+ internal::CodeLocation location_;
+ const internal::TypeId fixture_class_id_; // ID of the test fixture class
+ bool should_run_; // True iff this test should run
+ bool is_disabled_; // True iff this test is disabled
+ bool matches_filter_; // True if this test matches the
+ // user-specified filter.
+ internal::TestFactoryBase* const factory_; // The factory that creates
+ // the test object
+
+ // This field is mutable and needs to be reset before running the
+ // test for the second time.
+ TestResult result_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+ // Creates a TestCase with the given name.
+ //
+ // TestCase does NOT have a default constructor. Always use this
+ // constructor to create a TestCase object.
+ //
+ // Arguments:
+ //
+ // name: name of the test case
+ // a_type_param: the name of the test's type parameter, or NULL if
+ // this is not a type-parameterized test.
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ TestCase(const char* name, const char* a_type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc);
+
+ // Destructor of TestCase.
+ virtual ~TestCase();
+
+ // Gets the name of the TestCase.
+ const char* name() const { return name_.c_str(); }
+
+ // Returns the name of the parameter type, or NULL if this is not a
+ // type-parameterized test case.
+ const char* type_param() const {
+ if (type_param_.get() != NULL)
+ return type_param_->c_str();
+ return NULL;
+ }
+
+ // Returns true if any test in this test case should run.
+ bool should_run() const { return should_run_; }
+
+ // Gets the number of successful tests in this test case.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests in this test case.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests in this test case.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Get the number of tests in this test case that should run.
+ int test_to_run_count() const;
+
+ // Gets the number of all tests in this test case.
+ int total_test_count() const;
+
+ // Returns true iff the test case passed.
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the test case failed.
+ bool Failed() const { return failed_test_count() > 0; }
+
+ // Returns the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns the i-th test among all the tests. i can range from 0 to
+ // total_test_count() - 1. If i is not in that range, returns NULL.
+ const TestInfo* GetTestInfo(int i) const;
+
+ // Returns the TestResult that holds test properties recorded during
+ // execution of SetUpTestCase and TearDownTestCase.
+ const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+ friend class Test;
+ friend class internal::UnitTestImpl;
+
+ // Gets the (mutable) vector of TestInfos in this TestCase.
+ std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+ // Gets the (immutable) vector of TestInfos in this TestCase.
+ const std::vector<TestInfo*>& test_info_list() const {
+ return test_info_list_;
+ }
+
+ // Returns the i-th test among all the tests. i can range from 0 to
+ // total_test_count() - 1. If i is not in that range, returns NULL.
+ TestInfo* GetMutableTestInfo(int i);
+
+ // Sets the should_run member.
+ void set_should_run(bool should) { should_run_ = should; }
+
+ // Adds a TestInfo to this test case. Will delete the TestInfo upon
+ // destruction of the TestCase object.
+ void AddTestInfo(TestInfo * test_info);
+
+ // Clears the results of all tests in this test case.
+ void ClearResult();
+
+ // Clears the results of all tests in the given test case.
+ static void ClearTestCaseResult(TestCase* test_case) {
+ test_case->ClearResult();
+ }
+
+ // Runs every test in this TestCase.
+ void Run();
+
+ // Runs SetUpTestCase() for this TestCase. This wrapper is needed
+ // for catching exceptions thrown from SetUpTestCase().
+ void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+ // Runs TearDownTestCase() for this TestCase. This wrapper is
+ // needed for catching exceptions thrown from TearDownTestCase().
+ void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+ // Returns true iff test passed.
+ static bool TestPassed(const TestInfo* test_info) {
+ return test_info->should_run() && test_info->result()->Passed();
+ }
+
+ // Returns true iff test failed.
+ static bool TestFailed(const TestInfo* test_info) {
+ return test_info->should_run() && test_info->result()->Failed();
+ }
+
+ // Returns true iff the test is disabled and will be reported in the XML
+ // report.
+ static bool TestReportableDisabled(const TestInfo* test_info) {
+ return test_info->is_reportable() && test_info->is_disabled_;
+ }
+
+ // Returns true iff test is disabled.
+ static bool TestDisabled(const TestInfo* test_info) {
+ return test_info->is_disabled_;
+ }
+
+ // Returns true iff this test will appear in the XML report.
+ static bool TestReportable(const TestInfo* test_info) {
+ return test_info->is_reportable();
+ }
+
+ // Returns true if the given test should run.
+ static bool ShouldRunTest(const TestInfo* test_info) {
+ return test_info->should_run();
+ }
+
+ // Shuffles the tests in this test case.
+ void ShuffleTests(internal::Random* random);
+
+ // Restores the test order to before the first shuffle.
+ void UnshuffleTests();
+
+ // Name of the test case.
+ std::string name_;
+ // Name of the parameter type, or NULL if this is not a typed or a
+ // type-parameterized test.
+ const internal::scoped_ptr<const ::std::string> type_param_;
+ // The vector of TestInfos in their original order. It owns the
+ // elements in the vector.
+ std::vector<TestInfo*> test_info_list_;
+ // Provides a level of indirection for the test list to allow easy
+ // shuffling and restoring the test order. The i-th element in this
+ // vector is the index of the i-th test in the shuffled test list.
+ std::vector<int> test_indices_;
+ // Pointer to the function that sets up the test case.
+ Test::SetUpTestCaseFunc set_up_tc_;
+ // Pointer to the function that tears down the test case.
+ Test::TearDownTestCaseFunc tear_down_tc_;
+ // True iff any test in this test case should run.
+ bool should_run_;
+ // Elapsed time, in milliseconds.
+ TimeInMillis elapsed_time_;
+ // Holds test properties recorded during execution of SetUpTestCase and
+ // TearDownTestCase.
+ TestResult ad_hoc_test_result_;
+
+ // We disallow copying TestCases.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment. You should subclass this to define your own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+// 1. You cannot safely throw from a destructor. This is a problem
+// as in some cases Google Test is used where exceptions are enabled, and
+// we may want to implement ASSERT_* using exceptions where they are
+// available.
+// 2. You cannot use ASSERT_* directly in a constructor or
+// destructor.
+class Environment {
+ public:
+ // The d'tor is virtual as we need to subclass Environment.
+ virtual ~Environment() {}
+
+ // Override this to define how to set up the environment.
+ virtual void SetUp() {}
+
+ // Override this to define how to tear down the environment.
+ virtual void TearDown() {}
+ private:
+ // If you see an error about overriding the following function or
+ // about it being private, you have mis-spelled SetUp() as Setup().
+ struct Setup_should_be_spelled_SetUp {};
+ virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+ virtual ~TestEventListener() {}
+
+ // Fired before any test activity starts.
+ virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+ // Fired before each iteration of tests starts. There may be more than
+ // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+ // index, starting from 0.
+ virtual void OnTestIterationStart(const UnitTest& unit_test,
+ int iteration) = 0;
+
+ // Fired before environment set-up for each iteration of tests starts.
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+ // Fired after environment set-up for each iteration of tests ends.
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+ // Fired before the test case starts.
+ virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+ // Fired before the test starts.
+ virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+ // Fired after a failed assertion or a SUCCEED() invocation.
+ virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+ // Fired after the test ends.
+ virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+ // Fired after the test case ends.
+ virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+ // Fired before environment tear-down for each iteration of tests starts.
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+ // Fired after environment tear-down for each iteration of tests ends.
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+ // Fired after each iteration of tests finishes.
+ virtual void OnTestIterationEnd(const UnitTest& unit_test,
+ int iteration) = 0;
+
+ // Fired after all test activities have ended.
+ virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build. For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+ virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+ int /*iteration*/) {}
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+ virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+ virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+ virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+ virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+ int /*iteration*/) {}
+ virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+ TestEventListeners();
+ ~TestEventListeners();
+
+ // Appends an event listener to the end of the list. Google Test assumes
+ // the ownership of the listener (i.e. it will delete the listener when
+ // the test program finishes).
+ void Append(TestEventListener* listener);
+
+ // Removes the given event listener from the list and returns it. It then
+ // becomes the caller's responsibility to delete the listener. Returns
+ // NULL if the listener is not found in the list.
+ TestEventListener* Release(TestEventListener* listener);
+
+ // Returns the standard listener responsible for the default console
+ // output. Can be removed from the listeners list to shut down default
+ // console output. Note that removing this object from the listener list
+ // with Release transfers its ownership to the caller and makes this
+ // function return NULL the next time.
+ TestEventListener* default_result_printer() const {
+ return default_result_printer_;
+ }
+
+ // Returns the standard listener responsible for the default XML output
+ // controlled by the --gtest_output=xml flag. Can be removed from the
+ // listeners list by users who want to shut down the default XML output
+ // controlled by this flag and substitute it with custom one. Note that
+ // removing this object from the listener list with Release transfers its
+ // ownership to the caller and makes this function return NULL the next
+ // time.
+ TestEventListener* default_xml_generator() const {
+ return default_xml_generator_;
+ }
+
+ private:
+ friend class TestCase;
+ friend class TestInfo;
+ friend class internal::DefaultGlobalTestPartResultReporter;
+ friend class internal::NoExecDeathTest;
+ friend class internal::TestEventListenersAccessor;
+ friend class internal::UnitTestImpl;
+
+ // Returns repeater that broadcasts the TestEventListener events to all
+ // subscribers.
+ TestEventListener* repeater();
+
+ // Sets the default_result_printer attribute to the provided listener.
+ // The listener is also added to the listener list and previous
+ // default_result_printer is removed from it and deleted. The listener can
+ // also be NULL in which case it will not be added to the list. Does
+ // nothing if the previous and the current listener objects are the same.
+ void SetDefaultResultPrinter(TestEventListener* listener);
+
+ // Sets the default_xml_generator attribute to the provided listener. The
+ // listener is also added to the listener list and previous
+ // default_xml_generator is removed from it and deleted. The listener can
+ // also be NULL in which case it will not be added to the list. Does
+ // nothing if the previous and the current listener objects are the same.
+ void SetDefaultXmlGenerator(TestEventListener* listener);
+
+ // Controls whether events will be forwarded by the repeater to the
+ // listeners in the list.
+ bool EventForwardingEnabled() const;
+ void SuppressEventForwarding();
+
+ // The actual list of listeners.
+ internal::TestEventRepeater* repeater_;
+ // Listener responsible for the standard result output.
+ TestEventListener* default_result_printer_;
+ // Listener responsible for the creation of the XML output file.
+ TestEventListener* default_xml_generator_;
+
+ // We disallow copying TestEventListeners.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class. The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called. This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+ // Gets the singleton UnitTest object. The first time this method
+ // is called, a UnitTest object is constructed and returned.
+ // Consecutive calls will return the same object.
+ static UnitTest* GetInstance();
+
+ // Runs all tests in this UnitTest object and prints the result.
+ // Returns 0 if successful, or 1 otherwise.
+ //
+ // This method can only be called from the main thread.
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ int Run() GTEST_MUST_USE_RESULT_;
+
+ // Returns the working directory when the first TEST() or TEST_F()
+ // was executed. The UnitTest object owns the string.
+ const char* original_working_dir() const;
+
+ // Returns the TestCase object for the test that's currently running,
+ // or NULL if no test is running.
+ const TestCase* current_test_case() const
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Returns the TestInfo object for the test that's currently running,
+ // or NULL if no test is running.
+ const TestInfo* current_test_info() const
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Returns the random seed used at the start of the current test run.
+ int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+ // Returns the ParameterizedTestCaseRegistry object used to keep track of
+ // value-parameterized tests and instantiate and register them.
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+ GTEST_LOCK_EXCLUDED_(mutex_);
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Gets the number of successful test cases.
+ int successful_test_case_count() const;
+
+ // Gets the number of failed test cases.
+ int failed_test_case_count() const;
+
+ // Gets the number of all test cases.
+ int total_test_case_count() const;
+
+ // Gets the number of all test cases that contain at least one test
+ // that should run.
+ int test_case_to_run_count() const;
+
+ // Gets the number of successful tests.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Gets the number of all tests.
+ int total_test_count() const;
+
+ // Gets the number of tests that should run.
+ int test_to_run_count() const;
+
+ // Gets the time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp() const;
+
+ // Gets the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const;
+
+ // Returns true iff the unit test passed (i.e. all test cases passed).
+ bool Passed() const;
+
+ // Returns true iff the unit test failed (i.e. some test case failed
+ // or something outside of all tests failed).
+ bool Failed() const;
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ const TestCase* GetTestCase(int i) const;
+
+ // Returns the TestResult containing information on test failures and
+ // properties logged outside of individual test cases.
+ const TestResult& ad_hoc_test_result() const;
+
+ // Returns the list of event listeners that can be used to track events
+ // inside Google Test.
+ TestEventListeners& listeners();
+
+ private:
+ // Registers and returns a global test environment. When a test
+ // program is run, all global test environments will be set-up in
+ // the order they were registered. After all tests in the program
+ // have finished, all global test environments will be torn-down in
+ // the *reverse* order they were registered.
+ //
+ // The UnitTest object takes ownership of the given environment.
+ //
+ // This method can only be called from the main thread.
+ Environment* AddEnvironment(Environment* env);
+
+ // Adds a TestPartResult to the current TestResult object. All
+ // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+ // eventually call this to report their results. The user code
+ // should use the assertion macros instead of calling this directly.
+ void AddTestPartResult(TestPartResult::Type result_type,
+ const char* file_name,
+ int line_number,
+ const std::string& message,
+ const std::string& os_stack_trace)
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Adds a TestProperty to the current TestResult object when invoked from
+ // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+ // from SetUpTestCase or TearDownTestCase, or to the global property set
+ // when invoked elsewhere. If the result already contains a property with
+ // the same key, the value will be updated.
+ void RecordProperty(const std::string& key, const std::string& value);
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ TestCase* GetMutableTestCase(int i);
+
+ // Accessors for the implementation object.
+ internal::UnitTestImpl* impl() { return impl_; }
+ const internal::UnitTestImpl* impl() const { return impl_; }
+
+ // These classes and funcions are friends as they need to access private
+ // members of UnitTest.
+ friend class Test;
+ friend class internal::AssertHelper;
+ friend class internal::ScopedTrace;
+ friend class internal::StreamingListenerTest;
+ friend class internal::UnitTestRecordPropertyTestHelper;
+ friend Environment* AddGlobalTestEnvironment(Environment* env);
+ friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+ friend void internal::ReportFailureInUnknownLocation(
+ TestPartResult::Type result_type,
+ const std::string& message);
+
+ // Creates an empty UnitTest.
+ UnitTest();
+
+ // D'tor
+ virtual ~UnitTest();
+
+ // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+ // Google Test trace stack.
+ void PushGTestTrace(const internal::TraceInfo& trace)
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Pops a trace from the per-thread Google Test trace stack.
+ void PopGTestTrace()
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Protects mutable state in *impl_. This is mutable as some const
+ // methods need to lock it too.
+ mutable internal::Mutex mutex_;
+
+ // Opaque implementation object. This field is never changed once
+ // the object is constructed. We don't mark it as const here, as
+ // doing so will cause a warning in the constructor of UnitTest.
+ // Mutable state in *impl_ is protected by mutex_.
+ internal::UnitTestImpl* impl_;
+
+ // We disallow copying UnitTest.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main(). If you use gtest_main, you need to call this before main()
+// starts for it to take effect. For example, you can define a global
+// variable like this:
+//
+// testing::Environment* const foo_env =
+// testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+ return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test. This must be called before calling
+// RUN_ALL_TESTS(). In particular, it parses a command line for the
+// flags that Google Test recognizes. Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned. Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// Separate the error generating code from the code path to reduce the stack
+// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers
+// when calling EXPECT_* in a tight loop.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQFailure(const char* lhs_expression,
+ const char* rhs_expression,
+ const T1& lhs, const T2& rhs) {
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ FormatForComparisonFailureMessage(lhs, rhs),
+ FormatForComparisonFailureMessage(rhs, lhs),
+ false);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* lhs_expression,
+ const char* rhs_expression,
+ const T1& lhs,
+ const T2& rhs) {
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(4389 /* signed/unsigned mismatch */)
+ if (lhs == rhs) {
+ return AssertionSuccess();
+ }
+GTEST_DISABLE_MSC_WARNINGS_POP_()
+
+ return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression,
+ const char* rhs_expression,
+ BiggestInt lhs,
+ BiggestInt rhs);
+
+// The helper class for {ASSERT|EXPECT}_EQ. The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal. The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+ // This templatized version is for the general case.
+ template <typename T1, typename T2>
+ static AssertionResult Compare(const char* lhs_expression,
+ const char* rhs_expression,
+ const T1& lhs,
+ const T2& rhs) {
+ return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
+ }
+
+ // With this overloaded version, we allow anonymous enums to be used
+ // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+ // enums can be implicitly cast to BiggestInt.
+ //
+ // Even though its body looks the same as the above version, we
+ // cannot merge the two, as it will make anonymous enums unhappy.
+ static AssertionResult Compare(const char* lhs_expression,
+ const char* rhs_expression,
+ BiggestInt lhs,
+ BiggestInt rhs) {
+ return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
+ }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+ // We define two overloaded versions of Compare(). The first
+ // version will be picked when the second argument to ASSERT_EQ() is
+ // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+ // EXPECT_EQ(false, a_bool).
+ template <typename T1, typename T2>
+ static AssertionResult Compare(
+ const char* lhs_expression,
+ const char* rhs_expression,
+ const T1& lhs,
+ const T2& rhs,
+ // The following line prevents this overload from being considered if T2
+ // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)
+ // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+ // to match the Secret* in the other overload, which would otherwise make
+ // this template match better.
+ typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+ return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
+ }
+
+ // This version will be picked when the second argument to ASSERT_EQ() is a
+ // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+ template <typename T>
+ static AssertionResult Compare(
+ const char* lhs_expression,
+ const char* rhs_expression,
+ // We used to have a second template parameter instead of Secret*. That
+ // template parameter would deduce to 'long', making this a better match
+ // than the first overload even without the first overload's EnableIf.
+ // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+ // non-pointer argument" (even a deduced integral argument), so the old
+ // implementation caused warnings in user code.
+ Secret* /* lhs (NULL) */,
+ T* rhs) {
+ // We already know that 'lhs' is a null pointer.
+ return CmpHelperEQ(lhs_expression, rhs_expression,
+ static_cast<T*>(NULL), rhs);
+ }
+};
+
+// Separate the error generating code from the code path to reduce the stack
+// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers
+// when calling EXPECT_OP in a tight loop.
+template <typename T1, typename T2>
+AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,
+ const T1& val1, const T2& val2,
+ const char* op) {
+ return AssertionFailure()
+ << "Expected: (" << expr1 << ") " << op << " (" << expr2
+ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)
+ << " vs " << FormatForComparisonFailureMessage(val2, val1);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+ const T1& val1, const T2& val2) {\
+ if (val1 op val2) {\
+ return AssertionSuccess();\
+ } else {\
+ return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\
+ }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
+ const char* s2_expression,
+ const wchar_t* s1,
+ const wchar_t* s2);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const wchar_t* s1,
+ const wchar_t* s2);
+
+} // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves. They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+// RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression,
+ const char* rhs_expression,
+ RawType lhs_value,
+ RawType rhs_value) {
+ const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);
+
+ if (lhs.AlmostEquals(rhs)) {
+ return AssertionSuccess();
+ }
+
+ ::std::stringstream lhs_ss;
+ lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << lhs_value;
+
+ ::std::stringstream rhs_ss;
+ rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << rhs_value;
+
+ return EqFailure(lhs_expression,
+ rhs_expression,
+ StringStreamToString(&lhs_ss),
+ StringStreamToString(&rhs_ss),
+ false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ double val1,
+ double val2,
+ double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+ // Constructor.
+ AssertHelper(TestPartResult::Type type,
+ const char* file,
+ int line,
+ const char* message);
+ ~AssertHelper();
+
+ // Message assignment is a semantic trick to enable assertion
+ // streaming; see the GTEST_MESSAGE_ macro below.
+ void operator=(const Message& message) const;
+
+ private:
+ // We put our data in a struct so that the size of the AssertHelper class can
+ // be as small as possible. This is important because gcc is incapable of
+ // re-using stack space even for temporary variables, so every EXPECT_EQ
+ // reserves stack space for another AssertHelper.
+ struct AssertHelperData {
+ AssertHelperData(TestPartResult::Type t,
+ const char* srcfile,
+ int line_num,
+ const char* msg)
+ : type(t), file(srcfile), line(line_num), message(msg) { }
+
+ TestPartResult::Type const type;
+ const char* const file;
+ int const line;
+ std::string const message;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+ };
+
+ AssertHelperData* const data_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+} // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+// protected:
+// FooTest() {
+// // Can use GetParam() here.
+// }
+// virtual ~FooTest() {
+// // Can use GetParam() here.
+// }
+// virtual void SetUp() {
+// // Can use GetParam() here.
+// }
+// virtual void TearDown {
+// // Can use GetParam() here.
+// }
+// };
+// TEST_P(FooTest, DoesBar) {
+// // Can use GetParam() method here.
+// Foo foo;
+// ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+ typedef T ParamType;
+ virtual ~WithParamInterface() {}
+
+ // The current parameter value. Is also available in the test fixture's
+ // constructor. This member function is non-static, even though it only
+ // references static data, to reduce the opportunity for incorrect uses
+ // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+ // uses a fixture whose parameter type is int.
+ const ParamType& GetParam() const {
+ GTEST_CHECK_(parameter_ != NULL)
+ << "GetParam() can only be called inside a value-parameterized test "
+ << "-- did you intend to write TEST_P instead of TEST_F?";
+ return *parameter_;
+ }
+
+ private:
+ // Sets parameter value. The caller is responsible for making sure the value
+ // remains alive and unchanged throughout the current test.
+ static void SetParam(const ParamType* parameter) {
+ parameter_ = parameter;
+ }
+
+ // Static value used for accessing parameter during a test lifetime.
+ static const ParamType* parameter_;
+
+ // TestClass must be a subclass of WithParamInterface<T> and Test.
+ template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied. If not,
+// it behaves like ADD_FAILURE. In particular:
+//
+// EXPECT_TRUE verifies that a Boolean condition is true.
+// EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure. People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+ GTEST_MESSAGE_AT_(file, line, "Failed", \
+ ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+// Tests that the statement throws the expected exception.
+// * {ASSERT|EXPECT}_NO_THROW(statement):
+// Tests that the statement doesn't throw any exception.
+// * {ASSERT|EXPECT}_ANY_THROW(statement):
+// Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+ GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \
+ GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+ GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+ GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \
+ GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+ GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
+#endif // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+// ASSERT_PRED_FORMAT1(pred_format, v1)
+// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+// ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult. See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+// ASSERT_PRED1(pred, v1)
+// ASSERT_PRED2(pred, v1, v2)
+// ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework@googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce. Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (const ::testing::AssertionResult gtest_ar = (expression)) \
+ ; \
+ else \
+ on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+ const char* e1,
+ Pred pred,
+ const T1& v1) {
+ if (pred(v1)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, v1), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+ #v1, \
+ pred, \
+ v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ Pred pred,
+ const T1& v1,
+ const T2& v2) {
+ if (pred(v1, v2)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+ #v1, \
+ #v2, \
+ pred, \
+ v1, \
+ v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3) {
+ if (pred(v1, v2, v3)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ pred, \
+ v1, \
+ v2, \
+ v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3,
+ typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ const char* e4,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3,
+ const T4& v4) {
+ if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ", "
+ << e4 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3
+ << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ #v4, \
+ pred, \
+ v1, \
+ v2, \
+ v3, \
+ v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3,
+ typename T4,
+ typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ const char* e4,
+ const char* e5,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3,
+ const T4& v4,
+ const T5& v5) {
+ if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ", "
+ << e4 << ", "
+ << e5 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3
+ << "\n" << e4 << " evaluates to " << v4
+ << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ #v4, \
+ #v5, \
+ pred, \
+ v1, \
+ v2, \
+ v3, \
+ v4, \
+ v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+// * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2
+// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
+// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
+// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
+// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
+// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values. The values must be compatible built-in types,
+// or you will get a compiler error. By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+// 1. It is possible to make a user-defined type work with
+// {ASSERT|EXPECT}_??(), but that requires overloading the
+// comparison operators and is thus discouraged by the Google C++
+// Usage Guide. Therefore, you are advised to use the
+// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+// equal.
+//
+// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+// pointers (in particular, C strings). Therefore, if you use it
+// with two C strings, you are testing how their locations in memory
+// are related, not how their content is related. To compare two C
+// strings by content, use {ASSERT|EXPECT}_STR*().
+//
+// 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to
+// {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you
+// what the actual value is when it fails, and similarly for the
+// other comparisons.
+//
+// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+// evaluate their arguments, which is undefined.
+//
+// 5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+// EXPECT_NE(5, Foo());
+// EXPECT_EQ(NULL, a_pointer);
+// ASSERT_LT(i, array_size);
+// ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal:: \
+ EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
+ val1, val2)
+#define EXPECT_NE(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define EXPECT_LE(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal:: \
+ EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
+ val1, val2)
+#define GTEST_ASSERT_NE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons. All tests treat NULL and any non-NULL string
+// as different. Two NULLs are equal.
+//
+// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
+// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
+// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(s1, s2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
+#define EXPECT_STRNE(s1, s2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(s1, s2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
+#define EXPECT_STRCASENE(s1, s2)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(s1, s2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
+#define ASSERT_STRNE(s1, s2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(s1, s2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
+#define ASSERT_STRCASENE(s1, s2)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+// * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):
+// Tests that two float values are almost equal.
+// * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):
+// Tests that two double values are almost equal.
+// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+// Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands. See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(val1, val2)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+ val1, val2)
+
+#define EXPECT_DOUBLE_EQ(val1, val2)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+ val1, val2)
+
+#define ASSERT_FLOAT_EQ(val1, val2)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+ val1, val2)
+
+#define ASSERT_DOUBLE_EQ(val1, val2)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+ val1, val2)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+ val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+ val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+ float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+ double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+// EXPECT_NO_FATAL_FAILURE(Process());
+// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope. The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+ ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+ __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type. The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template. This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated. For example, given:
+//
+// template <typename T> class Foo {
+// public:
+// void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+// };
+//
+// the code:
+//
+// void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated. Instead, you need:
+//
+// void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+ (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+ return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test". For
+// example, a test case for the Foo class can be named FooTest.
+//
+// Test code should appear between braces after an invocation of
+// this macro. Example:
+//
+// TEST(FooTest, InitializesCorrectly) {
+// Foo foo;
+// EXPECT_TRUE(foo.StatusIsOK());
+// }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test. This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X. The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code. GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+ GTEST_TEST_(test_case_name, test_name, \
+ ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name. The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier. The user should put
+// his test code between braces after using this macro. Example:
+//
+// class FooTest : public testing::Test {
+// protected:
+// virtual void SetUp() { b_.AddElement(3); }
+//
+// Foo a_;
+// Foo b_;
+// };
+//
+// TEST_F(FooTest, InitializesCorrectly) {
+// EXPECT_TRUE(a_.StatusIsOK());
+// }
+//
+// TEST_F(FooTest, ReturnsElementCountCorrectly) {
+// EXPECT_EQ(0, a_.size());
+// EXPECT_EQ(1, b_.size());
+// }
+
+#define TEST_F(test_fixture, test_name)\
+ GTEST_TEST_(test_fixture, test_name, test_fixture, \
+ ::testing::internal::GetTypeId<test_fixture>())
+
+} // namespace testing
+
+// Use this function in main() to run all tests. It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+ return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/ext/gtest/gtest.parts b/ext/gtest/gtest.parts
new file mode 100644
index 0000000..2459141
--- /dev/null
+++ b/ext/gtest/gtest.parts
@@ -0,0 +1,52 @@
+############################################################################
+# Copyright 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+
+env.PartVersion("1.8.0")
+env.PartName("gtest")
+
+#files
+cpp_files=['gtest-all.cc']
+
+#includes to install
+install_headers = Glob('*.h')
+
+parts_file = ['gtest.parts']
+license_file = ['LICENSE']
+makefile = ['Makefile']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(cpp_files,sub_dir='ext/gtest')
+ env.InstallTopLevel(install_headers,sub_dir='ext/gtest')
+ env.InstallTopLevel(parts_file,sub_dir='ext/gtest')
+ env.InstallTopLevel(license_file,sub_dir='ext/gtest')
+ env.InstallTopLevel(makefile,sub_dir='ext/gtest')
+else:
+ env.Append(CPPPATH=[AbsDir('..')])
+
+
+ #defines
+ env.Append(CPPDEFINES = ['GTEST_HAS_PTHREAD=0',
+ '_VARIADIC_MAX=10',
+ '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'])
+ env.ExportCPPDEFINES(['GTEST_HAS_PTHREAD=0',
+ '_VARIADIC_MAX=10',
+ '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'])
+
+ outputs = env.Library('${PART_NAME}', cpp_files)
+ sdk_outs = env.Sdk(outputs)
+
+ env.SdkInclude(install_headers, sub_dir='${PART_NAME}')
diff --git a/ext/ipp/include/ippbase.h b/ext/ipp/include/ippbase.h
new file mode 100644
index 0000000..d068421
--- /dev/null
+++ b/ext/ipp/include/ippbase.h
@@ -0,0 +1,188 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Basic Types and Macro Definitions
+//
+//
+*/
+
+
+#ifndef IPPBASE_H__
+#define IPPBASE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define IPP_STDCALL __stdcall
+ #define IPP_CDECL __cdecl
+ #define IPP_INT64 __int64
+ #define IPP_UINT64 unsigned __int64
+#else
+ #define IPP_STDCALL
+ #define IPP_CDECL
+ #define IPP_INT64 long long
+ #define IPP_UINT64 unsigned long long
+#endif
+
+#define IPP_PI ( 3.14159265358979323846 ) /* ANSI C does not support M_PI */
+#define IPP_2PI ( 6.28318530717958647692 ) /* 2*pi */
+#define IPP_PI2 ( 1.57079632679489661923 ) /* pi/2 */
+#define IPP_PI4 ( 0.78539816339744830961 ) /* pi/4 */
+#define IPP_PI180 ( 0.01745329251994329577 ) /* pi/180 */
+#define IPP_RPI ( 0.31830988618379067154 ) /* 1/pi */
+#define IPP_SQRT2 ( 1.41421356237309504880 ) /* sqrt(2) */
+#define IPP_SQRT3 ( 1.73205080756887729353 ) /* sqrt(3) */
+#define IPP_LN2 ( 0.69314718055994530942 ) /* ln(2) */
+#define IPP_LN3 ( 1.09861228866810969139 ) /* ln(3) */
+#define IPP_E ( 2.71828182845904523536 ) /* e */
+#define IPP_RE ( 0.36787944117144232159 ) /* 1/e */
+#define IPP_EPS23 ( 1.19209289e-07f )
+#define IPP_EPS52 ( 2.2204460492503131e-016 )
+
+#define IPP_MAX_8U ( 0xFF )
+#define IPP_MAX_16U ( 0xFFFF )
+#define IPP_MAX_32U ( 0xFFFFFFFF )
+#define IPP_MIN_8U ( 0 )
+#define IPP_MIN_16U ( 0 )
+#define IPP_MIN_32U ( 0 )
+#define IPP_MIN_8S (-128 )
+#define IPP_MAX_8S ( 127 )
+#define IPP_MIN_16S (-32768 )
+#define IPP_MAX_16S ( 32767 )
+#define IPP_MIN_32S (-2147483647 - 1 )
+#define IPP_MAX_32S ( 2147483647 )
+#define IPP_MIN_64U ( 0 )
+
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define IPP_MAX_64S ( 9223372036854775807i64 )
+ #define IPP_MIN_64S (-9223372036854775807i64 - 1 )
+ #define IPP_MAX_64U ( 0xffffffffffffffffL ) /* 18446744073709551615 */
+#else
+ #define IPP_MAX_64S ( 9223372036854775807LL )
+ #define IPP_MIN_64S (-9223372036854775807LL - 1 )
+ #define IPP_MAX_64U ( 0xffffffffffffffffLL ) /* 18446744073709551615 */
+#endif
+
+#define IPP_MINABS_32F ( 1.175494351e-38f )
+#define IPP_MAXABS_32F ( 3.402823466e+38f )
+#define IPP_EPS_32F ( 1.192092890e-07f )
+#define IPP_MINABS_64F ( 2.2250738585072014e-308 )
+#define IPP_MAXABS_64F ( 1.7976931348623158e+308 )
+#define IPP_EPS_64F ( 2.2204460492503131e-016 )
+
+#define IPP_MAX( a, b ) ( ((a) > (b)) ? (a) : (b) )
+#define IPP_MIN( a, b ) ( ((a) < (b)) ? (a) : (b) )
+
+#define IPP_ABS( a ) ( ((a) < 0) ? (-(a)) : (a) )
+
+typedef struct {
+ int major; /* e.g. 1 */
+ int minor; /* e.g. 2 */
+ int majorBuild; /* e.g. 3 */
+ int build; /* e.g. 10, always >= majorBuild */
+ char targetCpu[4]; /* corresponding to Intel(R) processor */
+ const char* Name; /* e.g. "ippsw7" */
+ const char* Version; /* e.g. "v1.2 Beta" */
+ const char* BuildDate; /* e.g. "Jul 20 99" */
+} IppLibraryVersion;
+
+typedef unsigned char Ipp8u;
+typedef unsigned short Ipp16u;
+typedef unsigned int Ipp32u;
+typedef signed char Ipp8s;
+typedef signed short Ipp16s;
+typedef signed int Ipp32s;
+typedef float Ipp32f;
+typedef IPP_INT64 Ipp64s;
+typedef IPP_UINT64 Ipp64u;
+typedef double Ipp64f;
+typedef Ipp16s Ipp16f;
+
+typedef struct {
+ Ipp8s re;
+ Ipp8s im;
+} Ipp8sc;
+
+typedef struct {
+ Ipp16s re;
+ Ipp16s im;
+} Ipp16sc;
+
+typedef struct {
+ Ipp16u re;
+ Ipp16u im;
+} Ipp16uc;
+
+typedef struct {
+ Ipp32s re;
+ Ipp32s im;
+} Ipp32sc;
+
+typedef struct {
+ Ipp32f re;
+ Ipp32f im;
+} Ipp32fc;
+
+typedef struct {
+ Ipp64s re;
+ Ipp64s im;
+} Ipp64sc;
+
+typedef struct {
+ Ipp64f re;
+ Ipp64f im;
+} Ipp64fc;
+
+typedef enum {
+ ippUndef = -1,
+ ipp1u = 0,
+ ipp8u = 1,
+ ipp8uc = 2,
+ ipp8s = 3,
+ ipp8sc = 4,
+ ipp16u = 5,
+ ipp16uc = 6,
+ ipp16s = 7,
+ ipp16sc = 8,
+ ipp32u = 9,
+ ipp32uc = 10,
+ ipp32s = 11,
+ ipp32sc = 12,
+ ipp32f = 13,
+ ipp32fc = 14,
+ ipp64u = 15,
+ ipp64uc = 16,
+ ipp64s = 17,
+ ipp64sc = 18,
+ ipp64f = 19,
+ ipp64fc = 20
+} IppDataType;
+
+typedef enum {
+ ippFalse = 0,
+ ippTrue = 1
+} IppBool;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPBASE_H__ */
+
diff --git a/ext/ipp/include/ippcp.h b/ext/ipp/include/ippcp.h
new file mode 100644
index 0000000..fe41815
--- /dev/null
+++ b/ext/ipp/include/ippcp.h
@@ -0,0 +1,1195 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Cryptographic Primitives (ippCP)
+//
+//
+*/
+
+#if !defined( IPPCP_H__ ) || defined( _OWN_BLDPCS )
+#define IPPCP_H__
+
+
+#ifndef IPPCPDEFS_H__
+ #include "ippcpdefs.h"
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined( IPP_NO_DEFAULT_LIB )
+ #if defined( _IPP_SEQUENTIAL_DYNAMIC )
+ #pragma comment( lib, __FILE__ "/../../lib/" INTEL_PLATFORM "ippcp" )
+ #elif defined( _IPP_SEQUENTIAL_STATIC )
+ #pragma comment( lib, __FILE__ "/../../lib/" INTEL_PLATFORM "ippcpmt" )
+ #elif defined( _IPP_PARALLEL_DYNAMIC )
+ #pragma comment( lib, __FILE__ "/../../lib/" INTEL_PLATFORM "threaded/ippcp" )
+ #elif defined( _IPP_PARALLEL_STATIC )
+ #pragma comment( lib, __FILE__ "/../../lib/" INTEL_PLATFORM "threaded/ippcpmt" )
+ #endif
+#endif
+
+
+/* /////////////////////////////////////////////////////////////////////////////
+// Name: ippcpGetLibVersion
+// Purpose: getting of the library version
+// Returns: the structure of information about version of ippCP library
+// Parameters:
+//
+// Notes: not necessary to release the returned structure
+*/
+IPPAPI( const IppLibraryVersion*, ippcpGetLibVersion, (void) )
+
+
+/*
+// =========================================================
+// Symmetric Ciphers
+// =========================================================
+*/
+
+/* TDES */
+IPPAPI(IppStatus, ippsDESGetSize,(int *size))
+IPPAPI(IppStatus, ippsDESInit,(const Ipp8u* pKey, IppsDESSpec* pCtx))
+
+IPPAPI(IppStatus, ippsDESPack,(const IppsDESSpec* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsDESUnpack,(const Ipp8u* pBuffer, IppsDESSpec* pCtx))
+
+IPPAPI(IppStatus, ippsTDESEncryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int length,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ IppsCPPadding padding))
+IPPAPI(IppStatus, ippsTDESDecryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int length,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ IppsCPPadding padding))
+
+IPPAPI(IppStatus, ippsTDESEncryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int length,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ const Ipp8u* pIV,
+ IppsCPPadding padding))
+IPPAPI(IppStatus, ippsTDESDecryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int length,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ const Ipp8u* pIV,
+ IppsCPPadding padding))
+
+IPPAPI(IppStatus, ippsTDESEncryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int length, int cfbBlkSize,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ const Ipp8u* pIV,
+ IppsCPPadding padding))
+IPPAPI(IppStatus, ippsTDESDecryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int length, int cfbBlkSize,
+ const IppsDESSpec* pCtx1, const IppsDESSpec* pCtx2, const IppsDESSpec* pCtx3,
+ const Ipp8u* pIV,
+ IppsCPPadding padding))
+
+IPPAPI(IppStatus, ippsTDESEncryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsDESSpec* pCtx1,
+ const IppsDESSpec* pCtx2,
+ const IppsDESSpec* pCtx3,
+ Ipp8u* pIV))
+IPPAPI(IppStatus, ippsTDESDecryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsDESSpec* pCtx1,
+ const IppsDESSpec* pCtx2,
+ const IppsDESSpec* pCtx3,
+ Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsTDESEncryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsDESSpec* pCtx1,
+ const IppsDESSpec* pCtx2,
+ const IppsDESSpec* pCtx3,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+IPPAPI(IppStatus, ippsTDESDecryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsDESSpec* pCtx1,
+ const IppsDESSpec* pCtx2,
+ const IppsDESSpec* pCtx3,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+
+/* AES */
+IPPAPI(IppStatus, ippsAESGetSize,(int *pSize))
+IPPAPI(IppStatus, ippsAESInit,(const Ipp8u* pKey, int keyLen, IppsAESSpec* pCtx, int ctxSize))
+IPPAPI(IppStatus, ippsAESSetKey,(const Ipp8u* pKey, int keyLen, IppsAESSpec* pCtx))
+
+IPPAPI(IppStatus, ippsAESPack,(const IppsAESSpec* pCtx, Ipp8u* pBuffer, int buffSize))
+IPPAPI(IppStatus, ippsAESUnpack,(const Ipp8u* pBuffer, IppsAESSpec* pCtx, int ctxSize))
+
+IPPAPI(IppStatus, ippsAESEncryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx))
+IPPAPI(IppStatus, ippsAESDecryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx))
+
+IPPAPI(IppStatus, ippsAESEncryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESEncryptCBC_CS1,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESEncryptCBC_CS2,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESEncryptCBC_CS3,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptCBC_CS1,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptCBC_CS2,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptCBC_CS3,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsAESEncryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize,
+ const IppsAESSpec* pCtx,
+ const Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsAESEncryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsAESSpec* pCtx,
+ Ipp8u* pIV))
+IPPAPI(IppStatus, ippsAESDecryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsAESSpec* pCtx,
+ Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsAESEncryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+IPPAPI(IppStatus, ippsAESDecryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsAESSpec* pCtx,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+
+IPPAPI(IppStatus, ippsAESEncryptXTS_Direct,(const Ipp8u* pSrc, Ipp8u* pDst, int encBitsize, int aesBlkNo,
+ const Ipp8u* pTweakPT,
+ const Ipp8u* pKey, int keyBitsize,
+ int dataUnitBitsize))
+IPPAPI(IppStatus, ippsAESDecryptXTS_Direct,(const Ipp8u* pSrc, Ipp8u* pDst, int encBitsize, int aesBlkNo,
+ const Ipp8u* pTweakPT,
+ const Ipp8u* pKey, int keyBitsize,
+ int dataUnitBitsize))
+
+
+/* SMS4 */
+IPPAPI(IppStatus, ippsSMS4GetSize,(int *pSize))
+IPPAPI(IppStatus, ippsSMS4Init,(const Ipp8u* pKey, int keyLen, IppsSMS4Spec* pCtx, int ctxSize))
+IPPAPI(IppStatus, ippsSMS4SetKey,(const Ipp8u* pKey, int keyLen, IppsSMS4Spec* pCtx))
+
+IPPAPI(IppStatus, ippsSMS4EncryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx))
+IPPAPI(IppStatus, ippsSMS4DecryptECB,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx))
+
+IPPAPI(IppStatus, ippsSMS4EncryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4EncryptCBC_CS1,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4EncryptCBC_CS2,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4EncryptCBC_CS3,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptCBC,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptCBC_CS1,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptCBC_CS2,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptCBC_CS3,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsSMS4EncryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptCFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize,
+ const IppsSMS4Spec* pCtx,
+ const Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsSMS4EncryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsSMS4Spec* pCtx,
+ Ipp8u* pIV))
+IPPAPI(IppStatus, ippsSMS4DecryptOFB,(const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize,
+ const IppsSMS4Spec* pCtx,
+ Ipp8u* pIV))
+
+IPPAPI(IppStatus, ippsSMS4EncryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+IPPAPI(IppStatus, ippsSMS4DecryptCTR,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ const IppsSMS4Spec* pCtx,
+ Ipp8u* pCtrValue, int ctrNumBitSize))
+
+/* SMS4-CCM */
+IPPAPI(IppStatus, ippsSMS4_CCMGetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSMS4_CCMInit,(const Ipp8u* pKey, int keyLen, IppsSMS4_CCMState* pCtx, int ctxSize))
+
+IPPAPI(IppStatus, ippsSMS4_CCMMessageLen,(Ipp64u msgLen, IppsSMS4_CCMState* pCtx))
+IPPAPI(IppStatus, ippsSMS4_CCMTagLen,(int tagLen, IppsSMS4_CCMState* pCtx))
+
+IPPAPI(IppStatus, ippsSMS4_CCMStart,(const Ipp8u* pIV, int ivLen, const Ipp8u* pAD, int adLen, IppsSMS4_CCMState* pCtx))
+IPPAPI(IppStatus, ippsSMS4_CCMEncrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsSMS4_CCMState* pCtx))
+IPPAPI(IppStatus, ippsSMS4_CCMDecrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsSMS4_CCMState* pCtx))
+IPPAPI(IppStatus, ippsSMS4_CCMGetTag,(Ipp8u* pTag, int tagLen, const IppsSMS4_CCMState* pCtx))
+
+/*
+// =========================================================
+// AES based authentication & confidence Primitives
+// =========================================================
+*/
+
+/* AES-CCM */
+IPPAPI(IppStatus, ippsAES_CCMGetSize,(int* pSize))
+IPPAPI(IppStatus, ippsAES_CCMInit,(const Ipp8u* pKey, int keyLen, IppsAES_CCMState* pCtx, int ctxSize))
+
+IPPAPI(IppStatus, ippsAES_CCMMessageLen,(Ipp64u msgLen, IppsAES_CCMState* pCtx))
+IPPAPI(IppStatus, ippsAES_CCMTagLen,(int tagLen, IppsAES_CCMState* pCtx))
+
+IPPAPI(IppStatus, ippsAES_CCMStart,(const Ipp8u* pIV, int ivLen, const Ipp8u* pAD, int adLen, IppsAES_CCMState* pCtx))
+IPPAPI(IppStatus, ippsAES_CCMEncrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsAES_CCMState* pCtx))
+IPPAPI(IppStatus, ippsAES_CCMDecrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsAES_CCMState* pCtx))
+IPPAPI(IppStatus, ippsAES_CCMGetTag,(Ipp8u* pTag, int tagLen, const IppsAES_CCMState* pCtx))
+
+/* AES-GCM */
+IPPAPI(IppStatus, ippsAES_GCMGetSize,(int * pSize))
+IPPAPI(IppStatus, ippsAES_GCMInit,(const Ipp8u* pKey, int keyLen, IppsAES_GCMState* pState, int ctxSize))
+
+IPPAPI(IppStatus, ippsAES_GCMReset,(IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMProcessIV,(const Ipp8u* pIV, int ivLen,
+ IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMProcessAAD,(const Ipp8u* pAAD, int ivAAD,
+ IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMStart,(const Ipp8u* pIV, int ivLen,
+ const Ipp8u* pAAD, int aadLen,
+ IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMEncrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMDecrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len, IppsAES_GCMState* pState))
+IPPAPI(IppStatus, ippsAES_GCMGetTag,(Ipp8u* pDstTag, int tagLen, const IppsAES_GCMState* pState))
+
+/* AES-XTS */
+IPPAPI(IppStatus, ippsAES_XTSGetSize,(int * pSize))
+IPPAPI(IppStatus, ippsAES_XTSInit,(const Ipp8u* pKey, int keyLen,
+ int duBitsize,
+ IppsAES_XTSSpec* pCtx,int ctxSize))
+IPPAPI(IppStatus, ippsAES_XTSEncrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int bitSizeLen,
+ const IppsAES_XTSSpec* pCtx,
+ const Ipp8u* pTweak,
+ int startCipherBlkNo))
+IPPAPI(IppStatus, ippsAES_XTSDecrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int bitSizeLen,
+ const IppsAES_XTSSpec* pCtx,
+ const Ipp8u* pTweak,
+ int startCipherBlkNo))
+
+/* AES-SIV (RFC 5297) */
+IPPAPI(IppStatus, ippsAES_S2V_CMAC,(const Ipp8u* pKey, int keyLen,
+ const Ipp8u* pAD[], const int pADlen[], int numAD,
+ Ipp8u* pV))
+IPPAPI(IppStatus, ippsAES_SIVEncrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ Ipp8u* pSIV,
+ const Ipp8u* pAuthKey, const Ipp8u* pConfKey, int keyLen,
+ const Ipp8u* pAD[], const int pADlen[], int numAD))
+IPPAPI(IppStatus, ippsAES_SIVDecrypt,(const Ipp8u* pSrc, Ipp8u* pDst, int len,
+ int* pAuthPassed,
+ const Ipp8u* pAuthKey, const Ipp8u* pConfKey, int keyLen,
+ const Ipp8u* pAD[], const int pADlen[], int numAD,
+ const Ipp8u* pSIV))
+
+/* AES-CMAC */
+IPPAPI(IppStatus, ippsAES_CMACGetSize,(int* pSize))
+IPPAPI(IppStatus, ippsAES_CMACInit,(const Ipp8u* pKey, int keyLen, IppsAES_CMACState* pState, int ctxSize))
+
+IPPAPI(IppStatus, ippsAES_CMACUpdate,(const Ipp8u* pSrc, int len, IppsAES_CMACState* pState))
+IPPAPI(IppStatus, ippsAES_CMACFinal,(Ipp8u* pMD, int mdLen, IppsAES_CMACState* pState))
+IPPAPI(IppStatus, ippsAES_CMACGetTag,(Ipp8u* pMD, int mdLen, const IppsAES_CMACState* pState))
+
+
+/*
+// =========================================================
+// RC4 Stream Ciphers
+// =========================================================
+*/
+IPPAPI(IppStatus, ippsARCFourCheckKey, (const Ipp8u *pKey, int keyLen, IppBool* pIsWeak))
+
+IPPAPI(IppStatus, ippsARCFourGetSize, (int* pSize))
+IPPAPI(IppStatus, ippsARCFourInit, (const Ipp8u *pKey, int keyLen, IppsARCFourState *pCtx))
+IPPAPI(IppStatus, ippsARCFourReset, (IppsARCFourState* pCtx))
+
+IPPAPI(IppStatus, ippsARCFourPack,(const IppsARCFourState* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsARCFourUnpack,(const Ipp8u* pBuffer, IppsARCFourState* pCtx))
+
+IPPAPI(IppStatus, ippsARCFourEncrypt, (const Ipp8u *pSrc, Ipp8u *pDst, int length, IppsARCFourState *pCtx))
+IPPAPI(IppStatus, ippsARCFourDecrypt, (const Ipp8u *pSrc, Ipp8u *pDst, int length, IppsARCFourState *pCtx))
+
+
+/*
+// =========================================================
+// One-Way Hash Functions
+// =========================================================
+*/
+
+/* SHA1 Hash Primitives */
+IPPAPI(IppStatus, ippsSHA1GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSHA1Init,(IppsSHA1State* pCtx))
+IPPAPI(IppStatus, ippsSHA1Duplicate,(const IppsSHA1State* pSrcCtx, IppsSHA1State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSHA1Pack,(const IppsSHA1State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSHA1Unpack,(const Ipp8u* pBuffer, IppsSHA1State* pCtx))
+
+IPPAPI(IppStatus, ippsSHA1Update,(const Ipp8u* pSrc, int len, IppsSHA1State* pCtx))
+IPPAPI(IppStatus, ippsSHA1GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA1State* pCtx))
+IPPAPI(IppStatus, ippsSHA1Final,(Ipp8u* pMD, IppsSHA1State* pCtx))
+IPPAPI(IppStatus, ippsSHA1MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* SHA224 Hash Primitives */
+IPPAPI(IppStatus, ippsSHA224GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSHA224Init,(IppsSHA224State* pCtx))
+IPPAPI(IppStatus, ippsSHA224Duplicate,(const IppsSHA224State* pSrcCtx, IppsSHA224State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSHA224Pack,(const IppsSHA224State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSHA224Unpack,(const Ipp8u* pBuffer, IppsSHA224State* pCtx))
+
+IPPAPI(IppStatus, ippsSHA224Update,(const Ipp8u* pSrc, int len, IppsSHA224State* pCtx))
+IPPAPI(IppStatus, ippsSHA224GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA224State* pCtx))
+IPPAPI(IppStatus, ippsSHA224Final,(Ipp8u* pMD, IppsSHA224State* pCtx))
+IPPAPI(IppStatus, ippsSHA224MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* SHA256 Hash Primitives */
+IPPAPI(IppStatus, ippsSHA256GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSHA256Init,(IppsSHA256State* pCtx))
+IPPAPI(IppStatus, ippsSHA256Duplicate,(const IppsSHA256State* pSrcCtx, IppsSHA256State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSHA256Pack,(const IppsSHA256State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSHA256Unpack,(const Ipp8u* pBuffer, IppsSHA256State* pCtx))
+
+IPPAPI(IppStatus, ippsSHA256Update,(const Ipp8u* pSrc, int len, IppsSHA256State* pCtx))
+IPPAPI(IppStatus, ippsSHA256GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA256State* pCtx))
+IPPAPI(IppStatus, ippsSHA256Final,(Ipp8u* pMD, IppsSHA256State* pCtx))
+IPPAPI(IppStatus, ippsSHA256MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* SHA384 Hash Primitives */
+IPPAPI(IppStatus, ippsSHA384GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSHA384Init,(IppsSHA384State* pCtx))
+IPPAPI(IppStatus, ippsSHA384Duplicate,(const IppsSHA384State* pSrcCtx, IppsSHA384State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSHA384Pack,(const IppsSHA384State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSHA384Unpack,(const Ipp8u* pBuffer, IppsSHA384State* pCtx))
+
+IPPAPI(IppStatus, ippsSHA384Update,(const Ipp8u* pSrc, int len, IppsSHA384State* pCtx))
+IPPAPI(IppStatus, ippsSHA384GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA384State* pCtx))
+IPPAPI(IppStatus, ippsSHA384Final,(Ipp8u* pMD, IppsSHA384State* pCtx))
+IPPAPI(IppStatus, ippsSHA384MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* SHA512 Hash Primitives */
+IPPAPI(IppStatus, ippsSHA512GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSHA512Init,(IppsSHA512State* pCtx))
+IPPAPI(IppStatus, ippsSHA512Duplicate,(const IppsSHA512State* pSrcCtx, IppsSHA512State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSHA512Pack,(const IppsSHA512State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSHA512Unpack,(const Ipp8u* pBuffer, IppsSHA512State* pCtx))
+
+IPPAPI(IppStatus, ippsSHA512Update,(const Ipp8u* pSrc, int len, IppsSHA512State* pCtx))
+IPPAPI(IppStatus, ippsSHA512GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA512State* pCtx))
+IPPAPI(IppStatus, ippsSHA512Final,(Ipp8u* pMD, IppsSHA512State* pCtx))
+IPPAPI(IppStatus, ippsSHA512MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* MD5 Hash Primitives */
+IPPAPI(IppStatus, ippsMD5GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsMD5Init,(IppsMD5State* pCtx))
+IPPAPI(IppStatus, ippsMD5Duplicate,(const IppsMD5State* pSrcCtx, IppsMD5State* pDstCtx))
+
+IPPAPI(IppStatus, ippsMD5Pack,(const IppsMD5State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsMD5Unpack,(const Ipp8u* pBuffer, IppsMD5State* pCtx))
+
+IPPAPI(IppStatus, ippsMD5Update,(const Ipp8u* pSrc, int len, IppsMD5State* pCtx))
+IPPAPI(IppStatus, ippsMD5GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsMD5State* pCtx))
+IPPAPI(IppStatus, ippsMD5Final,(Ipp8u* pMD, IppsMD5State* pCtx))
+IPPAPI(IppStatus, ippsMD5MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* SM3 Hash Primitives */
+IPPAPI(IppStatus, ippsSM3GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsSM3Init,(IppsSM3State* pCtx))
+IPPAPI(IppStatus, ippsSM3Duplicate,(const IppsSM3State* pSrcCtx, IppsSM3State* pDstCtx))
+
+IPPAPI(IppStatus, ippsSM3Pack,(const IppsSM3State* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsSM3Unpack,(const Ipp8u* pBuffer, IppsSM3State* pCtx))
+
+IPPAPI(IppStatus, ippsSM3Update,(const Ipp8u* pSrc, int len, IppsSM3State* pCtx))
+IPPAPI(IppStatus, ippsSM3GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSM3State* pCtx))
+IPPAPI(IppStatus, ippsSM3Final,(Ipp8u* pMD, IppsSM3State* pCtx))
+IPPAPI(IppStatus, ippsSM3MessageDigest,(const Ipp8u* pMsg, int len, Ipp8u* pMD))
+
+/* generalized Hash Primitives */
+IPPAPI(IppStatus, ippsHashGetSize,(int* pSize))
+IPPAPI(IppStatus, ippsHashInit,(IppsHashState* pCtx, IppHashAlgId hashAlg))
+
+IPPAPI(IppStatus, ippsHashPack,(const IppsHashState* pCtx, Ipp8u* pBuffer, int bufSize))
+IPPAPI(IppStatus, ippsHashUnpack,(const Ipp8u* pBuffer, IppsHashState* pCtx))
+IPPAPI(IppStatus, ippsHashDuplicate,(const IppsHashState* pSrcCtx, IppsHashState* pDstCtx))
+
+IPPAPI(IppStatus, ippsHashUpdate,(const Ipp8u* pSrc, int len, IppsHashState* pCtx))
+IPPAPI(IppStatus, ippsHashGetTag,(Ipp8u* pMD, int tagLen, const IppsHashState* pCtx))
+IPPAPI(IppStatus, ippsHashFinal,(Ipp8u* pMD, IppsHashState* pCtx))
+IPPAPI(IppStatus, ippsHashMessage,(const Ipp8u* pMsg, int len, Ipp8u* pMD, IppHashAlgId hashAlg))
+
+/* method based generalized (reduced memory footprint) Hash Primitives */
+IPPAPI( const IppsHashMethod*, ippsHashMethod_MD5, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SM3, (void) )
+
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA1, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA1_NI, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA1_TT, (void) )
+
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA256, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA256_NI, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA256_TT, (void) )
+
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA224, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA224_NI, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA224_TT, (void) )
+
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA512, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA384, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA512_256, (void) )
+IPPAPI( const IppsHashMethod*, ippsHashMethod_SHA512_224, (void) )
+
+IPPAPI(IppStatus, ippsHashGetSize_rmf,(int* pSize))
+IPPAPI(IppStatus, ippsHashInit_rmf,(IppsHashState_rmf* pCtx, const IppsHashMethod* pMethod))
+
+IPPAPI(IppStatus, ippsHashPack_rmf,(const IppsHashState_rmf* pCtx, Ipp8u* pBuffer, int bufSize))
+IPPAPI(IppStatus, ippsHashUnpack_rmf,(const Ipp8u* pBuffer, IppsHashState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHashDuplicate_rmf,(const IppsHashState_rmf* pSrcCtx, IppsHashState_rmf* pDstCtx))
+
+IPPAPI(IppStatus, ippsHashUpdate_rmf,(const Ipp8u* pSrc, int len, IppsHashState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHashGetTag_rmf,(Ipp8u* pMD, int tagLen, const IppsHashState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHashFinal_rmf,(Ipp8u* pMD, IppsHashState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHashMessage_rmf,(const Ipp8u* pMsg, int len, Ipp8u* pMD, const IppsHashMethod* pMethod))
+
+/* general MGF Primitives*/
+IPPAPI(IppStatus, ippsMGF,(const Ipp8u* pSeed, int seedLen, Ipp8u* pMask, int maskLen, IppHashAlgId hashAlg))
+IPPAPI(IppStatus, ippsMGF1_rmf,(const Ipp8u* pSeed, int seedLen, Ipp8u* pMask, int maskLen, const IppsHashMethod* pMethod))
+IPPAPI(IppStatus, ippsMGF2_rmf,(const Ipp8u* pSeed, int seedLen, Ipp8u* pMask, int maskLen, const IppsHashMethod* pMethod))
+
+
+/*
+// =========================================================
+// Keyed-Hash Message Authentication Codes
+// =========================================================
+*/
+
+/* generalized Keyed HMAC primitives */
+IPPAPI(IppStatus, ippsHMAC_GetSize,(int* pSize))
+IPPAPI(IppStatus, ippsHMAC_Init,(const Ipp8u* pKey, int keyLen, IppsHMACState* pCtx, IppHashAlgId hashAlg))
+
+IPPAPI(IppStatus, ippsHMAC_Pack,(const IppsHMACState* pCtx, Ipp8u* pBuffer, int bufSize))
+IPPAPI(IppStatus, ippsHMAC_Unpack,(const Ipp8u* pBuffer, IppsHMACState* pCtx))
+IPPAPI(IppStatus, ippsHMAC_Duplicate,(const IppsHMACState* pSrcCtx, IppsHMACState* pDstCtx))
+
+IPPAPI(IppStatus, ippsHMAC_Update,(const Ipp8u* pSrc, int len, IppsHMACState* pCtx))
+IPPAPI(IppStatus, ippsHMAC_Final,(Ipp8u* pMD, int mdLen, IppsHMACState* pCtx))
+IPPAPI(IppStatus, ippsHMAC_GetTag,(Ipp8u* pMD, int mdLen, const IppsHMACState* pCtx))
+IPPAPI(IppStatus, ippsHMAC_Message,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pKey, int keyLen,
+ Ipp8u* pMD, int mdLen,
+ IppHashAlgId hashAlg))
+
+/* method based generalized (reduced memory footprint) Keyed HMAC primitives */
+IPPAPI(IppStatus, ippsHMACGetSize_rmf,(int* pSize))
+IPPAPI(IppStatus, ippsHMACInit_rmf,(const Ipp8u* pKey, int keyLen,
+ IppsHMACState_rmf* pCtx,
+ const IppsHashMethod* pMethod))
+
+IPPAPI(IppStatus, ippsHMACPack_rmf,(const IppsHMACState_rmf* pCtx, Ipp8u* pBuffer, int bufSize))
+IPPAPI(IppStatus, ippsHMACUnpack_rmf,(const Ipp8u* pBuffer, IppsHMACState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHMACDuplicate_rmf,(const IppsHMACState_rmf* pSrcCtx, IppsHMACState_rmf* pDstCtx))
+
+IPPAPI(IppStatus, ippsHMACUpdate_rmf,(const Ipp8u* pSrc, int len, IppsHMACState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHMACFinal_rmf,(Ipp8u* pMD, int mdLen, IppsHMACState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHMACGetTag_rmf,(Ipp8u* pMD, int mdLen, const IppsHMACState_rmf* pCtx))
+IPPAPI(IppStatus, ippsHMACMessage_rmf,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pKey, int keyLen,
+ Ipp8u* pMD, int mdLen,
+ const IppsHashMethod* pMethod))
+
+
+/*
+// =========================================================
+// Big Number Integer Arithmetic
+// =========================================================
+*/
+
+/* Signed BigNum Operations */
+IPPAPI(IppStatus, ippsBigNumGetSize,(int length, int* pSize))
+IPPAPI(IppStatus, ippsBigNumInit,(int length, IppsBigNumState* pBN))
+
+IPPAPI(IppStatus, ippsCmpZero_BN,(const IppsBigNumState* pBN, Ipp32u* pResult))
+IPPAPI(IppStatus, ippsCmp_BN,(const IppsBigNumState* pA, const IppsBigNumState* pB, Ipp32u* pResult))
+
+IPPAPI(IppStatus, ippsGetSize_BN,(const IppsBigNumState* pBN, int* pSize))
+IPPAPI(IppStatus, ippsSet_BN,(IppsBigNumSGN sgn,
+ int length, const Ipp32u* pData,
+ IppsBigNumState* pBN))
+IPPAPI(IppStatus, ippsGet_BN,(IppsBigNumSGN* pSgn,
+ int* pLength, Ipp32u* pData,
+ const IppsBigNumState* pBN))
+IPPAPI(IppStatus, ippsRef_BN,(IppsBigNumSGN* pSgn, int* bitSize, Ipp32u** const ppData,
+ const IppsBigNumState* pBN))
+IPPAPI(IppStatus, ippsExtGet_BN,(IppsBigNumSGN* pSgn,
+ int* pBitSize, Ipp32u* pData,
+ const IppsBigNumState* pBN))
+
+IPPAPI(IppStatus, ippsAdd_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsSub_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsMul_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsMAC_BN_I, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsDiv_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pQ, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsMod_BN, (IppsBigNumState* pA, IppsBigNumState* pM, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsGcd_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pGCD))
+IPPAPI(IppStatus, ippsModInv_BN,(IppsBigNumState* pA, IppsBigNumState* pM, IppsBigNumState* pInv))
+
+IPPAPI(IppStatus, ippsSetOctString_BN,(const Ipp8u* pStr, int strLen, IppsBigNumState* pBN))
+IPPAPI(IppStatus, ippsGetOctString_BN,(Ipp8u* pStr, int strLen, const IppsBigNumState* pBN))
+
+/* Montgomery Operations */
+IPPAPI(IppStatus, ippsMontGetSize,(IppsExpMethod method, int length, int* pSize))
+IPPAPI(IppStatus, ippsMontInit,(IppsExpMethod method, int length, IppsMontState* pCtx))
+
+IPPAPI(IppStatus, ippsMontSet,(const Ipp32u* pModulo, int size, IppsMontState* pCtx))
+IPPAPI(IppStatus, ippsMontGet,(Ipp32u* pModulo, int* pSize, const IppsMontState* pCtx))
+
+IPPAPI(IppStatus, ippsMontForm,(const IppsBigNumState* pA, IppsMontState* pCtx, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsMontMul, (const IppsBigNumState* pA, const IppsBigNumState* pB, IppsMontState* m, IppsBigNumState* pR))
+IPPAPI(IppStatus, ippsMontExp, (const IppsBigNumState* pA, const IppsBigNumState* pE, IppsMontState* m, IppsBigNumState* pR))
+
+/* Pseudo-Random Number Generation */
+IPPAPI(IppStatus, ippsPRNGGetSize,(int* pSize))
+IPPAPI(IppStatus, ippsPRNGInit, (int seedBits, IppsPRNGState* pCtx))
+
+IPPAPI(IppStatus, ippsPRNGSetModulus,(const IppsBigNumState* pMod, IppsPRNGState* pCtx))
+IPPAPI(IppStatus, ippsPRNGSetH0, (const IppsBigNumState* pH0, IppsPRNGState* pCtx))
+IPPAPI(IppStatus, ippsPRNGSetAugment,(const IppsBigNumState* pAug, IppsPRNGState* pCtx))
+IPPAPI(IppStatus, ippsPRNGSetSeed, (const IppsBigNumState* pSeed,IppsPRNGState* pCtx))
+IPPAPI(IppStatus, ippsPRNGGetSeed, (const IppsPRNGState* pCtx,IppsBigNumState* pSeed))
+
+IPPAPI(IppStatus, ippsPRNGen, (Ipp32u* pRand, int nBits, void* pCtx))
+IPPAPI(IppStatus, ippsPRNGen_BN, (IppsBigNumState* pRand, int nBits, void* pCtx))
+IPPAPI(IppStatus, ippsPRNGenRDRAND, (Ipp32u* pRand, int nBits, void* pCtx))
+IPPAPI(IppStatus, ippsPRNGenRDRAND_BN,(IppsBigNumState* pRand, int nBits, void* pCtx))
+IPPAPI(IppStatus, ippsTRNGenRDSEED, (Ipp32u* pRand, int nBits, void* pCtx))
+IPPAPI(IppStatus, ippsTRNGenRDSEED_BN,(IppsBigNumState* pRand, int nBits, void* pCtx))
+
+/* Probable Prime Number Generation */
+IPPAPI(IppStatus, ippsPrimeGetSize,(int nMaxBits, int* pSize))
+IPPAPI(IppStatus, ippsPrimeInit, (int nMaxBits, IppsPrimeState* pCtx))
+
+IPPAPI(IppStatus, ippsPrimeGen, (int nBits, int nTrials, IppsPrimeState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsPrimeTest,(int nTrials, Ipp32u* pResult, IppsPrimeState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsPrimeGen_BN,(IppsBigNumState* pPrime, int nBits, int nTrials, IppsPrimeState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsPrimeTest_BN,(const IppsBigNumState* pPrime, int nTrials, Ipp32u* pResult, IppsPrimeState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+IPPAPI(IppStatus, ippsPrimeGet, (Ipp32u* pPrime, int* pLen, const IppsPrimeState* pCtx))
+IPPAPI(IppStatus, ippsPrimeGet_BN,(IppsBigNumState* pPrime, const IppsPrimeState* pCtx))
+
+IPPAPI(IppStatus, ippsPrimeSet, (const Ipp32u* pPrime, int nBits, IppsPrimeState* pCtx))
+IPPAPI(IppStatus, ippsPrimeSet_BN,(const IppsBigNumState* pPrime, IppsPrimeState* pCtx))
+
+
+/*
+// =========================================================
+// RSA Cryptography
+// =========================================================
+*/
+IPPAPI(IppStatus, ippsRSA_GetSizePublicKey,(int rsaModulusBitSize, int pubicExpBitSize, int* pKeySize))
+IPPAPI(IppStatus, ippsRSA_InitPublicKey,(int rsaModulusBitSize, int publicExpBitSize,
+ IppsRSAPublicKeyState* pKey, int keyCtxSize))
+IPPAPI(IppStatus, ippsRSA_SetPublicKey,(const IppsBigNumState* pModulus,
+ const IppsBigNumState* pPublicExp,
+ IppsRSAPublicKeyState* pKey))
+IPPAPI(IppStatus, ippsRSA_GetPublicKey,(IppsBigNumState* pModulus,
+ IppsBigNumState* pPublicExp,
+ const IppsRSAPublicKeyState* pKey))
+
+IPPAPI(IppStatus, ippsRSA_GetSizePrivateKeyType1,(int rsaModulusBitSize, int privateExpBitSize, int* pKeySize))
+IPPAPI(IppStatus, ippsRSA_InitPrivateKeyType1,(int rsaModulusBitSize, int privateExpBitSize,
+ IppsRSAPrivateKeyState* pKey, int keyCtxSize))
+IPPAPI(IppStatus, ippsRSA_SetPrivateKeyType1,(const IppsBigNumState* pModulus,
+ const IppsBigNumState* pPrivateExp,
+ IppsRSAPrivateKeyState* pKey))
+IPPAPI(IppStatus, ippsRSA_GetPrivateKeyType1,(IppsBigNumState* pModulus,
+ IppsBigNumState* pPrivateExp,
+ const IppsRSAPrivateKeyState* pKey))
+
+IPPAPI(IppStatus, ippsRSA_GetSizePrivateKeyType2,(int factorPbitSize, int factorQbitSize, int* pKeySize))
+IPPAPI(IppStatus, ippsRSA_InitPrivateKeyType2,(int factorPbitSize, int factorQbitSize,
+ IppsRSAPrivateKeyState* pKey, int keyCtxSize))
+IPPAPI(IppStatus, ippsRSA_SetPrivateKeyType2,(const IppsBigNumState* pFactorP,
+ const IppsBigNumState* pFactorQ,
+ const IppsBigNumState* pCrtExpP,
+ const IppsBigNumState* pCrtExpQ,
+ const IppsBigNumState* pInverseQ,
+ IppsRSAPrivateKeyState* pKey))
+IPPAPI(IppStatus, ippsRSA_GetPrivateKeyType2,(IppsBigNumState* pFactorP,
+ IppsBigNumState* pFactorQ,
+ IppsBigNumState* pCrtExpP,
+ IppsBigNumState* pCrtExpQ,
+ IppsBigNumState* pInverseQ,
+ const IppsRSAPrivateKeyState* pKey))
+
+IPPAPI(IppStatus, ippsRSA_GetBufferSizePublicKey,(int* pBufferSize, const IppsRSAPublicKeyState* pKey))
+IPPAPI(IppStatus, ippsRSA_GetBufferSizePrivateKey,(int* pBufferSize, const IppsRSAPrivateKeyState* pKey))
+
+IPPAPI(IppStatus, ippsRSA_Encrypt,(const IppsBigNumState* pPtxt,
+ IppsBigNumState* pCtxt,
+ const IppsRSAPublicKeyState* pKey,
+ Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsRSA_Decrypt,(const IppsBigNumState* pCtxt,
+ IppsBigNumState* pPtxt,
+ const IppsRSAPrivateKeyState* pKey,
+ Ipp8u* pScratchBuffer))
+
+IPPAPI(IppStatus, ippsRSA_GenerateKeys,(const IppsBigNumState* pSrcPublicExp,
+ IppsBigNumState* pModulus,
+ IppsBigNumState* pPublicExp,
+ IppsBigNumState* pPrivateExp,
+ IppsRSAPrivateKeyState* pPrivateKeyType2,
+ Ipp8u* pScratchBuffer,
+ int nTrials,
+ IppsPrimeState* pPrimeGen,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+IPPAPI(IppStatus, ippsRSA_ValidateKeys,(int* pResult,
+ const IppsRSAPublicKeyState* pPublicKey,
+ const IppsRSAPrivateKeyState* pPrivateKeyType2,
+ const IppsRSAPrivateKeyState* pPrivateKeyType1,
+ Ipp8u* pScratchBuffer,
+ int nTrials,
+ IppsPrimeState* pPrimeGen,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+/* encryption scheme: RSAES-OAEP */
+IPPAPI(IppStatus, ippsRSAEncrypt_OAEP,(const Ipp8u* pSrc, int srcLen,
+ const Ipp8u* pLabel, int labLen,
+ const Ipp8u* pSeed,
+ Ipp8u* pDst,
+ const IppsRSAPublicKeyState* pKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSADecrypt_OAEP,(const Ipp8u* pSrc,
+ const Ipp8u* pLab, int labLen,
+ Ipp8u* pDst, int* pDstLen,
+ const IppsRSAPrivateKeyState* pKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSAEncrypt_OAEP_rmf,(const Ipp8u* pSrc, int srcLen,
+ const Ipp8u* pLabel, int labLen,
+ const Ipp8u* pSeed,
+ Ipp8u* pDst,
+ const IppsRSAPublicKeyState* pKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSADecrypt_OAEP_rmf,(const Ipp8u* pSrc,
+ const Ipp8u* pLab, int labLen,
+ Ipp8u* pDst, int* pDstLen,
+ const IppsRSAPrivateKeyState* pKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+/* encryption scheme: RSAES-PKCS_v1_5 */
+IPPAPI(IppStatus, ippsRSAEncrypt_PKCSv15,(const Ipp8u* pSrc, int srcLen,
+ const Ipp8u* pRndPS,
+ Ipp8u* pDst,
+ const IppsRSAPublicKeyState* pKey,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSADecrypt_PKCSv15,(const Ipp8u* pSrc,
+ Ipp8u* pDst, int* pDstLen,
+ const IppsRSAPrivateKeyState* pKey,
+ Ipp8u* pBuffer))
+
+/* signature scheme : RSA-SSA-PSS */
+IPPAPI(IppStatus, ippsRSASign_PSS,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSalt, int saltLen,
+ Ipp8u* pSign,
+ const IppsRSAPrivateKeyState* pPrvKey,
+ const IppsRSAPublicKeyState* pPubKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSAVerify_PSS,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSign,
+ int* pIsValid,
+ const IppsRSAPublicKeyState* pKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSASign_PSS_rmf,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSalt, int saltLen,
+ Ipp8u* pSign,
+ const IppsRSAPrivateKeyState* pPrvKey,
+ const IppsRSAPublicKeyState* pPubKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSAVerify_PSS_rmf,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSign,
+ int* pIsValid,
+ const IppsRSAPublicKeyState* pKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+/* signature scheme : RSA-SSA-PKCS1-v1_5 */
+IPPAPI(IppStatus, ippsRSASign_PKCS1v15,(const Ipp8u* pMsg, int msgLen,
+ Ipp8u* pSign,
+ const IppsRSAPrivateKeyState* pPrvKey,
+ const IppsRSAPublicKeyState* pPubKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSAVerify_PKCS1v15,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSign, int* pIsValid,
+ const IppsRSAPublicKeyState* pKey,
+ IppHashAlgId hashAlg,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSASign_PKCS1v15_rmf,(const Ipp8u* pMsg, int msgLen,
+ Ipp8u* pSign,
+ const IppsRSAPrivateKeyState* pPrvKey,
+ const IppsRSAPublicKeyState* pPubKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+IPPAPI(IppStatus, ippsRSAVerify_PKCS1v15_rmf,(const Ipp8u* pMsg, int msgLen,
+ const Ipp8u* pSign, int* pIsValid,
+ const IppsRSAPublicKeyState* pKey,
+ const IppsHashMethod* pMethod,
+ Ipp8u* pBuffer))
+
+
+/*
+// =========================================================
+// DL Cryptography
+// =========================================================
+*/
+IPPAPI( const char*, ippsDLGetResultString, (IppDLResult code))
+
+/* Initialization */
+IPPAPI(IppStatus, ippsDLPGetSize,(int bitSizeP, int bitSizeR, int* pSize))
+IPPAPI(IppStatus, ippsDLPInit, (int bitSizeP, int bitSizeR, IppsDLPState* pCtx))
+
+IPPAPI(IppStatus, ippsDLPPack,(const IppsDLPState* pCtx, Ipp8u* pBuffer))
+IPPAPI(IppStatus, ippsDLPUnpack,(const Ipp8u* pBuffer, IppsDLPState* pCtx))
+
+/* Set Up and Retrieve Domain Parameters */
+IPPAPI(IppStatus, ippsDLPSet,(const IppsBigNumState* pP,
+ const IppsBigNumState* pR,
+ const IppsBigNumState* pG,
+ IppsDLPState* pCtx))
+IPPAPI(IppStatus, ippsDLPGet,(IppsBigNumState* pP,
+ IppsBigNumState* pR,
+ IppsBigNumState* pG,
+ IppsDLPState* pCtx))
+IPPAPI(IppStatus, ippsDLPSetDP,(const IppsBigNumState* pDP, IppDLPKeyTag tag, IppsDLPState* pCtx))
+IPPAPI(IppStatus, ippsDLPGetDP,(IppsBigNumState* pDP, IppDLPKeyTag tag, const IppsDLPState* pCtx))
+
+/* Key Generation, Validation and Set Up */
+IPPAPI(IppStatus, ippsDLPGenKeyPair,(IppsBigNumState* pPrvKey, IppsBigNumState* pPubKey,
+ IppsDLPState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsDLPPublicKey, (const IppsBigNumState* pPrvKey,
+ IppsBigNumState* pPubKey,
+ IppsDLPState* pCtx))
+IPPAPI(IppStatus, ippsDLPValidateKeyPair,(const IppsBigNumState* pPrvKey,
+ const IppsBigNumState* pPubKey,
+ IppDLResult* pResult,
+ IppsDLPState* pCtx))
+
+IPPAPI(IppStatus, ippsDLPSetKeyPair,(const IppsBigNumState* pPrvKey,
+ const IppsBigNumState* pPubKey,
+ IppsDLPState* pCtx))
+
+/* Singing/Verifying (DSA version) */
+IPPAPI(IppStatus, ippsDLPSignDSA, (const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pPrvKey,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsDLPState* pCtx))
+IPPAPI(IppStatus, ippsDLPVerifyDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppDLResult* pResult,
+ IppsDLPState* pCtx))
+
+/* Shared Secret Element (DH version) */
+IPPAPI(IppStatus, ippsDLPSharedSecretDH,(const IppsBigNumState* pPrvKeyA,
+ const IppsBigNumState* pPubKeyB,
+ IppsBigNumState* pShare,
+ IppsDLPState* pCtx))
+
+/* DSA's parameter Generation and Validation */
+IPPAPI(IppStatus, ippsDLPGenerateDSA,(const IppsBigNumState* pSeedIn,
+ int nTrials, IppsDLPState* pCtx,
+ IppsBigNumState* pSeedOut, int* pCounter,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsDLPValidateDSA,(int nTrials, IppDLResult* pResult, IppsDLPState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+/* DH parameter's Generation and Validation */
+IPPAPI(IppStatus, ippsDLPGenerateDH,(const IppsBigNumState* pSeedIn,
+ int nTrials, IppsDLPState* pCtx,
+ IppsBigNumState* pSeedOut, int* pCounter,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsDLPValidateDH,(int nTrials, IppDLResult* pResult, IppsDLPState* pCtx,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+
+/*
+// =========================================================
+// EC Cryptography
+// =========================================================
+*/
+IPPAPI( const char*, ippsECCGetResultString, (IppECResult code))
+
+/*
+// EC over Prime Fields
+*/
+/* general EC initialization */
+IPPAPI(IppStatus, ippsECCPGetSize,(int feBitSize, int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd128r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd128r2,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd192r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd224r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd256r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd384r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStd521r1,(int* pSize))
+IPPAPI(IppStatus, ippsECCPGetSizeStdSM2,(int* pSize))
+
+IPPAPI(IppStatus, ippsECCPInit,(int feBitSize, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd128r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd128r2,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd192r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd224r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd256r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd384r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStd521r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPInitStdSM2,(IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPSet,(const IppsBigNumState* pPrime,
+ const IppsBigNumState* pA, const IppsBigNumState* pB,
+ const IppsBigNumState* pGX,const IppsBigNumState* pGY,const IppsBigNumState* pOrder,
+ int cofactor,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd,(IppECCType flag, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd128r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd128r2,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd192r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd224r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd256r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd384r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStd521r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetStdSM2,(IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPBindGxyTblStd192r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPBindGxyTblStd224r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPBindGxyTblStd256r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPBindGxyTblStd384r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPBindGxyTblStd521r1,(IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPBindGxyTblStdSM2, (IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPGet,(IppsBigNumState* pPrime,
+ IppsBigNumState* pA, IppsBigNumState* pB,
+ IppsBigNumState* pGX,IppsBigNumState* pGY,IppsBigNumState* pOrder,
+ int* cofactor,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPGetOrderBitSize,(int* pBitSize, IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPValidate,(int nTrials, IppECResult* pResult, IppsECCPState* pECC,
+ IppBitSupplier rndFunc, void* pRndParam))
+
+/* EC Point */
+IPPAPI(IppStatus, ippsECCPPointGetSize,(int feBitSize, int* pSize))
+
+IPPAPI(IppStatus, ippsECCPPointInit,(int feBitSize, IppsECCPPointState* pPoint))
+
+/* Setup/retrieve point's coordinates */
+IPPAPI(IppStatus, ippsECCPSetPoint,(const IppsBigNumState* pX, const IppsBigNumState* pY,
+ IppsECCPPointState* pPoint, IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPSetPointAtInfinity,(IppsECCPPointState* pPoint, IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPGetPoint,(IppsBigNumState* pX, IppsBigNumState* pY,
+ const IppsECCPPointState* pPoint, IppsECCPState* pECC))
+
+/* EC Point Operations */
+IPPAPI(IppStatus, ippsECCPCheckPoint,(const IppsECCPPointState* pP,
+ IppECResult* pResult, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPComparePoint,(const IppsECCPPointState* pP, const IppsECCPPointState* pQ,
+ IppECResult* pResult, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPNegativePoint,(const IppsECCPPointState* pP,
+ IppsECCPPointState* pR, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPAddPoint,(const IppsECCPPointState* pP, const IppsECCPPointState* pQ,
+ IppsECCPPointState* pR, IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPMulPointScalar,(const IppsECCPPointState* pP, const IppsBigNumState* pK,
+ IppsECCPPointState* pR, IppsECCPState* pECC))
+
+/* Key Generation, Setup and Validation */
+IPPAPI(IppStatus, ippsECCPGenKeyPair,(IppsBigNumState* pPrivate, IppsECCPPointState* pPublic,
+ IppsECCPState* pECC,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsECCPPublicKey,(const IppsBigNumState* pPrivate,
+ IppsECCPPointState* pPublic,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPValidateKeyPair,(const IppsBigNumState* pPrivate, const IppsECCPPointState* pPublic,
+ IppECResult* pResult,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSetKeyPair,(const IppsBigNumState* pPrivate, const IppsECCPPointState* pPublic,
+ IppBool regular,
+ IppsECCPState* pECC))
+
+/* Shared Secret (DH scheme ) */
+IPPAPI(IppStatus, ippsECCPSharedSecretDH,(const IppsBigNumState* pPrivateA,
+ const IppsECCPPointState* pPublicB,
+ IppsBigNumState* pShare,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPSharedSecretDHC,(const IppsBigNumState* pPrivateA,
+ const IppsECCPPointState* pPublicB,
+ IppsBigNumState* pShare,
+ IppsECCPState* pECC))
+
+/* Sing/Verify */
+IPPAPI(IppStatus, ippsECCPSignDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pPrivate,
+ IppsBigNumState* pSignX, IppsBigNumState* pSignY,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPVerifyDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pSignX, const IppsBigNumState* pSignY,
+ IppECResult* pResult,
+ IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPSignNR,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pPrivate,
+ IppsBigNumState* pSignX, IppsBigNumState* pSignY,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPVerifyNR,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pSignX, const IppsBigNumState* pSignY,
+ IppECResult* pResult,
+ IppsECCPState* pECC))
+
+IPPAPI(IppStatus, ippsECCPSignSM2,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsECCPState* pECC))
+IPPAPI(IppStatus, ippsECCPVerifySM2,(const IppsBigNumState* pMsgDigest,
+ const IppsECCPPointState* pRegPublic,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppECResult* pResult,
+ IppsECCPState* pECC))
+
+/*
+// GF over prime and its extension
+*/
+IPPAPI(IppStatus, ippsGFpGetSize, (int bitSize, int* pStateSizeInBytes))
+IPPAPI(IppStatus, ippsGFpInitArbitrary,(const IppsBigNumState* pPrime, int primeBitSize, IppsGFpState* pGF))
+IPPAPI(IppStatus, ippsGFpInitFixed,(int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF))
+IPPAPI(IppStatus, ippsGFpInit, (const IppsBigNumState* pPrime, int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF))
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p192r1,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p224r1,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p256r1,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p384r1,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p521r1,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p256sm2,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p256bn, (void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_p256, (void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpMethod_pArb, (void) )
+
+IPPAPI(IppStatus, ippsGFpxGetSize,(const IppsGFpState* pGroundGF, int degree, int* pStateSizeInBytes))
+IPPAPI(IppStatus, ippsGFpxInit, (const IppsGFpState* pGroundGF, int extDeg, const IppsGFpElement* const ppGroundElm[], int ne, const IppsGFpMethod* method, IppsGFpState* pGFpx))
+IPPAPI(IppStatus, ippsGFpxInitBinomial,(const IppsGFpState* pGroundGF, int extDeg, const IppsGFpElement* pGroundElm, const IppsGFpMethod* method, IppsGFpState* pGFpx))
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_binom2_epid2,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_binom3_epid2,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_binom2,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_binom3,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_binom,(void) )
+IPPAPI( const IppsGFpMethod*, ippsGFpxMethod_com, (void) )
+
+IPPAPI(IppStatus, ippsGFpScratchBufferSize,(int nExponents, int ExpBitSize, const IppsGFpState* pGF, int* pBufferSize))
+
+IPPAPI(IppStatus, ippsGFpElementGetSize,(const IppsGFpState* pGFp, int* pElementSize))
+IPPAPI(IppStatus, ippsGFpElementInit, (const Ipp32u* pA, int lenA, IppsGFpElement* pR, IppsGFpState* pGFp))
+
+IPPAPI(IppStatus, ippsGFpSetElement, (const Ipp32u* pA, int nsA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSetElementRegular,(const IppsBigNumState* pBN, IppsGFpElement* pElm, IppsGFpState* pGF))
+IPPAPI(IppStatus, ippsGFpSetElementOctString,(const Ipp8u* pStr, int strSize, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSetElementRandom,(IppsGFpElement* pR, IppsGFpState* pGFp, IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsGFpSetElementHash,(const Ipp8u* pMsg, int msgLen, IppsGFpElement* pElm, IppsGFpState* pGF, IppHashAlgId hashID))
+IPPAPI(IppStatus, ippsGFpSetElementHash_rmf,(const Ipp8u* pMsg, int msgLen, IppsGFpElement* pElm, IppsGFpState* pGF, const IppsHashMethod* pMethod))
+IPPAPI(IppStatus, ippsGFpCpyElement,(const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpGetElement,(const IppsGFpElement* pA, Ipp32u* pDataA, int nsA, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpGetElementOctString,(const IppsGFpElement* pA, Ipp8u* pStr, int strSize, IppsGFpState* pGFp))
+
+IPPAPI(IppStatus, ippsGFpCmpElement,(const IppsGFpElement* pA, const IppsGFpElement* pB, int* pResult, const IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpIsZeroElement,(const IppsGFpElement* pA, int* pResult, const IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpIsUnityElement,(const IppsGFpElement* pA, int* pResult, const IppsGFpState* pGFp))
+
+IPPAPI(IppStatus, ippsGFpConj,(const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpNeg, (const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpInv, (const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSqrt,(const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSqr, (const IppsGFpElement* pA, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpAdd, (const IppsGFpElement* pA, const IppsGFpElement* pB, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSub, (const IppsGFpElement* pA, const IppsGFpElement* pB, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpMul, (const IppsGFpElement* pA, const IppsGFpElement* pB, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpExp, (const IppsGFpElement* pA, const IppsBigNumState* pE, IppsGFpElement* pR, IppsGFpState* pGFp, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpMultiExp,(const IppsGFpElement* const ppElmA[], const IppsBigNumState* const ppE[], int nItems, IppsGFpElement* pElmR, IppsGFpState* pGF, Ipp8u* pScratchBuffer))
+
+IPPAPI(IppStatus, ippsGFpAdd_PE,(const IppsGFpElement* pA, const IppsGFpElement* pParentB, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpSub_PE,(const IppsGFpElement* pA, const IppsGFpElement* pParentB, IppsGFpElement* pR, IppsGFpState* pGFp))
+IPPAPI(IppStatus, ippsGFpMul_PE,(const IppsGFpElement* pA, const IppsGFpElement* pParentB, IppsGFpElement* pR, IppsGFpState* pGFp))
+
+/* ================== */
+IPPAPI(IppStatus, ippsGFpECGetSize,(const IppsGFpState* pGF, int* pCtxSizeInBytes))
+IPPAPI(IppStatus, ippsGFpECInit, (const IppsGFpState* pGF,
+ const IppsGFpElement* pA, const IppsGFpElement* pB,
+ IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECSet,(const IppsGFpElement* pA, const IppsGFpElement* pB,
+ IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECSetSubgroup,(const IppsGFpElement* pX, const IppsGFpElement* pY,
+ const IppsBigNumState* pOrder,
+ const IppsBigNumState* pCofactor,
+ IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECInitStd128r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd128r2,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd192r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd224r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd256r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd384r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStd521r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStdSM2, (const IppsGFpState* pGF, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECInitStdBN256,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStd192r1,(IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStd224r1,(IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStd256r1,(IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStd384r1,(IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStd521r1,(IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECBindGxyTblStdSM2, (IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECGet,(IppsGFpState** const ppGF,
+ IppsGFpElement* pA, IppsGFpElement* pB,
+ const IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECGetSubgroup,(IppsGFpState** const ppGF,
+ IppsGFpElement* pX, IppsGFpElement* pY,
+ IppsBigNumState* pOrder,IppsBigNumState* pCofactor,
+ const IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECScratchBufferSize,(int nScalars, const IppsGFpECState* pEC, int* pBufferSize))
+
+IPPAPI(IppStatus, ippsGFpECVerify,(IppECResult* pResult, IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+IPPAPI(IppStatus, ippsGFpECPointGetSize,(const IppsGFpECState* pEC, int* pSizeInBytes))
+IPPAPI(IppStatus, ippsGFpECPointInit, (const IppsGFpElement* pX, const IppsGFpElement* pY, IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECSetPointAtInfinity,(IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECSetPoint,(const IppsGFpElement* pX, const IppsGFpElement* pY, IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECSetPointRegular,(const IppsBigNumState* pX, const IppsBigNumState* pY, IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECSetPointRandom,(IppsGFpECPoint* pPoint, IppsGFpECState* pEC, IppBitSupplier rndFunc, void* pRndParam, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECMakePoint,(const IppsGFpElement* pX, IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECSetPointHash,(Ipp32u hdr, const Ipp8u* pMsg, int msgLen, IppsGFpECPoint* pPoint, IppsGFpECState* pEC, IppHashAlgId hashID, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECSetPointHash_rmf,(Ipp32u hdr, const Ipp8u* pMsg, int msgLen, IppsGFpECPoint* pPoint, IppsGFpECState* pEC, const IppsHashMethod* pMethod, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECGetPoint,(const IppsGFpECPoint* pPoint, IppsGFpElement* pX, IppsGFpElement* pY, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECGetPointRegular,(const IppsGFpECPoint* pPoint, IppsBigNumState* pX, IppsBigNumState* pY, IppsGFpECState* pEC))
+
+IPPAPI(IppStatus, ippsGFpECTstPoint,(const IppsGFpECPoint* pP, IppECResult* pResult, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECTstPointInSubgroup,(const IppsGFpECPoint* pP, IppECResult* pResult, IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECCpyPoint,(const IppsGFpECPoint* pA, IppsGFpECPoint* pR, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECCmpPoint,(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppECResult* pResult, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECNegPoint,(const IppsGFpECPoint* pP, IppsGFpECPoint* pR, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECAddPoint,(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECPoint* pR, IppsGFpECState* pEC))
+IPPAPI(IppStatus, ippsGFpECMulPoint,(const IppsGFpECPoint* pP, const IppsBigNumState* pN, IppsGFpECPoint* pR, IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+/* keys */
+IPPAPI(IppStatus, ippsGFpECPrivateKey,(IppsBigNumState* pPrivate, IppsGFpECState* pEC,
+ IppBitSupplier rndFunc, void* pRndParam))
+IPPAPI(IppStatus, ippsGFpECPublicKey,(const IppsBigNumState* pPrivate, IppsGFpECPoint* pPublic,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECTstKeyPair,(const IppsBigNumState* pPrivate, const IppsGFpECPoint* pPublic, IppECResult* pResult,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+/* DH shared secret */
+IPPAPI(IppStatus, ippsGFpECSharedSecretDH,(const IppsBigNumState* pPrivateA, const IppsGFpECPoint* pPublicB,
+ IppsBigNumState* pShare,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECSharedSecretDHC,(const IppsBigNumState* pPrivateA,
+ const IppsGFpECPoint* pPublicB,
+ IppsBigNumState* pShare,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+/* sign generation/verification of DSA, NR, SM2 */
+IPPAPI(IppStatus, ippsGFpECSignDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECVerifyDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppECResult* pResult,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+IPPAPI(IppStatus, ippsGFpECSignNR,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECVerifyNR,(const IppsBigNumState* pMsgDigest,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppECResult* pResult,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+IPPAPI(IppStatus, ippsGFpECSignSM2,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+IPPAPI(IppStatus, ippsGFpECVerifySM2,(const IppsBigNumState* pMsgDigest,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppECResult* pResult,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* IPPCP_H__ */
diff --git a/ext/ipp/include/ippcpdefs.h b/ext/ipp/include/ippcpdefs.h
new file mode 100644
index 0000000..083c360
--- /dev/null
+++ b/ext/ipp/include/ippcpdefs.h
@@ -0,0 +1,777 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Cryptographic Primitives (ippCP) definitions.
+//
+//
+*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Basic Types and Macro Definitions
+//
+//
+*/
+
+
+#ifndef IPPBASE_H__
+#define IPPBASE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if defined (_WIN64)
+#define INTEL_PLATFORM "intel64/"
+#elif defined (_WIN32)
+#define INTEL_PLATFORM "ia32/"
+#endif
+
+#if !defined( IPPAPI )
+
+ #if defined( IPP_W32DLL ) && (defined( _WIN32 ) || defined( _WIN64 ))
+ #if defined( _MSC_VER ) || defined( __ICL )
+ #define IPPAPI( type,name,arg ) \
+ __declspec(dllimport) type IPP_STDCALL name arg;
+ #else
+ #define IPPAPI( type,name,arg ) type IPP_STDCALL name arg;
+ #endif
+ #else
+ #define IPPAPI( type,name,arg ) type IPP_STDCALL name arg;
+ #endif
+
+#endif
+
+#if (defined( __ICL ) || defined( __ECL ) || defined(_MSC_VER)) && !defined( _PCS ) && !defined( _PCS_GENSTUBS )
+ #if( __INTEL_COMPILER >= 1100 ) /* icl 11.0 supports additional comment */
+ #if( _MSC_VER >= 1400 )
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated ( comment ))
+ #else
+ #pragma message ("your icl version supports additional comment for deprecated functions but it can't be displayed")
+ #pragma message ("because internal _MSC_VER macro variable setting requires compatibility with MSVC7.1")
+ #pragma message ("use -Qvc8 switch for icl command line to see these additional comments")
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated )
+ #endif
+ #elif( _MSC_FULL_VER >= 140050727 )&&( !defined( __INTEL_COMPILER )) /* VS2005 supports additional comment */
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated ( comment ))
+ #elif( _MSC_VER <= 1200 )&&( !defined( __INTEL_COMPILER )) /* VS 6 doesn't support deprecation */
+ #define IPP_DEPRECATED( comment )
+ #else
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated )
+ #endif
+#elif (defined(__ICC) || defined(__ECC) || defined( __GNUC__ )) && !defined( _PCS ) && !defined( _PCS_GENSTUBS )
+ #if defined( __GNUC__ )
+ #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 5
+ #define IPP_DEPRECATED( message ) __attribute__(( deprecated( message )))
+ #else
+ #define IPP_DEPRECATED( message ) __attribute__(( deprecated ))
+ #endif
+ #else
+ #define IPP_DEPRECATED( comment ) __attribute__(( deprecated ))
+ #endif
+#else
+ #define IPP_DEPRECATED( comment )
+#endif
+
+#if (defined( __ICL ) || defined( __ECL ) || defined(_MSC_VER))
+ #if !defined( IPP_NO_DEFAULT_LIB )
+ #if (( defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && defined( _IPP_SEQUENTIAL_STATIC )))
+ #elif (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC ))
+ #define IPP_NO_DEFAULT_LIB
+ #else
+ #error Illegal combination of _IPP_PARALLEL_DYNAMIC/_IPP_PARALLEL_STATIC/_IPP_SEQUENTIAL_DYNAMIC/_IPP_SEQUENTIAL_STATIC, only one definition can be defined
+ #endif
+ #endif
+#else
+ #define IPP_NO_DEFAULT_LIB
+ #if (defined( _IPP_PARALLEL_DYNAMIC ) || defined( _IPP_PARALLEL_STATIC ) || defined(_IPP_SEQUENTIAL_DYNAMIC) || defined(_IPP_SEQUENTIAL_STATIC))
+ #pragma message ("defines _IPP_PARALLEL_DYNAMIC/_IPP_PARALLEL_STATIC/_IPP_SEQUENTIAL_DYNAMIC/_IPP_SEQUENTIAL_STATIC do not have any effect in current configuration")
+ #endif
+#endif
+
+#if !defined( IPP_NO_DEFAULT_LIB )
+ #if defined( _IPP_PARALLEL_STATIC )
+ #pragma comment( lib, "libiomp5md" )
+ #endif
+#endif
+
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define IPP_STDCALL __stdcall
+ #define IPP_CDECL __cdecl
+ #define IPP_INT64 __int64
+ #define IPP_UINT64 unsigned __int64
+#else
+ #define IPP_STDCALL
+ #define IPP_CDECL
+ #define IPP_INT64 long long
+ #define IPP_UINT64 unsigned long long
+#endif
+
+#define IPP_PI ( 3.14159265358979323846 ) /* ANSI C does not support M_PI */
+#define IPP_2PI ( 6.28318530717958647692 ) /* 2*pi */
+#define IPP_PI2 ( 1.57079632679489661923 ) /* pi/2 */
+#define IPP_PI4 ( 0.78539816339744830961 ) /* pi/4 */
+#define IPP_PI180 ( 0.01745329251994329577 ) /* pi/180 */
+#define IPP_RPI ( 0.31830988618379067154 ) /* 1/pi */
+#define IPP_SQRT2 ( 1.41421356237309504880 ) /* sqrt(2) */
+#define IPP_SQRT3 ( 1.73205080756887729353 ) /* sqrt(3) */
+#define IPP_LN2 ( 0.69314718055994530942 ) /* ln(2) */
+#define IPP_LN3 ( 1.09861228866810969139 ) /* ln(3) */
+#define IPP_E ( 2.71828182845904523536 ) /* e */
+#define IPP_RE ( 0.36787944117144232159 ) /* 1/e */
+#define IPP_EPS23 ( 1.19209289e-07f )
+#define IPP_EPS52 ( 2.2204460492503131e-016 )
+
+#define IPP_MAX_8U ( 0xFF )
+#define IPP_MAX_16U ( 0xFFFF )
+#define IPP_MAX_32U ( 0xFFFFFFFF )
+#define IPP_MIN_8U ( 0 )
+#define IPP_MIN_16U ( 0 )
+#define IPP_MIN_32U ( 0 )
+#define IPP_MIN_8S (-128 )
+#define IPP_MAX_8S ( 127 )
+#define IPP_MIN_16S (-32768 )
+#define IPP_MAX_16S ( 32767 )
+#define IPP_MIN_32S (-2147483647 - 1 )
+#define IPP_MAX_32S ( 2147483647 )
+#define IPP_MIN_64U ( 0 )
+
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define IPP_MAX_64S ( 9223372036854775807i64 )
+ #define IPP_MIN_64S (-9223372036854775807i64 - 1 )
+ #define IPP_MAX_64U ( 0xffffffffffffffffL ) /* 18446744073709551615 */
+#else
+ #define IPP_MAX_64S ( 9223372036854775807LL )
+ #define IPP_MIN_64S (-9223372036854775807LL - 1 )
+ #define IPP_MAX_64U ( 0xffffffffffffffffLL ) /* 18446744073709551615 */
+#endif
+
+#define IPP_MINABS_32F ( 1.175494351e-38f )
+#define IPP_MAXABS_32F ( 3.402823466e+38f )
+#define IPP_EPS_32F ( 1.192092890e-07f )
+#define IPP_MINABS_64F ( 2.2250738585072014e-308 )
+#define IPP_MAXABS_64F ( 1.7976931348623158e+308 )
+#define IPP_EPS_64F ( 2.2204460492503131e-016 )
+
+#define IPP_MAX( a, b ) ( ((a) > (b)) ? (a) : (b) )
+#define IPP_MIN( a, b ) ( ((a) < (b)) ? (a) : (b) )
+
+#define IPP_ABS( a ) ( ((a) < 0) ? (-(a)) : (a) )
+
+typedef struct {
+ int major; /* e.g. 1 */
+ int minor; /* e.g. 2 */
+ int majorBuild; /* e.g. 3 */
+ int build; /* e.g. 10, always >= majorBuild */
+ char targetCpu[4]; /* corresponding to Intel(R) processor */
+ const char* Name; /* e.g. "ippsw7" */
+ const char* Version; /* e.g. "v1.2 Beta" */
+ const char* BuildDate; /* e.g. "Jul 20 99" */
+} IppLibraryVersion;
+
+typedef unsigned char Ipp8u;
+typedef unsigned short Ipp16u;
+typedef unsigned int Ipp32u;
+typedef signed char Ipp8s;
+typedef signed short Ipp16s;
+typedef signed int Ipp32s;
+typedef float Ipp32f;
+typedef IPP_INT64 Ipp64s;
+typedef IPP_UINT64 Ipp64u;
+typedef double Ipp64f;
+typedef Ipp16s Ipp16f;
+
+typedef struct {
+ Ipp8s re;
+ Ipp8s im;
+} Ipp8sc;
+
+typedef struct {
+ Ipp16s re;
+ Ipp16s im;
+} Ipp16sc;
+
+typedef struct {
+ Ipp16u re;
+ Ipp16u im;
+} Ipp16uc;
+
+typedef struct {
+ Ipp32s re;
+ Ipp32s im;
+} Ipp32sc;
+
+typedef struct {
+ Ipp32f re;
+ Ipp32f im;
+} Ipp32fc;
+
+typedef struct {
+ Ipp64s re;
+ Ipp64s im;
+} Ipp64sc;
+
+typedef struct {
+ Ipp64f re;
+ Ipp64f im;
+} Ipp64fc;
+
+typedef enum {
+ ippUndef = -1,
+ ipp1u = 0,
+ ipp8u = 1,
+ ipp8uc = 2,
+ ipp8s = 3,
+ ipp8sc = 4,
+ ipp16u = 5,
+ ipp16uc = 6,
+ ipp16s = 7,
+ ipp16sc = 8,
+ ipp32u = 9,
+ ipp32uc = 10,
+ ipp32s = 11,
+ ipp32sc = 12,
+ ipp32f = 13,
+ ipp32fc = 14,
+ ipp64u = 15,
+ ipp64uc = 16,
+ ipp64s = 17,
+ ipp64sc = 18,
+ ipp64f = 19,
+ ipp64fc = 20
+} IppDataType;
+
+typedef enum {
+ ippFalse = 0,
+ ippTrue = 1
+} IppBool;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPBASE_H__ */
+
+#ifndef IPP_CPU_FEATURES__
+#define IPP_CPU_FEATURES__
+
+#define ippCPUID_MMX 0x00000001 /* Intel(R) Architecture MMX technology supported */
+#define ippCPUID_SSE 0x00000002 /* Intel(R) Streaming SIMD Extensions */
+#define ippCPUID_SSE2 0x00000004 /* Intel(R) Streaming SIMD Extensions 2 */
+#define ippCPUID_SSE3 0x00000008 /* Intel(R) Streaming SIMD Extensions 3 */
+#define ippCPUID_SSSE3 0x00000010 /* Supplemental Streaming SIMD Extensions 3 */
+#define ippCPUID_MOVBE 0x00000020 /* Intel(R) MOVBE instruction */
+#define ippCPUID_SSE41 0x00000040 /* Intel(R) Streaming SIMD Extensions 4.1 */
+#define ippCPUID_SSE42 0x00000080 /* Intel(R) Streaming SIMD Extensions 4.2 */
+#define ippCPUID_AVX 0x00000100 /* Intel(R) Advanced Vector Extensions instruction set */
+#define ippAVX_ENABLEDBYOS 0x00000200 /* Intel(R) Advanced Vector Extensions instruction set is supported by OS */
+#define ippCPUID_AES 0x00000400 /* Intel(R) AES New Instructions */
+#define ippCPUID_CLMUL 0x00000800 /* Intel(R) CLMUL instruction */
+#define ippCPUID_ABR 0x00001000 /* Reserved */
+#define ippCPUID_RDRAND 0x00002000 /* Intel(R) RDRAND instruction */
+#define ippCPUID_F16C 0x00004000 /* Intel(R) F16C new instructions */
+#define ippCPUID_AVX2 0x00008000 /* Intel(R) Advanced Vector Extensions 2 instruction set */
+#define ippCPUID_ADCOX 0x00010000 /* Intel(R) ADOX/ADCX new instructions */
+#define ippCPUID_RDSEED 0x00020000 /* Intel(R) RDSEED instruction */
+#define ippCPUID_PREFETCHW 0x00040000 /* Intel(R) PREFETCHW instruction */
+#define ippCPUID_SHA 0x00080000 /* Intel(R) SHA new instructions */
+#define ippCPUID_AVX512F 0x00100000 /* Intel(R) Advanced Vector Extensions 512 Foundation instruction set */
+#define ippCPUID_AVX512CD 0x00200000 /* Intel(R) Advanced Vector Extensions 512 CD instruction set */
+#define ippCPUID_AVX512ER 0x00400000 /* Intel(R) Advanced Vector Extensions 512 ER instruction set */
+#define ippCPUID_AVX512PF 0x00800000 /* Intel(R) Advanced Vector Extensions 512 PF instruction set */
+#define ippCPUID_AVX512BW 0x01000000 /* Intel(R) Advanced Vector Extensions 512 BW instruction set */
+#define ippCPUID_AVX512DQ 0x02000000 /* Intel(R) Advanced Vector Extensions 512 DQ instruction set */
+#define ippCPUID_AVX512VL 0x04000000 /* Intel(R) Advanced Vector Extensions 512 VL instruction set */
+#define ippCPUID_AVX512VBMI 0x08000000 /* Intel(R) Advanced Vector Extensions 512 Bit Manipulation instructions */
+#define ippCPUID_MPX 0x10000000 /* Intel(R) Memory Protection Extensions */
+#define ippCPUID_AVX512_4FMADDPS 0x20000000 /* Intel(R) Advanced Vector Extensions 512 DL floating-point single precision */
+#define ippCPUID_AVX512_4VNNIW 0x40000000 /* Intel(R) Advanced Vector Extensions 512 DL enhanced word variable precision */
+#define ippCPUID_KNC 0x80000000 /* Intel(R) Xeon Phi(TM) Coprocessor */
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define INT64_SUFFIX(name) name##L
+#else
+ #define INT64_SUFFIX(name) name##LL
+#endif
+ #define ippCPUID_AVX512IFMA INT64_SUFFIX(0x100000000) /* Intel(R) Advanced Vector Extensions 512 IFMA (PMADD52) instruction set */
+ #define ippCPUID_NOCHECK INT64_SUFFIX(0x8000000000000000) /* Force ippSetCpuFeatures to set CPU features without check */
+ #define ippCPUID_GETINFO_A INT64_SUFFIX(0x616f666e69746567) /* Force ippGetCpuFeatures to work as cpuid instruction */
+ #define ippAVX512_ENABLEDBYOS INT64_SUFFIX(0x200000000) /* Intel(R) Advanced Vector Extensions 512 is supported by OS */
+
+
+#endif /* IPP_CPU_FEATURES__ */
+
+
+#ifndef IPPSTATUS_H__
+#define IPPSTATUS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef signed int IppStatus;
+
+ /* start of common with ippCrypto part - any changes MUST be done in both repositories - IPP & ippCrypto */
+#define ippStsLoadDynErr -221 /* Error when loading the dynamic library. */
+#define ippStsLengthErr -15 /* Incorrect value for string length. */
+#define ippStsNotSupportedModeErr -14 /* The requested mode is currently not supported. */
+#define ippStsContextMatchErr -13 /* Context parameter does not match the operation. */
+#define ippStsScaleRangeErr -12 /* Scale bounds are out of range. */
+#define ippStsOutOfRangeErr -11 /* Argument is out of range, or point is outside the image. */
+#define ippStsDivByZeroErr -10 /* An attempt to divide by zero. */
+#define ippStsMemAllocErr -9 /* Memory allocated for the operation is not enough.*/
+#define ippStsNullPtrErr -8 /* Null pointer error. */
+#define ippStsRangeErr -7 /* Incorrect values for bounds: the lower bound is greater than the upper bound. */
+#define ippStsSizeErr -6 /* Incorrect value for data size. */
+#define ippStsBadArgErr -5 /* Incorrect arg/param of the function. */
+#define ippStsNoMemErr -4 /* Not enough memory for the operation. */
+#define ippStsErr -2 /* Unknown/unspecified error */
+ /* no errors */
+#define ippStsNoErr 0 /* No errors. */
+ /* warnings */
+#define ippStsNoOperation 1 /* No operation has been executed. */
+#define ippStsDivByZero 2 /* Zero value(s) for the divisor in the Div function. */
+#define ippStsWaterfall 43 /* Cannot load required library, waterfall is used. */
+ /* end of common with ippCrypto part */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPSTATUS_H__ */
+
+ /* ippCrypto specific statuses - any changes MUST be done in both repositories - IPP & ippCrypto */
+#define ippStsQuadraticNonResidueErr -1016 /* SQRT operation on quadratic non-residue value. */
+#define ippStsPointAtInfinity -1015 /* Point at infinity is detected. */
+#define ippStsOFBSizeErr -1014 /* Incorrect value for crypto OFB block size. */
+#define ippStsIncompleteContextErr -1013 /* Crypto: set up of context is not complete. */
+#define ippStsCTRSizeErr -1012 /* Incorrect value for crypto CTR block size. */
+#define ippStsEphemeralKeyErr -1011 /* ECC: Invalid ephemeral key. */
+#define ippStsMessageErr -1010 /* ECC: Invalid message digest. */
+#define ippStsShareKeyErr -1009 /* ECC: Invalid share key. */
+#define ippStsIvalidPrivateKey -1008 /* ECC: Invalid private key. */
+#define ippStsOutOfECErr -1007 /* ECC: Point out of EC. */
+#define ippStsECCInvalidFlagErr -1006 /* ECC: Invalid Flag. */
+#define ippStsUnderRunErr -1005 /* Error in data under run. */
+#define ippStsPaddingErr -1004 /* Detected padding error indicates the possible data corruption. */
+#define ippStsCFBSizeErr -1003 /* Incorrect value for crypto CFB block size. */
+#define ippStsPaddingSchemeErr -1002 /* Invalid padding scheme. */
+#define ippStsBadModulusErr -1001 /* Bad modulus caused a failure in module inversion. */
+#define ippStsInsufficientEntropy 25 /* Generation of the prime/key failed due to insufficient entropy in the random seed and stimulus bit string. */
+ /* end of ippCrypto specific statuses - any changes MUST be done in both repositories - IPP & ippCrypto */
+
+#ifndef IPPCPDEFS_H__
+#define IPPCPDEFS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+#if !defined( _OWN_BLDPCS )
+
+typedef Ipp32u IppAlgId;
+
+/*
+// =========================================================
+// Symmetric Ciphers
+// =========================================================
+*/
+typedef enum {
+ ippPaddingNONE = 0, /*NONE = 0,*/ IppsCPPaddingNONE = 0,
+ ippPaddingPKCS7 = 1, /*PKCS7 = 1,*/ IppsCPPaddingPKCS7 = 1,
+ ippPaddingZEROS = 2, /*ZEROS = 2,*/ IppsCPPaddingZEROS = 2
+} IppsPadding, IppsCPPadding;
+
+typedef struct _cpDES IppsDESSpec;
+typedef struct _cpRijndael128 IppsAESSpec;
+typedef struct _cpRijndael128 IppsRijndael128Spec;
+typedef struct _cpSMS4 IppsSMS4Spec;
+
+/* TDES */
+#define DES_BLOCKSIZE (64) /* cipher blocksize (bits) */
+#define TDES_BLOCKSIZE DES_BLOCKSIZE
+
+#define DES_KEYSIZE (64) /* cipher keysize (bits) */
+#define TDES_KEYSIZE DES_KEYSIZE
+
+/* AES */
+#define IPP_AES_BLOCK_BITSIZE (128) /* cipher blocksizes (bits) */
+
+/* Rijndael */
+typedef enum {
+ ippRijndaelKey128 = 128, IppsRijndaelKey128 = 128, /* 128-bit key */
+ ippRijndaelKey192 = 192, IppsRijndaelKey192 = 192, /* 192-bit key */
+ ippRijndaelKey256 = 256, IppsRijndaelKey256 = 256 /* 256-bit key */
+} IppsRijndaelKeyLength;
+
+/* AES-CCM (authentication & confidence) */
+typedef struct _cpAES_CCM IppsAES_CCMState;
+/* AES-GCM (authentication & confidence) */
+typedef struct _cpAES_GCM IppsAES_GCMState;
+/* AES-XTS (confidence) */
+typedef struct _cpAES_XTS IppsAES_XTSSpec;
+
+/* SMS4-CCM (authentication & confidence) */
+typedef struct _cpSMS4_CCM IppsSMS4_CCMState;
+
+/*
+// =========================================================
+// ARCFOUR Stream Cipher
+// =========================================================
+*/
+typedef struct _cpARCfour IppsARCFourState;
+
+#define IPP_ARCFOUR_KEYMAX_SIZE (256) /* max key length (bytes) */
+#define MAX_ARCFOUR_KEY_LEN IPP_ARCFOUR_KEYMAX_SIZE /* obsolete */
+
+/*
+// =========================================================
+// One-Way Hash Functions
+// =========================================================
+*/
+typedef enum {
+ ippHashAlg_Unknown,
+ ippHashAlg_SHA1,
+ ippHashAlg_SHA256,
+ ippHashAlg_SHA224,
+ ippHashAlg_SHA512,
+ ippHashAlg_SHA384,
+ ippHashAlg_MD5,
+ ippHashAlg_SM3,
+ ippHashAlg_SHA512_224,
+ ippHashAlg_SHA512_256,
+ ippHashAlg_MaxNo
+} IppHashAlgId;
+
+#define IPP_ALG_HASH_UNKNOWN (ippHashAlg_Unknown) /* unknown */
+#define IPP_ALG_HASH_SHA1 (ippHashAlg_SHA1) /* SHA1 */
+#define IPP_ALG_HASH_SHA256 (ippHashAlg_SHA256) /* SHA256 */
+#define IPP_ALG_HASH_SHA224 (ippHashAlg_SHA224) /* SHA224 or SHA256/224 */
+#define IPP_ALG_HASH_SHA512 (ippHashAlg_SHA512) /* SHA512 */
+#define IPP_ALG_HASH_SHA384 (ippHashAlg_SHA384) /* SHA384 or SHA512/384 */
+#define IPP_ALG_HASH_MD5 (ippHashAlg_MD5) /* MD5 */
+#define IPP_ALG_HASH_SM3 (ippHashAlg_SM3) /* SM3 */
+#define IPP_ALG_HASH_SHA512_224 (ippHashAlg_SHA512_224) /* SHA512/224 */
+#define IPP_ALG_HASH_SHA512_256 (ippHashAlg_SHA512_256) /* SHA512/256 */
+#define IPP_ALG_HASH_LIMIT (ippHashAlg_MaxNo) /* hash alg limiter*/
+
+typedef struct _cpSHA1 IppsSHA1State;
+typedef struct _cpSHA256 IppsSHA256State;
+typedef struct _cpSHA256 IppsSHA224State;
+typedef struct _cpSHA512 IppsSHA512State;
+typedef struct _cpSHA512 IppsSHA384State;
+typedef struct _cpMD5 IppsMD5State;
+typedef struct _cpSM3 IppsSM3State;
+typedef struct _cpHashCtx IppsHashState;
+
+typedef struct _cpHashMethod_rmf IppsHashMethod;
+typedef struct _cpHashCtx_rmf IppsHashState_rmf;
+
+
+/* MGF */
+typedef IppStatus (IPP_STDCALL *IppMGF)(const Ipp8u* pSeed, int seedLen, Ipp8u* pMask, int maskLen);
+/* HASH function */
+typedef IppStatus (IPP_STDCALL *IppHASH)(const Ipp8u* pMsg, int len, Ipp8u* pMD);
+
+#define IPP_SHA1_DIGEST_BITSIZE 160 /* digest size (bits) */
+#define IPP_SHA256_DIGEST_BITSIZE 256
+#define IPP_SHA224_DIGEST_BITSIZE 224
+#define IPP_SHA384_DIGEST_BITSIZE 384
+#define IPP_SHA512_DIGEST_BITSIZE 512
+#define IPP_MD5_DIGEST_BITSIZE 128
+#define IPP_SM3_DIGEST_BITSIZE 256
+#define IPP_SHA512_224_DIGEST_BITSIZE 224
+#define IPP_SHA512_256_DIGEST_BITSIZE 256
+
+/*
+// =========================================================
+// Keyed-Hash Message Authentication Codes
+// =========================================================
+*/
+typedef struct _cpHMAC IppsHMACState;
+typedef struct _cpHMAC IppsHMACSHA1State;
+typedef struct _cpHMAC IppsHMACSHA256State;
+typedef struct _cpHMAC IppsHMACSHA224State;
+typedef struct _cpHMAC IppsHMACSHA384State;
+typedef struct _cpHMAC IppsHMACSHA512State;
+typedef struct _cpHMAC IppsHMACMD5State;
+typedef struct _cpHMAC_rmf IppsHMACState_rmf;
+
+/*
+// =========================================================
+// Data Authentication Codes
+// =========================================================
+*/
+typedef struct _cpAES_CMAC IppsAES_CMACState;
+
+/*
+// =========================================================
+// Big Number Integer Arithmetic
+// =========================================================
+*/
+#define BN_MAXBITSIZE (16*1024) /* bn max size (bits) */
+
+typedef enum {
+ ippBigNumNEG = 0, IppsBigNumNEG = 0,
+ ippBigNumPOS = 1, IppsBigNumPOS = 1
+} IppsBigNumSGN;
+
+typedef enum {
+ ippBinaryMethod = 0, IppsBinaryMethod = 0,
+ ippSlidingWindows = 1, IppsSlidingWindows = 1
+} IppsExpMethod;
+
+typedef struct _cpBigNum IppsBigNumState;
+typedef struct _cpMontgomery IppsMontState;
+typedef struct _cpPRNG IppsPRNGState;
+typedef struct _cpPrime IppsPrimeState;
+
+/* External Bit Supplier */
+typedef IppStatus (IPP_STDCALL *IppBitSupplier)(Ipp32u* pRand, int nBits, void* pEbsParams);
+
+#define IPP_IS_EQ (0)
+#define IPP_IS_GT (1)
+#define IPP_IS_LT (2)
+#define IPP_IS_NE (3)
+#define IPP_IS_NA (4)
+
+#define IPP_IS_PRIME (5)
+#define IPP_IS_COMPOSITE (6)
+
+#define IPP_IS_VALID (7)
+#define IPP_IS_INVALID (8)
+#define IPP_IS_INCOMPLETE (9)
+#define IPP_IS_ATINFINITY (10)
+
+#define IS_ZERO IPP_IS_EQ
+#define GREATER_THAN_ZERO IPP_IS_GT
+#define LESS_THAN_ZERO IPP_IS_LT
+#define IS_PRIME IPP_IS_PRIME
+#define IS_COMPOSITE IPP_IS_COMPOSITE
+#define IS_VALID_KEY IPP_IS_VALID
+#define IS_INVALID_KEY IPP_IS_INVALID
+#define IS_INCOMPLETED_KEY IPP_IS_INCOMPLETE
+
+/*
+// =========================================================
+// RSA Cryptography
+// =========================================================
+*/
+#define MIN_RSA_SIZE (8)
+#define MAX_RSA_SIZE (8*1024)
+
+typedef struct _cpRSA IppsRSAState;
+
+/* key types */
+typedef enum {
+ ippRSApublic = 0x20000000, IppRSApublic = 0x20000000,
+ ippRSAprivate = 0x40000000, IppRSAprivate = 0x40000000
+} IppRSAKeyType;
+
+/* key component's tag */
+typedef enum {
+ ippRSAkeyN = 0x01, IppRSAkeyN = 0x01,
+ ippRSAkeyE = 0x02, IppRSAkeyE = 0x02,
+ ippRSAkeyD = 0x04, IppRSAkeyD = 0x04,
+ ippRSAkeyP = 0x08, IppRSAkeyP = 0x08,
+ ippRSAkeyQ = 0x10, IppRSAkeyQ = 0x10,
+ ippRSAkeyDp = 0x20, IppRSAkeyDp = 0x20,
+ ippRSAkeyDq = 0x40, IppRSAkeyDq = 0x40,
+ ippRSAkeyQinv = 0x80, IppRSAkeyQinv = 0x80
+} IppRSAKeyTag;
+
+typedef struct _cpRSA_public_key IppsRSAPublicKeyState;
+typedef struct _cpRSA_private_key IppsRSAPrivateKeyState;
+
+
+/*
+// =========================================================
+// DL Cryptography
+// =========================================================
+*/
+#define MIN_DLP_BITSIZE (512)
+#define MIN_DLP_BITSIZER (160)
+
+#define MIN_DLPDH_BITSIZE (512)
+#define MIN_DLPDH_BITSIZER (160)
+#define DEF_DLPDH_BITSIZER (160)
+
+#define MIN_DLPDSA_BITSIZE (512)
+#define MAX_DLPDSA_BITSIZE (1024)
+#define MIN_DLPDSA_BITSIZER (160)
+#define DEF_DLPDSA_BITSIZER (160)
+#define MAX_DLPDSA_BITSIZER (160)
+#define MIN_DLPDSA_SEEDSIZE (160)
+
+typedef struct _cpDLP IppsDLPState;
+
+/* domain parameter tags */
+typedef enum {
+ ippDLPkeyP = 0x01, IppDLPkeyP = 0x01,
+ ippDLPkeyR = 0x02, IppDLPkeyR = 0x02,
+ ippDLPkeyG = 0x04, IppDLPkeyG = 0x04
+} IppDLPKeyTag;
+
+typedef enum {
+ ippDLValid, /* validation pass successfully */
+
+ ippDLBaseIsEven, /* !(P is odd) */
+ ippDLOrderIsEven, /* !(R is odd) */
+ ippDLInvalidBaseRange, /* !(2^(L-1) < P < 2^L) */
+ ippDLInvalidOrderRange, /* !(2^(M-1) < R < 2^M) */
+ ippDLCompositeBase,
+ ippDLCompositeOrder,
+ ippDLInvalidCofactor, /* !( R|(P-1) ) */
+ ippDLInvalidGenerator, /* !( G^R == 1 (mod P) ) */
+ /* !(1 < G < (P-1)) */
+ ippDLInvalidPrivateKey, /* !(1 < private < (R-1)) */
+ ippDLInvalidPublicKey, /* !(1 < public <=(P-1)) */
+ ippDLInvalidKeyPair, /* !(G^private == public */
+
+ ippDLInvalidSignature /* invalid signature */
+} IppDLResult;
+
+/*
+// =========================================================
+// EC Cryptography
+// =========================================================
+*/
+#define EC_GFP_MAXBITSIZE (1024)
+
+/* operation result */
+typedef enum {
+ ippECValid, /* validation pass successfully */
+
+ ippECCompositeBase, /* field based on composite */
+ ippECComplicatedBase, /* number of non-zero terms in the polynomial (> PRIME_ARR_MAX) */
+ ippECIsZeroDiscriminant,/* zero discriminant */
+ ippECCompositeOrder, /* composite order of base point */
+ ippECInvalidOrder, /* invalid base point order */
+ ippECIsWeakMOV, /* weak Meneze-Okamoto-Vanstone reduction attack */
+ ippECIsWeakSSSA, /* weak Semaev-Smart,Satoh-Araki reduction attack */
+ ippECIsSupersingular, /* supersingular curve */
+
+ ippECInvalidPrivateKey, /* !(0 < Private < order) */
+ ippECInvalidPublicKey, /* (order*PublicKey != Infinity) */
+ ippECInvalidKeyPair, /* (Private*BasePoint != PublicKey) */
+
+ ippECPointOutOfGroup, /* out of group (order*P != Infinity) */
+ ippECPointIsAtInfinite, /* point (P=(Px,Py)) at Infinity */
+ ippECPointIsNotValid, /* point (P=(Px,Py)) out-of EC */
+
+ ippECPointIsEqual, /* compared points are equal */
+ ippECPointIsNotEqual, /* compared points are different */
+
+ ippECInvalidSignature /* invalid signature */
+} IppECResult;
+
+/* domain parameter set/get flags */
+typedef enum {
+ ippECarbitrary =0x00000, IppECCArbitrary = 0x00000, /* arbitrary ECC */
+
+ ippECPstd = 0x10000, IppECCPStd = 0x10000, /* random (recommended) EC over FG(p): */
+ ippECPstd112r1 = ippECPstd, IppECCPStd112r1 = IppECCPStd, /* secp112r1 curve */
+ ippECPstd112r2 = ippECPstd+1, IppECCPStd112r2 = IppECCPStd+1, /* secp112r2 curve */
+ ippECPstd128r1 = ippECPstd+2, IppECCPStd128r1 = IppECCPStd+2, /* secp128r1 curve */
+ ippECPstd128r2 = ippECPstd+3, IppECCPStd128r2 = IppECCPStd+3, /* secp128r2 curve */
+ ippECPstd160r1 = ippECPstd+4, IppECCPStd160r1 = IppECCPStd+4, /* secp160r1 curve */
+ ippECPstd160r2 = ippECPstd+5, IppECCPStd160r2 = IppECCPStd+5, /* secp160r2 curve */
+ ippECPstd192r1 = ippECPstd+6, IppECCPStd192r1 = IppECCPStd+6, /* secp192r1 curve */
+ ippECPstd224r1 = ippECPstd+7, IppECCPStd224r1 = IppECCPStd+7, /* secp224r1 curve */
+ ippECPstd256r1 = ippECPstd+8, IppECCPStd256r1 = IppECCPStd+8, /* secp256r1 curve */
+ ippECPstd384r1 = ippECPstd+9, IppECCPStd384r1 = IppECCPStd+9, /* secp384r1 curve */
+ ippECPstd521r1 = ippECPstd+10, IppECCPStd521r1 = IppECCPStd+10, /* secp521r1 curve */
+ ippECPstdSM2 = ippECPstd+11, IppECCPStdSM2 = IppECCPStd+11, /* TMP SM2 curve */
+ ippEC_TPM_SM2_P256= ippECPstd+11,
+ ippEC_TPM_BN_P256 = ippECPstd+12, /* TPM BN_P256 curve */
+
+ /* curves over binary finit fields are not supported in Intel(R) IPP 9.0 */
+ IppECCBStd = 0x20000, /* random (recommended) EC over FG(2^m): */
+ IppECCBStd113r1 = IppECCBStd, /* sect113r1 curve */
+ IppECCBStd113r2 = IppECCBStd+1, /* sect113r2 curve */
+ IppECCBStd131r1 = IppECCBStd+2, /* sect131r1 curve */
+ IppECCBStd131r2 = IppECCBStd+3, /* sect131r2 curve */
+ IppECCBStd163r1 = IppECCBStd+4, /* sect163r1 curve */
+ IppECCBStd163r2 = IppECCBStd+5, /* sect163r2 curve */
+ IppECCBStd193r1 = IppECCBStd+6, /* sect193r1 curve */
+ IppECCBStd193r2 = IppECCBStd+7, /* sect193r2 curve */
+ IppECCBStd233r1 = IppECCBStd+8, /* sect233r1 curve */
+ IppECCBStd283r1 = IppECCBStd+9, /* sect283r1 curve */
+ IppECCBStd409r1 = IppECCBStd+10, /* sect409r1 curve */
+ IppECCBStd571r1 = IppECCBStd+11, /* sect571r1 curve */
+
+ IppECCKStd = 0x40000, /* Koblitz (recommended) EC over FG(2^m): */
+ IppECCBStd163k1 = IppECCKStd, /* Koblitz 163 curve */
+ IppECCBStd233k1 = IppECCKStd+1, /* Koblitz 233 curve */
+ IppECCBStd239k1 = IppECCKStd+2, /* Koblitz 239 curve */
+ IppECCBStd283k1 = IppECCKStd+3, /* Koblitz 283 curve */
+ IppECCBStd409k1 = IppECCKStd+4, /* Koblitz 409 curve */
+ IppECCBStd571k1 = IppECCKStd+5 /* Koblitz 571 curve */
+} IppsECType, IppECCType;
+
+/*
+// GF over prime and its extension
+*/
+#define IPP_MIN_GF_CHAR (3) /* min characteristic of GF */
+
+#define IPP_MIN_GF_BITSIZE (2) /* min bitsize of element over prime GF */
+#define IPP_MAX_GF_BITSIZE (1024) /* max bitsize of element over prime GF */
+
+#define IPP_MIN_GF_EXTDEG (2) /* min GF extension degree */
+#define IPP_MAX_GF_EXTDEG (8) /* max GF extension degree */
+
+#define IPP_MAX_EXPONENT_NUM (6) /* max number of exponents, equals to LOG_CACHE_LINE_SIZE */
+
+typedef struct _cpGFpMethod IppsGFpMethod;
+
+typedef struct _cpGFp IppsGFpState;
+typedef struct _cpGFpElement IppsGFpElement;
+
+typedef struct _cpGFpEC IppsGFpECState;
+typedef struct _cpGFpECPoint IppsGFpECPoint;
+
+typedef struct _cpGFpEC IppsECCPState;
+typedef struct _cpGFpECPoint IppsECCPPointState;
+
+typedef struct {
+ const IppsGFpState* pBasicGF;
+ const IppsGFpState* pGroundGF;
+ int basicGFdegree;
+ int groundGFdegree;
+ int elementLen;
+} IppsGFpInfo;
+
+#endif /* _OWN_BLDPCS */
+#ifndef _PCS
+IPPAPI( IppStatus, ippcpSetNumThreads, ( int numThr ))
+IPPAPI( IppStatus, ippcpGetNumThreads, (int* pNumThr) )
+IPPAPI( IppStatus, ippcpGetCpuFeatures, ( Ipp64u* pFeaturesMask ))
+IPPAPI( IppStatus, ippcpSetCpuFeatures, ( Ipp64u features ))
+IPPAPI( Ipp64u, ippcpGetEnabledCpuFeatures, ( void ) )
+IPPAPI( IppStatus, ippcpInit,( void ))
+IPPAPI( const char*, ippcpGetStatusString, ( IppStatus StsCode ))
+IPPAPI( int, ippcpGetEnabledNumThreads, ( void ) )
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPCPDEFS_H__ */
diff --git a/ext/ipp/include/ippdefs.h b/ext/ipp/include/ippdefs.h
new file mode 100644
index 0000000..ebca21e
--- /dev/null
+++ b/ext/ipp/include/ippdefs.h
@@ -0,0 +1,121 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Common Types and Macro Definitions
+//
+//
+*/
+
+
+#ifndef IPPDEFS_H__
+#define IPPDEFS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if defined( _IPP_PARALLEL_STATIC ) || defined( _IPP_PARALLEL_DYNAMIC )
+ #pragma message("Threaded versions of Intel(R) IPP libraries are deprecated and will be removed in one of the future Intel(R) IPP releases. Use the following link for details: https://software.intel.com/sites/products/ipp-deprecated-features-feedback/")
+#endif
+
+#if defined (_WIN64)
+#define INTEL_PLATFORM "intel64/"
+#elif defined (_WIN32)
+#define INTEL_PLATFORM "ia32/"
+#endif
+
+#if !defined( IPPAPI )
+
+ #if defined( IPP_W32DLL ) && (defined( _WIN32 ) || defined( _WIN64 ))
+ #if defined( _MSC_VER ) || defined( __ICL )
+ #define IPPAPI( type,name,arg ) \
+ __declspec(dllimport) type IPP_STDCALL name arg;
+ #else
+ #define IPPAPI( type,name,arg ) type IPP_STDCALL name arg;
+ #endif
+ #else
+ #define IPPAPI( type,name,arg ) type IPP_STDCALL name arg;
+ #endif
+
+#endif
+
+#if (defined( __ICL ) || defined( __ECL ) || defined(_MSC_VER)) && !defined( _PCS ) && !defined( _PCS_GENSTUBS )
+ #if( __INTEL_COMPILER >= 1100 ) /* icl 11.0 supports additional comment */
+ #if( _MSC_VER >= 1400 )
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated ( comment ))
+ #else
+ #pragma message ("your icl version supports additional comment for deprecated functions but it can't be displayed")
+ #pragma message ("because internal _MSC_VER macro variable setting requires compatibility with MSVC7.1")
+ #pragma message ("use -Qvc8 switch for icl command line to see these additional comments")
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated )
+ #endif
+ #elif( _MSC_FULL_VER >= 140050727 )&&( !defined( __INTEL_COMPILER )) /* VS2005 supports additional comment */
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated ( comment ))
+ #elif( _MSC_VER <= 1200 )&&( !defined( __INTEL_COMPILER )) /* VS 6 doesn't support deprecation */
+ #define IPP_DEPRECATED( comment )
+ #else
+ #define IPP_DEPRECATED( comment ) __declspec( deprecated )
+ #endif
+#elif (defined(__ICC) || defined(__ECC) || defined( __GNUC__ )) && !defined( _PCS ) && !defined( _PCS_GENSTUBS )
+ #if defined( __GNUC__ )
+ #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 5
+ #define IPP_DEPRECATED( message ) __attribute__(( deprecated( message )))
+ #else
+ #define IPP_DEPRECATED( message ) __attribute__(( deprecated ))
+ #endif
+ #else
+ #define IPP_DEPRECATED( comment ) __attribute__(( deprecated ))
+ #endif
+#else
+ #define IPP_DEPRECATED( comment )
+#endif
+
+#if (defined( __ICL ) || defined( __ECL ) || defined(_MSC_VER))
+ #if !defined( IPP_NO_DEFAULT_LIB )
+ #if (( defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC )) || \
+ (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && defined( _IPP_SEQUENTIAL_STATIC )))
+ #elif (!defined( _IPP_PARALLEL_DYNAMIC ) && !defined( _IPP_PARALLEL_STATIC ) && !defined( _IPP_SEQUENTIAL_DYNAMIC ) && !defined( _IPP_SEQUENTIAL_STATIC ))
+ #define IPP_NO_DEFAULT_LIB
+ #else
+ #error Illegal combination of _IPP_PARALLEL_DYNAMIC/_IPP_PARALLEL_STATIC/_IPP_SEQUENTIAL_DYNAMIC/_IPP_SEQUENTIAL_STATIC, only one definition can be defined
+ #endif
+ #endif
+#else
+ #define IPP_NO_DEFAULT_LIB
+ #if (defined( _IPP_PARALLEL_DYNAMIC ) || defined( _IPP_PARALLEL_STATIC ) || defined(_IPP_SEQUENTIAL_DYNAMIC) || defined(_IPP_SEQUENTIAL_STATIC))
+ #pragma message ("defines _IPP_PARALLEL_DYNAMIC/_IPP_PARALLEL_STATIC/_IPP_SEQUENTIAL_DYNAMIC/_IPP_SEQUENTIAL_STATIC do not have any effect in current configuration")
+ #endif
+#endif
+
+#if !defined( IPP_NO_DEFAULT_LIB )
+ #if defined( _IPP_PARALLEL_STATIC )
+ #pragma comment( lib, "libiomp5md" )
+ #endif
+#endif
+
+#include "ippbase.h"
+#include "ipptypes.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPDEFS_H__ */
diff --git a/ext/ipp/include/ipptypes.h b/ext/ipp/include/ipptypes.h
new file mode 100644
index 0000000..3197f23
--- /dev/null
+++ b/ext/ipp/include/ipptypes.h
@@ -0,0 +1,977 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives (Intel(R) IPP)
+// Derivative Types and Macro Definitions
+//
+// The main purpose of this header file is
+// to support compatibility with the legacy
+// domains until their end of life.
+//
+*/
+
+
+#ifndef IPPTYPES_H__
+#define IPPTYPES_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************/
+/* Below are ippCore domain specific definitions */
+/*****************************************************************************/
+#if !defined( _OWN_BLDPCS )
+
+#ifndef IPP_CPU_FEATURES__
+#define IPP_CPU_FEATURES__
+
+#define ippCPUID_MMX 0x00000001 /* Intel(R) Architecture MMX technology supported */
+#define ippCPUID_SSE 0x00000002 /* Intel(R) Streaming SIMD Extensions */
+#define ippCPUID_SSE2 0x00000004 /* Intel(R) Streaming SIMD Extensions 2 */
+#define ippCPUID_SSE3 0x00000008 /* Intel(R) Streaming SIMD Extensions 3 */
+#define ippCPUID_SSSE3 0x00000010 /* Supplemental Streaming SIMD Extensions 3 */
+#define ippCPUID_MOVBE 0x00000020 /* Intel(R) MOVBE instruction */
+#define ippCPUID_SSE41 0x00000040 /* Intel(R) Streaming SIMD Extensions 4.1 */
+#define ippCPUID_SSE42 0x00000080 /* Intel(R) Streaming SIMD Extensions 4.2 */
+#define ippCPUID_AVX 0x00000100 /* Intel(R) Advanced Vector Extensions instruction set */
+#define ippAVX_ENABLEDBYOS 0x00000200 /* Intel(R) Advanced Vector Extensions instruction set is supported by OS */
+#define ippCPUID_AES 0x00000400 /* Intel(R) AES New Instructions */
+#define ippCPUID_CLMUL 0x00000800 /* Intel(R) CLMUL instruction */
+#define ippCPUID_ABR 0x00001000 /* Reserved */
+#define ippCPUID_RDRAND 0x00002000 /* Intel(R) RDRAND instruction */
+#define ippCPUID_F16C 0x00004000 /* Intel(R) F16C new instructions */
+#define ippCPUID_AVX2 0x00008000 /* Intel(R) Advanced Vector Extensions 2 instruction set */
+#define ippCPUID_ADCOX 0x00010000 /* Intel(R) ADOX/ADCX new instructions */
+#define ippCPUID_RDSEED 0x00020000 /* Intel(R) RDSEED instruction */
+#define ippCPUID_PREFETCHW 0x00040000 /* Intel(R) PREFETCHW instruction */
+#define ippCPUID_SHA 0x00080000 /* Intel(R) SHA new instructions */
+#define ippCPUID_AVX512F 0x00100000 /* Intel(R) Advanced Vector Extensions 512 Foundation instruction set */
+#define ippCPUID_AVX512CD 0x00200000 /* Intel(R) Advanced Vector Extensions 512 CD instruction set */
+#define ippCPUID_AVX512ER 0x00400000 /* Intel(R) Advanced Vector Extensions 512 ER instruction set */
+#define ippCPUID_AVX512PF 0x00800000 /* Intel(R) Advanced Vector Extensions 512 PF instruction set */
+#define ippCPUID_AVX512BW 0x01000000 /* Intel(R) Advanced Vector Extensions 512 BW instruction set */
+#define ippCPUID_AVX512DQ 0x02000000 /* Intel(R) Advanced Vector Extensions 512 DQ instruction set */
+#define ippCPUID_AVX512VL 0x04000000 /* Intel(R) Advanced Vector Extensions 512 VL instruction set */
+#define ippCPUID_AVX512VBMI 0x08000000 /* Intel(R) Advanced Vector Extensions 512 Bit Manipulation instructions */
+#define ippCPUID_MPX 0x10000000 /* Intel(R) Memory Protection Extensions */
+#define ippCPUID_AVX512_4FMADDPS 0x20000000 /* Intel(R) Advanced Vector Extensions 512 DL floating-point single precision */
+#define ippCPUID_AVX512_4VNNIW 0x40000000 /* Intel(R) Advanced Vector Extensions 512 DL enhanced word variable precision */
+#define ippCPUID_KNC 0x80000000 /* Intel(R) Xeon Phi(TM) Coprocessor */
+#if defined( _WIN32 ) || defined ( _WIN64 )
+ #define INT64_SUFFIX(name) name##L
+#else
+ #define INT64_SUFFIX(name) name##LL
+#endif
+ #define ippCPUID_AVX512IFMA INT64_SUFFIX(0x100000000) /* Intel(R) Advanced Vector Extensions 512 IFMA (PMADD52) instruction set */
+ #define ippCPUID_NOCHECK INT64_SUFFIX(0x8000000000000000) /* Force ippSetCpuFeatures to set CPU features without check */
+ #define ippCPUID_GETINFO_A INT64_SUFFIX(0x616f666e69746567) /* Force ippGetCpuFeatures to work as cpuid instruction */
+ #define ippAVX512_ENABLEDBYOS INT64_SUFFIX(0x200000000) /* Intel(R) Advanced Vector Extensions 512 is supported by OS */
+
+
+#endif /* IPP_CPU_FEATURES__ */
+
+#define IPP_COUNT_OF( obj ) (sizeof(obj)/sizeof(obj[0]))
+
+typedef struct {
+ int type;
+ int level;
+ int size;
+} IppCache;
+
+/*****************************************************************************/
+/* Below are ippSP domain specific definitions */
+/*****************************************************************************/
+typedef enum {
+ ippRndZero,
+ ippRndNear,
+ ippRndFinancial,
+ ippRndHintAccurate=0x10
+} IppRoundMode;
+
+
+typedef enum {
+ ippAlgHintNone,
+ ippAlgHintFast,
+ ippAlgHintAccurate
+} IppHintAlgorithm;
+
+typedef enum {
+ ippCmpLess,
+ ippCmpLessEq,
+ ippCmpEq,
+ ippCmpGreaterEq,
+ ippCmpGreater
+} IppCmpOp;
+
+typedef enum {
+ ippAlgAuto = 0x00000000,
+ ippAlgDirect = 0x00000001,
+ ippAlgFFT = 0x00000002,
+ ippAlgMask = 0x000000FF
+} IppAlgType;
+
+typedef enum {
+ ippsNormNone = 0x00000000, /* default */
+ ippsNormA = 0x00000100, /* biased normalization */
+ ippsNormB = 0x00000200, /* unbiased normalization */
+ ippsNormMask = 0x0000FF00
+} IppsNormOp;
+
+typedef enum {
+ ippNormInf = 0x00000001,
+ ippNormL1 = 0x00000002,
+ ippNormL2 = 0x00000004
+} IppNormType;
+
+enum {
+ IPP_FFT_DIV_FWD_BY_N = 1,
+ IPP_FFT_DIV_INV_BY_N = 2,
+ IPP_FFT_DIV_BY_SQRTN = 4,
+ IPP_FFT_NODIV_BY_ANY = 8
+};
+
+enum {
+ IPP_DIV_FWD_BY_N = 1,
+ IPP_DIV_INV_BY_N = 2,
+ IPP_DIV_BY_SQRTN = 4,
+ IPP_NODIV_BY_ANY = 8
+};
+
+typedef struct {
+ Ipp32f rho;
+ Ipp32f theta;
+} IppPointPolar;
+
+typedef enum {ippWinBartlett,ippWinBlackman,ippWinHamming,ippWinHann,ippWinRect} IppWinType;
+
+typedef enum { ippButterworth, ippChebyshev1 } IppsIIRFilterType;
+
+typedef enum { ippZCR=0, ippZCXor, ippZCC } IppsZCType;
+
+#if !defined( _OWN_BLDPCS )
+
+typedef struct {
+ int left;
+ int right;
+} IppsROI;
+
+typedef struct RandUniState_8u IppsRandUniState_8u;
+typedef struct RandUniState_16s IppsRandUniState_16s;
+typedef struct RandUniState_32f IppsRandUniState_32f;
+typedef struct RandUniState_64f IppsRandUniState_64f;
+
+typedef struct RandGaussState_8u IppsRandGaussState_8u;
+typedef struct RandGaussState_16s IppsRandGaussState_16s;
+typedef struct RandGaussState_32f IppsRandGaussState_32f;
+typedef struct RandGaussState_64f IppsRandGaussState_64f;
+
+typedef struct FFTSpec_C_32fc IppsFFTSpec_C_32fc;
+typedef struct FFTSpec_C_32f IppsFFTSpec_C_32f;
+typedef struct FFTSpec_R_32f IppsFFTSpec_R_32f;
+
+typedef struct FFTSpec_C_64fc IppsFFTSpec_C_64fc;
+typedef struct FFTSpec_C_64f IppsFFTSpec_C_64f;
+typedef struct FFTSpec_R_64f IppsFFTSpec_R_64f;
+
+typedef struct DFTSpec_C_32fc IppsDFTSpec_C_32fc;
+typedef struct DFTSpec_C_32f IppsDFTSpec_C_32f;
+typedef struct DFTSpec_R_32f IppsDFTSpec_R_32f;
+
+typedef struct DFTSpec_C_64fc IppsDFTSpec_C_64fc;
+typedef struct DFTSpec_C_64f IppsDFTSpec_C_64f;
+typedef struct DFTSpec_R_64f IppsDFTSpec_R_64f;
+
+typedef struct DCTFwdSpec_32f IppsDCTFwdSpec_32f;
+typedef struct DCTInvSpec_32f IppsDCTInvSpec_32f;
+
+typedef struct DCTFwdSpec_64f IppsDCTFwdSpec_64f;
+typedef struct DCTInvSpec_64f IppsDCTInvSpec_64f;
+
+typedef struct sWTFwdState_32f IppsWTFwdState_32f;
+typedef struct sWTFwdState_8u32f IppsWTFwdState_8u32f;
+typedef struct sWTFwdState_16s32f IppsWTFwdState_16s32f;
+typedef struct sWTFwdState_16u32f IppsWTFwdState_16u32f;
+typedef struct sWTInvState_32f IppsWTInvState_32f;
+typedef struct sWTInvState_32f8u IppsWTInvState_32f8u;
+typedef struct sWTInvState_32f16s IppsWTInvState_32f16s;
+typedef struct sWTInvState_32f16u IppsWTInvState_32f16u;
+
+typedef struct IIRState_32f IppsIIRState_32f;
+typedef struct IIRState_32fc IppsIIRState_32fc;
+typedef struct IIRState32f_16s IppsIIRState32f_16s;
+typedef struct IIRState32fc_16sc IppsIIRState32fc_16sc;
+typedef struct IIRState_64f IppsIIRState_64f;
+typedef struct IIRState_64fc IppsIIRState_64fc;
+typedef struct IIRState64f_32f IppsIIRState64f_32f;
+typedef struct IIRState64fc_32fc IppsIIRState64fc_32fc;
+typedef struct IIRState64f_32s IppsIIRState64f_32s;
+typedef struct IIRState64fc_32sc IppsIIRState64fc_32sc;
+typedef struct IIRState64f_16s IppsIIRState64f_16s;
+typedef struct IIRState64fc_16sc IppsIIRState64fc_16sc;
+
+typedef struct FIRSpec_32f IppsFIRSpec_32f;
+typedef struct FIRSpec_64f IppsFIRSpec_64f;
+typedef struct FIRSpec_32fc IppsFIRSpec_32fc;
+typedef struct FIRSpec_64fc IppsFIRSpec_64fc;
+typedef struct FIRSpec32f_32fc IppsFIRSpec32f_32fc;
+
+typedef struct FIRLMSState_32f IppsFIRLMSState_32f;
+typedef struct FIRLMSState32f_16s IppsFIRLMSState32f_16s;
+
+typedef struct HilbertSpec IppsHilbertSpec;
+
+typedef struct FIRSparseState_32f IppsFIRSparseState_32f;
+typedef struct IIRSparseState_32f IppsIIRSparseState_32f;
+
+typedef struct ResamplingPolyphase_16s IppsResamplingPolyphase_16s;
+typedef struct ResamplingPolyphaseFixed_16s IppsResamplingPolyphaseFixed_16s;
+typedef struct ResamplingPolyphase_32f IppsResamplingPolyphase_32f;
+typedef struct ResamplingPolyphaseFixed_32f IppsResamplingPolyphaseFixed_32f;
+
+#endif /* _OWN_BLDPCS */
+
+/*****************************************************************************/
+/* Below are ippIP domain specific definitions */
+/*****************************************************************************/
+#define IPP_TEMPORAL_COPY 0x0
+#define IPP_NONTEMPORAL_STORE 0x01
+#define IPP_NONTEMPORAL_LOAD 0x02
+
+typedef int IppEnum;
+
+#define IPP_DEG_TO_RAD( deg ) ( (deg)/180.0 * IPP_PI )
+
+typedef enum {
+ ippiNormNone = 0x00000000, /* default */
+ ippiNorm = 0x00000100, /* normalized form */
+ ippiNormCoefficient = 0x00000200, /* correlation coefficient in the range [-1.0 ... 1.0] */
+ ippiNormMask = 0x0000FF00
+} IppiNormOp;
+
+typedef enum {
+ ippiROIFull = 0x00000000,
+ ippiROIValid = 0x00010000,
+ ippiROISame = 0x00020000,
+ ippiROIMask = 0x00FF0000
+} IppiROIShape;
+
+typedef enum {
+ ippC0 = 0,
+ ippC1 = 1,
+ ippC2 = 2,
+ ippC3 = 3,
+ ippC4 = 4,
+ ippP2 = 5,
+ ippP3 = 6,
+ ippP4 = 7,
+ ippAC1 = 8,
+ ippAC4 = 9,
+ ippA0C4 = 10,
+ ippAP4 = 11
+} IppChannels;
+
+typedef enum _IppiBorderType {
+ ippBorderRepl = 1,
+ ippBorderWrap = 2,
+ ippBorderMirror = 3, /* left border: 012... -> 21012... */
+ ippBorderMirrorR = 4, /* left border: 012... -> 210012... */
+ ippBorderDefault = 5,
+ ippBorderConst = 6,
+ ippBorderTransp = 7,
+
+ /* Flags to use source image memory pixels from outside of the border in particular directions */
+ ippBorderInMemTop = 0x0010,
+ ippBorderInMemBottom = 0x0020,
+ ippBorderInMemLeft = 0x0040,
+ ippBorderInMemRight = 0x0080,
+ ippBorderInMem = ippBorderInMemLeft|ippBorderInMemTop|ippBorderInMemRight|ippBorderInMemBottom,
+
+ /* Flags to use source image memory pixels from outside of the border for first stage only in multi-stage filters */
+ ippBorderFirstStageInMemTop = 0x0100,
+ ippBorderFirstStageInMemBottom = 0x0200,
+ ippBorderFirstStageInMemLeft = 0x0400,
+ ippBorderFirstStageInMemRight = 0x0800,
+ ippBorderFirstStageInMem = ippBorderFirstStageInMemLeft|ippBorderFirstStageInMemTop|ippBorderFirstStageInMemRight|ippBorderFirstStageInMemBottom
+} IppiBorderType;
+
+typedef enum {
+ ippAxsHorizontal,
+ ippAxsVertical,
+ ippAxsBoth,
+ ippAxs45,
+ ippAxs135
+} IppiAxis;
+
+typedef struct {
+ int x;
+ int y;
+ int width;
+ int height;
+} IppiRect;
+
+typedef struct {
+ int x;
+ int y;
+} IppiPoint;
+
+typedef struct {
+ int width;
+ int height;
+} IppiSize;
+
+typedef struct {
+ Ipp32f x;
+ Ipp32f y;
+} IppiPoint_32f;
+
+typedef enum _IppiMaskSize {
+ ippMskSize1x3 = 13,
+ ippMskSize1x5 = 15,
+ ippMskSize3x1 = 31,
+ ippMskSize3x3 = 33,
+ ippMskSize5x1 = 51,
+ ippMskSize5x5 = 55
+} IppiMaskSize;
+
+enum {
+ IPPI_INTER_NN = 1,
+ IPPI_INTER_LINEAR = 2,
+ IPPI_INTER_CUBIC = 4,
+ IPPI_INTER_CUBIC2P_BSPLINE, /* two-parameter cubic filter (B=1, C=0) */
+ IPPI_INTER_CUBIC2P_CATMULLROM, /* two-parameter cubic filter (B=0, C=1/2) */
+ IPPI_INTER_CUBIC2P_B05C03, /* two-parameter cubic filter (B=1/2, C=3/10) */
+ IPPI_INTER_SUPER = 8,
+ IPPI_INTER_LANCZOS = 16,
+ IPPI_ANTIALIASING = (1 << 29),
+ IPPI_SUBPIXEL_EDGE = (1 << 30),
+ IPPI_SMOOTH_EDGE = IPP_MIN_32S /* GCC gives warning for (1 << 31) definition */
+};
+
+typedef enum {
+ ippNearest = IPPI_INTER_NN,
+ ippLinear = IPPI_INTER_LINEAR,
+ ippCubic = IPPI_INTER_CUBIC2P_CATMULLROM,
+ ippLanczos = IPPI_INTER_LANCZOS,
+ ippHahn = 0,
+ ippSuper = IPPI_INTER_SUPER
+} IppiInterpolationType;
+
+typedef enum {
+ ippPolyphase_1_2,
+ ippPolyphase_3_5,
+ ippPolyphase_2_3,
+ ippPolyphase_7_10,
+ ippPolyphase_3_4
+} IppiFraction;
+
+enum {
+ IPP_FASTN_ORIENTATION = 0x0001,
+ IPP_FASTN_NMS = 0x0002,
+ IPP_FASTN_CIRCLE = 0X0004,
+ IPP_FASTN_SCORE_MODE0 = 0X0020
+};
+
+#if !defined( _OWN_BLDPCS )
+
+typedef enum {
+ ippAlphaOver,
+ ippAlphaIn,
+ ippAlphaOut,
+ ippAlphaATop,
+ ippAlphaXor,
+ ippAlphaPlus,
+ ippAlphaOverPremul,
+ ippAlphaInPremul,
+ ippAlphaOutPremul,
+ ippAlphaATopPremul,
+ ippAlphaXorPremul,
+ ippAlphaPlusPremul
+} IppiAlphaType;
+
+typedef struct DeconvFFTState_32f_C1R IppiDeconvFFTState_32f_C1R;
+typedef struct DeconvFFTState_32f_C3R IppiDeconvFFTState_32f_C3R;
+typedef struct DeconvLR_32f_C1R IppiDeconvLR_32f_C1R;
+typedef struct DeconvLR_32f_C3R IppiDeconvLR_32f_C3R;
+
+typedef enum {
+ ippiFilterBilateralGauss = 100,
+ ippiFilterBilateralGaussFast = 101
+} IppiFilterBilateralType;
+
+typedef struct FilterBilateralSpec IppiFilterBilateralSpec;
+
+typedef enum {
+ ippDistNormL1 = 0x00000002,
+ ippDistNormL2 = 0x00000004
+} IppiDistanceMethodType;
+
+typedef enum {
+ ippResizeFilterHann,
+ ippResizeFilterLanczos
+} IppiResizeFilterType;
+
+typedef struct ResizeFilterState IppiResizeFilterState;
+
+typedef struct {
+ Ipp32u borderLeft;
+ Ipp32u borderTop;
+ Ipp32u borderRight;
+ Ipp32u borderBottom;
+} IppiBorderSize;
+
+typedef enum {
+ ippWarpForward,
+ ippWarpBackward
+} IppiWarpDirection;
+
+typedef enum {
+ ippWarpAffine,
+ ippWarpPerspective,
+ ippWarpBilinear
+} IppiWarpTransformType;
+
+
+typedef struct ResizeSpec_32f IppiResizeSpec_32f;
+typedef struct ResizeYUV422Spec IppiResizeYUV422Spec;
+typedef struct ResizeYUV420Spec IppiResizeYUV420Spec;
+
+typedef struct ResizeSpec_64f IppiResizeSpec_64f;
+
+typedef struct IppiWarpSpec IppiWarpSpec;
+
+typedef struct FilterBorderSpec IppiFilterBorderSpec;
+
+typedef struct ThresholdAdaptiveSpec IppiThresholdAdaptiveSpec;
+
+typedef struct HistogramSpec IppiHistogramSpec;
+
+typedef struct {
+ int cvCompatible; /* openCV compatible output format */
+ int cellSize; /* squre cell size (pixels) */
+ int blockSize; /* square block size (pixels) */
+ int blockStride; /* block displacement (the same for x- and y- directions) */
+ int nbins; /* required number of bins */
+ Ipp32f sigma; /* gaussian factor of HOG block weights */
+ Ipp32f l2thresh; /* normalization factor */
+ IppiSize winSize; /* detection window size (pixels) */
+} IppiHOGConfig;
+
+typedef struct FFT2DSpec_C_32fc IppiFFTSpec_C_32fc;
+typedef struct FFT2DSpec_R_32f IppiFFTSpec_R_32f;
+
+typedef struct DFT2DSpec_C_32fc IppiDFTSpec_C_32fc;
+typedef struct DFT2DSpec_R_32f IppiDFTSpec_R_32f;
+
+typedef struct DCT2DFwdSpec_32f IppiDCTFwdSpec_32f;
+typedef struct DCT2DInvSpec_32f IppiDCTInvSpec_32f;
+
+typedef struct iWTFwdSpec_32f_C1R IppiWTFwdSpec_32f_C1R;
+typedef struct iWTInvSpec_32f_C1R IppiWTInvSpec_32f_C1R;
+typedef struct iWTFwdSpec_32f_C3R IppiWTFwdSpec_32f_C3R;
+typedef struct iWTInvSpec_32f_C3R IppiWTInvSpec_32f_C3R;
+
+typedef struct MomentState64f IppiMomentState_64f;
+typedef Ipp64f IppiHuMoment_64f[7];
+
+typedef struct LUT_Spec IppiLUT_Spec;
+
+#define IPP_HOG_MAX_CELL (16) /* max size of CELL */
+#define IPP_HOG_MAX_BLOCK (64) /* max size of BLOCK */
+#define IPP_HOG_MAX_BINS (16) /* max number of BINS */
+
+typedef struct _ipHOG IppiHOGSpec;
+
+#endif /* _OWN_BLDPCS */
+
+
+ /**** Below are 3D Image (Volume) Processing specific definitions ****/
+
+typedef struct {
+ int width;
+ int height;
+ int depth;
+} IpprVolume;
+
+typedef struct {
+ int x;
+ int y;
+ int z;
+ int width;
+ int height;
+ int depth;
+} IpprCuboid;
+
+typedef struct {
+ int x;
+ int y;
+ int z;
+} IpprPoint;
+
+/*****************************************************************************/
+/* Below are ippCV domain specific definitions */
+/*****************************************************************************/
+
+typedef enum _IppiDifferentialKernel
+{
+ ippFilterSobelVert,
+ ippFilterSobelHoriz,
+ ippFilterSobel,
+ ippFilterScharrVert,
+ ippFilterScharrHoriz,
+ ippFilterScharr,
+ ippFilterCentralDiffVert,
+ ippFilterCentralDiffHoriz,
+ ippFilterCentralDiff
+}IppiDifferentialKernel;
+
+#if !defined( _OWN_BLDPCS )
+
+typedef enum _IppiKernelType {
+ ippKernelSobel = 0,
+ ippKernelScharr = 1,
+ ippKernelSobelNeg = 2
+} IppiKernelType;
+
+typedef enum _IppiNorm {
+ ippiNormInf = 0,
+ ippiNormL1 = 1,
+ ippiNormL2 = 2,
+ ippiNormFM = 3
+} IppiNorm;
+
+typedef struct ipcvMorphState IppiMorphState;
+typedef struct ipcvMorphStateL IppiMorphStateL;
+typedef struct ipcvMorphAdvState IppiMorphAdvState;
+typedef struct ipcvMorphAdvStateL IppiMorphAdvStateL;
+typedef struct ipcvMorphGrayState_8u IppiMorphGrayState_8u;
+typedef struct ipcvMorphGrayState_8uL IppiMorphGrayState_8uL;
+typedef struct ipcvMorphGrayState_32f IppiMorphGrayState_32f;
+typedef struct ipcvMorphGrayState_32fL IppiMorphGrayState_32fL;
+
+typedef struct ipcvConvState IppiConvState;
+
+typedef struct _IppiConnectedComp {
+ Ipp64f area; /* area of the segmented component */
+ Ipp64f value[3];/* gray scale value of the segmented component */
+ IppiRect rect; /* bounding rectangle of the segmented component */
+} IppiConnectedComp;
+
+typedef struct PyramidState IppiPyramidState;
+typedef struct FilterSeparableSpec IppiFilterSeparableSpec;
+
+typedef IppiPyramidState IppiPyramidDownState_8u_C1R;
+typedef IppiPyramidState IppiPyramidDownState_16u_C1R;
+typedef IppiPyramidState IppiPyramidDownState_32f_C1R;
+typedef IppiPyramidState IppiPyramidDownState_8u_C3R;
+typedef IppiPyramidState IppiPyramidDownState_16u_C3R;
+typedef IppiPyramidState IppiPyramidDownState_32f_C3R;
+typedef IppiPyramidState IppiPyramidUpState_8u_C1R;
+typedef IppiPyramidState IppiPyramidUpState_16u_C1R;
+typedef IppiPyramidState IppiPyramidUpState_32f_C1R;
+typedef IppiPyramidState IppiPyramidUpState_8u_C3R;
+typedef IppiPyramidState IppiPyramidUpState_16u_C3R;
+typedef IppiPyramidState IppiPyramidUpState_32f_C3R;
+
+
+typedef struct _IppiPyramid {
+ Ipp8u **pImage;
+ IppiSize *pRoi;
+ Ipp64f *pRate;
+ int *pStep;
+ Ipp8u *pState;
+ int level;
+} IppiPyramid;
+
+typedef struct OptFlowPyrLK IppiOptFlowPyrLK;
+
+typedef IppiOptFlowPyrLK IppiOptFlowPyrLK_8u_C1R;
+typedef IppiOptFlowPyrLK IppiOptFlowPyrLK_16u_C1R;
+typedef IppiOptFlowPyrLK IppiOptFlowPyrLK_32f_C1R;
+
+typedef struct ipcvHaarClassifier_32f IppiHaarClassifier_32f;
+typedef struct ipcvHaarClassifier_32s IppiHaarClassifier_32s;
+
+typedef struct ipcvFGHistogramState_8u_C1R IppFGHistogramState_8u_C1R;
+typedef struct ipcvFGHistogramState_8u_C3R IppFGHistogramState_8u_C3R;
+
+typedef struct ipcvFGGaussianState_8u_C1R IppFGGaussianState_8u_C1R;
+typedef struct ipcvFGGaussianState_8u_C3R IppFGGaussianState_8u_C3R;
+
+typedef enum _IppiInpaintFlag {
+ IPP_INPAINT_TELEA = 0,
+ IPP_INPAINT_NS = 1
+} IppiInpaintFlag;
+
+typedef struct ippcvFilterGaussianSpec IppFilterGaussianSpec;
+
+typedef struct ipcvInpaintState_8u IppiInpaintState_8u_C1R;
+typedef struct ipcvInpaintState_8u IppiInpaintState_8u_C3R;
+
+typedef struct HoughProbSpec IppiHoughProbSpec;
+
+typedef struct FastNSpec IppiFastNSpec;
+
+typedef struct _IppiCornerFastN {
+ int x;
+ int y;
+ int cornerType;
+ int orientation;
+ float angle;
+ float score;
+} IppiCornerFastN;
+
+typedef struct FGMMState_8u_C3R IppFGMMState_8u_C3R;
+
+typedef struct
+{
+ unsigned int numFrames;
+ unsigned int maxNGauss;
+ Ipp32f varInit;
+ Ipp32f varMin;
+ Ipp32f varMax;
+ Ipp32f varWBRatio;
+ Ipp32f bckgThr;
+ Ipp32f varNGRatio;
+ Ipp32f reduction;
+ Ipp8u shadowValue;
+ char shadowFlag;
+ Ipp32f shadowRatio;
+} IppFGMModel;
+
+#endif /* _OWN_BLDPCS */
+
+#define IPP_SEGMENT_QUEUE 0x01
+#define IPP_SEGMENT_DISTANCE 0x02
+#define IPP_SEGMENT_BORDER_4 0x40
+#define IPP_SEGMENT_BORDER_8 0x80
+
+#define IPP_TRUNC(a,b) ((a)&~((b)-1))
+#define IPP_APPEND(a,b) (((a)+(b)-1)&~((b)-1))
+
+/*****************************************************************************/
+/* Below are ippCC domain specific definitions */
+/*****************************************************************************/
+enum {
+ IPP_UPPER = 1,
+ IPP_LEFT = 2,
+ IPP_CENTER = 4,
+ IPP_RIGHT = 8,
+ IPP_LOWER = 16,
+ IPP_UPPER_LEFT = 32,
+ IPP_UPPER_RIGHT = 64,
+ IPP_LOWER_LEFT = 128,
+ IPP_LOWER_RIGHT = 256
+};
+
+#if !defined( _OWN_BLDPCS )
+
+typedef enum {
+ ippDitherNone,
+ ippDitherFS,
+ ippDitherJJN,
+ ippDitherStucki,
+ ippDitherBayer
+} IppiDitherType;
+
+#endif /* _OWN_BLDPCS */
+
+/*****************************************************************************/
+/* Below are ippCH domain specific definitions */
+/*****************************************************************************/
+
+#if !defined( _OWN_BLDPCS )
+
+typedef struct {
+ void *pFind;
+ int lenFind;
+} IppRegExpFind;
+
+typedef struct RegExpState IppRegExpState;
+
+typedef enum {
+ ippFmtASCII = 0,
+ ippFmtUTF8
+} IppRegExpFormat;
+
+typedef struct RegExpReplaceState IppRegExpReplaceState;
+
+#endif /* _OWN_BLDPCS */
+
+/*****************************************************************************/
+/* Below are ippDC domain specific definitions */
+/*****************************************************************************/
+
+#if !defined ( _OWN_BLDPCS )
+
+typedef struct MTFState_8u IppMTFState_8u;
+
+typedef enum {
+ ippBWTItohTanakaLimSort,
+ ippBWTItohTanakaUnlimSort,
+ ippBWTSuffixSort,
+ ippBWTAutoSort
+} IppBWTSortAlgorithmHint;
+
+typedef struct LZSSState_8u IppLZSSState_8u;
+
+typedef struct LZ77State_8u IppLZ77State_8u;
+typedef enum{
+ IppLZ77FastCompr,
+ IppLZ77AverageCompr,
+ IppLZ77BestCompr
+} IppLZ77ComprLevel;
+typedef enum{
+ IppLZ77NoChcksm,
+ IppLZ77Adler32,
+ IppLZ77CRC32
+} IppLZ77Chcksm;
+typedef enum {
+ IppLZ77NoFlush,
+ IppLZ77SyncFlush,
+ IppLZ77FullFlush,
+ IppLZ77FinishFlush
+} IppLZ77Flush;
+typedef struct IppLZ77Pairs_16u {
+ Ipp16u length;
+ Ipp16u offset;
+} IppLZ77Pair;
+typedef enum {
+ IppLZ77StatusInit,
+ IppLZ77StatusLZ77Process,
+ IppLZ77StatusHuffProcess,
+ IppLZ77StatusFinal
+} IppLZ77DeflateStatus;
+typedef enum {
+ IppLZ77UseFixed,
+ IppLZ77UseDynamic,
+ IppLZ77UseStored
+} IppLZ77HuffMode;
+typedef enum {
+ IppLZ77InflateStatusInit,
+ IppLZ77InflateStatusHuffProcess,
+ IppLZ77InflateStatusLZ77Process,
+ IppLZ77InflateStatusFinal
+} IppLZ77InflateStatus;
+
+typedef struct IppInflateState {
+ const Ipp8u* pWindow; /* pointer to the sliding window
+ (the dictionary for the LZ77 algorithm) */
+ unsigned int winSize; /* size of the sliding window */
+ unsigned int tableType; /* type of Huffman code tables
+ (for example, 0 - tables for Fixed Huffman codes) */
+ unsigned int tableBufferSize; /* (ENOUGH = 2048) * (sizeof(code) = 4) -
+ sizeof(IppInflateState) */
+} IppInflateState;
+
+typedef enum { /* this type is used as a translator of the inflate_mode type from zlib */
+ ippTYPE,
+ ippLEN,
+ ippLENEXT
+} IppInflateMode;
+
+typedef struct {
+ Ipp16u freq;
+ Ipp16u code;
+} IppDeflateFreqTable;
+
+typedef struct {
+ Ipp16u code;
+ Ipp16u len;
+} IppDeflateHuffCode;
+
+typedef struct RLEState_BZ2 IppRLEState_BZ2;
+
+typedef struct EncodeHuffState_BZ2 IppEncodeHuffState_BZ2;
+
+typedef struct DecodeHuffState_BZ2 IppDecodeHuffState_BZ2;
+
+typedef enum {
+ IppLZO1XST, /* Single-threaded, generic LZO-compatible*/
+ IppLZO1XMT /* Multi-threaded */
+} IppLZOMethod ;
+
+typedef struct LZOState_8u IppLZOState_8u;
+
+#endif /* _OWN_BLDPCS */
+
+/* /////////////////////////////////////////////////////////////////////////////
+// The following enumerator defines a status of Intel(R) IPP operations
+// negative value means error
+*/
+ /* errors */
+#define ippStsCpuNotSupportedErr -9999/* The target CPU is not supported. */
+#define ippStsInplaceModeNotSupportedErr -9998/* The inplace operation is currently not supported. */
+
+ /* ippCrypto specific statuses - any changes MUST be done in both repositories -
+ IPP & ippCrypto - don't use sts range 1000-2000 - reserved for Crypto */
+
+#define ippStsIIRIIRLengthErr -234 /* Vector length for IIRIIR function is less than 3*(IIR order) */
+#define ippStsWarpTransformTypeErr -233 /* The warp transform type is illegal */
+#define ippStsExceededSizeErr -232 /* Requested size exceeded the maximum supported ROI size */
+#define ippStsWarpDirectionErr -231 /* The warp transform direction is illegal */
+#define ippStsFilterTypeErr -230 /* The filter type is incorrect or not supported */
+#define ippStsNormErr -229 /* The norm is incorrect or not supported */
+#define ippStsAlgTypeErr -228 /* Algorithm type is not supported. */
+#define ippStsMisalignedOffsetErr -227 /* The offset is not aligned with an element. */
+#define ippStsBorderErr -225 /* Illegal value for border type.*/
+#define ippStsDitherTypeErr -224 /* Dithering type is not supported. */
+#define ippStsUnknownStatusCodeErr -216 /* Unknown status code. */
+#define ippStsLzoBrokenStreamErr -214 /* LZO safe decompression function cannot decode LZO stream.*/
+#define ippStsRoundModeNotSupportedErr -213 /* Rounding mode is not supported. */
+#define ippStsDecimateFractionErr -212 /* Fraction in Decimate is not supported. */
+#define ippStsWeightErr -211 /* Incorrect value for weight. */
+#define ippStsQualityIndexErr -210 /* Cannot calculate the quality index for an image filled with a constant. */
+#define ippStsIIRPassbandRippleErr -209 /* Ripple in passband for Chebyshev1 design is less than zero, equal to zero, or greater than 29. */
+#define ippStsFilterFrequencyErr -208 /* Cutoff frequency of filter is less than zero, equal to zero, or greater than 0.5. */
+#define ippStsIIRGenOrderErr -206 /* Order of the IIR filter for design is less than 1, or greater than 12. */
+#define ippStsConvergeErr -205 /* The algorithm does not converge. */
+#define ippStsSizeMatchMatrixErr -204 /* The sizes of the source matrices are unsuitable. */
+#define ippStsCountMatrixErr -203 /* Count value is less than or equal to zero. */
+#define ippStsRoiShiftMatrixErr -202 /* RoiShift value is negative or not divisible by the size of the data type. */
+#define ippStsSrcDataErr -200 /* The source buffer contains unsupported data.*/
+#define ippStsSingularErr -195 /* Matrix is singular. */
+#define ippStsSparseErr -194 /* Positions of taps are not in ascending order, or are negative, or repetitive. */
+#define ippStsRegExpOptionsErr -190 /* RegExp: Options for the pattern are incorrect. */
+#define ippStsRegExpErr -189 /* RegExp: The structure pRegExpState contains incorrect data. */
+#define ippStsRegExpMatchLimitErr -188 /* RegExp: The match limit is exhausted. */
+#define ippStsRegExpQuantifierErr -187 /* RegExp: Incorrect quantifier. */
+#define ippStsRegExpGroupingErr -186 /* RegExp: Incorrect grouping. */
+#define ippStsRegExpBackRefErr -185 /* RegExp: Incorrect back reference. */
+#define ippStsRegExpChClassErr -184 /* RegExp: Incorrect character class. */
+#define ippStsRegExpMetaChErr -183 /* RegExp: Incorrect metacharacter. */
+#define ippStsStrideMatrixErr -182 /* Stride value is not positive or not divisible by the size of the data type. */
+#define ippStsNoiseRangeErr -125 /* Noise value for Wiener Filter is out of range. */
+#define ippStsNotEvenStepErr -108 /* Step value is not pixel multiple. */
+#define ippStsHistoNofLevelsErr -107 /* Number of levels for histogram is less than 2. */
+#define ippStsLUTNofLevelsErr -106 /* Number of levels for LUT is less than 2. */
+#define ippStsChannelOrderErr -60 /* Incorrect order of the destination channels. */
+#define ippStsDataTypeErr -59 /* Data type is incorrect or not supported. */
+#define ippStsQuadErr -58 /* The quadrangle is nonconvex or degenerates into triangle, line, or point */
+#define ippStsRectErr -57 /* Size of the rectangle region is less than, or equal to 1. */
+#define ippStsCoeffErr -56 /* Incorrect values for transformation coefficients. */
+#define ippStsNoiseValErr -55 /* Incorrect value for noise amplitude for dithering. */
+#define ippStsDitherLevelsErr -54 /* Number of dithering levels is out of range. */
+#define ippStsNumChannelsErr -53 /* Number of channels is incorrect, or not supported. */
+#define ippStsCOIErr -52 /* COI is out of range. */
+#define ippStsDivisorErr -51 /* Divisor is equal to zero, function is aborted. */
+#define ippStsAlphaTypeErr -50 /* Illegal type of image compositing operation. */
+#define ippStsGammaRangeErr -49 /* Gamma range bounds is less than, or equal to zero. */
+#define ippStsChannelErr -47 /* Illegal channel number. */
+#define ippStsToneMagnErr -46 /* Tone magnitude is less than, or equal to zero. */
+#define ippStsToneFreqErr -45 /* Tone frequency is negative, or greater than, or equal to 0.5. */
+#define ippStsTonePhaseErr -44 /* Tone phase is negative, or greater than, or equal to 2*PI. */
+#define ippStsTrnglMagnErr -43 /* Triangle magnitude is less than, or equal to zero. */
+#define ippStsTrnglFreqErr -42 /* Triangle frequency is negative, or greater than, or equal to 0.5. */
+#define ippStsTrnglPhaseErr -41 /* Triangle phase is negative, or greater than, or equal to 2*PI. */
+#define ippStsTrnglAsymErr -40 /* Triangle asymmetry is less than -PI, or greater than, or equal to PI. */
+#define ippStsHugeWinErr -39 /* Kaiser window is too big. */
+#define ippStsJaehneErr -38 /* Magnitude value is negative. */
+#define ippStsStrideErr -37 /* Stride value is less than the length of the row. */
+#define ippStsEpsValErr -36 /* Negative epsilon value. */
+#define ippStsWtOffsetErr -35 /* Invalid offset value for wavelet filter. */
+#define ippStsAnchorErr -34 /* Anchor point is outside the mask. */
+#define ippStsMaskSizeErr -33 /* Invalid mask size. */
+#define ippStsShiftErr -32 /* Shift value is less than zero. */
+#define ippStsSampleFactorErr -31 /* Sampling factor is less than,or equal to zero. */
+#define ippStsSamplePhaseErr -30 /* Phase value is out of range: 0 <= phase < factor. */
+#define ippStsFIRMRFactorErr -29 /* MR FIR sampling factor is less than, or equal to zero. */
+#define ippStsFIRMRPhaseErr -28 /* MR FIR sampling phase is negative, or greater than, or equal to the sampling factor. */
+#define ippStsRelFreqErr -27 /* Relative frequency value is out of range. */
+#define ippStsFIRLenErr -26 /* Length of a FIR filter is less than, or equal to zero. */
+#define ippStsIIROrderErr -25 /* Order of an IIR filter is not valid. */
+#define ippStsResizeFactorErr -24 /* Resize factor(s) is less than, or equal to zero. */
+#define ippStsInterpolationErr -23 /* Invalid interpolation mode. */
+#define ippStsMirrorFlipErr -22 /* Invalid flip mode. */
+#define ippStsMoment00ZeroErr -21 /* Moment value M(0,0) is too small to continue calculations. */
+#define ippStsThreshNegLevelErr -20 /* Negative value of the level in the threshold operation. */
+#define ippStsThresholdErr -19 /* Invalid threshold bounds. */
+#define ippStsFftFlagErr -18 /* Invalid value for the FFT flag parameter. */
+#define ippStsFftOrderErr -17 /* Invalid value for the FFT order parameter. */
+#define ippStsStepErr -16 /* Step value is not valid. */
+
+#ifndef IPPSTATUS_H__
+#define IPPSTATUS_H__
+typedef signed int IppStatus;
+ /* start of common with ippCrypto part - any changes MUST be done in both repositories - IPP & ippCrypto */
+ #define ippStsLoadDynErr -221 /* Error when loading the dynamic library. */
+ #define ippStsLengthErr -15 /* Incorrect value for string length. */
+ #define ippStsNotSupportedModeErr -14 /* The requested mode is currently not supported. */
+ #define ippStsContextMatchErr -13 /* Context parameter does not match the operation. */
+ #define ippStsScaleRangeErr -12 /* Scale bounds are out of range. */
+ #define ippStsOutOfRangeErr -11 /* Argument is out of range, or point is outside the image. */
+ #define ippStsDivByZeroErr -10 /* An attempt to divide by zero. */
+ #define ippStsMemAllocErr -9 /* Memory allocated for the operation is not enough.*/
+ #define ippStsNullPtrErr -8 /* Null pointer error. */
+ #define ippStsRangeErr -7 /* Incorrect values for bounds: the lower bound is greater than the upper bound. */
+ #define ippStsSizeErr -6 /* Incorrect value for data size. */
+ #define ippStsBadArgErr -5 /* Incorrect arg/param of the function. */
+ #define ippStsNoMemErr -4 /* Not enough memory for the operation. */
+ #define ippStsErr -2 /* Unknown/unspecified error */
+ /* no errors */
+ #define ippStsNoErr 0 /* No errors. */
+ /* warnings */
+ #define ippStsNoOperation 1 /* No operation has been executed. */
+ #define ippStsDivByZero 2 /* Zero value(s) for the divisor in the Div function. */
+ #define ippStsWaterfall 43 /* Cannot load required library, waterfall is used. */
+ /* end of common with ippCrypto part */
+#endif /* IPPSTATUS_H__ */
+
+#define ippStsSqrtNegArg 3 /* Negative value(s) for the argument in the Sqrt function. */
+#define ippStsInvZero 4 /* INF result. Zero value was met by InvThresh with zero level. */
+#define ippStsEvenMedianMaskSize 5 /* Even size of the Median Filter mask was replaced with the odd one. */
+#define ippStsLnZeroArg 7 /* Zero value(s) for the argument in the Ln function. */
+#define ippStsLnNegArg 8 /* Negative value(s) for the argument in the Ln function. */
+#define ippStsNanArg 9 /* Argument value is not a number. */
+#define ippStsOverflow 12 /* Overflow in the operation. */
+#define ippStsUnderflow 17 /* Underflow in the operation. */
+#define ippStsSingularity 18 /* Singularity in the operation. */
+#define ippStsDomain 19 /* Argument is out of the function domain.*/
+#define ippStsNonIntelCpu 20 /* The target CPU is not Genuine Intel. */
+#define ippStsCpuMismatch 21 /* Cannot set the library for the given CPU. */
+#define ippStsOvermuchStrings 26 /* Number of destination strings is more than expected. */
+#define ippStsOverlongString 27 /* Length of one of the destination strings is more than expected. */
+#define ippStsAffineQuadChanged 28 /* 4th vertex of destination quad is not equal to customer's one. */
+#define ippStsWrongIntersectROI 29 /* ROI has no intersection with the source or destination ROI. No operation. */
+#define ippStsWrongIntersectQuad 30 /* Quadrangle has no intersection with the source or destination ROI. No operation. */
+#define ippStsSrcSizeLessExpected 32 /* DC: Size of the source buffer is less than the expected one.*/
+#define ippStsDstSizeLessExpected 33 /* DC: Size of the destination buffer is less than the expected one. */
+#define ippStsDoubleSize 35 /* Width or height of image is odd. */
+#define ippStsNotSupportedCpu 36 /* The CPU is not supported. */
+#define ippStsUnknownCacheSize 37 /* The CPU is supported, but the size of the cache is unknown. */
+#define ippStsSymKernelExpected 38 /* The Kernel is not symmetric. */
+#define ippStsEvenMedianWeight 39 /* Even weight of the Weighted Median Filter is replaced with the odd one. */
+#define ippStsWrongIntersectVOI 40 /* VOI has no intersection with the source or destination volume. No operation. */
+#define ippStsNoAntialiasing 46 /* The mode does not support antialiasing. */
+#define ippStsRepetitiveSrcData 47 /* DC: The source data is too repetitive.*/
+#define ippStsSizeWrn 48 /* The size does not allow to perform full operation. */
+#define ippStsFeatureNotSupported 49 /* Current CPU doesn't support at least 1 of the desired features. */
+#define ippStsUnknownFeature 50 /* At least one of the desired features is unknown. */
+#define ippStsFeaturesCombination 51 /* Wrong combination of features. */
+#define ippStsAccurateModeNotSupported 52/* Accurate mode is not supported. */
+
+#define ippStsOk ippStsNoErr
+
+#endif
+
+#define ippRectInfinite ippiWarpGetRectInfinite()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IPPTYPES_H__ */
diff --git a/ext/ipp/ippcp.parts b/ext/ipp/ippcp.parts
new file mode 100644
index 0000000..dd0e0d4
--- /dev/null
+++ b/ext/ipp/ippcp.parts
@@ -0,0 +1,131 @@
+############################################################################
+# Copyright 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+Import('*')
+
+import os
+
+env.PartVersion("2018.2.208")
+env.PartName("ippcp")
+ipp_libname = '${PART_SHORT_NAME}'
+
+#includes to install
+install_headers = Pattern(src_dir='include/',
+ includes=[
+ 'ippcp.h',
+ 'ippcpdefs.h',
+ 'ippdefs.h',
+ 'ippbase.h',
+ 'ipptypes.h'
+ ],
+ excludes=[],
+ recursive=True)
+source_headers = Pattern(src_dir='sources/include/',
+ includes=['*'],
+ excludes=[],
+ recursive=True)
+# common headers, for SdkInclude
+common_headers = Pattern(src_dir='include/',
+ includes=['ippdefs.h',
+ 'ippbase.h',
+ 'ipptypes.h'],
+ excludes=[],
+ recursive=True)
+#files
+ippcp_files = Pattern(src_dir='sources/ippcp/src/',
+ includes=[
+ '*.c',
+ ],
+ excludes=[],
+ recursive=True)
+
+ippdir = ''
+
+#prebuild installs prebuild headers instead of src headers.
+#internal ipp includes src/primitives/ipp/
+env.Append(CPPPATH=[AbsDir('sources/include/')])
+
+# env.Append(CPPDEFINES = '_IPP_BE') #only for BE targets
+
+#internal ipp includes src/primitives/ipp/
+env.Append(CPPPATH=[AbsDir('include/')])
+env.Append(CPPPATH=[AbsDir('sources/ippcp/src/')])
+#ipp defines
+env.Append(CPPDEFINES='_IPP_v50_') #required for all ippcp
+
+env.Append(CPPDEFINES='_IPP_DEBUG') #enable function sanity checking
+
+env.Append(CPPDEFINES=['_DISABLE_ALG_MD5_',
+ '_DISABLE_ALG_SM3_']) #disable unused hash alg
+
+env.ExportCPPPATH([AbsDir('sources/include/')])
+
+if 'install_package' in env['MODE']:
+ # All files at /ext/ipp/source/include
+ env.InstallTopLevel(install_headers, sub_dir='ext/ipp/include')
+ src_files = Pattern(src_dir='sources/ippcp/src/',
+ includes=['*'],
+ excludes=[''],
+ recursive=True)
+ env.InstallTopLevel(src_files, sub_dir='ext/ipp/sources/ippcp/src')
+ this_file = Pattern(src_dir='.',
+ includes=['ippcp.parts'],
+ excludes=[],
+ recursive=True)
+ env.InstallTopLevel(this_file, sub_dir='ext/ipp/')
+ makefile = Pattern(src_dir='./sources/ippcp',
+ includes=['Makefile'],
+ excludes=[],
+ recursive=True)
+ env.InstallTopLevel(makefile, sub_dir='ext/ipp/sources/ippcp')
+ env.InstallTopLevel(source_headers, sub_dir='ext/ipp/sources/include')
+else:
+ env.SdkInclude(install_headers)
+ env.SdkInclude(common_headers)
+ if 'use_commercial_ipp' in env['MODE']:
+ env['CCOPY_LOGIC'] = 'copy'
+ try:
+ IPPCRYPTOROOT = os.environ['IPPCRYPTOROOT']
+ except KeyError, e:
+ env.PrintError("Necessary environment variable not set: ",
+ e, show_stack=False)
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ libpre = ''
+ libpost = '.lib'
+ IPP_TH_SYMBOL = 'mt'
+ else:
+ libpre = 'lib'
+ libpost = '.a'
+ IPP_TH_SYMBOL = ''
+ if env['TARGET_PLATFORM']['ARCH'] == 'x86':
+ archdir = 'ia32/'
+ else:
+ archdir = 'intel64/'
+
+ ippcp_libname = libpre + 'ippcp' + IPP_TH_SYMBOL + libpost
+ ippcp_libdir = IPPCRYPTOROOT + '/lib/' + archdir
+ env.SdkLib(ippcp_libdir + ippcp_libname)
+
+ else:
+ all_c_files = ippcp_files.files()
+ if 'build_ipp_shared' in env['MODE']:
+ env.Append(CPPDEFINES=['IPP_W32DLL'])
+ outputs = env.SharedLibrary(ipp_libname, all_c_files)
+ env.InstallTarget(outputs)
+ else:
+ outputs = env.Library(ipp_libname, all_c_files)
+ env.SdkLib(outputs)
+ if 'install_lib' in env['MODE']:
+ env.InstallLib(outputs)
diff --git a/ext/ipp/sources/include/owndefs.h b/ext/ipp/sources/include/owndefs.h
new file mode 100644
index 0000000..a719059
--- /dev/null
+++ b/ext/ipp/sources/include/owndefs.h
@@ -0,0 +1,926 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+#ifndef __OWNDEFS_H__
+#define __OWNDEFS_H__
+
+#if defined( _VXWORKS )
+ #include <vxWorks.h>
+ #undef NONE
+#endif
+
+#include "ippdefs.h"
+
+#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
+ #define __INLINE static __inline
+#elif defined( __GNUC__ )
+ #define __INLINE static __inline__
+#else
+ #define __INLINE static
+#endif
+
+#if defined(__INTEL_COMPILER)
+ #define __RESTRICT restrict
+#elif !defined( __RESTRICT )
+ #define __RESTRICT
+#endif
+
+#if defined( IPP_W32DLL )
+ #if defined( _MSC_VER ) || defined( __INTEL_COMPILER )
+ #define IPPDEF(type) __declspec(dllexport) type
+ #else
+ #define IPPDEF(type) type
+ #endif
+#else
+ #define IPPDEF(type) type
+#endif
+
+/* structure represeting 128 bit unsigned integer type */
+
+typedef struct{
+ Ipp64u low;
+ Ipp64u high;
+}Ipp128u;
+
+#define _IPP_PX 0 /* pure C-code ia32 */
+#define _IPP_M5 1 /* Quark (Pentium) - x86+x87 ia32 */
+#define _IPP_M6 2 /* Pentium MMX - MMX ia32 */
+#define _IPP_A6 4 /* Pentium III - SSE ia32 */
+#define _IPP_W7 8 /* Pentium 4 - SSE2 ia32 */
+#define _IPP_T7 16 /* Pentium with x64 support (Nocona) - SSE3 ia32 */
+#define _IPP_V8 32 /* Merom - SSSE3 ia32 */
+#define _IPP_S8 33 /* Atom - SSSE3 ia32 (Silverthorne)+MOVBE */
+#define _IPP_P8 64 /* Penryn - SSE4.1 + tick for SSE4.2 ia32 */
+#define _IPP_G9 128 /* SandyBridge (GSSE) - AVX ia32 */
+#define _IPP_H9 256 /* Haswell (AVX2) ia32 */
+#define _IPP_I0 512 /* KNL (AVX-512) ia32 */
+#define _IPP_S0 1024 /* SkyLake Xeon (AVX-512) ia32 */
+
+#define _IPPXSC_PX 0
+#define _IPPXSC_S1 1
+#define _IPPXSC_S2 2
+#define _IPPXSC_C2 4
+
+#define _IPPLRB_PX 0
+#define _IPPLRB_B1 1
+#define _IPPLRB_B2 2
+
+#define _IPP64_PX _IPP_PX
+#define _IPP64_I7 64
+
+#define _IPP32E_PX _IPP_PX /* pure C-code x64 */
+#define _IPP32E_M7 32 /* Pentium with x64 support (Nocona) - SSE3 x64 */
+#define _IPP32E_U8 64 /* Merom - SSSE3 x64 */
+#define _IPP32E_N8 65 /* Atom - SSSE3 x64 (Silverthorne)+MOVBE */
+#define _IPP32E_Y8 128 /* Penryn - SSE4.1 + tick for SSE4.2 x64 */
+#define _IPP32E_E9 256 /* SandyBridge (GSSE) - AVX x64 */
+#define _IPP32E_L9 512 /* Haswell (AVX2) x64 */
+#define _IPP32E_N0 1024 /* KNL (AVX-512) x64 */
+#define _IPP32E_K0 2048 /* SkyLake Xeon (AVX-512) x64 */
+
+
+#if defined(__INTEL_COMPILER) || (_MSC_VER >= 1300)
+ #define __ALIGN8 __declspec (align(8))
+ #define __ALIGN16 __declspec (align(16))
+ #define __ALIGN32 __declspec (align(32))
+ #define __ALIGN64 __declspec (align(64))
+#elif defined(__GNUC__)
+ #define __ALIGN8 __attribute__((aligned(8)))
+ #define __ALIGN16 __attribute__((aligned(16)))
+ #define __ALIGN32 __attribute__((aligned(32)))
+ #define __ALIGN64 __attribute__((aligned(64)))
+#else
+ #error Intel, MS or GNU C compiler required
+#endif
+
+#if defined ( _M5 ) /* Quark (Pentium) - x86+x87 ia32 */
+ #define _IPP _IPP_M5
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) m5_##name
+
+#elif defined ( _M6 ) /* Pentium MMX - MMX ia32 */
+ #define _IPP _IPP_M6
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) m6_##name
+
+#elif defined( _A6 ) /* Pentium III - SSE ia32 */
+ #define _IPP _IPP_A6
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) a6_##name
+
+#elif defined( _W7 ) /* Pentium 4 - SSE2 ia32 */
+ #define _IPP _IPP_W7
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) w7_##name
+
+#elif defined( _T7 ) /* Pentium with x64 support (Nocona) - SSE3 ia32 */
+ #define _IPP _IPP_T7
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) t7_##name
+
+#elif defined( _V8 ) /* Merom - SSSE3 ia32 */
+ #define _IPP _IPP_V8
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) v8_##name
+
+#elif defined( _S8 ) /* old Atom (SSSE3+movbe) (Silverthorne) ia32 */
+ #define _IPP _IPP_S8
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) s8_##name
+
+#elif defined( _P8 ) /* Penryn - SSE4.1 + tick for SSE4.2 ia32 */
+ #define _IPP _IPP_P8
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) p8_##name
+
+#elif defined( _G9 ) /* SandyBridge (GSSE) - AVX ia32 */
+ #define _IPP _IPP_G9
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) g9_##name
+
+#elif defined( _H9 ) /* Haswell (AVX2) ia32 */
+ #define _IPP _IPP_H9
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) h9_##name
+
+#elif defined( _M7 ) /* Pentium with x64 support (Nocona) - SSE3 x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_M7
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) m7_##name
+
+#elif defined( _U8 ) /* Merom - SSSE3 x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_U8
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) u8_##name
+
+#elif defined( _N8 ) /* old Atom (SSSE3+movbe) (Silverthorne) x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_N8
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) n8_##name
+
+#elif defined( _Y8 ) /* Penryn - SSE4.1 + tick for SSE4.2 x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_Y8
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) y8_##name
+
+#elif defined( _E9 ) /* SandyBridge (GSSE) - AVX x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_E9
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) e9_##name
+
+#elif defined( _L9 ) /* Haswell (AVX2) x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_L9
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) l9_##name
+
+#elif defined( _N0 ) /* KNL (AVX-512) x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_N0
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) n0_##name
+
+#elif defined( _K0 ) /* SkyLake Xeon (AVX-512) x64 */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_K0
+ #define _IPPLRB _IPPLRB_PX
+ #define OWNAPI(name) k0_##name
+
+#elif defined( _B2 ) /* KNC (MIC) */
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_B2
+ #define OWNAPI(name) b2_##name
+
+#else
+ #define _IPP _IPP_PX
+ #define _IPP32E _IPP32E_PX
+ #define _IPPLRB _IPPLRB_PX
+ #if defined (_M_AMD64) || defined (__x86_64__) || defined ( _ARCH_EM64T )
+ #define OWNAPI(name) mx_##name
+ #else
+ #define OWNAPI(name) px_##name
+ #endif
+#endif
+
+#ifndef _OWN_MERGED_BLD
+ #undef OWNAPI
+ #define OWNAPI(name) name
+#endif
+
+ #if defined( IPP_W32DLL )
+ #if defined( _MSC_VER ) || defined( __INTEL_COMPILER )
+ #define IPPFUN(type,name,arg) __declspec(dllexport) type IPP_STDCALL name arg
+ #else
+ #define IPPFUN(type,name,arg) extern type IPP_STDCALL name arg
+ #endif
+ #else
+ #define IPPFUN(type,name,arg) extern type IPP_STDCALL name arg
+ #endif
+
+#define _IPP_ARCH_IA32 1
+#define _IPP_ARCH_IA64 2
+#define _IPP_ARCH_EM64T 4
+#define _IPP_ARCH_XSC 8
+#define _IPP_ARCH_LRB 16
+#define _IPP_ARCH_LRB2 128
+
+#if defined ( _ARCH_IA32 )
+ #define _IPP_ARCH _IPP_ARCH_IA32
+
+#elif defined( _ARCH_EM64T )
+ #define _IPP_ARCH _IPP_ARCH_EM64T
+
+#elif defined( _ARCH_LRB2 )
+ #define _IPP_ARCH _IPP_ARCH_LRB2
+
+#else
+ #if defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__)
+ #define _IPP_ARCH _IPP_ARCH_EM64T
+
+ #else
+ #define _IPP_ARCH _IPP_ARCH_IA32
+
+ #endif
+#endif
+
+#if ((_IPP_ARCH == _IPP_ARCH_IA32))
+__INLINE
+Ipp32s IPP_INT_PTR( const void* ptr ) {
+ union {
+ void* Ptr;
+ Ipp32s Int;
+ } dd;
+ dd.Ptr = (void*)ptr;
+ return dd.Int;
+}
+
+__INLINE
+Ipp32u IPP_UINT_PTR( const void* ptr ) {
+ union {
+ void* Ptr;
+ Ipp32u Int;
+ } dd;
+ dd.Ptr = (void*)ptr;
+ return dd.Int;
+}
+#elif ((_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LRB2))
+__INLINE
+Ipp64s IPP_INT_PTR( const void* ptr ) {
+ union {
+ void* Ptr;
+ Ipp64s Int;
+ } dd;
+ dd.Ptr = (void*)ptr;
+ return dd.Int;
+}
+
+__INLINE
+Ipp64u IPP_UINT_PTR( const void* ptr ) {
+ union {
+ void* Ptr;
+ Ipp64u Int;
+ } dd;
+ dd.Ptr = (void*)ptr;
+ return dd.Int;
+}
+#else
+ #define IPP_INT_PTR( ptr ) ( (long)(ptr) )
+ #define IPP_UINT_PTR( ptr ) ( (unsigned long)(ptr) )
+#endif
+
+#define IPP_ALIGN_TYPE(type, align) ((align)/sizeof(type)-1)
+#define IPP_BYTES_TO_ALIGN(ptr, align) ((-(IPP_INT_PTR(ptr)&((align)-1)))&((align)-1))
+#define IPP_ALIGNED_PTR(ptr, align) (void*)( (unsigned char*)(ptr) + (IPP_BYTES_TO_ALIGN( ptr, align )) )
+
+#define IPP_ALIGNED_SIZE(size, align) (((size)+(align)-1)&~((align)-1))
+
+#define IPP_MALLOC_ALIGNED_BYTES 64
+#define IPP_MALLOC_ALIGNED_8BYTES 8
+#define IPP_MALLOC_ALIGNED_16BYTES 16
+#define IPP_MALLOC_ALIGNED_32BYTES 32
+
+#define IPP_ALIGNED_ARRAY(align,arrtype,arrname,arrlength)\
+ char arrname##AlignedArrBuff[sizeof(arrtype)*(arrlength)+IPP_ALIGN_TYPE(char, align)];\
+ arrtype *arrname = (arrtype*)IPP_ALIGNED_PTR(arrname##AlignedArrBuff,align)
+
+#if defined( __cplusplus )
+extern "C" {
+#endif
+
+/* /////////////////////////////////////////////////////////////////////////////
+
+ IPP Context Identification
+
+ /////////////////////////////////////////////////////////////////////////// */
+
+#define IPP_CONTEXT( a, b, c, d) \
+ (int)(((unsigned)(a) << 24) | ((unsigned)(b) << 16) | \
+ ((unsigned)(c) << 8) | (unsigned)(d))
+
+typedef enum {
+ idCtxUnknown = 0,
+ idCtxFFT_C_16sc,
+ idCtxFFT_C_16s,
+ idCtxFFT_R_16s,
+ idCtxFFT_C_32fc,
+ idCtxFFT_C_32f,
+ idCtxFFT_R_32f,
+ idCtxFFT_C_64fc,
+ idCtxFFT_C_64f,
+ idCtxFFT_R_64f,
+ idCtxDFT_C_16sc,
+ idCtxDFT_C_16s,
+ idCtxDFT_R_16s,
+ idCtxDFT_C_32fc,
+ idCtxDFT_C_32f,
+ idCtxDFT_R_32f,
+ idCtxDFT_C_64fc,
+ idCtxDFT_C_64f,
+ idCtxDFT_R_64f,
+ idCtxDCTFwd_16s,
+ idCtxDCTInv_16s,
+ idCtxDCTFwd_32f,
+ idCtxDCTInv_32f,
+ idCtxDCTFwd_64f,
+ idCtxDCTInv_64f,
+ idCtxFFT2D_C_32fc,
+ idCtxFFT2D_R_32f,
+ idCtxDFT2D_C_32fc,
+ idCtxDFT2D_R_32f,
+ idCtxFFT2D_R_32s,
+ idCtxDFT2D_R_32s,
+ idCtxDCT2DFwd_32f,
+ idCtxDCT2DInv_32f,
+ idCtxMoment64f,
+ idCtxMoment64s,
+ idCtxRandUni_8u,
+ idCtxRandUni_16s,
+ idCtxRandUni_32f,
+ idCtxRandUni_64f,
+ idCtxRandGauss_8u,
+ idCtxRandGauss_16s,
+ idCtxRandGauss_32f,
+ idCtxRandGauss_64f,
+ idCtxWTFwd_32f,
+ idCtxWTFwd_8u32f,
+ idCtxWTFwd_8s32f,
+ idCtxWTFwd_16u32f,
+ idCtxWTFwd_16s32f,
+ idCtxWTFwd2D_32f_C1R,
+ idCtxWTInv2D_32f_C1R,
+ idCtxWTFwd2D_32f_C3R,
+ idCtxWTInv2D_32f_C3R,
+ idCtxWTInv_32f,
+ idCtxWTInv_32f8u,
+ idCtxWTInv_32f8s,
+ idCtxWTInv_32f16u,
+ idCtxWTInv_32f16s,
+ idCtxMDCTFwd_32f,
+ idCtxMDCTInv_32f,
+ idCtxMDCTFwd_16s,
+ idCtxFIRBlock_32f,
+ idCtxFDP_32f,
+ idCtxRLMS_32f = IPP_CONTEXT( 'L', 'M', 'S', '1'),
+ idCtxRLMS32f_16s = IPP_CONTEXT( 'L', 'M', 'S', 0 ),
+ idCtxIIRAR_32f = IPP_CONTEXT( 'I', 'I', '0', '1'),
+ idCtxIIRBQ_32f = IPP_CONTEXT( 'I', 'I', '0', '2'),
+ idCtxIIRAR_32fc = IPP_CONTEXT( 'I', 'I', '0', '3'),
+ idCtxIIRBQ_32fc = IPP_CONTEXT( 'I', 'I', '0', '4'),
+ idCtxIIRAR32f_16s = IPP_CONTEXT( 'I', 'I', '0', '5'),
+ idCtxIIRBQ32f_16s = IPP_CONTEXT( 'I', 'I', '0', '6'),
+ idCtxIIRAR32fc_16sc = IPP_CONTEXT( 'I', 'I', '0', '7'),
+ idCtxIIRBQ32fc_16sc = IPP_CONTEXT( 'I', 'I', '0', '8'),
+ idCtxIIRAR32s_16s = IPP_CONTEXT( 'I', 'I', '0', '9'),
+ idCtxIIRBQ32s_16s = IPP_CONTEXT( 'I', 'I', '1', '0'),
+ idCtxIIRAR32sc_16sc = IPP_CONTEXT( 'I', 'I', '1', '1'),
+ idCtxIIRBQ32sc_16sc = IPP_CONTEXT( 'I', 'I', '1', '2'),
+ idCtxIIRAR_64f = IPP_CONTEXT( 'I', 'I', '1', '3'),
+ idCtxIIRBQ_64f = IPP_CONTEXT( 'I', 'I', '1', '4'),
+ idCtxIIRAR_64fc = IPP_CONTEXT( 'I', 'I', '1', '5'),
+ idCtxIIRBQ_64fc = IPP_CONTEXT( 'I', 'I', '1', '6'),
+ idCtxIIRAR64f_32f = IPP_CONTEXT( 'I', 'I', '1', '7'),
+ idCtxIIRBQ64f_32f = IPP_CONTEXT( 'I', 'I', '1', '8'),
+ idCtxIIRAR64fc_32fc = IPP_CONTEXT( 'I', 'I', '1', '9'),
+ idCtxIIRBQ64fc_32fc = IPP_CONTEXT( 'I', 'I', '2', '0'),
+ idCtxIIRAR64f_32s = IPP_CONTEXT( 'I', 'I', '2', '1'),
+ idCtxIIRBQ64f_32s = IPP_CONTEXT( 'I', 'I', '2', '2'),
+ idCtxIIRAR64fc_32sc = IPP_CONTEXT( 'I', 'I', '2', '3'),
+ idCtxIIRBQ64fc_32sc = IPP_CONTEXT( 'I', 'I', '2', '4'),
+ idCtxIIRAR64f_16s = IPP_CONTEXT( 'I', 'I', '2', '5'),
+ idCtxIIRBQ64f_16s = IPP_CONTEXT( 'I', 'I', '2', '6'),
+ idCtxIIRAR64fc_16sc = IPP_CONTEXT( 'I', 'I', '2', '7'),
+ idCtxIIRBQ64fc_16sc = IPP_CONTEXT( 'I', 'I', '2', '8'),
+ idCtxIIRBQDF1_32f = IPP_CONTEXT( 'I', 'I', '2', '9'),
+ idCtxIIRBQDF164f_32s= IPP_CONTEXT( 'I', 'I', '3', '0'),
+ idCtxFIRSR_32f = IPP_CONTEXT( 'F', 'I', '0', '1'),
+ idCtxFIRSR_32fc = IPP_CONTEXT( 'F', 'I', '0', '2'),
+ idCtxFIRMR_32f = IPP_CONTEXT( 'F', 'I', '0', '3'),
+ idCtxFIRMR_32fc = IPP_CONTEXT( 'F', 'I', '0', '4'),
+ idCtxFIRSR32f_16s = IPP_CONTEXT( 'F', 'I', '0', '5'),
+ idCtxFIRSR32fc_16sc = IPP_CONTEXT( 'F', 'I', '0', '6'),
+ idCtxFIRMR32f_16s = IPP_CONTEXT( 'F', 'I', '0', '7'),
+ idCtxFIRMR32fc_16sc = IPP_CONTEXT( 'F', 'I', '0', '8'),
+ idCtxFIRSR32s_16s = IPP_CONTEXT( 'F', 'I', '0', '9'),
+ idCtxFIRSR32sc_16sc = IPP_CONTEXT( 'F', 'I', '1', '0'),
+ idCtxFIRMR32s_16s = IPP_CONTEXT( 'F', 'I', '1', '1'),
+ idCtxFIRMR32sc_16sc = IPP_CONTEXT( 'F', 'I', '1', '2'),
+ idCtxFIRSR_64f = IPP_CONTEXT( 'F', 'I', '1', '3'),
+ idCtxFIRSR_64fc = IPP_CONTEXT( 'F', 'I', '1', '4'),
+ idCtxFIRMR_64f = IPP_CONTEXT( 'F', 'I', '1', '5'),
+ idCtxFIRMR_64fc = IPP_CONTEXT( 'F', 'I', '1', '6'),
+ idCtxFIRSR64f_32f = IPP_CONTEXT( 'F', 'I', '1', '7'),
+ idCtxFIRSR64fc_32fc = IPP_CONTEXT( 'F', 'I', '1', '8'),
+ idCtxFIRMR64f_32f = IPP_CONTEXT( 'F', 'I', '1', '9'),
+ idCtxFIRMR64fc_32fc = IPP_CONTEXT( 'F', 'I', '2', '0'),
+ idCtxFIRSR64f_32s = IPP_CONTEXT( 'F', 'I', '2', '1'),
+ idCtxFIRSR64fc_32sc = IPP_CONTEXT( 'F', 'I', '2', '2'),
+ idCtxFIRMR64f_32s = IPP_CONTEXT( 'F', 'I', '2', '3'),
+ idCtxFIRMR64fc_32sc = IPP_CONTEXT( 'F', 'I', '2', '4'),
+ idCtxFIRSR64f_16s = IPP_CONTEXT( 'F', 'I', '2', '5'),
+ idCtxFIRSR64fc_16sc = IPP_CONTEXT( 'F', 'I', '2', '6'),
+ idCtxFIRMR64f_16s = IPP_CONTEXT( 'F', 'I', '2', '7'),
+ idCtxFIRMR64fc_16sc = IPP_CONTEXT( 'F', 'I', '2', '8'),
+ idCtxFIRSR_16s = IPP_CONTEXT( 'F', 'I', '2', '9'),
+ idCtxFIRMR_16s = IPP_CONTEXT( 'F', 'I', '3', '0'),
+ idCtxFIRSRStream_16s= IPP_CONTEXT( 'F', 'I', '3', '1'),
+ idCtxFIRMRStream_16s= IPP_CONTEXT( 'F', 'I', '3', '2'),
+ idCtxFIRSRStream_32f= IPP_CONTEXT( 'F', 'I', '3', '3'),
+ idCtxFIRMRStream_32f= IPP_CONTEXT( 'F', 'I', '3', '4'),
+ idCtxFIRMR32f_32fc = IPP_CONTEXT( 'F', 'I', '3', '5'),
+ idCtxRLMS32s_16s = IPP_CONTEXT( 'L', 'M', 'S', 'R'),
+ idCtxCLMS32s_16s = IPP_CONTEXT( 'L', 'M', 'S', 'C'),
+ idCtxEncode_JPEG2K,
+ idCtxDES = IPP_CONTEXT( ' ', 'D', 'E', 'S'),
+ idCtxBlowfish = IPP_CONTEXT( ' ', ' ', 'B', 'F'),
+ idCtxRijndael = IPP_CONTEXT( ' ', 'R', 'I', 'J'),
+ idCtxSMS4 = IPP_CONTEXT( 'S', 'M', 'S', '4'),
+ idCtxTwofish = IPP_CONTEXT( ' ', ' ', 'T', 'F'),
+ idCtxARCFOUR = IPP_CONTEXT( ' ', 'R', 'C', '4'),
+ idCtxRC564 = IPP_CONTEXT( 'R', 'C', '5', '1'),
+ idCtxRC5128 = IPP_CONTEXT( 'R', 'C', '5', '2'),
+ idCtxSHA1 = IPP_CONTEXT( 'S', 'H', 'S', '1'),
+ idCtxSHA224 = IPP_CONTEXT( 'S', 'H', 'S', '3'),
+ idCtxSHA256 = IPP_CONTEXT( 'S', 'H', 'S', '2'),
+ idCtxSHA384 = IPP_CONTEXT( 'S', 'H', 'S', '4'),
+ idCtxSHA512 = IPP_CONTEXT( 'S', 'H', 'S', '5'),
+ idCtxMD5 = IPP_CONTEXT( ' ', 'M', 'D', '5'),
+ idCtxHMAC = IPP_CONTEXT( 'H', 'M', 'A', 'C'),
+ idCtxDAA = IPP_CONTEXT( ' ', 'D', 'A', 'A'),
+ idCtxBigNum = IPP_CONTEXT( 'B', 'I', 'G', 'N'),
+ idCtxMontgomery = IPP_CONTEXT( 'M', 'O', 'N', 'T'),
+ idCtxPrimeNumber = IPP_CONTEXT( 'P', 'R', 'I', 'M'),
+ idCtxPRNG = IPP_CONTEXT( 'P', 'R', 'N', 'G'),
+ idCtxRSA = IPP_CONTEXT( ' ', 'R', 'S', 'A'),
+ idCtxRSA_PubKey = IPP_CONTEXT( 'R', 'S', 'A', '0'),
+ idCtxRSA_PrvKey1 = IPP_CONTEXT( 'R', 'S', 'A', '1'),
+ idCtxRSA_PrvKey2 = IPP_CONTEXT( 'R', 'S', 'A', '2'),
+ idCtxDSA = IPP_CONTEXT( ' ', 'D', 'S', 'A'),
+ idCtxECCP = IPP_CONTEXT( ' ', 'E', 'C', 'P'),
+ idCtxECCB = IPP_CONTEXT( ' ', 'E', 'C', 'B'),
+ idCtxECCPPoint = IPP_CONTEXT( 'P', 'E', 'C', 'P'),
+ idCtxECCBPoint = IPP_CONTEXT( 'P', 'E', 'C', 'B'),
+ idCtxDH = IPP_CONTEXT( ' ', ' ', 'D', 'H'),
+ idCtxDLP = IPP_CONTEXT( ' ', 'D', 'L', 'P'),
+ idCtxCMAC = IPP_CONTEXT( 'C', 'M', 'A', 'C'),
+ idCtxRFFT2_8u,
+ idCtxHilbert_32f32fc,
+ idCtxHilbert_16s32fc,
+ idCtxHilbert_16s16sc,
+ idCtxTone_16s,
+ idCtxTriangle_16s,
+ idCtxDFTOutOrd_C_32fc,
+ idCtxDFTOutOrd_C_64fc,
+ idCtxFFT_C_32sc,
+ idCtxFFT_C_32s,
+ idCtxFFT_R_32s,
+ idCtxFFT_R_16s32s,
+ idCtxDecodeProgr_JPEG2K,
+ idCtxWarp_MPEG4,
+ idCtxQuantInvIntra_MPEG4,
+ idCtxQuantInvInter_MPEG4,
+ idCtxQuantIntra_MPEG4,
+ idCtxQuantInter_MPEG4,
+ idCtxAnalysisFilter_SBR_C_32f32fc,
+ idCtxAnalysisFilter_SBR_C_32f,
+ idCtxAnalysisFilter_SBR_R_32f,
+ idCtxSynthesisFilter_SBR_C_32fc32f,
+ idCtxSynthesisFilter_SBR_C_32f,
+ idCtxSynthesisFilter_SBR_R_32f,
+ idCtxSynthesisDownFilter_SBR_C_32fc32f,
+ idCtxSynthesisDownFilter_SBR_C_32f,
+ idCtxSynthesisDownFilter_SBR_R_32f,
+ idCtxVLCEncode,
+ idCtxVLCDecode,
+ idCtxAnalysisFilter_SBR_C_32s32sc,
+ idCtxAnalysisFilter_SBR_R_32s,
+ idCtxSynthesisFilter_SBR_C_32sc32s,
+ idCtxSynthesisFilter_SBR_R_32s,
+ idCtxSynthesisDownFilter_SBR_C_32sc32s,
+ idCtxSynthesisDownFilter_SBR_R_32s,
+ idCtxSynthesisFilter_PQMF_MP3_32f,
+ idCtxAnalysisFilter_PQMF_MP3_32f,
+ idCtxResampleRow,
+ idCtxAnalysisFilter_SBR_Enc_C_32f32fc,
+ idCtxSynthesisFilter_DTS_32f,
+ idCtxFilterBilateralGauss_8u,
+ idCtxFilterBilateralGaussFast_8u,
+ idCtxBGF,
+ idCtxPolyGF,
+ idCtxRSenc,
+ idCtxRSdec,
+ idCtxSnow3g = IPP_CONTEXT( 'S', 'n', 'o', 'w'),
+ idCtxSnow3gF8,
+ idCtxSnow3gF9,
+ idCtxKasumi = IPP_CONTEXT( 'K', 'a', 's', 'u'),
+ idCtxKasumiF8,
+ idCtxKasumiF9,
+ idCtxResizeHannFilter_8u,
+ idCtxResizeLanczosFilter_8u,
+ idCtxAESXCBC,
+ idCtxAESCCM,
+ idCtxAESGCM,
+ idCtxMsgCatalog,
+ idCtxGFP,
+ idCtxGFPE,
+ idCtxGFPX,
+ idCtxGFPXE,
+ idCtxGFPXQX,
+ idCtxGFPXQXE,
+ idCtxGFPEC,
+ idCtxGFPPoint,
+ idCtxGFPXEC,
+ idCtxGFPXECPoint,
+ idCtxPairing,
+ idCtxResize,
+ idCtxResizeYUV420,
+ idCtxResizeYUV422,
+ idCtxResize_L,
+ idCtxFilterBilateralBorder,
+ idCtxThresholdAdaptiveGauss,
+ idCtxHOG,
+ idCtxFastN,
+ idCtxHash,
+ idCtxSM3,
+ idCtxAESXTS,
+ idCtxWarpAffine,
+ idCtxWarpAffine_L,
+ idCtxWarpPerspective,
+ idCtxWarpPerspective_L
+} IppCtxId;
+
+
+
+
+/* /////////////////////////////////////////////////////////////////////////////
+ Helpers
+ /////////////////////////////////////////////////////////////////////////// */
+
+#define IPP_NOERROR_RET() return ippStsNoErr
+#define IPP_ERROR_RET( ErrCode ) return (ErrCode)
+
+#ifdef _IPP_DEBUG
+
+ #define IPP_BADARG_RET( expr, ErrCode )\
+ {if (expr) { IPP_ERROR_RET( ErrCode ); }}
+
+#else
+
+ #define IPP_BADARG_RET( expr, ErrCode )
+
+#endif
+
+
+ #define IPP_BAD_SIZE_RET( n )\
+ IPP_BADARG_RET( (n)<=0, ippStsSizeErr )
+
+ #define IPP_BAD_STEP_RET( n )\
+ IPP_BADARG_RET( (n)<=0, ippStsStepErr )
+
+ #define IPP_BAD_PTR1_RET( ptr )\
+ IPP_BADARG_RET( NULL==(ptr), ippStsNullPtrErr )
+
+ #define IPP_BAD_PTR2_RET( ptr1, ptr2 )\
+ {IPP_BAD_PTR1_RET( ptr1 ); IPP_BAD_PTR1_RET( ptr2 )}
+
+ #define IPP_BAD_PTR3_RET( ptr1, ptr2, ptr3 )\
+ {IPP_BAD_PTR2_RET( ptr1, ptr2 ); IPP_BAD_PTR1_RET( ptr3 )}
+
+ #define IPP_BAD_PTR4_RET( ptr1, ptr2, ptr3, ptr4 )\
+ {IPP_BAD_PTR2_RET( ptr1, ptr2 ); IPP_BAD_PTR2_RET( ptr3, ptr4 )}
+
+ #define IPP_BAD_ISIZE_RET(roi) \
+ IPP_BADARG_RET( ((roi).width<=0 || (roi).height<=0), ippStsSizeErr)
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* internal messages */
+
+#define MSG_LOAD_DLL_ERR (-9700) /* Error at loading of %s library */
+#define MSG_NO_DLL (-9701) /* No DLLs were found in the Waterfall procedure */
+#define MSG_NO_SHARED (-9702) /* No shared libraries were found in the Waterfall procedure */
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+
+typedef union { /* double precision */
+ Ipp64s hex;
+ Ipp64f fp;
+} IppFP_64f;
+
+typedef union { /* single precision */
+ Ipp32s hex;
+ Ipp32f fp;
+} IppFP_32f;
+
+
+extern const IppFP_32f ippConstantOfNAN_32f;
+extern const IppFP_64f ippConstantOfNAN_64f;
+
+extern const IppFP_32f ippConstantOfINF_32f;
+extern const IppFP_64f ippConstantOfINF_64f;
+extern const IppFP_32f ippConstantOfINF_NEG_32f;
+extern const IppFP_64f ippConstantOfINF_NEG_64f;
+
+#define NAN_32F (ippConstantOfNAN_32f.fp)
+#define NAN_64F (ippConstantOfNAN_64f.fp)
+#define INF_32F (ippConstantOfINF_32f.fp)
+#define INF_64F (ippConstantOfINF_64f.fp)
+#define INF_NEG_32F (ippConstantOfINF_NEG_32f.fp)
+#define INF_NEG_64F (ippConstantOfINF_NEG_64f.fp)
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+typedef enum {
+ ippunreg=-1,
+ ippac = 0,
+ ippcc = 1,
+ ippch = 2,
+ ippcp = 3,
+ ippcv = 4,
+ ippdc = 5,
+ ippdi = 6,
+ ippgen = 7,
+ ippi = 8,
+ ippj = 9,
+ ippm = 10,
+ ippr = 11,
+ ipps = 12,
+ ippsc = 13,
+ ippsr = 14,
+ ippvc = 15,
+ ippvm = 16,
+ ippmsdk = 17,
+ ippe = 18,
+ ipprs = 19,
+ ippsq = 20,
+ ippnomore
+} IppDomain;
+
+int IPP_CDECL ownGetNumThreads( void );
+int IPP_CDECL ownGetFeature( Ipp64u MaskOfFeature ); /* the main function of tick-tock dispatcher */
+
+#ifdef _IPP_DYNAMIC
+typedef IppStatus (IPP_STDCALL *DYN_RELOAD)( int );
+void IPP_CDECL ownRegisterLib( IppDomain, DYN_RELOAD );
+void IPP_CDECL ownUnregisterLib( IppDomain );
+IPP_INT64 IPP_CDECL ippStartTscp (void);
+IPP_INT64 IPP_CDECL ippStopTscp (void);
+IPP_INT64 IPP_CDECL ippStartTsc (void);
+IPP_INT64 IPP_CDECL ippStopTsc (void);
+#endif
+
+/* the number of threads available for any ipp function that uses OMP; */
+/* at the ippxx.dll loading time is equal to the number of logical processors, */
+/* and can be changed ONLY externally by library user to any desired number */
+/* by means of ippSetNumThreads() function */
+#define IPP_GET_NUM_THREADS() ( ownGetNumThreads() )
+#define IPP_OMP_NUM_THREADS() num_threads( IPP_GET_NUM_THREADS() )
+#define IPP_OMP_LIMIT_MAX_NUM_THREADS(n) num_threads( IPP_MIN(IPP_GET_NUM_THREADS(),(n)))
+
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/* Define NULL pointer value */
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+#define UNREFERENCED_PARAMETER(p) (p)=(p)
+
+#if defined( _IPP_MARK_LIBRARY )
+static char G[] = {73, 80, 80, 71, 101, 110, 117, 105, 110, 101, 243, 193, 210, 207, 215};
+#endif
+
+
+#define STR2(x) #x
+#define STR(x) STR2(x)
+#define MESSAGE( desc )\
+ message(__FILE__ "(" STR(__LINE__) "):" #desc)
+
+/*
+// endian definition
+*/
+#define IPP_LITTLE_ENDIAN (0)
+#define IPP_BIG_ENDIAN (1)
+
+#if defined( _IPP_LE )
+ #define IPP_ENDIAN IPP_LITTLE_ENDIAN
+
+#elif defined( _IPP_BE )
+ #define IPP_ENDIAN IPP_BIG_ENDIAN
+
+#else
+ #if defined( __ARMEB__ )
+ #define IPP_ENDIAN IPP_BIG_ENDIAN
+
+ #else
+ #define IPP_ENDIAN IPP_LITTLE_ENDIAN
+
+ #endif
+#endif
+
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/* intrinsics */
+#if (_IPP >= _IPP_A6) || (_IPP32E >= _IPP32E_M7)
+ #if defined(__INTEL_COMPILER) || (_MSC_VER >= 1300)
+ #if (_IPP == _IPP_A6)
+ #include "xmmintrin.h"
+ #elif (_IPP == _IPP_W7)
+ #if defined(__INTEL_COMPILER)
+ #include "emmintrin.h"
+ #else
+ #undef _W7
+ #include "emmintrin.h"
+ #define _W7
+ #endif
+ #define _mm_loadu _mm_loadu_si128
+ #elif (_IPP == _IPP_T7) || (_IPP32E == _IPP32E_M7)
+ #if defined(__INTEL_COMPILER)
+ #include "pmmintrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER >= 140050110)
+ #include "intrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER < 140050110)
+ #include "emmintrin.h"
+ #define _mm_loadu _mm_loadu_si128
+ #endif
+ #elif ((_IPP == _IPP_V8) || (_IPP32E == _IPP32E_U8) || (_IPP == _IPP_S8) || (_IPP32E == _IPP32E_N8))
+ #if defined(__INTEL_COMPILER)
+ #include "tmmintrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER >= 140050110)
+ #include "intrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER < 140050110)
+ #include "emmintrin.h"
+ #define _mm_loadu _mm_loadu_si128
+ #endif
+ #elif (_IPP == _IPP_P8) || (_IPP32E == _IPP32E_Y8)
+ #if defined(__INTEL_COMPILER)
+ #include "smmintrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER >= 140050110)
+ #include "intrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER < 140050110)
+ #include "emmintrin.h"
+ #define _mm_loadu _mm_loadu_si128
+ #endif
+ #elif (_IPP >= _IPP_G9) || (_IPP32E >= _IPP32E_E9)
+ #if defined(__INTEL_COMPILER)
+ #include "immintrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #elif (_MSC_FULL_VER >= 160021003)
+ #include "immintrin.h"
+ #define _mm_loadu _mm_lddqu_si128
+ #endif
+ #endif
+ #endif
+#elif (_IPPLRB >= _IPPLRB_B2)
+ #if defined(__INTEL_COMPILER) || defined(_REF_LIB)
+ #include "immintrin.h"
+ #endif
+#endif
+
+// **** intrinsics for bit casting ****
+#if defined(__INTEL_COMPILER)
+extern unsigned int __intel_castf32_u32(float val);
+extern float __intel_castu32_f32(unsigned int val);
+extern unsigned __int64 __intel_castf64_u64(double val);
+extern double __intel_castu64_f64(unsigned __int64 val);
+ #define __CAST_32f32u(val) __intel_castf32_u32((Ipp32f)val)
+ #define __CAST_32u32f(val) __intel_castu32_f32((Ipp32u)val)
+ #define __CAST_64f64u(val) __intel_castf64_u64((Ipp64f)val)
+ #define __CAST_64u64f(val) __intel_castu64_f64((Ipp64u)val)
+#else
+ #define __CAST_32f32u(val) ( *((Ipp32u*)&val) )
+ #define __CAST_32u32f(val) ( *((Ipp32f*)&val) )
+ #define __CAST_64f64u(val) ( *((Ipp64u*)&val) )
+ #define __CAST_64u64f(val) ( *((Ipp64f*)&val) )
+#endif
+
+
+// short names for vector registers casting
+#define _pd2ps _mm_castpd_ps
+#define _ps2pd _mm_castps_pd
+#define _pd2pi _mm_castpd_si128
+#define _pi2pd _mm_castsi128_pd
+#define _ps2pi _mm_castps_si128
+#define _pi2ps _mm_castsi128_ps
+
+#define _ypd2ypi _mm256_castpd_si256
+#define _ypi2ypd _mm256_castsi256_pd
+#define _yps2ypi _mm256_castps_si256
+#define _ypi2yps _mm256_castsi256_ps
+#define _ypd2yps _mm256_castpd_ps
+#define _yps2ypd _mm256_castps_pd
+
+#define _yps2ps _mm256_castps256_ps128
+#define _ypi2pi _mm256_castsi256_si128
+#define _ypd2pd _mm256_castpd256_pd128
+#define _ps2yps _mm256_castps128_ps256
+#define _pi2ypi _mm256_castsi128_si256
+#define _pd2ypd _mm256_castpd128_pd256
+
+#define _zpd2zpi _mm512_castpd_si512
+#define _zpi2zpd _mm512_castsi512_pd
+#define _zps2zpi _mm512_castps_si512
+#define _zpi2zps _mm512_castsi512_ps
+#define _zpd2zps _mm512_castpd_ps
+#define _zps2zpd _mm512_castps_pd
+
+#define _zps2ps _mm512_castps512_ps128
+#define _zpi2pi _mm512_castsi512_si128
+#define _zpd2pd _mm512_castpd512_pd128
+#define _ps2zps _mm512_castps128_ps512
+#define _pi2zpi _mm512_castsi128_si512
+#define _pd2zpd _mm512_castpd128_pd512
+
+#define _zps2yps _mm512_castps512_ps256
+#define _zpi2ypi _mm512_castsi512_si256
+#define _zpd2ypd _mm512_castpd512_pd256
+#define _yps2zps _mm512_castps256_ps512
+#define _ypi2zpi _mm512_castsi256_si512
+#define _ypd2zpd _mm512_castpd256_pd512
+
+
+#if defined(__INTEL_COMPILER)
+#define __IVDEP ivdep
+#else
+#define __IVDEP message("message :: 'ivdep' is not defined")
+#endif
+//usage: #pragma __IVDEP
+
+/* //////////////////////////////////////////////////////////////////////////
+ _IPP_DATA shoul be defined only:
+ - if compile not merged library
+ - only for 1 CPU for merged library to avoid data duplication
+*/
+#if defined( _MERGED_BLD ) && ( defined(_G9) || defined(_E9) ) /* compile data only for g9 and e9 CPU */
+ #define _IPP_DATA 1
+#elif !defined( _MERGED_BLD ) /* compile data if it isn't merged library */
+ #define _IPP_DATA 1
+#endif
+
+
+#if defined( __cplusplus )
+}
+#endif
+
+#endif /* __OWNDEFS_H__ */
+
diff --git a/ext/ipp/sources/ippcp/Makefile b/ext/ipp/sources/ippcp/Makefile
new file mode 100644
index 0000000..7fc4eab
--- /dev/null
+++ b/ext/ipp/sources/ippcp/Makefile
@@ -0,0 +1,31 @@
+#!/usr/bin/make -f
+
+API_INCLUDE_DIR = ../../include
+SRC_INCLUDE_DIR = ../../sources/include
+LIB_INSTALL_DIR = $(epidinstalldir)/lib/posix-$(ARCH)/
+
+PCP_INCLUDE_DIR = ./src
+PCP_SRC = $(wildcard ./src/*.c)
+PCP_OBJ = $(PCP_SRC:.c=.o)
+PCP_LIB = ./src/libippcp.a
+
+
+$(PCP_OBJ): %.o: %.c
+ $(CC) $(CFLAGS) $(IPP_FLAGS) -I$(API_INCLUDE_DIR) -I$(SRC_INCLUDE_DIR) -I$(PCP_INCLUDE_DIR) -c -o $@ $<
+
+$(PCP_LIB): $(PCP_OBJ)
+ $(AR) rc $@ $^
+ $(RANLIB) $@
+
+build: all
+
+all: $(PCP_LIB)
+
+install:
+ mkdir -p '$(LIB_INSTALL_DIR)'
+ cp $(PCP_LIB) '$(LIB_INSTALL_DIR)'
+
+clean:
+ rm -f $(PCP_OBJ) $(PCP_LIB)
+
+
diff --git a/ext/ipp/sources/ippcp/src/gsmodinv.c b/ext/ipp/sources/ippcp/src/gsmodinv.c
new file mode 100644
index 0000000..30e181b
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsmodinv.c
@@ -0,0 +1,166 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbnumisc.h"
+#include "pcpbnuarith.h"
+
+#include "gsmodstuff.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+/* almost Montgomery Inverse
+//
+// returns (k,r), r = (1/a)^k mod m
+//
+// requires buffer with size 4 * modLen
+*/
+int alm_mont_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 4;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+
+ BNU_CHUNK_T* pu = pBuffer;
+ BNU_CHUNK_T* ps = pu+mLen;
+ BNU_CHUNK_T* pv = ps+mLen;
+ BNU_CHUNK_T* pt = pv+mLen;
+
+ int k = 0;
+ BNU_CHUNK_T ext = 0;
+
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+
+ // u=modulus, v=a, t=0, s=1
+ COPY_BNU(pu, pm, mLen);
+ ZEXPAND_BNU(ps, 0, mLen); ps[0] = 1;
+ COPY_BNU(pv, pa, mLen);
+ ZEXPAND_BNU(pt, 0, mLen);
+
+ while(!cpEqu_BNU_CHUNK(pv, mLen, 0)) { // while(v>0) {
+ if(0==(pu[0]&1)) { // if(isEven(u)) {
+ cpLSR_BNU(pu, pu, mLen, 1); // u = u/2;
+ cpAdd_BNU(ps, ps, ps, mLen); // s = 2*s;
+ } // }
+ else if(0==(pv[0]&1)) { // else if(isEven(v)) {
+ cpLSR_BNU(pv, pv, mLen, 1); // v = v/2;
+ /*ext +=*/ cpAdd_BNU(pt, pt, pt, mLen); // t = 2*t;
+ } // }
+ else {
+ int cmpRes = cpCmp_BNU(pu, mLen, pv, mLen);
+ if(cmpRes>0) { // else if (u>v) {
+ cpSub_BNU(pu, pu, pv, mLen); // u = (u-v);
+ cpLSR_BNU(pu, pu, mLen, 1); // u = u/2;
+ /*ext +=*/ cpAdd_BNU(pt, pt, ps, mLen); // t = t+s;
+ cpAdd_BNU(ps, ps, ps, mLen); // s = 2*s;
+ } // }
+ else { // else if(v>=u) {
+ cpSub_BNU(pv, pv, pu, mLen); // v = (v-u);
+ cpLSR_BNU(pv, pv, mLen, 1); // v = v/2;
+ cpAdd_BNU(ps, ps, pt, mLen); // s = s+t;
+ ext += cpAdd_BNU(pt, pt, pt, mLen); // t = 2*t;
+ } // }
+ }
+ k++; // k += 1;
+ } // }
+
+ // test
+ if(1!=cpEqu_BNU_CHUNK(pu, mLen, 1)) {
+ k = 0; /* inversion not found */
+ }
+
+ else {
+ ext -= cpSub_BNU(pr, pt, pm, mLen); // if(t>mod) r = t-mod;
+ cpMaskMove_gs(pr, pt, mLen, cpIsNonZero(ext)); // else r = t;
+ cpSub_BNU(pr, pm, pr, mLen); // return r= (mod - r) and k
+ }
+
+ gsModPoolFree(pME, polLength);
+ return k;
+}
+
+/*
+// returns r = mont(a^-1)
+// a in desidue domain
+// r in Montgomery domain
+*/
+BNU_CHUNK_T* gs_mont_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ int k = alm_mont_inv(pr, pa, pME);
+
+ if(0==k)
+ pr = NULL;
+
+ else {
+ int mLen = MOD_LEN(pME);
+ int m = mLen*BNU_CHUNK_BITS;
+ mod_mul mon_mul = MOD_METHOD(pME)->mul;
+
+ BNU_CHUNK_T* t = gsModPoolAlloc(pME, 1);
+ //gres: temporary excluded: assert(NULL!=t);
+
+ if(k<=m) {
+ mon_mul(pr, pr, MOD_MNT_R2(pME), pME);
+ k += m;
+ }
+
+ ZEXPAND_BNU(t, 0, mLen);
+ SET_BIT(t, 2*m-k); /* t = 2^(2*m-k) */
+ mon_mul(pr, pr, t, pME);
+
+ gsModPoolFree(pME, 1);
+ }
+
+ return pr;
+}
+
+/*
+// returns r =1/a
+// a in desidue domain
+// r in desidue domain
+*/
+BNU_CHUNK_T* gs_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ int k = alm_mont_inv(pr, pa, pME);
+
+ if(0==k)
+ pr = NULL;
+
+ else {
+ int mLen = MOD_LEN(pME);
+ int m = mLen*BNU_CHUNK_BITS;
+ mod_mul mon_mul = MOD_METHOD(pME)->mul;
+
+ BNU_CHUNK_T* t = gsModPoolAlloc(pME, 1);
+ //gres: temporary excluded: assert(NULL!=t);
+
+ if(k>m) {
+ ZEXPAND_BNU(t, 0, mLen);
+ t[0] = 1;
+ mon_mul(pr, pr, t, pME);
+ k -= m;
+ }
+ ZEXPAND_BNU(t, 0, mLen);
+ SET_BIT(t, m-k); /* t = 2^(m-k) */
+ mon_mul(pr, pr, t, pME);
+
+ gsModPoolFree(pME, 1);
+ }
+
+ return pr;
+}
diff --git a/ext/ipp/sources/ippcp/src/gsmodmethod.c b/ext/ipp/sources/ippcp/src/gsmodmethod.c
new file mode 100644
index 0000000..426c5ad
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsmodmethod.c
@@ -0,0 +1,719 @@
+/*############################################################################
+ # Copyright 2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbnumisc.h"
+#include "pcpbnuarith.h"
+
+#include "gsmodstuff.h"
+#include "gsmodmethod.h"
+#include "pcpmontred.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+/* r = (a+m) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Length of pb data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_add(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, const BNU_CHUNK_T* pb, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+ {
+ BNU_CHUNK_T extension = cpAdd_BNU(pr, pa, pb, mLen);
+ extension -= cpSub_BNU(pBuffer, pr, pm, mLen);
+ cpMaskMove_gs(pr, pBuffer, mLen, cpIsZero(extension));
+ }
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+/* r = (a-b) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Length of pb data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_sub(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, const BNU_CHUNK_T* pb, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+ {
+ BNU_CHUNK_T extension = cpSub_BNU(pr, pa, pb, mLen);
+ cpAdd_BNU(pBuffer, pr, pm, mLen);
+ cpMaskMove_gs(pr, pBuffer, mLen, cpIsNonZero(extension));
+ }
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+/* r = (m-a) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_neg(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+ {
+ BNU_CHUNK_T extension = cpSub_BNU(pr, pm, pa, mLen);
+ extension -= cpSub_BNU(pBuffer, pr, pm, mLen);
+ cpMaskMove_gs(pr, pBuffer, mLen, cpIsZero(extension));
+ }
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+/* r = (a/2) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_div2(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+ {
+ cpSize i;
+ BNU_CHUNK_T mask = 0 - (pa[0]&1);
+ for(i=0; i<mLen; i++) pBuffer[i] = pm[i] & mask;
+
+ pBuffer[mLen] = cpAdd_BNU(pBuffer, pBuffer, pa, mLen);
+ cpLSR_BNU(pBuffer, pBuffer, mLen+1, 1);
+
+ for(i=0; i<mLen; i++) pr[i] = pBuffer[i];
+ }
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+/* r = (a*2) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_mul2(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ return gs_mont_add(pr, pa, pa, pME);
+}
+
+/* r = (a*3) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T) * 2
+ */
+static BNU_CHUNK_T* gs_mont_mul3(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+
+ gs_mont_add(pBuffer, pa, pa, pME);
+ gs_mont_add(pr, pa, pBuffer, pME);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+/* r = prod mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of prod data buffer: modLen * 2
+ * Memory size from the pool: n/a
+ */
+#if ((_IPP <_IPP_W7) && (_IPP32E <_IPP32E_M7)) || defined(_USE_C_cpMontRedAdc_BNU_)
+static BNU_CHUNK_T* gs_mont_red(BNU_CHUNK_T* pr, BNU_CHUNK_T* prod, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T k0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ /* mont mul */
+ BNU_CHUNK_T carry = 0;
+ int i, j;
+
+ for(i=0; i<mLen; i++, prod++) {
+ BNU_CHUNK_T muL, muH, ex_mu;
+ BNU_CHUNK_T t;
+
+ /* u = prod[0]*k0 mod B */
+ BNU_CHUNK_T u = prod[0] * k0;
+
+ /* (ex_mu, t) = prod[0] + m[0]*u (note t ==0) */
+ MUL_AB(muH, muL, pm[0], u);
+ ADD_AB(ex_mu, t, prod[0], muL);
+ ex_mu += muH;
+
+ for(j=1; j<mLen; j++) {
+ BNU_CHUNK_T c;
+ MUL_AB(muH, muL, pm[j], u); /* (H,L) = m[j]*u */
+ ADD_AB(ex_mu, t, prod[j], ex_mu); /* carry in ex_mu,t */
+ ADD_AB(c, prod[j], t, muL); /* carry in c */
+ ex_mu += muH+c; /* accumulates both carrys above */
+ }
+ ADD_ABC(carry, prod[mLen], prod[mLen], ex_mu, carry);
+ }
+
+ {
+ carry -= cpSub_BNU(pr, prod, pm, mLen);
+ cpMaskMove_gs(pr, prod, mLen, cpIsNonZero(carry));
+ return pr;
+ }
+}
+
+#else
+static BNU_CHUNK_T* gs_mont_red(BNU_CHUNK_T* pr, BNU_CHUNK_T* prod, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T k0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ cpMontRedAdc_BNU(pr, prod, pm, mLen, k0);
+
+ return pr;
+}
+
+#if (_IPP32E>=_IPP32E_L9)
+static BNU_CHUNK_T* gs_mont_redX(BNU_CHUNK_T* pr, BNU_CHUNK_T* prod, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T k0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ cpMontRedAdx_BNU(pr, prod, pm, mLen, k0);
+
+ return pr;
+}
+#endif
+
+#endif
+
+
+/* r = (a*b) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Length of pb data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T) * 2
+ */
+#if ((_IPP <_IPP_W7) && (_IPP32E <_IPP32E_M7))
+static BNU_CHUNK_T* gs_mont_mul(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, const BNU_CHUNK_T* pb, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 1;
+ BNU_CHUNK_T* pBuffer = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pBuffer);
+
+ {
+ BNU_CHUNK_T carry = 0;
+ int i, j;
+
+ /* clear buffer */
+ for(i=0; i<mLen; i++) pBuffer[i] = 0;
+
+ /* mont mul */
+ for(i=0; i<mLen; i++) {
+ BNU_CHUNK_T b = pb[i];
+
+ BNU_CHUNK_T ex_ab = 0;
+ BNU_CHUNK_T ex_mu = 0;
+
+ BNU_CHUNK_T u;
+ BNU_CHUNK_T abL, abH;
+ BNU_CHUNK_T muL, muH;
+
+ // (ex_ab, abL) = T = buffer[0] + a[0]*b
+ MUL_AB(abH, abL, pa[0], b);
+ ADD_ABC(ex_ab, abL, pBuffer[0], abL, ex_ab);
+ ex_ab += abH;
+
+ // u = t*m0 mod B
+ u = abL * m0;
+
+ // (ex_mu, abL) = T + m[0]*u (note abL ==0)
+ MUL_AB(muH, muL, pm[0], u);
+ ADD_ABC(ex_mu, abL, abL, muL, ex_mu);
+ ex_mu += muH;
+
+ for(j=1; j<mLen; j++) {
+ MUL_AB(abH, abL, pa[j], b);
+ ADD_ABC(ex_ab, abL, pBuffer[j], abL, ex_ab);
+ ex_ab += abH;
+
+ MUL_AB(muH, muL, pm[j], u);
+ ADD_ABC(ex_mu, abL, abL, muL, ex_mu);
+ ex_mu += muH;
+
+ pBuffer[j-1] = abL;
+ }
+ ADD_ABC(carry, pBuffer[mLen-1], ex_ab, ex_mu, carry);
+ }
+
+ carry -= cpSub_BNU(pr, pBuffer, pm, mLen);
+ cpMaskMove_gs(pr, pBuffer, mLen, cpIsNonZero(carry));
+ }
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+#else
+
+static BNU_CHUNK_T* gs_mont_mul(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, const BNU_CHUNK_T* pb, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpMulAdc_BNU_school(pProduct, pa,mLen, pb,mLen);
+ cpMontRedAdc_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+#if (_IPP32E>=_IPP32E_L9)
+static BNU_CHUNK_T* gs_mont_mulX(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, const BNU_CHUNK_T* pb, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpMulAdx_BNU_school(pProduct, pa,mLen, pb,mLen);
+ cpMontRedAdx_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+#endif
+#endif
+
+/* r = (a^2) mod m */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_sqr(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ //return gs_mont_mul(pr, pa, pa, pME);
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpSqrAdc_BNU_school(pProduct, pa,mLen);
+ cpMontRedAdc_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+#if (_IPP32E>=_IPP32E_L9)
+static BNU_CHUNK_T* gs_mont_sqrX(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpSqrAdx_BNU_school(pProduct, pa,mLen);
+ cpMontRedAdx_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+#endif
+
+/* r = to_mont(a) */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_encode(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ //return gs_mont_mul(pr, pa, MOD_MNT_R2(pME), pME);
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpMulAdc_BNU_school(pProduct, pa,mLen, MOD_MNT_R2(pME),mLen);
+ cpMontRedAdc_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+#if (_IPP32E>=_IPP32E_L9)
+static BNU_CHUNK_T* gs_mont_encodeX(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ //return gs_mont_mul(pr, pa, MOD_MNT_R2(pME), pME);
+ const BNU_CHUNK_T* pm = MOD_MODULUS(pME);
+ BNU_CHUNK_T m0 = MOD_MNT_FACTOR(pME);
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpMulAdx_BNU_school(pProduct, pa,mLen, MOD_MNT_R2(pME),mLen);
+ cpMontRedAdx_BNU(pr, pProduct, pm, mLen, m0);
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+#endif
+
+/* r = from_momt(a) */
+/*
+ * Requirements:
+ * Length of pr data buffer: modLen
+ * Length of pa data buffer: modLen
+ * Memory size from the pool: modLen * sizeof(BNU_CHUNK_T)
+ */
+static BNU_CHUNK_T* gs_mont_decode(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ ZEXPAND_COPY_BNU(pProduct, 2*mLen, pa, mLen);
+ cpMontRedAdc_BNU(pr, pProduct, MOD_MODULUS(pME), mLen, MOD_MNT_FACTOR(pME));
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+
+#if (_IPP32E>=_IPP32E_L9)
+static BNU_CHUNK_T* gs_mont_decodeX(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pME)
+{
+ int mLen = MOD_LEN(pME);
+
+ const int polLength = 2;
+ BNU_CHUNK_T* pProduct = gsModPoolAlloc(pME, polLength);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ ZEXPAND_COPY_BNU(pProduct, 2*mLen, pa, mLen);
+ cpMontRedAdx_BNU(pr, pProduct, MOD_MODULUS(pME), mLen, MOD_MNT_FACTOR(pME));
+
+ gsModPoolFree(pME, polLength);
+ return pr;
+}
+#endif
+
+
+/*
+ methods
+*/
+
+static gsModMethod* gsModArith_C(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ gs_mont_decode,
+ gs_mont_mul,
+ gs_mont_sqr,
+ gs_mont_red,
+ gs_mont_add,
+ gs_mont_sub,
+ gs_mont_neg,
+ gs_mont_div2,
+ gs_mont_mul2,
+ gs_mont_mul3,
+ };
+ return &m;
+}
+#if (_IPP32E>=_IPP32E_L9)
+static gsModMethod* gsModArith_X(void)
+{
+ static gsModMethod m = {
+ gs_mont_encodeX,
+ gs_mont_decodeX,
+ gs_mont_mulX,
+ gs_mont_sqrX,
+ gs_mont_redX,
+ gs_mont_add,
+ gs_mont_sub,
+ gs_mont_neg,
+ gs_mont_div2,
+ gs_mont_mul2,
+ gs_mont_mul3,
+ };
+ return &m;
+}
+#endif
+
+gsModMethod* gsModArith(void)
+{
+ #if (_IPP32E>=_IPP32E_L9)
+ if(IsFeatureEnabled(ADCOX_ENABLED))
+ return gsModArith_X();
+ else
+ #endif
+ return gsModArith_C();
+}
+/* ******************************************** */
+
+static gsModMethod* gsModArithRSA_C(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ gs_mont_decode,
+ gs_mont_mul,
+ gs_mont_sqr,
+ gs_mont_red,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#if (_IPP32E>=_IPP32E_L9)
+static gsModMethod* gsModArithRSA_X(void)
+{
+ static gsModMethod m = {
+ gs_mont_encodeX,
+ gs_mont_decodeX,
+ gs_mont_mulX,
+ gs_mont_sqrX,
+ gs_mont_redX,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#endif
+
+gsModMethod* gsModArithRSA(void)
+{
+ #if (_IPP32E>=_IPP32E_L9)
+ if(IsFeatureEnabled(ADCOX_ENABLED))
+ return gsModArithRSA_X();
+ else
+ #endif
+ return gsModArithRSA_C();
+}
+/* ******************************************** */
+
+static gsModMethod* gsModArithMont_C(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ NULL,
+ gs_mont_mul,
+ gs_mont_sqr,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#if (_IPP32E>=_IPP32E_L9)
+static gsModMethod* gsModArithMont_X(void)
+{
+ static gsModMethod m = {
+ gs_mont_encodeX,
+ NULL,
+ gs_mont_mulX,
+ gs_mont_sqrX,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#endif
+
+gsModMethod* gsModArithMont(void)
+{
+ #if (_IPP32E>=_IPP32E_L9)
+ if(IsFeatureEnabled(ADCOX_ENABLED))
+ return gsModArithMont_X();
+ else
+ #endif
+ return gsModArithMont_C();
+}
+/* ******************************************** */
+
+static gsModMethod* gsModArithDLP_C(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ gs_mont_decode,
+ gs_mont_mul,
+ gs_mont_sqr,
+ gs_mont_red,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#if (_IPP32E>=_IPP32E_L9)
+static gsModMethod* gsModArithDLP_X(void)
+{
+ static gsModMethod m = {
+ gs_mont_encodeX,
+ gs_mont_decodeX,
+ gs_mont_mulX,
+ gs_mont_sqrX,
+ gs_mont_redX,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ };
+ return &m;
+}
+#endif
+
+gsModMethod* gsModArithDLP(void)
+{
+ #if (_IPP32E>=_IPP32E_L9)
+ if(IsFeatureEnabled(ADCOX_ENABLED))
+ return gsModArithDLP_X();
+ else
+ #endif
+ return gsModArithDLP_C();
+}
+/* ******************************************** */
+
+static gsModMethod* gsArithGFp_C(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ gs_mont_decode,
+ gs_mont_mul,
+ gs_mont_sqr,
+ NULL,
+ gs_mont_add,
+ gs_mont_sub,
+ gs_mont_neg,
+ gs_mont_div2,
+ gs_mont_mul2,
+ gs_mont_mul3,
+ };
+ return &m;
+}
+#if (_IPP32E>=_IPP32E_L9)
+static gsModMethod* gsArithGFp_X(void)
+{
+ static gsModMethod m = {
+ gs_mont_encode,
+ gs_mont_decode,
+ gs_mont_mul,
+ gs_mont_sqr,
+ NULL,
+ gs_mont_add,
+ gs_mont_sub,
+ gs_mont_neg,
+ gs_mont_div2,
+ gs_mont_mul2,
+ gs_mont_mul3,
+ };
+ return &m;
+}
+#endif
+
+gsModMethod* gsArithGFp(void)
+{
+ #if (_IPP32E>=_IPP32E_L9)
+ if(IsFeatureEnabled(ADCOX_ENABLED))
+ return gsArithGFp_X();
+ else
+ #endif
+ return gsArithGFp_C();
+}
diff --git a/ext/ipp/sources/ippcp/src/gsmodmethod.h b/ext/ipp/sources/ippcp/src/gsmodmethod.h
new file mode 100644
index 0000000..4ce1d23
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsmodmethod.h
@@ -0,0 +1,97 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+#if !defined(_GS_MOD_METHOD_H)
+#define _GS_MOD_METHOD_H
+
+//#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnuimpl.h"
+//#include "gsmodstuff.h"
+
+typedef struct _gsModEngine gsEngine;
+
+/* modular arith methods */
+typedef BNU_CHUNK_T* (*mod_encode)(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_decode)(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_red) (BNU_CHUNK_T* pR, BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_sqr) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_mul) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_add) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_sub) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_neg) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_div2) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_mul2) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+typedef BNU_CHUNK_T* (*mod_mul3) (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pMA);
+
+typedef struct _gsModMethod {
+ mod_encode encode;
+ mod_decode decode;
+ mod_mul mul;
+ mod_sqr sqr;
+ mod_red red;
+ mod_add add;
+ mod_sub sub;
+ mod_neg neg;
+ mod_div2 div2;
+ mod_mul2 mul2;
+ mod_mul3 mul3;
+} gsModMethod;
+
+__INLINE BNU_CHUNK_T cpIsZero(BNU_CHUNK_T x)
+{ return x==0; }
+__INLINE BNU_CHUNK_T cpIsNonZero(BNU_CHUNK_T x)
+{ return x!=0; }
+__INLINE BNU_CHUNK_T cpIsOdd(BNU_CHUNK_T x)
+{ return x&1; }
+__INLINE BNU_CHUNK_T cpIsEven(BNU_CHUNK_T x)
+{ return 1-cpIsOdd(x); }
+
+/* dst[] = (flag)? src[] : dst[] */
+__INLINE void cpMaskMove_gs(BNU_CHUNK_T* dst, const BNU_CHUNK_T* src, int len, BNU_CHUNK_T moveFlag)
+{
+ BNU_CHUNK_T srcMask = 0-cpIsNonZero(moveFlag);
+ BNU_CHUNK_T dstMask = ~srcMask;
+ int n;
+ for(n=0; n<len; n++)
+ dst[n] = (src[n] & srcMask) ^ (dst[n] & dstMask);
+}
+
+/* common available pre-defined methos */
+#define gsModArith OWNAPI(gsModArith)
+gsModMethod* gsModArith(void);
+
+/* available pre-defined methos for RSA */
+#define gsModArithRSA OWNAPI(gsModArithRSA)
+gsModMethod* gsModArithRSA(void);
+
+/* available pre-defined methos for ippsMont* */
+#define gsModArithMont OWNAPI(gsModArithMont)
+gsModMethod* gsModArithMont(void);
+
+/* available pre-defined methos for DLP * */
+#define gsModArithDLP OWNAPI(gsModArithDLP)
+gsModMethod* gsModArithDLP(void);
+
+/* available pre-defined common methos for GF over prime * */
+#define gsArithGFp OWNAPI(gsArithGFp)
+gsModMethod* gsArithGFp(void);
+
+/* ... and etc ... */
+
+#endif /* _GS_MOD_METHOD_H */
+
diff --git a/ext/ipp/sources/ippcp/src/gsmodstuff.c b/ext/ipp/sources/ippcp/src/gsmodstuff.c
new file mode 100644
index 0000000..ff8e00e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsmodstuff.c
@@ -0,0 +1,168 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "pcpbnuarith.h"
+#include "gsmodstuff.h"
+#include "pcptool.h"
+
+/* convert bitsize nbits into the number of BNU_CHUNK_T */
+#define BITS_BNU_IPP32U(nbits) (((nbits)+31)/32)
+
+/*
+// size of ModEngine context (Montgomery)
+*/
+IppStatus gsModEngineGetSize(int modulusBitSize, int numpe, int* pSize)
+{
+ int modLen = BITS_BNU_CHUNK(modulusBitSize);
+ int pelmLen = BITS_BNU_CHUNK(modulusBitSize);
+
+ IPP_BADARG_RET(modulusBitSize<1, ippStsLengthErr);
+ IPP_BADARG_RET(numpe<MOD_ENGINE_MIN_POOL_SIZE, ippStsLengthErr);
+
+ /* allocates mimimal necessary to Montgomery based methods */
+ *pSize = sizeof(gsModEngine)
+ + modLen*sizeof(BNU_CHUNK_T) /* modulus */
+ + modLen*sizeof(BNU_CHUNK_T) /* mont_R */
+ + modLen*sizeof(BNU_CHUNK_T) /* mont_R^2 */
+ + pelmLen*sizeof(BNU_CHUNK_T)*numpe; /* buffers */
+
+ return ippStsNoErr;
+}
+
+/*
+// montfomery factor k0 = -((modulus^-1 mod B) %B)
+*/
+BNU_CHUNK_T gsMontFactor(BNU_CHUNK_T m0)
+{
+ BNU_CHUNK_T y = 1;
+ BNU_CHUNK_T x = 2;
+ BNU_CHUNK_T mask = 2*x-1;
+
+ int i;
+ for(i=2; i<=BNU_CHUNK_BITS; i++, x<<=1) {
+ BNU_CHUNK_T rH, rL;
+ MUL_AB(rH, rL, m0, y);
+ if( x < (rL & mask) ) /* x < ((m0*y) mod (2*x)) */
+ y+=x;
+ mask += mask + 1;
+ }
+ return 0-y;
+}
+
+/*
+// initialization of the ModEngine context (Montgomery)
+*/
+IppStatus gsModEngineInit(gsModEngine* pME, const Ipp32u* pModulus, int modulusBitSize, int numpe, const gsModMethod* method)
+{
+ IPP_BADARG_RET(modulusBitSize<1, ippStsLengthErr);
+ IPP_BADARG_RET((pModulus) && (pModulus[0] & 1) == 0, ippStsBadModulusErr);
+ IPP_BADARG_RET(numpe<MOD_ENGINE_MIN_POOL_SIZE, ippStsLengthErr);
+
+ {
+ int pelmLen = BITS_BNU_CHUNK(modulusBitSize);
+ int modLen = BITS_BNU_CHUNK(modulusBitSize);
+ int modLen32 = BITS_BNU_IPP32U(modulusBitSize);
+ Ipp8u* ptr = (Ipp8u*)pME;
+
+ /* clear whole context */
+ PaddBlock(0, pME, sizeof(gsModEngine));
+
+ MOD_PARENT(pME) = NULL;
+ MOD_EXTDEG(pME) = 1;
+ MOD_BITSIZE(pME) = modulusBitSize;
+ MOD_LEN(pME) = modLen;
+ MOD_PELEN(pME) = pelmLen;
+ MOD_METHOD(pME) = method;
+ MOD_MODULUS(pME) = (BNU_CHUNK_T*)(ptr += sizeof(gsModEngine));
+ MOD_MNT_R(pME) = (BNU_CHUNK_T*)(ptr += modLen*sizeof(BNU_CHUNK_T));
+ MOD_MNT_R2(pME) = (BNU_CHUNK_T*)(ptr += modLen*sizeof(BNU_CHUNK_T));
+ MOD_POOL_BUF(pME) = (BNU_CHUNK_T*)(ptr += modLen*sizeof(BNU_CHUNK_T));
+ MOD_MAXPOOL(pME) = numpe;
+ MOD_USEDPOOL(pME) = 0;
+
+ if (pModulus) {
+ /* store modulus */
+ ZEXPAND_COPY_BNU((Ipp32u*)MOD_MODULUS(pME), modLen * (cpSize)(sizeof(BNU_CHUNK_T) / sizeof(Ipp32u)), pModulus, modLen32);
+
+ /* montgomery factor */
+ MOD_MNT_FACTOR(pME) = gsMontFactor(MOD_MODULUS(pME)[0]);
+
+ /* montgomery identity (R) */
+ ZEXPAND_BNU(MOD_MNT_R(pME), 0, modLen);
+ MOD_MNT_R(pME)[modLen] = 1;
+ cpMod_BNU(MOD_MNT_R(pME), modLen+1, MOD_MODULUS(pME), modLen);
+
+ /* montgomery domain converter (RR) */
+ ZEXPAND_BNU(MOD_MNT_R2(pME), 0, modLen);
+ COPY_BNU(MOD_MNT_R2(pME)+modLen, MOD_MNT_R(pME), modLen);
+ cpMod_BNU(MOD_MNT_R2(pME), 2*modLen, MOD_MODULUS(pME), modLen);
+ }
+ }
+
+ return ippStsNoErr;
+}
+
+/*
+// pool management methods
+*/
+
+
+BNU_CHUNK_T* gsModGetPool(gsModEngine* pME)
+{
+ BNU_CHUNK_T*
+ pPool = (pME->poolLenUsed >= pME->poolLen)? NULL : MOD_BUFFER(pME, pME->poolLenUsed);
+ return pPool;
+}
+
+/*
+// Pack/Unpack methods
+*/
+
+void gsPackModEngineCtx(const gsModEngine* pCtx, Ipp8u* pBuffer)
+{
+ gsModEngine* pAlignedBuffer = (gsModEngine*)pBuffer;
+
+ /* max modulus length */
+ int modSize = MOD_LEN(pCtx);
+ /* size of context (bytes) without cube and pool buffers */
+ int ctxSize = sizeof(gsModEngine)
+ +sizeof(BNU_CHUNK_T)*(modSize*3);
+
+ CopyBlock(pCtx, pAlignedBuffer, ctxSize);
+ MOD_MODULUS(pAlignedBuffer) = (BNU_CHUNK_T*)((Ipp8u*)NULL + IPP_UINT_PTR(MOD_MODULUS(pCtx))-IPP_UINT_PTR(pCtx));
+ MOD_MNT_R(pAlignedBuffer) = (BNU_CHUNK_T*)((Ipp8u*)NULL + IPP_UINT_PTR(MOD_MNT_R(pCtx))-IPP_UINT_PTR(pCtx));
+ MOD_MNT_R2(pAlignedBuffer) = (BNU_CHUNK_T*)((Ipp8u*)NULL + IPP_UINT_PTR(MOD_MNT_R2(pCtx))-IPP_UINT_PTR(pCtx));
+}
+
+void gsUnpackModEngineCtx(const Ipp8u* pBuffer, gsModEngine* pCtx)
+{
+ gsModEngine* pAlignedBuffer = (gsModEngine*)pBuffer;
+
+ /* max modulus length */
+ int modSize = MOD_LEN(pAlignedBuffer);
+ /* size of context (bytes) without cube and pool buffers */
+ int ctxSize = sizeof(gsModEngine)
+ +sizeof(BNU_CHUNK_T)*(modSize*3);
+
+ CopyBlock(pAlignedBuffer, pCtx, ctxSize);
+ MOD_MODULUS(pCtx) = (BNU_CHUNK_T*)((Ipp8u*)pCtx + IPP_UINT_PTR(MOD_MODULUS(pAlignedBuffer)));
+ MOD_MNT_R(pCtx) = (BNU_CHUNK_T*)((Ipp8u*)pCtx + IPP_UINT_PTR(MOD_MNT_R(pAlignedBuffer)));
+ MOD_MNT_R2(pCtx) = (BNU_CHUNK_T*)((Ipp8u*)pCtx + IPP_UINT_PTR(MOD_MNT_R2(pAlignedBuffer)));
+ MOD_POOL_BUF(pCtx) = MOD_MNT_R2(pCtx) + modSize;
+}
diff --git a/ext/ipp/sources/ippcp/src/gsmodstuff.h b/ext/ipp/sources/ippcp/src/gsmodstuff.h
new file mode 100644
index 0000000..02498ad
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsmodstuff.h
@@ -0,0 +1,137 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+#if !defined(_GS_MOD_STUFF_H)
+#define _GS_MOD_STUFF_H
+
+//#define MONTMUL_ONESTAGE
+
+#include "owncp.h"
+
+#include "pcpbnuimpl.h"
+#include "gsmodmethod.h"
+
+#define MOD_ENGINE_MIN_POOL_SIZE 1
+
+typedef struct _gsModEngine gsModEngine_T;
+
+typedef struct _gsModEngine
+{
+ gsModEngine_T* pParentME; /* pointer to parent stuff */
+ int extdegree; /* parent modulus extension (deg) */
+ int modBitLen; /* length of modulus in bits */
+ int modLen; /* length of modulus (BNU_CHUNK_T) */
+ int modLen32; /* length of modulus (Ipp32u) */
+ int peLen; /* length of pool element (BNU_CHUNK_T) */
+ const gsModMethod* method; /* modular arithmetic methods */
+ BNU_CHUNK_T* pModulus; /* modulus */
+ BNU_CHUNK_T k0; /* low word of (1/modulus) mod R */
+ BNU_CHUNK_T* pMontR; /* mont_enc(1) */
+ BNU_CHUNK_T* pMontR2; /* mont_enc(1)^2 */
+ BNU_CHUNK_T* pHalfModulus; /* modulus/2 */
+ BNU_CHUNK_T* pQnr; /* quadratic non-residue */
+ int poolLenUsed; /* number of reserved temporary BNU */
+ int poolLen; /* max number of temporary BNU */
+ BNU_CHUNK_T* pBuffer; /* buffer of modLen*nBuffers length */
+} gsModEngine;
+
+/* accessory macros */
+#define MOD_PARENT(eng) ((eng)->pParentME)
+#define MOD_EXTDEG(eng) ((eng)->extdegree)
+#define MOD_BITSIZE(eng) ((eng)->modBitLen)
+#define MOD_LEN(eng) ((eng)->modLen)
+#define MOD_LEN32(eng) ((eng)->modLen32)
+#define MOD_PELEN(eng) ((eng)->peLen)
+#define MOD_METHOD(eng) ((eng)->method)
+#define MOD_MODULUS(eng) ((eng)->pModulus)
+#define MOD_MNT_FACTOR(eng) ((eng)->k0)
+#define MOD_MNT_R(eng) ((eng)->pMontR)
+#define MOD_MNT_R2(eng) ((eng)->pMontR2)
+#define MOD_HMODULUS(eng) ((eng)->pHalfModulus)
+#define MOD_QNR(eng) ((eng)->pQnr)
+#define MOD_POOL_BUF(eng) ((eng)->pBuffer)
+#define MOD_MAXPOOL(eng) ((eng)->poolLen)
+#define MOD_USEDPOOL(eng) ((eng)->poolLenUsed)
+
+#define MOD_BUFFER(eng,n) ((eng)->pBuffer+(MOD_PELEN(eng))*(n))
+
+#define MOD_ENGINE_ALIGNMENT ((int)sizeof(void*))
+
+/*
+// size of context and it initialization
+*/
+#define gsModEngineGetSize OWNAPI(gsModEngineGetSize)
+IppStatus gsModEngineGetSize(int modulusBitSIze, int numpe, int* pSize);
+
+#define gsModEngineInit OWNAPI(gsModEngineInit)
+IppStatus gsModEngineInit(gsModEngine* pME, const Ipp32u* pModulus, int modulusBitSize, int numpe, const gsModMethod* method);
+
+#define gsMontFactor OWNAPI(gsMontFactor)
+BNU_CHUNK_T gsMontFactor(BNU_CHUNK_T m0);
+
+
+/*
+// pool management methods
+*/
+//#define gsModPoolAlloc OWNAPI(gsModPoolAlloc)
+//BNU_CHUNK_T* gsModPoolAlloc(gsModEngine* pME, int poolLen);
+
+//#define gsModPoolFree OWNAPI(gsModPoolFree)
+//void gsModPoolFree(gsModEngine* pME, int poolLen);
+__INLINE BNU_CHUNK_T* gsModPoolAlloc(gsModEngine* pME, int poolReq)
+{
+ BNU_CHUNK_T* pPool = MOD_BUFFER(pME, pME->poolLenUsed);
+
+ if(pME->poolLenUsed + poolReq > pME->poolLen)
+ pPool = NULL;
+ else
+ pME->poolLenUsed += poolReq;
+
+ return pPool;
+}
+
+__INLINE void gsModPoolFree(gsModEngine* pME, int poolReq)
+{
+ if(pME->poolLenUsed < poolReq)
+ poolReq = pME->poolLenUsed;
+ pME->poolLenUsed -= poolReq;
+}
+
+/* return pointer to the top pool buffer */
+#define gsModGetPool OWNAPI(gsModGetPool)
+BNU_CHUNK_T* gsModGetPool(gsModEngine* pME);
+
+/*
+// advanced operations
+*/
+#define alm_mont_inv OWNAPI(alm_mont_inv)
+int alm_mont_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pMA);
+
+#define gs_mont_inv OWNAPI(gs_mont_inv)
+BNU_CHUNK_T* gs_mont_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pMA);
+
+#define gs_inv OWNAPI(gs_inv)
+BNU_CHUNK_T* gs_inv(BNU_CHUNK_T* pr, const BNU_CHUNK_T* pa, gsModEngine* pMA);
+
+/*
+// Pack/Unpack methods
+*/
+#define gsPackModEngineCtx OWNAPI(gsPackModEngineCtx)
+void gsPackModEngineCtx(const gsModEngine* pCtx, Ipp8u* pBuffer);
+
+#define gsUnpackModEngineCtx OWNAPI(gsUnpackModEngineCtx)
+void gsUnpackModEngineCtx(const Ipp8u* pBuffer, gsModEngine* pCtx);
+
+#endif /* _GS_MOD_STUFF_H */
diff --git a/ext/ipp/sources/ippcp/src/gsscramble.c b/ext/ipp/sources/ippcp/src/gsscramble.c
new file mode 100644
index 0000000..4313e48
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsscramble.c
@@ -0,0 +1,127 @@
+/*############################################################################
+ # Copyright 2013-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Fixed window exponentiation scramble/unscramble
+//
+// Contents:
+// gsScramblePut()
+// gsScrambleGet()
+// gsScrambleGet_sscm()
+//
+*/
+#include "owncp.h"
+#include "gsscramble.h"
+
+int gsGetScrambleBufferSize(int modulusLen, int w)
+{
+ /* size of resource to store 2^w values of modulusLen*sizeof(BNU_CHUNK_T) each */
+ int size = (1<<w) * modulusLen * sizeof(BNU_CHUNK_T);
+ /* padd it up to CACHE_LINE_SIZE */
+ size += (CACHE_LINE_SIZE - (size % CACHE_LINE_SIZE)) %CACHE_LINE_SIZE;
+ ///* add CACHE_LINE_SIZE for alignment purpose*/
+ //size += CACHE_LINE_SIZE;
+ return size/sizeof(BNU_CHUNK_T);
+}
+
+void gsScramblePut(BNU_CHUNK_T* tbl, int idx, const BNU_CHUNK_T* val, int vLen, int w)
+{
+ int width = 1 << w;
+ int i, j;
+ for(i=0, j=idx; i<vLen; i++, j+= width) {
+ tbl[j] = val[i];
+ }
+}
+
+void gsScrambleGet(BNU_CHUNK_T* val, int vLen, const BNU_CHUNK_T* tbl, int idx, int w)
+{
+ int width = 1 << w;
+ int i, j;
+ for(i=0, j=idx; i<vLen; i++, j+= width) {
+ val[i] = tbl[j];
+ }
+}
+
+void gsScrambleGet_sscm(BNU_CHUNK_T* val, int vLen, const BNU_CHUNK_T* tbl, int idx, int w)
+{
+ BNU_CHUNK_T mask[1<<MAX_W];
+
+ int width = 1 << w;
+
+ int n, i;
+ switch (w) {
+ case 6:
+ for(n=0; n<(1<<6); n++)
+ mask[n] = (BNU_CHUNK_T)0 - (ct_eq_int(n,idx)&1);
+ break;
+ case 5:
+ for(n=0; n<(1<<5); n++)
+ mask[n] = (BNU_CHUNK_T)0 - (ct_eq_int(n,idx)&1);
+ break;
+ case 4:
+ for(n=0; n<(1<<4); n++)
+ mask[n] = (BNU_CHUNK_T)0 - (ct_eq_int(n,idx)&1);
+ break;
+ case 3:
+ for(n=0; n<(1<<3); n++)
+ mask[n] = (BNU_CHUNK_T)0 - (ct_eq_int(n,idx)&1);
+ break;
+ case 2:
+ for(n=0; n<(1<<2); n++)
+ mask[n] = (BNU_CHUNK_T)0 - (ct_eq_int(n,idx)&1);
+ break;
+ default:
+ mask[0] = (BNU_CHUNK_T)0 - (ct_eq_int(0,idx)&1);
+ mask[1] = (BNU_CHUNK_T)0 - (ct_eq_int(1,idx)&1);
+ break;
+ }
+
+ for(i=0; i<vLen; i++, tbl += width) {
+ BNU_CHUNK_T acc = 0;
+
+ switch (w) {
+ case 6:
+ for(n=0; n<(1<<6); n++)
+ acc |= tbl[n] & mask[n];
+ break;
+ case 5:
+ for(n=0; n<(1<<5); n++)
+ acc |= tbl[n] & mask[n];
+ break;
+ case 4:
+ for(n=0; n<(1<<4); n++)
+ acc |= tbl[n] & mask[n];
+ break;
+ case 3:
+ for(n=0; n<(1<<3); n++)
+ acc |= tbl[n] & mask[n];
+ break;
+ case 2:
+ for(n=0; n<(1<<2); n++)
+ acc |= tbl[n] & mask[n];
+ break;
+ default:
+ acc |= tbl[0] & mask[0];
+ acc |= tbl[1] & mask[1];
+ break;
+ }
+
+ val[i] = acc;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/gsscramble.h b/ext/ipp/sources/ippcp/src/gsscramble.h
new file mode 100644
index 0000000..a60be4e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/gsscramble.h
@@ -0,0 +1,71 @@
+/*############################################################################
+ # Copyright 2013-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Fixed window exponentiation scramble/unscramble
+//
+// Contents:
+// gsGetScrambleBufferSize()
+// gsScramblePut()
+// gsScrambleGet()
+// gsScrambleGet_sscm()
+//
+//
+*/
+
+#if !defined(_GS_SCRAMBLE_H)
+#define _GS_SCRAMBLE_H
+
+#include "pcpbnuimpl.h"
+
+#define MAX_W (6)
+
+__INLINE unsigned int ct_msb(unsigned int a)
+{
+ return 0 - (a >> (sizeof(a) * 8 - 1));
+}
+
+__INLINE unsigned int ct_is_zero(unsigned int a)
+{
+ return ct_msb(~a & (a - 1));
+}
+
+__INLINE unsigned int ct_eq(unsigned int a, unsigned int b)
+{
+ return ct_is_zero(a ^ b);
+}
+
+__INLINE unsigned int ct_eq_int(int a, int b)
+{
+ return ct_eq((unsigned)(a), (unsigned)(b));
+}
+
+#define gsGetScrambleBufferSize OWNAPI(gsGetScrambleBufferSize)
+int gsGetScrambleBufferSize(int modulusLen, int w);
+
+#define gsScramblePut OWNAPI(gsScramblePut)
+void gsScramblePut(BNU_CHUNK_T* tbl, int idx, const BNU_CHUNK_T* val, int vLen, int w);
+
+#define gsScrambleGet OWNAPI(gsScrambleGet)
+void gsScrambleGet(BNU_CHUNK_T* val, int vLen, const BNU_CHUNK_T* tbl, int idx, int w);
+
+#define gsScrambleGet_sscm OWNAPI(gsScrambleGet_sscm)
+void gsScrambleGet_sscm(BNU_CHUNK_T* val, int vLen, const BNU_CHUNK_T* tbl, int idx, int w);
+
+#endif /* _GS_SCRAMBLE_H */
diff --git a/ext/ipp/sources/ippcp/src/owncp.h b/ext/ipp/sources/ippcp/src/owncp.h
new file mode 100644
index 0000000..30f2c03
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/owncp.h
@@ -0,0 +1,203 @@
+/*############################################################################
+ # Copyright 2002-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+*/
+
+#ifndef __OWNCP_H__
+#define __OWNCP_H__
+
+#ifndef __OWNDEFS_H__
+ #include "owndefs.h"
+#endif
+
+#ifndef IPPCP_H__
+ #include "ippcp.h"
+#endif
+
+/*
+// modes of the CPU feature
+*/
+#define _FEATURE_OFF_ (0) /* feature is OFF a priori */
+#define _FEATURE_ON_ (1) /* feature is ON a priori */
+#define _FEATURE_TICKTOCK_ (2) /* dectect is feature OFF/ON */
+
+//#define _ABL_
+#if defined(_ABL_)
+#include "pcpvariant_abl.h"
+#endif
+
+//#define _XMM7560_
+#if defined(_XMM7560_)
+# include "pcpvariant_xmm7560.h"
+//# pragma message ("standard configuration (pcpvariant.h) will be changed")
+#endif
+
+//#define _TXT_ACM_
+#if defined(_TXT_ACM_)
+# include "pcpvariant_txt_acm.h"
+#endif
+
+#include "pcpvariant.h"
+
+#pragma warning( disable : 4996 4324 4206)
+
+/* ippCP length */
+typedef int cpSize;
+
+/*
+// Common ippCP Macros
+*/
+
+/* size of cache line (bytes) */
+#if (_IPP==_IPP_M5)
+#define CACHE_LINE_SIZE (16)
+#define LOG_CACHE_LINE_SIZE (4)
+#else
+#define CACHE_LINE_SIZE (64)
+#define LOG_CACHE_LINE_SIZE (6)
+#endif
+
+/* swap data & pointers */
+#define SWAP_PTR(ATYPE, pX,pY) { ATYPE* aPtr=(pX); (pX)=(pY); (pY)=aPtr; }
+#define SWAP(x,y) {(x)^=(y); (y)^=(x); (x)^=(y);}
+
+/* alignment value */
+#define ALIGN_VAL ((int)sizeof(void*))
+
+/* bitsize */
+#define BYTESIZE (8)
+#define BITSIZE(x) ((int)(sizeof(x)*BYTESIZE))
+
+/* bit length -> byte/word length conversion */
+#define BITS2WORD8_SIZE(x) (((x)+ 7)>>3)
+#define BITS2WORD16_SIZE(x) (((x)+15)>>4)
+#define BITS2WORD32_SIZE(x) (((x)+31)>>5)
+#define BITS2WORD64_SIZE(x) (((x)+63)>>6)
+
+/* WORD and DWORD manipulators */
+#define LODWORD(x) ((Ipp32u)(x))
+#define HIDWORD(x) ((Ipp32u)(((Ipp64u)(x) >>32) & 0xFFFFFFFF))
+
+#define MAKEHWORD(bLo,bHi) ((Ipp16u)(((Ipp8u)(bLo)) | ((Ipp16u)((Ipp8u)(bHi))) << 8))
+#define MAKEWORD(hLo,hHi) ((Ipp32u)(((Ipp16u)(hLo)) | ((Ipp32u)((Ipp16u)(hHi))) << 16))
+#define MAKEDWORD(wLo,wHi) ((Ipp64u)(((Ipp32u)(wLo)) | ((Ipp64u)((Ipp32u)(wHi))) << 32))
+
+/* extract byte */
+#define EBYTE(w,n) ((Ipp8u)((w) >> (8 * (n))))
+
+/* hexString <-> Ipp32u conversion */
+#define HSTRING_TO_U32(ptrByte) \
+ (((ptrByte)[0]) <<24) \
+ +(((ptrByte)[1]) <<16) \
+ +(((ptrByte)[2]) <<8) \
+ +((ptrByte)[3])
+#define U32_TO_HSTRING(ptrByte, x) \
+ (ptrByte)[0] = (Ipp8u)((x)>>24); \
+ (ptrByte)[1] = (Ipp8u)((x)>>16); \
+ (ptrByte)[2] = (Ipp8u)((x)>>8); \
+ (ptrByte)[3] = (Ipp8u)(x)
+
+/* 32- and 64-bit masks for MSB of nbits-sequence */
+#define MAKEMASK32(nbits) (0xFFFFFFFF >>((32 - ((nbits)&0x1F)) &0x1F))
+#define MAKEMASK64(nbits) (0xFFFFFFFFFFFFFFFF >>((64 - ((nbits)&0x3F)) &0x3F))
+
+/* Logical Shifts (right and left) of WORD */
+#define LSR32(x,nBits) ((x)>>(nBits))
+#define LSL32(x,nBits) ((x)<<(nBits))
+
+/* Rorate (right and left) of WORD */
+#if defined(_MSC_VER) && !defined( __ICL )
+# include <stdlib.h>
+# define ROR32(x, nBits) _lrotr((x),(nBits))
+# define ROL32(x, nBits) _lrotl((x),(nBits))
+#else
+# define ROR32(x, nBits) (LSR32((x),(nBits)) | LSL32((x),32-(nBits)))
+# define ROL32(x, nBits) ROR32((x),(32-(nBits)))
+#endif
+
+/* Logical Shifts (right and left) of DWORD */
+#define LSR64(x,nBits) ((x)>>(nBits))
+#define LSL64(x,nBits) ((x)<<(nBits))
+
+/* Rorate (right and left) of DWORD */
+#define ROR64(x, nBits) (LSR64((x),(nBits)) | LSL64((x),64-(nBits)))
+#define ROL64(x, nBits) ROR64((x),(64-(nBits)))
+
+/* change endian */
+#if defined(_MSC_VER)
+# define ENDIANNESS(x) _byteswap_ulong((x))
+# define ENDIANNESS32(x) ENDIANNESS((x))
+# define ENDIANNESS64(x) _byteswap_uint64((x))
+#elif defined(__ICL)
+# define ENDIANNESS(x) _bswap((x))
+# define ENDIANNESS32(x) ENDIANNESS((x))
+# define ENDIANNESS64(x) _bswap64((x))
+#else
+# define ENDIANNESS(x) ((ROR32((x), 24) & 0x00ff00ff) | (ROR32((x), 8) & 0xff00ff00))
+# define ENDIANNESS32(x) ENDIANNESS((x))
+# define ENDIANNESS64(x) MAKEDWORD(ENDIANNESS(HIDWORD((x))), ENDIANNESS(LODWORD((x))))
+#endif
+
+#define IPP_MAKE_MULTIPLE_OF_8(x) ((x) = ((x)+7)&(~7))
+#define IPP_MAKE_MULTIPLE_OF_16(x) ((x) = ((x)+15)&(~15))
+
+/* define 64-bit constant */
+#if !defined(__GNUC__)
+ #define CONST_64(x) (x) /*(x##i64)*/
+#else
+ #define CONST_64(x) (x##LL)
+#endif
+
+/* define 64-bit constant or pair of 32-bit dependding on architecture */
+#if ((_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LP64) || (_IPP_ARCH == _IPP_ARCH_LRB) || (_IPP_ARCH == _IPP_ARCH_LRB2))
+#define LL(lo,hi) ((Ipp64u)(((Ipp32u)(lo)) | ((Ipp64u)((Ipp32u)(hi))) << 32))
+#define L_(lo) ((Ipp64u)(lo))
+#else
+#define LL(lo,hi) (lo),(hi)
+#define L_(lo) (lo)
+#endif
+
+
+/* crypto NI */
+#define AES_NI_ENABLED (ippCPUID_AES)
+#define CLMUL_NI_ENABLED (ippCPUID_CLMUL)
+#define AES_CLMUL_NI_ENABLED (ippCPUID_AES|ippCPUID_CLMUL)
+#define ADCOX_ENABLED (ippCPUID_ADCOX)
+#define SHA_NI_ENABLED (ippCPUID_SHA)
+#define RDRAND_NI_ENABLED (ippCPUID_RDRAND)
+#define RDSEED_NI_ENABLED (ippCPUID_RDSEED)
+
+int cpGetFeature( Ipp64u Feature );
+/* test CPU crypto features */
+__INLINE Ipp32u IsFeatureEnabled(Ipp64u niMmask)
+{
+ return cpGetFeature(niMmask);
+}
+
+#define IPPCP_GET_NUM_THREADS() ( ippcpGetEnabledNumThreads() )
+#define IPPCP_OMP_NUM_THREADS() num_threads( IPPCP_GET_NUM_THREADS() )
+#define IPPCP_OMP_LIMIT_MAX_NUM_THREADS(n) num_threads( IPP_MIN(IPPCP_GET_NUM_THREADS(),(n)))
+
+/* copy under mask */
+#define MASKED_COPY_BNU(dst, mask, src1, src2, len) { \
+ cpSize i; \
+ for(i=0; i<(len); i++) (dst)[i] = ((mask) & (src1)[i]) | (~(mask) & (src2)[i]); \
+}
+
+#endif /* __OWNCP_H__ */
diff --git a/ext/ipp/sources/ippcp/src/pcpbn.h b/ext/ipp/sources/ippcp/src/pcpbn.h
new file mode 100644
index 0000000..98c7639
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbn.h
@@ -0,0 +1,208 @@
+/*############################################################################
+ # Copyright 2002-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+//
+//
+*/
+
+#if !defined(_CP_BN_H)
+#define _CP_BN_H
+
+#include "pcpbnuimpl.h"
+#include "pcpbnuarith.h"
+#include "pcpbnumisc.h"
+#include "pcpbnu32arith.h"
+#include "pcpbnu32misc.h"
+
+/*
+// Big Number context
+*/
+struct _cpBigNum
+{
+ IppCtxId idCtx; /* BigNum ctx id */
+ IppsBigNumSGN sgn; /* sign */
+ cpSize size; /* BigNum size (BNU_CHUNK_T) */
+ cpSize room; /* BigNum max size (BNU_CHUNK_T) */
+ BNU_CHUNK_T* number; /* BigNum value */
+ BNU_CHUNK_T* buffer; /* temporary buffer */
+};
+
+/* BN accessory macros */
+#define BN_ID(pBN) ((pBN)->idCtx)
+#define BN_SIGN(pBN) ((pBN)->sgn)
+#define BN_POSITIVE(pBN) (BN_SIGN(pBN)==ippBigNumPOS)
+#define BN_NEGATIVE(pBN) (BN_SIGN(pBN)==ippBigNumNEG)
+#define BN_NUMBER(pBN) ((pBN)->number)
+#define BN_BUFFER(pBN) ((pBN)->buffer)
+#define BN_ROOM(pBN) ((pBN)->room)
+#define BN_SIZE(pBN) ((pBN)->size)
+#define BN_SIZE32(pBN) ((pBN)->size*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)))
+//#define BN_SIZE32(pBN) (BITS2WORD32_SIZE( BITSIZE_BNU(BN_NUMBER((pBN)),BN_SIZE((pBN)))))
+
+#define BN_VALID_ID(pBN) (BN_ID((pBN))==idCtxBigNum)
+
+#define INVERSE_SIGN(s) (((s)==ippBigNumPOS)? ippBigNumNEG : ippBigNumPOS)
+
+#define BN_ALIGNMENT ((int)sizeof(void*))
+
+
+/* pack-unpack context */
+#define cpPackBigNumCtx OWNAPI(cpPackBigNumCtx)
+ void cpPackBigNumCtx(const IppsBigNumState* pBN, Ipp8u* pBuffer);
+#define cpUnpackBigNumCtx OWNAPI(cpUnpackBigNumCtx)
+ void cpUnpackBigNumCtx(const Ipp8u* pBuffer, IppsBigNumState* pBN);
+
+/* copy BN */
+__INLINE IppsBigNumState* cpBN_copy(IppsBigNumState* pDst, const IppsBigNumState* pSrc)
+{
+ BN_SIGN(pDst) = BN_SIGN(pSrc);
+ BN_SIZE(pDst) = BN_SIZE(pSrc);
+ ZEXPAND_COPY_BNU(BN_NUMBER(pDst), BN_ROOM(pDst), BN_NUMBER(pSrc), BN_SIZE(pSrc));
+ return pDst;
+}
+/* set BN to zero */
+__INLINE IppsBigNumState* cpBN_zero(IppsBigNumState* pBN)
+{
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = 1;
+ ZEXPAND_BNU(BN_NUMBER(pBN),0, (int)BN_ROOM(pBN));
+ return pBN;
+}
+/* fixup BN */
+__INLINE IppsBigNumState* cpBN_fix(IppsBigNumState* pBN)
+{
+ cpSize len = BN_SIZE(pBN);
+ FIX_BNU(BN_NUMBER(pBN), len);
+ BN_SIZE(pBN) = len;
+ return pBN;
+}
+/* set BN to chunk */
+__INLINE IppsBigNumState* cpBN_chunk(IppsBigNumState* pBN, BNU_CHUNK_T a)
+{
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = 1;
+ ZEXPAND_BNU(BN_NUMBER(pBN),0, (int)BN_ROOM(pBN));
+ BN_NUMBER(pBN)[0] = a;
+ return pBN;
+}
+/* set BN to 2^m */
+__INLINE IppsBigNumState* cpBN_power2(IppsBigNumState* pBN, int power)
+{
+ cpSize size = BITS_BNU_CHUNK(power+1);
+ if(BN_ROOM(pBN) >= size) {
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = size;
+ ZEXPAND_BNU(BN_NUMBER(pBN),0, BN_ROOM(pBN));
+ SET_BIT(BN_NUMBER(pBN), power);
+ return pBN;
+ }
+ else return NULL;
+}
+
+/* bitsize of BN */
+__INLINE int cpBN_bitsize(const IppsBigNumState* pA)
+{
+ int bitsize = BITSIZE_BNU(BN_NUMBER(pA), BN_SIZE(pA));
+ return bitsize;
+}
+
+/* returns -1/0/+1 depemding on A~B comparison */
+__INLINE int cpBN_cmp(const IppsBigNumState* pA, const IppsBigNumState* pB)
+{
+ IppsBigNumSGN signA = BN_SIGN(pA);
+ IppsBigNumSGN signB = BN_SIGN(pB);
+
+ if(signA==signB) {
+ int result = cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), BN_NUMBER(pB), BN_SIZE(pB));
+ return (ippBigNumPOS==signA)? result : -result;
+ }
+ return (ippBigNumPOS==signA)? 1 : -1;
+}
+
+/* returns -1/0/+1 depemding on A comparison 0</==0/>0 */
+__INLINE int cpBN_tst(const IppsBigNumState* pA)
+{
+ if(1==BN_SIZE(pA) && 0==BN_NUMBER(pA)[0])
+ return 0;
+ else
+ return BN_POSITIVE(pA)? 1 : -1;
+}
+
+
+// some addtition functions
+__INLINE int IsZero_BN(const IppsBigNumState* pA)
+{
+ return ( BN_SIZE(pA)==1 ) && ( BN_NUMBER(pA)[0]==0 );
+}
+__INLINE int IsOdd_BN(const IppsBigNumState* pA)
+{
+ return BN_NUMBER(pA)[0] & 1;
+}
+
+__INLINE IppsBigNumState* BN_Word(IppsBigNumState* pBN, BNU_CHUNK_T w)
+{
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = 1;
+ ZEXPAND_BNU(BN_NUMBER(pBN),0, BN_ROOM(pBN));
+ BN_NUMBER(pBN)[0] = w;
+ return pBN;
+}
+__INLINE IppsBigNumState* BN_Set(const BNU_CHUNK_T* pData, cpSize len, IppsBigNumState* pBN)
+{
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = len;
+ ZEXPAND_COPY_BNU(BN_NUMBER(pBN), BN_ROOM(pBN), pData, len);
+ return pBN;
+}
+__INLINE IppsBigNumState* BN_Make(BNU_CHUNK_T* pData, BNU_CHUNK_T* pBuffer, cpSize len, IppsBigNumState* pBN)
+{
+ BN_ID(pBN) = idCtxBigNum;
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = 1;
+ BN_ROOM(pBN) = len;
+ BN_NUMBER(pBN) = pData;
+ BN_BUFFER(pBN) = pBuffer;
+ return pBN;
+}
+
+
+
+/*
+// fixed single chunk BN
+*/
+typedef struct _ippcpBigNumChunk {
+ IppsBigNumState bn;
+ BNU_CHUNK_T value;
+ BNU_CHUNK_T temporary;
+} IppsBigNumStateChunk;
+
+/* reference to BN(1) and BN(2) */
+#define cpBN_OneRef OWNAPI(cpBN_OneRef)
+IppsBigNumState* cpBN_OneRef(void);
+#define cpBN_TwoRef OWNAPI(cpBN_TwoRef)
+IppsBigNumState* cpBN_TwoRef(void);
+#define cpBN_ThreeRef OWNAPI(cpBN_ThreeRef)
+IppsBigNumState* cpBN_ThreeRef(void);
+
+#define BN_ONE_REF() cpBN_OneRef()
+#define BN_TWO_REF() cpBN_TwoRef()
+#define BN_THREE_REF() cpBN_ThreeRef()
+
+#endif /* _CP_BN_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpbnca.c b/ext/ipp/sources/ippcp/src/pcpbnca.c
new file mode 100644
index 0000000..0173d21
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnca.c
@@ -0,0 +1,1297 @@
+/*############################################################################
+ # Copyright 2002-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+// Contents:
+// ippsBigNumGetSize()
+// ippsBigNumInit()
+//
+// ippsSet_BN()
+// ippsGet_BN()
+// ippsGetSize_BN()
+// ippsExtGet_BN()
+// ippsRef_BN()
+//
+// ippsCmpZero_BN()
+// ippsCmp_BN()
+//
+// ippsAdd_BN()
+// ippsSub_BN()
+// ippsMul_BN()
+// ippsMAC_BN_I()
+// ippsDiv_BN()
+// ippsMod_BN()
+// ippsGcd_BN()
+// ippsModInv_BN()
+//
+// cpPackBigNumCtx(), cpUnpackBigNumCtx()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcptool.h"
+
+/* BN(1) and reference */
+static IppsBigNumStateChunk cpChunk_BN1 = {
+ {
+ idCtxBigNum,
+ ippBigNumPOS,
+ 1,1,
+ &cpChunk_BN1.value,&cpChunk_BN1.temporary
+ },
+ 1,0
+};
+
+#define cpBN_OneRef OWNAPI(cpBN_OneRef)
+IppsBigNumState* cpBN_OneRef(void)
+{ return &cpChunk_BN1.bn; };
+
+/* BN(2) and reference */
+static IppsBigNumStateChunk cpChunk_BN2 = {
+ {
+ idCtxBigNum,
+ ippBigNumPOS,
+ 1,1,
+ &cpChunk_BN2.value,&cpChunk_BN2.temporary
+ },
+ 2,0
+};
+#define cpBN_TwoRef OWNAPI(cpBN_TwoRef)
+IppsBigNumState* cpBN_TwoRef(void)
+{ return &cpChunk_BN2.bn; };
+
+/* BN(3) and reference */
+static IppsBigNumStateChunk cpChunk_BN3 = {
+ {
+ idCtxBigNum,
+ ippBigNumPOS,
+ 1,1,
+ &cpChunk_BN3.value,&cpChunk_BN3.temporary
+ },
+ 3,0
+};
+#define cpBN_ThreeRef OWNAPI(cpBN_ThreeRef)
+IppsBigNumState* cpBN_ThreeRef(void)
+{ return &cpChunk_BN3.bn; };
+
+
+
+/*F*
+// Name: ippsBigNumGetSize
+//
+// Purpose: Returns size of BigNum ctx (bytes).
+//
+// Returns: Reason:
+// ippStsNullPtrErr pCtxSize == NULL
+// ippStsLengthErr len32 < 1
+// len32 > BITS2WORD32_SIZE(BN_MAXBITSIZE)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtxSize pointer BigNum ctx size
+//
+*F*/
+IPPFUN(IppStatus, ippsBigNumGetSize, (cpSize len32, cpSize *pCtxSize))
+{
+ IPP_BAD_PTR1_RET(pCtxSize);
+ IPP_BADARG_RET(len32<1 || len32>BITS2WORD32_SIZE(BN_MAXBITSIZE), ippStsLengthErr);
+
+ {
+ /* convert length to the number of BNU_CHUNK_T */
+ cpSize len = INTERNAL_BNU_LENGTH(len32);
+
+ /* reserve one BNU_CHUNK_T more for cpDiv_BNU,
+ mul, mont exp operations */
+ len++;
+
+ *pCtxSize = sizeof(IppsBigNumState)
+ + len*sizeof(BNU_CHUNK_T)
+ + len*sizeof(BNU_CHUNK_T)
+ + BN_ALIGNMENT-1;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsBigNumInit
+//
+// Purpose: Init BigNum spec for future usage.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// ippStsLengthErr len32<1
+// len32 > BITS2WORD32_SIZE(BN_MAXBITSIZE)
+// ippStsNoErr no errors
+//
+// Parameters:
+// len32 max BN length (32-bits segments)
+// pBN BigNum ctx
+//
+*F*/
+IPPFUN(IppStatus, ippsBigNumInit, (cpSize len32, IppsBigNumState* pBN))
+{
+ IPP_BADARG_RET(len32<1 || len32>BITS2WORD32_SIZE(BN_MAXBITSIZE), ippStsLengthErr);
+ IPP_BAD_PTR1_RET(pBN);
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+
+ {
+ Ipp8u* ptr = (Ipp8u*)pBN;
+
+ /* convert length to the number of BNU_CHUNK_T */
+ cpSize len = INTERNAL_BNU_LENGTH(len32);
+
+ BN_ID(pBN) = idCtxUnknown;
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = 1; /* initial valie is zero */
+ BN_ROOM(pBN) = len; /* close to what has been passed by user */
+
+ /* reserve one BNU_CHUNK_T more for cpDiv_BNU,
+ mul, mont exp operations */
+ len++;
+
+ /* allocate buffers */
+ BN_NUMBER(pBN) = (BNU_CHUNK_T*)(ptr += sizeof(IppsBigNumState));
+ BN_BUFFER(pBN) = (BNU_CHUNK_T*)(ptr += len*sizeof(BNU_CHUNK_T)); /* use expanded length here */
+
+ /* set BN value and buffer to zero */
+ ZEXPAND_BNU(BN_NUMBER(pBN), 0, len);
+ ZEXPAND_BNU(BN_BUFFER(pBN), 0, len);
+
+ BN_ID(pBN) = idCtxBigNum;
+ return ippStsNoErr;
+ }
+}
+
+/*
+// Serialize / Deserialize bigNum context
+*/
+void cpPackBigNumCtx(const IppsBigNumState* pBN, Ipp8u* pBuffer)
+{
+ IppsBigNumState* pAlignedBuffer = (IppsBigNumState*)(IPP_ALIGNED_PTR((pBuffer), BN_ALIGNMENT));
+ CopyBlock(pBN, pAlignedBuffer, sizeof(IppsBigNumState));
+ BN_NUMBER(pAlignedBuffer) = (BNU_CHUNK_T*)((Ipp8u*)NULL + IPP_UINT_PTR(BN_NUMBER(pBN))-IPP_UINT_PTR(pBN));
+ BN_BUFFER(pAlignedBuffer) = (BNU_CHUNK_T*)((Ipp8u*)NULL + IPP_UINT_PTR(BN_BUFFER(pBN))-IPP_UINT_PTR(pBN));
+ CopyBlock(BN_NUMBER(pBN), (Ipp8u*)pAlignedBuffer+IPP_UINT_PTR(BN_NUMBER(pAlignedBuffer)), BN_ROOM(pBN)*sizeof(BNU_CHUNK_T));
+ CopyBlock(BN_BUFFER(pBN), (Ipp8u*)pAlignedBuffer+IPP_UINT_PTR(BN_BUFFER(pAlignedBuffer)), BN_ROOM(pBN)*sizeof(BNU_CHUNK_T));
+}
+
+void cpUnpackBigNumCtx(const Ipp8u* pBuffer, IppsBigNumState* pBN)
+{
+ IppsBigNumState* pAlignedBuffer = (IppsBigNumState*)(IPP_ALIGNED_PTR((pBuffer), BN_ALIGNMENT));
+ CopyBlock(pBuffer, pBN, sizeof(IppsBigNumState));
+ BN_NUMBER(pBN) = (BNU_CHUNK_T*)((Ipp8u*)pBN + IPP_UINT_PTR(BN_NUMBER(pAlignedBuffer)));
+ BN_BUFFER(pBN) = (BNU_CHUNK_T*)((Ipp8u*)pBN + IPP_UINT_PTR(BN_BUFFER(pAlignedBuffer)));
+ CopyBlock((Ipp8u*)pAlignedBuffer+IPP_UINT_PTR(BN_NUMBER(pAlignedBuffer)), BN_NUMBER(pBN), BN_ROOM(pBN)*sizeof(BNU_CHUNK_T));
+ CopyBlock((Ipp8u*)pAlignedBuffer+IPP_UINT_PTR(BN_BUFFER(pAlignedBuffer)), BN_BUFFER(pBN), BN_ROOM(pBN)*sizeof(BNU_CHUNK_T));
+}
+
+
+/*F*
+// Name: ippsCmpZero_BN
+//
+// Purpose: Test BigNum value.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// pResult == NULL
+// ippStsContextMatchErr BN_VALID_ID()
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBN BigNum ctx
+// pResult result of comparison
+//
+*F*/
+IPPFUN(IppStatus, ippsCmpZero_BN, (const IppsBigNumState* pBN, Ipp32u* pResult))
+{
+ IPP_BAD_PTR2_RET(pBN, pResult);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ if(BN_SIZE(pBN)==1 && BN_NUMBER(pBN)[0]==0)
+ *pResult = IS_ZERO;
+ else if (BN_SIGN(pBN)==ippBigNumPOS)
+ *pResult = GREATER_THAN_ZERO;
+ else if (BN_SIGN(pBN)==ippBigNumNEG)
+ *pResult = LESS_THAN_ZERO;
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsCmp_BN
+//
+// Purpose: Compare two BigNums.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pResult == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA BigNum ctx
+// pB BigNum ctx
+// pResult result of comparison
+//
+*F*/
+IPPFUN(IppStatus, ippsCmp_BN,(const IppsBigNumState* pA, const IppsBigNumState* pB, Ipp32u *pResult))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pResult);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+
+ {
+ int res;
+ if(BN_SIGN(pA)==BN_SIGN(pB)) {
+ res = cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), BN_NUMBER(pB), BN_SIZE(pB));
+ if(ippBigNumNEG==BN_SIGN(pA))
+ res = -res;
+ }
+ else
+ res = (ippBigNumPOS==BN_SIGN(pA))? 1 :-1;
+
+ *pResult = (1==res)? IPP_IS_GT : (-1==res)? IPP_IS_LT : IPP_IS_EQ;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsGetSize_BN
+//
+// Purpose: Returns BigNum room.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// pSize == NULL
+// ippStsContextMatchErr BN_VALID_ID(pBN)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBN BigNum ctx
+// pSize max BigNum length (in Ipp32u chunks)
+//
+*F*/
+IPPFUN(IppStatus, ippsGetSize_BN, (const IppsBigNumState* pBN, cpSize* pSize))
+{
+ IPP_BAD_PTR2_RET(pBN, pSize);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ *pSize = BN_ROOM(pBN)*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u);
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsSet_BN
+//
+// Purpose: Set BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// pData == NULL
+// ippStsContextMatchErr BN_VALID_ID(pBN)
+// ippStsLengthErr len32 < 1
+// ippStsOutOfRangeErr len32 > BN_ROOM()
+// ippStsNoErr no errors
+//
+// Parameters:
+// sgn sign
+// len32 data size (in Ipp32u chunks)
+// pData source data pointer
+// pBn BigNum ctx
+//
+*F*/
+IPPFUN(IppStatus, ippsSet_BN, (IppsBigNumSGN sgn, cpSize len32, const Ipp32u* pData,
+ IppsBigNumState* pBN))
+{
+ IPP_BAD_PTR2_RET(pData, pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(len32<1, ippStsLengthErr);
+
+ /* compute real size */
+ FIX_BNU(pData, len32);
+
+ {
+ cpSize len = INTERNAL_BNU_LENGTH(len32);
+ IPP_BADARG_RET(len > BN_ROOM(pBN), ippStsOutOfRangeErr);
+
+ ZEXPAND_COPY_BNU((Ipp32u*)BN_NUMBER(pBN), BN_ROOM(pBN)*(int)(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)), pData, len32);
+
+ BN_SIZE(pBN) = len;
+
+ if(len32==1 && pData[0] == 0)
+ sgn = ippBigNumPOS; /* consider zero value as positive */
+ BN_SIGN(pBN) = sgn;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsGet_BN
+//
+// Purpose: Get BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// pData == NULL
+// pSgn == NULL
+// pLen32 ==NULL
+// ippStsContextMatchErr !BN_VALID_ID(pBN)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSgn pointer to the sign
+// pLen32 pointer to the data size (in Ipp32u chunks)
+// pData pointer to the data buffer
+// pBN BigNum ctx
+//
+*F*/
+IPPFUN(IppStatus, ippsGet_BN, (IppsBigNumSGN* pSgn, cpSize* pLen32, Ipp32u* pData,
+ const IppsBigNumState* pBN))
+{
+ IPP_BAD_PTR4_RET(pSgn, pLen32, pData, pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ {
+ cpSize len32 = BN_SIZE(pBN)*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u);
+ Ipp32u* bnData = (Ipp32u*)BN_NUMBER(pBN);
+
+ FIX_BNU(bnData, len32);
+ COPY_BNU(pData, bnData, len32);
+
+ *pSgn = BN_SIGN(pBN);
+ *pLen32 = len32;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsRef_BN
+//
+// Purpose: Get BigNum info.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBN == NULL
+// ippStsContextMatchErr BN_VALID_ID(pBN)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSgn pointer to the sign
+// pBitSize pointer to the data size (in bits)
+// ppData pointer to the data buffer
+// pBN BigNum ctx
+//
+*F*/
+IPPFUN(IppStatus, ippsRef_BN, (IppsBigNumSGN* pSgn, cpSize* pBitSize, Ipp32u** const ppData,
+ const IppsBigNumState *pBN))
+{
+ IPP_BAD_PTR1_RET(pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ if(pSgn)
+ *pSgn = BN_SIGN(pBN);
+ if(pBitSize) {
+ cpSize bitLen = BITSIZE_BNU(BN_NUMBER(pBN), BN_SIZE(pBN));
+ *pBitSize = bitLen? bitLen : 1;
+ }
+
+ if(ppData)
+ *ppData = (Ipp32u*)BN_NUMBER(pBN);
+
+ return ippStsNoErr;
+}
+
+
+IPPFUN(IppStatus, ippsExtGet_BN, (IppsBigNumSGN* pSgn, cpSize* pBitSize, Ipp32u* pData,
+ const IppsBigNumState* pBN))
+{
+ IPP_BAD_PTR1_RET(pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ {
+ cpSize bitSize = BITSIZE_BNU(BN_NUMBER(pBN), BN_SIZE(pBN));
+ if(0==bitSize)
+ bitSize = 1;
+ if(pData)
+ COPY_BNU(pData, (Ipp32u*)BN_NUMBER(pBN), BITS2WORD32_SIZE(bitSize));
+ if(pSgn)
+ *pSgn = BN_SIGN(pBN);
+ if(pBitSize)
+ *pBitSize = bitSize;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsAdd_BN
+//
+// Purpose: Add BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pR can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pR resultant BigNum
+//
+*F*/
+IPPFUN(IppStatus, ippsAdd_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ {
+ cpSize nsA = BN_SIZE(pA);
+ cpSize nsB = BN_SIZE(pB);
+ cpSize nsR = BN_ROOM(pR);
+ IPP_BADARG_RET(nsR < IPP_MAX(nsA, nsB), ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+
+ IppsBigNumSGN sgnA = BN_SIGN(pA);
+ IppsBigNumSGN sgnB = BN_SIGN(pB);
+ BNU_CHUNK_T* pDataA = BN_NUMBER(pA);
+ BNU_CHUNK_T* pDataB = BN_NUMBER(pB);
+
+ BNU_CHUNK_T carry;
+
+ if(sgnA==sgnB) {
+ if(nsA < nsB) {
+ SWAP(nsA, nsB);
+ SWAP_PTR(BNU_CHUNK_T, pDataA, pDataB);
+ }
+
+ carry = cpAdd_BNU(pDataR, pDataA, pDataB, nsB);
+ if(nsA>nsB)
+ carry = cpInc_BNU(pDataR+nsB, pDataA+nsB, nsA-nsB, carry);
+ if(carry) {
+ if(nsR>nsA)
+ pDataR[nsA++] = carry;
+ else
+ IPP_ERROR_RET(ippStsOutOfRangeErr);
+ }
+ BN_SIGN(pR) = sgnA;
+ }
+
+ else {
+ int cmpRes = cpCmp_BNU(pDataA, nsA, pDataB, nsB);
+
+ if(0==cmpRes) {
+ pDataR[0] = 0;
+ BN_SIZE(pR) = 1;
+ BN_SIGN(pR) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+
+ if(0>cmpRes) {
+ SWAP(nsA, nsB);
+ SWAP_PTR(BNU_CHUNK_T, pDataA, pDataB);
+ }
+
+ carry = cpSub_BNU(pDataR, pDataA, pDataB, nsB);
+ if(nsA>nsB)
+ cpDec_BNU(pDataR+nsB, pDataA+nsB, nsA-nsB, carry);
+
+ BN_SIGN(pR) = cmpRes>0? sgnA : INVERSE_SIGN(sgnA);
+ }
+
+ FIX_BNU(pDataR, nsA);
+ BN_SIZE(pR) = nsA;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsSub_BN
+//
+// Purpose: Subtcrac BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pR can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pR resultant BigNum
+//
+*F*/
+IPPFUN(IppStatus, ippsSub_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ {
+ cpSize nsA = BN_SIZE(pA);
+ cpSize nsB = BN_SIZE(pB);
+ cpSize nsR = BN_ROOM(pR);
+ IPP_BADARG_RET(nsR < IPP_MAX(nsA, nsB), ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+
+ IppsBigNumSGN sgnA = BN_SIGN(pA);
+ IppsBigNumSGN sgnB = BN_SIGN(pB);
+ BNU_CHUNK_T* pDataA = BN_NUMBER(pA);
+ BNU_CHUNK_T* pDataB = BN_NUMBER(pB);
+
+ BNU_CHUNK_T carry;
+
+ if(sgnA!=sgnB) {
+ if(nsA < nsB) {
+ SWAP(nsA, nsB);
+ SWAP_PTR(BNU_CHUNK_T, pDataA, pDataB);
+ }
+
+ carry = cpAdd_BNU(pDataR, pDataA, pDataB, nsB);
+ if(nsA>nsB)
+ carry = cpInc_BNU(pDataR+nsB, pDataA+nsB, nsA-nsB, carry);
+ if(carry) {
+ if(nsR > nsA)
+ pDataR[nsA++] = carry;
+ else
+ IPP_ERROR_RET(ippStsOutOfRangeErr);
+ }
+ BN_SIGN(pR) = sgnA;
+ }
+
+ else {
+ int cmpRes= cpCmp_BNU(pDataA, nsA, pDataB, nsB);
+
+ if(0==cmpRes) {
+ ZEXPAND_BNU(pDataR,0, nsR);
+ BN_SIZE(pR) = 1;
+ BN_SIGN(pR) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+
+ if(0>cmpRes) {
+ SWAP(nsA, nsB);
+ SWAP_PTR(BNU_CHUNK_T, pDataA, pDataB);
+ }
+
+ carry = cpSub_BNU(pDataR, pDataA, pDataB, nsB);
+ if(nsA>nsB)
+ cpDec_BNU(pDataR+nsB, pDataA+nsB, nsA-nsB, carry);
+
+ BN_SIGN(pR) = cmpRes>0? sgnA : INVERSE_SIGN(sgnA);
+ }
+
+ FIX_BNU(pDataR, nsA);
+ BN_SIZE(pR) = nsA;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsMul_BN
+//
+// Purpose: Multiply BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pR can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pR resultant BigNum
+//
+*F*/
+IPPFUN(IppStatus, ippsMul_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ {
+ BNU_CHUNK_T* pDataA = BN_NUMBER(pA);
+ BNU_CHUNK_T* pDataB = BN_NUMBER(pB);
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+
+ cpSize nsA = BN_SIZE(pA);
+ cpSize nsB = BN_SIZE(pB);
+ cpSize nsR = BN_ROOM(pR);
+
+ cpSize bitSizeA = BITSIZE_BNU(pDataA, nsA);
+ cpSize bitSizeB = BITSIZE_BNU(pDataB, nsB);
+
+ /* test if multiplicant/multiplier is zero */
+ if(!bitSizeA || !bitSizeB) {
+ BN_SIZE(pR) = 1;
+ BN_SIGN(pR) = IppsBigNumPOS;
+ pDataR[0] = 0;
+ return ippStsNoErr;
+ }
+
+ /* test if even low estimation of product A*B exceeded */
+ IPP_BADARG_RET(nsR*BNU_CHUNK_BITS < (bitSizeA+bitSizeB-1), ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* aData = pDataA;
+ BNU_CHUNK_T* bData = pDataB;
+
+ if(pA == pR) {
+ aData = BN_BUFFER(pR);
+ COPY_BNU(aData, pDataA, nsA);
+ }
+ if((pB == pR) && (pA != pB)) {
+ bData = BN_BUFFER(pR);
+ COPY_BNU(bData, pDataB, nsB);
+ }
+
+ /* clear result */
+ ZEXPAND_BNU(pDataR, 0, nsR+1);
+
+ if(pA==pB)
+ cpSqr_BNU_school(pDataR, aData, nsA);
+ else
+ cpMul_BNU_school(pDataR, aData, nsA, bData, nsB);
+
+ nsR = (bitSizeA + bitSizeB + BNU_CHUNK_BITS - 1) /BNU_CHUNK_BITS;
+ FIX_BNU(pDataR, nsR);
+ IPP_BADARG_RET(nsR>BN_ROOM(pR), ippStsOutOfRangeErr);
+
+ BN_SIZE(pR) = nsR;
+ BN_SIGN(pR) = (BN_SIGN(pA)==BN_SIGN(pB)? ippBigNumPOS : ippBigNumNEG);
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsMAC_BN_I
+//
+// Purpose: Multiply and Accumulate BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pR can not fit result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pR resultant BigNum
+//
+*F*/
+IPPFUN(IppStatus, ippsMAC_BN_I, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ {
+ BNU_CHUNK_T* pDataA = BN_NUMBER(pA);
+ BNU_CHUNK_T* pDataB = BN_NUMBER(pB);
+
+ cpSize nsA = BN_SIZE(pA);
+ cpSize nsB = BN_SIZE(pB);
+
+ cpSize bitSizeA = BITSIZE_BNU(pDataA, nsA);
+ cpSize bitSizeB = BITSIZE_BNU(pDataB, nsB);
+ /* size of temporary pruduct */
+ cpSize nsP = BITS_BNU_CHUNK(bitSizeA+bitSizeB);
+
+ /* test if multiplicant/multiplier is zero */
+ if(!bitSizeA || !bitSizeB) return ippStsNoErr;
+ /* test if product can't fit to the result */
+ IPP_BADARG_RET(BN_ROOM(pR)<nsP, ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+ IppsBigNumSGN sgnR = BN_SIGN(pR);
+ cpSize nsR = BN_SIZE(pR);
+ cpSize room = BN_ROOM(pR);
+
+ /* temporary product */
+ BNU_CHUNK_T* pDataP = BN_BUFFER(pR);
+ IppsBigNumSGN sgnP = BN_SIGN(pA)==BN_SIGN(pB)? ippBigNumPOS : ippBigNumNEG;
+
+ /* clear the rest of R data buffer */
+ ZEXPAND_BNU(pDataR, nsR, room);
+
+ /* temporary product */
+ if(pA==pB)
+ cpSqr_BNU_school(pDataP, pDataA, nsA);
+ else
+ cpMul_BNU_school(pDataP, pDataA, nsA, pDataB, nsB);
+ /* clear the rest of rpoduct */
+ ZEXPAND_BNU(pDataP, nsP, room);
+
+ if(sgnR==sgnP) {
+ BNU_CHUNK_T carry = cpAdd_BNU(pDataR, pDataR, pDataP, room);
+ if(carry) {
+ BN_SIZE(pR) = room;
+ IPP_ERROR_RET(ippStsOutOfRangeErr);
+ }
+ }
+
+ else {
+ BNU_CHUNK_T* pTmp = pDataR;
+ int cmpRes = cpCmp_BNU(pDataR, room, pDataP, room);
+ if(0>cmpRes) {
+ SWAP_PTR(BNU_CHUNK_T, pTmp, pDataP);
+ }
+ cpSub_BNU(pDataR, pTmp, pDataP, room);
+
+ BN_SIGN(pR) = cmpRes>0? sgnR : INVERSE_SIGN(sgnR);
+ }
+
+ FIX_BNU(pDataR, room);
+ BN_SIZE(pR) = room;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsDiv_BN
+//
+// Purpose: Divide BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pQ == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pQ)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pQ and/or pR can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pQ quotient BigNum
+// pR reminder BigNum
+//
+// A = Q*B + R, 0 <= val(R) < val(B), sgn(A)==sgn(R)
+//
+*F*/
+IPPFUN(IppStatus, ippsDiv_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pQ, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR4_RET(pA, pB, pQ, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ pQ = (IppsBigNumState*)( IPP_ALIGNED_PTR(pQ, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pQ), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_SIZE(pB)== 1 && BN_NUMBER(pB)[0]==0, ippStsDivByZeroErr);
+
+ IPP_BADARG_RET(BN_ROOM(pR)<BN_SIZE(pB), ippStsOutOfRangeErr);
+ IPP_BADARG_RET((int)BN_ROOM(pQ)<(int)(BN_SIZE(pA)-BN_SIZE(pB)), ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* pDataA = BN_BUFFER(pA);
+ cpSize nsA = BN_SIZE(pA);
+ BNU_CHUNK_T* pDataB = BN_NUMBER(pB);
+ cpSize nsB = BN_SIZE(pB);
+ BNU_CHUNK_T* pDataQ = BN_NUMBER(pQ);
+ cpSize nsQ;
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+ cpSize nsR;
+
+ COPY_BNU(pDataA, BN_NUMBER(pA), nsA);
+ nsR = cpDiv_BNU(pDataQ, &nsQ, pDataA, nsA, pDataB, nsB);
+ COPY_BNU(pDataR, pDataA, nsR);
+
+ BN_SIGN(pQ) = BN_SIGN(pA)==BN_SIGN(pB)? ippBigNumPOS : ippBigNumNEG;
+ BN_SIZE(pQ) = nsQ;
+ if(nsQ==1 && pDataQ[0]==0) BN_SIGN(pQ) = ippBigNumPOS;
+
+ BN_SIGN(pR) = BN_SIGN(pA);
+ BN_SIZE(pR) = nsR;
+ if(nsR==1 && pDataR[0]==0) BN_SIGN(pR) = ippBigNumPOS;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsMod_BN
+//
+// Purpose: reduction BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pM == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pM)
+// BN_VALID_ID(pR)
+// ippStsOutOfRangeErr pR can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pR reminder BigNum
+//
+// A = Q*M + R, 0 <= R < B
+//
+*F*/
+IPPFUN(IppStatus, ippsMod_BN, (IppsBigNumState* pA, IppsBigNumState* pM, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pA, pM, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pM = (IppsBigNumState*)( IPP_ALIGNED_PTR(pM, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pM), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_NEGATIVE(pM), ippStsBadModulusErr);
+ IPP_BADARG_RET(BN_SIZE(pM)== 1 && BN_NUMBER(pM)[0]==0, ippStsBadModulusErr);
+
+ IPP_BADARG_RET(BN_ROOM(pR)<BN_SIZE(pM), ippStsOutOfRangeErr);
+
+ if(cpEqu_BNU_CHUNK(BN_NUMBER(pA), BN_SIZE(pA), 0)) {
+ BN_SIGN(pR) = ippBigNumPOS;
+ BN_SIZE(pR) = 1;
+ BN_NUMBER(pR)[0] = 0;
+ }
+
+ else {
+ BNU_CHUNK_T* pDataM = BN_NUMBER(pM);
+ cpSize nsM = BN_SIZE(pM);
+ BNU_CHUNK_T* pBuffA = BN_BUFFER(pA);
+ cpSize nsA = BN_SIZE(pA);
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+ cpSize nsR;
+
+ COPY_BNU(pBuffA, BN_NUMBER(pA), nsA);
+ nsR = cpMod_BNU(pBuffA, nsA, pDataM, nsM);
+
+ COPY_BNU(pDataR, pBuffA, nsR);
+ BN_SIZE(pR) = nsR;
+ BN_SIGN(pR) = ippBigNumPOS;
+
+ if(BN_NEGATIVE(pA) && !(nsR==1 && pDataR[0]==0)) {
+ ZEXPAND_BNU(pDataR, nsR, nsM);
+ cpSub_BNU(pDataR, pDataM, pDataR, nsM);
+ FIX_BNU(pDataR, nsM);
+ BN_SIZE(pR) = nsM;
+ }
+ }
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsGcd_BN
+//
+// Purpose: compute GCD value.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pB == NULL
+// pG == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pB)
+// BN_VALID_ID(pG)
+// ippStsBadArgErr A==B==0
+// ippStsOutOfRangeErr pG can not hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA source BigNum
+// pB source BigNum
+// pG GCD value
+//
+*F*/
+IPPFUN(IppStatus, ippsGcd_BN, (IppsBigNumState* pA, IppsBigNumState* pB, IppsBigNumState* pG))
+{
+ IPP_BAD_PTR3_RET(pA, pB, pG);
+
+ pA = (IppsBigNumState*)(IPP_ALIGNED_PTR(pA, BN_ALIGNMENT));
+ pB = (IppsBigNumState*)(IPP_ALIGNED_PTR(pB, BN_ALIGNMENT));
+ pG = (IppsBigNumState*)(IPP_ALIGNED_PTR(pG, BN_ALIGNMENT));
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pG), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_ROOM(pG) < IPP_MIN(BN_SIZE(pA), BN_SIZE(pB)), ippStsOutOfRangeErr);
+
+ {
+ IppsBigNumState* x = pA;
+ IppsBigNumState* y = pB;
+ IppsBigNumState* g = pG;
+
+ int aIsZero = BN_SIZE(pA)==1 && BN_NUMBER(pA)[0]==0;
+ int bIsZero = BN_SIZE(pB)==1 && BN_NUMBER(pB)[0]==0;
+
+ if(aIsZero && bIsZero)
+ return ippStsBadArgErr;
+ if(aIsZero && !bIsZero) {
+ COPY_BNU(BN_NUMBER(g), BN_NUMBER(pB), BN_SIZE(pB));
+ BN_SIZE(g) = BN_SIZE(pB);
+ BN_SIGN(g) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+ if(bIsZero && !aIsZero) {
+ COPY_BNU(BN_NUMBER(g), BN_NUMBER(pA), BN_SIZE(pA));
+ BN_SIZE(g) = BN_SIZE(pA);
+ BN_SIGN(g) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+
+ /*
+ // Lehmer's algorithm requres that first number must be greater than second
+ // x is the first, y is the second
+ */
+ {
+ int cmpRes = cpCmp_BNU(BN_NUMBER(x), BN_SIZE(x), BN_NUMBER(y), BN_SIZE(y));
+ if(0>cmpRes)
+ SWAP_PTR(IppsBigNumState, x, y);
+ if(0==cmpRes) {
+ COPY_BNU(BN_NUMBER(g), BN_NUMBER(x), BN_SIZE(x));
+ BN_SIGN(g) = ippBigNumPOS;
+ BN_SIZE(g) = BN_SIZE(x);
+ return ippStsNoErr;
+ }
+ if(BN_SIZE(x)==1) {
+ BNU_CHUNK_T gcd = cpGcd_BNU(BN_NUMBER(x)[0], BN_NUMBER(y)[0]);
+ BN_NUMBER(g)[0] = gcd;
+ BN_SIZE(g) = 1;
+ return ippStsNoErr;
+ }
+ }
+
+ {
+ Ipp32u* xBuffer = (Ipp32u*)BN_BUFFER(x);
+ Ipp32u* yBuffer = (Ipp32u*)BN_BUFFER(y);
+ Ipp32u* gBuffer = (Ipp32u*)BN_BUFFER(g);
+ Ipp32u* xData = (Ipp32u*)BN_NUMBER(x);
+ Ipp32u* yData = (Ipp32u*)BN_NUMBER(y);
+ Ipp32u* gData = (Ipp32u*)BN_NUMBER(g);
+ cpSize nsXmax = BN_ROOM(x)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u));
+ cpSize nsYmax = BN_ROOM(y)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u));
+ cpSize nsGmax = BN_ROOM(g)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u));
+ cpSize nsX = BN_SIZE(x)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u));
+ cpSize nsY = BN_SIZE(y)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u));
+
+ Ipp32u* T;
+ Ipp32u* u;
+
+ FIX_BNU(xData, nsX);
+ FIX_BNU(yData, nsY);
+
+ /* init buffers */
+ ZEXPAND_COPY_BNU(xBuffer, nsXmax, xData, nsX);
+ ZEXPAND_COPY_BNU(yBuffer, nsYmax, yData, nsY);
+
+ T = gBuffer;
+ u = gData;
+ ZEXPAND_BNU(T, 0, nsGmax);
+ ZEXPAND_BNU(u, 0, nsGmax);
+
+ while(nsX > (cpSize)(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u))) {
+ /* xx and yy is the high-order digits of x and y (yy could be 0) */
+
+ Ipp64u xx = (Ipp64u)(xBuffer[nsX-1]);
+ Ipp64u yy = (nsY < nsX)? 0 : (Ipp64u)(yBuffer[nsY-1]);
+
+ Ipp64s AA = 1;
+ Ipp64s BB = 0;
+ Ipp64s CC = 0;
+ Ipp64s DD = 1;
+ Ipp64s t;
+
+ while((yy+CC)!=0 && (yy+DD)!=0) {
+ Ipp64u q = ( xx + AA ) / ( yy + CC );
+ Ipp64u q1 = ( xx + BB ) / ( yy + DD );
+ if(q!=q1)
+ break;
+ t = AA - q*CC;
+ AA = CC;
+ CC = t;
+ t = BB - q*DD;
+ BB = DD;
+ DD = t;
+ t = xx - q*yy;
+ xx = yy;
+ yy = t;
+ }
+
+ if(BB == 0) {
+ /* T = x mod y */
+ cpSize nsT = cpMod_BNU32(xBuffer, nsX, yBuffer, nsY);
+ ZEXPAND_BNU(T, 0, nsGmax);
+ COPY_BNU(T, xBuffer, nsT);
+ /* a = b; b = T; */
+ ZEXPAND_BNU(xBuffer, 0, nsXmax);
+ COPY_BNU(xBuffer, yBuffer, nsY);
+ ZEXPAND_BNU(yBuffer, 0, nsYmax);
+ COPY_BNU(yBuffer, T, nsY);
+ }
+
+ else {
+ Ipp32u carry;
+ /*
+ // T = AA*x + BB*y;
+ // u = CC*x + DD*y;
+ // b = u; a = T;
+ */
+ if((AA <= 0)&&(BB>=0)) {
+ Ipp32u a1 = (Ipp32u)(-AA);
+ carry = cpMulDgt_BNU32(T, yBuffer, nsY, (Ipp32u)BB);
+ carry = cpMulDgt_BNU32(u, xBuffer, nsY, a1);
+ /* T = BB*y - AA*x; */
+ carry = cpSub_BNU32(T, T, u, nsY);
+ }
+ else {
+ if((AA >= 0)&&(BB<=0)) {
+ Ipp32u b1 = (Ipp32u)(-BB);
+ carry = cpMulDgt_BNU32(T, xBuffer, nsY, (Ipp32u)AA);
+ carry = cpMulDgt_BNU32(u, yBuffer, nsY, b1);
+ /* T = AA*x - BB*y; */
+ carry = cpSub_BNU32(T, T, u, nsY);
+ }
+ else {
+ /*AA*BB>=0 */
+ carry = cpMulDgt_BNU32(T, xBuffer, nsY, (Ipp32u)AA);
+ carry = cpMulDgt_BNU32(u, yBuffer, nsY, (Ipp32u)BB);
+ /* T = AA*x + BB*y; */
+ carry = cpAdd_BNU32(T, T, u, nsY);
+ }
+ }
+
+ /* Now T is reserved. We use only u for intermediate results. */
+ if((CC <= 0)&&(DD>=0)){
+ Ipp32u c1 = (Ipp32u)(-CC);
+ /* u = x*CC; x = u; */
+ carry = cpMulDgt_BNU32(u, xBuffer, nsY, c1);
+ COPY_BNU(xBuffer, u, nsY);
+ /* u = y*DD; */
+ carry = cpMulDgt_BNU32(u, yBuffer, nsY, (Ipp32u)DD);
+ /* u = DD*y - CC*x; */
+ carry = cpSub_BNU32(u, u, xBuffer, nsY);
+ }
+ else {
+ if((CC >= 0)&&(DD<=0)){
+ Ipp32u d1 = (Ipp32u)(-DD);
+ /* u = y*DD; y = u */
+ carry = cpMulDgt_BNU32(u, yBuffer, nsY, d1);
+ COPY_BNU(yBuffer, u, nsY);
+ /* u = CC*x; */
+ carry = cpMulDgt_BNU32(u, xBuffer, nsY, (Ipp32u)CC);
+ /* u = CC*x - DD*y; */
+ carry = cpSub_BNU32(u, u, yBuffer, nsY);
+ }
+ else {
+ /*CC*DD>=0 */
+ /* y = y*DD */
+ carry = cpMulDgt_BNU32(u, yBuffer, nsY, (Ipp32u)DD);
+ COPY_BNU(yBuffer, u, nsY);
+ /* u = x*CC */
+ carry = cpMulDgt_BNU32(u, xBuffer, nsY, (Ipp32u)CC);
+ /* u = x*CC + y*DD */
+ carry = cpAdd_BNU32(u, u, yBuffer, nsY);
+ }
+ }
+
+ /* y = u; x = T; */
+ COPY_BNU(yBuffer, u, nsY);
+ COPY_BNU(xBuffer, T, nsY);
+ }
+
+ FIX_BNU(xBuffer, nsX);
+ FIX_BNU(yBuffer, nsY);
+
+ if (nsY > nsX) {
+ SWAP_PTR(IppsBigNumState, x, y);
+ SWAP(nsX, nsY);
+ }
+
+ if (nsY==1 && yBuffer[nsY-1]==0) {
+ /* End evaluation */
+ ZEXPAND_BNU(gData, 0, nsGmax);
+ COPY_BNU(gData, xBuffer, nsX);
+ BN_SIZE(g) = INTERNAL_BNU_LENGTH(nsX);
+ BN_SIGN(g) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+ }
+
+ BN_NUMBER(g)[0] = cpGcd_BNU(((BNU_CHUNK_T*)xBuffer)[0], ((BNU_CHUNK_T*)yBuffer)[0]);
+ BN_SIZE(g) = 1;
+ BN_SIGN(g) = ippBigNumPOS;
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsModInv_BN
+//
+// Purpose: Multiplicative Inversion BigNum.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pA == NULL
+// pM == NULL
+// pR == NULL
+// ippStsContextMatchErr BN_VALID_ID(pA)
+// BN_VALID_ID(pM)
+// BN_VALID_ID(pR)
+// ippStsBadArgErr A<=0
+// ippStsBadModulusErr M<=0
+// ippStsScaleRangeErr A>=M
+// ippStsOutOfRangeErr pR can not hold result
+// ippStsNoErr no errors
+// ippStsBadModulusErr inversion not found
+//
+// Parameters:
+// pA source (value) BigNum
+// pM source (modulus) BigNum
+// pR reminder BigNum
+//
+*F*/
+IPPFUN(IppStatus, ippsModInv_BN, (IppsBigNumState* pA, IppsBigNumState* pM, IppsBigNumState* pR) )
+{
+ IPP_BAD_PTR3_RET(pA, pM, pR);
+
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ pM = (IppsBigNumState*)( IPP_ALIGNED_PTR(pM, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pM), ippStsContextMatchErr);
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_ROOM(pR) < BN_SIZE(pM), ippStsOutOfRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pA) || (BN_SIZE(pA)==1 && BN_NUMBER(pA)[0]==0), ippStsBadArgErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pM) || (BN_SIZE(pM)==1 && BN_NUMBER(pM)[0]==0), ippStsBadModulusErr);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), BN_NUMBER(pM), BN_SIZE(pM)) >= 0, ippStsScaleRangeErr);
+
+ {
+ cpSize nsR = cpModInv_BNU(BN_NUMBER(pR),
+ BN_NUMBER(pA), BN_SIZE(pA),
+ BN_NUMBER(pM), BN_SIZE(pM),
+ BN_BUFFER(pR), BN_BUFFER(pA), BN_BUFFER(pM));
+ if(nsR) {
+ BN_SIGN(pR) = ippBigNumPOS;
+ BN_SIZE(pR) = nsR;
+ return ippStsNoErr;
+ }
+ else
+ return ippStsBadModulusErr;
+ }
+}
+
diff --git a/ext/ipp/sources/ippcp/src/pcpbnsetca.c b/ext/ipp/sources/ippcp/src/pcpbnsetca.c
new file mode 100644
index 0000000..4fb060e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnsetca.c
@@ -0,0 +1,117 @@
+/*############################################################################
+ # Copyright 2004-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Big Number Operations
+//
+// Contents:
+// ippsSetOctString_BN()
+// ippsGetOctString_BN()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbn.h"
+
+
+/*F*
+// Name: ippsSetOctString_BN
+//
+// Purpose: Convert octet string into the BN value.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pOctStr
+// NULL == pBN
+//
+// ippStsLengthErr 0>strLen
+//
+// ippStsSizeErr BN_ROOM() is enough for keep actual strLen
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pOctStr pointer to the source octet string
+// strLen octet string length
+// pBN pointer to the target BN
+//
+*F*/
+IPPFUN(IppStatus, ippsSetOctString_BN,(const Ipp8u* pOctStr, cpSize strLen,
+ IppsBigNumState* pBN))
+{
+ IPP_BAD_PTR2_RET(pOctStr, pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+
+ IPP_BADARG_RET((0>strLen), ippStsLengthErr);
+
+ /* remove leading zeros */
+ while(strLen && (0==pOctStr[0])) {
+ strLen--;
+ pOctStr++;
+ }
+
+ /* test BN size */
+ IPP_BADARG_RET((int)(sizeof(BNU_CHUNK_T)*BN_ROOM(pBN))<strLen, ippStsSizeErr);
+ if(strLen)
+ BN_SIZE(pBN) = cpFromOctStr_BNU(BN_NUMBER(pBN), pOctStr, strLen);
+ else {
+ BN_NUMBER(pBN)[0] = (BNU_CHUNK_T)0;
+ BN_SIZE(pBN) = 1;
+ }
+ BN_SIGN(pBN) = ippBigNumPOS;
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsGetOctString_BN
+//
+// Purpose: Convert BN value into the octet string.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pOctStr
+// NULL == pBN
+//
+// ippStsRangeErr BN <0
+//
+// ippStsLengthErr strLen is enough for keep BN value
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBN pointer to the source BN
+// pOctStr pointer to the target octet string
+// strLen octet string length
+*F*/
+IPPFUN(IppStatus, ippsGetOctString_BN,(Ipp8u* pOctStr, cpSize strLen,
+ const IppsBigNumState* pBN))
+{
+ IPP_BAD_PTR2_RET(pOctStr, pBN);
+
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pBN), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pBN), ippStsRangeErr);
+ IPP_BADARG_RET((0>strLen), ippStsLengthErr);
+
+ return cpToOctStr_BNU(pOctStr,strLen, BN_NUMBER(pBN),BN_SIZE(pBN))? ippStsNoErr : ippStsLengthErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpbnu32arith.c b/ext/ipp/sources/ippcp/src/pcpbnu32arith.c
new file mode 100644
index 0000000..f64a8f3
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnu32arith.c
@@ -0,0 +1,280 @@
+/*############################################################################
+ # Copyright 2002-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Internal BNU32 arithmetic.
+//
+// Contents:
+//
+// cpAdd_BNU32()
+// cpSub_BNU32()
+//
+// cpMulDgt_BNU32()
+// cpSubMulDgt_BNU32()
+//
+// cpDiv_BNU32()
+//
+//
+*/
+
+#include "owncp.h"
+#include "pcpbnumisc.h"
+#include "pcpbnu32misc.h"
+#include "pcpbnu32arith.h"
+
+/*
+// BNU32 addition
+*/
+Ipp32u cpAdd_BNU32(Ipp32u* pR, const Ipp32u* pA, const Ipp32u* pB, cpSize ns)
+{
+ Ipp32u carry = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ Ipp64u t = (Ipp64u)carry +pA[i] + pB[i];
+ pR[i] = LODWORD(t);
+ carry = HIDWORD(t);
+ }
+ return carry;
+}
+
+/*
+// BNU32 subtraction
+*/
+Ipp32u cpSub_BNU32(Ipp32u* pR, const Ipp32u* pA, const Ipp32u* pB, cpSize ns)
+{
+ Ipp32u borrow = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ Ipp64u t = (Ipp64u)(pA[i]) - pB[i] - borrow;
+ pR[i] = LODWORD(t);
+ borrow = 0-HIDWORD(t);
+ }
+ return borrow;
+}
+
+/*
+// BNU32 increment
+*/
+Ipp32u cpInc_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize ns, Ipp32u v)
+{
+ Ipp32u carry = v;
+ cpSize i;
+ for(i=0; i<ns && carry; i++) {
+ Ipp64u t = (Ipp64u)carry +pA[i];
+ pR[i] = LODWORD(t);
+ carry = HIDWORD(t);
+ }
+ return carry;
+}
+
+/*
+// BNU32 decrement
+*/
+Ipp32u cpDec_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize ns, Ipp32u v)
+{
+ Ipp32u borrow = v;
+ int n;
+ for(n=0; n<ns; n++) {
+ Ipp64u t = (Ipp64u)(pA[n]) - (Ipp64u)borrow;
+ pR[n] = LODWORD(t);
+ borrow = HIDWORD(t)>>(32-1);
+ }
+ return borrow;
+}
+
+/*
+// BNU32 mul_by_digit
+*/
+Ipp32u cpMulDgt_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize nsA, Ipp32u val)
+{
+ Ipp32u carry = 0;
+ cpSize i;
+ for(i=0; i<nsA; i++) {
+ Ipp64u t = (Ipp64u)val * (Ipp64u)pA[i] + carry;
+ pR[i] = LODWORD(t);
+ carry = HIDWORD(t);
+ }
+ return carry;
+}
+
+/*
+// BNU32 mul_by_digit_subtract
+*/
+#if !((_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+Ipp32u cpSubMulDgt_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize nsA, Ipp32u val)
+{
+ Ipp32u carry = 0;
+ for(; nsA>0; nsA--) {
+ Ipp64u r = (Ipp64u)*pR - (Ipp64u)(*pA++) * val - carry;
+ *pR++ = LODWORD(r);
+ carry = 0-HIDWORD(r);
+ }
+ return carry;
+}
+#endif
+
+/*
+// BNU32 division
+*/
+#if !((_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+int cpDiv_BNU32(Ipp32u* pQ, cpSize* sizeQ,
+ Ipp32u* pX, cpSize sizeX,
+ Ipp32u* pY, cpSize sizeY)
+{
+ FIX_BNU(pY,sizeY);
+ FIX_BNU(pX,sizeX);
+
+ /* special case */
+ if(sizeX < sizeY) {
+
+ if(pQ) {
+ pQ[0] = 0;
+ *sizeQ = 1;
+ }
+
+ return sizeX;
+ }
+
+ /* special case */
+ if(1 == sizeY) {
+ int i;
+ Ipp32u r = 0;
+ for(i=(int)sizeX-1; i>=0; i--) {
+ Ipp64u tmp = MAKEDWORD(pX[i],r);
+ Ipp32u q = LODWORD(tmp / pY[0]);
+ r = LODWORD(tmp - q*pY[0]);
+ if(pQ) pQ[i] = q;
+ }
+
+ pX[0] = r;
+
+ if(pQ) {
+ FIX_BNU(pQ,sizeX);
+ *sizeQ = sizeX;
+ }
+
+ return 1;
+ }
+
+
+ /* common case */
+ {
+ cpSize qs = sizeX-sizeY+1;
+
+ cpSize nlz = cpNLZ_BNU32(pY[sizeY-1]);
+
+ /* normalization */
+ pX[sizeX] = 0;
+ if(nlz) {
+ cpSize ni;
+
+ pX[sizeX] = pX[sizeX-1] >> (32-nlz);
+ for(ni=sizeX-1; ni>0; ni--)
+ pX[ni] = (pX[ni]<<nlz) | (pX[ni-1]>>(32-nlz));
+ pX[0] <<= nlz;
+
+ for(ni=sizeY-1; ni>0; ni--)
+ pY[ni] = (pY[ni]<<nlz) | (pY[ni-1]>>(32-nlz));
+ pY[0] <<= nlz;
+ }
+
+ /*
+ // division
+ */
+ {
+ Ipp32u yHi = pY[sizeY-1];
+
+ int i;
+ for(i=(int)qs-1; i>=0; i--) {
+ Ipp32u extend;
+
+ /* estimate digit of quotient */
+ Ipp64u tmp = MAKEDWORD(pX[i+sizeY-1], pX[i+sizeY]);
+ Ipp64u q = tmp / yHi;
+ Ipp64u r = tmp - q*yHi;
+
+ /* tune estimation above */
+ //for(; (q>=CONST_64(0x100000000)) || (Ipp64u)q*pY[sizeY-2] > MAKEDWORD(pX[i+sizeY-2],r); ) {
+ for(; HIDWORD(q) || (Ipp64u)q*pY[sizeY-2] > MAKEDWORD(pX[i+sizeY-2],r); ) {
+ q -= 1;
+ r += yHi;
+ if( HIDWORD(r) )
+ break;
+ }
+
+ /* multiply and subtract */
+ extend = cpSubMulDgt_BNU32(pX+i, pY, sizeY, (Ipp32u)q);
+ extend = (pX[i+sizeY] -= extend);
+
+ if(extend) { /* subtracted too much */
+ q -= 1;
+ extend = cpAdd_BNU32(pX+i, pY, pX+i, sizeY);
+ pX[i+sizeY] += extend;
+ }
+
+ /* store quotation digit */
+ if(pQ) pQ[i] = LODWORD(q);
+ }
+ }
+
+ /* de-normalization */
+ if(nlz) {
+ cpSize ni;
+ for(ni=0; ni<sizeX; ni++)
+ pX[ni] = (pX[ni]>>nlz) | (pX[ni+1]<<(32-nlz));
+ for(ni=0; ni<sizeY-1; ni++)
+ pY[ni] = (pY[ni]>>nlz) | (pY[ni+1]<<(32-nlz));
+ pY[sizeY-1] >>= nlz;
+ }
+
+ FIX_BNU(pX,sizeX);
+
+ if(pQ) {
+ FIX_BNU(pQ,qs);
+ *sizeQ = qs;
+ }
+
+ return sizeX;
+ }
+}
+#endif
+
+#define FE_MUL(R,A,B,LEN) { \
+ int aidx, bidx; \
+ \
+ for(aidx=0; aidx<(LEN); aidx++) (R)[aidx] = 0; \
+ \
+ for(bidx=0; bidx<(LEN); bidx++) { \
+ Ipp64u b = (B)[bidx]; \
+ Ipp32u c = 0; \
+ for(aidx=0; aidx<(LEN); aidx++) { \
+ Ipp64u t = (R)[bidx+aidx] + (A)[aidx] * b + c; \
+ (R)[bidx+aidx] = LODWORD(t); \
+ c = HIDWORD(t); \
+ } \
+ (R)[bidx+aidx] = c; \
+ } \
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpbnu32arith.h b/ext/ipp/sources/ippcp/src/pcpbnu32arith.h
new file mode 100644
index 0000000..9d4c0c1
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnu32arith.h
@@ -0,0 +1,51 @@
+/*############################################################################
+ # Copyright 2012-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives.
+// Internal BNU32 arithmetic
+//
+//
+*/
+
+#if !defined(_CP_BNU32_ARITH_H)
+#define _CP_BNU32_ARITH_H
+
+#define cpAdd_BNU32 OWNAPI(cpAdd_BNU32)
+Ipp32u cpAdd_BNU32(Ipp32u* pR, const Ipp32u* pA, const Ipp32u* pB, int ns);
+#define cpSub_BNU32 OWNAPI(cpSub_BNU32)
+Ipp32u cpSub_BNU32(Ipp32u* pR, const Ipp32u* pA, const Ipp32u* pB, int ns);
+#define cpInc_BNU32 OWNAPI(cpInc_BNU32)
+Ipp32u cpInc_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize ns, Ipp32u val);
+#define cpDec_BNU32 OWNAPI(cpDec_BNU32)
+Ipp32u cpDec_BNU32(Ipp32u* pR, const Ipp32u* pA, cpSize ns, Ipp32u val);
+
+#define cpMulDgt_BNU32 OWNAPI(cpMulDgt_BNU32)
+Ipp32u cpMulDgt_BNU32(Ipp32u* pR, const Ipp32u* pA, int ns, Ipp32u val);
+#define cpSubMulDgt_BNU32 OWNAPI(cpSubMulDgt_BNU32)
+Ipp32u cpSubMulDgt_BNU32(Ipp32u* pR, const Ipp32u* pA, int nsA, Ipp32u val);
+
+#define cpDiv_BNU32 OWNAPI(cpDiv_BNU32)
+int cpDiv_BNU32(Ipp32u* pQ, int* nsQ, Ipp32u* pX, int nsX, Ipp32u* pY, int nsY);
+#define cpMod_BNU32(pX,sizeX, pM,sizeM) cpDiv_BNU32(NULL,NULL, (pX),(sizeX), (pM),(sizeM))
+
+#define cpFromOS_BNU32 OWNAPI(cpFromOS_BNU32)
+int cpFromOS_BNU32(Ipp32u* pBNU, const Ipp8u* pOctStr, int strLen);
+#define cpToOS_BNU32 OWNAPI(cpToOS_BNU32)
+int cpToOS_BNU32(Ipp8u* pStr, int strLen, const Ipp32u* pBNU, int bnuSize);
+
+#endif /* _CP_BNU32_ARITH_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpbnu32misc.c b/ext/ipp/sources/ippcp/src/pcpbnu32misc.c
new file mode 100644
index 0000000..157b9b1
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnu32misc.c
@@ -0,0 +1,126 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Unsigned internal BNU32 misc functionality
+//
+// Contents:
+// cpNLZ_BNU32()
+// cpNTZ_BNU32()
+//
+// cpLSL_BNU32()
+// cpLSR_BNU32()
+//
+// cpFromOctStr_BNU32()
+// cpToOctStr_BNU32()
+//
+//
+*/
+
+#include "owncp.h"
+#include "pcpbnuimpl.h"
+#include "pcpbnumisc.h"
+#include "pcpbnu32misc.h"
+
+
+/*
+// number of leading zeros
+*/
+cpSize cpNLZ_BNU32(Ipp32u x)
+{
+ cpSize nlz = BITSIZE(Ipp32u);
+ if(x) {
+ nlz = 0;
+ if( 0==(x & 0xFFFF0000) ) { nlz +=16; x<<=16; }
+ if( 0==(x & 0xFF000000) ) { nlz += 8; x<<= 8; }
+ if( 0==(x & 0xF0000000) ) { nlz += 4; x<<= 4; }
+ if( 0==(x & 0xC0000000) ) { nlz += 2; x<<= 2; }
+ if( 0==(x & 0x80000000) ) { nlz++; }
+ }
+ return nlz;
+}
+
+/*
+// Convert Oct String into BNU representation
+//
+// Returns length of BNU in Ipp32u chunks
+*/
+cpSize cpFromOctStr_BNU32(Ipp32u* pBNU, const Ipp8u* pOctStr, cpSize strLen)
+{
+ cpSize bnuSize=0;
+ *pBNU = 0;
+
+ /* start from the end of string */
+ for(; strLen>=4; bnuSize++,strLen-=4) {
+ /* pack 4 bytes into single Ipp32u value*/
+ *pBNU++ = ( pOctStr[strLen-4]<<(8*3) )
+ +( pOctStr[strLen-3]<<(8*2) )
+ +( pOctStr[strLen-2]<<(8*1) )
+ + pOctStr[strLen-1];
+ }
+
+ /* convert the beginning of the string */
+ if(strLen) {
+ Ipp32u x;
+ for(x=0; strLen>0; strLen--) {
+ Ipp32u d = *pOctStr++;
+ x = x*256 + d;
+ }
+ *pBNU++ = x;
+ bnuSize++;
+ }
+
+ return bnuSize? bnuSize : 1;
+}
+
+
+/*
+// Convert BNU into Octet String representation
+//
+// Returns strLen or 0 if no success
+*/
+cpSize cpToOctStr_BNU32(Ipp8u* pStr, cpSize strLen, const Ipp32u* pBNU, cpSize bnuSize)
+{
+ FIX_BNU(pBNU, bnuSize);
+ {
+ int bnuBitSize = BITSIZE_BNU32(pBNU, bnuSize);
+ if(bnuBitSize <= strLen*BYTESIZE) {
+ Ipp32u x = pBNU[bnuSize-1];
+
+ ZEXPAND_BNU(pStr, 0, strLen);
+ pStr += strLen - BITS2WORD8_SIZE(bnuBitSize);
+
+ if(x) {
+ int nb;
+ for(nb=cpNLZ_BNU32(x)/BYTESIZE; nb<4; nb++)
+ *pStr++ = EBYTE(x,3-nb);
+
+ for(--bnuSize; bnuSize>0; bnuSize--) {
+ x = pBNU[bnuSize-1];
+ *pStr++ = EBYTE(x,3);
+ *pStr++ = EBYTE(x,2);
+ *pStr++ = EBYTE(x,1);
+ *pStr++ = EBYTE(x,0);
+ }
+ }
+ return strLen;
+ }
+ else
+ return 0;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpbnu32misc.h b/ext/ipp/sources/ippcp/src/pcpbnu32misc.h
new file mode 100644
index 0000000..6cc4523
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnu32misc.h
@@ -0,0 +1,65 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Internal Miscellaneous BNU 32 bit Definitions & Function Prototypes
+//
+//
+*/
+
+#if !defined(_CP_BNU32_MISC_H)
+#define _CP_BNU32_MISC_H
+
+
+/* bit operations */
+#define BITSIZE_BNU32(p,ns) ((ns)*BNU_CHUNK_32BIT-cpNLZ_BNU32((p)[(ns)-1]))
+
+/* number of leading/trailing zeros */
+#define cpNLZ_BNU32 OWNAPI(cpNLZ_BNU32)
+cpSize cpNLZ_BNU32(Ipp32u x);
+
+/* most significant BNU bit */
+__INLINE int cpMSBit_BNU32(const Ipp32u* pA, cpSize nsA)
+{
+ FIX_BNU(pA, nsA);
+ return nsA*BITSIZE(Ipp32u) - cpNLZ_BNU32(pA[nsA-1]) -1;
+}
+
+
+__INLINE int cpCmp_BNU32(const Ipp32u* pA, cpSize nsA, const Ipp32u* pB, cpSize nsB)
+{
+ if(nsA!=nsB)
+ return nsA>nsB? 1 : -1;
+ else {
+ for(; nsA>0; nsA--) {
+ if(pA[nsA-1] > pB[nsA-1])
+ return 1;
+ else if(pA[nsA-1] < pB[nsA-1])
+ return -1;
+ }
+ return 0;
+ }
+}
+
+/* to/from oct string conversion */
+#define cpToOctStr_BNU32 OWNAPI(cpToOctStr_BNU32)
+cpSize cpToOctStr_BNU32(Ipp8u* pStr, cpSize strLen, const Ipp32u* pBNU, cpSize bnuSize);
+#define cpFromOctStr_BNU32 OWNAPI(cpFromOctStr_BNU32)
+cpSize cpFromOctStr_BNU32(Ipp32u* pBNU, const Ipp8u* pOctStr, cpSize strLen);
+
+#endif /* _CP_BNU32_MISC_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpbnuarith.c b/ext/ipp/sources/ippcp/src/pcpbnuarith.c
new file mode 100644
index 0000000..8f8b245
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnuarith.c
@@ -0,0 +1,538 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Internal Unsigned arithmetic
+//
+// Contents:
+// cpAdd_BNU()
+// cpSub_BNU()
+// cpInc_BNU()
+// cpDec_BNU()
+//
+// cpAddAdd_BNU()
+// cpAddSub_BNU()
+//
+// cpMuldgt_BNU()
+// cpAddMulDgt_BNU()
+// cpSubMulDgt_BNU()
+//
+// cpMulAdc_BNU_school()
+// cpSqrAdc_BNU_school()
+//
+// cpDiv_BNU()
+// cpMod_BNU()
+// cpGcd_BNU()
+// cpModInv_BNU()
+//
+//
+*/
+
+#include "owncp.h"
+#include "pcpbnuarith.h"
+#include "pcpbnumisc.h"
+
+
+/* Function cpAdd_BNU - addition of 2 BNU */
+#if defined(_USE_C_cpAdd_BNU_)
+#pragma message ("C version of cpAdd_BNU: ON")
+#else
+//#pragma message ("C version of cpAdd_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8) || \
+ (_IPPLRB>=_IPPLRB_B1)) || \
+ defined(_USE_C_cpAdd_BNU_)
+BNU_CHUNK_T cpAdd_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns)
+{
+ BNU_CHUNK_T carry = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ ADD_ABC(carry, pR[i], pA[i],pB[i], carry);
+ }
+ return carry;
+}
+#endif
+
+/* Function cpSub_BNU - subtraction of 2 BNU */
+#if defined(_USE_C_cpSub_BNU_)
+#pragma message ("C version of cpSub_BNU: ON")
+#else
+//#pragma message ("C version of cpSub_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8) || \
+ (_IPPLRB>=_IPPLRB_B1)) || \
+ defined(_USE_C_cpSub_BNU_)
+BNU_CHUNK_T cpSub_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns)
+{
+ BNU_CHUNK_T borrow = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ SUB_ABC(borrow, pR[i], pA[i], pB[i], borrow);
+ }
+ return borrow;
+}
+#endif
+
+/* Function cpInc_BNU - increment BNU */
+#if defined(_USE_C_cpInc_BNU_)
+#pragma message ("C version of cpInc_BNU: ON")
+#else
+//#pragma message ("C version of cpInc_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8)) || \
+ defined(_USE_C_cpInc_BNU_)
+BNU_CHUNK_T cpInc_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val)
+{
+ cpSize i;
+ for(i=0; i<ns && val; i++) {
+ BNU_CHUNK_T carry;
+ ADD_AB(carry, pR[i], pA[i], val);
+ val = carry;
+ }
+ if(pR!=pA)
+ for(; i<ns; i++)
+ pR[i] = pA[i];
+ return val;
+}
+#endif
+
+#if !((_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+BNU_CHUNK_T cpDec_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val)
+{
+ cpSize i;
+ for(i=0; i<ns && val; i++) {
+ BNU_CHUNK_T borrow;
+ SUB_AB(borrow, pR[i], pA[i], val);
+ val = borrow;
+ }
+ if(pR!=pA)
+ for(; i<ns; i++)
+ pR[i] = pA[i];
+ return val;
+}
+#endif
+
+/* Function cpAddAdd_BNU */
+#if defined(_USE_KARATSUBA_)
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+BNU_CHUNK_T cpAddAdd_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pC, cpSize ns)
+{
+ BNU_CHUNK_T carry1 = 0;
+ BNU_CHUNK_T carry2 = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ BNU_CHUNK_T s;
+ ADD_ABC(carry1, s, pA[i],pB[i],carry1);
+ ADD_ABC(carry2, pR[i], s,pC[i],carry2);
+ }
+ return (carry1+carry2);
+}
+#endif
+#endif
+
+/* Function cpAddSub_BNU */
+#if defined(_USE_KARATSUBA_)
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+BNU_CHUNK_T cpAddSub_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pC, cpSize ns)
+{
+ BNU_CHUNK_T carry = 0;
+ BNU_CHUNK_T borrow = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ BNU_CHUNK_T d;
+ SUB_ABC(borrow, d, pB[i], pC[i], borrow);
+ ADD_ABC(carry, pR[i], d, pA[i], carry);
+ }
+ return (carry-borrow);
+}
+#endif
+#endif
+
+
+/* Function cpAddMulDgt_BNU - multiply-and-add BNU */
+#if defined(_USE_C_cpAddMulDgt_BNU_)
+#pragma message ("C version of cpAddMulDgt_BNU: ON")
+#else
+//#pragma message ("C version of cpAddMulDgt_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8)) || \
+ defined(_USE_C_cpAddMulDgt_BNU_)
+BNU_CHUNK_T cpAddMulDgt_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val)
+{
+ BNU_CHUNK_T extension = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ BNU_CHUNK_T rH, rL;
+
+ MUL_AB(rH, rL, pA[i], val);
+ ADD_ABC(extension, pR[i], pR[i], rL, extension);
+ extension += rH;
+ }
+ return extension;
+}
+#endif
+
+
+/* Function cpSubMulDgt_BNU - multiply-and-sub BNU */
+#if defined(_USE_C_cpSubMulDgt_BNU_)
+#pragma message ("C version of cpSubMulDgt_BNU: ON")
+#else
+//#pragma message ("C version of cpSubMulDgt_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8) || \
+ (_IPPLRB >= _IPPLRB_B1)) || \
+ defined(_USE_C_cpSubMulDgt_BNU_)
+BNU_CHUNK_T cpSubMulDgt_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val)
+{
+ BNU_CHUNK_T extension = 0;
+ cpSize i;
+ for(i=0; i<ns; i++) {
+ BNU_CHUNK_T rH, rL;
+
+ MUL_AB(rH, rL, pA[i], val);
+ SUB_ABC(extension, pR[i], pR[i], rL, extension);
+ extension += rH;
+ }
+ return extension;
+}
+#endif
+
+
+/* Function cpMulAdc_BNU_school - multiply BNU */
+#if defined(_USE_C_cpMulAdc_BNU_school_)
+#pragma message ("C version of cpMulAdc_BNU_school: ON")
+#else
+//#pragma message ("C version of cpMulAdc_BNU_school: OFF")
+#endif
+
+#if !((_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8)) || \
+ defined(_USE_C_cpMulAdc_BNU_school_)
+BNU_CHUNK_T cpMulAdc_BNU_school(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB)
+{
+ const BNU_CHUNK_T* pa = (BNU_CHUNK_T*)pA;
+ const BNU_CHUNK_T* pb = (BNU_CHUNK_T*)pB;
+ BNU_CHUNK_T* pr = (BNU_CHUNK_T*)pR;
+
+ BNU_CHUNK_T extension = 0;
+ cpSize i, j;
+
+ ZEXPAND_BNU(pr, 0, nsA+nsB);
+
+ for(i=0; i<nsB; i++ ) {
+ BNU_CHUNK_T b = pb[i];
+
+ for(j=0, extension=0; j<nsA; j++ ) {
+ BNU_CHUNK_T rH, rL;
+
+ MUL_AB(rH, rL, pa[j], b);
+ ADD_ABC(extension, pr[i+j], pr[i+j], rL, extension);
+ extension += rH;
+ }
+ pr[i+j] = extension;
+ }
+ return extension;
+}
+#endif
+
+
+/* Function cpSqrAdc_BNU_school - sqr BNU */
+#if defined(_USE_C_cpSqrAdc_BNU_school_)
+#pragma message ("C version of cpSqrAdc_BNU_school: ON")
+#else
+//#pragma message ("C version of cpSqrAdc_BNU_school: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8)) || \
+ defined(_USE_C_cpSqrAdc_BNU_school_)
+BNU_CHUNK_T cpSqrAdc_BNU_school(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize nsA)
+{
+ cpSize i;
+
+ BNU_CHUNK_T extension;
+ BNU_CHUNK_T rH, rL;
+
+ /* init result */
+ pR[0] = 0;
+ for(i=1, extension=0; i<nsA; i++) {
+ MUL_AB(rH, rL, pA[i], pA[0]);
+ ADD_AB(extension, pR[i], rL, extension);
+ extension += rH;
+ }
+ pR[i] = extension;
+
+ /* add other a[i]*a[j] */
+ for(i=1; i<nsA-1; i++) {
+ BNU_CHUNK_T a = pA[i];
+ cpSize j;
+ for(j=i+1, extension=0; j<nsA; j++) {
+ MUL_AB(rH, rL, pA[j], a);
+ ADD_ABC(extension, pR[i+j], rL, pR[i+j], extension);
+ extension += rH;
+ }
+ pR[i+j] = extension;
+ }
+
+ /* double a[i]*a[j] */
+ for(i=1, extension=0; i<(2*nsA-1); i++) {
+ ADD_ABC(extension, pR[i], pR[i], pR[i], extension);
+ }
+ pR[i] = extension;
+
+ /* add a[i]^2 */
+ for(i=0, extension=0; i<nsA; i++) {
+ MUL_AB(rH, rL, pA[i], pA[i]);
+ ADD_ABC(extension, pR[2*i], pR[2*i], rL, extension);
+ ADD_ABC(extension, pR[2*i+1], pR[2*i+1], rH, extension);
+ }
+ return pR[2*nsA-1];
+}
+#endif
+
+
+BNU_CHUNK_T cpGcd_BNU(BNU_CHUNK_T a, BNU_CHUNK_T b)
+{
+ BNU_CHUNK_T gcd, t, r;
+
+ if(a > b){
+ gcd = a;
+ t = b;
+ } else {
+ t = a;
+ gcd = b;
+ }
+
+ while (t != 0) {
+ r = gcd % t;
+ gcd = t;
+ t = r;
+ }
+ return gcd;
+}
+
+/*
+// cpMAC_BNU
+//
+// Multiply with ACcumulation
+// Computes r <- r + a * b, returns real size of the r in the size_r variable
+// Returns 0 if there are no enought buffer size to write to r[MAX(size_r + 1, size_a + size_b) - 1]
+// Returns 1 if no error
+//
+// Note:
+// DO NOT run in inplace mode
+// The minimum buffer size for the r must be (size_a + size_b - 1)
+// the maximum buffer size for the r is MAX(size_r + 1, size_a + size_b)
+*/
+static int cpMac_BNU(BNU_CHUNK_T* pR, cpSize nsR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB)
+{
+ /* cleanup the rest of destination buffer */
+ ZEXPAND_BNU(pR, nsR, nsA+nsB-1);
+ //nsR = IPP_MAX(nsR, nsA+nsB);
+
+ {
+ BNU_CHUNK_T expansion = 0;
+ cpSize i;
+ for(i=0; i<nsB && !expansion; i++) {
+ expansion = cpAddMulDgt_BNU(pR+i, pA, nsA, pB[i]);
+ if(expansion)
+ expansion = cpInc_BNU(pR+i+nsA, pR+i+nsA, nsR-i-nsA, expansion);
+ }
+
+ if(expansion)
+ return 0;
+ else { /* compute real size */
+ FIX_BNU(pR, nsR);
+ return nsR;
+ }
+ }
+}
+
+int cpModInv_BNU(BNU_CHUNK_T* pInv,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pM, cpSize nsM,
+ BNU_CHUNK_T* bufInv, BNU_CHUNK_T* bufA, BNU_CHUNK_T* bufM)
+{
+ FIX_BNU(pA, nsA);
+ FIX_BNU(pM, nsM);
+
+ /* inv(1) = 1 */
+ if(nsA==1 && pA[0]==1) {
+ pInv[0] = 1;
+ return 1;
+ }
+
+ {
+ cpSize moduloSize = nsM;
+
+ BNU_CHUNK_T* X1 = pInv;
+ BNU_CHUNK_T* X2 = bufM;
+ BNU_CHUNK_T* Q = bufInv;
+ cpSize nsX1 = 1;
+ cpSize nsX2 = 1;
+ cpSize nsQ;
+
+ COPY_BNU(bufA, pA, nsA);
+
+ ZEXPAND_BNU(X1, 0, moduloSize);
+ ZEXPAND_BNU(X2, 0, moduloSize);
+ X2[0] = 1;
+
+ //printf("\n");
+ for(;;) {
+ nsM = cpDiv_BNU(Q, &nsQ, (BNU_CHUNK_T*)pM, nsM, bufA, nsA);
+ //Print_BNU(" q: ", Q, nsQ);
+ //Print_BNU(" m: ", pM, nsM);
+ nsX1 = cpMac_BNU(X1,moduloSize, Q,nsQ, X2,nsX2);
+ //Print_BNU("X1: ", X1, nsX1);
+
+ if (nsM==1 && pM[0]==1) {
+ ////ZEXPAND_BNU(X2, nsX2, moduloSize);
+ nsX2 = cpMac_BNU(X2,moduloSize, X1,nsX1, bufA, nsA);
+ COPY_BNU((BNU_CHUNK_T*)pM, X2, moduloSize);
+ cpSub_BNU(pInv, pM, X1, moduloSize);
+ FIX_BNU(pInv, moduloSize);
+ return moduloSize;
+ }
+ else if (nsM==1 && pM[0]==0) {
+ cpMul_BNU_school((BNU_CHUNK_T*)pM, X1,nsX1, bufA, nsA);
+ /* gcd = buf_a */
+ return 0;
+ }
+
+ nsA = cpDiv_BNU(Q, &nsQ, bufA, nsA, (BNU_CHUNK_T*)pM, nsM);
+ //Print_BNU(" q: ", Q, nsQ);
+ //Print_BNU(" a: ", bufA, nsA);
+ nsX2 = cpMac_BNU(X2,moduloSize, Q,nsQ, X1,nsX1);
+ //Print_BNU("X2: ", X2, nsX2);
+
+ if(nsA==1 && bufA[0]==1) {
+ ////ZEXPAND_BNU(X1, nsX1, moduloSize);
+ nsX1 = cpMac_BNU(X1, moduloSize, X2, nsX2, pM, nsM);
+ COPY_BNU((BNU_CHUNK_T*)pM, X1, moduloSize);
+ COPY_BNU(pInv, X2, nsX2);
+ return nsX2;
+ }
+ else if (nsA==1 && bufA[0]==0) {
+ /* gcd = m */
+ COPY_BNU(X1, pM, nsM);
+ cpMul_BNU_school((BNU_CHUNK_T*)pM, X2, nsX2, X1, nsM);
+ return 0;
+ }
+ }
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpbnuarith.h b/ext/ipp/sources/ippcp/src/pcpbnuarith.h
new file mode 100644
index 0000000..eaca1a2
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnuarith.h
@@ -0,0 +1,170 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives.
+// Internal Unsigned internal arithmetic
+//
+//
+*/
+
+#if !defined(_CP_BNU_ARITH_H)
+#define _CP_BNU_ARITH_H
+
+#include "pcpbnuimpl.h"
+#include "pcpbnu32arith.h"
+#include "pcpmulbnukara.h"
+
+#define cpAdd_BNU OWNAPI(cpAdd_BNU)
+BNU_CHUNK_T cpAdd_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns);
+#define cpSub_BNU OWNAPI(cpSub_BNU)
+BNU_CHUNK_T cpSub_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns);
+#define cpInc_BNU OWNAPI(cpInc_BNU)
+BNU_CHUNK_T cpInc_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
+#define cpDec_BNU OWNAPI(cpDec_BNU)
+BNU_CHUNK_T cpDec_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
+
+#if defined(_USE_KARATSUBA_)
+#define cpAddAdd_BNU OWNAPI(cpAddAdd_BNU)
+BNU_CHUNK_T cpAddAdd_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pC, cpSize size);
+#define cpAddSub_BNU OWNAPI(cpAddSub_BNU)
+BNU_CHUNK_T cpAddSub_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pC, cpSize size);
+#endif
+
+#define cpAddMulDgt_BNU OWNAPI(cpAddMulDgt_BNU)
+BNU_CHUNK_T cpAddMulDgt_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
+
+
+#define cpMulAdc_BNU_school OWNAPI(cpMulAdc_BNU_school)
+BNU_CHUNK_T cpMulAdc_BNU_school(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB);
+#define cpMulAdx_BNU_school OWNAPI(cpMulAdx_BNU_school)
+BNU_CHUNK_T cpMulAdx_BNU_school(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB);
+
+__INLINE BNU_CHUNK_T cpMul_BNU_school(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB)
+{
+#if(_ADCOX_NI_ENABLING_==_FEATURE_ON_)
+ return cpMulAdx_BNU_school(pR, pA,nsA, pB,nsB);
+#elif(_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ return IsFeatureEnabled(ADCOX_ENABLED)? cpMulAdx_BNU_school(pR, pA,nsA, pB,nsB)
+ : cpMulAdc_BNU_school(pR, pA,nsA, pB,nsB);
+#else
+ return cpMulAdc_BNU_school(pR, pA,nsA, pB,nsB);
+#endif
+}
+
+
+#define cpSqrAdc_BNU_school OWNAPI(cpSqrAdc_BNU_school)
+BNU_CHUNK_T cpSqrAdc_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA);
+
+#define cpSqrAdx_BNU_school OWNAPI(cpSqrAdx_BNU_school)
+BNU_CHUNK_T cpSqrAdx_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA);
+
+__INLINE BNU_CHUNK_T cpSqr_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA)
+{
+#if(_ADCOX_NI_ENABLING_==_FEATURE_ON_)
+ return cpSqrAdx_BNU_school(pR, pA,nsA);
+#elif(_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ return IsFeatureEnabled(ADCOX_ENABLED)? cpSqrAdx_BNU_school(pR, pA,nsA)
+ : cpSqrAdc_BNU_school(pR, pA,nsA);
+#else
+ return cpSqrAdc_BNU_school(pR, pA,nsA);
+#endif
+}
+
+#define cpGcd_BNU OWNAPI(cpGcd_BNU)
+BNU_CHUNK_T cpGcd_BNU(BNU_CHUNK_T a, BNU_CHUNK_T b);
+
+#define cpModInv_BNU OWNAPI(cpModInv_BNU)
+int cpModInv_BNU(BNU_CHUNK_T* pInv,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pM, cpSize nsM,
+ BNU_CHUNK_T* bufInv, BNU_CHUNK_T* bufA, BNU_CHUNK_T* bufM);
+
+
+/*
+// multiplication/squaring wrappers
+*/
+__INLINE cpSize cpMul_BNU_BufferSize(cpSize opLen)
+{
+#if !defined (_USE_KARATSUBA_)
+ UNREFERENCED_PARAMETER(opLen);
+ return 0;
+#else
+ return cpKaratsubaBufferSize(opLen);
+#endif
+}
+__INLINE BNU_CHUNK_T cpMul_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB,
+ BNU_CHUNK_T* pBuffer)
+{
+#if !defined(_USE_KARATSUBA_)
+ UNREFERENCED_PARAMETER(pBuffer);
+ return cpMul_BNU_school(pR, pA,nsA, pB,nsB);
+#else
+ if(nsA!=nsB || nsA<CP_KARATSUBA_MUL_THRESHOLD || !pBuffer)
+ return cpMul_BNU_school(pR, pA,nsA, pB,nsB);
+ else
+ return cpMul_BNU_karatsuba(pR, pA,pB,nsA, pBuffer);
+#endif
+}
+__INLINE BNU_CHUNK_T cpSqr_BNU(BNU_CHUNK_T * pR,
+ const BNU_CHUNK_T * pA, cpSize nsA,
+ BNU_CHUNK_T* pBuffer)
+{
+#if !defined(_USE_KARATSUBA_)
+ UNREFERENCED_PARAMETER(pBuffer);
+ return cpSqr_BNU_school(pR, pA,nsA);
+#else
+ if(nsA<CP_KARATSUBA_SQR_THRESHOLD || !pBuffer)
+ return cpSqr_BNU_school(pR, pA,nsA);
+ else
+ return cpSqr_BNU_karatsuba(pR, pA,nsA, pBuffer);
+#endif
+}
+
+/*
+// division/reduction wrappers
+*/
+__INLINE cpSize cpDiv_BNU(BNU_CHUNK_T* pQ, cpSize* pnsQ, BNU_CHUNK_T* pA, cpSize nsA, BNU_CHUNK_T* pB, cpSize nsB)
+{
+ int nsR = cpDiv_BNU32((Ipp32u*)pQ, pnsQ,
+ (Ipp32u*)pA, nsA*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)),
+ (Ipp32u*)pB, nsB*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)));
+ #if (BNU_CHUNK_BITS == BNU_CHUNK_64BIT)
+ if(nsR&1) ((Ipp32u*)pA)[nsR] = 0;
+ nsR = INTERNAL_BNU_LENGTH(nsR);
+ if(pQ) {
+ if(*pnsQ&1) ((Ipp32u*)pQ)[*pnsQ] = 0;
+ *pnsQ = INTERNAL_BNU_LENGTH(*pnsQ);
+ }
+ #endif
+ return nsR;
+}
+
+__INLINE cpSize cpMod_BNU(BNU_CHUNK_T* pX, cpSize nsX, BNU_CHUNK_T* pModulus, cpSize nsM)
+{
+ return cpDiv_BNU(NULL,NULL, pX,nsX, pModulus, nsM);
+}
+
+#endif /* _CP_BNU_ARITH_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpbnuimpl.h b/ext/ipp/sources/ippcp/src/pcpbnuimpl.h
new file mode 100644
index 0000000..bcb2e0b
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnuimpl.h
@@ -0,0 +1,136 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives.
+// BNU data type definition
+//
+//
+//
+*/
+
+#if !defined(_CP_BNU_IMPL_H)
+#define _CP_BNU_IMPL_H
+
+#define BNU_CHUNK_64BIT (64)
+#define BNU_CHUNK_32BIT (32)
+
+
+/*
+// define BNU chunk data type
+*/
+#if ((_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LP64) || (_IPP_ARCH == _IPP_ARCH_LRB) || (_IPP_ARCH == _IPP_ARCH_LRB2))
+ typedef Ipp64u BNU_CHUNK_T;
+ typedef Ipp64s BNS_CHUNK_T;
+ #define BNU_CHUNK_LOG2 (6)
+ #define BNU_CHUNK_BITS BNU_CHUNK_64BIT
+
+#else
+ typedef Ipp32u BNU_CHUNK_T;
+ typedef Ipp32s BNS_CHUNK_T;
+ #define BNU_CHUNK_LOG2 (5)
+ #define BNU_CHUNK_BITS BNU_CHUNK_32BIT
+#endif
+
+#define BNU_CHUNK_MASK (~(BNU_CHUNK_T)(0))
+
+#if (BNU_CHUNK_BITS == BNU_CHUNK_64BIT)
+ //#pragma message ("BNU_CHUNK_BITS = 64 bit")
+#elif (BNU_CHUNK_BITS == BNU_CHUNK_32BIT)
+ //#pragma message ("BNU_CHUNK_BITS = 32 bit")
+#else
+ #error BNU_CHUNK_BITS should be either 64 or 32 bit!
+#endif
+
+
+#ifdef _MSC_VER
+// #pragma warning( disable : 4127 4711 4206)
+# pragma warning( disable : 4127)
+#endif
+
+/* user's API BNU chunk data type */
+typedef Ipp32u API_BNU_CHUNK_T;
+
+/* convert API_BNU_CHUNK_T (usual Ipp32u) length into the BNU_CHUNK_T length */
+#define INTERNAL_BNU_LENGTH(apiLen) \
+ ((apiLen) + sizeof(BNU_CHUNK_T)/sizeof(API_BNU_CHUNK_T) -1)/(sizeof(BNU_CHUNK_T)/sizeof(API_BNU_CHUNK_T))
+
+/* Low and High parts of BNU_CHUNK_T value */
+#define BNU_CHUNK_2H ((BNU_CHUNK_T)1 << (BNU_CHUNK_BITS/2))
+#define LO_CHUNK(c) ((BNU_CHUNK_T)(c) & (BNU_CHUNK_2H - 1))
+#define HI_CHUNK(c) ((BNU_CHUNK_T)(c) >> (BNU_CHUNK_BITS/2))
+
+/* (carry,R) = A+B */
+#define ADD_AB(CARRY,R, A,B) \
+do { \
+ BNU_CHUNK_T __s = (A) + (B); \
+ (CARRY) = __s < (A); \
+ (R) = __s; \
+} while(0)
+
+/* (carry,R) = A+B+C */
+#define ADD_ABC(CARRY,R, A,B,C) \
+do { \
+ BNU_CHUNK_T __s = (A) + (B); \
+ BNU_CHUNK_T __t1= __s < (A); \
+ BNU_CHUNK_T __r = __s + (C); \
+ BNU_CHUNK_T __t2 = __r < __s; \
+ (CARRY) = __t1 + __t2; \
+ (R) = __r; \
+} while(0)
+
+/* (borrow,R) = A-B */
+#define SUB_AB(BORROW,R, A,B) \
+do { \
+ (BORROW) = (A)<(B); \
+ (R) = (A)-(B); \
+} while(0)
+
+/* (borrow,R) = A-B-C */
+#define SUB_ABC(BORROW,R, A,B,C) \
+do { \
+ BNU_CHUNK_T __s = (A) -( B); \
+ BNU_CHUNK_T __t1= __s > (A); \
+ BNU_CHUNK_T __r = __s - (C); \
+ BNU_CHUNK_T __t2 = __r > __s; \
+ (BORROW) = __t1 + __t2; \
+ (R) = __r; \
+} while(0)
+
+/* (RH,RL) = A*B */
+#define MUL_AB(RH, RL, A, B) \
+ do { \
+ BNU_CHUNK_T __aL = LO_CHUNK((A)); \
+ BNU_CHUNK_T __aH = HI_CHUNK((A)); \
+ BNU_CHUNK_T __bL = LO_CHUNK((B)); \
+ BNU_CHUNK_T __bH = HI_CHUNK((B)); \
+ \
+ BNU_CHUNK_T __x0 = (BNU_CHUNK_T) __aL * __bL; \
+ BNU_CHUNK_T __x1 = (BNU_CHUNK_T) __aL * __bH; \
+ BNU_CHUNK_T __x2 = (BNU_CHUNK_T) __aH * __bL; \
+ BNU_CHUNK_T __x3 = (BNU_CHUNK_T) __aH * __bH; \
+ \
+ __x1 += HI_CHUNK(__x0); \
+ __x1 += __x2; \
+ if(__x1 < __x2) \
+ __x3 += BNU_CHUNK_2H; \
+ \
+ (RH) = __x3 + HI_CHUNK(__x1); \
+ (RL) = (__x1 << BNU_CHUNK_BITS/2) + LO_CHUNK(__x0); \
+ } while (0)
+
+#endif /* _CP_BNU_IMPL_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpbnumisc.c b/ext/ipp/sources/ippcp/src/pcpbnumisc.c
new file mode 100644
index 0000000..7bd840b
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnumisc.c
@@ -0,0 +1,225 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Internal Unsigned BNU misc functionality
+//
+// Contents:
+// cpNLZ_BNU()
+// cpNTZ_BNU()
+//
+// cpLSL_BNU()
+// cpLSR_BNU()
+//
+// cpLSBit_BNU()
+// cpMSBit_BNU()
+//
+// cpFromOctStr_BNU()
+// cpToOctStrS_BNU()
+//
+//
+*/
+
+#include "owncp.h"
+#include "pcpbnumisc.h"
+
+
+/*
+// number of leading zeros
+*/
+cpSize cpNLZ_BNU(BNU_CHUNK_T x)
+{
+ cpSize nlz = BNU_CHUNK_BITS;
+ if(x) {
+ nlz = 0;
+ #if (BNU_CHUNK_BITS == BNU_CHUNK_64BIT)
+ if( 0==(x & 0xFFFFFFFF00000000) ) { nlz +=32; x<<=32; }
+ if( 0==(x & 0xFFFF000000000000) ) { nlz +=16; x<<=16; }
+ if( 0==(x & 0xFF00000000000000) ) { nlz += 8; x<<= 8; }
+ if( 0==(x & 0xF000000000000000) ) { nlz += 4; x<<= 4; }
+ if( 0==(x & 0xC000000000000000) ) { nlz += 2; x<<= 2; }
+ if( 0==(x & 0x8000000000000000) ) { nlz++; }
+ #else
+ if( 0==(x & 0xFFFF0000) ) { nlz +=16; x<<=16; }
+ if( 0==(x & 0xFF000000) ) { nlz += 8; x<<= 8; }
+ if( 0==(x & 0xF0000000) ) { nlz += 4; x<<= 4; }
+ if( 0==(x & 0xC0000000) ) { nlz += 2; x<<= 2; }
+ if( 0==(x & 0x80000000) ) { nlz++; }
+ #endif
+ }
+ return nlz;
+}
+
+/*
+// number of trailing zeros
+*/
+cpSize cpNTZ_BNU(BNU_CHUNK_T x)
+{
+ cpSize ntz = BNU_CHUNK_BITS;
+ if(x) {
+ ntz = 0;
+ #if (BNU_CHUNK_BITS==BNU_CHUNK_64BIT)
+ if( 0==(x & 0x00000000FFFFFFFF) ) { ntz+=32; x>>=32; }
+ if( 0==(x & 0x000000000000FFFF) ) { ntz+=16; x>>=16; }
+ if( 0==(x & 0x00000000000000FF) ) { ntz+= 8; x>>= 8; }
+ if( 0==(x & 0x000000000000000F) ) { ntz+= 4; x>>= 4; }
+ if( 0==(x & 0x0000000000000003) ) { ntz+= 2; x>>= 2; }
+ if( 0==(x & 0x0000000000000001) ) { ntz++; }
+ #else
+ if( 0==(x & 0x0000FFFF) ) { ntz+=16; x>>=16; }
+ if( 0==(x & 0x000000FF) ) { ntz+= 8; x>>= 8; }
+ if( 0==(x & 0x0000000F) ) { ntz+= 4; x>>= 4; }
+ if( 0==(x & 0x00000003) ) { ntz+= 2; x>>= 2; }
+ if( 0==(x & 0x00000001) ) { ntz++; }
+ #endif
+ }
+ return ntz;
+}
+
+/*
+// Logical shift right (including inplace)
+//
+// Returns new length
+//
+*/
+cpSize cpLSR_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize nsA, cpSize nBits)
+{
+ cpSize nw = nBits/BNU_CHUNK_BITS;
+ cpSize n;
+
+ pA += nw;
+ nsA -= nw;
+
+ nBits %= BNU_CHUNK_BITS;
+ if(nBits) {
+ BNU_CHUNK_T hi;
+ BNU_CHUNK_T lo = pA[0];
+
+ for(n=0; n<(nsA-1); n++) {
+ hi = pA[n+1];
+ pR[n] = (lo>>nBits) | (hi<<(BNU_CHUNK_BITS-nBits));
+ lo = hi;
+ }
+ pR[nsA-1] = (lo>>nBits);
+ }
+ else {
+ for(n=0; n<nsA; n++)
+ pR[n] = pA[n];
+ }
+
+ for(n=0; n<nw; n++)
+ pR[nsA+n] = 0;
+
+ return nsA+nw;
+}
+
+/*
+// Returns Most Significant Bit of the BNU
+// Note:
+// if BNU==0, -1 will return
+*/
+int cpMSBit_BNU(const BNU_CHUNK_T* pA, cpSize nsA)
+{
+ int msb;
+ FIX_BNU(pA, nsA);
+ msb = nsA*BNU_CHUNK_BITS - cpNLZ_BNU(pA[nsA-1]) -1;
+ return msb;
+}
+
+/*
+// Convert Oct String into BNU representation
+//
+// Returns size of BNU in BNU_CHUNK_T chunks
+*/
+cpSize cpFromOctStr_BNU(BNU_CHUNK_T* pA, const Ipp8u* pStr, cpSize strLen)
+{
+ int nsA =0;
+
+ /* start from the end of string */
+ for(; strLen>=(int)sizeof(BNU_CHUNK_T); nsA++,strLen-=(int)(sizeof(BNU_CHUNK_T))) {
+ /* pack sizeof(BNU_CHUNK_T) bytes into single BNU_CHUNK_T value*/
+ *pA++ =
+ #if (BNU_CHUNK_BITS==BNU_CHUNK_64BIT)
+ +( (BNU_CHUNK_T)pStr[strLen-8]<<(8*7) )
+ +( (BNU_CHUNK_T)pStr[strLen-7]<<(8*6) )
+ +( (BNU_CHUNK_T)pStr[strLen-6]<<(8*5) )
+ +( (BNU_CHUNK_T)pStr[strLen-5]<<(8*4) )
+ #endif
+ +( (BNU_CHUNK_T)pStr[strLen-4]<<(8*3) )
+ +( (BNU_CHUNK_T)pStr[strLen-3]<<(8*2) )
+ +( (BNU_CHUNK_T)pStr[strLen-2]<<(8*1) )
+ + (BNU_CHUNK_T)pStr[strLen-1];
+ }
+
+ /* convert the beginning of the string */
+ if(strLen) {
+ BNU_CHUNK_T x = 0;
+ for(x=0; strLen>0; strLen--) {
+ BNU_CHUNK_T d = *pStr++;
+ x = (x<<8) + d;
+ }
+ *pA++ = x;
+ nsA++;
+ }
+
+ return nsA;
+}
+
+/*
+// Convert BNU into HexString representation
+//
+// Returns length of the string or 0 if no success
+*/
+cpSize cpToOctStr_BNU(Ipp8u* pStr, cpSize strLen, const BNU_CHUNK_T* pA, cpSize nsA)
+{
+ FIX_BNU(pA, nsA);
+ {
+ cpSize bnuBitSize = BITSIZE_BNU(pA, nsA);
+ if(bnuBitSize <= strLen*BYTESIZE) {
+ int cnvLen = 0;
+ BNU_CHUNK_T x = pA[nsA-1];
+
+ ZEXPAND_BNU(pStr, 0, strLen);
+ pStr += strLen - BITS2WORD8_SIZE(bnuBitSize);
+
+ if(x) {
+ //int nb;
+ cpSize nb;
+ for(nb=cpNLZ_BNU(x)/BYTESIZE; nb<(cpSize)(sizeof(BNU_CHUNK_T)); cnvLen++, nb++)
+ *pStr++ = EBYTE(x, sizeof(BNU_CHUNK_T)-1-nb);
+
+ for(--nsA; nsA>0; cnvLen+=sizeof(BNU_CHUNK_T), nsA--) {
+ x = pA[nsA-1];
+ #if (BNU_CHUNK_BITS==BNU_CHUNK_64BIT)
+ *pStr++ = EBYTE(x,7);
+ *pStr++ = EBYTE(x,6);
+ *pStr++ = EBYTE(x,5);
+ *pStr++ = EBYTE(x,4);
+ #endif
+ *pStr++ = EBYTE(x,3);
+ *pStr++ = EBYTE(x,2);
+ *pStr++ = EBYTE(x,1);
+ *pStr++ = EBYTE(x,0);
+ }
+ }
+ return strLen;
+ }
+ else
+ return 0;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpbnumisc.h b/ext/ipp/sources/ippcp/src/pcpbnumisc.h
new file mode 100644
index 0000000..b7c8525
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpbnumisc.h
@@ -0,0 +1,150 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives. Cryptography Primitives.
+// Internal Miscellaneous BNU Definitions & Function Prototypes
+//
+//
+*/
+
+#if !defined(_PCP_BNUMISC_H)
+#define _PCP_BNUMISC_H
+
+#include "pcpbnuimpl.h"
+
+
+/* bit operations */
+#define BITSIZE_BNU(p,ns) ((ns)*BNU_CHUNK_BITS-cpNLZ_BNU((p)[(ns)-1]))
+#define BIT_BNU(bnu, ns,nbit) ((((nbit)>>BNU_CHUNK_LOG2) < (ns))? ((((bnu))[(nbit)>>BNU_CHUNK_LOG2] >>((nbit)&(BNU_CHUNK_BITS))) &1) : 0)
+
+#define TST_BIT(bnu, nbit) (((Ipp8u*)(bnu))[(nbit)/8] & ((1<<((nbit)%8)) &0xFF))
+#define SET_BIT(bnu, nbit) (((Ipp8u*)(bnu))[(nbit)/8] |= ((1<<((nbit)%8)) &0xFF))
+#define CLR_BIT(bnu, nbit) (((Ipp8u*)(bnu))[(nbit)/8] &=~((1<<((nbit)%8)) &0xFF))
+
+/* convert bitsize nbits into the number of BNU_CHUNK_T */
+#define BITS_BNU_CHUNK(nbits) (((nbits)+BNU_CHUNK_BITS-1)/BNU_CHUNK_BITS)
+
+/* mask for top BNU_CHUNK_T */
+#define MASK_BNU_CHUNK(nbits) ((BNU_CHUNK_T)(-1) >>((BNU_CHUNK_BITS- ((nbits)&(BNU_CHUNK_BITS-1))) &(BNU_CHUNK_BITS-1)))
+
+/* copy BNU content */
+#define COPY_BNU(dst, src, len) \
+{ \
+ cpSize __idx; \
+ for(__idx=0; __idx<(len); __idx++) (dst)[__idx] = (src)[__idx]; \
+}
+
+/* expand by zeros */
+#define ZEXPAND_BNU(srcdst,srcLen, dstLen) \
+{ \
+ cpSize __idx; \
+ for(__idx=(srcLen); __idx<(dstLen); __idx++) (srcdst)[__idx] = 0; \
+}
+
+/* copy and expand by zeros */
+#define ZEXPAND_COPY_BNU(dst,dstLen, src,srcLen) \
+{ \
+ cpSize __idx; \
+ for(__idx=0; __idx<(srcLen); __idx++) (dst)[__idx] = (src)[__idx]; \
+ for(; __idx<(dstLen); __idx++) (dst)[__idx] = 0; \
+}
+
+/* fix actual length */
+#define FIX_BNU(src,srcLen) \
+ for(; ((srcLen)>1) && (0==(src)[(srcLen)-1]); (srcLen)--) {}
+
+
+/* copy and set */
+__INLINE void cpCpy_BNU(BNU_CHUNK_T* pDst, const BNU_CHUNK_T* pSrc, cpSize ns)
+{ COPY_BNU(pDst, pSrc, ns); }
+
+__INLINE void cpSet_BNU(BNU_CHUNK_T* pDst, cpSize ns, BNU_CHUNK_T val)
+{
+ ZEXPAND_BNU(pDst, 0, ns);
+ pDst[0] = val;
+}
+
+/* fix up */
+__INLINE int cpFix_BNU(const BNU_CHUNK_T* pA, int nsA)
+{
+ FIX_BNU(pA, nsA);
+ return nsA;
+}
+
+/* comparison
+//
+// returns
+// negative, if A < B
+// 0, if A = B
+// positive, if A > B
+*/
+__INLINE int cpCmp_BNU(const BNU_CHUNK_T* pA, cpSize nsA, const BNU_CHUNK_T* pB, cpSize nsB)
+{
+ if(nsA!=nsB)
+ return nsA>nsB? 1 : -1;
+ else {
+ for(; nsA>0; nsA--) {
+ if(pA[nsA-1] > pB[nsA-1])
+ return 1;
+ else if(pA[nsA-1] < pB[nsA-1])
+ return -1;
+ }
+ return 0;
+ }
+}
+__INLINE int cpEqu_BNU_CHUNK(const BNU_CHUNK_T* pA, cpSize nsA, BNU_CHUNK_T b)
+{
+ return (pA[0]==b && 1==cpFix_BNU(pA, nsA));
+}
+
+/*
+// test
+//
+// returns
+// 0, if A = 0
+// >0, if A > 0
+// <0, looks like impossible (or error) case
+*/
+__INLINE int cpTst_BNU(const BNU_CHUNK_T* pA, int nsA)
+{
+ for(; (nsA>0) && (0==pA[nsA-1]); nsA--) ;
+ return nsA;
+}
+
+/* number of leading/trailing zeros */
+#define cpNLZ_BNU OWNAPI(cpNLZ_BNU)
+ cpSize cpNLZ_BNU(BNU_CHUNK_T x);
+
+#define cpNTZ_BNU OWNAPI(cpNTZ_BNU)
+ cpSize cpNTZ_BNU(BNU_CHUNK_T x);
+
+/* logical shift left/right */
+#define cpLSR_BNU OWNAPI(cpLSR_BNU)
+ int cpLSR_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize nsA, cpSize nBits);
+
+/* most significant BNU bit */
+#define cpMSBit_BNU OWNAPI(cpMSBit_BNU)
+ int cpMSBit_BNU(const BNU_CHUNK_T* pA, cpSize nsA);
+
+/* BNU <-> hex-string conversion */
+#define cpToOctStr_BNU OWNAPI(cpToOctStr_BNU)
+ int cpToOctStr_BNU(Ipp8u* pStr, cpSize strLen, const BNU_CHUNK_T* pA, cpSize nsA);
+#define cpFromOctStr_BNU OWNAPI(cpFromOctStr_BNU)
+ int cpFromOctStr_BNU(BNU_CHUNK_T* pA, const Ipp8u* pStr, cpSize strLen);
+
+#endif /* _PCP_BNUMISC_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp.h b/ext/ipp/sources/ippcp/src/pcpeccp.h
new file mode 100644
index 0000000..6e96f49
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp.h
@@ -0,0 +1,200 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Internal ECC (prime) basic Definitions & Function Prototypes
+//
+//
+*/
+
+#if !defined(_NEW_PCP_ECCP_H)
+#define _NEW_PCP_ECCP_H
+
+#include "pcpgfpecstuff.h"
+//#include "pcpbnresource.h"
+//#include "pcppma.h"
+//#include "pcpeccppoint.h"
+//#include "pcpeccpsscm.h"
+
+
+__INLINE IppsBigNumState* cpConstructBN(IppsBigNumState* pBN, cpSize len, BNU_CHUNK_T* pData, BNU_CHUNK_T* pBuffer)
+{
+ BN_ID(pBN) = idCtxBigNum;
+ BN_SIGN(pBN) = ippBigNumPOS;
+ BN_SIZE(pBN) = len;
+ BN_ROOM(pBN) = len;
+ BN_NUMBER(pBN) = pData;
+ BN_BUFFER(pBN) = pBuffer;
+ return pBN;
+}
+
+/* set EC parameters */
+IppStatus ECCPSetDP(const IppsGFpMethod* method,
+ int pLen, const BNU_CHUNK_T* pP,
+ int aLen, const BNU_CHUNK_T* pA,
+ int bLen, const BNU_CHUNK_T* pB,
+ int xLen, const BNU_CHUNK_T* pX,
+ int yLen, const BNU_CHUNK_T* pY,
+ int rLen, const BNU_CHUNK_T* pR,
+ BNU_CHUNK_T h,
+ IppsGFpECState* pEC);
+
+/*
+// Recommended (Standard) Domain Parameters
+*/
+extern const BNU_CHUNK_T secp112r1_p[]; // (2^128 -3)/76439
+extern const BNU_CHUNK_T secp112r1_a[];
+extern const BNU_CHUNK_T secp112r1_b[];
+extern const BNU_CHUNK_T secp112r1_gx[];
+extern const BNU_CHUNK_T secp112r1_gy[];
+extern const BNU_CHUNK_T secp112r1_r[];
+extern BNU_CHUNK_T secp112r1_h;
+
+extern const BNU_CHUNK_T secp112r2_p[]; // (2^128 -3)/76439
+extern const BNU_CHUNK_T secp112r2_a[];
+extern const BNU_CHUNK_T secp112r2_b[];
+extern const BNU_CHUNK_T secp112r2_gx[];
+extern const BNU_CHUNK_T secp112r2_gy[];
+extern const BNU_CHUNK_T secp112r2_r[];
+extern BNU_CHUNK_T secp112r2_h;
+
+extern const BNU_CHUNK_T secp128r1_p[]; // 2^128 -2^97 -1
+extern const BNU_CHUNK_T secp128r1_a[];
+extern const BNU_CHUNK_T secp128r1_b[];
+extern const BNU_CHUNK_T secp128r1_gx[];
+extern const BNU_CHUNK_T secp128r1_gy[];
+extern const BNU_CHUNK_T secp128r1_r[];
+extern BNU_CHUNK_T secp128r1_h;
+
+extern const BNU_CHUNK_T* secp128_mx[];
+
+extern const BNU_CHUNK_T secp128r2_p[]; // 2^128 -2^97 -1
+extern const BNU_CHUNK_T secp128r2_a[];
+extern const BNU_CHUNK_T secp128r2_b[];
+extern const BNU_CHUNK_T secp128r2_gx[];
+extern const BNU_CHUNK_T secp128r2_gy[];
+extern const BNU_CHUNK_T secp128r2_r[];
+extern BNU_CHUNK_T secp128r2_h;
+
+extern const BNU_CHUNK_T secp160r1_p[]; // 2^160 -2^31 -1
+extern const BNU_CHUNK_T secp160r1_a[];
+extern const BNU_CHUNK_T secp160r1_b[];
+extern const BNU_CHUNK_T secp160r1_gx[];
+extern const BNU_CHUNK_T secp160r1_gy[];
+extern const BNU_CHUNK_T secp160r1_r[];
+extern BNU_CHUNK_T secp160r1_h;
+
+extern const BNU_CHUNK_T secp160r2_p[]; // 2^160 -2^32 -2^14 -2^12 -2^9 -2^8 -2^7 -2^2 -1
+extern const BNU_CHUNK_T secp160r2_a[];
+extern const BNU_CHUNK_T secp160r2_b[];
+extern const BNU_CHUNK_T secp160r2_gx[];
+extern const BNU_CHUNK_T secp160r2_gy[];
+extern const BNU_CHUNK_T secp160r2_r[];
+extern BNU_CHUNK_T secp160r2_h;
+
+extern const BNU_CHUNK_T secp192r1_p[]; // 2^192 -2^64 -1
+extern const BNU_CHUNK_T secp192r1_a[];
+extern const BNU_CHUNK_T secp192r1_b[];
+extern const BNU_CHUNK_T secp192r1_gx[];
+extern const BNU_CHUNK_T secp192r1_gy[];
+extern const BNU_CHUNK_T secp192r1_r[];
+extern BNU_CHUNK_T secp192r1_h;
+
+extern const BNU_CHUNK_T secp224r1_p[]; // 2^224 -2^96 +1
+extern const BNU_CHUNK_T secp224r1_a[];
+extern const BNU_CHUNK_T secp224r1_b[];
+extern const BNU_CHUNK_T secp224r1_gx[];
+extern const BNU_CHUNK_T secp224r1_gy[];
+extern const BNU_CHUNK_T secp224r1_r[];
+extern BNU_CHUNK_T secp224r1_h;
+
+extern const BNU_CHUNK_T secp256r1_p[]; // 2^256 -2^224 +2^192 +2^96 -1
+extern const BNU_CHUNK_T secp256r1_a[];
+extern const BNU_CHUNK_T secp256r1_b[];
+extern const BNU_CHUNK_T secp256r1_gx[];
+extern const BNU_CHUNK_T secp256r1_gy[];
+extern const BNU_CHUNK_T secp256r1_r[];
+extern BNU_CHUNK_T secp256r1_h;
+
+extern const BNU_CHUNK_T secp384r1_p[]; // 2^384 -2^128 -2^96 +2^32 -1
+extern const BNU_CHUNK_T secp384r1_a[];
+extern const BNU_CHUNK_T secp384r1_b[];
+extern const BNU_CHUNK_T secp384r1_gx[];
+extern const BNU_CHUNK_T secp384r1_gy[];
+extern const BNU_CHUNK_T secp384r1_r[];
+extern BNU_CHUNK_T secp384r1_h;
+
+extern const BNU_CHUNK_T secp521r1_p[]; // 2^521 -1
+extern const BNU_CHUNK_T secp521r1_a[];
+extern const BNU_CHUNK_T secp521r1_b[];
+extern const BNU_CHUNK_T secp521r1_gx[];
+extern const BNU_CHUNK_T secp521r1_gy[];
+extern const BNU_CHUNK_T secp521r1_r[];
+extern BNU_CHUNK_T secp521r1_h;
+
+extern const BNU_CHUNK_T tpmBN_p256p_p[]; // TPM BN_P256
+extern const BNU_CHUNK_T tpmBN_p256p_a[];
+extern const BNU_CHUNK_T tpmBN_p256p_b[];
+extern const BNU_CHUNK_T tpmBN_p256p_gx[];
+extern const BNU_CHUNK_T tpmBN_p256p_gy[];
+extern const BNU_CHUNK_T tpmBN_p256p_r[];
+extern BNU_CHUNK_T tpmBN_p256p_h;
+
+extern const BNU_CHUNK_T tpmSM2_p256_p[]; // TPM SM2_P256
+extern const BNU_CHUNK_T tpmSM2_p256_a[];
+extern const BNU_CHUNK_T tpmSM2_p256_b[];
+extern const BNU_CHUNK_T tpmSM2_p256_gx[];
+extern const BNU_CHUNK_T tpmSM2_p256_gy[];
+extern const BNU_CHUNK_T tpmSM2_p256_r[];
+extern BNU_CHUNK_T tpmSM2_p256_h;
+
+extern const BNU_CHUNK_T* tpmSM2_p256_p_mx[];
+
+/* half of some std modulus */
+extern const BNU_CHUNK_T h_secp128r1_p[];
+extern const BNU_CHUNK_T h_secp192r1_p[];
+extern const BNU_CHUNK_T h_secp224r1_p[];
+extern const BNU_CHUNK_T h_secp256r1_p[];
+extern const BNU_CHUNK_T h_secp384r1_p[];
+extern const BNU_CHUNK_T h_secp521r1_p[];
+extern const BNU_CHUNK_T h_tpmSM2_p256_p[];
+
+__INLINE BNU_CHUNK_T* cpModAdd_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB,
+ const BNU_CHUNK_T* pM, int ns,
+ BNU_CHUNK_T* pBuffer)
+{
+ BNU_CHUNK_T e = cpAdd_BNU(pR, pA, pB, ns);
+ e -= cpSub_BNU(pBuffer, pR, pM, ns);
+ MASKED_COPY_BNU(pR, e, pR, pBuffer, ns);
+ return pR;
+}
+
+__INLINE BNU_CHUNK_T* cpModSub_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB,
+ const BNU_CHUNK_T* pM, int ns,
+ BNU_CHUNK_T* pBuffer)
+{
+ BNU_CHUNK_T e = cpSub_BNU(pR, pA, pB, ns);
+ cpAdd_BNU(pBuffer, pR, pM, ns);
+ MASKED_COPY_BNU(pR, (0-e), pBuffer, pR, ns);
+ return pR;
+}
+
+#endif /* _NEW_PCP_ECCP_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp128r1r2dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp128r1r2dpca.c
new file mode 100644
index 0000000..e04d137
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp128r1r2dpca.c
@@ -0,0 +1,75 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd128r1()
+// ippsECCPSetStd128r2()
+*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC128r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd128r1, (IppsECCPState* pEC))
+{
+ /* test pECC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(128), secp128r1_p,
+ BITS_BNU_CHUNK(128), secp128r1_a,
+ BITS_BNU_CHUNK(128), secp128r1_b,
+ BITS_BNU_CHUNK(128), secp128r1_gx,
+ BITS_BNU_CHUNK(128), secp128r1_gy,
+ BITS_BNU_CHUNK(128), secp128r1_r,
+ secp128r1_h,
+ pEC);
+}
+
+
+/*
+// Set EC128r2 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd128r2, (IppsECCPState* pEC))
+{
+ /* test pECC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(128), secp128r2_p,
+ BITS_BNU_CHUNK(128), secp128r2_a,
+ BITS_BNU_CHUNK(128), secp128r2_b,
+ BITS_BNU_CHUNK(128), secp128r2_gx,
+ BITS_BNU_CHUNK(128), secp128r2_gy,
+ BITS_BNU_CHUNK(128), secp128r2_r,
+ secp128r2_h,
+ pEC);
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp192r1dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp192r1dpca.c
new file mode 100644
index 0000000..7e3510c
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp192r1dpca.c
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd192r1()
+*/
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC192r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd192r1, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p192r1(),
+ BITS_BNU_CHUNK(192), secp192r1_p,
+ BITS_BNU_CHUNK(192), secp192r1_a,
+ BITS_BNU_CHUNK(192), secp192r1_b,
+ BITS_BNU_CHUNK(192), secp192r1_gx,
+ BITS_BNU_CHUNK(192), secp192r1_gy,
+ BITS_BNU_CHUNK(192), secp192r1_r,
+ secp192r1_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStd192r1,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP192r1_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp224r1dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp224r1dpca.c
new file mode 100644
index 0000000..c497be9
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp224r1dpca.c
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd224r1()
+*/
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC224r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd224r1, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsECCPState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p224r1(),
+ BITS_BNU_CHUNK(224), secp224r1_p,
+ BITS_BNU_CHUNK(224), secp224r1_a,
+ BITS_BNU_CHUNK(224), secp224r1_b,
+ BITS_BNU_CHUNK(224), secp224r1_gx,
+ BITS_BNU_CHUNK(224), secp224r1_gy,
+ BITS_BNU_CHUNK(224), secp224r1_r,
+ secp224r1_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStd224r1,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP224r1_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp256r1dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp256r1dpca.c
new file mode 100644
index 0000000..9d380dc
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp256r1dpca.c
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd256r1()
+*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC256r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd256r1, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p256r1(),
+ BITS_BNU_CHUNK(256), secp256r1_p,
+ BITS_BNU_CHUNK(256), secp256r1_a,
+ BITS_BNU_CHUNK(256), secp256r1_b,
+ BITS_BNU_CHUNK(256), secp256r1_gx,
+ BITS_BNU_CHUNK(256), secp256r1_gy,
+ BITS_BNU_CHUNK(256), secp256r1_r,
+ secp256r1_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStd256r1,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP256r1_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp384r1dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp384r1dpca.c
new file mode 100644
index 0000000..4082b3c
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp384r1dpca.c
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd384r1()
+*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC384r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd384r1, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p384r1(),
+ BITS_BNU_CHUNK(384), secp384r1_p,
+ BITS_BNU_CHUNK(384), secp384r1_a,
+ BITS_BNU_CHUNK(384), secp384r1_b,
+ BITS_BNU_CHUNK(384), secp384r1_gx,
+ BITS_BNU_CHUNK(384), secp384r1_gy,
+ BITS_BNU_CHUNK(384), secp384r1_r,
+ secp384r1_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStd384r1,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP384r1_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccp521r1dpca.c b/ext/ipp/sources/ippcp/src/pcpeccp521r1dpca.c
new file mode 100644
index 0000000..9c9f3bf
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccp521r1dpca.c
@@ -0,0 +1,63 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStd521r1()
+*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set EC521r1 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStd521r1, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p521r1(),
+ BITS_BNU_CHUNK(521), secp521r1_p,
+ BITS_BNU_CHUNK(521), secp521r1_a,
+ BITS_BNU_CHUNK(521), secp521r1_b,
+ BITS_BNU_CHUNK(521), secp521r1_gx,
+ BITS_BNU_CHUNK(521), secp521r1_gy,
+ BITS_BNU_CHUNK(521), secp521r1_r,
+ secp521r1_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStd521r1,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP521r1_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpdpca.c b/ext/ipp/sources/ippcp/src/pcpeccpdpca.c
new file mode 100644
index 0000000..8010137
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpdpca.c
@@ -0,0 +1,453 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSet()
+// ippsECCPSetStd()
+// ippsECCPSetStd128r1()
+// ippsECCPSetStd128r2()
+// ippsECCPSetStd192r1()
+// ippsECCPSetStd224r1()
+// ippsECCPSetStd256r1()
+// ippsECCPSetStd384r1()
+// ippsECCPSetStd521r1()
+// ippsECCPSetStdSM2()
+//
+// ippsECCPGet()
+// ippsECCPGetBitSizeOrder()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPSet
+//
+// Purpose: Set EC Domain Parameters.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pPrime
+// NULL == pA
+// NULL == pB
+// NULL == pGX
+// NULL == pGY
+// NULL == pOrder
+// NULL == pECC
+//
+// ippStsContextMatchErr illegal pPrime->idCtx
+// illegal pA->idCtx
+// illegal pB->idCtx
+// illegal pGX->idCtx
+// illegal pGY->idCtx
+// illegal pOrder->idCtx
+// illegal pECC->idCtx
+//
+// ippStsRangeErr not enough room for:
+// pPrime
+// pA, pB,
+// pGX,pGY
+// pOrder
+//
+// ippStsRangeErr 0>= cofactor
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrime pointer to the prime (specify FG(p))
+// pA pointer to the A coefficient of EC equation
+// pB pointer to the B coefficient of EC equation
+// pGX,pGY pointer to the Base Point (x and y coordinates) of EC
+// pOrder pointer to the Base Point order
+// cofactor cofactor value
+// pECC pointer to the ECC context
+//
+*F*/
+IppStatus ECCPSetDP(const IppsGFpMethod* method,
+ int pLen, const BNU_CHUNK_T* pP,
+ int aLen, const BNU_CHUNK_T* pA,
+ int bLen, const BNU_CHUNK_T* pB,
+ int xLen, const BNU_CHUNK_T* pX,
+ int yLen, const BNU_CHUNK_T* pY,
+ int rLen, const BNU_CHUNK_T* pR,
+ BNU_CHUNK_T h,
+ IppsGFpECState* pEC)
+{
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ {
+ IppsGFpState * pGF = ECP_GFP(pEC);
+
+ IppStatus sts = ippStsNoErr;
+ IppsBigNumState P, H;
+ int primeBitSize = BITSIZE_BNU(pP, pLen);
+ //cpConstructBN(&P, pLen, (BNU_CHUNK_T*)pP, NULL);
+ //sts = cpGFpSetGFp(&P, primeBitSize, method, pGF);
+ cpGFpSetGFp(pP, primeBitSize, method, pGF);
+
+ if(ippStsNoErr==sts) {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ do {
+ int elemLen = GFP_FELEN(pGFE);
+ IppsGFpElement elmA, elmB;
+
+ /* convert A ans B coeffs into GF elements */
+ cpGFpElementConstruct(&elmA, cpGFpGetPool(1, pGFE), elemLen);
+ cpGFpElementConstruct(&elmB, cpGFpGetPool(1, pGFE), elemLen);
+ sts = ippsGFpSetElement((Ipp32u*)pA, BITS2WORD32_SIZE(BITSIZE_BNU(pA,aLen)), &elmA, pGF);
+ if(ippStsNoErr!=sts) break;
+ sts = ippsGFpSetElement((Ipp32u*)pB, BITS2WORD32_SIZE(BITSIZE_BNU(pB,bLen)), &elmB, pGF);
+ if(ippStsNoErr!=sts) break;
+ /* and set EC */
+ sts = ippsGFpECSet(&elmA, &elmB, pEC);
+ if(ippStsNoErr!=sts) break;
+
+ /* convert GX ans GY coeffs into GF elements */
+ cpConstructBN(&P, rLen, (BNU_CHUNK_T*)pR, NULL);
+ cpConstructBN(&H, 1, &h, NULL);
+ sts = ippsGFpSetElement((Ipp32u*)pX, BITS2WORD32_SIZE(BITSIZE_BNU(pX,xLen)), &elmA, pGF);
+ if(ippStsNoErr!=sts) break;
+ sts = ippsGFpSetElement((Ipp32u*)pY, BITS2WORD32_SIZE(BITSIZE_BNU(pY,yLen)), &elmB, pGF);
+ if(ippStsNoErr!=sts) break;
+ /* and init EC subgroup */
+ sts = ippsGFpECSetSubgroup(&elmA, &elmB, &P, &H, pEC);
+ } while(0);
+
+ cpGFpReleasePool(2, pGFE);
+ }
+
+ return sts;
+ }
+}
+
+IPPFUN(IppStatus, ippsECCPSet, (const IppsBigNumState* pPrime,
+ const IppsBigNumState* pA, const IppsBigNumState* pB,
+ const IppsBigNumState* pGX,const IppsBigNumState* pGY,
+ const IppsBigNumState* pOrder, int cofactor,
+ IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test pPrime */
+ IPP_BAD_PTR1_RET(pPrime);
+ pPrime = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrime, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrime), ippStsContextMatchErr);
+ IPP_BADARG_RET((cpBN_bitsize(pPrime)>GFP_FEBITLEN(GFP_PMA(ECP_GFP(pEC)))), ippStsRangeErr);
+
+ /* test pA and pB */
+ IPP_BAD_PTR2_RET(pA,pB);
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, ALIGN_VAL) );
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ //IPP_BADARG_RET((cpBN_bitsize(pA)>GFP_FEBITLEN(ECP_GFP(pEC))), ippStsRangeErr);
+ //IPP_BADARG_RET((cpBN_bitsize(pB)>GFP_FEBITLEN(ECP_GFP(pEC))), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pA) || 0<=cpBN_cmp(pA,pPrime), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pB) || 0<=cpBN_cmp(pB,pPrime), ippStsRangeErr);
+
+ /* test pG and pGorder pointers */
+ IPP_BAD_PTR3_RET(pGX,pGY, pOrder);
+ pGX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGX, ALIGN_VAL) );
+ pGY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGY, ALIGN_VAL) );
+ pOrder = (IppsBigNumState*)( IPP_ALIGNED_PTR(pOrder, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pGX), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pGY), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pOrder), ippStsContextMatchErr);
+ //IPP_BADARG_RET((cpBN_bitsize(pGX)>GFP_FEBITLEN(ECP_GFP(pEC))), ippStsRangeErr);
+ //IPP_BADARG_RET((cpBN_bitsize(pGY)>GFP_FEBITLEN(ECP_GFP(pEC))), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pGX) || 0<=cpBN_cmp(pGX,pPrime), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pGY) || 0<=cpBN_cmp(pGY,pPrime), ippStsRangeErr);
+ IPP_BADARG_RET((cpBN_bitsize(pOrder)>ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ /* test cofactor */
+ IPP_BADARG_RET(!(0<cofactor), ippStsRangeErr);
+
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BN_SIZE(pPrime), BN_NUMBER(pPrime),
+ BN_SIZE(pA), BN_NUMBER(pA),
+ BN_SIZE(pB), BN_NUMBER(pB),
+ BN_SIZE(pGX), BN_NUMBER(pGX),
+ BN_SIZE(pGY), BN_NUMBER(pGY),
+ BN_SIZE(pOrder), BN_NUMBER(pOrder),
+ (BNU_CHUNK_T)cofactor,
+ pEC);
+}
+
+
+/*F*
+// Name: ippsECCPSetStd
+//
+// Purpose: Set Standard ECC Domain Parameter.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+//
+// ippStsECCInvalidFlagErr invalid flag
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// flag specify standard ECC parameter(s) to be setup
+// pECC pointer to the ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPSetStd, (IppECCType flag, IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ switch(flag) {
+ case IppECCPStd112r1:
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(112), secp112r1_p,
+ BITS_BNU_CHUNK(112), secp112r1_a,
+ BITS_BNU_CHUNK(112), secp112r1_b,
+ BITS_BNU_CHUNK(112), secp112r1_gx,
+ BITS_BNU_CHUNK(112), secp112r1_gy,
+ BITS_BNU_CHUNK(112), secp112r1_r,
+ secp112r1_h, pEC);
+
+ case IppECCPStd112r2:
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(112), secp112r2_p,
+ BITS_BNU_CHUNK(112), secp112r2_a,
+ BITS_BNU_CHUNK(112), secp112r2_b,
+ BITS_BNU_CHUNK(112), secp112r2_gx,
+ BITS_BNU_CHUNK(112), secp112r2_gy,
+ BITS_BNU_CHUNK(112), secp112r2_r,
+ secp112r2_h, pEC);
+
+ case IppECCPStd128r1: return ippsECCPSetStd128r1(pEC);
+
+ case IppECCPStd128r2: return ippsECCPSetStd128r2(pEC);
+
+ case IppECCPStd160r1:
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(160), secp160r1_p,
+ BITS_BNU_CHUNK(160), secp160r1_a,
+ BITS_BNU_CHUNK(160), secp160r1_b,
+ BITS_BNU_CHUNK(160), secp160r1_gx,
+ BITS_BNU_CHUNK(160), secp160r1_gy,
+ BITS_BNU_CHUNK(161), secp160r1_r,
+ secp160r1_h, pEC);
+
+ case IppECCPStd160r2:
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(160), secp160r2_p,
+ BITS_BNU_CHUNK(160), secp160r2_a,
+ BITS_BNU_CHUNK(160), secp160r2_b,
+ BITS_BNU_CHUNK(160), secp160r2_gx,
+ BITS_BNU_CHUNK(160), secp160r2_gy,
+ BITS_BNU_CHUNK(161), secp160r2_r,
+ secp160r2_h, pEC);
+
+ case IppECCPStd192r1: return ippsECCPSetStd192r1(pEC);
+
+ case IppECCPStd224r1: return ippsECCPSetStd224r1(pEC);
+
+ case IppECCPStd256r1: return ippsECCPSetStd256r1(pEC);
+
+ case IppECCPStd384r1: return ippsECCPSetStd384r1(pEC);
+
+ case IppECCPStd521r1: return ippsECCPSetStd521r1(pEC);
+
+ case ippEC_TPM_BN_P256:
+ return ECCPSetDP(ippsGFpMethod_pArb(),
+ BITS_BNU_CHUNK(256), tpmBN_p256p_p,
+ BITS_BNU_CHUNK(32), tpmBN_p256p_a,
+ BITS_BNU_CHUNK(32), tpmBN_p256p_b,
+ BITS_BNU_CHUNK(32), tpmBN_p256p_gx,
+ BITS_BNU_CHUNK(32), tpmBN_p256p_gy,
+ BITS_BNU_CHUNK(256), tpmBN_p256p_r,
+ tpmBN_p256p_h, pEC);
+
+ case ippECPstdSM2: return ippsECCPSetStdSM2(pEC);
+
+ default:
+ return ippStsECCInvalidFlagErr;
+ }
+}
+
+
+/*F*
+// Name: ippsECCPGet
+//
+// Purpose: Retrieve ECC Domain Parameter.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pPrime
+// NULL == pA
+// NULL == pB
+// NULL == pGX
+// NULL == pGY
+// NULL == pOrder
+// NULL == cofactor
+// NULL == pECC
+//
+// ippStsContextMatchErr illegal pPrime->idCtx
+// illegal pA->idCtx
+// illegal pB->idCtx
+// illegal pGX->idCtx
+// illegal pGY->idCtx
+// illegal pOrder->idCtx
+// illegal pECC->idCtx
+//
+// ippStsRangeErr not enough room for:
+// pPrime
+// pA, pB,
+// pGX,pGY
+// pOrder
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrime pointer to the retrieval prime (specify FG(p))
+// pA pointer to the retrieval A coefficient of EC equation
+// pB pointer to the retrieval B coefficient of EC equation
+// pGX,pGY pointer to the retrieval Base Point (x and y coordinates) of EC
+// pOrder pointer to the retrieval Base Point order
+// cofactor pointer to the retrieval cofactor value
+// pECC pointer to the ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPGet, (IppsBigNumState* pPrime,
+ IppsBigNumState* pA, IppsBigNumState* pB,
+ IppsBigNumState* pGX,IppsBigNumState* pGY,IppsBigNumState* pOrder,
+ int* cofactor,
+ IppsECCPState* pEC))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* test pECC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ /* test pPrime */
+ IPP_BAD_PTR1_RET(pPrime);
+ pPrime = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrime, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrime), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_ROOM(pPrime)<GFP_FELEN(pGFE), ippStsRangeErr);
+
+ /* test pA and pB */
+ IPP_BAD_PTR2_RET(pA,pB);
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, ALIGN_VAL) );
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_ROOM(pA)<GFP_FELEN(pGFE), ippStsRangeErr);
+ IPP_BADARG_RET(BN_ROOM(pB)<GFP_FELEN(pGFE), ippStsRangeErr);
+
+ /* test pG and pGorder pointers */
+ IPP_BAD_PTR3_RET(pGX,pGY, pOrder);
+ pGX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGX, ALIGN_VAL) );
+ pGY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGY, ALIGN_VAL) );
+ pOrder= (IppsBigNumState*)( IPP_ALIGNED_PTR(pOrder,ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pGX), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pGY), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pOrder), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_ROOM(pGX)<GFP_FELEN(pGFE), ippStsRangeErr);
+ IPP_BADARG_RET(BN_ROOM(pGY)<GFP_FELEN(pGFE), ippStsRangeErr);
+ IPP_BADARG_RET((BN_ROOM(pOrder)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ /* test cofactor */
+ IPP_BAD_PTR1_RET(cofactor);
+
+ {
+ mod_decode decode = GFP_METHOD(pGFE)->decode; /* gf decode method */
+ BNU_CHUNK_T* tmp = cpGFpGetPool(1, pGFE);
+
+ /* retrieve EC parameter */
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)GFP_MODULUS(pGFE), pPrime);
+
+ decode(tmp, ECP_A(pEC), pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)tmp, pA);
+ decode(tmp, ECP_B(pEC), pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)tmp, pB);
+
+ decode(tmp, ECP_G(pEC), pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)tmp, pGX);
+ decode(tmp, ECP_G(pEC)+GFP_FELEN(pGFE), pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)tmp, pGY);
+
+ {
+ gsModEngine* pR = ECP_MONT_R(pEC);
+ ippsSet_BN(ippBigNumPOS, MOD_LEN(pR)*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u), (Ipp32u*)MOD_MODULUS(pR), pOrder);
+ }
+
+ *cofactor = (int)ECP_COFACTOR(pEC)[0];
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsECCPGetOrderBitSize
+//
+// Purpose: Retrieve size of Pase Point Order (in bits).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pBitSize
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBitSize pointer to the size of base point order
+// pECC pointer to the ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPGetOrderBitSize,(int* pBitSize, IppsECCPState* pEC))
+{
+ /* test pECC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test pBitSize*/
+ IPP_BAD_PTR1_RET(pBitSize);
+
+ *pBitSize = ECP_ORDBITSIZE(pEC);
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c b/ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c
new file mode 100644
index 0000000..a301cea
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c
@@ -0,0 +1,108 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (EC Key Generation)
+//
+// Contents:
+// ippsECCPGenKeyPair()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPGenKeyPair
+//
+// Purpose: Generate (private,public) Key Pair
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pPrivate
+// NULL == pPublic
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pPrivate->idCtx
+// illegal pPublic->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivate pointer to the resultant private key
+// pPublic pointer to the resultant public key
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPGenKeyPair, (IppsBigNumState* pPrivate, IppsECCPPointState* pPublic,
+ IppsECCPState* pEC,
+ IppBitSupplier rndFunc, void* pRndParam))
+{
+ IPP_BAD_PTR2_RET(pEC, rndFunc);
+
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test private/public keys */
+ IPP_BAD_PTR2_RET(pPrivate,pPublic);
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pPrivate)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsSizeErr);
+
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublic), ippStsContextMatchErr );
+ IPP_BADARG_RET(ECP_POINT_FELEN(pPublic)<GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsRangeErr);
+
+ {
+ /* generate random private key X: 0 < X < R */
+ gsModEngine* pModEngine =ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pModEngine);
+ int orderBitLen = ECP_ORDBITSIZE(pEC);
+ int orderLen = BITS_BNU_CHUNK(orderBitLen);
+
+ BNU_CHUNK_T* pX = BN_NUMBER(pPrivate);
+ int nsX = BITS_BNU_CHUNK(orderBitLen);
+ BNU_CHUNK_T xMask = MASK_BNU_CHUNK(orderBitLen);
+
+ IppStatus sts;
+ do {
+ sts = rndFunc((Ipp32u*)pX, orderBitLen, pRndParam);
+ if(ippStsNoErr != sts)
+ break;
+ pX[nsX-1] &= xMask;
+ } while( (1 == cpEqu_BNU_CHUNK(pX, nsX, 0)) ||
+ (0 <= cpCmp_BNU(pX, nsX, pOrder, orderLen)) );
+
+ if(ippStsNoErr != sts)
+ return ippStsErr;
+
+ /* set up private */
+ BN_SIGN(pPrivate) = ippBigNumPOS;
+ FIX_BNU(pX, nsX);
+ BN_SIZE(pPrivate) = nsX;
+
+ /* calculate public key */
+ gfec_MulBasePoint(pPublic, pX, nsX, pEC, (Ipp8u*)ECP_SBUFFER(pEC));
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpinitca.c b/ext/ipp/sources/ippcp/src/pcpeccpinitca.c
new file mode 100644
index 0000000..03e50ba
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpinitca.c
@@ -0,0 +1,251 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (initialization)
+//
+// Contents:
+// ippsECCPGetSize()
+// ippsECCPGetSizeStd128r1()
+// ippsECCPGetSizeStd128r2()
+// ippsECCPGetSizeStd192r1()
+// ippsECCPGetSizeStd224r1()
+// ippsECCPGetSizeStd256r1()
+// ippsECCPGetSizeStd384r1()
+// ippsECCPGetSizeStd521r1()
+// ippsECCPGetSizeStdSM2()
+//
+// ippsECCPInit()
+// ippsECCPInitStd128r1()
+// ippsECCPInitStd128r2()
+// ippsECCPInitStd192r1()
+// ippsECCPInitStd224r1()
+// ippsECCPInitStd256r1()
+// ippsECCPInitStd384r1()
+// ippsECCPInitStd521r1()
+// ippsECCPInitStdSM2()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPGetSize
+//
+// Purpose: Returns size of ECC context (bytes).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pSize
+//
+// ippStsSizeErr 2>feBitSize
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// feBitSize size of field element (bits)
+// pSize pointer to the size of internal ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPGetSize, (int feBitSize, int *pSize))
+{
+ /* test size's pointer */
+ IPP_BAD_PTR1_RET(pSize);
+
+ /* test size of field element */
+ IPP_BADARG_RET((2>feBitSize || feBitSize>EC_GFP_MAXBITSIZE), ippStsSizeErr);
+
+ {
+ /* size of GF context */
+ //int gfCtxSize = cpGFpGetSize(feBitSize);
+ int gfCtxSize = cpGFpGetSize(feBitSize, feBitSize+BITSIZE(BNU_CHUNK_T), GFP_POOL_SIZE);
+ /* size of EC context */
+ int ecCtxSize = cpGFpECGetSize(1, feBitSize);
+
+ /* size of EC scratch buffer: 16 points of BITS_BNU_CHUNK(feBitSize)*3 length each */
+ int ecScratchBufferSize = 16*(BITS_BNU_CHUNK(feBitSize)*3)*sizeof(BNU_CHUNK_T);
+
+ *pSize = ecCtxSize /* EC context */
+ +ECGFP_ALIGNMENT
+ +gfCtxSize /* GF context */
+ +GFP_ALIGNMENT
+ +ecScratchBufferSize /* *scratch buffer */
+ +ecScratchBufferSize /* should be enough for 2 tables */
+ +CACHE_LINE_SIZE;
+
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsECCPGetSizeStd128r1
+// ippsECCPGetSizeStd128r2
+// ippsECCPGetSizeStd192r1
+// ippsECCPGetSizeStd224r1
+// ippsECCPGetSizeStd256r1
+// ippsECCPGetSizeStd384r1
+// ippsECCPGetSizeStd521r1
+// ippsECCPGetSizeStdSM2
+*F*/
+IPPFUN(IppStatus, ippsECCPGetSizeStd128r1, (int *pSize))
+{
+ return ippsECCPGetSize(128, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd128r2, (int *pSize))
+{
+ return ippsECCPGetSize(128, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd192r1, (int *pSize))
+{
+ return ippsECCPGetSize(192, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd224r1, (int *pSize))
+{
+ return ippsECCPGetSize(224, pSize);
+}
+
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd256r1, (int *pSize))
+{
+ return ippsECCPGetSize(256, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd384r1, (int *pSize))
+{
+ return ippsECCPGetSize(384, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStd521r1, (int *pSize))
+{
+ return ippsECCPGetSize(521, pSize);
+}
+
+IPPFUN(IppStatus, ippsECCPGetSizeStdSM2, (int *pSize))
+{
+ return ippsECCPGetSize(256, pSize);
+}
+
+
+/*F*
+// Name: ippsECCPInit
+//
+// Purpose: Init ECC context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+//
+// ippStsSizeErr 2>feBitSize
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// feBitSize size of field element (bits)
+// pECC pointer to the ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPInit, (int feBitSize, IppsECCPState* pEC))
+{
+ /* test pEC pointer */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsECCPState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* test size of field element */
+ IPP_BADARG_RET((2>feBitSize || feBitSize>EC_GFP_MAXBITSIZE), ippStsSizeErr);
+
+ {
+ /* size of GF context */
+ //int gfCtxSize = cpGFpGetSize(feBitSize);
+ int gfCtxSize = cpGFpGetSize(feBitSize, feBitSize+BITSIZE(BNU_CHUNK_T), GFP_POOL_SIZE);
+ /* size of EC context */
+ int ecCtxSize = cpGFpECGetSize(1, feBitSize);
+
+ IppsGFpState* pGF = (IppsGFpState*)(IPP_ALIGNED_PTR((Ipp8u*)pEC+ecCtxSize, GFP_ALIGNMENT));
+ BNU_CHUNK_T* pScratchBuffer = (BNU_CHUNK_T*)IPP_ALIGNED_PTR((Ipp8u*)pGF+gfCtxSize, CACHE_LINE_SIZE);
+
+ /* set up contexts */
+ IppStatus sts;
+ do {
+ sts = cpGFpInitGFp(feBitSize, pGF);
+ if(ippStsNoErr!=sts) break;
+ sts = ippsGFpECInit(pGF, NULL, NULL, pEC);
+ } while (0);
+
+ /* save scratch buffer pointer */
+ ECP_SBUFFER(pEC) = pScratchBuffer;
+
+ return sts;
+ }
+}
+
+/*F*
+// Name: ippsECCPInitStd128r1
+// ippsECCPInitStd128r2
+// ippsECCPInitStd192r1
+// ippsECCPInitStd224r1
+// ippsECCPInitStd256r1
+// ippsECCPInitStd384r1
+// ippsECCPInitStd521r1
+// ippsECCPInitStdSM2
+*F*/
+IPPFUN(IppStatus, ippsECCPInitStd128r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(128, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd128r2, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(128, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd192r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(192, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd224r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(224, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd256r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(256, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd384r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(384, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStd521r1, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(521, pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPInitStdSM2, (IppsECCPState* pEC))
+{
+ return ippsECCPInit(256, pEC);
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccppointca.c b/ext/ipp/sources/ippcp/src/pcpeccppointca.c
new file mode 100644
index 0000000..f2a49f7
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccppointca.c
@@ -0,0 +1,105 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC (prime) Point
+//
+// Contents:
+// ippsECCPPointGetSize()
+// ippsECCPPointInit()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPPointGetSize
+//
+// Purpose: Returns size of EC Point context (bytes).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pSzie
+// ippStsSizeErr 2>feBitSize
+// ippStsNoErr no errors
+//
+// Parameters:
+// feBitSize size of field element (bits)
+// pSize pointer to the size of EC Point context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPPointGetSize, (int feBitSize, int* pSize))
+{
+ /* test size's pointer */
+ IPP_BAD_PTR1_RET(pSize);
+
+ /* test size of field element */
+ IPP_BADARG_RET((2>feBitSize), ippStsSizeErr);
+
+ {
+ int elemLen = BITS_BNU_CHUNK(feBitSize);
+ *pSize= sizeof(IppsGFpECPoint)
+ +elemLen*sizeof(BNU_CHUNK_T) /* X */
+ +elemLen*sizeof(BNU_CHUNK_T) /* Y */
+ +elemLen*sizeof(BNU_CHUNK_T);/* Z */
+ }
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsECCPPointInit
+//
+// Purpose: Init EC Point context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pPoint
+// ippStsSizeErr 2>feBitSize
+// ippStsNoErr no errors
+//
+// Parameters:
+// feBitSize size of field element (bits)
+// pECC pointer to ECC context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPPointInit, (int feBitSize, IppsECCPPointState* pPoint))
+{
+ /* test pEC pointer */
+ IPP_BAD_PTR1_RET(pPoint);
+
+ /* test size of field element */
+ IPP_BADARG_RET((2>feBitSize), ippStsSizeErr);
+
+ {
+ int elemLen = BITS_BNU_CHUNK(feBitSize);
+ Ipp8u* ptr = (Ipp8u*)pPoint;
+
+ ECP_POINT_ID(pPoint) = idCtxGFPPoint;
+ ECP_POINT_FLAGS(pPoint) = 0;
+ ECP_POINT_FELEN(pPoint) = elemLen;
+ ptr += sizeof(IppsGFpECPoint);
+ ECP_POINT_DATA(pPoint) = (BNU_CHUNK_T*)(ptr);
+
+ gfec_SetPointAtInfinity(pPoint);
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccppointopca.c b/ext/ipp/sources/ippcp/src/pcpeccppointopca.c
new file mode 100644
index 0000000..e895dda
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccppointopca.c
@@ -0,0 +1,397 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (EC Point operations)
+//
+// Contents:
+// ippsECCPSetPoint()
+// ippsECCPSetPointAtInfinity()
+// ippsECCPGetPoint()
+//
+// ippsECCPCheckPoint()
+// ippsECCPComparePoint()
+//
+// ippsECCPNegativePoint()
+// ippsECCPAddPoint()
+// ippsECCPMulPointScalar()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPSetPoint
+//
+// Purpose: Converts regular affine coordinates EC point (pX,pY)
+// into internal presentation - montgomery projective.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pPoint
+// NULL == pX
+// NULL == pY
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pX->idCtx
+// illegal pY->idCtx
+// illegal pPoint->idCtx
+//
+// ippStsOutOfECErr point out-of EC
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pX pointer to the regular affine coordinate X
+// pY pointer to the regular affine coordinate Y
+// pPoint pointer to the EC Point context
+// pECC pointer to the ECCP context
+//
+// Note:
+// if B==0 and (x,y)=(0,y) then point at Infinity will be set up
+// if B!=0 and (x,y)=(0,0) then point at Infinity will be set up
+// else point with requested coordinates (x,y) wil be set up
+// There are no check validation inside!
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPSetPoint,(const IppsBigNumState* pX,
+ const IppsBigNumState* pY,
+ IppsECCPPointState* pPoint,
+ IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test pX and pY */
+ IPP_BAD_PTR2_RET(pX,pY);
+ pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
+ pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
+
+ {
+ IppStatus sts;
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+ IppsGFpElement elmX, elmY;
+
+ cpGFpElementConstruct(&elmX, cpGFpGetPool(1, pGFE), elemLen);
+ cpGFpElementConstruct(&elmY, cpGFpGetPool(1, pGFE), elemLen);
+ do {
+ BNU_CHUNK_T* pData = BN_NUMBER(pX);
+ int ns = BN_SIZE(pX);
+ sts = ippsGFpSetElement((Ipp32u*)pData, BITS2WORD32_SIZE(BITSIZE_BNU(pData, ns)), &elmX, pGF);
+ if(ippStsNoErr!=sts) break;
+ pData = BN_NUMBER(pY);
+ ns = BN_SIZE(pY);
+ sts = ippsGFpSetElement((Ipp32u*)pData, BITS2WORD32_SIZE(BITSIZE_BNU(pData, ns)), &elmY, pGF);
+ if(ippStsNoErr!=sts) break;
+ sts = ippsGFpECSetPoint(&elmX, &elmY, pPoint, pEC);
+ } while(0);
+
+ cpGFpReleasePool(2, pGFE);
+ return sts;
+ }
+}
+
+
+/*F*
+// Name: ippsECCPSetPointAtInfinity
+//
+// Purpose: Set point at Infinity
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pPoint
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pPoint->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPoint pointer to the EC Point context
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPSetPointAtInfinity,(IppsECCPPointState* pPoint, IppsECCPState* pEC))
+{
+ return ippsGFpECSetPointAtInfinity(pPoint, pEC);
+}
+
+
+/*F*
+// Name: ippsECCPGetPoint
+//
+// Purpose: Converts internal presentation EC point - montgomery projective
+// into regular affine coordinates EC point (pX,pY)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pPoint
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pPoint->idCtx
+// NULL != pX, illegal pX->idCtx
+// NULL != pY, illegal pY->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pX pointer to the regular affine coordinate X
+// pY pointer to the regular affine coordinate Y
+// pLength pointer to the length of coordinates
+// pPoint pointer to the EC Point context
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPGetPoint,(IppsBigNumState* pX, IppsBigNumState* pY,
+ const IppsECCPPointState* pPoint,
+ IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test pX and pY */
+ if(pX) {
+ pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
+ }
+ if(pY) {
+ pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
+ }
+
+ {
+ IppStatus sts;
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_decode decode = GFP_METHOD(pGFE)->decode; /* gf decode method */
+
+ IppsGFpElement elmX, elmY;
+
+ cpGFpElementConstruct(&elmX, cpGFpGetPool(1, pGFE), elemLen);
+ cpGFpElementConstruct(&elmY, cpGFpGetPool(1, pGFE), elemLen);
+ do {
+ sts = ippsGFpECGetPoint(pPoint, pX? &elmX:NULL, pY? &elmY:NULL, pEC);
+ if(ippStsNoErr!=sts) break;
+
+ if(pX) {
+ decode(elmX.pData, elmX.pData, pGFE);
+ sts = ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)elmX.pData, pX);
+ if(ippStsNoErr!=sts) break;
+ }
+ if(pY) {
+ decode(elmY.pData, elmY.pData, pGFE);
+ sts = ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)elmY.pData, pY);
+ if(ippStsNoErr!=sts) break;
+ }
+ } while(0);
+
+ cpGFpReleasePool(2, pGFE);
+ return sts;
+ }
+}
+
+
+/*F*
+// Name: ippsECCPCheckPoint
+//
+// Purpose: Check EC point:
+// - is point lie on EC
+// - is point at infinity
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pP
+// NULL == pResult
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pP->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPoint pointer to the EC Point context
+// pECC pointer to the ECCP context
+// pResult pointer to the result:
+// ippECValid
+// ippECPointIsNotValid
+// ippECPointIsAtInfinite
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPCheckPoint,(const IppsECCPPointState* pP,
+ IppECResult* pResult,
+ IppsECCPState* pEC))
+{
+ return ippsGFpECTstPoint(pP, pResult, pEC);
+}
+
+
+/*F*
+// Name: ippsECCPComparePoint
+//
+// Purpose: Compare two EC points
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pP
+// NULL == pQ
+// NULL == pResult
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pP->idCtx
+// illegal pQ->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pP pointer to the EC Point context
+// pQ pointer to the EC Point context
+// pECC pointer to the ECCP context
+// pResult pointer to the result:
+// ippECPointIsEqual
+// ippECPointIsNotEqual
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPComparePoint,(const IppsECCPPointState* pP,
+ const IppsECCPPointState* pQ,
+ IppECResult* pResult,
+ IppsECCPState* pEC))
+{
+ return ippsGFpECCmpPoint(pP, pQ, pResult, pEC);
+}
+
+
+/*F*
+// Name: ippsECCPNegativePoint
+//
+// Purpose: Perforn EC point operation: R = -P
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pP
+// NULL == pR
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pP->idCtx
+// illegal pR->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pP pointer to the source EC Point context
+// pR pointer to the resultant EC Point context
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPNegativePoint, (const IppsECCPPointState* pP,
+ IppsECCPPointState* pR,
+ IppsECCPState* pEC))
+{
+ return ippsGFpECNegPoint(pP, pR, pEC);
+}
+
+
+/*F*
+// Name: ippsECCPAddPoint
+//
+// Purpose: Perforn EC point operation: R = P+Q
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pP
+// NULL == pQ
+// NULL == pR
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pP->idCtx
+// illegal pQ->idCtx
+// illegal pR->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pP pointer to the source EC Point context
+// pQ pointer to the source EC Point context
+// pR pointer to the resultant EC Point context
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPAddPoint,(const IppsECCPPointState* pP,
+ const IppsECCPPointState* pQ,
+ IppsECCPPointState* pR,
+ IppsECCPState* pEC))
+{
+ return ippsGFpECAddPoint(pP, pQ, pR, pEC);
+}
+
+
+/*F*
+// Name: ippsECCPMulPointScalar
+//
+// Purpose: Perforn EC point operation: R = k*P
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pP
+// NULL == pK
+// NULL == pR
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pP->idCtx
+// illegal pK->idCtx
+// illegal pR->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pP pointer to the source EC Point context
+// pK pointer to the source BigNum multiplier context
+// pR pointer to the resultant EC Point context
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPMulPointScalar,(const IppsECCPPointState* pP,
+ const IppsBigNumState* pK,
+ IppsECCPPointState* pR,
+ IppsECCPState* pEC))
+{
+ /* use aligned EC context */
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ return ippsGFpECMulPoint(pP, pK, pR, pEC, (Ipp8u*)ECP_SBUFFER(pEC));
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c b/ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c
new file mode 100644
index 0000000..e761e29
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c
@@ -0,0 +1,104 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (EC Key Generation)
+//
+// Contents:
+// ippsECCPSetKeyPair()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPSetKeyPair
+//
+// Purpose: Generate (private,public) Key Pair
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pPrivate
+// NULL == pPublic
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pPrivate->idCtx
+// illegal pPublic->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivate pointer to the private key
+// pPublic pointer to the public key
+// regular flag regular/ephemeral keys
+// pECC pointer to the ECCP context
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPSetKeyPair, (const IppsBigNumState* pPrivate, const IppsECCPPointState* pPublic,
+ IppBool regular,
+ IppsECCPState* pEC))
+{
+ /* use aligned EC context */
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ {
+ BNU_CHUNK_T* targetPrivate;
+ BNU_CHUNK_T* targetPublic;
+
+ if(regular) {
+ targetPrivate = ECP_PRIVAT(pEC);
+ targetPublic = ECP_PUBLIC(pEC);
+ }
+ else {
+ targetPrivate = ECP_PRIVAT_E(pEC);
+ targetPublic = ECP_PUBLIC_E(pEC);
+ }
+
+ /* set up private key request */
+ if( pPrivate ) {
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+ {
+ int privateLen = BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC));
+ cpGFpElementCopyPadd(targetPrivate, privateLen, BN_NUMBER(pPrivate), BN_SIZE(pPrivate));
+ }
+ }
+
+ /* set up public key request */
+ if( pPublic ) {
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublic), ippStsContextMatchErr );
+ {
+ BNU_CHUNK_T* targetPublicX = targetPublic;
+ BNU_CHUNK_T* targetPublicY = targetPublic+ECP_POINT_FELEN(pPublic);
+ gfec_GetPoint(targetPublicX, targetPublicY, pPublic, pEC);
+ gfec_SetPoint(targetPublic, targetPublicX, targetPublicY, pEC);
+
+ //cpGFpElementCopy(targetPublic, ECP_POINT_DATA(pPublic), publicLen);
+ }
+ }
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c b/ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c
new file mode 100644
index 0000000..72d11c0
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c
@@ -0,0 +1,194 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (Sign, DSA version)
+//
+// Contents:
+// ippsECCPSignDSA()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPSignDSA
+//
+// Purpose: Signing of message representative.
+// (DSA version).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pMsgDigest
+// NULL == pPrivate
+// NULL == pSignX
+// NULL == pSignY
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pMsgDigest->idCtx
+// illegal pPrivate->idCtx
+// illegal pSignX->idCtx
+// illegal pSignY->idCtx
+//
+// ippStsMessageErr MsgDigest >= order
+//
+// ippStsRangeErr not enough room for:
+// signX
+// signY
+//
+// ippStsEphemeralKeyErr (0==signX) || (0==signY)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsgDigest pointer to the message representative to be signed
+// pPrivate pointer to the regular private key
+// pSignX,pSignY pointer to the signature
+// pECC pointer to the ECCP context
+//
+// Note:
+// - ephemeral key pair extracted from pECC and
+// must be generated and before ippsECCPDSASign() usage
+// - ephemeral key pair destroy before exit
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPSignDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pPrivate,
+ IppsBigNumState* pSignX, IppsBigNumState* pSignY,
+ IppsECCPState* pEC))
+{
+ /* use aligned EC context */
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test private key*/
+ IPP_BAD_PTR1_RET(pPrivate);
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsgDigest);
+ pMsgDigest = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsgDigest, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsgDigest), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsgDigest), ippStsMessageErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignX,pSignY);
+ pSignX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignX, BN_ALIGNMENT) );
+ pSignY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignY, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignX), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignY), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pSignX)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+ IPP_BADARG_RET((BN_ROOM(pSignY)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ {
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ BNU_CHUNK_T* pMsgData = BN_NUMBER(pMsgDigest);
+ int msgLen = BN_SIZE(pMsgDigest);
+ IPP_BADARG_RET(0<=cpCmp_BNU(pMsgData, msgLen, pOrder, orderLen), ippStsMessageErr);
+
+ /* signY = ephPrivate^-1 mod Order*/
+ {
+ __ALIGN8 IppsBigNumState R;
+ BNU_CHUNK_T* buffer = ECP_SBUFFER(pEC);
+ /* BN(order) */
+ BN_Make(buffer, buffer+orderLen+1, orderLen, &R);
+ BN_Set(pOrder, orderLen, &R);
+
+ BN_Set(ECP_PRIVAT_E(pEC), orderLen, pSignX);
+ ippsModInv_BN(pSignX, &R, pSignY);
+ }
+
+ {
+ IppStatus sts = ippStsEphemeralKeyErr;
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ int elmLen = GFP_FELEN(pGFE);
+ int pelmLen = GFP_PELEN(pGFE);
+
+ BNU_CHUNK_T* pC = cpGFpGetPool(3, pGFE);
+ BNU_CHUNK_T* pF = pC + pelmLen;
+ BNU_CHUNK_T* pS = pF + pelmLen;
+
+ /* ephemeral public */
+ IppsGFpECPoint ephPublic;
+ cpEcGFpInitPoint(&ephPublic, ECP_PUBLIC_E(pEC), ECP_FINITE_POINT|ECP_AFFINE_POINT, pEC);
+
+ /* ephPublic.x */
+ gfec_GetPoint(pC, NULL, &ephPublic, pEC);
+ GFP_METHOD(pGFE)->decode(pC, pC, pGFE);
+
+ /* signX = int(ephPublic.x) (mod order) */
+ elmLen = cpMod_BNU(pC, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(pC+elmLen, orderLen-elmLen, 0);
+ if(!GFP_IS_ZERO(pC, orderLen)) {
+
+ /*
+ // signY = (1/ephPrivate)*(pMsgDigest + private*signX) (mod order)
+ */
+ /* S = mont(private) * mont(signX) */
+ cpMontEnc_BNU_EX(pF, pC, orderLen, pMontR);
+ cpMontEnc_BNU_EX(pS, BN_NUMBER(pPrivate), BN_SIZE(pPrivate), pMontR);
+ cpMontMul_BNU(pS, pS, pF, pMontR);
+ /* S = (S+ mont(msg) mod order */
+ cpGFpElementCopyPadd(pF, orderLen, pMsgData, msgLen);
+ cpMontEnc_BNU_EX(pF, pF, orderLen, pMontR);
+ cpModAdd_BNU(pS, pS, pF, pOrder, orderLen, pF);
+
+ /* S = S*(ephPrivate^-1) */
+ cpGFpElementCopyPadd(pF, orderLen, BN_NUMBER(pSignY), BN_SIZE(pSignY));
+ cpMontMul_BNU(pS, pS, pF, pMontR);
+
+ if(!GFP_IS_ZERO(pS, orderLen)) {
+ BNU_CHUNK_T* pSignXdata = BN_NUMBER(pSignX);
+ BNU_CHUNK_T* pSignYdata = BN_NUMBER(pSignY);
+
+ /* signX */
+ elmLen = orderLen;
+ FIX_BNU(pC, elmLen);
+ BN_SIGN(pSignX) = ippBigNumPOS;
+ BN_SIZE(pSignX) = elmLen;
+ cpGFpElementCopy(pSignXdata, pC, elmLen);
+
+ /* signY */
+ elmLen = orderLen;
+ FIX_BNU(pS, elmLen);
+ BN_SIGN(pSignY) = ippBigNumPOS;
+ BN_SIZE(pSignY) = elmLen;
+ cpGFpElementCopy(pSignYdata, pS, elmLen);
+
+ sts = ippStsNoErr;
+ }
+ }
+
+ cpGFpReleasePool(3, pGFE);
+ return sts;
+ }
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpsm2dpca.c b/ext/ipp/sources/ippcp/src/pcpeccpsm2dpca.c
new file mode 100644
index 0000000..7574939
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpsm2dpca.c
@@ -0,0 +1,64 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (setup/retrieve domain parameters)
+//
+// Contents:
+// ippsECCPSetStdSM2()
+*/
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*
+// Set ECSM2 parameters
+*/
+IPPFUN(IppStatus, ippsECCPSetStdSM2, (IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ /* set domain parameters */
+ return ECCPSetDP(ippsGFpMethod_p256sm2(),
+ BITS_BNU_CHUNK(256), tpmSM2_p256_p,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_a,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_b,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_gx,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_gy,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_r,
+ tpmSM2_p256_h,
+ pEC);
+}
+
+IPPFUN(IppStatus, ippsECCPBindGxyTblStdSM2,(IppsECCPState* pEC))
+{
+ /* test pEC */
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ ECP_PREMULBP(pEC) = gfpec_precom_sm2_fun();
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpstdca.c b/ext/ipp/sources/ippcp/src/pcpeccpstdca.c
new file mode 100644
index 0000000..c5c3320
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpstdca.c
@@ -0,0 +1,340 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// ECC over Prime Finite Field (recommended ECC parameters)
+//
+// Contents:
+// secp112r1, secp112r2
+// secp128r1, secp128r2 (* Montgomery Friendly Modulus (+1) *)
+// secp160r1, secp160r2
+// secp192r1 (* Montgomery Friendly Modulus (+1) *)
+// secp224r1 (* Montgomery Friendly Modulus (-1) *)
+// secp256r1 (* Montgomery Friendly Modulus (+1) *)
+// secp384r1 (* Montgomery Friendly Modulus (0x0000000100000001) *)
+// secp521r1 (* Montgomery Friendly Modulus (+1) *)
+// tpm_BN_p256 (BN, TPM)
+// tpmSM2_p256_p (SM2) (* Montgomery Friendly Modulus (+1) *)
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpstuff.h"
+
+#if defined( _IPP_DATA )
+
+/*
+// Recommended Parameters secp112r1
+*/
+const BNU_CHUNK_T secp112r1_p[] = { // (2^128 -3)/76439
+ LL(0xBEAD208B, 0x5E668076), LL(0x2ABF62E3, 0xDB7C)};
+const BNU_CHUNK_T secp112r1_a[] = {
+ LL(0xBEAD2088, 0x5E668076), LL(0x2ABF62E3, 0xDB7C)};
+const BNU_CHUNK_T secp112r1_b[] = {
+ LL(0x11702B22, 0x16EEDE89), LL(0xF8BA0439, 0x659E)};
+const BNU_CHUNK_T secp112r1_gx[] = {
+ LL(0xF9C2F098, 0x5EE76B55), LL(0x7239995A, 0x0948)};
+const BNU_CHUNK_T secp112r1_gy[] = {
+ LL(0x0FF77500, 0xC0A23E0E), LL(0xE5AF8724, 0xA89C)};
+const BNU_CHUNK_T secp112r1_r[] = {
+ LL(0xAC6561C5, 0x5E7628DF), LL(0x2ABF62E3, 0xDB7C)};
+BNU_CHUNK_T secp112r1_h = 1;
+
+/*
+// Recommended Parameters secp112r2
+*/
+const BNU_CHUNK_T secp112r2_p[] = { // (2^128 -3)/76439
+ LL(0xBEAD208B, 0x5E668076), LL(0x2ABF62E3, 0xDB7C)};
+const BNU_CHUNK_T secp112r2_a[] = {
+ LL(0x5C0EF02C, 0x8A0AAAF6), LL(0xC24C05F3, 0x6127)};
+const BNU_CHUNK_T secp112r2_b[] = {
+ LL(0x4C85D709, 0xED74FCC3), LL(0xF1815DB5, 0x51DE)};
+const BNU_CHUNK_T secp112r2_gx[] = {
+ LL(0xD0928643, 0xB4E1649D), LL(0x0AB5E892, 0x4BA3)};
+const BNU_CHUNK_T secp112r2_gy[] = {
+ LL(0x6E956E97, 0x3747DEF3), LL(0x46F5882E, 0xADCD)};
+const BNU_CHUNK_T secp112r2_r[] = {
+ LL(0x0520D04B, 0xD7597CA1), LL(0x0AAFD8B8, 0x36DF)};
+BNU_CHUNK_T secp112r2_h = 4;
+
+/*
+// Recommended Parameters secp128r1
+*/
+const BNU_CHUNK_T h_secp128r1_p[] = { // halpf of secp128r1_p
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0x7FFFFFFE)};
+
+const BNU_CHUNK_T secp128r1_p[] = { // 2^128 -2^97 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFD), LL(0, 0)};
+const BNU_CHUNK_T secp128r1_a[] = {
+ LL(0xFFFFFFFC, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFD)};
+const BNU_CHUNK_T secp128r1_b[] = {
+ LL(0x2CEE5ED3, 0xD824993C), LL(0x1079F43D, 0xE87579C1)};
+const BNU_CHUNK_T secp128r1_gx[] = {
+ LL(0xA52C5B86, 0x0C28607C), LL(0x8B899B2D, 0x161FF752)};
+const BNU_CHUNK_T secp128r1_gy[] = {
+ LL(0xDDED7A83, 0xC02DA292), LL(0x5BAFEB13, 0xCF5AC839)};
+const BNU_CHUNK_T secp128r1_r[] = {
+ LL(0x9038A115, 0x75A30D1B), LL(0x00000000, 0xFFFFFFFE)};
+BNU_CHUNK_T secp128r1_h = 1;
+
+/*
+// Recommended Parameters secp128r2
+*/
+const BNU_CHUNK_T secp128r2_p[] = { // 2^128 -2^97 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFD), LL(0, 0)};
+const BNU_CHUNK_T secp128r2_a[] = {
+ LL(0xBFF9AEE1, 0xBF59CC9B), LL(0xD1B3BBFE, 0xD6031998)};
+const BNU_CHUNK_T secp128r2_b[] = {
+ LL(0xBB6D8A5D, 0xDC2C6558), LL(0x80D02919, 0x5EEEFCA3)};
+const BNU_CHUNK_T secp128r2_gx[] = {
+ LL(0xCDEBC140, 0xE6FB32A7), LL(0x5E572983, 0x7B6AA5D8)};
+const BNU_CHUNK_T secp128r2_gy[] = {
+ LL(0x5FC34B44, 0x7106FE80), LL(0x894D3AEE, 0x27B6916A)};
+const BNU_CHUNK_T secp128r2_r[] = {
+ LL(0x0613B5A3, 0xBE002472), LL(0x7FFFFFFF, 0x3FFFFFFF)};
+BNU_CHUNK_T secp128r2_h = 4;
+
+/*
+// Recommended Parameters secp160r1
+*/
+const BNU_CHUNK_T secp160r1_p[] = { // 2^160 -2^31 -1
+ LL(0x7FFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0xFFFFFFFF)};
+const BNU_CHUNK_T secp160r1_a[] = {
+ LL(0x7FFFFFFC, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0xFFFFFFFF)};
+const BNU_CHUNK_T secp160r1_b[] = {
+ LL(0xC565FA45, 0x81D4D4AD), LL(0x65ACF89F, 0x54BD7A8B), L_(0x1C97BEFC)};
+const BNU_CHUNK_T secp160r1_gx[] = {
+ LL(0x13CBFC82, 0x68C38BB9), LL(0x46646989, 0x8EF57328), L_(0x4A96B568)};
+const BNU_CHUNK_T secp160r1_gy[] = {
+ LL(0x7AC5FB32, 0x04235137), LL(0x59DCC912, 0x3168947D), L_(0x23A62855)};
+const BNU_CHUNK_T secp160r1_r[] = {
+ LL(0xCA752257, 0xF927AED3), LL(0x0001F4C8, 0x00000000), LL(0x00000000, 0x1)};
+BNU_CHUNK_T secp160r1_h = 1;
+
+/*
+// Recommended Parameters secp160r2
+*/
+const BNU_CHUNK_T secp160r2_p[] = { // 2^160 -2^32 -2^14 -2^12 -2^9 -2^8 -2^7 -2^2 -1
+ LL(0xFFFFAC73, 0xFFFFFFFE), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0xFFFFFFFF)};
+const BNU_CHUNK_T secp160r2_a[] = {
+ LL(0xFFFFAC70, 0xFFFFFFFE), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0xFFFFFFFF)};
+const BNU_CHUNK_T secp160r2_b[] = {
+ LL(0xF50388BA, 0x04664D5A), LL(0xAB572749, 0xFB59EB8B), L_(0xB4E134D3)};
+const BNU_CHUNK_T secp160r2_gx[] = {
+ LL(0x3144CE6D, 0x30F7199D), LL(0x1F4FF11B, 0x293A117E), L_(0x52DCB034)};
+const BNU_CHUNK_T secp160r2_gy[] = {
+ LL(0xA7D43F2E, 0xF9982CFE), LL(0xE071FA0D, 0xE331F296), L_(0xFEAFFEF2)};
+const BNU_CHUNK_T secp160r2_r[] = {
+ LL(0xF3A1A16B, 0xE786A818), LL(0x0000351E, 0x00000000), LL(0x00000000, 0x1)};
+BNU_CHUNK_T secp160r2_h = 1;
+
+/*
+// Recommended Parameters secp192r1
+*/
+const BNU_CHUNK_T h_secp192r1_p[] = { // half of secp192r1_p
+ LL(0xFFFFFFFF, 0x7FFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0x7FFFFFFF)};
+
+const BNU_CHUNK_T secp192r1_p[] = { // 2^192 -2^64 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFE, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0x0, 0x0)};
+const BNU_CHUNK_T secp192r1_a[] = {
+ LL(0xFFFFFFFC, 0xFFFFFFFF), LL(0xFFFFFFFE, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF)};
+const BNU_CHUNK_T secp192r1_b[] = {
+ LL(0xC146B9B1, 0xFEB8DEEC), LL(0x72243049, 0x0FA7E9AB), LL(0xE59C80E7, 0x64210519)};
+const BNU_CHUNK_T secp192r1_gx[] = {
+ LL(0x82FF1012, 0xF4FF0AFD), LL(0x43A18800, 0x7CBF20EB), LL(0xB03090F6, 0x188DA80E)};
+const BNU_CHUNK_T secp192r1_gy[] = {
+ LL(0x1E794811, 0x73F977A1), LL(0x6B24CDD5, 0x631011ED), LL(0xFFC8DA78, 0x07192B95)};
+const BNU_CHUNK_T secp192r1_r[] = {
+ LL(0xB4D22831, 0x146BC9B1), LL(0x99DEF836, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF)};
+BNU_CHUNK_T secp192r1_h = 1;
+
+/*
+// Recommended Parameters secp224r1
+*/
+const BNU_CHUNK_T h_secp224r1_p[] = { // half of secp224r1_p
+ LL(0x00000000, 0x00000000), LL(0x80000000, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0x7FFFFFFF, 0x0)};
+
+const BNU_CHUNK_T secp224r1_p[] = { // 2^224 -2^96 +1
+ LL(0x00000001, 0x00000000), LL(0x00000000, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0x0)};
+const BNU_CHUNK_T secp224r1_a[] = {
+ LL(0xFFFFFFFE, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFE), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ L_(0xFFFFFFFF)};
+const BNU_CHUNK_T secp224r1_b[] = {
+ LL(0x2355FFB4, 0x270B3943), LL(0xD7BFD8BA, 0x5044B0B7), LL(0xF5413256, 0x0C04B3AB),
+ L_(0xB4050A85)};
+const BNU_CHUNK_T secp224r1_gx[] = {
+ LL(0x115C1D21, 0x343280D6), LL(0x56C21122, 0x4A03C1D3), LL(0x321390B9, 0x6BB4BF7F),
+ L_(0xB70E0CBD)};
+const BNU_CHUNK_T secp224r1_gy[] = {
+ LL(0x85007E34, 0x44D58199), LL(0x5A074764, 0xCD4375A0), LL(0x4C22DFE6, 0xB5F723FB),
+ L_(0xBD376388)};
+const BNU_CHUNK_T secp224r1_r[] = {
+ LL(0x5C5C2A3D, 0x13DD2945), LL(0xE0B8F03E, 0xFFFF16A2), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ L_(0xFFFFFFFF)};
+BNU_CHUNK_T secp224r1_h = 1;
+
+/*
+// Recommended Parameters secp256r1
+*/
+const BNU_CHUNK_T h_secp256r1_p[] = { // half of secp256r1_p
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0x7FFFFFFF, 0x00000000), LL(0x00000000, 0x80000000),
+ LL(0x80000000, 0x7FFFFFFF)};
+
+const BNU_CHUNK_T secp256r1_p[] = { // 2^256 -2^224 +2^192 +2^96 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0x00000000), LL(0x00000000, 0x00000000),
+ LL(0x00000001, 0xFFFFFFFF), LL(0x0, 0x0)};
+const BNU_CHUNK_T secp256r1_a[] = {
+ LL(0xFFFFFFFC, 0xFFFFFFFF), LL(0xFFFFFFFF, 0x00000000), LL(0x00000000, 0x00000000),
+ LL(0x00000001, 0xFFFFFFFF)};
+const BNU_CHUNK_T secp256r1_b[] = {
+ LL(0x27D2604B, 0x3BCE3C3E), LL(0xCC53B0F6, 0x651D06B0), LL(0x769886BC, 0xB3EBBD55),
+ LL(0xAA3A93E7, 0x5AC635D8)};
+const BNU_CHUNK_T secp256r1_gx[] = {
+ LL(0xD898C296, 0xF4A13945), LL(0x2DEB33A0, 0x77037D81), LL(0x63A440F2, 0xF8BCE6E5),
+ LL(0xE12C4247, 0x6B17D1F2)};
+const BNU_CHUNK_T secp256r1_gy[] = {
+ LL(0x37BF51F5, 0xCBB64068), LL(0x6B315ECE, 0x2BCE3357), LL(0x7C0F9E16, 0x8EE7EB4A),
+ LL(0xFE1A7F9B, 0x4FE342E2)};
+const BNU_CHUNK_T secp256r1_r[] = {
+ LL(0xFC632551, 0xF3B9CAC2), LL(0xA7179E84, 0xBCE6FAAD), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0x00000000, 0xFFFFFFFF)};
+BNU_CHUNK_T secp256r1_h = 1;
+
+/*
+// Recommended Parameters secp384r1
+*/
+const BNU_CHUNK_T h_secp384r1_p[] = { // half of secp384r1_p
+ LL(0x7FFFFFFF, 0x00000000), LL(0x80000000, 0x7FFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0x7FFFFFFF)};
+
+const BNU_CHUNK_T secp384r1_p[] = { // 2^384 -2^128 -2^96 +2^32 -1
+ LL(0xFFFFFFFF, 0x00000000), LL(0x00000000, 0xFFFFFFFF), LL(0xFFFFFFFE, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0x0, 0x0)};
+const BNU_CHUNK_T secp384r1_a[] = {
+ LL(0xFFFFFFFC, 0x00000000), LL(0x00000000, 0xFFFFFFFF), LL(0xFFFFFFFE, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF)};
+const BNU_CHUNK_T secp384r1_b[] = {
+ LL(0xD3EC2AEF, 0x2A85C8ED), LL(0x8A2ED19D, 0xC656398D), LL(0x5013875A, 0x0314088F),
+ LL(0xFE814112, 0x181D9C6E), LL(0xE3F82D19, 0x988E056B), LL(0xE23EE7E4, 0xB3312FA7)};
+const BNU_CHUNK_T secp384r1_gx[] = {
+ LL(0x72760AB7, 0x3A545E38), LL(0xBF55296C, 0x5502F25D), LL(0x82542A38, 0x59F741E0),
+ LL(0x8BA79B98, 0x6E1D3B62), LL(0xF320AD74, 0x8EB1C71E), LL(0xBE8B0537, 0xAA87CA22)};
+const BNU_CHUNK_T secp384r1_gy[] = {
+ LL(0x90EA0E5F, 0x7A431D7C), LL(0x1D7E819D, 0x0A60B1CE), LL(0xB5F0B8C0, 0xE9DA3113),
+ LL(0x289A147C, 0xF8F41DBD), LL(0x9292DC29, 0x5D9E98BF), LL(0x96262C6F, 0x3617DE4A)};
+const BNU_CHUNK_T secp384r1_r[] = {
+ LL(0xCCC52973, 0xECEC196A), LL(0x48B0A77A, 0x581A0DB2), LL(0xF4372DDF, 0xC7634D81),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF)};
+BNU_CHUNK_T secp384r1_h = 1;
+
+/*
+// Recommended Parameters secp521r1
+*/
+const BNU_CHUNK_T h_secp521r1_p[] = { // half of secp521r1_p
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0x000000FF)};
+
+const BNU_CHUNK_T secp521r1_p[] = { // 2^521 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0x000001FF)};
+const BNU_CHUNK_T secp521r1_a[] = {
+ LL(0xFFFFFFFC, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0x000001FF)};
+const BNU_CHUNK_T secp521r1_b[] = {
+ LL(0x6B503F00, 0xEF451FD4), LL(0x3D2C34F1, 0x3573DF88), LL(0x3BB1BF07, 0x1652C0BD),
+ LL(0xEC7E937B, 0x56193951), LL(0x8EF109E1, 0xB8B48991), LL(0x99B315F3, 0xA2DA725B),
+ LL(0xB68540EE, 0x929A21A0), LL(0x8E1C9A1F, 0x953EB961), L_(0x00000051)};
+const BNU_CHUNK_T secp521r1_gx[] = {
+ LL(0xC2E5BD66, 0xF97E7E31), LL(0x856A429B, 0x3348B3C1), LL(0xA2FFA8DE, 0xFE1DC127),
+ LL(0xEFE75928, 0xA14B5E77), LL(0x6B4D3DBA, 0xF828AF60), LL(0x053FB521, 0x9C648139),
+ LL(0x2395B442, 0x9E3ECB66), LL(0x0404E9CD, 0x858E06B7), L_(0x000000C6)};
+const BNU_CHUNK_T secp521r1_gy[] = {
+ LL(0x9FD16650, 0x88BE9476), LL(0xA272C240, 0x353C7086), LL(0x3FAD0761, 0xC550B901),
+ LL(0x5EF42640, 0x97EE7299), LL(0x273E662C, 0x17AFBD17), LL(0x579B4468, 0x98F54449),
+ LL(0x2C7D1BD9, 0x5C8A5FB4), LL(0x9A3BC004, 0x39296A78), L_(0x00000118)};
+const BNU_CHUNK_T secp521r1_r[] = {
+ LL(0x91386409, 0xBB6FB71E), LL(0x899C47AE, 0x3BB5C9B8), LL(0xF709A5D0, 0x7FCC0148),
+ LL(0xBF2F966B, 0x51868783), LL(0xFFFFFFFA, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF),
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), L_(0x000001FF)};
+BNU_CHUNK_T secp521r1_h = 1;
+
+/*
+// Recommended Parameters tpm_BN_p256 (Barreto-Naehrig)
+*/
+const BNU_CHUNK_T tpmBN_p256p_p[] = {
+ LL(0xAED33013, 0xD3292DDB), LL(0x12980A82, 0x0CDC65FB), LL(0xEE71A49F, 0x46E5F25E),
+ LL(0xFFFCF0CD, 0xFFFFFFFF)};
+const BNU_CHUNK_T tpmBN_p256p_a[] = {
+ LL(0, 0)};
+const BNU_CHUNK_T tpmBN_p256p_b[] = {
+ LL(3, 0)};
+const BNU_CHUNK_T tpmBN_p256p_gx[] = {
+ LL(1, 0)};
+const BNU_CHUNK_T tpmBN_p256p_gy[] = {
+ LL(2, 0)};
+const BNU_CHUNK_T tpmBN_p256p_r[] = {
+ LL(0xD10B500D, 0xF62D536C), LL(0x1299921A, 0x0CDC65FB), LL(0xEE71A49E, 0x46E5F25E),
+ LL(0xFFFCF0CD, 0xFFFFFFFF)};
+BNU_CHUNK_T tpmBN_p256p_h = 1;
+
+/*
+// Recommended Parameters tpm_SM2_p256
+*/
+#ifdef _SM2_SIGN_DEBUG_
+const BNU_CHUNK_T tpmSM2_p256_p[] = {
+ LL(0x08F1DFC3, 0x722EDB8B), LL(0x5C45517D, 0x45728391), LL(0xBF6FF7DE, 0xE8B92435), LL(0x4C044F18, 0x8542D69E), LL(0x0, 0x0)};
+const BNU_CHUNK_T tpmSM2_p256_a[] = {
+ LL(0x3937E498, 0xEC65228B), LL(0x6831D7E0, 0x2F3C848B), LL(0x73BBFEFF, 0x2417842E), LL(0xFA32C3FD, 0x787968B4)};
+const BNU_CHUNK_T tpmSM2_p256_b[] = {
+ LL(0x27C5249A, 0x6E12D1DA), LL(0xB16BA06E, 0xF61D59A5), LL(0x484BFE48, 0x9CF84241), LL(0xB23B0C84, 0x63E4C6D3)};
+const BNU_CHUNK_T tpmSM2_p256_gx[] = {
+ LL(0x7FEDD43D, 0x4C4E6C14), LL(0xADD50BDC, 0x32220B3B), LL(0xC3CC315E, 0x746434EB), LL(0x1B62EAB6, 0x421DEBD6)};
+const BNU_CHUNK_T tpmSM2_p256_gy[] = {
+ LL(0xE46E09A2, 0xA85841B9), LL(0xBFA36EA1, 0xE5D7FDFC), LL(0x153B70C4, 0xD47349D2), LL(0xCBB42C07, 0x0680512B)};
+const BNU_CHUNK_T tpmSM2_p256_r[] = {
+ LL(0xC32E79B7, 0x5AE74EE7), LL(0x0485628D, 0x29772063), LL(0xBF6FF7DD, 0xE8B92435), LL(0x4C044F18, 0x8542D69E)};
+#else
+const BNU_CHUNK_T h_tpmSM2_p256_p[] = { // half of tpmSM2_p256_p
+ LL(0xFFFFFFFF, 0x7FFFFFFF), LL(0x80000000, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0x7FFFFFFF, 0x7FFFFFFF)};
+
+const BNU_CHUNK_T tpmSM2_p256_p[] = { // 2^256 -2^224 -2^96 +2^64 -1
+ LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0x00000000, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFE), LL(0x0, 0x0)};
+const BNU_CHUNK_T tpmSM2_p256_a[] = {
+ LL(0xFFFFFFFC, 0xFFFFFFFF), LL(0x00000000, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFE)};
+const BNU_CHUNK_T tpmSM2_p256_b[] = {
+ LL(0x4D940E93, 0xDDBCBD41), LL(0x15AB8F92, 0xF39789F5), LL(0xCF6509A7, 0x4D5A9E4B), LL(0x9D9F5E34, 0x28E9FA9E)};
+const BNU_CHUNK_T tpmSM2_p256_gx[] = {
+ LL(0x334C74C7, 0x715A4589), LL(0xF2660BE1, 0x8FE30BBF), LL(0x6A39C994, 0x5F990446), LL(0x1F198119, 0x32C4AE2C)};
+const BNU_CHUNK_T tpmSM2_p256_gy[] = {
+ LL(0x2139F0A0, 0x02DF32E5), LL(0xC62A4740, 0xD0A9877C), LL(0x6B692153, 0x59BDCEE3), LL(0xF4F6779C, 0xBC3736A2)};
+const BNU_CHUNK_T tpmSM2_p256_r[] = {
+ LL(0x39D54123, 0x53BBF409), LL(0x21C6052B, 0x7203DF6B), LL(0xFFFFFFFF, 0xFFFFFFFF), LL(0xFFFFFFFF, 0xFFFFFFFE)};
+#endif
+BNU_CHUNK_T tpmSM2_p256_h = 1;
+
+#endif /* _IPP_DATA */
diff --git a/ext/ipp/sources/ippcp/src/pcpeccpverifydsaca.c b/ext/ipp/sources/ippcp/src/pcpeccpverifydsaca.c
new file mode 100644
index 0000000..f97c8fb
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpeccpverifydsaca.c
@@ -0,0 +1,174 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (Verify Signature, DSA version)
+//
+// Contents:
+// ippsECCPVerifyDSA()
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsECCPVerifyDSA
+//
+// Purpose: Verify Signature (DSA version).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pECC
+// NULL == pMsgDigest
+// NULL == pSignX
+// NULL == pSignY
+// NULL == pResult
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pMsgDigest->idCtx
+// illegal pSignX->idCtx
+// illegal pSignY->idCtx
+//
+// ippStsMessageErr MsgDigest >= order
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsgDigest pointer to the message representative to be signed
+// pSignX,pSignY pointer to the signature
+// pResult pointer to the result: ippECValid/ippECInvalidSignature
+// pECC pointer to the ECCP context
+//
+// Note:
+// - signer's key must be set up in ECCP context
+// before ippsECCPVerifyDSA() usage
+//
+*F*/
+IPPFUN(IppStatus, ippsECCPVerifyDSA,(const IppsBigNumState* pMsgDigest,
+ const IppsBigNumState* pSignX, const IppsBigNumState* pSignY,
+ IppECResult* pResult,
+ IppsECCPState* pEC))
+{
+ /* use aligned EC context */
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsgDigest);
+ pMsgDigest = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsgDigest, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsgDigest), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsgDigest), ippStsMessageErr);
+
+ /* test result */
+ IPP_BAD_PTR1_RET(pResult);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignX,pSignY);
+ pSignX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignX, BN_ALIGNMENT) );
+ pSignY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignY, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignX), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignY), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignX), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignY), ippStsRangeErr);
+
+ {
+ IppECResult vResult = ippECInvalidSignature;
+
+ gsModEngine* pModEngine = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pModEngine);
+ int orderLen = MOD_LEN(pModEngine);
+
+ /* test input message value */
+ IPP_BADARG_RET(0<=cpCmp_BNU(BN_NUMBER(pMsgDigest), BN_SIZE(pMsgDigest), pOrder, orderLen), ippStsMessageErr);
+
+ /* test signature value */
+ if(!cpEqu_BNU_CHUNK(BN_NUMBER(pSignX), BN_SIZE(pSignX), 0) &&
+ !cpEqu_BNU_CHUNK(BN_NUMBER(pSignY), BN_SIZE(pSignY), 0) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignX), BN_SIZE(pSignX), pOrder, orderLen) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignY), BN_SIZE(pSignY), pOrder, orderLen)) {
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ int elmLen = GFP_FELEN(pGFE);
+ int pelmLen = GFP_PELEN(pGFE);
+
+ BNU_CHUNK_T* h1 = cpGFpGetPool(2, pGFE);
+ BNU_CHUNK_T* h2 = h1+pelmLen;
+
+ IppsGFpECPoint P, G, Public;
+
+ /* Y = 1/signY mod order */
+ __ALIGN8 IppsBigNumState Y;
+ __ALIGN8 IppsBigNumState R;
+ BNU_CHUNK_T* buffer = ECP_SBUFFER(pEC);
+ BN_Make(buffer, buffer+orderLen+1, orderLen, &Y);
+ BN_Make(buffer+(orderLen+1)*2, buffer+(orderLen+1)*3, orderLen, &R);
+ /* BN(order) */
+ BN_Set(pOrder, orderLen, &R);
+ ippsModInv_BN((IppsBigNumState*)pSignY, &R, &Y);
+ /* h1 = 1/signY mod order */
+ cpGFpElementCopyPadd(h1, orderLen, BN_NUMBER(&Y), BN_SIZE(&Y));
+ cpMontEnc_BNU_EX(h1, h1, orderLen, pModEngine);
+
+ /* validate signature */
+ cpEcGFpInitPoint(&P, cpEcGFpGetPool(1, pEC),0, pEC);
+ cpEcGFpInitPoint(&G, ECP_G(pEC), ECP_AFFINE_POINT|ECP_FINITE_POINT, pEC);
+ cpEcGFpInitPoint(&Public, ECP_PUBLIC(pEC), ECP_FINITE_POINT, pEC);
+
+ /* h2 = pSignX * h1 (mod order) */
+ cpMontMul_BNU_EX(h2,
+ h1,orderLen, BN_NUMBER(pSignX), BN_SIZE(pSignX),
+ pModEngine);
+ /* h1 = pMsgDigest * h1 (mod order) */
+ cpMontMul_BNU_EX(h1,
+ h1,orderLen, BN_NUMBER(pMsgDigest), BN_SIZE(pMsgDigest),
+ pModEngine);
+
+ /* compute h1*BasePoint + h2*publicKey */
+ //gfec_PointProduct(&P,
+ // &G, h1, orderLen, &Public, h2, orderLen,
+ // pEC, (Ipp8u*)ECP_SBUFFER(pEC));
+ gfec_BasePointProduct(&P,
+ h1, orderLen, &Public, h2, orderLen,
+ pEC, (Ipp8u*)ECP_SBUFFER(pEC));
+
+ /* get P.X */
+ if(gfec_GetPoint(h1, NULL, &P, pEC)) {
+ /* C' = int(P.x) mod order */
+ GFP_METHOD(pGFE)->decode(h1, h1, pGFE);
+ elmLen = cpMod_BNU(h1, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(h1+elmLen, orderLen-elmLen, 0);
+
+ /* and make sure signX==P.X */
+ cpGFpElementCopyPadd(h2, orderLen, BN_NUMBER(pSignX), BN_SIZE(pSignX));
+ if(GFP_EQ(h1, h2, orderLen))
+ vResult = ippECValid;
+ }
+
+ cpEcGFpReleasePool(1, pEC);
+ cpGFpReleasePool(2, pGFE);
+ }
+
+ *pResult = vResult;
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpecprime.h b/ext/ipp/sources/ippcp/src/pcpecprime.h
new file mode 100644
index 0000000..7dd6c83
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpecprime.h
@@ -0,0 +1,55 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Fixed EC primes
+//
+//
+*/
+
+#if !defined(_PCP_ECPRIME_H)
+#define _PCP_ECPRIME_H
+
+#include "owndefs.h"
+#include "pcpbnuimpl.h"
+
+
+/*
+// Recommended (NIST's) underlying EC Primes
+*/
+extern const BNU_CHUNK_T secp112r1_p[]; // (2^128 -3)/76439
+extern const BNU_CHUNK_T secp112r2_p[]; // (2^128 -3)/76439
+extern const BNU_CHUNK_T secp128r1_p[]; // 2^128 -2^97 -1
+extern const BNU_CHUNK_T secp128r2_p[]; // 2^128 -2^97 -1
+extern const BNU_CHUNK_T secp160r1_p[]; // 2^160 -2^31 -1
+extern const BNU_CHUNK_T secp160r2_p[]; // 2^160 -2^32 -2^14 -2^12 -2^9 -2^8 -2^7 -2^2 -1
+extern const BNU_CHUNK_T secp192r1_p[]; // 2^192 -2^64 -1
+extern const BNU_CHUNK_T secp224r1_p[]; // 2^224 -2^96 +1
+extern const BNU_CHUNK_T secp256r1_p[]; // 2^256 -2^224 +2^192 +2^96 -1
+extern const BNU_CHUNK_T secp384r1_p[]; // 2^384 -2^128 -2^96 +2^32 -1
+extern const BNU_CHUNK_T secp521r1_p[]; // 2^521 -1
+
+extern const BNU_CHUNK_T tpmBN_p256p_p[]; // TPM BN_P256
+
+/*
+// Recommended (SM2) underlying EC Prime
+*/
+extern const BNU_CHUNK_T tpmSM2_p256_p[]; // TPM SM2_P256
+
+#endif /* _PCP_ECPRIME_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpgfp.c b/ext/ipp/sources/ippcp/src/pcpgfp.c
new file mode 100644
index 0000000..693efe8
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfp.c
@@ -0,0 +1,1165 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Operations over GF(p).
+//
+// Context:
+// ippsGFpGetSize()
+// ippsGFpInitArbitrary()
+// ippsGFpInitFixed()
+// ippsGFpInit()
+//
+// ippsGFpElementGetSize()
+// ippsGFpElementInit()
+//
+// ippsGFpSetElement()
+// ippsGFpSetElementRegular()
+// ippsGFpSetElementOctString()
+// ippsGFpSetElementRandom()
+// ippsGFpSetElementHash()
+// ippsGFpSetElementHash_rmf
+// ippsGFpCpyElement()
+// ippsGFpGetElement()
+// ippsGFpGetElementOctString()
+//
+// ippsGFpCmpElement()
+// ippsGFpIsZeroElement()
+// ippsGFpIsUnityElement()
+//
+// ippsGFpSetPolyTerm()
+// ippsGFpGetPolyTerm()
+//
+// ippsGFpConj()
+// ippsGFpNeg()
+// ippsGFpInv()
+// ippsGFpSqrt()
+// ippsGFpAdd()
+// ippsGFpSub()
+// ippsGFpMul()
+// ippsGFpSqr()
+// ippsGFpExp()
+// ippsGFpMultiExp()
+//
+// ippsGFpAdd_GFpE()
+// ippsGFpSub_GFpE()
+// ippsGFpMul_GFpE()
+//
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpstuff.h"
+#include "pcpgfpxstuff.h"
+#include "pcphash.h"
+#include "pcphash_rmf.h"
+#include "pcptool.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+
+/*
+// size of GFp engine context (Montgomery)
+*/
+int cpGFpGetSize(int feBitSize, int peBitSize, int numpe)
+{
+ int ctxSize = 0;
+ int elemLen = BITS_BNU_CHUNK(feBitSize);
+ int pelmLen = BITS_BNU_CHUNK(peBitSize);
+
+ /* size of GFp engine */
+ ctxSize = sizeof(gsModEngine)
+ + elemLen*sizeof(BNU_CHUNK_T) /* modulus */
+ + elemLen*sizeof(BNU_CHUNK_T) /* mont_R */
+ + elemLen*sizeof(BNU_CHUNK_T) /* mont_R^2 */
+ + elemLen*sizeof(BNU_CHUNK_T) /* half of modulus */
+ + elemLen*sizeof(BNU_CHUNK_T) /* quadratic non-residue */
+ + pelmLen*sizeof(BNU_CHUNK_T)*numpe; /* pool */
+
+ ctxSize += sizeof(IppsGFpState); /* size of IppsGFPState */
+ return ctxSize;
+}
+
+IPPFUN(IppStatus, ippsGFpGetSize,(int feBitSize, int* pSize))
+{
+ IPP_BAD_PTR1_RET(pSize);
+ IPP_BADARG_RET((feBitSize < 2) || (feBitSize > GFP_MAX_BITSIZE), ippStsSizeErr);
+
+ *pSize = cpGFpGetSize(feBitSize, feBitSize+BITSIZE(BNU_CHUNK_T), GFP_POOL_SIZE)
+ + GFP_ALIGNMENT;
+ return ippStsNoErr;
+}
+
+
+/*
+// init GFp engine context (Montgomery)
+*/
+static void cpGFEInit(gsModEngine* pGFE, int modulusBitSize, int peBitSize, int numpe)
+{
+ int modLen = BITS_BNU_CHUNK(modulusBitSize);
+ int pelmLen = BITS_BNU_CHUNK(peBitSize);
+
+ Ipp8u* ptr = (Ipp8u*)pGFE;
+
+ /* clear whole context */
+ PaddBlock(0, ptr, sizeof(gsModEngine));
+ ptr += sizeof(gsModEngine);
+
+ GFP_PARENT(pGFE) = NULL;
+ GFP_EXTDEGREE(pGFE) = 1;
+ GFP_FEBITLEN(pGFE) = modulusBitSize;
+ GFP_FELEN(pGFE) = modLen;
+ GFP_FELEN32(pGFE) = BITS2WORD32_SIZE(modulusBitSize);
+ GFP_PELEN(pGFE) = pelmLen;
+ //GFP_METHOD(pGFE) = method;
+ GFP_MODULUS(pGFE) = (BNU_CHUNK_T*)(ptr); ptr += modLen*sizeof(BNU_CHUNK_T);
+ GFP_MNT_R(pGFE) = (BNU_CHUNK_T*)(ptr); ptr += modLen*sizeof(BNU_CHUNK_T);
+ GFP_MNT_RR(pGFE) = (BNU_CHUNK_T*)(ptr); ptr += modLen*sizeof(BNU_CHUNK_T);
+ GFP_HMODULUS(pGFE) = (BNU_CHUNK_T*)(ptr); ptr += modLen*sizeof(BNU_CHUNK_T);
+ GFP_QNR(pGFE) = (BNU_CHUNK_T*)(ptr); ptr += modLen*sizeof(BNU_CHUNK_T);
+ GFP_POOL(pGFE) = (BNU_CHUNK_T*)(ptr);/* ptr += modLen*sizeof(BNU_CHUNK_T);*/
+ GFP_MAXPOOL(pGFE) = numpe;
+ GFP_USEDPOOL(pGFE) = 0;
+
+ cpGFpElementPadd(GFP_MODULUS(pGFE), modLen, 0);
+ cpGFpElementPadd(GFP_MNT_R(pGFE), modLen, 0);
+ cpGFpElementPadd(GFP_MNT_RR(pGFE), modLen, 0);
+ cpGFpElementPadd(GFP_HMODULUS(pGFE), modLen, 0);
+ cpGFpElementPadd(GFP_QNR(pGFE), modLen, 0);
+}
+
+static void cpGFEqnr(gsModEngine* pGFE)
+{
+ BNU_CHUNK_T* pQnr = GFP_QNR(pGFE);
+
+ int elemLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* e = cpGFpGetPool(3, pGFE);
+ BNU_CHUNK_T* t = e+elemLen;
+ BNU_CHUNK_T* p1 = t+elemLen;
+ //gres: temporary excluded: assert(NULL!=e);
+
+ cpGFpElementCopyPadd(p1, elemLen, GFP_MNT_R(pGFE), elemLen);
+
+ /* (modulus-1)/2 */
+ cpLSR_BNU(e, GFP_MODULUS(pGFE), elemLen, 1);
+
+ /* find a non-square g, where g^{(modulus-1)/2} = -1 */
+ cpGFpElementCopy(pQnr, p1, elemLen);
+ do {
+ cpGFpAdd(pQnr, pQnr, p1, pGFE);
+ cpGFpExp(t, pQnr, e, elemLen, pGFE);
+ cpGFpNeg(t, t, pGFE);
+ } while( !GFP_EQ(p1, t, elemLen) );
+
+ cpGFpReleasePool(3, pGFE);
+}
+
+static void cpGFESet(gsModEngine* pGFE, const BNU_CHUNK_T* pPrime, int primeBitSize, const gsModMethod* method)
+{
+ int primeLen = BITS_BNU_CHUNK(primeBitSize);
+
+ /* arithmetic methods */
+ GFP_METHOD(pGFE) = method;
+
+ /* store modulus */
+ COPY_BNU(GFP_MODULUS(pGFE), pPrime, primeLen);
+
+ /* montgomery factor */
+ GFP_MNT_FACTOR(pGFE) = gsMontFactor(GFP_MODULUS(pGFE)[0]);
+
+ /* montgomery identity (R) */
+ ZEXPAND_BNU(GFP_MNT_R(pGFE), 0, primeLen);
+ GFP_MNT_R(pGFE)[primeLen] = 1;
+ cpMod_BNU(GFP_MNT_R(pGFE), primeLen+1, GFP_MODULUS(pGFE), primeLen);
+
+ /* montgomery domain converter (RR) */
+ ZEXPAND_BNU(GFP_MNT_RR(pGFE), 0, primeLen);
+ COPY_BNU(GFP_MNT_RR(pGFE)+primeLen, GFP_MNT_R(pGFE), primeLen);
+ cpMod_BNU(GFP_MNT_RR(pGFE), 2*primeLen, GFP_MODULUS(pGFE), primeLen);
+
+ /* half of modulus */
+ cpLSR_BNU(GFP_HMODULUS(pGFE), GFP_MODULUS(pGFE), primeLen, 1);
+
+ /* set qnr value */
+ cpGFEqnr(pGFE);
+}
+
+IppStatus cpGFpInitGFp(int primeBitSize, IppsGFpState* pGF)
+{
+ IPP_BADARG_RET((primeBitSize< IPP_MIN_GF_BITSIZE) || (primeBitSize> IPP_MAX_GF_BITSIZE), ippStsSizeErr);
+ IPP_BAD_PTR1_RET(pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+
+ {
+ Ipp8u* ptr = (Ipp8u*)pGF;
+
+ GFP_ID(pGF) = idCtxGFP;
+ GFP_PMA(pGF) = (gsModEngine*)(ptr+sizeof(IppsGFpState));
+ cpGFEInit(GFP_PMA(pGF), primeBitSize, primeBitSize+BITSIZE(BNU_CHUNK_T), GFP_POOL_SIZE);
+
+ return ippStsNoErr;
+ }
+}
+
+IppStatus cpGFpSetGFp(const BNU_CHUNK_T* pPrime, int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF)
+{
+ cpGFESet(GFP_PMA(pGF), pPrime, primeBitSize, method->arith);
+ return ippStsNoErr;
+}
+
+/*F*
+// Name: ippsGFpInitFixed
+//
+// Purpose: initializes prime finite field GF(p)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == method
+// NULL == pGF
+//
+// ippStsBadArgErr method != ippsGFpMethod_pXXX() any fixed prime method
+// primeBitSize != sizeof modulus defined by fixed method
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// primeBitSize length of prime in bits
+// method pointer to the basic arithmetic metods
+// pGF pointer to Finite Field context is being initialized
+*F*/
+IPPFUN(IppStatus, ippsGFpInitFixed,(int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR2_RET(method, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+
+ /* test method is prime based */
+ IPP_BADARG_RET(cpID_Prime!=(method->modulusID & cpID_Prime), ippStsBadArgErr);
+ /* test if method is not prime based arbitrary */
+ IPP_BADARG_RET(!method->modulus, ippStsBadArgErr);
+ /* size of the underlying prime must be equal to primeBitSize parameter*/
+ IPP_BADARG_RET(method->modulusBitDeg!=primeBitSize, ippStsBadArgErr);
+
+ {
+ /* init GF */
+ IppStatus sts = cpGFpInitGFp(primeBitSize, pGF);
+
+ /* set up GF engine */
+ if(ippStsNoErr==sts) {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ cpGFESet(pGFE, method->modulus, primeBitSize, method->arith);
+ }
+
+ return sts;
+ }
+}
+
+/*F*
+// Name: ippsGFpInitArbitrary
+//
+// Purpose: initializes prime finite field GF(p)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pPrime
+// NULL == pGF
+//
+// ippStsSizeErr !(IPP_MIN_GF_BITSIZE <= primeBitSize <=IPP_MAX_GF_BITSIZE)
+//
+// ippStsContextMatchErr incorrect pPrime context ID
+//
+// ippStsBadArgErr prime <0
+// bitsize(prime) != primeBitSize
+// prime <IPP_MIN_GF_CHAR
+// prime is even
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pPrimeBN pointer to the prime context
+// primeBitSize length of prime in bits
+// pGF pointer to Finite Field context is being initialized
+*F*/
+IPPFUN(IppStatus, ippsGFpInitArbitrary,(const IppsBigNumState* pPrimeBN, int primeBitSize, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR1_RET(pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+
+ IPP_BADARG_RET((primeBitSize< IPP_MIN_GF_BITSIZE) || (primeBitSize> IPP_MAX_GF_BITSIZE), ippStsSizeErr);
+
+ IPP_BAD_PTR1_RET(pPrimeBN);
+ pPrimeBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrimeBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrimeBN), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_SIGN(pPrimeBN)!= IppsBigNumPOS, ippStsBadArgErr); /* prime is negative */
+ IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pPrimeBN),BN_SIZE(pPrimeBN)) != primeBitSize, ippStsBadArgErr); /* primeBitSize == bitsize(prime) */
+ IPP_BADARG_RET((BN_SIZE(pPrimeBN)==1) && (BN_NUMBER(pPrimeBN)[0]<IPP_MIN_GF_CHAR), ippStsBadArgErr); /* prime < 3 */
+ IPP_BADARG_RET(0==(BN_NUMBER(pPrimeBN)[0] & 1), ippStsBadArgErr); /* prime is even */
+
+ {
+ /* init GF */
+ IppStatus sts = cpGFpInitGFp(primeBitSize, pGF);
+
+ /* set up GF engine */
+ if(ippStsNoErr==sts) {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ cpGFESet(pGFE, BN_NUMBER(pPrimeBN), primeBitSize, ippsGFpMethod_pArb()->arith);
+ }
+
+ return sts;
+ }
+}
+
+/*F*
+// Name: ippsGFpInit
+//
+// Purpose: initializes prime finite field GF(p)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == method
+// NULL == pGF
+//
+// ippStsSizeErr !(IPP_MIN_GF_BITSIZE <= primeBitSize <=IPP_MAX_GF_BITSIZE
+//
+// ippStsContextMatchErr invalid pPrime->idCtx
+//
+// ippStsBadArgErr method != ippsGFpMethod_pXXX() or != ippsGFpMethod_pArb()
+// prime != method->modulus
+// prime <0
+// bitsize(prime) != primeBitSize
+// prime <IPP_MIN_GF_CHAR
+// prime is even
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pPrimeBN pointer to the data representation Finite Field element
+// primeBitSize length of Finite Field data representation array
+// method pointer to Finite Field Element context
+// pGF pointer to Finite Field context is being initialized
+*F*/
+IPPFUN(IppStatus, ippsGFpInit,(const IppsBigNumState* pPrimeBN, int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF))
+{
+ IPP_BADARG_RET(!pPrimeBN && !method, ippStsNullPtrErr);
+
+ IPP_BADARG_RET((primeBitSize< IPP_MIN_GF_BITSIZE) || (primeBitSize> IPP_MAX_GF_BITSIZE), ippStsSizeErr);
+
+ /* use ippsGFpInitFixed() if NULL==pPrimeBN */
+ if(!pPrimeBN)
+ return ippsGFpInitFixed(primeBitSize, method, pGF);
+
+ /* use ippsGFpInitArbitrary() if NULL==method */
+ if(!method)
+ return ippsGFpInitArbitrary(pPrimeBN, primeBitSize, pGF);
+
+ /* test parameters if both pPrimeBN and method are defined */
+ else {
+ IppStatus sts;
+
+ /* test input prime */
+ pPrimeBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrimeBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrimeBN), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_SIGN(pPrimeBN)!= IppsBigNumPOS, ippStsBadArgErr); /* prime is negative */
+ IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pPrimeBN),BN_SIZE(pPrimeBN)) != primeBitSize, ippStsBadArgErr); /* primeBitSize == bitsize(prime) */
+ IPP_BADARG_RET((BN_SIZE(pPrimeBN)==1) && (BN_NUMBER(pPrimeBN)[0]<IPP_MIN_GF_CHAR), ippStsBadArgErr); /* prime < 3 */
+ IPP_BADARG_RET(0==(BN_NUMBER(pPrimeBN)[0] & 1), ippStsBadArgErr); /* prime is even */
+
+ /* test if method is prime based */
+ IPP_BADARG_RET(cpID_Prime!=(method->modulusID & cpID_Prime), ippStsBadArgErr);
+
+ /* test if size of the prime is matched to method's prime */
+ IPP_BADARG_RET(method->modulusBitDeg && (primeBitSize!=method->modulusBitDeg), ippStsBadArgErr);
+
+ /* if method assumes fixed prime value */
+ if(method->modulus) {
+ int primeLen = BITS_BNU_CHUNK(primeBitSize);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pPrimeBN), primeLen, method->modulus, primeLen), ippStsBadArgErr);
+ }
+
+ /* init GF */
+ sts = cpGFpInitGFp(primeBitSize, pGF);
+
+ /* set up GF and find quadratic nonresidue */
+ if(ippStsNoErr==sts) {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ cpGFESet(pGFE, BN_NUMBER(pPrimeBN), primeBitSize, method->arith);
+ }
+
+ return sts;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpScratchBufferSize,(int nExponents, int ExpBitSize, const IppsGFpState* pGF, int* pBufferSize))
+{
+ IPP_BAD_PTR2_RET(pGF, pBufferSize);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( 0>=nExponents ||nExponents>IPP_MAX_EXPONENT_NUM, ippStsBadArgErr);
+ IPP_BADARG_RET( 0>=ExpBitSize, ippStsBadArgErr);
+
+ {
+ int elmDataSize = GFP_FELEN(GFP_PMA(pGF))*sizeof(BNU_CHUNK_T);
+
+ /* get window_size */
+ int w = (nExponents==1)? cpGFpGetOptimalWinSize(ExpBitSize) : /* use optimal window size, if single-scalar operation */
+ nExponents; /* or pseudo-oprimal if multi-scalar operation */
+
+ /* number of table entries */
+ int nPrecomputed = 1<<w;
+
+ *pBufferSize = elmDataSize*nPrecomputed + (CACHE_LINE_SIZE-1);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpElementGetSize,(const IppsGFpState* pGF, int* pElementSize))
+{
+ IPP_BAD_PTR2_RET(pElementSize, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ *pElementSize = sizeof(IppsGFpElement)
+ +GFP_FELEN(GFP_PMA(pGF))*sizeof(BNU_CHUNK_T);
+ return ippStsNoErr;
+}
+
+
+IPPFUN(IppStatus, ippsGFpElementInit,(const Ipp32u* pA, int nsA, IppsGFpElement* pR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR2_RET(pR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ IPP_BADARG_RET(0>nsA, ippStsSizeErr);
+
+ {
+ int elemLen = GFP_FELEN(GFP_PMA(pGF));
+
+ Ipp8u* ptr = (Ipp8u*)pR;
+ ptr += sizeof(IppsGFpElement);
+ cpGFpElementConstruct(pR, (BNU_CHUNK_T*)ptr, elemLen);
+ return ippsGFpSetElement(pA, nsA, pR, pGF);
+ }
+}
+
+/*F*
+// Name: ippsGFpSetElement
+//
+// Purpose: Set GF Element
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGF
+// NULL == pElm
+// NULL == pDataA && nsA>0
+//
+// ippStsContextMatchErr invalid pGF->idCtx
+// invalid pElm->idCtx
+//
+// ippStsSizeErr pDataA && !(0<=nsA && nsA<GFP_FELEN32())
+//
+// ippStsOutOfRangeErr GFPE_ROOM() != GFP_FELEN()
+// BNU representation of pDataA[i]..pDataA[i+GFP_FELEN32()-1] >= modulus
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pDataA pointer to the data representation Finite Field element
+// nsA length of Finite Field data representation array
+// pElm pointer to Finite Field Element context
+// pGF pointer to Finite Field context
+*F*/
+IPPFUN(IppStatus, ippsGFpSetElement,(const Ipp32u* pDataA, int nsA, IppsGFpElement* pElm, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR2_RET(pElm, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( !pDataA && (0<nsA), ippStsNullPtrErr);
+ IPP_BADARG_RET( pDataA && !(0<=nsA && nsA<=GFP_FELEN32(GFP_PMA(pGF))), ippStsSizeErr );
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(GFP_PMA(pGF)), ippStsOutOfRangeErr );
+
+ {
+ IppStatus sts = ippStsNoErr;
+
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(NULL!=pTmp);
+
+ ZEXPAND_BNU(pTmp, 0, elemLen);
+ if(pDataA && nsA)
+ cpGFpxCopyToChunk(pTmp, pDataA, nsA, pGFE);
+
+ if(!cpGFpxSet(GFPE_DATA(pElm), pTmp, elemLen, pGFE))
+ sts = ippStsOutOfRangeErr;
+
+ cpGFpReleasePool(1, pGFE);
+ return sts;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpSetElementRegular,(const IppsBigNumState* pBN, IppsGFpElement* pElm, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR1_RET(pBN);
+ pBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET( !BN_VALID_ID(pBN), ippStsContextMatchErr );
+ IPP_BADARG_RET( !BN_POSITIVE(pBN), ippStsOutOfRangeErr);
+
+ return ippsGFpSetElement((Ipp32u*)BN_NUMBER(pBN), BITS2WORD32_SIZE( BITSIZE_BNU(BN_NUMBER((pBN)),BN_SIZE((pBN)))), pElm, pGF);
+}
+
+/*F*
+// Name: ippsGFpSetElementOctString
+//
+// Purpose: Set GF Element
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGF
+// NULL == pElm
+// NULL == pStr && strSize>0
+//
+// ippStsContextMatchErr invalid pGF->idCtx
+// invalid pElm->idCtx
+//
+// ippStsSizeErr pDataA && !(0<=nsA && nsA<GFP_FELEN32())
+//
+// ippStsOutOfRangeErr GFPE_ROOM() != GFP_FELEN()
+// BNU representation of pStr[] >= modulus
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pDataA pointer to the data representation Finite Field element
+// nsA length of Finite Field data representation array
+// pElm pointer to Finite Field Element context
+// pGF pointer to Finite Field context
+*F*/
+IPPFUN(IppStatus, ippsGFpSetElementOctString,(const Ipp8u* pStr, int strSize, IppsGFpElement* pElm, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR2_RET(pElm, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( (!pStr && 0<strSize), ippStsNullPtrErr);
+ IPP_BADARG_RET(!(0<strSize && strSize<=(int)(GFP_FELEN32(GFP_PMA(pGF))*sizeof(Ipp32u))), ippStsSizeErr );
+
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(GFP_PMA(pGF)), ippStsOutOfRangeErr);
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFE);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicSize = BITS2WORD8_SIZE(BITSIZE_BNU(GFP_MODULUS(pBasicGFE),GFP_FELEN(pBasicGFE)));
+
+ BNU_CHUNK_T* pDataElm = GFPE_DATA(pElm);
+
+ int deg, error;
+ /* set element to zero */
+ cpGFpElementPadd(pDataElm, GFP_FELEN(pGFE), 0);
+
+ /* convert oct string to element (from low to high) */
+ for(deg=0, error=0; deg<basicDeg && !error; deg++) {
+ int size = IPP_MIN(strSize, basicSize);
+ error = NULL == cpGFpSetOctString(pDataElm, pStr, size, pBasicGFE);
+
+ pDataElm += basicElemLen;
+ strSize -= size;
+ pStr += size;
+ }
+
+ return error? ippStsOutOfRangeErr : ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsGFpSetElementRandom
+//
+// Purpose: Set GF Element Random
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGF
+// NULL == pElm
+// NULL == rndFunc
+//
+// ippStsContextMatchErr invalid pGF->idCtx
+// invalid pElm->idCtx
+//
+// ippStsOutOfRangeErr GFPE_ROOM() != GFP_FELEN()
+//
+// ippStsErr internal error caused by call of rndFunc()
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pDataA pointer to the data representation Finite Field element
+// nsA length of Finite Field data representation array
+// pElm pointer to Finite Field Element context
+// pGF pointer to Finite Field context
+*F*/
+IPPFUN(IppStatus, ippsGFpSetElementRandom,(IppsGFpElement* pElm, IppsGFpState* pGF,
+ IppBitSupplier rndFunc, void* pRndParam))
+{
+ IPP_BAD_PTR3_RET(pElm, pGF, rndFunc);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ return cpGFpxRand(GFPE_DATA(pElm), pGFE, rndFunc, pRndParam)? ippStsNoErr : ippStsErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpCpyElement, (const IppsGFpElement* pElmA, IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ cpGFpElementCopy(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFP_FELEN(pGFE));
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpGetElement, (const IppsGFpElement* pElm, Ipp32u* pDataA, int nsA, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElm, pDataA, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( !(0<nsA && nsA>=GFP_FELEN32(pGFE)), ippStsSizeErr );
+
+ {
+ int elemLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(NULL!=pTmp);
+
+ cpGFpxGet(pTmp, elemLen, GFPE_DATA(pElm), pGFE);
+ cpGFpxCopyFromChunk(pDataA, pTmp, pGFE);
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpGetElementOctString,(const IppsGFpElement* pElm, Ipp8u* pStr, int strSize, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pStr, pElm, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr );
+ IPP_BADARG_RET( 0>=strSize, ippStsSizeErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFE);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicSize = BITS2WORD8_SIZE(BITSIZE_BNU(GFP_MODULUS(pBasicGFE),GFP_FELEN(pBasicGFE)));
+
+ BNU_CHUNK_T* pDataElm = GFPE_DATA(pElm);
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ int size = IPP_MIN(strSize, basicSize);
+ cpGFpGetOctString(pStr, size, pDataElm, pBasicGFE);
+
+ pDataElm += basicElemLen;
+ pStr += size;
+ strSize -= size;
+ }
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpCmpElement,(const IppsGFpElement* pElmA, const IppsGFpElement* pElmB,
+ int* pResult,
+ const IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pElmB, pResult, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmB), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmB)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ {
+ int flag = cpGFpElementCmp(GFPE_DATA(pElmA), GFPE_DATA(pElmB), GFP_FELEN(pGFE));
+ if( GFP_IS_BASIC(pGFE) )
+ *pResult = (0==flag)? IPP_IS_EQ : (0<flag)? IPP_IS_GT : IPP_IS_LT;
+ else
+ *pResult = (0==flag)? IPP_IS_EQ : IPP_IS_NE;
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpIsZeroElement,(const IppsGFpElement* pElmA,
+ int* pResult,
+ const IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pResult, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ {
+ int flag = GFP_IS_ZERO(GFPE_DATA(pElmA), GFP_FELEN(pGFE));
+ *pResult = (1==flag)? IPP_IS_EQ : IPP_IS_NE;
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpIsUnityElement,(const IppsGFpElement* pElmA,
+ int* pResult,
+ const IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pResult, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFE);
+ int basicElmLen = GFP_FELEN(pBasicGFE);
+ BNU_CHUNK_T* pUnity = GFP_MNT_R(pBasicGFE);
+
+ int elmLen = GFP_FELEN(pGFE);
+ int flag;
+
+ FIX_BNU(pUnity, basicElmLen);
+ FIX_BNU(GFPE_DATA(pElmA), elmLen);
+
+ flag = (basicElmLen==elmLen) && (0 == cpGFpElementCmp(GFPE_DATA(pElmA), pUnity, elmLen));
+ *pResult = (1==flag)? IPP_IS_EQ : IPP_IS_NE;
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpConj,(const IppsGFpElement* pElmA,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( 2!=GFP_EXTDEGREE(pGFE), ippStsBadArgErr )
+
+ cpGFpxConj(GFPE_DATA(pElmR), GFPE_DATA(pElmA), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpNeg,(const IppsGFpElement* pElmA,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ GFP_METHOD(pGFE)->neg(GFPE_DATA(pElmR), GFPE_DATA(pElmA), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpInv,(const IppsGFpElement* pElmA,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( GFP_IS_ZERO(GFPE_DATA(pElmA),GFP_FELEN(pGFE)), ippStsDivByZeroErr );
+
+ return NULL != cpGFpxInv(GFPE_DATA(pElmR), GFPE_DATA(pElmA), pGFE)? ippStsNoErr : ippStsBadArgErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpSqrt,(const IppsGFpElement* pElmA,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr )
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ return cpGFpSqrt(GFPE_DATA(pElmR), GFPE_DATA(pElmA), pGFE)? ippStsNoErr : ippStsQuadraticNonResidueErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpAdd,(const IppsGFpElement* pElmA, const IppsGFpElement* pElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmB)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ GFP_METHOD(pGFE)->add(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pElmB), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpSub,(const IppsGFpElement* pElmA, const IppsGFpElement* pElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmB)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ GFP_METHOD(pGFE)->sub(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pElmB), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpMul,(const IppsGFpElement* pElmA, const IppsGFpElement* pElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmB)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ GFP_METHOD(pGFE)->mul(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pElmB),pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpSqr,(const IppsGFpElement* pElmA,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR3_RET(pElmA, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ GFP_METHOD(pGFE)->sqr(GFPE_DATA(pElmR), GFPE_DATA(pElmA), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpAdd_PE,(const IppsGFpElement* pElmA, const IppsGFpElement* pParentElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pParentElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pParentElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFP_IS_BASIC(pGFE), ippStsBadArgErr )
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( (GFPE_ROOM(pParentElmB)!=GFP_FELEN(GFP_PARENT(pGFE))), ippStsOutOfRangeErr);
+
+ cpGFpxAdd_GFE(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pParentElmB), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpSub_PE,(const IppsGFpElement* pElmA, const IppsGFpElement* pParentElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pParentElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pParentElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFP_IS_BASIC(pGFE), ippStsBadArgErr )
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( (GFPE_ROOM(pParentElmB)!=GFP_FELEN(GFP_PARENT(pGFE))), ippStsOutOfRangeErr);
+
+ cpGFpxSub_GFE(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pParentElmB), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpMul_PE,(const IppsGFpElement* pElmA, const IppsGFpElement* pParentElmB,
+ IppsGFpElement* pElmR, IppsGFpState* pGF))
+{
+ IPP_BAD_PTR4_RET(pElmA, pParentElmB, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pParentElmB), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFP_IS_BASIC(pGFE), ippStsBadArgErr )
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( (GFPE_ROOM(pParentElmB)!=GFP_FELEN(GFP_PARENT(pGFE))), ippStsOutOfRangeErr);
+
+ cpGFpxMul_GFE(GFPE_DATA(pElmR), GFPE_DATA(pElmA), GFPE_DATA(pParentElmB), pGFE);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpExp,(const IppsGFpElement* pElmA, const IppsBigNumState* pE,
+ IppsGFpElement* pElmR, IppsGFpState* pGF,
+ Ipp8u* pScratchBuffer))
+{
+ IPP_BAD_PTR4_RET(pElmA, pE, pElmR, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+
+ pE = (IppsBigNumState*)( IPP_ALIGNED_PTR(pE, BN_ALIGNMENT) );
+ IPP_BADARG_RET( !BN_VALID_ID(pE), ippStsContextMatchErr );
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+
+ cpGFpxExp(GFPE_DATA(pElmR), GFPE_DATA(pElmA), BN_NUMBER(pE), BN_SIZE(pE), pGFE, pScratchBuffer);
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpMultiExp,(const IppsGFpElement* const ppElmA[], const IppsBigNumState* const ppE[], int nItems,
+ IppsGFpElement* pElmR, IppsGFpState* pGF,
+ Ipp8u* pScratchBuffer))
+{
+ IPP_BAD_PTR2_RET(ppElmA, ppE);
+
+ if(nItems==1)
+ return ippsGFpExp(ppElmA[0], ppE[0], pElmR, pGF, pScratchBuffer);
+
+ else {
+ /* test number of exponents */
+ IPP_BADARG_RET(1>nItems || nItems>IPP_MAX_EXPONENT_NUM, ippStsBadArgErr);
+
+ IPP_BAD_PTR2_RET(pElmR, pGF);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmR), ippStsContextMatchErr );
+ {
+ int n;
+
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ /* test all ppElmA[] and ppE[] pairs */
+ for(n=0; n<nItems; n++) {
+ const IppsGFpElement* pElmA = ppElmA[n];
+ const IppsBigNumState* pE = ppE[n];
+ IPP_BAD_PTR2_RET(pElmA, pE);
+
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElmA), ippStsContextMatchErr );
+ pE = (IppsBigNumState*)( IPP_ALIGNED_PTR(pE, BN_ALIGNMENT) );
+ IPP_BADARG_RET( !BN_VALID_ID(pE), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( (GFPE_ROOM(pElmA)!=GFP_FELEN(pGFE)) || (GFPE_ROOM(pElmR)!=GFP_FELEN(pGFE)), ippStsOutOfRangeErr);
+ }
+
+ if(NULL==pScratchBuffer) {
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+
+ BNU_CHUNK_T* pTmpR = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(NULL!=pTmpR);
+
+ cpGFpxExp(GFPE_DATA(pElmR), GFPE_DATA(ppElmA[0]), BN_NUMBER(ppE[0]), BN_SIZE(ppE[0]), pGFE, 0);
+ for(n=1; n<nItems; n++) {
+ cpGFpxExp(pTmpR, GFPE_DATA(ppElmA[n]), BN_NUMBER(ppE[n]), BN_SIZE(ppE[n]), pGFE, 0);
+ mulF(GFPE_DATA(pElmR), GFPE_DATA(pElmR), pTmpR, pGFE);
+ }
+
+ cpGFpReleasePool(1, pGFE);
+ }
+
+ else {
+ const BNU_CHUNK_T* ppAdata[IPP_MAX_EXPONENT_NUM];
+ const BNU_CHUNK_T* ppEdata[IPP_MAX_EXPONENT_NUM];
+ int nsEdataLen[IPP_MAX_EXPONENT_NUM];
+ for(n=0; n<nItems; n++) {
+ ppAdata[n] = GFPE_DATA(ppElmA[n]);
+ ppEdata[n] = BN_NUMBER(ppE[n]);
+ nsEdataLen[n] = BN_SIZE(ppE[n]);
+ }
+ cpGFpxMultiExp(GFPE_DATA(pElmR), ppAdata, ppEdata, nsEdataLen, nItems, pGFE, pScratchBuffer);
+ }
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+/*F*
+// Name: ippsGFpSetElementHash
+//
+// Purpose: Set GF Element Hash of the Message
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGF
+// NULL == pElm
+// NULL == pMsg if msgLen>0
+//
+// ippStsNotSupportedModeErr hashID is not supported
+//
+// ippStsContextMatchErr invalid pGF->idCtx
+// invalid pElm->idCtx
+//
+// ippStsOutOfRangeErr GFPE_ROOM() != GFP_FELEN()
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pMsg pointer to the message is beinh hashed
+// msgLen length of the message above
+// pElm pointer to Finite Field Element context
+// pGF pointer to Finite Field context
+// hashID applied hash algothith ID
+*F*/
+IPPFUN(IppStatus, ippsGFpSetElementHash,(const Ipp8u* pMsg, int msgLen, IppsGFpElement* pElm, IppsGFpState* pGF, IppHashAlgId hashID))
+{
+ /* get algorithm id */
+ hashID = cpValidHashAlg(hashID);
+ IPP_BADARG_RET(ippHashAlg_Unknown==hashID, ippStsNotSupportedModeErr);
+
+ /* test message length and pointer */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ IPP_BAD_PTR2_RET(pElm, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr);
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr);
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ {
+ Ipp8u md[MAX_HASH_SIZE];
+ BNU_CHUNK_T hashVal[(MAX_HASH_SIZE*8)/BITSIZE(BNU_CHUNK_T)+1]; /* +1 to meet cpMod_BNU() implementtaion specific */
+ IppStatus sts = ippsHashMessage(pMsg, msgLen, md, hashID);
+
+ if(ippStsNoErr==sts) {
+ int elemLen = GFP_FELEN(pGFE);
+ int hashLen = cpHashAlgAttr[hashID].hashSize;
+ int hashValLen = cpFromOctStr_BNU(hashVal, md, hashLen);
+ hashValLen = cpMod_BNU(hashVal, hashValLen, GFP_MODULUS(pGFE), elemLen);
+ cpGFpSet(GFPE_DATA(pElm), hashVal, hashValLen, pGFE);
+ }
+
+ return sts;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpSetElementHash_rmf,(const Ipp8u* pMsg, int msgLen, IppsGFpElement* pElm, IppsGFpState* pGF, const IppsHashMethod* pMethod))
+{
+ /* test method pointer */
+ IPP_BAD_PTR1_RET(pMethod);
+
+ /* test message length and pointer */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ IPP_BAD_PTR2_RET(pElm, pGF);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr);
+ IPP_BADARG_RET( !GFPE_TEST_ID(pElm), ippStsContextMatchErr);
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ IPP_BADARG_RET( GFPE_ROOM(pElm)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ {
+ Ipp8u md[MAX_HASH_SIZE];
+ BNU_CHUNK_T hashVal[(MAX_HASH_SIZE*8)/BITSIZE(BNU_CHUNK_T)+1]; /* +1 to meet cpMod_BNU() implementtaion specific */
+ IppStatus sts = ippsHashMessage_rmf(pMsg, msgLen, md, pMethod);
+
+ if(ippStsNoErr==sts) {
+ int elemLen = GFP_FELEN(pGFE);
+ int hashLen = pMethod->hashLen;
+ int hashValLen = cpFromOctStr_BNU(hashVal, md, hashLen);
+ hashValLen = cpMod_BNU(hashVal, hashValLen, GFP_MODULUS(pGFE), elemLen);
+ cpGFpSet(GFPE_DATA(pElm), hashVal, hashValLen, pGFE);
+ }
+
+ return sts;
+ }
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpec.c b/ext/ipp/sources/ippcp/src/pcpgfpec.c
new file mode 100644
index 0000000..ee810f6
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpec.c
@@ -0,0 +1,881 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// EC over GF(p^m) definitinons
+//
+// Context:
+// ippsGFpECGetSize()
+// ippsGFpECInit()
+//
+// ippsGFpECInitStd192r1
+// ippsGFpECInitStd224r1
+// ippsGFpECInitStd256r1
+// ippsGFpECInitStd384r1
+// ippsGFpECInitStd521r1
+// ippsGFpECInitStdSM2
+// ippsGFpECInitStdBN256
+//
+// ippsGFpECSet()
+// ippsGFpECSetSubgroup()
+//
+// ippsGFpECBindGxyTblStd192r1
+// ippsGFpECBindGxyTblStd224r1
+// ippsGFpECBindGxyTblStd256r1
+// ippsGFpECBindGxyTblStd384r1
+// ippsGFpECBindGxyTblStd521r1
+// ippsGFpECBindGxyTblStdSM2
+//
+// ippsGFpECGet()
+// ippsGFpECGetSubgroup()
+//
+// ippsGFpECScratchBufferSize()
+// ippsGFpECVerify()
+//
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpecstuff.h"
+#include "pcpeccp.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+int cpGFpECGetSize(int basicDeg, int basicElmBitSize)
+{
+ int ctxSize = 0;
+ int elemLen = basicDeg*BITS_BNU_CHUNK(basicElmBitSize);
+
+ int maxOrderBits = 1+ basicDeg*basicElmBitSize;
+ #if defined(_LEGACY_ECCP_SUPPORT_)
+ int maxOrderLen = BITS_BNU_CHUNK(maxOrderBits);
+ #endif
+
+ int modEngineCtxSize;
+ if(ippStsNoErr==gsModEngineGetSize(maxOrderBits, MONT_DEFAULT_POOL_LENGTH, &modEngineCtxSize)) {
+
+ ctxSize = sizeof(IppsGFpECState)
+ +elemLen*sizeof(BNU_CHUNK_T) /* EC coeff A */
+ +elemLen*sizeof(BNU_CHUNK_T) /* EC coeff B */
+ +elemLen*sizeof(BNU_CHUNK_T) /* generator G.x */
+ +elemLen*sizeof(BNU_CHUNK_T) /* generator G.y */
+ +elemLen*sizeof(BNU_CHUNK_T) /* generator G.z */
+ +modEngineCtxSize /* mont engine (R) */
+ +elemLen*sizeof(BNU_CHUNK_T) /* cofactor */
+ #if defined(_LEGACY_ECCP_SUPPORT_)
+ +2*elemLen*3*sizeof(BNU_CHUNK_T) /* regular and ephemeral public keys */
+ +2*maxOrderLen*sizeof(BNU_CHUNK_T) /* regular and ephemeral private keys */
+ #endif
+ +elemLen*sizeof(BNU_CHUNK_T)*3*EC_POOL_SIZE;
+ }
+ return ctxSize;
+}
+
+IPPFUN(IppStatus, ippsGFpECGetSize,(const IppsGFpState* pGF, int* pCtxSize))
+{
+ IPP_BAD_PTR2_RET(pGF, pCtxSize);
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ *pCtxSize = cpGFpECGetSize(cpGFpBasicDegreeExtension(pGFE), GFP_FEBITLEN(cpGFpBasic(pGFE)))
+ + ECGFP_ALIGNMENT;
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECInit,(const IppsGFpState* pGF,
+ const IppsGFpElement* pA, const IppsGFpElement* pB,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ {
+ Ipp8u* ptr = (Ipp8u*)pEC;
+
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ int maxOrderBits = 1+ cpGFpBasicDegreeExtension(pGFE) * GFP_FEBITLEN(cpGFpBasic(pGFE));
+ #if defined(_LEGACY_ECCP_SUPPORT_)
+ int maxOrdLen = BITS_BNU_CHUNK(maxOrderBits);
+ #endif
+
+ int modEngineCtxSize;
+ gsModEngineGetSize(maxOrderBits, MONT_DEFAULT_POOL_LENGTH, &modEngineCtxSize);
+
+ ECP_ID(pEC) = idCtxGFPEC;
+ ECP_GFP(pEC) = (IppsGFpState*)(IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT));
+ ECP_POINTLEN(pEC) = elemLen*3;
+ ECP_ORDBITSIZE(pEC) = maxOrderBits;
+ ECP_SPECIFIC(pEC) = ECP_ARB;
+
+ ptr += sizeof(IppsGFpECState);
+ ECP_A(pEC) = (BNU_CHUNK_T*)(ptr); ptr += elemLen*sizeof(BNU_CHUNK_T);
+ ECP_B(pEC) = (BNU_CHUNK_T*)(ptr); ptr += elemLen*sizeof(BNU_CHUNK_T);
+ ECP_G(pEC) = (BNU_CHUNK_T*)(ptr); ptr += ECP_POINTLEN(pEC)*sizeof(BNU_CHUNK_T);
+ ECP_PREMULBP(pEC) = (cpPrecompAP*)NULL;
+ ECP_MONT_R(pEC) = (gsModEngine*)( IPP_ALIGNED_PTR((ptr), (MONT_ALIGNMENT)) ); ptr += modEngineCtxSize;
+ ECP_COFACTOR(pEC) = (BNU_CHUNK_T*)(ptr); ptr += elemLen*sizeof(BNU_CHUNK_T);
+ #if defined(_LEGACY_ECCP_SUPPORT_)
+ ECP_PUBLIC(pEC) = (BNU_CHUNK_T*)(ptr); ptr += 3*elemLen*sizeof(BNU_CHUNK_T);
+ ECP_PUBLIC_E(pEC) = (BNU_CHUNK_T*)(ptr); ptr += 3*elemLen*sizeof(BNU_CHUNK_T);
+ ECP_PRIVAT(pEC) = (BNU_CHUNK_T*)(ptr); ptr += maxOrdLen*sizeof(BNU_CHUNK_T);
+ ECP_PRIVAT_E(pEC) = (BNU_CHUNK_T*)(ptr); ptr += maxOrdLen*sizeof(BNU_CHUNK_T);
+ ECP_SBUFFER(pEC) = (BNU_CHUNK_T*)0;
+ #endif
+ ECP_POOL(pEC) = (BNU_CHUNK_T*)(ptr); //ptr += ECP_POINTLEN(pEC)*sizeof(BNU_CHUNK_T)*EC_POOL_SIZE;
+
+ cpGFpElementPadd(ECP_A(pEC), elemLen, 0);
+ cpGFpElementPadd(ECP_B(pEC), elemLen, 0);
+ cpGFpElementPadd(ECP_G(pEC), elemLen*3, 0);
+ gsModEngineInit(ECP_MONT_R(pEC), NULL, maxOrderBits, MONT_DEFAULT_POOL_LENGTH, gsModArithMont());
+
+ cpGFpElementPadd(ECP_COFACTOR(pEC), elemLen, 0);
+
+ cpGFpElementPadd(ECP_POOL(pEC), elemLen*3*EC_POOL_SIZE, 0);
+
+ /* set up EC if possible */
+ if(pA && pB)
+ return ippsGFpECSet(pA,pB, pEC);
+ else
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECSet,(const IppsGFpElement* pA,
+ const IppsGFpElement* pB,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ IPP_BAD_PTR2_RET(pA, pB);
+ IPP_BADARG_RET( !GFPE_TEST_ID(pA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pB), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(ECP_GFP(pEC));
+ int elemLen = GFP_FELEN(pGFE);
+
+ IPP_BADARG_RET( GFPE_ROOM(pA)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( GFPE_ROOM(pB)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ /* copy A */
+ cpGFpElementPadd(ECP_A(pEC), elemLen, 0);
+ cpGFpElementCopy(ECP_A(pEC), GFPE_DATA(pA), elemLen);
+ /* and set up A-specific (a==0 or a==-3) if is */
+ if(GFP_IS_ZERO(ECP_A(pEC), elemLen))
+ ECP_SPECIFIC(pEC) = ECP_EPID2;
+
+ cpGFpElementSetChunk(ECP_B(pEC), elemLen, 3);
+ GFP_METHOD(pGFE)->encode(ECP_B(pEC), ECP_B(pEC), pGFE);
+ GFP_METHOD(pGFE)->add(ECP_B(pEC), ECP_A(pEC), ECP_B(pEC), pGFE);
+ if(GFP_IS_ZERO(ECP_B(pEC), elemLen))
+ ECP_SPECIFIC(pEC) = ECP_STD;
+
+ /* copy B */
+ cpGFpElementPadd(ECP_B(pEC), elemLen, 0);
+ cpGFpElementCopy(ECP_B(pEC), GFPE_DATA(pB), elemLen);
+ /* and set type of affine infinity representation:
+ // (0,1) if B==0
+ // (0,0) if B!=0 */
+ ECP_INFINITY(pEC) = GFP_IS_ZERO(ECP_B(pEC), elemLen);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECSetSubgroup,(const IppsGFpElement* pX, const IppsGFpElement* pY,
+ const IppsBigNumState* pOrder,
+ const IppsBigNumState* pCofactor,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ IPP_BAD_PTR2_RET(pX, pY);
+ IPP_BADARG_RET( !GFPE_TEST_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pY), ippStsContextMatchErr );
+
+ IPP_BAD_PTR2_RET(pOrder, pCofactor);
+ pOrder = (IppsBigNumState*)( IPP_ALIGNED_PTR(pOrder, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pOrder), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_SIGN(pOrder)!= IppsBigNumPOS, ippStsBadArgErr);
+
+ pCofactor = (IppsBigNumState*)( IPP_ALIGNED_PTR(pCofactor, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pCofactor), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_SIGN(pCofactor)!= IppsBigNumPOS, ippStsBadArgErr);
+
+ {
+ gsModEngine* pGFE = GFP_PMA(ECP_GFP(pEC));
+ int elemLen = GFP_FELEN(pGFE);
+
+ IPP_BADARG_RET( GFPE_ROOM(pX)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( GFPE_ROOM(pY)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ gfec_SetPoint(ECP_G(pEC), GFPE_DATA(pX), GFPE_DATA(pY), pEC);
+
+ {
+ int maxOrderBits = 1+ cpGFpBasicDegreeExtension(pGFE) * GFP_FEBITLEN(cpGFpBasic(pGFE));
+ BNU_CHUNK_T* pOrderData = BN_NUMBER(pOrder);
+ int orderLen= BN_SIZE(pOrder);
+ int orderBitSize = BITSIZE_BNU(pOrderData, orderLen);
+ IPP_BADARG_RET(orderBitSize>maxOrderBits, ippStsRangeErr)
+ ECP_ORDBITSIZE(pEC) = orderBitSize;
+ gsModEngineInit(ECP_MONT_R(pEC),(Ipp32u*)pOrderData, orderBitSize, MONT_DEFAULT_POOL_LENGTH, gsModArithMont());
+ }
+
+ {
+ BNU_CHUNK_T* pCofactorData = BN_NUMBER(pCofactor);
+ int cofactorLen= BN_SIZE(pCofactor);
+ int cofactorBitSize = BITSIZE_BNU(pCofactorData, cofactorLen);
+ IPP_BADARG_RET(cofactorBitSize>elemLen*BITSIZE(BNU_CHUNK_T), ippStsRangeErr)
+ COPY_BNU(ECP_COFACTOR(pEC), pCofactorData, cofactorLen);
+ }
+
+ return ippStsNoErr;
+ }
+}
+
+
+static void cpGFpECSetStd(int aLen, const BNU_CHUNK_T* pA,
+ int bLen, const BNU_CHUNK_T* pB,
+ int xLen, const BNU_CHUNK_T* pX,
+ int yLen, const BNU_CHUNK_T* pY,
+ int rLen, const BNU_CHUNK_T* pR,
+ BNU_CHUNK_T h,
+ IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ IppsGFpElement elmA, elmB;
+ IppsBigNumState R, H;
+
+ /* convert A ans B coeffs into GF elements */
+ cpGFpElementConstruct(&elmA, cpGFpGetPool(1, pGFE), elemLen);
+ cpGFpElementConstruct(&elmB, cpGFpGetPool(1, pGFE), elemLen);
+ ippsGFpSetElement((Ipp32u*)pA, BITS2WORD32_SIZE(BITSIZE_BNU(pA,aLen)), &elmA, pGF);
+ ippsGFpSetElement((Ipp32u*)pB, BITS2WORD32_SIZE(BITSIZE_BNU(pB,bLen)), &elmB, pGF);
+ /* and set EC */
+ ippsGFpECSet(&elmA, &elmB, pEC);
+
+ /* construct R and H */
+ cpConstructBN(&R, rLen, (BNU_CHUNK_T*)pR, NULL);
+ cpConstructBN(&H, 1, &h, NULL);
+ /* convert GX ans GY coeffs into GF elements */
+ ippsGFpSetElement((Ipp32u*)pX, BITS2WORD32_SIZE(BITSIZE_BNU(pX,xLen)), &elmA, pGF);
+ ippsGFpSetElement((Ipp32u*)pY, BITS2WORD32_SIZE(BITSIZE_BNU(pY,yLen)), &elmB, pGF);
+ /* and init EC subgroup */
+ ippsGFpECSetSubgroup(&elmA, &elmB, &R, &H, pEC);
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd128r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp128r1_p, BITS_BNU_CHUNK(128), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(128)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(128), secp128r1_a,
+ BITS_BNU_CHUNK(128), secp128r1_b,
+ BITS_BNU_CHUNK(128), secp128r1_gx,
+ BITS_BNU_CHUNK(128), secp128r1_gy,
+ BITS_BNU_CHUNK(128), secp128r1_r,
+ secp128r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd128r2,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp128r2_p, BITS_BNU_CHUNK(128), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(128)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(128), secp128r2_a,
+ BITS_BNU_CHUNK(128), secp128r2_b,
+ BITS_BNU_CHUNK(128), secp128r2_gx,
+ BITS_BNU_CHUNK(128), secp128r2_gy,
+ BITS_BNU_CHUNK(128), secp128r2_r,
+ secp128r2_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd192r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp192r1_p, BITS_BNU_CHUNK(192), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(192)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(192), secp192r1_a,
+ BITS_BNU_CHUNK(192), secp192r1_b,
+ BITS_BNU_CHUNK(192), secp192r1_gx,
+ BITS_BNU_CHUNK(192), secp192r1_gy,
+ BITS_BNU_CHUNK(192), secp192r1_r,
+ secp192r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd224r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp224r1_p, BITS_BNU_CHUNK(224), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(224)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(224), secp224r1_a,
+ BITS_BNU_CHUNK(224), secp224r1_b,
+ BITS_BNU_CHUNK(224), secp224r1_gx,
+ BITS_BNU_CHUNK(224), secp224r1_gy,
+ BITS_BNU_CHUNK(224), secp224r1_r,
+ secp224r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd256r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp256r1_p, BITS_BNU_CHUNK(256), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(256)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(256), secp256r1_a,
+ BITS_BNU_CHUNK(256), secp256r1_b,
+ BITS_BNU_CHUNK(256), secp256r1_gx,
+ BITS_BNU_CHUNK(256), secp256r1_gy,
+ BITS_BNU_CHUNK(256), secp256r1_r,
+ secp256r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd384r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp384r1_p, BITS_BNU_CHUNK(384), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(384)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(384), secp384r1_a,
+ BITS_BNU_CHUNK(384), secp384r1_b,
+ BITS_BNU_CHUNK(384), secp384r1_gx,
+ BITS_BNU_CHUNK(384), secp384r1_gy,
+ BITS_BNU_CHUNK(384), secp384r1_r,
+ secp384r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStd521r1,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(secp521r1_p, BITS_BNU_CHUNK(521), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(521)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(521), secp521r1_a,
+ BITS_BNU_CHUNK(521), secp521r1_b,
+ BITS_BNU_CHUNK(521), secp521r1_gx,
+ BITS_BNU_CHUNK(521), secp521r1_gy,
+ BITS_BNU_CHUNK(521), secp521r1_r,
+ secp521r1_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStdSM2,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(tpmSM2_p256_p, BITS_BNU_CHUNK(256), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(256)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(256), tpmSM2_p256_a,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_b,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_gx,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_gy,
+ BITS_BNU_CHUNK(256), tpmSM2_p256_r,
+ tpmSM2_p256_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECInitStdBN256,(const IppsGFpState* pGF, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pGF, pEC);
+
+ pGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGF), ippStsContextMatchErr );
+
+ {
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(tpmBN_p256p_p, BITS_BNU_CHUNK(256), GFP_MODULUS(pGFE), BITS_BNU_CHUNK(256)), ippStsBadArgErr);
+
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+
+ ippsGFpECInit(pGF, NULL, NULL, pEC);
+ cpGFpECSetStd(BITS_BNU_CHUNK(BNU_CHUNK_BITS), tpmBN_p256p_a,
+ BITS_BNU_CHUNK(BNU_CHUNK_BITS), tpmBN_p256p_b,
+ BITS_BNU_CHUNK(BNU_CHUNK_BITS), tpmBN_p256p_gx,
+ BITS_BNU_CHUNK(BNU_CHUNK_BITS), tpmBN_p256p_gy,
+ BITS_BNU_CHUNK(256), tpmBN_p256p_r,
+ tpmBN_p256p_h,
+ pEC);
+
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECGet,(IppsGFpState** const ppGF,
+ IppsGFpElement* pA, IppsGFpElement* pB,
+ const IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ {
+ const IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ Ipp32u elementSize = GFP_FELEN(pGFE);
+
+ if(ppGF) {
+ *ppGF = (IppsGFpState*)pGF;
+ }
+
+ if(pA) {
+ IPP_BADARG_RET( !GFPE_TEST_ID(pA), ippStsContextMatchErr );
+ IPP_BADARG_RET( GFPE_ROOM(pA)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ cpGFpElementCopy(GFPE_DATA(pA), ECP_A(pEC), elementSize);
+ }
+ if(pB) {
+ IPP_BADARG_RET( !GFPE_TEST_ID(pB), ippStsContextMatchErr );
+ IPP_BADARG_RET( GFPE_ROOM(pB)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ cpGFpElementCopy(GFPE_DATA(pB), ECP_B(pEC), elementSize);
+ }
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECGetSubgroup,(IppsGFpState** const ppGF,
+ IppsGFpElement* pX, IppsGFpElement* pY,
+ IppsBigNumState* pOrder,
+ IppsBigNumState* pCofactor,
+ const IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR1_RET(pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ {
+ const IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ Ipp32u elementSize = GFP_FELEN(pGFE);
+
+ if(ppGF) {
+ *ppGF = (IppsGFpState*)pGF;
+ }
+
+ if(pX) {
+ IPP_BADARG_RET( !GFPE_TEST_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( GFPE_ROOM(pX)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ cpGFpElementCopy(GFPE_DATA(pX), ECP_G(pEC), elementSize);
+ }
+ if(pY) {
+ IPP_BADARG_RET( !GFPE_TEST_ID(pY), ippStsContextMatchErr );
+ IPP_BADARG_RET( GFPE_ROOM(pY)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+ cpGFpElementCopy(GFPE_DATA(pY), ECP_G(pEC)+elementSize, elementSize);
+ }
+
+ if(pOrder) {
+ BNU_CHUNK_T* pOrderData = MOD_MODULUS(ECP_MONT_R(pEC));
+ int orderBitSize = ECP_ORDBITSIZE(pEC);
+ int orderLen = BITS_BNU_CHUNK(orderBitSize);
+ FIX_BNU(pOrderData, orderLen);
+
+ pOrder = (IppsBigNumState*)( IPP_ALIGNED_PTR(pOrder, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pOrder), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_ROOM(pOrder) < orderLen, ippStsLengthErr);
+
+ ZEXPAND_COPY_BNU(BN_NUMBER(pOrder), BN_ROOM(pOrder), pOrderData, orderLen);
+ BN_SIZE(pOrder) = orderLen;
+ BN_SIGN(pOrder) = ippBigNumPOS;
+ }
+
+ if(pCofactor) {
+ BNU_CHUNK_T* pCofactorData = ECP_COFACTOR(pEC);
+ int cofactorLen = elementSize;
+ FIX_BNU(pCofactorData, cofactorLen);
+
+ pCofactor = (IppsBigNumState*)( IPP_ALIGNED_PTR(pCofactor, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pCofactor), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_ROOM(pCofactor) < cofactorLen, ippStsLengthErr);
+
+ ZEXPAND_COPY_BNU(BN_NUMBER(pCofactor), BN_ROOM(pCofactor), pCofactorData, cofactorLen);
+ BN_SIZE(pCofactor) = cofactorLen;
+ BN_SIGN(pCofactor) = ippBigNumPOS;
+ }
+
+ return ippStsNoErr;
+ }
+}
+
+static IppStatus cpGFpECBindGxyTbl(const BNU_CHUNK_T* pPrime,
+ const cpPrecompAP* preComp,
+ IppsGFpECState* pEC)
+{
+ IPP_BAD_PTR1_RET(pEC);
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ {
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ Ipp32u elemLen = GFP_FELEN(pGFE);
+
+ /* test if GF is prime GF */
+ IPP_BADARG_RET(!GFP_IS_BASIC(pGFE), ippStsBadArgErr);
+ /* test underlying prime value*/
+ IPP_BADARG_RET(cpCmp_BNU(pPrime, elemLen, GFP_MODULUS(pGFE), elemLen), ippStsBadArgErr);
+
+ {
+ BNU_CHUNK_T* pbp_ec = ECP_G(pEC);
+ int cmpFlag;
+ BNU_CHUNK_T* pbp_tbl = cpEcGFpGetPool(1, pEC);
+
+ selectAP select_affine_point = preComp->select_affine_point;
+ const BNU_CHUNK_T* pTbl = preComp->pTbl;
+ select_affine_point(pbp_tbl, pTbl, 1);
+
+ /* check if EC's and G-table's Base Point is the same */
+ cmpFlag = cpCmp_BNU(pbp_ec, elemLen*2, pbp_tbl, elemLen*2);
+
+ cpEcGFpReleasePool(1, pEC);
+
+ return cmpFlag? ippStsBadArgErr : ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStd192r1,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(secp192r1_p, gfpec_precom_nistP192r1_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP192r1_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStd224r1,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(secp224r1_p, gfpec_precom_nistP224r1_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP224r1_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStd256r1,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(secp256r1_p, gfpec_precom_nistP256r1_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP256r1_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStd384r1,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(secp384r1_p, gfpec_precom_nistP384r1_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP384r1_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStd521r1,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(secp521r1_p, gfpec_precom_nistP521r1_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_nistP521r1_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECBindGxyTblStdSM2,(IppsGFpECState* pEC))
+{
+ IppStatus sts = cpGFpECBindGxyTbl(tpmSM2_p256_p, gfpec_precom_sm2_fun(), pEC);
+
+ /* setup pre-computed g-table and point access function */
+ if(ippStsNoErr==sts)
+ ECP_PREMULBP(pEC) = gfpec_precom_sm2_fun();
+
+ return sts;
+}
+
+IPPFUN(IppStatus, ippsGFpECScratchBufferSize,(int nScalars, const IppsGFpECState* pEC, int* pBufferSize))
+{
+ IPP_BAD_PTR2_RET(pEC, pBufferSize);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( (0>=nScalars)||(nScalars>IPP_MAX_EXPONENT_NUM), ippStsBadArgErr);
+
+ {
+ /* select constant size of window */
+ const int w = 5;
+ /* number of table entries */
+ const int nPrecomputed = 1<<(w-1); /* because of signed digit representation of scalar is uses */
+
+ int pointDataSize = ECP_POINTLEN(pEC)*sizeof(BNU_CHUNK_T);
+
+ *pBufferSize = nScalars * pointDataSize*nPrecomputed + CACHE_LINE_SIZE;
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECVerify,(IppECResult* pResult, IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+{
+ IPP_BAD_PTR3_RET(pEC, pResult, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ *pResult = ippECValid;
+
+ {
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGFE)->add;
+
+ /*
+ // check discriminant ( 4*A^3 + 27*B^2 != 0 mod P)
+ */
+ if(ippECValid == *pResult) {
+ BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pU = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(NULL!=pT && NULL!=pU);
+
+ if(ECP_SPECIFIC(pEC)==ECP_EPID2)
+ cpGFpElementPadd(pT, elemLen, 0); /* T = 4*A^3 = 0 */
+ else {
+ addF(pT, ECP_A(pEC), ECP_A(pEC), pGFE); /* T = 4*A^3 */
+ sqrF(pT, pT, pGFE);
+ mulF(pT, ECP_A(pEC), pT, pGFE);
+ }
+
+ addF(pU, ECP_B(pEC), ECP_B(pEC), pGFE); /* U = 9*B^2 */
+ addF(pU, pU, ECP_B(pEC), pGFE);
+ sqrF(pU, pU, pGFE);
+
+ addF(pT, pU, pT, pGFE); /* T += 3*U */
+ addF(pT, pU, pT, pGFE);
+ addF(pT, pU, pT, pGFE);
+
+ *pResult = GFP_IS_ZERO(pT, elemLen)? ippECIsZeroDiscriminant: ippECValid;
+
+ cpGFpReleasePool(2, pGFE);
+ }
+
+ /*
+ // check base point and it order
+ */
+ if(ippECValid == *pResult) {
+ IppsGFpECPoint G;
+ cpEcGFpInitPoint(&G, ECP_G(pEC), ECP_AFFINE_POINT|ECP_FINITE_POINT, pEC);
+
+ /* check G != infinity */
+ *pResult = gfec_IsPointAtInfinity(&G)? ippECPointIsAtInfinite : ippECValid;
+
+ /* check G lies on EC */
+ if(ippECValid == *pResult)
+ *pResult = gfec_IsPointOnCurve(&G, pEC)? ippECValid : ippECPointIsNotValid;
+
+ /* check Gorder*G = infinity */
+ if(ippECValid == *pResult) {
+ IppsGFpECPoint T;
+ cpEcGFpInitPoint(&T, cpEcGFpGetPool(1, pEC),0, pEC);
+
+ //gfec_MulPoint(&T, &G, MNT_MODULUS(ECP_MONT_R(pEC)), BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)), pEC, pScratchBuffer);
+ gfec_MulBasePoint(&T, MOD_MODULUS(ECP_MONT_R(pEC)), BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)), pEC, pScratchBuffer);
+
+ *pResult = gfec_IsPointAtInfinity(&T)? ippECValid : ippECInvalidOrder;
+
+ cpEcGFpReleasePool(1, pEC);
+ }
+ }
+
+ /*
+ // check order==P
+ */
+ if(ippECValid == *pResult) {
+ BNU_CHUNK_T* pPrime = GFP_MODULUS(pGFE);
+ int primeLen = GFP_FELEN(pGFE);
+
+ gsModEngine* pR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pR);
+ int orderLen = MOD_LEN(pR);
+
+ *pResult = (primeLen==orderLen && GFP_EQ(pPrime, pOrder, primeLen))? ippECIsWeakSSSA : ippECValid;
+ }
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecdh.c b/ext/ipp/sources/ippcp/src/pcpgfpecdh.c
new file mode 100644
index 0000000..797e8f6
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecdh.c
@@ -0,0 +1,229 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over GF(p^m) Shared Secret (Diffie-Hellman wo/w cofactor)
+//
+// Contents:
+// ippsGFpECSharedSecretDH()
+// ippsGFpECSharedSecretDHC()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpecstuff.h"
+
+
+/*F*
+// Name: ippsGFpECSharedSecretDHC
+//
+// Purpose: Compute Shared Secret (Diffie-Hellman)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pPrivateA
+// NULL == pPublicB
+// NULL == pShare
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pPrivateA->idCtx
+// illegal pPublicB->idCtx
+// illegal pShare->idCtx
+//
+// ippStsRangeErr not enough room for share key
+//
+// ippStsShareKeyErr (infinity) => z
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivateA pointer to own private key
+// pPublicB pointer to alien public key
+// pShare pointer to the shared secret value
+// pEC pointer to the EC context
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECSharedSecretDH,(const IppsBigNumState* pPrivateA, const IppsGFpECPoint* pPublicB,
+ IppsBigNumState* pShare,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ /* test private (own) key */
+ IPP_BAD_PTR1_RET(pPrivateA);
+ pPrivateA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivateA, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivateA), ippStsContextMatchErr);
+
+ /* test public (other party) key */
+ IPP_BAD_PTR1_RET(pPublicB);
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublicB), ippStsContextMatchErr );
+
+ /* test share secret value */
+ IPP_BAD_PTR1_RET(pShare);
+ pShare = (IppsBigNumState*)( IPP_ALIGNED_PTR(pShare, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pShare), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pShare)<GFP_FELEN(pGFE)), ippStsRangeErr);
+
+ {
+ int elmLen = GFP_FELEN(pGFE);
+
+ IppsGFpElement elm;
+ IppsGFpECPoint T;
+ int finite_point;
+
+ /* T = [privateA]pPublicB */
+ cpEcGFpInitPoint(&T, cpEcGFpGetPool(1, pEC),0, pEC);
+ gfec_MulPoint(&T, pPublicB, BN_NUMBER(pPrivateA), BN_SIZE(pPrivateA), pEC, pScratchBuffer);
+
+ /* share = T.x */
+ cpGFpElementConstruct(&elm, cpGFpGetPool(1, pGFE), elmLen);
+ finite_point = gfec_GetPoint(GFPE_DATA(&elm), NULL, &T, pEC);
+
+ if(finite_point) {
+ BNU_CHUNK_T* pShareData = BN_NUMBER(pShare);
+ int nsShare = BN_ROOM(pShare);
+ /* share = decode(T.x) */
+ GFP_METHOD(pGFE)->decode(pShareData, GFPE_DATA(&elm), pGFE);
+ cpGFpElementPadd(pShareData+elmLen, nsShare-elmLen, 0);
+
+ BN_SIGN(pShare) = ippBigNumPOS;
+ FIX_BNU(pShareData, nsShare);
+ BN_SIZE(pShare) = nsShare;
+ }
+
+ cpGFpReleasePool(1, pGFE);
+ cpEcGFpReleasePool(1, pEC);
+
+ return finite_point? ippStsNoErr : ippStsShareKeyErr;
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECSharedSecretDHC
+//
+// Purpose: Compute Shared Secret (Diffie-Hellman with cofactor)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pPrivateA
+// NULL == pPublicB
+// NULL == pShare
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pPrivateA->idCtx
+// illegal pPublicB->idCtx
+// illegal pShare->idCtx
+//
+// ippStsRangeErr not enough room for share key
+//
+// ippStsShareKeyErr (infinity) => z
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivateA pointer to own private key
+// pPublicB pointer to alien public key
+// pShare pointer to the shared secret value
+// pEC pointer to the EC context
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECSharedSecretDHC,(const IppsBigNumState* pPrivateA, const IppsGFpECPoint* pPublicB,
+ IppsBigNumState* pShare,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ /* test private (own) key */
+ IPP_BAD_PTR1_RET(pPrivateA);
+ pPrivateA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivateA, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivateA), ippStsContextMatchErr);
+
+ /* test public (other party) key */
+ IPP_BAD_PTR1_RET(pPublicB);
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublicB), ippStsContextMatchErr );
+
+ /* test share key */
+ IPP_BAD_PTR1_RET(pShare);
+ pShare = (IppsBigNumState*)( IPP_ALIGNED_PTR(pShare, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pShare), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pShare)<GFP_FELEN(pGFE)), ippStsRangeErr);
+
+ {
+ int elmLen = GFP_FELEN(pGFE);
+
+ IppsGFpElement elm;
+ IppsGFpECPoint T;
+ int finite_point;
+
+ gsModEngine* montR = ECP_MONT_R(pEC);
+ int nsR = MOD_LEN(montR);
+
+ /* compute factored secret F = coFactor*privateA */
+ BNU_CHUNK_T* F = cpGFpGetPool(1, pGFE);
+ cpMontEnc_BNU_EX(F, BN_NUMBER(pPrivateA), BN_SIZE(pPrivateA), montR);
+ cpMontMul_BNU_EX(F, F, nsR, ECP_COFACTOR(pEC), 1, montR);
+
+ /* T = [F]pPublicB */
+ cpEcGFpInitPoint(&T, cpEcGFpGetPool(1, pEC),0, pEC);
+ FIX_BNU(F, nsR);
+ gfec_MulPoint(&T, pPublicB, F, nsR, pEC, pScratchBuffer);
+
+ /* share = T.x */
+ cpGFpElementConstruct(&elm, F, elmLen);
+ finite_point = gfec_GetPoint(GFPE_DATA(&elm), NULL, &T, pEC);
+ if(finite_point) {
+ BNU_CHUNK_T* pShareData = BN_NUMBER(pShare);
+ int nsShare = BN_ROOM(pShare);
+ /* share = decode(T.x) */
+ GFP_METHOD(pGFE)->decode(pShareData, GFPE_DATA(&elm), pGFE);
+ cpGFpElementPadd(pShareData+elmLen, nsShare-elmLen, 0);
+
+ BN_SIGN(pShare) = ippBigNumPOS;
+ FIX_BNU(pShareData, nsShare);
+ BN_SIZE(pShare) = nsShare;
+ }
+
+ cpGFpReleasePool(1, pGFE);
+ cpEcGFpReleasePool(1, pEC);
+
+ return finite_point? ippStsNoErr : ippStsShareKeyErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpeckeys.c b/ext/ipp/sources/ippcp/src/pcpgfpeckeys.c
new file mode 100644
index 0000000..c53b47a
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpeckeys.c
@@ -0,0 +1,257 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over GF(p^m) Public Key Generation and Test KeyPair
+//
+// Contents:
+// ippsGFpECPrivateKey()
+// ippsGFpECPublicKey()
+// ippsGFpECTstKeyPair()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpecstuff.h"
+
+
+/*F*
+// Name: ippsGFpECPrivateKey
+//
+// Purpose: Generate random private key
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pPrivate
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pPrivate->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivate pointer to the resultant private key
+// pEC pointer to the EC context
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECPrivateKey, (IppsBigNumState* pPrivate, IppsGFpECState* pEC,
+ IppBitSupplier rndFunc, void* pRndParam))
+{
+ IPP_BAD_PTR2_RET(pEC, rndFunc);
+
+ /* use aligned EC context */
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test private key */
+ IPP_BAD_PTR1_RET(pPrivate);
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pPrivate)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsSizeErr);
+
+ {
+ /* generate random private key X: 0 < X < R */
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(ECP_MONT_R(pEC));
+ int orderBitLen = ECP_ORDBITSIZE(pEC);
+ int orderLen = BITS_BNU_CHUNK(orderBitLen);
+
+ BNU_CHUNK_T* pX = BN_NUMBER(pPrivate);
+ int nsX = BITS_BNU_CHUNK(orderBitLen);
+ BNU_CHUNK_T xMask = MASK_BNU_CHUNK(orderBitLen);
+
+ IppStatus sts;
+ do {
+ sts = rndFunc((Ipp32u*)pX, orderBitLen, pRndParam);
+ if(ippStsNoErr!=sts)
+ break;
+ pX[nsX-1] &= xMask;
+ } while( (1 == cpEqu_BNU_CHUNK(pX, nsX, 0)) ||
+ (0 <= cpCmp_BNU(pX, nsX, pOrder, orderLen)) );
+
+ /* set up private */
+ if(ippStsNoErr==sts) {
+ BN_SIGN(pPrivate) = ippBigNumPOS;
+ FIX_BNU(pX, nsX);
+ BN_SIZE(pPrivate) = nsX;
+ }
+
+ return sts;
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECPublicKey
+//
+// Purpose: Compute Public Key
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pPrivate
+// NULL == pPublic
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pPrivate->idCtx
+// illegal pPublic->idCtx
+//
+// ippStsIvalidPrivateKey !(0 < pPrivate < order)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivate pointer to the private key
+// pPublic pointer to the resultant public key
+// pEC pointer to the EC context
+// pScratchBuffer pointer to buffer (1 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECPublicKey, (const IppsBigNumState* pPrivate, IppsGFpECPoint* pPublic,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+{
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test private keys */
+ IPP_BAD_PTR1_RET(pPrivate);
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+
+ /* test public key */
+ IPP_BAD_PTR1_RET(pPublic);
+ IPP_BADARG_RET(!ECP_POINT_TEST_ID(pPublic), ippStsContextMatchErr);
+ IPP_BADARG_RET(ECP_POINT_FELEN(pPublic)<GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsRangeErr);
+
+ {
+ BNU_CHUNK_T* pS= BN_NUMBER(pPrivate);
+ int nsS= BN_SIZE(pPrivate);
+
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(ECP_MONT_R(pEC));
+ int orderLen = BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC));
+
+ IPP_BADARG_RET(cpEqu_BNU_CHUNK(pS, nsS, 0)
+ || 0<=cpCmp_BNU(pS, nsS, pOrder, orderLen), ippStsIvalidPrivateKey);
+
+ /* calculates public key */
+ gfec_MulBasePoint(pPublic, pS, nsS, pEC, pScratchBuffer);
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECTstKeyPair
+//
+// Purpose: Test Key Pair
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pPrivate
+// NULL == pPublic
+// NULL == pResult
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pPrivate->idCtx
+// illegal pPublic->idCtx
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pPrivate pointer to the private key
+// pPublic pointer to the public key
+// pResult pointer to the result:
+// ippECValid/ippECInvalidPrivateKey/ippECPointIsAtInfinite/ippECInvalidPublicKey
+// pEC pointer to the EC context
+// pScratchBuffer pointer to buffer (1 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECTstKeyPair, (const IppsBigNumState* pPrivate, const IppsGFpECPoint* pPublic, IppECResult* pResult,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer))
+{
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ /* test result */
+ IPP_BAD_PTR1_RET(pResult);
+ *pResult = ippECValid;
+
+ /* private key validation request */
+ if( pPrivate ) {
+ pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr);
+
+ {
+ BNU_CHUNK_T* pS = BN_NUMBER(pPrivate);
+ int nsS = BN_SIZE(pPrivate);
+
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(ECP_MONT_R(pEC));
+ int orderLen = BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC));
+
+ /* check private key */
+ if(cpEqu_BNU_CHUNK(pS, nsS, 0) || 0<=cpCmp_BNU(pS, nsS, pOrder, orderLen)) {
+ *pResult = ippECInvalidPrivateKey;
+ return ippStsNoErr;
+ }
+ }
+ }
+
+ /* public key validation request */
+ if( pPublic ) {
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublic), ippStsContextMatchErr );
+ IPP_BADARG_RET(ECP_POINT_FELEN(pPublic)<GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsRangeErr);
+
+ {
+ IppsGFpECPoint T;
+ cpEcGFpInitPoint(&T, cpEcGFpGetPool(1, pEC),0, pEC);
+
+ do {
+ /* public != point_at_Infinity */
+ if( gfec_IsPointAtInfinity(pPublic) ) {
+ *pResult = ippECPointIsAtInfinite;
+ break;
+ }
+ /* order*public == point_at_Infinity */
+ gfec_MulPoint(&T, pPublic, MOD_MODULUS(ECP_MONT_R(pEC)), BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)), pEC, pScratchBuffer);
+ if( !gfec_IsPointAtInfinity(&T) ) {
+ *pResult = ippECInvalidPublicKey;
+ break;
+ }
+ /* addition test: private*BasePoint == public */
+ if(pPrivate) {
+ gfec_MulBasePoint(&T, BN_NUMBER(pPrivate), BN_SIZE(pPrivate), pEC, pScratchBuffer);
+ if(!gfec_ComparePoint(&T, pPublic, pEC))
+ *pResult = ippECInvalidKeyPair;
+ }
+ } while(0);
+
+ cpEcGFpReleasePool(1, pEC);
+ }
+ }
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecpoint.c b/ext/ipp/sources/ippcp/src/pcpgfpecpoint.c
new file mode 100644
index 0000000..574d76f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecpoint.c
@@ -0,0 +1,643 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// EC over GF(p) Operations
+//
+// Context:
+// ippsGFpECPointGetSize()
+// ippsGFpECPointInit()
+//
+// ippsGFpECSetPointAtInfinity()
+// ippsGFpECSetPoint()
+// ippsGFpECSetPointRegular()
+// ippsGFpECMakePoint()
+// ippsGFpECSetPointRandom()
+// ippsGFpECSetPointHash()
+// ippsGFpECSetPointHash_rmf()
+// ippsGFpECGetPoint()
+// ippsGFpECGetPointRegular()
+// ippsGFpECCpyPoint()
+//
+// ippsGFpECCmpPoint()
+// ippsGFpECTstPoint()
+// ippsGFpECNegPoint()
+// ippsGFpECAddPoint()
+// ippsGFpECMulPoint()
+//
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpecstuff.h"
+#include "pcphash.h"
+#include "pcphash_rmf.h"
+
+
+IPPFUN(IppStatus, ippsGFpECPointGetSize,(const IppsGFpECState* pEC, int* pSizeInBytes))
+{
+ IPP_BAD_PTR2_RET(pEC, pSizeInBytes);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ {
+ int elemLen = GFP_FELEN(GFP_PMA(ECP_GFP(pEC)));
+ *pSizeInBytes = sizeof(IppsGFpECPoint)
+ +elemLen*sizeof(BNU_CHUNK_T) /* X */
+ +elemLen*sizeof(BNU_CHUNK_T) /* Y */
+ +elemLen*sizeof(BNU_CHUNK_T);/* Z */
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECPointInit,(const IppsGFpElement* pX, const IppsGFpElement* pY,
+ IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ {
+ Ipp8u* ptr = (Ipp8u*)pPoint;
+ int elemLen = GFP_FELEN(GFP_PMA(ECP_GFP(pEC)));
+
+ ECP_POINT_ID(pPoint) = idCtxGFPPoint;
+ ECP_POINT_FLAGS(pPoint) = 0;
+ ECP_POINT_FELEN(pPoint) = elemLen;
+ ptr += sizeof(IppsGFpECPoint);
+ ECP_POINT_DATA(pPoint) = (BNU_CHUNK_T*)(ptr);
+
+ if(pX && pY)
+ return ippsGFpECSetPoint(pX, pY, pPoint, pEC);
+ else {
+ gfec_SetPointAtInfinity(pPoint);
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECSetPointAtInfinity,(IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ gfec_SetPointAtInfinity(pPoint);
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECSetPoint,(const IppsGFpElement* pX, const IppsGFpElement* pY,
+ IppsGFpECPoint* pPoint,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BAD_PTR2_RET(pX, pY);
+ IPP_BADARG_RET( !GFPE_TEST_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pY), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( GFPE_ROOM(pX)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( GFPE_ROOM(pY)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ if(gfec_SetPoint(ECP_POINT_DATA(pPoint), GFPE_DATA(pX), GFPE_DATA(pY), pEC))
+ ECP_POINT_FLAGS(pPoint) = ECP_AFFINE_POINT | ECP_FINITE_POINT;
+ else
+ ECP_POINT_FLAGS(pPoint) = 0;
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECSetPointRegular,(const IppsBigNumState* pX, const IppsBigNumState* pY,
+ IppsGFpECPoint* pPoint,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BAD_PTR2_RET(pX, pY);
+ pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, BN_ALIGNMENT) );
+ pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, BN_ALIGNMENT) );
+ IPP_BADARG_RET( !BN_VALID_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( !BN_VALID_ID(pY), ippStsContextMatchErr );
+ IPP_BADARG_RET( !BN_POSITIVE(pX), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( !BN_POSITIVE(pY), ippStsOutOfRangeErr);
+
+ {
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr )
+
+ IPP_BADARG_RET( BN_SIZE(pX) > elemLen, ippStsOutOfRangeErr);
+ IPP_BADARG_RET( BN_SIZE(pY) > elemLen, ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=elemLen, ippStsOutOfRangeErr);
+
+ {
+ BNU_CHUNK_T* pointX = ECP_POINT_X(pPoint);
+ BNU_CHUNK_T* pointY = ECP_POINT_Y(pPoint);
+ BNU_CHUNK_T* pointZ = ECP_POINT_Z(pPoint);
+
+ cpGFpElementCopyPadd(pointX, elemLen, BN_NUMBER(pX), BN_SIZE(pX));
+ cpGFpElementCopyPadd(pointY, elemLen, BN_NUMBER(pY), BN_SIZE(pY));
+ cpGFpElementCopy(pointZ, MOD_MNT_R(pGFE), elemLen);
+
+ if( cpGFpSet(pointX, pointX, elemLen, pGFE) && cpGFpSet(pointY, pointY, elemLen, pGFE) )
+ ECP_POINT_FLAGS(pPoint) = ECP_AFFINE_POINT | ECP_FINITE_POINT;
+ else
+ gfec_SetPointAtInfinity(pPoint);
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECGetPoint,(const IppsGFpECPoint* pPoint,
+ IppsGFpElement* pX, IppsGFpElement* pY,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ ///IPP_BADARG_RET( !IS_ECP_FINITE_POINT(pPoint), ippStsPointAtInfinity);
+
+ IPP_BADARG_RET( pX && !GFPE_TEST_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( pY && !GFPE_TEST_ID(pY), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( pX && GFPE_ROOM(pX)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( pY && GFPE_ROOM(pY)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ /* returns (X,Y) == (0,0) if Point is at infinity */
+ gfec_GetPoint((pX)? GFPE_DATA(pX):NULL, (pY)? GFPE_DATA(pY):NULL, pPoint, pEC);
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECGetPointRegular,(const IppsGFpECPoint* pPoint,
+ IppsBigNumState* pX, IppsBigNumState* pY,
+ IppsGFpECState* pEC))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ IPP_BAD_PTR2_RET(pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ if(pX) {
+ pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET(BN_ROOM(pX)*BNU_CHUNK_BITS<GFP_FEBITLEN(pGFE), ippStsOutOfRangeErr);
+ }
+ if(pY) {
+ pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr );
+ IPP_BADARG_RET(BN_ROOM(pY)*BNU_CHUNK_BITS<GFP_FEBITLEN(pGFE), ippStsOutOfRangeErr);
+ }
+
+ {
+ int elmLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* x = cpGFpGetPool(2, pGFE);
+ BNU_CHUNK_T* y = x + elmLen;
+
+ /* returns (X,Y) == (0,0) if Point is at infinity */
+ gfec_GetPoint((pX)? x:NULL, (pY)? y:NULL, pPoint, pEC);
+
+ /* convert into refular domain */
+ if(pX) {
+ GFP_METHOD(pGFE)->decode(x, x, pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)x, pX);
+ }
+ if(pY) {
+ GFP_METHOD(pGFE)->decode(y, y, pGFE);
+ ippsSet_BN(ippBigNumPOS, GFP_FELEN32(pGFE), (Ipp32u*)y, pY);
+ }
+
+ cpGFpReleasePool(2, pGFE);
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECMakePoint,(const IppsGFpElement* pX, IppsGFpECPoint* pPoint, IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR3_RET(pX, pPoint, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !GFP_IS_BASIC(GFP_PMA(ECP_GFP(pEC))), ippStsBadArgErr );
+ IPP_BADARG_RET( !GFPE_TEST_ID(pX), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( GFPE_ROOM(pX)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ return gfec_MakePoint(pPoint, GFPE_DATA(pX), pEC)? ippStsNoErr : ippStsQuadraticNonResidueErr;
+}
+
+
+IPPFUN(IppStatus, ippsGFpECSetPointRandom,(IppsGFpECPoint* pPoint, IppsGFpECState* pEC,
+ IppBitSupplier rndFunc, void* pRndParam,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ IPP_BAD_PTR3_RET(pPoint, pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ IPP_BAD_PTR2_RET(rndFunc, pRndParam);
+
+ {
+ int internal_err;
+
+ if( GFP_IS_BASIC(pGFE) ) {
+ BNU_CHUNK_T* pElm = cpGFpGetPool(1, pGFE);
+
+ do { /* get random X */
+ internal_err = NULL==cpGFpRand(pElm, pGFE, rndFunc, pRndParam);
+ } while( !internal_err && !gfec_MakePoint(pPoint, pElm, pEC) );
+
+ cpGFpReleasePool(1, pGFE);
+
+ /* R = [cofactor]R */
+ if(!internal_err)
+ gfec_MulPoint(pPoint, pPoint, ECP_COFACTOR(pEC), GFP_FELEN(pGFE), pEC, pScratchBuffer);
+ }
+
+ else {
+ /* number of bits and dwords being generated */
+ int generatedBits = ECP_ORDBITSIZE(pEC) + GFP_RAND_ADD_BITS;
+ int generatedLen = BITS_BNU_CHUNK(generatedBits);
+
+ /* allocate random exponent */
+ int poolElements = (generatedLen + GFP_PELEN(pGFE) -1) / GFP_PELEN(pGFE);
+ BNU_CHUNK_T* pExp = cpGFpGetPool(poolElements, pGFE);
+ int nsE;
+
+ /* setup copy of the base point */
+ IppsGFpECPoint G;
+ cpEcGFpInitPoint(&G, ECP_G(pEC),ECP_AFFINE_POINT|ECP_FINITE_POINT, pEC);
+
+ /* get random bits */
+ internal_err = ippStsNoErr != rndFunc((Ipp32u*)pExp, generatedBits, pRndParam);
+
+ if(!internal_err) {
+ /* reduce with respect to order value */
+ nsE = cpMod_BNU(pExp, generatedLen, MOD_MODULUS(ECP_MONT_R(pEC)), BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)));
+ /* compute random point */
+ gfec_MulPoint(pPoint, &G, pExp, nsE, pEC, pScratchBuffer);
+ }
+
+ cpGFpReleasePool(poolElements, pGFE);
+ }
+
+ return internal_err? ippStsErr : ippStsNoErr;
+ }
+}
+
+
+
+IPPFUN(IppStatus, ippsGFpECCpyPoint,(const IppsGFpECPoint* pA,
+ IppsGFpECPoint* pR,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR3_RET(pA, pR, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pA), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pR), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pA)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pR)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ gfec_CopyPoint(pR, pA, GFP_FELEN(GFP_PMA(ECP_GFP(pEC))));
+ return ippStsNoErr;
+}
+
+
+IPPFUN(IppStatus, ippsGFpECCmpPoint,(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ,
+ IppECResult* pResult,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR4_RET(pP, pQ, pResult, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pQ), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pQ)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ *pResult = gfec_ComparePoint(pP, pQ, pEC)? ippECPointIsEqual : ippECPointIsNotEqual;
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECTstPoint,(const IppsGFpECPoint* pP,
+ IppECResult* pResult,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR3_RET(pP, pResult, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ if( gfec_IsPointAtInfinity(pP) )
+ *pResult = ippECPointIsAtInfinite;
+ else if( !gfec_IsPointOnCurve(pP, pEC) )
+ *pResult = ippECPointIsNotValid;
+ else
+ *pResult = ippECValid;
+
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECTstPointInSubgroup,(const IppsGFpECPoint* pP,
+ IppECResult* pResult,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IPP_BAD_PTR4_RET(pP, pResult, pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ {
+ IppECResult tstResult;
+ ippsGFpECTstPoint(pP, &tstResult, pEC);
+
+ if(ippECValid==tstResult) {
+ IppsGFpECPoint T;
+ cpEcGFpInitPoint(&T, cpEcGFpGetPool(1, pEC),0, pEC);
+
+ gfec_MulPoint(&T, pP, MOD_MODULUS(ECP_MONT_R(pEC)), BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)), pEC, pScratchBuffer);
+ tstResult = gfec_IsPointAtInfinity(&T)? ippECValid : ippECPointOutOfGroup;
+
+ cpEcGFpReleasePool(1, pEC);
+ }
+ *pResult = tstResult;
+
+ return ippStsNoErr;
+ }
+}
+
+
+IPPFUN(IppStatus, ippsGFpECNegPoint,(const IppsGFpECPoint* pP,
+ IppsGFpECPoint* pR,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR3_RET(pP, pR, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pR), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pR)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ gfec_NegPoint(pR, pP, pEC);
+ return ippStsNoErr;
+}
+
+
+IPPFUN(IppStatus, ippsGFpECAddPoint,(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECPoint* pR,
+ IppsGFpECState* pEC))
+{
+ IPP_BAD_PTR4_RET(pP, pQ, pR, pEC);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pQ), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pR), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pQ)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pR)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ if(pP==pQ)
+ gfec_DblPoint(pR, pP, pEC);
+ else
+ gfec_AddPoint(pR, pP, pQ, pEC);
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECMulPoint,(const IppsGFpECPoint* pP,
+ const IppsBigNumState* pN,
+ IppsGFpECPoint* pR,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IPP_BAD_PTR4_RET(pP, pR, pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pP), ippStsContextMatchErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pR), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pP)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+ IPP_BADARG_RET( ECP_POINT_FELEN(pR)!=GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsOutOfRangeErr);
+
+ IPP_BAD_PTR1_RET(pN);
+ pN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pN), ippStsContextMatchErr );
+ IPP_BADARG_RET( BN_NEGATIVE(pN), ippStsBadArgErr );
+ IPP_BADARG_RET(BN_SIZE(pN)>2*GFP_FELEN(GFP_PMA(ECP_GFP(pEC))), ippStsSizeErr);
+
+ gfec_MulPoint(pR, pP, BN_NUMBER(pN), BN_SIZE(pN), pEC, pScratchBuffer);
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsGFpECSetPointHash,(Ipp32u hdr, const Ipp8u* pMsg, int msgLen, IppsGFpECPoint* pPoint,
+ IppsGFpECState* pEC, IppHashAlgId hashID,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* get algorithm id */
+ hashID = cpValidHashAlg(hashID);
+ IPP_BADARG_RET(ippHashAlg_Unknown==hashID, ippStsNotSupportedModeErr);
+
+ /* test message length */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ /* test message pointer */
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ IPP_BAD_PTR3_RET(pPoint, pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ {
+ int elemLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* pModulus = GFP_MODULUS(pGFE);
+
+ Ipp8u md[IPP_SHA512_DIGEST_BITSIZE/BYTESIZE];
+ int hashLen = cpHashAlgAttr[hashID].hashSize;
+ BNU_CHUNK_T hashVal[BITS_BNU_CHUNK(IPP_SHA512_DIGEST_BITSIZE)+1];
+ int hashValLen;
+
+ IppsHashState hashCtx;
+ ippsHashInit(&hashCtx, hashID);
+
+ {
+ BNU_CHUNK_T* pPoolElm = cpGFpGetPool(1, pGFE);
+
+ /* convert hdr => hdrStr */
+ BNU_CHUNK_T locHdr = (BNU_CHUNK_T)hdr;
+ Ipp8u hdrOctStr[sizeof(hdr/*locHdr*/)];
+ cpToOctStr_BNU(hdrOctStr, sizeof(hdrOctStr), &locHdr, 1);
+
+ /* compute md = hash(hrd||msg) */
+ ippsHashUpdate(hdrOctStr, sizeof(hdrOctStr), &hashCtx);
+ ippsHashUpdate(pMsg, msgLen, &hashCtx);
+ ippsHashFinal(md, &hashCtx);
+
+ /* convert hash into the integer */
+ hashValLen = cpFromOctStr_BNU(hashVal, md, hashLen);
+ hashValLen = cpMod_BNU(hashVal, hashValLen, pModulus, elemLen);
+ cpGFpSet(pPoolElm, hashVal, hashValLen, pGFE);
+
+ if( gfec_MakePoint(pPoint, pPoolElm, pEC)) {
+ /* set y-coordinate of the point (positive or negative) */
+ BNU_CHUNK_T* pY = ECP_POINT_Y(pPoint);
+ if(pY[0] & 1)
+ cpGFpNeg(pY, pY, pGFE);
+
+ /* update point if cofactor>1 */
+ gfec_MulPoint(pPoint, pPoint, ECP_COFACTOR(pEC), GFP_FELEN(pGFE), pEC, pScratchBuffer);
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsNoErr;
+ }
+ }
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsQuadraticNonResidueErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsGFpECSetPointHash_rmf,(Ipp32u hdr, const Ipp8u* pMsg, int msgLen, IppsGFpECPoint* pPoint,
+ IppsGFpECState* pEC, const IppsHashMethod* pMethod,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* test method pointer */
+ IPP_BAD_PTR1_RET(pMethod);
+
+ /* test message length */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ /* test message pointer */
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ IPP_BAD_PTR3_RET(pPoint, pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET( !ECP_TEST_ID(pEC), ippStsContextMatchErr );
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+
+ IPP_BADARG_RET( !GFP_IS_BASIC(pGFE), ippStsBadArgErr );
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPoint), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( ECP_POINT_FELEN(pPoint)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ {
+ int elemLen = GFP_FELEN(pGFE);
+ BNU_CHUNK_T* pModulus = GFP_MODULUS(pGFE);
+
+ Ipp8u md[IPP_SHA512_DIGEST_BITSIZE/BYTESIZE];
+ int hashLen = pMethod->hashLen;
+ BNU_CHUNK_T hashVal[BITS_BNU_CHUNK(IPP_SHA512_DIGEST_BITSIZE)+1];
+ int hashValLen;
+
+ IppsHashState_rmf hashCtx;
+ ippsHashInit_rmf(&hashCtx, pMethod);
+
+ {
+ BNU_CHUNK_T* pPoolElm = cpGFpGetPool(1, pGFE);
+
+ /* convert hdr => hdrStr */
+ BNU_CHUNK_T locHdr = (BNU_CHUNK_T)hdr;
+ Ipp8u hdrOctStr[sizeof(hdr/*locHdr*/)];
+ cpToOctStr_BNU(hdrOctStr, sizeof(hdrOctStr), &locHdr, 1);
+
+ /* compute md = hash(hrd||msg) */
+ ippsHashUpdate_rmf(hdrOctStr, sizeof(hdrOctStr), &hashCtx);
+ ippsHashUpdate_rmf(pMsg, msgLen, &hashCtx);
+ ippsHashFinal_rmf(md, &hashCtx);
+
+ /* convert hash into the integer */
+ hashValLen = cpFromOctStr_BNU(hashVal, md, hashLen);
+ hashValLen = cpMod_BNU(hashVal, hashValLen, pModulus, elemLen);
+ cpGFpSet(pPoolElm, hashVal, hashValLen, pGFE);
+
+ if( gfec_MakePoint(pPoint, pPoolElm, pEC)) {
+ /* set y-coordinate of the point (positive or negative) */
+ BNU_CHUNK_T* pY = ECP_POINT_Y(pPoint);
+ if(pY[0] & 1)
+ cpGFpNeg(pY, pY, pGFE);
+
+ /* update point if cofactor>1 */
+ gfec_MulPoint(pPoint, pPoint, ECP_COFACTOR(pEC), GFP_FELEN(pGFE), pEC, pScratchBuffer);
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsNoErr;
+ }
+ }
+
+ cpGFpReleasePool(1, pGFE);
+ return ippStsQuadraticNonResidueErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecpointstuff.c b/ext/ipp/sources/ippcp/src/pcpgfpecpointstuff.c
new file mode 100644
index 0000000..442362c
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecpointstuff.c
@@ -0,0 +1,1243 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Internal EC over GF(p^m) basic Definitions & Function Prototypes
+//
+// Context:
+// gfec_MakePoint()
+// gfec_SetPoint
+// gfec_GetPoint
+//
+// gfec_ComparePoint()
+// gfec_IsPointOnCurve()
+//
+// gfec_NegPoint()
+// gfec_DblPoint()
+// gfec_AddPoint()
+// gfec_MulPoint()
+//
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpecstuff.h"
+#include "gsscramble.h"
+
+
+int gfec_MakePoint(IppsGFpECPoint* pPoint, const BNU_CHUNK_T* pElm, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGFE)->add;
+
+ BNU_CHUNK_T* pX = ECP_POINT_X(pPoint);
+ BNU_CHUNK_T* pY = ECP_POINT_Y(pPoint);
+ BNU_CHUNK_T* pZ = ECP_POINT_Z(pPoint);
+
+ /* set x-coordinate */
+ cpGFpElementCopy(pX, pElm, elemLen);
+
+ /* T = X^3 + A*X + B */
+ sqrF(pY, pX, pGFE);
+ mulF(pY, pY, pX, pGFE);
+ if(ECP_SPECIFIC(pEC)!=ECP_EPID2) {
+ mulF(pZ, ECP_A(pEC), pX, pGFE);
+ addF(pY, pY, pZ, pGFE);
+ }
+ addF(pY, pY, ECP_B(pEC), pGFE);
+
+ /* set z-coordinate =1 */
+ cpGFpElementCopyPadd(pZ, elemLen, GFP_MNT_R(pGFE), elemLen);
+
+ /* Y = sqrt(Y) */
+ if( cpGFpSqrt(pY, pY, pGFE) ) {
+ ECP_POINT_FLAGS(pPoint) = ECP_AFFINE_POINT | ECP_FINITE_POINT;
+ return 1;
+ }
+ else {
+ gfec_SetPointAtInfinity(pPoint);
+ return 0;
+ }
+}
+
+static int gfec_IsAffinePointAtInfinity(int ecInfinity,
+ const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY,
+ const IppsGFpState* pGF)
+{
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elmLen = GFP_FELEN(pGFE);
+
+ int atInfinity = GFP_IS_ZERO(pX,elmLen);
+
+ BNU_CHUNK_T* tmpY = cpGFpGetPool(1, pGFE);
+
+ /* set tmpY either:
+ // 0, if ec.b !=0
+ // mont(1) if ec.b ==0
+ */
+ cpGFpElementPadd(tmpY, elmLen, 0);
+ if(ecInfinity) {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFE);
+ int basicElmLen = GFP_FELEN(pBasicGFE);
+ BNU_CHUNK_T* mont1 = GFP_MNT_R(pBasicGFE);
+ cpGFpElementCopyPadd(tmpY, elmLen, mont1, basicElmLen);
+ }
+
+ /* check if (x,y) represents point at infinity */
+ atInfinity &= GFP_EQ(pY, tmpY, elmLen);
+
+ cpGFpReleasePool(1, pGFE);
+ return atInfinity;
+}
+
+/* returns: 1/0 if set up finite/infinite point */
+int gfec_SetPoint(BNU_CHUNK_T* pPointData,
+ const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY,
+ IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elmLen = GFP_FELEN(pGFE);
+
+ int finite_point= !gfec_IsAffinePointAtInfinity(ECP_INFINITY(pEC), pX, pY, pGF);
+ if(finite_point) {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFE);
+ cpGFpElementCopy(pPointData, pX, elmLen);
+ cpGFpElementCopy(pPointData+elmLen, pY, elmLen);
+ cpGFpElementCopyPadd(pPointData+elmLen*2, elmLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
+ }
+ else
+ cpGFpElementPadd(pPointData, 3*elmLen, 0);
+
+ return finite_point;
+}
+
+
+#if ( ECP_PROJECTIVE_COORD == JACOBIAN )
+/* returns 1/0 if point is finite/infinite */
+int gfec_GetPoint(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, const IppsGFpECPoint* pPoint, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ if( !IS_ECP_FINITE_POINT(pPoint) ) {
+ if(pX) cpGFpElementPadd(pX, elemLen, 0);
+ if(pY) cpGFpElementPadd(pY, elemLen, 0);
+ return 0;
+ }
+
+ /* affine point (1==Z) */
+ if( IS_ECP_AFFINE_POINT(pPoint) ) {
+ if(pX)
+ cpGFpElementCopy(pX, ECP_POINT_X(pPoint), elemLen);
+ if(pY)
+ cpGFpElementCopy(pY, ECP_POINT_Y(pPoint), elemLen);
+ return 1;
+ }
+
+ /* projective point (1!=Z) */
+ {
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGFE)->sqr;
+
+ /* T = (1/Z)*(1/Z) */
+ BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pZinv = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pU = cpGFpGetPool(1, pGFE);
+ cpGFpxInv(pZinv, ECP_POINT_Z(pPoint), pGFE);
+ sqrF(pT, pZinv, pGFE);
+
+ if(pX) {
+ mulF(pU, ECP_POINT_X(pPoint), pT, pGFE);
+ cpGFpElementCopy(pX, pU, elemLen);
+ }
+ if(pY) {
+ mulF(pT, pZinv, pT, pGFE);
+ mulF(pU, ECP_POINT_Y(pPoint), pT, pGFE);
+ cpGFpElementCopy(pY, pU, elemLen);
+ }
+
+ cpGFpReleasePool(3, pGFE);
+ return 1;
+ }
+}
+#endif
+
+
+#if ( ECP_PROJECTIVE_COORD == JACOBIAN )
+int gfec_ComparePoint(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ /* P or/and Q at Infinity */
+ if( !IS_ECP_FINITE_POINT(pP) )
+ return !IS_ECP_FINITE_POINT(pQ)? 1:0;
+ if( !IS_ECP_FINITE_POINT(pQ) )
+ return !IS_ECP_FINITE_POINT(pP)? 1:0;
+
+ /* Px==Qx && Py==Qy && Pz==Qz */
+ if( GFP_EQ(ECP_POINT_Z(pP), ECP_POINT_Z(pQ), elemLen)
+ &&GFP_EQ(ECP_POINT_X(pP), ECP_POINT_X(pQ), elemLen)
+ &&GFP_EQ(ECP_POINT_Y(pP), ECP_POINT_Y(pQ), elemLen))
+ return 1;
+
+ else {
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGFE)->sqr;
+
+ int isEqu = 1;
+
+ BNU_CHUNK_T* pPtmp = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pQtmp = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pPz = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pQz = cpGFpGetPool(1, pGFE);
+
+ if(isEqu) {
+ /* Px*Qz^2 ~ Qx*Pz^2 */
+ if( IS_ECP_AFFINE_POINT(pQ) ) /* Ptmp = Px * Qz^2 */
+ cpGFpElementCopy(pPtmp, ECP_POINT_X(pP), elemLen);
+ else {
+ sqrF(pQz, ECP_POINT_Z(pQ), pGFE);
+ mulF(pPtmp, ECP_POINT_X(pP), pQz, pGFE);
+ }
+ if( IS_ECP_AFFINE_POINT(pP) ) /* Qtmp = Qx * Pz^2 */
+ cpGFpElementCopy(pQtmp, ECP_POINT_X(pQ), elemLen);
+ else {
+ sqrF(pPz, ECP_POINT_Z(pP), pGFE);
+ mulF(pQtmp, ECP_POINT_X(pQ), pPz, pGFE);
+ }
+ isEqu = GFP_EQ(pPtmp, pQtmp, elemLen);
+ }
+
+ if(isEqu) {
+ /* Py*Qz^3 ~ Qy*Pz^3 */
+ if( IS_ECP_AFFINE_POINT(pQ) ) /* Ptmp = Py * Qz^3 */
+ cpGFpElementCopy(pPtmp, ECP_POINT_Y(pP), elemLen);
+ else {
+ mulF(pQz, ECP_POINT_Z(pQ), pQz, pGFE);
+ mulF(pPtmp, pQz, ECP_POINT_Y(pP), pGFE);
+ }
+ if( IS_ECP_AFFINE_POINT(pP) ) /* Qtmp = Qy * Pz^3 */
+ cpGFpElementCopy(pQtmp, ECP_POINT_Y(pQ), elemLen);
+ else {
+ mulF(pPz, ECP_POINT_Z(pP), pPz, pGFE);
+ mulF(pQtmp, pPz, ECP_POINT_Y(pQ), pGFE);
+ }
+ isEqu = GFP_EQ(pPtmp, pQtmp, elemLen);
+ }
+
+ cpGFpReleasePool(4, pGFE);
+ return isEqu;
+ }
+}
+#endif
+
+
+#if ( ECP_PROJECTIVE_COORD == JACOBIAN )
+int gfec_IsPointOnCurve(const IppsGFpECPoint* pPoint, IppsGFpECState* pEC)
+{
+ /* point at infinity does not belong curve */
+ if( !IS_ECP_FINITE_POINT(pPoint) )
+ //return 1;
+ return 0;
+
+ /* test that 0 == R = (Y^2) - (X^3 + A*X*(Z^4) + B*(Z^6)) */
+ else {
+ int isOnCurve = 0;
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+
+ mod_mul mulF = GFP_METHOD(pGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGFE)->sqr;
+ mod_sub subF = GFP_METHOD(pGFE)->sub;
+
+ BNU_CHUNK_T* pX = ECP_POINT_X(pPoint);
+ BNU_CHUNK_T* pY = ECP_POINT_Y(pPoint);
+ BNU_CHUNK_T* pZ = ECP_POINT_Z(pPoint);
+
+ BNU_CHUNK_T* pR = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFE);
+
+ sqrF(pR, pY, pGFE); /* R = Y^2 */
+ sqrF(pT, pX, pGFE); /* T = X^3 */
+ mulF(pT, pX, pT, pGFE);
+ subF(pR, pR, pT, pGFE); /* R -= T */
+
+ if( IS_ECP_AFFINE_POINT(pPoint) ) {
+ mulF(pT, pX, ECP_A(pEC), pGFE); /* T = A*X */
+ subF(pR, pR, pT, pGFE); /* R -= T */
+ subF(pR, pR, ECP_B(pEC), pGFE); /* R -= B */
+ }
+ else {
+ BNU_CHUNK_T* pZ4 = cpGFpGetPool(1, pGFE);
+ BNU_CHUNK_T* pZ6 = cpGFpGetPool(1, pGFE);
+
+ sqrF(pZ6, pZ, pGFE); /* Z^2 */
+ sqrF(pZ4, pZ6, pGFE); /* Z^4 */
+ mulF(pZ6, pZ6, pZ4, pGFE); /* Z^6 */
+
+ mulF(pZ4, pZ4, pX, pGFE); /* X*(Z^4) */
+ mulF(pZ4, pZ4, ECP_A(pEC), pGFE); /* A*X*(Z^4) */
+ mulF(pZ6, pZ6, ECP_B(pEC), pGFE); /* B*(Z^4) */
+
+ subF(pR, pR, pZ4, pGFE); /* R -= A*X*(Z^4) */
+ subF(pR, pR, pZ6, pGFE); /* R -= B*(Z^6) */
+
+ cpGFpReleasePool(2, pGFE);
+ }
+
+ isOnCurve = GFP_IS_ZERO(pR, GFP_FELEN(pGFE));
+ cpGFpReleasePool(2, pGFE);
+ return isOnCurve;
+ }
+}
+#endif
+
+IppsGFpECPoint* gfec_NegPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elmLen = GFP_FELEN(pGFE);
+ if(pR!=pP)
+ gfec_CopyPoint(pR, pP, elmLen);
+ GFP_METHOD(pGFE)->neg(ECP_POINT_Y(pR), ECP_POINT_Y(pP), pGFE);
+ return pR;
+}
+
+
+#if ( ECP_PROJECTIVE_COORD == JACOBIAN )
+/*
+// A = 4*x*y^2
+// B = 3*x^2 + a*z^4
+//
+// x3 = -2*A + B^2
+// y3 = -8y^4 +B*(A-x3)
+// z3 = 2*y*z
+//
+// complexity: = 4s+4m (NIST's, SM2 curves)
+// = (EPID2 curve)
+// = 6s+4m (arbitrary curves)
+*/
+static void gfec_point_double(BNU_CHUNK_T* pRdata, const BNU_CHUNK_T* pPdata, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_add add = GFP_METHOD(pGFE)->add; /* gf add */
+ mod_sub sub = GFP_METHOD(pGFE)->sub; /* gf sub */
+ mod_div2 div2= GFP_METHOD(pGFE)->div2; /* gf div2 */
+ mod_mul2 mul2= GFP_METHOD(pGFE)->mul2; /* gf mul2 */
+ mod_mul3 mul3= GFP_METHOD(pGFE)->mul3; /* gf mul3 */
+ mod_mul mul = GFP_METHOD(pGFE)->mul; /* gf mul */
+ mod_sqr sqr = GFP_METHOD(pGFE)->sqr; /* gf sqr */
+
+ const BNU_CHUNK_T* pX = pPdata;
+ const BNU_CHUNK_T* pY = pPdata+elemLen;
+ const BNU_CHUNK_T* pZ = pPdata+2*+elemLen;
+
+ BNU_CHUNK_T* rX = pRdata;
+ BNU_CHUNK_T* rY = pRdata+elemLen;
+ BNU_CHUNK_T* rZ = pRdata+2*elemLen;
+
+ /* get temporary from top of EC point pool */
+ BNU_CHUNK_T* U = pEC->pPool;
+ BNU_CHUNK_T* M = U+elemLen;
+ BNU_CHUNK_T* S = M+elemLen;
+
+ mul2(S, pY, pGFE); /* S = 2*Y */
+ sqr(U, pZ, pGFE); /* U = Z^2 */
+
+ sqr(M, S, pGFE); /* M = 4*Y^2 */
+ mul(rZ, S, pZ, pGFE); /* Zres = 2*Y*Z */
+
+ sqr(rY, M, pGFE); /* Yres = 16*Y^4 */
+
+ mul(S, M, pX, pGFE); /* S = 4*X*Y^2 */
+ div2(rY, rY, pGFE); /* Yres = 8*Y^4 */
+
+ if(ECP_STD==ECP_SPECIFIC(pEC)) {
+ add(M, pX, U, pGFE); /* M = 3*(X^2-Z^4) */
+ sub(U, pX, U, pGFE);
+ mul(M, M, U, pGFE);
+ mul3(M, M, pGFE);
+ }
+ else {
+ sqr(M, pX, pGFE); /* M = 3*X^2 */
+ mul3(M, M, pGFE);
+ if(ECP_EPID2!=ECP_SPECIFIC(pEC)) {
+ sqr(U, U, pGFE); /* M = 3*X^2+a*Z4 */
+ mul(U, U, ECP_A(pEC), pGFE);
+ add(M, M, U, pGFE);
+ }
+ }
+
+ mul2(U, S, pGFE); /* U = 8*X*Y^2 */
+ sqr(rX, M, pGFE); /* Xres = M^2 */
+ sub(rX, rX, U, pGFE); /* Xres = M^2-U */
+
+ sub(S, S, rX, pGFE); /* S = 4*X*Y^2-Xres */
+ mul(S, S, M, pGFE); /* S = M*(4*X*Y^2-Xres) */
+ sub(rY, S, rY, pGFE); /* Yres = M*(4*X*Y^2-Xres) -8*Y^4 */
+}
+#endif
+
+IppsGFpECPoint* gfec_DblPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, IppsGFpECState* pEC)
+{
+ gfec_point_double(ECP_POINT_X(pR), ECP_POINT_X(pP), pEC);
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+}
+
+
+#if ( ECP_PROJECTIVE_COORD == JACOBIAN )
+/*
+// S1 = y1*z2^3
+// S2 = y2*z1^3
+//
+// U1 = x1*z2^2
+// U2 = x2*z1^2
+
+// R = S2-S1
+// H = U2-U1
+//
+// x3 = -H^3 -2*U1*H^2 +R2
+// y3 = -S1*H^3 +R*(U1*H^2 -x3)
+// z3 = z1*z2*H
+//
+// complexity = 4s+12m
+*/
+static void gfec_point_add(BNU_CHUNK_T* pRdata, const BNU_CHUNK_T* pPdata, const BNU_CHUNK_T* pQdata, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_sub sub = GFP_METHOD(pGFE)->sub; /* gf sub */
+ mod_mul2 mul2= GFP_METHOD(pGFE)->mul2; /* gf mul2 */
+ mod_mul mul = GFP_METHOD(pGFE)->mul; /* gf mul */
+ mod_sqr sqr = GFP_METHOD(pGFE)->sqr; /* gf sqr */
+
+ /* coordinates of P */
+ const BNU_CHUNK_T* px1 = pPdata;
+ const BNU_CHUNK_T* py1 = pPdata+elemLen;
+ const BNU_CHUNK_T* pz1 = pPdata+2*elemLen;
+
+ /* coordinates of Q */
+ const BNU_CHUNK_T* px2 = pQdata;
+ const BNU_CHUNK_T* py2 = pQdata+elemLen;
+ const BNU_CHUNK_T* pz2 = pQdata+2*elemLen;
+
+ int inftyP = GFP_IS_ZERO(pz1, elemLen);
+ int inftyQ = GFP_IS_ZERO(pz2, elemLen);
+
+ /* get temporary from top of EC point pool */
+ BNU_CHUNK_T* U1 = pEC->pPool;
+ BNU_CHUNK_T* U2 = U1 + elemLen;
+ BNU_CHUNK_T* S1 = U2 + elemLen;
+ BNU_CHUNK_T* S2 = S1 + elemLen;
+ BNU_CHUNK_T* H = S2 + elemLen;
+ BNU_CHUNK_T* R = H + elemLen;
+
+ BNU_CHUNK_T* pRx = R + elemLen; /* temporary result */
+ BNU_CHUNK_T* pRy = pRx+ elemLen;
+ BNU_CHUNK_T* pRz = pRy+ elemLen;
+
+ mul(S1, py1, pz2, pGFE); // S1 = Y1*Z2
+ sqr(U1, pz2, pGFE); // U1 = Z2^2
+
+ mul(S2, py2, pz1, pGFE); // S2 = Y2*Z1
+ sqr(U2, pz1, pGFE); // U2 = Z1^2
+
+ mul(S1, S1, U1, pGFE); // S1 = Y1*Z2^3
+ mul(S2, S2, U2, pGFE); // S2 = Y2*Z1^3
+
+ mul(U1, px1, U1, pGFE); // U1 = X1*Z2^2
+ mul(U2, px2, U2, pGFE); // U2 = X2*Z1^2
+
+ sub(R, S2, S1, pGFE); // R = S2-S1
+ sub(H, U2, U1, pGFE); // H = U2-U1
+
+ if( GFP_IS_ZERO(H, elemLen) && !inftyP && !inftyQ ) {
+ if( GFP_IS_ZERO(R, elemLen) )
+ gfec_point_double(pRdata, pPdata, pEC);
+ else
+ cpGFpElementPadd(pRdata, 3*elemLen, 0);
+ return;
+ }
+
+ mul(pRz, pz1, pz2, pGFE); // Z3 = Z1*Z2
+ sqr(U2, H, pGFE); // U2 = H^2
+ mul(pRz, pRz, H, pGFE); // Z3 = (Z1*Z2)*H
+ sqr(S2, R, pGFE); // S2 = R^2
+ mul(H, H, U2, pGFE); // H = H^3
+
+ mul(U1, U1, U2, pGFE); // U1 = U1*H^2
+ sub(pRx, S2, H, pGFE); // X3 = R^2 - H^3
+ mul2(U2, U1, pGFE); // U2 = 2*U1*H^2
+ mul(S1, S1, H, pGFE); // S1 = S1*H^3
+ sub(pRx, pRx, U2, pGFE); // X3 = (R^2 - H^3) -2*U1*H^2
+
+ sub(pRy, U1, pRx, pGFE); // Y3 = R*(U1*H^2 - X3) -S1*H^3
+ mul(pRy, pRy, R, pGFE);
+ sub(pRy, pRy, S1, pGFE);
+
+ cpMaskMove(pRx, px2, elemLen*3, inftyP);
+ cpMaskMove(pRx, px1, elemLen*3, inftyQ);
+
+ cpGFpElementCopy(pRdata, pRx, 3*elemLen);
+}
+
+/*
+// complexity = 3s+8m
+*/
+static void gfec_affine_point_add(BNU_CHUNK_T* pRdata, const BNU_CHUNK_T* pPdata, const BNU_CHUNK_T* pAdata, IppsGFpECState* pEC)
+{
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_sub sub = GFP_METHOD(pGFE)->sub; /* gf sub */
+ mod_mul2 mul2= GFP_METHOD(pGFE)->mul2; /* gf mul2 */
+ mod_mul mul = GFP_METHOD(pGFE)->mul; /* gf mul */
+ mod_sqr sqr = GFP_METHOD(pGFE)->sqr; /* gf sqr */
+
+ BNU_CHUNK_T* mont1 = GFP_MNT_R(pGFE);
+
+ /* coordinates of projective P point */
+ const BNU_CHUNK_T* px = pPdata; /* x1 */
+ const BNU_CHUNK_T* py = pPdata+elemLen; /* y1 */
+ const BNU_CHUNK_T* pz = pPdata+2*elemLen; /* z1 */
+
+ /* coordinates of affine A point, az==mont(1) */
+ const BNU_CHUNK_T* ax = pAdata; /* x2 */
+ const BNU_CHUNK_T* ay = pAdata+elemLen; /* y2 */
+
+ int inftyP = GFP_IS_ZERO(px, elemLen) && GFP_IS_ZERO(py, elemLen);
+ int inftyA = GFP_IS_ZERO(ax, elemLen) && GFP_IS_ZERO(ay, elemLen);
+
+ /* get temporary from top of EC point pool */
+ BNU_CHUNK_T* U2 = pEC->pPool;
+ BNU_CHUNK_T* S2 = U2 + elemLen;
+ BNU_CHUNK_T* H = S2 + elemLen;
+ BNU_CHUNK_T* R = H + elemLen;
+
+ BNU_CHUNK_T* pRx = R + elemLen; /* temporary result */
+ BNU_CHUNK_T* pRy = pRx+ elemLen;
+ BNU_CHUNK_T* pRz = pRy+ elemLen;
+
+ sqr(R, pz, pGFE); // R = Z1^2
+ mul(S2, ay, pz, pGFE); // S2 = Y2*Z1
+ mul(U2, ax, R, pGFE); // U2 = X2*Z1^2
+ mul(S2, S2, R, pGFE); // S2 = Y2*Z1^3
+
+ sub(H, U2, px, pGFE); // H = U2-X1
+ sub(R, S2, py, pGFE); // R = S2-Y1
+
+ mul(pRz, H, pz, pGFE); // Z3 = H*Z1
+
+ sqr(U2, H, pGFE); // U2 = H^2
+ sqr(S2, R, pGFE); // S2 = R^2
+ mul(H, H, U2, pGFE); // H = H^3
+
+ mul(U2, U2, px, pGFE); // U2 = X1*H^2
+
+ mul(pRy, H, py, pGFE); // T = Y1*H^3
+
+ mul2(pRx, U2, pGFE); // X3 = 2*X1*H^2
+ sub(pRx, S2, pRx, pGFE); // X3 = R^2 - 2*X1*H^2
+ sub(pRx, pRx, H, pGFE); // X3 = R^2 - 2*X1*H^2 -H^3
+
+ sub(U2, U2, pRx, pGFE); // U2 = X1*H^2 - X3
+ mul(U2, U2, R, pGFE); // U2 = R*(X1*H^2 - X3)
+ sub(pRy, U2, pRy, pGFE); // Y3 = -Y1*H^3 + R*(X1*H^2 - X3)
+
+ cpMaskMove(pRx, ax, elemLen, inftyP);
+ cpMaskMove(pRy, ay, elemLen, inftyP);
+ cpMaskMove(pRz, mont1, elemLen, inftyP);
+ cpMaskMove(pRz, ax, elemLen, inftyP&inftyA);
+
+ cpMaskMove(pRx, px, elemLen*3, inftyA);
+
+ cpGFpElementCopy(pRdata, pRx, 3*elemLen);
+}
+#endif
+
+IppsGFpECPoint* gfec_AddPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ,
+ IppsGFpECState* pEC)
+{
+ gfec_point_add(ECP_POINT_X(pR), ECP_POINT_X(pP), ECP_POINT_X(pQ), pEC);
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+}
+
+
+/* sscm version */
+static void setupTable(BNU_CHUNK_T* pTbl,
+ const BNU_CHUNK_T* pPdata,
+ IppsGFpECState* pEC)
+{
+ int pointLen = ECP_POINTLEN(pEC);
+ //int pointLen32 = pointLen*sizeof(BNU_CHUNK_T)/sizeof(ipp32u);
+
+ const int npoints = 3;
+ BNU_CHUNK_T* A = cpEcGFpGetPool(npoints, pEC);
+ BNU_CHUNK_T* B = A+pointLen;
+ BNU_CHUNK_T* C = B+pointLen;
+
+ // Table[0]
+ // Table[0] is implicitly (0,0,0) {point at infinity}, therefore no need to store it
+ // All other values are actually stored with an offset of -1
+
+ // Table[1] ( =[1]p )
+ //cpScatter32((Ipp32u*)pTbl, 16, 0, (Ipp32u*)pPdata, pointLen32);
+ gsScramblePut(pTbl, (1-1), pPdata, pointLen, (5-1));
+
+ // Table[2] ( =[2]p )
+ gfec_point_double(A, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 1, (Ipp32u*)A, pointLen32);
+ gsScramblePut(pTbl, (2-1), A, pointLen, (5-1));
+
+ // Table[3] ( =[3]p )
+ gfec_point_add(B, A, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 2, (Ipp32u*)B, pointLen32);
+ gsScramblePut(pTbl, (3-1), B, pointLen, (5-1));
+
+ // Table[4] ( =[4]p )
+ gfec_point_double(A, A, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 3, (Ipp32u*)A, pointLen32);
+ gsScramblePut(pTbl, (4-1), A, pointLen, (5-1));
+
+ // Table[5] ( =[5]p )
+ gfec_point_add(C, A, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 4, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (5-1), C, pointLen, (5-1));
+
+ // Table[10] ( =[10]p )
+ gfec_point_double(C, C, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 9, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (10-1), C, pointLen, (5-1));
+
+ // Table[11] ( =[11]p )
+ gfec_point_add(C, C, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 10, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (11-1), C, pointLen, (5-1));
+
+ // Table[6] ( =[6]p )
+ gfec_point_double(B, B, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 5, (Ipp32u*)B, pointLen32);
+ gsScramblePut(pTbl, (6-1), B, pointLen, (5-1));
+
+ // Table[7] ( =[7]p )
+ gfec_point_add(C, B, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 6, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (7-1), C, pointLen, (5-1));
+
+ // Table[14] ( =[14]p )
+ gfec_point_double(C, C, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 13, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (14-1), C, pointLen, (5-1));
+
+ // Table[15] ( =[15]p )
+ gfec_point_add(C, C, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 14, (Ipp32u*)C, pointLen32);
+ gsScramblePut(pTbl, (15-1), C, pointLen, (5-1));
+
+ // Table[12] ( =[12]p )
+ gfec_point_double(B, B, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 11, (Ipp32u*)B, pointLen32);
+ gsScramblePut(pTbl, (12-1), B, pointLen, (5-1));
+
+ // Table[13] ( =[13]p )
+ gfec_point_add(B, B, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 12, (Ipp32u*)B, pointLen32);
+ gsScramblePut(pTbl, (13-1), B, pointLen, (5-1));
+
+ // Table[8] ( =[8]p )
+ gfec_point_double(A, A, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 7, (Ipp32u*)A, pointLen32);
+ gsScramblePut(pTbl, (8-1), A, pointLen, (5-1));
+
+ // Table[9] ( =[9]p )
+ gfec_point_add(B, A, pPdata, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 8, (Ipp32u*)B, pointLen32);
+ gsScramblePut(pTbl, (9-1), B, pointLen, (5-1));
+
+ // Table[16] ( =[16]p )
+ gfec_point_double(A, A, pEC);
+ //cpScatter32((Ipp32u*)pTbl, 16, 15, (Ipp32u*)A, pointLen32);
+ gsScramblePut(pTbl, (16-1), A, pointLen, (5-1));
+
+ cpEcGFpReleasePool(npoints, pEC);
+}
+
+
+static void gfec_point_mul(BNU_CHUNK_T* pRdata,
+ const BNU_CHUNK_T* pPdata,
+ const Ipp8u* pScalar8, int scalarBitSize,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ int pointLen = ECP_POINTLEN(pEC);
+ //int pointLen32 = pointLen*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u);
+
+ /* optimal size of window */
+ const int window_size = 5;
+ /* number of table entries */
+ //const int tableLen = 1<<(window_size-1);
+
+ /* aligned pre-computed table */
+ BNU_CHUNK_T* pTable = (BNU_CHUNK_T*)IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE);
+
+ if (!pScratchBuffer)
+ return;
+
+ setupTable(pTable, pPdata, pEC);
+
+ {
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_neg negF = GFP_METHOD(pGFE)->neg;
+
+ BNU_CHUNK_T* pHy = cpGFpGetPool(1, pGFE);
+
+ BNU_CHUNK_T* pTdata = cpEcGFpGetPool(1, pEC); /* points from the pool */
+ BNU_CHUNK_T* pHdata = cpEcGFpGetPool(1, pEC);
+
+ int wvalue;
+ Ipp8u digit, sign;
+ int mask = (1<<(window_size+1)) -1;
+ int bit = scalarBitSize-(scalarBitSize%window_size);
+
+ /* first window */
+ if(bit) {
+ wvalue = *((Ipp16u*)&pScalar8[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ }
+ else
+ wvalue = 0;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pTdata, pointLen32, (Ipp32u*)pTable, tableLen, digit);
+ gsScrambleGet_sscm(pTdata, pointLen, pTable, digit-1, 5-1);
+
+ for(bit-=window_size; bit>=window_size; bit-=window_size) {
+ gfec_point_double(pTdata, pTdata, pEC); //it's better to have separate calls
+ gfec_point_double(pTdata, pTdata, pEC); // instead of gfec_point_double_k()
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+
+ wvalue = *((Ipp16u*)&pScalar8[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTable, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTable, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+ }
+
+ /* last window */
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+
+ wvalue = *((Ipp16u*)&pScalar8[0]);
+ wvalue = (wvalue << 1) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTable, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTable, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+
+ cpGFpElementCopy(pRdata, pTdata, pointLen);
+
+ cpEcGFpReleasePool(2, pEC);
+ cpGFpReleasePool(1, pGFE);
+ }
+}
+
+static void gfec_base_point_mul(BNU_CHUNK_T* pRdata, const Ipp8u* pScalar8, int scalarBitSize, IppsGFpECState* pEC)
+{
+ /* size of window, get function and pre-computed table */
+ int window_size = ECP_PREMULBP(pEC)->w;
+ selectAP select_affine_point = ECP_PREMULBP(pEC)->select_affine_point;
+ const BNU_CHUNK_T* pTbl = ECP_PREMULBP(pEC)->pTbl;
+
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elmLen = GFP_FELEN(pGFE);
+
+ mod_neg negF = GFP_METHOD(pGFE)->neg;
+
+ BNU_CHUNK_T* mont1 = GFP_MNT_R(pGFE);
+
+ /* number of points per table slot */
+ int tslot_point = 1<<(window_size-1);
+ int tslot_size = tslot_point * (elmLen*2);
+
+ BNU_CHUNK_T* negtmp = cpGFpGetPool(1, pGFE); /* temporary element */
+ BNU_CHUNK_T* pointT = cpEcGFpGetPool(1, pEC); /* temporary point */
+
+ Ipp8u digit, sign;
+ int mask = (1<<(window_size+1)) -1;
+ int bit = 0;
+
+ /* processing of window[0] */
+ int wvalue = *((Ipp16u*)&pScalar8[0]);
+ wvalue = (wvalue << 1) & mask;
+
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ select_affine_point(pRdata, pTbl, digit);
+
+ negF(negtmp, pRdata+elmLen, pGFE);
+ cpMaskMove(pRdata+elmLen, negtmp, elmLen, sign);
+ cpGFpElementCopy(pRdata+elmLen*2, mont1, elmLen);
+ cpGFpElementCopy(pointT+elmLen*2, mont1, elmLen);
+
+ /* processing of other windows.. [1],[2],... */
+ for(bit+=window_size, pTbl+=tslot_size; bit<=scalarBitSize; bit+=window_size, pTbl+=tslot_size) {
+ wvalue = *((Ipp16u*)&pScalar8[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ select_affine_point(pointT, pTbl, digit);
+
+ negF(negtmp, pointT+elmLen, pGFE);
+ cpMaskMove(pointT+elmLen, negtmp, elmLen, sign);
+
+ gfec_affine_point_add(pRdata, pRdata, pointT, pEC);
+ }
+
+ cpEcGFpReleasePool(1, pEC);
+ cpGFpReleasePool(1, pGFE);
+}
+
+static void gfec_point_prod(BNU_CHUNK_T* pointR,
+ const BNU_CHUNK_T* pointA, const Ipp8u* scalarA,
+ const BNU_CHUNK_T* pointB, const Ipp8u* scalarB,
+ int scalarBitSize,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ int pointLen = ECP_POINTLEN(pEC);
+ //int pointLen32 = pointLen*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u);
+
+ /* optimal size of window */
+ const int window_size = 5;
+ /* number of table entries */
+ const int tableLen = 1<<(window_size-1);
+
+ /* aligned pre-computed tables */
+ BNU_CHUNK_T* pTableA = (BNU_CHUNK_T*)IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE);
+ BNU_CHUNK_T* pTableB = pTableA+pointLen*tableLen;
+
+ if (!pScratchBuffer)
+ return;
+
+ setupTable(pTableA, pointA, pEC);
+ setupTable(pTableB, pointB, pEC);
+
+ {
+ IppsGFpState* pGF = ECP_GFP(pEC);
+ gsModEngine* pGFE = GFP_PMA(pGF);
+ int elemLen = GFP_FELEN(pGFE);
+
+ mod_neg negF = GFP_METHOD(pGFE)->neg;
+
+ BNU_CHUNK_T* pHy = cpGFpGetPool(1, pGFE);
+
+ BNU_CHUNK_T* pTdata = cpEcGFpGetPool(1, pEC); /* points from the pool */
+ BNU_CHUNK_T* pHdata = cpEcGFpGetPool(1, pEC);
+
+ int wvalue;
+ Ipp8u digit, sign;
+ int mask = (1<<(window_size+1)) -1;
+ int bit = scalarBitSize-(scalarBitSize%window_size);
+
+ /* first window */
+ if(bit) {
+ wvalue = *((Ipp16u*)&scalarA[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ }
+ else
+ wvalue = 0;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pTdata, pointLen32, (Ipp32u*)pTableA, tableLen, digit);
+ gsScrambleGet_sscm(pTdata, pointLen, pTableA, digit-1, 5-1);
+
+ if(bit) {
+ wvalue = *((Ipp16u*)&scalarB[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ }
+ else
+ wvalue = 0;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTableB, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTableB, digit-1, 5-1);
+
+ //negF(pHy, pHdata+elemLen, pGFE);
+ //cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+
+ for(bit-=window_size; bit>=window_size; bit-=window_size) {
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+
+ wvalue = *((Ipp16u*)&scalarA[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTableA, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTableA, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+
+ wvalue = *((Ipp16u*)&scalarB[(bit-1)/8]);
+ wvalue = (wvalue>> ((bit-1)%8)) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTableB, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTableB, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+ }
+ /* last window */
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+ gfec_point_double(pTdata, pTdata, pEC);
+
+ wvalue = *((Ipp16u*)&scalarA[0]);
+ wvalue = (wvalue << 1) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTableA, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTableA, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+
+ wvalue = *((Ipp16u*)&scalarB[0]);
+ wvalue = (wvalue << 1) & mask;
+ booth_recode(&sign, &digit, (Ipp8u)wvalue, window_size);
+ //cpGather32((Ipp32u*)pHdata, pointLen32, (Ipp32u*)pTableB, tableLen, digit);
+ gsScrambleGet_sscm(pHdata, pointLen, pTableB, digit-1, 5-1);
+
+ negF(pHy, pHdata+elemLen, pGFE);
+ cpMaskMove(pHdata+elemLen, pHy, elemLen, sign);
+ gfec_point_add(pTdata, pTdata, pHdata, pEC);
+
+ cpGFpElementCopy(pointR, pTdata, pointLen);
+
+ cpEcGFpReleasePool(2, pEC);
+ cpGFpReleasePool(1, pGFE);
+ }
+}
+
+/*
+// select affine point
+*/
+#if (_IPP32E < _IPP32E_M7)
+void p192r1_select_ap_w7(BNU_CHUNK_T* pVal, const BNU_CHUNK_T* pTbl, int idx)
+{
+ #define OPERAND_BITSIZE (192)
+ #define LEN_P192 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+ #define LEN_P192_APOINT (2*LEN_P192)
+
+ const int tblLen = 64;
+ int i;
+ unsigned int n;
+
+ /* clear output affine point */
+ for(n=0; n<LEN_P192_APOINT; n++)
+ pVal[n] = 0;
+
+ /* select poiint */
+ for(i=1; i<=tblLen; i++) {
+ BNU_CHUNK_T mask = 0 - isZero(i-idx);
+ for(n=0; n<LEN_P192_APOINT; n++)
+ pVal[n] |= (pTbl[n] & mask);
+ pTbl += LEN_P192_APOINT;
+ }
+
+ #undef OPERAND_BITSIZE
+ #undef LEN_P192
+ #undef LEN_P192_APOINT
+}
+
+void p224r1_select_ap_w7(BNU_CHUNK_T* pVal, const BNU_CHUNK_T* pTbl, int idx)
+{
+ #define OPERAND_BITSIZE (224)
+ #define LEN_P224 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+ #define LEN_P224_APOINT (2*LEN_P224)
+
+ const int tblLen = 64;
+ int i;
+ unsigned int n;
+
+ /* clear output affine point */
+ for(n=0; n<LEN_P224_APOINT; n++)
+ pVal[n] = 0;
+
+ /* select poiint */
+ for(i=1; i<=tblLen; i++) {
+ BNU_CHUNK_T mask = 0 - isZero(i-idx);
+ for(n=0; n<LEN_P224_APOINT; n++)
+ pVal[n] |= (pTbl[n] & mask);
+ pTbl += LEN_P224_APOINT;
+ }
+
+ #undef OPERAND_BITSIZE
+ #undef LEN_P224
+ #undef LEN_P224_APOINT
+}
+
+void p256r1_select_ap_w7(BNU_CHUNK_T* pVal, const BNU_CHUNK_T* pTbl, int idx)
+{
+ #define OPERAND_BITSIZE (256)
+ #define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+ #define LEN_P256_APOINT (2*LEN_P256)
+
+ const int tblLen = 64;
+ int i;
+ unsigned int n;
+
+ /* clear output affine point */
+ for(n=0; n<LEN_P256_APOINT; n++)
+ pVal[n] = 0;
+
+ /* select poiint */
+ for(i=1; i<=tblLen; i++) {
+ BNU_CHUNK_T mask = 0 - isZero(i-idx);
+ for(n=0; n<LEN_P256_APOINT; n++)
+ pVal[n] |= (pTbl[n] & mask);
+ pTbl += LEN_P256_APOINT;
+ }
+
+ #undef OPERAND_BITSIZE
+ #undef LEN_P256
+ #undef LEN_P256_APOINT
+}
+
+void p384r1_select_ap_w5(BNU_CHUNK_T* pVal, const BNU_CHUNK_T* pTbl, int idx)
+{
+ #define OPERAND_BITSIZE (384)
+ #define LEN_P384 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+ #define LEN_P384_APOINT (2*LEN_P384)
+
+ const int tblLen = 16;
+ int i;
+ unsigned int n;
+
+ /* clear output affine point */
+ for(n=0; n<LEN_P384_APOINT; n++)
+ pVal[n] = 0;
+
+ /* select poiint */
+ for(i=1; i<=tblLen; i++) {
+ BNU_CHUNK_T mask = 0 - isZero(i-idx);
+ for(n=0; n<LEN_P384_APOINT; n++)
+ pVal[n] |= (pTbl[n] & mask);
+ pTbl += LEN_P384_APOINT;
+ }
+
+ #undef OPERAND_BITSIZE
+ #undef LEN_P384
+ #undef LEN_P384_APOINT
+}
+
+void p521r1_select_ap_w5(BNU_CHUNK_T* pVal, const BNU_CHUNK_T* pTbl, int idx)
+{
+ #define OPERAND_BITSIZE (521)
+ #define LEN_P521 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+ #define LEN_P521_APOINT (2*LEN_P521)
+
+ const int tblLen = 16;
+ int i;
+ unsigned int n;
+
+ /* clear output affine point */
+ for(n=0; n<LEN_P521_APOINT; n++)
+ pVal[n] = 0;
+
+ /* select point */
+ for(i=1; i<=tblLen; i++) {
+ BNU_CHUNK_T mask = 0 - isZero(i-idx);
+ for(n=0; n<LEN_P521_APOINT; n++)
+ pVal[n] |= (pTbl[n] & mask);
+ pTbl += LEN_P521_APOINT;
+ }
+
+ #undef OPERAND_BITSIZE
+ #undef LEN_P521
+ #undef P521_POINT_AFFINE
+}
+#endif
+
+IppsGFpECPoint* gfec_MulPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP,
+ const BNU_CHUNK_T* pScalar, int scalarLen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ FIX_BNU(pScalar, scalarLen);
+ {
+ gsModEngine* pGForder = ECP_MONT_R(pEC);
+
+ BNU_CHUNK_T* pTmpScalar = cpGFpGetPool(1, pGForder); /* length of scalar does not exceed length of order */
+ int orderBits = MOD_BITSIZE(pGForder);
+ int orderLen = MOD_LEN(pGForder);
+ cpGFpElementCopyPadd(pTmpScalar,orderLen+1, pScalar,scalarLen);
+
+ gfec_point_mul(ECP_POINT_X(pR), ECP_POINT_X(pP),
+ (Ipp8u*)pTmpScalar, orderBits,
+ pEC, pScratchBuffer);
+ cpGFpReleasePool(1, pGForder);
+
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+ }
+}
+
+IppsGFpECPoint* gfec_MulBasePoint(IppsGFpECPoint* pR,
+ const BNU_CHUNK_T* pScalar, int scalarLen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ FIX_BNU(pScalar, scalarLen);
+ {
+ gsModEngine* pGForder = ECP_MONT_R(pEC);
+
+ BNU_CHUNK_T* pTmpScalar = cpGFpGetPool(1, pGForder); /* length of scalar does not exceed length of order */
+ int orderBits = MOD_BITSIZE(pGForder);
+ int orderLen = MOD_LEN(pGForder);
+ cpGFpElementCopyPadd(pTmpScalar,orderLen+1, pScalar,scalarLen);
+
+ if(ECP_PREMULBP(pEC))
+ gfec_base_point_mul(ECP_POINT_X(pR),
+ (Ipp8u*)pTmpScalar, orderBits,
+ pEC);
+ else
+ gfec_point_mul(ECP_POINT_X(pR), ECP_G(pEC),
+ (Ipp8u*)pTmpScalar, orderBits,
+ pEC, pScratchBuffer);
+ cpGFpReleasePool(1, pGForder);
+
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+ }
+}
+
+IppsGFpECPoint* gfec_PointProduct(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
+ const IppsGFpECPoint* pQ, const BNU_CHUNK_T* pScalarQ, int scalarQlen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ FIX_BNU(pScalarP, scalarPlen);
+ FIX_BNU(pScalarQ, scalarQlen);
+ {
+ gsModEngine* pGForder = ECP_MONT_R(pEC);
+
+ int orderBits = MOD_BITSIZE(pGForder);
+ int orderLen = MOD_LEN(pGForder);
+ BNU_CHUNK_T* tmpScalarP = cpGFpGetPool(2, pGForder);
+ BNU_CHUNK_T* tmpScalarQ = tmpScalarP+orderLen+1;
+ cpGFpElementCopyPadd(tmpScalarP, orderLen+1, pScalarP,scalarPlen);
+ cpGFpElementCopyPadd(tmpScalarQ, orderLen+1, pScalarQ,scalarQlen);
+
+ gfec_point_prod(ECP_POINT_X(pR),
+ ECP_POINT_X(pP), (Ipp8u*)tmpScalarP,
+ ECP_POINT_X(pQ), (Ipp8u*)tmpScalarQ,
+ orderBits,
+ pEC, pScratchBuffer);
+ cpGFpReleasePool(2, pGForder);
+
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+ }
+}
+
+IppsGFpECPoint* gfec_BasePointProduct(IppsGFpECPoint* pR,
+ const BNU_CHUNK_T* pScalarG, int scalarGlen,
+ const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer)
+{
+ FIX_BNU(pScalarG, scalarGlen);
+ FIX_BNU(pScalarP, scalarPlen);
+
+ {
+ gsModEngine* pGForder = ECP_MONT_R(pEC);
+ int orderBits = MOD_BITSIZE(pGForder);
+ int orderLen = MOD_LEN(pGForder);
+ BNU_CHUNK_T* tmpScalarG = cpGFpGetPool(2, pGForder);
+ BNU_CHUNK_T* tmpScalarP = tmpScalarG+orderLen+1;
+
+ cpGFpElementCopyPadd(tmpScalarG, orderLen+1, pScalarG,scalarGlen);
+ cpGFpElementCopyPadd(tmpScalarP, orderLen+1, pScalarP,scalarPlen);
+
+ if(ECP_PREMULBP(pEC)) {
+ BNU_CHUNK_T* productG = cpEcGFpGetPool(2, pEC);
+ BNU_CHUNK_T* productP = productG+ECP_POINTLEN(pEC);
+
+ gfec_base_point_mul(productG, (Ipp8u*)tmpScalarG, orderBits, pEC);
+ gfec_point_mul(productP, ECP_POINT_X(pP), (Ipp8u*)tmpScalarP, orderBits, pEC, pScratchBuffer);
+ gfec_point_add(ECP_POINT_X(pR), productG, productP, pEC);
+
+ cpEcGFpReleasePool(2, pEC);
+ }
+
+ else {
+ gfec_point_prod(ECP_POINT_X(pR),
+ ECP_G(pEC), (Ipp8u*)tmpScalarG,
+ ECP_POINT_X(pP), (Ipp8u*)tmpScalarP,
+ orderBits,
+ pEC, pScratchBuffer);
+ }
+
+ cpGFpReleasePool(2, pGForder);
+ }
+
+ ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
+ return pR;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecsigndsa.c b/ext/ipp/sources/ippcp/src/pcpgfpecsigndsa.c
new file mode 100644
index 0000000..051fd85
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecsigndsa.c
@@ -0,0 +1,331 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// DSA signature generation and verification
+//
+// Contents:
+// ippsGFpECSignDSA()
+// ippsGFpECVerifyDSA()
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsGFpECSignDSA
+//
+// Purpose: DSA Signature Generation.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPrivate
+// NULL == pEphPrivate
+// NULL == pSignC
+// NULL == pSignD
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pMsg->idCtx
+// illegal pRegPrivate->idCtx
+// illegal pEphPrivate->idCtx
+// illegal pSignC->idCtx
+// illegal pSignD->idCtx
+//
+// ippStsMessageErr Msg < 0
+//
+// ippStsRangeErr not enough room for:
+// signC
+// signD
+//
+// ippStsErr (0==signC) || (0==signD)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to be signed
+// pRegPrivate pointer to the regular private key
+// pEphPrivate pointer to the ephemeral private key
+// pSignR,pSignS pointer to the signature
+// pEC pointer to the EC context
+// pScratchBuffer pointer to buffer (1 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECSignDSA,(const IppsBigNumState* pMsg,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignC, IppsBigNumState* pSignD,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg), ippStsMessageErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignC, pSignD);
+ pSignC = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignC, BN_ALIGNMENT) );
+ pSignD = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignD, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignC), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignD), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pSignC)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+ IPP_BADARG_RET((BN_ROOM(pSignD)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ /* test private keys */
+ IPP_BAD_PTR2_RET(pRegPrivate, pEphPrivate);
+ pRegPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pRegPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pRegPrivate), ippStsContextMatchErr);
+ pEphPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pEphPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pEphPrivate), ippStsContextMatchErr);
+
+ {
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ BNU_CHUNK_T* dataC = BN_NUMBER(pSignC);
+ BNU_CHUNK_T* dataD = BN_NUMBER(pSignD);
+ BNU_CHUNK_T* buffD = BN_BUFFER(pSignD);
+ BNU_CHUNK_T* buffMsg = BN_BUFFER(pMsg);
+
+ /* test value of private keys: regPrivate<order, ephPrivate<order */
+ IPP_BADARG_RET(BN_NEGATIVE(pRegPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pRegPrivate), BN_SIZE(pRegPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+ IPP_BADARG_RET(BN_NEGATIVE(pEphPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+ {
+ int elmLen = GFP_FELEN(pGFE);
+ int ns;
+
+ /* compute ephemeral public key */
+ IppsGFpECPoint ephPublic;
+ cpEcGFpInitPoint(&ephPublic, cpEcGFpGetPool(1, pEC), 0, pEC);
+ gfec_MulBasePoint(&ephPublic,
+ BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate),
+ pEC, pScratchBuffer);
+
+ /* C = (ephPublic.x) mod order */
+ gfec_GetPoint(dataC, NULL, &ephPublic, pEC);
+ GFP_METHOD(pGFE)->decode(dataC, dataC, pGFE);
+ ns = cpMod_BNU(dataC, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(dataC+ns, orderLen-ns, 0);
+
+ cpEcGFpReleasePool(1, pEC);
+
+ /* check c!=0 */
+ if(GFP_IS_ZERO(dataC, orderLen)) return ippStsErr;
+
+ /* reduce message: msg = msg mod ordfer */
+ COPY_BNU(buffMsg, BN_NUMBER(pMsg), BN_SIZE(pMsg));
+ ns = cpMod_BNU(buffMsg, BN_SIZE(pMsg), pOrder, orderLen);
+ ZEXPAND_BNU(buffMsg+ns, orderLen-ns, 0);
+
+ /* D = (ephPrivate^-1) * (msg + regPrivate*C) mod order */
+ ZEXPAND_COPY_BNU(buffD, orderLen, BN_NUMBER(pRegPrivate),BN_SIZE(pRegPrivate));
+ cpMontEnc_BNU_EX(buffD, buffD, orderLen, pMontR);
+ cpMontMul_BNU(buffD, buffD, dataC, pMontR);
+ cpModAdd_BNU(buffD, buffD, buffMsg, pOrder, orderLen, dataD);
+
+ ZEXPAND_COPY_BNU(dataD, orderLen, BN_NUMBER(pEphPrivate),BN_SIZE(pEphPrivate));
+
+ //cpMontInv_BNU(dataD, dataD, pMontR); /* d = ephPrivate^-1 */
+ gs_mont_inv(dataD, dataD, pMontR); /* d = ephPrivate^-1 */
+ cpMontMul_BNU(dataD, dataD, buffD, pMontR);
+
+ /* check d!=0 */
+ if(GFP_IS_ZERO(dataD, orderLen)) return ippStsErr;
+
+ /* signC */
+ ns = orderLen;
+ FIX_BNU(dataC, ns);
+ BN_SIGN(pSignC) = ippBigNumPOS;
+ BN_SIZE(pSignC) = ns;
+ /* signD */
+ ns = orderLen;
+ FIX_BNU(dataD, ns);
+ BN_SIGN(pSignD) = ippBigNumPOS;
+ BN_SIZE(pSignD) = ns;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECVerifyDSA
+//
+// Purpose: DSA Signature Verification.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPublic
+// NULL == pSignC
+// NULL == pSignD
+// NULL == pResult
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pMsgDigest->idCtx
+// illegal pRegPublic->idCtx
+// illegal pSignC->idCtx
+// illegal pSignD->idCtx
+//
+// ippStsMessageErr Msg < 0
+// ippStsRangeErr SignC < 0 or SignD < 0
+//
+// ippStsOutOfRangeErr bitsize(pRegPublic) != bitsize(prime)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to being signed
+// pRegPublic pointer to the regular public key
+// pSignC,pSignD pointer to the signature
+// pResult pointer to the result: ippECValid/ippECInvalidSignature
+// pEC pointer to the ECCP context
+// pScratchBuffer pointer to buffer (2 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECVerifyDSA,(const IppsBigNumState* pMsg,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignC, const IppsBigNumState* pSignD,
+ IppECResult* pResult,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg), ippStsMessageErr);
+
+ /* test regular public key */
+ IPP_BAD_PTR1_RET(pRegPublic);
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pRegPublic), ippStsContextMatchErr );
+ IPP_BADARG_RET( ECP_POINT_FELEN(pRegPublic)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignC, pSignD);
+ pSignC = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignC, ALIGN_VAL) );
+ pSignD = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignD, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignC), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignD), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignC), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignD), ippStsRangeErr);
+
+ /* test result */
+ IPP_BAD_PTR1_RET(pResult);
+
+ {
+ IppECResult vResult = ippECInvalidSignature;
+
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ /* test signature value */
+ if(!cpEqu_BNU_CHUNK(BN_NUMBER(pSignC), BN_SIZE(pSignC), 0) &&
+ !cpEqu_BNU_CHUNK(BN_NUMBER(pSignD), BN_SIZE(pSignD), 0) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignC), BN_SIZE(pSignC), pOrder, orderLen) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignD), BN_SIZE(pSignD), pOrder, orderLen)) {
+
+ int elmLen = GFP_FELEN(pGFE);
+ int pelmLen = GFP_PELEN(pGFE);
+ int ns;
+ BNU_CHUNK_T* h1 = cpGFpGetPool(3, pGFE);
+ BNU_CHUNK_T* h2 = h1+pelmLen;
+ BNU_CHUNK_T* h = h2+pelmLen;
+
+ BNU_CHUNK_T* buffMsg = BN_BUFFER(pMsg);
+
+ IppsGFpECPoint P;
+ cpEcGFpInitPoint(&P, cpEcGFpGetPool(1, pEC),0, pEC);
+
+ /* reduce message: h1 = msg mod ordfer */
+ COPY_BNU(buffMsg, BN_NUMBER(pMsg), BN_SIZE(pMsg));
+ ns = cpMod_BNU(buffMsg, BN_SIZE(pMsg), pOrder, orderLen);
+ ZEXPAND_COPY_BNU(h1, orderLen, buffMsg, ns);
+
+ /* h = d^-1, h1 = msg*h, h2 = c*h */
+ ZEXPAND_COPY_BNU(h, orderLen, BN_NUMBER(pSignD),BN_SIZE(pSignD));
+ //cpMontInv_BNU(h, h, pMontR);
+ gs_mont_inv(h, h, pMontR);
+
+ cpMontMul_BNU(h1, h, h1, pMontR);
+ ZEXPAND_COPY_BNU(h2, orderLen, BN_NUMBER(pSignC),BN_SIZE(pSignC));
+ cpMontMul_BNU(h2, h, h2, pMontR);
+
+ /* P = [h1]BasePoint + [h2]publicKey */
+ gfec_BasePointProduct(&P,
+ h1, orderLen, pRegPublic, h2, orderLen,
+ pEC, pScratchBuffer);
+
+ /* get P.X */
+ if(gfec_GetPoint(h1, NULL, &P, pEC)) {
+ /* c' = int(P.x) mod order */
+ GFP_METHOD(pGFE)->decode(h1, h1, pGFE);
+ elmLen = cpMod_BNU(h1, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(h1+elmLen, orderLen-elmLen, 0);
+
+ /* and make sure c' = signC */
+ cpGFpElementCopyPadd(h2, orderLen, BN_NUMBER(pSignC), BN_SIZE(pSignC));
+ if(GFP_EQ(h1, h2, orderLen))
+ vResult = ippECValid;
+ }
+
+ cpEcGFpReleasePool(1, pEC);
+ cpGFpReleasePool(3, pGFE);
+ }
+
+ *pResult = vResult;
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecsignnr.c b/ext/ipp/sources/ippcp/src/pcpgfpecsignnr.c
new file mode 100644
index 0000000..7706887
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecsignnr.c
@@ -0,0 +1,314 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// NR signature generation and verification
+//
+// Contents:
+// ippsGFpECSignNR()
+// ippsGFpECVerifyNR()
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsGFpECSignNR
+//
+// Purpose: NR Signature Generation.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPrivate
+// NULL == pEphPrivate
+// NULL == pSignC
+// NULL == pSignD
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pMsg->idCtx
+// illegal pRegPrivate->idCtx
+// illegal pEphPrivate->idCtx
+// illegal pSignC->idCtx
+// illegal pSignD->idCtx
+//
+// ippStsMessageErr Msg < 0, Msg >= order
+//
+// ippStsRangeErr not enough room for:
+// signC
+// signD
+//
+// ippStsErr (0==signC) || (0==signD)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to be signed
+// pRegPrivate pointer to the regular private key
+// pEphPrivate pointer to the ephemeral private key
+// pSignR,pSignS pointer to the signature
+// pEC pointer to the EC context
+// pScratchBuffer pointer to buffer (1 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECSignNR,(const IppsBigNumState* pMsg,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignC, IppsBigNumState* pSignD,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignC, pSignD);
+ pSignC = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignC, BN_ALIGNMENT) );
+ pSignD = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignD, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignC), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignD), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pSignC)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+ IPP_BADARG_RET((BN_ROOM(pSignD)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ /* test private keys */
+ IPP_BAD_PTR2_RET(pRegPrivate, pEphPrivate);
+ pRegPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pRegPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pRegPrivate), ippStsContextMatchErr);
+ pEphPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pEphPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pEphPrivate), ippStsContextMatchErr);
+
+ {
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ BNU_CHUNK_T* dataC = BN_NUMBER(pSignC);
+ BNU_CHUNK_T* dataD = BN_NUMBER(pSignD);
+ BNU_CHUNK_T* buffD = BN_BUFFER(pSignD);
+
+ /* test value of private keys: regPrivate<order, ephPrivate<order */
+ IPP_BADARG_RET(BN_NEGATIVE(pRegPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pRegPrivate), BN_SIZE(pRegPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+ IPP_BADARG_RET(BN_NEGATIVE(pEphPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+ /* test mesage: 0<msg<order */
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pMsg), BN_SIZE(pMsg), pOrder, orderLen)), ippStsMessageErr);
+
+ {
+ int elmLen = GFP_FELEN(pGFE);
+ int ns;
+
+ /* compute ephemeral public key */
+ IppsGFpECPoint ephPublic;
+ cpEcGFpInitPoint(&ephPublic, cpEcGFpGetPool(1, pEC), 0, pEC);
+ gfec_MulBasePoint(&ephPublic,
+ BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate),
+ pEC, pScratchBuffer);
+
+ /* x = (ephPublic.x) mod order */
+ gfec_GetPoint(dataC, NULL, &ephPublic, pEC);
+ GFP_METHOD(pGFE)->decode(dataC, dataC, pGFE);
+ ns = cpMod_BNU(dataC, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(dataC+ns, orderLen-ns, 0);
+
+ cpEcGFpReleasePool(1, pEC);
+
+ /* C = (ephPublic.x + msg) mod order */
+ ZEXPAND_COPY_BNU(dataD, orderLen, BN_NUMBER(pMsg), BN_SIZE(pMsg));
+ cpModAdd_BNU(dataC, dataC, dataD, pOrder, orderLen, dataD);
+
+ /* check c!=0 */
+ if(GFP_IS_ZERO(dataC, orderLen)) return ippStsErr;
+
+ /* D = (ephPrivate - regPrivate*C) mod order */
+ ZEXPAND_COPY_BNU(buffD, orderLen, BN_NUMBER(pRegPrivate),BN_SIZE(pRegPrivate));
+ cpMontEnc_BNU_EX(dataD, buffD, orderLen, pMontR);
+ cpMontMul_BNU(buffD, dataD, dataC, pMontR);
+ ZEXPAND_COPY_BNU(dataD, orderLen, BN_NUMBER(pEphPrivate),BN_SIZE(pEphPrivate));
+ cpModSub_BNU(dataD, dataD, buffD, pOrder, orderLen, buffD);
+
+ /* signC */
+ ns = orderLen;
+ FIX_BNU(dataC, ns);
+ BN_SIGN(pSignC) = ippBigNumPOS;
+ BN_SIZE(pSignC) = ns;
+ /* signD */
+ ns = orderLen;
+ FIX_BNU(dataD, ns);
+ BN_SIGN(pSignD) = ippBigNumPOS;
+ BN_SIZE(pSignD) = ns;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECVerifyNR
+//
+// Purpose: NR Signature Verification.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPublic
+// NULL == pSignC
+// NULL == pSignD
+// NULL == pResult
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pMsgDigest->idCtx
+// illegal pRegPublic->idCtx
+// illegal pSignC->idCtx
+// illegal pSignD->idCtx
+//
+// ippStsMessageErr Msg < 0, Msg >= order
+//
+// ippStsRangeErr SignC < 0 or SignD < 0
+//
+// ippStsOutOfRangeErr bitsize(pRegPublic) != bitsize(prime)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to being signed
+// pRegPublic pointer to the regular public key
+// pSignC,pSignD pointer to the signature
+// pResult pointer to the result: ippECValid/ippECInvalidSignature
+// pEC pointer to the ECCP context
+// pScratchBuffer pointer to buffer (2 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECVerifyNR,(const IppsBigNumState* pMsg,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignC, const IppsBigNumState* pSignD,
+ IppECResult* pResult,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+
+ /* test regular public key */
+ IPP_BAD_PTR1_RET(pRegPublic);
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pRegPublic), ippStsContextMatchErr );
+ IPP_BADARG_RET( ECP_POINT_FELEN(pRegPublic)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignC, pSignD);
+ pSignC = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignC, ALIGN_VAL) );
+ pSignD = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignD, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignC), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignD), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignC), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignD), ippStsRangeErr);
+
+ /* test result */
+ IPP_BAD_PTR1_RET(pResult);
+
+ {
+ IppECResult vResult = ippECInvalidSignature;
+
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ /* test mesage: 0<msg<order */
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pMsg), BN_SIZE(pMsg), pOrder, orderLen)), ippStsMessageErr);
+ /* test signature value */
+ if(!cpEqu_BNU_CHUNK(BN_NUMBER(pSignC), BN_SIZE(pSignC), 0) &&
+ !cpEqu_BNU_CHUNK(BN_NUMBER(pSignD), BN_SIZE(pSignD), 0) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignC), BN_SIZE(pSignC), pOrder, orderLen) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignD), BN_SIZE(pSignD), pOrder, orderLen)) {
+
+ int elmLen = GFP_FELEN(pGFE);
+ int pelmLen = GFP_PELEN(pGFE);
+
+ BNU_CHUNK_T* h1 = cpGFpGetPool(3, pGFE);
+ BNU_CHUNK_T* h2 = h1+pelmLen;
+ BNU_CHUNK_T* f = h2+pelmLen;
+
+ IppsGFpECPoint P;
+ cpEcGFpInitPoint(&P, cpEcGFpGetPool(1, pEC),0, pEC);
+
+ /* P = [d]BasePoint + [c]publicKey */
+ ZEXPAND_COPY_BNU(h1, orderLen, BN_NUMBER(pSignD),BN_SIZE(pSignD));
+ ZEXPAND_COPY_BNU(h2, orderLen, BN_NUMBER(pSignC),BN_SIZE(pSignC));
+ gfec_BasePointProduct(&P,
+ h1, orderLen, pRegPublic, h2, orderLen,
+ pEC, pScratchBuffer);
+
+ /* get P.X */
+ if(gfec_GetPoint(h1, NULL, &P, pEC)) {
+ /* x = int(P.x) mod order */
+ GFP_METHOD(pGFE)->decode(h1, h1, pGFE);
+ elmLen = cpMod_BNU(h1, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(h1+elmLen, orderLen-elmLen, 0);
+
+ /* and recover msg f = (signC -x) mod order */
+ ZEXPAND_COPY_BNU(f, orderLen, BN_NUMBER(pMsg),BN_SIZE(pMsg));
+ cpModSub_BNU(h1, h2, h1, pOrder, orderLen, h2);
+ if(GFP_EQ(f, h1, orderLen))
+ vResult = ippECValid;
+ }
+
+ cpEcGFpReleasePool(1, pEC);
+ cpGFpReleasePool(3, pGFE);
+ }
+
+ *pResult = vResult;
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecsignsm2.c b/ext/ipp/sources/ippcp/src/pcpgfpecsignsm2.c
new file mode 100644
index 0000000..25d91e9
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecsignsm2.c
@@ -0,0 +1,349 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// SM2 signature generation and verification
+//
+// Contents:
+// ippsGFpECSignSM2()
+// ippsGFpECVerifySM2()
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpeccp.h"
+
+
+/*F*
+// Name: ippsGFpECSignSM2
+//
+// Purpose: SM2 Signature Generation.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPrivate
+// NULL == pEphPrivate
+// NULL == pSignR
+// NULL == pSignS
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pEC->idCtx
+// illegal pMsg->idCtx
+// illegal pRegPrivate->idCtx
+// illegal pEphPrivate->idCtx
+// illegal pSignR->idCtx
+// illegal pSignS->idCtx
+//
+// ippStsMessageErr Msg < 0
+//
+// ippStsRangeErr not enough room for:
+// signR
+// signS
+//
+// ippECInvalidSignature (0==signR)
+// (0==signS)
+// (signR + ephPrivate) == order
+// (1 + regPrivate) == order
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to be signed
+// pRegPrivate pointer to the regular private key
+// pEphPrivate pointer to the ephemeral private key
+// pSignR,pSignS pointer to the signature
+// pEC pointer to the EC context
+// pScratchBuffer pointer to buffer (1 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECSignSM2,(const IppsBigNumState* pMsg,
+ const IppsBigNumState* pRegPrivate,
+ const IppsBigNumState* pEphPrivate,
+ IppsBigNumState* pSignR, IppsBigNumState* pSignS,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg), ippStsMessageErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignS, pSignR);
+ pSignR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignR, ALIGN_VAL) );
+ pSignS = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignS, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignR), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignS), ippStsContextMatchErr);
+ IPP_BADARG_RET((BN_ROOM(pSignR)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+ IPP_BADARG_RET((BN_ROOM(pSignS)*BITSIZE(BNU_CHUNK_T)<ECP_ORDBITSIZE(pEC)), ippStsRangeErr);
+
+ /* test private keys */
+ IPP_BAD_PTR2_RET(pRegPrivate, pEphPrivate);
+ pRegPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pRegPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pRegPrivate), ippStsContextMatchErr);
+ pEphPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pEphPrivate, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pEphPrivate), ippStsContextMatchErr);
+
+ {
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ BNU_CHUNK_T* dataR = BN_NUMBER(pSignR);
+ BNU_CHUNK_T* dataS = BN_NUMBER(pSignS);
+ BNU_CHUNK_T* buffR = BN_BUFFER(pSignR);
+ BNU_CHUNK_T* buffS = BN_BUFFER(pSignS);
+ BNU_CHUNK_T* buffMsg = BN_BUFFER(pMsg);
+
+ /* test value of private keys: regPrivate<order, ephPrivate<order */
+ IPP_BADARG_RET(BN_NEGATIVE(pRegPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pRegPrivate), BN_SIZE(pRegPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+ IPP_BADARG_RET(BN_NEGATIVE(pEphPrivate) ||
+ (0<=cpCmp_BNU(BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate), pOrder, orderLen)), ippStsIvalidPrivateKey);
+
+ /* test value of private key: (regPrivate+1) != order */
+ ZEXPAND_COPY_BNU(dataS,orderLen, BN_NUMBER(pRegPrivate),BN_SIZE(pRegPrivate));
+ cpInc_BNU(dataS, dataS, orderLen, 1);
+ IPP_BADARG_RET(0==cpCmp_BNU(dataS, orderLen, pOrder, orderLen), ippStsIvalidPrivateKey);
+
+ {
+ int elmLen = GFP_FELEN(pGFE);
+ int ns;
+
+ /* compute ephemeral public key */
+ IppsGFpECPoint ephPublic;
+ cpEcGFpInitPoint(&ephPublic, cpEcGFpGetPool(1, pEC), 0, pEC);
+ gfec_MulBasePoint(&ephPublic,
+ BN_NUMBER(pEphPrivate), BN_SIZE(pEphPrivate),
+ pEC, pScratchBuffer);
+
+ /* extract X component: ephPublicX = (ephPublic.x) mod order */
+ gfec_GetPoint(dataR, NULL, &ephPublic, pEC);
+ GFP_METHOD(pGFE)->decode(dataR, dataR, pGFE);
+ ns = cpMod_BNU(dataR, elmLen, pOrder, orderLen);
+ cpGFpElementPadd(dataR+ns, orderLen-ns, 0);
+
+ cpEcGFpReleasePool(1, pEC);
+
+ /* reduce message: msg = msg mod ordfer */
+ COPY_BNU(buffMsg, BN_NUMBER(pMsg), BN_SIZE(pMsg));
+ ns = cpMod_BNU(buffMsg, BN_SIZE(pMsg), pOrder, orderLen);
+ ZEXPAND_BNU(buffMsg+ns, orderLen-ns, 0);
+
+ /* compute R signature component: r = (msg + ephPublicX) mod order */
+ cpModAdd_BNU(dataR, dataR, buffMsg, pOrder, orderLen, buffR);
+
+ /* t = (r+ephPrivate) mod order */
+ ZEXPAND_COPY_BNU(buffR,orderLen, BN_NUMBER(pEphPrivate),BN_SIZE(pEphPrivate));
+ cpModAdd_BNU(buffR, buffR, dataR, pOrder, orderLen, buffS);
+
+ /* check r!=0 and t!=0 */
+ if(GFP_IS_ZERO(dataR, orderLen) || GFP_IS_ZERO(buffR, orderLen)) return ippStsErr;
+
+ /* compute S signature component: S = (1+regPrivate)^1 *(ephPrivate-r*regPrivate) mod order */
+ ZEXPAND_COPY_BNU(buffS,orderLen, BN_NUMBER(pRegPrivate),BN_SIZE(pRegPrivate));
+ cpMontEnc_BNU_EX(buffR, dataR, orderLen, pMontR); /* r */
+ cpMontMul_BNU(buffR, buffR, buffS, /* r*=regPrivate */
+ pMontR);
+ ZEXPAND_COPY_BNU(buffS,orderLen, BN_NUMBER(pEphPrivate),BN_SIZE(pEphPrivate));
+ cpModSub_BNU(buffS, buffS, buffR, pOrder, orderLen, buffR); /* k -=r */
+
+ //cpMontInv_BNU(dataS, dataS, pMontR); /* s = (1+regPrivate)^-1 */
+ gs_mont_inv(dataS, dataS, pMontR); /* s = (1+regPrivate)^-1 */
+ cpMontMul_BNU(dataS, dataS, buffS, pMontR); /* s *= k */
+
+ /* check s!=0 */
+ if(GFP_IS_ZERO(dataS, orderLen)) return ippStsErr;
+
+ /* signR */
+ ns = orderLen;
+ FIX_BNU(dataR, ns);
+ BN_SIGN(pSignR) = ippBigNumPOS;
+ BN_SIZE(pSignR) = ns;
+ /* signS */
+ ns = orderLen;
+ FIX_BNU(dataS, ns);
+ BN_SIGN(pSignS) = ippBigNumPOS;
+ BN_SIZE(pSignS) = ns;
+
+ return ippStsNoErr;
+ }
+ }
+}
+
+
+/*F*
+// Name: ippsGFpECVerifySM2
+//
+// Purpose: SM2 Signature Verification.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pEC
+// NULL == pMsg
+// NULL == pRegPublic
+// NULL == pSignR
+// NULL == pSignS
+// NULL == pResult
+// NULL == pScratchBuffer
+//
+// ippStsContextMatchErr illegal pECC->idCtx
+// illegal pMsgDigest->idCtx
+// illegal pRegPublic->idCtx
+// illegal pSignR->idCtx
+// illegal pSignS->idCtx
+//
+// ippStsMessageErr Msg < 0
+// ippStsRangeErr SignR < 0 or SignS < 0
+//
+// ippStsOutOfRangeErr bitsize(pRegPublic) != bitsize(prime)
+//
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the message representative to being signed
+// pRegPublic pointer to the regular public key
+// pSignR,pSignS pointer to the signature
+// pResult pointer to the result: ippECValid/ippECInvalidSignature
+// pEC pointer to the ECCP context
+// pScratchBuffer pointer to buffer (2 mul_point operation)
+//
+*F*/
+IPPFUN(IppStatus, ippsGFpECVerifySM2,(const IppsBigNumState* pMsg,
+ const IppsGFpECPoint* pRegPublic,
+ const IppsBigNumState* pSignR, const IppsBigNumState* pSignS,
+ IppECResult* pResult,
+ IppsGFpECState* pEC,
+ Ipp8u* pScratchBuffer))
+{
+ IppsGFpState* pGF;
+ gsModEngine* pGFE;
+
+ /* EC context and buffer */
+ IPP_BAD_PTR2_RET(pEC, pScratchBuffer);
+ pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) );
+ IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr);
+
+ pGF = ECP_GFP(pEC);
+ pGFE = GFP_PMA(pGF);
+ IPP_BADARG_RET(1<GFP_EXTDEGREE(pGFE), ippStsNotSupportedModeErr);
+
+ /* test message representative */
+ IPP_BAD_PTR1_RET(pMsg);
+ pMsg = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMsg, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMsg), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pMsg), ippStsMessageErr);
+
+ /* test regular public key */
+ IPP_BAD_PTR1_RET(pRegPublic);
+ IPP_BADARG_RET( !ECP_POINT_TEST_ID(pRegPublic), ippStsContextMatchErr );
+ IPP_BADARG_RET( ECP_POINT_FELEN(pRegPublic)!=GFP_FELEN(pGFE), ippStsOutOfRangeErr);
+
+ /* test signature */
+ IPP_BAD_PTR2_RET(pSignR, pSignS);
+ pSignR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignR, ALIGN_VAL) );
+ pSignS = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSignS, ALIGN_VAL) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSignR), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pSignS), ippStsContextMatchErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignR), ippStsRangeErr);
+ IPP_BADARG_RET(BN_NEGATIVE(pSignS), ippStsRangeErr);
+
+ /* test result */
+ IPP_BAD_PTR1_RET(pResult);
+
+ {
+ IppECResult vResult = ippECInvalidSignature;
+
+ gsModEngine* pMontR = ECP_MONT_R(pEC);
+ BNU_CHUNK_T* pOrder = MOD_MODULUS(pMontR);
+ int orderLen = MOD_LEN(pMontR);
+
+ /* test signature value */
+ if(!cpEqu_BNU_CHUNK(BN_NUMBER(pSignR), BN_SIZE(pSignR), 0) &&
+ !cpEqu_BNU_CHUNK(BN_NUMBER(pSignS), BN_SIZE(pSignS), 0) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignR), BN_SIZE(pSignR), pOrder, orderLen) &&
+ 0>cpCmp_BNU(BN_NUMBER(pSignS), BN_SIZE(pSignS), pOrder, orderLen)) {
+
+ int elmLen = GFP_FELEN(pGFE);
+ int ns;
+
+ BNU_CHUNK_T* r = cpGFpGetPool(4, pGFE);
+ BNU_CHUNK_T* s = r+orderLen;
+ BNU_CHUNK_T* t = s+orderLen;
+ BNU_CHUNK_T* f = t+orderLen;
+
+ /* reduce message */
+ BNU_CHUNK_T* pMsgData = BN_NUMBER(pMsg);
+ BNU_CHUNK_T* pMsgBuff = BN_BUFFER(pMsg);
+ int msgLen = BN_SIZE(pMsg);
+ COPY_BNU(pMsgBuff, pMsgData, msgLen);
+ msgLen = cpMod_BNU(pMsgBuff, msgLen, pOrder, orderLen);
+ cpGFpElementPadd(pMsgBuff+msgLen, orderLen-msgLen, 0);
+
+ /* expand signatire's components */
+ cpGFpElementCopyPadd(r, orderLen, BN_NUMBER(pSignR), BN_SIZE(pSignR));
+ cpGFpElementCopyPadd(s, orderLen, BN_NUMBER(pSignS), BN_SIZE(pSignS));
+
+ /* t = (r+s) mod order */
+ cpModAdd_BNU(t, r, s, pOrder, orderLen, f);
+
+ /* P = [s]G +[t]regPublic, t = P.x */
+ {
+ IppsGFpECPoint P, G;
+ cpEcGFpInitPoint(&P, cpEcGFpGetPool(1, pEC),0, pEC);
+ cpEcGFpInitPoint(&G, ECP_G(pEC), ECP_AFFINE_POINT|ECP_FINITE_POINT, pEC);
+
+ gfec_BasePointProduct(&P,
+ s, orderLen, pRegPublic, t, orderLen,
+ pEC, pScratchBuffer);
+
+ gfec_GetPoint(t, NULL, &P, pEC);
+ GFP_METHOD(pGFE)->decode(t, t, pGFE);
+ ns = cpMod_BNU(t, elmLen, pOrder, orderLen);
+
+ cpEcGFpReleasePool(1, pEC);
+ }
+
+ /* t = (msg+t) mod order */
+ cpModAdd_BNU(t, t, pMsgBuff, pOrder, orderLen, f);
+
+ if(GFP_EQ(t, r, orderLen))
+ vResult = ippECValid;
+
+ cpGFpReleasePool(4, pGFE);
+ }
+
+ *pResult = vResult;
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpecstuff.h b/ext/ipp/sources/ippcp/src/pcpgfpecstuff.h
new file mode 100644
index 0000000..b237201
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpecstuff.h
@@ -0,0 +1,342 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Internal EC over GF(p^m) basic Definitions & Function Prototypes
+//
+//
+*/
+
+#if !defined(_CP_ECGFP_H_)
+#define _CP_ECGFP_H_
+
+#include "pcpgfpstuff.h"
+#include "pcpgfpxstuff.h"
+
+#define _LEGACY_ECCP_SUPPORT_
+
+/*
+// EC over GF(p) Point context
+*/
+typedef struct _cpGFpECPoint {
+ IppCtxId idCtx; /* EC Point identifier */
+ int flags; /* flags: affine */
+ int elementSize; /* size of each coordinate */
+ BNU_CHUNK_T* pData; /* coordinatex X, Y, Z */
+} cpGFPECPoint;
+
+/*
+// Contetx Access Macros
+*/
+#define ECP_POINT_ID(ctx) ((ctx)->idCtx)
+#define ECP_POINT_FLAGS(ctx) ((ctx)->flags)
+#define ECP_POINT_FELEN(ctx) ((ctx)->elementSize)
+#define ECP_POINT_DATA(ctx) ((ctx)->pData)
+#define ECP_POINT_X(ctx) ((ctx)->pData)
+#define ECP_POINT_Y(ctx) ((ctx)->pData+(ctx)->elementSize)
+#define ECP_POINT_Z(ctx) ((ctx)->pData+(ctx)->elementSize*2)
+#define ECP_POINT_TEST_ID(ctx) (ECP_POINT_ID((ctx))==idCtxGFPPoint)
+
+/* point flags */
+#define ECP_AFFINE_POINT (1)
+#define ECP_FINITE_POINT (2)
+
+#define IS_ECP_AFFINE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&ECP_AFFINE_POINT)
+#define SET_ECP_AFFINE_POINT(ctx) (ECP_POINT_FLAGS((ctx))|ECP_AFFINE_POINT)
+#define SET_ECP_PROJECTIVE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&~ECP_AFFINE_POINT)
+
+#define IS_ECP_FINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&ECP_FINITE_POINT)
+#define SET_ECP_FINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))|ECP_FINITE_POINT)
+#define SET_ECP_INFINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&~ECP_FINITE_POINT)
+
+/*
+// define using projective coordinates
+*/
+#define JACOBIAN (0)
+#define HOMOGENEOUS (1)
+#define ECP_PROJECTIVE_COORD JACOBIAN
+//#define ECP_PROJECTIVE_COORD HOMOGENEOUS
+
+#if (ECP_PROJECTIVE_COORD== JACOBIAN)
+ //#pragma message ("ECP_PROJECTIVE_COORD = JACOBIAN")
+#elif (ECP_PROJECTIVE_COORD== HOMOGENEOUS)
+ #pragma message ("ECP_PROJECTIVE_COORD = HOMOGENEOUS")
+#else
+ #error ECP_PROJECTIVE_COORD should be either JACOBIAN or HOMOGENEOUS type
+#endif
+
+
+/*
+// pre-computed Base Point descriptor
+*/
+typedef void (*selectAP) (BNU_CHUNK_T* pAP, const BNU_CHUNK_T* pAPtbl, int index);
+
+typedef struct _cpPrecompAP {
+ int w; /* scalar's window bitsize */
+ selectAP select_affine_point; /* get affine point function */
+ const BNU_CHUNK_T* pTbl; /* pre-computed table */
+} cpPrecompAP;
+
+
+/* EC over GF(p) context */
+typedef struct _cpGFpEC {
+ IppCtxId idCtx; /* EC identifier */
+
+ IppsGFpState* pGF; /* arbitrary GF(p^d)*/
+
+ int elementSize; /* length of EC point */
+ int orderBitSize; /* base_point order bitsize */
+ BNU_CHUNK_T* pA; /* EC parameter A */
+ BNU_CHUNK_T* pB; /* B */
+ BNU_CHUNK_T* pG; /* base_point */
+ BNU_CHUNK_T* cofactor; /* cofactor = #E/base_point order */
+ int parmAspc; /* NIST's, EPIDv2.0 A-parameter specific */
+ int infinity; /* 0/1 if B !=0/==0 */
+ const cpPrecompAP* pBaseTbl; /* address of pre-computed [n]G tabble */
+ gsModEngine* pMontR; /* EC order montgomery engine */
+
+ BNU_CHUNK_T* pPool; /* pool of points */
+ #if defined(_LEGACY_ECCP_SUPPORT_)
+ BNU_CHUNK_T* pPublic; /* regular public key */
+ BNU_CHUNK_T* pPublicE; /* ephemeral public key */
+ BNU_CHUNK_T* pPrivat; /* regular private key */
+ BNU_CHUNK_T* pPrivatE; /* ephemeral private key */
+ BNU_CHUNK_T* pBuffer; /* pointer to scaratch buffer (for lagacy ECCP only) */
+ #endif
+} cpGFPEC;
+
+#define ECGFP_ALIGNMENT ((int)(sizeof(void*)))
+
+/* Local definitions */
+#define EC_POOL_SIZE (10) /* num of points into the pool */
+
+#define EC_MONT_POOL_SIZE (4) /* num of temp values for modular arithmetic */
+
+#define ECP_ID(pCtx) ((pCtx)->idCtx)
+#define ECP_GFP(pCtx) ((pCtx)->pGF)
+#define ECP_POINTLEN(pCtx) ((pCtx)->elementSize)
+#define ECP_ORDBITSIZE(pCtx) ((pCtx)->orderBitSize)
+#define ECP_COFACTOR(pCtx) ((pCtx)->cofactor)
+#define ECP_SPECIFIC(pCtx) ((pCtx)->parmAspc)
+#define ECP_INFINITY(pCtx) ((pCtx)->infinity)
+#define ECP_A(pCtx) ((pCtx)->pA)
+#define ECP_B(pCtx) ((pCtx)->pB)
+#define ECP_G(pCtx) ((pCtx)->pG)
+#define ECP_PREMULBP(pCtx) ((pCtx)->pBaseTbl)
+#define ECP_MONT_R(pCtx) ((pCtx)->pMontR)
+#define ECP_POOL(pCtx) ((pCtx)->pPool)
+#if defined(_LEGACY_ECCP_SUPPORT_)
+ #define ECP_PUBLIC(pCtx) ((pCtx)->pPublic)
+ #define ECP_PUBLIC_E(pCtx) ((pCtx)->pPublicE)
+ #define ECP_PRIVAT(pCtx) ((pCtx)->pPrivat)
+ #define ECP_PRIVAT_E(pCtx) ((pCtx)->pPrivatE)
+ #define ECP_SBUFFER(pCtx) ((pCtx)->pBuffer)
+#endif
+
+#define ECP_TEST_ID(pCtx) (ECP_ID((pCtx))==idCtxGFPEC)
+
+/* EC curve specific (a-parameter) */
+#define ECP_Acom (0) /* commont case */
+#define ECP_Ami3 (1) /* a=-3 NIST's and SM2 curve */
+#define ECP_Aeq0 (2) /* a=0 EPIDv2.0 curve */
+
+#define ECP_ARB ECP_Acom
+#define ECP_STD ECP_Ami3
+#define ECP_EPID2 ECP_Aeq0
+
+/* std ec pre-computed tables */
+#define gfpec_precom_nistP192r1_fun OWNAPI(gfpec_precom_nistP192r1_fun)
+#define gfpec_precom_nistP224r1_fun OWNAPI(gfpec_precom_nistP224r1_fun)
+#define gfpec_precom_nistP256r1_fun OWNAPI(gfpec_precom_nistP256r1_fun)
+#define gfpec_precom_nistP384r1_fun OWNAPI(gfpec_precom_nistP384r1_fun)
+#define gfpec_precom_nistP521r1_fun OWNAPI(gfpec_precom_nistP521r1_fun)
+#define gfpec_precom_sm2_fun OWNAPI(gfpec_precom_sm2_fun)
+
+const cpPrecompAP* gfpec_precom_nistP192r1_fun(void);
+const cpPrecompAP* gfpec_precom_nistP224r1_fun(void);
+const cpPrecompAP* gfpec_precom_nistP256r1_fun(void);
+const cpPrecompAP* gfpec_precom_nistP384r1_fun(void);
+const cpPrecompAP* gfpec_precom_nistP521r1_fun(void);
+const cpPrecompAP* gfpec_precom_sm2_fun(void);
+
+/*
+// get/release n points from/to the pool
+*/
+__INLINE BNU_CHUNK_T* cpEcGFpGetPool(int n, IppsGFpECState* pEC)
+{
+ BNU_CHUNK_T* pPool = ECP_POOL(pEC);
+ ECP_POOL(pEC) += n*GFP_FELEN(GFP_PMA(ECP_GFP(pEC)))*3;
+ return pPool;
+}
+__INLINE void cpEcGFpReleasePool(int n, IppsGFpECState* pEC)
+{
+ ECP_POOL(pEC) -= n*GFP_FELEN(GFP_PMA(ECP_GFP(pEC)))*3;
+}
+
+__INLINE IppsGFpECPoint* cpEcGFpInitPoint(IppsGFpECPoint* pPoint, BNU_CHUNK_T* pData, int flags, const IppsGFpECState* pEC)
+{
+ ECP_POINT_ID(pPoint) = idCtxGFPPoint;
+ ECP_POINT_FLAGS(pPoint) = flags;
+ ECP_POINT_FELEN(pPoint) = GFP_FELEN(GFP_PMA(ECP_GFP(pEC)));
+ ECP_POINT_DATA(pPoint) = pData;
+ return pPoint;
+}
+
+/* copy one point into another */
+__INLINE IppsGFpECPoint* gfec_CopyPoint(IppsGFpECPoint* pPointR, const IppsGFpECPoint* pPointA, int elemLen)
+{
+ cpGFpElementCopy(ECP_POINT_DATA(pPointR), ECP_POINT_DATA(pPointA), 3*elemLen);
+ ECP_POINT_FLAGS(pPointR) = ECP_POINT_FLAGS(pPointA);
+ return pPointR;
+}
+
+
+__INLINE IppsGFpECPoint* gfec_SetPointAtInfinity(IppsGFpECPoint* pPoint)
+{
+ int elemLen = ECP_POINT_FELEN(pPoint);
+ cpGFpElementPadd(ECP_POINT_X(pPoint), elemLen, 0);
+ cpGFpElementPadd(ECP_POINT_Y(pPoint), elemLen, 0);
+ cpGFpElementPadd(ECP_POINT_Z(pPoint), elemLen, 0);
+ ECP_POINT_FLAGS(pPoint) = 0;
+ return pPoint;
+}
+
+/*
+// test infinity:
+// IsProjectivePointAtInfinity
+*/
+__INLINE int gfec_IsPointAtInfinity(const IppsGFpECPoint* pPoint)
+{
+ return GFP_IS_ZERO( ECP_POINT_Z(pPoint), ECP_POINT_FELEN(pPoint));
+}
+
+
+
+/* signed encode */
+__INLINE void booth_recode(Ipp8u* sign, Ipp8u* digit, Ipp8u in, int w)
+{
+ Ipp8u s = ~((in >> w) - 1);
+ int d = (1 << (w+1)) - in - 1;
+ d = (d & s) | (in & ~s);
+ d = (d >> 1) + (d & 1);
+ *sign = s & 1;
+ *digit = (Ipp8u)d;
+}
+
+/* returns 1/0 if x==0/!=0 */
+__INLINE BNU_CHUNK_T isZero(BNU_CHUNK_T x)
+{
+ #if (BNU_CHUNK_BITS == BNU_CHUNK_64BIT)
+ x |= x<<32;
+ #endif
+ x |= x<<16;
+ x |= x<<8;
+ x |= x<<4;
+ x |= x<<2;
+ x |= x<<1;
+ x = ~x;
+ x>>=BNU_CHUNK_BITS-1;
+ return x;
+}
+
+/* mask of the argument:
+ if x==0 returns 0
+ if x!=0 returns BNU_CHUNK_T(-1)
+*/
+__INLINE BNU_CHUNK_T cpIsNonZeroMask(BNU_CHUNK_T x)
+{
+ #if(_IPP_ARCH==_IPP_ARCH_EM64T)
+ x |= x>>32;
+ #endif
+ x |= x>>16;
+ x |= x>>8;
+ x |= x>>4;
+ x |= x>>2;
+ x |= x>>1;
+ return 0-(x&1);
+}
+
+/* dst[] = src[], iif moveFlag!=0 */
+__INLINE void cpMaskMove(BNU_CHUNK_T* dst, const BNU_CHUNK_T* src, int len, int moveFlag)
+{
+ BNU_CHUNK_T mask1 = cpIsNonZeroMask(moveFlag);
+ BNU_CHUNK_T mask2 = ~mask1;
+ int n;
+ for(n=0; n<len; n++)
+ dst[n] = (src[n] & mask1) ^ (dst[n] & mask2);
+}
+
+
+
+/* size of context */
+#define cpGFpECGetSize OWNAPI(cpGFpECGetSize)
+ int cpGFpECGetSize(int deg, int basicElmBitSize);
+
+/* point operations */
+#define gfec_GetPoint OWNAPI(gfec_GetPoint)
+ int gfec_GetPoint(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, const IppsGFpECPoint* pPoint, IppsGFpECState* pEC);
+#define gfec_SetPoint OWNAPI(gfec_SetPoint)
+ int gfec_SetPoint(BNU_CHUNK_T* pP, const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY, IppsGFpECState* pEC);
+#define gfec_MakePoint OWNAPI(gfec_MakePoint)
+ int gfec_MakePoint(IppsGFpECPoint* pPoint, const BNU_CHUNK_T* pElm, IppsGFpECState* pEC);
+#define gfec_ComparePoint OWNAPI(gfec_ComparePoint)
+ int gfec_ComparePoint(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC);
+#define gfec_IsPointOnCurve OWNAPI(gfec_IsPointOnCurve)
+ int gfec_IsPointOnCurve(const IppsGFpECPoint* pP, IppsGFpECState* pEC);
+
+#define gfec_NegPoint OWNAPI(gfec_NegPoint)
+IppsGFpECPoint* gfec_NegPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, IppsGFpECState* pEC);
+#define gfec_DblPoint OWNAPI(gfec_DblPoint)
+IppsGFpECPoint* gfec_DblPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, IppsGFpECState* pEC);
+#define gfec_AddPoint OWNAPI(gfec_AddPoint)
+IppsGFpECPoint* gfec_AddPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC);
+#define gfec_MulPoint OWNAPI(gfec_MulPoint)
+IppsGFpECPoint* gfec_MulPoint(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalar, int scalarLen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
+#define gfec_MulBasePoint OWNAPI(gfec_MulBasePoint)
+IppsGFpECPoint* gfec_MulBasePoint(IppsGFpECPoint* pR,
+ const BNU_CHUNK_T* pScalar, int scalarLen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
+#define gfec_PointProduct OWNAPI(gfec_PointProduct)
+IppsGFpECPoint* gfec_PointProduct(IppsGFpECPoint* pR,
+ const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
+ const IppsGFpECPoint* pQ, const BNU_CHUNK_T* pScalarQ, int scalarQlen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
+#define gfec_BasePointProduct OWNAPI(gfec_BasePointProduct)
+IppsGFpECPoint* gfec_BasePointProduct(IppsGFpECPoint* pR,
+ const BNU_CHUNK_T* pScalarG, int scalarGlen,
+ const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
+ IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
+
+#define p192r1_select_ap_w7 OWNAPI(p192r1_select_ap_w7)
+ void p192r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
+#define p224r1_select_ap_w7 OWNAPI(p224r1_select_ap_w7)
+ void p224r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
+#define p256r1_select_ap_w7 OWNAPI(p256r1_select_ap_w7)
+ void p256r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
+#define p384r1_select_ap_w5 OWNAPI(p384r1_select_ap_w5)
+ void p384r1_select_ap_w5(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
+#define p521r1_select_ap_w5 OWNAPI(p521r1_select_ap_w5)
+ void p521r1_select_ap_w5(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
+
+#endif /* _CP_ECGFP_H_ */
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod.h b/ext/ipp/sources/ippcp/src/pcpgfpmethod.h
new file mode 100644
index 0000000..1891c67
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod.h
@@ -0,0 +1,62 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives
+// Internal GF(p) basic Definitions & Function Prototypes
+//
+*/
+#if !defined(_CP_GFP_METHOD_H)
+#define _CP_GFP_METHOD_H
+
+#include "owncp.h"
+
+#include "pcpbnuimpl.h"
+#include "gsmodmethod.h"
+
+/* modulus ID */
+typedef enum {
+ cpID_Prime = 0x1000,
+ cpID_PrimeP192r1 = cpID_Prime+6,
+ cpID_PrimeP224r1 = cpID_Prime+7,
+ cpID_PrimeP256r1 = cpID_Prime+8,
+ cpID_PrimeP384r1 = cpID_Prime+9,
+ cpID_PrimeP521r1 = cpID_Prime+10,
+ cpID_PrimeTPM_SM2 = cpID_Prime+11,
+ cpID_PrimeTPM_BN = cpID_Prime+12,
+
+ cpID_Poly = 0x10000000, /* id=0x10000000: general polynomial */
+ cpID_Binom = 0x01000000, /* id=0x11000000: x^d+a */
+
+ cpID_Binom2_epid20 = cpID_Binom|0x220000, /* 0x11220000 */
+ cpID_Binom3_epid20 = cpID_Binom|0x230000 /* 0x11230000 */
+
+} cpModulusID;
+
+typedef struct _cpGFpMethod {
+ cpModulusID modulusID;
+ int modulusBitDeg;
+ const BNU_CHUNK_T* modulus;
+ const gsModMethod* arith;
+} cpGFpMethod;
+
+/* common GF arith methods */
+#define gsArithGFp OWNAPI(gsArithGFp)
+gsModMethod* gsArithGFp(void);
+
+#endif /* _CP_GFP_METHOD_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_192r1.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_192r1.c
new file mode 100644
index 0000000..3fb5861
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_192r1.c
@@ -0,0 +1,180 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over P-192r1 NIST modulus */
+BNU_CHUNK_T* p192r1_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+BNU_CHUNK_T* p192r1_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* p192r1_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p192r1_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#endif
+
+#define OPERAND_BITSIZE (192)
+#define LEN_P192 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// ia32 multiplicative methods
+*/
+#if (_IPP_ARCH ==_IPP_ARCH_IA32)
+static BNU_CHUNK_T* p192r1_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMulAdc_BNU_school(product, pA,LEN_P192, pB,LEN_P192);
+ p192r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* p192r1_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpSqrAdc_BNU_school(product, pA,LEN_P192);
+ p192r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static BNU_CHUNK_T RR[] = {
+ 0x00000001,0x00000000,0x00000002,0x00000000,
+ 0x00000001,0x00000000};
+
+static BNU_CHUNK_T one[] = {
+ 1,0,0,0,0,0};
+
+static BNU_CHUNK_T* p192r1_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p192r1_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p192r1_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p192r1_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+static BNU_CHUNK_T* p192r1_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p192r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p192r1_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p192r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP >= _IPP_P8 */
+
+/*
+// return specific gf p192r1 arith methods,
+// p192r1 = 2^192 -2^64 -1 (NIST P192r1)
+*/
+static gsModMethod* gsArithGF_p192r1(void)
+{
+ static gsModMethod m = {
+ p192r1_to_mont,
+ p192r1_mont_back,
+ p192r1_mul_montl,
+ p192r1_sqr_montl,
+ NULL,
+ p192r1_add,
+ p192r1_sub,
+ p192r1_neg,
+ p192r1_div_by_2,
+ p192r1_mul_by_2,
+ p192r1_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_EM64T) && ((_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_))
+ if(IsFeatureEnabled(ADCOX_ENABLED)) {
+ m.mul = p192r1_mul_montx;
+ m.sqr = p192r1_sqr_montx;
+ }
+ #endif
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = p192r1_mul_mont_slm;
+ m.sqr = p192r1_sqr_mont_slm;
+ m.encode = p192r1_to_mont_slm;
+ m.decode = p192r1_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p192r1, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeP192r1,
+ 192,
+ secp192r1_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p192r1();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+
+ return &method;
+}
+
+#undef LEN_P192
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_224r1.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_224r1.c
new file mode 100644
index 0000000..72ce5ce
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_224r1.c
@@ -0,0 +1,179 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over P-224r1 NIST modulus */
+BNU_CHUNK_T* p224r1_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+BNU_CHUNK_T* p224r1_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* p224r1_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p224r1_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#endif
+
+#define OPERAND_BITSIZE (224)
+#define LEN_P224 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// ia32 multiplicative methods
+*/
+#if (_IPP_ARCH ==_IPP_ARCH_IA32)
+static BNU_CHUNK_T* p224r1_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMulAdc_BNU_school(product, pA,LEN_P224, pB,LEN_P224);
+ p224r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* p224r1_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpSqrAdc_BNU_school(product, pA,LEN_P224);
+ p224r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static BNU_CHUNK_T RR[] = {
+ 0x00000001,0x00000000,0x00000000,0xfffffffe,
+ 0xffffffff,0xffffffff,0x00000000};
+
+static BNU_CHUNK_T one[] = {
+ 1,0,0,0,0,0,0};
+
+static BNU_CHUNK_T* p224r1_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p224r1_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p224r1_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p224r1_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+static BNU_CHUNK_T* p224r1_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p224r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p224r1_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p224r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP >= _IPP_P8 */
+
+/*
+// return specific gf p224r1 arith methods,
+// p224r1 = 2^224 -2^96 +1 (NIST P224r1)
+*/
+static gsModMethod* gsArithGF_p224r1(void)
+{
+ static gsModMethod m = {
+ p224r1_to_mont,
+ p224r1_mont_back,
+ p224r1_mul_montl,
+ p224r1_sqr_montl,
+ NULL,
+ p224r1_add,
+ p224r1_sub,
+ p224r1_neg,
+ p224r1_div_by_2,
+ p224r1_mul_by_2,
+ p224r1_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_EM64T) && ((_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_))
+ if(IsFeatureEnabled(ADCOX_ENABLED)) {
+ m.mul = p224r1_mul_montx;
+ m.sqr = p224r1_sqr_montx;
+ }
+ #endif
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = p224r1_mul_mont_slm;
+ m.sqr = p224r1_sqr_mont_slm;
+ m.encode = p224r1_to_mont_slm;
+ m.decode = p224r1_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p224r1, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeP224r1,
+ 224,
+ secp224r1_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p224r1();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+
+ return &method;
+}
+
+#undef LEN_P224
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_256.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_256.c
new file mode 100644
index 0000000..db19629
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_256.c
@@ -0,0 +1,154 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpecprime.h"
+
+#if(_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over arbitrary 256r-bit modulus */
+BNU_CHUNK_T* gf256_add(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus);
+BNU_CHUNK_T* gf256_sub(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus);
+BNU_CHUNK_T* gf256_neg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus);
+BNU_CHUNK_T* gf256_mulm(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus, BNU_CHUNK_T m0);
+BNU_CHUNK_T* gf256_sqrm(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus, BNU_CHUNK_T m0);
+BNU_CHUNK_T* gf256_div2(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus);
+
+#define OPERAND_BITSIZE (256)
+#define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+static BNU_CHUNK_T* p256_add(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ return gf256_add(pR, pA, pB, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_sub(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ return gf256_sub(pR, pA, pB, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_neg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_neg(pR, pA, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_div_by_2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_div2(pR, pA, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_mul_by_2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_add(pR, pA, pA, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_mul_by_3(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T tmp[LEN_P256];
+ gf256_add(tmp, pA, pA, GFP_MODULUS(pGFE));
+ return gf256_add(pR, tmp, pA, GFP_MODULUS(pGFE));
+}
+
+static BNU_CHUNK_T* p256_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ return gf256_mulm(pR, pA, pB, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE));
+}
+
+static BNU_CHUNK_T* p256_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_sqrm(pR, pA, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE));
+}
+
+
+static BNU_CHUNK_T* p256_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_mulm(pR, pA, GFP_MNT_RR(pGFE), GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE));
+}
+
+static BNU_CHUNK_T one[] = {1,0,0,0};
+
+static BNU_CHUNK_T* p256_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return gf256_mulm(pR, pA, one, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE));
+}
+
+/* return specific gf p256 arith methods */
+static gsModMethod* gsArithGF_p256(void)
+{
+ static gsModMethod m = {
+ p256_to_mont,
+ p256_mont_back,
+ p256_mul_montl,
+ p256_sqr_montl,
+ NULL,
+ p256_add,
+ p256_sub,
+ p256_neg,
+ p256_div_by_2,
+ p256_mul_by_2,
+ p256_mul_by_3,
+ };
+ return &m;
+}
+#endif /* _IPP32E >= _IPP32E_M7 */
+
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Prime,
+ 256,
+ NULL,
+ NULL
+ };
+
+ #if(_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p256();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+ return &method;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256bn, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Prime,
+ 256,
+ tpmBN_p256p_p,
+ NULL
+ };
+
+ #if(_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p256();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+ return &method;
+}
+
+#undef LEN_P256
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_256r1.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_256r1.c
new file mode 100644
index 0000000..3e51fea
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_256r1.c
@@ -0,0 +1,178 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over P-256r1 NIST modulus */
+BNU_CHUNK_T* p256r1_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+BNU_CHUNK_T* p256r1_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* p256r1_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p256r1_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#endif
+
+#define OPERAND_BITSIZE (256)
+#define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// ia32 multiplicative methods
+*/
+#if (_IPP_ARCH ==_IPP_ARCH_IA32 )
+static BNU_CHUNK_T* p256r1_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMulAdc_BNU_school(product, pA,LEN_P256, pB,LEN_P256);
+ p256r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* p256r1_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpSqrAdc_BNU_school(product, pA,LEN_P256);
+ p256r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static BNU_CHUNK_T RR[] = {
+ 0x00000003,0x00000000, 0xffffffff,0xfffffffb,
+ 0xfffffffe,0xffffffff, 0xfffffffd,0x00000004};
+
+static BNU_CHUNK_T one[] = {
+ 1,0,0,0,0,0,0,0};
+
+static BNU_CHUNK_T* p256r1_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p256r1_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p256r1_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p256r1_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+static BNU_CHUNK_T* p256r1_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p256r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p256r1_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p256r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP >= _IPP_P8 */
+
+/*
+// return specific gf p256r1 arith methods,
+// p256r1 = 2^256 -2^224 +2^192 +2^96 -1 (NIST P256r1)
+*/
+static gsModMethod* gsArithGF_p256r1(void)
+{
+ static gsModMethod m = {
+ p256r1_to_mont,
+ p256r1_mont_back,
+ p256r1_mul_montl,
+ p256r1_sqr_montl,
+ NULL,
+ p256r1_add,
+ p256r1_sub,
+ p256r1_neg,
+ p256r1_div_by_2,
+ p256r1_mul_by_2,
+ p256r1_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_EM64T) && ((_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_))
+ if(IsFeatureEnabled(ADCOX_ENABLED)) {
+ m.mul = p256r1_mul_montx;
+ m.sqr = p256r1_sqr_montx;
+ }
+ #endif
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = p256r1_mul_mont_slm;
+ m.sqr = p256r1_sqr_mont_slm;
+ m.encode = p256r1_to_mont_slm;
+ m.decode = p256r1_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256r1, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeP256r1,
+ 256,
+ secp256r1_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p256r1();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+ return &method;
+}
+
+#undef LEN_P256
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_384r1.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_384r1.c
new file mode 100644
index 0000000..8caa825
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_384r1.c
@@ -0,0 +1,182 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpbnuarith.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over P-384r1 NIST modulus */
+BNU_CHUNK_T* p384r1_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+//BNU_CHUNK_T* p384r1_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+//BNU_CHUNK_T* p384r1_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p384r1_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+//BNU_CHUNK_T* p384r1_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p384r1_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p384r1_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+BNU_CHUNK_T* p384r1_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* p384r1_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p384r1_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+
+#define OPERAND_BITSIZE (384)
+#define LEN_P384 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// multiplicative methods
+*/
+static BNU_CHUNK_T* p384r1_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMul_BNU_school(product, pA,LEN_P384, pB,LEN_P384);
+ p384r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* p384r1_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = gsModPoolAlloc((gsModEngine*)pGFE, 2);
+
+ cpSqr_BNU_school(product, pA,LEN_P384);
+ p384r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static Ipp64u RR[] = {
+ 0xfffffffe00000001,0x0000000200000000,0xfffffffe00000000,
+ 0x0000000200000000,0x0000000000000001,0x0000000000000000
+};
+
+static BNU_CHUNK_T one[] = {
+#if(_IPP_ARCH == _IPP_ARCH_EM64T)
+ 1,0,0,0,0,0};
+#elif(_IPP_ARCH == _IPP_ARCH_IA32)
+ 1,0,0,0,0,0,0,0,0,0,0,0};
+#endif
+
+static BNU_CHUNK_T* p384r1_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p384r1_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p384r1_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p384r1_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+#if (_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
+//BNU_CHUNK_T* p384r1_mul_montx(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+//BNU_CHUNK_T* p384r1_sqr_montx(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+#endif
+
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+static BNU_CHUNK_T* p384r1_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p384r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p384r1_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p384r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP_ARCH ==_IPP_ARCH_IA32 */
+
+/*
+// return specific gf p384r1 arith methods,
+// p384r1 = 2^384 -2^128 -2^96 +2^32 -1 (NIST P384r1)
+*/
+static gsModMethod* gsArithGF_p384r1(void)
+{
+ static gsModMethod m = {
+ p384r1_to_mont,
+ p384r1_mont_back,
+ p384r1_mul_montl,
+ p384r1_sqr_montl,
+ NULL,
+ p384r1_add,
+ p384r1_sub,
+ p384r1_neg,
+ p384r1_div_by_2,
+ p384r1_mul_by_2,
+ p384r1_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = p384r1_mul_mont_slm;
+ m.sqr = p384r1_sqr_mont_slm;
+ m.encode = p384r1_to_mont_slm;
+ m.decode = p384r1_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p384r1, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeP384r1,
+ 384,
+ secp384r1_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p384r1();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+
+ return &method;
+}
+
+#undef LEN_P384
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_521r1.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_521r1.c
new file mode 100644
index 0000000..789be03
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_521r1.c
@@ -0,0 +1,189 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpbnuarith.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over P-521r1 NIST modulus */
+BNU_CHUNK_T* p521r1_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+//BNU_CHUNK_T* p521r1_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p521r1_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p521r1_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+//BNU_CHUNK_T* p521r1_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+//BNU_CHUNK_T* p521r1_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+//BNU_CHUNK_T* p521r1_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+BNU_CHUNK_T* p521r1_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* p521r1_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* p521r1_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+
+#define OPERAND_BITSIZE (521)
+#define LEN_P521 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// multiplicative methods
+*/
+static BNU_CHUNK_T* p521r1_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMul_BNU_school(product, pA,LEN_P521, pB,LEN_P521);
+ p521r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* p521r1_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpSqr_BNU_school(product, pA,LEN_P521);
+ p521r1_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static BNU_CHUNK_T RR[] = {
+#if(_IPP_ARCH == _IPP_ARCH_EM64T)
+ 0x0000000000000000,0x0000400000000000,0x0000000000000000,
+ 0x0000000000000000,0x0000000000000000,0x0000000000000000,
+ 0x0000000000000000,0x0000000000000000,0x0000000000000000};
+#elif(_IPP_ARCH == _IPP_ARCH_IA32)
+ 0x00000000,0x00004000,0x00000000,0x00000000,0x00000000,0x00000000,
+ 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
+ 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};
+#endif
+
+static BNU_CHUNK_T one[] = {
+#if(_IPP_ARCH == _IPP_ARCH_EM64T)
+ 1,0,0,0,0,0,0,0,0};
+#elif(_IPP_ARCH == _IPP_ARCH_IA32)
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+#endif
+
+static BNU_CHUNK_T* p521r1_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p521r1_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p521r1_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p521r1_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+#if (_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
+//BNU_CHUNK_T* p521r1_mul_montx(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+//BNU_CHUNK_T* p521r1_sqr_montx(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+#endif
+
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+static BNU_CHUNK_T* p521r1_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p521r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* p521r1_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return p521r1_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP_ARCH ==_IPP_ARCH_IA32*/
+
+/*
+// return specific gf p521r1 arith methods,
+// p521r1 = 2^521 -1 (NIST P521r1)
+*/
+static gsModMethod* gsArithGF_p521r1(void)
+{
+ static gsModMethod m = {
+ p521r1_to_mont,
+ p521r1_mont_back,
+ p521r1_mul_montl,
+ p521r1_sqr_montl,
+ NULL,
+ p521r1_add,
+ p521r1_sub,
+ p521r1_neg,
+ p521r1_div_by_2,
+ p521r1_mul_by_2,
+ p521r1_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = p521r1_mul_mont_slm;
+ m.sqr = p521r1_sqr_mont_slm;
+ m.encode = p521r1_to_mont_slm;
+ m.decode = p521r1_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p521r1, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeP521r1,
+ 521,
+ secp521r1_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p521r1();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+
+ return &method;
+}
+
+#undef LEN_P521
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_com.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_com.c
new file mode 100644
index 0000000..c4e3afc
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_com.c
@@ -0,0 +1,37 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owncp.h"
+
+#include "pcpgfpmethod.h"
+
+/* available pre-defined general methos */
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_pArb, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Prime,
+ 0,
+ NULL,
+ NULL
+ };
+ method.arith = gsArithGFp();
+ return &method;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpmethod_sm2.c b/ext/ipp/sources/ippcp/src/pcpgfpmethod_sm2.c
new file mode 100644
index 0000000..e7c0c79
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpmethod_sm2.c
@@ -0,0 +1,179 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p) methods
+//
+*/
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "gsmodstuff.h"
+#include "pcpgfpstuff.h"
+#include "pcpgfpmethod.h"
+#include "pcpecprime.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+
+/* arithmetic over 256-bit SM2 modulus */
+BNU_CHUNK_T* sm2_add(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_sub(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_neg(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_div_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_mul_by_2 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_mul_by_3 (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#if(_IPP_ARCH ==_IPP_ARCH_EM64T)
+BNU_CHUNK_T* sm2_mul_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_mul_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_sqr_montl(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_sqr_montx(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_to_mont (BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_mont_back(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+#endif
+#if(_IPP_ARCH ==_IPP_ARCH_IA32)
+BNU_CHUNK_T* sm2_mul_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, const BNU_CHUNK_T* b, gsEngine* pGFE);
+BNU_CHUNK_T* sm2_sqr_mont_slm(BNU_CHUNK_T* res, const BNU_CHUNK_T* a, gsEngine* pGFE);
+void sm2_mred(BNU_CHUNK_T* res, BNU_CHUNK_T* product);
+#endif
+
+#define OPERAND_BITSIZE (256)
+#define LEN_SM2 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+
+/*
+// ia32 multiplicative methods
+*/
+#if (_IPP_ARCH ==_IPP_ARCH_IA32 )
+static BNU_CHUNK_T* sm2_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpMulAdc_BNU_school(product, pA,LEN_SM2, pB,LEN_SM2);
+ sm2_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+static BNU_CHUNK_T* sm2_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ BNU_CHUNK_T* product = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(NULL!=product);
+
+ cpSqrAdc_BNU_school(product, pA,LEN_SM2);
+ sm2_mred(pR, product);
+
+ cpGFpReleasePool(2, pGFE);
+ return pR;
+}
+
+
+/*
+// Montgomery domain conversion constants
+*/
+static BNU_CHUNK_T RR[] = {
+ 0x00000003,0x00000002, 0xffffffff,0x00000002,
+ 0x00000001,0x00000001, 0x00000002,0x00000004};
+
+static BNU_CHUNK_T one[] = {
+ 1,0,0,0,0,0,0,0};
+
+static BNU_CHUNK_T* sm2_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return sm2_mul_montl(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* sm2_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return sm2_mul_montl(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+
+static BNU_CHUNK_T* sm2_to_mont_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return sm2_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)RR, pGFE);
+}
+
+static BNU_CHUNK_T* sm2_mont_back_slm(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE)
+{
+ return sm2_mul_mont_slm(pR, pA, (BNU_CHUNK_T*)one, pGFE);
+}
+#endif /* _IPP >= _IPP_P8 */
+
+/*
+// return specific gf p256sm2 arith methods,
+// p256sm2 = 2^256 -2^224 -2^96 +2^64 -1 (SM2 curve)
+*/
+static gsModMethod* gsArithGF_p256sm2(void)
+{
+ static gsModMethod m = {
+ sm2_to_mont,
+ sm2_mont_back,
+ sm2_mul_montl,
+ sm2_sqr_montl,
+ NULL,
+ sm2_add,
+ sm2_sub,
+ sm2_neg,
+ sm2_div_by_2,
+ sm2_mul_by_2,
+ sm2_mul_by_3,
+ };
+
+ #if(_IPP_ARCH==_IPP_ARCH_EM64T) && ((_ADCOX_NI_ENABLING_==_FEATURE_ON_) || (_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_))
+ if(IsFeatureEnabled(ADCOX_ENABLED)) {
+ m.mul = sm2_mul_montx;
+ m.sqr = sm2_sqr_montx;
+ }
+ #endif
+
+ #if(_IPP_ARCH==_IPP_ARCH_IA32)
+ if(IsFeatureEnabled(ippCPUID_SSSE3|ippCPUID_MOVBE) && !IsFeatureEnabled(ippCPUID_AVX)) {
+ m.mul = sm2_mul_mont_slm;
+ m.sqr = sm2_sqr_mont_slm;
+ m.encode = sm2_to_mont_slm;
+ m.decode = sm2_mont_back_slm;
+ }
+ #endif
+
+ return &m;
+}
+#endif /* (_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7) */
+
+IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256sm2, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_PrimeTPM_SM2,
+ 256,
+ tpmSM2_p256_p,
+ NULL
+ };
+
+ #if(_IPP >= _IPP_P8) || (_IPP32E >= _IPP32E_M7)
+ method.arith = gsArithGF_p256sm2();
+ #else
+ method.arith = gsArithGFp();
+ #endif
+
+ return &method;
+}
+
+#undef LEN_SM2
+#undef OPERAND_BITSIZE
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpstuff.c b/ext/ipp/sources/ippcp/src/pcpgfpstuff.c
new file mode 100644
index 0000000..6dc394f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpstuff.c
@@ -0,0 +1,296 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Internal operations over prime GF(p).
+//
+// Context:
+// cpGFpRand
+// cpGFpSet
+// cpGFpGet
+//
+// cpGFpNeg
+// cpGFpInv
+// cpGFpHalve
+// cpGFpAdd
+// cpGFpSub
+// cpGFpMul
+// cpGFpSqr
+// cpGFpExp, cpGFpExp2
+// cpGFpSqrt
+//
+*/
+#include "owncp.h"
+
+#include "pcpbn.h"
+#include "pcpgfpstuff.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+BNU_CHUNK_T* cpGFpRand(BNU_CHUNK_T* pR, gsModEngine* pGFE, IppBitSupplier rndFunc, void* pRndParam)
+{
+ int elemLen = GFP_FELEN(pGFE);
+ int reqBitSize = GFP_FEBITLEN(pGFE)+GFP_RAND_ADD_BITS;
+ int nsR = (reqBitSize +BITSIZE(BNU_CHUNK_T)-1)/BITSIZE(BNU_CHUNK_T);
+
+ int internal_err;
+
+ BNU_CHUNK_T* pPool = cpGFpGetPool(2, pGFE);
+ //gres: temporary excluded: assert(pPool!=NULL);
+
+ cpGFpElementPadd(pPool, nsR, 0);
+
+ internal_err = ippStsNoErr != rndFunc((Ipp32u*)pPool, reqBitSize, pRndParam);
+
+ if(!internal_err) {
+ nsR = cpMod_BNU(pPool, nsR, GFP_MODULUS(pGFE), elemLen);
+ cpGFpElementPadd(pPool+nsR, elemLen-nsR, 0);
+ GFP_METHOD(pGFE)->encode(pR, pPool, pGFE);
+ }
+
+ cpGFpReleasePool(2, pGFE);
+ return internal_err? NULL : pR;
+}
+
+BNU_CHUNK_T* cpGFpSet(BNU_CHUNK_T* pElm, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFE)
+{
+ const BNU_CHUNK_T* pModulus = GFP_MODULUS(pGFE);
+ int elemLen = GFP_FELEN(pGFE);
+
+ if(0 <= cpCmp_BNU(pDataA, nsA, pModulus, elemLen))
+ return NULL;
+ else {
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(pTmp !=NULL);
+
+ ZEXPAND_COPY_BNU(pTmp, elemLen, pDataA, nsA);
+ GFP_METHOD(pGFE)->encode(pElm, pTmp, pGFE);
+
+ cpGFpReleasePool(1, pGFE);
+ return pElm;
+ }
+}
+
+BNU_CHUNK_T* cpGFpGet(BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pElm, gsModEngine* pGFE)
+{
+ int elemLen = GFP_FELEN(pGFE);
+
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(pTmp !=NULL);
+
+ GFP_METHOD(pGFE)->decode(pTmp, pElm, pGFE);
+ ZEXPAND_COPY_BNU(pDataA, nsA, pTmp, elemLen);
+
+ cpGFpReleasePool(1, pGFE);
+ return pDataA;
+}
+
+BNU_CHUNK_T* cpGFpSetOctString(BNU_CHUNK_T* pElm, const Ipp8u* pStr, int strSize, gsModEngine* pGFE)
+{
+ int elemLen = GFP_FELEN(pGFE);
+
+ if((int)(elemLen*sizeof(BNU_CHUNK_T)) < strSize)
+ return NULL;
+
+ {
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(pTmp !=NULL);
+ {
+ int nsTmp = cpFromOctStr_BNU(pTmp, pStr, strSize);
+ BNU_CHUNK_T* ret = cpGFpSet(pElm, pTmp, nsTmp, pGFE);
+
+ cpGFpReleasePool(1, pGFE);
+ return ret==NULL? NULL : pElm;
+ }
+ }
+}
+
+Ipp8u* cpGFpGetOctString(Ipp8u* pStr, int strSize, const BNU_CHUNK_T* pElm, gsModEngine* pGFE)
+{
+ int elemLen = GFP_FELEN(pGFE);
+
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFE);
+ //gres: temporary excluded: assert(pTmp !=NULL);
+
+ GFP_METHOD(pGFE)->decode(pTmp, pElm, pGFE);
+ cpToOctStr_BNU(pStr, strSize, pTmp, elemLen);
+
+ cpGFpReleasePool(1, pGFE);
+ return pStr;
+}
+
+BNU_CHUNK_T* cpGFpAdd(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->add(pR, pA, pB, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpSub(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->sub(pR, pA, pB, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpNeg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->neg(pR, pA, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpMul(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->mul(pR, pA, pB, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpSqr(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->sqr(pR, pA, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpHalve(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE)
+{
+ return GFP_METHOD(pGFE)->div2(pR, pA, pGFE);
+}
+
+BNU_CHUNK_T* cpGFpInv(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE)
+{
+ GFP_METHOD(pGFE)->decode(pR, pA, pGFE);
+ gs_mont_inv(pR, pR, pGFE);
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE, gsModEngine* pGFE)
+{
+ int elemLen = GFP_FELEN(pGFE);
+ cpMontExpBin_BNU(pR, pA,cpFix_BNU(pA, elemLen), pE,cpFix_BNU(pE, nsE), pGFE);
+ return pR;
+}
+
+static int factor2(BNU_CHUNK_T* pA, int nsA)
+{
+ int factor = 0;
+ int bits;
+
+ int i;
+ for(i=0; i<nsA; i++) {
+ int ntz = cpNTZ_BNU(pA[i]);
+ factor += ntz;
+ if(ntz<BITSIZE(BNU_CHUNK_T))
+ break;
+ }
+
+ bits = factor;
+ if(bits >= BITSIZE(BNU_CHUNK_T)) {
+ int nchunk = bits/BITSIZE(BNU_CHUNK_T);
+ cpGFpElementCopyPadd(pA, nsA, pA+nchunk, nsA-nchunk);
+ bits %= BITSIZE(BNU_CHUNK_T);
+ }
+ if(bits)
+ cpLSR_BNU(pA, pA, nsA, bits);
+
+ return factor;
+}
+
+static BNU_CHUNK_T* cpGFpExp2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, int e, gsModEngine* pGFE)
+{
+ cpGFpElementCopy(pR, pA, GFP_FELEN(pGFE));
+ while(e--) {
+ GFP_METHOD(pGFE)->sqr(pR, pR, pGFE);
+ }
+ return pR;
+}
+
+/* returns:
+ 0, if a - qnr
+ 1, if sqrt is found
+*/
+int cpGFpSqrt(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE)
+{
+ int elemLen = GFP_FELEN(pGFE);
+ int poolelementLen = GFP_PELEN(pGFE);
+ int resultFlag = 1;
+
+ /* case A==0 */
+ if( GFP_IS_ZERO(pA, elemLen) )
+ cpGFpElementPadd(pR, elemLen, 0);
+
+ /* general case */
+ else {
+ BNU_CHUNK_T* q = cpGFpGetPool(4, pGFE);
+ BNU_CHUNK_T* x = q + poolelementLen;
+ BNU_CHUNK_T* y = x + poolelementLen;
+ BNU_CHUNK_T* z = y + poolelementLen;
+
+ int s;
+
+ //gres: temporary excluded: assert(q!=NULL);
+
+ /* z=1 */
+ GFP_ONE(z, elemLen);
+
+ /* (modulus-1) = 2^s*q */
+ cpSub_BNU(q, GFP_MODULUS(pGFE), z, elemLen);
+ s = factor2(q, elemLen);
+
+ /*
+ // initialization
+ */
+
+ /* y = qnr^q */
+ cpGFpExp(y, GFP_QNR(pGFE), q,elemLen, pGFE);
+ /* x = a^((q-1)/2) */
+ cpSub_BNU(q, q, z, elemLen);
+ cpLSR_BNU(q, q, elemLen, 1);
+ cpGFpExp(x, pA, q, elemLen, pGFE);
+ /* z = a*x^2 */
+ GFP_METHOD(pGFE)->mul(z, x, x, pGFE);
+ GFP_METHOD(pGFE)->mul(z, pA, z, pGFE);
+ /* R = a*x */
+ GFP_METHOD(pGFE)->mul(pR, pA, x, pGFE);
+
+ while( !GFP_EQ(z, MOD_MNT_R(pGFE), elemLen) ) {
+ int m = 0;
+ cpGFpElementCopy(q, z, elemLen);
+
+ for(m=1; m<s; m++) {
+ GFP_METHOD(pGFE)->mul(q, q, q, pGFE);
+ if( GFP_EQ(q, MOD_MNT_R(pGFE), elemLen) )
+ break;
+ }
+
+ if(m==s) {
+ /* A is quadratic non-residue */
+ resultFlag = 0;
+ break;
+ }
+ else {
+ /* exponent reduction */
+ cpGFpExp2(q, y, (s-m-1), pGFE); /* q = y^(2^(s-m-1)) */
+ GFP_METHOD(pGFE)->mul(y, q, q, pGFE); /* y = q^2 */
+ GFP_METHOD(pGFE)->mul(pR, q, pR, pGFE); /* R = q*R */
+ GFP_METHOD(pGFE)->mul(z, y, z, pGFE); /* z = z*y */
+ s = m;
+ }
+ }
+
+ /* choose smallest between R and (modulus-R) */
+ GFP_METHOD(pGFE)->decode(q, pR, pGFE);
+ if(GFP_GT(q, GFP_HMODULUS(pGFE), elemLen))
+ GFP_METHOD(pGFE)->neg(pR, pR, pGFE);
+
+ cpGFpReleasePool(4, pGFE);
+ }
+
+ return resultFlag;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpstuff.h b/ext/ipp/sources/ippcp/src/pcpgfpstuff.h
new file mode 100644
index 0000000..fac2215
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpstuff.h
@@ -0,0 +1,216 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives
+// Internal GF(p) basic Definitions & Function Prototypes
+//
+*/
+
+#if !defined(_PCP_GFP_H_)
+#define _PCP_GFP_H_
+
+#include "owncp.h"
+//#include "pcpbn.h"
+#include "pcpgfpmethod.h"
+#include "pcpmontgomery.h"
+
+/* GF element */
+typedef struct _cpGFpElement {
+ IppCtxId idCtx; /* GF() element ident */
+ int length; /* length of element (in BNU_CHUNK_T) */
+ BNU_CHUNK_T* pData;
+} cpGFpElement;
+
+#define GFPE_ID(pCtx) ((pCtx)->idCtx)
+#define GFPE_ROOM(pCtx) ((pCtx)->length)
+#define GFPE_DATA(pCtx) ((pCtx)->pData)
+
+#define GFPE_TEST_ID(pCtx) (GFPE_ID((pCtx))==idCtxGFPE)
+
+
+/* GF(p) context */
+typedef struct _cpGFp {
+ IppCtxId idCtx; /* GFp spec ident */
+ gsModEngine* pGFE; /* arithmethic engine */
+} cpGFp;
+
+#define GFP_ALIGNMENT ((int)(sizeof(void*)))
+
+/* Local definitions */
+#define GFP_MAX_BITSIZE (IPP_MAX_GF_BITSIZE) /* max bitsize for GF element */
+#define GFP_POOL_SIZE (16)//(IPP_MAX_EXPONENT_NUM+3) /* num of elements into the pool */
+#define GFP_RAND_ADD_BITS (128) /* parameter of random element generation ?? == febits/2 */
+
+#define GFP_ID(pCtx) ((pCtx)->idCtx)
+#define GFP_PMA(pCtx) ((pCtx)->pGFE)
+
+#define GFP_PARENT(pCtx) MOD_PARENT((pCtx))
+#define GFP_EXTDEGREE(pCtx) MOD_EXTDEG((pCtx))
+#define GFP_FEBITLEN(pCtx) MOD_BITSIZE((pCtx))
+#define GFP_FELEN(pCtx) MOD_LEN((pCtx))
+#define GFP_FELEN32(pCtx) MOD_LEN32((pCtx))
+#define GFP_PELEN(pCtx) MOD_PELEN((pCtx))
+#define GFP_METHOD(pCtx) MOD_METHOD((pCtx))
+#define GFP_MODULUS(pCtx) MOD_MODULUS((pCtx))
+#define GFP_MNT_FACTOR(pCtx) MOD_MNT_FACTOR((pCtx))
+#define GFP_MNT_R(pCtx) MOD_MNT_R((pCtx))
+#define GFP_MNT_RR(pCtx) MOD_MNT_R2((pCtx))
+#define GFP_HMODULUS(pCtx) MOD_HMODULUS((pCtx))
+#define GFP_QNR(pCtx) MOD_QNR((pCtx))
+#define GFP_POOL(pCtx) MOD_POOL_BUF((pCtx))
+#define GFP_MAXPOOL(pCtx) MOD_MAXPOOL((pCtx))
+#define GFP_USEDPOOL(pCtx) MOD_USEDPOOL((pCtx))
+
+#define GFP_IS_BASIC(pCtx) (GFP_PARENT((pCtx))==NULL)
+#define GFP_TEST_ID(pCtx) (GFP_ID((pCtx))==idCtxGFP)
+
+/*
+// get/release n element from/to the pool
+*/
+#define cpGFpGetPool(n, gfe) gsModPoolAlloc((gfe), (n))
+#define cpGFpReleasePool(n, gfe) gsModPoolFree((gfe), (n))
+
+
+__INLINE int cpGFpElementLen(const BNU_CHUNK_T* pE, int nsE)
+{
+ for(; nsE>1 && 0==pE[nsE-1]; nsE--) ;
+ return nsE;
+}
+__INLINE BNU_CHUNK_T* cpGFpElementCopy(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pE, int nsE)
+{
+ int n;
+ for(n=0; n<nsE; n++) pR[n] = pE[n];
+ return pR;
+}
+__INLINE BNU_CHUNK_T* cpGFpElementPadd(BNU_CHUNK_T* pE, int nsE, BNU_CHUNK_T filler)
+{
+ int n;
+ for(n=0; n<nsE; n++) pE[n] = filler;
+ return pE;
+}
+__INLINE BNU_CHUNK_T* cpGFpElementCopyPadd(BNU_CHUNK_T* pR, int nsR, const BNU_CHUNK_T* pE, int nsE)
+{
+ int n;
+ for(n=0; n<nsE; n++) pR[n] = pE[n];
+ for(; n<nsR; n++) pR[n] = 0;
+ return pR;
+}
+__INLINE int cpGFpElementCmp(const BNU_CHUNK_T* pE, const BNU_CHUNK_T* pX, int nsE)
+{
+ for(; nsE>1 && pE[nsE-1]==pX[nsE-1]; nsE--)
+ ;
+ return pE[nsE-1]==pX[nsE-1]? 0 : pE[nsE-1]>pX[nsE-1]? 1:-1;
+}
+
+#define CP_CT_MSB(a) ((a)>>((sizeof((a))*8 -1)))
+#define CP_CT_IS_ZERO(a) CP_CT_MSB(~(a) & ((a)-1))
+
+__INLINE int cpGFpElementIsEquChunk(const BNU_CHUNK_T* pE, int nsE, BNU_CHUNK_T x)
+{
+ int i;
+ BNU_CHUNK_T accum = pE[0] ^ x;
+ for (i = 1; i < nsE; i++) {
+ accum |= pE[i];
+ }
+ return CP_CT_IS_ZERO(accum); /*(accum == 0); */
+}
+
+__INLINE BNU_CHUNK_T* cpGFpElementSetChunk(BNU_CHUNK_T* pR, int nsR, BNU_CHUNK_T x)
+{
+ return cpGFpElementCopyPadd(pR, nsR, &x, 1);
+}
+
+
+#define GFP_LT(a,b,size) (-1==cpGFpElementCmp((a),(b),(size)))
+#define GFP_EQ(a,b,size) ( 0==cpGFpElementCmp((a),(b),(size)))
+#define GFP_GT(a,b,size) ( 1==cpGFpElementCmp((a),(b),(size)))
+
+#define GFP_IS_ZERO(a,size) cpGFpElementIsEquChunk((a),(size), 0)
+#define GFP_IS_ONE(a,size) cpGFpElementIsEquChunk((a),(size), 1)
+
+#define GFP_ZERO(a,size) cpGFpElementSetChunk((a),(size), 0)
+#define GFP_ONE(a,size) cpGFpElementSetChunk((a),(size), 1)
+
+#define GFP_IS_EVEN(a) (0==((a)[0]&1))
+#define GFP_IS_ODD(a) (1==((a)[0]&1))
+
+
+/* construct GF element */
+__INLINE IppsGFpElement* cpGFpElementConstruct(IppsGFpElement* pR, BNU_CHUNK_T* pDataBufer, int ns)
+{
+ GFPE_ID(pR) = idCtxGFPE;
+ GFPE_ROOM(pR) = ns;
+ GFPE_DATA(pR) = pDataBufer;
+ return pR;
+}
+
+
+/* size of GFp context, init and setup */
+#define cpGFpGetSize OWNAPI(cpGFpGetSize)
+int cpGFpGetSize(int feBitSize, int peBitSize, int numpe);
+
+#define cpGFpInitGFp OWNAPI(cpGFpInitGFp)
+IppStatus cpGFpInitGFp(int primeBitSize, IppsGFpState* pGF);
+#define cpGFpSetGFp OWNAPI(cpGFpSetGFp)
+IppStatus cpGFpSetGFp(const BNU_CHUNK_T* pPrime, int primeBitSize, const IppsGFpMethod* method, IppsGFpState* pGF);
+
+/* operations */
+#define cpGFpRand OWNAPI(cpGFpRand)
+BNU_CHUNK_T* cpGFpRand(BNU_CHUNK_T* pR, gsModEngine* pGFE, IppBitSupplier rndFunc, void* pRndParam);
+
+#define cpGFpSet OWNAPI(cpGFpSet)
+BNU_CHUNK_T* cpGFpSet (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFE);
+
+#define cpGFpGet OWNAPI(cpGFpGet)
+BNU_CHUNK_T* cpGFpGet (BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pR, gsModEngine* pGFE);
+
+#define cpGFpSetOctString OWNAPI(cpGFpSetOctString)
+BNU_CHUNK_T* cpGFpSetOctString(BNU_CHUNK_T* pR, const Ipp8u* pStr, int strSize, gsModEngine* pGFE);
+
+#define cpGFpGetOctString OWNAPI(cpGFpGetOctString)
+Ipp8u* cpGFpGetOctString(Ipp8u* pStr, int strSize, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#define cpGFpNeg OWNAPI(cpGFpNeg)
+BNU_CHUNK_T* cpGFpNeg (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#define cpGFpInv OWNAPI(cpGFpInv)
+BNU_CHUNK_T* cpGFpInv (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#define cpGFpHalve OWNAPI(cpGFpHalve)
+BNU_CHUNK_T* cpGFpHalve(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#define cpGFpAdd OWNAPI(cpGFpAdd)
+BNU_CHUNK_T* cpGFpAdd (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE);
+
+#define cpGFpSub OWNAPI(cpGFpSub)
+BNU_CHUNK_T* cpGFpSub (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE);
+
+#define cpGFpMul OWNAPI(cpGFpMul)
+BNU_CHUNK_T* cpGFpMul (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFE);
+
+#define cpGFpSqr OWNAPI(cpGFpSqr)
+BNU_CHUNK_T* cpGFpSqr (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#define cpGFpExp OWNAPI(cpGFpExp)
+BNU_CHUNK_T* cpGFpExp (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE, gsModEngine* pGFE);
+
+#define cpGFpSqrt OWNAPI(cpGFpSqrt)
+int cpGFpSqrt(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFE);
+
+#endif /* _PCP_GFP_H_ */
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpx.c b/ext/ipp/sources/ippcp/src/pcpgfpx.c
new file mode 100644
index 0000000..a49f20f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpx.c
@@ -0,0 +1,250 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Operations over GF(p) ectension.
+//
+// Context:
+// ippsGFpxGetSize
+// ippsGFpxInit
+// ippsGFpxInitBinomial
+// ippsGFpGetInfo
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpgfpstuff.h"
+#include "pcpgfpxstuff.h"
+#include "pcptool.h"
+
+/* Get context size */
+static int cpGFExGetSize(int elemLen, int pelmLen, int numpe)
+{
+ int ctxSize = 0;
+
+ /* size of GFp engine */
+ ctxSize = sizeof(gsModEngine)
+ + elemLen*sizeof(BNU_CHUNK_T) /* modulus */
+ + pelmLen*sizeof(BNU_CHUNK_T)*numpe; /* pool */
+
+ ctxSize = sizeof(IppsGFpState) /* size of IppsGFPState*/
+ + ctxSize; /* GFpx engine */
+ return ctxSize;
+}
+
+IPPFUN(IppStatus, ippsGFpxGetSize, (const IppsGFpState* pGroundGF, int deg, int* pSize))
+{
+ IPP_BAD_PTR2_RET(pGroundGF, pSize);
+ IPP_BADARG_RET( deg<IPP_MIN_GF_EXTDEG || deg >IPP_MAX_GF_EXTDEG, ippStsBadArgErr);
+ pGroundGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGroundGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGroundGF), ippStsContextMatchErr );
+
+ #define MAX_GFx_SIZE (1<<15) /* max size (bytes) of GF element (32KB) */
+ {
+ int groundElmLen = GFP_FELEN(GFP_PMA(pGroundGF));
+ Ipp64u elmLen64 = (Ipp64u)(groundElmLen) *sizeof(BNU_CHUNK_T) *deg;
+ int elemLen = (int)LODWORD(elmLen64);
+ *pSize = 0;
+ IPP_BADARG_RET(elmLen64> MAX_GFx_SIZE, ippStsBadArgErr);
+
+ *pSize = cpGFExGetSize(elemLen, elemLen, GFPX_POOL_SIZE)
+ + GFP_ALIGNMENT;
+ return ippStsNoErr;
+ }
+ #undef MAX_GFx_SIZE
+}
+
+/* the "static" specificator removed because of incorrect result under Linux-32, p8
+ what's wrong? not know maybe compiler (icl 2017)
+ need to check after switchng on icl 2018
+ */
+/*static*/ void InitGFpxCtx(const IppsGFpState* pGroundGF, int extDeg, const IppsGFpMethod* method, IppsGFpState* pGFpx)
+{
+ gsModEngine* pGFEp = GFP_PMA(pGroundGF);
+ int elemLen = extDeg * GFP_FELEN(pGFEp);
+ int elemLen32 = extDeg * GFP_FELEN32(pGFEp);
+
+ Ipp8u* ptr = (Ipp8u*)pGFpx + sizeof(IppsGFpState);
+
+ /* context identifier */
+ GFP_ID(pGFpx) = idCtxGFP;
+ GFP_PMA(pGFpx) = (gsModEngine*)ptr;
+ {
+ gsModEngine* pGFEx = GFP_PMA(pGFpx);
+
+ /* clear whole context */
+ PaddBlock(0, ptr, sizeof(gsModEngine));
+ ptr += sizeof(gsModEngine);
+
+ GFP_PARENT(pGFEx) = pGFEp;
+ GFP_EXTDEGREE(pGFEx) = extDeg;
+ GFP_FEBITLEN(pGFEx) = 0;//elemBitLen;
+ GFP_FELEN(pGFEx) = elemLen;
+ GFP_FELEN32(pGFEx) = elemLen32;
+ GFP_PELEN(pGFEx) = elemLen;
+ GFP_METHOD(pGFEx) = method->arith;
+ GFP_MODULUS(pGFEx) = (BNU_CHUNK_T*)(ptr); ptr += elemLen * sizeof(BNU_CHUNK_T); /* field polynomial */
+ GFP_POOL(pGFEx) = (BNU_CHUNK_T*)(ptr); /* pool */
+ GFP_MAXPOOL(pGFEx) = GFPX_POOL_SIZE;
+ GFP_USEDPOOL(pGFEx) = 0;
+
+ cpGFpElementPadd(GFP_MODULUS(pGFEx), elemLen, 0);
+ }
+}
+
+
+/*F*
+// Name: ippsGFpxInit
+//
+// Purpose: initializes finite field extension GF(p^d)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGFpx
+// NULL == pGroundGF
+// NULL == ppGroundElm
+// NULL == method
+//
+// ippStsContextMatchErr incorrect pGroundGF's context ID
+// incorrect ppGroundElm[i]'s context ID
+//
+// ippStsOutOfRangeErr size of ppGroundElm[i] does not equal to size of pGroundGF element
+//
+// ippStsBadArgErr IPP_MIN_GF_EXTDEG > extDeg || extDeg > IPP_MAX_GF_EXTDEG
+// (IPP_MIN_GF_EXTDEG==2, IPP_MAX_GF_EXTDEG==8)
+// 1>nElm || nElm>extDeg
+//
+// cpID_Poly!=method->modulusID -- method does not refferenced to polynomial one
+// method->modulusBitDeg!=extDeg -- fixed method does not match to degree extension
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pGroundGF pointer to the context of the finite field is being extension
+// extDeg decgree of extension
+// ppGroundElm[] pointer to the array of extension field polynomial
+// nElm number of coefficients above
+// method pointer to the basic arithmetic metods
+// pGFpx pointer to Finite Field context is being initialized
+*F*/
+IPPFUN(IppStatus, ippsGFpxInit,(const IppsGFpState* pGroundGF, int extDeg,
+ const IppsGFpElement* const ppGroundElm[], int nElm,
+ const IppsGFpMethod* method, IppsGFpState* pGFpx))
+{
+ IPP_BAD_PTR4_RET(pGFpx, pGroundGF, ppGroundElm, method);
+
+ pGFpx = (IppsGFpState*)( IPP_ALIGNED_PTR(pGFpx, GFP_ALIGNMENT) );
+ pGroundGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGroundGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGroundGF), ippStsContextMatchErr );
+
+ /* test extension degree */
+ IPP_BADARG_RET( extDeg<IPP_MIN_GF_EXTDEG || extDeg>IPP_MAX_GF_EXTDEG, ippStsBadArgErr);
+ /* coeffs at (x^0), (x^1), ..., (x^(deg-1)) passed acually */
+ /* considering normilized f(x), the coeff at (x^deg) is 1 and so could neither stored no passed */
+ /* test if 1<=nElm<=extDeg */
+ IPP_BADARG_RET( 1>nElm || nElm>extDeg, ippStsBadArgErr);
+
+ /* test if method is polynomial based */
+ IPP_BADARG_RET(cpID_Poly != (method->modulusID & cpID_Poly), ippStsBadArgErr);
+ /* test if method is fixed polynomial based */
+ IPP_BADARG_RET(method->modulusBitDeg && (method->modulusBitDeg!=extDeg), ippStsBadArgErr);
+
+ InitGFpxCtx(pGroundGF, extDeg, method, pGFpx);
+
+ {
+ BNU_CHUNK_T* pPoly = GFP_MODULUS(GFP_PMA(pGFpx));
+ int polyTermlen = GFP_FELEN(GFP_PMA(pGroundGF));
+ int n;
+ for(n=0; n<nElm; n++, pPoly+=polyTermlen) {
+ const IppsGFpElement* pGroundElm = ppGroundElm[n];
+
+ /* test element */
+ IPP_BAD_PTR1_RET(pGroundElm);
+ IPP_BADARG_RET(!GFPE_TEST_ID(pGroundElm), ippStsContextMatchErr);
+ IPP_BADARG_RET(GFPE_ROOM(pGroundElm)!=polyTermlen, ippStsOutOfRangeErr);
+
+ /* copy element */
+ cpGFpElementCopy(pPoly, GFPE_DATA(pGroundElm), polyTermlen);
+ }
+ }
+
+ return ippStsNoErr;
+}
+
+/*F*
+// Name: ippsGFpxInitBinomial
+//
+// Purpose: initializes finite field extension GF(p^d)
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pGFpx
+// NULL == pGroundGF
+// NULL == ppGroundElm
+// NULL == method
+//
+// ippStsContextMatchErr incorrect pGroundGF's context ID
+// incorrect pGroundElm's context ID
+//
+// ippStsOutOfRangeErr size of ppGroundElm does not equal to size of pGroundGF element
+//
+// ippStsBadArgErr IPP_MIN_GF_EXTDEG > extDeg || extDeg > IPP_MAX_GF_EXTDEG
+// (IPP_MIN_GF_EXTDEG==2, IPP_MAX_GF_EXTDEG==8)
+//
+// cpID_Poly!=method->modulusID -- method does not refferenced to polynomial one
+// method->modulusBitDeg!=extDeg -- fixed method does not match to degree extension
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pGroundGF pointer to the context of the finite field is being extension
+// extDeg decgree of extension
+// ppGroundElm[] pointer to the array of extension field polynomial
+// nElm number of coefficients above
+// method pointer to the basic arithmetic metods
+// pGFpx pointer to Finite Field context is being initialized
+*F*/
+IPPFUN(IppStatus, ippsGFpxInitBinomial,(const IppsGFpState* pGroundGF, int extDeg,
+ const IppsGFpElement* pGroundElm,
+ const IppsGFpMethod* method,
+ IppsGFpState* pGFpx))
+{
+ IPP_BAD_PTR4_RET(pGFpx, pGroundGF, pGroundElm, method);
+
+ pGFpx = (IppsGFpState*)( IPP_ALIGNED_PTR(pGFpx, GFP_ALIGNMENT) );
+ pGroundGF = (IppsGFpState*)( IPP_ALIGNED_PTR(pGroundGF, GFP_ALIGNMENT) );
+ IPP_BADARG_RET( !GFP_TEST_ID(pGroundGF), ippStsContextMatchErr );
+
+ IPP_BADARG_RET( !GFPE_TEST_ID(pGroundElm), ippStsContextMatchErr );
+ IPP_BADARG_RET(GFPE_ROOM(pGroundElm)!=GFP_FELEN(GFP_PMA(pGroundGF)), ippStsOutOfRangeErr);
+
+ IPP_BADARG_RET( extDeg<IPP_MIN_GF_EXTDEG || extDeg>IPP_MAX_GF_EXTDEG, ippStsBadArgErr);
+
+ /* test method is binomial based */
+ IPP_BADARG_RET(cpID_Binom != (method->modulusID & cpID_Binom), ippStsBadArgErr);
+
+ /* test if method assums fixed degree extension */
+ IPP_BADARG_RET(method->modulusBitDeg && (extDeg!=method->modulusBitDeg), ippStsBadArgErr);
+
+ /* init context */
+ InitGFpxCtx(pGroundGF, extDeg, method, pGFpx);
+
+ /* store low-order coefficient of irresucible into the context */
+ cpGFpElementCopy(GFP_MODULUS(GFP_PMA(pGFpx)), GFPE_DATA(pGroundElm), GFP_FELEN(GFP_PMA(pGroundGF)));
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom.c b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom.c
new file mode 100644
index 0000000..ca62dbd
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom.c
@@ -0,0 +1,442 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p^d) methods, if binomial generator
+//
+*/
+#include "owncp.h"
+
+#include "pcpgfpxstuff.h"
+#include "pcpgfpxmethod_com.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+static BNU_CHUNK_T* cpGFpxMul_G0(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+
+ BNU_CHUNK_T* pGFpolynomial = GFP_MODULUS(pGFEx); /* g(x) = t^d + g0 */
+
+ #if defined GS_DBG
+ BNU_CHUNK_T* arg0 = cpGFpGetPool(1, pGroundGFE);
+ BNU_CHUNK_T* arg1 = cpGFpGetPool(1, pGroundGFE);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+ #endif
+
+ #if defined GS_DBG
+ cpGFpxGet(arg0, groundElemLen, pA, pGroundGFE);
+ cpGFpxGet(arg1, groundElemLen, pGFpolynomial, pGroundGFE);
+ #endif
+
+ mulF(pR, pA, pGFpolynomial, pGroundGFE);
+
+ #if defined GS_DBG
+ cpGFpReleasePool(2, pGroundGFE);
+ #endif
+
+ return pR;
+}
+
+/*
+// Multiplication in GF(p^2), if field polynomial: g(x) = x^2 + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxMul_p2_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+
+ const BNU_CHUNK_T* pB0 = pB;
+ const BNU_CHUNK_T* pB1 = pB+groundElemLen;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(4, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* t2 = t1+groundElemLen;
+ BNU_CHUNK_T* t3 = t2+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ #if defined GS_DBG
+ BNU_CHUNK_T* arg0 = cpGFpGetPool(1, pGroundGFE);
+ BNU_CHUNK_T* arg1 = cpGFpGetPool(1, pGroundGFE);
+ #endif
+ #if defined GS_DBG
+ cpGFpxGet(arg0, groundElemLen, pA0, pGroundGFE);
+ cpGFpxGet(arg1, groundElemLen, pB0, pGroundGFE);
+ #endif
+
+ mulF(t0, pA0, pB0, pGroundGFE); /* t0 = a[0]*b[0] */
+
+ #if defined GS_DBG
+ cpGFpxGet(arg0, groundElemLen, pA1, pGroundGFE);
+ cpGFpxGet(arg1, groundElemLen, pB1, pGroundGFE);
+ #endif
+
+ mulF(t1, pA1, pB1, pGroundGFE); /* t1 = a[1]*b[1] */
+ addF(t2, pA0, pA1, pGroundGFE); /* t2 = a[0]+a[1] */
+ addF(t3, pB0, pB1, pGroundGFE); /* t3 = b[0]+b[1] */
+
+ #if defined GS_DBG
+ cpGFpxGet(arg0, groundElemLen, t2, pGroundGFE);
+ cpGFpxGet(arg1, groundElemLen, t3, pGroundGFE);
+ #endif
+
+ mulF(pR1, t2, t3, pGroundGFE); /* r[1] = (a[0]+a[1]) * (b[0]+b[1]) */
+ subF(pR1, pR1, t0, pGroundGFE); /* r[1] -= a[0]*b[0]) + a[1]*b[1] */
+ subF(pR1, pR1, t1, pGroundGFE);
+
+ cpGFpxMul_G0(t1, t1, pGFEx);
+ subF(pR0, t0, t1, pGroundGFE);
+
+ #if defined GS_DBG
+ cpGFpReleasePool(2, pGroundGFE);
+ #endif
+
+ cpGFpReleasePool(4, pGroundGFE);
+ return pR;
+}
+
+/*
+// Squaring in GF(p^2), if field polynomial: g(x) = x^2 + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxSqr_p2_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGroundGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(3, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* u0 = t1+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ #if defined GS_DBG
+ BNU_CHUNK_T* arg0 = cpGFpGetPool(1, pGroundGFE);
+ BNU_CHUNK_T* arg1 = cpGFpGetPool(1, pGroundGFE);
+ #endif
+ #if defined GS_DBG
+ cpGFpxGet(arg0, groundElemLen, pA0, pGroundGFE);
+ cpGFpxGet(arg1, groundElemLen, pA1, pGroundGFE);
+ #endif
+
+ mulF(u0, pA0, pA1, pGroundGFE); /* u0 = a[0]*a[1] */
+ sqrF(t0, pA0, pGroundGFE); /* t0 = a[0]*a[0] */
+ sqrF(t1, pA1, pGroundGFE); /* t1 = a[1]*a[1] */
+ cpGFpxMul_G0(t1, t1, pGFEx);
+ subF(pR0, t0, t1, pGroundGFE);
+ addF(pR1, u0, u0, pGroundGFE); /* r[1] = 2*a[0]*a[1] */
+
+ #if defined GS_DBG
+ cpGFpReleasePool(2, pGroundGFE);
+ #endif
+
+ cpGFpReleasePool(3, pGroundGFE);
+ return pR;
+}
+
+/*
+// return specific polynomi alarith methods
+// polynomial - deg 2 binomial
+*/
+static gsModMethod* gsPolyArith_binom2(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_p2_binom,
+ cpGFpxSqr_p2_binom,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_binom2, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Binom,
+ 2,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith_binom2();
+ return &method;
+}
+
+
+/*
+// Multiplication in GF(p^3), if field polynomial: g(x) = x^3 + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxMul_p3_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+ const BNU_CHUNK_T* pA2 = pA+groundElemLen*2;
+
+ const BNU_CHUNK_T* pB0 = pB;
+ const BNU_CHUNK_T* pB1 = pB+groundElemLen;
+ const BNU_CHUNK_T* pB2 = pB+groundElemLen*2;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+ BNU_CHUNK_T* pR2 = pR+groundElemLen*2;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(6, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* t2 = t1+groundElemLen;
+ BNU_CHUNK_T* u0 = t2+groundElemLen;
+ BNU_CHUNK_T* u1 = u0+groundElemLen;
+ BNU_CHUNK_T* u2 = u1+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ addF(u0 ,pA0, pA1, pGroundGFE); /* u0 = a[0]+a[1] */
+ addF(t0 ,pB0, pB1, pGroundGFE); /* t0 = b[0]+b[1] */
+ mulF(u0, u0, t0, pGroundGFE); /* u0 = (a[0]+a[1])*(b[0]+b[1]) */
+ mulF(t0, pA0, pB0, pGroundGFE); /* t0 = a[0]*b[0] */
+
+ addF(u1 ,pA1, pA2, pGroundGFE); /* u1 = a[1]+a[2] */
+ addF(t1 ,pB1, pB2, pGroundGFE); /* t1 = b[1]+b[2] */
+ mulF(u1, u1, t1, pGroundGFE); /* u1 = (a[1]+a[2])*(b[1]+b[2]) */
+ mulF(t1, pA1, pB1, pGroundGFE); /* t1 = a[1]*b[1] */
+
+ addF(u2 ,pA2, pA0, pGroundGFE); /* u2 = a[2]+a[0] */
+ addF(t2 ,pB2, pB0, pGroundGFE); /* t2 = b[2]+b[0] */
+ mulF(u2, u2, t2, pGroundGFE); /* u2 = (a[2]+a[0])*(b[2]+b[0]) */
+ mulF(t2, pA2, pB2, pGroundGFE); /* t2 = a[2]*b[2] */
+
+ subF(u0, u0, t0, pGroundGFE); /* u0 = a[0]*b[1]+a[1]*b[0] */
+ subF(u0, u0, t1, pGroundGFE);
+ subF(u1, u1, t1, pGroundGFE); /* u1 = a[1]*b[2]+a[2]*b[1] */
+ subF(u1, u1, t2, pGroundGFE);
+ subF(u2, u2, t2, pGroundGFE); /* u2 = a[2]*b[0]+a[0]*b[2] */
+ subF(u2, u2, t0, pGroundGFE);
+
+ cpGFpxMul_G0(u1, u1, pGFEx); /* u1 = (a[1]*b[2]+a[2]*b[1]) * beta */
+ cpGFpxMul_G0(t2, t2, pGFEx); /* t2 = a[2]*b[2] * beta */
+
+ subF(pR0, t0, u1, pGroundGFE); /* r[0] = a[0]*b[0] - (a[2]*b[1]+a[1]*b[2])*beta */
+ subF(pR1, u0, t2, pGroundGFE); /* r[1] = a[1]*b[0] + a[0]*b[1] - a[2]*b[2]*beta */
+
+ addF(pR2, u2, t1, pGroundGFE); /* r[2] = a[2]*b[0] + a[1]*b[1] + a[0]*b[2] */
+
+ cpGFpReleasePool(6, pGroundGFE);
+ return pR;
+}
+
+/*
+// Squaring in GF(p^3), if field polynomial: g(x) = x^3 + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxSqr_p3_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGroundGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+ const BNU_CHUNK_T* pA2 = pA+groundElemLen*2;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+ BNU_CHUNK_T* pR2 = pR+groundElemLen*2;
+
+ BNU_CHUNK_T* s0 = cpGFpGetPool(5, pGroundGFE);
+ BNU_CHUNK_T* s1 = s0+groundElemLen;
+ BNU_CHUNK_T* s2 = s1+groundElemLen;
+ BNU_CHUNK_T* s3 = s2+groundElemLen;
+ BNU_CHUNK_T* s4 = s3+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=s0);
+
+ addF(s2, pA0, pA2, pGroundGFE);
+ subF(s2, s2, pA1, pGroundGFE);
+ sqrF(s2, s2, pGroundGFE);
+ sqrF(s0, pA0, pGroundGFE);
+ sqrF(s4, pA2, pGroundGFE);
+ mulF(s1, pA0, pA1, pGroundGFE);
+ mulF(s3, pA1, pA2, pGroundGFE);
+ addF(s1, s1, s1, pGroundGFE);
+ addF(s3, s3, s3, pGroundGFE);
+
+ addF(pR2, s1, s2, pGroundGFE);
+ addF(pR2, pR2, s3, pGroundGFE);
+ subF(pR2, pR2, s0, pGroundGFE);
+ subF(pR2, pR2, s4, pGroundGFE);
+
+ cpGFpxMul_G0(s4, s4, pGFEx);
+ subF(pR1, s1, s4, pGroundGFE);
+
+ cpGFpxMul_G0(s3, s3, pGFEx);
+ subF(pR0, s0, s3, pGroundGFE);
+
+ cpGFpReleasePool(5, pGroundGFE);
+ return pR;
+}
+
+
+/*
+// return specific polynomi alarith methods
+// polynomial - deg 3 binomial
+*/
+static gsModMethod* gsPolyArith_binom3(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_p3_binom,
+ cpGFpxSqr_p3_binom,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+/*
+// returns methods
+*/
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_binom3, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Binom,
+ 3,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith_binom3();
+ return &method;
+}
+
+
+/*
+// Multiplication in GF(p^d), if field polynomial: g(x) = x^d + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxMul_pd_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ BNU_CHUNK_T* pGFpolynomial = GFP_MODULUS(pGFEx);
+ int deg = GFP_EXTDEGREE(pGFEx);
+ int elemLen= GFP_FELEN(pGFEx);
+ int groundElemLen = GFP_FELEN(GFP_PARENT(pGFEx));
+ int d;
+
+ BNU_CHUNK_T* R = cpGFpGetPool(4, pGFEx);
+ BNU_CHUNK_T* X = R+elemLen;
+ BNU_CHUNK_T* T0= X+elemLen;
+ BNU_CHUNK_T* T1= T0+elemLen;
+ //gres: temporary excluded: assert(NULL!=R);
+
+ /* T0 = A * beta */
+ cpGFpxMul_GFE(T0, pA, pGFpolynomial, pGFEx);
+ /* T1 = A */
+ cpGFpElementCopy(T1, pA, elemLen);
+
+ /* R = A * B[0] */
+ cpGFpxMul_GFE(R, pA, pB, pGFEx);
+
+ /* R += (A*B[d]) mod g() */
+ for(d=1; d<deg; d++) {
+ cpGFpxMul_GFE(X, GFPX_IDX_ELEMENT(T0, deg-d, groundElemLen), GFPX_IDX_ELEMENT(pB, d, groundElemLen), pGFEx);
+ GFP_METHOD(pGFEx)->add(R, R, X, pGFEx);
+ }
+ cpGFpElementCopy(pR, R, elemLen);
+
+ cpGFpReleasePool(4, pGFEx);
+ return pR;
+}
+
+/*
+// Squaring in GF(p^d), if field polynomial: g(x) = x^d + beta => binominal
+*/
+static BNU_CHUNK_T* cpGFpxSqr_pd_binom(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ return cpGFpxMul_pd_binom(pR, pA, pA, pGFEx);
+}
+
+/*
+// return specific polynomial arith methods
+// polynomial - general binomial
+*/
+static gsModMethod* gsPolyArith_binom(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_pd_binom,
+ cpGFpxSqr_pd_binom,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_binom, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Binom,
+ 0,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith_binom();
+ return &method;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom_epid2.c b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom_epid2.c
new file mode 100644
index 0000000..6bb13bc
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_binom_epid2.c
@@ -0,0 +1,498 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p^d) methods, if binomial generator
+//
+*/
+#include "owncp.h"
+
+#include "pcpgfpxstuff.h"
+#include "pcpgfpxmethod_com.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+/*
+// EPID 2.0 specific.
+//
+// EPID 2.0 uses the following finite field hierarchy:
+//
+// 1) prime field GF(p),
+// p = 0xFFFFFFFFFFFCF0CD46E5F25EEE71A49F0CDC65FB12980A82D3292DDBAED33013
+//
+// 2) 2-degree extension of GF(p): GF(p^2) == GF(p)[x]/g(x), g(x) = x^2 -beta,
+// beta =-1 mod p, so "beta" represents as {1}
+//
+// 3) 3-degree extension of GF(p^2) ~ GF(p^6): GF((p^2)^3) == GF(p)[v]/g(v), g(v) = v^3 -xi,
+// xi belongs GF(p^2), xi=x+2, so "xi" represents as {2,1} ---- "2" is low- and "1" is high-order coefficients
+//
+// 4) 2-degree extension of GF((p^2)^3) ~ GF(p^12): GF(((p^2)^3)^2) == GF(p)[w]/g(w), g(w) = w^2 -vi,
+// psi belongs GF((p^2)^3), vi=0*v^2 +1*v +0, so "vi" represents as {0,1,0}---- "0", '1" and "0" are low-, middle- and high-order coefficients
+//
+// See representations in t_gfpparam.cpp
+//
+*/
+
+/*
+// Multiplication case: mul(a, xi) over GF(p^2),
+// where:
+// a, belongs to GF(p^2)
+// xi belongs to GF(p^2), xi={2,1}
+//
+// The case is important in GF((p^2)^3) arithmetic for EPID 2.0.
+//
+*/
+__INLINE BNU_CHUNK_T* cpFq2Mul_xi(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ int termLen = GFP_FELEN(pGroundGFE);
+ BNU_CHUNK_T* t0 = cpGFpGetPool(2, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+termLen;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+termLen;
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+termLen;
+
+ //gres: temporary excluded: assert(NULL!=t0);
+ addF(t0, pA0, pA0, pGroundGFE);
+ addF(t1, pA0, pA1, pGroundGFE);
+ subF(pR0, t0, pA1, pGroundGFE);
+ addF(pR1, t1, pA1, pGroundGFE);
+
+ cpGFpReleasePool(2, pGroundGFE);
+ return pR;
+}
+
+/*
+// Multiplication case: mul(a, vi) over GF((p^2)^3),
+// where:
+// a, belongs to GF((p^2)^3)
+// xi belongs to GF((p^2)^3), vi={0,1,0}
+//
+// The case is important in GF(((p^2)^3)^2) arithmetic for EPID 2.0.
+//
+*/
+__INLINE BNU_CHUNK_T* cpFq6Mul_vi(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int termLen = GFP_FELEN(pGroundGFE);
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+termLen;
+ const BNU_CHUNK_T* pA2 = pA+termLen*2;
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+termLen;
+ BNU_CHUNK_T* pR2 = pR+termLen*2;
+
+ BNU_CHUNK_T* t = cpGFpGetPool(1, pGroundGFE);
+ //gres: temporary excluded: assert(NULL!=t);
+
+ cpFq2Mul_xi(t, pA2, pGroundGFE);
+ cpGFpElementCopy(pR2, pA1, termLen);
+ cpGFpElementCopy(pR1, pA0, termLen);
+ cpGFpElementCopy(pR0, t, termLen);
+
+ cpGFpReleasePool(1, pGroundGFE);
+
+ return pR;
+}
+
+/*
+// Multiplication case: mul(a, g0) over GF(()),
+// where:
+// a and g0 belongs to GF(()) - field is being extension
+//
+// The case is important in GF(()^d) arithmetic if constructed polynomial is generic binomial g(t) = t^d +g0.
+//
+*/
+static BNU_CHUNK_T* cpGFpxMul_G0(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ BNU_CHUNK_T* pGFpolynomial = GFP_MODULUS(pGFEx); /* g(x) = t^d + g0 */
+ return GFP_METHOD(pGroundGFE)->mul(pR, pA, pGFpolynomial, pGroundGFE);
+}
+
+/*
+// EPID20 specific
+// ~~~~~~~~~~~~~~~
+//
+// Multiplication over GF(p^2)
+// - field polynomial: g(x) = x^2 - beta => binominal with specific value of "beta"
+// - beta = p-1
+//
+// Multiplication over GF(((p^2)^3)^2) ~ GF(p^12)
+// - field polynomial: g(w) = w^2 - vi => binominal with specific value of "vi"
+// - vi = 0*v^2 + 1*v + 0 - i.e vi={0,1,0} belongs to GF((p^2)^3)
+*/
+static BNU_CHUNK_T* cpGFpxMul_p2_binom_epid2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+
+ const BNU_CHUNK_T* pB0 = pB;
+ const BNU_CHUNK_T* pB1 = pB+groundElemLen;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(4, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* t2 = t1+groundElemLen;
+ BNU_CHUNK_T* t3 = t2+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ mulF(t0, pA0, pB0, pGroundGFE); /* t0 = a[0]*b[0] */
+ mulF(t1, pA1, pB1, pGroundGFE); /* t1 = a[1]*b[1] */
+ addF(t2, pA0, pA1, pGroundGFE); /* t2 = a[0]+a[1] */
+ addF(t3, pB0, pB1, pGroundGFE); /* t3 = b[0]+b[1] */
+
+ mulF(pR1, t2, t3, pGroundGFE); /* r[1] = (a[0]+a[1]) * (b[0]+b[1]) */
+ subF(pR1, pR1, t0, pGroundGFE); /* r[1] -= a[0]*b[0]) + a[1]*b[1] */
+ subF(pR1, pR1, t1, pGroundGFE);
+
+ /* EPID2 specific */
+ {
+ int basicExtDegree = cpGFpBasicDegreeExtension(pGFEx);
+
+ /* deal with GF(p^2) */
+ if(basicExtDegree==2) {
+ subF(pR0, t0, t1, pGroundGFE);
+ }
+ /* deal with GF(p^6^2) */
+ else if(basicExtDegree==12) {
+ cpFq6Mul_vi(t1, t1, pGroundGFE);
+ addF(pR0, t0, t1, pGroundGFE);
+ }
+ /* deal with GF(p^x^2) - it's not EPID2 case, just a case */
+ else {
+ cpGFpxMul_G0(t1, t1, pGFEx);
+ subF(pR0, t0, t1, pGroundGFE);
+ }
+ }
+
+ cpGFpReleasePool(4, pGroundGFE);
+ return pR;
+}
+
+/*
+// EPID20 specific
+// ~~~~~~~~~~~~~~~
+//
+// Squaring over GF(p^2)
+// - field polynomial: g(x) = x^2 - beta => binominal with specific value of "beta"
+// - beta = p-1
+//
+// Squaring in GF(((p^2)^3)^2) ~ GF(p^12)
+// - field polynomial: g(w) = w^2 - vi => binominal with specific value of "vi"
+// - vi = 0*v^2 + 1*v + 0 - i.e vi={0,1,0} belongs to GF((p^2)^3)
+*/
+static BNU_CHUNK_T* cpGFpxSqr_p2_binom_epid2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGroundGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(3, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* u0 = t1+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ mulF(u0, pA0, pA1, pGroundGFE); /* u0 = a[0]*a[1] */
+
+ /* EPID2 specific */
+ {
+ int basicExtDegree = cpGFpBasicDegreeExtension(pGFEx);
+
+ /* deal with GF(p^2) */
+ if(basicExtDegree==2) {
+ addF(t0, pA0, pA1, pGroundGFE);
+ subF(t1, pA0, pA1, pGroundGFE);
+ mulF(pR0, t0, t1, pGroundGFE);
+ addF(pR1, u0, u0, pGroundGFE); /* r[1] = 2*a[0]*a[1] */
+ }
+ /* deal with GF(p^6^2) */
+ else if(basicExtDegree==12) {
+ subF(t0, pA0, pA1, pGroundGFE);
+ cpFq6Mul_vi(t1, pA1, pGroundGFE);
+ subF(t1, pA0, t1, pGroundGFE);
+ mulF(t0, t0, t1, pGroundGFE);
+ addF(t0, t0, u0, pGroundGFE);
+ cpFq6Mul_vi(t1, u0, pGroundGFE);
+ addF(pR0, t0, t1, pGroundGFE);
+ addF(pR1, u0, u0, pGroundGFE);
+ }
+ /* just a case */
+ else {
+ sqrF(t0, pA0, pGroundGFE); /* t0 = a[0]*a[0] */
+ sqrF(t1, pA1, pGroundGFE); /* t1 = a[1]*a[1] */
+ cpGFpxMul_G0(t1, t1, pGFEx);
+ subF(pR0, t0, t1, pGroundGFE);
+ addF(pR1, u0, u0, pGroundGFE); /* r[1] = 2*a[0]*a[1] */
+ }
+ }
+
+ cpGFpReleasePool(3, pGroundGFE);
+ return pR;
+}
+
+/*
+// return specific polynomi alarith methods
+// polynomial - deg 2 binomial (EPID 2.0)
+*/
+static gsModMethod* gsPolyArith_binom2_epid2(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_p2_binom_epid2,
+ cpGFpxSqr_p2_binom_epid2,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_binom2_epid2, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Binom2_epid20,
+ 2,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith_binom2_epid2();
+ return &method;
+}
+
+
+/*
+// EPID20 specific
+// ~~~~~~~~~~~~~~~
+//
+// Multiplication over GF((p^2)^3)
+// - field polynomial: g(v) = v^3 - xi => binominal with specific value of "xi"
+// - xi = x+2
+*/
+static BNU_CHUNK_T* cpGFpxMul_p3_binom_epid2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+ const BNU_CHUNK_T* pA2 = pA+groundElemLen*2;
+
+ const BNU_CHUNK_T* pB0 = pB;
+ const BNU_CHUNK_T* pB1 = pB+groundElemLen;
+ const BNU_CHUNK_T* pB2 = pB+groundElemLen*2;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+ BNU_CHUNK_T* pR2 = pR+groundElemLen*2;
+
+ BNU_CHUNK_T* t0 = cpGFpGetPool(6, pGroundGFE);
+ BNU_CHUNK_T* t1 = t0+groundElemLen;
+ BNU_CHUNK_T* t2 = t1+groundElemLen;
+ BNU_CHUNK_T* u0 = t2+groundElemLen;
+ BNU_CHUNK_T* u1 = u0+groundElemLen;
+ BNU_CHUNK_T* u2 = u1+groundElemLen;
+ //gres: temporary excluded: assert(NULL!=t0);
+
+ addF(u0 ,pA0, pA1, pGroundGFE); /* u0 = a[0]+a[1] */
+ addF(t0 ,pB0, pB1, pGroundGFE); /* t0 = b[0]+b[1] */
+ mulF(u0, u0, t0, pGroundGFE); /* u0 = (a[0]+a[1])*(b[0]+b[1]) */
+ mulF(t0, pA0, pB0, pGroundGFE); /* t0 = a[0]*b[0] */
+
+ addF(u1 ,pA1, pA2, pGroundGFE); /* u1 = a[1]+a[2] */
+ addF(t1 ,pB1, pB2, pGroundGFE); /* t1 = b[1]+b[2] */
+ mulF(u1, u1, t1, pGroundGFE); /* u1 = (a[1]+a[2])*(b[1]+b[2]) */
+ mulF(t1, pA1, pB1, pGroundGFE); /* t1 = a[1]*b[1] */
+
+ addF(u2 ,pA2, pA0, pGroundGFE); /* u2 = a[2]+a[0] */
+ addF(t2 ,pB2, pB0, pGroundGFE); /* t2 = b[2]+b[0] */
+ mulF(u2, u2, t2, pGroundGFE); /* u2 = (a[2]+a[0])*(b[2]+b[0]) */
+ mulF(t2, pA2, pB2, pGroundGFE); /* t2 = a[2]*b[2] */
+
+ subF(u0, u0, t0, pGroundGFE); /* u0 = a[0]*b[1]+a[1]*b[0] */
+ subF(u0, u0, t1, pGroundGFE);
+ subF(u1, u1, t1, pGroundGFE); /* u1 = a[1]*b[2]+a[2]*b[1] */
+ subF(u1, u1, t2, pGroundGFE);
+ subF(u2, u2, t2, pGroundGFE); /* u2 = a[2]*b[0]+a[0]*b[2] */
+ subF(u2, u2, t0, pGroundGFE);
+
+ /* EPID2 specific */
+ {
+ int basicExtDegree = cpGFpBasicDegreeExtension(pGFEx);
+
+ /* deal with GF(p^2^3) */
+ if(basicExtDegree==6) {
+ cpFq2Mul_xi(u1, u1, pGroundGFE);
+ cpFq2Mul_xi(t2, t2, pGroundGFE);
+ addF(pR0, t0, u1, pGroundGFE); /* r[0] = a[0]*b[0] - (a[2]*b[1]+a[1]*b[2])*beta */
+ addF(pR1, u0, t2, pGroundGFE); /* r[1] = a[1]*b[0] + a[0]*b[1] - a[2]*b[2]*beta */
+ }
+ /* just a case */
+ else {
+ cpGFpxMul_G0(u1, u1, pGFEx); /* u1 = (a[1]*b[2]+a[2]*b[1]) * beta */
+ cpGFpxMul_G0(t2, t2, pGFEx); /* t2 = a[2]*b[2] * beta */
+ subF(pR0, t0, u1, pGroundGFE); /* r[0] = a[0]*b[0] - (a[2]*b[1]+a[1]*b[2])*beta */
+ subF(pR1, u0, t2, pGroundGFE); /* r[1] = a[1]*b[0] + a[0]*b[1] - a[2]*b[2]*beta */
+ }
+ }
+
+ addF(pR2, u2, t1, pGroundGFE); /* r[2] = a[2]*b[0] + a[1]*b[1] + a[0]*b[2] */
+
+ cpGFpReleasePool(6, pGroundGFE);
+ return pR;
+}
+
+/*
+// EPID20 specific
+// ~~~~~~~~~~~~~~~
+//
+// Squaring over GF((p^2)^3)
+// - field polynomial: g(v) = v^3 - xi => binominal with specific value of "xi"
+// - xi = x+2
+*/
+static BNU_CHUNK_T* cpGFpxSqr_p3_binom_epid2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sqr sqrF = GFP_METHOD(pGroundGFE)->sqr;
+ mod_add addF = GFP_METHOD(pGroundGFE)->add;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ const BNU_CHUNK_T* pA0 = pA;
+ const BNU_CHUNK_T* pA1 = pA+groundElemLen;
+ const BNU_CHUNK_T* pA2 = pA+groundElemLen*2;
+
+ BNU_CHUNK_T* pR0 = pR;
+ BNU_CHUNK_T* pR1 = pR+groundElemLen;
+ BNU_CHUNK_T* pR2 = pR+groundElemLen*2;
+
+ BNU_CHUNK_T* s0 = cpGFpGetPool(5, pGroundGFE);
+ BNU_CHUNK_T* s1 = s0+groundElemLen;
+ BNU_CHUNK_T* s2 = s1+groundElemLen;
+ BNU_CHUNK_T* s3 = s2+groundElemLen;
+ BNU_CHUNK_T* s4 = s3+groundElemLen;
+
+ addF(s2, pA0, pA2, pGroundGFE);
+ subF(s2, s2, pA1, pGroundGFE);
+ sqrF(s2, s2, pGroundGFE);
+ sqrF(s0, pA0, pGroundGFE);
+ sqrF(s4, pA2, pGroundGFE);
+ mulF(s1, pA0, pA1, pGroundGFE);
+ mulF(s3, pA1, pA2, pGroundGFE);
+ addF(s1, s1, s1, pGroundGFE);
+ addF(s3, s3, s3, pGroundGFE);
+
+ addF(pR2, s1, s2, pGroundGFE);
+ addF(pR2, pR2, s3, pGroundGFE);
+ subF(pR2, pR2, s0, pGroundGFE);
+ subF(pR2, pR2, s4, pGroundGFE);
+
+ /* EPID2 specific */
+ {
+ int basicExtDegree = cpGFpBasicDegreeExtension(pGFEx);
+
+ /* deal with GF(p^2^3) */
+ if(basicExtDegree==6) {
+ cpFq2Mul_xi(s4, s4, pGroundGFE);
+ cpFq2Mul_xi(s3, s3, pGroundGFE);
+ addF(pR1, s1, s4, pGroundGFE);
+ addF(pR0, s0, s3, pGroundGFE);
+ }
+ /* just a case */
+ else {
+ cpGFpxMul_G0(s4, s4, pGFEx);
+ cpGFpxMul_G0(s3, s3, pGFEx);
+ subF(pR1, s1, s4, pGroundGFE);
+ subF(pR0, s0, s3, pGroundGFE);
+ }
+ }
+
+ cpGFpReleasePool(5, pGroundGFE);
+ return pR;
+}
+
+/*
+// return specific polynomi alarith methods
+// polynomial - deg 3 binomial (EPID 2.0)
+*/
+static gsModMethod* gsPolyArith_binom3_epid2(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_p3_binom_epid2,
+ cpGFpxSqr_p3_binom_epid2,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_binom3_epid2, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Binom3_epid20,
+ 3,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith_binom3_epid2();
+ return &method;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.c b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.c
new file mode 100644
index 0000000..094c16f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.c
@@ -0,0 +1,311 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p^d) methods
+//
+*/
+#include "owncp.h"
+
+#include "pcpgfpxstuff.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+
+BNU_CHUNK_T* cpGFpxAdd_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_add addF = GFP_METHOD(pBasicGFE)->add;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ addF(pTmp, pA, pB, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ pB += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxSub_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_sub subF = GFP_METHOD(pBasicGFE)->sub;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ subF(pTmp, pA, pB, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ pB += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxNeg_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_neg negF = GFP_METHOD(pBasicGFE)->neg;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ negF(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxMul_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx)
+{
+ int extDegree = GFP_EXTDEGREE(pGFEx);
+
+ BNU_CHUNK_T* pGFpolynomial = GFP_MODULUS(pGFEx);
+ int degR = extDegree-1;
+ int elemLen= GFP_FELEN(pGFEx);
+
+ int degB = degR;
+ BNU_CHUNK_T* pTmpProduct = cpGFpGetPool(2, pGFEx);
+ BNU_CHUNK_T* pTmpResult = pTmpProduct + GFP_PELEN(pGFEx);
+
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ BNU_CHUNK_T* r = cpGFpGetPool(1, pGroundGFE);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ const BNU_CHUNK_T* pTmpB = GFPX_IDX_ELEMENT(pB, degB, groundElemLen);
+
+ //gres: temporary excluded: assert(NULL!=pTmpProduct && NULL!=r);
+
+ /* clear temporary */
+ cpGFpElementPadd(pTmpProduct, elemLen, 0);
+
+ /* R = A * B[degB-1] */
+ cpGFpxMul_GFE(pTmpResult, pA, pTmpB, pGFEx);
+
+ for(degB-=1; degB>=0; degB--) {
+ /* save R[degR-1] */
+ cpGFpElementCopy(r, GFPX_IDX_ELEMENT(pTmpResult, degR, groundElemLen), groundElemLen);
+
+ { /* R = R * x */
+ int j;
+ for (j=degR; j>=1; j--)
+ cpGFpElementCopy(GFPX_IDX_ELEMENT(pTmpResult, j, groundElemLen), GFPX_IDX_ELEMENT(pTmpResult, j-1, groundElemLen), groundElemLen);
+ cpGFpElementPadd(pTmpResult, groundElemLen, 0);
+ }
+
+ cpGFpxMul_GFE(pTmpProduct, pGFpolynomial, r, pGFEx);
+ GFP_METHOD(pGFEx)->sub(pTmpResult, pTmpResult, pTmpProduct, pGFEx);
+
+ /* B[degB-i] */
+ pTmpB -= groundElemLen;
+ cpGFpxMul_GFE(pTmpProduct, pA, pTmpB, pGFEx);
+ GFP_METHOD(pGFEx)->add(pTmpResult, pTmpResult, pTmpProduct, pGFEx);
+ }
+
+ /* copy result */
+ cpGFpElementCopy(pR, pTmpResult, elemLen);
+
+ /* release pools */
+ cpGFpReleasePool(1, pGroundGFE);
+ cpGFpReleasePool(2, pGFEx);
+
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxSqr_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ int extDegree = GFP_EXTDEGREE(pGFEx);
+
+ BNU_CHUNK_T* pGFpolynomial = GFP_MODULUS(pGFEx);
+ int degR = extDegree-1;
+ int elemLen= GFP_FELEN(pGFEx);
+
+ int degA = degR;
+ BNU_CHUNK_T* pTmpProduct = cpGFpGetPool(2, pGFEx);
+ BNU_CHUNK_T* pTmpResult = pTmpProduct + GFP_PELEN(pGFEx);
+
+ gsEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ BNU_CHUNK_T* r = cpGFpGetPool(1, pGroundGFE);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ const BNU_CHUNK_T* pTmpA = GFPX_IDX_ELEMENT(pA, degA, groundElemLen);
+
+ //gres: temporary excluded: assert(NULL!=pTmpProduct && NULL!=r);
+
+ /* clear temporary */
+ cpGFpElementPadd(pTmpProduct, elemLen, 0);
+
+ /* R = A * A[degA-1] */
+ cpGFpxMul_GFE(pTmpResult, pA, pTmpA, pGFEx);
+
+ for(degA-=1; degA>=0; degA--) {
+ /* save R[degR-1] */
+ cpGFpElementCopy(r, GFPX_IDX_ELEMENT(pTmpResult, degR, groundElemLen), groundElemLen);
+
+ { /* R = R * x */
+ int j;
+ for (j=degR; j>=1; j--)
+ cpGFpElementCopy(GFPX_IDX_ELEMENT(pTmpResult, j, groundElemLen), GFPX_IDX_ELEMENT(pTmpResult, j-1, groundElemLen), groundElemLen);
+ cpGFpElementPadd(pTmpResult, groundElemLen, 0);
+ }
+
+ cpGFpxMul_GFE(pTmpProduct, pGFpolynomial, r, pGFEx);
+ GFP_METHOD(pGFEx)->sub(pTmpResult, pTmpResult, pTmpProduct, pGFEx);
+
+ /* A[degA-i] */
+ pTmpA -= groundElemLen;
+ cpGFpxMul_GFE(pTmpProduct, pA, pTmpA, pGFEx);
+ GFP_METHOD(pGFEx)->add(pTmpResult, pTmpResult, pTmpProduct, pGFEx);
+ }
+
+ /* copy result */
+ cpGFpElementCopy(pR, pTmpResult, elemLen);
+
+ /* release pools */
+ cpGFpReleasePool(1, pGroundGFE);
+ cpGFpReleasePool(2, pGFEx);
+
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxDiv2_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_div2 div2F = GFP_METHOD(pBasicGFE)->div2;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ div2F(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxMul2_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_mul2 mul2F = GFP_METHOD(pBasicGFE)->mul2;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ mul2F(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxMul3_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_mul3 mul3F = GFP_METHOD(pBasicGFE)->mul3;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ mul3F(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxEncode_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_encode encodeF = GFP_METHOD(pBasicGFE)->encode;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ encodeF(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxDecode_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx)
+{
+ gsEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ mod_decode decodeF = GFP_METHOD(pBasicGFE)->decode;
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ decodeF(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+/*
+// return common polynomi alarith methods
+*/
+static gsModMethod* gsPolyArith(void)
+{
+ static gsModMethod m = {
+ cpGFpxEncode_com,
+ cpGFpxDecode_com,
+ cpGFpxMul_com,
+ cpGFpxSqr_com,
+ NULL,
+ cpGFpxAdd_com,
+ cpGFpxSub_com,
+ cpGFpxNeg_com,
+ cpGFpxDiv2_com,
+ cpGFpxMul2_com,
+ cpGFpxMul3_com,
+ //cpGFpxInv
+ };
+ return &m;
+}
+
+IPPFUN( const IppsGFpMethod*, ippsGFpxMethod_com, (void) )
+{
+ static IppsGFpMethod method = {
+ cpID_Poly,
+ 0,
+ NULL,
+ NULL
+ };
+ method.arith = gsPolyArith();
+ return &method;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.h b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.h
new file mode 100644
index 0000000..df728c2
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxmethod_com.h
@@ -0,0 +1,52 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// GF(p^d) methods
+//
+*/
+#if !defined(_CP_GFP_METHOD_COM_H)
+#define _CP_GFP_METHOD_COM_H
+
+#include "owncp.h"
+#include "pcpgfpstuff.h"
+
+#define cpGFpxAdd_com OWNAPI(cpGFpxAdd_com)
+BNU_CHUNK_T* cpGFpxAdd_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx);
+#define cpGFpxSub_com OWNAPI(cpGFpxSub_com)
+BNU_CHUNK_T* cpGFpxSub_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx);
+#define cpGFpxNeg_com OWNAPI(cpGFpxNeg_com)
+BNU_CHUNK_T* cpGFpxNeg_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+
+#define cpGFpxMul_com OWNAPI(cpGFpxMul_com)
+BNU_CHUNK_T* cpGFpxMul_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFEx);
+#define cpGFpxSqr_com OWNAPI(cpGFpxSqr_com)
+BNU_CHUNK_T* cpGFpxSqr_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+
+#define cpGFpxDiv2_com OWNAPI(cpGFpxDiv2_com)
+BNU_CHUNK_T* cpGFpxDiv2_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+#define cpGFpxMul2_com OWNAPI(cpGFpxMul2_com)
+BNU_CHUNK_T* cpGFpxMul2_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+#define cpGFpxMul3_com OWNAPI(cpGFpxMul3_com)
+BNU_CHUNK_T* cpGFpxMul3_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+
+#define cpGFpxEncode_com OWNAPI(cpGFpxEncode_com)
+BNU_CHUNK_T* cpGFpxEncode_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+#define cpGFpxDecode_com OWNAPI(cpGFpxDecode_com)
+BNU_CHUNK_T* cpGFpxDecode_com(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFEx);
+
+#endif /* _CP_GFP_METHOD_COM_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c b/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c
new file mode 100644
index 0000000..625a7da
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c
@@ -0,0 +1,722 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Performance Primitives. Cryptography Primitives.
+// Internal operations over GF(p) extension.
+//
+// Context:
+// cpGFpxRand
+// cpGFpxSet, cpGFpxSetPolyTerm
+// cpGFpxGet, cpGFpxGetPolyTerm
+//
+// cpGFpxNeg
+// cpGFpxInv
+// cpGFpxHalve
+// cpGFpxAdd, cpGFpxAdd_GFE
+// cpGFpxSub, cpGFpxSub_GFE
+// cpGFpxMul, cpGFpxMul_GFE
+// cpGFpxSqr
+// cpGFpxExp, cpGFpxMultiExp
+// cpGFpxConj
+//
+//
+*/
+#include "owncp.h"
+
+#include "pcpbnumisc.h"
+#include "pcpgfpxstuff.h"
+#include "gsscramble.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+
+BNU_CHUNK_T* cpGFpxRand(BNU_CHUNK_T* pR, gsModEngine* pGFEx, IppBitSupplier rndFunc, void* pRndParam)
+{
+ if( GFP_IS_BASIC(pGFEx) )
+ return cpGFpRand(pR, pGFEx, rndFunc, pRndParam);
+
+ else {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ if(NULL == cpGFpRand(pTmp, pBasicGFE, rndFunc, pRndParam))
+ break;
+ pTmp += basicElemLen;
+ }
+ return deg==basicDeg? pR : NULL;
+ }
+}
+
+BNU_CHUNK_T* cpGFpxSet(BNU_CHUNK_T* pE, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx)
+{
+ if( GFP_IS_BASIC(pGFEx) )
+ return cpGFpSet(pE, pDataA, nsA, pGFEx);
+
+ else {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+
+ BNU_CHUNK_T* pTmpE = pE;
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ int deg, error;
+ for(deg=0, error=0; deg<basicDeg && !error; deg++) {
+ int pieceA = IPP_MIN(nsA, basicElemLen);
+
+ error = NULL == cpGFpSet(pTmpE, pDataA, pieceA, pBasicGFE);
+ pTmpE += basicElemLen;
+ pDataA += pieceA;
+ nsA -= pieceA;
+ }
+
+ return (deg<basicDeg)? NULL : pE;
+ }
+}
+
+BNU_CHUNK_T* cpGFpxSetPolyTerm(BNU_CHUNK_T* pE, int deg, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx)
+{
+ pE += deg * GFP_FELEN(pGFEx);
+ return cpGFpxSet(pE, pDataA, nsA, pGFEx);
+}
+
+BNU_CHUNK_T* cpGFpxGet(BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pE, gsModEngine* pGFEx)
+{
+ cpGFpElementPadd(pDataA, nsA, 0);
+
+ if( GFP_IS_BASIC(pGFEx) )
+ return cpGFpGet(pDataA, nsA, pE, pGFEx);
+
+ else {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+
+ BNU_CHUNK_T* pTmp = pDataA;
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ int deg;
+ for(deg=0; deg<basicDeg && nsA>0; deg++) {
+ int pieceA = IPP_MIN(nsA, basicElemLen);
+
+ cpGFpGet(pTmp, pieceA, pE, pBasicGFE);
+ pE += basicElemLen;
+ pTmp += pieceA;
+ nsA -= pieceA;
+ }
+
+ return pDataA;
+ }
+}
+
+BNU_CHUNK_T* cpGFpxGetPolyTerm(BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pE, int deg, gsModEngine* pGFEx)
+{
+ pE += deg * GFP_FELEN(pGFEx);
+ return cpGFpxGet(pDataA, nsA, pE, pGFEx);
+}
+
+BNU_CHUNK_T* cpGFpxConj(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
+{
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+
+ if(pR != pA)
+ cpGFpElementCopy(pR, pA, groundElemLen);
+ MOD_METHOD(pGroundGFE)->neg(pR+groundElemLen, pA+groundElemLen, pGroundGFE);
+
+ return pR;
+}
+
+
+BNU_CHUNK_T* cpGFpxAdd_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
+{
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_add addF = MOD_METHOD(pGroundGFE)->add;
+
+ if(pR != pA) {
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+ int deg = GFP_EXTDEGREE(pGFEx);
+ cpGFpElementCopy(pR+groundElemLen, pA+groundElemLen, groundElemLen*(deg-1));
+ }
+ return addF(pR, pA, pGroundB, pGroundGFE);
+}
+
+BNU_CHUNK_T* cpGFpxSub_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
+{
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_sub subF = MOD_METHOD(pGroundGFE)->sub;
+
+ if(pR != pA) {
+ int groundElemLen = GFP_FELEN(pGroundGFE);
+ int deg = GFP_EXTDEGREE(pGFEx);
+ cpGFpElementCopy(pR+groundElemLen, pA+groundElemLen, groundElemLen*(deg-1));
+ }
+ return subF(pR, pA, pGroundB, pGroundGFE);
+}
+
+BNU_CHUNK_T* cpGFpxMul_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
+{
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul mulF = MOD_METHOD(pGroundGFE)->mul;
+
+ int grounfElemLen = GFP_FELEN(pGroundGFE);
+
+ BNU_CHUNK_T* pTmp = pR;
+
+ int deg;
+ for(deg=0; deg<GFP_EXTDEGREE(pGFEx); deg++) {
+ mulF(pTmp, pA, pGroundB, pGroundGFE);
+ pTmp += grounfElemLen;
+ pA += grounfElemLen;
+ }
+ return pR;
+}
+
+BNU_CHUNK_T* cpGFpxNeg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
+{
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicElemLen = GFP_FELEN(pBasicGFE);
+ int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
+
+ BNU_CHUNK_T* pTmp = pR;
+ int deg;
+ for(deg=0; deg<basicDeg; deg++) {
+ GFP_METHOD(pBasicGFE)->neg(pTmp, pA, pBasicGFE);
+ pTmp += basicElemLen;
+ pA += basicElemLen;
+ }
+ return pR;
+}
+
+static BNU_CHUNK_T* gfpxPolyDiv(BNU_CHUNK_T* pQ, BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA,
+ const BNU_CHUNK_T* pB,
+ gsModEngine* pGFEx)
+{
+ if( GFP_IS_BASIC(pGFEx) )
+ return NULL;
+
+ else {
+ int elemLen = GFP_FELEN(pGFEx);
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ int termLen = GFP_FELEN(pGroundGFE);
+
+ int degA = degree(pA, pGFEx);
+ int degB = degree(pB, pGFEx);
+
+ if(degB==0) {
+ if( GFP_IS_ZERO(pB, termLen) )
+ return NULL;
+ else {
+ gsModEngine* pBasicGFE = cpGFpBasic(pGroundGFE);
+
+ cpGFpInv(pR, pB, pBasicGFE);
+ cpGFpElementPadd(pR+GFP_FELEN(pGroundGFE), termLen-GFP_FELEN(pGroundGFE), 0);
+ cpGFpxMul_GFE(pQ, pA, pR, pGFEx);
+ cpGFpElementPadd(pR, elemLen, 0);
+ return pR;
+ }
+ }
+
+ if(degA < degB) {
+ cpGFpElementPadd(pQ, elemLen, 0);
+ cpGFpElementCopyPadd(pR, elemLen, pA, (degA+1)*termLen);
+ return pR;
+ }
+
+ else {
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ int i, j;
+ BNU_CHUNK_T* pProduct = cpGFpGetPool(2, pGroundGFE);
+ BNU_CHUNK_T* pInvB = pProduct + GFP_PELEN(pGroundGFE);
+ //gres: temporary excluded: assert(NULL!=pProduct);
+
+ cpGFpElementCopyPadd(pR, elemLen, pA, (degA+1)*termLen);
+ cpGFpElementPadd(pQ, elemLen, 0);
+
+ cpGFpxInv(pInvB, GFPX_IDX_ELEMENT(pB, degB, termLen), pGroundGFE);
+
+ for(i=0; i<=degA-degB && !GFP_IS_ZERO(GFPX_IDX_ELEMENT(pR, degA-i, termLen), termLen); i++) {
+ /* compute q term */
+ mulF(GFPX_IDX_ELEMENT(pQ, degA-degB-i, termLen),
+ GFPX_IDX_ELEMENT(pR, degA-i, termLen),
+ pInvB,
+ pGroundGFE);
+
+ /* R -= B * q */
+ cpGFpElementPadd(GFPX_IDX_ELEMENT(pR, degA-i, termLen), termLen, 0);
+ for(j=0; j<degB; j++) {
+ mulF(pProduct,
+ GFPX_IDX_ELEMENT(pB, j ,termLen),
+ GFPX_IDX_ELEMENT(pQ, degA-degB-i, termLen),
+ pGroundGFE);
+ subF(GFPX_IDX_ELEMENT(pR, degA-degB-i+j, termLen),
+ GFPX_IDX_ELEMENT(pR, degA-degB-i+j, termLen),
+ pProduct,
+ pGroundGFE);
+ }
+ }
+
+ cpGFpReleasePool(2, pGroundGFE);
+ return pR;
+ }
+ }
+}
+
+static BNU_CHUNK_T* gfpxGeneratorDiv(BNU_CHUNK_T* pQ, BNU_CHUNK_T* pR, const BNU_CHUNK_T* pB, gsModEngine* pGFEx)
+{
+ if( GFP_IS_BASIC(pGFEx) )
+ return NULL;
+
+ else {
+ int elemLen = GFP_FELEN(pGFEx);
+
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
+ mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
+
+ int termLen = GFP_FELEN(pGroundGFE);
+
+ BNU_CHUNK_T* pInvB = cpGFpGetPool(2, pGroundGFE);
+ BNU_CHUNK_T* pTmp = pInvB + GFP_PELEN(pGroundGFE);
+
+ int degB = degree(pB, pGFEx);
+ int i;
+
+ //gres: temporary excluded: assert(NULL!=pInvB);
+
+ cpGFpElementCopy(pR, GFP_MODULUS(pGFEx), elemLen);
+ cpGFpElementPadd(pQ, elemLen, 0);
+
+ cpGFpxInv(pInvB, GFPX_IDX_ELEMENT(pB, degB, termLen), pGroundGFE);
+
+ for(i=0; i<degB; i++) {
+ BNU_CHUNK_T* ptr;
+ mulF(pTmp, pInvB, GFPX_IDX_ELEMENT(pB, i, termLen), pGroundGFE);
+ ptr = GFPX_IDX_ELEMENT(pR, GFP_EXTDEGREE(pGFEx)-degB+i, termLen);
+ subF(ptr, ptr, pTmp, pGroundGFE);
+ }
+
+ gfpxPolyDiv(pQ, pR, pR, pB, pGFEx);
+
+ cpGFpElementCopy(GFPX_IDX_ELEMENT(pQ, GFP_EXTDEGREE(pGFEx)-degB, termLen), pInvB, termLen);
+
+ cpGFpReleasePool(2, pGroundGFE);
+ return pR;
+ }
+}
+
+BNU_CHUNK_T* cpGFpxInv(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
+{
+ if( GFP_IS_BASIC(pGFEx) )
+ return cpGFpInv(pR, pA, pGFEx);
+
+ if(0==degree(pA, pGFEx)) {
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ BNU_CHUNK_T* tmpR = cpGFpGetPool(1, pGroundGFE);
+ //gres: temporary excluded: assert(NULL!=tmpR);
+
+ cpGFpxInv(tmpR, pA, pGroundGFE);
+
+ cpGFpElementCopyPadd(pR, GFP_FELEN(pGFEx), tmpR, GFP_FELEN(pGroundGFE));
+ cpGFpReleasePool(1, pGroundGFE);
+ return pR;
+ }
+
+ else {
+ int elemLen = GFP_FELEN(pGFEx);
+ gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+
+ int pxVars = 6;
+ int pelemLen = GFP_PELEN(pGFEx);
+ BNU_CHUNK_T* lastrem = cpGFpGetPool(pxVars, pGFEx);
+ BNU_CHUNK_T* rem = lastrem + pelemLen;
+ BNU_CHUNK_T* quo = rem + pelemLen;
+ BNU_CHUNK_T* lastaux = quo + pelemLen;
+ BNU_CHUNK_T* aux = lastaux + pelemLen;
+ BNU_CHUNK_T* temp = aux + pelemLen;
+ //gres: temporary excluded: assert(NULL!=lastrem);
+
+ cpGFpElementCopy(lastrem, pA, elemLen);
+ cpGFpElementCopyPadd(lastaux, elemLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
+
+ gfpxGeneratorDiv(quo, rem, pA, pGFEx);
+ cpGFpxNeg(aux, quo, pGFEx);
+
+ while(degree(rem, pGFEx) > 0) {
+ gfpxPolyDiv(quo, temp, lastrem, rem, pGFEx);
+ SWAP_PTR(BNU_CHUNK_T, rem, lastrem); //
+ SWAP_PTR(BNU_CHUNK_T, temp, rem);
+
+ GFP_METHOD(pGFEx)->neg(quo, quo, pGFEx);
+ GFP_METHOD(pGFEx)->mul(temp, quo, aux, pGFEx);
+ GFP_METHOD(pGFEx)->add(temp, lastaux, temp, pGFEx);
+ SWAP_PTR(BNU_CHUNK_T, aux, lastaux);
+ SWAP_PTR(BNU_CHUNK_T, temp, aux);
+ }
+ if (GFP_IS_ZERO(rem, elemLen)) { /* gcd != 1 */
+ cpGFpReleasePool(pxVars, pGFEx);
+ return NULL;
+ }
+
+ {
+ BNU_CHUNK_T* invRem = cpGFpGetPool(1, pGroundGFE);
+ //gres: temporary excluded: assert(NULL!=invRem);
+
+ cpGFpxInv(invRem, rem, pGroundGFE);
+ cpGFpxMul_GFE(pR, aux, invRem, pGFEx);
+
+ cpGFpReleasePool(1, pGroundGFE);
+ }
+
+ cpGFpReleasePool(pxVars, pGFEx);
+
+ return pR;
+ }
+}
+
+
+static int div_upper(int a, int d)
+{ return (a+d-1)/d; }
+
+static int getNumOperations(int bitsize, int w)
+{
+ int n_overhead = (1<<w) -1;
+ int n_ops = div_upper(bitsize, w) + n_overhead;
+ return n_ops;
+}
+int cpGFpGetOptimalWinSize(int bitsize)
+{
+ int w_opt = 1;
+ int n_opt = getNumOperations(bitsize, w_opt);
+ int w_trial;
+ for(w_trial=w_opt+1; w_trial<=IPP_MAX_EXPONENT_NUM; w_trial++) {
+ int n_trial = getNumOperations(bitsize, w_trial);
+ if(n_trial>=n_opt) break;
+ w_opt = w_trial;
+ n_opt = n_trial;
+ }
+ return w_opt;
+}
+
+
+//#define _GRES_DBG_
+#if defined(_GRES_DBG_)
+#include <stdio.h>
+static void printBNU(const char* note, Ipp64u* pData, int len, int nt)
+{
+ int n, k;
+
+ if(note)
+ printf("%s", note);
+
+ for(n=0, k=0; n<len; n++) {
+ Ipp64u x = pData[n];
+ printf("%016I64x ", x);
+ k++;
+ if(k==nt) {
+ printf("\n");
+ k = 0;
+ }
+ }
+ printf("\n");
+}
+#endif
+
+/* sscm version */
+BNU_CHUNK_T* cpGFpxExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE,
+ gsModEngine* pGFEx, Ipp8u* pScratchBuffer)
+{
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+
+ /* remove leding zeros */
+ FIX_BNU(pE, nsE);
+
+ {
+ mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul and sqr methods */
+ mod_sqr sqrF = GFP_METHOD(pGFEx)->sqr;
+
+ BNU_CHUNK_T* pScratchAligned; /* aligned scratch buffer */
+ int nAllocation = 0; /* points from the pool */
+
+ /* size of element */
+ int elmLen = GFP_FELEN(pGFEx);
+
+ /* exponent bitsize */
+ int expBitSize = BITSIZE_BNU(pE, nsE);
+ /* optimal size of window */
+ int w = (NULL==pScratchBuffer)? 1 : cpGFpGetOptimalWinSize(expBitSize);
+ /* number of table entries */
+ int nPrecomputed = 1<<w;
+
+ int poolElmLen = GFP_PELEN(pGFEx);
+ BNU_CHUNK_T* pExpandedE = cpGFpGetPool(1, pGFEx);
+ BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFEx);
+ //gres: temporary excluded: assert(NULL!=pExpandedE && NULL!=pTmp);
+
+ if(NULL==pScratchBuffer) {
+ nAllocation = 2 + div_upper(CACHE_LINE_SIZE, poolElmLen*sizeof(BNU_CHUNK_T));
+ pScratchBuffer = (Ipp8u*)cpGFpGetPool(nAllocation, pGFEx);
+ //gres: temporary excluded: assert(NULL!=pScratchBuffer);
+ }
+ pScratchAligned = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE) );
+
+ #if defined(_GRES_DBG_)
+ printf("precom tbl:\n");
+ #endif
+ /* pre-compute auxiliary table t[] = {A^0, A^1, A^2, ..., A^(2^w-1)} */
+ cpGFpElementCopyPadd(pTmp, elmLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
+ //cpScramblePut(pScratchAligned+0, nPrecomputed, (Ipp8u*)pTmp, elmDataSize);
+ gsScramblePut(pScratchAligned, 0, pTmp, elmLen, w);
+ #if defined(_GRES_DBG_)
+ printBNU("precom tbl:\n", pTmp, 48, 6);
+ #endif
+
+ { /* pre compute multiplication table */
+ int n;
+ for(n=1; n<nPrecomputed; n++) {
+ mulF(pTmp, pTmp, pA, pGFEx);
+ //cpScramblePut(pScratchAligned+n, nPrecomputed, (Ipp8u*)pTmp, elmDataSize);
+ gsScramblePut(pScratchAligned, n, pTmp, elmLen, w);
+ #if defined(_GRES_DBG_)
+ printBNU("precom tbl:\n", pTmp, 48, 6);
+ #endif
+ }
+ }
+
+ {
+ /* copy exponent value */
+ cpGFpElementCopy(pExpandedE, pE, nsE);
+
+ /* expand exponent value */
+ ((Ipp32u*)pExpandedE)[BITS2WORD32_SIZE(expBitSize)] = 0;
+ expBitSize = ((expBitSize+w-1)/w)*w;
+
+ #if defined(_GRES_DBG_)
+ printf("\nexponentiation:\n");
+ #endif
+ /*
+ // exponentiation
+ */
+ {
+ /* digit mask */
+ BNU_CHUNK_T dmask = nPrecomputed-1;
+
+ /* position (bit number) of the leftmost window */
+ int wPosition = expBitSize-w;
+
+ /* extract leftmost window value */
+ Ipp32u eChunk = *((Ipp32u*)((Ipp16u*)pExpandedE+ wPosition/BITSIZE(Ipp16u)));
+ int shift = wPosition & 0xF;
+ Ipp32u windowVal = (eChunk>>shift) & dmask;
+
+ /* initialize result */
+ //cpScrambleGet((Ipp8u*)pR, elmDataSize, pScratchAligned+windowVal, nPrecomputed);
+ gsScrambleGet_sscm(pR, elmLen, pScratchAligned, windowVal, w);
+ #if defined(_GRES_DBG_)
+ printBNU("init result:\n", pR, 48, 6);
+ #endif
+
+ for(wPosition-=w; wPosition>=0; wPosition-=w) {
+ int k;
+ #if defined(_GRES_DBG_)
+ printf("\nwPosition=%d\n", wPosition);
+ #endif
+ /* w times squaring */
+ for(k=0; k<w; k++) {
+ sqrF(pR, pR, pGFEx);
+ #if defined(_GRES_DBG_)
+ printBNU("sqr:\n", pR, 48, 6);
+ #endif
+ }
+
+ /* extract next window value */
+ eChunk = *((Ipp32u*)((Ipp16u*)pExpandedE+ wPosition/BITSIZE(Ipp16u)));
+ shift = wPosition & 0xF;
+ windowVal = (eChunk>>shift) & dmask;
+
+ /* extract value from the pre-computed table */
+ //cpScrambleGet((Ipp8u*)pTmp, elmDataSize, pScratchAligned+windowVal, nPrecomputed);
+ gsScrambleGet_sscm(pTmp, elmLen, pScratchAligned, windowVal, w);
+
+ /* and multiply */
+ mulF(pR, pR, pTmp, pGFEx);
+ #if defined(_GRES_DBG_)
+ printBNU("mul:\n", pR, 48, 6);
+ #endif
+ }
+ }
+
+ }
+
+ cpGFpReleasePool(nAllocation+2, pGFEx);
+
+ return pR;
+ }
+}
+
+static void cpPrecomputeMultiExp(BNU_CHUNK_T* pTable, const BNU_CHUNK_T* ppA[], int nItems, gsModEngine* pGFEx)
+{
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+
+ //int nPrecomputed = 1<<nItems;
+
+ /* length of element (BNU_CHUNK_T) */
+ int elmLen = GFP_FELEN(pGFEx);
+
+ /* get resource */
+ BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFEx);
+ //gres: temporary excluded: assert(NULL!=pT);
+
+ /* pTable[0] = 1 */
+ cpGFpElementCopyPadd(pT, elmLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
+ //cpScramblePut(pTable+0, nPrecomputed, (Ipp8u*)pT, elmDataSize);
+ gsScramblePut(pTable, 0, pT, elmLen, nItems);
+ /* pTable[1] = A[0] */
+ //cpScramblePut(pTable+1, nPrecomputed, (Ipp8u*)(ppA[0]), elmDataSize);
+ gsScramblePut(pTable, 1, ppA[0], elmLen, nItems);
+
+ {
+ mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul method */
+
+ int i, baseIdx;
+ for(i=1, baseIdx=2; i<nItems; i++, baseIdx*=2) {
+ /* pTable[baseIdx] = A[i] */
+ //cpScramblePut(pTable+baseIdx, nPrecomputed, (Ipp8u*)(ppA[i]), elmDataSize);
+ gsScramblePut(pTable, baseIdx, ppA[i], elmLen, nItems);
+
+ {
+ int nPasses = 1;
+ int step = baseIdx/2;
+
+ int k;
+ for(k=i-1; k>=0; k--) {
+ int tblIdx = baseIdx;
+
+ int n;
+ for(n=0; n<nPasses; n++, tblIdx+=2*step) {
+ /* use pre-computed value */
+ //cpScrambleGet((Ipp8u*)pT, elmDataSize, pTable+tblIdx, nPrecomputed);
+ gsScrambleGet(pT, elmLen, pTable, tblIdx, nItems);
+ mulF(pT, pT, ppA[k], pGFEx);
+ //cpScramblePut(pTable+tblIdx+step, nPrecomputed, (Ipp8u*)pT, elmDataSize);
+ gsScramblePut(pTable, tblIdx+step, pT, elmLen, nItems);
+ }
+
+ nPasses *= 2;
+ step /= 2;
+ }
+ }
+ }
+ }
+
+ /* release resourse */
+ cpGFpReleasePool(1, pGFEx);
+}
+
+static int cpGetMaxBitsizeExponent(const BNU_CHUNK_T* ppE[], int nsE[], int nItems)
+{
+ int n;
+ /* find out the longest exponent */
+ int expBitSize = BITSIZE_BNU(ppE[0], nsE[0]);
+ for(n=1; n<nItems; n++) {
+ expBitSize = IPP_MAX(expBitSize, BITSIZE_BNU(ppE[n], nsE[n]));
+ }
+ return expBitSize;
+}
+
+static int GetIndex(const BNU_CHUNK_T* ppE[], int nItems, int nBit)
+{
+ int shift = nBit%BYTESIZE;
+ int offset= nBit/BYTESIZE;
+ int index = 0;
+
+ int n;
+ for(n=nItems; n>0; n--) {
+ const Ipp8u* pE = ((Ipp8u*)ppE[n-1]) + offset;
+ Ipp8u e = pE[0];
+ index <<= 1;
+ index += (e>>shift) &1;
+ }
+ return index;
+}
+
+/* sscm version */
+BNU_CHUNK_T* cpGFpxMultiExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* ppA[], const BNU_CHUNK_T* ppE[], int nsE[], int nItems,
+ gsModEngine* pGFEx, Ipp8u* pScratchBuffer)
+{
+ /* align scratch buffer */
+ BNU_CHUNK_T* pTable = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE) );
+ /* pre-compute table */
+ cpPrecomputeMultiExp(pTable, ppA, nItems, pGFEx);
+
+ {
+ mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul and sqr methods and parameter */
+ mod_sqr sqrF = GFP_METHOD(pGFEx)->sqr;
+ int elmLen = GFP_FELEN(pGFEx);
+
+ /* find out the longest exponent */
+ int expBitSize = cpGetMaxBitsizeExponent(ppE, nsE, nItems);
+
+ /* allocate resource and copy expanded exponents into */
+ const BNU_CHUNK_T* ppExponent[IPP_MAX_EXPONENT_NUM];
+ {
+ int n;
+ for(n=0; n<nItems; n++) {
+ BNU_CHUNK_T* pData = cpGFpGetPool(1, pGFEx);
+ //gres: temporary excluded: assert(NULL!=pData);
+ cpGFpElementCopyPadd(pData, elmLen, ppE[n], nsE[n]);
+ ppExponent[n] = pData;
+ }
+ }
+
+ /* multiexponentiation */
+ {
+ /* get temporary */
+ BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFEx);
+
+ /* init result */
+ int tblIdx = GetIndex(ppExponent, nItems, --expBitSize);
+ //cpScrambleGet((Ipp8u*)pR, elmDataSize, pScratchBuffer+tblIdx, nPrecomputed);
+ gsScrambleGet_sscm(pR, elmLen, pTable, tblIdx, nItems);
+
+ //gres: temporary excluded: assert(NULL!=pT);
+
+ /* compute the rest: square and multiply */
+ for(--expBitSize; expBitSize>=0; expBitSize--) {
+ sqrF(pR, pR, pGFEx);
+ tblIdx = GetIndex(ppExponent, nItems, expBitSize);
+ //cpScrambleGet((Ipp8u*)pT, elmDataSize, pScratchBuffer+tblIdx, nPrecomputed);
+ gsScrambleGet_sscm(pT, elmLen, pTable, tblIdx, nItems);
+ mulF(pR, pR, pT, pGFEx);
+ }
+
+ /* release resourse */
+ cpGFpReleasePool(1, pGFEx);
+ }
+
+ /* release resourse */
+ cpGFpReleasePool(nItems, pGFEx);
+
+ return pR;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxstuff.h b/ext/ipp/sources/ippcp/src/pcpgfpxstuff.h
new file mode 100644
index 0000000..7477471
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpgfpxstuff.h
@@ -0,0 +1,161 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippCP)
+// GF(p) extension internal
+//
+*/
+
+#if !defined(_PCP_GFPEXT_H_)
+#define _PCP_GFPEXT_H_
+
+#include "pcpgfpstuff.h"
+
+
+/* GF(p^d) pool */
+#define GFPX_PESIZE(pGF) GFP_FELEN((pGF))
+#define GFPX_POOL_SIZE (14) //(8) /* Number of temporary variables in pool */
+
+/* address of ground field element inside expanded field element */
+#define GFPX_IDX_ELEMENT(pxe, idx, eleSize) ((pxe)+(eleSize)*(idx))
+
+
+__INLINE int degree(const BNU_CHUNK_T* pE, const gsModEngine* pGFEx)
+{
+ int groundElemLen = GFP_FELEN(GFP_PARENT(pGFEx));
+ int deg;
+ for(deg=GFP_EXTDEGREE(pGFEx)-1; deg>=0; deg-- ) {
+ if(!GFP_IS_ZERO(pE+groundElemLen*deg, groundElemLen)) break;
+ }
+ return deg;
+}
+
+__INLINE gsModEngine* cpGFpBasic(const gsModEngine* pGFEx)
+{
+ while( !GFP_IS_BASIC(pGFEx) ) {
+ pGFEx = GFP_PARENT(pGFEx);
+ }
+ return (gsModEngine*)pGFEx;
+}
+__INLINE int cpGFpBasicDegreeExtension(const gsModEngine* pGFEx)
+{
+ int degree = GFP_EXTDEGREE(pGFEx);
+ while( !GFP_IS_BASIC(pGFEx) ) {
+ pGFEx = GFP_PARENT(pGFEx);
+ degree *= GFP_EXTDEGREE(pGFEx);
+ }
+ return degree;
+}
+
+/* convert external data (Ipp32u) => internal element (BNU_CHUNK_T) representation
+ returns length of element (in BNU_CHUNK_T)
+*/
+__INLINE int cpGFpxCopyToChunk(BNU_CHUNK_T* pElm, const Ipp32u* pA, int nsA, const gsModEngine* pGFEx)
+{
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicExtension = cpGFpBasicDegreeExtension(pGFEx);
+ int basicElmLen32 = GFP_FELEN32(pBasicGFE);
+ int basicElmLen = GFP_FELEN(pBasicGFE);
+ int deg;
+ for(deg=0; deg<basicExtension && nsA>0; deg++, nsA -= basicElmLen32) {
+ int srcLen = IPP_MIN(nsA, basicElmLen32);
+ ZEXPAND_COPY_BNU((Ipp32u*)pElm, basicElmLen*(int)(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)), pA,srcLen);
+ pElm += basicElmLen;
+ pA += basicElmLen32;
+ }
+ return basicElmLen*deg;
+}
+
+/* convert internal element (BNU_CHUNK_T) => external data (Ipp32u) representation
+ returns length of data (in Ipp32u)
+*/
+__INLINE int cpGFpxCopyFromChunk(Ipp32u* pA, const BNU_CHUNK_T* pElm, const gsModEngine* pGFEx)
+{
+ gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
+ int basicExtension = cpGFpBasicDegreeExtension(pGFEx);
+ int basicElmLen32 = GFP_FELEN32(pBasicGFE);
+ int basicElmLen = GFP_FELEN(pBasicGFE);
+ int deg;
+ for(deg=0; deg<basicExtension; deg++) {
+ COPY_BNU(pA, (Ipp32u*)pElm, basicElmLen32);
+ pA += basicElmLen32;
+ pElm += basicElmLen;
+ }
+ return basicElmLen32*deg;
+}
+
+
+#define cpGFpxRand OWNAPI(cpGFpxRand)
+BNU_CHUNK_T* cpGFpxRand(BNU_CHUNK_T* pR, gsModEngine* pGFEx, IppBitSupplier rndFunc, void* pRndParam);
+
+#define cpGFpxSet OWNAPI(cpGFpxSet)
+BNU_CHUNK_T* cpGFpxSet (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx);
+
+#define cpGFpxGet OWNAPI(cpGFpxGet)
+BNU_CHUNK_T* cpGFpxGet (BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pR, gsModEngine* pGFEx);
+
+#define cpGFpxSetPolyTerm OWNAPI(cpGFpxSetPolyTerm)
+BNU_CHUNK_T* cpGFpxSetPolyTerm (BNU_CHUNK_T* pR, int deg, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx);
+
+#define cpGFpxGetPolyTerm OWNAPI(cpGFpxGetPolyTerm)
+BNU_CHUNK_T* cpGFpxGetPolyTerm (BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pR, int deg, gsModEngine* pGFEx);
+
+#define cpGFpxAdd OWNAPI(cpGFpxAdd)
+BNU_CHUNK_T* cpGFpxAdd (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx);
+
+#define cpGFpxSub OWNAPI(cpGFpxSub)
+BNU_CHUNK_T* cpGFpxSub (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx);
+
+#define cpGFpxMul OWNAPI(cpGFpxMul)
+BNU_CHUNK_T* cpGFpxMul (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx);
+
+#define cpGFpxSqr OWNAPI(cpGFpxSqr)
+BNU_CHUNK_T* cpGFpxSqr (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx);
+
+#define cpGFpxAdd_GFE OWNAPI(cpGFpxAdd_GFE)
+BNU_CHUNK_T* cpGFpxAdd_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx);
+
+#define cpGFpxSub_GFE OWNAPI(cpGFpxSub_GFE)
+BNU_CHUNK_T* cpGFpxSub_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx);
+
+#define cpGFpxMul_GFE OWNAPI(cpGFpxMul_GFE)
+BNU_CHUNK_T* cpGFpxMul_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx);
+
+#define cpGFpGetOptimalWinSize OWNAPI(cpGFpGetOptimalWinSize)
+int cpGFpGetOptimalWinSize(int bitsize);
+
+#define cpGFpxExp OWNAPI(cpGFpxExp)
+BNU_CHUNK_T* cpGFpxExp (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE, gsModEngine* pGFEx, Ipp8u* pScratchBuffer);
+
+#define cpGFpxMultiExp OWNAPI(cpGFpxMultiExp)
+BNU_CHUNK_T* cpGFpxMultiExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* ppA[], const BNU_CHUNK_T* ppE[], int nsE[], int nItems,
+ gsModEngine* pGFEx, Ipp8u* pScratchBuffer);
+
+#define cpGFpxConj OWNAPI(cpGFpxConj)
+BNU_CHUNK_T* cpGFpxConj(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx);
+
+#define cpGFpxNeg OWNAPI(cpGFpxNeg)
+BNU_CHUNK_T* cpGFpxNeg (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx);
+
+#define cpGFpxInv OWNAPI(cpGFpxInv)
+BNU_CHUNK_T* cpGFpxInv (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx);
+
+#define cpGFpxHalve OWNAPI(cpGFpxHalve)
+BNU_CHUNK_T* cpGFpxHalve (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx);
+
+#endif /* _PCP_GFPEXT_H_ */
diff --git a/ext/ipp/sources/ippcp/src/pcphash.h b/ext/ipp/sources/ippcp/src/pcphash.h
new file mode 100644
index 0000000..a4650ec
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphash.h
@@ -0,0 +1,229 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// Internal Definitions and Internal Functions Prototypes
+//
+//
+*/
+
+#if !defined(_PCP_HASH_H)
+#define _PCP_HASH_H
+
+
+/* messge block size */
+#define MBS_SHA1 (64) /* SHA1 message block size (bytes) */
+#define MBS_SHA256 (64) /* SHA256 and SHA224 */
+#define MBS_SHA224 (64) /* SHA224 */
+#define MBS_SHA512 (128) /* SHA512 and SHA384 */
+#define MBS_SHA384 (128) /* SHA384 */
+#define MBS_MD5 (64) /* MD5 */
+#define MBS_SM3 (64) /* SM3 */
+#define MBS_HASH_MAX (MBS_SHA512) /* max message block size (bytes) */
+
+#define MAX_HASH_SIZE (IPP_SHA512_DIGEST_BITSIZE/8) /* hash of the max len (bytes) */
+
+/* size of processed message length representation (bytes) */
+#define MLR_SHA1 (sizeof(Ipp64u))
+#define MLR_SHA256 (sizeof(Ipp64u))
+#define MLR_SHA224 (sizeof(Ipp64u))
+#define MLR_SHA512 (sizeof(Ipp64u)*2)
+#define MLR_SHA384 (sizeof(Ipp64u)*2)
+#define MLR_MD5 (sizeof(Ipp64u))
+#define MLR_SM3 (sizeof(Ipp64u))
+
+/* hold some old definition for a purpose */
+typedef Ipp32u DigestSHA1[5]; /* SHA1 digest */
+typedef Ipp32u DigestSHA224[7]; /* SHA224 digest */
+typedef Ipp32u DigestSHA256[8]; /* SHA256 digest */
+typedef Ipp64u DigestSHA384[6]; /* SHA384 digest */
+typedef Ipp64u DigestSHA512[8]; /* SHA512 digest */
+typedef Ipp32u DigestMD5[4]; /* MD5 digest */
+typedef Ipp32u DigestSM3[8]; /* SM3 digest */
+
+#define HASH_ALIGNMENT ((int)(sizeof(void*)))
+#define SHA1_ALIGNMENT HASH_ALIGNMENT
+#define SHA224_ALIGNMENT HASH_ALIGNMENT
+#define SHA256_ALIGNMENT HASH_ALIGNMENT
+#define SHA384_ALIGNMENT HASH_ALIGNMENT
+#define SHA512_ALIGNMENT HASH_ALIGNMENT
+#define MD5_ALIGNMENT HASH_ALIGNMENT
+#define SM3_ALIGNMENT HASH_ALIGNMENT
+
+
+struct _cpSHA1 {
+ IppCtxId idCtx; /* SHA1 identifier */
+ int msgBuffIdx; /* buffer entry */
+ Ipp64u msgLenLo; /* message length (bytes) */
+ Ipp8u msgBuffer[MBS_SHA1]; /* buffer */
+ DigestSHA1 msgHash; /* intermediate hash */
+};
+
+struct _cpSHA256 {
+ IppCtxId idCtx; /* SHA224 identifier */
+ int msgBuffIdx; /* buffer entry */
+ Ipp64u msgLenLo; /* message length */
+ Ipp8u msgBuffer[MBS_SHA256]; /* buffer */
+ DigestSHA256 msgHash; /* intermediate hash */
+};
+
+struct _cpSHA512 {
+ IppCtxId idCtx; /* SHA384 identifier */
+ int msgBuffIdx; /* buffer entry */
+ Ipp64u msgLenLo; /* message length */
+ Ipp64u msgLenHi; /* message length */
+ Ipp8u msgBuffer[MBS_SHA512]; /* buffer */
+ DigestSHA512 msgHash; /* intermediate hash */
+};
+
+struct _cpMD5 {
+ IppCtxId idCtx; /* MD5 identifier */
+ int msgBuffIdx; /* buffer entry */
+ Ipp64u msgLenLo; /* message length */
+ Ipp8u msgBuffer[MBS_MD5]; /* buffer */
+ DigestMD5 msgHash; /* intermediate hash */
+};
+
+struct _cpSM3 {
+ IppCtxId idCtx; /* SM3 identifier */
+ int msgBuffIdx; /* buffer entry */
+ Ipp64u msgLenLo; /* message length */
+ Ipp8u msgBuffer[MBS_SM3]; /* buffer */
+ DigestSM3 msgHash; /* intermediate hash */
+};
+
+
+/* hash alg attributes */
+typedef struct _cpHashAttr {
+ int ivSize; /* attr: length (bytes) of initial value cpHashIV */
+ int hashSize; /* attr: length (bytes) of hash */
+ int msgBlkSize; /* attr: length (bytes) of message block */
+ int msgLenRepSize; /* attr: length (bytes) in representation of processed message length */
+ Ipp64u msgLenMax[2]; /* attr: max message length (bytes) (low high) */
+} cpHashAttr;
+
+/* hash value */
+typedef Ipp64u cpHash[IPP_SHA512_DIGEST_BITSIZE/BITSIZE(Ipp64u)]; /* hash value */
+
+/* hash update function */
+typedef void (*cpHashProc)(void* pHash, const Ipp8u* pMsg, int msgLen, const void* pParam);
+
+/* generalized hash context */
+struct _cpHashCtx {
+ IppCtxId idCtx; /* hash identifier */
+ IppHashAlgId algID; /* hash algorithm ID */
+ Ipp64u msgLenLo; /* processed message:*/
+ Ipp64u msgLenHi; /* length */
+ cpHashProc hashProc; /* hash update func */
+ const void* pParam; /* hashProc's params */
+ cpHash msgHash; /* intermadiate hash */
+ int msgBuffIdx; /* buffer entry */
+ Ipp8u msgBuffer[MBS_HASH_MAX]; /* buffer */
+};
+
+/* accessors */
+#define HASH_CTX_ID(stt) ((stt)->idCtx)
+#define HASH_ALG_ID(stt) ((stt)->algID)
+#define HASH_LENLO(stt) ((stt)->msgLenLo)
+#define HASH_LENHI(stt) ((stt)->msgLenHi)
+#define HASH_FUNC(stt) ((stt)->hashProc)
+#define HASH_FUNC_PAR(stt) ((stt)->pParam)
+#define HASH_VALUE(stt) ((stt)->msgHash)
+#define HAHS_BUFFIDX(stt) ((stt)->msgBuffIdx)
+#define HASH_BUFF(stt) ((stt)->msgBuffer)
+#define HASH_VALID_ID(pCtx) (HASH_CTX_ID((pCtx))==idCtxHash)
+
+
+/* initial hash values */
+extern const Ipp32u SHA1_IV[];
+extern const Ipp32u SHA256_IV[];
+extern const Ipp32u SHA224_IV[];
+extern const Ipp64u SHA512_IV[];
+extern const Ipp64u SHA384_IV[];
+extern const Ipp32u MD5_IV[];
+extern const Ipp32u SM3_IV[];
+extern const Ipp64u SHA512_224_IV[];
+extern const Ipp64u SHA512_256_IV[];
+
+/* hash alg additive constants */
+extern __ALIGN16 const Ipp32u SHA1_cnt[];
+extern __ALIGN16 const Ipp32u SHA256_cnt[];
+extern __ALIGN16 const Ipp64u SHA512_cnt[];
+extern __ALIGN16 const Ipp32u MD5_cnt[];
+extern __ALIGN16 const Ipp32u SM3_cnt[];
+
+
+/* hash alg opt argument */
+extern const void* cpHashProcFuncOpt[];
+
+/* enabled hash alg */
+extern const IppHashAlgId cpEnabledHashAlgID[];
+
+/* hash alg IV (init value) */
+extern const Ipp8u* cpHashIV[];
+
+/* hash alg attribute DB */
+extern const cpHashAttr cpHashAlgAttr[];
+
+/* IV size helper */
+__INLINE int cpHashIvSize(IppHashAlgId algID)
+{ return cpHashAlgAttr[algID].ivSize; }
+
+/* hash size helper */
+__INLINE int cpHashSize(IppHashAlgId algID)
+{ return cpHashAlgAttr[algID].hashSize; }
+
+/* message block size helper */
+__INLINE int cpHashMBS(IppHashAlgId algID)
+{ return cpHashAlgAttr[algID].msgBlkSize; }
+
+/* maps algID into enabled IppHashAlgId value */
+__INLINE IppHashAlgId cpValidHashAlg(IppHashAlgId algID)
+{
+ /* maps algID into the valid range */
+ algID = (((int)ippHashAlg_Unknown < (int)algID) && ((int)algID < (int)ippHashAlg_MaxNo))? algID : ippHashAlg_Unknown;
+ return cpEnabledHashAlgID[algID];
+}
+
+
+/* processing functions */
+#define UpdateSHA1 OWNAPI(UpdateSHA1)
+void UpdateSHA1 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#define UpdateSHA256 OWNAPI(UpdateSHA256)
+void UpdateSHA256(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#define UpdateSHA512 OWNAPI(UpdateSHA512)
+void UpdateSHA512(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#define UpdateMD5 OWNAPI(UpdateMD5)
+void UpdateMD5 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#define UpdateSM3 OWNAPI(UpdateSM3)
+void UpdateSM3 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+
+#if (_SHA_NI_ENABLING_ == _FEATURE_TICKTOCK_) || (_SHA_NI_ENABLING_ == _FEATURE_ON_)
+#define UpdateSHA1ni OWNAPI(UpdateSHA1ni)
+void UpdateSHA1ni (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#define UpdateSHA256ni OWNAPI(UpdateSHA256ni)
+void UpdateSHA256ni(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
+#endif
+
+/* general methods */
+#define cpReInitHash OWNAPI(cpReInitHash)
+int cpReInitHash(IppsHashState* pCtx, IppHashAlgId algID);
+
+#endif /* _PCP_HASH_H */
diff --git a/ext/ipp/sources/ippcp/src/pcphash_rmf.h b/ext/ipp/sources/ippcp/src/pcphash_rmf.h
new file mode 100644
index 0000000..f4328f6
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphash_rmf.h
@@ -0,0 +1,51 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// Internal Definitions and Internal Functions Prototypes
+//
+*/
+
+#if !defined(_PCP_HASH_RMF_H)
+#define __PCP_HASH_RMF_H
+
+#include "pcphash.h"
+#include "pcphashmethod_rmf.h"
+
+
+struct _cpHashCtx_rmf {
+ IppCtxId idCtx; /* hash identifier */
+ const cpHashMethod_rmf* pMethod; /* hash methods */
+ int msgBuffIdx; /* buffer index */
+ Ipp8u msgBuffer[MBS_HASH_MAX]; /* buffer */
+ Ipp64u msgLenLo; /* processed message */
+ Ipp64u msgLenHi; /* length (bytes) */
+ cpHash msgHash; /* hash value */
+};
+
+/* accessors */
+#define HASH_CTX_ID(stt) ((stt)->idCtx)
+#define HASH_METHOD(stt) ((stt)->pMethod)
+#define HAHS_BUFFIDX(stt) ((stt)->msgBuffIdx)
+#define HASH_BUFF(stt) ((stt)->msgBuffer)
+#define HASH_LENLO(stt) ((stt)->msgLenLo)
+#define HASH_LENHI(stt) ((stt)->msgLenHi)
+#define HASH_VALUE(stt) ((stt)->msgHash)
+
+#endif /* __PCP_HASH_RMF_H */
diff --git a/ext/ipp/sources/ippcp/src/pcphashca.c b/ext/ipp/sources/ippcp/src/pcphashca.c
new file mode 100644
index 0000000..881abfa
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashca.c
@@ -0,0 +1,683 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// General Functionality
+//
+// Contents:
+// ippsHashGetSize()
+// ippsHashInit()
+// ippsHashPack()
+// ippsHashUnpack()
+// ippsHashDuplicate()
+// ippsHashUpdate()
+// ippsHashGetTag()
+// ippsHashFinal()
+// ippsHashMessage()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+#include "pcptool.h"
+
+
+/*F*
+// Name: ippsHashGetSize
+//
+// Purpose: Returns size (bytes) of IppsHashState state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSize pointer to state size
+//
+*F*/
+IPPFUN(IppStatus, ippsHashGetSize,(int* pSize))
+{
+ /* test pointers */
+ IPP_BAD_PTR1_RET(pSize);
+
+ *pSize = sizeof(IppsHashState);
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashInit
+//
+// Purpose: Init Hash state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pState == NULL
+// ippStsNotSupportedModeErr if algID is not match to supported hash alg
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtx pointer to the Hash state
+// algID hash alg ID
+//
+*F*/
+int cpReInitHash(IppsHashState* pCtx, IppHashAlgId algID)
+{
+ int hashIvSize = cpHashIvSize(algID);
+ const Ipp8u* iv = cpHashIV[algID];
+
+ HASH_LENLO(pCtx) = CONST_64(0);
+ HASH_LENHI(pCtx) = CONST_64(0);
+ HAHS_BUFFIDX(pCtx) = 0;
+ CopyBlock(iv, HASH_VALUE(pCtx), hashIvSize);
+
+ return hashIvSize;
+}
+
+/*
+// hash alg default processing functions and opt argument
+*/
+static cpHashProc cpHashProcFunc[] = {
+ (cpHashProc)NULL,
+
+ #if defined(_ENABLE_ALG_SHA1_)
+ #if(_SHA_NI_ENABLING_==_FEATURE_ON_)
+ UpdateSHA1ni,
+ #else
+ UpdateSHA1,
+ #endif
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA256_)
+ #if(_SHA_NI_ENABLING_==_FEATURE_ON_)
+ UpdateSHA256ni,
+ #else
+ UpdateSHA256,
+ #endif
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA224_)
+ #if(_SHA_NI_ENABLING_==_FEATURE_ON_)
+ UpdateSHA256ni,
+ #else
+ UpdateSHA256,
+ #endif
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_)
+ UpdateSHA512,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA384_)
+ UpdateSHA512,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_MD5_)
+ UpdateMD5,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SM3_)
+ UpdateSM3,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_224_)
+ UpdateSHA512,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_256_)
+ UpdateSHA512,
+ #else
+ NULL,
+ #endif
+};
+
+#define cpInitHash OWNAPI(cpInitHash)
+int cpInitHash(IppsHashState* pCtx, IppHashAlgId algID)
+{
+ /* setup default processing function */
+ HASH_FUNC(pCtx) = cpHashProcFunc[algID];
+
+ /* update default processing function if SHA-NI enabled */
+ #if (_IPP>=_IPP_P8) || (_IPP32E>=_IPP32E_Y8)
+ if( IsFeatureEnabled(SHA_NI_ENABLED) ) {
+
+ #if defined(_ENABLE_ALG_SHA1_)
+ if(ippHashAlg_SHA1==algID)
+ HASH_FUNC(pCtx) = UpdateSHA1ni;
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA256_) || defined(_ENABLE_ALG_SHA224_)
+ if(ippHashAlg_SHA256==algID || ippHashAlg_SHA224==algID)
+ HASH_FUNC(pCtx) = UpdateSHA256ni;
+ #endif
+ }
+ #endif
+
+ /* setup optional agr of processing function */
+ HASH_FUNC_PAR(pCtx) = cpHashProcFuncOpt[algID];
+
+ return cpReInitHash(pCtx, algID);
+}
+
+IPPFUN(IppStatus, ippsHashInit,(IppsHashState* pCtx, IppHashAlgId algID))
+{
+ /* get algorithm id */
+ algID = cpValidHashAlg(algID);
+ /* test hash alg */
+ IPP_BADARG_RET(ippHashAlg_Unknown==algID, ippStsNotSupportedModeErr);
+
+ /* test ctx pointer */
+ IPP_BAD_PTR1_RET(pCtx);
+ /* test hash alg */
+
+ /* set ctx ID */
+ HASH_CTX_ID(pCtx) = idCtxHash;
+ HASH_ALG_ID(pCtx) = algID;
+
+ /* init context */
+ cpInitHash(pCtx, algID);
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashPack
+//
+// Purpose: Copy initialized context to the buffer.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// pBuffer == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsNoMemErr bufSize < sizeof(IppsHashState)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtx pointer hash state
+// pBuffer pointer to the destination buffer
+// bufSize size of the destination buffer
+//
+*F*/
+IPPFUN(IppStatus, ippsHashPack,(const IppsHashState* pCtx, Ipp8u* pBuffer, int bufSize))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+ /* test the context */
+ IPP_BADARG_RET(!HASH_VALID_ID(pCtx), ippStsContextMatchErr);
+ /* test buffer length */
+ IPP_BADARG_RET((int)(sizeof(IppsHashState))>bufSize, ippStsNoMemErr);
+
+ CopyBlock(pCtx, pBuffer, sizeof(IppsHashState));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashUnpack
+//
+// Purpose: Unpack buffer content into the initialized context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// pBuffer == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBuffer pointer to the source buffer
+// pCtx pointer hash state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashUnpack,(const Ipp8u* pBuffer, IppsHashState* pCtx))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+
+ CopyBlock(pBuffer, pCtx, sizeof(IppsHashState));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashDuplicate
+//
+// Purpose: Clone Hash context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSrcCtx == NULL
+// pDstCtx == NULL
+// ippStsContextMatchErr pSrcCtx->idCtx != idCtxHash
+// pDstCtx->idCtx != idCtxHash
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrcCtx pointer to the source Hash context
+// pDstCtx pointer to the target Hash context
+//
+// Note:
+// pDstCtx may to be uninitialized by ippsHashInit()
+//
+*F*/
+IPPFUN(IppStatus, ippsHashDuplicate,(const IppsHashState* pSrcCtx, IppsHashState* pDstCtx))
+{
+ /* test state pointers */
+ IPP_BAD_PTR2_RET(pSrcCtx, pDstCtx);
+ /* test states ID */
+ IPP_BADARG_RET(!HASH_VALID_ID(pSrcCtx), ippStsContextMatchErr);
+
+ /* copy state */
+ CopyBlock(pSrcCtx, pDstCtx, sizeof(IppsHashState));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashUpdate
+//
+// Purpose: Updates intermediate hash value based on input stream.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pCtx == NULL
+// ippStsNullPtrErr pSrc==0 but len!=0
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsLengthErr len <0
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrc pointer to the input stream
+// len input stream length
+// pCtx pointer to the Hash context
+//
+*F*/
+__INLINE int IsExceedMsgLen(Ipp64u maxLo, Ipp64u maxHi, Ipp64u lenLo, Ipp64u lenHi)
+{
+ int isExceed = lenLo > maxLo;
+ isExceed = (lenHi+isExceed) > maxHi;
+ return isExceed;
+}
+
+IPPFUN(IppStatus, ippsHashUpdate,(const Ipp8u* pSrc, int len, IppsHashState* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pCtx);
+ /* test the context */
+ IPP_BADARG_RET(!HASH_VALID_ID(pCtx), ippStsContextMatchErr);
+ /* test input length */
+ IPP_BADARG_RET((len<0 && pSrc), ippStsLengthErr);
+ /* test source pointer */
+ IPP_BADARG_RET((len && !pSrc), ippStsNullPtrErr);
+
+ /* handle non empty input */
+ if(len) {
+ const cpHashAttr* pAttr = &cpHashAlgAttr[HASH_ALG_ID(pCtx)];
+
+ /* test if size of message is being processed not exceeded yet */
+ Ipp64u lenLo = HASH_LENLO(pCtx);
+ Ipp64u lenHi = HASH_LENHI(pCtx);
+ lenLo += len;
+ if(lenLo < HASH_LENLO(pCtx)) lenHi++;
+ if(IsExceedMsgLen(pAttr->msgLenMax[0],pAttr->msgLenMax[1], lenLo,lenHi))
+ IPP_ERROR_RET(ippStsLengthErr);
+
+ else {
+ cpHashProc hashFunc = HASH_FUNC(pCtx); /* processing function */
+ const void* pParam = HASH_FUNC_PAR(pCtx); /* and it's addition params */
+ int mbs = pAttr->msgBlkSize; /* data block size */
+
+ /*
+ // processing
+ */
+ {
+ int procLen;
+
+ /* test if internal buffer is not empty */
+ int n = HAHS_BUFFIDX(pCtx);
+ if(n) {
+ procLen = IPP_MIN(len, (mbs-n));
+ CopyBlock(pSrc, HASH_BUFF(pCtx)+n, procLen);
+ HAHS_BUFFIDX(pCtx) = n += procLen;
+
+ /* block processing */
+ if(mbs==n) {
+ hashFunc(HASH_VALUE(pCtx), HASH_BUFF(pCtx), mbs, pParam);
+ HAHS_BUFFIDX(pCtx) = 0;
+ }
+
+ /* update message pointer and length */
+ pSrc += procLen;
+ len -= procLen;
+ }
+
+ /* main processing part */
+ procLen = len & ~(mbs-1);
+ if(procLen) {
+ hashFunc(HASH_VALUE(pCtx), pSrc, procLen, pParam);
+ pSrc += procLen;
+ len -= procLen;
+ }
+
+ /* rest of input message */
+ if(len) {
+ CopyBlock(pSrc, HASH_BUFF(pCtx), len);
+ HAHS_BUFFIDX(pCtx) += len;
+ }
+ }
+
+ /* update length of processed message */
+ HASH_LENLO(pCtx) = lenLo;
+ HASH_LENHI(pCtx) = lenHi;
+
+ return ippStsNoErr;
+ }
+ }
+
+ return ippStsNoErr;
+}
+
+static void cpComputeDigest(Ipp8u* pHashTag, int hashTagLen, const IppsHashState* pCtx)
+{
+ /* hash alg and parameters */
+ cpHashProc hashFunc = HASH_FUNC(pCtx); /* processing function */
+ const void* pParam = HASH_FUNC_PAR(pCtx); /* and it's addition params */
+
+ /* attributes */
+ const cpHashAttr* pAttr = &cpHashAlgAttr[HASH_ALG_ID(pCtx)];
+ int mbs = pAttr->msgBlkSize; /* data block size */
+ int ivSize = pAttr->ivSize; /* size of hash's IV */
+ int msgLenRepSize = pAttr->msgLenRepSize; /* length of the message representation */
+
+ /* number of bytes in context buffer */
+ int n = HAHS_BUFFIDX(pCtx);
+ /* buffer and it actual length */
+ Ipp8u buffer[MBS_HASH_MAX*2];
+ int bufferLen = n < (mbs-msgLenRepSize)? mbs : mbs*2;
+
+ /* copy current hash value */
+ cpHash hash;
+ CopyBlock(HASH_VALUE(pCtx), hash, ivSize);
+
+ /* copy of state's buffer */
+ CopyBlock(HASH_BUFF(pCtx), buffer, n);
+ /* end of message bit */
+ buffer[n++] = 0x80;
+ /* padd buffer */
+ PaddBlock(0, buffer+n, bufferLen-n-msgLenRepSize);
+
+ /* message length representation in bits (remember about big endian) */
+ {
+ /* convert processed message length bytes ->bits */
+ Ipp64u lo = HASH_LENLO(pCtx);
+ Ipp64u hi = HASH_LENHI(pCtx);
+ hi = LSL64(hi,3) | LSR64(lo,63-3);
+ lo = LSL64(lo,3);
+
+ if(msgLenRepSize>(int)(sizeof(Ipp64u))) {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ ((Ipp64u*)(buffer+bufferLen))[-2] = hi;
+ #else
+ ((Ipp64u*)(buffer+bufferLen))[-2] = ENDIANNESS64(hi);
+ #endif
+ }
+
+ /* recall about MD5 specific */
+ if(ippHashAlg_MD5!=HASH_ALG_ID(pCtx)) {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ ((Ipp64u*)(buffer+bufferLen))[-1] = lo;
+ #else
+ ((Ipp64u*)(buffer+bufferLen))[-1] = ENDIANNESS64(lo);
+ #endif
+ }
+ else {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ ((Ipp64u*)(buffer+bufferLen))[-1] = ENDIANNESS64(lo);
+ #else
+ ((Ipp64u*)(buffer+bufferLen))[-1] = lo;
+ #endif
+ }
+ }
+
+ /* copmplete hash computation */
+ hashFunc(hash, buffer, bufferLen, pParam);
+
+ /* store digest into the user buffer (remember digest in big endian) */
+ if(msgLenRepSize>(int)(sizeof(Ipp64u))) {
+ /* ippHashAlg_SHA384, ippHashAlg_SHA512, ippHashAlg_SHA512_224 and ippHashAlg_SHA512_256 */
+ hash[0] = ENDIANNESS64(hash[0]);
+ hash[1] = ENDIANNESS64(hash[1]);
+ hash[2] = ENDIANNESS64(hash[2]);
+ hash[3] = ENDIANNESS64(hash[3]);
+ hash[4] = ENDIANNESS64(hash[4]);
+ hash[5] = ENDIANNESS64(hash[5]);
+ hash[6] = ENDIANNESS64(hash[6]);
+ hash[7] = ENDIANNESS64(hash[7]);
+ }
+ else if(ippHashAlg_MD5!=HASH_ALG_ID(pCtx)) {
+ ((Ipp32u*)hash)[0] = ENDIANNESS32(((Ipp32u*)hash)[0]);
+ ((Ipp32u*)hash)[1] = ENDIANNESS32(((Ipp32u*)hash)[1]);
+ ((Ipp32u*)hash)[2] = ENDIANNESS32(((Ipp32u*)hash)[2]);
+ ((Ipp32u*)hash)[3] = ENDIANNESS32(((Ipp32u*)hash)[3]);
+ ((Ipp32u*)hash)[4] = ENDIANNESS32(((Ipp32u*)hash)[4]);
+ if(ippHashAlg_SHA1!=HASH_ALG_ID(pCtx)) {
+ ((Ipp32u*)hash)[5] = ENDIANNESS32(((Ipp32u*)hash)[5]);
+ ((Ipp32u*)hash)[6] = ENDIANNESS32(((Ipp32u*)hash)[6]);
+ ((Ipp32u*)hash)[7] = ENDIANNESS32(((Ipp32u*)hash)[7]);
+ }
+ }
+ CopyBlock(hash, pHashTag, hashTagLen);
+}
+
+
+/*F*
+// Name: ippsHashGetTag
+//
+// Purpose: Compute digest based on current state.
+// Note, that futher digest update is possible
+//
+// Returns: Reason:
+// ippStsNullPtrErr pTag == NULL
+// pCtx == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsLengthErr hashSize < tagLen <1
+// ippStsNoErr no errors
+//
+// Parameters:
+// pTag address of the output digest
+// tagLen length of digest
+// pCtx pointer to the SHS state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashGetTag,(Ipp8u* pTag, int tagLen, const IppsHashState* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR2_RET(pTag, pCtx);
+ /* test the context */
+ IPP_BADARG_RET(!HASH_VALID_ID(pCtx), ippStsContextMatchErr);
+
+ {
+ /* size of hash */
+ int hashSize = cpHashAlgAttr[HASH_ALG_ID(pCtx)].hashSize;
+ if(tagLen<1||hashSize<tagLen) IPP_ERROR_RET(ippStsLengthErr);
+
+ cpComputeDigest(pTag, tagLen, pCtx);
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsHashFinal
+//
+// Purpose: Complete message digesting and return digest.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMD == NULL
+// pCtx == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMD address of the output digest
+// pCtx pointer to the SHS state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashFinal,(Ipp8u* pMD, IppsHashState* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR2_RET(pMD, pCtx);
+ /* test the context */
+ IPP_BADARG_RET(!HASH_VALID_ID(pCtx), ippStsContextMatchErr);
+
+ {
+ IppHashAlgId algID = HASH_ALG_ID(pCtx);
+ int hashSize = cpHashAlgAttr[algID].hashSize;
+
+ cpComputeDigest(pMD, hashSize, pCtx);
+ cpReInitHash(pCtx, algID);
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsHashMessage
+//
+// Purpose: Hash of the whole message.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMD == NULL
+// pMsg == NULL but msgLen!=0
+// ippStsLengthErr msgLen <0
+// ippStsNotSupportedModeErr if algID is not match to supported hash alg
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the input message
+// msgLen input message length
+// pMD address of the output digest
+// algID hash alg ID
+//
+*F*/
+IPPFUN(IppStatus, ippsHashMessage,(const Ipp8u* pMsg, int msgLen, Ipp8u* pMD, IppHashAlgId algID))
+{
+ /* get algorithm id */
+ algID = cpValidHashAlg(algID);
+ /* test hash alg */
+ IPP_BADARG_RET(ippHashAlg_Unknown==algID, ippStsNotSupportedModeErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+ /* test message length */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ /* test message pointer */
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ {
+ /* processing function and parameter */
+ cpHashProc hashFunc = cpHashProcFunc[algID];
+ const void* pParam = cpHashProcFuncOpt[algID];
+
+ /* attributes */
+ const cpHashAttr* pAttr = &cpHashAlgAttr[algID];
+ int mbs = pAttr->msgBlkSize; /* data block size */
+ int ivSize = pAttr->ivSize; /* size of hash's IV */
+ int hashSize = pAttr->hashSize; /* hash size */
+ int msgLenRepSize = pAttr->msgLenRepSize; /* length of the message representation */
+
+ /* message bitlength representation */
+ Ipp64u msgLenBits = (Ipp64u)msgLen*8;
+ /* length of main message part */
+ int msgLenBlks = msgLen & (-mbs);
+ /* rest of message length */
+ int msgLenRest = msgLen - msgLenBlks;
+
+ /* end of message buffer */
+ Ipp8u buffer[MBS_HASH_MAX*2];
+ int bufferLen = (msgLenRest < (mbs-msgLenRepSize))? mbs : mbs*2;
+
+ /* init hash */
+ cpHash hash;
+ const Ipp8u* iv = cpHashIV[algID];
+ CopyBlock(iv, hash, ivSize);
+
+ /*construct last messge block(s) */
+ #define MSG_LEN_REP (sizeof(Ipp64u))
+
+ /* copy end of message */
+ CopyBlock(pMsg+msgLen-msgLenRest, buffer, msgLenRest);
+ /* end of message bit */
+ buffer[msgLenRest++] = 0x80;
+ /* padd buffer */
+ PaddBlock(0, buffer+msgLenRest, bufferLen-msgLenRest-MSG_LEN_REP);
+ /* copy message bitlength representation */
+ if(ippHashAlg_MD5!=algID)
+ msgLenBits = ENDIANNESS64(msgLenBits);
+ ((Ipp64u*)(buffer+bufferLen))[-1] = msgLenBits;
+
+ #undef MSG_LEN_REP
+
+ /* message processing */
+ if(msgLenBlks)
+ hashFunc(hash, pMsg, msgLenBlks, pParam);
+ hashFunc(hash, buffer, bufferLen, pParam);
+
+ /* store digest into the user buffer (remember digest in big endian) */
+ if(msgLenRepSize > (int)(sizeof(Ipp64u))) {
+ /* ippHashAlg_SHA384, ippHashAlg_SHA512, ippHashAlg_SHA512_224 and ippHashAlg_SHA512_256 */
+ hash[0] = ENDIANNESS64(hash[0]);
+ hash[1] = ENDIANNESS64(hash[1]);
+ hash[2] = ENDIANNESS64(hash[2]);
+ hash[3] = ENDIANNESS64(hash[3]);
+ hash[4] = ENDIANNESS64(hash[4]);
+ hash[5] = ENDIANNESS64(hash[5]);
+ hash[6] = ENDIANNESS64(hash[6]);
+ hash[7] = ENDIANNESS64(hash[7]);
+ }
+ else if(ippHashAlg_MD5!=algID) {
+ /* ippHashAlg_SHA1, ippHashAlg_SHA224, ippHashAlg_SHA256 and ippHashAlg_SM3 */
+ ((Ipp32u*)hash)[0] = ENDIANNESS32(((Ipp32u*)hash)[0]);
+ ((Ipp32u*)hash)[1] = ENDIANNESS32(((Ipp32u*)hash)[1]);
+ ((Ipp32u*)hash)[2] = ENDIANNESS32(((Ipp32u*)hash)[2]);
+ ((Ipp32u*)hash)[3] = ENDIANNESS32(((Ipp32u*)hash)[3]);
+ ((Ipp32u*)hash)[4] = ENDIANNESS32(((Ipp32u*)hash)[4]);
+ ((Ipp32u*)hash)[5] = ENDIANNESS32(((Ipp32u*)hash)[5]);
+ ((Ipp32u*)hash)[6] = ENDIANNESS32(((Ipp32u*)hash)[6]);
+ ((Ipp32u*)hash)[7] = ENDIANNESS32(((Ipp32u*)hash)[7]);
+ }
+ CopyBlock(hash, pMD, hashSize);
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcphashca_rmf.c b/ext/ipp/sources/ippcp/src/pcphashca_rmf.c
new file mode 100644
index 0000000..b395fcb
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashca_rmf.c
@@ -0,0 +1,437 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// Generalized Functionality
+//
+// Contents:
+// ippsHashGetSize_rmf()
+// ippsHashInit_rmf()
+// ippsHashPack_rmf()
+// ippsHashUnpack_rmf()
+// ippsHashDuplicate_rmf()
+// ippsHashUpdate_rmf()
+// ippsHashGetTag_rmf()
+// ippsHashFinal_rmf()
+// ippsHashMessage_rmf()
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash_rmf.h"
+#include "pcptool.h"
+
+
+/*F*
+// Name: ippsHashGetSize_rmf
+//
+// Purpose: Returns size (bytes) of IppsHashState state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSize pointer to state size
+//
+*F*/
+IPPFUN(IppStatus, ippsHashGetSize_rmf,(int* pSize))
+{
+ /* test pointers */
+ IPP_BAD_PTR1_RET(pSize);
+
+ *pSize = sizeof(IppsHashState_rmf) +(HASH_ALIGNMENT-1);
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashInit_rmf
+//
+// Purpose: Init Hash state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pState == NULL
+// pMethod == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtx pointer to the Hash state
+// pMethod hash method
+//
+*F*/
+IPPFUN(IppStatus, ippsHashInit_rmf,(IppsHashState_rmf* pCtx, const IppsHashMethod* pMethod))
+{
+ /* test ctx pointers */
+ IPP_BAD_PTR2_RET(pCtx, pMethod);
+ pCtx= (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pCtx, HASH_ALIGNMENT) );
+
+ PaddBlock(0, pCtx, sizeof(IppsHashState_rmf));
+ HASH_METHOD(pCtx) = pMethod;
+ HASH_CTX_ID(pCtx) = idCtxHash;
+ pMethod->hashInit(HASH_VALUE(pCtx));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashPack_rmf
+//
+// Purpose: Copy initialized context to the buffer.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pCtx == NULL
+// pBuffer == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsNoMemErr bufSize < sizeof(IppsHashState_rmf)
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtx pointer hash state
+// pBuffer pointer to the destination buffer
+// bufSize size of the destination buffer
+//
+*F*/
+IPPFUN(IppStatus, ippsHashPack_rmf,(const IppsHashState_rmf* pCtx, Ipp8u* pBuffer, int bufSize))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+ pCtx= (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pCtx, HASH_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxHash !=HASH_CTX_ID(pCtx), ippStsContextMatchErr);
+ /* test buffer length */
+ IPP_BADARG_RET((int)(sizeof(IppsHashState_rmf)+HASH_ALIGNMENT-1)>bufSize, ippStsNoMemErr);
+
+ CopyBlock(pCtx, pBuffer, sizeof(IppsHashState_rmf));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashUnpack_rmf
+//
+// Purpose: Unpack buffer content into the initialized context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pBuffer == NULL
+// pCtx == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBuffer pointer to the source buffer
+// pCtx pointer hash state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashUnpack_rmf,(const Ipp8u* pBuffer, IppsHashState_rmf* pCtx))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+
+ CopyBlock(pBuffer, pCtx, sizeof(IppsHashState_rmf));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashDuplicate_rmf
+//
+// Purpose: Clone Hash context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSrcCtx == NULL
+// pDstCtx == NULL
+// ippStsContextMatchErr pSrcCtx->idCtx != idCtxHash
+// pDstCtx->idCtx != idCtxHash
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrcCtx pointer to the source Hash context
+// pDstCtx pointer to the target Hash context
+//
+// Note:
+// pDstCtx may to be uninitialized by ippsHashInit_rmf()
+//
+*F*/
+IPPFUN(IppStatus, ippsHashDuplicate_rmf,(const IppsHashState_rmf* pSrcCtx, IppsHashState_rmf* pDstCtx))
+{
+ /* test state pointers */
+ IPP_BAD_PTR2_RET(pSrcCtx, pDstCtx);
+ pSrcCtx = (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pSrcCtx, HASH_ALIGNMENT) );
+ pDstCtx = (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pDstCtx, HASH_ALIGNMENT) );
+ /* test states ID */
+ IPP_BADARG_RET(idCtxHash !=HASH_CTX_ID(pSrcCtx), ippStsContextMatchErr);
+
+ /* copy state */
+ CopyBlock(pSrcCtx, pDstCtx, sizeof(IppsHashState_rmf));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsHashUpdate_rmf
+//
+// Purpose: Updates intermediate hash value based on input stream.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pCtx == NULL
+// ippStsNullPtrErr pSrc==0 but len!=0
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsLengthErr len <0
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrc pointer to the input stream
+// len input stream length
+// pCtx pointer to the Hash context
+//
+*F*/
+IPPFUN(IppStatus, ippsHashUpdate_rmf,(const Ipp8u* pSrc, int len, IppsHashState_rmf* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pCtx);
+ pCtx= (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pCtx, HASH_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxHash !=HASH_CTX_ID(pCtx), ippStsContextMatchErr);
+
+ /* test input length */
+ IPP_BADARG_RET((len<0), ippStsLengthErr);
+ /* test source pointer */
+ IPP_BADARG_RET((len && !pSrc), ippStsNullPtrErr);
+
+ if(len) {
+ const IppsHashMethod* method = HASH_METHOD(pCtx);
+ hashUpdateF hashFunc = method->hashUpdate; /* processing function */
+ int msgBlkSize = method->msgBlkSize; /* messge block size */
+
+ int procLen;
+
+ int idx = HAHS_BUFFIDX(pCtx);
+ Ipp64u lenLo = HASH_LENLO(pCtx);
+ Ipp64u lenHi = HASH_LENHI(pCtx);
+ lenLo += len;
+ if(lenLo < HASH_LENLO(pCtx)) lenHi++;
+
+ /* if internal buffer is not empty */
+ if(idx) {
+ procLen = IPP_MIN(len, (msgBlkSize-idx));
+ CopyBlock(pSrc, HASH_BUFF(pCtx)+idx, procLen);
+ idx += procLen;
+
+ /* process complete message block */
+ if(msgBlkSize==idx) {
+ hashFunc(HASH_VALUE(pCtx), HASH_BUFF(pCtx), msgBlkSize);
+ idx = 0;
+ }
+
+ /* update message pointer and length */
+ pSrc += procLen;
+ len -= procLen;
+ }
+
+ /* process main part of the input*/
+ procLen = len & ~(msgBlkSize-1);
+ if(procLen) {
+ hashFunc(HASH_VALUE(pCtx), pSrc, procLen);
+ pSrc += procLen;
+ len -= procLen;
+ }
+
+ /* store the rest of input in the buffer */
+ if(len) {
+ CopyBlock(pSrc, HASH_BUFF(pCtx), len);
+ idx += len;
+ }
+
+ /* update length of processed message */
+ HASH_LENLO(pCtx) = lenLo;
+ HASH_LENHI(pCtx) = lenHi;
+ HAHS_BUFFIDX(pCtx) = idx;
+ }
+
+ return ippStsNoErr;
+}
+
+
+static void cpFinalize_rmf(DigestSHA512 pHash,
+ const Ipp8u* inpBuffer, int inpLen,
+ Ipp64u lenLo, Ipp64u lenHi,
+ const IppsHashMethod* method)
+{
+ int mbs = method->msgBlkSize; /* messge block size */
+ int mrl = method->msgLenRepSize; /* processed length representation size */
+
+ /* local buffer and it length */
+ Ipp8u buffer[MBS_SHA512*2];
+ int bufferLen = inpLen < (mbs-mrl)? mbs : mbs*2;
+
+ /* copy rest of message into internal buffer */
+ CopyBlock(inpBuffer, buffer, inpLen);
+
+ /* padd message */
+ buffer[inpLen++] = 0x80;
+ PaddBlock(0, buffer+inpLen, bufferLen-inpLen-mrl);
+
+ /* message length representation */
+ method->msgLenRep(buffer+bufferLen-mrl, lenLo, lenHi);
+
+ /* copmplete hash computation */
+ method->hashUpdate(pHash, buffer, bufferLen);
+}
+
+/*F*
+// Name: ippsHashFinal_rmf
+//
+// Purpose: Complete message digesting and return digest.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMD == NULL
+// pCtx == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMD address of the output digest
+// pCtx pointer to the SHS state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashFinal_rmf,(Ipp8u* pMD, IppsHashState_rmf* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR2_RET(pMD, pCtx);
+ pCtx= (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pCtx, HASH_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxHash !=HASH_CTX_ID(pCtx), ippStsContextMatchErr);
+
+ {
+ const IppsHashMethod* method = HASH_METHOD(pCtx);
+
+ cpFinalize_rmf(HASH_VALUE(pCtx),
+ HASH_BUFF(pCtx), HAHS_BUFFIDX(pCtx),
+ HASH_LENLO(pCtx), HASH_LENHI(pCtx),
+ method);
+ /* convert hash into oct string */
+ method->hashOctStr(pMD, HASH_VALUE(pCtx));
+
+ /* re-init hash value */
+ HAHS_BUFFIDX(pCtx) = 0;
+ HASH_LENLO(pCtx) = 0;
+ HASH_LENHI(pCtx) = 0;
+ method->hashInit(HASH_VALUE(pCtx));
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsHashGetTag_rmf
+//
+// Purpose: Compute digest based on current state.
+// Note, that futher digest update is possible
+//
+// Returns: Reason:
+// ippStsNullPtrErr pTag == NULL
+// pCtx == NULL
+// ippStsContextMatchErr pCtx->idCtx != idCtxHash
+// ippStsLengthErr hashSize < tagLen <1
+// ippStsNoErr no errors
+//
+// Parameters:
+// pTag address of the output digest
+// tagLen length of digest
+// pCtx pointer to the SHS state
+//
+*F*/
+IPPFUN(IppStatus, ippsHashGetTag_rmf,(Ipp8u* pTag, int tagLen, const IppsHashState_rmf* pCtx))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pCtx);
+ pCtx = (IppsHashState_rmf*)( IPP_ALIGNED_PTR(pCtx, HASH_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxHash !=HASH_CTX_ID(pCtx), ippStsContextMatchErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pTag);
+ IPP_BADARG_RET((tagLen <1) || HASH_METHOD(pCtx)->hashLen<tagLen, ippStsLengthErr);
+
+ { /* TBD: consider implementation without copy of internal buffer content */
+ DigestSHA512 hash;
+ const IppsHashMethod* method = HASH_METHOD(pCtx);
+ CopyBlock(HASH_VALUE(pCtx), hash, sizeof(DigestSHA512));
+ cpFinalize_rmf(hash,
+ HASH_BUFF(pCtx), HAHS_BUFFIDX(pCtx),
+ HASH_LENLO(pCtx), HASH_LENHI(pCtx),
+ method);
+ method->hashOctStr(pTag, hash);
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsHashMessage_rmf
+//
+// Purpose: Hash of the whole message.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMD == NULL
+// pMsg == NULL but msgLen!=0
+// ippStsLengthErr msgLen <0
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the input message
+// msgLen input message length
+// pMD address of the output digest
+// pMethod hash methods
+//
+*F*/
+IPPFUN(IppStatus, ippsHashMessage_rmf,(const Ipp8u* pMsg, int msgLen, Ipp8u* pMD, const IppsHashMethod* pMethod))
+{
+ /* test method pointer */
+ IPP_BAD_PTR1_RET(pMethod);
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+ /* test message length */
+ IPP_BADARG_RET(0>msgLen, ippStsLengthErr);
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ {
+ /* message length in the multiple MBS and the rest */
+ int msgLenBlks = msgLen &(-pMethod->msgBlkSize);
+ int msgLenRest = msgLen - msgLenBlks;
+
+ /* init hash */
+ DigestSHA512 hash;
+ pMethod->hashInit(hash);
+
+ /* process main part of the message */
+ if(msgLenBlks) {
+ pMethod->hashUpdate(hash, pMsg, msgLenBlks);
+ pMsg += msgLenBlks;
+ }
+ cpFinalize_rmf(hash,
+ pMsg, msgLenRest,
+ msgLen, 0,
+ pMethod);
+
+ pMethod->hashOctStr(pMD, hash);
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcphashcnt.c b/ext/ipp/sources/ippcp/src/pcphashcnt.c
new file mode 100644
index 0000000..7762c1f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashcnt.c
@@ -0,0 +1,434 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// Constants
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+
+#if defined( _IPP_DATA )
+
+/*
+// enabled hash alg IDs
+*/
+const IppHashAlgId cpEnabledHashAlgID[] = {
+ IPP_ALG_HASH_UNKNOWN,
+
+#if defined(_ENABLE_ALG_SHA1_)
+ IPP_ALG_HASH_SHA1,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA256_)
+ IPP_ALG_HASH_SHA256,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA224_)
+ IPP_ALG_HASH_SHA224,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_)
+ IPP_ALG_HASH_SHA512,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA384_)
+ IPP_ALG_HASH_SHA384,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_MD5_)
+ IPP_ALG_HASH_MD5,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SM3_)
+ IPP_ALG_HASH_SM3,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_224_)
+ IPP_ALG_HASH_SHA512_224,
+#else
+ IPP_ALG_HASH_UNKNOWN,
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_256_)
+ IPP_ALG_HASH_SHA512_256
+#else
+ IPP_ALG_HASH_UNKNOWN
+#endif
+};
+////////////////////////////////////////////////////////////
+
+/*
+// hash init values
+*/
+const Ipp32u UnknownHash_IV[] = {
+ 0};
+
+#if defined(_ENABLE_ALG_SHA1_)
+const Ipp32u SHA1_IV[] = {
+ 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0};
+#endif
+
+#if defined(_ENABLE_ALG_SHA256_)
+const Ipp32u SHA256_IV[] = {
+ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
+ 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19};
+#endif
+
+#if defined(_ENABLE_ALG_SHA224_)
+const Ipp32u SHA224_IV[] = {
+ 0xC1059ED8, 0x367CD507, 0x3070DD17, 0xF70E5939,
+ 0xFFC00B31, 0x68581511, 0x64F98FA7, 0xBEFA4FA4};
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_)
+const Ipp64u SHA512_IV[] = {
+ CONST_64(0x6A09E667F3BCC908), CONST_64(0xBB67AE8584CAA73B),
+ CONST_64(0x3C6EF372FE94F82B), CONST_64(0xA54FF53A5F1D36F1),
+ CONST_64(0x510E527FADE682D1), CONST_64(0x9B05688C2B3E6C1F),
+ CONST_64(0x1F83D9ABFB41BD6B), CONST_64(0x5BE0CD19137E2179)};
+#endif
+
+#if defined(_ENABLE_ALG_SHA384_)
+const Ipp64u SHA384_IV[] = {
+ CONST_64(0xCBBB9D5DC1059ED8), CONST_64(0x629A292A367CD507),
+ CONST_64(0x9159015A3070DD17), CONST_64(0x152FECD8F70E5939),
+ CONST_64(0x67332667FFC00B31), CONST_64(0x8EB44A8768581511),
+ CONST_64(0xDB0C2E0D64F98FA7), CONST_64(0x47B5481DBEFA4FA4)};
+#endif
+
+#if defined(_ENABLE_ALG_MD5_)
+const Ipp32u MD5_IV[] = {
+ 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476};
+#endif
+
+#if defined(_ENABLE_ALG_SM3_)
+const Ipp32u SM3_IV[] = {
+ 0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600,
+ 0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E};
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_224_)
+const Ipp64u SHA512_224_IV[] = {
+ CONST_64(0x8C3D37C819544DA2), CONST_64(0x73E1996689DCD4D6),
+ CONST_64(0x1DFAB7AE32FF9C82), CONST_64(0x679DD514582F9FCF),
+ CONST_64(0x0F6D2B697BD44DA8), CONST_64(0x77E36F7304C48942),
+ CONST_64(0x3F9D85A86A1D36C8), CONST_64(0x1112E6AD91D692A1)};
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_256_)
+const Ipp64u SHA512_256_IV[] = {
+ CONST_64(0x22312194FC2BF72C), CONST_64(0x9F555FA3C84C64C2),
+ CONST_64(0x2393B86B6F53B151), CONST_64(0x963877195940EABD),
+ CONST_64(0x96283EE2A88EFFE3), CONST_64(0xBE5E1E2553863992),
+ CONST_64(0x2B0199FC2C85B8AA), CONST_64(0x0EB72DDC81C52CA2)};
+#endif
+
+const Ipp8u* cpHashIV[] = {
+ (Ipp8u*)UnknownHash_IV,
+
+ #if defined(_ENABLE_ALG_SHA1_)
+ (Ipp8u*)SHA1_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA256_)
+ (Ipp8u*)SHA256_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA224_)
+ (Ipp8u*)SHA224_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_)
+ (Ipp8u*)SHA512_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA384_)
+ (Ipp8u*)SHA384_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_MD5_)
+ (Ipp8u*)MD5_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SM3_)
+ (Ipp8u*)SM3_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_224_)
+ (Ipp8u*)SHA512_224_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_256_)
+ (Ipp8u*)SHA512_256_IV,
+ #else
+ (Ipp8u*)UnknownHash_IV,
+ #endif
+};
+
+////////////////////////////////////////////////////////////
+
+/*
+// additive constatns
+*/
+#if defined(_ENABLE_ALG_SHA1_)
+__ALIGN16 const Ipp32u SHA1_cnt[] = {
+ 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6
+};
+#endif
+
+#if defined(_ENABLE_ALG_SHA256_) || defined(_ENABLE_ALG_SHA224_)
+__ALIGN16 const Ipp32u SHA256_cnt[] = {
+ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
+ 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
+ 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
+ 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
+ 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
+ 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
+ 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
+ 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
+ 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
+ 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
+ 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
+ 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
+ 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
+ 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
+ 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
+ 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
+};
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_) || defined(_ENABLE_ALG_SHA384_) || defined(_ENABLE_ALG_SHA512_224_) || defined(_ENABLE_ALG_SHA512_256_)
+__ALIGN16 const Ipp64u SHA512_cnt[] = {
+ CONST_64(0x428A2F98D728AE22), CONST_64(0x7137449123EF65CD), CONST_64(0xB5C0FBCFEC4D3B2F), CONST_64(0xE9B5DBA58189DBBC),
+ CONST_64(0x3956C25BF348B538), CONST_64(0x59F111F1B605D019), CONST_64(0x923F82A4AF194F9B), CONST_64(0xAB1C5ED5DA6D8118),
+ CONST_64(0xD807AA98A3030242), CONST_64(0x12835B0145706FBE), CONST_64(0x243185BE4EE4B28C), CONST_64(0x550C7DC3D5FFB4E2),
+ CONST_64(0x72BE5D74F27B896F), CONST_64(0x80DEB1FE3B1696B1), CONST_64(0x9BDC06A725C71235), CONST_64(0xC19BF174CF692694),
+ CONST_64(0xE49B69C19EF14AD2), CONST_64(0xEFBE4786384F25E3), CONST_64(0x0FC19DC68B8CD5B5), CONST_64(0x240CA1CC77AC9C65),
+ CONST_64(0x2DE92C6F592B0275), CONST_64(0x4A7484AA6EA6E483), CONST_64(0x5CB0A9DCBD41FBD4), CONST_64(0x76F988DA831153B5),
+ CONST_64(0x983E5152EE66DFAB), CONST_64(0xA831C66D2DB43210), CONST_64(0xB00327C898FB213F), CONST_64(0xBF597FC7BEEF0EE4),
+ CONST_64(0xC6E00BF33DA88FC2), CONST_64(0xD5A79147930AA725), CONST_64(0x06CA6351E003826F), CONST_64(0x142929670A0E6E70),
+ CONST_64(0x27B70A8546D22FFC), CONST_64(0x2E1B21385C26C926), CONST_64(0x4D2C6DFC5AC42AED), CONST_64(0x53380D139D95B3DF),
+ CONST_64(0x650A73548BAF63DE), CONST_64(0x766A0ABB3C77B2A8), CONST_64(0x81C2C92E47EDAEE6), CONST_64(0x92722C851482353B),
+ CONST_64(0xA2BFE8A14CF10364), CONST_64(0xA81A664BBC423001), CONST_64(0xC24B8B70D0F89791), CONST_64(0xC76C51A30654BE30),
+ CONST_64(0xD192E819D6EF5218), CONST_64(0xD69906245565A910), CONST_64(0xF40E35855771202A), CONST_64(0x106AA07032BBD1B8),
+ CONST_64(0x19A4C116B8D2D0C8), CONST_64(0x1E376C085141AB53), CONST_64(0x2748774CDF8EEB99), CONST_64(0x34B0BCB5E19B48A8),
+ CONST_64(0x391C0CB3C5C95A63), CONST_64(0x4ED8AA4AE3418ACB), CONST_64(0x5B9CCA4F7763E373), CONST_64(0x682E6FF3D6B2B8A3),
+ CONST_64(0x748F82EE5DEFB2FC), CONST_64(0x78A5636F43172F60), CONST_64(0x84C87814A1F0AB72), CONST_64(0x8CC702081A6439EC),
+ CONST_64(0x90BEFFFA23631E28), CONST_64(0xA4506CEBDE82BDE9), CONST_64(0xBEF9A3F7B2C67915), CONST_64(0xC67178F2E372532B),
+ CONST_64(0xCA273ECEEA26619C), CONST_64(0xD186B8C721C0C207), CONST_64(0xEADA7DD6CDE0EB1E), CONST_64(0xF57D4F7FEE6ED178),
+ CONST_64(0x06F067AA72176FBA), CONST_64(0x0A637DC5A2C898A6), CONST_64(0x113F9804BEF90DAE), CONST_64(0x1B710B35131C471B),
+ CONST_64(0x28DB77F523047D84), CONST_64(0x32CAAB7B40C72493), CONST_64(0x3C9EBE0A15C9BEBC), CONST_64(0x431D67C49C100D4C),
+ CONST_64(0x4CC5D4BECB3E42B6), CONST_64(0x597F299CFC657E2A), CONST_64(0x5FCB6FAB3AD6FAEC), CONST_64(0x6C44198C4A475817)
+};
+#endif
+
+#if defined(_ENABLE_ALG_MD5_)
+__ALIGN16 const Ipp32u MD5_cnt[] = {
+ 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
+ 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
+ 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
+ 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
+
+ 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
+ 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
+ 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
+ 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
+
+ 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
+ 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
+ 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
+ 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
+
+ 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
+ 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
+ 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
+ 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
+};
+#endif
+
+#if defined(_ENABLE_ALG_SM3_)
+__ALIGN16 const Ipp32u SM3_cnt[] = {
+ 0x79CC4519,0xF3988A32,0xE7311465,0xCE6228CB,0x9CC45197,0x3988A32F,0x7311465E,0xE6228CBC,
+ 0xCC451979,0x988A32F3,0x311465E7,0x6228CBCE,0xC451979C,0x88A32F39,0x11465E73,0x228CBCE6,
+ 0x9D8A7A87,0x3B14F50F,0x7629EA1E,0xEC53D43C,0xD8A7A879,0xB14F50F3,0x629EA1E7,0xC53D43CE,
+ 0x8A7A879D,0x14F50F3B,0x29EA1E76,0x53D43CEC,0xA7A879D8,0x4F50F3B1,0x9EA1E762,0x3D43CEC5,
+ 0x7A879D8A,0xF50F3B14,0xEA1E7629,0xD43CEC53,0xA879D8A7,0x50F3B14F,0xA1E7629E,0x43CEC53D,
+ 0x879D8A7A,0x0F3B14F5,0x1E7629EA,0x3CEC53D4,0x79D8A7A8,0xF3B14F50,0xE7629EA1,0xCEC53D43,
+ 0x9D8A7A87,0x3B14F50F,0x7629EA1E,0xEC53D43C,0xD8A7A879,0xB14F50F3,0x629EA1E7,0xC53D43CE,
+ 0x8A7A879D,0x14F50F3B,0x29EA1E76,0x53D43CEC,0xA7A879D8,0x4F50F3B1,0x9EA1E762,0x3D43CEC5
+};
+#endif
+
+/*
+// hash alg default processing opt argument
+*/
+const void* cpHashProcFuncOpt[] = {
+ NULL,
+
+ #if defined(_ENABLE_ALG_SHA1_)
+ SHA1_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA256_)
+ SHA256_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA224_)
+ SHA256_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_)
+ SHA512_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA384_)
+ SHA512_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_MD5_)
+ MD5_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SM3_)
+ SM3_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_224_)
+ SHA512_cnt,
+ #else
+ NULL,
+ #endif
+
+ #if defined(_ENABLE_ALG_SHA512_256_)
+ SHA512_cnt,
+ #else
+ NULL,
+ #endif
+};
+////////////////////////////////////////////////////////////
+
+/* hash alg attributes */
+const cpHashAttr cpHashAlgAttr[] = {
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}}, /* unknown */
+
+#if defined(_ENABLE_ALG_SHA1_) /* sha1 / unknown */
+ {IPP_SHA1_DIGEST_BITSIZE/8, IPP_SHA1_DIGEST_BITSIZE/8, MBS_SHA1, sizeof(Ipp64u), {CONST_64(0x2000000000000000-1),CONST_64(0)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA256_) /* sha256 / unknown */
+ {IPP_SHA256_DIGEST_BITSIZE/8,IPP_SHA256_DIGEST_BITSIZE/8, MBS_SHA256, sizeof(Ipp64u), {CONST_64(0x2000000000000000-1),CONST_64(0)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA224_) /* sha224 / unknown */
+ {IPP_SHA256_DIGEST_BITSIZE/8,IPP_SHA224_DIGEST_BITSIZE/8, MBS_SHA224, sizeof(Ipp64u), {CONST_64(0x2000000000000000-1),CONST_64(0)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_) /* sha512 / unknown */
+ {IPP_SHA512_DIGEST_BITSIZE/8,IPP_SHA512_DIGEST_BITSIZE/8, MBS_SHA512, sizeof(Ipp64u)*2, {CONST_64(0xFFFFFFFFFFFFFFFF),CONST_64(0x2000000000000000-1)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA384_) /* sha384 / unknown */
+ {IPP_SHA512_DIGEST_BITSIZE/8,IPP_SHA384_DIGEST_BITSIZE/8, MBS_SHA384, sizeof(Ipp64u)*2, {CONST_64(0xFFFFFFFFFFFFFFFF),CONST_64(0x2000000000000000-1)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_MD5_) /* md5 / unknown */
+ {IPP_MD5_DIGEST_BITSIZE/8,IPP_MD5_DIGEST_BITSIZE/8, MBS_MD5, sizeof(Ipp64u), {CONST_64(0x2000000000000000-1),CONST_64(0)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SM3_) /* sm3 / unknown */
+ {IPP_SM3_DIGEST_BITSIZE/8,IPP_SM3_DIGEST_BITSIZE/8, MBS_SM3, sizeof(Ipp64u), {CONST_64(0x2000000000000000-1),CONST_64(0)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_224_) /* sha512/224 / unknown */
+ {IPP_SHA512_DIGEST_BITSIZE/8,IPP_SHA512_224_DIGEST_BITSIZE/8, MBS_SHA512, sizeof(Ipp64u)*2, {CONST_64(0xFFFFFFFFFFFFFFFF),CONST_64(0x2000000000000000-1)}},
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}},
+#endif
+
+#if defined(_ENABLE_ALG_SHA512_256_) /* sha512/256 / unknown */
+ {IPP_SHA512_DIGEST_BITSIZE/8,IPP_SHA512_256_DIGEST_BITSIZE/8, MBS_SHA512, sizeof(Ipp64u)*2, {CONST_64(0xFFFFFFFFFFFFFFFF),CONST_64(0x2000000000000000-1)}}
+#else
+ {0, 0, 0, 0, {CONST_64(0),CONST_64(0)}}
+#endif
+};
+
+#endif /* _IPP_DATA */
diff --git a/ext/ipp/sources/ippcp/src/pcphashmethod_rmf.h b/ext/ipp/sources/ippcp/src/pcphashmethod_rmf.h
new file mode 100644
index 0000000..97a6e2a
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashmethod_rmf.h
@@ -0,0 +1,44 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Purpose:
+// Cryptography Primitive.
+// Security Hash Standard
+// Internal Definitions and Internal Functions Prototypes
+//
+*/
+#if !defined(_PCP_HASH_METHOD_RMF_H)
+#define _PCP_HASH_METHOD_RMF_H
+
+/* hash alg methods */
+typedef void (*hashInitF)(void* pHash);
+typedef void (*hashUpdateF)(void* pHash, const Ipp8u* pMsg, int msgLen);
+typedef void (*hashOctStrF)(Ipp8u* pDst, void* pHash);
+typedef void (*msgLenRepF)(Ipp8u* pDst, Ipp64u lenLo, Ipp64u lenHi);
+
+typedef struct _cpHashMethod_rmf {
+ IppHashAlgId hashAlgId; /* algorithm ID */
+ int hashLen; /* hash length in bytes */
+ int msgBlkSize; /* message blkock size in bytes */
+ int msgLenRepSize; /* length of processed msg length representation in bytes */
+ hashInitF hashInit; /* set initial hash value */
+ hashUpdateF hashUpdate; /* hash compressor */
+ hashOctStrF hashOctStr; /* convert hash into oct string */
+ msgLenRepF msgLenRep; /* processed mgs length representation */
+} cpHashMethod_rmf;
+
+#endif /* _PCP_HASH_METHOD_RMF_H */
diff --git a/ext/ipp/sources/ippcp/src/pcphashsha1px.c b/ext/ipp/sources/ippcp/src/pcphashsha1px.c
new file mode 100644
index 0000000..842443c
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashsha1px.c
@@ -0,0 +1,188 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Message block processing according to SHA1
+//
+// Contents:
+// UpdateSHA1()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+#include "pcptool.h"
+
+//#if !defined(_ENABLE_ALG_SHA1_)
+//#pragma message("IPP_ALG_HASH_SHA1 disabled")
+
+//#else
+//#pragma message("IPP_ALG_HASH_SHA1 enabled")
+
+#if !((_IPP==_IPP_M5) || \
+ (_IPP==_IPP_W7) || (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || (_IPP==_IPP_P8) || \
+ (_IPP==_IPP_S8) || (_IPP>=_IPP_G9) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E==_IPP32E_N8) || (_IPP32E>=_IPP32E_E9) || \
+ (_IPP64==_IPP64_I7) )
+
+/*
+// Magic functions defined in FIPS 180-1
+//
+*/
+#define MAGIC_F0(B,C,D) (((B) & (C)) | ((~(B)) & (D)))
+#define MAGIC_F1(B,C,D) ((B) ^ (C) ^ (D))
+#define MAGIC_F2(B,C,D) (((B) & (C)) | ((B) & (D)) | ((C) & (D)))
+#define MAGIC_F3(B,C,D) ((B) ^ (C) ^ (D))
+
+#define SHA1_STEP(A,B,C,D,E, MAGIC_FUN, W,K) \
+ (E)+= ROL32((A),5) + MAGIC_FUN((B),(C),(D)) + (W) + (K); \
+ (B) = ROL32((B),30)
+
+#define COMPACT_SHA1_STEP(A,B,C,D,E, MAGIC_FUN, W,K, t) { \
+ Ipp32u _T = ROL32((A),5) + MAGIC_FUN((t)/20, (B),(C),(D)) + (E) + (W)[(t)] + (K)[(t)/20]; \
+ (E) = (D); \
+ (D) = (C); \
+ (C) = ROL32((B),30); \
+ (B) = (A); \
+ (A) = _T; \
+}
+
+#if defined(_ALG_SHA1_COMPACT_)
+__INLINE Ipp32u MagicFun(int s, Ipp32u b, Ipp32u c, Ipp32u d)
+{
+ switch(s) {
+ case 0: return MAGIC_F0(b,c,d);
+ case 2: return MAGIC_F2(b,c,d);
+ default:return MAGIC_F1(b,c,d);
+ }
+}
+#endif
+
+
+/*F*
+// Name: UpdateSHA1
+//
+// Purpose: Update internal hash according to input message stream.
+//
+// Parameters:
+// uniHash pointer to in/out hash
+// mblk pointer to message stream
+// mlen message stream length (multiple by message block size)
+// uniParam pointer to the optional parameter
+//
+*F*/
+#if defined(_ALG_SHA1_COMPACT_)
+#pragma message("SHA1 compact")
+#endif
+
+void UpdateSHA1(void* uinHash, const Ipp8u* mblk, int mlen, const void *uniParam)
+{
+ Ipp32u* data = (Ipp32u*)mblk;
+
+ Ipp32u* digest = (Ipp32u*)uinHash;
+ Ipp32u* SHA1_cnt_loc = (Ipp32u*)uniParam;
+
+ for(; mlen>=MBS_SHA1; data += MBS_SHA1/sizeof(Ipp32u), mlen -= MBS_SHA1) {
+ int t;
+
+ /*
+ // expand message block
+ */
+ Ipp32u W[80];
+ /* initialize the first 16 words in the array W (remember about endian) */
+ for(t=0; t<16; t++) {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ W[t] = data[t];
+ #else
+ W[t] = ENDIANNESS(data[t]);
+ #endif
+ }
+ /* schedule another 80-16 words in the array W */
+ for(; t<80; t++) {
+ W[t] = ROL32(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
+ }
+
+ /*
+ // update hash
+ */
+ {
+ /* init A, B, C, D, E by the the input hash */
+ Ipp32u A = digest[0];
+ Ipp32u B = digest[1];
+ Ipp32u C = digest[2];
+ Ipp32u D = digest[3];
+ Ipp32u E = digest[4];
+
+ #if defined(_ALG_SHA1_COMPACT_)
+ /* steps 0-79 */
+ for(t=0; t<80; t++)
+ COMPACT_SHA1_STEP(A,B,C,D,E, MagicFun, W, SHA1_cnt_loc, t);
+
+ #else
+ /* perform 0-19 steps */
+ for(t=0; t<20; t+=5) {
+ SHA1_STEP(A,B,C,D,E, MAGIC_F0, W[t ],SHA1_cnt_loc[0]);
+ SHA1_STEP(E,A,B,C,D, MAGIC_F0, W[t+1],SHA1_cnt_loc[0]);
+ SHA1_STEP(D,E,A,B,C, MAGIC_F0, W[t+2],SHA1_cnt_loc[0]);
+ SHA1_STEP(C,D,E,A,B, MAGIC_F0, W[t+3],SHA1_cnt_loc[0]);
+ SHA1_STEP(B,C,D,E,A, MAGIC_F0, W[t+4],SHA1_cnt_loc[0]);
+ }
+ /* perform 20-39 steps */
+ for(; t<40; t+=5) {
+ SHA1_STEP(A,B,C,D,E, MAGIC_F1, W[t ],SHA1_cnt_loc[1]);
+ SHA1_STEP(E,A,B,C,D, MAGIC_F1, W[t+1],SHA1_cnt_loc[1]);
+ SHA1_STEP(D,E,A,B,C, MAGIC_F1, W[t+2],SHA1_cnt_loc[1]);
+ SHA1_STEP(C,D,E,A,B, MAGIC_F1, W[t+3],SHA1_cnt_loc[1]);
+ SHA1_STEP(B,C,D,E,A, MAGIC_F1, W[t+4],SHA1_cnt_loc[1]);
+ }
+ /* perform 40-59 steps */
+ for(; t<60; t+=5) {
+ SHA1_STEP(A,B,C,D,E, MAGIC_F2, W[t ],SHA1_cnt_loc[2]);
+ SHA1_STEP(E,A,B,C,D, MAGIC_F2, W[t+1],SHA1_cnt_loc[2]);
+ SHA1_STEP(D,E,A,B,C, MAGIC_F2, W[t+2],SHA1_cnt_loc[2]);
+ SHA1_STEP(C,D,E,A,B, MAGIC_F2, W[t+3],SHA1_cnt_loc[2]);
+ SHA1_STEP(B,C,D,E,A, MAGIC_F2, W[t+4],SHA1_cnt_loc[2]);
+ }
+ /* perform 60-79 steps */
+ for(; t<80; t+=5) {
+ SHA1_STEP(A,B,C,D,E, MAGIC_F3, W[t ],SHA1_cnt_loc[3]);
+ SHA1_STEP(E,A,B,C,D, MAGIC_F3, W[t+1],SHA1_cnt_loc[3]);
+ SHA1_STEP(D,E,A,B,C, MAGIC_F3, W[t+2],SHA1_cnt_loc[3]);
+ SHA1_STEP(C,D,E,A,B, MAGIC_F3, W[t+3],SHA1_cnt_loc[3]);
+ SHA1_STEP(B,C,D,E,A, MAGIC_F3, W[t+4],SHA1_cnt_loc[3]);
+ }
+ #endif
+
+ /* update digest */
+ digest[0] += A;
+ digest[1] += B;
+ digest[2] += C;
+ digest[3] += D;
+ digest[4] += E;
+ }
+ }
+}
+
+#endif
+//#endif /* IPP_ALG_HASH_SHA1 */
diff --git a/ext/ipp/sources/ippcp/src/pcphashsha256px.c b/ext/ipp/sources/ippcp/src/pcphashsha256px.c
new file mode 100644
index 0000000..d0a7330
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashsha256px.c
@@ -0,0 +1,213 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Message block processing according to SHA256
+//
+// Contents:
+// UpdateSHA256()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+#include "pcptool.h"
+
+#if !defined(_ENABLE_ALG_SHA256_) && !defined(_ENABLE_ALG_SHA224_)
+#pragma message("IPP_ALG_HASH_SHA256 disabled")
+
+#else
+//#pragma message("IPP_ALG_HASH_SHA256 enabled")
+
+#if !((_IPP==_IPP_M5) || \
+ (_IPP==_IPP_W7) || (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || (_IPP==_IPP_P8) || \
+ (_IPP==_IPP_S8) || (_IPP>=_IPP_G9) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E==_IPP32E_N8) || (_IPP32E>=_IPP32E_E9) || \
+ (_IPP64==_IPP64_I7) )
+
+/*
+// SHA256 Specific Macros (reference proposal 256-384-512)
+*/
+#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
+#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+#define SUM0(x) (ROR32((x), 2) ^ ROR32((x),13) ^ ROR32((x),22))
+#define SUM1(x) (ROR32((x), 6) ^ ROR32((x),11) ^ ROR32((x),25))
+
+#define SIG0(x) (ROR32((x), 7) ^ ROR32((x),18) ^ LSR32((x), 3))
+#define SIG1(x) (ROR32((x),17) ^ ROR32((x),19) ^ LSR32((x),10))
+
+#define SHA256_UPDATE(i) \
+ wdat[i & 15] += SIG1(wdat[(i+14)&15]) + wdat[(i+9)&15] + SIG0(wdat[(i+1)&15])
+
+#define SHA256_STEP(i,j) \
+ v[(7 - i) & 7] += (j ? SHA256_UPDATE(i) : wdat[i&15]) \
+ + SHA256_cnt_loc[i + j] \
+ + SUM1(v[(4-i)&7]) \
+ + CH(v[(4-i)&7], v[(5-i)&7], v[(6-i)&7]); \
+ v[(3-i)&7] += v[(7-i)&7]; \
+ v[(7-i)&7] += SUM0(v[(0-i)&7]) + MAJ(v[(0-i)&7], v[(1-i)&7], v[(2-i)&7])
+
+#define COMPACT_SHA256_STEP(A,B,C,D,E,F,G,H, W,K, r) { \
+ Ipp32u _T1 = (H) + SUM1((E)) + CH((E),(F),(G)) + (W)[(r)] + (K)[(r)]; \
+ Ipp32u _T2 = SUM0((A)) + MAJ((A),(B),(C)); \
+ (H) = (G); \
+ (G) = (F); \
+ (F) = (E); \
+ (E) = (D)+_T1; \
+ (D) = (C); \
+ (C) = (B); \
+ (B) = (A); \
+ (A) = _T1+_T2; \
+}
+
+/*F*
+// Name: UpdateSHA256
+//
+// Purpose: Update internal hash according to input message stream.
+//
+// Parameters:
+// uniHash pointer to in/out hash
+// mblk pointer to message stream
+// mlen message stream length (multiple by message block size)
+// uniParam pointer to the optional parameter
+//
+*F*/
+#if defined(_ALG_SHA256_COMPACT_)
+#pragma message("SHA256 compact")
+
+void UpdateSHA256(void* uniHash, const Ipp8u* mblk, int mlen, const void* uniParam)
+{
+ Ipp32u* data = (Ipp32u*)mblk;
+
+ Ipp32u* digest = (Ipp32u*)uniHash;
+ Ipp32u* SHA256_cnt_loc = (Ipp32u*)uniParam;
+
+ for(; mlen>=MBS_SHA256; data += MBS_SHA256/sizeof(Ipp32u), mlen -= MBS_SHA256) {
+ int t;
+
+ /*
+ // expand message block
+ */
+ Ipp32u W[64];
+ /* initialize the first 16 words in the array W (remember about endian) */
+ for(t=0; t<16; t++) {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ W[t] = data[t];
+ #else
+ W[t] = ENDIANNESS( data[t] );
+ #endif
+ }
+ for(; t<64; t++)
+ W[t] = SIG1(W[t-2]) + W[t-7] + SIG0(W[t-15]) + W[t-16];
+
+ /*
+ // update hash
+ */
+ {
+ /* init A, B, C, D, E, F, G, H by the input hash */
+ Ipp32u A = digest[0];
+ Ipp32u B = digest[1];
+ Ipp32u C = digest[2];
+ Ipp32u D = digest[3];
+ Ipp32u E = digest[4];
+ Ipp32u F = digest[5];
+ Ipp32u G = digest[6];
+ Ipp32u H = digest[7];
+
+ for(t=0; t<64; t++)
+ COMPACT_SHA256_STEP(A,B,C,D,E,F,G,H, W,SHA256_cnt_loc, t);
+
+ /* update hash*/
+ digest[0] += A;
+ digest[1] += B;
+ digest[2] += C;
+ digest[3] += D;
+ digest[4] += E;
+ digest[5] += F;
+ digest[6] += G;
+ digest[7] += H;
+ }
+ }
+}
+
+#else
+void UpdateSHA256(void* uniHash, const Ipp8u* mblk, int mlen, const void* uniParam)
+{
+ Ipp32u* data = (Ipp32u*)mblk;
+
+ Ipp32u* digest = (Ipp32u*)uniHash;
+ Ipp32u* SHA256_cnt_loc = (Ipp32u*)uniParam;
+
+ for(; mlen>=MBS_SHA256; data += MBS_SHA256/sizeof(Ipp32u), mlen -= MBS_SHA256) {
+ Ipp32u wdat[16];
+ int j;
+
+ /* copy digest */
+ Ipp32u v[8];
+ CopyBlock(digest, v, IPP_SHA256_DIGEST_BITSIZE/BYTESIZE);
+
+ /* initialize the first 16 words in the array W (remember about endian) */
+ for(j=0; j<16; j++) {
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ wdat[j] = data[j];
+ #else
+ wdat[j] = ENDIANNESS( data[j] );
+ #endif
+ }
+
+ for(j=0; j<64; j+=16) {
+ SHA256_STEP( 0, j);
+ SHA256_STEP( 1, j);
+ SHA256_STEP( 2, j);
+ SHA256_STEP( 3, j);
+ SHA256_STEP( 4, j);
+ SHA256_STEP( 5, j);
+ SHA256_STEP( 6, j);
+ SHA256_STEP( 7, j);
+ SHA256_STEP( 8, j);
+ SHA256_STEP( 9, j);
+ SHA256_STEP(10, j);
+ SHA256_STEP(11, j);
+ SHA256_STEP(12, j);
+ SHA256_STEP(13, j);
+ SHA256_STEP(14, j);
+ SHA256_STEP(15, j);
+ }
+
+ /* update digest */
+ digest[0] += v[0];
+ digest[1] += v[1];
+ digest[2] += v[2];
+ digest[3] += v[3];
+ digest[4] += v[4];
+ digest[5] += v[5];
+ digest[6] += v[6];
+ digest[7] += v[7];
+ }
+}
+#endif
+
+#endif
+#endif /* IPP_ALG_HASH_SHA256 */
diff --git a/ext/ipp/sources/ippcp/src/pcphashsha512px.c b/ext/ipp/sources/ippcp/src/pcphashsha512px.c
new file mode 100644
index 0000000..cd50b97
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcphashsha512px.c
@@ -0,0 +1,220 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Message block processing according to SHA512
+//
+// Contents:
+// UpdateSHA512()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+#include "pcptool.h"
+
+#if !defined(_ENABLE_ALG_SHA512_) && !defined(_ENABLE_ALG_SHA_SHA384_) && !defined(_ENABLE_ALG_SHA512_224_) && !defined(_ENABLE_ALG_SHA512_256_)
+#pragma message("IPP_ALG_HASH_SHA512 disabled")
+
+#else
+//#pragma message("IPP_ALG_HASH_SHA512 enabled")
+
+#if !((_IPP==_IPP_W7) || (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || (_IPP==_IPP_P8) || \
+ (_IPP==_IPP_S8) || (_IPP>=_IPP_G9) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E==_IPP32E_N8) || (_IPP32E>=_IPP32E_E9) || \
+ (_IPP64==_IPP64_I7) )
+
+/*
+// SHA512 Specific Macros (reference proposal 256-384-512)
+//
+// Note: All operations act on DWORDs (64-bits)
+*/
+#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
+#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+#define SUM0(x) (ROR64((x),28) ^ ROR64((x),34) ^ ROR64((x),39))
+#define SUM1(x) (ROR64((x),14) ^ ROR64((x),18) ^ ROR64((x),41))
+
+#define SIG0(x) (ROR64((x), 1) ^ ROR64((x), 8) ^ LSR64((x), 7))
+#define SIG1(x) (ROR64((x),19) ^ ROR64((x),61) ^ LSR64((x), 6))
+
+#define SHA512_UPDATE(i) \
+ wdat[i&15] += SIG1(wdat[(i+14)&15]) + wdat[(i+9)&15] + SIG0(wdat[(i+1)&15])
+
+#define SHA512_STEP(i,j) \
+ v[(7-i)&7] += (j ? SHA512_UPDATE(i) : wdat[i&15]) \
+ + SHA512_cnt_loc[i+j] \
+ + SUM1(v[(4-i)&7]) \
+ + CH(v[(4-i)&7], v[(5-i)&7], v[(6-i)&7]); \
+ v[(3-i)&7] += v[(7-i)&7]; \
+ v[(7-i)&7] += SUM0(v[(0-i)&7]) + MAJ(v[(0-i)&7], v[(1-i)&7], v[(2-i)&7])
+
+#define COMPACT_SHA512_STEP(A,B,C,D,E,F,G,H, W,K, r) { \
+ Ipp64u _T1 = (H) + SUM1((E)) + CH((E),(F),(G)) + (W)[(r)] + (K)[(r)]; \
+ Ipp64u _T2 = SUM0((A)) + MAJ((A),(B),(C)); \
+ (H) = (G); \
+ (G) = (F); \
+ (F) = (E); \
+ (E) = (D)+_T1; \
+ (D) = (C); \
+ (C) = (B); \
+ (B) = (A); \
+ (A) = _T1+_T2; \
+}
+
+/*F*
+// Name: UpdateSHA512
+//
+// Purpose: Update internal hash according to input message stream.
+//
+// Parameters:
+// uniHash pointer to in/out hash
+// mblk pointer to message stream
+// mlen message stream length (multiple by message block size)
+// uniParam pointer to the optional parameter
+//
+*F*/
+#if defined(_ALG_SHA512_COMPACT_)
+#pragma message("SHA512 compact")
+
+void UpdateSHA512(void* uniHash, const Ipp8u* mblk, int mlen, const void* uniPraram)
+{
+ Ipp32u* data = (Ipp32u*)mblk;
+
+ Ipp64u* digest = (Ipp64u*)uniHash;
+ Ipp64u* SHA512_cnt_loc = (Ipp64u*)uniPraram;
+
+
+ for(; mlen>=MBS_SHA512; data += MBS_SHA512/sizeof(Ipp32u), mlen -= MBS_SHA512) {
+ int t;
+ Ipp64u W[80];
+
+ /*
+ // expand message block
+ */
+ /* initialize the first 16 words in the array W (remember about endian) */
+ for(t=0; t<16; t++) {
+ Ipp32u hiX = data[2*t];
+ Ipp32u loX = data[2*t+1];
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ W[t] = MAKEDWORD(loX, hiX);
+ #else
+ W[t] = MAKEDWORD( ENDIANNESS(loX), ENDIANNESS(hiX) );
+ #endif
+ }
+ for(; t<80; t++)
+ W[t] = SIG1(W[t-2]) + W[t-7] + SIG0(W[t-15]) + W[t-16];
+
+ /*
+ // update hash
+ */
+ {
+ /* init A, B, C, D, E, F, G, H by the input hash */
+ Ipp64u A = digest[0];
+ Ipp64u B = digest[1];
+ Ipp64u C = digest[2];
+ Ipp64u D = digest[3];
+ Ipp64u E = digest[4];
+ Ipp64u F = digest[5];
+ Ipp64u G = digest[6];
+ Ipp64u H = digest[7];
+
+ for(t=0; t<80; t++)
+ COMPACT_SHA512_STEP(A,B,C,D,E,F,G,H, W,SHA512_cnt_loc, t);
+
+ /* update hash*/
+ digest[0] += A;
+ digest[1] += B;
+ digest[2] += C;
+ digest[3] += D;
+ digest[4] += E;
+ digest[5] += F;
+ digest[6] += G;
+ digest[7] += H;
+ }
+ }
+}
+
+#else
+void UpdateSHA512(void* uniHash, const Ipp8u* mblk, int mlen, const void* uniPraram)
+{
+ Ipp32u* data = (Ipp32u*)mblk;
+
+ Ipp64u* digest = (Ipp64u*)uniHash;
+ Ipp64u* SHA512_cnt_loc = (Ipp64u*)uniPraram;
+
+ for(; mlen>=MBS_SHA512; data += MBS_SHA512/sizeof(Ipp32u), mlen -= MBS_SHA512) {
+ Ipp64u wdat[16];
+ int j;
+
+ Ipp64u v[8];
+
+ /* initialize the first 16 words in the array W (remember about endian) */
+ for(j=0; j<16; j++) {
+ Ipp32u hiX = data[2*j];
+ Ipp32u loX = data[2*j+1];
+ #if (IPP_ENDIAN == IPP_BIG_ENDIAN)
+ wdat[j] = MAKEDWORD(loX, hiX);
+ #else
+ wdat[j] = MAKEDWORD( ENDIANNESS(loX), ENDIANNESS(hiX) );
+ #endif
+ }
+
+ /* copy digest */
+ CopyBlock(digest, v, IPP_SHA512_DIGEST_BITSIZE/BYTESIZE);
+
+ for(j=0; j<80; j+=16) {
+ SHA512_STEP( 0, j);
+ SHA512_STEP( 1, j);
+ SHA512_STEP( 2, j);
+ SHA512_STEP( 3, j);
+ SHA512_STEP( 4, j);
+ SHA512_STEP( 5, j);
+ SHA512_STEP( 6, j);
+ SHA512_STEP( 7, j);
+ SHA512_STEP( 8, j);
+ SHA512_STEP( 9, j);
+ SHA512_STEP(10, j);
+ SHA512_STEP(11, j);
+ SHA512_STEP(12, j);
+ SHA512_STEP(13, j);
+ SHA512_STEP(14, j);
+ SHA512_STEP(15, j);
+ }
+
+ /* update digest */
+ digest[0] += v[0];
+ digest[1] += v[1];
+ digest[2] += v[2];
+ digest[3] += v[3];
+ digest[4] += v[4];
+ digest[5] += v[5];
+ digest[6] += v[6];
+ digest[7] += v[7];
+ }
+}
+#endif
+
+#endif
+#endif /* IPP_ALG_HASH_SHA512 */
diff --git a/ext/ipp/sources/ippcp/src/pcpmontexpbinca.c b/ext/ipp/sources/ippcp/src/pcpmontexpbinca.c
new file mode 100644
index 0000000..8c69538
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmontexpbinca.c
@@ -0,0 +1,451 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Modular Exponentiation (binary version)
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcpmontgomery.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+
+/*
+// Binary method of Exponentiation
+*/
+#if !defined(_USE_ERNIE_CBA_MITIGATION_) && !defined(_USE_GRES_CBA_MITIGATION_) // unsafe version
+void cpSafeMontExp_Binary(IppsBigNumState* pY,
+ const IppsBigNumState* pX, const IppsBigNumState* pE,
+ IppsMontState* pMont)
+{
+ int k;
+
+ /* if E==0 then Y=R mod m */
+ if (pE->size == 1 && pE->number[0] == 0) {
+ int len = IPP_MULTIPLE_OF(pMont->n->size, BNUBASE_TYPE_SIZE);
+ cpMemset32u(pMont->wb->number, 0, len);
+ pMont->wb->number[len] = 1;
+
+ cpMod_BNU(pMont->wb->number, len + 1, pMont->n->number, pMont->n->size, &pY->size);
+
+ cpMemcpy32u(pY->number, pMont->wb->number, pY->size);
+ pY->sgn = ippBigNumPOS;
+ return;
+ }
+
+ else {
+ Ipp32u* r_number = pY->workBuffer;
+ int r_size = pY->size;
+
+ int flag=1;
+ Ipp32u power = pE->number[pE->size-1];
+
+ for( k = 31; k >= 0; k-- ) {
+ Ipp32u powd = power & 0x80000000;/* from top to bottom*/
+ power <<= 1;
+
+ if((flag == 1) && (powd == 0))
+ continue;
+
+ else if (flag == 0) {
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(r_number, r_size, r_number,r_size,
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number);
+ #else
+ cpMontMul(r_number, r_size, r_number,r_size,
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number, pMont->pBuffer);
+ #endif
+ if (powd)
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(r_number, r_size, pX->number,pX->size,
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number);
+ #else
+ cpMontMul(r_number, r_size, pX->number,pX->size,
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number, pMont->pBuffer);
+ #endif
+ }
+
+ else {
+ int i;
+ flag = 0;
+ r_size = pMont->n->size;
+ if( pX->size < pMont->n->size )
+ for(i = r_size - 1; i >= pX->size; i-- )
+ r_number[i] = 0;
+
+ for( i = pX->size - 1; i >= 0; i-- )
+ r_number[i] = pX->number[i];
+ }
+ }
+
+ if (pE->size > 1) {
+ struct BNU {
+ Ipp32u *number;
+ int *size;
+ } BNUs[2];
+ BNUs[0].number = r_number;
+ BNUs[0].size = &r_size;
+ BNUs[1].number = pX->number;
+ BNUs[1].size = &(((IppsBigNumState*)pX)->size);
+
+ for( k = pE->size - 2; k >= 0; k-- ) {
+ int j;
+ Ipp32u powd = 0;
+ power = pE->number[k];
+
+ for( j = 31; j >= 0; j-- ) {
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(r_number, r_size, BNUs[powd].number, *(BNUs[powd].size),
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number);
+ #else
+ cpMontMul(r_number, r_size, BNUs[powd].number, *(BNUs[powd].size),
+ pMont->n->number, pMont->n->size,
+ r_number,&r_size, pMont->n0, pMont->wb->number, pMont->pBuffer);
+ #endif
+ powd = ((power >> j) & 0x1) & (powd ^ 1);
+ j += powd;
+ }
+ }
+ }
+
+ for(k=r_size-1; k>= 0; k--)
+ pY->number[k] = r_number[k];
+
+ pY->sgn = ippBigNumPOS;
+ pY->size = r_size;
+
+ while((pY->size > 1) && (pY->number[pY->size-1] == 0))
+ pY->size--;
+
+ return;
+ }
+}
+#endif /* _xUSE_ERNIE_CBA_MITIGATION_, _xUSE_GRES_CBA_MITIGATION_ */
+
+
+#if defined(_USE_ERNIE_CBA_MITIGATION_)
+/*
+// The version below was designed according to recommendation
+// from Ernie Brickell and Mattew Wood.
+// The reason was to mitigate "cache monitoring" attack on RSA
+// Note: this version slower than pre-mitigated version ~ 30-40%
+*/
+#define SET_BNU(dst,val,len) \
+{ \
+ int n; \
+ for(n=0; n<(len); n++) (dst)[n] = (val); \
+}
+
+#define AND_BNU(dst,src1,src2,len) \
+{ \
+ int n; \
+ for(n=0; n<(len); n++) (dst)[n] = (src1)[n] & (src2)[n]; \
+}
+
+void cpSafeMontExp_Binary(IppsBigNumState* pY,
+ const IppsBigNumState* pX, const IppsBigNumState* pE,
+ IppsMontState* pMont)
+{
+ Ipp32u* eData = BN_NUMBER(pE);
+ int eSize = BN_SIZE(pE);
+
+ /*
+ // if e==0 then r=R mod m (i.e MontEnc(1))
+ */
+ if (eSize == 1 && eData[0] == 0) {
+ cpBN_copy(MNT_1(pMont), pY);
+ return;
+ }
+
+ /*
+ // modulo exponentiation
+ */
+ if(pY!=pX) /* init result */
+ cpBN_copy(pX, pY);
+
+ {
+ Ipp32u eValue;
+ int nBits;
+
+ Ipp32u* pModulus = BN_NUMBER(MNT_MODULO(pMont));
+ int mSize = BN_SIZE(MNT_MODULO(pMont));
+ Ipp32u* pHelper = MNT_HELPER(pMont);
+
+ Ipp32u* yData = BN_NUMBER(pY);
+ Ipp32u* xData = BN_BUFFER(pY);
+ int ySize = BN_SIZE(pY);
+
+ Ipp32u* tData = BN_NUMBER(MNT_PRODUCT(pMont));
+ Ipp32u* pBuffer = BN_BUFFER(MNT_PRODUCT(pMont));
+ Ipp32u* pMontOne= BN_NUMBER(MNT_1(pMont));
+
+ /* expand Mont(1) */
+ ZEXPAND_BNU(pMontOne, BN_SIZE(MNT_1(pMont)), mSize);
+
+ /* copy base */
+ ZEXPAND_COPY_BNU(yData,ySize, xData,mSize);
+
+
+ /* execute most significant part pE */
+ eValue = eData[eSize-1];
+ nBits = 32-NLZ32u(eValue);
+ eValue <<= (32-nBits);
+
+ nBits--;
+ eValue <<=1;
+ for(; nBits>0; nBits--, eValue<<=1) {
+ Ipp32u carry;
+
+ /* squaring: R^2 mod Modulus */
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(yData, ySize,
+ yData, ySize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer);
+ #else
+ cpMontMul(yData, ySize,
+ yData, ySize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer, MNT_BUFFER(pMont));
+ #endif
+
+ /* T = (X-1)*bitof(E,j) + 1 */
+ SET_BNU(pBuffer, ((Ipp32s)eValue)>>31, mSize);
+ carry = cpSub_BNU(tData, xData, pMontOne, mSize);
+ AND_BNU(tData, tData, pBuffer, mSize);
+ carry = cpAdd_BNU(tData, tData, pMontOne, mSize);
+
+ /* multiply: Y*T mod Modulus */
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(yData, ySize,
+ tData, mSize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer);
+ #else
+ cpMontMul(yData, ySize,
+ tData, mSize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer, MNT_BUFFER(pMont));
+ #endif
+ }
+
+ /* execute rest bits of E */
+ eSize--;
+ for(; eSize>0; eSize--) {
+ eValue = eData[eSize-1];
+
+ for(nBits=32; nBits>0; nBits--, eValue<<=1) {
+ Ipp32u carry;
+
+ /* squaring: R^2 mod Modulus */
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(yData, ySize,
+ yData, ySize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer);
+ #else
+ cpMontMul(yData, ySize,
+ yData, ySize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer, MNT_BUFFER(pMont));
+ #endif
+
+ /* T = (X-1)*bitof(E,j) + 1 */
+ SET_BNU(pBuffer, ((Ipp32s)eValue)>>31, mSize);
+ carry = cpSub_BNU(tData, xData, pMontOne, mSize);
+ AND_BNU(tData, tData, pBuffer, mSize);
+ carry = cpAdd_BNU(tData, tData, pMontOne, mSize);
+
+ /* multiply: R*T mod Modulus */
+ #if defined(_USE_NN_MONTMUL_)
+ cpMontMul(yData, ySize,
+ tData, mSize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer);
+ #else
+ cpMontMul(yData, ySize,
+ tData, mSize,
+ pModulus, mSize,
+ yData, &ySize,
+ pHelper, pBuffer, MNT_BUFFER(pMont));
+ #endif
+ }
+ }
+
+ BN_SIZE(pY) = ySize;
+ }
+}
+#endif /* _USE_ERNIE_CBA_MITIGATION_ */
+
+
+#if defined(_USE_GRES_CBA_MITIGATION_)
+/*
+// The reason was to mitigate "cache monitoring" attack on RSA
+//
+// This is improved version of modular exponentiation.
+// Current version provide both either mitigation and perrformance.
+// This version in comparison with previous (IPP 4.1.3) one ~30-40% faster,
+// i.e the the performance stayed as was for pre-mitigated version
+//
+*/
+cpSize cpMontExpBin_BNU_sscm(BNU_CHUNK_T* dataY,
+ const BNU_CHUNK_T* dataX, cpSize nsX,
+ const BNU_CHUNK_T* dataE, cpSize nsE,
+ gsModEngine* pMont)
+{
+ cpSize nsM = MOD_LEN(pMont);
+
+ /*
+ // test for special cases:
+ // x^0 = 1
+ // 0^e = 0
+ */
+ if( cpEqu_BNU_CHUNK(dataE, nsE, 0) ) {
+ COPY_BNU(dataY, MOD_MNT_R(pMont), nsM);
+ }
+ else if( cpEqu_BNU_CHUNK(dataX, nsX, 0) ) {
+ ZEXPAND_BNU(dataY, 0, nsM);
+ }
+
+ /* general case */
+ else {
+ /* Montgomery engine buffers */
+ const int usedPoolLen = 2;
+ BNU_CHUNK_T* dataT = gsModPoolAlloc(pMont, usedPoolLen);
+ BNU_CHUNK_T* sscmBuffer = dataT + nsM;
+ //gres: temporary excluded: assert(NULL!=dataT);
+
+ int back_step = 0;
+
+ /* copy base */
+ ZEXPAND_COPY_BNU(dataT, nsM, dataX, nsX);
+ /* init result, Y=1 */
+ COPY_BNU(dataY, MOD_MNT_R(pMont), nsM);
+
+ /* execute bits of E */
+ for(; nsE>0; nsE--) {
+ BNU_CHUNK_T eValue = dataE[nsE-1];
+
+ int j;
+ for(j=BNU_CHUNK_BITS-1; j>=0; j--) {
+ BNU_CHUNK_T mask_pattern = (BNU_CHUNK_T)(back_step-1);
+
+ /* safeBuffer = (Y[] and mask_pattern) or (X[] and ~mask_pattern) */
+ int i;
+ for(i=0; i<nsM; i++)
+ sscmBuffer[i] = (dataY[i] & mask_pattern) | (dataT[i] & ~mask_pattern);
+
+ /* squaring/multiplication: R = R*T mod Modulus */
+ cpMontMul_BNU(dataY, dataY, sscmBuffer, pMont);
+
+ /* update back_step and j */
+ back_step = ((eValue>>j) & 0x1) & (back_step^1);
+ j += back_step;
+ }
+ }
+
+ gsModPoolFree(pMont, usedPoolLen);
+ }
+
+ return nsM;
+}
+#endif /* _USE_GRES_CBA_MITIGATION_ */
+
+
+cpSize cpMontExpBin_BNU(BNU_CHUNK_T* dataY,
+ const BNU_CHUNK_T* dataX, cpSize nsX,
+ const BNU_CHUNK_T* dataE, cpSize nsE,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN( pModEngine );
+
+ /*
+ // test for special cases:
+ // x^0 = 1
+ // 0^e = 0
+ */
+ if( cpEqu_BNU_CHUNK(dataE, nsE, 0) ) {
+ COPY_BNU(dataY, MOD_MNT_R( pModEngine ), nsM);
+ }
+ else if( cpEqu_BNU_CHUNK(dataX, nsX, 0) ) {
+ ZEXPAND_BNU(dataY, 0, nsM);
+ }
+
+ /* general case */
+ else {
+ /* Montgomery engine buffers */
+ const int usedPoolLen = 1;
+ BNU_CHUNK_T* dataT = gsModPoolAlloc(pModEngine, usedPoolLen);
+ //gres: temporary excluded: assert(NULL!=dataT);
+
+ {
+ /* execute most significant part pE */
+ BNU_CHUNK_T eValue = dataE[nsE-1];
+ int n = cpNLZ_BNU(eValue)+1;
+
+ /* expand base and init result */
+ ZEXPAND_COPY_BNU(dataT, nsM, dataX, nsX);
+ COPY_BNU(dataY, dataT, nsM);
+
+ eValue <<= n;
+ for(; n<BNU_CHUNK_BITS; n++, eValue<<=1) {
+ /* squaring R = R*R mod Modulus */
+ MOD_METHOD( pModEngine )->sqr(dataY, dataY, pModEngine);
+
+ /* and multiply R = R*X mod Modulus */
+ if(eValue & ((BNU_CHUNK_T)1<<(BNU_CHUNK_BITS-1)))
+ MOD_METHOD( pModEngine )->mul(dataY, dataY, dataT, pModEngine);
+ }
+
+ /* execute rest bits of E */
+ for(--nsE; nsE>0; nsE--) {
+ eValue = dataE[nsE-1];
+
+ for(n=0; n<BNU_CHUNK_BITS; n++, eValue<<=1) {
+ /* squaring: R = R*R mod Modulus */
+ MOD_METHOD( pModEngine )->sqr(dataY, dataY, pModEngine);
+
+ if(eValue & ((BNU_CHUNK_T)1<<(BNU_CHUNK_BITS-1)))
+ MOD_METHOD( pModEngine )->mul(dataY, dataY, dataT, pModEngine);
+ }
+ }
+ }
+
+ gsModPoolFree(pModEngine, usedPoolLen);
+ }
+
+ return nsM;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpmontgomery.h b/ext/ipp/sources/ippcp/src/pcpmontgomery.h
new file mode 100644
index 0000000..a33d9d5
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmontgomery.h
@@ -0,0 +1,308 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+//
+*/
+
+#if !defined(_CP_MONTGOMETRY_H)
+#define _CP_MONTGOMETRY_H
+
+#include "pcpbn.h"
+#include "gsmodstuff.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+#define MONT_DEFAULT_POOL_LENGTH 4
+
+/*
+// Montgomery spec structure
+*/
+struct _cpMontgomery
+{
+ IppCtxId idCtx; /* Montgomery spec identifier */
+ cpSize maxLen; /* Maximum length of modulus being stored */
+ gsModEngine* pEngine; /* Modular arith engine structure */
+};
+
+/* accessory macros */
+#define MNT_ID(eng) ((eng)->idCtx)
+#define MNT_ROOM(eng) ((eng)->maxLen)
+#define MNT_ENGINE(eng) ((eng)->pEngine)
+
+#define MNT_VALID_ID(eng) (MNT_ID((eng))==idCtxMontgomery)
+
+/* default methos */
+#define EXPONENT_METHOD (ippBinaryMethod)
+
+/* alignment */
+#define MONT_ALIGNMENT ((int)(sizeof(void*)))
+
+
+/*
+// Pacp/unpack Montgomery context
+*/
+#define cpPackMontCtx OWNAPI(cpPackMontCtx)
+void cpPackMontCtx(const IppsMontState* pCtx, Ipp8u* pBuffer);
+#define cpUnpackMontCtx OWNAPI(cpUnpackMontCtx)
+void cpUnpackMontCtx(const Ipp8u* pBuffer, IppsMontState* pCtx);
+
+
+/*
+// Montgomery reduction, multiplication and squaring
+*/
+__INLINE void cpMontRed_BNU(BNU_CHUNK_T* pR,
+ BNU_CHUNK_T* pProduct,
+ gsModEngine* pModEngine)
+{
+ MOD_METHOD( pModEngine )->red(pR, pProduct, pModEngine);
+}
+
+__INLINE void cpMontMul_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA,
+ const BNU_CHUNK_T* pB,
+ gsModEngine* pModEngine)
+{
+ MOD_METHOD( pModEngine )->mul(pR, pA, pB, pModEngine);
+}
+
+__INLINE cpSize cpMontMul_BNU_EX(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ const BNU_CHUNK_T* pB, cpSize nsB,
+ gsModEngine* pModEngine)
+{
+ const int usedPoolLen = 1;
+ cpSize nsM = MOD_LEN( pModEngine );
+ BNU_CHUNK_T* pDataR = pR;
+ BNU_CHUNK_T* pDataA = gsModPoolAlloc(pModEngine, usedPoolLen);
+ //gres: temporary excluded: assert(NULL!=pDataA);
+
+ ZEXPAND_COPY_BNU(pDataA, nsM, pA, nsA);
+ ZEXPAND_COPY_BNU(pDataR, nsM, pB, nsB);
+
+ MOD_METHOD( pModEngine )->mul(pDataR, pDataA, pDataR, pModEngine);
+
+ gsModPoolFree(pModEngine, usedPoolLen);
+ return nsM;
+}
+
+__INLINE void cpMontSqr_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA,
+ gsModEngine* pModEngine)
+{
+ MOD_METHOD( pModEngine )->sqr(pR, pA, pModEngine);
+}
+
+__INLINE void cpMontSqr_BNU_EX(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pA, cpSize nsA,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN( pModEngine );
+ ZEXPAND_COPY_BNU(pR, nsM, pA, nsA);
+
+ MOD_METHOD( pModEngine )->sqr(pR, pR, pModEngine);
+}
+
+/*
+// Montgomery encoding/decoding
+*/
+__INLINE cpSize cpMontEnc_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pXreg,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN(pModEngine);
+
+ MOD_METHOD( pModEngine )->encode(pR, pXreg, pModEngine);
+
+ FIX_BNU(pR, nsM);
+ return nsM;
+}
+
+__INLINE cpSize cpMontEnc_BNU_EX(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pXreg, cpSize nsX,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN(pModEngine);
+
+ ZEXPAND_COPY_BNU(pR, nsM, pXreg, nsX);
+
+ MOD_METHOD( pModEngine )->encode(pR, pR, pModEngine);
+
+ FIX_BNU(pR, nsM);
+
+ return nsM;
+}
+
+__INLINE cpSize cpMontDec_BNU(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pXmont, cpSize nsX,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN( pModEngine );
+
+ ZEXPAND_COPY_BNU(pR, nsM, pXmont, nsX);
+
+ MOD_METHOD( pModEngine )->decode(pR, pR, pModEngine);
+
+ FIX_BNU(pR, nsM);
+ return nsM;
+}
+
+__INLINE void cpMontMul_BN(IppsBigNumState* pRbn,
+ const IppsBigNumState* pXbn,
+ const IppsBigNumState* pYbn,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = cpMontMul_BNU_EX(BN_NUMBER(pRbn),
+ BN_NUMBER(pXbn), BN_SIZE(pXbn),
+ BN_NUMBER(pYbn), BN_SIZE(pYbn),
+ pModEngine);
+
+ FIX_BNU(BN_NUMBER(pRbn), nsM);
+ BN_SIZE(pRbn) = nsM;
+ BN_SIGN(pRbn) = ippBigNumPOS;
+}
+
+__INLINE void cpMontEnc_BN(IppsBigNumState* pRbn,
+ const IppsBigNumState* pXbn,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = cpMontEnc_BNU_EX(BN_NUMBER(pRbn),
+ BN_NUMBER(pXbn), BN_SIZE(pXbn),
+ pModEngine);
+
+ BN_SIZE(pRbn) = nsM;
+ BN_SIGN(pRbn) = ippBigNumPOS;
+}
+
+__INLINE void cpMontDec_BN(IppsBigNumState* pRbn,
+ const IppsBigNumState* pXbn,
+ gsModEngine* pModEngine)
+{
+ cpSize nsM = MOD_LEN(pModEngine);
+ cpMontDec_BNU(BN_NUMBER(pRbn), BN_NUMBER(pXbn), BN_SIZE(pXbn), pModEngine);
+
+ BN_SIZE(pRbn) = nsM;
+ BN_SIGN(pRbn) = ippBigNumPOS;
+}
+
+/*
+// Montgomery exponentiation (binary) "fast" and "safe" versions
+*/
+#define cpMontExpBin_BNU_sscm OWNAPI(cpMontExpBin_BNU_sscm)
+cpSize cpMontExpBin_BNU_sscm(BNU_CHUNK_T* pY,
+ const BNU_CHUNK_T* pX, cpSize nsX,
+ const BNU_CHUNK_T* pE, cpSize nsE,
+ gsModEngine* pModEngine);
+
+#define cpMontExpBin_BNU OWNAPI(cpMontExpBin_BNU)
+cpSize cpMontExpBin_BNU(BNU_CHUNK_T* pY,
+ const BNU_CHUNK_T* pX, cpSize nsX,
+ const BNU_CHUNK_T* pE, cpSize nsE,
+ gsModEngine* pModEngine);
+
+__INLINE void cpMontExpBin_BN_sscm(IppsBigNumState* pYbn,
+ const IppsBigNumState* pXbn,
+ const IppsBigNumState* pEbn,
+ gsModEngine* pMont)
+{
+ BNU_CHUNK_T* pX = BN_NUMBER(pXbn);
+ cpSize nsX = BN_SIZE(pXbn);
+ BNU_CHUNK_T* pE = BN_NUMBER(pEbn);
+ cpSize nsE = BN_SIZE(pEbn);
+ BNU_CHUNK_T* pY = BN_NUMBER(pYbn);
+ cpSize nsY = cpMontExpBin_BNU_sscm(pY, pX,nsX, pE,nsE, pMont);
+ FIX_BNU(pY, nsY);
+ BN_SIZE(pYbn) = nsY;
+ BN_SIGN(pYbn) = ippBigNumPOS;
+}
+
+__INLINE void cpMontExpBin_BN(IppsBigNumState* pYbn,
+ const IppsBigNumState* pXbn,
+ const IppsBigNumState* pEbn,
+ gsModEngine* pModEngine)
+{
+ BNU_CHUNK_T* pX = BN_NUMBER(pXbn);
+ cpSize nsX = BN_SIZE(pXbn);
+ BNU_CHUNK_T* pE = BN_NUMBER(pEbn);
+ cpSize nsE = BN_SIZE(pEbn);
+ BNU_CHUNK_T* pY = BN_NUMBER(pYbn);
+ cpSize nsY = cpMontExpBin_BNU(pY, pX,nsX, pE,nsE, pModEngine);
+ FIX_BNU(pY, nsY);
+ BN_SIZE(pYbn) = nsY;
+ BN_SIGN(pYbn) = ippBigNumPOS;
+}
+
+
+/*
+// Montgomery exponentiation (fixed window)
+*/
+#define cpMontExp_WinSize OWNAPI(cpMontExp_WinSize)
+cpSize cpMontExp_WinSize(int bitsize);
+
+#if defined(_USE_WINDOW_EXP_)
+#define cpMontExpWin_BN_sscm OWNAPI(cpMontExpWin_BN_sscm)
+void cpMontExpWin_BN_sscm(IppsBigNumState* pY,
+ const IppsBigNumState* pX, const IppsBigNumState* pE,
+ gsModEngine* pMont,
+ BNU_CHUNK_T* pPrecompResource);
+
+#define cpMontExpWin_BN OWNAPI(cpMontExpWin_BN)
+void cpMontExpWin_BN(IppsBigNumState* pY,
+ const IppsBigNumState* pX, const IppsBigNumState* pE,
+ gsModEngine* pMont,
+ BNU_CHUNK_T* pPrecompResource);
+#endif
+
+/*
+// Montgomery multi-exponentiation
+*/
+/* precompute table for multi-exponentiation */
+#define cpMontMultiExpInitArray OWNAPI(cpMontMultiExpInitArray)
+void cpMontMultiExpInitArray(BNU_CHUNK_T* pPrecomTbl,
+ const BNU_CHUNK_T** ppX, cpSize xItemBitSize, cpSize numItems,
+ gsModEngine* pMont);
+
+/* multi-exponentiation */
+#define cpFastMontMultiExp OWNAPI(cpFastMontMultiExp)
+void cpFastMontMultiExp(BNU_CHUNK_T* pY,
+ const BNU_CHUNK_T* pPrecomTbl,
+ const Ipp8u** ppE, cpSize eItemBitSize, cpSize numItems,
+ gsModEngine* pMont);
+/*
+// Montgomery inversion
+*/
+#define cpMontInv_BNU OWNAPI(cpMontInv_BNU)
+BNU_CHUNK_T* cpMontInv_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, IppsMontState* pMont);
+#define cpRegInv_BNU OWNAPI(cpRegInv_BNU)
+BNU_CHUNK_T* cpRegInv_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, IppsMontState* pMont);
+
+
+/*
+// Montgomery internal GetSize/Init functions
+*/
+#define cpMontGetSize OWNAPI(cpMontGetSize)
+IppStatus cpMontGetSize(cpSize maxLen32, int poolLength, cpSize* pCtxSize);
+
+#define cpMontInit OWNAPI(cpMontInit)
+IppStatus cpMontInit(int maxLen32, int poolLength, IppsMontState* pMont);
+
+#define cpMontSet OWNAPI(cpMontSet)
+IppStatus cpMontSet(const Ipp32u* pModulus, cpSize len32, IppsMontState* pMont);
+
+#endif /* _CP_MONTGOMETRY_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpmontgomeryca.c b/ext/ipp/sources/ippcp/src/pcpmontgomeryca.c
new file mode 100644
index 0000000..e22ae7e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmontgomeryca.c
@@ -0,0 +1,424 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+// Contents:
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcpmontgomery.h"
+#include "pcpmulbnukara.h"
+#include "pcptool.h"
+
+//gres: temporary excluded: #include <assert.h>
+
+/* Auxilirary function */
+__INLINE int cpGetBitSize(Ipp32u offset, Ipp32u val)
+{
+ int bitSize = 32;
+ if (val == 0) return 0;
+ while ((val & (1 << bitSize)) == 0) bitSize--;
+ return offset + bitSize;
+}
+
+IppStatus cpMontGetSize(cpSize maxLen32, int poolLength, cpSize* pCtxSize)
+{
+ {
+ int size = 0;
+ int maxBitSize = maxLen32 << 5;
+ gsModEngineGetSize(maxBitSize, poolLength, &size);
+
+ *pCtxSize = sizeof(IppsMontState)
+ + (cpSize)size
+ + MONT_ALIGNMENT-1;
+
+ return ippStsNoErr;
+ }
+}
+
+
+IppStatus cpMontInit(int maxLen32, int poolLength, IppsMontState* pMont)
+{
+ pMont = (IppsMontState*)( IPP_ALIGNED_PTR(pMont, MONT_ALIGNMENT) );
+ {
+ int maxBitSize = ((maxLen32) << 5);
+
+ MNT_ROOM( pMont ) = INTERNAL_BNU_LENGTH(maxLen32);
+ MNT_ENGINE ( pMont ) = (gsModEngine*)((Ipp8u*)pMont + sizeof(IppsMontState));
+
+ MNT_ID(pMont) = idCtxMontgomery;
+
+ gsModEngineInit(MNT_ENGINE(pMont), NULL, maxBitSize, poolLength, gsModArithMont());
+
+ return ippStsNoErr;
+ }
+}
+
+IppStatus cpMontSet(const Ipp32u* pModulus, cpSize len32, IppsMontState* pMont)
+{
+ IPP_BADARG_RET(len32<1, ippStsLengthErr);
+
+ /* modulus is not an odd number */
+ IPP_BADARG_RET((pModulus[0] & 1) == 0, ippStsBadModulusErr);
+ IPP_BADARG_RET(MNT_ROOM(pMont)<(int)(INTERNAL_BNU_LENGTH(len32)), ippStsOutOfRangeErr);
+
+ {
+ const int poolLen = MOD_MAXPOOL(MNT_ENGINE(pMont));
+ int modulusBitSize = cpGetBitSize((len32 - 1) << 5, pModulus[len32-1]);
+
+ gsModEngineInit(MNT_ENGINE(pMont), pModulus, modulusBitSize, poolLen, gsModArithMont());
+
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsMontGetSize
+//
+// Purpose: Specifies size of buffer in bytes.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pCtxSize==NULL
+// ippStsLengthErr maxLen32 < 1
+// maxLen32 > BITS2WORD32_SIZE(BN_MAXBITSIZE)
+// ippStsNoErr no errors
+//
+// Parameters:
+// method selected exponential method (unused parameter)
+// maxLen32 max modulus length (in Ipp32u chunks)
+// pCtxSize size of context
+//
+// Notes: Function always use method=ippBinaryMethod,
+// so this parameter is ignored
+*F*/
+IPPFUN(IppStatus, ippsMontGetSize, (IppsExpMethod method, cpSize maxLen32, cpSize* pCtxSize))
+{
+ IPP_BAD_PTR1_RET(pCtxSize);
+ IPP_BADARG_RET(maxLen32<1 || maxLen32>BITS2WORD32_SIZE(BN_MAXBITSIZE), ippStsLengthErr);
+
+ UNREFERENCED_PARAMETER(method);
+
+ {
+ return cpMontGetSize(maxLen32, MONT_DEFAULT_POOL_LENGTH, pCtxSize);
+ }
+}
+
+/*F*
+// Name: ippsMontInit
+//
+// Purpose: Initializes the symbolic data structure and partitions the
+// specified buffer space.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMont==NULL
+// ippStsLengthErr maxLen32 < 1
+// maxLen32 > BITS2WORD32_SIZE(BN_MAXBITSIZE)
+// ippStsNoErr no errors
+//
+// Parameters:
+// method selected exponential method (unused parameter)
+// maxLen32 max modulus length (in Ipp32u chunks)
+// pMont pointer to Montgomery context
+*F*/
+IPPFUN(IppStatus, ippsMontInit,(IppsExpMethod method, int maxLen32, IppsMontState* pMont))
+{
+ IPP_BADARG_RET(maxLen32<1 || maxLen32>BITS2WORD32_SIZE(BN_MAXBITSIZE), ippStsLengthErr);
+
+ IPP_BAD_PTR1_RET(pMont);
+
+ UNREFERENCED_PARAMETER(method);
+
+ {
+ return cpMontInit(maxLen32, MONT_DEFAULT_POOL_LENGTH, pMont);
+ }
+}
+
+void cpPackMontCtx(const IppsMontState* pCtx, Ipp8u* pBuffer)
+{
+ IppsMontState* pAlignedBuffer = (IppsMontState*)(IPP_ALIGNED_PTR((pBuffer), MONT_ALIGNMENT));
+
+ /* size of context (bytes) */
+ int ctxSize = sizeof(IppsMontState);
+ CopyBlock(pCtx, pAlignedBuffer, ctxSize);
+
+ pBuffer = (Ipp8u*)pAlignedBuffer + sizeof(IppsMontState);
+
+ gsPackModEngineCtx(MNT_ENGINE(pCtx), pBuffer);
+}
+
+void cpUnpackMontCtx(const Ipp8u* pBuffer, IppsMontState* pCtx)
+{
+ IppsMontState* pAlignedBuffer = (IppsMontState*)(IPP_ALIGNED_PTR((pBuffer), MONT_ALIGNMENT));
+
+ /* size of context (bytes) */
+ int ctxSize = sizeof(IppsMontState);
+ CopyBlock(pAlignedBuffer, pCtx, ctxSize);
+
+ pBuffer = (Ipp8u*)pAlignedBuffer + sizeof(IppsMontState);
+
+ gsUnpackModEngineCtx(pBuffer, MNT_ENGINE(pCtx));
+}
+
+
+/*F*
+// Name: ippsMontSet
+//
+// Purpose: Setup modulus value
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMont==NULL
+// pModulus==NULL
+// ippStsContextMatchErr !MNT_VALID_ID()
+// ippStsLengthErr len32<1
+// ippStsNoErr no errors
+//
+// Parameters:
+// pModulus pointer to the modulus buffer
+// len32 length of the modulus (in Ipp32u chunks).
+// pMont pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsMontSet,(const Ipp32u* pModulus, cpSize len32, IppsMontState* pMont))
+{
+ IPP_BAD_PTR2_RET(pModulus, pMont);
+ pMont = (IppsMontState*)(IPP_ALIGNED_PTR((pMont), MONT_ALIGNMENT));
+ IPP_BADARG_RET(!MNT_VALID_ID(pMont), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(len32<1, ippStsLengthErr);
+
+ /* modulus is not an odd number */
+ IPP_BADARG_RET((pModulus[0] & 1) == 0, ippStsBadModulusErr);
+ IPP_BADARG_RET(((Ipp32u)MNT_ROOM(pMont) < INTERNAL_BNU_LENGTH(len32)), ippStsOutOfRangeErr);
+
+ {
+ return cpMontSet(pModulus, len32, pMont);
+ }
+}
+
+/*F*
+// Name: ippsMontGet
+//
+// Purpose: Extracts modulus.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMont==NULL
+// pModulus==NULL
+// pLen32==NULL
+// ippStsContextMatchErr !MNT_VALID_ID()
+// ippStsNoErr no errors
+//
+// Parameters:
+// pModulus pointer to the modulus buffer
+// pLen32 pointer to the modulus length (in Ipp32u chunks).
+// pMont pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsMontGet,(Ipp32u* pModulus, cpSize* pLen32, const IppsMontState* pMont))
+{
+ IPP_BAD_PTR3_RET(pMont, pModulus, pLen32);
+
+ pMont = (IppsMontState*)(IPP_ALIGNED_PTR((pMont), MONT_ALIGNMENT));
+ IPP_BADARG_RET(!MNT_VALID_ID(pMont), ippStsContextMatchErr);
+
+ {
+ cpSize len32 = MOD_LEN(MNT_ENGINE(pMont))*sizeof(BNU_CHUNK_T)/sizeof(Ipp32u);
+ Ipp32u* bnData = (Ipp32u*) MOD_MODULUS( MNT_ENGINE(pMont) );
+
+ FIX_BNU(bnData, len32);
+ COPY_BNU(pModulus, bnData, len32);
+ *pLen32 = len32;
+
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsMontForm
+//
+// Purpose: Converts input into Montgomery domain.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMont==NULL
+// pA==NULL
+// pR==NULL
+// ippStsContextMatchErr !MNT_VALID_ID()
+// !BN_VALID_ID(pA)
+// !BN_VALID_ID(pR)
+// ippStsBadArgErr A < 0.
+// ippStsScaleRangeErr A >= Modulus.
+// ippStsOutOfRangeErr R can't hold result
+// ippStsNoErr no errors
+//
+// Parameters:
+// pA pointer to the input [0, modulus-1]
+// pMont Montgomery context
+// pR pointer to the output (A*R mod modulus)
+*F*/
+IPPFUN(IppStatus, ippsMontForm,(const IppsBigNumState* pA, IppsMontState* pMont, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR3_RET(pMont, pA, pR);
+
+ pMont = (IppsMontState*)(IPP_ALIGNED_PTR((pMont), MONT_ALIGNMENT));
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+
+ IPP_BADARG_RET(!MNT_VALID_ID(pMont), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_SIGN(pA) != ippBigNumPOS, ippStsBadArgErr);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), MOD_MODULUS( MNT_ENGINE(pMont) ), MOD_LEN( MNT_ENGINE(pMont) )) >= 0, ippStsScaleRangeErr);
+ IPP_BADARG_RET(BN_ROOM(pR) < MOD_LEN( MNT_ENGINE(pMont) ), ippStsOutOfRangeErr);
+
+ {
+ const int usedPoolLen = 1;
+ cpSize nsM = MOD_LEN( MNT_ENGINE(pMont) );
+ BNU_CHUNK_T* pDataA = gsModPoolAlloc(MNT_ENGINE(pMont), usedPoolLen);
+ //gres: temporary excluded: assert(NULL!=pDataA);
+
+ ZEXPAND_COPY_BNU(pDataA, nsM, BN_NUMBER(pA), BN_SIZE(pA));
+
+ MOD_METHOD( MNT_ENGINE(pMont) )->encode(BN_NUMBER(pR), pDataA, MNT_ENGINE(pMont));
+
+ FIX_BNU(BN_NUMBER(pR), nsM);
+ BN_SIZE(pR) = nsM;
+ BN_SIGN(pR) = ippBigNumPOS;
+
+ gsModPoolFree(MNT_ENGINE(pMont), usedPoolLen);
+ }
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsMontMul
+//
+// Purpose: Computes Montgomery modular multiplication for positive big
+// number integers of Montgomery form. The following pseudocode
+// represents this function:
+// r <- ( a * b * R^(-1) ) mod m
+//
+// Returns: Reason:
+// ippStsNoErr Returns no error.
+// ippStsNullPtrErr Returns an error when pointers are null.
+// ippStsBadArgErr Returns an error when a or b is a negative integer.
+// ippStsScaleRangeErr Returns an error when a or b is more than m.
+// ippStsOutOfRangeErr Returns an error when IppsBigNumState *r is larger than
+// IppsMontState *m.
+// ippStsContextMatchErr Returns an error when the context parameter does
+// not match the operation.
+//
+// Parameters:
+// a Multiplicand within the range [0, m - 1].
+// b Multiplier within the range [0, m - 1].
+// m Modulus.
+// r Montgomery multiplication result.
+//
+// Notes: The size of IppsBigNumState *r should not be less than the data
+// length of the modulus m.
+*F*/
+IPPFUN(IppStatus, ippsMontMul, (const IppsBigNumState* pA, const IppsBigNumState* pB, IppsMontState* pMont, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR4_RET(pA, pB, pMont, pR);
+
+ pMont = (IppsMontState*)(IPP_ALIGNED_PTR((pMont), MONT_ALIGNMENT));
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, BN_ALIGNMENT) );
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+
+ IPP_BADARG_RET(!MNT_VALID_ID(pMont), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_NEGATIVE(pA) || BN_NEGATIVE(pB), ippStsBadArgErr);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), MOD_MODULUS( MNT_ENGINE(pMont) ), MOD_LEN( MNT_ENGINE(pMont) )) >= 0, ippStsScaleRangeErr);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pB), BN_SIZE(pB), MOD_MODULUS( MNT_ENGINE(pMont) ), MOD_LEN( MNT_ENGINE(pMont) )) >= 0, ippStsScaleRangeErr);
+ IPP_BADARG_RET(BN_ROOM(pR) < MOD_LEN( MNT_ENGINE(pMont) ), ippStsOutOfRangeErr);
+
+ {
+ const int usedPoolLen = 2;
+ cpSize nsM = MOD_LEN( MNT_ENGINE(pMont) );
+ BNU_CHUNK_T* pDataR = BN_NUMBER(pR);
+ BNU_CHUNK_T* pDataA = gsModPoolAlloc(MNT_ENGINE(pMont), usedPoolLen);
+ BNU_CHUNK_T* pDataB = pDataA + nsM;
+ //gres: temporary excluded: assert(NULL!=pDataA);
+
+ ZEXPAND_COPY_BNU(pDataA, nsM, BN_NUMBER(pA), BN_SIZE(pA));
+ ZEXPAND_COPY_BNU(pDataB, nsM, BN_NUMBER(pB), BN_SIZE(pB));
+
+ MOD_METHOD( MNT_ENGINE(pMont) )->mul(pDataR, pDataA, pDataB, MNT_ENGINE(pMont));
+
+ gsModPoolFree(MNT_ENGINE(pMont), usedPoolLen);
+
+ FIX_BNU(pDataR, nsM);
+ BN_SIZE(pR) = nsM;
+ BN_SIGN(pR) = ippBigNumPOS;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*******************************************************************************
+// Name: ippsMontExp
+// Description: ippsMontExp() computes the Montgomery exponentiation with exponent
+// IppsBigNumState *e to the given big number integer of Montgomery form
+// IppsBigNumState *a with respect to the modulus IppsMontState *m.
+// Input Arguments: a - big number integer of Montgomery form within the
+// range [0,m-1]
+// e - big number exponent
+// m - Montgomery modulus of IppsMontState.
+// Output Arguments: r - the Montgomery exponentiation result.
+// Returns: IPPC_STATUS_OK - No Error
+// IPPC_STATUS_MONT_BAD_MODULUS - If a>m or b>m or m>R or P_MONT *m has
+// not been initialized by the primitive
+// function ippsMontInit( ).
+// IPPC_STATUS_BAD_ARG - Bad Arguments
+// Notes: IppsBigNumState *r should possess enough memory space as to hold the result
+// of the operation. i.e. both pointers r->d and r->buffer should possess
+// no less than (m->n->length) number of 32-bit words.
+*******************************************************************************/
+IPPFUN(IppStatus, ippsMontExp, (const IppsBigNumState* pA, const IppsBigNumState* pE, IppsMontState* pMont, IppsBigNumState* pR))
+{
+ IPP_BAD_PTR4_RET(pA, pE, pMont, pR);
+
+ pMont = (IppsMontState*)(IPP_ALIGNED_PTR((pMont), MONT_ALIGNMENT));
+ pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, BN_ALIGNMENT) );
+ pE = (IppsBigNumState*)( IPP_ALIGNED_PTR(pE, BN_ALIGNMENT) );
+ pR = (IppsBigNumState*)( IPP_ALIGNED_PTR(pR, BN_ALIGNMENT) );
+
+ IPP_BADARG_RET(!MNT_VALID_ID(pMont), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pE), ippStsContextMatchErr);
+ IPP_BADARG_RET(!BN_VALID_ID(pR), ippStsContextMatchErr);
+
+ IPP_BADARG_RET(BN_ROOM(pR) < MOD_LEN( MNT_ENGINE(pMont) ), ippStsOutOfRangeErr);
+ /* check a */
+ IPP_BADARG_RET(BN_NEGATIVE(pA), ippStsBadArgErr);
+ IPP_BADARG_RET(cpCmp_BNU(BN_NUMBER(pA), BN_SIZE(pA), MOD_MODULUS( MNT_ENGINE(pMont) ), MOD_LEN( MNT_ENGINE(pMont) )) >= 0, ippStsScaleRangeErr);
+ /* check e */
+ IPP_BADARG_RET(BN_NEGATIVE(pE), ippStsBadArgErr);
+
+ cpMontExpBin_BN(pR, pA, pE, MNT_ENGINE( pMont) );
+
+ return ippStsNoErr;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpmontred.c b/ext/ipp/sources/ippcp/src/pcpmontred.c
new file mode 100644
index 0000000..c1fb05a
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmontred.c
@@ -0,0 +1,75 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+*/
+
+#include "owncp.h"
+#include "pcpbnuarith.h"
+
+
+#if defined(_USE_C_cpMontRedAdc_BNU_)
+#pragma message ("C version of cpMontRedAdc_BNU: ON")
+#else
+//#pragma message ("C version of cpMontRedAdc_BNU: OFF")
+#endif
+
+#if !((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7) || \
+ (_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP>=_IPP_G9) || \
+ (_IPP==_IPP_S8) || \
+ (_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E>=_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8)) || \
+ defined(_USE_C_cpMontRedAdc_BNU_)
+#define cpMontRedAdc_BNU OWNAPI(cpMontRedAdc_BNU)
+void cpMontRedAdc_BNU(BNU_CHUNK_T* pR,
+ BNU_CHUNK_T* pProduct,
+ const BNU_CHUNK_T* pModulus, cpSize nsM, BNU_CHUNK_T m0)
+{
+ BNU_CHUNK_T carry;
+ BNU_CHUNK_T extension;
+
+ cpSize n;
+ for(n=0, carry = 0; n<(nsM-1); n++) {
+ BNU_CHUNK_T u = pProduct[n]*m0;
+ BNU_CHUNK_T t = pProduct[nsM +n +1] + carry;
+
+ extension = cpAddMulDgt_BNU(pProduct+n, pModulus, nsM, u);
+ ADD_AB(carry, pProduct[nsM+n], pProduct[nsM+n], extension);
+ t += carry;
+
+ carry = t<pProduct[nsM+n+1];
+ pProduct[nsM+n+1] = t;
+ }
+
+ m0 *= pProduct[nsM-1];
+ extension = cpAddMulDgt_BNU(pProduct+nsM-1, pModulus, nsM, m0);
+ ADD_AB(extension, pProduct[2*nsM-1], pProduct[2*nsM-1], extension);
+
+ carry |= extension;
+ carry -= cpSub_BNU(pR, pProduct+nsM, pModulus, nsM);
+ /* condition copy: R = carry? Product+mSize : R */
+ MASKED_COPY_BNU(pR, carry, pProduct+nsM, pR, nsM);
+}
+#endif
diff --git a/ext/ipp/sources/ippcp/src/pcpmontred.h b/ext/ipp/sources/ippcp/src/pcpmontred.h
new file mode 100644
index 0000000..21d1057
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmontred.h
@@ -0,0 +1,56 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+*/
+#if !defined(_CP_MONTRED_H)
+#define _CP_MONTRED_H
+
+#include "owndefs.h"
+#include "owncp.h"
+
+#include "pcpbnuimpl.h"
+/*
+// Montgomery reduction
+*/
+#define cpMontRedAdc_BNU OWNAPI(cpMontRedAdc_BNU)
+void cpMontRedAdc_BNU(BNU_CHUNK_T* pR,
+ BNU_CHUNK_T* pProduct,
+ const BNU_CHUNK_T* pModulus, cpSize nsM, BNU_CHUNK_T m0);
+
+#define cpMontRedAdx_BNU OWNAPI(cpMontRedAdx_BNU)
+void cpMontRedAdx_BNU(BNU_CHUNK_T* pR,
+ BNU_CHUNK_T* pProduct,
+ const BNU_CHUNK_T* pModulus, cpSize nsM, BNU_CHUNK_T m0);
+
+__INLINE void cpMontRed_BNU_opt(BNU_CHUNK_T* pR,
+ BNU_CHUNK_T* pProduct,
+ const BNU_CHUNK_T* pModulus, cpSize nsM, BNU_CHUNK_T m0)
+{
+#if(_ADCOX_NI_ENABLING_==_FEATURE_ON_)
+ cpMontRedAdx_BNU(pR, pProduct, pModulus, nsM, m0);
+#elif(_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ IsFeatureEnabled(ADCOX_ENABLED)? cpMontRedAdx_BNU(pR, pProduct, pModulus, nsM, m0)
+ : cpMontRedAdc_BNU(pR, pProduct, pModulus, nsM, m0);
+#else
+ cpMontRedAdc_BNU(pR, pProduct, pModulus, nsM, m0);
+#endif
+}
+
+#endif /* _CP_MONTRED_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpmulbnukara.h b/ext/ipp/sources/ippcp/src/pcpmulbnukara.h
new file mode 100644
index 0000000..9e8c377
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpmulbnukara.h
@@ -0,0 +1,87 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// BN Multiplication (Karatsuba method) Definitions & Function Prototypes
+//
+// Contents:
+// cpKaratsubaBufferSize()
+// cpMul_BNU_karatuba()
+// cpSqr_BNU_karatuba()
+// cpKAdd_BNU()
+// cpKSub_BNU()
+//
+//
+*/
+
+#if !defined(_KARATSUBA_MUL_)
+#define _KARATSUBA_MUL_
+
+#if defined(_USE_KARATSUBA_)
+
+#if((_IPP==_IPP_W7) || \
+ (_IPP==_IPP_T7))
+ #define CP_KARATSUBA_MUL_THRESHOLD 16
+ #define CP_KARATSUBA_SQR_THRESHOLD 32
+#elif ((_IPP==_IPP_V8) || \
+ (_IPP==_IPP_P8) || \
+ (_IPP==_IPP_G9) || \
+ (_IPP==_IPP_S8))
+ #define CP_KARATSUBA_MUL_THRESHOLD 32
+ #define CP_KARATSUBA_SQR_THRESHOLD 32
+#elif ((_IPP>=_IPP_H9))
+ #define CP_KARATSUBA_MUL_THRESHOLD 32
+ #define CP_KARATSUBA_SQR_THRESHOLD 32
+
+#elif ((_IPP32E==_IPP32E_M7) || \
+ (_IPP32E==_IPP32E_U8) || \
+ (_IPP32E==_IPP32E_Y8) || \
+ (_IPP32E==_IPP32E_E9) || \
+ (_IPP32E==_IPP32E_N8))
+ #define CP_KARATSUBA_MUL_THRESHOLD 16
+ #define CP_KARATSUBA_SQR_THRESHOLD 40
+#elif ((_IPP32E>=_IPP32E_L9))
+ #define CP_KARATSUBA_MUL_THRESHOLD 20
+ #define CP_KARATSUBA_SQR_THRESHOLD 48
+
+#else
+ #define CP_KARATSUBA_MUL_THRESHOLD 12
+ #define CP_KARATSUBA_SQR_THRESHOLD 16
+#endif
+
+
+#define cpKaratsubaBufferSize OWNAPI(cpKaratsubaBufferSize)
+cpSize cpKaratsubaBufferSize(cpSize len);
+
+#define cpMul_BNU_karatsuba OWNAPI(cpMul_BNU_karatsuba)
+BNU_CHUNK_T cpMul_BNU_karatsuba(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY, cpSize ns,
+ BNU_CHUNK_T* pBuffer);
+#define cpSqr_BNU_karatsuba OWNAPI(cpSqr_BNU_karatsuba)
+BNU_CHUNK_T cpSqr_BNU_karatsuba(BNU_CHUNK_T* pR,
+ const BNU_CHUNK_T* pX, cpSize ns,
+ BNU_CHUNK_T* pBuffer);
+
+
+#else
+ #define CP_KARATSUBA_MUL_THRESHOLD 0
+ #define CP_KARATSUBA_SQR_THRESHOLD 0
+#endif /* _USE_KARATSUBA_ */
+
+#endif /* _KARATSUBA_MUL_ */
diff --git a/ext/ipp/sources/ippcp/src/pcpp192r1precomca.c b/ext/ipp/sources/ippcp/src/pcpp192r1precomca.c
new file mode 100644
index 0000000..da89e32
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpp192r1precomca.c
@@ -0,0 +1,1936 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (P192r1 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (192)
+#define LEN_P192 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* P192 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P192];
+ BNU_CHUNK_T Y[LEN_P192];
+} P192_POINT_AFFINE;
+
+extern const __ALIGN64 P192_POINT_AFFINE ec_p192r1_precomputed[28][64];
+
+
+#if defined ( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_192R1_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+const __ALIGN64 P192_POINT_AFFINE ec_p192r1_precomputed[28][64] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0x332fa108,0x0d8cb30c),LL(0x76d12909,0x8a4bd3f7),LL(0xf3d218f7,0x954cc8f9), LL(0x1e422289,0x7b12a337),LL(0x8966f05e,0xde22b524),LL(0x6aeda84d,0x6a293d83),
+ LL(0x91fae7b3,0x04a5cf09),LL(0xa7838baa,0xd7fb036c),LL(0x3e00e321,0xae53f3bb), LL(0xf5bc34a6,0x369ef507),LL(0x09d7bb36,0x7d5170c4),LL(0xad59278a,0x241e55c9),
+ LL(0x230c0249,0x56b3fd7f),LL(0x42bebbf4,0x3386809f),LL(0x770c581a,0x53b5ad45), LL(0x7fb74b1e,0x6be17b49),LL(0x50d91fbd,0x16445c48),LL(0x43dc19c0,0x228f18e2),
+ LL(0x9a01a832,0xda417f6b),LL(0xd148d209,0x8a42d66e),LL(0x60c3ed50,0xe544900a), LL(0x0fc71a62,0xc79d34b6),LL(0x8733ef53,0xe640e166),LL(0x69803121,0xc1084635),
+ LL(0x1d8490a8,0x69bca784),LL(0x4d92a6ad,0xa7c43520),LL(0x7012b11d,0x4ec31c34), LL(0x843e401c,0x6261825c),LL(0x6a65a2da,0x102b7a93),LL(0x2d96f43a,0xdf00083f),
+ LL(0xd6f1d9ee,0xae494b37),LL(0x81585220,0x4708a709),LL(0xed8612f6,0x3c3a183d), LL(0xda5571cc,0x8d3ab905),LL(0xf6131ada,0x8c11bd0f),LL(0xe556b1ea,0x83f240b8),
+ LL(0xe5efca73,0xeb8ad91f),LL(0x1650b841,0x4c83fc44),LL(0xa63ebb45,0xeea07d43), LL(0xcc6ab309,0x2c8262c8),LL(0xca1e7327,0x44a67081),LL(0x66147372,0x6fef6d88),
+ LL(0x5264d6fe,0x7afb70b5),LL(0x1e79609b,0x8f728a49),LL(0xeae172bd,0x441912c0), LL(0x8ec468d4,0x96163a6d),LL(0x07b3dc14,0xbd51c5c7),LL(0x707ae554,0xca743b38),
+ LL(0x449ce446,0x9f27848b),LL(0xed6f60e4,0xedc613b6),LL(0x33ef2855,0xd028dc5c), LL(0x97566f06,0x32bbfe7f),LL(0x529bebe5,0xaee52dfc),LL(0xdbd304ac,0x7dfad9da),
+ LL(0xcb9cdc1c,0x301800ef),LL(0xa4c0645f,0x01c6df1b),LL(0xd2c1c6da,0x7c2b2dca), LL(0x91015dd9,0x92fe0217),LL(0x43f5e36d,0x94ec3870),LL(0xfae24bbd,0x3400d9bd),
+ LL(0xf19ed4f9,0x44a299cc),LL(0x3ec18b4b,0x5ce790e3),LL(0x3898e8a1,0x34de50ac), LL(0x52948777,0xa2641e2f),LL(0x538eff35,0xa5037393),LL(0x38e46331,0xf1b6bb32),
+ LL(0xa53425b9,0xa02e1119),LL(0x9dfe0d6b,0x6a2f4991),LL(0x360f54c1,0xda626cb7), LL(0x39cdd976,0xc224f8ac),LL(0x21725fbe,0x5b23f190),LL(0x164b3680,0xf305458e),
+ LL(0x0f8904a9,0x153f3b78),LL(0x14a75349,0x44a7bd96),LL(0xd85d4a3f,0x4093735f), LL(0x3f7db015,0xed1d5ed0),LL(0x1fff90b3,0x174975f7),LL(0xdcd47496,0x9838d562),
+ LL(0x24fc4afc,0xf299b94a),LL(0x1cc29901,0x4bb0fffe),LL(0x3eb21741,0x6cd077ba), LL(0x95c82991,0x6e97b4f9),LL(0x8209cb7d,0x848b6921),LL(0xa082e4c9,0x34d09e8b),
+ LL(0xb0cf681b,0xc373e084),LL(0x6610b602,0x7da92737),LL(0xf098041b,0x46cadc98), LL(0x6cdec872,0xd3e0adf8),LL(0xa7842f28,0x50d43591),LL(0xcdf46778,0xa35efdc3),
+ LL(0x7944ad9c,0x90c57eb8),LL(0x1e7a0999,0xb9c5cf4b),LL(0xee3159ba,0xe0315bd7), LL(0x06a19eaf,0x17e47405),LL(0x4be877f9,0x5abccc61),LL(0x22195568,0x427706fb),
+ LL(0xe7056d4e,0xcfdba265),LL(0xa9b98e89,0xc9d1189c),LL(0xa4a88eff,0x3e1cd309), LL(0xd040ec58,0x8b2429c3),LL(0x7859d5e6,0x6967afd6),LL(0xa5fbf616,0xcdf1095b),
+ LL(0xfe4697b7,0x78060e67),LL(0x2648e5f8,0x1ed0242c),LL(0x4f235455,0x687ef0c6), LL(0x80964fe2,0x95a99ec5),LL(0xa71449df,0xe59296c6),LL(0xe31fca8c,0x6e0faa87),
+ LL(0x417692ee,0x37b23549),LL(0x7a4db977,0x3fafb8db),LL(0x5d550c5c,0xc85fef61), LL(0xc591dfcc,0x88f70525),LL(0xadbba7d1,0x20d82c9e),LL(0x3bc105c7,0x34bdc150),
+ LL(0x312e2b25,0xa96781ce),LL(0xc28a98fb,0x21d19734),LL(0xb32fbb94,0x33d91d89), LL(0xf1a39faa,0x4b423b1e),LL(0xd6d73b09,0xd6b91a11),LL(0x5cf7ee7b,0x1d5bbc7d),
+ LL(0xc7b622a0,0x09a14d89),LL(0x04ac07cd,0x719fb611),LL(0x485b1f75,0x487f1ad3), LL(0xf779459c,0x6604b185),LL(0x79ffa446,0x633d924a),LL(0xe2ed4e42,0x0a48ac49),
+ LL(0x97a2ac99,0x8f8141df),LL(0x559a156a,0x2f85aea4),LL(0x0de172c5,0x045569d1), LL(0x70195a60,0xd31e98ed),LL(0x31901571,0x639f8252),LL(0x017861e5,0xddfb3017),
+ LL(0x8d76bd59,0x791db75f),LL(0xa5c667f8,0x664088fb),LL(0x5a1f032a,0x7cc0335c), LL(0xbf031b03,0xabb460b3),LL(0xc8f559b0,0xcb61b85e),LL(0xfed307dc,0x282335ba),
+ LL(0xe9b47661,0x398b31e5),LL(0x4785fbe8,0x17a770ad),LL(0x2bf4567e,0xdb5e0ce3), LL(0xc82fa654,0xd8db9c86),LL(0x1b760f9c,0xdc7dbdfc),LL(0x65df38f7,0x7dc26c5a),
+ LL(0xbfd973a2,0x422b5a19),LL(0x7de885a1,0xe637c08a),LL(0x28af843c,0x493d27a7), LL(0x27d0f709,0x0635af16),LL(0xa46b8241,0xfaa0731d),LL(0xde8513de,0x30152936),
+ LL(0xc2c6a98b,0xe5b1f5c5),LL(0xdd1f1a85,0x9999e0ab),LL(0xf09f0de9,0x0f017d6e), LL(0xffad11c5,0x2cd84536),LL(0x97ac8fd1,0xc150b469),LL(0xf4a156d0,0x7275b4b6),
+ LL(0xdea3626f,0xeaa0614e),LL(0x51b201c7,0xb0778899),LL(0xbc24cf40,0xe1e17ccf), LL(0x6f6a4f09,0x5b9a2356),LL(0x81b35be5,0x6b43dd89),LL(0x8eb6864b,0x7134a900),
+ LL(0x6256a868,0x1fbfbc8d),LL(0x3b84fa71,0xc3c97795),LL(0x75676360,0xaf1330f2), LL(0x5ab6bd0c,0xaa33c244),LL(0xbd5e407e,0xece4da7e),LL(0x2f438421,0x8e4be95e),
+ LL(0x267c3b3b,0xb550886c),LL(0x072ada2a,0xe4ef0b6a),LL(0x16cf9337,0xefb23bc9), LL(0x035d6cdd,0xf4945a35),LL(0x24d8682c,0x7c2fbc75),LL(0xb35b5932,0xb4b6f148),
+ LL(0x1704593e,0x5ea32695),LL(0x487113d8,0xcb897688),LL(0x48e6fb62,0x9a382e50), LL(0x59da6a81,0x845eeeee),LL(0x72ab659e,0x427e258f),LL(0x0186211c,0x8d145e39),
+ LL(0xc1a83d71,0xa5549752),LL(0x07c519da,0xe9b2c58f),LL(0x286a27e2,0x6f5e6aee), LL(0x7cfc6dd4,0x99cece8d),LL(0xbbc24c84,0x18c9b5f7),LL(0xd5a88338,0x7e5875ca),
+ LL(0xde0dd9bb,0x655f1b75),LL(0x2ef38753,0x19df3f60),LL(0xeceb06b1,0x7a25bb17), LL(0xce909ba8,0x1359f3db),LL(0x65603d61,0xaa2802b7),LL(0xe147b10c,0xf7070a53),
+ LL(0x4fbffaeb,0x41095e96),LL(0x8b3c6012,0x422337e2),LL(0x563eef5d,0xb731e12b), LL(0xc07cc789,0x7e950bdd),LL(0x9d9cc3aa,0xf97c2753),LL(0x5a7f7345,0x7af21a9a),
+ LL(0xe3a0c0e2,0x7e91f2d6),LL(0x54a1cd29,0xa286afb7),LL(0xa6160c29,0x8c0ddde8), LL(0x8c5398c8,0xb03e8586),LL(0xfe6503e1,0x4db7075d),LL(0x7ec6bed6,0x999eec3e),
+ LL(0x16036842,0xb35bcfb0),LL(0xecedc764,0x036d725d),LL(0x2c6f8668,0xcbcb0161), LL(0x1b04bc1a,0x0348f719),LL(0xe1e99a42,0x0b2d84f8),LL(0x9c1ec6e6,0xf098e97a),
+ LL(0x3f5a8497,0x17f2106b),LL(0xf56d582b,0xc4c8ac85),LL(0x514207b2,0xde518ab8), LL(0x2e30b7c4,0x33018834),LL(0x643786e1,0xf867de48),LL(0x735735ab,0x72d64984),
+ LL(0x2775c0c5,0x9d83fd01),LL(0x065da96c,0x8658cc5a),LL(0x604210f1,0x466cf509), LL(0xe8fc750b,0xdc4d8237),LL(0x1477a111,0xb13663ff),LL(0x4252c38b,0x6a0ef58f),
+ LL(0xe5bcf759,0x717f1389),LL(0xa8ecb8d4,0x2146493b),LL(0x3e3c9d15,0xd51427c9), LL(0x77c1c32f,0x7ec8afc4),LL(0xf63856de,0xfa0a577e),LL(0x32750be7,0x95a6c860),
+ LL(0xcaa33960,0x49b1bb22),LL(0xe647c5a4,0x45871855),LL(0x167d6801,0x6d71e970), LL(0xa2764f1f,0xbbeae386),LL(0x1284c39a,0xc7df73b8),LL(0xe8a8b423,0x3ddc63be),
+ LL(0x6c2484c5,0x4cf0be08),LL(0xbff601e9,0x59028533),LL(0xcc241c87,0x94453c36), LL(0x0b18c6d5,0xb6e2065d),LL(0xfb4927d4,0xafde2953),LL(0x51875c38,0x69d1f3bc),
+ LL(0x6709fe0c,0xc4bdbeb2),LL(0x2aa46589,0x86c2f225),LL(0x1c6d96c6,0x6e215f98), LL(0x1900c952,0x3b102255),LL(0x0b476bea,0x09b6f447),LL(0x1643c833,0x88877356),
+ LL(0xe1f4c47f,0x897e15e4),LL(0x3deb58b0,0x9055b4df),LL(0x5d73f210,0xb189fd7b), LL(0x344e98cb,0xabbc3bfa),LL(0x17fe8809,0x355345a8),LL(0xb8a63413,0x848ea408),
+ LL(0x0ee8588b,0x111d94b7),LL(0x1cae2230,0x5f7ba2ed),LL(0x8b428b68,0xd1119eb2), LL(0xc5901d8a,0x5ac72be9),LL(0x1a7e213d,0xd11c39be),LL(0xae1574db,0x5eba5216),
+ LL(0x78e7a47d,0x2c6b4874),LL(0x03871f7c,0x5cbfeb97),LL(0x8dfcd4af,0xdb875c76), LL(0x6202ffc6,0x922461a3),LL(0xf1463db1,0x084e44fe),LL(0xa6b3ba89,0x55a890d4),
+ LL(0x0d359302,0xbbb38087),LL(0x3bf7212f,0xe0c552b5),LL(0xce70eda4,0x6873aa54), LL(0xf0dcd6fe,0x42eb0476),LL(0x202c6fba,0xe354ae37),LL(0xbb182481,0xd2eeb9a4),
+ LL(0xac565505,0xfb13f470),LL(0xe0d9811e,0x8e6be184),LL(0xb7fb0ea8,0xc727bd2b), LL(0x2a49df43,0xe0cc92d4),LL(0x6c43c82b,0x551ef99f),LL(0x449a2247,0x50d3acd2),
+ LL(0x8959dc53,0x2e246f36),LL(0x3f449349,0xc6882bd2),LL(0x52d56c22,0xfbcda062), LL(0x037c14b7,0xaf1525bc),LL(0xf51db774,0x79f2c364),LL(0x397c0db5,0x51d5156e),
+ LL(0x88ea2408,0x15fdfc20),LL(0xc31c09fc,0x39ad6859),LL(0xa7479cce,0x23bf58d5), LL(0x6df4616c,0x200420e7),LL(0x0bb71847,0x6516f75d),LL(0x60976e77,0x478ec1a4),
+ LL(0x2d623962,0x38f56704),LL(0xb8e018b4,0x1d5927f2),LL(0xb7159417,0x60f41495), LL(0xe71a9c08,0xa531058e),LL(0xc4427fd5,0x038edfcf),LL(0x16bcd9b9,0xf40f0c3f),
+ LL(0x4e8b0660,0x5c3875f8),LL(0xba508d58,0x4835397b),LL(0xa986f017,0x28f855c2), LL(0x947b88a2,0xab86055f),LL(0x4038096a,0xf6aab3c8),LL(0xc66df877,0x5babb42e),
+ LL(0x218251e9,0xbc40bae0),LL(0xff92ffab,0x86a6f175),LL(0x15c92a68,0xc538fbe8), LL(0xce8e05fa,0x94b037e5),LL(0x38df007b,0x1e23b8c7),LL(0x6dfc21b0,0xcf60919b),
+ LL(0xeaab0281,0x88c58a61),LL(0xfd515dfa,0xbdef49bd),LL(0x7b29a823,0xafb4049d), LL(0x51fb148d,0x803b4141),LL(0xefcde52e,0xa607366b),LL(0x756dd392,0xdc243912),
+ LL(0x07b07222,0x6c66ac7c),LL(0xabbb5a7e,0x7a2251bf),LL(0xea506766,0x6898eec1), LL(0x0c8100c3,0x8ee773e9),LL(0xb5ac1e10,0xe267812a),LL(0x45ea2616,0x51d3e17e),
+ LL(0xc5d7bcee,0xec435b31),LL(0x692565f6,0x45068195),LL(0xee8a64da,0xabbe69a5), LL(0xf3259fd4,0x10b23048),LL(0x6cf98be2,0x0df0afcf),LL(0xce0764fa,0xf317669c),
+ LL(0xab0c2496,0xe0cad6d0),LL(0x3e58a13e,0xad9d4a4b),LL(0xcb2f20c6,0xb4009b9f), LL(0xfbd04c92,0xf586adaa),LL(0x65e4a2c2,0x27f06af1),LL(0xe6ac820a,0x5efc658f),
+ LL(0x24c1a379,0x14a80bf6),LL(0xab134b06,0x0879a1fe),LL(0xe46fa8bc,0x6425c07b), LL(0xf328660c,0x626b781e),LL(0xa6f4006e,0x32c537fd),LL(0xa5cee8a3,0x3de55b30),
+ LL(0x45111281,0xd072005c),LL(0xc6dd923a,0xc38687f7),LL(0xe7e55c30,0xc5493c3b), LL(0x1e7bcaf3,0xc801a0dd),LL(0x66af003d,0x7d896378),LL(0x5c5fc040,0x88c92d2e),
+ LL(0xb5ac249b,0xd7ac3494),LL(0xd031be50,0x646f3e8c),LL(0x925d3ebe,0x6a6d2984), LL(0x0e7ed329,0x4696646d),LL(0x1822a37a,0xe4167a29),LL(0x3f6245b2,0x9419d1d2),
+ LL(0x489578d4,0x752de436),LL(0x6c0f251c,0x0ade8b1c),LL(0x59ad5609,0x29b34ffc), LL(0x857c870b,0xd4af9bf6),LL(0xe6b0527e,0xb779fab3),LL(0x70ef261f,0x20970dfe),
+ LL(0x392b4efc,0x2bcf9ad9),LL(0x8a796449,0x24ce4be0),LL(0xdc2b03ad,0x099a3cad), LL(0x223fe0fc,0x35749d6b),LL(0x8c2e618e,0xe9a66616),LL(0x3910e994,0xc7df5779),
+ LL(0x14729183,0x4af80891),LL(0x2650cc8e,0x44458190),LL(0x587ad69a,0x738c0bd4), LL(0xefc4b5e7,0xdab8713a),LL(0x902363c0,0x7d6d6ae3),LL(0x45acff6b,0xad593898),
+ LL(0xedc9ecd6,0x4c3723e7),LL(0x9731c5bf,0xc8fa6afb),LL(0xcc9bf5cb,0x162d7a77), LL(0xd28f51e8,0x623c7ce2),LL(0x45d36aad,0xb68fedf5),LL(0x2e95d0ea,0xc840c399),
+ LL(0xa5542c7d,0xcc1674d5),LL(0x1fb770dd,0xc8ebdbdd),LL(0x0a3b16ce,0x7d70a1ed), LL(0x685db534,0xa74f8148),LL(0x37c0b157,0xa0eab0ad),LL(0xa3971e22,0xcd8063a7),
+ LL(0x794542c1,0x9bded711),LL(0x3360a470,0xa56154fa),LL(0x79e1003c,0xf0bdb57b), LL(0x36c1f48f,0x48e694c5),LL(0x0eb1a568,0x3b71c023),LL(0x6090a9d3,0x4f574953),
+},
+/* digit=1 base_pwr=2^7 */
+{
+ LL(0xb3da4d9d,0x9cb08eb5),LL(0x8c573da9,0x95707fee),LL(0xe85fccd9,0xa5ad07fb), LL(0x769af379,0x5d3b50b3),LL(0xb9761267,0x79e01d7e),LL(0xee770876,0xdd24ac5b),
+ LL(0x492d1c7c,0x7808129c),LL(0x6b626f03,0x97ad42c7),LL(0x5d974059,0xbf9a52c8), LL(0xeaa619c8,0xa888802d),LL(0xbbe19555,0x171450c4),LL(0xb980305f,0x173483c8),
+ LL(0xa8a831fc,0xa5fa35ab),LL(0xf7ffad71,0xe4f05b10),LL(0x3f8d1cc3,0xc1ed613b), LL(0x6c60e44a,0x9d0f2a96),LL(0xfc64d797,0x8ece4c89),LL(0x8a315b0e,0x6fbdadb4),
+ LL(0xc352becd,0x824863da),LL(0xa2c14e2f,0xd5d43090),LL(0x46bc9bb9,0x85272175), LL(0xaa9a25da,0x75eb8695),LL(0x85c7c93c,0x4a05c961),LL(0xa9043492,0xcb5861df),
+ LL(0x62da9c26,0x0a04a3c6),LL(0x6e6542fd,0x9907614b),LL(0x8e9ada48,0x39c0b3b7), LL(0xe51bb6c4,0xf7dffbcc),LL(0xe566dea8,0x0316edb7),LL(0xb0ac507f,0x8b1a59cd),
+ LL(0xd1581b68,0xbfa7fc59),LL(0xdd5c0d6d,0xdd9906b2),LL(0xfadb3203,0x50570aa0), LL(0xb207b0c6,0x026b8114),LL(0xcf4b11ff,0xf3829145),LL(0xc3abfb69,0x97eef9fe),
+ LL(0x82a8e3aa,0x3ced44cc),LL(0x8cfe1e20,0x991f72d1),LL(0xeed3e6cb,0xce242a8b), LL(0xf6a15c38,0x70905e2f),LL(0x1a2a9a53,0x0d5db763),LL(0xa414c46c,0xe60a8854),
+ LL(0xaf1c73a9,0x0b6b1174),LL(0xc0678153,0xaef24601),LL(0x63cc9eb3,0x5dac22ed), LL(0xa0f27800,0x80606754),LL(0xf3dc2a70,0xe3154503),LL(0xec01fbfa,0x6ba23ce4),
+ LL(0xdc5f2b20,0x53cf654b),LL(0x3e7d94fb,0x4203ff82),LL(0x43547670,0x1f39db20), LL(0xf6716d31,0xbf42ccca),LL(0xa8ef535f,0x7be941f0),LL(0xaaac51de,0x890245d9),
+ LL(0x2c853305,0x3aba1480),LL(0x43e3e158,0xd4554887),LL(0x135360e9,0xcbae9038), LL(0x6e23c4f0,0xe8d3054b),LL(0xe66d94c6,0x19bd813e),LL(0xafcd895d,0xf4397ee0),
+ LL(0xc23cf227,0x5526335b),LL(0x6e23ef80,0x1053b920),LL(0x06c75842,0x656efa8a), LL(0x6397c380,0x7b7d1a0a),LL(0xe8cbe845,0xfea5cd22),LL(0x47a7e673,0x620c0df1),
+ LL(0x7aaf742d,0x8d07f60f),LL(0xeda0b762,0x74469872),LL(0xe237de09,0x3f90d096), LL(0xf4d8b55e,0x679535d3),LL(0xbc04ae92,0xa463084f),LL(0xf1202dff,0x2a0d536d),
+ LL(0x3ac85f57,0x27649c81),LL(0x235fa2cf,0x8b41bf96),LL(0x9df79933,0xe866618f), LL(0xadc59139,0x6d476615),LL(0xd404e889,0x09b1345f),LL(0x0f7eb70f,0x6bd51082),
+ LL(0xdc3366d9,0x63fe2f64),LL(0x7732bce9,0xf48f309a),LL(0x6f637459,0xbcd3fb82), LL(0xa9255eaf,0x6d9b5c4b),LL(0x2e1fdd05,0x01ff5ae4),LL(0x72e33bef,0x66e45b33),
+ LL(0xe080d6b8,0x1d521fcf),LL(0x14f56cf4,0x4e5d581b),LL(0x9a50ece4,0xea6d7579), LL(0xe1c8a0af,0x2d34a6d6),LL(0x28e5f588,0xd459901c),LL(0xf52fe058,0x8d41ab2b),
+ LL(0x436cba75,0x780fd8f6),LL(0x09f798f7,0x7216f9a2),LL(0xa3720506,0x72c9e7a9), LL(0xfa919d28,0x72cbdd01),LL(0x053500b6,0x045474ba),LL(0xaf3af74d,0x6630329d),
+ LL(0x5fa22efe,0x548b87c5),LL(0x62b464fe,0xcf449871),LL(0x7637a7dc,0x1eb2ccd0), LL(0x693b51ae,0x6ae5b6b1),LL(0x0a635765,0xcd15e6cc),LL(0x32160012,0xb8139da2),
+ LL(0x88eff9b5,0xf4477fb6),LL(0x9b8264aa,0x1abe49f0),LL(0x6f59e67b,0x2ed2f447), LL(0x598889ff,0x71460c4d),LL(0x94f3f05f,0x04b1e2ed),LL(0xf04b29b7,0x9b1b5eef),
+ LL(0x0a36430d,0x2de30220),LL(0x00e9adf9,0xe1df5595),LL(0x1d56ee5c,0x4642ab6f), LL(0x321cd0e6,0x32675e76),LL(0xbd822a36,0x37eaa735),LL(0xff9b1023,0xb807c5a0),
+ LL(0xb77035f4,0xc1637964),LL(0x2e67810c,0x627deaa6),LL(0xe68721d1,0x11c73b51), LL(0xddd6a178,0x00b6c78f),LL(0x43326826,0x63414a2f),LL(0x9370cb95,0x3f3157a5),
+ LL(0x28cac9b8,0xa6f2bedb),LL(0xdb9143d1,0xa8d660f1),LL(0xff740aca,0x28161efc), LL(0x81b9607f,0x6a8c99b0),LL(0x3379b6fd,0x6f6991fb),LL(0x54b4b97f,0x3463ae20),
+ LL(0x5901b54f,0x85e79db9),LL(0x55a0c83e,0xffbd105b),LL(0xef647c2f,0x3b871868), LL(0x18cedd8a,0x5aa96847),LL(0xb6ac9ecc,0xabd9b3d6),LL(0x93bddbd9,0x707f61d7),
+ LL(0xfcf1d3f7,0xa3e82462),LL(0x0b854fa4,0x619933c3),LL(0xd12e3bed,0xdceb86e0), LL(0x5ac77287,0x8e500715),LL(0x65cf6840,0xe5cb2c78),LL(0xc874ed06,0x6a2fcd3a),
+ LL(0x75c74d72,0xa9af4af2),LL(0x7df05ffc,0x0f341f15),LL(0x31713e68,0x13bae06e), LL(0xd8e1e3c0,0xbeb2661f),LL(0x9d5b5ff4,0xffe49ef1),LL(0x61d5cae6,0x04eac206),
+ LL(0xedd6a166,0x2f4fee08),LL(0x2eb29647,0x646cc729),LL(0x4f0f6cd5,0xb5a3c6bb), LL(0x2779dead,0xd1a9c06b),LL(0x4aed0996,0x066e3452),LL(0xbdc98d70,0xcbab5149),
+ LL(0x88f89e9b,0xf4185c2e),LL(0xf9985e9e,0xc8e5dd64),LL(0xbb24492e,0xb8d5b8d3), LL(0x0fab80d7,0xad79a272),LL(0x5b3133e3,0xb766095b),LL(0x8b2b7fda,0xc83eaf38),
+ LL(0x4448648e,0xedc5a97c),LL(0x6ae43bdd,0x2658d407),LL(0x48a8e439,0x766de9f3), LL(0x127fb314,0xca58b583),LL(0xb49667b5,0x65246221),LL(0x99398ac5,0x5b180e85),
+ LL(0xcdf0d01f,0x75910da1),LL(0xae61cd5f,0xb0fbade7),LL(0x17e45ebd,0x0e94c843), LL(0x72944c2a,0xe13b1cad),LL(0xa8546c01,0x80e5d5cc),LL(0xd98df1d8,0x8cb5077e),
+ LL(0x8e8cdd4c,0xc73d42b7),LL(0xf107a930,0x3a4ade51),LL(0x0da1e241,0x775acdae), LL(0xe97e3d45,0x1919504b),LL(0xb09e94e4,0x15d0774a),LL(0x4d58aaf7,0x3bd3c7f9),
+ LL(0x7998dd8f,0x07eb2872),LL(0x2cf2179a,0xe9813bff),LL(0x06921a45,0xfa9171da), LL(0xcf58180f,0xb8c04797),LL(0x8721e9b4,0x31db6313),LL(0x91b2c60c,0x381c63f7),
+ LL(0x66013a01,0x11b0d72b),LL(0x6c92f9e0,0xaf00d7aa),LL(0x47dcc4fb,0x2a4a91be), LL(0x0fa92641,0xb049b8d4),LL(0x448bd3a0,0x069abbac),LL(0xe74c7a8c,0xca288262),
+ LL(0x385633ba,0xdffd6286),LL(0x19ddfcd5,0xdad4d394),LL(0x4bc0ef1f,0xe90ccfaa), LL(0xc1fc6f55,0x016bf2e9),LL(0xab3c2edb,0x879b641f),LL(0x89695f01,0xd5a122fc),
+ LL(0xc302a272,0x12a1065f),LL(0x782cef51,0x368397a3),LL(0xbc4ad296,0xebac9fb3), LL(0xe0227d62,0x0caffee7),LL(0x88e685f2,0x63679dcd),LL(0x6aff1b35,0x85ced1a6),
+ LL(0xa3155a1c,0x8b4e0205),LL(0x8310b45e,0x53afa029),LL(0xce35c0c9,0xa7571202), LL(0x06f892ac,0xa0b7a35a),LL(0x796af8cf,0xe4fbab54),LL(0x9d086c19,0x14ac6bfc),
+ LL(0xc6267432,0x2e6b041b),LL(0xd1a15019,0x60267755),LL(0x50c3b7c6,0x7d6c36c2), LL(0x9bbe459a,0xf25437d5),LL(0x23468209,0xe1eff41c),LL(0x046c931a,0xe95608fd),
+ LL(0x3a8012a2,0xd410363c),LL(0x62137413,0x2c5a7c08),LL(0x711e77de,0xaeca7f42), LL(0x08ce5358,0x492fb4fb),LL(0x48f0de03,0x715abe73),LL(0x5f625701,0x726faa61),
+ LL(0x739b9455,0x2262f752),LL(0x511abdd2,0x8cd71649),LL(0xdeb366db,0x6765aca3), LL(0x3e0a005c,0x686587e3),LL(0x33f1710e,0x029b3605),LL(0x828cc559,0xf7b50e02),
+ LL(0x66442cbd,0xe50f5b8e),LL(0x84763a5c,0xf27cc25d),LL(0x3120d35d,0xa92103eb), LL(0xfcef0800,0x91c0542f),LL(0x2d72f1ce,0x8bd12bb5),LL(0xf8086d1d,0xe97d290f),
+ LL(0x4ef89505,0xab4b24f7),LL(0xfe72dd92,0x2bc14e79),LL(0xc60af192,0x94226552), LL(0xfd45454c,0x474c2b8d),LL(0xc7753a83,0xac99b5d3),LL(0xc8f1d3ae,0x6946a61d),
+ LL(0x0c6a72ee,0xcb9c16c5),LL(0x64f9d8b2,0x96e95912),LL(0xdaf45f48,0x7c59cb24), LL(0x79b6515b,0xe520df3f),LL(0xded63e3c,0xb79c6ab5),LL(0xec685103,0x49767609),
+ LL(0x6d892dae,0xbae68558),LL(0x3e48a96b,0xf07e8b59),LL(0x49e4d777,0xa7115219), LL(0x56e5e52c,0x724d7d29),LL(0x6fe58f07,0xb2483de9),LL(0x67836a1d,0xb28ffc89),
+ LL(0x507bc006,0xaebcc451),LL(0xce8569b0,0x27b4e0db),LL(0x02bf59f6,0x579ae452), LL(0x5cff7495,0xc53b052a),LL(0x4cc9201b,0xc816b206),LL(0x540dd63b,0xd3c7350a),
+ LL(0x26022a40,0xd9df51ca),LL(0x92be30ea,0xc1842bc2),LL(0xfa161a61,0xcdd5cee3), LL(0x554031f4,0xdaefdb75),LL(0x4935fd8a,0xd28afc65),LL(0x0a32f4c9,0x439d6d68),
+ LL(0xeb1dc395,0xbe55112c),LL(0x531a3e8c,0x90def44c),LL(0xf77a7b59,0xf5b9ef12), LL(0x4c8ce124,0xc3ec1edf),LL(0x1c16391a,0x4edffe21),LL(0xe9ada0cf,0x40b8ec6f),
+ LL(0xae68790a,0xc586619e),LL(0x0e0ba4ca,0x5bbe744a),LL(0x70ee1ec0,0x21a82b73), LL(0x7b9850f1,0x82066320),LL(0xee9bcc2c,0x2a7536c0),LL(0x9d661f43,0x9632c632),
+ LL(0x1724c849,0x6d3b65ad),LL(0x8cfb77ce,0x3bef3b0e),LL(0x71fb5452,0x670e88e5), LL(0x1035a015,0x82d57c5f),LL(0x23736115,0x340c145b),LL(0xb1c2dc13,0xf1a704ea),
+ LL(0x0ed1952e,0xd3aa33da),LL(0x9a32b9c9,0x459e7596),LL(0x15d05a80,0x15dcd976), LL(0x75895b93,0x85eea023),LL(0xc2fcd91d,0x8daa32c3),LL(0xba5669ce,0x2290ba90),
+ LL(0x66e7e5af,0x85ac1742),LL(0x05bff18e,0x9ba521e0),LL(0x556a9133,0x9f081540), LL(0x929cd03f,0xb913fd04),LL(0xf46a514d,0x3065b31b),LL(0xe351ba04,0xe2fe761d),
+ LL(0x139c5933,0xaf1e2230),LL(0xc129bd42,0x0c6c8096),LL(0xf4cf79c9,0x56f406b5), LL(0x4e86f542,0x772cb3d0),LL(0x843d10bd,0xbe007c1b),LL(0xe8e6693c,0xd3a201f5),
+ LL(0xcfee362e,0x5a6556de),LL(0xa9264918,0x00dafb80),LL(0xc2ab4fcd,0x608dfd33), LL(0x091a15a3,0x29946cea),LL(0xfcbef4a0,0xb8caca39),LL(0x27c3eb56,0xb0c39fce),
+ LL(0x21b66fdb,0x9fad053d),LL(0x74192d67,0xb529c9b6),LL(0xf21d3c4f,0x34c31800), LL(0x33cb3cc5,0x80797948),LL(0xb20d1f9b,0x18c66091),LL(0xe49755a6,0xc9fe30a8),
+ LL(0x4beb71b8,0x90ae4d45),LL(0x4083ee91,0x2fc24099),LL(0xab8d6bb8,0xbcb9c603), LL(0xbca4c1b4,0x72d50046),LL(0x1a6be188,0xbc5fbf1c),LL(0x3da03c7d,0x4bc93b91),
+ LL(0x3931092b,0xcbc53ee8),LL(0x9af003b5,0x455bb703),LL(0x9ac0e7d7,0x8da6de21), LL(0x9ccbcb20,0x6a4900cb),LL(0x73963c8e,0x3146af37),LL(0xd86a3d10,0xfc9469ab),
+ LL(0x8078ecda,0xcd49df84),LL(0x45a4ff92,0x9caf52e4),LL(0x5a8fc8e7,0x4e8bd802), LL(0xdfeff51d,0x4339ea5f),LL(0xc4433bd8,0x25169385),LL(0xebe52ca1,0xdb3a7ae3),
+ LL(0x09e9bb4b,0x8cb174c9),LL(0x224cf62c,0x44657124),LL(0xe1f6dbe1,0x70c991d3), LL(0xb10cd328,0x561771b8),LL(0xb5242c51,0x4e08ed68),LL(0x9e7d3968,0xd3eb6498),
+ LL(0xbef053e4,0xaef71aa7),LL(0x49740ae4,0x3c3c52b5),LL(0x8eca22b9,0x5b6f510e), LL(0xf2645282,0xf1b861ae),LL(0xe96d07f6,0x670312de),LL(0x0c04dcfb,0x413388fe),
+ LL(0x7734d6a7,0x7b924e76),LL(0xa86fc636,0x3616aaaa),LL(0xb9d584ca,0xd600f983), LL(0x67c54321,0x6324b5b2),LL(0x843f1742,0xee50247c),LL(0xde7f93af,0xf92e7c7a),
+ LL(0x0aab4e71,0x1e668209),LL(0x236d6f67,0x76b4b879),LL(0x1fe85adc,0x8358a8ae), LL(0x550e1974,0x7567b0d6),LL(0xbd316399,0x3d193081),LL(0x92a0d80d,0x383ef613),
+ LL(0x26ad5111,0x04a8ee34),LL(0x2efe5eeb,0x56e28325),LL(0xcd888cec,0x88e3f877), LL(0x0de0fb50,0x9ce73666),LL(0x7be9e17e,0xc84bc9e9),LL(0xbc67f215,0xf3a496a6),
+ LL(0x41f7e964,0x548c525b),LL(0xafc8296f,0x18b03c78),LL(0xc171d822,0x14e4c1df), LL(0x03b39f89,0x090e2c4e),LL(0xe157c072,0xaf0feb62),LL(0x77227f20,0xe10a4331),
+ LL(0xc72c5d07,0x40314b18),LL(0x1407f165,0xb2b01e30),LL(0x512cd1ec,0x4ad000d1), LL(0xcf5ce913,0xd7310420),LL(0x865fb1f8,0xa38701df),LL(0xb1db3c80,0xac4c2674),
+ LL(0x36bf878b,0x07697637),LL(0x6ddd10b4,0x662c148d),LL(0x8d97a563,0x75b55463), LL(0x7f1198b4,0x34bf8bd9),LL(0x643001f6,0x31155240),LL(0x0d3f4f13,0xda176596),
+ LL(0xcdcf7cab,0x44c61a3b),LL(0xecb257b3,0xcda79f8f),LL(0x8a15332d,0x7f701080), LL(0x4472224a,0x6f48e031),LL(0x31fafaff,0x3e89e0e6),LL(0xbfc3f192,0x1f066674),
+ LL(0xa2df8c34,0x132f7d0e),LL(0xbc28bb95,0x66d020ad),LL(0xa0c4325a,0xb942cb64), LL(0x07a82d3a,0x4922c971),LL(0xad5d63e9,0x22ce594b),LL(0xc2e553d3,0xdf369ada),
+},
+/* digit=2 base_pwr=2^14 */
+{
+ LL(0xa96c5146,0x773311a3),LL(0xafc15c15,0x8ff8dce1),LL(0x3e382d13,0x59b9e79c), LL(0x3e0a552a,0x0ed1f12e),LL(0xce4662af,0x487503ec),LL(0x7000683e,0x624bc8ab),
+ LL(0x58cb54ac,0x59ffacde),LL(0x492dc39c,0xef64164f),LL(0x337cd1ec,0x16b13c76), LL(0x47ca44a2,0x1e2033a7),LL(0x193743a8,0x8477b54e),LL(0x8e016823,0x557a7155),
+ LL(0x5da83913,0x96d2f426),LL(0xc427cf5a,0x41062046),LL(0x1dd15a14,0x8016f670), LL(0x78840ddb,0xacd78288),LL(0x7feae4af,0x21529372),LL(0xc77acb08,0xdb65ffee),
+ LL(0x9f1f177a,0x23d068f6),LL(0xbec8525d,0x508a8bed),LL(0xabb44bb0,0xa9de104e), LL(0xaef83c7c,0xb1ad4ce8),LL(0x9b842889,0xf045e04d),LL(0xa931cb25,0xca1ba541),
+ LL(0x87b11b0a,0x377c8c86),LL(0x70d0248a,0x4eb952ff),LL(0xec2537f4,0xbde06ebe), LL(0x48f400cf,0xfc17552b),LL(0x84cd18c3,0x73e1b8a5),LL(0x4e54b85c,0xa3a8b445),
+ LL(0xa64a281a,0xa9a806ba),LL(0x7b3bc32a,0xbc16fb01),LL(0x8ab7aede,0x8d2a8d5a), LL(0x2d7db806,0x7db641a7),LL(0x2d8c945e,0x8afe3e84),LL(0x1aefc1de,0x3e700391),
+ LL(0xf8271efc,0xd9e4e55a),LL(0xecac958d,0xd50a0d2a),LL(0x3293a393,0xc58b1b30), LL(0xca65ac88,0x3dfed217),LL(0x13dbff4e,0xe308b3d8),LL(0x7a70bcfa,0x185024cb),
+ LL(0x73d7e444,0xd7ca2cc9),LL(0x5d9cfe00,0x2ab7d94e),LL(0xd1333221,0x24a41faa), LL(0x6b27127b,0x9ce62b32),LL(0x20aca054,0xf66d0897),LL(0x079bb62d,0x41f3f259),
+ LL(0xc11087c3,0xd74686ed),LL(0x99d4d141,0xd199b1e3),LL(0xdb7b97dc,0x2e3a551d), LL(0x8910fa3f,0xb59f58e6),LL(0x7ecfc3ef,0xdef98365),LL(0x349b65ff,0x29ec545a),
+ LL(0x0598f0ef,0x7fc08cb5),LL(0x4400c739,0xa5208904),LL(0x4c9f98b7,0xb02f25b3), LL(0x901fc002,0x4d9901cf),LL(0x49babf27,0xdde7d571),LL(0xf2d65888,0x13b3e92c),
+ LL(0xb6dc4b6d,0xd55436e9),LL(0xc04a2f37,0x746c5407),LL(0x4485d943,0x84d53bb7), LL(0x16b241f8,0x0ba98680),LL(0xf8feecce,0xbdd3b788),LL(0x87dd6420,0x1801aa7c),
+ LL(0xcd59a045,0x047bdddb),LL(0xb8464ecc,0x0b74793b),LL(0x37cce6df,0x95661e95), LL(0xfc3170e4,0x20d1535b),LL(0x68c8b253,0x14546482),LL(0xc42e9c3d,0xbae5cef0),
+ LL(0xe87e6d86,0x0201464f),LL(0xbd67f280,0x1bab0e73),LL(0x64600ebe,0x69b188cb), LL(0x5f9c98da,0x3641dea5),LL(0x9aa645be,0x94d2a2cd),LL(0xbd545f72,0x1ef74b42),
+ LL(0x914d779c,0x19faba59),LL(0x27ba5f19,0x90007928),LL(0xe1ee88ff,0x46f12e72), LL(0x726a44cc,0xa9e0848d),LL(0x285108c9,0x13d4e943),LL(0xdf77e165,0xb5721271),
+ LL(0x492ca661,0xa444123a),LL(0x8e0769ae,0x9ff4a82c),LL(0x718014db,0xc6786b05), LL(0x19f577ac,0x702027a5),LL(0x56e9b5ef,0x349ca959),LL(0x4f6e4b5a,0x1f746299),
+ LL(0x4f0efa59,0xb23ca413),LL(0x15a3b35c,0x003f4a5b),LL(0xe4a4d655,0xa0fe8a5a), LL(0x9e5467af,0x044479ec),LL(0x6d4b3c89,0x5abb290c),LL(0x1c2f5364,0xfd845d3c),
+ LL(0x6837a39b,0x21cdab37),LL(0xf18d4f99,0x7037f403),LL(0x6621328c,0x964d48a7), LL(0x930c4f4e,0xd70553ec),LL(0x5274352b,0xca35a6fd),LL(0x6199ce61,0xff584ff2),
+ LL(0x479ebc39,0x60a7a4ce),LL(0xaa703602,0xaf3c24ce),LL(0x89689136,0xfe79ffc9), LL(0xc7ede59c,0xaab98ecc),LL(0xbf5659bd,0x933f24a2),LL(0x1d702fc6,0x68fd0d06),
+ LL(0xedbb3147,0xbb51d576),LL(0x5d358026,0x038e2a2c),LL(0x45ed9fed,0x10fef0db), LL(0x55be7ba9,0x78b92751),LL(0x69bd1f87,0xae493919),LL(0x186699c2,0x632e8ffd),
+ LL(0x9085fbe9,0xb0b4b604),LL(0x808be4f0,0xf93f9bf1),LL(0x6d8bf009,0x2b58f977), LL(0xd6188f6c,0x020fe5ea),LL(0xd25805ca,0x85d4a860),LL(0x07bb3697,0x7547f724),
+ LL(0xe0b4ea32,0xb225b950),LL(0x33f7d58d,0xbc6e0982),LL(0xcb7418f4,0xb81e161f), LL(0xc0020282,0xfa1572b5),LL(0x8ab14fe1,0x3fababab),LL(0x08b2a18e,0x3a033779),
+ LL(0x6495bacb,0xe816e0fb),LL(0x5d8888be,0x238bd498),LL(0xe3df2fc2,0x7ab0b8ca), LL(0x978404d8,0x88ee40ec),LL(0x26a463b7,0xbc3d1a07),LL(0x65d21535,0xa4c92dcd),
+ LL(0x2928f5f1,0x819bd554),LL(0xbf6255d1,0x82906c78),LL(0x406326b1,0xc710bf1a), LL(0x09f4cd28,0x3a9bbfcb),LL(0xded76f80,0x83e41584),LL(0xbbe53844,0xca1c61fe),
+ LL(0xae17eaf5,0x80c38892),LL(0x61b16da4,0x3670cf14),LL(0xa795a9c9,0x9f9ddd50), LL(0x1255afff,0x6f1841d7),LL(0xb69e10fc,0xc733cd3f),LL(0xdaf931ce,0x515ff527),
+ LL(0xcc8a9a7a,0x14969bd6),LL(0x2c1d2761,0x579c2fb7),LL(0xf09d2a18,0xb0bfb370), LL(0x073b22bd,0x0baf361d),LL(0x1a52d79f,0xb5e11353),LL(0x22d425c2,0x9d475b0d),
+ LL(0xecdc5b6e,0x24d4fea9),LL(0x1731ad86,0x8b3af04e),LL(0x7dfe43b4,0x0a1c0e04), LL(0xaf2af7bb,0x5cf225bc),LL(0x69ef4bed,0xb0885ab2),LL(0x830333e4,0x90999bc9),
+ LL(0x985d6058,0xa8c2e9f0),LL(0xd1b5a3f0,0x8e9e9162),LL(0x3e407711,0x1055feff), LL(0xaaba085f,0x5a33934f),LL(0x23b30a1b,0xf961622f),LL(0x6dafb1dc,0xb1a2ee28),
+ LL(0xa448ee27,0xe49caf6b),LL(0x4560f7a7,0xb8552bfb),LL(0x93f90be8,0xb68fd6ca), LL(0x1f2499d1,0xbb85cfca),LL(0x093c01a1,0x1a51059e),LL(0xd231b79e,0xdf98052f),
+ LL(0xc076155c,0xf696a525),LL(0xf93ce35a,0x3a519224),LL(0x2e706fd0,0x2771d43b), LL(0x51a451c7,0xde78cd08),LL(0xae569dba,0xc9a60017),LL(0x22a0b1b7,0xa3cafd39),
+ LL(0x422b409c,0x4afddf96),LL(0x75f5eb64,0x6313a926),LL(0x626ac381,0xf9420ee7), LL(0xe9858ee9,0xfbe23e3f),LL(0x3c678a64,0x658013be),LL(0xf2ad2c6c,0xbbcfddc5),
+ LL(0xd05334aa,0xf9303aca),LL(0xd7626b98,0xad3e45cf),LL(0x8ca3a1f8,0x56c81f5d), LL(0x4aab3342,0xe892a0b4),LL(0xa1db86fc,0xf8a3f244),LL(0x97566251,0xdee7ed3e),
+ LL(0x5efced68,0x0c65a22c),LL(0x9ce653ac,0xfa181866),LL(0x1e590014,0xa46d7d86), LL(0xc79656dc,0x69d234da),LL(0x00d2b7a7,0x4dbb31d4),LL(0x3452ca10,0xc9636e5d),
+ LL(0x0778d7f8,0x5850e572),LL(0x31b9202b,0x4323e55b),LL(0x5e8d8006,0xaea618dd), LL(0x999bf27e,0xe0f4408d),LL(0x8fab0cc5,0x4bd06762),LL(0x5a75c171,0xddb647f2),
+ LL(0x452f35a5,0x6ce09fdf),LL(0x91938a04,0xe6f5d9dd),LL(0x4cab01a5,0x79821593), LL(0xdc0ff9f5,0x054bf7a2),LL(0x613b5386,0xdb52d927),LL(0xf35b7179,0x661fe231),
+ LL(0xa035b792,0x8a4adcd0),LL(0x2790ce5c,0x854bed6f),LL(0xac3fa847,0x64b0eee2), LL(0xfeb32887,0x7b752cc2),LL(0x09fcfa29,0x5e34ee86),LL(0xac0cd2e1,0xd06594aa),
+ LL(0x10995206,0x6151e607),LL(0x93bb033b,0x93532d80),LL(0x7a33bd69,0x0beac8c5), LL(0xfb8f97c6,0x6f85d5ec),LL(0x0517b3eb,0x661303e8),LL(0xbc3f62c8,0xe17cc0cf),
+ LL(0x4f4d78fb,0x279803d5),LL(0x66c81c4e,0xca63bac0),LL(0xc854f59a,0x6ec15cd1), LL(0x0f159ecf,0xb345c1f6),LL(0x3763e854,0x84807c78),LL(0x8cc6374a,0x691abd9b),
+ LL(0xe4f37f9a,0x77c0e93d),LL(0x611d93dc,0xc60578c7),LL(0x1aff93a6,0x7c98f95b), LL(0x5bb698ce,0x534f1e2d),LL(0xd8bad550,0x0cdc34b6),LL(0x16afd591,0x597794f0),
+ LL(0x571c8a4e,0xb795a174),LL(0xe651a52f,0x15ce6b83),LL(0xf49edec9,0x9394c28a), LL(0xf091dfa7,0x0f74e17e),LL(0x65c44142,0xcc9e8180),LL(0xa4df670a,0xc33d77e9),
+ LL(0xc1633318,0x44536321),LL(0xc0b9deff,0xefb782b9),LL(0xc6b86a19,0x24fda05e), LL(0xf868535b,0xba601337),LL(0x91c21fc3,0xd3d126a5),LL(0x0663ffb0,0x10b1b7b1),
+ LL(0x7fa1153d,0x8162598c),LL(0x688e7c55,0xc3c97288),LL(0x89c8fc1b,0xb0c2872d), LL(0xa859461e,0xfbc2a074),LL(0x82f7d203,0x91591a5e),LL(0xa909de2c,0xe278dac7),
+ LL(0x7d4e49c7,0xad689f7f),LL(0x940bf215,0x12072de0),LL(0xde694ba0,0x7ec61fdc), LL(0xfed04942,0x4a4ee787),LL(0x0f665159,0x0497d6c5),LL(0x94136075,0xe9e08707),
+ LL(0x19850a32,0x391c4103),LL(0x50d61027,0x0ad15740),LL(0xd883b3e7,0x9ca3e6c7), LL(0xf0d758fb,0x76891ec0),LL(0x04d6f53d,0x89ae897b),LL(0xcffefb93,0x77e9b63a),
+ LL(0x216ee99a,0xf201c95e),LL(0x4fb9bed8,0x65648551),LL(0xda5d4d62,0xda9c97f4), LL(0x6aab7149,0xfae41f2e),LL(0x56aa67d1,0xfb649545),LL(0xc024449c,0x493a5061),
+ LL(0x4df4c709,0xd0aa84eb),LL(0x06a93789,0x69c9246f),LL(0x917b88eb,0xe19b7340), LL(0x9fd99349,0x7f7cfe6c),LL(0xa8ebc191,0x6c82e590),LL(0xade7110e,0x7c50c13d),
+ LL(0x50ffdce6,0x17155bf9),LL(0x5281bb39,0xab2bb8dd),LL(0xc4ba3181,0xe73086fe), LL(0xa736d737,0x41d9f1f7),LL(0x3df7fbbd,0x831b8099),LL(0x3b6ffde2,0x566467da),
+ LL(0x36bb3e58,0x6cb9c1b9),LL(0xb8a84147,0x450324ab),LL(0x8bedffc5,0x99535f56), LL(0xa7e14db3,0xb0a718ef),LL(0x304dcfa7,0x65a62f9f),LL(0xd623bb6e,0xfb2f289a),
+ LL(0x9d546bd5,0x0888c3e7),LL(0x772582a9,0x1a97b3cb),LL(0x7645a4c8,0x50937134), LL(0x93ea1519,0x70d77533),LL(0x079ff6e5,0x5837b53c),LL(0x45bcc030,0x8f5c8745),
+ LL(0x1370e46d,0x28549138),LL(0x0bcf90ad,0xf0c3a434),LL(0x639db090,0x4d42664a), LL(0x0158f802,0x345c315a),LL(0x0463e159,0xef82afb0),LL(0xd3e83b12,0xfcf2c419),
+ LL(0x9e3fc0b3,0xe04ea5a2),LL(0x37fd1788,0x98b3901d),LL(0x2d603830,0xc6326a28), LL(0xbe5e9c25,0x6e6c5c6b),LL(0x0fc60fb7,0xac753036),LL(0x12b1dad0,0xc4cf690c),
+ LL(0x46768f3f,0x273e19a9),LL(0x4414d65a,0x93aa3754),LL(0x5fabe262,0x4ecff706), LL(0x7ff1403d,0x6d9cfcee),LL(0x33284115,0xf6e4192e),LL(0x5e218033,0x80aa8768),
+ LL(0x485363f3,0x0067ee42),LL(0xfab8b185,0x5fcd61f5),LL(0x8e63d384,0xe3c345c8), LL(0x23ff551f,0x80847073),LL(0xe339aa9e,0x6a804b17),LL(0x6bb64f96,0xb9142088),
+ LL(0x7679428f,0x855916bb),LL(0x9c4cf460,0xbab9e9be),LL(0x55dad941,0x0c3bdf26), LL(0xfedb73be,0x6b8e8c3a),LL(0x0355a4c2,0x07fdbfa0),LL(0x5e3c1b3d,0x8e9137e5),
+ LL(0x57927722,0xb4afd653),LL(0x5f997d66,0xd48cbfc8),LL(0x7719d80d,0x5125ce07), LL(0x654d2350,0x19d47bce),LL(0x4d7a3060,0xfc671097),LL(0x15d775f7,0xddad1eae),
+ LL(0xc6a285a3,0x9e8ea16e),LL(0xc535adfb,0xc2f0c22d),LL(0x217f73ce,0x3fc464b9), LL(0x73a8ee71,0xc543babb),LL(0x0da708c9,0xce410235),LL(0xc2f48649,0x99849442),
+ LL(0xc83b501e,0x6b420f3d),LL(0x642f062d,0xe08c411c),LL(0xf03d2cf5,0xc79fd495), LL(0x07236a83,0x2184fa72),LL(0xc9a0ea3b,0x31b0e4f4),LL(0x5b82a3b3,0xd7795d4b),
+ LL(0x3fe60842,0xb2520494),LL(0x45bdeed9,0x751336f1),LL(0x9718fa41,0x1b66bb31), LL(0xda9a21c4,0x5a50a96b),LL(0x615dcdec,0x94cc1fb5),LL(0xe39c3066,0x556b641f),
+ LL(0x15ea6075,0x69d00e4c),LL(0x83005a21,0x3e707e72),LL(0x767ca1f8,0x84e2a469), LL(0x3f8c4c84,0x94b82739),LL(0x81a2db60,0xe00dd19b),LL(0xd7cabd28,0x16f30fec),
+ LL(0x6305314b,0xb08563f9),LL(0x7ac22e44,0x73d8fb6a),LL(0x55919896,0x9b969f2f), LL(0xa3460685,0xcc9dd3fa),LL(0x1226dbee,0x377b5d9e),LL(0xaaa83ccc,0x0b4bbd51),
+ LL(0x61f910de,0x929c87b0),LL(0x5f2bdd34,0x0595e87f),LL(0xb587735f,0xa5b54a4e), LL(0x6ac0195c,0xa3bbb78b),LL(0x1d44758a,0xe6b38b87),LL(0xac01f679,0xfd575f0c),
+ LL(0xb21a6382,0x223f54eb),LL(0x672c43f7,0xf6f79b9d),LL(0xb8b258f5,0xcf8054d3), LL(0xa119b37d,0x88ec08ee),LL(0xafda5f1f,0x4b0fd837),LL(0xad4546ad,0xc0dde1b4),
+ LL(0xe673eb95,0xbf7186d6),LL(0xc9d6a6a8,0xa324e752),LL(0xc117d914,0x5ebf8238), LL(0xad6715dc,0x9c33641e),LL(0x1d597adb,0x99439b58),LL(0x9c6a2ef6,0x83ba580e),
+ LL(0xb17b3816,0xbf87295c),LL(0xee1db90d,0x05c753ce),LL(0x2554bda2,0xa31eccaa), LL(0x81176cf2,0x66691105),LL(0xb4e7bb4c,0x67eb9bec),LL(0xc294982a,0x6443f703),
+ LL(0xd0ab699f,0x86c4e0ba),LL(0x748ed429,0xce3d72f1),LL(0x53e24aed,0x0ed09a39), LL(0x4db6e8ed,0x0ac3cda5),LL(0xeed93b68,0x26b6ee99),LL(0x2d53c5f0,0x3707c0fb),
+},
+/* digit=3 base_pwr=2^21 */
+{
+ LL(0xc3bba334,0x549606d0),LL(0x013ca242,0x6dcb5519),LL(0xdcf78255,0x784d65cc), LL(0xdbd76716,0x73d0de0c),LL(0x1010fb15,0x2bc13bf7),LL(0xe8d77e91,0x21d2c3cc),
+ LL(0xa396d29f,0xf8efa6ac),LL(0x767470ec,0x33ec678b),LL(0x7241f5fc,0x23f69526), LL(0xd2a4a560,0xd0338dfe),LL(0x9d30be61,0xce5baa02),LL(0x4db7b6e5,0xb39ee0e3),
+ LL(0x4268d7ee,0x93adf307),LL(0x2c9a12bf,0xfcbae0f0),LL(0x534822a7,0xb76859b8), LL(0xf961bd84,0xab38334c),LL(0xd09e4e94,0xb17e54bd),LL(0x43d3a64a,0x0fe2b812),
+ LL(0x9577e8d9,0xe17445a1),LL(0xd2d34121,0x330f6634),LL(0xa1aa8076,0xcea03741), LL(0xfcfafd3e,0xfddda6ff),LL(0xe05b9369,0x440df5db),LL(0xbb0d7ca7,0x51fbac8e),
+ LL(0xc9b4ce1e,0x320accbd),LL(0x99292bb2,0x3798c1f3),LL(0xa402db93,0x8371a2e6), LL(0x65d07e1c,0x716af227),LL(0x23851a3e,0xd06eaa2f),LL(0x61f48045,0xc42ee506),
+ LL(0xc40da094,0x538f7dc5),LL(0x54a44890,0x4c651fc4),LL(0xee59f9d2,0x80876d6c), LL(0x66c8ac59,0xad6aff6e),LL(0x257e1b91,0x32b4e3ba),LL(0xec717e05,0x957bedc7),
+ LL(0x7459bbfe,0xe45216bb),LL(0x2ef69f90,0x3dac0bfe),LL(0x6161cb8b,0x2cc6a2b9), LL(0xf6e7e3b3,0x472e91fd),LL(0x304e8482,0x4d2e40f0),LL(0xaf1042aa,0xf4afc219),
+ LL(0xd64583ec,0xffc53726),LL(0xeef5bce9,0x6b462381),LL(0x24829cb3,0x753a4bef), LL(0x404af02f,0x976d6897),LL(0x448a7822,0x93313219),LL(0x399e5d55,0x79449ea9),
+ LL(0xc5ecabd1,0x3574a11c),LL(0x34e48369,0x11ee8559),LL(0x915873b6,0x7fa30b5d), LL(0x2ae5b9b4,0xe1a71608),LL(0x2e04edad,0x57296722),LL(0x30d27fbf,0x84cdfbff),
+ LL(0xbe3bd4b2,0x0c29de57),LL(0x2898b5b6,0xfdc6a64c),LL(0xc8bb55be,0x5604fc5b), LL(0x2e98dac3,0x1e6f616c),LL(0x8e9baefb,0x494a5143),LL(0x5501fe87,0x251c23c9),
+ LL(0x6cdda2c2,0xebcbef56),LL(0xe3ee721e,0x85b1e422),LL(0x9dcdd732,0x32bcca8f), LL(0x72410bf8,0x182e8ce7),LL(0x36f1dca3,0xaa7f4322),LL(0xdcd402ab,0x893d6417),
+ LL(0x43cd1278,0x87f47e84),LL(0xe1831ddd,0xc8b878ac),LL(0x093ba446,0x4d0a3597), LL(0x40080bf9,0xafc47c89),LL(0x3832f14c,0x3157bb67),LL(0xb8eb8baf,0x2abb24b3),
+ LL(0x063399bf,0x30752625),LL(0x2979063f,0x47abe9c9),LL(0x55165854,0x01c9def8), LL(0x6fb4555d,0x0bab44d6),LL(0x567eb3a7,0x8a53411f),LL(0x726f9e4e,0xb8aab552),
+ LL(0x2440a85b,0xad782e43),LL(0x2fbb1ce6,0xfa5a74b7),LL(0x1ae20947,0xc49e442b), LL(0x772117aa,0xd3fca276),LL(0x6115a3ed,0x303be2dc),LL(0x1a6f32b8,0x3b808eb6),
+ LL(0x71faca97,0x673ae260),LL(0x086041a0,0x32f3b688),LL(0x1367ca73,0x26acc3be), LL(0x8c66b759,0x48400913),LL(0x9b73c0e4,0xc88e5241),LL(0xd44b961b,0x17a8a61d),
+ LL(0xe56aeb1a,0x0a3a7387),LL(0x461fdd3f,0xa4010610),LL(0x016484bb,0x601e6822), LL(0x04bbe3e8,0xde403502),LL(0x9f071625,0x6a1b8c7d),LL(0xdd3f60b3,0xd1e9028a),
+ LL(0x1496f098,0x7b626130),LL(0xbf161daa,0x62dffbe1),LL(0x9c44fcc7,0x401ddc78), LL(0xb9872e73,0xc81c3a33),LL(0xc751f26b,0x0e48c326),LL(0xa0829b6c,0xffaeec0e),
+ LL(0x77a5b096,0xf5530fa7),LL(0x19734245,0xb008b72c),LL(0x848b3785,0x7462bc45), LL(0x6cf9e5f2,0x29fa43a4),LL(0x9854d78b,0xd8b27b11),LL(0x9097f3d4,0x6f8fe5a5),
+ LL(0x30c97aa5,0x63ec5b71),LL(0xc6488713,0xfa8462af),LL(0xd7b335fa,0x51f2d273), LL(0xcd075cb1,0xf2891fbd),LL(0xd007c58e,0xffe2576c),LL(0xd8bc9492,0xaeec8e91),
+ LL(0x6f905b81,0x305b6908),LL(0xbf19b3bd,0x5d023c2e),LL(0x22ae8649,0x9c503cbe), LL(0x25255b41,0xde8be78f),LL(0xe809567c,0xb1e4b2de),LL(0xb09e4638,0x986a2fd5),
+ LL(0x213fb6cf,0x0b36dcd5),LL(0x834d7c84,0x5f340cf2),LL(0x42696c00,0xf835cd54), LL(0x71e8739d,0x7f02199e),LL(0xb4f38aed,0x0663d540),LL(0x1f7c9176,0xed21b27e),
+ LL(0xbc7e8681,0x1810377d),LL(0x1545ee0d,0x242d18eb),LL(0x45281613,0x3360ba32), LL(0x808ebc75,0xb14e805f),LL(0xad26b94c,0x965c6c59),LL(0xebf7f5e2,0x24e3cd91),
+ LL(0xc0623d66,0x493d0777),LL(0x05131c2a,0xafe840f2),LL(0xfe23fc98,0xb282512d), LL(0x3735071c,0x47342277),LL(0x105f0570,0xfe0900ce),LL(0xad56ac6e,0x7f80e17f),
+ LL(0x7da80215,0x5509a924),LL(0xe2039096,0x0d1b8304),LL(0x32330f7c,0xb8d360d9), LL(0x866bf185,0x8b6b538a),LL(0x60f48919,0x65565d06),LL(0x4a88485d,0x457d3e36),
+ LL(0xb4d530a4,0x21ffdbfe),LL(0x134babd4,0xb68a01ac),LL(0x3c545d8d,0xeac3a42a), LL(0x525bd6e8,0x2ec4920e),LL(0x11415be9,0x91d90569),LL(0xc859b9a9,0x27f2bf78),
+ LL(0x3a492c73,0xdef766d6),LL(0xbd647210,0xd395535f),LL(0x7a9398e6,0x2cf03d25), LL(0xa10ca7f8,0x00d0d0ec),LL(0x05dde357,0x384e9692),LL(0x66d09f76,0x86dfa64d),
+ LL(0x97c72efb,0x949c71bd),LL(0x3942aaad,0xeaebb176),LL(0x6b83fb91,0x2998f398), LL(0xccd511b6,0xa3fa1c7e),LL(0x8636cb8b,0x30452ba9),LL(0x0c63c213,0xfd01b34f),
+ LL(0x654f4b1f,0x161634df),LL(0xba6b7612,0x786d3d9b),LL(0xa3f145c5,0x7b731aff), LL(0x81bf5f5d,0x318ec0fd),LL(0x28ec1847,0x5aac3946),LL(0xef3f2a56,0xb5b34960),
+ LL(0x8a25550d,0xb8603afb),LL(0xca58e8f8,0x7d76ca1f),LL(0x52edd227,0xb124c5a5), LL(0x749a0bb0,0x4ff6045a),LL(0x166a72cb,0x9d1c4729),LL(0x18c9dd50,0xa1165c3d),
+ LL(0x32ec01e6,0xaf916e4f),LL(0x74270c7a,0x9b18b797),LL(0x2bde0960,0xc31c12bd), LL(0xe3a52afc,0x6fdbedeb),LL(0x99dcd3e1,0x2fcf26c9),LL(0x2ec4570a,0x15d634a7),
+ LL(0x02e98f6e,0xe27fb84e),LL(0x016e8348,0x19815362),LL(0x5ee51a3d,0x72e0c390), LL(0x36959aff,0x5f3ea99c),LL(0xe880a6fb,0xec5b0f2d),LL(0xac887faf,0xaecf25fd),
+ LL(0xca7c485f,0xd0640e47),LL(0x8c826885,0xa0eae2dd),LL(0xf0750194,0xfcd0e169), LL(0xe05f5115,0x04c965ed),LL(0xd7ba9d0d,0xe9482a7a),LL(0xd261b83f,0xf2660cd3),
+ LL(0xf53ab896,0x722e7324),LL(0x83e9fccc,0xcabeeaad),LL(0x0886fae1,0x332ff124), LL(0xfa23970c,0x0e8c2e7d),LL(0x433ab568,0x26f580ee),LL(0xcdcf0e3e,0x7cdcc1f4),
+ LL(0x513d4695,0x83ac29d5),LL(0x9101ca09,0x525837bc),LL(0xe8e10f27,0xecd93292), LL(0xeea1edfd,0x312f9d84),LL(0x83f862a3,0xdf9354ea),LL(0x15909df4,0x0f9f120a),
+ LL(0x5c61ed01,0x16fa2ab0),LL(0x816f7ce0,0xeab42f96),LL(0xf1cbe36b,0x1aca9b66), LL(0x1763d0c8,0x7fb3d70e),LL(0x7c64a8fc,0x5fb8567b),LL(0x45fb302c,0x08b686bd),
+ LL(0x6270b30e,0x0124d430),LL(0xcf5b5235,0x566f1fd2),LL(0xbee07063,0x923da430), LL(0xe2c6736c,0x2ecebb06),LL(0xad6d6ee4,0x3a3fdafe),LL(0x82bd6945,0x16522430),
+ LL(0xd6d11f78,0x0d162ae9),LL(0x69047eb7,0xddb375c5),LL(0x926e0966,0xd125f66b), LL(0x100fb84c,0x1cfafcac),LL(0x40c50ecf,0x1f4c7fd4),LL(0x499513b2,0xbd8ac3ec),
+ LL(0x5feaf69f,0x937412eb),LL(0x641cace4,0x760d3378),LL(0x203e5367,0x9bcec28e), LL(0x45fa3774,0x457f3a0d),LL(0xdf85b5f1,0xec51fd4f),LL(0x37d174ba,0x47390235),
+ LL(0x0a893990,0x7df7dee7),LL(0x8f08f682,0xa525af4c),LL(0xfae95f9b,0x9edbb45a), LL(0xcdc01949,0x58f3b29d),LL(0x773a1cde,0x9afdfd03),LL(0x8b16ab71,0xd6077f9e),
+ LL(0x13611c0d,0xc96eabbc),LL(0x7581f50a,0x8af0d512),LL(0x93c963cd,0xf75a7835), LL(0x9060a883,0xb7487030),LL(0x17ceb72c,0xfc03c9b1),LL(0x79773be4,0x64773851),
+ LL(0xd416e391,0x8f73e056),LL(0xb0289136,0xf9c29801),LL(0x1ebcb0de,0x85fd38b0), LL(0xf0af703b,0x9928f60a),LL(0xbbd1143a,0xd77a236c),LL(0x2b99b61f,0x120472d4),
+ LL(0x5f4a504c,0x0e448282),LL(0x5cc9b39f,0x1fca16bf),LL(0xdf0166de,0x4e47e87a), LL(0x76644e8f,0xf11ccae7),LL(0x4b20ddcf,0x84113220),LL(0xe274c42f,0xae2e75b4),
+ LL(0xf97bdda6,0x604a226f),LL(0xadbee2bb,0xadd35dc6),LL(0x986e403e,0x8b7db9ea), LL(0x6ad6318f,0x9007482c),LL(0x891688d9,0x22b19d05),LL(0x4d848a95,0xe974ab42),
+ LL(0x88cc05d4,0x339df4aa),LL(0x5855f83a,0x14e21ec8),LL(0xd790d568,0xddcd7ff2), LL(0xcf09873b,0x5c8a6e40),LL(0x134b7a3c,0xb76d74a0),LL(0x07549e84,0xd05b80d6),
+ LL(0xc5f26048,0x845e4b79),LL(0xeac9a450,0xcb338886),LL(0x9b807f9a,0x78f027d1), LL(0xb02ce220,0xf81fb903),LL(0xcd541a4a,0x2bc100d8),LL(0xb3d3cbfd,0xf10cf19f),
+ LL(0xb198d5f3,0x74645ba6),LL(0xcebf9671,0x9fbabd70),LL(0x5d7a8816,0x57cf26bc), LL(0xc18901bd,0x415d9e95),LL(0x08448312,0xa71715a6),LL(0xe80f10b3,0xbb1d05fa),
+ LL(0x488ffac2,0x6065bcb2),LL(0x21393e2d,0x02526899),LL(0x4f000282,0x259f0d34), LL(0xf12f0afa,0x10a4333c),LL(0x62a1dba3,0xaa0b50d7),LL(0x8cf13d7e,0xe09542dd),
+ LL(0xc2ba51fa,0xf15ba587),LL(0xcdcc4e52,0x72f2bc15),LL(0xe3ca3356,0xd1c3673d), LL(0x3028612e,0xabbfd1f0),LL(0x9def1d98,0x4ab9792d),LL(0x4815b9f7,0x02e11fbf),
+ LL(0xf804ca53,0x24940965),LL(0xd69ecbb9,0x5073162c),LL(0xdccb4f88,0xe078c3a3), LL(0x1f34a5f8,0x06f13d89),LL(0xfca14e1e,0xa848dd8e),LL(0x8c4c3fac,0xb989d0a4),
+ LL(0x3f31ee3d,0x670aa037),LL(0xc8999458,0xf72dfbba),LL(0x4698301e,0x36e3a8b0), LL(0x1a579aef,0x26b32ad4),LL(0x98b2b956,0xdff0c7ec),LL(0x77953721,0xa732a2c4),
+ LL(0x436265d5,0x0ff83c66),LL(0x06547c6f,0xfa5166e1),LL(0x5bfd456d,0x03018748), LL(0xf306cdd5,0x1b4ec2b6),LL(0x4b56f91f,0xe064b766),LL(0xa5805ee3,0xfdeb932d),
+ LL(0xc49208e8,0xa583f200),LL(0x369d91c7,0x34a07e82),LL(0xa89b1fd5,0x3fe43f6f), LL(0xb439d920,0x76aecf08),LL(0x4547896e,0xf76a9539),LL(0x3019148f,0x3c69e2e4),
+ LL(0x41fc2ca3,0x79e74959),LL(0x6a5af93e,0x09a99e14),LL(0x8293aacb,0x6610c0ad), LL(0x84dff17a,0xc56e9614),LL(0x0ff4cf52,0x0a4f0290),LL(0x35902cdb,0x50fd4a21),
+ LL(0x7297ff6b,0xc526cdd2),LL(0x47459c97,0x2c8409af),LL(0xb7537567,0xbd3097f3), LL(0xb47675e9,0x5b29ab79),LL(0xfd4e344a,0xded7e0b2),LL(0x0eb1e2c4,0x40324c92),
+ LL(0x9c381ce8,0x617df28b),LL(0x4475066c,0x6771e091),LL(0x82a57c2e,0x7ffb1259), LL(0x90dbf30a,0x6997a10e),LL(0x4603a795,0xa412e99c),LL(0x6da0de96,0xfb49f3ca),
+ LL(0x24c43f70,0x28fb7939),LL(0x9b346573,0xa7d31444),LL(0x20545584,0xdf8f9b6b), LL(0x8a9b1477,0x54464b03),LL(0xad8c0fa5,0x623ad546),LL(0xae0601f7,0x5cf44ed1),
+ LL(0x0f36e763,0xbdc4a6e7),LL(0xd3fb2441,0xaa5058c6),LL(0xbd11e44f,0x7603b5a1), LL(0x6c72527d,0x65a896f3),LL(0xd59c82f0,0x214ffbf2),LL(0x0ec375a1,0xf886b405),
+ LL(0x6933ecb2,0x12e89a15),LL(0x2c1f2f43,0x3ed0ad89),LL(0xe0d5c6de,0xcafb442c), LL(0xe8cd1af4,0xb06cf2fd),LL(0x9c4265bc,0xb06e7452),LL(0xa73a0639,0x6af8b9d8),
+ LL(0x513e4297,0xc18ced3e),LL(0x7fab97a1,0xb4f2f3ca),LL(0x79cc3e70,0x16a64cee), LL(0x64e9eb0e,0x1f3006b4),LL(0xfedf5a33,0xf997d410),LL(0xffe83ec6,0x7fed67a8),
+ LL(0x3d30aa08,0x2452d81d),LL(0x1cd85802,0xcac330c3),LL(0x79a76f43,0x9a89abac), LL(0x17c27a7a,0xa965909b),LL(0xa62a311a,0xa1534cd2),LL(0x71a72a64,0xe4fe0317),
+ LL(0x261133ef,0x2d7c475e),LL(0xff4f2dd3,0x37952ead),LL(0xe360fb3a,0x10b0a5a5), LL(0xea3f4d28,0xb88323f0),LL(0xebeff23e,0xf1488cef),LL(0x8d265c93,0xa3b9477f),
+ LL(0xb76e90d9,0x57b098a1),LL(0x0449bf9c,0x988fbb42),LL(0x062f911b,0x95642d7d), LL(0x61b08116,0x788996fd),LL(0x09d205af,0x5b02272e),LL(0xb3d8f31e,0xdea85f72),
+ LL(0x09b907f5,0xdcc15267),LL(0xf7971f9b,0x784511d8),LL(0x20119354,0xe309478a), LL(0x4ce572f8,0x4d5e16a3),LL(0x2c62f607,0x7eb6eeed),LL(0x57f7d26b,0x6bcb2bff),
+ LL(0xd75c445c,0x2559d692),LL(0xb7443959,0x49d40028),LL(0x55e49cd0,0x5ee0d518), LL(0x33bb1b6d,0x0cade75f),LL(0x32bf7888,0xd8bac375),LL(0xa0531d90,0xa47d4b3b),
+},
+/* digit=4 base_pwr=2^28 */
+{
+ LL(0x58d5549f,0x881d4415),LL(0x7328bce3,0xed748e21),LL(0x2f1f8481,0x56f0d441), LL(0x021c9c2c,0x74ff865e),LL(0x93500f82,0xbaa63b47),LL(0xc2e3b807,0x0c40fade),
+ LL(0x9568fad3,0x6f93d120),LL(0x7ff0a77f,0x291875f3),LL(0xdd42f359,0x0608b32f), LL(0x644f9985,0xfee522d9),LL(0x05996cc8,0x4beb2bfd),LL(0x769aa367,0x5a77212a),
+ LL(0x504a6f07,0x96957fc9),LL(0x6acad37b,0xfd75c98d),LL(0x548f17da,0x2cc5e7b2), LL(0x7bdfaedc,0x039b865d),LL(0x1970dc2b,0x1ed21afd),LL(0xb4169fbc,0x93b309be),
+ LL(0xc373ba13,0xca0eaf9d),LL(0x798e41ad,0xe25f5f11),LL(0x1eca3ea4,0x5af4b3c7), LL(0xa23b9c8a,0x47bc86f1),LL(0xfae9d7b2,0xe9768f07),LL(0xed3e806e,0xf94f89f5),
+ LL(0xe4f24c73,0x43f87b32),LL(0x643fb20c,0x41c6cddb),LL(0x602b32c9,0x7093785c), LL(0xa13dc1f1,0xdf9d7247),LL(0xd42502e0,0x3a967995),LL(0x4df43de6,0xa0e28ce3),
+ LL(0xf53d962a,0xf3011fff),LL(0x1767f31f,0x9ef38fb2),LL(0x5f883ec2,0xa11413c6), LL(0x4c344917,0x84383633),LL(0x3f5cae22,0xca855976),LL(0x15b2fddf,0x929a1484),
+ LL(0xccfc0e1d,0x58946718),LL(0x809ffae5,0x651d4a6d),LL(0x87a653a0,0x6eeb8892), LL(0x6881e966,0x2c4c3c55),LL(0x6dfb6d35,0xbdb6d87e),LL(0x92113e28,0x7cf86719),
+ LL(0x6203f1ec,0x6451f3e3),LL(0xab59d68f,0x40681d08),LL(0x66af6fee,0xd0bf9608), LL(0xc1e4b6a6,0x5df24a1f),LL(0x5e6a069f,0x64c1b0f2),LL(0x63fbf5bd,0x124e2748),
+ LL(0xedf146a2,0xe6cbf0bf),LL(0x085c71de,0x85e47e89),LL(0x603e3ba3,0x39330eae), LL(0x6841460f,0xbcd9f912),LL(0x55ffa24e,0x4212f2ba),LL(0x3fb12ad2,0xadf49ddb),
+ LL(0xadb7dfa6,0xfb02103e),LL(0xbabeeea2,0x4dce5edb),LL(0x622cfe41,0xe4e76c1e), LL(0x5d2cde0b,0x318e8d34),LL(0x4448a054,0x5d3e168a),LL(0xa23e5457,0x444ff058),
+ LL(0xa8083fb8,0x06020b4b),LL(0x73e1d9fe,0xc6d07af1),LL(0x137f9872,0x2056f42e), LL(0x523b9b18,0x5ee31758),LL(0x39042106,0x58771cbe),LL(0xa0e5b696,0x114531cf),
+ LL(0x8a9552c6,0xa4eedc90),LL(0x6eb5fedf,0x23be4e8c),LL(0x5ad0744a,0xe5f6ada1), LL(0x4ca7d6f4,0x373a4a9e),LL(0x57cea5a6,0xb5a5a64d),LL(0x7f48cb04,0x3a65f463),
+ LL(0xc83aaf37,0x73506b7f),LL(0xd4bce539,0x9785f792),LL(0x7df31e2d,0xebbfa1b8), LL(0xd5a2ea75,0x3b66c6b3),LL(0xf2196549,0x32ac5d33),LL(0xf8082490,0x89d1486d),
+ LL(0xf9fe7377,0xc0c2ec19),LL(0x39415cfb,0x07911ff1),LL(0xa1c91f71,0x1b54a66d), LL(0xd4f59851,0x29646a9e),LL(0xe209ab6d,0x0a7fcf62),LL(0xfca0de15,0x6ea260fe),
+ LL(0x5fcc220a,0xd026ef4d),LL(0xd9364e42,0x7303fde9),LL(0xd35f5fad,0xcf2f621c), LL(0xd439a9f6,0x6e346476),LL(0xccf2de6e,0xb108eab2),LL(0x6d3db6c6,0xca46cb58),
+ LL(0x1de59604,0xc89fccf4),LL(0x59f8e37a,0x72ee2825),LL(0xd52aa0eb,0x9423de94), LL(0x1110f4b8,0xb6837166),LL(0x5e0ca5e7,0x00b22047),LL(0x7f72b3f8,0x79573c27),
+ LL(0xe67b0c29,0x6dfbc44f),LL(0x05177565,0xa0a8e62f),LL(0xbf5b1bbb,0x7f494f35), LL(0xd472f2c7,0xcc727439),LL(0x48ea2e18,0xcafc4607),LL(0xc5b2f1e5,0x25499b27),
+ LL(0x86c1e086,0x83fb7e04),LL(0xafbb1111,0x19eeb012),LL(0xa0c8df49,0x620d5c9f), LL(0xd8adc0b6,0x85368dc4),LL(0x0c2f7efe,0x174dcd3c),LL(0x52fe89c3,0x71d50509),
+ LL(0xbbeb2341,0x03ec18cc),LL(0xc49153aa,0xf386e999),LL(0xd01e004b,0x58b7a90b), LL(0x3bf5753d,0x66713f74),LL(0x23ce4a5f,0x96fa5445),LL(0xa7a2e6a6,0x06b17741),
+ LL(0x1fa5345b,0x93e18885),LL(0x2b10748b,0xc3faca64),LL(0xdf987dbc,0xc1b82b06), LL(0x205e25f4,0x8f3aa4d9),LL(0xb7dc364e,0x31bdcd03),LL(0xb91f4dfe,0x5a21cbcc),
+ LL(0xbc5b1ae6,0xc9f8dd3e),LL(0x09390a2d,0xfd14096e),LL(0xd6fbd5f0,0xcf2461e3), LL(0x02a263e4,0xaa775c22),LL(0x0fbb901d,0xc7829c8b),LL(0x1840557a,0x338e09b6),
+ LL(0x1c6d5d1d,0x6aa505da),LL(0x5646e930,0xf7906394),LL(0xa52fc317,0xfc0035dd), LL(0xb185221a,0x9fefcec6),LL(0x49de64e9,0x692267cc),LL(0xc316de61,0x2d105157),
+ LL(0xd4e3b784,0x57ac5de5),LL(0x13ab394f,0xac9c4222),LL(0x027f1648,0x5aa27972), LL(0xc83390e1,0x7a4b5ae2),LL(0xa1a47d58,0xba9ff075),LL(0x4a3d0cd8,0xf9ad2400),
+ LL(0xede14e49,0x70ac2786),LL(0xbdf4b5ad,0xd79e0890),LL(0x01edd96f,0x7b6dd833), LL(0x565fd682,0x1b4f533d),LL(0x474f71f9,0x9222c9a2),LL(0x83ebda25,0xa56581a9),
+ LL(0x25ee5573,0x7050f5eb),LL(0xdb88f4cd,0x4758c876),LL(0xc852b937,0x9abc5336), LL(0xa5b25a0b,0x88d32963),LL(0xf471412c,0x3e117bb5),LL(0x081986d4,0xf4fe7f16),
+ LL(0x976cf433,0x1a1189da),LL(0x7202a031,0x8d95553c),LL(0x844752a4,0x59d33ccf), LL(0xb361b89b,0x8145a133),LL(0x43423d20,0xf78e0d37),LL(0x61a44de5,0x522e94dd),
+ LL(0x8e540c0b,0x7c2237f8),LL(0xe30c14a2,0x89d8e57c),LL(0xbf6aa5e6,0x456a042a), LL(0xf3216fe6,0x22ab0e28),LL(0x5cb9a52f,0x54763652),LL(0x0b10595d,0x5ee60169),
+ LL(0x3800818b,0x06cc9e76),LL(0x7f5020ad,0x426cc669),LL(0x18577c5f,0x53ff7b9e), LL(0x30789f9e,0xbecc9a3d),LL(0xac798e8a,0x685f1d84),LL(0xcf85daa7,0x3c0745ce),
+ LL(0xdfd3615b,0xd516bc63),LL(0x9ad06650,0x36e8a2de),LL(0x9a930d91,0x71f2ade0), LL(0x88d6e03e,0xe237231a),LL(0x80cd199b,0x8af22a7b),LL(0x68638e0e,0x999ac96b),
+ LL(0x3b855f82,0x92421da5),LL(0x229553e1,0xdf39524a),LL(0x389ff1eb,0x388c4741), LL(0x49806f26,0xb73b3db2),LL(0x116a75da,0x0066ae14),LL(0x7d37c100,0x224f589b),
+ LL(0x4defbdd3,0xc60c22e1),LL(0x5449bd64,0x6d574468),LL(0x46ea4c3b,0xee1e887e), LL(0xc608f1e7,0x16b1d73e),LL(0x87301c1a,0x30a39cb8),LL(0x76725f2b,0x5e7728f2),
+ LL(0xbeda23d1,0xd3a7aed2),LL(0xaf09fa81,0x2d4adeac),LL(0xf998500d,0xcc705a59), LL(0x97b62945,0x2ec67209),LL(0x2156a3f4,0xfefbf4e8),LL(0x0a5fb347,0x20684eab),
+ LL(0x785d1eb6,0xeb66a59a),LL(0x82fd2480,0x98279fc5),LL(0x1a00554b,0x6b259c82), LL(0x913e2492,0xa46b9ebf),LL(0xea3691cc,0xc3524af6),LL(0x6746a57e,0x00ec234a),
+ LL(0x71718339,0x33a6b51e),LL(0x206c1075,0xbffbd973),LL(0x0461a56a,0xd7489944), LL(0x5ee41c8e,0xb4440567),LL(0x7b86fe5a,0x2bf38abf),LL(0x8cd45ef5,0xf70c63a1),
+ LL(0x845aa2a3,0x80c95a21),LL(0xd508e765,0x4882eaac),LL(0xcb5bb20c,0xc5f7b8fe), LL(0x104b3369,0x96426128),LL(0xd131d49d,0x23598393),LL(0x27af509a,0x059d6d87),
+ LL(0x330dc205,0xecb4bd8d),LL(0x793b3824,0x3934dce1),LL(0xf505c154,0x2b8cedbe), LL(0x7a873a69,0xba92295b),LL(0x386ee396,0x8449398b),LL(0x4717b4b5,0x72584bae),
+ LL(0x73765fd1,0xa18a909b),LL(0x7db9952c,0x2494a304),LL(0xe91c490d,0x2747b58d), LL(0xb6d10153,0x1178cdf0),LL(0xbf4c5889,0x35235125),LL(0x90f823d5,0xdf63fa73),
+ LL(0x4066c1a7,0x38748fb7),LL(0xf5cf90a5,0xfbfbb8e2),LL(0x9b83fd71,0xa828018b), LL(0xb34ce140,0x3de7f633),LL(0xd54824f7,0xd760a3e5),LL(0x94e2e012,0xea872fd7),
+ LL(0x479fbc3f,0xd2aa4fdf),LL(0x1979cfcb,0x11a9a799),LL(0x03e344fe,0x01733a8f), LL(0xb5b3cc49,0x0c61b034),LL(0x10c7d2cf,0x27483deb),LL(0x1884d1f1,0x6dc92d21),
+ LL(0xdce73a42,0xebf1943b),LL(0xa62405be,0x91a018b4),LL(0x5684989d,0x844d759b), LL(0x4678912e,0xbdc609b4),LL(0xd12582c1,0x4b151529),LL(0x7f8e1390,0x7ac0cfc4),
+ LL(0x987acd67,0x5245ca01),LL(0xf023cfd4,0xd4688d7c),LL(0x4b96af1c,0x799e7c06), LL(0x0a9e14c2,0xa96c4571),LL(0x2ded73d6,0xc2dc67eb),LL(0x2783e2b5,0x43588841),
+ LL(0xeef15ae5,0xa3b115c6),LL(0x87b86741,0xf305a27e),LL(0x4711a4a3,0xa5fdc849), LL(0x7b6ef648,0xeb58f0f1),LL(0x6f3ea084,0xdccddcbe),LL(0xa1b862a7,0x6f7470fd),
+ LL(0xd88e9f3d,0x141947dd),LL(0xfbb2d23f,0x1b677675),LL(0x16da518b,0x12a4c8c1), LL(0x032c0bc7,0x1cccf6b7),LL(0x20ed64ed,0x5b7cfe57),LL(0x5269cf39,0x7d427f2c),
+ LL(0x8d53b039,0x7faea5da),LL(0xacb5b11a,0xf19f5f61),LL(0xfe27af9c,0xfd679e18), LL(0xc0e391aa,0xbe29ec0c),LL(0x8cef3cd7,0x42a815d2),LL(0x42c2564f,0x3dd43747),
+ LL(0x6370d284,0xbaa0ccdf),LL(0xeb70e670,0xb68dae3c),LL(0x9917aadb,0x5e25db51), LL(0x57c8020e,0x27888369),LL(0x0cd601a7,0x4ca76fa7),LL(0x4509eeb6,0x46794e0a),
+ LL(0x4538b5b5,0x9f21619a),LL(0xd6754ebf,0x6c1f3f7b),LL(0xb7b2f926,0xa2a0e2e7), LL(0x42728394,0xc5747d30),LL(0x0a0328e3,0x2662cd33),LL(0x3bfbcc49,0x89c445cf),
+ LL(0x96bba2f7,0xce07c166),LL(0x93dfae9a,0x6828eab6),LL(0x4036abaf,0xa907dcce), LL(0x6cd5853d,0x61e23034),LL(0x331dc277,0x541d6f4e),LL(0x82796b5a,0xdaa10e8c),
+ LL(0xfac61d43,0x339d6949),LL(0x75b34910,0xedc8bc2f),LL(0x1ee6f866,0x4c686fe9), LL(0x5f02368e,0x9bc462bf),LL(0x638abf60,0xc3902774),LL(0xb7ed5413,0xc403b179),
+ LL(0x664e0b41,0x35bf0ed9),LL(0x889af4e3,0xc3ad5755),LL(0x5153a58d,0x14291828), LL(0x64798a76,0xb3d9c453),LL(0x827c237a,0x71e6ce15),LL(0x41e52b67,0xbbcce06b),
+ LL(0x1a05cd67,0x523df124),LL(0xf104c7c7,0x969598b8),LL(0x7f7b1fa6,0xc16d7bc1), LL(0xfb1a2aa4,0x935b18e9),LL(0x4f99ebf4,0xba7ff2a2),LL(0x862cab62,0x0613fa7b),
+ LL(0xd8d26e75,0x02f5cfb1),LL(0x98906c57,0x5e0d4363),LL(0x1032e39f,0xca80873c), LL(0x204c0680,0x2fa5b881),LL(0x7c178dd3,0xca227906),LL(0xdf2e321b,0xba33bb48),
+ LL(0xd9a13914,0x4cbde5bb),LL(0x621b5b3c,0xaa89d2d4),LL(0x75821515,0x66fd1db4), LL(0x66154f11,0x3e616070),LL(0xed85f2f5,0x2dde1732),LL(0x528e1b57,0xfa1fe78f),
+ LL(0x600e571d,0xb51f5c95),LL(0x15059c58,0x13f0e99e),LL(0x72e8f443,0xe2a1a34e), LL(0x2285a044,0x5c484292),LL(0x908d9855,0xac4b6bdd),LL(0x8cffdb0a,0x4b4ac5ae),
+ LL(0xd691153c,0xf8f74a29),LL(0xd21533bb,0xc0cb0e05),LL(0x86067d1d,0x52ceb52e), LL(0x9cd93bda,0xeb021228),LL(0xd7c98d3b,0x27d7ef30),LL(0x78fae7b9,0x7c18f1bf),
+ LL(0x5ef7655c,0x1b3562c7),LL(0xb552fd07,0x62ce6adb),LL(0xb9c6217d,0xac6f179d), LL(0x7fb8394e,0x3b329c45),LL(0x9b340753,0x418d2ac5),LL(0x68c5c9d3,0x5adca639),
+ LL(0x15b71702,0xbfd6f204),LL(0x569ed998,0x292bfd32),LL(0x003d0141,0x5b5d5b09), LL(0xefcd36d1,0xd512f4d8),LL(0x16c87812,0xc81f1c34),LL(0x1777dcaa,0xa54cef3e),
+ LL(0x76585d99,0x53830298),LL(0x30d1c285,0xe2d41a7b),LL(0xad60f2ff,0xb6eabff3), LL(0x3d361b12,0x073639c4),LL(0x16f921f3,0x10e605bf),LL(0x3394e5eb,0xff665c90),
+ LL(0x359bf1b9,0xadae33b1),LL(0x61554e45,0x183beb7e),LL(0x559e3f90,0x28d50fcb), LL(0x4bc0b8cd,0xa9a26299),LL(0xb403463a,0x25b24e6a),LL(0xf076ebd6,0x715055a6),
+ LL(0xd381a2e0,0xa6b7fe33),LL(0x6b248193,0xc2aacec9),LL(0xc9d6ba70,0x1f617084), LL(0xcd06c9a1,0xce945304),LL(0x1b4c3d5b,0xb957b98b),LL(0xfa6b8f04,0x50c61d1f),
+ LL(0xdaa47b46,0xbd69e6d9),LL(0x7a9479bb,0xc12cbd8a),LL(0xa8b92f63,0xf07cbcd9), LL(0x27d2f85e,0x4998f584),LL(0xbf43ba36,0x0ab2e076),LL(0xbad0d0a2,0xbed73de0),
+ LL(0xad129e1b,0x3e02902b),LL(0xa008c72c,0xd2e0bd57),LL(0x30e61c2b,0xe88a075a), LL(0x5d9402a8,0x136e1b7f),LL(0x7bc0a653,0xaa06f30f),LL(0x068e6e0b,0x51b52693),
+ LL(0x695404da,0x0bb86a49),LL(0xb1059de5,0x339cbbca),LL(0xdfc1bfa7,0xd45db64b), LL(0xa98831bc,0xad07e52d),LL(0x51a7a71a,0x5ef54a92),LL(0xee02c742,0x7fda785f),
+ LL(0x6686a65a,0x05b7848e),LL(0x6f478ff9,0xc12a7893),LL(0x2d137586,0xf1f54c31), LL(0xd50ea873,0xfe8799f4),LL(0x5fabdd98,0x62d996af),LL(0x5181afce,0xf0fe39fd),
+ LL(0xef010cef,0x646b35f9),LL(0x7d54d120,0xa63852dd),LL(0xadec6e34,0x3e5c14f4), LL(0xc2f4b7e6,0x030270aa),LL(0xec560a92,0xdedf4875),LL(0x9da64c53,0xd6d97f65),
+},
+/* digit=5 base_pwr=2^35 */
+{
+ LL(0x1386b66e,0x18754788),LL(0x9a2eb0d8,0x783dc08a),LL(0xf074e5e1,0xfe2682d1), LL(0xcbf4f5b8,0xb6ab7696),LL(0x6da5b0aa,0x382401e6),LL(0x0f93d45d,0xfd5a6375),
+ LL(0x6fefd17e,0x51d517b8),LL(0x18fba339,0x35e97b40),LL(0xcf221c7b,0xbdc8467c), LL(0x9eaee11c,0xba6035ff),LL(0x18128100,0xb417857d),LL(0x4f40acec,0x383235c3),
+ LL(0x4197bc61,0xdcfc9f38),LL(0xfe9c1104,0xeb61eb5e),LL(0x5486c84c,0x7ba40c29), LL(0x1377a769,0x2f6a8ebc),LL(0x914c369a,0xe4e70f07),LL(0x57afc5f6,0x8d954007),
+ LL(0x0fa7e4d2,0x56b010d6),LL(0x1d9544ef,0x91cd7d72),LL(0x48b3fb02,0xe2c51636), LL(0x683588bd,0xa2440769),LL(0x98239b52,0x7054bb40),LL(0x3bb5090c,0x2019db99),
+ LL(0xf043605e,0x6da23d19),LL(0x69d16792,0x4f2d4a4f),LL(0x6d5127a3,0x5061d4c8), LL(0x71c846bd,0xa0ef332c),LL(0xca929e1f,0x7948a241),LL(0x0baf2f1a,0x4152aec5),
+ LL(0xdc72a138,0xf15dd5cb),LL(0x91a32dbf,0x6d2d2597),LL(0xfd5852dc,0x7f46cffd), LL(0xd817364b,0xda270e8e),LL(0xa1df99e0,0x97e5e85f),LL(0x5a90c0ae,0xc77a3a0a),
+ LL(0x19a3eb23,0x1636651c),LL(0x12294385,0x34a5e78a),LL(0xec25d3d6,0x71cac725), LL(0xe5aa03cc,0x98956393),LL(0xf1d2e766,0xcda62f63),LL(0xf7c046ed,0xb8c8909f),
+ LL(0x1578b888,0xb68a6a3a),LL(0x30e1dbfd,0x01e39894),LL(0x71dafb3f,0x03ca0487), LL(0xf8241fab,0x7690a577),LL(0xe64d2bb7,0xac71ef0b),LL(0x3eae3938,0x4fd69e13),
+ LL(0xa2e02fc2,0x7a04ff5d),LL(0x75b01d9c,0x11114bbf),LL(0xe08f4299,0x1233f026), LL(0xf491d93a,0xd888bb1c),LL(0x07c1f414,0x7c6fc026),LL(0x97d8d7df,0x753a2913),
+ LL(0xea21ec86,0x0fe566b4),LL(0x75ddae93,0x743f5133),LL(0xee43927e,0x0173fdd9), LL(0x8b3a99d1,0xe9491f6e),LL(0x90e9d60e,0x6af11d34),LL(0x373fafeb,0x7ca50de3),
+ LL(0xb53b609f,0x3a3eaa6d),LL(0x1cf1fa53,0xcafff213),LL(0x2cc998b7,0xb64116ef), LL(0x8eac5d3a,0x63148b28),LL(0x1dc633b7,0xff5f7662),LL(0xc94b635d,0xf174dcd1),
+ LL(0x013644fb,0xdf0f0994),LL(0x526fa9f2,0x77369779),LL(0x4197eb1b,0x41ef1970), LL(0x22cb653d,0x7bf4bf00),LL(0xb7dd509f,0x94f0f226),LL(0xbe77682f,0x5fd7dd2b),
+ LL(0xf658d2b2,0x80435f56),LL(0x5f8cc779,0x1e864847),LL(0x8b56aaf0,0xdd4cb7e9), LL(0x72c3024f,0x458c8bb7),LL(0x8cffdca0,0xa5c186c5),LL(0x377f96ba,0xc0022799),
+ LL(0x1f7d9343,0x7e4d4404),LL(0x299cd36e,0xa496646a),LL(0x600decf3,0x06372825), LL(0x08bf05fa,0xe19b609d),LL(0x1b7e153a,0xfe6a7182),LL(0x9808f5c7,0xfe191f76),
+ LL(0x2a8c6b66,0x2c13eeb6),LL(0x0fcafcfc,0xcd3cc6d3),LL(0x236f08ff,0xb85a615d), LL(0x14e4e83c,0x92187d5e),LL(0x21979d04,0x5fdaaa79),LL(0xe519147a,0xed2d2008),
+ LL(0x02fe620c,0xd8083896),LL(0xde8984fb,0x277803e8),LL(0x7058d34c,0x2698ed9f), LL(0xbce1dcc3,0x00b9c0d3),LL(0xbc2c1c85,0x356b310e),LL(0x67cacabb,0x41e412dd),
+ LL(0x2790dc4a,0x396267ca),LL(0xd5bfe8c6,0x5d4593a3),LL(0x335a7f8d,0x5fddd3d4), LL(0xab0ac92c,0x92f002c0),LL(0x6226c031,0x590a93b2),LL(0xdfe775be,0xb3c10c49),
+ LL(0x85889144,0x0209bd99),LL(0xb9b83e2d,0x77df1ced),LL(0x4cca6a2d,0xbf9f5870), LL(0x35978ee6,0x2c4f310e),LL(0xeae8acff,0x98debae5),LL(0x778c9461,0xf2f40fc1),
+ LL(0x9d363814,0x4c6c9e7e),LL(0x7b9d3d53,0x52fe5e06),LL(0x9cecbe7a,0x19bd3915), LL(0x272c9325,0xcbce0a07),LL(0x6a7c9eaa,0x48336f5c),LL(0x77a17578,0xd234b427),
+ LL(0x3ca7e0eb,0xb22492a2),LL(0xc5a32881,0x91ba7704),LL(0x00d1425b,0x5a2a7f1e), LL(0xbc09eeae,0x6b15d61f),LL(0x86b7bff1,0x2e8f822c),LL(0x32c4dd9e,0x56357b66),
+ LL(0x51e3d663,0x74a1f2c6),LL(0xa42a3633,0xf42faf2f),LL(0xf6e193fb,0x1b1be8b6), LL(0x4200b0ee,0xb647f284),LL(0x02d4935e,0x0950b424),LL(0x4deee646,0xdbdd7c52),
+ LL(0x77c3a95a,0x15c8ddba),LL(0x6ba71f9c,0x901a11bd),LL(0x440741f5,0x54fc905b), LL(0xf1358db4,0x4b6b0fc5),LL(0x6ed93612,0x3c4c39a3),LL(0x395cb400,0xa764c9a8),
+ LL(0x2b54f47d,0x089cc68e),LL(0x4fa19e45,0xd6f94042),LL(0x62803448,0x52875bc1), LL(0xdf571d9b,0x1f43a201),LL(0xff9a0750,0x9e8645cd),LL(0x61a710d0,0xa177f4bb),
+ LL(0xddae695a,0xd55cc687),LL(0xe7471217,0x90d2c914),LL(0x917d18a0,0x884f4e6d), LL(0x744d11d9,0xd2871c7d),LL(0x02972782,0xef60b7d8),LL(0x2531f9a0,0x491aa401),
+ LL(0x8f0f3404,0xf881970a),LL(0xe6a7678b,0xb681fd66),LL(0x45c5eec8,0x673a8192), LL(0x216460f1,0x39e65db1),LL(0xee6d42eb,0x28cd720e),LL(0x08badd82,0xcf155154),
+ LL(0xf5c7d936,0x35ab0302),LL(0x7eee29e7,0x0a6d5f94),LL(0x7ed08644,0x03232350), LL(0x6d2a8356,0x505064a6),LL(0x979af3f3,0x6e9937d1),LL(0x0758cb3d,0xec148fcc),
+ LL(0xa047cb43,0x46a50ee9),LL(0x2c02de4c,0x6c6b569f),LL(0x3d95c934,0xcd21154d), LL(0xd55720da,0x3a14afa6),LL(0x5512e601,0x6ceee63b),LL(0x4c47b641,0xafe6bbff),
+ LL(0xf19e974d,0x717ac089),LL(0xf71eadf4,0xfb0cebe8),LL(0xe85c30e2,0x503535ba), LL(0x072130ee,0x05e57133),LL(0xa8037e5f,0xf33e81ed),LL(0x3f0c555a,0x4b33d96d),
+ LL(0xd71f6adf,0x47ff2d79),LL(0x7a985d02,0x88a9de0d),LL(0xb2dc0cc5,0xc9cc2822), LL(0xfbc2972b,0x38052b28),LL(0xbc8465ba,0xdaecc9da),LL(0x7ff5a249,0xaaffa0d1),
+ LL(0x60361946,0x4f326618),LL(0xae1695c7,0xe7eaffff),LL(0x1311036b,0xa7aed10b), LL(0x9eb2dfa7,0x6eb81e71),LL(0xf680fea3,0xeda95d34),LL(0x83630d7a,0xd2ab66c5),
+ LL(0xb891fc22,0xa7433cf1),LL(0x1111e0db,0xdbea5480),LL(0x658341c1,0x823a8595), LL(0xe2d8917b,0x7a171afa),LL(0xe713e015,0x79e4154d),LL(0x3ebc430e,0xbd07aa2c),
+ LL(0x0523f8b0,0x091a19d2),LL(0x0950ab93,0x9fbf9c8c),LL(0xfbb731ea,0xd8377e50), LL(0x18b26813,0xe3b8b5bd),LL(0x1bc1257d,0x78a16f16),LL(0xcfd383ea,0x837106a0),
+ LL(0x11c7579c,0x01e9427c),LL(0x1580ef3e,0x24504560),LL(0x0b447ba0,0xd7408db5), LL(0x0e1cfc39,0x6749f5e6),LL(0xdfe158ad,0xd26d7dbf),LL(0xe7b17909,0x66d731fa),
+ LL(0xea86e123,0x46d3addc),LL(0xe46c37d8,0x3b52f72b),LL(0x8036a8e6,0xda02c7ee), LL(0xfeeaba0d,0x9f141b52),LL(0x0049be34,0x7a66cbac),LL(0xb9de2e84,0xc5b5d9d0),
+ LL(0x6d15b711,0x190e0e24),LL(0xc7ca01a7,0x4eec20f0),LL(0x7803ca5d,0x12ff14dd), LL(0xd59fb3a4,0x84991c92),LL(0xc64b50b6,0x86a00ae1),LL(0x175bbf50,0x6bf38341),
+ LL(0x5310953f,0x3cd33d82),LL(0xef7027f4,0xcf3d011e),LL(0x3eee08ca,0x10779dfa), LL(0x31f432ec,0x2c3228c4),LL(0x7f319ca8,0x94c51072),LL(0x3cfe5d7c,0x2ac3a2fe),
+ LL(0x4acc7cc4,0xe2ccc5e9),LL(0xff58443f,0xfedc0da8),LL(0x9567fea7,0x776014d0), LL(0xa2b90e62,0xbca6d7b2),LL(0x164be21a,0x11148f7f),LL(0xfec4a5f1,0xebbdf677),
+ LL(0xca5a2ef0,0x4bd9a436),LL(0xfd095c81,0x320744ae),LL(0xc307a816,0x3da008cf), LL(0x2f6801e7,0xc5cc3ff9),LL(0x4407869e,0xf0ba2f46),LL(0x213338b4,0x6eed1a15),
+ LL(0x274dd179,0x7fa61ef4),LL(0xa631cf50,0x6e6453fd),LL(0xb86291a1,0xaf1017f5), LL(0x9cf7ace4,0x757564ec),LL(0x2535cbaa,0x0fa1ec1c),LL(0xbc9b95bd,0xc03cec64),
+ LL(0x7686669e,0xfbcb2d77),LL(0x6cdcb0f1,0xf9bed26f),LL(0xb5a8f081,0x37aff505), LL(0x6053e4cc,0x1f258d7c),LL(0x45bc699e,0x86384c5f),LL(0x25a2f865,0xe0025c0a),
+ LL(0xb24a8eb1,0xea42c8e1),LL(0xdc2dd956,0xf670d8ea),LL(0x035bfb42,0x71d4c32b), LL(0xe7824aa9,0x213fce6d),LL(0x4b22f111,0x9b34d5b0),LL(0x3a14d9cd,0xa299994c),
+ LL(0x7ba4a4bd,0x975d551f),LL(0x32d65fb4,0x862bc216),LL(0x151762af,0xfaaf16ad), LL(0xcd1fe1b3,0x931eac72),LL(0x00f9e6e2,0xcd730742),LL(0x85ccbcf2,0x581b13c3),
+ LL(0x559cb856,0x013ed0f3),LL(0xd22cf5f3,0x5c1af1b5),LL(0x3badc3ca,0x11b231ec), LL(0x68ce4eac,0xc22972b9),LL(0x1a2f55b5,0xcb92e129),LL(0x038e230a,0xa61289eb),
+ LL(0x309e8cec,0x625ac394),LL(0x49b13bac,0x99dab1a7),LL(0xdf48a436,0x77940cbf), LL(0x78881636,0x963cb651),LL(0x7541e4c5,0x889ac28e),LL(0x5407fbf2,0x39918bd5),
+ LL(0x69209c9c,0x63d26894),LL(0x255dc3aa,0xb6b122cb),LL(0x932b582c,0x12866e42), LL(0xc373f8ad,0x0b0a7dd0),LL(0x1fe0f36b,0x2fed9f9a),LL(0x2345d1f2,0x6dbbf47f),
+ LL(0xdefc4c20,0xdf69b818),LL(0x2e3eb2cb,0xf31ff9a8),LL(0x0be0bfa6,0x946578a6), LL(0xe8b31f47,0xbecddbf2),LL(0xa45fadaa,0x86e3594c),LL(0x999c547a,0x56d2d2e3),
+ LL(0x3b5a1df0,0xcfe909ee),LL(0x94fd4014,0x4b62c64a),LL(0x258a8f81,0x7d6e3ae9), LL(0x5804ee7d,0xfc15381b),LL(0x71710702,0x3b444911),LL(0x5f18965e,0x46497ae3),
+ LL(0x33dd9555,0xfbb99cfe),LL(0xfcbeecde,0xc6e14198),LL(0x51da2e20,0x8d4e83b3), LL(0x75a0719b,0x2bc54a6b),LL(0x56b03328,0x1aba20d3),LL(0xede40907,0xd84a7db6),
+ LL(0xeae9291d,0x6f52a996),LL(0x33d0f1a3,0x507c3701),LL(0xafebeab2,0xb7809c3c), LL(0x80b978c3,0x301a5ed5),LL(0xd10f0edd,0x1ba9c42c),LL(0x150d6504,0x0e9f9f93),
+ LL(0xee90dfeb,0x56ff221e),LL(0xc6815c60,0x279a7940),LL(0x1b0208a3,0xa119572a), LL(0xd2710835,0x5bb04e27),LL(0x67414bf2,0x61d8d945),LL(0x6aec6a5c,0x440a1d39),
+ LL(0x1ecc000e,0x07e60a25),LL(0xe6efdc85,0x2325aab6),LL(0xf4872ceb,0x29438ae3), LL(0xe8d10241,0xeea2a3f2),LL(0x548a7556,0xd2ff366b),LL(0x2a6e27bf,0x85e8ada2),
+ LL(0x11a6e295,0xb10332e7),LL(0x609a424a,0x44c9ba0e),LL(0x986e93f0,0x08f222e9), LL(0x9dcb7c9b,0xeb8bea94),LL(0x1d5aa8a0,0x36e44e93),LL(0xa3e0dccc,0xe0deccc6),
+ LL(0xc22e314b,0x92be41b1),LL(0xaabbe524,0x388494bc),LL(0xbde2517d,0xaaf52dfe), LL(0x186fedfc,0x4ce61d88),LL(0x300b7bc2,0x9f29e844),LL(0xedab8ca6,0x03a2221d),
+ LL(0xda0cae4d,0x7c3f687b),LL(0xe7da757e,0x84dc6167),LL(0x85d25286,0xc0c08f69), LL(0xb4889367,0x17f7921d),LL(0xf81fddec,0x223c9181),LL(0xa6a05bf7,0x3b72e938),
+ LL(0x60326fa4,0x0ff61ea1),LL(0x97c51293,0xa54cc228),LL(0xf976ab17,0x7d25531f), LL(0xa8f84662,0x1e8c3f37),LL(0x007ac2f1,0x4d8c3063),LL(0x4598d053,0x80c8de31),
+ LL(0xe4198b95,0x3ed83a96),LL(0x90ef6fa9,0x4435dc6a),LL(0x9ab2a2d6,0x47791ebf), LL(0x1564b80a,0x3e0c8b07),LL(0xa0ec1ad9,0xb4079d88),LL(0xee9bfef8,0x6fc566af),
+ LL(0x7f1a5c21,0xbfc3ee41),LL(0x2727a00a,0xe3694ec6),LL(0xa4087b70,0x3ff4d181), LL(0x37de763e,0xda656043),LL(0x8a50ec66,0xc2da4f75),LL(0xb94a5c19,0x096c88ff),
+ LL(0x3121ec7a,0x05e200b8),LL(0xf23f234f,0xc5f282e5),LL(0x94aebbc2,0x0d95e5bc), LL(0x6922306e,0x389ff8bd),LL(0x0c458f95,0x949a4362),LL(0xa8a67759,0x2ed544e9),
+ LL(0xd643944f,0x46d3e81e),LL(0xa5cfb8de,0x36211db8),LL(0x95b4f959,0x8a5ee9eb), LL(0xcd19ebcd,0xc3d6941b),LL(0x61306b29,0x4bc41c81),LL(0xeac1ab81,0x0093af39),
+ LL(0xe6622883,0x301a7d6e),LL(0x270ac148,0x5c49e719),LL(0x4bbec99b,0xff3296f0), LL(0x80061376,0x880c775d),LL(0x322403c9,0x587357fe),LL(0xc24a4307,0x4db2f9fb),
+ LL(0x76f5e74e,0x3a8b93a4),LL(0xaa1b2dd8,0x5e9e5474),LL(0x5ad377ae,0x43c84363), LL(0x8b7ef6de,0x3ef3ceea),LL(0x7be9f363,0xa3457c60),LL(0x6c4f30eb,0x8a0c2c94),
+ LL(0x3eef5158,0xc50fa97a),LL(0x86d6a054,0x52c0d8a2),LL(0x3be5c327,0xebdf472b), LL(0x0852c07e,0xc34b020b),LL(0x42fa2f1c,0x5b2b3552),LL(0x3a4f7817,0xbff68be9),
+ LL(0x959b0d24,0x2cf2220a),LL(0x56dd4a59,0xeb164f48),LL(0x9d8fff97,0xd9927903), LL(0x233eaa77,0x0ddf5e1b),LL(0x7969f9e5,0xf32d29d8),LL(0x5562cc50,0x26ee53ae),
+ LL(0xf53c8cf7,0xcbc8f03f),LL(0xc7ff11a2,0xb6321218),LL(0xb9346795,0xb37d632a), LL(0xaf7e83a5,0xbc24e219),LL(0xe6dbd3da,0x95b4863a),LL(0xcfb3f25e,0xc3f00af4),
+},
+/* digit=6 base_pwr=2^42 */
+{
+ LL(0x097b6df3,0x807a7671),LL(0x0fb780e0,0x41faf5e2),LL(0x157c3ef1,0xdaa12450), LL(0xd7cb0c23,0x31d72356),LL(0xb251a877,0xd5d2c185),LL(0x92fa894a,0xdbdaee99),
+ LL(0x98704ce6,0x85e18802),LL(0x306d7501,0x25a349dc),LL(0x03de69b2,0x6c5ba821), LL(0xc403903d,0x9fd2d533),LL(0xbf5698ac,0xe3b96ca6),LL(0xcc20c102,0x7d5e41c1),
+ LL(0xcc888fdc,0x6d434dd0),LL(0xed221a04,0x47e731b4),LL(0xa107a3c9,0xda0d85b5), LL(0xebf163d0,0x489780a7),LL(0x9892bf9b,0x1ddd62aa),LL(0x04e0db7d,0x7f988bcb),
+ LL(0xe492a9fc,0xb55c1496),LL(0x597a9eb3,0xd0cd80f2),LL(0x9f1d8391,0xeaf34b51), LL(0x785286c4,0x81e7ca50),LL(0x6c0c5297,0x5b63c071),LL(0xb1b52561,0xa09ca533),
+ LL(0x19fafaf2,0x082de97f),LL(0x25cc03ed,0x92de16ec),LL(0x0fabb7cf,0x415b7e1c), LL(0x721659a0,0xb121761c),LL(0x4a3f2f1d,0x2c646d3f),LL(0x13cef73d,0x6c441f7c),
+ LL(0x26cc7cca,0x7d4281a3),LL(0xe302e412,0xf9d8fdf7),LL(0xed1531b3,0x9b29a767), LL(0x8daae632,0x9713865b),LL(0x51561f0a,0x5c4d8193),LL(0x74daf2a8,0x786d917a),
+ LL(0x08c24f78,0xf4b82a3f),LL(0xe3565350,0x82c57c65),LL(0xc56bf74b,0x92213214), LL(0x066173e2,0x51cf2f2a),LL(0x22931b9e,0xb67e7f28),LL(0x0e448ae2,0x87983d74),
+ LL(0xcd93498b,0xa08d39d8),LL(0x81fb94c6,0x98c24fae),LL(0xe2ec50b6,0x2c1f6da0), LL(0x703366fa,0x96b60285),LL(0x6ce66461,0xa46d2ed9),LL(0xc7bef52c,0xaf14665e),
+ LL(0x614dfb0d,0x03487de0),LL(0x950342d5,0xae8d0e16),LL(0x77195a73,0x4f2ab2f7), LL(0x9757d4ae,0x0cfdcfec),LL(0xe42519f0,0x20cca44c),LL(0x4b2eb661,0x3a973637),
+ LL(0xf0c80fdb,0x5ed30224),LL(0x9d39980f,0xb74201d0),LL(0xc2a6b759,0x705dd1b2), LL(0x080941d1,0xd6535dc8),LL(0xd279a85b,0x0d532b08),LL(0xa6c95800,0x55279407),
+ LL(0xed2f99c0,0xa5e5dccd),LL(0x26335c8f,0x1d51b65a),LL(0x08067e36,0x930c04c4), LL(0x0583c23c,0xb14d764c),LL(0xe5be4e67,0xe9f1f8b8),LL(0xd3b9a111,0x2b684b5a),
+ LL(0xce971c7a,0x9420fabb),LL(0xc95e25ab,0x3ade0eab),LL(0xa490d8c4,0x350f2e80), LL(0x3f6eb3a6,0xa76804d4),LL(0xe63fd72e,0xd2ce7028),LL(0x85be7c39,0xb27222e2),
+ LL(0xfccf002e,0xe372c921),LL(0x514dc3ea,0x96a39294),LL(0xdad77509,0x4e6aeb46), LL(0xd37b54ed,0x9a5799a8),LL(0xfc0e43fe,0x64a87cee),LL(0x753b6b4a,0x7f05b1aa),
+ LL(0x549af75f,0x807a2862),LL(0xd359bf07,0x1c8b5f7e),LL(0x95d01de7,0xf52d3291), LL(0x5ffe6146,0x7a461465),LL(0xe83b1659,0x224a8202),LL(0x470e8470,0x01236b76),
+ LL(0x61865ca5,0x6208d875),LL(0x9571dfd5,0xa1a42854),LL(0x2d2d7940,0x6d5edb28), LL(0x6ff2b93c,0x8af66e50),LL(0x1baad60c,0xb6eb8e7d),LL(0x4a16a63e,0xbe114d2c),
+ LL(0x388a91ae,0xbb783662),LL(0xc9cc2382,0x34e00a1b),LL(0x2aa28a74,0x66d0d031), LL(0x6fbf826c,0x5c0cc1a7),LL(0xc1ac7477,0x78033af5),LL(0x9a21f372,0x1d7e2839),
+ LL(0x5af2db66,0x036516b8),LL(0xab38cfc3,0xd3fec155),LL(0x416d0d54,0xa6e7d1b4), LL(0xb397c8ca,0x9d762998),LL(0x4467324b,0x73e4c3a2),LL(0xbf7ada2d,0x9f7dd282),
+ LL(0xc9c10ad9,0x3f452c2a),LL(0xb2609a4d,0x7a827181),LL(0xe31734f3,0xfb87d393), LL(0x2bbf4efe,0xdafffdda),LL(0x9837686b,0x53193aba),LL(0xd61a044e,0x17401c18),
+ LL(0xf7fe6834,0x8561d6d5),LL(0x040422c5,0x20eee370),LL(0xc924342e,0xa16cd1c2), LL(0x0aba73e6,0xc017dbd6),LL(0x9e7b1683,0x209b1479),LL(0xf14b41af,0x4a639bbb),
+ LL(0x0be4ccf0,0x59308c11),LL(0x49cc5fa5,0xa69616fd),LL(0x35696487,0xed6dfed1), LL(0x1657ce60,0xdef27e77),LL(0xab4a8d76,0x346c3382),LL(0x98a008a6,0x54c10f0e),
+ LL(0x9d792671,0xbda7a3ff),LL(0xae4fafb1,0xab2ba801),LL(0x79f9c043,0xe27406e3), LL(0x14bcd570,0xefff1790),LL(0x80a00e1c,0xae57b991),LL(0x7b38c603,0x63b01e35),
+ LL(0x388ceb24,0x7f1b2eef),LL(0xadc25ce7,0xbf81721a),LL(0x6ae36f35,0x1fd0c684), LL(0xfa611602,0xdae9c8db),LL(0x3f40a562,0x9d7b2264),LL(0x9e4cec86,0x64de9a7e),
+ LL(0x396229d2,0x413e342b),LL(0x0afa76eb,0x97291d8c),LL(0x790ad9ca,0x18f63384), LL(0x307ad8f6,0x90deccfd),LL(0xcc49b61a,0xefb21d4b),LL(0x3d724666,0xcda971d5),
+ LL(0xb10df2cb,0xe1a0e3dc),LL(0xe9334feb,0xe5509cd4),LL(0x38f21828,0x4dae1419), LL(0xe9309400,0x932c62f1),LL(0x289fd6f2,0x14acca95),LL(0x4e1325f1,0x92934423),
+ LL(0x0edb12da,0xbc9bd40a),LL(0x3cd6bd8d,0x78f3256c),LL(0x644bdf08,0xb8fe8191), LL(0x314f2c73,0x3ba94523),LL(0xf3d8e905,0x33ddf165),LL(0xdd9721f4,0x603ecb74),
+ LL(0x04e15cb9,0xa1a8d802),LL(0xe4eef1ba,0xb3bf09c2),LL(0xf7ea8116,0xfcaecf4f), LL(0xe68eb8dd,0x72f4dc39),LL(0x761271cf,0xeab7abaa),LL(0x51b8259a,0xfe99e9d8),
+ LL(0x625f396b,0x6325bcfc),LL(0x7ad03440,0x36560d57),LL(0xaa639416,0x76246bab), LL(0x8fd064b6,0x381de8c9),LL(0x95537e9e,0xe4c3f8ac),LL(0x6e56f0e3,0x0dd1b6fa),
+ LL(0xf065498d,0x96a10f94),LL(0x0038c2dc,0xf88a1867),LL(0xc58b18bc,0x0de21830), LL(0x9a5da75f,0xc86e1dd4),LL(0xb092c397,0x05e00843),LL(0x3154c419,0x2839c7bd),
+ LL(0x18ef22bc,0xf6457fe0),LL(0x1df42e96,0xbb096001),LL(0xdef286c9,0x1a337c91), LL(0x4580b8e7,0xd4bb225d),LL(0xa2ce3586,0x6bba9b93),LL(0xf2d150c2,0x9d51106c),
+ LL(0x943953ef,0x0a3f8284),LL(0xe9c8b50e,0xa6f7e5d6),LL(0x1bfa459d,0xe75546eb), LL(0x34529d4a,0x3846abb5),LL(0xe1da3b07,0xbbbd1f98),LL(0xfc1e8935,0x05a92469),
+ LL(0x6e52f511,0x3edb02c2),LL(0xe6cea9d0,0x0306e54f),LL(0x5fe7cc33,0x1944a8aa), LL(0x53fd6127,0x3da98252),LL(0xce628fe6,0x9d5fa436),LL(0xb3f9ba33,0xe7ccb20b),
+ LL(0x2b5eabc9,0x22d21323),LL(0x8ddb58d2,0xfa85732a),LL(0xc0a4b7a7,0xf80ab9d0), LL(0xefe1b0aa,0xe505f00a),LL(0xd93f46b0,0x1388c1d5),LL(0x94416a57,0xf44495f8),
+ LL(0xd1b9d175,0x3e5e07cd),LL(0x28229715,0x713fb4a2),LL(0x750b4e8c,0x6a1dc0df), LL(0xb1837ba8,0x2b9fe39c),LL(0x8a4e51e1,0xad0b8e77),LL(0xed0e4aae,0x823a02e0),
+ LL(0x5f16b838,0x8a9de11c),LL(0x95820340,0xfda67f12),LL(0xe5b3813a,0xaf424ffa), LL(0x1961cfba,0x8eccd1ab),LL(0xf3022e67,0xacea8ccc),LL(0x1522dd90,0x799ce2cb),
+ LL(0x85c6d5b4,0xad3a9564),LL(0x11a4286d,0xbf57a898),LL(0x86df6b27,0xeb453d87), LL(0x4baef190,0x676b9e41),LL(0xa947a521,0xf94b92ee),LL(0x71257aaf,0xdc1c303e),
+ LL(0xe1f3b4df,0x84384afe),LL(0xc6f889c1,0xb9f7ae71),LL(0x0dc943bb,0x2f227f6c), LL(0x994e3369,0xd7a6ccfd),LL(0x4042431f,0xf4480749),LL(0x54ff110a,0x4abda3ff),
+ LL(0x9882e341,0xd50de25e),LL(0xed0228e4,0x7e68284a),LL(0x794de327,0xcb751d4a), LL(0x99ac62a1,0xb3cb0de3),LL(0x0001de50,0x870815cf),LL(0x82c9f5fd,0x7957d4ee),
+ LL(0xbda3fcde,0x8760035a),LL(0x5734a5bc,0xf131439d),LL(0x1de171b9,0xbef8fa6e), LL(0xb076e2ab,0x35d32607),LL(0x8bfa83eb,0xb132de84),LL(0x1b272008,0x7ca46b88),
+ LL(0x4437ac91,0xbc0e5b55),LL(0x7381e979,0xd7cb1a53),LL(0xd154616b,0x906abe2a), LL(0x4c1b6f06,0xebc02151),LL(0xf2e0afa1,0x6ede04a9),LL(0xa50c46b3,0x7f666548),
+ LL(0x4abfde1a,0xda143ed3),LL(0x5fb5c163,0x968f5f5c),LL(0xc56b0f29,0xe9641696), LL(0x40766adb,0xcaade44d),LL(0x41a6905e,0xfac69f2b),LL(0x96dd9b54,0x8a2a6278),
+ LL(0xead8c9c2,0x3a498bf3),LL(0x38527bb3,0x3f5fdc4f),LL(0x5a898416,0x78259bc3), LL(0xd2bc2a01,0xd7f94979),LL(0x058e4b40,0xb28701a4),LL(0xddf1c2fa,0x9908452f),
+ LL(0xd85e5adf,0x30be2fcb),LL(0x492081e6,0x740f18cf),LL(0xd2f40d30,0x4d4090f9), LL(0xf3be491b,0x3770d2ac),LL(0xd47a45ef,0xad71d7b8),LL(0x85b820f4,0x0b2cd763),
+ LL(0xa83085f6,0x1d1f6f65),LL(0xf7b897d7,0x4643738e),LL(0x209fede2,0xa9ae5e94), LL(0x929a2b44,0xf63bafe4),LL(0xef7d17e3,0xeb605e21),LL(0x526ff05c,0xa858b5cb),
+ LL(0x3d3a82b9,0xd365dd2e),LL(0xcc2cfd70,0xfeccda5c),LL(0x344ed0f5,0x36ffafe6), LL(0x04ae99a2,0x934a88f7),LL(0xc20491ef,0x0af5b488),LL(0x7a66a1c8,0xcda2acb7),
+ LL(0xdd5e1098,0x2b25a1ea),LL(0x909058c4,0x345012e3),LL(0xb5670aae,0x965a49e2), LL(0x1766fa93,0xc31d4480),LL(0xd3941b2a,0xd6f8bac6),LL(0x6eb3985e,0x46cd2776),
+ LL(0xbf004633,0x4c45b908),LL(0xdec0c1bf,0xe6b9457e),LL(0x78c0aa4f,0x2c6f62d8), LL(0xf80fdbd0,0x32bd6508),LL(0x97f86a7a,0xaa4f54c5),LL(0x2eee225e,0xc3186238),
+ LL(0xca5d7fb0,0xc11da036),LL(0x79e6d224,0x2bc98024),LL(0x779b9f68,0xed3b8e2b), LL(0x2c18b348,0xac7614f9),LL(0x36c756d6,0xc2072c63),LL(0x35e4340e,0xa6c5e629),
+ LL(0x8d338dff,0x09c64919),LL(0x8d7f5e34,0x347f9f9d),LL(0x8044621a,0xd3012dad), LL(0x27327013,0x4520210b),LL(0xe20f7a66,0x9f76824c),LL(0x7b70408e,0xa136be56),
+ LL(0x455a2af9,0x4b1f9940),LL(0x48945af9,0x1385b4c9),LL(0xac68fc09,0x3da47592), LL(0x5f05a04d,0x533995d0),LL(0xd7c5146e,0xc20d45f0),LL(0x22d2ae20,0x351ffb64),
+ LL(0x7ab5d0f9,0xb5eb2af1),LL(0x7762a3a5,0xc5cc2409),LL(0x6b374f6a,0xc65f2281), LL(0x0f46e6ce,0x440d2fe0),LL(0xb868814b,0xde15331e),LL(0xee22f041,0xd1d2f6c0),
+ LL(0xee1b9004,0x9ff4734b),LL(0x2e67a085,0x062dc3a3),LL(0xde8f3162,0xb7ea5b38), LL(0x824c31e7,0x19ce04cd),LL(0xbc61fd9e,0x4252601c),LL(0xf45482d3,0x95c7e121),
+ LL(0x31057137,0xde58e0a9),LL(0x0cac0d1b,0x30c96d91),LL(0x9104641a,0x0daab9d7), LL(0x1fd0668e,0x9ea156fc),LL(0x977683f4,0x0f6b404b),LL(0xa30e9a24,0x7966c84d),
+ LL(0xbff9caf0,0xe79728e1),LL(0x90e27f5d,0x82d66ec6),LL(0xbc650306,0x5ea57c74), LL(0xb2a82b96,0xcbe5e4ba),LL(0xfdfca395,0x24199d5f),LL(0x06991511,0x0ccbd94e),
+ LL(0x7876e2ff,0x4c91e7e0),LL(0x5d650fe2,0xba74af49),LL(0x5c7b9759,0x6f6df70a), LL(0xed511d0e,0xa5be2df5),LL(0x0c9af38f,0x0f540f6d),LL(0xb785f2e4,0x646f1fef),
+ LL(0xcb1eb7ef,0xf07cd946),LL(0xdd475a7a,0x41582424),LL(0xeccd0cd0,0xecabb646), LL(0x20672fdc,0xb08c9043),LL(0xd4fabfa8,0x0a0e852e),LL(0x08465cac,0x2df86c08),
+ LL(0xaddeb802,0x4a9d718e),LL(0x19257426,0x442b8a24),LL(0xf292c043,0xe1bf4df6), LL(0xf420119a,0xd846f55a),LL(0xb81b55b6,0x883b5be3),LL(0x7fa04e04,0xd233b497),
+ LL(0xb25f824c,0xa72a9e9b),LL(0x148d4350,0xcd9fa1a4),LL(0xe649b6b6,0xfe7be423), LL(0x1f055a16,0x54ff5456),LL(0x99348b7f,0xc73dc1b8),LL(0xb58ae286,0x072f9ae0),
+ LL(0xa2f354be,0x17fbb428),LL(0x8e54a9f4,0xf07c8cc9),LL(0x26d6dff2,0xc5dce60a), LL(0xfb7068ab,0x73ba83b1),LL(0xd6ccfb08,0x7f786cdc),LL(0x298a0fd6,0x57ea8ba3),
+ LL(0x6c93cbfc,0xb4637d1a),LL(0xbdb72d64,0x3b43839c),LL(0xa8ecb34f,0x80874787), LL(0xd5e642b2,0x57d9b566),LL(0x7a9c42a5,0x923772c0),LL(0xff8b1b47,0x24629516),
+ LL(0x07ceeae9,0x120c441a),LL(0x07740927,0xe82c0626),LL(0x91dda975,0x82b56342), LL(0xe8904b5f,0x5ccadd6d),LL(0x72da2998,0x55dc6fed),LL(0x5595c1fd,0xa6d506c2),
+ LL(0xeab8eea0,0x1a6a3b0f),LL(0xcafabd92,0xdf46f04a),LL(0x297dbb29,0xc5e2814d), LL(0x71d1e312,0x39d8e04c),LL(0x265b4075,0xc7017a13),LL(0xf78fbd26,0x4c21493b),
+ LL(0x0b9f158c,0x5c28c603),LL(0x9a07acaf,0x33de6098),LL(0x0e9c4c73,0x7b77cebd), LL(0x498db066,0x62e1c44c),LL(0xe28af701,0x57f684b7),LL(0x1f8b8dfd,0xac841f0c),
+ LL(0x6bc2d75f,0x9ca86d3a),LL(0xe7876500,0xab63e1ca),LL(0x436712c4,0xab42a0ee), LL(0x1d001327,0x8aead0f1),LL(0xf0a70715,0xf563e655),LL(0x6f079f79,0x58f26dd9),
+ LL(0x2922bad4,0x2b795683),LL(0x83b5370a,0x16a63631),LL(0x2638ee32,0x530fec6c), LL(0x44d0b441,0x23b918a6),LL(0x4b00c9b9,0xf1ebe8e2),LL(0x5e410b3b,0x77681a00),
+},
+/* digit=7 base_pwr=2^49 */
+{
+ LL(0x1db6b479,0x22b1c723),LL(0x39e84714,0xd62f06f1),LL(0xe23256f7,0xdee9ec7e), LL(0x95968194,0xe889db11),LL(0xa9e6d7d7,0x11d66cd0),LL(0x62416021,0x09b2418b),
+ LL(0x6adf5658,0x0be70575),LL(0x73b1138c,0x17f6b55a),LL(0x2a9fc1a8,0xce3bcb88), LL(0x01211935,0x4edfa8ef),LL(0x9b82e1b6,0x8972dc1c),LL(0x3e9d7b44,0x84866f69),
+ LL(0xcee3c64a,0x3f2da340),LL(0xf63dc83e,0xfcedb4bf),LL(0x56ff2a25,0xdedd2aac), LL(0x250762ff,0x9b5af4ff),LL(0xcbf6e216,0xd67cbdc0),LL(0xae6521ed,0x1b147e2c),
+ LL(0xcfcb0905,0x5315d6ee),LL(0x1a685aaa,0x269200d9),LL(0xc1f724bd,0x96f1c3a3), LL(0x3025b425,0x3a231812),LL(0x39d51119,0xff7672e6),LL(0x85a58c8f,0x1280679d),
+ LL(0x1ee4c1e9,0xe004f1c3),LL(0x6695e2c7,0x51f5f62b),LL(0xad1a015a,0x4c8db9dd), LL(0x0175ea4c,0x141a6846),LL(0xdb97814c,0xf8e3d91e),LL(0xf678fa80,0xdb30a211),
+ LL(0x0a4bf8e8,0x6e08e548),LL(0x95d4a1f9,0xd1e1533e),LL(0x74eb6623,0x01c6b2d2), LL(0x584b99ba,0x9e3dcf2f),LL(0x44a872c9,0x1211df9b),LL(0x13cf855a,0x44d0a919),
+ LL(0x7a71a32a,0x689a8dc1),LL(0x0969c604,0x6862a375),LL(0xbe398e22,0xd324e9b9), LL(0xfe84fe60,0x2175c004),LL(0xa817cdb4,0xa607ef1f),LL(0x721cb883,0xcd9d9495),
+ LL(0x3a36ef0d,0x4f8ebef8),LL(0xf4ef55c3,0x5c910c5a),LL(0x2a959873,0x8ce26809), LL(0x376d6a96,0xc2132558),LL(0x026083f4,0xa6c1cfb2),LL(0x0d455653,0x46c5dbd9),
+ LL(0x8ba48c45,0x48969551),LL(0xc643319e,0xba14588e),LL(0x6164409f,0x79cc5f79), LL(0x7cd52144,0xbbcfa5ac),LL(0x01be08de,0x291192cf),LL(0x1b5535ee,0xe09fcd9b),
+ LL(0x8b222a3d,0x4e761342),LL(0x9ee6a22d,0x874f88e9),LL(0xdbb503a4,0xfb29bb24), LL(0x27a88472,0x1e5923d8),LL(0x27cc978b,0x968ac6a8),LL(0xb31d7b22,0x8cd1a928),
+ LL(0x0643e7f0,0xc14f22a2),LL(0x97a5e590,0xa920ca01),LL(0x2c3fef97,0x4e4e7c4b), LL(0x8e7baa94,0x0200b159),LL(0x16b1757c,0x24b9c68b),LL(0x6ca9d309,0x51ff6499),
+ LL(0x96b7c630,0x7b132fca),LL(0x63d2264b,0x8df911e7),LL(0x164dbc12,0xff71dd08), LL(0xcd036c72,0x2f7b92af),LL(0x24d891cc,0xf1336105),LL(0x66b47dc3,0xe614aee7),
+ LL(0x12ead645,0x1c53214c),LL(0x3c7f65a7,0x32aa24b9),LL(0x118a5225,0xfd7b67e9), LL(0xdad33487,0xf58a2515),LL(0x3a563a0b,0xa9ce4387),LL(0xd92455a8,0xad5dc427),
+ LL(0xaca6b802,0xfa852455),LL(0x26bfb5b4,0x448d6d2d),LL(0x0accc4e4,0xa76981e9), LL(0xfbedc1b3,0x2c43f05a),LL(0xdfa0cdbc,0x684e84d3),LL(0xb07a9af9,0x60fa3028),
+ LL(0x46cbf3c2,0x55adc2d2),LL(0x0ab9aba5,0x5ddaea63),LL(0xf06d91eb,0x457318d3), LL(0x3face92b,0x210c0bda),LL(0xc8cca904,0xcb6be0b9),LL(0xac932c9e,0xcc059269),
+ LL(0x3b076836,0x35440607),LL(0xcfbc594d,0x6e139ab7),LL(0x0f818173,0x24c24eb1), LL(0x4c3d9a9f,0x26b87e2a),LL(0x1fcc4242,0x03671da7),LL(0x643cbca5,0xd08f6b5e),
+ LL(0x69cce513,0x3b1962bf),LL(0xbbceb26d,0xe0091d0c),LL(0xf374c0a2,0xda304365), LL(0xa099ddf8,0x27a29bfc),LL(0x969c677a,0x5f53ba53),LL(0xf0627255,0x77b8d2a7),
+ LL(0x3819f9dd,0x221375dd),LL(0xe08b0ca2,0x04a971e7),LL(0xd46c54ac,0x5f7345a7), LL(0x93d0f966,0x8f01f13d),LL(0x6ef17236,0xf5cf276c),LL(0x0dd038f0,0xca0bba4c),
+ LL(0x525bd2b0,0x86ab6164),LL(0xa0a0d81f,0x0fddac9e),LL(0xe3827450,0xc5322927), LL(0x7081e340,0x5965a1a9),LL(0x427b0701,0x46c3aef7),LL(0x6692b94a,0x98a9fa7c),
+ LL(0xa495e99e,0xd2932e7f),LL(0xd82f6584,0xdeb528fd),LL(0xbe305394,0x93b3c1c1), LL(0x7d8622a3,0xa4cb19b6),LL(0xb6d5eb26,0x7b46a163),LL(0x9239f879,0x247e327b),
+ LL(0x57a9df34,0xa102051f),LL(0x1aaf0cff,0xe1fbc51e),LL(0x9fd0f53a,0xe533029e), LL(0x75a0f971,0xda45f13c),LL(0xfe0d2922,0xadee768d),LL(0xfc9bca7d,0xdcf7b7bb),
+ LL(0x39f2a51e,0xa84b4adc),LL(0xa4c4231a,0x9c257e5f),LL(0xe6835319,0x5dd04181), LL(0x276cf633,0xb2ea7ce6),LL(0xd0c18fe5,0xf245702e),LL(0xb338e5a9,0x994cccff),
+ LL(0x33e5c5c0,0x6ba4e93a),LL(0x258e8029,0xa7b7d1f8),LL(0xad202aff,0x304ea934), LL(0x54bb2c25,0x7b28d6b0),LL(0x50b1a4e9,0x624bdf85),LL(0x7ddc1ccd,0x2c1079d6),
+ LL(0x7bc06924,0xd757678b),LL(0x4a9230a8,0x761f6494),LL(0xa38af7ae,0x4a74e816), LL(0x55556207,0x5cb7e1ad),LL(0xf5417b00,0x51a88664),LL(0x78c7935e,0x48886cf1),
+ LL(0xc5ae666d,0x112a047b),LL(0xe0d72464,0xe3e8915c),LL(0x88f740ce,0x18fd8fe6), LL(0x67d49be0,0xa5843ed0),LL(0x91b85641,0x44616e3f),LL(0x40e3c66c,0xfc394c04),
+ LL(0xce689251,0x4d6ed19e),LL(0xf28dfceb,0x81078128),LL(0xc82c2dd5,0x71bade6c), LL(0xc7bf5e3a,0x20cfbae4),LL(0xd1983380,0x0d1c23fb),LL(0xfb5cb3bc,0xd56434b8),
+ LL(0x496c7720,0xdbdd0273),LL(0xd7c99031,0x20b010b3),LL(0x06d61176,0xf5ff610c), LL(0xd3631b15,0xa0b6ea34),LL(0xe950e355,0x1528b1e0),LL(0xf0c84a6d,0x6e27fab8),
+ LL(0xf55bab95,0x8e66ed20),LL(0xbc6b300a,0x63e73fb5),LL(0xab652058,0x753ebe56), LL(0x46319ffa,0x0d97e216),LL(0xfbb99b70,0xf605457b),LL(0x8829b2aa,0x03a28a89),
+ LL(0x0073b797,0x3eac149e),LL(0x9bfeb2fd,0x95792d96),LL(0x7dc85ebc,0x0ccf0041), LL(0xecc61042,0x449bf3dc),LL(0x986664d6,0xaa4fce55),LL(0xa8c146ef,0xbc5ee8ae),
+ LL(0x1ff1dcbf,0xd904f9b2),LL(0x5d8a1197,0x35a18d0d),LL(0x6e3d4745,0x3341db2d), LL(0x4b050939,0x6b1eec19),LL(0xd70a0a15,0x9c1fe3f4),LL(0xcdfdd83e,0x654fc4dd),
+ LL(0xe9ba38d1,0x4ebcf740),LL(0x7de3b4a7,0xb42141e4),LL(0x58b093ca,0x09454a65), LL(0xa475ef3c,0xa87bd8d2),LL(0xcd2de97b,0xa1e89c23),LL(0xcb134c1e,0xe3000fa9),
+ LL(0xe03d89fc,0x56e13148),LL(0x560317fc,0x737b874d),LL(0xaee37ff7,0x28ce8556), LL(0x600002bd,0x21a8f876),LL(0xd20a7373,0x11a46449),LL(0x849772fb,0x280be2ee),
+ LL(0x44d8341d,0x81aa4216),LL(0xcfc93e1e,0x413bbc51),LL(0x5cbb96ed,0xc61e7fbd), LL(0x348b93bf,0x183ffd78),LL(0x1a6cac3d,0xbc237f9a),LL(0x075f2c01,0xcbe09c38),
+ LL(0x05a97f5f,0x337c5514),LL(0xf04dfeee,0xc2e77233),LL(0x5bb4ca71,0x400f4852), LL(0x8553221b,0x9626c894),LL(0xb57b0765,0x11aa8bb3),LL(0xa12d3f73,0x543ce8fa),
+ LL(0x8faba6a0,0xf77adb46),LL(0x435376cf,0x1174ee49),LL(0xedd2bd00,0x19430a06), LL(0xe4cbbaef,0xbfdb0a6f),LL(0xfe5c89b0,0x3b520354),LL(0xbb7ab998,0x8acd5ed9),
+ LL(0x28bc63d9,0x4358e216),LL(0x6d84054f,0x1d99f606),LL(0x923248e3,0x8e24aa2e), LL(0x2d2082d7,0x004093da),LL(0x0c19a153,0x180e72ac),LL(0xa4539eb7,0xb4d8b7b3),
+ LL(0xab583068,0x850a27b8),LL(0xeacb954e,0x85790f5d),LL(0x533b4d63,0x49567edd), LL(0x2c83d758,0xeedc0e79),LL(0xfcced827,0xe007c1d7),LL(0x2000bb00,0x68232c77),
+ LL(0x2ab39a53,0xdce3a7d4),LL(0xe408976d,0x5401ad0e),LL(0xb9ffd974,0xfcd5a5e8), LL(0x06214587,0x6adae145),LL(0x3b0e57df,0x15d783fc),LL(0x35f73e2f,0x8d4a1061),
+ LL(0xb2e9c8be,0xf6b94404),LL(0xe122287a,0x57269f9d),LL(0x7f0b3575,0x3f9849e2), LL(0x691d4ea8,0x1d85bc98),LL(0xc811fe44,0xbf34f840),LL(0x6fdeeca9,0x188d1f53),
+ LL(0xda6d3dcf,0x78294002),LL(0xaddf5b48,0x3f86f8c4),LL(0x6f8761ea,0xca9c8dbb), LL(0xb56d54cf,0x6d4be379),LL(0x3d32e3d0,0x9504874e),LL(0x1b4d470d,0xe0959574),
+ LL(0x60c89192,0x03618e26),LL(0xec22e3da,0xa067fbde),LL(0x202d430d,0x5656229a), LL(0xc7703466,0x1f782bd8),LL(0xa0026a97,0x3b278178),LL(0xf1c08768,0xc86a636a),
+ LL(0x754cbc65,0x175ae3ec),LL(0x4f765d06,0xc6f3677d),LL(0xa11dc7c6,0x699a40ca), LL(0xc2c20678,0xf85e4e41),LL(0x3ee230c1,0xc4fd583c),LL(0xf604d6e1,0xfbf97e3e),
+ LL(0xc6e43d77,0xc2a7b60e),LL(0x5e09cfba,0x5c44a7ab),LL(0x20323a01,0x31279294), LL(0xd83e9122,0xbef510c2),LL(0x910635c8,0xce89cd72),LL(0x6525654f,0x40c3123c),
+ LL(0xabb9fa3a,0xe5efa39c),LL(0xd54d0553,0x0dd062d8),LL(0x5f654ea6,0x2447ebea), LL(0xb205ee7f,0xc6b30d78),LL(0x6b327d54,0xac800865),LL(0x2d494627,0x3564831f),
+ LL(0xbf996e35,0xe5612ddb),LL(0xb2c8a71e,0x82b679c1),LL(0xb8522766,0xadfb7763), LL(0x6edb7f6b,0x31f681bc),LL(0x6c1396b8,0x0ac77865),LL(0xc16391a7,0x4fec5edc),
+ LL(0x6a8ba5e0,0x79be8744),LL(0x76a3f5dc,0x9cad48d3),LL(0xd3a4a677,0x3b4ddd6a), LL(0x2427a393,0x53d9dd5a),LL(0x99061179,0xe3992757),LL(0xc5ab35de,0x9a76a0ad),
+ LL(0x270ecf31,0x18e8dbf5),LL(0x3f3da910,0x6723152b),LL(0xe687db02,0x74b53e35), LL(0x89fccc8e,0x72dd231b),LL(0x6ca0a007,0xdf98fe28),LL(0x9b8fc127,0x5c469a08),
+ LL(0xf7c47e53,0x3d45d6b3),LL(0x2bca9e62,0x830867c6),LL(0xcef81d38,0x84276d68), LL(0xcc30ac2b,0x60d227cc),LL(0xaa747e61,0x514c1992),LL(0x4ed869e9,0x90083817),
+ LL(0xf15ff76b,0x9c199d37),LL(0x4a4fc2fd,0x0e5ab91a),LL(0x25ed5ca0,0x142d9700), LL(0xc7398261,0x417bd5e9),LL(0xca5133ba,0x074f5397),LL(0xbbf69817,0xda80ec1f),
+ LL(0x29f549a1,0x66cc5bce),LL(0xd6af775a,0xbe183389),LL(0x7b066b44,0x492f66bf), LL(0x431fc807,0x0f1397b4),LL(0xe83dd557,0xb6f675ba),LL(0x62489a2a,0x972d9038),
+ LL(0x8eff888d,0x71c228f7),LL(0x75586fd7,0xcd59c5d1),LL(0xdd3143e7,0xa966bb14), LL(0xbf353a1f,0xa7f87d54),LL(0xf484d5f8,0xf9cbceff),LL(0xb68ff698,0x698dae86),
+ LL(0x6f3235f2,0x66286731),LL(0x1579c24d,0xcba86933),LL(0xba144ac8,0x8864f364), LL(0x3ffd19b1,0xaad3e749),LL(0x6fdf894e,0x148d7a44),LL(0xb448c223,0x3aefa6dc),
+ LL(0x84e0548b,0xc6c90b42),LL(0xa6072bb0,0x9234d1be),LL(0xafb14b2a,0x3b28ca69), LL(0xcfbcc4d3,0x80eda096),LL(0xac4275fd,0x8bf29e73),LL(0xa9e0838e,0x10655c00),
+ LL(0x8eff3cbe,0x75e78f0c),LL(0xb0a9ad9e,0x2d549d6a),LL(0x50d83c74,0xd9179f56), LL(0x45988bd0,0xdf61dfe9),LL(0xe8f87cbb,0xb76286ea),LL(0x033c1c00,0xa64bca3d),
+ LL(0x664f67a7,0xd82e91bd),LL(0x19c561de,0x7329573d),LL(0xce6bab53,0x5faf92d6), LL(0xcc978c65,0x715cc536),LL(0xe1e82686,0x843e802e),LL(0xbb3c2514,0xd7a82374),
+ LL(0x46e3c384,0x7dec5bcc),LL(0xb5c8409d,0x874ece30),LL(0x0fb8869d,0xbc0f588d), LL(0x65d88ad2,0x11c4d95d),LL(0x349f7fc1,0xef6a5587),LL(0x5d3c89c7,0x8ceb5e7b),
+ LL(0xfdbac03d,0x8326fccd),LL(0xc0e3814f,0x8592d5ac),LL(0x92780f4e,0x4c4f9181), LL(0xcbd77d47,0xdfa95b95),LL(0x116d8d69,0x5c695658),LL(0x45d71633,0x3b9e5958),
+ LL(0x1f933a54,0xf15d931e),LL(0x572c2915,0x16a8e689),LL(0x6078e8b9,0xe37672fe), LL(0xb7252a68,0x37af9fd5),LL(0x6b8ac148,0x9e17b01d),LL(0x942a5a17,0x5ad4c09c),
+ LL(0xef904c15,0xcf9f44da),LL(0x1b8bd3f2,0xfd9b0973),LL(0x1a01c966,0xa2209dbc), LL(0x4d678467,0x0878c83b),LL(0x41418cd8,0xdfcce3e9),LL(0x24b1f3e9,0x10ed020b),
+ LL(0x6eb0a25e,0x1d05d913),LL(0x6ba1b2f1,0xd8dfea69),LL(0x4570c9ce,0x224f88a7), LL(0xb8c5a0d1,0x82087d08),LL(0xcdf8086e,0x2d689252),LL(0x33330715,0x7f5cbba0),
+ LL(0x143708d2,0x793030ec),LL(0x3aa671de,0xe1e44a09),LL(0x6d0c6b60,0xf8d14831), LL(0x4c6b4751,0x43814c65),LL(0x07c35ce6,0x23531a9b),LL(0x30f97153,0xec6a9878),
+ LL(0xa300f8ce,0xd0ced276),LL(0x1ef83f9a,0x7eb2f7db),LL(0x3ff788a7,0x8bdc98f4), LL(0x29e0e1c2,0x8c5f9af2),LL(0x7ac14e4e,0xb6cd8700),LL(0x073f9d19,0x54909c4d),
+ LL(0x3fb6efd9,0x9481d096),LL(0xb50cc9b5,0x04a156f3),LL(0x8baffff7,0x4b8e541d), LL(0xdb644174,0xe7f5e90c),LL(0x530c3696,0x754d867a),LL(0xf47978bb,0xfb20bb76),
+ LL(0xd5e0c70e,0x16986cc1),LL(0x52e7e6c7,0x42ce3058),LL(0xa618254e,0xf31ea341), LL(0xae1ae829,0xaf2001d4),LL(0xd97c4da7,0x3f93eca5),LL(0x8b5c3229,0x01dd7a1c),
+},
+/* digit=8 base_pwr=2^56 */
+{
+ LL(0x0c6a351e,0x6c78a1f4),LL(0x807a4e21,0x5192b2cf),LL(0x72479dc8,0x531cf1e5), LL(0x15863b65,0x78f3e85f),LL(0x6f917ccf,0x008524f6),LL(0xd0dccb94,0x531192d9),
+ LL(0xc490a7f0,0xf7d5ce6e),LL(0x06cc1312,0x646319a8),LL(0xbc37af6c,0x01d71545), LL(0x7f32c096,0x92077f6a),LL(0x02223fa6,0x3c4192cf),LL(0x0b59de1f,0x72b36fe0),
+ LL(0xee192ea3,0x6cc9d6a8),LL(0x4008c57e,0x951ca552),LL(0x0ccb74a8,0x0906ec42), LL(0x09e39599,0x80c4c111),LL(0xa5246b67,0x4a79b1c3),LL(0x5ead0c0f,0xff7242ea),
+ LL(0xf2d97c8d,0x9138c2cd),LL(0x2650a9b4,0x3caecb47),LL(0xf8760ddf,0x23a73447), LL(0xc1d98546,0x1ebf0619),LL(0xcc7f0b0a,0xd9f11b6e),LL(0xde8d96f1,0x16ab2c05),
+ LL(0xeffca98d,0x0dd3b147),LL(0xe1abc2a9,0x10c4fdcc),LL(0xf74f036e,0xc4b7b199), LL(0x7301d513,0x6db9d5ac),LL(0x774b8020,0x154acf22),LL(0xa60f3784,0x0030085f),
+ LL(0x859de975,0x6b73749b),LL(0x67883183,0xc97b9ead),LL(0xbfb919b1,0xaaae5948), LL(0xf5c8912d,0x8150189a),LL(0x67fe0faf,0x6b988a5c),LL(0xf5839146,0x21d1f6d9),
+ LL(0xa3635200,0xaf8c2c49),LL(0x1d377a92,0x0400e2f7),LL(0xfa0d421c,0xaa0ec06c), LL(0x0b0d997b,0x6e3c3b69),LL(0x6756ee3e,0x7d3832dd),LL(0xe78e3204,0x30d62b54),
+ LL(0x5174cd2b,0xcb5e1dcb),LL(0x18f6e4b5,0x8984cb7b),LL(0x72a12150,0x363d0f1f), LL(0xcc62f17b,0xb5c36272),LL(0x3a2f964b,0x4a992731),LL(0x4e8f1ce1,0xbca57238),
+ LL(0xff1a436b,0xdfcf7d1d),LL(0xee098e33,0xf6028d75),LL(0x85091828,0xf98fd92a), LL(0x8cbf1897,0x535e81c3),LL(0x100e48e4,0x4b9286c9),LL(0xa517213e,0x6dcb2c57),
+ LL(0xb451f187,0x1bb72786),LL(0xac01e718,0xbfa69395),LL(0x9acebb3e,0x2c1852ea), LL(0xddabfc41,0x5eae9e20),LL(0x1bd561f4,0x661e7254),LL(0x270a6fa5,0x71f20425),
+ LL(0x961036e2,0x15abdd47),LL(0x35b92111,0xe3edb318),LL(0xfeae7403,0x6a5f093b), LL(0x1595973a,0x4bca351b),LL(0x3a5ff8b1,0x10b5c69d),LL(0x826996cd,0x61699ca4),
+ LL(0x78bdb771,0xef90144f),LL(0xa6fa7f1d,0xc15f7dab),LL(0xb45483c8,0x367a4d90), LL(0x770b4b1a,0x3524f21b),LL(0x0446fddb,0x31111556),LL(0xf304737e,0x77b6be1c),
+ LL(0xabde9561,0x37c8901e),LL(0x122cf2de,0x607d5c3b),LL(0x8479673d,0x31a6f869), LL(0xf1df773f,0x1bc908c7),LL(0x6e7f32aa,0xb13f1008),LL(0xd9fc2d4c,0xd0b64b4e),
+ LL(0xf338ea23,0x4c0c5170),LL(0x49fbff41,0xb0639fbf),LL(0x6cdb87d1,0x0c71578a), LL(0x5d00e5a8,0x6a0fac6e),LL(0xfb624d14,0xf923d1e7),LL(0x65ec474b,0xe2af600c),
+ LL(0x0afa00ec,0x96a0e907),LL(0xe93d5449,0xa58ae31f),LL(0x1e050306,0xf0090575), LL(0xce3c1478,0x3570e2bc),LL(0xd154329a,0x6c779b82),LL(0x8a7caddf,0x2e65670c),
+ LL(0x428ffdee,0x7850b688),LL(0x1e3103a7,0x5630065c),LL(0xdc08408c,0xd774279e), LL(0x6eaf0bcb,0x85499490),LL(0x72f72173,0xb1954318),LL(0x4ac8220e,0x2e5e8eda),
+ LL(0xe86f4f00,0xbd47e5b5),LL(0x8338414d,0x312a0a57),LL(0x5dc0dd30,0x8832fc40), LL(0x8be0076e,0x5b2ec051),LL(0x45348887,0x3064cc96),LL(0x61596442,0x9d0e00fe),
+ LL(0x747e8db9,0xa49b588c),LL(0x1c9851ef,0x91bd49ac),LL(0x21c7c36b,0x547ad2e7), LL(0xcf0a07e7,0x91725ea2),LL(0xcbbcb82e,0xf7fc5911),LL(0x5646ba9c,0xd5f7714f),
+ LL(0x8edccbb0,0x0f86777c),LL(0x7068d3ce,0x4df433f8),LL(0x77731ed1,0xfd2d02a0), LL(0x1f323ab3,0x9ce12310),LL(0xabf47059,0xab127e12),LL(0x4257eed4,0xe37b4198),
+ LL(0x61b7a7bc,0x96bff478),LL(0x24a24d11,0xf70c91dc),LL(0x2ed5f8ef,0xf25c49f7), LL(0x8b8cd0bb,0x66103231),LL(0x337a16a3,0x9af494be),LL(0xbcdf06c9,0x8c8b1723),
+ LL(0xb8d9c7fd,0x5370d17d),LL(0x1320d963,0xa9848001),LL(0x3ab21366,0x4b08ede7), LL(0x8ee6ae31,0x3640d969),LL(0x7deca729,0x782297a2),LL(0x8cf1b471,0xb99c1450),
+ LL(0xc55e2971,0x3a206eb5),LL(0xe3b5b1a3,0xe65b0a7a),LL(0x7f789c24,0x611ca3ef), LL(0xaee050b4,0xffbed20f),LL(0xf7561895,0x81e86366),LL(0xc2fa8046,0x64671984),
+ LL(0x0c3c9013,0xade34ec5),LL(0x5eb41025,0x50bd68e1),LL(0x0d4894dc,0x78808518), LL(0x7c29a657,0x7ed39b6b),LL(0x241517d5,0xbafdbdd0),LL(0x188218bf,0xd6f50092),
+ LL(0xf03ef732,0x81177e12),LL(0x56a3507b,0x1574fe49),LL(0xab053718,0x6e960496), LL(0xc3a21218,0xbcd97662),LL(0x3bf70829,0x0cf68dea),LL(0x25b800e2,0x32d30c54),
+ LL(0xc9428b22,0x95452160),LL(0x72a22c82,0xc2622e6b),LL(0x5b27cb42,0xb6731ec6), LL(0x4fce33d5,0x0f8a1fc2),LL(0x6407716e,0xa9838902),LL(0xfa98bc54,0x5e553dc0),
+ LL(0xcaa69408,0x59683c61),LL(0x6598df18,0x82bc08db),LL(0x6634b238,0x154e5197), LL(0x43fc4c77,0x70ad310c),LL(0x835272f8,0xf9144e70),LL(0x9b7d0d58,0xf41beaab),
+ LL(0x7a860980,0x7aef7397),LL(0x7175ed79,0xab751037),LL(0x797c12f0,0x7dd8fb29), LL(0xebd2f077,0xa63e2440),LL(0xce865a7d,0x645fe5ce),LL(0x317de834,0x5e57db53),
+ LL(0x2bb8134c,0xc28c2ef9),LL(0x520d82a8,0x3cfa28dc),LL(0x7103b732,0xc31217da), LL(0xfef50290,0x9daf07ed),LL(0xb5fbffea,0x5b6cc3a2),LL(0x710a59db,0x98d2a6f3),
+ LL(0x9174bf48,0x44b0ff44),LL(0xeef16e79,0xb5562ba6),LL(0xea9adffa,0x129bbad4), LL(0x8ccd2a64,0xc93aa7fc),LL(0x2ce754e9,0x0c252964),LL(0x88a4559c,0xbaf7f806),
+ LL(0x548d0e57,0x924da3ef),LL(0xbe13e6c9,0xde8c8973),LL(0xd73979cb,0xe5dc0c62), LL(0xf5d1e78f,0xc2f92566),LL(0x95a8fdc6,0x3152a7cc),LL(0xdc528326,0x6601c017),
+ LL(0xd38d9fea,0x1235bcd4),LL(0xd899201d,0xe4d00d99),LL(0x2709bee4,0xf0a9da65), LL(0xf33d4d62,0x69266ab1),LL(0x7a7c073b,0xc5c102a1),LL(0x1fddcaa7,0x42e277b8),
+ LL(0x176de7d5,0xa3b38048),LL(0x3ae77e40,0xcc01f3c4),LL(0x1b8310bc,0xec1be1f1), LL(0xb0b6554b,0xbdc976c3),LL(0x9c4bcd13,0xd86117f4),LL(0xd41ce646,0x9feb9193),
+ LL(0x2120685b,0x7d1547dd),LL(0x610034f4,0xb3b1ec97),LL(0x947b29d6,0xe98a9207), LL(0xdb48b264,0x3dfa24b2),LL(0xa5afaebc,0x6c8e33db),LL(0x0db735ad,0xfcad214a),
+ LL(0x3a1e3514,0xbc366d47),LL(0xd584ab3c,0x67228d9c),LL(0x90009ee1,0xd8abe402), LL(0x68d15f9b,0xb06fcb6e),LL(0x3cbc8586,0x9f4fab36),LL(0xac1ca214,0xeb6fc7d3),
+ LL(0x212701d8,0x644ffbc6),LL(0x3e7f5a64,0x0dd77816),LL(0xbba949bd,0x4182d12c), LL(0x9dd68a5b,0x566f707c),LL(0x3374e3d4,0xc32b41f7),LL(0x33a887f2,0xe25506ae),
+ LL(0x7d747270,0x6809dda9),LL(0x34b9c161,0xe0ff644d),LL(0x5735d1ce,0xedce5894), LL(0x3c299049,0x9a14955a),LL(0xe770315b,0xdf5340ba),LL(0x09ab6581,0x21d8b57d),
+ LL(0xa3a84876,0x6e2ebe98),LL(0x33705d95,0xb25b877f),LL(0x17be7330,0xfb32cded), LL(0xb3db892e,0x91cd62d6),LL(0x782eca61,0xca99ae59),LL(0xf953f71e,0xe927b38e),
+ LL(0xfdefd2fc,0x932d6c0e),LL(0xd45bc513,0xc02f4213),LL(0x97a9f940,0xb9554eff), LL(0xe0f84e1a,0x4e5d7ebe),LL(0x2f4302e3,0x77035f14),LL(0x9555b2f5,0x45bcd681),
+ LL(0xb757b6a7,0x55313f4d),LL(0xf62039e3,0xc1b3ca66),LL(0xa68faba3,0xbc76d877), LL(0x5fc39ebe,0x8addb47a),LL(0x2205e6df,0x52e4f8b8),LL(0xe999baf6,0xa4963df4),
+ LL(0x01e9090d,0x43ec78a5),LL(0x670ed5c0,0xada7c41a),LL(0xca0ccd63,0xf441fc60), LL(0x9f8a35c9,0x2b6b14cb),LL(0xd67b0c7a,0xea90296f),LL(0x475bfd04,0x9ec66ada),
+ LL(0xae9c5b50,0x785fcd1c),LL(0x43f8004f,0x1793f480),LL(0xff4b7c93,0x4ac0e11d), LL(0xbdbd07ff,0xfe1f7829),LL(0xb36c82d1,0x928d4b94),LL(0xedb0863e,0x9afbd51b),
+ LL(0x35ef7543,0x45b8e6c7),LL(0xefcbf15e,0x04bedfec),LL(0xd26c073f,0xe5d2b221), LL(0x9eeedb4d,0xbb74aed4),LL(0x8329872b,0xbdeee909),LL(0xd5027bee,0xde0ef4fd),
+ LL(0xfdec460d,0x4373d235),LL(0x5367ccc3,0x889db5d3),LL(0x6ba366f2,0x75b7adbd), LL(0x59e47152,0xda4f82c6),LL(0x74645dce,0x2f5d2404),LL(0x72715896,0x73bc8042),
+ LL(0xc2538c33,0xd97aa542),LL(0xc4176743,0xb0d4f42f),LL(0xd9117f2c,0x4e46a104), LL(0xa1dbb89c,0x749b728c),LL(0xbb2d1a5c,0xc91c80f8),LL(0xc41a94ef,0x3668d74b),
+ LL(0xc88dbe72,0x64a248da),LL(0x8c9c23c7,0x90d78a4c),LL(0xa56cbc8b,0xd49e40ab), LL(0x305322ae,0x764a4a3b),LL(0xd2f6d2ca,0xf13655d0),LL(0x0ad04588,0x5e206b78),
+ LL(0xa4e2f277,0xb295d1f4),LL(0x2b0f59d4,0x1d49ae57),LL(0xfc85f875,0x77ccdf3f), LL(0x40f7816d,0x98ca5c5e),LL(0x2cb0558a,0xea990a23),LL(0x7a723586,0x76ef8645),
+ LL(0xd4b23830,0x1618d79d),LL(0x0f9647c2,0x0a1387ea),LL(0x166ce29c,0xd2ba4d03), LL(0xacf33156,0xcc88e78f),LL(0xcaf5f200,0x57da063f),LL(0xae63a300,0xa5cbc1c3),
+ LL(0x017ded2b,0x8abdda43),LL(0x02c5993c,0xabbe3891),LL(0xfd7ffd34,0x52df96de), LL(0xd7e89e8c,0x6c4d980c),LL(0xbd659dc7,0x8e3c41be),LL(0xfe1fe1f8,0x7f6f7496),
+ LL(0xa4a51425,0xecae5b7b),LL(0xdd9d83af,0x81e2c971),LL(0xf7b85342,0x39b1d2a3), LL(0xfa8bf8c0,0xc45ad2c1),LL(0x7f18d82c,0xf495b15f),LL(0x9ccdc3b1,0x8b260d45),
+ LL(0x1d241682,0x5a2e6fa8),LL(0xa49fd352,0x313e6fc8),LL(0xa7ddd234,0x75139843), LL(0xd3d7609e,0x6549aefc),LL(0x8f6fd0cd,0x1b477e03),LL(0x70f7a7f4,0x6140a881),
+ LL(0x6718b3b6,0xaf1106f1),LL(0x44eaa8c1,0x767e6522),LL(0xf735f07a,0x527f2eed), LL(0x14ea415a,0x45ad0cfb),LL(0xabde5ef6,0xc09636ac),LL(0x9fcee205,0x88d7fa8d),
+ LL(0x95543299,0x004861d5),LL(0xa61e24e5,0xd594bc3c),LL(0xb3b7cffa,0x2bcafd63), LL(0x5669358b,0xcb375694),LL(0xcb56b897,0xc5c022e4),LL(0x12de2824,0xb2b30bdf),
+ LL(0x2cfdf68c,0xce6b8b13),LL(0x910076c2,0x942efa8e),LL(0x4719c7c3,0x661fc5fb), LL(0x82ebe6b8,0xcfdf4b8d),LL(0x3bb3c18e,0xdeee7446),LL(0xd641180b,0x00ed3964),
+ LL(0xcb3382da,0x1a1ea271),LL(0x30bf39fb,0x0256f492),LL(0xaf66aa74,0xc817dad0), LL(0xf968fb2d,0x2b653957),LL(0xf0fbf6ca,0x5d0b99f4),LL(0x80454299,0xe59af736),
+ LL(0xc2755f73,0xec4992e6),LL(0x4ca484fc,0xdfc3c447),LL(0x7217c264,0xa1f98659), LL(0x6549d8ea,0x43da1644),LL(0xee1b8b43,0x5a967704),LL(0xd404bff3,0x2a8a337d),
+ LL(0xbe4b6d8b,0x94c51eb5),LL(0xc07e4713,0x8fbc9eb8),LL(0xd390eddc,0xa19d59bb), LL(0xe0be24bf,0x0ccb795a),LL(0x340f70c0,0x84f1de5a),LL(0x582c2b9b,0xa699c480),
+ LL(0x7414a8d3,0x5eb36220),LL(0xe5364537,0xf828a75c),LL(0xc830d477,0x1082ff06), LL(0x037d83d0,0xd1528c4d),LL(0x45baf298,0x2b40c250),LL(0x35ee8eae,0xe2e4f82d),
+ LL(0x12e4391e,0x6d36ed91),LL(0x4f322b3c,0x1ea89876),LL(0xfbc19d19,0x60200183), LL(0xda185be5,0xea5a5069),LL(0x248f835b,0x0e2393fc),LL(0x15ee6f20,0x61d051fa),
+ LL(0xe1b5b6fb,0xf886470a),LL(0x60b4fdb1,0xda09259d),LL(0xf88455b3,0x088e9c86), LL(0xbc2676c1,0x52c2860a),LL(0xd1a102f0,0x6d6fa953),LL(0x7cc062e0,0x9299dce6),
+ LL(0xf1a2b5ca,0x812c18ab),LL(0x21bc03a1,0x9b74e2b7),LL(0xc81ccc62,0xbca14295), LL(0x05d9bf48,0xfb6c986d),LL(0xb169ef26,0xc284d240),LL(0x901172ad,0x6292fc73),
+ LL(0x5ef17d8f,0xeddaa5d3),LL(0x7c406cd1,0x15267457),LL(0x9531e2d8,0x2e303a5e), LL(0x75ca396a,0xf7bf1c5f),LL(0xc12acc0d,0xb10e432e),LL(0xeac37f33,0x2ffed1db),
+ LL(0x8e561f72,0x1fef1ecd),LL(0xdd1089ac,0x38fe7b1b),LL(0x3bc9bed2,0x2f24cac2), LL(0x8beb4a49,0x0d99d3cd),LL(0x9f925b5f,0x7dd5cfb6),LL(0xfd9b7744,0xa23894f0),
+ LL(0x14747d9d,0x1f353554),LL(0x75836ce2,0x31bcdf39),LL(0xf2ace220,0xea43017e), LL(0x0246a810,0x55ea2317),LL(0x4ad388ad,0x14671291),LL(0x6a13372a,0x93633c21),
+ LL(0x3a2d7c85,0xcb969eff),LL(0x73683dda,0xe59df301),LL(0xd6450189,0x07e6d627), LL(0x5bb295f6,0xdddae32b),LL(0xe18b49b4,0x6746310c),LL(0x9b220769,0x828865f2),
+},
+/* digit=9 base_pwr=2^63 */
+{
+ LL(0x06290b5b,0x76334d9f),LL(0x1c02aaf4,0x096fa00d),LL(0xb1c345b9,0xb29c7abc), LL(0xdb7dfee2,0x91b1e9d2),LL(0x28848019,0x0c63c40d),LL(0x3e9d93a9,0xa131323f),
+ LL(0xf13eb9c2,0x1935ea95),LL(0x2c20a03b,0x37b07e4b),LL(0x2897bd62,0x7ccebf49), LL(0xae088f35,0x671df286),LL(0x1a339948,0x9b826c19),LL(0x5b176e1c,0x2e503224),
+ LL(0x6ba550e2,0x674ed6b8),LL(0x1cda326c,0xccbad8d2),LL(0x99aa3448,0xd1542f83), LL(0xbf457736,0xcf8eee5d),LL(0xcebef35d,0x40007023),LL(0x3c3cacd6,0x4f6c8f17),
+ LL(0x4971b9d2,0x5794be45),LL(0x22f3503e,0x64a2a44e),LL(0x337993cc,0x62069df9), LL(0x8cf5aa65,0xb5a8be91),LL(0x4266a4f2,0xdcf77c1c),LL(0x479a02fc,0xbbe137f3),
+ LL(0xf8b77a15,0xbd930e7c),LL(0x565819b0,0x1f604624),LL(0xc4a43c29,0x9a01433c), LL(0x8a108d0f,0x8cb9e675),LL(0x86e761d4,0xa4cf1e24),LL(0x30951662,0xf54b8c4e),
+ LL(0xa45636a1,0x5b66a405),LL(0xaaad9d66,0xaaddb23d),LL(0xb2f86dd3,0x896cbfcb), LL(0xdb9ca210,0x01d8e6d4),LL(0x6cca4804,0x6623a1bd),LL(0x51bacaa2,0xf657c1fc),
+ LL(0x3447e4e1,0x94172f67),LL(0x9c87c415,0x54f322cc),LL(0x9e98c65c,0xdc8ef479), LL(0x45d91721,0xd3538e9b),LL(0x1506e6bd,0x6291aa36),LL(0x13f2dbec,0xf61e47e5),
+ LL(0x1a8522ff,0x95dc6196),LL(0xb2a0c2fd,0x7800e4de),LL(0x493d2023,0xb2d8b5c9), LL(0xb3d564a2,0x2c595ab6),LL(0x4e856f46,0xee5106ea),LL(0x0d824ff7,0xdf6ac56c),
+ LL(0x8d5303f8,0x0cc840ed),LL(0x019b0602,0xb756ad36),LL(0x723c0494,0xe56dfdab), LL(0xd268efe1,0x8ba759dd),LL(0xc3466388,0x6c72c1b7),LL(0x85cf6c47,0x7a5f5d09),
+ LL(0x4fe757ec,0xdbab4d4a),LL(0xdb01add0,0xfb7fb787),LL(0x6922f7b1,0x521bd604), LL(0x6b994d8e,0x4c317222),LL(0x9e46ab73,0xa7a17e9e),LL(0x20326632,0xa39d84d6),
+ LL(0xa2841ffc,0xa302b6c0),LL(0x4e85da4c,0x4809d2c3),LL(0x16eeee34,0xf8bea692), LL(0xfda40073,0x049d0306),LL(0xbffc68be,0xe8956671),LL(0x21e27827,0xf5ae3b98),
+ LL(0xe56f2481,0xcf5a16d7),LL(0xcb81a7ba,0x3def2594),LL(0x032f3df9,0xe07beed8), LL(0xc369a737,0xab17091a),LL(0x438b3620,0x0956e828),LL(0x10f465fc,0xab6ecf14),
+ LL(0x6b2649d8,0x6e182bdb),LL(0xb09ecfad,0xc7601742),LL(0xeb6286a3,0xb43cc8c7), LL(0xb948e18a,0x89b48a00),LL(0x42ed648d,0xe337b779),LL(0xe4fc127d,0x1da0987e),
+ LL(0x88ae8b76,0x45aa621b),LL(0x3162f9f7,0xb127ad6f),LL(0xc8f2cb42,0xeb56c7f7), LL(0xcddb2b13,0x6b7993cd),LL(0xfba0d637,0x6f2f2d51),LL(0xb16542d8,0xcabe79c9),
+ LL(0xbde530d9,0x6753d960),LL(0x9b8986a8,0x77b91029),LL(0x9cefc1c4,0x5af09d8a), LL(0xa78c0b08,0xb396dcb1),LL(0xb5928a9c,0x44dc48ef),LL(0x2f48a964,0x9fafb33c),
+ LL(0x408cae9b,0xa2a98dd1),LL(0x61c6bec6,0xb3ff192c),LL(0x3ead88da,0x607b0c64), LL(0x63184290,0x0039f8e6),LL(0x6dd9836f,0x0b9f09db),LL(0xc51a47fa,0x5d9d8f22),
+ LL(0x166920d2,0xe9cf521f),LL(0xbec39b63,0xaf5b1d19),LL(0xee934b22,0x3099fced), LL(0x959116f1,0xef6f72af),LL(0xacea8ba9,0xf710ef28),LL(0x13990b15,0x588d2bbc),
+ LL(0x86049369,0xcbe2755c),LL(0x46e988e6,0x738787b9),LL(0x4a2e3319,0x520ae3e4), LL(0x932e0896,0xf7e43ece),LL(0x2d3989f8,0x906f0e67),LL(0x9e24fec1,0xc4ce28e2),
+ LL(0x9519aaac,0xd4391f09),LL(0x1c2d3eb4,0x923a951d),LL(0xeaa8d831,0xbba9e206), LL(0x3b0369ed,0x86a8f819),LL(0x84f45ee3,0xf08f5db8),LL(0xc7fd4306,0xde9d97b7),
+ LL(0x82162e5e,0x4abae764),LL(0x820c91df,0xda046c14),LL(0xcac95307,0x9be5686d), LL(0x1926ce21,0x8d90109e),LL(0xa11ddecb,0x346eafc4),LL(0xd72ecc75,0x3ce252dd),
+ LL(0x3d30e9b1,0xb559793c),LL(0x21faa664,0xcf651f10),LL(0x0af936f8,0x58827716), LL(0x3390af36,0x2e460004),LL(0x2e93e7e8,0x355c08cc),LL(0xda2c6727,0x84eb137e),
+ LL(0x2625e961,0x9e901d5b),LL(0x499b3624,0x53244f50),LL(0x3c07fdd0,0xf7b5e924), LL(0xc8b4fccb,0x5e1b6db8),LL(0xd9a4ede5,0x4d6122ee),LL(0xf719582d,0x96df7864),
+ LL(0xc9be27d1,0xeafcb131),LL(0x985a8e07,0x86458dd3),LL(0x63ff40d4,0x3e039563), LL(0xd1407667,0x2541540f),LL(0xd9795e3f,0x8b27f2d9),LL(0xd60d0743,0x5dbbd4b3),
+ LL(0x605be24c,0x2b496309),LL(0x496bfcf4,0x3afbea78),LL(0x46ed79bc,0xfe6069c6), LL(0xad7bb67a,0x3cbeb331),LL(0x37463aa4,0xeedcaf16),LL(0x7c12f87f,0xc41a07ca),
+ LL(0x2fccd260,0xbd41b63e),LL(0xc658b3a5,0x3bb5676c),LL(0x15c9ccb5,0x84c591dd), LL(0xa5fcc6ca,0xc5573715),LL(0x9fcba543,0xf1800487),LL(0x63da6fef,0xfb887cbf),
+ LL(0x9f37dc0e,0xfd99db21),LL(0x5783e53d,0x85bbbefe),LL(0x09d5d09d,0xa10360ba), LL(0x3cc09837,0x12e9679e),LL(0x793efd44,0x81a4b2dd),LL(0x8153dba4,0x0c93ed4d),
+ LL(0x2883764f,0xb7b5a250),LL(0x75b781bc,0xd3ca90ea),LL(0xc5198673,0x8da40a3f), LL(0x237103fa,0x434744ad),LL(0xcbd65a76,0x16d7466c),LL(0x9d0ce6ec,0x97f5ff82),
+ LL(0xc3b3f666,0x0134d746),LL(0x7c3910eb,0x62a3254f),LL(0x6906613f,0x989510d0), LL(0xe75bfea7,0xa63aead6),LL(0xf6f48b5d,0x2c7bb201),LL(0x0cf11cdd,0x17c485c4),
+ LL(0x01346a36,0x44072775),LL(0xeccf5986,0xd81f9e8b),LL(0xffca3195,0xcedbaa7d), LL(0x5744e89d,0xeea2a618),LL(0xad358476,0x65f3b598),LL(0x49cae477,0x31ef0e2a),
+ LL(0x82f6a471,0x0f618b7c),LL(0x437cc826,0xac49eab7),LL(0x7209d33e,0x6ac9e2b8), LL(0xa161856e,0x14857b21),LL(0x638a1099,0x2c515ae8),LL(0xe8f5e86f,0xd34ba334),
+ LL(0xdf15afb4,0x96dc51a8),LL(0x5b39ee73,0x0db5cc4d),LL(0x59face85,0xb166ae3d), LL(0xb3c9bf88,0x94ee7aca),LL(0x34ba27bc,0x0724cb81),LL(0x8aa869b4,0xac1a10a4),
+ LL(0x621e0951,0xe85de117),LL(0xf75855ac,0x7b464098),LL(0x53d1abe6,0x06b33c28), LL(0xb538c2cf,0x095bdc74),LL(0xd859366c,0xa64b61e0),LL(0xe9922d24,0xa5c92136),
+ LL(0xc221fe54,0xa1285a95),LL(0x7964a5fc,0x50c3e10e),LL(0x497b1e90,0xdbaa4092), LL(0xa9408c0f,0x3f4e7d97),LL(0x92b70f2b,0x1e83c2f5),LL(0x6911dac9,0x2ed8ab9c),
+ LL(0x73b888d5,0x0bc16a46),LL(0x8a011451,0x4305504a),LL(0x5de19cb5,0xea5d6a02), LL(0xa7166a08,0x8571e2f0),LL(0x6ea97470,0x9edcb0ba),LL(0xd6fc7b1d,0x1ed74e9b),
+ LL(0x48e4b5fe,0x960652fe),LL(0xd0e6f19c,0x391d4162),LL(0xb59dd2ef,0x8c6e00ef), LL(0x95fd71ce,0x0cc08f13),LL(0x8fedafc2,0x6d81789b),LL(0xe498c253,0x3ec56b1a),
+ LL(0xb7edb5da,0xb9bf335a),LL(0x693e2fe3,0x1a3b9636),LL(0x94c320a4,0xb12ae440), LL(0x35ef6698,0xf7d1986e),LL(0x273f0a93,0xc1db1a91),LL(0xadbd81a4,0x72fd29a3),
+ LL(0x1dcb4e55,0x57a9af55),LL(0xa46743c4,0xa430b677),LL(0x4459d987,0x2e2d09e0), LL(0xc1831698,0x58bc26b8),LL(0x8e8a86f9,0x02cdfd4d),LL(0x86532393,0x81824a71),
+ LL(0xfdf7070a,0x4b7d4311),LL(0x46b2d2cd,0x790ff04e),LL(0xa669dca9,0x5f194b6e), LL(0x6ee0a73c,0x8d27f077),LL(0x3f03f66f,0x7db8300e),LL(0x52542218,0x894792c2),
+ LL(0x320a391f,0x709e970a),LL(0xd301afda,0xffc55682),LL(0x187a421b,0x8c7c2ac7), LL(0x05c2a76b,0xb9413568),LL(0x50d693ea,0x4ce64d45),LL(0xf8118a62,0x133a1d85),
+ LL(0x1634f569,0xb78ee791),LL(0x0985837d,0xc8fdd735),LL(0x42337dc2,0xb40ab147), LL(0x2ece8062,0x58ee37a9),LL(0xb4fb1ae1,0x1b80e3de),LL(0xddf42642,0x55797958),
+ LL(0x3a4a5d2b,0x4ced5be1),LL(0xf46469b5,0x537cc02f),LL(0x9140aadc,0x369faf66), LL(0xbba54c56,0x91646050),LL(0xf1627bac,0xb6ae4660),LL(0x03bf4ace,0xd39a1183),
+ LL(0x5ad40b74,0x9a746086),LL(0x09825b65,0x8d116e80),LL(0x4c9e508b,0x66642780), LL(0xca3af3bd,0x10c1db38),LL(0x67df4e51,0x91ca8866),LL(0xadf6517e,0x3b4ebf22),
+ LL(0x69754168,0x906ece9b),LL(0x3842db37,0x78a4999a),LL(0x45118f97,0xa54934b5), LL(0xd6600715,0x17c76b7f),LL(0xfef1a9a9,0xec8d0be6),LL(0xdaf01223,0x80902814),
+ LL(0xe7382aa9,0x8ffad587),LL(0x64489fbc,0xff48de9c),LL(0xc8d3ef62,0xe539dabd), LL(0x6e44245a,0x037fa21e),LL(0x6ffc89e7,0x44aeb6c6),LL(0xc24d18dd,0x903826c9),
+ LL(0xfa798920,0x7e6202ad),LL(0x97dc220c,0xa69a704f),LL(0x27b68255,0xd7e7cafe), LL(0x52b2a274,0xa6aa0342),LL(0xe49cef76,0x72ecec87),LL(0x82afed60,0xee4bbb4a),
+ LL(0x7c8213f0,0xb7bfa6d1),LL(0xe2e5eb2d,0x55e77d8a),LL(0xecb57d00,0xde5c925a), LL(0x91bfc135,0xc67d7eea),LL(0x14df6915,0x6915f948),LL(0x8e5e081a,0xbc1fffee),
+ LL(0x4f0a6b86,0x1ca04a6c),LL(0x07a69d26,0x3f736642),LL(0x8eb91e1c,0xbcf425f5), LL(0xf7a230eb,0x0ee5e1c6),LL(0x11f1574d,0xafdd21cd),LL(0x31d6dc6d,0xb5ef9bf3),
+ LL(0x7cc6bcf3,0x6774ed5f),LL(0x0a75d23e,0x6feadf8b),LL(0x81ec8c8a,0x5898828e), LL(0x414cd64b,0x3e9103bb),LL(0x1542efe4,0x703f0fb2),LL(0x7388d6c8,0x3df2c7c6),
+ LL(0x60a7e99b,0x02e73081),LL(0x7986406b,0x1b3db98b),LL(0x3fff6009,0x9959bac0), LL(0x75e1d2fa,0x80625a36),LL(0xa198da2b,0x95492b2e),LL(0x59742464,0x81018f71),
+ LL(0x3cdf8db3,0xc1fc725f),LL(0x59326d48,0xd58228f1),LL(0x1d74eaaa,0x4c0a442e), LL(0x1b886d60,0xa814c005),LL(0xfaa58d26,0x9756df79),LL(0x176bed0c,0xc17f3346),
+ LL(0x7ec82b2a,0x874840bd),LL(0x1e1e2156,0x8b253112),LL(0xd1a58bca,0x8264f8ad), LL(0x23a4105c,0xc2a71227),LL(0xf0882599,0x8add8a3d),LL(0xd491e94b,0xfadbbc8e),
+ LL(0x0f86b5cf,0x8d48becb),LL(0xdd83a12b,0x700c6428),LL(0x87164a6a,0x9175e238), LL(0x300636b7,0xdd10d85e),LL(0x080c01ea,0xec0b0e20),LL(0x18c937fc,0x5b27d26f),
+ LL(0xaba54a99,0xe45deb1a),LL(0x88f0f0e9,0xea11e26a),LL(0x8d1c5c7c,0x3f29d26a), LL(0x261af059,0xaad1697c),LL(0x8bc6950e,0x65b29644),LL(0x3940ae67,0x33e4b7c4),
+ LL(0x18f510ad,0xe7e52f31),LL(0x4aba84d1,0xecf901f6),LL(0x1d0d87ae,0xe6d9492c), LL(0xf4371e3c,0x21861ebd),LL(0xac94b579,0xd7f34636),LL(0xe45e7910,0x72e22e1d),
+ LL(0x0d44e5c0,0xe0a30cd5),LL(0x672259aa,0x2d74d417),LL(0x48769d5d,0x208c07a6), LL(0x3ab04b13,0x0182f535),LL(0xd1493acf,0xa88ddf33),LL(0xe65f0e82,0xd692f755),
+ LL(0x200e00e2,0x57480257),LL(0x80f4a13a,0xd24d38be),LL(0x8b6535bd,0xe2d4702a), LL(0x6d6d0cd9,0x597abaed),LL(0x1a32e8b7,0x2eaf61f2),LL(0x06a3acc5,0x48a99a4d),
+ LL(0x39489527,0x25304144),LL(0x832761c7,0xb36d9b74),LL(0xaa187256,0xe33bc0a7), LL(0xa72fb33d,0x4d4e2c96),LL(0x7ed273fe,0x1dba3ef7),LL(0x577de798,0x2b9978d8),
+ LL(0x54644ced,0x467e81b5),LL(0xc2a02440,0xd4ef3e1b),LL(0x15b3a380,0x0df99eec), LL(0x250b43d1,0x549afec6),LL(0x1598f520,0x0c4fc7e2),LL(0x67422c36,0x9f8e42d7),
+ LL(0x6c0213e3,0x3a3886aa),LL(0x8b5b752a,0xc12533ce),LL(0x814f4729,0xbe235906), LL(0xbffc94e3,0xdf45bc94),LL(0xf2a001db,0xccdad604),LL(0xb8cdcec3,0x11ddcaa6),
+ LL(0x25ddf146,0x7eee967e),LL(0x0bf6e4d3,0x9a2d1d73),LL(0xabd48b07,0x57a43f05), LL(0x32b3a8a7,0x77d9ad80),LL(0x55872fbd,0xfbab22cf),LL(0xd02e7501,0x2100eede),
+ LL(0x25faa7bf,0xf4f4c899),LL(0xaa9fc84a,0x235a5736),LL(0xfae4fdb9,0x37647c20), LL(0xa26ae472,0xfc3f8ca6),LL(0xa2f519e3,0x01c6ea11),LL(0xc2fc610f,0x1ce14f58),
+ LL(0xb767a1fd,0xb6f923fc),LL(0x07e07c0c,0x31a760f3),LL(0x6a7085a9,0xe913fcfb), LL(0x40442930,0x86adb2bb),LL(0xe41a1b14,0xc8c20759),LL(0xd8d1924a,0x399d5ad6),
+ LL(0x76ac6874,0x6f0508e8),LL(0xafba3d82,0xd96bd7cd),LL(0x56cc2c07,0x336b813e), LL(0xb0c7906c,0x0fca9b73),LL(0x232e056d,0xb85518fe),LL(0xd1c21ece,0xa97bdc68),
+ LL(0xfbc66efc,0xf3327dfd),LL(0x34a1c591,0xa401731e),LL(0x3371b4b7,0x8c1ca43a), LL(0x526198b2,0x835393dc),LL(0x686e9c85,0xa8d2d86f),LL(0x7a0c3d07,0xa4491de7),
+},
+/* digit=10 base_pwr=2^70 */
+{
+ LL(0x309b2b98,0x790e100d),LL(0x50a4f09b,0xaf54cb0b),LL(0x956ec705,0xbfd5af9f), LL(0x3bab82f5,0x4692a125),LL(0xec637260,0xac0be759),LL(0x580441bf,0xaf835bc0),
+ LL(0x513c3f3c,0x80ab94a2),LL(0x77e64a9c,0x39c245d0),LL(0xa7543bd5,0xc3ba4002), LL(0x7eacb224,0x6658e2bd),LL(0x1f419c54,0x7e005bba),LL(0x58b62644,0xd54bc0f7),
+ LL(0x9194cd13,0x5c1c461d),LL(0x95f13f43,0x843427bf),LL(0xba86794a,0x6844d36f), LL(0x393e443b,0x90e5c334),LL(0x9f72ba01,0x8cec77f9),LL(0x145d81fc,0x28ef5fba),
+ LL(0xdd9dc934,0xa6b331c2),LL(0xde2f138b,0x32a15ddf),LL(0x2b7697a8,0x490117ee), LL(0xb3b1e935,0x5eaf7f20),LL(0x9b807876,0x4b750ed0),LL(0x864be6f5,0x98f1673d),
+ LL(0x9a5d2cee,0x4a36329f),LL(0x373aae9d,0xd6288e69),LL(0xd918ee97,0xbf2fd4fb), LL(0x870b1cdd,0x020ef080),LL(0x22a9b3e7,0x5578e9ae),LL(0xeb392f0b,0x8887e7e2),
+ LL(0xf5b8a656,0x533c438d),LL(0xbc6d32ae,0x98531dda),LL(0x1af7184c,0xc8e1927f), LL(0x393cf3c4,0xb9f8c2c8),LL(0x73ac1607,0x37cffce8),LL(0x3312e5ff,0x76d8c894),
+ LL(0x2b57f886,0x9a855c17),LL(0x3f649b7d,0xa334a009),LL(0x6e284b9c,0x90468704), LL(0x008bb313,0x633d15c5),LL(0x0ec3ca93,0x384f430f),LL(0x83b412c8,0x109e0fec),
+ LL(0x1a53d7a9,0x53582049),LL(0xf0099876,0xa35696c9),LL(0xfab32bde,0x34991882), LL(0x9092df43,0xa6e48215),LL(0x0f2f3443,0xf674d02f),LL(0x4d862a69,0xeeb91808),
+ LL(0x8ece35fc,0xdc9c1776),LL(0x9ab87051,0x7e6e4720),LL(0x7fd83120,0xf6d82143), LL(0xa0bcd27e,0x7ee28542),LL(0xd6a86383,0x5e5835d3),LL(0x3ddae47d,0x1b6caf5f),
+ LL(0x48ce8d7a,0x66cc8b26),LL(0x5f4e54c1,0xb8f25b70),LL(0x8abade9b,0x9c222105), LL(0xe91600e2,0x6a5880be),LL(0x55c01418,0xd8214454),LL(0x3e0670f2,0x1510a747),
+ LL(0xefd35bbf,0xe70de601),LL(0x01575c49,0x23fea84f),LL(0x04ef42e0,0xc9dc4bb5), LL(0xb139d368,0x01d78685),LL(0x4c1d31f0,0x6acc3ed7),LL(0xbeac2fcd,0x7ebf6809),
+ LL(0x8b17cc56,0xb221b461),LL(0x6c918f42,0x3a388a6c),LL(0x61ec2c4a,0x43b22feb), LL(0xdd8892c4,0x1f31f72b),LL(0x7aae5ed6,0xff9e63db),LL(0xc5aa19b7,0xcf33f8e0),
+ LL(0xb6d01e70,0xb2b290ae),LL(0x70c988ca,0x32377051),LL(0x5c47c52d,0xb49ee722), LL(0x73ed265f,0xa41919e1),LL(0xf4708b44,0x41428dd0),LL(0xda4fedfa,0x15d760a1),
+ LL(0xe8537c4b,0xfed502b6),LL(0xfc7dde03,0x8bab770b),LL(0x7d1f76d0,0x05c46da4), LL(0xc0db9267,0xc8dcbdf0),LL(0xcf6393d4,0x01cc7b6a),LL(0xeaf6dc69,0xab93ff59),
+ LL(0x9da53ff6,0xc026d3db),LL(0xd6c5a028,0x6b07911d),LL(0x9f01eec9,0xf2e88f7a), LL(0x35fb3be7,0x30ac879a),LL(0x9c8e073c,0x92871e9a),LL(0x44eb456d,0xc18518f1),
+ LL(0xe32b5a2f,0x2ca049f6),LL(0x3c2dc1f8,0x164d195b),LL(0x0eafa9d1,0xd1364e77), LL(0x59bac901,0x87a85a1f),LL(0x31b28912,0x040599eb),LL(0x73989f3d,0xe5138d57),
+ LL(0x59e18159,0xda271207),LL(0x87bdce2f,0x62d2e07e),LL(0x9c9da191,0x00bc160e), LL(0x9f9f3edd,0xc2aa6fab),LL(0x3e0cc568,0xd0bd4459),LL(0x6d2f3dbc,0x80621f6a),
+ LL(0x2608caf0,0xc02d8317),LL(0x3b8d5f88,0xb2b7cf8e),LL(0x97aa5235,0xe268620c), LL(0x53373262,0xc5d88092),LL(0xcbdc45c7,0xb80c631a),LL(0x3758fbc8,0xa82fa7f0),
+ LL(0x61946f84,0x71ca7112),LL(0x26f634dc,0xdbb91c74),LL(0x48b33bf4,0xc61feaa2), LL(0x0f0b622c,0x8c1f4e50),LL(0x4a976276,0x54a1b037),LL(0x9ac35cd3,0x46fdaca0),
+ LL(0x62a4a464,0xa78d6498),LL(0xbe50e07c,0x8185cc99),LL(0x046a15b3,0xe0df6a84), LL(0xb1747017,0x3fbd2fe4),LL(0xd8a28d37,0x40bd174e),LL(0x3ba62fe3,0xeb67a57c),
+ LL(0x9cd4dbf3,0xc674a040),LL(0x8ef4b42f,0x342823c9),LL(0x82a815c3,0x51bb59b7), LL(0x56fc0c39,0x4b239627),LL(0xc5f5d825,0x28ec23b4),LL(0x6c8e1e27,0xf7c1b3d8),
+ LL(0x27ec4b30,0x9635ffa2),LL(0x100ea34e,0xc42039eb),LL(0x90076fbc,0xd912642e), LL(0x1f77514a,0xaafcaa31),LL(0x0fb82d1f,0x79d17151),LL(0xb2f1317a,0x7c0989e3),
+ LL(0x89f462e7,0xb4998e80),LL(0xe6fbd086,0xb36cee42),LL(0x2313e077,0xc8121a21), LL(0x2726f97c,0x5989f410),LL(0xcd4d494f,0x0186977b),LL(0x5a5b30ab,0xc3fb6b78),
+ LL(0x424d3124,0xf9bb1829),LL(0x22c5cfed,0x4def4592),LL(0x116b8380,0x635090f0), LL(0xedc582ce,0xdc36aaf6),LL(0xcb88543f,0x8c97c600),LL(0x79d7d839,0xea4cedf6),
+ LL(0x3a7fe603,0x8e22dd53),LL(0xb6e13252,0x4f6646e7),LL(0xcc10cc0b,0xecb71522), LL(0x8fe0bd6f,0xb14b31d5),LL(0x7a6c5efb,0x2fe52f94),LL(0x1d6b6945,0x46144410),
+ LL(0x41fe4d44,0xd9cc6cd5),LL(0x3e28dc8d,0x358e33f3),LL(0x521ff50b,0x1a26ddf8), LL(0xa3eab01f,0x3ee649e8),LL(0x03050e22,0x98968099),LL(0x12ed1dd8,0x49721509),
+ LL(0x1e67197b,0x384a1493),LL(0x56c98a4b,0x0d7943cf),LL(0xaf2f7e74,0x23d774ac), LL(0x79355a55,0x2c21ca0b),LL(0x1fad2d85,0xf5e43dea),LL(0xa8d0b6bd,0x57ab8f61),
+ LL(0xd56cc2a3,0x0e518afc),LL(0xe2dc0d52,0xc6a83b40),LL(0x809ea39f,0x6f5059aa), LL(0x2721bc4d,0x94390dc2),LL(0xfb429338,0x879b35f1),LL(0x14546ddd,0x3891b090),
+ LL(0xc56f4571,0x7b43040e),LL(0x5fa40c73,0x0b5a0144),LL(0x274f5c74,0xbe5cf035), LL(0x9af86d27,0x9e879540),LL(0xd3c0d8b2,0x77e49fb8),LL(0xc770f9db,0x61fb43b6),
+ LL(0x92022253,0x4ad13b39),LL(0x71a9d129,0x8396b4e5),LL(0xdce6f688,0x8182898f), LL(0x9bab196f,0xfc0794cd),LL(0x7d4e5580,0x4100be42),LL(0x73474464,0x1417be29),
+ LL(0x0b909777,0x50d8f53e),LL(0xb81656d9,0x9e5bcdce),LL(0x68e77a3f,0xd3e75c90), LL(0x22b5d762,0x3e315195),LL(0x1511374c,0x1fe3bea5),LL(0x39e43804,0x7dcf6bb6),
+ LL(0x98b4883d,0xaa84b4ab),LL(0x5003afb8,0xfb1203a4),LL(0xf113ef60,0x49b549bd), LL(0x421a26db,0xb8a534eb),LL(0x4176bcfa,0xae3abef5),LL(0xc9fd2e50,0x65ad7ddc),
+ LL(0xc9927e31,0x32999234),LL(0xc5f17855,0xcbc9be39),LL(0x91ce524e,0x4189b3bb), LL(0xedfa4e44,0xc72add92),LL(0xfa0ae77e,0x59dfa5aa),LL(0xd3b54994,0x1bc2e1a2),
+ LL(0x743258e5,0xc7638300),LL(0x4e7252c9,0x508d7943),LL(0x39297969,0x882f689a), LL(0x5a87da5a,0x87d951d3),LL(0x24116564,0x21c31a28),LL(0xbf2be0ff,0x76451670),
+ LL(0x500e0aee,0xeb561121),LL(0x89b20709,0x1d9b8fb4),LL(0xc9f555ae,0x7ba3f437), LL(0x276c8c91,0xc08e6586),LL(0x6d0f76b9,0x7daa15eb),LL(0x3c2bff70,0x1769cb69),
+ LL(0x242a43b4,0xbd62fc3b),LL(0xe4ceb019,0x853d3ce1),LL(0x267cdfd1,0x81780739), LL(0x9cd6475c,0x60ecb687),LL(0x48a209f2,0xf3e199ed),LL(0x02dae3a1,0x3cf6b9f3),
+ LL(0xe7cec18a,0xb0e37780),LL(0x98f8a592,0xaa6eb4e7),LL(0x2d0d06e7,0x0427150e), LL(0x911cd620,0xef4a40dc),LL(0x6e271737,0x71162ad1),LL(0x700d088c,0x82437eca),
+ LL(0xf1cc972e,0xee1967ba),LL(0xd4eddaa0,0x920e2ab5),LL(0x985d7040,0x5c5ee245), LL(0x3950b6ed,0xb0b435d4),LL(0x364257b2,0x3d814c4e),LL(0xec06a200,0x5baa5fcd),
+ LL(0x79c5f683,0xea62de1d),LL(0xf682ff65,0x02d1dab0),LL(0xad34060a,0x001e1565), LL(0xbc38c15a,0x09c411dd),LL(0xda6f1853,0x5f688345),LL(0xdd138b16,0x3a60f9df),
+ LL(0x0bcf4074,0xb21d2687),LL(0x66ea60fa,0xcb9d6c7f),LL(0x86febc79,0x33b4a213), LL(0x9bb71bf2,0x6c5e209c),LL(0x63580404,0x53f871bf),LL(0x0c55bce3,0x4c4a3634),
+ LL(0x50a5c1d5,0xd05e1b75),LL(0xeda43a63,0xac2eb90d),LL(0xff9c26a8,0x66eba3d3), LL(0x3c837bb1,0xe4f6c13e),LL(0x6e9b77ce,0xee6c1ed4),LL(0xf727fe74,0x7107e1fe),
+ LL(0x88d7d553,0xbd0548b8),LL(0x4afe5186,0x78876c17),LL(0xa7285f30,0x621d5e10), LL(0x5a304147,0x051e0777),LL(0x334a494d,0x5390f3bd),LL(0x4579e150,0xbebd4f2a),
+ LL(0xc9672b55,0x0aa436fe),LL(0xaf1550c6,0x52a75c26),LL(0x3858b864,0xd0cbe739), LL(0x0d008d67,0x8f10eef9),LL(0x72b9fc05,0x8f75f104),LL(0x364e6b20,0x143ef589),
+ LL(0x533b4c98,0x2be2a8f3),LL(0xc7ae49a0,0x982b2540),LL(0xefebfa00,0x546e27b9), LL(0x900dd378,0xb5d294cc),LL(0x3658dbf4,0x3be2150d),LL(0xb34a20e7,0x02874ed2),
+ LL(0x40cc25ec,0x478a065c),LL(0xada695ef,0xbeaf90cb),LL(0x862215ea,0x4aae42ff), LL(0x165174a2,0x381fc293),LL(0x3d459c99,0xe86a1fe7),LL(0x401dd67b,0xe890d568),
+ LL(0x82e7aada,0xb46876e1),LL(0xd804209c,0xecca3439),LL(0x1d006b77,0x2c44843b), LL(0x8dd030ac,0x61576007),LL(0xfcb53cac,0x43b0a3df),LL(0xdebeb1f9,0xc5ca915d),
+ LL(0x0ca9fabd,0x261ec1c6),LL(0xcd7cb986,0xef1e6df1),LL(0x2bbbbc23,0xa827cc65), LL(0xcbd255f5,0xbe5fb899),LL(0x512312f5,0x909568d8),LL(0xa6726a82,0x681dd29a),
+ LL(0x488ad19a,0x0de34649),LL(0xa836d120,0xaedbbf66),LL(0xc3d2bb79,0x3db458a5), LL(0xf1b23abb,0xa516213a),LL(0x1fb13cf4,0x57cb0ebe),LL(0x2a71fb5b,0xb43b7de1),
+ LL(0x5a77c99c,0x4136b8b1),LL(0x8ea5e01e,0x7e568b1a),LL(0x63a9ae35,0x218b1234), LL(0xe124bab5,0x31875171),LL(0xccc750f2,0x8b5a214c),LL(0x085b0bf6,0xcda64152),
+ LL(0x65aa7c4a,0x823a1144),LL(0xd237a179,0x887834cc),LL(0x79b0e325,0xa2884253), LL(0x71245d03,0x05200952),LL(0xefa5fe27,0x6b7e9f1d),LL(0xd8acec2b,0xda6faffe),
+ LL(0xf6bd56f2,0x8136bac4),LL(0x996005c4,0x13e6d8cc),LL(0xa4d43df3,0xd7ea43e1), LL(0x2f377e2d,0xfc227ad7),LL(0xa8878d26,0x90549e9b),LL(0x4aa1f76a,0xb578b012),
+ LL(0x4a188fe4,0x42ca87e7),LL(0x5d8e390f,0x4ba3638d),LL(0x9476562a,0xb3568c45), LL(0x0c0a6cc4,0x0c426680),LL(0x3e63129f,0x64115513),LL(0xcec9a6eb,0x711c89d3),
+ LL(0xd14dddc5,0x923db3a9),LL(0x7dac544b,0xd001ba98),LL(0x692ca6d5,0xc5b16136), LL(0xcdf3aa4c,0x105a9b51),LL(0x52023455,0x909991a3),LL(0xe71eda94,0x8699a77a),
+ LL(0x20abff43,0xde5a86c2),LL(0x5e0fe305,0x51a3ccb0),LL(0x9ea73b83,0xb76c1d2b), LL(0xf9a975a1,0x9ecfed6c),LL(0xfb0c036d,0x9c0332e0),LL(0x6889bbce,0x4e7d344a),
+ LL(0xeff8ef6a,0x4f5b02ba),LL(0x165b7828,0xca84ea74),LL(0x6fd1b432,0xc50328c5), LL(0x4166147f,0x56d815b8),LL(0x3da09b08,0xabfb8a90),LL(0x2d02b8d2,0x6b35b6b2),
+ LL(0x398c7dbd,0xbd664dac),LL(0xd96e1ba7,0xf61eb365),LL(0x65e6672a,0x4063219c), LL(0x8c7ea7dc,0x4bacb326),LL(0x40eb1485,0xcb7c53dc),LL(0xc8724e95,0x75993332),
+ LL(0xb8af3e69,0x65ace7ac),LL(0x92a2146c,0xc1b257bf),LL(0xcd5a446f,0x5901f7b5), LL(0x8c135291,0xfd4954c0),LL(0x7287802d,0xf9489d56),LL(0x79ca70bb,0xe671da6c),
+ LL(0x7342afb2,0xcf1f68a7),LL(0xd2662b38,0xb7c95d16),LL(0xb90fd0c0,0xfb1d7741), LL(0x836a9bb4,0xfd7f66be),LL(0x3f666fd7,0x9196236b),LL(0xf2666854,0x97d5dc11),
+ LL(0x13be0faf,0x53b96191),LL(0x4aad75e2,0x8984caab),LL(0x8c638642,0x5f016b43), LL(0xfe4962b3,0xbe9ab98b),LL(0xf41d7325,0xce94bc4e),LL(0x2727019c,0xa8761364),
+ LL(0xae07f4a8,0xbb80b445),LL(0x8294ccdf,0xe5881e44),LL(0xad112cda,0x3a4c8e39), LL(0x35d8c72f,0xa5340d8e),LL(0x48955a80,0x47142cce),LL(0x86d4ad66,0xb5ddcf06),
+ LL(0x2ba33bbf,0xdf4d64b8),LL(0x38311d97,0xb562f723),LL(0x3ae0b587,0x9f7f5f29), LL(0xc4c06982,0x7233a026),LL(0x72ac8ffe,0xe33867b4),LL(0x508eade6,0xf85acdb1),
+ LL(0x67a2a49a,0x8261c3a7),LL(0x9775813d,0xcb58ffc5),LL(0x932bb91b,0x06c28465), LL(0xb5e56211,0xd07de2e2),LL(0x8f5bfd9a,0x6e0b5a38),LL(0x6f9d74ef,0x1cccc9f7),
+ LL(0xe3a75abb,0x48de8e6e),LL(0x39374610,0x0ebaaa1e),LL(0x2106e8ab,0x003aaedd), LL(0x92e2817c,0x6ae46c78),LL(0xfbd7d633,0xc52e217b),LL(0xc280871c,0x804476ea),
+ LL(0x8f4ad647,0x1399bf87),LL(0x2f0e2288,0x81692c0a),LL(0x4c8fbcb7,0x4eb07838), LL(0xe3874f86,0xdb2f862c),LL(0x89f62e6a,0x9e0ee74a),LL(0xb8e8633f,0xa0fef663),
+},
+/* digit=11 base_pwr=2^77 */
+{
+ LL(0x596b6e25,0x3628c4e5),LL(0xe3c48c5e,0xc4406956),LL(0x2e8ae234,0xe7c4cb00), LL(0x2ed43c07,0xa11d2ed3),LL(0x77b2799d,0xc33b975f),LL(0xcaefccd6,0x3715cc2d),
+ LL(0x29a801e4,0x98e5a9fd),LL(0xd84bf0a4,0xfa4d3abb),LL(0x2c426bed,0x8f4dc6f8), LL(0x1b83f02d,0x9decebac),LL(0x31afcc78,0x27563177),LL(0x28657c91,0x25efdee0),
+ LL(0x10bed657,0x44f7577b),LL(0x05089a71,0xd2686801),LL(0x687d749e,0x44e84ecc), LL(0x2ffe47f3,0xeba9b10c),LL(0x977d2767,0xed6470da),LL(0x70a6ec4e,0x7568cede),
+ LL(0x5fdc4b62,0xb3dfb691),LL(0x55109b96,0xd851f390),LL(0x24e13631,0x55c4dac4), LL(0xb02dcba6,0x12c87918),LL(0xb6a6220f,0x082a25d8),LL(0xcc90ccd7,0xf8abc990),
+ LL(0xb4ca91b2,0xef95af0a),LL(0xa99a156c,0x693d8362),LL(0x4cc32c97,0x8b1f5532), LL(0xf16e87af,0xff44233f),LL(0x09622892,0x6fffb3de),LL(0x676ed99f,0x9c976523),
+ LL(0x19ea3118,0x486075b2),LL(0xe8b84a78,0x288a821c),LL(0x603792cd,0x53ce6139), LL(0xcd02301a,0xcc3dfb91),LL(0xafc2d623,0xd6745a56),LL(0x2bdb691f,0x55aa143c),
+ LL(0x38ddf5e1,0xb104e58a),LL(0x2b17bd48,0x504256db),LL(0x1af21432,0x9e5bdc70), LL(0x364f820d,0x478233b6),LL(0x6c7d0127,0x150c2f89),LL(0xd8d44844,0xdf664b62),
+ LL(0x15f1c173,0x5dd16958),LL(0xc46a9115,0x3312d6a3),LL(0xfe869bbc,0xc9527a68), LL(0xf6cbcbb4,0x6e5effcd),LL(0x362c0478,0x35bd9c75),LL(0x55bb0376,0x02094198),
+ LL(0x86c1d92c,0x20c0085c),LL(0xb4122bba,0xbd007e1e),LL(0x25befafd,0xd7c99c19), LL(0xa3ef65e4,0xf07b6cd4),LL(0xcfed174f,0x670355d0),LL(0xd9b990a8,0xff36e219),
+ LL(0xdc2a6498,0xdc527d73),LL(0x6e1a780d,0x08934ec0),LL(0x70e3a7c9,0xc2577255), LL(0xc59481bd,0x3e9b3c1c),LL(0x33ca9c3c,0x148a477f),LL(0xdf421578,0x5ac5a917),
+ LL(0x0d689c44,0xecd077c7),LL(0xb91f2750,0xb9946fa4),LL(0xf06d9aee,0x6a48a5de), LL(0x09b44876,0x90d6c760),LL(0x8d0df7fc,0x4768b79a),LL(0x528d023b,0x894c061b),
+ LL(0xeb1f23e5,0xc155c9fc),LL(0x87fb0d4d,0x30da65cc),LL(0xfe29aaf9,0x39ddc6f1), LL(0x9b7d2157,0xe1559681),LL(0x62eec022,0xe62ee793),LL(0xa973795b,0x6841ff58),
+ LL(0x8c5f6a6f,0x5041ffe5),LL(0xa1e49e9e,0xb047d430),LL(0xa1870cf1,0x55c67f67), LL(0xfdc4137f,0xa52cc630),LL(0xeeacaf6a,0x708f8900),LL(0xf29a770c,0x4489b888),
+ LL(0x427f459d,0xa9893015),LL(0x3af11c58,0x29c3a358),LL(0x3159a1a0,0x9fe19047), LL(0x16e111ce,0x3590c6ca),LL(0xb144f41e,0xbb21fd6b),LL(0x48ff3048,0x668bc4a8),
+ LL(0xcd902ca6,0xf80a9619),LL(0xf2ba49cb,0x75608dc6),LL(0x0d7ead99,0x1ac32280), LL(0x7b3c121e,0x0f8cc5ca),LL(0x541e43fb,0x70c044bb),LL(0x6838ded3,0xfb10ee49),
+ LL(0x3fe39fff,0x75b96345),LL(0xf45a96d7,0xb4aeb917),LL(0x8932cc8f,0xcc29a1ee), LL(0x682514c2,0xd1317dff),LL(0xa9ef556d,0x5cecce58),LL(0x80d7dfc4,0x51b5fe83),
+ LL(0x496e1c06,0xef91106b),LL(0xf293c76e,0x28e0bd07),LL(0x504a0bfc,0x42b5d427), LL(0x507248f9,0xe4090019),LL(0x391b523a,0xf41922a2),LL(0xa9b23a0a,0xf8bf6bbc),
+ LL(0x03c42d14,0x4538e84f),LL(0x125c5ecc,0xc3304e31),LL(0x0528582e,0xdb87c51f), LL(0x63617411,0xd5eb0dd8),LL(0xbab74fe4,0xf4502fb9),LL(0xbda4957c,0xce6a62a7),
+ LL(0xcc524a7e,0xa34e113a),LL(0x0e326637,0x256f2404),LL(0xe9251c73,0xeb005bad), LL(0xd5be4e06,0x3ac0298f),LL(0x97f2b09f,0xb76eb4f5),LL(0x71ef690a,0x93965d52),
+ LL(0xc620384d,0x1050467a),LL(0x466e292b,0x8b677cf7),LL(0xe11cabe6,0xf2ac4850), LL(0xb63594f1,0xcec62350),LL(0xe4d91805,0x9afedaa5),LL(0x27dff452,0xd7455a8e),
+ LL(0x1f700bc7,0x19af1010),LL(0xc8359c70,0x5cd5ad5d),LL(0x70f71fce,0xc8be23e9), LL(0x467d70f8,0x80764bb7),LL(0xf6206a40,0x62069652),LL(0xdd25262a,0x17473085),
+ LL(0x1ba99063,0x32fe5625),LL(0xdb47d5bd,0xac325742),LL(0x30faac68,0x1621ec3c), LL(0x1c66729b,0x1956c250),LL(0x073aef1f,0xb76bcafe),LL(0x5159e850,0xeea7292a),
+ LL(0x090f7e37,0xc1a04582),LL(0x3f65d4c2,0x8a13821a),LL(0x10d83d97,0xce32c6c5), LL(0x26738cf6,0xedabac6c),LL(0x1200113a,0xf2615b30),LL(0x4c0415f6,0x7cee46f2),
+ LL(0x6d603672,0xabe36235),LL(0x4bf4eb2c,0x5f4f1ae8),LL(0xa26e6c0e,0x9a8e44c8), LL(0x167b41d3,0x0944d401),LL(0x76f5c7d2,0xb60f0fd0),LL(0x0f6051df,0x5efdc9a4),
+ LL(0xd2fd3d8c,0x456e8957),LL(0x5374a59a,0x22dbddfd),LL(0x2a3a89ab,0xbac78cef), LL(0xc10c1d79,0x9c3ba82a),LL(0xa3dd19d1,0x1f935fcc),LL(0x1919803f,0xeb08bb8f),
+ LL(0x6500b9f4,0xddb31f74),LL(0xe0649288,0xaf383638),LL(0x861c8b10,0xe0dbe97a), LL(0x76552cfe,0xca7ec939),LL(0xfe33f78b,0x7aec0efb),LL(0x11123c97,0xf4548120),
+ LL(0x53e3f6a8,0x900bdaa4),LL(0x03a79d16,0xbe717d84),LL(0x5f55a064,0x3c99d359), LL(0x7553c946,0xdfd860a0),LL(0xf4133310,0xb4480bb2),LL(0x4f946025,0x6401d83d),
+ LL(0x1f75cad5,0xa03d7c76),LL(0xf4042451,0x97da3fcd),LL(0xcbdbfbe2,0x6a1b945d), LL(0x7a8cce9d,0x516a95b8),LL(0x30905cc3,0xb16e3a1e),LL(0xfcfc0d25,0x6adefe9e),
+ LL(0xae7626a8,0x3d86d527),LL(0xfeb4e78c,0xdecc9c13),LL(0xf94a1fd5,0x3ba67e62), LL(0x8e7a588c,0xf5ac7572),LL(0x0fd2201e,0x2b741d8f),LL(0x20073536,0x3be1b453),
+ LL(0xcba034d7,0xe2b80fd1),LL(0xb0031b65,0x6edad8d5),LL(0x927a36ec,0x3aee1cb4), LL(0xe39b9efd,0xbb88d751),LL(0xc92d3641,0x0129b42f),LL(0xd09b53ac,0x4b434faa),
+ LL(0xdde24bc8,0x15b64975),LL(0xb1d4c6ee,0x481df832),LL(0xb358244d,0xae6cc85d), LL(0x6e6afac6,0xd54043d7),LL(0xc89eec23,0x50af2efc),LL(0xb2d29f99,0xf5fab1cc),
+ LL(0xb6f646fa,0x41e0d32a),LL(0x6faa2688,0xec8093eb),LL(0x42550962,0x991ad76f), LL(0x07681a7f,0xcd41aff9),LL(0x0304701d,0x1316c11d),LL(0x133a0046,0xcce7ab79),
+ LL(0x79249a06,0x34db09fa),LL(0x48f2c060,0xf3356247),LL(0xfc942369,0xe8272db6), LL(0x9849b02d,0x2b844d9c),LL(0x5af3f78c,0x8cc29c86),LL(0x79d64275,0x0bf13430),
+ LL(0x5c5ea1b6,0xa299919b),LL(0xd6ef8e0e,0xb6184c83),LL(0xf2084644,0x3628b342), LL(0xe68eb3e3,0x017b62a9),LL(0x6f608feb,0x6d5b1e74),LL(0x8218965a,0x1b45f2e2),
+ LL(0x3529b0e2,0x76707d69),LL(0x60a070db,0x64fb0f14),LL(0x83396a82,0x42737c50), LL(0x3b5d56c9,0x74698c2d),LL(0x284fca9f,0xa8fceed2),LL(0xe3d44208,0x30c3e857),
+ LL(0xe3bfd480,0x78614fa4),LL(0xa0e38787,0x51ce5be0),LL(0x4d57abb0,0xa92d75fa), LL(0x9fad5db2,0x8d4d97f2),LL(0x1ed2bf25,0x701a80b0),LL(0x3a2db6d9,0x8bac6dfd),
+ LL(0x3bb9e4df,0x092ecae1),LL(0x1a72623d,0xb57cfcce),LL(0xdac4d79c,0x38943831), LL(0x1340b17f,0x7bf10d57),LL(0x89300f7c,0xac6ec65d),LL(0xf71b46d5,0x1d4109cb),
+ LL(0xcb8aeb3f,0xa00a19e7),LL(0x18b1c766,0x850b5102),LL(0x6318ebe3,0x3ec2566d), LL(0x42b9bbaf,0x8e70f71f),LL(0xb35f50b3,0x777d9ed5),LL(0xccf46394,0x332280ce),
+ LL(0x87ceef93,0xf49974f8),LL(0x371f9494,0x06bef26e),LL(0xe9ac3207,0xa5e9736d), LL(0x9df3a98e,0x83769455),LL(0x8dd1f6f9,0x1ccdbfca),LL(0xe399f893,0x8b554d16),
+ LL(0xefc22c30,0x36752ea8),LL(0xff7e7724,0x104614bf),LL(0x3a74e7a5,0x306ea93d), LL(0x1c1b929a,0xae54fe5c),LL(0x289c4ec7,0xd8ed29e0),LL(0x105ca5d9,0x6153b2a0),
+ LL(0x29494bd7,0x5e854f89),LL(0x04a28ba0,0x85a970a5),LL(0x394d6453,0x9422f2ac), LL(0x4df93f6b,0x8e084e65),LL(0x9cbe0ba0,0x3963ac8e),LL(0x84ce0da3,0xd8aec4c5),
+ LL(0x9cb36f40,0xd3d12931),LL(0x36f44ee4,0x5868644a),LL(0x92d4f69a,0xa2106e73), LL(0xa33cf53e,0x2987838c),LL(0xe1a0a530,0x8085e7c7),LL(0x906c8b5a,0xfe92589b),
+ LL(0x0056310a,0x67d14723),LL(0x9e76d3b8,0xbb0a63ad),LL(0x299a1026,0xe8012f4b), LL(0x9d1ee6ac,0x620ecb4b),LL(0xd16c0542,0xd7f0c277),LL(0xe42209e3,0x8dc7db24),
+ LL(0xb0f70b40,0xbc708816),LL(0x979dc8d3,0xefe99e05),LL(0xc18443d4,0x80932dc0), LL(0xd18a619c,0xea8bf51a),LL(0x9468aa4b,0xbc18f6ca),LL(0xc3414f98,0xa296c07d),
+ LL(0xe4242d98,0x6cf05251),LL(0x656af78b,0x3e220300),LL(0x23a061af,0x0fdbbc02), LL(0xe31e3724,0xcd04e892),LL(0x629b6426,0xf5c0c669),LL(0xf4bf0309,0x9499d7ec),
+ LL(0x685aa7b3,0x0e8c0c01),LL(0xd6abde69,0xf9179568),LL(0x8273d4cf,0x9bab3bd4), LL(0x90b3b1df,0x21b5831c),LL(0xfe3fe362,0xa86800a5),LL(0x244e7750,0x1b1f0560),
+ LL(0x6ec31a03,0x45e0b747),LL(0xe1072284,0xe2ebe7fd),LL(0xec603fd9,0x9f5c1060), LL(0xf78eec39,0xab1556b3),LL(0x9ad1144b,0xbc3da215),LL(0x3ac47d57,0x84785cf3),
+ LL(0x49ffcfa9,0x9c91a508),LL(0x609ea085,0xc6f3b880),LL(0x673b6c64,0x9883274f), LL(0x8302014d,0x3b40d18c),LL(0x599dff26,0x9c68a876),LL(0x1d6601fc,0x689e6aea),
+ LL(0xac0742df,0x80d1dbe3),LL(0x08f7ebbd,0xba614de7),LL(0x9d2a62b1,0x69a683fb), LL(0xc964cf44,0x2c1a9700),LL(0x6bdd35c1,0xeb51e86a),LL(0x02fff771,0xcea21c66),
+ LL(0x42d0fe7d,0x89b1dfdd),LL(0x85376650,0xa2a98bb3),LL(0x94d35fef,0x4f94ad00), LL(0xbd9991f1,0xe483a5b9),LL(0xce3c5861,0x8a2f4bb3),LL(0x9b125141,0x0fa548d3),
+ LL(0x914022da,0xec7c9526),LL(0x44ce5265,0x21974559),LL(0x11bbfb98,0xfdc0f3b4), LL(0x077f573e,0x59c23e06),LL(0x4c97db66,0xf09dfcc0),LL(0x56abb779,0x537a65cc),
+ LL(0x08a4b325,0x11440278),LL(0x0980ea50,0xf848026a),LL(0x676accd3,0x4c3ebe77), LL(0xb9eaeece,0x560720d4),LL(0x0940b1b7,0x78f3fbdb),LL(0x3d9d9db6,0xed41f518),
+ LL(0xd0762b40,0x7098160c),LL(0xd83f532c,0xb70a2692),LL(0xa861e3ae,0x4d388dfa), LL(0xb6eb9422,0x4c663b91),LL(0x867c33b3,0x16423348),LL(0xa8a6c969,0x291f41c6),
+ LL(0xd5028ec8,0xd9ad7bad),LL(0x02886a38,0xdaaa8d81),LL(0x2a6977bc,0xa1f8c88c), LL(0xad4366c0,0xad549474),LL(0xae44ac0b,0x36c0cffa),LL(0xeff81937,0x98fbbad5),
+ LL(0x23a08ab0,0xbe19d7e3),LL(0xf3339f11,0xc5d656d6),LL(0x1c1ecd0d,0xf11fa3f3), LL(0x3cadfca3,0xe59f4653),LL(0xaeb0abcb,0x6901c263),LL(0x46ba47b6,0xe409428d),
+ LL(0x3e3c4443,0xec64fc99),LL(0xefabc7a2,0x906e0f24),LL(0xcb0e7955,0xd3d83a34), LL(0x2801f179,0x932e43c1),LL(0xecfcc1d0,0xa02e934b),LL(0xea7f5e30,0xfe881c78),
+ LL(0x96e7b595,0x2be7b0b5),LL(0xc93de911,0x87aed5b7),LL(0xf98e09ee,0xe0574143), LL(0x84396d55,0x7dca05ee),LL(0xbe0f509b,0xf643767c),LL(0xc4d026c7,0x3e216685),
+ LL(0x4bf02e63,0xbd80154b),LL(0x9eb6f151,0x195227a0),LL(0x3ea46c97,0x07e13a17), LL(0x2363d5e9,0x9dcd5c80),LL(0x48c4488f,0x511f8482),LL(0x6cad16d3,0x7c333567),
+ LL(0x46373252,0x2b07ac5a),LL(0xa0decd5f,0x90999421),LL(0xb9e96cce,0x96747330), LL(0x5632ceab,0x82d5a2c1),LL(0x636dddf2,0x73828eca),LL(0xf65213f2,0xd6797c5d),
+ LL(0x64911f54,0x20daab28),LL(0xc600c4de,0x01e50c2a),LL(0x63487592,0x2111ded1), LL(0x8f857962,0xcd1073ae),LL(0xb7ae56ad,0xb4caf0a9),LL(0xd86137f2,0x416f957f),
+ LL(0x11b1bc91,0x8f563687),LL(0xaa0794bf,0x4e72baac),LL(0x91c1bc51,0x932208a9), LL(0x2ae20dc1,0x5e2bb84b),LL(0xea1e042f,0x598ceb61),LL(0x5004d259,0xd635344b),
+ LL(0x1a52940d,0xed0255c2),LL(0xe03eca1f,0x4150996f),LL(0x23f5b4d1,0x3aacce4e), LL(0xed0cf35f,0xcb550cd0),LL(0xa494561e,0xea36f4b7),LL(0xebef6e80,0x41cb8c5f),
+ LL(0x879159f8,0xb73d9294),LL(0x7ca6da8e,0xc9eb2492),LL(0x1844cdd2,0xba2e5973), LL(0x7f9e35dc,0x544261cc),LL(0xea359cba,0xd5e6aff7),LL(0x24c0084a,0x066e78f8),
+ LL(0xeedeaac4,0xd7604eb4),LL(0xa5c24ee9,0xaf1638b2),LL(0xfa90be8f,0xe4a2346d), LL(0x3004fb1e,0xbd43097a),LL(0xb073fbcc,0x442aafb2),LL(0xfdc31cd4,0x290829b1),
+},
+/* digit=12 base_pwr=2^84 */
+{
+ LL(0x514a7898,0xe8d780ad),LL(0x4494b63e,0x328ab404),LL(0x8744b64b,0xd2f0e876), LL(0x04b2c586,0xbd70e64c),LL(0xf8a4ba4f,0x5658ddee),LL(0x6ac85e37,0x3219d4c7),
+ LL(0xa9c333d1,0xfc159a9c),LL(0x40607a08,0x02ba3b00),LL(0xbab9d4d1,0x6912063f), LL(0xdfb380c0,0x206a4fc7),LL(0x9a973b24,0xdaf80877),LL(0xb68651e7,0x95fd7ff4),
+ LL(0xe8792caa,0x188e1e12),LL(0x02bc1f2b,0x5fa2294a),LL(0x69b0d8b0,0xe3949d79), LL(0x216824ea,0x7d86c141),LL(0x8b1e5097,0x7f37c42b),LL(0x92789c7b,0x08d30e6e),
+ LL(0xa1ef9f43,0x07cfa020),LL(0x930de093,0xc17f6f2a),LL(0x241ddea8,0x9589ec4c), LL(0xf3c510a8,0xfd97e3b2),LL(0x182c452d,0xbce604aa),LL(0x40027066,0xf22902d5),
+ LL(0x3293d199,0xc5644219),LL(0xf219caa6,0x393795af),LL(0xd5c761c5,0x7db08017), LL(0x3853454c,0x8d7e1f84),LL(0x29caaa33,0xe327130c),LL(0xb25301f0,0x5f09f900),
+ LL(0x4e8c95fc,0xf87caee2),LL(0xd0ce4d35,0x631480fd),LL(0x79b8b374,0x4449a646), LL(0xd413863e,0x1eed07c7),LL(0x013cba81,0x0f3da431),LL(0xbc56baf3,0x8cc5bf37),
+ LL(0x70315569,0x15bb751f),LL(0x676c5956,0xdff9fa34),LL(0x9e87acdf,0x0f196a3c), LL(0xf121946f,0xab7ac330),LL(0xab0ad7f7,0x5e9ba277),LL(0xd0c2d9c0,0x4951ba09),
+ LL(0x9ed1500e,0x22bf13fb),LL(0x59f5da53,0x67273921),LL(0xfe704a34,0xe840d89a), LL(0xda4b1fa3,0xb4d02cc7),LL(0x2895a3f9,0xba32df4e),LL(0xdea82804,0x6986cfc6),
+ LL(0x5da22871,0xe56de760),LL(0xa8a67254,0xe13cb688),LL(0xcdcd1ae1,0x3834e31a), LL(0xf18fd6d9,0x9c68e6a3),LL(0xfc21c435,0x695c7ff0),LL(0xe7b0f948,0x99254013),
+ LL(0xebb3db6a,0x229fd0ae),LL(0x22db0b74,0xae94f977),LL(0xae623467,0xa05744c8), LL(0x8556c819,0x3bbcfbe2),LL(0x60bdc20c,0x39d79df9),LL(0x59b1b053,0xdc97b133),
+ LL(0xd4d6ee50,0x9f703270),LL(0xa184f3ed,0xd444c71d),LL(0x978e07a9,0x7918b4b1), LL(0xbc8d8792,0x970363af),LL(0x02b0f92e,0x17f5dc50),LL(0xc8c384c4,0x2554094f),
+ LL(0x2ccd5235,0x9637b2a2),LL(0x27e2ac09,0x75dba5f0),LL(0xbae90634,0xda15c76b), LL(0xe38c9c8e,0xa8374267),LL(0x2c3af338,0x062f336b),LL(0x66c7b787,0x2fa98651),
+ LL(0x0837c3ac,0xc2a0d764),LL(0x62680588,0x43ba0369),LL(0x5c8c094c,0x8ec53f20), LL(0x5e289f3c,0x0ff5b7bb),LL(0xa5268547,0x8785c02f),LL(0xf5cd3301,0x1f17344d),
+ LL(0x6269e364,0x8b71131f),LL(0xe5772b51,0xe8bda70e),LL(0x9ec4dbc0,0x76ca9cf6), LL(0x6b091b64,0xe6f8b934),LL(0x8b563cf7,0xda109f46),LL(0x4b3bb11d,0xb109f7e0),
+ LL(0x0beddcf4,0xf97b7930),LL(0x9c3c946b,0x342f1b05),LL(0x0204a23f,0x4a73cecf), LL(0xe3adbd26,0x15f75cd1),LL(0x41c9110c,0xf09a81fb),LL(0xf5d8cda5,0x88dc3f03),
+ LL(0x8c96a49d,0x960481f1),LL(0x464ab9fc,0xc6b88ef5),LL(0x8849c44e,0x67e3f698), LL(0x5956b294,0x32068517),LL(0xd22cadb5,0x3705b95a),LL(0x836f6d0e,0x567b470d),
+ LL(0xcd97cefe,0x441ff140),LL(0x54db07ef,0x659b7aa0),LL(0xfe435aa3,0x8784a63a), LL(0xf04a616d,0x1d970140),LL(0x53af3b98,0xe29b21bb),LL(0x6bb3c12a,0xe6d0f2b8),
+ LL(0x368f5fc6,0x02132f5d),LL(0x66fdcb81,0x49d6a524),LL(0x9c2be80a,0x05aa3ab5), LL(0xc2500560,0xb7b2f0f3),LL(0x37df204b,0x6359ab2c),LL(0x6d32b4ab,0x25a10b66),
+ LL(0xf6591fb3,0x03360968),LL(0xc52b20c7,0x16a7fad4),LL(0xb2062758,0x4140a2e8), LL(0xd82f2254,0x905dee52),LL(0x53363565,0x29405a93),LL(0x416c034d,0x1ba1ab88),
+ LL(0xddd5cfd7,0x8bc8af26),LL(0xc77da82b,0x658c496b),LL(0x1827a062,0xd77384a1), LL(0xfce01201,0xee17f994),LL(0x2d3b276d,0x46605636),LL(0xff5d6088,0x02a31f1b),
+ LL(0x9e7536a0,0xdb49e057),LL(0x99c35008,0xbcc58d33),LL(0xb687e5e3,0x1f8bc7f4), LL(0x72027d06,0x8638a410),LL(0x2049ced9,0x0c6a070f),LL(0x69ef4623,0xd2729607),
+ LL(0x3355ca14,0x32aef267),LL(0x848620d7,0x8bbdfbda),LL(0xb0bcc374,0x65eccd58), LL(0x0370119b,0x15730aad),LL(0x349eba95,0xc7d99e64),LL(0x27105839,0xd30d076f),
+ LL(0x9f258a16,0xcccc32e2),LL(0x535d3667,0x1dacc394),LL(0x81f623e7,0x3f955c62), LL(0x38cb46b2,0xfe599a1f),LL(0x831c4abc,0x88fa6156),LL(0x1708497b,0xb9242cc8),
+ LL(0xffd874ce,0x9bf9b706),LL(0xa0f974f9,0xf632747c),LL(0xd17df676,0x3f1263b7), LL(0x44df1a8a,0xd7c0eb1a),LL(0x382c181a,0xaaac2337),LL(0xef3d9b5d,0x8cf66156),
+ LL(0x5bd8a32b,0x1d1d11dc),LL(0x8663b96a,0x57cdb2bf),LL(0xd7aca4c0,0x0983005a), LL(0x50c2f986,0xb3cffa36),LL(0x65f29ae6,0x069eb437),LL(0xec49900e,0xd896f1aa),
+ LL(0x455dcf4f,0x7152f4c1),LL(0x238cda30,0xa6b6e460),LL(0x2b553cad,0xb4b732b3), LL(0xe87524d0,0xa6d73263),LL(0x378032e6,0x6d48d14c),LL(0x0366d951,0xde0def0d),
+ LL(0x258e8fa1,0xf3647476),LL(0xd3d8e3c9,0x11f581d6),LL(0x3da389c4,0xf95d4219), LL(0xdd4c30f4,0xfe37e7d7),LL(0xcf2e5808,0x9a47035d),LL(0xbcccbd4e,0xe167952c),
+ LL(0xf19a3807,0x26816e58),LL(0x34036c34,0xbcdfe39a),LL(0x559a4898,0xa9d96a3c), LL(0x5922653b,0x2be83f20),LL(0xdb63d585,0x31e57750),LL(0x90d8cdb6,0xe25a5789),
+ LL(0x07016f2e,0x7598794f),LL(0x5b52794b,0x8631b406),LL(0x0473326c,0x4a7a3e13), LL(0x38098ff0,0xfa8445dc),LL(0x224ae6d5,0xe0829d6c),LL(0xa34dbb8b,0xb4ecb6ec),
+ LL(0x41a5e88e,0x505e3c0d),LL(0x3428e632,0xedcfa76d),LL(0x7378d468,0x1a6892e9), LL(0x3387bfd7,0xcf8f2e12),LL(0xcfedce94,0x75c21720),LL(0x64252690,0x92bd9a2d),
+ LL(0x7db48f12,0xb3dc859a),LL(0xa7e11cf8,0xf26b3a7f),LL(0x4b8bcf8c,0x38994648), LL(0xf70596d4,0xbe5e497b),LL(0x475a1d46,0xb0e98337),LL(0xb6229496,0x15d374ea),
+ LL(0xaffa1419,0x10c53832),LL(0xca139934,0x41d4f8c7),LL(0x2df85ac8,0x39e8b454), LL(0x835eedf8,0x8c98e7d9),LL(0xa2d40a9b,0xd931771c),LL(0x7f3156e2,0xf172ea3d),
+ LL(0x85791984,0x551aa33e),LL(0x5a936719,0xe7900736),LL(0x706f62f6,0x6cf471c1), LL(0x35562192,0xee2f4edb),LL(0x23457cb9,0xa3b54c39),LL(0xbfa40e0a,0x893cc476),
+ LL(0x84db691f,0x9fdf4d5a),LL(0x1b4ae453,0x9c0411b9),LL(0xa116f967,0x49d4f2d8), LL(0x0b67725e,0x76a1f188),LL(0xc88bd7ed,0xe7d9ffcd),LL(0x68698380,0xc0d8b68d),
+ LL(0x689cd83d,0xa6a6cba8),LL(0x9cff9c33,0x2f3e63e2),LL(0x86212397,0xf4698015), LL(0x84afdbb8,0xbdda0fc7),LL(0x582808e9,0x03350c9b),LL(0xb37b0173,0x2682ff4a),
+ LL(0xbc9fa923,0x8bd44537),LL(0x62a20c38,0x68ce391a),LL(0xa248616b,0x22585962), LL(0xe3f811fb,0x5dd9a480),LL(0x8909e98b,0xea0859e8),LL(0xa790c444,0x5f7e1b54),
+ LL(0x62155fc6,0xb10a93d1),LL(0x0700ee23,0x32320e65),LL(0xc17d480b,0x9eb37705), LL(0xae0b68e3,0x21f11ede),LL(0xda53ea55,0x999286c3),LL(0xa359fe14,0x97dee225),
+ LL(0x1f39aaa7,0xa59acbcd),LL(0xaaf5a212,0x5386d1a7),LL(0xcbc7628e,0xbda27b0b), LL(0x8a7e5aa7,0x6bd51dca),LL(0x59bbf399,0xb7dbe2e2),LL(0x81cc4d35,0xc15c94bf),
+ LL(0xaeb9c83c,0x600a3d7b),LL(0x8659b786,0x2b13cbc2),LL(0x5cc8f7f6,0xeac2aed7), LL(0x6bf18dea,0xfc7f4bb5),LL(0x11ea3f69,0xc2d16cb7),LL(0x341cbeea,0x69784d06),
+ LL(0xbe212759,0x5b823c92),LL(0x0f3cd127,0xa65cc417),LL(0xe67e7aeb,0xd7ba38a5), LL(0xe796850c,0x4e572182),LL(0xf9fc752f,0x36463b09),LL(0x1b698241,0x26827970),
+ LL(0x7c17865d,0x4cb9ca41),LL(0x7e6cfd97,0x214fe7d9),LL(0x4f587903,0x61d96b63), LL(0xec411bc5,0xb0101b58),LL(0x77f687cf,0x36692f2c),LL(0xcc9bfb45,0xe54d3eac),
+ LL(0x99723bab,0x121bfab7),LL(0x0884ebfb,0x893ab325),LL(0x6502d3f7,0x0e6788ad), LL(0xb7a108f2,0xb0513c5b),LL(0x4b2eef9c,0xa4f73e16),LL(0x6a483c20,0x342415c6),
+ LL(0xe752defe,0x39a27b3f),LL(0x9126ae15,0x0d86022f),LL(0x68883326,0xd8ba4a8e), LL(0x3b100c9a,0x715f52c8),LL(0x4addc384,0x336e496a),LL(0x8a6f3e95,0xec21f02c),
+ LL(0x7769257d,0x2894dfef),LL(0x5ac4bb61,0x2fd58cea),LL(0x708fac5f,0x3cf6d8b6), LL(0xe836e867,0xa76d99fc),LL(0x42a369eb,0x0d863adf),LL(0x15d821ff,0x82c333e2),
+ LL(0x4042c21a,0x9143b876),LL(0xc737f640,0x0c242403),LL(0xc719ca5a,0x7c397a93), LL(0x022b09e8,0xcf7897df),LL(0x12178c00,0x5c92e3dc),LL(0x4bd00abc,0x4fb2687d),
+ LL(0x911220ce,0x5750f3ec),LL(0xfb86ec9f,0x58bb4fbf),LL(0x94d00517,0xe33fcc7d), LL(0x5d9eefa0,0xa09ae695),LL(0x9756d5a4,0x3a331936),LL(0xf5c16f2c,0xc6da863b),
+ LL(0x07532fc8,0x05c5e926),LL(0x9d0d96bb,0xfe0c58e9),LL(0xcff62c16,0x98056d33), LL(0x346a4ec2,0x77cbe60b),LL(0xf43fd4c2,0x40989b21),LL(0xfd0645ec,0x1a3c47ee),
+ LL(0x5f51dc39,0x91089174),LL(0xb5a23122,0x7cbbe6a0),LL(0x8c2818e7,0x83b5abb0), LL(0xb9e654d4,0x24081e1a),LL(0x5ba06cb3,0x63528af7),LL(0x69d7dcc6,0xf570710c),
+ LL(0xb34b5890,0x583afeef),LL(0xc813cc91,0x6095edb9),LL(0xd3c329f1,0x166a5e48), LL(0x33293a13,0xee878e89),LL(0xeb1ad806,0xe6c0325e),LL(0x210c80b5,0x8add3663),
+ LL(0x3811f849,0x6b9517b7),LL(0x9d8bad91,0xd0aa5e75),LL(0x3160bda4,0xf70a8172), LL(0x916ce0d5,0x24b52ea7),LL(0xac05f7b8,0x13da7006),LL(0xbd773df2,0x1213f1bf),
+ LL(0x72d96f4d,0x22b2b776),LL(0x98ecfb1e,0xb0c964b2),LL(0xba7dd824,0xed9d0828), LL(0x869c0f63,0x6faddff3),LL(0xf8b13355,0x2b409d2c),LL(0x31237c9a,0x53431320),
+ LL(0x72a9170c,0xde41027d),LL(0x3a82f137,0x40f7b012),LL(0x099b7d4a,0x343a36ac), LL(0x2606178e,0xbe82d933),LL(0x19c93f1e,0x741f76ea),LL(0x27fd9465,0xd13d492f),
+ LL(0xf2518396,0x9b09dc67),LL(0x14669921,0xa79dc92b),LL(0xbea82992,0x0eb149ce), LL(0x13c60cbc,0x62ff22de),LL(0x6141a946,0x610724f4),LL(0x0793021b,0xf57b976b),
+ LL(0xc699a47f,0x0e516c18),LL(0x5d6f8d8f,0xd719adfb),LL(0xbdb43f6e,0xf067a17e), LL(0x0b490085,0xce5eb760),LL(0xcfebbb1d,0x15113e6a),LL(0xee6d2951,0x2194fd0a),
+ LL(0xd1abb57b,0x0bddf14e),LL(0x3416ad68,0xe0e768c2),LL(0xc4534e1b,0x0326b07d), LL(0x3da9b4be,0x796b6192),LL(0x474dbec9,0x85976f8b),LL(0x64001998,0xe1b892ef),
+ LL(0x3ddc43d1,0xb387d9c2),LL(0xdcc58653,0xd879f295),LL(0x316adb79,0x680e4335), LL(0x771da848,0x6ebecfdd),LL(0x98e7ae92,0x21e44da1),LL(0x2a3e21ba,0xf7db9238),
+ LL(0x6d480c11,0x7be805ba),LL(0x5ed87195,0x657824d5),LL(0x152a427d,0xad9bb855), LL(0xd479e14d,0x54fa5b2b),LL(0x967d66b3,0x393ff9fd),LL(0x1f8cde27,0x2e20e269),
+ LL(0xced8a78d,0xbc607c2a),LL(0xa8eed88d,0x191f87df),LL(0x5861efa0,0xae1d6b52), LL(0xcafa53fe,0x57c60dc3),LL(0x67c35922,0xb27b8932),LL(0x9b29125d,0x0fa6246f),
+ LL(0xb808e2df,0x50a069c2),LL(0x9a88a445,0x84e557c0),LL(0x38d713c5,0x27e6460d), LL(0x3c86b058,0x7b410b71),LL(0xb1b113ec,0x93fa53b8),LL(0x7441167f,0xc634cba5),
+ LL(0x282c12ce,0x1e671bc2),LL(0xa604f3aa,0x39b311ce),LL(0x78a148f0,0x98bd47d2), LL(0x371a0da8,0x5e27388b),LL(0x0fd9e315,0xfa513fbd),LL(0x34376073,0x611e38e3),
+ LL(0xb58100d4,0xd5ebd78f),LL(0x6e9f40fc,0x274fae3f),LL(0x8942e656,0xc1a74338), LL(0x46604337,0x6c53a23e),LL(0x660df2a9,0x2ed93bd4),LL(0xbf37f8e3,0xdfa53649),
+ LL(0xa0632b8b,0x02511435),LL(0x3a69fc4e,0xdf7abcb9),LL(0xd9e52727,0x6717e277), LL(0x929a903a,0x990834f2),LL(0x80c4abbb,0x8b89a584),LL(0x94e5ac4c,0xd57fcb53),
+ LL(0x6acebef8,0x7293af18),LL(0xdc7aa8d3,0x12646628),LL(0x409608e9,0x89165145), LL(0x01ea6183,0x9086b84f),LL(0x78ce39d6,0xc508268d),LL(0x6ff226ec,0x1d30f560),
+ LL(0xdd6833a4,0x49bf690d),LL(0xa575c955,0xf290aff6),LL(0x7bfea4f5,0x0e0b673b), LL(0x8e59e02b,0x3fa210fa),LL(0xbbfb09d6,0xc1cecbf6),LL(0x670a5aa4,0xa76eef60),
+},
+/* digit=13 base_pwr=2^91 */
+{
+ LL(0x01c06ca9,0xa1498bce),LL(0x7a08bab0,0x21c01611),LL(0xca17bd74,0x2c85a0b7), LL(0x37d0f77a,0x7b903162),LL(0x6e81e65b,0xd14898cd),LL(0x218cd115,0xe0ed1f2f),
+ LL(0x1731d3e6,0x78c6c92d),LL(0x7d3b6343,0xee373594),LL(0x614f0ed3,0xc8e90901), LL(0x680df68d,0x9dd54b4b),LL(0x983f94c5,0xd0c3cba6),LL(0xe9dd9140,0x80983823),
+ LL(0x9da2d6f5,0x3de0421a),LL(0xe135d7df,0x933d779e),LL(0x45fbc83f,0xdcc10777), LL(0x552833c4,0x437d64cc),LL(0x581bf745,0x616eb481),LL(0xaf9d7fdf,0xc3d7614b),
+ LL(0x4b010379,0x72673639),LL(0xb40b8ccd,0x784d95cd),LL(0x32191a11,0x3647d089), LL(0x83ad425e,0x1383335b),LL(0x5ed3ff39,0x3c5b0250),LL(0xa814df0f,0xf1f78c9e),
+ LL(0xd81332fb,0x48ee4921),LL(0x75c4a231,0x62f08af2),LL(0x52b5815b,0x81cee592), LL(0x47ff2530,0x5ee938f3),LL(0xbb73d595,0x9a58ec1e),LL(0x29b94b64,0x473405f4),
+ LL(0x0f89bcf3,0x423677b2),LL(0x3746d402,0xaafec85e),LL(0x8cec15af,0xb61ce3f8), LL(0x5ba02dd3,0x7618d63f),LL(0xc28a6515,0x4f774238),LL(0xe74d6f15,0xf6a3b5c5),
+ LL(0x0a141a66,0x695b4444),LL(0x09e7251e,0x9b502847),LL(0xa2883803,0x52285abb), LL(0x5f2f7fb4,0x71858bb4),LL(0xa5943828,0xbf5eef5c),LL(0x81bbe54b,0xb29d0c74),
+ LL(0xaa092e25,0x83536ebb),LL(0xb4e5d213,0x4768e469),LL(0x8289c98b,0xb540b589), LL(0x080c0531,0x350a6e40),LL(0x590b38c3,0x94d12807),LL(0x40fe5f65,0x83badade),
+ LL(0xe86caac6,0xd77e33c7),LL(0xb8ead427,0xd1935c95),LL(0x5183cc83,0xde18e630), LL(0x261521a1,0xbdcd00f1),LL(0xc82809bb,0xbd18e1d9),LL(0xf960fc2b,0xe142711a),
+ LL(0x1da8931c,0xdfe9e3bf),LL(0x6e1829f7,0xeb943b45),LL(0xe6eeee44,0xa1c817bb), LL(0x4fdd6559,0x0f852c30),LL(0xa27f2549,0xd9ad9b4d),LL(0xfb111f65,0x266fb914),
+ LL(0x917fc712,0xa20f882d),LL(0xf7566719,0xd05d7f13),LL(0x12c11721,0xd5c196b9), LL(0xc566b104,0x3eba0c8a),LL(0xecae1039,0xe301bd90),LL(0xfb24c348,0xd64eb499),
+ LL(0xb4738f00,0xa0c38991),LL(0xe4dd35c2,0x63bc012b),LL(0xf72495e7,0x980e89b0), LL(0x68ad6dd8,0xb530252c),LL(0x2642e8d1,0x35d6d8ef),LL(0xc235ef4f,0x1309691e),
+ LL(0x7262cd15,0x64a61d20),LL(0x04da445b,0xf2916951),LL(0x4ed50bd4,0x3beb5815), LL(0xe0204220,0x35638863),LL(0x69f21c08,0x8929e2ab),LL(0x14756735,0x5f273190),
+ LL(0x819c11ec,0x47befaa3),LL(0x90deb435,0x3bcfa2d2),LL(0x19569f95,0x4caca5ba), LL(0xd48453ad,0xbc78fd0f),LL(0xfa2100f2,0x7e4c3646),LL(0xf96c19da,0xc75a1a82),
+ LL(0xed646507,0x6e45f6c3),LL(0x86558b67,0xae0601e1),LL(0x3ccec830,0x20634c8e), LL(0x7c87c192,0xc3fea47e),LL(0xb66a402d,0xf14aba2e),LL(0x5bb3f7e1,0x8dcecf35),
+ LL(0x9751dc6a,0x33396804),LL(0x1c107cd8,0xc56b5879),LL(0x5b41235b,0xd8a41e90), LL(0x35971626,0xa956148b),LL(0x79168709,0x185bfe69),LL(0xeba02351,0x32829b76),
+ LL(0x39f2bf71,0x28f979a3),LL(0x53316bad,0x212c0931),LL(0xc1f8d9f1,0xf02710c6), LL(0xbb871267,0x6e6cbf36),LL(0x9c425ef5,0x11c79382),LL(0xb94f8b01,0x6ce18819),
+ LL(0xbd5bf1f3,0xd9a44d46),LL(0xda2c3d1d,0x662f70a1),LL(0xb13563ca,0x43d5374b), LL(0xcbcce692,0x8f4ad04c),LL(0x0c72e84b,0x3151ee4d),LL(0x5accc2ed,0x50c80454),
+ LL(0x74697919,0xdce044f6),LL(0xedbef994,0xfce0b586),LL(0x8b92c529,0x0d47e307), LL(0x6ac46081,0x64904019),LL(0xad80c124,0x6f52cad2),LL(0x996d42ee,0x02f7e44d),
+ LL(0x6aa2e142,0x257eae2c),LL(0xba53beb1,0x747a167a),LL(0xa8f5eba2,0x3b3ac5e3), LL(0xb6fa720b,0x6c6ee79a),LL(0x3a7bd99a,0xf6dc5ff5),LL(0x1a36d3b5,0x2447970d),
+ LL(0x7b6c6e86,0xd717e889),LL(0xc64d98d4,0xb808d76c),LL(0x7f8c0bca,0x9a06f942), LL(0xb253f5b4,0x58b8b04b),LL(0x0c103d51,0x82d27325),LL(0x1810ceba,0x7dd6d9a6),
+ LL(0xa27bfff3,0x0a1f1bb3),LL(0x3f63695b,0x3ba841c4),LL(0x4dba6a84,0x0e4c6ef4), LL(0xc6d82a09,0xe283f321),LL(0x78f4a01f,0xd8bcb661),LL(0x504f48b4,0xf527ac07),
+ LL(0x750dfc07,0xade1c74f),LL(0xa0611072,0xb8acc3bd),LL(0xad13e407,0x3886a58c), LL(0x0011bec7,0xdf6dd4c5),LL(0x350b7b68,0x01d96ff3),LL(0x76a879ea,0x2be73b43),
+ LL(0xca38d7cf,0xc1eca6c4),LL(0xe4217860,0xed1d926b),LL(0x0c476828,0xffc2433d), LL(0xf0c18d59,0xee65a719),LL(0x0ca1dca8,0x6a00e59f),LL(0x10811b54,0xc137d01e),
+ LL(0x66442ac3,0x74f38545),LL(0x1ecdd1f4,0x4947a37b),LL(0x5407e0c6,0xdaf73a23), LL(0x14140508,0x1b6175f0),LL(0x7b23a861,0x628c409f),LL(0x60c7c2f4,0x2550fdb1),
+ LL(0xd23a25b8,0x0e026ec7),LL(0x2b9ed7bc,0x435dbf9e),LL(0x027cd584,0x16c87162), LL(0xd7f56db4,0xa3ab5d25),LL(0x7f477034,0x8c9fa8ef),LL(0xac46696a,0x2eb3909a),
+ LL(0x7bc6b191,0x6f288477),LL(0x72cf52e6,0x7857879c),LL(0x4438a334,0x9ccb9b67), LL(0x0110d13e,0x016f2b86),LL(0xa623a4ce,0x7355fff7),LL(0x88c1b0b9,0x1dd555dd),
+ LL(0x543e3d58,0xecc48b76),LL(0x63049aab,0x251ea3ca),LL(0x1753f7aa,0xd091864f), LL(0xd65af237,0x0fd2d1af),LL(0x0ac895b0,0x70403da1),LL(0xa89e9386,0x6c3bb93a),
+ LL(0x48e9bf38,0x4d1df04d),LL(0x36a1b91c,0x4d05792d),LL(0x6405251a,0xd07633cc), LL(0x3ef7d87d,0x0077621d),LL(0x0c74697c,0xb35da825),LL(0x2698f465,0x521ee502),
+ LL(0xf4454069,0x2f0af2e4),LL(0x0799d8f7,0x1c6595ad),LL(0x57d14169,0x8cc1b16b), LL(0x660a073c,0x6ef9a078),LL(0xcad9cb79,0x4d04db63),LL(0x2d73e47f,0xbd1843d6),
+ LL(0x9838b1cc,0xc34b6a45),LL(0xe4d57b01,0x37705ff3),LL(0x8dde6264,0x7b15a361), LL(0x7bf8c818,0x22c4dd55),LL(0xfccc811a,0x404bd481),LL(0x601ccc8a,0x6f6b37a1),
+ LL(0xd8ecaa77,0x033ee5b1),LL(0x59bdb383,0x4a6fbaa6),LL(0x991bd043,0x98d656cd), LL(0xc754b213,0x489d8614),LL(0xf6bcf12a,0xc57d54b4),LL(0x1023de85,0xd8b7ed83),
+ LL(0xdc84066f,0xcc88e0d0),LL(0x112d5d04,0x563deb7a),LL(0xe6715a55,0xcf71acb5), LL(0x29268b7f,0xf49a247f),LL(0x5b36fd67,0x8e53cf14),LL(0x06da22fa,0xa4093a91),
+ LL(0x2dfb4f20,0xfbe6fb96),LL(0xd6946271,0xadb8875c),LL(0xc95a344b,0x50528b99), LL(0xd2627469,0xd7442d08),LL(0x47e943cf,0xb8b049e1),LL(0x65cd148f,0xa47b0b3a),
+ LL(0x50579b69,0x1cd28588),LL(0xbb9f9f10,0x38acf2f6),LL(0x0b35f238,0x67eaec1e), LL(0x00a3119a,0x72fc9c42),LL(0x39f88c39,0xa1cfc76e),LL(0x14c7fda2,0x67b702d8),
+ LL(0xeeafce5a,0xe782ecf6),LL(0x5eccfbde,0x16b562b4),LL(0x2a70e93b,0x23a8eaf5), LL(0x64855ed4,0x0fb734f6),LL(0x2bd5f2b8,0xde37f9b5),LL(0x959a5858,0x3d01215d),
+ LL(0x667d4abf,0x5a4a7d0c),LL(0x68d13116,0xf4f05c66),LL(0xdb565813,0x09cc67cd), LL(0xb34d0f55,0x53d0e496),LL(0x5a179043,0xa4f11437),LL(0x39b26f7e,0xf4ed66b3),
+ LL(0xbf723512,0xc670ce6a),LL(0xb17e4ba3,0x5bbf65a7),LL(0x16e38386,0xb5ddc6ff), LL(0xb0dd0439,0x9c28d121),LL(0x66dfee98,0x06d89034),LL(0xf7d33983,0x547138ac),
+ LL(0x92a04c6b,0x8503bf04),LL(0x008a5092,0x8761e5ef),LL(0x13902f4b,0xfa9bfa8d), LL(0xd7c9b5cb,0xbc37af37),LL(0x9f7a27b8,0xcfb05e37),LL(0x1d5b124f,0x81418e4d),
+ LL(0x03353c76,0x0d57da43),LL(0xdd7feecd,0x3f36caaf),LL(0xdb56957c,0xdcaadf69), LL(0xb652acff,0x2c36792e),LL(0x4213d519,0xc5d03a97),LL(0x98734fe1,0x11c6aa92),
+ LL(0xf714efdd,0xeca42e87),LL(0x9655a0c3,0x9d65e8e3),LL(0xe741a619,0x5be55b09), LL(0x1066c180,0x53b47016),LL(0x805e1ebf,0xe9ddc1b3),LL(0x79a748ef,0xc1057ad9),
+ LL(0x66d0174b,0xb2d62622),LL(0x37c05be2,0x10a0512c),LL(0x63e47f0e,0xc2eeab52), LL(0x6f08ceef,0xce6e28b5),LL(0x2f1a5a13,0x7716afb7),LL(0xc55ab74e,0x83942c61),
+ LL(0x6539037b,0xcef92b51),LL(0xdc615b4b,0x04a4f1e8),LL(0x49e546ee,0x0d56014a), LL(0x94d44546,0xbc1437a1),LL(0x147375c2,0xfb1e3aca),LL(0xdfc71c1d,0xb0f2abf0),
+ LL(0x44424b7c,0xb5679c9d),LL(0x36c89cc1,0xde54d53d),LL(0xd9a702ed,0x23252ab5), LL(0xf775d90f,0xdccb09e3),LL(0x15cac902,0x28e652e9),LL(0x08ca0b18,0x193bd66a),
+ LL(0x7abafda3,0xb81c2e5e),LL(0xbe90ac49,0x34a1192a),LL(0x9d1512b5,0x5d6945d3), LL(0x9cb6c182,0x0184a059),LL(0x868f5d65,0x329ea8fd),LL(0x66410f60,0x03783cc2),
+ LL(0x1f3d38ad,0x8524ab85),LL(0x3ad4fe62,0x58a7ccec),LL(0x37ece281,0x6a00a442), LL(0x16a1a2ac,0xfa3d6fc3),LL(0xb727b625,0xf6fc8af9),LL(0x4c3b3361,0x42699573),
+ LL(0x22414f66,0x2f55c436),LL(0x512968a1,0x8869eec6),LL(0xd98ecda1,0x925a1ae7), LL(0x9fb914fe,0xf112e9e3),LL(0x60e41857,0x16496689),LL(0xc8f300d8,0x1f93ed91),
+ LL(0xc8208043,0xb3e2c2fc),LL(0x7f1acebb,0x19f61c61),LL(0xc1e96d31,0x1ff2f9dd), LL(0xf44de6f3,0xd956fdfb),LL(0x0685ff3a,0x101656c8),LL(0xb98bc38c,0xe725cebe),
+ LL(0x354b318c,0x77e2edcd),LL(0xe1580079,0x9ac1cfbd),LL(0xedff64a0,0xc3c197e8), LL(0xaa113966,0xa2da7af6),LL(0x0aa54ff6,0x8f9df560),LL(0x88555266,0x5aaaa100),
+ LL(0x4885a4fa,0x01e3a2fe),LL(0xc469f05d,0x4aea2d91),LL(0xb3ea443c,0xf5947f39), LL(0x34d7b0fc,0x6f22b634),LL(0x93042129,0xc843cc3e),LL(0x2f14f438,0xf884bf04),
+ LL(0xa710c7fe,0xa0a19c29),LL(0x3057ad61,0x7fabfd39),LL(0xfe6ff084,0x94e9125d), LL(0x100a8cf8,0xd4fdf49a),LL(0x55eac3de,0x1839418e),LL(0x1aa6a2ce,0x59253c55),
+ LL(0xee768081,0xe01ff1f4),LL(0x144d7219,0x083342a6),LL(0x51fe8705,0x34cfa650), LL(0x75c5938a,0x499516d1),LL(0xf2c8f347,0x6350e5fe),LL(0x73f4eb28,0xe030f2a7),
+ LL(0x035b04cd,0xcd5808db),LL(0xc6f54f17,0x93d6ac3f),LL(0xbae00379,0x56d72b91), LL(0xc7448e15,0x211f276f),LL(0xaecaad32,0x979d0736),LL(0xe64e8a11,0xe581cfa6),
+ LL(0x2904cb1e,0x94ac596c),LL(0x626952e7,0x53e1e42d),LL(0x775ae6d8,0xcc989b89), LL(0x44343d68,0x0fb5c605),LL(0x0f175322,0x87608356),LL(0x6db60843,0x182f1dd6),
+ LL(0xe8867c7c,0x0ad3c4a8),LL(0x103cb06f,0x5479684c),LL(0x14756b01,0xe2961491), LL(0x9dfc5ad6,0x5207d54f),LL(0x3c865a45,0x184260a4),LL(0xbea2f905,0xd1158cb4),
+ LL(0xc78b0c7f,0x9de51643),LL(0x31357d76,0x1a3b3589),LL(0x60f16852,0xc2175848), LL(0x4d90d2d7,0x5eb827a7),LL(0x79abe6d4,0xe83be898),LL(0xb0974ddc,0x7c03935b),
+ LL(0xd54dae93,0x7ae1a72b),LL(0x0144c969,0xd4c8e333),LL(0xac7744c4,0xb3b92e3c), LL(0x751865f4,0x81a6f8e6),LL(0xb9b51064,0x11e0f64a),LL(0x8cfce4fc,0xedbcfd08),
+ LL(0xfe811795,0xe33545de),LL(0x33edeb4a,0x663a0fc4),LL(0x23e2eaeb,0x0fb9d61f), LL(0x99b52602,0xf136b9ba),LL(0x766a8136,0x6a15e5ae),LL(0x05333f8f,0x5a1a79b6),
+ LL(0x5a85d6be,0xda1cb3bb),LL(0x835d8007,0x28e30bff),LL(0xef4cb0ee,0x6a8c3d85), LL(0xd6781054,0xe8517460),LL(0x48b0c592,0xa0234065),LL(0x4d7b7aa5,0x5cf1f874),
+ LL(0x9e511ada,0x007bf10f),LL(0x8687e7c5,0xc5edcfb1),LL(0x047a613c,0x507ca4c5), LL(0x8f117e83,0x3c8707d9),LL(0xe75c9755,0xda6e38e5),LL(0x6dbd6711,0xb3ffd623),
+ LL(0xb9e2ce9a,0x8530669d),LL(0x020d181a,0xffc85696),LL(0x02c1a8c3,0xfa2f2979), LL(0xee4a1a98,0x989146d8),LL(0x76ac6289,0xc3f98bc9),LL(0x76d28437,0x1d491a8a),
+ LL(0x3fb6cb28,0xf9d04b0c),LL(0xbc28bce9,0xf246e5c6),LL(0x48fd1173,0xd3d455ed), LL(0xe3e9d40a,0x00ea713a),LL(0xf5af8e29,0x4d4c9262),LL(0x9e95cf17,0xd5e49303),
+ LL(0x685350ef,0x9f5fe067),LL(0x788ffe11,0xe22b2f70),LL(0xe6ff086f,0x74d4e6e8), LL(0xa937a949,0xef631c8e),LL(0xd122a378,0x707bb8ff),LL(0xff54817b,0xc1ee7dda),
+ LL(0xfebc7fc2,0x328f6f5a),LL(0xd933fdc0,0x8333e284),LL(0x51ee741b,0x9c135c87), LL(0x90923a1a,0x856760be),LL(0x44a46bc0,0xbe7905c7),LL(0x77415a22,0xbdc7248e),
+},
+/* digit=14 base_pwr=2^98 */
+{
+ LL(0xd646c05b,0xd1893bfc),LL(0xa963fee4,0x4e61d76b),LL(0xbdcc95da,0x71adc08a), LL(0xdf5decf2,0x42f481e9),LL(0x0872ca53,0xbdfbba8b),LL(0x21ece5ce,0x0eabd6ac),
+ LL(0x45d4fc03,0xb2367fe3),LL(0x75cbdc62,0xb115bdad),LL(0xef8b952a,0x07522180), LL(0xfd23c45d,0xc0448864),LL(0x87eb202e,0x8c068193),LL(0x313c2e61,0x7fe87505),
+ LL(0xf2ede850,0xbfa39552),LL(0x93cab795,0xa40a845d),LL(0x09e97bd9,0x56ca4f4e), LL(0xccbdb84b,0x207a1e71),LL(0x1893a956,0xd0ce1e11),LL(0x84c34b10,0x7a22a433),
+ LL(0xe404586f,0x48becb6a),LL(0xf5d6372a,0xa136232d),LL(0x87ba83a5,0x438af2bd), LL(0xf4e459ff,0x37075ede),LL(0x582d1ce8,0xaa42aae7),LL(0x0daeb82b,0x973dba33),
+ LL(0xc40861a3,0x48bc98ae),LL(0xefd9a196,0xc100f037),LL(0x052eb352,0xda4029f6), LL(0xef34169d,0xd61b4933),LL(0xa357cc0b,0xcedde9cc),LL(0x4d006fcc,0x8983c01e),
+ LL(0x92f2a1c1,0x31ad5f19),LL(0x924bcb08,0x7c7a6319),LL(0xd0c36056,0xcbee249b), LL(0x5ac4f6eb,0x63135518),LL(0x37f8cd7c,0x8b2aaaed),LL(0x0b9bcd79,0xe71c855a),
+ LL(0x5828ecb9,0x1f12da90),LL(0xbed745a9,0xbd094b68),LL(0x59a321b0,0x27d4a84e), LL(0x71683549,0xd05c2695),LL(0xc9c9f2ae,0x56e4dcf2),LL(0x199abda7,0xdfff6393),
+ LL(0x576fff20,0xc28ae07c),LL(0xb9024805,0x88ed10b6),LL(0x851ed43d,0x81944c6a), LL(0x158549cd,0x31192f87),LL(0xff08eac3,0x36dce6e4),LL(0x9ffacd59,0x7837d3e2),
+ LL(0xc8329917,0xe820d2e4),LL(0xed56083c,0xc343156c),LL(0x67c118a9,0x60116d83), LL(0x699583a8,0xbf2c1598),LL(0xc03c3370,0x77da3db5),LL(0x88522e50,0x35b0e741),
+ LL(0x3e4cf4e3,0xcb945a8b),LL(0x45fbb1c3,0x1ac37aba),LL(0x7e016a40,0x05b3d362), LL(0x93c0799e,0x175cb9f3),LL(0x9102d347,0xad1068c4),LL(0x8c6b55d4,0x01200565),
+ LL(0x1fcfd55e,0x6396a275),LL(0xc76eb5a2,0x26c5c201),LL(0xc49cc617,0x9eafc039), LL(0x62fdc2b8,0xecf4f6fd),LL(0x73f3babc,0x795af8b3),LL(0xb456ddc8,0x9d6380f0),
+ LL(0x00481dbf,0x8435b4c8),LL(0x586fec04,0xd68ed151),LL(0xbad5a7ec,0x904b3a7d), LL(0x755a599b,0x5ac0c68f),LL(0xeed07240,0x8202bd5e),LL(0xc2111eb1,0x50108f7a),
+ LL(0x64114206,0x7966f061),LL(0x08252097,0xc7e5a500),LL(0x4a27d84f,0x1efdcfb5), LL(0x992fb0b4,0x05327d63),LL(0x109f651f,0x33c1800c),LL(0x4858bb75,0xe90ccb5c),
+ LL(0xdfd79c9e,0x3f05f6b9),LL(0x94808d4d,0xb0db9df5),LL(0xda56ea30,0x170d0bfa), LL(0x46ea52b5,0xfc08aa5f),LL(0xd7247824,0xf5eb81e2),LL(0x26357344,0xab23fe73),
+ LL(0xb37efb0c,0x8d9e1ced),LL(0xd7b33644,0x3b126789),LL(0xa25195f0,0xee7f591f), LL(0xe6380d90,0x5572f635),LL(0x6381422f,0x570f7d77),LL(0xe69759c5,0x44378d7d),
+ LL(0xa08babdc,0x1b30b2aa),LL(0x3cc52896,0x9ad9a870),LL(0xd7cb91be,0xd1afe3d1), LL(0x4a5535b4,0x1f838c05),LL(0xcfab1e86,0x86b14aaa),LL(0x6f77d53e,0xe64af8a4),
+ LL(0xebdc38c4,0x2028f1f2),LL(0xf31ac53e,0x534fc79a),LL(0x1a0e531f,0x987d5d41), LL(0x76fd27ac,0xf9d7d8c3),LL(0x40a77dbd,0x930da5d5),LL(0x57ef7f4f,0x2c9fae32),
+ LL(0xdb6f852a,0x7232dd8f),LL(0xddea21cd,0xcacd16a9),LL(0x21f8ec9e,0xf04c4671), LL(0x4688eec7,0xfec90470),LL(0xba277998,0xd49d9514),LL(0xb4cf1ab4,0xbec829aa),
+ LL(0xe594415f,0x6fb54104),LL(0x2c3a2383,0xcd39d8af),LL(0xe44a8388,0xd50673e0), LL(0xf14f72d0,0x55137ed9),LL(0x1abb3c7b,0x4475a031),LL(0x246ece39,0x73e9fa03),
+ LL(0xee6222b2,0x7017567a),LL(0x03448302,0x603051f2),LL(0x5aaa55f0,0x8e7a299a), LL(0xc61d2cb5,0x6a43ef05),LL(0xd1923efe,0xc780996b),LL(0x29e3847b,0x71c3dd7d),
+ LL(0xfdc2519e,0x34bff2b3),LL(0x4e5b30b6,0x55e13340),LL(0xdf3b31e6,0xf0159d7d), LL(0xffa85b11,0xe041606a),LL(0x437094a8,0xc9438445),LL(0x8b1d800e,0x13df929b),
+ LL(0xdf21b623,0x0e2925cb),LL(0x9010bc70,0x24051cf5),LL(0x891c2a68,0xc2176b95), LL(0x01e795a1,0x991bf219),LL(0x30ef7d3d,0xc069d0c2),LL(0x1bc05ca1,0x6021da66),
+ LL(0x1e52bf74,0xfcf4cf04),LL(0xd74c9731,0xd7cb6e14),LL(0x7e857c02,0x7628ac80), LL(0x126c5b91,0x0cc391d5),LL(0x7e2d15bd,0x731062b4),LL(0xabdfd049,0x1e87cea9),
+ LL(0x363f0203,0x10006c7d),LL(0xf63971b4,0x51ea9151),LL(0x80734bc5,0xd951b96d), LL(0x89a7c10f,0x1d164750),LL(0xcae9c4ae,0x488652d2),LL(0x185669d2,0xb4ca6a36),
+ LL(0xbb8f19e9,0x6e84424a),LL(0xc9d19687,0x8b9aa75e),LL(0x0b88d08b,0xc120a35c), LL(0x2a8cf8ec,0xdeeb61da),LL(0x6bebce59,0xfcc8ccf8),LL(0x8de4133a,0x679e7f58),
+ LL(0xe3c5a444,0x0f3eb897),LL(0x5751461e,0xce575c28),LL(0xdc20e60f,0xe8d1e5b3), LL(0x7d07536e,0x9dc103d7),LL(0x2f685999,0x86a2a40a),LL(0x47c6f8fe,0x15ae9ff4),
+ LL(0xaa9b291a,0x885babc0),LL(0xfedd2942,0xe3f51080),LL(0xb5d39214,0x304ccff4), LL(0x0a3b3582,0xf107db2f),LL(0xea86a325,0xe2fa620c),LL(0x6b20d46f,0xa0b718ec),
+ LL(0x72969183,0x9d14762b),LL(0xfce848f5,0x6b2baf0b),LL(0x968f6133,0xe7660ec7), LL(0x8299819f,0xc6ee65e4),LL(0xef1b9b29,0xb57828af),LL(0xa50176ea,0x5b1c99f3),
+ LL(0x62f3aae5,0xc35057fa),LL(0x46f3c966,0xa5437e70),LL(0x8864f29f,0x6bc5d22a), LL(0x86323fd9,0x143c464b),LL(0xd1570c61,0x30852173),LL(0xb5b6f3d4,0xc188ba63),
+ LL(0xc8406bdc,0x8b26d419),LL(0x3fafc9be,0xc0c95def),LL(0x5d5eb753,0xcd58ca48), LL(0x57e8a8a8,0xb937d969),LL(0x8d184ad0,0x8c18d5f4),LL(0xf5485ef3,0xbd764f21),
+ LL(0xecb39885,0xc5483510),LL(0x705df629,0xf0122752),LL(0x93d33824,0xe43d6cca), LL(0x49923c5e,0xe00a9514),LL(0xd8080e76,0x6993aecc),LL(0x633b9fba,0x4dc6d79e),
+ LL(0xefcd68d8,0xa33bbb48),LL(0xe68f5543,0xacaebe65),LL(0xa37a2bbd,0x7383a726), LL(0x770555c6,0x5d3e8c9c),LL(0x9b90f1ad,0x86e220c9),LL(0xab26ba0b,0xfc32885e),
+ LL(0x89e7a1a1,0x35837dd0),LL(0x08889b69,0xb8c46a1e),LL(0x1957ef47,0xbf3d0f2f), LL(0xf0a25602,0x7b89c2b9),LL(0x0656bcd8,0xab5068da),LL(0xf4298e4b,0x0c5c3a38),
+ LL(0xcaf9bcee,0xd20c9cc5),LL(0xbd6c6fd4,0x783987bd),LL(0x93ba43c5,0x696e2d85), LL(0x391285c2,0x356cbc57),LL(0xb533c31e,0x536b15a5),LL(0xc4c4ba41,0xc375dc50),
+ LL(0x405fe9b5,0xb961c694),LL(0xd5283673,0xb3983e9c),LL(0x96e95f05,0xd455be9e), LL(0xc75e8014,0xb38412e7),LL(0x96860cdb,0x1033ac0e),LL(0x00b0a103,0x303881b4),
+ LL(0xb3b3e63d,0xd1fc3bf7),LL(0xda50174a,0x35ab8665),LL(0x01a402c8,0x2944d50f), LL(0x4d26ddfc,0xba75bddb),LL(0x80efbf29,0x530839a3),LL(0xb93462eb,0xbf8adca3),
+ LL(0x84d08e74,0xd534a5d0),LL(0x4efdf525,0x436eb254),LL(0xdca89d2b,0xc653af06), LL(0x41a37013,0x0895e017),LL(0x91294447,0xb9f0b192),LL(0xb7f407e1,0xfd2cb9b0),
+ LL(0xe6cc78dc,0xc5323fdc),LL(0x2a74ed72,0x9c863011),LL(0x1aa90d73,0x86d391c8), LL(0x308de318,0xae9c2f27),LL(0xcc2d2cad,0x133f4d65),LL(0x42a244ba,0x0bfd5ed6),
+ LL(0xa7843758,0xb5b22ff6),LL(0xd93d7ed0,0xbdd3456d),LL(0xe0432d41,0x4bb279a7), LL(0x14acb55c,0x375da883),LL(0xad01ebbf,0xf9493a0b),LL(0xf0543ccf,0x5063d083),
+ LL(0xac19b11f,0x5c97aefb),LL(0x820ab407,0x253042d0),LL(0x550d30a7,0xf6b2204e), LL(0xa702ecbd,0xa091b635),LL(0xb34417cf,0xbd011942),LL(0xd3f92344,0xcb969929),
+ LL(0xeca70aa5,0x46c47688),LL(0x383cfca9,0x057cd161),LL(0x7ea5b03d,0xe538b089), LL(0xf15b8704,0x0f3fc549),LL(0xc4be9475,0x0bdcf648),LL(0x40851b7d,0x31fb0690),
+ LL(0x7b90be33,0x8dcd148f),LL(0xb5e956ad,0x3720de48),LL(0x2a303f7c,0xa0ce39c4), LL(0x89d0fdb7,0x054206d6),LL(0xb76fa220,0xe9991e88),LL(0xbac4c9ee,0xa0eb60ae),
+ LL(0x01065ebf,0x9feaf043),LL(0x23e6a889,0x001f921d),LL(0x526d4d12,0xbe2a6e6a), LL(0x762aaed0,0xae7aa8bd),LL(0xde1e43cb,0xa8aa4f13),LL(0x626356ac,0xea279354),
+ LL(0xc65bd80c,0x54727769),LL(0xf135559b,0x0f18555c),LL(0xc8a92ba2,0x3ef9e205), LL(0xf4e4b870,0x32f97cc9),LL(0x9fdfc295,0x764e6c3b),LL(0xa0be0176,0x97f95ca0),
+ LL(0x3547707f,0xa25af6ad),LL(0xae94e108,0xc46e1845),LL(0x3a29996f,0x481c7fd4), LL(0x1aac0d60,0x4e9a38c3),LL(0x2d811b3d,0x40172f5e),LL(0x58ba5cdb,0x69750750),
+ LL(0xd402cb8c,0x29404a7b),LL(0xc4a0deb6,0x8698ab1c),LL(0xf10f49fa,0xb0336bae), LL(0x4d34533b,0x27cbe364),LL(0x53d57740,0xb22e812c),LL(0x90f4aa01,0x82b80434),
+ LL(0x479f2e14,0x1b20606f),LL(0xb817e38d,0x5fa6e4bb),LL(0xcedd7aac,0x860fdf9c), LL(0xb63a00f6,0x66fa3783),LL(0x73c45ad2,0x2719710a),LL(0x64de62a2,0xa3db3619),
+ LL(0xf04aa960,0xb2e191c9),LL(0xf57411c2,0xd419a1dd),LL(0xa4a57d93,0xd860a8ea), LL(0xc1f433bb,0x5001230c),LL(0x8ec92a7f,0xf28ce31b),LL(0x9a4d25a6,0x8c582d34),
+ LL(0x96219ee4,0xf2826086),LL(0x4b4f0c24,0x0c21e1e2),LL(0x387213d6,0xd1804821), LL(0x1cce49ca,0xfa342c74),LL(0x4341ef6f,0x880ea569),LL(0xe968aa8c,0xa6fdc07f),
+ LL(0x91a41ded,0x293a6180),LL(0xe5d87356,0x51412d3b),LL(0xf0b2d509,0x925d4c9e), LL(0xd251fb90,0x80c77ead),LL(0x90e53a2d,0x1d6e3cd3),LL(0xf9a2ab15,0x6e11e4d0),
+ LL(0x1d009ea4,0x3535dc7b),LL(0x75c6c6f0,0xb6b48635),LL(0x72e3c50c,0x12ac6480), LL(0x6464430a,0x6d71a720),LL(0xe1dfdda2,0xf553de43),LL(0xcc6c345d,0xa1ee9a4e),
+ LL(0x2ac5a8c8,0x46f7bd04),LL(0x063f2739,0x62c11b7e),LL(0x69a36c58,0xaa7522c7), LL(0x06a4df65,0x6a10fbe0),LL(0xdf06bc54,0xd5f96d18),LL(0x38151768,0x545f76b0),
+ LL(0x712eb633,0xe9dd6bff),LL(0xf6972761,0x6c1e035a),LL(0x7a4d81a8,0x060bfcaf), LL(0xd2653839,0xa262cba7),LL(0x95a4c747,0x561af30d),LL(0xe33e339a,0xb9a3b8ac),
+ LL(0x5f371d0d,0x2fc5342b),LL(0xefbb2027,0xf9654b68),LL(0xf7520a2a,0x14820afb), LL(0x43d0ea24,0xb24c0b99),LL(0xc37df573,0xa1a8898f),LL(0x7bed1103,0xa1c07bb8),
+ LL(0xc4d993a3,0x664a8ae7),LL(0xfe44732b,0x1c2e8847),LL(0xb2426ed1,0xdb1e5a22), LL(0x7a45d008,0x2bdd7cb9),LL(0xf3d91e11,0x59477a34),LL(0x4cd742a4,0xf53dcb02),
+ LL(0x6c709f3b,0xa28f6d2b),LL(0x9ac0b1d9,0x479b31b7),LL(0xd568d9ff,0xe8237a0f), LL(0x0580975a,0x6895a188),LL(0x7b234cf3,0x450b5fe5),LL(0x70629bf6,0x1b4e0f89),
+ LL(0xe5bcec01,0x455ac64e),LL(0xc6bf296c,0xaf051300),LL(0x2306584f,0x119cb4c6), LL(0x7c0dee75,0x3242a0e6),LL(0xae1fd52a,0xd09fce7c),LL(0x2d5cf9ca,0x53608dc2),
+ LL(0xc8506617,0xaf6edd22),LL(0x3241e286,0x5ed21b88),LL(0x81282c66,0xf27d3439), LL(0x308d6ca8,0xbd393fac),LL(0x9032cca3,0x5155e229),LL(0x56a04a1c,0x29acd1b2),
+ LL(0xf78b6573,0x95c60d2b),LL(0xed576414,0xe53bb875),LL(0x452f8871,0x389200b3), LL(0x5af9dd53,0x69a42e38),LL(0xbf0327d1,0x01e3b18e),LL(0xba8d03df,0x985d811f),
+ LL(0x559c7bda,0x0cfef9cf),LL(0x5bb4cd8c,0x5096e369),LL(0xc8011afa,0x8d16d0e2), LL(0xf25b0ff3,0xa816a8be),LL(0x2f161a22,0x7edbd05e),LL(0x8ba1f83c,0x1ae570e5),
+ LL(0x690bc4ad,0x7c0084c0),LL(0xad2fd216,0xe0a5451c),LL(0xb130c417,0xb4926a84), LL(0x9309e50a,0x39e4ec36),LL(0x5c1bc674,0x094fb1e0),LL(0x67878735,0x19572f99),
+ LL(0xd011ed00,0x8f62726f),LL(0x0793cd2b,0x430d8c6c),LL(0xb8f172e8,0x26226dc9), LL(0x11935136,0x550ff9fa),LL(0x8c9798d3,0xb415bbd9),LL(0x83b3b2c1,0xb136921d),
+ LL(0x669e0918,0x940bce84),LL(0x298448d1,0xca050170),LL(0xa8e4042d,0x1fa3041a), LL(0x1e2abce5,0x0f73a3aa),LL(0x448c4fcf,0xe5196a8a),LL(0x2774a5b1,0xfe25d513),
+ LL(0x7192ab9c,0x6799b1b3),LL(0x7f02ea02,0xfd1cd774),LL(0x01b1e71f,0x1b4e5cd1), LL(0x13c4b9f9,0xb09c08b2),LL(0x87870c13,0x6be2f294),LL(0x3c2d5610,0xb74d7045),
+},
+/* digit=15 base_pwr=2^105 */
+{
+ LL(0x7c1f0b12,0x950114b6),LL(0xd9406636,0x4862f5b4),LL(0xe79e2ad1,0x4b94f772), LL(0x2162024c,0x283df03b),LL(0x1eae9865,0x730f9f5b),LL(0x1260cbf5,0x70b3f304),
+ LL(0xe16c6f09,0x850addcf),LL(0x5592d8d7,0x36a07642),LL(0x74af4f32,0xcdbf2690), LL(0xf354ed72,0xf452488f),LL(0xa99eb244,0x8ceb8c62),LL(0x92a47252,0x471774a0),
+ LL(0xf938b030,0xc7285307),LL(0x51cc80fd,0x81689ad0),LL(0x483aeb1a,0xbb8e3d60), LL(0x8286229d,0x6dec5453),LL(0x0cc83f74,0x3edd27c2),LL(0x152e37a2,0x1cd6ed5f),
+ LL(0xd377bce5,0x537244ab),LL(0x92bbe196,0x333760b5),LL(0xd7b6c795,0x373f1920), LL(0xb99b6824,0xd28c3c25),LL(0x501ea35f,0x14e96723),LL(0x8bebdafd,0xb3c3f757),
+ LL(0xd82a0a63,0x4a680526),LL(0x0558bb75,0xeeb46a35),LL(0x7589e42c,0xc27b9513), LL(0x59267a86,0xaf5a87ec),LL(0x5c4b67d0,0xbbf1e057),LL(0x09598a27,0xe37e471c),
+ LL(0x2a71504c,0x894af9cd),LL(0xd1e8512f,0x38e0d48f),LL(0xfc2cdbf4,0x96db568c), LL(0xeac2f293,0x911f7b8d),LL(0x5c965527,0x5821420d),LL(0x078559b0,0x832e957e),
+ LL(0xfbf84029,0xff114368),LL(0xd21a72b0,0xd8dd9e2d),LL(0x057c15f6,0x4ba812a4), LL(0x64fa748e,0x976cf8b5),LL(0x73812963,0x1801ab26),LL(0x394d2cf3,0x4a748d37),
+ LL(0xb8ffb76d,0x6b23479d),LL(0x898a63b9,0x401bf60b),LL(0xdc64023e,0xee58a7ae), LL(0x6c70a3b4,0xd288cadf),LL(0x5cf80831,0xc1da3aea),LL(0x5ee941bf,0x941b411d),
+ LL(0x1029b199,0xc4cccd83),LL(0x6d56502f,0x683863df),LL(0x43f9e9f5,0xe362783b), LL(0xa34a9ef2,0xb224d946),LL(0x72b438e0,0xccabcf49),LL(0xc4af3f0f,0x78d92dda),
+ LL(0xceee3620,0x123b5621),LL(0x90e8a27d,0x513add4e),LL(0xe45a02ac,0xaf127aef), LL(0xc0d7ba62,0x21a78e17),LL(0xf98d0ce5,0xcf09e816),LL(0xae64e8c5,0xc28cab36),
+ LL(0xef7a2cc1,0x0912071a),LL(0x3b451d17,0xd3f2bc6c),LL(0x35ea478f,0xf3796f91), LL(0xc9c756e8,0x9b5e64d7),LL(0x2d58e1bc,0x7ed6f7fe),LL(0xeae6b6de,0x503d9af2),
+ LL(0x5e314295,0x57cc1308),LL(0x89230510,0x74c77119),LL(0x9968ac6f,0xa314891f), LL(0xf033b995,0x8dd4df22),LL(0xe0d71497,0x7ffe0a44),LL(0xac968d35,0x5c5f54f3),
+ LL(0x406b0bca,0x246a971a),LL(0xd805a357,0x90eedbcb),LL(0x5c690ec1,0xa6dbc124), LL(0x7bc65cbe,0xbe369f3d),LL(0x96065417,0xe0ff616a),LL(0x337f567d,0x3654f681),
+ LL(0x9bf8c833,0xffa30743),LL(0xafe911c4,0x6bd11b77),LL(0x6762a958,0x30eee614), LL(0xa9e63f35,0xfba9fbc0),LL(0x332389bf,0x70edc028),LL(0xb9798769,0xb5d35ca9),
+ LL(0xb8c620c1,0xcde63d0f),LL(0x06942335,0xcdeaad60),LL(0xbdef1579,0xefb74b79), LL(0xd8b128a9,0x13dd5771),LL(0x56343492,0x00e9fe16),LL(0xd6baa45a,0xf4ffba1d),
+ LL(0x19d575fd,0xfdb1ece3),LL(0x61ad3345,0x231c53ac),LL(0x523e013e,0x3f3df394), LL(0x71c3b97d,0x254a291f),LL(0x396eb0c1,0x645a1aea),LL(0x0282f254,0x680b79e1),
+ LL(0xf3ef6b21,0xcededfad),LL(0x577a8e6e,0xa57437f5),LL(0xf5f051f3,0x413575b4), LL(0x4d1ca0ed,0xd88fe7f3),LL(0xdcceffdf,0x1849d754),LL(0x141422af,0x40e7733f),
+ LL(0x00721b87,0xcd5a690a),LL(0x0b2801ae,0xf0e84ac9),LL(0x17c73f20,0xaf0765ff), LL(0x33595f95,0x976d23d8),LL(0x72c8f457,0xdece9d39),LL(0x6604f618,0x3dddbfa2),
+ LL(0x2bb19559,0xef6c219c),LL(0xd57790b8,0xfbf7ac31),LL(0xc8f6c246,0x676751ad), LL(0x4c3b7ff6,0x0f4384d0),LL(0x39ee5f11,0x040a4f5a),LL(0x698f2f7f,0x30c58138),
+ LL(0x0d1a6b11,0x097f5ccf),LL(0xf9b7701b,0xf6cdd1f6),LL(0x4786ad28,0xb965d0ce), LL(0x70cd6a22,0xadd506d0),LL(0xd6299b81,0x9c4667a5),LL(0x1c032341,0x64056720),
+ LL(0xeb125185,0xfd01d07b),LL(0x48235596,0xbec6636b),LL(0x293de94e,0x9017825d), LL(0xe499b69d,0x888e08c6),LL(0x3b6a7ced,0x4f4a6117),LL(0x58f8d42c,0xd6d2a6fc),
+ LL(0x79062ff2,0x66a2ad0a),LL(0x9bc01a36,0xf187ed18),LL(0xb3f3d332,0x4fce4f5a), LL(0x38533148,0x903af8c9),LL(0xd058ab8e,0x34ff5da6),LL(0x6b2b6b4d,0x8fc66e30),
+ LL(0xd4eb310c,0x7e0843bb),LL(0xbefbb992,0xcd48672b),LL(0x75c258ee,0x839c6b0b), LL(0xd70a705e,0x11733171),LL(0x15042807,0x92fb3004),LL(0x9ca0a17a,0xe091def9),
+ LL(0xaa917028,0x48c33a95),LL(0xb87bb667,0xdef22091),LL(0x106fa5c7,0xb6223052), LL(0x6934d6e3,0x12491351),LL(0xbce2aa51,0x55c0b4d5),LL(0xb70985ca,0x734ec89c),
+ LL(0xbc8fd35d,0x000e0cd7),LL(0xb50502f2,0x05b488af),LL(0x1252793c,0xb56958a5), LL(0x8a310520,0x4e8c9cc1),LL(0x7f1db7bd,0x0a6e45d6),LL(0x5ecdeb31,0x72d3eb5a),
+ LL(0x85f7d20f,0x1ac14fe9),LL(0xb430d3cc,0x0e020f68),LL(0x409668ed,0x273e515f), LL(0x78e0031b,0xbf622f1b),LL(0x9bf7fcd7,0x5aa6dd5e),LL(0xb6b977f5,0x30573193),
+ LL(0x275d217e,0x7c4023a7),LL(0xcca3f6f1,0xac6a6b67),LL(0xf0fcc9b9,0x176bacc3), LL(0xb0858d73,0xb280416f),LL(0x6fec46e4,0xe48e3c6d),LL(0xf3235cfd,0x9aeb3a09),
+ LL(0xa486a8eb,0x33c068c6),LL(0x5def6704,0xc60c21cb),LL(0xbefdd067,0xff4ac34f), LL(0xe174348b,0x4f1427e6),LL(0x9f27fd60,0xc80afd96),LL(0x35955ccc,0x1799ed29),
+ LL(0xddebd485,0xdbf71628),LL(0x4b8207f2,0x13897ccd),LL(0xfd8365e9,0xe12c2822), LL(0xb003566c,0x705fe026),LL(0xf12863e8,0x8a97247d),LL(0x1748fc9e,0x698a3477),
+ LL(0x0669c4d8,0x90917d8d),LL(0x80746165,0xc65e4aa5),LL(0x12c0f44c,0x96763d21), LL(0x97318a9b,0x00a7db8f),LL(0x5fd1a0e9,0x29079037),LL(0xa9b6ec4f,0x2f4f1c47),
+ LL(0x0bd63292,0xd861004e),LL(0xca40a1da,0x0176d94c),LL(0x59fb9a7d,0x5e91abe8), LL(0xf6d4f1ff,0xa881a8f5),LL(0xa24ce9a9,0xded77256),LL(0xc492f4f1,0xacf4db67),
+ LL(0x391ca168,0x7146928e),LL(0x11e6bfe4,0x11981f6f),LL(0x32f997ad,0xfce0f814), LL(0xe85cd202,0x7cf18ed9),LL(0x03c315e4,0xa94f2b6d),LL(0xb5f8a4d2,0xe2a93315),
+ LL(0x2fab5a21,0xcd259208),LL(0x928dcc30,0x3d24f816),LL(0x9d66a41a,0x779e1c36), LL(0xc2e41af4,0xa8248120),LL(0x06fc8b0e,0x243a6bbb),LL(0xed8d12b1,0xb9de9d41),
+ LL(0x30f64b0e,0x23ff17d9),LL(0x8f083ea7,0x1eab5984),LL(0x554ae817,0x9965f2c0), LL(0xf4d8956a,0xb0a399b6),LL(0x0ebf134d,0x315694aa),LL(0x7fde4077,0x53567f64),
+ LL(0x5c71762b,0xfdfeb029),LL(0x1eb1144d,0x968d0bd7),LL(0x1f08b2a6,0x171297f4), LL(0x897a2666,0x7944101d),LL(0xda77b1a1,0xf4936746),LL(0x44547953,0x0e752c75),
+ LL(0x492b2fa0,0x69d5b44f),LL(0x5d483119,0xda5f6651),LL(0xac522988,0x40814f2b), LL(0x4e1f60df,0x344aeee8),LL(0x5ff6f053,0x2ddba5e0),LL(0xa4008621,0x4453d9ee),
+ LL(0x179e2967,0x37ab4aec),LL(0xba87af44,0xe91479f7),LL(0x0b55c02f,0x4b292d1e), LL(0xb69ad1a8,0x9deeddd2),LL(0xe91e913c,0xb610d598),LL(0x912b8e9d,0xa6b91331),
+ LL(0x20cdff63,0xaa819620),LL(0xaa6d0ed4,0x8d70fbba),LL(0xcb318c6a,0x5c951edc), LL(0x57b1fd8f,0xa4cc6573),LL(0xe00bbceb,0xd7a23636),LL(0x8d179500,0x33bb3513),
+ LL(0xe0168751,0x86da6dfe),LL(0x66604b83,0x940ba0c2),LL(0x22e9e186,0x15a8aa02), LL(0x65a6f19d,0xe5b39c58),LL(0x32f441b2,0xf591dc15),LL(0x9d3a2de0,0xb85cad59),
+ LL(0xfb422575,0x35abc7e2),LL(0x4b8acd9c,0x517b6718),LL(0x2ee6263b,0x3e303015), LL(0x7393f470,0x51c8c440),LL(0x974d3dad,0x032cce2d),LL(0x4c104799,0x68e57ee5),
+ LL(0xc0514589,0xb95807db),LL(0x0402a3fb,0x09a79c01),LL(0xd3fdd054,0x92bf681e), LL(0x393adbfc,0x9f2f00f4),LL(0x1ca244f6,0x13789212),LL(0x00d3a9db,0xe2f45a02),
+ LL(0x207a53c9,0x29ea3e07),LL(0x163549d5,0x61213e9a),LL(0x4656d770,0xe0b025d0), LL(0xbd0d85da,0x050f7501),LL(0xe3b43784,0xe95027f4),LL(0xf1a6b6b5,0xca3907cc),
+ LL(0x4a7a00be,0x670062e7),LL(0xace7ec67,0x9ea4759e),LL(0xc1d92037,0xf5d29365), LL(0x9c39e2de,0x6d421c87),LL(0x1593c52d,0xb3e3d2c7),LL(0xcd74d083,0x6733eb50),
+ LL(0x5ad1d924,0x30029e9b),LL(0x84925a40,0xc15c63d1),LL(0x17e5f0bb,0xb2c098b9), LL(0xda6f02f1,0x2646d78b),LL(0xb8ae8095,0x1f8b74a3),LL(0xb03283d5,0x2bfdcbee),
+ LL(0xb7d7ef7f,0xc78a8e01),LL(0x574b90f6,0x7e0a26ab),LL(0x26861a59,0x9be1c8b4), LL(0xc787cf5d,0x5dddc986),LL(0x217b8936,0x77e06114),LL(0x94d79885,0x0b58deb0),
+ LL(0x6ef1f554,0xb89d079b),LL(0xf1deef2a,0x87ee6d78),LL(0x7a7b9098,0x8985bc42), LL(0x165957c3,0x0843395d),LL(0xccf6daf8,0x11293e7b),LL(0xfce740f4,0xb2527ca8),
+ LL(0x12fbd080,0x54f19e66),LL(0x4aed0e22,0x82f0835d),LL(0xb56935f6,0x5f73c822), LL(0x5b0f4a59,0x4b255bef),LL(0x6b23634c,0xc2542ee4),LL(0x858eb55c,0x41a4fe31),
+ LL(0x70d71c90,0x5c19755b),LL(0xdee1b0d6,0xb15b8f0d),LL(0xeab4b7ef,0x07e40808), LL(0x6faa90c6,0x9f4f2665),LL(0x9fcb51fb,0x9e72096a),LL(0x541dbffb,0x1660e2f9),
+ LL(0x9aff8d55,0xfb1cf7e0),LL(0x7a1815da,0x7276df1a),LL(0x913d43ca,0x604cd6bf), LL(0xe0227dec,0x4f016034),LL(0x0e990a9e,0xb70eb020),LL(0x83b0d458,0x9db0e5f0),
+ LL(0x4bda5c36,0x137d2ba6),LL(0xc9d84ed7,0xf2ad5444),LL(0xb4878d48,0x37ba4976), LL(0x0c6237c0,0xe3518c97),LL(0xb5e9c50f,0x32e71c0a),LL(0xa325250d,0xfa2c1d25),
+ LL(0x80be6431,0xfa8cf7f2),LL(0xe5a2035e,0x74e8f698),LL(0x03eff799,0xa032a4e4), LL(0xc53ac08f,0xbdfd91ab),LL(0xebf217bc,0xe17b20eb),LL(0xdf84edd2,0x40de3e73),
+ LL(0xdf81c5d3,0x4110f517),LL(0x53f20019,0xbefb623d),LL(0xf346f4d3,0x67061890), LL(0x26ff57dc,0x096120d3),LL(0xccb068a2,0x00b49cf6),LL(0xf00d1e3e,0x613293d4),
+ LL(0x467e8604,0x248b65d5),LL(0x3ab4a1b3,0xcd983257),LL(0x1e96833c,0x1dc552b2), LL(0x89592574,0x851b4255),LL(0x1da99f23,0x62d85452),LL(0x401ba0d8,0x4cdbe71f),
+ LL(0x9760901c,0xdd6660af),LL(0xb8ad97c4,0x503a92d0),LL(0x6fbd51d5,0xdd313e4e), LL(0x6e919a43,0x441e5529),LL(0x65e9a71d,0x8613c8d8),LL(0x3d2336b4,0xc0c8b396),
+ LL(0x7b97021e,0x811cc3a9),LL(0xf50aa806,0x6d1a1d14),LL(0xf7f8f8f8,0x85a4588e), LL(0xe67b610a,0x23ba0ee5),LL(0xe3f78d9b,0x77df65eb),LL(0x99a02de1,0x0295f1aa),
+ LL(0xae21de63,0xd3284a43),LL(0x6e23bdc6,0xa976e9a5),LL(0xa757b390,0xcc8cfb98), LL(0xa4697fde,0x5e6a1ae0),LL(0x5aafbacc,0x5c62485d),LL(0x27e4f7d3,0x804597be),
+ LL(0x53bc971a,0xea91a442),LL(0x436f90ba,0x41484d9b),LL(0xd87d03a9,0x21b57dab), LL(0x8f1888f0,0x935c940c),LL(0x4c82401f,0xe1c2a3eb),LL(0x7847c8a6,0xf42fb0f8),
+ LL(0xb4347b62,0xa649770f),LL(0xb29590ef,0x3bf77343),LL(0x6a205e84,0x92b6e5a1), LL(0x63cac357,0x8c973844),LL(0x7e8ab06a,0x058f0f22),LL(0x58d62ed7,0xaddca6e4),
+ LL(0x1160ca95,0xf4b969c6),LL(0x0d73f647,0x60e6b905),LL(0x9b98ce7e,0xd8413d40), LL(0x9ec67398,0xebd6924f),LL(0x628424b1,0xe4c95b85),LL(0xc7f2b86c,0x157759fb),
+ LL(0x195680a9,0xd6f1e165),LL(0x965d62c7,0xd433c1dd),LL(0xd3dd177d,0x0890fc5d), LL(0x8c44dbc2,0x3e0f43d4),LL(0x9cb07f9d,0xaa0c14ed),LL(0x6ff8b939,0x6d7feea2),
+ LL(0xc17b0751,0xa1c5b89f),LL(0x46164d7b,0xf47724f4),LL(0x60ec3b26,0x9b1dd929), LL(0xcb50b27b,0x6c3c835c),LL(0xf86980fd,0x259fde39),LL(0xde92e229,0x84e73227),
+ LL(0xd05a1ec4,0x1f1e9817),LL(0xe6e48ece,0x2692c83d),LL(0xf4903352,0xa2c5bd53), LL(0xaf3eb235,0xa1f9c3ff),LL(0x71158432,0x52c141c2),LL(0x16d971ea,0xeddd3c85),
+ LL(0x3724189a,0x7554e3b9),LL(0x2e63e62b,0x5eea6e3b),LL(0xe23434b0,0xe28ad863), LL(0x5f932bc7,0x6016f1e8),LL(0x7d76d1fd,0x1240c223),LL(0x5124123a,0x2ce14c4f),
+ LL(0x6d50fbd1,0x6c89d0a8),LL(0x31779189,0x4a38b313),LL(0x8d8124b8,0xa1718ddc), LL(0x0e02b2d0,0x58f48b51),LL(0x6114c7e3,0xd38936a6),LL(0x1b70ec0a,0xb5e924e8),
+},
+/* digit=16 base_pwr=2^112 */
+{
+ LL(0x1f47a973,0xcf447109),LL(0x627fd943,0x24c191c4),LL(0x32c6da19,0x4f5f134d), LL(0x9d08667d,0x1b92e5f9),LL(0x1d9684b0,0xe6b9a4e8),LL(0x553bcb2a,0xd60fdeba),
+ LL(0x46cc2ad3,0x840f76a1),LL(0x6235d7a8,0x63b85026),LL(0xb2ef5ad3,0x5616a569), LL(0xc3f03ea7,0xa056663a),LL(0x38ce234b,0xd93ddef0),LL(0x57a8650d,0x0f729e40),
+ LL(0x360595c1,0x1b437776),LL(0x080dc311,0x6aa3a75d),LL(0x11147932,0xd1288177), LL(0x8a241c89,0x8c953ffc),LL(0x7de54cc4,0x7de8a558),LL(0xa5a3ed5a,0xa8dc2b2f),
+ LL(0x084ee344,0xf6b53652),LL(0x4048d28e,0xb51a92cb),LL(0xd688ff26,0x58fb44be), LL(0x9247a804,0x136a7d51),LL(0x3ef5f22c,0xf2176fba),LL(0xa999af5d,0xb4a457be),
+ LL(0xf23f79c8,0xb4cf845c),LL(0x1ad85366,0x8233b3b2),LL(0x78e68d8c,0x4efef3d6), LL(0x22c7941c,0x17b1e851),LL(0x761dde7d,0x40a27661),LL(0xcbd06300,0xac29e1a1),
+ LL(0x0ced7008,0xff48c690),LL(0xebfce074,0xbed07115),LL(0x27aa6e6f,0x4ac10aa5), LL(0x5e777e33,0x7652ebb3),LL(0x4dd30e6c,0x255c16ab),LL(0x9159219a,0xc0e1b073),
+ LL(0xec32e62a,0x6d2fc306),LL(0xe70096e4,0x426dd67b),LL(0x70d9383d,0x994877cc), LL(0xd011ca1f,0x8bc75d3a),LL(0xaa1362ae,0xcb18fa82),LL(0x2c292316,0x54fb1473),
+ LL(0x8c720bd1,0x45aa7854),LL(0xc5257a6e,0xceba0e5d),LL(0x796e4320,0x0e924974), LL(0x866fc34b,0xf2ce13c7),LL(0x6a58601d,0xbe8606f3),LL(0xbf56d38c,0xa25d6005),
+ LL(0xbdbaa117,0x9432504c),LL(0xba422130,0x4dfc9c38),LL(0x500ef320,0x32d66ac1), LL(0x0679d51e,0x1a38a920),LL(0x93a9c6f2,0x3e2a3c53),LL(0x0a59702f,0xe0b71451),
+ LL(0x4cefcb03,0x04e4087a),LL(0x4ab1d062,0x68686886),LL(0xdd24b69f,0x67054513), LL(0xa89e5edb,0x21d5ff58),LL(0xd8e0f856,0x9412a213),LL(0x3faa0ffa,0x1a05bd39),
+ LL(0x14033a58,0xee2aec92),LL(0x5161890c,0x38e267ef),LL(0x8c51e740,0x2f0ae797), LL(0xea57871c,0x6d2143ac),LL(0xc5475c3e,0xef3ce79b),LL(0x1fa55fd9,0xdd9cfa6a),
+ LL(0x412965e9,0x6ae0ef90),LL(0xe9188107,0x2430c1f0),LL(0x42b98992,0x9682e74d), LL(0xb638ccb1,0x3094b342),LL(0x16948a40,0x6aa863ef),LL(0x60f1cca5,0x2ef984e5),
+ LL(0x694a80f4,0x4980d35b),LL(0x2c3d3326,0x4dbbe36d),LL(0x1c899dfb,0x1c719190), LL(0xe9938032,0x96febca8),LL(0xa63775ac,0x7b17130d),LL(0xd12cfb2c,0x17e68ea4),
+ LL(0xfde8a210,0xf111a32f),LL(0x83b56b17,0xc3d61a7e),LL(0x22b86813,0x48125662), LL(0x410c959f,0x1ddf2f99),LL(0x68591a75,0x886a1893),LL(0xa21da760,0x92dc4bbf),
+ LL(0xb9b71c82,0xa2d0b7f2),LL(0xe59c5616,0x206fb318),LL(0xa9f1f448,0x01112ace), LL(0xd40341f9,0xbc6ee063),LL(0x90590590,0xe2c50a8d),LL(0x795c4ef5,0x3aa25a83),
+ LL(0xf5016294,0x582102f1),LL(0x8ecaf2bb,0x6c6a8cc5),LL(0x9e733710,0x7887a218), LL(0x82da339d,0x18ea2c41),LL(0xef8def66,0x428afd13),LL(0x5f923e0a,0x171ec875),
+ LL(0x98756704,0xd9233e20),LL(0x86a8b3bb,0x5b3a223a),LL(0x216d0c55,0x844ef9e9), LL(0xb7f4d4b6,0xb8a1a350),LL(0x64bb191f,0xf70cb37c),LL(0xefb8ae25,0x7c42a6c0),
+ LL(0xc8074a8b,0xf789197b),LL(0xbd20de1c,0xf7984f1b),LL(0x50eb451d,0xc0b1f821), LL(0xa88538d0,0xeb36fa99),LL(0xaa22b727,0x87c78bb1),LL(0x3644f1eb,0xfe697599),
+ LL(0x6fb08720,0x775050a3),LL(0x7c92825b,0x6547216d),LL(0x4a525878,0xe4c237f8), LL(0x63d4f3fd,0x584a8f77),LL(0x80b593cd,0xfefbf7fb),LL(0x89778016,0x8f52fc2a),
+ LL(0x275beb93,0xdf1d7c82),LL(0x7512f5a7,0x4e3e1e22),LL(0x833674bc,0x0a8c3404), LL(0xabc4edcb,0x92c482d9),LL(0x9fc05328,0x90d5620d),LL(0x72e82254,0x49facc26),
+ LL(0x2ecb1fc1,0xc5acdaaf),LL(0x6e74dd57,0x2a6d3302),LL(0xda6dfd6a,0x7ac86ef8), LL(0x4074218a,0x24edf1a2),LL(0xf9162dd2,0x9010034e),LL(0xae5e58fb,0x035ed18c),
+ LL(0x55f3fe0b,0xa961e6d8),LL(0x46a86b10,0xcd5156e2),LL(0xc2988880,0xc4fc85c9), LL(0x5e00c084,0x68c21329),LL(0x9af42336,0x505ffd96),LL(0x2d4346e2,0x2d3d12ff),
+ LL(0x81aaf463,0x19a0b708),LL(0xe4d6eec0,0xc956aa02),LL(0x897c0465,0xa8dba669), LL(0xbee2b8a9,0x5c8a3e27),LL(0x80c032bf,0x8ae8552d),LL(0x482aaf27,0xe7526fc1),
+ LL(0xc12240f9,0x4767cb3f),LL(0xfe66cca2,0xa31fe2bb),LL(0x0c03119a,0x15f6f333), LL(0x9283ee27,0x67a68e9a),LL(0x53e4d988,0xe2d7d349),LL(0x0150cf1a,0xaf919ee4),
+ LL(0x4bc9e09b,0xcd0b84c0),LL(0x8f7286bb,0x0e18d19f),LL(0x5aa9039c,0xf51f3b13), LL(0xb25604be,0xe0bf876a),LL(0x60e8118a,0xaf35db67),LL(0x6dca47f8,0xd6f2ebd8),
+ LL(0xe4942689,0xdb226347),LL(0xd061e06d,0xda1e15d6),LL(0x3d043dec,0x2a99ad74), LL(0x7a5cac1c,0x78a33189),LL(0xd8bfd02e,0xb3b6c52b),LL(0x7aaec4f4,0xcae776f5),
+ LL(0xe13ee1b0,0x00bd80ca),LL(0x5570567c,0x678837f3),LL(0xe22c402b,0x379e4e13), LL(0xb68e8230,0x7f51fdac),LL(0x5d23aa66,0xc76acd65),LL(0x2caaa8e7,0x4b8a0d89),
+ LL(0xb2c47709,0xeeb913e9),LL(0x01b76a21,0xc2683d5a),LL(0xec8c8ce7,0x58e53311), LL(0x0654cd8a,0x0a179454),LL(0x5999ac6c,0x011152f5),LL(0xc8b4fa8f,0x15eb6f48),
+ LL(0xfdb6b880,0xe5363d68),LL(0x3ad457bf,0xef83e507),LL(0x6fd08edd,0x63874010), LL(0x85975c5f,0x64b77762),LL(0xbed19eac,0x11cf13e2),LL(0x19f07470,0x823d8c2e),
+ LL(0xdc4e8957,0xd091f448),LL(0xcf0950b8,0x9825fdfb),LL(0x0d1e5204,0x1e297e4b), LL(0x499cbea9,0xab53b2a8),LL(0x4917c840,0xca4a1f80),LL(0x2a785cab,0xe6506492),
+ LL(0x0f900918,0x9c532f97),LL(0xcb00118b,0xfc209bf8),LL(0x6290d47a,0xdd4a28aa), LL(0xcb4c67cc,0x8a7aa0f1),LL(0x3a3a7acc,0x1d7cc682),LL(0x504f910f,0x085b0335),
+ LL(0xc3978c89,0x2a3e44bc),LL(0x3724d81a,0xbbc69641),LL(0x8e42053e,0x8cd0bcf6), LL(0xebd9205c,0x9a84e877),LL(0x8bbf687b,0x6c153f89),LL(0xdee7732a,0x730b14c7),
+ LL(0x3e54212a,0x71f21e01),LL(0x2044a858,0x2fce6291),LL(0xd5b7e3b0,0xb3b630f4), LL(0x59a7edb1,0x42ceac09),LL(0xbddf2781,0x6a40528a),LL(0x8954daf0,0x68b67f7b),
+ LL(0xd4cc9c00,0x6f07450a),LL(0x243d9b91,0xac4f418f),LL(0xb3930836,0x862c4d7c), LL(0xb829804c,0xad9509d4),LL(0x35d6a88a,0x5448355a),LL(0xa02a8977,0xb1fd6cf6),
+ LL(0x12fda311,0x926dc0b6),LL(0xa713c6b6,0x3858aa1e),LL(0xb59d713b,0x32532f12), LL(0x0f81bc84,0xe0a3bd86),LL(0x34b57212,0x28bfc374),LL(0x59e6b4f4,0xc1d92564),
+ LL(0xd1adc5f0,0x749961eb),LL(0x6897fc6f,0x070b3de4),LL(0xb71a0ade,0x0b95a35d), LL(0x4c6cf54f,0x993a0e3f),LL(0x07030f4a,0x57dd5c90),LL(0x12298384,0x191f3d38),
+ LL(0xfe98a51d,0xd30028ba),LL(0xf0f77aef,0x536fceb1),LL(0x15f7d4d9,0x58a8d8cd), LL(0xafa42baa,0x498dd178),LL(0x8ad8d1db,0x107ae753),LL(0xf4a6e0d7,0x79957dae),
+ LL(0x098aa8a4,0xdefb4a06),LL(0x5a536615,0xd45f01be),LL(0x2175624e,0xdfb9ab8f), LL(0x432b8122,0xb7f76e8a),LL(0x66ba6ee3,0x838ee280),LL(0x275d1fcf,0xe6911bea),
+ LL(0xe82bfc51,0x5ddd5dc2),LL(0x126dd7dc,0x36994ad7),LL(0x520c3a43,0xa3be5780), LL(0x6b94a716,0x093dec86),LL(0x9ba657b4,0x5189af95),LL(0x2c605098,0x188fb2ee),
+ LL(0xb76392f7,0x14886c31),LL(0xdecb5423,0x304dd2c9),LL(0x0214664e,0x853a2344), LL(0xca815581,0xa150c793),LL(0x5edee2f8,0x1334dabe),LL(0x58d437d1,0xfa263569),
+ LL(0x31b3f896,0x348804e5),LL(0x4bc1df4d,0xf9778c68),LL(0x5ba2cff5,0x9174fb72), LL(0x3156fc57,0xdae23f11),LL(0x0eaf5c36,0x146fe941),LL(0x6954d2fa,0xa756199e),
+ LL(0xfc879267,0xd875fdac),LL(0xeac024c1,0x504843c3),LL(0x9abdbb10,0x2880c735), LL(0x3b9acd44,0x45f8969d),LL(0x6261a810,0x86744967),LL(0xda56c33d,0x2889aa10),
+ LL(0xcca4b465,0x4cd3e586),LL(0x0438f6dc,0xb9858004),LL(0xff4ba237,0x5ecb0167), LL(0x2de8c238,0xbf2dfbac),LL(0x86067a4e,0xd1a1f341),LL(0x514110d5,0x6e001905),
+ LL(0x32515872,0xcc0b6188),LL(0x9db67e8d,0x8a5a4765),LL(0x4032cd76,0xfc5572bd), LL(0x4ced4c98,0xa8148877),LL(0x7e29acf7,0x3a3f4af1),LL(0x4878a56e,0x19e7ba4b),
+ LL(0x6ffe2a99,0x7d54fa14),LL(0x602fe247,0xd9f414c7),LL(0x284f46df,0x31abd712), LL(0xe6a9ef58,0xf55a66ce),LL(0xb2d9463d,0x8d76dacb),LL(0xc14ace92,0xac7aebc3),
+ LL(0x7fc941bf,0xa7b46744),LL(0x3f70d808,0x0c420029),LL(0x177bab8e,0x3da5d17e), LL(0xb3a67013,0x3ce9a56e),LL(0x34c0d947,0x4fc18745),LL(0x4571d7d0,0x1295a40c),
+ LL(0x59a9c46e,0x55635c3d),LL(0xbfe9682c,0x425f4119),LL(0x47824565,0xd6486529), LL(0x8a96f0bc,0x741c7a34),LL(0x382a3617,0x9cb36316),LL(0x7e0bb8c3,0xe8704d9b),
+ LL(0x261438fc,0xba5fc6e5),LL(0x304dce0b,0xd455c9e0),LL(0x5d776157,0x2c5cd9cc), LL(0x58000464,0x2ad5cc3e),LL(0x9efd5253,0x88b007d4),LL(0x031f40e8,0xc5024b19),
+ LL(0x89f85ced,0x43e291bc),LL(0x2565e514,0x704c3d56),LL(0x6f19bf54,0x401941da), LL(0xc42b17b9,0x407ffe45),LL(0xee6116a1,0x68753698),LL(0x0f1e7e3c,0xf69c5def),
+ LL(0x59d50565,0x7e95369e),LL(0xc3f575f3,0x089278bf),LL(0xd7d4ed14,0xfbf02dc1), LL(0xc063b9b3,0xe98848a5),LL(0xb3d74962,0x49058917),LL(0x937ac3e7,0xbaee0b60),
+ LL(0x9517cd36,0xd3f4711d),LL(0x5ab34ba6,0x72055716),LL(0x8054f1b6,0x55781094), LL(0x854d305f,0xe3ad29bc),LL(0xa21b9037,0xc6f2e79f),LL(0x0478e475,0xa01b493a),
+ LL(0xf078fc36,0x80124211),LL(0x203d5414,0x29e04253),LL(0x1a40dfb6,0x53737763), LL(0x19d3137d,0x698334c3),LL(0x22b7e891,0x02c4658d),LL(0x285de1ab,0xe33063e7),
+ LL(0xe76c0ac6,0x56eb9f2e),LL(0x90aef3e0,0x3898b635),LL(0x3e409c12,0x016a7234), LL(0x32cd68c5,0x488d72fe),LL(0x809dd2bd,0xc9cfcd28),LL(0x0b99c1d2,0xec284a02),
+ LL(0xaf16bcb5,0x7cc64eaf),LL(0xdb4ffe42,0x6a629feb),LL(0x2d775fbd,0xdf4a9495), LL(0x41ee0c37,0xde89a2db),LL(0x2b89d6f5,0x4bcb9b55),LL(0xaa29912c,0xabeefb50),
+ LL(0xde0b2010,0x026c18f7),LL(0x43b3d1d2,0x39495f8b),LL(0x30288eb8,0x63546dd7), LL(0x68b69732,0x0a49e9b2),LL(0x0ffd4a14,0x9ef54b7e),LL(0xd1fd4c67,0x834add8b),
+ LL(0x95444724,0xaf5a35ac),LL(0x98374f56,0xa4f56e13),LL(0xbad358c4,0x779136c5), LL(0x0b77d7db,0xda98e86d),LL(0xd83f4464,0x664c97a2),LL(0xa95543ed,0x9e4c6820),
+ LL(0xa63fde03,0x4189250d),LL(0x252242a2,0xfdf0c2da),LL(0x04072ae9,0xc46d8769), LL(0x6679d6e8,0xac1026c9),LL(0x30b3ab9e,0x2932cf08),LL(0x52f5c3ef,0x543f55db),
+ LL(0x14b85fd4,0xbea36af7),LL(0x5bcce101,0x32771ea0),LL(0x798ec0fd,0xd9a59a8c), LL(0x4d437c35,0x165e1bfe),LL(0xedfb6d49,0xb55f1e8b),LL(0xec21ec21,0x362e3826),
+ LL(0xd4c60ba2,0x3aebfb11),LL(0xc7e3f014,0x77426fe0),LL(0x8a27fdc3,0xe457c3e5), LL(0x5e5bc8a5,0xb301854c),LL(0xd258898f,0xe6b8c9d9),LL(0x415129b5,0x3a7ead26),
+ LL(0x1e2c52bd,0xe3760794),LL(0x36b33409,0x383b64a3),LL(0xe476721f,0x3e25c3ed), LL(0x636f7572,0x209893c6),LL(0xe5f8134f,0x7e26bf15),LL(0x155ae70b,0x27e0a220),
+ LL(0x9e9f2836,0x8f6b7ae3),LL(0xf9826937,0xf5eb2b96),LL(0x27c80d30,0x6b213e6c), LL(0x5320af31,0x52d85c63),LL(0x719df6d3,0x468df649),LL(0x2744251b,0x69403a14),
+ LL(0xd9a2d948,0x28b1b9c5),LL(0x8e0c0b46,0x171331b5),LL(0xc359284b,0x84749e1b), LL(0x2e820b7b,0x184eb606),LL(0x740d7291,0x4f45113f),LL(0xaacb8d25,0xd1743386),
+ LL(0xf464caa0,0x003c4b6d),LL(0x6280078a,0xe1e5b15f),LL(0xbfdf8ef2,0x2c0ace42), LL(0xbdcc429b,0x695d68df),LL(0xc9b7c777,0xb9a74231),LL(0xe2ee83bc,0x72976a32),
+ LL(0x649ab654,0x72625a05),LL(0x40672830,0x4c950283),LL(0x6265499f,0xaa52b9e0), LL(0x9e60c50f,0x82c299fa),LL(0x697cef66,0x32ed0262),LL(0xf4c1412d,0xa5fad068),
+},
+/* digit=17 base_pwr=2^119 */
+{
+ LL(0xa11d1043,0x5db5f2ac),LL(0x3144df6d,0xb1054ec2),LL(0x484fcf47,0x4d5655f8), LL(0x9dbb1826,0x0650cfdb),LL(0x21f5feda,0x27dd6048),LL(0xd7202fb5,0x0ac68e0b),
+ LL(0x1af46fd9,0xc42442cd),LL(0xfcf7cac7,0xb01213f0),LL(0x7eee2308,0x36e25d39), LL(0x17b3a506,0xcbf7331b),LL(0xcbb09169,0x9cb57ff6),LL(0x2928d485,0x819296b4),
+ LL(0x8f4e94b8,0x22111a83),LL(0xb5d0778a,0x808a8a94),LL(0xe721738a,0x6dc353a0), LL(0x622c3cad,0xfbc21338),LL(0x2a4f4740,0x33ad7aa1),LL(0x7bd23daf,0xc3ce2ea5),
+ LL(0x17755e9d,0x5214c0df),LL(0x22952389,0xd0989763),LL(0x2069bb1e,0x51accd0b), LL(0xe9cdd0be,0xe8ff9789),LL(0xbb212bd4,0x7e57a08a),LL(0x31edf24e,0x6b3e08ed),
+ LL(0x6be00a20,0xf20543a1),LL(0x190d57cb,0xb8bcaa66),LL(0xef2b91a2,0xdd7c09be), LL(0x5592a7fb,0xd0e3d7f0),LL(0xa4e5380b,0x71dd3f1f),LL(0x7ad60960,0xe1a6c123),
+ LL(0xd3ca68f9,0x57bc69bd),LL(0x52100876,0x4ada2eed),LL(0x8c3bb3a7,0x2e966e5b), LL(0xe177995d,0x507cdf48),LL(0x62dec6cf,0xa34769db),LL(0x615eb17f,0xd9cd4150),
+ LL(0x7de68ea6,0x0135519a),LL(0xe8a86804,0xe966ae0c),LL(0x4d390e2d,0x63738258), LL(0x91e8e57c,0xfd018375),LL(0xd49915f4,0x31e5d307),LL(0xd1e1542b,0x173b719a),
+ LL(0xfc46d6d5,0xb492fccc),LL(0x46eddcd3,0x973958f7),LL(0xb0f21fba,0x7222fff6), LL(0x41f0f218,0x8eb1db20),LL(0x9d5451aa,0x7353ea3b),LL(0xf054ffc5,0xf2cd3afc),
+ LL(0x25b37d1b,0x148268ee),LL(0x6c58898f,0x9d597241),LL(0x5ef964a3,0x516c6871), LL(0x73756f60,0x777d95dd),LL(0xce04cb87,0x79b9b5e6),LL(0x371ab2f1,0xdbe50dca),
+ LL(0xb9c32a0e,0xc12a3617),LL(0xa6d8dedd,0xd368a553),LL(0xef101236,0xdf472f4d), LL(0xa749514e,0xd6bc5900),LL(0xc2a203dd,0x7531976c),LL(0x983e67ab,0xa5bbf91a),
+ LL(0x5ee73780,0xad4ada0e),LL(0x41fe693b,0xdf363734),LL(0x1a88c54c,0x996727c5), LL(0x6f0cd51a,0x635e6cd5),LL(0x4e75f89b,0x93d7e6cd),LL(0x2326e236,0x761b08f9),
+ LL(0x27a21294,0x719c6065),LL(0x0f25f450,0x5fd2859d),LL(0xd52b85df,0xd10bf835), LL(0x40de93c0,0xa6fd2831),LL(0xf7c3a0d4,0x89c1bd7d),LL(0xefebe6be,0x75fed863),
+ LL(0x17c97de1,0x921b88ad),LL(0x2cd59e91,0xb48dc81c),LL(0x73f3504e,0xda03b882), LL(0x5f2ee761,0x39ff606f),LL(0x5ad4f4de,0x608772a2),LL(0xc72d7dbc,0x2b4d5732),
+ LL(0x17a8bdb6,0xd5d5f3d4),LL(0xde7a418e,0xcdadbfcd),LL(0x73f2b0da,0x2fbe10bc), LL(0xdd2b933a,0xcc436783),LL(0x120a26f4,0x7d464c7e),LL(0x3295a8b8,0x2e25a06a),
+ LL(0x4edfcc33,0xce566ba6),LL(0xb883585e,0x72ced5ee),LL(0xe257f582,0xc7a1597f), LL(0x42dd036e,0x469e4698),LL(0xcf916dd4,0xf534e335),LL(0x5409b755,0x2a1a0ac7),
+ LL(0x9c7ba23a,0x2ee09586),LL(0x2d9a1fbb,0xd9dae4aa),LL(0x0701d2cc,0xad876506), LL(0x35d64ab2,0xb9eaf2f9),LL(0xa2ca2cf4,0xc8a57b67),LL(0x0938f8b2,0x7e81d43e),
+ LL(0xf1f4c06c,0x517ac75d),LL(0xd2fb833a,0xebd83a3b),LL(0xd0ceba1a,0xe14412b0), LL(0xc203df53,0x14bfd5f7),LL(0xa3cc4222,0x8eddee82),LL(0xe0413bc6,0x987370db),
+ LL(0x2c70f714,0xc3aa5190),LL(0x1e87511c,0x35550f45),LL(0x207b35cc,0xacdb541a), LL(0xddc40e1e,0xd645313b),LL(0x5d7745fb,0xfadf08df),LL(0x63f5d14b,0x34c4a2da),
+ LL(0x74f5662b,0x3bf9a89c),LL(0xc3293614,0x26fa24f5),LL(0x93645819,0x2232f2bc), LL(0xb642a3d2,0xae2493be),LL(0x4354eadc,0x67888dfb),LL(0xd5a343ce,0x7917ebd9),
+ LL(0x22e18ac9,0x83f1a578),LL(0x96227250,0x754ac8ad),LL(0x02f84593,0x8720c7b5), LL(0x6077017a,0xbe8034ce),LL(0x125f0aba,0x0e38bcc9),LL(0xd7c001b7,0x491175d9),
+ LL(0xdc6d9d65,0xdc830479),LL(0x8402b7f8,0xd961ba98),LL(0x85d31cef,0x9a870f49), LL(0x747a1a30,0x3f08d97d),LL(0x5e845976,0xf5cd0560),LL(0x39c404c9,0x34b2e606),
+ LL(0x479f9f28,0xc6be3e89),LL(0x8639cfd5,0x277e7391),LL(0x6eac029f,0x90018430), LL(0xccc296ef,0xdeebdb98),LL(0x6c909542,0x225d9267),LL(0x37a527ab,0xcf151ac4),
+ LL(0xa65460ad,0x40e22878),LL(0xd388bcc5,0x0a345fb2),LL(0x01c72449,0xfdbb8d02), LL(0xb73e0d19,0xeef0f1e3),LL(0xbbfdd87f,0x4ec39f63),LL(0x5ef57d3b,0x79501995),
+ LL(0x60873c20,0xd6dbf138),LL(0x6715b03a,0xeee2c9aa),LL(0xa7482c51,0x2f5e5ce2), LL(0xc3dd1233,0x927e5fb2),LL(0xd64c61c6,0x72dde264),LL(0xcd32e0b4,0x605f8de1),
+ LL(0x5b9091af,0x8ca120c2),LL(0x0f0fb8bb,0x6f7fa55e),LL(0x87264d00,0x78e97110), LL(0xd0f9cca4,0x63be0590),LL(0xe863c20c,0x4825ad2d),LL(0x12449414,0x4c34ba2d),
+ LL(0x21fd0243,0x0256c27d),LL(0xa2406f04,0xbe85c36f),LL(0xb457d240,0xa30e427f), LL(0x3b4a0eb7,0x4bc8ea0f),LL(0xbfb3b1d4,0xf84a988b),LL(0x20a37ec6,0x1e9d2665),
+ LL(0xb27e7722,0x07d6c0ef),LL(0x6729edd8,0xb81d03e2),LL(0xecf969a0,0x75b9e7d4), LL(0x72ad86dd,0xef9c8251),LL(0x9292331b,0xe609a51d),LL(0x35e1a81c,0x0df83add),
+ LL(0xc5478838,0x73e31c76),LL(0x44828fc8,0x1a131a98),LL(0xb5e70dd2,0x14e09dce), LL(0x4a72dd31,0xb38126a3),LL(0x5b0e772f,0x3d06723b),LL(0xb7d1198d,0xca600717),
+ LL(0x57b91e05,0x047cb901),LL(0x7e21d7a5,0x1946f1b6),LL(0xccec26a7,0x042e3eca), LL(0xfd416a33,0x0d9f9119),LL(0x49019bf8,0xdf57814c),LL(0x6527b664,0xe01c04b8),
+ LL(0x359b599d,0xc0fb1444),LL(0xbd4e90c3,0x09858bf6),LL(0xe4adda27,0x1ad5019b), LL(0xe2069275,0xa8229db9),LL(0x2e9a9c96,0x4af49c04),LL(0x32909ac0,0x2eba27df),
+ LL(0xba29ac20,0x44771234),LL(0xa8f7d70a,0x91271936),LL(0x35e3439b,0x1d2553dd), LL(0x66de658c,0xa35e4915),LL(0x5505ca57,0x958c5d53),LL(0xefac11c3,0x5806c454),
+ LL(0x68947de6,0x480af451),LL(0x20ed7c76,0x1970a51c),LL(0xfd273a2b,0x13be8cf8), LL(0xde3fb216,0xdaa99fc9),LL(0x007e796d,0x9e1ecd60),LL(0x1145bac9,0x0d61162b),
+ LL(0x1a7240fd,0xd324f3e5),LL(0x02dead6f,0xb652ceb5),LL(0x945e4927,0x9d2efe09), LL(0x09d3fe5a,0x505409cd),LL(0xd0b1d40f,0x4068d39b),LL(0x3d2add11,0xb169ceb8),
+ LL(0xf87110f6,0x95209c85),LL(0x9d8c8473,0xce5e933a),LL(0x2dac6c5c,0x50e9c87d), LL(0x6c95d63f,0x5ad288c5),LL(0xc2e80fdb,0x9801bde5),LL(0xcf50ed4c,0x6d577a05),
+ LL(0x5c341a0f,0xb2952c0b),LL(0x08fc2f1a,0x5296d67b),LL(0x595be428,0xb671036e), LL(0xf1974091,0xca815a34),LL(0xd7822f17,0xe4a2f88a),LL(0xaeba3ed7,0xdfc557f7),
+ LL(0xf1f5523e,0x78c30cae),LL(0xa828197b,0x467ad201),LL(0x41532182,0xccf347b4), LL(0x84ef4bc9,0x67c4ff37),LL(0x98cade6e,0xebeb3d71),LL(0xa59ab992,0x979dba66),
+ LL(0x0a363201,0x5ff9bcb7),LL(0xcc8b691a,0xb6995231),LL(0x62797899,0xc9aa7830), LL(0xcf5ece20,0x57d1c888),LL(0x963c0086,0x688d3d70),LL(0xc85a248d,0x91091fbe),
+ LL(0xe39ec208,0x4d6e7182),LL(0x8d5cf62a,0xda235ace),LL(0xde7dbbdb,0x33f70b00), LL(0xe66a3b86,0x60f841c4),LL(0x42d7e874,0xbf8660af),LL(0x80f2c57c,0x073c5f84),
+ LL(0xbc4f1599,0xd80d4f36),LL(0x185811a7,0xfd5e23b6),LL(0x7ac38f06,0xc8b0fa81), LL(0x43e96490,0x652d79b3),LL(0x73d98971,0xe222aa1d),LL(0xd121248f,0x4b6278dc),
+ LL(0x3c14b2d0,0xce20c25e),LL(0x98193e2e,0xd1379c97),LL(0x6d804130,0x21102482), LL(0xf20fb7a3,0x577f8229),LL(0xb4f08660,0xdef46260),LL(0xe4dffb3e,0x8bb54fac),
+ LL(0xc0ecadfb,0xbc45d692),LL(0xd3435c47,0x2d92602f),LL(0xa5dfe7a5,0x29e826c0), LL(0x42a0c989,0x9272dc04),LL(0xe3b3a440,0xc1eddc74),LL(0x65741581,0x741fa074),
+ LL(0x75dbc772,0x0e2a8f97),LL(0xcc5e88b1,0xed5c6a60),LL(0x715808ac,0x099753c4), LL(0x9cd4d1fa,0x515d4892),LL(0x78393560,0xc4e5c9fe),LL(0x59206312,0x7ce9ac16),
+ LL(0xba61c10c,0x05e139c7),LL(0x56285997,0x83c2806d),LL(0x80f93027,0xf308c086), LL(0x3d95ff97,0x192570cb),LL(0xb69f20a2,0xd7677bc9),LL(0x9a9416a8,0xfea2554b),
+ LL(0x2ac3e62c,0xe26cdbf8),LL(0xb719cfa9,0x99cfefda),LL(0x7c7c2f30,0x67fc003a), LL(0x529cd8a8,0xfb8eb991),LL(0x8902bddd,0xe63830d5),LL(0x87d9a82d,0x8d0dd890),
+ LL(0xcdd4c46f,0x239f32f2),LL(0x4de15fb1,0xf9517e3f),LL(0xbb8c38ff,0xc8183a19), LL(0x4f41bc08,0xefe4c3ef),LL(0x36ec7fd4,0x900d74fe),LL(0xfbf56005,0x49b24c64),
+ LL(0x2aae4376,0x8c1c4bb0),LL(0xf9c1a936,0xe9eadc2b),LL(0x9b62791b,0xea437c5a), LL(0xafe6482d,0xb43a409d),LL(0x5ae0e629,0x405189df),LL(0xb6b6e06a,0xb60dbb63),
+ LL(0x122f06d7,0x015b080a),LL(0xe52d69ac,0x8fe18e03),LL(0xbe34ac7f,0x54894766), LL(0xd5131f42,0x60d01c43),LL(0x24b2ae7b,0x179b14a6),LL(0x6e7c925c,0x2478209d),
+ LL(0x7667ec3c,0x037b49bb),LL(0x0ddcd693,0xb4751c25),LL(0xe82b8e88,0xa9933bfb), LL(0x741344e2,0x14f812fc),LL(0x25e24d12,0x7253361b),LL(0x071df26d,0xaba4f18b),
+ LL(0x05bcc791,0xfe1f3f2f),LL(0x33608ce5,0xe3ae1232),LL(0x672aa21b,0x3325659b), LL(0x9a01ebde,0x6d572c9a),LL(0xa10425ad,0x733c2067),LL(0xf7e7b67a,0x80f1da8b),
+ LL(0x2e21e1c3,0xdcba0c7d),LL(0x79eb4307,0x08883499),LL(0x27cd2b91,0x5a5ee0f8), LL(0x13a4c6d0,0xcc6494e2),LL(0xb3270d14,0xdc1c75e3),LL(0x66eb04f8,0x64e17db8),
+ LL(0x3e232e2c,0x1b8e2672),LL(0x0e99fc0c,0x1553fed2),LL(0x3c3d73af,0xe4e6608a), LL(0x3ed25820,0x8dc28c2a),LL(0xcadc377d,0x5f375146),LL(0x4b113c00,0x09e1c08d),
+ LL(0x2d096c20,0x567cec1c),LL(0x9c346dd2,0x0b3fb247),LL(0x79a71044,0x1e4c1e43), LL(0xd86defcc,0x4980b895),LL(0x7175491a,0x9ee53061),LL(0x979cdece,0x28b5bb15),
+ LL(0x16b49afc,0x36cb6dd6),LL(0x9372557b,0x498a1aef),LL(0xfa192344,0x4e51a28e), LL(0x6cdd93bc,0xf5a4373e),LL(0xec6a751e,0x54a73a75),LL(0x841194aa,0x9a563884),
+ LL(0x91ad93f9,0xa95a8a06),LL(0x540e0c19,0xb0681b8a),LL(0x4f815aec,0xb0cb9c4d), LL(0x9b9c744a,0x5acf61c1),LL(0xfa7f4dc9,0x72c1126c),LL(0xcc2a7aa2,0xa5afea44),
+ LL(0xf614aace,0x5a9fbecf),LL(0x794afb09,0x2e940ee6),LL(0x0ecaf20e,0xcc5a62de), LL(0x7a41866c,0x57634449),LL(0x4335ac0c,0x365bb619),LL(0x537165fb,0xe8c5699a),
+ LL(0x0db61f1e,0x61966988),LL(0xf31a42d9,0x9a86bd4a),LL(0x93826e9b,0x712f2cdb), LL(0x17d5867b,0xd8edee16),LL(0x8710c50b,0x1e25628f),LL(0x7daab4cc,0x4f0c8f12),
+ LL(0xd3fea70e,0x0ec1ef9f),LL(0x6591a1bc,0xdff00f61),LL(0x126ace6d,0xb680207f), LL(0xc5b9722e,0xfaa3fd69),LL(0x0b3e7f42,0x4a46ce3d),LL(0x49ba8836,0xdb76aec5),
+ LL(0x77738737,0xeaa46cad),LL(0xe1b12f15,0x5c0f2ebd),LL(0x0ca12f78,0x1b07bf63), LL(0x8dd854dc,0xbe19584f),LL(0x11c1c918,0x9ac8971a),LL(0xb3600069,0x72f4b00d),
+ LL(0x43f232a4,0x8c0c1e19),LL(0x6a116ed0,0xbd774022),LL(0xbebaeb71,0xee2ead3a), LL(0x861ab743,0xf224296d),LL(0x650a381e,0x37b4d979),LL(0x8d64e6f5,0x7a8da726),
+ LL(0xd9e956fe,0x528c8c28),LL(0xa1f5f87c,0x1bb92006),LL(0xff91e588,0xf2e662c7), LL(0xbb5cfe01,0x36ad72ae),LL(0x19e772d5,0xf489b95d),LL(0x8b6ddd88,0x77675dbf),
+ LL(0xf10d59a9,0xa40a5023),LL(0x250fb5de,0x15965ab7),LL(0xb539afcc,0x27808277), LL(0x8cab9918,0xf7f7ee31),LL(0x6c0353bf,0xd5b05608),LL(0x5255c6a1,0x20a150e8),
+ LL(0x192fc198,0xdc6a57e6),LL(0xc3c7ed17,0x3506fc9d),LL(0xa4a271bc,0x916219f6), LL(0x964b3816,0x03f8b160),LL(0xf1a09190,0x454bae16),LL(0x6fab73b1,0x6d316b41),
+ LL(0x5c22fc9b,0x768669f6),LL(0xe0219ce7,0xc2bbb0c5),LL(0xaf224185,0x77d99a44), LL(0xcead6ae8,0x1bdcaaa5),LL(0x80bcad3d,0xa0015109),LL(0xac464ccb,0xde74800f),
+ LL(0x7c5f58b6,0x419fcc04),LL(0x423d4004,0xa28d071d),LL(0x30014ed7,0x2b51b7b8), LL(0x1e910824,0x51d2e74a),LL(0x049aba24,0x46142c53),LL(0x1c4c9bfc,0xeee290c9),
+},
+/* digit=18 base_pwr=2^126 */
+{
+ LL(0x3d7eba56,0x1432c61d),LL(0x9f3bcbe3,0x3e5748be),LL(0x70d4b4cf,0xd060396a), LL(0xd56cbe10,0x5cf4dd3a),LL(0x8c26eccd,0x6e120e45),LL(0xd44782b8,0x5a349466),
+ LL(0xece48d34,0x0aa69704),LL(0x72c3e801,0x5ae78e58),LL(0xdbbf3257,0x8cae7cdf), LL(0xad51d342,0x7f33e06d),LL(0x8c54f76e,0x842b3c9b),LL(0xd9738bf1,0x27439730),
+ LL(0x8d92d2ec,0x606dcdf3),LL(0x47bce9e6,0x80661389),LL(0x20424ac9,0xf9e37e1c), LL(0x1d4308c4,0xb4271df8),LL(0x2524d693,0x32991fcb),LL(0x3eb1eb87,0x1b3e3739),
+ LL(0xb01d8c67,0x1366f4ea),LL(0x12c079e1,0xfc0e2aaa),LL(0xc73eb944,0xde8828da), LL(0x4fb7452a,0x1be389c3),LL(0x3ab20ed9,0x1b47de61),LL(0xe88a74b5,0x0a0e4dd5),
+ LL(0x9f3a0e52,0x42086dea),LL(0xdea9b529,0x2b27362c),LL(0x0f6b324a,0xa601b101), LL(0x8d8999b3,0x50deb5db),LL(0x0f97d636,0xb5146466),LL(0x7452ad66,0xe400edf5),
+ LL(0xf40e2c2a,0xcea8e0f5),LL(0x5c7a6851,0xd7a70dcf),LL(0x3c3eef95,0xb07f27bf), LL(0x6b31486d,0xebeaedec),LL(0xae6fd833,0xa6218332),LL(0x4c2f458c,0x19ce8eaa),
+ LL(0xb1bfa9ec,0xfaae66f3),LL(0x2742714b,0xc7b516dd),LL(0x8f55fcc6,0x6bd999fa), LL(0x1b07a49e,0xbdf9e3dc),LL(0xdb922eb3,0x8c8fe856),LL(0xe3b05757,0xf0e446dc),
+ LL(0xcab82ecb,0x12bfbae5),LL(0xe279d4d5,0xae24cbb6),LL(0xaaa064ed,0x2ae08e15), LL(0x053194f4,0xe4f4d9f8),LL(0x4fb349c2,0x66627f60),LL(0x7d673df8,0xa57270c4),
+ LL(0x8de75f76,0x79c8e28f),LL(0xb5103e06,0xc46d7632),LL(0xb99c0669,0xee23de7a), LL(0x112100cb,0xb6a05082),LL(0x559c6fe6,0xd3aaf2ba),LL(0x310d9cda,0x1fa98099),
+ LL(0xd68c0cdd,0x66b15c32),LL(0x316bb565,0xc1a8dcd1),LL(0x66388e62,0xfe124230), LL(0x6aa0caf8,0x87421a82),LL(0x45ae8aba,0x163ed8a0),LL(0xf8869a95,0x799ecc06),
+ LL(0xb1f08b18,0x9b5f811f),LL(0x8a8e6e51,0x21df77e4),LL(0x41906e3b,0x0ece8f82), LL(0xb358dbd7,0xcc8f1a7f),LL(0x348f81d2,0x7eae1659),LL(0xba2fc496,0xaeb9bf86),
+ LL(0xe8ee3475,0x1d24ece4),LL(0x0333898d,0x3a9629c6),LL(0xaa4b4d26,0x51fe2f63), LL(0x45450f91,0x65713078),LL(0xed53b1a6,0x9fe570de),LL(0xccfc903e,0x49d5947a),
+ LL(0xd12646d4,0xd1a4ee1f),LL(0x108a021d,0x8be0f550),LL(0x0c9a397c,0xadca94e2), LL(0x7a116b52,0x443e40d2),LL(0x4a7e4f8c,0x8922a749),LL(0x11b9faaf,0x13dd25d4),
+ LL(0x677337c6,0x23169fd1),LL(0xf4275e2f,0xe8b155ff),LL(0xaa432608,0x199fd451), LL(0xd6a8a707,0x43fae1e4),LL(0x22598f5c,0x30b74dae),LL(0x4412a37e,0x3231c5fb),
+ LL(0xa6ef8dc3,0x242076a6),LL(0x3531d9ba,0xa91fa776),LL(0x15395cc0,0x77f95454), LL(0xc333f3fd,0x2d82f42d),LL(0xd57091bf,0x0ebcdf5c),LL(0x04a7020c,0xced34ce1),
+ LL(0x8a8c3087,0x996010a0),LL(0x8731577a,0x2e13009d),LL(0xfb82ff62,0x4a13fc99), LL(0x54ffd5e2,0x03887d55),LL(0x72a2d703,0x81a63ca5),LL(0x61a70095,0xffd0fd49),
+ LL(0xa9ab8d73,0x08cb1949),LL(0x30fcdafe,0xbcd463e1),LL(0xcb2946e3,0x1bd9c440), LL(0x7b685a62,0x67df0c20),LL(0xe6a0b599,0xc85033b3),LL(0xdad9fc5e,0xc26cb4c0),
+ LL(0xd189ee56,0x2915b334),LL(0x7df4385e,0xec153690),LL(0x74e10903,0x78c1233a), LL(0x99e6424b,0x1aad36db),LL(0x8e6c1b2a,0xf0985d3c),LL(0x94d7d170,0x2378ac4b),
+ LL(0x4f4a6728,0x2b339c66),LL(0x682d8695,0xb36bf9a0),LL(0xea6efc7f,0xe5077906), LL(0x8c8272d1,0xbe19ad2b),LL(0x80ba118b,0x2273dd26),LL(0xbc2ebef4,0x1afaebc8),
+ LL(0xd967a41e,0xebfd1e2b),LL(0xc3fded13,0xf89bd7eb),LL(0x5e968c2e,0xfa2e6197), LL(0xd2842061,0x75e0b500),LL(0x81e69daa,0x484219aa),LL(0xe5989ba9,0x3a9fc283),
+ LL(0x827deaa4,0xc54392cb),LL(0xf39f1cc6,0x09b5364b),LL(0xd2711eb8,0xccce7212), LL(0x9b8acd72,0xd4aab549),LL(0x0cb6dec2,0x030af88b),LL(0xc5188526,0x9852b073),
+ LL(0x8119cabd,0x0cd88f26),LL(0x92f36a37,0x09ad060f),LL(0xea4ffb39,0x60e5c4a0), LL(0x44aa9c46,0x29530c7c),LL(0x98565223,0xbc1d4e89),LL(0xd46de9ba,0x1aa44a30),
+ LL(0x2ac56598,0x33cdcbc5),LL(0xdb40e83e,0xe16fab9e),LL(0xa7fb4b01,0x2e90d12b), LL(0xfe18a04f,0x80c85443),LL(0xf59d5ddb,0x27fae391),LL(0xa121c824,0xd75f7ffa),
+ LL(0x21d0d7f1,0xacf5993c),LL(0x04b7c788,0x159623b7),LL(0x35cea4b4,0xc631a623), LL(0x36f64979,0xc75060d1),LL(0xde81f49b,0x93d67ee5),LL(0xb1c080dd,0xc8b7ddec),
+ LL(0x88fc80b3,0x86602cee),LL(0xa52e2b85,0x8d378408),LL(0x7b43597c,0xb66f2489), LL(0x34ead5db,0x8fa5fe75),LL(0x872b559f,0xa91b7b3d),LL(0x969b74d2,0x34007f49),
+ LL(0x31a991bc,0x7ac027f0),LL(0x231f0bd6,0xce3e5a83),LL(0xa724434a,0x6059c8c4), LL(0xbf199050,0x3949f4fc),LL(0x50f4c59e,0xc8d1ce42),LL(0x2c2e840e,0x406e976e),
+ LL(0xff33a74e,0x70c69777),LL(0xbce579fb,0x0caa3c59),LL(0xe3cc09ca,0xcba746d0), LL(0x7493a1a1,0xe544dacb),LL(0x74ebeba1,0x84d251ac),LL(0x7b5a26cb,0x24c351ad),
+ LL(0x438babd3,0x882cde8d),LL(0x4a0c3725,0xc88a8ff9),LL(0xa80a190f,0xee17ee44), LL(0xb11442f3,0x50337a67),LL(0x7f7eed2a,0xc6803f55),LL(0x36750d2d,0xee2e0425),
+ LL(0xe5eccbeb,0x9614df9b),LL(0x6d8a00a6,0xa42fa89b),LL(0x5cb36d70,0x90d5f6eb), LL(0x06790958,0xcc2994e9),LL(0xbda37f56,0x4c4820a0),LL(0x109395c2,0x4ac16bf5),
+ LL(0x4d5e93c7,0x57f12bfa),LL(0xae11e7bf,0x6f57c3c7),LL(0x805ee169,0xe0c53938), LL(0x27da73c9,0xb1ea61d1),LL(0xf1ca8fcf,0x812387b6),LL(0x9aaad2cb,0x812bbf9b),
+ LL(0x673f3249,0x103ab65e),LL(0xf91c5bac,0xbccd32cd),LL(0xb7502b99,0x2cd17117), LL(0xc6ee643f,0xacbc6b98),LL(0x7e3a9007,0xe45beed2),LL(0x39540d2d,0xd6e7cbb3),
+ LL(0x735d7a7e,0xf5ba275a),LL(0x939bb080,0x7d56e5bb),LL(0xa316d8f3,0x632ae0df), LL(0x44834265,0xb16f0da3),LL(0xc0e774a9,0x2ac41378),LL(0x963763b2,0x2d1368a7),
+ LL(0x2910cb9b,0xbb909572),LL(0x7ec8764f,0x9b97d7d3),LL(0x0a1f7187,0x45ed9127), LL(0x91607114,0x4911eae6),LL(0xbec9af64,0x5a3283f3),LL(0x24181e7a,0xfad12d4a),
+ LL(0x304aa2f6,0x7130416a),LL(0xa93ea2a4,0x3d8ec32a),LL(0xb42283de,0xf746be9c), LL(0xfaf3861d,0x122fff14),LL(0xfc5c58f9,0x85c1a762),LL(0xa1051cf0,0x096434ec),
+ LL(0x7f5300f5,0x991bef56),LL(0xdb18ccbb,0x8a974cb7),LL(0xd51e5e8d,0x95e6464d), LL(0xb24414cc,0x7891a137),LL(0x78ca6881,0x614852b1),LL(0x11512b7e,0x8ce344f9),
+ LL(0x14180a17,0x225c5475),LL(0xe0402e95,0x20f7198f),LL(0x7dc14a78,0x834328aa), LL(0xf00864aa,0xf9f3f9d9),LL(0x5c929f4e,0xc14ac9fd),LL(0x67caed5a,0x565edd57),
+ LL(0xa3116bfd,0xc3febfae),LL(0x25b0091a,0xd28b9297),LL(0x43d43e9d,0x71940761), LL(0xa6743cde,0x0b0dcd52),LL(0x85916ef5,0x0d9c9307),LL(0xed0ea307,0x16d7fa15),
+ LL(0xd874f8fb,0xcd73c3b4),LL(0xdd4872db,0x89f049a0),LL(0xd6c574e0,0xa3c1e344), LL(0x1501c2b5,0x42aa48a1),LL(0x4379b187,0x08c07386),LL(0xdb94daef,0x651b8ea0),
+ LL(0x2a46e40e,0xb29008a4),LL(0xafe5ce10,0xf8cfacfa),LL(0x1f36cf21,0xc20de58c), LL(0x77586b4e,0x1667beb5),LL(0xdb697901,0x549fbdad),LL(0xbec7838a,0x05d84e16),
+ LL(0x86573220,0xca40cc00),LL(0xce72bdb3,0x2b43ccde),LL(0xf187d609,0xd8d285d3), LL(0xcbb90bdf,0x975d5583),LL(0xdb3ce7c8,0xd8e1edb1),LL(0x1be6a0d8,0xf24a6f87),
+ LL(0xc5db734e,0x72d204bf),LL(0x1ead06dd,0x4b794609),LL(0xd899503a,0xab7e900a), LL(0x808698fa,0x682a67a7),LL(0x81d2be81,0x8d5f7a3f),LL(0x6db17983,0x5ac7f636),
+ LL(0xf5d8bc59,0x58e88381),LL(0xbc6677a0,0x0c14b7eb),LL(0x75f0beea,0x26d7fb70), LL(0x3c789c7d,0xf71d6c28),LL(0x31a64d6a,0x0e1c3ef5),LL(0x3a025a05,0x930f15cb),
+ LL(0xf84e9a66,0xa848b469),LL(0x0a6acdfb,0x8b3620ef),LL(0xc0f3c653,0x803dc9e4), LL(0x70d4aaad,0x87b9452d),LL(0x2e5341df,0xd2039635),LL(0xcee3e654,0x1518ec72),
+ LL(0x75e30599,0xd89bb62e),LL(0x358eb463,0xffb8be40),LL(0xac2b9c1d,0xcc7b8c90), LL(0xbe967747,0x14076fcd),LL(0x9e9118cc,0x4c590a0d),LL(0x7fdedab7,0x255af971),
+ LL(0x0bf36a0e,0x7cb0703b),LL(0x2f6e1ad6,0x9d4f60d3),LL(0x80851e9d,0x0ddfa57d), LL(0x320a950b,0x0d7e34d2),LL(0x3cf9b367,0x344c00bb),LL(0x7f5fb665,0xbf5c2104),
+ LL(0x5c85310d,0x01355f1f),LL(0x430840fb,0xa17a28ca),LL(0xbddb8e53,0x1573b14f), LL(0x1be8bb25,0xb6e9f88e),LL(0x68f882ed,0xf8283ea2),LL(0x9f8a6c36,0x97b1f85c),
+ LL(0xf96965eb,0x16d8df1e),LL(0xc2b9fd6d,0x347159dd),LL(0xc973dc04,0x5a8ff74e), LL(0xe385ad6d,0x6b89c04a),LL(0x76c7bedd,0x1604bc1a),LL(0x09914658,0xc1e216de),
+ LL(0xe5d7f3b0,0xe285c4b9),LL(0xde0ec465,0x340ea40f),LL(0x51eaa759,0xddc7e286), LL(0x2a2118e1,0x3d1f99a9),LL(0x99fa6ada,0xf8dbccb1),LL(0x2e831534,0xdcb7d5d1),
+ LL(0xa33e53ea,0x90c5048d),LL(0xc03b6f58,0xe68e4543),LL(0x0585ccce,0x2c9860a2), LL(0x15f92a46,0x948b7875),LL(0xa62a0f0f,0x913f01ea),LL(0xa35eeb9b,0x06623f96),
+ LL(0x9c77ae5f,0x403740c1),LL(0xd975126c,0x25df8030),LL(0xaf1bd02a,0x762b3d5f), LL(0x7a17ca9e,0xa9ef424f),LL(0x5bbdefcb,0xf0e425ee),LL(0x6ed00a8b,0xafa22cf9),
+ LL(0xfdcc0852,0xdcb9848b),LL(0xe4e8b45d,0x22851be9),LL(0x195c527a,0x25543398), LL(0xc4ffcb5c,0x39a1709a),LL(0xc84717ea,0x9d6bc1dc),LL(0x3080227e,0xc5a9436a),
+ LL(0xafcc481e,0xfcc2dbcb),LL(0xe8bdacd0,0x936af760),LL(0xa208d23c,0x37762746), LL(0xcf4cfb3d,0x7c32898d),LL(0xbe8d86f7,0x4c7103db),LL(0x29137736,0x0e8e29e9),
+ LL(0x5fb1f4df,0x4dddcd9d),LL(0xf8e40af7,0xcee0b177),LL(0xd5ed5e8c,0x2d5eed04), LL(0x4436fde2,0x8c57cd9f),LL(0x59431816,0x6d9ae88a),LL(0xfcd05844,0x410d80be),
+ LL(0x4f2e214e,0x72cb7d76),LL(0x50149bdc,0x84aecdf4),LL(0x29a10599,0x55c54af4), LL(0xff356cf8,0x15b4a13c),LL(0x94c1cdb7,0xe251ef48),LL(0x3c294aa2,0x3d868b7d),
+ LL(0x38ac42ad,0x61562246),LL(0x9857cdde,0x35bea87c),LL(0x3bff3a31,0xe288cd86), LL(0xfeff112b,0x6de40901),LL(0xfb86b4fa,0x4c3ff10e),LL(0xa2760141,0xefb2ebbb),
+ LL(0xb651d24d,0xfe675b81),LL(0x1bf57d70,0x58decfa4),LL(0x3e407d11,0x6d577314), LL(0xc363e64b,0x99100a53),LL(0xd5b05ad2,0x3700486d),LL(0x3d16a4f6,0xd725f452),
+ LL(0x4369d7d0,0x7987446d),LL(0x082a8d9a,0x6f73c9d4),LL(0x90c45db8,0x50f2643b), LL(0xa8b8a26e,0xc0547960),LL(0x0419c5f9,0xcf0cc729),LL(0xa88c242d,0x36ec0c68),
+ LL(0xab61869c,0xc39acd0f),LL(0x52d501d6,0xb3676312),LL(0xe963c20d,0xcce446cb), LL(0xd5427311,0x171ef8f9),LL(0x0a43e236,0xd2250f20),LL(0xbf664fa3,0x3734c3a6),
+ LL(0x3a865bc1,0x4debd2e7),LL(0xbffefe51,0x48d3b6e2),LL(0x39246490,0x63d793f1), LL(0x07251f37,0xf2e568cb),LL(0xb86ac8ba,0x0543ce7c),LL(0xf0233d6d,0x34c94bb8),
+ LL(0x6b22f5d4,0x825d20cc),LL(0x87e8b87c,0x3008f0d6),LL(0x6fe24ecc,0x1f179a44), LL(0x3732b8f4,0x45b86fc1),LL(0x5bf33be2,0x280c34e0),LL(0xacc6b35b,0x3656ee7c),
+ LL(0x3de8e3cf,0xef5aea9a),LL(0x13295f9a,0xdaf53c2f),LL(0x37faa7d5,0xef4cb920), LL(0x7b389099,0x7cc42259),LL(0xf4bbc5ab,0xa229e4b0),LL(0x369283c9,0x75a6dd11),
+ LL(0x208de900,0x2472c7bd),LL(0xfe199477,0xa707b3a7),LL(0xe84304aa,0x4eeabcfd), LL(0x69fb0f07,0x8a125707),LL(0xcff32ccb,0x8146ef85),LL(0x6874ae86,0x924e6627),
+ LL(0x5baf5149,0x7ebfdd60),LL(0x6fd26802,0x060d10ff),LL(0x433383ae,0xed4cab01), LL(0x6ae53b2f,0xf6529a62),LL(0x17680c05,0xfb786ea5),LL(0x6a368e73,0xe22d7ea8),
+ LL(0xd5b48338,0x52e49947),LL(0x0b58cffa,0x70575502),LL(0x3097c699,0x0f568fcf), LL(0x2ebb3f51,0x3a78100a),LL(0x6ebf4f52,0x8ca651ed),LL(0xaf034c4a,0xc21be721),
+},
+/* digit=19 base_pwr=2^133 */
+{
+ LL(0xb439db86,0x318e0141),LL(0x6ba0c36d,0x24dccf9d),LL(0x278f654b,0xe30ecdee), LL(0xcc96cfd2,0x3b53ec8b),LL(0xffdef7f9,0xb15365ab),LL(0xb77c2bdb,0x2886538d),
+ LL(0xdd6dd374,0x16beccc0),LL(0xe0de912b,0xab022ba4),LL(0x9fa6c113,0x0fa1e066), LL(0x5602f255,0xa62f3440),LL(0xde5080c3,0xf1744743),LL(0x959de74a,0x5dc10f57),
+ LL(0x30bcd508,0x3fea4a00),LL(0xd7784a23,0xc4b99502),LL(0x22777f72,0xc2aae8e2), LL(0xb738b26a,0x0998acd7),LL(0x284a4687,0x01c21758),LL(0x60aa1544,0x86331b2c),
+ LL(0x044902c4,0xb138ec30),LL(0xbbc5aa92,0xedbb10a5),LL(0x8cf968b8,0x78dab5f0), LL(0x5582adf1,0xc522aa4d),LL(0x757f6d77,0x27b2cad3),LL(0x8496e06e,0xd99cc418),
+ LL(0x14b10f6b,0x353a03a9),LL(0xd618e82c,0x0e0360ad),LL(0x5c8ba6c1,0xe95b9c21), LL(0xa2aca406,0x420fcef8),LL(0x3d0af393,0x511e7327),LL(0x4d7c2d87,0x240d0932),
+ LL(0x0431f61e,0x72bc67e3),LL(0x35cbaced,0xe0b8c3f5),LL(0x811b966d,0xec526634), LL(0xedbca0fb,0x994e956d),LL(0xec733f7b,0x1d1d456a),LL(0x10d8156a,0x481983f5),
+ LL(0x25b3e1e1,0x2d4c36da),LL(0x63bd55c6,0xf81e5e71),LL(0x1d80e9a3,0x8ebaa53f), LL(0x5d2b6568,0xe162ca96),LL(0x58264463,0xae3e0e1d),LL(0xca65ecfa,0x4d50c694),
+ LL(0x2b0d1ddf,0x9dbc08f7),LL(0xabf627f7,0xe9e345da),LL(0xa7badd66,0x110cebe6), LL(0x48702def,0x8055893e),LL(0x987a98ba,0x04470e1b),LL(0x1d380312,0xc27475da),
+ LL(0x9fea7b29,0x8a275184),LL(0xcaf14cdd,0xdc9a9a94),LL(0x5aa56285,0x6c8859b5), LL(0x242a5eee,0x9eede9fa),LL(0x0b4d4c44,0xb738b0f2),LL(0xda57c6cc,0xcd8174f8),
+ LL(0x3cb5df38,0x32b55a3c),LL(0x0cbf8de1,0x2bf1c097),LL(0x9b7812a9,0x1f27c2f2), LL(0xbb4241cd,0x41cfb699),LL(0xb8cefac0,0xf25fb9ad),LL(0x4b462fe6,0x0e8ea882),
+ LL(0xb2fa7ed3,0x6d1fe0cd),LL(0xb805f909,0xa5afec06),LL(0x50929ff7,0x7114c77f), LL(0x41e73d2a,0xb70a0449),LL(0x412afd6a,0x17353c86),LL(0xe777054a,0x4b1ab341),
+ LL(0xb6b4736a,0x205f30a3),LL(0xec96f97b,0xdc57c0dc),LL(0x50892f3d,0x6026e016), LL(0x9872ee46,0x5587a900),LL(0xea0f599b,0xfa2e40d1),LL(0x5698483e,0xd0dfe28e),
+ LL(0xc978c548,0x96ea419d),LL(0xd41fdcca,0xc78106e5),LL(0x2c3d871f,0x1fcd9bd6), LL(0x8f18504e,0xde3a3b13),LL(0x147e11bb,0x41af768d),LL(0xbea88154,0x57db2d46),
+ LL(0x359605ca,0xa03b50ed),LL(0x8d2e6f9e,0x102d624a),LL(0x021fbaee,0x75846c7d), LL(0xfde66141,0x7ce93a17),LL(0xcb75846b,0xff36566b),LL(0xdfe8687b,0x13f15dbc),
+ LL(0xb6900145,0xa1762cdc),LL(0xd04f6298,0xc52758d8),LL(0x05fb29ed,0x2388b649), LL(0x952caba9,0xf559602d),LL(0x612d83d0,0x7a57aa1c),LL(0x798f6741,0xb0a70b52),
+ LL(0x718b8cfc,0xd977e424),LL(0x9724fb0c,0x0bd2e7ad),LL(0xb4b77d96,0x62055643), LL(0xf3b93b52,0xabe7d1ae),LL(0x29f1f8a5,0x2573a99e),LL(0xf1ae95ae,0x9d861485),
+ LL(0xf37551bf,0xff5d9174),LL(0xeed4fbcc,0x2120b50e),LL(0x61f2e529,0xe442a255), LL(0x2f0b3221,0x1991c2ac),LL(0x598ea6d0,0x39e9fba8),LL(0x38f4004e,0x3e215ecb),
+ LL(0x7112f48d,0xab373c03),LL(0x0cbf0146,0xb36e09a1),LL(0xf8d04ac7,0x750d400d), LL(0x1a257ba4,0x7a522a7e),LL(0xa6fe3d3c,0x19d94e30),LL(0xab24c6d5,0x8f563b6d),
+ LL(0xce3f76db,0x4e8f7ae4),LL(0x951e6883,0xf041cd61),LL(0x677e20c7,0xd5346ef4), LL(0x4f2fa361,0x2ecde00a),LL(0x24e52b5a,0xda39ea83),LL(0xa4037195,0xf13a1d6a),
+ LL(0x8122da8e,0xc4ef50c0),LL(0x1e4dfe54,0x44245ba2),LL(0x549eb736,0x51a3afe6), LL(0x149e53e2,0xb389a041),LL(0x019f7f33,0x59e1806e),LL(0x207e8b03,0xf0bf62ca),
+ LL(0xf023e16c,0x2afa74f0),LL(0xe45110c3,0xc0e3985f),LL(0xef4dc058,0x30d3c844), LL(0x0932e063,0x74a8fe78),LL(0x8d089afd,0x1694b37f),LL(0xc02cfea5,0x688b8d05),
+ LL(0x00b00b60,0x82d73a13),LL(0xec1be174,0x9914b5f8),LL(0x260cca25,0x4b3aa37e), LL(0xdb9eedcc,0x80edd7e4),LL(0xfac065fd,0xd734f788),LL(0x95ca6a6d,0x3bad348e),
+ LL(0x394ac74a,0xcc754ddb),LL(0xfdf2392c,0x499071de),LL(0xbcd3b3a9,0x64980287), LL(0x8ac174ca,0xf9ad94b1),LL(0x48adbfcc,0x7d8487b5),LL(0xeaa22b97,0x3b94b5a7),
+ LL(0xd830a7f8,0xdd6a5e09),LL(0x0a707d6b,0xe88ab4ee),LL(0x6f282e77,0x65064114), LL(0x05630c1d,0x732b3f5f),LL(0xa32278e4,0xedc7f608),LL(0x40aa906b,0xf9cc5a48),
+ LL(0x84cb7f2e,0x22cc8910),LL(0x492f6b49,0xe72c3a7e),LL(0xd9172542,0xcdfb7abb), LL(0x5379490b,0x332ca313),LL(0xc019dc08,0x74e34e7e),LL(0xffac012c,0xae01f427),
+ LL(0x6589755c,0x28a5ee38),LL(0xf5484971,0xc3c09b28),LL(0xebdc2e2d,0x98c22f2b), LL(0xb739eaf1,0xf34f7446),LL(0x40de5322,0x71c9f8f5),LL(0x8cf40eb6,0x94ace574),
+ LL(0x660ffcd8,0x14a05e05),LL(0x384c2a8e,0x13f0de7d),LL(0x192dd045,0xa52ddb4d), LL(0xea4aaf10,0xf4d36e86),LL(0xe77d2f45,0xfd9db24d),LL(0x904e7b10,0x55f85a8b),
+ LL(0x260ee499,0x315e7fcb),LL(0x15cbbecf,0xa3bb055e),LL(0xfda09d93,0x2634a003), LL(0x71c4d7c5,0x5b3c4fe2),LL(0xc9380c8d,0x6805f34b),LL(0xc8a539f9,0x587eeb71),
+ LL(0x51635be4,0xdd9571b7),LL(0x9e7aabb0,0x321a0e22),LL(0x55781706,0x8b2b23f5), LL(0xaea3c730,0x7cca33ac),LL(0xf95cb480,0x3f6401d1),LL(0x26a55858,0xa5ef93a5),
+ LL(0xc8b7c736,0x1eaf9f4c),LL(0xeb5b2b70,0x1dcb1722),LL(0x65aab50b,0x0d948725), LL(0x15e7c8ef,0x193c8d06),LL(0x6c391c08,0xf7745835),LL(0x897265d5,0xcbd15810),
+ LL(0xb54eb895,0x205436fe),LL(0x059b35b6,0x4300c84f),LL(0x9d231cce,0xab267da3), LL(0x20fa381d,0x25239fea),LL(0x004d10be,0x5781e9de),LL(0x14641496,0x36c78b47),
+ LL(0x99963302,0x0c2bd51b),LL(0x6afdcb5d,0x1958d45e),LL(0x25a00883,0xaa86d186), LL(0xe705abde,0x14852c1f),LL(0xc056e6f3,0x352304ed),LL(0x83c10ff8,0xd05eedf0),
+ LL(0x702067ff,0xd0cd6dc3),LL(0xd3d111ac,0x3ee83612),LL(0x5ef57788,0xad67877e), LL(0xff6b4f08,0xda249b82),LL(0xd696f4f4,0x9dbbe132),LL(0x51804942,0xfe5ba023),
+ LL(0x060154d9,0xdc19d20b),LL(0x522b27ce,0x2c6233ef),LL(0x20fde2af,0x8b235bec), LL(0x3bb960c1,0x2adcfe01),LL(0x603b8fb9,0xc79aa84e),LL(0x6b460288,0xe204af13),
+ LL(0x21d24338,0xe9c83cec),LL(0x644ee8c2,0x768ea11b),LL(0x94fcc664,0x59088ada), LL(0x9374c03c,0x900c7bb8),LL(0x43cb2818,0xad48000f),LL(0x9145786e,0xa2041cca),
+ LL(0x02582993,0x1765e1a6),LL(0x34c86e0f,0xe74f0372),LL(0x2bfc967b,0x5ba6c193), LL(0x154fde15,0xa09688b9),LL(0xd02973ed,0xcc002cb5),LL(0x92f64238,0x01037f55),
+ LL(0x8597bf52,0xcef12f0f),LL(0x323d2edc,0xd1bbb357),LL(0x6cac9c11,0x06254d2f), LL(0xa913fbcd,0x13b6a932),LL(0xa97bee41,0x9865d3ba),LL(0x224479fb,0xab2a703b),
+ LL(0xbe515d1a,0xfd4472bf),LL(0x1dc983d4,0x7ca21984),LL(0x2a2db967,0x1f62c4c0), LL(0xcf71a671,0x4bcade52),LL(0xdfadf5eb,0x50fdda39),LL(0x650fac39,0xb020e598),
+ LL(0x6d401575,0x05292bde),LL(0x1448bd42,0x0c3c2b31),LL(0x526536c1,0xa76d46cd), LL(0x2a839d2c,0xaa0c74ff),LL(0x62f94ad3,0x7283bfb0),LL(0xe710c108,0x063159c2),
+ LL(0x11840343,0xbf96687c),LL(0xd26b7f84,0x36468056),LL(0x362582a6,0x6ab84c43), LL(0x7d43997a,0x3bb7a3cb),LL(0x19bc5d68,0xfafa8874),LL(0x042ff6c3,0x73dd38cb),
+ LL(0xe5d2eb17,0xab12eac0),LL(0x07bac547,0x4b8a41cb),LL(0xffa6df36,0xe9bfd303), LL(0x3c9a6423,0x6bb4517b),LL(0x9ca20f86,0xd393d1f0),LL(0x2231716f,0xb8e17b6c),
+ LL(0x35417747,0x4a3a2eeb),LL(0xc8c6b7c4,0x9b638e84),LL(0x16cbe067,0xc1215698), LL(0x322fa78f,0xfe96edae),LL(0x35c0584c,0x7b161bc3),LL(0xb32db702,0x86d59110),
+ LL(0xdc2fd5f6,0x232b8b24),LL(0x3c7926e0,0x082d2045),LL(0xb2c6285b,0xa73041dc), LL(0x8dcded40,0x60172712),LL(0x04a70ed1,0xc62c9174),LL(0x962a378d,0x6fb37121),
+ LL(0x823c3d77,0xb6f17b32),LL(0x9f7e5c97,0x5c45e3a8),LL(0xc3396a05,0x2daa3c77), LL(0xb063c7fa,0xbb2c63d7),LL(0x2ce90d3a,0x7a1c8227),LL(0xe4b3c32a,0x109b4b69),
+ LL(0x35f82f23,0xfdf6efba),LL(0x35381294,0x805d2980),LL(0x35aa14e0,0x894b62fa), LL(0x83d15a96,0x9b0d470a),LL(0x562cbafe,0x16a073f7),LL(0xdd734859,0x7851278e),
+ LL(0xd678f3a7,0xd0bf1f91),LL(0x5c227a14,0xe3d6d2e9),LL(0xf043aca3,0xd262c755), LL(0xee561894,0x60988c89),LL(0x73ca3bc8,0x64ec6b35),LL(0xc42baa7e,0x69a377b3),
+ LL(0xc96115ea,0x71695d26),LL(0x5b21f1d3,0x72271453),LL(0x39bafd21,0x8697c31b), LL(0x90197919,0xbd705026),LL(0x24ac9116,0x3bd494e4),LL(0xdfc15b14,0xc80bb868),
+ LL(0xf71afdd8,0x279ba623),LL(0x033c4ae8,0x9f980a73),LL(0x470c4517,0x21606d51), LL(0xe11ef4db,0x6d179aa7),LL(0xf1ca7162,0x869eac72),LL(0x86deb5b6,0xbc4a973d),
+ LL(0x200897e5,0x162b8299),LL(0xfccd9352,0xd6d516d0),LL(0xabe7feae,0x77eb73ea), LL(0xc3484609,0x8c10355c),LL(0x3426fefb,0xeea4f0b5),LL(0x1520bff2,0x140ba2d5),
+ LL(0xa781a4b6,0x8e02c736),LL(0xc1a1dc16,0x42c46ee6),LL(0x40321197,0xcae4633e), LL(0x98f07389,0xf04c64f2),LL(0x037c647a,0x6ee9ba3c),LL(0x48084ba5,0x4b003962),
+ LL(0xe74b1cd4,0x858e1b6d),LL(0x32cb7b0f,0x1d3abad5),LL(0xed92d1b4,0x5b519e77), LL(0xc30f4257,0x1c92c6d0),LL(0x4987bf78,0x5f383d3b),LL(0x4a7f80cc,0xd1c583d1),
+ LL(0xb56713fe,0x93af26d2),LL(0xa2ab05fd,0xc1226000),LL(0x7254b6e9,0x841945df), LL(0x5061c175,0xc5109d82),LL(0x00ff256d,0x62d1e3dd),LL(0xf0de138f,0x843b00ee),
+ LL(0xf374c5cf,0xf615bb55),LL(0x48c4c8a3,0xf0ad394d),LL(0x4d11c95a,0xdc7346c8), LL(0x4c5c8014,0x458a607e),LL(0xa5494d82,0xfe616aeb),LL(0xec4b9fb5,0xb0b346d1),
+ LL(0x06273f56,0x69c25150),LL(0x0c65034e,0x67589cbf),LL(0x93836375,0xd9a2c967), LL(0xa738e250,0x65e7cf03),LL(0xf4d22339,0x96e92577),LL(0x81400fed,0x4bfc9f81),
+ LL(0xbe5747bd,0x6e69c9c5),LL(0x2c6c18e6,0xe0472ac1),LL(0x083b884c,0xba3a6bdf), LL(0x52e63728,0x68985297),LL(0xeec09362,0x953f2dd9),LL(0xf975e840,0x3f3a2694),
+ LL(0x3edfaffd,0x77325f02),LL(0xff7d543b,0xc74420f8),LL(0xf9f15b53,0xb3944991), LL(0x0aac0254,0x86959454),LL(0x3b374e03,0x6f43d3e6),LL(0xb30e1624,0x844012c1),
+ LL(0x65028b0a,0xd064ea02),LL(0x3b4d2ee7,0x806c09ba),LL(0x7fe4f230,0x8a1f8901), LL(0xeda1696a,0xbd498bb0),LL(0x3bc968a5,0xe51465d8),LL(0x2bd1dae9,0xd28bdafe),
+ LL(0xf62ea381,0x65982b48),LL(0xcd73058f,0x4807eaa8),LL(0x240c2f9b,0x345875b6), LL(0x65a17c9e,0x778bc20a),LL(0x23054c23,0x6fe407b8),LL(0x75ba53f6,0xfae57b0f),
+ LL(0x78d45156,0x32fbbcb8),LL(0x71e3fd03,0xaefa78d7),LL(0x0f74090b,0xd7c46ea4), LL(0xcc57cee3,0x89b357ff),LL(0x5840243b,0x9e5cedb2),LL(0x0d0e8ac0,0x98a48d58),
+ LL(0x610ce375,0xcff03f53),LL(0xc9bfbd54,0x7b3c5728),LL(0xcd327836,0xeb868866), LL(0xae712c4e,0x79819aee),LL(0xd7f04c0b,0x0b11d0e4),LL(0xf8a5a59a,0x95bd124d),
+ LL(0xcfda2cc6,0x924e7e79),LL(0x212e1d27,0x3ec19199),LL(0xe70982f2,0x596b8e05), LL(0x08cd6128,0xd664a1a5),LL(0xa30c9229,0x374d9700),LL(0xdea4ef83,0x44226abe),
+ LL(0x49136355,0x9b6659c1),LL(0xc404424c,0x138972a0),LL(0x38bb5edb,0x75c55b59), LL(0x16af7574,0xcf1bc9c8),LL(0x3386b6af,0xaad6e8c6),LL(0x76fe803f,0x5d136ae2),
+ LL(0x9d03f245,0x3912bca6),LL(0xc3a1fb1b,0xe6ff0efa),LL(0xbb5db166,0x7876e5c1), LL(0xf0b460b5,0x23c904b1),LL(0xe69528b2,0xee8e2bf6),LL(0x5191c468,0x2e8d3640),
+ LL(0x06516227,0x980138d8),LL(0x861c3973,0x2b71e24d),LL(0x5ca35d8d,0x2580dd9c), LL(0x5c9c05ae,0xac4df0a9),LL(0x3c68c54a,0x63916a87),LL(0xf536c869,0x3a6ffdbe),
+},
+/* digit=20 base_pwr=2^140 */
+{
+ LL(0xe9cb9264,0x1012e415),LL(0x14ab08a4,0x4f91e85d),LL(0x35df1c1d,0x61431287), LL(0xe79281d7,0xbbd3824f),LL(0xaf54a4fc,0x99d4e30c),LL(0x642e1333,0xc4948701),
+ LL(0xbae8e3bd,0xe93eda3e),LL(0xf46b38aa,0x4ef30da4),LL(0x4151dbfa,0xd6cab5b2), LL(0xcf5c0161,0x04fd2b14),LL(0x80166092,0x7c8a0389),LL(0xd94e32be,0x47096659),
+ LL(0x6156b873,0xf7feeab3),LL(0x5be66206,0x4a2f2b83),LL(0xdcfc9038,0xdf3277f1), LL(0xf1d66fb4,0x9b170776),LL(0x076dcabf,0x25ebdd78),LL(0x38b46ab5,0xa7c6ee6f),
+ LL(0x79f1a500,0x4cfc4785),LL(0xaf098654,0x3ba69756),LL(0xc21ecc8e,0x41491597), LL(0x0c8f0d93,0x4982c841),LL(0x2b324495,0x03c63423),LL(0x697188c1,0x7c3952ab),
+ LL(0x56b9ce4d,0xe770f45f),LL(0xa9a47842,0x07148130),LL(0xced2b9b0,0xbc38458c), LL(0x047d7534,0xbe545be0),LL(0x1c6ff074,0x6768b949),LL(0xde3dbd8d,0x1dca8c16),
+ LL(0xcc3bcbc4,0x0636cefc),LL(0x5159e643,0xc92b9ff8),LL(0x91bb0476,0x00a152ac), LL(0x42dea60d,0x3fc87a4d),LL(0x64d6fc10,0x6803f0e3),LL(0xf9f370c8,0x99409032),
+ LL(0x5826fd73,0xc6616960),LL(0x5517ee73,0xf1955831),LL(0x51c70ff4,0x88b7cec6), LL(0x366d0443,0xb0888a9e),LL(0x3af869e2,0xa9181fd0),LL(0x0a248328,0x26076aef),
+ LL(0xbaed8f78,0xad53d93a),LL(0xd71de257,0xa0b9be84),LL(0x603a33a2,0x4630f086), LL(0xb911d04a,0x5b44638b),LL(0x6e3fa849,0x02150fde),LL(0x4184d866,0x8421d2e5),
+ LL(0xe5897526,0x52557cb2),LL(0x502c34ec,0xdfe0933e),LL(0x72eb3dba,0x4c1d921f), LL(0xc524a1ed,0x1989729a),LL(0x18b3826f,0xc702ac61),LL(0x0d5cd8f7,0xaa34f109),
+ LL(0xfa609590,0xe4ef5cf9),LL(0x6f3d8102,0x215b5177),LL(0xccb2d3ca,0xb1886914), LL(0x65884534,0xcda19104),LL(0x870769b4,0x2cf8baf3),LL(0x7339dc8e,0x22f2d15b),
+ LL(0x21a810cf,0x35c9c17a),LL(0xfb6bdd26,0x24cd74b4),LL(0x1a7c7f5a,0x6786a13c), LL(0x817609c4,0xec7e4bb7),LL(0x256f4592,0x6de1e630),LL(0x8326a507,0x923f4ca6),
+ LL(0xb5bfac37,0xbe78c4a0),LL(0x197cb928,0xedbb3fc8),LL(0x8b563167,0x477ac821), LL(0xd224f360,0x70cb3ee4),LL(0x53d0e1fe,0xe1b338d6),LL(0xf10e26d1,0x7a5c3f25),
+ LL(0x745f0869,0xb0c7846e),LL(0xc667523a,0x50becb24),LL(0x14521b55,0xc6acff6b), LL(0x0c4a3c6a,0x70ed855c),LL(0x8e159fe3,0x1ec2b9d5),LL(0x74b5c29a,0x06249cb5),
+ LL(0x2dd180d8,0x0f3b2f65),LL(0x7b859a81,0x56200850),LL(0x4b18d95c,0x9d0f51df), LL(0x6f0b29af,0xe82ce6d3),LL(0x2a4310d4,0x75a0fcf0),LL(0xc7bed80c,0xdeebf877),
+ LL(0x64d180d0,0xcf0d6afa),LL(0xa6434a9a,0xb8f7c1c9),LL(0x8cfb2948,0x6cdb576a), LL(0x863bb933,0xed57f57a),LL(0x4df11d72,0xc7f06882),LL(0x4c2b933c,0xe29a2fa1),
+ LL(0xa17d0463,0xbba79104),LL(0x5a81b9f9,0xd7cbed07),LL(0x4e242aa9,0x20e07b74), LL(0xbb9e790d,0xb9d12856),LL(0x47c00f37,0x45bdbce1),LL(0x898b8efb,0xa0ed2b72),
+ LL(0xb466dfb9,0xe8318ed6),LL(0x94a4baab,0x9faa662b),LL(0x051206c6,0x01503060), LL(0x3c19ae55,0xa2ebeefc),LL(0x84d2a9c1,0x210ae455),LL(0x82e43956,0x562df0b5),
+ LL(0x17080cf3,0x89be703d),LL(0xf1ca3642,0xe83c11cb),LL(0x13271110,0xe61d20e1), LL(0xd21d05b8,0xd631b1d8),LL(0x6452ed8c,0x620fc76f),LL(0xe58a415b,0xcc6794e6),
+ LL(0x15a94078,0x0a5c8a7e),LL(0x86688f1d,0xd4226082),LL(0xa85bc83e,0x8ede9371), LL(0x0df393c7,0xecd1f5e2),LL(0xd2fc7359,0xc32847c6),LL(0x08190efe,0x1e9fd4bc),
+ LL(0xeea5827a,0x83dd7278),LL(0xcbc88ba5,0x1ddaadd7),LL(0x218e4199,0x588e4903), LL(0xc8310baf,0xb685d516),LL(0x74bb3deb,0xc9aa64ca),LL(0x931bdaa3,0x0cb7a0ea),
+ LL(0xcdf5ecc3,0xc1ecf641),LL(0xf8c7946c,0xdeac2eff),LL(0x02ca92e6,0x73c8e009), LL(0x7361770a,0x19bc9700),LL(0xacc0e88b,0x455770d3),LL(0x7ddafde7,0xf7cd145c),
+ LL(0x3d17e97a,0xa33b896c),LL(0x30a84be8,0x238a70a9),LL(0x044f68ec,0xb629bdd9), LL(0x5614b150,0x6d180693),LL(0x7fde6cd3,0x54ba0757),LL(0x4980c20b,0x19edd13b),
+ LL(0x1073d079,0x4b1584e9),LL(0xa794787f,0x6e60302e),LL(0x8088839b,0xfeb8358c), LL(0x1a701ad3,0x86f51cbf),LL(0xd07f6815,0x61b9c974),LL(0x653f1425,0x00a0d546),
+ LL(0x11894381,0xf75ced35),LL(0x319c7001,0x49e325d8),LL(0xa67066ad,0xd20b2435), LL(0x4c608028,0xdd23ebc4),LL(0xba2205ea,0x51d78928),LL(0xfb1fb5cc,0x737b9cb1),
+ LL(0xc03586f9,0xbbb8ad72),LL(0xd27fea7c,0x402a9fff),LL(0x5dda8a10,0x831e331a), LL(0x1eb0456e,0x6d5a2c5e),LL(0x9f7b81ed,0x65290756),LL(0xbec1e59d,0x976b7327),
+ LL(0x419baf59,0xea1a80a5),LL(0x57278748,0xbc517958),LL(0x32e85407,0x29245035), LL(0xc0d421ac,0x812b0397),LL(0xd7a01665,0xa9f235bf),LL(0x24652cd8,0x9d164236),
+ LL(0x7f2c6c70,0xbf6ae2aa),LL(0xee9e0e91,0xa021d9a9),LL(0xf1766121,0x409464f1), LL(0x4a73446a,0xe180eb42),LL(0xc5f86d28,0xe7e1ed8b),LL(0x903583e2,0x2e4a2f9a),
+ LL(0xc5e91397,0xba644637),LL(0xd74dad5e,0xfc63ab71),LL(0x824f5cb0,0x1baa70ad), LL(0x72783f79,0x5f89e95b),LL(0x3813fcb5,0x45bb2a10),LL(0xf3165835,0xab43fa7f),
+ LL(0x14c22638,0xb7c86dac),LL(0xdae71747,0x3656ca1f),LL(0xc534e20e,0x85da5ae4), LL(0x49153a00,0x3aa49d12),LL(0xbd68b553,0x34857651),LL(0x47329cb6,0xe4fb4c67),
+ LL(0xd2659f96,0xf91390b8),LL(0xae3ada10,0x507dcc75),LL(0xea42c05c,0xec3156e1), LL(0x28627de0,0xa851f6db),LL(0x3f5bd276,0x10f1771e),LL(0x29bb086a,0xda6fb38d),
+ LL(0x72b97a47,0x9bdec367),LL(0x657aba3c,0x033db4d1),LL(0x0a26ba3d,0x6d7dcdad), LL(0xb13b21c6,0x93253eae),LL(0xf3e1e435,0xf49e4546),LL(0xfc1d9651,0xda2f3b67),
+ LL(0x98a48009,0xf35a51b4),LL(0x74249dd0,0x6d03d805),LL(0xcb813640,0x3a2ea471), LL(0x8fb0ba2e,0xf40ccd7e),LL(0x967a4bda,0xe1511909),LL(0x9c401b43,0x92f26a91),
+ LL(0x9b338eaa,0xc7019ac8),LL(0x1ff7bf17,0x9d084573),LL(0x565ad4f0,0x64807759), LL(0x0a7bdf41,0x1c42c251),LL(0x9e01efd3,0x63caad5e),LL(0xc624e5ba,0x55785f80),
+ LL(0xee0bde78,0x7db8ae10),LL(0xb62c8387,0x0e6313ac),LL(0xcd166c86,0xd4ec5c51), LL(0x39448747,0x1a9c939d),LL(0x731d066a,0x3a75230d),LL(0x73962926,0x91bf93ae),
+ LL(0x61e7a7be,0x1485af16),LL(0x71c2640c,0x112d3d53),LL(0xcbbb3b9b,0x277a24c5), LL(0xfa95ddae,0xa17a1980),LL(0x7a40ef8e,0x4ae12d96),LL(0xfb1c3fd7,0x339601a8),
+ LL(0x74e8c96d,0x05fc1df3),LL(0x8ad8de59,0x004fd161),LL(0x747f9809,0x0ab94cbb), LL(0x341b687f,0xc689e96d),LL(0x03d6ec78,0xc3ed2540),LL(0xc677b947,0x58414ee5),
+ LL(0x79d557f9,0xd4b38421),LL(0xb80fd2ca,0xe5f1e680),LL(0x5b2a650d,0x403029fa), LL(0x6ea522b1,0xbc0c8825),LL(0xa186a767,0xcaa2d945),LL(0x254875d3,0xb85ecf45),
+ LL(0xf6031493,0x098fe2ee),LL(0x95f3b2dd,0xd8a4c0c1),LL(0xf565fbfa,0x84d7151f), LL(0x0d46e2ab,0xab92d636),LL(0x7fcbe589,0x822ee95c),LL(0xd061506c,0x855320c5),
+ LL(0xd8c4c89b,0x82458f67),LL(0x4a55190e,0xb7f499f0),LL(0x2be3b154,0x8f90b016), LL(0x13d9c5d2,0xf943056e),LL(0xdf50c757,0x7de98cd6),LL(0xc1785279,0x97d69ee8),
+ LL(0x3fe0c0ab,0x140bc9a7),LL(0x0452da51,0xbf26b0db),LL(0xdad75d1d,0x31658423), LL(0xeb0c6035,0x0f75fa69),LL(0xe800bb3f,0x4cbb16f7),LL(0x66429e7b,0x4892f0a7),
+ LL(0x4c6c9c18,0x218c66a2),LL(0x08cad414,0x97355790),LL(0xb15e573a,0x3b5b1298), LL(0x0e6834ba,0x7aca61bf),LL(0x3f5ac90a,0x025883d3),LL(0x9dff4949,0x6462025c),
+ LL(0x701e063f,0x6370b52c),LL(0xfcbed6d5,0x575b74fa),LL(0x54464ddc,0x87196ca2), LL(0x6aded252,0xabf56ac6),LL(0xe859df43,0x195e68db),LL(0xd3b0c609,0xd7d0b724),
+ LL(0xc7d916d9,0x68fee7bc),LL(0xd2261a1d,0x7c342ab5),LL(0x2d528b45,0x6dc620c3), LL(0x0ae80fdf,0x74e628a7),LL(0xc87865c1,0xb6024eaa),LL(0xb87c19a5,0xcfbcc11e),
+ LL(0x7fc82526,0x16e10271),LL(0x4e53a7eb,0x1894ff31),LL(0xd6fd2213,0x483dd45d), LL(0xe86573ca,0xf832f47b),LL(0x93e56334,0x3fba3845),LL(0xedd7db47,0x88af40db),
+ LL(0x48c963ee,0x478c4ff6),LL(0x41711eb6,0xe3c63604),LL(0x40ebd5fb,0xdc23721b), LL(0x38c5e8a3,0x73b730cb),LL(0xa14de57f,0x379e6a4b),LL(0xc789f412,0xed816ee8),
+ LL(0x0ce5eda0,0x22553add),LL(0xae4119b5,0x2cced448),LL(0xaa185ab7,0x2a352ea6), LL(0x29a2bdee,0x01bd04b4),LL(0xe26e2a0c,0xf76ade92),LL(0xd94aaa8d,0xda8577d6),
+ LL(0x07d56f07,0xc7f17e2f),LL(0x7d87d713,0xc5e3f9d2),LL(0x20f51bc9,0x1497d098), LL(0xed2a6960,0xf4d19f47),LL(0xc38a9534,0x1c57c5ec),LL(0x18c80df7,0xdbffd9a1),
+ LL(0x5f168647,0xf0cc9844),LL(0x1593d662,0x2e63ed9f),LL(0x0ac8146a,0xf5fa425d), LL(0xce76be64,0x67f11299),LL(0xf7727692,0xd42902cf),LL(0xf1f0d4a5,0x06ce330a),
+ LL(0x799a13c8,0xfd425657),LL(0xcf29d9a8,0x2c8a973c),LL(0x1e78973e,0x40ec7ae0), LL(0x78699406,0x4d9856a5),LL(0x08dfdad4,0x7247ba62),LL(0xa468c80b,0xc9427c34),
+ LL(0x3aeaaf13,0xe79cd000),LL(0x9ec3462c,0x6018f62b),LL(0x2ace3a5a,0x1192c3d9), LL(0x64a64ae3,0x715b684d),LL(0x34bf6e70,0x9d318356),LL(0xfdc656ed,0xa23a9958),
+ LL(0x77357c1f,0xe6acb14b),LL(0xe9438466,0x554e9c51),LL(0x8ba9a286,0x97a5abd9), LL(0xd3eed3bb,0xfc1cd0de),LL(0x700f6eee,0xf311fa4a),LL(0x8a99cd1d,0x4dd6d73d),
+ LL(0x6b41a2bb,0x43f68039),LL(0x083ab1a3,0xba3ca572),LL(0x1b173556,0xea841d92), LL(0x928c1fd4,0xb23978ab),LL(0xb985008a,0xd6d7c468),LL(0x2248ceb2,0xa6d40f4e),
+ LL(0xb9ad7efa,0xc9627a3a),LL(0x6759753d,0xbebc0a32),LL(0x7cf0a0fb,0xa3bacd1a), LL(0xdb7cc4c0,0x4ac922fd),LL(0xd7afe1c2,0xfc69f5fa),LL(0x7afcfb11,0x6dde5c15),
+ LL(0xbbd42505,0x9df0ef70),LL(0x464d44cf,0xa4274df4),LL(0x57e809eb,0x8113b3de), LL(0xc10dcf7e,0xaeab98c6),LL(0x1e6f2975,0x58a34894),LL(0x8f9ccf40,0x9cb5ea9d),
+ LL(0xb579d154,0x1c4eac89),LL(0x4b706046,0xafbc0bf0),LL(0x7f6fc44a,0x5ecdfe60), LL(0x0030d612,0x3d9c58e8),LL(0x7811ca4f,0x3d9b1e58),LL(0x78e80d2a,0xd3ace80a),
+ LL(0x48e70c10,0x5a2c98a4),LL(0x1f1028cf,0xa72ad42e),LL(0x2fe8c440,0x30739ff7), LL(0x5fe64d92,0xe83f9edf),LL(0x2fd3764b,0x7cb62281),LL(0x51ab555f,0x9f114c85),
+ LL(0xba081442,0x3a838e28),LL(0x27db39bd,0x71ea2048),LL(0xaf2896ba,0x3cdb99dc), LL(0x962c484b,0x00d6fcb4),LL(0xcd7377d4,0xe72a7bcf),LL(0x5164a634,0x3b6505a3),
+ LL(0x8bddb5d0,0xaec6f498),LL(0x7f02675d,0x92b09fb7),LL(0xa83cefd0,0x79345be5), LL(0x1f828e29,0xea0f3427),LL(0x7cadddfa,0x1ea0786e),LL(0xd159e1b8,0x75ca82d5),
+ LL(0x62c0533a,0xaaaf5a5c),LL(0xe510bc9f,0xa96e494b),LL(0xf2debee9,0x46b1aedc), LL(0xf98911db,0xedd51f34),LL(0xf9056ce1,0x83a0eab8),LL(0x7eae269d,0xa541abff),
+ LL(0xd5d26026,0xb68b8dce),LL(0x28bf2023,0x6ceb559f),LL(0x74bc843f,0x7dd76130), LL(0x35f97a24,0x79c99ea9),LL(0x7b478eaf,0xcc786699),LL(0xc10dc8c8,0x7788ee3c),
+ LL(0xbcba6716,0x88ad66c4),LL(0x95300687,0x2bdf72c8),LL(0xb8fa1b0f,0xdd8629e6), LL(0xe183a10a,0x93d5a8e4),LL(0xae5d5956,0xe3e2d85f),LL(0xddd1b643,0x8b623a95),
+ LL(0x8cc90e24,0xfaf59c8f),LL(0x7f1c7245,0xb7173e32),LL(0x9baad443,0x568e30bf), LL(0x718cbe51,0x7eb7c7cb),LL(0xc1f0f949,0x2a3a214d),LL(0x96a84ad4,0x21a777be),
+ LL(0xb2081c31,0xcdb78081),LL(0x7a9d57b5,0x2bfa8d65),LL(0xb750969c,0x9db52d99), LL(0x645d4012,0x6ebcd855),LL(0x86245e59,0xbcd2fcd1),LL(0x812b3b4b,0x8fff22a6),
+ LL(0x6ffb620b,0x1130ffec),LL(0x22eb38ff,0x279544f9),LL(0x940699a7,0xaeb474fd), LL(0x4c85071c,0x33329bf0),LL(0xaf3d6bd2,0x56b019ec),LL(0x8b3cf686,0xc4aaaf7c),
+},
+/* digit=21 base_pwr=2^147 */
+{
+ LL(0xac2ec7bf,0x8824e17f),LL(0x9bc85814,0x131057c0),LL(0xdbe08716,0x7e43698b), LL(0xab93ba96,0x42ad5ab0),LL(0x7c518be6,0x1ecf5fda),LL(0x673d6c18,0x1a02e6f8),
+ LL(0xb3503cee,0xbf0f89da),LL(0x331d9e6b,0x9169467b),LL(0x3b1900fc,0xe3aa5241), LL(0x3f13a573,0xae45a71e),LL(0x1940c9af,0xec133c7c),LL(0x55c2087c,0x0409942c),
+ LL(0x24e5717c,0xbac3bea8),LL(0x9b83ae02,0xebbc708e),LL(0x7e9ea1f2,0xfa57a0ad), LL(0x704d566a,0x107a38cd),LL(0x85e59024,0x18e24faf),LL(0x0f84a27a,0xec3157c2),
+ LL(0x58b3bb0c,0x17889e93),LL(0xb4031a98,0xbaa2495a),LL(0xb10778db,0x5d3a3a63), LL(0x8f7c139d,0x2fd443d8),LL(0x5ea5ad03,0x83c71634),LL(0xce562cfd,0xaba81b6a),
+ LL(0xd98102aa,0x73e43632),LL(0xc1c41614,0x86932d35),LL(0xeec41de3,0x1c66a427), LL(0x72427be4,0xef9616dc),LL(0xd48ea6d2,0x206de291),LL(0x8160c0e5,0x755f3ab3),
+ LL(0x376fc02d,0x23668837),LL(0xde1f643f,0xc4608c43),LL(0x05775439,0x6f04d8d7), LL(0x0f5452a2,0xb32fa6bc),LL(0x3b09e219,0x6a200395),LL(0xfb0a3adb,0xf58e4d28),
+ LL(0x5f9f2818,0x56285629),LL(0x594adc3c,0x19ba097b),LL(0x0d5212fe,0x6a73f84f), LL(0xb0680c11,0x5106510c),LL(0x13904ea1,0x4d287906),LL(0x8ed4bb25,0x9e4b6db5),
+ LL(0x3efd07b3,0x5c58a701),LL(0x8a62c9c4,0x5569ea8b),LL(0xe3eb4a21,0xbabcab23), LL(0x2ed936e5,0x9f05b68c),LL(0x25d25b7a,0x5b8fcbe4),LL(0x40745f94,0x5104d275),
+ LL(0xe96ebb1c,0xbf9a348a),LL(0xadcee8f6,0xde39269a),LL(0x1891395c,0x92012c94), LL(0x6584db0f,0x3b71f247),LL(0x8f7e3a23,0x9fc90016),LL(0xbe7d1077,0xb5f10362),
+ LL(0x137efed8,0xf06fe20d),LL(0x096f2e2c,0xf037f990),LL(0x416e7f9e,0x7e828e25), LL(0xd17229cc,0xb9066cdf),LL(0x74e2f3cf,0xe1b5d7b4),LL(0xcbc63300,0xa21dc884),
+ LL(0x73213695,0x09291e46),LL(0x7d591bb2,0x599398e7),LL(0x8693f17f,0xbc316181), LL(0x323b2584,0x29e970f3),LL(0x8253ea0d,0x07db9ebe),LL(0xaf8d9499,0x62d8e321),
+ LL(0xce2b6bb7,0x468f741b),LL(0x423f1cec,0xb8703663),LL(0xa1385cee,0x045ddc8d), LL(0x9b1abc32,0xfb61bc91),LL(0x8b0a1f38,0xdc221abc),LL(0x5f8c7e7c,0x174b6f77),
+ LL(0x8aedb4c2,0xf975efc4),LL(0x150dc348,0xb7126f5b),LL(0x8f316668,0x1826a434), LL(0x47b0020f,0x89a0a561),LL(0xddf906f1,0x7c814d16),LL(0x5cbe397c,0xae729976),
+ LL(0xac73b7b2,0x73507bd6),LL(0xd77d1311,0xdc109e64),LL(0xd07e0b84,0x40745a92), LL(0xeae6ea71,0x80a25d92),LL(0xdba1caf3,0x7d16cdaf),LL(0x178d162b,0x532678a1),
+ LL(0x89ce3929,0xf04f0f69),LL(0xfccffe8c,0x623a881a),LL(0xc3cc5b57,0xe35d518d), LL(0xd7cbfd70,0xcddb9b25),LL(0x517679db,0xcec3736a),LL(0x3964a183,0xff07c63c),
+ LL(0x1ee7af47,0xb6f1e8e5),LL(0x774114f6,0xdae8bedd),LL(0xe9b23727,0x7e40fd87), LL(0x4e0b09b4,0x677a0144),LL(0xecabbeea,0x37b376fb),LL(0x05a3a145,0x3d536296),
+ LL(0xf07be04d,0x0b60e86c),LL(0xb0f7efb6,0x72210de8),LL(0x44de2248,0xe661f7e3), LL(0x5e1a2e6a,0xa50972cd),LL(0xf3c16459,0x8ea7ea6c),LL(0x3d5cc6fa,0xce1eac26),
+ LL(0x3fb24e2e,0x12057921),LL(0xe703d891,0x2c6418a6),LL(0x85a84ce2,0xba1fdc36), LL(0xd7969f76,0x15c19ded),LL(0xce8a554f,0x0ef1f54f),LL(0x9dae18ed,0x45215796),
+ LL(0xea05050a,0xe4fb6484),LL(0x249b636e,0xf0ac280e),LL(0xa3b0a746,0x622dc53a), LL(0xc2c4b6e2,0xcbd0132e),LL(0x608cf966,0x71f38ed9),LL(0x47ac6ed1,0x733cdc1c),
+ LL(0xedbd5f2c,0xeec38461),LL(0xb053878a,0x02367abe),LL(0x366f0019,0xbc7279d2), LL(0x3917f0f2,0x383b04a6),LL(0xd170c6d6,0x7a5ac16b),LL(0x6e32c8f9,0x4f3c4a0e),
+ LL(0x0bd61a8f,0xcc2c1858),LL(0x34f527e4,0x87c8a389),LL(0xf23dc622,0x618a666d), LL(0x364108ca,0x40fecc5b),LL(0x98a0bf79,0x29742c4f),LL(0x272071ba,0x37d45180),
+ LL(0x685f2d3f,0x1625e4f4),LL(0x14c1f55c,0x3470dfe8),LL(0x44d91a5a,0x969f3ad2), LL(0x9f30454d,0x6a5be95e),LL(0x7281af65,0xed104a4e),LL(0x36d5ad8c,0xb23076ad),
+ LL(0x5eb808b3,0x4ed6c763),LL(0x60e8d7fb,0x70f86e24),LL(0xde84f30f,0x2b18c950), LL(0xfaf0ac4d,0x435aaafe),LL(0x3276078f,0x6f3e4e4e),LL(0xb8977a67,0xf3b9b7dc),
+ LL(0x3bcf4e15,0x28ef1bcf),LL(0x358303c9,0xbe939b53),LL(0x21a319d2,0x204114a7), LL(0xaa81d7a8,0x259ed8fa),LL(0x18fe7097,0x7d9a642b),LL(0x184765b8,0x9acf2e2a),
+ LL(0x9149e0ef,0x77900481),LL(0x8dfdc1e8,0x0ae5deb5),LL(0xd6f33c8e,0x23b0cfeb), LL(0xa26da632,0x9a6ca40b),LL(0xc537ce62,0x34b9c619),LL(0x5a4ec3f7,0xd37f4428),
+ LL(0xcbf87088,0x16d03a12),LL(0xb1c521c9,0x872be585),LL(0x1e8e4fc6,0xff44095d), LL(0x5c32815d,0xa7e6bc74),LL(0x8d3db724,0xdf3b021b),LL(0x101b1403,0x6b363726),
+ LL(0xbe2d31d8,0x4cceb610),LL(0xa171cad9,0x4b4a33ca),LL(0x37cd3a7d,0x8e335bfb), LL(0x5185da89,0xa4922968),LL(0x5914cb63,0x45f929dd),LL(0xa3aa3f6a,0x040366eb),
+ LL(0x2d373ab6,0x2ae211b1),LL(0x671cfd45,0x81bd0544),LL(0xcb962cdb,0x0c2e8457), LL(0x64ce8ebd,0x58fa7e29),LL(0xcdb6f3cd,0xfdc40b43),LL(0x1c69bac1,0x17d10e47),
+ LL(0x86421e7c,0x292c5ae4),LL(0x6758a6b1,0x32584cff),LL(0xaf7a9c3f,0x0288b16a), LL(0xeba67e24,0x03aadb8c),LL(0xc87df2d4,0x0f3e777b),LL(0xbb91d9ea,0x6ba2d690),
+ LL(0x404ff38f,0x4a5352c0),LL(0x5340d952,0x0f04982f),LL(0x2798c5c2,0xcfa86bde), LL(0x94dd1186,0x1ab8b19e),LL(0xccfd8af2,0x83ce68ee),LL(0x06cb2c1b,0xb6f99034),
+ LL(0x6ecd5c6a,0xadfb667e),LL(0x59a0fb16,0xb5401239),LL(0x5b9e22cb,0xe1100936), LL(0x21d0430d,0x34d54f0a),LL(0xa6197440,0xcb34b278),LL(0xc927d3c9,0x1c07cf85),
+ LL(0x31e24e54,0xa386ba5c),LL(0xa48e552b,0xdfa72d1c),LL(0x075794d0,0xcb7594cc), LL(0x0b3dc6ce,0xa52aceb3),LL(0xc6d190de,0x16c80954),LL(0x203a1303,0x7cd54e57),
+ LL(0xd5313dd9,0x72983edf),LL(0x4bf35d2e,0x7557de74),LL(0xfde38dd0,0x29719af0), LL(0x6838b644,0xe3ce6ea4),LL(0x39486a01,0x70976ef8),LL(0xb7d8d84d,0x7b16d6b6),
+ LL(0xc80b2253,0x44cffea0),LL(0x53e978f5,0x39b12203),LL(0x76e654ca,0x6efe5c6c), LL(0xf5ecd362,0x9ce55175),LL(0x32904094,0x945bc283),LL(0x419b4c47,0x16be694e),
+ LL(0xb25ff2d8,0xc6d695b8),LL(0xfbc1c346,0x95848769),LL(0xf78df5b6,0x4cd68253), LL(0x07a395a6,0x366208a9),LL(0xb300e26e,0x6a100464),LL(0x2c4c9774,0xcd75f9ef),
+ LL(0x58587dee,0xa6dde508),LL(0xaba27af9,0x1fb5756e),LL(0x2435fdfc,0x886588cb), LL(0xafa3a40b,0x8836939e),LL(0x23550a04,0x8e4ea6e4),LL(0x13129070,0x1f60a305),
+ LL(0xafd87664,0xcd87217f),LL(0x62eaab37,0x33999750),LL(0x63e77715,0xc5c71386), LL(0xadc2dc58,0x8f7ec765),LL(0x06ec10e5,0x0166d81b),LL(0x4bab2eec,0xd978b136),
+ LL(0xabc9d990,0x518d8792),LL(0x848bc38a,0xb5e9214e),LL(0x890c38ca,0xbc62bb10), LL(0xa5d74a39,0x24395eb5),LL(0xe81ca0ef,0xbaacb032),LL(0xf968482f,0xaa7d10d1),
+ LL(0x3c8d1134,0x55fb3866),LL(0xc866fb41,0x2f0c11d9),LL(0x60d9da04,0x470f0d0c), LL(0x30199fda,0x2ce76abb),LL(0xf1754859,0x68239b6e),LL(0x36c8db28,0xabcbfa61),
+ LL(0x15fd8cdd,0x59bc69c7),LL(0x7dc71686,0x8c35acbe),LL(0xdf56f4b5,0xa864fdf4), LL(0x73cb6096,0x7b019a3f),LL(0x6d0212a9,0x9bec6ec0),LL(0xd403dbf3,0x96f43d54),
+ LL(0x25f69dd1,0x1f8ef8de),LL(0xd4c811f4,0x01ea5842),LL(0x7bd1206b,0x6b00713a), LL(0xc77c3c64,0xcc267e59),LL(0xe68a4f20,0x788a8c0d),LL(0xf4b3c37a,0x968e777b),
+ LL(0xf39053e8,0xef230e41),LL(0x7839732e,0x3acdd9f9),LL(0x815c2a4c,0xa80f263e), LL(0x544f6fe5,0x20c61e68),LL(0x2c146750,0xd0a8228e),LL(0x4770e4ae,0x30857c49),
+ LL(0x42a4aa18,0xcba4107a),LL(0x68f36209,0xe72e3f7e),LL(0xf0a19740,0x42a02b75), LL(0x9946daf5,0xd4783068),LL(0x862f2de7,0xc01f64b0),LL(0x6209f44c,0xf00cfcca),
+ LL(0x7beb13fe,0x69d1c1f7),LL(0xfa01681f,0xf547c381),LL(0xfe808e67,0xe7fbdc0a), LL(0xc9b56b2e,0xa0fe9ead),LL(0xb2682ce9,0x1c53a580),LL(0x556a1034,0xe6cae9a2),
+ LL(0x7ff5d034,0xf4497140),LL(0xd0b40f9d,0x95b5f6f9),LL(0xc68600e2,0xec27b942), LL(0xdbb02501,0xd8f6e734),LL(0xf3ced49b,0x1e62a674),LL(0xd9620b28,0xd64cb872),
+ LL(0x418878cc,0x4506163a),LL(0xa5575e5a,0x96d1754d),LL(0x9a25f013,0xbf853bbe), LL(0x03c3aa89,0xfd8c5194),LL(0x14a549d4,0x0eb1954d),LL(0x0dbe140e,0xa88b972e),
+ LL(0x476facb7,0x5b45ac78),LL(0xcb7dbe77,0x8dc145b4),LL(0x4e47ee7a,0x0dd76bfc), LL(0xc1569361,0x06f554cf),LL(0xf665649a,0xbd841afa),LL(0x6e9773f4,0xe27421d7),
+ LL(0xe76c5baf,0x65ee7fbc),LL(0xb8dfe92d,0x6ddd2b14),LL(0xda22cc76,0xb9f4b2b4), LL(0xd9c02353,0x36ffd8da),LL(0xb62c010e,0xc23f7f57),LL(0x3308d355,0x00c51af6),
+ LL(0xa8fb84f5,0x7cdc4353),LL(0xbd3b9efa,0x431a25d9),LL(0xe921fd8b,0xe357451e), LL(0xa7d0d22c,0x3607231e),LL(0x7ebf0d0b,0xd8d0370f),LL(0xc5ac6f7c,0xfdbb3c4f),
+ LL(0xc826f1d9,0xfaa73e4f),LL(0x3e954cb4,0x95f6b20c),LL(0xc5935901,0x56f618ef), LL(0xc1141c9f,0x3a55c846),LL(0x27edf041,0xbc5bd1dc),LL(0x0e373045,0x51933533),
+ LL(0xb5f4dca2,0xacf42b35),LL(0x7eac22dd,0x0eedba21),LL(0x75502f43,0x2945fad0), LL(0x04c50653,0x94995ef4),LL(0x373f4e93,0x7992d051),LL(0x1b1c94b7,0x8a7c3436),
+ LL(0xaa607973,0xe636537b),LL(0x4e2f86bb,0x1c845ea2),LL(0x81f6999a,0x99f38921), LL(0xfed9173e,0xc1716d20),LL(0x1e801b36,0x792b9ffc),LL(0xca8f7a6b,0x06765f7d),
+ LL(0x79b19761,0xc6771baa),LL(0x29433d11,0x80d67617),LL(0x6b423d37,0x196fe0e0), LL(0x47bec8f6,0xe752e3bd),LL(0x52fbbe1c,0xd63ec3fc),LL(0x2ebe6309,0x30d727b9),
+ LL(0x1d17b14e,0xd9f486d8),LL(0x6761b05a,0x47c47d53),LL(0x7041158f,0xdf1f5e86), LL(0xac78e6bd,0x626756b3),LL(0xd777224d,0x01aedca6),LL(0x4a443a1f,0x025d3c43),
+ LL(0x5634214b,0xa12d740e),LL(0x375af247,0x4bc99161),LL(0xbe3e2882,0x346bf9f0), LL(0x4211297b,0xdad14a72),LL(0x1c532542,0x6554266b),LL(0x15d18e75,0x030daf54),
+ LL(0x51583335,0x7cdc99eb),LL(0x4e821ee0,0xd2239bce),LL(0xb41ded13,0x8974b1a0), LL(0xfe676f40,0x17dcd329),LL(0x9d22a9f9,0xc3253117),LL(0x36c57e47,0xdd5a6256),
+ LL(0xeb7827f5,0x04fcaeb7),LL(0x97baafab,0xcbba55a8),LL(0xd29a034b,0xccd2a2c8), LL(0x34045d21,0x37a19e21),LL(0x20ebeb66,0x1319ad06),LL(0xaa2041fe,0xfed9eef7),
+ LL(0x5ef2c6ce,0xa3fa82ba),LL(0x60524b3f,0x764801ce),LL(0x714ec445,0xdcc5c27d), LL(0x885e5fc2,0x5cdbaa30),LL(0xc779e89b,0x0aa6c9a8),LL(0xb797f8a8,0x9db3b836),
+ LL(0xa3ddb5c8,0x8c8b5a06),LL(0xc17aa963,0x1904c79d),LL(0x4a40b438,0xd6e2cd45), LL(0xa689e7d5,0x90b1ed27),LL(0x3f834964,0x350a4374),LL(0x1d9e5301,0x4c0cbe62),
+ LL(0x193559c9,0x9959ff0e),LL(0x3a77311c,0x0a6908c4),LL(0x714d000c,0x93d61072), LL(0xe471b9f7,0xc054c8c1),LL(0xfb602066,0x78534fd5),LL(0x614fcf16,0x9a5f7b8b),
+ LL(0xc459f1a8,0xd1d42f2a),LL(0xb574b235,0x9403a4ae),LL(0x42ef8a7f,0x1335a414), LL(0x6a4e1b79,0x4eb9a067),LL(0xd7a319db,0x90dd6eca),LL(0x8cfa5579,0xd54bf9e1),
+ LL(0x72331044,0x063b4a7e),LL(0xc4e13d1e,0xb82357d4),LL(0x38e9b37d,0xfb4981b7), LL(0xee950c17,0x0c64d898),LL(0xa553cc9d,0x16ac1d7c),LL(0x6e7d9643,0x27624002),
+ LL(0x62dc7931,0x70e5badb),LL(0x3d4149b7,0x92048bb3),LL(0x626d709c,0xa45d15d5), LL(0xe83bc3f4,0xc1e9c751),LL(0x07a26fe9,0x35bb7bd8),LL(0xb8fee30d,0x2713c9e1),
+ LL(0xc4895195,0xb26a41dd),LL(0xbec62d17,0x3695b237),LL(0x5bd95196,0x272d55e9), LL(0x89b5e05f,0xcb659d58),LL(0xa5687e17,0xcba46e22),LL(0x623cf306,0x2ece876a),
+},
+/* digit=22 base_pwr=2^154 */
+{
+ LL(0xce363c03,0xd16b25a3),LL(0x69b561cd,0xe21621f4),LL(0xabf845bf,0x03a8e393), LL(0x45c545c4,0xf68a5989),LL(0x492c1276,0x0d669f1b),LL(0x239a2436,0x762cdc78),
+ LL(0x4e33515c,0x32e5a4ad),LL(0x107349fc,0xfaf120c4),LL(0x42b588b2,0x18f529a5), LL(0xad41f013,0x53afbf6a),LL(0xfce98199,0x7e107d23),LL(0x49fc022a,0xb3e6ca6e),
+ LL(0xf43c63d0,0x2f0fa15f),LL(0x3c5f1062,0x2ee7972b),LL(0x1251d981,0x217bc709), LL(0x4f44f67b,0x869cc500),LL(0x6e74d49a,0x410ce8d8),LL(0x295b72ee,0xa2668d2e),
+ LL(0xc2e1ab9c,0x377d1c96),LL(0xf02f335e,0xc4d44912),LL(0x17483b67,0x91a1b453), LL(0x0a35ed35,0xd87bfb05),LL(0x06388074,0xda51aa7f),LL(0x3bc985d2,0xe8eded68),
+ LL(0x62093566,0x53a65438),LL(0xd40d4ada,0x1a184bde),LL(0xb1ce835f,0xcf398a06), LL(0x2e3db6b2,0x3e0368f2),LL(0x768efcf7,0x5b1e672f),LL(0xce1191fc,0xcde23025),
+ LL(0x1965b94c,0x7d18a84c),LL(0x42798e4d,0xa92514b7),LL(0xffa944d6,0x6df7a966), LL(0xc415a2b6,0x7c9cf75d),LL(0x0048e5ed,0xac0c7c55),LL(0xe02f7dae,0xd5c826e6),
+ LL(0xf728251a,0xee934c6f),LL(0xbd48f9f8,0xb7ec512a),LL(0x2ec83189,0xc5f704a8), LL(0xed82fce0,0x3c184301),LL(0x378c8f4d,0x8cbc0d6f),LL(0xa97c2ab3,0xc0ff9d1b),
+ LL(0xd18c264e,0xa6c6c290),LL(0x768df841,0xe5061160),LL(0x519df852,0x7913aaad), LL(0xf67253ef,0x61958563),LL(0xd45ffadd,0x36c367f5),LL(0x9e16d8cd,0xf1b45f01),
+ LL(0xec831ea0,0x3d1cecd3),LL(0xfa15690f,0x2bde5c72),LL(0x38b353ee,0xba0efaa9), LL(0xe8d4b6ee,0x15f17a68),LL(0x954159dd,0x9699e58a),LL(0xe8f17b7a,0x819578f2),
+ LL(0x61ee7443,0xc7eeaf29),LL(0x1b16a9dd,0xfa9c2747),LL(0x45e6c8f4,0xf723daa8), LL(0x80e39749,0x2c263cb4),LL(0xe1796ef8,0x69b29a11),LL(0x41cf69fe,0x71b39ec0),
+ LL(0xc93aacf4,0x277c0653),LL(0x90aa54e4,0xe7cedf79),LL(0xfbb3e9e4,0x5f3dacd8), LL(0xd0335cd7,0xebf8b3d2),LL(0x54b9f51a,0x320526dc),LL(0xda07d715,0x670feaee),
+ LL(0xc815957e,0xed31303c),LL(0x9dc47dbd,0xe3fd01ce),LL(0x7796d887,0x69884abe), LL(0x91801969,0x5eeac021),LL(0x1fede637,0x3f7f3b0a),LL(0xb577b6b1,0x94177a5d),
+ LL(0xeab50a36,0xffccab96),LL(0xc61d85f9,0x0d130c6e),LL(0x7da399fb,0xef804dc2), LL(0xa18f07c8,0x24faa196),LL(0x04fcf0bf,0x64bb949f),LL(0xd5aeb209,0xb1fcfc87),
+ LL(0x32651bcd,0xf00f320d),LL(0x06c32d6c,0x9df50f13),LL(0x5f7039a8,0xe5521172), LL(0x637e1a26,0x1ea8cc96),LL(0xe1edd4f0,0x2b163456),LL(0x0a1c1b35,0xf5bf574c),
+ LL(0xe6a6c9d7,0xd11076c0),LL(0x892f314b,0xc2f5ad9a),LL(0x5737733a,0x1ce795fb), LL(0x7ff3d547,0x2ea960a2),LL(0x1b76089a,0x44189130),LL(0xa3a6506c,0x6ef7149a),
+ LL(0x1032f79c,0x5903c244),LL(0xdcc0e2de,0xf21d72a3),LL(0x1762ce11,0x9ba803fb), LL(0xca5ae539,0x76e31b74),LL(0x9fd4f343,0x4e502c66),LL(0xd2eaa2ab,0xb6a9a1fc),
+ LL(0x073efd81,0x5888451f),LL(0x9927bf88,0x398711b5),LL(0x018be818,0xbb190a8b), LL(0x79e61240,0xc797d10a),LL(0x3beaa53f,0x8696dba6),LL(0xcfb7766d,0xb542db1a),
+ LL(0xd903933d,0x6f4e1530),LL(0xcd7c2795,0x12359176),LL(0x5a5fca32,0x755f299a), LL(0xc4a38b20,0xd72339f0),LL(0x842195c0,0x375cc0c0),LL(0x30d23f6c,0xbc55da2b),
+ LL(0x9aac817d,0xce0ba5f7),LL(0xa1a45388,0x3b669115),LL(0xf409cf17,0x1dedbc8b), LL(0x3ffa552b,0x31a461a0),LL(0x382ba937,0x86758b16),LL(0x795dc73f,0x4a479210),
+ LL(0x48aba8e6,0x83c44b08),LL(0x62517119,0x17c26d0a),LL(0xd01e1f9d,0x5b018ac9), LL(0xe9efcfe5,0x4397fd63),LL(0xfe0829a3,0xca651042),LL(0x13eb60a0,0x46cee0c3),
+ LL(0x8600caea,0x27529486),LL(0x35717139,0xd38810c6),LL(0x41461bde,0x63178e7e), LL(0x045c484c,0x227b3172),LL(0x97348e92,0xbcfee10d),LL(0xa51d3833,0x3fde1f78),
+ LL(0xf10b4b60,0x50b3debe),LL(0xa5ad595f,0x7901e0b9),LL(0x47e58c1f,0x87df2160), LL(0xfa209201,0xad4fd6ef),LL(0xa55d0556,0x9335bbb9),LL(0x00fee680,0xe8d815f3),
+ LL(0xd99bdf5c,0x3e3ecfe1),LL(0x9bc2df7b,0xcf690949),LL(0x102d61ba,0x7e6008b1), LL(0xe00329c7,0xc1283828),LL(0xeb7b35fd,0x5b105f4e),LL(0x3dcb3985,0x9509ed61),
+ LL(0x81c63288,0x045a1445),LL(0x76cc9ac1,0xa4e7b140),LL(0x48acdd5e,0xa2f07d10), LL(0xa2b81e15,0x90c45e5f),LL(0x308acd63,0xa933ffa1),LL(0xd7e46f9d,0x17365897),
+ LL(0x466f886f,0x8852a2bf),LL(0x4d14f3d8,0x4ace368b),LL(0xe440d441,0x8d94e2a7), LL(0x72866999,0xfcb3c915),LL(0x1b47c102,0x9760bf19),LL(0xe720c285,0x6611674e),
+ LL(0x11d915d4,0xdcb98a2d),LL(0x6beac9be,0xf990fa0f),LL(0x6dd7048a,0x681bfe50), LL(0x689f0ae5,0xb41ece47),LL(0x44ff0641,0xe6fdbd83),LL(0x0e9753dd,0x42e0fbcc),
+ LL(0x3ffa710c,0xc7877d3d),LL(0x9919eb3c,0x7f0c21c6),LL(0x290c9014,0xc85786a5), LL(0x5689cb11,0x093aae39),LL(0xb5d01c9f,0xfb777943),LL(0x8cebd9c1,0x319aaf33),
+ LL(0x1a2fd277,0x902b0342),LL(0x9af2dbda,0x0912afff),LL(0x48589a78,0x15e0d236), LL(0x1fa3327f,0xf8b35812),LL(0xec713d1d,0x8990816e),LL(0x8e343f2d,0x5e1a860b),
+ LL(0x3614d67e,0xf61322f7),LL(0x29935fae,0x4d6b23b9),LL(0xf4a58207,0x5c8bdcc6), LL(0x9265fa5c,0x750d615a),LL(0x40ca78a9,0x2022ff1f),LL(0x19732ba7,0xd9585db6),
+ LL(0xf29d3bbc,0x694abdf0),LL(0x24a568a9,0x03a757fe),LL(0xeb85bcf9,0x69e64a5f), LL(0x3a6d438e,0x11c2527c),LL(0xe22585b6,0x4aa39cb8),LL(0x20f51f14,0x696f234b),
+ LL(0xcd374897,0x796f3388),LL(0x747f55ca,0x9cae05cb),LL(0xc3244db7,0x0178bf8f), LL(0xcad92264,0x2cf6b0b2),LL(0xd9851a5c,0xa5eaffed),LL(0xe5613e1a,0x677ef509),
+ LL(0xb8a7827b,0xd774ccd5),LL(0x30c2fdb5,0x1a9035d8),LL(0x634655f8,0xeed95b80), LL(0x56b0b0bc,0xc2b700c0),LL(0xc9f0aa76,0x37259c87),LL(0x4c9ae4a6,0x7f6b6b1a),
+ LL(0xf72a765b,0x23bfe902),LL(0x838d2dcf,0xf220ca7d),LL(0xfa8c5fe9,0x6aa1a258), LL(0xdd1fbec2,0x80a3ac57),LL(0xbfd1c7fa,0xa9d70cd6),LL(0x997ee6ac,0x6c5953bc),
+ LL(0x6a40f84b,0x3b3747a2),LL(0xb83105a1,0xfd1a969b),LL(0xbbcb761d,0x3c5c4b12), LL(0xda6bebae,0x7c7f4e65),LL(0xa14f1495,0x7a4fdbf2),LL(0x49b37a93,0x7f59536b),
+ LL(0x3240d78b,0x0c50a5f1),LL(0xb32a0cce,0xb51ad026),LL(0x53101002,0x4ccf9cdb), LL(0x0073f0a9,0x2fa22f3b),LL(0xbd1d7831,0x3a7fe366),LL(0x740322c6,0x5f31b6ce),
+ LL(0x013aca29,0x5cbc9486),LL(0xe542ffae,0x03e60edc),LL(0x8457faa5,0x80539a8f), LL(0x6355b3b2,0xeba394b1),LL(0x2249fcd3,0x0bd1b305),LL(0x4e3f192b,0x5454e867),
+ LL(0x4416b978,0x78e9316d),LL(0x81c4173a,0xf2a15f86),LL(0xb6731547,0xa6971d20), LL(0x98dbfdb5,0x2c5b69c5),LL(0xfeac68cc,0xf7b1130c),LL(0x0e84299e,0xb1cbec33),
+ LL(0xc44d578e,0xb354773a),LL(0x712087f3,0xcc55ac98),LL(0xba9554a8,0xd9b75e7a), LL(0xe80e95c0,0x93eb6a79),LL(0x99fb7e95,0x667e67eb),LL(0x14b32858,0x105a22cd),
+ LL(0x6f70ee86,0x0ded3bd7),LL(0xc1a43b13,0x7e0e5a6c),LL(0xc41e1afa,0x893c3ede), LL(0xeaed250c,0x21e88f45),LL(0x93d3ef9c,0x2cfc36f3),LL(0x7da31990,0x5b4e1c71),
+ LL(0xc4126c1f,0x1b61be56),LL(0x5abc20ba,0x274763f8),LL(0xed1afb78,0xb49d2c4d), LL(0x3df52e62,0x1bdeb4ea),LL(0xfff32461,0x8dcdd1d1),LL(0xbb1ca9df,0xe3e523f7),
+ LL(0x809ca4e9,0x4672ae1d),LL(0xdde4d528,0x58d55485),LL(0x8b74e2f5,0x19428043), LL(0x203314f7,0x1745d62a),LL(0xd4c37bee,0x6157bba4),LL(0x7dd72c9f,0x49805c53),
+ LL(0xa37d788c,0xca78b3b0),LL(0xf475a121,0x17a44e3f),LL(0x1ad2fff6,0xe5c1c959), LL(0x70139e2b,0xd0312c1e),LL(0x8b27ca8c,0x6724a7cc),LL(0xd962035e,0xaf28caf8),
+ LL(0x9570d848,0xbcc2ea7f),LL(0x7f265e1e,0x05fc9759),LL(0x244ce79b,0xb4954372), LL(0x084d1046,0x164e75ef),LL(0x89adc16e,0x4defb358),LL(0xfa4dc623,0x550e503a),
+ LL(0x5564a17f,0x370b2b55),LL(0x55a566cf,0xe074512c),LL(0x78ab0d7a,0x110463ca), LL(0x5d2460f6,0xefd6c296),LL(0x9c33b5d1,0x9abe3d42),LL(0x08c3f981,0x4e016175),
+ LL(0xc21b36dc,0xbf03ca84),LL(0x0b8c07f1,0xf34003bf),LL(0x63eb0039,0xc537b09e), LL(0xb82887e2,0xcacbf643),LL(0xbd3bdbf4,0x9d053615),LL(0x61dda14a,0x5c36ffc2),
+ LL(0x528c2064,0xe1664301),LL(0xbcae3cc1,0x2e16357e),LL(0x52311eed,0x025d8360), LL(0x2f0a83b4,0x76f15854),LL(0x06dc8ff7,0x10d87d9e),LL(0xf989d477,0xaded98a6),
+ LL(0xa52127c0,0x3ed6c171),LL(0xa69dee80,0x0847d132),LL(0xd8445a15,0xb2e7e29f), LL(0x71f974e1,0x156e4663),LL(0xe5bd0273,0xd7512685),LL(0xc73100df,0x6f515794),
+ LL(0xc2ab5306,0x951131c1),LL(0x6c73f4f5,0x89255bf9),LL(0xe69b21c9,0x6ac84582), LL(0x0ab9dce0,0x018b49af),LL(0x7954a835,0x27e5b722),LL(0xb1229414,0x865a648f),
+ LL(0xc8dd070b,0x388cdc70),LL(0xf52522ad,0x75642aeb),LL(0xcc49bc29,0xe25ec387), LL(0x41ee6cb0,0x214f62c1),LL(0x041d74c3,0xc5ee3195),LL(0x449dbc9b,0x04d43b7f),
+ LL(0xc7e8f6b2,0xb3a64235),LL(0x323a93a3,0xeeb2edcd),LL(0x4938cf75,0x67e22e11), LL(0xa914b04d,0xd64b0693),LL(0x88b818df,0x688fa54c),LL(0x591d0c01,0xd481be4f),
+ LL(0xcf3d8ba4,0xaecd7d60),LL(0xa97c0b6b,0xc7a415c8),LL(0xeebbc7e4,0x3839dd69), LL(0xe2ff8cc5,0x0691d0ee),LL(0xe92d7a4a,0x0c253257),LL(0x36ca20eb,0x740e2dd7),
+ LL(0x2a1939f7,0x5d07cf91),LL(0x5cf3ecae,0x3f6c26a8),LL(0xcb547d04,0x92001c06), LL(0xdf774ad1,0x4175ff52),LL(0x6b5f9c2c,0x7abd12ff),LL(0x4d6d8453,0x1658d69d),
+ LL(0x40729414,0xcd926583),LL(0x8ebcd09c,0x8a3d6ad5),LL(0x95dc70c7,0x83f72907), LL(0xb5be9edc,0x200031c9),LL(0xd05c8986,0x472b56e6),LL(0x07e0faca,0x9899422b),
+ LL(0xf88b02ea,0xd7bf0be1),LL(0x9bffc69c,0xb622e02a),LL(0xbc6df9ca,0x1e5b8cb4), LL(0x350dfef3,0x048f54ec),LL(0x0a312a13,0xe1f864f8),LL(0xd6ca4ce3,0xd4bfba4d),
+ LL(0xb0c052cf,0xc3ff21f8),LL(0xfdfba872,0x19f1a2b6),LL(0x5b694edc,0xd6f10827), LL(0x68a8a596,0x6097aff6),LL(0x954b1904,0x518e1cd2),LL(0x7c51ccd6,0xfd80ae29),
+ LL(0x1a7e9066,0xbc7a7b59),LL(0x23db5c12,0xcce91b75),LL(0xa3c0a935,0xba7bf0ae), LL(0xda23595c,0x653f64a6),LL(0x08f45389,0x2ae29a0f),LL(0x88589fca,0x724f46cd),
+ LL(0x3372c3ee,0x45b34ad7),LL(0x985555fa,0x0f609319),LL(0x9f3dcb8f,0x7fd63b9f), LL(0x0bd28eba,0x13a518c5),LL(0xf5706481,0x57cffe62),LL(0xd032721f,0x11718aca),
+ LL(0x9dd7bfaa,0x32ef81d0),LL(0x7adeeac3,0x3ed2d217),LL(0x6157a51e,0xac2de8bf), LL(0x4d16615b,0x7a7ca0e7),LL(0x217f0fad,0x5bdd6a51),LL(0x099a123e,0xae2064e5),
+ LL(0x6f3b0a4c,0xd8eb2d51),LL(0x59883368,0x556551c4),LL(0x5f48ad2f,0x6c8195a1), LL(0x62de8d83,0x0a88379b),LL(0xd0b6ecc9,0xaaa811b2),LL(0x83c9d046,0xba49bf0f),
+ LL(0xe6eed978,0x11f53192),LL(0x41560616,0x0cdd4a81),LL(0x55689932,0x106a49de), LL(0xa791e389,0x79fdb67e),LL(0xe28a67d9,0xba7af653),LL(0xc7aa61e7,0x44db5d83),
+ LL(0xfee81242,0xe86f2877),LL(0xe05b4568,0x1ebfa60c),LL(0x66c639bb,0x6131750f), LL(0x3da39228,0x2f9b4000),LL(0xb25c8ded,0x8e37e3c0),LL(0xaa3c48d1,0x8c3858ea),
+ LL(0x37de8469,0x98bf7c76),LL(0x9d051f00,0xd78e0afb),LL(0xc71691e0,0x4553e903), LL(0x539040a0,0x807d903d),LL(0xf73fcb62,0x30fdeee9),LL(0xcc1519f0,0x9c01a657),
+ LL(0x0b7f4996,0xc5c73b26),LL(0x50750843,0x2ca19471),LL(0x5a92f717,0xe4d8d372), LL(0x4abe9028,0x832ebb12),LL(0xe09a7f03,0x7f0123dd),LL(0xe8c1d6a0,0xa8456dbc),
+ LL(0x28302bb6,0xc8639947),LL(0x037bebfc,0x1fc1410a),LL(0x9f0b40a6,0x7432946a), LL(0xe06af4e8,0xff9565e1),LL(0x8b9882d9,0x02d05ead),LL(0x13e179cd,0x6e5ca86c),
+},
+/* digit=23 base_pwr=2^161 */
+{
+ LL(0x4584bdf6,0x5fd3ebe9),LL(0x847693d1,0xd8a4299d),LL(0x40b5d01a,0xc9c0c5d6), LL(0x3afa9eda,0x70b51263),LL(0x805fb55b,0xde94920e),LL(0xb5a46cc6,0xf0c432e1),
+ LL(0xf6dcaedc,0x0ce0859d),LL(0x3a3f7708,0xa55b2e15),LL(0xc0a8b787,0x200ce3fc), LL(0x3c7bddae,0x9e0f9782),LL(0x0b81aa87,0xe9d43e19),LL(0x4666b8f8,0x9c47c1bb),
+ LL(0x228ed42e,0xa9c19cef),LL(0xc0249ead,0x22c955e1),LL(0x264c2cb1,0x40d5d287), LL(0xa4070d06,0x420e5723),LL(0xc0604717,0xc2a3bf15),LL(0x4a963f1c,0x7ab3da61),
+ LL(0xda80e5fc,0x739b4f37),LL(0xcf587883,0xb45a6fe6),LL(0xcadd521f,0xe4a9b791), LL(0x57562a1c,0x27e1b300),LL(0x2fd0f712,0xb04af2a5),LL(0x93409099,0x12cd55e1),
+ LL(0xad7c2bed,0xe518dc8f),LL(0x65eedead,0x52acef20),LL(0xb2efa9d0,0x4227e093), LL(0x99c38a81,0x8b7ca42d),LL(0x4c509cec,0x30c1a73e),LL(0x51635a28,0x3dc9300c),
+ LL(0x46be452b,0x92d5ea3d),LL(0x215ba744,0x40841923),LL(0x9930df86,0xd8335b49), LL(0x92c4868b,0x12da53b2),LL(0x60a4383f,0x2400365b),LL(0xe190b71c,0x646771ed),
+ LL(0xf14687de,0x30e142c5),LL(0x9403fa68,0xad298203),LL(0x2c2dd3e0,0x3e98cfd3), LL(0x5bd48575,0xe2426602),LL(0xc9d41416,0xc7a5a2b7),LL(0x4ade8bbf,0xdcaa3d31),
+ LL(0x5f6b0fff,0xb8792b08),LL(0xfac1431d,0x17e00f0f),LL(0x479b79be,0xcb5f6f9f), LL(0x32c49e8c,0xbfecbd08),LL(0x654100b0,0x6a6be7f1),LL(0x0890c3b8,0x2e545747),
+ LL(0xb07447fd,0xa559c912),LL(0x56728d8c,0xb33a2b44),LL(0xf526bd48,0xa027ee4c), LL(0xc58f6af2,0x12d8001f),LL(0x374fa755,0x79e6db7c),LL(0xf25a1455,0x2cbc98cc),
+ LL(0xd10a0b59,0x597f4f1e),LL(0x84bc0000,0xe166c79f),LL(0xf74bc520,0x5ae7890a), LL(0x8660d37d,0x3303f3aa),LL(0x405c0955,0x2d0ab6f5),LL(0x1f6fea86,0xe98a1550),
+ LL(0xb1fec6f3,0x58dac0ba),LL(0x0018597d,0xc24ea4df),LL(0xebe0dd78,0x9ec12302), LL(0x2bec23bd,0xfa749d3c),LL(0xd47a29a6,0x91a607e5),LL(0x273be752,0xb0e81d66),
+ LL(0xb3a95f3e,0x6975c26e),LL(0x1d7290dd,0xcb4ee68d),LL(0x4c6ba170,0x8120bbe9), LL(0x1a407679,0xf428065b),LL(0xc12ea429,0x92b64255),LL(0x56d99374,0xc94c96d3),
+ LL(0x0103f0e7,0x1bd6a47d),LL(0x1affc26a,0xce0f3821),LL(0x1b702d5d,0x284426b0), LL(0xc65050e4,0xe5ba26be),LL(0x77a391dd,0x29e14db3),LL(0x8ee16508,0xb917678f),
+ LL(0x0ddf3f74,0x18c4fe3a),LL(0xd8e5db90,0x477e39cb),LL(0x56614560,0xaf43028b), LL(0x8c492bee,0xffdf3688),LL(0xac548919,0x595987ef),LL(0x74dc2b98,0x4d0d250a),
+ LL(0x3c574a92,0x25fa0aa2),LL(0xfaa1a418,0x89be8ba2),LL(0xb69739a1,0x1b002c0d), LL(0xe3f5b3a7,0xa6b854ef),LL(0x1204504d,0xcaa17499),LL(0xa58cedd3,0xad836998),
+ LL(0xc4d5d262,0x3cddb768),LL(0x4251792d,0x0a0801ad),LL(0x0d3897eb,0xd704ec49), LL(0x9c91baee,0x0e13d4f4),LL(0x82831726,0x090f2c69),LL(0x76422a7f,0x829b8edd),
+ LL(0x49398523,0xe83170b2),LL(0x1b62a533,0x253100b2),LL(0x5e36efc0,0xc18431d0), LL(0xc4c34823,0x26325714),LL(0x628d7b24,0x74c3cfd0),LL(0x9d919045,0xa961e996),
+ LL(0x41d95f75,0xe3a642ca),LL(0xf0a8d5c1,0x4c53ea80),LL(0xa9d3eedc,0x07463073), LL(0xc4e66d00,0xa1439f9e),LL(0xb0694462,0x451a25c4),LL(0x8dfe8fe6,0x713bf4e8),
+ LL(0xc9e24326,0xae9ef904),LL(0xe8bfd9ba,0xe039837f),LL(0x59511a8e,0xaca967be), LL(0x7acac091,0xd2386b22),LL(0xe9d27517,0x63bdb595),LL(0xce41bbd3,0x51f95292),
+ LL(0x9ec42924,0xee0ee680),LL(0xb77fdef0,0x4af753cb),LL(0x7cb4d8a9,0x15078aba), LL(0xb4177c3e,0xe19806b9),LL(0x88f090af,0x3e1d4fc5),LL(0xeeb90099,0xc7b2cc43),
+ LL(0xae6a6f66,0x24b3ffd7),LL(0x308cc05f,0xab2000ed),LL(0x107b362e,0xd89d6e75), LL(0x1fa91ce6,0x835736db),LL(0x390c487c,0x6429da58),LL(0x0d312fc5,0xbaed5289),
+ LL(0x4a018455,0x0feb44af),LL(0xad578332,0x1af273ce),LL(0x5f625cc3,0x31349adb), LL(0x2d2f3877,0x3848e62e),LL(0x1bfe8dd6,0x620372c5),LL(0x16c9a24e,0xbcc4d459),
+ LL(0x0a45de42,0x40c8630c),LL(0x30cc053a,0x74488edb),LL(0x119b7194,0x9cdb7fad), LL(0xd629e05d,0x02121283),LL(0xfa4bbe6d,0x727585f8),LL(0xea1f9677,0xc2a6e653),
+ LL(0xbc14220c,0x4656ea75),LL(0x00b087d6,0xc70a76ac),LL(0x3d83a9ec,0x037ac35f), LL(0xaac1649a,0xf8f1e014),LL(0x4c5f804f,0xaa6de597),LL(0x7d523732,0x8cd45ec3),
+ LL(0xa04c2d63,0x4540fa7b),LL(0x9eb857a9,0x544d7dec),LL(0xe8f40c8a,0x8ada66ad), LL(0x4598d9e3,0xb8c4fa18),LL(0x516e5110,0xd3ef8a28),LL(0xd56843a4,0xb761d4d5),
+ LL(0x91f59c5b,0x0aed399e),LL(0x43f5de7f,0xe4868fd3),LL(0xe58c53b6,0x01b524d0), LL(0x712c183e,0x77219f8f),LL(0x036dd938,0x6371e9d4),LL(0xa8cc4985,0xd4de675a),
+ LL(0xc894130a,0x7da252c3),LL(0x85384ea0,0x9e4041cc),LL(0xeba418c6,0xd0a69993), LL(0xaf043892,0x9a9ebb66),LL(0xc703f8bc,0x9baa32db),LL(0x0bf6fcfd,0xc250e1c4),
+ LL(0xf56a38f1,0x5913cd6a),LL(0x61ecfa22,0x1e16a4f0),LL(0xb5c22ada,0xeb036c2e), LL(0x95892d2d,0xca1a39c5),LL(0xd31c9856,0x4688a1cc),LL(0x29e69ad8,0x3a6ea062),
+ LL(0xda5d2bab,0x283f3d5c),LL(0xa82a537d,0xc4f0d483),LL(0x81e8516a,0x953f037a), LL(0x5a8f3330,0x6bf902cd),LL(0x9216e842,0xda96e730),LL(0xd1f1d62f,0xa8ca4ed6),
+ LL(0x50bbcd76,0xd9521c88),LL(0x5533084d,0x3d8ab30a),LL(0x40a22bb5,0x4328e72f), LL(0x680fccc1,0x6594e079),LL(0xbd6afc46,0xc578705e),LL(0x724db349,0x677a7e9e),
+ LL(0x77b5d2f3,0x376f9327),LL(0xc9b18afe,0x87bd1401),LL(0x7395cc2c,0x8f06b3fb), LL(0x0f11a8a7,0x5d2d7a7c),LL(0xa3a0d64e,0x84cc49c1),LL(0xf720e6f2,0x0b5a5743),
+ LL(0x80df0a37,0xaeedece7),LL(0x9fa00fed,0x78b407d3),LL(0xfb5d3331,0x8ada177e), LL(0x8af3669a,0xa526660c),LL(0x26f37f61,0x95b36f2f),LL(0x1e1206f2,0x21aeaae2),
+ LL(0xade1a30f,0x0fbc3955),LL(0x70682b66,0x27c9b059),LL(0x2bfa453b,0x2fce5ba7), LL(0x1316e4e1,0xc90c4a00),LL(0x761c39fd,0xd6355b7b),LL(0x2532c4da,0xf0e4ff59),
+ LL(0xd62425cc,0xa9d571ca),LL(0x842bd560,0xdce97426),LL(0xc461be1b,0xbb38f10b), LL(0x822d623f,0x3d2249f7),LL(0xe1eeb405,0x202ec2c7),LL(0xb64d9541,0x4527855d),
+ LL(0xc433bf19,0x6fb57a38),LL(0x2a004581,0xa01483cc),LL(0xf1fb8cac,0x7cb982cf), LL(0x7ea92be5,0x8e24b22a),LL(0xc526028a,0x44dc6883),LL(0xc3c10ecd,0x3ccba012),
+ LL(0x6e378a16,0xfe5d98dd),LL(0xd7a9f035,0x959df6be),LL(0x856a9b08,0x9123863f), LL(0x4a4861a1,0x37a49207),LL(0xe726e927,0xf3abe482),LL(0xe950eead,0x80ca1765),
+ LL(0xf21dac1d,0xa899447b),LL(0x62bb8a55,0xca34599d),LL(0x599442ee,0x3ace3361), LL(0x9b2bdec8,0x19fb35d6),LL(0x1ba85c82,0x60e552f0),LL(0x0ecd12b9,0xe293d542),
+ LL(0xa2c1ef2f,0x6effd23e),LL(0x114661d2,0x5cd387d8),LL(0xdffe2dc7,0x8e8c7a48), LL(0x16c4945a,0xa2c03c10),LL(0x9644389a,0x9d7fd950),LL(0x30888d62,0x64455c93),
+ LL(0x910d7674,0xfda175a4),LL(0x233d1789,0xa7147ea4),LL(0x9013a09d,0xf101e4a2), LL(0x07139a87,0x67af7675),LL(0xf5941b5c,0x94837a17),LL(0x2afba5b9,0x8d2a3dc4),
+ LL(0xbfe0067a,0xe2c65840),LL(0xe666562e,0xd0b29ae1),LL(0x3f69d5ff,0x994f3344), LL(0xb38b5225,0x4895550c),LL(0x67443db8,0x317f6133),LL(0x6a3efbb9,0xe78c5ffd),
+ LL(0xf20ec153,0xb98ff8ef),LL(0x54026d0e,0xbb891684),LL(0xe7d12956,0x54ec1dc1), LL(0x8a5739e8,0x9c22e187),LL(0x2ada1917,0x1afc3eb0),LL(0xc839e43b,0xff8822a3),
+ LL(0x7425abda,0x9d4a9d18),LL(0x7bd3fdc1,0xf8e9fbc5),LL(0x9ebefe1b,0x697f7987), LL(0x1e6ed20f,0xa9e72448),LL(0xcdf74ccf,0xa345725d),LL(0xbe698fa7,0x7896df8e),
+ LL(0x3ba72507,0xa0c0c8b7),LL(0x0fa2a2a3,0x65954bbd),LL(0x16257ac3,0xa5e65d96), LL(0xbba0d229,0x3818228d),LL(0x021796d5,0xb8be11d8),LL(0xb97dc1f3,0xe6c3332a),
+ LL(0xdfda1f51,0xb405e455),LL(0xcbe599bf,0xa82537f5),LL(0x9f755190,0xb60bf1e8), LL(0x32a7e242,0x38f7bb06),LL(0x98acbf9b,0x3212ccc5),LL(0xe7ff0a94,0xeebc9ac0),
+ LL(0xd6c9a5f3,0xbb8969ed),LL(0x5bd66149,0x12b8c0a4),LL(0xd0b87b2f,0xb58f5e63), LL(0xd834d568,0x3567a0dd),LL(0x19662011,0x9a569d08),LL(0xf86f6443,0x089e7840),
+ LL(0x632d7db6,0xbdbee0e9),LL(0xc3b20b5a,0x6d9f02c0),LL(0x998a8d90,0x1050c608), LL(0x2f06ab1d,0xd8d0282e),LL(0xab0aa37e,0x4c54a44d),LL(0xd082d2ae,0x6e1b0aa1),
+ LL(0x25ecff7f,0xfeabb634),LL(0xd1a47294,0x97ef1829),LL(0x45d079b6,0x478931f1), LL(0x90a34a1a,0x0c0a2fa3),LL(0x25caf0d5,0x152a763f),LL(0x0e40b542,0x35d8af73),
+ LL(0x2007d582,0xc49fbdb0),LL(0x26d43be1,0xbba36d92),LL(0xd8e1f054,0x4e8feb86), LL(0xdf679100,0x2d7a4eb1),LL(0xa594368f,0xd99cc183),LL(0x7a3bbb39,0x5953cee1),
+ LL(0x8b7ac847,0x9db6811e),LL(0x2196bcd8,0x611682a4),LL(0xab14055b,0x5d9d1f5a), LL(0xec03a248,0xde8b16e7),LL(0xd7f2292b,0x8fdd20f4),LL(0x55aedc44,0x0ab41c2a),
+ LL(0x4c2182b6,0xdcca73f6),LL(0x236096b4,0x8fb4b87f),LL(0xd5653730,0xce326270), LL(0x76943c44,0x5c9e40b8),LL(0x0ab1c0c4,0xde4cd5b3),LL(0x3940c729,0xf6ed23bd),
+ LL(0x77a7afa6,0x5c07d98d),LL(0x5fb74010,0x3b469a44),LL(0xd7860cfb,0xfd595617), LL(0x59e07d3b,0x98976412),LL(0xba3430ef,0x90454a37),LL(0x0a3e1885,0x46a2a6dd),
+ LL(0xfb32d876,0x25adf7fa),LL(0x774e5344,0x256577cf),LL(0x1805d5e4,0xfd44d54d), LL(0x8fb4e6b6,0x92207fea),LL(0x11c5d5d5,0x4a220d0a),LL(0xf8e91bdc,0x3be12723),
+ LL(0xc245b8f3,0x2ca7da35),LL(0xa88aee56,0x2870eaac),LL(0x46354fd1,0x550b013d), LL(0x79eff102,0x42ddcbc1),LL(0x111f871c,0x66a3ed1f),LL(0x3e002a53,0xbddf6a08),
+ LL(0x89d6175b,0xdadeac86),LL(0xdedeed02,0xedba73cd),LL(0x5fae1ea3,0xf56ed9fa), LL(0x46fb11d2,0xd27a3c2e),LL(0x8111c477,0xe8196e09),LL(0x4511b448,0xff123cde),
+ LL(0xe26a279a,0x0f843c1c),LL(0xa3576554,0xc5e0d5bb),LL(0x41361ba5,0x23b9fb1b), LL(0xe963cc9e,0x23b72bfd),LL(0xb847fc14,0xdce7e767),LL(0xf14fcef9,0x162fc75f),
+ LL(0x5495b1c0,0x835fb910),LL(0x9d67f026,0x4bf8073b),LL(0x8899fab2,0xbf47587e), LL(0x82303583,0x5d3d606d),LL(0x3016c2cb,0x8dc9e515),LL(0x70ad2ecd,0x1941fb0d),
+ LL(0xaaf9bf1a,0x52d3382e),LL(0xd97fd623,0x82ca0b62),LL(0x421adaf5,0xd415fb55), LL(0x5bae728f,0x9e737a64),LL(0xa226fda8,0x8bb1f7ec),LL(0xc8fc211a,0xbbe52052),
+ LL(0x98b18dd9,0x111f6855),LL(0xfc1a8284,0x07963287),LL(0x049bc41f,0xadd96aeb), LL(0xa4b9431a,0xf9cdc9cf),LL(0x3186f178,0xed472952),LL(0x9e6b099c,0x7c483bff),
+ LL(0xecf00f66,0x0f259f0b),LL(0xdc4d7da1,0x42adeebe),LL(0x8347831b,0xa84be35a), LL(0x1cb75e95,0xfcc87599),LL(0xaf570741,0x4d352430),LL(0x560a12e1,0x3985430b),
+ LL(0x269c3158,0x0d101d88),LL(0x62a2e7c9,0xf4f4fd03),LL(0x5bd4e966,0x2868c3a9), LL(0x3f2fe7d2,0x28560f6f),LL(0x9f97e5c5,0x33e9acc4),LL(0xaa6fdb21,0x13e585da),
+ LL(0xa9d10acd,0x8c93261c),LL(0x39ee8556,0xaa0c4ecf),LL(0xa1ae594e,0x24174c20), LL(0xe22539a2,0x3741dd7f),LL(0x592618e2,0x2d22e571),LL(0xdf3458f1,0x2f7bfd39),
+ LL(0xd69e123f,0x0a50b744),LL(0x16a94796,0x64461277),LL(0xe18a1d4d,0xd71b262f), LL(0x5e180b7b,0xd9040b30),LL(0x47d6ce9d,0x26f0f403),LL(0x67a15aa3,0x78d16700),
+ LL(0x31529faa,0xa97d1af6),LL(0x2ce2270e,0x6598f797),LL(0xb178d3c3,0xfeb8f446), LL(0x16f5a2ab,0xa967e2c7),LL(0x04b96d78,0x205fdcb6),LL(0xe986b7e7,0x0e580f2a),
+ LL(0x2dd71da3,0x5b769229),LL(0x88f598fb,0xfaf8b016),LL(0x143492ae,0x8f8d4b70), LL(0x96a9c03f,0xa7f5e617),LL(0xa0c34682,0x6bd67a8e),LL(0xa12c32cc,0x7b459945),
+},
+/* digit=24 base_pwr=2^168 */
+{
+ LL(0x4fee65e2,0x00b598c5),LL(0xf18f37b1,0xf85f1a2c),LL(0xe3b72548,0x8659b393), LL(0x696e8d4b,0x3f89080e),LL(0x219f661f,0x4b0794d1),LL(0xa6fda57a,0x95783cf3),
+ LL(0xacf31bb7,0xd47dbc28),LL(0x44076b4a,0x228ba361),LL(0xeff372cb,0xc98f0d65), LL(0xed79eb73,0x73179523),LL(0x9c75c7fb,0xc172348a),LL(0xfd4dc8f8,0x56a7598b),
+ LL(0x611e59a4,0x59648973),LL(0xa9f595e0,0x2151777b),LL(0xf5551b53,0x4c47c966), LL(0x3972a3d3,0x021253a3),LL(0xb4befe84,0x90bc0c61),LL(0x77515e8a,0x16d84bd2),
+ LL(0x94f40d96,0x5c350e2e),LL(0xa5864e3f,0xdfcbcae9),LL(0xfb5d92bb,0x9a2e4e30), LL(0x44281abe,0xd9bde421),LL(0xea539b37,0xa7f9d3a7),LL(0x27b92e31,0x61c3ae50),
+ LL(0xf2aa70a9,0x2244e258),LL(0x35be44a9,0x73df3f53),LL(0xa6238039,0xdcefe8bb), LL(0xe47497a3,0x3a811b6d),LL(0x25465973,0x620c900a),LL(0x4aa632c7,0xe81d4109),
+ LL(0x81a533c4,0x49894327),LL(0x9c521884,0xb510e537),LL(0xd2db22d8,0x8e091dec), LL(0x2112921b,0xe40883cb),LL(0x3023be06,0x77a182a5),LL(0x344bcdce,0x9406af56),
+ LL(0x5f5b1245,0xb0c7d9e5),LL(0x01cd2020,0xf2cae30e),LL(0x4f24138a,0x300d3991), LL(0xe5eb6668,0xb1a3ab1f),LL(0x1468e662,0x1c21f927),LL(0xe4627789,0x2cd78fd3),
+ LL(0xa2475808,0x6bb937ce),LL(0x89fbe7fa,0x190dea20),LL(0xa4a879ab,0x2b19299e), LL(0x02e58d85,0xd08bb8b3),LL(0x44d8e850,0x5f3c807f),LL(0xa807b92b,0x7163052b),
+ LL(0xf139c859,0x33e3fbb7),LL(0xb61d1651,0xae851c86),LL(0x711ebfa9,0xd19bb9d2), LL(0xab556ef8,0x04eb2dec),LL(0x26e75498,0xa90032a2),LL(0xad236dde,0x1b6e1eac),
+ LL(0x72b36422,0x45e0d154),LL(0x440553f6,0x505c7e2a),LL(0xcfaf2624,0x51c21ee7), LL(0xeead1c76,0x28cfa503),LL(0x21322f7a,0xe7e08256),LL(0xca8f7baf,0xb50012c8),
+ LL(0x0e8b3583,0x3ec7b6f2),LL(0x40191db4,0x75562e4b),LL(0xd97200b3,0x2de64fe8), LL(0x67766784,0x9035e032),LL(0x00818616,0x5f64b295),LL(0x9d38c296,0xd62bff91),
+ LL(0x20e7da86,0xc1c38d7c),LL(0xaa79a592,0x29d1701d),LL(0xcb4964c4,0x43853290), LL(0x558d0744,0x157c8a28),LL(0xd845fdae,0x9359aa13),LL(0x0c16e633,0x6938504e),
+ LL(0x303aaf9c,0x7551d181),LL(0xa6ee9450,0x4f75790a),LL(0x5a5ee5ae,0x30cda47c), LL(0xcaeeda67,0x5cecbe96),LL(0xb6acf1ec,0xbb304fb4),LL(0x23d4e0e9,0xa8d438de),
+ LL(0x55bbf072,0xe3c174cd),LL(0x096526d5,0x4c192612),LL(0xa3622362,0x72b1886e), LL(0x38ad3224,0xf9ff34ac),LL(0xde248da9,0x3c0e6f03),LL(0x904019ba,0xaed9b48d),
+ LL(0xeb4c2fe6,0x8b931dfc),LL(0x6fb1fd3f,0xb59385ae),LL(0xcdbf8b2c,0x34d15d09), LL(0x501dfe27,0x354fb5bd),LL(0x8678f10a,0x3244c239),LL(0xdefc3322,0x27fb966c),
+ LL(0xd835d9d2,0xa7bfa23b),LL(0x3d77d0c6,0xe2e0879f),LL(0x7198caba,0xcd307f9f), LL(0x8ef6dc8a,0xaaf47ac7),LL(0xe089b5a0,0x79d488a1),LL(0xd3898ccd,0x9c5910d1),
+ LL(0x99fedbbc,0xe1a69186),LL(0x8c8fedb7,0x1cb035cb),LL(0xb456f31c,0x2cd27f26), LL(0xde4d4827,0x5fe6041c),LL(0xc126f7bf,0x3566eaa3),LL(0x4361f83f,0xafba18a2),
+ LL(0x5b63f6d1,0x79cf0a94),LL(0xd989b598,0x00ce6a85),LL(0x03f0b2c6,0x0f8d928b), LL(0x018ff12d,0x4a4299b9),LL(0x5f379fa7,0x59ab07e4),LL(0x5381194b,0x5e5deef5),
+ LL(0x3c4ab2c9,0x6e7f659c),LL(0x65654e5a,0x8a446f62),LL(0x6327f61a,0xc3cccd42), LL(0xd14cb9b1,0xc9e4ca54),LL(0x6bde8567,0xeee5364e),LL(0xdd7a0868,0xac8150fc),
+ LL(0x5f134595,0xa719652f),LL(0xae508424,0xfcfec81c),LL(0x11ba658e,0x9e16ae3f), LL(0x60511e27,0x88494b81),LL(0x66979b9a,0x495d153e),LL(0x49fad3d1,0x55611c7a),
+ LL(0x8e3ffac8,0xfc730512),LL(0x83da2d11,0x1b6bf5a3),LL(0xac075bc5,0x99558261), LL(0x7587269d,0xd44f89c7),LL(0xdee8b114,0x05413990),LL(0xe309d884,0x35258a3c),
+ LL(0x6a76d0d3,0xba07c28f),LL(0x5067e16c,0x18a52a08),LL(0xc175e5e2,0x6ae1d870), LL(0x9b314f1f,0x5404c2f8),LL(0xb85b02be,0x22c45028),LL(0x69fe8fb5,0xbfa91557),
+ LL(0xd5e20541,0xf420471f),LL(0x93b4597e,0xb7cd0563),LL(0x9e8fced4,0xcd762134), LL(0x667246ed,0x93f1a293),LL(0xcc37aa97,0xa67f1015),LL(0xccc76489,0x54ecfc1d),
+ LL(0xffed38d3,0x2867d280),LL(0x339ff836,0x34e2e617),LL(0x843d9ee5,0x90c7a0a0), LL(0x0bc5ad9d,0x38be6f0d),LL(0x61784c24,0x5be128b1),LL(0xf5c92d27,0x6d1d7024),
+ LL(0xf28e8e61,0xb93c9e42),LL(0x2e7b7f4b,0x1cb53b6a),LL(0xe4e0fef9,0xe1f605e9), LL(0x1f88f7d1,0x069d28f6),LL(0x22c71a8d,0x96265f16),LL(0xdab828ef,0xac157d26),
+ LL(0x341a67b9,0x98b3a5ed),LL(0x3f3639df,0x9aaa605c),LL(0x8b92ce1e,0x59297d2f), LL(0x36504280,0xb9812805),LL(0xa4416a3d,0xe5ae2be0),LL(0x41919442,0xb31daa16),
+ LL(0x0feb1f18,0x1634ffbc),LL(0xd33d0a9d,0xa51dcbe0),LL(0x767a41f1,0x0e03bb87), LL(0x148212a0,0x01041281),LL(0x0e55fb63,0x07f9ce13),LL(0x9bbfabe9,0x9dcfb9b9),
+ LL(0x4eb575e2,0x3ac5febc),LL(0xc5aedbca,0x8aaae188),LL(0xd5870b65,0xc14938bb), LL(0x37600276,0x05a4c6b7),LL(0x6227e53f,0xa3b7f153),LL(0x4703e577,0x3b37d9f1),
+ LL(0x6aea82a4,0x7354429d),LL(0xd061ccd4,0xa8b693b4),LL(0x52d0b458,0x3120ff37), LL(0x92f80ea7,0x254dbf7f),LL(0x89430f4b,0xd229a339),LL(0x94de0c1e,0x97b253ff),
+ LL(0xe4b60a58,0x6556cb19),LL(0xf3b79531,0xaf91e209),LL(0x5bd7c1e7,0x4600c789), LL(0x4100417e,0xe92bfc4e),LL(0xb6d8a9d9,0x772261d9),LL(0xa9a6916b,0x2e573e06),
+ LL(0x98b95e3a,0x05709266),LL(0x1dbd0d3c,0xef67fdbf),LL(0x7552cee7,0x950e2fa7), LL(0xf4ae00d3,0x03b57561),LL(0x46ba7e71,0xf070c70a),LL(0xe39a20da,0x196843b1),
+ LL(0x60091a66,0x4213bea2),LL(0xa0e25486,0xbed0b79e),LL(0xe5c60f95,0xd2bc9dfb), LL(0x3ce65338,0x7aa159d5),LL(0xc8ec70b6,0xef1f0d85),LL(0x28d23ccb,0xb47100d7),
+ LL(0x2f8c540a,0x7c602da6),LL(0x854edfb6,0x9e3193eb),LL(0xa18a05e6,0xd1b97d97), LL(0xc430fcd8,0xff9bdf8d),LL(0x3b7fb6c4,0xdfde4b67),LL(0xa97725fd,0x3d8b2185),
+ LL(0x0cd2fdea,0x20f59fe1),LL(0x5923a8af,0xfe8a4dc0),LL(0xfa9e9992,0xf9d94a99), LL(0xd35b2020,0xb9c441eb),LL(0x07668b98,0xcce38d28),LL(0x2bf90eab,0x582f54bd),
+ LL(0xab0e3f41,0x9f1d9413),LL(0x3a412ee4,0x5e8c119b),LL(0xf030ad58,0x8879b87f), LL(0xde74321c,0xe48dc015),LL(0xf6cee695,0x522fb0ae),LL(0xb8d5054e,0x40162c77),
+ LL(0xc129d829,0x2f8ae88f),LL(0x3f3ab771,0x999f091f),LL(0xffb12ab6,0xa7e1a5ad), LL(0x6c51306e,0xbf7d078b),LL(0x3307b832,0xb084c854),LL(0x64450a20,0x46824c00),
+ LL(0xff4b278e,0xafad7324),LL(0xb780a046,0xf2aa88cf),LL(0x03143e85,0x429e746d), LL(0x91dc0962,0x5727ab2b),LL(0x67771a60,0x489517bd),LL(0xd28b48a1,0x2d01a677),
+ LL(0x68e73dfd,0xcecba270),LL(0xcdb43f75,0x2988378a),LL(0x8a6f1487,0x617e4cc8), LL(0x77958a86,0x7b3bbea4),LL(0x00baf816,0x097fa14d),LL(0xf3dd7875,0xaad04d0d),
+ LL(0x6ac04cd8,0x03d57abe),LL(0xc1971431,0xe65c48d6),LL(0x57dbcf69,0xc762049d), LL(0x408042bd,0x967f3d11),LL(0x0ff3e3b8,0x8b9583ed),LL(0x11593e70,0xafcb3c34),
+ LL(0xc3f9b58c,0x41df50a9),LL(0x55f9cc35,0x259d92b8),LL(0x2f2195a7,0x670ff896), LL(0x242e6aed,0x1a7c5825),LL(0x0b8b7fa6,0x04cc2dba),LL(0x0f24c794,0x20eb7a8c),
+ LL(0xab8c47fd,0xbb5b87fa),LL(0xe425d990,0x24a897b6),LL(0x680c630a,0x86cc5725), LL(0x31fb1789,0x98095baf),LL(0xe7c13217,0xc3655f2e),LL(0xf43a1aa1,0x014736b8),
+ LL(0x52deee88,0x62bcaf35),LL(0x5b973eba,0xb396c4e7),LL(0xbda679ab,0x51c1903d), LL(0xd5c3a5aa,0xae30078a),LL(0x40876de9,0x8b17d5cd),LL(0x86473f13,0x150e6256),
+ LL(0x09da0150,0x3afdb04f),LL(0xa6c1fbb6,0x944dc9f4),LL(0xd6d37139,0xf978d7e1), LL(0xd7688302,0x294df22d),LL(0x050fc353,0xcb4a2989),LL(0x4d693ea6,0xb7355cc1),
+ LL(0x705e6c1d,0x603b9990),LL(0x6e20c02e,0xbc22cb07),LL(0xda4a714d,0xcf26fedd), LL(0xc5f7dd2d,0x499a5020),LL(0x870ff472,0xd5f6d465),LL(0xd7242e9f,0x64105bcd),
+ LL(0xdfc15966,0xe8651d8a),LL(0x3f36c08c,0x65f62567),LL(0xd7cc1614,0x7e1b118a), LL(0x5f8c1b51,0xe547ba77),LL(0x40fd1c4a,0xbe829b43),LL(0x7393994c,0x27ef6fa1),
+ LL(0xf06e1517,0x47b06a9b),LL(0x9538a94f,0xfc4162b2),LL(0x8787dbb2,0xda0b09f1), LL(0x69ed3599,0xaf40f743),LL(0x20668861,0xd0539dd8),LL(0x4d25d347,0xd97dd381),
+ LL(0x8ed5efa1,0xf37b0062),LL(0xf0d1e9a1,0x33b8ee0e),LL(0x4e88bddd,0xfc5ed264), LL(0xebc6518d,0x9c8a10bf),LL(0xed07b158,0x3bacc4d1),LL(0x38679a57,0xf3a21ff7),
+ LL(0x28d869ca,0xb696e37a),LL(0x5e14048e,0x1c92d21f),LL(0x09011d46,0xbd612912), LL(0x344de336,0x4253b283),LL(0xb1b9160e,0xc5500601),LL(0xe5dcbf35,0x6a09d20c),
+ LL(0x94adc78d,0x0d0de35b),LL(0x0dc1d07c,0x77e19853),LL(0x0bdd2c5b,0x34b0dc75), LL(0x753ad557,0xfb35d357),LL(0x63471eb9,0x5d25872a),LL(0xc1012690,0x0deb74f6),
+ LL(0xaaab12f1,0x8af62a30),LL(0x1013c549,0xb94f6b3e),LL(0xe29c422c,0xc66fd2e8), LL(0x5ac31b52,0xf14b58ae),LL(0x222c930c,0x341a40c6),LL(0x79810099,0x97a887df),
+ LL(0x4d81c717,0xd365310a),LL(0x01f352f5,0x03f4d8f5),LL(0x7eea6a1f,0xf252f189), LL(0xf8638d81,0xb159cdf9),LL(0xe3f109b7,0x984ed9c3),LL(0x782d6bf4,0xef2542fb),
+ LL(0x587be148,0xd0c19f88),LL(0x86172fd1,0x607cef08),LL(0x75ee2bbe,0x7d46f8eb), LL(0xf39fe2f1,0x0d243305),LL(0x362a46ff,0x595aba8f),LL(0xe19fa4d4,0x5a9e9116),
+ LL(0x9d07c0e7,0x7c3998c0),LL(0x3ab74d57,0x5dab40f7),LL(0xc6ea1153,0xb0deb5d1), LL(0xdba8086e,0x2f3a9092),LL(0x9dd0d434,0xdf0db996),LL(0x30e52883,0x63af92c7),
+ LL(0xfb8379d7,0xce592f6b),LL(0x57237edd,0xf182db14),LL(0xa33ff0fb,0x435ce079), LL(0x16e22f7b,0xf67443b4),LL(0xd01a4364,0x1a603d76),LL(0x0d3849b6,0xf37e32ca),
+ LL(0xe6dac621,0x2456397b),LL(0x1585b538,0xa98d7499),LL(0xd2fb419a,0x249b8fe2), LL(0x2d722c8e,0x1971929c),LL(0xeb0dfb04,0xb835ed94),LL(0x7786927d,0xe0ec2ab9),
+ LL(0x96808ab1,0xda420127),LL(0xae1677d6,0x9d1d0cfe),LL(0x4381a97e,0x641b4256), LL(0xcf4f8245,0x57a2072c),LL(0x24192acf,0xc038aab8),LL(0x6ee05997,0xf708b6d9),
+ LL(0x82628553,0xd0f52e74),LL(0x96add683,0xd6dfc4ae),LL(0xe70500d4,0x5197189e), LL(0x82ee5eac,0x28fe6d10),LL(0x24145176,0x6c314538),LL(0x7a0ce5ad,0x0b507a03),
+ LL(0xbf1b56ed,0x28341dba),LL(0x2bd1775a,0xa704c00d),LL(0xcd969de8,0xe8c68f7f), LL(0xad40ac8e,0x64fd4b91),LL(0xfbb5f7b8,0xbc8f2d47),LL(0xb0338932,0x43d6bbe3),
+ LL(0x81bc04b1,0x72af7125),LL(0x4e2f9274,0x88d535a1),LL(0x3974e880,0xf0578277), LL(0x15b341a6,0x1539a26b),LL(0xb3e593cb,0x603717a3),LL(0x7d61dcd7,0x477f833b),
+ LL(0x032e59e7,0xee7a6462),LL(0x3532e58d,0x70ac18e5),LL(0x0e36ad7b,0x9382dda0), LL(0xf911a5a7,0xf4c500c9),LL(0x800f8273,0x6d46aa73),LL(0x3e10963e,0x670e4f56),
+ LL(0x29429437,0x4164dbd4),LL(0x41281f62,0xd9358c9b),LL(0xcbf5eb0a,0x176d1b60), LL(0x2ccdd253,0x3a70e691),LL(0xa25d63e9,0xc53385f2),LL(0x2388d4cf,0xecfe446a),
+ LL(0xbc93d305,0x5fe1afcf),LL(0xf307c07f,0x59c6b4d8),LL(0xec492ace,0xa805d89d), LL(0x7c31b553,0x572efc64),LL(0xd5bf85fd,0xb15afb14),LL(0xfa431d83,0xb8a6a24c),
+ LL(0x3057e6e1,0x031dd1e6),LL(0x919f1a50,0xac205cef),LL(0x6bf4b8fe,0x3236d945), LL(0xd11eb95a,0x3cdc048e),LL(0x2b4d6ce2,0xaaa916ac),LL(0x7d395898,0x381aca94),
+ LL(0x9ec42177,0xc5146299),LL(0x2d66626c,0x6b043df3),LL(0x82ea3769,0x9ed7174d), LL(0x9da03903,0xf8f18beb),LL(0xcd642f4c,0x72c11f7a),LL(0xd4de2f90,0x4bdad457),
+},
+/* digit=25 base_pwr=2^175 */
+{
+ LL(0x58d3510e,0x5641060f),LL(0x364db85d,0x8e313a7f),LL(0x5cafd58c,0x203122d9), LL(0xccb848a1,0xf79b8cdf),LL(0x67e06429,0xda00c247),LL(0x50dbd8ef,0xe8ddf520),
+ LL(0xd06db4a0,0x13b4d6c6),LL(0x1c320a37,0x9ca098dd),LL(0x4660ce85,0x23635473), LL(0x70e85a9d,0xcb8bdc7f),LL(0x92b6fa4b,0xd96a49de),LL(0x6f48c32b,0xd22ee1cc),
+ LL(0x526a7a48,0xbaf0570d),LL(0xfd4d36d1,0x9436cae8),LL(0x24fac988,0x44427e92), LL(0xb39cb050,0x935deddc),LL(0x95237984,0x2db73da9),LL(0xe0403a31,0x6d812614),
+ LL(0xa4968444,0xf1cb1e84),LL(0x15156d72,0x8624f8a4),LL(0x66276ea6,0x83d9f12a), LL(0x3b28aaa8,0xd15883d2),LL(0x06aba758,0x4043aea5),LL(0x19ad8608,0x3b9cffbe),
+ LL(0x71c764ac,0x19b195dd),LL(0x16c89a6f,0xb10cdd8e),LL(0xdee07ce5,0x51f783dc), LL(0xbf7febaa,0x05b98ceb),LL(0x0026e40f,0xcbdf20ec),LL(0x8ea46069,0xf4ff428d),
+ LL(0x19829b4e,0x204f3d40),LL(0xfa6cc5ed,0xd37d49f5),LL(0x07a5325c,0x55bfb8db), LL(0x7c3cffdf,0x349c9305),LL(0x44e85a40,0x15868ca4),LL(0xe664b649,0xab792855),
+ LL(0xa8931c2a,0x1488def0),LL(0x93e47cf2,0x20b6b035),LL(0xc9c0e09a,0xfd90bf99), LL(0x9e4cf905,0x28fe0815),LL(0x48dbf990,0xf397729a),LL(0xb09e4e66,0x82000550),
+ LL(0x152fdc18,0x7c7b2c74),LL(0x81529a8b,0x2e09d47c),LL(0xdffec896,0x116d1ef9), LL(0x9ea4077e,0x448891e4),LL(0x9566eb00,0xadad99e4),LL(0x9df75199,0x7d6c3d02),
+ LL(0x1d7fffc5,0xbc3f75a2),LL(0x741fd001,0x47e4ce19),LL(0x45b7d08c,0x24659725), LL(0xc74dcf3a,0x1a4b43cd),LL(0xdc7dd457,0xa1e3c71d),LL(0xe49194dc,0x37aeb7d2),
+ LL(0xbe8af7ed,0xf6372965),LL(0x2e04049f,0x4e36da0e),LL(0x34f4f1d8,0xcc4e4c0f), LL(0x387c3ce4,0x185a80da),LL(0xf81efae2,0x999c4880),LL(0xa0cc97d1,0xd2002692),
+ LL(0x2a469d56,0x97b45c6f),LL(0x4932fa9a,0x0c918aab),LL(0x43aff643,0xc2a2d43e), LL(0x33806c7d,0x685eab5b),LL(0x69645ab9,0xa44c2171),LL(0xa8df46a4,0x128ed8da),
+ LL(0x650a4592,0x561ca2b2),LL(0x3ca61b0b,0x01673084),LL(0x680d8c8f,0x79ebf7d1), LL(0xc216ae2a,0x33cd5c09),LL(0x260a7797,0xdc44dbeb),LL(0xe5886569,0x80046982),
+ LL(0x01f3457c,0x6ffe44e9),LL(0xcbd42d4f,0x9f2fb631),LL(0x77426e19,0x372de1ab), LL(0xb5b9cfe8,0xe73bea79),LL(0x105e1632,0xd2af87d0),LL(0x91def158,0x562e0ebb),
+ LL(0xe8eadc48,0xb3051141),LL(0x214796b8,0xe9797985),LL(0xb0cf5916,0xc7174b9f), LL(0x7c17697a,0xccdaf130),LL(0xe6a3f8cb,0x2ff86ffa),LL(0xe0e4d911,0x655d7ff4),
+ LL(0x7f8a7546,0xeb590d5a),LL(0xd84598ae,0x2e33657c),LL(0x1cf22291,0x6865f925), LL(0x80d54d83,0xf33b0db7),LL(0xd095724d,0xd2045fa3),LL(0x37a729ca,0x2a65650a),
+ LL(0x9b7d8eb7,0xe5a6dff7),LL(0xdd67daf1,0x104734b8),LL(0x503bfa5d,0x49050eee), LL(0x49376195,0xa3422472),LL(0xd85aa682,0x9d58a5f9),LL(0x27b209d1,0xef14a582),
+ LL(0x10c74322,0x72142664),LL(0x161a9f7f,0xed4f37db),LL(0x5f7f95dc,0x0f64b4a6), LL(0x3907231a,0x66c0fe9a),LL(0xc7664836,0xeeadbbaa),LL(0x7907bf1b,0xece73bcd),
+ LL(0x9c17a6d5,0x16aded71),LL(0x08ca25bb,0x2a92a505),LL(0xe1061e03,0x180b69be), LL(0xd61b7fbe,0xad3ee8dc),LL(0xe5e8b274,0xf8d14495),LL(0x3bb4fd37,0xa5269565),
+ LL(0xfb62dc03,0x170bf89b),LL(0x18b9c79a,0x1fe9859a),LL(0x839e677b,0x7605d9e1), LL(0xaa1b4663,0x6d265c97),LL(0x48202008,0xb34d878c),LL(0xa03d375a,0x2b696896),
+ LL(0x166a71cd,0x789e3b3d),LL(0x10983ef5,0xa9f4f3ca),LL(0xdb908c7d,0xf634e8df), LL(0x8192d652,0x0375b69c),LL(0x7e4b6e1c,0x2f5cbad4),LL(0x45be1a16,0x4518ff99),
+ LL(0x408d39c0,0xb664989d),LL(0x2e4280b7,0xa947849c),LL(0xece6ea89,0xbad0f997), LL(0x3a7571ed,0x434fd6c9),LL(0xcf47df20,0x46da8ae4),LL(0x638076c4,0x7708eff6),
+ LL(0xc63c8ac2,0x17e1b4e7),LL(0x36830de3,0x0fff916b),LL(0x55092352,0x2fe8eb88), LL(0xd0af6ad5,0x8b72540b),LL(0xf26f7df4,0xf41a415f),LL(0xb3259e07,0xb7be4c73),
+ LL(0xb3b6ce27,0x4d668949),LL(0xf8705df2,0x332b0818),LL(0x2b168b67,0x11736e3f), LL(0x96ab51a4,0xb7a67c69),LL(0x57e547e7,0x00855b88),LL(0x17aac6bc,0xe9ff07b6),
+ LL(0x2efd47f8,0xeebd36d2),LL(0x288c8f9e,0x4fe7bc31),LL(0x034e796a,0xe82f1e28), LL(0xf0e8922a,0xd25c0279),LL(0xf0f8dcb2,0x9ec4ded4),LL(0x860e5a78,0xa66ac462),
+ LL(0xb8a729d3,0xef72f5c5),LL(0x13b9c03c,0xb6915595),LL(0x2ed45b90,0xa4e66b65), LL(0x0845bf8a,0x763c3414),LL(0xac93c4fb,0x13ac686d),LL(0x2095313b,0x923efc3c),
+ LL(0x3349c905,0xac570164),LL(0x5ca04e5a,0xc85ebcd6),LL(0x6a5d9dc0,0x616a35c7), LL(0x68d2818e,0xfbce6895),LL(0x59769d61,0xd85a342b),LL(0x025ba76e,0x0aa5703c),
+ LL(0xe391b459,0x205537fb),LL(0x5d410558,0x8d2a3d0b),LL(0x64a2d47d,0x71444a23), LL(0x822b0c30,0x0c86c2f6),LL(0x64c2f548,0x8b276842),LL(0x94dbb24c,0x51a73b54),
+ LL(0x29e9c4f7,0xf0ead209),LL(0xe1401652,0x5eddd090),LL(0x190c1898,0x6d6b0600), LL(0xef639412,0x762be19e),LL(0xe78dd0d2,0xe322a3e9),LL(0x824c6d20,0xde53b7e9),
+ LL(0xc90500e8,0xc6b2dd77),LL(0x5a53da9e,0x3a399dc1),LL(0xd09ab46b,0x0969d406), LL(0x249ac549,0x526ec7ed),LL(0x1a09dad3,0x4ae8309f),LL(0xb0c3ad12,0x143165c0),
+ LL(0x610d6c08,0xd1d7d354),LL(0xd1dbf837,0x12d3da0b),LL(0x01a98f82,0x73fb7218), LL(0xa8666766,0x71fe7d63),LL(0xdc316634,0x74ea9c07),LL(0x55aa5452,0xad9f5798),
+ LL(0x92ab7a01,0xeb52fc54),LL(0xfa5e4eea,0x6ec23c07),LL(0x01a397ea,0xa9cb3e84), LL(0x69945c66,0xebcac5af),LL(0x3f194ceb,0xdf57e59f),LL(0xa296c88e,0xb5ec451f),
+ LL(0x794f2a13,0x9cf79425),LL(0x310e1c2d,0xff079313),LL(0x5317d195,0x4d8c0f20), LL(0xf670d56c,0x0d854923),LL(0x31cfadcf,0x7564177d),LL(0x0845bd19,0x67d58b2f),
+ LL(0x6ce7d0f0,0xed2fd628),LL(0xa2ff8523,0x0a338e2e),LL(0x6968e5ed,0x4cd9123a), LL(0xf2f06ab4,0x14edcc8f),LL(0x6e52fb45,0x23c39e14),LL(0x41a9c448,0x529a89d3),
+ LL(0xfa8c503f,0x436e8ebc),LL(0xc7ec91f5,0x2d692350),LL(0x2f6a42f3,0xe847216b), LL(0xa68613e7,0xe12297b3),LL(0x10dbc984,0x16e343fb),LL(0x16d59123,0x7dbec088),
+ LL(0xd64ff51c,0xf3e6abe1),LL(0xd3afe2c2,0x87accfb2),LL(0x4dba0813,0x57b5f905), LL(0xb3b8c3fe,0x17038f08),LL(0x247ea7e7,0xfe435876),LL(0xa6d8a7a0,0x61415630),
+ LL(0x72efb994,0x685e474d),LL(0x495c513e,0x05b09ce3),LL(0x36da77db,0xf03f489e), LL(0xd1920e81,0x5bce5842),LL(0x4ba12592,0xc3fe249f),LL(0x0a5eed91,0x9671b08a),
+ LL(0xaac51e01,0x387fcc9a),LL(0x9c3e2419,0xf8c9ecb3),LL(0x754e0ecb,0x1017d74c), LL(0x9a76367c,0xb1528d0c),LL(0xa2e5c47a,0x4dcd49c1),LL(0x3751eba3,0x7b635160),
+ LL(0xae011f19,0x3879777a),LL(0xf839016e,0x6a63aafe),LL(0xe3944a17,0x199a76e4), LL(0xb399afa0,0xa0455c72),LL(0xf9479065,0x95450e12),LL(0x82b89c67,0x90479fcb),
+ LL(0xe392cb40,0xdc585a30),LL(0xafe2f1cd,0xbd161799),LL(0xaf671659,0xf0794ecb), LL(0x3e558726,0x7144b4e9),LL(0x0e8fb051,0x61aa80d1),LL(0x0a97d49b,0xd2a41b0b),
+ LL(0x0a74e744,0x10f7c811),LL(0x96ab89c0,0xdd94a330),LL(0x53525096,0xb617d078), LL(0xcfdfa40c,0x2e5b46f0),LL(0xcedc53d0,0x6edea8ab),LL(0x6399837f,0xaee682f0),
+ LL(0xf2adc050,0x398c7fd2),LL(0xc7638b0a,0x1030cdae),LL(0x8867f1d6,0x1cd2be4b), LL(0x1ba68d19,0x2f97a204),LL(0x18cd2ec7,0x47f3b28a),LL(0x8e77c014,0xf164c987),
+ LL(0xc33772e4,0x8489b718),LL(0x2f4128d3,0x08ac1911),LL(0xda0369a0,0x8370f1f5), LL(0xf1d75833,0x50ff1409),LL(0x0f83a8e7,0xa314c13c),LL(0x5a766258,0x776de80d),
+ LL(0x77ba6858,0xffe94ccf),LL(0xcc2a35c8,0x1b87cbeb),LL(0x57a1fa64,0xd5528288), LL(0x5937abfc,0x2e32d797),LL(0x284ca1f0,0x89a76fe3),LL(0x482441bc,0xdbeb8eda),
+ LL(0x397926fd,0x6bd5d9e9),LL(0xf5fbd488,0x3e97744f),LL(0x4ff64738,0x020f694d), LL(0x968aa895,0x34b3915d),LL(0xb88572cd,0x60b03cd4),LL(0x67dcf49f,0x0cd44b01),
+ LL(0xac9b8b5f,0xc6f1228c),LL(0x7822905f,0x5f49fb8e),LL(0x950e82e9,0xa61a8520), LL(0x6f44f547,0xec78c658),LL(0xaa640c3e,0x86d54b78),LL(0x54c16691,0xf6aab7a4),
+ LL(0x44fbab19,0x0cae07b3),LL(0xcc4d821d,0x61e61d3c),LL(0x5beae87e,0x5c2ff6ed), LL(0x9ba67712,0x719d81cf),LL(0xcb1e1329,0x8fb7e1c8),LL(0x32f7e9b7,0x82a0507a),
+ LL(0x0d8af7c0,0x94bf5956),LL(0x3dde66aa,0xeb94e708),LL(0xcc491968,0x2924bca4), LL(0x1bae682d,0x348c6486),LL(0x0da0931b,0x5490288c),LL(0xa923db17,0x79cae045),
+ LL(0x4ed8cc93,0x99ae0e06),LL(0x1f211af5,0xe0dca803),LL(0x54413c07,0x3e0da321), LL(0xd2e5771c,0x11bf91ee),LL(0x5d9efe6d,0xde57fde7),LL(0x2bae2eca,0x140cd249),
+ LL(0xebe25fb3,0x8c25772c),LL(0x5ae86876,0x9ebd7151),LL(0x227c8fc6,0x9e01abfa), LL(0xe8279d68,0x10316800),LL(0xa07da963,0x394a6fff),LL(0xc8b9c7e0,0xd8316e12),
+ LL(0x4866b100,0xe34a3346),LL(0x64640c51,0xbe82e03e),LL(0x8c26b45a,0x2228e85c), LL(0xaaec11b1,0x4f53739a),LL(0xed773bc3,0xedcebe7c),LL(0xfcef0ce2,0xfee917ad),
+ LL(0x44c7c595,0xdf6dca1f),LL(0x374d0d04,0x421ac2e7),LL(0x9e3ed6ef,0x842f0ded), LL(0xe9dcc612,0x0e20b04a),LL(0x2040e59d,0xbe403a6f),LL(0x8611c050,0x0ed4eb43),
+ LL(0x559e8de2,0x8479f4bf),LL(0x851f7b34,0xb12ebeb5),LL(0x3a3d71ea,0xc34bfd18), LL(0x24e9273c,0x56d9d399),LL(0xb9f63b13,0x7f404c7f),LL(0xe50afb2d,0x9b679748),
+ LL(0x09f98b35,0x9be55951),LL(0xff869a57,0xde925893),LL(0x21a9054e,0x387f817a), LL(0x70ee95b2,0x1e674786),LL(0x36b7d89e,0x628421b4),LL(0xe95fc254,0x5c66493f),
+ LL(0x3f27517a,0x68f7f079),LL(0xa2634bb9,0x44e0f99f),LL(0xc49ed6bb,0xff40ec9d), LL(0xd4c15f22,0x308b3e76),LL(0xddaa3039,0xb3f77d17),LL(0x7ea641c5,0x3dc87e6e),
+ LL(0x004a3af7,0x8d01afc4),LL(0x5cb71d7c,0x118e5970),LL(0x48ba3691,0x4facd336), LL(0xa796a7d3,0x30530fed),LL(0xcc7913f8,0x437ad3b9),LL(0x8adebd12,0xe0c151c6),
+ LL(0x2e553c5f,0xf37ea5cf),LL(0x45ebc28e,0xd35512e6),LL(0x05331492,0xd4f2b6b1), LL(0xaba58423,0x0ab0b63f),LL(0xd8791541,0x0c6d3499),LL(0x81abb7ed,0xc911fda1),
+ LL(0x53f134aa,0x4316e48a),LL(0x492e43e8,0xc26f2068),LL(0x126d373f,0xaea01397), LL(0x37d4baed,0xdfb016dc),LL(0x68550352,0x70fd4cd9),LL(0x90c02756,0x82a6c302),
+ LL(0x66cf543d,0xbbfbd662),LL(0x9f372f9c,0x9198ae05),LL(0x0d3c6392,0x548bc0b0), LL(0x71100572,0x5e227e8c),LL(0x189496d9,0xbd10e2ef),LL(0xb6a6798f,0x66b7ddd2),
+ LL(0x1d9b4627,0xdbfa89d2),LL(0xe9722687,0xa4144f05),LL(0x62a9f0b3,0xa03a6658), LL(0x09a6ee11,0x11e24e34),LL(0x610d808b,0x02a2f96d),LL(0xb68d12eb,0x3434da69),
+ LL(0x420733a0,0x224f3f9b),LL(0x99244104,0xa3f7e5c2),LL(0x9dd4dd08,0x2018ee4f), LL(0x230f84ef,0xb993d248),LL(0x69d385df,0xbb1c8f5b),LL(0xddffd0f2,0x9242e20a),
+ LL(0x09654b6a,0x6d842a62),LL(0xfe652314,0x2f79695e),LL(0x193c89e2,0x0c65ea9f), LL(0x6b79b085,0x009cf4f9),LL(0x2268da91,0x390256cc),LL(0xb23a9a13,0x9a5602a1),
+ LL(0xc087ed5f,0x7e6b4f66),LL(0xa1c63549,0x14a8e4d1),LL(0xfed4b006,0x01ca8c96), LL(0x6933bc42,0x1f5e13f7),LL(0xcc727c9e,0xd642cd3f),LL(0xa4a52672,0x60a81922),
+ LL(0xcb37c6b1,0x21d4016a),LL(0x6aaea4e2,0xbf9c3ad6),LL(0x4d227e29,0x9bd42e82), LL(0x66fe8ded,0x7b43dfb3),LL(0x4f6d7cab,0xccc64f49),LL(0x709cf722,0x9fb84f64),
+ LL(0x99a34b60,0x657bba39),LL(0x5bf3ff4c,0x54c86454),LL(0x6a3fc2c9,0x91cab991), LL(0x9d937181,0xad3baab9),LL(0xa318a96e,0x9b39648e),LL(0xd5a8dd54,0x416fe984),
+},
+/* digit=26 base_pwr=2^182 */
+{
+ LL(0x10e89d46,0xa5d2d3fc),LL(0x267decf4,0x426ccb6f),LL(0xf65161a7,0xc430a435), LL(0x45ff08ed,0xf32e4fd9),LL(0x52fce424,0x29bd88e4),LL(0x7df49592,0xb58dca75),
+ LL(0x2de63b4f,0x08b2eb9d),LL(0xc5a70a53,0x2dd60214),LL(0x183b9f0a,0x8bf59ae3), LL(0xa4d75e6a,0x127db136),LL(0x2dd19a85,0x70a4c22d),LL(0x6bb9e133,0xa04ca68b),
+ LL(0x1e0ac0de,0x7c1f8f54),LL(0xcc70b75d,0x33fa9eda),LL(0x1661ad09,0x190f2578), LL(0xc6af0599,0xc8d29939),LL(0xd76f1d21,0x8f0f6073),LL(0x28d0432c,0xda9f9fbc),
+ LL(0x9c65f79d,0xa73ce4f4),LL(0xcb12b4d2,0x81728494),LL(0x34a30e52,0xb3709952), LL(0xcc5be142,0x34e61905),LL(0x0d1b9183,0x0237c5ce),LL(0x51d9f58a,0xcd502078),
+ LL(0xb77a9580,0x5935c009),LL(0x60590762,0x109f262c),LL(0xa9bef637,0x40cd7b02), LL(0xe1e887cb,0xbcf02172),LL(0x22fc3d18,0x23ab267e),LL(0x2b110de6,0xbb9632d8),
+ LL(0x1e71e027,0x939849be),LL(0x0916d6dc,0x04493ee8),LL(0x7a4c25ff,0x2456a4fa), LL(0x80e2c3af,0xbd7a130d),LL(0x19ebceb4,0x63b50b49),LL(0xca679a32,0xcf3af9f6),
+ LL(0x568806a1,0x8bf5ebcd),LL(0xd6906912,0x9d9e980d),LL(0x2224ffdf,0xbc01567e), LL(0x9b382f20,0xec45fad8),LL(0x2ae9b081,0xc81ce8e7),LL(0x98932797,0xe492d96d),
+ LL(0x29a231ea,0x5d2a1162),LL(0x59e196df,0xa3a8d097),LL(0x7f4b3fb1,0xe049a755), LL(0xc6316d29,0x5a3a8033),LL(0x927eae96,0xcfa30505),LL(0xbe935448,0x08b8a76c),
+ LL(0xedc1da3d,0xae5b906d),LL(0xe511be7d,0x7e4c4f50),LL(0xbf36de87,0x8d50de21), LL(0x0ed128b9,0xa3e529b5),LL(0x39d260df,0x902d56ab),LL(0x5e3d15b3,0xaafa263e),
+ LL(0x0e6cecf4,0x201392c1),LL(0x49f3f177,0xf3e51d03),LL(0xcb103c3c,0xa778f941), LL(0x7666e871,0x663a85f9),LL(0x67c98f13,0xa46b0c85),LL(0x3d7ea941,0x3419ecca),
+ LL(0x0cd251b9,0x6e9c319c),LL(0x740ebef4,0xe03a5e58),LL(0xeb45dea1,0xef0db2a0), LL(0xe6e4e097,0x12e7626f),LL(0x19914347,0x27cfc38c),LL(0x6046e4f4,0x92b17248),
+ LL(0xfd260bad,0xad9a809e),LL(0x84cf1f3c,0x0faa61f5),LL(0x6afd71d3,0x7b60a72c), LL(0xd1fd427b,0x67f98a21),LL(0x45809f86,0x55e94be4),LL(0x8e08a8fc,0x55f38c03),
+ LL(0x78ac4a59,0xe1bd82eb),LL(0x80599bf6,0xc195517f),LL(0xcba34b90,0xd57d73bd), LL(0x68e80682,0x70b22ccf),LL(0xfbe46433,0x9ef082ba),LL(0x4e1de964,0x0e3b2665),
+ LL(0x629523a0,0x40c1bd3d),LL(0xb3c7fa46,0x55c4d1e4),LL(0xc3ac04c5,0xe731d1dd), LL(0xb98ea38f,0xee1fa82d),LL(0xc3da8420,0x2a53d82c),LL(0xf22acfea,0x368c36c9),
+ LL(0x29b755d0,0x0266ab97),LL(0xcd211255,0xf06c3dd8),LL(0xda4b92c3,0x815c935c), LL(0x7c35910f,0xc8b3d452),LL(0xe14a590c,0x0f3aed26),LL(0x8e1ce1c0,0xf6ecbf3a),
+ LL(0x574f2fbb,0x552b5d7a),LL(0x8de8d85f,0xfa3986c3),LL(0x9614d372,0xaa53bc82), LL(0xc58f40f9,0x1118e769),LL(0xe3a00d02,0xa39c3653),LL(0x92267b25,0xb0de6989),
+ LL(0xc7b64858,0xa306b7c8),LL(0xb64b2f3b,0xf22489d0),LL(0x277347b5,0xb4d82d56), LL(0xb3c23db8,0xc6120600),LL(0xeb1d672f,0xdd104bc6),LL(0x91821d86,0xf46c3e19),
+ LL(0x182aa649,0xbd1809b8),LL(0x9def0d8a,0xa14bcb07),LL(0x150bc2b2,0xbc355f52), LL(0x303a6966,0x9b74419e),LL(0xeb2b3cb5,0xf922f6bf),LL(0x18f7ca08,0x5d7aa60c),
+ LL(0x0be5968b,0x42346530),LL(0x2a740a40,0xe0a37f25),LL(0xe665427d,0x03bd64c1), LL(0xe4074164,0xe3911c26),LL(0x7960eb4e,0xc9770b1c),LL(0x5c67feb2,0xbe470d6d),
+ LL(0x3894d144,0x3b30ad55),LL(0x16768125,0x51da7959),LL(0xbed864b3,0xe8cfebda), LL(0x833b7cb3,0x49a98925),LL(0x6f174ec4,0x830c736e),LL(0xcda2e7e0,0xf9efa80a),
+ LL(0x376e70ba,0x01f86bbf),LL(0x0eddf0bb,0x686b6cb6),LL(0x64d59f33,0xdc9eec10), LL(0xa46828be,0xdb7037cf),LL(0xd2c7ca5a,0xceeb8c28),LL(0xe6196bda,0xe40cbf09),
+ LL(0x8bd42f71,0x0ac2d045),LL(0xb62d83fe,0xd4215f7e),LL(0x03acf7bd,0xaab77a58), LL(0xc2eeb2e0,0x7e1aa3e8),LL(0xd86c3480,0x16dbe858),LL(0x8a7fb0b3,0x65a386cd),
+ LL(0x8894f88b,0xc426e3e1),LL(0x4593936f,0xa748da73),LL(0xca40633d,0x9e640d2a), LL(0x02ac44dc,0x84fd2be4),LL(0xd437cf7f,0x0471f362),LL(0x7306c123,0x8f4155e7),
+ LL(0x21dd0f82,0xc9871691),LL(0x28d633a3,0x2bd96ea5),LL(0xfc2ba2af,0x1906ae24), LL(0x1ee92586,0x2b4efac7),LL(0xf7f07861,0x4b97cbfa),LL(0xf7281f7e,0x4dbf54e2),
+ LL(0x25b5b11c,0xc39fffbf),LL(0x98a6b660,0x41973093),LL(0x0f7b07f8,0xd02dcfda), LL(0xfacfc8d6,0x42bd5635),LL(0xfa119a0d,0x49c754a0),LL(0x7a67703b,0xf3900a31),
+ LL(0xb7648cd6,0xffe76894),LL(0x973e597b,0xa790612b),LL(0xd6d78341,0x5a817ff0), LL(0xc9960802,0xe4a6c1a8),LL(0x6884bf58,0xa296fc0a),LL(0xcaee199c,0x8387842f),
+ LL(0x78a21751,0x505a5fbc),LL(0x04338ed3,0x8d557dd4),LL(0xf8316933,0xc6daa6eb), LL(0x9fbe57c9,0xce8b52fc),LL(0x82ffca53,0x93375f08),LL(0xe48a4172,0xd2e09822),
+ LL(0x2d8b1f67,0x59d6d11a),LL(0xf984b355,0x3df9851e),LL(0xeef602c2,0xfad1f4e1), LL(0x1df4b332,0x6c07fd2b),LL(0x0a339f9f,0x1672e0ae),LL(0x3e2e73f1,0xa7aac7c0),
+ LL(0x53de8d30,0xd015e91f),LL(0xdeee9e90,0x9cef3987),LL(0x9b54ea0f,0xcae1fbee), LL(0x0b2e4bfc,0x5541f0dd),LL(0x00c1a228,0x15f9dffc),LL(0xd9dfb7f7,0xeed05a2b),
+ LL(0xf8bcb7fb,0xbeb350fb),LL(0x3fb74891,0xa6a2efe1),LL(0x4216f4a5,0x1cfaf6a0), LL(0xccd45bce,0xd268b24b),LL(0xe3db6dfa,0x5c85e954),LL(0xf04e8161,0x127ce38c),
+ LL(0xfc6c17ef,0x749016b3),LL(0xc849c80f,0x840e079d),LL(0x55aebfa6,0xef3493b4), LL(0xbdddb794,0x5645586b),LL(0x0a0da6a8,0x1e1ddb6d),LL(0x33397277,0xbd31053b),
+ LL(0x257efe71,0x64c4bcd5),LL(0xf7abc98c,0xd35b6fad),LL(0x49479a50,0x3b0df461), LL(0x0c01f68e,0x7aa9ea28),LL(0xfc247d85,0xa37c8d40),LL(0x82d5d062,0x4214db8f),
+ LL(0xd4665035,0x615f976f),LL(0xb2fd9161,0x39f27e8e),LL(0xce638414,0xa1ae7fee), LL(0xbee083df,0x0717218c),LL(0x80a73a7f,0x66d2bccf),LL(0x77555a78,0xc1cfe44c),
+ LL(0x151f9185,0xab6467ac),LL(0x25664569,0x6df53a18),LL(0x466dd4b8,0xa54fbfd4), LL(0x8b3c8dc6,0x6f063338),LL(0x41623458,0x64adde6f),LL(0x112ad869,0x08056bf1),
+ LL(0x3434a31e,0xfdd32b7a),LL(0x04cdeecc,0x5728361d),LL(0x3a7b8da1,0x2aa81490), LL(0x09a2731d,0x87c2d7d2),LL(0x89ebca03,0x1f3344b9),LL(0x19158d11,0x3b4eb6aa),
+ LL(0x4aea58b5,0xc2bc01be),LL(0x19f12b28,0xf7d53cd7),LL(0xdf3da230,0x475fcd61), LL(0x09990316,0xeb3dd742),LL(0x28ea4a85,0xb1c62ec2),LL(0x71770efc,0xd9ca3e02),
+ LL(0x285cb4ae,0x92099143),LL(0x0d8f3f4f,0xfac421c8),LL(0x31e4afb4,0xb20b6d02), LL(0x41735275,0xb896f118),LL(0xe7a40b45,0x9f8d1d92),LL(0xc574911e,0x578117a2),
+ LL(0xc8ab5906,0xe049b850),LL(0x90ebe14c,0x3dc8761d),LL(0x3d9b21b1,0x01b959ad), LL(0xa1be26d8,0x69e0edfb),LL(0x90bffa45,0x23061d51),LL(0x5432258c,0x12c49398),
+ LL(0xec1ab63d,0xcf6318e5),LL(0x78baa5c1,0xfabf5dcc),LL(0x6529af85,0x6fe5da1b), LL(0x0d696bed,0xc02b8cbe),LL(0xc83d0478,0x5865de25),LL(0xf422a123,0xaef1328d),
+ LL(0x700b22a4,0x0895f5d0),LL(0xf78d8bb2,0xb52e7e2d),LL(0xe0972d87,0x5771d2c8), LL(0xa67e68d5,0x45181514),LL(0x29446b80,0x11ad6a2c),LL(0x3c18bc56,0x17b2b4e7),
+ LL(0x075ee3b2,0x3d4755d1),LL(0x0fcec9d9,0x1505789c),LL(0x398f0c91,0x6e00b31e), LL(0x57048d0c,0x54cea710),LL(0x6443fcff,0xf40ba9be),LL(0x05b2a1b2,0x04075b8f),
+ LL(0xf3aa488f,0xcb23f2f6),LL(0xb3aa9bab,0xd48b8a3e),LL(0xa8b58c26,0xe1dfa993), LL(0x58d04b7c,0xe2641538),LL(0x32ad4a3c,0x1159caa2),LL(0x00256f11,0xa19210d5),
+ LL(0xeb897a63,0x52787df1),LL(0x3afae814,0xe4f787d2),LL(0x9a665638,0x3c391a2a), LL(0x49d18f8c,0xa7cbf5cb),LL(0xd351d0bd,0xb159a6c2),LL(0x57b9faae,0xe501bee6),
+ LL(0x7ffa6fb7,0xfd21c745),LL(0x6eb966ff,0x9f082577),LL(0x6cf4bbb6,0x7bc7fd6a), LL(0xadae7e60,0x01fbbec5),LL(0xdb5201fd,0x8ede95fa),LL(0x505dc527,0xfe027d78),
+ LL(0x4ab8d622,0x556427f0),LL(0x2d8a1b65,0xac06be29),LL(0xc1517a5a,0x24ffe89e), LL(0xbb687bbe,0x8ed6619f),LL(0x5e6229f5,0xc391ab29),LL(0x6668e363,0xc6accdea),
+ LL(0x2236abab,0xaa1a8aae),LL(0xbbbb5c34,0x7ff0f90e),LL(0xcdbbe595,0x342421e1), LL(0x158fa276,0x3a43eb45),LL(0xb1c8d9e2,0x3f206b59),LL(0xd1fb731b,0x926495ee),
+ LL(0x772ae335,0x64dee795),LL(0x27bb58cf,0x5536e14e),LL(0x68065d10,0x559824cb), LL(0x5fca59f5,0x6780d28c),LL(0xc5672db7,0xb1f51778),LL(0xe64c87fb,0xc295e9dc),
+ LL(0x6a759ba8,0x43aa71ca),LL(0xed6e67a5,0x296cde1c),LL(0x2481f6c7,0x97eff2f8), LL(0xee4bf211,0x311c89d7),LL(0x20c5e8fb,0xa03cf7db),LL(0xa30c9a13,0xf181425c),
+ LL(0xef8041bd,0xe9164a69),LL(0xf14e75d4,0x10616709),LL(0x31432c48,0x3d0fda80), LL(0xedfce733,0xff34f02e),LL(0x97785106,0x47e53d79),LL(0x0c42b429,0xb73df841),
+ LL(0x16d00d56,0x430590ae),LL(0x0b6db145,0xb36bf8a4),LL(0x631b8af0,0xf0fbf1b8), LL(0x7c97735a,0xd285813a),LL(0x233bbcb4,0x3be81538),LL(0xece4421e,0x5dce4f9e),
+ LL(0x115acbd2,0xdf3aafe8),LL(0x4e168fd2,0x01352bc5),LL(0xafcfd633,0x7948b02b), LL(0x559eebfe,0xd8976862),LL(0x8de4fafd,0x752a202a),LL(0x47600461,0xf9964960),
+ LL(0x45629c12,0xd8e2a4f5),LL(0x0e8d9c56,0x53d8b1f9),LL(0xce8a7e4b,0x69f85fa3), LL(0x50234689,0x78e35e04),LL(0x8ffbcfd7,0xe0274e82),LL(0x0c75b636,0x3bed2d8f),
+ LL(0x373fcc37,0x5ad6f7e7),LL(0x347b8ead,0x3ae4bbd9),LL(0xdf9414dd,0x3ef24805), LL(0xed9355e0,0x5d655d51),LL(0x12d96970,0x93e831a1),LL(0xa1cc5116,0x9d02f97d),
+ LL(0xc8216057,0xad5bc00d),LL(0xa7efc99a,0x7aa8806c),LL(0x63fe1b91,0x1abc67a2), LL(0xe3315539,0xdcef61b3),LL(0xbd3f1ea2,0x31a563f8),LL(0xb76036c6,0x86e84857),
+ LL(0xc967c01d,0x22a2bca9),LL(0x6184d879,0x15300b29),LL(0x24018b6c,0xcb4eece3), LL(0x4bebca46,0xee715ca1),LL(0x0bbbd9c5,0x8d9daf6a),LL(0xd918c1bd,0x683a7647),
+ LL(0x53eb0ffd,0xeda60e7d),LL(0x71a51e14,0x537aefa1),LL(0xcd7ff005,0x7927da15), LL(0xf7f04011,0x6191e2df),LL(0x4bba4547,0x7bedb9cb),LL(0x89b2a74a,0xa50562a9),
+ LL(0x606c84ad,0x17eb0b47),LL(0x7c97dbb9,0xab88aa51),LL(0xd1818d8b,0x07ea03ae), LL(0x9374b72b,0xf73e2f04),LL(0x86858702,0xcb29129c),LL(0x98608a71,0x3620afda),
+ LL(0x716a5874,0xb810b51e),LL(0xa889add3,0x9ec17162),LL(0x19089d83,0xfd276227), LL(0xbb1c7343,0x063aee05),LL(0xe784bbe9,0x87cb9fc6),LL(0xd7489e40,0x782d098e),
+ LL(0x8f090898,0x7c43b0a9),LL(0xbdca71ed,0xf8f3b085),LL(0x3f9f4e6e,0xc9b19fd1), LL(0xc47961e6,0x6e42f7f0),LL(0x31020f60,0x45aaf72a),LL(0x2550f424,0x661616e1),
+ LL(0x20db7e4a,0xb16f561f),LL(0xa4281dd3,0x83f2a22b),LL(0x43f5d715,0x31f11530), LL(0x1a9f9532,0xbb3cc73e),LL(0xf1fe503c,0xe86e672b),LL(0x6997be05,0xf4c9b96c),
+ LL(0xe3cb641a,0x4b0bb45e),LL(0xb5ddb389,0x741adc8d),LL(0xbc920f0d,0xd87c5699), LL(0x15b6ef33,0x55bcf8a4),LL(0x1245ec9c,0x68eb1b09),LL(0x4c03f712,0x7b692b42),
+ LL(0x829adb45,0x835194bf),LL(0xe4bd2b50,0x5f3fed6a),LL(0xfffe5c2e,0x32e24c5e), LL(0xb9a052b8,0xed361d44),LL(0x0b43353b,0x512fea09),LL(0xd5a71bbb,0x1d35cd1f),
+ LL(0x05b5e6d9,0xba48388b),LL(0x3b0b203b,0x07136b21),LL(0x765b8607,0x8ab4af31), LL(0x74816f5a,0x5107c05c),LL(0x4a5d27b7,0x8d7cfad6),LL(0xd9c2aa8d,0xbc507c9c),
+ LL(0x467fe1f2,0x6ed919c9),LL(0xfb1bf823,0x9a75c404),LL(0xfefebd90,0x5eff17b8), LL(0x521a3668,0xa8b6ed77),LL(0x251c6e8c,0x0f8b8ae7),LL(0x631669c0,0xe45c3453),
+},
+/* digit=27 base_pwr=2^189 */
+{
+ LL(0x65fd193b,0x443763e3),LL(0x98d2ccd9,0x23523a88),LL(0xff0d967e,0x0a6f8f92), LL(0x009db3b0,0x1263e468),LL(0xbd562f47,0xee4dc8c1),LL(0xafc849c5,0x76f03c5c),
+ LL(0x99bd9bfe,0x8d976c26),LL(0x58ed4760,0xb19a85a7),LL(0x1e34868e,0x13dca814), LL(0x54cc6d8a,0x056e40ad),LL(0x8fcf3241,0x861dc2cf),LL(0xd3afc6cd,0xa6a8a21d),
+ LL(0x7b77442c,0xe6eeae3d),LL(0x8aa82aef,0x057453a1),LL(0x9a9a0869,0x5a1dd863), LL(0x8372157f,0x15b34a60),LL(0x892b8e9a,0xc35f2257),LL(0xcdd030f9,0x0476b29a),
+ LL(0x490b43e5,0x1f623ab9),LL(0x6d3b5faa,0x0fb153e0),LL(0x126be417,0x11ecf7af), LL(0xf9d44cdb,0xc5588fe3),LL(0x80576c99,0x93bd13f4),LL(0xf7cca387,0x458f50aa),
+ LL(0x05cadd86,0x33e0840f),LL(0x1288d2ab,0xa4ceb96c),LL(0x2574cecd,0xf18de0a1), LL(0xbd606235,0xb1eecb58),LL(0x243a5639,0x46f1c0e3),LL(0x2f8617f4,0xfbf9ada6),
+ LL(0xfdc33e8a,0x29778c36),LL(0x7c7a4b81,0xe96d19b3),LL(0x87bd6ef2,0x011f2a94), LL(0x7b36e1c8,0xd84b0388),LL(0x6e6d91ea,0x5f21366d),LL(0x670039fe,0x0c884a47),
+ LL(0x5485e744,0xdff19ddb),LL(0x826523ab,0xb626116c),LL(0x10d50cd3,0x2f4f0fd8), LL(0x24125350,0x5dfd1acb),LL(0x53f2ab5e,0x09c128b0),LL(0x4f9b2256,0x9f940ced),
+ LL(0x917ef295,0x347c7bb6),LL(0xe7525a0c,0x3578fbbf),LL(0xdaade6c5,0xd64bdb43), LL(0xeff35295,0xdb9014a1),LL(0x8bd89301,0x1c18a193),LL(0x8573ec51,0xccd8059d),
+ LL(0xff89a745,0xd263620d),LL(0x8b578c94,0x485093e4),LL(0x831165c3,0x6cc8df06), LL(0x72a1e4bb,0x623c1f86),LL(0x1ae4359b,0x1857c157),LL(0xf8c83db9,0x51252b88),
+ LL(0xf3eaa85f,0x75c0f153),LL(0x296331ba,0x8524e8a3),LL(0xf153b5e3,0xbdfb652d), LL(0xf3645389,0x650adac3),LL(0xe5150ccd,0x59382d93),LL(0x40e57d00,0xf3310865),
+ LL(0x3135c8cc,0x43c89d80),LL(0x8ef6e51f,0x5f0b989e),LL(0xe67cd4d4,0xc6b0f722), LL(0x2433fada,0x35eb83b7),LL(0x688247c4,0xb18db37b),LL(0x51703d00,0x0a444f19),
+ LL(0x57840670,0x8361e5ab),LL(0x42af05a2,0x4f46eb2d),LL(0x4520d223,0x34632e05), LL(0x66bdbe8a,0x4aa80691),LL(0xb5742363,0x467d5d3a),LL(0x0894ba88,0x5af9783e),
+ LL(0x0cb7f96b,0x84644ff9),LL(0x522d6aaf,0x0ae33ac3),LL(0x2cc8944b,0x017c4b01), LL(0x6a2ddda6,0x9923bca6),LL(0x8c9b621e,0x6627fcc2),LL(0x17bdfa4f,0xa29f1b1e),
+ LL(0x1cad89b6,0x534ff925),LL(0xc2042459,0x0863e52b),LL(0xaf25d3a6,0x5306b082), LL(0xbbbd9f5b,0xabb1a0b0),LL(0xb65cde23,0x7e3bd9f2),LL(0xc228a0ec,0x001c50b1),
+ LL(0xb9339a10,0x86cb78d0),LL(0x1caa6cdf,0xa4b51028),LL(0x21d335bb,0xc52bad81), LL(0xc2fe7de5,0x4301dba7),LL(0x7d6b198e,0xc7b39fd3),LL(0x2a96f21b,0x28e0fdea),
+ LL(0xbabe8679,0x59373e25),LL(0x9fd9ed30,0xd44cef09),LL(0x58210099,0xfafb37c0), LL(0x1174c9f1,0x19aea5a6),LL(0xaa0d14c2,0x95527d4f),LL(0xabaf1d12,0x3f19e7e2),
+ LL(0xcb8a82f6,0xe6d77312),LL(0x63ded2df,0x1e5c2945),LL(0xa2eb913f,0xe6eba908), LL(0xd2a8cdaf,0xe7a562f9),LL(0xa209420a,0xc659bdc9),LL(0xc59d4edf,0x9d016dd4),
+ LL(0x74da1b13,0x4bdd6da2),LL(0xe9df9fa8,0xcdee393f),LL(0x2e6bac46,0x64890274), LL(0xb2d61427,0x8843a6bd),LL(0x6efc5b51,0xfd6c2073),LL(0x035128e4,0x12029497),
+ LL(0xbe06abde,0x680d1bf9),LL(0x452f6c1c,0xb37decb2),LL(0x6ec32edc,0x981e840c), LL(0x84360e72,0xd5257167),LL(0x18300091,0x558abf57),LL(0x72ecaad4,0x3a7b592d),
+ LL(0xf7312883,0xcdc53ab7),LL(0x0571634d,0x69af637c),LL(0xc7cc70ca,0xec10a5e8), LL(0x424399ce,0xa90c48d4),LL(0x341ddfbc,0xe05856ae),LL(0xd3e4c39c,0x3a1976b2),
+ LL(0x90220209,0x9ed5893d),LL(0x81b6ced6,0x45ae0a2a),LL(0x546a8d70,0xe929ce12), LL(0x455cdddf,0x267c3d5b),LL(0xcea5169b,0x4d9fa92f),LL(0xe94a3b42,0xb925af46),
+ LL(0xe118cce2,0xe404af85),LL(0x8fc5766e,0xd5a91ab7),LL(0x5e924307,0x71c251eb), LL(0xf7a25052,0xe3cb6d55),LL(0x18b850c9,0x968fed5f),LL(0x2174cb4b,0x623893ba),
+ LL(0xd3d0e873,0x67d096e1),LL(0x2541a85b,0x4487615c),LL(0xfa518d4c,0xe87a5c0f), LL(0x8371fee6,0xb0b2a717),LL(0xf0d1d1fa,0x0c2e5455),LL(0x11189a5d,0x42cf786c),
+ LL(0x0075ca1a,0x6477d9cb),LL(0x0bada61a,0xff28d896),LL(0x7d671caf,0xea81a421), LL(0xe5e640ea,0x40762d23),LL(0xd43891af,0xfda94df7),LL(0x527b4662,0x6349fb9b),
+ LL(0x3b2603b3,0x3b5ff95f),LL(0xf23c44e6,0x6b633ea1),LL(0xe90ab3cb,0xb54db154), LL(0x37f6bcde,0xa92deb1d),LL(0x4eb88b8c,0x7b328bf5),LL(0xde5545e4,0x4ce336ee),
+ LL(0x1750434d,0x072846ed),LL(0xef744765,0xef46faee),LL(0xf439980c,0x7a858840), LL(0x6aecf70c,0xec75222e),LL(0x1a4ef06e,0x2ece8f59),LL(0x3d233bad,0x82784973),
+ LL(0x3b3b6956,0xaee6f0e5),LL(0xf4eb1f77,0x04ceab91),LL(0xdcbb09d4,0xc6977800), LL(0xc8203c8b,0x8948d95e),LL(0x4f31a369,0xa354e6e3),LL(0x42785a63,0x10e7ebf6),
+ LL(0x426a2da6,0x5c233e59),LL(0x5aff8031,0xfc7c21ac),LL(0xae2b7618,0x713ae9f6), LL(0x8ffa178c,0x958babfe),LL(0x404c1ece,0xb21fe414),LL(0x1e4f7c28,0x1fd8cf6a),
+ LL(0x482a1f04,0xb68bc919),LL(0xfbee302f,0x7ff1f4be),LL(0x6f98c545,0x5d510b76), LL(0x04a84a52,0x0a54942b),LL(0x8d306d4d,0xdc70958c),LL(0x638a365c,0xd5564cd0),
+ LL(0x295ed5b7,0x7275aaed),LL(0xa7a642b1,0xc6c05b8a),LL(0xa499ac12,0x5572818c), LL(0x038c961d,0xdf0a6fa3),LL(0x798ec56d,0x7ed5630f),LL(0x4acc0009,0x206c39e3),
+ LL(0x63cc9e62,0xc371e275),LL(0x6e06e663,0x425ae991),LL(0x155a4978,0xa2aa623a), LL(0x82b7846e,0x021e0916),LL(0x07ccc4b1,0x0500f013),LL(0x891bba46,0xd62661e5),
+ LL(0xd612756b,0x38909c56),LL(0x090f7ae5,0xd362d7a3),LL(0x9a871772,0xaf3ba39c), LL(0x575c94d9,0x28dfce6b),LL(0xfaf575ae,0xb556c52c),LL(0x710956bf,0x6c0131b7),
+ LL(0x071961ab,0x33ce3aed),LL(0x69b35991,0x226aa630),LL(0x2398b3af,0xc42f173d), LL(0xfc2e6625,0x5d4d9cca),LL(0x4790b7b4,0x767e6911),LL(0x184e1458,0x81a0782f),
+ LL(0x4a451326,0x77aab96a),LL(0xe916fe1d,0x8ba50ba3),LL(0xea83134c,0x4e839eec), LL(0x10e0b57b,0xc1f0f693),LL(0xe2b978ff,0xfd32f86a),LL(0x207746dd,0xa4737150),
+ LL(0xa3db3bbd,0x454c0df4),LL(0xb0f36f88,0x0edad6a0),LL(0x5dcf2b92,0xe233816f), LL(0x53dab969,0x25098373),LL(0x102254b6,0x436f8133),LL(0x4eedcc6f,0x9ce8f3ae),
+ LL(0x4b60ac27,0xf64e0fad),LL(0xe3f9cebf,0xea44c9f8),LL(0x84fe9a3a,0x719d958b), LL(0x27bf9bd3,0x5a5e47e8),LL(0xf50de48a,0x6f8c6ee1),LL(0x1971c6f2,0x5dc81c5f),
+ LL(0xe435f073,0x1e41a11d),LL(0x49ef9817,0x7b20a534),LL(0x111d8548,0x1ab1fb5a), LL(0x43450972,0x40d481ef),LL(0xddcf8585,0x28382f8b),LL(0x1b0f6b65,0x5a75f9e6),
+ LL(0xb1f8052b,0x41ac6def),LL(0xff4c9377,0xc417b22b),LL(0x3ba0240f,0x1c7a1067), LL(0xc99883cb,0x61005fe1),LL(0x6433295e,0xde900b52),LL(0x97d9ccb1,0x1eb1f666),
+ LL(0x65928ad1,0x86410ced),LL(0x05383f3a,0x281a9d46),LL(0x11cdecb0,0xa2b718a9), LL(0x6fb1cbee,0x67043aa6),LL(0x94dc2a31,0x5e2de7f3),LL(0x18e2d13b,0x7796cacb),
+ LL(0x413f1989,0x18e05e2d),LL(0x3e5cc915,0x2b2b27e9),LL(0x8836a712,0xa32587cf), LL(0x34c64b87,0x0cf77bb0),LL(0x6cafe545,0xf4d7f7ca),LL(0xa18bc173,0xf2191e2f),
+ LL(0xaf600892,0xc338b3de),LL(0x35ee6915,0x43c76ec6),LL(0x5564fc33,0x4fdad82e), LL(0xd93b474f,0x089a676d),LL(0x62b06515,0x44a02780),LL(0x2067dba5,0x65fe8051),
+ LL(0xf6549736,0xf1c24fd9),LL(0xc063acd4,0xf9d94656),LL(0x95a57c69,0x20c24772), LL(0x8993633e,0x91f7d4d6),LL(0x4444d45b,0xe9d75b4d),LL(0xb5bcc9cf,0x3b5a8bf8),
+ LL(0x1b093e28,0xf93e1494),LL(0xfcd88fcf,0x8ce5f30d),LL(0xbfcff34f,0x8fe20824), LL(0x7eec26d2,0x23a22164),LL(0x72404851,0x9b0f8456),LL(0x0e6c550f,0x135ff4a9),
+ LL(0x6ef7ad8c,0x70a42efc),LL(0xd82f0cec,0x2f6af7cd),LL(0x7a83b569,0xa0e0549b), LL(0xd3adf095,0xf580e86c),LL(0x8712a121,0x3c2d891a),LL(0xb9d07525,0xf1f2cd22),
+ LL(0x461ab8fe,0x7e90bc98),LL(0xc3e7e4df,0xf27a52f3),LL(0xe71da883,0x99813684), LL(0x5c5d56d6,0x2bc98a5a),LL(0x9d789345,0x17248209),LL(0x7dd92590,0x3312dfe6),
+ LL(0x26c45ea7,0xfeb5bd64),LL(0xea91cffa,0xfd9bbc06),LL(0xb59f6e6f,0x8be51e9c), LL(0x12663168,0x2082f3c9),LL(0xb78ce9a5,0xe57a2832),LL(0xe4f54287,0xb0d7aac6),
+ LL(0x338a630c,0xdad61bc3),LL(0xe66f4efa,0xcffda1bb),LL(0xa61cc9ef,0xccb2e20e), LL(0x3e09551f,0x8d2efcc4),LL(0x617bb37e,0x4e8f46b8),LL(0x2d9b4751,0xc516bc0f),
+ LL(0x8992f590,0x753b4f58),LL(0x994a51af,0x55461379),LL(0x0d16de56,0x9f0a37e6), LL(0x204a2e7c,0xb346ff69),LL(0xce235822,0xfaef890d),LL(0x98b923c7,0x5b046b64),
+ LL(0x29e950a8,0xb55daedf),LL(0xd3a1ff37,0x79b58c3a),LL(0xec3ed694,0x72c9d2d9), LL(0x9ddf8225,0xd119d76b),LL(0xce66c9a2,0x330952af),LL(0xb0e5e0dc,0xe062e16a),
+ LL(0x2d1cc8bd,0xe8cd1c24),LL(0x799a5052,0xf2f0da35),LL(0xbe0be8af,0xe52e337a), LL(0x6a2cbabf,0xeae205cf),LL(0x0acc8002,0xdddc1a94),LL(0x3d1031df,0xf559ec0f),
+ LL(0xefc11888,0x5d22ffc2),LL(0x4ff02455,0xdbb1c1ef),LL(0xc63b8f6f,0x543b4752), LL(0x883a7c99,0xd08ef2e5),LL(0xf38b3b3c,0x58ac93a0),LL(0xd8cac2ad,0x3c6c8105),
+ LL(0xdf1587c5,0x538bffc6),LL(0xa1a2eb88,0x0d5a4dd0),LL(0xc155f055,0xb9730932), LL(0xb9b8cd61,0xa21c36d2),LL(0x5320c28d,0xc435c223),LL(0x38120687,0x3230ce02),
+ LL(0xc37ce54a,0xea0530df),LL(0x06b232a0,0xb1894861),LL(0xf018336a,0xca2122b1), LL(0x38a380e9,0x08135d85),LL(0xe3028bd7,0xf256c6e5),LL(0x663fdf24,0xdacc9271),
+ LL(0x053cff11,0x31da52c7),LL(0xcc61252b,0x39051bad),LL(0x317a0ba8,0xf380f3e8), LL(0xd42451b7,0x212de129),LL(0x98e4747e,0x146f3c25),LL(0x2acac2c4,0x844da479),
+ LL(0x4cabc97f,0x9b8a6fb0),LL(0x0fbc8135,0xba6da1e3),LL(0x561f0e02,0xb076c93d), LL(0xf54d9d7d,0x2f940cf1),LL(0xec9daef2,0x14a542cb),LL(0x19d5ffa1,0x0579ad14),
+ LL(0xd4065d34,0xf8f179dd),LL(0x30ff0d6d,0x355fc75d),LL(0xc8fac2e6,0x91f6f5fb), LL(0x3e3fd917,0x8baf55f3),LL(0x077d4cef,0x6c4a7378),LL(0x192e1ce6,0x16be9fa8),
+ LL(0x92e5aec0,0xa3a9011c),LL(0xf37a5ab0,0x4fa0764f),LL(0xb1e1e01a,0x75ffe5ac), LL(0x51756cb8,0x3cd4ee19),LL(0xe2636498,0xc557a98c),LL(0x2c691a68,0x53a49769),
+ LL(0x752dbe26,0xdcdf8e6f),LL(0x7564740f,0xeaa9a260),LL(0x31a5df7f,0x9298d7e2), LL(0xa1b1f37a,0x47cdc94f),LL(0x3c25a836,0x26578ece),LL(0xec817acd,0x0aab1d74),
+ LL(0x5911f2ae,0xdd0678c2),LL(0x126b83a4,0xb903d7a7),LL(0xecd46d83,0x4efeef39), LL(0xb0d49ea1,0xbb4b0af7),LL(0xb6c2ae9c,0xc62fa8f1),LL(0x3e453617,0x897a8d06),
+ LL(0x54820219,0x335e7a19),LL(0x9104367e,0x8ae7926b),LL(0xcf0f8e5e,0xae2225b5), LL(0xd3fddb3b,0xc276e1af),LL(0x6a507a40,0x7b05028e),LL(0xef73bdac,0x85d2bd18),
+ LL(0xc71dd981,0x6953e0e2),LL(0x0e9a352f,0x7f739d63),LL(0xbe280f30,0xb6620388), LL(0xd020979e,0x89d5450f),LL(0x66d59c07,0x0370df8a),LL(0x0e91d327,0x76a60330),
+ LL(0x12f802fb,0x56161a39),LL(0x2ca0151f,0xe9e9e58c),LL(0xde14a0f7,0xc6da98d6), LL(0xe70f9647,0xdc21514c),LL(0x523f5cb8,0xa95c863d),LL(0x25f1c818,0x3e1cc20c),
+ LL(0x8d6f8ca1,0xeb6c9c82),LL(0xb9d65ec1,0xc57e3312),LL(0x0f121596,0x8b4328c3), LL(0x067036a8,0x1affe768),LL(0xe3091467,0x42586aa8),LL(0x30b7ad74,0x12de5d18),
+ LL(0x34933969,0x06705f70),LL(0x7267ab88,0x4ce99cd6),LL(0x1f916ab1,0x2bc4cfb9), LL(0xcd9b8de7,0xe458fea7),LL(0xedafc50a,0x59778ef8),LL(0x86ea0de9,0x58651c07),
+}
+};
+#endif /* _DISABLE_ECP_192R1_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_nistP192r1_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 7,
+ /* select function */ p192r1_select_ap_w7,
+ /* precomputed data */ (BNU_CHUNK_T*)ec_p192r1_precomputed
+ };
+ return &t;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpp224r1precomca.c b/ext/ipp/sources/ippcp/src/pcpp224r1precomca.c
new file mode 100644
index 0000000..8232f38
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpp224r1precomca.c
@@ -0,0 +1,4488 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (P224r1 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (224)
+#define LEN_P224 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* P192 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P224];
+ BNU_CHUNK_T Y[LEN_P224];
+} P224_POINT_AFFINE;
+
+extern const __ALIGN64 P224_POINT_AFFINE ec_p224r1_precomputed[33][64];
+
+
+#if defined ( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_224R1_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+#if ((_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LP64) || (_IPP_ARCH == _IPP_ARCH_LRB) || (_IPP_ARCH == _IPP_ARCH_LRB2))
+const __ALIGN64 P224_POINT_AFFINE ec_p224r1_precomputed[33][64] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0x6d0a4aea,0xbc905226),LL(0x6018bfaa,0x85259736),LL(0xf96bec05,0x6dd3af9b),L_(0xa21b5e60), LL(0xeff3ede8,0x2edca1e5),LL(0x05335a6b,0xf8cd672b),LL(0x03dfe878,0xaea9c5ae),L_(0x614786f1),
+ LL(0xe722ff54,0x4ca9a1ec),LL(0x5650df9b,0xd704f84f),LL(0x2a0f1689,0x10c911f7),L_(0xcafb50f5), LL(0x95a24e5e,0x02aac79b),LL(0xc90ae186,0x518c11b1),LL(0x76cc101a,0x0c84ced0),L_(0x5cabb880),
+ LL(0x86614a9a,0xe37710d7),LL(0xe0b02223,0x24c17ffc),LL(0xc3cf1c5b,0x00505bb6),L_(0xaf8b6496), LL(0x73e4e25d,0x9a73b173),LL(0x04144e62,0x70501632),LL(0x357940ac,0xafe10c35),L_(0x6dfa492c),
+ LL(0x840f10e9,0x0a72faf6),LL(0x0860856c,0x3c2dbf31),LL(0xcb021706,0x4256e88a),L_(0x89f0c6a0), LL(0x8c1f2b39,0x6743e273),LL(0x98933269,0xd8933d1c),LL(0x2058f0ba,0x7ee104d3),L_(0x8c87db62),
+ LL(0xd42fac58,0x0b10cc50),LL(0xf8dfc283,0xd80cdd0a),LL(0x975a451e,0x39211b77),L_(0xf7f4fe95), LL(0x64fade9e,0x2b552e73),LL(0x61a9e695,0x5e5610f3),LL(0x11bcf038,0x42b54f79),L_(0xc858da82),
+ LL(0xde4901db,0xde577c0d),LL(0x1a8aec73,0x09e4f789),LL(0xe0cd01d4,0x1addb3a1),L_(0xf25fe17c), LL(0xdc7c211c,0x5fae6c32),LL(0x0f5c7709,0x5603672c),LL(0xf2d2c41c,0x9b6731a6),L_(0x162f9e1c),
+ LL(0x899abac2,0x90462820),LL(0x68646e35,0xc6adf683),LL(0x1e2526ba,0xc81df812),L_(0x7ed50814), LL(0x5dd6407c,0x610f2185),LL(0x1fb32889,0x3f3879aa),LL(0xed8ceeee,0xce5eb25e),L_(0x0e5952e3),
+ LL(0xde1707ec,0xb4c9d865),LL(0x7bd696a2,0x3fcec855),LL(0xa3bebfe9,0x8e4a5712),L_(0x1b59038c), LL(0x29a5f205,0x1bc1ff36),LL(0x7558734a,0x0efc11fd),LL(0x09762590,0xc4e19066),L_(0x2199c364),
+ LL(0x7b94d3c7,0x1c1ecc77),LL(0x743eda4a,0x23767b5f),LL(0x2f993a50,0x94f5e9ba),L_(0x79d4095a), LL(0x8f776409,0xe07e55b6),LL(0x909bf3f1,0x2b57fa61),LL(0x77e1db6d,0xe733d627),L_(0x5114ac9d),
+ LL(0xa53cb542,0xb808145c),LL(0xb4f2672c,0x8d51557e),LL(0x3e8abf6a,0xc1f86e2c),L_(0x9d0cdd53), LL(0x8dd67e37,0xccddceff),LL(0x02883b6f,0x94892c1d),LL(0x873d7e4c,0xdbc0f8ee),L_(0x2a687506),
+ LL(0x6c6825d9,0xac358ca8),LL(0xe1bdd5ca,0x71f50674),LL(0xd0dee306,0x0f060758),L_(0xd6d89093), LL(0xf1b7227e,0x649ea142),LL(0x08181c2c,0x87d166a2),LL(0x6c63713a,0xc1182bf0),L_(0x45e48d79),
+ LL(0x8f86d9da,0xf6495da1),LL(0xa37b7441,0x5dc634c9),LL(0x2b0b8e1a,0x571d38d9),L_(0x517af941), LL(0x92dd72b5,0x1305b612),LL(0x8cf21835,0x8db28ab1),LL(0x5f59deb1,0xbc243af0),L_(0xa71404ae),
+ LL(0x3a1f6a38,0x489c8db2),LL(0xffbe563f,0x4943a5ae),LL(0xbc99fb0b,0x68ade63c),L_(0x398eacf0), LL(0xed549cc4,0x83fdacb5),LL(0x800df824,0xb6ab4a8b),LL(0x442ed616,0xb4dc6bf8),L_(0x3f8060b4),
+ LL(0xb83ee7d6,0xf4109221),LL(0xcdbd6eec,0x565559e4),LL(0x1ef814eb,0xf4550d2e),L_(0xb3a9b5e4), LL(0x6d218d7b,0x1544e90e),LL(0x3f51f9f9,0x31b0bc68),LL(0x825b5795,0x6516bbc3),L_(0x3d1419d2),
+ LL(0xe977f339,0x55bfd519),LL(0xb16ed1af,0x5cd307d1),LL(0xd91345bb,0xc5e26f62),L_(0x64a35d22), LL(0xa243f1ee,0x05015842),LL(0x70203aa0,0x6fa10db3),LL(0x05a83a63,0xdaf3972b),L_(0x9422f10e),
+ LL(0x73b437e2,0x6a4bd1f9),LL(0xb3f66de6,0xbb0f749a),LL(0xfdf9a0e9,0x471a2a7f),L_(0xb9c51b5f), LL(0x44574243,0xfa29681a),LL(0x9c409bd0,0x9522774b),LL(0x169405c3,0x48be80cb),L_(0xf22d3fc0),
+ LL(0xf845831a,0x86ade48b),LL(0x79cec3fb,0x473e361f),LL(0xb9622253,0x5523244b),L_(0x538d543e), LL(0xf8570c03,0x12bb38bf),LL(0xb4e20b8c,0x784e1b25),LL(0xe6873448,0x2a2e7758),L_(0x2954321a),
+ LL(0x47b54bc5,0x3591891e),LL(0x27a72a86,0x3ca319e3),LL(0x482460f6,0x70114363),L_(0x3b204e52), LL(0xcca0ee1f,0xd5f98053),LL(0xc4a1a96b,0xd84149c4),LL(0x0c0e97bb,0x6bc4b6e9),L_(0xfb212c8c),
+ LL(0x1bfad739,0x716b6add),LL(0xea007122,0x0e68b721),LL(0x08a75056,0x4e35e1f6),L_(0xe28f8fa3), LL(0x93c21468,0x7393ad16),LL(0x4e27959e,0x4533e928),LL(0x433c708d,0xe5b33144),L_(0x4c003b64),
+ LL(0x32804a04,0xc57bd47a),LL(0x238addb6,0x5ae81313),LL(0x703c82d5,0xa0691b17),L_(0x14a5d58e), LL(0x825037c4,0xf9cefcb5),LL(0xfd4764c3,0x38e801b7),LL(0x7b23c9fe,0x23cf8d21),L_(0x1d7b0c07),
+ LL(0x8738f5d4,0x869c61a1),LL(0x8d8b998b,0xe83f1dc1),LL(0x5cc8116d,0x1f271989),L_(0xa8992ade), LL(0x88f6e037,0xb2334f8e),LL(0x1fadf19a,0x9fcaafe1),LL(0x71d5904e,0x939bd9ec),L_(0x534ec549),
+ LL(0xa2cbcd92,0x22be0a44),LL(0xb12549d7,0x275cd50c),LL(0xb64feadd,0xfa13b698),L_(0xd61f5f42), LL(0xedfc9326,0x7ea2fed9),LL(0xd797283d,0xdbd2171d),LL(0x5e1f2529,0x113c4da8),L_(0x4d22be7a),
+ LL(0xd7a234b5,0x746daf5f),LL(0x210782c4,0x8d13c8a1),LL(0x358ace9d,0x1008fd0f),L_(0xaf231c63), LL(0xeedf77aa,0x17203da0),LL(0x3534d554,0x0974abbe),LL(0x30962d48,0xf7552ee7),L_(0xa1ab0080),
+ LL(0x77890e5b,0x7708ee68),LL(0x981a94f1,0x624e8fe3),LL(0x50822536,0x2632b017),L_(0x21031b41), LL(0x0b603325,0xa43cc164),LL(0xfb24577f,0xc20ef5b2),LL(0x67a5fdbd,0x583ccbb4),L_(0xdf198e9a),
+ LL(0x2390b30d,0xec729f5b),LL(0x347bddd0,0x5467eb45),LL(0x4576657b,0x79a42c59),L_(0x3a4d5c62), LL(0x871cf39c,0x72672c8d),LL(0x34edf6de,0x22af9ec1),LL(0xc615c176,0x264b7c52),L_(0x6b6c91f7),
+ LL(0x3dc0652c,0x3c93deb4),LL(0x454fe5e1,0x83476556),LL(0xdaedb455,0x895933d6),L_(0xc3d92afc), LL(0xbabeca3c,0x62afc582),LL(0xb1ad4196,0xd877f8d1),LL(0x122626f8,0x56df6aa3),L_(0x88c5db33),
+ LL(0xc8d94c12,0xb5862dd8),LL(0xfb7f7ec7,0x3488de74),LL(0xf9ca08fd,0xf3fb356b),L_(0xa3379ec2), LL(0x27d39af3,0x5680ab94),LL(0x1f4b780d,0x4aa3a013),LL(0x181ad0f0,0x9c77acf2),L_(0xc5ed6c19),
+ LL(0xa57812ca,0x57cdf956),LL(0x2e235ce3,0xec26e698),LL(0x3b66736f,0x02924c24),L_(0x9611c7f6), LL(0x20dcabee,0x2cd39c40),LL(0x0ca01257,0x6c0fb396),LL(0x36cea89c,0x576c9d6d),L_(0xc0386b9b),
+ LL(0x69c717f0,0x3ff1d620),LL(0xb26ad028,0x975088a3),LL(0x3395a449,0xbb9b7453),L_(0xac8575b5), LL(0x0cb11f18,0x19b52294),LL(0x61b7e04c,0x84cd1038),LL(0xea595a3a,0xb7e04864),L_(0xf641867a),
+ LL(0x68c289a6,0xf9c67812),LL(0x0d5cd555,0x64da8983),LL(0x15609314,0x071a1814),L_(0xcec729a1), LL(0x2725b13c,0xd82b0a63),LL(0xe9fd6113,0xba49569c),LL(0xf4a523e8,0x095fdd3b),L_(0x601388e8),
+ LL(0x382f2331,0x5d150588),LL(0x6e0c12f8,0xabac1d43),LL(0xcc4b0247,0xe25d613a),L_(0x98b62cd3), LL(0xc09181c3,0xca8e4ca9),LL(0x1f7fb23f,0xae6dcc27),LL(0x41da9f53,0x44527d49),L_(0x9e1f47c6),
+ LL(0xbf5c291a,0xb17f74ec),LL(0xe460275b,0x7fe47107),LL(0x56dc0e69,0xaef13524),L_(0x055bebff), LL(0x85eeba4b,0x5a0a6115),LL(0x52aae002,0xd72b6016),LL(0x65c91bf7,0x55229ca9),L_(0x837c7497),
+ LL(0x05073659,0x724287d6),LL(0x86eb5493,0x266f1738),LL(0x70786420,0x72b46e9e),L_(0x0bd8afe8), LL(0x2e7a6b37,0xeea543b6),LL(0x7400cd52,0x1221cd6e),LL(0x0a6c2e1c,0x9604a54b),L_(0xe2c2c60a),
+ LL(0xaacc2f1d,0x771d897e),LL(0x80cd8b3c,0xa4304d46),LL(0x3b961927,0x56c6e625),L_(0x8d0c1d5a), LL(0xf0576bd1,0x4b4c8802),LL(0xee49b988,0xd528b6a1),LL(0x617aabd8,0xb63d84cc),L_(0xb309e31a),
+ LL(0x21a4d862,0x6ef3ab05),LL(0xfbca1b97,0x7fe6fa59),LL(0xd8911f8e,0x639e011c),L_(0xb731d607), LL(0x654578a1,0x0706cd08),LL(0x8e5b6703,0x5d08a7fc),LL(0x4d443d17,0xdc2ea468),L_(0xccc5dbca),
+ LL(0x2986a64c,0xf86e4ee6),LL(0xb38b3cb9,0xb2a50e4f),LL(0xd001bff6,0xad920b0c),L_(0x5f833048), LL(0xceab268e,0x3c687112),LL(0x9cac7077,0xb6207b74),LL(0x2bf74e82,0x92b4f4b1),L_(0xfcfe6f73),
+ LL(0x4a1a48c2,0x9afdccc1),LL(0xf2645ccf,0x9befe15b),LL(0x170bc3de,0xc06a289b),L_(0x8b3174cc), LL(0xcb55af1c,0xc289c4c5),LL(0xfcbc66cf,0x73ec1671),LL(0xea32e7fb,0xfdc7bcec),L_(0x2d89d32d),
+ LL(0xc3672949,0x31801b58),LL(0xcf102dd0,0x2e36c7e0),LL(0x28f8286a,0x1600629e),L_(0x6d3edc02), LL(0x16920812,0xf21cabe6),LL(0x31851ac8,0xf3657a9a),LL(0x037f5693,0x3f33781d),L_(0xb0a0ce6c),
+ LL(0x15c4b334,0x4821f125),LL(0x43b3629d,0x3a678868),LL(0x33190540,0xa3b32151),L_(0x4038845d), LL(0xcf5706d9,0xedfaa06c),LL(0x00044014,0x08de20a4),LL(0xd5eb20d6,0x1a8a108b),L_(0x38cb0a6b),
+ LL(0x15f2ae4d,0xb6e363d4),LL(0xa45c3df2,0x80d28480),LL(0x00c26ab1,0x85098966),L_(0x6d03e325), LL(0x36056e89,0x8eec84d1),LL(0x9134e03a,0xce2d0f6b),LL(0xbbc8d92d,0x4ffdb217),L_(0x6e97a4bb),
+ LL(0xb60e66c5,0x231d20c5),LL(0xa36c8848,0x89bcc285),LL(0xcb7e8b54,0xc4b2c9f8),L_(0x2f8b6de0), LL(0x243f2d3f,0xb8860525),LL(0xfdcf530d,0x945673bf),LL(0x49da0f6b,0xefc627b6),L_(0x4e9fb807),
+ LL(0x21bc7f20,0x64eae113),LL(0x23074bd5,0x2718ea4a),LL(0xb246633c,0xefdb4759),L_(0xc6af484b), LL(0xcdbec413,0xe5997f28),LL(0x8979b2ec,0x82bcb2f5),LL(0x530f4963,0x55ee3298),L_(0xccf127a1),
+ LL(0xba2c7ded,0x687018fc),LL(0x7c723f5d,0xcc9d7b65),LL(0x2221f721,0x93828714),L_(0x13d720d3), LL(0xe6d02ad4,0xe61c9b05),LL(0xc198db55,0x72b115de),LL(0xbe38af8f,0x621f284e),L_(0x18f09bf6),
+ LL(0x7c8299c2,0x65cd0db6),LL(0xbb33fff7,0x7d479cee),LL(0x44ac0a56,0x7a9b66be),L_(0xc9308cae), LL(0x43b7cc76,0x1b4048cb),LL(0x5b7ecc1b,0x0b2ccca8),LL(0x7fa30aae,0x7e09ad23),L_(0xff1f76e3),
+ LL(0x13e6bef2,0xa178a33a),LL(0xdd724842,0x7d66c450),LL(0xa5d7a87c,0x30befc70),L_(0x69874db8), LL(0x3ef58d85,0xcfcdbfce),LL(0xe3d6346a,0x9fa94e38),LL(0x84c65476,0xde39cef5),L_(0xe4efb3c1),
+ LL(0x5b582473,0x493ae0ba),LL(0xbc282cc0,0x8c93a914),LL(0xa024a0ea,0xfa3a15cd),L_(0x240e6a89), LL(0x572dde87,0xbba5d02d),LL(0x95b6f1e0,0x2f1b39cd),LL(0x15b8172f,0x158b8956),L_(0x5eb7385c),
+ LL(0x4b30aee1,0x92f507cd),LL(0x9137f80a,0xa95f0372),LL(0xcb924116,0x2be56c53),L_(0x0703cdda), LL(0xbf64ed3a,0x0b8faa7f),LL(0xb73eae3f,0x9943cbed),LL(0xf227ad25,0xdbca2fc4),L_(0x06231927),
+ LL(0x92d256df,0x5983f1a7),LL(0xee7ac222,0x640d13e7),LL(0x48c69cc0,0xa7dc8e21),L_(0xbd701252), LL(0xaa2ef84d,0x483083a1),LL(0xc0d30797,0x560bf32f),LL(0xd4ec2e63,0xbda6fdc0),L_(0x15074c14),
+ LL(0xc0aebb53,0x29e4a335),LL(0x600e1a17,0x155e8020),LL(0xa542f638,0x556905e7),L_(0xc7209080), LL(0xf57b447b,0x0b55b0fd),LL(0xa6cf1f95,0xc37cde3e),LL(0x9d44e115,0x1acfe880),L_(0xe820af09),
+ LL(0x08d29dee,0xc0bba382),LL(0x02857752,0x40ac12bb),LL(0x8b30f556,0xf120846d),L_(0xac6401e1), LL(0x41706845,0xcb20c290),LL(0x84fbf362,0x6005431c),LL(0xecddc9db,0xe1839421),L_(0x63952a13),
+ LL(0x93d07eac,0x24f4b135),LL(0xf0524e07,0xfc097ef4),LL(0x138ee6ed,0x1770de3d),L_(0xedc6985e), LL(0x34e15a3c,0x997ae14f),LL(0xb5a50098,0xa168adf0),LL(0x05ed2b31,0xe84702e1),L_(0x4701e013),
+ LL(0x991691d6,0xa2d01aa3),LL(0x5c0291c5,0xe3a7de4e),LL(0x87f294c6,0xdc575065),L_(0xf7c66733), LL(0x1ae8eb0b,0x236da942),LL(0xb2bb31c0,0xd46c809a),LL(0xefda656f,0x0d4ba22a),L_(0xd90a6c4a),
+ LL(0x009f6ea1,0xd7b84536),LL(0x6ae52eb4,0x52644093),LL(0x4989ea92,0x58155fb2),L_(0x51865588), LL(0xd29d86e0,0xb2f24a3e),LL(0x4a65a557,0x6e88be4d),LL(0xc5c558ab,0x39d391fe),L_(0x71637238),
+ LL(0x551e6187,0xc6f1655b),LL(0xda9557a2,0x49fef895),LL(0xad9724f5,0x02bd8dec),L_(0x286ae065), LL(0x519ec0a6,0x66f88628),LL(0x409bbff9,0xb11907a8),LL(0xa035e3ce,0xfa9ce7d1),L_(0xb11a05b6),
+ LL(0x835832b0,0x7d3144d7),LL(0xeeb7e587,0xca5729ee),LL(0x63105e87,0x24b31279),L_(0x358ad95d), LL(0x44854e57,0x8b96f12f),LL(0xa1f8699a,0x43d92d9e),LL(0x36720d2f,0x19da3cf7),L_(0x0c3e259d),
+ LL(0x4f9b1862,0x3ebef321),LL(0x18a10476,0x898e24fc),LL(0x93fc7b18,0x2dd5dfa6),L_(0x453f9b19), LL(0x9fe968bd,0x2e375ef1),LL(0xde52e14c,0xc56e3c8e),LL(0xb86d2dac,0xcdf1057b),L_(0x8978f37a),
+ LL(0xa47a47e4,0x01ae0872),LL(0xf209f351,0x1ffda591),LL(0x1c3d4f64,0xfd2dee37),L_(0x23082359), LL(0x92135e7e,0x226bc4e4),LL(0xc1dc2c14,0x68af001c),LL(0x4a88888d,0xd11ebfc0),L_(0x5bb60dfa),
+ LL(0xbdac7377,0x6d7442e6),LL(0x1a37fe3d,0x111de286),LL(0x64b6847f,0x54c71408),L_(0x9321abab), LL(0x605934d9,0x8f6064c1),LL(0x0fe08518,0xab526e1f),LL(0x48846076,0x18d88b42),L_(0x5027824f),
+ LL(0x58d7da2d,0x2fefa18a),LL(0x0a5f6d1a,0x28fd1689),LL(0xaeecb1e4,0xe2cc44ed),L_(0x1a3c357a), LL(0x0093ad3c,0xe129986c),LL(0x78fb4e9b,0x8691e9c2),LL(0x6b166a07,0x1f456692),L_(0x55649b1b),
+ LL(0x9465a494,0xbb9f7822),LL(0x0c7e73f7,0x720482c7),LL(0x4c6140bb,0x1d71b6bb),L_(0xc0d4cee9), LL(0x846e827c,0x8f080a16),LL(0xf403aa8c,0xa7eed738),LL(0xb53cebd4,0x45561f5f),L_(0x176891fe),
+ LL(0xd85db49c,0xffa27852),LL(0x4d6d2499,0xebaf8c05),LL(0xb5248259,0x5a3e6570),L_(0xb7125d0c), LL(0xf6311485,0x37979bfc),LL(0x785afdfc,0x732a179e),LL(0x1a4c7732,0xe1b6b02f),L_(0xa84e1866),
+ LL(0x70e07038,0x11dbcdcd),LL(0x4243fd62,0xf7e91887),LL(0x9892ddcf,0xdc0c4d01),L_(0x5638c3c1), LL(0x71bade10,0xa42313ce),LL(0xfcf531d5,0xe28bc38a),LL(0x1417aa25,0x7e0b8323),L_(0x41b2315e),
+ LL(0xac4962cb,0xd6c61ac1),LL(0x9d056208,0xb7765b3a),LL(0xa70e6aa2,0x566c60a7),L_(0x483b996a), LL(0x05f2cab3,0xa38d32bc),LL(0xc38fefeb,0x21c5e288),LL(0x57f15c48,0x689ae7bd),L_(0x3e0d8010),
+ LL(0xbb871aa2,0x2587df14),LL(0x904f01e9,0xc5d6ae2a),LL(0xbce7f04f,0x88aa4d08),L_(0xd7f1a354), LL(0x75d9b4b6,0x5bfae677),LL(0x299925d3,0xf0375024),LL(0x6a708cd7,0x74d5a757),L_(0x97968c25),
+},
+/* digit=1 base_pwr=2^7 */
+{
+ LL(0x44a6cdeb,0xd1a6df98),LL(0x084a7e0f,0x89ef410c),LL(0x0b68659d,0xdf5b6590),L_(0xe1cee8dc), LL(0xb48fcec5,0xf5210071),LL(0xccbda01d,0x01031fdf),LL(0x4c7a3392,0x01bb7a1c),L_(0xa7484df7),
+ LL(0x698ab732,0xcb74232b),LL(0xb62e25de,0x4f40ee59),LL(0xc5c8bed1,0xfb8ee6c4),L_(0x4617192d), LL(0x626b516c,0xeaf8b0a3),LL(0xdc2453a5,0x0f8cc094),LL(0x4d7f2e28,0xf43e697c),L_(0x2e81523e),
+ LL(0x212c04e5,0x37eb6d84),LL(0x29543b70,0xa63887c8),LL(0xe67d4662,0xbf221e31),L_(0xde581875), LL(0x5a447606,0xc3db23ff),LL(0x82bba001,0x0b2a5765),LL(0x60a68af2,0x5e5ccc27),L_(0x619f6149),
+ LL(0x008cfd4a,0xe80619b5),LL(0x25f0799b,0xd4f88882),LL(0xeb6dfe0d,0x9bf5f7d0),L_(0x63a366a0), LL(0x3703627a,0x927212be),LL(0x02c160de,0xbd5509cb),LL(0x09ea0af6,0xfe05e98d),L_(0xbae9ad71),
+ LL(0xb26352aa,0x65b1d33d),LL(0x7f5ed157,0x84979794),LL(0x1ed1728d,0x39babd58),L_(0x0137cf58), LL(0x836ccdc1,0x2546cd9b),LL(0xd0dfb090,0xbfa9bb59),LL(0xb59a51ab,0x6476def4),L_(0xc5dce06b),
+ LL(0xceaa7c3c,0x23138239),LL(0x80c0cfc1,0xa694e0b5),LL(0x27734f88,0x587454f5),L_(0xb527a9af), LL(0xee6f2afb,0x049823f2),LL(0x25a1f7dc,0xe574bc64),LL(0xb3ea257d,0x1d11fd76),L_(0xafd0ae51),
+ LL(0x9b56a4c2,0xc1bc485c),LL(0x407824fd,0xbe617f5c),LL(0xa0e87d81,0x71256aba),L_(0x76217f94), LL(0x3e2877fa,0x8b3e508b),LL(0xe501c9b4,0xbda0977d),LL(0x08a19d4e,0xfb512fa2),L_(0x59ab4cb8),
+ LL(0x71544a12,0xe4756696),LL(0xaf2eb7f6,0x93d2ed81),LL(0x5c0e9df7,0xc52db668),L_(0x2b7064bd), LL(0xded1b829,0x43184720),LL(0xd4b9fc59,0xad215e80),LL(0x1343040b,0x88ef261a),L_(0xb9864942),
+ LL(0x8eee1fca,0x0f601216),LL(0xc3ce93c3,0x8e99383b),LL(0x40d758a5,0xc0aa59c7),L_(0x54ae6327), LL(0x9df0859e,0x111b9e3c),LL(0x09cd3a96,0x2e522f76),LL(0x6bcd40ef,0xb04993c8),L_(0xbcda6d48),
+ LL(0x0deb6f15,0xbabee791),LL(0x030c3495,0x66179f3c),LL(0xd426f7b5,0x457bca6d),L_(0x81319526), LL(0xd35cd40e,0x2498c158),LL(0x0b2bd04a,0xaec4ff20),LL(0x12985a92,0xcff74849),L_(0x837d8e0e),
+ LL(0xf9b841f9,0x139de2db),LL(0xf41adf6c,0xf5c32cc1),LL(0xb7dc7dc5,0xede2ea87),L_(0x6e2033f0), LL(0x706a5efb,0xcd213864),LL(0x287f4ece,0xdccf34ae),LL(0x50f400e9,0x0fc6614f),L_(0x89db6d9e),
+ LL(0x4782e689,0xc42a6b83),LL(0x9e9a2ddd,0xa767b1e1),LL(0xf3f5ab2e,0xabdd54a4),L_(0xc69f9a88), LL(0x5eeb634c,0x8affd662),LL(0xb4602516,0x434e3998),LL(0xc75f7a3f,0xfbd56bb7),L_(0xe4aa58aa),
+ LL(0xfdddeaed,0xbb083ae3),LL(0x96aff3db,0x8b900a50),LL(0x2d9b4c87,0x77208838),L_(0x2b1d390f), LL(0xeb40774a,0x408ee7f4),LL(0xc9a98c1e,0x491fbb55),LL(0xb6789b9e,0xf0a9cf2d),L_(0xcc0aecb1),
+ LL(0x4d8759b7,0xf99e1bc1),LL(0xf9d97ac1,0xe489d308),LL(0x31242e73,0xe520dfcf),L_(0xba519709), LL(0x502d066a,0xaada88da),LL(0xdf453d98,0x2db805ff),LL(0x48d83f43,0xa35584c3),L_(0x7efe383e),
+ LL(0x1ce90c15,0x18351405),LL(0x987fc6a6,0x16ded7d8),LL(0xf2b213ba,0x17bc0ecf),L_(0xd5c3d1eb), LL(0x4a42fef2,0xc603801c),LL(0x037728cd,0xbe4db3d6),LL(0xc5cf397d,0xde6243a1),L_(0xaf004bfd),
+ LL(0xee10b9c9,0x81c21906),LL(0x140e4fb4,0x5c74da45),LL(0xb07d29b4,0x65c368fc),L_(0x6829786b), LL(0x7aba9db1,0x7c01e8b7),LL(0x5c2ad4ba,0x597dbeb5),LL(0x8b692603,0xca528c39),L_(0x09175739),
+ LL(0xd1bd09d7,0x3e778b35),LL(0x332aa21b,0x97ef919b),LL(0x7761d7c9,0xf6af5223),L_(0xded7e546), LL(0xe8470307,0xde909622),LL(0x254a8b2a,0xe9be14c8),LL(0x6fa060cc,0x7cccaea0),L_(0x723e3222),
+ LL(0x6fa0e5d8,0x00e54d7e),LL(0x80274626,0x53d70b13),LL(0xf63104d3,0x448cb4f0),L_(0x86f7822c), LL(0x567fec1a,0x635d1d19),LL(0x74c9d852,0xad5841d3),LL(0x2f27a18d,0xa7638f56),L_(0x7df0f814),
+ LL(0x2f7d4c38,0xe3919fa1),LL(0x11b8e6be,0x426c3ac2),LL(0x2038bc39,0x1a7c24cb),L_(0x547f1d30), LL(0xad339016,0x4937319b),LL(0x14498e9f,0xe9acdbc9),LL(0xd9e8ae36,0x71231dd7),L_(0x099cc29c),
+ LL(0x0f0c5086,0xbfa21d69),LL(0x9934b257,0x0d29b38c),LL(0x2552b462,0xfad28b1a),L_(0x87244f2d), LL(0x042aa2fb,0xe091c63b),LL(0x224579d6,0x86f0f8da),LL(0x7927774b,0xa4177fae),L_(0x39e5970f),
+ LL(0x8ecd5fa1,0xf8a953db),LL(0x00e1559f,0x8ef3b9f7),LL(0xa70e63b9,0xf8851e82),L_(0x48191bdc), LL(0xefc3b637,0x6d398f41),LL(0xc96682f5,0x40655248),LL(0xc2927516,0xd7d600fe),L_(0x6435359a),
+ LL(0x4a966ff2,0x43c60bf9),LL(0xbe98cc32,0x94a73ea6),LL(0xe899fd7f,0x6f6a67d4),L_(0x4805ca93), LL(0x49a69773,0x532ddf8d),LL(0xb5f6725b,0x4785c103),LL(0x9818fcf0,0xa6151612),L_(0xa9419c51),
+ LL(0x351340ab,0x544bdd84),LL(0xf568cb9c,0x1359eeae),LL(0xe070e7d3,0xa9680c77),L_(0xf00849de), LL(0x3f049e65,0xc159fff4),LL(0x9f8b9614,0xc00e514e),LL(0x0503644f,0xf325f0bc),L_(0x58ef4f26),
+ LL(0x0afb5680,0xbb5a090b),LL(0x2a905098,0x29e6e124),LL(0xeb89d752,0xb46f0674),L_(0xc23b6e08), LL(0x7d46e8c8,0x84d934a5),LL(0x7446341f,0x814623ef),LL(0x2d200178,0x428fe6ef),L_(0x663531ec),
+ LL(0xc36811cc,0xf0622226),LL(0xe7d3d99c,0x26dbef18),LL(0x87323666,0x0421f1d4),L_(0xb81113de), LL(0x2f1ac158,0x121ae440),LL(0x14b9bfe5,0x7f1d1f81),LL(0xab8ce457,0xfb0b5381),L_(0xeebf8b75),
+ LL(0x1ed0f16e,0x4ab996f9),LL(0x3bca93de,0xf3972d52),LL(0x9c224825,0x51f0a250),L_(0x4390fa94), LL(0x52d41c04,0xa17f9bcf),LL(0x87ca94cd,0x1da254f1),LL(0x8eb876e4,0x8c10d532),L_(0x6ab8e456),
+ LL(0x251d18df,0x00191031),LL(0xbe58c480,0xfb757330),LL(0xf0df6b45,0x51d6cd1a),L_(0x3a2b0d2e), LL(0x72d910fc,0x6e0dcc32),LL(0x17ad59a0,0xd56ef620),LL(0x24ff8cf7,0xb1342fd7),L_(0x514eda6b),
+ LL(0x3d2d0473,0xaede35a8),LL(0x43fadb36,0xc3bc4ec3),LL(0xda078971,0x89ff847e),L_(0x757ad40d), LL(0x3367d69b,0x063bed04),LL(0xfbec9b9f,0x96916bd1),LL(0xa2938401,0xed5c65dd),L_(0xd3c116f5),
+ LL(0x4ab81e63,0xbf6d76ab),LL(0x4a94b590,0x92ace598),LL(0x43e3ebf0,0x6d7848f4),L_(0xe0fe0161), LL(0xd3008b3b,0x503ad71b),LL(0x14c43727,0x1bf34193),LL(0xafbcb091,0xbb5f8c82),L_(0x3bf8d893),
+ LL(0x9e3f46b2,0xa2d0d277),LL(0xd8be2204,0x6e8eb285),LL(0xc9fa15ec,0xac17e25a),L_(0x91b10a2f), LL(0x897ae118,0x12c8ef7f),LL(0x087fa01d,0x919f4309),LL(0xb6f728bd,0xd198666a),L_(0xcef80aee),
+ LL(0xf8d94d59,0x6112903c),LL(0x89add916,0xda5061e7),LL(0x1c13960f,0xf15aa481),L_(0x48b52034), LL(0x16623c8b,0x2d1bf700),LL(0xb5d87e2f,0x9a5f3c4f),LL(0xc7e5ba8d,0x6e4a90fb),L_(0xfd04fbda),
+ LL(0x16d9fe00,0xce2f6f2e),LL(0xae50cdc8,0x205e3401),LL(0x5c73b50f,0x59a0da00),L_(0x6b833239), LL(0xb1b01bc6,0x54c575fa),LL(0xfdd6dfac,0x38a3a688),LL(0x761a3a3e,0xb3095407),L_(0xca8c1a6e),
+ LL(0x2aa45623,0x56e12b9e),LL(0xa3fc4119,0xd0bffaa7),LL(0xf5bdb564,0xe34b58ec),L_(0x178622a7), LL(0xcda19c33,0x9e9ffc05),LL(0xfbbaa19e,0x51b7b9c6),LL(0x42f09c2b,0xb2d6157b),L_(0x0c83351e),
+ LL(0x80fda4ab,0x623598c1),LL(0xae4a61b7,0x488f724a),LL(0x47014b1c,0xddd6a618),L_(0xc1476c47), LL(0xbc2cc2d5,0x7eb38a43),LL(0x31a26c96,0x7b20f4d7),LL(0xc5ea2b2a,0xa5a136e8),L_(0x13b6043f),
+ LL(0x3199bbf6,0x07cb2293),LL(0x210180c0,0xe5a1b306),LL(0x782987ea,0xab40f28e),L_(0x4a4f4f9e), LL(0x95fa6103,0x591b5ef8),LL(0xf6832896,0xb357ced7),LL(0x38f56fa2,0x5abb2a56),L_(0x5a65a98b),
+ LL(0xf1c770e6,0xca04bf7b),LL(0x022f4557,0x88cfe334),LL(0x657a19e3,0xc772f98c),L_(0xa19ab123), LL(0x3ab78500,0x82db0eac),LL(0xd6b0ec00,0xf668d4b5),LL(0xdeadd9cc,0x9dab24ce),L_(0x1c2e2051),
+ LL(0x0ac55884,0x7647407a),LL(0x489801b8,0xfa51e70a),LL(0x56034023,0x26d5313c),L_(0x29b7a999), LL(0x834f99e6,0x6f0fc77c),LL(0xfdc7c2f1,0x647839fb),LL(0x006982c9,0xcb5af1f9),L_(0x9323d960),
+ LL(0x91a088be,0x76954497),LL(0xa4de751e,0x393750b7),LL(0x6dc8702a,0x805eb5f7),L_(0x1cfb5ce3), LL(0xaa971870,0x94bbb1b2),LL(0x43b64965,0x939fd8c5),LL(0xaf8d3158,0xc4fd0925),L_(0xeb438d66),
+ LL(0x0e5bf508,0xc7a170c1),LL(0xb2973b56,0x43a0c49d),LL(0x9e4dbaca,0x2cb87666),L_(0xcf3bacaf), LL(0xef7d14b1,0xa2effdce),LL(0x20a60ee8,0x586540be),LL(0x60509402,0x676121bd),L_(0x745c0ff2),
+ LL(0x6d713b1e,0x3407acc5),LL(0xb6d85b13,0x4730880c),LL(0x7e9049e1,0x9fc877ce),L_(0x64c1005f), LL(0xe9cfd783,0xb606ab7b),LL(0xe272e2ce,0xc2eb602b),LL(0x97ac2d38,0x954f3f1f),L_(0xa0e40e6d),
+ LL(0x479a41f2,0xdf2474e7),LL(0x1f05663e,0x3574feb4),LL(0x234012a9,0x89989069),L_(0xc2481dbc), LL(0x24c35b2a,0xf495b125),LL(0x452948bf,0x0325369d),LL(0xa43ea9bc,0x280bca9e),L_(0x8a34a29a),
+ LL(0x2326ccfd,0xae198471),LL(0x848b5387,0x840ea47e),LL(0xcce778e1,0x4288a820),L_(0x34cf4dad), LL(0x53f54930,0x9e011fed),LL(0x30c9f97b,0x29fd0d6f),LL(0xcba3ae4e,0xdb99670d),L_(0x1db11c4c),
+ LL(0x59d694e8,0x9d825f38),LL(0x2980d39c,0xc504447d),LL(0x5a3ddebc,0x9c96ad62),L_(0x7f86e997), LL(0x516005e5,0xac938f78),LL(0x7a80b2ac,0x3bbc6276),LL(0xe8b1101b,0x055eb004),L_(0x6c8daec0),
+ LL(0x50fa66d9,0xcaf9f5b8),LL(0x88ad0652,0x4681401f),LL(0x35f6f9f8,0xbced09e3),L_(0x51bdbe8d), LL(0x7b25a089,0xd40e66f7),LL(0xa071947a,0x63257022),LL(0x2ee8b520,0x9757d231),L_(0x4f80de84),
+ LL(0x822c5f31,0xdf7efaf0),LL(0x3121c652,0x39218972),LL(0xd7749654,0xb988c422),L_(0x493a2d8b), LL(0x76360207,0x98e08450),LL(0x2760de2f,0x8f841286),LL(0xcf07c50e,0xe5f81246),L_(0x1a00e240),
+ LL(0x9a2b0329,0x9d26d17c),LL(0x89b4fc25,0x9bc053f8),LL(0xc765d35e,0x45f96752),L_(0xbfefae3b), LL(0x6da731c5,0xf9a4089b),LL(0x22ecc154,0xcdbfce36),LL(0x5053964b,0xdcd4205f),L_(0x1e216001),
+ LL(0x30c80608,0x1db56abf),LL(0x7ae4875c,0xacce82ac),LL(0x4a976988,0x4fa88f83),L_(0xd67fc048), LL(0xd5a17ca7,0x49b6eedb),LL(0xedcaacaf,0x635d8bdf),LL(0xd26b609b,0x29f6f1cc),L_(0xa9ceab78),
+ LL(0x8a159d18,0xf6f8a0a1),LL(0x95c6ea4c,0x766b602d),LL(0x61916ad2,0x8497eb60),L_(0xb0ce6cae), LL(0x1a0eedff,0x50c80948),LL(0xa31d0581,0x811b1e1b),LL(0x4cec302c,0x0bfcd85b),L_(0x36484967),
+ LL(0x37db6bc4,0x6e5e0c25),LL(0x6df2fa39,0x21b92740),LL(0x248a89e5,0xdcc52026),L_(0x67b816f2), LL(0xbd55bfd0,0xee7ad3eb),LL(0x5bb4e55c,0x3cdb6fe7),LL(0xdaa70d9f,0xacc63cd9),L_(0x9155d520),
+ LL(0x868a4cc8,0x6abedf02),LL(0x22a83e65,0xa18aad01),LL(0xb90ac85d,0x088ae4b8),L_(0x65e3e716), LL(0x60fc849a,0xf19b0bfb),LL(0xfbebb9d9,0x9c3ff4ac),LL(0x7355b4ab,0xef331b93),L_(0xfcb3b647),
+ LL(0xaf2dc94a,0x4e49fdb7),LL(0x76e1b0d3,0xf8a1df9c),LL(0x94293ef4,0x588501b4),L_(0xd8359bfc), LL(0x1ef75655,0x3cd45f3a),LL(0xee63deea,0x2a08f333),LL(0x98af1b2f,0xd1f2806f),L_(0x12a331f8),
+ LL(0xd2c7e263,0x3577e68b),LL(0x7e2770f6,0x355f7336),LL(0xe8913f4b,0x77ead765),L_(0xe027fdcb), LL(0xac403db5,0x9a6f6902),LL(0xf459aa5e,0x8c922198),LL(0x24bf5d49,0x130316d1),L_(0xd808c825),
+ LL(0x672ccabd,0xe048c7d8),LL(0x33437c46,0x674f7855),LL(0x2ce661a8,0xe77ba9cf),L_(0x46b5165f), LL(0x9cd0b0e7,0xaa89fa66),LL(0xd3057aed,0xe440af7a),LL(0x142332ba,0xb60e8644),L_(0x3eb16842),
+ LL(0xa0b4b4f4,0x35fc5d9b),LL(0x9f0177bd,0xc346b37c),LL(0x63dcb419,0x4fc638bc),L_(0x0d4a9edd), LL(0xe8dc39c5,0xd3a1ffca),LL(0x2be34520,0x6520ec71),LL(0x6ee7420c,0x449c7ffa),L_(0xca54fb79),
+ LL(0x391c4163,0x447c4950),LL(0x07a8fa48,0x212fb092),LL(0xfe67f50a,0x0d70f3ac),L_(0xdbc48919), LL(0xec4b9c9f,0xc5e2455d),LL(0xc9b41ae6,0x306c9f8e),LL(0x1f329372,0xaab1f6eb),L_(0xa76cbb84),
+ LL(0x50bb236e,0x7f11366c),LL(0xd38d4421,0x865c47f2),LL(0x9815fc32,0x1e6e5fa0),L_(0x42bf5236), LL(0x980283c7,0x15c5a008),LL(0x03ac6a2a,0x13c27e86),LL(0x8f3eaacf,0x9eb61a43),L_(0x1a7ff3ad),
+ LL(0x0c067d55,0xf6ee6117),LL(0x4446a48b,0xc9f90069),LL(0x08776dbb,0x62dd1551),L_(0x856288fd), LL(0x2c6743db,0xb1d08622),LL(0x59e29beb,0x3e4f8e95),LL(0xca32b4fd,0x1744a1d3),L_(0xad3745b8),
+ LL(0x4ef78890,0x3831190a),LL(0xaaeece81,0x44c9a76b),LL(0xd465548a,0x6dc6a194),L_(0xdbb627e1), LL(0x18f3c7f1,0x91571bcb),LL(0xf5fb9008,0x31e00308),LL(0xf421b41f,0xeaac6d91),L_(0x01604108),
+ LL(0x72bdb3aa,0xa2f0a871),LL(0x276d7a20,0x680da72c),LL(0xa823fb58,0x507ee8a9),L_(0xe6fef46d), LL(0x9c541554,0xa385d033),LL(0x2785c811,0xdf53b551),LL(0xbcf3686a,0x8ac8344a),L_(0x3bf9ea41),
+ LL(0x450260e1,0x8075a440),LL(0xfea1ac4e,0xe6e29d49),LL(0x0fedea77,0xb3c70edf),L_(0x2398f701), LL(0xa3d35062,0xbbbf63ab),LL(0x9c1eb75a,0x62e94dcf),LL(0x9c3a2d57,0xee68eb75),L_(0x4d73d0da),
+ LL(0xbcef4afe,0xe663f1d7),LL(0x31f69d33,0x6b81992e),LL(0x46cf68c3,0xc7fa33cc),L_(0xb4e3665a), LL(0x0a54ba22,0x48f183b6),LL(0x154b0c79,0x17fddba7),LL(0x32607f61,0x1e044a43),L_(0xc1030470),
+ LL(0x5565823c,0x25aa9de0),LL(0x88786097,0x3798fe3f),LL(0x045b969a,0x2e64a0a5),L_(0x921c1980), LL(0x89334dcd,0x8b058ded),LL(0xbe46c84c,0xbe78b8bd),LL(0x5b271860,0xfe16e851),L_(0x48f0acc8),
+ LL(0x11ee6162,0x31bafd7e),LL(0x7c0c6e0d,0xc8efb7fd),LL(0xe2d4fff9,0x2b1da468),L_(0x95ee5ad6), LL(0x82ecd1e6,0xfebeb584),LL(0x307f35dd,0x3c68f532),LL(0x406d6f3a,0xe2245982),L_(0xd6be6d55),
+ LL(0x979df4a2,0x002c4e27),LL(0x4f02beba,0xf600aa2e),LL(0xc26d73f0,0x21de614f),L_(0x38b705d3), LL(0x13b06b78,0x23429db6),LL(0xf4967923,0xa3e9a4f2),LL(0x198f9eed,0x9eb6af93),L_(0x6bb259cc),
+},
+/* digit=2 base_pwr=2^14 */
+{
+ LL(0x6f5b4a5a,0xdcabdf3a),LL(0xd382ee31,0x1e2db542),LL(0xeeccf680,0xe97abee6),L_(0xc6941824), LL(0xc6749744,0x47a3192f),LL(0x7f45fc06,0xc0f578ba),LL(0x7b1af995,0x4d9341e8),L_(0x248e916d),
+ LL(0xdde84f14,0x082378c2),LL(0x4bf3bcae,0xaf15229f),LL(0x82c65899,0xb15f6e52),L_(0x5919e8e7), LL(0x6798e12c,0x6c251212),LL(0xce97fdbe,0x696c3757),LL(0xf8d74875,0x1738524d),L_(0x44e69e4f),
+ LL(0x9c3b9c4f,0x54e9eb41),LL(0x1bc6447d,0x2ee02fd1),LL(0x65482175,0x63694975),L_(0x72869bff), LL(0xb7191008,0xf6aea0b9),LL(0xa70d16cd,0x5bd0a826),LL(0xa212780d,0x14730725),L_(0xdc25b909),
+ LL(0x09a50ad3,0x8d673442),LL(0x01c6af2b,0xc4f517cc),LL(0x24e6fbcf,0xc6a67d3a),L_(0xbbe5e1ed), LL(0x8492568c,0x964e75d1),LL(0xb97b0d10,0x09dfd2ce),LL(0x09007531,0x67a932fe),L_(0xc85f611d),
+ LL(0x7d086ac1,0xfaef942c),LL(0xfc2eb46d,0x4a2d4ce4),LL(0x51096873,0x75df38bf),L_(0x75ab062b), LL(0x6825bc8a,0x1f5151d2),LL(0x587ef818,0x0a14774b),LL(0xf3f93877,0x0eae8822),L_(0x5b5cb708),
+ LL(0x2f159690,0x36982470),LL(0x165fe970,0x2b470b0b),LL(0x2ff27509,0x89cd99ad),L_(0x98c66330), LL(0xc33eb1a9,0x0397edc7),LL(0xd2a0cfc6,0x868918fb),LL(0x7e36813d,0x722feffe),L_(0x829c6b89),
+ LL(0x5c8de701,0xe76a6990),LL(0x394ea602,0x568ac304),LL(0x1348f9f4,0x34e40071),L_(0x3b2e0279), LL(0x6e909cab,0x5da0385c),LL(0x0b77484a,0xd9ed956a),LL(0xbbb8ff2e,0x7e2ac222),L_(0xf54f007f),
+ LL(0xe5f3820b,0x306867f0),LL(0x271f814c,0x5fe6163a),LL(0x455790c2,0x038f4fe6),L_(0x58008770), LL(0x2a2eebb4,0xa3ffa255),LL(0x2ae5134e,0x4eecbe86),LL(0xfa061ce0,0x2bb3a978),L_(0xa4fe1b53),
+ LL(0xcfa6c306,0x1840dd3f),LL(0x24b14e0e,0xbd1f6ada),LL(0xc72a3b9b,0x5ca5c5d6),L_(0x8625f308), LL(0xdf5f8793,0x6afba384),LL(0x5e8c195d,0xd59557a2),LL(0x6bdd2d33,0x0975350a),L_(0xeff53d99),
+ LL(0x35527ee1,0x3fb95972),LL(0xc84c9bda,0xaea90e2e),LL(0x172afe3a,0xd069e505),L_(0x2d143bfb), LL(0x7231a957,0xaf5715f4),LL(0x9c2db5f2,0x7e8468f0),LL(0x6e7b80b4,0x71ec23d9),L_(0x4f3f9687),
+ LL(0x1034850b,0xf5d591b7),LL(0x0c9c04f2,0x3e07210b),LL(0x6d31163d,0x530f24db),L_(0x66c42b68), LL(0x7457ed53,0x1378c67e),LL(0x777097e8,0x8164d6d2),LL(0x3f1062b9,0x9ee5175c),L_(0xb09a9492),
+ LL(0x20bad002,0x12b71603),LL(0x0ee3063d,0xd5045d6c),LL(0x2261149a,0x853772f7),L_(0x8f349671), LL(0x9ec1ef24,0xdd3b39e1),LL(0x3acb7c05,0x02d7c1cd),LL(0x34c3e767,0x9381a0b0),L_(0x74081fec),
+ LL(0xfcd9c832,0x49667bc0),LL(0xd57108d0,0x9658b33b),LL(0x6834cfcd,0xf7fb9009),L_(0x9b0baa9c), LL(0x352f5036,0xd797b7f8),LL(0x13c1353f,0x3152ce4a),LL(0x6f581f80,0x48a60c42),L_(0x7f9e960b),
+ LL(0x00259aa6,0x474d3703),LL(0xcfd42398,0xd3db7f63),LL(0x1c1a54ad,0x3c4fd36b),L_(0xd3eac930), LL(0x79efe57a,0x7c4dc3a3),LL(0xdce7096a,0xfbb39dec),LL(0x732dfde0,0xa1787513),L_(0xe804b476),
+ LL(0x0535a13e,0x926b6b5c),LL(0xe5f713d5,0x96e21c9c),LL(0x3d019dde,0xd52c15ec),L_(0x3e7f7e62), LL(0x883a0c0e,0x6609394e),LL(0x694f2696,0x9ff80d9a),LL(0x69aa76bd,0x07cee438),L_(0x234e3949),
+ LL(0xae230adf,0x90a49b52),LL(0xf501aeb8,0xdfc8b644),LL(0xc50fe003,0x8b89e79b),L_(0xa04a6f7a), LL(0xc225c287,0xff3922dd),LL(0xc4ed1911,0x0cd4b29f),LL(0x0ce76929,0x8af23a3e),L_(0x918974b5),
+ LL(0x3d52ecd2,0xdfd72a7f),LL(0xdea21ead,0x7da62126),LL(0x8e3f7ba7,0x1f678c3b),L_(0x6df4e74e), LL(0x22dc8168,0xc5a010e6),LL(0xd7eea56a,0x54e30f4f),LL(0x389d8453,0xc6ed7b9d),L_(0x2e489cfc),
+ LL(0x80f6e62d,0x914f8bfd),LL(0xbcee9591,0xa0be9a1f),LL(0x7fab5561,0xec5af129),L_(0xd4d265a9), LL(0x3327e887,0xc74bfc93),LL(0xd2bab14c,0xe716458b),LL(0xe6b2e9c5,0x77d00d82),L_(0x161eafab),
+ LL(0xe139a461,0x8fb0ef8c),LL(0x5b2aa48c,0x622967d6),LL(0xe9937cc2,0x00ef4c97),L_(0xb862b86d), LL(0x42bfb0a9,0x97617d08),LL(0xfe0c2928,0x4f55cab8),LL(0xce44e424,0x625a38ef),L_(0x8594c3af),
+ LL(0x239b2f0b,0x1b735668),LL(0xbbf9ef82,0x066337ae),LL(0x754e211c,0xf058688a),L_(0x95864d69), LL(0x39a1596b,0x8beee136),LL(0x9150359b,0xd3b81681),LL(0x0ab949fd,0x3f4ac39d),L_(0xf6d5f8ee),
+ LL(0xad05618b,0x4aaed3cb),LL(0xb594cda0,0x3d341ce5),LL(0x0216bf14,0x9e271d0d),L_(0x7efe2b03), LL(0x68f95031,0x6a084fdc),LL(0x824376da,0xcda2825c),LL(0x6acd2b86,0x2deabee7),L_(0x55b4713a),
+ LL(0x7d01995f,0x9b5408d1),LL(0x5ffa275a,0x5103e5b4),LL(0xfa6d3b64,0x3f3eff6d),L_(0x5bf0abda), LL(0x13a776d1,0x97b27239),LL(0xcf4c8232,0x22a3f2f2),LL(0x170c8de4,0x047d7294),L_(0x43f7fc78),
+ LL(0xab797a07,0x0b00d0bd),LL(0x4d42a1fe,0x92ead9f6),LL(0xc3907782,0xd65498ad),L_(0x716502c0), LL(0x814b71a4,0xaa83d0a9),LL(0xd8e4c681,0xaf90bf17),LL(0xb2730e91,0x3b7c8d6f),L_(0xc3d966b3),
+ LL(0x8da671b5,0xfee99849),LL(0x2e099be3,0xdbbe577f),LL(0x5f8e6df6,0x31915ae6),L_(0x2ba98b17), LL(0x0d5b6ffc,0xe2f20ab0),LL(0x791aa104,0xdc69cc94),LL(0x2ae23401,0x5c5045ab),L_(0xd646c528),
+ LL(0x93077179,0x50b8339a),LL(0x2874cd90,0x05d7c4a6),LL(0xcb1961a7,0x221ee1b5),L_(0x43f06891), LL(0x0a41aae9,0xf9998038),LL(0xeac42395,0xd6ac7543),LL(0x042a0af5,0x36489fc2),L_(0x5fdad7bc),
+ LL(0x3c56133d,0x9f01cd48),LL(0xc0ba445f,0x29263bac),LL(0x3e5d8713,0xc6107ee1),L_(0xecfad04a), LL(0xb648509b,0x45f6365f),LL(0xeda195e8,0x4716fd8d),LL(0x2f2caf71,0x4fc9d505),L_(0x0c644ae1),
+ LL(0x510aa881,0xbc63e799),LL(0x658bc0b0,0x4716a31d),LL(0x2713db77,0xabf827dd),L_(0x12824e7f), LL(0x5c30bb60,0xb2616194),LL(0xfcdeef4c,0xf6fd28f3),LL(0x3fa68909,0xe9395e01),L_(0x42dfc220),
+ LL(0x91f7da3d,0xe6bee7b8),LL(0xb1959a03,0x303e2e61),LL(0x9b779901,0xe7e57056),L_(0x1c2d553f), LL(0x9abaa6a1,0x47995b48),LL(0xab4d653f,0x6d28c851),LL(0xf8e40f18,0xb70d2132),L_(0xbaae5b9b),
+ LL(0xc8d7fa04,0x325e475b),LL(0x8ad5b01f,0x8d0c0363),LL(0x8fb55f0b,0xa691b273),L_(0xee832613), LL(0x3a711dab,0xb146b4e3),LL(0x748d793c,0x81182539),LL(0x2911a867,0xdb940971),L_(0x24df2ed3),
+ LL(0x0b071d1f,0x25961d64),LL(0x87754320,0xc47ba4de),LL(0x15d5a2ff,0xee280f81),L_(0xfc4877e3), LL(0x1fbba89c,0xd08afabd),LL(0x8dd2825d,0xc881c4eb),LL(0xa36fe3f2,0x20840934),L_(0x398c3272),
+ LL(0x13806339,0x51502992),LL(0x5f9bec8a,0x1bb87fb3),LL(0x878f8530,0xbcaa2cbf),L_(0xe99dba0e), LL(0xde118aef,0x7a185dc3),LL(0x7f95d77f,0x2ea5905d),LL(0x3f419246,0x2b04f2d5),L_(0x7b04c078),
+ LL(0x0fd96b35,0x597ba0a8),LL(0x0eb981ea,0xb6624fc6),LL(0xe6e26240,0xbfc4dac6),L_(0x35dd20af), LL(0x61745187,0xe7b40563),LL(0x8d381cfb,0x554c1adc),LL(0x4013b9ec,0x354e81ee),L_(0x50a8d84c),
+ LL(0x098f1196,0xccc6dc56),LL(0xe6735e77,0xe9fcb8bf),LL(0x629efebf,0x2ffffa9f),L_(0xc520680b), LL(0x6d812701,0x732a53da),LL(0x4d7d1ede,0x248c465e),LL(0xa1f8c1a5,0x3dffe6e5),L_(0xc519ac0b),
+ LL(0xcaf0a9d6,0xaef46030),LL(0xdd8a57c6,0x739000fd),LL(0xb0540672,0x8ef45968),L_(0x7dc6abd9), LL(0x33da5d1c,0x5aafa6a3),LL(0x60865fae,0x6662d3dc),LL(0x9c28cea0,0xd3cb6b76),L_(0xbbb47176),
+ LL(0x93070274,0xfe93910c),LL(0x86c3c000,0xd939b811),LL(0xe4bdec34,0xa7194bcc),L_(0x308782a6), LL(0x640b22a9,0x710f1668),LL(0x1c395e5f,0xec57d6a5),LL(0x2f41d5d8,0xe7981956),L_(0x53f886b7),
+ LL(0x67aad45f,0x6d08786e),LL(0x2cc15260,0x8bf6b065),LL(0x84169282,0xa53ab3f4),L_(0x49111025), LL(0x714a4d69,0x8db73ccf),LL(0x49ee5fc0,0xaec354d3),LL(0xeb0a609a,0x26497f34),L_(0x752e2221),
+ LL(0xbc1c0e24,0x23ccf8a7),LL(0xb6e96781,0x8d254256),LL(0x183ac489,0x907018f8),L_(0xf0ef92fc), LL(0xc98e1d84,0xac3eb092),LL(0x63c56eb0,0x61b00609),LL(0xf8deac28,0x95f55a52),L_(0x5ae62b60),
+ LL(0xa101bad5,0x8575f396),LL(0x643e6356,0x75613315),LL(0x3b84d8ca,0x87159fb6),L_(0xb1bb3787), LL(0xeb901a9a,0x04257ae5),LL(0x76cc23a1,0xc722a719),LL(0xf70dd339,0xd9298acd),L_(0x91c26db4),
+ LL(0xbcfc15f8,0xac24fa28),LL(0xa4b011f9,0x9cf8c10a),LL(0x77f2a9a2,0x897d9044),L_(0x0ed14d52), LL(0xe210939f,0xa6397972),LL(0xe2308c70,0xc34aac84),LL(0x72030316,0x664a26ca),L_(0x291e9903),
+ LL(0xd67a8d4c,0xd3c9cb6a),LL(0x38755541,0x115ea4ff),LL(0x4ad0effb,0x5c237f2b),L_(0x75646bb1), LL(0x1c0c1001,0xa07ca1d3),LL(0x7f647322,0xc00e9dcd),LL(0xe24ec66d,0x819d18b8),L_(0x95c255a0),
+ LL(0xd48e2f95,0x8209864f),LL(0xddb2d835,0x9d8a81eb),LL(0x41d055f3,0x92d42e0f),L_(0xe2f17df9), LL(0xdaf29a59,0xc2c8d2a6),LL(0x061a667a,0xd108615b),LL(0xcc790c1c,0x0eb1df27),L_(0x6dc9536e),
+ LL(0x5d7251ce,0xf7ca409f),LL(0x55a94793,0x8791f913),LL(0x6bbc768b,0x1ef210b3),L_(0x166d8931), LL(0x24baa65a,0xa0bcf014),LL(0x621f63a2,0xa8abe2d3),LL(0xf790fc9d,0x60203dd4),L_(0x667b1fa7),
+ LL(0x77f64ca2,0x2884e5da),LL(0xc59a883c,0x38a09cd0),LL(0x47f89d65,0x780aeefd),L_(0xd528d23d), LL(0x9945faad,0x90523929),LL(0x6e9ee32f,0xa460502a),LL(0xb5fe2f01,0x1d21d327),L_(0x2883e925),
+ LL(0xc3ff6cb2,0x8d7cbdb6),LL(0x32e5cd9d,0x2baad720),LL(0x2385860f,0x43f0f911),L_(0x4b6038f7), LL(0xe096aed9,0x8ece6e04),LL(0x40da7078,0x964d3a26),LL(0xa20a6649,0x1a09dbaf),L_(0x709cfd74),
+ LL(0x4a5af8b1,0xa2ce00d8),LL(0xa63a8b02,0x57b8f935),LL(0x35cb5ede,0x706b0821),L_(0x4173e4a2), LL(0x74594a56,0xaae1c286),LL(0xaa0caca3,0xc1e054bb),LL(0x3c3b3e24,0x34698533),L_(0xe3b66255),
+ LL(0xcb1b2f2a,0x4bf57c51),LL(0x164519e7,0x6b4ba459),LL(0xb55fe2b9,0xd37e29a7),L_(0x68e8549f), LL(0x9b0eb441,0x9f4b4c99),LL(0x8f691f6b,0x59078e54),LL(0xa382964e,0x49524978),L_(0x7d3fe7f2),
+ LL(0x3a14e17c,0xb90d4bd4),LL(0x087b646e,0xac93ca7a),LL(0x53865f43,0x2d659d4e),L_(0xb9db500d), LL(0xdc91bb2e,0x17597d7a),LL(0x6ae5d43e,0xb1613ba6),LL(0x3a5e9fe1,0x4204e314),L_(0xd91a271a),
+ LL(0xbf7ca431,0xcfce86aa),LL(0x16c2854c,0x51585545),LL(0x3999a9a1,0x5fd18a95),L_(0xa1e55106), LL(0xd29f7bb5,0xd7192594),LL(0x7c17c721,0xb7a8c7e2),LL(0xf6856acd,0xdb82b841),L_(0x39017815),
+ LL(0xe9631773,0xf155113d),LL(0xc2b2be30,0x09bb3adb),LL(0x1e571839,0xa98b5f59),L_(0x17a7266e), LL(0xde672c40,0x02e9f20a),LL(0x9c53a705,0x68d00619),LL(0x476b9b10,0x144091ad),L_(0x98e56e88),
+ LL(0x4746f916,0x02f6a9c6),LL(0x461d2e37,0x6a692ac8),LL(0x6fe1c2f9,0x8835c958),L_(0xaae29f67), LL(0xaa57aa25,0x1573f8b0),LL(0x2aae0885,0x8359860b),LL(0xc9a1230d,0x930776e9),L_(0xd3f32fd7),
+ LL(0xda3f170d,0xdbf89586),LL(0xfeac4726,0x6f39cb19),LL(0xe907285f,0x084c5773),L_(0xc72ade03), LL(0x2f55c6f0,0x155c7e90),LL(0xe4fb90c2,0x50f9f0f0),LL(0x833af29a,0x87b3ac91),L_(0xeeb712d2),
+ LL(0x1b2f2123,0x08fa5175),LL(0xad400dee,0xe9ac51f9),LL(0xdb50d10c,0x8bbf71ad),L_(0x1322cb4e), LL(0x3efa91c3,0xb7ef36d2),LL(0xa5571f80,0x4c6187ca),LL(0x938aa540,0x6a106d1c),L_(0xfee7b99f),
+ LL(0xc717d42e,0x0d738fbd),LL(0x9340ad37,0xf74cbf89),LL(0x923ef854,0x1a934a84),L_(0xdc9bcb14), LL(0xf0ce91b3,0x3ed1d40f),LL(0x3e3d69c5,0x35833a46),LL(0x8cf302d1,0x60492caf),L_(0xee0ad716),
+ LL(0xf9f98ca9,0x310d3206),LL(0xc40b6b35,0x67ddb804),LL(0xf6b370b9,0xcf2da667),L_(0x4a7e6061), LL(0x57730157,0xd8d48240),LL(0x186ae81f,0x002b8bc3),LL(0x2133c198,0xa42e3f3d),L_(0xf8b9b6ca),
+ LL(0x1ba04233,0x9ac56b2a),LL(0x55759656,0x927ea140),LL(0xd47c70b0,0x0f258220),L_(0x06bffc7e), LL(0xe94dda94,0x453179d9),LL(0x92ffe53d,0x2b54517d),LL(0x2ac0af28,0xb924dbee),L_(0x7afd903c),
+ LL(0x7c5bc163,0x7d2123b3),LL(0x61435520,0x1d58d680),LL(0x2b094145,0xeb4a95b5),L_(0x09b8c6a3), LL(0x3c690f29,0x54e52454),LL(0x646b89b4,0x6bd00cf3),LL(0x2640a633,0x17b930ad),L_(0xa457233d),
+ LL(0x05fb72f6,0xbfa90c2b),LL(0xfad26494,0x9f2c3cd4),LL(0xbfe60269,0xcd907456),L_(0xb3e48eca), LL(0x6374f2bd,0xdf9ab844),LL(0x94fe7551,0x36c69779),LL(0x8ed01908,0x5a97c45a),L_(0x5dbf5641),
+ LL(0xa14499cb,0x9dc2ad99),LL(0xe9019e0a,0x64554a27),LL(0x588acbee,0xfff03f99),L_(0xc48117a2), LL(0x46bb4b9c,0x6e713362),LL(0x59d13072,0xfb7747ec),LL(0xc63c7628,0xefa02cb7),L_(0x39d7f934),
+ LL(0x69d702d8,0x5f6d09ba),LL(0x2361ada1,0x920262ae),LL(0x5419445e,0x6f750612),L_(0xa30fa392), LL(0xcf460268,0xd59c34bc),LL(0x32785073,0x76b69628),LL(0x72c99605,0xb431b539),L_(0xeec4de29),
+ LL(0xc39fd75e,0x97507c26),LL(0x0c5debbb,0xd82ad3a6),LL(0x3c42310d,0xa01f4d9e),L_(0x5fdffd07), LL(0xd1fedd01,0x5e2bab3e),LL(0x4ce43e20,0x8abe3a41),LL(0xe71cd8a2,0x0c4858ed),L_(0x8bd12b19),
+ LL(0xbb2c8805,0xb6380f03),LL(0x59339488,0x7a463ca9),LL(0x920e2111,0x0fbdd870),L_(0xcf927c12), LL(0x9fa1e546,0x4ea01a50),LL(0x20ee4123,0x38b747c2),LL(0xeeedf23b,0x65fa7940),L_(0x82b08346),
+ LL(0x6a22e6e3,0x34651055),LL(0x1098cb76,0x269d82cd),LL(0xd6a624c2,0x5fd458b6),L_(0xb856ae59), LL(0x6c36cae7,0xd687ba3d),LL(0x33a82abc,0x6963f047),LL(0xa949d735,0x1de89776),L_(0xc44fd2cc),
+ LL(0x23ce7894,0xc54039f7),LL(0x1ad9c99d,0xaba8109a),LL(0xa0ae59e6,0x5269a308),L_(0x65e4eb8f), LL(0x63914a92,0xe212c370),LL(0x2c3e1f0e,0xcaf748c2),LL(0x8869d4e8,0xc88e85fd),L_(0xbc2a9592),
+ LL(0x0874ad96,0x0f4e6e42),LL(0x2bfeb37b,0x3e5a96cd),LL(0x6bb45b1b,0x53c918ad),L_(0xb8bd0546), LL(0xfd07d3ba,0x0e33f7bc),LL(0x9e58beb5,0x58f58e4a),LL(0x26578e47,0x986f5206),L_(0x90135d8a),
+},
+/* digit=3 base_pwr=2^21 */
+{
+ LL(0x089bae53,0x4190a603),LL(0xec5c8b6b,0xa64a64f3),LL(0x8bca6d9c,0xba9eddb4),L_(0x3ebc0dcc), LL(0x9555731f,0xa709d0a0),LL(0xc3d3be2f,0xa147a9eb),LL(0xdae0ded6,0xf474acd5),L_(0x965b8988),
+ LL(0xa9158749,0xfb05e5ec),LL(0x7df5ec60,0x5b8ef888),LL(0x2d8170fd,0xd08f651c),L_(0xe08fb325), LL(0x1ccffe04,0xa2b2a173),LL(0x20fa30ea,0xe5f33422),LL(0xd169c10d,0xc7e20c19),L_(0x366327ee),
+ LL(0x5d85ed76,0xf62aa1bd),LL(0xe359773b,0x38737578),LL(0x2b782c08,0x31df9439),L_(0x80e166af), LL(0x673b4b07,0xa7a7bd40),LL(0x50ca47c9,0x95ad7602),LL(0x8ed45ebe,0x4a7eebb4),L_(0x03e9fc9d),
+ LL(0x33fde338,0xaba113fc),LL(0x0e6fb34d,0xc0022adf),LL(0xe2da2a97,0x491a39ca),L_(0x54e2ec96), LL(0xb883d291,0x3d0946d9),LL(0x6f792b36,0xd8794d71),LL(0xd78ca8ec,0x13094248),L_(0x286898ab),
+ LL(0x0c894527,0xb354ae4c),LL(0xf18c6f77,0xa39fcad9),LL(0xf685126a,0x7bd039dc),L_(0xfb3809c0), LL(0xe8ec1ffb,0xc99f8944),LL(0x7c71a341,0x08ed706a),LL(0x21f4ed22,0x4c371e86),L_(0xa650cd97),
+ LL(0x64586632,0x8e7cfcb0),LL(0xfcae4f5c,0xe83d4510),LL(0x62196ce2,0xc9a4fa0c),L_(0x83e1de7b), LL(0x4871e08f,0x8f0bc09a),LL(0xfa78f5d2,0x1e32cbe6),LL(0xda32a5ee,0x23d217eb),L_(0xf8df814e),
+ LL(0xefdc00b8,0x80a1f116),LL(0x670e56db,0x0b205db0),LL(0xd1c521ab,0xcaa4c48a),L_(0x41b37b7f), LL(0xde1b3d20,0xf6421dce),LL(0xafa1a3e7,0x906ec304),LL(0x5c6bc442,0xbc2935cf),L_(0xbe169cc3),
+ LL(0xa597c946,0xe5876159),LL(0x308bf446,0xcc637e99),LL(0x8047e56a,0xdb6a36f6),L_(0xe8293346), LL(0x51f3fb7c,0x93a30fbd),LL(0xcd2f5b41,0x3e0a22c7),LL(0x0b7b25a0,0x3d9fe740),L_(0xaafd7816),
+ LL(0xe59f76ea,0xc167cd8d),LL(0x0d3f30f7,0x07b77d41),LL(0x3b140b84,0x6554fb45),L_(0xc105ccc8), LL(0x72d13268,0x69c72227),LL(0xf0450467,0x0ba87831),LL(0x88e4350b,0x1e0bbd29),L_(0x6f9f2dff),
+ LL(0x8eb3482c,0x1e9d015e),LL(0xf4db6e3d,0x3a6f5318),LL(0x60df1945,0x91e766b6),L_(0x2499a2cf), LL(0xe58a4308,0x0468acbe),LL(0x7a3c83da,0x9eeaeaca),LL(0xfeedfeca,0x95c8fd77),L_(0x9f35aedd),
+ LL(0xdf4b1836,0x1d85a174),LL(0xefd882f6,0x2cdd973c),LL(0xfcbc0529,0xff17a943),L_(0x6d3cb4e6), LL(0x7dbddba8,0x1d223311),LL(0x680691e3,0x6b1fb1d6),LL(0x2d7d7413,0x3d6056c3),L_(0xf379f1df),
+ LL(0x75f0d3c3,0x5a2e3385),LL(0x66a60d5f,0xa99c6fca),LL(0x08231783,0x2621fe6f),L_(0x282e92dc), LL(0x9beb8a2d,0xa53267dc),LL(0x48813229,0x2abc54c5),LL(0x18f63ff9,0x25a10917),L_(0x06fdd515),
+ LL(0xd5250739,0x866c8a6c),LL(0xb47ff8e8,0xe99cef30),LL(0x360eff22,0x64925640),L_(0x392f59d5), LL(0x58d96359,0x18c35e2f),LL(0xe8c753dd,0x5ea13624),LL(0xeef6fc01,0xdf425955),L_(0x3afc5278),
+ LL(0x6599bea3,0xedc68cb7),LL(0x69d044d7,0x3950ba3f),LL(0xb3b58152,0x8eb64dda),L_(0x49c378c0), LL(0xfcacec23,0xaf6b16d6),LL(0x47e931cc,0xbc7d2577),LL(0xcb7189bc,0xa9051236),L_(0x2aca5249),
+ LL(0xb4223fb7,0xad339986),LL(0x9bcc65a5,0xe221979a),LL(0x278964b2,0x7810f1da),L_(0xf8f2be96), LL(0x225ed2c6,0x7e983036),LL(0x59fa9f23,0xfcfa0c31),LL(0xbc86f69d,0x918a9c4a),L_(0xb726eddd),
+ LL(0xcabaac34,0xac70d023),LL(0xe4e20984,0x7fc6e9c4),LL(0x0ffac935,0xcce8d103),L_(0x6efdaa99), LL(0xd5d8263d,0xea3876d9),LL(0xa0b5e29a,0x1319056a),LL(0x65ae7e78,0x9fa645d3),L_(0x93cb4927),
+ LL(0x09cc8e5f,0xac6cb27b),LL(0x414e945f,0xb503f62a),LL(0x73d9e98e,0x4809a03f),L_(0x2d14c85e), LL(0xbf213bd6,0x0b05bc27),LL(0x74a3b39b,0x4314e710),LL(0x003b8462,0xed2336e3),L_(0xc6f085ad),
+ LL(0x3c7d36a1,0xd9687e2e),LL(0xd82a965c,0x7a3f9fe9),LL(0x088401a6,0x068fa075),L_(0x07ba4f19), LL(0x0f0c8a66,0xf91cec2f),LL(0xb6cda991,0xb14b14fb),LL(0xa7b1febe,0x50d069b1),L_(0x5d3d8cd6),
+ LL(0x10626da8,0xf8949e74),LL(0x5c71b954,0xbe5cd298),LL(0x28006acc,0x6ba62a11),L_(0xe08cb4da), LL(0xe8cb22bc,0xc4d932f1),LL(0x9059e525,0xb085b630),LL(0x72f4258d,0x4cc4c854),L_(0x0a971745),
+ LL(0x1acb63c1,0xdaf48ca2),LL(0xa543ba94,0xe2648935),LL(0xd71707e5,0x809ef386),L_(0xe30d9ba3), LL(0x12555c2b,0x69eeeae4),LL(0x6910f9ee,0xea668f6a),LL(0xe8c90ba6,0x1896385f),L_(0x12c1a610),
+ LL(0x9f5a846d,0x2d268c8b),LL(0xd0a57e22,0xf1a092e2),LL(0x907afb7b,0x927d9d98),L_(0x4fb8839b), LL(0x54540741,0x967900e2),LL(0xa9ff207a,0x628af581),LL(0xee9dbe19,0x1bad27e2),L_(0x37d4f91b),
+ LL(0xd5bb2ea9,0x6069565b),LL(0x7e61e032,0x973dd1c6),LL(0x1034f977,0xa6921003),L_(0xf41e571f), LL(0x58bdabb3,0xeaa8bfa5),LL(0x77a67171,0xe71c31a6),LL(0xf9f34af4,0xa78106eb),L_(0x7aed89ac),
+ LL(0x9de5d621,0x8c1c931d),LL(0x2befbabd,0x5b08557f),LL(0x7e64aafe,0xb97c5d4d),L_(0xf99509a4), LL(0x10d5a953,0x7372eddc),LL(0x47ce48d3,0x24c1d7d6),LL(0x28b7f369,0x1fd874f8),L_(0xfdab8a95),
+ LL(0x886ba3df,0x7f6337ce),LL(0xe5943606,0x7b3e3023),LL(0x21b5b09f,0xa28353d5),L_(0x917b4519), LL(0xd1005ca4,0xfd5ad004),LL(0x73dbf462,0xc7335825),LL(0x7f25c9d4,0x3b50b66b),L_(0x35b3bf78),
+ LL(0x9b2e5ded,0x4b668d6b),LL(0xbe5e047a,0xd58c1f6d),LL(0x2bc0144b,0xee508f32),L_(0x9d2116d4), LL(0x7efb1e4f,0x5d9a5637),LL(0x8ab6e9cc,0xcd52f6ad),LL(0x954172ff,0x7ca23907),L_(0x9fe1053c),
+ LL(0x0b042690,0x711be7f8),LL(0x4c525b55,0x549592f5),LL(0xac72c62f,0x962efa73),L_(0x92c58056), LL(0xe8cda600,0xa38c53ed),LL(0x917ebbe6,0xd1e2d2e6),LL(0x6ab0ae35,0x25682606),L_(0x0603c2dc),
+ LL(0xd25fb822,0xb1a2e953),LL(0x22b420c7,0x030fabe0),LL(0xffe309b6,0xda6ba55a),L_(0xdce7859f), LL(0x9c46c82d,0x96d10a75),LL(0x057f1caa,0xd24573e9),LL(0x72ae9f6f,0x8794d9eb),L_(0xab64c20f),
+ LL(0xfc0d12fe,0xb289f4d7),LL(0xd9e2a94a,0x133fa143),LL(0x4c9fd385,0xecfdb1d1),L_(0x0675dcf1), LL(0xa5804aec,0xaccd6ef1),LL(0xfad7706e,0x577c5c78),LL(0x0667c6b3,0x7a5f797a),L_(0x2207359c),
+ LL(0x03a638e7,0xf3f519e2),LL(0x06628ac7,0x06647de5),LL(0xe38c99a3,0x86774ade),L_(0x8f775fea), LL(0xe57995ae,0x1bf25ffc),LL(0xf9325842,0xcccd3a9f),LL(0x34f4502c,0xabcab086),L_(0x064e829c),
+ LL(0x27f04a80,0x5fefab0b),LL(0x06295d26,0x2a4f8979),LL(0x234674d8,0x9c70b1f8),L_(0x01e05c18), LL(0x49f25ab4,0x352749e2),LL(0xee248ea9,0x9909ef81),LL(0x3b3c0b4c,0x7556a699),L_(0x4df0080e),
+ LL(0xeb394e8f,0xc8a345b1),LL(0xaf868ebc,0xbf72406a),LL(0x9a7fcfbb,0x959c94fa),L_(0xea271ece), LL(0xb72d1e17,0x1ea91da8),LL(0x252b7410,0x004276b7),LL(0x560e8135,0x8ada4812),L_(0x4d0eaa23),
+ LL(0x857c7d7b,0x11e78f96),LL(0x55ff3762,0xcd19ea8e),LL(0xa90b8b11,0xb557ab25),L_(0x98bfd175), LL(0x436277e5,0x453f5ec0),LL(0xbd8cc123,0x74f19c3e),LL(0xe53f50d1,0xaf6d61de),L_(0xb809c27b),
+ LL(0x70f6cada,0x22d1e307),LL(0xcafcf6b1,0xc39e2653),LL(0xb5d40ef0,0x602ae873),L_(0xb5bef707), LL(0x37b8abfa,0x47aa28a0),LL(0xc7e7a44e,0xfe824073),LL(0x9f424f8c,0x39a88470),L_(0x08171c6a),
+ LL(0x80811691,0xd43ff3e6),LL(0x5bfd96fc,0xb502656b),LL(0xa9d5f891,0xeb92efe6),L_(0x5ac4853d), LL(0x1f5ef580,0x90443655),LL(0xe8ead180,0xb1c5c5f0),LL(0x84a289e5,0x98bbea4f),L_(0x8bd0878a),
+ LL(0x7035018f,0xd233645a),LL(0x2cec3fe7,0x567fe1b2),LL(0xc6974f80,0xc7a73902),L_(0x0b481a08), LL(0x9adde606,0x9eb32485),LL(0x9b2ec275,0x16392d5c),LL(0xdb3bea46,0x0653d374),L_(0xab7f0ce3),
+ LL(0xe1cac3cf,0x89e007fd),LL(0xa77a41f1,0x3300e242),LL(0x6059351c,0xed2ec819),L_(0x02bfa9e8), LL(0xba1e89c6,0xa9065e31),LL(0xd4e23efc,0x6a1da501),LL(0x9c16b8bc,0x465d2c9d),L_(0xa1b1cda1),
+ LL(0x9ecf8570,0x54df839d),LL(0xb93666fd,0xb9514f4e),LL(0x1fed47ac,0x7e8268de),L_(0xbda2efca), LL(0x5da57404,0x428af14c),LL(0x9ee2b07c,0x1471974b),LL(0xda44c29f,0xfffd22e4),L_(0x296f1761),
+ LL(0x917860b8,0xb42b17e2),LL(0x6d4c5ddd,0xf2571ed2),LL(0xabe94b27,0x89be3310),L_(0xde98e510), LL(0x346eec5a,0x9d4ca35e),LL(0x96df2661,0x11588b07),LL(0xb28f2b86,0x96395d9e),L_(0xc8d9fdcf),
+ LL(0x031a12c5,0xdbc075c3),LL(0x54d26d6d,0x6ab8c6ef),LL(0x23c171f2,0xca47c96b),L_(0xecedbb06), LL(0x8c7cf280,0x31539156),LL(0xe9bac065,0xb7662b30),LL(0x552f0920,0xef1cbf3a),L_(0x2cb42440),
+ LL(0x9fba2bd9,0xed539df1),LL(0xd5c7355c,0x718a4f45),LL(0x5ced43ea,0x10d60144),L_(0x9618c03b), LL(0x55e1556d,0x8b9bcb4a),LL(0xe3767fbb,0xf1a46d41),LL(0x2a5c6f77,0x8a009344),L_(0xa23cb6b8),
+ LL(0x0db9a0c8,0xfd4a0f59),LL(0x7ea78a85,0x4d12f34e),LL(0x258d360e,0x951a2674),L_(0x7b3935b0), LL(0x4a231357,0x75e447f0),LL(0x80a9bfbf,0xc988c231),LL(0x8cd933d2,0x1c914702),L_(0x8da2914d),
+ LL(0xbe785bb8,0xbb8f1e8e),LL(0xbb61ba00,0xa9e04405),LL(0x018ee54b,0xf3ed084b),L_(0x9b33e2c5), LL(0x796aad53,0x90c49201),LL(0xdac991d0,0x9174f367),LL(0x06286fbc,0xfa92d2f7),L_(0x8e51716d),
+ LL(0xce4d1ca0,0xcd0c67a7),LL(0xe3fcc974,0x5197d346),LL(0x4936eae1,0x38aec941),L_(0x49b20db5), LL(0xf9c12e70,0x8806a867),LL(0xfd73d3b4,0xfe592936),LL(0x8553e67e,0xbb731824),L_(0x5f399b3f),
+ LL(0x7afb78c1,0x04dbb078),LL(0xd2ce86a5,0xbe71dc62),LL(0x636ee6c6,0x5c029f32),L_(0x90ef1fcb), LL(0xa90f74fc,0x05c18efb),LL(0x812addf4,0x86cc7880),LL(0xdf2ff660,0x34c03bb8),L_(0xb1740945),
+ LL(0x642146f4,0x18fd7ff7),LL(0x8a416ad5,0x8b9a8120),LL(0xb7d2ecb8,0x8226e0af),L_(0xbb5fb220), LL(0x7d62e2a5,0xcaee42bb),LL(0xb76b0d06,0x9ae1502d),LL(0x31322587,0x678f208f),L_(0xa07b89ea),
+ LL(0xdd6c08b2,0x5899ed84),LL(0x45083585,0x50d7aafb),LL(0x7217b173,0x04f9e7f1),L_(0x59198da1), LL(0x5dd6befe,0x11d6cf0e),LL(0x908d5768,0xa9128791),LL(0x51f15b45,0x7dd32a0d),L_(0x58045077),
+ LL(0xafc5b319,0x885c6636),LL(0xf7bef8ba,0xc50dd479),LL(0x478b8ac8,0x58aa9fce),L_(0x9d21686d), LL(0xe233d315,0x541006e3),LL(0xdfc86dcf,0xdfefb8ef),LL(0xe98f7f2c,0x73e745a7),L_(0xfc620932),
+ LL(0xbda630b0,0xd49816e2),LL(0x68c388d9,0xabd8c48b),LL(0x741de91e,0x3b976a04),L_(0xf24259fb), LL(0x5a923f4f,0xcbbf2684),LL(0x56659522,0x8a51b8af),LL(0xea31954e,0x43c8b17e),L_(0x3d1de35f),
+ LL(0x1067b268,0xddd685da),LL(0xa178f2e3,0xe840e9b4),LL(0x859daa46,0xc3965546),L_(0x65f74f36), LL(0x3ebc87fc,0x31952a50),LL(0xd0b694c6,0x2ba1d2d4),LL(0x4f51b3a3,0x20b2748b),L_(0x54b61458),
+ LL(0x450b7ea8,0x91be987e),LL(0x92390774,0x530b2e3f),LL(0x31cf3730,0xd8dc53f9),L_(0x490c450f), LL(0xe4e70ece,0x604fd792),LL(0xb689243f,0xa20bf532),LL(0xb2d8f482,0xdc31ef3b),L_(0x506dd3c6),
+ LL(0x89cb2010,0x1196c48c),LL(0x6755b53e,0x59cee16a),LL(0x6a0e74ef,0x2da63e64),L_(0xaa8ea0cd), LL(0x661a0e7f,0xb013649e),LL(0x1ab0635d,0x56e8f0f1),LL(0x9858a79d,0x65938865),L_(0x3acb5b92),
+ LL(0xf39d8f51,0x28b2de13),LL(0x6b120542,0xd10ea1ae),LL(0x5ea493a4,0xbe9b2f46),L_(0xcdd3cbfb), LL(0x9af8b9c3,0x543265a5),LL(0xf3a605c4,0xe8ee990d),LL(0x92bcbe09,0x1d71ae8b),L_(0x4ad0176d),
+ LL(0x77ad60e7,0x183493f0),LL(0x3e8ef423,0x4d9cc856),LL(0x065effba,0xa9ccf6fd),L_(0xb0500b2e), LL(0x122bf6db,0xfb31da5d),LL(0xe16bd325,0x3de8eb0a),LL(0x2bb46b58,0xcdab125c),L_(0x8179b8bc),
+ LL(0x72f249a0,0x54823e45),LL(0x263960f2,0xb1c1bcb0),LL(0x21ab8a5f,0x193b2d98),L_(0xb940533d), LL(0xc80b7cd9,0x7586193c),LL(0x671090ab,0x40d0049f),LL(0x216acee5,0x6bb91540),L_(0xcc4fc3a7),
+ LL(0xc26826e4,0x0e69184d),LL(0xe86f6c8e,0xfa8a33b4),LL(0xe88688e1,0x9beec95a),L_(0xd008257c), LL(0xa638dd0b,0x35395ef4),LL(0xacddfb2b,0x005b4fcb),LL(0x086efe98,0x8a1a0ad3),L_(0xb4d51fd4),
+ LL(0x9613f782,0xd8510368),LL(0xd5dedcbd,0x7ea65e3d),LL(0xab06f6a4,0xbd599498),L_(0xc5aa099e), LL(0xf3eb18eb,0x32f40f7b),LL(0xad93fbe0,0xfde611a8),LL(0x40b951f1,0xf5751752),L_(0xfc37b6e1),
+ LL(0xc4dba0cc,0xaae77bea),LL(0x58b91be1,0x7a9f5f3a),LL(0x6ad767a4,0x9b47cd71),L_(0x24d37cee), LL(0x7268bfef,0x70ac8b25),LL(0x2da13b60,0x16423d93),LL(0xbadf18ad,0x62a037c8),L_(0x78224e07),
+ LL(0x334baa48,0x6a2f2198),LL(0x1578e706,0x50c74263),LL(0xa273c223,0xe95f128a),L_(0x2b3feceb), LL(0x0c8d88cc,0x4d1450aa),LL(0x247fea5e,0xb5c004a3),LL(0xcc56e421,0x32f2d692),L_(0x001d3250),
+ LL(0x63905c2b,0x3d1a2b08),LL(0x1192eb20,0x7a96aa59),LL(0x194cd936,0xcbfbf813),L_(0xe3ba3ce4), LL(0xdc1fe33e,0x8d6355cd),LL(0x36393a36,0x3c74701a),LL(0x6d3b3d2c,0x50d98fcf),L_(0x2da52d36),
+ LL(0xa9690fb6,0xd68d0be2),LL(0x87600722,0x2fa3c8b8),LL(0x6a898b0f,0x64b1c25c),L_(0xf26df29e), LL(0x18b74321,0x0562d2ac),LL(0x116fb9cd,0x1b89331d),LL(0xadee6e40,0x19e073f7),L_(0xdcd869ef),
+ LL(0x39df6bf7,0xd9747842),LL(0x484e4a18,0x9ca1c1ce),LL(0x2181acfd,0x09d6f90f),L_(0xae25cfad), LL(0xc2644ecc,0xb6aa912f),LL(0xeb2922c9,0x767976e7),LL(0xbe3728a6,0x3b8ce6be),L_(0x04eb6141),
+ LL(0xd6e6d0b5,0x618ad07e),LL(0xc862e8d5,0x926d38e4),LL(0xca247f9d,0xaa268736),L_(0xbded92f5), LL(0x1a6031fd,0x9481e659),LL(0x42b36d96,0xc8b3617c),LL(0xabfa2ad2,0xd3f46f02),L_(0x1cbbeccc),
+ LL(0x2057edf3,0x2b94f0fe),LL(0x608a4b71,0x7ca57706),LL(0xdd35cef8,0x236745ba),L_(0xb4d5d169), LL(0x99412994,0x03f0b33a),LL(0x826e0d5f,0x0c5801a2),LL(0x31eb9951,0xf2cc0540),L_(0xd954458a),
+ LL(0xf649bf08,0x2c486c0b),LL(0xa5afc024,0x9417e436),LL(0xb063a531,0x38aa1ed3),L_(0x1558aff7), LL(0x004fbb10,0x904e9ed7),LL(0x3494f0b6,0xd2555c07),LL(0x365e3d05,0x0f32df2c),L_(0x5c8f30d5),
+},
+/* digit=4 base_pwr=2^28 */
+{
+ LL(0x2f432139,0x6a7ebdd1),LL(0x676d690b,0x25d6c68a),LL(0xf169ac1a,0x70ef4a18),L_(0x3fe9e66e), LL(0xa193f6f9,0x9b515115),LL(0x6b6b0581,0x4399b66b),LL(0xd0e88db2,0x52c4fcf1),L_(0x31c324fa),
+ LL(0x62e391aa,0x403677bb),LL(0xe67af8a2,0xcd3fd0e0),LL(0x0b4be307,0xdcb51813),L_(0x88ce9bf6), LL(0xe4877d66,0x0f788e98),LL(0x8400154f,0x1742afd0),LL(0x768edb4a,0x80428f26),L_(0x277da6c6),
+ LL(0x0b15cc70,0x6933e246),LL(0x8f4bec34,0x8bc92958),LL(0x13b62772,0xc9121c92),L_(0x543662c4), LL(0x4549aa77,0x1090a59c),LL(0xc62e7c6f,0x066a0956),LL(0xa38394a8,0x19c57ed5),L_(0x4823e8cf),
+ LL(0x003e564b,0x61b100d2),LL(0x416f9398,0xaf3087cc),LL(0x8d0f5a48,0x11e5f34b),L_(0xe047da80), LL(0xe946d928,0xc598885a),LL(0x455959c9,0x838b9ed4),LL(0xe69bdd02,0x6bdbe44c),L_(0xd3377883),
+ LL(0xd1de4464,0xe93c7baa),LL(0x23daaa17,0xb54baf63),LL(0xcf91e74b,0x64e1431b),L_(0x1ae9e235), LL(0x43fd6c3d,0x2c00590f),LL(0x0ba0b46e,0x98d151a0),LL(0x1ee4dc18,0xe61cc51e),L_(0x93805289),
+ LL(0x15b970a3,0xa33f496c),LL(0xc65b315e,0x3f6d708b),LL(0x25723787,0x2ca2c551),L_(0xc7e943c6), LL(0x9a10432d,0x1845a431),LL(0xb33bb1fe,0x81764017),LL(0xf5b5a1e6,0xbb41c15a),L_(0xf5bd0a9c),
+ LL(0x042a23c5,0xe9864244),LL(0x73ab2381,0xbb7b2648),LL(0x0ed12b18,0xe3536d47),L_(0x0a040c86), LL(0x9c5a68b2,0x550f5800),LL(0xa16b2d10,0xfa0aebe0),LL(0xd20e3020,0x40239ea3),L_(0x13feb317),
+ LL(0x8e882fb8,0x12206859),LL(0xd53242c9,0x3e1a95f6),LL(0x1c2921f5,0x765eedc1),L_(0x84f582be), LL(0x525bb499,0xf8de62be),LL(0xf9eee520,0xd0a27199),LL(0x209f3c9d,0x721633cd),L_(0xc2e9678c),
+ LL(0xc8a35690,0x852acfe8),LL(0x92b626ca,0xdde1d1be),LL(0xf571ade2,0x918c76fa),L_(0x5b7490f5), LL(0x38c8b0c0,0xdf1662bd),LL(0xbb1e6d8b,0x470868d3),LL(0xd821c745,0x9a06de8a),L_(0xcaec5c2c),
+ LL(0x64f233d6,0xc1321d2a),LL(0x74538108,0x30546bc8),LL(0x2f1d65e6,0xc8d1c486),L_(0x8ecd7a1e), LL(0xccea4b95,0x3466245a),LL(0x700ed4ab,0xf5d50910),LL(0xfa32badf,0xb5a66db1),L_(0xfc4883b2),
+ LL(0xb4589512,0x962b479c),LL(0xc4a7efe4,0xb97069b4),LL(0xa0d20fc9,0xd0ef4040),L_(0x76eabbd4), LL(0x38b07e76,0x17a75081),LL(0x4bc6d910,0x3d3dbafe),LL(0xff0f721e,0x36e896fb),L_(0x6146e5ef),
+ LL(0xab1ff699,0x6fd3001f),LL(0xe508cb13,0x5b228934),LL(0x80a73390,0xcc02c93c),L_(0x6ad8073c), LL(0x9444deec,0x5f92bcf6),LL(0x8847a6eb,0x06c7d42b),LL(0x758f4aa4,0x40b45a83),L_(0xdb4ada91),
+ LL(0x0083de14,0xfff55c75),LL(0x661c826d,0x317fc21d),LL(0xb311e146,0x6bdaa80c),L_(0xcad158e9), LL(0x69952fc9,0x4502f454),LL(0x239ecee1,0x74f37d8f),LL(0x2b344eb3,0x161e1cf8),L_(0x02ce3f80),
+ LL(0x645e7684,0x0009b919),LL(0x53d14c44,0x8105efea),LL(0xcbb0101a,0xdf767e4c),L_(0xecc4eabb), LL(0x0c2ac7fe,0x70cf6d6c),LL(0x0ede1159,0x17089527),LL(0x4162258f,0x5ed679cb),L_(0x5e706cdc),
+ LL(0xcd1206e2,0x33b4ee64),LL(0x78fd4645,0xcab93e67),LL(0xb807ac0a,0x7e760bcf),L_(0x923934bf), LL(0xfa2159f5,0xaf2ed832),LL(0x918e957c,0xe1d5b548),LL(0xdf411692,0xde9c3716),L_(0x2c76553a),
+ LL(0x3d4c49ae,0xd3a72d08),LL(0xa5e4f840,0x03aca3cc),LL(0xd9bcbe83,0xf00706d6),L_(0x986b79c3), LL(0x412a3304,0xefb01a68),LL(0xa0bb40d2,0x19e3729e),LL(0x2d182974,0x57b4bca1),L_(0x43c566de),
+ LL(0xb3db024c,0x2f1c7c7b),LL(0xfb3c8bb1,0x86b88161),LL(0x1addae50,0x29206628),L_(0xa115d8d7), LL(0xc7b9fa3c,0xcf3f272c),LL(0xf2a0db00,0xb0b04d71),LL(0x1a242dce,0x048ec06d),L_(0xbe72542f),
+ LL(0xc6eb32f1,0x515f5aba),LL(0x995a0552,0x9e89cf10),LL(0x809459ef,0x2a52fccb),L_(0x4bf08352), LL(0x31a7e6c7,0x94c73471),LL(0x507e309b,0xc1732a6e),LL(0x006ea760,0xd3410c08),L_(0xde332d38),
+ LL(0xe9a863af,0x05608149),LL(0x971e9a21,0x80261bb1),LL(0xcf890a46,0x607c23ca),L_(0x8c2f3995), LL(0xee178996,0xb8358125),LL(0xc384ccce,0x8630d610),LL(0x62e3cda6,0x637377fe),L_(0x36145889),
+ LL(0xebe66e5d,0xa7ccaba3),LL(0x66ee0e61,0xe5d23ef3),LL(0x8b52d5b2,0x9b192439),L_(0xe2507e26), LL(0xdebe6661,0xf0320f46),LL(0x164afe7b,0x06272a4d),LL(0xa9cd4c00,0x53be168f),L_(0xbd05717a),
+ LL(0xb9a090f6,0x82377241),LL(0x84720302,0x8cab5c0e),LL(0x3e8eab14,0x8131dcb9),L_(0x8dffb402), LL(0xe82db9aa,0xca87536f),LL(0x7476d50d,0xc99eb71b),LL(0x40036a93,0xad40e0b3),L_(0xae5c279a),
+ LL(0x203e82ae,0xce0565d4),LL(0x4590aef4,0xf8303097),LL(0x813e461c,0x4d52d217),L_(0x64b75926), LL(0x1774cb88,0x51483218),LL(0x4046569c,0x804c4220),LL(0xbd282e8b,0x394837d5),L_(0x5a6b2c1e),
+ LL(0x7eb4bbcf,0x58408340),LL(0xa28c5b85,0x9cd1f588),LL(0xac9ddd98,0xdf706c18),L_(0x62a72bba), LL(0x1ecd1293,0x7437fa2c),LL(0xafe0e361,0x5b13b49c),LL(0x29283b54,0x0c099515),L_(0x469c2258),
+ LL(0x611af3b1,0x1869604e),LL(0x69cd9356,0xb7d10b48),LL(0x161651d5,0x8a8472c4),L_(0xa23f6947), LL(0x8a84a570,0x9ca82d05),LL(0xdd9ffcc5,0xbdf0cb1e),LL(0x7c9cfaaf,0x8b227092),L_(0xc52e4c68),
+ LL(0x344a8ce2,0x66b5d593),LL(0x661a0707,0x277d6af9),LL(0xf0ed8bfb,0x9f814a89),L_(0x68ff82da), LL(0xff4e0f6a,0x54b6136e),LL(0x125a9d0a,0xe9e8996a),LL(0xdbfa6d51,0x0914dd93),L_(0xacae0da7),
+ LL(0x326565a3,0x41cc5966),LL(0x8e32f402,0xa314cfc5),LL(0x99f4bcb7,0x0ba8496e),L_(0xcbcf93d4), LL(0x58afb0bc,0xf2f01549),LL(0x22877383,0x775e4843),LL(0xf270905d,0xfeb2c8a5),L_(0x15d8ffe9),
+ LL(0x111a2a90,0xc56f7437),LL(0x435cbc99,0x64f9c9bd),LL(0xedb87fdc,0xc1d19083),L_(0x702066e8), LL(0xc8dbc37a,0x2c1c4233),LL(0x672ee8b0,0xc183ca5e),LL(0xfc342416,0xaa518aba),L_(0x34e2bf87),
+ LL(0x13de8a41,0x3bd53f9f),LL(0x38707713,0x326f7696),LL(0x6251ddca,0x4c9a0c1a),L_(0xe7e323fd), LL(0x6876f934,0xd33612f2),LL(0x93f34e7a,0x1b94f160),LL(0x0c42a981,0xdc0b91ab),L_(0x548c92c1),
+ LL(0x4cbbb4e6,0x72ed1d97),LL(0x0de1c184,0x5a3987bf),LL(0x86904dc8,0x45379ece),L_(0xbe4c089a), LL(0x87ac4c8e,0x6d5238ae),LL(0xa27b3f88,0xbf067204),LL(0x21e17b1e,0x122542d6),L_(0xd6e7acc3),
+ LL(0x84631900,0x01b419d0),LL(0xdb03ac70,0x4d15d553),LL(0xc5304466,0x5f684940),L_(0x11655587), LL(0x8f896988,0x196f70de),LL(0x771ca6aa,0x79277c70),LL(0x4a94022c,0xb69fe2d3),L_(0x076b1dc4),
+ LL(0xb8ac3536,0xecd18f22),LL(0x225dd231,0x86439125),LL(0x23c21f5b,0x43b63acb),L_(0xf5b2b43c), LL(0x9b9dfcde,0x7ec7a341),LL(0x362a2c90,0xd7db9d5b),LL(0x308c8fcb,0x608d86ad),L_(0x8858eb99),
+ LL(0x89b3a627,0x82f0ce08),LL(0x8ffc3544,0x4c9d1c88),LL(0x1414581d,0xf2cd74da),L_(0x2ab74c29), LL(0x47673821,0xd4c61a1b),LL(0x8b9a0584,0x4166899a),LL(0xd7114188,0x7b53c8e6),L_(0x4e91e1e4),
+ LL(0x83a918f0,0xe472f5b7),LL(0x120a4cb4,0xa54211cb),LL(0xd29feaef,0xa568a4a5),L_(0x1f0a0815), LL(0x80033652,0x52d9147c),LL(0x1dd52d78,0x73e66c07),LL(0x99e7538c,0x25ad4a06),L_(0x8a35cc7c),
+ LL(0x45837327,0x3daaae35),LL(0x214d493c,0x0495de90),LL(0xc0f2cff5,0x5e7107a4),L_(0x46024f37), LL(0x4ceabd92,0x0f39120b),LL(0xd7f5199d,0x26eb2e5e),LL(0x2dba9f4d,0x2755fd79),L_(0x54915591),
+ LL(0xf3749f34,0xbd4c1fd7),LL(0xbe148855,0x0fc24339),LL(0x7f36ce43,0x41ceba92),L_(0x40c686c2), LL(0xd073af02,0xa2355b2f),LL(0xeb937195,0xa16c5398),LL(0xa1f3ab05,0xf7d38672),L_(0x90828e20),
+ LL(0x7c7ef0f9,0x37b7db08),LL(0x4de172b0,0x2ce3e250),LL(0x3f8b6d32,0x1253fef8),L_(0xc76ebff6), LL(0x54208a07,0xc53e233e),LL(0x9a8ef0b3,0x6f68e154),LL(0x2d43fb48,0x9a94edf5),L_(0xc8891237),
+ LL(0x85578ac6,0xf170445f),LL(0x115d7eb6,0xd46f93ef),LL(0x71666f11,0xdfdf4d27),L_(0xcd09d0bd), LL(0x742f2abc,0x658ac044),LL(0xe75c6300,0x0f93b4da),LL(0xa0de2978,0x5ea75aec),L_(0xd9cc6143),
+ LL(0x7e1b6b82,0x2a662d9d),LL(0xcd959485,0x38780971),LL(0x5ee58f00,0x69a1ad5b),L_(0x417599f7), LL(0xfe8f4d61,0xc5110167),LL(0x471554ab,0x3201dfa1),LL(0x4e2c7d96,0xa6a4af88),L_(0xe49c13ae),
+ LL(0x44dc3bbe,0x0a1a147d),LL(0x23d766f5,0x3c2cbc33),LL(0x5446ea58,0x737348f7),L_(0x49f6d997), LL(0x2488e5f7,0x17464a0c),LL(0xf5ac023b,0x5e39103b),LL(0x1c89d9f7,0x5a4700e1),L_(0x918b1cd7),
+ LL(0x1a52af4c,0xd9c4d8a5),LL(0xfb136a04,0x62eae24c),LL(0x627e23b3,0x2a546df5),L_(0x9518b383), LL(0xc577abda,0xe74b275b),LL(0x9e8dd1b3,0xbe223e4a),LL(0xb28d50a9,0xc1bf5392),L_(0xf0c4dae3),
+ LL(0x12450901,0x60cd114e),LL(0x19f30dd8,0xb57b5e92),LL(0x0a04952b,0xa5b0d428),L_(0x9fbf17a2), LL(0x998f1456,0xdc88c74f),LL(0x2eaf445d,0x39f1ad33),LL(0x24d076c8,0xb7cb2b9f),L_(0x4da895c0),
+ LL(0x2bde5f9c,0x296bb0ce),LL(0x1e460fe9,0x8b7ed12e),LL(0x0a2b9d60,0x779ddda6),L_(0x70ad87c8), LL(0xda6b433e,0x1216c7ea),LL(0x015e5322,0xfbda2b1c),LL(0x08a2c2b4,0x5c4f2da2),L_(0xda0125d8),
+ LL(0x7e27d6a4,0x5cbb2271),LL(0x0e27b02e,0xf69dabcb),LL(0x651b4dc0,0xf5b545b4),L_(0x89864ae4), LL(0xe7bf1ebd,0xbfa85080),LL(0x0162c99f,0x358c27ef),LL(0xc148b34a,0x39fddb94),L_(0x7de290f5),
+ LL(0xbe0c0f85,0x8d61f3ca),LL(0xe4f10dce,0x4cbdbb45),LL(0xd40a9135,0xdb4a6076),L_(0x869e961b), LL(0x191ed5b2,0xc8ea7a1c),LL(0xaed2c272,0xe62f26a5),LL(0xdd267430,0x49228bdc),L_(0x196c9b69),
+ LL(0xda4dc900,0x5f4b0d32),LL(0x357d26fc,0x47de3ca9),LL(0x8bc3e1fc,0x44a306a1),L_(0x6ebde62d), LL(0xc4fcbc98,0x66c5b1ca),LL(0xc2a2d52f,0x6365559c),LL(0x67f40398,0x6a1916f6),L_(0x9eb2b762),
+ LL(0xd3f693c6,0x97ae197e),LL(0xe2705942,0x4294f4ca),LL(0xb717c180,0xfe30cc2e),L_(0x7aa89b4d), LL(0xb42643a1,0x3d1c1e8b),LL(0x1731a1a7,0x4e550c0f),LL(0x4cdde0b3,0x85e85391),L_(0xab7103b7),
+ LL(0xe4b061b6,0x39f1ba7e),LL(0x21c91792,0xcfcb8f5f),LL(0xd1e29983,0x8102c46e),L_(0xaa0fed15), LL(0xf3e438cb,0x1df20d6a),LL(0x659104e2,0x43818f1f),LL(0xd4f49239,0x3a84be64),L_(0xca582a23),
+ LL(0x3118786e,0xce03f04a),LL(0x827606a4,0x107aaf6b),LL(0x10bcfdd2,0x277b88b9),L_(0xf2e4c5e4), LL(0xb9b85218,0xb9213c6d),LL(0x161c54e8,0xebb4f0be),LL(0x2814c386,0x859e6045),L_(0xac244cf4),
+ LL(0x7292e148,0xd6446675),LL(0xab795487,0x71b2851d),LL(0x5a242339,0x899b5dad),L_(0x8520bc7b), LL(0x72df7577,0xa366ee1a),LL(0xc17b463a,0x30d222b1),LL(0xa0af7c17,0xddf53842),L_(0x85b5501f),
+ LL(0x124bc359,0xc8d63689),LL(0xcd7b3fe1,0xbfb69ae2),LL(0x124ab94c,0x6971b236),L_(0x961e282f), LL(0x7f403da9,0xb92ac7ad),LL(0xc76e5b2f,0x5d04c417),LL(0x8df11606,0x0055901f),L_(0x666181f1),
+ LL(0xf49645d2,0x96fcbeb8),LL(0x745bf74b,0xe0b2a4ea),LL(0x24675bb4,0x531c5deb),L_(0xff3b4dca), LL(0x560275f8,0xd74deba2),LL(0x97100731,0x02589d49),LL(0xa26f7f22,0xb1b02a6f),L_(0x396cb1a0),
+ LL(0x7de707a4,0xc6165fe0),LL(0xc07709d3,0x6be7081c),LL(0xfdb883bd,0xb1a5a67b),L_(0xfd535ec8), LL(0x25257079,0x8234b458),LL(0x45bb7b81,0x9c1b3f29),LL(0x1f4c2d8a,0xa1cee750),L_(0xcf55f516),
+ LL(0x206c7d17,0x0e3c9acd),LL(0x75c44136,0xd3de8638),LL(0xbe92eabc,0xf4ca1355),L_(0x9e459c32), LL(0xbf750404,0x4bc1af9e),LL(0xc06b8bfe,0x20fc4197),LL(0xe0b85f76,0x7d557c99),L_(0xff091685),
+ LL(0xbe45dd17,0x90ad8901),LL(0x5513303a,0x62ba8a0a),LL(0x9b18a004,0x8286d6c6),L_(0x73c22592), LL(0x126eaadf,0xf6402ecc),LL(0x2bbee8cd,0xa309b99e),LL(0xab06f9cc,0x42089652),L_(0xc4a5e5a0),
+ LL(0xe1391274,0x6925cad9),LL(0x6d3b1102,0xe366ed4c),LL(0x2e19a20a,0x1593ba2f),L_(0x8c091708), LL(0x9083afa5,0x711ad8d6),LL(0x1a65086c,0x5e8645a5),LL(0xc052325d,0x182117dd),L_(0x865d46f7),
+ LL(0x6f70a66e,0xfb548313),LL(0x7a6b6eef,0xae61c7f4),LL(0xec447933,0x6a3d4ff3),L_(0x74866913), LL(0x35042671,0x38316d02),LL(0xb9635b34,0x6a9889f8),LL(0x2db27177,0xac233369),L_(0x567be1c0),
+ LL(0xbe9b9347,0xcf5edce0),LL(0xa18e3f0f,0xe93ce044),LL(0x05816a5b,0xa26ca8e1),L_(0x00da101c), LL(0xacb5542b,0xe04bccb7),LL(0xa1f2efbe,0x470e98a4),LL(0x67b00a65,0xdd0dbd8b),L_(0xc0be2197),
+ LL(0x788904b0,0xe5a39b63),LL(0x0a586a5d,0xc10656ab),LL(0xe22752b9,0xfc9ab49c),L_(0x72fc1c09), LL(0x31249974,0x8b426974),LL(0xd51e5946,0x0c7e10a4),LL(0xa79d2b5d,0x8d8169eb),L_(0xe4ca8644),
+ LL(0x93ac6205,0x923206a9),LL(0xd8894d89,0x311a6950),LL(0x992f9c30,0xd0679c8b),L_(0x0cde00fd), LL(0x5d5f7311,0xf07baea8),LL(0x3f8e094d,0x00100a63),LL(0x3d3b3316,0xbfbe9e92),L_(0xd269b8cc),
+ LL(0x3357ad87,0x88e7f567),LL(0x8dcb5c06,0x7dc56ca1),LL(0xc8f6e06c,0xa6e90095),L_(0x905b4a44), LL(0x99de2654,0x63aa3a4e),LL(0x1e51e461,0x486476c9),LL(0x5fb4cf43,0x35d139e9),L_(0x8725096b),
+ LL(0x016940d8,0x2005767b),LL(0x95ce3a0f,0x0dce7b68),LL(0xb593a6ed,0x2c5a09aa),L_(0x762f3669), LL(0xe1f753d0,0x52242366),LL(0x88d38ecc,0x05e8fe24),LL(0x759292df,0x8843ff7b),L_(0x041ca14a),
+ LL(0x8edf1adc,0x0062aa12),LL(0x4bff8a1d,0xb1aa7c7a),LL(0x28b33bc2,0x966aee37),L_(0xb4b3e7e7), LL(0x2d9ceec2,0x7f31f05a),LL(0xc7be6aaf,0x10ae244f),LL(0xc2c97f7b,0x7401d050),L_(0x1475b928),
+ LL(0xd008f9fc,0x3150b4aa),LL(0xd53ede1b,0xef6ad2c4),LL(0xe427c40d,0xf4e2d20a),L_(0xe5dd8b02), LL(0xb370a814,0xac4f8ba7),LL(0xaaacf4ec,0x44dbb479),LL(0x8e6b2784,0xd9aeb4f2),L_(0x4019cd79),
+ LL(0x004de7f7,0x680b826b),LL(0xc0a2ee02,0xc1ff25d4),LL(0xb25a4e2a,0x8b33b701),L_(0x3a2939d0), LL(0x9621d94e,0xe6feb01b),LL(0xd1311810,0xca0e2b81),LL(0xa701c8f2,0xdbcecc81),L_(0xeee95871),
+},
+/* digit=5 base_pwr=2^35 */
+{
+ LL(0x22d3206b,0xb5c4c69b),LL(0xf507ee25,0x886af51e),LL(0x454a0f10,0xf21fe543),L_(0x29d7720a), LL(0x22d2999a,0x7c33ec2a),LL(0xb4054a86,0xa4d8106e),LL(0xdb971595,0x8a74b5b0),L_(0x8850caf4),
+ LL(0x3bc6ae19,0xa04cb662),LL(0xf30acc6a,0x4f889fa2),LL(0xd7560ec2,0xb8b6110c),L_(0x4f8fab99), LL(0x6bc71596,0x4308e608),LL(0x2c9d6af5,0x10d12c43),LL(0xca6486c0,0x64c7b963),L_(0x28ca7953),
+ LL(0xb662cfb6,0xbcc43ce9),LL(0x3055b2de,0x39c5bde1),LL(0x68461c60,0x4caf7c30),L_(0x84c1743c), LL(0xab0e6d70,0xb5b3a77f),LL(0x0e121552,0xa5bc5e90),LL(0xc38f8d3d,0x6cee1666),L_(0xe3236cdc),
+ LL(0x88d7b871,0x4220e847),LL(0xa785596f,0xc1fb7864),LL(0xfa4258dc,0xf4276ec4),L_(0xfc15e9f1), LL(0x293a6fc6,0xa58a670d),LL(0x9382335f,0xd56aed8a),LL(0x3477647c,0x311f9766),L_(0x4f5dbddc),
+ LL(0x6de91978,0x69933c7b),LL(0x21ea5af6,0xf13eda55),LL(0x4b132119,0x12e00aff),L_(0x0ff8497a), LL(0x3253a2e3,0xb8a8554d),LL(0x7d054f07,0x9338ab00),LL(0xb896b1fc,0x91dbc7f3),L_(0x6470c920),
+ LL(0x51929e02,0xc7b39de9),LL(0x93ff36ec,0x2b86f570),LL(0xa6f2dced,0x802aa4a0),L_(0xdbd9b943), LL(0xa8bbc105,0x8c1a0edb),LL(0x7cecf63b,0x54aa43d1),LL(0x54af7ee1,0x78b1b385),L_(0x0498d501),
+ LL(0xe2a3944b,0xf34b8646),LL(0xe5ba9123,0x61656a11),LL(0xc14ff9dd,0x42cbd03c),L_(0x2891aad9), LL(0xd76dd4f7,0xf01f7308),LL(0x55808c68,0x793b012a),LL(0x2ceb5051,0x9d313349),L_(0x2f3b809e),
+ LL(0x1cd0a45c,0x59881514),LL(0x919ddc75,0xa32929ee),LL(0xf87e0bab,0x3037e369),L_(0xa090d36b), LL(0xb3841cb6,0x579ffa96),LL(0x38e224e4,0x904c8cca),LL(0x2cadda68,0x702d5e89),L_(0x12eff4f2),
+ LL(0x92015c38,0x52239088),LL(0xfabf2649,0xd339e361),LL(0xe9f6b8df,0xe84977d6),L_(0x3f58519b), LL(0xaa4bb20f,0x4357d0b8),LL(0x6c5351ad,0x8521ac57),LL(0x1253d822,0x9524c5cc),L_(0xfbce31d7),
+ LL(0xc07ab316,0x2e93f070),LL(0xfcee759c,0x25c23713),LL(0x132e8c43,0x6a329ada),L_(0xec4a7a29), LL(0xe8c7f287,0xd5e2b374),LL(0x36a40bf0,0xcf0c0149),LL(0x9da99c9f,0x25e16e85),L_(0x7730bda6),
+ LL(0x4bd943c9,0x4e15a70d),LL(0x37a376cc,0x82e59c18),LL(0xad1329bc,0xe14b9f7a),L_(0xac8b6391), LL(0x60924a1b,0xe412693b),LL(0xb1a885d1,0x20e7bad4),LL(0xdd7cdcc0,0x06667f09),L_(0xfb4d7bf2),
+ LL(0xb6cb033c,0x350411eb),LL(0xc83be0ea,0x4b4e8d93),LL(0xc7612043,0xbb338804),L_(0xfb1e56ce), LL(0xef5ca7d8,0x4b75557b),LL(0xfed92eee,0x5e0d7736),LL(0xc3259e9d,0x61eea795),L_(0xc28b498a),
+ LL(0xbe56f422,0x7363a98e),LL(0xe21a8af4,0xb0ad92ac),LL(0x2ee0c526,0x081ad4e5),L_(0x50ce73f9), LL(0xecb59a8c,0xfce29612),LL(0x52824a9e,0xdcb3b781),LL(0xb689cfc9,0xac6e83b5),L_(0x006e1f4f),
+ LL(0x1f147d23,0xd0a972a8),LL(0xe471b9e4,0x346ed362),LL(0xcfd1906e,0xd7accdbc),L_(0x293a4390), LL(0x79ac99cd,0x86a243d8),LL(0x06c24954,0xca928f18),LL(0x3453aba8,0x25495810),L_(0x36f891b2),
+ LL(0xd91398ce,0xba90aff9),LL(0x4d72eeba,0x14e030a4),LL(0x81c31d9d,0xe70f3373),L_(0xa716b2aa), LL(0x2213b99f,0x42ac4252),LL(0x6f657c45,0x415aca82),LL(0x7d074644,0x461026d7),L_(0x0dde683d),
+ LL(0xa01e18e0,0x4b805781),LL(0x8dd02690,0x35c19d90),LL(0x1d04223e,0x83277841),L_(0x7ea96551), LL(0xe06c5996,0x4c78c04d),LL(0x70dde026,0xc34eaf3c),LL(0xb58c0bf7,0xae645b00),L_(0x3afcf537),
+ LL(0x76eb1d35,0x708a8083),LL(0x5f7d6f8d,0xc51a45c7),LL(0x141c5fc5,0x61a1cb60),L_(0x78ecbf19), LL(0xba4b17cb,0x4cb03ebc),LL(0x9be1423d,0xf30899fe),LL(0xd63cb771,0x51acdaa0),L_(0xa32591dd),
+ LL(0x88195009,0x8de09e86),LL(0x76e08928,0x70957a85),LL(0xa653c234,0x59256cc9),L_(0xd8d51507), LL(0x5d7b9252,0x47309994),LL(0x0f159c21,0x3ff7ccc1),LL(0xfe9fe5bc,0x0339c473),L_(0x16784f00),
+ LL(0x24c3bafd,0xf2b37280),LL(0x1cbd8aaf,0x2790844b),LL(0x8a600a73,0x2324a737),L_(0x644765ee), LL(0x4ad1ba6a,0xb4dd3d30),LL(0xa23d1c2e,0x9d90ab4e),LL(0x953388e0,0x864110e9),L_(0xe9be065f),
+ LL(0x9dfdba3f,0x9c32af38),LL(0x69ee0a06,0xf93a2f14),LL(0x1fd2a13b,0x38105c26),L_(0xfe12d778), LL(0x3947424e,0xd4a50774),LL(0xd5b96217,0x8f7c85be),LL(0x0f0582fb,0x9f4dc144),L_(0x87629c9c),
+ LL(0x6470ccfc,0x377dc9b6),LL(0x9e11a84c,0x09816331),LL(0x610e3f5c,0x9becf104),L_(0x87cc9a9b), LL(0x62783e9f,0xbefa56b8),LL(0x89fa53e3,0x18a4bfcc),LL(0x0b3ed787,0xdb99856d),L_(0x68d6dbd1),
+ LL(0x9620574e,0xdd0b49af),LL(0x7e561904,0x68703702),LL(0x3056fb70,0xab404bf8),L_(0x4911d8a5), LL(0x0f24dcd1,0x91807631),LL(0x606c33cb,0x6847c0d5),LL(0x791f57f0,0x525adb32),L_(0x818f0a1f),
+ LL(0xa84199ec,0x1094f386),LL(0xd1afe50b,0x558c85a0),LL(0xab294ef9,0x69998dcc),L_(0xe0d8fa53), LL(0xa8d822a6,0x6ccabafd),LL(0x64a8c67c,0x4f2dce66),LL(0xd4a601a5,0x8082a5ca),L_(0x1c89a181),
+ LL(0x49e538af,0x4855546c),LL(0x6d3c05ab,0x11f89f31),LL(0x44996dfb,0x9e6dd61e),L_(0xe5054752), LL(0x053ae779,0x4c1c7978),LL(0xa7675178,0x49d3b92e),LL(0x72b800a4,0x307c1a34),L_(0xafc9ca2a),
+ LL(0x73bd9113,0xf1254531),LL(0x1e52b09c,0xb3c304d4),LL(0xfc186009,0x579623ed),L_(0x0b5f7250), LL(0x0a3ddce4,0xa4d79ef7),LL(0xff4c374a,0xd69618ef),LL(0x252cb608,0xf8e76342),L_(0xfcc58682),
+ LL(0x1cbe9e0c,0x586d393a),LL(0x480cf461,0x2e2acea1),LL(0x13a215d4,0xe3cf0a14),L_(0x82460da2), LL(0x38bbf760,0x188125b7),LL(0xcd5956cb,0xa80c3de5),LL(0x9e63be59,0xbfc652be),L_(0x275a3495),
+ LL(0xccb821df,0x965c6e19),LL(0x0b8b60d7,0x03204648),LL(0xd6030341,0xc11f7050),L_(0x4e201a9c), LL(0x5815f324,0xdd1a6a75),LL(0x73f70f06,0x7aaff126),LL(0xebc85955,0x11a05e07),L_(0x0cd2e37d),
+ LL(0x34fb8b2f,0x7afa362d),LL(0xf7c5f96b,0x995871ed),LL(0xfa20c1e4,0x6be4e8e8),L_(0x02b63df7), LL(0xf9949e2f,0x3453fb74),LL(0xf6fdf958,0x376ae7a8),LL(0x502b7475,0xadf32795),L_(0x20557243),
+ LL(0xb1daffbe,0x446cdc61),LL(0x8eb329bf,0xefdaaa71),LL(0x369f125e,0x6c894dd3),L_(0x9db7bb62), LL(0x4dd5f542,0xc4277490),LL(0x31b2dbea,0xfe4eccd1),LL(0xb650ae0a,0x20fa0957),L_(0x29da364e),
+ LL(0x937b1868,0x3d0c5313),LL(0xaa1e00ca,0xb2ed18b4),LL(0xe23097a6,0x18e7fcd5),L_(0x790fdadc), LL(0xf18eb299,0x00c47190),LL(0xf4068839,0x1797157e),LL(0x5b080743,0x257f4df1),L_(0xd4b97dd1),
+ LL(0xcf771fe7,0x9e9f2679),LL(0x7fa3e72a,0x0a76d555),LL(0xec547443,0x303f3000),L_(0x74ba5f3a), LL(0x56040059,0xe1305459),LL(0xf97b4e0b,0x58cce0ba),LL(0x7b3e3dc5,0xb3342459),L_(0x849b0cbe),
+ LL(0xc043c4d3,0x156bffa3),LL(0xef4fdf72,0xc568dd1a),LL(0x0fb07e25,0x373456aa),L_(0x0c136024), LL(0x9c743fd6,0x75063485),LL(0x09872cea,0x512889e4),LL(0x1f75eff7,0x2982d676),L_(0x46918abe),
+ LL(0x19d6d0db,0x62d87801),LL(0x8ac63776,0xe6ac10ed),LL(0x3df57bb4,0xfb67a75d),L_(0x872c8f87), LL(0xb22e582b,0x49548c67),LL(0xa4ab6141,0x6cb6b04c),LL(0x5ae2f1d3,0xccb21fe7),L_(0xcc4c5d51),
+ LL(0x95de93f8,0x552b1d5a),LL(0xc91b6f0a,0xf6ce5a61),LL(0x26244e6c,0xebe1c6fb),L_(0xec4bbe5c), LL(0x4fe79929,0x35cfef8c),LL(0x09fa8c0f,0xc7ce6957),LL(0x77fdabaa,0x4bbc3792),L_(0x94421437),
+ LL(0xa29405cd,0x820d6808),LL(0x9b55ccda,0xf32ab874),LL(0x1046f37c,0xed3f6fb8),L_(0x07a02e6b), LL(0x6ed01e06,0x6676830d),LL(0xf82f2f79,0x1cd99760),LL(0x35492433,0x79d53ab5),L_(0x16a996a8),
+ LL(0x1f2f75b4,0xaa0f7a8f),LL(0xe4d29021,0x44a728bb),LL(0x9b86e6e0,0xdb26a514),L_(0xf567f4e0), LL(0x47f066f6,0xc1decce5),LL(0x9de6495a,0xbb842ffb),LL(0xda23fbb5,0x6557417b),L_(0x7d23ff08),
+ LL(0x5767ef80,0xc3c2aab8),LL(0x2e3254ff,0xb5203eb2),LL(0x48576b69,0x2e3a1aff),L_(0x4e27496a), LL(0xd5e96792,0x497974dc),LL(0xb0b36f57,0x8169a5cf),LL(0x1d0467dd,0xbd12d521),L_(0xee061337),
+ LL(0xa2a324b7,0x3a9a26ff),LL(0xfa637395,0x664652b4),LL(0xbc2048f0,0xf8ae9c4f),L_(0x7229d31e), LL(0x499224d1,0xd86d5de2),LL(0xd7e8cbb1,0x33a4a4fb),LL(0xa98c305e,0x382a852f),L_(0x7668edae),
+ LL(0xdf02b971,0x6d33747e),LL(0x6bae97b0,0x468b6590),LL(0xc0b8420d,0x0d1395e0),L_(0x5d523a37), LL(0xb00603ce,0xf196c7bc),LL(0x940889f2,0x7b8dc7b3),LL(0xa914e0ea,0xce35713d),L_(0xcb59a392),
+ LL(0x5a648ea8,0x984bd24c),LL(0x17b7b322,0x88be2da8),LL(0x33279a92,0xa03ade42),L_(0x3ac696ec), LL(0xa75e5e17,0x36f23ece),LL(0x4faba2b9,0x7b477179),LL(0xf70fdee7,0x7bbc4522),L_(0xeb035a5f),
+ LL(0x52c14e4f,0x5ddc6b6c),LL(0x150eef02,0xffc4fbef),LL(0xdd3f93bb,0x3696d783),L_(0x15012933), LL(0xe0cad04f,0xff6e69b5),LL(0xc84755b9,0xd70bfdb4),LL(0x118ab913,0x2da1eb13),L_(0x99325702),
+ LL(0x0bcc9e8a,0xdfd09cd8),LL(0xd7ddee82,0xf1564d08),LL(0x93460444,0x87b5bd4a),L_(0x0d5541f4), LL(0x87dcbe2a,0x2e83bcba),LL(0xd3e283ed,0xd947e2cf),LL(0xe52b803b,0xb28eb570),L_(0x4a8c77d7),
+ LL(0x7f6e4fa5,0x76362059),LL(0x18df4a69,0x41a44792),LL(0x70a8c001,0xf96be149),L_(0x69d0bc39), LL(0xef115578,0x59f09aa4),LL(0x53e28bf7,0xc1354a01),LL(0x3ef52081,0x28ac324e),L_(0xa781c57c),
+ LL(0xf28899e9,0xb145dd4d),LL(0xf8de49f2,0xc929d158),LL(0x7a359488,0xa5fe71f0),L_(0xea4e5a13), LL(0x62263448,0x8252a9a9),LL(0x9870bd6d,0xa478d63b),LL(0xd7e75649,0x73608571),L_(0xb0499f6c),
+ LL(0xf3fc02d9,0x63626f38),LL(0xee89a981,0xecb2dedb),LL(0x45b932da,0x25321bbf),L_(0xdd6b2382), LL(0x73c34e68,0xbd649606),LL(0xdbca6a1d,0xf7cc4ce3),LL(0x1e699d4b,0x940460cb),L_(0x7938144e),
+ LL(0x6625374c,0xa571f0bd),LL(0x50d17043,0x67316b9e),LL(0x7b24e59a,0x15047c8b),L_(0xe06a40d9), LL(0x71fd751b,0x5bc5aeb6),LL(0xaeb386d4,0x77f99ebe),LL(0x40fabb40,0x62bdfdf5),L_(0x6aace159),
+ LL(0x2c7b8857,0xde610cbe),LL(0xf6b35535,0xd1d9c553),LL(0xb7d2826b,0xb4edc29d),L_(0x03e1e5e0), LL(0x05ce2cac,0x789b199e),LL(0x03331148,0x44bc5992),LL(0xa966c64a,0x0851cfcf),L_(0x1622ec1d),
+ LL(0xb82bff1a,0x888b7c2b),LL(0x07cb3e37,0xade27f4e),LL(0xb017d5a9,0x7f7c933f),L_(0x42119d1d), LL(0x2b1e659a,0x5ef83e45),LL(0x0109f6b8,0x91081a86),LL(0x6e139181,0x1b624dea),L_(0xa2bd127f),
+ LL(0xa90158d0,0x54ae0fcd),LL(0x9a79307a,0x5d77cf42),LL(0x6d342e22,0xb177e174),L_(0x2e3ee119), LL(0xf32ebada,0x5e84ad5e),LL(0x08e8f89c,0x1f21876e),LL(0x425e69c5,0x42b47533),L_(0x0b2e547d),
+ LL(0x8c73ff85,0x041c2bca),LL(0xd43f468a,0xdff69743),LL(0x497dff29,0x58417877),L_(0x9551c8f0), LL(0xea9a5efb,0x1e1b3a51),LL(0x7aa44dae,0x62164b97),LL(0x82e3854e,0xe5d6128d),L_(0x2f25adda),
+ LL(0xce69fd62,0x92365b99),LL(0xdd4e8322,0x64c55482),LL(0xe083981e,0xbf7947a0),L_(0x5b678747), LL(0xe12f61e8,0xc98f9109),LL(0x0ca71f21,0x7084eee8),LL(0xe31a901e,0x922f7c66),L_(0xeed6566d),
+ LL(0x830c51a8,0x274ea5de),LL(0x52fe1ee1,0x6f8c93f7),LL(0x7dc25d86,0xd6285877),L_(0xda84cd8b), LL(0x48aed2f0,0xbb649ac1),LL(0x1e3ba4b5,0x6976562f),LL(0x6f9c137d,0xbd251ef1),L_(0x5e5495d3),
+ LL(0x239cae69,0x8392e4dc),LL(0xdc8ee05c,0x79a24fdc),LL(0x4eeeb0db,0x0d91ecaf),L_(0x31e89bf7), LL(0x4b9c499d,0xeca9047c),LL(0xee9a09ba,0x2d00d0dc),LL(0x81d64f7f,0xea9e0b50),L_(0xc7b60917),
+ LL(0xb40fe472,0xb48d4d3e),LL(0xb23798db,0x4985b85c),LL(0x4a87382d,0x829e3bb6),L_(0x492aac4a), LL(0x59bdf861,0xf58a6463),LL(0x96935f47,0x28f41a65),LL(0x3396e951,0x6d21b8d5),L_(0xe244afe7),
+ LL(0xe019d807,0x890b3389),LL(0x01b0423f,0xaf7bf53a),LL(0x6d8cdb00,0x68218ce9),L_(0x7809fc35), LL(0xd3b4c83e,0x446c771a),LL(0xaae3f3c1,0x8e7a1eda),LL(0xfb834953,0x89128662),L_(0xff1c7590),
+ LL(0xb5425304,0xe1d9d533),LL(0x52f4f30f,0xdcd37dd8),LL(0x3a3e06d4,0x6d0d3574),L_(0x9ec8c4a0), LL(0x48b20906,0x06630324),LL(0x8d559ed9,0x334cec45),LL(0x295b5edf,0xd0a2d07d),L_(0x8d6e5cd0),
+ LL(0x2b1a895f,0x42c70b2b),LL(0x4f4ae671,0x36254863),LL(0x536e7d65,0xfaa3003d),L_(0x94dc0a21), LL(0xc4355888,0x1592950e),LL(0xb4369ba0,0x6d4496df),LL(0x5f932085,0x6309e764),L_(0xe5462315),
+ LL(0xe10bf24d,0x08fa6e2e),LL(0xec60e2f4,0x4a8f6f4a),LL(0xa152beaf,0xcc5f8968),L_(0xbce9a53b), LL(0xedca75db,0x076de5d8),LL(0x31df6025,0xfb2b47e7),LL(0xce591c62,0xead89b13),L_(0x52e8a741),
+ LL(0x94fdce56,0x179fcba0),LL(0xc81fc0c7,0xa0dcd6da),LL(0x8eb90798,0xbdb2ded4),L_(0x820ef61d), LL(0x9c335535,0x2b8a3cbb),LL(0xf522badb,0x7214d9a1),LL(0x93d7057a,0x0ff17306),L_(0x70098d33),
+ LL(0x50cac57f,0x8e019361),LL(0x2f914dd7,0xa3854afa),LL(0x2acdf295,0x2848b0db),L_(0x0f138ea9), LL(0x8c64c319,0x4ea1b039),LL(0x49ae634d,0x47440022),LL(0x113138a5,0x8ed0557e),L_(0x2b0adbad),
+ LL(0x931ca67d,0xb33942ae),LL(0x1ecf958e,0xc163a1f5),LL(0xc66d2148,0x1f27ea10),L_(0x011365d7), LL(0x267a659a,0xc4208dd5),LL(0xb8f4d08e,0x61b362a6),LL(0x3e553027,0x29499eb7),L_(0xea028ba1),
+ LL(0xd2551fb7,0xa6f2df89),LL(0x5bf03737,0x40fa3c8b),LL(0x924c5819,0xce383c9e),L_(0x910aeacb), LL(0x641dc85b,0xbfdc9b58),LL(0xe45c96a9,0xd63db8d5),LL(0x726cada6,0x8177cf88),L_(0xa738df5c),
+ LL(0x0cdee643,0x21f30c42),LL(0x8cd0ef97,0xf0f5ccbd),LL(0xe6a63e2e,0xd4df1941),L_(0x57a01e9c), LL(0x498e2890,0x9c025c36),LL(0xdc96eafb,0xc9df9cce),LL(0x95fe2aa2,0xae8f18c9),L_(0x239e5894),
+ LL(0x52954a16,0x9c68e7cc),LL(0x22874bf5,0xac850b44),LL(0x64db3074,0x3b1f7071),L_(0xa14665fa), LL(0x87ef6099,0x78fc6e68),LL(0x77eb0618,0x1edffe76),LL(0x6d531161,0xf5f0fda1),L_(0x429c094e),
+},
+/* digit=6 base_pwr=2^42 */
+{
+ LL(0x0a953500,0x570bd76b),LL(0x42617e4e,0x493624f9),LL(0xec1fce2d,0xbd807766),L_(0x5098d9d8), LL(0xcbc6ada2,0x468a4f16),LL(0xada13650,0xb78fc3ac),LL(0xb5aa694d,0x1dce66de),L_(0x5318219a),
+ LL(0xfedbc51c,0xd30a5800),LL(0x97115f9f,0x2745e2b8),LL(0xbb10a57f,0xeff5c174),L_(0xadf87884), LL(0x589f5f94,0x162e3c5b),LL(0xa2bc843d,0x16aad5e5),LL(0x25478287,0xd6f94dfb),L_(0x31bb4258),
+ LL(0xc180bac0,0x6c5c8427),LL(0x46351cc8,0xdf01fd21),LL(0xb964daab,0xdd1d4004),L_(0xc4d0e945), LL(0x72fb966c,0xb82dabad),LL(0x7d7ac429,0x2268903b),LL(0xeed99c4c,0x7dafa986),L_(0xcbdad15b),
+ LL(0x60c5d65f,0xe5e0aad8),LL(0xc7b54b13,0xc4b812b6),LL(0xe9d8af38,0x008e0bc3),L_(0x71a411c5), LL(0x27cb0dc7,0xc482b232),LL(0x07289ac0,0x5042230e),LL(0x68d763c4,0xa128b566),L_(0xc589940b),
+ LL(0x62562a0c,0x533b21ed),LL(0xb86a434f,0x398ba505),LL(0x5f1dadf5,0x5b2f618e),L_(0x35caca2b), LL(0xcaf4b249,0x74cf7bbc),LL(0xb14dae65,0xd924780d),LL(0x27c04cc6,0xf5af0266),L_(0xc41f13b5),
+ LL(0xfd136860,0x5727ef4b),LL(0x9fcc3538,0x2af297df),LL(0x957682ab,0xe33ed1c3),L_(0x9f83349f), LL(0x64693518,0x5961423c),LL(0x5148178e,0x8650191e),LL(0x66e2c6e6,0x5986c53b),L_(0xd5c63ac2),
+ LL(0x11b49c5a,0x9082e761),LL(0x5661867b,0x1815dbbc),LL(0x8ece3938,0x30442089),L_(0xeddde973), LL(0xbf2eb7b4,0x3e2f678f),LL(0xd4f64e91,0x15fb42e7),LL(0x49fdfa46,0x0b104178),L_(0x78b6687a),
+ LL(0x391a31fe,0x9f724691),LL(0x0ca4bf22,0x79581fa0),LL(0x730e0882,0x4bbc9bf5),L_(0x91d1e24a), LL(0xd756f110,0x26de9371),LL(0xd72ae23c,0xf050810b),LL(0x6ca80e46,0x75b289b3),L_(0x777ca3a2),
+ LL(0x8185a290,0x7d3fcac6),LL(0xebb7ace4,0x1f109f32),LL(0x48bb32eb,0x0be22833),L_(0x3f76d58e), LL(0x1868a043,0x8e3df32b),LL(0x00f1bf36,0xd5e2b1fa),LL(0x8b204654,0xdaeaa58b),L_(0x3263322d),
+ LL(0x742ad365,0x648b273d),LL(0x2e05e12c,0x9a066a23),LL(0x3a732a3d,0x691aae3b),L_(0x6cd91464), LL(0x04fe3ff0,0x208c6c3b),LL(0xe4c05b8f,0x61fcbdb4),LL(0xd9e2218e,0x59cd9a06),L_(0x835930df),
+ LL(0x33eb0d51,0xd984c49e),LL(0x888fc640,0xd7d25d0d),LL(0x9bb00fea,0x4da4ce0e),L_(0xaffa26c5), LL(0x72396942,0x2307b843),LL(0xc6cd9202,0xc1d18e97),LL(0x3f8ed768,0x518df91e),L_(0xeadd2347),
+ LL(0xc1d3ad41,0xaf9c00eb),LL(0xb90b0248,0x6b575b77),LL(0x45a5507d,0x2e1dac5f),L_(0x8db688a8), LL(0xab53ef89,0xa655bbf0),LL(0x0fdb8f93,0xea6e6754),LL(0xfdb2b439,0x9751d174),L_(0xaef8bdee),
+ LL(0x0aa602c4,0xb601c379),LL(0xdaadd78b,0x3a6533ad),LL(0xb65d4dfb,0xb3e4d63b),L_(0x653e4965), LL(0xf35d8a67,0x8cbfa3ec),LL(0xbaaa17fd,0xd9cd6c4a),LL(0xe29a388e,0x50eade40),L_(0x2ec73453),
+ LL(0xd1812921,0xbac1435a),LL(0xaa859487,0xf5d2dc01),LL(0xb5b2445b,0xe22a73a2),L_(0xaa1116ed), LL(0x39d4f53c,0xf9d72a85),LL(0x616cb03b,0x27cfb1ab),LL(0xcdf54ee8,0x4cf9a426),L_(0xe0208859),
+ LL(0x0749a748,0x5300262c),LL(0x7faf0467,0xbb0d7807),LL(0xff47f117,0x93b14cbc),L_(0x484a66c2), LL(0x91118c52,0x654db6c9),LL(0x20220d13,0x6b9ef224),LL(0x1162cfdf,0x897e3ec2),L_(0xf29d6809),
+ LL(0xf7481883,0x2c67eef0),LL(0x1a833a88,0x49af9414),LL(0x8aa0f2d7,0x5fc1c69f),L_(0x9f06aae9), LL(0x2b6f561b,0x4ecfeaa5),LL(0x17fda35e,0xbf5973f7),LL(0x338ff3e0,0x0013029b),L_(0xe6215b79),
+ LL(0x45cc9ed7,0x45530707),LL(0x3d6ab800,0xa1f8d140),LL(0x34dca331,0x5aa02638),L_(0x4dc086c8), LL(0x5be308ce,0x6df633bb),LL(0x90bbb8d8,0xd7e74378),LL(0xc7c28c06,0x8dcb3bae),L_(0xa0c24314),
+ LL(0x2b4b775f,0x7f227ccf),LL(0x8cd51cfe,0x8cb18663),LL(0x68ea58e3,0x9f7bcc04),L_(0x3003cc72), LL(0xdb7fa1bc,0x5b982b6a),LL(0xd5ebd68b,0x64a1222b),LL(0x675b50df,0x9679336c),L_(0xa8fee552),
+ LL(0x1db92746,0xe51e0a9e),LL(0x75eb0c92,0x584f0a75),LL(0x9af943f8,0xa54c748c),L_(0x28a759fb), LL(0x59c61e20,0x1cea2c6d),LL(0xb0384781,0xd54f4a86),LL(0xf0f73ecd,0xb65d1ecc),L_(0xd26a77df),
+ LL(0x6f8d4351,0xcb23a541),LL(0x51dd59db,0x3cb31aea),LL(0x24f458a5,0x7d0b3dda),L_(0x26b341e1), LL(0xb5440aa5,0x80d2e582),LL(0x9e2fd334,0x1b5ad25e),LL(0x114215cd,0x794f6e44),L_(0xe3bb54b5),
+ LL(0x119ef86c,0x01429cdc),LL(0x7fb2c053,0x994ee3e5),LL(0xee0b3bcd,0xcf236537),L_(0xca6a0781), LL(0x9d76f90c,0x28ee066e),LL(0xe18e5f40,0x18225dd3),LL(0xb1e0ccfd,0x2a9ed4ef),L_(0xa109a3af),
+ LL(0x9f94c8a8,0xad211acd),LL(0xe621f731,0xfa0ba148),LL(0x072030c8,0xa71de5a1),L_(0x106812c7), LL(0x57d3fed5,0xeac9452f),LL(0x4ce2ef8a,0xff6172a2),LL(0xac163954,0x778bc2dd),L_(0x2e5cbdab),
+ LL(0x6d06223c,0x0baf79a2),LL(0x9c81a4be,0xe2bee5ec),LL(0x9363638d,0x8a4d69e0),L_(0x687f0dee), LL(0xdceee166,0xa6d3323c),LL(0x202ed4a9,0x354badbe),LL(0x1c483cb2,0x5bbe8c1a),L_(0x433b79ed),
+ LL(0x2c4c3668,0x3828dbf7),LL(0xb8a0c6af,0x17810cb9),LL(0x9f12e96e,0xdd7d6cea),L_(0xe595dcab), LL(0x5b28c732,0xad54b44b),LL(0xe8aa36bb,0xb904d92f),LL(0x11dcc1c4,0xcbe63415),L_(0xeff9d401),
+ LL(0x29014f0c,0xfef9f39e),LL(0x1d099df3,0x4d9cac37),LL(0xbf9c0427,0xe387610f),L_(0x0cce0331), LL(0x95f296eb,0x31cb09c4),LL(0xd62d1375,0x7a5fdf3c),LL(0x53290cd4,0xa90e25d2),L_(0xf1396054),
+ LL(0x83b59271,0xf603ca7e),LL(0xe57e3a51,0xa2fe4449),LL(0x547b9c97,0x5234c386),L_(0x44edaf6d), LL(0x6f332534,0xcea690d6),LL(0xf13946cc,0xdad5199c),LL(0x6ad6bb4e,0x9374003a),L_(0x36c2bacd),
+ LL(0x9a4d019e,0x341c30ad),LL(0x7e1c2c9b,0x96ee26ce),LL(0x17e56dfd,0xb65db139),L_(0x9888703d), LL(0x4d9f2cbf,0xe07d7042),LL(0x3e36f84d,0x2223785f),LL(0xb4b9c74d,0xbbd020f9),L_(0xed1bc384),
+ LL(0x08bd06c5,0x4432f2cf),LL(0xa3a488e9,0xec0de874),LL(0x9efd00d7,0xd17c4829),L_(0xf5128936), LL(0x83542187,0x35e93b48),LL(0xae41e05a,0x22977d11),LL(0xe030a465,0x41a1010a),L_(0x1db1bce3),
+ LL(0xe96cbfbc,0x6fb1c1be),LL(0xfe5cfb57,0x46e0f43b),LL(0x401be370,0x29b356b7),L_(0xef6ca52e), LL(0x1769847a,0x131c52a8),LL(0x3084c2e8,0x9a3bea64),LL(0x58a36c5b,0x8cfd7a22),L_(0xa076e835),
+ LL(0xc50d8952,0x74382b8b),LL(0xecf54e6c,0x22c47953),LL(0x80a6564f,0x3378864a),L_(0xf29ac0df), LL(0x87ce0bb5,0x9549b954),LL(0x71036c3c,0xfdefd453),LL(0xd3203c72,0x57b0b3ec),L_(0x7ee244a8),
+ LL(0xc911b9a4,0x2a2ae110),LL(0xe00edfa7,0xc23eb58f),LL(0x6b68f39e,0x8f5215f7),L_(0x0b132723), LL(0x750f7a6d,0xe7d50418),LL(0x85673786,0xd615c040),LL(0x231c0709,0x487f22bb),L_(0xf5e2a237),
+ LL(0x2e68e2c2,0x95692ad2),LL(0x0b27bb26,0x72e6eaf5),LL(0x090be6f6,0x8b45b55f),L_(0xea84dd7c), LL(0x8e110b28,0x928497fa),LL(0x971d5f28,0x100a822e),LL(0x6339a104,0x9ddbd5c4),L_(0x3fe08c7f),
+ LL(0xdbfc1ac8,0x987de692),LL(0x1683a455,0xee7012c8),LL(0xb38e1de8,0xdd0a3684),L_(0xf01af5d9), LL(0x1923ae0d,0x86ab28a0),LL(0xd4b30cec,0x3a16a7ed),LL(0x22c7c599,0x01cadc9e),L_(0xb5dd36ac),
+ LL(0xa274d3dd,0x8baf2808),LL(0x60cc335f,0x7c5d7b61),LL(0xa633db28,0x732a899d),L_(0x7f9cd569), LL(0xe146b7a9,0x04bce2d5),LL(0x1f59a0d7,0x8db165c3),LL(0x6d10e528,0xcbb166ea),L_(0x7fe10619),
+ LL(0xa561b19d,0x04d81b3f),LL(0x88a7293b,0x9822961c),LL(0x1732c2f0,0x057b8676),L_(0x320d8861), LL(0x8a935dc3,0x5bfbc590),LL(0x3e5d907e,0x1bdbcf0b),LL(0x2b35a3ff,0x1597d44b),L_(0x7605acfa),
+ LL(0xe27abdf0,0x6112f38e),LL(0xf5ab47b4,0x12fd1d52),LL(0x5984ae07,0x4fccb7e8),L_(0x81972b3a), LL(0x95532439,0x5d4f964b),LL(0x905ded37,0x60b2cf53),LL(0x6a31fa69,0xfb6ad50f),L_(0xd83dca88),
+ LL(0x8f19b88b,0x1b0ac422),LL(0x711dde1a,0x9363a89c),LL(0xb5e309b2,0xac0aec46),L_(0x17ee236d), LL(0x5719b962,0x600531c2),LL(0xce093e55,0xee69dc7c),LL(0xec04dd4e,0x59639b52),L_(0xb9e01d45),
+ LL(0xca086bb7,0x1b94ace6),LL(0xb0fee2ec,0x3ed113f9),LL(0x5c0b8f2f,0xdfd59ee2),L_(0x6a154d90), LL(0x462e146c,0x8fb75d59),LL(0xb692d5e7,0xc31c3f9e),LL(0x080f7773,0x1fbd50fb),L_(0xa4f8f9e4),
+ LL(0x7b7f1009,0xf63f6da7),LL(0x2aa45a5e,0xf59e459b),LL(0x2d7d0b41,0x29c1bc69),L_(0x8aabebdc), LL(0xaf1dea2d,0xb0063dbe),LL(0xc38e3c41,0x335900c9),LL(0x661ba0dd,0x99541913),L_(0xc19809da),
+ LL(0x7540a87d,0xff252d35),LL(0xa1530a6c,0xaffcab72),LL(0xc8e9b570,0x9793a371),L_(0x3489107c), LL(0xdcf94c42,0xf0b49c6c),LL(0x879022b6,0x35c46e5c),LL(0x069dd468,0x2c618b82),L_(0x64bde16d),
+ LL(0x4335b182,0x2d08df94),LL(0xed7d7c9a,0x919ddb27),LL(0xe80a7f85,0x357baf28),L_(0xbb968f21), LL(0xbcb38a46,0x8315da92),LL(0x96e91923,0x925476f6),LL(0x4e306972,0xc5ed2a12),L_(0x950bbe41),
+ LL(0xcd3c90b3,0x39668cb5),LL(0x077167b6,0xaea10320),LL(0xfce255b9,0xb37bc6b8),L_(0xf3809a3f), LL(0x860aeccb,0x7f61816d),LL(0x44d57109,0x80e57881),LL(0xb19cf5fd,0xdb202875),L_(0x42100d63),
+ LL(0x5a155cef,0xaf246d29),LL(0x7f3965a6,0x329527e8),LL(0x8d8e3138,0x26bde524),L_(0x11b1a769), LL(0x66b0792b,0xd87dfaed),LL(0x707808be,0x02a38ada),LL(0x04bb89d1,0xe52cbe87),L_(0x7ec2d88f),
+ LL(0xded9227f,0x5423908e),LL(0x43d7285e,0xa6f72d9e),LL(0x49363917,0x6a49fc82),L_(0xf5d8d60b), LL(0x067bfaaf,0xa0f34345),LL(0x665a2267,0x19294466),LL(0x1ac20d98,0xffa2e5fc),L_(0x4e6d33c1),
+ LL(0x558d4d1f,0x9731dc1f),LL(0xf1f7a37e,0x6a85be9c),LL(0x69d32744,0xea51b61d),L_(0x05851633), LL(0xa0b1e63d,0x04e8d8ba),LL(0x1c8bd021,0xa75506f1),LL(0xef76ca45,0xf099b725),L_(0xd230047c),
+ LL(0xf47e0086,0x44613936),LL(0x62171491,0x0105d7a8),LL(0xa07a7b6e,0x9015ad40),L_(0x306c9555), LL(0x166467b1,0x18925a9d),LL(0xaac18583,0x8a300595),LL(0x7d220577,0xbbd4708e),L_(0xf151aaec),
+ LL(0x6807a39d,0x6e04c9ec),LL(0xb57b3b22,0xd4d3310c),LL(0xa3593866,0xa01b71df),L_(0xa63bab57), LL(0x378ccde9,0x773f947b),LL(0xefc9bc76,0xe29288bb),LL(0xcb328f94,0xe12b780c),L_(0xb068b3ce),
+ LL(0x3bf9b78d,0xc1916a89),LL(0x62555b0b,0xad0d163d),LL(0x00203bb0,0x82d7d36f),L_(0xd8764be5), LL(0x91a430b0,0xf446925f),LL(0xa23e8076,0xedc1e316),LL(0xb903dea6,0x11610026),L_(0xd83fceb2),
+ LL(0x8f55d6ab,0x2739ed0a),LL(0xcff10abf,0x3b4b462d),LL(0xe0b269ec,0x92761d90),L_(0xc1c0ca0e), LL(0x2403dfd8,0xab5ce41d),LL(0x62aaaef4,0x9ebcf2d7),LL(0x5a3ff0da,0x3aa250ea),L_(0x8f10b784),
+ LL(0x2fbc9b42,0xe5bbf62c),LL(0xa53f3f3f,0x2c19f9e2),LL(0x27dd1952,0xeada36e1),L_(0x40a88ecc), LL(0x8eac382d,0xca0a31a3),LL(0xd318529b,0xcc8ff4c6),LL(0xefec04d1,0x49d3e4dd),L_(0x55c20eb0),
+ LL(0x54347369,0xc5f830ce),LL(0xbf310209,0x66ba5a3d),LL(0x1372fe7d,0xab6a0dc0),L_(0xaf6004cc), LL(0x65a2727f,0x8803af60),LL(0xa6088f51,0x91e29b12),LL(0x53f144ad,0xe77f4280),L_(0xd7d06ab8),
+ LL(0x978295dd,0xc4969a0d),LL(0xdf19cc2f,0xabbb112c),LL(0x8bd7557f,0x554a3a06),L_(0x8fe8b8dc), LL(0x516a1ab6,0xf261d772),LL(0x82e07bc5,0x4d16bca0),LL(0xd1d7da5e,0x45447ad3),L_(0x19044418),
+ LL(0xe167f824,0x3956922e),LL(0xf66675c8,0xfcc5cc95),LL(0x20469977,0xf5f39465),L_(0x011863a2), LL(0xaf5616e5,0x960a1daa),LL(0x66b9d7bb,0x2c7f8f70),LL(0x074a85f0,0xd9f9bf2e),L_(0x7dd3b230),
+ LL(0x4e5dc71e,0xe5be9e2a),LL(0xb5995728,0xb7e24b2c),LL(0xa127aac9,0x23c8cef0),L_(0xf11df0db), LL(0xe494dece,0xefcf6a97),LL(0x38cfdd79,0x936e7033),LL(0x899c799e,0x8c265685),L_(0x7cab4cd9),
+ LL(0xdfd2bdce,0xe6160916),LL(0x480a36fd,0x01a7795c),LL(0x3f7c1b1d,0x91f84a8c),L_(0x85381912), LL(0x14463148,0xb7408da8),LL(0xe263f58c,0xbd7b174a),LL(0x8ca85525,0x8c2f9aa1),L_(0x687fc42f),
+ LL(0xa86b0be3,0xf5f78e41),LL(0x3455a3e9,0x135a0c71),LL(0x30c1c2c7,0xddf065a7),L_(0x3692f51b), LL(0xebc66e40,0x0f5906c0),LL(0xbfc2af37,0x5229db63),LL(0x5fa05ed1,0xd9f88327),L_(0xfad22122),
+ LL(0x6a2bd6b4,0xcbee3324),LL(0xe6fcf3f6,0xbfd3822c),LL(0xc3e92fcb,0x7c43be45),L_(0x6def0ea9), LL(0xe2791c4e,0x72baebe0),LL(0xabf2c782,0xad049ecd),LL(0xff1c5bf6,0x21f7b8ae),L_(0xcada1649),
+ LL(0xa204b629,0x2e618a14),LL(0xe44e287b,0x1ee56452),LL(0x9ec08fe0,0x3cbeeaa0),L_(0x41378416), LL(0x65a854a6,0x3defdbe3),LL(0xdd8dc723,0xe7d6715a),LL(0x6d23302b,0xf1849878),L_(0x922ac03f),
+ LL(0x826900c1,0xf4361242),LL(0x5150fa93,0xbc384de9),LL(0x1bf1d7e3,0x0106a9fc),L_(0x90827c46), LL(0xb45c094f,0xd4951e89),LL(0x046acfdb,0xf1ea11f5),LL(0x38e792fd,0x2d8ca425),L_(0x07e228cc),
+ LL(0x2b9cf3d8,0x889c6c44),LL(0x12d9fd78,0xc8a37703),LL(0xa6aed948,0x46f4af45),L_(0x4de1be3f), LL(0x229dbecf,0x932b6857),LL(0x4b284bc1,0xa90d9c3e),LL(0xe27e82bc,0x9200852f),L_(0xe41775aa),
+ LL(0x762bd870,0x50a8e4b7),LL(0x9d917e78,0xdf55385a),LL(0x4ac6dc2a,0xeb63b95b),L_(0x585b0c05), LL(0xf896eb5a,0x876d7f21),LL(0xdd6e7325,0xbc4c0b28),LL(0x34a78682,0x55d49e0e),L_(0x7de26ccf),
+ LL(0x0018e94a,0xf3430043),LL(0x09139313,0x6fccb693),LL(0x32e29483,0x9f0a6227),L_(0x1c584d56), LL(0x4da9fbc2,0x11cca785),LL(0x53203116,0x349e04d6),LL(0xb1c8440b,0x0ec04b4a),L_(0xb4fd311a),
+ LL(0x4e394c99,0x4a367cf0),LL(0x82ea7247,0x419778aa),LL(0x35a8f8e5,0xee0c8d61),L_(0xeb47eaf0), LL(0xb8c3b039,0x7fc38516),LL(0xb4361b1e,0xedd99fe4),LL(0x24e2fb10,0x94b8860e),L_(0x1e4ac934),
+ LL(0xb83e5822,0x9c7f7bc2),LL(0x85016181,0xec2c9c48),LL(0xae2e08c9,0x1d49bd53),L_(0xd51d0f76), LL(0xe02702a5,0x574b1fa2),LL(0x275045e3,0x4b568161),LL(0xe63f9064,0xb270bab6),L_(0xcbacaf10),
+},
+/* digit=7 base_pwr=2^49 */
+{
+ LL(0x28c9f54b,0x55cc3b93),LL(0x81366649,0x9f91db20),LL(0x0bb5529e,0x66b83a45),L_(0x020a3d7b), LL(0x84c6fb9a,0x6d9c718d),LL(0x4c39583c,0x6e5e8c08),LL(0x063ccb67,0x8cb7eb45),L_(0x01328b11),
+ LL(0xc3d2cc22,0x7e06eec9),LL(0x2a100811,0x5a959809),LL(0xf4997f3a,0xf5c07857),L_(0xad98c158), LL(0x5ae7c1cf,0xf408207d),LL(0xdb7d94f4,0x8cd5c2c0),LL(0x6379ef0a,0xf3bfa4da),L_(0xde775bfd),
+ LL(0xd39752a4,0xd08dfe44),LL(0x9b19df92,0x208bc436),LL(0xfd14af8d,0xcc3f5ace),L_(0x9cb59da4), LL(0x97f49ac2,0x880b584a),LL(0xe1fa2671,0x72d9f8ff),LL(0x76bf0449,0x0c870e3e),L_(0x6fb6d427),
+ LL(0xbad01fec,0x70db0532),LL(0x12b3f8dd,0xf82bbcfa),LL(0x167ab18c,0x92abaaa2),L_(0x5e4d357c), LL(0x4304ac9f,0x1fb69d3d),LL(0x7bd8f0e1,0x15e5d010),LL(0x47351320,0x84b31510),L_(0x6a03c6b3),
+ LL(0x739b3599,0x5a2c8035),LL(0x91588e92,0xdac9ebee),LL(0x1b69af1a,0x451b95e7),L_(0x3517cee5), LL(0xb64f8f05,0x1e09f842),LL(0x90930327,0x099f2550),LL(0xefa175e0,0x9e48451e),L_(0xedef520b),
+ LL(0x43b4b068,0xa2492064),LL(0x1e8946dc,0xeddb27dd),LL(0x9916090e,0x82135311),L_(0x98fdccc1), LL(0x4585ddd8,0x31f673e3),LL(0xd529f3ea,0xac4307ee),LL(0xb119ca51,0x428145ce),L_(0xcf53a57b),
+ LL(0x3728e89e,0x38640e71),LL(0xa872dbd5,0x745bd8a2),LL(0x8f90052e,0xffeb6e87),L_(0x9a484b77), LL(0xb85a7c0b,0xe045b6ce),LL(0xb3a39b3e,0xafd92044),LL(0xdbc53298,0x462a1b9b),L_(0x60a23eea),
+ LL(0x050b6e45,0x8a1c84ea),LL(0xc38a15ff,0xc2315710),LL(0x5b502e99,0x67d1f3e4),L_(0xf85c7d6e), LL(0xd3018572,0x7c34a744),LL(0x94062e0f,0x8b89ec47),LL(0x9579c983,0x35f7a266),L_(0x63ed902e),
+ LL(0xbfd3d5c1,0x7e6607ad),LL(0x54fa21c1,0xbc8c84d5),LL(0x2c3baf13,0x177b275b),L_(0x39001a70), LL(0x71f9447d,0xf4928a3c),LL(0x9356e91a,0xd23bd45a),LL(0x30b1d7ca,0x02772478),L_(0x8c5ecfb7),
+ LL(0x5717dffc,0xcaa887a3),LL(0x4f7bef32,0xb1687f81),LL(0x5dec8cf9,0x8965403a),L_(0xcc362cae), LL(0xb0dbc045,0x37f6ba20),LL(0x35e7cde5,0x6c266c6c),LL(0x0d54e5e6,0x02d7913b),L_(0xf4a0addb),
+ LL(0xdde83971,0xcc348a37),LL(0x58983641,0x18fb2236),LL(0x237be719,0xd585a061),L_(0xdb2539f1), LL(0x35a8a0dd,0x403565cc),LL(0x78351808,0x011a3765),LL(0x6202e956,0x7f54736b),L_(0x660d4fb3),
+ LL(0x90a83185,0x6bc9ce97),LL(0xb22311a5,0xf3cc61c2),LL(0xe993a41b,0x85025abd),L_(0x432e7fa6), LL(0x3a136918,0x42d19cdc),LL(0x18144346,0xe5b41dc3),LL(0x2bd73670,0xede484f4),L_(0xa93261b3),
+ LL(0x62a3c5f3,0x38a7a728),LL(0x2660c15e,0x05a1c27b),LL(0xcbfe2670,0xe7715ea4),L_(0x803ef610), LL(0xfff730b3,0x6f2eb06b),LL(0x3e73d7f3,0xafffff2e),LL(0x8fe4228f,0x2703c35b),L_(0x801d9246),
+ LL(0xcf3f9f32,0xa7b3253d),LL(0xb347bed9,0xb88a3be1),LL(0x23367d55,0x50ebab37),L_(0xe6bc8d5f), LL(0xb7d8a5f9,0x9df003d1),LL(0xd78ada2c,0x0bb08555),LL(0x4989b92e,0xf9b3e9f5),L_(0x2dbbe952),
+ LL(0x1b0c7f5b,0xdc3c1c11),LL(0xfb949b08,0x8d1cf002),LL(0x010b8835,0x69483176),L_(0x73825d94), LL(0x95d368f2,0x7caf4449),LL(0x3cd86c08,0xd50eaa5e),LL(0x8ba59225,0x6d5a74bd),L_(0x1e6e636f),
+ LL(0xda9ad1f1,0x51eea6ca),LL(0x69de6020,0x3afc7be4),LL(0xf383a0c6,0xa7aeef7a),L_(0xec5ab9f7), LL(0xe3d53f58,0xb56f14b0),LL(0x7b78f2d9,0xda9d3372),LL(0xb4e91769,0x0886a015),L_(0xb8c7fe1f),
+ LL(0xbb4c1b2b,0x7b2d2c19),LL(0x3f05a7cf,0xc24e67f7),LL(0x8a978fa5,0x2541de9c),L_(0xb09f953f), LL(0xbd943ed2,0xa6872621),LL(0x0275a86c,0x9f103457),LL(0xc3073baf,0xe68e138a),L_(0x70608786),
+ LL(0x94c887ac,0x22def543),LL(0xc1d1a75a,0x70845389),LL(0x9d05dd03,0x13908388),L_(0xcac954e6), LL(0xcee91dc6,0xfb37d06c),LL(0x42873dd7,0x0976cad9),LL(0x77686ddc,0xbd6e2bfe),L_(0x0a7aae21),
+ LL(0xf93e73a3,0xd00f349f),LL(0x6d3f30d8,0xbdf0b725),LL(0x793a6f93,0x8e54b8c8),L_(0xa3ebe240), LL(0xef42120a,0xd3635d7e),LL(0x7527fefe,0x954dc6a7),LL(0x7ecf5710,0xe5c193ac),L_(0xc5b359a4),
+ LL(0xcee954fa,0x6a69e07e),LL(0x904b6a99,0x28557756),LL(0x74691c8a,0x377aafb2),L_(0xf8dfe49e), LL(0xaf1c65b9,0xbc4bbf13),LL(0x32c37416,0xa07e7595),LL(0xa6bc7861,0xb481fbff),L_(0xab667972),
+ LL(0x4ade6d39,0xd40e7121),LL(0x03318c55,0xe035cb6d),LL(0x5cc23063,0x7d21722c),L_(0x353dafc9), LL(0x57f87e8e,0x47d32da3),LL(0x8e5c3c5f,0xdd769bba),LL(0x4c620a4a,0xc2e2dc49),L_(0x6ac8f16a),
+ LL(0xe2c62094,0xe0aae2f2),LL(0x27e1fc19,0xe8068cdc),LL(0x9a5089ff,0xd066d3ec),L_(0x83ce796d), LL(0x15285915,0x3d7bd85d),LL(0x2109b271,0xbfaee64f),LL(0x032bfaab,0x4c64918b),L_(0x28f7e9fb),
+ LL(0xe9c1a122,0x81a3a910),LL(0x1ec15d92,0x1d6baa6b),LL(0x0de6b8aa,0x25d33d78),L_(0xdb94f1aa), LL(0x84537b54,0xcda754fc),LL(0x0aa41bac,0x07667978),LL(0x26a33ede,0xaed5fcc3),L_(0x03b383eb),
+ LL(0xc6a270c7,0x48a0860f),LL(0xe3c9d6e7,0xe8f8a0be),LL(0x1c9dda6d,0x37a0510c),L_(0x87290f47), LL(0xb746897c,0xe0b9b992),LL(0x04968462,0x691f74eb),LL(0x79bcdef3,0xba7c23dd),L_(0x3c9dfbbc),
+ LL(0xb9c1ad2a,0x4867362c),LL(0x9b7dcff4,0xea98891d),LL(0xf6be4fd8,0x9dd99069),L_(0xfc837cc5), LL(0xc4b7695b,0xa104db38),LL(0xe73440a8,0xc1d73652),LL(0x557bc30e,0xca38a194),L_(0x0b9107de),
+ LL(0x08821106,0xf9b3c662),LL(0x0572aa2e,0xa9b0c578),LL(0x6cf8f9ea,0xdc3bb3a4),L_(0x578fa229), LL(0x935620c9,0x7b780978),LL(0xe2e55595,0xaa7bd737),LL(0x1ae5674a,0x7d70eb0e),L_(0x6287e785),
+ LL(0x8161a173,0x60277149),LL(0x6418b451,0xe9fdf471),LL(0x008c73fe,0xc7a41b44),L_(0xb52d2690), LL(0x6217c51d,0x07d5913e),LL(0x28af32f1,0x584cce8f),LL(0x70ace437,0x249d5a1f),L_(0xe2634904),
+ LL(0x2aa8ec2f,0x91c3f75e),LL(0x7ac06d6f,0x3279d284),LL(0x8cbbcc96,0x6114dddf),L_(0xb3f952c3), LL(0x18133afe,0x50a376bd),LL(0x95633a5e,0x281108f7),LL(0xf0277529,0x900af3d2),L_(0x2aac428e),
+ LL(0x34f686e3,0xede089c0),LL(0xafe013ca,0x66ca4aa6),LL(0x24f9b482,0x7d9ab065),L_(0x7064130f), LL(0x59e2f96d,0x88599e65),LL(0x1a8684d1,0x81cccdd4),LL(0x5b828088,0xa7784039),L_(0x274e2738),
+ LL(0xa482a439,0x04a64674),LL(0xabf54d81,0x3a3f5066),LL(0x46144f06,0xc232e58f),L_(0x30cddd92), LL(0x4aba099f,0xc2b48797),LL(0xfb8c420d,0x6eb5b117),LL(0xb4d97ee4,0x8d97d0d5),L_(0x8101b1e7),
+ LL(0x3dd4c04f,0x98af21ef),LL(0xcd4340b9,0x57885c4e),LL(0xda56271d,0xcf1eb8ab),L_(0xcfc8c025), LL(0x42508147,0x99747ee9),LL(0xdff889cf,0xbf581471),LL(0x16fb6025,0x22ae0ed8),L_(0x56d4b8ed),
+ LL(0x3d08ef7e,0x0745f517),LL(0xc7781923,0x732c8246),LL(0x6cd5a87c,0xe1112158),L_(0x734d96e5), LL(0x0ea91035,0xfbc17aeb),LL(0x7d6ae9b9,0x9fdb5814),LL(0x6b340fbc,0x7a81eba8),L_(0xa462be47),
+ LL(0xd9df5a31,0xbad5359e),LL(0xcc17a45f,0x137fb217),LL(0x3962aaec,0x18daea3d),L_(0x24dea50b), LL(0x585f316e,0x2db980d4),LL(0x94722851,0x890d4e8a),LL(0x17a80fda,0x0cd73f37),L_(0x0ef75926),
+ LL(0x7ddc10cf,0x2994a0c5),LL(0x0d862f7d,0xe8d6d38f),LL(0xa326bcf2,0xb39a090d),L_(0xebe228c9), LL(0x3fb2d1f5,0x4fe39e13),LL(0x292a329c,0xa1c6d77e),LL(0xa1f5d625,0x3f828ea8),L_(0x70ad621c),
+ LL(0x997cd647,0xb7237a23),LL(0x94de2084,0xf796b3ba),LL(0x0c93caa4,0xd97e1daa),L_(0xb74fa915), LL(0x4dfd621a,0x146706c7),LL(0x23c7b716,0xd56307f2),LL(0x54c6c8af,0xbe011ca0),L_(0x2ef6e4a4),
+ LL(0xa3b6fdcc,0x33851601),LL(0xbee34e4c,0xd7da0ee1),LL(0x8e7c506d,0x2b92ce18),L_(0x62b378cc), LL(0xc8c0d60c,0x95f16f73),LL(0x661c0891,0xdc466782),LL(0xf7df962d,0x6fdadac1),L_(0x8f3ef4f4),
+ LL(0x81a3d47e,0x23206f02),LL(0x235bc318,0xf375259d),LL(0xec43017e,0xc5d4dab6),L_(0xf547238a), LL(0x6f0f9561,0x25d0ebfb),LL(0x8357f1bb,0x8c478548),LL(0xe137e309,0x996a92a8),L_(0x629e8aa7),
+ LL(0xa2b3a713,0x4a17680e),LL(0xa8c7b143,0xe242039e),LL(0xb84edf8c,0xf2acd3a2),L_(0x8b3a07a1), LL(0x4d9e5baf,0x2f0d5861),LL(0xcd2f47fd,0xe42d316f),LL(0x0d4da406,0x0cd04a92),L_(0x8ec4fcad),
+ LL(0x6dcda792,0x91a38da5),LL(0x76eb9c38,0xa4b8df93),LL(0x0a5b71ac,0x2d328a16),L_(0xf6122daa), LL(0x9fdf7693,0xa1eceeb6),LL(0xe9555051,0x2371d345),LL(0x55020183,0xae8df945),L_(0xcee3a23b),
+ LL(0x4fcaf8f6,0x88241ba4),LL(0x6839ac95,0x25f7328a),LL(0xb01a4c73,0x4e73d41b),L_(0xdbce70d9), LL(0x470b6777,0x25457ffa),LL(0x4155bcf6,0x2545dcdb),LL(0x79b75849,0x3c25b38e),L_(0x8c33a19b),
+ LL(0x5375d125,0xb2bc7aac),LL(0xc7b2eb56,0x434f55ea),LL(0x8112c880,0x15208222),L_(0x612138e3), LL(0xd30babc8,0xa6392e60),LL(0x7fcbfb2b,0xc2c437cd),LL(0xb4541276,0x134be404),L_(0x3de33a7c),
+ LL(0x2cb35099,0x27c80981),LL(0x6d995371,0x15e5f210),LL(0x1e16c2dd,0x0e59bd58),L_(0xfbad79fb), LL(0x819dc1a9,0x481ca9ce),LL(0x6cb52c72,0x7ae12702),LL(0x7e9afc86,0xfda3af10),L_(0x41a661b7),
+ LL(0xbab0c519,0xc421cd20),LL(0xb68b5cf7,0x1e9b3f9e),LL(0x107cec0d,0x81208f8b),L_(0x383162ed), LL(0xf0c38656,0x2a8bfdfd),LL(0x0f977619,0xedf48fbf),LL(0x382decc1,0x8e5df4ce),L_(0xf0414c84),
+ LL(0x3083dd2a,0x15f29276),LL(0x89f9b2a7,0x717244c4),LL(0x817b0a58,0x6ee121aa),L_(0xf56eeafc), LL(0xcb4b4066,0x0bbfabbe),LL(0x52eb19cc,0x3641db33),LL(0xc2b09e5e,0xa82ae35b),L_(0xd9cf95b8),
+ LL(0x8dada775,0x017073a4),LL(0x4f731dd0,0x7488377c),LL(0xd07b63f1,0x5e605b0d),L_(0x4769aa10), LL(0xf9e533a6,0x26cfa7a4),LL(0xfac43672,0x077deba1),LL(0xbb074c5c,0xe02c4623),L_(0xb6536982),
+ LL(0x711f0c09,0x0bd8823b),LL(0xca3a4054,0xe696bd3c),LL(0xbee559f1,0xac8c4662),L_(0x54b8d320), LL(0xff20eb5d,0xfc9e136f),LL(0xafaff913,0x7fd1bf6f),LL(0x15a9349a,0x81208c2d),L_(0x0d06fd25),
+ LL(0x5b98ceba,0xc4906f43),LL(0x3cb8d3d5,0x671d2405),LL(0xef621a84,0x42fee26b),L_(0xcb150abc), LL(0xfa8ba5fe,0x8c081900),LL(0x2e00a64e,0x548ca8ab),LL(0x4b9fa7b4,0x7c4d0b48),L_(0x60c91243),
+ LL(0x612a3e39,0x36d03f9a),LL(0x7049620b,0xf3a56627),LL(0x29c0b51d,0x50448eab),L_(0x3f0b2dd9), LL(0x673df2ce,0x217c3b7c),LL(0x8eca2e20,0x17355feb),LL(0x20883efb,0x3afc2315),L_(0xc23211b5),
+ LL(0x4fe29bd3,0x3c1d5c97),LL(0x00ef3bc9,0xb31d8854),LL(0xf1f069cc,0xc5bebf01),L_(0xf661ac1a), LL(0x08af7536,0x54219e41),LL(0x25a7fa91,0x10eb2c79),LL(0xf217cbfb,0xf0d4c0bf),L_(0x4f2df7eb),
+ LL(0x0daa5bcd,0x8f2773da),LL(0xb21c4cfa,0x88c3cc76),LL(0x52c04b62,0x590a0567),L_(0xf35f4a84), LL(0xdf2a6679,0xcc2e1148),LL(0x04ae8b1c,0x340ba5a3),LL(0x92f66f03,0x4053731c),L_(0x20aba0c9),
+ LL(0x55e48460,0x0a4bb9e8),LL(0x9ad08ec7,0x4d8d0e03),LL(0x54a4bb3f,0xc9bcb020),L_(0xf5564618), LL(0x0bfda4fa,0x2f0cb8a9),LL(0x64275534,0xc49d2847),LL(0x33405050,0xd7e50869),L_(0xaf97cbcd),
+ LL(0x6faccf10,0x96f1d3cc),LL(0x9f391b14,0x4db1c834),LL(0x5f6bed3c,0x008d20fd),L_(0xc79a2572), LL(0xe2180f45,0x77d13f01),LL(0xb71f049c,0xf95c462e),LL(0xe088bd21,0xbd449f9b),L_(0x3a76432d),
+ LL(0x0405bf97,0x12dbb0ce),LL(0x4f53adb9,0x2a497b10),LL(0x13ff9791,0x61674465),L_(0xa80fdde3), LL(0xc0cc1d8e,0x50e102a8),LL(0x28391810,0x621706f7),LL(0xd119b153,0x47aca745),L_(0xeb9f0102),
+ LL(0xc5273792,0x6dc8e415),LL(0xb01555de,0xe0184e8d),LL(0xc5669efc,0x14d3a409),L_(0x0c68a597), LL(0x41d1a98a,0xed8dbd5f),LL(0xc5474f33,0x98419695),LL(0xd21a5750,0xf6b7aed6),L_(0x0d2d58af),
+ LL(0x4cd02456,0xb63ca144),LL(0xa81eba20,0x84079574),LL(0xf6e2c559,0x4e439115),L_(0xe8f8d978), LL(0x283b6289,0x8cf406a6),LL(0x23a5c7d1,0x4837878b),LL(0x4e16a72a,0x3db551d5),L_(0x88436ae6),
+ LL(0x334d8d79,0x32172eb5),LL(0x7d243c47,0x1ed58d88),LL(0x4a4714a6,0xed3510a8),L_(0xfde7f4a6), LL(0xb3d82e22,0x1ed13734),LL(0x4721f266,0xa661cacd),LL(0xf2889694,0x99b1258f),L_(0x45218687),
+ LL(0xd82826c7,0xe91d500b),LL(0xcf933e7f,0xdfae0ba5),LL(0x2d1ad273,0x572c7767),L_(0x79dbaa6e), LL(0x6b8ab0cc,0x17390031),LL(0x6c991f09,0x81e5fbb5),LL(0xbaab3192,0xfc86b907),L_(0x93c673b6),
+ LL(0xbe8c8998,0x3543430b),LL(0xc2f96d5f,0x50196f53),LL(0xac730ca9,0x376185cf),L_(0xfeac300d), LL(0xe73fa407,0x96df0a24),LL(0xf035d502,0xcdda229d),LL(0x9ca93571,0xd64df17a),L_(0x01970aaf),
+ LL(0x7ca6efb8,0x471f2098),LL(0xa5fb90b3,0xd70e4a72),LL(0x2aa370a3,0x09b936b9),L_(0xcfb37658), LL(0x3b357def,0xb2dfe05b),LL(0x1e8ce8f7,0x3594e46b),LL(0xcf8806b7,0xf062523d),L_(0xa1c74034),
+ LL(0x03cfe393,0x02fd45e8),LL(0xf0d5ce43,0xf575564b),LL(0x86092a2d,0xc28ad111),L_(0x0990658e), LL(0x70cbd16a,0x850acec1),LL(0x097c875b,0xc2704919),LL(0x79052ae9,0x651a1ec4),L_(0xdf5b00e0),
+ LL(0xd20da620,0x7c4aacf3),LL(0x12306aef,0x51b1a962),LL(0x0369e1f2,0x86d193a6),L_(0x3bdb2181), LL(0x93dcf8af,0x4d9c6a9a),LL(0x2e587a72,0xae32ac0a),LL(0xe30d76a5,0xaf97ed7f),L_(0x20fbaabf),
+ LL(0x94bc93d0,0x044baaf3),LL(0x04047c5f,0xf8872ab5),LL(0xe4e3879a,0x436ef7e0),L_(0xed64bf04), LL(0x11c91ee8,0xa9c7bdcc),LL(0xc1679bbd,0x006ae67f),LL(0x38ba10d2,0x83b598cb),L_(0xa99537cc),
+ LL(0x01ef166f,0x18eb43c9),LL(0x5aa367ce,0x93100d60),LL(0x2dc9b947,0x066d6c04),L_(0x3a41602a), LL(0xb9778f57,0xfcc4d377),LL(0x3dbf71fc,0x1d448cab),LL(0xc9ccbaae,0x0aacb390),L_(0x985954f5),
+ LL(0xa4179427,0x1f6e5aab),LL(0x4d58f138,0x64717e7d),LL(0x72e75855,0x389e7a2b),L_(0x4b5aa1e6), LL(0x12a92070,0x29d90bc2),LL(0xb35b2d2a,0x553f857a),LL(0xaca3b9cc,0x832c687a),L_(0xe2911a57),
+},
+/* digit=8 base_pwr=2^56 */
+{
+ LL(0xf505ff0a,0x56b1b68c),LL(0xa766a468,0x85630476),LL(0x7f0a8ccb,0x15b9ce0d),L_(0x8bfb375d), LL(0x8741f066,0xe7944b6a),LL(0xe502fd6a,0x8026fb64),LL(0x079ac7ac,0x956dea42),L_(0x3fc3f258),
+ LL(0xbd407e63,0x7157aab7),LL(0xde649372,0x62a53378),LL(0xec032ca1,0xdc9ac491),L_(0xaf00af85), LL(0x5a1b0fb3,0x3d3a586c),LL(0xb1b4ed91,0x6cce27ca),LL(0x0da4ec47,0x2fb5dda7),L_(0xe69eb235),
+ LL(0xa2c9ee34,0x4a718a90),LL(0x6813c47e,0xaf44fcce),LL(0xcc1aaacb,0xbae4540e),L_(0xfd6dde20), LL(0xf4786198,0xa1399699),LL(0x47c1ef53,0xabb23a85),LL(0xff24f01d,0xa1779b32),L_(0xafe60f72),
+ LL(0xa9ef8159,0x6e7fd2ab),LL(0x206a6f14,0x802458a0),LL(0x43a11c7f,0xf31bbf6c),L_(0xe2ff97fb), LL(0x893d191b,0xb83101a9),LL(0x0b2c24c6,0x52ca6e06),LL(0xd00a24aa,0xc5ea4420),L_(0x80054822),
+ LL(0x3173ee97,0x5d302b85),LL(0xa3ec0bc2,0x275a0fe0),LL(0x7469b929,0xde033220),L_(0x9823907b), LL(0x06ebb14d,0x8d35908d),LL(0x668b8357,0x8a0b74c2),LL(0xcd96886f,0x388da84d),L_(0x8e759b7d),
+ LL(0x82c45d8b,0xb0068631),LL(0xb87f256b,0x51283056),LL(0xb7562059,0x554d7fad),L_(0x68b8bed1), LL(0xe9ccc163,0x5349ed31),LL(0xaa23f48d,0x0ef896e4),LL(0xac744603,0x125ee820),L_(0x150da1ca),
+ LL(0x546f326b,0x16a4c78d),LL(0x26b49a2d,0x42a579ae),LL(0x69e5dc3a,0x50449596),L_(0x2af6b2c1), LL(0xde7ccc7f,0x07439dc4),LL(0xf5736c67,0xacbc3d69),LL(0xeeb790dd,0x0cc523dd),L_(0xae2f8bbf),
+ LL(0xf1c49667,0x1c12b2d5),LL(0x7628ecee,0x7bc41dbb),LL(0x0692cc8d,0x65398808),L_(0x5048f64f), LL(0x2cde35bc,0xd880351d),LL(0xae75c4fc,0x131f80e2),LL(0x3e2ff89e,0x5f9ca860),L_(0x435a454d),
+ LL(0xfc6b3603,0x1dbe11f0),LL(0x805cdd89,0x0ed82341),LL(0x0562fe66,0x5d6a45d5),L_(0xc9eb9f56), LL(0x02dcc377,0x1fbcb272),LL(0x4b25d574,0x873a72d5),LL(0xb78a31c0,0x1466b27f),L_(0x468c47f5),
+ LL(0xba96c374,0xb836e3e5),LL(0xf6743281,0x2c1ed972),LL(0x13f41d4f,0xd77d4340),L_(0x397a6846), LL(0x748b4159,0xbd735496),LL(0x6560f3f3,0xeadd97bc),LL(0x61405ead,0x119c162c),L_(0x9870a7f1),
+ LL(0x7c46ea86,0x4f81eb05),LL(0xdd4548bd,0xaad784b0),LL(0x49ea4452,0xff17a13f),L_(0x54ebcb9f), LL(0x810464d0,0x3e7236a8),LL(0x4d44b2ce,0xfe62fc5f),LL(0xfeac4aaf,0x0d85cf3f),L_(0x7d7cb315),
+ LL(0x4ea682b5,0xb0f78fa9),LL(0x82bbcdcf,0xa319bd52),LL(0x01559ec4,0x7cdb7afd),L_(0x86ff3957), LL(0xc4e5e26b,0x6c320e71),LL(0x45b1afec,0x8d455eef),LL(0x9d12c298,0x6b93f2de),L_(0x3e21f849),
+ LL(0xbb797884,0xc12b655d),LL(0x219c2865,0xa6ec705d),LL(0xc6daf8cf,0xf3ec2977),L_(0x10269fa7), LL(0xf0951e7f,0x8de615f1),LL(0xb448dafb,0x0e454e35),LL(0xac03ce6a,0x0fd25b12),L_(0xb96afd44),
+ LL(0xc1091d62,0x069f14f0),LL(0xc970df0c,0xa04696ef),LL(0x8cddee54,0x0475ddb9),L_(0xac228ae6), LL(0xda3d6fc8,0xc73f5026),LL(0xbdeb5cb1,0x475ad247),LL(0x82098200,0x8694111c),L_(0xc11479ab),
+ LL(0xf181f7b2,0x0c73fe98),LL(0x4aa502d3,0xe9de471e),LL(0x6c27909f,0x4f620050),L_(0xf76957c1), LL(0xe0c4eaa1,0x1565b30a),LL(0xfba38431,0xb518ef0e),LL(0x65c7038d,0x82a6a124),L_(0xe7db47e4),
+ LL(0x56f2fd55,0xfdab8dbd),LL(0x773fef23,0x198d2eb9),LL(0x011efbb9,0x8698e8b3),L_(0xa4f63ad2), LL(0x8629eaf2,0x60003ff6),LL(0x5aebc019,0xd2455886),LL(0x00bcb9de,0x859f79cb),L_(0x6a9d21d2),
+ LL(0x7a576508,0x8a59362e),LL(0x21480f43,0xbd8af994),LL(0x4a37a459,0xe55838d3),L_(0x36aab717), LL(0xd4ef1a0b,0x1d33aa1b),LL(0x86dc1133,0xe457ffeb),LL(0x0a1e4a76,0xf9d8ea27),L_(0x7a9f7b61),
+ LL(0xc6332530,0xf5ab77c1),LL(0xb7c034fa,0xcae4753a),LL(0x89204639,0xd0dd8159),L_(0x4ba725f9), LL(0xae3159be,0xa510602d),LL(0xc72415fe,0xd6d54251),LL(0xa6bc7ccc,0x7d585ae6),L_(0xc90e9462),
+ LL(0xb6723f1d,0xaed13815),LL(0x84f02e2a,0x6de52d8b),LL(0xffdbb5f9,0x3c9269f7),L_(0x5c61743e), LL(0xb086030f,0xd5bc6378),LL(0xa9132224,0x607634ca),LL(0x12f65fd8,0x817445f8),L_(0xd0c982b8),
+ LL(0xfb02a22b,0x40f7fe3d),LL(0xcb5018ef,0x34d86234),LL(0xf32b39b6,0x621a4bd4),L_(0xe7c33edc), LL(0x974f5440,0x7972a383),LL(0x586d4bef,0x8b71269c),LL(0x81211aa8,0x8c46dfe1),L_(0x5b192417),
+ LL(0xe3e15473,0x30ddafb0),LL(0xe56640a6,0x71464526),LL(0xe01ca53a,0x6b7735ff),L_(0xa4ba7379), LL(0xfee843b7,0x184d5072),LL(0x1f2853f9,0x0b71f2dd),LL(0x0c65322e,0x77546dfc),L_(0x814529cf),
+ LL(0xbb7e4da9,0xe44092c0),LL(0xdcf36025,0x6e08eec1),LL(0xa38b0382,0x2beaabb1),L_(0x57dab020), LL(0x30b6f340,0x3fc25cd9),LL(0x16190d52,0x0d13ca42),LL(0x632514c8,0xc69b7cce),L_(0xcb82be1e),
+ LL(0x3eb4e07f,0x79d31336),LL(0x78cc588c,0x986322bf),LL(0x5d3ca505,0x0951b466),L_(0x82b9278f), LL(0x20636a0f,0x6c160f3d),LL(0x308d56c2,0x62ceeabd),LL(0x460ed898,0xcccc63ee),L_(0xd27b55ac),
+ LL(0x81017a2d,0x2097cb5a),LL(0x6fb48059,0x423d9fb9),LL(0x8b4a82f5,0x3bf0f71b),L_(0xda304a5b), LL(0x0620aba2,0x5d609c9d),LL(0xb32599e2,0x77106961),LL(0xea5b4567,0xc072d5ff),L_(0xf9f2dc57),
+ LL(0xbe531971,0xdacba735),LL(0xbc32b9c9,0x4c64a7d8),LL(0x154849a8,0x29e4dd9b),L_(0x11dfc29e), LL(0xbaa9dc51,0xc8616f73),LL(0x971ba9a3,0xf61450f4),LL(0x15776b0b,0x8325c930),L_(0x294a4ec5),
+ LL(0x86967b01,0x16f8969b),LL(0x235d5c34,0x3233bbff),LL(0x57aa97db,0x5c79afae),L_(0x417467c4), LL(0x2f6f6091,0xe7950968),LL(0x59ca92ce,0x9d943f83),LL(0xb1a7c34e,0x6203a921),L_(0x066a9647),
+ LL(0x759f1a19,0xfb7e2683),LL(0x84d55477,0x96a642c6),LL(0xbdee722d,0x74bfcbf4),L_(0xf514f2bf), LL(0x80d0ae79,0xba7058a3),LL(0x4713d1ae,0x6c24158b),LL(0xa6c17b5f,0x8941ddd8),L_(0x261d9ac7),
+ LL(0x943bc0de,0xac5e5ce6),LL(0x76370390,0xd093dc4b),LL(0xfce7f694,0x7c34fbe8),L_(0xe3b42849), LL(0x4b4bfe6f,0x8781925a),LL(0xe273ae40,0xfe87a94c),LL(0x777881ae,0x6fc64556),L_(0xb0f8e854),
+ LL(0x498275e5,0x024a93d4),LL(0xa6b66d66,0x05a83965),LL(0x56c335af,0x0805e125),L_(0xe1e39e4e), LL(0x059f9143,0x9bb438e6),LL(0x0e8dde7c,0x1ec8aae3),LL(0x06a38af8,0xa234eb6c),L_(0xd74870f8),
+ LL(0x0883fffc,0x05b51c39),LL(0x62d8ac43,0x839148f1),LL(0x8eefcd87,0x3b151865),L_(0x3c047e9d), LL(0x197a8a18,0x76ea2960),LL(0x82998a41,0x8a3902cd),LL(0x110b3b2f,0xbcfe60ba),L_(0x89b19d6d),
+ LL(0xab6f3543,0x8765ec48),LL(0x36e47913,0x1b75763b),LL(0x767e806b,0x81bc9bd7),L_(0x38103684), LL(0x0f165768,0xb8107b90),LL(0xbe9c24b5,0x54d331ef),LL(0x43623ea1,0xf06a675d),L_(0xcbeab5be),
+ LL(0x8e21820b,0xd064269b),LL(0x1ccbf4e2,0x7020a8a8),LL(0xe21fbca7,0x5cee0a5c),L_(0x263913a5), LL(0x8a6b9ebd,0xa3fc8bad),LL(0x047f1949,0x838a0019),LL(0xd1a5d116,0x35a0d475),L_(0x9e3419f5),
+ LL(0x742ad243,0x36c9f808),LL(0x631145ae,0x2db0aada),LL(0x0c423277,0x4bf70210),L_(0x2f1584d5), LL(0x6f50ff50,0xa19699d1),LL(0x8015f024,0xc8530fc5),LL(0xf9755c59,0x25538f41),L_(0x387ddb31),
+ LL(0x1985efbe,0xe8509933),LL(0x9e321e61,0xb8ff1d78),LL(0x7dc68e42,0xf8206e77),L_(0x58e783b2), LL(0xad8c32f2,0x906883cc),LL(0x6f41c769,0xa42d4644),LL(0xbb9527f5,0x38e2f27d),L_(0xcf17789e),
+ LL(0xf5dd9f3b,0x1bf5a9f9),LL(0xae648e71,0xe8b2f305),LL(0x3f5f8275,0x93245241),L_(0x80482c3b), LL(0xb0e6f457,0xef9f19aa),LL(0xaa9e665a,0x6dcb7ba1),LL(0xad522975,0xce379c80),L_(0xf8653e32),
+ LL(0xeea9e807,0x19d1e570),LL(0x4023698a,0x5fb46b4e),LL(0xa19db2ab,0xd2800586),L_(0xaee5fc4c), LL(0xe6f0c329,0x378c9ac9),LL(0xbcb82922,0x142d0bcf),LL(0xc3b8fa15,0x1b19035c),L_(0x1c3a4f74),
+ LL(0x074cbefd,0xf201d616),LL(0x88de2216,0x703ef032),LL(0x409f13a6,0xfc1697ff),L_(0x1f4ee383), LL(0x4f0ae8bc,0xc70f2c0a),LL(0x596702b2,0xf1e207d2),LL(0xaa0989d3,0xcc60a8c2),L_(0x5ba1fcbb),
+ LL(0x4e7d0964,0x3f768dfd),LL(0xee929e0b,0x0dda310f),LL(0x171719ee,0x91e6ec5d),L_(0x48549719), LL(0xb61e9fad,0xa3e2860b),LL(0xa30f11a1,0xa7e2c8e0),LL(0xf804fa42,0x58c435e7),L_(0xd81ff657),
+ LL(0xd7d22038,0x3ee264ba),LL(0x6d74b27a,0xf3577276),LL(0x776b6b64,0xa97538c5),L_(0xdc494d53), LL(0x89e972aa,0xe4acc7fd),LL(0xe5d1ac83,0xf7c63ea2),LL(0xf0a59879,0x9b5f787d),L_(0x0730aa6b),
+ LL(0x6c13249b,0x5d202340),LL(0x15ca4cef,0xfbbc39ae),LL(0x03078647,0x7cbaad05),L_(0x7a152a3a), LL(0xc0834b0b,0x5c759c2f),LL(0x1d48b5cf,0xc983dd84),LL(0x954731e0,0x67babf9e),L_(0xb890cb9b),
+ LL(0xeefdbd63,0xfbda2538),LL(0xd314af3a,0x77f9df03),LL(0x333f8c94,0x07bcc285),L_(0xd37bbc81), LL(0xadb373f3,0x7ba7309e),LL(0xe5686c59,0xb6c90f3a),LL(0x96218ea6,0xbfb2d48e),L_(0x7bc6fa2a),
+ LL(0x5c8452f6,0x91273fc0),LL(0x9f330845,0x12ba358a),LL(0x8d3155c9,0x229515d9),L_(0x4e0d0091), LL(0xaeed3a8c,0x3cca8a70),LL(0xc538ea5c,0x8528e080),LL(0x7f68ef37,0x412db800),L_(0xfc39477c),
+ LL(0xc1f84a4a,0x202d77cf),LL(0x3f50f1ae,0x94eeda74),LL(0xc9d43dee,0x2163dc89),L_(0x82838e71), LL(0xc916bedb,0x68b2f3b4),LL(0x028beb58,0x32389e93),LL(0x2f67136b,0x63c11941),L_(0xf0576d72),
+ LL(0x5b467cc7,0x79a7908a),LL(0xfe08b743,0x237e35d8),LL(0xe4c9aa02,0x3121fc40),L_(0xe6d6660d), LL(0x1c0060e4,0xcc2b942e),LL(0x54acd180,0xab155509),LL(0x4b3ac4d5,0xde75824c),L_(0x91ca23fa),
+ LL(0x4201e6e0,0x46582482),LL(0xa927f3c9,0x78c500df),LL(0xe88a4310,0x1f445777),L_(0x3e33ca59), LL(0x2a806dc7,0x71dd2626),LL(0x54a8126d,0xc14947d3),LL(0x9c986434,0xbec3ed13),L_(0x71db698f),
+ LL(0x422ef39a,0x731eb54c),LL(0xa93b1752,0x61227804),LL(0x6f7bfa09,0x873d3a45),L_(0x4f66d06f), LL(0x6fc87ed2,0xc97be3e6),LL(0xf6435b79,0x338ab476),LL(0x207b9b6d,0x1c6c74ae),L_(0xb64b6b70),
+ LL(0xfd951bda,0x74ccc359),LL(0x4be5a10b,0x44c6bf22),LL(0xb790b940,0xc32a94b3),L_(0x098b38b5), LL(0x57ac1bc0,0x4ef7c296),LL(0x18feb7b4,0x82d9c658),LL(0x6f3016a9,0xad72b80e),L_(0xbdf2db87),
+ LL(0xcffa9aa8,0x0ca1adfd),LL(0xb13f2859,0xed4f750d),LL(0xd393e869,0x277e9cd1),L_(0x90b15b52), LL(0x9386d23f,0xf705f504),LL(0x2c2d2fb1,0x98b6973f),LL(0xf49260e8,0xcb991398),L_(0xfed48a8d),
+ LL(0xb2b27562,0x2687c047),LL(0xc3ca0fc2,0xe54d1276),LL(0xbb9d5b5b,0xe241d7c5),L_(0xef9d2be9), LL(0xe9d4f361,0xfe8acc56),LL(0xc5011f32,0x5fc31f72),LL(0x8545eca9,0xfa8d83be),L_(0xc270dd4a),
+ LL(0xe5151a0f,0xb3951e08),LL(0x78a942de,0xdd13a9d6),LL(0x57fae761,0xbc46ee6e),L_(0x83169c42), LL(0x2d1c6395,0x340fc521),LL(0x669821ab,0x24a2322a),LL(0x09548072,0x92a505ce),L_(0x83ec59bb),
+ LL(0x0a4dfff3,0x3ce8adae),LL(0x41ed0956,0x7f33cce3),LL(0xc0e55577,0xba8eb552),L_(0xa018b90e), LL(0xa0f2bcda,0x67316cff),LL(0x5703fba5,0x58c433f9),LL(0x6078c1e4,0x99f221d3),L_(0x047eec80),
+ LL(0x41f43d8c,0x81739c7f),LL(0x6f11b810,0xae918a0f),LL(0x1e314860,0x9ddc21df),L_(0x18e4d189), LL(0x558db016,0xe78c5637),LL(0x439dc1dd,0x0de5812f),LL(0xa22acbf8,0x9f469794),L_(0x161460c0),
+ LL(0xb19e5bf0,0xcd4a85b0),LL(0x7e2cff5d,0xfd828b89),LL(0x998dca20,0x3d5bd0f7),L_(0xbfc65978), LL(0x176f7759,0x388987a0),LL(0x9b689b7c,0xed6c490d),LL(0x3ea487dd,0x5b3b94d0),L_(0xa77864e1),
+ LL(0xdff87175,0x39413fad),LL(0x796a4cff,0xf20c6ce8),LL(0x978f94f4,0x2c42836e),L_(0xdabb2333), LL(0x344fb7ef,0x683de92c),LL(0x5fe8df50,0xe072aff6),LL(0x705a1d2a,0xf68dcb2c),L_(0x16e49003),
+ LL(0x04c5b257,0xc7d4f66d),LL(0x02ce592d,0x679405b4),LL(0x449fe24f,0x49708f6f),L_(0xe167be96), LL(0x3f036191,0x7456adb8),LL(0xafdb07bc,0x63213856),LL(0xfc9ec5eb,0xb52ff28e),L_(0x55b069a6),
+ LL(0x0dfb54c3,0x1b0cec1a),LL(0xf4484ca3,0xa32d497c),LL(0xde798874,0x05b5ac5f),L_(0x87ada89d), LL(0x771e433f,0xbc022aca),LL(0x93b1313e,0x5af43a1b),LL(0xa4d9094a,0x71a6efc0),L_(0xd897f8e5),
+ LL(0x8e365581,0x5f811bb2),LL(0x9a725a78,0x04edaa41),LL(0x1f6cfcf4,0xe1abeb72),L_(0x6d3872f8), LL(0x6636d80e,0x90cec4c4),LL(0x400da758,0x751efdbb),LL(0x74d4d54d,0x6fed8555),L_(0x4bc5cda0),
+ LL(0xed247186,0xb4a54351),LL(0xa9b678d4,0x349f3364),LL(0xf079b22c,0xcd89ee25),L_(0xec3738e6), LL(0x9a75388b,0x1754341f),LL(0x3b3edf75,0xe93c6d27),LL(0x46732c66,0xcfead94a),L_(0xa689fe7e),
+ LL(0x46839b8d,0x91cb6be2),LL(0xa3af0a2d,0x68643eeb),LL(0x37e8c56e,0x44cf93c9),L_(0xc55af358), LL(0xb74e3e18,0x2941f1b6),LL(0x85525c49,0xe580c8b8),LL(0x7fe18358,0x32c35949),L_(0xbf4a513e),
+ LL(0xf3da6204,0x8adf6261),LL(0x6619bed5,0xe7cd8eab),LL(0x5bb1a013,0xdac22d18),L_(0xe70d7542), LL(0x64ef4466,0x0bfa91a1),LL(0x195a05ff,0xb9ce90fc),LL(0x52bb429e,0x34d0f00f),L_(0x904ed07d),
+ LL(0x335940e2,0x4331ebb8),LL(0xf071319d,0x6f7c1728),LL(0x05e7c4f2,0x1da3b676),L_(0x7abf809c), LL(0x1a1e3a9f,0x9290a717),LL(0xf68174d5,0xab7b1f25),LL(0xa93e4d8a,0x7f4cbc44),L_(0x93b784f5),
+ LL(0x5640e88e,0x7b8373a5),LL(0x1bf6e31b,0xcdec2eb7),LL(0xb8888fa2,0x010ee8af),L_(0xa7cd3971), LL(0x2d9ffc40,0x7e33265d),LL(0xc3866a61,0x26755d7a),LL(0x9e1bb3f0,0x9be25bb9),L_(0x1c158895),
+ LL(0xcbffc265,0x187246e4),LL(0xcb1700db,0xcb116afc),LL(0x3aa73e7a,0x93e55e2b),L_(0xb2ba60e5), LL(0xfa8aa297,0xbcfa0106),LL(0x253d2d5c,0x4919fb96),LL(0x9fa1e7c7,0x04ad0152),L_(0xd483d4ee),
+ LL(0xce14b1f7,0xd95b8ba8),LL(0x1d6eb61c,0x20d43399),LL(0xc7ef0d06,0x47b3133d),L_(0xf255931e), LL(0x5d5a0b15,0x60b98074),LL(0x2344f6b6,0x8b1f2bd2),LL(0x789f9baa,0x00302e85),L_(0xccdbabda),
+},
+/* digit=9 base_pwr=2^63 */
+{
+ LL(0xfb42e9d6,0x228b3a54),LL(0xd1e183b4,0x3efd699d),LL(0x4948ad88,0x18288fb9),L_(0xf45f24f0), LL(0x23d7207d,0x37574acd),LL(0xe86d0db8,0x57c32be7),LL(0x1ccef3f9,0x451b09b7),L_(0xee7d7495),
+ LL(0xa61d5325,0xd52a1c1e),LL(0xd08a8ae3,0xcb34540a),LL(0x750d587a,0x03e86cff),L_(0x27e73149), LL(0x156ef6cf,0x527a9877),LL(0x96f4a96b,0x6ee444f1),LL(0xe4a1f249,0x038153e5),L_(0xd9998bb3),
+ LL(0x2bb80640,0x281ef606),LL(0xee8331e0,0x73bbb0b4),LL(0x71264953,0xa04c6f5a),L_(0xecfe722b), LL(0x85f7bcc2,0xbb4ca37a),LL(0x8ff53f4b,0x6e5931f6),LL(0x42ab81a0,0xb862be64),L_(0x8ba40994),
+ LL(0xe1ee20f3,0x3c280032),LL(0xa9734b49,0xc6f2aff8),LL(0xb12f26d4,0x3686d2f0),L_(0xe0111b72), LL(0x8bf62e5c,0x7a48daba),LL(0x069099d5,0x63c661a3),LL(0xaba55aed,0x6cdc05f3),L_(0x4ea7440f),
+ LL(0x33a9ba23,0x4a15994f),LL(0xe99a66d4,0x022ffe96),LL(0x4d054e49,0x924ebb42),L_(0x155f0d8c), LL(0x4d774618,0xe319a1e3),LL(0xe6d591f2,0x8f71c6dc),LL(0xe9b13d22,0x0834867a),L_(0x39cb42c0),
+ LL(0x4edd01ad,0xb4a0a7e3),LL(0xd28d49c3,0xb472df44),LL(0xab2cbbd4,0x4cb47055),L_(0xcd15bd1f), LL(0x31800301,0x16ef99e3),LL(0xb349d462,0x78a8538e),LL(0x746c4b41,0x4dce044a),L_(0x56cf52da),
+ LL(0x7bf3d9bf,0xb1b9c2e9),LL(0x0196cebe,0xaaa33f41),LL(0xdb961af6,0x51023370),L_(0x68f286d7), LL(0x8d6b25f5,0xad763cf9),LL(0xa07bb401,0xe4c3391f),LL(0xab25bfde,0xac71bbe8),L_(0x06a272b6),
+ LL(0x33ad9d0f,0xd727b458),LL(0x6aab9dfc,0x340cf8e0),LL(0x695de110,0x078f906d),L_(0xa987a86e), LL(0x65ed9ae8,0xd50493d4),LL(0x3eb5588c,0xb2673304),LL(0xce9abc84,0x101a021e),L_(0x2ec773ad),
+ LL(0x492a4dda,0x7bdb0ab2),LL(0xb55a240a,0x08dd2523),LL(0x06998948,0xf475a7f2),L_(0x04f12f32), LL(0xd2a94b0e,0x688143bd),LL(0x73021050,0x5bdf7bb4),LL(0x325ed38e,0x8114699d),L_(0x467cd567),
+ LL(0x3e7baca8,0xcbfe120b),LL(0xe69958d1,0x56a88710),LL(0xa2e1385c,0x9586b08e),L_(0x8d8876e4), LL(0xa05f5596,0xe749a357),LL(0x85028619,0x62d3a285),LL(0xf41d9b86,0x8430e884),L_(0xe0fe7436),
+ LL(0x449eb800,0xe20a701b),LL(0xbc42935f,0x63dac155),LL(0xaf260958,0xb55c4fab),L_(0xb5f1b7b4), LL(0xbaf2a69d,0x3e2c715a),LL(0x61856276,0x158e35b0),LL(0x447c4419,0xfaf57b99),L_(0xa5a859f6),
+ LL(0xe7457d94,0xa50c7d9f),LL(0xaaf263e7,0x5bd93ac0),LL(0x27bdb99e,0x28bc6b58),L_(0xa291a83e), LL(0xfed995c1,0xe155fe7a),LL(0xa92f7c72,0x441255d1),LL(0xfdebd3d9,0x54ea2480),L_(0x1d9b3247),
+ LL(0x8cfadc9d,0x3bb14260),LL(0x40205f43,0xf6fea697),LL(0x1e5b99d9,0xf68ea4a3),L_(0x99449ff0), LL(0xc42cccaf,0xb4680c53),LL(0x6506393b,0x1cded754),LL(0x9fa16281,0x355805ad),L_(0xa8869c1e),
+ LL(0xa2b679a7,0x1fe90870),LL(0x60faf2a7,0x841d50a4),LL(0x74445704,0x97761552),L_(0xc6294a8b), LL(0x88aef1a6,0x8306971e),LL(0x79313f41,0x8a08da74),LL(0x459c33b3,0x5ff5c231),L_(0xa47413df),
+ LL(0x528acbac,0x8931a009),LL(0x1bb13907,0x64ec461c),LL(0x6e5d6bd9,0xf62b4e1f),L_(0x419ecc6e), LL(0xb5b1b6f0,0x2e05fe26),LL(0xa9d7ebb7,0x5484c570),LL(0x46afc58b,0x2c8381f8),L_(0x243d0786),
+ LL(0x67588c0e,0xa5a5886a),LL(0xd9832e54,0xf569db1f),LL(0xc764b06f,0x38ed1085),L_(0x7eb63b3e), LL(0x11a2a8db,0x585bdb20),LL(0x8a62c89d,0x3d5436af),LL(0x5e301e9d,0x35b91587),L_(0x4e488867),
+ LL(0x2e0bb083,0x9471249c),LL(0xcfed9152,0xd02dc9b6),LL(0xf83f6a42,0x859a1f08),L_(0x67c5e1b0), LL(0xfa3c9fbb,0x40557a70),LL(0xa37c1374,0x180e4d9f),LL(0xecd05a92,0x7635cd74),L_(0xccd0d7f7),
+ LL(0x0ad7acbd,0x02596d63),LL(0x81ed48b5,0xf3957977),LL(0x8ec54e25,0xfd23aeec),L_(0xa7513cf4), LL(0xfa5cf86c,0x8f6097dd),LL(0x2a1c180b,0xea60f2b6),LL(0xacdc4130,0x253dbb93),L_(0x9daa0c3e),
+ LL(0xece03d73,0x5f61e12d),LL(0x3336043a,0x1b5a6c4a),LL(0xa83c1fea,0x77fedd08),L_(0x64002d5d), LL(0x6ed15df8,0x08aaa0a9),LL(0x210df7fe,0x6ccfd556),LL(0x6b43ad21,0x98ade169),L_(0x42a1a05e),
+ LL(0x701d31e8,0x6e92d485),LL(0x8a6e2064,0x53a09da0),LL(0xc92637e7,0x4ee89ae2),L_(0xa8cbe2a0), LL(0xc8b9f5ad,0x688111d2),LL(0x1fafd02e,0x75a9c058),LL(0x315d9dc5,0x0cd0654b),L_(0x02890b79),
+ LL(0x24746253,0x131fab03),LL(0x1ac884b5,0xda0c0ec6),LL(0x8a1a27c7,0x66f76b97),L_(0x254a6db2), LL(0x8c4da1c1,0x17450bac),LL(0xd2c4396b,0x988596ca),LL(0x2691986c,0xd9864a47),L_(0x31c0544b),
+ LL(0x24fed0d9,0x2f0f74a0),LL(0xf3ddaad3,0x28c66344),LL(0xa0f85074,0x55736fde),L_(0x9f28ac0a), LL(0x0c8f2cd4,0x5b08d2ff),LL(0xaaec443d,0x96848bd3),LL(0x9fd17e0f,0xb4213134),L_(0xf10e3114),
+ LL(0x0077c0a8,0xd9301e91),LL(0xa6577039,0xdf36f0d6),LL(0x50e6f1b9,0xf5e86ab5),L_(0x58a7b434), LL(0xe0f8d5dc,0x2f0371f4),LL(0x1d3d9546,0xeabede08),LL(0x39c8d544,0x12bf2df1),L_(0x57a123a0),
+ LL(0x3878d553,0x817dc769),LL(0xfd0338c3,0x60a4d34c),LL(0xb99ba802,0x36e30856),L_(0x1dcffb49), LL(0x8ba72940,0x665a28b4),LL(0xf1016ea1,0x9d6822ea),LL(0x86a30740,0xc3331f1b),L_(0x0205d1d8),
+ LL(0x69c5e4bf,0x8628180f),LL(0xd7ae93c1,0x7ead547c),LL(0x227716ff,0x736914e5),L_(0x605a49ab), LL(0xec82f273,0xa3fd7cc4),LL(0x99cf069a,0x60d1dc75),LL(0x93c53857,0xdc5b96cb),L_(0x080bcc0e),
+ LL(0x5adf052d,0xf2335efb),LL(0x398d73b0,0x9cde465e),LL(0x00bb4ee5,0x212ffe0a),L_(0x7ab2ea4d), LL(0x9a9ad333,0xe2f332a2),LL(0xeeeaddc8,0xbb4703c4),LL(0x2962d309,0x143e5fcc),L_(0x49553c63),
+ LL(0x99cf8b3c,0xc941479d),LL(0x203c4316,0xe6b52643),LL(0x855dab4e,0x717ef700),L_(0x4ed7e83c), LL(0xe00ddd9b,0x494ccfde),LL(0xe90530ff,0x94ed4ea6),LL(0x8222ad9a,0x4430a4d7),L_(0x252e55b2),
+ LL(0x53d9c3c5,0x96506aa3),LL(0x3f484d6d,0x4d8a0741),LL(0x10e92da9,0xbd490fb2),L_(0xffd03214), LL(0x5fa8cebc,0x95792257),LL(0x7dfe3775,0xe4e706c8),LL(0x9120d23f,0xe2412ec1),L_(0x1de70984),
+ LL(0xa39f223e,0xcb479a89),LL(0xe7cc4f73,0x0ea9b422),LL(0x1382187c,0x9dc7e0af),L_(0x01c1bd80), LL(0x530c072d,0x7d0256e7),LL(0xbd971088,0xbcc29991),LL(0x7ac3d22e,0x36e29a92),L_(0xecf0d361),
+ LL(0x28113fdf,0xbb9273c9),LL(0x4c568852,0x6ab4dc1c),LL(0xf3f274f5,0xb258fcff),L_(0xdee7fe95), LL(0xf7dd8fb6,0xea16df71),LL(0x3f7227a1,0xf774dfb9),LL(0x8865b774,0xc554b491),L_(0x10280ec0),
+ LL(0x32e80670,0x0aaf5932),LL(0x600576a1,0x0829e9bc),LL(0x63228df7,0x7b64399d),L_(0xb12890cc), LL(0xce0e14e3,0xf166eabe),LL(0xa3e9c521,0xa17a6f3d),LL(0x01f649df,0x33266d1a),L_(0xb179110c),
+ LL(0x0d9efc66,0xaedb7e51),LL(0x2d780714,0x3d4cd6e3),LL(0x76c48d11,0x95533ca3),L_(0xef834a13), LL(0xfcf0269c,0xbb0ea84c),LL(0x8bf5f008,0x2e995288),LL(0x0c5e907a,0x5462d73b),L_(0x1d6aecec),
+ LL(0x80c6b892,0xb5bf76ef),LL(0x2e91623e,0xaf49e877),LL(0x1415663c,0x15fea421),L_(0x1f1c3707), LL(0x71645fb0,0x03dd8cca),LL(0xb068031e,0x639980b2),LL(0xd50a50f4,0xbde1692d),L_(0xc8df6655),
+ LL(0xb536b786,0xa49675be),LL(0x923698c8,0x410ff3c8),LL(0x9ea67a42,0x67f23bf8),L_(0x4444d11f), LL(0xbb783ec9,0x05829e19),LL(0x18b3a870,0x79d71996),LL(0x8b8364e8,0x917428eb),L_(0xafd1b685),
+ LL(0x391fe0d9,0x5cdc38f5),LL(0x8bdefd85,0x653fae2f),LL(0x60854dd0,0x5650f1c2),L_(0x3d41abd0), LL(0xb709cc99,0x338d5d07),LL(0xd45495b6,0x840a9918),LL(0x10d2d56f,0x05c210e8),L_(0x2709cd44),
+ LL(0xd04c44b0,0x3d513962),LL(0xb778f7da,0xedf97e8d),LL(0x237a1a75,0xb843c30f),L_(0xfe6c9001), LL(0x52dcbf0f,0xb7f1d85e),LL(0xdfc37735,0x3f355190),LL(0x63ca258b,0xbcb01029),L_(0xaad826a1),
+ LL(0x74f4c74e,0xf2d99edc),LL(0x3824eb60,0xcbcc9613),LL(0x96cabc5a,0xdb4188d8),L_(0xe5012748), LL(0xbf865e18,0x100a7041),LL(0x73b6c9c4,0x922a5abc),LL(0x4b2e4ffc,0x3c179919),L_(0x35fd801d),
+ LL(0x274742c8,0xfba7fe0c),LL(0x71487144,0x4d838b83),LL(0xa5684725,0xde29806b),L_(0xaf1f4b15), LL(0x3c9d276d,0x0418df98),LL(0x3da078d2,0x970cee18),LL(0x9504ef04,0xd6fca127),L_(0x68282ff5),
+ LL(0x2c2165ac,0xa4371233),LL(0xf24ea908,0x340a8ba9),LL(0xbf610642,0x751d8536),L_(0x169f256b), LL(0xa6be26ab,0xa7afba2b),LL(0x66d0d844,0x20c6f4fd),LL(0x292f0814,0xb9773f57),L_(0xc95c32ed),
+ LL(0x975db7a6,0x931f72a8),LL(0x2d2921a4,0x75be82f0),LL(0xaabec6ae,0x93be322a),L_(0xe0530ac5), LL(0x4d6dd8a4,0x21ed4c4a),LL(0x3539fb21,0x702437c5),LL(0x54c5601d,0xff29a4db),L_(0x33f41e0a),
+ LL(0x957fea7b,0x92370d49),LL(0x2b5f5d00,0x1feb014c),LL(0x9ce3670e,0xc246a235),L_(0xcfeee196), LL(0x58ffdb8b,0xc688f198),LL(0xc992ad9e,0xee953054),LL(0x3828369e,0xc2172706),L_(0x9016c246),
+ LL(0xf2b16a57,0xd8546f62),LL(0xf288a32a,0xf4996e54),LL(0xd866770d,0xa8e0a566),L_(0x41c5b1a5), LL(0xa81aa974,0xc8eca336),LL(0x06f5713c,0x7317dc66),LL(0xaf5394d4,0x1c420a16),L_(0x05bdbb33),
+ LL(0x3d683b90,0x8e6a5c3e),LL(0xf167321f,0xd4ab4b02),LL(0x4806da87,0x98fd2767),L_(0x23e3b0df), LL(0xf9faf1d6,0xde00e6e4),LL(0xa65aaac7,0xb82c1e61),LL(0x603b9246,0x39526356),L_(0x6098239e),
+ LL(0x1471049c,0xdf432ea3),LL(0x989bae16,0x08aae4b3),LL(0xcdff8338,0x1f3f8b31),L_(0xe12f868b), LL(0xa96b85c5,0xc59a6e02),LL(0x3e2e2a6e,0x679432f4),LL(0x35623aa8,0x66bc9d0b),L_(0x419d9c04),
+ LL(0xd12c1c29,0x3e403fad),LL(0x80a49b71,0xb3fa108c),LL(0xa16aaa21,0xc0552283),L_(0x941ac341), LL(0x5f01091e,0x78d10e07),LL(0x9e2010ad,0x78aaa1d0),LL(0xc3d626dc,0xad4eebe0),L_(0x616d3812),
+ LL(0x77d51621,0xa85af39f),LL(0xc44a4210,0x41d18ad2),LL(0xd700b9c9,0x00fd9c15),L_(0xaaeaf056), LL(0xcb08ab64,0xcc55572b),LL(0x58e16fee,0xdedd8934),LL(0x224b2130,0x27e82ee6),L_(0xe838331f),
+ LL(0xc76dfaad,0xf7314697),LL(0xc2d9578c,0x651c0514),LL(0x28f766e4,0xe5782e17),L_(0xdb1237a2), LL(0x6bb64cbb,0xdcb19e7b),LL(0x382be491,0x9ac56c1c),LL(0xf76d352a,0x0749b544),L_(0x7968d6a8),
+ LL(0x07203eb5,0xceb29d96),LL(0xe4a0f31c,0x3f66d60f),LL(0x62bd6086,0xc9e0da34),L_(0xd2a91a43), LL(0xeb1e3a08,0xf153aa4a),LL(0x13715918,0x07234640),LL(0x5c701eb4,0x3cc2d39d),L_(0x21bc78c7),
+ LL(0x481eb504,0xd3a03cad),LL(0x5f6a9d91,0x1d390d95),LL(0x3753e069,0x733ae857),L_(0x58532343), LL(0x4de25ac2,0xc858b2c5),LL(0x423a2e5e,0xd0e29a40),LL(0x03c6d3e7,0xbd4e4f93),L_(0xb99af7a6),
+ LL(0xf347240e,0x74665b47),LL(0x00f3a821,0xd4995fe7),LL(0xbb254497,0xae564546),L_(0x09235190), LL(0x8aa0bb23,0x148c2b64),LL(0x44c9ade6,0xd4712255),LL(0x01120f40,0x2095b0d0),L_(0xc2cfde05),
+ LL(0x7058189d,0x9096ca15),LL(0x0b95bea1,0xf2ebd4a0),LL(0x92a3cb12,0x403109c3),L_(0x67ede54a), LL(0xc8d15887,0xd330e122),LL(0xe94c1522,0xbc6cec87),LL(0xcf570b75,0x8c60e503),L_(0x7b779c33),
+ LL(0xc396d1d3,0xb7a09eba),LL(0xb7df5c36,0xa4ad2686),LL(0xda7c16c6,0xea76230d),L_(0xe12538a4), LL(0x5c153671,0x35168d66),LL(0x22a3c5aa,0x7317fdf8),LL(0x90a1a3b8,0x488f516d),L_(0x4a17692d),
+ LL(0x427a3fed,0x979163af),LL(0x5261367c,0x67750f39),LL(0x2b64c77f,0x121123d3),L_(0x57b5327b), LL(0x1ae75801,0x60be5340),LL(0x4320f770,0x1c82e2fe),LL(0x80d5de38,0xbfa35c85),L_(0x804730a8),
+ LL(0x7c65d352,0xfec3e94c),LL(0xe49a8416,0xe15daed0),LL(0xebea12bc,0xd561b8e1),L_(0x1b6939a7), LL(0x80b4e8f4,0x689cf9a4),LL(0x0a52d61b,0xe93a4cce),LL(0x2707af62,0x00163171),L_(0x888d6c2f),
+ LL(0xdaeed59d,0xcfab7c64),LL(0xd2cae7f9,0x5781a043),LL(0x10e60343,0x1e1d00e2),L_(0xb1b2d682), LL(0x8a649d20,0xbc56c4a9),LL(0x87923cc3,0xa8b43dfb),LL(0x05fa3aa6,0x07ea55ed),L_(0x08a82010),
+ LL(0x208d5b3c,0x5178b723),LL(0x10a520c7,0x2d1f55b2),LL(0xb1fffc0d,0xbbad0a50),L_(0xab6af890), LL(0xce6aec24,0xf8407690),LL(0x2bcfca02,0x1c5424aa),LL(0x56944f46,0xaab35dc1),L_(0xa5c174f8),
+ LL(0x957be638,0xd8227572),LL(0xfd6ac99b,0x7fcc54ba),LL(0x4081f3db,0x7e998f3d),L_(0x08e76dcc), LL(0x3ffd1f3b,0x1c7b8f2b),LL(0x0551cbe8,0x76e4b694),LL(0x045398f7,0x93712a63),L_(0x31b716ac),
+ LL(0x9ccd7f23,0xf2590188),LL(0x1074bc24,0x14031de7),LL(0x9d9df6f6,0x1a06a2f7),L_(0xf880ea5b), LL(0x9cc577d5,0xe509ec7a),LL(0xc7021265,0x864b62e6),LL(0xe9189561,0x09271f5a),L_(0x910bdd23),
+ LL(0x1f12f8d6,0x258fd822),LL(0x28518543,0xa7361b32),LL(0x338b1788,0xc4796256),L_(0x636fbcb3), LL(0x4f5097e8,0x0aff7ca0),LL(0x9306ff92,0x3deb3281),LL(0x6a18552c,0x5ba5cce7),L_(0x563c7d80),
+ LL(0xf184055c,0x0a2d6941),LL(0x682b34d2,0xba0b737d),LL(0x467f7fe4,0xa7e4e833),L_(0xfb7c4f69), LL(0xceeed886,0xd5513495),LL(0xc4ac863c,0xcc4688b1),LL(0x74229c34,0xd5e5f34b),L_(0x729a99ef),
+ LL(0x33e6967e,0xca92d3be),LL(0xacf9987e,0x27e6ecfd),LL(0x84c9d53f,0xa434a89c),L_(0x0ac3dbe1), LL(0x3f16aded,0x05a4b104),LL(0xbbe7f4a2,0x9d1faddd),LL(0x2222c720,0x0091add4),L_(0x5e600780),
+ LL(0x6e5923eb,0xe0a35b29),LL(0x5acac230,0x1ca3d3f2),LL(0x5089506f,0x57de9730),L_(0xf05a525b), LL(0xc963a675,0x8c76bd08),LL(0x74d9f43b,0xdeecdd8c),LL(0xdca2c05b,0x4bcbac2f),L_(0xdc6633b9),
+ LL(0x60601ff6,0x1bc30bde),LL(0xa7ddd558,0xcac4e4e0),LL(0xe21dd977,0x66baebc4),L_(0xb4d573cb), LL(0x79ee6d3c,0x352d2cee),LL(0x3c8cf82d,0xe3db9857),LL(0x12474a96,0x8d29a0c1),L_(0x55049164),
+ LL(0x3ff1fac3,0x8806d22d),LL(0x827b3141,0xe5b92d9d),LL(0xc0bcac45,0x45f1bee6),L_(0xe2c1046e), LL(0x368d7809,0x0b973abe),LL(0xc60d4681,0x6f45c847),LL(0x05dd04f4,0x1ae3e5bf),L_(0x64bbe857),
+},
+/* digit=10 base_pwr=2^70 */
+{
+ LL(0xad2244ee,0xa40697e3),LL(0x6dcf122e,0x379dd18c),LL(0x179d681f,0x177fcb32),L_(0x2e1c6f2e), LL(0xd9f2b14a,0xdfe5e464),LL(0x4c70a028,0xfcfc8017),LL(0x6183ea61,0x4d64db2b),L_(0xd053bce3),
+ LL(0xa9c848c0,0xe6f3cecd),LL(0x3c37feb1,0x1953cde4),LL(0x857f0263,0xbbc0b11e),L_(0x091b8ddb), LL(0x46acc3ea,0x8541cfa6),LL(0x772c3ab4,0x7c142776),LL(0x71e71be0,0xcd2d8bee),L_(0xd29d11b6),
+ LL(0xc6b24ae6,0x4b9ffc6a),LL(0x8ee5427c,0x4a42092a),LL(0x997ab138,0xff6b61a7),L_(0x3b574c18), LL(0xd6cb4977,0xbeade6c6),LL(0x315f47ce,0x2e2d5dc5),LL(0xc77bac27,0x39f2d0a5),L_(0x28b192db),
+ LL(0xa902a170,0xdfa7909e),LL(0x374a8799,0x93925c6a),LL(0x121579dd,0xb4c9c6a6),L_(0x2b2a2fe1), LL(0x421343f7,0x2dec18b9),LL(0x467e925a,0x4a7ce3d6),LL(0x51b39839,0x33d05082),L_(0x6dd45eec),
+ LL(0xaf22f4e9,0xe4793da0),LL(0xce68ae65,0x6d70ff7a),LL(0xdf1eb924,0x67519764),L_(0xa6d12a17), LL(0x9c9b86f4,0x1e13ad01),LL(0x43f0840b,0xebcc7b33),LL(0x648dece5,0x0b8a73e1),L_(0x9e1099c5),
+ LL(0x3ee5fb2f,0x00e5b507),LL(0x16e7b26d,0x02eb10ab),LL(0x2fb5b17d,0xf5f94483),L_(0x964b96f7), LL(0xb10c75ea,0xb577452b),LL(0x8083550f,0xcf241d80),LL(0x2f106bf6,0xe11783de),L_(0x0cfd54c0),
+ LL(0x598729b4,0xd3bf6d02),LL(0x6afe9c51,0xfb3e35f6),LL(0xbb0f1cd8,0xb0816531),L_(0x27df4a0c), LL(0x2f8214c2,0x72f5b39b),LL(0xc24bf200,0xdd44ad34),LL(0x39525315,0x2d46495a),L_(0x758c33c9),
+ LL(0x6fa7c2c7,0x9c7bf299),LL(0x2cb77bd8,0x4a4734a4),LL(0xb7245ac9,0x0a33b879),L_(0xe50ef27d), LL(0x3e4bd3ce,0xb91f6979),LL(0x1ca8036c,0xf8b8d90d),LL(0xbee50919,0xf053ecd4),L_(0xece7c952),
+ LL(0xe88a9300,0x990b1bdd),LL(0x0420911c,0x516f881a),LL(0x4138b100,0xafe94d6f),L_(0x24ff9ef4), LL(0x4c68e2d4,0x528a709b),LL(0xa50cb647,0x19ff7b20),LL(0xbb306765,0x907cbbc6),L_(0x74217b89),
+ LL(0x0a371fe5,0x0bab31b6),LL(0xcccd2b33,0x69aaf848),LL(0x5f8e6b05,0xb7efd33b),L_(0x4cd501f3), LL(0x117abd54,0x83d20ea2),LL(0xf475121c,0xa34d2ec5),LL(0x47427d11,0x6eb988c6),L_(0x7acc59a0),
+ LL(0x96650b0d,0x591ee335),LL(0x16ee1f0b,0x26a19153),LL(0x27985f50,0x7a51d8bb),L_(0xfe74d9ab), LL(0x276b185c,0xaa92cd9d),LL(0x9ed60020,0xb66c17eb),LL(0x2a0eac87,0x18315901),L_(0x8dbf60b9),
+ LL(0xe73f9dd1,0xaaf7ef5f),LL(0x3d3b7078,0x315302f9),LL(0xf09fd9b4,0x00b8f278),L_(0xf7dd85ca), LL(0x4140a60e,0x54e7df9d),LL(0xe305da30,0xaef051a2),LL(0x67dd41ab,0x88c0e226),L_(0xc437eba8),
+ LL(0xaecd7f62,0x938be7f6),LL(0x7f0d8c8a,0xe465c032),LL(0x74f9489c,0xba77e9c0),L_(0x529b3458), LL(0xbea77798,0xfea9f3ec),LL(0x93d7e4fe,0x6ec5677f),LL(0xce0cdb8b,0x1c3846b0),L_(0xe0a036d5),
+ LL(0xa818d0c9,0x3b25f1dc),LL(0x640f0895,0xf998244a),LL(0x6a36628c,0x0a1631ee),L_(0x22c92416), LL(0x79522c82,0xb5997002),LL(0xa3c8067e,0xbaf242be),LL(0xe28f2eda,0xca50379b),L_(0x0c2d44ef),
+ LL(0x7e8a5165,0x1879da9a),LL(0xf1be18cc,0x4b28b798),LL(0x5708ec80,0x088da37b),L_(0xa743ca6b), LL(0xa1588631,0xd86f2e95),LL(0x9bf8faf1,0x97dcfd6d),LL(0xae7389fc,0x784c1096),L_(0x1aa41e81),
+ LL(0xf9a13e9f,0x2380678e),LL(0xe93e1c94,0x3f5ce533),LL(0x68003338,0xa4954b13),L_(0xfa7015a9), LL(0x63905ece,0x3e892821),LL(0x19b8125b,0x4b7bb992),LL(0xd66a6ac0,0x8579e7ef),L_(0x7516c1ae),
+ LL(0x21560c47,0x8051f521),LL(0xfd3b4b27,0xa4371e4f),LL(0x8947385a,0x8c0cdac3),L_(0xd7eaeef0), LL(0xc46bf169,0x0639dd0c),LL(0x862785aa,0x9ec7e487),LL(0xd61bc685,0xd861b3a5),L_(0x83d3ee5e),
+ LL(0x930059f4,0xb145ba07),LL(0x2aaf9072,0x30f8ae06),LL(0x2f3077a1,0xbc426169),L_(0xc99c4c21), LL(0x6c57976c,0x6ee68683),LL(0x236b0866,0xb9cd4e70),LL(0xe6b22138,0xaa9f8c57),L_(0xc8cde662),
+ LL(0xed492587,0xcedbdd1a),LL(0x51eec28a,0xe84b42a7),LL(0xd4deae6d,0x9e368887),L_(0xaded26ea), LL(0x1bd18dec,0xf79fe229),LL(0xa610dbd9,0x0d650fde),LL(0xc8e53036,0x8d4db547),L_(0x6d7b9831),
+ LL(0xb55dd50b,0x6d88e9da),LL(0xaf929b4d,0xbb1af641),LL(0x09f3ff8a,0x2c88cea6),L_(0x95aa1478), LL(0xf6e2f2aa,0x4d819416),LL(0xe1f9b46c,0xce813081),LL(0x3fdecbde,0x368fe183),L_(0xce1f9cb4),
+ LL(0x55d27a4e,0xb55224a5),LL(0xc92c61ce,0xbd06485e),LL(0xe42fc5df,0xbae2229f),L_(0x3afc274c), LL(0xa273191e,0x85cd8bfc),LL(0x97118ed0,0x9c9c61a0),LL(0x5e361376,0xaaf47545),L_(0xcad4d556),
+ LL(0xfb2444ed,0x18d8ff5c),LL(0x18b51ba2,0x3dc74bfd),LL(0xaf0eee18,0xfc1b2868),L_(0xbb73ea5a), LL(0xd68ff57a,0x88d94a2f),LL(0x730a7041,0x162bcf15),LL(0xd183ab03,0x9867c6b2),L_(0xf198711f),
+ LL(0x817437d0,0xf225ca3a),LL(0xebadfce9,0x2afa4968),LL(0x7b328600,0x09069b77),L_(0x1091afcf), LL(0x82fb3189,0xdcc4bc5d),LL(0xf1844abf,0x49ace070),LL(0xf655f51c,0x7e393926),L_(0xa022dcd5),
+ LL(0x13b3c6d8,0x32d143d6),LL(0x07002476,0x37eefa5a),LL(0x028e4eac,0xf7ed9d04),L_(0x65e3cb55), LL(0x22c86f9d,0x1cab2511),LL(0xdf940bc6,0x50c1e3f3),LL(0x734bf045,0x2643f52d),L_(0x11593f75),
+ LL(0xeaec70bc,0x1759457b),LL(0xcee75815,0x1ef41bc8),LL(0xbfd1d973,0x5f64050d),L_(0x6b3087eb), LL(0xda22e615,0xc045345f),LL(0x776dfb51,0x3f9aff61),LL(0x07f4f3a2,0xb17003a3),L_(0xb6a6cf4d),
+ LL(0x9276438a,0x53f04642),LL(0x8525ef52,0x1397f8d6),LL(0x9a0888e4,0xde6f955e),L_(0xda028b89), LL(0x4292050e,0x2711d946),LL(0xd109e67e,0x70541c9f),LL(0x19b5f6f0,0x75754b8c),L_(0x85c8d6d5),
+ LL(0x3073bee0,0x0a0de3cd),LL(0x725322a6,0x3ecd54ab),LL(0xabf6f3c4,0xeb4d3502),L_(0x6dfedcca), LL(0x12c56dbf,0x08adcae7),LL(0x33d4bd69,0x0b5e164a),LL(0xcfe1b693,0x659e68b8),L_(0x82c86924),
+ LL(0xc347067e,0xd351d4d7),LL(0x141df0b6,0x5fe38868),LL(0xaaee8341,0x6a97a114),L_(0xaafe4f6c), LL(0xc0912e86,0x3ce36b09),LL(0x4106201e,0xd6174b63),LL(0x40106385,0xfda3c463),L_(0x9e471096),
+ LL(0x21aa62bd,0x15f6014c),LL(0xb5217d60,0xf4c26c02),LL(0x421c3d60,0xcc23ecec),L_(0xc0f18f53), LL(0x08c04fe6,0x1ae450ba),LL(0xf66ae880,0x7520566d),LL(0x2e31cf5b,0x1b3a8046),L_(0x916c70ac),
+ LL(0x47d17a16,0xd287d1ca),LL(0x3e47dc5d,0x291a00ca),LL(0x42cffa9b,0xc6ddb9b7),L_(0xb751c3c5), LL(0x6b576fb2,0x7f3bfdc3),LL(0x8676c057,0x05c5c887),LL(0x2f6a12cc,0x4e43cafd),L_(0x273385a8),
+ LL(0xae17a9c0,0x1d472cf8),LL(0xb53ac163,0x1569367f),LL(0xf1c57e24,0x5f7dfde3),L_(0x53f9522b), LL(0x45eaeed1,0xf3d29713),LL(0x3c47cbaf,0x7a261ef7),LL(0x561e0755,0xbe952c4a),L_(0x6bcd178c),
+ LL(0x63cc0fbd,0x24b41db6),LL(0x36a421ac,0x34bd0f29),LL(0xdc178877,0x619cb9a4),L_(0xa266089e), LL(0x7b84d003,0x9fd8767d),LL(0xba9a6d1f,0xa5381512),LL(0x8cbdf583,0x46c198f4),L_(0x23f49a00),
+ LL(0x65bc3562,0x281cc4e9),LL(0xc3d2804e,0x7562f859),LL(0x22a16679,0x638a7949),L_(0x7ec2aa7b), LL(0xe6c7330d,0x187243a5),LL(0xb99ca6d8,0xee353b2a),LL(0x2d4040d0,0xbd604fb9),L_(0x8cefbced),
+ LL(0x1fc30151,0xfbd9e1c4),LL(0xd10937a9,0x0f7ffd5e),LL(0x2fa67094,0xe7b103db),L_(0xb57b1840), LL(0x39530ea9,0x1368261d),LL(0x719e1d06,0xc1336cad),LL(0x192c11f5,0xa6cd197f),L_(0x9b41db84),
+ LL(0x37505def,0xd68a5a49),LL(0xddd06586,0xb0511d2a),LL(0x52664a68,0x2621ebc3),L_(0x6f5736f5), LL(0x2fcaf173,0xd267f258),LL(0xbacb7a85,0xe5e678b7),LL(0x5c0b0c67,0xaa7c18e3),L_(0x166ad375),
+ LL(0x669558fe,0x9a21bdfe),LL(0x8411fa8b,0x06c5b604),LL(0xde70b24d,0xf5bd9bc8),L_(0xd7443ed1), LL(0x0a439533,0x2b84584e),LL(0x3ea3f8f2,0x2cf8fe06),LL(0x099fde13,0xbc0565bd),L_(0x8fd32c81),
+ LL(0xc291b778,0x7e78ce16),LL(0x12d214f6,0x6d2b8e47),LL(0x5f204c64,0xaf966aac),L_(0x62d03da4), LL(0xe9be215a,0x0fc086e5),LL(0x14494699,0x77fd96e7),LL(0xcc71f940,0xec60a687),L_(0x65805046),
+ LL(0x4b6c94b4,0x1ee6996b),LL(0x8eb81a1a,0x5a56077f),LL(0x547ea701,0x71308d2f),L_(0x9126c06e), LL(0x9fdcaccb,0x5fecdc40),LL(0x49cacc43,0xd04d1212),LL(0x89bc7a7f,0x6331b109),L_(0x93db1b8f),
+ LL(0x2b6470fb,0x18292505),LL(0x93a8f9cc,0xe0d6f3f0),LL(0x8d658c23,0x33eef875),L_(0xc22c9665), LL(0xb09b3b96,0x2081f85d),LL(0xbea17435,0x11959ada),LL(0x6f44daf5,0x5ff2900d),L_(0xdea368bd),
+ LL(0x224521dd,0xfcb125d5),LL(0x097e443e,0x7d3c0cbb),LL(0x96ff5378,0x0cce254b),L_(0x562b2166), LL(0xc45e09f3,0x73e36236),LL(0x992060e2,0xf844b9b5),LL(0xa968d30e,0x139e42f9),L_(0xe5b89488),
+ LL(0xb57b80af,0x3e86ab5b),LL(0xb177e3f9,0x8e7a956e),LL(0x95050abc,0x580bb577),L_(0x75270515), LL(0xa96f2da7,0x0ce33d22),LL(0xcab8647e,0xf5e4958e),LL(0x139f525e,0x9b1f28f4),L_(0xa2e38250),
+ LL(0xf097a8be,0x193d7b50),LL(0xbe57f373,0x326744fe),LL(0x192cee98,0x66699aba),L_(0x69e0895a), LL(0x51e1d17f,0xe787c995),LL(0xb3f66818,0x7acab4f1),LL(0x5ee5c7cd,0xe1645254),L_(0xb7d10719),
+ LL(0x29d8986c,0x17022e01),LL(0x2f237075,0x0ccc4d78),LL(0x01453fbb,0xba3615f3),L_(0xa703f343), LL(0xf538646c,0xb5aab8cf),LL(0x30b0a7e8,0x4a42c722),LL(0x33588983,0x8a8547cc),L_(0x64a4028c),
+ LL(0x82ecbbdc,0xbbdec907),LL(0x6c0cb953,0x1807ae9c),LL(0xf8e40104,0xca5b89e3),L_(0x5e56c8f6), LL(0x41f32d88,0x040b1ce4),LL(0x76bd7772,0xbd9bda0d),LL(0x396f023e,0x6bb455f6),L_(0x4243e710),
+ LL(0x82b34b90,0xff00cfce),LL(0x7a3a34e7,0xfea1370a),LL(0x59745afe,0x13dec9bb),L_(0x00460ef4), LL(0xc0ccb5ce,0x664b5767),LL(0x467ad23b,0xe91ea77c),LL(0xd6ac872c,0xc30f32ed),L_(0x7527a687),
+ LL(0x4a73f787,0xf2877171),LL(0xa577b4e7,0x05b283db),LL(0x7ac6ab0b,0xbbb22aab),L_(0xce8c4374), LL(0x2cf4237f,0x5d2444bb),LL(0x1362bb86,0x354270cf),LL(0xa58498c9,0x03a3218e),L_(0x4585f77c),
+ LL(0x17d3d4da,0xe1c0eb99),LL(0xf69271e6,0xde536a3e),LL(0x239476a2,0x3701952a),L_(0xb94d2063), LL(0x25bb5fc2,0x39ed615a),LL(0x44f390c3,0x6a9dd585),LL(0xa4418ea6,0x1ce9df6c),L_(0x76cd5c55),
+ LL(0xa10e49d6,0xf5dcc900),LL(0x62fd7874,0x2e74ef98),LL(0x74f61b6c,0x9d3a5873),L_(0x10ca6b61), LL(0x470595b7,0x848244dc),LL(0x81922f08,0xf7db6c87),LL(0xbc236621,0xb2a50ed6),L_(0x0cbc779a),
+ LL(0x274cea83,0x4914c419),LL(0xb8a19540,0x1bc1a1ba),LL(0x957adbf1,0xd2aac8dc),L_(0x64d6ca82), LL(0x96ac9d7f,0xdb015eca),LL(0x42372196,0x03b15d50),LL(0x05451b09,0xe16c7207),L_(0x463bc66d),
+ LL(0x01c4dfe9,0xfc7e965f),LL(0xb8358066,0x8fc594e9),LL(0xa1915c8c,0x8d26603b),L_(0xfdddd6dc), LL(0xc4b1e185,0x2166a1d2),LL(0x79912871,0xad0b86ad),LL(0xe96aa265,0x98a560dc),L_(0x43b8858b),
+ LL(0xa1e7a822,0x2d3f3785),LL(0x95813382,0xcc85095a),LL(0x89e2322f,0x3568d961),L_(0xfbe11c03), LL(0xe15474b7,0xb0011b61),LL(0xb6d17af8,0x94e2b66a),LL(0xfa35ee62,0x88f30207),L_(0x496e0cfb),
+ LL(0x00a8605a,0x233a4ea2),LL(0xed225296,0xfb49bd9b),LL(0x18a0b19f,0x49f70f9b),L_(0xfd4a3974), LL(0x3d19e5f7,0x6935d1e0),LL(0x4ca49b02,0x167ee2db),LL(0x465d1799,0x83dab70c),L_(0x3925587b),
+ LL(0x06b4ef1a,0xadc74707),LL(0x97b00e28,0x7b776a0d),LL(0x4ea78215,0x29de362e),L_(0xe0075db8), LL(0xd1a8437d,0xcd9ea162),LL(0x4071fbdd,0xd6f65966),LL(0x5861958d,0xb0f23643),L_(0xfb6d160c),
+ LL(0xe1dbc405,0x1cf01490),LL(0xfd9abd17,0x781604fe),LL(0xfdabdb45,0xfe106ce3),L_(0x28aec19b), LL(0x0765d40f,0x5dea7b0e),LL(0x9dd7eace,0x05e88870),LL(0x7aa326d2,0x58144fba),L_(0x0c0b55eb),
+ LL(0x4b6bbeb3,0xf492b1fe),LL(0x80211303,0x00d1a0a3),LL(0xa0a42f81,0x812c4f34),L_(0x0513dab5), LL(0x701129ed,0x2b196b3d),LL(0x8292825d,0x14497eea),LL(0xfccdef2f,0x8309d41f),L_(0xa6c098eb),
+ LL(0x4e01759a,0xe5e506e5),LL(0x34984e59,0x5bdb0568),LL(0xc78ed701,0x023cf8a4),L_(0x8818f370), LL(0xadc05868,0xedb22c00),LL(0x61bbfcfe,0x1eb0f72a),LL(0x4b1c28bf,0x87de5c20),L_(0x13f66db8),
+ LL(0x2c5c67ae,0x311b814c),LL(0x18478ee8,0x98f391ee),LL(0x5fc08d55,0x3d6c85b2),L_(0x2a4234ef), LL(0xc63b3540,0xef0ad114),LL(0xfa0e9b48,0x19926812),LL(0xded54ff1,0x8d2d8068),L_(0xe6033e94),
+ LL(0xfcdb3c46,0x567ac24a),LL(0x31e079f2,0x5c7d3b6c),LL(0x876a06e1,0xd77d6297),L_(0xabca81b2), LL(0xcd9c326f,0x27382ebd),LL(0xbd7f7ff0,0x8c9f6089),LL(0xb11d9de0,0x31e36d28),L_(0xba48fe41),
+ LL(0x8c0ffdf0,0x845700c1),LL(0x659750c3,0x9a4535d8),LL(0xbfa2263b,0x46779254),L_(0x426c9332), LL(0xea64e4f2,0xc0627926),LL(0x919159e1,0xd72486ed),LL(0xb8633c7d,0x62049111),L_(0x57a02e38),
+ LL(0x6d5a56c1,0xc0ef9c32),LL(0x87339367,0x1398d5b9),LL(0xd690f5fe,0x4cb8372b),L_(0x74004a4c), LL(0xa8b7608c,0x62fc7f7e),LL(0xc75eca95,0x7fcc6560),LL(0x87991514,0x1a3939cc),L_(0x9eeab34e),
+ LL(0xee335372,0x6dda426f),LL(0xe95ee7c3,0x7a84b92e),LL(0x5637d166,0x0cc0434e),L_(0x108326a5), LL(0x4c69a1c3,0x66908f8e),LL(0x768a4dc5,0x93e7c968),LL(0x24086621,0x0390f0a6),L_(0x34cd95fd),
+ LL(0xffd9518c,0xa579c74a),LL(0xf4d1cd8b,0x245e5d80),LL(0xa682fc6c,0xcf5b3a95),L_(0x13389ce6), LL(0x8944bc8c,0xc24a47b4),LL(0xf37dbb35,0x67296189),LL(0x9d47aaf7,0x196773ed),L_(0xab42affb),
+ LL(0x6c1fae2e,0x78457340),LL(0x0583dc84,0xea2de616),LL(0x6a0c10e4,0xbf46a7bb),L_(0xe6adebac), LL(0xb7cad754,0x3e924b67),LL(0xbf5e7329,0x93303eef),LL(0x9cb33af1,0x5460942b),L_(0x1005e77d),
+ LL(0x5dd3bfdc,0xa399de31),LL(0x867305ce,0xbc0f8f54),LL(0x2200477c,0xd31a5a81),L_(0x9ac2ed5d), LL(0x59ceee51,0xa5a011eb),LL(0x9cb94041,0x53fce407),LL(0xf7a7e8fe,0x26131e4c),L_(0xbcae3bd4),
+},
+/* digit=11 base_pwr=2^77 */
+{
+ LL(0xe3b818f5,0xe00bddec),LL(0x44e43c61,0x4681ea2b),LL(0xc584d310,0xb6fe7f05),L_(0x951b39e7), LL(0x81eb4c72,0x1eae5fc5),LL(0x518f5441,0xdae90140),LL(0xc505aeda,0x216fb5f2),L_(0xbb781e43),
+ LL(0x3cf8ec7d,0xf9a62c2a),LL(0xe0d93869,0x23fabd24),LL(0x6d3f0de8,0xb3106bbb),L_(0xb0f77641), LL(0x6c7c7f7d,0x9b298ebb),LL(0x184aed09,0x9f30709a),LL(0x334394d4,0x79c1d22f),L_(0xd95473d2),
+ LL(0xae76cd6a,0xcb7cb589),LL(0xf3fc070e,0x3ecf8591),LL(0x60dba7d6,0xe19d60f2),L_(0xe420c869), LL(0x59b7cb97,0x097e4daa),LL(0x707e030c,0x7f52c8de),LL(0x0dcda4fd,0x9803c9fe),L_(0x2bbc44ce),
+ LL(0x2ff400c0,0xfabcb249),LL(0x10355326,0xacc122ab),LL(0x91ed19cf,0x4f316ca1),L_(0xd20efc4e), LL(0x940a18e1,0x1a2e490c),LL(0x2b83ac01,0x029cb6e5),LL(0x0fd81ad0,0x8da694f8),L_(0xfcad677f),
+ LL(0xb1b32829,0x248ec9b3),LL(0x11ef88d2,0x35de7b93),LL(0xda678713,0x370ca0ea),L_(0x7a293625), LL(0x1a056e86,0xddfa0a4d),LL(0x1f856294,0xfe05d52e),LL(0x6bd2e637,0xf728ccb4),L_(0x91baf444),
+ LL(0x74014196,0x9e4adc25),LL(0x8981411a,0xf964b6c4),LL(0x7eb4dd2d,0x58e82e86),L_(0x97c312ce), LL(0x153d2149,0xd7b84e08),LL(0xc95c8ff2,0x4e547787),LL(0xd7ac3655,0x7546fc40),L_(0x504a9f59),
+ LL(0x3f1e5f11,0x9edb0425),LL(0x476b8958,0x63c34818),LL(0xf14565b6,0x4bab1b96),L_(0x3d3ca262), LL(0x18ef180c,0xfd4e9a47),LL(0x0043c8ff,0xa1174dbb),LL(0xafaf8911,0x0b1e0a8d),L_(0xcbeb2d8e),
+ LL(0x486cbfa7,0xebbefd50),LL(0x44fc634e,0xe20aab71),LL(0x9ddeace8,0x08a9107e),L_(0x909eff4c), LL(0x746a522f,0xf816fa9e),LL(0xefd70514,0x864324da),LL(0x598db9df,0x0094b64c),L_(0xc6634c12),
+ LL(0xe65d8204,0xd6fb5d4b),LL(0xadb1a9c2,0xec38f10c),LL(0xc8ec0f39,0x1908657d),L_(0xa25710b3), LL(0x87e1d90e,0x311947c3),LL(0xe187cb1c,0x04d9654b),LL(0x1bae3f87,0xafb6e7b5),L_(0x44ea2977),
+ LL(0xe4a3b821,0xee18a382),LL(0x60b120f0,0x4002bc41),LL(0x91636563,0x29fd66f4),L_(0x6538f012), LL(0x300af347,0xda52b57a),LL(0x9a0bd35b,0xa08ae1b7),LL(0xcee45c95,0xafb1fcae),L_(0x042232d0),
+ LL(0xe06efe03,0x54397157),LL(0xd06ed8f6,0xf4ce3dfb),LL(0x67644c3e,0xaa8e6af8),L_(0xa26425e0), LL(0xbbd40e3b,0x6fb8009d),LL(0xdfa5a71f,0xbf5753ee),LL(0xc4fb8d84,0x413c2883),L_(0xa71e26d8),
+ LL(0xe358be61,0xae3de433),LL(0x45610301,0x9f32cd87),LL(0x4ec1365e,0xb95b637d),L_(0x41dbce62), LL(0x0840486b,0x9637a66e),LL(0xc6d80952,0x522810a8),LL(0x928915a0,0x761cc88a),L_(0x1da0d501),
+ LL(0x208620d1,0x37a59562),LL(0xb4ca54d1,0xc246b32e),LL(0x5128864c,0x8aad87e4),L_(0x559dacdc), LL(0x9d93608a,0x89718ac7),LL(0xea353321,0x48d40286),LL(0x2012406b,0xc599f213),L_(0x1eb2fe94),
+ LL(0x6807d450,0xba62fad2),LL(0xa7fededf,0x07ea62b0),LL(0xd58195f9,0xd3d6b5bf),L_(0x1ad1505f), LL(0x87583b1c,0x6f93c77a),LL(0xaf96dc4e,0xa959c022),LL(0x20624dad,0x4fa52512),L_(0x3481aabe),
+ LL(0x9310eef9,0xba1c1390),LL(0x9fb8e966,0xcce0400b),LL(0xb9c0dea0,0xd59d1993),L_(0xe8a99c53), LL(0x243bcc60,0xb44f7477),LL(0x97335f28,0x1bd266f4),LL(0x6f550c82,0x3749bb24),L_(0x67501a21),
+ LL(0x35f741c9,0x2ddbdad6),LL(0x5e95c8ee,0xbeac98ef),LL(0x74fa6bf8,0xf68aac5d),L_(0xe404df62), LL(0x13d824a6,0xf3252763),LL(0x934f4963,0x4c5b99db),LL(0x65ea023c,0x39f3ad81),L_(0xf2ab45c6),
+ LL(0x513ad1f3,0x6c9e60dd),LL(0xd82ebdb2,0xeb595e39),LL(0xf4278e99,0xf76b6d5d),L_(0x177bfa74), LL(0xda5b699a,0x0698c8f7),LL(0x8af11d92,0x022b9e4d),LL(0xdcfeb87d,0xdf966b87),L_(0x790b8b3b),
+ LL(0xe6576cdc,0x0d632c2d),LL(0x82b42706,0xe4079724),LL(0xeb7e23be,0x67d13334),L_(0x6bef8f5e), LL(0xab6f7a84,0x5b9d7907),LL(0xb943b3e3,0x3b2e4de9),LL(0xe1142403,0xe61e180e),L_(0x3186f5ab),
+ LL(0x54c38bc7,0xee73f3c8),LL(0x1c021526,0xcdd71fb7),LL(0xd5f0330f,0xbcd8ae19),L_(0x34f15f5c), LL(0x3f1e795b,0x0f2d33f8),LL(0xf2452d93,0xe4d47a55),LL(0x0c4b0f70,0x322c677d),L_(0x311431b5),
+ LL(0xe32f7152,0xd222f30a),LL(0x32c8e92e,0xd5265ce0),LL(0xf9051d2c,0x34079f7e),L_(0xca51b73e), LL(0x752d0df7,0xe4529fd5),LL(0x3ee05e30,0xd39fd02a),LL(0x762211ba,0x957b54a8),L_(0x7bd842d1),
+ LL(0xca5c5b9b,0x8578a05a),LL(0xf931c6ff,0x5854ceb6),LL(0x9c1a24ae,0xc7ad186b),L_(0x3aae7e80), LL(0x405ad033,0xcd94ffe8),LL(0x02d60546,0xc24532db),LL(0x6d8dfc51,0xf70532cd),L_(0xa7523214),
+ LL(0xf6e5bcb6,0x3898ac49),LL(0x7ef15aa2,0x0dc0b7cb),LL(0xc92d3e61,0x6f146470),L_(0x20a65e93), LL(0xa99d1e34,0x40c2ff2e),LL(0x5f5f4b1f,0x8bce3569),LL(0xef24d37f,0xf5eb8c60),L_(0xd0f3625a),
+ LL(0x770ff147,0x04af9657),LL(0x0ddb7f8a,0x5d6a9432),LL(0xf5679a0e,0xfa164f3a),L_(0x75f9e25f), LL(0xb341ef73,0xd2b96f53),LL(0xc75b8bfb,0x111da06d),LL(0x141dae1e,0xf86c989c),L_(0x1a015ae9),
+ LL(0xd89c49d6,0x7440165b),LL(0x252d3538,0xbc50c381),LL(0xc7935e6e,0xfc485299),L_(0xafc2b1d4), LL(0x7b5b7847,0x8b5606a8),LL(0x8714fa4e,0xc8ca9e3a),LL(0xd015855f,0x03679b60),L_(0x14d9de29),
+ LL(0x5d13fc8a,0x7fd6372a),LL(0x1fc76dfc,0xd3c20f3f),LL(0x835ac98b,0xec54c6b2),L_(0x98cbc171), LL(0xe5e2a3e4,0x7ab5c98a),LL(0x577a8e9f,0x6c990ebd),LL(0x84028fa5,0xed0d2362),L_(0xb28e8d67),
+ LL(0x277610eb,0xd8c85ac2),LL(0x8e20b175,0xc11f2394),LL(0xbc82df9f,0x763f7da0),L_(0xc32cc81d), LL(0x85f8381c,0xb02c89cd),LL(0xd305dbab,0x2a33f683),LL(0x7f0a99f0,0xd40823f0),L_(0xf958bb39),
+ LL(0x08d09d3c,0xee84ea33),LL(0xc5f043e5,0xe195e3e9),LL(0x13f7ae30,0x18438628),L_(0xb6ffaed5), LL(0x4012f22a,0x9cb2856d),LL(0x9a5c926d,0x6dd2b787),LL(0xad05632b,0x4d11a1b7),L_(0xf0f2c69d),
+ LL(0x8e9a6388,0x60b10c54),LL(0x79943f17,0x0474b959),LL(0x15056515,0x70dc2681),L_(0xc9a17b25), LL(0xb6a005e4,0x4d9c29fe),LL(0x5978aada,0x9f751987),LL(0x6e84fa9d,0xb01cfa96),L_(0xd9553cbf),
+ LL(0xe72b7959,0x14645ddf),LL(0x50569b84,0x6a35f872),LL(0x76814e1a,0x6931ce3c),L_(0xd1694dea), LL(0x9877446f,0x8fb4ec92),LL(0xcbd84ece,0xd0d64612),LL(0x70c2d8a8,0x6f1a63f5),L_(0x2ca687fd),
+ LL(0x73d59d85,0x66719258),LL(0x78b1b1f1,0x3528fe8e),LL(0x372aba7b,0xf72aecd5),L_(0x049424c7), LL(0x0a8225e9,0x1299651f),LL(0x7a3d9b21,0xcdfa1798),LL(0xeea3b43d,0x6296bed4),L_(0x965623a1),
+ LL(0xe79e4875,0x19faf24e),LL(0xee2a75e2,0xfce9de0f),LL(0x2608d8d7,0x5dbd9aa4),L_(0x8dd2d8bb), LL(0xa1d5ac1f,0x96024e09),LL(0x59608369,0x88c11a15),LL(0x3109b985,0x4c72f34b),L_(0x073affe7),
+ LL(0xa7d5999d,0x7163417c),LL(0xe75a8d8d,0x58690b9f),LL(0x34a71e84,0xf46ea0c1),L_(0xa472172f), LL(0xdb5e6f96,0x5941f31e),LL(0x45ef8849,0xff03761f),LL(0x813628f8,0xff6e6be2),L_(0x2f6a6923),
+ LL(0x37f746c4,0xf2dab7c0),LL(0xee4fac0c,0x94b2339d),LL(0x442b5427,0xd1572489),L_(0x1b63f7f9), LL(0x77b93d36,0x86beafa0),LL(0x931a009d,0x89006e01),LL(0xc54e5dcf,0xce454abb),L_(0xe3d31b67),
+ LL(0x5dbfaab4,0x2bfb9672),LL(0x00a46605,0x0f7940ce),LL(0xd0e900f4,0xac391030),L_(0x56b396f4), LL(0xd65db7d6,0x111e6518),LL(0x0e375257,0x574c6063),LL(0x0569eb0d,0x6386031f),L_(0xa43939dc),
+ LL(0xe79fa54d,0x790064ff),LL(0x19bae3a4,0x040699eb),LL(0x278b676c,0x2bfc1210),L_(0x5fd221ef), LL(0xc41696b3,0xaddaabbc),LL(0x3e58e744,0x4ef37496),LL(0x86211a5e,0x27a20439),L_(0x06b96609),
+ LL(0xa9a97859,0x31e7bef8),LL(0x6b521dbf,0x39d7de6d),LL(0xbb74a0f3,0x41f4bd94),L_(0x79699c57), LL(0xfd6b25ba,0x6af2b090),LL(0xb9a903de,0x17aa75d4),LL(0x250d78d4,0x565e3c29),L_(0x674edb33),
+ LL(0x580583bb,0xfa502a79),LL(0x4f9ab886,0x9fc3a870),LL(0xb5e6f604,0xcd18776f),L_(0xf25cc6e4), LL(0xea80a2a0,0x9822aa1a),LL(0x2c1f0788,0x3a8b80d3),LL(0xb4be8a38,0x671f0157),L_(0x5b11123b),
+ LL(0x9b6b4d48,0x54914216),LL(0x1256ef4e,0xb5f866f9),LL(0x075b53ab,0x5ecb1889),L_(0x56e20726), LL(0x69455333,0x09f26254),LL(0xd571b91b,0x2b2fad5a),LL(0x328d62f6,0xde6fb9c6),L_(0xe065c610),
+ LL(0xfd0dd09b,0x45144de7),LL(0xdc428059,0x74b10792),LL(0x9aff2cca,0x9af32379),L_(0x7429380e), LL(0x49635e31,0xe3565603),LL(0xdea72af4,0xe2386988),LL(0x2bf6a43f,0x5a2add5c),L_(0x6b6ae6f7),
+ LL(0x13448c75,0x9ab52f76),LL(0x061d7ef8,0x4392015e),LL(0x010840be,0xae0d756d),L_(0x97508e7b), LL(0xd15d5084,0xadc78971),LL(0x4d5b80a4,0x7c713bfc),LL(0xf9aaef5c,0x256809bb),L_(0xa1ec2e50),
+ LL(0xfbb42651,0x74a6dd49),LL(0x0393f719,0x977434ad),LL(0x4e57160b,0xac7e00ee),L_(0xe124fa0e), LL(0x7a6f9567,0x2389bd87),LL(0x80b4129f,0xfb1db8c0),LL(0x0e8aaba3,0x1051debe),L_(0x4a190f97),
+ LL(0x477f6b19,0x2156959b),LL(0x37e2ab37,0x910a6757),LL(0xfe9b7158,0x540652e0),L_(0xd3215a27), LL(0x7976f02e,0xc0c597ef),LL(0xceb6dd56,0xe44ded06),LL(0x09436cb3,0x07e11a08),L_(0xc752116d),
+ LL(0xf6b2fb7d,0xe154e3b5),LL(0x3dd689de,0xc3b95a13),LL(0xecec9673,0xf4ebc67c),L_(0xdf67ffb0), LL(0x01c1c880,0x33ce85c6),LL(0x58ffaf1b,0x033751df),LL(0x741f05bf,0x2535c38a),L_(0xffe3294f),
+ LL(0x308eb02c,0x4c921d98),LL(0x1c787299,0x5bd1a752),LL(0xbf10f0e6,0x4f5e9e39),L_(0xdd4daa07), LL(0x18aefaaa,0x92fcbe07),LL(0xf29c8618,0x200b4b85),LL(0x84305705,0x8d7c9a43),L_(0x19694aa8),
+ LL(0x3a51e7ce,0x680c4324),LL(0xb1ac0982,0x0b339790),LL(0xa4032aca,0xdf576261),L_(0x92007d10), LL(0x50fc383f,0x755cfb3b),LL(0xb9ea853a,0x702d89aa),LL(0x28725f39,0xa32de41e),L_(0x8310cc56),
+ LL(0xe3293ae8,0x4319f044),LL(0x6a31f14c,0xd8080331),LL(0xf0a68d54,0xa79121b3),L_(0xf8ad5c75), LL(0x3c85f6ea,0x1aca6f0d),LL(0xd728ef75,0xb8a8d44f),LL(0x66ed37bf,0x244f6df5),L_(0x5253f731),
+ LL(0x40e52539,0x7e5a8bd2),LL(0x9d03a5af,0x2a775548),LL(0xa4eb71ab,0xa305f15d),L_(0x1dc7fb76), LL(0x68a7c637,0x20487a25),LL(0x6deaadda,0x8c18ae20),LL(0xe0f4999d,0x9bb84678),L_(0xc451bb12),
+ LL(0x27b6061c,0xc977cb30),LL(0xd39b851a,0x430b3684),LL(0xcd656ca9,0xa19898ab),L_(0xafd81332), LL(0xfa31c77d,0x2bb5e6b0),LL(0xc3157a16,0x60d12981),LL(0x8acd8d9d,0x69cbb158),L_(0x6d76f690),
+ LL(0xe9d8d3f2,0xc8ff4785),LL(0x2bca8c99,0x2e87c4ea),LL(0xa2caaf78,0xf6be10a7),L_(0x2100372c), LL(0x8cdcc69a,0x761e39c6),LL(0xdb53800d,0xd8745be4),LL(0xc599f6e5,0xc995d474),L_(0xcb2cc9b4),
+ LL(0x35b78d83,0x39687ef6),LL(0xe8d0ac03,0x91a4e746),LL(0x921b3cbc,0xc64c35ba),L_(0xa500e776), LL(0x4f3feb91,0xe79c45af),LL(0x60ad3863,0xdbd9485d),LL(0x0ce33aaf,0xaee36834),L_(0x4ce8962e),
+ LL(0x8023ad1d,0xb38c8506),LL(0xc359f6e1,0x0673f87d),LL(0x31837b1d,0x98af1b3a),L_(0xf716fe6e), LL(0x3024d432,0x3830cd5b),LL(0x52930fa5,0x60d8b1ad),LL(0x0ad62261,0x097dfa97),L_(0xebeb447d),
+ LL(0xf447ab0f,0xe409d4ec),LL(0xe80a1b86,0x58d6899f),LL(0x1aaed1d3,0x9eac7e33),L_(0x80bb831f), LL(0x2a9866ba,0x986f7e0b),LL(0x005a4dc6,0x43a73638),LL(0x52827ff0,0x293c91f5),L_(0xcdd9e93e),
+ LL(0x691e28ae,0x2c6558ef),LL(0xd0ac15f2,0xe56ad3e9),LL(0xa247b120,0x573e9688),L_(0xd0627f7e), LL(0x375dee4b,0x22887f9e),LL(0xd31e0ba7,0x7d20b431),LL(0x1eea7f55,0x4423561d),L_(0xf9581051),
+ LL(0xd4243ea6,0x42a54363),LL(0xeb2affe7,0x619c06c6),LL(0x972ce84c,0xaeca0047),L_(0x4d9efd23), LL(0x4e0c1d41,0x173fea08),LL(0x1d890ba5,0x4bd9d779),LL(0xfea0ad92,0x5f0b0f42),L_(0x5619484b),
+ LL(0xe4e12bd4,0x6cdbcee2),LL(0xc11ff4f3,0xfe8d06f2),LL(0xa260adc3,0x5bb4d1a2),L_(0x33e0dbb6), LL(0x27018d5f,0xcaa2ba14),LL(0x415b8922,0x74b9b719),LL(0xb1fbde1d,0xe7f63f33),L_(0xb014bfff),
+ LL(0xeb046732,0xab510c97),LL(0xee7b323c,0x9bf44d3f),LL(0x37854732,0x23d6cc1a),L_(0xdbbcc348), LL(0xf773172b,0x64d5f135),LL(0x6fb100cc,0xb0c07c01),LL(0xb27f28f5,0x980b1419),L_(0xca8834c2),
+ LL(0x01f6b795,0x1b1c75ca),LL(0x8c28e4a6,0x6f2aae0d),LL(0x2cbdb244,0x1341e16e),L_(0x5a726ab8), LL(0xd482dc14,0x32264865),LL(0x4f4a819e,0x1e1e75b0),LL(0xba655f22,0x37367c7d),L_(0xd157593e),
+ LL(0xaa3ab9fd,0x46d94f54),LL(0xc9397bab,0x3628a867),LL(0x65e56a09,0xf946f4e0),L_(0xa259e975), LL(0x372139d2,0xb5060783),LL(0xccc37d6a,0xeef39a01),LL(0xf709343a,0xfb056c2e),L_(0x89705d36),
+ LL(0xb9d0b061,0xeb841e0e),LL(0x7663ad0e,0x0dc12b25),LL(0xb1420c31,0x5792fb1a),L_(0xaebf5ced), LL(0xfb7eb601,0xeaecfdd5),LL(0xd5142858,0xc9d7159e),LL(0xe56ab53a,0xdbaff47d),L_(0xb56ba899),
+ LL(0x64ac917b,0xd69321cf),LL(0xa06234ff,0xe8fd532c),LL(0x98b8cc13,0x4be3eee6),L_(0xadbfb76c), LL(0xb07602f3,0x57f0cdf3),LL(0x01e45447,0xa4676560),LL(0xb307918b,0xa0a5d2a4),L_(0xf7e16814),
+ LL(0x87a7be06,0x6c92c96b),LL(0x865c8f6c,0x666baece),LL(0xf96358e6,0xc0b20165),L_(0x10dbd508), LL(0xc18e3e53,0x990a46d4),LL(0x1d1a7d70,0x0002a616),LL(0x6c2d572e,0xa87b8f93),L_(0x03a7ba98),
+ LL(0x8d933af2,0x6d9f3e8c),LL(0x2221d899,0x3a4a28c9),LL(0x7c844ad4,0x142035bd),L_(0x11c04771), LL(0x2de90904,0xf02e1ad1),LL(0x78ab7d85,0x9793442b),LL(0x301c5cee,0x1feac0e2),L_(0x95568955),
+ LL(0x48a5ccac,0xc5b0ee88),LL(0xf045ebf3,0x1ecaeea9),LL(0xc1ea77c4,0x4e10f859),L_(0xa44993af), LL(0xf6bfe532,0x38d373de),LL(0x5c460d85,0x9d4beaec),LL(0x2bdad16c,0x264105cb),L_(0xb8fc3b3e),
+ LL(0xd715e784,0x2edb771c),LL(0xd4ae16cd,0x5451781f),LL(0xc8055a0a,0xdee3f3e2),L_(0xc08d1ca2), LL(0x3a1c4bfb,0x4252a1b8),LL(0x6d687314,0xbca7011a),LL(0xba935b81,0x3b383652),L_(0x52c1b85d),
+},
+/* digit=12 base_pwr=2^84 */
+{
+ LL(0x793c7e62,0xb92b8aef),LL(0x6354d2c9,0xd358ac7c),LL(0x5a4d9e35,0x0381968a),L_(0x52d9f13a), LL(0x36ed6955,0xc63b9fe6),LL(0x3743142f,0x726db145),LL(0x6e186e53,0xaea91efc),L_(0x3de25aa0),
+ LL(0x4c1ff250,0xf8921757),LL(0xced4216d,0xb6db16c1),LL(0x28cf0cfe,0xd524c877),L_(0x03bdd0b5), LL(0xdfd0f98a,0xd91831dd),LL(0xd131c59b,0x980f4d7d),LL(0x47533185,0xf492c767),L_(0x63c30af1),
+ LL(0x0cc8e4dd,0x79a5ddcb),LL(0x495cdcc7,0x26e26606),LL(0x7f199f53,0x9d2ff41e),L_(0xbe613bf2), LL(0x36bd8348,0x967f0753),LL(0x76c36728,0xc4ce6462),LL(0x02af3c45,0xee5a166b),L_(0x0bda3025),
+ LL(0xff47da80,0x63718529),LL(0x473e976c,0xa699d496),LL(0x88aeb436,0x368ce839),L_(0x94aabe19), LL(0x0bf4b797,0xb19a3ec6),LL(0x7d50b7ff,0xcd07cc98),LL(0x81c2bf46,0x8c4eb78c),L_(0xb0a7cd1f),
+ LL(0x2ddf8350,0x56f0849c),LL(0x5739e59e,0x4be4bf01),LL(0x1fc6493a,0x8b91a3a3),L_(0xd401b24b), LL(0xe89ec9f3,0x9decd9c5),LL(0x17f178e9,0xe63f9369),LL(0xfa904473,0x7a09efc0),L_(0xca5c00a9),
+ LL(0xe3f640d4,0x6aca6f60),LL(0x4bda0113,0x574789e1),LL(0x12ccd894,0xb4db3fdf),L_(0xb39be04f), LL(0xf1e4603b,0xb4705565),LL(0xccbe5154,0xef713fb6),LL(0xd84fec44,0x11964906),L_(0x9ceede3f),
+ LL(0x0244c62d,0x13111bdb),LL(0x175d3f77,0x14dda4d9),LL(0xe0971342,0x21244b52),L_(0xd6fa5642), LL(0x2ee8560d,0x68da34f1),LL(0xb9933942,0x387164b3),LL(0xd7d7f791,0xee292b1d),L_(0x4382d48d),
+ LL(0x2a7dfaac,0xe877a208),LL(0xaf9b8432,0x77afbba8),LL(0x1257224a,0xbb09b923),L_(0x1501cefc), LL(0x38985dbe,0xe061421f),LL(0xaa863b6a,0x00e2d3d6),LL(0x2733782a,0x1a9bf0b7),L_(0x6912b5aa),
+ LL(0x70c5c0c6,0x38d01224),LL(0xa0259e70,0x84a934e4),LL(0x8e85d7ef,0xfd49df96),L_(0x6bb4a230), LL(0xa15b7d76,0x58b99e52),LL(0x3c2be4ba,0x2dc32c4c),LL(0xe49fcb40,0x4937a76d),L_(0xdc9b73dc),
+ LL(0x5ce8f858,0xa516c9ed),LL(0x41610138,0xd3f7221c),LL(0x71d5b83a,0x8795351f),L_(0x9a45e682), LL(0xef8c4cff,0x9edacc8d),LL(0x17bd9c0b,0x9166ced1),LL(0x871cc69c,0x57013f03),L_(0xb6b7b6e2),
+ LL(0xf3f01792,0x4855e4b1),LL(0x124c67e8,0x7556de49),LL(0xd4d7f50b,0x494ae118),L_(0xf16b9834), LL(0xab9ad587,0x3a6a8d30),LL(0x18d69af9,0xa950fac0),LL(0x7f8ed091,0x9daffa88),L_(0xba6e7c59),
+ LL(0x8f831a7c,0x011788f5),LL(0x9c64aa0c,0xf480aaea),LL(0xf896522c,0xcc8f1ea7),L_(0x772627b7), LL(0xe1227c86,0x72bb812a),LL(0x57f8a759,0x6e202e06),LL(0xc7e7a397,0x4c06faeb),L_(0xeea7a14b),
+ LL(0x46853977,0x0c456e84),LL(0xbacf3d29,0x94a82d15),LL(0x861ef909,0x17a88c53),L_(0x25d01a4d), LL(0xaa44d1ac,0x0b6e87fe),LL(0x066301cc,0xce900509),LL(0x51763eac,0xe4c44c3a),L_(0x243f5364),
+ LL(0xf02ccf3e,0x69fe2b3e),LL(0x623f7c06,0xa6634ac0),LL(0xa81b9914,0xba6dd8e5),L_(0xd33612e7), LL(0xcf35703c,0xc948497c),LL(0x7184b686,0x3725232b),LL(0xd5e74279,0xfa105e4b),L_(0x4bfe5bea),
+ LL(0xbbed4591,0x03d46274),LL(0xfcb464d3,0xc3c74b90),LL(0xdcb4ccb3,0xf6934477),L_(0xbdf563a1), LL(0xdae24867,0x7c07acc7),LL(0x4d4331eb,0x05fd6424),LL(0x768b2706,0x022d151f),L_(0xf65a4027),
+ LL(0xfff51bbb,0x5cbe2653),LL(0x32707706,0xbec1f2c5),LL(0x9739588e,0x1d1ff202),L_(0xe51c696a), LL(0xfa60c3f4,0xdd740417),LL(0x25fcc7e6,0x6a0e351e),LL(0xac2dfbc7,0x0d72b69e),L_(0x1ff6f6ad),
+ LL(0x3eaa7b81,0x3ade75e7),LL(0x3ac64888,0x4036d025),LL(0xd957b110,0x7be01ff5),L_(0x33f835d6), LL(0xc6af558a,0x45081b72),LL(0x0c08887d,0x137ffdce),LL(0x4fc01e35,0x84d416f7),L_(0x15716e5d),
+ LL(0xb47ca6c4,0xc4cafbc2),LL(0xcd118e18,0xac25eb7f),LL(0x78d7034b,0x4d198a7c),L_(0x9ba63f25), LL(0xdb8a8725,0x81c83f82),LL(0x9eb5e40b,0xdd6d729d),LL(0x3b1941e5,0x27b87b90),L_(0xb7229f73),
+ LL(0x492e405b,0x59afdea3),LL(0xf6e5451f,0x74cd3ea2),LL(0x3c7977fd,0x8262d80b),L_(0x0ff79532), LL(0xd5eea209,0x85d46815),LL(0x41a59faa,0xe5277e25),LL(0x815bfdff,0xf25c4d84),L_(0x26a648ca),
+ LL(0x1ce66149,0xc47be93e),LL(0x8807158f,0x150ece78),LL(0x71da23a8,0xf790aca9),L_(0x26957d5b), LL(0xeaf83d16,0x571af637),LL(0x3a3ff68a,0xbbf0d967),LL(0xb02eef0e,0x78555759),L_(0x1609b893),
+ LL(0x38ec85bb,0xa99f1706),LL(0x7a4aae59,0x12f3c66b),LL(0xc84493c2,0xf1b134ce),L_(0x8f2fb8ff), LL(0xbfc251dd,0x8f6f7a7f),LL(0x73cd2591,0x7b6bc242),LL(0xf68459a2,0xf4b9ddab),L_(0x1d8a7278),
+ LL(0x995f94c3,0xa1fd53d1),LL(0x3ad117de,0xae71c050),LL(0x75e31939,0x58a5dfbd),L_(0x3251c208), LL(0xda1a36d0,0x8436c37c),LL(0x65ab378a,0x80258188),LL(0x3a685733,0xe6172e78),L_(0xfa11b001),
+ LL(0x54abde7c,0x18e18996),LL(0x48c2dc2c,0x3b62d97b),LL(0x814d21da,0x198afe84),L_(0xf76ecf91), LL(0x0ca9c69a,0xb918572e),LL(0xf53020dd,0x249d565a),LL(0x365cb3e0,0xa6a9ebf4),L_(0xf8ad1ad6),
+ LL(0xb5e96d0f,0xf1859230),LL(0xcb1be872,0x64eca0e1),LL(0xfaa10d6a,0x11273c1d),L_(0x240336fa), LL(0xe56d43c3,0x6bfe9508),LL(0x88653660,0x12a7c212),LL(0x7b0d301c,0xd427be59),L_(0xbd85a9ef),
+ LL(0xbc70a5f7,0x72600cd7),LL(0xe9cae1c4,0xee97ffd5),LL(0x3d1457c8,0x96865fe9),L_(0x9a1bc1e7), LL(0x1518b86c,0x7727a4f5),LL(0x09a2a9db,0x1ed0a203),LL(0x028d0a99,0x9656e0c0),L_(0x7f3b01db),
+ LL(0xcb2d1081,0xb1f41608),LL(0x060c3752,0xf5804976),LL(0x6efb7250,0x0bd8bd31),L_(0x79016736), LL(0xc3ebc844,0x8739f62c),LL(0xf14247f9,0xb2896f39),LL(0x29b78fc9,0x5b2e893a),L_(0x5f2b1e7f),
+ LL(0x058470b5,0x380ddadd),LL(0x014c7c14,0xddf90df8),LL(0xc2d7837b,0x78897ca3),L_(0x5567dd34), LL(0xe3308b08,0x00642d55),LL(0xf735f752,0x9ca8b38a),LL(0x8afd8b87,0x6eb02b4e),L_(0x120f5319),
+ LL(0x2f0ecf3f,0x8fc31698),LL(0x41d511e3,0x8873639c),LL(0xbdc4fb65,0x9841bbd5),L_(0x207bfaea), LL(0x8e82da75,0x38fcb8d9),LL(0x6ba5dcee,0x05619b1f),LL(0x21f2d336,0xf78fd1c0),L_(0xc6f634fd),
+ LL(0x8258ddc6,0x09a676ca),LL(0x414f2daa,0x23041ee7),LL(0x4cbc9d7b,0x3b973302),L_(0xb409e95d), LL(0x7027e9ce,0xd16a5ca8),LL(0xf92a6554,0x473c41d1),LL(0x153e5025,0xa08470dd),L_(0xae4dfb2b),
+ LL(0xb57dcbad,0x5b3c44c3),LL(0x45031642,0x1130bf58),LL(0x335c400b,0xd4b606ca),L_(0x6b34a475), LL(0xbd2244f8,0xf3ab94fe),LL(0x746295e2,0x68723d0a),LL(0x4b9b612a,0x9d957566),L_(0x510e67f8),
+ LL(0x9a9a5ab2,0xdc56f264),LL(0x9f7dfe87,0x8565f7b7),LL(0xe3386448,0x104ea5b5),L_(0xac4c4feb), LL(0x5964e7d7,0xb2f8650c),LL(0x186e3514,0xf781aadb),LL(0x58c2701b,0x81927ca6),L_(0x81220e7e),
+ LL(0x6cffb688,0x727a95e9),LL(0xfb0e9702,0x83b28617),LL(0xcca5f38c,0xdb71dd75),L_(0xad31c5dd), LL(0xf33897ae,0x3ff02651),LL(0x683b0e57,0x380268df),LL(0xc6e32a5b,0x4ab25a51),L_(0x283f183b),
+ LL(0x48906979,0x08ea3767),LL(0xf7f76eae,0x744d1934),LL(0x222dd487,0x5b8927a0),L_(0xdc4a955f), LL(0xf36b1f09,0x605b6b77),LL(0xc80579f6,0xc4a4588d),LL(0x4cf36f45,0x94402fad),L_(0x0a226060),
+ LL(0xe0e79649,0x77db1b5d),LL(0x4fe36153,0xd0b5aff6),LL(0xb32ea8ef,0xa09373a7),L_(0xd4f68719), LL(0x116381ec,0xd8828433),LL(0x8c0026e9,0x7e2c0fab),LL(0x16af4c4a,0x8f7a154b),L_(0xd4672394),
+ LL(0x32df0ada,0xe432397e),LL(0xd0196172,0xd07b25cb),LL(0x114f01ee,0x12143827),L_(0x2f06e8aa), LL(0x9a3c110f,0x00bcfcbc),LL(0x76ee873b,0xb9f30c05),LL(0x8ff02da4,0x786da906),L_(0x7e7e6c65),
+ LL(0x0cb411eb,0xc8866c5b),LL(0x0d7b5118,0x5022b82e),LL(0xef5be83e,0xb37c41ce),L_(0x4b76c64d), LL(0x17ee0e9a,0x3d28da11),LL(0x8ef7cb6d,0xdd638761),LL(0xa3c8a2d5,0x4369465e),L_(0xc8c85ab8),
+ LL(0x5cda4d54,0x08818978),LL(0x17f1f556,0x62350317),LL(0x251cc26a,0x686c57b8),L_(0x865fb805), LL(0xe9b31ebe,0x19c7f60e),LL(0x23566eda,0x56fbedbe),LL(0x47f95f9f,0x867b619f),L_(0x1958dbaa),
+ LL(0x6427adad,0xfc7b0692),LL(0x44b01395,0x899725d1),LL(0x0d676d87,0x075607b2),L_(0xe2ae6225), LL(0xf9c3cc31,0x56d68f4a),LL(0x7e636075,0xb883986d),LL(0x1ffba2be,0x5c1ff02f),L_(0xc237448d),
+ LL(0x06c3092f,0xc3ea5575),LL(0x52c5f87e,0x2926437b),LL(0xf135c025,0x593535ee),L_(0xe0965b4b), LL(0x33672517,0x54fedc17),LL(0x28d4b11a,0x39103346),LL(0xe5297d9a,0xb0d741c2),L_(0x39caed90),
+ LL(0xf87698f2,0x340fdc0a),LL(0x1b8201fc,0x4ba2f34c),LL(0x248c333c,0x5f236490),L_(0x12ee4946), LL(0x52913c22,0xcbc6b04f),LL(0xee23385a,0xe9ac2163),LL(0x630f7175,0x0000016a),L_(0x3f6e71ce),
+ LL(0x953882bf,0xc6c3de30),LL(0xf99b211a,0x34fd7b9c),LL(0x549ffc42,0x5ffb8aa4),L_(0xbc4e1e52), LL(0x8cc9069f,0xe552f859),LL(0xf54af34b,0xe153c954),LL(0xd61618d2,0x5bb20166),L_(0x5776aea6),
+ LL(0x546f1f93,0x535ea11d),LL(0x565a5471,0x3aceac15),LL(0x4200ddef,0x8ee2aacd),L_(0x2493fe70), LL(0xd0228894,0x048f6036),LL(0xc2e41220,0x37388c77),LL(0x3193a2ea,0x3c56b2e4),L_(0xc4609ea4),
+ LL(0xcae3c391,0x4276f085),LL(0x57d5dc17,0x5fbdd403),LL(0xa8a6408a,0xd70d74f7),L_(0x98acac12), LL(0x75cbb8e7,0x93cd39a9),LL(0xb4c10685,0xe460014e),LL(0x56a7276e,0x2685e5f9),L_(0x3eeed659),
+ LL(0x4c4c8866,0x2d701e0d),LL(0x22e61da3,0x73a590ba),LL(0x45111480,0x403fd833),L_(0x6080d968), LL(0x41cddacd,0x2957083a),LL(0x38eb9ccb,0xed0801ce),LL(0x1be2ace4,0x726301f8),L_(0x002d8909),
+ LL(0xdf6a5e6d,0xd1f92359),LL(0xf591d929,0x221a78d5),LL(0xdc207a6c,0x5e691f61),L_(0x20b8f8e8), LL(0xa52ee137,0xaeb5ac09),LL(0x7eacabb9,0x95e85345),LL(0x0985df07,0x04b8e782),L_(0xf8047be0),
+ LL(0x2128e372,0x84928309),LL(0x4f347f1e,0x62f5aa58),LL(0x7d0fc140,0xf365c6c6),L_(0xa0e662a2), LL(0x7f46460f,0x8d246f44),LL(0x9dcc1860,0x05e6f03d),LL(0x5bfa3ba3,0xd9a27ded),L_(0xb281e327),
+ LL(0x5bf0784f,0x6bab642b),LL(0xbff128cd,0x0d3bef83),LL(0x268f3894,0xfc73c613),L_(0xcd24728c), LL(0xdefd474c,0xd40e3e59),LL(0xf065f5d7,0xb7f90c59),LL(0x15d0cf49,0x4ad712bb),L_(0x70e00818),
+ LL(0xd2fe399c,0xf1c993ca),LL(0xa2f0722e,0x4e4c53ef),LL(0xe7c142ac,0x8af34ce1),L_(0xce47aba3), LL(0x7f0fff87,0xb6c1f1fe),LL(0x49dac9d9,0x0f23c16d),LL(0x1baa4d4d,0xdbfb3b98),L_(0xd927e1a8),
+ LL(0xe7a09b61,0xde4413aa),LL(0xad27b0b5,0xbaf8e054),LL(0x0077242e,0x5d3ac419),L_(0xe50d3185), LL(0xb407f82a,0x6b5c4ee9),LL(0x4a8b1fad,0x6d04cfb4),LL(0x30ac4e43,0xe0253dce),L_(0xf07461c4),
+ LL(0x5a25f143,0x01947898),LL(0x818e99b8,0x35e2c880),LL(0x05ed8f7c,0x09f78f1a),L_(0x2fb78a6e), LL(0xc9d82b2c,0x4c2f0ccd),LL(0xfdd48d7b,0xaf9e328c),LL(0xe380dbfc,0x9600539c),L_(0xbb3a3bc6),
+ LL(0x54969bd7,0xea2bbe07),LL(0x394029b6,0x262c8bfa),LL(0xc8ab0425,0x90339a91),L_(0xda368bdd), LL(0xd540c3e3,0x0fe39b20),LL(0xc20f1366,0x5dbdfc74),LL(0x8075ba9a,0xdc668935),L_(0xa20bdd31),
+ LL(0x457e42b6,0x513bd423),LL(0x02a9ea32,0x37ec475b),LL(0xe477baa7,0x52b0bc16),L_(0x4583bc9a), LL(0xcce869a0,0x287b6484),LL(0xf11b84b0,0xe1aa5cec),LL(0x7925b118,0x4ab367b2),L_(0x8ff3e481),
+ LL(0xe318b3c1,0xb6f137ff),LL(0x0ffc4673,0x73596e44),LL(0xf9b0dfda,0x2bd4103b),L_(0x56acfc3b), LL(0xd8a47cb2,0xa87de433),LL(0x046c39cd,0x69413a97),LL(0xdebd1720,0x11fa933d),L_(0x3f6c6fec),
+ LL(0x47ed0eca,0xae4601fc),LL(0x06034734,0x110171a4),LL(0x104d85dd,0xca3c77a5),L_(0x8bca0d2e), LL(0xaee2efa8,0xc78c356e),LL(0x70ae3402,0xcedf0097),LL(0x322e72ad,0x07c1fe3f),L_(0xd0253c44),
+ LL(0x26e6bed6,0xc2f400a6),LL(0x2291a21d,0x7258c335),LL(0x287eac13,0x1680907d),L_(0x03a00f86), LL(0x4aa4df86,0xbadddbc2),LL(0xc5e15b28,0xc0fcaacd),LL(0xf30664e1,0xb1606671),L_(0xc87b6603),
+ LL(0x81f0973b,0x1873a8e4),LL(0x5f55c7e2,0xecb9e193),LL(0x33f083bf,0x95c9fed8),L_(0xe416fc1c), LL(0x13f90aa7,0x02778f81),LL(0x07eef5cc,0xc73195fa),LL(0xa94149e0,0xc8c44cfd),L_(0x2d270d3f),
+ LL(0x1a3813b8,0x7ca9f957),LL(0xdb514ec8,0xb674cd7d),LL(0x9718dd0a,0xe2bf5a99),L_(0x325fe3bd), LL(0x25692bfa,0x4f0b0620),LL(0x78990d74,0x5191688d),LL(0x5e70b57e,0xdfbda68c),L_(0x6e9d11e2),
+ LL(0x134142aa,0xd61361ba),LL(0xf97cf589,0xb62b767a),LL(0x7b21af77,0xf64ebc1a),L_(0x03a72d66), LL(0x6883434c,0x4b021c90),LL(0x39df1cca,0x2fe04352),LL(0xb84c6c06,0x9b6a3082),L_(0x62692bf5),
+ LL(0x33f0c495,0x94bf9bf4),LL(0x79c2f57b,0x85cdb0a8),LL(0xe0d00e0a,0x49f82bc9),L_(0xb9c9a088), LL(0xce773e24,0x1f589bd0),LL(0x11cd1677,0x1892643b),LL(0x8f952d00,0xb5eec978),L_(0x016b826e),
+ LL(0x87c07fe6,0x8cd03f0a),LL(0xf4d9e042,0xa3443289),LL(0xb07e4630,0x361c9252),L_(0x5bbca5ce), LL(0xb600853c,0xe687c31f),LL(0x7bd9a485,0x90550b79),LL(0xe200e18a,0x0e254cdc),L_(0x50dce2e6),
+ LL(0x3c92fc46,0x4b5e8398),LL(0x284e641b,0xf7347214),LL(0x0556fa64,0xa75c4fae),L_(0x4cc4b972), LL(0xaebb3e9c,0x90fa7977),LL(0x6a40b04c,0xa133ea2d),LL(0x97401c28,0x613bfe61),L_(0x443845a0),
+ LL(0xe2f9a715,0x532b2d67),LL(0x482b7779,0x065c4d2c),LL(0x123aa16e,0x6886e7e9),L_(0x9147c317), LL(0x40c6dfd4,0x1530f2ae),LL(0xaed04ac0,0xd86577c2),LL(0xa4111d16,0xd86157ff),L_(0x7406594c),
+ LL(0x23598a12,0xafae6c6e),LL(0xed33d4b3,0xa2858c95),LL(0x008ec0c9,0xfe186e4e),L_(0x7e4ed374), LL(0x9cb08278,0x2534f6e7),LL(0x798a9b30,0xe5f0b67d),LL(0xfcf997cc,0xb58b2b67),L_(0x2f620d55),
+ LL(0x3d465f68,0xe8013df7),LL(0x5dcfcfb0,0x3e4bfa75),LL(0x7a765b73,0xe0fbd7bb),L_(0x4e7374be), LL(0x186b6aed,0xfe9b1e77),LL(0x375f54f1,0xf7011562),LL(0x55dc463e,0x202fbb6d),L_(0x8d697af5),
+},
+/* digit=13 base_pwr=2^91 */
+{
+ LL(0xe165ca1e,0xbcdbe444),LL(0xcb4a833d,0x76643977),LL(0xb07c1b51,0xef7d725e),L_(0xdc3b82a8), LL(0x21f29146,0xaa5a7ac8),LL(0x01e0c54e,0xa51481d9),LL(0x2b2d5197,0xd220aca6),L_(0x736d91c9),
+ LL(0x87d54b6b,0x74d6d0ba),LL(0x9af89e67,0x723937b3),LL(0xada42e0e,0xda49ba83),L_(0x83b9c4ec), LL(0xa3055000,0x12dfdcad),LL(0x7e0a2cb4,0xa98d5243),LL(0xf7e3a9a3,0x6ed0d332),L_(0x1f8c692d),
+ LL(0x6e661a1d,0x634cef8a),LL(0xff5ab01d,0x35d65531),LL(0x6fe3ecd9,0xc1015db1),L_(0xfcc7ca4c), LL(0x769b7e20,0x795d4926),LL(0xed944d52,0x6db9a053),LL(0xf5f4129a,0x8f02bb95),L_(0x4007343b),
+ LL(0x75cd1b48,0xab70364f),LL(0x6b243c97,0xf0408ddf),LL(0x8b9a0873,0x0ef0ffd5),L_(0xb6e8c899), LL(0xbe3a87dc,0x2e1c11d8),LL(0x154379bf,0x6ed01611),LL(0x4382cb75,0xc876e0d3),L_(0xc42ec7d1),
+ LL(0x0e4e37cf,0x1ce64f93),LL(0xa2eb2c00,0x1061f84c),LL(0xe1a22446,0x450ed02e),L_(0x4205e69b), LL(0x644aa51b,0xc76dda32),LL(0x62db01d8,0xb244a09f),LL(0x633bdf3e,0x95c86470),L_(0xf9a6b309),
+ LL(0xab41ec83,0x71aba88e),LL(0x590711c2,0x3366c35b),LL(0x0b6ab428,0x87bfe939),L_(0x1d7e1090), LL(0x1d44d3e7,0x7ebcdd74),LL(0x2a937fd4,0x42a83b75),LL(0x3da3197e,0xc4155a57),L_(0xf1cea938),
+ LL(0xb74ca945,0x6a4807e3),LL(0xc0c52eb7,0x474fa11d),LL(0x12ba26fc,0xda7a7914),L_(0x001d4756), LL(0x34ddd360,0xce833467),LL(0x3290dbb2,0x0e517e33),LL(0x2b0a342a,0x579c91eb),L_(0xc27c2657),
+ LL(0xb129c61a,0x6983b44b),LL(0xf27d3e69,0x463c956f),LL(0xe4a043b6,0x5a97c010),L_(0xc8f8a3c7), LL(0x6cfa78d3,0xb9a3137c),LL(0x5655ed33,0xfc8d858e),LL(0x0b6dca4a,0xc1a3c9bb),L_(0x630b3026),
+ LL(0xe0a6194c,0x082a09e7),LL(0xffe89fc6,0x8699cb3c),LL(0x9f4f85f6,0x0b13732a),L_(0xba6e1981), LL(0xa2917bd0,0x26eb2b17),LL(0xa4afe844,0x0b4bc106),LL(0x91a5d7b8,0xeeac1c21),L_(0xe71f5fe0),
+ LL(0x2f9e0c0c,0x3f0bf1e3),LL(0x031e908e,0xbd33fa00),LL(0xbc16afc6,0x6e2d4301),L_(0x90a23e58), LL(0x99df250f,0x2549fd20),LL(0x52f4ef15,0xa724a018),LL(0x5b4c8dd8,0x1a5fbbc3),L_(0x7457c84e),
+ LL(0xbdbe5cc7,0xa3742f59),LL(0xe0a87786,0x6287ad4f),LL(0xe7aa9e66,0xba62daa3),L_(0x65327959), LL(0xa06c023b,0x7da31b20),LL(0x7fbf3e8d,0x94bea960),LL(0xe1a7865a,0x877c379e),L_(0xea576b89),
+ LL(0xca000d60,0xaa616a39),LL(0x662a3f35,0xcacdc37a),LL(0xdd7d18e3,0xee30f511),L_(0xf25f9c46), LL(0x7bee7ee6,0x3e51e652),LL(0x81e804d2,0xdd692c2b),LL(0xb0aaaab1,0xa52da544),L_(0x89ee1376),
+ LL(0x3e7d3b9f,0x97063082),LL(0xf2d42cdd,0x846e4346),LL(0x9cb9423c,0x6ed009de),L_(0x746461d4), LL(0xd30da2a3,0x6b0d52f7),LL(0xe78fe609,0x0b06f17a),LL(0x6887a9cd,0x8730c3cd),L_(0x0f586a94),
+ LL(0x91370dc2,0xf21a3a39),LL(0x38aa8cf8,0x4835ded5),LL(0x3dd4e3e5,0xf1f81f18),L_(0xee849585), LL(0x8aa2dfcc,0xb30df028),LL(0x1e4514ba,0x24f52ca4),LL(0x757e6772,0x3b2305c3),L_(0xa3525eaa),
+ LL(0x0e45f1c6,0xb94b1aa1),LL(0xebe6c1cc,0xa3e2b74f),LL(0x1c4d6e37,0xfa33270b),L_(0x5d3856a1), LL(0x62ec6306,0x77b4e047),LL(0x63f53943,0x36b59c35),LL(0x7466b59e,0xaea29806),L_(0xb1050d57),
+ LL(0x4fc503ac,0x0fd330ac),LL(0x0f394d0b,0xd80c9e62),LL(0xe4d013eb,0x99b62540),L_(0xaa1c17a9), LL(0x0a2e0bc8,0x8f6f2742),LL(0x7366a618,0x3a715ba2),LL(0x88e9ae3e,0x8818aa14),L_(0xd2fe924a),
+ LL(0x1cf5fda8,0xfd68c56e),LL(0xd02cd00e,0x77ce9ac0),LL(0x5f260a21,0x9c693311),L_(0x7c1f3266), LL(0x878fca42,0x5b2551ab),LL(0x9f545dde,0x365af76c),LL(0x19f87afe,0x019bf350),L_(0x58397798),
+ LL(0x2ced9c6c,0x46ea826a),LL(0xc4da4263,0xe4112274),LL(0x43744264,0xbfc3581d),L_(0xcc933457), LL(0xb80bff4c,0x9cbecb36),LL(0xe0071ca1,0xb9509e61),LL(0xcf0cfc02,0x67a2c9e1),L_(0x2f9bd24a),
+ LL(0x48a08314,0xa57e540e),LL(0xd472cc15,0xd2110f43),LL(0x0b60e719,0xcd92d76f),L_(0xca1c9c30), LL(0x44377160,0x8103a772),LL(0xa305744b,0xf08411da),LL(0x54b38b68,0xd6e1cdb8),L_(0xb252c82f),
+ LL(0xf1e98090,0x935833d6),LL(0xd0e4995f,0x530418e5),LL(0x87f60eef,0x933733ca),L_(0x379092ba), LL(0x423ea862,0xd4945af5),LL(0x60eeff1a,0x165baec1),LL(0x1d6d1df0,0x4bee290d),L_(0xe87f42f5),
+ LL(0xcf66861f,0xb222f293),LL(0x080ba4e8,0xb45f15c2),LL(0x8ed3f3c1,0xfdee70ba),L_(0x58ce1c82), LL(0x46cc54a7,0x8490a252),LL(0x6ed1e744,0x7d319886),LL(0x0602a509,0x585e149e),L_(0x7fa41773),
+ LL(0xcd741439,0xf0a3e291),LL(0x74dc9c31,0x41b8528c),LL(0xc78baacd,0x01ba1bb0),L_(0xe5b73558), LL(0x1ce4898f,0x9cf50575),LL(0x5421bd61,0x5a0b632c),LL(0x241cb4c7,0xc421cfb2),L_(0x9ba297a8),
+ LL(0x9bac4e41,0xf0b66ab7),LL(0xd87b31c9,0x9f0067bf),LL(0xcf835fb0,0x2f9c67c3),L_(0xaee5e6cf), LL(0x228157ee,0xd04298dd),LL(0x0411e445,0xeac052a3),LL(0xbec90b82,0xe6adb2bb),L_(0xb30b9c0e),
+ LL(0xdcd6bf3b,0xda605905),LL(0x5f01a30b,0x0b1bb0c1),LL(0x7c053c41,0x40f7d79d),L_(0xc39feb03), LL(0x98a4669a,0x3d73c359),LL(0xe472e81d,0x4a94f93e),LL(0xdea2bf34,0xed66fd6f),L_(0xddc57518),
+ LL(0x904c89ad,0x7095dc91),LL(0x07f66d27,0x2423fe30),LL(0x9c4ec652,0xfd209ae0),L_(0x35803afd), LL(0x94522cf2,0x51ed5eae),LL(0xc9356091,0xb3740f2a),LL(0x19e52bee,0x0676dac6),L_(0xd87e6c27),
+ LL(0x4ef0a025,0x83877c70),LL(0x39e61abc,0x09e709b4),LL(0xa88e05f1,0x7885ad28),L_(0x53bfba53), LL(0x9b73b3c4,0x8e433b9e),LL(0xd6a78477,0x7394d932),LL(0xcefdc6a1,0x3ce9d748),L_(0x27d9ed71),
+ LL(0xda4320d3,0xe57aeaa8),LL(0x7dbbbc39,0x06fa3110),LL(0x5c942e4e,0x7d7aed19),L_(0xe660d0ba), LL(0xadbc0281,0xff40dd89),LL(0xcdf314b5,0xb1ee8372),LL(0xa625d183,0x9d4344c2),L_(0x54f2035c),
+ LL(0x73c8d3ee,0xd120f88d),LL(0xe3275570,0x060ff4c7),LL(0xe344b66d,0x8d5e8c7f),L_(0x1cdb23ae), LL(0x23a7070c,0xce526de2),LL(0xe64e6355,0x4b694305),LL(0x5edf30dc,0x7e00559a),L_(0x3501ee2b),
+ LL(0x93c5d80a,0xa6698b0c),LL(0x91c3e912,0xd21b90b5),LL(0xbb24391d,0xe1e797f6),L_(0x0526a13b), LL(0xe2efd168,0x41e4a8d3),LL(0x63a82271,0x92a0c47e),LL(0xf6fd3e09,0xd1ade148),L_(0x85041faa),
+ LL(0xd58b2165,0x7675921a),LL(0xb30c5e67,0xa292beda),LL(0x9a004497,0xb5aac131),L_(0xcaf13420), LL(0xa8c50521,0xced86c69),LL(0xc60fb50a,0x9774900b),LL(0x8cd4dd3d,0xdec98657),L_(0x5092d4ea),
+ LL(0x829ecf62,0x9fb10f97),LL(0x67b904af,0xef94ed3f),LL(0xeebc687c,0xdae52182),L_(0x13aadd13), LL(0x964738db,0x59a01f8a),LL(0xc7db8080,0x608e9fae),LL(0x5433ce08,0x8b26a71a),L_(0x0c3a71bb),
+ LL(0x09326b40,0xd29e534e),LL(0x215aa2f4,0x727f40f5),LL(0x5f00b26c,0x3c54a3cb),L_(0x71ec2585), LL(0x14b424a2,0x4c553b92),LL(0xf86c23e2,0x06c97184),LL(0xdd6cfc3e,0x0fb40ab0),L_(0x4647a750),
+ LL(0xb818ca3b,0xa51a2b16),LL(0x1bbce0ea,0xb716ceb6),LL(0x7e78ccf9,0xc6736591),L_(0xbaa1d2e3), LL(0xe68eaa6c,0x6b8866a9),LL(0xc5b9e6fb,0xa4607970),LL(0xc39a4975,0x712336e6),L_(0x86d2dbfa),
+ LL(0x37f2fc9e,0x106db861),LL(0xc495534c,0x4b840f41),LL(0x75c25359,0x05a076ec),L_(0xf2a1fa9b), LL(0x22526757,0xbab703f5),LL(0x2b054aeb,0x8e748f87),LL(0x9e9ed0df,0x42646b39),L_(0xd95a6334),
+ LL(0x22dfe0f7,0xbcf088fd),LL(0x373df018,0x58f99bf3),LL(0x2646d8ce,0xa20f1b7c),L_(0x3bc4db1d), LL(0xc7206a4f,0xf3f061d0),LL(0x7fc330d4,0x97fe5b1c),LL(0xd64fa0dc,0x93be4afe),L_(0x239a905a),
+ LL(0x465eb830,0x9491ca54),LL(0x3a2368e4,0x096991e5),LL(0x840339bc,0x60229ac3),L_(0x0f74bf45), LL(0x167045a8,0x6bb23f63),LL(0x6df7548f,0x7c1e871a),LL(0xbd4ae1af,0xa5c7651d),L_(0x85fa24af),
+ LL(0xc10316ff,0xd9ea606e),LL(0x72e722f7,0x1d7722d9),LL(0x02dae11f,0x6f289df9),L_(0x4f148db1), LL(0xb66ca6f2,0xe8df6026),LL(0x0dc6bfc0,0x6f25ab93),LL(0xc2c848fa,0x726e5bf2),L_(0x0bc8372a),
+ LL(0x29431ba8,0xe513cc60),LL(0xb368f5d3,0xf213ba74),LL(0x2acdbaae,0x077919ee),L_(0x69129848), LL(0x3dbdea30,0x5c03af05),LL(0x6892cac4,0x81b53f34),LL(0x13156876,0x86df2c46),L_(0x15d63bed),
+ LL(0x20319c6f,0x85ef7365),LL(0x7ea45182,0x2f38b49b),LL(0x7d4f7ca6,0x2e79b2d0),L_(0x5befddd6), LL(0xcfcb5a29,0xeb6e8177),LL(0xd7c05293,0xeb5b17b7),LL(0xfebc1ad3,0xc2ef9919),L_(0x5ef848b7),
+ LL(0x628b133f,0xec0fd6a2),LL(0x4834ba2e,0x71d618c4),LL(0x70062560,0xee7cbb5c),L_(0xa240c28a), LL(0x0c5f4e11,0xe8bfcc1d),LL(0x36f2363a,0xdaf65ead),LL(0x2c7fdead,0xee2e792a),L_(0xfe7f2c9f),
+ LL(0xb9045bc3,0x21f1b865),LL(0x7a207076,0xf7c65eaf),LL(0xa289580c,0x26c6a4fb),L_(0xac8c38be), LL(0x2c1dd729,0x603a204c),LL(0xc96f5b0f,0x7ec2e50b),LL(0x07974ac0,0xdd93d467),L_(0xd384c831),
+ LL(0x27da0d82,0x130cf277),LL(0xb2d57bad,0x7cd69a13),LL(0x2e92cb98,0x0b8251c6),L_(0x04325b28), LL(0x35f746a8,0x630e8e9d),LL(0xcda5985f,0xe5c307ba),LL(0xf6775b8c,0x9cc53c03),L_(0x466530c7),
+ LL(0x660bcc85,0x9b3d46a0),LL(0x6911dd6e,0xfec92d25),LL(0xf5c72cad,0xaf7d9d93),L_(0x53a3ea3c), LL(0x244c7ae6,0xd879f3e1),LL(0xeaba3d43,0x57858904),LL(0x4c921338,0x3b59edc0),L_(0x7ee8ea79),
+ LL(0x0d019290,0x64c557a0),LL(0x70b7979e,0xa66689a7),LL(0x482d3b9a,0x08f6017c),L_(0xecf693f0), LL(0x90c3c46a,0xe8816977),LL(0x7c8670c4,0xf94ce04b),LL(0x05b8eed1,0xa8713371),L_(0x0ebddf9f),
+ LL(0xe8f0dfc1,0x50dc1442),LL(0x884f22ec,0x104f20a7),LL(0x5f885c0b,0x4da67f62),L_(0x6b4ecc34), LL(0x8460d391,0x0181b70c),LL(0x3f227a67,0xffedd7e8),LL(0xafb114cc,0x5b40835b),L_(0x2f5bb436),
+ LL(0x2da90ee3,0xdaec76bb),LL(0x6deef6a5,0x05e4b337),LL(0xe70560f3,0x8e70fab8),L_(0xdf0c450d), LL(0x76bc05d5,0x916202a7),LL(0x05568dde,0x84cf17af),LL(0x89f0919f,0xb5670da6),L_(0x97387cce),
+ LL(0x54cdc952,0xc269a349),LL(0xae4d60ad,0xa15fdc88),LL(0x27a5a550,0x560e5ad7),L_(0xfd2940f8), LL(0x23e1393c,0x86446f69),LL(0x2f2ee978,0x918a434e),LL(0xa481c71a,0xd1f9e2af),L_(0x99fe0c80),
+ LL(0xecc46dd9,0x4c354b31),LL(0x9d2731ca,0x5917267d),LL(0x9583d77a,0x549fab4d),L_(0x20743202), LL(0xfa4579de,0xc9afa8d5),LL(0x6ee70bf6,0x679e9b14),LL(0x71181b55,0x34dfc171),L_(0x186cb701),
+ LL(0x92faa6da,0x784904dc),LL(0xef91aeb1,0x99e8f15a),LL(0x466ca745,0x9dba0e94),L_(0x3efbbed0), LL(0x9c629c4a,0x818f1160),LL(0x238404b3,0x1649074d),LL(0x7f378102,0x9026e5ef),L_(0xd9ddeb02),
+ LL(0xcb042e26,0x50f516e2),LL(0x359a1ffe,0xf69c04f0),LL(0xea7c7fb8,0x2be043ec),L_(0xe26d37f4), LL(0x4f292184,0xd8d23c81),LL(0x97f967f3,0xa3d950fe),LL(0xf97e68cf,0x0cf39dbb),L_(0x0f3321ca),
+ LL(0xf1e4bd62,0xd200dfdf),LL(0x890af600,0x9e7aabf2),LL(0x1e4962b1,0xd80a6211),L_(0x78562fa6), LL(0x2ca32240,0xdb5a70a7),LL(0x68abbf8d,0xb27e8e16),LL(0xbffea5c8,0x99114570),L_(0x6e5308c1),
+ LL(0x4fe00738,0xdfd77bdc),LL(0x16448af4,0x0bebe0b7),LL(0xcb49f26a,0x9f4c424c),L_(0x7c95aa03), LL(0x84b25349,0xd5948dce),LL(0x93acdc43,0xa92b381d),LL(0x7efb93e4,0xa8e311a0),L_(0xe08e348f),
+ LL(0x8f67c168,0x96c4f394),LL(0xfa10af74,0x457899a3),LL(0x489d01bc,0x1a4d0c16),L_(0x5457e489), LL(0x5c85d68a,0x1331b4d9),LL(0x84eb66f4,0x97024d48),LL(0x8054cf7a,0xb191cf89),L_(0x3e7eb0cb),
+ LL(0xd307d077,0x8d0cc3ce),LL(0xa6a534ca,0xa8bd8bc1),LL(0xa917d88e,0xc01d22dc),L_(0xba878e3c), LL(0x6dc0cccd,0x927b4947),LL(0xfb3f69e6,0x8cef47b8),LL(0x44185c64,0x586c00a9),L_(0x151ed75b),
+ LL(0x2be07ecc,0x72a46aa9),LL(0x519ea031,0x5b289abe),LL(0x75f6f741,0x1a09f429),L_(0x0df7057c), LL(0xe83d8445,0x0511f341),LL(0xb8c291d5,0xcd82da51),LL(0xbd814e25,0xa548461b),L_(0xdfcbbc5c),
+ LL(0x481967d8,0xf029f707),LL(0x3ec594c8,0x9b2f8b93),LL(0xaacdcc45,0x76cebcbf),L_(0x6e7c6e83), LL(0xaec54ae3,0xa2a8a4fe),LL(0xb47c1c29,0xea7ebbf6),LL(0xebdc1ae0,0xed49a01f),L_(0x63ac12b4),
+ LL(0x532eddda,0xaa4b3b46),LL(0x7e957ed9,0x54c46d48),LL(0xe3393b10,0xde08b775),L_(0x8522afee), LL(0x04a30d0e,0x5f73d8d1),LL(0x39d26476,0xa070b5a5),LL(0x7e58e0f3,0x213036c0),L_(0xa0e99b0f),
+ LL(0x180c99f6,0x8a626b91),LL(0xbe1888a3,0xa37b0a55),LL(0xc627fd2e,0xd55c88b6),L_(0x75c0ce87), LL(0x143ea75e,0x96806d01),LL(0xdce56555,0xb31db013),LL(0xa0f7c5ea,0x286d7145),L_(0xd7ff4a5f),
+ LL(0x7eb22eef,0x9f5793c8),LL(0xf0bdad25,0x3795ea86),LL(0xde77b0de,0x308c67ea),L_(0x506de99f), LL(0xa761521a,0x9d70efe9),LL(0xf8b6908d,0xbeee111a),LL(0xa22f9208,0xabb48b09),L_(0x305250b9),
+ LL(0x54347d1c,0x04d51ba3),LL(0x69790978,0x0cf10a39),LL(0x55c72c45,0x340e8617),L_(0xcd9b6116), LL(0x897f38e5,0x80b0004a),LL(0x8b257151,0xa9ff195d),LL(0xae7d889b,0xd95f9a8b),L_(0xf7035183),
+ LL(0xf9445254,0x96f17da2),LL(0x21e71bcf,0x87497b69),LL(0x1dde1b45,0x3f515a1d),L_(0x1f620fc3), LL(0xbb05c2ca,0xd2651945),LL(0xa7f48789,0x5426bd20),LL(0xa9e9b7f9,0x048d20b9),L_(0x2efd58e7),
+ LL(0xfddc7154,0x095a8f25),LL(0x6fa2edc8,0x675fd35e),LL(0xad7dc081,0xf2b8fbbb),L_(0x88a7b80f), LL(0x6cabea84,0x2ca3a2a5),LL(0x00c09332,0x1047dcd4),LL(0x0d577a61,0x54d150a9),L_(0x1837cf45),
+ LL(0xe243bea6,0xec967631),LL(0x281b5c05,0x7c40da6a),LL(0x580362ba,0x832277a8),L_(0x702cc617), LL(0x1ca409f6,0x7335bdc8),LL(0x26119f95,0x735f11ed),LL(0xa27ab674,0xc7055ffb),L_(0x652580b5),
+ LL(0x3dba43f3,0x8c6adeda),LL(0xebd0f498,0xa42d63e8),LL(0x993107d0,0xb75b4edf),L_(0x0232f8ad), LL(0x720ca302,0xa2592945),LL(0x48d03da4,0x473bf917),LL(0xda871c01,0x8ff4aaa7),L_(0x746e818b),
+},
+/* digit=14 base_pwr=2^98 */
+{
+ LL(0x3e28ba8b,0x23800fab),LL(0x8b12655a,0x99a4d041),LL(0x66a4179d,0x33023ec9),L_(0x1205108d), LL(0xdbb13a66,0xa87c96ac),LL(0x402e3b9a,0x98998891),LL(0xd3dbe7de,0x6b327511),L_(0x5723ac5b),
+ LL(0xa70cb5da,0x7ab235bd),LL(0xbede2315,0xac5f3af5),LL(0x5f9a6aaf,0xe6d56464),L_(0x357d2d21), LL(0x3156d6fe,0x95a60b40),LL(0x49f4f0e2,0x9e63e29f),LL(0xdca3ea62,0x4c739342),L_(0xa16d4457),
+ LL(0xe1948d0e,0xdcc5b89a),LL(0x463327ef,0xd5a2f46b),LL(0xadb9328a,0xbfce0e4d),L_(0x0d62b545), LL(0x1dd89a4b,0x349d4bd5),LL(0xa76133fc,0xc19125f9),LL(0xb4284724,0xf5a817aa),L_(0xf7ca3909),
+ LL(0x7fc121e6,0x0655039e),LL(0xbc44db37,0x42a0f87f),LL(0x3d4e983e,0x67d89bbe),L_(0x85435ace), LL(0x18346e4d,0xbe29cd2e),LL(0xed39f9e8,0xe8b5a373),LL(0x55cac6ca,0x3d4406d2),L_(0xde2aeda4),
+ LL(0x6b7d56c0,0x8fabc04a),LL(0xc39c7ee8,0xbb51ed42),LL(0xc619fe58,0x0816fbf5),L_(0xf268e46c), LL(0xe0f981bd,0x3b1bba1f),LL(0xce226865,0x27136de9),LL(0x4f9ab1d9,0xfcbc42d6),L_(0x13efb949),
+ LL(0x4f54831f,0xf8119c34),LL(0x75d60569,0x24503e1c),LL(0xb3a82995,0x063e48b4),L_(0xc7bc1aec), LL(0xf21ff6a7,0xd626619e),LL(0xa7f182b8,0x5a64395d),LL(0x533f72eb,0x1d2aa02e),L_(0x69953a2d),
+ LL(0x64b57fc3,0x91516c9b),LL(0x0913a322,0xb1936549),LL(0xa0961a2f,0xa7d10cb1),L_(0x06e4869d), LL(0x8f465d18,0xdc8793e6),LL(0x9f17e3a2,0x9a3dd9de),LL(0x06fc6243,0xe925133a),L_(0xb7622bbe),
+ LL(0x784462ed,0x84e7489a),LL(0xc981ba62,0xe5d5e019),LL(0x792db847,0xa77e3ed1),L_(0xf4b6792a), LL(0x36f5a622,0xed208d22),LL(0xfc7dc4a1,0x953f894f),LL(0x87c2b024,0x095b0ea7),L_(0x88016bc4),
+ LL(0x486f7168,0x59119396),LL(0x4b8755e3,0xb37c8ef0),LL(0x19aa2514,0x554f2e58),L_(0x1d544a58), LL(0xaa9858fe,0x1d4dba6e),LL(0xcc8e5a35,0xa400007e),LL(0x4036ed62,0xf70ca123),L_(0x0fd793e9),
+ LL(0x292ba598,0x269da084),LL(0x2503b0ce,0xdd28f9d0),LL(0xb3025472,0xeb061c62),L_(0xfe9ae248), LL(0x79d8d16b,0xd2906b24),LL(0xeaa5d6f9,0xdee30126),LL(0xaf62d50d,0xc2b140a8),L_(0x4dbbcce0),
+ LL(0x57f41736,0xa7cf5774),LL(0x3293ff9c,0x238c8acf),LL(0x1f10127e,0x739c1785),L_(0xc01f9711), LL(0x761037ad,0x68df6a03),LL(0x50fcfcf4,0xc797349c),LL(0x340f3712,0x53cced84),L_(0xba988480),
+ LL(0xc57ef65f,0xed47d3b7),LL(0x6051e486,0x623f7228),LL(0x2e29a4c3,0xfb40723c),L_(0x77353f89), LL(0xda6cb60f,0xf4eea8fd),LL(0x672e091a,0xd086a7ab),LL(0xef34d20e,0x96e8e707),L_(0x2e5db0f7),
+ LL(0xd47d7453,0x089e80e8),LL(0x259bf71c,0x99cb2528),LL(0xcd52c81c,0x9b67f891),L_(0x106aa44c), LL(0xb3fd57c9,0x84cca31f),LL(0x492159ac,0xd208e111),LL(0x99fc08c2,0x9a577c2f),L_(0xde194e1f),
+ LL(0x3ffcd5a2,0x1a869e94),LL(0xac2dd0d1,0x0101716e),LL(0x0d98495e,0x926fca45),L_(0x230d5720), LL(0xd7a376f8,0xda97aa6f),LL(0xe0f36b43,0x043a0c8c),LL(0xbdee74a9,0x9f4f1e97),L_(0x616d2e77),
+ LL(0xc462e14f,0x4ce190f6),LL(0xe408ab06,0x8983aaf7),LL(0xaec26bc8,0xea864657),L_(0xa9c6ad27), LL(0xe823a8e1,0xab862943),LL(0x327c78b5,0x42d64507),LL(0x751ec6f1,0x18bed81e),L_(0x1c240eff),
+ LL(0xc5905237,0x291c3272),LL(0x766b4a0b,0x7507a05b),LL(0x6e56a096,0xafb97a2d),L_(0xe3cbbbe3), LL(0x44beffab,0x2369de34),LL(0x4c78c1e4,0x287f5c70),LL(0x698e8f90,0x14e1a4eb),L_(0xa87a74e8),
+ LL(0x4ca2c62e,0x0fb3705f),LL(0xcbf75eae,0xe59c7ef1),LL(0x58dee01f,0x1a149a9e),L_(0x67ff1a09), LL(0xa2bee6a8,0xf63b9864),LL(0x7e111af7,0x602716b7),LL(0xf6f23814,0xc6967a32),L_(0x682916a3),
+ LL(0x94c36bb8,0x53aa5941),LL(0x7dc26ca6,0x57977663),LL(0x3a7f3859,0x4c6d1720),L_(0x87d2b98e), LL(0xce189ddd,0x379e4e5c),LL(0xc6bec0ca,0xafc9ee7e),LL(0x69db9b01,0x4e3aaa80),L_(0x4f1a3e1f),
+ LL(0x9f2327ea,0x948cf978),LL(0xe1a7d9ed,0x932e601a),LL(0xabd060c2,0xe2c8026f),L_(0xd02845ba), LL(0x4568e0ed,0xd2fcd20c),LL(0x9fc8ca8b,0x224394d0),LL(0x0b403598,0xfa897231),L_(0xd2ef4cab),
+ LL(0x61ffdada,0xc9608223),LL(0xd3a9e728,0xbfde5d50),LL(0x9fcf28b0,0x23db313b),L_(0xe226f1f0), LL(0xc362ae30,0xdd26c697),LL(0xa3a7479f,0xbe0de20e),LL(0x4871cbd5,0xc0ad648f),L_(0x30414c9b),
+ LL(0x93a58cef,0xe22f8df4),LL(0xdef38d08,0x40b0ba7f),LL(0xfacc23b1,0x7b3f5e97),L_(0x00fb9a2e), LL(0x926c141d,0xa6cbdc36),LL(0x87cb811c,0xefb43047),LL(0x6214d9f5,0x06806fd9),L_(0x5ba8f23b),
+ LL(0xc5b2ff25,0x86e33c2c),LL(0x23423298,0xde9bc0ea),LL(0xf6e30434,0xc242970e),L_(0xbf53cf6b), LL(0x3df6ea77,0x84f61ee9),LL(0x8140c42b,0x1d03d30e),LL(0xe917c40a,0x70d1d6e0),L_(0x95de99fd),
+ LL(0xca391889,0x396774da),LL(0xc249bd59,0xc8c93775),LL(0x24f81111,0xfe365e8c),L_(0xdcd6e625), LL(0x680035a8,0xe01d308c),LL(0x65e9e9bf,0xe2741d32),LL(0x5cab99f6,0x441a1645),L_(0xf759c45d),
+ LL(0x858ad4cf,0x1d7326e1),LL(0x52fad307,0x7ee589d6),LL(0x3aa389bc,0x9cfd5023),L_(0x3feb82b3), LL(0x03b8a60e,0x4a98e744),LL(0x22a198b9,0x2c871f83),LL(0x5fd22f5d,0x95dcd425),L_(0xe40ca457),
+ LL(0xb6c77ce3,0x0baec1d0),LL(0x899726d2,0xe604c5b2),LL(0x9503a4a3,0x8faff5a9),L_(0x735bcc96), LL(0x6c5c0a3c,0x294b5dc8),LL(0x27659e3e,0x63327cba),LL(0xb11539c5,0xf82de3fd),L_(0xdafe9d6c),
+ LL(0x2b031402,0xb712f885),LL(0x4ba7d548,0xc6d1f271),LL(0x627d0816,0xebc722ce),L_(0x4e21b679), LL(0x2f1104b0,0x3d488791),LL(0x654d615e,0x7a45f251),LL(0x38e30e5a,0xbe0c2b4a),L_(0xd07392c8),
+ LL(0xc3944e46,0x91582e10),LL(0x245a5f24,0xbf72cd72),LL(0x1d74fe95,0x32fc2d8c),L_(0x8d68efa6), LL(0xc63d3e55,0xb73ed81a),LL(0xd7c363e3,0x81d7988d),LL(0x4b18aee3,0x8563cd35),L_(0xf296ee0a),
+ LL(0xde9cd058,0x6115b5de),LL(0x12e07056,0x494a27b8),LL(0xab33f925,0xdadb7f44),L_(0x9611fc0f), LL(0x7c525248,0x135db673),LL(0x0014d0b2,0x13d5d03c),LL(0x34df44be,0x498b5aab),L_(0x3b9bf0a3),
+ LL(0xb6d60031,0x8b47b859),LL(0x7583945e,0xd5d1a023),LL(0xe1eb9f0d,0xdc6bf5ac),L_(0x7f50540d), LL(0xd48c1aad,0x7dcd0fa2),LL(0xd6e884e8,0x7ff3b8ae),LL(0x0fda3c41,0x42d34849),L_(0x156b5074),
+ LL(0xf41aefe8,0x9db1951d),LL(0x6f1aaef3,0xc78e5a0a),LL(0xe07d36c2,0xaf67c45f),L_(0x598114fb), LL(0x491a5763,0x1883388f),LL(0xb079f72e,0xfa868602),LL(0xee4b11df,0x20bd4ca5),L_(0x9dd3598b),
+ LL(0x4fe58726,0x2f515e06),LL(0x0a130c64,0x03928fde),LL(0x21d929ee,0xed92766f),L_(0x2370b592), LL(0x26410775,0x461ee104),LL(0x11fd327c,0xbf2200cc),LL(0xaac6ed8b,0xaad362f8),L_(0xe2c21338),
+ LL(0xa0369424,0x7702c304),LL(0x90cc96b4,0x88180dc5),LL(0xec9108c9,0xea844162),L_(0x79d4d2e8), LL(0xf7c7120d,0x9b79933f),LL(0x9b1c7dfd,0x73191637),LL(0xf8a798d5,0x4a0a1e22),L_(0x7439503e),
+ LL(0xa7716be7,0x25112356),LL(0x41a91a95,0xf0234300),LL(0x12be9cf2,0xa09c00f4),L_(0x87b213f6), LL(0xb0626c0f,0x3cc23f7c),LL(0xa44cb6f8,0xee84c654),LL(0xda068194,0x999bf774),L_(0xe19968dc),
+ LL(0x20c86fd9,0xa3bbb5a6),LL(0xe07280d1,0xdced85e1),LL(0xf0df9658,0xbd50dd87),L_(0x4715fc8b), LL(0x90915daf,0xf3d02094),LL(0x64a96f25,0x5a8039b5),LL(0x661822c3,0x8b298e54),L_(0xd8ec764d),
+ LL(0x4146852b,0xcef9767a),LL(0x3dfab91a,0x3b280141),LL(0x85522368,0xdbf3bb79),L_(0x79b36fcb), LL(0x730e7127,0x05fa18c1),LL(0xdbafd1f2,0xf1172af0),LL(0xdd549dff,0x83c7657f),L_(0xd82dc78f),
+ LL(0x35ef27c5,0xad652989),LL(0x58b32f27,0xeb421196),LL(0x976af3d3,0x4b505f2e),L_(0x64c1cfc3), LL(0xf3dae0f8,0x59913cfd),LL(0xbab37657,0x2039f0fc),LL(0xf066519c,0x8887e569),L_(0x3d975cff),
+ LL(0xb1eb152a,0x425ddccb),LL(0xd5368e78,0xe11b71d6),LL(0x12b23c3e,0x33076aa1),L_(0x4e626b1c), LL(0x4b18cb13,0x23f1e78c),LL(0xe86079cd,0x875b887a),LL(0x908738ce,0x244ce9b9),L_(0xe51d741d),
+ LL(0xd6758071,0xb2d63b63),LL(0xf0e2cdd8,0x30007109),LL(0x90f8143d,0x75829dd6),L_(0x2d23a43f), LL(0x5e5327c1,0x47ca8667),LL(0xa526104e,0xf04921aa),LL(0x85467645,0xb0f0e275),L_(0xafc61eeb),
+ LL(0x87b4b9ac,0x7ee79f80),LL(0xf367484b,0x27ef21cc),LL(0xbfc8c258,0x7fe068cc),L_(0x7c8262c2), LL(0x572f615c,0xc96069f0),LL(0xd5c6e6e1,0x5f2c8d88),LL(0xd8f70ecc,0x24073300),L_(0xc55f13ed),
+ LL(0x33b47b28,0x82d22a51),LL(0xe38ffddd,0x480198ae),LL(0x03df60cb,0xa964fa9d),L_(0x9bfb3890), LL(0xee5cec96,0x96707a63),LL(0xf9f9338a,0x22ae2467),LL(0x5d9e9ac0,0x0acd29e1),L_(0x854609dd),
+ LL(0xb29eb007,0x84bcad3a),LL(0x9a527f75,0x761f8288),LL(0xc16f294f,0xdaf38a99),L_(0xfdebcc4a), LL(0x9c537eba,0x8a1d04d0),LL(0x760244a9,0x03627bce),LL(0x97af96d2,0x79ecc48b),L_(0xebf508a7),
+ LL(0xa6400e31,0xa9338a43),LL(0x4ccbe898,0x4312a928),LL(0xf79ce659,0xa7f6528b),L_(0x0efdd8f6), LL(0x0c3ef14c,0x7002f54a),LL(0x859eefc9,0xacd6c70b),LL(0x3146204e,0x25b282fd),L_(0x9e570ac1),
+ LL(0x7cfc8794,0x50227a05),LL(0x96cc2182,0x5a9a9895),LL(0xed491384,0xa5e9dc33),L_(0xef480409), LL(0xf767a743,0x48fc5412),LL(0x7b84b8b7,0xb18a17fb),LL(0x22c04cfa,0xa2e99567),L_(0x5b8dc942),
+ LL(0x45e7789f,0xb80a1876),LL(0x7a0670f5,0xaff77eda),LL(0x99c0dcff,0xceba003e),L_(0x737b1478), LL(0x169db41d,0x88ff60f7),LL(0xa8a91790,0xe2c4f8ba),LL(0xd0c75bfd,0x8ebfd0f8),L_(0xaf779b34),
+ LL(0x0401de06,0x62fec3e1),LL(0xd969780a,0x99a90daf),LL(0xafc171d9,0x647f2bf8),L_(0x16ea68f8), LL(0x41dbf4ac,0x83f12d02),LL(0xb63e2588,0xa64d6924),LL(0xb69cbad9,0x08b7948f),L_(0x1a740ee4),
+ LL(0x4eff7cff,0xd3ad093d),LL(0x97774b8e,0x520858a7),LL(0x1438ff5b,0x90acd42f),L_(0x0c55b2c6), LL(0xdb613141,0xf3524dc0),LL(0x1f19f151,0x4d56c7a8),LL(0xc5b4f62c,0xe1899b7c),L_(0x7240d638),
+ LL(0xeb1a717d,0xf9ad69aa),LL(0x9a96c604,0x32f476a8),LL(0xd851c4f0,0x816d9822),L_(0xf895d68e), LL(0x6f708c56,0x914c2f2f),LL(0xdd941975,0x64e1cdce),LL(0x1765af52,0x9bdc107c),L_(0x770ebc8f),
+ LL(0xc745e953,0xe5bd052c),LL(0x70e13a7c,0x1d26e2b6),LL(0x0c4379c6,0x0121f8bc),L_(0x71124e71), LL(0x87d6954b,0xe43a3a54),LL(0xd9134113,0x9bfa2ae6),LL(0xbbbe7daf,0x3a1c2b24),L_(0x3950f72a),
+ LL(0x6a18f59a,0xa71550b0),LL(0xdab1491f,0x73428fb9),LL(0x12caa6e9,0xb08da5e0),L_(0xf505a6eb), LL(0x3f48afb0,0x79842176),LL(0xcf510150,0x2962dfb0),LL(0xafdce054,0x87a8f6f2),L_(0x8158b7f4),
+ LL(0x438e4a3a,0xe2eb279d),LL(0x6af97a49,0x42b5d181),LL(0xd6c5159e,0xcf78aa46),L_(0x572c05de), LL(0x50428178,0x0bf9ef59),LL(0x5b7148bf,0x479ccacb),LL(0xbe4b9632,0x101cdc13),L_(0x7ed1a6b8),
+ LL(0xf0214364,0xb580b66f),LL(0xc6feaf5c,0x4e810e3e),LL(0xa5cb0934,0x02cfec16),L_(0xc2e35b6b), LL(0xddb45407,0x6e09365d),LL(0x5b4d0976,0x76d217cd),LL(0x405714ef,0x892fc650),L_(0x75be4796),
+ LL(0xf30d07fb,0xe024a3b5),LL(0xffdc8787,0xe4416883),LL(0xbb8a1baa,0x16ab4631),L_(0xf8688223), LL(0x2f0f8322,0x09c1692b),LL(0x0dd7a6f9,0x13a2837f),LL(0x3a94d17d,0x784e210d),L_(0x58b82c4e),
+ LL(0x75a9d2ec,0x4df5c032),LL(0xa0b09f2e,0x9989a169),LL(0x8ad59d7f,0x92ef323e),L_(0x9dfd994c), LL(0x641354fe,0x9c294c51),LL(0x0784cc2a,0xa2a1bccd),LL(0xa7c397c2,0x9d3b5c1e),L_(0x5217298a),
+ LL(0x1d43acad,0x5fffdecb),LL(0x15425166,0xd4c107c2),LL(0x3ad2c54b,0x29b56266),L_(0xcbfffc28), LL(0x2c3f6f4b,0xb4051ff3),LL(0xe925b548,0x65af8f85),LL(0xd94421d3,0x61d3c552),L_(0x0c2f7520),
+ LL(0x6d77a3b7,0x70ed4768),LL(0xfa81c450,0x9fe1ff87),LL(0xbb762aa7,0x72d6d774),L_(0x7b08eae2), LL(0x7dbd50f7,0x1432d1e1),LL(0xc28ea0a8,0xd0acc833),LL(0x57bf54b2,0x163d3f1c),L_(0x996fa17f),
+ LL(0x4583d724,0xb5fbaafe),LL(0x53d923d7,0x051dd3b4),LL(0x8aeef402,0xc59594fb),L_(0xd7267ef5), LL(0x5e8a7497,0xede0bede),LL(0xb019e637,0x6171e5a5),LL(0x1be98aa9,0xb69b47a8),L_(0xd848486b),
+ LL(0xddef3d83,0x95f000be),LL(0xc417bef7,0x615e1192),LL(0xef4c07bd,0x74d082e1),L_(0xc8cd53f2), LL(0xc2fe846c,0xfb026020),LL(0xaab1ecd2,0x31978a04),LL(0x47b08bd0,0xf6ef41f3),L_(0x386f4e41),
+ LL(0x0974e562,0x806b3be2),LL(0xd292e87d,0xb4c666b3),LL(0xb31604a0,0x08cba3d2),L_(0x5a2daba1), LL(0xd6e9ea3f,0xff881f9f),LL(0x4da3f147,0xbaac2563),LL(0x8b3ea4f6,0x7f14ef98),L_(0x931e6a5d),
+ LL(0x09ed1548,0xe8b9b58f),LL(0x3a4e460d,0xbdf4bff4),LL(0x410540d4,0xba715bf7),L_(0x9faf6e57), LL(0x58d1763d,0x13d8563b),LL(0x83a48da3,0x3effa46a),LL(0xbc420fce,0x54fecfb6),L_(0x8ea8b02c),
+ LL(0xcc8fc2ff,0x9f084f50),LL(0x15421912,0x4d3ec704),LL(0x69e1810f,0xa93a4b35),L_(0x66d7f71e), LL(0x75523ca2,0x9b5d9b14),LL(0x85c36f3f,0x8615c97c),LL(0xf837f0c4,0x1acc3982),L_(0x4526c2f7),
+ LL(0x61301784,0x91bdbe3d),LL(0x5c462b80,0xe5304d0f),LL(0x16f4a53a,0x2452c556),L_(0xf2ad5a49), LL(0x92965e0e,0x961c76d6),LL(0x92031bde,0x3e75de1d),LL(0x43fc1b46,0xba2806c7),L_(0x7ea59306),
+ LL(0xe2e84c48,0xaf7fedc1),LL(0x44f370ac,0x7473cfd6),LL(0x7fa03a08,0x366491a9),L_(0x65caef0d), LL(0x8b501288,0x3a469595),LL(0x6dc5f00f,0x67981e43),LL(0x87cfba83,0xebb7f488),L_(0x1fc8150f),
+ LL(0x0adc88a9,0x70a3e6c5),LL(0xf79b97ae,0xc2b70fcd),LL(0x0c92525b,0xfd612292),L_(0x1f877d7a), LL(0x2017f6eb,0x2b249ae0),LL(0x78a6422a,0x083dff80),LL(0x0659a5e4,0x12934c87),L_(0x7a1fca11),
+ LL(0x2ef56139,0xe4d85de6),LL(0x0b0acedc,0xf2c33f4b),LL(0x6091bc19,0x04526cb6),L_(0xac1ce3ea), LL(0x24bfc4bb,0xb54024a6),LL(0x57196c24,0x909d86a2),LL(0x42e04322,0x1b1d5d2a),L_(0xbb31992a),
+},
+/* digit=15 base_pwr=2^105 */
+{
+ LL(0xb476bc0f,0x5f4861c3),LL(0x9a1b156b,0xed89263c),LL(0x45b930e9,0xbeb5a955),L_(0x29358e8a), LL(0xaad0495f,0x7923968b),LL(0x127f5983,0x3abc6adf),LL(0xf5aef19c,0x22713358),L_(0x0329be36),
+ LL(0x97c8de6b,0x842632ce),LL(0xd5e766ad,0xfcb4c194),LL(0xbab1e908,0xdb59f894),L_(0xa103e5b9), LL(0xe0644e8b,0xc4c67972),LL(0x2cd3e628,0x340af5c5),LL(0xe2690b88,0x787c5ec2),L_(0x153e0f49),
+ LL(0x7e2abe1e,0x01d9f5c6),LL(0x9acab18d,0x4187566a),LL(0x96fbb4bc,0x43543f3e),L_(0x19e99acc), LL(0x911c12bc,0x4d4f6942),LL(0x2373babd,0x05a419a8),LL(0x0c662933,0xdd524336),L_(0x60570f05),
+ LL(0x5607a4f3,0x98a32e87),LL(0x9cbcb156,0x841d648d),LL(0x00a72b88,0x85f705a8),L_(0xb60a7751), LL(0x30e3dc7e,0x3ef7d9b6),LL(0xc5078f17,0xeec26796),LL(0x20110dec,0xb521d60e),L_(0x324aa16f),
+ LL(0x547a71b7,0x7053cd14),LL(0xc75d38b5,0x3ecd5cad),LL(0xff26fb53,0xfa6fa1ea),L_(0x89904b74), LL(0xba1aaedf,0xb9800605),LL(0x0d1c07cb,0x517f26e6),LL(0x7605e424,0xe982130b),L_(0xc4ed9c66),
+ LL(0x06117460,0xb3f704f4),LL(0x2c1c043d,0xed0726e9),LL(0x3e68dbd8,0xbe354e8d),L_(0xa6382386), LL(0xa4136478,0x26378a40),LL(0x04646666,0xcc8a8909),LL(0x88fbb7ce,0xc603785d),L_(0xb1f815a2),
+ LL(0xee89450b,0x43fe75c8),LL(0x9a29229c,0x16a051c0),LL(0x9b1a9170,0x7d4b9fc3),L_(0x133dd4ca), LL(0x738df325,0x53ac8646),LL(0x6dcfad8d,0x5c600cb6),LL(0xe4115708,0x6ff11203),L_(0xbc9689c3),
+ LL(0xaab0cefc,0xd81789dc),LL(0x7b457d74,0x67ca91b0),LL(0x5a87275f,0x096f997d),L_(0x5d4f53a6), LL(0x3d1c72aa,0xc86a176a),LL(0x0c5247ba,0xbb03ebf7),LL(0xb389c0f5,0x325d67b1),L_(0xdc511ddb),
+ LL(0xe0e68838,0xa0dc02ac),LL(0xca8b2e56,0xcb1f32e9),LL(0x59515fbd,0x152ad207),L_(0xa0ec8c40), LL(0xaf08ac54,0x990ce0e8),LL(0x094829b8,0x62062c81),LL(0xdb93ce78,0x53af9d31),L_(0x980f663f),
+ LL(0xa663c4b2,0x0afcea40),LL(0x1410da31,0xeb72dea5),LL(0xc4dd3dce,0xefc18ea4),L_(0xc844e9d6), LL(0x827776e0,0xb2b1ab80),LL(0x89238185,0xeef3941c),LL(0xc007c089,0xcc238164),L_(0x10df0d3c),
+ LL(0xccb1a15d,0xd9103e73),LL(0xec1702f8,0x34d31501),LL(0x67e64440,0x4b15a941),L_(0xaf4f5d2e), LL(0x8b86c479,0x82fa4170),LL(0xbc874d39,0xb17316c7),LL(0x63f968d3,0x7b71afa1),L_(0xc6c567c6),
+ LL(0x8941fa38,0x1b353d4b),LL(0xfbfeb69e,0x76d964d5),LL(0xaecee209,0xdaae33fb),L_(0xc8d8f5e9), LL(0x47c07e3b,0x4e52dc91),LL(0x87741a88,0x92359ae5),LL(0xa5009004,0x72c650f3),L_(0xc505e3b9),
+ LL(0x660afa5f,0x2c204e5a),LL(0x9f6af3aa,0x70aa9a5d),LL(0x0423f2f9,0xa67cf879),L_(0xe29129c8), LL(0x58a3703e,0x47ebe4a0),LL(0xc220fd1a,0x8f060a95),LL(0xa34e4a66,0x1fd2a0dc),L_(0x7c1fb322),
+ LL(0x1bfb2217,0xcad10b11),LL(0xca3e4b04,0xc1ab5423),LL(0x00ce7df7,0x9c84d269),L_(0xa1f31fb1), LL(0x8a721b19,0x45e72360),LL(0xf80ab752,0xa59a87d1),LL(0x38935f38,0x36966819),L_(0xebd1b2a6),
+ LL(0x657a1f10,0x28dbeb1d),LL(0x4f41e2ad,0xafbe6ad3),LL(0x1c0782c2,0x60b0cb1e),L_(0xb609d7c2), LL(0xae37eb9c,0x403c7b8e),LL(0x3d308948,0x374fa1b2),LL(0xd8503866,0x0326fd01),L_(0xd472fecf),
+ LL(0xa5b224c1,0x98673100),LL(0x35c900a8,0x7e857bdd),LL(0xdb5df675,0x63415d28),L_(0x6b676a73), LL(0x04cd81e5,0x3e21afd0),LL(0xa33929eb,0x2e610def),LL(0x717e43a4,0x6bf414b5),L_(0x9c7a3c47),
+ LL(0xd475f817,0xf9ea4384),LL(0x6b738d34,0x671b40ad),LL(0xac317163,0xd197efee),L_(0x2438948a), LL(0x66a989c1,0xebcc3f73),LL(0x1fc5f207,0x7913fae7),LL(0x9fdbdbb6,0xddc39008),L_(0x663a5b4e),
+ LL(0xe781f5a2,0xa670dec4),LL(0xaeb71ef5,0xb1196ff6),LL(0xa4973f38,0xf981cb1a),L_(0xe1b496e0), LL(0xcfa69883,0x8185f4e4),LL(0xdcd9014d,0xfea1489d),LL(0x01c7c910,0x33bfde50),L_(0x0a1d6d42),
+ LL(0x0b6d7bc6,0x0c74186c),LL(0xf93c6e65,0x21c134ed),LL(0x5c4b9d40,0x9b7f55b4),L_(0x62194b5f), LL(0xf0967474,0x07af0f2c),LL(0xead94ac6,0x43b53483),LL(0xfc351f8f,0x6a02d6dc),L_(0x96c34c95),
+ LL(0x8a77d8e2,0x06eb2a9e),LL(0xb29f094a,0x5a50f6db),LL(0x8cc86e58,0x40844e37),L_(0x2f8aef05), LL(0x3ed6ee27,0x864a532f),LL(0x8ade6f97,0xbafa3f05),LL(0x78f8e230,0xadc126ed),L_(0x8c70fd00),
+ LL(0x61f69a9b,0xecdb5c0e),LL(0x3c35a3f6,0xac81a7f8),LL(0xe0f4235e,0x49ad3737),L_(0x162c0cf0), LL(0x9bbaae92,0x6d262e32),LL(0x3611d970,0x92ea2e05),LL(0x56f9b02c,0x569e559b),L_(0xd700ade3),
+ LL(0x1248f104,0xab2f2393),LL(0xf45846e5,0x2e1305dc),LL(0xaa46d2c4,0x1222d842),L_(0xf5f64176), LL(0xfa36ca68,0x1b067c95),LL(0xb8990097,0xbdbafd4f),LL(0xd2f67212,0xe2b50ce3),L_(0x7ac5ce8c),
+ LL(0x2f610f1e,0x754843cd),LL(0x77e241fc,0xeb4f1114),LL(0xa0d9cbeb,0x55cb5b7b),L_(0x98136c68), LL(0x4f9041bc,0xef262223),LL(0x523e661c,0x38002545),LL(0x30661570,0x3e7c7958),L_(0x5ea1ccfb),
+ LL(0x43726846,0x736e6684),LL(0xa762a548,0x4ea61054),LL(0x4ea95a8f,0xa90f1dd7),L_(0xf1a7ecac), LL(0x052ff525,0xdb175bab),LL(0x176f58b3,0x113349c6),LL(0x66d2f2dd,0xf30e4d83),L_(0x047e3e70),
+ LL(0x3053884b,0x2523bfbe),LL(0xdb1ab97e,0x32d988c1),LL(0xa7f43905,0xed30067f),L_(0xe0063138), LL(0x315aac55,0x0fe3afe0),LL(0xef7cd5f9,0x25c62d9c),LL(0xbceebc63,0x7475ff1c),L_(0x37aef5f2),
+ LL(0xd9f33d01,0x21d9dd88),LL(0xfe303f84,0x0e4f3aea),LL(0x403a10c7,0xdc250e4e),L_(0xcf99ada4), LL(0x20afdb06,0x16293016),LL(0xdf77e00f,0x21ef71a7),LL(0x017aea99,0xb51701db),L_(0xb9a51f04),
+ LL(0xb223220b,0xaefa0a3e),LL(0x3c6160d1,0xd7af87c7),LL(0xb6871dd0,0xcb336211),L_(0x30015933), LL(0x605c6481,0x87d9707a),LL(0x18fd4882,0x367d0209),LL(0xf138a307,0xeeb3123d),L_(0xce3f684e),
+ LL(0x1ad5ce5f,0xdb674dfd),LL(0xd843e892,0xc8958516),LL(0xedfd1c19,0xc7988b87),L_(0x3bdd2895), LL(0x9b80b679,0x09bd2af2),LL(0x294ff4e2,0x3150d204),LL(0x2ad4535f,0x2fc2c26d),L_(0x1ebd13d4),
+ LL(0x0284d812,0x0bdfba7b),LL(0x94e42bd5,0xabd7b483),LL(0x512c1be7,0x10be5ddc),L_(0x6bc6d702), LL(0x0bf271cb,0xd21e8820),LL(0x636561c6,0x0b1793f9),LL(0xe4ef4a35,0xda161673),L_(0x3d69a37a),
+ LL(0xf8513215,0xc206f7b0),LL(0xa0f11bca,0x9944badb),LL(0x23eeb3f7,0xe6050ed7),L_(0x98889901), LL(0x2ce1ebe3,0xc76ba3ec),LL(0x4edc3ee6,0x3e534941),LL(0xaab7f4a9,0xc6e7d7b5),L_(0xf6442856),
+ LL(0x6d4746dd,0x5b3638e6),LL(0xd78b290a,0x6b3e0d8f),LL(0x77aef8ca,0xfac422d4),L_(0x0feb906d), LL(0x3bc30209,0xdc0b9001),LL(0x331327a2,0xe68c779f),LL(0x5d146cb4,0x6fb5da21),L_(0x3f887bb5),
+ LL(0x13fd6d90,0xb80d181c),LL(0x2be6d108,0x288db1c9),LL(0xb342ddca,0x7004d85b),L_(0xbe7db7ec), LL(0x0ba4c981,0xc1d565da),LL(0xb82063a3,0xaf5c7b86),LL(0xaa90bf00,0xbf4ed46e),L_(0x3a15f177),
+ LL(0x7f0b547c,0x49eb74f8),LL(0x146e10ea,0x95205278),LL(0x1256c788,0x346ea27d),L_(0x3f761b6a), LL(0x6a1a4872,0x4ec42ca7),LL(0x150f9515,0xec53ab18),LL(0xda268f4d,0xe31f64a6),L_(0xe4706b89),
+ LL(0x331bfc4e,0x0b4a9c48),LL(0xc8ae2f2d,0xa61d3700),LL(0x58cc7b40,0x3e9cb1a4),L_(0x31facd26), LL(0x10a69f57,0x3b34d496),LL(0xd018498f,0xb4f2bc1e),LL(0xcbad3ed9,0xa8867a65),L_(0x0fb7952a),
+ LL(0x060d829d,0xe832b583),LL(0xa4bc1e98,0x376e4266),LL(0x4ca3a485,0x2da2b54a),L_(0xbbcd02db), LL(0xce23e38a,0xd59bf323),LL(0x02c44a56,0x71d50f01),LL(0x366f36f1,0x0dbb411d),L_(0xf30d32a2),
+ LL(0x000bf15a,0x52b2e706),LL(0x19599554,0x83c05edb),LL(0xe133dbc2,0x659be3d5),L_(0x90ee1c4f), LL(0xe38dcd45,0x70cd081f),LL(0xba72fb3b,0xc7e5be8d),LL(0xff5688ad,0x3ae40925),L_(0xb751810a),
+ LL(0x7b159833,0x071a076f),LL(0x01bb4b01,0x67a90721),LL(0xd05cc7e4,0xc3b59e15),L_(0x14e1dc86), LL(0xbb61bd7a,0x1ee66adf),LL(0x743d3ae3,0xdf5f0047),LL(0x75487d37,0xb272a24e),L_(0x18ad2d25),
+ LL(0xecfd1c78,0x69935fe6),LL(0xefec1497,0x0149938a),LL(0xb3e61f40,0x1edeaf36),L_(0x2b4abccf), LL(0xe6be1d5b,0x6554f5f2),LL(0x0fe91c0b,0x443c9e6c),LL(0x613c238b,0xf8ba68b0),L_(0x0b0ae516),
+ LL(0xed42491a,0xbf0bc611),LL(0x9c608ede,0x7040894e),LL(0xc0f244de,0x0b0057eb),L_(0xd601464b), LL(0xf956aa49,0x825a361b),LL(0x4ff78a4b,0xb7556c66),LL(0x6aed48bf,0x1ae6fb3a),L_(0xba8a9318),
+ LL(0x87f39f99,0x09e379b4),LL(0x9e14e886,0x3fce44cd),LL(0x2fb4d3e3,0x75711ae3),L_(0x036fce90), LL(0x85e9ac2b,0x2542f70e),LL(0xa4a903d2,0x8303b7ee),LL(0x95852fe8,0x637b247b),L_(0x012141cc),
+ LL(0x2165af3e,0x9af74288),LL(0x41ab3d86,0x8945cab0),LL(0x29c26ab0,0xcccef77c),L_(0xea5535b0), LL(0x8648e931,0xc11f99b1),LL(0xb7f340c5,0x7dcfe320),LL(0xfc229594,0x8f5c0876),L_(0xf20b5874),
+ LL(0x48b7cd0a,0xba865a55),LL(0x6fae5df7,0xf611d6ed),LL(0x2fe39b65,0x8329316a),L_(0xc07b24cb), LL(0xdf303162,0xd09a26e9),LL(0x1af7d473,0xb6a75d27),LL(0x375af56e,0x62993ad0),L_(0x957236cb),
+ LL(0xd5155d78,0x3e2c48a3),LL(0x427f5e06,0x0f15720c),LL(0x25837ce2,0xcae65a88),L_(0x966e8b1e), LL(0x78a5dd4d,0x9e77f90a),LL(0x306bd895,0xd3918029),LL(0xd4ed09b8,0xa2585522),L_(0x47a8a9ab),
+ LL(0xd18d6ff6,0x1e6ed174),LL(0x8c957fe6,0xfb94845d),LL(0x54818bf4,0x2495a8a9),L_(0xdd977b92), LL(0x5993b230,0x05a5967d),LL(0x2647b9d2,0x3902c0f8),LL(0x53df8e0c,0x496697af),L_(0x5247a639),
+ LL(0x7b7c8590,0x8424e43f),LL(0x682c252e,0xf452918a),LL(0x0bb6bcff,0x17581f41),L_(0x040d50d1), LL(0x91b07886,0xd070dc3a),LL(0x686cbe64,0x9e8c81ee),LL(0x3485fd98,0xdfd534bf),L_(0xf0aec283),
+ LL(0xc3e77fdc,0x4458831d),LL(0xbfa63a77,0xdcd45b1b),LL(0xe6ad6640,0xeffc865e),L_(0xa2922966), LL(0xf55dbb61,0xae34f5fe),LL(0xec39a211,0xcad5ffd6),LL(0x5d5de65c,0x1ffcbe06),L_(0xae549602),
+ LL(0xc0237c46,0xf7d9eb1a),LL(0x008bf1c7,0x578b9779),LL(0xdce3e9ef,0x7341adb2),L_(0xe6aba225), LL(0xbfdcbb1f,0x52473c28),LL(0x58df1458,0xcea6114e),LL(0xcbca23e4,0x64a68f69),L_(0xdc93a2bf),
+ LL(0x2ad64bbf,0x12f4285d),LL(0x289cd434,0xe31b4490),LL(0x2614d391,0x5132c5c4),L_(0xd24f8d84), LL(0x0a9c7374,0xb496fb6f),LL(0x945d4d6b,0xaa619fb0),LL(0x64d58ea0,0x226ba20e),L_(0x78fadda9),
+ LL(0x328976b5,0x15c734ef),LL(0x71f5ab8b,0x49d5ba93),LL(0xd644b74d,0x8a5a08f7),L_(0x5b9eaf3f), LL(0xcd33e0a1,0x40783f59),LL(0xfc35396c,0x91276e7f),LL(0xdf4e44eb,0x698ace20),L_(0x85de5335),
+ LL(0xbe2724e6,0x4ca6d828),LL(0xc01805fa,0xab7f4b0a),LL(0x9b659d62,0xb0bfec7f),L_(0x21ba53df), LL(0xcb83946a,0x3ca3ffdb),LL(0xaaee16f0,0xe089ddef),LL(0x2829c022,0x8266c12f),L_(0x570a8b63),
+ LL(0x7f62cdfb,0x27c7435e),LL(0xc2862c3c,0x56a78e59),LL(0x577136cc,0xeb454a5e),L_(0x41bf3bc1), LL(0x76737cb9,0xd5ff2a5c),LL(0xce2b3472,0xa9a9af2c),LL(0xabfed878,0xdae3ae7c),L_(0x076254af),
+ LL(0x8125e260,0xfbee92e0),LL(0x288eeccf,0xeb8bf90b),LL(0x9cfb5c57,0x059c298f),L_(0x53598af7), LL(0xc5e99b56,0x888186ae),LL(0x3084705f,0x696f873d),LL(0x86f1d164,0xc59e084e),L_(0xa44fd074),
+ LL(0xeb77883e,0xd2343b34),LL(0xa40a6bf8,0xc2267f63),LL(0x798ceee2,0x27b865e6),L_(0xe4570eb1), LL(0x60596c23,0x8f87d684),LL(0xf0ce5967,0x06984779),LL(0x66b1f5c5,0xcbcc053f),L_(0x2f8869b5),
+ LL(0x7620dc06,0x0d7b69de),LL(0x17f0c4dc,0x9d39bfa6),LL(0xa20e8614,0xabbfb492),L_(0xc7dc6a2c), LL(0xe61a635a,0x2759d405),LL(0xcc56f093,0x966b6ab3),LL(0x049b5aa5,0x4e1f566b),L_(0xbec87c76),
+ LL(0x57acbf9f,0x40e840f5),LL(0x1f1c6ca8,0x0ffd84c8),LL(0x2d21e27b,0x9ca6123e),L_(0x1d5e2c46), LL(0xda38f612,0x5531352e),LL(0x009d49a6,0x3be34fe2),LL(0x43dffb38,0xd020075d),L_(0x2f8a3d38),
+ LL(0x89bc38a6,0x5ded0d34),LL(0xd70c960d,0x82054d24),LL(0x08b78436,0xbcbebb9e),L_(0x662ab949), LL(0xea6945f0,0x1d7a378c),LL(0xcd6abb3b,0x2b017a9f),LL(0x991364b4,0x4dbff4b2),L_(0x6e088465),
+ LL(0xca476359,0xf7fff479),LL(0x8b812163,0xe17baaee),LL(0xad939c3e,0xd700d28b),L_(0xe8837ac3), LL(0xbb3a964c,0x26712ef2),LL(0xd89edbf6,0xe0390b08),LL(0xeaa73bdc,0x536ef396),L_(0x19770554),
+ LL(0xb20e2aec,0x7f3d231f),LL(0xe904178b,0xa6924ffd),LL(0x7ff297bf,0xad6fdd69),L_(0x6deef5b5), LL(0x6c6f7f42,0xda650bfd),LL(0xc9fb4677,0x702cfe74),LL(0xd99a935f,0x93d1a532),L_(0xbfdd1320),
+ LL(0x49e4811b,0x0e07db7d),LL(0xfed77923,0x0dbb53c0),LL(0x0f05670c,0x112a7ade),L_(0x6e79da66), LL(0x3436a7c3,0x201e8aa2),LL(0x567d0dd8,0xd3bae1e2),LL(0x9a0b34dd,0x6a730912),L_(0x5c656713),
+ LL(0x8ee826b6,0x9522c2ac),LL(0x1cf99a2e,0x6bbbf4b2),LL(0xbfb9ae13,0x1fe851c4),L_(0x91215bb4), LL(0x8e9f0b90,0xbf89747c),LL(0x6286cdba,0x0e20c83e),LL(0x792aeb4f,0x25b00fa8),L_(0x61f48d5b),
+ LL(0x5762ff25,0xa1ce4a2b),LL(0xbe45da68,0xe3b7ba58),LL(0x63ee425c,0x98b17978),L_(0xd26e1784), LL(0x8832d22b,0x5fcc8cf0),LL(0xecb80c24,0x54bb743c),LL(0x3e21c95d,0x1df7f32b),L_(0xb9cc6c4a),
+ LL(0xc522b190,0x61766f4c),LL(0xa5778295,0x2fc3322e),LL(0x34307914,0x57f4defb),L_(0x71c105c8), LL(0xe02ecefc,0x2096768e),LL(0xce51bf21,0xad887721),LL(0x3117821e,0xf475048e),L_(0x2b073db2),
+ LL(0xa7c80b61,0x7067894f),LL(0x4426eaf6,0x99c9ba1c),LL(0xd1c53be2,0x68f854e3),L_(0xce0157db), LL(0x5b23fe91,0x5112a49d),LL(0xa0471f83,0x97b550cf),LL(0x87e0a2d1,0x9f64998d),L_(0x344b223b),
+ LL(0xb77380be,0x3ad984a7),LL(0x3bd4bc94,0x216f1748),LL(0xc17ca930,0x4aee7a72),L_(0xfcd30768), LL(0x02746210,0xa1f41f76),LL(0x6fdb5587,0x670f4013),LL(0x3c2763bb,0x0145b604),L_(0x6e18b2a2),
+},
+/* digit=16 base_pwr=2^112 */
+{
+ LL(0xca8e1890,0xa72d343b),LL(0x006aff79,0x07464235),LL(0x1ec739c9,0x136d5ba5),L_(0xce9ce64b), LL(0x721071fb,0xb11ea220),LL(0x7bfe943d,0xfb7789dc),LL(0x57dad905,0xac86bd3f),L_(0x5eeba8a6),
+ LL(0xac243d83,0xb0b49013),LL(0x31f50c04,0x6bbaa790),LL(0xd8fab554,0x1d543cec),L_(0x2fb0a285), LL(0x15602d83,0x3256cf69),LL(0xf3bd35dd,0x4a5d9d40),LL(0x8a264f24,0x7dff3a00),L_(0x24830923),
+ LL(0x4400cf66,0x3267fa61),LL(0x7dfb1e52,0xfe343741),LL(0x34e86055,0x552bcdda),L_(0x131f5b56), LL(0x6065029d,0x40256e8c),LL(0x61212776,0x6fac4167),LL(0x3807bd7c,0xbba74ace),L_(0xa2ce6ab3),
+ LL(0x954e93a7,0xfd51954f),LL(0xd0706483,0xbe73a498),LL(0x89215ea5,0x45e8a87b),L_(0xf3cf4080), LL(0xcdccb303,0x85c8552d),LL(0x09212e02,0xdb8ab951),LL(0x10c2badf,0x19c8db39),L_(0x7b08661c),
+ LL(0xdafc0f6f,0x9e15fa46),LL(0x148c6f0e,0x89a68d97),LL(0xdb00031e,0x4cc0f2bb),L_(0xc3df9d3a), LL(0x340e9460,0x1ff47bb7),LL(0x620b581f,0x7ef8908d),LL(0x57588030,0x4277ac9d),L_(0xfc122be2),
+ LL(0x5631310d,0x1336d2ba),LL(0xcd5bed69,0x039396d8),LL(0xedd85963,0xac1f77dc),L_(0xea62aa43), LL(0x40cf73fd,0xf970f801),LL(0x25fc53f3,0x7927be46),LL(0xf9d1654e,0x9f9753cc),L_(0xb61c3720),
+ LL(0x1f400c41,0x96dca6f7),LL(0x6461f973,0x29585547),LL(0x1f57a9e0,0xb90ca0df),L_(0xb010f7d3), LL(0xd1cf0605,0x21188094),LL(0xf21e0d4d,0xcfd8c7ab),LL(0x5f3468a5,0xde0d0f24),L_(0x4e99f334),
+ LL(0x0e472341,0x70d9012f),LL(0x7c2bf741,0x876213ff),LL(0x47c7e115,0xb309c07a),L_(0x977513df), LL(0x7682fd32,0xbe1ac3e8),LL(0xb7e947d5,0x1c6b708a),LL(0x09c3181e,0x41e0c220),L_(0x8b26dfc1),
+ LL(0x4c02bbfb,0xfa332320),LL(0xbb0f1fc0,0x1dd657b9),LL(0x68034aed,0x784ebda5),L_(0x58fb05ab), LL(0x0677d37f,0x32cca1fc),LL(0x83e2269c,0x2c9407c6),LL(0xea0312b9,0x33fa100f),L_(0x1761c87e),
+ LL(0x40a8cd2a,0xf4f00cb5),LL(0x58c8e52b,0x05e2b3e0),LL(0x99489e99,0x5593b9ee),L_(0x7924f02b), LL(0x464ae656,0x0334e2ed),LL(0x2a2bf206,0x55ec8d2c),LL(0x41ac277d,0xa7b08209),L_(0x0c5c176d),
+ LL(0x3ac595c7,0x1aabcb3f),LL(0x1450434d,0x93706f44),LL(0xcf82a49f,0x0e6c721c),L_(0xec192907), LL(0x92676891,0xfecc2ffd),LL(0x451e72f3,0xc8f49751),LL(0x81bf062a,0xe8852ddc),L_(0xf84db443),
+ LL(0xb1dfeb18,0x32a2e886),LL(0x8b6ac261,0x074b9898),LL(0x3c40d7a6,0x1ea4ca4c),L_(0xf7653f1d), LL(0x6940eab6,0x2b2347ff),LL(0x56338adb,0xca0ffd59),LL(0x314b0e58,0x8e442705),L_(0x79527139),
+ LL(0xbe4dbd9f,0xd63c1700),LL(0x1101a669,0x9b252cda),LL(0xd06390a9,0x501cc189),L_(0x0fb428cd), LL(0x8dcdeb0d,0x0a3108aa),LL(0x47aa9e0e,0x71a44ce5),LL(0x9c9d8b17,0xe86804cc),L_(0x61ad5482),
+ LL(0xfe987606,0x4432954f),LL(0xebe782ea,0x4d668855),LL(0x11e7dc71,0xf9379d6a),L_(0xfb5f9f2d), LL(0xebb7e729,0x98c8071e),LL(0x3aaef819,0x23ed5017),LL(0x3d2ba5a3,0x0cd97039),L_(0x2ceebe22),
+ LL(0xf7bd7afe,0x6646c443),LL(0xc3bd60cf,0x242cedce),LL(0x7c4048fa,0x5e74dbe8),L_(0xd29b1f65), LL(0xc5c513c7,0x91eb1130),LL(0xbb7b08f7,0x9edbdadd),LL(0x3c5f214f,0x6e37d0fb),L_(0x85ea7863),
+ LL(0x46abff2c,0x87af66ad),LL(0x26b2f70c,0x6dfaf224),LL(0x5494f6a8,0xf84408cd),L_(0xa24b6575), LL(0xb3e6fa13,0xfb2baa35),LL(0x7fdee2e4,0x48b82a51),LL(0x82709ae1,0xd231d3ab),L_(0x8897d9e8),
+ LL(0x9b54a957,0x43e3a795),LL(0xc93592ff,0x7df94193),LL(0x9aebe35d,0x3c64092f),L_(0x1d7432bf), LL(0xd212a26f,0x608467be),LL(0x61dd14ba,0x92d589f9),LL(0x1c6431e0,0xb4aaeed1),L_(0x53076cd4),
+ LL(0x20a03c9c,0x064ac09e),LL(0x3e9b39b0,0xe7dae697),LL(0xd8bc5839,0xc348b809),L_(0x8ab0974b), LL(0xcf8f0968,0xf886797d),LL(0x9cb572eb,0xeaa08b56),LL(0x9a9ce85b,0xa4a7eaf7),L_(0x0e1605e0),
+ LL(0x7cf927b4,0xbe868d7f),LL(0xeca36ddb,0xd5b365e4),LL(0x86bfcb64,0x9b8656b8),L_(0x2ab84426), LL(0x82271896,0x01fe86cb),LL(0x15f75f0e,0x672910dd),LL(0x4c2d70f5,0xf239468a),L_(0x365ce9d3),
+ LL(0xfbc74fe2,0xd342696f),LL(0xe0e930b3,0x1de7ca12),LL(0xcb67c28f,0x163565e8),L_(0x312a9e2c), LL(0x197ec1e3,0x54d76d68),LL(0x3b508871,0x11c4ebab),LL(0x71ee55a2,0x4dfa9969),L_(0x0a025c8a),
+ LL(0xe7055396,0xc327e039),LL(0xf0b0b5d0,0x5f514a6a),LL(0xb462d687,0xa70b2c73),L_(0x842f549f), LL(0x161da539,0x864e3870),LL(0x0b583d9c,0xde80546e),LL(0x1693a8f3,0x5135df56),L_(0xadecd5ac),
+ LL(0xc575df9d,0xe8f3d99a),LL(0x04c439d1,0xbba7ca9c),LL(0x79057450,0xed15dbf2),L_(0x557c06cf), LL(0x7e76a8b5,0x09b41a1e),LL(0x0bdc4dcf,0xf356b834),LL(0xf085eab4,0xdab0c931),L_(0xb48d6df1),
+ LL(0x2605d170,0x4a27c44b),LL(0x2e80ab05,0x5425f3dc),LL(0xdd9e1376,0x242b815a),L_(0xa910e496), LL(0x8b98999a,0x3f111c1c),LL(0x0c5343f8,0x29db22da),LL(0x10be67ce,0xf1c6ef62),L_(0x4ae541a2),
+ LL(0xbec6e451,0xc5669a27),LL(0xff0e3e5f,0xabcdf52c),LL(0xe911fae7,0x85cd9be2),L_(0x4150b30c), LL(0x9e505adc,0xab441ae6),LL(0x92888eaf,0x3ad89345),LL(0x0dd62a7e,0x1b7b37eb),L_(0xe9e642a8),
+ LL(0xc78817e4,0x15d73eae),LL(0x70f4b3ee,0x4965b1f3),LL(0x70ff29ef,0xe8787785),L_(0xe5dce106), LL(0x6012d2ef,0x36b7ab1a),LL(0x21a140c0,0x943b6ec7),LL(0xffda816f,0x9bd299e0),L_(0x5968ca97),
+ LL(0x6cb8a41d,0xb0d9d8cc),LL(0x6b2cc953,0xa58bcb0c),LL(0x932fd885,0x8fc62139),L_(0xb782380e), LL(0x5794203a,0x83692f14),LL(0xb2525747,0x8e1b841e),LL(0x2213b2d6,0xc34bb49f),L_(0x0270ba84),
+ LL(0x4fa6af14,0x3b925a7e),LL(0xe649f779,0x23113463),LL(0xa3785af0,0x20ce9dd7),L_(0xdc5dbf9f), LL(0x3c0ce37f,0xa5d677f4),LL(0xcdc8d1f8,0x793a5749),LL(0xd8d3e9cd,0xb698eb06),L_(0x5cbd0981),
+ LL(0xfe510f94,0x1e752015),LL(0xf090a1eb,0x65fa8e80),LL(0xfc5f6857,0x111a1741),L_(0xbaf89d9f), LL(0x4cc335c5,0x1b1a1910),LL(0xbfa9551b,0x24829f96),LL(0x24a70dba,0xc5ef4f06),L_(0x17130b26),
+ LL(0x1febf14a,0xfcb5b042),LL(0x911935f4,0x2a9fcf44),LL(0x53ed6fc0,0x90634826),L_(0x4421e383), LL(0x98983bff,0xc4143e7a),LL(0x12ccf145,0xfc4163c9),LL(0x5bf8b6c9,0x4f765081),L_(0x73883a6d),
+ LL(0xef044be0,0x997c821a),LL(0xe367cf8a,0x3560d6df),LL(0x3d0455b7,0xe8c7bcd6),L_(0x92643ab4), LL(0x26239fb1,0x547dbeb1),LL(0xb5294491,0x2538d97d),LL(0x07450e45,0x472a47f1),L_(0x5e3d3784),
+ LL(0x23d0e3a3,0x6372566a),LL(0x4d62de9c,0x9858907c),LL(0x7a323978,0x78458eba),L_(0x4b2a04ff), LL(0xae2094af,0x6819a84c),LL(0x0eccbf7e,0xe0c337be),LL(0xb93eec58,0x2a02a086),L_(0x03b76658),
+ LL(0xbfc94c0f,0x6aa0f607),LL(0x0cbee27c,0x4123775a),LL(0xae1d1601,0xbbef8dbb),L_(0xe7149786), LL(0xf56932af,0xbe686d03),LL(0x91ce3c48,0x3e33d4ba),LL(0x3d6535b6,0xa72c8f85),L_(0x2c9fb75e),
+ LL(0x4a47050e,0x39dd7c74),LL(0xeebc8c18,0x2f4a6be4),LL(0xa2f0fb3a,0xba0f68a4),L_(0x1c5cad2c), LL(0x85d6ef4d,0x3f59abfa),LL(0x3a302769,0x47cf5f7e),LL(0xed44c056,0xcd7fd1b9),L_(0x2e974b80),
+ LL(0x691eccfe,0xc8f85c87),LL(0xf503e456,0x34a4ce86),LL(0xb53e74a3,0x8eb76194),L_(0xc4c55423), LL(0x22da99fd,0x153fefba),LL(0xdbbf4e12,0x5438e1b0),LL(0x80b3f694,0x65187422),L_(0x9f8c212c),
+ LL(0xab8f55ff,0x0fcf5a38),LL(0x6da81ce6,0x0b057c12),LL(0xdff4777f,0x4a9fa32b),L_(0x602640c6), LL(0x2624de9e,0xa3b241c6),LL(0x2a545f4f,0x0dd2feaa),LL(0x4cf94266,0x8a894ff1),L_(0xb5260296),
+ LL(0x2194d8b6,0x7320211c),LL(0x391c4f62,0xd2de2551),LL(0x6d039386,0xbaa68de6),L_(0xc3a5b977), LL(0xf3b1162b,0xbca0bb5c),LL(0x3643a502,0xd1a3ad93),LL(0xe1f5b66b,0xa430cadc),L_(0xb32e7ba4),
+ LL(0x4c8d2ee8,0xd36efcf0),LL(0xb6b2c682,0xc22137cd),LL(0x1024c516,0x8688f303),L_(0x99e728ff), LL(0x3fb84765,0x777d2fde),LL(0xd972734f,0x9a00c6af),LL(0x25251454,0xf34097fd),L_(0x424404cf),
+ LL(0xdfdcead3,0x3079239d),LL(0xb5ff46f3,0x80c77858),LL(0x36a3735f,0xc9986723),L_(0xd572091f), LL(0x6645ed98,0x0dabffd5),LL(0x0da45042,0x4b0c6093),LL(0xf6ffaf50,0xbffef0a3),L_(0xbc330b9d),
+ LL(0x7d149925,0x3b961737),LL(0x8d236f27,0xc18d27e0),LL(0xa5f014ae,0xee0ae6b2),L_(0xe50d6b9c), LL(0xc1b92639,0x2b5f008e),LL(0x36e3aea7,0x8996a3a6),LL(0x2f8e4e4e,0x5ccc02df),L_(0x9f683f7c),
+ LL(0x3a45a099,0x7caa8790),LL(0x6c2cdda1,0xf82f4e65),LL(0xa9cdf2c5,0xb634f00e),L_(0xd5eec010), LL(0x4012fecf,0xa6a18c31),LL(0xde736bf0,0x153b6c27),LL(0xc1059186,0xb7a29e2b),L_(0x9b23923d),
+ LL(0xc90ac0c7,0x7000c5a2),LL(0xb80400e7,0x2f6fc4cf),LL(0x147ccc10,0x9e3b070e),L_(0xfef094f1), LL(0x0ab36cd7,0xefcc38e0),LL(0xf5b77a62,0xa70d4a46),LL(0x2c523e42,0x02efb3f7),L_(0x210639da),
+ LL(0xda4106f5,0x330449c9),LL(0x7b06f635,0x30d85516),LL(0x9efabcec,0xe879f10c),L_(0x3bd206ba), LL(0x75c081fb,0x0312bdf3),LL(0x88e64b25,0xb372be76),LL(0x3a8f90eb,0x3e832f84),L_(0x14f38ac0),
+ LL(0xc7331aa0,0x4bafc9dc),LL(0xb6461cb6,0xae9ec59c),LL(0x266ba391,0xf40aa6ef),L_(0x4715355a), LL(0x33ae64ed,0x1adab377),LL(0x716f224c,0x04c2b6cd),LL(0x32b71c3a,0x7e89026d),L_(0xccbd7f4e),
+ LL(0x095925d5,0x7de43130),LL(0x0bbfe1df,0xa8605297),LL(0x10701822,0x0bc2e01c),L_(0xf68b86eb), LL(0x816f32a8,0xad3f4af4),LL(0x67e192cc,0xe9dc6c49),LL(0xd5fef609,0x52b649b2),L_(0xf428af30),
+ LL(0x9f45ede9,0xe78176a5),LL(0x0b536242,0x0ba30aad),LL(0xdbdd8b20,0x503b274a),L_(0x51151bfa), LL(0x4d7ac01b,0x393d4fa5),LL(0xdc4e6926,0x8e9d7c61),LL(0xe68387c4,0xaaf0a35e),L_(0x06168aa4),
+ LL(0x35b79ca0,0x2143ebc0),LL(0x4be98451,0x85664008),LL(0x1016322a,0x5db7c140),L_(0x8229e729), LL(0x4e10aefd,0xc19bdf57),LL(0xc8df52e4,0x07fc2589),LL(0x89b605d1,0x2a200cdd),L_(0x0c94090c),
+ LL(0x02211b9e,0x4588f75f),LL(0x0c217b21,0x90c9218a),LL(0x90f7c009,0xef37649d),L_(0xddfaf799), LL(0x35885f85,0x3d0294b0),LL(0x510fffdd,0xe646d7e9),LL(0x4a21ba9d,0x6c9d2cfa),L_(0xa7ada78e),
+ LL(0xcf1bb365,0x1db377d9),LL(0x63e01d3e,0x8b74ddb8),LL(0x8c9ad4b9,0x6bb31b8b),L_(0x2b26fec2), LL(0x858449ed,0xfeaf9d41),LL(0xe2652b65,0x700223fb),LL(0x03b48402,0xee2505a9),L_(0x2438e370),
+ LL(0x9e8ea415,0x900098e5),LL(0xd8a6e8e7,0xe478cc9a),LL(0xd8452a93,0x2e2cd25b),L_(0x569bbc5f), LL(0x5d22bbf4,0x80e8caa9),LL(0x3f76b251,0x10dc6eaf),LL(0xeba89ffb,0x18acb601),L_(0xf763dfc0),
+ LL(0xfed0a316,0x24370f95),LL(0xf5f4a36c,0xc06ba373),LL(0x527f5322,0x43417948),L_(0xe0b12bf9), LL(0xa7bf2afb,0x6aa04127),LL(0xb3183162,0x87eaa68e),LL(0x1070f9c1,0xe002ccee),L_(0x5b0c2b4a),
+ LL(0xc7a653c7,0xfca649b9),LL(0xb223ef3b,0xf66cb526),LL(0x4aa0b0e6,0x10592f0a),L_(0x3d9b366f), LL(0x61473660,0xab61a041),LL(0xaa721fec,0x1b173f43),LL(0x0a96a721,0x06be6fd2),L_(0xb3b3cccc),
+ LL(0x87a37531,0xfda2de36),LL(0xd8576cc3,0x94a1bbc9),LL(0x22b5be7f,0xaad70136),L_(0xc40c9235), LL(0xfb07dd6f,0x9edbb744),LL(0x501faa81,0xccf5dbd3),LL(0x60c831a6,0x6f69ca6e),L_(0x813a83b7),
+ LL(0xa96bdf09,0xdbe3e245),LL(0x4f871623,0xacfa6c70),LL(0xd2c645ee,0x18c48541),L_(0xc037f50e), LL(0xcb36c731,0x08342ef7),LL(0x68cc0cb0,0x4e89abf4),LL(0x0c4fa826,0x186c66ac),L_(0x8f28f4b4),
+ LL(0x2d46a77a,0x837493ce),LL(0xf41079e1,0x15f6dc1a),LL(0x1a861704,0x0e538567),L_(0x03e474ae), LL(0xa4564b51,0xa188c7ea),LL(0x76610ad6,0x3c36716c),LL(0x706eb273,0x8025f126),L_(0xb5435d24),
+ LL(0x28638fa1,0xc4faeda2),LL(0xd9ddd6dd,0xcb83b696),LL(0xe2be7ac0,0x4eea6f06),L_(0x2e6abaae), LL(0xaad7f53d,0x99f8dc45),LL(0xc8502a73,0x8477e1b0),LL(0xa0aa0199,0xcbc5ed2a),L_(0x38689f49),
+ LL(0xd7981750,0xfbd4773e),LL(0xb3548b14,0x01d933bf),LL(0x18cea1f5,0xb3c65f79),L_(0x3bc435fc), LL(0x3414a439,0x0706d138),LL(0xca5b9f90,0xb2166606),LL(0x14b87e77,0x864343f5),L_(0x8a82e1fd),
+ LL(0xa2f61a19,0x18cc1c82),LL(0x0026972b,0x0e88aaf9),LL(0x1da022c6,0x2265f4c6),L_(0xb898d6b7), LL(0xc0e9ecae,0xa53eabdc),LL(0xef23c0bd,0xd1e853a6),LL(0x98e844f5,0x05f9b046),L_(0x7d2e87fd),
+ LL(0xf9a4fe94,0xe7c2033d),LL(0x1c9b4b3f,0x3037306e),LL(0xf61d0ee2,0xdb5834bf),L_(0x28b5943b), LL(0x4c22b3ea,0x5de6ece6),LL(0xf70c350f,0xa4e1deaa),LL(0x1c3bfb3c,0xd4c8be79),L_(0xe75564bc),
+ LL(0x16c64cef,0xab2cc7d7),LL(0xa4b41a9f,0xa5534f63),LL(0x912b7248,0xe6362cfb),L_(0x6a214d2e), LL(0x9c7005e2,0xc25479e5),LL(0xf1652743,0x6a7f2578),LL(0x3bcb10e6,0x9be1e8e0),L_(0xbede8ea6),
+ LL(0x459cf3fc,0x31630308),LL(0x706d16a7,0xf60bf227),LL(0x9f2f55c9,0xed0db8c6),L_(0xaf0d2787), LL(0x6dd2c868,0xb9e7f043),LL(0xce8001ee,0xa2ee914c),LL(0xb8247bef,0x658e5458),L_(0x78f60572),
+ LL(0x6bc3d716,0x5c6843cd),LL(0xacaada1c,0x1bd0e72e),LL(0xcabaa3a2,0x36370b66),L_(0x507a17a3), LL(0xebae3c4d,0x481b026d),LL(0x48821bb8,0x4cd76456),LL(0x5ed8e5b9,0x78f46113),L_(0x6817009d),
+ LL(0x029887e4,0x7560c538),LL(0x75119a00,0x92989cd8),LL(0xe00d03bb,0xef71ab39),L_(0xb863df63), LL(0x5f6dd06c,0xfedea07c),LL(0xddc4f0d5,0xd3b8a96e),LL(0xc43e8f08,0x36d08634),L_(0x9efb1f02),
+ LL(0x3215c001,0xba05b2e5),LL(0x949d9990,0xa3503f0e),LL(0x76e4e629,0x6c281fa8),L_(0xdccad172), LL(0xbcf0bc10,0x6b13eba6),LL(0x70f4d75c,0x1b941283),LL(0xd34756fd,0x70986d34),L_(0x8f71b0bd),
+ LL(0x2576d875,0xe10a7afc),LL(0x0a9b3e69,0x411dab1f),LL(0xf0719c41,0x046cc610),L_(0x9d1611b2), LL(0x1ba334cc,0x6b7a1ff0),LL(0x24d9cfba,0x47e8a2e5),LL(0x5bd30854,0xa740e80a),L_(0x1159e67f),
+},
+/* digit=17 base_pwr=2^119 */
+{
+ LL(0x7c2ca549,0x5898fc38),LL(0xa3566efe,0xa757b52e),LL(0x24bb02bf,0x91ab4316),L_(0x00e46ee0), LL(0x9ec42857,0x8c02881c),LL(0x1d20ad25,0xb9a28540),LL(0xb01ce79f,0x40d6ae86),L_(0x40b2c06e),
+ LL(0x4fd7f402,0x259779c5),LL(0xafc1d993,0x3aa4fd10),LL(0x86dcdc83,0x77170d32),L_(0x8441f4f3), LL(0x9892b126,0x46144a81),LL(0x58df739b,0xc6549963),LL(0x344ddb0c,0x01761502),L_(0xd9bcbeb6),
+ LL(0xaf8e61b1,0x66de5a2d),LL(0xbc92b6dd,0xcb8a0bac),LL(0x1127f258,0x3d18ed03),L_(0x3982ee92), LL(0x8ca9b244,0x0deb6e5b),LL(0xcf198f32,0x7cefc1f3),LL(0xdbaf1a5d,0x373c1801),L_(0xf524b8bb),
+ LL(0x746fcfe2,0x1bb01e23),LL(0xdc5e2b63,0x38352329),LL(0x5df11c5b,0x68e597b5),L_(0x44ec319c), LL(0x84b36d32,0x0e27f5b0),LL(0xe5706d53,0x06c3753d),LL(0xe67b3281,0xa7111b5d),L_(0x8fa5ee02),
+ LL(0x5141455b,0xe429fedc),LL(0x0035c84e,0x353b3d90),LL(0x2ea6f135,0xa3e74746),L_(0xb9e352c0), LL(0xa8f82237,0x220bb555),LL(0xb02520ea,0xecc581df),LL(0xe4b94f8e,0x16dbb87f),L_(0xfbff49d6),
+ LL(0xc2eb5b9f,0xda91cf48),LL(0xdb33cda7,0x821b171b),LL(0x006b3e24,0x489cbfa3),L_(0x4461fe49), LL(0xc4e7389d,0x4d93f4e1),LL(0xfe8e5310,0xf28f63e5),LL(0xf3d0d29d,0x94deaf7c),L_(0x3d33e2ad),
+ LL(0x1e948480,0x453d6838),LL(0x8f1b71e2,0xd842ed96),LL(0x92302500,0xf76bc681),L_(0x17e6ad54), LL(0x5d04302d,0x66dcecf9),LL(0xe97810bb,0x37c278e5),LL(0x13de9f06,0x30c9e7f2),L_(0xf16b622f),
+ LL(0xe415829a,0x436d6b94),LL(0x794d49e6,0x541c7bda),LL(0x702ede17,0x5afaacb1),L_(0x3b5ca68c), LL(0xc9496ea8,0x9ca7b73f),LL(0x50a1e66e,0xc5ce627a),LL(0x762e4f6f,0xc90185b1),L_(0x6705418b),
+ LL(0x52188496,0x52070a5e),LL(0x9065afef,0x510e288b),LL(0xe6df0c7e,0x441709b3),L_(0xa1396423), LL(0xa8018a37,0x66868b26),LL(0x14f84f84,0x28ce78c1),LL(0x1fa90793,0x19c083f9),L_(0xfd8d88ee),
+ LL(0x2458c92b,0x5330a979),LL(0x77ea9ee9,0xdba786fa),LL(0xce00962f,0xae5f476a),L_(0x05915824), LL(0x1219b9cd,0x8cdf0300),LL(0x660a19e4,0xdc707120),LL(0xc70e0b11,0xfdd0563d),L_(0x41d445a6),
+ LL(0x6102cfd1,0x53d54a0a),LL(0xa5729cf8,0x4fc590fa),LL(0xea907455,0xea0c5a91),L_(0x59a871ce), LL(0xb4020096,0xe025ffb0),LL(0x7e7fb9d6,0x140025ac),LL(0xb7954f0e,0x46ca7ee6),L_(0x010dbf77),
+ LL(0x6a28fa6b,0x2d7e46eb),LL(0x034b69ed,0x1ae23996),LL(0x51bc6b67,0x3c25755a),L_(0xe9bf6717), LL(0x579d75fc,0x06b03b1f),LL(0xfc3e6ce3,0xe0b2026f),LL(0x723756d9,0x58938357),L_(0xb4731ae9),
+ LL(0x5cbab1e2,0x42ddfb70),LL(0x33bbd9fd,0x6d346512),LL(0xeb7aa22f,0x725fdf2d),L_(0x88eb52e0), LL(0x48e63519,0xf1fc169f),LL(0x297a7972,0x91aa8dc7),LL(0xb92c9671,0x9c2b4849),L_(0xa557aadd),
+ LL(0x4fe2181c,0x58182a19),LL(0x27b6bd7a,0x0c4b58a3),LL(0x1c72e55a,0xd4f2f098),L_(0x6b53e542), LL(0x0bdee531,0xb5e11022),LL(0xa8f7b191,0xa8bb8315),LL(0xe62460d4,0xbdf84150),L_(0x74ea071f),
+ LL(0x1ca83a09,0xe03c9ae4),LL(0x54fef132,0x7e2ef688),LL(0xa900e0bd,0x1a602274),L_(0x3698f6bb), LL(0xc6654794,0x57e365a9),LL(0xbb500025,0x2b39b18b),LL(0xf16e71f6,0xa0dfe4bb),L_(0x9d6899d1),
+ LL(0x1d2f288c,0x8e577078),LL(0x8e833532,0x8ebb1ef6),LL(0xfb9fbcd0,0xf5ead3c9),L_(0xe31f0c20), LL(0xf16fa294,0xc462ce8b),LL(0x6466c045,0xc1068645),LL(0x85e7447b,0x3e1abc03),L_(0xbba798a0),
+ LL(0x41e55979,0x122d19ea),LL(0x158f4312,0xfd5b3495),LL(0x297c5747,0xa7b750fd),L_(0x735aa3f7), LL(0xd2156123,0x312d6128),LL(0x31e8bfa3,0x4456ccf3),LL(0xcc9cdadc,0x5094cff5),L_(0x9ea9beca),
+ LL(0x1ea96169,0x616ee979),LL(0x78257a1a,0x60b3f06d),LL(0xec98f98d,0x609d2d2d),L_(0xd1b3e514), LL(0x1100f9ce,0x2e59e232),LL(0x8087f780,0x34e1a9a4),LL(0x0b40b853,0x95c2865d),L_(0x8fa97627),
+ LL(0x297f6423,0x1eac58fa),LL(0x7eb748d9,0x6fa36840),LL(0x0d0b673e,0x955ae146),L_(0x72be4e8e), LL(0xb20412e2,0x22b08d06),LL(0xa4616bf8,0x57a2dcba),LL(0xc55b68a6,0x42138fbd),L_(0x8fa529ef),
+ LL(0xdb26dfa2,0xf1766b07),LL(0xdfd72d39,0x050e85e5),LL(0xad6b741f,0x59466485),L_(0x5fceaf74), LL(0xbc9edaeb,0x0c6b2254),LL(0x453c9eae,0xfca1477c),LL(0x9c00d050,0xa3817166),L_(0xa87cf553),
+ LL(0xdbbc12a2,0xad146ff5),LL(0x39990110,0x33dcec4a),LL(0x3d48a808,0xfe9fea01),L_(0x8c4aac12), LL(0x2cefb34a,0x0ad5c79b),LL(0x0a9a20f7,0xaca81076),LL(0x942b38be,0x9475c474),L_(0x218031b5),
+ LL(0xc173f9cf,0x4c0dcf94),LL(0xcc4c491e,0x61d12afb),LL(0xfa790f55,0x12a6c289),L_(0x37abf7be), LL(0xd04d2ae3,0xcb586fd2),LL(0x192166df,0x3c04c5b4),LL(0x7ee1f233,0xbba9c768),L_(0xb69b46cc),
+ LL(0x7c1e6077,0x1443ddcc),LL(0x6345a210,0x70d81228),LL(0x5f035127,0xc8273e38),L_(0xdafd6230), LL(0xcf227ac1,0x4e794379),LL(0xb3e2d215,0x916e6825),LL(0x138aca38,0x4afb3539),L_(0x4ce64d55),
+ LL(0x463d181b,0x6b581764),LL(0xc440084f,0xa9bac44f),LL(0x088767cd,0xf0d004bb),L_(0x94e1ba30), LL(0x55abae1e,0xa1a18412),LL(0xa732c539,0x6d71f955),LL(0x896710ea,0x3608f75d),L_(0xa067bb07),
+ LL(0xbc080af4,0x9891098f),LL(0x65c3a1bc,0x00befda2),LL(0x3321e866,0xb04ac43d),L_(0x438e5b9d), LL(0x5fd8c4d4,0xe260d024),LL(0xc4dcba5f,0x19886f71),LL(0x5e5f5f4c,0x37b1a0c5),L_(0xd3c102f6),
+ LL(0x58ee2dea,0x4e2d8d4c),LL(0xe6546299,0x8042631e),LL(0x262d0cb2,0x2df96d37),L_(0x349292cc), LL(0x04a3c0d5,0x2fddedd3),LL(0x452a0a52,0xd5418050),LL(0x2293a069,0xc6053861),L_(0xfe3040eb),
+ LL(0x3a50a7c9,0x02a166d5),LL(0x861af22b,0x8a435126),LL(0x449c202c,0xb053bb62),L_(0xbb664aff), LL(0x9083b8c2,0xd6f78a70),LL(0x14a57ed2,0x8e5943f4),LL(0x6c5eedb1,0x591d0e00),L_(0x0f079d9e),
+ LL(0x2036fb32,0x4ee2bac6),LL(0xc62978b5,0xce8c9892),LL(0x0ee684b9,0x56d30723),L_(0xb8993d5e), LL(0x2fee5c92,0xfc172755),LL(0xc8622a7c,0x43c48f91),LL(0x4279a0bd,0x78cfee0e),L_(0x3826553c),
+ LL(0x4315c335,0x9060272c),LL(0xe29ecb65,0x5d0bbf12),LL(0xdd976fea,0x53d3e99f),L_(0x278ebed1), LL(0x7fc69ec0,0x7a33fe7e),LL(0x13d33afb,0x9b8a7301),LL(0x19d16dca,0xe09a47ad),L_(0x6e0ed440),
+ LL(0xd0327c5a,0xb55799e4),LL(0xf145e8f9,0x7408bf29),LL(0x97e6d3d7,0x4580043d),L_(0x5f599a51), LL(0x517f2eda,0x38414d94),LL(0xe09d35b1,0x37f611a1),LL(0x31551461,0xce073290),L_(0x1044bab9),
+ LL(0x24eb973b,0x045e586d),LL(0x4d8f2d61,0xa3318071),LL(0x1d2b5b32,0xb68b7f81),L_(0x10bccde6), LL(0xcd3e0e0e,0x0578898c),LL(0x1e460079,0x927cc37b),LL(0x31bad31c,0x3d22477a),L_(0x8c371b62),
+ LL(0xa374b8d9,0xbc19767b),LL(0x3ed7db29,0xa97161c1),LL(0xcc843c60,0x45c30a38),L_(0x508e3e86), LL(0x433b6dbe,0x1457fcb6),LL(0xd8c78825,0xed4ed464),LL(0xc3997703,0x2b88e6d2),L_(0xa1f2140c),
+ LL(0x953f63bf,0x2a452961),LL(0x62444dca,0x6a62e296),LL(0x2d1e976e,0x1d95f51c),L_(0x2bbeb1e0), LL(0x62f53f4b,0x052daa65),LL(0x827170a2,0x5cb51b06),LL(0xc319b1bb,0x3a8ec55d),L_(0xda0c72a5),
+ LL(0x71e73523,0x898419da),LL(0x35d9c257,0x49a774fb),LL(0x55758231,0x4e49ddae),L_(0xd5c3703e), LL(0x4d4edb63,0x28d3f23e),LL(0xa38dc679,0x41807b47),LL(0x749ea0b8,0x15724faa),L_(0x68bb7f4b),
+ LL(0x5af98b88,0x0f227def),LL(0x24af0afb,0x27396d04),LL(0x1cd97cef,0xa2ad5165),L_(0x678f117f), LL(0xce22032e,0x03432db3),LL(0x5cb93ad2,0x92eb23b1),LL(0xcc96e20a,0x47d3d48c),L_(0x5f1e84c2),
+ LL(0x163136e0,0xc4293aee),LL(0x7f0db6e5,0xca0a189e),LL(0x9069c8c2,0xa088318f),L_(0xf4210d55), LL(0xb0d80206,0x13bd2b27),LL(0x34f3150f,0xcd0efd69),LL(0xe152eb4e,0x0fcf1527),L_(0x32e6885b),
+ LL(0xcb923f09,0xed8906b9),LL(0x7eba0ca2,0x95cab4ce),LL(0xc91dbf27,0xcf44aa02),L_(0xf0948c8c), LL(0x1a9b31dd,0xbe7b7487),LL(0x88539394,0xc84b72c8),LL(0x938fd6cd,0x15b31f6a),L_(0x1a1c6b6b),
+ LL(0xce67988c,0xc2869ed0),LL(0x61ab3c9f,0x882c2379),LL(0x3bb8c353,0xb69781cd),L_(0x95d9d719), LL(0xedcef064,0x3de229ea),LL(0xc3895533,0x84ff6e10),LL(0xb6955022,0x5ac0d29e),L_(0x6e2ba9f7),
+ LL(0x3cc87419,0xfe2a24c3),LL(0xe3406a2f,0x3d474db8),LL(0x67beb236,0xf6867bb0),L_(0x5b2cd123), LL(0x74e31d6b,0x2ff473bf),LL(0xed6d88b5,0xeadd2ad4),LL(0x046a1f51,0x9b3025d4),L_(0xf4a61d8b),
+ LL(0x40eaccf0,0x99e19903),LL(0x7e9f5e57,0x1b67fa53),LL(0x00b84a60,0xbabc0faa),L_(0x6de1d67d), LL(0x06fe7a95,0x04041366),LL(0x06672f11,0x5f522ae3),LL(0x0dd51cb4,0xd4012aa6),L_(0xd5ce357e),
+ LL(0xfbc38722,0x538e45da),LL(0x5f595162,0xf57a7cab),LL(0xe917805d,0x56a8bf52),L_(0xf639993d), LL(0x31ba0865,0xe876b4e9),LL(0x3eaf3c58,0xb08987af),LL(0x0ef4538a,0xbd9e742b),L_(0x95404cfd),
+ LL(0x9eb63b57,0x1453ad21),LL(0xf6e400ed,0x627008e7),LL(0xa4ababfc,0xd78f1c8d),L_(0x4ebc5852), LL(0xcc21b23c,0x4e1ef090),LL(0x7415270e,0xb8b3701a),LL(0x921cd6ee,0x472b1f2f),L_(0x765126f0),
+ LL(0x59e9fe85,0xade7ead3),LL(0x1b413797,0xb8da2677),LL(0xeabbca1c,0xdb705e2f),L_(0xa1e12595), LL(0x65e95e7d,0xd1990099),LL(0x79fa6f2e,0x2b7f7bbd),LL(0x4d4d9e0a,0xbde588b7),L_(0xc0ac97e6),
+ LL(0x20ff9acf,0x23cf39f7),LL(0xca0fac28,0x1f72fbb4),LL(0x4b179b83,0xb04c01ae),L_(0xfaca0fdf), LL(0x7173749c,0x7b3cc769),LL(0x3d2bf7fd,0x0cbf34b6),LL(0xf3f2fea4,0x6369c1d9),L_(0x866e7f8e),
+ LL(0xb873e85f,0x6eb23ad8),LL(0x8b9475ca,0x2855072f),LL(0x22d9fd01,0x4e9a3adc),L_(0x813270cc), LL(0xfbf27bf5,0x292b8bdc),LL(0x3db7f857,0xe9f00375),LL(0xf6ba5b62,0x1b8a570a),L_(0xe20966e7),
+ LL(0x05a5a71b,0x19b8e7ac),LL(0xe13277a1,0x9a4abf1f),LL(0x6d26fe41,0x8f8b7d68),L_(0x0ce42976), LL(0xaa0c781d,0x48e32e14),LL(0x0ee98d37,0x13c9b527),LL(0x3bb6c2c9,0x4db74aeb),L_(0x208cd0d9),
+ LL(0xc2685698,0x47ef78f2),LL(0x6c1b0959,0x9bb6bd13),LL(0x2ccd97f7,0xa303c278),L_(0xf9abf5b1), LL(0xafdb9d40,0x0276fd8a),LL(0x2be1d396,0xdb26cd04),LL(0x726beb4a,0xe09517f7),L_(0x4e0b499e),
+ LL(0x6f715206,0x5979197a),LL(0x82ffa270,0xb44c8267),LL(0x52cb678a,0x260e7e25),L_(0xc541f700), LL(0x18439449,0x33983071),LL(0xb1d2f59c,0x19d945b4),LL(0x11eef46b,0xf2b04fe3),L_(0x9fba737f),
+ LL(0x214431d6,0xbcadb425),LL(0x4d1d9a21,0x941b766d),LL(0xe2a1f314,0x2170c6a6),L_(0xc15b9466), LL(0x6c1b9a4b,0xd605b2bc),LL(0x1578a3c5,0x65c9904b),LL(0x96b6befc,0xbe0b58ef),L_(0xc4f7e33c),
+ LL(0x5a93994e,0x3fcf43e1),LL(0xb19e11a6,0xf5f793fc),LL(0x5ad2ed77,0x6ff2a142),L_(0xe587c79f), LL(0x23c53b77,0xb2ee2d92),LL(0xa6fa95d1,0x023b2c75),LL(0xac5ec115,0x67b40c94),L_(0x41c55249),
+ LL(0x05d09dcb,0x6b551c3c),LL(0xc6c2dc20,0x2e81c56f),LL(0x1b5233cb,0x0e6faafe),L_(0x4565862d), LL(0x43368b7b,0x08edb0b1),LL(0xb2d31417,0x29c77be9),LL(0xa0fa599c,0x77052491),L_(0xb2ac3ec1),
+ LL(0x3a2c0bb0,0x0302d5f3),LL(0x04cf0b83,0xfda301ea),LL(0xbd701c39,0xfb565431),L_(0x5eee993f), LL(0x2230bcaa,0xb5c3681a),LL(0x5d285d50,0xa9dd4df3),LL(0x8618542b,0x8c1d7c52),L_(0xd80996cc),
+ LL(0x85ebe7cd,0xf0fe462f),LL(0x12c3c8ab,0x752eb1b0),LL(0xb6349271,0x2f148e5a),L_(0xc0513e4e), LL(0xdaa709f7,0xd043e9e0),LL(0x340f7e04,0x7842c3a1),LL(0xb4acedf4,0x5d6d0c14),L_(0xfa56de6f),
+ LL(0x807fa877,0x435b6be9),LL(0xdb7a9959,0x65c2c690),LL(0x24fae090,0x3cd0982b),L_(0xcc274d62), LL(0x721b08d7,0x02f3dea6),LL(0x2a9bf937,0x052c0001),LL(0xadae4c04,0x61de7f6d),L_(0xba3c48a3),
+ LL(0xdfe50f8c,0x2faaf032),LL(0x7e8bb31a,0x51dbadf4),LL(0xd937aa83,0x072c01c9),L_(0xbfe57ab1), LL(0x5d66c435,0x87c5d208),LL(0x4ce95747,0xfb211069),LL(0x7ee66e9b,0xf01cc54c),L_(0x48478c99),
+ LL(0xb35f128c,0x957c7ee6),LL(0x50dc83b5,0xf963430c),LL(0xf0f63a80,0xb4578760),L_(0x842ee70e), LL(0x57d57cbd,0xc891093b),LL(0x24bc2867,0xa548c5ff),LL(0x0f85fa2f,0x47bb6a4a),L_(0x18cd7a2e),
+ LL(0x813aaaa5,0x40773919),LL(0x798cdd8c,0xb6d9db4e),LL(0x68858372,0xd2c5ede9),L_(0xb240c94c), LL(0x79a51f60,0x62fa25b7),LL(0x89e94f52,0xac054f6f),LL(0x0332347b,0xf207ad5e),L_(0x9e15c0d4),
+ LL(0x19041ef2,0x6d748e07),LL(0x298a62fb,0x3b9bdf40),LL(0x8f7fb37f,0x35f944a9),L_(0x92926ab1), LL(0x51a4355a,0xdc488cfe),LL(0x3f355ad1,0x814db3fc),LL(0x84b0d885,0x29d8cb57),L_(0x98d39682),
+ LL(0xfe4b50e2,0x07c8c799),LL(0x4957a527,0x3418ab11),LL(0xec94fd37,0x601424db),L_(0xf147c20f), LL(0x420c1861,0x1adc80ee),LL(0x7d9440bd,0x09ee96a9),LL(0xee7355ab,0xd1adde68),L_(0xba4d5d2f),
+ LL(0x14379251,0x4dc18b12),LL(0xebadf0ef,0xfee19a43),LL(0xbc8d4cc9,0x8da37771),L_(0xd555d58a), LL(0xd71b4107,0x42fdc281),LL(0x2e05719e,0xac68f304),LL(0xdc3ed2bf,0x4c1b070d),L_(0x03356492),
+ LL(0x0c94988c,0x8da99bff),LL(0xa1e580f6,0xe79a8b42),LL(0xcf6d6c6e,0xfdabb4f2),L_(0x80f7da41), LL(0x1a4121f1,0x6a7dfe84),LL(0x36467882,0x6b06eea9),LL(0x30e07e6a,0x943abc5d),L_(0x8ae444d2),
+ LL(0x2f87568d,0x2441fb99),LL(0x0599179e,0xe8a9e90a),LL(0x54669582,0x47767b19),L_(0x6fa66e89), LL(0x19290f64,0x4596bd1b),LL(0x93f0e068,0x9dab54b3),LL(0xe4e3af20,0xff7a84e2),L_(0x951ce962),
+ LL(0x0b49df59,0x466ca295),LL(0x16afa866,0xc6b06127),LL(0x1f38aad5,0xf4e1677b),L_(0x672e7252), LL(0x29732848,0x3a4e5076),LL(0xfcdff811,0xcc6ceb5b),LL(0xfe6adcac,0x8a4243ce),L_(0xb04666fc),
+ LL(0xe74fffdd,0xc1e32f38),LL(0xd93030cb,0xf9561e97),LL(0x15f3f603,0x39bbca36),L_(0x90c8c914), LL(0x3734c1a1,0xa53fc681),LL(0xb0c4475f,0x158ec0bb),LL(0xed39d189,0xa57cf95c),L_(0xd562a81e),
+},
+/* digit=18 base_pwr=2^126 */
+{
+ LL(0x5cfdbf76,0x02c6b679),LL(0xace24453,0x8195dc3a),LL(0xa58b929b,0xbe2f8e64),L_(0x9a3a7efb), LL(0x9f7af479,0x7fa4b042),LL(0x8ad04303,0xb747bbcf),LL(0x426eb7ce,0xa67998c5),L_(0xdb040e40),
+ LL(0x7d551504,0x3bfd76b2),LL(0x0361658a,0xa3a2cf8c),LL(0xa3b9f1bd,0x66db4cfa),L_(0x4799c86b), LL(0x27afe24e,0x01c04fa0),LL(0x0689618b,0xaa0383bc),LL(0x5b052124,0x524802bb),L_(0x25748110),
+ LL(0xfd9c3522,0xb542168a),LL(0xf1dd3dc0,0x435f3e05),LL(0x3556cca8,0xf3b21a79),L_(0x0d1838e7), LL(0x0a1d87d1,0xbbfa360f),LL(0x43bd0f7a,0xdcacc277),LL(0xfdb15d31,0xa293f5a9),L_(0xf9285692),
+ LL(0x960b1fe7,0x7da35372),LL(0xefe3b9e7,0xb15275ca),LL(0x08b0fe30,0x9c0da2e3),L_(0xcef9bd5d), LL(0xfc9156e7,0x087c3eea),LL(0x4386ea9f,0x13e94876),LL(0x5543dce0,0x057ad0af),L_(0xc5162840),
+ LL(0xf9c98a4a,0xfeb313d1),LL(0x398fba1b,0x0e02712b),LL(0x52f53c92,0x98909181),L_(0xfa320278), LL(0xebd66101,0x906d44a0),LL(0x427688fa,0xc8c39420),LL(0x1c7282db,0x3901fb30),L_(0xaea2389a),
+ LL(0x6775078d,0x1424671a),LL(0xd8f3ae0f,0x4ebcdd7f),LL(0x80279f72,0xd5a77238),L_(0x602ce4df), LL(0xc083918a,0x12e9402d),LL(0xdd095d1b,0x02858419),LL(0x6cb15ad2,0x0927adfc),L_(0xa38c1285),
+ LL(0xfc6fbaf6,0xec392752),LL(0x1ec20f01,0xeed1ebd2),LL(0x5cac318e,0x47520f8c),L_(0x407d9032), LL(0x8ec0f4fd,0xe2f3dac1),LL(0x43dd79ec,0x35a74b40),LL(0x9236a81d,0x6bccf29e),L_(0x00ac0a42),
+ LL(0xc4755991,0x163c66e0),LL(0x849061a0,0xdd950bf5),LL(0x70208a9e,0x7bf95257),L_(0x07a10de2), LL(0xb0813c25,0x45c2891a),LL(0x15468f60,0x450f087f),LL(0x73d5ebe9,0x387e234b),L_(0xa32ac9f8),
+ LL(0xe8ff8e91,0x962ab070),LL(0x570fcd62,0xd3ce94dc),LL(0xb1757c3e,0x1ad55d1b),L_(0x7fa592e8), LL(0xa8ad3f09,0x76fcda7d),LL(0x73d3b392,0x348ab2da),LL(0xd6cf8e99,0xca16fca1),L_(0xac456eec),
+ LL(0xc7486909,0x5f929900),LL(0x240b92b4,0x27ccfc23),LL(0x0f7d51a1,0x632731fb),L_(0xf12e9902), LL(0x735b1778,0x47671b3c),LL(0x985803eb,0xec4d7c8a),LL(0x63e1c219,0x608cf2d5),L_(0x109df03c),
+ LL(0x09438c99,0xb25c71f5),LL(0x0829cedc,0xbe60921f),LL(0x483d485d,0x15305f6f),L_(0x60591120), LL(0xba32c7ab,0xbcdea716),LL(0xbeeee884,0x2b65df3c),LL(0x88e6ef43,0xc3d80182),L_(0x4b2dd1d3),
+ LL(0x1bdc3884,0x482c3679),LL(0x6b421466,0x6f172c00),LL(0xa58b570f,0x2587649f),L_(0x3e4ee4bd), LL(0xef99f5b4,0xf5a1388a),LL(0x98494de5,0x5a8f54da),LL(0x8f25a37c,0x50e9cc72),L_(0x1ce8e0f0),
+ LL(0x72cca43e,0x119587d3),LL(0x8e668562,0xa3b06524),LL(0x0554888c,0xd291f0fd),L_(0xae58bc85), LL(0xd1139d9b,0x48a506c1),LL(0x034f448b,0x04ec28f0),LL(0x94dd32bc,0x2bd2abc9),L_(0xb9e588a6),
+ LL(0x4988c3b7,0xe1e13901),LL(0x24b16627,0x4231b66d),LL(0x4f52ca62,0x749a749b),L_(0x8bb11e14), LL(0x03150154,0x3dfafe07),LL(0x71bdac04,0x73419c6b),LL(0x40bd5232,0x1587ab8c),L_(0x7d2d4a5e),
+ LL(0xf231ad9a,0xe7ffdae6),LL(0x0f11fde4,0xa13a1e41),LL(0xc78059f3,0xf4713c18),L_(0x2d2f0ff7), LL(0xfde9d338,0x5fe86c6a),LL(0xa381beae,0x9d423777),LL(0x734b9092,0x77f56796),L_(0x82131b3f),
+ LL(0x3a2c7153,0x612650a1),LL(0xc29b399c,0x72e7ea2b),LL(0xd673cbc5,0x60425f21),L_(0xece9a8ea), LL(0xfd08bc21,0x394b09dd),LL(0x1b69fef5,0x58e594d5),LL(0x141fc2ff,0xeab0baec),L_(0x85999248),
+ LL(0x5c8c18cf,0xf4b4d1ab),LL(0xe1f44cb9,0xdca5073e),LL(0xd86fbb1f,0x32861f51),L_(0x242811d3), LL(0x038cf05a,0x20b39e70),LL(0xc64c1332,0xd6198042),LL(0xeb68ae09,0x93c66ba1),L_(0x7aee0eb8),
+ LL(0xc4c03565,0xf47a18f7),LL(0x992398ea,0x808ebaad),LL(0x7414fdc9,0x325c8a8e),L_(0x42a7e664), LL(0x0900ad27,0x9f053caf),LL(0xc8869d15,0x2b52f07a),LL(0x1878089f,0x11f347a4),L_(0x19ee0c05),
+ LL(0xf8345a24,0x3e51ac6c),LL(0xb254a9d3,0x57f4ec7a),LL(0xe2b48c1d,0x916d1214),L_(0x3732c0ab), LL(0x5045ad37,0x0cb5ec90),LL(0x010093ba,0x1eea394a),LL(0x4a4cfff6,0x4aaf2a44),L_(0x7feda10c),
+ LL(0x370622e3,0x58625a1a),LL(0xea895fc8,0xe2d5d70a),LL(0xcac0e4d3,0x53bc48b9),L_(0x1d43df08), LL(0x681301c8,0xee75a210),LL(0xe1a8bb95,0x097c56b0),LL(0x7e7b6ce5,0x4a384a6d),L_(0x26d0db83),
+ LL(0x3ebba7eb,0x2bb95cad),LL(0x9e42faba,0x5398a161),LL(0x0f33c612,0xf67c4703),L_(0x6ef93df3), LL(0xbb0fa5e1,0x8ad685b2),LL(0x8655685c,0xb1c226c7),LL(0xdd2eb2bd,0x5e194627),L_(0x523e0fd5),
+ LL(0x3d42f37f,0x301fcb42),LL(0x80fb78c3,0x647b20c7),LL(0xfaa1d374,0x3d0a850d),L_(0x051bb6db), LL(0xbe9d92c9,0xc7fc5cad),LL(0x38f0078b,0xae641b58),LL(0x91a544af,0x0c9540c5),L_(0x6cae5443),
+ LL(0x33b2702e,0x93ebe56e),LL(0x71946cb7,0xff835a5d),LL(0xc82366c4,0xbfe6dc77),L_(0x27a97fdc), LL(0x2bb71ad5,0x80d9e527),LL(0x16d42ed2,0x21ce1d14),LL(0x18abf494,0x0398f8d3),L_(0xa190c5d3),
+ LL(0x87b49d63,0x495ac575),LL(0x6bf10350,0xb50a8115),LL(0x2674f39c,0x90ac41f9),L_(0xaedc843c), LL(0x20e79ef7,0x60ca4b9c),LL(0x2b7ba708,0x67e85483),LL(0xc070ae10,0x2e4b0764),L_(0x0c3aa1f7),
+ LL(0x9b6c96e8,0x555cdffb),LL(0xd2310fa6,0x1116970b),LL(0x42f99112,0x9d84f404),L_(0x8d7bdc74), LL(0x452face1,0x43e3cff2),LL(0x1c149edf,0xf602e240),LL(0x442dde2f,0x1288dcc9),L_(0xb3089de8),
+ LL(0x1ad5fcdc,0x3fe61e5f),LL(0x20fa93a3,0x2e793d8a),LL(0xb50f92b7,0xbfce0907),L_(0x632ab7a5), LL(0x8a0e5e0a,0xc89531e2),LL(0x6f57401d,0x4059a329),LL(0xf7bd6eb0,0x5942987b),L_(0xceffd87f),
+ LL(0xacfc439f,0x74161b3d),LL(0x647fc617,0x3b17df59),LL(0xac7f6cc8,0xc485b2c8),L_(0x0414a8d3), LL(0x69c118ce,0xd7de72d0),LL(0x1d6064d4,0x1eff6d80),LL(0x9fd6a735,0x8ee9cb9d),L_(0xf104d7a9),
+ LL(0x252fb3dd,0x776f7b1a),LL(0x2b058af6,0xb6f63fd9),LL(0x0d06abe2,0xb0461b36),L_(0x90f6c358), LL(0x5c9d58a0,0x9a72e438),LL(0x24e0b184,0xce596569),LL(0x6facf219,0x5f6753e5),L_(0x5f23a218),
+ LL(0x87cb85e1,0x4fd2cc25),LL(0xadb7e3c5,0x53c5cae5),LL(0x4cc67b4e,0x4c80d589),L_(0x6a578011), LL(0x4f08551a,0xc04163a3),LL(0x41978a17,0x52d7161e),LL(0x4701d626,0x7acb9d4e),L_(0x7040eb22),
+ LL(0x25c4f3fa,0xb117faf3),LL(0x734cd26d,0xb2bfac77),LL(0x071d299e,0x1ad0de2a),L_(0x826417df), LL(0x1049bb39,0x487c15ef),LL(0x5432a8df,0x74da9484),LL(0xa5c29870,0xe2f76737),L_(0x89d1f699),
+ LL(0xe58a9a06,0xe366cc79),LL(0xcd96f1e7,0x497f4836),LL(0x19aa24f5,0xbe89a16c),L_(0xea6d5b99), LL(0x4105a3ce,0x1afa0bd4),LL(0x8da4ca09,0x4aa54b7f),LL(0xb278c556,0x07697581),L_(0xea0b2435),
+ LL(0x69260167,0x233ddda4),LL(0xbce451f2,0x055176b1),LL(0xe21ca9dd,0x33fc9573),L_(0x608477ee), LL(0xb1111c08,0x37f4a8b6),LL(0x2f253ba7,0x60c86d48),LL(0xec1f4a44,0x3ae7c4bb),L_(0x1c649260),
+ LL(0x418877ba,0xf186ffa7),LL(0xca88dd8a,0xe435d41d),LL(0x2e8c5c07,0xd65638d7),L_(0x8d28689a), LL(0x50763ccc,0xa2ef4b71),LL(0xfa5e89e0,0xbab1be9a),LL(0xea4b66ad,0x2a17ea7b),L_(0x5744fef5),
+ LL(0x511ae7ab,0x1c88c915),LL(0xd377e6af,0x55991086),LL(0xbd38c04f,0x43c62134),L_(0x7e11eacb), LL(0x715ff436,0x3aa19a12),LL(0xe65b9643,0xc019b147),LL(0x0069d240,0x7d7a8265),L_(0xc6fc4f7d),
+ LL(0x00db9dd8,0xb94a17c8),LL(0x95308d83,0xb2b6edac),LL(0x88fbad84,0xd14a8ca8),L_(0xcec36252), LL(0x7824a283,0xf71bccba),LL(0xd90035ec,0xd172d468),LL(0x55a73d3d,0x07f0cdbc),L_(0x6c21797b),
+ LL(0x3b33cd4c,0x5162797e),LL(0xa87e9702,0x6fc60b78),LL(0x2ab93ff3,0xe2a31c19),L_(0x4288abf4), LL(0x297e2ccf,0x80be51bb),LL(0x388680ed,0x058de4bc),LL(0x8dedbe92,0x7da1a829),L_(0xbffcb08c),
+ LL(0x7008c033,0xac1e2c00),LL(0x1d6fb3ed,0xd70668f0),LL(0x9f1545b9,0xfb03795c),L_(0xbfecfd6e), LL(0x83ab63e2,0xac0e74d0),LL(0xcbb46331,0x481489c9),LL(0x01849565,0x79c317d8),L_(0x9186b0db),
+ LL(0x1b42ef85,0xe3b9e5c1),LL(0xa44cb510,0x4bcaad24),LL(0xc72bcdea,0xd47f22e3),L_(0x23ac79ad), LL(0xffacee46,0x1062a849),LL(0xd5193e66,0xfb9adffd),LL(0xbb25e4cf,0x600c0353),L_(0x5ab3c0ce),
+ LL(0xd8f9674f,0x1f36e1c6),LL(0x2a414d7c,0xc2f2d11a),LL(0x23202a91,0xbdd27859),L_(0xd77095b4), LL(0xe447fde6,0xe5a99ae1),LL(0xd0fffc9e,0x5835b80b),LL(0x490dac48,0xacfdbe9c),L_(0x9079d090),
+ LL(0x65c70a3a,0x550c3e82),LL(0x448361bb,0x40b9aa3e),LL(0xfeab6ae4,0x41969a52),L_(0x74461138), LL(0x37a53426,0x47381f18),LL(0x2be030b8,0xd6e199e3),LL(0xb091abda,0x4da4cd53),L_(0x7df8f1e3),
+ LL(0xb6274829,0x9fea92c3),LL(0xab2fcd01,0xcf88fa14),LL(0xd804cba2,0xed8709e8),L_(0x19141717), LL(0x820090bf,0x88fb9ad9),LL(0xe105506b,0x370d09cc),LL(0x8cb2c13e,0x4e6bda23),L_(0xcaba970f),
+ LL(0x5ad6bf8f,0x9fcd4871),LL(0x160191eb,0xa47d5c67),LL(0x826242d1,0x99634c20),L_(0xdfe7289d), LL(0xbd0af1f7,0x4e07eba8),LL(0xc0910d55,0x18abee83),LL(0x7e042c87,0x6d7f5229),L_(0xd74d6e82),
+ LL(0x4747a07d,0x6efbc0e2),LL(0xcc3c4e8e,0x9088fde2),LL(0xf21ea1eb,0x05c108d8),L_(0x37aae682), LL(0x0d08ac9d,0xf2c37fd2),LL(0x9a51bef8,0x4d3bd6c1),LL(0x5ac834a7,0x2a412b12),L_(0xac985dae),
+ LL(0xf5833d2b,0x39bd0099),LL(0xb0ef3648,0x886d33b3),LL(0xc1936e74,0x97226670),L_(0x3eb64bfc), LL(0x408e784b,0xfa065545),LL(0x6cb29cd8,0x96246832),LL(0x010fbc36,0x6b24b9f4),L_(0x72e08b5c),
+ LL(0xaa5c541e,0xe0daf350),LL(0x2fb0ee94,0x86c5cee7),LL(0xac57f680,0xb753971e),L_(0x6b0ccf83), LL(0xbcb76004,0xc3b1be67),LL(0x48b857e0,0x3f637d0f),LL(0x81e2b0c6,0x595ebecb),L_(0x7151293e),
+ LL(0x9a2c561d,0xb788bb43),LL(0x65e9c6ef,0x6cf04373),LL(0x10062256,0x891a7719),L_(0xe6f377fd), LL(0x9d5d462c,0x7355204a),LL(0xe23556ab,0x08f2e4fc),LL(0x188872ce,0x84eba15d),L_(0xea03bca4),
+ LL(0x37bcd5fb,0x159bb9de),LL(0x08807416,0x412b6267),LL(0x496eba6c,0x5b5b2f5c),L_(0xff4f34bf), LL(0xd57ab42b,0x376ec0fc),LL(0xe48904ea,0x62f02fea),LL(0x96bf9fdc,0x9b04b325),L_(0x003a468c),
+ LL(0x85de6fe5,0x3d1be5ab),LL(0x62509881,0xf11ef926),LL(0x65d5f607,0x244caa05),L_(0xc38d7540), LL(0xc1a149a8,0x0b239ba6),LL(0x19b8e994,0x53224bb3),LL(0x1f25f647,0xd2cd0a34),L_(0x7f481820),
+ LL(0x303ac802,0xdceb71b5),LL(0xf395c0f2,0x9bd5860b),LL(0x6febd95b,0x01d8efcf),L_(0x0b358ed0), LL(0xc95f4540,0xdadfd46c),LL(0xdc5d961e,0xc1f026dd),LL(0x221b24a2,0x6d21a125),L_(0xc0f16b10),
+ LL(0x03e43472,0x3ece8318),LL(0x54252e96,0x430e9b3f),LL(0x97edd631,0x020e1e99),L_(0x90685aae), LL(0xad7d0431,0xb7771434),LL(0x6df64310,0x9647f95c),LL(0xa647e2b0,0xd6ddd8f3),L_(0x52ff5927),
+ LL(0xe48eb4a9,0x3fd7f726),LL(0xbb02013a,0xcd6dd255),LL(0x6e17def8,0x5ef8f2c6),L_(0x1b970bb2), LL(0x867ed64e,0x1236fa4f),LL(0xf7a7e274,0x459207e6),LL(0xffa4c978,0x5a8179b1),L_(0x99219388),
+ LL(0xcb87940a,0x4b407e59),LL(0x844408fa,0xa05e3d79),LL(0x742669b3,0x0751f86d),L_(0xb00b365a), LL(0x7860c6e5,0x3a8360fb),LL(0x4147cefc,0x10209a6b),LL(0x0393026e,0x7a7f6231),L_(0x2e39fa34),
+ LL(0xe7f6f33d,0x149f6c77),LL(0xbbcd3afa,0x9a9bdb39),LL(0x742b5b3a,0x899f0118),L_(0xb8dc2766), LL(0x573badd0,0x14c00e4c),LL(0x6924c12d,0x190dfe39),LL(0x4e4111e9,0xdf09100c),L_(0x2987ca68),
+ LL(0xe5fa2136,0x65fad088),LL(0x01cff054,0x9c1c2f99),LL(0x3002769e,0xdb9e3912),L_(0xe9ad46db), LL(0xa7493cf2,0x6e70449f),LL(0x34ab7ab5,0x1ed50609),LL(0xfda4dfd0,0x91982d5a),L_(0x89e4ea03),
+ LL(0xb358f84b,0x132822e9),LL(0x1ad76044,0x9d9ae4a1),LL(0x3e8a1d95,0xb981b100),L_(0x37f04df1), LL(0x364692e2,0x0b17bd09),LL(0x0b34cd00,0x5d63a307),LL(0x447278ad,0x07bde57a),L_(0x6e16122f),
+ LL(0xa6d64780,0x3221832c),LL(0x8fc6ce6c,0x3dbd0cb9),LL(0x6582853a,0x9cdf65d9),L_(0x708e9258), LL(0xf6bfe6cf,0x273611ec),LL(0xef43a507,0xa78d98b3),LL(0x86406043,0x88f84624),L_(0x4396769b),
+ LL(0xbca28b2c,0x25903255),LL(0x6b8a2c7e,0x255e1a29),LL(0x567e51fc,0x06f1e0ff),L_(0xdbcad515), LL(0xf590a256,0xe7fa9d15),LL(0x627c717b,0xe236aabd),LL(0x3efff1d7,0xa592bf53),L_(0xe58ce7d7),
+ LL(0x47f49527,0x6bc49db6),LL(0x2993ad98,0xc9fd48de),LL(0xcd8ed14b,0x104437d1),L_(0x419b6d76), LL(0x80c19d84,0x5ceae531),LL(0x2692fc9f,0x7b8ba2ce),LL(0x96208c12,0x5f17f19b),L_(0x34a83cc6),
+ LL(0x35c24843,0x3d238cb1),LL(0x6bb879b5,0x818fcd3b),LL(0xeaa5d8cb,0x137d82f5),L_(0x769e2a68), LL(0x1bcbebc0,0x0ddf279d),LL(0x2ae26372,0xda0b62e6),LL(0x79e90c0c,0x27e773c7),L_(0x3451edcf),
+ LL(0x8b2767f2,0x65ddd79a),LL(0x34988e35,0x9ab07761),LL(0xd93aac10,0x814a0e96),L_(0x76ec0b96), LL(0x802069a0,0xe6639b9a),LL(0x9143cd9d,0x23a6da3d),LL(0xfb9b096c,0x77b915d6),L_(0x4353464a),
+ LL(0xc93ba38f,0x103b0148),LL(0x52d3720b,0x9d45cf17),LL(0x3c3a2d72,0x0ddae18b),L_(0x3543af35), LL(0x10ee7a77,0x90846157),LL(0x51cb6d6c,0xa8824c71),LL(0x5541df28,0x9f0df2e6),L_(0xa96cf0e6),
+ LL(0xdb058979,0x51a147b3),LL(0xbd4c751a,0xba41fdd4),LL(0x5b132575,0x81839452),L_(0x9b0ddfdb), LL(0x785de02d,0x2e14f24c),LL(0x54dad63a,0x052a799c),LL(0xd7c22290,0xdcbca7aa),L_(0x77c13acc),
+ LL(0xe8859b95,0x4c326ed2),LL(0xe3bb354a,0x57333802),LL(0xa148004d,0xb7008ce3),L_(0x85367d7f), LL(0x2d4febd4,0xe73d1a3f),LL(0x93d871ad,0x1f4f245d),LL(0x7768c969,0xd9c87876),L_(0xb38a617a),
+ LL(0x085dbc17,0xaf8f400d),LL(0x2a94dc1a,0x93399c4a),LL(0xf8d2e936,0x370e4c06),L_(0xca35bd61), LL(0x0fb73083,0x2c1682bc),LL(0x00b6e1a8,0x4742b84d),LL(0x6d92e1f4,0x9bb1736d),L_(0x3e9b6293),
+},
+/* digit=19 base_pwr=2^133 */
+{
+ LL(0x2a85b5cc,0x6c35afbc),LL(0xf6f30e96,0xb02b80b7),LL(0x669a8252,0x4dd8bbbe),L_(0xb9b1b311), LL(0x28535ef6,0xbbcbf46b),LL(0xe4d59c99,0x20d09a27),LL(0x63242255,0x877172dc),L_(0x853f9c6a),
+ LL(0x432984a1,0xd5de71e9),LL(0xe7f42edd,0xb421581f),LL(0x0b9c53bf,0xc8c4ee60),L_(0x82b1e37e), LL(0x51492ea8,0x4a10fc29),LL(0x7502a8c1,0x69016e9c),LL(0x2dc30077,0xcd3e0527),L_(0x2e0b7f76),
+ LL(0x161f4880,0xc21b4aab),LL(0x95f715ce,0x44db3fe0),LL(0xff0073cd,0xdb4528e5),L_(0xdbc69fc1), LL(0x5161785c,0x8bfc4101),LL(0xe2c44c67,0x22e31d16),LL(0xa7624b31,0x1b45072c),L_(0xebf2704a),
+ LL(0xfd1ff163,0x540d3ef9),LL(0xe3c8a7e4,0xd48da416),LL(0x39e285d6,0xccac1ee5),L_(0x8d098605), LL(0x09862475,0xaae2485c),LL(0x424cb101,0x4df1fb56),LL(0xd81ebf03,0xe045acd6),L_(0xec4b922d),
+ LL(0x3fbc727e,0xe3ace3b3),LL(0xfb5f0701,0x39644794),LL(0x1534cde5,0x25904a79),L_(0xf9421b0d), LL(0xd3275fa8,0x0528f7ca),LL(0x8a9c39d8,0xdea09c8b),LL(0xdd383932,0x458a7c5f),L_(0xbaf06aaf),
+ LL(0x1adf0fac,0x193b780b),LL(0x5abd6eef,0x5042f2da),LL(0xd76b78fd,0x06442ef6),L_(0x0cdf9e58), LL(0xfef055d2,0x8a5c2657),LL(0xfae0a442,0x0bf16e33),LL(0x6c2b778b,0xb5adbc98),L_(0xf374d05a),
+ LL(0x846ef971,0x0c6f4ae2),LL(0xb657d5f6,0xd2466841),LL(0xabf1920f,0x70a6775e),L_(0x15909e3c), LL(0xcede3a4d,0xe0c73f43),LL(0x563843f3,0x15282f23),LL(0xe15912d0,0x2e80308d),L_(0xd16c8835),
+ LL(0x767329dd,0xb00d2849),LL(0x96ae8e24,0x10d39711),LL(0x118cc563,0x4ed443bf),L_(0x9157acc3), LL(0x755122ae,0x14b54c12),LL(0x07d6ccc1,0x4fd87692),LL(0x05ec4685,0xf50f2de3),L_(0x1a923061),
+ LL(0x3480f7d1,0xc692cc02),LL(0xbe07dcf7,0x71999891),LL(0x5f04bf18,0x0d99300c),L_(0xa062deba), LL(0xb9eb55fc,0xa3451ea5),LL(0x02666d4c,0x1acb5351),LL(0x2fc90780,0x564f33fe),L_(0xa2bd47b9),
+ LL(0xb70680a0,0x6da6ee27),LL(0xdab5f17d,0x76f48c1f),LL(0x36f25faf,0x16a32d1e),L_(0xbe5fdc6d), LL(0xcd1b3276,0xd0d79fc8),LL(0x0ee979a6,0x2e5c89f7),LL(0xc670e327,0x6435ef83),L_(0x55425ae2),
+ LL(0x8e0dd4c4,0xcf395e16),LL(0xd8954092,0x86079f76),LL(0x516938e6,0xc57f3db0),L_(0xe85d4e50), LL(0x4eabd92c,0x611ea78f),LL(0xfafbe19a,0x8d26fbc1),LL(0xe5ff8f07,0xe41d9e6e),L_(0x9e9c0da2),
+ LL(0xcfcf1446,0x86e3cdb5),LL(0x8cb41178,0x3fbc43f0),LL(0x5615e2b5,0x74d58d7a),L_(0x4e6b82ce), LL(0x0c36a5a8,0xd4c6f917),LL(0x374bbfd9,0xc3b3ae3b),LL(0x15aadf46,0x363a6cec),L_(0x30dd6649),
+ LL(0xe325634b,0xe43c3ade),LL(0x120bb9ae,0xb587b6a1),LL(0x73ef55fc,0xbe8a8508),L_(0xbb18ab2b), LL(0xc135e4d5,0x84facee1),LL(0xb277aa2c,0x67fba354),LL(0x742a25ca,0x1cc06cae),L_(0xd0d24d20),
+ LL(0x3aa2917b,0x0714ac71),LL(0x2ffe0519,0x178aa56a),LL(0x843d58c9,0x7eddcb6d),L_(0x1e60abe4), LL(0x4b221bdc,0xb10fd184),LL(0xccf9c609,0x113f37e1),LL(0xa0d4b627,0xe398ed34),L_(0x7b6aa811),
+ LL(0x95472b76,0xa960c0c2),LL(0x735c5d62,0xf7232900),LL(0x0f8b2a35,0x54dfa089),L_(0x0b186f7a), LL(0x7962dd9a,0x3e7eb8a1),LL(0xc1614c55,0x0188ff65),LL(0x8c7e1e1d,0x390e7c1c),L_(0xf9b0b2f9),
+ LL(0x66e2227a,0x11277d69),LL(0xd9cc122b,0x5181f585),LL(0x3f2ab21d,0x2cbd87e4),L_(0x494cfb1e), LL(0xd57e150f,0xae7bbb8f),LL(0x9977c3ac,0xee685251),LL(0x397ea438,0xb224446c),L_(0x7ed9dec7),
+ LL(0x3c14cf6c,0xc59accd1),LL(0xb5432f0f,0xb6446b96),LL(0x8b88a937,0xc5589b93),L_(0x02d9f9ac), LL(0x007ea9ac,0x8302d1bb),LL(0x43908c95,0x087096dc),LL(0xb05f1092,0x83349c39),L_(0x5061c674),
+ LL(0xf6734878,0xf0350dc8),LL(0x9371eb01,0x4edf29b1),LL(0xce86a9ba,0x47861a0c),L_(0x9aad7247), LL(0x16443994,0xa559d5e8),LL(0x979093ec,0xa58da55e),LL(0x0fe17efc,0xb512322d),L_(0xae7b8c8e),
+ LL(0xf66cc404,0x3ad82960),LL(0x9f1ec261,0x07a3082c),LL(0x77a36e96,0x3914c9d2),L_(0x9b1a4daf), LL(0x238844ea,0xec701058),LL(0xcfa77625,0xc70140df),LL(0xe60b3f2a,0x0c5b4abf),L_(0x138b4b1c),
+ LL(0xa5d35437,0x174442e5),LL(0x1802aa28,0x2aa23227),LL(0x26f71e89,0x4a4c5681),L_(0x7ae33021), LL(0x7106d5d6,0x5d0cad43),LL(0x2893d185,0xe47a47cc),LL(0x7e9947d1,0xc9f7bf57),L_(0xf2c79dea),
+ LL(0x607d7e89,0x3a838f3a),LL(0xfbe1be02,0xf73959fe),LL(0x229d491d,0x207a3044),L_(0x9f62e957), LL(0xd08dcf90,0x2e1d3c53),LL(0x86b7e5aa,0x229a31a5),LL(0x3fbda02f,0x7c96f0d5),L_(0xbda44f9b),
+ LL(0x6e006c73,0xf1aeae69),LL(0xae77f574,0x08648f34),LL(0x0423c397,0xf1f4d153),L_(0x47451433), LL(0xcd40d0b0,0x3a807b62),LL(0xe8e961f8,0xa745762a),LL(0xd89c3d2a,0x467e86a7),L_(0x6ac80359),
+ LL(0xb9798433,0xb36ecce6),LL(0x3b7324a4,0x5be87e7d),LL(0xbb9babf8,0x98c1904a),L_(0xf1e380ce), LL(0x03c9dc36,0x01b08224),LL(0x2eeb6052,0x1ae12594),LL(0xd0d4fef9,0x19322045),L_(0x256a539e),
+ LL(0xdcff0296,0xc94659b0),LL(0x2f0568f5,0x39aab164),LL(0xed8a79a8,0x50d8c266),L_(0x757c7d99), LL(0x4445c1ec,0x66c509e4),LL(0xb792533a,0x70d28954),LL(0x9e0c5aad,0x34caeea9),L_(0xe5b193ca),
+ LL(0x8188c9ad,0x195602fb),LL(0x701a9997,0x76ac1458),LL(0x3992cbca,0xe1e8b8e7),L_(0x8ec536e5), LL(0x4d168e61,0x29c79b39),LL(0x29bff6f9,0xca81be8e),LL(0x596ff95f,0x0a0ae347),L_(0x661b4a6c),
+ LL(0xd0970633,0x8e767a03),LL(0x473ec4b4,0x7b96613b),LL(0xeb4d7d16,0x98a8ebb4),L_(0xc4e28600), LL(0x1487660b,0x6beb5ab7),LL(0x1ef6cbd4,0x71463757),LL(0x83dde9df,0x1762ff65),L_(0x9ddef882),
+ LL(0x0d56a9f5,0xe6f97e52),LL(0x2cfac1c4,0xe924c291),LL(0x9480052a,0x61546993),L_(0xcee96715), LL(0x4783b246,0xdc612b8a),LL(0x01036872,0x40ce9da3),LL(0x9e6d56f5,0x0543bf02),L_(0x40b8eb7d),
+ LL(0xaa29fa33,0xbb67b973),LL(0xd7ceddb4,0x733e1da7),LL(0x7bd3859f,0xe95a7ea2),L_(0xc85424d7), LL(0xc42d076f,0x5d21362a),LL(0x2591a7e7,0x8674ee1d),LL(0x52817220,0xc9d8453d),L_(0xa286acd4),
+ LL(0x7fece4b3,0xaf830115),LL(0x6e587151,0x0a71eb17),LL(0x3d8da1f0,0x7afbb075),L_(0xf8e3bab4), LL(0xea1fecf8,0x3ab8344c),LL(0x6bb840b0,0xb4392fd5),LL(0xae7bd8be,0x73177038),L_(0xed8b2ca2),
+ LL(0x50dfe6f9,0xadd91143),LL(0x680d82d3,0x88a2c506),LL(0x88f503de,0x37393204),L_(0x746b676f), LL(0xc6591d03,0xaf979503),LL(0x5a9be716,0x79a8b931),LL(0x0e682183,0x609ab748),L_(0xfe8299c8),
+ LL(0xc3535c6b,0x193fd320),LL(0x8682c4c0,0xff4f04b8),LL(0xd566872d,0x1407f3c3),L_(0x16439d5d), LL(0xac2e95ba,0xd6726481),LL(0xb7bc2fb3,0xb0b0ea32),LL(0xb4c2b53d,0xfeaaece6),L_(0x4349edc0),
+ LL(0x649e4b51,0xae9bd277),LL(0x6c678048,0x4268b40c),LL(0x52da3782,0xae4a71b1),L_(0x1e1cd89e), LL(0x4f079bbd,0x2f691fc6),LL(0xf69884c3,0xfe5d33d3),LL(0x19020a41,0xdda1c483),L_(0x77d02be4),
+ LL(0x7ea53289,0x8529164c),LL(0x5d80aafd,0xd09dfaea),LL(0x1e830c7c,0xa9f0f09e),L_(0xfc3140e2), LL(0x5135dc82,0xdc2ab04a),LL(0x59befe02,0xa0b35f50),LL(0xa44595d6,0xc1e15529),L_(0xf19abe7c),
+ LL(0x3a5d5f42,0xa12bcced),LL(0xb9b8ec3a,0xb87d7dc6),LL(0xad1e4dcf,0xb63e0921),L_(0xfcf65288), LL(0x0c0e6332,0x863fe95a),LL(0x5cd2ee3e,0x42a677d4),LL(0x60da7b43,0xb8a5bd09),L_(0xc426f7df),
+ LL(0x51ea4dd8,0x6e5213a1),LL(0xfd69d7c4,0xdf5f1e1a),LL(0xd30cf23b,0x37d44e1e),L_(0x7097147f), LL(0x321e5347,0x12d98f14),LL(0x32dad5dc,0x76d7e7b8),LL(0xdfe1a803,0xc8d86798),L_(0xeccd5411),
+ LL(0xa7aae910,0x74006fc6),LL(0xd7d803d8,0xa34c1849),LL(0xec84dc01,0xae309a70),L_(0xa34e0e32), LL(0x42af799e,0x235ed631),LL(0xcfee558c,0x8802c5f3),LL(0xcd97224f,0x1640e7f8),L_(0x92280213),
+ LL(0x535c56a8,0xc7ccf419),LL(0xd687e53b,0x31ef82e6),LL(0x9a24176e,0x01470242),L_(0x01aae44b), LL(0xf12919c6,0x9fcc8bac),LL(0xc772707a,0x2bbb2bc0),LL(0xeeb32998,0x1fd556e7),L_(0x6b1da8b4),
+ LL(0x10943f72,0x3fe0c227),LL(0x929fe46b,0xf1163a98),LL(0x55829b86,0xb0593728),L_(0x46968b3a), LL(0x98063840,0x861c28fa),LL(0x49238b1c,0x238ae42f),LL(0xe2c2f08f,0xc3669826),L_(0xd635b05a),
+ LL(0x0b716b89,0x1cbd7071),LL(0xac172491,0x9bedfd64),LL(0x70337bd6,0x5806f542),L_(0xba62de08), LL(0xff8ac4cd,0xc789f899),LL(0x778e6f6e,0xcabb9b96),LL(0x7cb61f89,0x9e11ca0e),L_(0x54802afa),
+ LL(0xb4f60ac0,0xa293c1cf),LL(0x98d81eae,0x3ce25589),LL(0x4a05fd65,0xf7776c88),L_(0x31edd830), LL(0x7102bdbe,0x6b003741),LL(0x530442c5,0x619c469b),LL(0x2717506f,0x993316f5),L_(0x977de534),
+ LL(0x731f0430,0x1f4b647b),LL(0x63a5f62f,0xa8649b7d),LL(0x184bd1bf,0x9eb8bb02),L_(0xd878238c), LL(0x2268c556,0xee715bb4),LL(0x0c09795f,0x5ba6433a),LL(0x4a0ef111,0x5e80a1d2),L_(0xa6ed70be),
+ LL(0x1a0ec85a,0x02e27463),LL(0x66b5fa13,0x7351bd1f),LL(0xf1afa0ff,0x262f06e4),L_(0x55328bec), LL(0x17a8c5cc,0x359db888),LL(0x56654a88,0xbbf24e90),LL(0x31866e60,0xe08705c4),L_(0x615a5b05),
+ LL(0x2741b093,0xd9bae789),LL(0xa18e5f26,0x959b66a0),LL(0xfb66461f,0x52d89638),L_(0xf79de1ee), LL(0x3b41960d,0x63f080c4),LL(0xf0c1209c,0x1356ad3c),LL(0x8927edab,0x1cca87fa),L_(0x0d7779de),
+ LL(0xed47b255,0x4ffe196c),LL(0x591b255f,0x0bda5bcf),LL(0xf529da71,0xa919472f),L_(0xc172114d), LL(0x4edb3f70,0x727df75d),LL(0x0b0bba01,0x7a3418a3),LL(0x18ae3fad,0x7de531b5),L_(0x60f6010b),
+ LL(0xeec6a320,0xc8ab7f39),LL(0x4d9c100a,0x42812137),LL(0xb3ed07de,0x2ce9d1a7),L_(0xf4f877cc), LL(0xbf31e6a0,0xe5d2ab30),LL(0x7ebabf38,0xc0c95215),LL(0xce3cfa6e,0x85ffa6d1),L_(0xfa3306d0),
+ LL(0xfe179a15,0x014e69fa),LL(0xe40ec6e7,0x949a6258),LL(0x8f04f43e,0xf3db5670),L_(0xb9883ee7), LL(0xf31a374c,0xeab3fc5d),LL(0xedf8720a,0x70831223),LL(0xf1d8e66c,0x32cbb568),L_(0xc1af6691),
+ LL(0x955bb333,0xb78b642a),LL(0x65a42ec3,0x18885922),LL(0xdde23959,0x216642c3),L_(0xcdc7c4de), LL(0x4a6ce38f,0x82ee3788),LL(0xec771036,0xd5430b69),LL(0xefdcbefc,0xe82b1033),L_(0x5b9fd0f1),
+ LL(0x856e9dad,0xd7c8b168),LL(0x94661f99,0x034f792d),LL(0x968a0514,0x5e1f223f),L_(0xf2936613), LL(0x9468ee68,0xf109d747),LL(0x8c1958b8,0x35d5c367),LL(0xd1baaa07,0x58b0e5bd),L_(0x04265560),
+ LL(0x03eb3ddb,0x3c1c78f2),LL(0x73aa994d,0x77b06810),LL(0x9d13c879,0x5ffbf962),L_(0x329365bf), LL(0xeb311f82,0x151d1b5b),LL(0x9b162681,0xa0010f38),LL(0x67d4adbd,0x2d7119cb),L_(0x112111da),
+ LL(0x3a3f8979,0x8de63a52),LL(0x0bc054e9,0xcecf35b9),LL(0xac3474f8,0xd39c2e22),L_(0x8a24d244), LL(0xe1c3169e,0x72de5749),LL(0xf7cd28ca,0x1f3311ce),LL(0xaba378ca,0xacf3d959),L_(0xc4c178a4),
+ LL(0x41028a7a,0x4c196a71),LL(0xeddb3096,0x07052fa2),LL(0x78d05008,0x4a5cea44),L_(0x4e82cf55), LL(0xe4836382,0xbc157855),LL(0x42628bb0,0x6906bb4c),LL(0x3bec9a03,0x414298ee),L_(0x71c76fb4),
+ LL(0x2dc6d80f,0x451c89a8),LL(0x0eb5ca81,0xb205946f),LL(0x85231812,0xdd102f79),L_(0xcfe70175), LL(0x79cbba78,0x74f5620f),LL(0xa68f72ba,0x925ad282),LL(0x107305c7,0xa0b90dac),L_(0x71b34217),
+ LL(0xd11e6b55,0xdf55e61e),LL(0x74013fe7,0x39b4240c),LL(0x384b1c58,0x117f4d5d),L_(0xb417f0cc), LL(0xdee67f19,0xa5e101d1),LL(0x6a59354e,0x057e8fde),LL(0xdd613a29,0x3d053f50),L_(0x49698601),
+ LL(0x0e1e0dac,0xbc28da28),LL(0x350510df,0x6476441e),LL(0xa5492aa3,0x488b3ebb),L_(0x7335580b), LL(0xe4198903,0x150fa7db),LL(0x5080e530,0x1e0113ef),LL(0x41fe0adc,0x151c555b),L_(0xefba1701),
+ LL(0x4e602721,0xda6ab8ed),LL(0x01c286ca,0x82be4f7e),LL(0x8f870fa0,0x67983e93),L_(0x011517ba), LL(0xd1bb4bf4,0x2ffdf949),LL(0xb8ff2b68,0x4a318fa3),LL(0x57a7f08b,0x2df51505),L_(0x7f4a552d),
+ LL(0xc07ee494,0x8a38d900),LL(0x15f78485,0xd40347a2),LL(0x40936fbc,0xdc403083),L_(0x26d9bf80), LL(0x87df50e9,0x6682494a),LL(0x658eecc3,0x88a94156),LL(0xe2c9cc47,0xf4a7dc3b),L_(0x6742c074),
+ LL(0x58b3b3f6,0xaf6f6f61),LL(0x1be73cf3,0xb37f3459),LL(0x74ffb428,0xb29ede9a),L_(0x92e686e4), LL(0xa4431924,0xdfa5e88f),LL(0xe1001a22,0x01fe6a9c),LL(0xf029cdcc,0x55c88ddd),L_(0xd03747ad),
+ LL(0xc359e1a8,0x69bc7a5b),LL(0x0a7f469b,0x79ced652),LL(0x8cb61ff4,0x860090cf),L_(0x25e6acf5), LL(0x5ae7246e,0x7c9a5e58),LL(0xd04ea633,0x62e6dab4),LL(0x3dccdf35,0x679b9a9c),L_(0xe0d5601a),
+ LL(0x9f6c163f,0x75393ffa),LL(0x503ff7fc,0x8a5ba74c),LL(0xad84a980,0x6a8d3ebd),L_(0xb711116c), LL(0xdb3d29d6,0x508cd2da),LL(0x298e39d1,0xadc29bed),LL(0xd182ffce,0xf35bcd9e),L_(0x56f60d5a),
+ LL(0x18ec5621,0xbb37476c),LL(0x126c6b62,0x00881f6d),LL(0x12e961ae,0xc23fa1b7),L_(0x620a85d2), LL(0x116a94f1,0x18d50f3c),LL(0x90b6bf4d,0xc1b565ee),LL(0xcce6cb44,0xb9db57be),L_(0x43232f2b),
+ LL(0x7e516745,0x33f18556),LL(0x34242913,0x303ca557),LL(0xecfa2caa,0xe5298223),L_(0x54c9b89f), LL(0x5a38eea9,0x2bb85e07),LL(0x3640c336,0xbe45ca34),LL(0x23f72dcc,0xe33bfd7f),L_(0x1138d09f),
+ LL(0x2532b3de,0x9635cec4),LL(0x99decb38,0xecdd16cc),LL(0xb6e94853,0xc90493fd),L_(0xe03d588e), LL(0x7c31a9ad,0xbbcd5eac),LL(0x1a5efdc4,0x24031f80),LL(0xbd3e5f35,0xc0bbee30),L_(0x91354a2e),
+ LL(0x46fe272f,0xe4fe7dd5),LL(0x40ccc046,0xcb3af2d4),LL(0xef734198,0xe37fbe0f),L_(0xd7d730ce), LL(0xc1b5100f,0xe81b74b4),LL(0xccbbf03c,0xfbbba07c),LL(0xaf1eca00,0xb202f7d1),L_(0x6c3a5371),
+ LL(0xb759588a,0x3c293b4f),LL(0x50ebe82c,0xccc60f4b),LL(0xe5c199da,0x9c0164e0),L_(0x09ae68d1), LL(0xdbb33342,0xe57a6b34),LL(0x764aa682,0x71131364),LL(0xd2b124d2,0xc37e19f6),L_(0x0684de69),
+},
+/* digit=20 base_pwr=2^140 */
+{
+ LL(0x2e5b54d1,0x3a2fc0ae),LL(0x3a0ae219,0x810b8800),LL(0x71d39325,0xeb53d991),L_(0x1b364d9f), LL(0xc225e922,0xe634fa4b),LL(0xfa979c3b,0x48c1302d),LL(0x0315e213,0x7a46c430),L_(0x7d3dfc00),
+ LL(0xf75af9f3,0x69c6dab4),LL(0xcad74055,0xbd0a143f),LL(0x5f980b30,0xf457bc61),L_(0x08ab6cd4), LL(0xa472e295,0x5a3b5bb9),LL(0x4a0eec60,0x1e647946),LL(0xa4e2c617,0xeb13a610),L_(0xea8ba726),
+ LL(0xb1f39e26,0x8208d95b),LL(0x1d126957,0xd33801fe),LL(0x38314570,0x2b3db8bc),L_(0x68f43b86), LL(0x06523bb4,0x2fa1baa7),LL(0xb3650b8b,0x7b7200e3),LL(0x222d46b5,0x5ab609c3),L_(0xe25b7f78),
+ LL(0xf09c3b4a,0x2601c0c2),LL(0x10c7e593,0xb71c88f8),LL(0xd433020b,0x163a4b4f),L_(0x6ea15982), LL(0xd7a199df,0x559abf4b),LL(0x168cc6db,0x8c58a3fd),LL(0x5e92d42d,0xcad8eab0),L_(0x0f718cd3),
+ LL(0x5222ebab,0x1eccb2dd),LL(0x45eee5ae,0x6cca2e8f),LL(0xf0f806c3,0x93a2e216),L_(0x0b896b9f), LL(0x2753730f,0x21ac6aa6),LL(0xe860a374,0x93ff82bd),LL(0xa6d03d5f,0xc336e305),L_(0x5a3ad08c),
+ LL(0x05094bb6,0x7e65ba97),LL(0x927ff44f,0x69a96369),LL(0xcfc2ebd4,0x8e5841d8),L_(0xcd919ed2), LL(0x7d67ba45,0xd72479fa),LL(0xf9079703,0xb458951d),LL(0x11b2590d,0x12b5f89b),L_(0x9e78739c),
+ LL(0xb68ddf1d,0x64971999),LL(0xcc5dc1ba,0x0f78a155),LL(0xc7f1ee3f,0xbbfeebe2),L_(0xa475b47a), LL(0xae6b1a67,0xd00f3342),LL(0xaa2739d6,0xcbc8eae8),LL(0x6bcba57f,0x08421638),L_(0xf50c5c89),
+ LL(0x21fce16e,0x56ea720e),LL(0xc14eb574,0xb07c02a7),LL(0xe5e93b80,0x1a141ce9),L_(0xf206da59), LL(0x400443af,0xff6ca106),LL(0x85cacb30,0xe7e89a41),LL(0xe54c35f6,0x73777848),L_(0xeecb8a06),
+ LL(0x27098970,0x27c35c5a),LL(0x88bff7c0,0xd3495797),LL(0x2aa31cbd,0x84083f2a),L_(0xee8007b7), LL(0xd736e6e1,0x7c2ce5db),LL(0x46d1faf9,0x7eccf318),LL(0x0d96af5f,0x7894ccc6),L_(0x143733e6),
+ LL(0x38e5c20b,0xf8d1a779),LL(0x74b4b8c0,0x1407c96c),LL(0xaa226358,0x0f677dc4),L_(0xbce88332), LL(0xae06373b,0xa1eff8f8),LL(0x6f4d4505,0x46e8175d),LL(0x37fa6b50,0x12414006),L_(0x078af83c),
+ LL(0xaa9911e2,0x6038786a),LL(0x043fa7bc,0x9ec4cf47),LL(0x39594053,0xeeffb86e),L_(0xf30130d5), LL(0x93573962,0x8e9bddbb),LL(0x6b822690,0xa5656b7e),LL(0xfd18acdc,0xf63c9ead),L_(0xa29c50ef),
+ LL(0x7a68f812,0x875129d8),LL(0x23706eff,0x43107ab7),LL(0x343d01b4,0x0f0278ce),L_(0xd1d2ff3f), LL(0x947dc2e4,0x62e80eed),LL(0x76f993b1,0xb237e733),LL(0xd8eb588f,0xc6cb2916),L_(0x3e93bfcf),
+ LL(0x2323cfa1,0x40dc414f),LL(0x02fc59aa,0x81bf9064),LL(0xf4b7afef,0x2f863790),L_(0xdf1eb2ce), LL(0x2da3a955,0xc2be20ad),LL(0x05119c9a,0x826e16e4),LL(0xa27da69d,0x59ba9dd2),L_(0x50be3370),
+ LL(0x702f4a30,0xe5b817ac),LL(0x62b0b4a9,0x732be8dd),LL(0x0b744a18,0x49eb11c0),L_(0xdb8066e2), LL(0x61315a81,0x60bc3f3b),LL(0x9db8094e,0xa033694a),LL(0x1a336970,0xe5728d57),L_(0x98764bb8),
+ LL(0xa31f05a5,0x471336b0),LL(0xc97e0c25,0xe1b3c5c4),LL(0x40016340,0xd00385b4),L_(0x8681b939), LL(0xf3dbd1c9,0xfb0504e6),LL(0x190db5e8,0xf84aaa64),LL(0x73d7879b,0x5e7d8612),L_(0x8f037a48),
+ LL(0x4bb632f0,0xb920e089),LL(0x81a11e46,0x5fd26f9a),LL(0xad7ce91c,0xd873ff38),L_(0x463f5eef), LL(0xe973b348,0xa997a44a),LL(0x67e4b48b,0x7c4b4d96),LL(0x76b8b69f,0xc007a35a),L_(0x0ebb0cc7),
+ LL(0x066bf5fc,0xc6331e3d),LL(0xd49fdc60,0x01bb84a6),LL(0x3f1c848c,0xae53c6d2),L_(0xa68e50ed), LL(0x64a19a00,0xa6271228),LL(0x1c7298ae,0x6345be32),LL(0x34a3a582,0x6666c91c),L_(0x1bb3ce87),
+ LL(0xe3fc9fee,0xabcce7ab),LL(0xfa1beb7d,0xdf35c272),LL(0x9cab965d,0x7c86ce27),L_(0x145e311e), LL(0xadb37a6d,0x3f4563ca),LL(0xbd40ee7b,0xc5e44069),LL(0x077a6fa1,0x6ab23a8b),L_(0xdc9e2258),
+ LL(0xe14e323f,0x27ccdc44),LL(0x8d1e93bc,0x9fd47cad),LL(0xac370974,0xf5fc7d6a),L_(0xbb95cf97), LL(0x3c654b26,0x65e7b71e),LL(0x0d3d8936,0x69b3aaf9),LL(0x6cfc89cd,0xcfd74f9d),L_(0x46c8cccc),
+ LL(0xe59aef1b,0x82c35cac),LL(0x4b6e4cd2,0xd343c61a),LL(0x5bf959ed,0x77b74152),L_(0x14153467), LL(0xabc9828c,0xc645fe14),LL(0x44ed7180,0x251c7bd5),LL(0xb00a2c9f,0x94c68e2e),L_(0xcd40eadd),
+ LL(0x90c9c5ec,0xdb397bc5),LL(0x0bb14c2d,0x0029fc46),LL(0x2727c32b,0xbdde6547),L_(0xf5120538), LL(0x8748603f,0xca65a20c),LL(0xb71dac7a,0x79d195d6),LL(0x7b4ac903,0xf1e5f556),L_(0x83bcccf1),
+ LL(0xd8d5a0e2,0x35177eb8),LL(0xb2a6346d,0xe17edde4),LL(0xcdb1c427,0xc5c607ff),L_(0xf6acdcca), LL(0x7045642b,0xf198276e),LL(0x5ddfa215,0xa8387d90),LL(0xc1a3402a,0xc070af80),L_(0x0cf324a8),
+ LL(0x89428955,0x4be4c6c0),LL(0xddf4319c,0x076b38c2),LL(0xcc96208b,0xd1d87cd0),L_(0xc3e2cfee), LL(0xb63b328c,0x1fa3dfb1),LL(0x89c310af,0xbcb33f40),LL(0xab955eb2,0x1e3849a6),L_(0x4e9da2a4),
+ LL(0x572060d6,0x4a409b86),LL(0x4a32be16,0x01fee4f3),LL(0x5593d29d,0x1f66b255),L_(0xa18a71de), LL(0xdc92993c,0x871121b8),LL(0xd5a52a49,0x2885efde),LL(0xdb77ca39,0x35178007),L_(0xe87f7b56),
+ LL(0xb0b54185,0x7b11bf25),LL(0x78cced92,0x5f580048),LL(0x568cf974,0x1aebc2f4),L_(0x90437303), LL(0x380e1852,0xe1d4cf60),LL(0x81708f04,0x335221a8),LL(0xfcd5e396,0xe8e310f1),L_(0x67164e9b),
+ LL(0x5cc646e4,0x4435eb3f),LL(0x309bf5d1,0xc4516a98),LL(0xfa094c38,0x0f0f519b),L_(0xa7712b6a), LL(0x063b90c9,0x13b443e8),LL(0x3fc80f73,0x588eabab),LL(0xc2640659,0x6f1b036b),L_(0xcc979824),
+ LL(0x15f68a6c,0x2c10fe82),LL(0xfd4280b4,0x4be94dbf),LL(0x0f01bc51,0x8ebbdd0a),L_(0xe8a94761), LL(0xf5c8cf6e,0x3331db35),LL(0xe9e32c12,0xee34fb22),LL(0xdfdd390f,0x7d9acfa0),L_(0xf46a833d),
+ LL(0x4db03d63,0xb1f7d640),LL(0x50d5c66d,0x77b9e67a),LL(0xd311bbb8,0x2df06964),L_(0x4d4065dd), LL(0xb1ba8be7,0xc5f2e7e7),LL(0xa84be5a0,0x3c7c5264),LL(0x704fb715,0x72ab97c4),L_(0xe211a72c),
+ LL(0xde6eb928,0x22e459d0),LL(0x262ef282,0x78e351ef),LL(0xcdae125f,0x400cd2e5),L_(0xc83f210b), LL(0x1982c6e5,0xb3e5fe6c),LL(0x87c8591a,0x13591995),LL(0x83fd93d2,0x072fa5b0),L_(0x7d701f58),
+ LL(0xae57420d,0x2dda42fb),LL(0xa6490705,0x0c8f6d52),LL(0x5e3ec836,0x974661b3),L_(0x77bc552c), LL(0xca185c95,0xf43d8647),LL(0x351407f7,0x3094919d),LL(0x93522ec1,0x2effc179),L_(0x49a92d02),
+ LL(0xad6aa522,0x1178f9fd),LL(0x88ddd25b,0x7c35a7b4),LL(0x4985102d,0x0d3de452),L_(0xf0277afe), LL(0x9952ce22,0xf3571744),LL(0x53a80f8c,0x33bbd8c5),LL(0xa11d84cd,0x8cf3c9a4),L_(0x7920692b),
+ LL(0x19d5d3aa,0x3259f507),LL(0x8dd2cea1,0xfaa534d0),LL(0xb1de59c3,0x964e43aa),L_(0xd9cd158a), LL(0xb8fe9ccf,0xf7812a29),LL(0x483a8ca3,0x5a40b462),LL(0xf93b681f,0xeafa2982),L_(0x22d0852e),
+ LL(0xccafe782,0x4e3898e7),LL(0x178b364e,0x122c0954),LL(0x1e46cbf3,0x07005a6a),L_(0x017cc249), LL(0x1f834707,0xe3d63870),LL(0x9df8269b,0x84c46f73),LL(0xf32797a5,0x1360de40),L_(0x70a39a32),
+ LL(0xe6611eb8,0x58005efe),LL(0xefaea42e,0x9d406314),LL(0xcdf53ee0,0x8d9f77b8),L_(0x2be3de21), LL(0x3152090c,0x219fc4d6),LL(0xdfbb4054,0x2e867eb0),LL(0x370b0058,0x0df48ecb),L_(0x67c50061),
+ LL(0xd35d5628,0x7d760756),LL(0x3cb96c10,0xaff6e332),LL(0x87378266,0xc87eb4e6),L_(0xbb1b1686), LL(0x719b7dba,0xf625cc5d),LL(0x7f6f6bfb,0xc5c21343),LL(0xd1702bfc,0xd7459a05),L_(0xb5757892),
+ LL(0x07b102d7,0x2285b7c5),LL(0x77777ad0,0x90a0453e),LL(0x2a9f4627,0xa5cb03f7),L_(0xbdaaa412), LL(0xd6bb4325,0x6fb99eeb),LL(0x8aa2c4b5,0xc61bae52),LL(0xec729246,0x9b9f8d87),L_(0x995887b7),
+ LL(0x714a54b4,0x786ccb7c),LL(0xae2ffd66,0x1df96294),LL(0xb5661480,0x0b294654),L_(0x42cc5e69), LL(0xc6f02a04,0x1634f1da),LL(0x21f0caa7,0x75d2244a),LL(0x80410ce5,0x6597b349),L_(0xb9e50c3a),
+ LL(0xd19e2b9f,0xbefea27e),LL(0xca541338,0x53b70277),LL(0x0bc9bd26,0xd300e1fc),L_(0xed2c5b84), LL(0x935f9273,0x731c6b5d),LL(0x10fed3e2,0xac105b56),LL(0x6d0357ab,0x30c7c4b6),L_(0xfdf04b77),
+ LL(0x32c68e8f,0x6198d0bf),LL(0x49f0ac87,0x02928249),LL(0x5908bfa6,0x2b72f231),L_(0x1e0626b8), LL(0x87d56448,0xb70c5fdd),LL(0xaffd0d74,0xc8176ae0),LL(0x30464156,0xbe7c0da7),L_(0xf7d2ffb9),
+ LL(0xffa548f9,0xd71029f6),LL(0x2ac8267b,0x5922838c),LL(0x4f8afc3b,0x2d787218),L_(0x10f9a786), LL(0xb358d2a8,0xf19c8b54),LL(0x5209c3c7,0xf590721f),LL(0x0212109d,0x4e16a382),L_(0x3cd77b54),
+ LL(0xef4b9410,0x4e89b491),LL(0x77501651,0x417ff9fd),LL(0xdbb5243c,0xd24a6908),L_(0xc09c5df1), LL(0x2c39f4c4,0xeb16d02d),LL(0xb28822ac,0x4cd4a553),LL(0xbf46b5bb,0xde8a18e1),L_(0x47566077),
+ LL(0x0937292b,0xa4a4f179),LL(0xdff0cf1f,0x01b86895),LL(0x34f0c71b,0x3fe5a3b7),L_(0xae1fff30), LL(0xe080e0da,0x95b01982),LL(0x5317a578,0x3064e918),LL(0x8872e118,0x154f511a),L_(0x28ad7f46),
+ LL(0x9dbd0087,0x3c4162c3),LL(0x88636424,0x58631293),LL(0x69f32e25,0xf3a9fd92),L_(0x049b5c0f), LL(0x8d93c391,0xd8613d4d),LL(0xcf94b297,0x74bd10f5),LL(0xf99f0a15,0xf6d69ab3),L_(0x8d722881),
+ LL(0x67ba729a,0x2829f720),LL(0xc6f3cc19,0x88fffa70),LL(0xf0c5f76b,0x0d44b294),L_(0xda7df6fd), LL(0x033be0dd,0x35516898),LL(0x4c9c487f,0x50dfac1a),LL(0x312edd81,0x14a64ecf),L_(0x2db649b2),
+ LL(0x4933ac70,0x4e65d480),LL(0x17bb4dfc,0x8f9141c2),LL(0x7b8827b2,0x6ffab99a),L_(0x788afe5d), LL(0x15192ba1,0x6ed82d80),LL(0x75adf2d6,0x7be9df26),LL(0x99ce22b1,0x957976c9),L_(0xf8f37372),
+ LL(0x2204ff70,0x3ad3db41),LL(0xa4617ca1,0x7ca2697e),LL(0x8f228ced,0xc881f9da),L_(0x86ddd01a), LL(0x6e35e7e8,0xd1467d74),LL(0x41eb80aa,0xa4eadfce),LL(0x875ce5dd,0xaf17e700),L_(0x398d4c2f),
+ LL(0x3e59ab08,0x165575cd),LL(0x7c2f636f,0x55e6cf6d),LL(0x89f1290e,0xeeb00b1e),L_(0x2cccc148), LL(0x264e5c6c,0x7200e28c),LL(0x5409cce2,0xaf2b4dc4),LL(0xf8e920e1,0x3586fdc4),L_(0x11976312),
+ LL(0xab519f43,0x45934ad0),LL(0xa0a5bb1b,0x0eda4d94),LL(0xbcff29b2,0x9f749e30),L_(0x2f73a7d6), LL(0x2a833e74,0x9ed5bbc8),LL(0x111b6548,0x83945e37),LL(0x7b77f3f9,0x9b568171),L_(0xf1563350),
+ LL(0x999312c1,0xbde3fb88),LL(0xaa153efc,0x4ead50eb),LL(0xf24dc769,0x91718221),L_(0x3207691f), LL(0x1445f929,0xa962b883),LL(0x8a1416f3,0x6db04bb2),LL(0x2992be20,0x388328fb),L_(0xa7c4a359),
+ LL(0x92efc55b,0x709d7f62),LL(0xf678058c,0x08e33ff6),LL(0x9db19687,0x8d882bae),L_(0x81afb521), LL(0x462b58d3,0xce4ef2a4),LL(0xc6ecf132,0x21f09167),LL(0xab9bbd79,0x3831d678),L_(0x4c11a697),
+ LL(0xda7c3371,0x8a72049c),LL(0xc3e5138e,0xc7decc6d),LL(0x9235657e,0xf870194a),L_(0xeddbefb7), LL(0x306c9631,0x85d843d8),LL(0x912ed2a5,0x27180693),LL(0xdb45568f,0x453cbf16),L_(0x410259cc),
+ LL(0x3f11cacd,0x10263ac7),LL(0x69fa2805,0xb832a378),LL(0x6120289b,0x86d5285d),L_(0xece730a0), LL(0xabd38f00,0xbf1197bb),LL(0x286f4724,0xdbbb1a26),LL(0x0b0ef425,0xf397181d),L_(0x24bb4f4f),
+ LL(0xe24a9a47,0x162331a8),LL(0x536a5ea6,0x2bfbcebe),LL(0x88c29411,0x3da5a14f),L_(0x9cb76097), LL(0x5145ce76,0xef6b8093),LL(0x59e86f3c,0xe0a56e13),LL(0x817764eb,0x58eed1b6),L_(0x8010fc3d),
+ LL(0x0b1262b6,0x9a5b60b7),LL(0x108b3068,0x14ec42e4),LL(0x1312c3e2,0x8dd4b81a),L_(0x0253e9dc), LL(0x253ff39b,0x5eadccd1),LL(0xbd75013a,0x87febbae),LL(0xc60daeca,0x20b2a500),L_(0xbea0d3fb),
+ LL(0x20482528,0xfb3fb2a4),LL(0x72db2c7a,0x3620dd94),LL(0x864ce0ff,0xe0956799),L_(0x2d7ec9e2), LL(0x86bb3cca,0xdfc7056e),LL(0x77bfd4dc,0xf75d4a37),LL(0x0f42ffde,0x110fb370),L_(0xf2040e52),
+ LL(0x38389a23,0x2100e0ba),LL(0x6fd68890,0xbf38ce28),LL(0x67978ca8,0xb3a94049),L_(0x279171ad), LL(0x4b5e0e0d,0x0230458f),LL(0x41165c1f,0xb73bda2e),LL(0x8eadb8c9,0xe9eaef42),L_(0x2345e24e),
+ LL(0x9fe296bd,0x41f15f29),LL(0xaa889c09,0x8ccda12e),LL(0x6adf563e,0x559edd7a),L_(0xdd414cb0), LL(0x84d15464,0xad8084b6),LL(0xbef296d5,0x3238cf0a),LL(0x0ee342aa,0x074068ff),L_(0xc9f3a4e6),
+ LL(0x374364db,0x4db1a4b3),LL(0x983e29af,0x190ecab8),LL(0xc26d69a7,0x8e174c76),L_(0x2739f19a), LL(0xea361aa4,0x4c902613),LL(0xcd082b89,0xbbc1e2c1),LL(0xa0661a39,0xd0352acc),L_(0x6d5bd738),
+ LL(0x6b165ee3,0x0f46deb2),LL(0xe05a9d3e,0xbaae3236),LL(0x68d899f5,0x2fcbd485),L_(0xd426fbf8), LL(0xfce9e8db,0x70b0b8e7),LL(0xbb075381,0x24c285b0),LL(0xeb323221,0x933c7339),L_(0x90f21e83),
+ LL(0xa437ec78,0x65c3ea6f),LL(0x26f5292f,0x16eebdc4),LL(0x2f10ff0d,0xd0e0dfce),L_(0xe59106aa), LL(0x47d3151e,0x334ef2fb),LL(0xe1d13288,0xa14975cc),LL(0xb2dd6c80,0xe941b704),L_(0x428af6d0),
+ LL(0xac3814f9,0xf4357fa6),LL(0xe9634ed9,0x3e28518f),LL(0x92f270b2,0xb8fe4e04),L_(0x4ce90044), LL(0xc454c0af,0x9137e5a6),LL(0xb5cf536c,0xff154124),LL(0xaa1f4551,0x0024f90b),L_(0x981784b9),
+ LL(0x9e485500,0xb04608de),LL(0x5269aa1a,0x6eb17af7),LL(0x8ce1ebee,0x3d279465),L_(0xc66381e8), LL(0x0b5ed745,0xc4fa7ed6),LL(0xdeb29303,0x601d19f0),LL(0x510a3c8d,0x2ce166ff),L_(0xaa227120),
+ LL(0x1c8b8392,0x992398c6),LL(0xa3c32177,0x98eae201),LL(0xcd19850d,0x70b1a326),L_(0x9505296f), LL(0x958225ae,0x41bcad26),LL(0x0d11515a,0x938c115e),LL(0x04883b49,0x5a5bf602),L_(0x72d1e180),
+ LL(0x597adc60,0x5898ed4e),LL(0x63896a2f,0xa9c6e64f),LL(0x82a0ed92,0x71349776),L_(0x71b9b0ee), LL(0x216fc62a,0xd360630c),LL(0xbd440771,0xa2285bdf),LL(0xa49907da,0x28e79328),L_(0xad498ec7),
+},
+/* digit=21 base_pwr=2^147 */
+{
+ LL(0x9dfbcf8e,0x5e338a94),LL(0x0324aba6,0x9f1b5252),LL(0x970769c2,0x32ea5aeb),L_(0x82c3b64b), LL(0xfeabe87b,0x80346bd1),LL(0x98111ddd,0x63f11cc5),LL(0x2ef9e31e,0x75819a03),L_(0x6e0e0fd4),
+ LL(0xead2c5e0,0xd481d37a),LL(0x676ef7cb,0x83660242),LL(0x6ddd542a,0x4bcdf56d),L_(0x0807b6ee), LL(0x88b2540c,0x99cfbaa1),LL(0x440a4586,0x92cdeb4c),LL(0xaab76f82,0x62bde53d),L_(0x31ca293a),
+ LL(0x88edf264,0x279a665d),LL(0xc73f3e56,0x4837e985),LL(0x51cce02b,0x925d55fe),L_(0xba48033b), LL(0xfbc2fa3e,0x3c3ccfff),LL(0x09219d1a,0xa32d9d41),LL(0x7bba7cbf,0xf5c59984),L_(0x1f9a5c08),
+ LL(0x1175b9ba,0x4079f189),LL(0x150e6d32,0xe9e1ab30),LL(0x8b6cc92b,0x2d425400),L_(0x274ec0c2), LL(0x8f0527d9,0x6d261b01),LL(0x4ef086f3,0x63cc5685),LL(0x29dec1b9,0x7f963f71),L_(0xea97e94e),
+ LL(0xd50b2092,0x9e517139),LL(0xf9867b99,0x32ba3680),LL(0xbd760d63,0xafdf07e9),L_(0xa9b6e9ec), LL(0x8b644aef,0x6d61dc07),LL(0x93df1b2e,0xe8d9afc6),LL(0x3387d03a,0x32d7f165),L_(0x759fb34d),
+ LL(0x41d99c15,0x08345264),LL(0x34f3b1e1,0x17c124bd),LL(0x20468107,0xc8425e31),L_(0xa035ed92), LL(0x19019adc,0x15129a66),LL(0xd78546b5,0x4c880bae),LL(0x2a03f320,0x04faf0ec),L_(0xf88d60ed),
+ LL(0xcbda1d0c,0x99a20d9a),LL(0x31f03c7f,0xc7f9c96f),LL(0xbdab0f5d,0xcfc1004b),L_(0xc665b5f0), LL(0x24cf476d,0x57bee516),LL(0xbaab1072,0xcf987028),LL(0x64de4da0,0xa4efa899),L_(0xb3c284d3),
+ LL(0xec9ac930,0xb6ef6e4f),LL(0x7bd6b2eb,0xf97982f6),LL(0xb87b9f50,0x3506344d),L_(0xe38cc59c), LL(0x0df2358f,0x98614bb4),LL(0x4daab44e,0xa73a33ba),LL(0x3957de53,0xc680567a),L_(0xcfa42f96),
+ LL(0x6e9aa82b,0xad09cde6),LL(0x89749594,0x88dae77c),LL(0x686f22a8,0xe7736848),L_(0xd741b21a), LL(0x9e20d489,0x08ab4cce),LL(0xb87c7bef,0xcc175c96),LL(0x982331fd,0x177b6473),L_(0x63140d6e),
+ LL(0xb3fe0b33,0x061731af),LL(0x785b32f1,0xdee055b2),LL(0xc296cafa,0x1de52e72),L_(0xb10ce663), LL(0xc5a7f1be,0xc6a06418),LL(0x50016567,0x1713586c),LL(0x4502900b,0x2c001a59),L_(0x450b28d5),
+ LL(0xcab8d38d,0xc5913490),LL(0x9e1e0ce7,0x343c325b),LL(0xc5f9091b,0xe7590273),L_(0x44739896), LL(0xee5b12cc,0x449da236),LL(0x3913a8d2,0xd0e8b775),LL(0xd9db43d7,0x0204d37f),L_(0xbcc28709),
+ LL(0xfda66aba,0x0ba00094),LL(0x00c25d60,0x034594b0),LL(0xb0ccb9b4,0xaecf0812),L_(0xebecd41b), LL(0x95fb80f1,0xe2cb6f9c),LL(0xe9f56be8,0x33f77310),LL(0xab12b176,0x77e2c3e0),L_(0xa7a303fc),
+ LL(0xaa4bbfa4,0x0ca6bd41),LL(0x829f1bab,0x9f37381d),LL(0xf8aa85f0,0x63a37ba6),L_(0xe64c6ed3), LL(0xb1db7703,0x9ba22c56),LL(0x14c74bf2,0x26369a5a),LL(0x57cdabdc,0xa2f36ff4),L_(0x69603458),
+ LL(0xd1e5c2d6,0x049ce7f9),LL(0xdda045cf,0x6a8702d5),LL(0xae642723,0x444a4ca8),L_(0xc9e8efd0), LL(0xbc74c0b8,0xee8ff912),LL(0xa5f0a182,0x7cacfd02),LL(0xf34c0a0e,0x0bdcdecc),L_(0xf174835c),
+ LL(0xad6aaeda,0x262941fe),LL(0x50dd89e9,0x052230cb),LL(0x52bfaad6,0x3d3651a5),L_(0x42da9f6d), LL(0x1803593d,0x72f24771),LL(0xfb5c67bc,0xf8d5c69c),LL(0x6f3ebdef,0xa8074e96),L_(0x5d95664e),
+ LL(0x3cfb3680,0xfbd1a191),LL(0x14bfa4e1,0xd4f7de76),LL(0xf38ce345,0xfcdb2abd),L_(0x45ebd21e), LL(0x1d84093e,0xb59f480a),LL(0x3957e934,0xcc218197),LL(0x7c1b8e5b,0xe4604f76),L_(0xc58f2c48),
+ LL(0xd2d407e1,0xc8a88d72),LL(0x21606f53,0x9385e572),LL(0xfba9c9f7,0xfb7d83f0),L_(0xf57dce48), LL(0x37eda284,0xfb80fd4f),LL(0xc8023a07,0xf3549107),LL(0x71a25cd3,0x7a9a0b44),L_(0xb3c48734),
+ LL(0x885801a9,0xf3798b62),LL(0x9856b7c0,0x08f77ad9),LL(0x04ab2722,0x471ef449),L_(0xe5f3587d), LL(0xc09f1c74,0x21b96d5c),LL(0xb0c73d23,0x5e2a228b),LL(0xa3366107,0x69323a1b),L_(0x759bf017),
+ LL(0x11492138,0x80978740),LL(0x4e3559fa,0x456876b0),LL(0xe7559081,0x56ad6e70),L_(0xdd9852be), LL(0x8ce4faa0,0x0e7594de),LL(0xe4523a8a,0x3999a1a1),LL(0x4a40d4e5,0x8ca5687b),L_(0xfaf902fd),
+ LL(0x854da328,0xd2ade9c1),LL(0x683ea003,0xb2369f45),LL(0x6bbf8ead,0x26a2a12e),L_(0x65fa7d53), LL(0x44971ebd,0x6154c3a8),LL(0xd7f809d8,0x9e3b11ad),LL(0x20ed9167,0x24d19af8),L_(0xa692a83a),
+ LL(0x26ad917a,0xd8e0ff42),LL(0x90e27172,0xd10a1313),LL(0xa90bf44d,0x8cb2abd0),L_(0x130d21df), LL(0xea4790cd,0xa3cb4c6a),LL(0x65186f8e,0xfd47c901),LL(0x0c9c373c,0x3514478f),L_(0x5307b692),
+ LL(0x80001060,0xd8568305),LL(0x34f0a25d,0x6a578b8b),LL(0x039f50cc,0x0eadf2ee),L_(0x6a3cf739), LL(0x8ca51f3b,0x6a9a2a61),LL(0x5c707fb6,0x92f53d4f),LL(0x22360abf,0x756df232),L_(0xa7a12676),
+ LL(0xa54ee092,0x232b0eae),LL(0xfac26fa0,0x2030a397),LL(0x91c0d8b3,0xc85b9885),L_(0xcd36972d), LL(0xf99f3cb8,0x2b28cccb),LL(0xa2197bb4,0xd5dc11dd),LL(0xb00034b6,0x22200d9d),L_(0x398b8d08),
+ LL(0x48067657,0x3e7e898a),LL(0x14230734,0x429f6872),LL(0x7bef4c47,0xe3a1abc8),L_(0xb3564180), LL(0xb41998c2,0xeed81406),LL(0xa7ce6e62,0xe40d75be),LL(0xf02dd5b1,0x9d22967d),L_(0xa3ff259d),
+ LL(0x669ca4f5,0x25d2230b),LL(0x2d777318,0x7178f19a),LL(0x80147bac,0x6f460f52),L_(0x22279805), LL(0x7e64abfe,0x20550e61),LL(0x7880c924,0x79d1e82f),LL(0x6428d5fc,0x9a19cfda),L_(0xd1beb76b),
+ LL(0xba10e2eb,0xe36b37d3),LL(0x5d87cbda,0x2be422df),LL(0x404781e8,0xc8f5e0fe),L_(0xa1bc9eda), LL(0xd68a56ff,0x23299058),LL(0x970d11fc,0x7d7df62c),LL(0x785e8445,0x8ed8b412),L_(0xbad1345d),
+ LL(0xea68889d,0xce7aa168),LL(0xd74f6437,0x77a09f9a),LL(0x1f1dc772,0xf497718e),L_(0x36827efd), LL(0x53f8a4a5,0x978b617c),LL(0x4cb29feb,0x11c9e4d8),LL(0x6a64b734,0xe04077a2),L_(0x86b8cf3a),
+ LL(0x81d83b84,0xed710d97),LL(0x3a39d170,0x9d798cd7),LL(0xef236d5b,0x0683a7e0),L_(0xb9141322), LL(0x295bb2f8,0x05109f73),LL(0xdade7c00,0xb994c8eb),LL(0xf251df45,0xc11452de),L_(0xb48e9a05),
+ LL(0xab19c0be,0x4aaf45f4),LL(0x17039bf0,0x12b12bdf),LL(0xb97b72ee,0x30ce8053),L_(0xa7a81755), LL(0xa5e18f4a,0xc81db67a),LL(0x80753cae,0x1c4a9982),LL(0xe3019a4d,0xd1c81400),L_(0x80f8c3da),
+ LL(0xeb75d498,0x165046c8),LL(0x030a06a1,0x232d37a1),LL(0x09c6053c,0x3932bda3),L_(0xcb39f998), LL(0x95de7723,0x87fe7976),LL(0x0499f81d,0x216feab0),LL(0x7ae298d0,0x2959c264),L_(0x1edb6b93),
+ LL(0x916476f9,0x6ab52744),LL(0xdc732139,0x45a91c78),LL(0xbd7da6c3,0x5ac1ef95),L_(0xe2e0217e), LL(0x874209cf,0x63f9997a),LL(0x5cecf1c0,0x9d1320f0),LL(0x5082d35e,0x7b11e2cc),L_(0x04cc9aa3),
+ LL(0x481e157c,0xfecff2a6),LL(0x4f8b44cc,0xa01ff932),LL(0xd783714c,0x9c0232a4),L_(0x90d1c36e), LL(0xad070ffb,0xbd5e004d),LL(0xf22c1c14,0xec3d0dd1),LL(0x77b24ec6,0xc4fac858),L_(0xf15be1db),
+ LL(0xa4425706,0xfa634b73),LL(0xc11ab7e2,0xe2196b67),LL(0x39a0b0f1,0xa62656eb),L_(0xdf5e8e89), LL(0x10e754f8,0x35af495a),LL(0x059e7fc2,0x8885a6c4),LL(0x5721bb41,0xfcc7a8b4),L_(0x18530aec),
+ LL(0xce8caf63,0x1efc0864),LL(0x7e7fb20d,0x45a5d6d7),LL(0x319cbee0,0x32603543),L_(0x216780a7), LL(0x728ec24d,0x771c5008),LL(0x332b0e8d,0x88a3ec11),LL(0x27842539,0xfd61d211),L_(0x176fee74),
+ LL(0x636c68f5,0x6d5e6c03),LL(0x8f5f36df,0x99e754bc),LL(0xff864830,0x04fc8d4b),L_(0x35ae923b), LL(0x8c2df569,0xd03159ad),LL(0x6c4574ce,0x802cc48f),LL(0x95e44ad6,0xecc940e1),L_(0xacd13e60),
+ LL(0xaeaeda46,0x24bc05c7),LL(0x55d8d9f7,0x6d33fac1),LL(0xba1700c6,0xb1dbe56e),L_(0x12671c92), LL(0xa3906992,0x7c873618),LL(0x28f4b581,0x5d43aa50),LL(0xc27395ee,0x31a82a43),L_(0x84bd2bdf),
+ LL(0x85fa613e,0x19e04eb7),LL(0xd6d7b2f3,0xacf5f895),LL(0x7d71e73c,0x5dd55589),L_(0x6b4ddaaf), LL(0x5cbbc28d,0xb3874051),LL(0xb395499e,0xf0404258),LL(0x56ce4cbb,0x5961b289),L_(0x2960f1ca),
+ LL(0x08af573f,0x739615c5),LL(0x72405988,0xdcdfa5f7),LL(0x03300371,0xe254b688),L_(0x6195855d), LL(0xe4e87561,0xd298a295),LL(0xf9205a13,0x156d1dbc),LL(0x11ffb781,0xe00ca07c),L_(0xd638a7b0),
+ LL(0x9e23a234,0x970fe955),LL(0x62d115d2,0x4374bbb8),LL(0x4db47695,0xb3652081),L_(0x6565367b), LL(0x49a6f033,0x53a17dff),LL(0xbb00a05a,0xef6118bc),LL(0xc7f0a623,0x2971e39b),L_(0x091d591c),
+ LL(0xde40fbc4,0x3c51221c),LL(0xd273fed4,0xda08dbf2),LL(0x7eaf4c1f,0xc3cadac4),L_(0x155b21cd), LL(0x8e6c2580,0x824bf439),LL(0x6d0eb93f,0x16f47b06),LL(0x2b5af50d,0xe79201e3),L_(0x50f56685),
+ LL(0x2cbaab9e,0xaf65e93d),LL(0x64cb8361,0xdcc125a4),LL(0x2b08724e,0x5d31d941),L_(0x128434b7), LL(0x11800db2,0xd87b7933),LL(0x6349bb61,0x41b8d379),LL(0x8eabd8ce,0x46f9abc2),L_(0xf5ec4590),
+ LL(0x226b273d,0xde41b0d7),LL(0xfcdd55ff,0x16980cb0),LL(0x5f8a8d74,0xad3ba05b),L_(0x5c84894a), LL(0x8dc5f338,0x1041454e),LL(0x7425541f,0xc1a5e43c),LL(0xf6c08550,0xbe1bce56),L_(0x48f611af),
+ LL(0xf3ceb53f,0x31e207aa),LL(0x505aaa25,0x7b5d7c2b),LL(0x9df3ed0d,0x6ff3aa7e),L_(0xecdfa689), LL(0xe6296cd5,0x4660e301),LL(0xaac1b188,0x8e86f81b),LL(0xe2709e66,0x1690d7e4),L_(0x9ad43bd5),
+ LL(0x31a8090d,0x9e4966d9),LL(0xe9803ed7,0x2923afcc),LL(0x94a51c0a,0xc6ffb2f1),L_(0xac8d73e5), LL(0x7e9362e3,0x87ee51c6),LL(0x0f2f29a5,0x9df72731),LL(0xcf07fe4d,0xf7993328),L_(0x11a086fc),
+ LL(0x366308d2,0x482c8576),LL(0x7008cc6c,0x04061b0e),LL(0x4ea34321,0xea139dd1),L_(0x0db793be), LL(0xd163362c,0x2f88c485),LL(0x46daeb88,0x20d2b379),LL(0xa9529777,0x8fc9a2fe),L_(0x685903b2),
+ LL(0x4733e75d,0x160fbbaf),LL(0x85dc20a6,0x8dfd433f),LL(0x40ce263c,0x33ee3772),L_(0xf18c955f), LL(0xbc745c54,0x7c56f68e),LL(0x629b2ed0,0x7ba316a5),LL(0xd3751f88,0x9be35b3d),L_(0x87658375),
+ LL(0x65718fca,0x4c71f19d),LL(0x2e6a930b,0x58ad9bf9),LL(0x6ce370be,0x9c7c9090),L_(0x9fe1a225), LL(0xd3e1755a,0xdfc19acc),LL(0xbc4095c2,0xeb61289d),LL(0x102343b7,0xa07aed0a),L_(0x75593f8f),
+ LL(0x892da157,0x6e87ec4f),LL(0xe6abe1ed,0xe3973fff),LL(0x32e1d48d,0x9c1aa3b0),L_(0xbc16fee9), LL(0x64341200,0x1a098c5d),LL(0xa549cfc8,0xabb4ca0a),LL(0xdccd7aa4,0xe2b2179c),L_(0xf0addee3),
+ LL(0xa357e9f5,0xec32e6a1),LL(0x4e4d505b,0x0d55532a),LL(0xd584c5e2,0x708100e5),L_(0xf05981fa), LL(0x9188d927,0xff71c065),LL(0x30b8c50e,0x099da401),LL(0xa5cf657a,0x00705bdb),L_(0x003593a1),
+ LL(0x634a3d0c,0x1e13fadd),LL(0xbfa0d04d,0xbc86e569),LL(0xcc81bd28,0x39bdb34f),L_(0x7ba2330c), LL(0xa09b0aa7,0xb5b45e68),LL(0xf331bfd7,0xf478e7fb),LL(0xdd8ec1b5,0xb3f734e7),L_(0x9064cd97),
+ LL(0x156f54eb,0x6a4afc5f),LL(0x4194a70e,0x4e2a403a),LL(0x523cff28,0x03d08e2c),L_(0xa27e7edc), LL(0x994e73a6,0xfc7c7e86),LL(0x38873c54,0xa0320256),LL(0x805abf3c,0x414e3976),L_(0x93991ee1),
+ LL(0xcf5e586e,0xa5d47503),LL(0xb3fe93fc,0xcd1bfca9),LL(0xb7d168b6,0x4a438e8c),L_(0x581ebd7a), LL(0xbbc7084b,0x1e7c3d14),LL(0x7749a42d,0x66b2f40c),LL(0x86e109ed,0x853c9b29),L_(0x069c5f0b),
+ LL(0x51236167,0x2fb43299),LL(0x2b3c8790,0x48986b12),LL(0xc7e0dd08,0x9d9741bf),L_(0x51f341ad), LL(0x9e792a48,0x6eb8a76d),LL(0x1cd0ce38,0x20f5141d),LL(0x2698a77b,0x3099a97a),L_(0x6b8968f5),
+ LL(0xdcec6ecf,0x5f3a4ac2),LL(0xf86e098a,0x8c8b8e0a),LL(0x3194f379,0xc98e48aa),L_(0x886d05b8), LL(0xe568b10f,0xbd9be136),LL(0x488df6bf,0xa20174d8),LL(0x9833b00c,0xfb9f6810),L_(0x5fb8ce68),
+ LL(0xb887fe68,0x0996c579),LL(0xe74e34d6,0xdd48ea52),LL(0xbc8f1cc6,0x49ddbd76),L_(0x3e421dda), LL(0xd57b1ea4,0x2fcb399b),LL(0xf599d67b,0xde52325a),LL(0x1de7c3a8,0x60ffdfcb),L_(0x41018e1d),
+ LL(0xda8c07fc,0x5803c900),LL(0x1834f6f5,0xab321f3b),LL(0x0269aa98,0x51b8942e),L_(0xbd9cdd7b), LL(0xad131077,0xf11dba7e),LL(0x62d1e404,0xf313e57d),LL(0xa355486e,0x3e7a1a96),L_(0xa6d151c2),
+ LL(0x7855f86c,0x5bfcbb65),LL(0xd3cf6d12,0x06e90560),LL(0x509c593c,0x36beb1c6),L_(0x50bb9be7), LL(0x89a08a0b,0x461e9080),LL(0xf6ebcef8,0x278adf68),LL(0x53fb4ce1,0x1d3a4bb3),L_(0x84afbe92),
+ LL(0xda5ddb0e,0x36690883),LL(0x66809ebd,0xa2cf5571),LL(0x6d7b75a0,0xb7561328),L_(0x7a0b342b), LL(0xdbdf8401,0xc6b75bd0),LL(0x8b464a87,0xbcc0ebce),LL(0x145091bc,0x33cace99),L_(0x723fe6fa),
+ LL(0xcfc2a3f9,0xfa386bf6),LL(0x5ea0874e,0x7749b51c),LL(0xa8387298,0xbc4e6a04),L_(0x02c73e59), LL(0x42c5707c,0xa4b7c2f1),LL(0x2fdbbf21,0xea7c0fdd),LL(0xb933bbc7,0x874e47bf),L_(0x4c88b532),
+ LL(0xc90a29b6,0xb79dad0a),LL(0x94b27e28,0x833287b1),LL(0x47dac83a,0xb3a5c35a),L_(0xace3bd6b), LL(0x318b5daa,0x0d91b2e7),LL(0x00f91b6c,0x2490c7d0),LL(0xd6d7f96d,0x390f1d25),L_(0x92ea6b8b),
+ LL(0x4f12bc87,0xa7f8fb95),LL(0xf0e6068b,0x6fd2151b),LL(0xed56b92b,0x64cd2ac4),L_(0xd3d78730), LL(0x6abfc96c,0xf0d95041),LL(0x8db9e812,0xa3638d2c),LL(0x6447eba8,0xd45b6fa7),L_(0x3b769af7),
+ LL(0x54f9cda5,0x26f167e9),LL(0x8aa2617b,0x869821a5),LL(0x52ead3d1,0x41988291),L_(0x5273a693), LL(0x32358d32,0x18ca4d80),LL(0xb1bbd253,0xb8619557),LL(0x58878e33,0x64d8aee8),L_(0xe8908e43),
+ LL(0x64ed9a67,0x5a517622),LL(0x6d83d019,0x742a30e3),LL(0x969711c0,0xa7fc9902),L_(0x225d81d7), LL(0x8b9e5575,0x25981f3f),LL(0xe02b87e7,0x78b544b4),LL(0xaec410d7,0x35630262),L_(0xb1115eaa),
+ LL(0xb95b1070,0x83f05d8d),LL(0x4dc83cf2,0x225fcf2b),LL(0x523db1cd,0x09d299d6),L_(0xe968d6f7), LL(0xb132ecd5,0xa5406081),LL(0xc545ab6a,0x645c2ab4),LL(0xcf6e254a,0x592bcabb),L_(0x599530e8),
+},
+/* digit=22 base_pwr=2^154 */
+{
+ LL(0xda598881,0xa46f08d8),LL(0xb9fe1aa5,0x4cf987a8),LL(0x32c26e96,0x1b37edc0),L_(0xcc6e653e), LL(0x8ea05891,0x37d78fa4),LL(0x44dcd6fa,0xb6453df3),LL(0x637ed305,0x72834a3e),L_(0x6cab1cc9),
+ LL(0x1ff1de02,0x2efe30a1),LL(0xd9e804cc,0xfc2c0f38),LL(0xb9c440fa,0xb6ba8131),L_(0xd2f7d77a), LL(0x60e1b4f3,0x88842b69),LL(0x96f7f20a,0x008db8f2),LL(0x9a618fff,0xf13ceac5),L_(0x6577f60c),
+ LL(0xd0b89306,0xbd482556),LL(0x1653fafd,0xc3361427),LL(0x39c09ddd,0x10b62eeb),L_(0x79f6d014), LL(0xd744c03c,0x78d81b00),LL(0xe8963c96,0xec51067e),LL(0x8c8f6a4c,0x63b70385),L_(0x551fa28d),
+ LL(0xf611c717,0x433a33e9),LL(0x2417a7ce,0x5f8001f9),LL(0x1d9155b1,0x7a6ca298),L_(0xd78e16eb), LL(0xc11dfcf9,0x3ab289c1),LL(0xee48adb0,0x14996507),LL(0xc998c5c9,0x8dd6fbf2),L_(0x959f66af),
+ LL(0x82c3a705,0x23a0b239),LL(0x63c09a4f,0xa1f25d1e),LL(0x021b685f,0x7c69331c),L_(0xb1b0820e), LL(0xf86bcb46,0x81992f9e),LL(0x370cbdbc,0x0d158241),LL(0xeecaf1b3,0xaeba071a),L_(0x5ebd44d9),
+ LL(0x17d040bb,0x193df858),LL(0x7a008e70,0x858d93f7),LL(0x8d7ec281,0x81377001),L_(0x3062b2db), LL(0xffd70fd5,0x11e91ce3),LL(0xdb62847d,0xf3cecc63),LL(0x9a492d59,0x42b1e033),L_(0x3c5e448f),
+ LL(0x9609b50b,0x48abe62e),LL(0xf00a790d,0x5b827b1e),LL(0xe9c56ab8,0xcfc6643d),L_(0x7a101d9e), LL(0x63e008bb,0xe901d5c6),LL(0xc8b5cd29,0x26d03ac2),LL(0x5a6c0d3c,0xf3eacfba),L_(0x437c7e62),
+ LL(0x42de8327,0x7ef25e15),LL(0xc3c0b7b4,0xf84d2f14),LL(0x2d411980,0x9d372287),L_(0xb86b3e9a), LL(0x7f225094,0x6682e29b),LL(0xc7ddb5da,0x7638e99e),LL(0x80ad8746,0xc5272ca9),L_(0x67e42112),
+ LL(0xb19ef327,0x2db21213),LL(0x26d65fa2,0xa797a69c),LL(0x27bc92ce,0x780c1507),L_(0x62bfbfb4), LL(0x02fe91fa,0x90f53f41),LL(0x306b2065,0xd9ad25ed),LL(0x70add874,0x97f0fe05),L_(0xef3f82de),
+ LL(0xf3beb3c0,0xdb734eed),LL(0x49ac57da,0x4035d15e),LL(0x0575235f,0x12e6b4bb),L_(0x84ba90a7), LL(0x2a740735,0x2e72cdc8),LL(0xde178a6e,0x32f40243),LL(0x2c8f9b53,0x04316bb2),L_(0x4d9021c4),
+ LL(0xbcf71c73,0x4a88c71f),LL(0x7c1da7fb,0x646fc8a7),LL(0x7be262ad,0x26f4415e),L_(0x8d16df29), LL(0xbe32e30e,0x6e047967),LL(0xf7050746,0x935f128c),LL(0x40048ee7,0x671c053f),L_(0x7e714450),
+ LL(0xa89d04f2,0x126208fb),LL(0xc3f913fb,0xcea88f22),LL(0x81ebbd24,0xfbf9d09c),L_(0x60be0397), LL(0x554a7a99,0xab78592d),LL(0xee7a8b54,0xbca7876a),LL(0x58636e68,0x5cb0cea7),L_(0x56d9eb18),
+ LL(0xf22ebb87,0xe2adb3e2),LL(0xe08bf721,0x9944dfb5),LL(0xcf7b1348,0x88809e01),L_(0x9dd0883a), LL(0x57335ddf,0xfb2d7aec),LL(0x9e8ac3f6,0x91eff023),LL(0x3aa9be67,0x87a97238),L_(0x56210cb7),
+ LL(0x88f902c7,0x515e6712),LL(0x989ff215,0x47c3afa5),LL(0x8011a541,0x16b0e517),L_(0xc8b38bfd), LL(0x4bc31c65,0x23c98753),LL(0xc13358b8,0x3b82c767),LL(0x5edc147b,0xae944131),L_(0xbf36526b),
+ LL(0x8561f47c,0xbb74f4a2),LL(0xf57da9fb,0x4788db1a),LL(0xe6c34f9a,0xae99e920),L_(0x72b76a37), LL(0xbdc2a795,0xd46a4b66),LL(0x377b9f4d,0x1b102f7a),LL(0x2dbc27cc,0x1c0d51f0),L_(0x63d0ccbb),
+ LL(0xf20ce9cb,0x76b14e73),LL(0x5173ac48,0xe87b13ab),LL(0xac29f6c0,0xde2af466),L_(0xbf4405a4), LL(0x5cd87093,0xe0a96171),LL(0xc72bdfba,0x6f175bde),LL(0x14f78dd7,0x2c991165),L_(0xf55ecef7),
+ LL(0x94e2d286,0x6d393d5e),LL(0x05e626ee,0x250d4b04),LL(0x225ed4d7,0x53d41ea6),L_(0x5d5b37e5), LL(0x6770d691,0x70c4e492),LL(0xf4527dfb,0xdeeb2466),LL(0x1522deea,0x333509e1),L_(0xad711cce),
+ LL(0x5bd9660b,0x072fecfa),LL(0xba0c11d9,0xeac96039),LL(0xa6fa784d,0xa105395f),L_(0x3a914aba), LL(0x7ecb3cf0,0x5b5ec37c),LL(0x6c8c0e8b,0x8123cd86),LL(0x79696f79,0x69daa4dd),L_(0xbf1748ba),
+ LL(0xa78decff,0x16919c0f),LL(0x43014c2d,0xfbc474bc),LL(0xd14b6a12,0x6d705b75),L_(0x395d7526), LL(0xa7378944,0x4c3aec7f),LL(0x3f4fd283,0x8737fb98),LL(0x4114b4f9,0x6a63c71b),L_(0xcf962aae),
+ LL(0x99ce3cf2,0x085cede3),LL(0x39a2603a,0x87ec3837),LL(0xb203a75d,0xbdc1e809),L_(0xf3640f89), LL(0xd93d4aae,0x8d9d5264),LL(0xd480817b,0xd455e58c),LL(0x8492b58b,0xe3368ba5),L_(0x24b8bfe6),
+ LL(0x5ec2512d,0x64ef9737),LL(0x6907b7bc,0x78d38667),LL(0xf6e9c509,0x33b42737),L_(0x55ab9706), LL(0xfaa748d1,0xf586dde6),LL(0x76b6d961,0x154becfd),LL(0xad1c2111,0x13031322),L_(0x1f36dd8c),
+ LL(0xa1af32ba,0xe83a229c),LL(0xe6ae70d0,0x4ec7d7fe),LL(0x5b9ca0d3,0x06479e73),L_(0x17cdf808), LL(0xad7c2138,0xd020f0ab),LL(0xca397995,0x85bbbbc2),LL(0x70369103,0x3d37e46a),L_(0x67d7bcef),
+ LL(0xb1610c52,0x920986d3),LL(0x9e2b8580,0xbe1fdaa6),LL(0x1a1086a7,0xf038b9fd),L_(0x76630d46), LL(0x62b5dc1c,0xf2780d63),LL(0x479ba46d,0x97c26f70),LL(0x41a1c690,0x953b6640),L_(0xeee5927b),
+ LL(0x50cfff54,0x7a6dcf7f),LL(0x2905feea,0xd9932f1f),LL(0x5bba1fd8,0xd274195e),L_(0x596a73e6), LL(0xd4297f7a,0xfa2e2812),LL(0x83723184,0xc5b16141),LL(0x21f09629,0x7ce090e3),L_(0xb6dc2849),
+ LL(0x7d63db18,0xb254b1d4),LL(0xfee577f0,0xaf830093),LL(0x6accfc0b,0x775f693f),L_(0x483bf6a8), LL(0x0e851bfe,0x74582d9f),LL(0x6731bfc7,0x7ffa6bf2),LL(0xf7d39569,0xa67faa6c),L_(0xc9418804),
+ LL(0xf9316a6d,0xb5eb4f28),LL(0x7a12fe1e,0x8cfe6abf),LL(0x4a7fc70e,0xd820b6bc),L_(0x319719c3), LL(0x54fb2143,0xbd26f428),LL(0x66648099,0x64ab8443),LL(0xb662d063,0x7fbe15d7),L_(0xf16d93b4),
+ LL(0x0457afa4,0x951453e4),LL(0x8f99c3ae,0xfd74995c),LL(0x422aab2c,0xec8547fb),L_(0x73be771b), LL(0xe916d5c5,0x49e82e71),LL(0x7b15c573,0x3a725205),LL(0xaa7e7ca5,0xfd867aa0),L_(0x58e19238),
+ LL(0x31434cbf,0x31e49c5c),LL(0x2d0ee2e6,0xaf660f6c),LL(0x3aaf91fd,0x271cbc87),L_(0xcb833e79), LL(0x520b6d31,0x36952e46),LL(0xf7a6bc06,0x6695996b),LL(0xda163497,0x1f6ccb97),L_(0xb5f271bf),
+ LL(0xa5259a0d,0x606962f8),LL(0x82d18205,0xf314ac21),LL(0x4a97cf98,0xde06a403),L_(0x23969744), LL(0x43ff18b9,0xba5e083d),LL(0x22229508,0x3789db89),LL(0x376f004b,0x1c53a79e),L_(0x8ecb5e4a),
+ LL(0x3757ad7d,0xfde8f5af),LL(0xdaab7a45,0x313f26c0),LL(0x6cba2e40,0x0b7de7e1),L_(0x31db2861), LL(0x90144bb6,0xf98e6b34),LL(0xa8d3e811,0x0ec080af),LL(0xc4961d3b,0x4bad9114),L_(0x10d64cdd),
+ LL(0x1ff6dfd6,0xadd9fbd0),LL(0xca3624bb,0x4c069f73),LL(0x73a43aed,0x91301b03),L_(0xc382f632), LL(0x9d2aab1b,0x83cfddff),LL(0xf9e8d9a9,0x66a4ad61),LL(0xb9fbd92f,0x25a8b014),L_(0x760229d4),
+ LL(0xc29bf199,0x95ce63b8),LL(0x225d1531,0x1e469d80),LL(0xf1862d72,0x143d1930),L_(0x89faba0c), LL(0xac073163,0x36978268),LL(0x2f3bfacc,0x077ad847),LL(0x8ecd6948,0x817ba1fc),L_(0xad14a0f1),
+ LL(0x4b5edd16,0x9cf6404b),LL(0x0fcc7993,0xf9fdd94b),LL(0x94227ce7,0x36c49b8b),L_(0x1add1a97), LL(0x06eb3245,0xddf10442),LL(0x478ddbe9,0xd0e75910),LL(0x598d307b,0xa7d77b58),L_(0x7c2d4285),
+ LL(0x640b82b6,0x6ae40efb),LL(0x7296f54f,0xc265b407),LL(0xbb8c6473,0xa3248f4d),L_(0x096d9531), LL(0xb52d1b77,0x72de2ce6),LL(0x71d14af5,0x2df2b5bc),LL(0x8bb3132f,0xd5a9918e),L_(0x1ee08068),
+ LL(0x7efa31af,0x3a3e84c4),LL(0xdb4c764e,0x41d38660),LL(0x06967d91,0x9a2fe8e7),L_(0x3d0cd72c), LL(0x81428c4a,0x663d93ab),LL(0xd9a81336,0x463057c2),LL(0xe092d510,0x7d2f5c90),L_(0x45eb443a),
+ LL(0x482cdab4,0x29b44f02),LL(0x09859196,0x88f3dd7a),LL(0x274e7582,0x8a9337d3),L_(0xe9cba9ed), LL(0x30787ea1,0xab1d6ae1),LL(0x1aa44fa6,0x72445ee4),LL(0x8201c08b,0x2f9c1703),L_(0xd128d342),
+ LL(0xdf8f55c0,0x04dbb488),LL(0x4b130afb,0xa603695f),LL(0x010d7b25,0xf211bcec),L_(0xb7f03740), LL(0xf354eee1,0x24a2aec6),LL(0xf116e286,0x473d0ffe),LL(0x4b6af9fa,0x974e5b38),L_(0x19cbf327),
+ LL(0x3d701f1c,0x8816e065),LL(0x52f1347b,0xd04d2137),LL(0x733b5b5e,0xe33961b0),L_(0x8db340e4), LL(0x02cb30d8,0x8fdad9c6),LL(0xb3cc8f09,0x63fea3f5),LL(0x36371a82,0x36432409),L_(0x9dd5d017),
+ LL(0x3ac09ce0,0xc45e9f48),LL(0xce25491e,0x0b828bf6),LL(0xf8ea793c,0x27eb6c22),L_(0x6371b206), LL(0xb1d7932a,0x80e32e78),LL(0x61eaf6df,0x8cf6f356),LL(0xdc4f44ca,0x387b7804),L_(0x4b85bf6e),
+ LL(0x1b431c86,0x2c7dc474),LL(0x18a6a123,0x6c31f68d),LL(0x53665bca,0xaa43dbfb),L_(0x8d40fe26), LL(0x7d646aab,0x6723ea8e),LL(0xbade3e08,0xcd9dea27),LL(0xc7adbb73,0x2f3a4dc9),L_(0xa74a2565),
+ LL(0x7fa9020f,0x9ab672ef),LL(0x9cc7bfa2,0xa0040dfb),LL(0x2ac7eb07,0x368be66e),L_(0x5665ccf4), LL(0xba527a40,0xb250a7ab),LL(0x465d7f98,0xa9c591cc),LL(0x8d2b97aa,0x7b979097),L_(0xa50d476d),
+ LL(0x4b3aef47,0x8b68fb1a),LL(0x542fb7f1,0xadc18f71),LL(0xd96b7a34,0xb020cf53),L_(0xdb72531d), LL(0xdf800c86,0xc73ecdcb),LL(0x1c4cd34a,0x47adcb2b),LL(0x039494e8,0xd23f79c7),L_(0xa21edcfd),
+ LL(0x849075c6,0x17c4dc71),LL(0x5ce9dcb0,0xe5cdb7bf),LL(0x25936d77,0xebe08b04),L_(0x70fc7789), LL(0x25213d26,0x7f3546f4),LL(0x7563a201,0xc56c68df),LL(0x10bfdb20,0xdb570af0),L_(0xeb5d3434),
+ LL(0x106086c7,0xef345020),LL(0xd0e87d76,0x18e51b40),LL(0x222e0b10,0xe86e0a88),L_(0x6fa3b5c9), LL(0x410e6c90,0x9da8796a),LL(0xabdf6b2a,0x4fe0bb39),LL(0x7ead1796,0xbbc76905),L_(0x8c71560c),
+ LL(0x7da50c4d,0x890d8ce1),LL(0xb5cc05b2,0x2a181e5a),LL(0x7de1e29b,0x866cd575),L_(0xfc749a26), LL(0x41ec00b6,0x7eaa0bb5),LL(0x886271b4,0x2328a91e),LL(0xed069b46,0x65bd26ca),L_(0x2f59240d),
+ LL(0x4df1cae4,0xd954621f),LL(0xcbae178c,0xdf03015e),LL(0xe71c4857,0x70950b7d),L_(0xc8f7ab52), LL(0xc0de4c81,0x52a1a22d),LL(0x24d86b6f,0x23da02f5),LL(0x70b94a09,0xd450bfb1),L_(0x0d983cdd),
+ LL(0x3e6f9967,0x5619c34a),LL(0x77d8a74f,0x47b1c13c),LL(0x71f4dc89,0xfa0612da),L_(0xb127ccb2), LL(0xcca647d0,0x879fb15f),LL(0x205b4589,0x5e51a2db),LL(0xe8b6c8f4,0xaad791a8),L_(0x1490d5ca),
+ LL(0x1b020bba,0x32c5bb8f),LL(0x28810885,0xc2383a3f),LL(0x2ceffdff,0x14a9a0ad),L_(0x7970ea64), LL(0xc1169c12,0x8708e80a),LL(0xbbf83ccb,0x5a067425),LL(0x5cc8baac,0x800c8eba),L_(0x98c8b359),
+ LL(0x8f103cfd,0x22c84664),LL(0xdbd93971,0x993bf6c5),LL(0x697a6de7,0x6f50eaa6),L_(0x87cb9042), LL(0x9314a935,0x5f70b39d),LL(0x2af4f24a,0xc319862f),LL(0xd8a16a0e,0x8f4571e4),L_(0xa7b9ed81),
+ LL(0xf4ec13c6,0x6e1de980),LL(0x725de358,0x0fffcef7),LL(0x85652ca3,0x50b9f863),L_(0xd5f0033d), LL(0x312ea9c7,0x19c015bb),LL(0x948391b7,0x92417df8),LL(0xaf6e5ed6,0x33c66538),L_(0x96bfa703),
+ LL(0xab942a96,0x069d03c0),LL(0x47f60293,0xc848a1bd),LL(0xc32780f6,0x3bfeba8e),L_(0xc2e0eb4e), LL(0x4521b895,0x29bd4112),LL(0xc233f03a,0xe259118f),LL(0x574da3b6,0xf4f6a7ac),L_(0xae0e0260),
+ LL(0x16cf432a,0xbb8f2924),LL(0x5a087018,0x455c67ee),LL(0x8c5485dd,0x351ad0f1),L_(0xf7d7679e), LL(0x318e4ede,0x2bdc4896),LL(0x277bcf81,0x8b26b0fb),LL(0xf147c5b4,0x87185cc7),L_(0xdf48c9e6),
+ LL(0x196afebb,0xdb75cc0f),LL(0x17222dc7,0x225c2aa1),LL(0x3dd256a1,0x3a012a3b),L_(0x7ec5696a), LL(0x25bf2c5f,0x9381bed5),LL(0x4f4cdfd3,0x0f7e0324),LL(0x7b5b13a4,0xbf5f2e84),L_(0x2639cce3),
+ LL(0xf2e480ae,0xdb334a58),LL(0x6da64943,0xe10cd107),LL(0xfce96a35,0x6ad5dfad),L_(0xa599a89e), LL(0x26a35a0e,0xeddc6625),LL(0x2ef746d1,0x5f6fe79f),LL(0xa912c3f0,0xd6859ab6),L_(0x1ac3aba5),
+ LL(0x705906c9,0x0e5c7c8c),LL(0xb050ceeb,0x5f2aa907),LL(0x53e4bd2f,0x710688b3),L_(0x19a215e7), LL(0xb2485b2a,0x9a042c99),LL(0xd22cc140,0xf04c2421),LL(0xb5f7e2eb,0x7f1f59f8),L_(0x154453dd),
+ LL(0xc0354be0,0x9473341b),LL(0x9f33393e,0xb5b4c257),LL(0xb3dc51a3,0x09fb2116),L_(0x0ee5b84f), LL(0x3e9814a0,0xf91ac675),LL(0x816d6ca6,0x506f79fd),LL(0xc0c5edef,0x0cfcd5ed),L_(0xb71c05e5),
+ LL(0x400799f5,0x17c9bd2a),LL(0x4c0897b1,0xd4538ae6),LL(0x7a16a169,0x0f41e0dd),L_(0xa88a35f1), LL(0x4037d80f,0x5e5fc718),LL(0x85b8baf5,0xee15dcea),LL(0xd33b70cd,0x5dd4f3b8),L_(0x5ddf49c1),
+ LL(0x0095bcdb,0x795a3892),LL(0xedb3e7f2,0x6c1761f4),LL(0x33c80575,0x26818153),L_(0xf7414144), LL(0x943d7d31,0x6f311ca0),LL(0x24d6e452,0xe928eca1),LL(0xe7193165,0x66d1a963),L_(0x89fa62a1),
+ LL(0x8faef020,0x375aa47c),LL(0x70c638b9,0xc033edb6),LL(0xf167acbd,0xddf9d01a),L_(0x364bf41a), LL(0xf8bb63ab,0x7d82f66c),LL(0x8862080b,0xedb30cf7),LL(0x0448ac9c,0x4dbdd638),L_(0x971eaebd),
+ LL(0xad55ab2a,0x30f6e053),LL(0x4b4739f2,0xa878cbee),LL(0xd62b9aef,0x3bbafe26),L_(0xb84b80ac), LL(0xc8ef692b,0xd03fc3fd),LL(0xb6803cd9,0xe63bac37),LL(0x81afcd95,0x205a14b1),L_(0x7a0ade0e),
+ LL(0xff50050c,0x2d735063),LL(0x4b1c54dd,0xab849fa5),LL(0xda4629d6,0xe95c14ae),L_(0x6f216326), LL(0x74ba5b90,0x2fae20c6),LL(0x3112101e,0x5e3d1209),LL(0xbce52748,0xfcd465ea),L_(0x53fd0b9b),
+ LL(0x2d491553,0x068c0d92),LL(0x1f9856a8,0x37cee3f9),LL(0x3408da24,0xc9b9b412),L_(0xc63b4cb7), LL(0x74b30760,0xb7836b39),LL(0x200fd925,0x339dec72),LL(0x55a6ddf0,0x2b7f407e),L_(0x0fb2a9d1),
+ LL(0xa824468a,0xe36962f5),LL(0xfae22eee,0x0a42cdab),LL(0xfe866c3e,0x8acadf81),L_(0xa3f599f7), LL(0xcdd076d7,0xe8b6b61e),LL(0xb4b13551,0x46d40c51),LL(0xcdd8f22e,0xb9099888),L_(0xe1b8ed2e),
+ LL(0x60051d31,0x7e8f146e),LL(0x3818b39f,0x4cd2aa83),LL(0x16886905,0xf677bde6),L_(0x022ae138), LL(0x98b45d19,0x5746a458),LL(0xacf62d52,0x70f9fca7),LL(0x63279bc6,0x4ee46705),L_(0xfd285b9c),
+},
+/* digit=23 base_pwr=2^161 */
+{
+ LL(0xf0d700ae,0xbad78996),LL(0xc931bee3,0x1b3ef234),LL(0xe3c1a2d8,0x7cd507de),L_(0x58fc32e1), LL(0x83e229c6,0x01135f5f),LL(0xfb8b7b35,0x8d5e43a4),LL(0x413750b4,0x2dffb3fe),L_(0x6a265953),
+ LL(0x8c78030e,0x796bb2af),LL(0x56c1932c,0x7d56b42a),LL(0xf443c29c,0x6ff56bc3),L_(0xbdd22bb5), LL(0x95857542,0x21178547),LL(0x22575d25,0xbdc732f6),LL(0x7ffb29d7,0x4ffc71d3),L_(0xd6ef14c3),
+ LL(0x3a92228c,0xbc9613ab),LL(0x5920119c,0x304f1f53),LL(0xc3d2b2e2,0x9633ba13),L_(0xe7d31665), LL(0xc95ebff4,0xe622933c),LL(0xec5df7bb,0x9abfde78),LL(0x50f7f156,0x7feb42b1),L_(0xeb17ef8e),
+ LL(0x25b9b992,0x1a08721f),LL(0xeeddf997,0xbf152cb2),LL(0xb6ad560a,0x3c761d64),L_(0x52dd9f57), LL(0xc0d79f78,0x39b5966e),LL(0xca15f167,0x562740a0),LL(0xea78b847,0xd9642afb),L_(0x37eea476),
+ LL(0xd57560f1,0xda4b72e5),LL(0xa3072640,0x68c344ac),LL(0x36a057e0,0x4754e3c5),L_(0x4faa9820), LL(0xe786962f,0xf20160bd),LL(0xa80ee38d,0x77ea80d1),LL(0xc8e173dc,0x665dbf2e),L_(0x2aba1be0),
+ LL(0xb6e8e52b,0x228ed7a9),LL(0x2d501abf,0x5d4bca44),LL(0xe4f5d2f6,0x3dad807b),L_(0x0b4aa28f), LL(0x006c4c0f,0xe672b21f),LL(0x0888b653,0x614c5f64),LL(0xa3e477ae,0x226f83cd),L_(0x0afdcedc),
+ LL(0xd5a1f5d3,0xe7476654),LL(0x562eb536,0x7a0ad378),LL(0x7f5bedc0,0x2887f756),L_(0x8581b7e9), LL(0x9986fd24,0x160c3504),LL(0xdde60b62,0x06b5ca84),LL(0x8a8ca29b,0xb94770da),L_(0x3ecfeca1),
+ LL(0x28c355ca,0xb615d5a7),LL(0x8ea9ecfb,0x2c8d2d4f),LL(0x6be624fe,0x7f81ee5d),L_(0x45035a93), LL(0x97611fa5,0xc3d23100),LL(0xe9c562fc,0x3ccce59a),LL(0xf451c22a,0x6ee17a32),L_(0x932ddcfa),
+ LL(0xfa127ca0,0x6337e908),LL(0xe970ce2d,0x839c1246),LL(0x58d5ae88,0x253afb1a),L_(0x88db9fe4), LL(0x4550894d,0x3d74de43),LL(0xa90b033e,0x46e1ab37),LL(0x132dd86c,0xed163aa4),L_(0xc88fa0d9),
+ LL(0xf244b8ec,0xa0e34d4b),LL(0xa5b69894,0x9ac53a57),LL(0x495e2cc1,0x987653cd),L_(0x5e895b41), LL(0xf2fd1824,0xf289cc20),LL(0xc41882ef,0x6ce96956),LL(0x3329b3be,0x4acf73b8),L_(0x9efd2db0),
+ LL(0x3bb5fbc8,0xdd8e91ba),LL(0xf8f6f870,0x8acac0fe),LL(0x728bf4b5,0x93d4067d),L_(0xb9c4891b), LL(0xaef29279,0xf8bf9b95),LL(0x1e5e8506,0xdf786531),LL(0x11821ebf,0x99083ad2),L_(0x7e9d0c84),
+ LL(0x83dcfec2,0x85547390),LL(0x48ab6926,0xc7ed1aa0),LL(0x1badb306,0xdd5f7613),L_(0x4641e82a), LL(0xf53ff561,0x3d43a296),LL(0x58c32dfb,0x7b2e7561),LL(0x3ffcd8f7,0xc250c17a),L_(0xfacc3394),
+ LL(0xda8507d4,0x99456e76),LL(0xe9a40562,0x9ba62d11),LL(0xa165351f,0xd0dd1798),L_(0xbabb6293), LL(0x853dcb7c,0xb83a079a),LL(0xa5cd33ea,0x26c9aa1e),LL(0xf120f051,0x6109e625),L_(0x774354d8),
+ LL(0x14c27c7a,0x8d82b0bc),LL(0xbafdf31f,0xe88bea46),LL(0x7639e998,0xd2a8308f),L_(0x3be638b1), LL(0xc5e7e09d,0x54bc114e),LL(0xeb650088,0xd1baff80),LL(0xebdef489,0x902bb33d),L_(0xc3e46171),
+ LL(0x45911106,0xc86362a5),LL(0x56cc1bef,0xce560fcf),LL(0x3b4b4fc8,0xf9436f6d),L_(0x370a01fd), LL(0xa8fad83b,0x632c516d),LL(0x916aa8c7,0xae217497),LL(0xe3ad18e9,0xe18b971a),L_(0x72c7e5a4),
+ LL(0x9b05d089,0xb483969f),LL(0xf8cf3d39,0xcfd11869),LL(0x1d89563e,0xa602a006),L_(0x91cd1395), LL(0x71d49ace,0xdbdaa432),LL(0x0966d0a9,0x1c3623ed),LL(0x166bebe1,0xf1b4da0f),L_(0x433f9113),
+ LL(0x86d4180d,0x6fb1d5d9),LL(0xd89da757,0x031c30db),LL(0x2939bdad,0xa42134e8),L_(0x6b13fefc), LL(0x1baf8cf7,0xb37f662e),LL(0x413f92df,0xed2b1683),LL(0x985c742a,0x1de586e7),L_(0x5f4904de),
+ LL(0x01f2ea9b,0x03906d91),LL(0xb13c4090,0x9d1c566b),LL(0xf3affee6,0x6830a295),L_(0xb7fc1017), LL(0xa0a0056c,0x45d24eb6),LL(0xcb2d95c2,0x622219f3),LL(0x8c20bcd3,0x3379e3da),L_(0x6dc4634a),
+ LL(0x3e8ae0a0,0xaefdff77),LL(0x97e82574,0xe4ee96dc),LL(0x112d1838,0x20061ca4),L_(0x0060cd67), LL(0x20825ad2,0x11499a1e),LL(0x8b6913cb,0x1c239b7a),LL(0x67ff5e87,0x1680aa3a),L_(0xe823c3ec),
+ LL(0xd6ad0217,0xd3ac8a55),LL(0xd2b4232a,0xf6ddec57),LL(0x1b8abf52,0x2fcb86b4),L_(0x19bc7365), LL(0x1f2c9fd1,0xa051bf99),LL(0x1aec4d94,0x5a88054d),LL(0xfbc4f987,0xa954ceb9),L_(0x05b104cc),
+ LL(0x4ccd6345,0x40690896),LL(0x4799ff54,0x3b0d618b),LL(0xbc95c20a,0xc0b5b3de),L_(0x290686c2), LL(0x488b692d,0xca443d1d),LL(0x6b65747b,0x823770ad),LL(0xf2987b72,0xf039026d),L_(0xb9b37c0a),
+ LL(0x8dd8e6e6,0xd360d772),LL(0xd81505e8,0x994209e4),LL(0x40816745,0xc9836e31),L_(0x9dca53d3), LL(0x07ea2add,0xd820c03f),LL(0xb45d3f5d,0x33d13943),LL(0xedf3a3c9,0xe0ce5e44),L_(0x459a2236),
+ LL(0x3f40e1dd,0x35ffc3c1),LL(0x273c8e42,0x9e607b7b),LL(0xfecec30d,0xda6a8389),L_(0x8e8dc1c3), LL(0xe7f0596c,0x6fe132fd),LL(0xc3565543,0x8889d9c6),LL(0x951334fa,0x770ed88f),L_(0x4d1d476c),
+ LL(0x542a815c,0x20e67927),LL(0x488e81fb,0x7f7fe269),LL(0xd968afb4,0xb0057d32),L_(0xb8d04c1b), LL(0x85a86d34,0xee01ab82),LL(0xef38d717,0x5e5709d8),LL(0x830deaea,0xfba87128),L_(0xbf20a3cb),
+ LL(0x9efe5459,0x15750d83),LL(0x8d8facef,0x4d132c09),LL(0xef0f3af1,0xd1a4206b),L_(0x64ebf883), LL(0x5e56d99d,0x5b6d2c3b),LL(0x3c48ef20,0xce5ccc62),LL(0x153580c5,0x534ba912),L_(0xa02f889c),
+ LL(0x349d9804,0x1f2a638d),LL(0xcb233fe2,0x9d44fa20),LL(0x792d0e00,0x62d03b08),L_(0xd6646af8), LL(0x180ef2f5,0x4a8172cc),LL(0x82199f97,0x401272d5),LL(0xf879213c,0x8048de29),L_(0x51bdf94f),
+ LL(0x9c9a3b84,0x75f12d75),LL(0x743c75d7,0xaadd691d),LL(0xc13528c2,0x0f8f0fc7),L_(0x969b010e), LL(0x9b8f4442,0x2acbaab0),LL(0xdfc6ee9c,0x4678a76c),LL(0x23ac3530,0xc00ef611),L_(0xdfc77ba6),
+ LL(0x3fe1d500,0xd561d679),LL(0xac256d68,0x7e3b2fc9),LL(0xb7f44d84,0x1d8cc6f2),L_(0xddd4acc6), LL(0xccec3e4c,0x83d18ef0),LL(0x6b5fbe51,0xf9877554),LL(0xe616da91,0x04e7aef1),L_(0x7079d8b4),
+ LL(0xacf8b8b3,0xc0f7d69f),LL(0x2242759d,0x0a034401),LL(0x9949d06b,0xde898701),L_(0x8b24618f), LL(0xa9a593b3,0x3976254d),LL(0xb0bd22ab,0x776af23a),LL(0x2125ed2b,0xa5f28d83),L_(0xa1c543ea),
+ LL(0x4bd74e55,0xe7ee1b28),LL(0xf2a06317,0xec3c82fa),LL(0x784961c1,0xf759d96d),L_(0x5670b8e7), LL(0x2db86f19,0xafedb099),LL(0x8fbfe519,0x19d6aa87),LL(0x7246a16a,0x7503e23c),L_(0x23ac9af3),
+ LL(0x952bc75c,0x87836e61),LL(0xc31169c7,0x278dc1c5),LL(0x111050a4,0xa7810165),L_(0x446bda32), LL(0x490d4091,0xa876bcf8),LL(0x32692fd4,0x7e43410e),LL(0xd11e3c6f,0xe2aece33),L_(0xd325fefc),
+ LL(0x209ded15,0x8c31bbf9),LL(0x0e3623bf,0x818a6e0b),LL(0xbb5c266d,0xc5f4aaef),L_(0xa7179b54), LL(0x15383b16,0xed087186),LL(0x375cb291,0xbbe070e0),LL(0x047af636,0x73198d27),L_(0x8f1c0b06),
+ LL(0x4cc95bc4,0x77e38347),LL(0xc22c3ac3,0x83e4ab76),LL(0xea1c777a,0xab8de890),L_(0x8b9d1132), LL(0x959ae60a,0x2a2fde96),LL(0x78f20c5e,0x6184d8f4),LL(0xa11f0041,0x302a6212),L_(0xba7689dc),
+ LL(0x376e162d,0x8c2d9e1f),LL(0x50cda9df,0x7ba9efe3),LL(0xa6158df9,0xadbbeaa9),L_(0x4778c93d), LL(0x4165d3a8,0xd1a49e09),LL(0x6eb6664c,0x276faed0),LL(0xb72ac28c,0xb8fb2671),L_(0xfc493918),
+ LL(0x3f2f65a3,0xe846a0c3),LL(0xc3ffb873,0xb4100b80),LL(0xd98b14c7,0xcd3fcccf),L_(0xec8c8522), LL(0xde06d3b7,0x27093099),LL(0xc435552e,0x5b30c12f),LL(0x731b5ca4,0x6d3545bb),L_(0xcf95c612),
+ LL(0x06a11b1f,0x67e83944),LL(0x77e47a85,0x840987d9),LL(0x41b4a73c,0xf14ab27f),L_(0x45673153), LL(0x5e20b8e1,0x29737735),LL(0x3a31ee99,0xdcbc9d02),LL(0x89cb9a71,0x3c610ccb),L_(0x92d6ab9e),
+ LL(0x7dc21a89,0x24dd0312),LL(0xfe3af3cf,0xbd1479bd),LL(0x1fa695ef,0x49e9da9d),L_(0x35d8485e), LL(0x4caa0416,0x1be78d4d),LL(0x9a8e5ede,0x06a82fad),LL(0xdb4e20a3,0xb9902b0e),L_(0x762073cc),
+ LL(0x26109f70,0xba8c73ab),LL(0xfd983b8b,0xe8f78dd1),LL(0x3921c9f7,0x9c6ee5d8),L_(0x7f5a5177), LL(0x14bbc8be,0xab53e7b2),LL(0x7db07019,0xfff92c17),LL(0x01f9a8fb,0x2588492a),L_(0x9ea1e98d),
+ LL(0x924eb396,0x31997788),LL(0xa9a0407f,0xbc33538a),LL(0x26fdd725,0xa3068d9c),L_(0x2aba0c14), LL(0xfb38ce06,0x6d07282f),LL(0x2d5ed5c3,0x0f9417d3),LL(0x52b3241d,0xdbd63903),L_(0x11f4b8bc),
+ LL(0x88a000ac,0x35994c37),LL(0xccc2b918,0x337027af),LL(0xf27570cb,0x870c688b),L_(0x8c91a8af), LL(0x458bc212,0x5459f2f5),LL(0x9157cd7c,0x7d5dcbea),LL(0x021d9845,0xdbbbf2c4),L_(0x3319b3fc),
+ LL(0x4a370724,0xaeba325e),LL(0xaecdc264,0xaa40e67e),LL(0x9b24587f,0x859c1b6a),L_(0xf7648c83), LL(0x9da1346e,0x7005a3f3),LL(0xdf465967,0x7311149a),LL(0x2411ca0d,0xd689abfe),L_(0x1452c503),
+ LL(0x2a06a445,0xcc290bf3),LL(0xf34968d7,0x65fd04ce),LL(0x7228d7c1,0x48e02e21),L_(0x17e25b2b), LL(0x20f72ec8,0xa53a154b),LL(0x1035d2b6,0x8b5f77f7),LL(0xe8ab36c6,0xbcf0eb3e),L_(0x63fa883e),
+ LL(0xa46b410c,0x0b53b1cd),LL(0x2088982f,0x44825888),LL(0x21364c98,0x45bf87a7),L_(0xeeb978c5), LL(0x77561ed1,0x4e53377b),LL(0x093e9c15,0xe15699a0),LL(0xd8249f4f,0x02b46436),L_(0x64f236ee),
+ LL(0x5bf80f33,0x3940ee66),LL(0x6164d05e,0x98afb7d2),LL(0xb0056da3,0x872642d0),L_(0xa7bd3d66), LL(0xc227063a,0xce37f406),LL(0xd8371363,0x97040937),LL(0x90362154,0x009ca301),L_(0xe59d0b2d),
+ LL(0x812ca945,0xcf247bdf),LL(0x73b26b51,0xb0c27a65),LL(0xdf33ad4d,0x1f6d55bd),L_(0x4ed64955), LL(0xc4a11d3d,0xa18aee15),LL(0x8ca23082,0xbd802f68),LL(0x20da76f8,0x2453f147),L_(0x4606958c),
+ LL(0xfa30299c,0x99950738),LL(0x06b63065,0xbe157ae3),LL(0x9853453b,0x88e04e19),L_(0x456e72cc), LL(0xfcb616c9,0xb168037b),LL(0xd3c22f8d,0xce3f0f0a),LL(0xd989f0f6,0x9699fc87),L_(0x273ac5b1),
+ LL(0x85664bdc,0x273a933d),LL(0x24f52dc3,0xfcf79a03),LL(0x36bc3c34,0x3e91b0cc),L_(0x61de4790), LL(0x58e3b120,0x8f4b6789),LL(0x44bdcadc,0xb12252e0),LL(0x830bedee,0xbb9ac7e8),L_(0xbda5fd11),
+ LL(0x44861e3d,0x37a97134),LL(0x079c1b7a,0x6798891d),LL(0xeaf11509,0x3012e200),L_(0x61b63246), LL(0xa87c42aa,0xc0246bd8),LL(0xb92f89e2,0xed286525),LL(0x3fff4a96,0x44cf1045),L_(0x6e70ae3f),
+ LL(0x5068198a,0x6615d342),LL(0xb3a83dd9,0x0e23ae21),LL(0x0c4c00f7,0x6cbcc29c),L_(0x84d9fe95), LL(0x5e865fd0,0x30e1885b),LL(0x82a4da98,0x5fcfdb20),LL(0xbcc23ab7,0x259db6ce),L_(0x306cf56e),
+ LL(0x3622f7f7,0x08624c7b),LL(0x32c9c5fc,0x01b193ac),LL(0x38295bfb,0xfb49c594),L_(0xdcfe3634), LL(0x103965ff,0x832aec92),LL(0xe5cda111,0xdb928d8e),LL(0x98fc1728,0xac496bac),L_(0x3f057842),
+ LL(0x69b7107b,0x7bdd13e7),LL(0x189dee30,0x5aa65303),LL(0x01cf6016,0x02a07254),L_(0x7f6053e7), LL(0x409cab89,0xc9d79b48),LL(0xd467929d,0xe17deac4),LL(0x2a4257b0,0x3ed68c3c),L_(0x0209a951),
+ LL(0xde7ecacc,0xb50fa3a8),LL(0x568377b7,0x7926440e),LL(0x992fa9d6,0xf3995e07),L_(0xf09351e3), LL(0xaf199c40,0xde00386c),LL(0x7c21c039,0xacbcdf7b),LL(0x983e3f5f,0x970f1581),L_(0xfde7bb8d),
+ LL(0x31d0cb64,0xa5991d35),LL(0x727713ca,0x20cf37ff),LL(0x81781a16,0x946557d9),L_(0x8b2de3fc), LL(0xd1639576,0xb61c0935),LL(0xefe6ec67,0xcaf4adb1),LL(0x0483381f,0xbfd4710c),L_(0x3cb8617a),
+ LL(0x19bcb25a,0xfb2c55b6),LL(0x83398c47,0xe6a45901),LL(0xfc55bdd9,0xd6aad463),L_(0x733b8806), LL(0x4da45d48,0x600c9640),LL(0x72a69c3e,0x7bb5666e),LL(0x25c8da01,0xa863f55c),L_(0x6b73f445),
+ LL(0x8ff6b908,0xb5811bfb),LL(0xdea6b1b8,0x3864ff6e),LL(0x6f29d6ab,0x244c832f),L_(0xb885707b), LL(0x6b307d64,0x19847d9d),LL(0xbb7684f6,0x85f7c9ef),LL(0xc0f2d53c,0x20ef5736),L_(0x9e06880d),
+ LL(0x8c5dd4e2,0x9a3cdc81),LL(0x6fd2d1fe,0x6a09971a),LL(0xfe48b29f,0xa14e785b),L_(0x7afeb3e3), LL(0xb175e3fc,0x15c1eebf),LL(0xdc5c271b,0xc21625b9),LL(0xd51bbdf3,0x4095982d),L_(0xea6a656f),
+ LL(0x3418b0dc,0x8df3827e),LL(0xad96082c,0xae05d810),LL(0x0c7308d4,0x747332eb),L_(0x3e790568), LL(0xf43bfba5,0xb410e2a5),LL(0xa45bcc07,0x6ea69371),LL(0x34e11697,0x68990fab),L_(0xd0d95f71),
+ LL(0x46088da2,0x2b70f4c2),LL(0x95663747,0x2b81bbe7),LL(0x18e76686,0x0510d4ae),L_(0xa806fc64), LL(0x718b9269,0x74a39c45),LL(0x11681c31,0x39edf452),LL(0x7f1ee73e,0xd70c5b25),L_(0x145296c5),
+ LL(0x38adcbf7,0xb90e977c),LL(0xa73e17c7,0x589db798),LL(0x3b0459aa,0xd910c80d),L_(0x4a996387), LL(0xa2014673,0x09cc1462),LL(0x4ff007ad,0x9deb8885),LL(0x6f3bf601,0x9137e94d),L_(0x3d0461a8),
+ LL(0x49eeb574,0xdf5e90f6),LL(0x03f3fdc3,0xf38e094e),LL(0x2f05f4ba,0xefe1e30f),L_(0x5dab20a6), LL(0x25f380be,0xfbe83a6a),LL(0x815eac18,0x96d53b04),LL(0x2c89a65a,0x13f75b6a),L_(0x326a87f4),
+ LL(0xb57a062a,0x99fa6314),LL(0x29c19e9b,0x29ce4a74),LL(0x5d5a6ffb,0x84d62c60),L_(0x4e8640e3), LL(0x63890d47,0x01830a3e),LL(0xa50855ff,0x86e7548d),LL(0xb9b3fb5b,0xbf0727b4),L_(0xa1cac932),
+ LL(0x93078c89,0x08fe3e54),LL(0x7f8ba9f8,0xa70bd6a5),LL(0xfff3b260,0xa621223a),L_(0xda5b8cc0), LL(0x5c0ab9e1,0xb352caaf),LL(0x52e875c5,0x57c08401),LL(0x888687cb,0xd159fefe),L_(0x788f0705),
+ LL(0x50a69ca4,0xe7ee73d3),LL(0x71f9e278,0x50682750),LL(0x0511bea3,0x147b2ef8),L_(0x908389b2), LL(0x0d09e4fb,0xb9505161),LL(0x7ab5b1bb,0xf8cfd83f),LL(0xa16a5843,0xeb15fb80),L_(0x8840233d),
+ LL(0xedb21e1a,0xfbf89123),LL(0xb350235f,0xba1f0507),LL(0x601ae7a3,0x487a5b44),L_(0x168cfefc), LL(0x1632dc61,0x27f10999),LL(0x3f7f4917,0x224754d4),LL(0x576cbe66,0x93695572),L_(0x1697b707),
+},
+/* digit=24 base_pwr=2^168 */
+{
+ LL(0x897a6b26,0x1aa93494),LL(0x07822bd8,0x0eecf33d),LL(0x690a0450,0x411c39e9),L_(0xddfd5a23), LL(0x752f4021,0x5d8da0af),LL(0x74dcec38,0xc6e5a1f0),LL(0xa51c46ee,0x6b77f2b0),L_(0x1367898a),
+ LL(0x10f0de19,0xd8b1efba),LL(0x5d75e9ca,0x831a06cb),LL(0xdea9f60f,0x7af3d6fd),L_(0x95065ae4), LL(0x379b23db,0xe0c7e800),LL(0x22ced186,0x5d673e52),LL(0xc6698d7f,0x95367fa5),L_(0x9310a67e),
+ LL(0x288d3aae,0x7322a3b2),LL(0x1b5b3f21,0xbe251fd5),LL(0x1fe6e87b,0xcad2ee21),L_(0xb5fd4e5b), LL(0x91f82182,0xe5ae89d4),LL(0xc2853eeb,0x3262d99e),LL(0x9036d2d0,0xcb159584),L_(0x45627827),
+ LL(0xf3073506,0xf3411909),LL(0x2470f5ee,0x94dcf7c1),LL(0xf0be84fe,0xade34d2c),L_(0x90636c20), LL(0xb2827737,0x180fa04c),LL(0x2db09b0f,0x26143ea2),LL(0x0a0909aa,0x83bcc559),L_(0x281cf9aa),
+ LL(0xb3d17628,0x38d6fee0),LL(0x8f859667,0x5ac1dd54),LL(0x86559609,0xca6e59bf),L_(0x6854b4e8), LL(0x61f3a762,0x23a24b87),LL(0x5840ce8a,0x0173425e),LL(0x946b6bbd,0x00fd3d85),L_(0x8a095b45),
+ LL(0x156ebcbc,0x74d544f1),LL(0x4c355669,0x3127ea7e),LL(0x1ea60e82,0x099e116c),L_(0xd960a70d), LL(0xd32fd59f,0xd60a4a59),LL(0x305faf07,0x3cf7063d),LL(0x61b80d24,0xe6b8e5c2),L_(0xd428e0cc),
+ LL(0x22dd5fee,0x26d21295),LL(0x5d2ed352,0xd4c31ad3),LL(0x3daf91ee,0x44afa3c4),L_(0xd529e7b2), LL(0x17333fb8,0xd7ed0b47),LL(0xcc9faccf,0xe9201771),LL(0xc98aa7de,0xc9757998),L_(0xce2c4e14),
+ LL(0x1ae8d0a4,0x098fc503),LL(0x3d3f8532,0x41d10295),LL(0x50253fa1,0x23d266c8),L_(0xb38286d6), LL(0xfb63eee1,0x99903092),LL(0x48a64b98,0x9100a99c),LL(0xbc43643a,0xfe159bd8),L_(0x2f08eae4),
+ LL(0xb10e23d2,0x5b31f9b6),LL(0xc558d554,0x5c151d19),LL(0xe3c46403,0x19a6f592),L_(0x2211131c), LL(0xbb6a51b6,0x4d8f19e7),LL(0x8c4d4f34,0x551259ee),LL(0x347e8cae,0xad36aa89),L_(0x5a959e3c),
+ LL(0x9f2c968b,0x178db2dd),LL(0x8674b5e1,0xc9ba55bc),LL(0xce21dcf1,0xd3884f45),L_(0x7664513a), LL(0xbb703b97,0x7a1b3e56),LL(0xc9e299e2,0xc4a588c4),LL(0xe96de0f0,0x8d3f0ffc),L_(0x5aba434e),
+ LL(0x8685946b,0x3206b59f),LL(0xbf15b53c,0x7e914149),LL(0x2fff52c6,0xfec55940),L_(0xc3791f65), LL(0x78dad0a9,0x394de0c1),LL(0x5c5fed8c,0x72c6919f),LL(0x674b4d59,0x0e57743b),L_(0xd7315975),
+ LL(0x3dad8066,0x7fa4f80a),LL(0xc574aafe,0x60f2414d),LL(0x25994c45,0x15293405),L_(0xa00f9231), LL(0x0f201926,0xf98edea5),LL(0xd0bcf974,0xaf5b2ad4),LL(0xa3c74ad6,0x448873ac),L_(0x8ff67b2d),
+ LL(0x75e7728e,0x510cb9a4),LL(0xbaf15c58,0x54d76825),LL(0x234a8fab,0x0023d4d4),L_(0x9d6e89b9), LL(0x2cce0b43,0x374850ff),LL(0x6bf4faef,0x32a29d1b),LL(0xdd164002,0x799cb3ee),L_(0xfc7797a7),
+ LL(0x26f100f7,0x34261e54),LL(0xcf17aa4d,0x589b344b),LL(0x801ccc35,0x0c7a04fa),L_(0x762b3408), LL(0x9578af64,0x002ca131),LL(0x0870f41d,0xe0fba28a),LL(0x70686201,0x276eaa26),L_(0xf592842e),
+ LL(0xcf7ff5db,0xb78b71bc),LL(0xa79ca9e4,0x625166ca),LL(0xe7aab4c3,0x095aa863),L_(0x980df4d9), LL(0xfc336519,0x75ac5ed8),LL(0xcc69d2f9,0xf211966f),LL(0x429f98f1,0x10ce7510),L_(0x5736d4ee),
+ LL(0xf3b848f9,0x8da51d84),LL(0xb2abe419,0xc9d1a3db),LL(0xefa624dc,0xc275c72e),L_(0x8b684df9), LL(0xc682bec0,0x75f1bf6e),LL(0xfc8f823d,0x3f9f9e0a),LL(0xa497166b,0xb3363382),L_(0x3241d9b6),
+ LL(0xe748b559,0x9a65f283),LL(0x47d0d598,0xeb923237),LL(0x600f8097,0xdfc5d530),L_(0x06c1d340), LL(0x8c26801d,0x409b596b),LL(0xe50cc47b,0x2d0a1f78),LL(0x71018c42,0x4f9b2683),L_(0x2de345b4),
+ LL(0x2273bfc3,0xd352b3d9),LL(0xfb7e2c37,0xb02762b6),LL(0xfb5035dc,0xc27af22c),L_(0xe5cf5a24), LL(0x304d3903,0xf2e49e03),LL(0x31c42940,0x8e2941f7),LL(0xb3e476b2,0x3130439d),L_(0x729a7e6b),
+ LL(0x2fb4a6c0,0x554fbba4),LL(0x1228460b,0xcbf47250),LL(0xda7db077,0xf5e0be2b),L_(0x8a989e94), LL(0xbed3a180,0xe15aded1),LL(0x56931b09,0x2a994a1d),LL(0x7fb6175b,0x36407d3f),L_(0x785ad12c),
+ LL(0x7466b3e3,0x296e5cc4),LL(0x6178d140,0x29e191e4),LL(0x9088d05b,0x1f9dc468),L_(0x631396d3), LL(0x2665b7af,0x86ffc6cd),LL(0x04f52e9a,0x099491df),LL(0x4b21e0a9,0x27375e3f),L_(0x242c7c60),
+ LL(0x974f4c4b,0x064ca079),LL(0xa02c0b2b,0xba3c8a64),LL(0xa1558503,0x13a69d2a),L_(0x3d67919d), LL(0x148d5568,0x2bfc83bf),LL(0x3a653e93,0x1054b748),LL(0x69ae9c83,0x0a4cc47c),L_(0xf624d321),
+ LL(0xacbde616,0x9e3e45cf),LL(0xd947c8c7,0x6374e6b2),LL(0xa439634d,0x5b100526),L_(0x7b5067f8), LL(0xb742e1b9,0xfc26652d),LL(0x701d8d64,0x6746e242),LL(0x277501f0,0x262c9dad),L_(0xd3dd957f),
+ LL(0x09a69072,0x9f4be9d7),LL(0xcf4ac2d6,0x20d76239),LL(0xe04b6795,0xf3257cbf),L_(0xec24a41c), LL(0x48529c37,0xb3eb3d13),LL(0xcc1689ae,0x35003a26),LL(0x8712e8c7,0xafd7b5e3),L_(0x868af920),
+ LL(0x620ac627,0xd27017eb),LL(0x75a3408c,0x28e8bc69),LL(0x7de280af,0xfab61ca0),L_(0xb76f92d0), LL(0x3e502b01,0x528c5328),LL(0xffede226,0x05139646),LL(0x9bf76d0b,0x4d2256e2),L_(0xdd96e876),
+ LL(0x4eb92472,0xe00a0552),LL(0x896685cb,0xfa213a96),LL(0xf0d4a520,0xe8f5fdb6),L_(0x0f380c61), LL(0x5288ae5e,0x4d63b6c6),LL(0xca87cdad,0x7d544fbe),LL(0x69639e2d,0x941d9935),L_(0xed61f0e4),
+ LL(0x31d063fa,0x72ebb946),LL(0x43d0a9df,0xa9c082ad),LL(0x53424334,0x10a77134),L_(0xdf849ce1), LL(0x5a1815d9,0xdf56c5f3),LL(0x58feabaa,0x6bbd3105),LL(0x787ed1e2,0xa802a275),L_(0xa542b49b),
+ LL(0x70042e82,0x0646662b),LL(0x33793ddc,0x6dfd5259),LL(0x873a716b,0x3ae6c62d),L_(0xd34ef5f0), LL(0xb3489aa8,0x9974e0c1),LL(0x5b201375,0xae617d06),LL(0x25cf8d2d,0xfac50e53),L_(0xf5028682),
+ LL(0x82900f26,0x20822d19),LL(0xdb5b7f7b,0xc050b43f),LL(0x610bf8a8,0xe4e5ddab),L_(0x59f6f46f), LL(0x0bd3d213,0xd3a9f7a0),LL(0x29ffdb56,0x8a060b79),LL(0x1aed0fa9,0x7cd570f8),L_(0xa1cdd0bb),
+ LL(0x0f6923b1,0xb9d66a95),LL(0xf9463b5d,0x6b4aafc6),LL(0x9dcb5191,0x7e8de98d),L_(0x3a174474), LL(0xafeb6788,0xd8a6df5b),LL(0xb00ae812,0x1127ce66),LL(0x595dbbd9,0xab858cbb),L_(0x20456b6d),
+ LL(0xf945d541,0x6e092bb4),LL(0x4b66cf94,0x27b14454),LL(0x7eca44eb,0x6daca5c9),L_(0x44fbdf91), LL(0xfc99b4f1,0xcb39349a),LL(0x9f292892,0x611f2265),LL(0x7d2e1348,0xb91c9d21),L_(0x2511f796),
+ LL(0x8d960ed0,0xc742fe68),LL(0xaeca436c,0x7a253140),LL(0xa736c99b,0x7053b3ba),L_(0x4df3a08c), LL(0x1c4bf5fd,0x35ff874b),LL(0xa50437d0,0x85d7a155),LL(0xbb3ee79c,0x28f141d8),L_(0xa309d53a),
+ LL(0x18a6fdae,0x052107c1),LL(0x4c1843ed,0x7a4941a3),LL(0x5b395717,0x10eeec3a),L_(0x41bed6c7), LL(0xc77d493c,0xe3bf062d),LL(0xe2632a75,0x99abf215),LL(0xccb37627,0xf5482813),L_(0x65bddca7),
+ LL(0x86262170,0x97f943dd),LL(0xe4f707eb,0x28ad9142),LL(0x1fca8434,0xe200b711),L_(0x5979d82e), LL(0x7eeaf938,0xa0864853),LL(0x073f049c,0xdcbbbd26),LL(0xefca8545,0x5e115ac7),L_(0x81b25231),
+ LL(0xfa392d8c,0x0b83214e),LL(0x6e208498,0x5535cb0e),LL(0xd7f17a61,0x9d606b9f),L_(0xf9ff6be9), LL(0x532d4992,0x78a1ebcc),LL(0x8412a690,0xc80751aa),LL(0x3fc39e84,0xa4039f18),L_(0x16cc85fa),
+ LL(0xb6b3e3bf,0xb29dd0f5),LL(0x3f372e07,0xfc4475a6),LL(0x1010f76a,0x499ca40b),L_(0xc9d3a123), LL(0x505bb647,0x1a039620),LL(0x898b067c,0x71c1fd31),LL(0x8fba57f2,0x920244b9),L_(0x2f20dfbe),
+ LL(0x09e67c8d,0xadba6513),LL(0xf1db6fa1,0x004a0b2d),LL(0x780eff8e,0x6530b59a),L_(0xdcf21d60), LL(0x8ecdce5b,0x767463fd),LL(0x65b13c4b,0x70cc1a2b),LL(0xaf0f593a,0xb10b6a9a),L_(0x05c89578),
+ LL(0x040645b4,0xae7f7819),LL(0x678205ed,0x421d2a1d),LL(0xcc32c0b0,0x2492206a),L_(0x43d4ee55), LL(0xb779e43f,0x2296a21f),LL(0xd485f134,0x5fce8d33),LL(0x7dae00fa,0xd7fd8f23),L_(0x9c357857),
+ LL(0xc2d0a0f7,0x683b4c52),LL(0xd1014606,0x457af899),LL(0x2de4b78e,0xed10d363),L_(0xe5547d1b), LL(0x84fc2002,0x40cf6189),LL(0x1fa00e4b,0x6b948df1),LL(0x2643b489,0xa90cf1b7),L_(0x862ff071),
+ LL(0xf9cd4743,0x2c263fe3),LL(0x3df3e881,0x7af59647),LL(0x4a452825,0xf8b4e248),L_(0xff9860e0), LL(0xe9e940c2,0xfaa7bd3a),LL(0x4dcae86a,0x829a4b08),LL(0x0392152c,0x8e97fa6c),L_(0xfc62b042),
+ LL(0xf8c2cf32,0x38ca48d4),LL(0xc8c6f843,0xb6e872e4),LL(0x1a5701ad,0x8137a142),L_(0x3332d11c), LL(0xd8632d31,0xf65f8d02),LL(0xc57e0eee,0xed896e7d),LL(0x84c4a8f0,0x474d64c3),L_(0x9a310ea4),
+ LL(0x1facebce,0x90943f9c),LL(0xabcd06f1,0xc0153740),LL(0x4bf7868b,0x2460277b),L_(0xf15a1c15), LL(0xe70f731b,0xbbc3520f),LL(0xa0084581,0x1881feb6),LL(0x8c12c484,0x4461e279),L_(0x2cb0b794),
+ LL(0x420f669d,0xc6234887),LL(0x1336960e,0x961fd208),LL(0x6690aec7,0x8dcc7988),L_(0xea8d5acf), LL(0x6a7ab2c0,0xad19e666),LL(0x221a923e,0xf44304de),LL(0x3d295ba2,0x840fc746),L_(0xa849c9c6),
+ LL(0xffb23eb2,0x796ddb67),LL(0x7f2ece47,0xb74ebddd),LL(0xfa40fdb7,0x6e9b86f6),L_(0x3753a599), LL(0x517edc52,0xb0d32903),LL(0x9ce52e22,0x4e38e3ff),LL(0x609b3583,0xbd4bbc16),L_(0x470387a5),
+ LL(0xc2767e71,0xb5992b12),LL(0x15e316ec,0x722e7585),LL(0x331c37c2,0x4f66d67c),L_(0x5a547f8e), LL(0xad349dda,0x2343f37d),LL(0xc7ecc98e,0x991a0d20),LL(0x2f36fbc0,0x32fd452b),L_(0xbcd300ae),
+ LL(0xe9e7130e,0x3965b7db),LL(0xfbb383d5,0xa434d230),LL(0xd5ddeb7e,0x5de1379b),L_(0x89236512), LL(0x26844221,0x71474c32),LL(0x359ac63d,0x86ab382d),LL(0x6a2a41ee,0xb41d45a2),L_(0x4543bf02),
+ LL(0xc03175e0,0xdd45b154),LL(0x51a93461,0xc32e33b5),LL(0x8e87a379,0x6030bb55),L_(0xe0f74319), LL(0x1ee1fb1c,0x180c566b),LL(0xf64d3bd0,0xd5501439),LL(0x117f7e05,0x9fe6d9b3),L_(0x276cdeae),
+ LL(0x79701f00,0x90d2c4af),LL(0x8ee8e755,0x19fa045c),LL(0x34e9da6a,0xea446558),L_(0x56f8560b), LL(0x22273b04,0xf104982d),LL(0x7a1b70ed,0x0b6be603),LL(0x5df6c184,0xb3a79a2f),L_(0x3e690209),
+ LL(0xb6a58003,0x506cdad2),LL(0x1cd413bf,0xcc9e3e86),LL(0x5af9735a,0x4669ee32),L_(0xf133df4e), LL(0xa97f8799,0x343b9133),LL(0xd2df1205,0x5ed1097e),LL(0xc0f593eb,0xe1f7e724),L_(0x03f70d2b),
+ LL(0xfbde70cb,0xe1aefce0),LL(0x28e77727,0x953078f3),LL(0xea43f71f,0xb1afcd33),L_(0xe72f4294), LL(0x42df1489,0x5c609190),LL(0xd85d4064,0x9d39f16a),LL(0xd4734dcb,0xc6a7ed93),L_(0x73444dba),
+ LL(0xc80deb54,0x786041c5),LL(0x2e784b12,0x73806b24),LL(0xa5394485,0xd5ed489c),L_(0x7c1354f6), LL(0xc98caa8f,0x6f5aed20),LL(0x04a2cef9,0x343f789d),LL(0x6a61903c,0x0943ad59),L_(0x74525b1c),
+ LL(0xdd468a2b,0x41295f9e),LL(0x79058179,0x767bb930),LL(0x8356b028,0x8630275b),L_(0x7d99704d), LL(0x9677c30c,0xfe64fec1),LL(0xb6ad9348,0x7bfdd07e),LL(0x323c5204,0xff571db9),L_(0xabd2794c),
+ LL(0xc6bef1c2,0x39e5ddd7),LL(0xa00ac9eb,0x4166efe7),LL(0x08022d52,0xec00b4ca),L_(0x89c305e2), LL(0xdff9eb38,0x2f6d8e32),LL(0x1c9dee31,0x38a38882),LL(0x063cbbc8,0xd453f2df),L_(0x500b8e1b),
+ LL(0x2a4b58b5,0x0d2d67f5),LL(0x704fba9c,0xb9671248),LL(0x3b601783,0xc86eeaf3),L_(0x3a076280), LL(0xc6604758,0x057735ba),LL(0x3c7fe621,0xa0f157e0),LL(0xba90bf98,0x7ea681b4),L_(0xc697f17d),
+ LL(0xf242b313,0x2fb2d012),LL(0x8b404954,0x301b1ef8),LL(0x3864cc2c,0xe8bf6c74),L_(0x27928a4a), LL(0x37e42bc1,0x129459b3),LL(0xb079e9c8,0x95c688c9),LL(0xa8c506fd,0x2be35d42),L_(0xabd7b8a2),
+ LL(0x8d7f03a4,0x0c337ebf),LL(0x9f5cd253,0x2b5789a5),LL(0x3bc3df04,0x808378fd),L_(0x57ce1b57), LL(0x8394999d,0x9173aca8),LL(0x29069aea,0x68a97a68),LL(0x172c5e76,0xd7f9c6b8),L_(0x2bb82de1),
+ LL(0x26324b43,0x069b62db),LL(0x3a04b8c8,0x2d6c75c6),LL(0xbb1fb7ef,0x8e5dc130),L_(0xdf0fbfa5), LL(0x427bae31,0x8d6bb598),LL(0xae962471,0x4a1d29d8),LL(0x6a0b5064,0x1f5aad58),L_(0xcb90fbe1),
+ LL(0xf5f95663,0x99c6500a),LL(0x182ee0a7,0xfc57412c),LL(0x9acab63a,0xd7a3f799),L_(0x579dffc7), LL(0xb294554e,0x2e7244f9),LL(0x7a563978,0xc577a189),LL(0xd9421c12,0x4a33607f),L_(0xca35ca5e),
+ LL(0xcf4cc636,0x476c2c16),LL(0x84dd3019,0x40d43930),LL(0x9f6a9cbb,0x8de41867),L_(0xa0782cd2), LL(0x8e9807cc,0x335870d6),LL(0x873bb057,0x237820cd),LL(0xd2763265,0x817bb568),L_(0xac61e5ba),
+ LL(0x277845cc,0xb4216df3),LL(0x28a00ba3,0x4ae7f387),LL(0x8d18d55a,0x83dc382b),L_(0x9929ba4b), LL(0xace5a497,0xc4acbdd9),LL(0x1a149f46,0xfee31905),LL(0x03677afd,0x7f382dd5),L_(0x038b4fd6),
+ LL(0x39c19776,0x7b1469c5),LL(0x770906b4,0xefd3e00c),LL(0x39b76a30,0xb757175c),L_(0x77b00db2), LL(0xea73fb31,0x00e5eb12),LL(0x564b2b5a,0x5dec4d76),LL(0x16670a8b,0x6cedfc0a),L_(0xfc26f8d3),
+ LL(0x0f967635,0x5f72f035),LL(0x492f15fb,0x9fbbd203),LL(0x8a57f34e,0xca278cc2),L_(0x136d3def), LL(0x3233be88,0x56bc1e3d),LL(0xb7d079d2,0x167694bb),LL(0xb849beca,0xc12eafab),L_(0xf42c9064),
+ LL(0xc22b8b50,0x35110b41),LL(0x3593434b,0xc03f7534),LL(0x2a685ee5,0x38e7d616),L_(0xd80d02e7), LL(0x681060ac,0x47c0e163),LL(0xa5dbbbef,0xaf6a4e94),LL(0x58c7a38b,0x00b0f102),L_(0xbe4a965e),
+ LL(0xa0bfdebf,0x00ea08c9),LL(0x0a49eb36,0x19299c59),LL(0x4a5b799c,0x1389e249),L_(0x6bb607bd), LL(0x003f62bb,0x21dd6f70),LL(0x648ac9f7,0x0d28002f),LL(0x46ddb53c,0x123f4a38),L_(0x0b454608),
+ LL(0x6cd705df,0xdc0b4f05),LL(0xa26650ba,0x584543cc),LL(0x9623d15d,0x52a5b5a4),L_(0x8530847b), LL(0x95176358,0x2b9634a4),LL(0x88564796,0xb76d8613),LL(0x8cd268e3,0xdd09c6f7),L_(0xfbbf3c6c),
+},
+/* digit=25 base_pwr=2^175 */
+{
+ LL(0x40600691,0x076ba1e2),LL(0xaf9141d1,0x3cbbece3),LL(0x90d62387,0xeae39108),L_(0x39ae931a), LL(0xef1b81b3,0x7c192920),LL(0x51f12b8a,0x07e50a2b),LL(0xf1cfbc63,0xaa15f8c6),L_(0x26ff0bea),
+ LL(0x9f2ac6a5,0x5ac7dc31),LL(0x5a5fa2f2,0xd3536baf),LL(0x918f6160,0x19e26cfd),L_(0x3d611b68), LL(0x58b92257,0xfbe0d264),LL(0xa4b3a16e,0x6f69ee33),LL(0xab7e3e38,0xfb87b2d4),L_(0xe4cf7a53),
+ LL(0x4428fe8d,0x28c21968),LL(0xe6afbadf,0x82133ac1),LL(0x08d0d89a,0x79f622a4),L_(0xfc61f01d), LL(0x0f6397fa,0x9afa4014),LL(0x1819a677,0x8b6b825f),LL(0x9e89a4ea,0xf6189381),L_(0x4c306973),
+ LL(0x16b5009f,0xd0fd8e2d),LL(0x85f596e9,0x75cd4af4),LL(0xc650d10a,0xc0ff364a),L_(0xaa432f6b), LL(0xb9e1fd35,0x60cd9ff6),LL(0xa81387b4,0xf5ffdf83),LL(0x1fb57eae,0x0f74dad8),L_(0x77ebce28),
+ LL(0xcd3d74f0,0xe7801dbf),LL(0xc705f5f3,0x4cae30c4),LL(0x892e14fd,0xee1d51c0),L_(0x235f35c6), LL(0xcb840ec4,0xc690d3bf),LL(0x496db46c,0x6a393aed),LL(0xf95db976,0xa0c8c115),L_(0x3a2ff859),
+ LL(0xad9729df,0x21208e24),LL(0x50a51554,0x8a669134),LL(0x76da2c79,0x739f33c4),L_(0x47f7655f), LL(0x3faf5d73,0x6df3da71),LL(0xda653a05,0x23d729bd),LL(0xe0dbba03,0x7efefa7f),L_(0x8546d123),
+ LL(0xa29be43b,0x63a12c13),LL(0x81bccb17,0x0f3de027),LL(0xb8ad1f49,0x2ee0f6a0),L_(0xeca64ff4), LL(0x2a0247bd,0x6c14c6a4),LL(0x27d0478a,0x15b008e7),LL(0x9dc8b9de,0xe6cf3269),L_(0xde4a727b),
+ LL(0x8a41f62f,0xe9139920),LL(0xafcf2338,0xe343f86a),LL(0x8626eb92,0x330ff008),L_(0x62bc5b8f), LL(0x770a0f51,0x9ed3ab3d),LL(0xacdfce8c,0x87533c3f),LL(0x198a1e9a,0x36ceed7d),L_(0x366edc66),
+ LL(0xad4f0edd,0x9eb6ef96),LL(0xa0790c0e,0x8f2b7875),LL(0x8212d5cc,0xa20f0405),L_(0x2e6749a5), LL(0x43c2e598,0x0b5bf3aa),LL(0xf0598778,0x695b110e),LL(0x6b2a153e,0xacd67e10),L_(0x9a4287cf),
+ LL(0xc9194ba8,0x1df015df),LL(0x5545ae11,0xe5e57b96),LL(0xf86d852d,0x34894ebb),L_(0x61b42915), LL(0xaab92979,0xb25bf6b0),LL(0x2f858332,0xf88d9382),LL(0x082b80c9,0xa64fc13d),L_(0xdb34263a),
+ LL(0x4fc8d228,0x6c1819aa),LL(0x46f4e2d8,0x790019d3),LL(0x3e6d5835,0x31b5f8c4),L_(0x0471eabf), LL(0xd70615ba,0x7377bdb1),LL(0x4f0b793d,0x3d8b3ee2),LL(0x1e0b124d,0x8be72522),L_(0xcb228953),
+ LL(0xd05e1a54,0x3d345d79),LL(0x4e4eb11a,0x9b0c74e2),LL(0x4f7cb301,0xd3f60831),L_(0x9b37cac3), LL(0xdd153410,0xd42ac14a),LL(0x4b82b6e1,0x67daba89),LL(0x062085e8,0x293aa2ea),L_(0xdafbaa02),
+ LL(0x57e823a2,0x66dc4352),LL(0xeee6c065,0x9d1334ad),LL(0xe974bd6b,0x51129e57),L_(0xc6e911b2), LL(0x4a591897,0x143fbbc0),LL(0xe567aa72,0xfcf32ecc),LL(0xd98a2bac,0x985f3567),L_(0x4940de3e),
+ LL(0x810e3b3c,0xabba8dd8),LL(0xbc9b4d54,0xd024fdfa),LL(0x09ce7445,0x56df5156),L_(0x869985ec), LL(0xa279f60b,0xd64936f1),LL(0xf9f4dd90,0x147e3ae6),LL(0xb0502e71,0x9b4a0a61),L_(0x2b7784e2),
+ LL(0x10ea913e,0x228b551a),LL(0x132cf6ee,0xd39b6d23),LL(0xb41622ce,0x1166f594),L_(0x4f82b870), LL(0x771a8cbc,0xc4a0434c),LL(0x1f3f48d6,0x4e8415e6),LL(0x185bfa20,0x0549b016),L_(0xab597880),
+ LL(0x8f78c75c,0x7783a236),LL(0xcacbfea9,0x185d7d80),LL(0x37384da3,0xd767d6c6),L_(0x1b40ecf0), LL(0xb58df6c4,0xcb35e135),LL(0x1bdb10dc,0xdede089c),LL(0x51f82512,0x032e4873),L_(0x86fff3dd),
+ LL(0xae08ea09,0x993762bf),LL(0x3c5e8711,0xe9e1ac75),LL(0xc3fb58ec,0x5942a654),L_(0xdc39e05c), LL(0x6f00a879,0x4c7c1a57),LL(0x76f183b7,0xb5b4e070),LL(0x02f3f5a3,0xc7635031),L_(0x95a5b1bf),
+ LL(0x1973898f,0x44aeebfb),LL(0x6fdec0d8,0x22963505),LL(0x4dccb72d,0xc61c3dc6),L_(0x29d98bbe), LL(0xc79d4f82,0x0b4d124c),LL(0x60e1bdf3,0xab61b974),LL(0x60907706,0x502b0c26),L_(0x52fb8b7c),
+ LL(0x9cc7f5da,0xa0c27cd2),LL(0xa30b225d,0x39c837e6),LL(0x14e5e017,0x90beb6db),L_(0xca71c799), LL(0x3452a918,0x6406e7a2),LL(0x8b449af9,0x44086ede),LL(0xd95a3674,0xe83116d2),L_(0xc945cb30),
+ LL(0x757467e5,0x195a49f1),LL(0x19bb9a9f,0xbd375548),LL(0xdd63e900,0x32a666f4),L_(0xbb5bae80), LL(0xb06e326c,0x71975390),LL(0x7200d75c,0xa8071dcb),LL(0x9bb8f1f0,0x34371f37),L_(0xd14c5988),
+ LL(0x9fc79376,0x330b4d2c),LL(0x4766d5c5,0x89487193),LL(0x96d443b1,0xb683d913),L_(0x55cd4038), LL(0x25e49098,0x0b19d841),LL(0x4de7c5cc,0xc211c53d),LL(0xb34627f6,0x63d637ee),L_(0x05d48e84),
+ LL(0x2fb2a30d,0xa9ab961d),LL(0x587b4227,0x7f2e1082),LL(0x9bacdb2f,0xf2fed11b),L_(0x4327e6c8), LL(0xf5f7ca94,0x59f2340a),LL(0xdae690d8,0xa241b47f),LL(0x20f9a82b,0x04266881),L_(0xb60ba27e),
+ LL(0xfc8a6083,0x4b7ea198),LL(0xf7bd165d,0x0439da93),LL(0xaff22d2a,0x6e2c180a),L_(0x5fa28be1), LL(0xb5422e8a,0x8d8de819),LL(0x8623fa12,0x1c7aa689),LL(0xf1b013b4,0xecdeea2c),L_(0x1412065d),
+ LL(0x1b8b14e9,0x949b80c2),LL(0x9e45f562,0x7634d5e7),LL(0xeacf4d90,0x89e47023),L_(0xed86f825), LL(0x2a28ee33,0xa46549d3),LL(0xcc9d20c3,0x91467c95),LL(0xb5aaafc8,0xaad820ff),L_(0xfa9b0b7b),
+ LL(0x3a989cf8,0x56a19c64),LL(0x694699c4,0x6a9264c2),LL(0x2172bedd,0xfcd8d182),L_(0x71a622e6), LL(0xabaee9e8,0x096356a3),LL(0x5df0e982,0xb3c8273f),LL(0xbff93f13,0x15499fe5),L_(0x035d8bec),
+ LL(0xe7f02675,0x8665d519),LL(0x0b392d7e,0x3114f640),LL(0xda3e7314,0x27724fe5),L_(0xb0000497), LL(0x9626e05c,0x92676514),LL(0x86de4867,0x70fdd068),LL(0xbfb7e396,0xc9127734),L_(0xec308376),
+ LL(0x889048c2,0x13351e00),LL(0x9ee3edde,0x8a42c8c0),LL(0xe9b0df44,0x039a9289),L_(0x3ba48603), LL(0x9ba675fa,0x1bc5a4ed),LL(0x28dbe0e2,0xc1c91604),LL(0x33d13a46,0x683a466a),L_(0x6f0e40d3),
+ LL(0x6f169f5d,0x49b1e542),LL(0x5467b60c,0x6be4fa18),LL(0x63a775bc,0xf10e3ad8),L_(0x555978a5), LL(0x2b932386,0xe2647c33),LL(0x2d98173b,0xc10e0d58),LL(0xa46de613,0xd4d665e8),L_(0x8c2f942e),
+ LL(0x76f88409,0x83f96957),LL(0x11159549,0xb83760f5),LL(0xa26fb69f,0xada04407),L_(0xe1ffa9b1), LL(0x7985249d,0xf63dc16c),LL(0xb8212592,0xa9f05a9e),LL(0x8f2b706f,0xa84d6d60),L_(0x0952d255),
+ LL(0x9ef2ca53,0xc1ad35cf),LL(0x8063b121,0xf54f3d1d),LL(0x2c69c142,0x2eddbe16),L_(0xe20cbf04), LL(0x58b9d3e5,0xc6a6486c),LL(0x5f1b4348,0x30a9fb2a),LL(0xaa7af663,0xbd211312),L_(0xf09747fa),
+ LL(0x6aeadb7e,0xb3384570),LL(0xad4b300b,0x80077723),LL(0x7e0408aa,0x92c8f393),L_(0xcdb75950), LL(0x91a66b10,0x01c71c42),LL(0x98806233,0xd3e2ebf9),LL(0x4ccfab0f,0x2c91c51d),L_(0x0daddeb0),
+ LL(0xa5136305,0x1656bed1),LL(0xf9475d4e,0xd5bd811f),LL(0x29f67636,0x71b2886d),L_(0xce5ffc47), LL(0xf8ec4c6c,0xed19aefd),LL(0x00fbe22e,0x3a69ea47),LL(0x1a593c52,0xed7635e4),L_(0xfea5dbc5),
+ LL(0xb6a32091,0x0a800d89),LL(0x3e952cbe,0xe00a730d),LL(0xb849574d,0x95e45fa4),L_(0xd0b6f06f), LL(0xc0b38793,0xca47bacc),LL(0x3aea6517,0xa1c9b9db),LL(0x98d62545,0xf79f468d),L_(0xe75cf2cd),
+ LL(0x6d96b85c,0x92cfaed8),LL(0x8aa22d94,0xe9d09bd1),LL(0x951cb3e9,0xcdf3e590),L_(0xc6443f1d), LL(0x5ee4705a,0xa83030bd),LL(0x4ab4bb2e,0xbbdfbd6c),LL(0x126bf8d3,0xab5c4613),L_(0x78abc625),
+ LL(0x1d099c24,0xb14045e9),LL(0x75f0192a,0xc8658ab0),LL(0x66a1d69f,0x488c7367),L_(0x27671771), LL(0x10f50e10,0x41dc68c8),LL(0xdbf2b527,0x56c509b4),LL(0xaa6e15c2,0xc052c755),L_(0x6264eb14),
+ LL(0xf102c97a,0x361df88d),LL(0x8133758d,0xfcb2818c),LL(0x89d87e0a,0x8313147e),L_(0x156564f5), LL(0x92996691,0x0305e3bb),LL(0xb530ebe1,0x3ea90757),LL(0x75ed509b,0xe3da205e),L_(0x8810aa6d),
+ LL(0x0936433b,0x66bf33ad),LL(0x5cdc1d84,0x20489613),LL(0x40fff511,0x02569cc0),L_(0xa46f7fa8), LL(0x6bea5f0b,0x03ae7465),LL(0x6ca8cba2,0xa43eaabe),LL(0x9d34e4a3,0x338f15f5),L_(0xf175cde9),
+ LL(0x37a46a76,0x43fb29da),LL(0x0f113fed,0x1e4e18be),LL(0xc9bc3624,0x0891f557),L_(0xf2de428e), LL(0x6cb133b6,0x72c78284),LL(0x0bca6469,0x920b91e7),LL(0x4ad07f92,0x9aca547e),L_(0x254d2e0c),
+ LL(0x48b9afe1,0xbedf71c7),LL(0xfdf235a0,0x7b745717),LL(0x707d37d5,0x519516e4),L_(0xb70d0d1d), LL(0xf179e489,0x026e2e98),LL(0x7b9cd555,0xa64e85e9),LL(0x05a8ce5e,0x490bbe2c),L_(0xfd0ac7d5),
+ LL(0x5ef0e444,0x4518decb),LL(0x5704b61f,0x84b0fcd7),LL(0x05e3a6d4,0x761243d0),L_(0x09fdcc95), LL(0xf157aba1,0x52cc970f),LL(0x2f40eec4,0x545ea4c0),LL(0x3cfbc5b3,0x82e0b382),L_(0xd24582c3),
+ LL(0x3def68b9,0x91b73501),LL(0x63a13aee,0xf4c2f983),LL(0x64a186c4,0xd30674ab),L_(0xae849f85), LL(0xd639edb0,0xbd3a7bd8),LL(0x4e22b52c,0xcf732f2a),LL(0xdee6130a,0xa16934a2),L_(0xa208c2f8),
+ LL(0xee275071,0xacddc898),LL(0xdcfd6055,0xc137eacf),LL(0x4226123c,0x22c7c6d7),L_(0x18caa3b3), LL(0x575ea43d,0x27a1cc63),LL(0xcfd9c842,0x1d810b5b),LL(0x435cc5b0,0x98cdd25d),L_(0x03338f7f),
+ LL(0x1bca7595,0x39e40f6e),LL(0xa3f28110,0xf4b9f93a),LL(0xbb9b4a37,0x6d2f9be1),L_(0xc7ef39dd), LL(0x288d64fa,0xb0848ac0),LL(0x9e6a4583,0xe3934b4d),LL(0x65ecc897,0x7961633c),L_(0x12939ce7),
+ LL(0x69332018,0xdf1e1997),LL(0x0eb1a850,0x55fdefde),LL(0xcfe64a91,0x6d23295e),L_(0xf848ec96), LL(0x6ccd6db0,0x8a058163),LL(0x4a1159c7,0x8e9a68bc),LL(0x145557f9,0x44e87592),L_(0x744a6684),
+ LL(0x570af433,0xd2524bb7),LL(0x71ee45c1,0xe5696936),LL(0xae2e62f4,0x90655f39),L_(0x4aa6dd85), LL(0xce93159e,0x170e2563),LL(0xcd77d544,0xb60f5503),LL(0x1637c5b9,0xbbddebd8),L_(0x116cc13c),
+ LL(0xa79f3d54,0xda76037a),LL(0xe567b31a,0x1b943930),LL(0x81454a32,0x8ce526e9),L_(0xa68887d1), LL(0x7c692a2a,0x5ccae9e7),LL(0x2aa4281c,0xbad7967a),LL(0x27a06af9,0x67a8cecd),L_(0xb0666bd6),
+ LL(0x18d87b3d,0x3bf215b9),LL(0xf3b762b4,0x13a2d20a),LL(0xc7ded91e,0xf2dddefc),L_(0x491f86d1), LL(0x9175dde7,0x1a33ec16),LL(0xbfa502ae,0xde7bc4a6),LL(0x8b90c1c4,0x011d4fdb),L_(0xae49e966),
+ LL(0x339d5841,0x30030ab7),LL(0x9b2323cb,0x93a59a0c),LL(0x3dfca103,0x6d677f76),L_(0x615cef3a), LL(0x5b19bbca,0xd8927084),LL(0x143864e2,0x0d3dc8c8),LL(0xe2a53ef5,0x7bfce607),L_(0x98d95aec),
+ LL(0xbfe42fd9,0xe4480a82),LL(0x674699df,0xa3a3e505),LL(0xf6bd5725,0xa3bae3b5),L_(0x93074bef), LL(0x2f753cf5,0xc278e6d8),LL(0x9075dc94,0x042fbabf),LL(0x66f70e54,0x2912d169),L_(0x77ae21bf),
+ LL(0x8e1def19,0xba0002d6),LL(0x9d21da23,0xa31c1302),LL(0xc9cb3757,0xc0b1cdab),L_(0x478c82a0), LL(0x8ebd0b98,0x708a627c),LL(0x95df97f0,0x00716397),LL(0x036873bf,0x9b0c552c),L_(0x31bdcc00),
+ LL(0xa7f4f676,0xdb1b2796),LL(0x16f6892d,0x287bb1a9),LL(0x513e742d,0x83e7ad99),L_(0x5ba54190), LL(0xd83035ed,0x3ab45168),LL(0xd55025e1,0xc5e72511),LL(0x57264580,0xa5b527ed),L_(0x246fe503),
+ LL(0x2956f5b6,0x9456aa98),LL(0x72287d14,0x2d9d56ca),LL(0xbd98da03,0x783e5a79),L_(0x1c038840), LL(0x278213f9,0x44dd9214),LL(0x8abbd0fb,0x1ae00f0f),LL(0x546492b8,0x9365b6f9),L_(0x638f9886),
+ LL(0x2772a4d8,0xe568c53d),LL(0x56dd3ec8,0xc5798254),LL(0xad2418b2,0x40cc9856),L_(0x5fe0c00d), LL(0xcc8ceaa1,0x1cdd7255),LL(0x17304349,0xd65e8630),LL(0xe17ec8e0,0xb4dc2a26),L_(0x62eb4c57),
+ LL(0xb31137c7,0xdb4ee5e0),LL(0xa85ff057,0x79aa7312),LL(0x0fb19074,0xf1a5850d),L_(0xb1c8c20f), LL(0xa65022af,0x407175d5),LL(0xc25f5ad9,0x1debba7b),LL(0x0ed43d07,0xa2739236),L_(0x55db40b6),
+ LL(0xeb7ff1d6,0xbb91225a),LL(0xb6ec7895,0x7915895d),LL(0xec277689,0x53e7c8ad),L_(0x503d01fd), LL(0x427cc57e,0xff30aa1b),LL(0x789118fb,0x28a3c0f3),LL(0x45dce70e,0x7758b97b),L_(0x2ad05594),
+ LL(0x79df6beb,0x64d25f38),LL(0x7c1271cb,0x1d5f4772),LL(0xafba6d13,0x24a4fbdb),L_(0x68588b5a), LL(0x9bd0327d,0x4408d2f3),LL(0xb9962d65,0x0c0efa60),LL(0x1adff959,0x3e504930),L_(0x1a7248ef),
+ LL(0xc91f5609,0x50371a5d),LL(0x10a09de0,0x8f3d868e),LL(0x544a1f87,0x05603976),L_(0x9bb49da7), LL(0x4f023f6b,0x2686c470),LL(0x22de25c7,0xad3c86da),LL(0x7b318aae,0x0e37c5eb),L_(0x6e0af008),
+ LL(0x9cc2caa4,0xc4103bd9),LL(0x28c77b28,0x2b106e89),LL(0xc44c9d88,0x02942cad),L_(0x045b3511), LL(0xae7c29af,0x985fde90),LL(0x3e691e0d,0x5ea3d69a),LL(0x66200341,0xa7fa897a),L_(0xc1b7c5c2),
+ LL(0xf2dba47e,0x858b20b7),LL(0x94f1ad67,0x80c7e010),LL(0xcb454e18,0xe75e697e),L_(0xea8630aa), LL(0xa6af9eed,0x7a69400e),LL(0x7d8e1f8e,0x73d9d6c2),LL(0x87354e0a,0xd949265a),L_(0xddd78248),
+ LL(0xd65411f3,0xbb95794c),LL(0x56456f06,0xdb7b7288),LL(0xb5869a96,0x7de9cd89),L_(0x4dd26048), LL(0x235bdd25,0x6b7c47bf),LL(0x3a2f738b,0xb8e2adff),LL(0x43a158b6,0x6452e6ec),L_(0xb59a08ed),
+ LL(0x3b9a55fb,0xfd294202),LL(0xd446ba91,0x77e86f2f),LL(0x0bfb0e2c,0xb347e482),L_(0xda5432f0), LL(0x811a63d8,0xda7568f2),LL(0xfd584f1c,0x32ddb6b6),LL(0x3e5b388e,0xfbef98fa),L_(0xa2090daa),
+ LL(0x29e9bf1c,0xebc6de84),LL(0x8601a460,0x77ae022e),LL(0x0fe7b2f5,0x51718d1f),L_(0x768e05f3), LL(0x8f61fd67,0x107bee81),LL(0xdafff971,0x45e70a15),LL(0x775aa267,0xf5af9168),L_(0xa74ac1aa),
+ LL(0xcc4ccaf5,0x7770d24c),LL(0x6c27e8ad,0x931b3ac4),LL(0x0c21256b,0x5eb3480c),L_(0x24df253e), LL(0xd60ece5b,0x32c4c950),LL(0x304257df,0xfa6d0590),LL(0x3821aab8,0xcfd48043),L_(0xe9ed7945),
+ LL(0xa563da21,0xf927be40),LL(0xa625fc39,0x65697957),LL(0xc708ccff,0xc7c05c00),L_(0xe3551df0), LL(0x1db01e2b,0x4a824ae6),LL(0x00aff255,0x21fd2abf),LL(0xdc1865ba,0x489f78db),L_(0xc47678ec),
+},
+/* digit=26 base_pwr=2^182 */
+{
+ LL(0xa7314858,0x4d52ad98),LL(0x44075a5f,0xa2ad3d54),LL(0x5f264197,0xa5da6ace),L_(0x1bd94b24), LL(0x1046d21c,0xaddbfb84),LL(0x9deccfa5,0xdb3e6a82),LL(0x38b0cd4d,0x0ae5bd28),L_(0xcdefc743),
+ LL(0x11028ec7,0x9f68d2fc),LL(0xdb80636b,0xda67d396),LL(0x399cbe22,0x058ae3aa),L_(0x9a20e964), LL(0xa4afe4c5,0x0655d446),LL(0x82be9278,0xd1f696f1),LL(0x02a07951,0x78c7207b),L_(0x5473af3e),
+ LL(0xa430f529,0x48532007),LL(0xe1daa6d9,0xf9c913ed),LL(0x8ffcdbb0,0xbd0a98e5),L_(0x9b2bdde3), LL(0x3eec4099,0x58bd4134),LL(0x4dcdfb2b,0x524e44ad),LL(0x29153443,0x7457124c),L_(0x9190c343),
+ LL(0x0c51f106,0xe34c46c7),LL(0x1a8f4562,0xa808bcef),LL(0x6cddda1e,0xb1bb8fc9),L_(0xa502ea7e), LL(0x9e63e9ac,0x9421a0eb),LL(0x124b21a9,0x09abe1ac),LL(0x634ea315,0xfc9b2b69),L_(0x4d2d4d06),
+ LL(0xd47adb81,0xa4e345b6),LL(0x370847bf,0xc8a3f346),LL(0x242713b8,0x10782ff2),L_(0xbc286c44), LL(0x0501d40b,0xbe6fa011),LL(0x72197eb9,0xe784765d),LL(0x23d8a846,0x9c366368),L_(0xe57509e0),
+ LL(0xb79e2ec1,0x9344ebd4),LL(0x41626ac2,0xee0983f2),LL(0xb61e001b,0x1c404975),L_(0x05deb3c3), LL(0xafd8bc28,0x10e30e79),LL(0x4f5429b7,0x90c587f7),LL(0x0cc2b3bc,0xe64edacb),L_(0x2a32f215),
+ LL(0x683db291,0xa18ec5e3),LL(0x597408da,0x0cdbd7b0),LL(0xb4dc90d1,0x9e4003b1),L_(0xf0377012), LL(0x99f01d42,0x2f737bf9),LL(0x138b7393,0x2c744a14),LL(0xbf91bb7d,0x4390dd24),L_(0xd3eb9506),
+ LL(0x7da97135,0x1f5f9c08),LL(0xcbb88522,0x60a61939),LL(0x590e948d,0xd63bd64a),L_(0x45a94350), LL(0xc3f04dfe,0x8b9c0e7f),LL(0xc46a6c09,0x24ed2a64),LL(0xe5cb409f,0x6aa2f787),L_(0x90fd8928),
+ LL(0xa6f20c60,0xc519de26),LL(0xc3ac3715,0xb2ee7698),LL(0x915329a3,0x0ca44fa0),L_(0xe61346f3), LL(0x22cc3439,0xe4d76c97),LL(0x37f7afee,0x360a76e2),LL(0x6bdfe1ff,0x536926c2),L_(0xc048c2a4),
+ LL(0x33feb155,0x57103466),LL(0x9e779a72,0xf0ac4da3),LL(0xf0cf02a3,0xc4a65bf2),L_(0xc464a2f5), LL(0x9f49b51f,0x771064c3),LL(0x545f80d2,0xf119551c),LL(0x142107aa,0xc2378a52),L_(0x233fc912),
+ LL(0xd5e26db1,0x2c57b6eb),LL(0xe31036a2,0x2260e245),LL(0x18945c38,0xa0a4a4f0),L_(0xa70971ce), LL(0x51a8f045,0x78d2269e),LL(0x3f54f031,0x08084351),LL(0xd1a3f072,0xcf63943b),L_(0x1bbad8a4),
+ LL(0x450a90c1,0x7535f2ce),LL(0x2202c2ff,0x29cb37b3),LL(0xad07269a,0xc576098a),L_(0x233792b7), LL(0x368c1c44,0x5864342f),LL(0x02886c17,0x2dca7f73),LL(0xb1a39467,0x74bab9ee),L_(0xe841def5),
+ LL(0x8df7b590,0x7f584614),LL(0x0ec350c2,0x3c0acdb3),LL(0x2da65636,0xb160863f),L_(0xe9a43081), LL(0xb0ebfa84,0xce3663d0),LL(0xafbf1395,0x69ff1f32),LL(0xdfa06d4c,0x9aa85d56),L_(0x4f103987),
+ LL(0xc94ce26f,0x7df657b9),LL(0xf5ac31c8,0x0b939fc2),LL(0x1a02ac9f,0xd28fa99b),L_(0x6407f45c), LL(0x9ca2e994,0x06494081),LL(0xe60e26a5,0x6719d6cd),LL(0x44cfce93,0x4db05d61),L_(0xf189ccff),
+ LL(0x665df7e1,0x16a82c07),LL(0xd179a921,0x85dffbcc),LL(0x51227dd4,0x1d15b312),L_(0x129de8ff), LL(0x28e8d109,0xe117dd1d),LL(0x3f1a519b,0x3db3c554),LL(0xd473a86f,0xe470bd93),L_(0x48ca17dc),
+ LL(0x2cd73074,0xce23cb8f),LL(0x025cce52,0x27d52714),LL(0x7128e28f,0x60a7af16),L_(0xee37af3a), LL(0x291c3d92,0x228c1193),LL(0x8bcaaced,0x559ca84b),LL(0x60835724,0x5f7c29e2),L_(0x42db013e),
+ LL(0x80630e79,0xd7266cd9),LL(0x5ce7356c,0xb190aae6),LL(0xc0bdd70b,0x086e72f7),L_(0x3319c072), LL(0xef5d0e48,0x4ae3ba69),LL(0x086343f9,0x95fb3fdf),LL(0x80bc2aba,0xbf3ecc51),L_(0x37cadfe3),
+ LL(0xaab46c1f,0x66dd80d9),LL(0x32cd82a6,0xaf92ed97),LL(0x11e8daf7,0x6268a0b4),L_(0xbd297ce7), LL(0x1771ff6b,0x971bdef8),LL(0x8c4eabfb,0x446b9cea),LL(0xcbfa339f,0x83d9f14e),L_(0xbd36bd3d),
+ LL(0x38641225,0xe3a86074),LL(0xf0d2a9f0,0x46459726),LL(0x68a87b42,0x27fad851),L_(0x465da389), LL(0x6ec9b313,0xa438dfac),LL(0x1024a804,0x2f7651af),LL(0x3e3b2c83,0x9e904c3e),L_(0xb0cbbf5a),
+ LL(0x3daddf8b,0x4f3cafc7),LL(0x4571821c,0xc7f93897),LL(0xb59cdc87,0x564a1eff),L_(0xd3fc8e11), LL(0x32b8d1f1,0x210954cc),LL(0x485b3e16,0x0b89424a),LL(0xa39a8650,0xc71b961e),L_(0x50587567),
+ LL(0x938ffcc2,0x3f39a45a),LL(0x39ff9b1a,0x22ec814a),LL(0xe9320257,0x293c62a7),L_(0x30d60ad1), LL(0xfe028f50,0x51699000),LL(0xecc36d79,0x687388c0),LL(0x782811c0,0xb9b6100c),L_(0xd4aec2a8),
+ LL(0x4fa8529f,0xbf6700b9),LL(0xdb67bc3c,0xb75d6fc1),LL(0x81a05a44,0x2a63deb4),L_(0x2c00d649), LL(0x4f57cb6a,0xc429bae2),LL(0x962a325d,0x45995d71),LL(0xf818f011,0x07c3cde9),L_(0x8b0fa963),
+ LL(0x1767b13e,0xdcf6f7fc),LL(0xd9cd3792,0x4c91cbcf),LL(0xa1b347a0,0x9daa99a0),L_(0x6b0d6566), LL(0xe85fb43d,0x448838bb),LL(0xe794fda6,0x9a62c0b7),LL(0xb6b1fe7b,0xc0cb0a63),L_(0xd09a8df9),
+ LL(0x0510ae51,0x4c395b4e),LL(0x8e70bc90,0x49d7c304),LL(0x04b3e853,0x9d40e63f),L_(0x4a2dc6ce), LL(0x6ec0b89c,0x36339e46),LL(0x385a4594,0xb1a1676b),LL(0x455a09ad,0x9304dd88),L_(0xc6ff5bf9),
+ LL(0x7502d288,0xe085cdf7),LL(0x187b4002,0xa35b991a),LL(0x4c4e720e,0xab690dee),L_(0x86287cf7), LL(0x05d1c250,0xe2c63b4e),LL(0x9adbcac5,0x6b60d74e),LL(0xddd28bc7,0x4248e502),L_(0xef074338),
+ LL(0xc29777cd,0x896670f3),LL(0x08020d96,0x3a144e73),LL(0xe06c4b5f,0x9786e6bf),L_(0x3da82523), LL(0x4a099ef4,0x4fe3491e),LL(0x99758e3b,0x14bb92ff),LL(0x0c3b82b6,0xbab9fec3),L_(0x45c4baf6),
+ LL(0xc471a0d6,0xb5a9a1df),LL(0x4e7e7ab2,0x56e0f739),LL(0xce6cd002,0x7c86bb7d),L_(0xcadc14a3), LL(0xf7d0edab,0xbef7e6fa),LL(0xbff62993,0xd5068119),LL(0x0a2850cc,0xc5820cdd),L_(0x92bdfe5c),
+ LL(0x8c84d27f,0x484daaee),LL(0xd799a2f4,0x612b63b1),LL(0x550daad1,0xef0ac41a),L_(0x8fbf8f4e), LL(0x377207e9,0x84f7e136),LL(0x7bdb6e8f,0xfd5152ed),LL(0xd89df99b,0x395821cc),L_(0x20d76719),
+ LL(0x3fd703c0,0xae387d38),LL(0x760e59a1,0x28b52395),LL(0x97e8f74f,0xbc044138),L_(0xa21350e4), LL(0x86d227b5,0x02533549),LL(0xe3e6583e,0x2b3bb618),LL(0xc654b122,0xa829cd8c),L_(0x39c79315),
+ LL(0xe57a78bc,0x040ffaef),LL(0xb7bea5b5,0x0bea9607),LL(0xdb5241af,0x372d1796),L_(0x940a8a94), LL(0x4374d692,0xf1499afd),LL(0xcabac4a3,0x4a7889cd),LL(0xb861df89,0x0cb6a234),L_(0xa96fe9bb),
+ LL(0x7682c515,0x5eedd184),LL(0x4434f8b6,0x5b6b1177),LL(0x2a8d7505,0x86f300e0),L_(0x0e35d724), LL(0x5d047332,0xfaf29ff0),LL(0x4c814382,0xea27ade1),LL(0x141d9196,0xd1bc5f13),L_(0xade4deb9),
+ LL(0x5fdcb5d6,0x406ace5b),LL(0x1ea243b0,0x088fb509),LL(0xd6070207,0x22934b39),L_(0xd9cd49e0), LL(0x0d4662d6,0x4d0f3174),LL(0xc755b33c,0x4eef4ac5),LL(0xf8e1a986,0xc50467c8),L_(0x18a3ef6a),
+ LL(0x747a7c15,0x4607dcec),LL(0x614bcea6,0x5f5ba78f),LL(0x68ae9194,0xf3906a4b),L_(0x42d006dc), LL(0xde1842dc,0x4cb64b0d),LL(0x9dbec629,0xba893ced),LL(0x0bf6a2f2,0x057751b4),L_(0xa9fae60b),
+ LL(0x6b278395,0x3c12fc74),LL(0x017d14d0,0xc71b3f43),LL(0xc6c97422,0xa51b04ab),L_(0x626c81c6), LL(0x3b8a9b8d,0x238bcf03),LL(0x5e266a2a,0x6ca507ab),LL(0x23764003,0x51803104),L_(0x5f7162bf),
+ LL(0xfae6aeea,0xa5dd759e),LL(0x522db1a2,0x5e4a05cb),LL(0x09f2baed,0xf85a6ac1),L_(0x323304d4), LL(0x5e98632e,0x1360791b),LL(0x1db93b31,0xb1ea2fc8),LL(0x1b768230,0xabf3fed8),L_(0x87d85b61),
+ LL(0x79a68d97,0x761f1b7c),LL(0x0b49a02f,0x3ccdde40),LL(0xbb854598,0x77637e3e),L_(0x0022290f), LL(0xdfc1715a,0xf0700420),LL(0xe0410aa3,0x4a5a58b2),LL(0x6d34be85,0xf6bc18c0),L_(0x46cdba65),
+ LL(0xe6b65986,0xb9773b59),LL(0xc5228020,0xd35b5bb3),LL(0x453c7ac2,0xf11276b9),L_(0x7df2cd47), LL(0xcbee2352,0xf5a8c36a),LL(0x179c274d,0xba21cd5c),LL(0xa5c5bb12,0x11df901f),L_(0xe17d00c3),
+ LL(0xb8d6f9d0,0x3ed4c79a),LL(0x8883a1db,0x60bbaf97),LL(0xfdd5776e,0x2f54ff27),L_(0xcb776738), LL(0x589db69e,0x9a98b106),LL(0x79c8cc7c,0x9590d453),LL(0xdc2c596a,0xc7ee141c),L_(0x6b47161b),
+ LL(0xb554abc5,0x543685f9),LL(0xc2395393,0x329ac98a),LL(0x9a0b36b0,0xaae1a4bd),L_(0xd5d4e38e), LL(0x0637ec30,0xc2e17c96),LL(0xd7e5c5cf,0x54bb5d81),LL(0x2bef0600,0x9ed78a64),L_(0x561fb810),
+ LL(0x4b821219,0x2fe8fb71),LL(0x1a1e9b3b,0x4feedce1),LL(0x3925b0ea,0xbfb2449b),L_(0xb054dfbe), LL(0x29864158,0x28647223),LL(0xa5055940,0xe2ec01b2),LL(0x31e1b9a5,0x23b5a4c4),L_(0x195035c8),
+ LL(0xbdf1c841,0xcc50c48c),LL(0x209f3af8,0x1489a642),LL(0x181662d4,0x4b465365),L_(0x91296676), LL(0x9e845d49,0x138dff73),LL(0xed5f5189,0xe47473ab),LL(0xc0ded518,0x40df6431),L_(0x723fb4ad),
+ LL(0x38970226,0x112db661),LL(0x3569136f,0x7a1d7c16),LL(0xb8e53775,0xdd45fe78),L_(0xfaa04e8d), LL(0xb657c7ea,0xf6371e53),LL(0x86806849,0xf29213b2),LL(0xf4779601,0x4c858ecd),L_(0xa4992880),
+ LL(0x77e1f87e,0x89673149),LL(0x156e1198,0x03cb4796),LL(0x39eb8237,0xecde7783),L_(0x6d9c66e5), LL(0xe3363ded,0xd2f38b47),LL(0x3fba7225,0x0a4d15cb),LL(0x088944d2,0x4f8035c2),L_(0x33f1f404),
+ LL(0xa1983b54,0x51cb66d5),LL(0x58d0680a,0xaf231cb5),LL(0xcb3e58aa,0x1d2325d3),L_(0x13427358), LL(0x6d4b8ce2,0x7dbb0bf1),LL(0x85f983bc,0x3bec3e74),LL(0x0f88839b,0x8a991a31),L_(0x6b3985b4),
+ LL(0xf774901f,0xdf68b707),LL(0xde5b911a,0x0c634df4),LL(0xeed92206,0xfc74f9a9),L_(0xbcecf38d), LL(0x3a74e355,0x96e739bf),LL(0x0a6c0e27,0x9a315c68),LL(0x82400ede,0xbba8f32c),L_(0x27d5bb2b),
+ LL(0xa27fb54f,0x3131df10),LL(0x042f1a03,0xac9267a7),LL(0xe003b634,0xa22e7895),L_(0x6dd1e8b0), LL(0x4591bb21,0x90518b2b),LL(0x5efe4007,0x9c565a5c),LL(0x88b87e5d,0x63c085ee),L_(0xf6155e0f),
+ LL(0x9a0ef584,0x841e4add),LL(0x1f02ab50,0x7b5e812b),LL(0x67a50be5,0xe6f206a7),L_(0xf1e42056), LL(0x737ad369,0x2febb4c6),LL(0x657a0dc7,0x93b35fb8),LL(0xbbf3484b,0xea4f285b),L_(0x020b154e),
+ LL(0xa95bc0c4,0xdbbe1817),LL(0x91e4e9f4,0x8583001a),LL(0xbf43b7fd,0xe4667773),L_(0x52865635), LL(0xec4299f7,0x5962ba86),LL(0x28fe8ab8,0x3849c7d1),LL(0xd449338b,0xd636805c),L_(0xa1efd1c9),
+ LL(0xa552a401,0xdfd448aa),LL(0xb92e258d,0x3f8fa817),LL(0x35b6d45c,0xa42ce187),L_(0x0d195771), LL(0x0ca7ae66,0x672eaebb),LL(0x60feb26e,0x34d002fc),LL(0x94989870,0xb3b0ede4),L_(0xc41d2caa),
+ LL(0x75191aa5,0x5261f5a6),LL(0x330e8a48,0xce0728c4),LL(0xf61c72d3,0x33ca48fd),L_(0xffeebdb0), LL(0x7973a221,0x7ae9478e),LL(0x73383a11,0x2d6cf157),LL(0xafb5d296,0x689cfdb3),L_(0x32706d23),
+ LL(0x5b0f9106,0x0bd73e3b),LL(0x62c3a48b,0x2c31c735),LL(0x0c0a3d1e,0xacf48d35),L_(0x48c97582), LL(0x9aa2cb41,0x01b5bb28),LL(0xaf780b08,0xd14e0836),LL(0x2a0a2d75,0xabcaf322),L_(0x13f7f83f),
+ LL(0xf123c708,0xb992a79f),LL(0x19a0cf96,0xada9dff4),LL(0x98adc9dd,0x6a4d3e6c),L_(0x40f8faf2), LL(0x676dfe03,0xef011d37),LL(0x7e67e105,0xb029aa6b),LL(0x87eb4d53,0x45add6b3),L_(0xce77f195),
+ LL(0xfdc3ee1e,0x3d9993bb),LL(0x8adaa277,0x9c19b8ff),LL(0x1fca3093,0x7433657e),L_(0x8caf0d86), LL(0xcbbc468c,0x85112380),LL(0x3dbd4315,0xa4c53f5c),LL(0x9d410bfb,0x374f5e1e),L_(0xf2fcce49),
+ LL(0x058ab78a,0x532b7587),LL(0xd3243b22,0xf94c79ad),LL(0x11c1365e,0xb045d4a7),L_(0xb70776bc), LL(0x35abd993,0xadb798da),LL(0xe29a9f85,0x449472ae),LL(0x04e83977,0x4ef414c2),L_(0xd94bbca4),
+ LL(0xe9445da7,0x69a5c563),LL(0x189faa10,0x013c6f09),LL(0x11ff4092,0x270bddfa),L_(0x13f400ef), LL(0xab739108,0x54c1f415),LL(0x5467f97f,0xb88a9ecf),LL(0x8a19f9f7,0xd713b7c7),L_(0xbecb24c4),
+ LL(0xa9451b5f,0xd9e41b7c),LL(0x154bb407,0xb69c99b7),LL(0x9e3d7f55,0x0a7b54c7),L_(0x135359b7), LL(0xd2d3aed3,0x84d9fef7),LL(0x5d18cdb1,0x61c13355),LL(0x142d7261,0x1cba3904),L_(0xac50bd6c),
+ LL(0xb8b1ee7a,0x709ebb7d),LL(0xec49c916,0xd7ba31a4),LL(0x16f1cdf7,0x9b4ca4e1),L_(0xd65f4a10), LL(0xad080359,0xf98d2d14),LL(0x03b182b1,0xe7c36b4e),LL(0x060b7206,0xb11e15e8),L_(0x6d96c56b),
+ LL(0xf8d054a3,0x8f77e5e4),LL(0x72cd83b6,0x93dad056),LL(0x25a5b5bf,0x25a2e699),L_(0x6fdd7673), LL(0x0063d830,0x90a6d4fe),LL(0xd576b9f6,0x3c44f207),LL(0xbcb25092,0xad2b4418),L_(0xefb79bc4),
+ LL(0x01e94264,0xfba463c6),LL(0x67359a81,0xfc726fd8),LL(0x2c69efd6,0x280e7df6),L_(0x74569519), LL(0xa6c619bb,0xe2c76093),LL(0xb18f6667,0x8f9466f6),LL(0xbd326eec,0x88831553),L_(0x87869f49),
+ LL(0x88c46f2f,0xbaa57c7c),LL(0x3b207add,0x7299422c),LL(0x4ed0514a,0xb373586a),L_(0x309bffcc), LL(0xc5186b1b,0x461b005b),LL(0xc0f53c53,0xbbee060f),LL(0xc558624a,0xcda6e3b1),L_(0x6faa11b6),
+ LL(0x1f345075,0xf0680ab2),LL(0xcbfa17ef,0xe657cfab),LL(0xcddb5b82,0x41c78a0d),L_(0x20234c33), LL(0x65c9a0da,0xc2fe9028),LL(0xf4f1f1bc,0x14464393),LL(0xfc36a9bc,0x75517f43),L_(0x7adc3f7c),
+ LL(0xc9f99571,0xba51387a),LL(0x49c36869,0xfba899b3),LL(0x03e373c6,0xb8b4767a),L_(0xb07a3f0c), LL(0x7fc1b90f,0xe85c5039),LL(0x808f702e,0x94d61e9d),LL(0xdddd86d9,0x7011d76f),L_(0xfae1c7e7),
+ LL(0xf98efe50,0x80fa818b),LL(0x31e4ef2b,0xf1aadc09),LL(0x68d478dc,0xb3f48a44),L_(0x7630fe61), LL(0xaa830a4a,0xf7c94ece),LL(0x9a533238,0x04218b55),LL(0x5e7ce696,0x3b49d1b1),L_(0x52a95933),
+ LL(0xc81b286e,0x0d20898e),LL(0x9d1c985c,0x3f1398f8),LL(0xc62ed966,0xce3b7676),L_(0xeb820161), LL(0x4dd1834e,0x60f14618),LL(0xe6d270e0,0x16b9b346),LL(0x80e6594b,0x9e645987),L_(0x879e807c),
+},
+/* digit=27 base_pwr=2^189 */
+{
+ LL(0xe215ad69,0x0703230b),LL(0x9c23cc7f,0xcb4845fc),LL(0xa6d601b3,0x3f2e4ff0),L_(0x8b1b5936), LL(0xd006b554,0xe0882f46),LL(0x402ec9ab,0xd39b85a4),LL(0x47de2c7e,0x555b4d4e),L_(0xeaa5bf4d),
+ LL(0xc42ab049,0xf78b555a),LL(0x971ade84,0x9092aa3c),LL(0x4e8a2ef9,0x5ad4ea73),L_(0x0425d602), LL(0x2b7e58ba,0x791d9122),LL(0x227d0459,0xf3147395),LL(0xc9d765a1,0xe4f1346c),L_(0x28b65397),
+ LL(0xceec40d6,0xe7d16970),LL(0x871eef82,0x361a2299),LL(0xb5fdd432,0xb27a33c5),L_(0x1d066c2a), LL(0x1d4d340e,0xe97230fd),LL(0x862b60db,0x5852f3b4),LL(0x593d4118,0x539f6530),L_(0x8436da66),
+ LL(0xe5f6d86b,0x2425af9e),LL(0xead58c17,0xe4dac347),LL(0xb5cbb50e,0xccdd8dd9),L_(0x86b3650e), LL(0x95382a07,0xdc320634),LL(0xa3e665cd,0xe9848376),LL(0x1e2d319e,0x33fae415),L_(0xeca579c1),
+ LL(0x372307a3,0x6a9d1fc4),LL(0x89b65031,0x50fbf109),LL(0x23a987e1,0xfde88e7a),L_(0x2dd37a50), LL(0x2947bdb3,0xcebc549b),LL(0x820f3f12,0xab66e245),LL(0xb7bcaa87,0x694bc71e),L_(0x8e6e09c1),
+ LL(0xc6572555,0xfe8a98ef),LL(0x63ff767a,0x71371393),LL(0xc5f7f4d1,0x0e5335e1),L_(0x7cfba5a2), LL(0x96ccd504,0x77da1976),LL(0x67e59eaa,0x16544c87),LL(0x504acfd5,0x96be881c),L_(0xbeef988a),
+ LL(0x3faff788,0x82325976),LL(0x575e852e,0x05c5a091),LL(0x2c72e2f2,0xe0cc66d6),L_(0x1927e387), LL(0xb872a6ad,0x4d0b0121),LL(0x7da1cf59,0x5bcfc963),LL(0x26204672,0xdb25f5a7),L_(0x0a8b1258),
+ LL(0xe8b35d2e,0x7d69f703),LL(0x20d3988b,0xc271bab1),LL(0x6c24b0c1,0xaab259f9),L_(0x5e65b843), LL(0x51fcf150,0x75e5c2e1),LL(0xea29f462,0x8993613b),LL(0x1834a191,0x8c9eae94),L_(0xf967c0ea),
+ LL(0x41292928,0x7e9bdb88),LL(0x00adf08d,0xc2ca609c),LL(0xa0138acf,0x8dfb7875),L_(0xd93b37ee), LL(0x3666deb2,0x749de945),LL(0xbfd574b2,0xe95a61ae),LL(0xe75abd5a,0x67c65b64),L_(0x13366a27),
+ LL(0x21088150,0xb08be400),LL(0xe06fcef2,0x86d73e23),LL(0xe0ba359f,0x607c14ca),L_(0x382ff71f), LL(0xe5594024,0x6404f03c),LL(0x3f8a49f7,0x148ec4e9),LL(0x7853702e,0x4887d191),L_(0x04d3f5e6),
+ LL(0xd2a149ac,0x67857251),LL(0xdb805369,0x8e8ea485),LL(0xd63c66e4,0xa73ff057),L_(0x587ee86f), LL(0xfb2b3fde,0xa10a6759),LL(0xbd927cb1,0xfc748cd7),LL(0xc799e97c,0x6f65ee19),L_(0x4703e5a8),
+ LL(0xa25a7805,0xaa2f24f7),LL(0xba32a728,0x7fcf37bf),LL(0xb7ad366d,0xa0ac6a50),L_(0xb220a09e), LL(0xcb955e95,0xd5db1087),LL(0x44a3150c,0x65f007ad),LL(0x09784fd1,0xf6f05498),L_(0xc1e6c0b0),
+ LL(0xc19f511e,0x06b7160e),LL(0xbb692e48,0xc84c111e),LL(0x15498ecf,0xb77b124d),L_(0xbb092f5d), LL(0xc61f57ba,0x74e3ca97),LL(0x7b0969cb,0xd5839144),LL(0xf86a2cf8,0x6d59ed66),L_(0xdeabc883),
+ LL(0x9f404ee0,0x17174a2e),LL(0x852eae73,0x1bb80f22),LL(0x1e348f1a,0x0374bff3),L_(0xeacc5568), LL(0x8d863212,0x5585a76c),LL(0xa921615e,0x66b5bc71),LL(0x1b74c1fd,0x26867d50),L_(0x52fb37fb),
+ LL(0xd2f49002,0xb96496b7),LL(0xe996dbee,0xa5746d1f),LL(0x39670ef3,0x8094e471),L_(0x9c159e05), LL(0x286d79a8,0x4226465a),LL(0xb7fd505e,0xbf1aca6c),LL(0xf2355f67,0xe46e77c4),L_(0xe0fbfc8b),
+ LL(0xea2be4c9,0xc386d032),LL(0x16b11ec1,0x828f0d4f),LL(0x75da11d8,0x94c7a19f),L_(0xfda19041), LL(0xd7f40cb4,0xcd2bfd30),LL(0x0e5ba2ee,0xb240b8db),LL(0x2339d87a,0x375d7766),L_(0x24af1974),
+ LL(0xd5cb473f,0x0c7c5c0e),LL(0x06c1fc0c,0xb684879d),LL(0x1d94e717,0xb65c6a50),L_(0x0b30821a), LL(0xd7821eb5,0xefa6a39d),LL(0x6459b552,0x727bdd40),LL(0xb7d7e4b6,0x18598afa),L_(0x00b319ed),
+ LL(0x703608d7,0xf884841c),LL(0x8dad7679,0xe15515c9),LL(0xb306db5d,0xb36c0754),L_(0x5229df9a), LL(0x979aad60,0xaadea0d7),LL(0x970bb22c,0x6c1b7c90),LL(0x298689dc,0xf3b57c01),L_(0x89fe17ad),
+ LL(0x428e4fe4,0x76218fd4),LL(0xceff7d9d,0x975a4605),LL(0x63a383cf,0x238b4e91),L_(0x99f29b16), LL(0xccf0edbc,0xe11ea485),LL(0x7ae47927,0x93601402),LL(0x7cd7a8d0,0x0d9f157a),L_(0xb3fa2b87),
+ LL(0x9e4d4311,0xff049f88),LL(0x85fe8244,0xcf8e1ceb),LL(0x5d2ff231,0xef0f5b1a),L_(0x63ccdc00), LL(0x959a2ad3,0x8ba95ec0),LL(0xa8a44260,0xbd876759),LL(0x6ed75cfa,0x3e43af21),L_(0x8464e573),
+ LL(0x444c26f1,0x65d29b4c),LL(0x1583a353,0xee5f7609),LL(0x43193114,0x92998e59),L_(0x704abb0e), LL(0x99be8a63,0x2a7e16f6),LL(0x4c98adbf,0xe1fc70da),LL(0xa5a25fbe,0x44dc73bb),L_(0x8fc488f7),
+ LL(0xa3bfed42,0x784f9377),LL(0xe7bcd034,0x07fc5bf3),LL(0x89f2f24f,0xbec66d27),L_(0x4917e013), LL(0x3a3c1ba3,0xf0cde4d7),LL(0x0961875a,0x69bd4eb3),LL(0xa260b4df,0x59faeb8c),L_(0xbeeb1631),
+ LL(0x21f06827,0x280f3962),LL(0xa088a1e1,0xcf16263e),LL(0x1dbee473,0x1692a131),L_(0x05a158ea), LL(0x283c279b,0x0a11b121),LL(0x0e13e263,0x8ed3889a),LL(0xdee544e9,0x5dcaae12),L_(0x8f1fbb34),
+ LL(0x87dc2c5f,0x5d2e90ad),LL(0xb9ad99ac,0xed6943f8),LL(0x0c329529,0xaa459865),L_(0x96ffc387), LL(0x34567b61,0x13516c2e),LL(0xa0aa883b,0x39122bf4),LL(0xbfa72fcc,0xa825f1f8),L_(0x97da099b),
+ LL(0x67b5c14e,0x14bced82),LL(0xf4fdf535,0xff66cf51),LL(0x689f6f0d,0x71814baa),L_(0x5b8ff385), LL(0x247c8262,0x9c1ba7ce),LL(0x907e4e69,0x4b578253),LL(0xff0ce18c,0x2458cb25),L_(0xef5cd0aa),
+ LL(0xb909db13,0xfee8b8ef),LL(0xa4710d21,0x1107af8a),LL(0x54895b98,0xb541a6b0),L_(0x526b0ca4), LL(0xa7097ce7,0x16947322),LL(0x31b294e5,0x29af3ae4),LL(0x1b4cb2b5,0x98687802),L_(0xfbcc3509),
+ LL(0x1586105f,0xb150cf07),LL(0xe16b93aa,0xa4bbc36a),LL(0x253eb0dd,0x984df68e),L_(0x87118c04), LL(0xcb079f80,0x480076ec),LL(0x0dcde0c7,0x6b489d1e),LL(0x18bdffd8,0x16aa0174),L_(0x1f265d34),
+ LL(0x59614a61,0xee0e75bd),LL(0x5617d582,0x52348cb9),LL(0x3e671da9,0x0190d33a),L_(0x3bee1eff), LL(0xaa01d03e,0xe617dbcb),LL(0x09cde5ef,0x84c57057),LL(0x888eade7,0xfc85f3d6),L_(0x359daa39),
+ LL(0xd48bf3db,0xb342c647),LL(0x4a00b224,0x40b2d73f),LL(0xb894175c,0x58a94e88),L_(0x70cf2206), LL(0xb4cd9a9f,0xf20b5560),LL(0xdca48b9e,0x1a01b8da),LL(0x7707c57e,0xa0a1a133),L_(0xc33e6b03),
+ LL(0x727e08d2,0x9c8970a1),LL(0x4c16f18a,0xf1b1124a),LL(0x57b552ca,0xda495e0b),L_(0x1a9ee7da), LL(0xe079a731,0x1ad4dac4),LL(0x06f7634a,0xf219d184),LL(0x1b77c61d,0x110655eb),L_(0xd5bf028c),
+ LL(0xf20ff378,0x21c59244),LL(0x51b05ff6,0x7d017e8f),LL(0xaf13b9eb,0x2b5c0017),L_(0x4aa9bdff), LL(0x2371404f,0x703d8718),LL(0xaf5e4830,0x1cdec0ba),LL(0x52cc936a,0xf59d1925),L_(0x013abb12),
+ LL(0x0e22d6ca,0x1082f990),LL(0x2c9f0b9e,0xf4898bd8),LL(0x666e06e5,0x703ab683),L_(0x6f1b6308), LL(0x2a6a3005,0xc8b722db),LL(0xd103845d,0x3ef671a0),LL(0x2459c28d,0xd0ce016b),L_(0x60884f40),
+ LL(0x59320b15,0x7f7ba17f),LL(0xe194bda2,0x52a3af1a),LL(0xbb90a873,0x2977890c),L_(0x3dc3fa11), LL(0x13cb3938,0x1ec1818b),LL(0x2f976a14,0x813e2d47),LL(0x6ef670b1,0x547bbc14),L_(0x7a6392b3),
+ LL(0xbee8917d,0xfa44c4a2),LL(0xd1652cf8,0x11ddbdcd),LL(0x7b98c98d,0xeeaab800),L_(0xb60ccb53), LL(0x699cc945,0x20bc5779),LL(0x3d3d111a,0x5d171d19),LL(0xf1c69a57,0x4586a0f5),L_(0x047748d6),
+ LL(0xcb2dd3a2,0xbfb2046d),LL(0x1ba40992,0x4ab9b7d4),LL(0x492e1976,0x8fa3d075),L_(0xb62a0315), LL(0x9faa1011,0x08bcfaa8),LL(0x55ee388d,0xa8201ba0),LL(0xb50f4e76,0x48d16444),L_(0x947b5775),
+ LL(0x7bb21f8c,0x27f91139),LL(0x9933e071,0x7328102f),LL(0x16712a5a,0xc739c006),L_(0x75d0d886), LL(0x0d97d602,0x95eed6e2),LL(0x5fd2d047,0x4657933f),LL(0xfa45dd80,0x9d54f1fb),L_(0x741b92d0),
+ LL(0x4b499dd3,0xe5114e38),LL(0xc2275c0e,0xc9aa88b0),LL(0xb4d5582b,0x3e016601),L_(0x25741fdf), LL(0xe08edbac,0x4514d2eb),LL(0xc4ccb66a,0x16e96390),LL(0xb57016cb,0x59b84d70),L_(0xf83fe7e5),
+ LL(0x697291df,0x7a6974e3),LL(0xcecae61e,0x747d2ddd),LL(0xa93265cf,0x1f1fb9f1),L_(0xf3c9e95d), LL(0x05b8ad90,0x76333190),LL(0x5ef96caf,0x2e7e8b35),LL(0x26204dea,0x66ec9969),L_(0x8ee499c3),
+ LL(0x7d3e7f82,0x1abe8df3),LL(0x0e4c49fd,0xf5621bfb),LL(0x5430fd38,0x5d968105),L_(0xb2efc301), LL(0x7fa73503,0xde3d9216),LL(0x191e5b5e,0x358512db),LL(0x32722378,0xa0892090),L_(0xd92f1352),
+ LL(0xfec9743d,0x757c94ef),LL(0x9649e576,0xf290f932),LL(0x79587916,0x8be7ad8d),L_(0xadd01304), LL(0x61f6de8f,0x29445ca0),LL(0x285b7eef,0x1426c1d9),LL(0xae55ea09,0x962f7357),L_(0x983ad1c5),
+ LL(0xdfa17534,0x40d7b215),LL(0x3897f22b,0x4a689975),LL(0x0a2968a8,0xae9ce773),L_(0x5eeabf53), LL(0xb2a472ce,0xd7707d10),LL(0x3f8692b7,0x11cc24bf),LL(0x416e3f6c,0x0e77bce9),L_(0xf53b376e),
+ LL(0xe52b9bd7,0x211044a2),LL(0xb9dbcba3,0x32202391),LL(0x7e52000c,0x2961ea4a),L_(0x12e1a413), LL(0xae4f775c,0xc87793ae),LL(0x36916c16,0xadc59df4),LL(0x93f3db96,0xf4f9dbfb),L_(0x2bfda0b4),
+ LL(0x04c1afdd,0xbbbbeb9c),LL(0xcc1030ad,0x0de0dfaa),LL(0x49bedb1d,0x1869975f),L_(0x6a004fbc), LL(0x0b0e188c,0x51c16437),LL(0x71e53119,0x3e18f624),LL(0x5e139c48,0x60f866a3),L_(0x0784d6e0),
+ LL(0xc173ecc1,0x97f340e7),LL(0xa61d043f,0x444c1c32),LL(0x4c35a67a,0x8581b05b),L_(0x44182222), LL(0x731fc41e,0x45bca0e4),LL(0x8bf96ead,0x853c2a7b),LL(0x7c86a091,0x2ad3d962),L_(0x7ea985d4),
+ LL(0x5d1d3e02,0x1ef28f3e),LL(0xcbf512f8,0x72330e86),LL(0xdc8ed43f,0x516f1183),L_(0xec32dc2b), LL(0xd7b96122,0xc45e5ada),LL(0x505156da,0xdf67ff42),LL(0x983acb8c,0x30958d17),L_(0xe6ec6def),
+ LL(0x569438de,0x1072cfdf),LL(0xaaf2a64f,0xda01f192),LL(0x33454609,0x8b880e7d),L_(0xa7a46a05), LL(0x35cc6b77,0x7354fe07),LL(0xd5821805,0xa74b9400),LL(0x0fc1cbb1,0x0e58985d),L_(0x9f7a9dad),
+ LL(0x84ac106e,0x9dc30814),LL(0xe1ebef86,0xcd23c165),LL(0x852da87b,0xed5cdd01),L_(0x21bc828d), LL(0xce6842d7,0x5aadc859),LL(0xe522baaa,0xe89ad998),LL(0x608b4b16,0xee466b6e),L_(0x0c33a24a),
+ LL(0x8243d368,0x4e1fae12),LL(0xf397b191,0xe6b7d57c),LL(0x2940f1c8,0x47dd818f),L_(0x68c77c89), LL(0xe08f2ebf,0xba40969e),LL(0x8ffaa799,0x102a6172),LL(0x712df945,0x997feef1),L_(0x4da4261d),
+ LL(0x455b0c0c,0x1b0afa51),LL(0x69fea568,0xf8ba1286),LL(0xdfc334a6,0xa2587e32),L_(0xf61b674f), LL(0x060208cb,0x62eb8d23),LL(0xdd643088,0xa1a3f3bd),LL(0x5cde0036,0x53b8bdc0),L_(0x1c5ce488),
+ LL(0xb0c1bb5a,0xa64a20a5),LL(0xd22b7f88,0xf22948de),LL(0x0628283c,0x75129c40),L_(0x6efeb06e), LL(0x4000d1fd,0x76f8c148),LL(0x181e8b58,0x7b823883),LL(0xc758648b,0x3d1fbafb),L_(0x069f31f1),
+ LL(0x2b15bfdf,0x78f3872c),LL(0xbba94fb7,0x49778942),LL(0x852ef997,0x48ddef24),L_(0x066ad60c), LL(0x38c99352,0xc1ba735f),LL(0x790d395b,0x30382b1c),LL(0x7616ea81,0x61b408b8),L_(0x9278e0eb),
+ LL(0xc0f1bdbb,0x15c9a84f),LL(0xae384504,0x1419e604),LL(0xf4814e2b,0x1b8b0e26),L_(0x2b97a1b4), LL(0xf8656f5b,0x260ef3d0),LL(0x5db22d7e,0xc76c3691),LL(0x2e7c6bf8,0x7c1471d1),L_(0x7bdec3b1),
+ LL(0xa27bd94f,0xb71fd22e),LL(0x7f17f289,0xbbacb216),LL(0xd4564a47,0x34b284d4),L_(0xb75a3120), LL(0x09622583,0x986c8a28),LL(0x197cc0c1,0x208425a0),LL(0xcc3ae593,0x7da4599c),L_(0x54ebd08e),
+ LL(0x2d21c888,0x9addab68),LL(0xbd0c6b5c,0xcad27cf0),LL(0x7ec99646,0xaa918115),L_(0x8ee2e6eb), LL(0xea74e73d,0xd9db5cd3),LL(0x2d90dfec,0x719d6c8b),LL(0xf48ec5bb,0x7732d381),L_(0x2daa3783),
+ LL(0xfe67cafa,0x4087fb31),LL(0x64d12677,0xa7b372c6),LL(0xd6d5d34f,0x5aa57c66),L_(0xeebb82c5), LL(0x03f99f8c,0x0b3a848f),LL(0x4bcc334e,0x3076a517),LL(0xafc73b46,0xbdc15e76),L_(0xba3353c1),
+ LL(0x666e86e2,0x3f49b089),LL(0xe4f392d0,0xb96b8ccf),LL(0xc0bd57d7,0x4a84d25e),L_(0x8b9c3a47), LL(0xdd447511,0x88262b51),LL(0x5d6233aa,0xf3ee05e8),LL(0x1da165fe,0xba39a0b7),L_(0x56569118),
+ LL(0x4b2743e8,0x55aff6c3),LL(0xffb26779,0x0356100f),LL(0x581f3f38,0xc259ed17),L_(0x0527ce42), LL(0x9f2d81ee,0xeb967185),LL(0x592962f6,0x58f98402),LL(0xbc866b82,0x9a5ee9a2),L_(0xb8fcf82b),
+ LL(0x50d6a742,0x7b7d67a1),LL(0x6bed8eca,0x0cc91aac),LL(0x74e18696,0x3ac5ac85),L_(0x4777aaae), LL(0xfcd5973d,0xaf83cba8),LL(0x114e541f,0x44df12cc),LL(0x49c90e0c,0x6ffe97ac),L_(0xd22caea2),
+ LL(0xf6ec95c0,0xad0a7c5c),LL(0xcf68be2d,0xef894370),LL(0x46042df0,0x44cc34c3),L_(0x83baaad0), LL(0xda2df354,0xe5be5f7b),LL(0x232306d2,0x09c99b41),LL(0x30e3711b,0x7b102ef8),L_(0x90ca6b87),
+ LL(0x9041d06a,0x24f85c28),LL(0x1c82027d,0xc05d59fb),LL(0xc82c4968,0xf294dde1),L_(0xa0dabc8e), LL(0xc334c99a,0xeadad609),LL(0xa2d74908,0x47f2b704),LL(0xea64f015,0x3b0536e3),L_(0x948d4413),
+ LL(0x90fcfab4,0x4cd8e163),LL(0x7e58fb10,0x9bc6ae53),LL(0x3a2788f9,0xc860f6b9),L_(0x673a28d4), LL(0x95e581f4,0xc5e46853),LL(0x62c5a4e9,0x6d07718f),LL(0x059005a0,0x5a617a3d),L_(0x06267ff2),
+ LL(0xe3e68d85,0x2af744e2),LL(0xae8162d5,0x16487042),LL(0xbe28dd7a,0x950dd089),L_(0xcd76243e), LL(0x6a083312,0x887a306e),LL(0xc5cf5f6e,0x963509bb),LL(0x6076457e,0xd58cb75e),L_(0xa5a9063c),
+ LL(0xe722f017,0x6f63cd75),LL(0xa7571852,0x216d76b1),LL(0x2ab669d0,0xd42dd087),L_(0xee6f2f6d), LL(0x097743cb,0x0a7d1e20),LL(0xfa5d28f5,0x21dad6f5),LL(0x9441fb90,0x8466e082),L_(0x4a673507),
+ LL(0x55c0ab69,0x980ae610),LL(0xc6222c7e,0x5c17d9ff),LL(0x3030f359,0x9b8f42e0),L_(0xbbf50262), LL(0xd0aba7f0,0x469ee64e),LL(0x3ef5e0ea,0x45ce7ede),LL(0x0e1c1519,0xb57bce91),L_(0x806bb655),
+},
+/* digit=28 base_pwr=2^196 */
+{
+ LL(0x18e92c63,0x4760716e),LL(0x789ae13c,0x03cdfbf4),LL(0xf578d1e6,0xc6470ce9),L_(0xd42e2969), LL(0x4db766a1,0x5f1cf230),LL(0x733456c6,0x1237a68d),LL(0x592bb19a,0x91e21ef9),L_(0x8814ad36),
+ LL(0x91a052d2,0xbefb4b7b),LL(0x6eb484b6,0xf5d7b19f),LL(0xa01ef7f5,0xdc02e33e),L_(0xf8ac22f1), LL(0x1ee85810,0x0cbad014),LL(0xc2d60cca,0x0ecada19),LL(0x78a4abe0,0x375f545c),L_(0xbb2518b8),
+ LL(0xe924bce1,0xe94cf6cf),LL(0x721159cc,0x3c03f7b7),LL(0xd001dacc,0xba328884),L_(0x6ca68824), LL(0x99214785,0x857c60d0),LL(0x3e1c1a16,0x6d9d01de),LL(0x4e3a8a4a,0xe5100cc6),L_(0x2fadd498),
+ LL(0x21699c26,0x96e332c1),LL(0xba35b5c5,0x3b2527e2),LL(0x32a3227e,0x3d572604),L_(0x3287caa4), LL(0xfa83e20a,0xd3d8aa48),LL(0xd8f05722,0x42872cdc),LL(0x211c6e5e,0x789832b8),L_(0xd7095c24),
+ LL(0x76f2859a,0x8e5e0a08),LL(0xa554b8a7,0x49d7fe17),LL(0x3cfefa32,0xde9b7d08),L_(0xb712685d), LL(0x3f072319,0xd942a6e3),LL(0xc242dae3,0x105e78a0),LL(0x5c2986c1,0xca0a3ad3),L_(0x58984f5a),
+ LL(0x90f303c9,0xbb8f3d66),LL(0x75e4f894,0x9f67adfd),LL(0x597d61ec,0xc5900752),L_(0xbb05ff05), LL(0x608daf57,0x78265562),LL(0x8bb8c320,0x31f9a44f),LL(0x2afed365,0x9604812d),L_(0x2ecd08d1),
+ LL(0x254ed32d,0x4f8511c4),LL(0xf62b6ad5,0x437b9a4f),LL(0xe0ab6bd6,0x9849b3b9),L_(0x437c1eb4), LL(0x99f67517,0x60c66156),LL(0xe2da9ad4,0xe7f23f9d),LL(0xc72b155a,0xe933cc08),L_(0xad7576ea),
+ LL(0x83df61c0,0x019aa18e),LL(0x06661e71,0x159ba381),LL(0x2a662ce2,0xc9069497),L_(0x5ff8cdb7), LL(0x90a3120f,0x22ef5986),LL(0x62a400b7,0x4c18595b),LL(0xb2915c27,0x1fe38da6),L_(0xffba34b0),
+ LL(0xeb9b1c9e,0x6335b063),LL(0x6133838a,0xfc5ad1b9),LL(0x76c52676,0xce767a1c),L_(0x5e465185), LL(0x3794090c,0x93f4d92f),LL(0xce0d54ed,0x25dd3904),LL(0x742e50dc,0xabc94edc),L_(0x78bba80f),
+ LL(0x887eb7e0,0x4b83b6cd),LL(0x81b49586,0x1b46a818),LL(0x1fa505f1,0xae4acd7d),L_(0x832817ef), LL(0xc574766b,0xd6ef910f),LL(0xd59182a2,0x2419996a),LL(0x764ce5bd,0x323e203f),L_(0x63236d14),
+ LL(0xf567e8d7,0x118cb519),LL(0x8ea6b928,0x1c12c8c9),LL(0x56dd68b6,0x395935d8),L_(0xbd116bcd), LL(0xfc1ac8c8,0x5ced4a6b),LL(0xbb4ec3a0,0x5a7b4c09),LL(0x63f4b4af,0x1f24cb4f),L_(0xf9b9d0b1),
+ LL(0x596243e7,0x18a50232),LL(0x25f531db,0xaa27b297),LL(0x8b3f0f16,0xa0701098),L_(0x6a6aef50), LL(0x60fe4fb4,0xfb3a537d),LL(0x8c64961c,0xd4b3fc26),LL(0x83f4d9b6,0x440a2f19),L_(0x7696fcba),
+ LL(0xf34d3bad,0xc0f2402b),LL(0x5360ffc2,0x2a9eb601),LL(0x8d33aed5,0x7da3a904),L_(0x4dde5b44), LL(0x3a35e974,0x6c75adbb),LL(0x0c9938a7,0xd7a77183),LL(0xf4ef9f5d,0x30114b89),L_(0xbb08ab61),
+ LL(0x80255f87,0xdf042ef7),LL(0x481cae35,0x2a918359),LL(0x6fed5580,0x3de7d914),L_(0xa4e1bcfb), LL(0xcd8bcdde,0x85cd2cff),LL(0x4370738c,0x03a1d543),LL(0xf95a95e6,0x9814d14c),L_(0xe0fd8dcb),
+ LL(0xf9193246,0xc27ed927),LL(0x655d6ffb,0xe4ef91cd),LL(0x43a4fc18,0xde7270a7),L_(0xcba9f29e), LL(0xa246b9ef,0x2e139df8),LL(0x5cc92d84,0xc362ff6d),LL(0xc5a596a0,0x6a5bdae7),L_(0xd5e4697c),
+ LL(0xdd86fb5f,0xa1aad671),LL(0xf4cdb11a,0x2ccfca9e),LL(0x35eb1979,0x06b67d2c),L_(0xd3a50661), LL(0xcf9afa3f,0x47a43129),LL(0x2c80dfe0,0x0f28c072),LL(0x1e137541,0x2528a436),L_(0x4a30bc3a),
+ LL(0xb7a122bc,0xa27429d1),LL(0xac029aa3,0x8704523f),LL(0xe555d79c,0xc26117ae),L_(0xeee94c98), LL(0xd57ea228,0xb5866e80),LL(0x3b83d3dc,0x8fda3fab),LL(0x497236f4,0xa896a908),L_(0xc1eba30c),
+ LL(0xa3fc2c9c,0x0b1d2a88),LL(0x6a45073a,0x8af7a77a),LL(0x72b5edce,0xc7a3b1fe),L_(0xac5268b4), LL(0x018d5428,0x8589b539),LL(0x25c0f37d,0x22f0783b),LL(0x8cf1d803,0x9d3fe1d2),L_(0x15093e7c),
+ LL(0x8d1c5128,0xac83f07c),LL(0x6eba86a7,0x4ddb4944),LL(0x7769b4f0,0xce08325a),L_(0x306da9b2), LL(0xe9629e93,0x9fd70869),LL(0xbe70ef68,0xa27b01af),LL(0x9649ac38,0x59634c20),L_(0x260c709f),
+ LL(0x32f4b675,0xe36b9e35),LL(0x56c9f551,0x59ec0560),LL(0x9a19b345,0x7b1c335b),L_(0xb90484f8), LL(0x2e951d15,0x0b5ef9ec),LL(0x8c6e220c,0xac2613e4),LL(0x4ddb2066,0xe5c29249),L_(0x2b898fcc),
+ LL(0x90d06a78,0xb7d4dedc),LL(0x3cc11efc,0xf6a2c79e),LL(0xc5d55aae,0xebad4304),L_(0x139832e2), LL(0x73f6f29a,0x0089eaff),LL(0xb6ab35e5,0xa043d1f1),LL(0x35af18a2,0x363f80f9),L_(0x8c8c5655),
+ LL(0x800e76ab,0x3cad20e2),LL(0xd54cc179,0xd6ee4412),LL(0xc7630400,0x8ece816d),L_(0x4347fa49), LL(0x46a3c678,0xe22f3ed6),LL(0x83d72b28,0x5e7ffb13),LL(0xa89efb1f,0xc07fe6b1),L_(0xf679cfd6),
+ LL(0x1e9baa6c,0xdd4159b6),LL(0x90409ff6,0xc1a8d493),LL(0x0509d403,0x0d946df5),L_(0x46153d5b), LL(0x2b496957,0x1229cd0e),LL(0x25841f04,0xac5550dc),LL(0x163487ec,0x1f5ac4bb),L_(0x7a894b16),
+ LL(0xf830d51c,0xd0fd0fde),LL(0x95e0fb87,0x393b8885),LL(0x12d4a0db,0xbac4ce3b),L_(0x4aecb41e), LL(0x949595c3,0xf6b866b2),LL(0xc85cee8f,0xadac3140),LL(0x929c773e,0x22cf7705),L_(0xf90855df),
+ LL(0x05ee1c57,0xb938eeef),LL(0x054fb615,0x87e5ccbf),LL(0x7d1ce423,0x624c46af),L_(0xc8279b91), LL(0x70e96354,0x6fc664fb),LL(0x957fa9ea,0x0ec18ae0),LL(0x86d71f58,0x8216ab5f),L_(0x4fdcf503),
+ LL(0x6a1895bd,0x99acbf5f),LL(0xea1c792e,0x2f4551f2),LL(0x3d4924d2,0x09c0ca0b),L_(0xb94190da), LL(0xa95f5a84,0xaccafdf8),LL(0x6c1aa007,0x7635c97f),LL(0xe4eccac7,0x07821f33),L_(0x3125c30a),
+ LL(0x9eee4fb3,0x76375e85),LL(0xa2da6002,0x6d9d3924),LL(0x851663d2,0x903300d5),L_(0xe4304412), LL(0x16885ea2,0xf13f93d6),LL(0xac6cc7e1,0x765c7a8f),LL(0xc233fc52,0xfa884feb),L_(0x889b7699),
+ LL(0xea0d9656,0x649b4877),LL(0xb98eb821,0x0e89d083),LL(0xda85057d,0xe8c391ca),L_(0xc53a37ec), LL(0x5ab13638,0x3c241d52),LL(0x1c63bf16,0xe5732bef),LL(0xe6f1e93f,0x882db63a),L_(0xacf7e8f4),
+ LL(0xb0ae8194,0xd18b015c),LL(0xf734d021,0xe38e3807),LL(0x62b04fde,0xea71f882),L_(0xe9f4d402), LL(0xb7452054,0x3d8f7744),LL(0xad9abc71,0x68a3e02d),LL(0x088ad020,0x25dfde15),L_(0x250f4123),
+ LL(0x5076af69,0xe0e96eac),LL(0x46b7097a,0xd8c13c78),LL(0x19ddbba5,0x3ecd0bd0),L_(0x1b6e3a84), LL(0x74eefc3e,0xfc22adbe),LL(0xbae23185,0xad1b79ab),LL(0x09ed4ed6,0x062eb7e7),L_(0xe1ce81e7),
+ LL(0x06e9bfca,0x4649146e),LL(0x91702d2f,0xb30f9778),LL(0xbfdaf3cb,0xcf8f23f1),L_(0xd403a4bb), LL(0x13bbb0cb,0x33bbb504),LL(0x5d48ee37,0x17c9202c),LL(0x79ec8717,0x5a9ca7a8),L_(0x76092de3),
+ LL(0xfe5a3569,0x1f9e6c97),LL(0x17ed7898,0x2727d871),LL(0x668c28ad,0x745aa2ed),L_(0xcf9ce234), LL(0x83f03768,0x4a783728),LL(0xbf5955af,0xadfd1b46),LL(0x92891a4a,0xea43a792),L_(0xc67457a9),
+ LL(0x44cf762b,0xb8dd47fc),LL(0xff42200e,0xe06ffe0d),LL(0xa70a5da7,0x6cbd4092),L_(0x6d058c66), LL(0x0f9eb44c,0x110c3a99),LL(0x67048ffd,0x990449de),LL(0x82fc6b0f,0x30242c32),L_(0xa769318b),
+ LL(0x2521a3f3,0xbb708ced),LL(0x7620c902,0xe32cd4d5),LL(0x75832ff6,0x3a89190f),L_(0x4632df7f), LL(0xc48dd2c2,0x48e4bd13),LL(0x62dc813c,0x4888006f),LL(0x9c55f000,0x36a4457f),L_(0xa330078b),
+ LL(0xb664f023,0xc1f3d1a9),LL(0xe37d1ff2,0xa5e8a776),LL(0xed06b0a5,0xb1d3c33d),L_(0x939c8f4c), LL(0x836de412,0xf53390d9),LL(0x9e6ebae1,0x35e4cf7b),LL(0x28276f39,0xd69e1327),L_(0x19f5bac2),
+ LL(0x7885d34d,0xafd90d23),LL(0x0e84e363,0xbf4cd59c),LL(0xabb80eda,0x07e40274),L_(0x95656580), LL(0x0b980b41,0xa8a767b0),LL(0xc90af857,0x560c2286),LL(0x465bb86e,0xbf658fdd),L_(0x7eb455a7),
+ LL(0x49a8618f,0xda192000),LL(0xad70ec43,0xd0fca141),LL(0xcb55de32,0x7d66c4af),L_(0xa952a38d), LL(0x06ab4e56,0xdceb099e),LL(0xed3e0675,0xa87bfc4d),LL(0x635a862a,0xb9f4c7da),L_(0x8d6f1c2a),
+ LL(0xfd911863,0x6f166fdc),LL(0x0c46e6e4,0x31dda475),LL(0x0813e798,0x9066cff4),L_(0x2f759557), LL(0x65e21d85,0xbd44613d),LL(0x06317041,0x5b7e81b6),LL(0x6879039b,0x6853d2d8),L_(0x80566bad),
+ LL(0xe802ae6d,0xd83655d3),LL(0x7c1a0bb8,0x58e0b41c),LL(0xa5228881,0x00c5e925),L_(0xe9c51c0b), LL(0x0ab1b93f,0x0234b858),LL(0x9a00e742,0xe3d995c9),LL(0xf774358e,0x0eb69043),L_(0xd46eb256),
+ LL(0xe178f2a2,0xe386daab),LL(0x9a305482,0xe1fa3e14),LL(0x7957d9d7,0xf3f52055),L_(0xd1a9ce7b), LL(0xd284eae6,0x303b5ae8),LL(0xac2ad67a,0x7abad7f1),LL(0xb7b58e09,0x7dc5f5f1),L_(0x6c99d250),
+ LL(0xc25aa814,0x29507cf4),LL(0x37c15d8e,0xa6beff47),LL(0x738d9ba6,0xeb76b42c),L_(0x0b91ab81), LL(0x0d166346,0xac1dd9b7),LL(0xb974e300,0x5e6f1484),LL(0xd55b5832,0x9748b154),L_(0xbfcdc886),
+ LL(0x767c2496,0xaa791b18),LL(0xb611f73f,0x6dd24074),LL(0x6fd43d11,0xde586616),L_(0xff2a1da0), LL(0xd73b7439,0x7da57054),LL(0x5051af3a,0x9ca8008f),LL(0xa7d98205,0x80c04759),L_(0xd4db7bec),
+ LL(0xaef4ac4b,0x9051c152),LL(0xd36418fc,0x3e90a332),LL(0x2adcc4ec,0xa2d25b82),L_(0xf9315c6a), LL(0x062c149b,0x6fec476a),LL(0xbdd2e105,0xb614d883),LL(0xdc2bc2a6,0xd473b242),L_(0x9d87dbe8),
+ LL(0xadf54761,0x4031a20d),LL(0x5001f11c,0x908ea1cd),LL(0x86e3fa8d,0xa7c80719),L_(0x36408819), LL(0x4573ac01,0xaf0e8125),LL(0x430d59f8,0xcf05666d),LL(0x5b426c42,0x1c62cb71),L_(0x1a2c3f95),
+ LL(0x840aabc5,0x42998c5b),LL(0x9b1ab1ad,0x41b44d81),LL(0xe7ad335c,0xd2f18816),L_(0x9b21d6a9), LL(0x31ed5509,0x09dc1280),LL(0xc3771787,0x5bacd41e),LL(0x69b13c81,0x5419b128),L_(0x472d8eda),
+ LL(0x47816cca,0xc26aa120),LL(0xb9665455,0xd20f8647),LL(0x3bac4cd2,0x4b96b490),L_(0x15632e30), LL(0x82eca1ec,0x03c2ca5f),LL(0xeac8678b,0x8d2f8677),LL(0x5772568c,0xbef62c1e),L_(0x3b53ce81),
+ LL(0xee48fbfb,0xbe66a12a),LL(0x753cb0aa,0xe362e842),LL(0x38781cdd,0xcf1c41a4),L_(0xab22df0a), LL(0xb208a69c,0x7e4c97e4),LL(0x3869cfcb,0x72ee6ffc),LL(0xb43a4e85,0x6ab97c59),L_(0x35c0f24a),
+ LL(0x98013b12,0x292f0d68),LL(0x3e2b7aaa,0x42f99c9b),LL(0xe2ba5f7b,0x77ff29a4),L_(0xe21d90f9), LL(0xd9c0cb58,0xbc0b01cf),LL(0xe3677335,0x4d244a26),LL(0x8fee4b54,0x2b1a301a),L_(0x5d1511ed),
+ LL(0xa5f95387,0xe5e95789),LL(0xd73285ea,0x392f5392),LL(0x2e506fa2,0xecb1a91e),L_(0x79d54bca), LL(0xbdc25307,0x7bf48edd),LL(0x9f75d7b8,0xe8a12662),LL(0x08014deb,0xaf188a86),L_(0xbfada230),
+ LL(0xd011c31b,0xa63e4dbc),LL(0xe55bd873,0xd7f84005),LL(0xbe01f07e,0x1b09710f),L_(0x6e6cb66a), LL(0x5fc5038d,0x955bdbc5),LL(0xcecf1493,0xca6b6d16),LL(0x861a0878,0x084d6464),L_(0x0d0e35ed),
+ LL(0x5abc70f8,0xcdca5ed4),LL(0xdb335ec9,0x1e0fc344),LL(0xa8df4bea,0xcaea8450),L_(0xf564ec58), LL(0x361561bd,0xffeefed9),LL(0x193c8457,0xd89a00be),LL(0xddabba77,0xc99c9580),L_(0xa8ec469f),
+ LL(0x0423395a,0xf3c9cc68),LL(0xa888f556,0x852e0732),LL(0xaaa99a77,0x79ee145a),L_(0x4760cde2), LL(0x7dbf680b,0xd543c51b),LL(0x4d61119d,0xef9d767f),LL(0xb57c70b1,0x6d605846),L_(0x8392010f),
+ LL(0x4f6c403d,0x79dcc934),LL(0xd988c0b3,0x48395681),LL(0x66a38840,0x4cdffd50),L_(0x026d6f1b), LL(0x0fd100a8,0xd01d8faf),LL(0xc2150428,0x37a79216),LL(0x453f0c92,0xff7a816c),L_(0x84b14e80),
+ LL(0x8f9b1871,0xa7823318),LL(0xab4b5d45,0xe70810de),LL(0x1d9dae80,0xce1d1836),L_(0x1f8f6e55), LL(0x3fe286a2,0x8d6bd5d6),LL(0xd272957e,0xe02405c8),LL(0xc59f4815,0x15f1375a),L_(0x1dcaf5b0),
+ LL(0xd83c608e,0x6c316cb3),LL(0x5f19c736,0x28464849),LL(0x9bb6aded,0xadea31b9),L_(0x1090e65a), LL(0x3ad3fb92,0xfec08eda),LL(0xad397892,0xf01270f2),LL(0xb2c262c0,0xe12a0551),L_(0xcd11a65d),
+ LL(0xd00f765f,0x5db707b5),LL(0xf10d38e7,0x7a2ef5be),LL(0x5bbaa9f8,0x1692548b),L_(0xa34228d1), LL(0x2a6743e2,0x654e5d41),LL(0xf2342e4d,0xbe7af05e),LL(0x53e19ef6,0x254b33f9),L_(0x2609459a),
+ LL(0x0a41c216,0x7007f545),LL(0xefba2361,0xd7626b6f),LL(0x72c3ffc3,0x600f4b0f),L_(0x68bfc655), LL(0x0f831a13,0x13f14da7),LL(0x6efd514e,0x9b2809ea),LL(0xcc761584,0x949da3c4),L_(0xd3524443),
+ LL(0xab16d7fb,0xeca99655),LL(0x98853678,0xf946fea2),LL(0x959586ec,0x2b4d5496),L_(0x882a160e), LL(0x7fe0f8f3,0xdf2a1b88),LL(0x52e13aac,0x0f3ca0d4),LL(0x4a5dde81,0xc432a9d8),L_(0xcafd8d25),
+ LL(0xae4273ff,0x39455fc9),LL(0x0c20053d,0x2cb371b8),LL(0x04a4c142,0x14b7b1d1),L_(0x38e2582a), LL(0xbc61e230,0x20e68183),LL(0xd15dab61,0x5cc3f0a5),LL(0xba541287,0x62766fdb),L_(0x6619e0a4),
+ LL(0xf1589655,0x3bc818e2),LL(0x746af8f1,0x7a905de6),LL(0xbbe6fd69,0x53589554),L_(0x446a9ab9), LL(0x42c6c834,0xc30fa665),LL(0xf4d47c43,0x8776e4e7),LL(0x431ea6ae,0x9dafb227),L_(0x4ff395ed),
+ LL(0xe3b10ef9,0x2c57d4e0),LL(0xa4cceb3e,0xf2b56f06),LL(0xff6cbcb5,0x8918c037),L_(0x268bc00c), LL(0x782ed32e,0xa92f2fb0),LL(0x76415814,0x5aed9645),LL(0x6859753a,0x0a6cac9a),L_(0x399773b8),
+ LL(0x115dc4ae,0x7652379c),LL(0xc59e872e,0xfceb6ec3),LL(0x1fa3657f,0xa77b28fb),L_(0xa7619402), LL(0x26333b61,0xa85f48be),LL(0xe180ae18,0x671848d6),LL(0x68f2c963,0x3145c6a2),L_(0xe4d30712),
+ LL(0x71516dad,0xb3ff7310),LL(0x00082b09,0xb2aa0684),LL(0x0de3deec,0x33ecf9d4),L_(0xab6cc532), LL(0xeb77b453,0xd8a0ae1b),LL(0x2a618d55,0xab8ca810),LL(0x3993ca70,0x0f2549ab),L_(0xcc02ada7),
+ LL(0xe8cde28b,0xb5a7fc92),LL(0xec8a7e38,0x130ca680),LL(0x786e2a86,0x882cb9d7),L_(0x103bbacc), LL(0xc662b5a7,0x7395bf15),LL(0x4be2ec80,0x5a3d7841),LL(0xb287766f,0x4eb9dbc0),L_(0x54c7f36b),
+},
+/* digit=29 base_pwr=2^203 */
+{
+ LL(0x11dfaf3f,0x663a8bf5),LL(0xf1bd6f1b,0x5a8b6d6f),LL(0x2de2cf36,0x4f49967b),L_(0x49fde755), LL(0x1ea11bab,0x9956f1ec),LL(0x69f14061,0xf4e97d30),LL(0xc5c29863,0x516db87b),L_(0xd4456e50),
+ LL(0x6d6d1495,0x78b8a6b8),LL(0x5019a365,0x9a15b171),LL(0x025726c3,0xd611e283),L_(0x68f7b67f), LL(0x9367aca7,0xb4e7c5cf),LL(0x5ed6c698,0xfb9fa295),LL(0x6ea9c71d,0x2c0dd03d),L_(0x6ad6ab61),
+ LL(0x74645aca,0xc1c1b8cc),LL(0xa1ea038f,0x6422554f),LL(0x9d8f1f3b,0x5e44aefb),L_(0xbc0d302a), LL(0xd0763fa0,0x47ec400c),LL(0x9049574e,0x3240a34f),LL(0x9778ebf4,0xe0adc015),L_(0xe0348d22),
+ LL(0x42b0ea67,0x2b432e4e),LL(0x97be15f2,0x51920440),LL(0xfb123348,0x752805f0),L_(0x095f8861), LL(0x428d08f5,0xe4fd179c),LL(0xbfe10a89,0x4c2603c8),LL(0xc1a95174,0xb5e94f0f),L_(0x38bffbb7),
+ LL(0xfa8bbea8,0x31d5bf10),LL(0x3b628b52,0x747269c9),LL(0x9f017556,0x50b6b23f),L_(0x2051232c), LL(0xf36708ff,0x18b1fb8b),LL(0x58660126,0x731cf4a4),LL(0x85343658,0xcdefb5cb),L_(0xee7c02af),
+ LL(0x517736b8,0x842b9439),LL(0x79b770df,0x017ab239),LL(0x2ca8d23d,0x29cf116b),L_(0xd89fd3b6), LL(0xa037ebda,0x20362fb9),LL(0x17dff9f9,0xd010fe68),LL(0xb8350a9e,0xcbd44b83),L_(0x3adbe1f1),
+ LL(0x3d4cc86b,0x171138f4),LL(0xd002fd82,0x7c670c94),LL(0xed715f0d,0x14d543b9),L_(0x770fe818), LL(0x684456e3,0x2c123603),LL(0x3f8f258d,0xba0fe630),LL(0xa3564d33,0x9d216804),L_(0x435f77e5),
+ LL(0xa6e5dc69,0xabe6aeac),LL(0x5e84d762,0xde0a4f86),LL(0x538499e7,0x1d74cb44),L_(0xbfb3e36a), LL(0xbbcfa69a,0x198dddb7),LL(0xfcbe1984,0x873a7f1f),LL(0xb7b8bbcc,0x80cf7321),L_(0x00ac08de),
+ LL(0x78482416,0xe874537f),LL(0xbbb4692e,0x221e1e86),LL(0x02f17d20,0xe7057c36),L_(0xec132fea), LL(0x45b4351e,0x89b168f7),LL(0x7f9c9480,0x9d1de6f5),LL(0xf9e94168,0xf34e2409),L_(0x13e022d0),
+ LL(0xc854b8a6,0x243d2e96),LL(0x358d9af4,0x8938cb33),LL(0xb47467ae,0x81a7eea1),L_(0x470b2dab), LL(0x7063770a,0x3d8103c4),LL(0x9a2755c4,0xafa79d2a),LL(0x9228b07c,0x5b3e4741),L_(0xbc9b37bd),
+ LL(0xd005caa3,0x8739f51c),LL(0x3e9880c9,0x48357287),LL(0xe30595ad,0x9d3ff1f0),L_(0x4b286b55), LL(0xcc729699,0x89be0141),LL(0xe2576d49,0x27c29e5a),LL(0x00a64de8,0x1e63717f),L_(0x0c898bea),
+ LL(0x020255bf,0xd89a7c51),LL(0x489bd20b,0x1abc0a1a),LL(0xe7ac0a69,0xf9bbb011),L_(0xbe7ead5c), LL(0xfd43757d,0x5bf6715d),LL(0x2573c5cb,0x74bb4d9c),LL(0x30483451,0x7ccb3fa6),L_(0x0071ca44),
+ LL(0x4c06b933,0x83211263),LL(0xd01481a8,0x868c1469),LL(0x48c43d0d,0xd5277f78),L_(0x32c5572b), LL(0xd4224814,0xb34b30d1),LL(0x780e2016,0x750a0da3),LL(0x43e3806b,0xd4ad90ce),L_(0x97399684),
+ LL(0x31b3565e,0xe410e718),LL(0xb76d2e77,0x78c21e10),LL(0x0df8f583,0x6f7bfcdc),L_(0x210d7777), LL(0x740c2b91,0x04ef15f1),LL(0x87836a34,0x03a4d422),LL(0x44c267d1,0x2fbcd218),L_(0xbb549183),
+ LL(0xe76d9d5d,0xa541189c),LL(0x3029c3b6,0xd7480312),LL(0x277c1d19,0x761b9d9e),L_(0xd09fd429), LL(0x0b301fd2,0x8fe5cbdf),LL(0xf3cbac6c,0x42373c0c),LL(0xcbbe3e5d,0x4dd89b19),L_(0x75e821e8),
+ LL(0x9cbc0a32,0xf92173f5),LL(0x3b6ebbae,0xca2337d8),LL(0x44ad6eda,0x49918d50),L_(0x71e12775), LL(0xfc7a6248,0x7c6c9ea3),LL(0xa76fc6d0,0xe1e9ac5f),LL(0x95bb0f9e,0x0e5cdfb0),L_(0x3505e20d),
+ LL(0x1671e3f6,0xc0a26f33),LL(0xf36a466b,0x6a156434),LL(0x769bd94c,0x96b0b77f),L_(0xbaa9cde2), LL(0xec341956,0x961d12a2),LL(0xe383e51b,0xb1257ac5),LL(0xb680bdbd,0xfbf75271),L_(0x1f5805cf),
+ LL(0xa993566d,0x205ad8c6),LL(0x84ebf013,0x1874691d),LL(0xf24e1951,0x749aace4),L_(0xaaf03f06), LL(0x49610345,0x33c5f5b4),LL(0x378cf813,0x9fbc337a),LL(0x8ac53e4c,0x9b1441f3),L_(0x0113566b),
+ LL(0x2f5bdd05,0x8145a740),LL(0xd10f5321,0x525fb54c),LL(0xe73eb2a8,0x4da9ccbf),L_(0xf35011e6), LL(0xe92c65ec,0x375da80a),LL(0x3b493784,0xc35b0096),LL(0xe99fa1c1,0xbfcdd019),L_(0xfcd0fffb),
+ LL(0x3783ad2b,0x44724690),LL(0x6169a512,0xbbc2508f),LL(0xb54ae1fa,0x97426a68),L_(0x84a843c6), LL(0x1439b1e1,0x57ee4649),LL(0x9fa3b852,0x224d6e57),LL(0xcf4188dd,0xb9fbee93),L_(0xc6f126b9),
+ LL(0xa302b5dc,0xa34571c9),LL(0x48662048,0xb1b8b7f2),LL(0xfa26591d,0xf6f0b8d2),L_(0xc7f51cd9), LL(0x58d23928,0x5bc438ce),LL(0x66200c18,0x69768b41),LL(0xe6f1c95d,0x6844e3a4),L_(0x6e17cd42),
+ LL(0xcf358165,0xddd1ff7d),LL(0xf244b120,0x73e9c17f),LL(0xe6046902,0x40c26687),L_(0x1691fe67), LL(0x933ab02a,0x6e105d9c),LL(0x9b50eded,0x02d570b4),LL(0x00b6a88f,0xe9b08b55),L_(0x4b82631a),
+ LL(0xa09f3f50,0x04530c1e),LL(0xf4435606,0x5195314d),LL(0x9b79c17b,0x9f045501),L_(0x839380ae), LL(0x1cbc90d3,0x2d608e31),LL(0x9b83bfd2,0x913acbf4),LL(0x10db4136,0x22cc1949),L_(0x3a2e7962),
+ LL(0xd3e26092,0xec19a27b),LL(0xe5ad9b86,0xddac453d),LL(0xc7d0db50,0xb0a1794d),L_(0x12340a6f), LL(0x20e8dc2d,0x8bcb0707),LL(0x54438da3,0xe23756c5),LL(0x33597066,0x68e9b910),L_(0x192ee4ac),
+ LL(0x64c640f8,0x6b3b3e11),LL(0x6076299f,0xe52af985),LL(0x210c46f7,0x11bcefd8),L_(0x4c36d81d), LL(0x5bed674c,0xd49ab218),LL(0xb72e4c99,0x32664eea),LL(0x0e9348eb,0xa88c581f),L_(0xd67c4ee9),
+ LL(0x2d66a175,0xe899e96c),LL(0xb64bf9de,0x5fb2ed8e),LL(0x43b5e3af,0xa7cc5c88),L_(0x656b15b3), LL(0xdd7873f4,0xc5c4e24a),LL(0x112512c6,0x6324347c),LL(0x26ff024e,0xccd67ae6),L_(0x4f8c1dc8),
+ LL(0xe0a8b3e4,0x95b13b3d),LL(0x9e553300,0x85e3e1dc),LL(0x7fafd447,0xf8451257),L_(0x6a113d4a), LL(0x65687ab1,0xedde7f06),LL(0xaf37550f,0x901e09b8),LL(0x0b1d7c55,0x69e02d8f),L_(0xcfd6985a),
+ LL(0xe1246244,0xecd3e1aa),LL(0xbe482681,0xfb799ecf),LL(0x47798831,0x9fac48a4),L_(0xafbbf20e), LL(0x3d17bb47,0xd6f1c5bc),LL(0xfe2c6138,0x1b8d361a),LL(0xd3d7cf0a,0x0fdeccc7),L_(0xa05a2e1d),
+ LL(0x3a510fa4,0x6b3cd8ac),LL(0xa16dcddd,0xaee76b4c),LL(0x0fdf0fc4,0x3cb7db3e),L_(0x5144175e), LL(0x2669bf74,0xdaa284b0),LL(0xb41e11e0,0xa0a2a2a4),LL(0x334a53c5,0xb6f86d54),L_(0xea0526d6),
+ LL(0x142fbd3e,0xef18bf5c),LL(0x268ce667,0xc11a8ae3),LL(0x70f67534,0xb9cffb18),L_(0xc3038e8d), LL(0x941d9303,0x29b2c2c3),LL(0x4d1a3a20,0x4205ec1c),LL(0xe2c18665,0x5ab3157b),L_(0x7a60e7b3),
+ LL(0xf39b6495,0x1c5c3f1d),LL(0x28e72014,0x609a5ec7),LL(0x32068427,0x47c37b5e),L_(0x94c1b6e7), LL(0x39767baa,0x5f5b4e71),LL(0x77567891,0x05496c1a),LL(0x55a4f7f2,0xc6f93ff6),L_(0x8f654b8b),
+ LL(0xdb846749,0x8fa02752),LL(0xfcbae4b8,0xc21478c8),LL(0xcff78948,0x22632d48),L_(0x70d86a48), LL(0xa8b86e1b,0x00132e4f),LL(0x3721a7ea,0x0457eac2),LL(0xdcc0060a,0x0c2cbce2),L_(0x38fb42c3),
+ LL(0x802a7a9c,0x5ea4abc7),LL(0x5f3751e3,0x2aa4c525),LL(0xac364b4b,0x495dd3d3),L_(0xa6c1d838), LL(0x89d692f9,0xba68755b),LL(0x465b3970,0x72a043d5),LL(0xfe4e336e,0xfc16f7fe),L_(0x2c759722),
+ LL(0x3d83071b,0xdd3a0176),LL(0xcb5a7236,0x61809f55),LL(0xa2bbecb2,0x1f553745),L_(0x46d5deeb), LL(0x2602bcbb,0x4c542035),LL(0xa92075fc,0xc39e8592),LL(0xa99e29ec,0x31176d99),L_(0x7ca41c07),
+ LL(0xb54001ac,0x39ce1948),LL(0xbff084c9,0xe3b4d5e5),LL(0x43984570,0x05ef0ee6),L_(0x0a861937), LL(0xa8b0d940,0x1288a0c3),LL(0x52997092,0x3fa9ab6b),LL(0x24210cbf,0xec238c31),L_(0x9e2872c4),
+ LL(0x30423d94,0x40fd474a),LL(0x5b8538a3,0xec2ead24),LL(0x0d208047,0x1cb60ff4),L_(0x761298e8), LL(0x213bda9b,0x1b6d44ff),LL(0xbcf74593,0x5ddf4ac8),LL(0x746b2f76,0x679d4dee),L_(0x32233e28),
+ LL(0x1482adcb,0x0c718f19),LL(0x66cd9b3c,0x03bfd19e),LL(0x3b3a6f85,0xa9ef5cce),L_(0xca539a7c), LL(0xd847f363,0xed44fad7),LL(0x4db83c78,0xe9c8d39e),LL(0x5a9002ed,0x57ef09d7),L_(0x47b485ec),
+ LL(0x7d5b0115,0xe4537555),LL(0x4cc9c9c5,0x6d1d53a0),LL(0xec59f90b,0x55f05058),L_(0xaa97605c), LL(0xc10edab1,0x66f84f5d),LL(0x8c26f4dc,0x9097a136),LL(0xff1f32e7,0xda9cb1ce),L_(0x92d5f2c4),
+ LL(0x918a45ed,0x5ec4e734),LL(0xffb048ed,0x861a69b7),LL(0xb9ca6eb1,0x4f8b9e40),L_(0x089b9558), LL(0xd5b022cc,0x43e91e88),LL(0xcca4bf58,0xe5fa6721),LL(0x21a8592f,0x2180b560),L_(0xa9e4e373),
+ LL(0x73dd816a,0x95e834c2),LL(0x85c32c46,0x52b23dc2),LL(0xad18d469,0xd0c03244),L_(0xf46c7fff), LL(0xdbde0560,0xde2297b5),LL(0x8c32b174,0x8f0937ea),LL(0x28635d97,0x8b431269),L_(0x47d44429),
+ LL(0xc8d22f39,0x28c78e40),LL(0x93181781,0x61fdf274),LL(0xcb623c4d,0x98d40a79),L_(0xdda4b06c), LL(0xd808e325,0x3b688d0d),LL(0xfe3fd141,0xd51bdb7c),LL(0xedd15e12,0x3a965d08),L_(0xf3097f75),
+ LL(0xde0a2f39,0xbda9cc54),LL(0xa6bfe2fa,0xa29b11da),LL(0xf02a2f58,0x1b6a851d),L_(0xcb819b77), LL(0x8a57fd87,0x30780f8e),LL(0x9f0d56af,0x2b7ce89d),LL(0xf8a06fed,0x27c807cb),L_(0xb99605d9),
+ LL(0x46b40b76,0x6786d96f),LL(0x72255ae1,0x80ccf20e),LL(0xc29277a1,0xb9deb14f),L_(0xb01102d2), LL(0xaeb5c04b,0x1c8e7e81),LL(0xaf4a6e1a,0xaec9e1df),LL(0x06c802c5,0x4637b70a),L_(0x21f2e3c1),
+ LL(0x9ffc5f28,0xb4a7c608),LL(0x3a6619c7,0x4be0db0a),LL(0x5deb2377,0x24dd90ec),L_(0x7e94da01), LL(0x31617c3e,0x3788bd2b),LL(0x80b9433f,0x0c1368f4),LL(0xd49fdafb,0x47c8e8f1),L_(0x2be1c836),
+ LL(0x5ef0901d,0x7f036146),LL(0xf5f17b3f,0xdca93bb1),LL(0x45a7571b,0x4e68fb20),L_(0x68857bb8), LL(0x62732201,0xa24d2c8c),LL(0x2d13dee5,0xed2b0948),LL(0x88581796,0x118e784d),L_(0xf0493f53),
+ LL(0xa0e66eb2,0x58d860e3),LL(0x8971f724,0x9083bee2),LL(0xb4f43e7e,0xb5941f8a),L_(0xb537d4a0), LL(0xb975e31d,0xa327b762),LL(0x0a0d438e,0x9be00cfd),LL(0x23118e99,0x2345f880),L_(0xe40f8c30),
+ LL(0xe9728c3b,0xcbd96a38),LL(0x1197dd6b,0xe0af89d0),LL(0xb47615a0,0x381bf7e1),L_(0x251a8f8f), LL(0x008018e9,0xad578807),LL(0x34717cff,0x2b57e965),LL(0x5fbc83f2,0xa4f9d4fb),L_(0x64b6d093),
+ LL(0x69093077,0xf183d4de),LL(0xf6acf5ed,0xbaeb9a58),LL(0x0cc30970,0x181d2aa6),L_(0x53b37c4b), LL(0xce44dcb5,0x2ce916ba),LL(0x38654a56,0x59bee1db),LL(0xaba6d625,0x09ca53b2),L_(0xcdfe1968),
+ LL(0x91d466d2,0x9e6894a8),LL(0xf7c98ba1,0x7219e547),LL(0x8e28cba4,0xe28c0250),L_(0xdc432b47), LL(0x43c25678,0x52a05293),LL(0xff3120b7,0x789cbfc0),LL(0xd4520462,0x3107ac59),L_(0x92fc422a),
+ LL(0x41f9db9c,0x378db33c),LL(0x1b7e14c2,0x6dc570a1),LL(0x2e5d4aaf,0x536bff4a),L_(0x885f68ab), LL(0xf657a8f3,0xeaff53c3),LL(0x8ea881df,0xe2da9fbd),LL(0xce5d6df3,0x037450b2),L_(0x6899f186),
+ LL(0xa41f3714,0xe8227713),LL(0xb158373d,0xc20b72bd),LL(0x73e5ad11,0x0d1473e2),L_(0x963a9a91), LL(0xc3c89f91,0x6796b002),LL(0x32ad74a8,0x978ceeca),LL(0xcad42d90,0xa157eba3),L_(0x64fb791b),
+ LL(0x6d7b048c,0x91b7250b),LL(0xb6fc8bc6,0x1b7c37d7),LL(0x207504d2,0xa04f258e),L_(0x35b71223), LL(0x69296811,0x000189fb),LL(0x8cf221df,0xf5202462),LL(0xe9692259,0xc7e62afa),L_(0x2482c08d),
+ LL(0xb34b2712,0xa6fa3a44),LL(0xe579dd13,0x77c307c4),LL(0x8643df69,0x57d9dfb8),L_(0x9f01f782), LL(0x5573d8e5,0xb5c2c766),LL(0xbb840380,0xe0195f6a),LL(0x99e8ca50,0x6c698864),L_(0x31b4df34),
+ LL(0xc836d70e,0xfa87a978),LL(0x6e27995c,0x2d67fe21),LL(0xc806a202,0xc065a04b),L_(0x93cff90b), LL(0x6731446f,0xbb867036),LL(0x9cdfc841,0xe8066219),LL(0x0a935f1c,0xa9d96eb8),L_(0xc15bd4d8),
+ LL(0x60b97b73,0xd003f54a),LL(0xa4a49d7a,0x63dd3e3b),LL(0xa79d7693,0xa15f7dc6),L_(0xbd4d523d), LL(0x1e02bb50,0x6dbfe7b7),LL(0xcc88e7c3,0xb0a1bb28),LL(0x8264318f,0x5e5fd5b2),L_(0x5f2fa1e2),
+ LL(0xe76ef3c7,0xec0ebc09),LL(0x1936faf8,0xd297aff2),LL(0xc8c40d08,0x01dd06de),L_(0x54d85f2a), LL(0x2bc0d559,0x8e9d926c),LL(0xcbcea653,0x99783016),LL(0x37d07340,0x0beb45e4),L_(0x3de7fc81),
+ LL(0x564ba5a3,0x32058809),LL(0x9850a91e,0x3af0e1db),LL(0x5464c544,0x1452f874),L_(0xb9637ddd), LL(0xeb527a99,0x7298be18),LL(0xdf5911d2,0x16aa8506),LL(0xf6dfd8a8,0x8bb252ea),L_(0x839f8d56),
+ LL(0x89f63fb2,0xc7fe9490),LL(0xa2fc5db9,0x99c60e8f),LL(0x47b2b00a,0x142e5001),L_(0x557178b5), LL(0x081ac8ff,0x7281e45c),LL(0x80053d16,0x92d81832),LL(0x335bfb8b,0x3285f848),L_(0xe9e17269),
+ LL(0xdbe51600,0xd38c0683),LL(0xd98fa793,0x990e1e00),LL(0x14117a61,0x0d3b9c08),L_(0x3e3d6538), LL(0x7a4ddb24,0x374f82aa),LL(0x538b9bf1,0x0c5bcaf1),LL(0x1cc16fb8,0xe0c1bced),L_(0xc0de70fa),
+ LL(0xd35b0a61,0x96448e89),LL(0x98c48df5,0x8846f415),LL(0x50f58327,0x4770c98e),L_(0x197ced21), LL(0x5ff2d0d7,0x1af1733c),LL(0x2bca7ffe,0xa04c1cce),LL(0xeac8a367,0x13278f06),L_(0x5dd0431b),
+ LL(0xd19368fc,0xa83c536e),LL(0x02379421,0x118f2771),LL(0x218d25f6,0x90caeeec),L_(0xf254a0e4), LL(0xc0dc699c,0x44d824bf),LL(0x0bbdc5a2,0x5903a15f),LL(0x21933c71,0xec2c7cff),L_(0x0a756aae),
+ LL(0x97dfc53d,0xd8438b57),LL(0x1d02bb13,0x42584478),LL(0x25ef520b,0x3dd8667d),L_(0xe3e22c9e), LL(0xc5d6139c,0x0d51408e),LL(0x0227f2bc,0xd3e4dd71),LL(0x090e4a02,0x2fc23bc1),L_(0xf9171e03),
+ LL(0x11deaeb1,0x8d85409b),LL(0xd1184135,0x617f0460),LL(0xf357dae1,0x7b364c45),L_(0xb9d690d1), LL(0x4d915f34,0x0c5f601c),LL(0xcb872f3a,0xe0fe9ec0),LL(0xbccb4f0f,0xf7bfadef),L_(0x9f017f8b),
+ LL(0x83cff561,0x15442e1c),LL(0x62cd98e6,0xab89d9c9),LL(0x58dcba94,0x7426c5f8),L_(0x80d0a8cf), LL(0x449af58b,0x52648e23),LL(0x3a628b1d,0xdb61eac8),LL(0xf0844217,0x9c140c5f),L_(0xb3cc7bfa),
+},
+/* digit=30 base_pwr=2^210 */
+{
+ LL(0xd6e670a1,0xf0426be1),LL(0xb4f44241,0x14838573),LL(0xefc4394a,0x80845fb2),L_(0x90205f0f), LL(0x99c56ec6,0x8a6cba70),LL(0x4345224a,0x6149abf7),LL(0xfc80d60c,0x9c7703f2),L_(0x3d5a7643),
+ LL(0x730ebcfd,0xe4b299d2),LL(0x79702991,0x6cdbe6f3),LL(0xad58884b,0xff023a31),L_(0x18b5c6ce), LL(0x51fd8a3b,0x433c522f),LL(0x3e4907b4,0xc1579271),LL(0x3c1c0282,0xe4454779),L_(0xb4df9ee5),
+ LL(0x48953bf7,0x658675d7),LL(0xdf2f4ac2,0x8faf514a),LL(0xdde660e1,0x50213318),L_(0x64826f9f), LL(0x8433d7fa,0xadcc3e45),LL(0xbc26833e,0xcc5ad72a),LL(0xde547aae,0x619251e2),L_(0xf96f73d1),
+ LL(0x548b77dd,0xba3e8f2e),LL(0x728cadb5,0x21cbbb1a),LL(0x0feebd0a,0xdb740393),L_(0xdcffa1d6), LL(0xb6848db5,0xa742cd6f),LL(0x549a4fca,0x39f63442),LL(0x3d24aeeb,0x426c42e9),L_(0xb67d7f28),
+ LL(0x408e3341,0x96cc626e),LL(0xd2b3305b,0x6a9bb18a),LL(0x355d47d4,0x33f53993),L_(0x960f4207), LL(0x16218c03,0x329378d3),LL(0x1004c020,0x70de3eb8),LL(0xa9117cf1,0x0e5dbd85),L_(0x73f55c21),
+ LL(0xb9a63bdd,0x456357c9),LL(0x1b3ded00,0x8e077f94),LL(0x0f0f2d4f,0x51648f45),L_(0xab4e5da6), LL(0x3963e9df,0xe96f0202),LL(0xcb55e2cd,0x3b87f53b),LL(0x7b3cc4d5,0x0090498b),L_(0xdfb4de74),
+ LL(0x98927a32,0xba64358f),LL(0x757e6fbb,0xccb5e233),LL(0x95336360,0x50d4d37c),L_(0xac96f5a7), LL(0x93c38d36,0x53008bb8),LL(0x33869046,0x5e587a5b),LL(0xfb1262f2,0x1e3e57ec),L_(0x407af3f6),
+ LL(0xc458ba03,0x9d6ad457),LL(0x78e956e9,0x82640533),LL(0xb94af545,0x32977879),L_(0xd20f35a3), LL(0x6224b353,0x9c65ff21),LL(0x5c8f99f9,0x4a46fdf7),LL(0x4ce9a00e,0x307b3d8d),L_(0x798d2cf9),
+ LL(0x77b2fb3b,0x3b8e6ef5),LL(0xb6ca3273,0xe32b3b97),LL(0xe260b8d0,0x9c66c2a4),L_(0x05eb84cf), LL(0xaf957b78,0xbe1f3ecf),LL(0x1e35adca,0x9d69d314),LL(0xa175edc2,0x4681a0ae),L_(0xc6715ff6),
+ LL(0xee864b12,0xe9c88636),LL(0x32143c93,0xf0c1e0f3),LL(0x434818e2,0x25a929c9),L_(0x4c806ec9), LL(0x20527edc,0xfe3e80ac),LL(0xa0372526,0xd5fc27b6),LL(0x5279eb8a,0xee97419a),L_(0x98dbe31d),
+ LL(0xcbc47797,0xe8bb79d3),LL(0xa6d3938a,0xf225d84a),LL(0x0b2f88a1,0xf279df50),L_(0x59a54b2e), LL(0x8cd34576,0x1390a7ac),LL(0xc9c37e25,0x1130b1eb),LL(0x0777586f,0x3aa2516a),L_(0x42cece95),
+ LL(0x3964d2a4,0xa47e21c1),LL(0x5f9875c7,0xf918e47e),LL(0x2ecbc86c,0x4ac56066),L_(0x5ea26fc2), LL(0xa5a826e0,0x31e429d6),LL(0x944c3736,0xd7082b19),LL(0xcf2fc959,0x02c3927e),L_(0x3bb33cf9),
+ LL(0x27da5082,0xcf56d753),LL(0x64f98e4d,0xd40b530a),LL(0x1c7766cc,0xb20cfe07),L_(0xe351283a), LL(0x18e30244,0xdc9dc465),LL(0x3bee62a5,0xcccf7fb0),LL(0xb2e1f645,0xfe54699d),L_(0x18ee6ea1),
+ LL(0xdf71a0f1,0xd2fe136d),LL(0xe5f658a8,0x5a88e4dd),LL(0xd83b5473,0x94a1a0d2),L_(0x586d7529), LL(0x1d163bf2,0x0748fda6),LL(0xe98d9b7d,0x69880bc0),LL(0xf0def9e5,0xc4e12cd5),L_(0xf40402da),
+ LL(0x585fff04,0x2956c762),LL(0x257681d9,0x3ba8ab0b),LL(0x696e0262,0xfd84ba5b),L_(0x0675debf), LL(0xa783c064,0xef9b82a5),LL(0xe38868a1,0xdaa2e717),LL(0xcdcdf922,0x292fb9c9),L_(0x269d71d2),
+ LL(0x477cabed,0xb5fae58e),LL(0x55622b3a,0x6ba8e28a),LL(0xff23a08d,0x56c2b54e),L_(0x866ba05b), LL(0x037720d9,0xa737dae5),LL(0xdc5131fd,0xb93a1d0b),LL(0xbb1176e6,0x860b7b0d),L_(0xf51c76d2),
+ LL(0x5845cd10,0x6bd647f2),LL(0xe811642e,0x9a4283ed),LL(0x0776f557,0x2c9fb90d),L_(0xb8cebf02), LL(0xb1612f57,0x643fb865),LL(0xc4902b6c,0x88ea78f7),LL(0x74aac273,0xfd2878e7),L_(0x1a76b1b7),
+ LL(0xb6983e76,0xf609c0af),LL(0x0cfea42c,0x123027ca),LL(0x7a72c3c7,0xb9872dc7),L_(0x1ae5bcf6), LL(0x57a545e2,0x9fe44848),LL(0x2a90f4d7,0x24f2f0f2),LL(0xdcdd6bf2,0x32eb5ac2),L_(0x939219ad),
+ LL(0x2540ecf0,0x267059b6),LL(0x2669c8c4,0x6d717377),LL(0xb6ba656d,0xc80a4182),L_(0xa67b63ae), LL(0xac5cdbce,0x7acd503b),LL(0x98520b74,0xf8884f71),LL(0x0688ae94,0x47fc66da),L_(0xacf9786e),
+ LL(0x9b68b84a,0xde210bb3),LL(0x74430a09,0x98b4770a),LL(0xf0e810c7,0x85cefd4f),L_(0xba1cac0a), LL(0xe9e74a58,0x35194ff1),LL(0x6452e158,0x520f3a2b),LL(0x8ed85e25,0xd8535bc9),L_(0x3bc32918),
+ LL(0xd77f4a13,0xd3467c72),LL(0x3046a69b,0x3a350288),LL(0x996236b5,0xf02f1b90),L_(0xdbce524f), LL(0x3a7711d1,0xdcc369a6),LL(0xa2eda832,0x81b1b5d5),LL(0xcb12490a,0x33444c56),L_(0xb4685d00),
+ LL(0x69d66472,0x6fe5a181),LL(0xa316d37d,0x11b6d85b),LL(0x75ec9a2b,0x8b98fad0),L_(0x0c5e4465), LL(0xde810eaf,0xbd855a8d),LL(0x7661287b,0x436e58d0),LL(0x9b044bfa,0x0f23ddbb),L_(0x7abd77aa),
+ LL(0xc57c3228,0xe7d89f58),LL(0x490f55aa,0x2e88de2d),LL(0x3aa72314,0xdea3a145),L_(0x159c120c), LL(0x5f68084a,0x840bb946),LL(0x1516983e,0xdcbbb7b4),LL(0x527c0f73,0x0d4d39e1),L_(0xe3846304),
+ LL(0x1fed9837,0x56c53d5f),LL(0x8c3176ff,0x752789ed),LL(0x26489626,0x94c341e1),L_(0xa5b14d8d), LL(0x3cb481d4,0xb4f1f612),LL(0x1a2f793c,0x94eb82ca),LL(0x600ebda4,0x6ba99e2b),L_(0xd1571ee0),
+ LL(0x960bacd7,0x122b6639),LL(0x41a70d6d,0xbaf725d5),LL(0x50c3e831,0x37bdeb4c),L_(0x948ab46f), LL(0x7cc81d1e,0x1a55a55a),LL(0x3b20c1e6,0xa6276eba),LL(0x81e5763b,0x4ddc462f),L_(0xffa876e2),
+ LL(0x8d1558c7,0x62e4c32c),LL(0x7f945839,0xfc3257d8),LL(0xa1e798f7,0xfe755aec),L_(0x5524084e), LL(0xcebab559,0x02c2a9e2),LL(0xdc627b0e,0xf8a1716c),LL(0x7c827c47,0xbcf0b634),L_(0x677ad978),
+ LL(0xe3c947ec,0x74af562c),LL(0x8713ce0f,0x1493b8fd),LL(0x6951ea3a,0x23d2ab0f),L_(0x761f3a78), LL(0xb7530283,0x098fb6af),LL(0xeb48e791,0xccff2003),LL(0x160c9294,0xf1992cc6),L_(0x2ed7be4f),
+ LL(0xff03f6d9,0x02ad20b1),LL(0x30165084,0x17295d20),LL(0xb8bee43f,0x67757e6c),L_(0x0eedd6d6), LL(0x61ba2edd,0x5acf9123),LL(0x8dee8798,0x4442dc9a),LL(0xa4c9925a,0x9970bc21),L_(0x54e339cf),
+ LL(0x250b4244,0x7f335cdf),LL(0x5019bc77,0xa892b382),LL(0x15ce5f7d,0x4f31c43e),L_(0xfa69d995), LL(0xae609392,0x1d57d52c),LL(0x20dc7c66,0x6e6a7489),LL(0x01a82796,0xa8fa2376),L_(0x861ac30c),
+ LL(0xadcafee5,0x56acbf11),LL(0x7b20a0c7,0xa63a1d19),LL(0xbec3d69c,0x5e324e3c),L_(0xd3d97b66), LL(0x64b971b3,0xc585e140),LL(0x2b8e18cf,0xd08772ba),LL(0xe0b2513f,0x6e7d6c03),L_(0x7e1a6116),
+ LL(0x9bc4e6f4,0x23bf2ce8),LL(0x82122cee,0x0b5f01ee),LL(0x318ba204,0xa93e44d4),L_(0xd2180b18), LL(0xd6ef00ac,0xd9d85de8),LL(0xd7d06345,0x3062eb10),LL(0x5bea35e9,0x952d933c),L_(0x72bd41e8),
+ LL(0x72791646,0x60e9cb5e),LL(0x107232fb,0x644a5b6e),LL(0x004f8684,0xa23e4299),L_(0xefa3c56b), LL(0x964aa750,0xad436903),LL(0xbb576a94,0x041c2a91),LL(0xbd787460,0x3513e3fe),L_(0x4066ae12),
+ LL(0x09a3d049,0x627d1807),LL(0x7365dc29,0xe00d7aec),LL(0x0dec445a,0x96d5022f),L_(0xf4343e09), LL(0x515a9b8f,0x00d16dd6),LL(0xeeaa6e35,0x97242fab),LL(0x220f953e,0x91ecc397),L_(0xaf714cd0),
+ LL(0x79198e5a,0x6dd11272),LL(0xce83daf3,0x9169c8b8),LL(0x6ce5dec2,0xce89d045),L_(0xbafd94a5), LL(0x1563c0ce,0x577ca0e0),LL(0x1e36fd91,0x5a836e51),LL(0x060d3970,0x729ba81d),L_(0x8b7e4fbb),
+ LL(0x16781a85,0xdbaa195f),LL(0xb43de333,0xec92b939),LL(0x2ccf4a4e,0x036ff9cf),L_(0xafc236c4), LL(0x6221e156,0xd7468cbb),LL(0x9a645200,0xffcbfaac),LL(0x5b2deae6,0xb553572e),L_(0xd4efa381),
+ LL(0xd257958d,0xc9536b4a),LL(0x10222aaa,0x9ab6a135),LL(0x84934c38,0xdf7ca8e3),L_(0x5e5dc148), LL(0x93660c96,0x4d98778c),LL(0xb7c8140c,0xd69648d2),LL(0x69c09498,0xb0ea1d36),L_(0x7e0cd235),
+ LL(0x62e6becb,0xe9443a72),LL(0x94747e78,0xd494860b),LL(0x2415da80,0xf50cdd9d),L_(0x65d2fa97), LL(0x48dbba8d,0x3ca3104f),LL(0xaf39be74,0xbd695019),LL(0x0441383f,0x393e3175),L_(0x4e5bd1d4),
+ LL(0xf6d61041,0x70145555),LL(0xc463ec32,0x8fa5018e),LL(0x1e5a98cb,0x59b3adf7),L_(0xeb7c80fc), LL(0x529f5fa8,0x5234550b),LL(0x4eb610a4,0x2ac1098d),LL(0xdc8db9bb,0x52106057),L_(0xbc3a065e),
+ LL(0x62bb8d08,0x6e360f55),LL(0xee7f7e1c,0xe795bf91),LL(0x7411bd70,0x627a5d54),L_(0xb191903e), LL(0x323d2db5,0x6bb808ed),LL(0x484c498f,0xded0b935),LL(0x3cef8b7c,0xcc379eda),L_(0xe1f0ee29),
+ LL(0x106cde5b,0x21a0558f),LL(0x2ea40699,0x84c5579e),LL(0x057a8487,0x5834fcc4),L_(0xb35b630b), LL(0x6779af9f,0x2d1d0e72),LL(0x6560d0d6,0xd90a0248),LL(0xeb026a8b,0x4d572129),L_(0x720991c7),
+ LL(0x22ee217f,0x657c8db7),LL(0x5e4f7ccd,0x12f06bfb),LL(0x8351fe6c,0xa43443b2),L_(0x48c1ec10), LL(0x01489ccd,0xb376d6e2),LL(0xc77d6dfd,0x727638f2),LL(0x0f953513,0xeae9d0a1),L_(0x91a7a744),
+ LL(0xb85754e4,0x59454f27),LL(0xd2c2004d,0xe70796e3),LL(0xacc344aa,0x775a61d7),L_(0x1c186106), LL(0xa1656bbb,0xdcf00b60),LL(0x4e3f081c,0x1af1503d),LL(0xcaa9cad3,0x1e4e523b),L_(0x816a09ca),
+ LL(0x0b303a9c,0xd468c096),LL(0x86aa5ecf,0x1910f732),LL(0x26d08884,0xe43dffa8),L_(0x6501f291), LL(0xa597567a,0x88248cd9),LL(0x4711c711,0x5263d7c9),LL(0xa4245344,0xcfde7c18),L_(0x4111cd00),
+ LL(0x7d78f32c,0x0df3b4b0),LL(0x9cf9b276,0xf4191861),LL(0x9dd92d6a,0x6444967a),L_(0x5f3bbd8f), LL(0xa9ba118e,0x1a4b4820),LL(0x2d798278,0x2aa6dcc4),LL(0xe9681e55,0x0ce3d37c),L_(0x739d5ad5),
+ LL(0xdd02bc4d,0xcf20f024),LL(0xf4697953,0x90e93ff7),LL(0x789e6af7,0x1050c0c2),L_(0x383c22fa), LL(0x60720c41,0x5cc2adcc),LL(0x2ace7063,0xf57806de),LL(0xf6f6aaf0,0x31c60f20),L_(0x7b350e28),
+ LL(0xcc10306b,0xf49e5f61),LL(0x1a92eddc,0x58cb04a9),LL(0x365a5041,0xc89ba67e),L_(0xa32fc59f), LL(0x65f980db,0xdb9db26b),LL(0x09322a72,0x93261bc9),LL(0x3fda4217,0xc6c63b34),L_(0xddeb9986),
+ LL(0x148cbb74,0x77b280f1),LL(0xc18c7395,0x7ee57ca3),LL(0x4cd0382a,0x37436f93),L_(0x66528f8e), LL(0x6e4b7e57,0x2dd6704a),LL(0x83b283eb,0x7f7d547a),LL(0x54972ce8,0xbca75a4c),L_(0xa9f10506),
+ LL(0x7605a526,0xee53ff2e),LL(0x5105c866,0x09187c91),LL(0x02b0042e,0x1f9de3bb),L_(0x4f9500fd), LL(0x880380ec,0x8cb6dd5c),LL(0xaa04e960,0x2a74a12c),LL(0xa0112a70,0xec0e66ff),L_(0xec305363),
+ LL(0x4b9381fc,0xa014524b),LL(0x400fd142,0xcb74eb3a),LL(0xf02c64c2,0xd9684416),L_(0x8da612c7), LL(0x06a80727,0x4e54713b),LL(0x7cde46af,0xfe9ec578),LL(0x8380cc14,0x5013084d),L_(0x80963cc8),
+ LL(0x349f5079,0x6dcbbe48),LL(0x6b6125b6,0xceefada1),LL(0x67b840bc,0x16c79367),L_(0x570c02ad), LL(0x361a38dd,0x8552cefd),LL(0xa8167ca5,0x286e6e20),LL(0x3636e865,0x9c4305d9),L_(0x43d5af7e),
+ LL(0x7f9a80cd,0x413cd659),LL(0x9c95b00e,0x310a2a72),LL(0x64a28802,0x6ef01bfc),L_(0x858e4b79), LL(0xb1565b88,0x113a4fdb),LL(0xd390a92a,0xc04a736a),LL(0x774c1209,0x63557ff4),L_(0x54e47eaa),
+ LL(0x940daa93,0x27760c7d),LL(0x9e3147b9,0xd15d7a6a),LL(0xb9bb9711,0x89363a50),L_(0xe852edfe), LL(0x94740e26,0x43ee10a5),LL(0x2d6acef6,0xaa297031),LL(0x03fc12e9,0x20890385),L_(0x2d45580b),
+ LL(0x87453ec7,0x4101d16f),LL(0xbebb2e76,0xf89a5338),LL(0x533638ee,0x05bdd7f6),L_(0x92a0bd39), LL(0x56483d09,0x4c760096),LL(0x81c6243b,0x37294333),LL(0x5119eebb,0x049c6a06),L_(0xc410f246),
+ LL(0xd5e79013,0x51167f9a),LL(0x12be7d2f,0x90e63900),LL(0xa41ce391,0x0572301a),L_(0x0a761ede), LL(0x8bb599f2,0xe5dca064),LL(0x3dad4d6c,0x88bd9756),LL(0x82d548d7,0x79a33fd1),L_(0x76d2d77b),
+ LL(0x801eaf93,0x77f53014),LL(0xa4c2daab,0xd48faf97),LL(0x40a7d787,0x604bbbf3),L_(0xcc41bd91), LL(0x9de9fab8,0x4c6757d4),LL(0xe55da08f,0x9a37321e),LL(0xf50459ca,0xf8d3a03d),L_(0x8252e5cb),
+ LL(0xc0ad0a5d,0xaaca1be1),LL(0xb4f7cd9f,0x6f65ac78),LL(0xfae3835d,0xf685dd47),L_(0x6c5b897b), LL(0x8e631946,0x03e5ac2e),LL(0x71afc215,0x4dafffd8),LL(0xce6c64d0,0xa1bdc366),L_(0xe59eacca),
+ LL(0xcde53a1b,0x28e18006),LL(0x428bd7b1,0xec3e3023),LL(0x3bf0eb6c,0x69ce21e0),L_(0xfbe09c69), LL(0xc6ab638b,0xf7c3e582),LL(0x3283bc61,0xe88ef77b),LL(0x20ead3f8,0x1f935f24),L_(0x3b040b57),
+ LL(0x20008407,0xa23c1b84),LL(0x41a0017c,0xa6773559),LL(0xc09598e5,0xffd68469),L_(0x1da39b13), LL(0x221c586e,0xb19fcd20),LL(0xe71a0fa0,0xa76b6f70),LL(0x83e812db,0xb605b69d),L_(0x0efdfc84),
+ LL(0x28c66881,0x656d6dd0),LL(0x58a3f7d2,0x7540ad09),LL(0x1396fe6c,0x52fddb17),L_(0x39edad21), LL(0xa2cc1fe5,0xfb57f569),LL(0x1072b4e0,0xddfbbf25),LL(0x94372dad,0x0a26aff2),L_(0x88f38fd7),
+ LL(0x8fdfcf33,0x6d4895a3),LL(0xff2438e1,0x19da7037),LL(0x67f22bef,0x3cfaa48e),L_(0x6bf9fc2b), LL(0x0a03dd57,0x7b4df30e),LL(0x956e9ec2,0xd632b168),LL(0xe6cb0b1c,0xfc98eaec),L_(0x7dbf18a3),
+ LL(0x8b21bd41,0xf20afcc8),LL(0x9b4028ed,0x9fb97c45),LL(0x4e476a55,0x6bf05b58),L_(0x2b0c488d), LL(0xec47e2f5,0x01d3ca74),LL(0xc0d6bd28,0x7a3a23e0),LL(0x95f353c8,0x010298ee),L_(0x034e53ca),
+ LL(0x6fa3f957,0x80ff52bb),LL(0x50412d11,0xf58be861),LL(0xbe2f9f7b,0xe84a58ad),L_(0x83284261), LL(0xa5a7f060,0xc605b12b),LL(0x5da82b44,0x86fa207e),LL(0x837f9c22,0x10d656cc),L_(0x454d1413),
+ LL(0xb270f308,0xde3d1dc4),LL(0x6619a39c,0xf9fa04cf),LL(0xaaa9723b,0x3910ae67),L_(0x86fdb715), LL(0x1046b659,0x3782c29a),LL(0x5c35eb01,0xd10183f6),LL(0x76b4be96,0xdd570ea6),L_(0xf56b5810),
+ LL(0x237ac7ff,0x9ec12515),LL(0x3f080f23,0xed07ceb7),LL(0xc3509a49,0x08bba00b),L_(0x07998613), LL(0xd7bef81a,0x5c36ecb2),LL(0x75c6840a,0x9bd57323),LL(0x3e8f5265,0x2c678e3c),L_(0xc7f1cc73),
+},
+/* digit=31 base_pwr=2^217 */
+{
+ LL(0x0993fc0d,0x2409728c),LL(0x2d5fd352,0x7af57f46),LL(0x28f3cb14,0xee72bd56),L_(0x21c2f494), LL(0xf22e2fef,0xac73118d),LL(0x283e1b56,0x490bb371),LL(0xf00c3802,0xaa6c7b0a),L_(0xee304f23),
+ LL(0x2619d224,0x5b89b52b),LL(0x433d8d17,0x1df61e0b),LL(0xec27bd08,0x49353c25),L_(0xf18b23f5), LL(0xc525714f,0x2c798eec),LL(0x91011438,0x6bd787c1),LL(0xfaa77bac,0x6e2db36a),L_(0x2a3b730b),
+ LL(0xf5bd48f0,0xea09f154),LL(0x18c36c89,0x45e66f63),LL(0xff1cf2a0,0x1d069cd7),L_(0x672fde0f), LL(0x07bd9cc6,0xf1f4e5b9),LL(0x86238146,0xa40cdc9d),LL(0xcdc7fd6b,0x00bcd404),L_(0x51a105eb),
+ LL(0xd8d6b178,0x348659fa),LL(0x0afc95de,0x724963c6),LL(0x478c3432,0x1f2f8d2f),L_(0xaa0e8781), LL(0x49e60cff,0xbf3811fe),LL(0x526d1fb9,0x50f264cd),LL(0xf802b4ae,0xf613e178),L_(0xd3df21bc),
+ LL(0x45bfb8c0,0x40af4179),LL(0x3b133f03,0x6e8997cf),LL(0x9b5dda1d,0xc2f372b3),L_(0x3948b7d7), LL(0x55f88793,0x99028593),LL(0xbcf7e27f,0x405ba3c5),LL(0x1de8aa5f,0xb2fc7cd3),L_(0xaadbe95a),
+ LL(0xd00dadb4,0xff2c8be9),LL(0x26721264,0x8d199a29),LL(0xbd6c65e6,0x7f2093a5),L_(0x21e5d488), LL(0x03e74b8c,0xa000a3ec),LL(0x68530945,0xeb8e9efa),LL(0xd1f6fc3c,0x3f15aab2),L_(0x9b5d8cbb),
+ LL(0xb9fa3849,0x45f74205),LL(0x97a4da7b,0x121a4ca8),LL(0x6d246547,0x819c4b2d),L_(0x8255bc16), LL(0x156c1f2a,0xf9d396e1),LL(0x5502b719,0xe8758b6d),LL(0x8b9b6ca8,0x94965c57),L_(0x3c7a5ffc),
+ LL(0x75175beb,0xc11d6984),LL(0xbad3d4ba,0x3c966d66),LL(0x67c5bea4,0xb82cec9b),L_(0x93b6322c), LL(0x1f09f72e,0x9661c046),LL(0x769c204a,0x12a03826),LL(0x35880fdc,0xc215f2cd),L_(0x4f5bf77f),
+ LL(0x4fdd677c,0x8bce7ecf),LL(0x847b9ee6,0x62abc7d2),LL(0x8cb1f02b,0xfffe0edc),L_(0x62c22364), LL(0x48727496,0xdcd7d51d),LL(0xa9cd4c50,0xfe1661b1),LL(0x30edb5dc,0x82ea29e2),L_(0xcc4403d4),
+ LL(0xc5db9960,0xed02ad3a),LL(0x66e7f904,0x194f3505),LL(0x2877668b,0xe7bcfa22),L_(0x873070fa), LL(0xf3636bf8,0xf013615b),LL(0x2fe9dfb1,0xeec498a2),LL(0x51ff974b,0x56961e83),L_(0xcd87825f),
+ LL(0xb4807fe6,0x5b989bd9),LL(0x2f915297,0x161be465),LL(0xcf0387e7,0x80e7dd9f),L_(0x2e7c6dd7), LL(0xb221d5c4,0x861c2ffd),LL(0x1df12d2f,0x36db9960),LL(0x048668bc,0x9b862a1d),L_(0x2b64be2a),
+ LL(0x02a0d3cc,0x644173f7),LL(0xc3611806,0x2103668f),LL(0x78a6d7ae,0xe22b26dd),L_(0x1dd89345), LL(0x39193a47,0xd1587982),LL(0x7692c1c8,0x9106104e),LL(0xecf6b1c4,0x0a975fb0),L_(0x0d6babd5),
+ LL(0xf550f1a0,0x4222b0ec),LL(0xb5c91a5b,0x78338ceb),LL(0x0ec3e064,0x9d0d2af2),L_(0x660e553e), LL(0x1d9a4d16,0xa632918f),LL(0xff1f387c,0x7bd6a5fc),LL(0xd795c509,0x67e40e1b),L_(0xdada8e3d),
+ LL(0x7f1d2d28,0x6eb26316),LL(0x4e1593ef,0x93bd25dd),LL(0x8698f986,0x2d0a715c),L_(0x8e8b3499), LL(0x41550af3,0x0b43672a),LL(0x132c1c9a,0xad35a8ca),LL(0xfd973661,0xea97e0b3),L_(0x3b811a56),
+ LL(0x87e35efe,0x3edb12df),LL(0xf66872e6,0x31c81b67),LL(0xc41cad87,0x0cfa43fd),L_(0x43f4aa49), LL(0x209b0e7b,0xcfa7ab7a),LL(0xafd31516,0xe582ff27),LL(0xc78d7ba1,0xea786f69),L_(0x2090d8fa),
+ LL(0x073b3ba4,0x7ee5008f),LL(0x28c86852,0xf81d75be),LL(0xd457685a,0xc2987502),L_(0xe596765e), LL(0xd0f9d913,0xfb631b84),LL(0x42aaadd8,0xe5cce6ba),LL(0xf7d72923,0x2257f5b6),L_(0x260ae885),
+ LL(0x6ca309b3,0xdb84c9b9),LL(0xdbb13e44,0x0f9da41e),LL(0xa7294694,0xc1443c26),L_(0xe02af6c2), LL(0xfe44c5f2,0x293f667a),LL(0x52bbc8cd,0x5f04fc4a),LL(0x7e1de72e,0x6907cdc1),L_(0xf8a9aeab),
+ LL(0xa3dd55e7,0x3fade182),LL(0xd7401dde,0x03aa0312),LL(0xc85449b7,0xc47549c9),L_(0x6ec51217), LL(0x55e72225,0xae146938),LL(0x4bbe9886,0x7c810544),LL(0xee349410,0x9f320ada),L_(0x4fdf9e41),
+ LL(0x2f1465cb,0xf506f849),LL(0xf58881e9,0xb38fe4e3),LL(0xd6feb622,0xedfd3c65),L_(0xb163b10b), LL(0x1345454b,0xb8f8a7bb),LL(0xb10b02be,0x11df874d),LL(0x1e5816ca,0x0ad84066),L_(0x9cd4eb66),
+ LL(0x4f8d4868,0x413431bb),LL(0x9ea4aaec,0xd1ee0d6b),LL(0x135f5f2b,0x9e4519f3),L_(0xd3e6e8f7), LL(0x7803a8e3,0xfa8179f8),LL(0x318fb330,0x53800116),LL(0xe0cb106b,0x95e1ca87),L_(0xfb4ce48c),
+ LL(0xec15776f,0xf3d74e54),LL(0xb7fb663d,0x4fd65071),LL(0x6706a48f,0x7f8a7cfb),L_(0x52d7353d), LL(0x811679af,0xc42a9ef3),LL(0x5bd192eb,0x5ed520f8),LL(0x2b1ff6c1,0xaa53702a),L_(0x5388fa6f),
+ LL(0x2813a7fe,0x423e53a3),LL(0x0baae890,0x3d22e91f),LL(0x08234191,0x9bfec6fd),L_(0xc8f4d373), LL(0xfbdbc5c1,0x119e3476),LL(0x19587b51,0xfeed51b0),LL(0x1c276e15,0x951dd485),L_(0x98048932),
+ LL(0x21e06022,0xbe2d77e9),LL(0x67d742de,0x0c1663f5),LL(0x7983fd13,0x7115e508),L_(0xb9406bb8), LL(0x4eba1a04,0xe45eb297),LL(0xdf3a7991,0x5693a9fc),LL(0x03ba9fe5,0x25d8f862),L_(0x6ea3053f),
+ LL(0x93e92c0c,0xefbe9105),LL(0x266e3900,0x1cee1814),LL(0xe042e34f,0xbec6b919),L_(0x5cb15a6f), LL(0xd41a287a,0x7568673f),LL(0xfe7b7595,0x4deaa29d),LL(0x3e67572e,0x2d437dfd),L_(0x03299218),
+ LL(0xfea564c7,0xc2d6c313),LL(0x3d460901,0x3e809da5),LL(0x591fe51a,0xeb85aa17),L_(0x44d65538), LL(0x45dff18c,0xea596f90),LL(0x48a2f0df,0x4708877e),LL(0xc2cabfd0,0x17f7dae8),L_(0x31a2b7ff),
+ LL(0x21d1b602,0xb389e984),LL(0xb19669c8,0x806cbce5),LL(0x729a4109,0x53062f9c),L_(0x779cbefe), LL(0x3bd3b5fd,0xa29b29ca),LL(0x6119b4c5,0xd386838e),LL(0xeb10107e,0x91c7a000),L_(0xd43d23aa),
+ LL(0xa2b87da8,0xb2465acd),LL(0x954d5e2a,0x935ce923),LL(0xcc9f7e66,0xa5432c5d),L_(0xd4ffbeb9), LL(0x02a952ef,0x686dc22d),LL(0xb3aa6ec4,0x272f791c),LL(0xf9a59b07,0xd8d7140f),L_(0x94e1344f),
+ LL(0x63bd0826,0x7dd1f80d),LL(0x241f38ad,0x61111bf9),LL(0x72ffb980,0xff97f61b),L_(0xa3d97bc2), LL(0x29de7bfe,0xd4e6e73a),LL(0xb4b19841,0xf25ef407),LL(0x5fd346b8,0xa14d6ec3),L_(0x366b72b2),
+ LL(0x700b11e0,0xb6fe5b75),LL(0xe3a6e8d3,0xf936e40c),LL(0x4ed1cc1b,0x9f69a8a4),L_(0xe6f9dbe8), LL(0xf722e6ee,0xa4d858ef),LL(0x00a65edd,0x39a6e0aa),LL(0x9733fc57,0xd4ab5744),L_(0x38f910bb),
+ LL(0xf3acc856,0x338c1ad4),LL(0x4a664d78,0x9d2c02fd),LL(0xd6ec4c42,0xaee2829b),L_(0xededd826), LL(0xb9a4651d,0x417e0805),LL(0x2c83b6ff,0x1f17faef),LL(0x65e8562a,0x54ffde80),L_(0x8972a5fc),
+ LL(0x639320ae,0x49c2561a),LL(0xd2b48b48,0x05a4bc45),LL(0x38241d91,0x7dc5afe2),L_(0xc399df03), LL(0x01fe9bae,0xc98d8a83),LL(0x666e5386,0xb711940d),LL(0x33895285,0xb43f7afa),L_(0xb804c149),
+ LL(0x4d95806d,0xd0681518),LL(0x93423c26,0x537054cb),LL(0xc2eabb37,0xea12b99c),L_(0x9297a177), LL(0x791e1723,0xddfee3a2),LL(0x4de65e15,0x21639c41),LL(0x7f3bad81,0xe43ae1fc),L_(0x7af9ba54),
+ LL(0x1981ac7c,0x13762e73),LL(0x5afe2e21,0x76679941),LL(0xa21b9a1b,0xd03deaed),L_(0xd498e9f2), LL(0xc88d2fa4,0x6ae69ee8),LL(0x749eed42,0x14c5a38c),LL(0x5f4c63df,0x95aa2f5a),L_(0x890e5e3e),
+ LL(0xda52bcab,0xdea7e049),LL(0xbf3bb703,0x6a4a37e1),LL(0xc64a209c,0xddb56124),L_(0x6858318b), LL(0xb063f261,0x9e3a0203),LL(0xf0dbd02b,0xf2de2a02),LL(0xa216442b,0x5ebba836),L_(0xc0cbf7a0),
+ LL(0xc6f7be46,0x9bdf3b81),LL(0xe5bfa2bd,0x471a44c8),LL(0xef3da843,0x7b3913de),L_(0x107bba5b), LL(0xd5502ac9,0xda5362cd),LL(0x81eecff8,0x51e4974d),LL(0x151060a4,0xd9ea79af),L_(0xe89b5db6),
+ LL(0x176cf8de,0x310d44fc),LL(0x4509feca,0x8d199332),LL(0x25aa7254,0xd40c4268),L_(0xa958ef77), LL(0x4c15f926,0x5dae221b),LL(0x71fc93e9,0xb47feada),LL(0xc3e3cb95,0x0f45640e),L_(0x6b7cb33b),
+ LL(0x2033fbaf,0xc74fe8dc),LL(0x8c9ef406,0x8a528a60),LL(0xb6fe758c,0x04aa9cd6),L_(0x4f8b3877), LL(0xbbebde8e,0x9f568191),LL(0x65aed657,0x88ffeed7),LL(0x85d0ebdf,0x7968220e),L_(0x04b5f3d4),
+ LL(0x2004c53a,0x275a3075),LL(0x3a2a339d,0x686f881e),LL(0x8a7f68a5,0x5e03cf06),L_(0xd663fea8), LL(0x5c2f3d32,0x83dd1968),LL(0x6151157a,0xbccda799),LL(0x620979ba,0x6d82e1aa),L_(0x3ac652d1),
+ LL(0x4bd23c39,0x9f8e323d),LL(0xed2fa4ec,0xaa59f591),LL(0x554cf5e9,0x14820bd1),L_(0xc72e2e81), LL(0x9ce69d25,0xe15fa1bd),LL(0x5f0c938d,0x6c3a0be6),LL(0xdf2d997a,0x33617c0a),L_(0x3087e812),
+ LL(0x5df1d007,0x7f81aff5),LL(0xd6ea063d,0xbe630797),LL(0x631cf97e,0x46b66ca3),L_(0x3bfc14a4), LL(0xd751c657,0x3a379a18),LL(0xaa5dfd05,0x87fb3d3b),LL(0xf3af9e8f,0x95b8ff29),L_(0x928c3c53),
+ LL(0xcfeb637a,0xe65a2e0c),LL(0xa11c784f,0xe52dcc1f),LL(0xd33e59b1,0x2f4c50c4),L_(0xe15fe3e7), LL(0x8e0494e2,0xe61d0a02),LL(0xdff24b95,0xa0c563a3),LL(0xd0e84cbb,0xc9c516d5),L_(0xbc6f5dd3),
+ LL(0x6f4d5a61,0x828d8489),LL(0x55c5a959,0xe0f2a11a),LL(0xed8f7fcb,0x2be30973),L_(0x0b24dc92), LL(0x835ad623,0xc98877f5),LL(0xd599613c,0x62b30316),LL(0x43a0bc0b,0x34b1b90a),L_(0xa8edd1ca),
+ LL(0x25bb0089,0x126c6d31),LL(0xb92a7bd7,0xb4a63c35),LL(0xd9952b28,0xb5f3accf),L_(0xd21fa7b1), LL(0x470e5d4b,0x6ac1deda),LL(0x7d8ef38b,0x7ddc00b8),LL(0x26d207ac,0xc01bf44b),L_(0x58c8cee8),
+ LL(0x43e06d65,0x5d2a899b),LL(0x94d31b36,0x787531d0),LL(0x3050256d,0xd6d74149),L_(0xaa4efe0c), LL(0xa5994d61,0x9b7a733e),LL(0x491dc4d2,0xab4d4ef7),LL(0x7540af9a,0x358ed8d5),L_(0x17dc58f7),
+ LL(0x2cf09935,0xb13a4f1f),LL(0x4d20428f,0xaa77cf17),LL(0xf17077d7,0x27509ac6),L_(0x58852489), LL(0xdeaa5893,0x64ad83cf),LL(0xc965f9f3,0xeb7c2c1c),LL(0x9a3903b0,0x2677b45a),L_(0x45839bea),
+ LL(0x1b4a3efd,0x6c1eb10c),LL(0x24b30b08,0x30469bc0),LL(0x44f85d04,0x688bbe3b),L_(0xc74ccccb), LL(0x40ec199e,0x94d1ce02),LL(0x14d9a43c,0x1e8a57b2),LL(0xc940698d,0xf3a40155),L_(0xefe2f127),
+ LL(0x7ced76b7,0x9378bdc8),LL(0xfbd86f1e,0xd3de6697),LL(0x38c7a9cc,0x965226a4),L_(0x434dbb0c), LL(0x1d9de00e,0xb9259728),LL(0xc36bf7c6,0xe5e2b0b4),LL(0x0a12f12b,0xb21834ca),L_(0x0134eeee),
+ LL(0x2cbf4902,0xad55e742),LL(0xa30d570d,0xceb87a93),LL(0xdaaa178c,0x525f0059),L_(0xf38af4e6), LL(0xf041ead7,0xa001bb9f),LL(0xa05f60e2,0x951d1144),LL(0x701418ea,0xfd38f820),L_(0x27e433c5),
+ LL(0x4f2b74e1,0xcf1f6417),LL(0x3570870f,0x2d368dff),LL(0x85875e05,0x96e8ab61),L_(0xefc6f006), LL(0x139ced83,0x0206e9aa),LL(0x6f6540da,0x1f1ac51c),LL(0x2a1b80e0,0x9caa872e),L_(0x895193a8),
+ LL(0xbe7a3924,0x40d4de6c),LL(0x288f99a9,0xa9bbbd0c),LL(0x74a2cf89,0xad2e6432),L_(0x52ddf73d), LL(0x50719c7b,0xef978612),LL(0xbb41a387,0x44b2c373),LL(0x319f4bf7,0x40e92907),L_(0x9884b224),
+ LL(0xcb2e3230,0xe2fde7bc),LL(0x282179db,0xb286e49e),LL(0x7897f73f,0x14a26c02),L_(0x07ab717c), LL(0x0974c087,0xb3e012dd),LL(0xa65b35a3,0xb211a759),LL(0xb888ddca,0xc0879433),L_(0x8819e222),
+ LL(0xa98ed0e0,0x32acb172),LL(0x9f902cc1,0x30fb222b),LL(0x2ea4f419,0xec378b71),L_(0xd036aa23), LL(0xfc7c459e,0x0f8fe474),LL(0x3e16c057,0xea879818),LL(0x134bd529,0xee28b685),L_(0x867d1b08),
+ LL(0x7f52225a,0x49cdbae9),LL(0x5c1f02d0,0x22253ab0),LL(0xd83d7d9e,0x1b0a0f31),L_(0x2c287cd4), LL(0xa7c8e376,0xf27c6df7),LL(0x74534873,0xb5e78384),LL(0x5a696a14,0x8118c158),L_(0xfc06292e),
+ LL(0xa94b2f8a,0x5e909156),LL(0xbd1a69f7,0x0e89f809),LL(0x703cb9be,0x5a474912),L_(0xcedd645a), LL(0xfc513c30,0xdeeac8ab),LL(0x2ed53772,0x8d081de8),LL(0x5e6b86ab,0xc7b731bc),L_(0x5ce1f8a0),
+ LL(0xa68e3ae6,0xcc023bb5),LL(0xdf3b4492,0xd2e02e8e),LL(0x87e45b7d,0x0ae46dae),L_(0xe1f7eac7), LL(0xe31f07c6,0xb2f3733a),LL(0x72718cd2,0x58504950),LL(0x85e9b624,0x626b0871),L_(0xc20aa08f),
+ LL(0x3383e911,0x44129030),LL(0x8b7e591b,0x1fa18b39),LL(0xc7753dad,0xf476b49f),L_(0x2fc4d6c3), LL(0x43355b4f,0xe26efb18),LL(0x4dd384fc,0xb345e6e0),LL(0x478d3761,0xc574295c),L_(0x421851ef),
+ LL(0xc576e693,0x92253e01),LL(0x5a61d65d,0xa9b92c8f),LL(0xd4924563,0x1e712886),L_(0x2dd1532f), LL(0x502854fc,0xa3f1ded9),LL(0x39cdfbfc,0xb3758c76),LL(0xb32cde92,0x57960c59),L_(0x40ad0b76),
+ LL(0x7c7eb74a,0x33392cdf),LL(0x52977c85,0x3035bc66),LL(0x147af937,0x6dd913b5),L_(0x4ec4b1c5), LL(0x3cd27826,0x699ab1e8),LL(0x438d69df,0x674459d8),LL(0xdf94b6a0,0xbc60bb02),L_(0x60dae203),
+ LL(0x98237ec1,0x01cf54f3),LL(0xc3cf28be,0xc86cd9e7),LL(0xfa448ad2,0xf8c1cf70),L_(0x59baadb3), LL(0x6e0c6ab4,0xb0a595fa),LL(0x60b75e6c,0xaef06103),LL(0xb92101cb,0x99833d0b),L_(0x4be8d444),
+ LL(0x76a063e0,0xedd8ac9f),LL(0xcb571bbf,0xfbb746f6),LL(0x5a13acc6,0x68203714),L_(0x79914deb), LL(0x698725d3,0x5c3bbaeb),LL(0x211e58cd,0x8019d5ed),LL(0xdef6ac5e,0x776cb363),L_(0x93cb4804),
+ LL(0x2c9e2d1e,0x7d49d5cb),LL(0x55e82125,0xb44a7110),LL(0xa13cee20,0x7e46156a),L_(0x7d7e5719), LL(0x293b532f,0x629c9b2f),LL(0x5fd28ac1,0x4766f7bb),LL(0xdc393f35,0x8ea6f6e3),L_(0x289c68b1),
+ LL(0xf29e017b,0x63596f57),LL(0x31f49f27,0xb9a200a0),LL(0x7c86680a,0x0b1f95fd),L_(0x02fc0e10), LL(0x61a4ad54,0x8f2843cd),LL(0xca4cab38,0x5392a44e),LL(0xace069cf,0xf56c80ff),L_(0x270d9677),
+ LL(0x8e969ba3,0x6352c6f5),LL(0x67e09224,0xd3d5c18a),LL(0x5be06f9a,0x14efc35d),L_(0x38c6a0a2), LL(0x0263394a,0xbe2d9aa3),LL(0x6d0b11a9,0x72815d01),LL(0x6c28404f,0x5538c4c6),L_(0x0af532d8),
+ LL(0x27afc27a,0x588f5f00),LL(0xb4277028,0x7fd91a63),LL(0x2477f29e,0x5fe5d31d),L_(0x68c2db2a), LL(0x3c6bab6a,0x2a5ebb99),LL(0x7b9c3f49,0x8847424d),LL(0xbf734579,0xbf266e3b),L_(0xfe65a7a9),
+},
+/* digit=32 base_pwr=2^224 */
+{
+ LL(0x390f347f,0xb7478766),LL(0xeaa013ed,0x69774be3),LL(0x1cf3e562,0xe8c99b44),L_(0x142c4251), LL(0x6addc55a,0x5ac149fb),LL(0x9c824754,0x251be20c),LL(0x6b1233b2,0xb9c09eeb),L_(0xc5afba96),
+ LL(0x772d2e43,0xb7c40ccd),LL(0xbf4d6687,0x4a5ac532),LL(0x88025f52,0x80c953d4),L_(0xe3dc6d83), LL(0xa265b97a,0xb7668ae2),LL(0x50faab59,0xa19f0872),LL(0x235fc5b5,0xac299c46),L_(0x1378e170),
+ LL(0xe16661d5,0xb43ccb67),LL(0x47792f74,0x13fe8d1f),LL(0x3dbeda1c,0xb688499b),L_(0x5b9b5ea1), LL(0x6ec4def3,0x6f26a9f6),LL(0xc4515542,0x45056f3c),LL(0x8e4ebca1,0x1f557c40),L_(0xd6441259),
+ LL(0xa24e4556,0xea6ea3c9),LL(0xc6c1108f,0xb4010098),LL(0xcc83bf8e,0x2c30408f),L_(0x7aa17b0c), LL(0x89219d24,0x06aed6af),LL(0xc003650d,0xbe94120f),LL(0x72d853fe,0x66238f2e),L_(0xf46a15a7),
+ LL(0xf0756f21,0xf16a11ac),LL(0xccc9dc6a,0xc74dff4d),LL(0x71ab7d63,0x54c72750),L_(0x5a001c63), LL(0xcf7f1e0d,0x226cb517),LL(0xb6f26d84,0x09440d66),LL(0x3fc36947,0x9f9ee30a),L_(0xa1549b9d),
+ LL(0x9d51f064,0x4a2b2246),LL(0xa65e1e3b,0xfddd99d1),LL(0x671cf2f3,0x6b9d08f0),L_(0x162efd24), LL(0x4fa36b3d,0x3316fc3e),LL(0x84ae1987,0xd5adf51b),LL(0x7d0dc886,0xdbe094f5),L_(0xc7b0730d),
+ LL(0xb0e743f2,0x1bb62b05),LL(0xe8e8411e,0x6fd286a0),LL(0xd192f8c2,0xe45573f0),L_(0xc1f3a5f2), LL(0x96b5af59,0x26419174),LL(0x6c1325f6,0x50d9352d),LL(0x2f81e001,0xa91d228e),L_(0x0ff7a9b2),
+ LL(0x1a7e3bbc,0x88e39d85),LL(0x42262241,0xc7cb4750),LL(0x3ad07ade,0x918fdfa4),L_(0xcb771a46), LL(0xd39e0dbc,0x18ba36b7),LL(0xeb29d84d,0x3f5d4732),LL(0x1383d57f,0xf57833f6),L_(0xfda5e179),
+ LL(0x024fa042,0x47af4689),LL(0x6f69c44b,0xe8d6a5c3),LL(0x5e4d4fa0,0xd6821d55),L_(0x46eb8384), LL(0xc59ebc7b,0xcdeb889d),LL(0x871d5809,0xeaf69758),LL(0x1029a1da,0x5cf9245d),L_(0x1bcc2546),
+ LL(0x491af658,0xfd8a4d1e),LL(0xdb1de26b,0x677407f1),LL(0x8aa6deb0,0x12fee6da),L_(0x1e010832), LL(0xeb1d6fd4,0xd9702487),LL(0x9e928c81,0x0d5e0508),LL(0x79014b3a,0x844adfba),L_(0xa7623853),
+ LL(0x6333a497,0x2e0124e6),LL(0x2b6dbd37,0xacc3158a),LL(0xcb4fc42b,0xd7cdda0b),L_(0xd5d8f543), LL(0x1a1d4227,0x485584ae),LL(0xdd6eb7f3,0xa25706fd),LL(0x2e41e3f8,0x65859cc9),L_(0xeca30c9e),
+ LL(0xef4c8e5d,0xd5f8805d),LL(0x66979e6c,0xc2437937),LL(0x1b2ea5ec,0xf8ebb830),L_(0x416a9eb2), LL(0x87c226a3,0x6e8ad20c),LL(0x15ff6e9d,0x784bfc8d),LL(0x0865593f,0xee384b9b),L_(0xe0eeda2c),
+ LL(0x148e4a75,0x642f55af),LL(0xbfeb8487,0xc162ad9e),LL(0xfa3ad249,0x7145f39b),L_(0xd0f1abf1), LL(0x4053c61b,0x4defbbd5),LL(0x893a0505,0x1244854d),LL(0xf3e2f26d,0xf54c27a7),L_(0x6f12b38f),
+ LL(0xa1ac9684,0x5d26514a),LL(0x7cad1aa3,0x3b5e65fa),LL(0x74faf86d,0xfeab4314),L_(0x645cca78), LL(0x3c8ed8d4,0x43f00055),LL(0xb72096cb,0x8df847ba),LL(0x7a1950ed,0x071d954a),L_(0x5337fbf2),
+ LL(0x33140bfb,0xb32000f6),LL(0x5f6dea95,0x27eab135),LL(0xf4446577,0x19091ccf),L_(0x74118cb1), LL(0x765e46b5,0x9210256d),LL(0x9aacef2c,0x3ce74727),LL(0x1ca9b6d8,0xb1ab02c7),L_(0xa870996c),
+ LL(0x36f1ae02,0x308cbf7f),LL(0x552396fc,0x748ef11b),LL(0x7b2fda3a,0x4146f800),L_(0xaebf97a3), LL(0xb4291275,0x61fb1316),LL(0xf1c9012c,0x894b0da7),LL(0x0142bd07,0x9b191445),L_(0xbab9da1b),
+ LL(0xe1f1f426,0x5e508e4a),LL(0xfa8ca29d,0x4b94de05),LL(0x27a0f674,0x4cfdd6de),L_(0xee0206bb), LL(0x4b46ce88,0x978ed51e),LL(0xa6bbc41f,0x6bee5364),LL(0xe52c7867,0x006c7072),L_(0x32478f51),
+ LL(0x5382793a,0x217f1202),LL(0x04851e7d,0x3c689851),LL(0xd7767c09,0x75b3d632),L_(0x4c08238d), LL(0xab3ed287,0x3858c44e),LL(0xcd97e8ec,0x0c103d5b),LL(0x62318c47,0x93355b9b),L_(0xe2405794),
+ LL(0xe36e5cd7,0xde835c5d),LL(0x92a463c3,0x1eba7f4e),LL(0x3b10b96a,0x4b4acd48),L_(0x5f5bd93b), LL(0xd4e11813,0xf537b955),LL(0xedc9c8f4,0xf31bab45),LL(0xf2362c8d,0xe58a0000),L_(0x970cf697),
+ LL(0xc005e339,0x8e7b1729),LL(0x882e0b3e,0xf8b77b70),LL(0xbf2d6013,0x490fbccd),L_(0xc0848551), LL(0x5c4916a2,0x73f7a7d8),LL(0x17b850e8,0xde0ad5e0),LL(0xfcc68ded,0x9cbe988b),L_(0x8d09bdd2),
+ LL(0xf00570c3,0x6266d7a9),LL(0x7f0f6292,0x4291a62a),LL(0x47c40355,0x1cfc61e3),L_(0x7a59e7d3), LL(0x4ce6c101,0xbddfbabb),LL(0x84b7a613,0xe92b59c0),LL(0x89396fd0,0x0f5147ce),L_(0x2b7f355a),
+ LL(0x9d82dd91,0x8af9951f),LL(0x4d2ceb91,0x78598c17),LL(0xcc451e87,0x6d59d3b5),L_(0xc116fdef), LL(0xd20d8318,0x79ead74d),LL(0x813a5852,0x8ba20d33),LL(0xc12ffcbc,0xcd67731a),L_(0x3fdf17e1),
+ LL(0x5e3aff2a,0x764582dd),LL(0xefaccc05,0x05c889a6),LL(0x63018ab6,0x6f606211),L_(0x6b706f5e), LL(0xac9cf98f,0x2663583f),LL(0x2a01814c,0xde1ab3e0),LL(0xe29eede6,0x756a8f01),L_(0x10f5f095),
+ LL(0x363dd819,0xa38d34f9),LL(0x591f8fe0,0xc1ebeead),LL(0xc31b8775,0xae2b4a7d),L_(0x55de9380), LL(0xd500cd22,0x63877737),LL(0x566cf0c3,0x04743650),LL(0x1ad0462c,0x5c1a2a83),L_(0xcfd11aad),
+ LL(0x4c679d95,0xbc66bc8e),LL(0x9f39feb3,0xd84b8c56),LL(0x21f0dec8,0xd2ff18e6),L_(0x99e3e6c4), LL(0x08b2eebe,0xcce55b7e),LL(0xf3fabc3c,0xb0ed283f),LL(0x5c869424,0x4f7a9f81),L_(0xc660df04),
+ LL(0xd868008a,0x302b25d6),LL(0xfbdef76c,0xd9a10be6),LL(0x97f6ff80,0xcc0decf0),L_(0x26e1f975), LL(0xbb6408c0,0x4f37e254),LL(0x61eee678,0x9682814e),LL(0x6a0d8fc5,0xd84014df),L_(0xb7e3a2d4),
+ LL(0xaa81602b,0xde3d73e7),LL(0x3178216e,0xe66f2866),LL(0x2f89efcd,0xdcbe0246),L_(0xb937b3c2), LL(0x72d505b5,0xacaa30cf),LL(0x7f06975e,0x66c190f4),LL(0x714b6102,0xd23f9579),L_(0xc1321142),
+ LL(0x3c07cee1,0x8271dfd0),LL(0x6e2e57bd,0x85e2b2d2),LL(0xec736ab9,0xbcfb4116),L_(0x1cc014d1), LL(0x57b0096e,0x02178015),LL(0xbcc0c7bd,0xda722aae),LL(0xdf2643e7,0xedc952bb),L_(0x36ab26fe),
+ LL(0x76041355,0xc562a324),LL(0xccd2af21,0xa955496c),LL(0x8cbd4ea2,0x9f800082),L_(0x7bbad5e0), LL(0x53fd9c07,0xbfd65f54),LL(0xfa87a290,0xd0f0709a),LL(0xd25d631b,0xe063926d),L_(0x0f3d4539),
+ LL(0xd48fa29e,0x6bf5b024),LL(0x1a63c568,0xea32fa48),LL(0x7bad1c42,0x62df4304),L_(0x38b54b11), LL(0x97d1cfa8,0x94995152),LL(0x7f7b64f5,0x9e00e462),LL(0xd25d1128,0xbdbbd673),L_(0x4703bb51),
+ LL(0x304a08ec,0x2509ad1a),LL(0x9885b7f4,0x9877088f),LL(0xf70447a7,0x9bfc053a),L_(0x1b77852c), LL(0xaf70aa1f,0x7dc9ba14),LL(0xa43807b7,0xff3589c4),LL(0x02c669a5,0x220e1871),L_(0x991d8093),
+ LL(0x86209a7e,0xc434b863),LL(0x6c74aee9,0x10b6d0ca),LL(0x072efedb,0x19982c91),L_(0xac91d19f), LL(0xbfb13837,0xbc64a3c6),LL(0xcea49a1b,0xab8a0475),LL(0xe25c1282,0x37f9ab3c),L_(0x57709b27),
+ LL(0x422a938d,0x63a0bab7),LL(0xbdede240,0x2dffb3e9),LL(0x8ec0a031,0xbbb0cddc),L_(0xf6b96225), LL(0xfa46994b,0x3dff08ca),LL(0xf46b51e6,0xb21694f6),LL(0xfac7173a,0x3f2c5530),L_(0xe5090eda),
+ LL(0x5e18c4f3,0x585b98ed),LL(0x4cb0c03a,0x2784af9f),LL(0xb6dc9a2d,0x126ee071),L_(0x3331172f), LL(0x56db8dc6,0xba3aa739),LL(0x71ac411d,0x16a260a5),LL(0x816a4f1b,0xa88c4198),L_(0xe409dbda),
+ LL(0x5fd428ad,0xccb6c49d),LL(0xa20ba7c3,0xe7066136),LL(0x6782fea2,0x83b7b5ce),L_(0xf28c836e), LL(0x4fe78dbc,0x64f82fd1),LL(0x523afba8,0xe21bc6e2),LL(0x024ddda9,0x65d29391),L_(0x4cec16d6),
+ LL(0xfd04b964,0xaff84dd9),LL(0x1594f62b,0x4eb6067b),LL(0xa8de453c,0xeb65c1b7),L_(0x30a103ff), LL(0x6903c7e6,0xf76afad7),LL(0xa91cd374,0x2f9fd25b),LL(0xa33359fe,0x0b99c0c0),L_(0x9015867f),
+ LL(0x8a65619a,0xb366fcc7),LL(0xdde98289,0xec03d9a8),LL(0xe45737f9,0x30c2ee70),L_(0xa6bb364a), LL(0x67ffeeef,0xe00c866a),LL(0x8177a004,0xac4b7104),LL(0x49205953,0x0106e5ac),L_(0x5d4c1327),
+ LL(0x2e836cb7,0xdebcecc7),LL(0xfdc46d5f,0x9b0df65d),LL(0xa125951c,0x5633f2c4),L_(0x04c2afc1), LL(0x89476731,0xacd14df8),LL(0xb5f970f1,0x9f48abbc),LL(0x0973ccd0,0x236b3580),L_(0x02b2c84a),
+ LL(0x88394318,0xcb13811c),LL(0x0d2dd5a3,0x9bbda12c),LL(0xd8b5d0f6,0x4f399d9a),L_(0xa46887b9), LL(0x2ae73578,0x10165160),LL(0xddf54326,0xc04d1a88),LL(0xf080be9c,0xeee34275),L_(0x047237fe),
+ LL(0x7aab908a,0x11fceb11),LL(0xfaf4fbdf,0x96bea707),LL(0x66bfd60d,0x442c2a46),L_(0x28cf0358), LL(0x6d51778b,0x4cebfe24),LL(0x6c01d714,0xaf283f0e),LL(0x11d66f5a,0x8cc29c26),L_(0xcf7771ef),
+ LL(0x76ad7d8f,0xf90d16be),LL(0xb89933d4,0x2a97f299),LL(0xc8f0695f,0x5a6af165),L_(0x82274dbf), LL(0x1826ea5a,0x225b8bb2),LL(0x5e138d61,0x16c62f5f),LL(0x3e2273d1,0x6b42f9f3),L_(0xaa4b331c),
+ LL(0x5659f40e,0xa9d80f3d),LL(0x6773ac5a,0x6ed38547),LL(0x970b6067,0x78700052),L_(0x2f129047), LL(0x4d7032cd,0x0393eefa),LL(0x04368569,0x98e16738),LL(0x5180fe6f,0x3014d2a0),L_(0x6bd99185),
+ LL(0x1988a375,0x299011dd),LL(0xe9270a23,0x40dded09),LL(0x54a9528b,0x7af57c36),L_(0x8e613981), LL(0xb388faf2,0xff5fc081),LL(0xd7dd7f17,0x2ccd8f6a),LL(0x421cb6c5,0x590b13ce),L_(0x8f9e6852),
+ LL(0xe7870572,0x6513f9c8),LL(0xd5bf1a5d,0x2f88c206),LL(0x1942fc9b,0x6ec5f13f),L_(0x70273957), LL(0xf1998de6,0x5bb80bbb),LL(0xcededd82,0x923e0aaa),LL(0xa7c7ee32,0xfa06b05d),L_(0x86a8080f),
+ LL(0xe016efc2,0x9510adb0),LL(0x8a998afb,0x9a9168be),LL(0xfaf28d30,0x0863e4f3),L_(0xdcf64ed3), LL(0xa0beb82c,0x1ea72a0f),LL(0x78d5ce7b,0x932f17af),LL(0xafe82b0c,0xde25a969),L_(0x1f0a50fe),
+ LL(0x496b6eb7,0x3d5e21a1),LL(0xddb5610d,0x36b95de4),LL(0x435cd100,0xcc34b698),L_(0xf7218db6), LL(0xf643607b,0xc23a0cb7),LL(0x3b787bdf,0x2299d421),LL(0x71fcc010,0xb0e2a897),L_(0xd6c69c33),
+ LL(0x0241244a,0x1cd5d5da),LL(0xe94a402b,0xf0ca4eca),LL(0x26944f06,0x737d6c5b),L_(0xd0af2018), LL(0xc1e2ad0c,0x1b523220),LL(0xa8a984b3,0xc8ebc391),LL(0x39663eef,0xbf4b3e0e),L_(0x0297dfd1),
+ LL(0x0ac5f597,0xc8d20d13),LL(0xf915a4c4,0x00b7e16a),LL(0x2921fb10,0x6b467b73),L_(0x226421aa), LL(0xf2ede5a3,0xf4bdad8c),LL(0xb5512d8c,0xce15cba2),LL(0x2df92000,0x4979cf5a),L_(0xd5159856),
+ LL(0x7ac29a8f,0xffb25428),LL(0xad4ff433,0x6903617b),LL(0x22c48ae6,0xdcdd2832),L_(0xee468cb2), LL(0x6769e2fd,0xad56cbbc),LL(0x1ac2be8d,0xc8f4bea8),LL(0x11bdfbf2,0x4c080ea0),L_(0xd326fcc1),
+ LL(0x264b7510,0x3c2a21b2),LL(0x4c900a2e,0x10bf375c),LL(0x540b6e6d,0x40c9b00d),L_(0xf0db08ca), LL(0x1f0e8e4f,0x75ea8b18),LL(0x23e0167d,0x4ae7f6f7),LL(0x3ce76be8,0xc2578bd9),L_(0x274ef866),
+ LL(0x2d2787bd,0x06e96b07),LL(0xa0cc2074,0x3859e8e4),LL(0x2181d378,0xbc50ac87),L_(0x46b62277), LL(0xc39d3dd1,0x66a073ee),LL(0xbc771f86,0x2bf462de),LL(0x47275780,0xa7216ad9),L_(0xd3c1c667),
+ LL(0x359b7048,0x37e5b8f4),LL(0xfea02084,0x16126c46),LL(0xe9a5f0b8,0xbf587847),L_(0x53933d2b), LL(0x1c7944f6,0x492b64e3),LL(0x8257b251,0xf2983977),LL(0x8d9ec843,0xfe9686a0),L_(0xeeea3972),
+ LL(0xac24ef0b,0xb93a8f55),LL(0xf5712604,0xfa720e89),LL(0x6981acc8,0xf73a981c),L_(0x86cc6e25), LL(0xd19071bc,0xa6c75878),LL(0x18cf2a94,0x15519e91),LL(0x5737dd50,0x4c1f9f0e),L_(0x3114afeb),
+ LL(0xec690133,0xbbc2c60e),LL(0x19e92b39,0x1a4e7efe),LL(0xb3de20d1,0x43d40348),L_(0x693597af), LL(0x9b86b502,0xa7c941f1),LL(0x4568fdc8,0x38d7607d),LL(0x92d2afed,0x50493b74),L_(0xa510adc1),
+ LL(0x29a4b55c,0x60867e2e),LL(0xab4d38b7,0xc6a2be65),LL(0x0b8a018f,0x2c774449),L_(0xc11883d8), LL(0x3703e4c4,0xa50bce89),LL(0x9bcfd81b,0xc601a985),LL(0xf5811bc5,0x80f1e9c2),L_(0xe9b876e5),
+ LL(0xb21301b8,0x368a0741),LL(0x7cf8b51b,0x57d524cc),LL(0x85f0eb37,0xb5926249),L_(0x08e70a34), LL(0xdd6d17da,0xe9a1940d),LL(0x4d61fee9,0x905e7d89),LL(0x24af91e7,0xa85a5970),L_(0x41f4907d),
+ LL(0xa38b5cfe,0x33182545),LL(0x7b2ef570,0x10b61fe2),LL(0x2a780101,0x8d1180df),L_(0xab954cb9), LL(0x8b6a7232,0x88d81ace),LL(0x0d62a965,0xa35ed73b),LL(0xaa16f924,0x2bc7cca4),L_(0x2d99dcc8),
+ LL(0x3c5881cd,0xb1395709),LL(0x21c56351,0xe2ce53b6),LL(0x41b20f4e,0x067af3fb),L_(0xbd9ab15f), LL(0x2f06e7bc,0x1523f3df),LL(0x9de5e7e4,0xb26c33fb),LL(0xef0cf37f,0x6c9e48d4),L_(0xc9fc2851),
+ LL(0xcb75ecba,0xb81124f0),LL(0xea0ed825,0xad146b33),LL(0xf4f08526,0x8e19f5c1),L_(0x820a4f79), LL(0xa1d54353,0x6eaedecb),LL(0xefe607bc,0xe5ecca5d),LL(0x75968ada,0x21596aa9),L_(0xcdf9ca14),
+ LL(0x4cdb6b68,0xdaef28c2),LL(0x2be4550b,0xdd0b6f86),LL(0xee673998,0x8162c783),L_(0x4e1fb36c), LL(0x58a6ed93,0xab7e3385),LL(0xb682150c,0x3081637e),LL(0x02a0814f,0x9c692620),L_(0x3bb22aea),
+ LL(0x6bc24027,0xa03f91a5),LL(0xd356a2bd,0x0f664f1a),LL(0x04625b5a,0xf350f847),L_(0x2eacfb01), LL(0x4e04629e,0x63af93f4),LL(0xba005c26,0x8ec3c009),LL(0x7964a6f9,0xc56edb4d),L_(0x14b146d7),
+ LL(0x64910001,0xcae5ffdd),LL(0x51fbb8f7,0x657b3f67),LL(0xa961e968,0xbe43f447),L_(0x2a774b0b), LL(0xbfbe3d28,0x4e174bef),LL(0xb12fde0a,0x11d92d90),LL(0x85b59e4f,0x421eac26),L_(0x4c480a51),
+ LL(0x83f1230c,0xc3a1a862),LL(0xfe8ceef6,0xbef83f8d),LL(0x0469540a,0xd231a2a4),L_(0x0828f4c0), LL(0xc896c8cb,0x2c034efa),LL(0x1744d906,0xc9a26995),LL(0x2a85a8d6,0x28f5775a),L_(0x58717292),
+ LL(0x12ab27ce,0xf12dc791),LL(0xbcc5e464,0xec36c787),LL(0xb881c819,0x2bfca9a4),L_(0x7e60531f), LL(0xd8af4418,0x28ea4eef),LL(0x9ef6ada6,0xe0a7044d),LL(0xf56fbcf0,0x534e2057),L_(0x9857c41f),
+}
+};
+#else
+const __ALIGN64 P224_POINT_AFFINE ec_p224r1_precomputed[33][64] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0xbc905227,0x6018bfaa),LL(0xf22fe220,0xf96bec04),LL(0x6dd3af9b,0xa21b5e60),L_(0x92f5b516), LL(0x2edca1e6,0x05335a6b),LL(0xe8c15513,0x03dfe878),LL(0xaea9c5ae,0x614786f1),L_(0x100c1218),
+ LL(0x4ca9a1ed,0x5650df9b),LL(0xbe27f7a3,0x2a0f1689),LL(0x10c911f7,0xcafb50f5),L_(0x18dd00ac), LL(0x02aac79c,0xc90ae186),LL(0xe72e600f,0x76cc1019),LL(0x0c84ced0,0x5cabb880),L_(0x6a5db1a2),
+ LL(0xe37710d8,0xe0b02223),LL(0xab22ca96,0xc3cf1c5a),LL(0x00505bb6,0xaf8b6496),L_(0x799eb566), LL(0x9a73b174,0x04144e62),LL(0xe434f88f,0x357940ab),LL(0xafe10c35,0x6dfa492c),L_(0x8c1b1da3),
+ LL(0x0a72faf7,0x0860856c),LL(0xc03cd01a,0xcb021705),LL(0x4256e88a,0x89f0c6a0),L_(0x7bf0ef17), LL(0x6743e274,0x98933269),LL(0x64b26855,0x2058f0ba),LL(0x7ee104d3,0x8c87db62),L_(0x73e0d4c7),
+ LL(0x0b10cc51,0xf8dfc283),LL(0xac3c8962,0x975a451e),LL(0x39211b77,0xf7f4fe95),L_(0x2bd053a8), LL(0x2b552e74,0x61a9e695),LL(0xc350ef91,0x11bcf037),LL(0x42b54f79,0xc858da82),L_(0x9b052162),
+ LL(0xde577c0e,0x1a8aec73),LL(0xe82df964,0xe0cd01d3),LL(0x1addb3a1,0xf25fe17c),L_(0x21b6fe25), LL(0x5fae6c33,0x0f5c7709),LL(0x327f8848,0xf2d2c41c),LL(0x9b6731a6,0x162f9e1c),L_(0x2383dee4),
+ LL(0x90462821,0x68646e35),LL(0x5048b145,0x1e2526ba),LL(0xc81df812,0x7ed50814),L_(0x7665453e), LL(0x610f2186,0x1fb32889),LL(0x9d0eba26,0xed8ceeed),LL(0xce5eb25e,0x0e5952e3),L_(0xa229bf84),
+ LL(0xb4c9d866,0x7bd696a2),LL(0x1de5d041,0xa3bebfe9),LL(0x8e4a5712,0x1b59038c),L_(0x21e8f814), LL(0x1bc1ff37,0x7558734a),LL(0x38a20402,0x0976258f),LL(0xc4e19066,0x2199c364),L_(0xd65a0dfb),
+ LL(0x1c1ecc78,0x743eda4a),LL(0x9f0b4f26,0x2f993a4f),LL(0x94f5e9ba,0x79d4095a),L_(0x846b2c39), LL(0xe07e55b7,0x909bf3f1),LL(0xbacf5e6a,0x77e1db6c),LL(0xe733d627,0x5114ac9d),L_(0x70889bf7),
+ LL(0xb808145d,0xb4f2672c),LL(0x328e0ac0,0x3e8abf6a),LL(0xc1f86e2c,0x9d0cdd53),L_(0x5ac34abe), LL(0xccddcf00,0x02883b6f),LL(0x225faa54,0x873d7e4c),LL(0xdbc0f8ee,0x2a687506),L_(0x722981c9),
+ LL(0xac358ca9,0xe1bdd5ca),LL(0xde5d2c4d,0xd0dee305),LL(0x0f060758,0xd6d89093),L_(0x9397da27), LL(0x649ea143,0x08181c2c),LL(0x79888920,0x6c63713a),LL(0xc1182bf0,0x45e48d79),L_(0x0e48dd82),
+ LL(0xf6495da2,0xa37b7441),LL(0xed4d0ea3,0x2b0b8e19),LL(0x571d38d9,0x517af941),L_(0x70792626), LL(0x1305b613,0x8cf21835),LL(0x208ffd66,0x5f59deb1),LL(0xbc243af0,0xa71404ae),L_(0x6d228d4b),
+ LL(0x489c8db3,0xffbe563f),LL(0x83630fe6,0xbc99fb0a),LL(0x68ade63c,0x398eacf0),L_(0xc5e095c8), LL(0x83fdacb6,0x800df824),LL(0xa3ffe74f,0x442ed616),LL(0xb4dc6bf8,0x3f8060b4),L_(0x12ab633c),
+ LL(0xf4109222,0xcdbd6eec),LL(0x0e9441ba,0x1ef814eb),LL(0xf4550d2e,0xb3a9b5e4),L_(0x47c1182a), LL(0x1544e90f,0x3f51f9f9),LL(0x9ed249e3,0x825b5794),LL(0x6516bbc3,0x3d1419d2),L_(0x92de7285),
+ LL(0x55bfd51a,0xb16ed1af),LL(0x464afb0a,0xd91345bb),LL(0xc5e26f62,0x64a35d22),L_(0x16880cc7), LL(0x05015843,0x70203aa0),LL(0x11e4ffa1,0x05a83a63),LL(0xdaf3972b,0x9422f10e),L_(0x5dbc0e12),
+ LL(0x6a4bd1fa,0xb3f66de6),LL(0x2ec3ac7c,0xfdf9a0e9),LL(0x471a2a7f,0xb9c51b5f),L_(0x8c4bc81e), LL(0xfa29681b,0x9c409bd0),LL(0xd979b98e,0x169405c2),LL(0x48be80cb,0xf22d3fc0),L_(0xbba8bdbd),
+ LL(0x86ade48c,0x79cec3fb),LL(0x3f83b939,0xb9622253),LL(0x5523244b,0x538d543e),L_(0x07ba7ce6), LL(0x12bb38c0,0xb4e20b8c),LL(0x70a52728,0xe6873448),LL(0x2a2e7758,0x2954321a),L_(0x07a8f3fd),
+ LL(0x3591891f,0x27a72a86),LL(0x845865a8,0x482460f5),LL(0x70114363,0x3b204e52),L_(0xb84ab43b), LL(0xd5f98054,0xc4a1a96b),LL(0xa4e237e3,0x0c0e97bb),LL(0x6bc4b6e9,0xfb212c8c),L_(0x335f11e1),
+ LL(0x716b6ade,0xea007122),LL(0x2a638e5a,0x08a75055),LL(0x4e35e1f6,0xe28f8fa3),L_(0xe40528c7), LL(0x7393ad17,0x4e27959e),LL(0xd8f5fd90,0x433c708c),LL(0xe5b33144,0x4c003b64),L_(0x6c3deb98),
+ LL(0xc57bd47b,0x238addb6),LL(0x8d685d17,0x703c82d4),LL(0xa0691b17,0x14a5d58e),L_(0xcd7fb5fc), LL(0xf9cefcb6,0xfd4764c3),LL(0xbb38397b,0x7b23c9fd),LL(0x23cf8d21,0x1d7b0c07),L_(0x7dafc83c),
+ LL(0x869c61a2,0x8d8b998b),LL(0x6f781395,0x5cc8116d),LL(0x1f271989,0xa8992ade),L_(0x78c70a2c), LL(0xb2334f8f,0x1fadf19a),LL(0x28c19018,0x71d5904e),LL(0x939bd9ec,0x534ec549),L_(0x77091fc9),
+ LL(0x22be0a45,0xb12549d7),LL(0xca28a29e,0xb64feadc),LL(0xfa13b698,0xd61f5f42),L_(0x5d34326e), LL(0x7ea2feda,0xd797283d),LL(0xc9ceaa43,0x5e1f2529),LL(0x113c4da8,0x4d22be7a),L_(0x12036cda),
+ LL(0x746daf60,0x210782c4),LL(0x64b5fd56,0x358ace9d),LL(0x1008fd0f,0xaf231c63),L_(0x285dcb4b), LL(0x17203da1,0x3534d554),LL(0xf8542368,0x30962d47),LL(0xf7552ee7,0xa1ab0080),L_(0x11208856),
+ LL(0x7708ee69,0x981a94f1),LL(0xd9d79e3e,0x50822535),LL(0x2632b017,0x21031b41),L_(0x8876f1a5), LL(0xa43cc165,0xfb24577f),LL(0xcd6f28d7,0x67a5fdbc),LL(0x583ccbb4,0xdf198e9a),L_(0xf49fccdb),
+ LL(0xec729f5c,0x347bddd0),LL(0x77f89e52,0x4576657a),LL(0x79a42c59,0x3a4d5c62),L_(0xdc6f4cf3), LL(0x72672c8e,0x34edf6de),LL(0xa9cc925d,0xc615c175),LL(0x264b7c52,0x6b6c91f7),L_(0x78e30c64),
+ LL(0x3c93deb5,0x454fe5e1),LL(0xc107ca82,0xdaedb454),LL(0x895933d6,0xc3d92afc),L_(0xc23f9ad4), LL(0x62afc583,0xb1ad4196),LL(0x9336c30d,0x122626f8),LL(0x56df6aa3,0x88c5db33),L_(0x454135c4),
+ LL(0xb5862dd9,0xfb7f7ec7),LL(0xfd622a86,0xf9ca08fc),LL(0xf3fb356b,0xa3379ec2),L_(0x3726b3ee), LL(0x5680ab95,0x1f4b780d),LL(0x72773b06,0x181ad0ef),LL(0x9c77acf2,0xc5ed6c19),L_(0xd82c650d),
+ LL(0x57cdf957,0x2e235ce3),LL(0x919ef962,0x3b66736f),LL(0x02924c24,0x9611c7f6),L_(0x5a87ed36), LL(0x2cd39c41,0x0ca01257),LL(0x8cec5f84,0x36cea89b),LL(0x576c9d6d,0xc0386b9b),L_(0xdf235412),
+ LL(0x3ff1d621,0xb26ad028),LL(0x0117a093,0x3395a449),LL(0xbb9b7453,0xac8575b5),L_(0x9638e810), LL(0x19b52295,0x61b7e04c),LL(0x917e2f50,0xea595a39),LL(0xb7e04864,0xf641867a),L_(0xf34ee0e8),
+ LL(0xf9c67813,0x0d5cd555),LL(0xcd9d1329,0x15609313),LL(0x071a1814,0xcec729a1),L_(0x973d765a), LL(0xd82b0a64,0xe9fd6113),LL(0xe16f07d8,0xf4a523e7),LL(0x095fdd3b,0x601388e8),L_(0xd8da4ec4),
+ LL(0x5d150589,0x6e0c12f8),LL(0xe3db4074,0xcc4b0246),LL(0xe25d613a,0x98b62cd3),L_(0xc7d0dccf), LL(0xca8e4caa,0x1f7fb23f),LL(0x6eff4dea,0x41da9f53),LL(0x44527d49,0x9e1f47c6),L_(0x3f6e7e3d),
+ LL(0xb17f74ed,0xe460275b),LL(0x3f409a21,0x56dc0e69),LL(0xaef13524,0x055bebff),L_(0x40a3d6e6), LL(0x5a0a6116,0x52aae002),LL(0x5d1a1a61,0x65c91bf7),LL(0x55229ca9,0x837c7497),L_(0x7a1145b5),
+ LL(0x724287d7,0x86eb5493),LL(0x2b764d91,0x7078641f),LL(0x72b46e9e,0x0bd8afe8),L_(0xfaf8c9a7), LL(0xeea543b7,0x7400cd52),LL(0x409c38a5,0x0a6c2e1b),LL(0x9604a54b,0xe2c2c60a),L_(0xd18594c9),
+ LL(0x771d897f,0x80cd8b3c),LL(0x4efc7c63,0x3b961927),LL(0x56c6e625,0x8d0c1d5a),L_(0x5533d0e3), LL(0x4b4c8803,0xee49b988),LL(0xc5802272,0x617aabd8),LL(0xb63d84cc,0xb309e31a),L_(0x0fa8942f),
+ LL(0x6ef3ab06,0xfbca1b97),LL(0xa18bd2bb,0xd8911f8d),LL(0x639e011c,0xb731d607),L_(0xde5b279e), LL(0x0706cd09,0x8e5b6703),LL(0xc24e209d,0x4d443d16),LL(0xdc2ea468,0xccc5dbca),L_(0x9aba875f),
+ LL(0xf86e4ee7,0xb38b3cb9),LL(0xdc2bb49b,0xd001bff5),LL(0xad920b0c,0x5f833048),L_(0xd67959b4), LL(0x3c687113,0x9cac7077),LL(0x84cba202,0x2bf74e82),LL(0x92b4f4b1,0xfcfe6f73),L_(0x3154d972),
+ LL(0x9afdccc2,0xf2645ccf),LL(0xe60a2a1d,0x170bc3dd),LL(0xc06a289b,0x8b3174cc),L_(0xb5e5b73e), LL(0xc289c4c6,0xfcbc66cf),LL(0x3f41c58d,0xea32e7fb),LL(0xfdc7bcec,0x2d89d32d),L_(0x34aa50e4),
+ LL(0x31801b59,0xcf102dd0),LL(0xf19df129,0x28f82869),LL(0x1600629e,0x6d3edc02),L_(0x3c98d6b7), LL(0xf21cabe7,0x31851ac8),LL(0x09f782ac,0x037f5693),LL(0x3f33781d,0xb0a0ce6c),L_(0xe96df7ee),
+ LL(0x4821f126,0x43b3629d),LL(0x502c3b9c,0x3319053f),LL(0xa3b32151,0x4038845d),L_(0xea3b4ccc), LL(0xedfaa06d,0x00044014),LL(0xd835277d,0xd5eb20d5),LL(0x1a8a108b,0x38cb0a6b),L_(0x30a8f927),
+ LL(0xb6e363d5,0xa45c3df2),LL(0x96c532cd,0x00c26ab0),LL(0x85098966,0x6d03e325),L_(0xea0d51b3), LL(0x8eec84d2,0x9134e03a),LL(0x04327df4,0xbbc8d92d),LL(0x4ffdb217,0x6e97a4bb),L_(0xc9fa9177),
+ LL(0x231d20c6,0xa36c8848),LL(0x3fcb294a,0xcb7e8b54),LL(0xc4b2c9f8,0x2f8b6de0),L_(0x49f1993b), LL(0xb8860526,0xfdcf530d),LL(0xb895a0fe,0x49da0f6a),LL(0xefc627b6,0x4e9fb807),L_(0xdbc0d2c1),
+ LL(0x64eae114,0x23074bd5),LL(0x48d5696a,0xb246633b),LL(0xefdb4759,0xc6af484b),L_(0xde4380e0), LL(0xe5997f29,0x8979b2ec),LL(0x507b7708,0x530f4963),LL(0x55ee3298,0xccf127a1),L_(0x32413bed),
+ LL(0x687018fd,0x7c723f5d),LL(0x86c9f952,0x2221f721),LL(0x93828714,0x13d720d3),L_(0x45d38213), LL(0xe61c9b06,0xc198db55),LL(0x598140b2,0xbe38af8f),LL(0x621f284e,0x18f09bf6),L_(0x192fd52c),
+ LL(0x65cd0db7,0xbb33fff7),LL(0xf9ca36b0,0x44ac0a55),LL(0x7a9b66be,0xc9308cae),L_(0x837d663e), LL(0x1b4048cc,0x5b7ecc1b),LL(0x4ee4991e,0x7fa30aad),LL(0x7e09ad23,0xff1f76e3),L_(0xbc48338a),
+ LL(0xa178a33b,0xdd724842),LL(0x914d8342,0xa5d7a87b),LL(0x30befc70,0x69874db8),L_(0xec19410e), LL(0xcfcdbfcf,0xe3d6346a),LL(0xde9edbbd,0x84c65475),LL(0xde39cef5,0xe4efb3c1),L_(0xc10a727b),
+ LL(0x493ae0bb,0xbc282cc0),LL(0xe7ebcd87,0xa024a0e9),LL(0xfa3a15cd,0x240e6a89),L_(0xa4a7db8d), LL(0xbba5d02e,0x95b6f1e0),LL(0x86491854,0x15b8172e),LL(0x158b8956,0x5eb7385c),L_(0xa8d22179),
+ LL(0x92f507ce,0x9137f80a),LL(0xf48fb253,0xcb924115),LL(0x2be56c53,0x0703cdda),L_(0xb4cf511f), LL(0x0b8faa80,0xb73eae3f),LL(0x58a8b927,0xf227ad25),LL(0xdbca2fc4,0x06231927),L_(0x409b12c6),
+ LL(0x5983f1a8,0xee7ac222),LL(0xf6df6ac6,0x48c69cbf),LL(0xa7dc8e21,0xbd701252),L_(0x6d2da921), LL(0x483083a2,0xc0d30797),LL(0x003aeb7c,0xd4ec2e63),LL(0xbda6fdc0,0x15074c14),L_(0x55d107b3),
+ LL(0x29e4a336,0x600e1a17),LL(0xd60d3b73,0xa542f637),LL(0x556905e7,0xc7209080),L_(0x3f5144ad), LL(0x0b55b0fe,0xa6cf1f95),LL(0xb8f822b9,0x9d44e115),LL(0x1acfe880,0xe820af09),L_(0x0a84bb85),
+ LL(0xc0bba383,0x02857752),LL(0x497eb0a9,0x8b30f555),LL(0xf120846d,0xac6401e1),L_(0xf72d6212), LL(0xcb20c291,0x84fbf362),LL(0xa175ab61,0xecddc9da),LL(0xe1839421,0x63952a13),L_(0xbe8f97bb),
+ LL(0x24f4b136,0xf0524e07),LL(0x8fd9fda0,0x138ee6ed),LL(0x1770de3d,0xedc6985e),L_(0x6c2f8154), LL(0x997ae150,0xb5a50098),LL(0xd64a082c,0x05ed2b30),LL(0xe84702e1,0x4701e013),L_(0xcb1ea5c4),
+ LL(0xa2d01aa4,0x5c0291c5),LL(0x7cbe7024,0x87f294c6),LL(0xdc575065,0xf7c66733),L_(0x66e96e2a), LL(0x236da943,0xb2bb31c0),LL(0xef556ba5,0xefda656e),LL(0x0d4ba22a,0xd90a6c4a),L_(0xe51714f5),
+ LL(0xd7b84537,0x6ae52eb4),LL(0x5303af34,0x4989ea91),LL(0x58155fb2,0x51865588),L_(0xff60915f), LL(0xb2f24a3f,0x4a65a557),LL(0x4126452d,0xc5c558ab),LL(0x39d391fe,0x71637238),L_(0x2d627920),
+ LL(0xc6f1655c,0xda9557a2),LL(0x9f1d5a1c,0xad9724f4),LL(0x02bd8dec,0x286ae065),L_(0xaae19e79), LL(0x66f88629,0x409bbff9),LL(0x02b7c84e,0xa035e3ce),LL(0xfa9ce7d1,0xb11a05b6),L_(0xae613f5a),
+ LL(0x7d3144d8,0xeeb7e587),LL(0x4daf5c9e,0x63105e87),LL(0x24b31279,0x358ad95d),L_(0x7ca7cd50), LL(0x8b96f130,0xa1f8699a),LL(0x885e7bf5,0x36720d2e),LL(0x19da3cf7,0x0c3e259d),L_(0xbb7ab1a9),
+ LL(0x3ebef322,0x18a10476),LL(0xd9293d5e,0x93fc7b17),LL(0x2dd5dfa6,0x453f9b19),L_(0xb064e79e), LL(0x2e375ef2,0xde52e14c),LL(0x6557a54b,0xb86d2dac),LL(0xcdf1057b,0x8978f37a),L_(0x60169743),
+ LL(0x01ae0873,0xf209f351),LL(0xc477ed75,0x1c3d4f63),LL(0xfd2dee37,0x23082359),L_(0x5b85b81c), LL(0x226bc4e5,0xc1dc2c14),LL(0xfac25e9a,0x4a88888c),LL(0xd11ebfc0,0x5bb60dfa),L_(0x6deca182),
+ LL(0x6d7442e7,0x1a37fe3d),LL(0xceca55fd,0x64b6847e),LL(0x54c71408,0x9321abab),L_(0x42538c89), LL(0x8f6064c2,0x0fe08518),LL(0x0baba2f8,0x48846076),LL(0x18d88b42,0x5027824f),L_(0x9fa6cb27),
+ LL(0x2fefa18b,0x0a5f6d1a),LL(0x81d4f0b6,0xaeecb1e3),LL(0xe2cc44ed,0x1a3c357a),L_(0xa72825d3), LL(0xe129986d,0x78fb4e9b),LL(0x872596fe,0x6b166a06),LL(0x1f456692,0x55649b1b),L_(0xff6c52c4),
+ LL(0xbb9f7823,0x0c7e73f7),LL(0x066a275b,0x4c6140bb),LL(0x1d71b6bb,0xc0d4cee9),L_(0x6b9a5b6c), LL(0x8f080a17,0xf403aa8c),LL(0x2c5d59b4,0xb53cebd4),LL(0x45561f5f,0x176891fe),L_(0x7b917d84),
+ LL(0xffa27853,0x4d6d2499),LL(0xc40d40a1,0xb5248259),LL(0x5a3e6570,0xb7125d0c),L_(0x27a24b64), LL(0x37979bfd,0x785afdfc),LL(0x695b2c23,0x1a4c7732),LL(0xe1b6b02f,0xa84e1866),L_(0x09ceeb7b),
+ LL(0x11dbcdce,0x4243fd62),LL(0x68c988bf,0x9892ddcf),LL(0xdc0c4d01,0x5638c3c1),L_(0x8f1f8fc8), LL(0xa42313cf,0xfcf531d5),LL(0x5446a19a,0x1417aa25),LL(0x7e0b8323,0x41b2315e),L_(0x8e4521f0),
+ LL(0xd6c61ac2,0x9d056208),LL(0x63bfbe05,0xa70e6aa2),LL(0x566c60a7,0x483b996a),L_(0x53b69d35), LL(0xa38d32bd,0xc38fefeb),LL(0x27b8ad3b,0x57f15c47),LL(0x689ae7bd,0x3e0d8010),L_(0xfa0d354d),
+ LL(0x2587df15,0x904f01e9),LL(0x815dc8cc,0xbce7f04f),LL(0x88aa4d08,0xd7f1a354),L_(0x4478e55e), LL(0x5bfae678,0x299925d3),LL(0x661104da,0x6a708cd7),LL(0x74d5a757,0x97968c25),L_(0x8a264b4a),
+},
+/* digit=1 base_pwr=2^7 */
+{
+ LL(0xd1a6df99,0x084a7e0f),LL(0xce960ef7,0x0b68659c),LL(0xdf5b6590,0xe1cee8dc),L_(0xbb593215), LL(0xf5210072,0xccbda01d),LL(0xb592eea4,0x4c7a3391),LL(0x01bb7a1c,0xa7484df7),L_(0x4b70313b),
+ LL(0xcb74232c,0xb62e25de),LL(0xb8cba58b,0xc5c8bed0),LL(0xfb8ee6c4,0x4617192d),L_(0x967548ce), LL(0xeaf8b0a4,0xdc2453a5),LL(0x71f81200,0x4d7f2e27),LL(0xf43e697c,0x2e81523e),L_(0x9d94ae94),
+ LL(0x37eb6d85,0x29543b70),LL(0xc7648cad,0xe67d4661),LL(0xbf221e31,0xde581875),L_(0xded3fb1b), LL(0xc3db2400,0x82bba001),LL(0x656ecd6b,0x60a68af1),LL(0x5e5ccc27,0x619f6149),L_(0xa5bb89fa),
+ LL(0xe80619b6,0x25f0799b),LL(0xd58585cc,0xeb6dfe0c),LL(0x9bf5f7d0,0x63a366a0),L_(0xff7302b6), LL(0x927212bf,0x02c160de),LL(0xf4586c45,0x09ea0af5),LL(0xfe05e98d,0xbae9ad71),L_(0xc8fc9d86),
+ LL(0x65b1d33e,0x7f5ed157),LL(0x36faea3e,0x1ed1728d),LL(0x39babd58,0x0137cf58),L_(0x4d9cad56), LL(0x2546cd9c,0xd0dfb090),LL(0x4316891a,0xb59a51ab),LL(0x6476def4,0xc5dce06b),L_(0x7c93323f),
+ LL(0x2313823a,0x80c0cfc1),LL(0x753f5cf1,0x27734f88),LL(0x587454f5,0xb527a9af),L_(0x315583c4), LL(0x049823f3,0x25a1f7dc),LL(0xd3e3e75f,0xb3ea257d),LL(0x1d11fd76,0xafd0ae51),L_(0x1190d505),
+ LL(0xc1bc485d,0x407824fd),LL(0x59b8241e,0xa0e87d81),LL(0x71256aba,0x76217f94),L_(0x64a95b3e), LL(0x8b3e508c,0xe501c9b4),LL(0xfbc90f77,0x08a19d4d),LL(0xfb512fa2,0x59ab4cb8),L_(0xc1d78806),
+ LL(0xe4756697,0xaf2eb7f6),LL(0x05273793,0x5c0e9df7),LL(0xc52db668,0x2b7064bd),L_(0x8eabb5ee), LL(0x43184721,0xd4b9fc59),LL(0x8bf316a9,0x1343040b),LL(0x88ef261a,0xb9864942),L_(0x212e47d7),
+ LL(0x0f601217,0xc3ce93c3),LL(0x1d875805,0x40d758a5),LL(0xc0aa59c7,0x54ae6327),L_(0x7111e036), LL(0x111b9e3d,0x09cd3a96),LL(0xcc42b514,0x6bcd40ee),LL(0xb04993c8,0xbcda6d48),L_(0x620f7a62),
+ LL(0xbabee792,0x030c3495),LL(0x74030e51,0xd426f7b4),LL(0x457bca6d,0x81319526),L_(0xf21490eb), LL(0x2498c159,0x0b2bd04a),LL(0x8221d32e,0x12985a92),LL(0xcff74849,0x837d8e0e),L_(0x2ca32bf2),
+ LL(0x139de2dc,0xf41adf6c),LL(0xef7b6eba,0xb7dc7dc5),LL(0xede2ea87,0x6e2033f0),L_(0x0647be07), LL(0xcd213865,0x287f4ece),LL(0x4d3993a9,0x50f400e9),LL(0x0fc6614f,0x89db6d9e),L_(0x8f95a105),
+ LL(0xc42a6b84,0x9e9a2ddd),LL(0xeeea986a,0xf3f5ab2d),LL(0xabdd54a4,0xc69f9a88),L_(0xb87d1977), LL(0x8affd663,0xb4602516),LL(0xa2399ce4,0xc75f7a3e),LL(0xfbd56bb7,0xe4aa58aa),L_(0xa1149cb4),
+ LL(0xbb083ae4,0x96aff3db),LL(0x896df53d,0x2d9b4c87),LL(0x77208838,0x2b1d390f),L_(0x02221513), LL(0x408ee7f5,0xc9a98c1e),LL(0x3460329f,0xb6789b9e),LL(0xf0a9cf2d,0xcc0aecb1),L_(0x14bf88b6),
+ LL(0xf99e1bc2,0xf9d97ac1),LL(0x32112cbf,0x31242e73),LL(0xe520dfcf,0xba519709),L_(0xb278a649), LL(0xaada88db,0xdf453d98),LL(0x7de50c69,0x48d83f42),LL(0xa35584c3,0x7efe383e),L_(0xafd2f996),
+ LL(0x18351406,0x987fc6a6),LL(0x33c7e3ed,0xf2b213b9),LL(0x17bc0ecf,0xd5c3d1eb),L_(0xe316f3eb), LL(0xc603801d,0x037728cd),LL(0x0890b2c8,0xc5cf397d),LL(0xde6243a1,0xaf004bfd),L_(0xb5bd010e),
+ LL(0x81c21907,0x140e4fb4),LL(0x4a85940e,0xb07d29b4),LL(0x65c368fc,0x6829786b),L_(0x11ef4637), LL(0x7c01e8b8,0x5c2ad4ba),LL(0xd4385c66,0x8b692602),LL(0xca528c39,0x09175739),L_(0x8545624f),
+ LL(0x3e778b36,0x332aa21b),LL(0x69ac9b72,0x7761d7c9),LL(0xf6af5223,0xded7e546),L_(0x2e42f629), LL(0xde909623,0x254a8b2a),LL(0xd20517cf,0x6fa060cc),LL(0x7cccaea0,0x723e3222),L_(0x17b8fcf9),
+ LL(0x00e54d7f,0x80274626),LL(0xc377f0eb,0xf63104d2),LL(0x448cb4f0,0x86f7822c),L_(0x905f1a28), LL(0x635d1d1a,0x74c9d852),LL(0x03d82ded,0x2f27a18d),LL(0xa7638f56,0x7df0f814),L_(0xa98013e6),
+ LL(0xe3919fa2,0x11b8e6be),LL(0x71e986fa,0x2038bc38),LL(0x1a7c24cb,0x547f1d30),L_(0xd082b3c8), LL(0x4937319c,0x14498e9f),LL(0x96e06bdf,0xd9e8ae36),LL(0x71231dd7,0x099cc29c),L_(0x52cc6fea),
+ LL(0xbfa21d6a,0x9934b257),LL(0x1c360412,0x2552b461),LL(0xfad28b1a,0x87244f2d),L_(0xf0f3af7a), LL(0xe091c63c,0x224579d6),LL(0x8b1b9bd5,0x7927774a),LL(0xa4177fae,0x39e5970f),L_(0xfbd55d05),
+ LL(0xf8a953dc,0x00e1559f),LL(0x1dc11998,0xa70e63b9),LL(0xf8851e82,0x48191bdc),L_(0x7132a05f), LL(0x6d398f42,0xc96682f5),LL(0x3029087f,0xc2927516),LL(0xd7d600fe,0x6435359a),L_(0x103c49c9),
+ LL(0x43c60bfa,0xbe98cc32),LL(0xdf3dae98,0xe899fd7e),LL(0x6f6a67d4,0x4805ca93),L_(0xb569900e), LL(0x532ddf8e,0xb5f6725b),LL(0x912c5876,0x9818fcef),LL(0xa6151612,0xa9419c51),L_(0xb659688d),
+ LL(0x544bdd85,0xf568cb9c),LL(0x486d2f59,0xe070e7d2),LL(0xa9680c77,0xf00849de),L_(0xcaecbf55), LL(0xc159fff5,0x9f8b9614),LL(0xff12efb3,0x0503644e),LL(0xf325f0bc,0x58ef4f26),L_(0xc0fb619b),
+ LL(0xbb5a090c,0x2a905098),LL(0x34e237a4,0xeb89d751),LL(0xb46f0674,0xc23b6e08),L_(0xf504a980), LL(0x84d934a6,0x7446341f),LL(0xfe8d0cb7,0x2d200177),LL(0x428fe6ef,0x663531ec),L_(0x82b91738),
+ LL(0xf0622227,0xe7d3d99c),LL(0xea4400e4,0x87323665),LL(0x0421f1d4,0xb81113de),L_(0x3c97ee34), LL(0x121ae441,0x14b9bfe5),LL(0xae37e0d9,0xab8ce456),LL(0xfb0b5381,0xeebf8b75),L_(0xd0e53ea8),
+ LL(0x4ab996fa,0x3bca93de),LL(0x12681ec0,0x9c224825),LL(0x51f0a250,0x4390fa94),L_(0xe12f0e92), LL(0xa17f9bd0,0x87ca94cd),LL(0x707670f5,0x8eb876e3),LL(0x8c10d532,0x6ab8e456),L_(0xad2be3fc),
+ LL(0x00191032,0xbe58c480),LL(0x20928c0f,0xf0df6b45),LL(0x51d6cd1a,0x3a2b0d2e),L_(0xdae2e721), LL(0x6e0dcc33,0x17ad59a0),LL(0x4848071c,0x24ff8cf7),LL(0xb1342fd7,0x514eda6b),L_(0x8d26ef04),
+ LL(0xaede35a9,0x43fadb36),LL(0x00e95336,0xda078971),LL(0x89ff847e,0x757ad40d),L_(0xc2d2fb8d), LL(0x063bed05,0xfbec9b9f),LL(0xc9f9426c,0xa2938400),LL(0xed5c65dd,0xd3c116f5),L_(0xcc982965),
+ LL(0xbf6d76ac,0x4a94b590),LL(0xdd6503fb,0x43e3ebef),LL(0x6d7848f4,0xe0fe0161),L_(0xb547e19d), LL(0x503ad71c,0x14c43727),LL(0xeef3ccce,0xafbcb090),LL(0xbb5f8c82,0x3bf8d893),L_(0x2cff74c5),
+ LL(0xa2d0d278,0xd8be2204),LL(0x0ccdf937,0xc9fa15ec),LL(0xac17e25a,0x91b10a2f),L_(0x61c0b94e), LL(0x12c8ef80,0x087fa01d),LL(0x1b1a2421,0xb6f728bd),LL(0xd198666a,0xcef80aee),L_(0x76851ee8),
+ LL(0x6112903d,0x89add916),LL(0xd329af40,0x1c13960f),LL(0xf15aa481,0x48b52034),L_(0x0726b2a7), LL(0x2d1bf701,0xb5d87e2f),LL(0xb0c178da,0xc7e5ba8c),LL(0x6e4a90fb,0xfd04fbda),L_(0xe99dc375),
+ LL(0xce2f6f2f,0xae50cdc8),LL(0x37383201,0x5c73b50e),LL(0x59a0da00,0x6b833239),L_(0xe9260200), LL(0x54c575fb,0xfdd6dfac),LL(0xea53c24e,0x761a3a3d),LL(0xb3095407,0xca8c1a6e),L_(0x4e4fe43a),
+ LL(0x56e12b9f,0xa3fc4119),LL(0xfb6450ca,0xf5bdb563),LL(0xe34b58ec,0x178622a7),L_(0xd55ba9dd), LL(0x9e9ffc06,0xfbbaa19e),LL(0x1f5955f9,0x42f09c2b),LL(0xb2d6157b,0x0c83351e),L_(0x325e63cd),
+ LL(0x623598c2,0xae4a61b7),LL(0xc98d16f5,0x47014b1b),LL(0xddd6a618,0xc1476c47),L_(0x7f025b55), LL(0x7eb38a44,0x31a26c96),LL(0x374db7ac,0xc5ea2b2a),LL(0xa5a136e8,0x13b6043f),L_(0x43d33d2b),
+ LL(0x07cb2294,0x210180c0),LL(0x173b6efc,0x782987ea),LL(0xab40f28e,0x4a4f4f9e),L_(0xce66440a), LL(0x591b5ef9,0xf6832896),LL(0x49522fda,0x38f56fa2),LL(0x5abb2a56,0x5a65a98b),L_(0x6a059efd),
+ LL(0xca04bf7c,0x022f4557),LL(0x7a97541a,0x657a19e3),LL(0xc772f98c,0xa19ab123),L_(0x0e388f1a), LL(0x82db0ead,0xd6b0ec00),LL(0x312059b5,0xdeadd9cc),LL(0x9dab24ce,0x1c2e2051),L_(0xc5487b00),
+ LL(0x7647407b,0x489801b8),LL(0x05173f8e,0x56034023),LL(0x26d5313c,0x29b7a999),L_(0xf53aa77c), LL(0x6f0fc77d,0xfdc7c2f1),LL(0xe7c7d3e1,0x006982c8),LL(0xcb5af1f9,0x9323d960),L_(0x7cb0661a),
+ LL(0x76954498,0xa4de751e),LL(0xcad7d975,0x6dc87029),LL(0x805eb5f7,0x1cfb5ce3),L_(0x6e5f7742), LL(0x94bbb1b3,0x43b64965),LL(0x3e36f135,0xaf8d3158),LL(0xc4fd0925,0xeb438d66),L_(0x5568e790),
+ LL(0xc7a170c2,0xb2973b56),LL(0x51fcb9a5,0x9e4dbac9),LL(0x2cb87666,0xcf3bacaf),L_(0xf1a40af8), LL(0xa2effdcf,0x20a60ee8),LL(0x47e2556f,0x60509402),LL(0x676121bd,0x745c0ff2),L_(0x1082eb4f),
+ LL(0x3407acc6,0xb6d85b13),LL(0xb4a1c32a,0x7e9049e0),LL(0x9fc877ce,0x64c1005f),L_(0x928ec4e2), LL(0xb606ab7c,0xe272e2ce),LL(0xacbb37ae,0x97ac2d38),LL(0x954f3f1f,0xa0e40e6d),L_(0x1630287d),
+ LL(0xdf2474e8,0x1f05663e),LL(0x7d0f40a6,0x234012a8),LL(0x89989069,0xc2481dbc),L_(0xb865be0e), LL(0xf495b126,0x452948bf),LL(0x27e891c7,0xa43ea9bb),LL(0x280bca9e,0x8a34a29a),L_(0xdb3ca4d6),
+ LL(0xae198472,0x848b5387),LL(0xa735717b,0xcce778e0),LL(0x4288a820,0x34cf4dad),L_(0xdcd93303), LL(0x9e011fee,0x30c9f97b),LL(0x7df2569f,0xcba3ae4d),LL(0xdb99670d,0x1db11c4c),L_(0xac0ab6d0),
+ LL(0x9d825f39,0x2980d39c),LL(0x1edad965,0x5a3ddebc),LL(0x9c96ad62,0x7f86e997),L_(0xa6296b18), LL(0xac938f79,0x7a80b2ac),LL(0x8d1c685b,0xe8b1101a),LL(0x055eb004,0x6c8daec0),L_(0xae9ffa1b),
+ LL(0xcaf9f5b9,0x88ad0652),LL(0x977ba6f8,0x35f6f9f7),LL(0xbced09e3,0x51bdbe8d),L_(0xaf059927), LL(0xd40e66f8,0xa071947a),LL(0xde4b10ab,0x2ee8b51f),LL(0x9757d231,0x4f80de84),L_(0x84da5f77),
+ LL(0xdf7efaf1,0x3121c652),LL(0xbb4de8a3,0xd7749653),LL(0xb988c422,0x493a2d8b),L_(0x7dd3a0cf), LL(0x98e08451,0x2760de2f),LL(0x05ba148d,0xcf07c50e),LL(0xe5f81246,0x1a00e240),L_(0x89c9fdf9),
+ LL(0x9d26d17d,0x89b4fc25),LL(0x35eb5721,0xc765d35e),LL(0x45f96752,0xbfefae3b),L_(0x65d4fcd7), LL(0xf9a4089c,0x22ecc154),LL(0x3b66fffb,0x5053964b),LL(0xdcd4205f,0x1e216001),L_(0x9258ce3b),
+ LL(0x1db56ac0,0x7ae4875c),LL(0xdd9688b4,0x4a976987),LL(0x4fa88f83,0xd67fc048),L_(0xcf37f9f8), LL(0x49b6eedc,0xedcaacaf),LL(0x38ff0886,0xd26b609b),LL(0x29f6f1cc,0xa9ceab78),L_(0x2a5e8359),
+ LL(0xf6f8a0a2,0x95c6ea4c),LL(0x0080fd45,0x61916ad2),LL(0x8497eb60,0xb0ce6cae),L_(0x75ea62e8), LL(0x50c80949,0xa31d0581),LL(0x9b2a0c1a,0x4cec302b),LL(0x0bfcd85b,0x36484967),L_(0xe5f11201),
+ LL(0x6e5e0c26,0x6df2fa39),LL(0x59949304,0x248a89e4),LL(0xdcc52026,0x67b816f2),L_(0xc824943c), LL(0xee7ad3ec,0x5bb4e55c),LL(0xfa312fb7,0xdaa70d9e),LL(0xacc63cd9,0x9155d520),L_(0x42aa4030),
+ LL(0x6abedf03,0x22a83e65),LL(0x2814f9c9,0xb90ac85d),LL(0x088ae4b8,0x65e3e716),L_(0x7975b338), LL(0xf19b0bfc,0xfbebb9d9),LL(0xfd3c7946,0x7355b4aa),LL(0xef331b93,0xfcb3b647),L_(0x9f037b66),
+ LL(0x4e49fdb8,0x76e1b0d3),LL(0xa7cfa8e6,0x94293ef4),LL(0x588501b4,0xd8359bfc),L_(0x50d236b6), LL(0x3cd45f3b,0xee63deea),LL(0x49004988,0x98af1b2e),LL(0xd1f2806f,0x12a331f8),L_(0xe108a9ab),
+ LL(0x3577e68c,0x7e2770f6),LL(0x08275599,0xe8913f4b),LL(0x77ead765,0xe027fdcb),L_(0x2d381d9d), LL(0x9a6f6903,0xf459aa5e),LL(0x38d25f4d,0x24bf5d49),LL(0x130316d1,0xd808c825),L_(0x53bfc24b),
+ LL(0xe048c7d9,0x33437c46),LL(0xce7c4312,0x2ce661a7),LL(0xe77ba9cf,0x46b5165f),L_(0x98d33543), LL(0xaa89fa67,0xd3057aed),LL(0x81116061,0x142332ba),LL(0xb60e8644,0x3eb16842),L_(0x632f4f19),
+ LL(0x35fc5d9c,0x9f0177bd),LL(0x63fb6870,0x63dcb419),LL(0x4fc638bc,0x0d4a9edd),L_(0x5f4b4b0c), LL(0xd3a1ffcb,0x2be34520),LL(0x4dfd2636,0x6ee7420c),LL(0x449c7ffa,0xca54fb79),L_(0x1723c63b),
+ LL(0x447c4951,0x07a8fa48),LL(0x5a4bf1f5,0xfe67f509),LL(0x0d70f3ac,0xdbc48919),L_(0xc6e3be9d), LL(0xc5e2455e,0xc9b41ae6),LL(0x1cb83c2d,0x1f329372),LL(0xaab1f6eb,0xa76cbb84),L_(0x13b46361),
+ LL(0x7f11366d,0xd38d4421),LL(0xd7176b60,0x9815fc31),LL(0x1e6e5fa0,0x42bf5236),L_(0xaf44dc92), LL(0x15c5a009,0x03ac6a2a),LL(0xabc5024d,0x8f3eaace),LL(0x9eb61a43,0x1a7ff3ad),L_(0x67fd7c39),
+ LL(0xf6ee6118,0x4446a48b),LL(0xd5ff7dbe,0x08776dba),LL(0x62dd1551,0x856288fd),L_(0xf3f982ab), LL(0xb1d08623,0x59e29beb),LL(0x6ab6d270,0xca32b4fc),LL(0x1744a1d3,0xad3745b8),L_(0xd398bc25),
+ LL(0x3831190b,0xaaeece81),LL(0x93c12ffb,0xd4655489),LL(0x6dc6a194,0xdbb627e1),L_(0xb1087770), LL(0x91571bcc,0xf5fb9008),LL(0x4ad3caf9,0xf421b41e),LL(0xeaac6d91,0x01604108),L_(0xe70c380f),
+ LL(0xa2f0a872,0x276d7a20),LL(0xdacb5ad6,0xa823fb57),LL(0x507ee8a9,0xe6fef46d),L_(0x8d424c56), LL(0xa385d034,0x2785c811),LL(0x7ba7caa5,0xbcf3686a),LL(0x8ac8344a,0x3bf9ea41),L_(0x63abeaac),
+ LL(0x8075a441,0xfea1ac4e),LL(0x2be4fe2a,0x0fedea77),LL(0xb3c70edf,0x2398f701),L_(0xbafd9f1f), LL(0xbbbf63ac,0x9c1eb75a),LL(0x06bc9e31,0x9c3a2d57),LL(0xee68eb75,0x4d73d0da),L_(0x5c2caf9e),
+ LL(0xe663f1d8,0x31f69d33),LL(0x2870e42c,0x46cf68c3),LL(0xc7fa33cc,0xb4e3665a),L_(0x4310b502), LL(0x48f183b7,0x154b0c79),LL(0x225295c9,0x32607f60),LL(0x1e044a43,0xc1030470),L_(0xf5ab45de),
+ LL(0x25aa9de1,0x88786097),LL(0x8cfe807b,0x045b9699),LL(0x2e64a0a5,0x921c1980),L_(0xaa9a7dc4), LL(0x8b058dee,0xbe46c84c),LL(0x47ac068a,0x5b271860),LL(0xfe16e851,0x48f0acc8),L_(0x76ccb233),
+ LL(0x31bafd7f,0x7c0c6e0d),LL(0xdade195f,0xe2d4fff8),LL(0x2b1da468,0x95ee5ad6),L_(0xee119e9e), LL(0xfebeb585,0x307f35dd),LL(0xbf55c718,0x406d6f39),LL(0xe2245982,0xd6be6d55),L_(0x7d132e1a),
+ LL(0x002c4e28,0x4f02beba),LL(0x8d9e9ed0,0xc26d73f0),LL(0x21de614f,0x38b705d3),L_(0x68620b5e), LL(0x23429db7,0xf4967923),LL(0xb79a106a,0x198f9eec),LL(0x9eb6af93,0x6bb259cc),L_(0xec4f9488),
+},
+/* digit=2 base_pwr=2^14 */
+{
+ LL(0xdcabdf3b,0xd382ee31),LL(0x8d88ff9c,0xeeccf67f),LL(0xe97abee6,0xc6941824),L_(0x90a4b5a6), LL(0x47a31930,0x7f45fc06),LL(0x876a0ffe,0x7b1af995),LL(0x4d9341e8,0x248e916d),L_(0x398b68bc),
+ LL(0x082378c3,0x4bf3bcae),LL(0x8cfd71b3,0x82c65899),LL(0xb15f6e52,0x5919e8e7),L_(0x2217b0ec), LL(0x6c251213,0xce97fdbe),LL(0xd1051883,0xf8d74874),LL(0x1738524d,0x44e69e4f),L_(0x98671ed4),
+ LL(0x54e9eb42,0x1bc6447d),LL(0xcb1bcc20,0x65482174),LL(0x63694975,0x72869bff),L_(0x63c463b1), LL(0xf6aea0ba,0xa70d16cd),LL(0x12e9b82e,0xa212780d),LL(0x14730725,0xdc25b909),L_(0x48e6eff8),
+ LL(0x8d673443,0x01c6af2b),LL(0xce9a229f,0x24e6fbce),LL(0xc6a67d3a,0xbbe5e1ed),L_(0xf65af52d), LL(0x964e75d2,0xb97b0d10),LL(0x8e72295a,0x09007530),LL(0x67a932fe,0xc85f611d),L_(0x7b6da974),
+ LL(0xfaef942d,0xfc2eb46d),LL(0xc735b7a5,0x51096872),LL(0x75df38bf,0x75ab062b),L_(0x82f7953f), LL(0x1f5151d3,0x587ef818),LL(0x723a33d5,0xf3f93876),LL(0x0eae8822,0x5b5cb708),L_(0x97da4376),
+ LL(0x36982471,0x165fe970),LL(0x5a5ca19b,0x2ff27508),LL(0x89cd99ad,0x98c66330),L_(0xd0ea6970), LL(0x0397edc8,0xd2a0cfc6),LL(0x49c7caa4,0x7e36813d),LL(0x722feffe,0x829c6b89),L_(0x3cc14e57),
+ LL(0xe76a6991,0x394ea602),LL(0xb318aa05,0x1348f9f3),LL(0x34e40071,0x3b2e0279),L_(0xa37218ff), LL(0x5da0385d,0x0b77484a),LL(0x487e3215,0xbbb8ff2e),LL(0x7e2ac222,0xf54f007f),L_(0x916f6355),
+ LL(0x306867f1,0x271f814c),LL(0x45d99845,0x455790c2),LL(0x038f4fe6,0x58008770),L_(0x1a0c7df5), LL(0xa3ffa256,0x2ae5134e),LL(0x791baa3a,0xfa061cdf),LL(0x2bb3a978,0xa4fe1b53),L_(0xd5d1144c),
+ LL(0x1840dd40,0x24b14e0e),LL(0x8cc62de0,0xc72a3b9b),LL(0x5ca5c5d6,0x8625f308),L_(0x30593cfa), LL(0x6afba385,0x5e8c195d),LL(0xb4f4df35,0x6bdd2d33),LL(0x0975350a,0xeff53d99),L_(0x20a0786d),
+ LL(0x3fb95973,0xc84c9bda),LL(0xe3fb8d0f,0x172afe39),LL(0xd069e505,0x2d143bfb),L_(0xcaad811f), LL(0xaf5715f5,0x9c2db5f2),LL(0xf0b61247,0x6e7b80b3),LL(0x71ec23d9,0x4f3f9687),L_(0x8dce56a9),
+ LL(0xf5d591b8,0x0c9c04f2),LL(0x4e3ba616,0x6d31163c),LL(0x530f24db,0x66c42b68),L_(0xefcb7af5), LL(0x1378c67f,0x777097e8),LL(0xf5bcc425,0x3f1062b8),LL(0x9ee5175c,0xb09a9492),L_(0x8ba812ad),
+ LL(0x12b71604,0x0ee3063d),LL(0xf5bf2d6e,0x22611499),LL(0x853772f7,0x8f349671),L_(0xdf452ffe), LL(0xdd3b39e2,0x3acb7c05),LL(0xa199b0f1,0x34c3e766),LL(0x9381a0b0,0x74081fec),L_(0x613e10dc),
+ LL(0x49667bc1,0xd57108d0),LL(0x93327b6d,0x6834cfcd),LL(0xf7fb9009,0x9b0baa9c),L_(0x032637ce), LL(0xd797b7f9,0x13c1353f),LL(0x66821e80,0x6f581f7f),LL(0x48a60c42,0x7f9e960b),L_(0xcad0afca),
+ LL(0x474d3704,0xcfd42398),LL(0xd4011a09,0x1c1a54ac),LL(0x3c4fd36b,0xd3eac930),L_(0xffda655a), LL(0x7c4dc3a4,0xdce7096a),LL(0x75a38366,0x732dfde0),LL(0xa1787513,0xe804b476),L_(0x86101a86),
+ LL(0x926b6b5d,0xe5f713d5),LL(0x9c17bdda,0x3d019ddd),LL(0xd52c15ec,0x3e7f7e62),L_(0xfaca5ec2), LL(0x6609394f,0x694f2696),LL(0x283219a8,0x69aa76bd),LL(0x07cee438,0x234e3949),L_(0x77c5f3f2),
+ LL(0x90a49b53,0xf501aeb8),LL(0x8debc123,0xc50fe003),LL(0x8b89e79b,0xa04a6f7a),L_(0x51dcf521), LL(0xff3922de,0xc4ed1911),LL(0xcefa7526,0x0ce76928),LL(0x8af23a3e,0x918974b5),L_(0x3dda3d79),
+ LL(0xdfd72a80,0xdea21ead),LL(0xbaf90df8,0x8e3f7ba6),LL(0x1f678c3b,0x6df4e74e),L_(0xc2ad132e), LL(0xc5a010e7,0xd7eea56a),LL(0x77bf90b7,0x389d8452),LL(0xc6ed7b9d,0x2e489cfc),L_(0xdd237e98),
+ LL(0x914f8bfe,0xbcee9591),LL(0x21b5804c,0x7fab5561),LL(0xec5af129,0xd4d265a9),L_(0x7f0919d3), LL(0xc74bfc94,0xd2bab14c),LL(0x1a3e2e12,0xe6b2e9c5),LL(0x77d00d82,0x161eafab),L_(0xccd81779),
+ LL(0x8fb0ef8d,0x5b2aa48c),LL(0x43630c37,0xe9937cc2),LL(0x00ef4c97,0xb862b86d),L_(0x1ec65b9f), LL(0x97617d09,0xfe0c2928),LL(0x92157b61,0xce44e423),LL(0x625a38ef,0x8594c3af),L_(0xbd404f57),
+ LL(0x1b735669,0xbbf9ef82),LL(0x29fe66b9,0x754e211b),LL(0xf058688a,0x95864d69),L_(0xdc64d0f5), LL(0x8beee137,0x9150359b),LL(0x0d596fec,0x0ab949fd),LL(0x3f4ac39d,0xf6d5f8ee),L_(0xc65ea695),
+ LL(0x4aaed3cc,0xb594cda0),LL(0xea397e70,0x0216bf13),LL(0x9e271d0d,0x7efe2b03),L_(0x52fa9e75), LL(0x6a084fdd,0x824376da),LL(0x369bd28d,0x6acd2b86),LL(0x2deabee7,0x55b4713a),L_(0x9706afcf),
+ LL(0x9b5408d2,0x5ffa275a),LL(0xce057f13,0xfa6d3b63),LL(0x3f3eff6d,0x5bf0abda),L_(0x82fe66a1), LL(0x97b2723a,0xcf4c8232),LL(0x364b69c3,0x170c8de3),LL(0x047d7294,0x43f7fc78),L_(0xec58892f),
+ LL(0x0b00d0be,0x4d42a1fe),LL(0x3e6453fd,0xc3907782),LL(0xd65498ad,0x716502c0),L_(0x548685f9), LL(0xaa83d0aa,0xd8e4c681),LL(0x30dc30bb,0xb2730e91),LL(0x3b7c8d6f,0xc3d966b3),L_(0x7eb48e5c),
+ LL(0xfee9984a,0x2e099be3),LL(0x6964c934,0x5f8e6df6),LL(0x31915ae6,0x2ba98b17),L_(0x72598e4b), LL(0xe2f20ab1,0x791aa104),LL(0xe9c53c90,0x2ae23400),LL(0x5c5045ab,0xd646c528),L_(0xf2a49004),
+ LL(0x50b8339b,0x2874cd90),LL(0x98df361f,0xcb1961a6),LL(0x221ee1b5,0x43f06891),L_(0x6cf88e87), LL(0xf9998039,0xeac42395),LL(0xe0ee202c,0x042a0af4),LL(0x36489fc2,0x5fdad7bc),L_(0xf5be5517),
+ LL(0x9f01cd49,0xc0ba445f),LL(0x657c4ee9,0x3e5d8712),LL(0xc6107ee1,0xecfad04a),L_(0xc3a9ecc3), LL(0x45f63660,0xeda195e8),LL(0xfd5f4e28,0x2f2caf70),LL(0x4fc9d505,0x0c644ae1),L_(0x49b7af65),
+ LL(0xbc63e79a,0x658bc0b0),LL(0x98214b9e,0x2713db76),LL(0xabf827dd,0x12824e7f),L_(0xaef5577f), LL(0xb2616195,0xfcdeef4c),LL(0x532de453,0x3fa68909),LL(0xe9395e01,0x42dfc220),L_(0xa3cf44a0),
+ LL(0xe6bee7b9,0xb1959a03),LL(0xc236089e,0x9b779900),LL(0xe7e57056,0x1c2d553f),L_(0x6e0825c3), LL(0x47995b49,0xab4d653f),LL(0x07e36ef2,0xf8e40f18),LL(0xb70d2132,0xbaae5b9b),L_(0x6545595f),
+ LL(0x325e475c,0x8ad5b01f),LL(0x55e3fd67,0x8fb55f0b),LL(0xa691b273,0xee832613),L_(0x372805fc), LL(0xb146b4e4,0x748d793c),LL(0xbb8942e4,0x2911a866),LL(0xdb940971,0x24df2ed3),L_(0xc58ee255),
+ LL(0x25961d65,0x87754320),LL(0xcf82c1fd,0x15d5a2fe),LL(0xee280f81,0xfc4877e3),L_(0xf4f8e2e1), LL(0xd08afabe,0x8dd2825d),LL(0xe83d6d87,0xa36fe3f1),LL(0x20840934,0x398c3272),L_(0xe0445764),
+ LL(0x51502993,0x5f9bec8a),LL(0x2f38e2ec,0x878f852f),LL(0xbcaa2cbf,0xe99dba0e),L_(0xec7f9cc7), LL(0x7a185dc4,0x7f95d77f),LL(0x0cb71b4c,0x3f419246),LL(0x2b04f2d5,0x7b04c078),L_(0x21ee7511),
+ LL(0x597ba0a9,0x0eb981ea),LL(0xc63bbafb,0xe6e2623f),LL(0xbfc4dac6,0x35dd20af),L_(0xf02694cb), LL(0xe7b40564,0x8d381cfb),LL(0xb6c06c63,0x4013b9eb),LL(0x354e81ee,0x50a8d84c),L_(0x9e8bae79),
+ LL(0xccc6dc57,0xe6735e77),LL(0xf38bca55,0x629efebe),LL(0x2ffffa9f,0xc520680b),L_(0xf670ee6a), LL(0x732a53db,0x4d7d1ede),LL(0x920d6d5f,0xa1f8c1a4),LL(0x3dffe6e5,0xc519ac0b),L_(0x927ed8ff),
+ LL(0xaef46031,0xdd8a57c6),LL(0x3e80aad3,0xb0540672),LL(0x8ef45968,0x7dc6abd9),L_(0x350f562a), LL(0x5aafa6a4,0x60865fae),LL(0x9a3d30f8,0x9c28ce9f),LL(0xd3cb6b76,0xbbb47176),L_(0xcc25a2e4),
+ LL(0xfe93910d,0x86c3c000),LL(0x6c40ba85,0xe4bdec34),LL(0xa7194bcc,0x308782a6),L_(0x6cf8fd8c), LL(0x710f1669,0x1c395e5f),LL(0x5062f94e,0x2f41d5d8),LL(0xe7981956,0x53f886b7),L_(0x9bf4dd57),
+ LL(0x6d08786f,0x2cc15260),LL(0xf3a184c4,0x84169281),LL(0xa53ab3f4,0x49111025),L_(0x98552ba1), LL(0x8db73cd0,0x49ee5fc0),LL(0x200da23c,0xeb0a609a),LL(0x26497f34,0x752e2221),L_(0x8eb5b297),
+ LL(0x23ccf8a8,0xb6e96781),LL(0x4941507a,0x183ac489),LL(0x907018f8,0xf0ef92fc),L_(0x43e3f1dc), LL(0xac3eb093,0x63c56eb0),LL(0x2b3e238d,0xf8deac28),LL(0x95f55a52,0x5ae62b60),L_(0x3671e27c),
+ LL(0x8575f397,0x643e6356),LL(0x1662edea,0x3b84d8ca),LL(0x87159fb6,0xb1bb3787),L_(0x5efe452b), LL(0x04257ae6,0x76cc23a1),LL(0xb2b2c1b3,0xf70dd339),LL(0xd9298acd,0x91c26db4),L_(0x146fe566),
+ LL(0xac24fa29,0xa4b011f9),LL(0x59f4d702,0x77f2a9a2),LL(0x897d9044,0x0ed14d52),L_(0x4303ea08), LL(0xa6397973,0xe2308c70),LL(0xa55b4023,0x72030316),LL(0x664a26ca,0x291e9903),L_(0x1def6c61),
+ LL(0xd3c9cb6b,0x38755541),LL(0xe7d9324b,0x4ad0effa),LL(0x5c237f2b,0x75646bb1),L_(0x298572b4), LL(0xa07ca1d4,0x7f647322),LL(0xdc1aadce,0xe24ec66c),LL(0x819d18b8,0x95c255a0),L_(0xe3f3efff),
+ LL(0x82098650,0xddb2d835),LL(0x7218b180,0x41d055f3),LL(0x92d42e0f,0xe2f17df9),L_(0x2b71d06b), LL(0xc2c8d2a7,0x061a667a),LL(0xabfafbb4,0xcc790c1c),LL(0x0eb1df27,0x6dc9536e),L_(0x250d65a7),
+ LL(0xf7ca40a0,0x55a94793),LL(0xe5044ae1,0x6bbc768a),LL(0x1ef210b3,0x166d8931),L_(0xa28dae32), LL(0xa0bcf015,0x621f63a2),LL(0xcd66892d,0xf790fc9c),LL(0x60203dd4,0x667b1fa7),L_(0xdb4559a6),
+ LL(0x2884e5db,0xc59a883c),LL(0xb096e972,0x47f89d64),LL(0x780aeefd,0xd528d23d),L_(0x8809b35e), LL(0x9052392a,0x6e9ee32f),LL(0x3da64ad7,0xb5fe2f01),LL(0x1d21d327,0x2883e925),L_(0x66ba0553),
+ LL(0x8d7cbdb7,0x32e5cd9d),LL(0xefaa43d2,0x2385860e),LL(0x43f0f911,0x4b6038f7),L_(0x3c00934e), LL(0x8ece6e05,0x40da7078),LL(0x76e3e8ff,0xa20a6649),LL(0x1a09dbaf,0x709cfd74),L_(0x1f695127),
+ LL(0xa2ce00d9,0xa63a8b02),LL(0xa213f1e6,0x35cb5edd),LL(0x706b0821,0x4173e4a2),L_(0xb5a5074f), LL(0xaae1c287,0xaa0caca3),LL(0x36399f11,0x3c3b3e24),LL(0x34698533,0xe3b66255),L_(0x8ba6b5aa),
+ LL(0x4bf57c52,0x164519e7),LL(0x3666d383,0xb55fe2b9),LL(0xd37e29a7,0x68e8549f),L_(0x34e4d0d6), LL(0x9f4b4c9a,0x8f691f6b),LL(0xf4164295,0xa382964d),LL(0x49524978,0x7d3fe7f2),L_(0x64f14bbf),
+ LL(0xb90d4bd5,0x087b646e),LL(0xe6a8abf6,0x53865f42),LL(0x2d659d4e,0xb9db500d),L_(0xc5eb1e84), LL(0x17597d7b,0x6ae5d43e),LL(0x8df2f6d4,0x3a5e9fe1),LL(0x4204e314,0xd91a271a),L_(0x236e44d2),
+ LL(0xcfce86ab,0x16c2854c),LL(0x10d4f976,0x3999a9a1),LL(0x5fd18a95,0xa1e55106),L_(0x40835bcf), LL(0xd7192595,0x7c17c721),LL(0x8a484397,0xf6856acd),LL(0xdb82b841,0x39017815),L_(0x2d60844b),
+ LL(0xf155113e,0xc2b2be30),LL(0xf31e524e,0x1e571838),LL(0xa98b5f59,0x17a7266e),L_(0x169ce88d), LL(0x02e9f20b,0x9c53a705),LL(0x47373259,0x476b9b10),LL(0x144091ad,0x98e56e88),L_(0x2198d3c0),
+ LL(0x02f6a9c7,0x461d2e37),LL(0xb1b023de,0x6fe1c2f8),LL(0x8835c958,0xaae29f67),L_(0xb8b906ea), LL(0x1573f8b1,0x2aae0885),LL(0x2db13030,0xc9a1230d),LL(0x930776e9,0xd3f32fd7),L_(0x55a855db),
+ LL(0xdbf89587,0xfeac4726),LL(0x4978e226,0xe907285f),LL(0x084c5773,0xc72ade03),L_(0x25c0e8f3), LL(0x155c7e91,0xe4fb90c2),LL(0x804fb7e0,0x833af299),LL(0x87b3ac91,0xeeb712d2),L_(0xd0aa3910),
+ LL(0x08fa5176,0xad400dee),LL(0x04db731c,0xdb50d10c),LL(0x8bbf71ad,0x1322cb4e),L_(0xe4d0dedd), LL(0xb7ef36d3,0xa5571f80),LL(0x8b5c198d,0x938aa53f),LL(0x6a106d1c,0xfee7b99f),L_(0xc1056e3d),
+ LL(0x0d738fbe,0x9340ad37),LL(0xbe6493b7,0x923ef854),LL(0x1a934a84,0xdc9bcb14),L_(0x38e82bd2), LL(0x3ed1d410,0x3e3d69c5),LL(0x2651cbf9,0x8cf302d1),LL(0x60492caf,0xee0ad716),L_(0x0f316e4d),
+ LL(0x310d3207,0xc40b6b35),LL(0x61d744ad,0xf6b370b9),LL(0xcf2da667,0x4a7e6061),L_(0x06067357), LL(0xd8d48241,0x186ae81f),LL(0x579e8d1a,0x2133c197),LL(0xa42e3f3d,0xf8b9b6ca),L_(0xa88cfea9),
+ LL(0x9ac56b2b,0x55759656),LL(0xae1ee373,0xd47c70af),LL(0x0f258220,0x06bffc7e),L_(0xe45fbdcd), LL(0x453179da,0x92ffe53d),LL(0x14a22c11,0x2ac0af28),LL(0xb924dbee,0x7afd903c),L_(0x16b2256c),
+ LL(0x7d2123b4,0x61435520),LL(0x99b497e3,0x2b094144),LL(0xeb4a95b5,0x09b8c6a3),L_(0x83a43e9d), LL(0x54e52455,0x646b89b4),LL(0xa8391c1c,0x2640a632),LL(0x17b930ad,0xa457233d),L_(0xc396f0d7),
+ LL(0xbfa90c2c,0xfad26494),LL(0xa527afca,0xbfe60268),LL(0xcd907456,0xb3e48eca),L_(0xfa048d0a), LL(0xdf9ab845,0x94fe7551),LL(0x9a3b8a36,0x8ed01907),LL(0x5a97c45a,0x5dbf5641),L_(0x9c8b0d43),
+ LL(0x9dc2ad9a,0xe9019e0a),LL(0x0599e3f2,0x588acbee),LL(0xfff03f99,0xc48117a2),L_(0x5ebb6635), LL(0x6e713363,0x59d13072),LL(0x42329388,0xc63c7628),LL(0xefa02cb7,0x39d7f934),L_(0xb944b464),
+ LL(0x5f6d09bb,0x2361ada1),LL(0xfbd96586,0x5419445d),LL(0x6f750612,0xa30fa392),L_(0x9628fd28), LL(0xd59c34bd,0x32785073),LL(0x45fc9890,0x72c99605),LL(0xb431b539,0xeec4de29),L_(0x30b9fd98),
+ LL(0x97507c27,0x0c5debbb),LL(0x9bcaab04,0x3c42310d),LL(0xa01f4d9e,0x5fdffd07),L_(0x3c6028a2), LL(0x5e2bab3f,0x4ce43e20),LL(0x5cbd1742,0xe71cd8a2),LL(0x0c4858ed,0x8bd12b19),L_(0x2e0122ff),
+ LL(0xb6380f04,0x59339488),LL(0x3572c4ae,0x920e2111),LL(0x0fbdd870,0xcf927c12),L_(0x44d377fb), LL(0x4ea01a51,0x20ee4123),LL(0xd8592d08,0xeeedf23a),LL(0x65fa7940,0x82b08346),L_(0x605e1aba),
+ LL(0x34651056,0x1098cb76),LL(0x90c069b0,0xd6a624c1),LL(0x5fd458b6,0xb856ae59),L_(0x95dd191d), LL(0xd687ba3e,0x33a82abc),LL(0xd59abb2e,0xa949d734),LL(0x1de89776,0xc44fd2cc),L_(0x93c93519),
+ LL(0xc54039f8,0x1ad9c99d),LL(0xcf76892e,0xa0ae59e5),LL(0x5269a308,0x65e4eb8f),L_(0xdc31876c), LL(0xe212c371,0x2c3e1f0e),LL(0x2e889354,0x8869d4e8),LL(0xc88e85fd,0xbc2a9592),L_(0x9c6eb56e),
+ LL(0x0f4e6e43,0x2bfeb37b),LL(0x46cf4463,0x6bb45b1a),LL(0x53c918ad,0xb8bd0546),L_(0xf78b526a), LL(0x0e33f7bd,0x9e58beb5),LL(0x55fd6204,0x26578e47),LL(0x986f5206,0x90135d8a),L_(0x02f82c46),
+},
+/* digit=3 base_pwr=2^21 */
+{
+ LL(0x4190a604,0xec5c8b6b),LL(0xaee61346,0x8bca6d9b),LL(0xba9eddb4,0x3ebc0dcc),L_(0xf76451ad), LL(0xa709d0a1,0xc3d3be2f),LL(0x369d1d0a,0xdae0ded6),LL(0xf474acd5,0x965b8988),L_(0x6aaa8ce1),
+ LL(0xfb05e5ed,0x7df5ec60),LL(0x04a47fd1,0x2d8170fd),LL(0xd08f651c,0xe08fb325),L_(0x56ea78b7), LL(0xa2b2a174,0x20fa30ea),LL(0x02c33226,0xd169c10d),LL(0xc7e20c19,0x366327ee),L_(0xe33001fc),
+ LL(0xf62aa1be,0xe359773b),LL(0x95f962ee,0x2b782c07),LL(0x31df9439,0x80e166af),L_(0xa27a128a), LL(0xa7a7bd41,0x50ca47c9),LL(0xfce8c109,0x8ed45ebd),LL(0x4a7eebb4,0x03e9fc9d),L_(0x98c4b4f9),
+ LL(0xaba113fd,0x0e6fb34d),LL(0xf4000e17,0xe2da2a96),LL(0x491a39ca,0x54e2ec96),L_(0xcc021cc8), LL(0x3d0946da,0x6f792b36),LL(0x90fd2002,0xd78ca8ec),LL(0x13094248,0x286898ab),L_(0x477c2d6f),
+ LL(0xb354ae4d,0xf18c6f77),LL(0xb0291000,0xf6851269),LL(0x7bd039dc,0xfb3809c0),L_(0xf376bad9), LL(0xc99f8945,0x7c71a341),LL(0xf1d99065,0x21f4ed21),LL(0x4c371e86,0xa650cd97),L_(0x1713e005),
+ LL(0x8e7cfcb1,0xfcae4f5c),LL(0x4c95ab42,0x62196ce2),LL(0xc9a4fa0c,0x83e1de7b),L_(0x9ba799ce), LL(0x8f0bc09b,0xfa78f5d2),LL(0x66a4ac75,0xda32a5ed),LL(0x23d217eb,0xf8df814e),L_(0xb78e1f71),
+ LL(0x80a1f117,0x670e56db),LL(0xfafc5e68,0xd1c521aa),LL(0xcaa4c48a,0x41b37b7f),L_(0x1023ff48), LL(0xf6421dcf,0xafa1a3e7),LL(0x6e8a0024,0x5c6bc442),LL(0xbc2935cf,0xbe169cc3),L_(0x21e4c2e0),
+ LL(0xe587615a,0x308bf446),LL(0x71fb47df,0x8047e56a),LL(0xdb6a36f6,0xe8293346),L_(0x5a6836ba), LL(0x93a30fbe,0xcd2f5b41),LL(0x8ffe1e43,0x0b7b259f),LL(0x3d9fe740,0xaafd7816),L_(0xae0c0484),
+ LL(0xc167cd8e,0x0d3f30f7),LL(0xed56f42b,0x3b140b83),LL(0x6554fb45,0xc105ccc8),L_(0x1a608916), LL(0x69c72228,0xf0450467),LL(0x7e79aa99,0x88e4350a),LL(0x1e0bbd29,0x6f9f2dff),L_(0x8d2ecd98),
+ LL(0x1e9d015f,0xf4db6e3d),LL(0xc9229b44,0x60df1944),LL(0x91e766b6,0x2499a2cf),L_(0x714cb7d4), LL(0x0468acbf,0x7a3c83da),LL(0x84752dd2,0xfeedfeca),LL(0x95c8fd77,0x9f35aedd),L_(0x1a75bcf8),
+ LL(0x1d85a175,0xefd882f6),LL(0x0c28af72,0xfcbc0529),LL(0xff17a943,0x6d3cb4e6),L_(0x20b4e7ca), LL(0x1d223312,0x680691e3),LL(0xe8dd8d7e,0x2d7d7412),LL(0x3d6056c3,0xf379f1df),L_(0x82422458),
+ LL(0x5a2e3386,0x66a60d5f),LL(0x1f8d438d,0x08231783),LL(0x2621fe6f,0x282e92dc),L_(0x8a0f2c3d), LL(0xa53267dd,0x48813229),LL(0xc6a7def2,0x18f63ff8),LL(0x25a10917,0x06fdd515),L_(0x641475d3),
+ LL(0x866c8a6d,0xb47ff8e8),LL(0xbec1f669,0x360eff22),LL(0x64925640,0x392f59d5),L_(0x2adaf8c7), LL(0x18c35e30,0xe8c753dd),LL(0xb77a997d,0xeef6fc00),LL(0xdf425955,0x3afc5278),L_(0xa7269ca7),
+ LL(0xedc68cb8,0x69d044d7),LL(0x9eea78e2,0xb3b58151),LL(0x8eb64dda,0x49c378c0),L_(0x9a66415d), LL(0xaf6b16d7,0x47e931cc),LL(0xb92a119a,0xcb7189bc),LL(0xa9051236,0x2aca5249),L_(0x035313dd),
+ LL(0xad339987,0x9bcc65a5),LL(0x9643d751,0x278964b2),LL(0x7810f1da,0xf8f2be96),L_(0x4bddc049), LL(0x7e983037,0x59fa9f23),LL(0x1f58def7,0xbc86f69d),LL(0x918a9c4a,0xb726eddd),L_(0xdda12d3a),
+ LL(0xac70d024,0xe4e20984),LL(0x4a8195f8,0x0ffac935),LL(0xcce8d103,0x6efdaa99),L_(0x354553cc), LL(0xea3876da,0xa0b5e29a),LL(0xe8f12ba7,0x65ae7e77),LL(0x9fa645d3,0x93cb4927),L_(0x2a27d9c3),
+ LL(0xac6cb27c,0x414e945f),LL(0xbed08489,0x73d9e98d),LL(0x4809a03f,0x2d14c85e),L_(0xf63371a1), LL(0x0b05bc28,0x74a3b39b),LL(0x023622e6,0x003b8462),LL(0xed2336e3,0xc6f085ad),L_(0x40dec42a),
+ LL(0xd9687e2f,0xd82a965c),LL(0xb6bcd68a,0x088401a5),LL(0x068fa075,0x07ba4f19),L_(0xc382c95f), LL(0xf91cec30,0xb6cda991),LL(0xc0579f61,0xa7b1febd),LL(0x50d069b1,0x5d3d8cd6),L_(0xf0f3759a),
+ LL(0xf8949e75,0x5c71b954),LL(0xcebf4040,0x28006acb),LL(0x6ba62a11,0xe08cb4da),L_(0xef9d9258), LL(0xc4d932f2,0x9059e525),LL(0x9950d8ec,0x72f4258d),LL(0x4cc4c854,0x0a971745),L_(0x1734dd44),
+ LL(0xdaf48ca3,0xa543ba94),LL(0xfd2fecf6,0xd71707e4),LL(0x809ef386,0xe30d9ba3),L_(0xe5349c3f), LL(0x69eeeae5,0x6910f9ee),LL(0xfcbbeb95,0xe8c90ba5),LL(0x1896385f,0x12c1a610),L_(0xedaaa3d5),
+ LL(0x2d268c8c,0xd0a57e22),LL(0x90fb174f,0x907afb7b),LL(0x927d9d98,0x4fb8839b),L_(0x60a57b93), LL(0x967900e3,0xa9ff207a),LL(0xb6defcc2,0xee9dbe18),LL(0x1bad27e2,0x37d4f91b),L_(0xababf8bf),
+ LL(0x6069565c,0x7e61e032),LL(0x6cf9006f,0x1034f977),LL(0xa6921003,0xf41e571f),L_(0x2a44d157), LL(0xeaa8bfa6,0x77a67171),LL(0x3fd9dd59,0xf9f34af4),LL(0xa78106eb,0x7aed89ac),L_(0xa742544d),
+ LL(0x8c1c931e,0x2befbabd),LL(0xf8ee2ba0,0x7e64aafd),LL(0xb97c5d4d,0xf99509a4),L_(0x621a29df), LL(0x7372eddd,0x47ce48d3),LL(0x35978129,0x28b7f368),LL(0x1fd874f8,0xfdab8a95),L_(0xef2a56ad),
+ LL(0x7f6337cf,0xe5943606),LL(0x03a9d402,0x21b5b09f),LL(0xa28353d5,0x917b4519),L_(0x77945c21), LL(0xfd5ad005,0x73dbf462),LL(0x9833b4c9,0x7f25c9d4),LL(0x3b50b66b,0x35b3bf78),L_(0x2effa35c),
+ LL(0x4b668d6c,0xbe5e047a),LL(0x70ba7d5a,0x2bc0144b),LL(0xee508f32,0x9d2116d4),L_(0x64d1a213), LL(0x5d9a5638,0x8ab6e9cc),LL(0x4c4e14fc,0x954172ff),LL(0x7ca23907,0x9fe1053c),L_(0x8104e1b1),
+ LL(0x711be7f9,0x4c525b55),LL(0x5f99b985,0xac72c62e),LL(0x962efa73,0x92c58056),L_(0xf4fbd970), LL(0xa38c53ee,0x917ebbe6),LL(0xbab078e6,0x6ab0ae35),LL(0x25682606,0x0603c2dc),L_(0x17325a00),
+ LL(0xb1a2e954,0x22b420c7),LL(0xd56f6402,0xffe309b5),LL(0xda6ba55a,0xdce7859f),L_(0x2da047de), LL(0x96d10a76,0x057f1caa),LL(0x6e8c3c16,0x72ae9f6f),LL(0x8794d9eb,0xab64c20f),L_(0x63b937d3),
+ LL(0xb289f4d8,0xd9e2a94a),LL(0x0f4cb441,0x4c9fd385),LL(0xecfdb1d1,0x0675dcf1),L_(0x03f2ed02), LL(0xaccd6ef2,0xfad7706e),LL(0xfcfca764,0x0667c6b2),LL(0x7a5f797a,0x2207359c),L_(0x5a7fb514),
+ LL(0xf3f519e3,0x06628ac7),LL(0x0a0ab6cc,0xe38c99a2),LL(0x86774ade,0x8f775fea),L_(0xfc59c719), LL(0x1bf25ffd,0xf9325842),LL(0xb246d04d,0x34f4502c),LL(0xabcab086,0x064e829c),L_(0x1a866a52),
+ LL(0x5fefab0c,0x06295d26),LL(0x523fd3f9,0x234674d7),LL(0x9c70b1f8,0x01e05c18),L_(0xd80fb580), LL(0x352749e3,0xee248ea9),LL(0xe2fc4a35,0x3b3c0b4b),LL(0x7556a699,0x4df0080e),L_(0xb60da54c),
+ LL(0xc8a345b2,0xaf868ebc),LL(0xaaab8ef9,0x9a7fcfbb),LL(0x959c94fa,0xea271ece),L_(0x14c6b171), LL(0x1ea91da9,0x252b7410),LL(0xb76f94ce,0x560e8134),LL(0x8ada4812,0x4d0eaa23),L_(0x48d2e1e9),
+ LL(0x11e78f97,0x55ff3762),LL(0x52966809,0xa90b8b11),LL(0xb557ab25,0x98bfd175),L_(0x7a838285), LL(0x453f5ec1,0xbd8cc123),LL(0xb8541423,0xe53f50d0),LL(0xaf6d61de,0xb809c27b),L_(0xbc9d881b),
+ LL(0x22d1e308,0xcafcf6b1),LL(0x3494f12d,0xb5d40ef0),LL(0x602ae873,0xb5bef707),L_(0x8f093526), LL(0x47aa28a1,0xc7e7a44e),LL(0x363aec6d,0x9f424f8c),LL(0x39a88470,0x08171c6a),L_(0xc8475406),
+ LL(0xd43ff3e7,0x5bfd96fc),LL(0x35837bfc,0xa9d5f891),LL(0xeb92efe6,0x5ac4853d),L_(0x7f7ee96f), LL(0x90443656,0xe8ead180),LL(0xd124bb70,0x84a289e4),LL(0x98bbea4f,0x8bd0878a),L_(0xe0a10a80),
+ LL(0xd233645b,0x2cec3fe7),LL(0xc6b4e341,0xc6974f7f),LL(0xc7a73902,0x0b481a08),L_(0x8fcafe71), LL(0x9eb32486,0x9b2ec275),LL(0xb1171362,0xdb3bea45),LL(0x0653d374,0xab7f0ce3),L_(0x652219fa),
+ LL(0x89e007fe,0xa77a41f1),LL(0x14cba611,0x6059351c),LL(0xed2ec819,0x02bfa9e8),L_(0x1e353c31), LL(0xa9065e32,0xd4e23efc),LL(0x243c2ec7,0x9c16b8bc),LL(0x465d2c9d,0xa1b1cda1),L_(0x45e1763a),
+ LL(0x54df839e,0xb93666fd),LL(0x5820d4be,0x1fed47ac),LL(0x7e8268de,0xbda2efca),L_(0x61307a90), LL(0x428af14d,0x9ee2b07c),LL(0x72170b4f,0xda44c29e),LL(0xfffd22e4,0x296f1761),L_(0xa25a8bfc),
+ LL(0xb42b17e3,0x6d4c5ddd),LL(0x83cf7f8a,0xabe94b27),LL(0x89be3310,0xde98e510),L_(0x6e879f48), LL(0x9d4ca35f,0x96df2661),LL(0x45c77761,0xb28f2b85),LL(0x96395d9e,0xc8d9fdcf),L_(0xcb9113a6),
+ LL(0xdbc075c4,0x54d26d6d),LL(0x6dd2d9b4,0x23c171f1),LL(0xca47c96b,0xecedbb06),L_(0xfce5ed3b), LL(0x31539157,0xe9bac065),LL(0x43e31db0,0x552f0920),LL(0xef1cbf3a,0x2cb42440),L_(0x73830d80),
+ LL(0xed539df2,0xd5c7355c),LL(0x11447b1e,0x5ced43ea),LL(0x10d60144,0x9618c03b),L_(0x6045d427), LL(0x8b9bcb4b,0xe3767fbb),LL(0x4785c2ae,0x2a5c6f77),LL(0x8a009344,0xa23cb6b8),L_(0xaa1eaa93),
+ LL(0xfd4a0f5a,0x7ea78a85),LL(0x5acc9416,0x258d360d),LL(0x951a2674,0x7b3935b0),L_(0xf2465f38), LL(0x75e447f1,0x80a9bfbf),LL(0x13abd588,0x8cd933d2),LL(0x1c914702,0x8da2914d),L_(0xb5dceca9),
+ LL(0xbb8f1e8f,0xbb61ba00),LL(0x68589fbd,0x018ee54b),LL(0xf3ed084b,0x9b33e2c5),L_(0x4187a448), LL(0x90c49202,0xdac991d0),LL(0x0adfa0ba,0x06286fbc),LL(0xfa92d2f7,0x8e51716d),L_(0x869552ad),
+ LL(0xcd0c67a8,0xe3fcc974),LL(0x1fe4efe6,0x4936eae1),LL(0x38aec941,0x49b20db5),L_(0x31b2e360), LL(0x8806a868,0xfd73d3b4),LL(0xf81a57a6,0x8553e67e),LL(0xbb731824,0x5f399b3f),L_(0x063ed190),
+ LL(0x04dbb079,0xd2ce86a5),LL(0x396d5523,0x636ee6c6),LL(0x5c029f32,0x90ef1fcb),L_(0x8504873f), LL(0x05c18efc,0x812addf4),LL(0x2fdbed7c,0xdf2ff660),LL(0x34c03bb8,0xb1740945),L_(0x56f08b04),
+ LL(0x18fd7ff8,0x8a416ad5),LL(0xefbbc814,0xb7d2ecb7),LL(0x8226e0af,0xbb5fb220),L_(0x9bdeb90c), LL(0xcaee42bc,0xb76b0d06),LL(0x184432d2,0x31322587),LL(0x678f208f,0xa07b89ea),L_(0x829d1d5b),
+ LL(0x5899ed85,0x45083585),LL(0x2e43b3ad,0x7217b173),LL(0x04f9e7f1,0x59198da1),L_(0x2293f74e), LL(0x11d6cf0f,0x908d5768),LL(0x06e9468f,0x51f15b45),LL(0x7dd32a0d,0x58045077),L_(0xa2294102),
+ LL(0x885c6637,0xf7bef8ba),LL(0x74d38792,0x478b8ac8),LL(0x58aa9fce,0x9d21686d),L_(0x503a4ce7), LL(0x541006e4,0xdfc86dcf),LL(0xc2238c04,0xe98f7f2c),LL(0x73e745a7,0xfc620932),L_(0x1dcc2ceb),
+ LL(0xd49816e3,0x68c388d9),LL(0x697ef53b,0x741de91e),LL(0x3b976a04,0xf24259fb),L_(0x4259cf50), LL(0xcbbf2685,0x56659522),LL(0xe4e3f7fe,0xea31954d),LL(0x43c8b17e,0x3d1de35f),L_(0xa56dc0b1),
+ LL(0xddd685db,0xa178f2e3),LL(0xf8a89c1c,0x859daa45),LL(0xc3965546,0x65f74f36),L_(0xef984d98), LL(0x31952a51,0xd0b694c6),LL(0x6a5e5ad0,0x4f51b3a2),LL(0x20b2748b,0x54b61458),L_(0xc1437804),
+ LL(0x91be987f,0x92390774),LL(0x9816ace7,0x31cf372f),LL(0xd8dc53f9,0x490c450f),L_(0xbaf48158), LL(0x604fd793,0xb689243f),LL(0x86f30400,0xb2d8f482),LL(0xdc31ef3b,0x506dd3c6),L_(0x1b18f132),
+ LL(0x1196c48d,0x6755b53e),LL(0xe39a017a,0x6a0e74ee),LL(0x2da63e64,0xaa8ea0cd),L_(0x7634dff0), LL(0xb013649f,0x1ab0635d),LL(0xbd02ff70,0x9858a79c),LL(0x65938865,0x3acb5b92),L_(0x99e5f181),
+ LL(0x28b2de14,0x6b120542),LL(0xc4ac30ff,0x5ea493a4),LL(0xbe9b2f46,0xcdd3cbfb),L_(0x0c6270af), LL(0x543265a6,0xf3a605c4),LL(0x83e752d0,0x92bcbe09),LL(0x1d71ae8b,0x4ad0176d),L_(0x6507463d),
+ LL(0x183493f1,0x3e8ef423),LL(0xc54a293d,0x065effb9),LL(0xa9ccf6fd,0xb0500b2e),L_(0x88529f19), LL(0xfb31da5e,0xe16bd325),LL(0x5014e1e5,0x2bb46b57),LL(0xcdab125c,0x8179b8bc),L_(0xedd40925),
+ LL(0x54823e46,0x263960f2),LL(0x24b40650,0x21ab8a5f),LL(0x193b2d98,0xb940533d),L_(0x8d0db660), LL(0x7586193d,0x671090ab),LL(0x08db8178,0x216acee5),LL(0x6bb91540,0xcc4fc3a7),L_(0x37f48327),
+ LL(0x0e69184e,0xe86f6c8e),LL(0xbcf25a98,0xe88688e1),LL(0x9beec95a,0xd008257c),L_(0x3d97d91c), LL(0x35395ef5,0xacddfb2b),LL(0xa6942cd6,0x086efe97),LL(0x8a1a0ad3,0xb4d51fd4),L_(0x59c722f5),
+ LL(0xd8510369,0xd5dedcbd),LL(0x14ba55bf,0xab06f6a4),LL(0xbd599498,0xc5aa099e),L_(0x69ec087e), LL(0x32f40f7c,0xad93fbe0),LL(0xf1d12a93,0x40b951f1),LL(0xf5751752,0xfc37b6e1),L_(0x0c14e715),
+ LL(0xaae77beb,0x58b91be1),LL(0x3f7b0006,0x6ad767a4),LL(0x9b47cd71,0x24d37cee),L_(0x3b245f34), LL(0x70ac8b26,0x2da13b60),LL(0x88aafd82,0xbadf18ac),LL(0x62a037c8,0x78224e07),L_(0x8d974011),
+ LL(0x6a2f2199,0x1578e706),LL(0x8412ecab,0xa273c222),LL(0xe95f128a,0x2b3feceb),L_(0xccb455b8), LL(0x4d1450ab,0x247fea5e),LL(0xc24d8d6f,0xcc56e420),LL(0x32f2d692,0x001d3250),L_(0xf3727734),
+ LL(0x3d1a2b09,0x1192eb20),LL(0xde270684,0x194cd935),LL(0xcbfbf813,0xe3ba3ce4),L_(0x9c6fa3d5), LL(0x8d6355ce,0x36393a36),LL(0x18945358,0x6d3b3d2c),LL(0x50d98fcf,0x2da52d36),L_(0x23e01cc2),
+ LL(0xd68d0be3,0x87600722),LL(0xd90cd86e,0x6a898b0e),LL(0x64b1c25c,0xf26df29e),L_(0x5696f04a), LL(0x0562d2ad,0x116fb9cd),LL(0x3440763e,0xadee6e3f),LL(0x19e073f7,0xdcd869ef),L_(0xe748bcdf),
+ LL(0xd9747843,0x484e4a18),LL(0xd6812dc5,0x2181acfc),LL(0x09d6f90f,0xae25cfad),L_(0xc6209409), LL(0xb6aa9130,0xeb2922c9),LL(0x38ddc5b3,0xbe3728a6),LL(0x3b8ce6be,0x04eb6141),L_(0x3d9bb134),
+ LL(0x618ad07f,0xc862e8d5),LL(0x69540999,0xca247f9d),LL(0xaa268736,0xbded92f5),L_(0x29192f4b), LL(0x9481e65a,0x42b36d96),LL(0xe3139379,0xabfa2ad1),LL(0xd3f46f02,0x1cbbeccc),L_(0xe59fce03),
+ LL(0x2b94f0ff,0x608a4b71),LL(0x9cfd64f9,0xdd35cef7),LL(0x236745ba,0xb4d5d169),L_(0xdfa8120d), LL(0x03f0b33b,0x826e0d5f),LL(0xa5992b36,0x31eb9950),LL(0xf2cc0540,0xd954458a),L_(0x66bed66c),
+ LL(0x2c486c0c,0xa5afc024),LL(0x8a61a33e,0xb063a531),LL(0x38aa1ed3,0x1558aff7),L_(0x09b640f8), LL(0x904e9ed8,0x3494f0b6),LL(0xd2a51717,0x365e3d04),LL(0x0f32df2c,0x5c8f30d5),L_(0xffb044f0),
+},
+/* digit=4 base_pwr=2^28 */
+{
+ LL(0x6a7ebdd2,0x676d690b),LL(0x5519e7c3,0xf169ac19),LL(0x70ef4a18,0x3fe9e66e),L_(0xd0bcdec7), LL(0x9b515116,0x6b6b0581),LL(0xe52dad64,0xd0e88db1),LL(0x52c4fcf1,0x31c324fa),L_(0x5e6c0907),
+ LL(0x403677bc,0xe67af8a2),LL(0x3023628a,0x0b4be307),LL(0xdcb51813,0x88ce9bf6),L_(0x9d1c6e56), LL(0x0f788e99,0x8400154f),LL(0xfbca2d36,0x768edb49),LL(0x80428f26,0x277da6c6),L_(0x1b78829a),
+ LL(0x6933e247,0x8f4bec34),LL(0x96def5c8,0x13b62771),LL(0xc9121c92,0x543662c4),L_(0xf4ea3390), LL(0x1090a59d,0xc62e7c6f),LL(0x4bb3b3cd,0xa38394a7),LL(0x19c57ed5,0x4823e8cf),L_(0xbab65589),
+ LL(0x61b100d3,0x416f9398),LL(0xaf6ede17,0x8d0f5a47),LL(0x11e5f34b,0xe047da80),L_(0xffc1a9b5), LL(0xc598885b,0x455959c9),LL(0x6cd277fc,0xe69bdd02),LL(0x6bdbe44c,0xd3377883),L_(0x16b926d8),
+ LL(0xe93c7bab,0x23daaa17),LL(0x8729f3c7,0xcf91e74b),LL(0x64e1431b,0x1ae9e235),L_(0x2e21bb9c), LL(0x2c005910,0x0ba0b46e),LL(0xdccebddd,0x1ee4dc17),LL(0xe61cc51e,0x93805289),L_(0xbc0293c3),
+ LL(0xa33f496d,0xc65b315e),LL(0x5526e12e,0x25723786),LL(0x2ca2c551,0xc7e943c6),L_(0xea468f5d), LL(0x1845a432,0xb33bb1fe),LL(0x1b868344,0xf5b5a1e6),LL(0xbb41c15a,0xf5bd0a9c),L_(0x65efbcd3),
+ LL(0xe9864245,0x73ab2381),LL(0xbfa54a0d,0x0ed12b17),LL(0xe3536d47,0x0a040c86),L_(0xfbd5dc3b), LL(0x550f5801,0xa16b2d10),LL(0x96655492,0xd20e3020),LL(0x40239ea3,0x13feb317),L_(0x63a5974e),
+ LL(0x1220685a,0xd53242c9),LL(0xcca2c5ae,0x1c2921f4),LL(0x765eedc1,0x84f582be),L_(0x7177d048), LL(0xf8de62bf,0xf9eee520),LL(0x22fe2632,0x209f3c9d),LL(0x721633cd,0xc2e9678c),L_(0xada44b67),
+ LL(0x852acfe9,0x92b626ca),LL(0xa685284e,0xf571ade2),LL(0x918c76fa,0x5b7490f5),L_(0x375ca970), LL(0xdf1662be,0xbb1e6d8b),LL(0x7fd11993,0xd821c744),LL(0x9a06de8a,0xcaec5c2c),L_(0xc7374f40),
+ LL(0xc1321d2b,0x74538108),LL(0x95469f9e,0x2f1d65e5),LL(0xc8d1c486,0x8ecd7a1e),L_(0x9b0dcc2a), LL(0x3466245b,0x700ed4ab),LL(0xc2bf54a5,0xfa32badf),LL(0xb5a66db1,0xfc4883b2),L_(0x3315b46b),
+ LL(0x962b479d,0xc4a7efe4),LL(0x6dc8fec6,0xa0d20fc9),LL(0xd0ef4040,0x76eabbd4),L_(0x4ba76aee), LL(0x17a75082,0x4bc6d910),LL(0x75ee3974,0xff0f721d),LL(0x36e896fb,0x6146e5ef),L_(0xc74f818a),
+ LL(0x6fd30020,0xe508cb13),LL(0x06427fcd,0x80a73390),LL(0xcc02c93c,0x6ad8073c),L_(0x54e00967), LL(0x5f92bcf7,0x8847a6eb),LL(0x9b0cb317,0x758f4aa3),LL(0x40b45a83,0xdb4ada91),L_(0x6bbb2114),
+ LL(0xfff55c76,0x661c826d),LL(0x3203a031,0xb311e145),LL(0x6bdaa80c,0xcad158e9),L_(0xff7c21ec), LL(0x4502f455,0x239ecee1),LL(0xde88ad58,0x2b344eb2),LL(0x161e1cf8,0x02ce3f80),L_(0x966ad037),
+ LL(0x0009b91a,0x53d14c44),LL(0xe564666e,0xcbb01019),LL(0xdf767e4c,0xecc4eabb),L_(0x9ba1897c), LL(0x70cf6d6d,0x0ede1159),LL(0x23335d25,0x4162258e),LL(0x5ed679cb,0x5e706cdc),L_(0xf3d53802),
+ LL(0x33b4ee65,0x78fd4645),LL(0x97cb4549,0xb807ac0a),LL(0x7e760bcf,0x923934bf),L_(0x32edf91e), LL(0xaf2ed833,0x918e957c),LL(0xdbf70f3d,0xdf411692),LL(0xde9c3716,0x2c76553a),L_(0x05dea60b),
+ LL(0xd3a72d09,0xa5e4f840),LL(0x40f8ed7a,0xd9bcbe82),LL(0xf00706d6,0x986b79c3),L_(0xc2b3b652), LL(0xefb01a69,0xa0bb40d2),LL(0x5b0da5a2,0x2d182973),LL(0x57b4bca1,0x43c566de),L_(0xbed5ccfc),
+ LL(0x2f1c7c7c,0xfb3c8bb1),LL(0x3a9383ad,0x1addae50),LL(0x29206628,0xa115d8d7),L_(0x4c24fdb4), LL(0xcf3f272d,0xf2a0db00),LL(0x786a47ad,0x1a242dce),LL(0x048ec06d,0xbe72542f),L_(0x384605c4),
+ LL(0x515f5abb,0x995a0552),LL(0x65750201,0x809459ef),LL(0x2a52fccb,0x4bf08352),L_(0x3914cd0f), LL(0x94c73472,0x507e309b),LL(0xf31b1135,0x006ea75f),LL(0xd3410c08,0xde332d38),L_(0xce581939),
+ LL(0x0560814a,0x971e9a21),LL(0x69ce7f60,0xcf890a46),LL(0x607c23ca,0x8c2f3995),L_(0x16579c51), LL(0xb8358126,0xc384ccce),LL(0x74485fa6,0x62e3cda6),LL(0x637377fe,0x36145889),L_(0x11e8766a),
+ LL(0xa7ccaba4,0x66ee0e61),LL(0xd1b8ad50,0x8b52d5b2),LL(0x9b192439,0xe2507e26),L_(0x141991a3), LL(0xf0320f47,0x164afe7b),LL(0xe4e590ae,0xa9cd4bff),LL(0x53be168f,0xbd05717a),L_(0x2141999f),
+ LL(0x82377242,0x84720302),LL(0x464bed04,0x3e8eab14),LL(0x8131dcb9,0x8dffb402),L_(0x465f6f0a), LL(0xca875370,0x7476d50d),LL(0xb1cc70c5,0x40036a93),LL(0xad40e0b3,0xae5c279a),L_(0x17d24656),
+ LL(0xce0565d5,0x4590aef4),LL(0x186eb345,0x813e461c),LL(0x4d52d217,0x64b75926),L_(0xdfc17d52), LL(0x51483219,0x4046569c),LL(0x97c10da8,0xbd282e8a),LL(0x394837d5,0x5a6b2c1e),L_(0xe88b3478),
+ LL(0x58408341,0xa28c5b85),LL(0x1b86b157,0xac9ddd98),LL(0xdf706c18,0x62a72bba),L_(0x814b4431), LL(0x7437fa2d,0xafe0e361),LL(0x79e0c72f,0x29283b53),LL(0x0c099515,0x469c2258),L_(0xe132ed6d),
+ LL(0x1869604f,0x69cd9356),LL(0x18ebfef9,0x161651d5),LL(0x8a8472c4,0xa23f6947),L_(0x9ee50c4f), LL(0x9ca82d06,0xdd9ffcc5),LL(0x4875708e,0x7c9cfaaf),LL(0x8b227092,0xc52e4c68),L_(0x757b5a90),
+ LL(0x66b5d594,0x661a0707),LL(0x5bc7f7db,0xf0ed8bfa),LL(0x9f814a89,0x68ff82da),L_(0xcbb5731e), LL(0x54b6136f,0x125a9d0a),LL(0xe936a8d4,0xdbfa6d51),LL(0x0914dd93,0xacae0da7),L_(0x00b1f096),
+ LL(0x41cc5967,0x8e32f402),LL(0xd57a3568,0x99f4bcb6),LL(0x0ba8496e,0xcbcf93d4),L_(0xcd9a9a5d), LL(0xf2f0154a,0x22877383),LL(0xd00df8ff,0xf270905c),LL(0xfeb2c8a5,0x15d8ffe9),L_(0xa7504f44),
+ LL(0xc56f7438,0x435cbc99),LL(0x7613f44d,0xedb87fdb),LL(0xc1d19083,0x702066e8),L_(0xeee5d570), LL(0x2c1c4234,0x672ee8b0),LL(0x8a5f8dd8,0xfc342416),LL(0xaa518aba,0x34e2bf87),L_(0x37243c86),
+ LL(0x3bd53fa0,0x38707713),LL(0x464e00d7,0x6251ddc9),LL(0x4c9a0c1a,0xe7e323fd),L_(0xec2175bf), LL(0xd33612f3,0x93f34e7a),LL(0x840bea94,0x0c42a980),LL(0xdc0b91ab,0x548c92c1),L_(0x978906cc),
+ LL(0x72ed1d98,0x0de1c184),LL(0xa6f53ca5,0x86904dc7),LL(0x45379ece,0xbe4c089a),L_(0xb3444b1a), LL(0x6d5238af,0xa27b3f88),LL(0x46b2be92,0x21e17b1e),LL(0x122542d6,0xd6e7acc3),L_(0x7853b372),
+ LL(0x01b419d1,0xdb03ac70),LL(0xd178ee53,0xc5304465),LL(0x5f684940,0x11655587),L_(0x7b9ce700), LL(0x196f70df,0x771ca6aa),LL(0x08b0e5f8,0x4a94022c),LL(0xb69fe2d3,0x076b1dc4),L_(0x70769678),
+ LL(0xecd18f23,0x225dd231),LL(0x3eefc65b,0x23c21f5b),LL(0x43b63acb,0xf5b2b43c),L_(0x4753caca), LL(0x7ec7a342,0x362a2c90),LL(0x73799a39,0x308c8fcb),LL(0x608d86ad,0x8858eb99),L_(0x64620322),
+ LL(0x82f0ce09,0x8ffc3544),LL(0xd650c2af,0x1414581c),LL(0xf2cd74da,0x2ab74c29),L_(0x764c59d9), LL(0xd4c61a1c,0x8b9a0584),LL(0x88cdc1bb,0xd7114187),LL(0x7b53c8e6,0x4e91e1e4),L_(0xb898c7df),
+ LL(0xe472f5b8,0x120a4cb4),LL(0x28eb2abb,0xd29feaef),LL(0xa568a4a5,0x1f0a0815),L_(0x7c56e710), LL(0x52d9147d,0x1dd52d78),LL(0xf3e9a259,0x99e7538b),LL(0x25ad4a06,0x8a35cc7c),L_(0x7ffcc9ae),
+ LL(0x3daaae36,0x214d493c),LL(0x4a1951b7,0xc0f2cff4),LL(0x5e7107a4,0x46024f37),L_(0xba7c8cd9), LL(0x0f39120c,0xd7f5199d),LL(0x73d5ebf0,0x2dba9f4c),LL(0x2755fd79,0x54915591),L_(0xb315426e),
+ LL(0xbd4c1fd8,0xbe148855),LL(0x0336e26d,0x7f36ce43),LL(0x41ceba92,0x40c686c2),L_(0x0c8b60cc), LL(0xa2355b30,0xeb937195),LL(0x71e0029a,0xa1f3ab05),LL(0xf7d38672,0x90828e20),L_(0x2f8c50fe),
+ LL(0x37b7db09,0x4de172b0),LL(0xa962d349,0x3f8b6d31),LL(0x1253fef8,0xc76ebff6),L_(0x83810f07), LL(0xc53e233f,0x9a8ef0b3),LL(0xc3896b5b,0x2d43fb47),LL(0x9a94edf5,0xc8891237),L_(0xabdf75f9),
+ LL(0xf1704460,0x115d7eb6),LL(0x59c71eb5,0x71666f11),LL(0xdfdf4d27,0xcd09d0bd),L_(0x7aa8753a), LL(0x658ac045,0xe75c6300),LL(0x83c2df96,0xa0de2977),LL(0x5ea75aec,0xd9cc6143),L_(0x8bd0d544),
+ LL(0x2a662d9e,0xcd959485),LL(0xb69374f3,0x5ee58eff),LL(0x69a1ad5b,0x417599f7),L_(0x81e4947e), LL(0xc5110168,0x471554ab),LL(0x30912d02,0x4e2c7d96),LL(0xa6a4af88,0xe49c13ae),L_(0x0170b29f),
+ LL(0x0a1a147e,0x23d766f5),LL(0x8108f7f1,0x5446ea57),LL(0x737348f7,0x49f6d997),L_(0xbb23c442), LL(0x17464a0d,0xf5ac023b),LL(0x82c1f632,0x1c89d9f6),LL(0x5a4700e1,0x918b1cd7),L_(0xdb771a09),
+ LL(0xd9c4d8a6,0xfb136a04),LL(0x7d3d9198,0x627e23b2),LL(0x2a546df5,0x9518b383),L_(0xe5ad50b4), LL(0xe74b275c,0x9e8dd1b3),LL(0x8399ea24,0xb28d50a9),LL(0xc1bf5392,0xf0c4dae3),L_(0x3a885426),
+ LL(0x60cd114f,0x19f30dd8),LL(0xc7c06793,0x0a04952a),LL(0xa5b0d428,0x9fbf17a2),L_(0xedbaf6ff), LL(0xdc88c750,0x2eaf445d),LL(0xd380c189,0x24d076c7),LL(0xb7cb2b9f,0x4da895c0),L_(0x6670ebaa),
+ LL(0x296bb0cf,0x1e460fe9),LL(0xb75d30ca,0x0a2b9d5f),LL(0x779ddda6,0x70ad87c8),L_(0xd421a064), LL(0x1216c7eb,0x015e5322),LL(0xd6456e5a,0x08a2c2b4),LL(0x5c4f2da2,0xda0125d8),L_(0x2594bcc2),
+ LL(0x5cbb2272,0x0e27b02e),LL(0x74c5826f,0x651b4dc0),LL(0xf5b545b4,0x89864ae4),L_(0x81d8295c), LL(0xbfa85081,0x0162c99f),LL(0x1d4b46ac,0xc148b34a),LL(0x39fddb94,0x7de290f5),L_(0x1840e143),
+ LL(0x8d61f3cb,0xe4f10dce),LL(0x0ac9caca,0xd40a9135),LL(0xdb4a6076,0x869e961b),L_(0x41f3f07b), LL(0xc8ea7a1d,0xaed2c272),LL(0xff4dfc57,0xdd26742f),LL(0x49228bdc,0x196c9b69),L_(0xe6e12a4e),
+ LL(0x5f4b0d33,0x357d26fc),LL(0x222c05a9,0x8bc3e1fc),LL(0x44a306a1,0x6ebde62d),L_(0x25b23700), LL(0x66c5b1cb,0xc2a2d52f),LL(0x28621234,0x67f40398),LL(0x6a1916f6,0x9eb2b762),L_(0x3b034368),
+ LL(0x97ae197f,0xe2705942),LL(0x168b8890,0xb717c180),LL(0xfe30cc2e,0x7aa89b4d),L_(0x2c096c3a), LL(0x3d1c1e8c,0x1731a1a7),LL(0x027b4fb0,0x4cdde0b3),LL(0x85e85391,0xab7103b7),L_(0x4bd9bc5f),
+ LL(0x39f1ba7f,0x21c91792),LL(0xb47bf115,0xd1e29983),LL(0x8102c46e,0xaa0fed15),L_(0x1b4f9e4a), LL(0x1df20d6b,0x659104e2),LL(0x3765c7ea,0xd4f49239),LL(0x3a84be64,0xca582a23),L_(0x0c1bc735),
+ LL(0xce03f04b,0x827606a4),LL(0x419327d9,0x10bcfdd1),LL(0x277b88b9,0xf2e4c5e4),L_(0xcee78792), LL(0xb9213c6e,0x161c54e8),LL(0xa56d42d6,0x2814c386),LL(0x859e6045,0xac244cf4),L_(0x4647ade8),
+ LL(0xd6446676,0xab795487),LL(0xe4456665,0x5a242338),LL(0x899b5dad,0x8520bc7b),L_(0x8d6d1eb8), LL(0xa366ee1b,0xc17b463a),LL(0xa3b19828,0xa0af7c16),LL(0xddf53842,0x85b5501f),L_(0x8d208a89),
+ LL(0xc8d6368a,0xcd7b3fe1),LL(0xd2025e3b,0x124ab94b),LL(0x6971b236,0x961e282f),L_(0xedb43ca7), LL(0xb92ac7ae,0xc76e5b2f),LL(0xdc4501c0,0x8df11605),LL(0x0055901f,0x666181f1),L_(0x80bfc257),
+ LL(0x96fcbeb9,0x745bf74b),LL(0xd548eabc,0x24675bb4),LL(0x531c5deb,0xff3b4dca),L_(0x0b69ba2e), LL(0xd74deba3,0x97100731),LL(0x585b1341,0xa26f7f21),LL(0xb1b02a6f,0x396cb1a0),L_(0xa9fd8a08),
+ LL(0xc6165fe1,0xc07709d3),LL(0xe9ce0fc0,0xfdb883bc),LL(0xb1a5a67b,0xfd535ec8),L_(0x8218f85c), LL(0x8234b459,0x45bb7b81),LL(0xc140afa2,0x1f4c2d89),LL(0xa1cee750,0xcf55f516),L_(0xdada8f87),
+ LL(0x0e3c9ace,0x75c44136),LL(0xf44b034f,0xbe92eabb),LL(0xf4ca1355,0x9e459c32),L_(0xdf9382e9), LL(0x4bc1af9f,0xc06b8bfe),LL(0xe071459b,0xe0b85f75),LL(0x7d557c99,0xff091685),L_(0x408afbfc),
+ LL(0x90ad8902,0x5513303a),LL(0x21006721,0x9b18a004),LL(0x8286d6c6,0x73c22592),L_(0x41ba22e9), LL(0xf6402ecd,0x2bbee8cd),LL(0xb578647d,0xab06f9cb),LL(0x42089652,0xc4a5e5a0),L_(0xed915521),
+ LL(0x6925cada,0x6d3b1102),LL(0xc49fffc0,0x2e19a20a),LL(0x1593ba2f,0x8c091708),L_(0x1ec6ed8c), LL(0x711ad8d7,0x1a65086c),LL(0xef09f54a,0xc052325c),LL(0x182117dd,0x865d46f7),L_(0x6f7c505b),
+ LL(0xfb548314,0x7a6b6eef),LL(0x1dd26e62,0xec447933),LL(0x6a3d4ff3,0x74866913),L_(0x908f5992), LL(0x38316d03,0xb9635b34),LL(0x9f9cb069,0x2db27176),LL(0xac233369,0x567be1c0),L_(0xcafbd98f),
+ LL(0xcf5edce1,0xa18e3f0f),LL(0xa7d8738b,0x05816a5b),LL(0xa26ca8e1,0x00da101c),L_(0x41646cb9), LL(0xe04bccb8,0xa1f2efbe),LL(0xf3c3eccf,0x67b00a64),LL(0xdd0dbd8b,0xc0be2197),L_(0x534aabd5),
+ LL(0xe5a39b64,0x0a586a5d),LL(0x398f5b5b,0xe22752b9),LL(0xfc9ab49c,0x72fc1c09),L_(0x8776fb50), LL(0x8b426975,0xd51e5946),LL(0x3da2aa18,0xa79d2b5c),LL(0x8d8169eb,0xe4ca8644),L_(0xcedb668c),
+ LL(0x923206aa,0xd8894d89),LL(0xc4c6cb55,0x992f9c2f),LL(0xd0679c8b,0x0cde00fd),L_(0x6c539dfb), LL(0xf07baea9,0x3f8e094d),LL(0x5d6f7d74,0x3d3b3315),LL(0xbfbe9e92,0xd269b8cc),L_(0xa2a08cef),
+ LL(0x88e7f568,0x8dcb5c06),LL(0xb11d1a28,0xc8f6e06b),LL(0xa6e90095,0x905b4a44),L_(0xcca85279), LL(0x63aa3a4f,0x1e51e461),LL(0xe2429d1d,0x5fb4cf42),LL(0x35d139e9,0x8725096b),L_(0x6621d9ac),
+ LL(0x2005767c,0x95ce3a0f),LL(0x0f37bc40,0xb593a6ec),LL(0x2c5a09aa,0x762f3669),L_(0xfe96bf28), LL(0x52242367,0x88d38ecc),LL(0xe7e051f4,0x759292de),LL(0x8843ff7b,0x041ca14a),L_(0x1e08ac30),
+ LL(0x0062aa13,0x4bff8a1d),LL(0x40899756,0x28b33bc2),LL(0x966aee37,0xb4b3e7e7),L_(0x7120e524), LL(0x7f31f05b,0xc7be6aaf),LL(0x3e4b1311,0xc2c97f7a),LL(0x7401d050,0x1475b928),L_(0xd263113e),
+ LL(0x3150b4ab,0xd53ede1b),LL(0xbf73ccc0,0xe427c40d),LL(0xf4e2d20a,0xe5dd8b02),L_(0x2ff70604), LL(0xac4f8ba8,0xaaacf4ec),LL(0xf84c5c8d,0x8e6b2783),LL(0xd9aeb4f2,0x4019cd79),L_(0x4c8f57ec),
+ LL(0x680b826c,0xc0a2ee02),LL(0xc24d0dcb,0xb25a4e29),LL(0x8b33b701,0x3a2939d0),L_(0xffb21809), LL(0xe6feb01c,0xd1311810),LL(0x603004cf,0xa701c8f2),LL(0xdbcecc81,0xeee95871),L_(0x69de26b2),
+},
+/* digit=5 base_pwr=2^35 */
+{
+ LL(0xb5c4c69c,0xf507ee25),LL(0xab3e1589,0x454a0f0f),LL(0xf21fe543,0x29d7720a),L_(0xdd2cdf95), LL(0x7c33ec2b,0xb4054a86),LL(0xc7aaaa08,0xdb971594),LL(0x8a74b5b0,0x8850caf4),L_(0xdd2d6666),
+ LL(0xa04cb663,0xf30acc6a),LL(0x8b4f4dbb,0xd7560ec1),LL(0xb8b6110c,0x4f8fab99),L_(0xc43951e7), LL(0x4308e609,0x2c9d6af5),LL(0x7c9841d9,0xca6486bf),LL(0x64c7b963,0x28ca7953),L_(0x9438ea6a),
+ LL(0xbcc43cea,0x3055b2de),LL(0xf0288d97,0x68461c5f),LL(0x4caf7c30,0x84c1743c),L_(0x499d304a), LL(0xb5b3a780,0x0e121552),LL(0x50cacc00,0xc38f8d3d),LL(0x6cee1666,0xe3236cdc),L_(0x54f19290),
+ LL(0x4220e848,0xa785596f),LL(0x4ad330d5,0xfa4258dc),LL(0xf4276ec4,0xfc15e9f1),L_(0x7728478f), LL(0xa58a670e,0x9382335f),LL(0xfea55d50,0x3477647b),LL(0x311f9766,0x4f5dbddc),L_(0xd6c5903a),
+ LL(0x69933c7c,0x21ea5af6),LL(0x5f27f3cd,0x4b132119),LL(0x12e00aff,0x0ff8497a),L_(0x9216e688), LL(0xb8a8554e,0x7d054f07),LL(0xc58c4de3,0xb896b1fb),LL(0x91dbc7f3,0x6470c920),L_(0xcdac5d1d),
+ LL(0xc7b39dea,0x93ff36ec),LL(0x7d199372,0xa6f2dcec),LL(0x802aa4a0,0xdbd9b943),L_(0xae6d61fe), LL(0x8c1a0edc,0x7cecf63b),LL(0xfd6604d6,0x54af7ee0),LL(0x78b1b385,0x0498d501),L_(0x57443efb),
+ LL(0xf34b8647,0xe5ba9123),LL(0x4408fe5c,0xc14ff9dd),LL(0x42cbd03c,0x2891aad9),L_(0x1d5c6bb5), LL(0xf01f7309,0x55808c68),LL(0x50a8d621,0x2ceb5051),LL(0x9d313349,0x2f3b809e),L_(0x28922b09),
+ LL(0x59881515,0x919ddc75),LL(0xbff9ce4a,0xf87e0baa),LL(0x3037e369,0xa090d36b),L_(0xe32f5ba4), LL(0x579ffa97,0x38e224e4),LL(0x43d0a980,0x2cadda68),LL(0x702d5e89,0x12eff4f2),L_(0x4c7be34a),
+ LL(0x52239089,0xfabf2649),LL(0x653b3f99,0xe9f6b8df),LL(0xe84977d6,0x3f58519b),L_(0x6dfea3c8), LL(0x4357d0b9,0x6c5351ad),LL(0x2f6d5e66,0x1253d822),LL(0x9524c5cc,0xfbce31d7),L_(0x55b44df1),
+ LL(0x2e93f071,0xfcee759c),LL(0xe63cea29,0x132e8c42),LL(0x6a329ada,0xec4a7a29),L_(0x3f854cea), LL(0xd5e2b375,0x36a40bf0),LL(0xb7d3f3d0,0x9da99c9f),LL(0x25e16e85,0x7730bda6),L_(0x17380d79),
+ LL(0x4e15a70e,0x37a376cc),LL(0xcebedfe1,0xad1329bb),LL(0xe14b9f7a,0xac8b6391),L_(0xb426bc37), LL(0xe412693c,0xb1a885d1),LL(0x817a04ef,0xdd7cdcbf),LL(0x06667f09,0xfb4d7bf2),L_(0x9f6db5e5),
+ LL(0x350411ec,0xc83be0ea),LL(0x021990cf,0xc7612043),LL(0xbb338804,0xfb1e56ce),L_(0x4934fcc4), LL(0x4b75557c,0xfed92eee),LL(0x4d6a1f0e,0xc3259e9d),LL(0x61eea795,0xc28b498a),L_(0x10a35828),
+ LL(0x7363a98f,0xe21a8af4),LL(0x6f0486ce,0x2ee0c526),LL(0x081ad4e5,0x50ce73f9),L_(0x41a90bde), LL(0xfce29613,0x52824a9e),LL(0xc969520d,0xb689cfc9),LL(0xac6e83b5,0x006e1f4f),L_(0x134a6574),
+ LL(0xd0a972a9,0xe471b9e4),LL(0x53835085,0xcfd1906d),LL(0xd7accdbc,0x293a4390),L_(0xe0eb82dd), LL(0x86a243d9,0x06c24954),LL(0x443f28e5,0x3453aba8),LL(0x25495810,0x36f891b2),L_(0x86536633),
+ LL(0xba90affa,0x4d72eeba),LL(0xedf3c972,0x81c31d9c),LL(0xe70f3373,0xa716b2aa),L_(0x26ec6732), LL(0x42ac4253,0x6f657c45),LL(0x636e8421,0x7d074643),LL(0x461026d7,0x0dde683d),L_(0xddec4661),
+ LL(0x4b805782,0x8dd02690),LL(0xd5dfb670,0x1d04223d),LL(0x83277841,0x7ea96551),L_(0x5fe1e720), LL(0x4c78c04e,0x70dde026),LL(0xa3bb08d2,0xb58c0bf7),LL(0xae645b00,0x3afcf537),L_(0x1f93a66a),
+ LL(0x708a8084,0x5f7d6f8d),LL(0x3c0562fc,0x141c5fc5),LL(0x61a1cb60,0x78ecbf19),L_(0x8914e2cb), LL(0x4cb03ebd,0x9be1423d),LL(0xad53b1c9,0xd63cb771),LL(0x51acdaa0,0xa32591dd),L_(0x45b4e835),
+ LL(0x8de09e87,0x76e08928),LL(0xf8aeca8e,0xa653c233),LL(0x59256cc9,0xd8d51507),L_(0x77e6aff7), LL(0x47309995,0x0f159c21),LL(0x9d735f13,0xfe9fe5bb),LL(0x0339c473,0x16784f00),L_(0xa2846dae),
+ LL(0xf2b37281,0x1cbd8aaf),LL(0x4c543f48,0x8a600a72),LL(0x2324a737,0x644765ee),L_(0xdb3c4503), LL(0xb4dd3d31,0xa23d1c2e),LL(0xe86265b8,0x953388df),LL(0x864110e9,0xe9be065f),L_(0xb52e4596),
+ LL(0x9c32af39,0x69ee0a06),LL(0x9737e953,0x1fd2a13b),LL(0x38105c26,0xfe12d778),L_(0x620245c1), LL(0xd4a50775,0xd5b96217),LL(0xc8c3c80c,0x0f0582fa),LL(0x9f4dc144,0x87629c9c),L_(0xc6b8bdb2),
+ LL(0x377dc9b7,0x9e11a84c),LL(0x6df2302d,0x610e3f5b),LL(0x9becf104,0x87cc9a9b),L_(0x9b8f3304), LL(0xbefa56b9,0x89fa53e3),LL(0x7b1cfe6b,0x0b3ed786),LL(0xdb99856d,0x68d6dbd1),L_(0x9d87c161),
+ LL(0xdd0b49b0,0x7e561904),LL(0xfe908e50,0x3056fb6f),LL(0xab404bf8,0x4911d8a5),L_(0x69dfa8b2), LL(0x91807632,0x606c33cb),LL(0x776c9da6,0x791f57ef),LL(0x525adb32,0x818f0a1f),L_(0xf0db232f),
+ LL(0x1094f387,0xd1afe50b),LL(0xfdce1f8c,0xab294ef8),LL(0x69998dcc,0xe0d8fa53),L_(0x57be6614), LL(0x6ccabafe,0x64a8c67c),LL(0xf805f10c,0xd4a601a4),LL(0x8082a5ca,0x1c89a181),L_(0x5727dd5a),
+ LL(0x4855546d,0x6d3c05ab),LL(0x5bddd7e0,0x44996dfa),LL(0x9e6dd61e,0xe5054752),L_(0xb61ac751), LL(0x4c1c7979,0xa7675178),LL(0x4f0ea0a7,0x72b800a3),LL(0x307c1a34,0xafc9ca2a),L_(0xfac51887),
+ LL(0xf1254532,0x1e52b09c),LL(0x278095e7,0xfc186009),LL(0x579623ed,0x0b5f7250),L_(0x8c426eed), LL(0xa4d79ef8,0xff4c374a),LL(0xe0d3f5d3,0x252cb607),LL(0xf8e76342,0xfcc58682),L_(0xf5c2231c),
+ LL(0x586d393b,0x480cf461),LL(0x4ae96cad,0x13a215d3),LL(0xe3cf0a14,0x82460da2),L_(0xe34161f4), LL(0x188125b8,0xcd5956cb),LL(0xe0c83545,0x9e63be58),LL(0xbfc652be,0x275a3495),L_(0xc74408a0),
+ LL(0x965c6e1a,0x0b8b60d7),LL(0xcfd86827,0xd6030340),LL(0xc11f7050,0x4e201a9c),L_(0x3347de21), LL(0xdd1a6a76,0x73f70f06),LL(0xd2c5e44a,0xebc85954),LL(0x11a05e07,0x0cd2e37d),L_(0xa7ea0cdc),
+ LL(0x7afa362e,0xf7c5f96b),LL(0xce53fd1c,0xfa20c1e3),LL(0x6be4e8e8,0x02b63df7),L_(0xcb0474d1), LL(0x3453fb75,0xf6fdf958),LL(0x30ff85d7,0x502b7475),LL(0xadf32795,0x20557243),L_(0x066b61d1),
+ LL(0x446cdc62,0x8eb329bf),LL(0xa1b5aa2f,0x369f125e),LL(0x6c894dd3,0x9db7bb62),L_(0x4e250042), LL(0xc4277491,0x31b2dbea),LL(0x4c24c213,0xb650ae0a),LL(0x20fa0957,0x29da364e),L_(0xb22a0abe),
+ LL(0x3d0c5314,0xaa1e00ca),LL(0x4668311c,0xe23097a6),LL(0x18e7fcd5,0x790fdadc),L_(0x6c84e798), LL(0x00c47191,0xf4068839),LL(0x0925c817,0x5b080743),LL(0x257f4df1,0xd4b97dd1),L_(0x0e714d67),
+ LL(0x9e9f267a,0x7fa3e72a),LL(0xd9edf53c,0xec547442),LL(0x303f3000,0x74ba5f3a),L_(0x3088e019), LL(0xe130545a,0xf97b4e0b),LL(0xaed0e113,0x7b3e3dc4),LL(0xb3342459,0x849b0cbe),L_(0xa9fbffa7),
+ LL(0x156bffa4,0xef4fdf72),LL(0x85aca1ed,0x0fb07e25),LL(0x373456aa,0x0c136024),L_(0x3fbc3b2d), LL(0x75063486,0x09872cea),LL(0xed9cc9ba,0x1f75eff6),LL(0x2982d676,0x46918abe),L_(0x638bc02a),
+ LL(0x62d87802,0x8ac63776),LL(0x0082e1c8,0x3df57bb4),LL(0xfb67a75d,0x872c8f87),L_(0xe6292f25), LL(0x49548c68,0xa4ab6141),LL(0x1ee50877,0x5ae2f1d3),LL(0xccb21fe7,0xcc4c5d51),L_(0x4dd1a7d5),
+ LL(0x552b1d5b,0xc91b6f0a),LL(0x8cacee59,0x26244e6c),LL(0xebe1c6fb,0xec4bbe5c),L_(0x6a216c08), LL(0x35cfef8d,0x09fa8c0f),LL(0x17b60280,0x77fdabaa),LL(0x4bbc3792,0x94421437),L_(0xb01866d7),
+ LL(0x820d6809,0x9b55ccda),LL(0x95bebe41,0x1046f37c),LL(0xed3f6fb8,0x07a02e6b),L_(0x5d6bfa33), LL(0x6676830e,0xf82f2f79),LL(0x8ba9b566,0x35492432),LL(0x79d53ab5,0x16a996a8),L_(0x912fe1fa),
+ LL(0xaa0f7a90,0xe4d29021),LL(0x63d69e6f,0x9b86e6df),LL(0xdb26a514,0xf567f4e0),L_(0xe0d08a4c), LL(0xc1decce6,0x9de6495a),LL(0x037496f1,0xda23fbb5),LL(0x6557417b,0x7d23ff08),L_(0xb80f990a),
+ LL(0xc3c2aab9,0x2e3254ff),LL(0x0c882e32,0x48576b69),LL(0x2e3a1aff,0x4e27496a),L_(0xa8981080), LL(0x497974dd,0xb0b36f57),LL(0x57530d61,0x1d0467dd),LL(0xbd12d521,0xee061337),L_(0x2a16986e),
+ LL(0x3a9a2700,0xfa637395),LL(0x08e9776b,0xbc2048f0),LL(0xf8ae9c4f,0x7229d31e),L_(0x5d5cdb49), LL(0xd86d5de3,0xd7e8cbb1),LL(0x7d36c9cc,0xa98c305d),LL(0x382a852f,0x7668edae),L_(0xb66ddb2f),
+ LL(0x6d33747f,0x6bae97b0),LL(0x258e1f01,0xc0b8420d),LL(0x0d1395e0,0x5d523a37),L_(0x20fd468f), LL(0xf196c7bd,0x940889f2),LL(0x2b93cb81,0xa914e0ea),LL(0xce35713d,0xcb59a392),L_(0x4ff9fc32),
+ LL(0x984bd24d,0x17b7b322),LL(0xe322bc50,0x33279a91),LL(0xa03ade42,0x3ac696ec),L_(0xa59b7158), LL(0x36f23ecf,0x4faba2b9),LL(0x22a5cf90,0xf70fdee7),LL(0x7bbc4522,0xeb035a5f),L_(0x58a1a1e9),
+ LL(0x5ddc6b6d,0x150eef02),LL(0x52864a3e,0xdd3f93bb),LL(0x3696d783,0x15012933),L_(0xad3eb1b1), LL(0xff6e69b6,0xc84755b9),LL(0xb7d6ce03,0x118ab913),LL(0x2da1eb13,0x99325702),L_(0x1f352fb1),
+ LL(0xdfd09cd9,0xd7ddee82),LL(0xfd22eb92,0x93460443),LL(0x87b5bd4a,0x0d5541f4),L_(0xf4336176), LL(0x2e83bcbb,0xd3e283ed),LL(0x6124a0f9,0xe52b803b),LL(0xb28eb570,0x4a8c77d7),L_(0x782341d6),
+ LL(0x7636205a,0x18df4a69),LL(0xc1129737,0x70a8c000),LL(0xf96be149,0x69d0bc39),L_(0x8091b05b), LL(0x59f09aa5,0x53e28bf7),LL(0xb0469f79,0x3ef52081),LL(0x28ac324e,0xa781c57c),L_(0x10eeaa88),
+ LL(0xb145dd4e,0xf8de49f2),LL(0xbbb26b41,0x7a359488),LL(0xa5fe71f0,0xea4e5a13),L_(0x0d776617), LL(0x8252a9aa,0x9870bd6d),LL(0x069f0a83,0xd7e75649),LL(0x73608571,0xb0499f6c),L_(0x9dd9cbb8),
+ LL(0x63626f39,0xee89a981),LL(0xe0aee1b4,0x45b932da),LL(0x25321bbf,0xdd6b2382),L_(0x0c03fd27), LL(0xbd649607,0xdbca6a1d),LL(0x6b8f9b4b,0x1e699d4b),LL(0x940460cb,0x7938144e),L_(0x8c3cb198),
+ LL(0xa571f0be,0x50d17043),LL(0xcd56a2ea,0x7b24e599),LL(0x15047c8b,0xe06a40d9),L_(0x99dac8b4), LL(0x5bc5aeb7,0xaeb386d4),LL(0xe9f713d9,0x40fabb3f),LL(0x62bdfdf5,0x6aace159),L_(0x8e028ae5),
+ LL(0xde610cbf,0xf6b35535),LL(0xfe554daa,0xb7d2826a),LL(0xb4edc29d,0x03e1e5e0),L_(0xd38477a9), LL(0x789b199f,0x03331148),LL(0x4a8a863e,0xa966c649),LL(0x0851cfcf,0x1622ec1d),L_(0xfa31d354),
+ LL(0x888b7c2c,0x07cb3e37),LL(0x660e7e68,0xb017d5a9),LL(0x7f7c933f,0x42119d1d),L_(0x47d400e6), LL(0x5ef83e46,0x0109f6b8),LL(0xbc268020,0x6e139180),LL(0x1b624dea,0xa2bd127f),L_(0xd4e19a66),
+ LL(0x54ae0fce,0x9a79307a),LL(0x06792812,0x6d342e22),LL(0xb177e174,0x2e3ee119),L_(0x56fea730), LL(0x5e84ad5f,0x08e8f89c),LL(0x12504248,0x425e69c5),LL(0x42b47533,0x0b2e547d),L_(0x0cd14526),
+ LL(0x041c2bcb,0xd43f468a),LL(0x6c6a96c8,0x497dff29),LL(0x58417877,0x9551c8f0),L_(0x738c007b), LL(0x1e1b3a52,0x7aa44dae),LL(0x4cb0aa92,0x82e3854e),LL(0xe5d6128d,0x2f25adda),L_(0x1565a105),
+ LL(0x92365b9a,0xdd4e8322),LL(0x332f51e4,0xe083981e),LL(0xbf7947a0,0x5b678747),L_(0x3196029e), LL(0xc98f910a,0x0ca71f21),LL(0x51b450d0,0xe31a901e),LL(0x922f7c66,0xeed6566d),L_(0x1ed09e18),
+ LL(0x274ea5df,0x52fe1ee1),LL(0xf298e59f,0x7dc25d85),LL(0xd6285877,0xda84cd8b),L_(0x7cf3ae58), LL(0xbb649ac2,0x1e3ba4b5),LL(0xb225291f,0x6f9c137c),LL(0xbd251ef1,0x5e5495d3),L_(0xb7512d10),
+ LL(0x8392e4dd,0xdc8ee05c),LL(0x9d3efe45,0x4eeeb0da),LL(0x0d91ecaf,0x31e89bf7),L_(0xdc635197), LL(0xeca9047d,0xee9a09ba),LL(0x789d1a79,0x81d64f7e),LL(0xea9e0b50,0xc7b60917),L_(0xb463b663),
+ LL(0xb48d4d3f,0xb23798db),LL(0xfd959cce,0x4a87382c),LL(0x829e3bb6,0x492aac4a),L_(0x4bf01b8e), LL(0xf58a6464,0x96935f47),LL(0x82b212c6,0x3396e950),LL(0x6d21b8d5,0xe244afe7),L_(0xa642079f),
+ LL(0x890b338a,0x01b0423f),LL(0x8f95cd41,0x6d8cdb00),LL(0x68218ce9,0x7809fc35),L_(0x1fe627f9), LL(0x446c771b,0xaae3f3c1),LL(0x622ee718,0xfb834953),LL(0x89128662,0xff1c7590),L_(0x2c4b37c2),
+ LL(0xe1d9d534,0x52f4f30f),LL(0x9215d0dc,0x3a3e06d4),LL(0x6d0d3574,0x9ec8c4a0),L_(0x4abdacfc), LL(0x06630325,0x8d559ed9),LL(0x7bfef54b,0x295b5ede),LL(0xd0a2d07d,0x8d6e5cd0),L_(0xb74df6fa),
+ LL(0x42c70b2c,0x4f4ae671),LL(0x613fd1c2,0x536e7d64),LL(0xfaa3003d,0x94dc0a21),L_(0xd4e576a1), LL(0x1592950f,0xb4369ba0),LL(0x3179ef67,0x5f932085),LL(0x6309e764,0xe5462315),L_(0x3bcaa778),
+ LL(0x08fa6e2f,0xec60e2f4),LL(0x2b9b6197,0xa152beaf),LL(0xcc5f8968,0xbce9a53b),L_(0x1ef40db3), LL(0x076de5d9,0x31df6025),LL(0xe8f5bdc2,0xce591c62),LL(0xead89b13,0x52e8a741),L_(0x12358a25),
+ LL(0x179fcba1,0xc81fc0c7),LL(0x35daa530,0x8eb90798),LL(0xbdb2ded4,0x820ef61d),L_(0x6b0231aa), LL(0x2b8a3cbc,0xf522badb),LL(0x0e482ed6,0x93d7057a),LL(0x0ff17306,0x70098d33),L_(0x63ccaacb),
+ LL(0x8e019362,0x2f914dd7),LL(0xf4501079,0x2acdf294),LL(0x2848b0db,0x0f138ea9),L_(0xaf353a81), LL(0x4ea1b03a,0x49ae634d),LL(0xd3a8c33b,0x113138a4),LL(0x8ed0557e,0x2b0adbad),L_(0x739b3ce7),
+ LL(0xb33942af,0x1ecf958e),LL(0x54804872,0xc66d2148),LL(0x1f27ea10,0x011365d7),L_(0x6ce35983), LL(0xc4208dd6,0xb8f4d08e),LL(0x882dc840,0x3e553026),LL(0x29499eb7,0xea028ba1),L_(0xd9859a66),
+ LL(0xa6f2df8a,0x5bf03737),LL(0x134f5c42,0x924c5819),LL(0xce383c9e,0x910aeacb),L_(0x2daae049), LL(0xbfdc9b59,0xe45c96a9),LL(0x3a5b8130,0x726cada6),LL(0x8177cf88,0xa738df5c),L_(0x9be237a5),
+ LL(0x21f30c43,0x8cd0ef97),LL(0xfdd4b300,0xe6a63e2d),LL(0xd4df1941,0x57a01e9c),L_(0xf32119bd), LL(0x9c025c37,0xdc96eafb),LL(0x136dc55e,0x95fe2aa2),LL(0xae8f18c9,0x239e5894),L_(0xb671d770),
+ LL(0x9c68e7cd,0x22874bf5),LL(0xff1a555a,0x64db3073),LL(0x3b1f7071,0xa14665fa),L_(0xad6ab5ea), LL(0x78fc6e69,0x77eb0618),LL(0xa6cf5f0f,0x6d531160),LL(0xf5f0fda1,0x429c094e),L_(0x78109f67),
+},
+/* digit=6 base_pwr=2^42 */
+{
+ LL(0x570bd76c,0x42617e4e),LL(0x53cb59f9,0xec1fce2c),LL(0xbd807766,0x5098d9d8),L_(0xf56acb00), LL(0x468a4f17,0xada13650),LL(0x8356714e,0xb5aa694d),LL(0x1dce66de,0x5318219a),L_(0x3439525e),
+ LL(0xd30a5801,0x97115f9f),LL(0x2621a7d4,0xbb10a57f),LL(0xeff5c174,0xadf87884),L_(0x01243ae4), LL(0x162e3c5c,0xa2bc843d),LL(0x6f4a3579,0x25478286),LL(0xd6f94dfb,0x31bb4258),L_(0xa760a06c),
+ LL(0x6c5c8428,0x46351cc8),LL(0xa082b7e1,0xb964daab),LL(0xdd1d4004,0xc4d0e945),L_(0x3e7f4540), LL(0xb82dabae,0x7d7ac429),LL(0x956426a7,0xeed99c4b),LL(0x7dafa986,0xcbdad15b),L_(0x8d046994),
+ LL(0xe5e0aad9,0xc7b54b13),LL(0x257de915,0xe9d8af38),LL(0x008e0bc3,0x71a411c5),L_(0x9f3a29a1), LL(0xc482b233,0x07289ac0),LL(0x780d30d5,0x68d763c3),LL(0xa128b566,0xc589940b),L_(0xd834f239),
+ LL(0x533b21ee,0xb86a434f),LL(0x9be1cf11,0x5f1dadf4),LL(0x5b2f618e,0x35caca2b),L_(0x9da9d5f4), LL(0x74cf7bbd,0xb14dae65),LL(0xa4192a56,0x27c04cc6),LL(0xf5af0266,0xc41f13b5),L_(0x350b4db7),
+ LL(0x5727ef4c,0x9fcc3538),LL(0x2806003f,0x957682ab),LL(0xe33ed1c3,0x9f83349f),L_(0x02ec97a0), LL(0x5961423d,0x5148178e),LL(0xeab94e36,0x66e2c6e5),LL(0x5986c53b,0xd5c63ac2),L_(0x9b96cae8),
+ LL(0x9082e762,0x5661867b),LL(0x29ca7816,0x8ece3937),LL(0x30442089,0xeddde973),L_(0xee4b63a6), LL(0x3e2f6790,0xd4f64e91),LL(0xd529fa9b,0x49fdfa45),LL(0x0b104178,0x78b6687a),L_(0x40d1484c),
+ LL(0x9f724692,0x0ca4bf22),LL(0xb272519e,0x730e0881),LL(0x4bbc9bf5,0x91d1e24a),L_(0xc6e5ce02), LL(0x26de9372,0xd72ae23c),LL(0xc7a7721b,0x6ca80e46),LL(0x75b289b3,0x777ca3a2),L_(0x28a90ef0),
+ LL(0x7d3fcac7,0xebb7ace4),LL(0xa09641c2,0x48bb32ea),LL(0x0be22833,0x3f76d58e),L_(0x7e7a5d70), LL(0x8e3df32c,0x00f1bf36),LL(0xee4b523d,0x8b204653),LL(0xdaeaa58b,0x3263322d),L_(0xe7975fbd),
+ LL(0x648b273e,0x2e05e12c),LL(0x0e313d88,0x3a732a3d),LL(0x691aae3b,0x6cd91464),L_(0x8bd52c9b), LL(0x208c6c3c,0xe4c05b8f),LL(0x66fafda4,0xd9e2218d),LL(0x59cd9a06,0x835930df),L_(0xfb01c010),
+ LL(0xd984c49f,0x888fc640),LL(0x0bbd6a5e,0x9bb00fea),LL(0x4da4ce0e,0xaffa26c5),L_(0xcc14f2af), LL(0x2307b844,0xc6cd9202),LL(0x340af7d9,0x3f8ed768),LL(0x518df91e,0xeadd2347),L_(0x8dc696be),
+ LL(0xaf9c00ec,0xb90b0248),LL(0x2d2b08b8,0x45a5507d),LL(0x2e1dac5f,0x8db688a8),L_(0x3e2c52bf), LL(0xa655bbf1,0x0fdb8f93),LL(0x95c256dd,0xfdb2b439),LL(0x9751d174,0xaef8bdee),L_(0x54ac1077),
+ LL(0xb601c37a,0xdaadd78b),LL(0x450b3671,0xb65d4dfa),LL(0xb3e4d63b,0x653e4965),L_(0xf559fd3c), LL(0x8cbfa3ed,0xbaaa17fd),LL(0xcd2af6b1,0xe29a388e),LL(0x50eade40,0x2ec73453),L_(0x0ca27599),
+ LL(0xbac1435b,0xaa859487),LL(0xc7540522,0xb5b2445b),LL(0xe22a73a2,0xaa1116ed),L_(0x2e7ed6df), LL(0xf9d72a86,0x616cb03b),LL(0x61a4a6e7,0xcdf54ee7),LL(0x4cf9a426,0xe0208859),L_(0xc62b0ac4),
+ LL(0x5300262d,0x7faf0467),LL(0xc2571f4f,0xff47f116),LL(0x93b14cbc,0x484a66c2),L_(0xf8b658b8), LL(0x654db6ca,0x20220d13),LL(0xfcb07e76,0x1162cfde),LL(0x897e3ec2,0xf29d6809),L_(0x6eee73ae),
+ LL(0x2c67eef1,0x1a833a88),LL(0x40f7ac97,0x8aa0f2d7),LL(0x5fc1c69f,0x9f06aae9),L_(0x08b7e77d), LL(0x4ecfeaa6,0x17fda35e),LL(0xeac8ca12,0x338ff3df),LL(0x0013029b,0xe6215b79),L_(0xd490a9e5),
+ LL(0x45530708,0x3d6ab800),LL(0xe7c57017,0x34dca330),LL(0x5aa02638,0x4dc086c8),L_(0xba336129), LL(0x6df633bc,0x90bbb8d8),LL(0x33ca4c46,0xc7c28c06),LL(0x8dcb3bae,0xa0c24314),L_(0xa41cf732),
+ LL(0x7f227cd0,0x8cd51cfe),LL(0xb7fcfdc2,0x68ea58e2),LL(0x9f7bcc04,0x3003cc72),L_(0xd4b488a1), LL(0x5b982b6b,0xd5ebd68b),LL(0x4020c3e7,0x675b50df),LL(0x9679336c,0xa8fee552),L_(0x24805e44),
+ LL(0xe51e0a9f,0x75eb0c92),LL(0x760831bb,0x9af943f7),LL(0xa54c748c,0x28a759fb),L_(0xe246d8ba), LL(0x1cea2c6e,0xb0384781),LL(0x2f1568a6,0xf0f73ecd),LL(0xb65d1ecc,0xd26a77df),L_(0xa639e1e0),
+ LL(0xcb23a542,0x51dd59db),LL(0xac405e3b,0x24f458a4),LL(0x7d0b3dda,0x26b341e1),L_(0x9072bcaf), LL(0x80d2e583,0x9e2fd334),LL(0xd09edd03,0x114215cc),LL(0x794f6e44,0xe3bb54b5),L_(0x4abbf55b),
+ LL(0x01429cdd,0x7fb2c053),LL(0xaaeddc51,0xee0b3bcc),LL(0xcf236537,0xca6a0781),L_(0xee610794), LL(0x28ee066f,0xe18e5f40),LL(0xb59956df,0xb1e0ccfc),LL(0x2a9ed4ef,0xa109a3af),L_(0x628906f4),
+ LL(0xad211ace,0xe621f731),LL(0x99a069f0,0x072030c8),LL(0xa71de5a1,0x106812c7),L_(0x606b3758), LL(0xeac94530,0x4ce2ef8a),LL(0x57357177,0xac163954),LL(0x778bc2dd,0x2e5cbdab),L_(0xa82c012b),
+ LL(0x0baf79a3,0x9c81a4be),LL(0x4fc50828,0x9363638d),LL(0x8a4d69e0,0x687f0dee),L_(0x92f9ddc4), LL(0xa6d3323d,0x202ed4a9),LL(0x123a8f24,0x1c483cb2),LL(0x5bbe8c1a,0x433b79ed),L_(0x23111e9a),
+ LL(0x3828dbf8,0xb8a0c6af),LL(0x43cd4321,0x9f12e96d),LL(0xdd7d6cea,0xe595dcab),L_(0xd3b3c998), LL(0xad54b44c,0xe8aa36bb),LL(0x142da061,0x11dcc1c4),LL(0xcbe63415,0xeff9d401),L_(0xa4d738ce),
+ LL(0xfef9f39f,0x1d099df3),LL(0x769dfb43,0xbf9c0426),LL(0xe387610f,0x0cce0331),L_(0xd6feb0f4), LL(0x31cb09c5,0xd62d1375),LL(0x10527627,0x53290cd4),LL(0xa90e25d2,0xf1396054),L_(0x6a0d6915),
+ LL(0xf603ca7f,0xe57e3a51),LL(0x26b3d6ba,0x547b9c97),LL(0x5234c386,0x44edaf6d),L_(0x7c4a6d8f), LL(0xcea690d7,0xf13946cc),LL(0x4a083ed0,0x6ad6bb4e),LL(0x9374003a,0x36c2bacd),L_(0x90ccdacc),
+ LL(0x341c30ae,0x7e1c2c9b),LL(0x313b286c,0x17e56dfd),LL(0xb65db139,0x9888703d),L_(0x65b2fe62), LL(0xe07d7043,0x3e36f84d),LL(0x6fc2a51e,0xb4b9c74c),LL(0xbbd020f9,0xed1bc384),L_(0xb260d341),
+ LL(0x4432f2d0,0xa3a488e9),LL(0xf4caef39,0x9efd00d6),LL(0xd17c4829,0xf5128936),L_(0xf742f93b), LL(0x35e93b49,0xae41e05a),LL(0xa5eb9e98,0xe030a464),LL(0x41a1010a,0x1db1bce3),L_(0x7cabde79),
+ LL(0x6fb1c1bf,0xfe5cfb57),LL(0x304db3f7,0x401be370),LL(0x29b356b7,0xef6ca52e),L_(0x16934044), LL(0x131c52a9,0x3084c2e8),LL(0xb1a56ede,0x58a36c5a),LL(0x8cfd7a22,0xa076e835),L_(0xe8967b86),
+ LL(0x74382b8c,0xecf54e6c),LL(0xe7d202a5,0x80a6564e),LL(0x3378864a,0xf29ac0df),L_(0x3af276ae), LL(0x9549b955,0x71036c3c),LL(0x85bde008,0xd3203c72),LL(0x57b0b3ec,0x7ee244a8),L_(0x7831f44b),
+ LL(0x2a2ae111,0xe00edfa7),LL(0x8b506f33,0x6b68f39e),LL(0x8f5215f7,0x0b132723),L_(0x36ee465c), LL(0xe7d50419,0x85673786),LL(0x4b253aad,0x231c0709),LL(0x487f22bb,0xf5e2a237),L_(0x8af08593),
+ LL(0x95692ad3,0x0b27bb26),LL(0xa14fcdb7,0x090be6f5),LL(0x8b45b55f,0xea84dd7c),L_(0xd1971d3e), LL(0x928497fb,0x971d5f28),LL(0x9e1b8d56,0x6339a103),LL(0x9ddbd5c4,0x3fe08c7f),L_(0x71eef4d8),
+ LL(0x987de693,0x1683a455),LL(0xca6c2d90,0xb38e1de8),LL(0xdd0a3684,0xf01af5d9),L_(0x2403e538), LL(0x86ab28a1,0xd4b30cec),LL(0x533a55fa,0x22c7c598),LL(0x01cadc9e,0xb5dd36ac),L_(0xe6dc51f3),
+ LL(0x8baf2809,0x60cc335f),LL(0x1ed24f3e,0xa633db28),LL(0x732a899d,0x7f9cd569),L_(0x5d8b2c23), LL(0x04bce2d6,0x1f59a0d7),LL(0x6ef81d6c,0x6d10e528),LL(0xcbb166ea,0x7fe10619),L_(0x1eb94857),
+ LL(0x04d81b40,0x88a7293b),LL(0x3d8447b9,0x1732c2f0),LL(0x057b8676,0x320d8861),L_(0x5a9e4e63), LL(0x5bfbc591,0x3e5d907e),LL(0xa66f2cce,0x2b35a3fe),LL(0x1597d44b,0x7605acfa),L_(0x756ca23d),
+ LL(0x6112f38f,0xf5ab47b4),LL(0xf577db42,0x5984ae06),LL(0x4fccb7e8,0x81972b3a),L_(0x1d854210), LL(0x5d4f964c,0x905ded37),LL(0xf605f38c,0x6a31fa68),LL(0xfb6ad50f,0xd83dca88),L_(0x6aacdbc7),
+ LL(0x1b0ac423,0x711dde1a),LL(0x227d6127,0xb5e309b2),LL(0xac0aec46,0x17ee236d),L_(0x70e64775), LL(0x600531c3,0xce093e55),LL(0x458395de,0xec04dd4e),LL(0x59639b52,0xb9e01d45),L_(0xa8e6469e),
+ LL(0x1b94ace7,0xb0fee2ec),LL(0x08d97fb0,0x5c0b8f2f),LL(0xdfd59ee2,0x6a154d90),L_(0x35f79449), LL(0x8fb75d5a,0xb692d5e7),LL(0x094a540a,0x080f7773),LL(0x1fbd50fb,0xa4f8f9e4),L_(0xb9d1eb94),
+ LL(0xf63f6da8,0x2aa45a5e),LL(0x711d55a4,0x2d7d0b41),LL(0x29c1bc69,0x8aabebdc),L_(0x8480eff7), LL(0xb0063dbf,0xc38e3c41),LL(0xe276eaf6,0x661ba0dc),LL(0x99541913,0xc19809da),L_(0x50e215d3),
+ LL(0xff252d36,0xa1530a6c),LL(0x253d53ef,0xc8e9b570),LL(0x9793a371,0x3489107c),L_(0x8abf5783), LL(0xf0b49c6d,0x879022b6),LL(0x12bdba9e,0x069dd468),LL(0x2c618b82,0x64bde16d),L_(0x2306b3be),
+ LL(0x2d08df95,0xed7d7c9a),LL(0xd4d38ca9,0xe80a7f84),LL(0x357baf28,0xbb968f21),L_(0xbcca4e7e), LL(0x8315da93,0x96e91923),LL(0x4f08013c,0x4e306972),LL(0xc5ed2a12,0x950bbe41),L_(0x434c75ba),
+ LL(0x39668cb6,0x077167b6),LL(0x7bdd93d3,0xfce255b9),LL(0xb37bc6b8,0xf3809a3f),L_(0x32c36f4d), LL(0x7f61816e,0x44d57109),LL(0x06f0654c,0xb19cf5fd),LL(0xdb202875,0x42100d63),L_(0x79f51335),
+ LL(0xaf246d2a,0x7f3965a6),LL(0x8caa84d7,0x8d8e3137),LL(0x26bde524,0x11b1a769),L_(0xa5eaa311), LL(0xd87dfaee,0x707808be),LL(0x69540405,0x04bb89d0),LL(0xe52cbe87,0x7ec2d88f),L_(0x994f86d5),
+ LL(0x5423908f,0x43d7285e),LL(0x85d0501d,0x49363917),LL(0x6a49fc82,0xf5d8d60b),L_(0x2126dd81), LL(0xa0f34346,0x665a2267),LL(0x1fa53f15,0x1ac20d97),LL(0xffa2e5fc,0x4e6d33c1),L_(0xf9840551),
+ LL(0x9731dc20,0xf1f7a37e),LL(0xc0130bbb,0x69d32743),LL(0xea51b61d,0x05851633),L_(0xaa72b2e1), LL(0x04e8d8bb,0x1c8bd021),LL(0x4806ed2e,0xef76ca45),LL(0xf099b725,0xd230047c),L_(0x5f4e19c3),
+ LL(0x44613937,0x62171491),LL(0xf583d82e,0xa07a7b6d),LL(0x9015ad40,0x306c9555),L_(0x0b81ff7a), LL(0x18925a9e,0xaac18583),LL(0xa0946d46,0x7d220576),LL(0xbbd4708e,0xf151aaec),L_(0xe99b984f),
+ LL(0x6e04c9ed,0xb57b3b22),LL(0x3cdad4a9,0xa3593866),LL(0xa01b71df,0xa63bab57),L_(0x97f85c63), LL(0x773f947c,0xefc9bc76),LL(0x1a1f56a4,0xcb328f94),LL(0xe12b780c,0xb068b3ce),L_(0xc8733217),
+ LL(0xc1916a8a,0x62555b0b),LL(0xe906cdca,0x00203baf),LL(0x82d7d36f,0xd8764be5),L_(0xc4064873), LL(0xf4469260,0xa23e8076),LL(0x7f6613c6,0xb903dea6),LL(0x11610026,0xd83fceb2),L_(0x6e5bcf50),
+ LL(0x2739ed0b,0xcff10abf),LL(0xcaa11cd8,0xe0b269eb),LL(0x92761d90,0xc1c0ca0e),L_(0x70aa2955), LL(0xab5ce41e,0x62aaaef4),LL(0xc2c0d2af,0x5a3ff0d9),LL(0x3aa250ea,0x8f10b784),L_(0xdbfc2028),
+ LL(0xe5bbf62d,0xa53f3f3f),LL(0x5bd69524,0x27dd1951),LL(0xeada36e1,0x40a88ecc),L_(0xd04364be), LL(0xca0a31a4,0xd318529b),LL(0x5b3c2cf3,0xefec04d1),LL(0x49d3e4dd,0x55c20eb0),L_(0x7153c7d3),
+ LL(0xc5f830cf,0xbf310209),LL(0xbaeecda6,0x1372fe7c),LL(0xab6a0dc0,0xaf6004cc),L_(0xabcb8c97), LL(0x8803af61,0xa6088f51),LL(0xf7850d91,0x53f144ac),LL(0xe77f4280,0xd7d06ab8),L_(0x9a5d8d81),
+ LL(0xc4969a0e,0xdf19cc2f),LL(0x433da709,0x8bd7557f),LL(0x554a3a06,0x8fe8b8dc),L_(0x687d6a23), LL(0xf261d773,0x82e07bc5),LL(0x9e80d756,0xd1d7da5d),LL(0x45447ad3,0x19044418),L_(0xae95e54a),
+ LL(0x3956922f,0xf66675c8),LL(0xde2dc4b9,0x20469977),LL(0xf5f39465,0x011863a2),L_(0x1e9807dc), LL(0x960a1dab,0x66b9d7bb),LL(0xdbd5a655,0x074a85ef),LL(0xd9f9bf2e,0x7dd3b230),L_(0x50a9e91b),
+ LL(0xe5be9e2b,0xb5995728),LL(0x0640124a,0xa127aac9),LL(0x23c8cef0,0xf11df0db),L_(0xb1a238e2), LL(0xefcf6a98,0x38cfdd79),LL(0x78034f01,0x899c799e),LL(0x8c265685,0x7cab4cd9),L_(0x1b6b2132),
+ LL(0xe6160917,0x480a36fd),LL(0xe17a372a,0x3f7c1b1c),LL(0x91f84a8c,0x85381912),L_(0x202d4232), LL(0xb7408da9,0xe263f58c),LL(0xd1c14892,0x8ca85524),LL(0x8c2f9aa1,0x687fc42f),L_(0xebb9ceb8),
+ LL(0xf5f78e42,0x3455a3e9),LL(0xbbc51854,0x30c1c2c6),LL(0xddf065a7,0x3692f51b),L_(0x5794f41d), LL(0x0f5906c1,0xbfc2af37),LL(0x3df049a3,0x5fa05ed1),LL(0xd9f88327,0xfad22122),L_(0x143991c0),
+ LL(0xcbee3325,0xe6fcf3f6),LL(0x29ff58e0,0xc3e92fcb),LL(0x7c43be45,0x6def0ea9),L_(0x95d4294c), LL(0x72baebe1,0xabf2c782),LL(0x8f7dbb1b,0xff1c5bf6),LL(0x21f7b8ae,0xcada1649),L_(0x1d86e3b2),
+ LL(0x2e618a15,0xe44e287b),LL(0xc0ea1a7b,0x9ec08fdf),LL(0x3cbeeaa0,0x41378416),L_(0x5dfb49d7), LL(0x3defdbe4,0xdd8dc723),LL(0x4d7ec600,0x6d23302b),LL(0xf1849878,0x922ac03f),L_(0x9a57ab5a),
+ LL(0xf4361243,0x5150fa93),LL(0x3ea14eaa,0x1bf1d7e3),LL(0x0106a9fc,0x90827c46),L_(0x7d96ff3f), LL(0xd4951e8a,0x046acfdb),LL(0xa6461b44,0x38e792fd),LL(0x2d8ca425,0x07e228cc),L_(0x4ba3f6b1),
+ LL(0x889c6c45,0x12d9fd78),LL(0xf4406adb,0xa6aed947),LL(0x46f4af45,0x4de1be3f),L_(0xd4630c28), LL(0x932b6858,0x4b284bc1),LL(0xcbab5b0d,0xe27e82bb),LL(0x9200852f,0xe41775aa),L_(0xdd624131),
+ LL(0x50a8e4b8,0x9d917e78),LL(0x558110ca,0x4ac6dc2a),LL(0xeb63b95b,0x585b0c05),L_(0x89d42790), LL(0x876d7f22,0xdd6e7325),LL(0xb4e2f682,0x34a78682),LL(0x55d49e0e,0x7de26ccf),L_(0x076914a6),
+ LL(0xf3430044,0x09139313),LL(0x6fe59fdd,0x32e29482),LL(0x9f0a6227,0x1c584d56),L_(0xffe716b6), LL(0x11cca786,0x53203116),LL(0x82480098,0xb1c8440a),LL(0x0ec04b4a,0xb4fd311a),L_(0xb256043e),
+ LL(0x4a367cf1,0x82ea7247),LL(0x8fd0c543,0x35a8f8e4),LL(0xee0c8d61,0xeb47eaf0),L_(0xb1c6b367), LL(0x7fc38517,0xb4361b1e),LL(0xa69d501d,0x24e2fb10),LL(0x94b8860e,0x1e4ac934),L_(0x473c4fc7),
+ LL(0x9c7f7bc3,0x85016181),LL(0xa46af46a,0xae2e08c9),LL(0x1d49bd53,0xd51d0f76),L_(0x47c1a7de), LL(0x574b1fa3,0x275045e3),LL(0x2b7d8406,0xe63f9064),LL(0xb270bab6,0xcbacaf10),L_(0x1fd8fd5b),
+},
+/* digit=7 base_pwr=2^49 */
+{
+ LL(0x55cc3b94,0x81366649),LL(0xc85bd06b,0x0bb5529d),LL(0x66b83a45,0x020a3d7b),L_(0xd7360ab5), LL(0x6d9c718e,0x4c39583c),LL(0xf32587a2,0x063ccb66),LL(0x8cb7eb45,0x01328b11),L_(0x7b390466),
+ LL(0x7e06eeca,0x2a100811),LL(0x1e68642b,0xf4997f3a),LL(0xf5c07857,0xad98c158),L_(0x3c2d33de), LL(0xf408207e,0xdb7d94f4),LL(0xe7bd848f,0x6379ef09),LL(0xf3bfa4da,0xde775bfd),L_(0xa5183e31),
+ LL(0xd08dfe45,0x9b19df92),LL(0xf42316da,0xfd14af8c),LL(0xcc3f5ace,0x9cb59da4),L_(0x2c68ad5c), LL(0x880b584b,0xe1fa2671),LL(0x0ace93c1,0x76bf0449),LL(0x0c870e3e,0x6fb6d427),L_(0x680b653e),
+ LL(0x70db0533,0x12b3f8dd),LL(0xb2fbdce6,0x167ab18c),LL(0x92abaaa2,0x5e4d357c),L_(0x452fe014), LL(0x1fb69d3e,0x7bd8f0e1),LL(0x58ea7caf,0x4735131f),LL(0x84b31510,0x6a03c6b3),L_(0xbcfb5361),
+ LL(0x5a2c8036,0x91588e92),LL(0x4e652187,0x1b69af1a),LL(0x451b95e7,0x3517cee5),L_(0x8c64ca67), LL(0x1e09f843,0x90930327),LL(0xbfeeb455,0xefa175df),LL(0x9e48451e,0xedef520b),L_(0x49b070fb),
+ LL(0xa2492065,0x1e8946dc),LL(0x318fd845,0x9916090e),LL(0x82135311,0x98fdccc1),L_(0xbc4b4f98), LL(0x31f673e4,0xd529f3ea),LL(0xf1c8e5c6,0xb119ca50),LL(0x428145ce,0xcf53a57b),L_(0xba7a2228),
+ LL(0x38640e72,0xa872dbd5),LL(0xab84c140,0x8f90052d),LL(0xffeb6e87,0x9a484b77),L_(0xc8d71762), LL(0xe045b6cf,0xb3a39b3e),LL(0x68339c4f,0xdbc53298),LL(0x462a1b9b,0x60a23eea),L_(0x47a583f5),
+ LL(0x8a1c84eb,0xc38a15ff),LL(0xc73cc555,0x5b502e98),LL(0x67d1f3e4,0xf85c7d6e),L_(0xfaf491bb), LL(0x7c34a745,0x94062e0f),LL(0x5e8b71b9,0x9579c983),LL(0x35f7a266,0x63ed902e),L_(0x2cfe7a8e),
+ LL(0x7e6607ae,0x54fa21c1),LL(0x7c605a96,0x2c3baf13),LL(0x177b275b,0x39001a70),L_(0x402c2a3f), LL(0xf4928a3d,0x9356e91a),LL(0x443518d7,0x30b1d7ca),LL(0x02772478,0x8c5ecfb7),L_(0x8e06bb83),
+ LL(0xcaa887a4,0x4f7bef32),LL(0x08805f7d,0x5dec8cf9),LL(0x8965403a,0xcc362cae),L_(0xa8e82004), LL(0x37f6ba21,0x35e7cde5),LL(0x1d022cb1,0x0d54e5e6),LL(0x02d7913b,0xf4a0addb),L_(0x4f243fbb),
+ LL(0xcc348a38,0x58983641),LL(0xf6e35ba7,0x237be718),LL(0xd585a061,0xdb2539f1),L_(0x2217c68f), LL(0x403565cd,0x78351808),LL(0x36c2d842,0x6202e955),LL(0x7f54736b,0x660d4fb3),L_(0xca575f23),
+ LL(0x6bc9ce98,0xb22311a5),LL(0x84749347,0xe993a41b),LL(0x85025abd,0x432e7fa6),L_(0x6f57ce7b), LL(0x42d19cdd,0x18144346),LL(0x1fc786db,0x2bd73670),LL(0xede484f4,0xa93261b3),L_(0xc5ec96e8),
+ LL(0x38a7a729,0x2660c15e),LL(0x6845886e,0xcbfe266f),LL(0xe7715ea4,0x803ef610),L_(0x9d5c3a0d), LL(0x6f2eb06c,0x3e73d7f3),LL(0xaff72fe1,0x8fe4228f),LL(0x2703c35b,0x801d9246),L_(0x0008cf4d),
+ LL(0xa7b3253e,0xb347bed9),LL(0x87c9db13,0x23367d55),LL(0x50ebab37,0xe6bc8d5f),L_(0x30c060ce), LL(0x9df003d2,0xd78ada2c),LL(0xc3892b4e,0x4989b92d),LL(0xf9b3e9f5,0x2dbbe952),L_(0x48275a07),
+ LL(0xdc3c1c12,0xfb949b08),LL(0xa8296f5d,0x010b8834),LL(0x69483176,0x73825d94),L_(0xe4f380a5), LL(0x7caf444a,0x3cd86c08),LL(0x6ae21350,0x8ba59225),LL(0x6d5a74bd,0x1e6e636f),L_(0x6a2c970e),
+ LL(0x51eea6cb,0x69de6020),LL(0x15974dd5,0xf383a0c6),LL(0xa7aeef7a,0xec5ab9f7),L_(0x25652e0f), LL(0xb56f14b1,0x7b78f2d9),LL(0xbe7272ca,0xb4e91769),LL(0x0886a015,0xb8c7fe1f),L_(0x1c2ac0a8),
+ LL(0x7b2d2c1a,0x3f05a7cf),LL(0x7d9a8322,0x8a978fa5),LL(0x2541de9c,0xb09f953f),L_(0x44b3e4d5), LL(0xa6872622,0x0275a86c),LL(0x5ca47329,0xc3073baf),LL(0xe68e138a,0x70608786),L_(0x426bc12e),
+ LL(0x22def544,0xc1d1a75a),LL(0x054cdb35,0x9d05dd03),LL(0x13908388,0xcac954e6),L_(0x6b377854), LL(0xfb37d06d,0x42873dd7),LL(0xd85fe89f,0x77686ddb),LL(0xbd6e2bfe,0x0a7aae21),L_(0x3116e23a),
+ LL(0xd00f34a0,0x6d3f30d8),LL(0xb72f2ac8,0x793a6f93),LL(0x8e54b8c8,0xa3ebe240),L_(0x06c18c5d), LL(0xd3635d7f,0x7527fefe),LL(0x848fd8b1,0x7ecf5710),LL(0xe5c193ac,0xc5b359a4),L_(0x10bdedf6),
+ LL(0x6a69e07f,0x904b6a99),LL(0xf73ecc50,0x74691c89),LL(0x377aafb2,0xf8dfe49e),L_(0x3116ab06), LL(0xbc4bbf14,0x32c37416),LL(0x4f9adb4e,0xa6bc7861),LL(0xb481fbff,0xab667972),L_(0x50e39a47),
+ LL(0xd40e7122,0x03318c55),LL(0x2b1438a6,0x5cc23063),LL(0x7d21722c,0x353dafc9),L_(0xb52192c7), LL(0x47d32da4,0x8e5c3c5f),LL(0x356f1a48,0x4c620a4a),LL(0xc2e2dc49,0x6ac8f16a),L_(0xa8078172),
+ LL(0xe0aae2f3,0x27e1fc19),LL(0xcaccad70,0x9a5089ff),LL(0xd066d3ec,0x83ce796d),L_(0x1d39df6c), LL(0x3d7bd85e,0x2109b271),LL(0xd4d73f64,0x032bfaaa),LL(0x4c64918b,0x28f7e9fb),L_(0xead7a6eb),
+ LL(0x81a3a911,0x1ec15d92),LL(0x072d4b8d,0x0de6b8aa),LL(0x25d33d78,0xdb94f1aa),L_(0x163e5ede), LL(0xcda754fd,0x0aa41bac),LL(0x8bb9f4cc,0x26a33edd),LL(0xaed5fcc3,0x03b383eb),L_(0x7bac84ac),
+ LL(0x48a08610,0xe3c9d6e7),LL(0xaf9b1185,0x1c9dda6d),LL(0x37a0510c,0x87290f47),L_(0x395d8f39), LL(0xe0b9b993,0x04968462),LL(0x2065fe67,0x79bcdef3),LL(0xba7c23dd,0x3c9dfbbc),L_(0x48b97684),
+ LL(0x4867362d,0x9b7dcff4),LL(0xa45a3647,0xf6be4fd8),LL(0x9dd99069,0xfc837cc5),L_(0x463e52d6), LL(0xa104db39,0xe73440a8),LL(0x868e9fad,0x557bc30e),LL(0xca38a194,0x0b9107de),L_(0x3b4896a5),
+ LL(0xf9b3c663,0x0572aa2e),LL(0xb232d67e,0x6cf8f9e9),LL(0xdc3bb3a4,0x578fa229),L_(0xf77deefa), LL(0x7b780979,0xe2e55595),LL(0x3dd1f800,0x1ae5674a),LL(0x7d70eb0e,0x6287e785),L_(0x6ca9df37),
+ LL(0x6027714a,0x6418b451),LL(0x6b5f95e4,0x008c73fe),LL(0xc7a41b44,0xb52d2690),L_(0x7e9e5e8d), LL(0x07d5913f,0x28af32f1),LL(0xba6493ac,0x70ace436),LL(0x249d5a1f,0xe2634904),L_(0x9de83ae3),
+ LL(0x91c3f75f,0x7ac06d6f),LL(0x5d22beb3,0x8cbbcc95),LL(0x6114dddf,0xb3f952c3),L_(0xd55713d1), LL(0x50a376be,0x95633a5e),LL(0x402443f5,0xf0277528),LL(0x900af3d2,0x2aac428e),L_(0xe7ecc502),
+ LL(0xede089c1,0xafe013ca),LL(0x9bc0d189,0x24f9b481),LL(0x7d9ab065,0x7064130f),L_(0xcb09791d), LL(0x88599e66,0x1a8684d1),LL(0xdbafc741,0x5b828087),LL(0xa7784039,0x274e2738),L_(0xa61d0693),
+ LL(0x04a64675,0xabf54d81),LL(0xdec1f49f,0x46144f05),LL(0xc232e58f,0x30cddd92),L_(0x5b7d5bc7), LL(0xc2b48798,0xfb8c420d),LL(0xb96fbab6,0xb4d97ee3),LL(0x8d97d0d5,0x8101b1e7),L_(0xb545f661),
+ LL(0x98af21f0,0xcd4340b9),LL(0x955d1c9d,0xda56271c),LL(0xcf1eb8ab,0xcfc8c025),L_(0xc22b3fb1), LL(0x99747eea,0xdff889cf),LL(0x01a895b8,0x16fb6025),LL(0x22ae0ed8,0x56d4b8ed),L_(0xbdaf7eb9),
+ LL(0x0745f518,0xc7781923),LL(0xb03571c4,0x6cd5a87b),LL(0xe1112158,0x734d96e5),L_(0xc2f71082), LL(0xfbc17aec,0x7d6ae9b9),LL(0xae846849,0x6b340fbb),LL(0x7a81eba8,0xa462be47),L_(0xf156efcb),
+ LL(0xbad5359f,0xcc17a45f),LL(0xed5f0c48,0x3962aaeb),LL(0x18daea3d,0x24dea50b),L_(0x2620a5cf), LL(0x2db980d5,0x94722851),LL(0xe16c7ff8,0x17a80fd9),LL(0x0cd73f37,0x0ef75926),L_(0xa7a0ce92),
+ LL(0x2994a0c6,0x0d862f7d),LL(0x66b2e45e,0xa326bcf2),LL(0xb39a090d,0xebe228c9),L_(0x8223ef31), LL(0x4fe39e14,0x292a329c),LL(0xe179a973,0xa1f5d624),LL(0x3f828ea8,0x70ad621c),L_(0xc04d2e0b),
+ LL(0xb7237a24,0x94de2084),LL(0x91138a01,0x0c93caa4),LL(0xd97e1daa,0xb74fa915),L_(0x668329b9), LL(0x146706c8,0x23c7b716),LL(0x23606a0c,0x54c6c8af),LL(0xbe011ca0,0x2ef6e4a4),L_(0xb2029de6),
+ LL(0x33851602,0xbee34e4c),LL(0x7b910cad,0x8e7c506d),LL(0x2b92ce18,0x62b378cc),L_(0x5c490234), LL(0x95f16f74,0x661c0891),LL(0xa5073d8e,0xf7df962d),LL(0x6fdadac1,0x8f3ef4f4),L_(0x373f29f4),
+ LL(0x23206f03,0x235bc318),LL(0x7518fa1b,0xec43017e),LL(0xc5d4dab6,0xf547238a),L_(0x7e5c2b82), LL(0x25d0ebfc,0x8357f1bb),LL(0xfb571aa9,0xe137e308),LL(0x996a92a8,0x629e8aa7),L_(0x90f06a9f),
+ LL(0x4a17680f,0xa8c7b143),LL(0x84f5aab1,0xb84edf8c),LL(0xf2acd3a2,0x8b3a07a1),L_(0x5d4c58ed), LL(0x2f0d5862,0xcd2f47fd),LL(0x31cb8d1e,0x0d4da406),LL(0x0cd04a92,0x8ec4fcad),L_(0xb261a451),
+ LL(0x91a38da6,0x76eb9c38),LL(0x12868725,0x0a5b71ac),LL(0x2d328a16,0xf6122daa),L_(0x9232586e), LL(0xa1eceeb7,0xe9555051),LL(0xc35149d8,0x55020182),LL(0xae8df945,0xcee3a23b),L_(0x6020896d),
+ LL(0x88241ba5,0x6839ac95),LL(0x75c22b80,0xb01a4c72),LL(0x4e73d41b,0xdbce70d9),L_(0xb035070a), LL(0x25457ffb,0x4155bcf6),LL(0x6c514452,0x79b75848),LL(0x3c25b38e,0x8c33a19b),L_(0xb8f49889),
+ LL(0xb2bc7aad,0xc7b2eb56),LL(0x96c5270f,0x8112c87f),LL(0x15208222,0x612138e3),L_(0xac8a2edb), LL(0xa6392e61,0x7fcbfb2b),LL(0x95cfe395,0xb4541276),LL(0x134be404,0x3de33a7c),L_(0x2cf45438),
+ LL(0x27c80982,0x6d995371),LL(0x429942a9,0x1e16c2dc),LL(0x0e59bd58,0xfbad79fb),L_(0xd34caf67), LL(0x481ca9cf,0x6cb52c72),LL(0xfc7ee8ab,0x7e9afc85),LL(0xfda3af10,0x41a661b7),L_(0x7e623e57),
+ LL(0xc421cd21,0xb68b5cf7),LL(0xd94c04b7,0x107cec0c),LL(0x81208f8b,0x383162ed),L_(0x454f3ae7), LL(0x2a8bfdfe,0x0f977619),LL(0xdeb81615,0x382decc1),LL(0x8e5df4ce,0xf0414c84),L_(0x0f3c79aa),
+ LL(0x15f29277,0x89f9b2a7),LL(0xa1f621ee,0x817b0a57),LL(0x6ee121aa,0xf56eeafc),L_(0xcf7c22d6), LL(0x0bbfabbf,0x52eb19cc),LL(0x018d1b99,0xc2b09e5e),LL(0xa82ae35b,0xd9cf95b8),L_(0x34b4bf9a),
+ LL(0x017073a5,0x4f731dd0),LL(0x0235def1,0xd07b63f1),LL(0x5e605b0d,0x4769aa10),L_(0x7252588b), LL(0x26cfa7a5,0xfac43672),LL(0x01631f47,0xbb074c5c),LL(0xe02c4623,0xb6536982),L_(0x061acc5a),
+ LL(0x0bd8823c,0xca3a4054),LL(0x57b5c945,0xbee559f1),LL(0xac8c4662,0x54b8d320),L_(0x8ee0f3f7), LL(0xfc9e1370,0xafaff913),LL(0x7ef2aacc,0x15a9349a),LL(0x81208c2d,0x0d06fd25),L_(0x00df14a3),
+ LL(0xc4906f44,0x3cb8d3d5),LL(0xc2b5f2bf,0xef621a83),LL(0x42fee26b,0xcb150abc),L_(0xa4673146), LL(0x8c081901,0x2e00a64e),LL(0x4f184ea9,0x4b9fa7b4),LL(0x7c4d0b48,0x60c91243),L_(0x05745a02),
+ LL(0x36d03f9b,0x7049620b),LL(0x54cfa460,0x29c0b51d),LL(0x50448eab,0x3f0b2dd9),L_(0x9ed5c1c7), LL(0x217c3b7d,0x8eca2e20),LL(0x7e7352b9,0x20883efa),LL(0x3afc2315,0xc23211b5),L_(0x98c20d32),
+ LL(0x3c1d5c98,0x00ef3bc9),LL(0x03002427,0xf1f069cc),LL(0xc5bebf01,0xf661ac1a),L_(0xb01d642d), LL(0x54219e42,0x25a7fa91),LL(0x199aa1af,0xf217cbfa),LL(0xf0d4c0bf,0x4f2df7eb),L_(0xf7508aca),
+ LL(0x8f2773db,0xb21c4cfa),LL(0x966e2843,0x52c04b61),LL(0x590a0567,0xf35f4a84),L_(0xf255a433), LL(0xcc2e1149,0x04ae8b1c),LL(0x13360c1c,0x92f66f03),LL(0x4053731c,0x20aba0c9),L_(0x20d59987),
+ LL(0x0a4bb9e9,0x9ad08ec7),LL(0xa3719263,0x54a4bb3e),LL(0xc9bcb020,0xf5564618),L_(0xaa1b7ba0), LL(0x2f0cb8aa,0x64275534),LL(0xd09acd41,0x3340504f),LL(0xd7e50869,0xaf97cbcd),L_(0xf4025b06),
+ LL(0x96f1d3cd,0x9f391b14),LL(0xbd5e9744,0x5f6bed3b),LL(0x008d20fd,0xc79a2572),L_(0x905330f0), LL(0x77d13f02,0xb71f049c),LL(0xdb745573,0xe088bd21),LL(0xbd449f9b,0x3a76432d),L_(0x1de7f0bb),
+ LL(0x12dbb0cf,0x4f53adb9),LL(0x2e4f3aa7,0x13ff9790),LL(0x61674465,0xa80fdde3),L_(0xfbfa4069), LL(0x50e102a9,0x28391810),LL(0x22e32485,0xd119b153),LL(0x47aca745,0xeb9f0102),L_(0x3f33e272),
+ LL(0x6dc8e416,0xb01555de),LL(0xa53f861f,0xc5669efc),LL(0x14d3a409,0x0c68a597),L_(0x3ad8c86e), LL(0xed8dbd60,0xc5474f33),LL(0xda13401f,0xd21a574f),LL(0xf6b7aed6,0x0d2d58af),L_(0xbe2e5676),
+ LL(0xb63ca145,0xa81eba20),LL(0xd0d7b9ca,0xf6e2c558),LL(0x4e439115,0xe8f8d978),L_(0xb32fdbaa), LL(0x8cf406a7,0x23a5c7d1),LL(0x7072ea14,0x4e16a729),LL(0x3db551d5,0x88436ae6),L_(0xd7c49d77),
+ LL(0x32172eb6,0x7d243c47),LL(0x52231b01,0x4a4714a5),LL(0xed3510a8,0xfde7f4a6),L_(0xccb27287), LL(0x1ed13735,0x4721f266),LL(0x5a39f8ef,0xf2889694),LL(0x99b1258f,0x45218687),L_(0x4c27d1de),
+ LL(0xe91d500c,0xcf933e7f),LL(0xb7d6326c,0x2d1ad273),LL(0x572c7767,0x79dbaa6e),L_(0x27d7d939), LL(0x17390032,0x6c991f09),LL(0xed70ac81,0xbaab3191),LL(0xfc86b907,0x93c673b6),L_(0x94754f34),
+ LL(0x3543430c,0xc2f96d5f),LL(0x0ea5f8eb,0xac730ca9),LL(0x376185cf,0xfeac300d),L_(0x41737668), LL(0x96df0a25,0xf035d502),LL(0xb519c6a4,0x9ca93571),LL(0xd64df17a,0x01970aaf),L_(0x18c05bf9),
+ LL(0x471f2099,0xa5fb90b3),LL(0x53b53a2a,0x2aa370a3),LL(0x09b936b9,0xcfb37658),L_(0x83591048), LL(0xb2dfe05c,0x1e8ce8f7),LL(0x70ca625a,0xcf8806b6),LL(0xf062523d,0xa1c74034),L_(0xc4ca8211),
+ LL(0x02fd45e9,0xf0d5ce43),LL(0xf94539de,0x86092a2c),LL(0xc28ad111,0x0990658e),L_(0xfc301c6d), LL(0x850acec2,0x097c875b),LL(0x333c1a83,0x79052ae9),LL(0x651a1ec4,0xdf5b00e0),L_(0x8f342e96),
+ LL(0x7c4aacf4,0x12306aef),LL(0x23bf4f82,0x0369e1f2),LL(0x86d193a6,0x3bdb2181),L_(0x2df259e0), LL(0x4d9c6a9b,0x2e587a72),LL(0x420fa4b9,0xe30d76a5),LL(0xaf97ed7f,0x20fbaabf),L_(0x6c230751),
+ LL(0x044baaf4,0x04047c5f),LL(0x8d43be85,0xe4e3879a),LL(0x436ef7e0,0xed64bf04),L_(0x6b436c30), LL(0xa9c7bdcd,0xc1679bbd),LL(0x12340567,0x38ba10d1),LL(0x83b598cb,0xa99537cc),L_(0xee36e118),
+ LL(0x18eb43ca,0x5aa367ce),LL(0x94ff23cf,0x2dc9b946),LL(0x066d6c04,0x3a41602a),L_(0xfe10e991), LL(0xfcc4d378,0x3dbf71fc),LL(0xd6bc1c02,0xc9ccbaad),LL(0x0aacb390,0x985954f5),L_(0x468870a9),
+ LL(0x1f6e5aac,0x4d58f138),LL(0x088912a4,0x72e75855),LL(0x389e7a2b,0x4b5aa1e6),L_(0x5be86bd9), LL(0x29d90bc3,0xb35b2d2a),LL(0x67e8a5ea,0xaca3b9cb),LL(0x832c687a,0xe2911a57),L_(0xed56df90),
+},
+/* digit=8 base_pwr=2^56 */
+{
+ LL(0x56b1b68d,0xa766a468),LL(0x7a690380,0x7f0a8ccb),LL(0x15b9ce0d,0x8bfb375d),L_(0x0afa00f6), LL(0xe7944b6b,0xe502fd6a),LL(0x0768ebca,0x079ac7ac),LL(0x956dea42,0x3fc3f258),L_(0x78be0f9a),
+ LL(0x7157aab8,0xde649372),LL(0x1fe5b1db,0xec032ca1),LL(0xdc9ac491,0xaf00af85),L_(0x42bf819d), LL(0x3d3a586d,0xb1b4ed91),LL(0xc6e9377d,0x0da4ec46),LL(0x2fb5dda7,0xe69eb235),L_(0xa5e4f04d),
+ LL(0x4a718a91,0x6813c47e),LL(0x520eeb02,0xcc1aaacb),LL(0xbae4540e,0xfd6dde20),L_(0x5d3611cc), LL(0xa139969a,0x47c1ef53),LL(0xa02a9c1d,0xff24f01d),LL(0xa1779b32,0xafe60f72),L_(0x0b879e68),
+ LL(0x6e7fd2ac,0x206a6f14),LL(0x2a13d9f9,0x43a11c7f),LL(0xf31bbf6c,0xe2ff97fb),L_(0x56107ea7), LL(0xb83101aa,0x0b2c24c6),LL(0xdc078721,0xd00a24a9),LL(0xc5ea4420,0x80054822),L_(0x76c2e6e5),
+ LL(0x5d302b86,0xa3ec0bc2),LL(0x58cdfe77,0x7469b928),LL(0xde033220,0x9823907b),L_(0xce8c1169), LL(0x8d35908e,0x668b8357),LL(0x90f7260f,0xcd96886e),LL(0x388da84d,0x8e759b7d),L_(0xf9144eb3),
+ LL(0xb0068632,0xb87f256b),LL(0xd3ec8de1,0xb7562058),LL(0x554d7fad,0x68b8bed1),L_(0x7d3ba275), LL(0x5349ed32,0xaa23f48d),LL(0xf8c55847,0xac744602),LL(0x125ee820,0x150da1ca),L_(0x16333e9d),
+ LL(0x16a4c78e,0x26b49a2d),LL(0x9714ac19,0x69e5dc39),LL(0x50449596,0x2af6b2c1),L_(0xab90cd95), LL(0x07439dc5,0xf5736c67),LL(0x8b3909e8,0xeeb790dd),LL(0x0cc523dd,0xae2f8bbf),L_(0x21833381),
+ LL(0x1c12b2d6,0x7628ecee),LL(0x6d88b422,0x0692cc8d),LL(0x65398808,0x5048f64f),L_(0x0e3b6999), LL(0xd880351e,0xae75c4fc),LL(0x3ffdb69e,0x3e2ff89d),LL(0x5f9ca860,0x435a454d),L_(0xd321ca44),
+ LL(0x1dbe11f1,0x805cdd89),LL(0x0b435944,0x0562fe66),LL(0x5d6a45d5,0xc9eb9f56),L_(0x0394c9fd), LL(0x1fbcb273,0x4b25d574),LL(0x8a17364c,0xb78a31bf),LL(0x1466b27f,0x468c47f5),L_(0xfd233c89),
+ LL(0xb836e3e6,0xf6743281),LL(0xe6b59ce6,0x13f41d4e),LL(0xd77d4340,0x397a6846),L_(0x45693c8c), LL(0xbd735497,0x6560f3f3),LL(0x5f68d915,0x61405ead),LL(0x119c162c,0x9870a7f1),L_(0x8b74bea7),
+ LL(0x4f81eb06,0xdd4548bd),LL(0x271e6f36,0x49ea4452),LL(0xff17a13f,0x54ebcb9f),L_(0x83b9157a), LL(0x3e7236a9,0x4d44b2ce),LL(0x7f67612f,0xfeac4aaf),LL(0x0d85cf3f,0x7d7cb315),L_(0x7efb9b30),
+ LL(0xb0f78faa,0x82bbcdcf),LL(0xf1c04007,0x01559ec3),LL(0x7cdb7afd,0x86ff3957),L_(0xb1597d4b), LL(0x6c320e72,0x45b1afec),LL(0x522b415a,0x9d12c298),LL(0x6b93f2de,0x3e21f849),L_(0x3b1a1d95),
+ LL(0xc12b655e,0x219c2865),LL(0x6265e8e1,0xc6daf8cf),LL(0xf3ec2977,0x10269fa7),L_(0x4486877c), LL(0x8de615f2,0xb448dafb),LL(0xfeda6cb4,0xac03ce69),LL(0x0fd25b12,0xb96afd44),L_(0x0f6ae181),
+ LL(0x069f14f1,0xc970df0c),LL(0x614fb451,0x8cddee54),LL(0x0475ddb9,0xac228ae6),L_(0x3ef6e29e), LL(0xc73f5027,0xbdeb5cb1),LL(0x2198420f,0x82098200),LL(0x8694111c,0xc11479ab),L_(0x25c29038),
+ LL(0x0c73fe99,0x4aa502d3),LL(0xdb603ed0,0x6c27909f),LL(0x4f620050,0xf76957c1),L_(0x0e7e084e), LL(0x1565b30b,0xfba38431),LL(0x95ddd9af,0x65c7038d),LL(0x82a6a124,0xe7db47e4),L_(0x1f3b155f),
+ LL(0xfdab8dbe,0x773fef23),LL(0x70802c0e,0x011efbb8),LL(0x8698e8b3,0xa4f63ad2),L_(0xa90d02ab), LL(0x60003ff7,0x5aebc019),LL(0x586f4378,0x00bcb9de),LL(0x859f79cb,0x6a9d21d2),L_(0x79d6150e),
+ LL(0x8a59362f,0x21480f43),LL(0x37e25e9c,0x4a37a459),LL(0xe55838d3,0x36aab717),L_(0x85a89af8), LL(0x1d33aa1c,0x86dc1133),LL(0xb94719f6,0x0a1e4a76),LL(0xf9d8ea27,0x7a9f7b61),L_(0x2b10e5f5),
+ LL(0xf5ab77c2,0xb7c034fa),LL(0x91179a6a,0x89204639),LL(0xd0dd8159,0x4ba725f9),L_(0x39ccdad0), LL(0xa510602e,0xc72415fe),LL(0x85069c0f,0xa6bc7ccc),LL(0x7d585ae6,0xc90e9462),L_(0x51cea642),
+ LL(0xaed13816,0x84f02e2a),LL(0x24576ca8,0xffdbb5f9),LL(0x3c9269f7,0x5c61743e),L_(0x498dc0e3), LL(0xd5bc6379,0xa9132224),LL(0x10fc37d9,0x12f65fd8),LL(0x817445f8,0xd0c982b8),L_(0x4f79fcf1),
+ LL(0x40f7fe3e,0xcb5018ef),LL(0x2fdb045f,0xf32b39b6),LL(0x621a4bd4,0xe7c33edc),L_(0x04fd5dd5), LL(0x7972a384,0x586d4bef),LL(0x22c07adc,0x81211aa8),LL(0x8c46dfe1,0x5b192417),L_(0x68b0abc0),
+ LL(0x30ddafb1,0xe56640a6),LL(0x55279999,0xe01ca53a),LL(0x6b7735ff,0xa4ba7379),L_(0x1c1eab8d), LL(0x184d5073,0x1f2853f9),LL(0x0a5a3694,0x0c65322e),LL(0x77546dfc,0x814529cf),L_(0x0117bc49),
+ LL(0xe44092c1,0xdcf36025),LL(0x29873c6a,0xa38b0382),LL(0x2beaabb1,0x57dab020),L_(0x4481b257), LL(0x3fc25cda,0x16190d52),LL(0x3dcabd82,0x632514c7),LL(0xc69b7cce,0xcb82be1e),L_(0xcf490cc0),
+ LL(0x79d31337,0x78cc588c),LL(0xd718033e,0x5d3ca504),LL(0x0951b466,0x82b9278f),L_(0xc14b1f81), LL(0x6c160f3e,0x308d56c2),LL(0x833254cc,0x460ed897),LL(0xcccc63ee,0xd27b55ac),L_(0xdf9c95f1),
+ LL(0x2097cb5b,0x6fb48059),LL(0xc33f19e6,0x8b4a82f4),LL(0x3bf0f71b,0xda304a5b),L_(0x7efe85d3), LL(0x5d609c9e,0xb32599e2),LL(0x7d311503,0xea5b4566),LL(0xc072d5ff,0xf9f2dc57),L_(0xf9df545e),
+ LL(0xdacba736,0xbc32b9c9),LL(0x0ab7c149,0x154849a8),LL(0x29e4dd9b,0x11dfc29e),L_(0x41ace68f), LL(0xc8616f74,0x971ba9a3),LL(0xb0be2d45,0x15776b0b),LL(0x8325c930,0x294a4ec5),L_(0x455623af),
+ LL(0x16f8969c,0x235d5c34),LL(0xb8ca3700,0x57aa97da),LL(0x5c79afae,0x417467c4),L_(0x796984ff), LL(0xe7950969,0x59ca92ce),LL(0xcd03a014,0xb1a7c34d),LL(0x6203a921,0x066a9647),L_(0xd0909f6f),
+ LL(0xfb7e2684,0x84d55477),LL(0x0c455cdf,0xbdee722d),LL(0x74bfcbf4,0xf514f2bf),L_(0x8a60e5e7), LL(0xba7058a4,0x4713d1ae),LL(0xecf4c404,0xa6c17b5e),LL(0x8941ddd8,0x261d9ac7),L_(0x7f2f5187),
+ LL(0xac5e5ce7,0x76370390),LL(0x64cf9d29,0xfce7f694),LL(0x7c34fbe8,0xe3b42849),L_(0x6bc43f22), LL(0x8781925b,0xe273ae40),LL(0x49d3a7bb,0x777881ae),LL(0x6fc64556,0xb0f8e854),L_(0xb4b40191),
+ LL(0x024a93d5,0xa6b66d66),LL(0x4f2aaf4a,0x56c335ae),LL(0x0805e125,0xe1e39e4e),L_(0xb67d8a1b), LL(0x9bb438e7,0x0e8dde7c),LL(0x24683c26,0x06a38af7),LL(0xa234eb6c,0xd74870f8),L_(0xfa606ebd),
+ LL(0x05b51c3a,0x62d8ac43),LL(0x8c1548ed,0x8eefcd86),LL(0x3b151865,0x3c047e9d),L_(0xf77c0004), LL(0x76ea2961,0x82998a41),LL(0xa3b38ce5,0x110b3b2e),LL(0xbcfe60ba,0x89b19d6d),L_(0xe68575e8),
+ LL(0x8765ec49,0x36e47913),LL(0xc6e4ab7e,0x767e806a),LL(0x81bc9bd7,0x38103684),L_(0x5490cabd), LL(0xb8107b91,0xbe9c24b5),LL(0x63e98957,0x43623ea0),LL(0xf06a675d,0xcbeab5be),L_(0xf0e9a898),
+ LL(0xd064269c,0x1ccbf4e2),LL(0xfe422ab3,0xe21fbca6),LL(0x5cee0a5c,0x263913a5),L_(0x71de7df5), LL(0xa3fc8bae,0x047f1949),LL(0x0df59ed6,0xd1a5d116),LL(0x35a0d475,0x9e3419f5),L_(0x75946143),
+ LL(0x36c9f809,0x631145ae),LL(0xa1db7d1d,0x0c423276),LL(0x4bf70210,0x2f1584d5),L_(0x8bd52dbd), LL(0xa19699d2,0x8015f024),LL(0x37a40f15,0xf9755c59),LL(0x25538f41,0x387ddb31),L_(0x90af00b0),
+ LL(0xe8509934,0x9e321e61),LL(0xd2850d36,0x7dc68e41),LL(0xf8206e77,0x58e783b2),L_(0xe67a1042), LL(0x906883cd,0x6f41c769),LL(0x51b97936,0xbb9527f5),LL(0x38e2f27d,0xcf17789e),L_(0x5273cd0e),
+ LL(0x1bf5a9fa,0xae648e71),LL(0xde909240,0x3f5f8275),LL(0x93245241,0x80482c3b),L_(0x0a2260c5), LL(0xef9f19ab,0xaa9e665a),LL(0x1eb26ff8,0xad522975),LL(0xce379c80,0xf8653e32),L_(0x4f190ba9),
+ LL(0x19d1e571,0x4023698a),LL(0x4e5e5355,0xa19db2ab),LL(0xd2800586,0xaee5fc4c),L_(0x115617f9), LL(0x378c9aca,0xbcb82922),LL(0xfb1dcef8,0xc3b8fa14),LL(0x1b19035c,0x1c3a4f74),L_(0x190f3cd7),
+ LL(0xf201d617,0x88de2216),LL(0x778baf2f,0x409f13a5),LL(0xfc1697ff,0x1f4ee383),L_(0xf8b34103), LL(0xc70f2c0b,0x596702b2),LL(0x40ecf08e,0xaa0989d3),LL(0xcc60a8c2,0x5ba1fcbb),L_(0xb0f51744),
+ LL(0x3f768dfe,0xee929e0b),LL(0x5c573a73,0x171719ed),LL(0x91e6ec5d,0x48549719),L_(0xb182f69c), LL(0xa3e2860c,0xa30f11a1),LL(0x5e01688d,0xf804fa42),LL(0x58c435e7,0xd81ff657),L_(0x49e16053),
+ LL(0x3ee264bb,0x6d74b27a),LL(0xcb2992ae,0x776b6b64),LL(0xa97538c5,0xdc494d53),L_(0x282ddfc8), LL(0xe4acc7fe,0xe5d1ac83),LL(0x81afb14c,0xf0a59879),LL(0x9b5f787d,0x0730aa6b),L_(0x76168d56),
+ LL(0x5d202341,0x15ca4cef),LL(0x67cf5e49,0x03078647),LL(0x7cbaad05,0x7a152a3a),L_(0x93ecdb65), LL(0x5c759c30,0x1d48b5cf),LL(0x8a07288f,0x954731e0),LL(0x67babf9e,0xb890cb9b),L_(0x3f7cb4f5),
+ LL(0xfbda2539,0xd314af3a),LL(0x66f79c66,0x333f8c94),LL(0x07bcc285,0xd37bbc81),L_(0x1102429d), LL(0x7ba7309f,0xe5686c59),LL(0x647c832d,0x96218ea6),LL(0xbfb2d48e,0x7bc6fa2a),L_(0x524c8c0d),
+ LL(0x91273fc1,0x9f330845),LL(0x6f3e8880,0x8d3155c8),LL(0x229515d9,0x4e0d0091),L_(0xa37bad0a), LL(0x3cca8a71,0xc538ea5c),LL(0x34161b0c,0x7f68ef37),LL(0x412db800,0xfc39477c),L_(0x5112c574),
+ LL(0x202d77d0,0x3f50f1ae),LL(0x56e724be,0xc9d43dee),LL(0x2163dc89,0x82838e71),L_(0x3e07b5b6), LL(0x68b2f3b5,0x028beb58),LL(0xfb4f5d6e,0x2f67136a),LL(0x63c11941,0xf0576d72),L_(0x36e94125),
+ LL(0x79a7908b,0xfe08b743),LL(0x7ec4b29f,0xe4c9aa01),LL(0x3121fc40,0xe6d6660d),L_(0xa4b98339), LL(0xcc2b942f,0x54acd180),LL(0xc715b5ed,0x4b3ac4d4),LL(0xde75824c,0x91ca23fa),L_(0xe3ff9f1c),
+ LL(0x46582483,0xa927f3c9),LL(0xbac6e7bf,0xe88a430f),LL(0x1f445777,0x3e33ca59),L_(0xbdfe1920), LL(0x71dd2627,0x54a8126d),LL(0xebc9b59a,0x9c986433),LL(0xbec3ed13,0x71db698f),L_(0xd57f9239),
+ LL(0x731eb54d,0xa93b1752),LL(0xa3516b9e,0x6f7bfa08),LL(0x873d3a45,0x4f66d06f),L_(0xbdd10c66), LL(0xc97be3e7,0xf6435b79),LL(0xa3533348,0x207b9b6c),LL(0x1c6c74ae,0xb64b6b70),L_(0x9037812e),
+ LL(0x74ccc35a,0x4be5a10b),LL(0x425bdafc,0xb790b940),LL(0xc32a94b3,0x098b38b5),L_(0x026ae426), LL(0x4ef7c297,0x18feb7b4),LL(0xda85e218,0x6f3016a8),LL(0xad72b80e,0xbdf2db87),L_(0xa853e440),
+ LL(0x0ca1adfe,0xb13f2859),LL(0xbd4a0fb5,0xd393e869),LL(0x277e9cd1,0x90b15b52),L_(0x30056558), LL(0xf705f505,0x2c2d2fb1),LL(0x2c3d697e,0xf49260e8),LL(0xcb991398,0xfed48a8d),L_(0x6c792dc1),
+ LL(0x2687c048,0xc3ca0fc2),LL(0x97ff87d8,0xbb9d5b5b),LL(0xe241d7c5,0xef9d2be9),L_(0x4d4d8a9e), LL(0xfe8acc57,0xc5011f32),LL(0x499812d3,0x8545eca9),LL(0xfa8d83be,0xc270dd4a),L_(0x162b0c9f),
+ LL(0xb3951e09,0x78a942de),LL(0xc228c3e5,0x57fae761),LL(0xbc46ee6e,0x83169c42),L_(0x1aeae5f1), LL(0x340fc522,0x669821ab),LL(0x51be95bf,0x09548071),LL(0x92a505ce,0x83ec59bb),L_(0xd2e39c6b),
+ LL(0x3ce8adaf,0x41ed0956),LL(0x8981ccd6,0xc0e55576),LL(0xba8eb552,0xa018b90e),L_(0xf5b2000d), LL(0x67316d00,0x5703fba5),LL(0xf9b6f0d3,0x6078c1e3),LL(0x99f221d3,0x047eec80),L_(0x5f0d4326),
+ LL(0x81739c80,0x6f11b810),LL(0xf085c79b,0x1e31485f),LL(0x9ddc21df,0x18e4d189),L_(0xbe0bc274), LL(0xe78c5638,0x439dc1dd),LL(0x63733145,0xa22acbf7),LL(0x9f469794,0x161460c0),L_(0xaa724fea),
+ LL(0xcd4a85b1,0x7e2cff5d),LL(0xaf20e779,0x998dca20),LL(0x3d5bd0f7,0xbfc65978),L_(0x4e61a410), LL(0x388987a1,0x9b689b7c),LL(0x04dbc066,0x3ea487dd),LL(0x5b3b94d0,0xa77864e1),L_(0xe89088a7),
+ LL(0x39413fae,0x796a4cff),LL(0xd204de5d,0x978f94f4),LL(0x2c42836e,0xdabb2333),L_(0x20078e8b), LL(0x683de92d,0x5fe8df50),LL(0x14c267e5,0x705a1d2a),LL(0xf68dcb2c,0x16e49003),L_(0xcbb04811),
+ LL(0xc7d4f66e,0x02ce592d),LL(0x6c59b80b,0x449fe24e),LL(0x49708f6f,0xe167be96),L_(0xfb3a4da9), LL(0x7456adb9,0xafdb07bc),LL(0xa22499e7,0xfc9ec5ea),LL(0xb52ff28e,0x55b069a6),L_(0xc0fc9e6f),
+ LL(0x1b0cec1b,0xf4484ca3),LL(0xb1289e3f,0xde798873),LL(0x05b5ac5f,0x87ada89d),L_(0xf204ab3d), LL(0xbc022acb,0x93b1313e),LL(0xd2127d5a,0xa4d90949),LL(0x71a6efc0,0xd897f8e5),L_(0x88e1bcc1),
+ LL(0x5f811bb3,0x9a725a78),LL(0x9323ffc2,0x1f6cfcf3),LL(0xe1abeb72,0x6d3872f8),L_(0x71c9aa7f), LL(0x90cec4c5,0x400da758),LL(0xdb55d5c9,0x74d4d54c),LL(0x6fed8555,0x4bc5cda0),L_(0x99c927f2),
+ LL(0xb4a54352,0xa9b678d4),LL(0x21c3a4ea,0xf079b22c),LL(0xcd89ee25,0xec3738e6),L_(0x12db8e7a), LL(0x17543420,0x3b3edf75),LL(0x83b1a5b2,0x46732c66),LL(0xcfead94a,0xa689fe7e),L_(0x658ac775),
+ LL(0x91cb6be3,0xa3af0a2d),LL(0xaee7da78,0x37e8c56d),LL(0x44cf93c9,0xc55af358),L_(0xb97c6473), LL(0x2941f1b7,0x85525c49),LL(0x9ccf06d0,0x7fe18358),LL(0x32c35949,0xbf4a513e),L_(0x48b1c1e8),
+ LL(0x8adf6262,0x6619bed5),LL(0xdba7f0af,0x5bb1a013),LL(0xdac22d18,0xe70d7542),L_(0x0c259dfc), LL(0x0bfa91a2,0x195a05ff),LL(0x1ebdd562,0x52bb429e),LL(0x34d0f00f,0x904ed07d),L_(0x9b10bb9a),
+ LL(0x4331ebb9,0xf071319d),LL(0xa2d5580a,0x05e7c4f1),LL(0x1da3b676,0x7abf809c),L_(0xcca6bf1e), LL(0x9290a718,0xf68174d5),LL(0xc59959c4,0xa93e4d89),LL(0x7f4cbc44,0x93b784f5),L_(0xe5e1c561),
+ LL(0x7b8373a6,0x1bf6e31b),LL(0x242d1745,0xb8888fa2),LL(0x010ee8af,0xa7cd3971),L_(0xa9bf1772), LL(0x7e33265e,0xc3866a61),LL(0x541559ba,0x9e1bb3ef),LL(0x9be25bb9,0x1c158895),L_(0xd26003c0),
+ LL(0x187246e5,0xcb1700db),LL(0x97112d61,0x3aa73e7a),LL(0x93e55e2b,0xb2ba60e5),L_(0x34003d9b), LL(0xbcfa0107,0x253d2d5c),LL(0x43a49e2d,0x9fa1e7c7),LL(0x04ad0152,0xd483d4ee),L_(0x05755d69),
+ LL(0xd95b8ba9,0x1d6eb61c),LL(0xeee8e590,0xc7ef0d05),LL(0x47b3133d,0xf255931e),L_(0x31eb4e09), LL(0x60b98075,0x2344f6b6),LL(0xe87936e7,0x789f9ba9),LL(0x00302e85,0xccdbabda),L_(0xa2a5f4eb),
+},
+/* digit=9 base_pwr=2^63 */
+{
+ LL(0x228b3a55,0xd1e183b4),LL(0x3a405373,0x4948ad88),LL(0x18288fb9,0xf45f24f0),L_(0x04bd162a), LL(0x37574ace,0xe86d0db8),LL(0x7b9a4c64,0x1ccef3f8),LL(0x451b09b7,0xee7d7495),L_(0xdc28df83),
+ LL(0xd52a1c1f,0xd08a8ae3),LL(0x7151a72f,0x750d587a),LL(0x03e86cff,0x27e73149),L_(0x59e2acdb), LL(0x527a9878,0x96f4a96b),LL(0x84533bc0,0xe4a1f248),LL(0x038153e5,0xd9998bb3),L_(0xea910931),
+ LL(0x281ef607,0xee8331e0),LL(0x9f73b6f4,0x71264952),LL(0xa04c6f5a,0xecfe722b),L_(0xd447f9c0), LL(0xbb4ca37b,0x8ff53f4b),LL(0xf450eeb8,0x42ab819f),LL(0xb862be64,0x8ba40994),L_(0x7a08433e),
+ LL(0x3c280033,0xa9734b49),LL(0xa8e0d0eb,0xb12f26d4),LL(0x3686d2f0,0xe0111b72),L_(0x1e11df0d), LL(0x7a48dabb,0x069099d5),LL(0xefbc8fff,0xaba55aec),LL(0x6cdc05f3,0x4ea7440f),L_(0x7409d1a4),
+ LL(0x4a159950,0xe99a66d4),LL(0x35d9b8b9,0x4d054e48),LL(0x924ebb42,0x155f0d8c),L_(0xcc5645dd), LL(0xe319a1e4,0xe6d591f2),LL(0xdce90cf4,0xe9b13d21),LL(0x0834867a,0x39cb42c0),L_(0xb288b9e8),
+ LL(0xb4a0a7e4,0xd28d49c3),LL(0x034fe0f1,0xab2cbbd4),LL(0x4cb47055,0xcd15bd1f),L_(0xb122fe53), LL(0x16ef99e4,0xb349d462),LL(0xaa28568f,0x746c4b40),LL(0x4dce044a,0x56cf52da),L_(0xce7ffcff),
+ LL(0xb1b9c2ea,0x0196cebe),LL(0x26971900,0xdb961af6),LL(0x51023370,0x68f286d7),L_(0x840c2641), LL(0xad763cfa,0xa07bb401),LL(0x722e5f14,0xab25bfde),LL(0xac71bbe8,0x06a272b6),L_(0x7294da0b),
+ LL(0xd727b459,0x6aab9dfc),LL(0x67ba95ef,0x695de10f),LL(0x078f906d,0xa987a86e),L_(0xcc5262f1), LL(0xd50493d5,0x3eb5588c),LL(0x1854cdec,0xce9abc84),LL(0x101a021e,0x2ec773ad),L_(0x9a126518),
+ LL(0x7bdb0ab3,0xb55a240a),LL(0x520772fd,0x06998947),LL(0xf475a7f2,0x04f12f32),L_(0xb6d5b226), LL(0x688143be,0x73021050),LL(0x2e88c6c2,0x325ed38e),LL(0x8114699d,0x467cd567),L_(0x2d56b4f2),
+ LL(0xcbfe120c,0xe69958d1),LL(0x952433b8,0xa2e1385b),LL(0x9586b08e,0x8d8876e4),L_(0xc1845358), LL(0xe749a358,0x85028619),LL(0x0332f81b,0xf41d9b86),LL(0x8430e884,0xe0fe7436),L_(0x5fa0aa6a),
+ LL(0xe20a701c,0xbc42935f),LL(0xa8797955,0xaf260957),LL(0xb55c4fab,0xb5f1b7b4),L_(0xbb614800), LL(0x3e2c715b,0x61856276),LL(0xd080dc4d,0x447c4418),LL(0xfaf57b99,0xa5a859f6),L_(0x450d5963),
+ LL(0xa50c7da0,0xaaf263e7),LL(0x431eb854,0x27bdb99e),LL(0x28bc6b58,0xa291a83e),L_(0x18ba826c), LL(0xe155fe7b,0xa92f7c72),LL(0x42ebeb92,0xfdebd3d9),LL(0x54ea2480,0x1d9b3247),L_(0x01266a3f),
+ LL(0x3bb14261,0x40205f43),LL(0x83f98334,0x1e5b99d9),LL(0xf68ea4a3,0x99449ff0),L_(0x73052363), LL(0xb4680c54,0x6506393b),LL(0xe10ba403,0x9fa16280),LL(0x355805ad,0xa8869c1e),L_(0x3bd33351),
+ LL(0x1fe90871,0x60faf2a7),LL(0x26d3ca4b,0x74445704),LL(0x97761552,0xc6294a8b),L_(0x5d498659), LL(0x8306971f,0x79313f41),LL(0x12b7cc1a,0x459c33b3),LL(0x5ff5c231,0xa47413df),L_(0x77510e5a),
+ LL(0x8931a00a,0x1bb13907),LL(0xb77711c8,0x6e5d6bd8),LL(0xf62b4e1f,0x419ecc6e),L_(0xad753454), LL(0x2e05fe27,0xa9d7ebb7),LL(0x0a367c60,0x46afc58b),LL(0x2c8381f8,0x243d0786),L_(0x4a4e4910),
+ LL(0xa5a5886b,0xd9832e54),LL(0x5cc2672d,0xc764b06f),LL(0x38ed1085,0x7eb63b3e),L_(0x98a773f2), LL(0x585bdb21,0x8a62c89d),LL(0x4ef6df8a,0x5e301e9c),LL(0x35b91587,0x4e488867),L_(0xee5d5725),
+ LL(0x9471249d,0xcfed9152),LL(0xfe397a39,0xf83f6a41),LL(0x859a1f08,0x67c5e1b0),L_(0xd1f44f7d), LL(0x40557a71,0xa37c1374),LL(0x124aed5a,0xecd05a92),LL(0x7635cd74,0xccd0d7f7),L_(0x05c36045),
+ LL(0x02596d64,0x81ed48b5),LL(0xfe6d2634,0x8ec54e24),LL(0xfd23aeec,0xa7513cf4),L_(0xf5285343), LL(0x8f6097de,0x2a1c180b),LL(0xe4bdeb22,0xacdc4130),LL(0x253dbb93,0x9daa0c3e),L_(0x05a30794),
+ LL(0x5f61e12e,0x3336043a),LL(0x083aa9bd,0xa83c1fea),LL(0x77fedd08,0x64002d5d),L_(0x131fc28d), LL(0x08aaa0aa,0x210df7fe),LL(0xdba1334e,0x6b43ad20),LL(0x98ade169,0x42a1a05e),L_(0x912ea208),
+ LL(0x6e92d486,0x8a6e2064),LL(0xc3bdcf88,0xc92637e6),LL(0x4ee89ae2,0xa8cbe2a0),L_(0x8fe2ce18), LL(0x688111d3,0x1fafd02e),LL(0x3e63b605,0x315d9dc5),LL(0x0cd0654b,0x02890b79),L_(0x37460a53),
+ LL(0x131fab04,0x1ac884b5),LL(0xfe807119,0x8a1a27c6),LL(0x66f76b97,0x254a6db2),L_(0xdb8b9dad), LL(0x17450bad,0xd2c4396b),LL(0x24d3388b,0x2691986c),LL(0xd9864a47,0x31c0544b),L_(0x73b25e3f),
+ LL(0x2f0f74a1,0xf3ddaad3),LL(0x4dc5341d,0xa0f85073),LL(0x55736fde,0x9f28ac0a),L_(0xdb012f27), LL(0x5b08d300,0xaaec443d),LL(0xa313b8a7,0x9fd17e0e),LL(0xb4213134,0xf10e3114),L_(0xf370d32c),
+ LL(0xd9301e92,0xa6577039),LL(0xdfaeb17e,0x50e6f1b8),LL(0xf5e86ab5,0x58a7b434),L_(0xff883f58), LL(0x2f0371f5,0x1d3d9546),LL(0xcbb7b3e4,0x39c8d544),LL(0x12bf2df1,0x57a123a0),L_(0x1f072a24),
+ LL(0x817dc76a,0xfd0338c3),LL(0x991da89f,0xb99ba801),LL(0x36e30856,0x1dcffb49),L_(0xc7872aad), LL(0x665a28b5,0xf1016ea1),LL(0x290f4c2a,0x86a30740),LL(0xc3331f1b,0x0205d1d8),L_(0x7458d6c0),
+ LL(0x86281810,0xd7ae93c1),LL(0xe873393b,0x227716fe),LL(0x736914e5,0x605a49ab),L_(0x963a1b41), LL(0xa3fd7cc5,0x99cf069a),LL(0x4d54cee8,0x93c53857),LL(0xdc5b96cb,0x080bcc0e),L_(0x137d0d8d),
+ LL(0xf2335efc,0x398d73b0),LL(0xf7bd4b8b,0x00bb4ee4),LL(0x212ffe0a,0x7ab2ea4d),L_(0xa520fad3), LL(0xe2f332a3,0xeeeaddc8),LL(0x55e1d6f7,0x2962d309),LL(0x143e5fcc,0x49553c63),L_(0x65652ccd),
+ LL(0xc941479e,0x203c4316),LL(0x8084b17f,0x855dab4e),LL(0x717ef700,0x4ed7e83c),L_(0x663074c4), LL(0x494ccfdf,0xe90530ff),LL(0x74fb2c41,0x8222ad9a),LL(0x4430a4d7,0x252e55b2),L_(0x1ff22265),
+ LL(0x96506aa4,0x3f484d6d),LL(0xa163cb06,0x10e92da8),LL(0xbd490fb2,0xffd03214),L_(0xac263c3b), LL(0x95792258,0x7dfe3775),LL(0x448fd584,0x9120d23f),LL(0xe2412ec1,0x1de70984),L_(0xa0573144),
+ LL(0xcb479a8a,0xe7cc4f73),LL(0xb248d660,0x1382187b),LL(0x9dc7e0af,0x01c1bd80),L_(0x5c60ddc2), LL(0x7d0256e8,0xbd971088),LL(0x0fcea0be,0x7ac3d22e),LL(0x36e29a92,0xecf0d361),L_(0xacf3f8d3),
+ LL(0xbb9273ca,0x4c568852),LL(0x92c61bfb,0xf3f274f4),LL(0xb258fcff,0xdee7fe95),L_(0xd7eec021), LL(0xea16df72,0x3f7227a1),LL(0xef526f6f,0x8865b774),LL(0xc554b491,0x10280ec0),L_(0x0822704a),
+ LL(0x0aaf5933,0x600576a1),LL(0x3b11f02c,0x63228df6),LL(0x7b64399d,0xb12890cc),L_(0xcd17f990), LL(0xf166eabf,0xa3e9c521),LL(0x6f888420,0x01f649df),LL(0x33266d1a,0xb179110c),L_(0x31f1eb1d),
+ LL(0xaedb7e52,0x2d780714),LL(0x4aebd349,0x76c48d10),LL(0x95533ca3,0xef834a13),L_(0xf261039a), LL(0xbb0ea84d,0x8bf5f008),LL(0x2b897924,0x0c5e907a),LL(0x5462d73b,0x1d6aecec),L_(0x030fd964),
+ LL(0xb5bf76f0,0x2e91623e),LL(0x3010a109,0x1415663c),LL(0x15fea421,0x1f1c3707),L_(0x7f39476e), LL(0x03dd8ccb,0xb068031e),LL(0xd4fde062,0xd50a50f3),LL(0xbde1692d,0xc8df6655),L_(0x8e9ba050),
+ LL(0xa49675bf,0x923698c8),LL(0xf646ab4e,0x9ea67a41),LL(0x67f23bf8,0x4444d11f),L_(0x4ac9487a), LL(0x05829e1a,0x18b3a870),LL(0x354f585f,0x8b8364e8),LL(0x917428eb,0xafd1b685),L_(0x4487c137),
+ LL(0x5cdc38f6,0x8bdefd85),LL(0x9e5f8f08,0x60854dcf),LL(0x5650f1c2,0x3d41abd0),L_(0xc6e01f27), LL(0x338d5d08,0xd45495b6),LL(0x3b1465b1,0x10d2d56f),LL(0x05c210e8,0x2709cd44),L_(0x48f63367),
+ LL(0x3d513963,0xb778f7da),LL(0xbe45c33d,0x237a1a75),LL(0xb843c30f,0xfe6c9001),L_(0x2fb3bb50), LL(0xb7f1d85f,0xdfc37735),LL(0x9212109f,0x63ca258a),LL(0xbcb01029,0xaad826a1),L_(0xad2340f1),
+ LL(0xf2d99edd,0x3824eb60),LL(0x40c15d61,0x96cabc5a),LL(0xdb4188d8,0xe5012748),L_(0x8b0b38b2), LL(0x100a7042,0x73b6c9c4),LL(0x51b0b8d4,0x4b2e4ffc),LL(0x3c179919,0x35fd801d),L_(0x4079a1e8),
+ LL(0xfba7fe0d,0x71487144),LL(0x74cace4b,0xa5684724),LL(0xde29806b,0xaf1f4b15),L_(0xd8b8bd38), LL(0x0418df99,0x3da078d2),LL(0xd3aa1585,0x9504ef03),LL(0xd6fca127,0x68282ff5),L_(0xc362d893),
+ LL(0xa4371234,0xf24ea908),LL(0x602bf155,0xbf610641),LL(0x751d8536,0x169f256b),L_(0xd3de9a54), LL(0xa7afba2c,0x66d0d844),LL(0xc7851ba8,0x292f0813),LL(0xb9773f57,0xc95c32ed),L_(0x5941d955),
+ LL(0x931f72a9,0x2d2921a4),LL(0x0d1c3a96,0xaabec6ae),LL(0x93be322a,0xe0530ac5),L_(0x68a2485a), LL(0x21ed4c4b,0x3539fb21),LL(0xbd921069,0x54c5601c),LL(0xff29a4db,0x33f41e0a),L_(0xb292275c),
+ LL(0x92370d4a,0x2b5f5d00),LL(0xb56aebc7,0x9ce3670d),LL(0xc246a235,0xcfeee196),L_(0x6a801585), LL(0xc688f199,0xc992ad9e),LL(0x47950bdf,0x3828369e),LL(0xc2172706,0x9016c246),L_(0xa7002475),
+ LL(0xd8546f63,0xf288a32a),LL(0xe74ad8ab,0xd866770d),LL(0xa8e0a566,0x41c5b1a5),L_(0x0d4e95a9), LL(0xc8eca337,0x06f5713c),LL(0x1b3285da,0xaf5394d4),LL(0x1c420a16,0x05bdbb33),L_(0x57e5568c),
+ LL(0x8e6a5c3f,0xf167321f),LL(0x12138692,0x4806da87),LL(0x98fd2767,0x23e3b0df),L_(0xc297c470), LL(0xde00e6e5,0xa65aaac7),LL(0xb2271037,0x603b9246),LL(0x39526356,0x6098239e),L_(0x06050e2a),
+ LL(0xdf432ea4,0x989bae16),LL(0x1d1be94f,0xcdff8337),LL(0x1f3f8b31,0xe12f868b),L_(0xeb8efb64), LL(0xc59a6e03,0x3e2e2a6e),LL(0x10ffb8b9,0x35623aa8),LL(0x66bc9d0b,0x419d9c04),L_(0x56947a3b),
+ LL(0x3e403fae,0x80a49b71),LL(0x85262cb5,0xa16aaa21),LL(0xc0552283,0x941ac341),L_(0x2ed3e3d7), LL(0x78d10e08,0x9e2010ad),LL(0xd7abaaee,0xc3d626db),LL(0xad4eebe0,0x616d3812),L_(0xa0fef6e2),
+ LL(0xa85af3a0,0xc44a4210),LL(0xb9a6a0f3,0xd700b9c8),LL(0x00fd9c15,0xaaeaf056),L_(0x882ae9df), LL(0xcc55572c,0x58e16fee),LL(0xa9e63498,0x224b2130),LL(0x27e82ee6,0xe838331f),L_(0x34f7549c),
+ LL(0xf7314698,0xc2d9578c),LL(0x2c89ffc1,0x28f766e4),LL(0xe5782e17,0xdb1237a2),L_(0x38920553), LL(0xdcb19e7c,0x382be491),LL(0x067bb8d7,0xf76d352a),LL(0x0749b544,0x7968d6a8),L_(0x9449b345),
+ LL(0xceb29d97,0xe4a0f31c),LL(0x468714c4,0x62bd6085),LL(0xc9e0da34,0xd2a91a43),L_(0xf8dfc14b), LL(0xf153aa4b,0x13715918),LL(0xf2418048,0x5c701eb3),LL(0x3cc2d39d,0x21bc78c7),L_(0x14e1c5f8),
+ LL(0xd3a03cae,0x5f6a9d91),LL(0x6557c299,0x3753e068),LL(0x733ae857,0x58532343),L_(0xb7e14afc), LL(0xc858b2c6,0x423a2e5e),LL(0x1ec4f502,0x03c6d3e7),LL(0xbd4e4f93,0xb99af7a6),L_(0xb21da53e),
+ LL(0x74665b48,0x00f3a821),LL(0xc7e083f5,0xbb254497),LL(0xae564546,0x09235190),L_(0x0cb8dbf2), LL(0x148c2b65,0x44c9ade6),LL(0x5f11dd78,0x01120f40),LL(0x2095b0d0,0xc2cfde05),L_(0x755f44dd),
+ LL(0x9096ca16,0x0b95bea1),LL(0x6343ed3d,0x92a3cb12),LL(0x403109c3,0x67ede54a),L_(0x8fa7e763), LL(0xd330e123,0xe94c1522),LL(0x853e450e,0xcf570b75),LL(0x8c60e503,0x7b779c33),L_(0x372ea779),
+ LL(0xb7a09ebb,0xb7df5c36),LL(0x6843f859,0xda7c16c6),LL(0xea76230d,0xe12538a4),L_(0x3c692e2d), LL(0x35168d67,0x22a3c5aa),LL(0xcf2d3469,0x90a1a3b7),LL(0x488f516d,0x4a17692d),L_(0xa3eac98f),
+ LL(0x979163b0,0x5261367c),LL(0xa9ef4f26,0x2b64c77e),LL(0x121123d3,0x57b5327b),L_(0xbd85c013), LL(0x60be5341,0x4320f770),LL(0x376a3aff,0x80d5de37),LL(0xbfa35c85,0x804730a8),L_(0xe518a7ff),
+ LL(0xfec3e94d,0xe49a8416),LL(0x5dc38222,0xebea12bc),LL(0xd561b8e1,0x1b6939a7),L_(0x839a2cae), LL(0x689cf9a5,0x0a52d61b),LL(0x69ef35c2,0x2707af62),LL(0x00163171,0x888d6c2f),L_(0x7f4b170c),
+ LL(0xcfab7c65,0xd2cae7f9),LL(0x327075e0,0x10e60343),LL(0x1e1d00e2,0xb1b2d682),L_(0x25112a63), LL(0xbc56c4aa,0x87923cc3),LL(0x3318db1b,0x05fa3aa6),LL(0x07ea55ed,0x08a82010),L_(0x759b62e0),
+ LL(0x5178b724,0x10a520c7),LL(0x4dacb0ee,0xb1fffc0c),LL(0xbbad0a50,0xab6af890),L_(0xdf72a4c4), LL(0xf8407691,0x2bcfca02),LL(0xeabf10ce,0x56944f45),LL(0xaab35dc1,0xa5c174f8),L_(0x319513dc),
+ LL(0xd8227573,0xfd6ac99b),LL(0x15483af2,0x4081f3db),LL(0x7e998f3d,0x08e76dcc),L_(0x6a8419c8), LL(0x1c7b8f2c,0x0551cbe8),LL(0xb6e1d5cf,0x045398f6),LL(0x93712a63,0x31b716ac),L_(0xc002e0c5),
+ LL(0xf2590189,0x1074bc24),LL(0xb0d09d0a,0x9d9df6f5),LL(0x1a06a2f7,0xf880ea5b),L_(0x633280dd), LL(0xe509ec7b,0xc7021265),LL(0x2310dabb,0xe9189561),LL(0x09271f5a,0x910bdd23),L_(0x633a882b),
+ LL(0x258fd823,0x28518543),LL(0xc6491408,0x338b1787),LL(0xc4796256,0x636fbcb3),L_(0xe0ed072a), LL(0x0aff7ca1,0x9306ff92),LL(0x8d3bca69,0x6a18552b),LL(0x5ba5cce7,0x563c7d80),L_(0xb0af6818),
+ LL(0x0a2d6942,0x682b34d2),LL(0xab8f78d9,0x467f7fe4),LL(0xa7e4e833,0xfb7c4f69),L_(0x0e7bfaa4), LL(0xd5513496,0xc4ac863c),LL(0x9b356137,0x74229c34),LL(0xd5e5f34b,0x729a99ef),L_(0x3111277a),
+ LL(0xca92d3bf,0xacf9987e),LL(0x5bcd837b,0x84c9d53e),LL(0xa434a89c,0x0ac3dbe1),L_(0xcc196982), LL(0x05a4b105,0xbbe7f4a2),LL(0xdc365bca,0x2222c71f),LL(0x0091add4,0x5e600780),L_(0xc0e95213),
+ LL(0xe0a35b2a,0x5acac230),LL(0x8afcf7dd,0x5089506e),LL(0x57de9730,0xf05a525b),L_(0x91a6dc15), LL(0x8c76bd09,0x74d9f43b),LL(0xa8508401,0xdca2c05b),LL(0x4bcbac2f,0xdc6633b9),L_(0x369c598b),
+ LL(0x1bc30bdf,0xa7ddd558),LL(0x2b2504d6,0xe21dd977),LL(0x66baebc4,0xb4d573cb),L_(0x9f9fe00a), LL(0x352d2cef,0x3c8cf82d),LL(0x5dca0593,0x12474a96),LL(0x8d29a0c1,0x55049164),L_(0x861192c4),
+ LL(0x8806d22e,0x827b3141),LL(0x25ab2860,0xc0bcac45),LL(0x45f1bee6,0xe2c1046e),L_(0xc00e053d), LL(0x0b973abf,0xc60d4681),LL(0xa5d34050,0x05dd04f3),LL(0x1ae3e5bf,0x64bbe857),L_(0xc97287f7),
+},
+/* digit=10 base_pwr=2^70 */
+{
+ LL(0xa40697e4,0x6dcf122e),LL(0xe4c0167a,0x179d681e),LL(0x177fcb32,0x2e1c6f2e),L_(0x52ddbb12), LL(0xdfe5e465,0x4c70a028),LL(0xd6ef3161,0x6183ea61),LL(0x4d64db2b,0xd053bce3),L_(0x260d4eb6),
+ LL(0xe6f3cece,0x3c37feb1),LL(0xc31c16a4,0x857f0262),LL(0xbbc0b11e,0x091b8ddb),L_(0x5637b740), LL(0x8541cfa7,0x772c3ab4),LL(0xc2c0eb60,0x71e71bdf),LL(0xcd2d8bee,0xd29d11b6),L_(0xb9533c16),
+ LL(0x4b9ffc6b,0x8ee5427c),LL(0x10f45410,0x997ab138),LL(0xff6b61a7,0x3b574c18),L_(0x394db51a), LL(0xbeade6c7,0x315f47ce),LL(0x04f8a73c,0xc77bac27),LL(0x39f2d0a5,0x28b192db),L_(0x2934b689),
+ LL(0xdfa7909f,0x374a8799),LL(0x3c94fdda,0x121579dd),LL(0xb4c9c6a6,0x2b2a2fe1),L_(0x56fd5e90), LL(0x2dec18ba,0x467e925a),LL(0x8c9027cd,0x51b39838),LL(0x33d05082,0x6dd45eec),L_(0xbdecbc09),
+ LL(0xe4793da1,0xce68ae65),LL(0x1c93f463,0xdf1eb924),LL(0x67519764,0xa6d12a17),L_(0x50dd0b17), LL(0x1e13ad02,0x43f0840b),LL(0x88680227,0x648dece5),LL(0x0b8a73e1,0x9e1099c5),L_(0x6364790c),
+ LL(0x00e5b508,0x16e7b26d),LL(0x41d10bda,0x2fb5b17c),LL(0xf5f94483,0x964b96f7),L_(0xc11a04d1), LL(0xb577452c,0x8083550f),LL(0x8030936a,0x2f106bf6),LL(0xe11783de,0x0cfd54c0),L_(0x4ef38a16),
+ LL(0xd3bf6d03,0x6afe9c51),LL(0x54c55faa,0xbb0f1cd8),LL(0xb0816531,0x27df4a0c),L_(0xa678d64c), LL(0x72f5b39c,0xc24bf200),LL(0x0cc6c1f6,0x39525315),LL(0x2d46495a,0x758c33c9),L_(0xd07deb3e),
+ LL(0x9c7bf29a,0x2cb77bd8),LL(0xb9eef76b,0xb7245ac8),LL(0x0a33b879,0xe50ef27d),L_(0x90583d39), LL(0xb91f697a,0x1ca8036c),LL(0x3704acdb,0xbee50919),LL(0xf053ecd4,0xece7c952),L_(0xc1b42c32),
+ LL(0x990b1bde,0x0420911c),LL(0x39fa1b1a,0x4138b100),LL(0xafe94d6f,0x24ff9ef4),L_(0x17756d00), LL(0x528a709c,0xa50cb647),LL(0x66685df4,0xbb306764),LL(0x907cbbc6,0x74217b89),L_(0xb3971d2c),
+ LL(0x0bab31b7,0xcccd2b33),LL(0x73e2182d,0x5f8e6b04),LL(0xb7efd33b,0x4cd501f3),L_(0xf5c8e01b), LL(0x83d20ea3,0xf475121c),LL(0xb4c7ec19,0x47427d10),LL(0x6eb988c6,0x7acc59a0),L_(0xee8542ac),
+ LL(0x591ee336,0x16ee1f0b),LL(0xbd069c60,0x27985f4f),LL(0x7a51d8bb,0xfe74d9ab),L_(0x699af4f3), LL(0xaa92cd9e,0x9ed60020),LL(0xddd73047,0x2a0eac86),LL(0x18315901,0x8dbf60b9),L_(0xd894e7a4),
+ LL(0xaaf7ef60,0x3d3b7078),LL(0x1892a0ca,0xf09fd9b4),LL(0x00b8f278,0xf7dd85ca),L_(0x18c0622f), LL(0x54e7df9e,0xe305da30),LL(0xf030f7b0,0x67dd41aa),LL(0x88c0e226,0xc437eba8),L_(0xbebf59f2),
+ LL(0x938be7f7,0x7f0d8c8a),LL(0x93333f94,0x74f9489c),LL(0xba77e9c0,0x529b3458),L_(0x5132809e), LL(0xfea9f3ed,0x93d7e4fe),LL(0x2d6cdf17,0xce0cdb8b),LL(0x1c3846b0,0xe0a036d5),L_(0x41588868),
+ LL(0x3b25f1dd,0x640f0895),LL(0xa1b0f513,0x6a36628c),LL(0x0a1631ee,0x22c92416),L_(0x57e72f37), LL(0xb5997003,0xa3c8067e),LL(0x34446f40,0xe28f2eda),LL(0xca50379b,0x0c2d44ef),L_(0x86add37e),
+ LL(0x1879da9b,0xf1be18cc),LL(0xc9b308fd,0x5708ec7f),LL(0x088da37b,0xa743ca6b),L_(0x8175ae9b), LL(0xd86f2e96,0x9bf8faf1),LL(0x3935839e,0xae7389fc),LL(0x784c1096,0x1aa41e81),L_(0x5ea779cf),
+ LL(0x2380678f,0xe93e1c94),LL(0x38fe23d2,0x68003338),LL(0xa4954b13,0xfa7015a9),L_(0x065ec161), LL(0x3e892822,0x19b8125b),LL(0xaf0c1860,0xd66a6abf),LL(0x8579e7ef,0x7516c1ae),L_(0x9c6fa132),
+ LL(0x8051f522,0xfd3b4b27),LL(0xc58d2a96,0x89473859),LL(0x8c0cdac3,0xd7eaeef0),L_(0xdea9f3b9), LL(0x0639dd0d,0x862785aa),LL(0x6333d5f0,0xd61bc685),LL(0xd861b3a5,0x83d3ee5e),L_(0x3b940e97),
+ LL(0xb145ba08,0x2aaf9072),LL(0xc3f907fa,0x2f3077a0),LL(0xbc426169,0xc99c4c21),L_(0x6cffa60c), LL(0x6ee68684,0x236b0866),LL(0x2624e5dc,0xe6b22138),LL(0xaa9f8c57,0xc8cde662),L_(0x93a86894),
+ LL(0xcedbdd1b,0x51eec28a),LL(0xd594682e,0xd4deae6d),LL(0x9e368887,0xaded26ea),L_(0x12b6da79), LL(0xf79fe22a,0xa610dbd9),LL(0x29369dca,0xc8e53035),LL(0x8d4db547,0x6d7b9831),L_(0xe42e7214),
+ LL(0x6d88e9db,0xaf929b4d),LL(0x7078cb4c,0x09f3ff8a),LL(0x2c88cea6,0x95aa1478),L_(0x4aa22af5), LL(0x4d819417,0xe1f9b46c),LL(0xc564232b,0x3fdecbde),LL(0x368fe183,0xce1f9cb4),L_(0x091d0d56),
+ LL(0xb55224a6,0xc92c61ce),LL(0x12d8c2ac,0xe42fc5df),LL(0xbae2229f,0x3afc274c),L_(0xaa2d85b2), LL(0x85cd8bfd,0x97118ed0),LL(0x3f0f7abe,0x5e361376),LL(0xaaf47545,0xcad4d556),L_(0x5d8ce6e2),
+ LL(0x18d8ff5d,0x18b51ba2),LL(0x38eb90ea,0xaf0eee18),LL(0xfc1b2868,0xbb73ea5a),L_(0x04dbbb13), LL(0x88d94a30,0x730a7041),LL(0xecbbc48f,0xd183ab02),LL(0x9867c6b2,0xf198711f),L_(0x29700a86),
+ LL(0xf225ca3b,0xebadfce9),LL(0xac6e8138,0x7b3285ff),LL(0x09069b77,0x1091afcf),L_(0x7e8bc830), LL(0xdcc4bc5e,0xf1844abf),LL(0xcca811f9,0xf655f51b),LL(0x7e393926,0xa022dcd5),L_(0x7d04ce77),
+ LL(0x32d143d7,0x07002476),LL(0x4ba2c132,0x028e4eab),LL(0xf7ed9d04,0x65e3cb55),L_(0xec4c3928), LL(0x1cab2512,0xdf940bc6),LL(0x738a5390,0x734bf044),LL(0x2643f52d,0x11593f75),L_(0xdd379063),
+ LL(0x1759457c,0xcee75815),LL(0x09e08c84,0xbfd1d973),LL(0x5f64050d,0x6b3087eb),L_(0x15138f44), LL(0xc0453460,0x776dfb51),LL(0x19bde576,0x07f4f3a2),LL(0xb17003a3,0xb6a6cf4d),L_(0x25dd19eb),
+ LL(0x53f04643,0x8525ef52),LL(0xa60e3c60,0x9a0888e3),LL(0xde6f955e,0xda028b89),L_(0x6d89bc76), LL(0x2711d947,0xd109e67e),LL(0xb2e621ad,0x19b5f6ef),LL(0x75754b8c,0x85c8d6d5),L_(0xbd6dfaf2),
+ LL(0x0a0de3ce,0x725322a6),LL(0x6f41138b,0xabf6f3c3),LL(0xeb4d3502,0x6dfedcca),L_(0xcf8c4120), LL(0x08adcae8,0x33d4bd69),LL(0x1e238409,0xcfe1b692),LL(0x659e68b8,0x82c86924),L_(0xed3a9241),
+ LL(0xd351d4d8,0x141df0b6),LL(0x232a8ee6,0xaaee8341),LL(0x6a97a114,0xaafe4f6c),L_(0x3cb8f982), LL(0x3ce36b0a,0x4106201e),LL(0x96a879e9,0x40106385),LL(0xfda3c463,0x9e471096),L_(0x3f6ed17a),
+ LL(0x15f6014d,0xb5217d60),LL(0x166ccebf,0x421c3d60),LL(0xcc23ecec,0xc0f18f53),L_(0xde559d43), LL(0x1ae450bb,0xf66ae880),LL(0x7de0a653,0x2e31cf5a),LL(0x1b3a8046,0x916c70ac),L_(0xf73fb01a),
+ LL(0xd287d1cb,0x3e47dc5d),LL(0x70eb7ae0,0x42cffa9a),LL(0xc6ddb9b7,0xb751c3c5),L_(0xb82e85ea), LL(0x7f3bfdc4,0x8676c057),LL(0x711d3839,0x2f6a12cb),LL(0x4e43cafd,0x273385a8),L_(0x94a8904e),
+ LL(0x1d472cf9,0xb53ac163),LL(0xc380e03f,0xf1c57e23),LL(0x5f7dfde3,0x53f9522b),L_(0x51e85640), LL(0xf3d29714,0x3c47cbaf),LL(0xc0110dc8,0x561e0754),LL(0xbe952c4a,0x6bcd178c),L_(0xba15112f),
+ LL(0x24b41db7,0x36a421ac),LL(0x98891ee6,0xdc178876),LL(0x619cb9a4,0xa266089e),L_(0x9c33f043), LL(0x9fd8767e,0xba9a6d1f),LL(0x20bce515,0x8cbdf583),LL(0x46c198f4,0x23f49a00),L_(0x847b2ffd),
+ LL(0x281cc4ea,0xc3d2804e),LL(0xdb1f2dbb,0x22a16678),LL(0x638a7949,0x7ec2aa7b),L_(0x9a43ca9e), LL(0x187243a6,0xb99ca6d8),LL(0xd4fc6e37,0x2d4040d0),LL(0xbd604fb9,0x8cefbced),L_(0x1938ccf3),
+ LL(0xfbd9e1c5,0xd10937a9),LL(0x2f42feaf,0x2fa67093),LL(0xe7b103db,0xb57b1840),L_(0xe03cfeaf), LL(0x1368261e,0x719e1d06),LL(0xfa867b56,0x192c11f4),LL(0xa6cd197f,0x9b41db84),L_(0xc6acf157),
+ LL(0xd68a5a4a,0xddd06586),LL(0xe7a17b19,0x52664a67),LL(0x2621ebc3,0x6f5736f5),L_(0xc8afa211), LL(0xd267f259,0xbacb7a85),LL(0x15b16a2a,0x5c0b0c67),LL(0xaa7c18e3,0x166ad375),L_(0xd0350e8d),
+ LL(0x9a21bdff,0x8411fa8b),LL(0x6d5b0f02,0xde70b24c),LL(0xf5bd9bc8,0xd7443ed1),L_(0x996aa702), LL(0x2b84584f,0x3ea3f8f2),LL(0x373c9339,0x099fde12),LL(0xbc0565bd,0x8fd32c81),L_(0xf5bc6acd),
+ LL(0x7e78ce17,0x12d214f6),LL(0x2fbd45bf,0x5f204c64),LL(0xaf966aac,0x62d03da4),L_(0x3d6e4888), LL(0x0fc086e6,0x14494699),LL(0x61bbb841,0xcc71f940),LL(0xec60a687,0x65805046),L_(0x1641dea6),
+ LL(0x1ee6996c,0x8eb81a1a),LL(0xa5c29c33,0x547ea700),LL(0x71308d2f,0x9126c06e),L_(0xb4936b4c), LL(0x5fecdc41,0x49cacc43),LL(0x7029bedd,0x89bc7a7f),LL(0x6331b109,0x93db1b8f),L_(0x60235335),
+ LL(0x18292506,0x93a8f9cc),LL(0x0c3b64eb,0x8d658c23),LL(0x33eef875,0xc22c9665),L_(0xd49b8f05), LL(0x2081f85e,0xbea17435),LL(0xc230d670,0x6f44daf4),LL(0x5ff2900d,0xdea368bd),L_(0x4f64c46a),
+ LL(0xfcb125d6,0x097e443e),LL(0x9f812e98,0x96ff5377),LL(0x0cce254b,0x562b2166),L_(0xddbade23), LL(0x73e36237,0x992060e2),LL(0xbca2c3a8,0xa968d30e),LL(0x139e42f9,0xe5b89488),L_(0x3ba1f60d),
+ LL(0x3e86ab5c,0xb177e3f9),LL(0x43f6161d,0x95050abc),LL(0x580bb577,0x75270515),L_(0x4a847f51), LL(0x0ce33d23,0xcab8647e),LL(0x9f53c335,0x139f525e),LL(0x9b1f28f4,0xa2e38250),L_(0x5690d259),
+ LL(0x193d7b51,0xbe57f373),LL(0x22feedbc,0x192cee98),LL(0x66699aba,0x69e0895a),L_(0x0f685742), LL(0xe787c996,0xb3f66818),LL(0xccac8670,0x5ee5c7cc),LL(0xe1645254,0xb7d10719),L_(0xae1e2e81),
+ LL(0x17022e02,0x2f237075),LL(0x36a4e5e4,0x01453fba),LL(0xba3615f3,0xa703f343),L_(0xd6276794), LL(0xb5aab8d0,0x30b0a7e8),LL(0x3f7b2b8e,0x33588983),LL(0x8a8547cc,0x64a4028c),L_(0x0ac79b94),
+ LL(0xbbdec908,0x6c0cb953),LL(0x9af46a78,0xf8e40103),LL(0xca5b89e3,0x5e56c8f6),L_(0x7d134424), LL(0x040b1ce5,0x76bd7772),LL(0xff8f0795,0x396f023d),LL(0x6bb455f6,0x4243e710),L_(0xbe0cd278),
+ LL(0xff00cfcf,0x7a3a34e7),LL(0x8154829a,0x59745afe),LL(0x13dec9bb,0x00460ef4),L_(0x7d4cb470), LL(0x664b5768,0x467ad23b),LL(0xa9eb5d4a,0xd6ac872c),LL(0xc30f32ed,0x7527a687),L_(0x3f334a32),
+ LL(0xf2877172,0xa577b4e7),LL(0x50267b62,0x7ac6ab0a),LL(0xbbb22aab,0xce8c4374),L_(0xb58c0879), LL(0x5d2444bc,0x1362bb86),LL(0x6236944e,0xa58498c8),LL(0x03a3218e,0x4585f77c),L_(0xd30bdc81),
+ LL(0xe1c0eb9a,0xf69271e6),LL(0xf6273f18,0x239476a1),LL(0x3701952a,0xb94d2063),L_(0xe82c2b26), LL(0x39ed615b,0x44f390c3),LL(0x90593547,0xa4418ea5),LL(0x1ce9df6c,0x76cd5c55),L_(0xda44a03e),
+ LL(0xf5dcc901,0x62fd7874),LL(0xcf83396e,0x74f61b6b),LL(0x9d3a5873,0x10ca6b61),L_(0x5ef1b62a), LL(0x848244dd,0x81922f08),LL(0x3ee1023e,0xbc236621),LL(0xb2a50ed6,0x0cbc779a),L_(0xb8fa6a49),
+ LL(0x4914c41a,0xb8a19540),LL(0x430e8c3d,0x957adbf0),LL(0xd2aac8dc,0x64d6ca82),L_(0xd8b3157d), LL(0xdb015ecb,0x42372196),LL(0x9a5dfacf,0x05451b08),LL(0xe16c7207,0x463bc66d),L_(0x69536281),
+ LL(0xfc7e9660,0xb8358066),LL(0x918a74d2,0xa1915c8b),LL(0x8d26603b,0xfdddd6dc),L_(0xfe3b2017), LL(0x2166a1d3,0x79912871),LL(0x71bd6832,0xe96aa265),LL(0x98a560dc,0x43b8858b),L_(0x3b4e1e7b),
+ LL(0x2d3f3786,0x95813382),LL(0x6e6cb17c,0x89e2322f),LL(0x3568d961,0xfbe11c03),L_(0x5e1857de), LL(0xb0011b62,0xb6d17af8),LL(0x76372b21,0xfa35ee62),LL(0x88f30207,0x496e0cfb),L_(0x1eab8b49),
+ LL(0x233a4ea3,0xed225296),LL(0xfbf21df5,0x18a0b19e),LL(0x49f70f9b,0xfd4a3974),L_(0xff579fa6), LL(0x6935d1e1,0x4ca49b02),LL(0x5398c8d2,0x465d1798),LL(0x83dab70c,0x3925587b),L_(0xc2e61a09),
+ LL(0xadc74708,0x97b00e28),LL(0x822c5927,0x4ea78214),LL(0x29de362e,0xe0075db8),L_(0xf94b10e6), LL(0xcd9ea163,0x4071fbdd),LL(0xa89e9ce3,0x5861958d),LL(0xb0f23643,0xfb6d160c),L_(0x2e57bc83),
+ LL(0x1cf01491,0xfd9abd17),LL(0x59f1c903,0xfdabdb45),LL(0xfe106ce3,0x28aec19b),L_(0x1e243bfb), LL(0x5dea7b0f,0x9dd7eace),LL(0x0d4e5c7f,0x7aa326d1),LL(0x58144fba,0x0c0b55eb),L_(0xf89a2bf1),
+ LL(0xf492b1ff,0x80211303),LL(0x4c3d5f56,0xa0a42f80),LL(0x812c4f34,0x0513dab5),L_(0xb494414d), LL(0x2b196b3e,0x8292825d),LL(0x845aa8d7,0xfccdef2e),LL(0x8309d41f,0xa6c098eb),L_(0x8feed613),
+ LL(0xe5e506e6,0x34984e59),LL(0xa9dc7b02,0xc78ed700),LL(0x023cf8a4,0x8818f370),L_(0xb1fe8a66), LL(0xedb22c01,0x61bbfcfe),LL(0xcc714f92,0x4b1c28be),LL(0x87de5c20,0x13f66db8),L_(0x523fa798),
+ LL(0x311b814d,0x18478ee8),LL(0xc54ff99c,0x5fc08d54),LL(0x3d6c85b2,0x2a4234ef),L_(0xd3a39852), LL(0xef0ad115,0xfa0e9b48),LL(0xdfcd9d52,0xded54ff0),LL(0x8d2d8068,0xe6033e94),L_(0x39c4cac0),
+ LL(0x567ac24b,0x31e079f2),LL(0x595877b2,0x876a06e1),LL(0xd77d6297,0xabca81b2),L_(0x0324c3ba), LL(0x27382ebe,0xbd7f7ff0),LL(0x5a3b92f8,0xb11d9de0),LL(0x31e36d28,0xba48fe41),L_(0x3263cd91),
+ LL(0x845700c2,0x659750c3),LL(0x265533c8,0xbfa2263b),LL(0x46779254,0x426c9332),L_(0x73f00210), LL(0xc0627927,0x919159e1),LL(0xc1896bdf,0xb8633c7d),LL(0x62049111,0x57a02e38),L_(0x159b1b0e),
+ LL(0xc0ef9c33,0x87339367),LL(0x80f32c7a,0xd690f5fd),LL(0x4cb8372b,0x74004a4c),L_(0x92a5a93f), LL(0x62fc7f7f,0xc75eca95),LL(0x2883c5ec,0x87991514),LL(0x1a3939cc,0x9eeab34e),L_(0x57489f74),
+ LL(0x6dda4270,0xe95ee7c3),LL(0x68b80ca0,0x5637d166),LL(0x0cc0434e,0x108326a5),L_(0x11ccac8e), LL(0x66908f8f,0x768a4dc5),LL(0xe0516b2b,0x24086620),LL(0x0390f0a6,0x34cd95fd),L_(0xb3965e3d),
+ LL(0xa579c74b,0xf4d1cd8b),LL(0x2437af0c,0xa682fc6c),LL(0xcf5b3a95,0x13389ce6),L_(0x0026ae74), LL(0xc24a47b5,0xf37dbb35),LL(0xf06e1e15,0x9d47aaf6),LL(0x196773ed,0xab42affb),L_(0x76bb4374),
+ LL(0x78457341,0x0583dc84),LL(0x564d9444,0x6a0c10e4),LL(0xbf46a7bb,0xe6adebac),L_(0x93e051d2), LL(0x3e924b68,0xbf5e7329),LL(0x4afb1643,0x9cb33af1),LL(0x5460942b,0x1005e77d),L_(0x483528ac),
+ LL(0xa399de32,0x867305ce),LL(0x19e34f30,0x2200477c),LL(0xd31a5a81,0x9ac2ed5d),L_(0xa22c4024), LL(0xa5a011ec,0x9cb94041),LL(0xadcbd258,0xf7a7e8fd),LL(0x26131e4c,0xbcae3bd4),L_(0xa63111af),
+},
+/* digit=11 base_pwr=2^77 */
+{
+ LL(0xe00bdded,0x44e43c61),LL(0x2a3a0320,0xc584d310),LL(0xb6fe7f05,0x951b39e7),L_(0x1c47e70b), LL(0x1eae5fc6,0x518f5441),LL(0x5cd44db2,0xc505aeda),LL(0x216fb5f2,0xbb781e43),L_(0x7e14b38e),
+ LL(0xf9a62c2b,0xe0d93869),LL(0x60f3a9a1,0x6d3f0de7),LL(0xb3106bbb,0xb0f77641),L_(0xc3071383), LL(0x9b298ebc,0x184aed09),LL(0x0bacf017,0x334394d4),LL(0x79c1d22f,0xd95473d2),L_(0x93838083),
+ LL(0xcb7cb58a,0xf3fc070e),LL(0xed4652fb,0x60dba7d5),LL(0xe19d60f2,0xe420c869),L_(0x51893296), LL(0x097e4dab,0x707e030c),LL(0xd90a9475,0x0dcda4fc),LL(0x9803c9fe,0x2bbc44ce),L_(0xa6483469),
+ LL(0xfabcb24a,0x10355326),LL(0xdcb5236b,0x91ed19ce),LL(0x4f316ca1,0xd20efc4e),L_(0xd00bff40), LL(0x1a2e490d,0x2b83ac01),LL(0x96a6cfc6,0x0fd81acf),LL(0x8da694f8,0xfcad677f),L_(0x6bf5e71f),
+ LL(0x248ec9b4,0x11ef88d2),LL(0xe791a3bc,0xda678712),LL(0x370ca0ea,0x7a293625),L_(0x4e4cd7d7), LL(0xddfa0a4e,0x1f856294),LL(0x180b43b4,0x6bd2e637),LL(0xf728ccb4,0x91baf444),L_(0xe5fa917a),
+ LL(0x9e4adc26,0x8981411a),LL(0x6d65f85a,0x7eb4dd2d),LL(0x58e82e86,0x97c312ce),L_(0x8bfebe6a), LL(0xd7b84e09,0xc95c8ff2),LL(0x639198d0,0xd7ac3654),LL(0x7546fc40,0x504a9f59),L_(0xeac2deb7),
+ LL(0x9edb0426,0x476b8958),LL(0xa2e1a729,0xf14565b5),LL(0x4bab1b96,0x3d3ca262),L_(0xc0e1a0ef), LL(0xfd4e9a48,0x0043c8ff),LL(0xba0665c7,0xafaf8910),LL(0x0b1e0a8d,0xcbeb2d8e),L_(0xe710e7f4),
+ LL(0xebbefd51,0x44fc634e),LL(0x2a776b18,0x9ddeace8),LL(0x08a9107e,0x909eff4c),L_(0xb7934059), LL(0xf816fa9f,0xefd70514),LL(0xfaad7709,0x598db9de),LL(0x0094b64c,0xc6634c12),L_(0x8b95add1),
+ LL(0xd6fb5d4c,0xadb1a9c2),LL(0xd2967310,0xc8ec0f39),LL(0x1908657d,0xa25710b3),L_(0x19a27dfc), LL(0x311947c4,0xe187cb1c),LL(0x8cbb3e59,0x1bae3f86),LL(0xafb6e7b5,0x44ea2977),L_(0x781e26f2),
+ LL(0xee18a383,0x60b120f0),LL(0x24a67462,0x91636563),LL(0x29fd66f4,0x6538f012),L_(0x1b5c47df), LL(0xda52b57b,0x9a0bd35b),LL(0xd095d4fe,0xcee45c94),LL(0xafb1fcae,0x042232d0),L_(0xcff50cb9),
+ LL(0x54397158,0xd06ed8f6),LL(0xd53d3bfe,0x67644c3e),LL(0xaa8e6af8,0xa26425e0),L_(0x1f9101fd), LL(0x6fb8009e,0xdfa5a71f),LL(0x7b2b6229,0xc4fb8d84),LL(0x413c2883,0xa71e26d8),L_(0x442bf1c5),
+ LL(0xae3de434,0x45610301),LL(0x828b8be8,0x4ec1365e),LL(0xb95b637d,0x41dbce62),L_(0x1ca7419f), LL(0x9637a66f,0xc6d80952),LL(0x5a685913,0x9289159f),LL(0x761cc88a,0x1da0d501),L_(0xf7bfb795),
+ LL(0x37a59563,0xb4ca54d1),LL(0xe2ccd3ff,0x5128864b),LL(0x8aad87e4,0x559dacdc),L_(0xdf79df2f), LL(0x89718ac8,0xea353321),LL(0xe6676310,0x2012406a),LL(0xc599f213,0x1eb2fe94),L_(0x626c9f76),
+ LL(0xba62fad3,0xa7fededf),LL(0x6ff23700,0xd58195f8),LL(0xd3d6b5bf,0x1ad1505f),L_(0x97f82bb0), LL(0x6f93c77b,0xaf96dc4e),LL(0x30b1fb3e,0x20624dad),LL(0x4fa52512,0x3481aabe),L_(0x78a7c4e4),
+ LL(0xba1c1391,0x9fb8e966),LL(0x5ff12f04,0xb9c0dea0),LL(0xd59d1993,0xe8a99c53),L_(0x6cef1107), LL(0xb44f7478,0x97335f28),LL(0x400e3354,0x6f550c81),LL(0x3749bb24,0x67501a21),L_(0xdbc433a0),
+ LL(0x2ddbdad7,0x5e95c8ee),LL(0xf4a3dab8,0x74fa6bf7),LL(0xf68aac5d,0xe404df62),L_(0xca08be37), LL(0xf3252764,0x934f4963),LL(0x6033be81,0x65ea023b),LL(0x39f3ad81,0xf2ab45c6),L_(0xec27db5a),
+ LL(0x6c9e60de,0xd82ebdb2),LL(0x3c94302c,0xf4278e99),LL(0xf76b6d5d,0x177bfa74),L_(0xaec52e0d), LL(0x0698c8f8,0x8af11d92),LL(0xdc8707e7,0xdcfeb87c),LL(0xdf966b87,0x790b8b3b),L_(0x25a49666),
+ LL(0x0d632c2e,0x82b42706),LL(0xca5f0400,0xeb7e23be),LL(0x67d13334,0x6bef8f5e),L_(0x19a89324), LL(0x5b9d7908,0xb943b3e3),LL(0xe69dc86d,0xe1142402),LL(0xe61e180e,0x3186f5ab),L_(0x5490857c),
+ LL(0xee73f3c9,0x1c021526),LL(0x229aab7e,0xd5f0330f),LL(0xbcd8ae19,0x34f15f5c),L_(0xab3c7439), LL(0x0f2d33f9,0xf2452d93),LL(0x23f2f3b0,0x0c4b0f70),LL(0x322c677d,0x311431b5),L_(0xc0e186a5),
+ LL(0xd222f30b,0x32c8e92e),LL(0xb855ce32,0xf9051d2c),LL(0x34079f7e,0xca51b73e),L_(0x1cd08eae), LL(0xe4529fd6,0x3ee05e30),LL(0x48ccde21,0x762211ba),LL(0x957b54a8,0x7bd842d1),L_(0x8ad2f209),
+ LL(0x8578a05b,0xf931c6ff),LL(0x22b12a51,0x9c1a24ae),LL(0xc7ad186b,0x3aae7e80),L_(0x35a3a465), LL(0xcd94ffe9,0x02d60546),LL(0x02a0030e,0x6d8dfc51),LL(0xf70532cd,0xa7523214),L_(0xbfa52fcd),
+ LL(0x3898ac4a,0x7ef15aa2),LL(0x04a67481,0xc92d3e61),LL(0x6f146470,0x20a65e93),L_(0x091a434a), LL(0x40c2ff2f,0x5f5f4b1f),LL(0x356b539d,0xef24d37f),LL(0xf5eb8c60,0xd0f3625a),L_(0x5662e1cc),
+ LL(0x04af9658,0x0ddb7f8a),LL(0xd47a8579,0xf5679a0d),LL(0xfa164f3a,0x75f9e25f),L_(0x88f00eb9), LL(0xd2b96f54,0xc75b8bfb),LL(0xc45f8fe0,0x141dae1d),LL(0xf86c989c,0x1a015ae9),L_(0x4cbe108d),
+ LL(0x7440165c,0x252d3538),LL(0x94ed0d57,0xc7935e6e),LL(0xfc485299,0xafc2b1d4),L_(0x2763b62a), LL(0x8b5606a9,0x8714fa4e),LL(0x44261681,0xd015855f),LL(0x03679b60,0x14d9de29),L_(0x84a487b9),
+ LL(0x7fd6372b,0x1fc76dfc),LL(0x30d60bc9,0x835ac98b),LL(0xec54c6b2,0x98cbc171),L_(0xa2ec0376), LL(0x7ab5c98b,0x577a8e9f),LL(0x527bb2a1,0x84028fa5),LL(0xed0d2362,0xb28e8d67),L_(0x1a1d5c1c),
+ LL(0xd8c85ac3,0x8e20b175),LL(0xe895347f,0xbc82df9e),LL(0x763f7da0,0xc32cc81d),L_(0xd889ef15), LL(0xb02c89ce,0xd305dbab),LL(0xb02c2e9f,0x7f0a99ef),LL(0xd40823f0,0xf958bb39),L_(0x7a07c7e4),
+ LL(0xee84ea34,0xc5f043e5),LL(0xea668125,0x13f7ae2f),LL(0x18438628,0xb6ffaed5),L_(0xf72f62c4), LL(0x9cb2856e,0x9a5c926d),LL(0xade5a9b1,0xad05632a),LL(0x4d11a1b7,0xf0f2c69d),L_(0xbfed0dd6),
+ LL(0x60b10c55,0x79943f17),LL(0x930f1ce1,0x15056514),LL(0x70dc2681,0xc9a17b25),L_(0x71659c78), LL(0x4d9c29ff,0x5978aada),LL(0x56151f6b,0x6e84fa9d),LL(0xb01cfa96,0xd9553cbf),L_(0x495ffa1c),
+ LL(0x14645de0,0x50569b84),LL(0x516171cb,0x76814e1a),LL(0x6931ce3c,0xd1694dea),L_(0x18d486a7), LL(0x8fb4ec93,0xcbd84ece),LL(0x694d8a81,0x70c2d8a8),LL(0x6f1a63f5,0x2ca687fd),L_(0x6788bb91),
+ LL(0x66719259,0x78b1b1f1),LL(0xa8fe9c13,0x372aba7a),LL(0xf72aecd5,0x049424c7),L_(0x8c2a627b), LL(0x12996520,0x7a3d9b21),LL(0xd87c3d81,0xeea3b43c),LL(0x6296bed4,0x965623a1),L_(0xf57dda17),
+ LL(0x19faf24f,0xee2a75e2),LL(0xe4882684,0x2608d8d7),LL(0x5dbd9aa4,0x8dd2d8bb),L_(0x1861b78b), LL(0x96024e0a,0x59608369),LL(0x2a96c634,0x3109b985),LL(0x4c72f34b,0x073affe7),L_(0x5e2a53e1),
+ LL(0x7163417d,0xe75a8d8d),LL(0x003ea53c,0x34a71e84),LL(0xf46ea0c1,0xa472172f),L_(0x582a6663), LL(0x5941f31f,0x45ef8849),LL(0xda61e5b5,0x813628f8),LL(0xff6e6be2,0x2f6a6923),L_(0x24a1906a),
+ LL(0xf2dab7c1,0xee4fac0c),LL(0xcca97a61,0x442b5426),LL(0xd1572489,0x1b63f7f9),L_(0xc808b93c), LL(0x86beafa1,0x931a009d),LL(0x00b9ab37,0xc54e5dcf),LL(0xce454abb,0xe3d31b67),L_(0x8846c2ca),
+ LL(0x2bfb9673,0x00a46605),LL(0x6d38eb82,0xd0e900f3),LL(0xac391030,0x56b396f4),L_(0xa240554c), LL(0x111e6519,0x0e375257),LL(0x2daa1839,0x0569eb0d),LL(0x6386031f,0xa43939dc),L_(0x29a2482a),
+ LL(0x79006500,0x19bae3a4),LL(0xeba63f38,0x278b676b),LL(0x2bfc1210,0x5fd221ef),L_(0x18605ab3), LL(0xaddaabbd,0x3e58e744),LL(0x130a0b49,0x86211a5e),LL(0x27a20439,0x06b96609),L_(0x3be9694d),
+ LL(0x31e7bef9,0x6b521dbf),LL(0xe38156c6,0xbb74a0f2),LL(0x41f4bd94,0x79699c57),L_(0x565687a7), LL(0x6af2b091,0xb9a903de),LL(0x15159b8e,0x250d78d4),LL(0x565e3c29,0x674edb33),L_(0x0294da46),
+ LL(0xfa502a7a,0x4f9ab886),LL(0xf7c92c2b,0xb5e6f603),LL(0xcd18776f,0xf25cc6e4),L_(0xa7fa7c45), LL(0x9822aa1b,0x2c1f0788),LL(0x250c2373,0xb4be8a38),LL(0x671f0157,0x5b11123b),L_(0x157f5d60),
+ LL(0x54914217,0x1256ef4e),LL(0x5163b441,0x075b53ab),LL(0x5ecb1889,0x56e20726),L_(0x6494b2b8), LL(0x09f26255,0xd571b91b),LL(0x9475008d,0x328d62f5),LL(0xde6fb9c6,0xe065c610),L_(0x96baaccd),
+ LL(0x45144de8,0xdc428059),LL(0x71bed82d,0x9aff2cca),LL(0x9af32379,0x7429380e),L_(0x02f22f65), LL(0xe3565604,0xdea72af4),LL(0x2b9bc7b9,0x2bf6a43f),LL(0x5a2add5c,0x6b6ae6f7),L_(0xb69ca1cf),
+ LL(0x9ab52f77,0x061d7ef8),LL(0x56d68dd3,0x010840bd),LL(0xae0d756d,0x97508e7b),L_(0xecbb738b), LL(0xadc78972,0x4d5b80a4),LL(0x4dce8c80,0xf9aaef5c),LL(0x256809bb,0xa1ec2e50),L_(0x2ea2af7c),
+ LL(0x74a6dd4a,0x0393f719),LL(0x93285afe,0x4e57160b),LL(0xac7e00ee,0xe124fa0e),L_(0x044bd9af), LL(0x2389bd88,0x80b4129f),LL(0x758d4e27,0x0e8aaba3),LL(0x1051debe,0x4a190f97),L_(0x85906a99),
+ LL(0x2156959c,0x37e2ab37),LL(0xd889d270,0xfe9b7157),LL(0x540652e0,0xd3215a27),L_(0xb88094e7), LL(0xc0c597f0,0xceb6dd56),LL(0x5dc4dd34,0x09436cb3),LL(0x07e11a08,0xc752116d),L_(0x86890fd2),
+ LL(0xe154e3b6,0x3dd689de),LL(0xba6c5590,0xecec9673),LL(0xf4ebc67c,0xdf67ffb0),L_(0x094d0483), LL(0x33ce85c7,0x58ffaf1b),LL(0x04f91a5f,0x741f05be),LL(0x2535c38a,0xffe3294f),L_(0xfe3e3780),
+ LL(0x4c921d99,0x1c787299),LL(0x8c60577e,0xbf10f0e5),LL(0x4f5e9e39,0xdd4daa07),L_(0xcf714fd4), LL(0x92fcbe08,0xf29c8618),LL(0x38ba462f,0x84305704),LL(0x8d7c9a43,0x19694aa8),L_(0xe7510556),
+ LL(0x680c4325,0xb1ac0982),LL(0x45857f5e,0xa4032ac9),LL(0xdf576261,0x92007d10),L_(0xc5ae1832), LL(0x755cfb3c,0xb9ea853a),LL(0xc129c1e9,0x28725f38),LL(0xa32de41e,0x8310cc56),L_(0xaf03c7c1),
+ LL(0x4319f045,0x6a31f14c),LL(0xbb313e19,0xf0a68d54),LL(0xa79121b3,0xf8ad5c75),L_(0x1cd6c518), LL(0x1aca6f0e,0xd728ef75),LL(0xf52ecb39,0x66ed37be),LL(0x244f6df5,0x5253f731),L_(0xc37a0916),
+ LL(0x7e5a8bd3,0x9d03a5af),LL(0x6b5c7a81,0xa4eb71aa),LL(0xa305f15d,0x1dc7fb76),L_(0xbf1adac7), LL(0x20487a26,0x6deaadda),LL(0xf4c07457,0xe0f4999c),LL(0x9bb84678,0xc451bb12),L_(0x975839c9),
+ LL(0xc977cb31,0xd39b851a),LL(0x6ac13ca0,0xcd656ca8),LL(0xa19898ab,0xafd81332),L_(0xd849f9e4), LL(0x2bb5e6b1,0xc3157a16),LL(0x5b02f0fe,0x8acd8d9d),LL(0x69cbb158,0x6d76f690),L_(0x05ce3883),
+ LL(0xc8ff4786,0x2bca8c99),LL(0x186098dc,0xa2caaf78),LL(0xf6be10a7,0x2100372c),L_(0x16272c0e), LL(0x761e39c7,0xdb53800d),LL(0x6551227e,0xc599f6e5),LL(0xc995d474,0xcb2cc9b4),L_(0x73233966),
+ LL(0x39687ef7,0xe8d0ac03),LL(0xc75c74c9,0x921b3cbb),LL(0xc64c35ba,0xa500e776),L_(0xca48727d), LL(0xe79c45b0,0x60ad3863),LL(0x2b1933ee,0x0ce33aaf),LL(0xaee36834,0x4ce8962e),L_(0xb0c0146f),
+ LL(0xb38c8507,0xc359f6e1),LL(0x8697a59a,0x31837b1c),LL(0x98af1b3a,0xf716fe6e),L_(0x7fdc52e3), LL(0x3830cd5c,0x52930fa5),LL(0x90fd85df,0x0ad62260),LL(0x097dfa97,0xebeb447d),L_(0xcfdb2bce),
+ LL(0xe409d4ed,0xe80a1b86),LL(0x4d1e34ae,0x1aaed1d3),LL(0x9eac7e33,0x80bb831f),L_(0x0bb854f1), LL(0x986f7e0c,0x005a4dc6),LL(0x6e3f9cf2,0x52827fef),LL(0x293c91f5,0xcdd9e93e),L_(0xd5679946),
+ LL(0x2c6558f0,0xd0ac15f2),LL(0x4e88fc97,0xa247b120),LL(0x573e9688,0xd0627f7e),L_(0x96e1d752), LL(0x22887f9f,0xd31e0ba7),LL(0xb47ea27c,0x1eea7f54),LL(0x4423561d,0xf9581051),L_(0xc8a211b5),
+ LL(0x42a54364,0xeb2affe7),LL(0x35c0456c,0x972ce84c),LL(0xaeca0047,0x4d9efd23),L_(0x2bdbc15a), LL(0x173fea09,0x1d890ba5),LL(0x99e5f4ba,0xfea0ad91),LL(0x5f0b0f42,0x5619484b),L_(0xb1f3e2bf),
+ LL(0x6cdbcee3,0xc11ff4f3),LL(0xe36e32c6,0xa260adc3),LL(0x5bb4d1a2,0x33e0dbb6),L_(0x1b1ed42c), LL(0xcaa2ba15,0x415b8922),LL(0x9bbb4478,0xb1fbde1c),LL(0xe7f63f33,0xb014bfff),L_(0xd8fe72a1),
+ LL(0xab510c98,0xee7b323c),LL(0x86f8b471,0x37854732),LL(0x23d6cc1a,0xdbbcc348),L_(0x14fb98ce), LL(0x64d5f136,0x6fb100cc),LL(0xa833932c,0xb27f28f5),LL(0x980b1419,0xca8834c2),L_(0x088ce8d5),
+ LL(0x1b1c75cb,0x8c28e4a6),LL(0x712165a2,0x2cbdb243),LL(0x1341e16e,0x5a726ab8),L_(0xfe09486b), LL(0x32264866,0x4f4a819e),LL(0xf2a151c4,0xba655f21),LL(0x37367c7d,0xd157593e),L_(0x2b7d23ec),
+ LL(0x46d94f55,0xc9397bab),LL(0xe0636264,0x65e56a08),LL(0xf946f4e0,0xa259e975),L_(0x55c54603), LL(0xb5060784,0xccc37d6a),LL(0x2614d3d3,0xf709343a),LL(0xfb056c2e,0x89705d36),L_(0xc8dec62e),
+ LL(0xeb841e0f,0x7663ad0e),LL(0xc791db86,0xb1420c30),LL(0x5792fb1a,0xaebf5ced),L_(0x462f4f9f), LL(0xeaecfdd6,0xd5142858),LL(0xc555cb9f,0xe56ab53a),LL(0xdbaff47d,0xb56ba899),L_(0x048149ff),
+ LL(0xd69321d0,0xa06234ff),LL(0x4da9e4a7,0x98b8cc13),LL(0x4be3eee6,0xadbfb76c),L_(0x9b536e85), LL(0x57f0cdf4,0x01e45447),LL(0x54dd6853,0xb307918b),LL(0xa0a5d2a4,0xf7e16814),L_(0x4f89fd0d),
+ LL(0x6c92c96c,0x865c8f6c),LL(0xee136cd4,0xf96358e5),LL(0xc0b20165,0x10dbd508),L_(0x785841fa), LL(0x990a46d5,0x1d1a7d70),LL(0xc190e469,0x6c2d572d),LL(0xa87b8f93,0x03a7ba98),L_(0x3e71c1ad),
+ LL(0x6d9f3e8d,0x2221d899),LL(0xc7dd63bb,0x7c844ad3),LL(0x142035bd,0x11c04771),L_(0x726cc50e), LL(0xf02e1ad2,0x78ab7d85),LL(0xc57c4d2f,0x301c5ced),LL(0x1feac0e2,0x95568955),L_(0xd216f6fc),
+ LL(0xc5b0ee89,0xf045ebf3),LL(0x6770bb55,0xc1ea77c3),LL(0x4e10f859,0xa44993af),L_(0xb75a3354), LL(0x38d373df,0x5c460d85),LL(0x940bd01e,0x2bdad16c),LL(0x264105cb,0xb8fc3b3e),L_(0x09401ace),
+ LL(0x2edb771d,0xd4ae16cd),LL(0x2b675fa3,0xc8055a0a),LL(0xdee3f3e2,0xc08d1ca2),L_(0x28ea187c), LL(0x4252a1b9,0x6d687314),LL(0xf6c34d15,0xba935b80),LL(0x3b383652,0x52c1b85d),L_(0xc5e3b405),
+},
+/* digit=12 base_pwr=2^84 */
+{
+ LL(0xb92b8af0,0x6354d2c9),LL(0x4c952ade,0x5a4d9e35),LL(0x0381968a,0x52d9f13a),L_(0x86c3819e), LL(0xc63b9fe7,0x3743142f),LL(0xa95b1a9a,0x6e186e52),LL(0xaea91efc,0x3de25aa0),L_(0xc91296ab),
+ LL(0xf8921758,0xced4216d),LL(0x02fb0911,0x28cf0cfe),LL(0xd524c877,0x03bdd0b5),L_(0xb3e00db0), LL(0xd91831de,0xd131c59b),LL(0x77e04707,0x47533185),LL(0xf492c767,0x63c30af1),L_(0x202f0676),
+ LL(0x79a5ddcc,0x495cdcc7),LL(0x33ab4ae3,0x7f199f52),LL(0x9d2ff41e,0xbe613bf2),L_(0xf3371b23), LL(0x967f0754,0x76c36728),LL(0xfb8be7aa,0x02af3c44),LL(0xee5a166b,0x0bda3025),L_(0xc9427cb8),
+ LL(0x6371852a,0x473e976c),LL(0xa5e1af16,0x88aeb436),LL(0x368ce839,0x94aabe19),L_(0x00b82580), LL(0xb19a3ec7,0x7d50b7ff),LL(0xd8fc842f,0x81c2bf45),LL(0x8c4eb78c,0xb0a7cd1f),L_(0xf40b4869),
+ LL(0x56f0849d,0x5739e59e),LL(0x79c44251,0x1fc64939),LL(0x8b91a3a3,0xd401b24b),L_(0xd2207cb0), LL(0x9decd9c6,0x17f178e9),LL(0xcede5d5c,0xfa904473),LL(0x7a09efc0,0xca5c00a9),L_(0x1761360d),
+ LL(0x6aca6f61,0x4bda0113),LL(0x3b3dcab5,0x12ccd894),LL(0xb4db3fdf,0xb39be04f),L_(0x1c09bf2c), LL(0xb4705566,0xccbe5154),LL(0xe1559ff1,0xd84fec44),LL(0x11964906,0x9ceede3f),L_(0x0e1b9fc5),
+ LL(0x13111bdc,0x175d3f77),LL(0x17226b06,0xe0971341),LL(0x21244b52,0xd6fa5642),L_(0xfdbb39d3), LL(0x68da34f2,0xb9933942),LL(0x6759bac0,0xd7d7f790),LL(0xee292b1d,0x4382d48d),L_(0xd117a9f3),
+ LL(0xe877a209,0xaf9b8432),LL(0xa22db654,0x12572249),LL(0xbb09b923,0x1501cefc),L_(0xd5820554), LL(0xe0614220,0xaa863b6a),LL(0x397b3194,0x27337829),LL(0x1a9bf0b7,0x6912b5aa),L_(0xc767a242),
+ LL(0x38d01225,0xa0259e70),LL(0xf56ef5aa,0x8e85d7ee),LL(0xfd49df96,0x6bb4a230),L_(0x8f3a3f3a), LL(0x58b99e53,0x3c2be4ba),LL(0xcf1ea9c2,0xe49fcb3f),LL(0x4937a76d,0xdc9b73dc),L_(0x5ea4828a),
+ LL(0xa516c9ee,0x41610138),LL(0x30e01a74,0x71d5b83a),LL(0x8795351f,0x9a45e682),L_(0xa31707a8), LL(0x9edacc8e,0x17bd9c0b),LL(0x80f31bd0,0x871cc69c),LL(0x57013f03,0xb6b7b6e2),L_(0x1073b301),
+ LL(0x4855e4b2,0x124c67e8),LL(0x6946f5db,0xd4d7f50b),LL(0x494ae118,0xf16b9834),L_(0x0c0fe86e), LL(0x3a6a8d31,0x18d69af9),LL(0x54ebd047,0x7f8ed091),LL(0x9daffa88,0xba6e7c59),L_(0x54652a79),
+ LL(0x011788f6,0x9c64aa0c),LL(0x8403c566,0xf896522c),LL(0xcc8f1ea7,0x772627b7),L_(0x707ce584), LL(0x72bb812b,0x57f8a759),LL(0x4f42aa8c,0xc7e7a397),LL(0x4c06faeb,0xeea7a14b),L_(0x1edd837a),
+ LL(0x0c456e85,0xbacf3d29),LL(0xdb2d668c,0x861ef908),LL(0x17a88c53,0x25d01a4d),L_(0xb97ac689), LL(0x0b6e87ff,0x066301cc),LL(0x78d4d6b5,0x51763eac),LL(0xe4c44c3a,0x243f5364),L_(0x55bb2e54),
+ LL(0x69fe2b3f,0x623f7c06),LL(0x969019fe,0xa81b9914),LL(0xba6dd8e5,0xd33612e7),L_(0x0fd330c2), LL(0xc948497d,0x7184b686),LL(0x065a9367,0xd5e74279),LL(0xfa105e4b,0x4bfe5bea),L_(0x30ca8fc4),
+ LL(0x03d46275,0xfcb464d3),LL(0x7fb49121,0xdcb4ccb3),LL(0xf6934477,0xbdf563a1),L_(0x4412ba6f), LL(0x7c07acc8,0x4d4331eb),LL(0xe0dfac8b,0x768b2705),LL(0x022d151f,0xf65a4027),L_(0x251db799),
+ LL(0x5cbe2654,0x32707706),LL(0xbeb70e80,0x9739588e),LL(0x1d1ff202,0xe51c696a),L_(0x000ae445), LL(0xdd740418,0x25fcc7e6),LL(0x646ef912,0xac2dfbc7),LL(0x0d72b69e,0x1ff6f6ad),L_(0x059f3c0c),
+ LL(0x3ade75e8,0x3ac64888),LL(0x7ee14ba6,0xd957b10f),LL(0x7be01ff5,0x33f835d6),L_(0xc155847f), LL(0x45081b73,0x0c08887d),LL(0xda2f5358,0x4fc01e34),LL(0x84d416f7,0x15716e5d),L_(0x3950aa76),
+ LL(0xc4cafbc3,0xcd118e18),LL(0x60a29243,0x78d7034b),LL(0x4d198a7c,0x9ba63f25),L_(0x4b83593c), LL(0x81c83f83,0x9eb5e40b),LL(0xb8f7f9c2,0x3b1941e5),LL(0x27b87b90,0xb7229f73),L_(0x247578db),
+ LL(0x59afdea4,0xf6e5451f),LL(0xbdfb7efd,0x3c7977fc),LL(0x8262d80b,0x0ff79532),L_(0xb6d1bfa5), LL(0x85d46816,0x41a59faa),LL(0xbb16202e,0x815bfdff),LL(0xf25c4d84,0x26a648ca),L_(0x2a115df7),
+ LL(0xc47be93f,0x8807158f),LL(0x31f52fc1,0x71da23a7),LL(0xf790aca9,0x26957d5b),L_(0xe3199eb7), LL(0x571af638,0x3a3ff68a),LL(0xa6e9167d,0xb02eef0e),LL(0x78555759,0x1609b893),L_(0x1507c2ea),
+ LL(0xa99f1707,0x7a4aae59),LL(0x4be04c26,0xc84493c1),LL(0xf1b134ce,0x8f2fb8ff),L_(0xc7137a45), LL(0x8f6f7a80,0x73cd2591),LL(0x3b2e141f,0xf68459a2),LL(0xf4b9ddab,0x1d8a7278),L_(0x403dae23),
+ LL(0xa1fd53d2,0x3ad117de),LL(0x47d15513,0x75e31939),LL(0x58a5dfbd,0x3251c208),L_(0x66a06b3d), LL(0x8436c37d,0x65ab378a),LL(0x5a3fb858,0x3a685733),LL(0xe6172e78,0xfa11b001),L_(0x25e5c930),
+ LL(0x18e18997,0x48c2dc2c),LL(0x900eb7f7,0x814d21d9),LL(0x198afe84,0xf76ecf91),L_(0xab542184), LL(0xb918572f,0xf53020dd),LL(0x31471cf4,0x365cb3df),LL(0xa6a9ebf4,0xf8ad1ad6),L_(0xf3563966),
+ LL(0xf1859231,0xcb1be872),LL(0x1ad60df0,0xfaa10d6a),LL(0x11273c1d,0x240336fa),L_(0x4a1692f1), LL(0x6bfe9509,0x88653660),LL(0xf81505d5,0x7b0d301b),LL(0xd427be59,0xbd85a9ef),L_(0x1a92bc3d),
+ LL(0x72600cd8,0xe9cae1c4),LL(0xab08a5cc,0x3d1457c8),LL(0x96865fe9,0x9a1bc1e7),L_(0x438f5a09), LL(0x7727a4f6,0x09a2a9db),LL(0x33e95a6f,0x028d0a98),LL(0x9656e0c0,0x7f3b01db),L_(0xeae74794),
+ LL(0xb1f41609,0x060c3752),LL(0xc0ad59f7,0x6efb7250),LL(0x0bd8bd31,0x79016736),L_(0x34d2ef7f), LL(0x8739f62d,0xf14247f9),LL(0x7675377d,0x29b78fc9),LL(0x5b2e893a,0x5f2b1e7f),L_(0x3c1437bc),
+ LL(0x380ddade,0x014c7c14),LL(0xe37d7ead,0xc2d7837a),LL(0x78897ca3,0x5567dd34),L_(0xfa7b8f4b), LL(0x00642d56,0xf735f752),LL(0x7fd93e92,0x8afd8b87),LL(0x6eb02b4e,0x120f5319),L_(0x1ccf74f8),
+ LL(0x8fc31699,0x41d511e3),LL(0xb78232db,0xbdc4fb64),LL(0x9841bbd5,0x207bfaea),L_(0xd0f130c1), LL(0x38fcb8da,0x6ba5dcee),LL(0x93e47594,0x21f2d335),LL(0xf78fd1c0,0xc6f634fd),L_(0x717d258b),
+ LL(0x09a676cb,0x414f2daa),LL(0xa55cfcad,0x4cbc9d7a),LL(0x3b973302,0xb409e95d),L_(0x7da7223a), LL(0xd16a5ca9,0xf92a6554),LL(0xb7642b9f,0x153e5024),LL(0xa08470dd,0xae4dfb2b),L_(0x8fd81632),
+ LL(0x5b3c44c4,0x45031642),LL(0xc6ae8b05,0x335c400a),LL(0xd4b606ca,0x6b34a475),L_(0x4a823453), LL(0xf3ab94ff,0x746295e2),LL(0x25948202,0x4b9b612a),LL(0x9d957566,0x510e67f8),L_(0x42ddbb08),
+ LL(0xdc56f265,0x9f7dfe87),LL(0x20005269,0xe3386448),LL(0x104ea5b5,0xac4c4feb),L_(0x6565a54e), LL(0xb2f8650d,0x186e3514),LL(0x50e692b2,0x58c2701b),LL(0x81927ca6,0x81220e7e),L_(0xa69b1829),
+ LL(0x727a95ea,0xfb0e9702),LL(0xf0b23c9f,0xcca5f38b),LL(0xdb71dd75,0xad31c5dd),L_(0x93004978), LL(0x3ff02652,0x683b0e57),LL(0x2b3b008d,0xc6e32a5b),LL(0x4ab25a51,0x283f183b),L_(0x0cc76852),
+ LL(0x08ea3768,0xf7f76eae),LL(0xbcdd82ad,0x222dd486),LL(0x5b8927a0,0xdc4a955f),L_(0xb76f9687), LL(0x605b6b78,0xc80579f6),LL(0xb80f7796,0x4cf36f45),LL(0x94402fad,0x0a226060),L_(0x0c94e0f7),
+ LL(0x77db1b5e,0x4fe36153),LL(0xb19d463f,0xb32ea8ef),LL(0xa09373a7,0xd4f68719),L_(0x1f1869b7), LL(0xd8828434,0x8c0026e9),LL(0x8f8f9197,0x16af4c49),LL(0x8f7a154b,0xd4672394),L_(0xee9c7e14),
+ LL(0xe432397f,0xd0196172),LL(0x035a30a5,0x114f01ee),LL(0x12143827,0x2f06e8aa),L_(0xcd20f526), LL(0x00bcfcbd,0x76ee873b),LL(0x542f1d14,0x8ff02da4),LL(0x786da906,0x7e7e6c65),L_(0x65c3eef1),
+ LL(0xc8866c5c,0x0d7b5118),LL(0x5cd6ca19,0xef5be83d),LL(0xb37c41ce,0x4b76c64d),L_(0xf34bee15), LL(0x3d28da12,0x8ef7cb6d),LL(0xf55195fb,0xa3c8a2d4),LL(0x4369465e,0xc8c85ab8),L_(0xe811f166),
+ LL(0x08818979,0x17f1f556),LL(0xbf0f506b,0x251cc269),LL(0x686c57b8,0x865fb805),L_(0xa325b2ac), LL(0x19c7f60f,0x23566eda),LL(0x40af0c7c,0x47f95f9f),LL(0x867b619f,0x1958dbaa),L_(0x164ce142),
+ LL(0xfc7b0693,0x44b01395),LL(0xedbed37e,0x0d676d86),LL(0x075607b2,0xe2ae6225),L_(0x9bd85253), LL(0x56d68f4b,0x7e636075),LL(0xb247649e,0x1ffba2be),LL(0x5c1ff02f,0xc237448d),L_(0x063c33cf),
+ LL(0xc3ea5576,0x52c5f87e),LL(0x2fe94caa,0xf135c024),LL(0x593535ee,0xe0965b4b),L_(0xf93cf6d1), LL(0x54fedc18,0x28d4b11a),LL(0x6c77585d,0xe5297d99),LL(0xb0d741c2,0x39caed90),L_(0xcc98dae9),
+ LL(0x340fdc0b,0x1b8201fc),LL(0x44198c3e,0x248c333c),LL(0x5f236490,0x12ee4946),L_(0x0789670e), LL(0xcbc6b050,0xee23385a),LL(0x3c3d5d85,0x630f7175),LL(0x0000016a,0x3f6e71ce),L_(0xad6ec3de),
+ LL(0xc6c3de31,0xf99b211a),LL(0xca35fe5b,0x549ffc41),LL(0x5ffb8aa4,0xbc4e1e52),L_(0x6ac77d41), LL(0xe552f85a,0xf54af34b),LL(0x6e1ccff3,0xd61618d2),LL(0x5bb20166,0x5776aea6),L_(0x7336f961),
+ LL(0x535ea11e,0x565a5471),LL(0x8f3dcba8,0x4200ddee),LL(0x8ee2aacd,0x2493fe70),L_(0xab90e06d), LL(0x048f6037,0xc2e41220),LL(0x075b150b,0x3193a2ea),LL(0x3c56b2e4,0xc4609ea4),L_(0x2fdd776c),
+ LL(0x4276f086,0x57d5dc17),LL(0x2aa19794,0xa8a6408a),LL(0xd70d74f7,0x98acac12),L_(0x351c3c6f), LL(0x93cd39aa,0xb4c10685),LL(0x5a2bba35,0x56a7276e),LL(0x2685e5f9,0x3eeed659),L_(0x8a344719),
+ LL(0x2d701e0e,0x22e61da3),LL(0xbff21920,0x4511147f),LL(0x403fd833,0x6080d968),L_(0xb3b3779a), LL(0x2957083b,0x38eb9ccb),LL(0x2ed5dc9b,0x1be2ace4),LL(0x726301f8,0x002d8909),L_(0xbe322533),
+ LL(0xd1f9235a,0xf591d929),LL(0x0184d742,0xdc207a6c),LL(0x5e691f61,0x20b8f8e8),L_(0x2095a193), LL(0xaeb5ac0a,0x7eacabb9),LL(0x3b17347c,0x0985df07),LL(0x04b8e782,0xf8047be0),L_(0x5ad11ec9),
+ LL(0x8492830a,0x4f347f1e),LL(0x841e8dca,0x7d0fc13f),LL(0xf365c6c6,0xa0e662a2),L_(0xded71c8e), LL(0x8d246f45,0x9dcc1860),LL(0x852d364c,0x5bfa3ba2),LL(0xd9a27ded,0xb281e327),L_(0x80b9b9f1),
+ LL(0x6bab642c,0xbff128cd),LL(0x692c67d2,0x268f3893),LL(0xfc73c613,0xcd24728c),L_(0xa40f87b1), LL(0xd40e3e5a,0xf065f5d7),LL(0x96f653a5,0x15d0cf49),LL(0x4ad712bb,0x70e00818),L_(0x2102b8b4),
+ LL(0xf1c993cb,0xa2f0722e),LL(0x214a8d8b,0xe7c142ac),LL(0x8af34ce1,0xce47aba3),L_(0x2d01c664), LL(0xb6c1f1ff,0x49dac9d9),LL(0x8e33c0f4,0x1baa4d4c),LL(0xdbfb3b98,0xd927e1a8),L_(0x80f00079),
+ LL(0xde4413ab,0xad27b0b5),LL(0xa2997bb5,0x0077242e),LL(0x5d3ac419,0xe50d3185),L_(0x185f649f), LL(0x6b5c4eea,0x4a8b1fad),LL(0x210cc7de,0x30ac4e43),LL(0xe0253dce,0xf07461c4),L_(0x4bf807d6),
+ LL(0x01947899,0x818e99b8),LL(0x9008b9c3,0x05ed8f7b),LL(0x09f78f1a,0x2fb78a6e),L_(0xa5da0ebd), LL(0x4c2f0cce,0xfdd48d7b),LL(0x79765db8,0xe380dbfc),LL(0x9600539c,0xbb3a3bc6),L_(0x3627d4d4),
+ LL(0xea2bbe08,0x394029b6),LL(0x7ac327d1,0xc8ab0424),LL(0x90339a91,0xda368bdd),L_(0xab696429), LL(0x0fe39b21,0xc20f1366),LL(0x32fec057,0x8075ba9a),LL(0xdc668935,0xa20bdd31),L_(0x2abf3c1d),
+ LL(0x513bd424,0x02a9ea32),LL(0x7d6a8a11,0xe477baa6),LL(0x52b0bc16,0x4583bc9a),L_(0xba81bd4a), LL(0x287b6485,0xf11b84b0),LL(0xae92c68c,0x7925b118),LL(0x4ab367b2,0x8ff3e481),L_(0x33179660),
+ LL(0xb6f13800,0x0ffc4673),LL(0x56722205,0xf9b0dfda),LL(0x2bd4103b,0x56acfc3b),L_(0x1ce74c3f), LL(0xa87de434,0x046c39cd),LL(0x41e5b749,0xdebd1720),LL(0x11fa933d,0x3f6c6fec),L_(0x275b834e),
+ LL(0xae4601fd,0x06034734),LL(0x58ee806e,0x104d85dc),LL(0xca3c77a5,0x8bca0d2e),L_(0xb812f136), LL(0xc78c356f,0x70ae3402),LL(0x7dc1f03f,0x322e72ad),LL(0x07c1fe3f,0xd0253c44),L_(0x511d1058),
+ LL(0xc2f400a7,0x2291a21d),LL(0x993f820b,0x287eac12),LL(0x1680907d,0x03a00f86),L_(0xd919412a), LL(0xbadddbc3,0xc5e15b28),LL(0x0ba18a53,0xf30664e1),LL(0xb1606671,0xc87b6603),L_(0xb55b207a),
+ LL(0x1873a8e5,0x5f55c7e2),LL(0x6eaa78ce,0x33f083bf),LL(0x95c9fed8,0xe416fc1c),L_(0x7e0f68c5), LL(0x02778f82,0x07eef5cc),LL(0xdb2aa0a1,0xa94149df),LL(0xc8c44cfd,0x2d270d3f),L_(0xec06f559),
+ LL(0x7ca9f958,0xdb514ec8),LL(0xd0ace135,0x9718dd09),LL(0xe2bf5a99,0x325fe3bd),L_(0xe5c7ec48), LL(0x4f0b0621,0x78990d74),LL(0x76fa9487,0x5e70b57d),LL(0xdfbda68c,0x6e9d11e2),L_(0xda96d406),
+ LL(0xd61361bb,0xf97cf589),LL(0xc96cb924,0x7b21af76),LL(0xf64ebc1a,0x03a72d66),L_(0xecbebd56), LL(0x4b021c91,0x39df1cca),LL(0x9863869e,0xb84c6c05),LL(0x9b6a3082,0x62692bf5),L_(0x977cbcb4),
+ LL(0x94bf9bf5,0x79c2f57b),LL(0xb9be753d,0xe0d00e09),LL(0x49f82bc9,0xb9c9a088),L_(0xcc0f3b6b), LL(0x1f589bd1,0x11cd1677),LL(0xe709a25f,0x8f952cff),LL(0xb5eec978,0x016b826e),L_(0x3188c1dc),
+ LL(0x8cd03f0b,0xf4d9e042),LL(0x2b04b26f,0xb07e4630),LL(0x361c9252,0x5bbca5ce),L_(0x783f801a), LL(0xe687c320,0x7bd9a485),LL(0x465590b5,0xe200e18a),LL(0x0e254cdc,0x50dce2e6),L_(0x49ff7ac4),
+ LL(0x4b5e8399,0x284e641b),LL(0x33c76e5a,0x0556fa64),LL(0xa75c4fae,0x4cc4b972),L_(0xc36d03ba), LL(0x90fa7978,0x6a40b04c),LL(0x4fef28c9,0x97401c28),LL(0x613bfe61,0x443845a0),L_(0x5144c164),
+ LL(0x532b2d68,0x482b7779),LL(0xe955f441,0x123aa16d),LL(0x6886e7e9,0x9147c317),L_(0x1d0658eb), LL(0x1530f2af,0xaed04ac0),LL(0x192c5796,0xa4111d16),LL(0xd86157ff,0x7406594c),L_(0xbf39202c),
+ LL(0xafae6c6f,0xed33d4b3),LL(0xc5df16a7,0x008ec0c8),LL(0xfe186e4e,0x7e4ed374),L_(0xdca675ee), LL(0x2534f6e8,0x798a9b30),LL(0x82a138f5,0xfcf997cc),LL(0xb58b2b67,0x2f620d55),L_(0x634f7d88),
+ LL(0xe8013df8,0x5dcfcfb0),LL(0x7b9259dd,0x7a765b72),LL(0xe0fbd7bb,0x4e7374be),L_(0xc2b9a098), LL(0xfe9b1e78,0x375f54f1),LL(0x0f6c804f,0x55dc463e),LL(0x202fbb6d,0x8d697af5),L_(0xe7949513),
+},
+/* digit=13 base_pwr=2^91 */
+{
+ LL(0xbcdbe445,0xcb4a833d),LL(0x57ca0395,0xb07c1b51),LL(0xef7d725e,0xdc3b82a8),L_(0x1e9a35e2), LL(0xaa5a7ac9,0x01e0c54e),LL(0xc707131f,0x2b2d5196),LL(0xd220aca6,0x736d91c9),L_(0xde0d6eba),
+ LL(0x74d6d0bb,0x9af89e67),LL(0xfa0e831e,0xada42e0d),LL(0xda49ba83,0x83b9c4ec),L_(0x782ab495), LL(0x12dfdcae,0x7e0a2cb4),LL(0x4c92a243,0xf7e3a9a3),LL(0x6ed0d332,0x1f8c692d),L_(0x5cfab000),
+ LL(0x634cef8b,0xff5ab01d),LL(0xa43c6f4e,0x6fe3ecd8),LL(0xc1015db1,0xfcc7ca4c),L_(0x9199e5e3), LL(0x795d4927,0xed944d52),LL(0xe4551e73,0xf5f41299),LL(0x8f02bb95,0x4007343b),L_(0x896481e0),
+ LL(0xab703650,0x6b243c97),LL(0x660da927,0x8b9a0873),LL(0x0ef0ffd5,0xb6e8c899),L_(0x8a32e4b8), LL(0x2e1c11d9,0x154379bf),LL(0x2d0a9ded,0x4382cb75),LL(0xc876e0d3,0xc42ec7d1),L_(0x41c57824),
+ LL(0x1ce64f94,0xa2eb2c00),LL(0x1eb0301b,0xe1a22445),LL(0x450ed02e,0x4205e69b),L_(0xf1b1c831), LL(0xc76dda33,0x62db01d8),LL(0x168f45ba,0x633bdf3e),LL(0x95c86470,0xf9a6b309),L_(0x9bb55ae5),
+ LL(0x71aba88f,0x590711c2),LL(0xdea8afde,0x0b6ab427),LL(0x87bfe939,0x1d7e1090),L_(0x54be137d), LL(0x7ebcdd75,0x2a937fd4),LL(0x5fed0f5c,0x3da3197d),LL(0xc4155a57,0xf1cea938),L_(0xe2bb2c19),
+ LL(0x6a4807e4,0xc0c52eb7),LL(0xfe9c4a62,0x12ba26fb),LL(0xda7a7914,0x001d4756),L_(0x48b356bb), LL(0xce833468,0x3290dbb2),LL(0x432f5193,0x2b0a3429),LL(0x579c91eb,0xc27c2657),L_(0xcb222ca0),
+ LL(0x6983b44c,0xf27d3e69),LL(0xf7665b89,0xe4a043b5),LL(0x5a97c010,0xc8f8a3c7),L_(0x4ed639e6), LL(0xb9a3137d,0x5655ed33),LL(0x6987fe61,0x0b6dca4a),LL(0xc1a3c9bb,0x630b3026),L_(0x9305872d),
+ LL(0x082a09e8,0xffe89fc6),LL(0x673fe488,0x9f4f85f6),LL(0x0b13732a,0xba6e1981),L_(0x1f59e6b4), LL(0x26eb2b18,0xa4afe844),LL(0xaddd3cd6,0x91a5d7b7),LL(0xeeac1c21,0xe71f5fe0),L_(0x5d6e8430),
+ LL(0x3f0bf1e4,0x031e908e),LL(0xecd2060c,0xbc16afc5),LL(0x6e2d4301,0x90a23e58),L_(0xd061f3f4), LL(0x2549fd21,0x52f4ef15),LL(0x4103c527,0x5b4c8dd8),LL(0x1a5fbbc3,0x7457c84e),L_(0x6620daf1),
+ LL(0xa3742f5a,0xe0a87786),LL(0x20460a16,0xe7aa9e66),LL(0xba62daa3,0x65327959),L_(0x4241a339), LL(0x7da31b21,0x7fbf3e8d),LL(0x352aab9b,0xe1a7865a),LL(0x877c379e,0xea576b89),L_(0x5f93fdc5),
+ LL(0xaa616a3a,0x662a3f35),LL(0x94cdd0da,0xdd7d18e3),LL(0xee30f511,0xf25f9c46),L_(0x35fff2a0), LL(0x3e51e653,0x81e804d2),LL(0x5957ab11,0xb0aaaab1),LL(0xa52da544,0x89ee1376),L_(0x8411811a),
+ LL(0x97063083,0xf2d42cdd),LL(0xc2eb7ee5,0x9cb9423b),LL(0x6ed009de,0x746461d4),L_(0xc182c461), LL(0x6b0d52f8,0xe78fe609),LL(0xde14941d,0x6887a9cc),LL(0x8730c3cd,0x0f586a94),L_(0x2cf25d5d),
+ LL(0xf21a3a3a,0x38aa8cf8),LL(0xd96cec97,0x3dd4e3e4),LL(0xf1f81f18,0xee849585),L_(0x6ec8f23e), LL(0xb30df029,0x1e4514ba),LL(0xaf980c70,0x757e6771),LL(0x3b2305c3,0xa3525eaa),L_(0x755d2034),
+ LL(0xb94b1aa2,0xebe6c1cc),LL(0xb228a915,0x1c4d6e36),LL(0xfa33270b,0x5d3856a1),L_(0xf1ba0e3a), LL(0x77b4e048,0x63f53943),LL(0x99a1ff3b,0x7466b59d),LL(0xaea29806,0xb1050d57),L_(0x9d139cfa),
+ LL(0x0fd330ad,0x0f394d0b),LL(0x27d1a20e,0xe4d013eb),LL(0x99b62540,0xaa1c17a9),L_(0xb03afc54), LL(0x8f6f2743,0x7366a618),LL(0x449f676a,0x88e9ae3d),LL(0x8818aa14,0xd2fe924a),L_(0xf5d1f438),
+ LL(0xfd68c56f,0xd02cd00e),LL(0x94c49868,0x5f260a20),LL(0x9c693311,0x7c1f3266),L_(0xe30a0258), LL(0x5b2551ac,0x9f545dde),LL(0xbdeac1ae,0x19f87afd),LL(0x019bf350,0x58397798),L_(0x787035be),
+ LL(0x46ea826b,0xc4da4263),LL(0x10febee0,0x43744264),LL(0xbfc3581d,0xcc933457),L_(0xd3126394), LL(0x9cbecb37,0xe0071ca1),LL(0x715c9dad,0xcf0cfc02),LL(0x67a2c9e1,0x2f9bd24a),L_(0x47f400b4),
+ LL(0xa57e540f,0xd472cc15),LL(0x1ab19257,0x0b60e719),LL(0xcd92d76f,0xca1c9c30),L_(0xb75f7cec), LL(0x8103a773,0xa305744b),LL(0x34bb833a,0x54b38b68),LL(0xd6e1cdb8,0xb252c82f),L_(0xbbc88ea0),
+ LL(0x935833d7,0xd0e4995f),LL(0x44ed9975,0x87f60eef),LL(0x933733ca,0x379092ba),L_(0x0e167f70), LL(0xd4945af6,0x60eeff1a),LL(0x589a5723,0x1d6d1def),LL(0x4bee290d,0xe87f42f5),L_(0xbdc1579e),
+ LL(0xb222f294,0x080ba4e8),LL(0x83c59be1,0x8ed3f3c1),LL(0xfdee70ba,0x58ce1c82),L_(0x309979e1), LL(0x8490a253,0x6ed1e744),LL(0xc3fded2d,0x0602a508),LL(0x585e149e,0x7fa41773),L_(0xb933ab59),
+ LL(0xf0a3e292,0x74dc9c31),LL(0x0f2c66c5,0xc78baacd),LL(0x01ba1bb0,0xe5b73558),L_(0x328bebc7), LL(0x9cf50576,0x5421bd61),LL(0x76efecbb,0x241cb4c6),LL(0xc421cfb2,0x9ba297a8),L_(0xe31b7671),
+ LL(0xf0b66ab8,0xd87b31c9),LL(0x3aacb600,0xcf835fb0),LL(0x2f9c67c3,0xaee5e6cf),L_(0x6453b1bf), LL(0xd04298de,0x0411e445),LL(0x0d41aa91,0xbec90b82),LL(0xe6adb2bb,0xb30b9c0e),L_(0xdd7ea812),
+ LL(0xda605906,0x5f01a30b),LL(0xe7f26ffc,0x7c053c40),LL(0x40f7d79d,0xc39feb03),L_(0x232940c5), LL(0x3d73c35a,0xe472e81d),LL(0xe3395fd8,0xdea2bf33),LL(0xed66fd6f,0xddc57518),L_(0x675b9966),
+ LL(0x7095dc92,0x07f66d27),LL(0xb47087dd,0x9c4ec651),LL(0xfd209ae0,0x35803afd),L_(0x6fb37653), LL(0x51ed5eaf,0xc9356091),LL(0x47c63c1c,0x19e52bee),LL(0x0676dac6,0xd87e6c27),L_(0x6badd30e),
+ LL(0x83877c71,0x39e61abc),LL(0x58d7a9d9,0xa88e05f0),LL(0x7885ad28,0x53bfba53),L_(0xb10f5fdb), LL(0x8e433b9f,0xd6a78477),LL(0x0f088cf6,0xcefdc6a1),LL(0x3ce9d748,0x27d9ed71),L_(0x648c4c3c),
+ LL(0xe57aeaa9,0x7dbbbc39),LL(0xe13d51e3,0x5c942e4d),LL(0x7d7aed19,0xe660d0ba),L_(0x25bcdf2d), LL(0xff40dd8a,0xcdf314b5),LL(0x5faa85f3,0xa625d183),LL(0x9d4344c2,0x54f2035c),L_(0x5243fd7f),
+ LL(0xd120f88e,0xe3275570),LL(0x79d8c8b5,0xe344b66c),LL(0x8d5e8c7f,0x1cdb23ae),L_(0x8c372c12), LL(0xce526de3,0xe64e6355),LL(0x6f104a11,0x5edf30db),LL(0x7e00559a,0x3501ee2b),L_(0xdc58f8f4),
+ LL(0xa6698b0d,0x91c3e912),LL(0x65e168bf,0xbb24391d),LL(0xe1e797f6,0x0526a13b),L_(0x6c3a27f6), LL(0x41e4a8d4,0x63a82271),LL(0x759095e6,0xf6fd3e09),LL(0xd1ade148,0x85041faa),L_(0x1d102e98),
+ LL(0x7675921b,0xb30c5e67),LL(0x781de03f,0x9a004497),LL(0xb5aac131,0xcaf13420),L_(0x2a74de9b), LL(0xced86c6a,0xc60fb50a),LL(0x4039952c,0x8cd4dd3d),LL(0xdec98657,0x5092d4ea),L_(0x573afadf),
+ LL(0x9fb10f98,0x67b904af),LL(0x7233bca1,0xeebc687c),LL(0xdae52182,0x13aadd13),L_(0x7d61309e), LL(0x59a01f8b,0xc7db8080),LL(0xf6d5d889,0x5433ce07),LL(0x8b26a71a,0x0c3a71bb),L_(0x69b8c725),
+ LL(0xd29e534f,0x215aa2f4),LL(0x7bb1ac35,0x5f00b26b),LL(0x3c54a3cb,0x71ec2585),L_(0xf6cd94c0), LL(0x4c553b93,0xf86c23e2),LL(0x1b7d9626,0xdd6cfc3d),LL(0x0fb40ab0,0x4647a750),L_(0xeb4bdb5e),
+ LL(0xa51a2b17,0x1bbce0ea),LL(0x6f2f98f1,0x7e78ccf9),LL(0xc6736591,0xbaa1d2e3),L_(0x47e735c5), LL(0x6b8866aa,0xc5b9e6fb),LL(0x8aef23dc,0xc39a4975),LL(0x712336e6,0x86d2dbfa),L_(0x19715594),
+ LL(0x106db862,0xc495534c),LL(0x83770bdf,0x75c25358),LL(0x05a076ec,0xf2a1fa9b),L_(0xc80d0362), LL(0xbab703f6,0x2b054aeb),LL(0xb0c6f6de,0x9e9ed0de),LL(0x42646b39,0xd95a6334),L_(0xddad98a9),
+ LL(0xbcf088fe,0x373df018),LL(0x7bd97cea,0x2646d8cd),LL(0xa20f1b7c,0x3bc4db1d),L_(0xdd201f09), LL(0xf3f061d1,0x7fc330d4),LL(0x5f1ec56b,0xd64fa0dc),LL(0x93be4afe,0x239a905a),L_(0x38df95b1),
+ LL(0x9491ca55,0x3a2368e4),LL(0x4fc84a15,0x840339bb),LL(0x60229ac3,0x0f74bf45),L_(0xb9a147d0), LL(0x6bb23f64,0x6df7548f),LL(0x928eccc2,0xbd4ae1ae),LL(0xa5c7651d,0x85fa24af),L_(0xe98fba58),
+ LL(0xd9ea606f,0x72e722f7),LL(0xde7a39d8,0x02dae11e),LL(0x6f289df9,0x4f148db1),L_(0x3efce901), LL(0xe8df6027,0x0dc6bfc0),LL(0x25925285,0xc2c848fa),LL(0x726e5bf2,0x0bc8372a),L_(0x4993590e),
+ LL(0xe513cc61,0xb368f5d3),LL(0x1b56d61c,0x2acdbaae),LL(0x077919ee,0x69129848),L_(0xd6bce458), LL(0x5c03af06,0x6892cac4),LL(0xbf732964,0x13156875),LL(0x86df2c46,0x15d63bed),L_(0xc24215d0),
+ LL(0x85ef7366,0x7ea45182),LL(0x4f6a510a,0x7d4f7ca5),LL(0x2e79b2d0,0x5befddd6),L_(0xdfce6391), LL(0xeb6e8178,0xd7c05293),LL(0xbb2671e0,0xfebc1ad3),LL(0xc2ef9919,0x5ef848b7),L_(0x3034a5d7),
+ LL(0xec0fd6a3,0x4834ba2e),LL(0xd4612c03,0x7006255f),LL(0xee7cbb5c,0xa240c28a),L_(0x9d74ecc1), LL(0xe8bfcc1e,0x36f2363a),LL(0xe755acbe,0x2c7fdeac),LL(0xee2e792a,0xfe7f2c9f),L_(0xf3a0b1ef),
+ LL(0x21f1b866,0x7a207076),LL(0xb0caba72,0xa289580c),LL(0x26c6a4fb,0xac8c38be),L_(0x46fba43d), LL(0x603a204d,0xc96f5b0f),LL(0xaae0bc34,0x07974abf),LL(0xdd93d467,0xd384c831),L_(0xd3e228d7),
+ LL(0x130cf278,0xb2d57bad),LL(0xa4b0a795,0x2e92cb97),LL(0x0b8251c6,0x04325b28),L_(0xd825f27e), LL(0x630e8e9e,0xcda5985f),LL(0x1bba4e62,0xf6775b8c),LL(0x9cc53c03,0x466530c7),L_(0xca08b958),
+ LL(0x9b3d46a1,0x6911dd6e),LL(0x64d4f9aa,0xf5c72cad),LL(0xaf7d9d93,0x53a3ea3c),L_(0x99f4337b), LL(0xd879f3e2,0xeaba3d43),LL(0x7bd203ea,0x4c921337),LL(0x3b59edc0,0x7ee8ea79),L_(0xdbb3851a),
+ LL(0x64c557a1,0x70b7979e),LL(0xb3681c37,0x482d3b99),LL(0x08f6017c,0xecf693f0),L_(0xf2fe6d70), LL(0xe8816978,0x7c8670c4),LL(0x8a10a4b5,0x05b8eed1),LL(0xa8713371,0x0ebddf9f),L_(0x6f3c3b96),
+ LL(0x50dc1443,0x884f22ec),LL(0xf9400068,0x5f885c0a),LL(0x4da67f62,0x6b4ecc34),L_(0x170f203f), LL(0x0181b70d,0x3f227a67),LL(0x844eab79,0xafb114cc),LL(0x5b40835b,0x2f5bb436),L_(0x7b9f2c6f),
+ LL(0xdaec76bc,0x6deef6a5),LL(0x338dc21a,0xe70560f2),LL(0x8e70fab8,0xdf0c450d),L_(0xd256f11d), LL(0x916202a8,0x05568dde),LL(0xfb8b1d84,0x89f0919e),LL(0xb5670da6,0x97387cce),L_(0x8943fa2b),
+ LL(0xc269a34a,0xae4d60ad),LL(0xf62da5da,0x27a5a54f),LL(0x560e5ad7,0xfd2940f8),L_(0xab3236ae), LL(0x86446f6a,0x2f2ee978),LL(0xb56b7c8a,0xa481c719),LL(0xd1f9e2af,0x99fe0c80),L_(0xdc1ec6c4),
+ LL(0x4c354b32,0x9d2731ca),LL(0x45db9456,0x9583d77a),LL(0x549fab4d,0x20743202),L_(0x133b9227), LL(0xc9afa8d6,0x6ee70bf6),LL(0x61e414f2,0x71181b55),LL(0x34dfc171,0x186cb701),L_(0x05ba8622),
+ LL(0x784904dd,0xef91aeb1),LL(0x2ce39834,0x466ca745),LL(0x9dba0e94,0x3efbbed0),L_(0x6d055926), LL(0x818f1161,0x238404b3),LL(0xb2aba397,0x7f378101),LL(0x9026e5ef,0xd9ddeb02),L_(0x639d63b6),
+ LL(0x50f516e3,0x359a1ffe),LL(0xc1a03316,0xea7c7fb8),LL(0x2be043ec,0xe26d37f4),L_(0x34fbd1da), LL(0xd8d23c82,0x97f967f3),LL(0xf3027282,0xf97e68ce),LL(0x0cf39dbb,0x0f3321ca),L_(0xb0d6de7c),
+ LL(0xd200dfe0,0x890af600),LL(0x905f6954,0x1e4962b1),LL(0xd80a6211,0x78562fa6),L_(0x0e1b429e), LL(0xdb5a70a8,0x68abbf8d),LL(0xdf21b056,0xbffea5c7),LL(0x99114570,0x6e5308c1),L_(0xd35cddc0),
+ LL(0xdfd77bdd,0x16448af4),LL(0x5bcbe7ef,0xcb49f269),LL(0x9f4c424c,0x7c95aa03),L_(0xb01ff8c8), LL(0xd5948dcf,0x93acdc43),LL(0x2ddd8b66,0x7efb93e4),LL(0xa8e311a0,0xe08e348f),L_(0x7b4dacb7),
+ LL(0x96c4f395,0xfa10af74),LL(0xd4e05b0b,0x489d01bb),LL(0x1a4d0c16,0x5457e489),L_(0x70983e98), LL(0x1331b4da,0x84eb66f4),LL(0xf38823d2,0x8054cf79),LL(0xb191cf89,0x3e7eb0cb),L_(0xa37a2976),
+ LL(0x8d0cc3cf,0xa6a534ca),LL(0x7bc55c38,0xa917d88e),LL(0xc01d22dc,0xba878e3c),L_(0x2cf82f89), LL(0x927b4948,0xfb3f69e6),LL(0xfab01485,0x44185c63),LL(0x586c00a9,0x151ed75b),L_(0x923f3333),
+ LL(0x72a46aaa,0x519ea031),LL(0x8709198a,0x75f6f740),LL(0x1a09f429,0x0df7057c),L_(0xd41f8134), LL(0x0511f342,0xb8c291d5),LL(0xb5c05e96,0xbd814e25),LL(0xa548461b,0xdfcbbc5c),L_(0x17c27bbb),
+ LL(0xf029f708,0x3ec594c8),LL(0xe348f36b,0xaacdcc44),LL(0x76cebcbf,0x6e7c6e83),L_(0xb7e69828), LL(0xa2a8a4ff,0xb47c1c29),LL(0x994406d9,0xebdc1ae0),LL(0xed49a01f,0x63ac12b4),L_(0x513ab51d),
+ LL(0xaa4b3b47,0x7e957ed9),LL(0xa7f34b22,0xe3393b0f),LL(0xde08b775,0x8522afee),L_(0xacd12226), LL(0x5f73d8d2,0x39d26476),LL(0xa513c2b3,0x7e58e0f2),LL(0x213036c0,0xa0e99b0f),L_(0xfb5cf2f2),
+ LL(0x8a626b92,0xbe1888a3),LL(0xbb87a44b,0xc627fd2d),LL(0xd55c88b6,0x75c0ce87),L_(0xe7f3660a), LL(0x96806d02,0xdce56555),LL(0xc75c5771,0xa0f7c5e9),LL(0x286d7145,0xd7ff4a5f),L_(0xebc158a2),
+ LL(0x9f5793c9,0xf0bdad25),LL(0xb6481975,0xde77b0dd),LL(0x308c67ea,0x506de99f),L_(0x814dd111), LL(0x9d70efea,0xf8b6908d),LL(0x664f6334,0xa22f9208),LL(0xabb48b09,0x305250b9),L_(0x589eade6),
+ LL(0x04d51ba4,0x69790978),LL(0x61258755,0x55c72c44),LL(0x340e8617,0xcd9b6116),L_(0xabcb82e4), LL(0x80b0004b,0x8b257151),LL(0x337e5242,0xae7d889b),LL(0xd95f9a8b,0xf7035183),L_(0x7680c71b),
+ LL(0x96f17da3,0x21e71bcf),LL(0x808dcdbd,0x1dde1b45),LL(0x3f515a1d,0x1f620fc3),L_(0x06bbadac), LL(0xd2651946,0xa7f48789),LL(0x0f2c7fea,0xa9e9b7f9),LL(0x048d20b9,0x2efd58e7),L_(0x44fa3d36),
+ LL(0x095a8f26,0x6fa2edc8),LL(0x653c44b2,0xad7dc081),LL(0xf2b8fbbb,0x88a7b80f),L_(0x02238eac), LL(0x2ca3a2a6,0x00c09332),LL(0x7cf3c758,0x0d577a60),LL(0x54d150a9,0x1837cf45),L_(0x9354157c),
+ LL(0xec967632,0x281b5c05),LL(0x5e849910,0x580362ba),LL(0x832277a8,0x702cc617),L_(0x1dbc415a), LL(0x7335bdc9,0x26119f95),LL(0x90031be3,0xa27ab673),LL(0xc7055ffb,0x652580b5),L_(0xe35bf60a),
+ LL(0x8c6adedb,0xebd0f498),LL(0xe1e7a7db,0x993107cf),LL(0xb75b4edf,0x0232f8ad),L_(0xc245bc0d), LL(0xa2592946,0x48d03da4),LL(0xb9489c19,0xda871c00),LL(0x8ff4aaa7,0x746e818b),L_(0x8df35cfe),
+},
+/* digit=14 base_pwr=2^98 */
+{
+ LL(0x23800fac,0x8b12655a),LL(0xd7cd8acc,0x66a4179c),LL(0x33023ec9,0x1205108d),L_(0xc1d74575), LL(0xa87c96ad,0x402e3b9a),LL(0x744ac2f7,0xd3dbe7de),LL(0x6b327511,0x5723ac5b),L_(0x244ec59a),
+ LL(0x7ab235be,0xbede2315),LL(0x536bf0cf,0x5f9a6aaf),LL(0xe6d56464,0x357d2d21),L_(0x58f34a26), LL(0x95a60b41,0x49f4f0e2),LL(0xcfbab99d,0xdca3ea61),LL(0x4c739342,0xa16d4457),L_(0xcea92902),
+ LL(0xdcc5b89b,0x463327ef),LL(0xb7378179,0xadb9328a),LL(0xbfce0e4d,0x0d62b545),L_(0x1e6b72f2), LL(0x349d4bd6,0xa76133fc),LL(0xdf69c044,0xb4284723),LL(0xf5a817aa,0xf7ca3909),L_(0xe22765b5),
+ LL(0x0655039f,0xbc44db37),LL(0xc2621a65,0x3d4e983d),LL(0x67d89bbe,0x85435ace),L_(0x803ede1a), LL(0xbe29cd2f,0xed39f9e8),LL(0x00ea11c0,0x55cac6ca),LL(0x3d4406d2,0xde2aeda4),L_(0xe7cb91b3),
+ LL(0x8fabc04b,0xc39c7ee8),LL(0x26cf4402,0xc619fe58),LL(0x0816fbf5,0xf268e46c),L_(0x9482a940), LL(0x3b1bba20,0xce226865),LL(0x080cefa6,0x4f9ab1d9),LL(0xfcbc42d6,0x13efb949),L_(0x1f067e43),
+ LL(0xf8119c35,0x75d60569),LL(0x73a4c13b,0xb3a82994),LL(0x063e48b4,0xc7bc1aec),L_(0xb0ab7ce1), LL(0xd626619f,0xa7f182b8),LL(0x4c843004,0x533f72eb),LL(0x1d2aa02e,0x69953a2d),L_(0x0de00959),
+ LL(0x91516c9c,0x0913a322),LL(0x1648e50c,0xa0961a2f),LL(0xa7d10cb1,0x06e4869d),L_(0x9b4a803d), LL(0xdc8793e7,0x9f17e3a2),LL(0x298436f6,0x06fc6243),LL(0xe925133a,0xb7622bbe),L_(0x70b9a2e8),
+ LL(0x84e7489b,0xc981ba62),LL(0x5e1a4306,0x792db847),LL(0xa77e3ed1,0xf4b6792a),L_(0x87bb9d13), LL(0xed208d23,0xfc7dc4a1),LL(0xcc352f71,0x87c2b023),LL(0x095b0ea7,0x88016bc4),L_(0xc90a59de),
+ LL(0x59119397,0x4b8755e3),LL(0xfbec0058,0x19aa2513),LL(0x554f2e58,0x1d544a58),L_(0xb7908e98), LL(0x1d4dba6f,0xcc8e5a35),LL(0x4e98597c,0x4036ed62),LL(0xf70ca123,0x0fd793e9),L_(0x5567a702),
+ LL(0x269da085,0x2503b0ce),LL(0x06549f68,0xb3025472),LL(0xeb061c62,0xfe9ae248),L_(0xd6d45a68), LL(0xd2906b25,0xeaa5d6f9),LL(0x58bbd291,0xaf62d50d),LL(0xc2b140a8,0x4dbbcce0),L_(0x86272e95),
+ LL(0xa7cf5775,0x3293ff9c),LL(0x7b80a205,0x1f10127d),LL(0x739c1785,0xc01f9711),L_(0xa80be8ca), LL(0x68df6a04,0x50fcfcf4),LL(0x3da76c49,0x340f3712),LL(0x53cced84,0xba988480),L_(0x89efc853),
+ LL(0xed47d3b8,0x6051e486),LL(0x27be6887,0x2e29a4c3),LL(0xfb40723c,0x77353f89),L_(0x3a8109a1), LL(0xf4eea8fe,0x672e091a),LL(0xaaf35dba,0xef34d20e),LL(0x96e8e707,0x2e5db0f7),L_(0x259349f1),
+ LL(0x089e80e9,0x259bf71c),LL(0x6e48997b,0xcd52c81c),LL(0x9b67f891,0x106aa44c),L_(0x2b828bad), LL(0x84cca320,0x492159ac),LL(0x860638da,0x99fc08c2),LL(0x9a577c2f,0xde194e1f),L_(0x4c02a837),
+ LL(0x1a869e95,0xac2dd0d1),LL(0x40fe4710,0x0d98495d),LL(0x926fca45,0x230d5720),L_(0xc0032a5e), LL(0xda97aa70,0xe0f36b43),LL(0xdbdd8384,0xbdee74a8),LL(0x9f4f1e97,0x616d2e77),L_(0x285c8908),
+ LL(0x4ce190f7,0xe408ab06),LL(0x4de68c46,0xaec26bc8),LL(0xea864657,0xa9c6ad27),L_(0x3b9d1eb1), LL(0xab862944,0x327c78b5),LL(0x2af9ede8,0x751ec6f1),LL(0x18bed81e,0x1c240eff),L_(0x17dc571f),
+ LL(0x291c3273,0x766b4a0b),LL(0x3a97f292,0x6e56a096),LL(0xafb97a2d,0xe3cbbbe3),L_(0x3a6fadc9), LL(0x2369de35,0x4c78c1e4),LL(0x6d3e5c1b,0x698e8f8f),LL(0x14e1a4eb,0xa87a74e8),L_(0xbb410055),
+ LL(0x0fb37060,0xcbf75eae),LL(0x323f451f,0x58dee01f),LL(0x1a149a9e,0x67ff1a09),L_(0xb35d39d2), LL(0xf63b9865,0x7e111af7),LL(0x02e5fd5f,0xf6f23814),LL(0xc6967a32,0x682916a3),L_(0x5d411958),
+ LL(0x53aa5942,0x7dc26ca6),LL(0xec5ae21b,0x3a7f3858),LL(0x4c6d1720,0x87d2b98e),L_(0x6b3c9448), LL(0x379e4e5d,0xc6bec0ca),LL(0x7de28c5b,0x69db9b01),LL(0x4e3aaa80,0x4f1a3e1f),L_(0x31e76223),
+ LL(0x948cf979,0xe1a7d9ed),LL(0x32518804,0xabd060c2),LL(0xe2c8026f,0xd02845ba),L_(0x60dcd816), LL(0xd2fcd20d,0x9fc8ca8b),LL(0x67ac75bd,0x0b403597),LL(0xfa897231,0xd2ef4cab),L_(0xba971f13),
+ LL(0xc9608224,0xd3a9e728),LL(0x21de382a,0x9fcf28b0),LL(0x23db313b,0xe226f1f0),L_(0x9e002526), LL(0xdd26c698,0xa3a7479f),LL(0x8170903e,0x4871cbd5),LL(0xc0ad648f,0x30414c9b),L_(0x3c9d51d0),
+ LL(0xe22f8df5,0xdef38d08),LL(0xd456476e,0xfacc23b0),LL(0x7b3f5e97,0x00fb9a2e),L_(0x6c5a7311), LL(0xa6cbdc37,0x87cb811c),LL(0x82204464,0x6214d9f5),LL(0x06806fd9,0x5ba8f23b),L_(0x6d93ebe3),
+ LL(0x86e33c2d,0x23423298),LL(0xa44ec00f,0xf6e30434),LL(0xc242970e,0xbf53cf6b),L_(0x3a4d00db), LL(0x84f61eea,0x8140c42b),LL(0x5afabd85,0xe917c409),LL(0x70d1d6e0,0x95de99fd),L_(0xc2091589),
+ LL(0x396774db,0xc249bd59),LL(0x93024ffe,0x24f81111),LL(0xfe365e8c,0xdcd6e625),L_(0x35c6e777), LL(0xe01d308d,0x65e9e9bf),LL(0x4a7452da,0x5cab99f6),LL(0x441a1645,0xf759c45d),L_(0x97ffca58),
+ LL(0x1d7326e2,0x52fad307),LL(0x04705ea5,0x3aa389bc),LL(0x9cfd5023,0x3feb82b3),L_(0x7a752b31), LL(0x4a98e745,0x22a198b9),LL(0x303fc591,0x5fd22f5c),LL(0x95dcd425,0xe40ca457),L_(0xfc4759f2),
+ LL(0x0baec1d1,0x899726d2),LL(0x9ccc4295,0x9503a4a3),LL(0x8faff5a9,0x735bcc96),L_(0x4938831d), LL(0x294b5dc9,0x27659e3e),LL(0xcf8e86f6,0xb11539c4),LL(0xf82de3fd,0xdafe9d6c),L_(0x93a3f5c4),
+ LL(0xb712f886,0x4ba7d548),LL(0xf1d50673,0x627d0815),LL(0xebc722ce,0x4e21b679),L_(0xd4fcebfe), LL(0x3d488792,0x654d615e),LL(0xa956f701,0x38e30e59),LL(0xbe0c2b4a,0xd07392c8),L_(0xd0eefb50),
+ LL(0x91582e11,0x245a5f24),LL(0x83071bb8,0x1d74fe95),LL(0x32fc2d8c,0x8d68efa6),L_(0x3c6bb1ba), LL(0xb73ed81b,0xd7c363e3),LL(0x4814d6e2,0x4b18aee3),LL(0x8563cd35,0xf296ee0a),L_(0x39c2c1ab),
+ LL(0x6115b5df,0x12e07056),LL(0x27e6f810,0xab33f925),LL(0xdadb7f44,0x9611fc0f),L_(0x21632fa8), LL(0x135db674,0x0014d0b2),LL(0x90282284,0x34df44bd),LL(0x498b5aab,0x3b9bf0a3),L_(0x83adadb8),
+ LL(0x8b47b85a,0x7583945e),LL(0x8ca7a054,0xe1eb9f0d),LL(0xdc6bf5ac,0x7f50540d),L_(0x4929ffcf), LL(0x7dcd0fa3,0xd6e884e8),LL(0x547fd35b,0x0fda3c41),LL(0x42d34849,0x156b5074),L_(0x2b73e553),
+ LL(0x9db1951e,0x6f1aaef3),LL(0xbba949f2,0xe07d36c2),LL(0xaf67c45f,0x598114fb),L_(0x0be51018), LL(0x18833890,0xb079f72e),LL(0x43a0dd65,0xee4b11df),LL(0x20bd4ca5,0x9dd3598b),L_(0xb6e5a89d),
+ LL(0x2f515e07,0x0a130c64),LL(0x53781704,0x21d929ed),LL(0xed92766f,0x2370b592),L_(0xb01a78da), LL(0x461ee105,0x11fd327c),LL(0xe5630841,0xaac6ed8a),LL(0xaad362f8,0xe2c21338),L_(0xd9bef88b),
+ LL(0x7702c305,0x90cc96b4),LL(0x284ea1e9,0xec9108c9),LL(0xea844162,0x79d4d2e8),L_(0x5fc96bdc), LL(0x9b799340,0x9b1c7dfd),LL(0x6ae02844,0xf8a798d5),LL(0x4a0a1e22,0x7439503e),L_(0x0838edf3),
+ LL(0x25112357,0x41a91a95),LL(0x9794aee7,0x12be9cf2),LL(0xa09c00f4,0x87b213f6),L_(0x588e9419), LL(0x3cc23f7d,0xa44cb6f8),LL(0x9ee73263,0xda068194),LL(0x999bf774,0xe19968dc),L_(0x4f9d93f1),
+ LL(0xa3bbb5a7,0xe07280d1),LL(0xfdb5f5ba,0xf0df9657),LL(0xbd50dd87,0x4715fc8b),L_(0xdf379027), LL(0xf3d02095,0x64a96f25),LL(0xeb119764,0x661822c2),LL(0x8b298e54,0xd8ec764d),L_(0x6f6ea251),
+ LL(0xcef9767b,0x3dfab91a),LL(0x7c6e866c,0x85522367),LL(0xdbf3bb79,0x79b36fcb),L_(0xbeb97ad5), LL(0x05fa18c2,0xdbafd1f2),LL(0x64259c17,0xdd549dff),LL(0x83c7657f,0xd82dc78f),L_(0x8cf18ed9),
+ LL(0xad65298a,0x58b32f27),LL(0x2131395b,0x976af3d3),LL(0x4b505f2e,0x64c1cfc3),L_(0xca10d83b), LL(0x59913cfe,0xbab37657),LL(0x1414d1f4,0xf066519c),LL(0x8887e569,0x3d975cff),L_(0x0c251f08),
+ LL(0x425ddccc,0xd5368e78),LL(0x93068700,0x12b23c3e),LL(0x33076aa1,0x4e626b1c),L_(0x4e14ead6), LL(0x23f1e78d,0xe86079cd),LL(0xd274538d,0x908738cd),LL(0x244ce9b9,0xe51d741d),L_(0xb4e734ed),
+ LL(0xb2d63b64,0xf0e2cdd8),LL(0x0675f17a,0x90f8143d),LL(0x75829dd6,0x2d23a43f),L_(0x298a7f8f), LL(0x47ca8668,0xa526104e),LL(0x4e9c496b,0x85467645),LL(0xb0f0e275,0xafc61eeb),L_(0xa1acd83f),
+ LL(0x7ee79f81,0xf367484b),LL(0xafa3db78,0xbfc8c257),LL(0x7fe068cc,0x7c8262c2),L_(0x784b4654), LL(0xc96069f1,0xd5c6e6e1),LL(0xb65beee4,0xd8f70ecb),LL(0x24073300,0xc55f13ed),L_(0xa8d09ea4),
+ LL(0x82d22a52,0xe38ffddd),LL(0x7bb613d6,0x03df60ca),LL(0xa964fa9d,0x9bfb3890),L_(0xcc4b84d8), LL(0x96707a64,0xf9f9338a),LL(0x110b10fd,0x5d9e9ac0),LL(0x0acd29e1,0x854609dd),L_(0x11a3136a),
+ LL(0x84bcad3b,0x9a527f75),LL(0x28be328f,0xc16f294f),LL(0xdaf38a99,0xfdebcc4a),L_(0x4d614ff9), LL(0x8a1d04d1,0x760244a9),LL(0x9fb5fa88,0x97af96d1),LL(0x79ecc48b,0xebf508a7),L_(0x63ac8146),
+ LL(0xa9338a44,0x4ccbe898),LL(0xe952b759,0xf79ce658),LL(0xa7f6528b,0x0efdd8f6),L_(0x59bff1cf), LL(0x7002f54b,0x859eefc9),LL(0xb915b857,0x3146204d),LL(0x25b282fd,0x9e570ac1),L_(0xf3c10eb4),
+ LL(0x50227a06,0x96cc2182),LL(0xd7972029,0xed491383),LL(0xa5e9dc33,0xef480409),L_(0x8303786c), LL(0x48fc5413,0x7b84b8b7),LL(0xa8f1bf3e,0x22c04cfa),LL(0xa2e99567,0x5b8dc942),L_(0x089858bd),
+ LL(0xb80a1877,0x7a0670f5),LL(0xf5def779,0x99c0dcfe),LL(0xceba003e,0x737b1478),L_(0xba188761), LL(0x88ff60f8,0xa8a91790),LL(0xf962acd7,0xd0c75bfc),LL(0x8ebfd0f8,0xaf779b34),L_(0xe9624be3),
+ LL(0x62fec3e2,0xd969780a),LL(0x9daaebb5,0xafc171d8),LL(0x647f2bf8,0x16ea68f8),L_(0xfbfe21fa), LL(0x83f12d03,0xb63e2588),LL(0xe8295dd0,0xb69cbad8),LL(0x08b7948f,0x1a740ee4),L_(0xbe240b54),
+ LL(0xd3ad093e,0x97774b8e),LL(0xa107d5a6,0x1438ff5a),LL(0x90acd42f,0x0c55b2c6),L_(0xb1008301), LL(0xf3524dc1,0x1f19f151),LL(0x28b7f8e9,0xc5b4f62c),LL(0xe1899b7c,0x7240d638),L_(0x249ecebf),
+ LL(0xf9ad69ab,0x9a96c604),LL(0x1e0ee825,0xd851c4f0),LL(0x816d9822,0xf895d68e),L_(0x14e58e83), LL(0x914c2f30,0xdd941975),LL(0xd4525a24,0x1765af51),LL(0x9bdc107c,0x770ebc8f),L_(0x908f73aa),
+ LL(0xe5bd052d,0x70e13a7c),LL(0xe46ccc09,0x0c4379c5),LL(0x0121f8bc,0x71124e71),L_(0x38ba16ad), LL(0xe43a3a55,0xd9134113),LL(0x23d0c031,0xbbbe7daf),LL(0x3a1c2b24,0x3950f72a),L_(0x78296ab5),
+ LL(0xa71550b1,0xdab1491f),LL(0xdd5b8553,0x12caa6e8),LL(0xb08da5e0,0xf505a6eb),L_(0x95e70a66), LL(0x79842177,0xcf510150),LL(0x68ab8f60,0xafdce053),LL(0x87a8f6f2,0x8158b7f4),L_(0xc0b75050),
+ LL(0xe2eb279e,0x6af97a49),LL(0x86441bbb,0xd6c5159d),LL(0xcf78aa46,0x572c05de),L_(0xbc71b5c6), LL(0x0bf9ef5a,0x5b7148bf),LL(0x97df4c43,0xbe4b9631),LL(0x101cdc13,0x7ed1a6b8),L_(0xafbd7e88),
+ LL(0xb580b670,0xc6feaf5c),LL(0x3ea251a2,0xa5cb0934),LL(0x02cfec16,0xc2e35b6b),L_(0x0fdebc9c), LL(0x6e09365e,0x5b4d0976),LL(0x54866bd4,0x405714ef),LL(0x892fc650,0x75be4796),L_(0x224babf9),
+ LL(0xe024a3b6,0xffdc8787),LL(0xd74e707e,0xbb8a1baa),LL(0x16ab4631,0xf8688223),L_(0x0cf2f805), LL(0x09c1692c,0x0dd7a6f9),LL(0x42b206a1,0x3a94d17c),LL(0x784e210d,0x58b82c4e),L_(0xd0f07cde),
+ LL(0x4df5c033,0xa0b09f2e),LL(0x0f337455,0x8ad59d7f),LL(0x92ef323e,0x9dfd994c),L_(0x8a562d14), LL(0x9c294c52,0x0784cc2a),LL(0x06b511cb,0xa7c397c2),LL(0x9d3b5c1e,0x5217298a),L_(0x9becab02),
+ LL(0x5fffdecc,0x15425166),LL(0xf204b46f,0x3ad2c54a),LL(0x29b56266,0xcbfffc28),L_(0xe2bc5353), LL(0xb4051ff4,0xe925b548),LL(0x91eefed0,0xd94421d2),LL(0x61d3c552,0x0c2f7520),L_(0xd3c090b5),
+ LL(0x70ed4769,0xfa81c450),LL(0x0d59a33e,0xbb762aa7),LL(0x72d6d774,0x7b08eae2),L_(0x92885c49), LL(0x1432d1e2,0xc28ea0a8),LL(0x4e6a192a,0x57bf54b2),LL(0x163d3f1c,0x996fa17f),L_(0x8242af09),
+ LL(0xb5fbaaff,0x53d923d7),LL(0x4aa1aad8,0x8aeef401),LL(0xc59594fb,0xd7267ef5),L_(0xba7c28dc), LL(0xede0bedf,0xb019e637),LL(0xbffc5a3c,0x1be98aa8),LL(0xb69b47a8,0xd848486b),L_(0xa1758b69),
+ LL(0x95f000bf,0xc417bef7),LL(0x3f4d4f15,0xef4c07bd),LL(0x74d082e1,0xc8cd53f2),L_(0x2210c27d), LL(0xfb026021,0xaab1ecd2),LL(0xf4960e70,0x47b08bcf),LL(0xf6ef41f3,0x386f4e41),L_(0x3d017b94),
+ LL(0x806b3be3,0xd292e87d),LL(0xbe3b4c15,0xb316049f),LL(0x08cba3d2,0x5a2daba1),L_(0xf68b1a9e), LL(0xff881fa0,0x4da3f147),LL(0x91960fa2,0x8b3ea4f6),LL(0x7f14ef98,0x931e6a5d),L_(0x291615c1),
+ LL(0xe8b9b590,0x3a4e460d),LL(0xc7e1d53c,0x410540d3),LL(0xba715bf7,0x9faf6e57),L_(0xf612eab8), LL(0x13d8563c,0x83a48da3),LL(0x97d11aa7,0xbc420fcd),LL(0x54fecfb6,0x8ea8b02c),L_(0xa72e89c3),
+ LL(0x9f084f51,0x15421912),LL(0x19ce8a03,0x69e1810f),LL(0xa93a4b35,0x66d7f71e),L_(0x33703d01), LL(0x9b5d9b15,0x85c36f3f),LL(0xfb68061e,0xf837f0c3),LL(0x1acc3982,0x4526c2f7),L_(0x8aadc35e),
+ LL(0x91bdbe3e,0x5c462b80),LL(0x46606493,0x16f4a53a),LL(0x2452c556,0xf2ad5a49),L_(0x9ecfe87c), LL(0x961c76d7,0x92031bde),LL(0xd10c3c2b,0x43fc1b45),LL(0xba2806c7,0x7ea59306),L_(0x6d69a1f2),
+ LL(0xaf7fedc2,0x44f370ac),LL(0x575c1c1e,0x7fa03a08),LL(0x366491a9,0x65caef0d),L_(0x1d17b3b8), LL(0x3a469596,0x6dc5f00f),LL(0xf2e830cb,0x87cfba82),LL(0xebb7f488,0x1fc8150f),L_(0x74afed78),
+ LL(0x70a3e6c6,0xf79b97ae),LL(0xcd939876,0x0c92525a),LL(0xfd612292,0x1f877d7a),L_(0xf5237757), LL(0x2b249ae1,0x78a6422a),LL(0x2855f66b,0x0659a5e3),LL(0x12934c87,0x7a1fca11),L_(0xdfe80915),
+ LL(0xe4d85de7,0x0b0acedc),LL(0x21b8a084,0x6091bc19),LL(0x04526cb6,0xac1ce3ea),L_(0xd10a9ec7), LL(0xb54024a7,0x57196c24),LL(0xb55d4b5d,0x42e04321),LL(0x1b1d5d2a,0xbb31992a),L_(0xdb403b45),
+},
+/* digit=15 base_pwr=2^105 */
+{
+ LL(0x5f4861c4,0x9a1b156b),LL(0xa1ffe24b,0x45b930e9),LL(0xbeb5a955,0x29358e8a),L_(0x4b8943f1), LL(0x7923968c,0x127f5983),LL(0xe58cb43e,0xf5aef19b),LL(0x22713358,0x0329be36),L_(0x552fb6a1),
+ LL(0x842632cf,0xd5e766ad),LL(0x947d9fff,0xbab1e908),LL(0xdb59f894,0xa103e5b9),L_(0x68372195), LL(0xc4c67973,0x2cd3e628),LL(0x146f4450,0xe2690b88),LL(0x787c5ec2,0x153e0f49),L_(0x1f9bb175),
+ LL(0x01d9f5c7,0x9acab18d),LL(0xbfb21488,0x96fbb4bb),LL(0x43543f3e,0x19e99acc),L_(0x81d541e2), LL(0x4d4f6943,0x2373babd),LL(0x96c02c64,0x0c662932),LL(0xdd524336,0x60570f05),L_(0x6ee3ed44),
+ LL(0x98a32e88,0x9cbcb156),LL(0xda250980,0x00a72b87),LL(0x85f705a8,0xb60a7751),L_(0xa9f85b0d), LL(0x3ef7d9b7,0xc5078f17),LL(0x1fa64414,0x20110dec),LL(0xb521d60e,0x324aa16f),L_(0xcf1c2382),
+ LL(0x7053cd15,0xc75d38b5),LL(0x9347ce64,0xff26fb52),LL(0xfa6fa1ea,0x89904b74),L_(0xab858e49), LL(0xb9800606,0x0d1c07cb),LL(0x0b99d5c5,0x7605e424),LL(0xe982130b,0xc4ed9c66),L_(0x45e55121),
+ LL(0xb3f704f5,0x2c1c043d),LL(0xf3189b49,0x3e68dbd7),LL(0xbe354e8d,0xa6382386),L_(0xf9ee8ba0), LL(0x26378a41,0x04646666),LL(0x709ded81,0x88fbb7ce),LL(0xc603785d,0xb1f815a2),L_(0x5bec9b88),
+ LL(0x43fe75c9,0x9a29229c),LL(0x052996cb,0x9b1a9170),LL(0x7d4b9fc3,0x133dd4ca),L_(0x1176baf5), LL(0x53ac8647,0x6dcfad8d),LL(0xcfedffdb,0xe4115707),LL(0x6ff11203,0xbc9689c3),L_(0x8c720cdb),
+ LL(0xd81789dd,0x7b457d74),LL(0x127b60ac,0x5a87275f),LL(0x096f997d,0x5d4f53a6),L_(0x554f3104), LL(0xc86a176b,0x0c5247ba),LL(0xf8205ea1,0xb389c0f4),LL(0x325d67b1,0xdc511ddb),L_(0xc2e38d56),
+ LL(0xa0dc02ad,0xca8b2e56),LL(0xac05bb21,0x59515fbd),LL(0x152ad207,0xa0ec8c40),L_(0x1f1977c8), LL(0x990ce0e9,0x094829b8),LL(0x110ed8d5,0xdb93ce78),LL(0x53af9d31,0x980f663f),L_(0x50f753ac),
+ LL(0x0afcea41,0x1410da31),LL(0x91d6a357,0xc4dd3dce),LL(0xefc18ea4,0xc844e9d6),L_(0x599c3b4e), LL(0xb2b1ab81,0x89238185),LL(0x716b0afc,0xc007c089),LL(0xcc238164,0x10df0d3c),L_(0x7d888920),
+ LL(0xd9103e74,0xec1702f8),LL(0x0184b65e,0x67e64440),LL(0x4b15a941,0xaf4f5d2e),L_(0x334e5ea3), LL(0x82fa4171,0xbc874d39),LL(0x3cf9db40,0x63f968d3),LL(0x7b71afa1,0xc6c567c6),L_(0x74793b87),
+ LL(0x1b353d4c,0xfbfeb69e),LL(0x001b5f0d,0xaecee209),LL(0xdaae33fb,0xc8d8f5e9),L_(0x76be05c8), LL(0x4e52dc92,0x87741a88),LL(0xd9f61920,0xa5009003),LL(0x72c650f3,0xc505e3b9),L_(0xb83f81c5),
+ LL(0x2c204e5b,0x9f6af3aa),LL(0xd6b594bc,0x0423f2f8),LL(0xa67cf879,0xe29129c8),L_(0x99f505a1), LL(0x47ebe4a1,0xc220fd1a),LL(0xe7a97ad3,0xa34e4a65),LL(0x1fd2a0dc,0x7c1fb322),L_(0xa75c8fc2),
+ LL(0xcad10b12,0xca3e4b04),LL(0xdda6763a,0x00ce7df6),LL(0x9c84d269,0xa1f31fb1),L_(0xe404dde9), LL(0x45e72361,0xf80ab752),LL(0x300ca2ea,0x38935f38),LL(0x36966819,0xebd1b2a6),L_(0x758de4e7),
+ LL(0x28dbeb1e,0x4f41e2ad),LL(0x153889e3,0x1c0782c2),LL(0x60b0cb1e,0xb609d7c2),L_(0x9a85e0f0), LL(0x403c7b8f,0x3d308948),LL(0xe5878d4e,0xd8503865),LL(0x0326fd01,0xd472fecf),L_(0x51c81464),
+ LL(0x98673101,0x35c900a8),LL(0x2437a09e,0xdb5df675),LL(0x63415d28,0x6b676a73),L_(0x5a4ddb3f), LL(0x3e21afd1,0xa33929eb),LL(0x332e8fd4,0x717e43a3),LL(0x6bf414b5,0x9c7a3c47),L_(0xfb327e1b),
+ LL(0xf9ea4385,0x6b738d34),LL(0x3b9138c4,0xac317163),LL(0xd197efee,0x2438948a),L_(0x2b8a07e9), LL(0xebcc3f74,0x1fc5f207),LL(0xdfbd84a8,0x9fdbdbb5),LL(0xddc39008,0x663a5b4e),L_(0x9956763f),
+ LL(0xa670dec5,0xaeb71ef5),LL(0x989b6598,0xa4973f38),LL(0xf981cb1a,0xe1b496e0),L_(0x187e0a5e), LL(0x8185f4e5,0xdcd9014d),LL(0xce47e120,0x01c7c910),LL(0x33bfde50,0x0a1d6d42),L_(0x3059677d),
+ LL(0x0c74186d,0xf93c6e65),LL(0x2d2eb0b3,0x5c4b9d3f),LL(0x9b7f55b4,0x62194b5f),L_(0xf492843a), LL(0x07af0f2d,0xead94ac6),LL(0x344ba8f7,0xfc351f8f),LL(0x6a02d6dc,0x96c34c95),L_(0x0f698b8c),
+ LL(0x06eb2a9f,0xb29f094a),LL(0xe4c8cfbd,0x8cc86e57),LL(0x40844e37,0x2f8aef05),L_(0x7588271e), LL(0x864a5330,0x8ade6f97),LL(0xf9d12d2c,0x78f8e22f),LL(0xadc126ed,0x8c70fd00),L_(0xc12911d9),
+ LL(0xecdb5c0f,0x3c35a3f6),LL(0x0e784293,0xe0f4235e),LL(0x49ad3737,0x162c0cf0),L_(0x9e096565), LL(0x6d262e33,0x3611d970),LL(0x2ea4dc97,0x56f9b02c),LL(0x569e559b,0xd700ade3),L_(0x6445516e),
+ LL(0xab2f2394,0xf45846e5),LL(0x405bf6e0,0xaa46d2c3),LL(0x1222d842,0xf5f64176),L_(0xedb70efc), LL(0x1b067c96,0xb8990097),LL(0xb7f1c7b7,0xd2f67212),LL(0xe2b50ce3,0x7ac5ce8c),L_(0x05c93598),
+ LL(0x754843ce,0x77e241fc),LL(0x1ab02032,0xa0d9cbeb),LL(0x55cb5b7b,0x98136c68),L_(0xd09ef0e2), LL(0xef262224,0x523e661c),LL(0x87906701,0x3066156f),LL(0x3e7c7958,0x5ea1ccfb),L_(0xb06fbe44),
+ LL(0x736e6685,0xa762a548),LL(0x9218789a,0x4ea95a8e),LL(0xa90f1dd7,0xf1a7ecac),L_(0xbc8d97ba), LL(0xdb175bac,0x176f58b3),LL(0x16633eeb,0x66d2f2dc),LL(0xf30e4d83,0x047e3e70),L_(0xfad00adb),
+ LL(0x2523bfbf,0xdb1ab97e),LL(0x632d110c,0xa7f43904),LL(0xed30067f,0xe0063138),L_(0xcfac77b5), LL(0x0fe3afe1,0xef7cd5f9),LL(0x5720d9f1,0xbceebc62),LL(0x7475ff1c,0x37aef5f2),L_(0xcea553ab),
+ LL(0x21d9dd89,0xfe303f84),LL(0xe84277eb,0x403a10c6),LL(0xdc250e4e,0xcf99ada4),L_(0x260cc2ff), LL(0x16293017,0xdf77e00f),LL(0x429f4cad,0x017aea98),LL(0xb51701db,0xb9a51f04),L_(0xdf5024fa),
+ LL(0xaefa0a3f,0x3c6160d1),LL(0x89d2a9d2,0xb6871dd0),LL(0xcb336211,0x30015933),L_(0x4ddcddf5), LL(0x87d9707b,0x18fd4882),LL(0x96d9668a,0xf138a306),LL(0xeeb3123d,0xce3f684e),L_(0x9fa39b7f),
+ LL(0xdb674dfe,0xd843e892),LL(0xe36b5375,0xedfd1c18),LL(0xc7988b87,0x3bdd2895),L_(0xe52a31a1), LL(0x09bd2af3,0x294ff4e2),LL(0xccd1887d,0x2ad4535e),LL(0x2fc2c26d,0x1ebd13d4),L_(0x647f4987),
+ LL(0x0bdfba7c,0x94e42bd5),LL(0xae5c8c95,0x512c1be6),LL(0x10be5ddc,0x6bc6d702),L_(0xfd7b27ee), LL(0xd21e8821,0x636561c6),LL(0x170a05c4,0xe4ef4a34),LL(0xda161673,0x3d69a37a),L_(0xf40d8e35),
+ LL(0xc206f7b1,0xa0f11bca),LL(0x9195ecf0,0x23eeb3f7),LL(0xe6050ed7,0x98889901),L_(0x07aecdeb), LL(0xc76ba3ed,0x4edc3ee6),LL(0x6b353524,0xaab7f4a8),LL(0xc6e7d7b5,0xf6442856),L_(0xd31e141d),
+ LL(0x5b3638e7,0xd78b290a),LL(0xd885546c,0x77aef8c9),LL(0xfac422d4,0x0feb906d),L_(0x92b8b923), LL(0xdc0b9002,0x331327a2),LL(0x224f79a8,0x5d146cb4),LL(0x6fb5da21,0x3f887bb5),L_(0xc43cfdf7),
+ LL(0xb80d181d,0x2be6d108),LL(0x3c8b1f59,0xb342ddc9),LL(0x7004d85b,0xbe7db7ec),L_(0xec029270), LL(0xc1d565db,0xb82063a3),LL(0xbb014507,0xaa90beff),LL(0xbf4ed46e,0x3a15f177),L_(0xf45b367f),
+ LL(0x49eb74f9,0x146e10ea),LL(0x142ba6f4,0x1256c788),LL(0x346ea27d,0x3f761b6a),L_(0x80f4ab84), LL(0x4ec42ca8,0x150f9515),LL(0x566df38a,0xda268f4d),LL(0xe31f64a6,0xe4706b89),L_(0x95e5b78e),
+ LL(0x0b4a9c49,0xc8ae2f2d),LL(0xd939334e,0x58cc7b3f),LL(0x3e9cb1a4,0x31facd26),L_(0xcce403b2), LL(0x3b34d497,0xd018498f),LL(0xc5995b75,0xcbad3ed8),LL(0xa8867a65,0x0fb7952a),L_(0xef5960a9),
+ LL(0xe832b584,0xa4bc1e98),LL(0x3d7bc503,0x4ca3a484),LL(0x2da2b54a,0xbbcd02db),L_(0xf9f27d63), LL(0xd59bf324,0x02c44a56),LL(0x3ff8f28b,0x366f36f1),LL(0x0dbb411d,0xf30d32a2),L_(0x31dc1c76),
+ LL(0x52b2e707,0x19599554),LL(0x83cc5035,0xe133dbc1),LL(0x659be3d5,0x90ee1c4f),L_(0xfff40ea6), LL(0x70cd0820,0xba72fb3b),LL(0xab738bd2,0xff5688ad),LL(0x3ae40925,0xb751810a),L_(0x1c7232bb),
+ LL(0x071a0770,0x01bb4b01),LL(0xe2be9f54,0xd05cc7e3),LL(0xc3b59e15,0x14e1dc86),L_(0x84ea67cd), LL(0x1ee66ae0,0x743d3ae3),LL(0x9ac0bdc1,0x75487d37),LL(0xb272a24e,0x18ad2d25),L_(0x449e4286),
+ LL(0x69935fe7,0xefec1497),LL(0xee46b002,0xb3e61f3f),LL(0x1edeaf36,0x2b4abccf),L_(0x1302e388), LL(0x6554f5f3,0x0fe91c0b),LL(0x2afabbc7,0x613c238b),LL(0xf8ba68b0,0x0b0ae516),L_(0x1941e2a5),
+ LL(0xbf0bc612,0x9c608ede),LL(0x5d82d268,0xc0f244de),LL(0x0b0057eb,0xd601464b),L_(0x12bdb6e6), LL(0x825a361c,0x4ff78a4b),LL(0xb0ac16af,0x6aed48bf),LL(0x1ae6fb3a,0xba8a9318),L_(0x06a955b7),
+ LL(0x09e379b5,0x9e14e886),LL(0xc7c1e466,0x2fb4d3e2),LL(0x75711ae3,0x036fce90),L_(0x780c6067), LL(0x2542f70f,0xa4a903d2),LL(0x08ed6419,0x95852fe8),LL(0x637b247b,0x012141cc),L_(0x7a1653d5),
+ LL(0x9af74289,0x41ab3d86),LL(0xaaab79ee,0x29c26aaf),LL(0xcccef77c,0xea5535b0),L_(0xde9a50c2), LL(0xc11f99b2,0xb7f340c5),LL(0x0418cc51,0xfc229594),LL(0x8f5c0876,0xf20b5874),L_(0x79b716cf),
+ LL(0xba865a56,0x6fae5df7),LL(0x3ec9a3f7,0x2fe39b65),LL(0x8329316a,0xc07b24cb),L_(0xb74832f6), LL(0xd09a26ea,0x1af7d473),LL(0x95d78e89,0x375af56e),LL(0x62993ad0,0x957236cb),L_(0x20cfce9e),
+ LL(0x3e2c48a4,0x427f5e06),LL(0xe42acf84,0x25837ce1),LL(0xcae65a88,0x966e8b1e),L_(0x2aeaa288), LL(0x9e77f90b,0x306bd895),LL(0x4c375d76,0xd4ed09b8),LL(0xa2585522,0x47a8a9ab),L_(0x875a22b3),
+ LL(0x1e6ed175,0x8c957fe6),LL(0xcd21f453,0x54818bf4),LL(0x2495a8a9,0xdd977b92),L_(0x2e72900a), LL(0x05a5967e,0x2647b9d2),LL(0x92967328,0x53df8e0b),LL(0x496697af,0x5247a639),L_(0xa66c4dd0),
+ LL(0x8424e440,0x682c252e),LL(0x6fcf171a,0x0bb6bcff),LL(0x17581f41,0x040d50d1),L_(0x84837a70), LL(0xd070dc3b,0x686cbe64),LL(0x303cfa74,0x3485fd98),LL(0xdfd534bf,0xf0aec283),L_(0x6e4f877a),
+ LL(0x4458831e,0xbfa63a77),LL(0xa0bbdaf7,0xe6ad6640),LL(0xeffc865e,0xa2922966),L_(0x3c188024), LL(0xae34f5ff,0xec39a211),LL(0xc033bb37,0x5d5de65c),LL(0x1ffcbe06,0xae549602),L_(0x0aa2449f),
+ LL(0xf7d9eb1b,0x008bf1c7),LL(0x17af13bf,0xdce3e9ef),LL(0x7341adb2,0xe6aba225),L_(0x3fdc83ba), LL(0x52473c29,0x58df1458),LL(0x8e82cc6d,0xcbca23e4),LL(0x64a68f69,0xdc93a2bf),L_(0x402344e1),
+ LL(0x12f4285e,0x289cd434),LL(0x0df1904f,0x2614d391),LL(0x5132c5c4,0xd24f8d84),L_(0xd529b441), LL(0xb496fb70,0x945d4d6b),LL(0xb4fe1324,0x64d58e9f),LL(0x226ba20e,0x78fadda9),L_(0xf5638c8c),
+ LL(0x15c734f0,0x71f5ab8b),LL(0x7c5f3148,0xd644b74c),LL(0x8a5a08f7,0x5b9eaf3f),L_(0xcd76894b), LL(0x40783f5a,0xfc35396c),LL(0x5e5b4f20,0xdf4e44eb),LL(0x698ace20,0x85de5335),L_(0x32cc1f5f),
+ LL(0x4ca6d829,0xc01805fa),LL(0x69a66ff0,0x9b659d62),LL(0xb0bfec7f,0x21ba53df),L_(0x41d8db1a), LL(0x3ca3ffdc,0xaaee16f0),LL(0xac0d7259,0x2829c022),LL(0x8266c12f,0x570a8b63),L_(0x347c6b96),
+ LL(0x27c7435f,0xc2862c3c),LL(0xd60a5c54,0x577136cb),LL(0xeb454a5e,0x41bf3bc1),L_(0x809d3205), LL(0xd5ff2a5d,0xce2b3472),LL(0x201d2be5,0xabfed878),LL(0xdae3ae7c,0x076254af),L_(0x898c8347),
+ LL(0xfbee92e1,0x288eeccf),LL(0x6cb1db6b,0x9cfb5c57),LL(0x059c298f,0x53598af7),L_(0x7eda1da0), LL(0x888186af,0x3084705f),LL(0x2f592293,0x86f1d164),LL(0xc59e084e,0xa44fd074),L_(0x3a1664aa),
+ LL(0xd2343b35,0xa40a6bf8),LL(0xad9e07a1,0x798ceee2),LL(0x27b865e6,0xe4570eb1),L_(0x148877c2), LL(0x8f87d685,0xf0ce5967),LL(0x66f1b39c,0x66b1f5c4),LL(0xcbcc053f,0x2f8869b5),L_(0x9fa693dd),
+ LL(0x0d7b69df,0x17f0c4dc),LL(0x135a9bac,0xa20e8614),LL(0xabbfb492,0xc7dc6a2c),L_(0x89df23fa), LL(0x2759d406,0xcc56f093),LL(0x7c85ce0d,0x049b5aa5),LL(0x4e1f566b,0xbec87c76),L_(0x19e59ca6),
+ LL(0x40e840f6,0x1f1c6ca8),LL(0x67aa4467,0x2d21e27a),LL(0x9ca6123e,0x1d5e2c46),L_(0xa8534061), LL(0x5531352f,0x009d49a6),LL(0x161c45f4,0x43dffb38),LL(0xd020075d,0x2f8a3d38),L_(0x25c709ee),
+ LL(0x5ded0d35,0xd70c960d),LL(0x0bc185ca,0x08b78436),LL(0xbcbebb9e,0x662ab949),L_(0x7643c75a), LL(0x1d7a378d,0xcd6abb3b),LL(0x156ac08f,0x991364b4),LL(0x4dbff4b2,0x6e088465),L_(0x1596ba10),
+ LL(0xf7fff47a,0x8b812163),LL(0xabc30e47,0xad939c3e),LL(0xd700d28b,0xe8837ac3),L_(0x35b89ca7), LL(0x26712ef3,0xd89edbf6),LL(0x9b73a154,0xeaa73bdc),LL(0x536ef396,0x19770554),L_(0x44c569b4),
+ LL(0x7f3d2320,0xe904178b),LL(0x58a07ae9,0x7ff297bf),LL(0xad6fdd69,0x6deef5b5),L_(0x4df1d514), LL(0xda650bfe,0xc9fb4677),LL(0xdc9c7db6,0xd99a935e),LL(0x93d1a532,0xbfdd1320),L_(0x939080be),
+ LL(0x0e07db7e,0xfed77923),LL(0x579fd4db,0x0f05670b),LL(0x112a7ade,0x6e79da66),L_(0xb61b7ee5), LL(0x201e8aa3,0x567d0dd8),LL(0x07f189a5,0x9a0b34dd),LL(0x6a730912,0x5c656713),L_(0xcbc9583d),
+ LL(0x9522c2ad,0x1cf99a2e),LL(0xfaa41b68,0xbfb9ae12),LL(0x1fe851c4,0x91215bb4),L_(0x7117d94a), LL(0xbf89747d,0x6286cdba),LL(0x9cbfd3ce,0x792aeb4e),LL(0x25b00fa8,0x61f48d5b),L_(0x7160f470),
+ LL(0xa1ce4a2c,0xbe45da68),LL(0x3b1ab97d,0x63ee425c),LL(0x98b17978,0xd26e1784),L_(0xa89d00db), LL(0x5fcc8cf1,0xecb80c24),LL(0xdcee4667,0x3e21c95c),LL(0x1df7f32b,0xb9cc6c4a),L_(0x77cd2dd5),
+ LL(0x61766f4d,0xa5778295),LL(0xf4e5e3be,0x34307913),LL(0x57f4defb,0x71c105c8),L_(0x3add4e70), LL(0x2096768f,0xce51bf21),LL(0x8db7461d,0x3117821e),LL(0xf475048e,0x2b073db2),L_(0x1fd13104),
+ LL(0x70678950,0x4426eaf6),LL(0x4191c57d,0xd1c53be2),LL(0x68f854e3,0xce0157db),L_(0x5837f49f), LL(0x5112a49e,0xa0471f83),LL(0xf2d94f60,0x87e0a2d0),LL(0x9f64998d,0x344b223b),L_(0xa4dc016f),
+ LL(0x3ad984a8,0x3bd4bc94),LL(0xd8e29806,0xc17ca92f),LL(0x4aee7a72,0xfcd30768),L_(0x488c7f42), LL(0xa1f41f77,0x6fdb5587),LL(0x6983a223,0x3c2763ba),LL(0x0145b604,0x6e18b2a2),L_(0xfd8b9df0),
+},
+/* digit=16 base_pwr=2^112 */
+{
+ LL(0xa72d343c,0x006aff79),LL(0xd1d45ac5,0x1ec739c8),LL(0x136d5ba5,0xce9ce64b),L_(0x3571e770), LL(0xb11ea221,0x7bfe943d),LL(0x6d87fbd7,0x57dad905),LL(0xac86bd3f,0x5eeba8a6),L_(0x8def8e05),
+ LL(0xb0b49014,0x31f50c04),LL(0x17dee513,0xd8fab554),LL(0x1d543cec,0x2fb0a285),L_(0x53dbc27d), LL(0x3256cf6a,0xf3bd35dd),LL(0x5fbdcac3,0x8a264f23),LL(0x7dff3a00,0x24830923),L_(0xea9fd27d),
+ LL(0x3267fa62,0x7dfb1e52),LL(0x423506a7,0x34e86055),LL(0x552bcdda,0x131f5b56),L_(0xbbff309a), LL(0x40256e8d,0x61212776),LL(0xd0114404,0x3807bd7b),LL(0xbba74ace,0xa2ce6ab3),L_(0x9f9afd63),
+ LL(0xfd519550,0xd0706483),LL(0x53c2383f,0x89215ea5),LL(0x45e8a87b,0xf3cf4080),L_(0x6ab16c59), LL(0x85c8552e,0x09212e02),LL(0xa9576c54,0x10c2badf),LL(0x19c8db39,0x7b08661c),L_(0x32334cfd),
+ LL(0x9e15fa47,0x148c6f0e),LL(0x64a29d06,0xdb00031e),LL(0x4cc0f2bb,0xc3df9d3a),L_(0x2503f091), LL(0x1ff47bb8,0x620b581f),LL(0xb30724ed,0x5758802f),LL(0x4277ac9d,0xfc122be2),L_(0xcbf16ba0),
+ LL(0x1336d2bb,0xcd5bed69),LL(0x59c4c7e5,0xedd85962),LL(0xac1f77dc,0xea62aa43),L_(0xa9cecef3), LL(0xf970f802,0x25fc53f3),LL(0xb9f73243,0xf9d1654d),LL(0x9f9753cc,0xb61c3720),L_(0xbf308c03),
+ LL(0x96dca6f8,0x6461f973),LL(0x48986188,0x1f57a9df),LL(0xb90ca0df,0xb010f7d3),L_(0xe0bff3bf), LL(0x21188095,0xf21e0d4d),LL(0xa1a7cdb0,0x5f3468a5),LL(0xde0d0f24,0x4e99f334),L_(0x2e30f9fb),
+ LL(0x70d90130,0x7c2bf741),LL(0x95a93740,0x47c7e114),LL(0xb309c07a,0x977513df),L_(0xf1b8dcbf), LL(0xbe1ac3e9,0xb7e947d5),LL(0x92ee6dbc,0x09c3181d),LL(0x41e0c220,0x8b26dfc1),L_(0x897d02ce),
+ LL(0xfa332321,0xbb0f1fc0),LL(0x69d913b4,0x68034aec),LL(0x784ebda5,0x58fb05ab),L_(0xb3fd4405), LL(0x32cca1fd,0x83e2269c),LL(0x330bdb45,0xea0312b8),LL(0x33fa100f,0x1761c87e),L_(0xf9882c81),
+ LL(0xf4f00cb6,0x58c8e52b),LL(0x468b810a,0x99489e98),LL(0x5593b9ee,0x7924f02b),L_(0xbf5732d6), LL(0x0334e2ee,0x2a2bf206),LL(0x9c377382,0x41ac277c),LL(0xa7b08209,0x0c5c176d),L_(0xb9b519aa),
+ LL(0x1aabcb40,0x1450434d),LL(0xce36050b,0xcf82a49e),LL(0x0e6c721c,0xec192907),L_(0xc53a6a39), LL(0xfecc2ffe,0x451e72f3),LL(0x5b5bffe2,0x81bf062a),LL(0xe8852ddc,0xf84db443),L_(0x6d98976f),
+ LL(0x32a2e887,0x8b6ac261),LL(0xb92b83b0,0x3c40d7a5),LL(0x1ea4ca4c,0xf7653f1d),L_(0x4e2014e8), LL(0x2b234800,0x56338adb),LL(0x3350e80f,0x314b0e58),LL(0x8e442705,0x79527139),L_(0x96bf154a),
+ LL(0xd63c1701,0x1101a669),LL(0x5972ea79,0xd06390a9),LL(0x501cc189,0x0fb428cd),L_(0x41b24261), LL(0x0a3108ab,0x47aa9e0e),LL(0xff7237f2,0x9c9d8b16),LL(0xe86804cc,0x61ad5482),L_(0x723214f3),
+ LL(0x44329550,0xebe782ea),LL(0x4bfefe5b,0x11e7dc71),LL(0xf9379d6a,0xfb5f9f2d),L_(0x016789fa), LL(0x98c8071f,0x3aaef819),LL(0x0fa53740,0x3d2ba5a3),LL(0x0cd97039,0x2ceebe22),L_(0x144818d7),
+ LL(0x6646c444,0xc3bd60cf),LL(0x1bea68cc,0x7c4048fa),LL(0x5e74dbe8,0xd29b1f65),L_(0x08428502), LL(0x91eb1131,0xbb7b08f7),LL(0x64a0eea4,0x3c5f214f),LL(0x6e37d0fb,0x85ea7863),L_(0x3a3aec39),
+ LL(0x87af66ae,0x26b2f70c),LL(0xb4a6f150,0x5494f6a7),LL(0xf84408cd,0xa24b6575),L_(0xb95400d4), LL(0xfb2baa36,0x7fdee2e4),LL(0xfc9f2464,0x82709ae0),LL(0xd231d3ab,0x8897d9e8),L_(0x4c1905ed),
+ LL(0x43e3a796,0xc93592ff),LL(0x194deaea,0x9aebe35d),LL(0x3c64092f,0x1d7432bf),L_(0x64ab56a9), LL(0x608467bf,0x61dd14ba),LL(0x64e82c68,0x1c6431e0),LL(0xb4aaeed1,0x53076cd4),L_(0x2ded5d91),
+ LL(0x064ac09f,0x3e9b39b0),LL(0x087b2333,0xd8bc5839),LL(0xc348b809,0x8ab0974b),L_(0xdf5fc364), LL(0xf886797e,0x9cb572eb),LL(0xba2f94be,0x9a9ce85b),LL(0xa4a7eaf7,0x0e1605e0),L_(0x3070f698),
+ LL(0xbe868d80,0xeca36ddb),LL(0x52ac8d98,0x86bfcb64),LL(0x9b8656b8,0x2ab84426),L_(0x8306d84c), LL(0x01fe86cc,0x15f75f0e),LL(0xe9502973,0x4c2d70f4),LL(0xf239468a,0x365ce9d3),L_(0x7dd8e76a),
+ LL(0xd3426970,0xe0e930b3),LL(0x19af19f4,0xcb67c28f),LL(0x163565e8,0x312a9e2c),L_(0x0438b01e), LL(0x54d76d69,0x3b508871),LL(0x2b43ad8e,0x71ee55a1),LL(0x4dfa9969,0x0a025c8a),L_(0xe6813e1d),
+ LL(0xc327e03a,0xf0b0b5d0),LL(0x46569e00,0xb462d687),LL(0xa70b2c73,0x842f549f),L_(0x18faac6a), LL(0x864e3871,0x0b583d9c),LL(0xf49df9a7,0x1693a8f2),LL(0x5135df56,0xadecd5ac),L_(0xe9e25ac7),
+ LL(0xe8f3d99b,0x04c439d1),LL(0x811daa39,0x79057450),LL(0xed15dbf2,0x557c06cf),L_(0x3a8a2063), LL(0x09b41a1f,0x0bdc4dcf),LL(0x71cd60e9,0xf085eab4),LL(0xdab0c931,0xb48d6df1),L_(0x8189574b),
+ LL(0x4a27c44c,0x2e80ab05),LL(0x7a2bc54c,0xdd9e1375),LL(0x242b815a,0xa910e496),L_(0xd9fa2e90), LL(0x3f111c1d,0x0c5343f8),LL(0xb573bc74,0x10be67cd),LL(0xf1c6ef62,0x4ae541a2),L_(0x74676666),
+ LL(0xc5669a28,0xff0e3e5f),LL(0x6a94d97d,0xe911fae7),LL(0x85cd9be2,0x4150b30c),L_(0x41391baf), LL(0xab441ae7,0x92888eaf),LL(0xd928ee21,0x0dd62a7d),LL(0x1b7b37eb,0xe9e642a8),L_(0x61afa524),
+ LL(0x15d73eaf,0x70f4b3ee),LL(0x10edc9d7,0x70ff29ef),LL(0xe8787785,0xe5dce106),L_(0x3877e81c), LL(0x36b7ab1b,0x21a140c0),LL(0xf44e41b6,0xffda816e),LL(0x9bd299e0,0x5968ca97),L_(0x9fed2d11),
+ LL(0xb0d9d8cd,0x6b2cc953),LL(0x12446f29,0x932fd885),LL(0x8fc62139,0xb782380e),L_(0x93475be3), LL(0x83692f15,0xb2525747),LL(0xe5afa458,0x2213b2d5),LL(0xc34bb49f,0x0270ba84),L_(0xa86bdfc6),
+ LL(0x3b925a7f,0xe649f779),LL(0x72b7e377,0xa3785aef),LL(0x20ce9dd7,0xdc5dbf9f),L_(0xb05950ec), LL(0xa5d677f5,0xcdc8d1f8),LL(0xb5473ac8,0xd8d3e9cc),LL(0xb698eb06,0x5cbd0981),L_(0xc3f31c81),
+ LL(0x1e752016,0xf090a1eb),LL(0x644b9e14,0xfc5f6857),LL(0x111a1741,0xbaf89d9f),L_(0x01aef06c), LL(0x1b1a1911,0xbfa9551b),LL(0x7145d55b,0x24a70db9),LL(0xc5ef4f06,0x17130b26),L_(0xb33cca3b),
+ LL(0xfcb5b043,0x911935f4),LL(0x4a8bc08e,0x53ed6fbf),LL(0x90634826,0x4421e383),L_(0xe0140eb6), LL(0xc4143e7b,0x12ccf145),LL(0x94d99fc8,0x5bf8b6c9),LL(0x4f765081,0x73883a6d),L_(0x6767c401),
+ LL(0x997c821b,0xe367cf8a),LL(0x246522bf,0x3d0455b7),LL(0xe8c7bcd6,0x92643ab4),L_(0x10fbb420), LL(0x547dbeb2,0xb5294491),LL(0x4b5c792e,0x07450e44),LL(0x472a47f1,0x5e3d3784),L_(0xd9dc604f),
+ LL(0x6372566b,0x4d62de9c),LL(0xbc29741f,0x7a323977),LL(0x78458eba,0x4b2a04ff),L_(0xdc2f1c5d), LL(0x6819a84d,0x0eccbf7e),LL(0x8ee3cc6d,0xb93eec58),LL(0x2a02a086,0x03b76658),L_(0x51df6b51),
+ LL(0x6aa0f608,0x0cbee27c),LL(0x00ecc369,0xae1d1601),LL(0xbbef8dbb,0xe7149786),L_(0x4036b3f1), LL(0xbe686d04,0x91ce3c48),LL(0x339d0769,0x3d6535b6),LL(0xa72c8f85,0x2c9fb75e),L_(0x0a96cd51),
+ LL(0x39dd7c75,0xeebc8c18),LL(0x799170f2,0xa2f0fb39),LL(0xba0f68a4,0x1c5cad2c),L_(0xb5b8faf2), LL(0x3f59abfb,0x3a302769),LL(0xcda64ecb,0xed44c055),LL(0xcd7fd1b9,0x2e974b80),L_(0x7a2910b3),
+ LL(0xc8f85c88,0xf503e456),LL(0x9dc39b84,0xb53e74a2),LL(0x8eb76194,0xc4c55423),L_(0x96e13302), LL(0x153fefbb,0xdbbf4e12),LL(0x77137bad,0x80b3f693),LL(0x65187422,0x9f8c212c),L_(0xdd256603),
+ LL(0x0fcf5a39,0x6da81ce6),LL(0xb694d211,0xdff4777e),LL(0x4a9fa32b,0x602640c6),L_(0x5470aa01), LL(0xa3b241c7,0x2a545f4f),LL(0x33f7dd48,0x4cf94265),LL(0x8a894ff1,0xb5260296),L_(0xd9db2162),
+ LL(0x7320211d,0x391c4f62),LL(0xf472fe07,0x6d039385),LL(0xbaa68de6,0xc3a5b977),L_(0xde6b274a), LL(0xbca0bb5d,0x3643a502),LL(0xc554c3be,0xe1f5b66b),LL(0xa430cadc,0xb32e7ba4),L_(0x0c4ee9d5),
+ LL(0xd36efcf1,0xb6b2c682),LL(0x0eae66b5,0x1024c516),LL(0x8688f303,0x99e728ff),L_(0xb372d118), LL(0x777d2fdf,0xd972734f),LL(0xd9b90e14,0x25251453),LL(0xf34097fd,0x424404cf),L_(0xc047b89b),
+ LL(0x3079239e,0xb5ff46f3),LL(0x60a4632b,0x36a3735f),LL(0xc9986723,0xd572091f),L_(0x2023152d), LL(0x0dabffd6,0x0da45042),LL(0xb1524e2b,0xf6ffaf4f),LL(0xbffef0a3,0xbc330b9d),L_(0x99ba1268),
+ LL(0x3b961738,0x8d236f27),LL(0x3ea1c105,0xa5f014ae),LL(0xee0ae6b2,0xe50d6b9c),L_(0x82eb66db), LL(0x2b5f008f,0x36e3aea7),LL(0x4b4fc9df,0x2f8e4e4e),LL(0x5ccc02df,0x9f683f7c),L_(0x3e46d9c7),
+ LL(0x7caa8791,0x6c2cdda1),LL(0x3274eefe,0xa9cdf2c5),LL(0xb634f00e,0xd5eec010),L_(0xc5ba5f67), LL(0xa6a18c32,0xde736bf0),LL(0x554e6af6,0xc1059185),LL(0xb7a29e2b,0x9b23923d),L_(0xbfed0131),
+ LL(0x7000c5a3,0xb80400e7),LL(0xf87a8596,0x147ccc0f),LL(0x9e3b070e,0xfef094f1),L_(0x36f53f39), LL(0xefcc38e1,0xf5b77a62),LL(0xb1c0b71d,0x2c523e41),LL(0x02efb3f7,0x210639da),L_(0xf54c9329),
+ LL(0x330449ca,0x7b06f635),LL(0x0b195c0b,0x9efabcec),LL(0xe879f10c,0x3bd206ba),L_(0x25bef90b), LL(0x0312bdf4,0x88e64b25),LL(0x29334071,0x3a8f90eb),LL(0x3e832f84,0x14f38ac0),L_(0x8a3f7e05),
+ LL(0x4bafc9dd,0xb6461cb6),LL(0x75d1e03c,0x266ba391),LL(0xf40aa6ef,0x4715355a),L_(0x38cce560), LL(0x1adab378,0x716f224c),LL(0x38711bba,0x32b71c39),LL(0x7e89026d,0xccbd7f4e),L_(0xcc519b13),
+ LL(0x7de43131,0x0bbfe1df),LL(0xb1b9786c,0x10701821),LL(0x0bc2e01c,0xf68b86eb),L_(0xf6a6da2b), LL(0xad3f4af5,0x67e192cc),LL(0x6b4b9ef1,0xd5fef609),LL(0x52b649b2,0xf428af30),L_(0x7e90cd58),
+ LL(0xe78176a6,0x0b536242),LL(0xaae8f896,0xdbdd8b1f),LL(0x503b274a,0x51151bfa),L_(0x60ba1217), LL(0x393d4fa6,0xdc4e6926),LL(0xdc183c7c,0xe68387c3),LL(0xaaf0a35e,0x06168aa4),L_(0xb2853fe5),
+ LL(0x2143ebc1,0x4be98451),LL(0xbb1ddca8,0x10163229),LL(0x5db7c140,0x8229e729),L_(0xca486360), LL(0xc19bdf58,0xc8df52e4),LL(0x560cd486,0x89b605d0),LL(0x2a200cdd,0x0c94090c),L_(0xb1ef5103),
+ LL(0x4588f760,0x0c217b21),LL(0x92ea3d28,0x90f7c008),LL(0xef37649d,0xddfaf799),L_(0xfddee462), LL(0x3d0294b1,0x510fffdd),LL(0x1bcf376e,0x4a21ba9d),LL(0x6c9d2cfa,0xa7ada78e),L_(0xca77a07b),
+ LL(0x1db377da,0x63e01d3e),LL(0x5a90911d,0x8c9ad4b9),LL(0x6bb31b8b,0x2b26fec2),L_(0x30e44c9b), LL(0xfeaf9d42,0xe2652b65),LL(0xf5866de8,0x03b48401),LL(0xee2505a9,0x2438e370),L_(0x7a7bb613),
+ LL(0x900098e6,0xd8a6e8e7),LL(0x830770af,0xd8452a93),LL(0x2e2cd25b,0x569bbc5f),L_(0x61715beb), LL(0x80e8caaa,0x3f76b251),LL(0x6dff2aa3,0xeba89ffa),LL(0x18acb601,0xf763dfc0),L_(0xa2dd440c),
+ LL(0x24370f96,0xf5f4a36c),LL(0xbf3c4689,0x527f5322),LL(0x43417948,0xe0b12bf9),L_(0x012f5cea), LL(0x6aa04128,0xb3183162),LL(0x2fa9d189,0x1070f9c1),LL(0xe002ccee,0x5b0c2b4a),L_(0x5840d505),
+ LL(0xfca649ba,0xb223ef3b),LL(0xbe1308ed,0x4aa0b0e6),LL(0x10592f0a,0x3d9b366f),L_(0x3859ac39), LL(0xab61a042,0xaa721fec),LL(0x7c5e75a3,0x0a96a720),LL(0x06be6fd2,0xb3b3cccc),L_(0x9eb8c9a0),
+ LL(0xfda2de37,0xd8576cc3),LL(0x1c4530fa,0x22b5be7f),LL(0xaad70136,0xc40c9235),L_(0x785c8acf), LL(0x9edbb745,0x501faa81),LL(0xc7fdb942,0x60c831a6),LL(0x6f69ca6e,0x813a83b7),L_(0x04f82291),
+ LL(0xdbe3e246,0x4f871623),LL(0x56664b79,0xd2c645ee),LL(0x18c48541,0xc037f50e),L_(0x569420f7), LL(0x08342ef8,0x68cc0cb0),LL(0x19c07325,0x0c4fa826),LL(0x186c66ac,0x8f28f4b4),L_(0x34c938cf),
+ LL(0x837493cf,0xf41079e1),LL(0x433d8394,0x1a861703),LL(0x0e538567,0x03e474ae),L_(0xd2b95886), LL(0xa188c7eb,0x76610ad6),LL(0xe08cbcbd,0x706eb272),LL(0x8025f126,0xb5435d24),L_(0x5ba9b4af),
+ LL(0xc4faeda3,0xd9ddd6dd),LL(0xf3e74637,0xe2be7abf),LL(0x4eea6f06,0x2e6abaae),L_(0xd79c705f), LL(0x99f8dc46,0xc8502a73),LL(0x2f4fd6ed,0xa0aa0199),LL(0xcbc5ed2a,0x38689f49),L_(0x55280ac3),
+ LL(0xfbd4773f,0xb3548b14),LL(0xd9714b0f,0x18cea1f4),LL(0xb3c65f79,0x3bc435fc),L_(0x2867e8b0), LL(0x0706d139,0xca5b9f90),LL(0xe62b0a3f,0x14b87e76),LL(0x864343f5,0x8a82e1fd),L_(0xcbeb5bc7),
+ LL(0x18cc1c83,0x0026972b),LL(0xb17ec512,0x1da022c5),LL(0x2265f4c6,0xb898d6b7),L_(0x5d09e5e7), LL(0xa53eabdd,0xef23c0bd),LL(0x92d24054,0x98e844f5),LL(0x05f9b046,0x7d2e87fd),L_(0x3f161352),
+ LL(0xe7c2033e,0x1c9b4b3f),LL(0x29dc2f02,0xf61d0ee2),LL(0xdb5834bf,0x28b5943b),L_(0x065b016c), LL(0x5de6ece7,0xf70c350f),LL(0xf1049294,0x1c3bfb3b),LL(0xd4c8be79,0xe75564bc),L_(0xb3dd4c16),
+ LL(0xab2cc7d8,0xa4b41a9f),LL(0xbc199c52,0x912b7247),LL(0xe6362cfb,0x6a214d2e),L_(0xe939b311), LL(0xc25479e6,0xf1652743),LL(0x06ef2b5a,0x3bcb10e6),LL(0x9be1e8e0,0xbede8ea6),L_(0x638ffa1e),
+ LL(0x31630309,0x706d16a7),LL(0x3ba8e623,0x9f2f55c9),LL(0xed0db8c6,0xaf0d2787),L_(0xba630c04), LL(0xb9e7f044,0xce8001ee),LL(0x10c159b4,0xb8247bef),LL(0x658e5458,0x78f60572),L_(0x922d3798),
+ LL(0x5c6843ce,0xacaada1c),LL(0x8794be44,0xcabaa3a1),LL(0x36370b66,0x507a17a3),L_(0x943c28ea), LL(0x481b026e,0x48821bb8),LL(0x3885a0a3,0x5ed8e5b9),LL(0x78f46113,0x6817009d),L_(0x1451c3b3),
+ LL(0x7560c539,0x75119a00),LL(0x953124bc,0xe00d03ba),LL(0xef71ab39,0xb863df63),L_(0xfd67781c), LL(0xfedea07d,0xddc4f0d5),LL(0x332679da,0xc43e8f08),LL(0x36d08634,0x9efb1f02),L_(0xa0922f94),
+ LL(0xba05b2e6,0x949d9990),LL(0xd565ff0f,0x76e4e628),LL(0x6c281fa8,0xdccad172),L_(0xcdea3fff), LL(0x6b13eba7,0x70f4d75c),LL(0xd884ce93,0xd34756fc),LL(0x70986d34,0x8f71b0bd),L_(0x430f43f0),
+ LL(0xe10a7afd,0x0a9b3e69),LL(0x66948394,0xf0719c40),LL(0x046cc610,0x9d1611b2),L_(0xda89278b), LL(0x6b7a1ff1,0x24d9cfba),LL(0x638bd7b1,0x5bd30853),LL(0xa740e80a,0x1159e67f),L_(0xe45ccb34),
+},
+/* digit=17 base_pwr=2^119 */
+{
+ LL(0x5898fc39,0xa3566efe),LL(0x23845a77,0x24bb02bf),LL(0x91ab4316,0x00e46ee0),L_(0x83d35ab7), LL(0x8c02881d,0x1d20ad25),LL(0x5866ad97,0xb01ce79f),LL(0x40d6ae86,0x40b2c06e),L_(0x613bd7a9),
+ LL(0x259779c6,0xafc1d993),LL(0x8a7cf112,0x86dcdc82),LL(0x77170d32,0x8441f4f3),L_(0xb0280bfe), LL(0x46144a82,0x58df739b),LL(0x5ee74a89,0x344ddb0c),LL(0x01761502,0xd9bcbeb6),L_(0x676d4eda),
+ LL(0x66de5a2e,0xbc92b6dd),LL(0x7b186d5d,0x1127f258),LL(0x3d18ed03,0x3982ee92),L_(0x50719e4f), LL(0x0deb6e5c,0xcf198f32),LL(0x09997437,0xdbaf1a5d),LL(0x373c1801,0xf524b8bb),L_(0x73564dbc),
+ LL(0x1bb01e24,0xdc5e2b63),LL(0xaca4f30b,0x5df11c5a),LL(0x68e597b5,0x44ec319c),L_(0x8b90301e), LL(0x0e27f5b1,0xe5706d53),LL(0x8b76e26f,0xe67b3280),LL(0xa7111b5d,0x8fa5ee02),L_(0x7b4c92ce),
+ LL(0xe429fedd,0x0035c84e),LL(0x867c82eb,0x2ea6f134),LL(0xa3e74746,0xb9e352c0),L_(0xaebebaa5), LL(0x220bb556,0xb02520ea),LL(0x95bda416,0xe4b94f8e),LL(0x16dbb87f,0xfbff49d6),L_(0x5707ddc9),
+ LL(0xda91cf49,0xdb33cda7),LL(0x450672ba,0x006b3e24),LL(0x489cbfa3,0x4461fe49),L_(0x3d14a461), LL(0x4d93f4e2,0xfe8e5310),LL(0xb7769c82,0xf3d0d29d),LL(0x94deaf7c,0x3d33e2ad),L_(0x3b18c763),
+ LL(0x453d6839,0x8f1b71e2),LL(0xf6d77216,0x923024ff),LL(0xf76bc681,0x17e6ad54),L_(0xe16b7b80), LL(0x66dcecfa,0xe97810bb),LL(0x94c6a912,0x13de9f05),LL(0x30c9e7f2,0xf16b622f),L_(0xa2fbcfd3),
+ LL(0x436d6b95,0x794d49e6),LL(0x3831fe74,0x702ede17),LL(0x5afaacb1,0x3b5ca68c),L_(0x1bea7d66), LL(0x9ca7b740,0x50a1e66e),LL(0x8f17d122,0x762e4f6f),LL(0xc90185b1,0x6705418b),L_(0x36b69158),
+ LL(0x52070a5f,0x9065afef),LL(0xa326ad21,0xe6df0c7d),LL(0x441709b3,0xa1396423),L_(0xade77b6a), LL(0x66868b27,0x14f84f84),LL(0xd0d002f8,0x1fa90792),LL(0x19c083f9,0xfd8d88ee),L_(0x57fe75c9),
+ LL(0x5330a97a,0x77ea9ee9),LL(0x00005025,0xce00962f),LL(0xae5f476a,0x05915824),L_(0xdba736d5), LL(0x8cdf0301,0x660a19e4),LL(0xee8a2aed,0xc70e0b10),LL(0xfdd0563d,0x41d445a6),L_(0xede64633),
+ LL(0x53d54a0b,0xa5729cf8),LL(0xb0c860cb,0xea907454),LL(0xea0c5a91,0x59a871ce),L_(0x9efd302f), LL(0xe025ffb1,0x7e7fb9d6),LL(0xc8022642,0xb7954f0d),LL(0x46ca7ee6,0x010dbf77),L_(0x4bfdff6a),
+ LL(0x2d7e46ec,0x034b69ed),LL(0x850b3401,0x51bc6b66),LL(0x3c25755a,0xe9bf6717),L_(0x95d70595), LL(0x06b03b20,0xfc3e6ce3),LL(0x384f786b,0x723756d9),LL(0x58938357,0xb4731ae9),L_(0xa8628a04),
+ LL(0x42ddfb71,0x33bbd9fd),LL(0xc9ef16f4,0xeb7aa22e),LL(0x725fdf2d,0x88eb52e0),L_(0xa3454e1e), LL(0xf1fc16a0,0x297a7972),LL(0xda90c2e0,0xb92c9670),LL(0x9c2b4849,0xa557aadd),L_(0xb719cae7),
+ LL(0x58182a1a,0x27b6bd7a),LL(0x5c2d70bf,0x1c72e559),LL(0xd4f2f098,0x6b53e542),L_(0xb01de7e4), LL(0xb5e11023,0xa8f7b191),LL(0xb49a6846,0xe62460d3),LL(0xbdf84150,0x74ea071f),L_(0xf4211acf),
+ LL(0xe03c9ae5,0x54fef132),LL(0x9ad73091,0xa900e0bc),LL(0x1a602274,0x3698f6bb),L_(0xe357c5f7), LL(0x57e365aa,0xbb500025),LL(0xf19ef91f,0xf16e71f5),LL(0xa0dfe4bb,0x9d6899d1),L_(0x399ab86c),
+ LL(0x8e577079,0x8e833532),LL(0xabea4782,0xfb9fbccf),LL(0xf5ead3c9,0xe31f0c20),L_(0xe2d0d774), LL(0xc462ce8c,0x6466c045),LL(0xb27628d9,0x85e7447b),LL(0x3e1abc03,0xbba798a0),L_(0x0e905d6c),
+ LL(0x122d19eb,0x158f4312),LL(0x3f408e0e,0x297c5747),LL(0xa7b750fd,0x735aa3f7),L_(0xbe1aa687), LL(0x312d6129,0x31e8bfa3),LL(0x166c2e16,0xcc9cdadc),LL(0x5094cff5,0x9ea9beca),L_(0x2dea9edd),
+ LL(0x616ee97a,0x78257a1a),LL(0x7f5d51d6,0xec98f98c),LL(0x609d2d2d,0xd1b3e514),L_(0xe1569e97), LL(0x2e59e233,0x8087f780),LL(0x45e2a372,0x0b40b852),LL(0x95c2865d,0x8fa97627),L_(0xeeff0632),
+ LL(0x1eac58fb,0x7eb748d9),LL(0x9922cc63,0x0d0b673d),LL(0x955ae146,0x72be4e8e),L_(0xd6809bdd), LL(0x22b08d07,0xa4616bf8),LL(0x09a6ef9c,0xc55b68a6),LL(0x42138fbd,0x8fa529ef),L_(0x4dfbed1e),
+ LL(0xf1766b08,0xdfd72d39),LL(0xe0356587,0xad6b741e),LL(0x59466485,0x5fceaf74),L_(0x24d9205e), LL(0x0c6b2255,0x453c9eae),LL(0xb9402267,0x9c00d050),LL(0xa3817166,0xa87cf553),L_(0x43612515),
+ LL(0xad146ff6,0x39990110),LL(0x0f98feec,0x3d48a808),LL(0xfe9fea01,0x8c4aac12),L_(0x2443ed5e), LL(0x0ad5c79c,0x0a9a20f7),LL(0xd997c3c0,0x942b38bd),LL(0x9475c474,0x218031b5),L_(0xd3104cb6),
+ LL(0x4c0dcf95,0xcc4c491e),LL(0x234524ca,0xfa790f55),LL(0x12a6c289,0x37abf7be),L_(0x3e8c0631), LL(0xcb586fd3,0x192166df),LL(0x0c51f097,0x7ee1f233),LL(0xbba9c768,0xb69b46cc),L_(0x2fb2d51d),
+ LL(0x1443ddcd,0x6345a210),LL(0xecf6729f,0x5f035126),LL(0xc8273e38,0xdafd6230),L_(0x83e19f89), LL(0x4e79437a,0xb3e2d215),LL(0x6090e2e6,0x138aca38),LL(0x4afb3539,0x4ce64d55),L_(0x30dd853f),
+ LL(0x6b581765,0xc440084f),LL(0xeff7dc6a,0x088767cc),LL(0xf0d004bb,0x94e1ba30),L_(0xb9c2e7e5), LL(0xa1a18413,0xa732c539),LL(0xc31da773,0x896710e9),LL(0x3608f75d,0xa067bb07),L_(0xaa5451e2),
+ LL(0x98910990,0x65c3a1bc),LL(0xbcc70896,0x3321e865),LL(0xb04ac43d,0x438e5b9d),L_(0x43f7f50c), LL(0xe260d025,0xc4dcba5f),LL(0x79613445,0x5e5f5f4b),LL(0x37b1a0c5,0xd3c102f6),L_(0xa0273b2c),
+ LL(0x4e2d8d4d,0xe6546299),LL(0xd9309108,0x262d0cb1),LL(0x2df96d37,0x349292cc),L_(0xa711d216), LL(0x2fddedd4,0x452a0a52),LL(0xd9e54125,0x2293a068),LL(0xc6053861,0xfe3040eb),L_(0xfb5c3f2b),
+ LL(0x02a166d6,0x861af22b),LL(0xc493f8ef,0x449c202b),LL(0xb053bb62,0xbb664aff),L_(0xc5af5837), LL(0xd6f78a71,0x14a57ed2),LL(0x1edcfcb6,0x6c5eedb1),LL(0x591d0e00,0x0f079d9e),L_(0x6f7c473e),
+ LL(0x4ee2bac7,0xc62978b5),LL(0xeec393c4,0x0ee684b8),LL(0x56d30723,0xb8993d5e),L_(0xdfc904ce), LL(0xfc172756,0xc8622a7c),LL(0x73b2ec23,0x4279a0bc),LL(0x78cfee0e,0x3826553c),L_(0xd011a36e),
+ LL(0x9060272d,0xe29ecb65),LL(0xa0218247,0xdd976fe9),LL(0x53d3e99f,0x278ebed1),L_(0xbcea3ccb), LL(0x7a33fe7f,0x13d33afb),LL(0x1b5111c1,0x19d16dca),LL(0xe09a47ad,0x6e0ed440),L_(0x80396140),
+ LL(0xb55799e5,0xf145e8f9),LL(0x443b3b83,0x97e6d3d7),LL(0x4580043d,0x5f599a51),L_(0x2fcd83a6), LL(0x38414d95,0xe09d35b1),LL(0x8975407b,0x31551460),LL(0xce073290,0x1044bab9),L_(0xae80d126),
+ LL(0x045e586e,0x4d8f2d61),LL(0xc81d17ac,0x1d2b5b31),LL(0xb68b7f81,0x10bccde6),L_(0xdb1468c5), LL(0x0578898d,0x1e460079),LL(0x5fbad189,0x31bad31c),LL(0x3d22477a,0x8c371b62),L_(0x32c1f1f2),
+ LL(0xbc19767c,0x3ed7db29),LL(0x4ce61a9a,0xcc843c60),LL(0x45c30a38,0x508e3e86),L_(0x5c8b4727), LL(0x1457fcb7,0xd8c78825),LL(0x308a4222,0xc3997703),LL(0x2b88e6d2,0xa1f2140c),L_(0xbcc49242),
+ LL(0x2a452962,0x62444dca),LL(0xffa24655,0x2d1e976d),LL(0x1d95f51c,0x2bbeb1e0),L_(0x6ac09c41), LL(0x052daa66,0x827170a2),LL(0xbfaa5a51,0xc319b1ba),LL(0x3a8ec55d,0xda0c72a5),L_(0x9d0ac0b5),
+ LL(0x898419db,0x35d9c257),LL(0xbb8eaa1e,0x55758230),LL(0x4e49ddae,0xd5c3703e),L_(0x8e18cadd), LL(0x28d3f23f,0xa38dc679),LL(0x8ecf56aa,0x749ea0b7),LL(0x15724faa,0x68bb7f4b),L_(0xb2b1249d),
+ LL(0x0f227df0,0x24af0afb),LL(0x8232f88c,0x1cd97cee),LL(0xa2ad5165,0x678f117f),L_(0xa5067478), LL(0x03432db4,0x5cb93ad2),LL(0x610d26df,0xcc96e20a),LL(0x47d3d48c,0x5f1e84c2),L_(0x31ddfcd2),
+ LL(0xc4293aef,0x7f0db6e5),LL(0xe03b4f7e,0x9069c8c1),LL(0xa088318f,0xf4210d55),L_(0xe9cec920), LL(0x13bd2b28,0x34f3150f),LL(0x7de6ff6f,0xe152eb4e),LL(0x0fcf1527,0x32e6885b),L_(0x4f27fdfa),
+ LL(0xed8906ba,0x7eba0ca2),LL(0x615cf3d7,0xc91dbf27),LL(0xcf44aa02,0xf0948c8c),L_(0x346dc0f7), LL(0xbe7b7488,0x88539394),LL(0xe2e6a4a5,0x938fd6cc),LL(0x15b31f6a,0x1a1c6b6b),L_(0xe564ce23),
+ LL(0xc2869ed1,0x61ab3c9f),LL(0x5693bc05,0x3bb8c353),LL(0xb69781cd,0x95d9d719),L_(0x31986774), LL(0x3de229eb,0xc3895533),LL(0x72ce5e74,0xb6955022),LL(0x5ac0d29e,0x6e2ba9f7),L_(0x12310f9c),
+ LL(0xfe2a24c4,0xe3406a2f),LL(0x7a0fc1d1,0x67beb235),LL(0xf6867bb0,0x5b2cd123),L_(0xc3378be7), LL(0x2ff473c0,0xed6d88b5),LL(0x5fc0483f,0x046a1f51),LL(0x9b3025d4,0xf4a61d8b),L_(0x8b1ce295),
+ LL(0x99e19904,0x7e9f5e57),LL(0x5c52c743,0x00b84a5f),LL(0xbabc0faa,0x6de1d67d),L_(0xbf153310), LL(0x04041367,0x06672f11),LL(0x6650a578,0x0dd51cb3),LL(0xd4012aa6,0xd5ce357e),L_(0xf901856b),
+ LL(0x538e45db,0x5f595162),LL(0xf13e03cd,0xe917805d),LL(0x56a8bf52,0xf639993d),L_(0x043c78de), LL(0xe876b4ea,0x3eaf3c58),LL(0xe2439014,0x0ef45389),LL(0xbd9e742b,0x95404cfd),L_(0xce45f79b),
+ LL(0x1453ad22,0xf6e400ed),LL(0x0126443e,0xa4ababfc),LL(0xd78f1c8d,0x4ebc5852),L_(0x6149c4a9), LL(0x4e1ef091,0x7415270e),LL(0x84d52256,0x921cd6ee),LL(0x472b1f2f,0x765126f0),L_(0x33de4dc4),
+ LL(0xade7ead4,0x1b413797),LL(0x12c424fc,0xeabbca1c),LL(0xdb705e2f,0xa1e12595),L_(0xa616017b), LL(0xd199009a,0x79fa6f2e),LL(0x9168da3a,0x4d4d9e09),LL(0xbde588b7,0xc0ac97e6),L_(0x9a16a183),
+ LL(0x23cf39f8,0xca0fac28),LL(0x40729683,0x4b179b82),LL(0xb04c01ae,0xfaca0fdf),L_(0xdf006531), LL(0x7b3cc76a,0x3d2bf7fd),LL(0x7e32a952,0xf3f2fea3),LL(0x6369c1d9,0x866e7f8e),L_(0x8e8c8b64),
+ LL(0x6eb23ad9,0x8b9475ca),LL(0xe0c8ef8e,0x22d9fd00),LL(0x4e9a3adc,0x813270cc),L_(0x478c17a1), LL(0x292b8bdd,0x3db7f857),LL(0xe5e27f6a,0xf6ba5b62),LL(0x1b8a570a,0xe20966e7),L_(0x040d840b),
+ LL(0x19b8e7ad,0xe13277a1),LL(0x9ff0663a,0x6d26fe40),LL(0x8f8b7d68,0x0ce42976),L_(0xfa5a58e5), LL(0x48e32e15,0x0ee98d37),LL(0xbdd62d44,0x3bb6c2c8),LL(0x4db74aeb,0x208cd0d9),L_(0x55f387e3),
+ LL(0x47ef78f3,0x6c1b0959),LL(0x5e1f13ab,0x2ccd97f7),LL(0xa303c278,0xf9abf5b1),L_(0x3d97a968), LL(0x0276fd8b,0x2be1d396),LL(0x8b026a44,0x726beb4a),LL(0xe09517f7,0x4e0b499e),L_(0x502462c0),
+ LL(0x5979197b,0x82ffa270),LL(0x23bdd46d,0x52cb678a),LL(0x260e7e25,0xc541f700),L_(0x908eadfa), LL(0x33983072,0xb1d2f59c),LL(0x321cd9fd,0x11eef46a),LL(0xf2b04fe3,0x9fba737f),L_(0xe7bc6bb7),
+ LL(0xbcadb426,0x4d1d9a21),LL(0xb55fa843,0xe2a1f313),LL(0x2170c6a6,0xc15b9466),L_(0xdebbce2a), LL(0xd605b2bd,0x1578a3c5),LL(0xd1e52a96,0x96b6befb),LL(0xbe0b58ef,0xc4f7e33c),L_(0x93e465b5),
+ LL(0x3fcf43e2,0xb19e11a6),LL(0x508b2d4a,0x5ad2ed77),LL(0x6ff2a142,0xe587c79f),L_(0xa56c66b2), LL(0xb2ee2d93,0xa6fa95d1),LL(0x260067ec,0xac5ec114),LL(0x67b40c94,0x41c55249),L_(0xdc3ac489),
+ LL(0x6b551c3d,0xc6c2dc20),LL(0x3452633a,0x1b5233ca),LL(0x0e6faafe,0x4565862d),L_(0xfa2f6235), LL(0x08edb0b2,0xb2d31417),LL(0x6cfe0764,0xa0fa599b),LL(0x77052491,0xb2ac3ec1),L_(0xbcc97485),
+ LL(0x0302d5f4,0x04cf0b83),LL(0x37cf0d9a,0xbd701c39),LL(0xfb565431,0x5eee993f),L_(0xc5d3f450), LL(0xb5c3681b,0x5d285d50),LL(0xcc0e0a9d,0x8618542a),LL(0x8c1d7c52,0xd80996cc),L_(0xddcf4356),
+ LL(0xf0fe4630,0x12c3c8ab),LL(0xfb1a997d,0xb6349270),LL(0x2f148e5a,0xc0513e4e),L_(0x7a141833), LL(0xd043e9e1,0x340f7e04),LL(0x52e9cd98,0xb4acedf4),LL(0x5d6d0c14,0xfa56de6f),L_(0x2558f609),
+ LL(0x435b6bea,0xdb7a9959),LL(0xe6426f07,0x24fae08f),LL(0x3cd0982b,0xcc274d62),L_(0x7f805789), LL(0x02f3dea7,0x2a9bf937),LL(0x774708d8,0xadae4c03),LL(0x61de7f6d,0xba3c48a3),L_(0x8de4f729),
+ LL(0x2faaf033,0x7e8bb31a),LL(0x31c0bd80,0xd937aa83),LL(0x072c01c9,0xbfe57ab1),L_(0x201af074), LL(0x87c5d209,0x4ce95747),LL(0x5887d49e,0x7ee66e9b),LL(0xf01cc54c,0x48478c99),L_(0xa2993bcb),
+ LL(0x957c7ee7,0x50dc83b5),LL(0xacc25598,0xf0f63a80),LL(0xb4578760,0x842ee70e),L_(0x4ca0ed74), LL(0xc891093c,0x24bc2867),LL(0xfd1e42bc,0x0f85fa2e),LL(0x47bb6a4a,0x18cd7a2e),L_(0xa82a8343),
+ LL(0x4077391a,0x798cdd8c),LL(0x381485f3,0x68858372),LL(0xd2c5ede9,0xb240c94c),L_(0x7ec5555b), LL(0x62fa25b8,0x89e94f52),LL(0x25aa6ecf,0x0332347b),LL(0xf207ad5e,0x9e15c0d4),L_(0x865ae0a0),
+ LL(0x6d748e08,0x298a62fb),LL(0x549ffe32,0x8f7fb37e),LL(0x35f944a9,0x92926ab1),L_(0xe6fbe10e), LL(0xdc488cff,0x3f355ad1),LL(0xd2f1e956,0x84b0d884),LL(0x29d8cb57,0x98d39682),L_(0xae5bcaa6),
+ LL(0x07c8c79a,0x4957a527),LL(0x3263fbf3,0xec94fd37),LL(0x601424db,0xf147c20f),L_(0x01b4af1e), LL(0x1adc80ef,0x7d9440bd),LL(0x4bfaaf0a,0xee7355aa),LL(0xd1adde68,0xba4d5d2f),L_(0xbdf3e79f),
+ LL(0x4dc18b13,0xebadf0ef),LL(0x13192c94,0xbc8d4cc9),LL(0x8da37771,0xd555d58a),L_(0xebc86daf), LL(0x42fdc282,0x2e05719e),LL(0x8384340b,0xdc3ed2bf),LL(0x4c1b070d,0x03356492),L_(0x28e4bef9),
+ LL(0x8da99c00,0xa1e580f6),LL(0xf42f23ce,0xcf6d6c6d),LL(0xfdabb4f2,0x80f7da41),L_(0xf36b6774), LL(0x6a7dfe85,0x36467882),LL(0x8548109a,0x30e07e69),LL(0x943abc5d,0x8ae444d2),L_(0xe5bede0f),
+ LL(0x2441fb9a,0x0599179e),LL(0x18313f97,0x54669582),LL(0x47767b19,0x6fa66e89),L_(0xd078a973), LL(0x4596bd1c,0x93f0e068),LL(0xb6d46417,0xe4e3af1f),LL(0xff7a84e2,0x951ce962),L_(0xe6d6f09c),
+ LL(0x466ca296,0x16afa866),LL(0xd1fa4080,0x1f38aad4),LL(0xf4e1677b,0x672e7252),L_(0xf4b620a7), LL(0x3a4e5077,0xfcdff811),LL(0xf5e013a3,0xfe6adcab),LL(0x8a4243ce,0xb04666fc),L_(0xd68cd7b8),
+ LL(0xc1e32f39,0xd93030cb),LL(0xe0a61e74,0x15f3f603),LL(0x39bbca36,0x90c8c914),L_(0x18b00023), LL(0xa53fc682,0xb0c4475f),LL(0x4cc3825c,0xed39d188),LL(0xa57cf95c,0xd562a81e),L_(0xc8cb3e5f),
+},
+/* digit=18 base_pwr=2^126 */
+{
+ LL(0x02c6b67a,0xace24453),LL(0xde939bb0,0xa58b929a),LL(0xbe2f8e64,0x9a3a7efb),L_(0xa302408a), LL(0x7fa4b043,0x8ad04303),LL(0x56c2b048,0x426eb7ce),LL(0xa67998c5,0xdb040e40),L_(0x60850b87),
+ LL(0x3bfd76b3,0x0361658a),LL(0x20f7e490,0xa3b9f1bd),LL(0x66db4cfa,0x4799c86b),L_(0x82aaeafc), LL(0x01c04fa1,0x0689618b),LL(0xd1b3660a,0x5b052123),LL(0x524802bb,0x25748110),L_(0xd8501db2),
+ LL(0xb542168b,0xf1dd3dc0),LL(0x40fb7327,0x3556cca8),LL(0xf3b21a79,0x0d1838e7),L_(0x0263cade), LL(0xbbfa3610,0x43bd0f7a),LL(0xe6ca4a48,0xfdb15d30),LL(0xa293f5a9,0xf9285692),L_(0xf5e2782f),
+ LL(0x7da35373,0xefe3b9e7),LL(0x475d95b1,0x08b0fe30),LL(0x9c0da2e3,0xcef9bd5d),L_(0x69f4e019), LL(0x087c3eeb,0x4386ea9f),LL(0x107a9f5d,0x5543dce0),LL(0x057ad0af,0xc5162840),L_(0x036ea919),
+ LL(0xfeb313d2,0x398fba1b),LL(0x07cbfb75,0x52f53c92),LL(0x98909181,0xfa320278),L_(0x063675b6), LL(0x906d44a1,0x427688fa),LL(0xb499f521,0x1c7282db),LL(0x3901fb30,0xaea2389a),L_(0x14299eff),
+ LL(0x1424671b,0xd8f3ae0f),LL(0xb631e50c,0x80279f71),LL(0xd5a77238,0x602ce4df),L_(0x988af873), LL(0x12e9402e,0xdd095d1b),LL(0xc30915a3,0x6cb15ad1),LL(0x0927adfc,0xa38c1285),L_(0x3f7c6e76),
+ LL(0xec392753,0x1ec20f01),LL(0xeb41a6c8,0x5cac318e),LL(0x47520f8c,0x407d9032),L_(0x0390450a), LL(0xe2f3dac2,0x43dd79ec),LL(0xc468403d,0x9236a81c),LL(0x6bccf29e,0x00ac0a42),L_(0x713f0b03),
+ LL(0x163c66e1,0x849061a0),LL(0xa20a6586,0x70208a9e),LL(0x7bf95257,0x07a10de2),L_(0x3b8aa66f), LL(0x45c2891b,0x15468f60),LL(0xf59044a4,0x73d5ebe8),LL(0x387e234b,0xa32ac9f8),L_(0x4f7ec3db),
+ LL(0x962ab071,0x570fcd62),LL(0xbcce236d,0xb1757c3e),LL(0x1ad55d1b,0x7fa592e8),L_(0x1700716f), LL(0x76fcda7e,0x73d3b392),LL(0xdd37f1e3,0xd6cf8e98),LL(0xca16fca1,0xac456eec),L_(0x5752c0f7),
+ LL(0x5f929901,0x240b92b4),LL(0xef15652c,0x0f7d51a0),LL(0x632731fb,0xf12e9902),L_(0x38b796f7), LL(0x47671b3d,0x985803eb),LL(0x5fa89402,0x63e1c219),LL(0x608cf2d5,0x109df03c),L_(0x8ca4e888),
+ LL(0xb25c71f6,0x0829cedc),LL(0xc7a41eb8,0x483d485c),LL(0x15305f6f,0x60591120),L_(0xf6bc7367), LL(0xbcdea717,0xbeeee884),LL(0xe598a6e7,0x88e6ef42),LL(0xc3d80182,0x4b2dd1d3),L_(0x45cd3855),
+ LL(0x482c367a,0x6b421466),LL(0x8af36484,0xa58b570e),LL(0x2587649f,0x3e4ee4bd),L_(0xe423c77c), LL(0xf5a1388b,0x98494de5),LL(0x4a294a8e,0x8f25a37c),LL(0x50e9cc72,0x1ce8e0f0),L_(0x10660a4c),
+ LL(0x119587d4,0x8e668562),LL(0x167d0962,0x0554888c),LL(0xd291f0fd,0xae58bc85),L_(0x8d335bc2), LL(0x48a506c2,0x034f448b),LL(0xd5ffc68b,0x94dd32bb),LL(0x2bd2abc9,0xb9e588a6),L_(0x2eec6265),
+ LL(0xe1e13902,0x24b16627),LL(0x8bba7a24,0x4f52ca61),LL(0x749a749b,0x8bb11e14),L_(0xb6773c49), LL(0x3dfafe08,0x71bdac04),LL(0x76569dbf,0x40bd5231),LL(0x1587ab8c,0x7d2d4a5e),L_(0xfceafeac),
+ LL(0xe7ffdae7,0x0f11fde4),LL(0x936bcbdb,0xc78059f3),LL(0xf4713c18,0x2d2f0ff7),L_(0x0dce5266), LL(0x5fe86c6b,0xa381beae),LL(0x9b2c0aaf,0x734b9092),LL(0x77f56796,0x82131b3f),L_(0x02162cc8),
+ LL(0x612650a2,0xc29b399c),LL(0xad145b7e,0xd673cbc4),LL(0x60425f21,0xece9a8ea),L_(0xc5d38ead), LL(0x394b09de,0x1b69fef5),LL(0x55ee50f6,0x141fc2ff),LL(0xeab0baec,0x85999248),L_(0x02f743df),
+ LL(0xf4b4d1ac,0xe1f44cb9),LL(0x3931200d,0xd86fbb1f),LL(0x32861f51,0x242811d3),L_(0xa373e731), LL(0x20b39e71,0xc64c1332),LL(0xd9a6709c,0xeb68ae08),LL(0x93c66ba1,0x7aee0eb8),L_(0xfc730fa6),
+ LL(0xf47a18f8,0x992398ea),LL(0x454ef012,0x7414fdc9),LL(0x325c8a8e,0x42a7e664),L_(0x3b3fca9b), LL(0x9f053cb0,0xc8869d15),LL(0x34539da1,0x1878089e),LL(0x11f347a4,0x19ee0c05),L_(0xf6ff52d9),
+ LL(0x3e51ac6d,0xb254a9d3),LL(0x5029469e,0xe2b48c1d),LL(0x916d1214,0x3732c0ab),L_(0x07cba5dc), LL(0x0cb5ec91,0x010093ba),LL(0x6f2fe681,0x4a4cfff5),LL(0x4aaf2a44,0x7feda10c),L_(0xafba52c9),
+ LL(0x58625a1b,0xea895fc8),LL(0x19dbf9ed,0xcac0e4d3),LL(0x53bc48b9,0x1d43df08),L_(0xc8f9dd1d), LL(0xee75a211,0xe1a8bb95),LL(0x718f5878,0x7e7b6ce4),LL(0x4a384a6d,0x26d0db83),L_(0x97ecfe38),
+ LL(0x2bb95cae,0x9e42faba),LL(0x9254494c,0x0f33c611),LL(0xf67c4703,0x6ef93df3),L_(0xc1445815), LL(0x8ad685b3,0x8655685c),LL(0x6cd1cca8,0xdd2eb2bd),LL(0x5e194627,0x523e0fd5),L_(0x44f05a1f),
+ LL(0x301fcb43,0x80fb78c3),LL(0xa1be1446,0xfaa1d373),LL(0x3d0a850d,0x051bb6db),L_(0xc2bd0c81), LL(0xc7fc5cae,0x38f0078b),LL(0x6d01ae21,0x91a544af),LL(0x0c9540c5,0x6cae5443),L_(0x41626d37),
+ LL(0x93ebe56f,0x71946cb7),LL(0x3335ca8b,0xc82366c4),LL(0xbfe6dc77,0x27a97fdc),L_(0xcc4d8fd2), LL(0x80d9e528,0x16d42ed2),LL(0x4d8537e9,0x18abf493),LL(0x0398f8d3,0xa190c5d3),L_(0xd448e52b),
+ LL(0x495ac576,0x6bf10350),LL(0x3cbf1e78,0x2674f39c),LL(0x90ac41f9,0xaedc843c),L_(0x784b629d), LL(0x60ca4b9d,0x2b7ba708),LL(0x88cff37a,0xc070ae0f),LL(0x2e4b0764,0x0c3aa1f7),L_(0xdf186109),
+ LL(0x555cdffc,0xd2310fa6),LL(0xac832df3,0x42f99111),LL(0x9d84f404,0x8d7bdc74),L_(0x64936918), LL(0x43e3cff3,0x1c149edf),LL(0x3b328f21,0x442dde2f),LL(0x1288dcc9,0xb3089de8),L_(0xbad0531f),
+ LL(0x3fe61e60,0x20fa93a3),LL(0x494f3a66,0xb50f92b6),LL(0xbfce0907,0x632ab7a5),L_(0xe52a0324), LL(0xc89531e3,0x6f57401d),LL(0xca680133,0xf7bd6eaf),LL(0x5942987b,0xceffd87f),L_(0x75f1a1f6),
+ LL(0x74161b3e,0x647fc617),LL(0xe81422f8,0xac7f6cc7),LL(0xc485b2c8,0x0414a8d3),L_(0x5303bc61), LL(0xd7de72d1,0x1d6064d4),LL(0x88c0864e,0x9fd6a734),LL(0x8ee9cb9d,0xf104d7a9),L_(0x963ee732),
+ LL(0x776f7b1b,0x2b058af6),LL(0xdc25f3b6,0x0d06abe1),LL(0xb0461b36,0x90f6c358),L_(0xdad04c23), LL(0x9a72e439,0x24e0b184),LL(0x2af6be09,0x6facf219),LL(0x5f6753e5,0x5f23a218),L_(0xa362a760),
+ LL(0x4fd2cc26,0xadb7e3c5),LL(0xdb9150c6,0x4cc67b4d),LL(0x4c80d589,0x6a578011),L_(0x78347a1f), LL(0xc04163a4,0x41978a17),LL(0xa1df6b38,0x4701d625),LL(0x7acb9d4e,0x7040eb22),L_(0xb0f7aae6),
+ LL(0xb117faf4,0x734cd26d),LL(0xd884a071,0x071d299d),LL(0x1ad0de2a,0x826417df),L_(0xda3b0c06), LL(0x487c15f0,0x5432a8df),LL(0x85244fbd,0xa5c2986f),LL(0xe2f76737,0x89d1f699),L_(0xefb644c7),
+ LL(0xe366cc7a,0xcd96f1e7),LL(0x2f09e23c,0x19aa24f5),LL(0xbe89a16c,0xea6d5b99),L_(0x1a7565fa), LL(0x1afa0bd5,0x8da4ca09),LL(0x8baaef4d,0xb278c555),LL(0x07697581,0xea0b2435),L_(0xbefa5c32),
+ LL(0x233ddda5,0xbce451f2),LL(0x6e777818,0xe21ca9dc),LL(0x33fc9573,0x608477ee),L_(0x96d9fe99), LL(0x37f4a8b7,0x2f253ba7),LL(0x11d98950,0xec1f4a44),LL(0x3ae7c4bb,0x1c649260),L_(0x4eeee3f8),
+ LL(0xf186ffa8,0xca88dd8a),LL(0x25be4bd7,0x2e8c5c07),LL(0xd65638d7,0x8d28689a),L_(0xbe778846), LL(0xa2ef4b72,0xfa5e89e0),LL(0x0b27fb66,0xea4b66ad),LL(0x2a17ea7b,0x5744fef5),L_(0xaf89c334),
+ LL(0x1c88c916,0xd377e6af),LL(0xa6b3f831,0xbd38c04e),LL(0x43c62134,0x7e11eacb),L_(0xaee51855), LL(0x3aa19a13,0xe65b9643),LL(0x3179a57d,0x0069d240),LL(0x7d7a8265,0xc6fc4f7d),L_(0x8ea00bca),
+ LL(0xb94a17c9,0x95308d83),LL(0xb3928b84,0x88fbad83),LL(0xd14a8ca8,0xcec36252),L_(0xff246228), LL(0xf71bccbb,0xd90035ec),LL(0x499776eb,0x55a73d3d),LL(0x07f0cdbc,0x6c21797b),L_(0x87db5d7d),
+ LL(0x5162797f,0xa87e9702),LL(0xaaf9d8c4,0x2ab93ff2),LL(0xe2a31c19,0x4288abf4),L_(0xc4cc32b4), LL(0x80be51bc,0x388680ed),LL(0x2f0c118b,0x8dedbe91),LL(0x7da1a829,0xbffcb08c),L_(0xd681d331),
+ LL(0xac1e2c01,0x1d6fb3ed),LL(0x470f2923,0x9f1545b9),LL(0xfb03795c,0xbfecfd6e),L_(0x8ff73fcd), LL(0xac0e74d1,0xcbb46331),LL(0xcbbfedab,0x01849564),LL(0x79c317d8,0x9186b0db),L_(0x7c549c1e),
+ LL(0xe3b9e5c2,0xa44cb510),LL(0x670d9ca9,0xc72bcde9),LL(0xd47f22e3,0x23ac79ad),L_(0xe4bd107b), LL(0x1062a84a,0xd5193e66),LL(0xfb47ce43,0xbb25e4cf),LL(0x600c0353,0x5ab3c0ce),L_(0x005311ba),
+ LL(0x1f36e1c7,0x2a414d7c),LL(0x9bec3869,0x23202a91),LL(0xbdd27859,0xd77095b4),L_(0x270698b1), LL(0xe5a99ae2,0xd0fffc9e),LL(0x3c7db5f1,0x490dac48),LL(0xacfdbe9c,0x9079d090),L_(0x1bb8021a),
+ LL(0x550c3e83,0x448361bb),LL(0xa680b478,0xfeab6ae3),LL(0x41969a52,0x74461138),L_(0x9a38f5c6), LL(0x47381f19,0x2be030b8),LL(0x0e86ce09,0xb091abda),LL(0x4da4cd53,0x7df8f1e3),L_(0xc85acbda),
+ LL(0x9fea92c4,0xab2fcd01),LL(0x85b0423d,0xd804cba2),LL(0xed8709e8,0x19141717),L_(0x49d8b7d7), LL(0x88fb9ada,0xe105506b),LL(0xb90d9a8b,0x8cb2c13d),LL(0x4e6bda23,0xcaba970f),L_(0x7dff6f41),
+ LL(0x9fcd4872,0x160191eb),LL(0xff541bf6,0x826242d0),LL(0x99634c20,0xdfe7289d),L_(0xa5294071), LL(0x4e07eba9,0xc0910d55),LL(0xd5b6e07a,0x7e042c86),LL(0x6d7f5229,0xd74d6e82),L_(0x42f50e09),
+ LL(0x6efbc0e3,0xcc3c4e8e),LL(0xd7d09e5f,0xf21ea1ea),LL(0x05c108d8,0x37aae682),L_(0xb8b85f83), LL(0xf2c37fd3,0x9a51bef8),LL(0x5a44835e,0x5ac834a6),LL(0x2a412b12,0xac985dae),L_(0xf2f75363),
+ LL(0x39bd009a,0xb0ef3648),LL(0x7df070de,0xc1936e74),LL(0x97226670,0x3eb64bfc),L_(0x0a7cc2d5), LL(0xfa065546,0x6cb29cd8),LL(0xd6b2e07d,0x010fbc35),LL(0x6b24b9f4,0x72e08b5c),L_(0xbf7187b5),
+ LL(0xe0daf351,0x2fb0ee94),LL(0x31222305,0xac57f680),LL(0xb753971e,0x6b0ccf83),L_(0x55a3abe2), LL(0xc3b1be68,0x48b857e0),LL(0xfc1add13,0x81e2b0c5),LL(0x595ebecb,0x7151293e),L_(0x43489ffc),
+ LL(0xb788bb44,0x65e9c6ef),LL(0x071c9990,0x10062256),LL(0x891a7719,0xe6f377fd),L_(0x65d3a9e3), LL(0x7355204b,0xe23556ab),LL(0xa6502b28,0x188872cd),LL(0x84eba15d,0xea03bca4),L_(0x62a2b9d4),
+ LL(0x159bb9df,0x08807416),LL(0x78e83862,0x496eba6b),LL(0x5b5b2f5c,0xff4f34bf),L_(0xc8432a05), LL(0x376ec0fd,0xe48904ea),LL(0x386ae415,0x96bf9fdc),LL(0x9b04b325,0x003a468c),L_(0x2a854bd5),
+ LL(0x3d1be5ac,0x62509881),LL(0x76fd690b,0x65d5f607),LL(0x244caa05,0xc38d7540),L_(0x7a21901b), LL(0x0b239ba7,0x19b8e994),LL(0x14c3955b,0x1f25f647),LL(0xd2cd0a34,0x7f481820),L_(0x3e5eb658),
+ LL(0xdceb71b6,0xf395c0f2),LL(0xcc104e0d,0x6febd95a),LL(0x01d8efcf,0x0b358ed0),L_(0xcfc537fe), LL(0xdadfd46d,0xdc5d961e),LL(0x8b4f6c1d,0x221b24a2),LL(0x6d21a125,0xc0f16b10),L_(0x36a0bac0),
+ LL(0x3ece8319,0x54252e96),LL(0x46f2cfb1,0x97edd630),LL(0x020e1e99,0x90685aae),L_(0xfc1bcb8e), LL(0xb7771435,0x6df64310),LL(0x43c4fd8d,0xa647e2b0),LL(0xd6ddd8f3,0x52ff5927),L_(0x5282fbcf),
+ LL(0x3fd7f727,0xbb02013a),LL(0xb1fc86fe,0x6e17def8),LL(0x5ef8f2c6,0x1b970bb2),L_(0x1b714b57), LL(0x1236fa50,0xf7a7e274),LL(0xcc10de34,0xffa4c977),LL(0x5a8179b1,0x99219388),L_(0x798129b2),
+ LL(0x4b407e5a,0x844408fa),LL(0x6be5d183,0x742669b3),LL(0x0751f86d,0xb00b365a),L_(0x34786bf6), LL(0x3a8360fc,0x4147cefc),LL(0x88816150,0x0393026d),LL(0x7a7f6231,0x2e39fa34),L_(0x879f391b),
+ LL(0x149f6c78,0xbbcd3afa),LL(0x8292ce76,0x742b5b3a),LL(0x899f0118,0xb8dc2766),L_(0x18090cc3), LL(0x14c00e4d,0x6924c12d),LL(0x7049ac09,0x4e4111e8),LL(0xdf09100c,0x2987ca68),L_(0xa8c45230),
+ LL(0x65fad089,0x01cff054),LL(0x821650cf,0x3002769e),LL(0xdb9e3912,0xe9ad46db),L_(0x1a05deca), LL(0x6e7044a0,0x34ab7ab5),LL(0xc61e42fb,0xfda4dfcf),LL(0x91982d5a,0x89e4ea03),L_(0x58b6c30e),
+ LL(0x132822ea,0x1ad76044),LL(0x50f3dcec,0x3e8a1d95),LL(0xb981b100,0x37f04df1),L_(0x4ca707b5), LL(0x0b17bd0a,0x0b34cd00),LL(0x93aa35e9,0x447278ac),LL(0x07bde57a,0x6e16122f),L_(0xc9b96d1e),
+ LL(0x3221832d,0x8fc6ce6c),LL(0xe4935439,0x65828539),LL(0x9cdf65d9,0x708e9258),L_(0x5929b880), LL(0x273611ed,0xef43a507),LL(0x9e4d7f82,0x86406043),LL(0x88f84624,0x4396769b),L_(0x09401931),
+ LL(0x25903256,0x6b8a2c7e),LL(0xe200a555,0x567e51fb),LL(0x06f1e0ff,0xdbcad515),L_(0x435d74d4), LL(0xe7fa9d16,0x627c717b),LL(0xd7c74d13,0x3efff1d7),LL(0xa592bf53,0xe58ce7d7),L_(0x0a6f5daa),
+ LL(0x6bc49db7,0x2993ad98),LL(0x11f1de05,0xcd8ed14b),LL(0x104437d1,0x419b6d76),L_(0xb80b6ad9), LL(0x5ceae532,0x2692fc9f),LL(0xfc4d4052,0x96208c11),LL(0x5f17f19b,0x34a83cc6),L_(0x7f3e627c),
+ LL(0x3d238cb2,0x6bb879b5),LL(0xb752157e,0xeaa5d8ca),LL(0x137d82f5,0x769e2a68),L_(0xca3db7bd), LL(0x0ddf279e,0x2ae26372),LL(0xf5d74ea6,0x79e90c0b),LL(0x27e773c7,0x3451edcf),L_(0xe4341440),
+ LL(0x65ddd79b,0x34988e35),LL(0x25d7df53,0xd93aac10),LL(0x814a0e96,0x76ec0b96),L_(0x74d8980e), LL(0xe6639b9b,0x9143cd9d),LL(0xa3c743dd,0xfb9b096b),LL(0x77b915d6,0x4353464a),L_(0x7fdf9660),
+ LL(0x103b0149,0x52d3720b),LL(0x668172a6,0x3c3a2d72),LL(0x0ddae18b,0x3543af35),L_(0x36c45c71), LL(0x90846158,0x51cb6d6c),LL(0xb970c6e8,0x5541df27),LL(0x9f0df2e6,0xa96cf0e6),L_(0xef118589),
+ LL(0x51a147b4,0xbd4c751a),LL(0x9547874d,0x5b132575),LL(0x81839452,0x9b0ddfdb),L_(0x24fa7687), LL(0x2e14f24d,0x54dad63a),LL(0x7d8859c9,0xd7c2228f),LL(0xdcbca7aa,0x77c13acc),L_(0x87a21fd3),
+ LL(0x4c326ed3,0xe3bb354a),LL(0x3fb8d397,0xa148004d),LL(0xb7008ce3,0x85367d7f),L_(0x177a646b), LL(0xe73d1a40,0x93d871ad),LL(0x4c9f1031,0x7768c968),LL(0xd9c87876,0xb38a617a),L_(0xd2b0142c),
+ LL(0xaf8f400e,0x2a94dc1a),LL(0x9b975861,0xf8d2e935),LL(0x370e4c06,0xca35bd61),L_(0xf7a243e9), LL(0x2c1682bd,0x00b6e1a8),LL(0x56f9e8d0,0x6d92e1f3),LL(0x9bb1736d,0x3e9b6293),L_(0xf048cf7d),
+},
+/* digit=19 base_pwr=2^133 */
+{
+ LL(0x6c35afbd,0xf6f30e96),LL(0xdab13683,0x669a8251),LL(0x4dd8bbbe,0xb9b1b311),L_(0xd57a4a34), LL(0xbbcbf46c,0xe4d59c99),LL(0x4923f91d,0x63242254),LL(0x877172dc,0x853f9c6a),L_(0xd7aca10a),
+ LL(0xd5de71ea,0xe7f42edd),LL(0xf74adcc0,0x0b9c53be),LL(0xc8c4ee60,0x82b1e37e),L_(0xbcd67b5f), LL(0x4a10fc2a,0x7502a8c1),LL(0xba4a9d44,0x2dc30076),LL(0xcd3e0527,0x2e0b7f76),L_(0xaeb6d158),
+ LL(0xc21b4aac,0x95f715ce),LL(0x5afa8860,0xff0073cc),LL(0xdb4528e5,0xdbc69fc1),L_(0xe9e0b780), LL(0x8bfc4102,0xe2c44c67),LL(0x74449572,0xa7624b30),LL(0x1b45072c,0xebf2704a),L_(0xae9e87a4),
+ LL(0x540d3efa,0xe3c8a7e4),LL(0xd1ad9579,0x39e285d6),LL(0xccac1ee5,0x8d098605),L_(0x02e00e9d), LL(0xaae2485d,0x424cb101),LL(0x57781fcb,0xd81ebf02),LL(0xe045acd6,0xec4b922d),L_(0xf679db8b),
+ LL(0xe3ace3b4,0xfb5f0701),LL(0x7920ba12,0x1534cde4),LL(0x25904a79,0xf9421b0d),L_(0xc0438d82), LL(0x0528f7cb,0x8a9c39d8),LL(0xb1c7fc33,0xdd383932),LL(0x458a7c5f,0xbaf06aaf),L_(0x2cd8a058),
+ LL(0x193b780c,0x5abd6eef),LL(0x6b220286,0xd76b78fc),LL(0x06442ef6,0x0cdf9e58),L_(0xe520f054), LL(0x8a5c2658,0xfae0a442),LL(0x0ae1c405,0x6c2b778b),LL(0xb5adbc98,0xf374d05a),L_(0x010faa2e),
+ LL(0x0c6f4ae3,0xb657d5f6),LL(0x56b561b2,0xabf1920f),LL(0x70a6775e,0x15909e3c),L_(0x7b91068f), LL(0xe0c73f44,0x563843f3),LL(0xe4066970,0xe15912cf),LL(0x2e80308d,0xd16c8835),L_(0x3121c5b3),
+ LL(0xb00d284a,0x96ae8e24),LL(0x8746c0ee,0x118cc562),LL(0x4ed443bf,0x9157acc3),L_(0x898cd623), LL(0x14b54c13,0x07d6ccc1),LL(0xc5299940,0x05ec4684),LL(0xf50f2de3,0x1a923061),L_(0x8aaedd52),
+ LL(0xc692cc03,0xbe07dcf7),LL(0xa61a9062,0x5f04bf17),LL(0x0d99300c,0xa062deba),L_(0xcb7f082f), LL(0xa3451ea6,0x02666d4c),LL(0xd4b6a94d,0x2fc9077f),LL(0x564f33fe,0xa2bd47b9),L_(0x4614aa04),
+ LL(0x6da6ee28,0xdab5f17d),LL(0x2dfb0cbf,0x36f25faf),LL(0x16a32d1e,0xbe5fdc6d),L_(0x48f97f60), LL(0xd0d79fc9,0x0ee979a6),LL(0xfb77bc6d,0xc670e326),LL(0x6435ef83,0x55425ae2),L_(0x32e4cd8a),
+ LL(0xcf395e17,0xd8954092),LL(0x1415743a,0x516938e6),LL(0xc57f3db0,0xe85d4e50),L_(0x71f22b3c), LL(0x611ea790,0xfafbe19a),LL(0xdbd2d4ed,0xe5ff8f06),LL(0xe41d9e6e,0x9e9c0da2),L_(0xb15426d4),
+ LL(0x86e3cdb6,0x8cb41178),LL(0x0f8b5836,0x5615e2b5),LL(0x74d58d7a,0x4e6b82ce),L_(0x3030ebba), LL(0xd4c6f918,0x374bbfd9),LL(0xcfea53e3,0x15aadf45),LL(0x363a6cec,0x30dd6649),L_(0xf3c95a58),
+ LL(0xe43c3adf,0x120bb9ae),LL(0x98ad19ec,0x73ef55fc),LL(0xbe8a8508,0xbb18ab2b),L_(0x1cda9cb5), LL(0x84facee2,0xb277aa2c),LL(0x29318829,0x742a25ca),LL(0x1cc06cae,0xd0d24d20),L_(0x3eca1b2b),
+ LL(0x0714ac72,0x2ffe0519),LL(0x522d36e5,0x843d58c8),LL(0x7eddcb6d,0x1e60abe4),L_(0xc55d6e85), LL(0xb10fd185,0xccf9c609),LL(0x5c6153bd,0xa0d4b626),LL(0xe398ed34,0x7b6aa811),L_(0xb4dde424),
+ LL(0xa960c0c3,0x735c5d62),LL(0x8c6a5476,0x0f8b2a35),LL(0x54dfa089,0x0b186f7a),L_(0x6ab8d48a), LL(0x3e7eb8a2,0xc1614c55),LL(0x7aebdcff,0x8c7e1e1c),LL(0x390e7c1c,0xf9b0b2f9),L_(0x869d2266),
+ LL(0x11277d6a,0xd9cc122b),LL(0xb86417ff,0x3f2ab21c),LL(0x2cbd87e4,0x494cfb1e),L_(0x991ddd86), LL(0xae7bbb90,0x9977c3ac),LL(0xc3e66760,0x397ea438),LL(0xb224446c,0x7ed9dec7),L_(0x2a81eaf1),
+ LL(0xc59accd2,0xb5432f0f),LL(0xf2593b02,0x8b88a936),LL(0xc5589b93,0x02d9f9ac),L_(0xc3eb3094), LL(0x8302d1bc,0x43908c95),LL(0x08ef4088,0xb05f1091),LL(0x83349c39,0x5061c674),L_(0xff815654),
+ LL(0xf0350dc9,0x9371eb01),LL(0x45527229,0xce86a9ba),LL(0x47861a0c,0x9aad7247),L_(0x098cb788), LL(0xa559d5e9,0x979093ec),LL(0xbbd1def2,0x0fe17efb),LL(0xb512322d,0xae7b8c8e),L_(0xe9bbc66c),
+ LL(0x3ad82961,0x9f1ec261),LL(0xfe0fcc30,0x77a36e95),LL(0x3914c9d2,0x9b1a4daf),L_(0x09933bfc), LL(0xec701059,0xcfa77625),LL(0xea8985c9,0xe60b3f29),LL(0x0c5b4abf,0x138b4b1c),L_(0xdc77bb16),
+ LL(0x174442e6,0x1802aa28),LL(0xd075865e,0x26f71e88),LL(0x4a4c5681,0x7ae33021),L_(0x5a2cabc9), LL(0x5d0cad44,0x2893d185),LL(0x55811da2,0x7e9947d1),LL(0xc9f7bf57,0xf2c79dea),L_(0x8ef92a2a),
+ LL(0x3a838f3b,0xfbe1be02),LL(0x57b6d887,0x229d491d),LL(0x207a3044,0x9f62e957),L_(0x9f828177), LL(0x2e1d3c54,0x86b7e5aa),LL(0xf3280135,0x3fbda02e),LL(0x7c96f0d5,0xbda44f9b),L_(0x2f723070),
+ LL(0xf1aeae6a,0xae77f574),LL(0x7664fba7,0x0423c396),LL(0xf1f4d153,0x47451433),L_(0x91ff938d), LL(0x3a807b63,0xe8e961f8),LL(0x748646da,0xd89c3d2a),LL(0x467e86a7,0x6ac80359),L_(0x32bf2f50),
+ LL(0xb36ecce7,0x3b7324a4),LL(0x156202b0,0xbb9babf8),LL(0x98c1904a,0xf1e380ce),L_(0x46867bcd), LL(0x01b08225,0x2eeb6052),LL(0x1eab01ca,0xd0d4fef8),LL(0x19322045,0x256a539e),L_(0xfc3623ca),
+ LL(0xc94659b1,0x2f0568f5),LL(0x16a9b3fa,0xed8a79a8),LL(0x50d8c266,0x757c7d99),L_(0x2300fd6a), LL(0x66c509e5,0xb792533a),LL(0xb5184b40,0x9e0c5aac),LL(0x34caeea9,0xe5b193ca),L_(0xbbba3e14),
+ LL(0x195602fc,0x701a9997),LL(0xf834de05,0x3992cbc9),LL(0xe1e8b8e7,0x8ec536e5),L_(0x7e773653), LL(0x29c79b3a,0x29bff6f9),LL(0x17984cef,0x596ff95f),LL(0x0a0ae347,0x661b4a6c),L_(0xb2e9719f),
+ LL(0x8e767a04,0x473ec4b4),LL(0x4c2d676e,0xeb4d7d16),LL(0x98a8ebb4,0xc4e28600),L_(0x2f68f9cd), LL(0x6beb5ab8,0x1ef6cbd4),LL(0x85cd9d62,0x83dde9de),LL(0x1762ff65,0x9ddef882),L_(0xeb7899f5),
+ LL(0xe6f97e53,0x2cfac1c4),LL(0xf67b6c86,0x94800529),LL(0x61546993,0xcee96715),L_(0xf2a9560b), LL(0xdc612b8b,0x01036872),LL(0x88524fe9,0x9e6d56f4),LL(0x0543bf02,0x40b8eb7d),L_(0xb87c4dba),
+ LL(0xbb67b974,0xd7ceddb4),LL(0x1d6817da,0x7bd3859f),LL(0xe95a7ea2,0xc85424d7),L_(0x55d605cd), LL(0x5d21362b,0x2591a7e7),LL(0x4aa1f58c,0x52817220),LL(0xc9d8453d,0xa286acd4),L_(0x3bd2f891),
+ LL(0xaf830116,0x6e587151),LL(0x8a5ecfca,0x3d8da1ef),LL(0x7afbb075,0xf8e3bab4),L_(0x80131b4d), LL(0x3ab8344d,0x6bb840b0),LL(0x9e591ccd,0xae7bd8be),LL(0x73177038,0xed8b2ca2),L_(0x15e01308),
+ LL(0xadd91144,0x680d82d3),LL(0xd982abff,0x88f503dd),LL(0x37393204,0x746b676f),L_(0xaf201907), LL(0xaf979504,0x5a9be716),LL(0x4001d634,0x0e682183),LL(0x609ab748,0xfe8299c8),L_(0x39a6e2fd),
+ LL(0x193fd321,0x8682c4c0),LL(0xc2a26123,0xd566872d),LL(0x1407f3c3,0x16439d5d),L_(0x3caca395), LL(0xd6726482,0xb7bc2fb3),LL(0x5cdf7fec,0xb4c2b53d),LL(0xfeaaece6,0x4349edc0),L_(0x53d16a46),
+ LL(0xae9bd278,0x6c678048),LL(0xa706ff5d,0x52da3781),LL(0xae4a71b1,0x1e1cd89e),L_(0x9b61b4af), LL(0x2f691fc7,0xf69884c3),LL(0x4d64cf90,0x19020a41),LL(0xdda1c483,0x77d02be4),L_(0xb0f86443),
+ LL(0x8529164d,0x5d80aafd),LL(0x4f432d73,0x1e830c7c),LL(0xa9f0f09e,0xfc3140e2),L_(0x815acd77), LL(0xdc2ab04b,0x59befe02),LL(0xf1e93bd2,0xa44595d5),LL(0xc1e15529,0xf19abe7c),L_(0xaeca237e),
+ LL(0xa12bccee,0xb9b8ec3a),LL(0xf2dadd08,0xad1e4dce),LL(0xb63e0921,0xfcf65288),L_(0xc5a2a0be), LL(0x863fe95b,0x5cd2ee3e),LL(0x4eb4db06,0x60da7b42),LL(0xb8a5bd09,0xc426f7df),L_(0xf3f19cce),
+ LL(0x6e5213a2,0xfd69d7c4),LL(0x31496bf2,0xd30cf23b),LL(0x37d44e1e,0x7097147f),L_(0xae15b228), LL(0x12d98f15,0x32dad5dc),LL(0xa8f63aff,0xdfe1a802),LL(0xc8d86798,0xeccd5411),L_(0xcde1acb9),
+ LL(0x74006fc7,0xd7d803d8),LL(0x4af70159,0xec84dc01),LL(0xae309a70,0xa34e0e32),L_(0x585516f0), LL(0x235ed632,0xcfee558c),LL(0xcab23f91,0xcd97224e),LL(0x1640e7f8,0x92280213),L_(0xbd508662),
+ LL(0xc7ccf41a,0xd687e53b),LL(0x854bd98e,0x9a24176d),LL(0x01470242,0x01aae44b),L_(0xaca3a958), LL(0x9fcc8bad,0xc772707a),LL(0x1ce44586,0xeeb32998),LL(0x1fd556e7,0x6b1da8b4),L_(0x0ed6e63a),
+ LL(0x3fe0c228,0x929fe46b),LL(0x01aa7a0a,0x55829b86),LL(0xb0593728,0x46968b3a),L_(0xef6bc08e), LL(0x861c28fb,0x49238b1c),LL(0xbb911c6f,0xe2c2f08e),LL(0xc3669826,0xd635b05a),L_(0x67f9c7c0),
+ LL(0x1cbd7072,0xac172491),LL(0xa75f68ed,0x70337bd5),LL(0x5806f542,0xba62de08),L_(0xf48e9477), LL(0xc789f89a,0x778e6f6e),LL(0xca466063,0x7cb61f89),LL(0x9e11ca0e,0x54802afa),L_(0x00753b33),
+ LL(0xa293c1d0,0x98d81eae),LL(0xf1d86049,0x4a05fd64),LL(0xf7776c88,0x31edd830),L_(0x4b09f540), LL(0x6b003742,0x530442c5),LL(0xd29f0459,0x2717506e),LL(0x993316f5,0x977de534),L_(0x8efd4242),
+ LL(0x1f4b647c,0x63a5f62f),LL(0x1b839fad,0x184bd1bf),LL(0x9eb8bb02,0xd878238c),L_(0x8ce0fbd0), LL(0xee715bb5,0x0c09795f),LL(0x7e0f0890,0x4a0ef110),LL(0x5e80a1d2,0xa6ed70be),L_(0xdd973aaa),
+ LL(0x02e27464,0x66b5fa13),LL(0x8d608579,0xf1afa0fe),LL(0x262f06e4,0x55328bec),L_(0xe5f137a6), LL(0x359db889,0x56654a88),LL(0xd39b145c,0x31866e5f),LL(0xe08705c4,0x615a5b05),L_(0xe8573a34),
+ LL(0xd9bae78a,0xa18e5f26),LL(0xbcdd1733,0xfb66461e),LL(0x52d89638,0xf79de1ee),L_(0xd8be4f6d), LL(0x63f080c5,0xf0c1209c),LL(0x4e984349,0x8927edaa),LL(0x1cca87fa,0x0d7779de),L_(0xc4be69f3),
+ LL(0x4ffe196d,0x591b255f),LL(0xf9220e24,0xf529da70),LL(0xa919472f,0xc172114d),L_(0x12b84dab), LL(0x727df75e,0x0b0bba01),LL(0xc90f5813,0x18ae3fac),LL(0x7de531b5,0x60f6010b),L_(0xb124c090),
+ LL(0xc8ab7f3a,0x4d9c100a),LL(0x3147c457,0xb3ed07de),LL(0x2ce9d1a7,0xf4f877cc),L_(0x11395ce0), LL(0xe5d2ab31,0x7ebabf38),LL(0x7ffb38b5,0xce3cfa6e),LL(0x85ffa6d1,0xfa3306d0),L_(0x40ce1960),
+ LL(0x014e69fb,0xe40ec6e7),LL(0x92b1fc6d,0x8f04f43e),LL(0xf3db5670,0xb9883ee7),L_(0x01e865eb), LL(0xeab3fc5e,0xedf8720a),LL(0x639d496f,0xf1d8e66c),LL(0x32cbb568,0xc1af6691),L_(0x0ce5c8b4),
+ LL(0xb78b642b,0x65a42ec3),LL(0xade40c55,0xdde23958),LL(0x216642c3,0xcdc7c4de),L_(0x6aa44ccd), LL(0x82ee3789,0xec771036),LL(0x1fafeef8,0xefdcbefc),LL(0xe82b1033,0x5b9fd0f1),L_(0xb5931c71),
+ LL(0xd7c8b169,0x94661f99),LL(0x88be16da,0x968a0513),LL(0x5e1f223f,0xf2936613),L_(0x7a916253), LL(0xf109d748,0x8c1958b8),LL(0xca3eb1cf,0xd1baaa06),LL(0x58b0e5bd,0x04265560),L_(0x6b971198),
+ LL(0x3c1c78f3,0x73aa994d),LL(0x7b9ba5eb,0x9d13c878),LL(0x5ffbf962,0x329365bf),L_(0xfc14c225), LL(0x151d1b5c,0x9b162681),LL(0x8b322eba,0x67d4adbd),LL(0x2d7119cb,0x112111da),L_(0x14cee07e),
+ LL(0x8de63a53,0x0bc054e9),LL(0x090ebf32,0xac3474f8),LL(0xd39c2e22,0x8a24d244),L_(0xc5c07687), LL(0x72de574a,0xf7cd28ca),LL(0x00f6286c,0xaba378ca),LL(0xacf3d959,0xc4c178a4),L_(0x1e3ce962),
+ LL(0x4c196a72,0xeddb3096),LL(0x4807ba1c,0x78d05007),LL(0x4a5cea44,0x4e82cf55),L_(0xbefd7586), LL(0xbc157856,0x42628bb0),LL(0x4d8a1ece,0x3bec9a03),LL(0x414298ee,0x71c76fb4),L_(0x1b7c9c7e),
+ LL(0x451c89a9,0x0eb5ca81),LL(0xdfcc6c7e,0x85231811),LL(0xdd102f79,0xcfe70175),L_(0xd23927f1), LL(0x74f56210,0xa68f72ba),LL(0x0c268cfa,0x107305c7),LL(0xa0b90dac,0x71b34217),L_(0x86344588),
+ LL(0xdf55e61f,0x74013fe7),LL(0x0ad28f61,0x384b1c58),LL(0x117f4d5d,0xb417f0cc),L_(0x2ee194ab), LL(0xa5e101d2,0x6a59354e),LL(0xe4650ef7,0xdd613a28),LL(0x3d053f50,0x49698601),L_(0x211980e7),
+ LL(0xbc28da29,0x350510df),LL(0x729451ca,0xa5492aa2),LL(0x488b3ebb,0x7335580b),L_(0xf1e1f254), LL(0x150fa7dc,0x5080e530),LL(0x021a9cf2,0x41fe0adc),LL(0x151c555b,0xefba1701),L_(0x1be676fd),
+ LL(0xda6ab8ee,0x01c286ca),LL(0xd11e769f,0x8f870f9f),LL(0x67983e93,0x011517ba),L_(0xb19fd8df), LL(0x2ffdf94a,0xb8ff2b68),LL(0x1becdb97,0x57a7f08b),LL(0x2df51505,0x7f4a552d),L_(0x2e44b40c),
+ LL(0x8a38d901,0x15f78485),LL(0x94822c36,0x40936fbc),LL(0xdc403083,0x26d9bf80),L_(0x3f811b6c), LL(0x6682494b,0x658eecc3),LL(0x1088923f,0xe2c9cc47),LL(0xf4a7dc3b,0x6742c074),L_(0x7820af17),
+ LL(0xaf6f6f62,0x1be73cf3),LL(0x0c32e84f,0x74ffb428),LL(0xb29ede9a,0x92e686e4),L_(0xa74c4c0a), LL(0xdfa5e890,0xe1001a22),LL(0xa64183c0,0xf029cdcb),LL(0x55c88ddd,0xd03747ad),L_(0x5bbce6dc),
+ LL(0x69bc7a5c,0x0a7f469b),LL(0x3d28b7fa,0x8cb61ff4),LL(0x860090cf,0x25e6acf5),L_(0x3ca61e58), LL(0x7c9a5e59,0xd04ea633),LL(0xbdcdff22,0x3dccdf34),LL(0x679b9a9c,0xe0d5601a),L_(0xa518db92),
+ LL(0x75393ffb,0x503ff7fc),LL(0x29c7bd8b,0xad84a980),LL(0x6a8d3ebd,0xb711116c),L_(0x6093e9c1), LL(0x508cd2db,0x298e39d1),LL(0x88ffc5c3,0xd182ffce),LL(0xf35bcd9e,0x56f60d5a),L_(0x24c2d62a),
+ LL(0xbb37476d,0x126c6b62),LL(0x1974758e,0x12e961ad),LL(0xc23fa1b7,0x620a85d2),L_(0xe713a9df), LL(0x18d50f3d,0x90b6bf4d),LL(0xd31ffadf,0xcce6cb43),LL(0xb9db57be,0x43232f2b),L_(0xee956b0f),
+ LL(0x33f18557,0x34242913),LL(0xae8e0c9c,0xecfa2ca9),LL(0xe5298223,0x54c9b89f),L_(0x81ae98bb), LL(0x2bb85e08,0x3640c336),LL(0x187eb8dd,0x23f72dcc),LL(0xe33bfd7f,0x1138d09f),L_(0xa5c71157),
+ LL(0x9635cec5,0x99decb38),LL(0x120fcaaa,0xb6e94853),LL(0xc90493fd,0xe03d588e),L_(0xdacd4c22), LL(0xbbcd5ead,0x1a5efdc4),LL(0xa034c92d,0xbd3e5f34),LL(0xc0bbee30,0x91354a2e),L_(0x83ce5653),
+ LL(0xe4fe7dd6,0x40ccc046),LL(0x12391a03,0xef734198),LL(0xe37fbe0f,0xd7d730ce),L_(0xb901d8d1), LL(0xe81b74b5,0xccbbf03c),LL(0xbd70b08b,0xaf1eca00),LL(0xb202f7d1,0x6c3a5371),L_(0x3e4aeff1),
+ LL(0x3c293b50,0x50ebe82c),LL(0x841f67d5,0xe5c199da),LL(0x9c0164e0,0x09ae68d1),L_(0x48a6a776), LL(0xe57a6b35,0x764aa682),LL(0x4cc646a6,0xd2b124d2),LL(0xc37e19f6,0x0684de69),L_(0x244cccbe),
+},
+/* digit=20 base_pwr=2^140 */
+{
+ LL(0x3a2fc0af,0x3a0ae219),LL(0xaf66dcd1,0x71d39324),LL(0xeb53d991,0x1b364d9f),L_(0xd1a4ab2f), LL(0xe634fa4c,0xfa979c3b),LL(0x0ae7194f,0x0315e213),LL(0x7a46c430,0x7d3dfc00),L_(0x3dda16de),
+ LL(0x69c6dab5,0xcad74055),LL(0xb4650e32,0x5f980b30),LL(0xf457bc61,0x08ab6cd4),L_(0x08a5060d), LL(0x5a3b5bba,0x4a0eec60),LL(0xc2d75bdb,0xa4e2c616),LL(0xeb13a610,0xea8ba726),L_(0x5b8d1d6b),
+ LL(0x8208d95c,0x1d126957),LL(0x852ba024,0x38314570),LL(0x2b3db8bc,0x68f43b86),L_(0x4e0c61da), LL(0x2fa1baa8,0xb3650b8b),LL(0x81c43c97,0x222d46b4),LL(0x5ab609c3,0xe25b7f78),L_(0xf9adc44c),
+ LL(0x2601c0c3,0x10c7e593),LL(0xa7b8c442,0xd433020b),LL(0x163a4b4f,0x6ea15982),L_(0x0f63c4b6), LL(0x559abf4c,0x168cc6db),LL(0x63fa3ddc,0x5e92d42d),LL(0xcad8eab0,0x0f718cd3),L_(0x285e6621),
+ LL(0x1eccb2de,0x45eee5ae),LL(0xbeed1a3a,0xf0f806c2),LL(0x93a2e216,0x0b896b9f),L_(0xaddd1455), LL(0x21ac6aa7,0xe860a374),LL(0xbb52f5cc,0xa6d03d5e),LL(0xc336e305,0x5a3ad08c),L_(0xd8ac8cf1),
+ LL(0x7e65ba98,0x927ff44f),LL(0x6eb2af1f,0xcfc2ebd3),LL(0x8e5841d8,0xcd919ed2),L_(0xfaf6b44a), LL(0xd72479fb,0xf9079703),LL(0x31c04f62,0x11b2590d),LL(0x12b5f89b,0x9e78739c),L_(0x829845bb),
+ LL(0x6497199a,0xcc5dc1ba),LL(0xc6068072,0xc7f1ee3e),LL(0xbbfeebe2,0xa475b47a),L_(0x497220e3), LL(0xd00f3343,0xaa2739d6),LL(0x7a34054f,0x6bcba57f),LL(0x08421638,0xf50c5c89),L_(0x5194e599),
+ LL(0x56ea720f,0xc14eb574),LL(0xd278e415,0xe5e93b7f),LL(0x1a141ce9,0xf206da59),L_(0xde031e92), LL(0xff6ca107,0x85cacb30),LL(0x27ecddf0,0xe54c35f6),LL(0x73777848,0xeecb8a06),L_(0xbffbbc51),
+ LL(0x27c35c5b,0x88bff7c0),LL(0xfa52e107,0x2aa31cbc),LL(0x84083f2a,0xee8007b7),L_(0xd8f67690), LL(0x7c2ce5dc,0x46d1faf9),LL(0x5603d9f9,0x0d96af5f),LL(0x7894ccc6,0x143733e6),L_(0x28c9191f),
+ LL(0xf8d1a77a,0x74b4b8c0),LL(0x4ced8b77,0xaa226357),LL(0x0f677dc4,0xbce88332),L_(0xc71a3df5), LL(0xa1eff8f9,0x6f4d4505),LL(0xf4ee4e98,0x37fa6b4f),LL(0x12414006,0x078af83c),L_(0x51f9c8c5),
+ LL(0x6038786b,0x043fa7bc),LL(0x495de129,0x39594053),LL(0xeeffb86e,0xf30130d5),L_(0x5566ee1e), LL(0x8e9bddbc,0x6b822690),LL(0x38bca4e0,0xfd18acdc),LL(0xf63c9ead,0xa29c50ef),L_(0x6ca8c69e),
+ LL(0x875129d9,0x23706eff),LL(0xbd7972c9,0x343d01b3),LL(0x0f0278ce,0xd1d2ff3f),L_(0x859707ee), LL(0x62e80eee,0x76f993b1),LL(0x46b5aa17,0xd8eb588f),LL(0xc6cb2916,0x3e93bfcf),L_(0x6b823d1c),
+ LL(0x40dc4150,0x02fc59aa),LL(0xa4e36005,0xf4b7afee),LL(0x2f863790,0xdf1eb2ce),L_(0xdcdc305f), LL(0xc2be20ae,0x05119c9a),LL(0xb011c039,0xa27da69c),LL(0x59ba9dd2,0x50be3370),L_(0xd25c56ab),
+ LL(0xe5b817ad,0x62b0b4a9),LL(0xe35b330d,0x0b744a17),LL(0x49eb11c0,0xdb8066e2),L_(0x8fd0b5d0), LL(0x60bc3f3c,0x9db8094e),LL(0x0164c3cb,0x1a336970),LL(0xe5728d57,0x98764bb8),L_(0x9ecea57f),
+ LL(0x471336b1,0xc97e0c25),LL(0x84d2cb69,0x40016340),LL(0xd00385b4,0x8681b939),L_(0x5ce0fa5b), LL(0xfb0504e7,0x190db5e8),LL(0xec267c2d,0x73d7879b),LL(0x5e7d8612,0x8f037a48),L_(0x0c242e37),
+ LL(0xb920e08a,0x81a11e46),LL(0xab88a28a,0xad7ce91b),LL(0xd873ff38,0x463f5eef),L_(0xb449cd10), LL(0xa997a44b,0x67e4b48b),LL(0x65bf00de,0x76b8b69f),LL(0xc007a35a,0x0ebb0cc7),L_(0x168c4cb8),
+ LL(0xc6331e3e,0xd49fdc60),LL(0x08277aa2,0x3f1c848b),LL(0xae53c6d2,0xa68e50ed),L_(0xf9940a04), LL(0xa6271229,0x1c7298ae),LL(0xc7e75832,0x34a3a581),LL(0x6666c91c,0x1bb3ce87),L_(0x9b5e6600),
+ LL(0xabcce7ac,0xfa1beb7d),LL(0xc3326260,0x9cab965d),LL(0x7c86ce27,0x145e311e),L_(0x1c036012), LL(0x3f4563cb,0xbd40ee7b),LL(0x7397bad6,0x077a6fa1),LL(0x6ab23a8b,0xdc9e2258),L_(0x524c8593),
+ LL(0x27ccdc45,0x8d1e93bc),LL(0x8122aeec,0xac370974),LL(0xf5fc7d6a,0xbb95cf97),L_(0x1eb1cdc1), LL(0x65e7b71f,0x0d3d8936),LL(0xa618f61f,0x6cfc89cc),LL(0xcfd74f9d,0x46c8cccc),L_(0xc39ab4da),
+ LL(0x82c35cad,0x4b6e4cd2),LL(0xb8deb535,0x5bf959ed),LL(0x77b74152,0x14153467),L_(0x1a6510e5), LL(0xc645fe15,0x44ed7180),LL(0xd0e5fe61,0xb00a2c9e),LL(0x94c68e2e,0xcd40eadd),L_(0x54367d74),
+ LL(0xdb397bc6,0x0bb14c2d),LL(0x90f3c232,0x2727c32a),LL(0xbdde6547,0xf5120538),L_(0x6f363a14), LL(0xca65a20d,0xb71dac7a),LL(0x0119f615,0x7b4ac903),LL(0xf1e5f556,0x83bcccf1),L_(0x78b79fc1),
+ LL(0x35177eb9,0xb2a6346d),LL(0xba547ec6,0xcdb1c427),LL(0xc5c607ff,0xf6acdcca),L_(0x272a5f1e), LL(0xf198276f,0x5ddfa215),LL(0x187de1bb,0xc1a3402a),LL(0xc070af80,0x0cf324a8),L_(0x8fba9bd5),
+ LL(0x4be4c6c1,0xddf4319c),LL(0x90adc217,0xcc96208a),LL(0xd1d87cd0,0xc3e2cfee),L_(0x76bd76ab), LL(0x1fa3dfb2,0x89c310af),LL(0x72ee71cc,0xab955eb2),LL(0x1e3849a6,0x4e9da2a4),L_(0x49c4cd74),
+ LL(0x4a409b87,0x4a32be16),LL(0x591f45c9,0x5593d29c),LL(0x1f66b255,0xa18a71de),L_(0xa8df9f2a), LL(0x871121b9,0xd5a52a49),LL(0x0518891a,0xdb77ca39),LL(0x35178007,0xe87f7b56),L_(0x236d66c4),
+ LL(0x7b11bf26,0x78cced92),LL(0x100d41cd,0x568cf974),LL(0x1aebc2f4,0x90437303),L_(0x4f4abe7b), LL(0xe1d4cf61,0x81708f04),LL(0x6b6039fa,0xfcd5e395),LL(0xe8e310f1,0x67164e9b),L_(0xc7f1e7ae),
+ LL(0x4435eb40,0x309bf5d1),LL(0x2117b17c,0xfa094c38),LL(0x0f0f519b,0xa7712b6a),L_(0xa339b91c), LL(0x13b443e9,0x3fc80f73),LL(0x5eca3c74,0xc2640658),LL(0x6f1b036b,0xcc979824),L_(0xf9c46f37),
+ LL(0x2c10fe83,0xfd4280b4),LL(0x61dfd82b,0x0f01bc50),LL(0x8ebbdd0a,0xe8a94761),L_(0xea097594), LL(0x3331db36,0xe9e32c12),LL(0xe3fdca90,0xdfdd390f),LL(0x7d9acfa0,0xf46a833d),L_(0x0a373092),
+ LL(0xb1f7d641,0x50d5c66d),LL(0xc56a23dd,0xd311bbb7),LL(0x2df06964,0x4d4065dd),L_(0xb24fc29d), LL(0xc5f2e7e8,0xa84be5a0),LL(0xee36de4b,0x704fb714),LL(0x72ab97c4,0xe211a72c),L_(0x4e457419),
+ LL(0x22e459d1,0x262ef282),LL(0x57520b17,0xcdae125f),LL(0x400cd2e5,0xc83f210b),L_(0x219146d8), LL(0xb3e5fe6d,0x87c8591a),LL(0x2cdbe07a,0x83fd93d1),LL(0x072fa5b0,0x7d701f58),L_(0xe67d391b),
+ LL(0x2dda42fc,0xa6490705),LL(0xbae6af5f,0x5e3ec835),LL(0x974661b3,0x77bc552c),L_(0x51a8bdf3), LL(0xf43d8648,0x351407f7),LL(0xfaacee32,0x93522ec0),LL(0x2effc179,0x49a92d02),L_(0x35e7a36b),
+ LL(0x1178f9fe,0x88ddd25b),LL(0x29a04cd6,0x4985102d),LL(0x0d3de452,0xf0277afe),L_(0x52955ade), LL(0xf3571745,0x53a80f8c),LL(0xcd0ea6e7,0xa11d84cc),LL(0x8cf3c9a4,0x7920692b),L_(0x66ad31de),
+ LL(0x3259f508,0x8dd2cea1),LL(0x147b087a,0xb1de59c3),LL(0x964e43aa,0xd9cd158a),L_(0xe62a2c56), LL(0xf7812a2a,0x483a8ca3),LL(0x133f5131,0xf93b681f),LL(0xeafa2982,0x22d0852e),L_(0x47016331),
+ LL(0x4e3898e8,0x178b364e),LL(0xdedbf0d6,0x1e46cbf2),LL(0x07005a6a,0x017cc249),L_(0x3350187e), LL(0xe3d63871,0x9df8269b),LL(0xa447b67a,0xf32797a4),LL(0x1360de40,0x70a39a32),L_(0xe07cb8f9),
+ LL(0x58005eff,0xefaea42e),LL(0x83a181cc,0xcdf53ee0),LL(0x8d9f77b8,0x2be3de21),L_(0x199ee148), LL(0x219fc4d7,0xdfbb4054),LL(0x5fd887bc,0x370b0057),LL(0x0df48ecb,0x67c50061),L_(0xceadf6f4),
+ LL(0x7d760757,0x3cb96c10),LL(0x8354395a,0x87378266),LL(0xc87eb4e6,0xbb1b1686),L_(0x2ca2a9d8), LL(0xf625cc5e,0x7f6f6bfb),LL(0x375d90fd,0xd1702bfc),LL(0xd7459a05,0xb5757892),L_(0x8e648246),
+ LL(0x2285b7c6,0x77777ad0),LL(0x98514815,0x2a9f4626),LL(0xa5cb03f7,0xbdaaa412),L_(0xf84efd29), LL(0x6fb99eec,0x8aa2c4b5),LL(0x9cd6f177,0xec729246),LL(0x9b9f8d87,0x995887b7),L_(0x2944bcdb),
+ LL(0x786ccb7d,0xae2ffd66),LL(0x8f43b748,0xb566147f),LL(0x0b294654,0x42cc5e69),L_(0x8eb5ab4c), LL(0x1634f1db,0x21f0caa7),LL(0x3cc24e4e,0x80410ce5),LL(0x6597b349,0xb9e50c3a),L_(0x390fd5fc),
+ LL(0xbefea27f,0xca541338),LL(0x25552e16,0x0bc9bd26),LL(0xd300e1fc,0xed2c5b84),L_(0x2e61d461), LL(0x731c6b5e,0x10fed3e2),LL(0x3f6fedc9,0x6d0357ab),LL(0x30c7c4b6,0xfdf04b77),L_(0x6ca06d8d),
+ LL(0x6198d0c0,0x49f0ac87),LL(0x355910d8,0x5908bfa5),LL(0x2b72f231,0x1e0626b8),L_(0xcd397171), LL(0xb70c5fde,0xaffd0d74),LL(0x4feccf28,0x30464156),LL(0xbe7c0da7,0xf7d2ffb9),L_(0x782a9bb8),
+ LL(0xd71029f7,0x2ac8267b),LL(0x58c7cc85,0x4f8afc3b),LL(0x2d787218,0x10f9a786),L_(0x005ab707), LL(0xf19c8b55,0x5209c3c7),LL(0xa8e944c7,0x0212109d),LL(0x4e16a382,0x3cd77b54),L_(0x4ca72d58),
+ LL(0x4e89b492,0x77501651),LL(0x30cb8e0d,0xdbb5243c),LL(0xd24a6908,0xc09c5df1),L_(0x10b46bf0), LL(0xeb16d02e,0xb28822ac),LL(0x790e9a17,0xbf46b5ba),LL(0xde8a18e1,0x47566077),L_(0xd3c60b3c),
+ LL(0xa4a4f17a,0xdff0cf1f),LL(0x0aef91c0,0x34f0c71a),LL(0x3fe5a3b7,0xae1fff30),L_(0xf6c8d6d5), LL(0x95b01983,0x5317a578),LL(0x10e5c9f2,0x8872e118),LL(0x154f511a,0x28ad7f46),L_(0x1f7f1f26),
+ LL(0x3c4162c4,0x88636424),LL(0xf620131a,0x69f32e24),LL(0xf3a9fd92,0x049b5c0f),L_(0x6242ff79), LL(0xd8613d4e,0xcf94b297),LL(0x0250d486,0xf99f0a15),LL(0xf6d69ab3,0x8d722881),L_(0x726c3c6f),
+ LL(0x2829f721,0xc6f3cc19),LL(0xf0ba6d0a,0xf0c5f76a),LL(0x0d44b294,0xda7df6fd),L_(0x98458d66), LL(0x35516899,0x4c9c487f),LL(0x541b8cf7,0x312edd80),LL(0x14a64ecf,0x2db649b2),L_(0xfcc41f23),
+ LL(0x4e65d481,0x17bb4dfc),LL(0xd8c4ee32,0x7b8827b1),LL(0x6ffab99a,0x788afe5d),L_(0xb6cc5390), LL(0x6ed82d81,0x75adf2d6),LL(0x91030ac7,0x99ce22b0),LL(0x957976c9,0xf8f37372),L_(0xeae6d45f),
+ LL(0x3ad3db42,0xa4617ca1),LL(0x9ea768ee,0x8f228cec),LL(0xc881f9da,0x86ddd01a),L_(0xddfb0090), LL(0xd1467d75,0x41eb80aa),LL(0x1320c7b6,0x875ce5dd),LL(0xaf17e700,0x398d4c2f),L_(0x91ca1818),
+ LL(0x165575ce,0x7c2f636f),LL(0x94407a75,0x89f1290d),LL(0xeeb00b1e,0x2cccc148),L_(0xc1a654f8), LL(0x7200e28d,0x5409cce2),LL(0xd579aa30,0xf8e920e0),LL(0x3586fdc4,0x11976312),L_(0xd9b1a394),
+ LL(0x45934ad1,0xa0a5bb1b),LL(0xba2becd7,0xbcff29b1),LL(0x9f749e30,0x2f73a7d6),L_(0x54ae60bd), LL(0x9ed5bbc9,0x111b6548),LL(0xae179cab,0x7b77f3f8),LL(0x9b568171,0xf1563350),L_(0xd57cc18c),
+ LL(0xbde3fb89,0xaa153efc),LL(0xe84063ac,0xf24dc768),LL(0x91718221,0x3207691f),L_(0x666ced3f), LL(0xa962b884,0x8a1416f3),LL(0x81f644db,0x2992be1f),LL(0x388328fb,0xa7c4a359),L_(0xebba06d7),
+ LL(0x709d7f63,0xf678058c),LL(0x9bd30551,0x9db19686),LL(0x8d882bae,0x81afb521),L_(0x6d103aa5), LL(0xce4ef2a5,0xc6ecf132),LL(0x681bea3a,0xab9bbd78),LL(0x3831d678,0x4c11a697),L_(0xb9d4a72d),
+ LL(0x8a72049d,0xc3e5138e),LL(0xa25affde,0x9235657e),LL(0xf870194a,0xeddbefb7),L_(0x2583cc8f), LL(0x85d843d9,0x912ed2a5),LL(0x57849cc4,0xdb45568e),LL(0x453cbf16,0x410259cc),L_(0xcf9369cf),
+ LL(0x10263ac8,0x69fa2805),LL(0xf7446e45,0x6120289a),LL(0x86d5285d,0xece730a0),L_(0xc0ee3533), LL(0xbf1197bc,0x286f4724),LL(0x878ea926,0x0b0ef425),LL(0xf397181d,0x24bb4f4f),L_(0x542c7100),
+ LL(0x162331a9,0x536a5ea6),LL(0x0e466905,0x88c29411),LL(0x3da5a14f,0x9cb76097),L_(0x1db565b9), LL(0xef6b8094,0x59e86f3c),LL(0x31eb3c89,0x817764eb),LL(0x58eed1b6,0x8010fc3d),L_(0xaeba318a),
+ LL(0x9a5b60b8,0x108b3068),LL(0x1ffea59a,0x1312c3e1),LL(0x8dd4b81a,0x0253e9dc),L_(0xf4ed9d4a), LL(0x5eadccd2,0xbd75013a),LL(0xad3eaf49,0xc60daec9),LL(0x20b2a500,0xbea0d3fb),L_(0xdac00c65),
+ LL(0xfb3fb2a5,0x72db2c7a),LL(0x566902bc,0x864ce0fe),LL(0xe0956799,0x2d7ec9e2),L_(0xdfb7dad8), LL(0xdfc7056f,0x77bfd4dc),LL(0x7e188701,0x0f42ffde),LL(0x110fb370,0xf2040e52),L_(0x7944c336),
+ LL(0x2100e0bb,0x6fd68890),LL(0xf771684b,0x67978ca7),LL(0xb3a94049,0x279171ad),L_(0xc7c765dd), LL(0x02304590,0x41165c1f),LL(0x0299e83b,0x8eadb8c9),LL(0xe9eaef42,0x2345e24e),L_(0xb4a1f1f3),
+ LL(0x41f15f2a,0xaa889c09),LL(0x2cb037eb,0x6adf563e),LL(0x559edd7a,0xdd414cb0),L_(0x601d6943), LL(0xad8084b7,0xbef296d5),LL(0xb70a236e,0x0ee342a9),LL(0x074068ff,0xc9f3a4e6),L_(0x7b2eab9c),
+ LL(0x4db1a4b4,0x983e29af),LL(0x50522f93,0xc26d69a6),LL(0x8e174c76,0x2739f19a),L_(0xc8bc9b25), LL(0x4c902614,0xcd082b89),LL(0xa5f7fd65,0xa0661a39),LL(0xd0352acc,0x6d5bd738),L_(0x15c9e55c),
+ LL(0x0f46deb3,0xe05a9d3e),LL(0x25c49119,0x68d899f5),LL(0x2fcbd485,0xd426fbf8),L_(0x94e9a11d), LL(0x70b0b8e8,0xbb075381),LL(0x21ac6e8b,0xeb323221),LL(0x933c7339,0x90f21e83),L_(0x03161725),
+ LL(0x65c3ea70,0x26f5292f),LL(0xbb26aa3c,0x2f10ff0c),LL(0xd0e0dfce,0xe59106aa),L_(0x5bc81388), LL(0x334ef2fc,0xe1d13288),LL(0xe91c8aea,0xb2dd6c7f),LL(0xe941b704,0x428af6d0),L_(0xb82ceae2),
+ LL(0xf4357fa7,0xe9634ed9),LL(0xea606688,0x92f270b1),LL(0xb8fe4e04,0x4ce90044),L_(0x53c7eb07), LL(0x9137e5a7,0xb5cf536c),LL(0xc36a01d3,0xaa1f4551),LL(0x0024f90b,0x981784b9),L_(0x3bab3f51),
+ LL(0xb04608df,0x5269aa1a),LL(0x0cf9cff7,0x8ce1ebee),LL(0x3d279465,0xc66381e8),L_(0x61b7ab00), LL(0xc4fa7ed7,0xdeb29303),LL(0x6b7bf135,0x510a3c8c),LL(0x2ce166ff,0xaa227120),L_(0xf4a128bb),
+ LL(0x992398c7,0xa3c32177),LL(0xb5766593,0xcd19850c),LL(0x70b1a326,0x9505296f),L_(0xe3747c6e), LL(0x41bcad27,0x0d11515a),LL(0x290e370c,0x04883b49),LL(0x5a5bf602,0x72d1e180),L_(0x6a7dda52),
+ LL(0x5898ed4f,0x63896a2f),LL(0x0341c2af,0x82a0ed92),LL(0x71349776,0x71b9b0ee),L_(0xa68523a0), LL(0xd360630d,0xbd440771),LL(0xc3982209,0xa49907d9),LL(0x28e79328,0xad498ec7),L_(0xde9039d6),
+},
+/* digit=21 base_pwr=2^147 */
+{
+ LL(0x5e338a95,0x0324aba6),LL(0x3d1721e0,0x970769c2),LL(0x32ea5aeb,0x82c3b64b),L_(0x62043072), LL(0x80346bd2,0x98111ddd),LL(0x629d0540,0x2ef9e31e),LL(0x75819a03,0x6e0e0fd4),L_(0x01541785),
+ LL(0xd481d37b,0x676ef7cb),LL(0x6e38c822,0x6ddd542a),LL(0x4bcdf56d,0x0807b6ee),L_(0x152d3a20), LL(0x99cfbaa2,0x440a4586),LL(0x1b803f58,0xaab76f82),LL(0x62bde53d,0x31ca293a),L_(0x774dabf4),
+ LL(0x279a665e,0xc73f3e56),LL(0xd125dbe9,0x51cce02a),LL(0x925d55fe,0xba48033b),L_(0x77120d9c), LL(0x3c3cd000,0x09219d1a),LL(0x9ef0977f,0x7bba7cbf),LL(0xf5c59984,0x1f9a5c08),L_(0x043d05c2),
+ LL(0x4079f18a,0x150e6d32),LL(0xfb5764ea,0x8b6cc92a),LL(0x2d425400,0x274ec0c2),L_(0xee8a4646), LL(0x6d261b02,0x4ef086f3),LL(0xf2d17e5e,0x29dec1b8),LL(0x7f963f71,0xea97e94e),L_(0x70fad827),
+ LL(0x9e51713a,0xf9867b99),LL(0x07c55712,0xbd760d63),LL(0xafdf07e9,0xa9b6e9ec),L_(0x2af4df6e), LL(0x6d61dc08,0x93df1b2e),LL(0x743dfab5,0x3387d03a),LL(0x32d7f165,0x759fb34d),L_(0x749bb511),
+ LL(0x08345265,0x34f3b1e1),LL(0x599ac0d2,0x20468106),LL(0xc8425e31,0xa035ed92),L_(0xbe2663eb), LL(0x15129a67,0xd78546b5),LL(0x6589a68a,0x2a03f31f),LL(0x04faf0ec,0xf88d60ed),L_(0xe6fe6524),
+ LL(0x99a20d9b,0x31f03c7f),LL(0x93d3e67b,0xbdab0f5d),LL(0xcfc1004b,0xc665b5f0),L_(0x3425e2f4), LL(0x57bee517,0xbaab1072),LL(0xf467b795,0x64de4d9f),LL(0xa4efa899,0xb3c284d3),L_(0xdb30b893),
+ LL(0xb6ef6e50,0x7bd6b2eb),LL(0xe6144c26,0xb87b9f50),LL(0x3506344d,0xe38cc59c),L_(0x136536d0), LL(0x98614bb5,0x4daab44e),LL(0xb52c6949,0x3957de52),LL(0xc680567a,0xcfa42f96),L_(0xf20dca71),
+ LL(0xad09cde7,0x89749594),LL(0xf7758fa7,0x686f22a7),LL(0xe7736848,0xd741b21a),L_(0x916557d5), LL(0x08ab4ccf,0xb87c7bef),LL(0x6a38311f,0x982331fd),LL(0x177b6473,0x63140d6e),L_(0x61df2b77),
+ LL(0x061731b0,0x785b32f1),LL(0x92de60e5,0xc296cafa),LL(0x1de52e72,0xb10ce663),L_(0x4c01f4cd), LL(0xc6a06419,0x50016567),LL(0xdcbb4a2a,0x4502900a),LL(0x2c001a59,0x450b28d5),L_(0x3a580e42),
+ LL(0xc5913491,0x9e1e0ce7),LL(0xfef505e8,0xc5f9091a),LL(0xe7590273,0x44739896),L_(0x35472c73), LL(0x449da237,0x3913a8d2),LL(0xbf43ca41,0xd9db43d7),LL(0x0204d37f,0xbcc28709),L_(0x11a4ed34),
+ LL(0x0ba00095,0x00c25d60),LL(0x00ebff6a,0xb0ccb9b4),LL(0xaecf0812,0xebecd41b),L_(0x02599546), LL(0xe2cb6f9d,0xe9f56be8),LL(0xc9f2f401,0xab12b175),LL(0x77e2c3e0,0xa7a303fc),L_(0x6a047f0f),
+ LL(0x0ca6bd42,0x829f1bab),LL(0x4982f7c1,0xf8aa85f0),LL(0x63a37ba6,0xe64c6ed3),L_(0x55b4405c), LL(0x9ba22c57,0x14c74bf2),LL(0xd812115d,0x57cdabdb),LL(0xa2f36ff4,0x69603458),L_(0x4e2488fd),
+ LL(0x049ce7fa,0xdda045cf),LL(0x3c6cc5ab,0xae642723),LL(0x444a4ca8,0xc9e8efd0),L_(0x2e1a3d2a), LL(0xee8ff913,0xa5f0a182),LL(0x3921bdba,0xf34c0a0e),LL(0x0bdcdecc,0xf174835c),L_(0x438b3f48),
+ LL(0x262941ff,0x50dd89e9),LL(0xb28cdfa5,0x52bfaad5),LL(0x3d3651a5,0x42da9f6d),L_(0x52955126), LL(0x72f24772,0xfb5c67bc),LL(0x10d91fd9,0x6f3ebdef),LL(0xa8074e96,0x5d95664e),L_(0xe7fca6c3),
+ LL(0xfbd1a192,0x14bfa4e1),LL(0x11f314f6,0xf38ce345),LL(0xfcdb2abd,0x45ebd21e),L_(0xc304c980), LL(0xb59f480b,0x3957e934),LL(0xe9a58ad5,0x7c1b8e5a),LL(0xe4604f76,0xc58f2c48),L_(0xe27bf6c2),
+ LL(0xc8a88d73,0x21606f53),LL(0x6659ed53,0xfba9c9f7),LL(0xfb7d83f0,0xf57dce48),L_(0x2d2bf81f), LL(0xfb80fd50,0xc8023a07),LL(0x2b42338b,0x71a25cd3),LL(0x7a9a0b44,0xb3c48734),L_(0xc8125d7c),
+ LL(0xf3798b63,0x9856b7c0),LL(0x914f7c82,0x04ab2721),LL(0x471ef449,0xe5f3587d),L_(0x77a7fe57), LL(0x21b96d5d,0xb0c73d23),LL(0x1ec93eff,0xa3366107),LL(0x69323a1b,0x759bf017),L_(0x3f60e38c),
+ LL(0x80978741,0x4e3559fa),LL(0x56b197e8,0xe7559080),LL(0x56ad6e70,0xdd9852be),L_(0xeeb6dec8), LL(0x0e7594df,0xe4523a8a),LL(0xc67e9c41,0x4a40d4e4),LL(0x8ca5687b,0xfaf902fd),L_(0x731b0560),
+ LL(0xd2ade9c2,0x683ea003),LL(0x3784426d,0x6bbf8ead),LL(0x26a2a12e,0x65fa7d53),L_(0x7ab25cd8), LL(0x6154c3a9,0xd7f809d8),LL(0xe2d2306a,0x20ed9166),LL(0x24d19af8,0xa692a83a),L_(0xbb68e143),
+ LL(0xd8e0ff43,0x90e27172),LL(0xf7b7a48d,0xa90bf44c),LL(0x8cb2abd0,0x130d21df),L_(0xd9526e86), LL(0xa3cb4c6b,0x65186f8e),LL(0xe78f59ce,0x0c9c373c),LL(0x3514478f,0x5307b692),L_(0x15b86f33),
+ LL(0xd8568306,0x34f0a25d),LL(0xea579beb,0x039f50cb),LL(0x0eadf2ee,0x6a3cf739),L_(0x7fffefa0), LL(0x6a9a2a62,0x5c707fb6),LL(0x1f9a5c8a,0x22360abf),LL(0x756df232,0xa7a12676),L_(0x735ae0c5),
+ LL(0x232b0eaf,0xfac26fa0),LL(0xc57f8429,0x91c0d8b2),LL(0xc85b9885,0xcd36972d),L_(0x5ab11f6e), LL(0x2b28cccc,0xa2197bb4),LL(0xcf7b4e95,0xb00034b6),LL(0x22200d9d,0x398b8d08),L_(0x0660c348),
+ LL(0x3e7e898b,0x14230734),LL(0x8aa5dec9,0x7bef4c46),LL(0xe3a1abc8,0xb3564180),L_(0xb7f989a9), LL(0xeed81407,0xa7ce6e62),LL(0x98270e80,0xf02dd5b1),LL(0x9d22967d,0xa3ff259d),L_(0x4be6673e),
+ LL(0x25d2230c,0x2d777318),LL(0xd815968f,0x80147bab),LL(0x6f460f52,0x22279805),L_(0x99635b0b), LL(0x20550e62,0x7880c924),LL(0xf836942d,0x6428d5fb),LL(0x9a19cfda,0xd1beb76b),L_(0x819b5402),
+ LL(0xe36b37d4,0x5d87cbda),LL(0xe5f505ca,0x404781e7),LL(0xc8f5e0fe,0xa1bc9eda),L_(0x45ef1d15), LL(0x23299059,0x970d11fc),LL(0x54084d2b,0x785e8445),LL(0x8ed8b412,0xbad1345d),L_(0x2975a901),
+ LL(0xce7aa169,0xd74f6437),LL(0x62092837,0x1f1dc772),LL(0xf497718e,0x36827efd),L_(0x15977763), LL(0x978b617d,0x4cb29feb),LL(0x65c2897d,0x6a64b733),LL(0xe04077a2,0x86b8cf3a),L_(0xac075b5b),
+ LL(0xed710d98,0x3a39d170),LL(0x1f51c85b,0xef236d5b),LL(0x0683a7e0,0xb9141322),L_(0x7e27c47c), LL(0x05109f74,0xdade7c00),LL(0xe2f07be3,0xf251df44),LL(0xc11452de,0xb48e9a05),L_(0xd6a44d08),
+ LL(0x4aaf45f5,0x17039bf0),LL(0xbdcaec9d,0xb97b72ed),LL(0x30ce8053,0xa7a81755),L_(0x54e63f42), LL(0xc81db67b,0x80753cae),LL(0xc22c28cc,0xe3019a4c),LL(0xd1c81400,0x80f8c3da),L_(0x5a1e70b6),
+ LL(0x165046c9,0x030a06a1),LL(0x0ea30c39,0x09c6053c),LL(0x3932bda3,0xcb39f998),L_(0x148a2b68), LL(0x87fe7977,0x0499f81d),LL(0xb74e61d3,0x7ae298cf),LL(0x2959c264,0x1edb6b93),L_(0x6a2188dd),
+ LL(0x6ab52745,0xdc732139),LL(0xd70d9371,0xbd7da6c2),LL(0x5ac1ef95,0xe2e0217e),L_(0x6e9b8907), LL(0x63f9997b,0x5cecf1c0),LL(0x24552abf,0x5082d35e),LL(0x7b11e2cc,0x04cc9aa3),L_(0x78bdf631),
+ LL(0xfecff2a7,0x4f8b44cc),LL(0xe83e0eae,0xd783714b),LL(0x9c0232a4,0x90d1c36e),L_(0xb7e1ea84), LL(0xbd5e004e,0xf22c1c14),LL(0x99441dcc,0x77b24ec6),LL(0xc4fac858,0xf15be1db),L_(0x52f8f005),
+ LL(0xfa634b74,0xc11ab7e2),LL(0x865bc26d,0x39a0b0f1),LL(0xa62656eb,0xdf5e8e89),L_(0x5bbda8fa), LL(0x35af495b,0x059e7fc2),LL(0x996cfbbc,0x5721bb40),LL(0xfcc7a8b4,0x18530aec),L_(0xef18ab08),
+ LL(0x1efc0865,0x7e7fb20d),LL(0x1432863a,0x319cbee0),LL(0x32603543,0x216780a7),L_(0x3173509d), LL(0x771c5009,0x332b0e8d),LL(0xfb32ae5e,0x27842538),LL(0xfd61d211,0x176fee74),L_(0x8d713db3),
+ LL(0x6d5e6c04,0x8f5f36df),LL(0xfd53bdb1,0xff86482f),LL(0x04fc8d4b,0x35ae923b),L_(0x9c93970b), LL(0xd03159ae,0x6c4574ce),LL(0x0c5ab9f8,0x95e44ad6),LL(0xecc940e1,0xacd13e60),L_(0x73d20a97),
+ LL(0x24bc05c8,0x55d8d9f7),LL(0x1be2d507,0xba1700c6),LL(0xb1dbe56e,0x12671c92),L_(0x515125ba), LL(0x7c873619,0x28f4b581),LL(0x00d413e2,0xc27395ee),LL(0x31a82a43,0x84bd2bdf),L_(0x5c6f966e),
+ LL(0x19e04eb8,0xd6d7b2f3),LL(0x32f059d3,0x7d71e73c),LL(0x5dd55589,0x6b4ddaaf),L_(0x7a059ec2), LL(0xb3874052,0xb395499e),LL(0x4cfc04e5,0x56ce4cbb),LL(0x5961b289,0x2960f1ca),L_(0xa3443d73),
+ LL(0x739615c6,0x72405988),LL(0xe58efd36,0x03300370),LL(0xe254b688,0x6195855d),L_(0xf750a8c1), LL(0xd298a296,0xf9205a13),LL(0xfa55931d,0x11ffb780),LL(0xe00ca07c,0xd638a7b0),L_(0x1b178a9f),
+ LL(0x970fe956,0x62d115d2),LL(0xe1985dec,0x4db47694),LL(0xb3652081,0x6565367b),L_(0x61dc5dcc), LL(0x53a17e00,0xbb00a05a),LL(0x390808ef,0xc7f0a623),LL(0x2971e39b,0x091d591c),L_(0xb6590fcd),
+ LL(0x3c51221d,0xd273fed4),LL(0xb849d7b6,0x7eaf4c1f),LL(0xc3cadac4,0x155b21cd),L_(0x21bf043c), LL(0x824bf43a,0x6d0eb93f),LL(0xa560a086,0x2b5af50c),LL(0xe79201e3,0x50f56685),L_(0x7193da80),
+ LL(0xaf65e93e,0x64cb8361),LL(0x097bd142,0x2b08724e),LL(0x5d31d941,0x128434b7),L_(0xd3455462), LL(0xd87b7934,0x6349bb61),LL(0x5338e12b,0x8eabd8cd),LL(0x46f9abc2,0xf5ec4590),L_(0xee7ff24e),
+ LL(0xde41b0d8,0xfcdd55ff),LL(0x390333ed,0x5f8a8d73),LL(0xad3ba05b,0x5c84894a),L_(0xdd94d8c3), LL(0x1041454f,0x7425541f),LL(0x4f6bd774,0xf6c08550),LL(0xbe1bce56,0x48f611af),L_(0x723a0cc8),
+ LL(0x31e207ab,0x505aaa25),LL(0x6f2c316a,0x9df3ed0d),LL(0x6ff3aa7e,0xecdfa689),L_(0x0c314ac1), LL(0x4660e302,0xaac1b188),LL(0x74b064f0,0xe2709e66),LL(0x1690d7e4,0x9ad43bd5),L_(0x19d6932b),
+ LL(0x9e4966da,0xe9803ed7),LL(0x5acbb8d9,0x94a51c09),LL(0xc6ffb2f1,0xac8d73e5),L_(0xce57f6f3), LL(0x87ee51c7,0x0f2f29a5),LL(0x1c8a8a14,0xcf07fe4d),LL(0xf7993328,0x11a086fc),L_(0x816c9d1d),
+ LL(0x482c8577,0x7008cc6c),LL(0x3a6923e0,0x4ea34320),LL(0xea139dd1,0x0db793be),L_(0xc99cf72e), LL(0x2f88c486,0x46daeb88),LL(0xf235e9a5,0xa9529776),LL(0x8fc9a2fe,0x685903b2),L_(0x2e9cc9d4),
+ LL(0x160fbbb0,0x85dc20a6),LL(0xd5312a9c,0x40ce263b),LL(0x33ee3772,0xf18c955f),L_(0xb8cc18a3), LL(0x7c56f68f,0x629b2ed0),LL(0x381772f9,0xd3751f88),LL(0x9be35b3d,0x87658375),L_(0x438ba3ac),
+ LL(0x4c71f19e,0x2e6a930b),LL(0xbe1f2bc3,0x6ce370bd),LL(0x9c7c9090,0x9fe1a225),L_(0x9a8e7036), LL(0xdfc19acd,0xbc4095c2),LL(0xbf429df7,0x102343b7),LL(0xa07aed0a,0x75593f8f),L_(0x2c1e8aa6),
+ LL(0x6e87ec50,0xe6abe1ed),LL(0x6cc4e156,0x32e1d48d),LL(0x9c1aa3b0,0xbc16fee9),L_(0x76d25ea9), LL(0x1a098c5e,0xa549cfc8),LL(0x0fe8dc0a,0xdccd7aa4),LL(0xe2b2179c,0xf0addee3),L_(0x9bcbee00),
+ LL(0xec32e6a2,0x4e4d505b),LL(0xb0ad3d1f,0xd584c5e1),LL(0x708100e5,0xf05981fa),L_(0x5ca8160b), LL(0xff71c066,0x30b8c50e),LL(0x9b267d28,0xa5cf6579),LL(0x00705bdb,0x003593a1),L_(0x6e7726d9),
+ LL(0x1e13fade,0xbfa0d04d),LL(0x1fd12275,0xcc81bd28),LL(0x39bdb34f,0x7ba2330c),L_(0x9cb5c2f4), LL(0xb5b45e69,0xf331bfd7),LL(0x9513f2a2,0xdd8ec1b5),LL(0xb3f734e7,0x9064cd97),L_(0x5f64f559),
+ LL(0x6a4afc60,0x4194a70e),LL(0x63999525,0x523cff27),LL(0x03d08e2c,0xa27e7edc),L_(0xea90ab15), LL(0xfc7c7e87,0x38873c54),LL(0x398075fc,0x805abf3c),LL(0x414e3976,0x93991ee1),L_(0x66b18c5a),
+ LL(0xa5d47504,0xb3fe93fc),LL(0x9c7a5517,0xb7d168b6),LL(0x4a438e8c,0x581ebd7a),L_(0x30a1a792), LL(0x1e7c3d15,0x7749a42d),LL(0x2279fc57,0x86e109ed),LL(0x853c9b29,0x069c5f0b),L_(0x4438f7b5),
+ LL(0x2fb4329a,0x2b3c8790),LL(0x99bbcc79,0xc7e0dd07),LL(0x9d9741bf,0x51f341ad),L_(0xaedc9e99), LL(0x6eb8a76e,0x1cd0ce38),LL(0xbf6e3e65,0x2698a77a),LL(0x3099a97a,0x6b8968f5),L_(0x6186d5b8),
+ LL(0x5f3a4ac3,0xf86e098a),LL(0x6977fcd9,0x3194f379),LL(0xc98e48aa,0x886d05b8),L_(0x23139131), LL(0xbd9be137,0x488df6bf),LL(0x876a25e7,0x9833b00c),LL(0xfb9f6810,0x5fb8ce68),L_(0x1a974ef1),
+ LL(0x0996c57a,0xe74e34d6),LL(0x95d0e8ba,0xbc8f1cc6),LL(0x49ddbd76,0x3e421dda),L_(0x47780198), LL(0x2fcb399c,0xf599d67b),LL(0xb3cd50fe,0x1de7c3a8),LL(0x60ffdfcb,0x41018e1d),L_(0x2a84e15c),
+ LL(0x5803c901,0x1834f6f5),LL(0x85be2737,0x0269aa98),LL(0x51b8942e,0xbd9cdd7b),L_(0x2573f804), LL(0xf11dba7f,0x62d1e404),LL(0xa026f5f4,0xa355486e),LL(0x3e7a1a96,0xa6d151c2),L_(0x52ecef89),
+ LL(0x5bfcbb66,0xd3cf6d12),LL(0x7f3efdcc,0x509c593b),LL(0x36beb1c6,0x50bb9be7),L_(0x87aa0794), LL(0x461e9081,0xf6ebcef8),LL(0xb12b6973,0x53fb4ce0),LL(0x1d3a4bb3,0x84afbe92),L_(0x765f75f5),
+ LL(0x36690884,0x66809ebd),LL(0x7d2d307f,0x6d7b75a0),LL(0xb7561328,0x7a0b342b),L_(0x25a224f2), LL(0xc6b75bd1,0x8b464a87),LL(0x98a06fcf,0x145091bc),LL(0x33cace99,0x723fe6fa),L_(0x24207bff),
+ LL(0xfa386bf7,0x5ea0874e),LL(0x470c5915,0xa8387298),LL(0xbc4e6a04,0x02c73e59),L_(0x303d5c07), LL(0xa4b7c2f2,0x2fdbbf21),LL(0x2d418059,0xb933bbc7),LL(0x874e47bf,0x4c88b532),L_(0xbd3a8f84),
+ LL(0xb79dad0b,0x94b27e28),LL(0x4c3cb167,0x47dac83a),LL(0xb3a5c35a,0xace3bd6b),L_(0x36f5d64a), LL(0x0d91b2e8,0x00f91b6c),LL(0x561c257a,0xd6d7f96c),LL(0x390f1d25,0x92ea6b8b),L_(0xce74a256),
+ LL(0xa7f8fb96,0xf0e6068b),LL(0xbee4d1a2,0xed56b92a),LL(0x64cd2ac4,0xd3d78730),L_(0xb0ed4379), LL(0xf0d95042,0x8db9e812),LL(0x0e235698,0x6447eba8),LL(0xd45b6fa7,0x3b769af7),L_(0x95403694),
+ LL(0x26f167ea,0x8aa2617b),LL(0xdb91ef4a,0x52ead3d0),LL(0x41988291,0x5273a693),L_(0xab06325b), LL(0x18ca4d81,0xb1bbd253),LL(0xea972289,0x58878e32),LL(0x64d8aee8,0xe8908e43),L_(0xcdca72ce),
+ LL(0x5a517623,0x6d83d019),LL(0xd917cb4a,0x969711bf),LL(0xa7fc9902,0x225d81d7),L_(0x9b126599), LL(0x25981f40,0xe02b87e7),LL(0x04539a29,0xaec410d7),LL(0x35630262,0xb1115eaa),L_(0x7461aa8b),
+ LL(0x83f05d8e,0x4dc83cf2),LL(0xdbbadf9b,0x523db1cc),LL(0x09d299d6,0xe968d6f7),L_(0x46a4ef90), LL(0xa5406082,0xc545ab6a),LL(0x158f1789,0xcf6e254a),LL(0x592bcabb,0x599530e8),L_(0x4ecd132b),
+},
+/* digit=22 base_pwr=2^154 */
+{
+ LL(0xa46f08d9,0xb9fe1aa5),LL(0x27531029,0x32c26e96),LL(0x1b37edc0,0xcc6e653e),L_(0x25a6777f), LL(0x37d78fa5,0x44dcd6fa),LL(0x44e59684,0x637ed305),LL(0x72834a3e,0x6cab1cc9),L_(0x715fa76f),
+ LL(0x2efe30a2,0xd9e804cc),LL(0x1c1ded3a,0xb9c440fa),LL(0xb6ba8131,0xd2f7d77a),L_(0xe00e21fe), LL(0x88842b6a,0x96f7f20a),LL(0x616f6de5,0x9a618ffe),LL(0xf13ceac5,0x6577f60c),L_(0x9f1e4b0d),
+ LL(0xbd482557,0x1653fafd),LL(0x93eea72d,0x39c09ddd),LL(0x10b62eeb,0x79f6d014),L_(0x2f476cfa), LL(0x78d81b01,0xe8963c96),LL(0xc395c6ba,0x8c8f6a4c),LL(0x63b70385,0x551fa28d),L_(0x28bb3fc4),
+ LL(0x433a33ea,0x2417a7ce),LL(0x5591c910,0x1d9155b1),LL(0x7a6ca298,0xd78e16eb),L_(0x09ee38e9), LL(0x3ab289c2,0xee48adb0),LL(0xd5b76200,0xc998c5c8),LL(0x8dd6fbf2,0x959f66af),L_(0x3ee20307),
+ LL(0x23a0b23a,0x63c09a4f),LL(0x24b60423,0x021b685f),LL(0x7c69331c,0xb1b0820e),L_(0x7d3c58fb), LL(0x81992f9f,0x370cbdbc),LL(0x05814d87,0xeecaf1b3),LL(0xaeba071a,0x5ebd44d9),L_(0x079434ba),
+ LL(0x193df859,0x7a008e70),LL(0x9d5dd4b2,0x8d7ec280),LL(0x81377001,0x3062b2db),L_(0xe82fbf45), LL(0x11e91ce4,0xdb62847d),LL(0xf3a5dc38,0x9a492d59),LL(0x42b1e033,0x3c5e448f),L_(0x0028f02b),
+ LL(0x48abe62f,0xf00a790d),LL(0xf18c3029,0xe9c56ab7),LL(0xcfc6643d,0x7a101d9e),L_(0x69f64af5), LL(0xe901d5c7,0xc8b5cd29),LL(0x8ab0437d,0x5a6c0d3b),LL(0xf3eacfba,0x437c7e62),L_(0x9c1ff745),
+ LL(0x7ef25e16,0xc3c0b7b4),LL(0x3b2bb23b,0x2d411980),LL(0x9d372287,0xb86b3e9a),L_(0xbd217cd9), LL(0x6682e29c,0xc7ddb5da),LL(0xf55b3a32,0x80ad8745),LL(0xc5272ca9,0x67e42112),L_(0x80ddaf6c),
+ LL(0x2db21214,0x26d65fa2),LL(0x593699c3,0x27bc92ce),LL(0x780c1507,0x62bfbfb4),L_(0x4e610cd9), LL(0x90f53f42,0x306b2065),LL(0xdcabb7e7,0x70add873),LL(0x97f0fe05,0xef3f82de),L_(0xfd016e06),
+ LL(0xdb734eee,0x49ac57da),LL(0x33f4851e,0x0575235f),LL(0x12e6b4bb,0x84ba90a7),L_(0x0c414c40), LL(0x2e72cdc9,0xde178a6e),LL(0x5d680978,0x2c8f9b52),LL(0x04316bb2,0x4d9021c4),L_(0xd58bf8cb),
+ LL(0x4a88c720,0x7c1da7fb),LL(0x2166e51a,0x7be262ad),LL(0x26f4415e,0x8d16df29),L_(0x4308e38d), LL(0x6e047968,0xf7050746),LL(0x5191f59a,0x40048ee7),LL(0x671c053f,0x7e714450),L_(0x41cd1cf2),
+ LL(0x126208fc,0xc3f913fb),LL(0x77459414,0x81ebbd24),LL(0xfbf9d09c,0x60be0397),L_(0x5762fb0e), LL(0xab78592e,0xee7a8b54),LL(0x11f20203,0x58636e68),LL(0x5cb0cea7,0x56d9eb18),L_(0xaab58567),
+ LL(0xe2adb3e3,0xe08bf721),LL(0x8b739b3c,0xcf7b1348),LL(0x88809e01,0x9dd0883a),L_(0x0dd14479), LL(0xfb2d7aed,0x9e8ac3f6),LL(0xe9234e02,0x3aa9be66),LL(0x87a97238,0x56210cb7),L_(0xa8cca221),
+ LL(0x515e6713,0x989ff215),LL(0xd0bcb26c,0x8011a540),LL(0x16b0e517,0xc8b38bfd),L_(0x7706fd39), LL(0x23c98754,0xc13358b8),LL(0x8745e3cc,0x5edc147a),LL(0xae944131,0xbf36526b),L_(0xb43ce39b),
+ LL(0xbb74f4a3,0xf57da9fb),LL(0xcceacf96,0xe6c34f99),LL(0xae99e920,0x72b76a37),L_(0x7a9e0b84), LL(0xd46a4b67,0x377b9f4d),LL(0xd8d2d70f,0x2dbc27cb),LL(0x1c0d51f0,0x63d0ccbb),L_(0x423d586b),
+ LL(0x76b14e74,0x5173ac48),LL(0xda87fd76,0xac29f6c0),LL(0xde2af466,0xbf4405a4),L_(0x0df31635), LL(0xe0a96172,0xc72bdfba),LL(0xcbefcc71,0x14f78dd6),LL(0x2c991165,0xf55ecef7),L_(0xa3278f6d),
+ LL(0x6d393d5f,0x05e626ee),LL(0xb9f01d8a,0x225ed4d6),LL(0x53d41ea6,0x5d5b37e5),L_(0x6b1d2d7a), LL(0x70c4e493,0xf4527dfb),LL(0x465bfaf7,0x1522deea),LL(0x333509e1,0xad711cce),L_(0x988f296f),
+ LL(0x072fecfb,0xba0c11d9),LL(0x46a2c644,0xa6fa784d),LL(0xa105395f,0x3a914aba),L_(0xa42699f5), LL(0x5b5ec37d,0x6c8c0e8b),LL(0xffef0a76,0x79696f78),LL(0x69daa4dd,0xbf1748ba),L_(0x8134c310),
+ LL(0x16919c10,0x43014c2d),LL(0xa35261bb,0xd14b6a12),LL(0x6d705b75,0x395d7526),L_(0x58721301), LL(0x4c3aec80,0x3f4fd283),LL(0x2e6f84dc,0x4114b4f9),LL(0x6a63c71b,0xcf962aae),L_(0x58c876bc),
+ LL(0x085cede4,0x39a2603a),LL(0x21ba7529,0xb203a75d),LL(0xbdc1e809,0xf3640f89),L_(0x6631c30e), LL(0x8d9d5265,0xd480817b),LL(0xad93303a,0x8492b58b),LL(0xe3368ba5,0x24b8bfe6),L_(0x26c2b552),
+ LL(0x64ef9738,0x6907b7bc),LL(0xd795d794,0xf6e9c508),LL(0x33b42737,0x55ab9706),L_(0xa13daed3), LL(0xf586dde7,0x76b6d961),LL(0x0ff335ce,0xad1c2111),LL(0x13031322,0x1f36dd8c),L_(0x0558b72f),
+ LL(0xe83a229d,0xe6ae70d0),LL(0xf0770ab8,0x5b9ca0d2),LL(0x06479e73,0x17cdf808),L_(0x5e50cd46), LL(0xd020f0ac,0xca397995),LL(0x3337dcfa,0x70369103),LL(0x3d37e46a,0x67d7bcef),L_(0x5283dec8),
+ LL(0x920986d4,0x9e2b8580),LL(0x6f80e6f8,0x1a1086a7),LL(0xf038b9fd,0x76630d46),L_(0x4e9ef3ae), LL(0xf2780d64,0x479ba46d),LL(0xfa784b8c,0x41a1c68f),LL(0x953b6640,0xeee5927b),L_(0x9d4a23e4),
+ LL(0x7a6dcf80,0x2905feea),LL(0x2a632e73,0x5bba1fd8),LL(0xd274195e,0x596a73e6),L_(0xaf3000ac), LL(0xfa2e2813,0x83723184),LL(0x99dae0bb,0x21f09629),LL(0x7ce090e3,0xb6dc2849),L_(0x2bd68086),
+ LL(0xb254b1d5,0xfee577f0),LL(0x2ce6dbab,0x6accfc0b),LL(0x775f693f,0x483bf6a8),L_(0x829c24e8), LL(0x74582da0,0x6731bfc7),LL(0x8e7f87f0,0xf7d39568),LL(0xa67faa6c,0xc9418804),L_(0xf17ae402),
+ LL(0xb5eb4f29,0x7a12fe1e),LL(0x862fd52c,0x4a7fc70e),LL(0xd820b6bc,0x319719c3),L_(0x06ce9593), LL(0xbd26f429,0x66648099),LL(0xb9a6a586,0xb662d062),LL(0x7fbe15d7,0xf16d93b4),L_(0xab04debd),
+ LL(0x951453e5,0x8f99c3ae),LL(0x01cc4900,0x422aab2c),LL(0xec8547fb,0x73be771b),L_(0xfba8505c), LL(0x49e82e72,0x7b15c573),LL(0x238927ca,0xaa7e7ca5),LL(0xfd867aa0,0x58e19238),L_(0x16e92a3b),
+ LL(0x31e49c5d,0x2d0ee2e6),LL(0xe0a95c2b,0x3aaf91fc),LL(0x271cbc87,0xcb833e79),L_(0xcebcb341), LL(0x36952e47,0xf7a6bc06),LL(0xb8a1069c,0xda163496),LL(0x1f6ccb97,0xb5f271bf),L_(0xadf492cf),
+ LL(0x606962f9,0x82d18205),LL(0x983a462e,0x4a97cf98),LL(0xde06a403,0x23969744),L_(0x5ada65f3), LL(0xba5e083e,0x22229508),LL(0x7b88f442,0x376f004a),LL(0x1c53a79e,0x8ecb5e4a),L_(0xbc00e747),
+ LL(0xfde8f5b0,0xdaab7a45),LL(0x6896d43d,0x6cba2e3f),LL(0x0b7de7e1,0x31db2861),L_(0xc8a85283), LL(0xf98e6b35,0xa8d3e811),LL(0x9ed4cc65,0xc4961d3a),LL(0x4bad9114,0x10d64cdd),L_(0x6febb44a),
+ LL(0xadd9fbd1,0xca3624bb),LL(0x6bfd7f49,0x73a43aec),LL(0x91301b03,0xc382f632),L_(0xe009202a), LL(0x83cfde00,0xf9e8d9a9),LL(0x03cf587c,0xb9fbd92f),LL(0x25a8b014,0x760229d4),L_(0x62d554e5),
+ LL(0x95ce63b9,0x225d1531),LL(0xe0e28f19,0xf1862d71),LL(0x143d1930,0x89faba0c),L_(0x3d640e67), LL(0x36978269,0x2f3bfacc),LL(0xb38209aa,0x8ecd6947),LL(0x817ba1fc,0xad14a0f1),L_(0x53f8ce9d),
+ LL(0x9cf6404c,0x0fcc7993),LL(0x455cb661,0x94227ce7),LL(0x36c49b8b,0x1add1a97),L_(0xb4a122ea), LL(0xddf10443,0x478ddbe9),LL(0xd7d28b55,0x598d307a),LL(0xa7d77b58,0x7c2d4285),L_(0xf914cdbb),
+ LL(0x6ae40efc,0x7296f54f),LL(0x267136bd,0xbb8c6473),LL(0xa3248f4d,0x096d9531),L_(0x9bf47d4a), LL(0x72de2ce7,0x71d14af5),LL(0xe31fd133,0x8bb3132e),LL(0xd5a9918e,0x1ee08068),L_(0x4ad2e489),
+ LL(0x3a3e84c5,0xdb4c764e),LL(0xc0cdb80f,0x06967d90),LL(0x9a2fe8e7,0x3d0cd72c),L_(0x8105ce51), LL(0x663d93ac,0xd9a81336),LL(0xc772e40c,0xe092d50f),LL(0x7d2f5c90,0x45eb443a),L_(0x7ebd73b6),
+ LL(0x29b44f03,0x09859196),LL(0xd120b82e,0x274e7581),LL(0x8a9337d3,0xe9cba9ed),L_(0xb7d3254c), LL(0xab1d6ae2,0x1aa44fa6),LL(0xa2bcdd85,0x8201c08a),LL(0x2f9c1703,0xd128d342),L_(0xcf87815f),
+ LL(0x04dbb489,0x4b130afb),LL(0x8592bf1f,0x010d7b25),LL(0xf211bcec,0xb7f03740),L_(0x2070aa40), LL(0x24a2aec7,0xf116e286),LL(0x3a91fedf,0x4b6af9fa),LL(0x974e5b38,0x19cbf327),L_(0x0cab111f),
+ LL(0x8816e066,0x52f1347b),LL(0x0dbd4053,0x733b5b5e),LL(0xe33961b0,0x8db340e4),L_(0xc28fe0e4), LL(0x8fdad9c7,0xb3cc8f09),LL(0x66c9d4cd,0x36371a81),LL(0x36432409,0x9dd5d017),L_(0xfd34cf28),
+ LL(0xc45e9f49,0xce25491e),LL(0x464328d6,0xf8ea793b),LL(0x27eb6c22,0x6371b206),L_(0xc53f6320), LL(0x80e32e79,0x61eaf6df),LL(0x3ece8680,0xdc4f44ca),LL(0x387b7804,0x4b85bf6e),L_(0x4e286cd6),
+ LL(0x2c7dc475,0x18a6a123),LL(0x87751313,0x53665bc9),LL(0xaa43dbfb,0x8d40fe26),L_(0xe4bce37a), LL(0x6723ea8f,0xbade3e08),LL(0x4b0254d2,0xc7adbb73),LL(0x2f3a4dc9,0xa74a2565),L_(0x829b9555),
+ LL(0x9ab672f0,0x9cc7bfa2),LL(0x1fad100a,0x2ac7eb07),LL(0x368be66e,0x5665ccf4),L_(0x8056fdf1), LL(0xb250a7ac,0x465d7f98),LL(0x64180c0c,0x8d2b97aa),LL(0x7b979097,0xa50d476d),L_(0x45ad85c0),
+ LL(0x8b68fb1b,0x542fb7f1),LL(0xf8fc7eb8,0xd96b7a33),LL(0xb020cf53,0xdb72531d),L_(0xb4c510b9), LL(0xc73ecdcc,0x1c4cd34a),LL(0x272dd7b1,0x039494e8),LL(0xd23f79c7,0xa21edcfd),L_(0x207ff37a),
+ LL(0x17c4dc72,0x5ce9dcb0),LL(0x6a5e2d85,0x25936d77),LL(0xebe08b04,0x70fc7789),L_(0x7b6f8a3a), LL(0x7f3546f5,0x7563a201),LL(0xea8da605,0x10bfdb1f),LL(0xdb570af0,0xeb5d3434),L_(0xdadec2da),
+ LL(0xef345021,0xd0e87d76),LL(0x2945a207,0x222e0b0f),LL(0xe86e0a88,0x6fa3b5c9),L_(0xef9f7939), LL(0x9da8796b,0xabdf6b2a),LL(0x90ef27c9,0x7ead1795),LL(0xbbc76905,0x8c71560c),L_(0xbef19370),
+ LL(0x890d8ce2,0xb5cc05b2),LL(0xa7bd2aa7,0x7de1e29a),LL(0x866cd575,0xfc749a26),L_(0x825af3b3), LL(0x7eaa0bb6,0x886271b4),LL(0x6514a9d4,0xed069b45),LL(0x65bd26ca,0x2f59240d),L_(0xbe13ff4a),
+ LL(0xd9546220,0xcbae178c),LL(0x2cf4cc42,0xe71c4857),LL(0x70950b7d,0xc8f7ab52),L_(0xb20e351c), LL(0x52a1a22e,0x24d86b6f),LL(0xe4b84f76,0x70b94a08),LL(0xd450bfb1,0x0d983cdd),L_(0x3f21b37f),
+ LL(0x5619c34b,0x77d8a74f),LL(0x86215aa3,0x71f4dc88),LL(0xfa0612da,0xb127ccb2),L_(0xc1906699), LL(0x879fb160,0x205b4589),LL(0x2af7eaab,0xe8b6c8f4),LL(0xaad791a8,0x1490d5ca),L_(0x3359b830),
+ LL(0x32c5bb90,0x28810885),LL(0xdd3a45f9,0x2ceffdfe),LL(0x14a9a0ad,0x7970ea64),L_(0xe4fdf446), LL(0x8708e80b,0xbbf83ccb),LL(0x1b1d1037,0x5cc8baac),LL(0x800c8eba,0x98c8b359),L_(0x3ee963ee),
+ LL(0x22c84665,0xdbd93971),LL(0x284c33c2,0x697a6de7),LL(0x6f50eaa6,0x87cb9042),L_(0x70efc303), LL(0x5f70b39e,0x2af4f24a),LL(0x562e2f64,0xd8a16a0e),LL(0x8f4571e4,0xa7b9ed81),L_(0x6ceb56cb),
+ LL(0x6e1de981,0x725de358),LL(0x04ebe2bd,0x85652ca3),LL(0x50b9f863,0xd5f0033d),L_(0x0b13ec3a), LL(0x19c015bc,0x948391b7),LL(0xc37027bf,0xaf6e5ed5),LL(0x33c66538,0x96bfa703),L_(0xced15639),
+ LL(0x069d03c1,0x47f60293),LL(0x73dccc53,0xc32780f6),LL(0x3bfeba8e,0xc2e0eb4e),L_(0x546bd56a), LL(0x29bd4113,0xc233f03a),LL(0x277aca24,0x574da3b6),LL(0xf4f6a7ac,0xae0e0260),L_(0xbade476b),
+ LL(0xbb8f2925,0x5a087018),LL(0x5c2bab18,0x8c5485dc),LL(0x351ad0f1,0xf7d7679e),L_(0xe930bcd6), LL(0x2bdc4897,0x277bcf81),LL(0xbcb4ffd9,0xf147c5b3),LL(0x87185cc7,0xdf48c9e6),L_(0xce71b122),
+ LL(0xdb75cc10,0x17222dc7),LL(0x3bc7295c,0x3dd256a0),LL(0x3a012a3b,0x7ec5696a),L_(0xe6950145), LL(0x9381bed6,0x4f4cdfd3),LL(0x353d2f83,0x7b5b13a3),LL(0xbf5f2e84,0x2639cce3),L_(0xda40d3a1),
+ LL(0xdb334a59,0x6da64943),LL(0xd3f151b5,0xfce96a35),LL(0x6ad5dfad,0xa599a89e),L_(0x0d1b7f52), LL(0xeddc6626,0x2ef746d1),LL(0x861341ad,0xa912c3ef),LL(0xd6859ab6,0x1ac3aba5),L_(0xd95ca5f2),
+ LL(0x0e5c7c8d,0xb050ceeb),LL(0xcf83afd0,0x53e4bd2e),LL(0x710688b3,0x19a215e7),L_(0x8fa6f937), LL(0x9a042c9a,0xd22cc140),LL(0xa2947f4b,0xb5f7e2eb),LL(0x7f1f59f8,0x154453dd),L_(0x4db7a4d6),
+ LL(0x9473341c,0x9f33393e),LL(0x75ea0e37,0xb3dc51a3),LL(0x09fb2116,0x0ee5b84f),L_(0x3fcab420), LL(0xf91ac676,0x816d6ca6),LL(0x8f078e9d,0xc0c5edee),LL(0x0cfcd5ed,0xb71c05e5),L_(0xc167eb60),
+ LL(0x17c9bd2b,0x4c0897b1),LL(0x145b24db,0x7a16a169),LL(0x0f41e0dd,0xa88a35f1),L_(0xbff8660b), LL(0x5e5fc719,0x85b8baf5),LL(0x2e4db4f9,0xd33b70cd),LL(0x5dd4f3b8,0x5ddf49c1),L_(0xbfc827f1),
+ LL(0x795a3893,0xedb3e7f2),LL(0x6cad1ecf,0x33c80574),LL(0x26818153,0xf7414144),L_(0xff6a4325), LL(0x6f311ca1,0x24d6e452),LL(0x7d6669d2,0xe7193165),LL(0x66d1a963,0x89fa62a1),L_(0x6bc282cf),
+ LL(0x375aa47d,0x70c638b9),LL(0x4fe2ddd6,0xf167acbd),LL(0xddf9d01a,0x364bf41a),L_(0x70510fe0), LL(0x7d82f66d,0x8862080b),LL(0xe66e70a2,0x0448ac9c),LL(0x4dbdd638,0x971eaebd),L_(0x07449c55),
+ LL(0x30f6e054,0x4b4739f2),LL(0x55ce7718,0xd62b9aef),LL(0x3bbafe26,0xb84b80ac),L_(0x52aa54d6), LL(0xd03fc3fe,0xb6803cd9),LL(0xaf2b1562,0x81afcd95),LL(0x205a14b1,0x7a0ade0e),L_(0x371096d5),
+ LL(0x2d735064,0x4b1c54dd),LL(0xaad4a4b1,0xda4629d6),LL(0xe95c14ae,0x6f216326),L_(0x00affaf4), LL(0x2fae20c7,0x3112101e),LL(0xd2f76d99,0xbce52747),LL(0xfcd465ea,0x53fd0b9b),L_(0x8b45a470),
+ LL(0x068c0d93,0x1f9856a8),LL(0x6517f94c,0x3408da23),LL(0xc9b9b412,0xc63b4cb7),L_(0xd2b6eaad), LL(0xb7836b3a,0x200fd925),LL(0xa850f3d2,0x55a6ddef),LL(0x2b7f407e,0x0fb2a9d1),L_(0x8b4cf8a0),
+ LL(0xe36962f6,0xfae22eee),LL(0xb2671435,0xfe866c3d),LL(0x8acadf81,0xa3f599f7),L_(0x57dbb976), LL(0xe8b6b61f,0xb4b13551),LL(0x14a48328,0xcdd8f22e),LL(0xb9099888,0xe1b8ed2e),L_(0x322f8929),
+ LL(0x7e8f146f,0x3818b39f),LL(0xacd7c7b4,0x16886904),LL(0xf677bde6,0x022ae138),L_(0x9ffae2cf), LL(0x5746a459,0xacf62d52),LL(0x09ae59c0,0x63279bc6),LL(0x4ee46705,0xfd285b9c),L_(0x674ba2e7),
+},
+/* digit=23 base_pwr=2^161 */
+{
+ LL(0xbad78997,0xc931bee3),LL(0x0c15f2e2,0xe3c1a2d8),LL(0x7cd507de,0x58fc32e1),L_(0x0f28ff52), LL(0x01135f60,0xfb8b7b35),LL(0x11406d6a,0x413750b4),LL(0x2dffb3fe,0x6a265953),L_(0x7c1dd63a),
+ LL(0x796bb2b0,0x56c1932c),LL(0x09ceb738,0xf443c29c),LL(0x6ff56bc3,0xbdd22bb5),L_(0x7387fcf2), LL(0x21178548,0x22575d25),LL(0x534ca838,0x7ffb29d7),LL(0x4ffc71d3,0xd6ef14c3),L_(0x6a7a8abe),
+ LL(0xbc9613ac,0x5920119c),LL(0x6ae141df,0xc3d2b2e1),LL(0x9633ba13,0xe7d31665),L_(0xc56ddd74), LL(0xe622933d,0xec5df7bb),LL(0x641e9e6c,0x50f7f156),LL(0x7feb42b1,0xeb17ef8e),L_(0x36a1400c),
+ LL(0x1a087220,0xeeddf997),LL(0xe4cee644,0xb6ad5609),LL(0x3c761d64,0x52dd9f57),L_(0xda46466e), LL(0x39b5966f,0xca15f167),LL(0x16fee018,0xea78b847),LL(0xd9642afb,0x37eea476),L_(0x3f286088),
+ LL(0xda4b72e6,0xa3072640),LL(0x3e38a59d,0x36a057e0),LL(0x4754e3c5,0x4faa9820),L_(0x2a8a9f0f), LL(0xf20160be,0xa80ee38d),LL(0x5f711700,0xc8e173dc),LL(0x665dbf2e,0x2aba1be0),L_(0x187969d1),
+ LL(0x228ed7aa,0x2d501abf),LL(0x1434af6f,0xe4f5d2f6),LL(0x3dad807b,0x0b4aa28f),L_(0x49171ad5), LL(0xe672b220,0x0888b653),LL(0x61b8ab73,0xa3e477ad),LL(0x226f83cd,0x0afdcedc),L_(0xff93b3f1),
+ LL(0xe7476655,0x562eb536),LL(0x4facc94b,0x7f5bedc0),LL(0x2887f756,0x8581b7e9),L_(0x2a5e0a2d), LL(0x160c3505,0xdde60b62),LL(0xa03cc7a8,0x8a8ca29a),LL(0xb94770da,0x3ecfeca1),L_(0x667902dc),
+ LL(0xb615d5a8,0x8ea9ecfb),LL(0x55508319,0x6be624fd),LL(0x7f81ee5d,0x45035a93),L_(0xd73caa36), LL(0xc3d23101,0xe9c562fc),LL(0xd42e053f,0xf451c229),LL(0x6ee17a32,0x932ddcfa),L_(0x689ee05b),
+ LL(0x6337e909,0xe970ce2d),LL(0x7dae8ee6,0x58d5ae88),LL(0x253afb1a,0x88db9fe4),L_(0x05ed8360), LL(0x3d74de44,0xa90b033e),LL(0x8c323484,0x132dd86b),LL(0xed163aa4,0xc88fa0d9),L_(0xbaaf76b3),
+ LL(0xa0e34d4c,0xa5b69894),LL(0x8d09f343,0x495e2cc1),LL(0x987653cd,0x5e895b41),L_(0x0dbb4714), LL(0xf289cc21,0xc41882ef),LL(0x5fe6817a,0x3329b3be),LL(0x4acf73b8,0x9efd2db0),L_(0x0d02e7dc),
+ LL(0xdd8e91bb,0xf8f6f870),LL(0xc680bcc6,0x728bf4b4),LL(0x93d4067d,0xb9c4891b),L_(0xc44a0438), LL(0xf8bf9b96,0x1e5e8506),LL(0x8e6af7aa,0x11821ebf),LL(0x99083ad2,0x7e9d0c84),L_(0x510d6d87),
+ LL(0x85547391,0x48ab6926),LL(0x4bca1962,0x1badb306),LL(0xdd5f7613,0x4641e82a),L_(0x7c23013e), LL(0x3d43a297,0x58c32dfb),LL(0x706e6ac2,0x3ffcd8f7),LL(0xc250c17a,0xfacc3394),L_(0x0ac00a9f),
+ LL(0x99456e77,0xe9a40562),LL(0x762b34e5,0xa165351f),LL(0xd0dd1798,0xbabb6293),L_(0x257af82c), LL(0xb83a079b,0xa5cd33ea),LL(0xac07759a,0xf120f050),LL(0x6109e625,0x774354d8),L_(0x7ac23484),
+ LL(0x8d82b0bd,0xbafdf31f),LL(0xfd4e66c0,0x7639e997),LL(0xd2a8308f,0x3be638b1),L_(0xeb3d8386), LL(0x54bc114f,0xeb650088),LL(0x97a2e01d,0xebdef489),LL(0x902bb33d,0xc3e46171),L_(0x3a181f63),
+ LL(0xc86362a6,0x56cc1bef),LL(0x13e720d5,0x3b4b4fc8),LL(0xf9436f6d,0x370a01fd),L_(0xba6eeefa), LL(0x632c516e,0x916aa8c7),LL(0x571c4cd2,0xe3ad18e9),LL(0xe18b971a,0x72c7e5a4),L_(0x570527c5),
+ LL(0xb48396a0,0xf8cf3d39),LL(0x6ad6e8f2,0x1d89563e),LL(0xa602a006,0x91cd1395),L_(0x64fa2f77), LL(0xdbdaa433,0x0966d0a9),LL(0x8e0abebb,0x166bebe0),LL(0xf1b4da0f,0x433f9113),L_(0x8e2b6532),
+ LL(0x6fb1d5da,0xd89da757),LL(0x89f048e8,0x2939bdac),LL(0xa42134e8,0x6b13fefc),L_(0x792be7f3), LL(0xb37f662f,0x413f92df),LL(0x08daa37a,0x985c742a),LL(0x1de586e7,0x5f4904de),L_(0xe4507309),
+ LL(0x03906d92,0xb13c4090),LL(0x9f0f4106,0xf3affee5),LL(0x6830a295,0xb7fc1017),L_(0xfe0d1565), LL(0x45d24eb7,0xcb2d95c2),LL(0x02c21f5f,0x8c20bcd3),LL(0x3379e3da,0x6dc4634a),L_(0x5f5ffa94),
+ LL(0xaefdff78,0x97e82574),LL(0x2379777c,0x112d1838),LL(0x20061ca4,0x0060cd67),L_(0xc1751f60), LL(0x11499a1f,0x8b6913cb),LL(0x3ca5f64c,0x67ff5e86),LL(0x1680aa3a,0xe823c3ec),L_(0xdf7da52e),
+ LL(0xd3ac8a56,0xd2b4232a),LL(0xcd8aee6e,0x1b8abf52),LL(0x2fcb86b4,0x19bc7365),L_(0x2952fde9), LL(0xa051bf9a,0x1aec4d94),LL(0x79b4a51e,0xfbc4f986),LL(0xa954ceb9,0x05b104cc),L_(0xe0d3602f),
+ LL(0x40690897,0x4799ff54),LL(0x87dac4d0,0xbc95c209),LL(0xc0b5b3de,0x290686c2),L_(0xb3329cbb), LL(0xca443d1e,0x6b65747b),LL(0xcac2d9da,0xf2987b71),LL(0xf039026d,0xb9b37c0a),L_(0xb77496d3),
+ LL(0xd360d773,0xd81505e8),LL(0x271af0ca,0x40816745),LL(0xc9836e31,0x9dca53d3),L_(0x7227191a), LL(0xd820c040,0xb45d3f5d),LL(0x3bbb6420,0xedf3a3c8),LL(0xe0ce5e44,0x459a2236),L_(0xf815d523),
+ LL(0x35ffc3c2,0x273c8e42),LL(0xdda15d58,0xfecec30c),LL(0xda6a8389,0x8e8dc1c3),L_(0xc0bf1e23), LL(0x6fe132fe,0xc3565543),LL(0x707a3332,0x951334fa),LL(0x770ed88f,0x4d1d476c),L_(0x180fa694),
+ LL(0x20e67928,0x488e81fb),LL(0xd3aa63c5,0xd968afb3),LL(0xb0057d32,0xb8d04c1b),L_(0xabd57ea4), LL(0xee01ab83,0xef38d717),LL(0xe3ff770c,0x830deae9),LL(0xfba87128,0xbf20a3cb),L_(0x7a5792cc),
+ LL(0x15750d84,0x8d8facef),LL(0xec118062,0xef0f3af0),LL(0xd1a4206b,0x64ebf883),L_(0x6101aba7), LL(0x5b6d2c3c,0x3c48ef20),LL(0x2cb3a5ff,0x153580c5),LL(0x534ba912,0xa02f889c),L_(0xa1a92663),
+ LL(0x1f2a638e,0xcb233fe2),LL(0xd1e29224,0x792d0dff),LL(0x62d03b08,0xd6646af8),L_(0xcb6267fc), LL(0x4a8172cd,0x82199f97),LL(0x582165ca,0xf879213b),LL(0x8048de29,0x51bdf94f),L_(0xe7f10d0b),
+ LL(0x75f12d76,0x743c75d7),LL(0x4777a4a1,0xc13528c2),LL(0x0f8f0fc7,0x969b010e),L_(0x6365c47c), LL(0x2acbaab1,0xdfc6ee9c),LL(0xe207ebae,0x23ac352f),LL(0xc00ef611,0xdfc77ba6),L_(0x6470bbbe),
+ LL(0xd561d67a,0xac256d68),LL(0xbe1d04c9,0xb7f44d83),LL(0x1d8cc6f2,0xddd4acc6),L_(0xc01e2b00), LL(0x83d18ef1,0x6b5fbe51),LL(0xc673b3a0,0xe616da91),LL(0x04e7aef1,0x7079d8b4),L_(0x3313c1b4),
+ LL(0xc0f7d6a0,0x2242759d),LL(0xb6fbfcb4,0x9949d06a),LL(0xde898701,0x8b24618f),L_(0x5307474d), LL(0x3976254e,0xb0bd22ab),LL(0x211085ed,0x2125ed2b),LL(0xa5f28d83,0xa1c543ea),L_(0x565a6c4d),
+ LL(0xe7ee1b29,0xf2a06317),LL(0x3813d14f,0x784961c1),LL(0xf759d96d,0x5670b8e7),L_(0xb428b1ab), LL(0xafedb09a,0x8fbfe519),LL(0x478f19a0,0x7246a169),LL(0x7503e23c,0x23ac9af3),L_(0xd24790e7),
+ LL(0x87836e62,0xc31169c7),LL(0xbcb98921,0x111050a3),LL(0xa7810165,0x446bda32),L_(0x6ad438a4), LL(0xa876bcf9,0x32692fd4),LL(0xc750819f,0xd11e3c6e),LL(0xe2aece33,0xd325fefc),L_(0xb6f2bf6f),
+ LL(0x8c31bbfa,0x0e3623bf),LL(0xa2285b20,0xbb5c266c),LL(0xc5f4aaef,0xa7179b54),L_(0xdf6212eb), LL(0xed087187,0x375cb291),LL(0xd118abf6,0x047af635),LL(0x73198d27,0x8f1c0b06),L_(0xeac7c4ea),
+ LL(0x77e38348,0xc22c3ac3),LL(0xd0ae073a,0xea1c7779),LL(0xab8de890,0x8b9d1132),L_(0xb336a43c), LL(0x2a2fde97,0x78f20c5e),LL(0xf71fbefe,0xa11f0040),LL(0x302a6212,0xba7689dc),L_(0x6a6519f6),
+ LL(0x8c2d9e20,0x50cda9df),LL(0xb3180610,0xa6158df8),LL(0xadbbeaa9,0x4778c93d),L_(0xc891e9d3), LL(0xd1a49e0a,0x6eb6664c),LL(0x68d58278,0xb72ac28b),LL(0xb8fb2671,0xfc493918),L_(0xbe9a2c58),
+ LL(0xe846a0c4,0xc3ffb873),LL(0xf33f7123,0xd98b14c6),LL(0xcd3fcccf,0xec8c8522),L_(0xc0d09a5d), LL(0x2709309a,0xc435552e),LL(0x393794e6,0x731b5ca4),LL(0x6d3545bb,0xcf95c612),L_(0x21f92c49),
+ LL(0x67e83945,0x77e47a85),LL(0x8aaaa2f8,0x41b4a73b),LL(0xf14ab27f,0x45673153),L_(0xf95ee4e1), LL(0x29737736,0x3a31ee99),LL(0x3add55e3,0x89cb9a71),LL(0x3c610ccb,0x92d6ab9e),L_(0xa1df471f),
+ LL(0x24dd0313,0xfe3af3cf),LL(0x3ad69446,0x1fa695ef),LL(0x49e9da9d,0x35d8485e),L_(0x823de577), LL(0x1be78d4e,0x9a8e5ede),LL(0x535233c3,0xdb4e20a2),LL(0xb9902b0e,0x762073cc),L_(0xb355fbea),
+ LL(0xba8c73ac,0xfd983b8b),LL(0x0f082d41,0x3921c9f7),LL(0x9c6ee5d8,0x7f5a5177),L_(0xd9ef6090), LL(0xab53e7b3,0x7db07019),LL(0x14b4f4d5,0x01f9a8fb),LL(0x2588492a,0x9ea1e98d),L_(0xeb443742),
+ LL(0x31997789,0xa9a0407f),LL(0x4e820720,0x26fdd725),LL(0xa3068d9c,0x2aba0c14),L_(0x6db14c6a), LL(0x6d072830,0x2d5ed5c3),LL(0x0acce5d9,0x52b3241d),LL(0xdbd63903,0x11f4b8bc),L_(0x04c731fa),
+ LL(0x35994c38,0xccc2b918),LL(0xbc10285b,0xf27570ca),LL(0x870c688b,0x8c91a8af),L_(0x775fff54), LL(0x5459f2f6,0x9157cd7c),LL(0xc2e98dfc,0x021d9844),LL(0xdbbbf2c4,0x3319b3fc),L_(0xba743dee),
+ LL(0xaeba325f,0xaecdc264),LL(0xf477eda2,0x9b24587e),LL(0x859c1b6a,0xf7648c83),L_(0xb5c8f8dc), LL(0x7005a3f4,0xdf465967),LL(0x10b24908,0x2411ca0d),LL(0xd689abfe,0x1452c503),L_(0x625ecb92),
+ LL(0xcc290bf4,0xf34968d7),LL(0x9003a913,0x7228d7c0),LL(0x48e02e21,0x17e25b2b),L_(0xd5f95bbb), LL(0xa53a154c,0x1035d2b6),LL(0xac56a6bf,0xe8ab36c5),LL(0xbcf0eb3e,0x63fa883e),L_(0xdf08d138),
+ LL(0x0b53b1ce,0x2088982f),LL(0xe8ed9994,0x21364c97),LL(0x45bf87a7,0xeeb978c5),L_(0x5b94bef4), LL(0x4e53377c,0x093e9c15),LL(0x58acb871,0xd8249f4f),LL(0x02b46436,0x64f236ee),L_(0x88a9e12f),
+ LL(0x3940ee67,0x6164d05e),LL(0xf4a7c705,0xb0056da2),LL(0x872642d0,0xa7bd3d66),L_(0xa407f0cd), LL(0xce37f407,0xd8371363),LL(0x592b0f71,0x90362154),LL(0x009ca301,0xe59d0b2d),L_(0x3dd8f9c6),
+ LL(0xcf247be0,0x73b26b51),LL(0x31ef23aa,0xdf33ad4d),LL(0x1f6d55bd,0x4ed64955),L_(0x7ed356bb), LL(0xa18aee16,0x8ca23082),LL(0x82214ca5,0x20da76f8),LL(0x2453f147,0x4606958c),L_(0x3b5ee2c3),
+ LL(0x99950739,0x06b63065),LL(0xb845a47f,0x9853453b),LL(0x88e04e19,0x456e72cc),L_(0x05cfd664), LL(0xb168037c,0xd3c22f8d),LL(0xcaf525d3,0xd989f0f6),LL(0x9699fc87,0x273ac5b1),L_(0x0349e937),
+ LL(0x273a933e,0x24f52dc3),LL(0x825de5df,0x36bc3c34),LL(0x3e91b0cc,0x61de4790),L_(0x7a99b424), LL(0x8f4b678a,0x44bdcadc),LL(0x0a060400,0x830bedee),LL(0xbb9ac7e8,0xbda5fd11),L_(0xa71c4ee0),
+ LL(0x37a97135,0x079c1b7a),LL(0xac1ea75a,0xeaf11508),LL(0x3012e200,0x61b63246),L_(0xbb79e1c3), LL(0xc0246bd9,0xb92f89e2),LL(0x95a4a7cf,0x3fff4a96),LL(0x44cf1045,0x6e70ae3f),L_(0x5783bd56),
+ LL(0x6615d343,0xb3a83dd9),LL(0x5e8bc7ab,0x0c4c00f6),LL(0x6cbcc29c,0x84d9fe95),L_(0xaf97e676), LL(0x30e1885c,0x82a4da98),LL(0xbe563af0,0xbcc23ab6),LL(0x259db6ce,0x306cf56e),L_(0xa179a030),
+ LL(0x08624c7c,0x32c9c5fc),LL(0x37d48ba3,0x38295bfa),LL(0xfb49c594,0xdcfe3634),L_(0xc9dd0809), LL(0x832aec93,0xe5cda111),LL(0xebcbf38d,0x98fc1727),LL(0xac496bac,0x3f057842),L_(0xefc69a01),
+ LL(0x7bdd13e8,0x189dee30),LL(0xc45d637e,0x01cf6015),LL(0x02a07254,0x7f6053e7),L_(0x9648ef85), LL(0xc9d79b49,0xd467929d),LL(0x221a964d,0x2a4257b0),LL(0x3ed68c3c,0x0209a951),L_(0xbf635477),
+ LL(0xb50fa3a9,0x568377b7),LL(0x57a50eda,0x992fa9d6),LL(0xf3995e07,0xf09351e3),L_(0x21813534), LL(0xde00386d,0x7c21c039),LL(0x5bd67bbb,0x983e3f5f),LL(0x970f1581,0xfde7bb8d),L_(0x50e663c0),
+ LL(0xa5991d36,0x727713ca),LL(0x52a00363,0x81781a15),LL(0x946557d9,0x8b2de3fc),L_(0xce2f349c), LL(0xb61c0936,0xefe6ec67),LL(0x9c584327,0x0483381f),LL(0xbfd4710c,0x3cb8617a),L_(0x2e9c6a8a),
+ LL(0xfb2c55b7,0x83398c47),LL(0x00610b5b,0xfc55bdd9),LL(0xd6aad463,0x733b8806),L_(0xe6434da6), LL(0x600c9641,0x72a69c3e),LL(0xc959c3b6,0x25c8da00),LL(0xa863f55c,0x6b73f445),L_(0xb25ba2b8),
+ LL(0xb5811bfc,0xdea6b1b8),LL(0xc85bb876,0x6f29d6aa),LL(0x244c832f,0xb885707b),L_(0x700946f8), LL(0x19847d9e,0xbb7684f6),LL(0xf1284753,0xc0f2d53b),LL(0x20ef5736,0x9e06880d),L_(0x94cf829c),
+ LL(0x9a3cdc82,0x6fd2d1fe),LL(0xf6676bfc,0xfe48b29e),LL(0xa14e785b,0x7afeb3e3),L_(0x73a22b1e), LL(0x15c1eec0,0xdc5c271b),LL(0x738c09b5,0xd51bbdf3),LL(0x4095982d,0xea6a656f),L_(0x4e8a1c04),
+ LL(0x8df3827f,0xad96082c),LL(0xe21e88ec,0x0c7308d3),LL(0x747332eb,0x3e790568),L_(0xcbe74f24), LL(0xb410e2a6,0xa45bcc07),LL(0x62e28f16,0x34e11697),LL(0x68990fab,0xd0d95f71),L_(0x0bc4045b),
+ LL(0x2b70f4c3,0x95663747),LL(0x718a4989,0x18e76685),LL(0x0510d4ae,0xa806fc64),L_(0xb9f7725e), LL(0x74a39c46,0x11681c31),LL(0xab7986bb,0x7f1ee73d),LL(0xd70c5b25,0x145296c5),L_(0x8e746d97),
+ LL(0xb90e977d,0xa73e17c7),LL(0x914b838f,0x3b0459a9),LL(0xd910c80d,0x4a996387),L_(0xc7523409), LL(0x09cc1463,0x4ff007ad),LL(0x3feccef8,0x6f3bf601),LL(0x9137e94d,0x3d0461a8),L_(0x5dfeb98d),
+ LL(0xdf5e90f7,0x03f3fdc3),LL(0x3d7cbec2,0x2f05f4ba),LL(0xefe1e30f,0x5dab20a6),L_(0xb6114a8c), LL(0xfbe83a6b,0x815eac18),LL(0xbcc8bbc2,0x2c89a659),LL(0x13f75b6a,0x326a87f4),L_(0xda0c7f42),
+ LL(0x99fa6315,0x29c19e9b),LL(0xdf48509e,0x5d5a6ffa),LL(0x84d62c60,0x4e8640e3),L_(0x4a85f9d6), LL(0x01830a3f,0xa50855ff),LL(0xea7061d4,0xb9b3fb5a),LL(0xbf0727b4,0xa1cac932),L_(0x9c76f2b9),
+ LL(0x08fe3e55,0x7f8ba9f8),LL(0x3a13632e,0xfff3b260),LL(0xa621223a,0xda5b8cc0),L_(0x6cf87377), LL(0xb352cab0,0x52e875c5),LL(0xb3cb3de2,0x888687ca),LL(0xd159fefe,0x788f0705),L_(0xa3f5461f),
+ LL(0xe7ee73d4,0x71f9e278),LL(0xa10ec3f4,0x0511bea2),LL(0x147b2ef8,0x908389b2),L_(0xaf59635c), LL(0xb9505162,0x7ab5b1bb),LL(0x05d9bd3a,0xa16a5843),LL(0xeb15fb80,0x8840233d),L_(0xf2f61b05),
+ LL(0xfbf89124,0xb350235f),LL(0xa7d12321,0x601ae7a3),LL(0x487a5b44,0x168cfefc),L_(0x124de1e6), LL(0x27f1099a,0x3f7f4917),LL(0x387a3135,0x576cbe65),LL(0x93695572,0x1697b707),L_(0xe9cd239f),
+},
+/* digit=24 base_pwr=2^168 */
+{
+ LL(0x1aa93495,0x07822bd8),LL(0x98675e63,0x690a044f),LL(0x411c39e9,0xddfd5a23),L_(0x768594da), LL(0x5d8da0b0,0x74dcec38),LL(0x3c14e211,0xa51c46ee),LL(0x6b77f2b0,0x1367898a),L_(0x8ad0bfdf),
+ LL(0xd8b1efbb,0x5d75e9ca),LL(0x940ae4e4,0xdea9f60e),LL(0x7af3d6fd,0x95065ae4),L_(0xef0f21e7), LL(0xe0c7e801,0x22ced186),LL(0x9502622d,0xc6698d7e),LL(0x95367fa5,0x9310a67e),L_(0xc864dc25),
+ LL(0x7322a3b3,0x1b5b3f21),LL(0xe6b25a83,0x1fe6e87a),LL(0xcad2ee21,0xb5fd4e5b),L_(0xd772c552), LL(0xe5ae89d5,0xc2853eeb),LL(0xc45afb20,0x9036d2cf),LL(0xcb159584,0x45627827),L_(0x6e07de7e),
+ LL(0xf341190a,0x2470f5ee),LL(0x87e42cc7,0xf0be84fe),LL(0xade34d2c,0x90636c20),L_(0x0cf8cafa), LL(0x180fa04d,0x2db09b0f),LL(0xd896b5d9,0x0a0909a9),LL(0x83bcc559,0x281cf9aa),L_(0x4d7d88c9),
+ LL(0x38d6fee1,0x8f859667),LL(0x0e93537c,0x86559609),LL(0xca6e59bf,0x6854b4e8),L_(0x4c2e89d8), LL(0x23a24b88,0x5840ce8a),LL(0x6366e9c0,0x946b6bbc),LL(0x00fd3d85,0x8a095b45),L_(0x9e0c589e),
+ LL(0x74d544f2,0x4c355669),LL(0x4696a73a,0x1ea60e81),LL(0x099e116c,0xd960a70d),L_(0xea914344), LL(0xd60a4a5a,0x305faf07),LL(0x1026dbdc,0x61b80d24),LL(0xe6b8e5c2,0xd428e0cc),L_(0x2cd02a61),
+ LL(0x26d21296,0x5d2ed352),LL(0xf7a07ac1,0x3daf91ed),LL(0x44afa3c4,0xd529e7b2),L_(0xdd22a012), LL(0xd7ed0b48,0xcc9faccf),LL(0x00535729,0xc98aa7de),LL(0xc9757998,0xce2c4e14),L_(0xe8ccc048),
+ LL(0x098fc504,0x3d3f8532),LL(0x5cb9d339,0x50253fa0),LL(0x23d266c8,0xb38286d6),L_(0xe5172f5c), LL(0x99903093,0x48a64b98),LL(0x8c64987d,0xbc43643a),LL(0xfe159bd8,0x2f08eae4),L_(0x049c111f),
+ LL(0x5b31f9b7,0xc558d554),LL(0x0d2340eb,0xe3c46403),LL(0x19a6f592,0x2211131c),L_(0x4ef1dc2e), LL(0x4d8f19e8,0x8c4d4f34),LL(0x107caba4,0x347e8cae),LL(0xad36aa89,0x5a959e3c),L_(0x4495ae4a),
+ LL(0x178db2de,0x8674b5e1),LL(0x68e6ec47,0xce21dcf1),LL(0xd3884f45,0x7664513a),L_(0x60d36975), LL(0x7a1b3e57,0xc9e299e2),LL(0x8015c45b,0xe96de0f0),LL(0x8d3f0ffc,0x5aba434e),L_(0x448fc469),
+ LL(0x3206b5a0,0xbf15b53c),LL(0x0516d5b4,0x2fff52c6),LL(0xfec55940,0xc3791f65),L_(0x797a6b95), LL(0x394de0c2,0x5c5fed8c),LL(0xeba16248,0x674b4d58),LL(0x0e57743b,0xd7315975),L_(0x87252f57),
+ LL(0x7fa4f80b,0xc574aafe),LL(0x9e9fc1b3,0x25994c44),LL(0x15293405,0xa00f9231),L_(0xc2527f9a), LL(0xf98edea6,0xd0bcf974),LL(0xbe7b43fa,0xa3c74ad5),LL(0x448873ac,0x8ff67b2d),L_(0xf0dfe6da),
+ LL(0x510cb9a5,0xbaf15c58),LL(0xcabedab3,0x234a8faa),LL(0x0023d4d4,0x9d6e89b9),L_(0x8a188d72), LL(0x37485100,0x6bf4faef),LL(0x5f70a85e,0xdd164001),LL(0x799cb3ee,0xfc7797a7),L_(0xd331f4bd),
+ LL(0x34261e55,0xcf17aa4d),LL(0x7f8c3542,0x801ccc34),LL(0x0c7a04fa,0x762b3408),L_(0xd90eff09), LL(0x002ca132,0x0870f41d),LL(0x767451ee,0x70686201),LL(0x276eaa26,0xf592842e),L_(0x6a87509c),
+ LL(0xb78b71bd,0xa79ca9e4),LL(0x31d15ca5,0xe7aab4c3),LL(0x095aa863,0x980df4d9),L_(0x30800a25), LL(0x75ac5ed9,0xcc69d2f9),LL(0xee44fb88,0x429f98f1),LL(0x10ce7510,0x5736d4ee),L_(0x03cc9ae7),
+ LL(0x8da51d85,0xb2abe419),LL(0xbd89ecd4,0xefa624dc),LL(0xc275c72e,0x8b684df9),L_(0x0c47b707), LL(0x75f1bf6f,0xfc8f823d),LL(0x06225cca,0xa497166b),LL(0xb3363382,0x3241d9b6),L_(0x397d4140),
+ LL(0x9a65f284,0x47d0d598),LL(0xd2dae790,0x600f8097),LL(0xdfc5d530,0x06c1d340),L_(0x18b74aa7), LL(0x409b596c,0xe50cc47b),LL(0xb9309f95,0x71018c41),LL(0x4f9b2683,0x2de345b4),L_(0x73d97fe3),
+ LL(0xd352b3da,0xfb7e2c37),LL(0xd29b2279,0xfb5035db),LL(0xc27af22c,0xe5cf5a24),L_(0xdd8c403d), LL(0xf2e49e04,0x31c42940),LL(0xbe767afa,0xb3e476b1),LL(0x3130439d,0x729a7e6b),L_(0xcfb2c6fd),
+ LL(0x554fbba5,0x1228460b),LL(0xfba91910,0xda7db076),LL(0xf5e0be2b,0x8a989e94),L_(0xd04b5940), LL(0xe15aded2,0x56931b09),LL(0xe96ceb9d,0x7fb6175a),LL(0x36407d3f,0x785ad12c),L_(0x412c5e80),
+ LL(0x296e5cc5,0x6178d140),LL(0x9e4845c7,0x9088d05a),LL(0x1f9dc468,0x631396d3),L_(0x8b994c1d), LL(0x86ffc6ce,0x04f52e9a),LL(0x2ffa498e,0x4b21e0a8),LL(0x27375e3f,0x242c7c60),L_(0xd99a4851),
+ LL(0x064ca07a,0xa02c0b2b),LL(0x518bd6af,0xa1558503),LL(0x13a69d2a,0x3d67919d),L_(0x68b0b3b5), LL(0x2bfc83c0,0x3a653e93),LL(0x24e20cb0,0x69ae9c82),LL(0x0a4cc47c,0xf624d321),L_(0xeb72aa98),
+ LL(0x9e3e45d0,0xd947c8c7),LL(0x1032ccc8,0xa439634d),LL(0x5b100526,0x7b5067f8),L_(0x534219ea), LL(0xfc26652e,0x701d8d64),LL(0x1e89c3fb,0x277501f0),LL(0x262c9dad,0xd3dd957f),L_(0x48bd1e47),
+ LL(0x9f4be9d8,0xcf4ac2d6),LL(0x2a7df2ab,0xe04b6794),LL(0xf3257cbf,0xec24a41c),L_(0xf6596f8e), LL(0xb3eb3d14,0xcc1689ae),LL(0x7d52d65d,0x8712e8c6),LL(0xafd7b5e3,0x868af920),L_(0xb7ad63c9),
+ LL(0xd27017ec,0x75a3408c),LL(0x8af38290,0x7de280ae),LL(0xfab61ca0,0xb76f92d0),L_(0x9df539d9), LL(0x528c5329,0xffede226),LL(0x4363c147,0x9bf76d0a),LL(0x4d2256e2,0xdd96e876),L_(0xc1afd4ff),
+ LL(0xe00a0553,0x896685cb),LL(0x48da5f08,0xf0d4a520),LL(0xe8f5fdb6,0x0f380c61),L_(0xb146db8e), LL(0x4d63b6c7,0xca87cdad),LL(0xcfdcfe1c,0x69639e2c),LL(0x941d9935,0xed61f0e4),L_(0xad7751a2),
+ LL(0x72ebb947,0x43d0a9df),LL(0xdb90e6a7,0x53424333),LL(0x10a77134,0xdf849ce1),L_(0xce2f9c06), LL(0xdf56c5f4,0x58feabaa),LL(0xc5d546de,0x787ed1e1),LL(0xa802a275,0xa542b49b),L_(0xa5e7ea27),
+ LL(0x0646662c,0x33793ddc),LL(0xde0180db,0x873a716a),LL(0x3ae6c62d,0xd34ef5f0),L_(0x8ffbd17e), LL(0x9974e0c2,0x5b201375),LL(0x61aa17ae,0x25cf8d2d),LL(0xfac50e53,0xf5028682),L_(0x4cb76558),
+ LL(0x20822d1a,0xdb5b7f7b),LL(0x42e0c365,0x610bf8a8),LL(0xe4e5ddab,0x59f6f46f),L_(0x7d6ff0da), LL(0xd3a9f7a1,0x29ffdb56),LL(0x95d9dd8c,0x1aed0fa8),LL(0x7cd570f8,0xa1cdd0bb),L_(0xf42c2ded),
+ LL(0xb9d66a96,0xf9463b5d),LL(0x7ab3d377,0x9dcb5190),LL(0x7e8de98d,0x3a174474),L_(0xf096dc4f), LL(0xd8a6df5c,0xb00ae812),LL(0xc11335ee,0x595dbbd8),LL(0xab858cbb,0x20456b6d),L_(0x50149878),
+ LL(0x6e092bb5,0x4b66cf94),LL(0x20f71995,0x7eca44eb),LL(0x6daca5c9,0x44fbdf91),L_(0x06ba2abf), LL(0xcb39349b,0x9f292892),LL(0x5db8d756,0x7d2e1348),LL(0xb91c9d21,0x2511f796),L_(0x03664b0f),
+ LL(0xc742fe69,0xaeca436c),LL(0x07bb4010,0xa736c99b),LL(0x7053b3ba,0x4df3a08c),L_(0x7269f130), LL(0x35ff874c,0xa50437d0),LL(0xa2239752,0xbb3ee79b),LL(0x28f141d8,0xa309d53a),L_(0xe3b40a03),
+ LL(0x052107c2,0x4c1843ed),LL(0x92f03f51,0x5b395716),LL(0x10eeec3a,0x41bed6c7),L_(0xe7590252), LL(0xe3bf062e,0xe2632a75),LL(0x61293b51,0xccb37627),LL(0xf5482813,0x65bddca7),L_(0x3882b6c4),
+ LL(0x97f943de,0xe4f707eb),LL(0xaed3b2b2,0x1fca8433),LL(0xe200b711,0x5979d82e),L_(0x79d9de90), LL(0xa0864854,0x073f049c),LL(0x5ba6b65e,0xefca8545),LL(0x5e115ac7,0x81b25231),L_(0x811506c8),
+ LL(0x0b83214f,0x6e208498),LL(0x4f6ef89a,0xd7f17a61),LL(0x9d606b9f,0xf9ff6be9),L_(0x05c6d274), LL(0x78a1ebcd,0x8412a690),LL(0x1b349b3c,0x3fc39e84),LL(0xa4039f18,0x16cc85fa),L_(0xacd2b66e),
+ LL(0xb29dd0f6,0x3f372e07),LL(0xb2f85965,0x1010f76a),LL(0x499ca40b,0xc9d3a123),L_(0x494c1c41), LL(0x1a039621,0x898b067c),LL(0xc21db378,0x8fba57f1),LL(0x920244b9,0x2f20dfbe),L_(0xafa449b9),
+ LL(0xadba6514,0xf1db6fa1),LL(0x0a3087ba,0x780eff8d),LL(0x6530b59a,0xdcf21d60),L_(0xf6198373), LL(0x767463fe,0x65b13c4b),LL(0xff99e886,0xaf0f5939),LL(0xb10b6a9a,0x05c89578),L_(0x713231a5),
+ LL(0xae7f781a,0x678205ed),LL(0x46236fd1,0xcc32c0af),LL(0x2492206a,0x43d4ee55),L_(0xfbf9ba4c), LL(0x2296a220,0xd485f134),LL(0x17487172,0x7dae00fa),LL(0xd7fd8f23,0x9c357857),L_(0x48861bc1),
+ LL(0x683b4c53,0xd1014606),LL(0x084b9990,0x2de4b78e),LL(0xed10d363,0xe5547d1b),L_(0x3d2f5f09), LL(0x40cf618a,0x1fa00e4b),LL(0xf090adf3,0x2643b488),LL(0xa90cf1b7,0x862ff071),L_(0x7b03dffe),
+ LL(0x2c263fe4,0x3df3e881),LL(0x74c2dd8a,0x4a452825),LL(0xf8b4e248,0xff9860e0),L_(0x0632b8bd), LL(0xfaa7bd3b,0x4dcae86a),LL(0x6c838bca,0x0392152c),LL(0x8e97fa6c,0xfc62b042),L_(0x1616bf3e),
+ LL(0x38ca48d5,0xc8c6f843),LL(0xafab4216,0x1a5701ad),LL(0x8137a142,0x3332d11c),L_(0x073d30ce), LL(0xf65f8d03,0xc57e0eee),LL(0xc5ec9bae,0x84c4a8f0),LL(0x474d64c3,0x9a310ea4),L_(0x279cd2cf),
+ LL(0x90943f9d,0xabcd06f1),LL(0xdfc2230e,0x4bf7868a),LL(0x2460277b,0xf15a1c15),L_(0xe0531432), LL(0xbbc35210,0xa0084581),LL(0xff9171d1,0x8c12c483),LL(0x4461e279,0x2cb0b794),L_(0x18f08ce5),
+ LL(0xc6234888,0x1336960e),LL(0xd82f38a5,0x6690aec6),LL(0x8dcc7988,0xea8d5acf),L_(0xbdf09963), LL(0xad19e667,0x221a923e),LL(0x5ebdb79e,0x3d295ba2),LL(0x840fc746,0xa849c9c6),L_(0x95854d40),
+ LL(0x796ddb68,0x7f2ece47),LL(0xb700fc8f,0xfa40fdb7),LL(0x6e9b86f6,0x3753a599),L_(0x004dc14e), LL(0xb0d32904,0x9ce52e22),LL(0x9fb7c051,0x609b3582),LL(0xbd4bbc16,0x470387a5),L_(0xae8123ae),
+ LL(0xb5992b13,0x15e316ec),LL(0x34a4f3f6,0x331c37c2),LL(0x4f66d67c,0x5a547f8e),L_(0x3d89818f), LL(0x2343f37e,0xc7ecc98e),LL(0x464eaafa,0x2f36fbc0),LL(0x32fd452b,0xbcd300ae),L_(0x52cb6226),
+ LL(0x3965b7dc,0xfbb383d5),LL(0x8e1be53e,0xd5ddeb7e),LL(0x5de1379b,0x89236512),L_(0x1618ecf2), LL(0x71474c33,0x359ac63d),LL(0xad2f7a4e,0x6a2a41ed),LL(0xb41d45a2,0x4543bf02),L_(0xd97bbddf),
+ LL(0xdd45b155,0x51a93461),LL(0x835fa995,0x8e87a379),LL(0x6030bb55,0xe0f74319),L_(0x3fce8a20), LL(0x180c566c,0xf64d3bd0),LL(0xf4320f55,0x117f7e04),LL(0x9fe6d9b3,0x276cdeae),L_(0xe11e04e4),
+ LL(0x90d2c4b0,0x8ee8e755),LL(0x936a235c,0x34e9da69),LL(0xea446558,0x56f8560b),L_(0x868fe100), LL(0xf104982e,0x7a1b70ed),LL(0x2d932107,0x5df6c183),LL(0xb3a79a2f,0x3e690209),L_(0xddd8c4fc),
+ LL(0x506cdad3,0x1cd413bf),LL(0x8343be89,0x5af9735a),LL(0x4669ee32,0xf133df4e),L_(0x495a7ffd), LL(0x343b9134,0xd2df1205),LL(0x08509117,0xc0f593eb),LL(0xe1f7e724,0x03f70d2b),L_(0x56807867),
+ LL(0xe1aefce1,0x28e77727),LL(0x910ee9be,0xea43f71f),LL(0xb1afcd33,0xe72f4294),L_(0x04218f35), LL(0x5c609191,0xd85d4064),LL(0xe01905f3,0xd4734dca),LL(0xc6a7ed93,0x73444dba),L_(0xbd20eb77),
+ LL(0x786041c6,0x2e784b12),LL(0x3b8e5678,0xa5394485),LL(0xd5ed489c,0x7c1354f6),L_(0x37f214ac), LL(0x6f5aed21,0x04a2cef9),LL(0xfdcc232c,0x6a61903b),LL(0x0943ad59,0x74525b1c),L_(0x36735571),
+ LL(0x41295f9f,0x79058179),LL(0x53c2435b,0x8356b028),LL(0x8630275b,0x7d99704d),L_(0x22b975d5), LL(0xfe64fec2,0xb6ad9348),LL(0x1275938a,0x323c5204),LL(0xff571db9,0xabd2794c),L_(0x69883cf4),
+ LL(0x39e5ddd8,0xa00ac9eb),LL(0x0825e1a9,0x08022d52),LL(0xec00b4ca,0x89c305e2),L_(0x39410e3e), LL(0x2f6d8e33,0x1c9dee31),LL(0x189d73ba,0x063cbbc8),LL(0xd453f2df,0x500b8e1b),L_(0x200614c8),
+ LL(0x0d2d67f6,0x704fba9c),LL(0xe3b26afd,0x3b601782),LL(0xc86eeaf3,0x3a076280),L_(0xd5b4a74b), LL(0x057735bb,0x3c7fe621),LL(0x67519f38,0xba90bf98),LL(0x7ea681b4,0xc697f17d),L_(0x399fb8a8),
+ LL(0x2fb2d013,0x8b404954),LL(0x225dd20b,0x3864cc2c),LL(0xe8bf6c74,0x27928a4a),L_(0x0dbd4ced), LL(0x129459b4,0xb079e9c8),LL(0xcdaab48a,0xa8c506fc),LL(0x2be35d42,0xabd7b8a2),L_(0xc81bd43f),
+ LL(0x0c337ec0,0x9f5cd253),LL(0xb8d68d49,0x3bc3df03),LL(0x808378fd,0x57ce1b57),L_(0x7280fc5c), LL(0x9173aca9,0x29069aea),LL(0xec3e1405,0x172c5e75),LL(0xd7f9c6b8,0x2bb82de1),L_(0x7c6b6663),
+ LL(0x069b62dc,0x3a04b8c8),LL(0x539ec109,0xbb1fb7ee),LL(0x8e5dc130,0xdf0fbfa5),L_(0xd9cdb4bd), LL(0x8d6bb599,0xae962471),LL(0x8c98d809,0x6a0b5063),LL(0x1f5aad58,0xcb90fbe1),L_(0xbd8451cf),
+ LL(0x99c6500b,0x182ee0a7),LL(0xf250978f,0x9acab63a),LL(0xd7a3f799,0x579dffc7),L_(0x0a06a99d), LL(0x2e7244fa,0x7a563978),LL(0x780bf6d7,0xd9421c12),LL(0x4a33607f,0xca35ca5e),L_(0x4d6baab2),
+ LL(0x476c2c17,0x84dd3019),LL(0x1020ff66,0x9f6a9cbb),LL(0x8de41867,0xa0782cd2),L_(0x30b339ca), LL(0x335870d7,0x873bb057),LL(0xb2102899,0xd2763264),LL(0x817bb568,0xac61e5ba),L_(0x7167f834),
+ LL(0xb4216df4,0x28a00ba3),LL(0x72603953,0x8d18d559),LL(0x83dc382b,0x9929ba4b),L_(0xd887ba34), LL(0xc4acbdda,0x1a149f46),LL(0xabc8bd9c,0x03677afd),LL(0x7f382dd5,0x038b4fd6),L_(0x531a5b69),
+ LL(0x7b1469c6,0x770906b4),LL(0x29957782,0x39b76a30),LL(0xb757175c,0x77b00db2),L_(0xc63e688a), LL(0x00e5eb13,0x564b2b5a),LL(0x486048a7,0x16670a8b),LL(0x6cedfc0a,0xfc26f8d3),L_(0x158c04cf),
+ LL(0x5f72f036,0x492f15fb),LL(0xaf524838,0x8a57f34d),LL(0xca278cc2,0x136d3def),L_(0xf06989cb), LL(0x56bc1e3e,0xb7d079d2),LL(0x48aa5343,0xb849bec9),LL(0xc12eafab,0xf42c9064),L_(0xcdcc4178),
+ LL(0x35110b42,0x3593434b),LL(0x826b0084,0x2a685ee5),LL(0x38e7d616,0xd80d02e7),L_(0x3dd474b0), LL(0x47c0e164,0xa5dbbbef),LL(0x177aaf40,0x58c7a38b),LL(0x00b0f102,0xbe4a965e),L_(0x97ef9f54),
+ LL(0x00ea08ca,0x0a49eb36),LL(0xb9e97b18,0x4a5b799b),LL(0x1389e249,0x6bb607bd),L_(0x5f402141), LL(0x21dd6f71,0x648ac9f7),LL(0x0d6762ea,0x46ddb53b),LL(0x123f4a38,0x0b454608),L_(0xffc09d45),
+ LL(0xdc0b4f06,0xa26650ba),LL(0xc51c49ab,0x9623d15c),LL(0x52a5b5a4,0x8530847b),L_(0x9328fa21), LL(0x2b9634a5,0x88564796),LL(0x4c84e96b,0x8cd268e3),LL(0xdd09c6f7,0xfbbf3c6c),L_(0x6ae89ca8),
+},
+/* digit=25 base_pwr=2^175 */
+{
+ LL(0x076ba1e3,0xaf9141d1),LL(0x7d1bf374,0x90d62386),LL(0xeae39108,0x39ae931a),L_(0xbf9ff96f), LL(0x7c192921,0x51f12b8a),LL(0xf7008bde,0xf1cfbc62),LL(0xaa15f8c6,0x26ff0bea),L_(0x10e47e4d),
+ LL(0x5ac7dc32,0x5a5fa2f2),LL(0x727e3254,0x918f6160),LL(0x19e26cfd,0x3d611b68),L_(0x60d5395b), LL(0xfbe0d265,0xa4b3a16e),LL(0xc823108a,0xab7e3e37),LL(0xfb87b2d4,0xe4cf7a53),L_(0xa746dda9),
+ LL(0x28c21969,0xe6afbadf),LL(0xc63c394e,0x08d0d899),LL(0x79f622a4,0xfc61f01d),L_(0xbbd70173), LL(0x9afa4015,0x1819a677),LL(0x9acf1a59,0x9e89a4e9),LL(0xf6189381,0x4c306973),L_(0xf09c6806),
+ LL(0xd0fd8e2e,0x85f596e9),LL(0x8c824b93,0xc650d109),LL(0xc0ff364a,0xaa432f6b),L_(0xe94aff61), LL(0x60cd9ff7,0xa81387b4),LL(0xafe1dcb8,0x1fb57eae),LL(0x0f74dad8,0x77ebce28),L_(0x461e02cb),
+ LL(0xe7801dc0,0xc705f5f3),LL(0x19eba5b4,0x892e14fd),LL(0xee1d51c0,0x235f35c6),L_(0x32c28b10), LL(0xc690d3c0,0x496db46c),LL(0x35bd49b1,0xf95db976),LL(0xa0c8c115,0x3a2ff859),L_(0x347bf13c),
+ LL(0x21208e25,0x50a51554),LL(0x37fdbb13,0x76da2c79),LL(0x739f33c4,0x47f7655f),L_(0x5268d621), LL(0x6df3da72,0xda653a05),LL(0x63868730,0xe0dbba02),LL(0x7efefa7f,0x8546d123),L_(0xc050a28d),
+ LL(0x63a12c14,0x81bccb17),LL(0xb1d9c462,0xb8ad1f48),LL(0x2ee0f6a0,0xeca64ff4),L_(0x5d641bc5), LL(0x6c14c6a5,0x27d0478a),LL(0x3fb250a4,0x9dc8b9dd),LL(0xe6cf3269,0xde4a727b),L_(0xd5fdb843),
+ LL(0xe9139921,0xafcf2338),LL(0x6d85ee99,0x8626eb92),LL(0x330ff008,0x62bc5b8f),L_(0x75be09d1), LL(0x9ed3ab3e,0xacdfce8c),LL(0xfe5d4b90,0x198a1e99),LL(0x36ceed7d,0x366edc66),L_(0x88f5f0af),
+ LL(0x9eb6ef97,0xa0790c0e),LL(0x3c7a8752,0x8212d5cc),LL(0xa20f0405,0x2e6749a5),L_(0x52b0f123), LL(0x0b5bf3ab,0xf0598778),LL(0xad1df6a6,0x6b2a153d),LL(0xacd67e10,0x9a4287cf),L_(0xbc3d1a68),
+ LL(0x1df015e0,0x5545ae11),LL(0xaefec73e,0xf86d852d),LL(0x34894ebb,0x61b42915),L_(0x36e6b458), LL(0xb25bf6b1,0x2f858332),LL(0xa346bcfb,0x082b80c9),LL(0xa64fc13d,0xdb34263a),L_(0x5546d687),
+ LL(0x6c1819ab,0x46f4e2d8),LL(0xc8c8ebfb,0x3e6d5834),LL(0x31b5f8c4,0x0471eabf),L_(0xb0372dd8), LL(0x7377bdb2,0x4f0b793d),LL(0x1491549c,0x1e0b124d),LL(0x8be72522,0xcb228953),L_(0x28f9ea46),
+ LL(0x3d345d7a,0x4e4eb11a),LL(0x6b6a8f36,0x4f7cb301),LL(0xd3f60831,0x9b37cac3),L_(0x2fa1e5ac), LL(0xd42ac14b,0x4b82b6e1),LL(0x44efee99,0x062085e8),LL(0x293aa2ea,0xdafbaa02),L_(0x22eacbf0),
+ LL(0x66dc4353,0xeee6c065),LL(0xf4fb584f,0xe974bd6a),LL(0x51129e57,0xc6e911b2),L_(0xa817dc5e), LL(0x143fbbc1,0xe567aa72),LL(0x474c4763,0xd98a2bac),LL(0x985f3567,0x4940de3e),L_(0xb5a6e769),
+ LL(0xabba8dd9,0xbc9b4d54),LL(0x51333936,0x09ce7445),LL(0x56df5156,0x869985ec),L_(0x7ef1c4c4), LL(0xd64936f2,0xf9f4dd90),LL(0xb6f830f1,0xb0502e70),LL(0x9b4a0a61,0x2b7784e2),L_(0x5d8609f5),
+ LL(0x228b551b,0x132cf6ee),LL(0xe485fe61,0xb41622cd),LL(0x1166f594,0x4f82b870),L_(0xef156ec2), LL(0xc4a0434d,0x1f3f48d6),LL(0xc59ea2a2,0x185bfa1f),LL(0x0549b016,0xab597880),L_(0x88e57344),
+ LL(0x7783a237,0xcacbfea9),LL(0xa7d644dc,0x37384da2),LL(0xd767d6c6,0x1b40ecf0),L_(0x708738a4), LL(0xcb35e136,0x1bdb10dc),LL(0x946bff60,0x51f82512),LL(0x032e4873,0x86fff3dd),L_(0x4a72093c),
+ LL(0x993762c0,0x3c5e8711),LL(0x97ea967e,0xc3fb58ec),LL(0x5942a654,0xdc39e05c),L_(0x51f715f7), LL(0x4c7c1a58,0x76f183b7),LL(0x24b588e9,0x02f3f5a3),LL(0xc7635031,0x95a5b1bf),L_(0x90ff5787),
+ LL(0x44aeebfc,0x6fdec0d8),LL(0x3c09be94,0x4dccb72c),LL(0xc61c3dc6,0x29d98bbe),L_(0xe68c7671), LL(0x0b4d124d,0x60e1bdf3),LL(0x72ff08f6,0x60907706),LL(0x502b0c26,0x52fb8b7c),L_(0x3862b07e),
+ LL(0xa0c27cd3,0xa30b225d),LL(0xd6902dc0,0x14e5e016),LL(0x90beb6db,0xca71c799),L_(0x63380a26), LL(0x6406e7a3,0x8b449af9),LL(0x785b17f6,0xd95a3673),LL(0xe83116d2,0xc945cb30),L_(0xcbad56e8),
+ LL(0x195a49f2,0x19bb9a9f),LL(0x32abbd2d,0xdd63e900),LL(0x32a666f4,0xbb5bae80),L_(0x8a8b981b), LL(0x71975391,0x7200d75c),LL(0x58755037,0x9bb8f1f0),LL(0x34371f37,0xd14c5988),L_(0x4f91cd94),
+ LL(0x330b4d2d,0x4766d5c5),LL(0x29100509,0x96d443b1),LL(0xb683d913,0x55cd4038),L_(0x60386c8a), LL(0x0b19d842,0x4de7c5cc),LL(0xe7f655d5,0xb34627f5),LL(0x63d637ee,0x05d48e84),L_(0xda1b6f68),
+ LL(0xa9ab961e,0x587b4227),LL(0xaee0b38f,0x9bacdb2e),LL(0xf2fed11b,0x4327e6c8),L_(0xd04d5cf3), LL(0x59f2340b,0xdae690d8),LL(0x98397f13,0x20f9a82b),LL(0x04266881,0xb60ba27e),L_(0x0a08356c),
+ LL(0x4b7ea199,0xf7bd165d),LL(0x00c43b16,0xaff22d2a),LL(0x6e2c180a,0x5fa28be1),L_(0x03759f7d), LL(0x8d8de81a,0x8623fa12),LL(0xd1bcd513,0xf1b013b3),LL(0xecdeea2c,0x1412065d),L_(0x4abdd176),
+ LL(0x949b80c3,0x9e45f562),LL(0x91bfead0,0xeacf4d8f),LL(0x89e47023,0xed86f825),L_(0xe474eb17), LL(0xa46549d4,0xcc9d20c3),LL(0xbb6f6ac8,0xb5aaafc7),LL(0xaad820ff,0xfa9b0b7b),L_(0xd5d711cd),
+ LL(0x56a19c65,0x694699c4),LL(0xa52b01ba,0x2172bedc),LL(0xfcd8d182,0x71a622e6),L_(0xc5676308), LL(0x096356a4,0x5df0e982),LL(0x5f771127,0xbff93f13),LL(0x15499fe5,0x035d8bec),L_(0x54511618),
+ LL(0x8665d51a,0x0b392d7e),LL(0x19051cb5,0xda3e7314),LL(0x27724fe5,0xb0000497),L_(0x180fd98b), LL(0x92676515,0x86de4867),LL(0x0724b0c4,0xbfb7e396),LL(0xc9127734,0xec308376),L_(0x69d91fa4),
+ LL(0x13351e01,0x9ee3edde),LL(0x12d31182,0xe9b0df44),LL(0x039a9289,0x3ba48603),L_(0x776fb73e), LL(0x1bc5a4ee,0x28dbe0e2),LL(0x5d6f8bfe,0x33d13a46),LL(0x683a466a,0x6f0e40d3),L_(0x64598a06),
+ LL(0x49b1e543,0x5467b60c),LL(0xdafb9975,0x63a775bb),LL(0xf10e3ad8,0x555978a5),L_(0x90e960a3), LL(0xe2647c34,0x2d98173b),LL(0xeca130de,0xa46de612),LL(0xd4d665e8,0x8c2f942e),L_(0xd46cdc7a),
+ LL(0x83f96958,0x11159549),LL(0x2f2fe4fe,0xa26fb69f),LL(0xada04407,0xe1ffa9b1),L_(0x89077bf7), LL(0xf63dc16d,0xb8212592),LL(0x23757f3b,0x8f2b706f),LL(0xa84d6d60,0x0952d255),L_(0x867adb63),
+ LL(0xc1ad35d0,0x8063b121),LL(0x94420770,0x2c69c142),LL(0x2eddbe16,0xe20cbf04),L_(0x610d35ad), LL(0xc6a6486d,0x5f1b4348),LL(0x8963cf0f,0xaa7af662),LL(0xbd211312,0xf09747fa),L_(0xa7462c1b),
+ LL(0xb3384571,0xad4b300b),LL(0xeaf252a1,0x7e0408a9),LL(0x92c8f393,0xcdb75950),L_(0x95152482), LL(0x01c71c43,0x98806233),LL(0x65895709,0x4ccfab0f),LL(0x2c91c51d,0x0daddeb0),L_(0x6e5994f0),
+ LL(0x1656bed2,0xf9475d4e),LL(0x7ad0e424,0x29f67636),LL(0x71b2886d,0xce5ffc47),L_(0x5aec9cfb), LL(0xed19aefe,0x00fbe22e),LL(0x335636b3,0x1a593c52),LL(0xed7635e4,0xfea5dbc5),L_(0x0713b394),
+ LL(0x0a800d8a,0x3e952cbe),LL(0x96ad939e,0xb849574d),LL(0x95e45fa4,0xd0b6f06f),L_(0x495cdf6f), LL(0xca47bacd,0x3aea6517),LL(0x627d416e,0x98d62545),LL(0xf79f468d,0xe75cf2cd),L_(0x3f4c786d),
+ LL(0x92cfaed9,0x8aa22d94),LL(0x5767542d,0x951cb3e9),LL(0xcdf3e590,0xc6443f1d),L_(0x926947a4), LL(0xa83030be,0x4ab4bb2e),LL(0x1ac42dc6,0x126bf8d3),LL(0xab5c4613,0x78abc625),L_(0xa11b8fa6),
+ LL(0xb14045ea,0x75f0192a),LL(0xe56f26d4,0x66a1d69e),LL(0x488c7367,0x27671771),L_(0xe2f663dc), LL(0x41dc68c9,0xdbf2b527),LL(0x67ba17c4,0xaa6e15c1),LL(0xc052c755,0x6264eb14),L_(0xef0af1f0),
+ LL(0x361df88e,0x8133758d),LL(0xedb54b06,0x89d87e0a),LL(0x8313147e,0x156564f5),L_(0x0efd3686), LL(0x0305e3bc,0xb530ebe1),LL(0xd1426de8,0x75ed509a),LL(0xe3da205e,0x8810aa6d),L_(0x6d66996f),
+ LL(0x66bf33ae,0x5cdc1d84),LL(0x297ed94e,0x40fff510),LL(0x02569cc0,0xa46f7fa8),L_(0xf6c9bcc5), LL(0x03ae7466,0x6ca8cba2),LL(0x102909c9,0x9d34e4a3),LL(0x338f15f5,0xf175cde9),L_(0x9415a0f5),
+ LL(0x43fb29db,0x0f113fed),LL(0x55f28334,0xc9bc3623),LL(0x0891f557,0xf2de428e),L_(0xc85b958a), LL(0x72c78285,0x0bca6469),LL(0xfebcc59d,0x4ad07f91),LL(0x9aca547e,0x254d2e0c),L_(0x934ecc4a),
+ LL(0xbedf71c8,0xfdf235a0),LL(0xc42e06f8,0x707d37d4),LL(0x519516e4,0xb70d0d1d),L_(0xb746501f), LL(0x026e2e99,0x7b9cd555),LL(0x97c86a72,0x05a8ce5e),LL(0x490bbe2c,0xfd0ac7d5),L_(0x0e861b77),
+ LL(0x4518decc,0x5704b61f),LL(0xe3a1e11b,0x05e3a6d3),LL(0x761243d0,0x09fdcc95),L_(0xa10f1bbc), LL(0x52cc9710,0x2f40eec4),LL(0x45b65061,0x3cfbc5b3),LL(0x82e0b382,0xd24582c3),L_(0x0ea8545f),
+ LL(0x91b73502,0x63a13aee),LL(0x32b2623c,0x64a186c4),LL(0xd30674ab,0xae849f85),L_(0xc2109747), LL(0xbd3a7bd9,0x4e22b52c),LL(0xa5ad1cda,0xdee6130a),LL(0xa16934a2,0xa208c2f8),L_(0x29c61250),
+ LL(0xacddc899,0xdcfd6055),LL(0xaf5f3b40,0x4226123c),LL(0x22c7c6d7,0x18caa3b3),L_(0x11d8af8f), LL(0x27a1cc64,0xcfd9c842),LL(0x74dfaf98,0x435cc5af),LL(0x98cdd25d,0x03338f7f),L_(0xa8a15bc3),
+ LL(0x39e40f6f,0xa3f28110),LL(0x10846ecf,0xbb9b4a37),LL(0x6d2f9be1,0xc7ef39dd),L_(0xe4358a6b), LL(0xb0848ac1,0x9e6a4583),LL(0x0c20b047,0x65ecc897),LL(0x7961633c,0x12939ce7),L_(0xd7729b06),
+ LL(0xdf1e1998,0x0eb1a850),LL(0xbf310ff6,0xcfe64a90),LL(0x6d23295e,0xf848ec96),L_(0x96ccdfe8), LL(0x8a058164,0x4a1159c7),LL(0xfb67d66c,0x145557f8),LL(0x44e87592,0x744a6684),L_(0x93329250),
+ LL(0xd2524bb8,0x71ee45c1),LL(0x3c745d69,0xae2e62f4),LL(0x90655f39,0x4aa6dd85),L_(0xa8f50bcd), LL(0x170e2564,0xcd77d544),LL(0x84a26aa1,0x1637c5b9),LL(0xbbddebd8,0x116cc13c),L_(0x316cea62),
+ LL(0xda76037b,0xe567b31a),LL(0xc3337684,0x81454a31),LL(0x8ce526e9,0xa68887d1),L_(0x5860c2ac), LL(0x5ccae9e8,0x2aa4281c),LL(0x3740c0a4,0x27a06af9),LL(0x67a8cecd,0xb0666bd6),L_(0x8396d5d6),
+ LL(0x3bf215ba,0xf3b762b4),LL(0x2c7b4d47,0xc7ded91d),LL(0xf2dddefc,0x491f86d1),L_(0xe72784c3), LL(0x1a33ec17,0xbfa502ae),LL(0x6ff1a28d,0x8b90c1c4),LL(0x011d4fdb,0xae49e966),L_(0x6e8a2219),
+ LL(0x30030ab8,0x9b2323cb),LL(0xc742f24d,0x3dfca102),LL(0x6d677f76,0x615cef3a),L_(0xcc62a7bf), LL(0xd8927085,0x143864e2),LL(0x68578492,0xe2a53ef4),LL(0x7bfce607,0x98d95aec),L_(0xa4e64436),
+ LL(0xe4480a83,0x674699df),LL(0x638814de,0xf6bd5725),LL(0xa3bae3b5,0x93074bef),L_(0x401bd027), LL(0xc278e6d9,0x9075dc94),LL(0x33a4f7b4,0x66f70e53),LL(0x2912d169,0x77ae21bf),L_(0xd08ac30b),
+ LL(0xba0002d7,0x9d21da23),LL(0x313a021b,0xc9cb3757),LL(0xc0b1cdab,0x478c82a0),L_(0x71e210e7), LL(0x708a627d,0x95df97f0),LL(0x8f2e6f2f,0x036873be),LL(0x9b0c552c,0x31bdcc00),L_(0x7142f468),
+ LL(0xdb1b2797,0x16f6892d),LL(0xd070a81f,0x513e742c),LL(0x83e7ad99,0x5ba54190),L_(0x580b098a), LL(0x3ab45169,0xd55025e1),LL(0x9e175afe,0x57264580),LL(0xa5b527ed,0x246fe503),L_(0x27cfca13),
+ LL(0x9456aa99,0x72287d14),LL(0x56f44c80,0xbd98da02),LL(0x783e5a79,0x1c038840),L_(0xd6a90a4a), LL(0x44dd9215,0x8abbd0fb),LL(0x42622308,0x546492b7),LL(0x9365b6f9,0x638f9886),L_(0xd87dec07),
+ LL(0xe568c53e,0x56dd3ec8),LL(0xecec272c,0xad2418b1),LL(0x40cc9856,0x5fe0c00d),L_(0xd88d5b28), LL(0x1cdd7256,0x17304349),LL(0xa2eb70d1,0xe17ec8e0),LL(0xb4dc2a26,0x62eb4c57),L_(0x3373155f),
+ LL(0xdb4ee5e1,0xa85ff057),LL(0x2cbbaad9,0x0fb19074),LL(0xf1a5850d,0xb1c8c20f),L_(0x4ceec839), LL(0x407175d6,0xc25f5ad9),LL(0xc43bdd2a,0x0ed43d06),LL(0xa2739236,0x55db40b6),L_(0x59afdd51),
+ LL(0xbb91225b,0xb6ec7895),LL(0x64957b33,0xec277689),LL(0x53e7c8ad,0x503d01fd),L_(0x14800e2a), LL(0xff30aa1c,0x789118fb),LL(0x6b208671,0x45dce70d),LL(0x7758b97b,0x2ad05594),L_(0xbd833a82),
+ LL(0x64d25f39,0x7c1271cb),LL(0x973eb35d,0xafba6d12),LL(0x24a4fbdb,0x68588b5a),L_(0x86209415), LL(0x4408d2f4,0xb9962d65),LL(0xa7df2cdd,0x1adff958),LL(0x3e504930,0x1a7248ef),L_(0x642fcd83),
+ LL(0x50371a5e,0x10a09de0),LL(0x585cdc97,0x544a1f87),LL(0x05603976,0x9bb49da7),L_(0x36e0a9f7), LL(0x2686c471,0x22de25c7),LL(0xfc3ec645,0x7b318aad),LL(0x0e37c5eb,0x6e0af008),L_(0xb0fdc095),
+ LL(0xc4103bda,0x28c77b28),LL(0xc7d3392d,0xc44c9d87),LL(0x02942cad,0x045b3511),L_(0x633d355c), LL(0x985fde91,0x3e691e0d),LL(0x0d200049,0x66200341),LL(0xa7fa897a,0xc1b7c5c2),L_(0x5183d651),
+ LL(0x858b20b8,0x94f1ad67),LL(0x73a3848e,0xcb454e18),LL(0xe75e697e,0xea8630aa),L_(0x0d245b82), LL(0x7a69400f,0x7d8e1f8e),LL(0x1a8975af,0x87354e0a),LL(0xd949265a,0xddd78248),L_(0x59506113),
+ LL(0xbb95794d,0x56456f06),LL(0xb1cf847b,0xb5869a96),LL(0x7de9cd89,0x4dd26048),L_(0x29abee0d), LL(0x6b7c47c0,0x3a2f738b),LL(0xdc3e8b24,0x43a158b5),LL(0x6452e6ec,0xb59a08ed),L_(0xdca422db),
+ LL(0xfd294203,0xd446ba91),LL(0xb382c52a,0x0bfb0e2b),LL(0xb347e482,0xda5432f0),L_(0xc465aa05), LL(0xda7568f3,0xfd584f1c),LL(0xb3f81a8e,0x3e5b388d),LL(0xfbef98fa,0xa2090daa),L_(0x7ee59c28),
+ LL(0xebc6de85,0x8601a460),LL(0xa197c14a,0x0fe7b2f4),LL(0x51718d1f,0x768e05f3),L_(0xd61640e4), LL(0x107bee82,0xdafff971),LL(0xd549077c,0x775aa266),LL(0xf5af9168,0xa74ac1aa),L_(0x709e0299),
+ LL(0x7770d24d,0x6c27e8ad),LL(0x5f6805b9,0x0c21256b),LL(0x5eb3480c,0x24df253e),L_(0x33b3350b), LL(0x32c4c951,0x304257df),LL(0xd07bd3eb,0x3821aab8),LL(0xcfd48043,0xe9ed7945),L_(0x29f131a5),
+ LL(0xf927be41,0xa625fc39),LL(0x0acd5378,0xc708ccff),LL(0xc7c05c00,0xe3551df0),L_(0x5a9c25df), LL(0x4a824ae7,0x00aff255),LL(0x3fad48ea,0xdc1865b9),LL(0x489f78db,0xc47678ec),L_(0xe24fe1d5),
+},
+/* digit=26 base_pwr=2^182 */
+{
+ LL(0x4d52ad99,0x44075a5f),LL(0x49de85ac,0x5f264197),LL(0xa5da6ace,0x1bd94b24),L_(0x58ceb7a8), LL(0xaddbfb85,0x9deccfa5),LL(0xeb853c9e,0x38b0cd4c),LL(0x0ae5bd28,0xcdefc743),L_(0xefb92de4),
+ LL(0x9f68d2fd,0xdb80636b),LL(0xeb6a625d,0x399cbe21),LL(0x058ae3aa,0x9a20e964),L_(0xeefd7139), LL(0x0655d447,0x82be9278),LL(0x76a67bb6,0x02a07951),LL(0x78c7207b,0x5473af3e),L_(0x5b501b3b),
+ LL(0x48532008,0xe1daa6d9),LL(0x9dfa0916,0x8ffcdbb0),LL(0xbd0a98e5,0x9b2bdde3),L_(0x5bcf0ad7), LL(0x58bd4135,0x4dcdfb2b),LL(0x913a8546,0x29153442),LL(0x7457124c,0x9190c343),L_(0xc113bf67),
+ LL(0xe34c46c8,0x1a8f4562),LL(0xb45aadf5,0x6cddda1d),LL(0xb1bb8fc9,0xa502ea7e),L_(0xf3ae0efa), LL(0x9421a0ec,0x124b21a9),LL(0xa80fcb58,0x634ea314),LL(0xfc9b2b69,0x4d2d4d06),L_(0x619c1654),
+ LL(0xa4e345b7,0x370847bf),LL(0x9d1ecec7,0x242713b8),LL(0x10782ff2,0xbc286c44),L_(0x2b85247f), LL(0xbe6fa012,0x72197eb9),LL(0xec864a68,0x23d8a845),LL(0x9c366368,0xe57509e0),L_(0xfafe2bf5),
+ LL(0x9344ebd5,0x41626ac2),LL(0xa5a7b2b3,0xb61e001b),LL(0x1c404975,0x05deb3c3),L_(0x4861d13f), LL(0x10e30e7a,0x4f5429b7),LL(0x409e441f,0x0cc2b3bc),LL(0xe64edacb,0x2a32f215),L_(0x502743d8),
+ LL(0xa18ec5e4,0x597408da),LL(0x75198a41,0xb4dc90d0),LL(0x9e4003b1,0xf0377012),L_(0x97c24d6f), LL(0x2f737bfa,0x138b7393),LL(0xc6646756,0xbf91bb7c),LL(0x4390dd24,0xd3eb9506),L_(0x660fe2be),
+ LL(0x1f5f9c09,0xcbb88522),LL(0xde4f8a6e,0x590e948c),LL(0xd63bd64a,0x45a94350),L_(0x82568ecb), LL(0x8b9c0e80,0xc46a6c09),LL(0xe8dd7862,0xe5cb409e),LL(0x6aa2f787,0x90fd8928),L_(0x3c0fb202),
+ LL(0xc519de27,0xc3ac3715),LL(0x59e082f8,0x915329a3),LL(0x0ca44fa0,0xe61346f3),L_(0x590df3a0), LL(0xe4d76c98,0x37f7afee),LL(0x58d6ab1b,0x6bdfe1fe),LL(0x536926c2,0xc048c2a4),L_(0xdd33cbc7),
+ LL(0x57103467,0x9e779a72),LL(0x24aafef8,0xf0cf02a3),LL(0xc4a65bf2,0xc464a2f5),L_(0xcc014eab), LL(0x771064c4,0x545f80d2),LL(0x90630a3b,0x142107aa),LL(0xc2378a52,0x233fc912),L_(0x60b64ae1),
+ LL(0x2c57b6ec,0xe31036a2),LL(0xf8434ff6,0x18945c37),LL(0xa0a4a4f0,0xa70971ce),L_(0x2a1d924f), LL(0x78d2269f,0x3f54f031),LL(0x59b13396,0xd1a3f071),LL(0xcf63943b,0x1bbad8a4),L_(0xae570fbb),
+ LL(0x7535f2cf,0x2202c2ff),LL(0x6ed5c874,0xad072699),LL(0xc576098a,0x233792b7),L_(0xbaf56f3f), LL(0x58643430,0x02886c17),LL(0x64569bb7,0xb1a39466),LL(0x74bab9ee,0xe841def5),L_(0xc973e3bc),
+ LL(0x7f584615,0x0ec350c2),LL(0xca028343,0x2da65635),LL(0xb160863f,0xe9a43081),L_(0x72084a70), LL(0xce3663d1,0xafbf1395),LL(0x1aeb19b6,0xdfa06d4c),LL(0x9aa85d56,0x4f103987),L_(0x4f14057c),
+ LL(0x7df657ba,0xf5ac31c8),LL(0xd4e08231,0x1a02ac9e),LL(0xd28fa99b,0x6407f45c),L_(0x36b31d91), LL(0x06494082,0xe60e26a5),LL(0x03bcc061,0x44cfce93),LL(0x4db05d61,0xf189ccff),L_(0x635d166c),
+ LL(0x16a82c08,0xd179a921),LL(0xec3df3ad,0x51227dd3),LL(0x1d15b312,0x129de8ff),L_(0x99a2081f), LL(0xe117dd1e,0x3f1a519b),LL(0x669c965d,0xd473a86e),LL(0xe470bd93,0x48ca17dc),L_(0xd7172ef7),
+ LL(0xce23cb90,0x025cce52),LL(0x54ac5788,0x7128e28e),LL(0x60a7af16,0xee37af3a),L_(0xd328cf8c), LL(0x228c1194,0x8bcaaced),LL(0x7eb8e5dd,0x60835723),LL(0x5f7c29e2,0x42db013e),L_(0xd6e3c26e),
+ LL(0xd7266cda,0x5ce7356c),LL(0x31f3b95f,0xc0bdd70b),LL(0x086e72f7,0x3319c072),L_(0x7f9cf187), LL(0x4ae3ba6a,0x086343f9),LL(0x85584e27,0x80bc2aba),LL(0xbf3ecc51,0x37cadfe3),L_(0x10a2f1b8),
+ LL(0x66dd80da,0x32cd82a6),LL(0x5a4759b6,0x11e8daf7),LL(0x6268a0b4,0xbd297ce7),L_(0x554b93e1), LL(0x971bdef9,0x8c4eabfb),LL(0x5bdd9c55,0xcbfa339e),LL(0x83d9f14e,0xbd36bd3d),L_(0xe88e0095),
+ LL(0xe3a86075,0xf0d2a9f0),LL(0x7ea9a94b,0x68a87b41),LL(0x27fad851,0x465da389),L_(0xc79beddb), LL(0xa438dfad,0x1024a804),LL(0x9e4004c2,0x3e3b2c82),LL(0x9e904c3e,0xb0cbbf5a),L_(0x91364ced),
+ LL(0x4f3cafc8,0x4571821c),LL(0x05a71822,0xb59cdc87),LL(0x564a1eff,0xd3fc8e11),L_(0xc2522075), LL(0x210954cd,0x485b3e16),LL(0x3e42143b,0xa39a864f),LL(0xc71b961e,0x50587567),L_(0xcd472e0f),
+ LL(0x3f39a45b,0x39ff9b1a),LL(0xb67c7e0c,0xe9320256),LL(0x293c62a7,0x30d60ad1),L_(0x6c70033e), LL(0x51699001,0xecc36d79),LL(0x66761810,0x782811c0),LL(0xb9b6100c,0xd4aec2a8),L_(0x01fd70b0),
+ LL(0xbf6700ba,0xdb67bc3c),LL(0x0705c260,0x81a05a44),LL(0x2a63deb4,0x2c00d649),L_(0xb057ad61), LL(0xc429bae3,0x962a325d),LL(0x94f128db,0xf818f010),LL(0x07c3cde9,0x8b0fa963),L_(0xb0a83496),
+ LL(0xdcf6f7fd,0xd9cd3792),LL(0x63f97d0d,0xa1b3479f),LL(0x9daa99a0,0x6b0d6566),L_(0xe8984ec2), LL(0x448838bc,0xe794fda6),LL(0x82c274f4,0xb6b1fe7b),LL(0xc0cb0a63,0xd09a8df9),L_(0x17a04bc3),
+ LL(0x4c395b4f,0x8e70bc90),LL(0x4ee87155,0x04b3e852),LL(0x9d40e63f,0x4a2dc6ce),L_(0xfaef51af), LL(0x36339e47,0x385a4594),LL(0x20622007,0x455a09ad),LL(0x9304dd88,0xc6ff5bf9),L_(0x913f4764),
+ LL(0xe085cdf8,0x187b4002),LL(0x185e6ba2,0x4c4e720e),LL(0xab690dee,0x86287cf7),L_(0x8afd2d78), LL(0xe2c63b4f,0x9adbcac5),LL(0x7132999e,0xddd28bc6),LL(0x4248e502,0xef074338),L_(0xfa2e3db0),
+ LL(0x896670f4,0x08020d96),LL(0xfcabc640,0xe06c4b5e),LL(0x9786e6bf,0x3da82523),L_(0x3d688833), LL(0x4fe3491f,0x99758e3b),LL(0x5ec531f3,0x0c3b82b5),LL(0xbab9fec3,0x45c4baf6),L_(0xb5f6610c),
+ LL(0xb5a9a1e0,0x4e7e7ab2),LL(0x1b52980f,0xce6cd002),LL(0x7c86bb7d,0xcadc14a3),L_(0x3b8e5f2a), LL(0xbef7e6fb,0xbff62993),LL(0xccd76ec4,0x0a2850cc),LL(0xc5820cdd,0x92bdfe5c),L_(0x082f1255),
+ LL(0x484daaef,0xd799a2f4),LL(0xedb03630,0x550daad0),LL(0xef0ac41a,0x8fbf8f4e),L_(0x737b2d81), LL(0x84f7e137,0x7bdb6e8f),LL(0x34c35ad6,0xd89df99b),LL(0x395821cc,0x20d76719),L_(0xc88df817),
+ LL(0xae387d39,0x760e59a1),LL(0x688c2755,0x97e8f74e),LL(0xbc044138,0xa21350e4),L_(0xc028fc40), LL(0x0253354a,0xe3e6583e),LL(0xb20dddcd,0xc654b121),LL(0xa829cd8c,0x39c79315),L_(0x792dd84b),
+ LL(0x040ffaf0,0xb7bea5b5),LL(0xf1650ec3,0xdb5241ae),LL(0x372d1796,0x940a8a94),L_(0x1a858744), LL(0xf1499afe,0xcabac4a3),LL(0x8ded605f,0xb861df88),LL(0x0cb6a234,0xa96fe9bb),L_(0xbc8b296e),
+ LL(0x5eedd185,0x4434f8b6),LL(0xd1edd68c,0x2a8d7504),LL(0x86f300e0,0x0e35d724),L_(0x897d3aeb), LL(0xfaf29ff1,0x4c814382),LL(0x472c2113,0x141d9196),LL(0xd1bc5f13,0xade4deb9),L_(0xa2fb8cce),
+ LL(0x406ace5c,0x1ea243b0),LL(0x686c6adf,0xd6070206),LL(0x22934b39,0xd9cd49e0),L_(0xa0234a2a), LL(0x4d0f3175,0xc755b33c),LL(0x5c35ad9b,0xf8e1a985),LL(0xc50467c8,0x18a3ef6a),L_(0xf2b99d2a),
+ LL(0x4607dced,0x614bcea6),LL(0xd3d623a4,0x68ae9193),LL(0xf3906a4b,0x42d006dc),L_(0x8b8583eb), LL(0x4cb64b0e,0x9dbec629),LL(0x98a17fc9,0x0bf6a2f2),LL(0x057751b4,0xa9fae60b),L_(0x21e7bd24),
+ LL(0x3c12fc75,0x017d14d0),LL(0x3242c2d8,0xc6c97422),LL(0xa51b04ab,0x626c81c6),L_(0x94d87c6b), LL(0x238bcf04,0x5e266a2a),LL(0xa82fa338,0x23764002),LL(0x51803104,0x5f7162bf),L_(0xc4756473),
+ LL(0xa5dd759f,0x522db1a2),LL(0x5930b4b5,0x09f2baed),LL(0xf85a6ac1,0x323304d4),L_(0x05195116), LL(0x1360791c,0x1db93b31),LL(0x108292f6,0x1b768230),LL(0xabf3fed8,0x87d85b61),L_(0xa1679cd2),
+ LL(0x761f1b7d,0x0b49a02f),LL(0xb6746bd7,0xbb854597),LL(0x77637e3e,0x0022290f),L_(0x86597269), LL(0xf0700421,0xe0410aa3),LL(0x2a1bca0c,0x6d34be85),LL(0xf6bc18c0,0x46cdba65),L_(0x203e8ea6),
+ LL(0xb9773b5a,0xc5228020),LL(0xba11b539,0x453c7ac2),LL(0xf11276b9,0x7df2cd47),L_(0x1949a67a), LL(0xf5a8c36b,0x179c274d),LL(0x860ff0ae,0xa5c5bb12),LL(0x11df901f,0xe17d00c3),L_(0x3411dcae),
+ LL(0x3ed4c79b,0x8883a1db),LL(0x1992a967,0xfdd5776e),LL(0x2f54ff27,0xcb776738),L_(0x47290630), LL(0x9a98b107,0x79c8cc7c),LL(0xee2e8af1,0xdc2c5969),LL(0xc7ee141c,0x6b47161b),L_(0xa7624962),
+ LL(0x543685fa,0xc2395393),LL(0xe7ef754f,0x9a0b36af),LL(0xaae1a4bd,0xd5d4e38e),L_(0x4aab543b), LL(0xc2e17c97,0xd7e5c5cf),LL(0x5af349b1,0x2bef05ff),LL(0x9ed78a64,0x561fb810),L_(0xf9c813d0),
+ LL(0x2fe8fb72,0x1a1e9b3b),LL(0x9b70eefa,0x3925b0e9),LL(0xbfb2449b,0xb054dfbe),L_(0xb47dede7), LL(0x28647224,0xa5055940),LL(0x0c72430a,0x31e1b9a5),LL(0x23b5a4c4,0x195035c8),L_(0xd679bea8),
+ LL(0xcc50c48d,0x209f3af8),LL(0xd27b6e83,0x181662d3),LL(0x4b465365,0x91296676),L_(0x420e37bf), LL(0x138dff74,0xed5f5189),LL(0x82f8d0f4,0xc0ded518),LL(0x40df6431,0x723fb4ad),L_(0x617ba2b7),
+ LL(0x112db662,0x3569136f),LL(0xb2b47e3c,0xb8e53774),LL(0xdd45fe78,0xfaa04e8d),L_(0xc768fdda), LL(0xf6371e54,0x86806849),LL(0xa8e9db9c,0xf4779601),LL(0x4c858ecd,0xa4992880),L_(0x49a83816),
+ LL(0x8967314a,0x156e1198),LL(0x7bad4014,0x39eb8236),LL(0xecde7783,0x6d9c66e5),L_(0x881e0782), LL(0xd2f38b48,0x3fba7225),LL(0xed8353b8,0x088944d1),LL(0x4f8035c2,0x33f1f404),L_(0x1cc9c213),
+ LL(0x51cb66d6,0x58d0680a),LL(0x50bb5809,0xcb3e58aa),LL(0x1d2325d3,0x13427358),L_(0x5e67c4ac), LL(0x7dbb0bf2,0x85f983bc),LL(0xa937cb56,0x0f88839a),LL(0x8a991a31,0x6b3985b4),L_(0x92b4731e),
+ LL(0xdf68b708,0xde5b911a),LL(0x03d7de13,0xeed92206),LL(0xfc74f9a9,0xbcecf38d),L_(0x088b6fe1), LL(0x96e739c0,0x0a6c0e27),LL(0xd4a63fbd,0x82400edd),LL(0xbba8f32c,0x27d5bb2b),L_(0xc58b1cab),
+ LL(0x3131df11,0x042f1a03),LL(0x4f121cf6,0xe003b634),LL(0xa22e7895,0x6dd1e8b0),L_(0x5d804ab1), LL(0x90518b2c,0x5efe4007),LL(0xe1e8157d,0x88b87e5c),LL(0x63c085ee,0xf6155e0f),L_(0xba6e44df),
+ LL(0x841e4ade,0x1f02ab50),LL(0x156d76af,0x67a50be5),LL(0xe6f206a7,0xf1e42056),L_(0x65f10a7c), LL(0x2febb4c7,0x657a0dc7),LL(0x072e3321,0xbbf3484b),LL(0xea4f285b,0x020b154e),L_(0x8c852c97),
+ LL(0xdbbe1818,0x91e4e9f4),LL(0x2edec0de,0xbf43b7fd),LL(0xe4667773,0x52865635),L_(0x56a43f3c), LL(0x5962ba87,0x28fe8ab8),LL(0x248c61c8,0xd449338b),LL(0xd636805c,0xa1efd1c9),L_(0x13bd6609),
+ LL(0xdfd448ab,0xb92e258d),LL(0xe4e24c18,0x35b6d45b),LL(0xa42ce187,0x0d195771),L_(0x5aad5bff), LL(0x672eaebc,0x60feb26e),LL(0x4177b162,0x9498986f),LL(0xb3b0ede4,0xc41d2caa),L_(0xf358519a),
+ LL(0x5261f5a7,0x330e8a48),LL(0x43204369,0xf61c72d3),LL(0x33ca48fd,0xffeebdb0),L_(0x8ae6e55b), LL(0x7ae9478f,0x73383a11),LL(0xa6e09378,0xafb5d295),LL(0x689cfdb3,0x32706d23),L_(0x868c5ddf),
+ LL(0x0bd73e3c,0x62c3a48b),LL(0x8741583b,0x0c0a3d1d),LL(0xacf48d35,0x48c97582),L_(0xa4f06efa), LL(0x01b5bb29,0xaf780b08),LL(0x6bf0d377,0x2a0a2d75),LL(0xabcaf322,0x13f7f83f),L_(0x655d34bf),
+ LL(0xb992a7a0,0x19a0cf96),LL(0x9ecda6fc,0x98adc9dd),LL(0x6a4d3e6c,0x40f8faf2),L_(0x0edc38f8), LL(0xef011d38,0x7e67e105),LL(0x1797a86e,0x87eb4d53),LL(0x45add6b3,0xce77f195),L_(0x989201fd),
+ LL(0x3d9993bc,0x8adaa277),LL(0x99dda71d,0x1fca3093),LL(0x7433657e,0x8caf0d86),L_(0x023c11e2), LL(0x85112381,0x3dbd4315),LL(0x708185e8,0x9d410bfb),LL(0x374f5e1e,0xf2fcce49),L_(0x3443b974),
+ LL(0x532b7588,0xd3243b22),LL(0xfed73137,0x11c1365d),LL(0xb045d4a7,0xb70776bc),L_(0xfa754876), LL(0xadb798db,0xe29a9f85),LL(0x7a404c41,0x04e83976),LL(0x4ef414c2,0xd94bbca4),L_(0xca54266d),
+ LL(0x69a5c564,0x189faa10),LL(0xea80ccb0,0x11ff4091),LL(0x270bddfa,0x13f400ef),L_(0x16bba259), LL(0x54c1f416,0x5467f97f),LL(0x63fe2fd7,0x8a19f9f7),LL(0xd713b7c7,0xbecb24c4),L_(0x548c6ef8),
+ LL(0xd9e41b7d,0x154bb407),LL(0x5fe1b516,0x9e3d7f55),LL(0x0a7b54c7,0x135359b7),L_(0x56bae4a1), LL(0x84d9fef8,0x5d18cdb1),LL(0x3494e228,0x142d7261),LL(0x1cba3904,0xac50bd6c),L_(0x2d2c512d),
+ LL(0x709ebb7e,0xec49c916),LL(0x906c201e,0x16f1cdf7),LL(0x9b4ca4e1,0xd65f4a10),L_(0x474e1186), LL(0xf98d2d15,0x03b182b1),LL(0x94cb6ea7,0x060b7206),LL(0xb11e15e8,0x6d96c56b),L_(0x52f7fca7),
+ LL(0x8f77e5e5,0x72cd83b6),LL(0x8cab24f9,0x25a5b5bf),LL(0x25a2e699,0x6fdd7673),L_(0x072fab5d), LL(0x90a6d4ff,0xd576b9f6),LL(0x3ca8ca37,0xbcb25091),LL(0xad2b4418,0xefb79bc4),L_(0xff9c27d0),
+ LL(0xfba463c7,0x67359a81),LL(0xfe5bb23c,0x2c69efd5),LL(0x280e7df6,0x74569519),L_(0xfe16bd9c), LL(0xe2c76094,0xb18f6667),LL(0x365a80b1,0xbd326eec),LL(0x88831553,0x87869f49),L_(0x5939e645),
+ LL(0xbaa57c7d,0x3b207add),LL(0xfb5db15b,0x4ed05149),LL(0xb373586a,0x309bffcc),L_(0x773b90d1), LL(0x461b005c,0xc0f53c53),LL(0x8106712a,0xc558624a),LL(0xcda6e3b1,0x6faa11b6),L_(0x3ae794e5),
+ LL(0xf0680ab3,0xcbfa17ef),LL(0x058c2020,0xcddb5b82),LL(0x41c78a0d,0x20234c33),L_(0xe0cbaf8b), LL(0xc2fe9029,0xf4f1f1bc),LL(0x7a0fe46d,0xfc36a9bb),LL(0x75517f43,0x7adc3f7c),L_(0x9a365f26),
+ LL(0xba51387b,0x49c36869),LL(0xc5a22f24,0x03e373c6),LL(0xb8b4767a,0xb07a3f0c),L_(0x36066a8f), LL(0xe85c503a,0x808f702e),LL(0x1497d7ac,0xdddd86d9),LL(0x7011d76f,0xfae1c7e7),L_(0x803e46f1),
+ LL(0x80fa818c,0x31e4ef2b),LL(0xeb39da59,0x68d478dc),LL(0xb3f48a44,0x7630fe61),L_(0x067101b0), LL(0xf7c94ecf,0x9a533238),LL(0xaea4959f,0x5e7ce695),LL(0x3b49d1b1,0x52a95933),L_(0x557cf5b6),
+ LL(0x0d20898f,0x9d1c985c),LL(0x072ec166,0xc62ed966),LL(0xce3b7676,0xeb820161),L_(0x37e4d792), LL(0x60f14619,0xe6d270e0),LL(0x648b3694,0x80e6594a),LL(0x9e645987,0x879e807c),L_(0xb22e7cb2),
+},
+/* digit=27 base_pwr=2^189 */
+{
+ LL(0x0703230c,0x9c23cc7f),LL(0xad5df365,0xa6d601b3),LL(0x3f2e4ff0,0x8b1b5936),L_(0x1dea5297), LL(0xe0882f47,0x402ec9ab),LL(0xa3a23af8,0x47de2c7e),LL(0x555b4d4e,0xeaa5bf4d),L_(0x2ff94aac),
+ LL(0xf78b555b,0x971ade84),LL(0x54bd5a85,0x4e8a2ef9),LL(0x5ad4ea73,0x0425d602),L_(0x3bd54fb7), LL(0x791d9123,0x227d0459),LL(0x1e92cc4f,0xc9d765a1),LL(0xe4f1346c,0x28b65397),L_(0xd481a746),
+ LL(0xe7d16971,0x871eef82),LL(0x0506636f,0xb5fdd432),LL(0xb27a33c5,0x1d066c2a),L_(0x3113bf2a), LL(0xe97230fe,0x862b60db),LL(0x75a027c2,0x593d4117),LL(0x539f6530,0x8436da66),L_(0xe2b2cbf2),
+ LL(0x2425af9f,0xead58c17),LL(0xcad19bb2,0xb5cbb50e),LL(0xccdd8dd9,0x86b3650e),L_(0x1a092795), LL(0xdc320635,0xa3e665cd),LL(0x7ebcad7d,0x1e2d319e),LL(0x33fae415,0xeca579c1),L_(0x6ac7d5f9),
+ LL(0x6a9d1fc5,0x89b65031),LL(0x881ef8ac,0x23a987e0),LL(0xfde88e7a,0x2dd37a50),L_(0xc8dcf85d), LL(0xcebc549c,0x820f3f12),LL(0xd4ae9ff8,0xb7bcaa86),LL(0x694bc71e,0x8e6e09c1),L_(0xd6b8424d),
+ LL(0xfe8a98f0,0x63ff767a),LL(0x378e38e8,0xc5f7f4d1),LL(0x0e5335e1,0x7cfba5a2),L_(0x39a8daab), LL(0x77da1977,0x67e59eaa),LL(0xad21218b,0x504acfd4),LL(0x96be881c,0xbeef988a),L_(0x69332afc),
+ LL(0x82325977,0x575e852e),LL(0x45759819,0x2c72e2f1),LL(0xe0cc66d6,0x1927e387),L_(0xc0500878), LL(0x4d0b0122,0x7da1cf59),LL(0x14427010,0x26204672),LL(0xdb25f5a7,0x0a8b1258),L_(0x478d5953),
+ LL(0x7d69f704,0x20d3988b),LL(0xab2517df,0x6c24b0c1),LL(0xaab259f9,0x5e65b843),L_(0x174ca2d2), LL(0x75e5c2e2,0xea29f462),LL(0xdb90528b,0x1834a190),LL(0x8c9eae94,0xf967c0ea),L_(0xae030eb0),
+ LL(0x7e9bdb89,0x00adf08d),LL(0x03f389c4,0xa0138acf),LL(0x8dfb7875,0xd93b37ee),L_(0xbed6d6d8), LL(0x749de946,0xbfd574b2),LL(0x1fc14060,0xe75abd5a),LL(0x67c65b64,0x13366a27),L_(0xc999214e),
+ LL(0xb08be401,0xe06fcef2),LL(0xa7dfbf73,0xe0ba359e),LL(0x607c14ca,0x382ff71f),L_(0xdef77eb0), LL(0x6404f03d,0x3f8a49f7),LL(0xf9e8050d,0x7853702d),LL(0x4887d191,0x04d3f5e6),L_(0x1aa6bfdc),
+ LL(0x67857252,0xdb805369),LL(0x612fee31,0xd63c66e4),LL(0xa73ff057,0x587ee86f),L_(0x2d5eb654), LL(0xa10a675a,0xbd927cb1),LL(0xf79fccb5,0xc799e97c),LL(0x6f65ee19,0x4703e5a8),L_(0x04d4c022),
+ LL(0xaa2f24f8,0xba32a728),LL(0x2229afc4,0xb7ad366d),LL(0xa0ac6a50,0xb220a09e),L_(0x5da587fb), LL(0xd5db1088,0x44a3150c),LL(0x31856642,0x09784fd1),LL(0xf6f05498,0xc1e6c0b0),L_(0x346aa16b),
+ LL(0x06b7160f,0xbb692e48),LL(0x89eb623c,0x15498ecf),LL(0xb77b124d,0xbb092f5d),L_(0x3e60aee2), LL(0x74e3ca98,0x7b0969cb),LL(0x9ba2e8fe,0xf86a2cf8),LL(0x6d59ed66,0xdeabc883),L_(0x39e0a846),
+ LL(0x17174a2f,0x852eae73),LL(0xbaf85e02,0x1e348f19),LL(0x0374bff3,0xeacc5568),L_(0x60bfb120), LL(0x5585a76d,0xa921615e),LL(0xf43bee83,0x1b74c1fc),LL(0x26867d50,0x52fb37fb),L_(0x7279cdee),
+ LL(0xb96496b8,0xe996dbee),LL(0x7868fd21,0x39670ef3),LL(0x8094e471,0x9c159e05),L_(0x2d0b6ffe), LL(0x4226465b,0xb7fd505e),LL(0xe7884414,0xf2355f66),LL(0xe46e77c4,0xe0fbfc8b),L_(0xd7928658),
+ LL(0xc386d033,0x16b11ec1),LL(0x6cbaf218,0x75da11d8),LL(0x94c7a19f,0xfda19041),L_(0x15d41b37), LL(0xcd2bfd31,0x0e5ba2ee),LL(0x8a34c58f,0x2339d87a),LL(0x375d7766,0x24af1974),L_(0x280bf34c),
+ LL(0x0c7c5c0f,0x06c1fc0c),LL(0x8c4fcedc,0x1d94e717),LL(0xb65c6a50,0x0b30821a),L_(0x2a34b8c1), LL(0xefa6a39e,0x6459b552),LL(0x49fdfbf5,0xb7d7e4b6),LL(0x18598afa,0x00b319ed),L_(0x287de14b),
+ LL(0xf884841d,0x8dad7679),LL(0x518b1ea0,0xb306db5d),LL(0xb36c0754,0x5229df9a),L_(0x8fc9f729), LL(0xaadea0d8,0x970bb22c),LL(0x03b629f0,0x298689dc),LL(0xf3b57c01,0x89fe17ad),L_(0x686552a0),
+ LL(0x76218fd5,0xceff7d9d),LL(0xd9e895e9,0x63a383ce),LL(0x238b4e91,0x99f29b16),L_(0xbd71b01c), LL(0xe11ea486,0x7ae47927),LL(0x605101be,0x7cd7a8d0),LL(0x0d9f157a,0xb3fa2b87),L_(0x330f1244),
+ LL(0xff049f89,0x85fe8244),LL(0x6ddb5ffc,0x5d2ff231),LL(0xef0f5b1a,0x63ccdc00),L_(0x61b2bcef), LL(0x8ba95ec1,0xa8a44260),LL(0x5321922c,0x6ed75cfa),LL(0x3e43af21,0x8464e573),L_(0x6a65d52d),
+ LL(0x65d29b4d,0x1583a353),LL(0x32ab9cfa,0x43193114),LL(0x92998e59,0x704abb0e),L_(0xbbb3d90f), LL(0x2a7e16f7,0x4c98adbf),LL(0x7bbafb3d,0xa5a25fbe),LL(0x44dc73bb,0x8fc488f7),L_(0x6641759d),
+ LL(0x784f9378,0xe7bcd034),LL(0xabbc4935,0x89f2f24e),LL(0xbec66d27,0x4917e013),L_(0x5c4012be), LL(0xf0cde4d8,0x0961875a),LL(0xa3f96a56,0xa260b4de),LL(0x59faeb8c,0xbeeb1631),L_(0xc5c3e45d),
+ LL(0x280f3963,0xa088a1e1),LL(0xf1068e65,0x1dbee472),LL(0x1692a131,0x05a158ea),L_(0xde0f97d9), LL(0x0a11b122,0x0e13e263),LL(0xb70fb035,0xdee544e8),LL(0x5dcaae12,0x8f1fbb34),L_(0xd7c3d865),
+ LL(0x5d2e90ae,0xb9ad99ac),LL(0x75457057,0x0c329529),LL(0xaa459865,0x96ffc387),L_(0x7823d3a1), LL(0x13516c2f,0xa0aa883b),LL(0x6d68a755,0xbfa72fcb),LL(0xa825f1f8,0x97da099b),L_(0xcba9849f),
+ LL(0x14bced83,0xf4fdf535),LL(0x671c909f,0x689f6f0d),LL(0x71814baa,0x5b8ff385),L_(0x984a3eb2), LL(0x9c1ba7cf,0x907e4e69),LL(0x6fd404b5,0xff0ce18b),LL(0x2458cb25,0xef5cd0aa),L_(0xdb837d9e),
+ LL(0xfee8b8f0,0xa4710d21),LL(0xca118a9d,0x54895b97),LL(0xb541a6b0,0x526b0ca4),L_(0x46f624ed), LL(0x16947323,0x31b294e5),LL(0xd0b8b7cb,0x1b4cb2b4),LL(0x98687802,0xfbcc3509),L_(0x58f68319),
+ LL(0xb150cf08,0xe16b93aa),LL(0xba41d3c9,0x253eb0dc),LL(0x984df68e,0x87118c04),L_(0xea79efa1), LL(0x480076ed,0x0dcde0c7),LL(0x36503c9e,0x18bdffd8),LL(0x16aa0174,0x1f265d34),L_(0x34f86080),
+ LL(0xee0e75be,0x5617d582),LL(0xab95d71a,0x3e671da8),LL(0x0190d33a,0x3bee1eff),L_(0xa69eb59f), LL(0xe617dbcc,0x09cde5ef),LL(0x2ec74095,0x888eade7),LL(0xfc85f3d6,0x359daa39),L_(0x55fe2fc2),
+ LL(0xb342c648,0x4a00b224),LL(0x153ecb1a,0xb894175c),LL(0x58a94e88,0x70cf2206),L_(0x2b740c25), LL(0xf20b5561,0xdca48b9e),LL(0xcecf5379,0x7707c57d),LL(0xa0a1a133,0xc33e6b03),L_(0x4b326561),
+ LL(0x9c8970a2,0x4c16f18a),LL(0x642f1b1c,0x57b552ca),LL(0xda495e0b,0x1a9ee7da),L_(0x8d81f72e), LL(0x1ad4dac5,0x06f7634a),LL(0xd29378b5,0x1b77c61d),LL(0x110655eb,0xd5bf028c),L_(0x1f8658cf),
+ LL(0x21c59245,0x51b05ff6),LL(0x6f117207,0xaf13b9eb),LL(0x2b5c0017,0x4aa9bdff),L_(0x0df00c88), LL(0x703d8719,0xaf5e4830),LL(0x40500109,0x52cc9369),LL(0xf59d1925,0x013abb12),L_(0xdc8ebfb1),
+ LL(0x1082f991,0x2c9f0b9e),LL(0x02ac62a2,0x666e06e5),LL(0x703ab683,0x6f1b6308),L_(0xf1dd2936), LL(0xc8b722dc,0xd103845d),LL(0x6960a1a5,0x2459c28c),LL(0xd0ce016b,0x60884f40),L_(0xd595cffb),
+ LL(0x7f7ba180,0xe194bda2),LL(0xabd5ba2f,0xbb90a872),LL(0x2977890c,0x3dc3fa11),L_(0xa6cdf4eb), LL(0x1ec1818c,0x2f976a14),LL(0x9509667f,0x6ef670b0),LL(0x547bbc14,0x7a6392b3),L_(0xec34c6c8),
+ LL(0xfa44c4a3,0xd1652cf8),LL(0xd0c64f4a,0x7b98c98c),LL(0xeeaab800,0xb60ccb53),L_(0x41176e83), LL(0x20bc577a,0x3d3d111a),LL(0xc6b3e65e,0xf1c69a56),LL(0x4586a0f5,0x047748d6),L_(0x966336bb),
+ LL(0xbfb2046e,0x1ba40992),LL(0x15e78b76,0x492e1976),LL(0x8fa3d075,0xb62a0315),L_(0x34d22c5e), LL(0x08bcfaa9,0x55ee388d),LL(0x47ca2bb1,0xb50f4e76),LL(0x48d16444,0x947b5775),L_(0x6055efef),
+ LL(0x27f9113a,0x9933e071),LL(0xeeda2fbb,0x16712a59),LL(0xc739c006,0x75d0d886),L_(0x844de074), LL(0x95eed6e3,0x5fd2d047),LL(0x53ef6941,0xfa45dd7f),LL(0x9d54f1fb,0x741b92d0),L_(0xf26829fe),
+ LL(0xe5114e39,0xc2275c0e),LL(0x14f42683,0xb4d5582b),LL(0x3e016601,0x25741fdf),L_(0xb4b6622d), LL(0x4514d2ec,0xc4ccb66a),LL(0xf7783f3c,0xb57016ca),LL(0x59b84d70,0xf83fe7e5),L_(0x1f712454),
+ LL(0x7a6974e4,0xcecae61e),LL(0xddefbfbc,0xa93265ce),LL(0x1f1fb9f1,0xf3c9e95d),L_(0x968d6e21), LL(0x76333191,0x5ef96caf),LL(0x343738c5,0x26204de9),LL(0x66ec9969,0x8ee499c3),L_(0xfa475270),
+ LL(0x1abe8df4,0x0e4c49fd),LL(0x72a09b7d,0x5430fd38),LL(0x5d968105,0xb2efc301),L_(0x82c1807e), LL(0xde3d9217,0x191e5b5e),LL(0xb52c47de,0x32722377),LL(0xa0892090,0xd92f1352),L_(0x8058cafd),
+ LL(0x757c94f0,0x9649e576),LL(0xf15a6d6f,0x79587916),LL(0x8be7ad8d,0xadd01304),L_(0x01368bc3), LL(0x29445ca1,0x285b7eef),LL(0x761da068,0xae55ea08),LL(0x962f7357,0x983ad1c5),L_(0x9e092171),
+ LL(0x40d7b216,0x3897f22b),LL(0x2a0a0ea9,0x0a2968a8),LL(0xae9ce773,0x5eeabf53),L_(0x205e8acc), LL(0xd7707d11,0x3f8692b7),LL(0xc470978d,0x416e3f6b),LL(0x0e77bce9,0xf53b376e),L_(0x4d5b8d32),
+ LL(0x211044a3,0xb9dbcba3),LL(0x174bbf68,0x7e52000c),LL(0x2961ea4a,0x12e1a413),L_(0x1ad46429), LL(0xc87793af,0x36916c16),LL(0x5c151550,0x93f3db96),LL(0xf4f9dbfb,0x2bfda0b4),L_(0x51b088a4),
+ LL(0xbbbbeb9d,0xcc1030ad),LL(0x12a28f87,0x49bedb1c),LL(0x1869975f,0x6a004fbc),L_(0xfb3e5023), LL(0x51c16438,0x71e53119),LL(0x49270eb0,0x5e139c47),LL(0x60f866a3,0x0784d6e0),L_(0xf4f1e774),
+ LL(0x97f340e8,0xa61d043f),LL(0x05c008f3,0x4c35a67a),LL(0x8581b05b,0x44182222),L_(0x3e8c133f), LL(0x45bca0e5,0x8bf96ead),LL(0xf85bee99,0x7c86a090),LL(0x2ad3d962,0x7ea985d4),L_(0x8ce03be2),
+ LL(0x1ef28f3f,0xcbf512f8),LL(0xcf504c88,0xdc8ed43e),LL(0x516f1183,0xec32dc2b),L_(0xa2e2c1fe), LL(0xc45e5adb,0x505156da),LL(0xb7216064,0x983acb8c),LL(0x30958d17,0xe6ec6def),L_(0x28469ede),
+ LL(0x1072cfe0,0xaaf2a64f),LL(0x30962a70,0x33454609),LL(0x8b880e7d,0xa7a46a05),L_(0xa96bc722), LL(0x7354fe08,0xd5821805),LL(0xdd17ff77,0x0fc1cbb0),LL(0x0e58985d,0x9f7a9dad),L_(0xca339489),
+ LL(0x9dc30815,0xe1ebef86),LL(0x51cfd1d3,0x852da87b),LL(0xed5cdd01,0x21bc828d),L_(0x7b53ef92), LL(0x5aadc85a,0xe522baaa),LL(0xb7031c6f,0x608b4b16),LL(0xee466b6e,0x0c33a24a),L_(0x3197bd29),
+ LL(0x4e1fae13,0xf397b191),LL(0x68fba8e4,0x2940f1c8),LL(0x47dd818f,0x68c77c89),L_(0x7dbc2c98), LL(0xba40969f,0x8ffaa799),LL(0xf0b99031,0x712df944),LL(0x997feef1,0x4da4261d),L_(0x1f70d141),
+ LL(0x1b0afa52,0x69fea568),LL(0x3e151e92,0xdfc334a6),LL(0xa2587e32,0xf61b674f),L_(0xbaa4f3f4), LL(0x62eb8d24,0xdd643088),LL(0xa7a5fc88,0x5cde0035),LL(0x53b8bdc0,0x1c5ce488),L_(0xf9fdf735),
+ LL(0xa64a20a6,0xd22b7f88),LL(0xa2eb0438,0x0628283c),LL(0x75129c40,0x6efeb06e),L_(0x4f3e44a6), LL(0x76f8c149,0x181e8b58),LL(0xbb830a80,0xc758648a),LL(0x3d1fbafb,0x069f31f1),L_(0xbfff2e03),
+ LL(0x78f3872d,0xbba94fb7),LL(0x748d4921,0x852ef996),LL(0x48ddef24,0x066ad60c),L_(0xd4ea4021), LL(0xc1ba7360,0x790d395b),LL(0x6901be6e,0x7616ea80),LL(0x61b408b8,0x9278e0eb),L_(0xc7366cae),
+ LL(0x15c9a850,0xae384504),LL(0xd50ba3bf,0xf4814e2a),LL(0x1b8b0e26,0x2b97a1b4),L_(0x3f0e4245), LL(0x260ef3d1,0x5db22d7e),LL(0xbfd1a5ec,0x2e7c6bf8),LL(0x7c1471d1,0x7bdec3b1),L_(0x079a90a5),
+ LL(0xb71fd22f,0x7f17f289),LL(0x5e288b65,0xd4564a47),LL(0x34b284d4,0xb75a3120),L_(0x5d8426b1), LL(0x986c8a29,0x197cc0c1),LL(0x29e64b23,0xcc3ae592),LL(0x7da4599c,0x54ebd08e),L_(0xf69dda7d),
+ LL(0x9addab69,0xbd0c6b5c),LL(0xf7f44578,0x7ec99645),LL(0xaa918115,0x8ee2e6eb),L_(0xd2de3778), LL(0xd9db5cd4,0x2d90dfec),LL(0x5c1253c8,0xf48ec5bb),LL(0x7732d381,0x2daa3783),L_(0x158b18c3),
+ LL(0x4087fb32,0x64d12677),LL(0xa61b3dc0,0xd6d5d34f),LL(0x5aa57c66,0xeebb82c5),L_(0x01983506), LL(0x0b3a8490,0x4bcc334e),LL(0x347044a3,0xafc73b45),LL(0xbdc15e76,0xba3353c1),L_(0xfc066074),
+ LL(0x3f49b08a,0xe4f392d0),LL(0x1fda13b1,0xc0bd57d7),LL(0x4a84d25e,0x8b9c3a47),L_(0x9991791e), LL(0x88262b52,0x5d6233aa),LL(0xd1327af9,0x1da165fe),LL(0xba39a0b7,0x56569118),L_(0x22bb8aef),
+ LL(0x55aff6c4,0xffb26779),LL(0x4e7d53f7,0x581f3f37),LL(0xc259ed17,0x0527ce42),L_(0xb4d8bc18), LL(0xeb967186,0x592962f6),LL(0xf82705f0,0xbc866b81),LL(0x9a5ee9a2,0xb8fcf82b),L_(0x60d27e12),
+ LL(0x7b7d67a2,0x6bed8eca),LL(0x5d9fc1ee,0x74e18695),LL(0x3ac5ac85,0x4777aaae),L_(0xaf2958be), LL(0xaf83cba9,0x114e541f),LL(0x41b4aa09,0x49c90e0c),LL(0x6ffe97ac,0xd22caea2),L_(0x032a68c3),
+ LL(0xad0a7c5d,0xcf68be2d),LL(0xe675d930,0x46042df0),LL(0x44cc34c3,0x83baaad0),L_(0x09136a40), LL(0xe5be5f7c,0x232306d2),LL(0xe3f78e95,0x30e3711a),LL(0x7b102ef8,0x90ca6b87),L_(0x25d20cac),
+ LL(0x24f85c29,0x1c82027d),LL(0x509f2a65,0xc82c4968),LL(0xf294dde1,0xa0dabc8e),L_(0x6fbe2f96), LL(0xeadad60a,0xa2d74908),LL(0x0b27809e,0xea64f015),LL(0x3b0536e3,0x948d4413),L_(0x3ccb3666),
+ LL(0x4cd8e164,0x7e58fb10),LL(0x2cc3a907,0x3a2788f9),LL(0xc860f6b9,0x673a28d4),L_(0x6f03054c), LL(0xc5e46854,0x62c5a4e9),LL(0x02ecf383,0x059005a0),LL(0x5a617a3d,0x06267ff2),L_(0x6a1a7e0c),
+ LL(0x2af744e3,0xae8162d5),LL(0xfa2efdc7,0xbe28dd79),LL(0x950dd089,0xcd76243e),L_(0x1c19727b), LL(0x887a306f,0xc5cf5f6e),LL(0x003d3ccd,0x6076457e),LL(0xd58cb75e,0xa5a9063c),L_(0x95f7ccee),
+ LL(0x6f63cd76,0xa7571852),LL(0x089066c8,0x2ab669d0),LL(0xd42dd087,0xee6f2f6d),L_(0x18dd0fe9), LL(0x0a7d1e21,0xfa5d28f5),LL(0x2b521ac0,0x9441fb8f),LL(0x8466e082,0x4a673507),L_(0xf688bc35),
+ LL(0x980ae611,0xc6222c7e),LL(0xb1d88568,0x3030f358),LL(0x9b8f42e0,0xbbf50262),L_(0xaa3f5497), LL(0x469ee64f,0x3ef5e0ea),LL(0x167a26ce,0x0e1c1519),LL(0xb57bce91,0x806bb655),L_(0x2f545810),
+},
+/* digit=28 base_pwr=2^196 */
+{
+ LL(0x4760716f,0x789ae13c),LL(0x1cb72857,0xf578d1e5),LL(0xc6470ce9,0xd42e2969),L_(0xe716d39d), LL(0x5f1cf231,0x733456c6),LL(0x5fef0d2e,0x592bb199),LL(0x91e21ef9,0x8814ad36),L_(0xb248995f),
+ LL(0xbefb4b7c,0x6eb484b6),LL(0x87780471,0xa01ef7f5),LL(0xdc02e33e,0xf8ac22f1),L_(0x6e5fad2e), LL(0x0cbad015,0xc2d60cca),LL(0x2db33229,0x78a4abdf),LL(0x375f545c,0xbb2518b8),L_(0xe117a7f0),
+ LL(0xe94cf6d0,0x721159cc),LL(0x2528b498,0xd001dacc),LL(0xba328884,0x6ca68824),L_(0x16db431f), LL(0x857c60d1,0x3e1c1a16),LL(0x06be4963,0x4e3a8a4a),LL(0xe5100cc6,0x2fadd498),L_(0x66deb87b),
+ LL(0x96e332c2,0xba35b5c5),LL(0x5c8ec408,0x32a3227d),LL(0x3d572604,0x3287caa4),L_(0xde9663da), LL(0xd3d8aa49,0xd8f05722),LL(0x3d0b0ee6,0x211c6e5e),LL(0x789832b8,0xd7095c24),L_(0x057c1df6),
+ LL(0x8e5e0a09,0xa554b8a7),LL(0xc0ca83b1,0x3cfefa31),LL(0xde9b7d08,0xb712685d),L_(0x890d7a66), LL(0xd942a6e4,0xc242dae3),LL(0x4f659bb9,0x5c2986c0),LL(0xca0a3ad3,0x58984f5a),L_(0xc0f8dce7),
+ LL(0xbb8f3d67,0x75e4f894),LL(0x305ab1c6,0x597d61ec),LL(0xc5900752,0xbb05ff05),L_(0x6f0cfc37), LL(0x78265563,0x8bb8c320),LL(0x928753a6,0x2afed364),LL(0x9604812d,0x2ecd08d1),L_(0x9f7250a9),
+ LL(0x4f8511c5,0xf62b6ad5),LL(0x68ca6d7c,0xe0ab6bd5),LL(0x9849b3b9,0x437c1eb4),L_(0xdab12cd3), LL(0x60c66157,0xe2da9ad4),LL(0x81e8b4b4,0xc72b155a),LL(0xe933cc08,0xad7576ea),L_(0x66098ae9),
+ LL(0x019aa18f,0x06661e71),LL(0x997b0541,0x2a662ce1),LL(0xc9069497,0x5ff8cdb7),L_(0x7c209e40), LL(0x22ef5987,0x62a400b7),LL(0xdcbb6b6a,0xb2915c26),LL(0x1fe38da6,0xffba34b0),L_(0x6f5cedf1),
+ LL(0x6335b064,0x6133838a),LL(0xe7f5ee57,0x76c52676),LL(0xce767a1c,0x5e465185),L_(0x1464e362), LL(0x93f4d930,0xce0d54ed),LL(0x5d714210,0x742e50db),LL(0xabc94edc,0x78bba80f),L_(0xc86bf6f4),
+ LL(0x4b83b6ce,0x81b49586),LL(0xa3c55ff8,0x1fa505f0),LL(0xae4acd7d,0x832817ef),L_(0x77814820), LL(0xd6ef9110,0xd59182a2),LL(0xe98e0fd5,0x764ce5bc),LL(0x323e203f,0x63236d14),L_(0x3a8b8995),
+ LL(0x118cb51a,0x8ea6b928),LL(0x117ab1a0,0x56dd68b6),LL(0x395935d8,0xbd116bcd),L_(0x0a981729), LL(0x5ced4a6c,0xbb4ec3a0),LL(0x569614d1,0x63f4b4af),LL(0x1f24cb4f,0xf9b9d0b1),L_(0x03e53738),
+ LL(0x18a50233,0x25f531db),LL(0x0389f67e,0x8b3f0f16),LL(0xa0701098,0x6a6aef50),L_(0xa69dbc19), LL(0xfb3a537e,0x8c64961c),LL(0x35b24bda,0x83f4d9b6),LL(0x440a2f19,0x7696fcba),L_(0x9f01b04c),
+ LL(0xc0f2402c,0x5360ffc2),LL(0x1debf1ae,0x8d33aed5),LL(0x7da3a904,0x4dde5b44),L_(0x0cb2c453), LL(0x6c75adbc,0x0c9938a7),LL(0x11dd5af7,0xf4ef9f5d),LL(0x30114b89,0xbb08ab61),L_(0xc5ca168c),
+ LL(0xdf042ef8,0x481cae35),LL(0xaab6e2e0,0x6fed557f),LL(0x3de7d914,0xa4e1bcfb),L_(0x7fdaa079), LL(0x85cd2d00,0x4370738c),LL(0xd12da321,0xf95a95e5),LL(0x9814d14c,0xe0fd8dcb),L_(0x32743222),
+ LL(0xc27ed928,0x655d6ffb),LL(0xde08c413,0x43a4fc18),LL(0xde7270a7,0xcba9f29e),L_(0x06e6cdba), LL(0x2e139df9,0x5cc92d84),LL(0x65a9b95c,0xc5a596a0),LL(0x6a5bdae7,0xd5e4697c),L_(0x5db94611),
+ LL(0xa1aad672,0xf4cdb11a),LL(0x0a56c5fd,0x35eb1979),LL(0x06b67d2c,0xd3a50661),L_(0x227904a1), LL(0x47a4312a,0x2c80dfe0),LL(0xdec3bab1,0x1e137540),LL(0x2528a436,0x4a30bc3a),L_(0x306505c1),
+ LL(0xa27429d2,0xac029aa3),LL(0x3ea574fb,0xe555d79c),LL(0xc26117ae,0xeee94c98),L_(0x485edd44), LL(0xb5866e81,0x3b83d3dc),LL(0x6558e1d3,0x497236f4),LL(0xa896a908,0xc1eba30c),L_(0x2a815dd8),
+ LL(0x0b1d2a89,0x6a45073a),LL(0x2ef3d416,0x72b5edce),LL(0xc7a3b1fe,0xac5268b4),L_(0x5c03d364), LL(0x8589b53a,0x25c0f37d),LL(0x247dcc63,0x8cf1d802),LL(0x9d3fe1d2,0x15093e7c),L_(0xfe72abd8),
+ LL(0xac83f07d,0x6eba86a7),LL(0xdaf79a6c,0x7769b4ef),LL(0xce08325a,0x306da9b2),L_(0x72e3aed8), LL(0x9fd7086a,0xbe70ef68),LL(0x8bdda042,0x9649ac38),LL(0x59634c20,0x260c709f),L_(0x169d616d),
+ LL(0xe36b9e36,0x56c9f551),LL(0x8ce0bbd5,0x9a19b344),LL(0x7b1c335b,0xb90484f8),L_(0xcd0b498b), LL(0x0b5ef9ed,0x8c6e220c),LL(0xdabb30f9,0x4ddb2065),LL(0xe5c29249,0x2b898fcc),L_(0xd16ae2eb),
+ LL(0xb7d4dedd,0x3cc11efc),LL(0x87733216,0xc5d55aae),LL(0xebad4304,0x139832e2),L_(0x6f2f9588), LL(0x0089eb00,0xb6ab35e5),LL(0x143ac48b,0x35af18a2),LL(0x363f80f9,0x8c8c5655),L_(0x8c090d66),
+ LL(0x3cad20e3,0xd54cc179),LL(0x56fcbabd,0xc7630400),LL(0x8ece816d,0x4347fa49),L_(0x7ff18955), LL(0xe22f3ed7,0x83d72b28),LL(0xa523c18b,0xa89efb1e),LL(0xc07fe6b1,0xf679cfd6),L_(0xb95c3988),
+ LL(0xdd4159b7,0x90409ff6),LL(0xe0447eff,0x0509d402),LL(0x0d946df5,0x46153d5b),L_(0xe1645594), LL(0x1229cd0f,0x25841f04),LL(0xd79eba33,0x163487eb),LL(0x1f5ac4bb,0x7a894b16),L_(0xd4b696a9),
+ LL(0xd0fd0fdf,0x95e0fb87),LL(0x316c5da1,0x12d4a0db),LL(0xbac4ce3b,0x4aecb41e),L_(0x07cf2ae4), LL(0xf6b866b3,0xc85cee8f),LL(0x4241c703,0x929c773e),LL(0x22cf7705,0xf90855df),L_(0x6b6a6a3d),
+ LL(0xb938eef0,0x054fb615),LL(0x8dd3e916,0x7d1ce422),LL(0x624c46af,0xc8279b91),L_(0xfa11e3a9), LL(0x6fc664fc,0x957fa9ea),LL(0x7faaee34,0x86d71f57),LL(0x8216ab5f,0x4fdcf503),L_(0x8f169cac),
+ LL(0x99acbf60,0xea1c792e),LL(0x995de7af,0x3d4924d1),LL(0x09c0ca0b,0xb94190da),L_(0x95e76a43), LL(0xaccafdf9,0x6c1aa007),LL(0x1f952403,0xe4eccac7),LL(0x07821f33,0x3125c30a),L_(0x56a0a57c),
+ LL(0x76375e86,0xa2da6002),LL(0x0c8b88d7,0x851663d2),LL(0x903300d5,0xe4304412),L_(0x6111b04d), LL(0xf13f93d7,0xac6cc7e1),LL(0x8ce4d931,0xc233fc51),LL(0xfa884feb,0x889b7699),L_(0xe977a15e),
+ LL(0x649b4878,0xb98eb821),LL(0xf89766d9,0xda85057c),LL(0xe8c391ca,0xc53a37ec),L_(0x15f269aa), LL(0x3c241d53,0x1c63bf16),LL(0x40246227,0xe6f1e93f),LL(0x882db63a,0xacf7e8f4),L_(0xa54ec9c8),
+ LL(0xd18b015d,0xf734d021),LL(0x943cb99b,0x62b04fde),LL(0xea71f882,0xe9f4d402),L_(0x4f517e6c), LL(0x3d8f7745,0xad9abc71),LL(0x1fe90081,0x088ad020),LL(0x25dfde15,0x250f4123),L_(0x48badfac),
+ LL(0xe0e96ead,0x46b7097a),LL(0x2937ebe1,0x19ddbba5),LL(0x3ecd0bd0,0x1b6e3a84),L_(0xaf895097), LL(0xfc22adbf,0xbae23185),LL(0x220a75e9,0x09ed4ed6),LL(0x062eb7e7,0xe1ce81e7),L_(0x8b1103c2),
+ LL(0x4649146f,0x91702d2f),LL(0xb9f95742,0xbfdaf3ca),LL(0xcf8f23f1,0xd403a4bb),L_(0xf9164036), LL(0x33bbb505,0x5d48ee37),LL(0x2b84d0f7,0x79ec8716),LL(0x5a9ca7a8,0x76092de3),L_(0xec444f35),
+ LL(0x1f9e6c98,0x17ed7898),LL(0x25820dda,0x668c28ad),LL(0x745aa2ed,0xcf9ce234),L_(0x01a5ca97), LL(0x4a783729,0xbf5955af),LL(0x31ed52ae,0x92891a4a),LL(0xea43a792,0xc67457a9),L_(0x7c0fc898),
+ LL(0xb8dd47fd,0xff42200e),LL(0x253f7438,0xa70a5da7),LL(0x6cbd4092,0x6d058c66),L_(0xbb3089d5), LL(0x110c3a9a,0x67048ffd),LL(0xa8a2fe2a,0x82fc6b0e),LL(0x30242c32,0xa769318b),L_(0xf0614bb4),
+ LL(0xbb708cee,0x7620c902),LL(0x084e78c8,0x75832ff6),LL(0x3a89190f,0x4632df7f),L_(0xdade5c0d), LL(0x48e4bd14,0x62dc813c),LL(0x0d15d331,0x9c55f000),LL(0x36a4457f,0xa330078b),L_(0x3b722d3e),
+ LL(0xc1f3d1aa,0xe37d1ff2),LL(0x5c4d9799,0xed06b0a5),LL(0xb1d3c33d,0x939c8f4c),L_(0x499b0fdd), LL(0xf53390da,0x9e6ebae1),LL(0xb952b38d,0x28276f38),LL(0xd69e1327,0x19f5bac2),L_(0x7c921bee),
+ LL(0xafd90d24,0x0e84e363),LL(0x37d2a8e9,0xabb80eda),LL(0x07e40274,0x95656580),L_(0x877a2cb3), LL(0xa8a767b1,0xc90af857),LL(0x61a42dc7,0x465bb86d),LL(0xbf658fdd,0x7eb455a7),L_(0xf467f4bf),
+ LL(0xda192001,0xad70ec43),LL(0x1aa502d0,0xcb55de32),LL(0x7d66c4af,0xa952a38d),L_(0xb6579e71), LL(0xdceb099f,0xed3e0675),LL(0xaf274aa3,0x635a8629),LL(0xb9f4c7da,0x8d6f1c2a),L_(0xf954b1aa),
+ LL(0x6f166fdd,0x0c46e6e4),LL(0x2f6ebcd8,0x0813e798),LL(0x9066cff4,0x2f759557),L_(0x026ee79d), LL(0xbd44613e,0x06317041),LL(0xc1609f3b,0x6879039a),LL(0x6853d2d8,0x80566bad),L_(0x9a1de27b),
+ LL(0xd83655d4,0x7c1a0bb8),LL(0x40e36289,0xa5228881),LL(0x00c5e925,0xe9c51c0b),L_(0x17fd5193), LL(0x0234b859,0x9a00e742),LL(0xee8b4f08,0xf774358d),LL(0x0eb69043,0xd46eb256),L_(0xf54e46c1),
+ LL(0xe386daac,0x9a305482),LL(0xc37330b6,0x7957d9d7),LL(0xf3f52055,0xd1a9ce7b),L_(0x1e870d5e), LL(0x303b5ae9,0xac2ad67a),LL(0x4d3fc2d7,0xb7b58e09),LL(0x7dc5f5f1,0x6c99d250),L_(0x2d7b151a),
+ LL(0x29507cf5,0x37c15d8e),LL(0x6919a75b,0x738d9ba6),LL(0xeb76b42c,0x0b91ab81),L_(0x3da557ec), LL(0xac1dd9b8,0xb974e300),LL(0x6b8577ca,0xd55b5831),LL(0x9748b154,0xbfcdc886),L_(0xf2e99cba),
+ LL(0xaa791b19,0xb611f73f),LL(0xe44e650a,0x6fd43d10),LL(0xde586616,0xff2a1da0),L_(0x8983db6a), LL(0x7da57055,0x5051af3a),LL(0x73e374c8,0xa7d98205),LL(0x80c04759,0xd4db7bec),L_(0x28c48bc7),
+ LL(0x9051c153,0xd36418fc),LL(0xed854f7d,0x2adcc4eb),LL(0xa2d25b82,0xf9315c6a),L_(0x510b53b5), LL(0x6fec476b,0xbdd2e105),LL(0xbc40ed1e,0xdc2bc2a5),LL(0xd473b242,0x9d87dbe8),L_(0xf9d3eb65),
+ LL(0x4031a20e,0x5001f11c),LL(0x3e83e92e,0x86e3fa8d),LL(0xa7c80719,0x36408819),L_(0x520ab89f), LL(0xaf0e8126,0x430d59f8),LL(0x1479126e,0x5b426c42),LL(0x1c62cb71,0x1a2c3f95),L_(0xba8c53ff),
+ LL(0x42998c5c,0x9b1ab1ad),LL(0xc5bef946,0xe7ad335b),LL(0xd2f18816,0x9b21d6a9),L_(0x7bf5543b), LL(0x09dc1281,0xc3771787),LL(0x8d9a2927,0x69b13c80),LL(0x5419b128,0x472d8eda),L_(0xce12aaf7),
+ LL(0xc26aa121,0xb9665455),LL(0x1990f311,0x3bac4cd2),LL(0x4b96b490,0x15632e30),L_(0xb87e9336), LL(0x03c2ca60,0xeac8678b),LL(0x101c2863,0x5772568c),LL(0xbef62c1e,0x3b53ce81),L_(0x7d135e14),
+ LL(0xbe66a12b,0x753cb0aa),LL(0xd1abe43d,0x38781cdd),LL(0xcf1c41a4,0xab22df0a),L_(0x11b70405), LL(0x7e4c97e5,0x3869cfcb),LL(0x24f71698,0xb43a4e85),LL(0x6ab97c59,0x35c0f24a),L_(0x4df75964),
+ LL(0x292f0d69,0x3e2b7aaa),LL(0xdafad7ad,0xe2ba5f7a),LL(0x77ff29a4,0xe21d90f9),L_(0x67fec4ee), LL(0xbc0b01d0,0xe3677335),LL(0x26e5157e,0x8fee4b54),LL(0x2b1a301a,0x5d1511ed),L_(0x263f34a8),
+ LL(0xe5e9578a,0xd73285ea),LL(0xdf28a719,0x2e506fa1),LL(0xecb1a91e,0x79d54bca),L_(0x5a06ac79), LL(0x7bf48ede,0x9f75d7b8),LL(0xa6637969,0x08014deb),LL(0xaf188a86,0xbfada230),L_(0x423dacf9),
+ LL(0xa63e4dbd,0xe55bd873),LL(0xa80a0320,0xbe01f07e),LL(0x1b09710f,0x6e6cb66a),L_(0x2fee3ce5), LL(0x955bdbc6,0xcecf1493),LL(0x2a3070a3,0x861a0878),LL(0x084d6464,0x0d0e35ed),L_(0xa03afc73),
+ LL(0xcdca5ed5,0xdb335ec9),LL(0x78cc343c,0xa8df4be9),LL(0xcaea8450,0xf564ec58),L_(0xa5438f08), LL(0xffeefeda,0x193c8457),LL(0x0eaf627b,0xddabba77),LL(0xc99c9580,0xa8ec469f),L_(0xc9ea9e43),
+ LL(0xf3c9cc69,0xa888f556),LL(0x8951408c,0xaaa99a76),LL(0x79ee145a,0x4760cde2),L_(0xfbdcc6a6), LL(0xd543c51c,0x4d61119d),LL(0x6d5cde8a,0xb57c70b1),LL(0x6d605846,0x8392010f),L_(0x824097f5),
+ LL(0x79dcc935,0xd988c0b3),LL(0x97a596be,0x66a3883f),LL(0x4cdffd50,0x026d6f1b),L_(0xb093bfc3), LL(0xd01d8fb0,0xc2150428),LL(0x477892be,0x453f0c91),LL(0xff7a816c,0x84b14e80),L_(0xf02eff58),
+ LL(0xa7823319,0xab4b5d45),LL(0x76a3294f,0x1d9dae80),LL(0xce1d1836,0x1f8f6e55),L_(0x7064e78f), LL(0x8d6bd5d7,0xd272957e),LL(0x20068c6a,0xc59f4815),LL(0x15f1375a,0x1dcaf5b0),L_(0xc01d795e),
+ LL(0x6c316cb4,0x5f19c736),LL(0x0082a8d7,0x9bb6aded),LL(0xadea31b9,0x1090e65a),L_(0x27c39f72), LL(0xfec08edb,0xad397892),LL(0x2ae66c84,0xb2c262c0),LL(0xe12a0551,0xcd11a65d),L_(0xc52c046e),
+ LL(0x5db707b6,0xf10d38e7),LL(0x4a3e6c1d,0x5bbaa9f8),LL(0x1692548b,0xa34228d1),L_(0x2ff089a1), LL(0x654e5d42,0xf2342e4d),LL(0xe8e23440,0x53e19ef5),LL(0x254b33f9,0x2609459a),L_(0xd598bc1e),
+ LL(0x7007f546,0xefba2361),LL(0xe1a42d85,0x72c3ffc2),LL(0x600f4b0f,0x68bfc655),L_(0xf5be3dea), LL(0x13f14da8,0x6efd514e),LL(0xaaab23fd,0xcc761583),LL(0x949da3c4,0xd3524443),L_(0xf07ce5ed),
+ LL(0xeca99656,0x98853678),LL(0xa45dd69d,0x959586ec),LL(0x2b4d5496,0x882a160e),L_(0x54e92805), LL(0xdf2a1b89,0x52e13aac),LL(0x8f1d99c7,0x4a5dde80),LL(0xc432a9d8,0xcafd8d25),L_(0x801f070d),
+ LL(0x39455fca,0x0c20053d),LL(0xdaf5e5b7,0x04a4c141),LL(0x14b7b1d1,0x38e2582a),L_(0x51bd8c01), LL(0x20e68184,0xd15dab61),LL(0x1925d2d5,0xba541287),LL(0x62766fdb,0x6619e0a4),L_(0x439e1dd0),
+ LL(0x3bc818e3,0x746af8f1),LL(0x6be8f43b,0xbbe6fd69),LL(0x53589554,0x446a9ab9),L_(0x0ea769ab), LL(0xc30fa666,0xf4d47c43),LL(0xca3dad1b,0x431ea6ad),LL(0x9dafb227,0x4ff395ed),L_(0xbd3937cc),
+ LL(0x2c57d4e1,0xa4cceb3e),LL(0xd6667dff,0xff6cbcb5),LL(0x8918c037,0x268bc00c),L_(0x1c4ef107), LL(0xa92f2fb1,0x76415814),LL(0xd31c6973,0x68597539),LL(0x0a6cac9a,0x399773b8),L_(0x87d12cd2),
+ LL(0x7652379d,0xc59e872e),LL(0x0e493371,0x1fa3657f),LL(0xa77b28fb,0xa7619402),L_(0xeea23b52), LL(0xa85f48bf,0xe180ae18),LL(0x8d4b8437,0x68f2c962),LL(0x3145c6a2,0xe4d30712),L_(0xd9ccc49f),
+ LL(0xb3ff7311,0x00082b09),LL(0x23fb7431,0x0de3deec),LL(0x33ecf9d4,0xab6cc532),L_(0x8eae9253), LL(0xd8a0ae1c,0x2a618d55),LL(0x97045c63,0x3993ca70),LL(0x0f2549ab,0xcc02ada7),L_(0x14884bad),
+ LL(0xb5a7fc93,0xec8a7e38),LL(0xfbda890b,0x786e2a85),LL(0x882cb9d7,0x103bbacc),L_(0x17321d75), LL(0x7395bf16,0x4be2ec80),LL(0x20a02de8,0xb287766f),LL(0x4eb9dbc0,0x54c7f36b),L_(0x399d4a59),
+},
+/* digit=29 base_pwr=2^203 */
+{
+ LL(0x663a8bf6,0xf1bd6f1b),LL(0x6c6b1cae,0x2de2cf35),LL(0x4f49967b,0x49fde755),L_(0xee2050c1), LL(0x9956f1ed,0x69f14061),LL(0x138a98db,0xc5c29863),LL(0x516db87b,0xd4456e50),L_(0xe15ee455),
+ LL(0x78b8a6b9,0x5019a365),LL(0x0782c606,0x025726c3),LL(0xd611e283,0x68f7b67f),L_(0x9292eb6b), LL(0xb4e7c5d0,0x5ed6c698),LL(0x8f074f3c,0x6ea9c71d),LL(0x2c0dd03d,0x6ad6ab61),L_(0x6c985359),
+ LL(0xc1c1b8cd,0xa1ea038f),LL(0xd886b019,0x9d8f1f3a),LL(0x5e44aefb,0xbc0d302a),L_(0x8b9ba536), LL(0x47ec400d,0x9049574e),LL(0x02b6e2ef,0x9778ebf4),LL(0xe0adc015,0xe0348d22),L_(0x2f89c060),
+ LL(0x2b432e4f,0x97be15f2),LL(0x9442eea7,0xfb123347),LL(0x752805f0,0x095f8861),L_(0xbd4f1599), LL(0xe4fd179d,0xbfe10a89),LL(0x8eb30cbd,0xc1a95173),LL(0xb5e94f0f,0x38bffbb7),L_(0xbd72f70b),
+ LL(0x31d5bf11,0x3b628b52),LL(0x6efe2871,0x9f017556),LL(0x50b6b23f,0x2051232c),L_(0x05744158), LL(0x18b1fb8c,0x58660126),LL(0x6683fda3,0x85343658),LL(0xcdefb5cb,0xee7c02af),L_(0x0c98f701),
+ LL(0x842b943a,0x79b770df),LL(0x52f1e8f1,0x2ca8d23c),LL(0x29cf116b,0xd89fd3b6),L_(0xae88c948), LL(0x20362fba,0x17dff9f9),LL(0x7048ea42,0xb8350a9e),LL(0xcbd44b83,0x3adbe1f1),L_(0x5fc81426),
+ LL(0x171138f5,0xd002fd82),LL(0xb9b3d4ff,0xed715f0c),LL(0x14d543b9,0x770fe818),L_(0xc2b33795), LL(0x2c123604,0x3f8f258d),LL(0x22543d13,0xa3564d33),LL(0x9d216804,0x435f77e5),L_(0x97bba91d),
+ LL(0xabe6aead,0x5e84d762),LL(0x84f02bef,0x538499e7),LL(0x1d74cb44,0xbfb3e36a),L_(0x591a2397), LL(0x198dddb8,0xfcbe1984),LL(0x430a25b9,0xb7b8bbcc),LL(0x80cf7321,0x00ac08de),L_(0x44305966),
+ LL(0xe8745380,0xbbb4692e),LL(0x9a66429c,0x02f17d1f),LL(0xe7057c36,0xec132fea),L_(0x87b7dbea), LL(0x89b168f8,0x7f9c9480),LL(0xe2d21c13,0xf9e94167),LL(0xf34e2409,0x13e022d0),L_(0xba4bcae2),
+ LL(0x243d2e97,0x358d9af4),LL(0x518d83d9,0xb47467ae),LL(0x81a7eea1,0x470b2dab),L_(0x37ab475a), LL(0x3d8103c5,0x9a2755c4),LL(0x200b1434,0x9228b07c),LL(0x5b3e4741,0xbc9b37bd),L_(0x8f9c88f6),
+ LL(0x8739f51d,0x3e9880c9),LL(0x183b3d2a,0xe30595ad),LL(0x9d3ff1f0,0x4b286b55),L_(0x2ffa355d), LL(0x89be0142,0xe2576d49),LL(0xf43534f3,0x00a64de7),LL(0x1e63717f,0x0c898bea),L_(0x338d6967),
+ LL(0xd89a7c52,0x489bd20b),LL(0x1cbe5fd9,0xe7ac0a68),LL(0xf9bbb011,0xbe7ead5c),L_(0xfdfdaa41), LL(0x5bf6715e,0x2573c5cb),LL(0x71fec319,0x30483451),LL(0x7ccb3fa6,0x0071ca44),L_(0x02bc8a83),
+ LL(0x83211264,0xd01481a8),LL(0xd292cd9c,0x48c43d0c),LL(0xd5277f78,0x32c5572b),L_(0xb3f946cd), LL(0xb34b30d2,0x780e2016),LL(0x492c55b7,0x43e3806b),LL(0xd4ad90ce,0x97399684),L_(0x2bddb7ec),
+ LL(0xe410e719,0xb76d2e77),LL(0xaa75746e,0x0df8f582),LL(0x6f7bfcdc,0x210d7777),L_(0xce4ca9a2), LL(0x04ef15f2,0x87836a34),LL(0x77b0ffb3,0x44c267d0),LL(0x2fbcd218,0xbb549183),L_(0x8bf3d46f),
+ LL(0xa541189d,0x3029c3b6),LL(0xbeb5a06f,0x277c1d19),LL(0x761b9d9e,0xd09fd429),L_(0x189262a3), LL(0x8fe5cbe0,0xf3cbac6c),LL(0x4d675bde,0xcbbe3e5c),LL(0x4dd89b19,0x75e821e8),L_(0xf4cfe02e),
+ LL(0xf92173f6,0x3b6ebbae),LL(0x66df420a,0x44ad6eda),LL(0x49918d50,0x71e12775),L_(0x6343f5ce), LL(0x7c6c9ea4,0xa76fc6d0),LL(0xde640ea7,0x95bb0f9e),LL(0x0e5cdfb0,0x3505e20d),L_(0x03859db8),
+ LL(0xc0a26f34,0xf36a466b),LL(0x8087482a,0x769bd94b),LL(0x96b0b77f,0xbaa9cde2),L_(0xe98e1c0a), LL(0x961d12a3,0xe383e51b),LL(0x9d59941b,0xb680bdbd),LL(0xfbf75271,0x1f5805cf),L_(0x13cbe6aa),
+ LL(0x205ad8c7,0x84ebf013),LL(0xc207bf8a,0xf24e1950),LL(0x749aace4,0xaaf03f06),L_(0x566ca993), LL(0x33c5f5b5,0x378cf813),LL(0xe91d36bf,0x8ac53e4b),LL(0x9b1441f3,0x0113566b),L_(0xb69efcbb),
+ LL(0x8145a741,0xd10f5321),LL(0x81bb9251,0xe73eb2a7),LL(0x4da9ccbf,0xf35011e6),L_(0xd0a422fb), LL(0x375da80b,0x3b493784),LL(0xac876682,0xe99fa1c1),LL(0xbfcdd019,0xfcd0fffb),L_(0x16d39a14),
+ LL(0x44724691,0x6169a512),LL(0xf345fdba,0xb54ae1f9),LL(0x97426a68,0x84a843c6),L_(0xc87c52d5), LL(0x57ee464a,0x9fa3b852),LL(0x36872038,0xcf4188dc),LL(0xb9fbee93,0xc6f126b9),L_(0xebc64e1f),
+ LL(0xa34571ca,0x48662048),LL(0x54bb6dce,0xfa26591d),LL(0xf6f0b8d2,0xc7f51cd9),L_(0x5cfd4a24), LL(0x5bc438cf,0x66200c18),LL(0xc248c469,0xe6f1c95c),LL(0x6844e3a4,0x6e17cd42),L_(0xa72dc6d8),
+ LL(0xddd1ff7e,0xf244b120),LL(0x431f42e4,0xe6046902),LL(0x40c26687,0x1691fe67),L_(0x30ca7e9b), LL(0x6e105d9d,0x9b50eded),LL(0x961020de,0x00b6a88e),LL(0xe9b08b55,0x4b82631a),L_(0x6cc54fd6),
+ LL(0x04530c1f,0xf4435606),LL(0xf234709d,0x9b79c17a),LL(0x9f045501,0x839380ae),L_(0x5f60c0b0), LL(0x2d608e32,0x9b83bfd2),LL(0xadf75cc7,0x10db4135),LL(0x22cc1949,0x3a2e7962),L_(0xe3436f2d),
+ LL(0xec19a27c,0xe5ad9b86),LL(0xb18ea5cf,0xc7d0db50),LL(0xb0a1794d,0x12340a6f),L_(0x2c1d9f6e), LL(0x8bcb0708,0x54438da3),LL(0x032032f2,0x33597066),LL(0x68e9b910,0x192ee4ac),L_(0xdf1723d3),
+ LL(0x6b3b3e12,0x6076299f),LL(0x49f13a7d,0x210c46f7),LL(0x11bcefd8,0x4c36d81d),L_(0x9b39bf08), LL(0xd49ab219,0xb72e4c99),LL(0x8e53b636,0x0e9348ea),LL(0xa88c581f,0xd67c4ee9),L_(0xa41298b4),
+ LL(0xe899e96d,0xb64bf9de),LL(0x8d198f03,0x43b5e3ae),LL(0xa7cc5c88,0x656b15b3),L_(0xd2995e8b), LL(0xc5c4e24b,0x112512c6),LL(0x409ca870,0x26ff024e),LL(0xccd67ae6,0x4f8c1dc8),L_(0x22878c0c),
+ LL(0x95b13b3e,0x9e553300),LL(0x668c95c0,0x7fafd447),LL(0xf8451257,0x6a113d4a),L_(0x1f574c1c), LL(0xedde7f07,0xaf37550f),LL(0xf5868469,0x0b1d7c54),LL(0x69e02d8f,0xcfd6985a),L_(0x9a97854f),
+ LL(0xecd3e1ab,0xbe482681),LL(0xdc9e0113,0x47798831),LL(0x9fac48a4,0xafbbf20e),L_(0x1edb9dbc), LL(0xd6f1c5bd,0xfe2c6138),LL(0x58a4f161,0xd3d7cf09),LL(0x0fdeccc7,0xa05a2e1d),L_(0xc2e844b9),
+ LL(0x6b3cd8ad,0xa16dcddd),LL(0xe9387af0,0x0fdf0fc3),LL(0x3cb7db3e,0x5144175e),L_(0xc5aef05c), LL(0xdaa284b1,0xb41e11e0),LL(0xc70c6218,0x334a53c4),LL(0xb6f86d54,0xea0526d6),L_(0xd996408c),
+ LL(0xef18bf5d,0x268ce667),LL(0xd54a4821,0x70f67533),LL(0xb9cffb18,0xc3038e8d),L_(0xebd042c2), LL(0x29b2c2c4,0x4d1a3a20),LL(0xd6237f1f,0xe2c18664),LL(0x5ab3157b,0x7a60e7b3),L_(0x6be26cfd),
+ LL(0x1c5c3f1e,0x28e72014),LL(0x5435c35c,0x32068427),LL(0x47c37b5e,0x94c1b6e7),L_(0x0c649b6b), LL(0x5f5b4e72,0x77567891),LL(0x3ebfe7c4,0x55a4f7f1),LL(0xc6f93ff6,0x8f654b8b),L_(0xc6898456),
+ LL(0x8fa02753,0xfcbae4b8),LL(0x9d98e011,0xcff78948),LL(0x22632d48,0x70d86a48),L_(0x247b98b7), LL(0x00132e50,0x3721a7ea),LL(0xad1058dd,0xdcc00609),LL(0x0c2cbce2,0x38fb42c3),L_(0x574791e5),
+ LL(0x5ea4abc8,0x5f3751e3),LL(0xaacf3fc1,0xac364b4a),LL(0x495dd3d3,0xa6c1d838),L_(0x7fd58564), LL(0xba68755c,0x465b3970),LL(0xfc76d6ce,0xfe4e336d),LL(0xfc16f7fe,0x2c759722),L_(0x76296d07),
+ LL(0xdd3a0177,0xcb5a7236),LL(0x9f03a670,0xa2bbecb1),LL(0x1f553745,0x46d5deeb),L_(0xc27cf8e5), LL(0x4c542036,0xa92075fc),LL(0xe9a1424d,0xa99e29eb),LL(0x31176d99,0x7ca41c07),L_(0xd9fd4345),
+ LL(0x39ce1949,0xbff084c9),LL(0x98f4d791,0x43984570),LL(0x05ef0ee6,0x0a861937),L_(0x4abffe54), LL(0x1288a0c4,0x52997092),LL(0xe85a84ab,0x24210cbe),LL(0xec238c31,0x9e2872c4),L_(0x574f26c0),
+ LL(0x40fd474b,0x5b8538a3),LL(0x1c70eab8,0x0d208047),LL(0x1cb60ff4,0x761298e8),L_(0xcfbdc26c), LL(0x1b6d4500,0xbcf74593),LL(0x7f1b2563,0x746b2f75),LL(0x679d4dee,0x32233e28),L_(0xdec42565),
+ LL(0x0c718f1a,0x66cd9b3c),LL(0x18427f69,0x3b3a6f84),LL(0xa9ef5cce,0xca539a7c),L_(0xeb7d5235), LL(0xed44fad8,0x4db83c78),LL(0xc210c701,0x5a9002ed),LL(0x57ef09d7,0x47b485ec),L_(0x27b80c9d),
+ LL(0xe4537556,0x4cc9c9c5),LL(0xea7854b5,0xec59f90a),LL(0x55f05058,0xaa97605c),L_(0x82a4feeb), LL(0x66f84f5e,0x8c26f4dc),LL(0x51a67be7,0xff1f32e7),LL(0xda9cb1ce,0x92d5f2c4),L_(0x3ef1254f),
+ LL(0x5ec4e735,0xffb048ed),LL(0x17a4afa4,0xb9ca6eb1),LL(0x4f8b9e40,0x089b9558),L_(0x6e75ba13), LL(0x43e91e89,0xcca4bf58),LL(0xbbaa89ed,0x21a8592f),LL(0x2180b560,0xa9e4e373),L_(0x2a4fdd34),
+ LL(0x95e834c3,0x85c32c46),LL(0xc68fbf2c,0xad18d468),LL(0xd0c03244,0xf46c7fff),L_(0x8c227e96), LL(0xde2297b6,0x8c32b174),LL(0x6ae73d4a,0x28635d97),LL(0x8b431269,0x47d44429),L_(0x2421faa0),
+ LL(0x28c78e41,0x93181781),LL(0x2ad021ad,0xcb623c4d),LL(0x98d40a79,0xdda4b06c),L_(0x372dd0c7), LL(0x3b688d0e,0xfe3fd141),LL(0xad24bea1,0xedd15e12),LL(0x3a965d08,0xf3097f75),L_(0x27f71cdb),
+ LL(0xbda9cc55,0xa6bfe2fa),LL(0x80a54113,0xf02a2f58),LL(0x1b6a851d,0xcb819b77),L_(0x21f5d0c7), LL(0x30780f8f,0x9f0d56af),LL(0xb5d4e624,0xf8a06fec),LL(0x27c807cb,0xb99605d9),L_(0x75a80279),
+ LL(0x6786d970,0x72255ae1),LL(0xc780fd84,0xc29277a0),LL(0xb9deb14f,0xb01102d2),L_(0xb94bf48a), LL(0x1c8e7e82,0xaf4a6e1a),LL(0x5d7fa22a,0x06c802c5),LL(0x4637b70a,0x21f2e3c1),L_(0x514a3fb5),
+ LL(0xb4a7c609,0x3a6619c7),LL(0xebdd3a32,0x5deb2376),LL(0x24dd90ec,0x7e94da01),L_(0x6003a0d8), LL(0x3788bd2c,0x80b9433f),LL(0x3d74e532,0xd49fdafa),LL(0x47c8e8f1,0x2be1c836),L_(0xce9e83c2),
+ LL(0x7f036147,0xf5f17b3f),LL(0x3b99cbce,0x45a7571b),LL(0x4e68fb20,0x68857bb8),L_(0xa10f6fe3), LL(0xa24d2c8d,0x2d13dee5),LL(0x4f9e2b49,0x88581796),LL(0x118e784d,0xf0493f53),L_(0x9d8cddff),
+ LL(0x58d860e4,0x8971f724),LL(0x316a2d94,0xb4f43e7e),LL(0xb5941f8a,0xb537d4a0),L_(0x5f19914e), LL(0xa327b763,0x0a0d438e),LL(0x5555f01a,0x23118e99),LL(0x2345f880,0xe40f8c30),L_(0x468a1ce3),
+ LL(0xcbd96a39,0x1197dd6b),LL(0xca22160b,0xb47615a0),LL(0x381bf7e1,0x251a8f8f),L_(0x168d73c5), LL(0xad578808,0x34717cff),LL(0x2bd8024e,0x5fbc83f1),LL(0xa4f9d4fb,0x64b6d093),L_(0xff7fe717),
+ LL(0xf183d4df,0xf6acf5ed),LL(0x23f4cacf,0x0cc30970),LL(0x181d2aa6,0x53b37c4b),L_(0x96f6cf89), LL(0x2ce916bb,0x38654a56),LL(0x2803be90,0xaba6d625),LL(0x09ca53b2,0xcdfe1968),L_(0x31bb234b),
+ LL(0x9e6894a9,0xf7c98ba1),LL(0x03ee4c19,0x8e28cba4),LL(0xe28c0250,0xdc432b47),L_(0x6e2b992e), LL(0x52a05294,0xff3120b7),LL(0xbc5f1638,0xd4520461),LL(0x3107ac59,0x92fc422a),L_(0xbc3da988),
+ LL(0x378db33d,0x1b7e14c2),LL(0xafbf4c3d,0x2e5d4aae),LL(0x536bff4a,0x885f68ab),L_(0xbe062464), LL(0xeaff53c4,0x8ea881df),LL(0xd93248b0,0xce5d6df3),LL(0x037450b2,0x6899f186),L_(0x09a8570d),
+ LL(0xe8227714,0xb158373d),LL(0x662aa9d1,0x73e5ad11),LL(0x0d1473e2,0x963a9a91),L_(0x5be0c8ec), LL(0x6796b003,0x32ad74a8),LL(0x5b558e5b,0xcad42d90),LL(0xa157eba3,0x64fb791b),L_(0x3c37606f),
+ LL(0x91b7250c,0xb6fc8bc6),LL(0x88f73c63,0x207504d1),LL(0xa04f258e,0x35b71223),L_(0x9284fb74), LL(0x000189fc,0x8cf221df),LL(0x5e498c73,0xe9692259),LL(0xc7e62afa,0x2482c08d),L_(0x96d697ef),
+ LL(0xa6fa3a45,0xe579dd13),LL(0x2b0e2ed6,0x8643df69),LL(0x57d9dfb8,0x9f01f782),L_(0x4cb4d8ee), LL(0xb5c2c767,0xbb840380),LL(0x358d384f,0x99e8ca50),LL(0x6c698864,0x31b4df34),L_(0xaa8c271b),
+ LL(0xfa87a979,0x6e27995c),LL(0xf59ed52f,0xc806a201),LL(0xc065a04b,0x93cff90b),L_(0x37c928f2), LL(0xbb867037,0x9cdfc841),LL(0x4f37a688,0x0a935f1c),LL(0xa9d96eb8,0xc15bd4d8),L_(0x98cebb91),
+ LL(0xd003f54b,0xa4a49d7a),LL(0xc496b9ae,0xa79d7692),LL(0xa15f7dc6,0xbd4d523d),L_(0x9f46848d), LL(0x6dbfe7b8,0xcc88e7c3),LL(0xcea47678,0x8264318e),LL(0x5e5fd5b2,0x5f2fa1e2),L_(0xe1fd44b0),
+ LL(0xec0ebc0a,0x1936faf8),LL(0xba06a3b9,0xc8c40d08),LL(0x01dd06de,0x54d85f2a),L_(0x18910c39), LL(0x8e9d926d,0xcbcea653),LL(0xc539056f,0x37d0733f),LL(0x0beb45e4,0x3de7fc81),L_(0xd43f2aa7),
+ LL(0x3205880a,0x9850a91e),LL(0x913c877e,0x5464c543),LL(0x1452f874,0xb9637ddd),L_(0xa9b45a5d), LL(0x7298be19,0xdf5911d2),LL(0x01fcff9f,0xf6dfd8a8),LL(0x8bb252ea,0x839f8d56),L_(0x14ad8567),
+ LL(0xc7fe9491,0xa2fc5db9),LL(0x23bc4e41,0x47b2b00a),LL(0x142e5001,0x557178b5),L_(0x7609c04e), LL(0x7281e45d,0x80053d16),LL(0x9af2e131,0x335bfb8a),LL(0x3285f848,0xe9e17269),L_(0xf7e53701),
+ LL(0xd38c0684,0xd98fa793),LL(0x74f33400,0x14117a61),LL(0x0d3b9c08,0x3e3d6538),L_(0x241aea00), LL(0x374f82ab,0x538b9bf1),LL(0x86a9a615,0x1cc16fb7),LL(0xe0c1bced,0xc0de70fa),L_(0x85b224dc),
+ LL(0x96448e8a,0x98c48df5),LL(0x5ba1fe76,0x50f58327),LL(0x4770c98e,0x197ced21),L_(0x2ca4f59f), LL(0x1af1733d,0x2bca7ffe),LL(0x003eeda5,0xeac8a367),LL(0x13278f06,0x5dd0431b),L_(0xa00d2f29),
+ LL(0xa83c536f,0x02379421),LL(0xe322906d,0x218d25f5),LL(0x90caeeec,0xf254a0e4),L_(0x2e6c9704), LL(0x44d824c0,0x0bbdc5a2),LL(0x19e00afb,0x21933c71),LL(0xec2c7cff,0x0a756aae),L_(0x3f239664),
+ LL(0xd8438b58,0x1d02bb13),LL(0xda3809b5,0x25ef520a),LL(0x3dd8667d,0xe3e22c9e),L_(0x68203ac3), LL(0x0d51408f,0x0227f2bc),LL(0x99baf10d,0x090e4a02),LL(0x2fc23bc1,0xf9171e03),L_(0x3a29ec64),
+ LL(0x8d85409c,0xd1184135),LL(0x735db311,0xf357dae0),LL(0x7b364c45,0xb9d690d1),L_(0xee21514f), LL(0x0c5f601d,0xcb872f3a),LL(0x2e8ffdf4,0xbccb4f0f),LL(0xf7bfadef,0x9f017f8b),L_(0xb26ea0cc),
+ LL(0x15442e1d,0x62cd98e6),LL(0x2f59cf2a,0x58dcba94),LL(0x7426c5f8,0x80d0a8cf),L_(0x7c300a9f), LL(0x52648e24,0x3a628b1d),LL(0x1ffce053,0xf0844217),LL(0x9c140c5f,0xb3cc7bfa),L_(0xbb650a75),
+},
+/* digit=30 base_pwr=2^210 */
+{
+ LL(0xf0426be2,0xb4f44241),LL(0xeb69f614,0xefc43949),LL(0x80845fb2,0x90205f0f),L_(0x29198f5f), LL(0x8a6cba71,0x4345224a),LL(0xfb0f1abd,0xfc80d60b),LL(0x9c7703f2,0x3d5a7643),L_(0x663a913a),
+ LL(0xe4b299d3,0x79702991),LL(0xdfeaa3f0,0xad58884a),LL(0xff023a31,0x18b5c6ce),L_(0x8cf14303), LL(0x433c5230,0x3e4907b4),LL(0x13551cac,0x3c1c0282),LL(0xe4454779,0xb4df9ee5),L_(0xae0275c5),
+ LL(0x658675d8,0xdf2f4ac2),LL(0xd8448d41,0xdde660e0),LL(0x50213318,0x64826f9f),L_(0xb76ac409), LL(0xadcc3e46,0xbc26833e),LL(0x508eaf24,0xde547aae),LL(0x619251e2,0xf96f73d1),L_(0x7bcc2806),
+ LL(0xba3e8f2f,0x728cadb5),LL(0x765732f7,0x0feebd09),LL(0xdb740393,0xdcffa1d6),L_(0xab748823), LL(0xa742cd70,0x549a4fca),LL(0xf07ac1f7,0x3d24aeea),LL(0x426c42e9,0xb67d7f28),L_(0x497b724b),
+ LL(0x96cc626f,0xd2b3305b),LL(0xab29e4cb,0x355d47d3),LL(0x33f53993,0x960f4207),L_(0xbf71ccbf), LL(0x329378d4,0x1004c020),LL(0x86ffcabb,0xa9117cf0),LL(0x0e5dbd85,0x73f55c21),L_(0xe9de73fd),
+ LL(0x456357ca,0x1b3ded00),LL(0x47adbb71,0x0f0f2d4f),LL(0x51648f45,0xab4e5da6),L_(0x4659c423), LL(0xe96f0203,0xcb55e2cd),LL(0x74ebdf1a,0x7b3cc4d4),LL(0x0090498b,0xdfb4de74),L_(0xc69c1621),
+ LL(0xba643590,0x757e6fbb),LL(0x65485c65,0x95336360),LL(0x50d4d37c,0xac96f5a7),L_(0x676d85ce), LL(0x53008bb9,0x33869046),LL(0xf21c0791,0xfb1262f1),LL(0x1e3e57ec,0x407af3f6),L_(0x6c3c72ca),
+ LL(0x9d6ad458,0x78e956e9),LL(0x46bcbf36,0xb94af545),LL(0x32977879,0xd20f35a3),L_(0x3ba745fd), LL(0x9c65ff22,0x5c8f99f9),LL(0xac6bb14a,0x4ce9a00d),LL(0x307b3d8d,0x798d2cf9),L_(0x9ddb4cad),
+ LL(0x3b8e6ef6,0xb6ca3273),LL(0x5ade36d2,0xe260b8d0),LL(0x9c66c2a4,0x05eb84cf),L_(0x884d04c5), LL(0xbe1f3ed0,0x1e35adca),LL(0x4cff4e8c,0xa175edc2),LL(0x4681a0ae,0xc6715ff6),L_(0x506a8488),
+ LL(0xe9c88637,0x32143c93),LL(0xdf482c05,0x434818e2),LL(0x25a929c9,0x4c806ec9),L_(0x1179b4ee), LL(0xfe3e80ad,0xa0372526),LL(0xf64ea692,0x5279eb89),LL(0xee97419a,0x98dbe31d),L_(0xdfad8124),
+ LL(0xe8bb79d4,0xa6d3938a),LL(0xbdea4fe1,0x0b2f88a1),LL(0xf279df50,0x59a54b2e),L_(0x343b8869), LL(0x1390a7ad,0xc9c37e25),LL(0x9e03f761,0x0777586e),LL(0x3aa2516a,0x42cece95),L_(0x732cba8a),
+ LL(0xa47e21c2,0x5f9875c7),LL(0x327db722,0x2ecbc86c),LL(0x4ac56066,0x5ea26fc2),L_(0xc69b2d5c), LL(0x31e429d7,0x944c3736),LL(0x7cb051f9,0xcf2fc959),LL(0x02c3927e,0x3bb33cf9),L_(0x5a57d920),
+ LL(0xcf56d754,0x64f98e4d),LL(0xfbe5a38c,0x1c7766cb),LL(0xb20cfe07,0xe351283a),L_(0xd825af7e), LL(0xdc9dc466,0x3bee62a5),LL(0xe5b281f4,0xb2e1f644),LL(0xfe54699d,0x18ee6ea1),L_(0xe71cfdbc),
+ LL(0xd2fe136e,0xe5f658a8),LL(0x39fa85ce,0xd83b5473),LL(0x94a1a0d2,0x586d7529),L_(0x208e5f0f), LL(0x0748fda7,0xe98d9b7d),LL(0x869e47b2,0xf0def9e4),LL(0xc4e12cd5,0xf40402da),L_(0xe2e9c40e),
+ LL(0x2956c763,0x257681d9),LL(0x9408aa0f,0x696e0261),LL(0xfd84ba5b,0x0675debf),L_(0xa7a000fc), LL(0xef9b82a6,0xe38868a1),LL(0x8226a77b,0xcdcdf922),LL(0x292fb9c9,0x269d71d2),L_(0x587c3f9c),
+ LL(0xb5fae58f,0x55622b3a),LL(0xb3258e77,0xff23a08c),LL(0x56c2b54e,0x866ba05b),L_(0xb8835413), LL(0xa737dae6,0xdc5131fd),LL(0xbcb13de4,0xbb1176e5),LL(0x860b7b0d,0xf51c76d2),L_(0xfc88df27),
+ LL(0x6bd647f3,0xe811642e),LL(0xf28850fd,0x0776f556),LL(0x2c9fb90d,0xb8cebf02),L_(0xa7ba32f0), LL(0x643fb866,0xc4902b6c),LL(0x3a4ba84e,0x74aac273),LL(0xfd2878e7,0x1a76b1b7),L_(0x4e9ed0a9),
+ LL(0xf609c0b0,0x0cfea42c),LL(0xc8c86640,0x7a72c3c6),LL(0xb9872dc7,0x1ae5bcf6),L_(0x4967c18a), LL(0x9fe44849,0x2a90f4d7),LL(0x7c9836d4,0xdcdd6bf1),LL(0x32eb5ac2,0x939219ad),L_(0xa85aba1e),
+ LL(0x267059b7,0x2669c8c4),LL(0x92b26067,0xb6ba656c),LL(0xc80a4182,0xa67b63ae),L_(0xdabf1310), LL(0x7acd503c,0x98520b74),LL(0xa4e52b3f,0x0688ae94),LL(0x47fc66da,0xacf9786e),L_(0x53a32432),
+ LL(0xde210bb4,0x74430a09),LL(0x341d2f54,0xf0e810c7),LL(0x85cefd4f,0xba1cac0a),L_(0x649747b6), LL(0x35194ff2,0x6452e158),LL(0x3bf68483,0x8ed85e25),LL(0xd8535bc9,0x3bc32918),L_(0x1618b5a8),
+ LL(0xd3467c73,0x3046a69b),LL(0x11b44c9b,0x996236b5),LL(0xf02f1b90,0xdbce524f),L_(0x2880b5ed), LL(0xdcc369a7,0xa2eda832),LL(0xbc28c7a6,0xcb124909),LL(0x33444c56,0xb4685d00),L_(0xc588ee2f),
+ LL(0x6fe5a182,0xa316d37d),LL(0x7b8d3ccd,0x75ec9a2a),LL(0x8b98fad0,0x0c5e4465),L_(0x96299b8e), LL(0xbd855a8e,0x7661287b),LL(0x21ef677f,0x9b044bfa),LL(0x0f23ddbb,0x7abd77aa),L_(0x217ef151),
+ LL(0xe7d89f59,0x490f55aa),LL(0xf4051055,0x3aa72313),LL(0xdea3a145,0x159c120c),L_(0x3a83cdd8), LL(0x840bb947,0x1516983e),LL(0x3c23bffe,0x527c0f73),LL(0x0d4d39e1,0xe3846304),L_(0xa097f7b6),
+ LL(0x56c53d60,0x8c3176ff),LL(0x95152224,0x26489625),LL(0x94c341e1,0xa5b14d8d),L_(0xe01267c9), LL(0xb4f1f613,0x1a2f793c),LL(0xd1a0049e,0x600ebda3),LL(0x6ba99e2b,0xd1571ee0),L_(0xc34b7e2c),
+ LL(0x122b663a,0x41a70d6d),LL(0x5102d2ac,0x50c3e831),LL(0x37bdeb4c,0x948ab46f),L_(0x69f45329), LL(0x1a55a55b,0x3b20c1e6),LL(0x22ef8bd8,0x81e5763b),LL(0x4ddc462f,0xffa876e2),L_(0x8337e2e2),
+ LL(0x62e4c32d,0x7f945839),LL(0x8947b09f,0xa1e798f7),LL(0xfe755aec,0x5524084e),L_(0x72eaa739), LL(0x02c2a9e3,0xdc627b0e),LL(0xc75c26c5,0x7c827c47),LL(0xbcf0b634,0x677ad978),L_(0x31454aa7),
+ LL(0x74af562d,0x8713ce0f),LL(0xf85d00e9,0x6951ea39),LL(0x23d2ab0f,0x761f3a78),L_(0x1c36b814), LL(0x098fb6b0,0xeb48e791),LL(0x84522286,0x160c9294),LL(0xf1992cc6,0x2ed7be4f),L_(0x48acfd7d),
+ LL(0x02ad20b2,0x30165084),LL(0x162d53f9,0xb8bee43f),LL(0x67757e6c,0x0eedd6d6),L_(0x00fc0927), LL(0x5acf9124,0x8dee8798),LL(0xa5fd0b77,0xa4c99259),LL(0x9970bc21,0x54e339cf),L_(0x9e45d123),
+ LL(0x7f335ce0,0x5019bc77),LL(0xcd9df5c6,0x15ce5f7c),LL(0x4f31c43e,0xfa69d995),L_(0xdaf4bdbc), LL(0x1d57d52d,0x20dc7c66),LL(0x1ccb081b,0x01a82796),LL(0xa8fa2376,0x861ac30c),L_(0x519f6c6e),
+ LL(0x56acbf12,0x7b20a0c7),LL(0x54051bfe,0xbec3d69c),LL(0x5e324e3c,0xd3d97b66),L_(0x5235011b), LL(0xc585e141,0x2b8e18cf),LL(0x3540e46d,0xe0b2513f),LL(0x6e7d6c03,0x7e1a6116),L_(0x9b468e4d),
+ LL(0x23bf2ce9,0x82122cee),LL(0xa723e8e2,0x318ba203),LL(0xa93e44d4,0xd2180b18),L_(0x643b190c), LL(0xd9d85de9,0xd7d06345),LL(0x0751ebbc,0x5bea35e9),LL(0x952d933c,0x72bd41e8),L_(0x2910ff54),
+ LL(0x60e9cb5f,0x107232fb),LL(0xd6c371b4,0x004f8683),LL(0xa23e4299,0xefa3c56b),L_(0x8d86e9ba), LL(0xad436904,0xbb576a94),LL(0x9a66d1e1,0xbd78745f),LL(0x3513e3fe,0x4066ae12),L_(0x69b558b0),
+ LL(0x627d1808,0x7365dc29),LL(0xe9b14b35,0x0dec4459),LL(0x96d5022f,0xf4343e09),L_(0xf65c2fb7), LL(0x00d16dd7,0xeeaa6e35),LL(0xe87ecb3a,0x220f953d),LL(0x91ecc397,0xaf714cd0),L_(0xaea56471),
+ LL(0x6dd11273,0xce83daf3),LL(0x0a835712,0x6ce5dec2),LL(0xce89d045,0xbafd94a5),L_(0x86e671a6), LL(0x577ca0e1,0x1e36fd91),LL(0x6fe72f1f,0x060d396f),LL(0x729ba81d,0x8b7e4fbb),L_(0xea9c3f32),
+ LL(0xdbaa1960,0xb43de333),LL(0x030ad3be,0x2ccf4a4e),LL(0x036ff9cf,0xafc236c4),L_(0xe987e57b), LL(0xd7468cbc,0x9a645200),LL(0x61eddc02,0x5b2deae6),LL(0xb553572e,0xd4efa381),L_(0x9dde1eaa),
+ LL(0xc9536b4b,0x10222aaa),LL(0x6d0e36c2,0x84934c38),LL(0xdf7ca8e3,0x5e5dc148),L_(0x2da86a73), LL(0x4d98778d,0xb7c8140c),LL(0x69fc5568,0x69c09498),LL(0xb0ea1d36,0x7e0cd235),L_(0x6c99f36a),
+ LL(0xe9443a73,0x94747e78),LL(0x377b44d6,0x2415da80),LL(0xf50cdd9d,0x65d2fa97),L_(0x9d194135), LL(0x3ca31050,0xaf39be74),LL(0x06450aa6,0x0441383f),LL(0x393e3175,0x4e5bd1d4),L_(0xb7244573),
+ LL(0x70145556,0xc463ec32),LL(0x867b11cf,0x1e5a98cb),LL(0x59b3adf7,0xeb7c80fc),L_(0x0929efbf), LL(0x5234550c,0x4eb610a4),LL(0x7d606935,0xdc8db9ba),LL(0x52106057,0xbc3a065e),L_(0xad60a058),
+ LL(0x6e360f56,0xee7f7e1c),LL(0x4a514c99,0x7411bd70),LL(0x627a5d54,0xb191903e),L_(0x9d4472f8), LL(0x6bb808ee,0x484c498f),LL(0x110de6ea,0x3cef8b7c),LL(0xcc379eda,0xe1f0ee29),L_(0xcdc2d24b),
+ LL(0x21a05590,0x2ea40699),LL(0x953235f9,0x057a8486),LL(0x5834fcc4,0xb35b630b),L_(0xef9321a5), LL(0x2d1d0e73,0x6560d0d6),LL(0x4083b1e7,0xeb026a8b),LL(0x4d572129,0x720991c7),L_(0x98865061),
+ LL(0x657c8db8,0x5e4f7ccd),LL(0x35de8d7a,0x8351fe6b),LL(0xa43443b2,0x48c1ec10),L_(0xdd11de81), LL(0xb376d6e3,0xc77d6dfd),LL(0x73bed5bf,0x0f953512),LL(0xeae9d0a1,0x91a7a744),L_(0xfeb76333),
+ LL(0x59454f28,0xd2c2004d),LL(0x9f5eebc7,0xacc344aa),LL(0x775a61d7,0x1c186106),L_(0x47a8ab1c), LL(0xdcf00b61,0x4e3f081c),LL(0xbc56bbf8,0xcaa9cad2),LL(0x1e4e523b,0x816a09ca),L_(0x5e9a9445),
+ LL(0xd468c097,0x86aa5ecf),LL(0x244131ce,0x26d08883),LL(0xe43dffa8,0x6501f291),L_(0xf4cfc564), LL(0x88248cda,0x4711c711),LL(0xf7fb2e43,0xa4245343),LL(0xcfde7c18,0x4111cd00),L_(0x5a68a986),
+ LL(0x0df3b4b1,0x9cf9b276),LL(0x71920b8d,0x9dd92d6a),LL(0x6444967a,0x5f3bbd8f),L_(0x82870cd4), LL(0x1a4b4821,0x2d798278),LL(0xd460ee52,0xe9681e54),LL(0x0ce3d37c,0x739d5ad5),L_(0x5645ee72),
+ LL(0xcf20f025,0xf4697953),LL(0x6debfc44,0x789e6af7),LL(0x1050c0c2,0x383c22fa),L_(0x22fd43b3), LL(0x5cc2adcd,0x2ace7063),LL(0x55ea131f,0xf6f6aaf0),LL(0x31c60f20,0x7b350e28),L_(0x9f8df3bf),
+ LL(0xf49e5f62,0x1a92eddc),LL(0x24db3514,0x365a5041),LL(0xc89ba67e,0xa32fc59f),L_(0x33efcf95), LL(0xdb9db26c,0x09322a72),LL(0xf91f9ca4,0x3fda4216),LL(0xc6c63b34,0xddeb9986),L_(0x9a067f25),
+ LL(0x77b280f2,0xc18c7395),LL(0x93723817,0x4cd03829),LL(0x37436f93,0x66528f8e),L_(0xeb73448c), LL(0x2dd6704b,0x83b283eb),LL(0xedc8d2d1,0x54972ce7),LL(0xbca75a4c,0xa9f10506),L_(0x91b481a9),
+ LL(0xee53ff2f,0x5105c866),LL(0x7f1e21b7,0x02b0042d),LL(0x1f9de3bb,0x4f9500fd),L_(0x89fa5ada), LL(0x8cb6dd5d,0xaa04e960),LL(0xb2782218,0xa0112a6f),LL(0xec0e66ff,0xec305363),L_(0x77fc7f14),
+ LL(0xa014524c,0x400fd142),LL(0x17086d36,0xf02c64c2),LL(0xd9684416,0x8da612c7),L_(0xb46c7e04), LL(0x4e54713c,0x7cde46af),LL(0x0546cc9f,0x8380cc14),LL(0x5013084d,0x80963cc8),L_(0xf957f8d9),
+ LL(0x6dcbbe49,0x6b6125b6),LL(0x038efe1a,0x67b840bc),LL(0x16c79367,0x570c02ad),L_(0xcb60af87), LL(0x8552cefe,0xa8167ca5),LL(0x5e88a6fd,0x3636e864),LL(0x9c4305d9,0x43d5af7e),L_(0xc9e5c723),
+ LL(0x413cd65a,0x9c95b00e),LL(0xb0a4ab3f,0x64a28801),LL(0x6ef01bfc,0x858e4b79),L_(0x80657f33), LL(0x113a4fdc,0xd390a92a),LL(0x71a0cef2,0x774c1209),LL(0x63557ff4,0x54e47eaa),L_(0x4ea9a478),
+ LL(0x27760c7e,0x9e3147b9),LL(0x656b24fd,0xb9bb9711),LL(0x89363a50,0xe852edfe),L_(0x6bf2556d), LL(0x43ee10a6,0x2d6acef6),LL(0x3e9d7e57,0x03fc12e9),LL(0x20890385,0x2d45580b),L_(0x6b8bf1da),
+ LL(0x4101d170,0xbebb2e76),LL(0x7fdf91ff,0x533638ee),LL(0x05bdd7f6,0x92a0bd39),L_(0x78bac139), LL(0x4c760097,0x81c6243b),LL(0x8d71803c,0x5119eeba),LL(0x049c6a06,0xc410f246),L_(0xa9b7c2f7),
+ LL(0x51167f9b,0x12be7d2f),LL(0x66cdc913,0xa41ce391),LL(0x0572301a,0x0a761ede),L_(0x2a186fed), LL(0xe5dca065,0x3dad4d6c),LL(0x14733148,0x82d548d7),LL(0x79a33fd1,0x76d2d77b),L_(0x744a660e),
+ LL(0x77f53015,0xa4c2daab),LL(0x54ae5f2a,0x40a7d787),LL(0x604bbbf3,0xcc41bd91),L_(0x7fe1506d), LL(0x4c6757d5,0xe55da08f),LL(0x38212cd6,0xf50459ca),LL(0xf8d3a03d,0x8252e5cb),L_(0x62160548),
+ LL(0xaaca1be2,0xb4f7cd9f),LL(0x3012b6d5,0xfae3835d),LL(0xf685dd47,0x6c5b897b),L_(0x3f52f5a3), LL(0x03e5ac2f,0x71afc215),LL(0xdc13191e,0xce6c64cf),LL(0xa1bdc366,0xe59eacca),L_(0x719ce6ba),
+ LL(0x28e18007,0x428bd7b1),LL(0xba236a3e,0x3bf0eb6c),LL(0x69ce21e0,0xfbe09c69),L_(0x321ac5e5), LL(0xf7c3e583,0x3283bc61),LL(0xaf3a5b06,0x20ead3f8),LL(0x1f935f24,0x3b040b57),L_(0x39549c75),
+ LL(0xa23c1b85,0x41a0017c),LL(0xc677b960,0xc09598e4),LL(0xffd68469,0x1da39b13),L_(0xdfff7bf9), LL(0xb19fcd21,0xe71a0fa0),LL(0xc987c7de,0x83e812da),LL(0xb605b69d,0x0efdfc84),L_(0xdde3a792),
+ LL(0x656d6dd1,0x58a3f7d2),LL(0x9e07158a,0x1396fe6b),LL(0x52fddb17,0x39edad21),L_(0xd739977f), LL(0xfb57f56a,0x1072b4e0),LL(0x80c7df0a,0x94372dad),LL(0x0a26aff2,0x88f38fd7),L_(0x5d33e01b),
+ LL(0x6d4895a4,0xff2438e1),LL(0xa9ba3f6a,0x67f22bee),LL(0x3cfaa48e,0x6bf9fc2b),L_(0x702030cd), LL(0x7b4df30f,0x956e9ec2),LL(0xe0368ebf,0xe6cb0b1b),LL(0xfc98eaec,0x7dbf18a3),L_(0xf5fc22a9),
+ LL(0xf20afcc9,0x9b4028ed),LL(0x2adb3986,0x4e476a55),LL(0x6bf05b58,0x2b0c488d),L_(0x74de42bf), LL(0x01d3ca75,0xc0d6bd28),LL(0x668206d5,0x95f353c8),LL(0x010298ee,0x034e53ca),L_(0x13b81d0b),
+ LL(0x80ff52bc,0x50412d11),LL(0x652fe1b8,0xbe2f9f7b),LL(0xe84a58ad,0x83284261),L_(0x905c06a9), LL(0xc605b12c,0x5da82b44),LL(0x2ca210de,0x837f9c22),LL(0x10d656cc,0x454d1413),L_(0x5a580fa0),
+ LL(0xde3d1dc5,0x6619a39c),LL(0xac6af7d7,0xaaa9723b),LL(0x3910ae67,0x86fdb715),L_(0x4d8f0cf8), LL(0x3782c29b,0x5c35eb01),LL(0xe1483a4f,0x76b4be95),LL(0xdd570ea6,0xf56b5810),L_(0xefb949a7),
+ LL(0x9ec12516,0x3f080f23),LL(0x108296b6,0xc3509a49),LL(0x08bba00b,0x07998613),L_(0xdc853801), LL(0x5c36ecb3,0x75c6840a),LL(0x73946b3d,0x3e8f5265),LL(0x2c678e3c,0xc7f1cc73),L_(0x284107e6),
+},
+/* digit=31 base_pwr=2^217 */
+{
+ LL(0x2409728d,0x2d5fd352),LL(0x84897b53,0x28f3cb13),LL(0xee72bd56,0x21c2f494),L_(0xf66c03f3), LL(0xac73118e,0x283e1b56),LL(0x3b39e360,0xf00c3802),LL(0xaa6c7b0a,0xee304f23),L_(0x0dd1d011),
+ LL(0x5b89b52c,0x433d8d17),LL(0x440ff02f,0xec27bd07),LL(0x49353c25,0xf18b23f5),L_(0xd9e62ddc), LL(0x2c798eed,0x91011438),LL(0x30fcf910,0xfaa77bac),LL(0x6e2db36a,0x2a3b730b),L_(0x3ada8eb1),
+ LL(0xea09f155,0x18c36c89),LL(0x3ba3b853,0xff1cf2a0),LL(0x1d069cd7,0x672fde0f),L_(0x0a42b710), LL(0xf1f4e5ba,0x86238146),LL(0xabca7963,0xcdc7fd6a),LL(0x00bcd404,0x51a105eb),L_(0xf842633a),
+ LL(0x348659fb,0x0afc95de),LL(0x4b20153e,0x478c3432),LL(0x1f2f8d2f,0xaa0e8781),L_(0x27294e88), LL(0xbf3811ff,0x526d1fb9),LL(0x9ad871cc,0xf802b4ad),LL(0xf613e178,0xd3df21bc),L_(0xb619f301),
+ LL(0x40af417a,0x3b133f03),LL(0xb449508f,0x9b5dda1c),LL(0xc2f372b3,0x3948b7d7),L_(0xba404740), LL(0x99028594,0xbcf7e27f),LL(0x96542b58,0x1de8aa5e),LL(0xb2fc7cd3,0xaadbe95a),L_(0xaa07786d),
+ LL(0xff2c8bea,0x26721264),LL(0x5d2747dd,0xbd6c65e6),LL(0x7f2093a5,0x21e5d488),L_(0x2ff2524c), LL(0xa000a3ed,0x68530945),LL(0xef75ea86,0xd1f6fc3b),LL(0x3f15aab2,0x9b5d8cbb),L_(0xfc18b474),
+ LL(0x45f74206,0x97a4da7b),LL(0xcc1484f1,0x6d246546),LL(0x819c4b2d,0x8255bc16),L_(0x4605c7b7), LL(0xf9d396e2,0x5502b719),LL(0xfde1aa97,0x8b9b6ca7),LL(0x94965c57,0x3c7a5ffc),L_(0xea93e0d6),
+ LL(0xc11d6985,0xbad3d4ba),LL(0xb1adc951,0x67c5bea3),LL(0xb82cec9b,0x93b6322c),L_(0x8ae8a415), LL(0x9661c047,0x769c204a),LL(0x31aa2f54,0x35880fdb),LL(0xc215f2cd,0x4f5bf77f),L_(0xe0f608d2),
+ LL(0x8bce7ed0,0x847b9ee6),LL(0xb2892f4e,0x8cb1f02a),LL(0xfffe0edc,0x62c22364),L_(0xb0229884), LL(0xdcd7d51e,0xa9cd4c50),LL(0x4688d647,0x30edb5dc),LL(0x82ea29e2,0xcc4403d4),L_(0xb78d8b6a),
+ LL(0xed02ad3b,0x66e7f904),LL(0xdf2ace65,0x2877668a),LL(0xe7bcfa22,0x873070fa),L_(0x3a2466a0), LL(0xf013615c,0x2fe9dfb1),LL(0xe228049a,0x51ff974b),LL(0x56961e83,0xcd87825f),L_(0x0c9c9408),
+ LL(0x5b989bda,0x2f915297),LL(0xca9c644b,0xcf0387e6),LL(0x80e7dd9f,0x2e7c6dd7),L_(0x4b7f801a), LL(0x861c2ffe,0x1df12d2f),LL(0xe8fd6f24,0x048668bb),LL(0x9b862a1d,0x2b64be2a),L_(0x4dde2a3c),
+ LL(0x644173f8,0xc3611806),LL(0x23a43a5b,0x78a6d7ad),LL(0xe22b26dd,0x1dd89345),L_(0xfd5f2c34), LL(0xd1587983,0x7692c1c8),LL(0xca1f4a95,0xecf6b1c3),LL(0x0a975fb0,0x0d6babd5),L_(0xc6e6c5b9),
+ LL(0x4222b0ed,0xb5c91a5b),LL(0x6d847e8b,0x0ec3e064),LL(0x9d0d2af2,0x660e553e),L_(0x0aaf0e60), LL(0xa6329190,0xff1f387c),LL(0x9970f312,0xd795c508),LL(0x67e40e1b,0xdada8e3d),L_(0xe265b2ea),
+ LL(0x6eb26317,0x4e1593ef),LL(0x12da5305,0x8698f986),LL(0x2d0a715c,0x8e8b3499),L_(0x80e2d2d8), LL(0x0b43672b,0x132c1c9a),LL(0xee8ab3bd,0xfd973660),LL(0xea97e0b3,0x3b811a56),L_(0xbeaaf50d),
+ LL(0x3edb12e0,0xf66872e6),LL(0xb9ab7a65,0xc41cad86),LL(0x0cfa43fd,0x43f4aa49),L_(0x781ca102), LL(0xcfa7ab7b,0xafd31516),LL(0x061e0da2,0xc78d7ba1),LL(0xea786f69,0x2090d8fa),L_(0xdf64f185),
+ LL(0x7ee50090,0x28c86852),LL(0xff58b162,0xd4576859),LL(0xc2987502,0xe596765e),L_(0xf8c4c45c), LL(0xfb631b85,0x42aaadd8),LL(0xb6c6bfcd,0xf7d72923),LL(0x2257f5b6,0x260ae885),L_(0x2f0626ed),
+ LL(0xdb84c9ba,0xdbb13e44),LL(0x7c40add1,0xa7294693),LL(0xc1443c26,0xe02af6c2),L_(0x935cf64d), LL(0x293f667b,0x52bbc8cd),LL(0x5d49c23c,0x7e1de72e),LL(0x6907cdc1,0xf8a9aeab),L_(0x01bb3a0e),
+ LL(0x3fade183,0xd7401dde),LL(0xa78758f9,0xc85449b6),LL(0xc47549c9,0x6ec51217),L_(0x5c22aa19), LL(0xae146939,0x4bbe9886),LL(0xd2682769,0xee34940f),LL(0x9f320ada,0x4fdf9e41),L_(0xaa18dddb),
+ LL(0xf506f84a,0xf58881e9),LL(0xe2a44aae,0xd6feb621),LL(0xedfd3c65,0xb163b10b),L_(0xd0eb9a35), LL(0xb8f8a7bc,0xb10b02be),LL(0x2524cc98,0x1e5816c9),LL(0x0ad84066,0x9cd4eb66),L_(0xecbabab5),
+ LL(0x413431bc,0x9ea4aaec),LL(0x217b55d3,0x135f5f2b),LL(0x9e4519f3,0xd3e6e8f7),L_(0xb072b798), LL(0xfa8179f9,0x318fb330),LL(0xcb83a9f9,0xe0cb106a),LL(0x95e1ca87,0xfb4ce48c),L_(0x87fc571d),
+ LL(0xf3d74e55,0xb7fb663d),LL(0x3bebc7e0,0x6706a48f),LL(0x7f8a7cfb,0x52d7353d),L_(0x13ea8891), LL(0xc42a9ef4,0x5bd192eb),LL(0xdfeb9aa7,0x2b1ff6c0),LL(0xaa53702a,0x5388fa6f),L_(0x7ee98651),
+ LL(0x423e53a4,0x0baae890),LL(0x6536911d,0x08234190),LL(0x9bfec6fd,0xc8f4d373),L_(0xd7ec5802), LL(0x119e3477,0x19587b51),LL(0xfac91771,0x1c276e15),LL(0x951dd485,0x98048932),L_(0x04243a3f),
+ LL(0xbe2d77ea,0x67d742de),LL(0x2df6c417,0x7983fd12),LL(0x7115e508,0xb9406bb8),L_(0xde1f9fde), LL(0xe45eb298,0xdf3a7991),LL(0xa54dc400,0x03ba9fe4),LL(0x25d8f862,0x6ea3053f),L_(0xb145e5fc),
+ LL(0xefbe9106,0x266e3900),LL(0xb0d74420,0xe042e34e),LL(0xbec6b919,0x5cb15a6f),L_(0x6c16d3f4), LL(0x75686740,0xfe7b7595),LL(0x2204cb17,0x3e67572e),LL(0x2d437dfd,0x03299218),L_(0x2be5d786),
+ LL(0xc2d6c314,0x3d460901),LL(0x3d26026c,0x591fe51a),LL(0xeb85aa17,0x44d65538),L_(0x015a9b39), LL(0xea596f91,0x48a2f0df),LL(0x8ce8790a,0xc2cabfcf),LL(0x17f7dae8,0x31a2b7ff),L_(0xba200e74),
+ LL(0xb389e985,0xb19669c8),LL(0xa23e72e7,0x729a4108),LL(0x53062f9c,0x779cbefe),L_(0xde2e49fe), LL(0xa29b29cb,0x6119b4c5),LL(0x0f5a398b,0xeb10107e),LL(0x91c7a000,0xd43d23aa),L_(0xc42c4a03),
+ LL(0xb2465ace,0x954d5e2a),LL(0x361566cb,0xcc9f7e66),LL(0xa5432c5d,0xd4ffbeb9),L_(0x5d478258), LL(0x686dc22e,0xb3aa6ec4),LL(0x29d8cc0b,0xf9a59b06),LL(0xd8d7140f,0x94e1344f),L_(0xfd56ad11),
+ LL(0x7dd1f80e,0x241f38ad),LL(0xc4ce241f,0x72ffb97f),LL(0xff97f61b,0xa3d97bc2),L_(0x9c42f7da), LL(0xd4e6e73b,0xb4b19841),LL(0x1c3d7005,0x5fd346b8),LL(0xa14d6ec3,0x366b72b2),L_(0xd6218402),
+ LL(0xb6fe5b76,0xe3a6e8d3),LL(0x6941f5ec,0x4ed1cc1b),LL(0x9f69a8a4,0xe6f9dbe8),L_(0x8ff4ee20), LL(0xa4d858f0,0x00a65edd),LL(0x30c9c798,0x9733fc57),LL(0xd4ab5744,0x38f910bb),L_(0x08dd1912),
+ LL(0x338c1ad5,0x4a664d78),LL(0x90d8cb53,0xd6ec4c42),LL(0xaee2829b,0xededd826),L_(0x0c5337aa), LL(0x417e0806,0x2c83b6ff),LL(0xd8bc600c,0x65e85629),LL(0x54ffde80,0x8972a5fc),L_(0x465b9ae3),
+ LL(0x49c2561b,0xd2b48b48),LL(0x6937dcf3,0x38241d90),LL(0x7dc5afe2,0xc399df03),L_(0x9c6cdf52), LL(0xc98d8a84,0x666e5386),LL(0xb9102fbb,0x33895284),LL(0xb43f7afa,0xb804c149),L_(0xfe016452),
+ LL(0xd0681519,0x93423c26),LL(0xa105d538,0xc2eabb36),LL(0xea12b99c,0x9297a177),L_(0xb26a7f93), LL(0xddfee3a3,0x4de65e15),LL(0x9a81b364,0x7f3bad80),LL(0xe43ae1fc,0x7af9ba54),L_(0x86e1e8dd),
+ LL(0x13762e74,0x5afe2e21),LL(0x8fe945bd,0xa21b9a1a),LL(0xd03deaed,0xd498e9f2),L_(0xe67e5384), LL(0x6ae69ee9,0x749eed42),LL(0xdd52d330,0x5f4c63de),LL(0x95aa2f5a,0x890e5e3e),L_(0x3772d05c),
+ LL(0xdea7e04a,0xbf3bb703),LL(0x449cf48c,0xc64a209c),LL(0xddb56124,0x6858318b),L_(0x25ad4355), LL(0x9e3a0204,0xf0dbd02b),LL(0xa3421c63,0xa216442b),LL(0x5ebba836,0xc0cbf7a0),L_(0x4f9c0d9f),
+ LL(0x9bdf3b82,0xe5bfa2bd),LL(0x0e12030e,0xef3da843),LL(0x7b3913de,0x107bba5b),L_(0x390841ba), LL(0xda5362ce,0x81eecff8),LL(0x2734c216,0x151060a4),LL(0xd9ea79af,0xe89b5db6),L_(0x2aafd537),
+ LL(0x310d44fd,0x4509feca),LL(0xa4868c10,0x25aa7253),LL(0xd40c4268,0xa958ef77),L_(0xe8930722), LL(0x5dae221c,0x71fc93e9),LL(0x0095e400,0xc3e3cb95),LL(0x0f45640e,0x6b7cb33b),L_(0xb3ea06da),
+ LL(0xc74fe8dd,0x8c9ef406),LL(0xaa86860f,0xb6fe758b),LL(0x04aa9cd6,0x4f8b3877),L_(0xdfcc0451), LL(0x9f568192,0x65aed657),LL(0x44ebcd65,0x85d0ebdf),LL(0x7968220e,0x04b5f3d4),L_(0x44142172),
+ LL(0x275a3076,0x3a2a339d),LL(0x88744d58,0x8a7f68a4),LL(0x5e03cf06,0xd663fea8),L_(0xdffb3ac6), LL(0x83dd1969,0x6151157a),LL(0x18fce4cb,0x620979ba),LL(0x6d82e1aa,0x3ac652d1),L_(0xa3d0c2ce),
+ LL(0x9f8e323e,0xed2fa4ec),LL(0xf62c31ca,0x554cf5e8),LL(0x14820bd1,0xc72e2e81),L_(0xb42dc3c7), LL(0xe15fa1be,0x5f0c938d),LL(0x0920a90b,0xdf2d997a),LL(0x33617c0a,0x3087e812),L_(0x631962db),
+ LL(0x7f81aff6,0xd6ea063d),LL(0x1c54d79e,0x631cf97e),LL(0x46b66ca3,0x3bfc14a4),L_(0xa20e2ff9), LL(0x3a379a19,0xaa5dfd05),LL(0x5f4d0392,0xf3af9e8f),LL(0x95b8ff29,0x928c3c53),L_(0x28ae39a9),
+ LL(0xe65a2e0d,0xa11c784f),LL(0xb5192f99,0xd33e59b1),LL(0x2f4c50c4,0xe15fe3e7),L_(0x30149c86), LL(0xe61d0a03,0xdff24b95),LL(0x2ec9f885,0xd0e84cbb),LL(0xc9c516d5,0xbc6f5dd3),L_(0x71fb6b1e),
+ LL(0x828d848a,0x55c5a959),LL(0x503ffb7b,0xed8f7fcb),LL(0x2be30973,0x0b24dc92),L_(0x90b2a59f), LL(0xc98877f6,0xd599613c),LL(0xe60dd939,0x43a0bc0a),LL(0x34b1b90a,0xa8edd1ca),L_(0x7ca529dd),
+ LL(0x126c6d32,0xb92a7bd7),LL(0xda613cbe,0xd9952b27),LL(0xb5f3accf,0xd21fa7b1),L_(0xda44ff77), LL(0x6ac1dedb,0x7d8ef38b),LL(0xc4ea5e03,0x26d207ab),LL(0xc01bf44b,0x58c8cee8),L_(0xb8f1a2b5),
+ LL(0x5d2a899c,0x94d31b36),LL(0xbc559f35,0x3050256c),LL(0xd6d74149,0xaa4efe0c),L_(0xbc1f929b), LL(0x9b7a733f,0x491dc4d2),LL(0x50e69c58,0x7540af9a),LL(0x358ed8d5,0x17dc58f7),L_(0x5a66b29f),
+ LL(0xb13a4f20,0x4d20428f),LL(0xd768684c,0xf17077d6),LL(0x27509ac6,0x58852489),L_(0xd30f66cb), LL(0x64ad83d0,0xc965f9f3),LL(0xca2684af,0x9a3903b0),LL(0x2677b45a,0x45839bea),L_(0x2155a76d),
+ LL(0x6c1eb10d,0x24b30b08),LL(0x4b90dabd,0x44f85d03),LL(0x688bbe3b,0xc74ccccb),L_(0xe4b5c103), LL(0x94d1ce03,0x14d9a43c),LL(0x5f767150,0xc940698c),LL(0xf3a40155,0xefe2f127),L_(0xbf13e662),
+ LL(0x9378bdc9,0xfbd86f1e),LL(0x50cbdd4e,0x38c7a9cc),LL(0x965226a4,0x434dbb0c),L_(0x83128949), LL(0xb9259729,0xc36bf7c6),LL(0x038090c2,0x0a12f12b),LL(0xb21834ca,0x0134eeee),L_(0xe2621ff2),
+ LL(0xad55e743,0xa30d570d),LL(0xfb77c395,0xdaaa178b),LL(0x525f0059,0xf38af4e6),L_(0xd340b6fe), LL(0xa001bba0,0xa05f60e2),LL(0x855efc1b,0x701418ea),LL(0xfd38f820,0x27e433c5),L_(0x0fbe1529),
+ LL(0xcf1f6418,0x3570870f),LL(0x7c6202e0,0x85875e04),LL(0x96e8ab61,0xefc6f006),L_(0xb0d48b1f), LL(0x0206e9ab,0x6f6540da),LL(0x32b7b29f,0x2a1b80df),LL(0x9caa872e,0x895193a8),L_(0xec63127d),
+ LL(0x40d4de6d,0x288f99a9),LL(0x6835f630,0x74a2cf89),LL(0xad2e6432,0x52ddf73d),L_(0x4185c6dc), LL(0xef978613,0xbb41a387),LL(0x95245fee,0x319f4bf6),LL(0x40e92907,0x9884b224),L_(0xaf8e6385),
+ LL(0xe2fde7bd,0x282179db),LL(0x7db516ce,0x7897f73f),LL(0x14a26c02,0x07ab717c),L_(0x34d1cdd0), LL(0xb3e012de,0xa65b35a3),LL(0xbb8667e0,0xb888ddc9),LL(0xc0879433,0x8819e222),L_(0xf68b3f79),
+ LL(0x32acb173,0x9f902cc1),LL(0xda89f30b,0x2ea4f418),LL(0xec378b71,0xd036aa23),L_(0x56712f20), LL(0x0f8fe475,0x3e16c057),LL(0xe703ddb6,0x134bd529),LL(0xee28b685,0x867d1b08),L_(0x0383ba62),
+ LL(0x49cdbaea,0x5c1f02d0),LL(0xa1775d0a,0xd83d7d9d),LL(0x1b0a0f31,0x2c287cd4),L_(0x80addda6), LL(0xf27c6df8,0x74534873),LL(0x5db066fa,0x5a696a14),LL(0x8118c158,0xfc06292e),L_(0x58371c8a),
+ LL(0x5e909157,0xbd1a69f7),LL(0xb7d52793,0x703cb9bd),LL(0x5a474912,0xcedd645a),L_(0x56b4d076), LL(0xdeeac8ac,0x2ed53772),LL(0x89595a18,0x5e6b86ab),LL(0xc7b731bc,0x5ce1f8a0),L_(0x03aec3d0),
+ LL(0xcc023bb6,0xdf3b4492),LL(0x796e6974,0x87e45b7d),LL(0x0ae46dae,0xe1f7eac7),L_(0x5971c51a), LL(0xb2f3733b,0x72718cd2),LL(0x3b6f5116,0x85e9b624),LL(0x626b0871,0xc20aa08f),L_(0x1ce0f83a),
+ LL(0x44129031,0x8b7e591b),LL(0x5325744a,0xc7753dac),LL(0xf476b49f,0x2fc4d6c3),L_(0xcc7c16ef), LL(0xe26efb19,0x4dd384fc),LL(0xf67b422f,0x478d3760),LL(0xc574295c,0x421851ef),L_(0xbccaa4b1),
+ LL(0x92253e02,0x5a61d65d),LL(0x6f301322,0xd4924563),LL(0x1e712886,0x2dd1532f),L_(0x3a89196d), LL(0xa3f1deda,0x39cdfbfc),LL(0x039de172,0xb32cde92),LL(0x57960c59,0x40ad0b76),L_(0xafd7ab04),
+ LL(0x33392ce0,0x52977c85),LL(0xacb473b0,0x147af936),LL(0x6dd913b5,0x4ec4b1c5),L_(0x838148b6), LL(0x699ab1e9,0x438d69df),LL(0xa416d1fe,0xdf94b69f),LL(0xbc60bb02,0x60dae203),L_(0xc32d87da),
+ LL(0x01cf54f4,0xc3cf28be),LL(0x609058a8,0xfa448ad2),LL(0xf8c1cf70,0x59baadb3),L_(0x67dc813f), LL(0xb0a595fb,0x60b75e6c),LL(0x1cfccbb7,0xb92101cb),LL(0x99833d0b,0x4be8d444),L_(0x91f3954c),
+ LL(0xedd8aca0,0xcb571bbf),LL(0x7257aad6,0x5a13acc6),LL(0x68203714,0x79914deb),L_(0x895f9c20), LL(0x5c3bbaec,0x211e58cd),LL(0xe9a0fbc0,0xdef6ac5d),LL(0x776cb363,0x93cb4804),L_(0x9678da2d),
+ LL(0x7d49d5cc,0x55e82125),LL(0xe0e89e2e,0xa13cee1f),LL(0x7e46156a,0x7d7e5719),L_(0xd361d2e2), LL(0x629c9b30,0x5fd28ac1),LL(0x70a24aea,0xdc393f34),LL(0x8ea6f6e3,0x289c68b1),L_(0xd6c4acd1),
+ LL(0x63596f58,0x31f49f27),LL(0xac40021b,0x7c86680a),LL(0x0b1f95fd,0x02fc0e10),L_(0x0d61fe85), LL(0x8f2843ce,0xca4cab38),LL(0xb53751a2,0xace069ce),LL(0xf56c80ff,0x270d9677),L_(0x9e5b52ac),
+ LL(0x6352c6f6,0x67e09224),LL(0x626c5d2d,0x5be06f9a),LL(0x14efc35d,0x38c6a0a2),L_(0x7169645d), LL(0xbe2d9aa4,0x6d0b11a9),LL(0x74e4964b,0x6c28404e),LL(0x5538c4c6,0x0af532d8),L_(0xfd9cc6b6),
+ LL(0x588f5f01,0xb4277028),LL(0xa788dcdd,0x2477f29d),LL(0x5fe5d31d,0x68c2db2a),L_(0xd8503d86), LL(0x2a5ebb9a,0x7b9c3f49),LL(0xc4b2edb7,0xbf734578),LL(0xbf266e3b,0xfe65a7a9),L_(0xc3945496),
+},
+/* digit=32 base_pwr=2^224 */
+{
+ LL(0xb7478767,0xeaa013ed),LL(0xa2868062,0x1cf3e561),LL(0xe8c99b44,0x142c4251),L_(0xc6f0cb81), LL(0x5ac149fc,0x9c824754),LL(0x8ff9a766,0x6b1233b1),LL(0xb9c09eeb,0xc5afba96),L_(0x95223aa6),
+ LL(0xb7c40cce,0xbf4d6687),LL(0xc187f375,0x88025f51),LL(0x80c953d4,0xe3dc6d83),L_(0x88d2d1bd), LL(0xb7668ae3,0x50faab59),LL(0x4404c1ec,0x235fc5b5),LL(0xac299c46,0x1378e170),L_(0x5d9a4686),
+ LL(0xb43ccb68,0x47792f74),LL(0xf564eef4,0x3dbeda1b),LL(0xb688499b,0x5b9b5ea1),L_(0x1e999e2b), LL(0x6f26a9f7,0xc4515542),LL(0xb3ca4e2f,0x8e4ebca0),LL(0x1f557c40,0xd6441259),L_(0x913b210d),
+ LL(0xea6ea3ca,0xc6c1108f),LL(0x564f45ee,0xcc83bf8e),LL(0x2c30408f,0x7aa17b0c),L_(0x5db1baaa), LL(0x06aed6b0,0xc003650d),LL(0x47b5af33,0x72d853fe),LL(0x66238f2e,0xf46a15a7),L_(0x76de62dc),
+ LL(0xf16a11ad,0xccc9dc6a),LL(0xb7c36e6e,0x71ab7d63),LL(0x54c72750,0x5a001c63),L_(0x0f8a90df), LL(0x226cb518,0xb6f26d84),LL(0xd8c32b73,0x3fc36946),LL(0x9f9ee30a,0xa1549b9d),L_(0x3080e1f3),
+ LL(0x4a2b2247,0xa65e1e3b),LL(0x9b2f8a35,0x671cf2f3),LL(0x6b9d08f0,0x162efd24),L_(0x62ae0f9c), LL(0x3316fc3f,0x84ae1987),LL(0x25516058,0x7d0dc886),LL(0xdbe094f5,0xc7b0730d),L_(0xb05c94c3),
+ LL(0x1bb62b06,0xe8e8411e),LL(0x20b9ca92,0xd192f8c2),LL(0xe45573f0,0xc1f3a5f2),L_(0x4f18bc0e), LL(0x26419175,0x6c1325f6),LL(0xe78ee486,0x2f81e000),LL(0xa91d228e,0x0ff7a9b2),L_(0x694a50a7),
+ LL(0x88e39d86,0x42262241),LL(0xe249830c,0x3ad07add),LL(0x918fdfa4,0xcb771a46),L_(0xe581c444), LL(0x18ba36b8,0xeb29d84d),LL(0x12fb54ee,0x1383d57f),LL(0xf57833f6,0xfda5e179),L_(0x2c61f244),
+ LL(0x47af468a,0x6f69c44b),LL(0xeb264605,0x5e4d4f9f),LL(0xd6821d55,0x46eb8384),L_(0xfdb05fbe), LL(0xcdeb889e,0x871d5809),LL(0xb09553d3,0x1029a1da),LL(0x5cf9245d,0x1bcc2546),L_(0x3a614385),
+ LL(0xfd8a4d1f,0xdb1de26b),LL(0xb08efe49,0x8aa6deaf),LL(0x12fee6da,0x1e010832),L_(0xb6e509a8), LL(0xd9702488,0x9e928c81),LL(0xf87b74dc,0x79014b39),LL(0x844adfba,0xa7623853),L_(0x14e2902c),
+ LL(0x2e0124e7,0x2b6dbd37),LL(0x0ff6ba21,0xcb4fc42b),LL(0xd7cdda0b,0xd5d8f543),L_(0x9ccc5b69), LL(0x485584af,0xdd6eb7f3),LL(0xbc744924,0x2e41e3f7),LL(0x65859cc9,0xeca30c9e),L_(0xe5e2bdd9),
+ LL(0xd5f8805e,0x66979e6c),LL(0xb1900794,0x1b2ea5ec),LL(0xf8ebb830,0x416a9eb2),L_(0x10b371a3), LL(0x6e8ad20d,0x15ff6e9d),LL(0x000e2330,0x0865593f),LL(0xee384b9b,0xe0eeda2c),L_(0x783dd95d),
+ LL(0x642f55b0,0xbfeb8487),LL(0xd5f0f813,0xfa3ad248),LL(0x7145f39b,0xd0f1abf1),L_(0xeb71b58b), LL(0x4defbbd6,0x893a0505),LL(0x52984b68,0xf3e2f26c),LL(0xf54c27a7,0x6f12b38f),L_(0xbfac39e5),
+ LL(0x5d26514b,0x7cad1aa3),LL(0xdd0afc7e,0x74faf86c),LL(0xfeab4314,0x645cca78),L_(0x5e53697c), LL(0x43f00056,0xb72096cb),LL(0xca87208e,0x7a1950ec),LL(0x071d954a,0x5337fbf2),L_(0xc371272c),
+ LL(0xb32000f7,0x5f6dea95),LL(0x5afebd30,0xf4446576),LL(0x19091ccf,0x74118cb1),L_(0xccebf405), LL(0x9210256e,0x9aacef2c),LL(0xb3458ddc,0x1ca9b6d7),LL(0xb1ab02c7,0xa870996c),L_(0x89a1b94b),
+ LL(0x308cbf80,0x552396fc),LL(0xab809f1d,0x7b2fda39),LL(0x4146f800,0xaebf97a3),L_(0xc90e51fe), LL(0x61fb1317,0xf1c9012c),LL(0x3d74201c,0x0142bd07),LL(0x9b191445,0xbab9da1b),L_(0x4bd6ed8b),
+ LL(0x5e508e4b,0xfa8ca29d),LL(0x2d86d22b,0x27a0f674),LL(0x4cfdd6de,0xee0206bb),L_(0x1e0e0bda), LL(0x978ed51f,0xa6bbc41f),LL(0xb73521ec,0xe52c7866),LL(0x006c7072,0x32478f51),L_(0xb4b93178),
+ LL(0x217f1203,0x04851e7d),LL(0x8feb118b,0xd7767c08),LL(0x75b3d632,0x4c08238d),L_(0xac7d86c6), LL(0x3858c44f,0xcd97e8ec),LL(0xb74f0fe2,0x62318c46),LL(0x93355b9b,0xe2405794),L_(0x54c12d79),
+ LL(0xde835c5e,0x92a463c3),LL(0x0228dc25,0x3b10b96a),LL(0x4b4acd48,0x5f5bd93b),L_(0x1c91a329), LL(0xf537b956,0xedc9c8f4),LL(0xc7fcc358,0xf2362c8d),LL(0xe58a0000,0x970cf697),L_(0x2b1ee7ed),
+ LL(0x8e7b172a,0x882e0b3e),LL(0xb8bd5ea9,0xbf2d6013),LL(0x490fbccd,0xc0848551),L_(0x3ffa1cc7), LL(0x73f7a7d9,0x17b850e8),LL(0x3a53ec82,0xfcc68ded),LL(0x9cbe988b,0x8d09bdd2),L_(0xa3b6e95e),
+ LL(0x6266d7aa,0x7f0f6292),LL(0x329716ed,0x47c40355),LL(0x1cfc61e3,0x7a59e7d3),L_(0x0ffa8f3d), LL(0xbddfbabc,0x84b7a613),LL(0x36121ac1,0x89396fd0),LL(0x0f5147ce,0x2b7f355a),L_(0xb3193eff),
+ LL(0x8af99520,0x4d2ceb91),LL(0x15dc69a8,0xcc451e87),LL(0x6d59d3b5,0xc116fdef),L_(0x627d226f), LL(0x79ead74e,0x813a5852),LL(0x5daf904b,0xc12ffcbc),LL(0xcd67731a,0x3fdf17e1),L_(0x2df27ce8),
+ LL(0x764582de,0xefaccc05),LL(0x640388d0,0x63018ab5),LL(0x6f606211,0x6b706f5e),L_(0xa1c500d6), LL(0x26635840,0x2a01814c),LL(0x8ab7ad6f,0xe29eede6),LL(0x756a8f01,0x10f5f095),L_(0x53630671),
+ LL(0xa38d34fa,0x591f8fe0),LL(0xf829c6c6,0xc31b8774),LL(0xae2b4a7d,0x55de9380),L_(0xc9c227e7), LL(0x63877738,0x566cf0c3),LL(0xd9750372,0x1ad0462b),LL(0x5c1a2a83,0xcfd11aad),L_(0x2aff32de),
+ LL(0xbc66bc8f,0x9f39feb3),LL(0x24b329eb,0x21f0dec8),LL(0xd2ff18e6,0x99e3e6c4),L_(0xb398626b), LL(0xcce55b7f,0xf3fabc3c),LL(0xb9a016fd,0x5c869423),LL(0x4f7a9f81,0xc660df04),L_(0xf74d1142),
+ LL(0x302b25d7,0xfbdef76c),LL(0xb2090c70,0x97f6ff80),LL(0xcc0decf0,0x26e1f975),L_(0x2797ff76), LL(0x4f37e255,0x61eee678),LL(0x51e68a0e,0x6a0d8fc5),LL(0xd84014df,0xb7e3a2d4),L_(0x449bf740),
+ LL(0xde3d73e8,0x3178216e),LL(0x90f08891,0x2f89efcd),LL(0xdcbe0246,0xb937b3c2),L_(0x557e9fd5), LL(0xacaa30d0,0x7f06975e),LL(0xd99696a9,0x714b6101),LL(0xd23f9579,0xc1321142),L_(0x8d2afa4b),
+ LL(0x8271dfd1,0x6e2e57bd),LL(0xc1ea81b3,0xec736ab8),LL(0xbcfb4116,0x1cc014d1),L_(0xc3f8311f), LL(0x02178016,0xbcc0c7bd),LL(0x3222341c,0xdf2643e7),LL(0xedc952bb,0x36ab26fe),L_(0xa84ff692),
+ LL(0xc562a325,0xccd2af21),LL(0x1f595cc1,0x8cbd4ea2),LL(0x9f800082,0x7bbad5e0),L_(0x89fbecab), LL(0xbfd65f55,0xfa87a290),LL(0x24ee0ca1,0xd25d631b),LL(0xe063926d,0x0f3d4539),L_(0xac0263f9),
+ LL(0x6bf5b025,0x1a63c568),LL(0xbec29ce6,0x7bad1c42),LL(0x62df4304,0x38b54b11),L_(0x2b705d62), LL(0x94995153,0x7f7b64f5),LL(0x35d2b40a,0xd25d1128),LL(0xbdbbd673,0x4703bb51),L_(0x682e3058),
+ LL(0x2509ad1b,0x9885b7f4),LL(0xc8c1117b,0xf70447a6),LL(0x9bfc053a,0x1b77852c),L_(0xcfb5f714), LL(0x7dc9ba15,0xa43807b7),LL(0xaea633e3,0x02c669a5),LL(0x220e1871,0x991d8093),L_(0x508f55e1),
+ LL(0xc434b864,0x6c74aee9),LL(0x96d76b48,0x072efeda),LL(0x19982c91,0xac91d19f),L_(0x79df6582), LL(0xbc64a3c7,0xcea49a1b),LL(0x6b3b3cac,0xe25c1282),LL(0x37f9ab3c,0x57709b27),L_(0x404ec7c9),
+ LL(0x63a0bab8,0xbdede240),LL(0x702a4776,0x8ec0a030),LL(0xbbb0cddc,0xf6b96225),L_(0xbdd56c73), LL(0x3dff08cb,0xf46b51e6),LL(0xac5d2e41,0xfac7173a),LL(0x3f2c5530,0xe5090eda),L_(0x05b966b5),
+ LL(0x585b98ee,0x4cb0c03a),LL(0x859d7492,0xb6dc9a2c),LL(0x126ee071,0x3331172f),L_(0xa1e73b0d), LL(0xba3aa73a,0x71ac411d),LL(0x6d7dee6b,0x816a4f1a),LL(0xa88c4198,0xe409dbda),L_(0xa924723a),
+ LL(0xccb6c49e,0xa20ba7c3),LL(0x46da89e3,0x6782fea2),LL(0x83b7b5ce,0xf28c836e),L_(0xa02bd753), LL(0x64f82fd2,0x523afba8),LL(0x3203549e,0x024ddda9),LL(0x65d29391,0x4cec16d6),L_(0xb0187244),
+ LL(0xaff84dda,0x1594f62b),LL(0x4bbabfdf,0xa8de453c),LL(0xeb65c1b7,0x30a103ff),L_(0x02fb469c), LL(0xf76afad8,0xa91cd374),LL(0x98a39a41,0xa33359fd),LL(0x0b99c0c0,0x9015867f),L_(0x96fc381a),
+ LL(0xb366fcc8,0xdde98289),LL(0x76693b42,0xe45737f9),LL(0x30c2ee70,0xa6bb364a),L_(0x759a9e66), LL(0xe00c866b,0x8177a004),LL(0x144b5ff3,0x49205953),LL(0x0106e5ac,0x5d4c1327),L_(0x98001111),
+ LL(0xdebcecc8,0xfdc46d5f),LL(0xc9916314,0xa125951b),LL(0x5633f2c4,0x04c2afc1),L_(0xd17c9349), LL(0xacd14df9,0xb5f970f1),LL(0x289012ed,0x0973ccd0),LL(0x236b3580,0x02b2c84a),L_(0x76b898cf),
+ LL(0xcb13811d,0x0d2dd5a3),LL(0x23f6e444,0xd8b5d0f6),LL(0x4f399d9a,0xa46887b9),L_(0x77c6bce8), LL(0x10165161,0xddf54326),LL(0xeb345000,0xf080be9b),LL(0xeee34275,0x047237fe),L_(0xd518ca88),
+ LL(0x11fceb12,0xfaf4fbdf),LL(0x116a3791,0x66bfd60d),LL(0x442c2a46,0x28cf0358),L_(0x85546f76), LL(0x4cebfe25,0x6c01d714),LL(0x1c79b699,0x11d66f5a),LL(0x8cc29c26,0xcf7771ef),L_(0x92ae8875),
+ LL(0xf90d16bf,0xb89933d4),LL(0xa1457028,0xc8f0695e),LL(0x5a6af165,0x82274dbf),L_(0x89528271), LL(0x225b8bb3,0x5e138d61),LL(0x2eed19b9,0x3e2273d0),LL(0x6b42f9f3,0xaa4b331c),L_(0xe7d915a6),
+ LL(0xa9d80f3e,0x6773ac5a),LL(0xc52d7955,0x970b6066),LL(0x78700052,0x2f129047),L_(0xa9a60bf2), LL(0x0393eefb,0x04368569),LL(0xe6519a05,0x5180fe6e),LL(0x3014d2a0,0x6bd99185),L_(0xb28fcd33),
+ LL(0x299011de,0xe9270a23),LL(0x5a66907e,0x54a9528a),LL(0x7af57c36,0x8e613981),L_(0xe6775c8b), LL(0xff5fc082,0xd7dd7f17),LL(0xe0568a5c,0x421cb6c4),LL(0x590b13ce,0x8f9e6852),L_(0x4c77050e),
+ LL(0x6513f9c9,0xd5bf1a5d),LL(0x170fc778,0x1942fc9b),LL(0x6ec5f13f,0x70273957),L_(0x1878fa8e), LL(0x5bb80bbc,0xcededd82),LL(0x83d79890,0xa7c7ee32),LL(0xfa06b05d,0x86a8080f),L_(0x0e66721a),
+ LL(0x9510adb1,0x8a998afb),LL(0x7aa85880,0xfaf28d30),LL(0x0863e4f3,0xdcf64ed3),L_(0x1fe9103e), LL(0x1ea72a10,0x78d5ce7b),LL(0x33edcfdb,0xafe82b0c),LL(0xde25a969,0x1f0a50fe),L_(0x5f4147d4),
+ LL(0x3d5e21a2,0xddb5610d),LL(0x8024cc9b,0x435cd0ff),LL(0xcc34b698,0xf7218db6),L_(0xb6949149), LL(0xc23a0cb8,0x3b787bdf),LL(0x18dd349c,0x71fcc010),LL(0xb0e2a897,0xd6c69c33),L_(0x09bc9f85),
+ LL(0x1cd5d5db,0xe94a402b),LL(0xf30b7314,0x26944f05),LL(0x737d6c5b,0xd0af2018),L_(0xfdbedbb6), LL(0x1b523221,0xa8a984b3),LL(0x8ace709d,0x39663eef),LL(0xbf4b3e0e,0x0297dfd1),L_(0x3e1d52f4),
+ LL(0xc8d20d14,0xf915a4c4),LL(0x0b7dd701,0x2921fb0f),LL(0x6b467b73,0x226421aa),L_(0xf53a0a69), LL(0xf4bdad8d,0xb5512d8c),LL(0xc103b145,0x2df92000),LL(0x4979cf5a,0xd5159856),L_(0x0d121a5d),
+ LL(0xffb25429,0xad4ff433),LL(0xe3c5fc0a,0x22c48ae5),LL(0xdcdd2832,0xee468cb2),L_(0x853d6571), LL(0xad56cbbd,0x1ac2be8d),LL(0x305ea1a5,0x11bdfbf2),LL(0x4c080ea0,0xd326fcc1),L_(0x98961d03),
+ LL(0x3c2a21b3,0x4c900a2e),LL(0x370aac6c,0x540b6e6c),LL(0x40c9b00d,0xf0db08ca),L_(0xd9b48af0), LL(0x75ea8b19,0x23e0167d),LL(0x69f68546,0x3ce76be7),LL(0xc2578bd9,0x274ef866),L_(0xe0f171b1),
+ LL(0x06e96b08,0xa0cc2074),LL(0x658170a1,0x2181d377),LL(0xbc50ac87,0x46b62277),L_(0xd2d87843), LL(0x66a073ef,0xbc771f86),LL(0xef91a0af,0x4727577f),LL(0xa7216ad9,0xd3c1c667),L_(0x3c62c22f),
+ LL(0x37e5b8f5,0xfea02084),LL(0x4baddc8e,0xe9a5f0b7),LL(0xbf587847,0x53933d2b),L_(0xca648fb8), LL(0x492b64e4,0x8257b251),LL(0x0f117e6d,0x8d9ec843),LL(0xfe9686a0,0xeeea3972),L_(0xe386bb0a),
+ LL(0xb93a8f56,0xf5712604),LL(0xa696fd94,0x6981acc8),LL(0xf73a981c,0x86cc6e25),L_(0x53db10f5), LL(0xa6c75879,0x18cf2a94),LL(0xe6e2104d,0x5737dd4f),LL(0x4c1f9f0e,0x3114afeb),L_(0x2e6f8e44),
+ LL(0xbbc2c60f,0x19e92b39),LL(0x06b78031,0xb3de20d1),LL(0x43d40348,0x693597af),L_(0x1396fecd), LL(0xa7c941f2,0x4568fdc8),LL(0xd45e157f,0x92d2afec),LL(0x50493b74,0xa510adc1),L_(0x64794afe),
+ LL(0x60867e2f,0xab4d38b7),LL(0xf04773c1,0x0b8a018e),LL(0x2c774449,0xc11883d8),L_(0xd65b4aa4), LL(0xa50bce8a,0x9bcfd81b),LL(0xfd058e49,0xf5811bc4),LL(0x80f1e9c2,0xe9b876e5),L_(0xc8fc1b3c),
+ LL(0x368a0742,0x7cf8b51b),LL(0x09e82684,0x85f0eb37),LL(0xb5926249,0x08e70a34),L_(0x4decfe48), LL(0xe9a1940e,0x4d61fee9),LL(0x6dcb9563,0x24af91e7),LL(0xa85a5970,0x41f4907d),L_(0x2292e826),
+ LL(0x33182546,0x7b2ef570),LL(0xb4417ce0,0x2a780100),LL(0x8d1180df,0xab954cb9),L_(0x5c74a302), LL(0x88d81acf,0x0d62a965),LL(0x2ec9496d,0xaa16f924),LL(0x2bc7cca4,0x2d99dcc8),L_(0x74958dce),
+ LL(0xb139570a,0x21c56351),LL(0x1f26d583,0x41b20f4e),LL(0x067af3fb,0xbd9ab15f),L_(0xc3a77e33), LL(0x1523f3e0,0x9de5e7e4),LL(0xe1731bb7,0xef0cf37e),LL(0x6c9e48d4,0xc9fc2851),L_(0xd0f91844),
+ LL(0xb81124f1,0xea0ed825),LL(0x788a57ed,0xf4f08526),LL(0x8e19f5c1,0x820a4f79),L_(0x348a1346), LL(0x6eaedecc,0xefe607bc),LL(0x87c20db0,0x75968ada),LL(0x21596aa9,0xcdf9ca14),L_(0x5e2abcad),
+ LL(0xdaef28c3,0x2be4550b),LL(0x29e6daee,0xee673998),LL(0x8162c783,0x4e1fb36c),L_(0xb3249498), LL(0xab7e3386,0xb682150c),LL(0x89285111,0x02a0814e),LL(0x9c692620,0x3bb22aea),L_(0xa759126d),
+ LL(0xa03f91a6,0xd356a2bd),LL(0x7b288f41,0x04625b59),LL(0xf350f847,0x2eacfb01),L_(0x943dbfd9), LL(0x63af93f5,0xba005c26),LL(0xdcc822a7,0x7964a6f8),LL(0xc56edb4d,0x14b146d7),L_(0xb1fb9d62),
+ LL(0xcae5ffde,0x51fbb8f7),LL(0xca0c3f68,0xa961e967),LL(0xbe43f447,0x2a774b0b),L_(0x9b6effff), LL(0x4e174bf0,0xb12fde0a),LL(0xd1976ab8,0x85b59e4e),LL(0x421eac26,0x4c480a51),L_(0x4041c2d8),
+ LL(0xc3a1a863,0xfe8ceef6),LL(0x42e96299,0x0469540a),LL(0xd231a2a4,0x0828f4c0),L_(0x7c0edcf4), LL(0x2c034efb,0x1744d906),LL(0x92393260,0x2a85a8d6),LL(0x28f5775a,0x58717292),L_(0x37693735),
+ LL(0xf12dc792,0xbcc5e464),LL(0xfee1ef55,0xb881c818),LL(0x2bfca9a4,0x7e60531f),L_(0xed54d832), LL(0x28ea4ef0,0x9ef6ada6),LL(0xb9564865,0xf56fbcf0),LL(0x534e2057,0x9857c41f),L_(0x2750bbe8),
+}
+};
+#endif
+
+#endif /* _DISABLE_ECP_224R1_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_nistP224r1_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 7,
+ /* select function */ p224r1_select_ap_w7,
+ /* precomputed data */ (BNU_CHUNK_T*)ec_p224r1_precomputed
+ };
+ return &t;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpp256r1precomca.c b/ext/ipp/sources/ippcp/src/pcpp256r1precomca.c
new file mode 100644
index 0000000..b5af776
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpp256r1precomca.c
@@ -0,0 +1,2539 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (P256r1 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (256)
+#define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* P256 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P256];
+ BNU_CHUNK_T Y[LEN_P256];
+} P256_POINT_AFFINE;
+
+extern const __ALIGN64 P256_POINT_AFFINE ec_p256r1_precomputed[37][64];
+
+
+#if defined( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_256R1_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+const __ALIGN64 P256_POINT_AFFINE ec_p256r1_precomputed[37][64] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0x18a9143c,0x79e730d4),LL(0x5fedb601,0x75ba95fc),LL(0x77622510,0x79fb732b),LL(0xa53755c6,0x18905f76), LL(0xce95560a,0xddf25357),LL(0xba19e45c,0x8b4ab8e4),LL(0xdd21f325,0xd2e88688),LL(0x25885d85,0x8571ff18),
+ LL(0x10ddd64d,0x850046d4),LL(0xa433827d,0xaa6ae3c1),LL(0x8d1490d9,0x73220503),LL(0x3dcf3a3b,0xf6bb32e4), LL(0x61bee1a5,0x2f3648d3),LL(0xeb236ff8,0x152cd7cb),LL(0x92042dbe,0x19a8fb0e),LL(0x0a5b8a3b,0x78c57751),
+ LL(0x4eebc127,0xffac3f90),LL(0x087d81fb,0xb027f84a),LL(0x87cbbc98,0x66ad77dd),LL(0xb6ff747e,0x26936a3f), LL(0xc983a7eb,0xb04c5c1f),LL(0x0861fe1a,0x583e47ad),LL(0x1a2ee98e,0x78820831),LL(0xe587cc07,0xd5f06a29),
+ LL(0x46918dcc,0x74b0b50d),LL(0xc623c173,0x4650a6ed),LL(0xe8100af2,0x0cdaacac),LL(0x41b0176b,0x577362f5), LL(0xe4cbaba6,0x2d96f24c),LL(0xfad6f447,0x17628471),LL(0xe5ddd22e,0x6b6c36de),LL(0x4c5ab863,0x84b14c39),
+ LL(0xc45c61f5,0xbe1b8aae),LL(0x94b9537d,0x90ec649a),LL(0xd076c20c,0x941cb5aa),LL(0x890523c8,0xc9079605), LL(0xe7ba4f10,0xeb309b4a),LL(0xe5eb882b,0x73c568ef),LL(0x7e7a1f68,0x3540a987),LL(0x2dd1e916,0x73a076bb),
+ LL(0x3e77664a,0x40394737),LL(0x346cee3e,0x55ae744f),LL(0x5b17a3ad,0xd50a961a),LL(0x54213673,0x13074b59), LL(0xd377e44b,0x93d36220),LL(0xadff14b5,0x299c2b53),LL(0xef639f11,0xf424d44c),LL(0x4a07f75f,0xa4c9916d),
+ LL(0xa0173b4f,0x0746354e),LL(0xd23c00f7,0x2bd20213),LL(0x0c23bb08,0xf43eaab5),LL(0xc3123e03,0x13ba5119), LL(0x3f5b9d4d,0x2847d030),LL(0x5da67bdd,0x6742f2f2),LL(0x77c94195,0xef933bdc),LL(0x6e240867,0xeaedd915),
+ LL(0x9499a78f,0x27f14cd1),LL(0x6f9b3455,0x462ab5c5),LL(0xf02cfc6b,0x8f90f02a),LL(0xb265230d,0xb763891e), LL(0x532d4977,0xf59da3a9),LL(0xcf9eba15,0x21e3327d),LL(0xbe60bbf0,0x123c7b84),LL(0x7706df76,0x56ec12f2),
+ LL(0x264e20e8,0x75c96e8f),LL(0x59a7a841,0xabe6bfed),LL(0x44c8eb00,0x2cc09c04),LL(0xf0c4e16b,0xe05b3080), LL(0xa45f3314,0x1eb7777a),LL(0xce5d45e3,0x56af7bed),LL(0x88b12f1a,0x2b6e019a),LL(0xfd835f9b,0x086659cd),
+ LL(0x9dc21ec8,0x2c18dbd1),LL(0x0fcf8139,0x98f9868a),LL(0x48250b49,0x737d2cd6),LL(0x24b3428f,0xcc61c947), LL(0x80dd9e76,0x0c2b4078),LL(0x383fbe08,0xc43a8991),LL(0x779be5d2,0x5f7d2d65),LL(0xeb3b4ab5,0x78719a54),
+ LL(0x6245e404,0xea7d260a),LL(0x6e7fdfe0,0x9de40795),LL(0x8dac1ab5,0x1ff3a415),LL(0x649c9073,0x3e7090f1), LL(0x2b944e88,0x1a768561),LL(0xe57f61c8,0x250f939e),LL(0x1ead643d,0x0c0daa89),LL(0xe125b88e,0x68930023),
+ LL(0xd2697768,0x04b71aa7),LL(0xca345a33,0xabdedef5),LL(0xee37385e,0x2409d29d),LL(0xcb83e156,0x4ee1df77), LL(0x1cbb5b43,0x0cac12d9),LL(0xca895637,0x170ed2f6),LL(0x8ade6d66,0x28228cfa),LL(0x53238aca,0x7ff57c95),
+ LL(0x4b2ed709,0xccc42563),LL(0x856fd30d,0x0e356769),LL(0x559e9811,0xbcbcd43f),LL(0x5395b759,0x738477ac), LL(0xc00ee17f,0x35752b90),LL(0x742ed2e3,0x68748390),LL(0xbd1f5bc1,0x7cd06422),LL(0xc9e7b797,0xfbc08769),
+ LL(0xb0cf664a,0xa242a35b),LL(0x7f9707e3,0x126e48f7),LL(0xc6832660,0x1717bf54),LL(0xfd12c72e,0xfaae7332), LL(0x995d586b,0x27b52db7),LL(0x832237c2,0xbe29569e),LL(0x2a65e7db,0xe8e4193e),LL(0x2eaa1bbb,0x152706dc),
+ LL(0xbc60055b,0x72bcd8b7),LL(0x56e27e4b,0x03cc23ee),LL(0xe4819370,0xee337424),LL(0x0ad3da09,0xe2aa0e43), LL(0x6383c45d,0x40b8524f),LL(0x42a41b25,0xd7663554),LL(0x778a4797,0x64efa6de),LL(0x7079adf4,0x2042170a),
+ LL(0x0bc6fb80,0x808b0b65),LL(0x3ffe2e6b,0x5882e075),LL(0x2c83f549,0xd5ef2f7c),LL(0x9103b723,0x54d63c80), LL(0x52a23f9b,0xf2f11bd6),LL(0x4b0b6587,0x3670c319),LL(0xb1580e9e,0x55c4623b),LL(0x01efe220,0x64edf7b2),
+ LL(0xd53c5c9d,0x97091dcb),LL(0xac0a177b,0xf17624b6),LL(0x2cfe2dff,0xb0f13975),LL(0x6c7a574e,0xc1a35c0a), LL(0x93e79987,0x227d3146),LL(0xe89cb80e,0x0575bf30),LL(0x0d1883bb,0x2f4e247f),LL(0x3274c3d0,0xebd51226),
+ LL(0x56ada97a,0x5f3e51c8),LL(0x8f8b403e,0x4afc964d),LL(0x412e2979,0xa6f247ab),LL(0x6f80ebda,0x675abd1b), LL(0x5e485a1d,0x66a2bd72),LL(0x8f4f0b3c,0x4b2a5caf),LL(0x1b847bba,0x2626927f),LL(0x0502394d,0x6c6fc7d9),
+ LL(0xa5659ae8,0xfea912ba),LL(0x25e1a16e,0x68363aba),LL(0x752c41ac,0xb8842277),LL(0x2897c3fc,0xfe545c28), LL(0xdc4c696b,0x2d36e9e7),LL(0xfba977c5,0x5806244a),LL(0xe39508c1,0x85665e9b),LL(0x6d12597b,0xf720ee25),
+ LL(0xd2337a31,0x8a979129),LL(0x0f862bdc,0x5916868f),LL(0x5dd283ba,0x048099d9),LL(0xfe5bfb4e,0xe2d1eeb6), LL(0x7884005d,0x82ef1c41),LL(0xffffcbae,0xa2d4ec17),LL(0x8aa95e66,0x9161c53f),LL(0xc5fee0d0,0x5ee104e1),
+ LL(0xc135b208,0x562e4cec),LL(0x4783f47d,0x74e1b265),LL(0x5a3f3b30,0x6d2a506c),LL(0xc16762fc,0xecead9f4), LL(0xe286e5b9,0xf29dd4b2),LL(0x83bb3c61,0x1b0fadc0),LL(0x7fac29a4,0x7a75023e),LL(0xc9477fa3,0xc086d5f1),
+ LL(0x2f6f3076,0x0fc61135),LL(0xe3912a9a,0xc99ffa23),LL(0xd2f8ba3d,0x6a0b0685),LL(0xe93358a4,0xfdc777e8), LL(0x35415f04,0x94a787bb),LL(0x4d23fea4,0x640c2d6a),LL(0x153a35b5,0x9de917da),LL(0x5d5cd074,0x793e8d07),
+ LL(0x2de45068,0xf4f87653),LL(0x9e2e1f6e,0x37c7a7e8),LL(0xa3584069,0xd0825fa2),LL(0x1727bf42,0xaf2cea7c), LL(0x9e4785a9,0x0360a4fb),LL(0x27299f4a,0xe5fda49c),LL(0x71ac2f71,0x48068e13),LL(0x9077666f,0x83d0687b),
+ LL(0x15d02819,0x6d3883b2),LL(0x40dd9a35,0x6d0d7550),LL(0x1d2b469f,0x61d7cbf9),LL(0x2efc3115,0xf97b232f), LL(0xb24bcbc7,0xa551d750),LL(0x88a1e356,0x11ea4949),LL(0x93cb7501,0x7669f031),LL(0xca737b8a,0x595dc55e),
+ LL(0xd837879f,0xa4a319ac),LL(0xed6b67b0,0x6fc1b49e),LL(0x32f1f3af,0xe3959933),LL(0x65432a2e,0x966742eb), LL(0xb4966228,0x4b8dc9fe),LL(0x43f43950,0x96cc6312),LL(0xc9b731ee,0x12068859),LL(0x56f79968,0x7b948dc3),
+ LL(0xed1f8008,0x61e4ad32),LL(0xd8b17538,0xe6c9267a),LL(0x857ff6fb,0x1ac7c5eb),LL(0x55f2fb10,0x994baaa8), LL(0x1d248018,0x84cf14e1),LL(0x628ac508,0x5a39898b),LL(0x5fa944f5,0x14fde97b),LL(0xd12e5ac7,0xed178030),
+ LL(0x97e2feb4,0x042c2af4),LL(0xaebf7313,0xd36a42d7),LL(0x084ffdd7,0x49d2c9eb),LL(0x2ef7c76a,0x9f8aa54b), LL(0x09895e70,0x9200b7ba),LL(0xddb7fb58,0x3bd0c66f),LL(0x78eb4cbb,0x2d97d108),LL(0xd84bde31,0x2d431068),
+ LL(0x172ccd1f,0x4b523eb7),LL(0x30a6a892,0x7323cb28),LL(0xcfe153eb,0x97082ec0),LL(0xf2aadb97,0xe97f6b6a), LL(0xd1a83da1,0x1d3d393e),LL(0x804b2a68,0xa6a7f9c7),LL(0x2d0cb71e,0x4a688b48),LL(0x40585278,0xa9b4cc5f),
+ LL(0xcb66e132,0x5e5db46a),LL(0x0d925880,0xf1be963a),LL(0x0317b9e2,0x944a7027),LL(0x48603d48,0xe266f959), LL(0x5c208899,0x98db6673),LL(0xa2fb18a3,0x90472447),LL(0x777c619f,0x8a966939),LL(0x2a3be21b,0x3798142a),
+ LL(0x3298b343,0xb4241cb1),LL(0xb44f65a1,0xa3a14e49),LL(0x3ac77acd,0xc5f4d6cd),LL(0x52b6fc3c,0xd0288cb5), LL(0x1c040abc,0xd5cc8c2f),LL(0x06bf9b4a,0xb675511e),LL(0x9b3aa441,0xd667da37),LL(0x51601f72,0x460d45ce),
+ LL(0x6755ff89,0xe2f73c69),LL(0x473017e6,0xdd3cf7e7),LL(0x3cf7600d,0x8ef5689d),LL(0xb1fc87b4,0x948dc4f8), LL(0x4ea53299,0xd9e9fe81),LL(0x98eb6028,0x2d921ca2),LL(0x0c9803fc,0xfaecedfd),LL(0x4d7b4745,0xf38ae891),
+ LL(0xc5e3a3d8,0xd8c5fccf),LL(0x4079dfbf,0xbefd904c),LL(0xfead0197,0xbc6d6a58),LL(0x695532a4,0x39227077), LL(0xdbef42f5,0x09e23e6d),LL(0x480a9908,0x7e449b64),LL(0xad9a2e40,0x7b969c1a),LL(0x9591c2a4,0x6231d792),
+ LL(0x0f664534,0x87151456),LL(0x4b68f103,0x85ceae7c),LL(0x65578ab9,0xac09c4ae),LL(0xf044b10c,0x33ec6868), LL(0x3a8ec1f1,0x6ac4832b),LL(0x5847d5ef,0x5509d128),LL(0x763f1574,0xf909604f),LL(0xc32f63c4,0xb16c4303),
+ LL(0x7ca23cd3,0xb6ab2014),LL(0xa391849d,0xcaa7a5c6),LL(0x75678d94,0x5b0673a3),LL(0xdd303e64,0xc982ddd4), LL(0x5db6f971,0xfd7b000b),LL(0x6f876f92,0xbba2cb1f),LL(0x3c569426,0xc77332a3),LL(0x570d74f8,0xa159100c),
+ LL(0xdec67ef5,0xfd16847f),LL(0x233e76b7,0x742ee464),LL(0xefc2b4c8,0x0b8e4134),LL(0x42a3e521,0xca640b86), LL(0x8ceb6aa9,0x653a0190),LL(0x547852d5,0x313c300c),LL(0x6b237af7,0x24e4ab12),LL(0x8bb47af8,0x2ba90162),
+ LL(0xa8219bb7,0x3d5e58d6),LL(0x1b06c57f,0xc691d0bd),LL(0xd257576e,0x0ae4cb10),LL(0xd54a3dc3,0x3569656c), LL(0x94cda03a,0xe5ebaebd),LL(0x162bfe13,0x934e82d3),LL(0xe251a0c6,0x450ac0ba),LL(0xdd6da526,0x480b9e11),
+ LL(0x8cce08b5,0x00467bc5),LL(0x7f178d55,0xb636458c),LL(0xa677d806,0xc5748bae),LL(0xdfa394eb,0x2763a387), LL(0x7d3cebb6,0xa12b448a),LL(0x6f20d850,0xe7adda3e),LL(0x1558462c,0xf63ebce5),LL(0x620088a8,0x58b36143),
+ LL(0x4d63c0ee,0x8a2cc3ca),LL(0x0fe948ce,0x51233117),LL(0x222ef33b,0x7463fd85),LL(0x7c603d6c,0xadf0c7dc), LL(0xfe7765e5,0x0ec32d3b),LL(0xbf380409,0xccaab359),LL(0x8e59319c,0xbdaa84d6),LL(0x9c80c34d,0xd9a4c280),
+ LL(0xa059c142,0xa9d89488),LL(0xff0b9346,0x6f5ae714),LL(0x16fb3664,0x068f237d),LL(0x363186ac,0x5853e4c4), LL(0x63c52f98,0xe2d87d23),LL(0x81828876,0x2ec4a766),LL(0xe14e7b1c,0x47b864fa),LL(0x69192408,0x0c0bc0e5),
+ LL(0xb82e9f3e,0xe4d7681d),LL(0xdf25e13c,0x83200f0b),LL(0x66f27280,0x8909984c),LL(0x75f73227,0x462d7b00), LL(0xf2651798,0xd90ba188),LL(0x36ab1c34,0x74c6e18c),LL(0x5ef54359,0xab256ea3),LL(0xd1aa702f,0x03466612),
+ LL(0x2ed22e91,0x624d6049),LL(0x6f072822,0x6fdfe0b5),LL(0x39ce2271,0xeeca1115),LL(0xdb01614f,0x98100a4f), LL(0xa35c628f,0xb6b0daa2),LL(0xc87e9a47,0xb6f94d2e),LL(0x1d57d9ce,0xc6773259),LL(0x03884a7b,0xf70bfeec),
+ LL(0xed2bad01,0x5fb35ccf),LL(0x1da6a5c7,0xa155cbe3),LL(0x30a92f8f,0xc2e2594c),LL(0x5bfafe43,0x649c89ce), LL(0xe9ff257a,0xd158667d),LL(0xf32c50ae,0x9b359611),LL(0x906014cf,0x4b00b20b),LL(0x89bc7d3d,0xf3a8cfe3),
+ LL(0x248a7d06,0x4ff23ffd),LL(0x878873fa,0x80c5bfb4),LL(0x05745981,0xb7d9ad90),LL(0x3db01994,0x179c85db), LL(0x61a6966c,0xba41b062),LL(0xeadce5a8,0x4d82d052),LL(0xa5e6a318,0x9e91cd3b),LL(0x95b2dda0,0x47795f4f),
+ LL(0xd55a897c,0xecfd7c1f),LL(0xb29110fb,0x009194ab),LL(0xe381d3b0,0x5f0e2046),LL(0xa98dd291,0x5f3425f6), LL(0x730d50da,0xbfa06687),LL(0x4b083b7f,0x0423446c),LL(0xd69d3417,0x397a247d),LL(0x387ba42a,0xeb629f90),
+ LL(0xd5cd79bf,0x1ee426cc),LL(0x946c6e18,0x0032940b),LL(0x57477f58,0x1b1e8ae0),LL(0x6d823278,0xe94f7d34), LL(0x782ba21a,0xc747cb96),LL(0xf72b33a5,0xc5254469),LL(0xc7f80c81,0x772ef6de),LL(0x2cd9e6b5,0xd73acbfe),
+ LL(0x49ee90d9,0x4075b5b1),LL(0xa06e9eba,0x785c339a),LL(0xabf825e0,0xa1030d5b),LL(0xa42931dc,0xcec684c3), LL(0xc1586e63,0x42ab62c9),LL(0x5ab43f2b,0x45431d66),LL(0x55f7835d,0x57c8b2c0),LL(0xc1b7f865,0x033da338),
+ LL(0xcaa76097,0x283c7513),LL(0x36c83906,0x0a624fa9),LL(0x715af2c7,0x6b20afec),LL(0xeba78bfd,0x4b969974), LL(0xd921d60e,0x220755cc),LL(0x7baeca13,0x9b944e10),LL(0x5ded93d4,0x04819d51),LL(0x6dddfd27,0x9bbff86e),
+ LL(0x77adc612,0x6b344130),LL(0xbbd803a0,0xa7496529),LL(0x6d8805bd,0x1a1baaa7),LL(0x470343ad,0xc8403902), LL(0x175adff1,0x39f59f66),LL(0xb7d8c5b7,0x0b26d7fb),LL(0x529d75e3,0xa875f5ce),LL(0x41325cc2,0x85efc7e9),
+ LL(0x1ff6acd3,0x21950b42),LL(0x53dc6909,0xffe70484),LL(0x28766127,0xff4cd0b2),LL(0x4fb7db2b,0xabdbe608), LL(0x5e1109e8,0x837c9228),LL(0xf4645b5a,0x26147d27),LL(0xf7818ed8,0x4d78f592),LL(0xf247fa36,0xd394077e),
+ LL(0x488c171a,0x0fb9c2d0),LL(0x13685278,0xa78bfbaa),LL(0xd5b1fa6a,0xedfbe268),LL(0x2b7eaba7,0x0dceb8db), LL(0x9ae2b710,0xbf9e8089),LL(0xa4449c96,0xefde7ae6),LL(0xcc143a46,0x43b7716b),LL(0xc3628c13,0xd7d34194),
+ LL(0x3b3f64c9,0x508cec1c),LL(0x1e5edf3f,0xe20bc0ba),LL(0x2f4318d4,0xda1deb85),LL(0x5c3fa443,0xd20ebe0d), LL(0x73241ea3,0x370b4ea7),LL(0x5e1a5f65,0x61f1511c),LL(0x82681c62,0x99a5e23d),LL(0xa2f54c2d,0xd731e383),
+ LL(0x83445904,0x2692f36e),LL(0xaf45f9c0,0x2e0ec469),LL(0xc67528b7,0x905a3201),LL(0xd0e5e542,0x88f77f34), LL(0x5864687c,0xf67a8d29),LL(0x22df3562,0x23b92eae),LL(0x9bbec39e,0x5c27014b),LL(0x9c0f0f8d,0x7ef2f226),
+ LL(0x546c4d8d,0x97359638),LL(0x92f24679,0x5f9c3fc4),LL(0xa8c8acd9,0x912e8bed),LL(0x306634b0,0xec3a318d), LL(0xc31cb264,0x80167f41),LL(0x522113f2,0x3db82f6f),LL(0xdcafe197,0xb155bcd2),LL(0x43465283,0xfba1da59),
+ LL(0xb212cf53,0xa0425b8e),LL(0xf8557c5f,0x4f2e512e),LL(0x25c4d56c,0xc1286ff9),LL(0xee26c851,0xbb8a0fea), LL(0xe7d6107e,0xc28f70d2),LL(0xe76265aa,0x7ee0c444),LL(0x1d1936b1,0x3df277a4),LL(0xea9595eb,0x1a556e3f),
+ LL(0xe7305683,0x258bbbf9),LL(0x07ef5be6,0x31eea5bf),LL(0x46c814c1,0x0deb0e4a),LL(0xa7b730dd,0x5cee8449), LL(0xa0182bde,0xeab495c5),LL(0x9e27a6b4,0xee759f87),LL(0x80e518ca,0xc2cf6a68),LL(0xf14cf3f4,0x25e8013f),
+ LL(0x7e8d7a14,0x8fc44140),LL(0x9556f36a,0xbb1ff3ca),LL(0x14600044,0x6a844385),LL(0x7451ae63,0xba3f0c4a), LL(0x1f9af32a,0xdfcac25b),LL(0xb1f2214b,0x01e0db86),LL(0xa4b596ac,0x4e9a5bc2),LL(0x026c2c08,0x83927681),
+ LL(0x7acaca28,0x3ec832e7),LL(0xc7385b29,0x1bfeea57),LL(0xfd1eaf38,0x068212e3),LL(0x6acf8ccc,0xc1329830), LL(0x2aac9e59,0xb909f2db),LL(0xb661782a,0x5748060d),LL(0xc79b7a01,0xc5ab2632),LL(0x00017626,0xda44c6c6),
+ LL(0xa7ea82f0,0xf26c00e8),LL(0xe4299aaf,0x99cac80d),LL(0x7ed78be1,0xd66fe3b6),LL(0x648d02cd,0x305f725f), LL(0x623fb21b,0x33ed1bc4),LL(0x7a6319ad,0xfa70533e),LL(0xbe5ffb3e,0x17ab562d),LL(0x56674741,0x06374994),
+ LL(0x5c46aa8e,0x69d44ed6),LL(0xa8d063d1,0x2100d5d3),LL(0xa2d17c36,0xcb9727ea),LL(0x8add53b7,0x4c2bab1b), LL(0x15426704,0xa084e90c),LL(0xa837ebea,0x778afcd3),LL(0x7ce477f8,0x6651f701),LL(0x46fb7a8b,0xa0624998),
+ LL(0xed8a6e19,0xdc1e6828),LL(0x4189d9c7,0x33fc2336),LL(0x671c39bc,0x026f8fe2),LL(0xbc6f9915,0xd40c4ccd), LL(0xf80e75ca,0xafa135bb),LL(0x22adff2c,0x12c651a0),LL(0x4f51ad96,0xc40a04bd),LL(0xbbe4e832,0x04820109),
+ LL(0x7f4c04cc,0x3667eb1a),LL(0xa9404f84,0x59556621),LL(0x7eceb50a,0x71cdf653),LL(0x9b8335fa,0x994a44a6), LL(0xdbeb9b69,0xd7faf819),LL(0xeed4350d,0x473c5680),LL(0xda44bba2,0xb6658466),LL(0x872bdbf3,0x0d1bc780),
+ LL(0xa1962f91,0xe535f175),LL(0xed58f5a7,0x6ed7e061),LL(0x2089a233,0x177aa4c0),LL(0xe539b413,0x0dbcb03a), LL(0xbb32e38e,0xe3dc424e),LL(0x6806701e,0x6472e5ef),LL(0x814be9ee,0xdd47ff98),LL(0x35ace009,0x6b60cfff),
+ LL(0x9ff91fe5,0xb8d3d931),LL(0xf0518eed,0x039c4800),LL(0x9182cb26,0x95c37632),LL(0x82fc568d,0x0763a434), LL(0x383e76ba,0x707c04d5),LL(0x824e8197,0xac98b930),LL(0x91230de0,0x92bf7c8f),LL(0x40959b70,0x90876a01),
+ LL(0x05968b80,0xdb6d96f3),LL(0x089f73b9,0x380a0913),LL(0xc2c61e01,0x7da70b83),LL(0x569b38c7,0x95fb8394), LL(0x80edfe2f,0x9a3c6512),LL(0x8faeaf82,0x8f726bb9),LL(0x78424bf8,0x8010a4a0),LL(0x0e844970,0x29672044),
+},
+/* digit=1 base_pwr=2^7 */
+{
+ LL(0x7a2ad62a,0x63c5cb81),LL(0xac62ff54,0x7ef2b6b9),LL(0xb3ad9db5,0x3749bba4),LL(0x46d5a617,0xad311f2c), LL(0xc2ff3b6d,0xb77a8087),LL(0x367834ff,0xb46feaf3),LL(0x75d6b138,0xf8aa266d),LL(0xec008188,0xfa38d320),
+ LL(0x696946fc,0x486d8ffa),LL(0xb9cba56d,0x50fbc6d8),LL(0x90f35a15,0x7e3d423e),LL(0xc0dd962c,0x7c3da195), LL(0x3cfd5d8b,0xe673fdb0),LL(0x889dfca5,0x0704b7c2),LL(0xf52305aa,0xf6ce581f),LL(0x914d5e53,0x399d49eb),
+ LL(0x6ec293cd,0x380a496d),LL(0x8e7051f5,0x733dbda7),LL(0xb849140a,0x037e388d),LL(0x5946dbf6,0xee4b32b0), LL(0xcae368d1,0xb1c4fda9),LL(0xfdb0b2f3,0x5001a7b0),LL(0x2e3ac46e,0x6df59374),LL(0x39b3e656,0x4af675f2),
+ LL(0x39949296,0x44e38110),LL(0x361db1b5,0x5b63827b),LL(0x206eaff5,0x3e5323ed),LL(0xc21f4290,0x942370d2), LL(0xe0d985a1,0xf2caaf2e),LL(0x7239846d,0x192cc64b),LL(0xae6312f8,0x7c0b8f47),LL(0x96620108,0x7dc61f91),
+ LL(0xc2da7de9,0xb830fb5b),LL(0x0ff8d3be,0xd0e643df),LL(0x188a9641,0x31ee77ba),LL(0xbcf6d502,0x4e8aa3aa), LL(0x9a49110f,0xf9fb6532),LL(0x2dd6b220,0xd18317f6),LL(0x52c3ea5a,0x7e3ced41),LL(0x7d579c4a,0x0d296a14),
+ LL(0xed4c3717,0x35d6a53e),LL(0x3d0ed2a3,0x9f8240cf),LL(0xe5543aa5,0x8c0d4d05),LL(0xdd33b4b4,0x45d5bbfb), LL(0x137fd28e,0xfa04cc73),LL(0xc73b3ffd,0x862ac6ef),LL(0x31f51ef2,0x403ff9f5),LL(0xbc73f5a2,0x34d5e0fc),
+ LL(0x08913f4f,0xf2526820),LL(0xeac93d95,0xea20ed61),LL(0x6ca6b26c,0x51ed38b4),LL(0xea4327b0,0x8662dcbc), LL(0x725d2aaa,0x6daf295c),LL(0x8e52dcda,0xbad2752f),LL(0x0b17dacc,0x2210e721),LL(0xd51e8232,0xa37f7912),
+ LL(0x44cc3add,0x4f7081e1),LL(0x87be82cf,0xd5ffa1d6),LL(0x0edd6472,0x89890b6c),LL(0x3ed17863,0xada26e1a), LL(0x63483caa,0x276f2715),LL(0x2f6077fd,0xe6924cd9),LL(0x0a466e3c,0x05a7fe98),LL(0xb1902d1f,0xf1c794b0),
+ LL(0x82a8042c,0xe5213688),LL(0xcd278298,0xd931cfaf),LL(0xf597a740,0x069a0ae0),LL(0xeb59107c,0x0adbb3f3), LL(0x5eaa8eb8,0x983e951e),LL(0x11b48e78,0xe663a8b5),LL(0x8a03f2c5,0x1631cc0d),LL(0x11e271e2,0x7577c11e),
+ LL(0x08369a90,0x33b2385c),LL(0x190eb4f8,0x2990c59b),LL(0xc68eac80,0x819a6145),LL(0x2ec4a014,0x7a786d62), LL(0x20ac3a8d,0x33faadbe),LL(0x5aba2d30,0x31a21781),LL(0xdba4f565,0x209d2742),LL(0x55aa0fbb,0xdb2ce9e3),
+ LL(0x168984df,0x8cef334b),LL(0x33879638,0xe81dce17),LL(0x263720f0,0xf6e6949c),LL(0xf593cbec,0x5c56feaf), LL(0xfde58c84,0x8bff5601),LL(0x2eccb314,0x74e24117),LL(0x4c9a8a78,0xbcf01b61),LL(0x544c9868,0xa233e35e),
+ LL(0x8bd7aff1,0xb3156bf3),LL(0x1d81b146,0x1b5ee4cb),LL(0xd628a915,0x7ba1ac41),LL(0xfd89699e,0x8f3a8f9c), LL(0xa0748be7,0x7329b9c9),LL(0xa92e621f,0x1d391c95),LL(0x4d10a837,0xe51e6b21),LL(0x4947b435,0xd255f53a),
+ LL(0xf1788ee3,0x07669e04),LL(0xa86938a2,0xc14f27af),LL(0xe93a01c0,0x8b47a334),LL(0xd9366808,0xff627438), LL(0xca2a5965,0x7a0985d8),LL(0xd6e9b9b3,0x3d9a5542),LL(0x4cf972e8,0xc23eb80b),LL(0x4fdf72fd,0x5c1c33bb),
+ LL(0x74a86108,0x0c4a58d4),LL(0xee4c5d90,0xf8048a8f),LL(0xe86d4c80,0xe3c7c924),LL(0x056a1e60,0x28c889de), LL(0xb214a040,0x57e2662e),LL(0x37e10347,0xe8c48e98),LL(0x80ac748a,0x87742862),LL(0x186b06f2,0xf1c24022),
+ LL(0x5f74040a,0xac2dd4c3),LL(0xfceac957,0x409aeb71),LL(0x55c4ec23,0x4fbad782),LL(0x8a7b76ec,0xb359ed61), LL(0xed6f4a60,0x12744926),LL(0x4b912de3,0xe21e8d7f),LL(0xfc705a59,0xe2575a59),LL(0xed2dbc0e,0x72f1d4de),
+ LL(0xeb7926b8,0x3d2b24b9),LL(0xcdbe5509,0xbff88cb3),LL(0xe4dd640b,0xd0f399af),LL(0x2f76ed45,0x3c5fe130), LL(0x3764fb3d,0x6f3562f4),LL(0x3151b62d,0x7b5af318),LL(0xd79ce5f3,0xd5bd0bc7),LL(0xec66890f,0xfdaf6b20),
+ LL(0x6063540c,0x735c67ec),LL(0xe5f9cb8f,0x50b259c2),LL(0x3f99c6ab,0xb8734f9a),LL(0xa3a7bc85,0xf8cc13d5), LL(0xc5217659,0x80c1b305),LL(0x4ec12a54,0xfe5364d4),LL(0x681345fe,0xbd87045e),LL(0x582f897f,0x7f8efeb1),
+ LL(0xd5923359,0xe8cbf1e5),LL(0x539b9fb0,0xdb0cea9d),LL(0x49859b98,0x0c5b34cf),LL(0xa4403cc6,0x5e583c56), LL(0xd48185b7,0x11fc1a2d),LL(0x6e521787,0xc93fbc7e),LL(0x05105b8b,0x47e7a058),LL(0xdb8260c8,0x7b4d4d58),
+ LL(0x46eb842a,0xe33930b0),LL(0x7bdae56d,0x8e844a9a),LL(0x13f7fdfc,0x34ef3a9e),LL(0x636ca176,0xb3768f82), LL(0x4e09e61c,0x2821f4e0),LL(0xa0c7cddc,0x414dc3a1),LL(0x54945fcd,0xd5379437),LL(0xb3555ff1,0x151b6eef),
+ LL(0x6339c083,0xb31bd613),LL(0xdfb64701,0x39ff8155),LL(0xe29604ab,0x7c3388d2),LL(0xa6b10442,0x1e19084b), LL(0xeccd47ef,0x17cf54c0),LL(0x4a5dfb30,0x89693385),LL(0x47daf9f6,0x69d023fb),LL(0x7d91d959,0x9222840b),
+ LL(0x803bac62,0x439108f5),LL(0x379bd45f,0x0b7dd91d),LL(0xca63c581,0xd651e827),LL(0x509c104f,0x5c5d75f6), LL(0x1f2dc308,0x7d5fc738),LL(0xd98454be,0x20faa7bf),LL(0xa517b031,0x95374bee),LL(0x642692ac,0xf036b9b1),
+ LL(0x39842194,0xc5106109),LL(0x49d05295,0xb7e2353e),LL(0xefb42ee0,0xfc8c1d5c),LL(0x08ce811c,0xe04884eb), LL(0x7419f40e,0xf1f75d81),LL(0xa995c241,0x5b0ac162),LL(0xc4c55646,0x120921bb),LL(0x8d33cf97,0x713520c2),
+ LL(0xe98c5100,0xb4a65a5c),LL(0x2ddd0f5a,0x6cec871d),LL(0x9ba2e78b,0x251f0b7f),LL(0xce3a2a5f,0x224a8434), LL(0x25f5c46f,0x26827f61),LL(0x48545ec0,0x6a22bedc),LL(0xb1bb5cdc,0x25ae5fa0),LL(0xfcb9b98f,0xd693682f),
+ LL(0x91e5d7d3,0x32027fe8),LL(0x73a07678,0xf14b7d17),LL(0xc0dfdd61,0xf88497b3),LL(0x2a8c4f48,0xf7c2eec0), LL(0x3756e621,0xaa5573f4),LL(0x1825b948,0xc013a240),LL(0x63878572,0x1c03b345),LL(0x653a4184,0xa0472bea),
+ LL(0x0ac69a80,0xf4222e27),LL(0xf51e54f6,0x34096d25),LL(0x8fffa591,0x00a648cb),LL(0x69b6527f,0x4e87acdc), LL(0xe285ccb4,0x0575e037),LL(0x50ddcf52,0x188089e4),LL(0x870ff719,0xaa96c9a8),LL(0x1fc7e369,0x74a56cd8),
+ LL(0x1726931a,0x41d04ee2),LL(0x3660ecfd,0x0bbbb2c8),LL(0x24818e18,0xa6ef6de5),LL(0xe7d57887,0xe421cc51), LL(0xbea87be6,0xf127d208),LL(0xb1cdd682,0x16a475d3),LL(0x439b63f7,0x9db1b684),LL(0xf0f113b6,0x5359b3db),
+ LL(0x8bf06e31,0xdfccf1de),LL(0xdd383901,0x1fdf8f44),LL(0x5017e7d2,0x10775cad),LL(0x58d11eef,0xdfc3a597), LL(0xb1ecff10,0x6ec9c8a0),LL(0x28400549,0xee6ed6cc),LL(0x1b4f8d73,0xb5ad7bae),LL(0xe00aaab9,0x61b4f11d),
+ LL(0xd4eff2d7,0x7b32d69b),LL(0x4288b60f,0x88ae6771),LL(0x37a1e723,0x159461b4),LL(0x570aae8c,0x1f3d4789), LL(0x7f9871da,0x869118c0),LL(0xf635e278,0x35fbda78),LL(0xe1541dac,0x738f3641),LL(0xc0dae45f,0x6794b13a),
+ LL(0x09cc0917,0x065064ac),LL(0xc68540fd,0x27c53729),LL(0xef227671,0x0d2d4c8e),LL(0xa1785a04,0xd23a9f80), LL(0x52650359,0x98c59528),LL(0x74a1acad,0xfa09ad01),LL(0x0b55bf5c,0x082d5a29),LL(0x419b8084,0xa40f1c67),
+ LL(0xdcc18770,0x3a5c752e),LL(0x8825c3a5,0x4baf1f2f),LL(0x21b153ed,0xebd63f74),LL(0xb2f64723,0xa2383e47), LL(0x2646d19a,0xe7bf620a),LL(0x03c83ffd,0x56cb44ec),LL(0x4f6be9f1,0xaf7267c9),LL(0xc06bb5e9,0x8b2dfd7b),
+ LL(0xa672c5c7,0xb87072f2),LL(0x0d53c5e2,0xeacb11c8),LL(0xff435932,0x22dac29d),LL(0x4408693c,0x37bdb99d), LL(0x2899c20f,0xf6e62fb6),LL(0x447ece24,0x3535d512),LL(0xff577ce3,0xfbdc6b88),LL(0x190575f2,0x726693bd),
+ LL(0xab4b35a2,0x6772b0e5),LL(0xf5eeaacf,0x1d8b6001),LL(0x795b9580,0x728f7ce4),LL(0x41fb81da,0x4a20ed2a), LL(0x4fec01e6,0x9f685cd4),LL(0xa7ff50ad,0x3ed7ddcc),LL(0x0c2d97fd,0x460fd264),LL(0xeb82f4f9,0x3a241426),
+ LL(0x6a8ea820,0x17d1df2c),LL(0xf22cc254,0xb2b50d3b),LL(0xb7291426,0x03856cba),LL(0x04f5ee39,0x87fd26ae), LL(0x02bee4ba,0x9cb696cc),LL(0x06820fd6,0x53121804),LL(0x0212e985,0xa5dfc269),LL(0x160f9a09,0x666f7ffa),
+ LL(0xbccd9617,0xc503cd33),LL(0xba7730a3,0x365dede4),LL(0x5ddb0786,0x798c6355),LL(0xfc9cd3bc,0xa6c3200e), LL(0xe5e35efd,0x060ffb2c),LL(0x5555a1c1,0x99a4e25b),LL(0xf70b3751,0x11d95375),LL(0x160e1bf6,0x0a57354a),
+ LL(0xf8e4b065,0xecb3ae4b),LL(0x2e53022b,0x07a834c4),LL(0x8692ed96,0x1cd300b3),LL(0x61ee14ec,0x16a6f792), LL(0x6a8649ed,0x8f1063c6),LL(0x869f3e14,0xfbcdfcfe),LL(0x00a7b3ec,0x2cfb97c1),LL(0x7130c2f1,0xcea49b3c),
+ LL(0xe9d96488,0x462d044f),LL(0x8182a0c1,0x4b53d52e),LL(0x0391e9e9,0x84b6ddd3),LL(0xb1741a09,0x80ab7b48), LL(0x27d3317f,0xec0e15d4),LL(0x1a64671e,0x8dfc1ddb),LL(0xd49c5b92,0x93cc5d5f),LL(0x3674a331,0xc995d53d),
+ LL(0x090090ae,0x302e41ec),LL(0xedb06830,0x2278a0cc),LL(0xfbc99690,0x1d025932),LL(0xb80d68da,0x0c32fbd2), LL(0xf341a6c1,0xd79146da),LL(0x1bef68a0,0xae0ba139),LL(0x8d774b3a,0xc6b8a563),LL(0x880ba4d7,0x1cf307bd),
+ LL(0x19803511,0xc033bdc7),LL(0x8888c3be,0xa9f97b3b),LL(0x85c6d05e,0x3d68aebc),LL(0x193919eb,0xc3b88a9d), LL(0xc48b0ee3,0x2d300748),LL(0x07a746c1,0x7506bc7c),LL(0x6e6d57f3,0xfc48437c),LL(0xcfeaa91a,0x5bd71587),
+ LL(0xc1bc5225,0xa4ed0408),LL(0x2719226d,0xd0b946db),LL(0x758d2d43,0x109ecd62),LL(0x2751759b,0x75c8485a), LL(0x9ce4177a,0xb0b75f49),LL(0x79c10c3d,0x4fa61a1e),LL(0xa167fcd7,0xc062d300),LL(0x750f0fa8,0x4df3874c),
+ LL(0x83dfedc9,0x29ae2cf9),LL(0x8d87631a,0xf8437134),LL(0x7429c8d2,0xaf571711),LL(0x146d9272,0x18d15867), LL(0x69769bb7,0x83053ecf),LL(0xc479ab82,0xc55eb856),LL(0x21b0f4b2,0x5ef7791c),LL(0x3d491525,0xaa5956ba),
+ LL(0x9fe20eba,0x407a96c2),LL(0xe52a5ad3,0xf27168bb),LL(0xbf1d9d89,0x43b60ab3),LL(0x710e727a,0xe45c51ef), LL(0x099b4221,0xdfca5276),LL(0x2557a159,0x8dc6407c),LL(0x91035895,0x0ead8335),LL(0x9c55dc32,0x0a9db957),
+ LL(0xdf61bc76,0xe40736d3),LL(0x3f778cdb,0x13a619c0),LL(0xc56ea28f,0x6dd921a4),LL(0x2fa647b4,0x76a52433), LL(0xac5bdc5d,0x23591891),LL(0xbac7dc01,0xff4a1a72),LL(0x62df8453,0x9905e261),LL(0xe63b265f,0x3ac045df),
+ LL(0xad53dba7,0x8a3f341b),LL(0x837b625a,0x8ec269cc),LL(0x3ae31189,0xd71a2782),LL(0x55e96120,0x8fb4f9a3), LL(0xff9875cf,0x804af823),LL(0x5d442a9b,0x23224f57),LL(0xecc62679,0x1c4d3b9e),LL(0xa0e7ddb1,0x91da22fb),
+ LL(0x6c04a661,0xa370324d),LL(0x5e376d17,0x9710d3b6),LL(0x3044e357,0xed8c98f0),LL(0x6422701c,0xc364ebbe), LL(0x7733d61c,0x347f5d51),LL(0xcea826c3,0xd55644b9),LL(0x55a25548,0x80c6e0ad),LL(0x844220a7,0x0aa7641d),
+ LL(0x31810660,0x1438ec81),LL(0xde4b4043,0x9dfa6507),LL(0xcc3e0273,0x10b515d8),LL(0x28d8cfb2,0x1b6066dd), LL(0x9c9efebd,0xd3b04591),LL(0xa21c1ff4,0x425d4bdf),LL(0xd57607d3,0x5fe5af19),LL(0x54481084,0xbbf773f7),
+ LL(0x94b03ed1,0x8435bd69),LL(0x634cc546,0xd9ad1de3),LL(0x00e420ca,0x2cf423fc),LL(0xa03096dd,0xeed26d80), LL(0xa4db09d2,0xd7f60be7),LL(0x960622f7,0xf47f569d),LL(0x7296c729,0xe5925fd7),LL(0x26ca2715,0xeff2db26),
+ LL(0xb913e759,0xa6fcd014),LL(0x8ff4de93,0x53da4786),LL(0xc32068e1,0x14616d79),LL(0xccdf352e,0xb187d664), LL(0x1dc90b59,0xf7afb650),LL(0x7daa1b26,0x8170e943),LL(0x700c0a84,0xc8e3bdd8),LL(0x6482bdfa,0x6e8d345f),
+ LL(0xc5c5ea50,0x84cfbfa1),LL(0x67960681,0xd3baf14c),LL(0x0dd50942,0x26398403),LL(0x4716a663,0xe4b7839c), LL(0xe7de6dc0,0xd5f1f794),LL(0x622aa7ce,0x5cd0f4d4),LL(0x59acfeec,0x5295f3f1),LL(0x953e0607,0x8d933552),
+ LL(0x776c5722,0xc7db8ec5),LL(0x2b5f290c,0xdc467e62),LL(0x4ff425a9,0xd4297e70),LL(0x0cf7bb72,0x4be924c1), LL(0xa1892131,0x0d5dc5ae),LL(0xa705c992,0x8bf8a8e3),LL(0x7a305ac5,0x73a0b064),LL(0x9a8c77a8,0x00c9ca4e),
+ LL(0x83774bdd,0x5dfee80f),LL(0x85734485,0x63131602),LL(0x914a69a9,0xa1b524ae),LL(0xd4e300d7,0xebc2ffaf), LL(0x7cfa46a5,0x52c93db7),LL(0x21653b50,0x71e6161f),LL(0xa4bc580a,0x3574fc57),LL(0xe1bc1253,0xc09015dd),
+ LL(0xd174d7aa,0x4b7b47b2),LL(0xf3a15d04,0x4072d8e8),LL(0xd6fa07ed,0xeeb7d47f),LL(0xedbdafb1,0x6f2b9ff9), LL(0x3760fe8a,0x18c51615),LL(0xf06c6c13,0x7a96e6bf),LL(0x0ea2d071,0x4d7a0410),LL(0x0be2a5ce,0xa1914e9b),
+ LL(0xd8a3c5cf,0x5726e357),LL(0x2abb2b13,0x1197ecc3),LL(0x31ae88dd,0x6c0d7f7f),LL(0xfdbb3efe,0x15b20d1a), LL(0x70584039,0xcd06aa26),LL(0xa7dc9747,0x2277c969),LL(0x7855d815,0xbca69587),LL(0x5188b32a,0x899ea238),
+ LL(0x760c1c9d,0x37d9228b),LL(0x9b5c18da,0xc7efbb11),LL(0x19f6dbc5,0x7f0d1bc8),LL(0x07e6905b,0x4875384b), LL(0x3ba8cd86,0xc7c50baa),LL(0xc2905de0,0xb0ce40fb),LL(0x7a231952,0x70840673),LL(0xcf43de26,0xa912a262),
+ LL(0xeb5b76c1,0x9c38ddcc),LL(0x26fc0ab4,0x746f5285),LL(0xd62c269f,0x52a63a50),LL(0x99458621,0x60049c55), LL(0x3c2f7c9e,0xe7f48f82),LL(0x917d5cf3,0x6bd99043),LL(0x8701f469,0xeb1317a8),LL(0x9a449fe0,0xbd3fe2ed),
+ LL(0x12ef3d36,0x421e79ca),LL(0x3e7ea5de,0x9ee3c36c),LL(0xcdff36f7,0xe48198b5),LL(0xc6b82228,0xaff4f967), LL(0xc47adb7e,0x15e19dd0),LL(0x032e7dfa,0x45699b23),LL(0x1fae026a,0x40680c8b),LL(0x550dbf4d,0x5a347a48),
+ LL(0x3cef0d7d,0xe652533b),LL(0x2bbb4381,0xd94f7b18),LL(0x0e80f500,0x838752be),LL(0x9e9c9bfb,0x8e6e2488), LL(0x16caca6a,0xc9751697),LL(0x38531ad9,0x866c49d8),LL(0x7151ade1,0xc917e239),LL(0x6037c407,0x2d016ec1),
+ LL(0x00eac3f9,0xa407ccc9),LL(0xe2ed4748,0x835f6280),LL(0x1cc98e0d,0xcc54c347),LL(0xdcb572eb,0x0e969937), LL(0x8f30c9cb,0x1b16c8e8),LL(0x373c4661,0xa606ae75),LL(0x35502cab,0x47aa689b),LL(0x4d9bb64f,0xf89014ae),
+ LL(0x31c71f7b,0x202f6a9c),LL(0x296ffe5c,0x01f95aa3),LL(0x53cec3a3,0x5fc06014),LL(0x5f498a45,0xeb991237), LL(0x5d91ba87,0xae9a935e),LL(0x0b564a19,0xc6ac6281),LL(0x3bd44e69,0x8a8fe81c),LL(0x9dd11d45,0x7c8b467f),
+ LL(0xea5b8e69,0xf772251f),LL(0xc5b75fbc,0xaeecb3bd),LL(0x887ff0e5,0x1aca3331),LL(0x19f0a131,0xbe5d49ff), LL(0xe5c8646f,0x582c13aa),LL(0x20e19980,0xdbaa12e8),LL(0xf7abbd94,0x8f40f31a),LL(0x1dfc7663,0x1f13f5a8),
+ LL(0xaceb4fc0,0x5d81f1ee),LL(0x5e6f0f42,0x36256002),LL(0x751370c8,0x4b67d6d7),LL(0x03e80589,0x2608b698), LL(0x05268301,0xcfc0d2fc),LL(0x40309212,0xa6943d39),LL(0x1fd0e1c2,0x192a90c2),LL(0x37f1dc76,0xb209f113),
+ LL(0x97bf1298,0xefcc5e06),LL(0x219d639e,0xcbdb6730),LL(0xb81e8c6f,0xd009c116),LL(0x1a7ce2e5,0xa3ffdde3), LL(0xa914d3ba,0xc53fbaaa),LL(0x88df85ee,0x836d500f),LL(0x66ee0751,0xd98dc71b),LL(0x714516fd,0x5a3d7005),
+ LL(0x39eedbba,0x21d3634d),LL(0x0455a46d,0x35cd2e68),LL(0xf9d7eb0c,0xc8cafe65),LL(0x00cefb3e,0xbda3ce9e), LL(0x2c9cf7a4,0xddc17a60),LL(0x7bcb8773,0x01572ee4),LL(0x8c7548df,0xa92b2b01),LL(0xa84600e3,0x732fd309),
+ LL(0x16543a40,0xe22109c7),LL(0xfede3c6c,0x9acafd36),LL(0x6824e614,0xfb206852),LL(0xda25dca0,0x2a4544a9), LL(0x91d60b06,0x25985262),LL(0x28753545,0x281b7be9),LL(0x90f13b27,0xec667b1a),LL(0x940e2eb4,0x33a83aff),
+ LL(0xd5d721d5,0x80009862),LL(0x5bd3a182,0x0c3357a3),LL(0x7aa2cda4,0x27f3a83b),LL(0xf6f83085,0xb58ae74e), LL(0x2e6dad6b,0x2a911a81),LL(0xf43d6c5b,0xde286051),LL(0xf996c4d8,0x4bdccc41),LL(0x0ae1e24e,0xe7312ec0),
+},
+/* digit=2 base_pwr=2^14 */
+{
+ LL(0x6e6485b3,0xf8d112e7),LL(0x771c52f8,0x4d3e24db),LL(0x684a2f6d,0x48e3ee41),LL(0x21d95551,0x7161957d), LL(0xcdb12a6c,0x19631283),LL(0x2e50e164,0xbf3fa882),LL(0x3166cc73,0xf6254b63),LL(0xaee8cc38,0x3aefa7ae),
+ LL(0x3b36f9fd,0x79b0fe62),LL(0xfde19fc0,0x26543b23),LL(0x958482ef,0x136e64a0),LL(0x9b095825,0x23f63771), LL(0xb6a1142e,0x14cfd596),LL(0x335aac0b,0x5ea6aac6),LL(0xf3081dd5,0x86a0e8bd),LL(0x003dc12a,0x5fb89d79),
+ LL(0xf72e34d4,0xf615c33a),LL(0x110eec35,0x0bd9ea40),LL(0xc1dea34e,0x1c12bc5b),LL(0x49ae4699,0x686584c9), LL(0x8c97b942,0x13ad95d3),LL(0x4e5c7562,0x4609561a),LL(0xf2737f89,0x9e94a4ae),LL(0x371c78b6,0xf57594c6),
+ LL(0xe3779ee3,0x0f0165fc),LL(0xbd495d9e,0xe00e7f9d),LL(0x20284e7a,0x1fa4efa2),LL(0x47ac6219,0x4564bade), LL(0xc4708e8e,0x90e6312a),LL(0xa71e9adf,0x4f5725fb),LL(0x3d684b9f,0xe95f55ae),LL(0x1e94b415,0x47f7ccb1),
+ LL(0x8d946581,0x7322851b),LL(0xbdf4a012,0xf0d13133),LL(0x6584dae0,0xa3510f69),LL(0x3c9f6c6d,0x03a7c171), LL(0xe475381a,0x5be97f38),LL(0x85823334,0xca1ba422),LL(0x0be17dda,0xf83cc5c7),LL(0x0b918c0f,0x158b1494),
+ LL(0x522e6b69,0xda3a77e5),LL(0xbbcd6c18,0x69c908c3),LL(0xd924fd56,0x1f1b9e48),LL(0xaa4bb3f7,0x37c64e36), LL(0xee478d7d,0x5a4fdbdf),LL(0x0193f7a0,0xba75c8bc),LL(0x56cd16df,0x84bc1e84),LL(0x46fad151,0x1fb08f08),
+ LL(0x842e9f30,0x8a7cabf9),LL(0x5eab83af,0xa331d4bf),LL(0x017f2a6a,0xd272cfba),LL(0x83aba0e3,0x27560abc), LL(0x0e3a6b75,0x94b83387),LL(0x6b9f50f5,0x25c6aea2),LL(0xb5fdf6d0,0x803d691d),LL(0xe6333514,0x03b77509),
+ LL(0x61a341c1,0x36178903),LL(0x0cfd6142,0x3604dc60),LL(0x8533316c,0x022295eb),LL(0x44af2922,0x3dbde4ac), LL(0x1c7eef69,0x898afc5d),LL(0xd14f4fa1,0x58896805),LL(0x203c21ca,0x05002160),LL(0x40ef730b,0x6f0d1f30),
+ LL(0x196224f8,0x8e8c44d4),LL(0x374d079d,0x75a4ab95),LL(0x7d48f123,0x79085ecc),LL(0x1bf65ad8,0x56f04d31), LL(0xbda602b2,0xe220bf1c),LL(0xf9612c69,0x73ee1742),LL(0x084fd06b,0x76008fc8),LL(0xf11380d1,0x4000ef9f),
+ LL(0x12cfe297,0x48201b4b),LL(0x292f74e5,0x3eee129c),LL(0xc9e874e8,0xe1fe114e),LL(0x92c5fc41,0x899b055c), LL(0x3a39c8cf,0x4e477a64),LL(0x78963cc9,0x82f09efe),LL(0xd333f863,0x6fd3fd8f),LL(0xdc949c63,0x85132b2a),
+ LL(0x516eb17b,0x7e06a3ab),LL(0xd2c7372b,0x73bec06f),LL(0xba896da6,0xe4f74f55),LL(0x8e9eb40f,0xbb4afef8), LL(0xe61d66b0,0x2d75bec8),LL(0xef29300b,0x02bda4b4),LL(0x026baa5a,0x8bbaa8de),LL(0xa07f4440,0xff54befd),
+ LL(0xbe7a2af3,0xbd9b8b1d),LL(0x4fb74a72,0xec51caa9),LL(0x63879697,0xb9937a4b),LL(0xec2687d5,0x7c9a9d20), LL(0x6ef5f014,0x1773e44f),LL(0xe90c6900,0x8abcf412),LL(0x8142161e,0x387bd022),LL(0xfcb6ff2a,0x50393755),
+ LL(0xed6def63,0x9813fd56),LL(0x7d53106c,0x53cf6482),LL(0x431f7ac1,0x991a35bd),LL(0x63e65faf,0xf1e274dd), LL(0x44cc7880,0xf63ffa3c),LL(0x7c256981,0x411a426b),LL(0x93a420e0,0xb698b9fd),LL(0xae53f8fe,0x89fdddc0),
+ LL(0x32398baa,0x766e0722),LL(0x5cfca031,0x205fee42),LL(0x7a029cf2,0xa49f5341),LL(0x4023890d,0xa88c68b8), LL(0x7337aaa8,0xbc275041),LL(0x0eb384f4,0x9ed364ad),LL(0x29aba92f,0xe0816f85),LL(0x04e38a88,0x2e9e1941),
+ LL(0x3dafd2d5,0x57eef44a),LL(0x97ed98d8,0x35d1fae5),LL(0x2307f9b1,0x50628c09),LL(0xd6cba5c6,0x09d84aae), LL(0x88aaa691,0x67071bc7),LL(0xafe6cb03,0x2dea57a9),LL(0x3d78ac01,0xdfe11bb4),LL(0x7fd7aa51,0x7286418c),
+ LL(0x77f7195a,0xfabf7709),LL(0xadeb838f,0x8ec86167),LL(0xbb4f012d,0xea1285a8),LL(0x9a3eab3f,0xd6883503), LL(0x309004c2,0xee5d24f8),LL(0x13ffe95e,0xa96e4b76),LL(0xbd223ea4,0x0cdffe12),LL(0xb6739a53,0x8f5c2ee5),
+ LL(0xdd968198,0x5cb4aaa5),LL(0x72413a6c,0xfa131c52),LL(0x9536d903,0x53d46a90),LL(0x48606d8e,0xb270f0d3), LL(0xa053a3bc,0x518c7564),LL(0x1a86caef,0x088254b7),LL(0x0ab5efd0,0xb3ba8cb4),LL(0x4605945d,0x5c59900e),
+ LL(0xa1887395,0xecace1dd),LL(0x932a65de,0x40960f36),LL(0x3aa95529,0x9611ff5c),LL(0x7c1e5a36,0xc58215b0), LL(0xf0e1a524,0xd48c9b58),LL(0xf590dfb8,0xb406856b),LL(0x9cd95662,0xc7605e04),LL(0xa33ecf82,0x0dd036ee),
+ LL(0xc33156b3,0xa50171ac),LL(0x4a80172e,0xf09d24ea),LL(0x76dc8eef,0x4e1f72c6),LL(0x5e3d44ee,0xe60caadc), LL(0x979b1d8f,0x006ef8a6),LL(0x97788d26,0x60908a1c),LL(0x266feec0,0x6e08f95b),LL(0x22e8c94e,0x618427c2),
+ LL(0x59145a65,0x3d613339),LL(0xfa406337,0xcd9bc368),LL(0x2d8a52a0,0x82d11be3),LL(0x97a1c590,0xf6877b27), LL(0xf5cbdb25,0x837a819b),LL(0xde090249,0x2a4fd1d8),LL(0x74990e5f,0x622a7de7),LL(0x7945511b,0x840fa5a0),
+ LL(0x6558842d,0x30b974be),LL(0x17f3d0a6,0x70df8c64),LL(0x7542e46d,0x7c803520),LL(0xe4ecc823,0x7251fe7f), LL(0x5e9aac9a,0xe59134cb),LL(0xf0045d71,0x11bb0934),LL(0xdbcb1d4e,0x53e5d9b5),LL(0x92defc91,0x8d97a905),
+ LL(0x7946d3f9,0xfe289327),LL(0x07472273,0xe132bd24),LL(0x1eb6ae86,0xeeeb510c),LL(0xf0595067,0x777708c5), LL(0x1297029e,0x18e2c8cd),LL(0xbbf9305e,0x2c61095c),LL(0x6b85d6d9,0xe466c258),LL(0xda1ea530,0x8ac06c36),
+ LL(0xa1304668,0xa365dc39),LL(0x07f89606,0xe4a9c885),LL(0xacc7228d,0x65a4898f),LL(0x84ca8303,0x3e2347ff), LL(0xea7d23a3,0xa5f6fb77),LL(0x672a71cd,0x2fac257d),LL(0x7e6a44d3,0x6908bef8),LL(0x891d3d7a,0x8ff87566),
+ LL(0x6b0cf82e,0xe58e90b3),LL(0x2615b5e7,0x6438d246),LL(0x669c145a,0x07b1f8fc),LL(0x36f1e1cb,0xb0d8b2da), LL(0xd9184c4d,0x54d5dadb),LL(0xf93d9976,0x3dbb18d5),LL(0xd1147d47,0x0a3e0f56),LL(0xa0a48609,0x2afa8c8d),
+ LL(0xbc36742c,0x275353e8),LL(0xeea0ed90,0x898f427e),LL(0x3e477b00,0x26f4947e),LL(0x308741e3,0x8ad8848a), LL(0xd74a2a46,0x6c703c38),LL(0x9ba17ba2,0x5e3e05a9),LL(0x4ab9a9e4,0xc1fa6f66),LL(0x3841d6ec,0x474a2d9a),
+ LL(0x653ae326,0x871239ad),LL(0xa74cbb43,0x14bcf72a),LL(0x20d4c083,0x8737650e),LL(0x110ed4af,0x3df86536), LL(0xb53ca555,0xd2d86fe7),LL(0xabd5d538,0x688cb00d),LL(0x1ad38468,0xcf81bda3),LL(0xf01167b6,0x7ccfe3cc),
+ LL(0x6c4c1fe6,0xcf4f47e0),LL(0x298bbb79,0x557e1f1a),LL(0x30d45a14,0xf93b974f),LL(0x0baf97c4,0x174a1d2d), LL(0xc51fbf53,0x7a003b30),LL(0xee68b225,0xd8940991),LL(0x1c0f4173,0x5b0aa7b7),LL(0xa20a7153,0x975797c9),
+ LL(0xe3533d77,0x26e08c07),LL(0x2e341c99,0xd7222e6a),LL(0x8d2dc4ed,0x9d60ec3d),LL(0x7c476cf8,0xbdfe0d8f), LL(0x1d056605,0x1fe59ab6),LL(0x86a8551f,0xa9ea9df6),LL(0x47fb8d8c,0x8489941e),LL(0x4a7f1b10,0xfeb874eb),
+ LL(0x7ee0d98f,0xfe5fea86),LL(0xdbf61864,0x201ad34b),LL(0x37c031d4,0x45d8fe47),LL(0x795f0822,0xd5f49fae), LL(0xc7f4a40c,0xdb0fb291),LL(0x730ddd92,0x2e69d9c1),LL(0x49d76987,0x754e1054),LL(0x7662db87,0x8a24911d),
+ LL(0x60a71676,0x61fc1810),LL(0xf66a8ad1,0xe852d1a8),LL(0x6417231e,0x172bbd65),LL(0x3babb11f,0x0d6de7bd), LL(0xc8e347f8,0x6fde6f88),LL(0x9bd99cc3,0x1c587547),LL(0x34076950,0x78e54ed0),LL(0x796e83ba,0x97f0f334),
+ LL(0x4924867a,0xe4dbe1ce),LL(0x60b84917,0xbd5f51b0),LL(0x3cb09a79,0x37530040),LL(0xff1743d8,0xdb3fe0f8), LL(0x556fa9db,0xed7894d8),LL(0x23412fbf,0xfa262169),LL(0xba7b9291,0x563be0db),LL(0x0c9fb234,0x6ca8b8c0),
+ LL(0xbd763802,0xed406aa9),LL(0x65303da1,0xc21486a0),LL(0xc7e62ec4,0x61ae291e),LL(0xdf99333e,0x622a0492), LL(0xbb7a8ee0,0x7fd80c9d),LL(0x6c01aedb,0xdc2ed3bc),LL(0x08be74ec,0x35c35a12),LL(0x469f671f,0xd540cb1a),
+ LL(0xcf84f6c7,0xd16ced4e),LL(0x2d090f43,0x8561fb9c),LL(0x6f239db4,0x7e693d79),LL(0x77bd0d94,0xa736f928), LL(0x2c1950ee,0x07b4d929),LL(0x56dc11b3,0xda177543),LL(0x7a6a878e,0xa5dfbbaa),LL(0x4decb08a,0x1c70cb29),
+ LL(0x6f0f7c50,0xfba28c8b),LL(0x854dcc6d,0xa8eba2b8),LL(0x36b78642,0x5ff8e89a),LL(0xf6873adf,0x070c1c8e), LL(0x6484d2e4,0xbbd3c371),LL(0x0d414129,0xfb78318f),LL(0x6ad93b0b,0x2621a39c),LL(0xa9e917f7,0x979d74c2),
+ LL(0x61fb0428,0xfc195647),LL(0xbee624d4,0x4d78954a),LL(0xb8ae86fd,0xb94896e0),LL(0xc91c8b13,0x6667ac0c), LL(0x43bcf832,0x9f180512),LL(0xa0010137,0xfbadf8b7),LL(0xb3ba8aa7,0xc69b4089),LL(0xe687ce85,0xfac4bacd),
+ LL(0x977eab40,0x9164088d),LL(0x2760b390,0x51f4c5b6),LL(0x340dd553,0xd238238f),LL(0xdb1d31c9,0x358566c3), LL(0x5068f5ff,0x3a5ad69e),LL(0xdaff6b06,0xf31435fc),LL(0xd6debff0,0xae549a5b),LL(0x75e01331,0x59e5f0b7),
+ LL(0x98559acf,0x5d492fb8),LL(0x4db79b50,0x96018c2e),LL(0x609f66aa,0x55f4a48f),LL(0x4900a14f,0x1943b3af), LL(0x15a40d39,0xc22496df),LL(0x4c20f7c5,0xb2a44684),LL(0x3b98404c,0x76a35afa),LL(0xff5d1b77,0xbec75725),
+ LL(0xbea06444,0xb67aa163),LL(0xf724b6f2,0x27e95bb2),LL(0xd238c8ab,0x3c20e3e9),LL(0xddd6ae17,0x1213754e), LL(0x716e0f74,0x8c431020),LL(0xffc095c2,0x6679c82e),LL(0xd0ac2932,0x2eb3adf4),LL(0x01bb7a76,0x2cc970d3),
+ LL(0x740f0e66,0x70c71f2f),LL(0x2b6b23cc,0x545c616b),LL(0xb40a8bd7,0x4528cfcb),LL(0x2ab27722,0xff839633), LL(0x025ac99a,0x049127d9),LL(0x2b63e33b,0xd314d4a0),LL(0x28d84519,0xc8c310e7),LL(0xb3bc84ba,0x0fcb8983),
+ LL(0x38634818,0x2cc52261),LL(0xb44c2e0b,0x501814f4),LL(0x54dfdba3,0xf7e181aa),LL(0xe759718c,0xcfd58ff0), LL(0xd3b507a8,0xf90cdb14),LL(0xc50bdad8,0x57bd478e),LL(0x50e5f9aa,0x29c197e2),LL(0xe40bc855,0x4db6eef8),
+ LL(0xd1fc0654,0x2cc8f21a),LL(0x81269d73,0xc71cc963),LL(0x077f49f9,0xecfbb204),LL(0xca56b793,0xdde92571), LL(0xf97ad8f7,0x9abed6a3),LL(0x924de3bd,0xe6c19d3f),LL(0xa140a800,0x8dce92f4),LL(0x1337af07,0x85f44d1e),
+ LL(0x09d64c52,0x5953c08b),LL(0xf5df9749,0xa1b5e49f),LL(0x52735f7d,0x336a8fb8),LL(0x9add676b,0xb332b6db), LL(0xb4511aa4,0x558b88a0),LL(0xdbd5cc55,0x09788752),LL(0xd8cd52bd,0x16b43b9c),LL(0xc2a2696b,0x7f0bc5a0),
+ LL(0xc11f61ef,0x146e12d4),LL(0x3a83e79e,0x9ce10754),LL(0x6cbfca15,0x08ec73d9),LL(0x5b49653f,0x09ff29ad), LL(0xe7da946e,0xe31b72bd),LL(0xee80a4f2,0xebf9eb3b),LL(0x17598ce4,0xd1aabd08),LL(0x53f37e80,0x18b5fef4),
+ LL(0x5958cd79,0xd5d5cdd3),LL(0x1d373114,0x3580a1b5),LL(0xfa935726,0xa36e4c91),LL(0xef20d760,0xa38c534d), LL(0x2ff5845b,0x7088e40a),LL(0xbd78177f,0xe5bb40bd),LL(0x857f9920,0x4f06a7a8),LL(0xe968f05d,0xe3cc3e50),
+ LL(0xe5682d26,0x1d68b7fe),LL(0xaec7f87c,0x5206f76f),LL(0x041951ab,0x41110530),LL(0xd4b5a71a,0x58ec52c1), LL(0x0f75cf9a,0xf3488f99),LL(0xba82d0d5,0xf411951f),LL(0x618895ab,0x27ee75be),LL(0x6d8aab14,0xeae060d4),
+ LL(0x7fb54dc2,0x9ae1df73),LL(0x25963649,0x1f3e391b),LL(0xfe055081,0x242ec32a),LL(0x8491c9bd,0x5bd450ef), LL(0x981eb389,0x367efc67),LL(0x3a0550d5,0xed7e1928),LL(0xab3ce75c,0x362e776b),LL(0x1f24c523,0xe890e308),
+ LL(0xfeccef76,0xb961b682),LL(0x8bba6d92,0x8b8e11f5),LL(0x2b2375c4,0x8f2ccc4c),LL(0xe2f86cfa,0x0d7f7a52), LL(0x9efe5633,0xfd94d30a),LL(0x5451f934,0x2d8d246b),LL(0x244e6a00,0x2234c6e3),LL(0xddec8c50,0xde2b5b0d),
+ LL(0xbf776f5b,0x2ce53c5a),LL(0x60357b05,0x6f724071),LL(0x71bf3f7a,0xb2593717),LL(0x440c4a9f,0x87d2501c), LL(0x87b05340,0x440552e1),LL(0x21624c32,0xb7bf7cc8),LL(0x22facddb,0x4155a6ce),LL(0x889837ef,0x5a4228cb),
+ LL(0xfd4fd671,0xef87d6d6),LL(0xc2daa10e,0xa233687e),LL(0x03c0eb96,0x75622244),LL(0x8bf19be6,0x7632d184), LL(0x40735ff4,0x05d0f8e9),LL(0xc00931f1,0x3a3e6e13),LL(0xdafe3f18,0x31ccde6a),LL(0xcfe51207,0xf381366a),
+ LL(0x60167d92,0x24c222a9),LL(0x7529f18c,0x62f9d6f8),LL(0x0353b114,0x412397c0),LL(0xef808043,0x334d89dc), LL(0x2a4383ce,0xd9ec63ba),LL(0x5cf92ba0,0xcec8e937),LL(0xc8be74c0,0xfb8b4288),LL(0x105d4391,0x67d6912f),
+ LL(0x1b913149,0x7b996c46),LL(0x3a4e02da,0x36aae2ef),LL(0x972de594,0xb68aa003),LL(0x4ec6d545,0x284ec70d), LL(0x61391d54,0xf3d2b2d0),LL(0xfe114e92,0x69c5d5d6),LL(0xb4482dff,0xbe0f00b5),LL(0xf5bf33c5,0xe1596fa5),
+ LL(0x96a71cba,0x10595b56),LL(0xfdcadeb7,0x944938b2),LL(0xfccd8471,0xa282da4c),LL(0x0d37bfe1,0x98ec05f3), LL(0x0698304a,0xe171ce1b),LL(0x21bdf79b,0x2d691444),LL(0x1b21dec1,0xd0cd3b74),LL(0x16a15f71,0x712ecd8b),
+ LL(0x00fd56e1,0x8d4c00a7),LL(0xf9527c18,0x02ec9692),LL(0x4a3e42e1,0x21c44937),LL(0x1392ae0a,0x9176fbab), LL(0x44b7b618,0x8726f1ba),LL(0xf1de491c,0xb4d7aae9),LL(0x07b582c0,0xf91df7b9),LL(0xef60aa3a,0x7e116c30),
+ LL(0x466265d7,0x99270f81),LL(0x4df7adf0,0xb15b6fe2),LL(0xf9738f7f,0xfe33b2d3),LL(0xd6d70f95,0x48553ab9), LL(0xc21e94db,0x2cc72ac8),LL(0xbdc0bbee,0x795ac38d),LL(0x2e40478f,0x0a1be449),LL(0x052bde55,0x81bd3394),
+ LL(0x56b3c4f2,0x63c8dbe9),LL(0x904177cc,0x017a99cf),LL(0x4d010fc1,0x947bbddb),LL(0xbb2c9b21,0xacf9b00b), LL(0x47173611,0x2970bc8d),LL(0xac7d756f,0x1a4cbe08),LL(0x67d541a2,0x06d9f4aa),LL(0x59c2cf44,0xa3e8b689),
+ LL(0x4d88f1dd,0xaad066da),LL(0x7ad35dea,0xc604f165),LL(0x4478ca67,0x7edc0720),LL(0xba02ce06,0xa10dfae0), LL(0xaf36f4e4,0xeceb1c76),LL(0xaf3f8f48,0x994b2292),LL(0x77c8a68c,0xbf9ed77b),LL(0x51744c9d,0x74f544ea),
+ LL(0x8113a757,0x82d05bb9),LL(0x8a9885e4,0x4ef2d2b4),LL(0x1aa7865f,0x1e332be5),LL(0x290d1a52,0x22b76b18), LL(0x44351683,0x308a2310),LL(0xa3f22840,0x9d861896),LL(0x841ed947,0x5959ddcd),LL(0x154b73bf,0x0def0c94),
+ LL(0x4c7c15e0,0xf0105417),LL(0x3a277c32,0x539bfb02),LL(0xf9dccf5f,0xe699268e),LL(0x0247a3bd,0x9f5796a5), LL(0x4f157269,0x8b839de8),LL(0x7a30196b,0xc825c1e5),LL(0xdc8a5a91,0x6ef0aabc),LL(0x498b7fe6,0xf4a8ce6c),
+ LL(0x70cbac78,0x1cce35a7),LL(0xf6b23958,0x83488e9b),LL(0xd76cb011,0x0341a070),LL(0xae1b2658,0xda6c9d06), LL(0xdd648c52,0xb701fb30),LL(0x52fb9fd1,0x994ca02c),LL(0x6f563086,0x06933117),LL(0x17856bab,0x3d2b8100),
+ LL(0x5963a46e,0xe89f48c8),LL(0xa99e61c7,0x658ab875),LL(0x4b8517b4,0x6e296f87),LL(0xfc1bc656,0x36c4fcdc), LL(0xa3906def,0xde5227a1),LL(0x62418945,0x9fe95f57),LL(0xfdd96cde,0x20c91e81),LL(0xda4480de,0x5adbe47e),
+ LL(0x396de2b6,0xa009370f),LL(0xf0ecc7bd,0x98583d4b),LL(0xe51d0672,0xf44f6b57),LL(0x556b1984,0x03d6b078), LL(0xb0b64912,0x27dbdd93),LL(0x15687b09,0x9b3a3434),LL(0x51ec20a9,0x0dba6461),LL(0xff28187c,0xec93db7f),
+ LL(0x66e48bdd,0x00ff8c24),LL(0x11ccd78e,0x2514f2f9),LL(0xe1250603,0xeba11f4f),LL(0x243fa156,0x8a22cd41), LL(0xb283e4c6,0xa4e58df4),LL(0x8b39783f,0x78c29859),LL(0xa5259809,0x5235aee2),LL(0x0e0227dd,0xc16284b5),
+ LL(0x1338830d,0xa5f57916),LL(0xd2123fca,0x6d4b8a6b),LL(0xf9c546f8,0x236ea68a),LL(0xfa608d36,0xc1d36873), LL(0x8d436d13,0xcd76e495),LL(0x8fb080af,0xd4d9c221),LL(0xe8ad3fb5,0x665c1728),LL(0xb3d572e0,0xcf1ebe4d),
+ LL(0x584c5e20,0xa7a8746a),LL(0xb9dc7035,0x267e4ea1),LL(0xb9548c9b,0x593a15cf),LL(0x4bd012f3,0x5e6e2135), LL(0x8c8f936e,0xdf31cc6a),LL(0xb5c241dc,0x8af84d04),LL(0x345efb86,0x63990a6f),LL(0xb9b962cb,0x6fef4e61),
+},
+/* digit=3 base_pwr=2^21 */
+{
+ LL(0x25722608,0xf6368f09),LL(0x131cf5c6,0x131260db),LL(0xfab4f7ac,0x40eb353b),LL(0x37eee829,0x85c78880), LL(0xc3bdf24e,0x4c1581ff),LL(0xf5c3c5a8,0x5bff75cb),LL(0xa14e6f40,0x35e8c83f),LL(0x0295e0ca,0xb81d1c0f),
+ LL(0xf43a730f,0xfcde7cc8),LL(0x33ab590e,0xe89b6f3c),LL(0xad03240b,0xc823f529),LL(0x98bea5db,0x82b79afe), LL(0x962fe5de,0x568f2856),LL(0x60c591f3,0x0c590adb),LL(0x4a28a858,0x1fc74a14),LL(0xb3203f4c,0x3b662498),
+ LL(0x6c39765a,0x91e3cf0d),LL(0xac3cca0b,0xa2db3acd),LL(0xcb953b50,0x288f2f08),LL(0xcf43cf1a,0x2414582c), LL(0x60eee9a8,0x8dec8bbc),LL(0x729aa042,0x54c79f02),LL(0x6532f5d5,0xd81cd5ec),LL(0xcf82e15f,0xa672303a),
+ LL(0x719c0563,0x376aafa8),LL(0xbc5fc79f,0xcd8ad2dc),LL(0xcb750cd3,0x303fdb9f),LL(0x4418b08e,0x14ff052f), LL(0x3e2d6520,0xf75084cf),LL(0x144ed509,0x7ebdf0f8),LL(0xd3f25b98,0xf43bf0f2),LL(0xa354d837,0x86ad71cf),
+ LL(0x26f43572,0xb827fe92),LL(0x5d824758,0xdfd3ab5b),LL(0x539094c1,0x315dd23a),LL(0x66623d68,0x85c0e37a), LL(0x7be19ae0,0x575c7972),LL(0xdf0d36b5,0x616a3396),LL(0x26b1ff7e,0xa1ebb3c8),LL(0x140ad453,0x635b9485),
+ LL(0xda430c0b,0x92bf3cda),LL(0x3a96dac6,0x4702850e),LL(0x15ac326a,0xc91cf0a5),LL(0xab8c25e4,0x95de4f49), LL(0xe265c17c,0xb01bad09),LL(0x087b3881,0x24e45464),LL(0xe1fac5ca,0xd43e583c),LL(0x6ead97a6,0xe17cb318),
+ LL(0x74dcec46,0x6cc39243),LL(0x54c2b73f,0x33cfc02d),LL(0xf26cd99c,0x82917844),LL(0xd1773f89,0x8819dd95), LL(0x0871f427,0x09572aa6),LL(0xf6f01c34,0x8e0cf365),LL(0xbff1f5af,0x7fa52988),LL(0xe75e8e50,0x4eb357ea),
+ LL(0x868af75d,0xd9d0c8c4),LL(0x45c8c7ea,0xd7325cff),LL(0xcc81ecb0,0xab471996),LL(0x611824ed,0xff5d55f3), LL(0x1977a0ee,0xbe314541),LL(0x722038c6,0x5085c4c5),LL(0xf94bb495,0x2d5335bf),LL(0xc8e2a082,0x894ad8a6),
+ LL(0xada35438,0x5c3e2341),LL(0x049b8c4e,0xf4a9fc89),LL(0x9f17cf34,0xbeeb355a),LL(0x6c91fe10,0x3f311e0e), LL(0x92ab9891,0xc2d20038),LL(0x3e8ce9a9,0x257bdcc1),LL(0x88c53bee,0x1b2d9789),LL(0xcdba143a,0x927ce89a),
+ LL(0x523db280,0xb0a32cca),LL(0x50d43783,0x5c889f8a),LL(0x4897d16f,0x503e04b3),LL(0x08f5f2e8,0x8cdb6e78), LL(0x179c8e74,0x6ab91cf0),LL(0x48211d60,0xd8874e52),LL(0xea851200,0xf948d4d5),LL(0xe6f9840a,0x4076d41e),
+ LL(0x47b517ea,0xc20e263c),LL(0x30685e5e,0x79a448fd),LL(0xf90631a0,0xe55f6f78),LL(0xa79e6346,0x88a790b1), LL(0x80969fe8,0x62160c7d),LL(0x41491bb9,0x54f92fd4),LL(0x5c957526,0xa6645c23),LL(0xbea3ce7b,0xf44cc5ae),
+ LL(0x8b1e68b7,0xf7628327),LL(0x303f29d3,0xc731ad7a),LL(0x57d03ecb,0xfe5a9ca9),LL(0x41bc97a7,0x96c0d50c), LL(0x9b4f7f24,0xc4669fe7),LL(0x3d9967ef,0xfdd781d8),LL(0x5d2c208d,0x7892c7c3),LL(0xae545cb3,0x8bf64f7c),
+ LL(0x467be912,0xc01f862c),LL(0xc73d30cc,0xf4c85ee9),LL(0x6ab83ec7,0x1fa6f4be),LL(0x4e3e3cf9,0xa07a3c1c), LL(0x0c00beb3,0x87f8ef45),LL(0x000d4c3e,0x30e2c2b3),LL(0xfe08bf5b,0x1aa00b94),LL(0x9224ef52,0x32c133aa),
+ LL(0x32e5685d,0x38df16bb),LL(0x58e6f544,0x68a9e069),LL(0xcdc5ebc6,0x495aaff7),LL(0x378b135f,0xf894a645), LL(0x09e27ecf,0xf316350a),LL(0x58f7179d,0xeced201e),LL(0xe97861ba,0x2eec273c),LL(0xd693be2e,0x47ec2cae),
+ LL(0xf68367ce,0xfa4c97c4),LL(0xbe5a5755,0xe4f47d0b),LL(0xb298a979,0x17de815d),LL(0xc177dc7d,0xd7eca659), LL(0x49ded0a3,0x20fdbb71),LL(0xfb34d3c5,0x4cb2aad4),LL(0x60858a33,0x2cf31d28),LL(0xa24aa40f,0x3b6873ef),
+ LL(0x2c11bb37,0x540234b2),LL(0xed4c74a3,0x2d0366dd),LL(0xeec5f25d,0xf9a968da),LL(0x67b63142,0x36601068), LL(0x68d7b6d4,0x07cd6d2c),LL(0x0c842942,0xa8f74f09),LL(0x7768b1ee,0xe2751404),LL(0xfe62aee4,0x4b5f7e89),
+ LL(0x89070d26,0xc6a77177),LL(0xdd1c8bc7,0xa1f28e4e),LL(0x469e1f17,0xea5f4f06),LL(0xfbdb78e0,0x78fc242a), LL(0x8b0588f1,0xc9c7c592),LL(0x1535921e,0xb6b7a0fd),LL(0xbde5ae35,0xcc5bdb91),LL(0x12ff1864,0xb42c485e),
+ LL(0xdbab98aa,0xa1113e13),LL(0xa17b1024,0xde9d469b),LL(0xc0462d3a,0x23f48b37),LL(0x7c5c078d,0x3752e537), LL(0x15544eb9,0xe3a86add),LL(0x80fba279,0xf013aea7),LL(0xf22001b5,0x8b5bb76c),LL(0xf02891ab,0xe617ba14),
+ LL(0x936219d3,0xd39182a6),LL(0xae51cb19,0x5ce1f194),LL(0xbf07a74c,0xc78f8598),LL(0x22cbf1bc,0x6d7158f2), LL(0xe300ce18,0x3b846b21),LL(0x2d11275d,0x35fba630),LL(0xa0239b9b,0x5fe25c36),LL(0xdf05d940,0xd8beb35d),
+ LL(0x1f7e320d,0x4db02bb0),LL(0x6da320ea,0x0641c364),LL(0x821389a3,0x6d95fa5d),LL(0x8fcd8e3d,0x92699748), LL(0xceb6c143,0x316fef17),LL(0xd933762b,0x67fcb841),LL(0x118b17f8,0xbb837e35),LL(0x9fd24821,0x4b92552f),
+ LL(0x46aca793,0xae6bc70e),LL(0xe579311b,0x1cf0b0e4),LL(0x5802f716,0x8dc631be),LL(0xbddbee4d,0x099bdc6f), LL(0x0caf8b05,0xcc352bb2),LL(0x72d63df2,0xf74d505a),LL(0x91c4f408,0xb9876d4b),LL(0x9e229b2d,0x1ce18473),
+ LL(0x83abdb4a,0x49507597),LL(0xdee84b18,0x850fbcb6),LL(0x609e67dc,0x6325236e),LL(0x9336c6d8,0x04d831d9), LL(0xfa12d45d,0x8deaae3b),LL(0x4746e246,0xe425f8ce),LL(0x24f5f31e,0x8004c175),LL(0xad62c3b7,0xaca16d8f),
+ LL(0x9152f934,0x0dc15a6a),LL(0xed0e12c1,0xf1235e5d),LL(0xda477dac,0xc33c06ec),LL(0xb2ea0006,0x76be8732), LL(0x0c0cd313,0xcf3f7831),LL(0xa614260d,0x3c524553),LL(0xcab22d15,0x31a756f8),LL(0x77827a20,0x03ee10d1),
+ LL(0x1994ef20,0xd1e059b2),LL(0x638ae318,0x2a653b69),LL(0x2f699010,0x70d5eb58),LL(0x09f5f84a,0x279739f7), LL(0x8b799336,0x5da4663c),LL(0x203c37eb,0xfdfdf14d),LL(0xa1dbfb2d,0x32d8a9dc),LL(0x77d48f9b,0xab40cff0),
+ LL(0xd20b42d5,0xc018b383),LL(0x9f78845f,0xf9a810ef),LL(0xbdba9df0,0x40af3753),LL(0x131dfdf9,0xb90bdcfc), LL(0xf01ab782,0x18720591),LL(0x6af12a88,0xc823f211),LL(0x0dc14401,0xa51b80f3),LL(0xfb2dfbe3,0xde248f77),
+ LL(0x0cafe751,0xef5a44e5),LL(0xd4dcd221,0x73997c9c),LL(0xde854024,0x32fd86d1),LL(0xa09b84bb,0xd5b53adc), LL(0xdcedd8d1,0x008d7a11),LL(0x74b32c84,0x406bd1c8),LL(0x05dde8b1,0x5d4472ff),LL(0xfce2b32f,0x2e25f2cd),
+ LL(0x29dfc254,0xbec0dd5e),LL(0x2b98b267,0x4455fcf6),LL(0xc72df2ad,0x0b4d43a5),LL(0x48a75397,0xea70e6be), LL(0x5820f3bf,0x2aad6169),LL(0x9e37f68f,0xf410d2dd),LL(0x7be5ac83,0x70fb7dba),LL(0x36ec3eec,0x636bb645),
+ LL(0x9754e21c,0x27104ea3),LL(0x8d63c373,0xbc87a3e6),LL(0x4109db9a,0x483351d7),LL(0x60134da7,0x0fa724e3), LL(0xb0720b16,0x9ff44c29),LL(0x06aceead,0x2dd0cf13),LL(0xe26929a6,0x5942758c),LL(0xb766a92b,0x96c5db92),
+ LL(0x5f18395e,0xcec7d4c0),LL(0x1f80d032,0xd3f22744),LL(0xcb86075b,0x7a68b37a),LL(0xafef92db,0x074764dd), LL(0x7bc7f389,0xded1e950),LL(0xb9756460,0xc580c850),LL(0x7da48157,0xaeeec2a4),LL(0x82c587b3,0x3f0b4e7f),
+ LL(0xa9f19c53,0x231c6de8),LL(0x6974e34e,0x5717bd73),LL(0xf1508fa9,0xd9e1d216),LL(0xdadaa124,0x9f112361), LL(0x823b7348,0x80145e31),LL(0xac634069,0x4dd8f0d5),LL(0x2297c258,0xe3d82fc7),LL(0x9cee7431,0x276fcfee),
+ LL(0x2bc0aea9,0x8eb61b5e),LL(0xde329431,0x4f668fd5),LL(0x38e4b87e,0x03a32ab1),LL(0x73d0ef0b,0xe1374517), LL(0x853ac983,0x1a46f7e6),LL(0x68e78a57,0xc3bdf42e),LL(0x2ea96dd1,0xacf20785),LL(0xf1638460,0xa10649b9),
+ LL(0x879fbbed,0xf2369f0b),LL(0xda9d1869,0x0ff0ae86),LL(0x56766f45,0x5251d759),LL(0x2be8d0fc,0x4984d8c0), LL(0xd21008f0,0x7ecc95a6),LL(0x3a1a1c49,0x29bd54a0),LL(0xd26c50f3,0xab9828c5),LL(0x51d0d251,0x32c0087c),
+ LL(0x0c1cdb26,0x9bac3ce6),LL(0x557ca205,0xcd94d947),LL(0x9db1fdcd,0x1b1bd598),LL(0xa3d8b149,0x0eda0108), LL(0x56152fcc,0x95066610),LL(0xe7192b33,0xc2f037e6),LL(0xc92e05a4,0xdeffb41a),LL(0xc2f6c62e,0x1105f6c2),
+ LL(0x8733913c,0x68e73500),LL(0x3f3adc40,0xcce86163),LL(0x38a278e9,0xf407a942),LL(0x2ab21292,0xd13c1b9d), LL(0x1c74cf5c,0x93ed7ec7),LL(0xf1a4c1b4,0x8887dc48),LL(0x4b3a11f1,0x3830ff30),LL(0x58937cb6,0x358c5a3c),
+ LL(0x89022829,0x027dc404),LL(0x3b798f79,0x40e93977),LL(0x38be6ead,0x90ad3337),LL(0xf34c0a5d,0x9c23f6bc), LL(0xfbffd8bb,0xd1711a35),LL(0x1949d3dd,0x60fcfb49),LL(0x7825d93a,0x09c8ef4b),LL(0xa0a8c968,0x24233cff),
+ LL(0xe6d982af,0x67ade46c),LL(0xe7544d7c,0xebb6bf3e),LL(0x3d8bd087,0xd6b9ba76),LL(0x4dc61280,0x46fe382d), LL(0xb5bdbd75,0xbd39a7e8),LL(0xb8f228fe,0xab381331),LL(0xce1c4300,0x0709a77c),LL(0xf337ceac,0x6a247e56),
+ LL(0x636288be,0x8f34f21b),LL(0xc8a7c305,0x9dfdca74),LL(0xea919e04,0x6decfd1b),LL(0x8e1991f8,0xcdf2688d), LL(0xd0f8a67e,0xe607df44),LL(0x0b58d010,0xd985df4b),LL(0x0c24f8f4,0x57f834c5),LL(0xa0bf01ae,0xe976ef56),
+ LL(0xa1c32373,0x536395ac),LL(0x734c0a13,0x351027aa),LL(0x5e6bd5bc,0xd2f1b5d6),LL(0x223debed,0x2b539e24), LL(0x0eaa1d71,0xd4994cec),LL(0x661dcf65,0x2a83381d),LL(0x7b54c740,0x5f1aed2f),LL(0xd6dda5ee,0x0bea3fa5),
+ LL(0x36cc6134,0x9d4fb684),LL(0xc0a443dd,0x8eb9bbf3),LL(0x383b7d2a,0xfc500e2e),LL(0x5b775257,0x7aad621c), LL(0x0a8f7cc0,0x69284d74),LL(0x07562d65,0xe820c2ce),LL(0x499758ee,0xbf9531b9),LL(0x6ee0cc2d,0x73e95ca5),
+ LL(0xfbaf50a5,0xf61790ab),LL(0x684e0750,0xdf55e76b),LL(0xf176b005,0xec516da7),LL(0x7a2dddc7,0x575553bb), LL(0x553afa73,0x37c87ca3),LL(0x4d55c251,0x315f3ffc),LL(0xaf3e5d35,0xe846442a),LL(0x6495ff28,0x61b91149),
+ LL(0xfa326dc3,0x23cc95d3),LL(0x18fc2cea,0x1df4da1f),LL(0xd0a37d59,0x24bf9adc),LL(0x320d6e1e,0xb6710053), LL(0x618344d1,0x96f9667e),LL(0xa06445af,0xcc7ce042),LL(0xd68dbc3a,0xa02d8514),LL(0x280b5a5b,0x4ea109e4),
+ LL(0xb40961bf,0x5741a7ac),LL(0x6aa56bfa,0x4ada5937),LL(0x02b765d1,0x7feb9145),LL(0xe6ad1582,0x561e97be), LL(0xda3982f5,0xbbc4a5b6),LL(0xb546f468,0x0c2659ed),LL(0x59612d20,0xb8e7e6aa),LL(0xac19e8e0,0xd83dfe20),
+ LL(0xb835398c,0x8530c45f),LL(0xb38a41c2,0x6106a8bf),LL(0x35f5dcdb,0x21e8f9a6),LL(0xcae498ed,0x39707137), LL(0xd8249f00,0x70c23834),LL(0xab2537a0,0x9f14b58f),LL(0x5f61c0c2,0xd043c365),LL(0x09a194a7,0xdc5926d6),
+ LL(0x8e77738a,0xddec0339),LL(0xfba46426,0xd07a63ef),LL(0xee7f6e86,0x2e58e79c),LL(0xff32d241,0xe59b0459), LL(0x20fa0338,0xc5ec84e5),LL(0xeaff5ace,0x97939ac8),LL(0xb4a38313,0x0310a4e3),LL(0x8f9d9885,0x9115fba2),
+ LL(0x5fadf8c3,0x8dd710c2),LL(0xce19c0e2,0x66be38a2),LL(0x4cfe5022,0xd42a279c),LL(0x0e24e1b8,0x597bb530), LL(0xc153ca7f,0x3cde86b7),LL(0x707d63bd,0xa8d30fb3),LL(0xbd60d21e,0xac905f92),LL(0x7b9a54ab,0x98e7ffb6),
+ LL(0xe9726a30,0xd7147df8),LL(0xafce3533,0xb5e216ff),LL(0x2ff1ec40,0xb550b799),LL(0xa1e953fd,0x6b613b87), LL(0x792d5610,0x87b88dba),LL(0xa190fbe1,0x2ee1270a),LL(0x2ef581da,0x02f4e2dc),LL(0xeff82a95,0x016530e4),
+ LL(0x8fd6ee89,0xcbb93dfd),LL(0x46848fff,0x16d3d986),LL(0x1da47adf,0x600eff24),LL(0x0ad47a71,0x1b9754a0), LL(0x70c33b98,0x8f9266df),LL(0xdf34186e,0xaadc87ae),LL(0x4ad24132,0x0d2ce8e1),LL(0x19946eba,0x8a47cbfc),
+ LL(0x62b5f3af,0x47feeb66),LL(0x0abb3734,0xcefab561),LL(0x19f35cb1,0x449de60e),LL(0x157f0eb9,0x39f8db14), LL(0x3c61bfd6,0xffaecc5b),LL(0x41216703,0xa5a4d41d),LL(0x224e1cc2,0x7f8fabed),LL(0x871ad953,0x0d5a8186),
+ LL(0xd22da9a9,0xf10774f7),LL(0xcc8a9b0d,0x45b8a678),LL(0xbdc32cff,0xd9c2e722),LL(0x337202a5,0xbf71b5f5), LL(0x69fc4db9,0x95c57f2f),LL(0x765d01e1,0xb6dad34c),LL(0xcb904635,0x7e0bd13f),LL(0x763a588c,0x61751253),
+ LL(0x81af2c2d,0xd85c2997),LL(0x81b9d7da,0xc0f7d9c4),LL(0x08533e8d,0x838a34ae),LL(0x311d8311,0x15c4cb08), LL(0x8e121e14,0x97f83285),LL(0x85000a5f,0xeea7dc1e),LL(0x5d256274,0x0c6059b6),LL(0xb95075c0,0xec9beace),
+ LL(0x1df97828,0x173daad7),LL(0xa8937877,0xbf851cb5),LL(0x01646f3c,0xb083c594),LL(0x50c6d352,0x3bad30cf), LL(0x496bbcea,0xfeb2b202),LL(0x18a1e8ba,0x3cf9fd4f),LL(0x1c066029,0xd26de7ff),LL(0x4e9ed4f8,0x39c81e9e),
+ LL(0x7b390d35,0xd8be0cb9),LL(0x964aab27,0x01df2bbd),LL(0xc3ef64f8,0x3e8c1a65),LL(0x716ed1dd,0x567291d1), LL(0x5f5406d3,0x95499c6c),LL(0x5ba8e23f,0x71fdda39),LL(0xd5096ece,0xcfeb320e),LL(0xca66dd16,0xbe7ba92b),
+ LL(0xc6fb5a7d,0x4608d36b),LL(0x6d2dd0e0,0xe3eea15a),LL(0x8f97a36a,0x75b0a3eb),LL(0x1c83de1e,0xf59814cc), LL(0x1c33c23f,0x56c9c5b0),LL(0x6faa4136,0xa96c1da4),LL(0xde316551,0x46bf2074),LL(0x1f756c8f,0x3b866e7b),
+ LL(0x1495ed6b,0x727727d8),LL(0xb682dce7,0xb2394243),LL(0x758610f3,0x8ab8454e),LL(0x857d72a4,0xc243ce84), LL(0xdbbf370f,0x7b320d71),LL(0x78e0f7ca,0xff9afa37),LL(0xea7b523f,0x0119d1e0),LL(0x058c7d42,0xb997f8cb),
+ LL(0x37bbb184,0x285bcd2a),LL(0xa45d1fa6,0x51dcec49),LL(0xe29634cb,0x6ade3b64),LL(0x26b86ef1,0x080c94a7), LL(0x2283fbe3,0xba583db1),LL(0x5a9315ed,0x902bddc8),LL(0x86964bec,0x07c1ccb3),LL(0xb6258301,0x78f4eacf),
+ LL(0x56f90823,0x4bdf3a49),LL(0x741d777b,0xba0f5080),LL(0xf38bf760,0x091d71c3),LL(0x9b625b02,0x9633d50f), LL(0xb8c9de61,0x03ecb743),LL(0x5de74720,0xb4751254),LL(0x74ce1cb2,0x9f9defc9),LL(0x00bd32ef,0x774a4f6a),
+ LL(0x73848f22,0xaca385f7),LL(0xf3f8558e,0x53dad716),LL(0x93c471f9,0xab7b34b0),LL(0x19644bc7,0xf530e069), LL(0xdd59d31a,0x3d9fb1ff),LL(0x08daa795,0x4382e0df),LL(0xd5cc88d7,0x165c6f4b),LL(0x4a18c900,0xeaa392d5),
+ LL(0x648024ee,0x94203c67),LL(0x8c2fabcd,0x188763f2),LL(0xbbaec835,0xa80f87ac),LL(0xf29d8d54,0x632c96e0), LL(0x4c00a95e,0x29b0a60e),LL(0xe011e9fa,0x2ef17f40),LL(0x15b77223,0xf6c0e1d1),LL(0x14b04e32,0xaaec2c62),
+ LL(0x3d84e58c,0xd35688d8),LL(0x958571db,0x2af5094c),LL(0x760682a6,0x4fff7e19),LL(0xe39a407c,0x4cb27077), LL(0x4ff0e321,0x0f59c547),LL(0x1b34c8ff,0x169f34a6),LL(0x52bc1ba7,0x2bff1096),LL(0x83583544,0xa25423b7),
+ LL(0x0ac8b782,0x5d55d5d5),LL(0x2db3c892,0xff6622ec),LL(0x6b8bb642,0x48fce741),LL(0x69d7e3dc,0x31d6998c), LL(0xcadcaed0,0xdbaf8004),LL(0xd81d053c,0x801b0142),LL(0x59630ec6,0x94b189fc),LL(0xaf762c8e,0x120e9934),
+ LL(0xfdc6a404,0x53a29aa4),LL(0xa1909948,0x19d8e01e),LL(0xd7e89681,0x3cfcabf1),LL(0x4e132d37,0x3321a50d), LL(0xe9a86111,0xd0496863),LL(0x06a3bc65,0x8c0cde61),LL(0xfc9f8eef,0xaf866c49),LL(0xff7f5141,0x2066350e),
+ LL(0xe56ddfbd,0x4f8a4689),LL(0xfe32983a,0xea1b0c07),LL(0x873cb8cb,0x2b317462),LL(0x2d93229f,0x658deddc), LL(0x0f64ef58,0x65efaf4d),LL(0x730cc7a8,0xfe43287d),LL(0x3d047d70,0xaebc0c72),LL(0xd92d26c9,0x92efa539),
+ LL(0x94b56526,0x06e78457),LL(0x0961002d,0x415cb80f),LL(0x76dcb10f,0x89e5c565),LL(0xff9259fe,0x8bbb6982), LL(0x9abc2668,0x4fe8795b),LL(0x1e678fb1,0xb5d4f534),LL(0x7b7da2b9,0x6601f3be),LL(0xa13d6805,0x98da59e2),
+ LL(0x01799a52,0x190d8ea6),LL(0xb86d2952,0xa20cec41),LL(0x7fff2a7c,0x3062ffb2),LL(0x79f19d37,0x741b32e5), LL(0x4eb57d47,0xf80d8181),LL(0x16aef06b,0x7a2d0ed4),LL(0x1cecb588,0x09735fb0),LL(0xc6061f5b,0x1641caaa),
+},
+/* digit=4 base_pwr=2^28 */
+{
+ LL(0x20151427,0x7f99824f),LL(0x92430206,0x206828b6),LL(0xe1112357,0xaa9097d7),LL(0x09e414ec,0xacf9a2f2), LL(0x27915356,0xdbdac9da),LL(0x001efee3,0x7e0734b7),LL(0xd2b288e2,0x54fab5bb),LL(0xf62dd09c,0x4c630fc4),
+ LL(0x1ac2703b,0x8537107a),LL(0x6bc857b5,0xb49258d8),LL(0xbcdaccd1,0x57df14de),LL(0xc4ae8529,0x24ab68d7), LL(0x734e59d0,0x7ed8b5d4),LL(0xc495cc80,0x5f8740c8),LL(0x291db9b3,0x84aedd5a),LL(0x4fb995be,0x80b360f8),
+ LL(0x5fa067d1,0xae915f5d),LL(0x9668960c,0x4134b57f),LL(0xa48edaac,0xbd3656d6),LL(0xfc1d7436,0xdac1e3e4), LL(0xd81fbb26,0x674ff869),LL(0xb26c33d4,0x449ed3ec),LL(0xd94203e8,0x85138705),LL(0xbeeb6f4a,0xccde538b),
+ LL(0xa61a76fa,0x55d5c68d),LL(0xca1554dc,0x598b441d),LL(0x773b279c,0xd39923b9),LL(0x36bf9efc,0x33331d3c), LL(0x298de399,0x2d4c848e),LL(0xa1a27f56,0xcfdb8e77),LL(0x57b8ab70,0x94c855ea),LL(0x6f7879ba,0xdcdb9dae),
+ LL(0x019f2a59,0x7bdff8c2),LL(0xcb4fbc74,0xb3ce5bb3),LL(0x8a9173dd,0xea907f68),LL(0x95a75439,0x6cd3d0d3), LL(0xefed021c,0x92ecc4d6),LL(0x6a77339a,0x09a9f9b0),LL(0x7188c64a,0x87ca6b15),LL(0x44899158,0x10c29968),
+ LL(0xed6e82ef,0x5859a229),LL(0x65ebaf4e,0x16f338e3),LL(0x5ead67ae,0x0cd31387),LL(0x54ef0bb4,0x1c73d228), LL(0x74a5c8c7,0x4cb55131),LL(0x7f69ad6a,0x01cd2970),LL(0xe966f87e,0xa04d00dd),LL(0x0b7b0321,0xd96fe447),
+ LL(0x88fbd381,0x342ac06e),LL(0x5c35a493,0x02cd4a84),LL(0x54f1bbcd,0xe8fa89de),LL(0x2575ed4c,0x341d6367), LL(0xd238202b,0xebe357fb),LL(0xa984ead9,0x600b4d1a),LL(0x52436ea0,0xc35c9f44),LL(0xa370751b,0x96fe0a39),
+ LL(0x7f636a38,0x4c4f0736),LL(0x0e76d5cb,0x9f943fb7),LL(0xa8b68b8b,0xb03510ba),LL(0x9ed07a1f,0xc246780a), LL(0x6d549fc2,0x3c051415),LL(0x607781ca,0xc2953f31),LL(0xd8d95413,0x955e2c69),LL(0x7bd282e3,0xb300fadc),
+ LL(0x87e9189f,0x81fe7b50),LL(0xf42dda27,0xdb17375c),LL(0xcf0a5904,0x22f7d896),LL(0xebe348e6,0xa0e57c5a), LL(0xf40e3c80,0xa61011d3),LL(0x8db705c5,0xb1189321),LL(0x50fedec3,0x4ed9309e),LL(0x4d6d5c1d,0xdcf14a10),
+ LL(0x55691342,0x056c265b),LL(0x91049dc7,0xe8e08504),LL(0xc9bae20a,0x131329f5),LL(0xd9dccdb4,0x96c8b3e8), LL(0xfb4ee6b4,0x8c5ff838),LL(0x41e8ccf0,0xfc5a9aeb),LL(0xfae050c6,0x7417b764),LL(0x00452080,0x0953c3d7),
+ LL(0x38dfe7e8,0x21372682),LL(0x2bb79d4b,0xea417e15),LL(0x76e7cf2d,0x59641f1c),LL(0xea0bcfcc,0x271e3059), LL(0x7253ecbd,0x624c7dfd),LL(0x4fca6186,0x2f552e25),LL(0x4d866e9c,0xcbf84ecd),LL(0xf68d4610,0x73967709),
+ LL(0xc27901b4,0xa14b1163),LL(0x899b8bf3,0xfd9236e0),LL(0xcbc6da0a,0x42b091ec),LL(0x5ad1d297,0xbb1dac6f), LL(0xa91cf76e,0x80e61d53),LL(0xd31f1ee7,0x4110a412),LL(0x13efcf77,0x2d87c3ba),LL(0xdf450d76,0x1f374bb4),
+ LL(0x0d188dab,0x5e78e2f2),LL(0xf4b885ef,0xe3968ed0),LL(0x7314570f,0x46c0568e),LL(0x01170521,0x31616338), LL(0x4f0c8afe,0x18e1e7e2),LL(0xdeea78da,0x4caa75ff),LL(0x7c5d8a51,0x82db67f2),LL(0x6f505370,0x36a44d86),
+ LL(0x0333974f,0xd72c5bda),LL(0x27a70146,0x5db516ae),LL(0x210ef921,0x34705281),LL(0x0c9c38e5,0xbff17a8f), LL(0x12476da1,0x78f4814e),LL(0x33c16980,0xc1e16613),LL(0x424d4bca,0x9e5b386f),LL(0xc85740de,0x4c274e87),
+ LL(0x6c2f5226,0xb6a9b88d),LL(0x550d7ca8,0x14d1b944),LL(0x1fc41709,0x580c85fc),LL(0x54c6d519,0xc1da368b), LL(0xd5113cf7,0x2b0785ce),LL(0x5a34708f,0x0670f633),LL(0x15cc3f88,0x46e23767),LL(0x50c72c8f,0x1b480cfa),
+ LL(0x4147519a,0x20288602),LL(0x26b372f0,0xd0981eac),LL(0xa785ebc8,0xa9d4a7ca),LL(0xdbdf58e9,0xd953c50d), LL(0xfd590f8f,0x9d6361cc),LL(0x44e6c917,0x72e9626b),LL(0x22eb64cf,0x7fd96110),LL(0x9eb288f3,0x863ebb7e),
+ LL(0x6aca8ee7,0x6e6ab761),LL(0xd7b40358,0x97d10b39),LL(0x1e5feb0d,0x1687d377),LL(0x8265a27a,0xc83e50e4), LL(0xc954b313,0x8f75a9fe),LL(0x310d1f61,0xcc2e8f47),LL(0x6557d0e0,0xf5ba81c5),LL(0x3eaf6207,0x25f9680c),
+ LL(0x4354080b,0xf95c6609),LL(0x7bf2fe1c,0x5225bfa5),LL(0x5c7d98fa,0xc5c004e2),LL(0x019aaf60,0x3561bf1c), LL(0xba151474,0x5e6f9f17),LL(0xb04f6eca,0xdec2f934),LL(0x269acb1e,0x64e368a1),LL(0x0cdda493,0x1332d9e4),
+ LL(0xdf23de05,0x60d6cf69),LL(0x009339a0,0x66d17da2),LL(0x0a693923,0x9fcac985),LL(0xed7c6a6d,0xbcf057fc), LL(0xf0b5662c,0xc3c5c8c5),LL(0xdcba4f24,0x25318dd8),LL(0x082b69ff,0x60e8cb75),LL(0x1e728c01,0x7c23b3ee),
+ LL(0x097e4403,0x15e10a0a),LL(0x19854665,0xcb3d0a86),LL(0xd67d4826,0x88d8e211),LL(0x0b9d2839,0xb39af66e), LL(0xbd475ca8,0xa5f94588),LL(0xc077b80b,0xe06b7966),LL(0xda27c26c,0xfedb1485),LL(0xfe0fd5e0,0xd290d33a),
+ LL(0xf34fb0fa,0xa40bcc47),LL(0x1fb1ab09,0xb4760cc8),LL(0xa273bfe3,0x8fca0993),LL(0xf70b213c,0x13e4fe07), LL(0xfdb05163,0x3bcdb992),LL(0x0c2b19b6,0x8c484b11),LL(0xaaf2e3e2,0x1acb815f),LL(0xb89ff1b4,0xc6905935),
+ LL(0x586e74e1,0xb2ad6f9d),LL(0x67b80484,0x488883ad),LL(0x369c3ddb,0x758aa2c7),LL(0x9f9afd31,0x8ab74e69), LL(0x5e21beb1,0x10fc2d28),LL(0x318c42f9,0x3484518a),LL(0x53cf40c3,0x377427dc),LL(0x391bc1d9,0x9de0781a),
+ LL(0x693807e1,0x8faee858),LL(0x4e81ccc7,0xa3865327),LL(0x6f835b84,0x02c30ff2),LL(0x0d3d38d4,0xb604437b), LL(0x5ca1823d,0xb3fc8a98),LL(0x03be0324,0xb82f7ec9),LL(0xcf684a33,0xee36d761),LL(0x9f29bf7d,0x5a01df0e),
+ LL(0x1306583d,0x686202f3),LL(0x437c622e,0x05b10da0),LL(0x076a7bc8,0xbf9aaa0f),LL(0x8f8f4e43,0x25e94efb), LL(0xfa3dc26d,0x8a35c9b7),LL(0x96ff03c5,0xe0e5fb93),LL(0xebc394ce,0xa77e3843),LL(0x8361de60,0xcede6595),
+ LL(0xa1993545,0xd27c22f6),LL(0x24d671ba,0xab01cc36),LL(0xa169c28e,0x63fa2877),LL(0x2eb08376,0x925ef904), LL(0x53aa0b32,0x3b2fa3cf),LL(0x71c49d7a,0xb27beb5b),LL(0xd105e27f,0xb60e1834),LL(0x4f68570d,0xd6089788),
+ LL(0xd6fbc2ac,0x23094ce0),LL(0x815ff551,0x738037a1),LL(0x6bef119c,0xda73b1bb),LL(0xeef506ba,0xdcf6c430), LL(0xe3ef104a,0x00e4fe7b),LL(0x0a065628,0xebdd9a2c),LL(0x8792043e,0x853a81c3),LL(0xb3b59108,0x22ad6ece),
+ LL(0x39cd297d,0x9fb813c0),LL(0x05bda5d9,0x8ec7e16e),LL(0x0d104b96,0x2834797c),LL(0x7c511510,0xcc11a2e7), LL(0x96ee6380,0x96ca5a53),LL(0xcea38742,0x054c8655),LL(0xd54dfa7d,0xb5946852),LL(0x1f4ab207,0x97c422e7),
+ LL(0x0c22b540,0xbf907509),LL(0xb7c267d4,0x2cde42aa),LL(0x5ab0d693,0xba18f9ed),LL(0x6e4660d9,0x3ba62aa6), LL(0xab9ea96a,0xb24bf97b),LL(0xe3b60e32,0x5d039642),LL(0x7c4d9bd5,0x4e6a4506),LL(0x7ed4a6a4,0x666c5b9e),
+ LL(0x8edbd7cc,0xfa3fdcd9),LL(0xc6ccd753,0x4660bb87),LL(0x21e6b64f,0x9ae90820),LL(0xb36bfb3f,0x8a56a713), LL(0x5726d47f,0xabfce096),LL(0x0b1a9a7f,0x9eed01b2),LL(0x4eb74a37,0x30e9cad4),LL(0x53e9666d,0x7b2524cc),
+ LL(0x8f4b002f,0x6a29683b),LL(0x41f4fc20,0xc2200d7a),LL(0x3a338acc,0xcf3af47a),LL(0xe7128975,0x6539a4fb), LL(0xc33c7fcf,0xcec31c14),LL(0xc7be322b,0x7eb6799b),LL(0x6646f623,0x119ef4e9),LL(0x54d7299b,0x7b7a26a5),
+ LL(0x403f46f2,0xcb37f08d),LL(0x1a0ec0c7,0x94b8fc43),LL(0xc332142f,0xbb8514e3),LL(0xe80d2a7a,0xf3ed2c33), LL(0xb639126c,0x8d2080af),LL(0xe3553ade,0xf7b6be60),LL(0x1c7e2b09,0x3950aa9f),LL(0x6410f02b,0x847ff958),
+ LL(0x678a31b0,0x877b7cf5),LL(0x3998b620,0xd50301ae),LL(0xc00fb396,0x734257c5),LL(0x04e672a6,0xf9fb18a0), LL(0xe8758851,0xff8bd8eb),LL(0x5d99ba44,0x1e64e4c6),LL(0x7dfd93b7,0x4b8eaedf),LL(0x04e76b8c,0xba2f2a98),
+ LL(0xe8053433,0x7d790cba),LL(0x3d2c9585,0xc8e725a0),LL(0xcdd8f5ed,0x58c5c476),LL(0xefa9fe1d,0xd106b952), LL(0x0eff13a9,0x3c5c775b),LL(0xe057b930,0x242442ba),LL(0xc9b70cbd,0xe9f458d4),LL(0xa3cdb89a,0x69b71448),
+ LL(0x0e2ed742,0x41ee46f6),LL(0x40067493,0x573f1045),LL(0x9d54c304,0xb1e154ff),LL(0x8d3a7502,0x2ad0436a), LL(0x431a8121,0xee4aaa2d),LL(0x886f11ed,0xcd38b3ab),LL(0x034a0eb7,0x57d49ea6),LL(0xf7e85e58,0xd2b773bd),
+ LL(0x9b5c1f14,0x4a559ac4),LL(0x3e54df2b,0xc444be1a),LL(0xeda41891,0x13aad704),LL(0x5eb5c788,0xcd927bec), LL(0xe48c8a34,0xeb3c8516),LL(0x4b546669,0x1b7ac812),LL(0x594df8ec,0x1815f896),LL(0x79227865,0x87c6a79c),
+ LL(0x9b56ddbd,0xae02a2f0),LL(0x8a2f1cf3,0x1339b5ac),LL(0x839dff0d,0xf2b569c7),LL(0xfee9a43d,0xb0b9e864), LL(0x77bb064e,0x4ff8ca41),LL(0xfd249f63,0x145a2812),LL(0xf86f689a,0x3ab7beac),LL(0x01d35f5e,0x9bafec27),
+ LL(0x4265aa91,0x28054c65),LL(0x035efe42,0xa4b18304),LL(0x9639dec7,0x6887b0e6),LL(0x3d52aea5,0xf4b8f6ad), LL(0x971a8a13,0xfb9293cc),LL(0x4c934d07,0x3f159e5d),LL(0x09acbc29,0x2c50e9b1),LL(0x7154d129,0x08eb65e6),
+ LL(0x30b75c3e,0x4feff589),LL(0x94491c93,0x0bb82fe2),LL(0x89af62bb,0xd8ac377a),LL(0x9685e49f,0xd7b51490), LL(0x04497f19,0xabca9a7b),LL(0x1a7ad13f,0x1b35ed0a),LL(0x3ec86ed6,0x6b601e21),LL(0xce0c76f1,0xda91fcb9),
+ LL(0xd7ab27e1,0x9e28507b),LL(0x63945b7b,0x7c19a555),LL(0xaafc9827,0x6b43f0a1),LL(0x3aa55b91,0x443b4fbd), LL(0x6962c88f,0x962b2e65),LL(0xce0db0ca,0x139da8d4),LL(0x1b8d6c4f,0xb93f05dd),LL(0x180b9824,0x779cdff7),
+ LL(0xae57c7b7,0xbba23fdd),LL(0x1b932522,0x345342f2),LL(0x556d4aa3,0xfd9c80fe),LL(0x6525bb61,0xa03907ba), LL(0xff218933,0x38b010e1),LL(0xaa52117b,0xc066b654),LL(0x94f2e6ea,0x8e141920),LL(0x0d32f2b2,0x66a27dca),
+ LL(0x048b3717,0x69c7f993),LL(0xb178ae1c,0xbf5a989a),LL(0x564f1d6b,0x49fa9058),LL(0xd31fde4e,0x27ec6e15), LL(0x7276e7fc,0x4cce0373),LL(0x89d6bf02,0x64086d79),LL(0x4ccdd979,0x5a72f046),LL(0x47775631,0x909c3566),
+ LL(0x75dd7125,0x1c07bc6b),LL(0x87a0428d,0xb4c6bc97),LL(0xfdeb6b9d,0x507ece52),LL(0xb2c95432,0xfca56512), LL(0xd0e8bd06,0x15d97181),LL(0xc6bb46ea,0x384dd317),LL(0x3952b624,0x5441ea20),LL(0x4e7dc2fb,0xbcf70dee),
+ LL(0x6628e8c3,0x372b016e),LL(0xb60a7522,0x07a0d667),LL(0x0a344ee2,0xcf05751b),LL(0x118bdeec,0x0ec09a48), LL(0xd83dce46,0x6e4b3d4e),LL(0x99d2fc6e,0x43a6316d),LL(0x56cf044c,0xa99d8989),LL(0xae3e5fb7,0x7c7f4454),
+ LL(0xfbabbe92,0xb2e6b121),LL(0xe1330076,0x281850fb),LL(0x97890015,0x093581ec),LL(0x75ff77f5,0x69b1dded), LL(0xab105105,0x7cf0b18f),LL(0xa89ccfef,0x953ced31),LL(0xeb914009,0x3151f85f),LL(0x88ed48ad,0x3c9f1b87),
+ LL(0x4a7eadcb,0xc9aba1a1),LL(0x522e71cf,0x928e7501),LL(0x3a2e4f83,0xeaede727),LL(0x1ce3bbd3,0x467e10d1), LL(0xb955dcf0,0xf3442ac3),LL(0xd3d5e527,0xba96307d),LL(0xfd77f474,0xf763a10e),LL(0x6a6e1ff0,0x5d744bd0),
+ LL(0xa777899e,0xd287282a),LL(0xd03f3cde,0xe20eda8f),LL(0x50b07d31,0x6a7e75bb),LL(0x6f379de4,0x0b7e2a94), LL(0x19f593cf,0x31cb64ad),LL(0x1e76ef1d,0x7b1a9e4f),LL(0xb62d609c,0xe18c9c9d),LL(0xe779a650,0x439bad6d),
+ LL(0xe032f144,0x219d9066),LL(0xe8b2ec6a,0x1db632b8),LL(0xfda12f78,0xff0d0fd4),LL(0x2a25d265,0x56fb4c2d), LL(0x255a03f1,0x5f4e2ee1),LL(0xe96af176,0x61cd6af2),LL(0xd068bc97,0xe0317ba8),LL(0x264b988e,0x927d6bab),
+ LL(0xe90fb21e,0xa18f07e0),LL(0xbba7fca1,0x00fd2b80),LL(0x95cd67b5,0x20387f27),LL(0xd39707f7,0x5b89a4e7), LL(0x894407ce,0x8f83ad3f),LL(0x6c226132,0xa0025b94),LL(0xf906c13b,0xc79563c7),LL(0x4e7bb025,0x5f548f31),
+ LL(0xeac6d113,0x2b4c6b8f),LL(0x0e813c76,0xa67e3f9c),LL(0x3fe1f4b9,0x3982717c),LL(0x26d8050e,0x58865819), LL(0xf7f06f20,0x99f3640c),LL(0x2a66ebc2,0xdc610216),LL(0x767a1e08,0x52f2c175),LL(0x5999871b,0x05660e1a),
+ LL(0x6d3c4693,0x6b0f1762),LL(0x37ed7bea,0xf0e7d627),LL(0xb75b226d,0xc51758c7),LL(0x1f91613b,0x40a88628), LL(0xbbb38ce0,0x889dbaa7),LL(0xbddcad81,0xe0404b65),LL(0x8bc9671f,0xfebccd3a),LL(0xee1f5375,0xfbf9a357),
+ LL(0x28f33398,0x5dc169b0),LL(0x72e90f65,0xb07ec11d),LL(0xfaab1eb1,0xae7f3b4a),LL(0x5f17538a,0xd970195e), LL(0x0181e640,0x52b05cbe),LL(0x2643313d,0xf5debd62),LL(0x5df31f82,0x76148154),LL(0x3a9e13c5,0x23e03b33),
+ LL(0x4fde0c1f,0xff758949),LL(0xe5b6ec20,0xbf8a1abe),LL(0x87e1db6c,0x702278fb),LL(0x35ed658f,0xc447ad7a), LL(0x03d0ccf2,0x48d4aa38),LL(0x819a7c03,0x80acb338),LL(0x6e17cecc,0x9bc7c89e),LL(0x03be1d82,0x46736b8b),
+ LL(0xc0432f96,0xd65d7b60),LL(0xdeb5442f,0xddebe7a3),LL(0x7dff69a2,0x79a25307),LL(0x02cf3122,0x37a56d94), LL(0xf2350d0a,0x8bab8aed),LL(0x037b0d9a,0x13c3f276),LL(0x44c65cae,0xc664957c),LL(0xc2e71a88,0x88b44089),
+ LL(0x5cb02664,0xdb88e5a3),LL(0x8686c72e,0x5d4c0bf1),LL(0xa682d53e,0xea3d9b62),LL(0x0b2ad431,0x9b605ef4), LL(0xc69645d0,0x71bac202),LL(0x6a1b66e7,0xa115f03a),LL(0x158f4dc4,0xfe2c563a),LL(0x4d12a78c,0xf715b3a0),
+ LL(0xd413213a,0x8f7f0a48),LL(0xc04becdb,0x2035806d),LL(0x5d8587f5,0xecd34a99),LL(0x9f6d3a71,0x4d8c3079), LL(0x8d95a8f6,0x1b2a2a67),LL(0xf2110d0d,0xc58c9d7d),LL(0xcf8fba3f,0xdeee81d5),LL(0x0c7cdf68,0xa42be3c0),
+ LL(0xd43b5eaa,0x2126f742),LL(0xdfa59b85,0x054a0766),LL(0x126bfd45,0x9d0d5e36),LL(0x384f8a8f,0xa1f8fbd7), LL(0xd563fccc,0x317680f5),LL(0xf280a928,0x48ca5055),LL(0x27b578cf,0xe00b81b2),LL(0x2994a514,0x10aad918),
+ LL(0xb7bdc953,0xd9e07b62),LL(0x5bc086dd,0x9f0f6ff2),LL(0x655eee77,0x09d1ccff),LL(0x5bef7df1,0x45475f79), LL(0x86f702cc,0x3faa28fa),LL(0x0f021f07,0x92e60905),LL(0x7f8fa8c6,0xe9e62968),LL(0xf036ea2c,0xbd71419a),
+ LL(0x6028da9a,0x171ee1cc),LL(0xc251f573,0x5352fe1a),LL(0x3fa997f4,0xf8ff236e),LL(0xa5749d5f,0xd831b6c9), LL(0xe350e2c2,0x7c872e1d),LL(0x1e0ce403,0xc56240d9),LL(0x6974f5cb,0xf9deb077),LL(0x961c3728,0x7d50ba87),
+ LL(0x5a3a2518,0xd6f89426),LL(0xc6303d43,0xcf817799),LL(0x619e5696,0x510a0471),LL(0x3a5e307b,0xab049ff6), LL(0xfeb13ec7,0xe4cdf9b0),LL(0x9d8ff90c,0xd5e97117),LL(0x9afa96af,0xf6f64d06),LL(0x9d2012a2,0x00d0bf5e),
+ LL(0x358bcdc0,0xe63f301f),LL(0x0a9d47f8,0x07689e99),LL(0x4f43d43a,0x1f689e2f),LL(0x90920904,0x4d542a16), LL(0x9ca0a707,0xaea293d5),LL(0x8ac68065,0xd061fe45),LL(0x0090008c,0x1033bf1b),LL(0xc08a6db6,0x29749558),
+ LL(0xc1d5d034,0x74b5fc59),LL(0x67e215e0,0xf712e9f6),LL(0x860200e6,0xfd520cbd),LL(0x3ea22588,0x0229acb4), LL(0xfff0c82e,0x9cd1e14c),LL(0x59c69e73,0x87684b62),LL(0x96ccb989,0xda85e61c),LL(0xa3d06493,0x2d5dbb02),
+ LL(0xe86b173c,0xf22ad33a),LL(0xa79ff0e3,0xe8e41ea5),LL(0xdd0d0c10,0x01d2d725),LL(0x032d28f9,0x31f39088), LL(0x7829839e,0x7b3f71e1),LL(0x4502ae58,0x0cf691b4),LL(0xbefc6115,0xef658dbd),LL(0xb3ab5314,0xa5cd6ee5),
+ LL(0x5f1d2347,0x206c8d7b),LL(0x4cc2253a,0x794645ba),LL(0x58389e08,0xd517d8ff),LL(0x9f847288,0x4fa20dee), LL(0xd797770a,0xeba072d8),LL(0xbf429e26,0x7360c91d),LL(0x80af8279,0x7200a3b3),LL(0x82dadce3,0x6a1c9150),
+ LL(0xc35d8794,0x0ee6d3a7),LL(0x0356bae5,0x042e6558),LL(0x643322fd,0x9f59698d),LL(0x50a61967,0x9379ae15), LL(0xfcc9981e,0x64b9ae62),LL(0x6d2934c6,0xaed3d631),LL(0x5e4e65eb,0x2454b302),LL(0xf9950428,0xab09f647),
+},
+/* digit=5 base_pwr=2^35 */
+{
+ LL(0x22248acc,0xb2083a12),LL(0x3264e366,0x1f6ec0ef),LL(0x5afdee28,0x5659b704),LL(0xe6430bb5,0x7a823a40), LL(0xe1900a79,0x24592a04),LL(0xc9ee6576,0xcde09d4a),LL(0x4b5ea54a,0x52b6463f),LL(0xd3ca65a7,0x1efe9ed3),
+ LL(0x305406dd,0xe27a6dbe),LL(0xdd5d1957,0x8eb7dc7f),LL(0x387d4d8f,0xf54a6876),LL(0xc7762de4,0x9c479409), LL(0x99b30778,0xbe4d5b5d),LL(0x6e793682,0x25380c56),LL(0xdac740e3,0x602d37f3),LL(0x1566e4ae,0x140deabe),
+ LL(0xafd32acf,0x4481d067),LL(0xe1f71ccf,0xd8f0fcca),LL(0xb596f2da,0xd208dd0c),LL(0x9aad93f9,0xd049d730), LL(0x42ab580e,0xc79f263d),LL(0x23f707b4,0x09411bb1),LL(0x835e0eda,0x8cfde1ff),LL(0x90f03402,0x72707490),
+ LL(0xc49a861e,0xeaee6126),LL(0xe14f0d06,0x024f3b65),LL(0xc69bfc17,0x51a3f1e8),LL(0xa7686381,0xc3c3a8e9), LL(0xb103d4c8,0x3400752c),LL(0x9218b36b,0x02bc4613),LL(0x7651504a,0xc67f75eb),LL(0xd02aebfa,0xd6848b56),
+ LL(0xc30fa92b,0xbd9802e6),LL(0x9a552784,0x5a70d96d),LL(0x3f83169b,0x9085c4ea),LL(0x06908228,0xfa9423bb), LL(0xfe97a5b9,0x2ffebe12),LL(0x71b99118,0x85da6049),LL(0x63178846,0x9cbc2f7f),LL(0x9153218e,0xfd96bc70),
+ LL(0x1782269b,0x958381db),LL(0x2597e550,0xae34bf79),LL(0x5f385153,0xbb5c6064),LL(0xe3088048,0x6f0e96af), LL(0x77884456,0xbf6a0215),LL(0x69310ea7,0xb3b5688c),LL(0x04fad2de,0x17c94295),LL(0x17896d4d,0xe020f0e5),
+ LL(0x0976505f,0x730ba0ab),LL(0x095e2ec5,0x567f6813),LL(0x6331ab71,0x47062010),LL(0x41d22b9f,0x72cfa977), LL(0x8a2373da,0x33e55ead),LL(0x7ba45a68,0xa8d0d5f4),LL(0x03029d15,0xba1d8f9c),LL(0xfc55b9f3,0x8f34f1cc),
+ LL(0xbbe5a1a9,0xcca4428d),LL(0x3126bd67,0x8187fd5f),LL(0x48105826,0x0036973a),LL(0xb8bd61a0,0xa39b6663), LL(0x2d65a808,0x6d42deef),LL(0x94636b19,0x4969044f),LL(0xdd5d564c,0xf611ee47),LL(0xd2873077,0x7b2f3a49),
+ LL(0x300eb294,0x94157d45),LL(0x169c1494,0x2b2a656e),LL(0xd3a47aa9,0xc000dd76),LL(0xa6243ea4,0xa2864e4f), LL(0xdb89842e,0x82716c47),LL(0x61479fb7,0x12dfd7d7),LL(0xe0b2f6dc,0x3b9a2c56),LL(0xd7f85d67,0x46be862a),
+ LL(0x0f82b214,0x03b0d8dd),LL(0xf103cbc6,0x460c34f9),LL(0x18d79e19,0xf32e5c03),LL(0xa84117f8,0x8b8888ba), LL(0xc0722677,0x8f3c37dc),LL(0x1c1c0f27,0x10d21be9),LL(0xe0f7a0c6,0xd47c8468),LL(0xadecc0e0,0x9bf02213),
+ LL(0x42b48b99,0x0baa7d12),LL(0x48424096,0x1bcb665d),LL(0xebfb5cfb,0x8b847cd6),LL(0x9ad4d10d,0x87c2ae56), LL(0x0de36726,0xf1cbb122),LL(0x3fdfbd21,0xe7043c68),LL(0x4e79d460,0x4bd0826a),LL(0x4bd1a2cb,0x11f5e598),
+ LL(0xb7fe7b6e,0x97554160),LL(0x400a3fb2,0x7d16189a),LL(0xe328ca1e,0xd73e9bea),LL(0xe793d8cc,0x0dd04b97), LL(0x506db8cc,0xa9c83c9b),LL(0xcf38814c,0x5cd47aae),LL(0xb64b45e6,0x26fc430d),LL(0xd818ea84,0x079b5499),
+ LL(0xc1c24a3b,0xebb01102),LL(0x1c161c1a,0xca24e568),LL(0x36f00a4a,0x103eea69),LL(0x76176c7b,0x9ad76ee8), LL(0x538e0ff7,0x97451fc2),LL(0x6604b3b0,0x94f89809),LL(0x3249cfd7,0x6311436e),LL(0x41224f69,0x27b4a7bd),
+ LL(0xe0ac2941,0x03b5d21a),LL(0xc2d31937,0x279b0254),LL(0xcac992d0,0x3307c052),LL(0xefa8b1f3,0x6aa7cb92), LL(0x0d37c7a5,0x5a182580),LL(0x342d5422,0x13380c37),LL(0xd5d2ef92,0x92ac2d66),LL(0x030c63c6,0x035a70c9),
+ LL(0x4ce4f152,0xc16025dd),LL(0xf9df7c06,0x1f419a71),LL(0x91e4bb14,0x6d5b2214),LL(0x839fb4ce,0xfc43c6cc), LL(0x925d6b2d,0x49f06591),LL(0x62186598,0x4b37d9d3),LL(0xd01b1629,0x8c54a971),LL(0x51d50e05,0xe1a9c29f),
+ LL(0x71ba1861,0x5109b785),LL(0xd0c8f93d,0x48b22d5c),LL(0x8633bb93,0xe8fa84a7),LL(0x5aebbd08,0x53fba6ba), LL(0xe5eea7d8,0x7ff27df3),LL(0x68ca7158,0x521c8796),LL(0xce6f1a05,0xb9d5133b),LL(0xfd0ebee4,0x2d50cd53),
+ LL(0xc5a3ef16,0xc82115d6),LL(0xba079221,0x993eff9d),LL(0x4b5da81c,0xe4da2c5e),LL(0x8033fd85,0x9a89dbdb), LL(0x2b892891,0x60819ebf),LL(0x5d14a4d5,0x53902b21),LL(0xd7fda421,0x6ac35051),LL(0x61c83284,0xcc6ab885),
+ LL(0xf74cff17,0x14eba133),LL(0xecb813f2,0x240aaa03),LL(0x6f665bee,0xcfbb6540),LL(0xa425ad73,0x084b1fe4), LL(0xd081f6a6,0x009d5d16),LL(0xeef82c90,0x35304fe8),LL(0xaa9eaa22,0xf20346d5),LL(0xac1c91e3,0x0ada9f07),
+ LL(0x968a6144,0xa6e21678),LL(0x07b31a1e,0x54c1f77c),LL(0x5781fbe1,0xd6bb787e),LL(0xe31f1c4a,0x61bd2ee0), LL(0x781105fc,0xf25aa1e9),LL(0x7b2f8e80,0x9cf2971f),LL(0xcdff919b,0x26d15412),LL(0x34bc896e,0x01db4ebe),
+ LL(0xb40df1cf,0x7d9b3e23),LL(0x94e971b4,0x59337373),LL(0x669cf921,0xbf57bd14),LL(0x0c1a1064,0x865daedf), LL(0x83279125,0x3eb70bd3),LL(0x34ecdaab,0xbc3d5b9f),LL(0x5f755caf,0x91e3ed7e),LL(0xd41e6f02,0x49699f54),
+ LL(0xd4a7a15b,0x185770e1),LL(0xeaac87e7,0x08f3587a),LL(0x473133ea,0x352018db),LL(0x04fd30fc,0x674ce719), LL(0x088b3e0e,0x7b8d9835),LL(0x5d0d47a1,0x7a0356a9),LL(0x6474a3c4,0x9d9e7659),LL(0xff66966c,0x61ea48a7),
+ LL(0x0f3e4834,0x30417758),LL(0x17a9afcb,0xfdbb21c2),LL(0x2f9a67b3,0x756fa17f),LL(0xa245c1a8,0x2a6b2421), LL(0x4af02291,0x64be2794),LL(0x2a5804fe,0xade465c6),LL(0xa6f08fd7,0x8dffbd39),LL(0xaa14403b,0xc4efa84c),
+ LL(0x442b0f5c,0xa1b91b2a),LL(0xcf997736,0xb748e317),LL(0xcee90e16,0x8d1b62bf),LL(0x0b2078c0,0x907ae271), LL(0x0c9bcddd,0xdf31534b),LL(0x39adce83,0x043fb054),LL(0xd826846a,0x99031043),LL(0xb144f393,0x61a9c0d6),
+ LL(0x47718427,0xdab48046),LL(0x6e830f8b,0xdf17ff9b),LL(0xe49a1347,0x408d7ee8),LL(0x91c1d4ae,0x6ac71e23), LL(0x1defd73c,0xc8cbb9fd),LL(0xbbbbfec5,0x19840657),LL(0x9e7ef8ea,0x39db1cb5),LL(0x64105f30,0x78aa8296),
+ LL(0xa3738c29,0xa3d9b7f0),LL(0xbc3250a3,0x0a2f235a),LL(0x445e4caf,0x55e506f6),LL(0x33475f7a,0x0974f73d), LL(0x5ba2f5a8,0xd37dbba3),LL(0x6af40066,0x542c6e63),LL(0xc5d73e2c,0x26d99b53),LL(0x6c3ca33e,0x06060d7d),
+ LL(0x065fef4a,0xcdbef1c2),LL(0xfd5b92e3,0x77e60f7d),LL(0x26708350,0xd7c549f0),LL(0x34f121bf,0x201b3ad0), LL(0x0334fc14,0x5fcac2a1),LL(0x344552f6,0x8a9a9e09),LL(0x97653082,0x7dd8a1d3),LL(0x79d4f289,0x5fc0738f),
+ LL(0x17d2d8c3,0x787d244d),LL(0x70830684,0xeffc6345),LL(0xe4f73ae5,0x5ddb96dd),LL(0x172549a5,0x8efb14b1), LL(0x2245ae7a,0x6eb73eee),LL(0xea11f13e,0xbca4061e),LL(0x30b01f5d,0xb577421d),LL(0x782e152c,0xaa688b24),
+ LL(0xbd3502ba,0x67608e71),LL(0xb4de75a0,0x4ef41f24),LL(0xfd6125e5,0xb08dde5e),LL(0xa409543f,0xde484825), LL(0x65cc2295,0x1f198d98),LL(0x6e0edfa2,0x428a3771),LL(0xadf35fc7,0x4f9697a2),LL(0xf7cac3c7,0x01a43c79),
+ LL(0x0fd3659a,0xb05d7059),LL(0xbb7f2d9a,0x8927f30c),LL(0x8cf984d3,0x4023d1ac),LL(0x02897a45,0x32125ed3), LL(0x3d414205,0xfb572dad),LL(0xe3fa82a9,0x73000ef2),LL(0xf10a5581,0x4c0868e9),LL(0x6b0b3ca5,0x5b61fc67),
+ LL(0x7cae440c,0xc1258d5b),LL(0x402b7531,0x21c08b41),LL(0xde932321,0xf61a8955),LL(0x2d1408af,0x3568faf8), LL(0x9ecf965b,0x71b15e99),LL(0xe917276f,0xf14ed248),LL(0x820cf9e2,0xc6f4caa1),LL(0x18d83c7e,0x681b20b2),
+ LL(0xc6c01120,0x6cde738d),LL(0xae70e0db,0x71db0813),LL(0x74afe18c,0x95fc0644),LL(0x129e2be7,0x34619053), LL(0xdb2a3b15,0x80615cea),LL(0xdb4c7073,0x0a49a19e),LL(0x8fd2d367,0x0e1b84c8),LL(0x033fb8aa,0xd74bf462),
+ LL(0x533ef217,0x889f6d65),LL(0xc3ca2e87,0x7158c7e4),LL(0xdc2b4167,0xfb670dfb),LL(0x844c257f,0x75910a01), LL(0xcf88577d,0xf336bf07),LL(0xe45e2ace,0x22245250),LL(0x7ca23d85,0x2ed92e8d),LL(0x2b812f58,0x29f8be4c),
+ LL(0x076fe12b,0xdd9ebaa7),LL(0xae1537f9,0x3f2400cb),LL(0x17bdfb46,0x1aa93528),LL(0x67883b41,0xc0f98430), LL(0x0170911d,0x5590ede1),LL(0x34d4b17f,0x7562f5bb),LL(0x1826b8d2,0xe1fa1df2),LL(0x6bd80d59,0xb40b796a),
+ LL(0x3467ba92,0xd65bf197),LL(0xf70954b0,0x8c9b46db),LL(0x0e78f15d,0x97c8a0f3),LL(0x85a4c961,0xa8f3a69a), LL(0x61e4ce9b,0x4242660f),LL(0x6ea6790c,0xbf06aab3),LL(0xec986416,0xc6706f8e),LL(0x9a9fc225,0x9e56dec1),
+ LL(0x9a9898d9,0x527c46f4),LL(0x5633cdef,0xd799e77b),LL(0x7d9e4297,0x24eacc16),LL(0x6b1cb734,0xabb61cea), LL(0xf778443c,0xbee2e8a7),LL(0x29de2fe6,0x3bb42bf1),LL(0x3003bb6f,0xcbed86a1),LL(0xd781cdf6,0xd3918e6c),
+ LL(0x9a5103f1,0x4bee3271),LL(0xf50eac06,0x5243efc6),LL(0x6adcc119,0xb8e122cb),LL(0xc0b80a08,0x1b7faa84), LL(0x6dfcd08c,0x32c3d1bd),LL(0x0be427de,0x129dec4e),LL(0x1d263c83,0x98ab679c),LL(0xcef64eff,0xafc83cb7),
+ LL(0x2fa6be76,0x85eb6088),LL(0x1328cbfe,0x892585fb),LL(0xcf618dda,0xc154d3ed),LL(0x3abaf26e,0xc44f601b), LL(0x2be1fdfd,0x7bf57d0b),LL(0x21137fee,0xa833bd2d),LL(0x2db591a8,0x9353af36),LL(0x5562a056,0xc76f26dc),
+ LL(0x3fdf5a51,0x1d87e47d),LL(0x55c9cab0,0x7afb5f93),LL(0x89e0586e,0x91bbf58f),LL(0x0d843709,0x7c72c018), LL(0x99b5c3dc,0xa9a5aafb),LL(0x3844aeb0,0xa48a0f1d),LL(0xb667e482,0x7178b7dd),LL(0x6e23a59a,0x453985e9),
+ LL(0x01b25dd8,0x4a54c860),LL(0xfb897c8a,0x0dd37f48),LL(0x0ea90cd9,0x5f8aa610),LL(0x16d5830d,0xc8892c68), LL(0xef514ca5,0xeb4befc0),LL(0xe72c9ee6,0x478eb679),LL(0xdbc40d5f,0x9bca20da),LL(0xdde4f64a,0xf015de21),
+ LL(0xeaf4b8a5,0xaa6a4de0),LL(0x4bc60e32,0x68cfd9ca),LL(0x7fd15e70,0x668a4b01),LL(0xf27dc09d,0xd9f0694a), LL(0xba708bcd,0xf6c3cad5),LL(0x5bb95c2a,0x5cd2ba69),LL(0x33c0a58f,0xaa28c1d3),LL(0xabc77870,0x23e274e3),
+ LL(0xdfd20a4a,0x44c3692d),LL(0x81a66653,0x091c5fd3),LL(0x09a0757d,0x6c0bb691),LL(0x667343ea,0x9072e8b9), LL(0x80848bec,0x31d40eb0),LL(0x79fd36cc,0x95bd480a),LL(0x65ed43f5,0x01a77c61),LL(0x2e0d40bf,0xafccd127),
+ LL(0x1cc1884b,0xeccfc82d),LL(0x5d4753b4,0xc85ac201),LL(0x658e099f,0xc7a6caac),LL(0x04b27390,0xcf46369e), LL(0x506467ea,0xe2e7d049),LL(0x37cdeccc,0x481b63a2),LL(0xed80143a,0x4029abd8),LL(0xbcb00b88,0x28bfe3c7),
+ LL(0x0643d84a,0x3bec1009),LL(0xabd11041,0x885f3668),LL(0xf83a34d6,0xdb02432c),LL(0x719ceebe,0x32f7b360), LL(0xdad1fe7a,0xf06c7837),LL(0x5441a0b0,0x60a157a9),LL(0xe2d47550,0x704970e9),LL(0x271b9020,0xcd2bd553),
+ LL(0x33e24a0b,0xff57f82f),LL(0xf2565079,0x9cbee23f),LL(0xeb5f5825,0x16353427),LL(0xe948d662,0x276feec4), LL(0xda10032b,0xd1b62bc6),LL(0xf0e72a53,0x718351dd),LL(0x2420e7ba,0x93452076),LL(0x3a00118d,0x96368fff),
+ LL(0x150a49e4,0x00ce2d26),LL(0x3f04706b,0x0c28b636),LL(0x58b196d0,0xbad65a46),LL(0xec9f8b7c,0x6c8455fc), LL(0x2d71867e,0xe90c895f),LL(0xedf9f38c,0x5c0be31b),LL(0xd8f6ec04,0x2a37a15e),LL(0x8cd85251,0x239639e7),
+ LL(0x9c7c4c6b,0xd8975315),LL(0xd7409af7,0x603aa3c0),LL(0x007132fb,0xb8d53d0c),LL(0xa6849238,0x68d12af7), LL(0xbf5d9279,0xbe0607e7),LL(0xaada74ce,0x9aa50055),LL(0xba7e8ccb,0xe81079cb),LL(0xa5f4ff5e,0x610c71d1),
+ LL(0x5aa07093,0x9e2ee1a7),LL(0xa75da47c,0xca84004b),LL(0x3de75401,0x074d3951),LL(0xbb311592,0xf938f756), LL(0x00a43421,0x96197618),LL(0x07bc78c8,0x39a25362),LL(0x0a171276,0x278f710a),LL(0x8d1a8f08,0xb28446ea),
+ LL(0xe3b6a661,0x184781bf),LL(0xe6d279f7,0x7751cb1d),LL(0xc59eb662,0xf8ff95d6),LL(0x58d3dea7,0x186d90b7), LL(0xdfb4f754,0x0e4bb6c1),LL(0x2b2801dc,0x5c5cf56b),LL(0x1f54564d,0xc561e452),LL(0xf0dd7f13,0xb4fb8c60),
+ LL(0x33ff98c7,0xf8849630),LL(0xcf17769c,0x9619fffa),LL(0x1bfdd80a,0xf8090bf6),LL(0x422cfe63,0x14d9a149), LL(0x6f6df9ea,0xb354c360),LL(0x218f17ea,0xdbcf770d),LL(0x79eb3480,0x207db7c8),LL(0x559b6a26,0x213dbda8),
+ LL(0x29fc81b3,0xac4c200b),LL(0x171d87c1,0xebc3e09f),LL(0x1481aa9e,0x91799530),LL(0x92e114fa,0x051b92e1), LL(0xecb5537f,0xdf8f92e9),LL(0x290c7483,0x44b1b2cc),LL(0x2adeb016,0xa711455a),LL(0x81a10c2c,0x964b6856),
+ LL(0xcec03623,0x4f159d99),LL(0xef3271ea,0x05532225),LL(0xc5ee4849,0xb231bea3),LL(0x7094f103,0x57a54f50), LL(0x9598b352,0x3e2d421d),LL(0x67412ab4,0xe865a49c),LL(0x1cc3a912,0xd2998a25),LL(0x0c74d65d,0x5d092808),
+ LL(0x4088567a,0x73f45908),LL(0x1f214a61,0xeb6b280e),LL(0xcaf0c13d,0x8c9adc34),LL(0xf561fb80,0x39d12938), LL(0xbc6edfb4,0xb2dc3a5e),LL(0xfe4d210e,0x7485b1b1),LL(0xe186ae72,0x062e0400),LL(0x6eeb3b88,0x91e32d5c),
+ LL(0x4be59224,0x6df574d7),LL(0x716d55f3,0xebc88ccc),LL(0xcad6ed33,0x26c2e6d0),LL(0x0d3e8b10,0xc6e21e7d), LL(0x5bcc36bb,0x2cc5840e),LL(0x7da74f69,0x9292445e),LL(0x4e5193a8,0x8be8d321),LL(0x8df06413,0x3ec23629),
+ LL(0xb134defa,0xc7e9ae85),LL(0x1bb2d475,0x6073b1d0),LL(0x2863c00d,0xb9ad615e),LL(0x525f4ac4,0x9e29493d), LL(0x4e9acf4f,0xc32b1dea),LL(0xa50db88d,0x3e1f01c8),LL(0x04da916c,0xb05d70ea),LL(0xd865803e,0x714b0d0a),
+ LL(0x9920cb5e,0x4bd493fc),LL(0x92c7a3ac,0x5b44b1f7),LL(0xbcec9235,0xa2a77293),LL(0xcd378553,0x5ee06e87), LL(0xda621607,0xceff8173),LL(0x99f5d290,0x2bb03e4c),LL(0xa6f734ac,0x2945106a),LL(0xd25c4732,0xb5056604),
+ LL(0xe079afee,0x5945920c),LL(0x6789831f,0x686e17a0),LL(0xb74a5ae5,0x5966bee8),LL(0x1e258d46,0x38a673a2), LL(0x83141c95,0xbd1cc1f2),LL(0x0e96e486,0x3b2ecf4f),LL(0x74e5fc78,0xcd3aa896),LL(0x2482fa7a,0x415ec10c),
+ LL(0x80503380,0x15234419),LL(0xd314b392,0x513d917a),LL(0x63caecae,0xb0b52f4e),LL(0x2dc7780b,0x07bf22ad), LL(0xe4306839,0xe761e8a1),LL(0x5dd7feaa,0x1b3be962),LL(0x74c778f1,0x4fe728de),LL(0x5e0070f6,0xf1fa0bda),
+ LL(0x6ec3f510,0x85205a31),LL(0xd2980475,0x2c7e4a14),LL(0x6f30ebfd,0xde3c19c0),LL(0xd4b7e644,0xdb1c1f38), LL(0x5dce364a,0xfe291a75),LL(0x058f5be3,0xb7b22a3c),LL(0x37fea38c,0x2cd2c302),LL(0x2e17be17,0x2930967a),
+ LL(0x0c061c65,0x87f009de),LL(0xedc6ed44,0xcb014aac),LL(0x3bafb1eb,0x49bd1cb4),LL(0x282d3688,0x81bd8b5c), LL(0xf01a17af,0x1cdab87e),LL(0xe710063b,0x21f37ac4),LL(0x42fc8193,0x5a6c5676),LL(0x56a6015c,0xf4753e70),
+ LL(0xa15b0a44,0x020f795e),LL(0x8958a958,0x8f37c8d7),LL(0xa4b675b5,0x63b7e89b),LL(0x0fc31aea,0xb4fb0c0c), LL(0xa7ff1f2e,0xed95e639),LL(0x619614fb,0x9880f5a3),LL(0x947151ab,0xdeb6ff02),LL(0xa868dcdb,0x5bc5118c),
+ LL(0x4c20cea5,0xd8da2055),LL(0x14c4d69a,0xcac2776e),LL(0x622d599b,0xcccb22c1),LL(0x68a9bb50,0xa4ddb653), LL(0x1b4941b4,0x2c4ff151),LL(0x6efba588,0xe1ff19b4),LL(0xc48345e0,0x35034363),LL(0x1e29dfc4,0x45542e3d),
+ LL(0x349f7aed,0xf197cb91),LL(0x8fca8420,0x3b2b5a00),LL(0x23aaf6d8,0x7c175ee8),LL(0x35af32b6,0x54dcf421), LL(0x27d6561e,0x0ba14307),LL(0xd175b1e2,0x879d5ee4),LL(0x99807db5,0xc7c43673),LL(0x9cd55bcd,0x77a54455),
+ LL(0x0105c072,0xe6c2ff13),LL(0x8dda7da4,0x18f7a99f),LL(0x0e2d35c1,0x4c301820),LL(0xd9cc6c82,0x06a53ca0), LL(0xf1aa1d9e,0xaa21cc1e),LL(0x4a75b1e8,0x32414334),LL(0x0ebe9fdc,0x2a6d1328),LL(0x98a4755a,0x16bd173f),
+ LL(0x2133ffd9,0xfbb9b245),LL(0x830f1a20,0x39a8b2f1),LL(0xd5a1f52a,0x484bc97d),LL(0xa40eddf8,0xd6aebf56), LL(0x76ccdac6,0x32257acb),LL(0x1586ff27,0xaf4d36ec),LL(0xf8de7dd1,0x8eaa8863),LL(0x88647c16,0x0045d5cf),
+},
+/* digit=6 base_pwr=2^42 */
+{
+ LL(0xc005979d,0xa6f3d574),LL(0x6a40e350,0xc2072b42),LL(0x8de2ecf9,0xfca5c156),LL(0xa515344e,0xa8c8bf5b), LL(0x114df14a,0x97aee555),LL(0xfdc5ec6b,0xd4374a4d),LL(0x2ca85418,0x754cc28f),LL(0xd3c41f78,0x71cb9e27),
+ LL(0x03605c39,0x89105079),LL(0xa142c96c,0xf0843d9e),LL(0x16923684,0xf3744934),LL(0xfa0a2893,0x732caa2f), LL(0x61160170,0xb2e8c270),LL(0x437fbaa3,0xc32788cc),LL(0xa6eda3ac,0x39cd818e),LL(0x9e2b2e07,0xe2e94239),
+ LL(0x0260e52a,0x6967d39b),LL(0x90653325,0xd42585cc),LL(0x21ca7954,0x0d9bd605),LL(0x81ed57b3,0x4fa20877), LL(0xe34a0bbe,0x60c1eff8),LL(0x84f6ef64,0x56b0040c),LL(0xb1af8483,0x28be2b24),LL(0xf5531614,0xb2278163),
+ LL(0x5922ac1c,0x8df27545),LL(0xa52b3f63,0xa7b3ef5c),LL(0x71de57c4,0x8e77b214),LL(0x834c008b,0x31682c10), LL(0x4bd55d31,0xc76824f0),LL(0x17b61c71,0xb6d1c086),LL(0xc2a5089d,0x31db0903),LL(0x184e5d3f,0x9c092172),
+ LL(0xc00cc638,0xdd7ced5b),LL(0x61278fc2,0x1a2015eb),LL(0x6a37f8d6,0x2e8e5288),LL(0xe79933ad,0xc457786f), LL(0x2c51211a,0xb3fe4cce),LL(0x24c20498,0xad9b10b2),LL(0xd28db5e5,0x90d87a4f),LL(0x3aca2fc3,0x698cd105),
+ LL(0xe91b536d,0x4f112d07),LL(0x9eba09d6,0xceb982f2),LL(0x197c396f,0x3c157b2c),LL(0x7b66eb24,0xe23c2d41), LL(0x3f330d37,0x480c57d9),LL(0x79108deb,0xb3a4c8a1),LL(0xcb199ce5,0x702388de),LL(0xb944a8d4,0x0b019211),
+ LL(0x840bb336,0x24f2a692),LL(0xa669fa7b,0x7c353bdc),LL(0xdec9c300,0xda20d6fc),LL(0xa13a4f17,0x625fbe2f), LL(0xdbc17328,0xa2b1b61a),LL(0xa9515621,0x008965bf),LL(0xc620ff46,0x49690939),LL(0x8717e91c,0x182dd27d),
+ LL(0xea6c3997,0x5ace5035),LL(0xc2610bef,0x54259aaa),LL(0x3c80dd39,0xef18bb3f),LL(0x5fc3fa39,0x6910b95b), LL(0x43e09aee,0xfce2f510),LL(0xa7675665,0xced56c9f),LL(0xd872db61,0x10e265ac),LL(0xae9fce69,0x6982812e),
+ LL(0xce800998,0x29be11c6),LL(0xb90360d9,0x72bb1752),LL(0x5a4ad590,0x2c193197),LL(0x9fc1dbc0,0x2ba2f548), LL(0xe490ebe0,0x7fe4eebb),LL(0x7fae11c0,0x12a0a4cd),LL(0xe903ba37,0x7197cf81),LL(0xde1c6dd8,0xcf7d4aa8),
+ LL(0x3fd5684c,0x92af6bf4),LL(0x80360aa1,0x2b26eecf),LL(0x00546a82,0xbd960f30),LL(0xf59ad8fe,0x407b3c43), LL(0x249c82ba,0x86cae5fe),LL(0x2463744c,0x9e0faec7),LL(0x94916272,0x87f551e8),LL(0x6ceb0615,0x033f9344),
+ LL(0x8be82e84,0x1e5eb0d1),LL(0x7a582fef,0x89967f0e),LL(0xa6e921fa,0xbcf687d5),LL(0xd37a09ba,0xdfee4cf3), LL(0xb493c465,0x94f06965),LL(0x7635c030,0x638b9a1c),LL(0x66f05e9f,0x76667864),LL(0xc04da725,0xccaf6808),
+ LL(0x768fccfc,0xca2eb690),LL(0xb835b362,0xf402d37d),LL(0xe2fdfcce,0x0efac0d0),LL(0xb638d990,0xefc9cdef), LL(0xd1669a8b,0x2af12b72),LL(0x5774ccbd,0x33c536bc),LL(0xfb34870e,0x30b21909),LL(0x7df25aca,0xc38fa2f7),
+ LL(0xbf81f3f5,0x74c5f02b),LL(0xaf7e4581,0x0525a5ae),LL(0x433c54ae,0x88d2aaba),LL(0x806a56c5,0xed9775db), LL(0xc0edb37d,0xd320738a),LL(0x66cc1f51,0x25fdb6ee),LL(0x10600d76,0xac661d17),LL(0xbdd1ed76,0x931ec1f3),
+ LL(0x19ee43f1,0x65c11d62),LL(0x60829d97,0x5cd57c3e),LL(0x984be6e8,0xd26c91a3),LL(0x8b0c53bd,0xf08d9309), LL(0xc016e4ea,0x94bc9e5b),LL(0x11d43d2b,0xd3916839),LL(0x73701155,0x886c5ad7),LL(0x20b00715,0xe0377626),
+ LL(0xaa80ba59,0x7f01c9ec),LL(0x68538e51,0x3083411a),LL(0xe88128af,0x970370f1),LL(0x91dec14b,0x625cc3db), LL(0x01ac3107,0xfef9666c),LL(0xd5057ac3,0xb2a8d577),LL(0x92be5df7,0xb0f26299),LL(0x00353924,0xf579c8e5),
+ LL(0x1341ed7a,0xb8fa3d93),LL(0xa7b59d49,0x4223272c),LL(0x83b8c4a4,0x3dcb1947),LL(0xed1302e4,0x4e413c01), LL(0xe17e44ce,0x6d999127),LL(0x33b3adfb,0xee86bf75),LL(0x25aa96ca,0xf6902fe6),LL(0xe5aae47d,0xb73540e4),
+ LL(0x1b4a158c,0x32801d7b),LL(0x27e2a369,0xe571c99e),LL(0x10d9f197,0x40cb76c0),LL(0x3167c0ae,0xc308c289), LL(0xeb7958f2,0xa6ef9dd3),LL(0x300879b1,0xa7226dfc),LL(0x7edf0636,0x6cd0b362),LL(0x7bc37eed,0x4efbce6c),
+ LL(0x8d699021,0x75f92a05),LL(0x772566e3,0x586d4c79),LL(0x761ad23a,0x378ca5f1),LL(0x1465a8ac,0x650d86fc), LL(0x842ba251,0x7a4ed457),LL(0x42234933,0x6b65e3e6),LL(0x31aad657,0xaf1543b7),LL(0xcbfec369,0xa4cefe98),
+ LL(0x9f47befb,0xb587da90),LL(0x41312d13,0x6562e9fb),LL(0xeff1cefe,0xa691ea59),LL(0x05fc4cf6,0xcc30477a), LL(0x0b0ffd3d,0xa1632461),LL(0x5b355956,0xa1f16f3b),LL(0x4224ec24,0x5b148d53),LL(0xf977012a,0xdc834e7b),
+ LL(0xb2c69dbc,0x7bfc5e75),LL(0x03c3da6c,0x3aa77a29),LL(0xca910271,0xde0df03c),LL(0x7806dc55,0xcbd5ca4a), LL(0x6db476cb,0xe1ca5807),LL(0x5f37a31e,0xfde15d62),LL(0xf41af416,0xf49af520),LL(0x7d342db5,0x96c5c5b1),
+ LL(0xeb4ceb9b,0x155c43b7),LL(0x4e77371a,0x2e993010),LL(0x675d43af,0x1d2987da),LL(0x8599fd72,0xef2bc1c0), LL(0x9342f6b2,0x96894b7b),LL(0x7c8e71f0,0x201eadf2),LL(0x4a1f3efc,0xf3479d9f),LL(0x702a9704,0xe0f8a742),
+ LL(0xb3eba40c,0xeafd44b6),LL(0xc1c1e0d0,0xf9739f29),LL(0x619d505e,0x0091471a),LL(0x9d7c263e,0xc15f9c96), LL(0x83afbe33,0x5be47285),LL(0x04f1e092,0xa3b6d6af),LL(0x751a9d11,0xe76526b9),LL(0x9a4ae4d2,0x2ec5b26d),
+ LL(0x02f6fb8d,0xeb66f4d9),LL(0x96912164,0x4063c561),LL(0x80ef3000,0xeb7050c1),LL(0xeaa5b3f0,0x288d1c33), LL(0x07806fd8,0xe87c68d6),LL(0x4bbbf50f,0xb2f7f9d5),LL(0xac8d6627,0x25972f3a),LL(0x10e8c13b,0xf8547774),
+ LL(0x872b4a60,0xcc50ef6c),LL(0x4613521b,0xab2a34a4),LL(0x983e15d1,0x39c5c190),LL(0x59905512,0x61dde5df), LL(0x9f2275f3,0xe417f621),LL(0x451d894b,0x0750c8b6),LL(0x78b0bdaa,0x75b04ab9),LL(0x458589bd,0x3bfd9fd4),
+ LL(0xee9120b6,0xf1013e30),LL(0x23a4743e,0x2b51af93),LL(0x48d14d9e,0xea96ffae),LL(0x698a1d32,0x71dc0dbe), LL(0x0180cca4,0x914962d2),LL(0xc3568963,0x1ae60677),LL(0x437bc444,0x8cf227b1),LL(0xc9962c7a,0xc650c83b),
+ LL(0xfe7ccfc4,0x23c2c7dd),LL(0x1b929d48,0xf925c89d),LL(0x06783c33,0x4460f74b),LL(0xa590475a,0xac2c8d49), LL(0xb807bba0,0xfb40b407),LL(0x69ff8f3a,0x9d1e362d),LL(0xcbef64a4,0xa33e9681),LL(0x332fb4b2,0x67ece5fa),
+ LL(0x739f10e3,0x6900a99b),LL(0xff525925,0xc3341ca9),LL(0xa9e2d041,0xee18a626),LL(0x29580ddd,0xa5a83685), LL(0x9d7de3cd,0xf3470c81),LL(0x2062cf9c,0xedf02586),LL(0xc010edb0,0xf43522fa),LL(0x13a4b1ae,0x30314135),
+ LL(0xdb22b94b,0xc792e02a),LL(0xa1eaa45b,0x993d8ae9),LL(0xcd1e1c63,0x8aad6cd3),LL(0xc5ce688a,0x89529ca7), LL(0xe572a253,0x2ccee3aa),LL(0x02a21efb,0xe02b6438),LL(0xc9430358,0xa7091b6e),LL(0x9d7db504,0x06d1b1fa),
+ LL(0xc4744733,0x58846d32),LL(0x379f9e34,0x40517c71),LL(0x130ef6ca,0x2f65655f),LL(0xf1f3503f,0x526e4488), LL(0x7ee4a976,0x8467bd17),LL(0x921363d1,0x1d9dc913),LL(0xb069e041,0xd8d24c33),LL(0x2cdf7f51,0x5eb5da0a),
+ LL(0x197b994f,0x1c0f3cb1),LL(0x2843eae9,0x3c95a6c5),LL(0xa6097ea5,0x7766ffc9),LL(0xd723b867,0x7bea4093), LL(0x4db378f9,0xb48e1f73),LL(0xe37b77ac,0x70025b00),LL(0xaf24ad46,0x943dc8e7),LL(0x16d00a85,0xb98a15ac),
+ LL(0x2743b004,0x3adc38ba),LL(0x334415ee,0xb1c7f4f7),LL(0x1e62d05a,0xea43df8f),LL(0x9d76a3b6,0x32618905), LL(0xa23a0f46,0x2fbd0bb5),LL(0x6a01918c,0x5bc971db),LL(0xb4743f94,0x7801d94a),LL(0x676ae22b,0xb94df65e),
+ LL(0xaf95894c,0xaafcbfab),LL(0x276b2241,0x7b9bdc07),LL(0x5bdda48b,0xeaf98362),LL(0xa3fcb4df,0x5977faf2), LL(0x052c4b5b,0xbed042ef),LL(0x067591f0,0x9fe87f71),LL(0x22f24ec7,0xc89c73ca),LL(0xe64a9f1b,0x7d37fa9e),
+ LL(0x15562627,0x2710841a),LL(0xc243b034,0x2c01a613),LL(0x2bc68609,0x1d135c56),LL(0x8b03f1f6,0xc2ca1715), LL(0x3eb81d82,0xc9966c2d),LL(0x8f6df13e,0xc02abf4a),LL(0x8f72b43b,0x77b34bd7),LL(0x360c82b0,0xaff6218f),
+ LL(0x8d55b9d2,0x0aa5726c),LL(0x99e9bffb,0xdc0adbe9),LL(0xefb9e72a,0x9097549c),LL(0x9dfb3111,0x16755712), LL(0xf26847f9,0xdd8bf984),LL(0xdfb30cb7,0xbcb8e387),LL(0x5171ef9c,0xc1fd32a7),LL(0x389b363f,0x977f3fc7),
+ LL(0xf4babda0,0x116eaf2b),LL(0xf7113c8e,0xfeab68bd),LL(0xb7def526,0xd1e3f064),LL(0xe0b3fa02,0x1ac30885), LL(0x40142d9d,0x1c5a6e7b),LL(0x30921c0b,0x839b5603),LL(0x36a116a3,0x48f301fa),LL(0xcfd9ee6d,0x380e1107),
+ LL(0x58854be1,0x7945ead8),LL(0xcbd4d49d,0x4111c12e),LL(0x3a29c2ef,0xece3b1ec),LL(0x8d3616f5,0x6356d404), LL(0x594d320e,0x9f0d6a8f),LL(0xf651ccd2,0x0989316d),LL(0x0f8fdde4,0x6c32117a),LL(0xa26a9bbc,0x9abe5cc5),
+ LL(0x9723f671,0xcff560fb),LL(0x7f3d593c,0x21b2a12d),LL(0x24ba0696,0xe4cb18da),LL(0xc3543384,0x186e2220), LL(0x88312c29,0x722f64e0),LL(0x17dc7752,0x94282a99),LL(0x5a85ee89,0x62467bbf),LL(0xf10076a0,0xf435c650),
+ LL(0x43b3a50b,0xc9ff1539),LL(0x1a53efbc,0x7132130c),LL(0xf7b0c5b7,0x31bfe063),LL(0x4ea994cc,0xb0179a7d), LL(0xc85f455b,0x12d064b3),LL(0x8f6e0062,0x47259328),LL(0xb875d6d9,0xf64e590b),LL(0xad92bcc7,0x22dd6225),
+ LL(0xb9c3bd6d,0xb658038e),LL(0xfbba27c8,0x00cdb0d6),LL(0x1062c45d,0x0c681337),LL(0x2d33407d,0xd8515b8c), LL(0x8cbb5ecf,0xcb8f699e),LL(0xc608d7d8,0x8c4347f8),LL(0xbb3e00db,0x2c11850a),LL(0xecb49d19,0x20a8dafd),
+ LL(0x45ee2f40,0xbd781480),LL(0x416b60cf,0x75e354af),LL(0x8d49a8c4,0xde0b58a1),LL(0xfa359536,0xe40e94e2), LL(0x62accd76,0xbd4fa59f),LL(0x8c762837,0x05cf466a),LL(0x448c277b,0xb5abda99),LL(0x48b13740,0x5a9e01bf),
+ LL(0x326aad8d,0x9d457798),LL(0xc396f7e7,0xbdef4954),LL(0xc253e292,0x6fb274a2),LL(0x1cfe53e7,0x2800bf0a), LL(0x44438fd4,0x22426d31),LL(0x5e259f9a,0xef233923),LL(0x03f66264,0x4188503c),LL(0x7f9fdfab,0x9e5e7f13),
+ LL(0x5fcc1aba,0x565eb76c),LL(0x59b5bff8,0xea632548),LL(0xaab6d3fa,0x5587c087),LL(0x6ce39c1b,0x92b639ea), LL(0x953b135c,0x0706e782),LL(0x425268ef,0x7308912e),LL(0x090e7469,0x599e92c7),LL(0x9bc35e75,0x83b90f52),
+ LL(0x244975b3,0x4750b3d0),LL(0x11965d72,0xf3a44358),LL(0x9c8dc751,0x179c6774),LL(0xd23d9ff0,0xff18cdfe), LL(0x2028e247,0xc4013833),LL(0xf3bfbc79,0x96e280e2),LL(0xd0880a84,0xf60417bd),LL(0x2a568151,0x263c9f3d),
+ LL(0x2d2ce811,0x36be15b3),LL(0xf8291d21,0x846dc0c2),LL(0x789fcfdb,0x5cfa0ecb),LL(0xd7535b9a,0x45a0beed), LL(0x96d69af1,0xec8e9f07),LL(0x599ab6dc,0x31a7c5b8),LL(0xf9e2e09f,0xd36d45ef),LL(0xdcee954b,0x3cf49ef1),
+ LL(0x086cff9b,0x6be34cf3),LL(0x39a3360f,0x88dbd491),LL(0x0dbfbd1d,0x1e96b8cc),LL(0xcb7e2552,0xc1e5f7bf), LL(0x28819d98,0x0547b214),LL(0x7aea9dcb,0xc770dd9c),LL(0x041d68c8,0xaef0d4c7),LL(0x13cb9ba8,0xcc2b9818),
+ LL(0xfe86c607,0x7fc7bc76),LL(0x502a9a95,0x6b7b9337),LL(0xd14dab63,0x1948dc27),LL(0xdae047be,0x249dd198), LL(0xa981a202,0xe8356584),LL(0x3a893387,0x3531dd18),LL(0xc85c7209,0x1be11f90),LL(0xe2a52b5a,0x93d2fe1e),
+ LL(0xec6d6b97,0x8225bfe2),LL(0xbd0aa5de,0x9cf6d6f4),LL(0x54779f5f,0x911459cb),LL(0x86aeb1f3,0x5649cddb), LL(0x3f26ce5a,0x32133579),LL(0x550f431e,0xc289a102),LL(0x73b84c6f,0x559dcfda),LL(0xee3ac4d7,0x84973819),
+ LL(0xf2606a82,0xb51e55e6),LL(0x90f2fb57,0xe25f7061),LL(0xb1a4e37c,0xacef6c2a),LL(0x5dcf2706,0x864e359d), LL(0x7ce57316,0x479e6b18),LL(0x3a96b23d,0x2cab2500),LL(0x8ef16df7,0xed489862),LL(0xef3758b5,0x2056538c),
+ LL(0xf15d3101,0xa7df865e),LL(0x61b553d7,0x80c5533a),LL(0x4ed14294,0x366e1997),LL(0xb3c0bcd6,0x6620741f), LL(0xedc45418,0x21d1d9c4),LL(0xc1cc4a9d,0x005b859e),LL(0xa1c462f0,0xdf01f630),LL(0xf26820c7,0x15d06cf3),
+ LL(0x3484be47,0x9f7f24ee),LL(0x4a0c902f,0x2ff33e96),LL(0x5a0bc453,0x00bdf457),LL(0x1aa238db,0x2378dfaf), LL(0x856720f2,0x272420ec),LL(0x96797291,0x2ad9d95b),LL(0x768a1558,0xd1242cc6),LL(0x5cc86aa8,0x2e287f8b),
+ LL(0x990cecaa,0x796873d0),LL(0x675d4080,0xade55f81),LL(0x21f0cd84,0x2645eea3),LL(0xb4e17d02,0x7a1efa0f), LL(0x037cc061,0xf6858420),LL(0xd5d43e12,0x682e05f0),LL(0x27218710,0x59c36994),LL(0x3f7cd2fc,0x85cbba4d),
+ LL(0x7a3cd22a,0x726f9729),LL(0x4a628397,0x9f8cd5dc),LL(0xc23165ed,0x17b93ab9),LL(0x122823d4,0xff5f5dbf), LL(0x654a446d,0xc1e4e4b5),LL(0x677257ba,0xd1a9496f),LL(0xde766a56,0x6387ba94),LL(0x521ec74a,0x23608bc8),
+ LL(0x6688c4d4,0x16a522d7),LL(0x07373abd,0x9d6b4282),LL(0xb42efaa3,0xa62f07ac),LL(0xe3b90180,0xf73e00f7), LL(0x49421c3e,0x36175fec),LL(0x3dcf2678,0xc4e44f9b),LL(0x7220f09f,0x76df436b),LL(0x3aa8b6cf,0x172755fb),
+ LL(0x446139cc,0xbab89d57),LL(0x5fe0208f,0x0a0a6e02),LL(0x11e5d399,0xcdbb63e2),LL(0xa8977f0b,0x33ecaa12), LL(0xf7c42664,0x59598b21),LL(0xab65d08a,0xb3e91b32),LL(0xf4502526,0x035822ee),LL(0x720a82a9,0x1dcf0176),
+ LL(0x3d589e02,0x50f8598f),LL(0xb1d63d2c,0xdf0478ff),LL(0x1571cd07,0x8b8068bd),LL(0xd79670cd,0x30c3aa4f), LL(0x941ade7f,0x25e8fd4b),LL(0x32790011,0x3d1debdc),LL(0x3a3f9ff0,0x65b6dcbd),LL(0x793de69c,0x282736a4),
+ LL(0xd41d3bd3,0xef69a0c3),LL(0x07a26bde,0xb533b8c9),LL(0xdb2edf9f,0xe2801d97),LL(0xe1877af0,0xdc4a8269), LL(0x3d590dbe,0x6c1c5851),LL(0xee4e9357,0x84632f6b),LL(0x79b33374,0xd36d36b7),LL(0x9bbca2e6,0xb46833e3),
+ LL(0xf7fc0586,0x37893913),LL(0x66bf4719,0x385315f7),LL(0xb31855dc,0x72c56293),LL(0x849061fe,0xd1416d4e), LL(0x51047213,0xbeb3ab78),LL(0xf040c996,0x447f6e61),LL(0x638b1d0c,0xd06d310d),LL(0xbad1522e,0xe28a413f),
+ LL(0x82003f86,0x685a76cb),LL(0x0bcdbca3,0x610d07f7),LL(0x9ca4c455,0x6ff66021),LL(0xcea10eec,0x7df39b87), LL(0xe22db218,0xb9255f96),LL(0x08a34c44,0x8cc6d9eb),LL(0x859f9276,0xcd4ffb86),LL(0x50d07335,0x8fa15eb2),
+ LL(0xcf2c24b5,0xdf553845),LL(0x52f9c3ba,0x89f66a9f),LL(0xe4a7ceb3,0x8f22b5b9),LL(0x0e134686,0xaffef809), LL(0x8eb8fac2,0x3e53e1c6),LL(0x28aec98e,0x93c1e4eb),LL(0x32a43bcb,0xb6b91ec5),LL(0xb2d74a51,0x2dbfa947),
+ LL(0xca84bad7,0xe065d190),LL(0xad58e65c,0xfb13919f),LL(0xf1cb6e31,0x3c41718b),LL(0x06d05c3f,0x688969f0), LL(0x21264d45,0xd4f94ce7),LL(0x7367532b,0xfdfb65e9),LL(0x0945a39d,0x5b1be8b1),LL(0x2b8baf3b,0x229f789c),
+ LL(0x6f49f15d,0xd8f41f3e),LL(0x907f0792,0x678ce828),LL(0xfca6e867,0xc69ace82),LL(0xd01dcc89,0x106451ae), LL(0x19fc32d2,0x1bb4f7f0),LL(0xb00c52d2,0x64633dfc),LL(0xad9ea445,0x8f13549a),LL(0xfb323705,0x99a3bf50),
+ LL(0x534d4dbc,0x0c9625a2),LL(0xc2a2fea3,0x45b8f1d1),LL(0xa530fc1a,0x76ec21a1),LL(0x9e5bd734,0x4bac9c2a), LL(0x7b4e3587,0x5996d76a),LL(0x1182d9e3,0x0045cdee),LL(0x1207f13d,0x1aee24b9),LL(0x97345a41,0x66452e97),
+ LL(0x9f950cd0,0x16e5b054),LL(0xd7fdd075,0x9cc72fb1),LL(0x66249663,0x6edd61e7),LL(0xf043cccb,0xde4caa4d), LL(0x55c7ac17,0x11b1f57a),LL(0x1a85e24d,0x779cbd44),LL(0xe46081e7,0x78030f86),LL(0x8e20f643,0xfd4a6032),
+ LL(0x0a750c0f,0xcc7a6488),LL(0x4e548e83,0x39bacfe3),LL(0x0c110f05,0x3d418c76),LL(0xb1f11588,0x3e4daa4c), LL(0x5ffc69ff,0x2733e7b5),LL(0x92053127,0x46f147bc),LL(0xd722df94,0x885b2434),LL(0xe6fc6b7c,0x6a444f65),
+},
+/* digit=7 base_pwr=2^49 */
+{
+ LL(0xc3f16ea8,0x7a1a465a),LL(0xb2f1d11c,0x115a461d),LL(0x6c68a172,0x4767dd95),LL(0xd13a4698,0x3392f2eb), LL(0xe526cdc7,0xc7a99ccd),LL(0x22292b81,0x8e537fdc),LL(0xa6d39198,0x76d8cf69),LL(0x2446852d,0xffc5ff43),
+ LL(0xa90567e6,0x97b14f7e),LL(0xb6ae5cb7,0x513257b7),LL(0x9f10903d,0x85454a3c),LL(0x69bc3724,0xd8d2c9ad), LL(0x6b29cb44,0x38da9324),LL(0x77c8cbac,0xb540a21d),LL(0x01918e42,0x9bbfe435),LL(0x56c3614e,0xfffa707a),
+ LL(0xd4e353b7,0x0ce4e3f1),LL(0xef46b0a0,0x062d8a14),LL(0x574b73fd,0x6408d5ab),LL(0xd3273ffd,0xbc41d1c9), LL(0x6be77800,0x3538e1e7),LL(0xc5655031,0x71fe8b37),LL(0x6b9b331a,0x1cd91621),LL(0xbb388f73,0xad825d0b),
+ LL(0x1cb76219,0x56c2e05b),LL(0x71567e7e,0x0ec0bf91),LL(0x61c4c910,0xe7076f86),LL(0xbabc04d9,0xd67b085b), LL(0x5e93a96a,0x9fb90459),LL(0xfbdc249a,0x7526c1ea),LL(0xecdd0bb7,0x0d44d367),LL(0x9dc0d695,0x95399917),
+ LL(0x9e240d18,0x61360ee9),LL(0xb4b94466,0x057cdcac),LL(0x2fe5325c,0xe7667cd1),LL(0x21974e3b,0x1fa297b5), LL(0xdb083d76,0xfa4081e7),LL(0xf206bd15,0x31993be6),LL(0x14c19f8c,0x8949269b),LL(0xa9d92357,0x21468d72),
+ LL(0xa4c506ec,0x2ccbc583),LL(0xd1acfe97,0x957ed188),LL(0x12f1aea2,0x8baed833),LL(0x8325362d,0xef2a6cb4), LL(0x8e195c43,0x130dde42),LL(0x0e6050c6,0xc842025a),LL(0x08686a5d,0x2da972a7),LL(0xe508b4a8,0xb52999a1),
+ LL(0x10a5a8bd,0xd9f090b9),LL(0x096864da,0xca91d249),LL(0x3f67dbc1,0x8e6a93be),LL(0xf5f4764c,0xacae6fba), LL(0xd21411a0,0x1563c6e0),LL(0xda0a4ad8,0x28fa787f),LL(0x908c8030,0xd524491c),LL(0x4c795f07,0x1257ba0e),
+ LL(0xceca9754,0x83f49167),LL(0x4b7939a0,0x426d2cf6),LL(0x723fd0bf,0x2555e355),LL(0xc4f144e2,0xa96e6d06), LL(0x87880e61,0x4768a8dd),LL(0xe508e4d5,0x15543815),LL(0xb1b65e15,0x09d7e772),LL(0xac302fa0,0x63439dd6),
+ LL(0xc14e35c2,0xb93f802f),LL(0x4341333c,0x71735b7c),LL(0x16d4f362,0x03a25104),LL(0xbf433c8e,0x3f4d069b), LL(0xf78f5a7c,0x0d83ae01),LL(0x7c4eed07,0x50a8ffbe),LL(0x76e10f83,0xc74f8906),LL(0x9ddaf8e1,0x7d080966),
+ LL(0x698e04cc,0xb11df8e1),LL(0x169005c8,0x877be203),LL(0x4f3c6179,0x32749e8c),LL(0x7853fc05,0x2dbc9d0a), LL(0x9454d937,0x187d4f93),LL(0xb4800e1b,0xe682ce9d),LL(0x165e68e8,0xa9129ad8),LL(0xbe7f785b,0x0fe29735),
+ LL(0x5b9e02b7,0x5303f40c),LL(0x35ee04e8,0xa37c9692),LL(0x34d6632b,0x5f46cc20),LL(0x96ac545b,0x55ef72b2), LL(0x7b91b062,0xabec5c1f),LL(0xbb33e821,0x0a79e1c7),LL(0x3a9f4117,0xbb04b428),LL(0xfd2a475a,0x0de1f28f),
+ LL(0x3a4434b4,0x31019ccf),LL(0x1a7954dc,0xa3458111),LL(0xe34972a7,0xa9dac80d),LL(0x74f6b8dd,0xb043d054), LL(0x11137b1a,0x021c319e),LL(0xed5cc03f,0x00a754ce),LL(0xcbea5ad4,0x0aa2c794),LL(0x70c015b6,0x093e67f4),
+ LL(0xc97e3f6b,0x72cdfee9),LL(0xb6da7461,0xc10bcab4),LL(0xb59806b9,0x3b02d2fc),LL(0xa1de6f47,0x85185e89), LL(0x0eb6c4d4,0x39e6931f),LL(0xd4fa5b04,0x4d4440bd),LL(0x34be7eb8,0x5418786e),LL(0x9d7259bc,0x6380e521),
+ LL(0xd598d710,0x20ac0351),LL(0xcb3a4da4,0x272c4166),LL(0xca71de1f,0xdb82fe1a),LL(0xd8f54b0f,0x746e79f2), LL(0x4b573e9b,0x6e7fc736),LL(0xfd4b5040,0x75d03f46),LL(0x0b98d87b,0x5c1cc36d),LL(0x1f472da1,0x513ba3f1),
+ LL(0xabb177dd,0x79d0af26),LL(0x7891d564,0xf82ab568),LL(0x72232173,0x2b6768a9),LL(0x8c1f6619,0xefbb3bb0), LL(0xa6d18358,0xb29c11db),LL(0xb0916d3a,0x519e2797),LL(0x9188e290,0xd4dc18f0),LL(0x98b0ca7f,0x648e86e3),
+ LL(0x983c38b5,0x859d3145),LL(0x637abc8b,0xb14f176c),LL(0xcaff7be6,0x2793fb9d),LL(0x35a66a5a,0xebe5a55f), LL(0x9f87dc59,0x7cec1dcd),LL(0xfbdbf560,0x7c595cd3),LL(0x26eb3257,0x5b543b22),LL(0xc4c935fd,0x69080646),
+ LL(0x81e9ede3,0x7f2e4403),LL(0xcaf6df0a,0x243c3894),LL(0x1c073b11,0x7c605bb1),LL(0xba6a4a62,0xcd06a541), LL(0x49d4e2e5,0x29168949),LL(0x4af66880,0x33649d07),LL(0xe9a85035,0xbfc0c885),LL(0xfc410f4b,0xb4e52113),
+ LL(0x78a6513b,0xdca3b706),LL(0x9edb1943,0x92ea4a2a),LL(0xdb6e2dd8,0x02642216),LL(0x9fd57894,0x9b45d0b4), LL(0xc69d11ae,0x114e70db),LL(0x4c57595f,0x1477dd19),LL(0xec77c272,0xbc2208b4),LL(0xdb68f59c,0x95c5b4d7),
+ LL(0x42e532b7,0xb8c4fc63),LL(0x9ae35290,0x386ba422),LL(0xd201ecbc,0xfb5dda42),LL(0xa0e38fd6,0x2353dc8b), LL(0x68f7e978,0x9a0b85ea),LL(0x2ad6d11f,0x96ec5682),LL(0xe5f6886d,0x5e279d6c),LL(0x3cb1914d,0xd3fe03cd),
+ LL(0x7ea67c77,0xfe541fa4),LL(0xe3ea810c,0x952bd2af),LL(0x8d01d374,0x791fef56),LL(0x0f11336e,0xa3a1c621), LL(0xc7ec6d79,0x5ad0d5a9),LL(0x3225c342,0xff7038af),LL(0xbc69601b,0x003c6689),LL(0x45e8747d,0x25059bc7),
+ LL(0xf2086fbf,0xfa4965b2),LL(0x86916078,0xf6840ea6),LL(0x70081d6c,0xd7ac7620),LL(0xb5328645,0xe600da31), LL(0x529b8a80,0x01916f63),LL(0x2d7d6f3e,0xe80e4858),LL(0xd664ca7c,0x29eb0fe8),LL(0xe7b43b0c,0xf017637b),
+ LL(0x76cb2566,0x9a75c806),LL(0xb24892d9,0x8f76acb1),LL(0x1f08fe45,0x7ae7b9cc),LL(0x6a4907d8,0x19ef7329), LL(0x5f228bf0,0x2db4ab71),LL(0x817032d7,0xf3cdea39),LL(0xdcabe3c0,0x0b1f482e),LL(0xbb86325c,0x3baf76b4),
+ LL(0x10089465,0xd49065e0),LL(0x8e77c596,0x3bab5d29),LL(0x193dbd95,0x7636c3a6),LL(0xb246e499,0xdef5d294), LL(0x286b2475,0xb22c58b9),LL(0xcd80862b,0xa0b93939),LL(0xf0992388,0x3002c83a),LL(0xeacbe14c,0x6de01f9b),
+ LL(0xadd70482,0x6aac688e),LL(0x7b4a4e8a,0x708de92a),LL(0x758a6eef,0x75b6dd73),LL(0x725b3c43,0xea4bf352), LL(0x87912868,0x10041f2c),LL(0xef09297a,0xb1b1be95),LL(0xa9f3860a,0x19ae23c5),LL(0x515dcf4b,0xc4f0f839),
+ LL(0x97f6306a,0x3c7ecca3),LL(0x68a3a4b0,0x744c44ae),LL(0xb3a1d8a2,0x69cd13a0),LL(0x5256b578,0x7cad0a1e), LL(0x33791d9e,0xea653fcd),LL(0x74b2e05f,0x9cc2a05d),LL(0xfd7affa2,0x73b391dc),LL(0xb6b05442,0xddb7091e),
+ LL(0x8538a5c6,0xc71e27bf),LL(0x89abff17,0x195c63dd),LL(0x1b71e3da,0xfd315285),LL(0xfa680fa0,0x9cbdfda7), LL(0x849d7eab,0x9db876ca),LL(0x3c273271,0xebe2764b),LL(0xf208dcea,0x663357e3),LL(0x565b1b70,0x8c5bd833),
+ LL(0x9837fc0d,0xccc3b4f5),LL(0xa79cf00f,0x9b641ba8),LL(0xdfdf3990,0x7428243d),LL(0x020786b1,0x83a594c4), LL(0x526c4502,0xb712451a),LL(0x6adb3f93,0x9d39438e),LL(0xe9ff0ccd,0xfdb261e3),LL(0xe07af4c3,0x80344e3c),
+ LL(0x2fa4f126,0x75900d7c),LL(0x5c99a232,0x08a3b865),LL(0xdb25e0c3,0x2478b6bf),LL(0x71db2edf,0x482cc2c2), LL(0x5f321bb8,0x37df7e64),LL(0x9a8005b4,0x8a93821b),LL(0xcc8c1958,0x3fa2f10c),LL(0x2c269d0a,0x0d332218),
+ LL(0xe246b0e6,0x20ab8119),LL(0xd349fd17,0xb39781e4),LL(0xb31aa100,0xd293231e),LL(0xbb032168,0x4b779c97), LL(0xc8470500,0x4b3f19e1),LL(0x0c4c869d,0x45b7efe9),LL(0xa1a6bbcc,0xdb84f38a),LL(0xb2fddbc1,0x3b59cb15),
+ LL(0x3fd165e8,0xba5514df),LL(0x061f8811,0x499fd6a9),LL(0xbfef9f00,0x72cd1fe0),LL(0x79ad7e8a,0x120a4bb9), LL(0x5f4a5ac5,0xf2ffd095),LL(0x95a7a2f0,0xcfd174f1),LL(0x9d17baf1,0xd42301ba),LL(0x77f22089,0xd2fa487a),
+ LL(0xb1dc77e1,0x9cb09efe),LL(0x21c99682,0xe9566939),LL(0x6c6067bb,0x8c546901),LL(0x61c24456,0xfd378574), LL(0x81796b33,0x2b6a6cbe),LL(0x58e87f8b,0x62d550f6),LL(0x7f1b01b4,0x1b763e1c),LL(0x1b1b5e12,0x4b93cfea),
+ LL(0x1d531696,0xb9345238),LL(0x88cdde69,0x57201c00),LL(0x9a86afc7,0xdde92251),LL(0xbd35cea8,0xe3043895), LL(0x8555970d,0x7608c1e1),LL(0x2535935e,0x8267dfa9),LL(0x322ea38b,0xd4c60a57),LL(0x804ef8b5,0xe0bf7977),
+ LL(0xc06fece4,0x1a0dab28),LL(0x94e7b49d,0xd405991e),LL(0x706dab28,0xc542b6d2),LL(0xa91618fb,0xcb228da3), LL(0x107d1cea,0x224e4164),LL(0xd0f5d8f1,0xeb9fdab3),LL(0x0d6e41cd,0xc02ba386),LL(0x9b1f7146,0x676a72c5),
+ LL(0x4d6cb00b,0xffd6dd98),LL(0xde2e8d7c,0xcef9c5ca),LL(0x641c7936,0xa1bbf5d7),LL(0xee8f772e,0x1b95b230), LL(0xe8ac25b1,0xf765a92e),LL(0x3a18b7c6,0xceb04cfc),LL(0x0acc8966,0x27944cef),LL(0x434c1004,0xcbb3c957),
+ LL(0xa43ff93c,0x9c9971a1),LL(0xa1e358a9,0x5bc2db17),LL(0xa8d9bc82,0x45b4862e),LL(0x2201e052,0x70ebfbfb), LL(0x92871591,0xafdf64c7),LL(0xb42d0219,0xea5bcae6),LL(0x2ad8f03c,0xde536c55),LL(0xa76aa33c,0xcd6c3f4d),
+ LL(0x0bca6de3,0xbeb5f623),LL(0xb1e706fd,0xdd20dd99),LL(0xac9059d4,0x90b3ff9d),LL(0x7ccccc4e,0x2d7b2902), LL(0xce98840f,0x8a090a59),LL(0x8410680a,0xa5d947e0),LL(0x923379a5,0x49ae346a),LL(0xb28a3156,0x7dbc84f9),
+ LL(0x54a1aff2,0xfd40d916),LL(0x3a78fb9b,0xabf318ba),LL(0x3029f95e,0x50152ed8),LL(0xc58ad7fa,0x9fc1dd77), LL(0x13595c17,0x5fa57915),LL(0x8f62b3a9,0xb9504668),LL(0xff3055b0,0x907b5b24),LL(0x9a84f125,0x2e995e35),
+ LL(0x7e9bbcfb,0x87dacf69),LL(0xe86d96e3,0x95d0c1d6),LL(0x2d95a75c,0x65726e3c),LL(0xacd27f21,0x2c3c9001), LL(0x6c973f57,0x1deab561),LL(0xa5221643,0x108b7e2c),LL(0xc4ef79d4,0x5fee9859),LL(0x40d4b8c6,0xbd62b88a),
+ LL(0x197c75d6,0xb4dd29c4),LL(0xb7076feb,0x266a6df2),LL(0x4bf2df11,0x9512d0ea),LL(0x6b0cc9ec,0x1320c24f), LL(0x01a59596,0x6bb1e0e1),LL(0xeff9aaac,0x8317c5bb),LL(0x385aa6c9,0x65bb405e),LL(0x8f07988f,0x613439c1),
+ LL(0x16a66e91,0xd730049f),LL(0xfa1b0e0d,0xe97f2820),LL(0x304c28ea,0x4131e003),LL(0x526bac62,0x820ab732), LL(0x28714423,0xb2ac9ef9),LL(0xadb10cb2,0x54ecfffa),LL(0xf886a4cc,0x8781476e),LL(0xdb2f8d49,0x4b2c87b5),
+ LL(0x0a44295d,0xe857cd20),LL(0x58c6b044,0x707d7d21),LL(0xf596757c,0xae8521f9),LL(0x67b2b714,0x87448f03), LL(0x5ebcd58d,0x13a9bc45),LL(0x9122d3c1,0x79bcced9),LL(0x9e076642,0x3c644247),LL(0x2df4767d,0x0cf22778),
+ LL(0x71d444b6,0x5e61aee4),LL(0xc5084a1d,0x211236bf),LL(0x4fd3eaf6,0x7e15bc9a),LL(0xab622bf5,0x68df2c34), LL(0x59bf4f36,0x9e674f0f),LL(0xd7f34d73,0xf883669b),LL(0x31497b1d,0xc48ac1b8),LL(0x5106703b,0x323b925d),
+ LL(0x74082008,0x22156f42),LL(0xc8482bcb,0xeffc521a),LL(0x12173479,0x5c6831bf),LL(0xc4739490,0xcaa2528f), LL(0x8f1b3c4d,0x84d2102a),LL(0x2d9bec0d,0xcf64dfc1),LL(0x78a546ef,0x433febad),LL(0x7b73cef1,0x1f621ec3),
+ LL(0x37338615,0x6aecd627),LL(0x01d8edf6,0x162082ab),LL(0x19e86b66,0x833a8119),LL(0xd299b5db,0x6023a251), LL(0xbbf04b89,0xf5bb0c3a),LL(0xae749a44,0x6735eb69),LL(0x4713de3b,0xd0e058c5),LL(0x2c3d4ccd,0xfdf2593e),
+ LL(0xfdd23667,0x1b8f414e),LL(0xfa2015ee,0xdd52aaca),LL(0xbd9625ff,0x3e31b517),LL(0x8db5918c,0x5ec9322d), LL(0xa96f5294,0xbc73ac85),LL(0x61a0666a,0x82aa5bf3),LL(0xbf08ac42,0x49755810),LL(0x891cedfc,0xd21cdfd5),
+ LL(0x67f8be10,0x918cb57b),LL(0x56ffa726,0x365d1a7c),LL(0x6532de93,0x2435c504),LL(0x2674cd02,0xc0fc5e10), LL(0x9cbbb142,0x6e51fcf8),LL(0xafc50692,0x1d436e5a),LL(0x3fbcae22,0x766bffff),LL(0xfd55d3b8,0x3148c2fd),
+ LL(0x233222fa,0x52c7fdc9),LL(0xe419fb6b,0x89ff1092),LL(0x25254977,0x3cd6db99),LL(0x1cf12ca7,0x2e85a161), LL(0xdc810bc9,0xadd2547c),LL(0x9d257c22,0xea3f458f),LL(0x27d6b19b,0x642c1fbe),LL(0x140481a6,0xed07e6b5),
+ LL(0x86d2e0f8,0x6ada1d42),LL(0x0e8a9fd5,0xe5920122),LL(0x708c1b49,0x02c936af),LL(0x2b4bfaff,0x60f30fee), LL(0x858e6a61,0x6637ad06),LL(0x3fd374d0,0xce4c7767),LL(0x7188defb,0x39d54b2d),LL(0xf56a6b66,0xa8c9d250),
+ LL(0xb24fe1dc,0x58fc0f5e),LL(0x6b73f24c,0x9eaf9dee),LL(0x33650705,0xa90d588b),LL(0xaf2ec729,0xde5b62c5), LL(0xd3c2b36e,0x5c72cfae),LL(0x034435da,0x868c19d5),LL(0xe17ee145,0x88605f93),LL(0x77a5d5b1,0xaa60c4ee),
+ LL(0x3b60c472,0xbcf5bfd2),LL(0xeb1d3049,0xaf4ef13c),LL(0xe13895c9,0x373f44fc),LL(0x0cbc9822,0xf29b382f), LL(0x73efaef6,0x1bfcb853),LL(0xa8c96f40,0xcf56ac9c),LL(0x7a191e24,0xd7adf109),LL(0xbf8a8dc2,0x98035f44),
+ LL(0x1e750c84,0xf40a71b9),LL(0x5dc6c469,0xc57f7b0c),LL(0x6fbc19c1,0x49a0e79c),LL(0xa48ebdb8,0x6b0f5889), LL(0xa07c4e9f,0x5d3fd084),LL(0xab27de14,0xc3830111),LL(0x33e08dcc,0x0e4929fe),LL(0x40bb73a3,0xf4a5ad24),
+ LL(0x490f97ca,0xde86c2bf),LL(0x67a1ce18,0x288f09c6),LL(0x1844478d,0x364bb886),LL(0xceedb040,0x7840fa42), LL(0x5a631b37,0x1269fdd2),LL(0xa47c8b7d,0x94761f1e),LL(0x481c6266,0xfc0c2e17),LL(0x3daa5fa7,0x85e16ea2),
+ LL(0x92491048,0xccd86033),LL(0xf4d402d7,0x0c2f6963),LL(0xdf6a865c,0x6336f7df),LL(0xb5c02a87,0x0a2a463c), LL(0xbf2f12ee,0xb0e29be7),LL(0x66bad988,0xf0a22002),LL(0x9123c1d7,0x27f87e03),LL(0x328a8c98,0x21669c55),
+ LL(0x92f14529,0x186b9803),LL(0x63954df3,0xd3d056cc),LL(0x175a46f6,0x2f03fd58),LL(0x11558558,0x63e34ebe), LL(0x5b80cfa5,0xe13fedee),LL(0xd401dbd1,0xe872a120),LL(0xe8a9d667,0x52657616),LL(0xe08d6693,0xbc8da4b6),
+ LL(0x1b703e75,0x370fb9bb),LL(0xd4338363,0x6773b186),LL(0xecef7bff,0x18dad378),LL(0x995677da,0xaac787ed), LL(0x0437164b,0x4801ea8b),LL(0x73fe795e,0xf430ad20),LL(0x8ee5eb73,0xb164154d),LL(0x108f7c0e,0x0884ecd8),
+ LL(0x5f520698,0x0e6ec096),LL(0x44f7b8d9,0x640631fe),LL(0xa35a68b9,0x92fd34fc),LL(0x4d40cf4e,0x9c5a4b66), LL(0x80b6783d,0x949454bf),LL(0x3a320a10,0x80e701fe),LL(0x1a0a39b2,0x8d1a564a),LL(0x320587db,0x1436d53d),
+ LL(0x6556c362,0xf5096e6d),LL(0xe2455d7e,0xbc23a3c0),LL(0x807230f9,0x3a7aee54),LL(0x22ae82fd,0x9ba1cfa6), LL(0x99c5d706,0x833a057a),LL(0x842315c9,0x8be85f4b),LL(0x66a72f12,0xd083179a),LL(0xcdcc73cd,0x2fc77d5d),
+ LL(0x5616ee30,0x22b88a80),LL(0xe7ab1083,0xfb09548f),LL(0x511270cd,0x8ad6ab0d),LL(0x6924d9ab,0x61f6c57a), LL(0x90aecb08,0xa0f7bf72),LL(0x0df784a4,0x849f87c9),LL(0xcfaf1d03,0x27c79c15),LL(0xc463face,0xbbf9f675),
+ LL(0x765ba543,0x91502c65),LL(0x42ea60dd,0x18ce3cac),LL(0x6e43ecb3,0xe5cee6ac),LL(0x68f2aeeb,0x63e4e910), LL(0xc85932ee,0x26234fa3),LL(0x4c90c44d,0x96883e8b),LL(0xa18a50f6,0x29b9e738),LL(0x3f0420df,0xbfc62b2a),
+ LL(0x6d3e1fa9,0xd22a7d90),LL(0xfe05b8a3,0x17115618),LL(0xbb2b9c01,0x2a0c9926),LL(0xe07e76a2,0xc739fcc6), LL(0x165e439a,0x540e9157),LL(0x6a9063d8,0x06353a62),LL(0x61e927a3,0x84d95594),LL(0xe2e0be7f,0x013b9b26),
+ LL(0x973497f1,0x4feaec3b),LL(0x093ebc2d,0x15c0f94e),LL(0x33af0583,0x6af5f227),LL(0xc61f3340,0x0c2af206), LL(0x4457397c,0xd25dbdf1),LL(0xcabcbae0,0x2e8ed017),LL(0xc2815306,0xe3010938),LL(0xe8c6cd68,0xbaa99337),
+ LL(0x3b0ec7de,0x08513182),LL(0x58df05df,0x1e1b822b),LL(0xa5c3b683,0x5c14842f),LL(0x3eba34ce,0x98fe977e), LL(0x0d5e8873,0xfd2316c2),LL(0xbd0d427d,0xe48d839a),LL(0x623fc961,0x495b2218),LL(0xb46fba5e,0x24ee56e7),
+ LL(0x91e4de58,0x9184a55b),LL(0xdfdea288,0xa7488ca5),LL(0xa8dcc943,0xa723862e),LL(0x849dc0fc,0x92d762b2), LL(0x091ff4a9,0x3c444a12),LL(0x0cada274,0x581113fa),LL(0x30d8eae2,0xb9de0a45),LL(0xdf6b41ea,0x5e0fcd85),
+ LL(0xc094dbb5,0x6233ea68),LL(0xd968d410,0xb77d062e),LL(0x58b3002d,0x3e719bbc),LL(0x3dc49d58,0x68e7dd3d), LL(0x013a5e58,0x8d825740),LL(0x3c9e3c1b,0x21311747),LL(0x7c99b6ab,0x0cb0a2a7),LL(0xc2f888f2,0x5c48a3b3),
+},
+/* digit=8 base_pwr=2^56 */
+{
+ LL(0x991724f3,0xc7913e91),LL(0x39cbd686,0x5eda799c),LL(0x63d4fc1e,0xddb595c7),LL(0xac4fed54,0x6b63b80b), LL(0x7e5fb516,0x6ea0fc69),LL(0xd0f1c964,0x737708ba),LL(0x11a92ca5,0x9628745f),LL(0x9a86967a,0x61f37958),
+ LL(0xaa665072,0x9af39b2c),LL(0xefd324ef,0x78322fa4),LL(0xc327bd31,0x3d153394),LL(0x3129dab0,0x81d5f271), LL(0xf48027f5,0xc72e0c42),LL(0x8536e717,0xaa40cdbc),LL(0x2d369d0f,0xf45a657a),LL(0xea7f74e6,0xb03bbfc4),
+ LL(0x0d738ded,0x46a8c418),LL(0xe0de5729,0x6f1a5bb0),LL(0x8ba81675,0xf10230b9),LL(0x112b33d4,0x32c6f30c), LL(0xd8fffb62,0x7559129d),LL(0xb459bf05,0x6a281b47),LL(0xfa3b6776,0x77c1bd3a),LL(0x7829973a,0x0709b380),
+ LL(0xa3326505,0x8c26b232),LL(0xee1d41bf,0x38d69272),LL(0xffe32afa,0x0459453e),LL(0x7cb3ea87,0xce8143ad), LL(0x7e6ab666,0x932ec1fa),LL(0x22286264,0x6cd2d230),LL(0x6736f8ed,0x459a46fe),LL(0x9eca85bb,0x50bf0d00),
+ LL(0x877a21ec,0x0b825852),LL(0x0f537a94,0x300414a7),LL(0x21a9a6a2,0x3f1cba40),LL(0x76943c00,0x50824eee), LL(0xf83cba5d,0xa0dbfcec),LL(0x93b4f3c0,0xf9538148),LL(0x48f24dd7,0x61744162),LL(0xe4fb09dd,0x5322d64d),
+ LL(0x3d9325f3,0x57447384),LL(0xf371cb84,0xa9bef2d0),LL(0xa61e36c5,0x77d2188b),LL(0xc602df72,0xbbd6a7d7), LL(0x8f61bc0b,0xba3aa902),LL(0x6ed0b6a1,0xf49085ed),LL(0xae6e8298,0x8bc625d6),LL(0xa2e9c01d,0x832b0b1d),
+ LL(0xf1f0ced1,0xa337c447),LL(0x9492dd2b,0x800cc793),LL(0xbea08efa,0x4b93151d),LL(0xde0a741e,0x820cf3f8), LL(0x1c0f7d13,0xff1982dc),LL(0x84dde6ca,0xef921960),LL(0x45f96ee3,0x1ad7d972),LL(0x29dea0c7,0x319c8dbe),
+ LL(0x7b82b99b,0xd3ea3871),LL(0x470eb624,0x75922d4d),LL(0x3b95d466,0x8f66ec54),LL(0xbee1e346,0x66e673cc), LL(0xb5f2b89a,0x6afe67c4),LL(0x290e5cd3,0x3de9c1e6),LL(0x310a2ada,0x8c278bb6),LL(0x0bdb323b,0x420fa384),
+ LL(0x0eb919b0,0x0ae1d63b),LL(0xa74b9620,0xd74ee51d),LL(0xa674290c,0x395458d0),LL(0x4620a510,0x324c930f), LL(0xfbac27d4,0x2d1f4d19),LL(0x9bedeeac,0x4086e8ca),LL(0x9b679ab8,0x0cdd211b),LL(0x7090fec4,0x5970167d),
+ LL(0xfaf1fc63,0x3420f2c9),LL(0x328c8bb4,0x616d333a),LL(0x57f1fe4a,0x7d65364c),LL(0x55e5c73a,0x9343e877), LL(0xe970e78c,0x5795176b),LL(0x60533627,0xa36ccebf),LL(0x09cdfc1b,0xfc7c7380),LL(0xb3fec326,0xb39a2afe),
+ LL(0x6224408a,0xb7ff1ba1),LL(0x247cfc5e,0xcc856e92),LL(0xc18bc493,0x01f102e7),LL(0x2091c727,0x4613ab74), LL(0xc420bf2b,0xaa25e89c),LL(0x90337ec2,0x00a53176),LL(0x7d025fc7,0xd2be9f43),LL(0x6e6fe3dc,0x3316fb85),
+ LL(0x9ac50814,0x27520af5),LL(0x9a8e4223,0xfdf95e78),LL(0x56bec5a0,0xb7e7df2a),LL(0xdf159e5d,0xf7022f7d), LL(0xcac1fe8f,0x93eeeab1),LL(0x37451168,0x8040188c),LL(0xd967dce6,0x7ee8aa8a),LL(0x3abc9299,0xfa0e79e7),
+ LL(0x2064cfd1,0x67332cfc),LL(0xb0651934,0x339c31de),LL(0x2a3bcbea,0x719b28d5),LL(0x9d6ae5c6,0xee74c82b), LL(0xbaf28ee6,0x0927d05e),LL(0x9d719028,0x82cecf2c),LL(0xddb30289,0x0b0d353e),LL(0xfddb2e29,0xfe4bb977),
+ LL(0x640bfd9e,0xbb5bb990),LL(0x82f62108,0xd226e277),LL(0x02ffdd56,0x4bf00985),LL(0x2ca1b1b5,0x7756758a), LL(0x5285fe91,0xc32b62a3),LL(0x8c9cd140,0xedbc546a),LL(0xaf5cb008,0x1e47a013),LL(0x073ce8f2,0xbca7e720),
+ LL(0x17a91cae,0xe10b2ab8),LL(0x08e27f63,0xb89aab65),LL(0xdba3ddf9,0x7b3074a7),LL(0x330c2972,0x1c20ce09), LL(0x5fcf7e33,0x6b9917b4),LL(0x945ceb42,0xe6793743),LL(0x5c633d19,0x18fc2215),LL(0xc7485474,0xad1adb3c),
+ LL(0x6424c49b,0x646f9679),LL(0x67c241c9,0xf888dfe8),LL(0x24f68b49,0xe12d4b93),LL(0xa571df20,0x9a6b62d8), LL(0x179483cb,0x81b4b26d),LL(0x9511fae2,0x666f9632),LL(0xd53aa51f,0xd281b3e4),LL(0x7f3dbd16,0x7f96a765),
+ LL(0x074a30ce,0xa7f8b5bf),LL(0x005a32e6,0xd7f52107),LL(0x50237ed4,0x6f9e0907),LL(0x8096fa2b,0x2f21da47), LL(0xeec863a0,0xf3e19cb4),LL(0x9527620a,0xd18f77fd),LL(0x407c1cf8,0x9505c81c),LL(0x1b6ec284,0x9998db4e),
+ LL(0xc247d44d,0x7e3389e5),LL(0x3f4f3d80,0x12507141),LL(0x4a78a6c7,0xd4ba0110),LL(0x767720be,0x312874a0), LL(0x75944370,0xded059a6),LL(0x3b2c0bdd,0xd6123d90),LL(0x51c108e3,0xa56b717b),LL(0x070623e9,0x9bb7940e),
+ LL(0x84ac066c,0x794e2d59),LL(0xe68c69a0,0xf5954a92),LL(0x4fd99dcc,0x28c52458),LL(0xb1012517,0x60e639fc), LL(0x7de79248,0xc2e60125),LL(0xf12fc6d7,0xe9ef6404),LL(0x2a3b5d32,0x4c4f2808),LL(0xc768eb8a,0x865ad32e),
+ LL(0x13fb70b6,0xac02331b),LL(0x95599b27,0x037b44c1),LL(0x60bd082c,0x1a860fc4),LL(0xc980cd01,0xa2e25745), LL(0x1da0263e,0xee3387a8),LL(0x2d10f3d6,0x931bfb95),LL(0xa1f24a32,0x5b687270),LL(0xca494b86,0xf140e65d),
+ LL(0xb2f1ac7a,0x4f4ddf91),LL(0x760fee27,0xf99eaabb),LL(0x49c228e5,0x57f4008a),LL(0x1cf713bb,0x090be440), LL(0x5004f022,0xac91fbe4),LL(0x569e1af6,0xd838c2c2),LL(0x0f1daaa5,0xd6c7d20b),LL(0x1bbb02c0,0xaa063ac1),
+ LL(0x59558a78,0x0938a422),LL(0x8435da2f,0x5343c669),LL(0x034410dc,0x96f67b18),LL(0x84510804,0x7cc1e424), LL(0x16dfbb7d,0x86a1543f),LL(0x5b5bd592,0x921fa942),LL(0xb33dd03c,0x9dcccb6e),LL(0xb843f51e,0x8581ddd9),
+ LL(0x81d73c9e,0x54935fcb),LL(0x0a5e97ab,0x6d07e979),LL(0xcf3a6bab,0x4dc7b30a),LL(0x170bee11,0x147ab1f3), LL(0x9fafdee4,0x0aaf8e3d),LL(0x538a8b95,0xfab3dbcb),LL(0x6ef13871,0x405df4b3),LL(0x088d5a49,0xf1f4e9cb),
+ LL(0x66b33f1d,0x9bcd24d3),LL(0x5ce445c0,0x3b97b820),LL(0xba93ff61,0xe2926549),LL(0x4dafe616,0xd9c341ce), LL(0x16efb6f3,0xfb30a76e),LL(0x605b953c,0xdf24b8ca),LL(0xc2fffb9f,0x8bd52afe),LL(0xe19d0b96,0xbbac5ff7),
+ LL(0x459afccd,0x43c01b87),LL(0xb7432652,0x6bd45143),LL(0x55b5d78e,0x84734530),LL(0x1554ba7d,0x81088fdb), LL(0x1e269375,0xada0a52c),LL(0x2dc5ec10,0xf9f037c4),LL(0x94bfbc11,0xc0660607),LL(0xc9c40d2f,0xc0a630bb),
+ LL(0xab64c31e,0x5efc797e),LL(0x74507144,0xffdb1dab),LL(0x1ca6790c,0xf6124287),LL(0xe69bf1bf,0xe9609d81), LL(0x00d24fc9,0xdb898595),LL(0xe51fb417,0x9c750333),LL(0xfef7bbde,0x51830a91),LL(0x945f585c,0x0ce67dc8),
+ LL(0x4763eb50,0x9a730ed4),LL(0xc1ab0d66,0x24a0e221),LL(0x648748f3,0x643b6393),LL(0x6d3c6291,0x1982daa1), LL(0x8bbc5549,0x6f00a9f7),LL(0x7f36384e,0x7a1783e1),LL(0xde977f50,0xe8346323),LL(0xb245502a,0x91ab688d),
+ LL(0x6d0bdd66,0x331ab6b5),LL(0x64b71229,0x0a6ef32e),LL(0xfe7c352f,0x1028150e),LL(0xce7b39d3,0x27e04350), LL(0xc1070c82,0x2a3c8acd),LL(0x80c9feef,0xfb2034d3),LL(0x709f3729,0x2d729621),LL(0x62cb4549,0x8df290bf),
+ LL(0xfc2e4326,0x02f99f33),LL(0x5eddf032,0x3b30076d),LL(0x0c652fb5,0xbb21f8cf),LL(0xed91cf7b,0x314fb49e), LL(0x2f700750,0xa013eca5),LL(0x712a4575,0x2b9e3c23),LL(0xaf30fbb0,0xe5355557),LL(0x7c77e771,0x1ada3516),
+ LL(0x7b135670,0x45f6ecb2),LL(0x7cfc202e,0xe85d19df),LL(0x58d1be9f,0x0f1b50c7),LL(0xead2e344,0x5ebf2c0a), LL(0xabc199c9,0x1531fe4e),LL(0x56bab0ae,0xc7032592),LL(0x6c1fec54,0x16ab2e48),LL(0x04280188,0x0f87fda8),
+ LL(0x609e4a74,0xdc9f46fc),LL(0xba667f91,0x2a44a143),LL(0xb4d83436,0xbc3d8b95),LL(0xc7bd2958,0xa01e4bd0), LL(0x73483c90,0x7b182932),LL(0xa7c7b598,0xa79c6aa1),LL(0xeaaac07e,0xbf3983c6),LL(0x96e0d4e6,0x8f18181e),
+ LL(0x051af62b,0x8553d37c),LL(0x0bf94496,0xe9a998eb),LL(0xb0d59aa1,0xe0844f9f),LL(0xe6afb813,0x983fd558), LL(0x65d69804,0x9670c0ca),LL(0x6ea5ff2d,0x732b22de),LL(0x5fd8623b,0xd7640ba9),LL(0xa6351782,0x9f619163),
+ LL(0xacee5043,0x0bfc27ee),LL(0x2eb10f02,0xae419e73),LL(0x8943fb05,0x19c028d1),LL(0xff13aa2a,0x71f01cf7), LL(0x8887a132,0x7790737e),LL(0x66318410,0x67513309),LL(0x7ddb795e,0x9819e8a3),LL(0xdad100b2,0xfecb8ef5),
+ LL(0x3021926a,0x59f74a22),LL(0x6f9b4c1c,0xb7c28a49),LL(0x912ad0ab,0xed1a733f),LL(0x01a5659c,0x42a910af), LL(0x7bd68cab,0x3842c6e0),LL(0x76d70ac8,0x2b57fa38),LL(0x3c53aaeb,0x8a6707a8),LL(0x65b4db18,0x62c1c510),
+ LL(0xb2d09dc7,0x8de2c1fb),LL(0x266bd23b,0xc3dfed12),LL(0xd5b27db6,0x927d039b),LL(0x103243da,0x2fb2f0f1), LL(0x80be7399,0xf855a07b),LL(0x1f9f27a8,0xed9327ce),LL(0x729bdef7,0xa0bd99c7),LL(0x28250d88,0x2b67125e),
+ LL(0x8670ced7,0x784b26e8),LL(0xc31bd3b4,0xe3dfe41f),LL(0xbcc85cbc,0x9e353a06),LL(0x60178a9d,0x302e2909), LL(0xa6eac16e,0x860abf11),LL(0xaa2b3aac,0x76447000),LL(0x850afdab,0x46ff9d19),LL(0xfdb2d4c1,0x35bdd6a5),
+ LL(0x7e5c9ce9,0xe82594b0),LL(0x20af346e,0x0f379e53),LL(0xbc65ad4a,0x608b31e3),LL(0x267c4826,0x710c6b12), LL(0x71954cf1,0x51c966f9),LL(0x0d0aa215,0xb1cec793),LL(0x86bd23a8,0x1f155989),LL(0xf9452e86,0xae2ff99c),
+ LL(0x340ceaa2,0xd8dd953c),LL(0x2e2e9333,0x26355275),LL(0x8586f06d,0x15d4e5f9),LL(0xf7cab546,0xd6bf94a8), LL(0xb76a9af0,0x33c59a0a),LL(0xba095af7,0x52740ab3),LL(0x24389ca0,0xc444de8a),LL(0x706da0cb,0xcc6f9863),
+ LL(0x6b2515cf,0xb5a741a7),LL(0x9585c749,0x71c41601),LL(0xe683de97,0x78350d4f),LL(0x63d0b5f5,0x31d61524), LL(0xfbce090b,0x7a0cc5e1),LL(0xfbcb2a5b,0xaac927ed),LL(0x20d84c35,0xe920de49),LL(0x22b4de26,0x8c06a0b6),
+ LL(0xafe7ddf3,0xd34dd58b),LL(0xc1e6e55b,0x55851fed),LL(0x960696e7,0xd1395616),LL(0x5f22705f,0x940304b2), LL(0xb0a2a860,0x6f43f861),LL(0x0e7cc981,0xcf121282),LL(0x0ab64a96,0x12186212),LL(0xb789383c,0x09215b9a),
+ LL(0x37387c09,0x311eb305),LL(0xf03ee760,0xc5832fce),LL(0x32f7ea19,0x30358f58),LL(0x91d53551,0xe01d3c34), LL(0xda48ea80,0x1ca5ee41),LL(0xcf4fa4c1,0x34e71e8e),LL(0x7af1e1c7,0x312abd25),LL(0x2153f4a5,0xe3afcdeb),
+ LL(0x00235e9a,0x9d5c84d7),LL(0x8c4c836f,0x0308d3f4),LL(0x89332de5,0xc0a66b04),LL(0x89e566ef,0x610dd399), LL(0xd1ac1635,0xf8eea460),LL(0x20a2c0df,0x84cbb3fb),LL(0xe74a48c5,0x40afb488),LL(0xd326b150,0x29738198),
+ LL(0xa6d74081,0x2a17747f),LL(0x55a26214,0x60ea4c05),LL(0x1f88c5fe,0x53514bb4),LL(0x7e83426c,0xedd64567), LL(0x96460b25,0xd5d6cbec),LL(0x68dc115e,0xa12fd0ce),LL(0x697840ea,0xc5bc3ed2),LL(0xa6331e31,0x969876a8),
+ LL(0x472ff580,0x60c36217),LL(0x4ad41393,0xf4229705),LL(0xa03b8b92,0x4bd99ef0),LL(0xc144f4f6,0x501c7317), LL(0x18464945,0x159009b3),LL(0x74c5c6be,0x6d5e594c),LL(0x321a3660,0x2d587011),LL(0x3898d022,0xd1e184b1),
+ LL(0x4c6a7e04,0x5ba04752),LL(0x45550b65,0x47fa1e2b),LL(0x48c0a9a5,0x9419daf0),LL(0x7c243236,0x66362953), LL(0x5cb12a88,0xcd0744b1),LL(0x2b646188,0x561b6f9a),LL(0x66c2c0c0,0x599415a5),LL(0x0f83f09a,0xbe3f0859),
+ LL(0xb92041b8,0x9141c5be),LL(0x26477d0d,0x01ae38c7),LL(0xd12c7a94,0xca8b71f3),LL(0x765c70db,0xfab5b31f), LL(0x487443e9,0x76ae7492),LL(0x990d1349,0x8595a310),LL(0x7d460a37,0xf8dbeda8),LL(0x1e45a38f,0x7f7ad082),
+ LL(0x1059705a,0xed1d4db6),LL(0xe6b9c697,0xa3dd492a),LL(0x6eb38bd5,0x4b92ee3a),LL(0x67cc0bb7,0xbab2609d), LL(0x6e70ee82,0x7fc4fe89),LL(0x13e6b7e3,0xeff2c56e),LL(0x34d26fca,0x9b18959e),LL(0x889d6b45,0x2517ab66),
+ LL(0xbdefdd4f,0xf167b4e0),LL(0xf366e401,0x69958465),LL(0xa73bbec0,0x5aa368ab),LL(0x7b240c21,0x12148709), LL(0x18969006,0x378c3233),LL(0xe1fe53d1,0xcb4d73ce),LL(0x130c4361,0x5f50a80e),LL(0x7ef5212b,0xd67f5951),
+ LL(0x9e70c72e,0xf145e21e),LL(0x5566d2fb,0xb2e52e29),LL(0x032397f5,0x44eaba4a),LL(0x7e31a7de,0x5e56937b), LL(0x456c61e1,0x68dcf517),LL(0xa8b0a388,0xbc2e954a),LL(0x60a8b755,0xe3552fa7),LL(0x73ad0cde,0x03442dae),
+ LL(0xceb26210,0x37ffe747),LL(0x787baef9,0x983545e8),LL(0x86a3de31,0x8b8c8535),LL(0xfacd46db,0xc621dbcb), LL(0x59266fbb,0x82e442e9),LL(0x339d471c,0xa3514c37),LL(0x62cdad96,0x3a11b771),LL(0xecf9bdf0,0xf0cb3b3c),
+ LL(0x478e2135,0x3fcbdbce),LL(0xbda35342,0x7547b5cf),LL(0x8a677af6,0xa97e81f1),LL(0x28817987,0xc8c2bf83), LL(0x45580985,0xdf07eaaf),LL(0xc93b45cb,0xc68d1f05),LL(0xc77b4cac,0x106aa2fe),LL(0x04a7ae86,0x4c1d8afc),
+ LL(0x9eb45ab2,0xdb41c3fd),LL(0xd4b22e74,0x5b234b5b),LL(0xf215958a,0xda253dec),LL(0xa04edfa0,0x67e0606e), LL(0xef751b11,0xabbbf070),LL(0xf6f06dce,0xf352f175),LL(0x6839f6b4,0xdfc4b6af),LL(0x9959848e,0x53ddf9a8),
+ LL(0xc21520b0,0xda49c379),LL(0xdbd5d1b6,0x90864ff0),LL(0x5f49c7f7,0x2f055d23),LL(0xa796b2d8,0xe51e4e6a), LL(0x5c9dc340,0xc361a67f),LL(0xbca7c620,0x5ad53c37),LL(0x32c756d0,0xda1d6588),LL(0x8bb67e13,0xad60d911),
+ LL(0x0eeec8c6,0xd6c47bdf),LL(0x078a1821,0x4a27fec1),LL(0xc3099524,0x081f7415),LL(0x82cd8060,0x8effdf0b), LL(0x65842df8,0xdb70ec1c),LL(0xd319a901,0x8821b358),LL(0xde42b529,0x72ee56ee),LL(0x236e4286,0x5bb39592),
+ LL(0xfd6f7140,0xd1183316),LL(0xbd8e81f7,0xf9fadb5b),LL(0x5a02d962,0x701d5e0c),LL(0x1b601324,0xfdee4dbf), LL(0x35d7620e,0xbed17407),LL(0xf48c0012,0x04e3c2c3),LL(0x3455449a,0x9ee29da7),LL(0x91a836c4,0x562cdef4),
+ LL(0x47701097,0x8f682a5f),LL(0xff88d0c2,0x617125d8),LL(0x57bb86dd,0x948fda24),LL(0x289f7286,0x348abb8f), LL(0x99d94bbd,0xeb10eab5),LL(0x4684d160,0xd51ba28e),LL(0x30c8f41a,0xabe0e51c),LL(0x13254f4a,0x66588b45),
+ LL(0xfad097a5,0x147ebf01),LL(0x610e815d,0x49883ea8),LL(0x8a11de56,0xe44d60ba),LL(0x827a7a6d,0xa970de6e), LL(0x5e17fc19,0x2be41424),LL(0x01214057,0xd833c657),LL(0x363e723f,0x1375813b),LL(0xe6a52e9b,0x6820bb88),
+ LL(0xd875d56a,0x7e7f6970),LL(0x51fbf6bf,0xd6a0a9ac),LL(0xa3083c12,0x54ba8790),LL(0x6ae7eb64,0xebaeb23d), LL(0xb99a907a,0xa8685c3a),LL(0x026bf40b,0xf1e74550),LL(0xc802cd9e,0x7b73a027),LL(0x4fef4635,0x9a8a927c),
+ LL(0x08191224,0xe1b6f60c),LL(0xde4ec091,0xc4126ebb),LL(0x4ae38d84,0xe1dff4dc),LL(0x4f2ef985,0xde3f57db), LL(0xd446a1dd,0x34964337),LL(0x859e77f6,0x7bf217a0),LL(0x8e1d13f5,0x8ff10527),LL(0x74eeae27,0xa304ef03),
+ LL(0xd19dfa5a,0xfc6f5e47),LL(0x7fad982b,0xdb007de3),LL(0x613715f5,0x28205ad1),LL(0x7889529e,0x251e6729), LL(0x1ae98e78,0x72705184),LL(0x271cac32,0xf818537d),LL(0xb7f410f5,0xc8a15b7e),LL(0x81f62393,0xc474356f),
+ LL(0xc242316b,0x92dbdc5a),LL(0xdbf4aff5,0xabe060ac),LL(0x909a8ec6,0x6e8c38fe),LL(0x6116cb94,0x43e514e5), LL(0x07d784f9,0x2078fa38),LL(0xf4b5b357,0x1161a880),LL(0x13adea3d,0x5283ce79),LL(0xcc6a910b,0x0756c3e6),
+ LL(0xaaa79697,0x60bcfe01),LL(0x56391db1,0x04a73b29),LL(0x189b45a0,0xdd8dad47),LL(0x48d5b8d9,0xbfac0dd0), LL(0x7d3d2ec2,0x34ab3af5),LL(0x207bd3af,0x6fa2fc2d),LL(0x66550ded,0x9ff40092),LL(0x1fd5b913,0x719b3e87),
+ LL(0x6d17fbc7,0xa573a496),LL(0x73d2b24e,0x0cd1a70a),LL(0xb2676937,0x34e2c5ca),LL(0xbf669f21,0xe7050b06), LL(0x1ede9046,0xfbe948b6),LL(0x97662659,0xa0530051),LL(0xf10124c5,0x58cbd4ed),LL(0xdd6c06c8,0xde2646e4),
+ LL(0x8cad38c0,0x332f8108),LL(0x6bd68ae2,0x471b7e90),LL(0x0d8e27a3,0x56ac3fb2),LL(0x136b4b0d,0xb54660db), LL(0xa6fd8de4,0x123a1e11),LL(0xa37799ef,0x44dbffea),LL(0xce6ac17c,0x4540b977),LL(0xaf60acef,0x495173a8),
+},
+/* digit=9 base_pwr=2^63 */
+{
+ LL(0x391c2a82,0x9ebb284d),LL(0x158308e8,0xbcdd4863),LL(0x83f1edca,0x006f16ec),LL(0x695dc6c8,0xa13e2c37), LL(0x4a057a87,0x2ab756f0),LL(0xa6b48f98,0xa8765500),LL(0x68651c44,0x4252face),LL(0xe1765e02,0xa52b540b),
+ LL(0x16a0d2bb,0x4f922fc5),LL(0x1a623499,0x0d5cc16c),LL(0x57c62c8b,0x9241cf3a),LL(0xfd1b667f,0x2f5e6961), LL(0xf5a01797,0x5c15c70b),LL(0x60956192,0x3d20b44d),LL(0x071fdb52,0x04911b37),LL(0x8d6f0f7b,0xf648f916),
+ LL(0xe60b7cf7,0x6dc1acaf),LL(0x84a9d869,0x25860a50),LL(0xe7ba8ac4,0x56fc6f09),LL(0x6148d29e,0x828c5bd0), LL(0xdc55ae5f,0xac6b435e),LL(0xc0117411,0xa527f56c),LL(0xfd24342c,0x94d5045e),LL(0x70b67c0d,0x2c4c0a35),
+ LL(0xfac61d9a,0x027cc8b8),LL(0xe3c6fe8a,0x7d25e062),LL(0xe5bff503,0xe08805bf),LL(0x6ff632f7,0x13271e6c), LL(0x232f76a5,0x55dca6c0),LL(0x701ef426,0x8957c32d),LL(0xa10a5178,0xee728bcb),LL(0xb62c5173,0x5ea60411),
+ LL(0xd0b8892b,0xfc4e964e),LL(0x9301bb74,0x9ea17683),LL(0xfcc48626,0x6265c5ae),LL(0xbb3e9102,0xe60cf82e), LL(0xd4df5531,0x57adf797),LL(0x8deeefe2,0x235b59a1),LL(0x3f306eb1,0x60adcf58),LL(0x3d09492d,0x105c2753),
+ LL(0xb5def996,0x4090914b),LL(0x233dd1e7,0x1cb69c83),LL(0x9b3d5e76,0xc1e9c1d3),LL(0xfccf6012,0x1f3338ed), LL(0x2f5378a8,0xb1e95d0d),LL(0x2f00cd21,0xacf4c2c7),LL(0xeb5fe290,0x6e984240),LL(0x248088ae,0xd66c038d),
+ LL(0xf94d70cf,0x804d264a),LL(0x7314bf7e,0xbdb802ef),LL(0x4333ed02,0x8fb54de2),LL(0x285635d9,0x740461e0), LL(0x365e9383,0x4113b2c8),LL(0x3fdef652,0xea762c83),LL(0x47b956c1,0x4eec6e2e),LL(0x65620fa4,0xa3d814be),
+ LL(0xb4d8bc50,0x9ad5462b),LL(0xa9195770,0x181c0b16),LL(0x78412a68,0xebd4fe1c),LL(0xc0dff48c,0xae0341bc), LL(0x7003e866,0xb6bc45cf),LL(0x8a24a41b,0xf11a6dea),LL(0xd04c24c2,0x5407151a),LL(0xda5b7b68,0x62c9d27d),
+ LL(0x88cceff6,0x2e964235),LL(0x8b07ed69,0x8594c54f),LL(0xc84d0d0d,0x1578e73c),LL(0xff532868,0x7b4e1055), LL(0xb5ec995a,0xa348c0d5),LL(0x14289a54,0xbf4b9d55),LL(0x58fbd777,0x9ba155a6),LL(0x1a84491d,0x186ed7a8),
+ LL(0x614c0900,0xd4992b30),LL(0xbd00c24b,0xda98d121),LL(0x7ec4bfa1,0x7f534dc8),LL(0x37dc34bc,0x4a5ff674), LL(0x1d7ea1d7,0x68c196b8),LL(0x80a6d208,0x38cf2893),LL(0xe3cbbd6e,0xfd56cd09),LL(0x4205a5b6,0xec72e27e),
+ LL(0xa44f77f7,0x15ea68f5),LL(0xb43c52bc,0x7aa5f9fd),LL(0x94f0e609,0x86ff676f),LL(0x2e2d432b,0xa4cde963), LL(0xeee470af,0x8cafa0c0),LL(0x8a3f5ec8,0x84137d0e),LL(0xfaa31231,0xebb40411),LL(0x6f7f7ccf,0xa239c13f),
+ LL(0xa8afd30b,0x32865719),LL(0x8a826dce,0x86798328),LL(0xc4a8fbe0,0xdf04e891),LL(0xebf56ad3,0xbb6b6e1b), LL(0x471f1ff0,0x0a695b11),LL(0xbe15baf0,0xd76c3389),LL(0xbe96c43e,0x018edb95),LL(0x90794158,0xf2beaaf4),
+ LL(0xc3076a27,0x152db09e),LL(0xe416545d,0x5e82908e),LL(0x356d6f2e,0xa2c41272),LL(0x31fd74e1,0xdc9c9642), LL(0x519bf615,0x66ceb88d),LL(0x05a2274e,0xe29ecd76),LL(0xbf5e2fa0,0x3a0473c4),LL(0x64284e67,0x6b6eb671),
+ LL(0xb88756dd,0xe8b97932),LL(0xf17e3e61,0xed4e8652),LL(0x3ee1c4a4,0xc2dd1499),LL(0x597f8c0e,0xc0aaee17), LL(0x6c168af3,0x15c4edb9),LL(0xb39ae875,0x6563c7bf),LL(0x20adb436,0xadfadb6f),LL(0x9a042ac0,0xad55e8c9),
+ LL(0xb76da1f5,0x975a1ed8),LL(0xa58acb94,0x10dfa466),LL(0xac060282,0x8dd7f7e3),LL(0x572a051e,0x6813e66a), LL(0x350cb901,0xb4ccae1e),LL(0x50cb7822,0xb653d656),LL(0xdfab3b87,0x42484710),LL(0x9b670fd0,0xcd7ee537),
+ LL(0x523b8bf6,0x0a50b12e),LL(0x8f910c1b,0x8009eb5b),LL(0x4a167588,0xf535af82),LL(0xfb2a2abd,0x0f835f9c), LL(0x2afceb62,0xf59b2931),LL(0x169d383f,0xc797df2a),LL(0x66ac02b0,0xeb3f5fb0),LL(0xdaa2d0ca,0x029d4c6f),
+ LL(0xafab4bc5,0xd4059bc1),LL(0x56783247,0x833f5c6f),LL(0x8d2d3605,0xb5346630),LL(0xd34d8433,0x83387891), LL(0xadd9419a,0xd973b30f),LL(0xafe3fce8,0xbcca1099),LL(0x0809aac6,0x08178315),LL(0x540f0f11,0x01b7f21a),
+ LL(0x909523c8,0x65c29219),LL(0xa3a1c741,0xa62f648f),LL(0x60c9e55a,0x88598d4f),LL(0x0e4f347a,0xbce9141b), LL(0x35f9b988,0x9af97d84),LL(0x320475b6,0x0210da62),LL(0x9191476c,0x3c076e22),LL(0x44fc7834,0x7520dbd9),
+ LL(0xc1ab1bbd,0x6a6b2cfe),LL(0xdc650938,0xef8a65be),LL(0x805d7bc4,0x72855540),LL(0xed11fdfd,0xda389396), LL(0x74660876,0xa9d5bd36),LL(0xb45dff35,0x11d67c54),LL(0xa4f5da94,0x6af7d148),LL(0xc0bbeb31,0xbb8d4c3f),
+ LL(0xe0a1b12a,0x87a7ebd1),LL(0x770ba95f,0x1e4ef88d),LL(0xdc2ae9cb,0x8c33345c),LL(0x01cc8403,0xcecf1276), LL(0x1b39b80f,0x687c012e),LL(0x35c33ba4,0xfd90d0ad),LL(0x5c9661c2,0xa3ef5a67),LL(0xe017429e,0x368fc88e),
+ LL(0x196a2fa2,0xd30c6761),LL(0xbd5b312e,0x931b9817),LL(0x72f54a31,0xba01000c),LL(0x66eaa541,0xa203d2c8), LL(0x98939db3,0xf2abdee0),LL(0x3e606c02,0xe37d6c2c),LL(0x521ff643,0xf2921574),LL(0xd7e2fca3,0x2781b3c4),
+ LL(0x7850ec06,0x664300b0),LL(0x7d3a10cf,0xac5a38b9),LL(0xe34ab39d,0x9233188d),LL(0x5072cbb9,0xe77057e4), LL(0xb59e78df,0xbcf0c042),LL(0x1d97de52,0x4cfc91e8),LL(0x3ee0ca4a,0x4661a26c),LL(0xfb8507bc,0x5620a4c1),
+ LL(0x049f842c,0x4b44d4aa),LL(0x1540e82b,0xceabc5d5),LL(0x15c6f156,0x306710fd),LL(0x63db1d72,0xbe5ae52b), LL(0x334957f1,0x06f1e7e6),LL(0x31144a70,0x57e388f0),LL(0xdf96447b,0xfb69bb2f),LL(0x73e38a12,0x0f78ebd3),
+ LL(0x2b7ce542,0xb8222605),LL(0x7472bde1,0xe6d4ce99),LL(0x09d2f4da,0x53e16ebe),LL(0x53b92b2e,0x180ff42e), LL(0x2c34a1c6,0xc59bcc02),LL(0x422c46c2,0x3803d6f9),LL(0x5c14a8a2,0x18aff74f),LL(0x10a08b28,0x55aebf80),
+ LL(0x7135593f,0x66097d58),LL(0x2be570cd,0x32e6eff7),LL(0x2a8c860d,0x584e6a10),LL(0xa2eb4163,0xcd185890), LL(0x6d97e134,0x7ceae99d),LL(0xdd8447ce,0xd42c6b70),LL(0xb8c50273,0x59ddbb4a),LL(0x3cf34e1e,0x03c612df),
+ LL(0x04b6c5a0,0x84b9ca15),LL(0x18f0e3a3,0x35216f39),LL(0xbd986c00,0x3ec2d2bc),LL(0xd19228fe,0x8bf546d9), LL(0x4cd623c3,0xd1c655a4),LL(0x502b8e5a,0x366ce718),LL(0xeea0bfe7,0x2cfc84b4),LL(0xcf443e8e,0xe01d5cee),
+ LL(0x036520f8,0x8ec045d9),LL(0x92d40e98,0xdfb3c3d1),LL(0xcc559a04,0x0bac4cce),LL(0x240ea6b1,0x35eccae5), LL(0xf8a5a0ac,0x180b32db),LL(0xeb699700,0x547972a5),LL(0xca26bca0,0xa3765801),LL(0xa647f25a,0x57e09d0e),
+ LL(0x2fdd23cc,0xb956970e),LL(0x5682e971,0xb80288bc),LL(0x9ae86ebc,0xe6e6d91e),LL(0x8c9f1939,0x0564c83f), LL(0x39560368,0x551932a2),LL(0x049c28e2,0xe893752b),LL(0xa6a158c3,0x0b03cee5),LL(0x04964263,0xe12d656b),
+ LL(0x63e3bc1d,0x4b47554e),LL(0x45044ff7,0xc719b6a2),LL(0xe48daa07,0x4f24d30a),LL(0xc8c1edc3,0xa3f37556), LL(0x0700d360,0x9a47bf76),LL(0x822ae4e2,0xbb1a1824),LL(0x89f1fb4c,0x22e275a3),LL(0x9968c5f5,0x72b1aa23),
+ LL(0xbe063f64,0xa75feaca),LL(0xbce47a09,0x9b392f43),LL(0x1ad07aca,0xd4241509),LL(0x8d26cd0f,0x4b0c591b), LL(0x92f1169a,0x2d42ddfd),LL(0x4cbf2392,0x63aeb1ac),LL(0x0691a2af,0x1de9e877),LL(0xd98021da,0xebe79af7),
+ LL(0x40e50acf,0xcfdf2a4e),LL(0xaf01d665,0xf0a98ad7),LL(0x1831be1f,0xefb640bf),LL(0x80e9ada0,0x6fe8bd2f), LL(0x6cafbc91,0x94c103a1),LL(0x8308e08c,0x170f8759),LL(0x9780ff4f,0x5de2d2ab),LL(0x45b201f2,0x666466bc),
+ LL(0xf5b343bc,0x58af2010),LL(0xf2f142fe,0x0f2e400a),LL(0xa85f4bdf,0x3483bfde),LL(0x03bfeaa9,0xf0b1d093), LL(0xc7081603,0x2ea01b95),LL(0x3dba1097,0xe943e4c9),LL(0xb438f3a6,0x47be92ad),LL(0xe5bf6636,0x00bb7742),
+ LL(0x824297b4,0x136b7083),LL(0x5584455f,0x9d0e5580),LL(0xf1c7d69e,0xab48cedc),LL(0x2a256e76,0x53a9e481), LL(0x65eb2413,0x0402b0e0),LL(0x8fc407a7,0xdadbbb84),LL(0x8d7f5492,0xa65cd5a4),LL(0x74bae294,0x21d44293),
+ LL(0x3b5f1cc4,0x66917ce6),LL(0xce872e62,0x37ae52ea),LL(0x2905f244,0xbb087b72),LL(0x1e6af74f,0x12077086), LL(0x1058edea,0x4b644e49),LL(0xb638ca1d,0x827510e3),LL(0x6038591c,0x8cf2b704),LL(0xfe635063,0xffc8b47a),
+ LL(0x1b4d5e63,0x3ae220e6),LL(0x9d961b4b,0xbd864742),LL(0x9bd16bed,0x610c107e),LL(0x1127147b,0x4270352a), LL(0x64cfc50e,0x7d17ffe6),LL(0x1e36cb42,0x50dee01a),LL(0x35dc5f9a,0x068a7622),LL(0xdf53f62c,0x9a08d536),
+ LL(0x6be5f7de,0x4ed71457),LL(0xc2263c9e,0xd93006f8),LL(0xcacacb36,0xe073694c),LL(0x3ae118ab,0x2ff7a5b4), LL(0xcd871236,0x3cce53f1),LL(0xc2aa6d52,0xf156a39d),LL(0xb198d76d,0x9cc5f271),LL(0x81383d39,0xbc615b6f),
+ LL(0xde3eee6b,0xa54538e8),LL(0xab910d91,0x58c77538),LL(0x58d278bd,0x31e5bdbc),LL(0xb963acae,0x3cde4adf), LL(0x5302169c,0xb1881fd2),LL(0xa989ed8b,0x8ca60fa0),LL(0xff96a0ee,0xa1999458),LL(0xac6c283d,0xc1141f03),
+ LL(0x6dfafed3,0x7677408d),LL(0x39661588,0x33a01653),LL(0x0b726fa0,0x3c9c15ec),LL(0x6c9b56da,0x090cfd93), LL(0xa3c40af5,0xe34f4bae),LL(0xd21129f1,0x3469eadb),LL(0x1e207ce8,0xcc51674a),LL(0xc83b1ef9,0x1e293b24),
+ LL(0x1e6c0bb4,0x17173d13),LL(0x90776d35,0x19004695),LL(0x6de6f922,0xe7980e34),LL(0xf4dd9a22,0x873554cb), LL(0xcbf18a51,0x0316c627),LL(0x3032c081,0x4d93651b),LL(0x3946834d,0x207f2771),LL(0x30cdbf80,0x2c08d7b4),
+ LL(0x86df2a61,0x137a4fb4),LL(0xecf7b4a2,0xa1ed9c07),LL(0x7bd042ff,0xb2e460e2),LL(0x5f62f5ec,0xb7f5e2fa), LL(0xcc2423b7,0x7aa6ec6b),LL(0xba63eea7,0x75ce0a7f),LL(0xf250a6e1,0x67a45fb1),LL(0xe53cdc9f,0x93bc919c),
+ LL(0x871942df,0x9271f56f),LL(0x7859ad66,0x2372ff6f),LL(0x33cb1a78,0x5f4c2b96),LL(0x5838aa83,0xe3e29101), LL(0xe4e8110c,0xa7ed1611),LL(0x330198ce,0x2a2d70d5),LL(0x6720efe0,0xbdf132e8),LL(0x66a471bf,0xe61a8962),
+ LL(0x825808bd,0x796d3a85),LL(0x3fd6e902,0x51dc3cb7),LL(0x916219d1,0x643c768a),LL(0xa2ad7d32,0x36cd7685), LL(0xb22922a4,0xe3db9d05),LL(0xdba29660,0x6494c87e),LL(0xbcd2ebc7,0xf0ac91df),LL(0x45107f8d,0x4deb57a0),
+ LL(0xc3d12a73,0x42271f59),LL(0xa5c2c51d,0x5f71687c),LL(0x05797bcb,0xcb1f50c6),LL(0xd6d34eb0,0x29ed0ed9), LL(0x4683c2eb,0xe5fe5b47),LL(0x97447c46,0x4956eeb5),LL(0x71207167,0x5b163a43),LL(0x0248c5ef,0x93fa2fed),
+ LL(0x31f63950,0x67930af2),LL(0x14caa2c9,0xa77797c1),LL(0x27ac7e62,0x526e80ee),LL(0x58b28aec,0xe1e6e626), LL(0xb3c9fef0,0x636178b0),LL(0x6d5f90be,0xaf7752e0),LL(0xeece51cf,0x94ecaf18),LL(0xca806e1f,0x2864d0ed),
+ LL(0x97c69134,0x6de2e383),LL(0xeb291293,0x5a42c316),LL(0x6a60bae0,0xc7779219),LL(0x6b7599d1,0xa24de346), LL(0xb75d4941,0x49d374aa),LL(0x2d501ff0,0x98900586),LL(0xeb7974cf,0x9f16d40e),LL(0xcdd8c115,0x1033860b),
+ LL(0x2094cec3,0xb6c69ac8),LL(0x403b770c,0x9976fb88),LL(0x4859590d,0x1dea026c),LL(0x8562d1fd,0xb6acbb46), LL(0x44569d85,0x7cd6c461),LL(0x97f0891d,0xc3190a36),LL(0x48d5a17d,0xc6f53195),LL(0xd749abc8,0x7d919966),
+ LL(0xdd1c8a20,0x65104837),LL(0x2f683419,0x7e5410c8),LL(0xbe94022e,0x958c3ca8),LL(0x6145dac2,0x605c3197), LL(0x01683d54,0x3fc07501),LL(0x595b1234,0x1d7127c5),LL(0x9481277f,0x10b8f87c),LL(0xe65a1adb,0x677db2a8),
+ LL(0xddce3345,0xec2fccaa),LL(0x012a4350,0x2a6811b7),LL(0xac598bdc,0x96760ff1),LL(0xd1bf4128,0x054d652a), LL(0x92a21005,0x0a1151d4),LL(0x33110fdf,0xad7f3971),LL(0x1960100f,0x8c95928c),LL(0x7bf03362,0x6c91c825),
+ LL(0xce309f06,0xc8c8b2a2),LL(0xca27204b,0xfdb27b59),LL(0x0848e32e,0xd223eaa5),LL(0xe7bfaf1e,0xb93e4b2e), LL(0x44aa3ded,0xc5308ae6),LL(0xc015d573,0x317a666a),LL(0x1a979707,0xc888ce23),LL(0x0d5c4958,0xf141c1e6),
+ LL(0x61906373,0xb53b7de5),LL(0xeb999595,0x858dbade),LL(0xa59e5c36,0x8cbb47b2),LL(0xdcf4e842,0x660318b3), LL(0x12ba4b7a,0xbd161ccd),LL(0xf8c8282a,0xf399daab),LL(0xeeb2130d,0x1587633a),LL(0xda38dd7d,0xa465311a),
+ LL(0x64d3779b,0x5f75eec8),LL(0xad64c171,0x3c5d0476),LL(0x2a914428,0x87410371),LL(0x90e2fc29,0x8096a891), LL(0x23b3ebc2,0xd3d2ae9d),LL(0xa580cfd6,0x90bdd6db),LL(0xc5b01f6c,0x52dbb7f3),LL(0xe102a2dc,0xe68eded4),
+ LL(0x99eb6df0,0x17785b77),LL(0x7386b779,0x26c3cc51),LL(0x6417a48e,0x345ed988),LL(0x07d6ef31,0xe990b4e4), LL(0x2586abba,0x0f456b7e),LL(0x59c96e9a,0x239ca6a5),LL(0xe2eb4206,0xe327459c),LL(0xa002b90a,0x3a4c3313),
+ LL(0xf6a3f6fb,0x2a114806),LL(0x85c251dd,0xad5cad2f),LL(0xf5a784d3,0x92c1f613),LL(0x349766d5,0xec7bfacf), LL(0x3e23cb3b,0x04b3cd33),LL(0xc5a64b2d,0x3979fe84),LL(0x7e589106,0x192e2720),LL(0xa15b527f,0xa60c43d1),
+ LL(0xbe7cf3a6,0x2dae9082),LL(0xbc967274,0xcc86ba92),LL(0xaea0a8a9,0xf28a2ce8),LL(0x6ee988b3,0x404ca6d9), LL(0x005921b8,0xfd7e9c5d),LL(0x44e79bf9,0xf56297f1),LL(0x0d75ddc2,0xa163b460),LL(0xa1f2be87,0x30b23616),
+ LL(0xbfe50e2b,0x4b070d21),LL(0xe1bfede1,0x7ef8cfd0),LL(0x2aac4ae0,0xadba0011),LL(0xb9ebd033,0x2a3e7d01), LL(0xe38d9d1c,0x995277ec),LL(0x9c5d2de3,0xb500249e),LL(0xf13ca8c9,0x8912b820),LL(0x877793af,0xc8798114),
+ LL(0xec3f1dec,0x19e6125d),LL(0x911178da,0x07b1f040),LL(0x904a6738,0xd93ededa),LL(0x0bebedcd,0x55187a5a), LL(0xeb329d41,0xf7d04722),LL(0xf170b391,0xf449099e),LL(0xca99f828,0xfd317a69),LL(0x34a4976d,0x50c3db2b),
+ LL(0x3757b392,0xe9ba7784),LL(0xaa3ca05a,0x326caefd),LL(0xf1e593d4,0x78e5293b),LL(0x0d98fd13,0x7842a937), LL(0x5f96b10d,0xe694bf96),LL(0x06a8cd05,0x373a9df6),LL(0xe8f0c7fc,0x997d1e51),LL(0x63fd972e,0x1d019790),
+ LL(0x5499fb32,0x0064d858),LL(0x77a8aeb7,0x7b67bad9),LL(0x2d08eec5,0x1d3eb977),LL(0xcbabae1d,0x5fc047a6), LL(0xe54a64bb,0x0577d159),LL(0xc43497e4,0x8862201b),LL(0x2ce0608d,0xad6b4e28),LL(0x0b167aac,0x8b687b7d),
+ LL(0x8b2ecfa9,0x6ed4d367),LL(0xa90c3c38,0x24dfe62d),LL(0x3fe5c42b,0xa1862e10),LL(0xd5732a9f,0x1ca73dca), LL(0x76bb87ad,0x35f038b7),LL(0xf242b81f,0x674976ab),LL(0xb0fd90cd,0x4f2bde7e),LL(0xa7fdf092,0x6efc172e),
+ LL(0x92222f1f,0x3806b69b),LL(0x6cf7ae70,0x5a2459ca),LL(0xa85217ee,0x6789f69c),LL(0xe3dc85ac,0x5f232b5e), LL(0x48e9e516,0x660e3ec5),LL(0x3197eb31,0x124b4e47),LL(0xaafcca23,0x10a0cb13),LL(0x8213224f,0x7bd63ba4),
+ LL(0x290a7f4f,0xaffad7cc),LL(0x0286b461,0x6b409c9e),LL(0xffa407af,0x58ab809f),LL(0xc68ac073,0xc3122eed), LL(0x4ef24d7e,0x17bf9e50),LL(0x3e2a5811,0x5d929794),LL(0x02902e01,0x519bc867),LL(0x39c8a851,0x76bba5da),
+ LL(0xda94951e,0xe9f9669c),LL(0x66b8d418,0x4b6af58d),LL(0x17d426a4,0xfa321074),LL(0x9dde6027,0xc78e66a9), LL(0x4a53b964,0x0516c083),LL(0xff602330,0xfc659d38),LL(0x58c5c897,0x0ab55e5c),LL(0x838bc5df,0x985099b2),
+ LL(0xc52fc238,0x061d9efc),LL(0x6ac1da3f,0x712b2728),LL(0x9283fe08,0xfb658149),LL(0xb8aaa2f7,0x4954ac94), LL(0x7fb2e74f,0x85c0ada4),LL(0xb89926b0,0xee8ba98e),LL(0x23d1af5b,0xe4f9d37d),LL(0xba9b015e,0x14ccdbf9),
+ LL(0x7bfe7178,0xb674481b),LL(0x65405868,0x4e1debae),LL(0xc48c867d,0x061b2821),LL(0x513b30ea,0x69c15b35), LL(0x36871088,0x3b4a1666),LL(0x1220b1ff,0xe5e29f5d),LL(0x233d9f4d,0x4b82bb35),LL(0x18cdc675,0x4e076333),
+},
+/* digit=10 base_pwr=2^70 */
+{
+ LL(0xa3e6fced,0x0d53f5c7),LL(0xf45fbdeb,0xe8cbbdd5),LL(0x13339a70,0xf85c01df),LL(0x142ceb81,0x0ff71880), LL(0xbd70437a,0x4c4e8774),LL(0xba0bda6a,0x5fb32891),LL(0xf18bd26e,0x1cdbebd2),LL(0x03a9d522,0x2f9526f1),
+ LL(0x92c4d684,0x40ce3051),LL(0x7612efcd,0x8b04d725),LL(0x6f9cae20,0xb9dcda36),LL(0xf058856c,0x0edc4d24), LL(0x85427900,0x64f2e6bf),LL(0xdc09dfea,0x3de81295),LL(0x379bf26c,0xd41b4487),LL(0x6df135a9,0x50b62c6d),
+ LL(0xc72dfe67,0xd4f8e3b4),LL(0x90e19fdf,0xc416b0f6),LL(0x4c13bd35,0x18b9098d),LL(0x15b8cb9e,0xac11118a), LL(0xf0062841,0xf598a318),LL(0x89f356f4,0xbfe0602f),LL(0x30177a0c,0x7ae3637e),LL(0x61136537,0x34097747),
+ LL(0xd005832a,0x0db2fb5e),LL(0x91042e4f,0x5f5efd3b),LL(0xed70f8ca,0x8c4ffdc6),LL(0xb52da9cc,0xe4645d0b), LL(0xc9001d1f,0x9596f58b),LL(0x4e117205,0x52c8f0bc),LL(0xe398a084,0xfd4aa0d2),LL(0x104f49de,0x815bfe3a),
+ LL(0x23885e5f,0x97e5443f),LL(0xe8433aab,0xf72f8f99),LL(0xe4d4e604,0xbd00b154),LL(0xe5e173ff,0xd0b35e6a), LL(0x9164722d,0x57b2a048),LL(0x88761ec8,0x3e3c665b),LL(0x3da83832,0x6bdd1397),LL(0x73dafe3b,0x3c8b1a1e),
+ LL(0x54317cac,0x4497ace6),LL(0x521771b3,0xbe600ab9),LL(0xb0dfe8b8,0xb42e409e),LL(0x3942310f,0x386a67d7), LL(0x4431cc28,0x25548d8d),LL(0x985dc524,0xa7cff142),LL(0x93c4be32,0x4d60f5a1),LL(0xd071c6e1,0x83ebd5c8),
+ LL(0xb1fd2b0b,0xba3a80a7),LL(0x5bec33e8,0x9b3ad396),LL(0x79743fb3,0xb3868d61),LL(0xfdb462fa,0xcfd169fc), LL(0x9ce0a6af,0xd3b499d7),LL(0xe42d3ff8,0x55dc1cf1),LL(0xc6c3e1b2,0x04fb9e6c),LL(0x6f69a474,0x47e6961d),
+ LL(0xe548b37b,0x54eb3acc),LL(0x84d40549,0xb38e7542),LL(0x7b341b4f,0x8c3daa51),LL(0x690bf7fa,0x2f6928ec), LL(0x86ce6c41,0x0496b323),LL(0x10adadcd,0x01be1c55),LL(0x4bb5faf9,0xc04e67e7),LL(0xe15c9985,0x3cbaf678),
+ LL(0x50ca4247,0x8cd12145),LL(0xe7dd30aa,0xba1aa47a),LL(0xe58fee24,0x2f81ddf1),LL(0xeec9b0e8,0x03452936), LL(0x243aea96,0x8bdc3b81),LL(0x15c3d0e5,0x9a2919af),LL(0x10948361,0x9ea640ec),LL(0x6e0bcccf,0x5ac86d5b),
+ LL(0xc36cf440,0xf892d918),LL(0xc939719c,0xaed3e837),LL(0xc0218b64,0xb07b08d2),LL(0xce9790dd,0x6f1bcbba), LL(0x60919b8e,0x4a84d6ed),LL(0x8ac1f9eb,0xd8900791),LL(0x0dd5daef,0xf84941aa),LL(0x67fd62c5,0xb22fe40a),
+ LL(0x157f2db3,0x97e15ba2),LL(0x8e28ca9c,0xbda2fc8f),LL(0x37b9f454,0x5d050da4),LL(0x2379d72e,0x3d57eb57), LL(0xfb5ee997,0xe9b5eba2),LL(0xe11538ca,0x01648ca2),LL(0xf6327974,0x32bb76f6),LL(0xff3f4bb7,0x338f14b8),
+ LL(0xd7ab9a2d,0x524d226a),LL(0x7dfae958,0x9c00090d),LL(0x8751d8c2,0x0ba5f539),LL(0x3ab8262d,0x8afcbcdd), LL(0xe99d043b,0x57392729),LL(0xaebc943a,0xef51263b),LL(0x20862935,0x9feace93),LL(0xb06c817b,0x639efc03),
+ LL(0x66b4be7a,0x1fe054b3),LL(0x84a37a1e,0x3f25a9de),LL(0x78d75cd9,0xf39ef1ad),LL(0x5062c1b5,0xd7b58f49), LL(0xff563436,0x6f74f9a9),LL(0xe8af51e7,0xf718ff29),LL(0x15e97fec,0x5234d313),LL(0x292f1c0a,0xb6a8e2b1),
+ LL(0x327720c1,0xa7f53aa8),LL(0xba092cc8,0x956ca322),LL(0x28746c4d,0x8f03d64a),LL(0x66d0d392,0x51fe1782), LL(0x3c832c80,0xd19b34db),LL(0x6da2e3b4,0x60dccc5c),LL(0x0a104ccc,0x245dd62e),LL(0x620b21fd,0xa7ab1de1),
+ LL(0x3893d123,0xb293ae0b),LL(0xb15ee71c,0xf7b75783),LL(0x42a9468b,0x5aa3c614),LL(0xdb15d744,0xd686123c), LL(0xa7ab4116,0x8c616891),LL(0xa4e6a459,0x6fcd72c8),LL(0x77e5fad7,0xac219110),LL(0x704fa46b,0xfb6a20e7),
+ LL(0x341d81dc,0xe839be7d),LL(0x32148379,0xcddb6889),LL(0xf7026ead,0xda6211a1),LL(0xf4d1cc5e,0xf3b2575f), LL(0xa7a73ae6,0x40cfc8f6),LL(0x61d5b483,0x83879a5e),LL(0x41a50ebc,0xc5acb1ed),LL(0x3c07d8fa,0x59a60cc8),
+ LL(0xb1876262,0x1b73bdce),LL(0x12af4ee9,0x2b0d79f0),LL(0xd46e1d07,0x8bcf3b0b),LL(0xe45d152f,0x17d6af9d), LL(0x6d736451,0x73520461),LL(0x56b0bf5a,0x43cbbd97),LL(0xd5999b9d,0xb0833a5b),LL(0xeb72e398,0x702614f0),
+ LL(0x59c3e9f8,0x0aadf01a),LL(0xce6b3d16,0x40200e77),LL(0xdeddafad,0xda22bdd3),LL(0x310d72e1,0x76dedaf4), LL(0x4bc2e88f,0x49ef807c),LL(0x146dd5a5,0x6ba81291),LL(0x7d8d59e9,0xa1a4077a),LL(0x802db349,0x87b6a2e7),
+ LL(0x1b4e598e,0xd5679997),LL(0x06fe4b1d,0xf499ef1f),LL(0xfcb267c5,0x3978d3ae),LL(0x235786d0,0xb582b557), LL(0x1715cb07,0x32b3b2ca),LL(0x8480241d,0x4c3de6a2),LL(0xcb571ecd,0x63b5ffed),LL(0xed2fe9a9,0xeaf53900),
+ LL(0xc3b81990,0xdec98d4a),LL(0x9e0cc8fe,0x1cb83722),LL(0xd2b427b9,0xfe0b0491),LL(0xe983a66c,0x0f2386ac), LL(0xb3291213,0x930c4d1e),LL(0x59a62ae4,0xa2f82b2e),LL(0xf93e89e3,0x77233853),LL(0x11777c7f,0x7f8063ac),
+ LL(0x59ad2877,0xff0eb567),LL(0x9865c754,0x6f454642),LL(0x236e9a84,0xe6fe701a),LL(0x06e40fc3,0xc586ef16), LL(0x24bafad9,0x3f62b6e0),LL(0x64da906a,0xc8b42bd2),LL(0xda3276a0,0xc98e1eb4),LL(0x06cbf852,0x30d0e5fc),
+ LL(0xe8b4dfd4,0x1b6b2ae1),LL(0x8301cbac,0xd754d5c7),LL(0x112a39ac,0x66097629),LL(0x93ba4ab9,0xf86b5999), LL(0x99f9d581,0x26c9dea7),LL(0xc2fafeaa,0x0473b1a8),LL(0x3b2505a5,0x1469af55),LL(0xd6a43323,0x227d16d7),
+ LL(0xad3d97f9,0x3316f73c),LL(0x1f137455,0x52bf3bb5),LL(0x09954e7c,0x953eafeb),LL(0xdd732411,0xa721dfed), LL(0x141d4579,0xb4929821),LL(0xaa3bd435,0x3411321c),LL(0x17fa6015,0xafb355aa),LL(0x18e42f0e,0xb4e7ef4a),
+ LL(0x59371000,0x604ac97c),LL(0x7f759c18,0xe1c48c70),LL(0xa5db6b65,0x3f62ecc5),LL(0x38a21495,0x0a78b173), LL(0xbcc8ad94,0x6be1819d),LL(0xd89c3400,0x70dc04f6),LL(0xa6b4840a,0x462557b4),LL(0x60bd21c0,0x544c6ade),
+ LL(0x907a544b,0x6a00f24e),LL(0x313da210,0xa7520dcb),LL(0x11e4994b,0xfe939b75),LL(0xbc275d70,0x918b6ba6), LL(0x644be892,0xd3e5e0fc),LL(0xfdaf6c42,0x707a9816),LL(0xf15c13fe,0x60145567),LL(0xe130a54a,0x4818ebaa),
+ LL(0x58d2f767,0x28aad3ad),LL(0xd7e7c773,0xdc5267fd),LL(0xc3afcc98,0x4919cc88),LL(0x2db8cd4b,0xaa2e6ab0), LL(0xd0c63eaa,0xd46fec04),LL(0x19ffa832,0xa1cb92c5),LL(0xe43a631f,0x678dd178),LL(0x3dc788b3,0xfb5ae1cd),
+ LL(0x6e77de04,0x68b4fb90),LL(0xf06dbb97,0x7992bcf0),LL(0xc417c01d,0x896e6a13),LL(0xb956be01,0x8d96332c), LL(0x413aa2b9,0x902fc93a),LL(0xfc98c8a5,0x99a4d915),LL(0x565f1137,0x52c29407),LL(0x21e4f281,0x4072690f),
+ LL(0x02ff6072,0x36e607cf),LL(0x8ad98cdc,0xa47d2ca9),LL(0xf5f56609,0xbf471d1e),LL(0xf264ada0,0xbcf86623), LL(0xaa9e5cb6,0xb70c0687),LL(0x17401c6c,0xc98124f2),LL(0xd4a61435,0x8189635f),LL(0xa9d98ea6,0xd28fb8af),
+ LL(0x40c251f8,0xb9a67c2a),LL(0xa2da44be,0x88cd5d87),LL(0xe09b5423,0x437deb96),LL(0x64287dc1,0x150467db), LL(0xcdabb839,0xe161debb),LL(0xf1839a3e,0xa79e9742),LL(0x652d202b,0xbb8dd3c2),LL(0xe9f97d96,0x7b3e67f7),
+ LL(0xb1cb6ac9,0x5aa5d78f),LL(0xca1d0d45,0xffa13e8e),LL(0x2ba5bf95,0x369295dd),LL(0x39aff05e,0xd68bd1f8), LL(0x26d783f2,0xaf0d86f9),LL(0xfc3aafc1,0x543a59b3),LL(0x7b7da97c,0x3fcf81d2),LL(0xd25dee46,0xc990a056),
+ LL(0x519cce2c,0x3e6775b8),LL(0xae13d863,0xfc9af71f),LL(0x47c1605c,0x774a4a6f),LL(0x2fd205e8,0x46ba4245), LL(0xd3fd524d,0xa06feea4),LL(0x6de1acc2,0x1e724641),LL(0x334e2b42,0xf53816f1),LL(0x922f0024,0x49e5918e),
+ LL(0x65c7322d,0x439530b6),LL(0xb3c1b3fb,0xcf12cc01),LL(0x0172f685,0xc70b0186),LL(0x1b58391d,0xb915ee22), LL(0xa317db24,0x9afdf03b),LL(0x17b8ffc4,0x87dec659),LL(0xe4d3d050,0x7f46597b),LL(0x006500e7,0x80a1c1ed),
+ LL(0x78bf030e,0x84902a96),LL(0x50560148,0xfb5e9c9a),LL(0x63362426,0x6dae0a92),LL(0xa9e30c40,0xdcaeecf4), LL(0x518d0c6b,0xc0d887bb),LL(0xcb985b9d,0x99181152),LL(0xef7bc381,0xad186898),LL(0x9ee46201,0x18168ffb),
+ LL(0x2502753c,0x9a04cdaa),LL(0x51407c41,0xbb279e26),LL(0xf23564e5,0xeacb03aa),LL(0x71e61016,0x18336582), LL(0xeb809877,0x8684b8c4),LL(0xea0e672e,0xb336e18d),LL(0x34ee5867,0xefb601f0),LL(0x1341cfd1,0x2733edbe),
+ LL(0x26025c3c,0xb15e809a),LL(0x9350df88,0xe6e981a6),LL(0x8502fd8e,0x92376237),LL(0x0c12be9b,0x4791f216), LL(0x25f02425,0xb7256789),LL(0x7a974443,0xec863194),LL(0xfb41cc52,0x7c0ce882),LL(0xf25c07f2,0xc266ff7e),
+ LL(0x017025f3,0x3d4da8c3),LL(0xfb9579b4,0xefcf628c),LL(0x1f3716ec,0x5c4d0016),LL(0x6801116e,0x9c27ebc4), LL(0x1da1767e,0x5eba0ea1),LL(0x47004c57,0xfe151452),LL(0x8c2373b7,0x3ace6df6),LL(0x5dbc37ac,0x75c3dffe),
+ LL(0xddc925fc,0x3dc32a73),LL(0x2f65ee0b,0xb679c841),LL(0x451cbfeb,0x715a3295),LL(0xf76e9a29,0xd9889768), LL(0xb28ad247,0xec20ce7f),LL(0x00894d79,0xe99146c4),LL(0x9f5e3ea7,0x71457d7c),LL(0x38030031,0x097b2662),
+ LL(0xcf9f82a8,0xdb7f6ae6),LL(0x438f473a,0x319decb9),LL(0x283856c3,0xa63ab386),LL(0xb06a361b,0x13e3172f), LL(0x7d5a006c,0x2959f8dc),LL(0x75fba752,0x2dbc27c6),LL(0x87c22c9e,0xc1227ab2),LL(0x71a268b2,0x06f61f75),
+ LL(0x04779ce2,0x1b6bb971),LL(0x0aadcb1d,0xaca83812),LL(0xaeaab2d5,0x297ae0bc),LL(0x5bfb9f13,0xa5c14ee7), LL(0xf17a62c7,0xaa00c583),LL(0x173759f6,0x39eb962c),LL(0x86c9a88f,0x1eeba1d4),LL(0xdf016c5e,0x0ab6c37a),
+ LL(0xa28a0749,0xa2a147db),LL(0xee519165,0x246c20d6),LL(0xd3810715,0x5068d1b1),LL(0x748160b9,0xb1e7018c), LL(0xf380ff62,0x03f5b1fa),LL(0xf3cb2c1e,0xef7fb1dd),LL(0xfc91a7da,0xeab539a8),LL(0xf3f9b561,0x83ddb707),
+ LL(0xfe7df7a4,0xc550e211),LL(0x063f6f40,0xa7cd07f2),LL(0x2976879c,0xb0de3635),LL(0xe55741da,0xb5f83f85), LL(0xf3d8ac3d,0x4ea9d25e),LL(0x62819f02,0x6fe2066f),LL(0xcef4a564,0x4ab2b9c2),LL(0x5ffa2de3,0x1e155d96),
+ LL(0xc3a72d00,0x0eb0a19b),LL(0x8513c31b,0x4037665b),LL(0x04c64637,0x2fb2b6bf),LL(0x08cdc639,0x45c34d6e), LL(0xf01fd796,0x56f1e10f),LL(0xfe3667b8,0x4dfb8101),LL(0x9021d0c0,0xe0eda253),LL(0x8a06c6ab,0x7a94e9ff),
+ LL(0xbb9aa882,0x2d3bb0d9),LL(0xec05fd10,0xea20e4e5),LL(0x1a1ca64e,0xed7eeb5f),LL(0xc6327cbd,0x2fa6b43c), LL(0x3aa91121,0xb577e3cf),LL(0x3a34079b,0x8c6bd5ea),LL(0x60e02fc0,0xd7e5ba39),LL(0x90141bf8,0xf16dd2c3),
+ LL(0x80101b98,0xb57276d9),LL(0xb82f0f66,0x760883fd),LL(0x4bc3eff3,0x89d7de75),LL(0x5dc2ab40,0x03b60643), LL(0xe05beeac,0xcd6e53df),LL(0xbc3325cd,0xf2f1e862),LL(0x774f03c3,0xdd0f7921),LL(0x4552cc1b,0x97ca7221),
+ LL(0x1cd19f72,0x5a0d6afe),LL(0xf183fbeb,0xa20915dc),LL(0x832c403c,0x9fda4b40),LL(0xbe425442,0x32738edd), LL(0xb5eccf1a,0x469a1df6),LL(0x28bbe1f0,0x4b5aff42),LL(0x570dfc93,0x31359d7f),LL(0xf0088628,0xa18be235),
+ LL(0xb00ed3a9,0xa5b30fba),LL(0x73cdf8be,0x34c61374),LL(0xabc56797,0x2c5c5f46),LL(0xb82a8ae2,0x5cecf93d), LL(0xa968fbf0,0x7d3dbe41),LL(0x1a5c7f3d,0xd23d4583),LL(0xc087a9c7,0xf28f69a0),LL(0x474471ca,0xc2d75471),
+ LL(0x4eb732ec,0x36ec9f4a),LL(0xb1ca6bed,0x6c943bbd),LL(0xf2457892,0xd64535e1),LL(0xf7e2ac06,0x8b84a8ea), LL(0x2499dd5f,0xe0936cd3),LL(0x0ed04e57,0x12053d7e),LL(0xe4305d9d,0x4bdd0076),LL(0x1f67f0a2,0x34a527b9),
+ LL(0x9cec46ea,0xe79a4af0),LL(0x658b9bc7,0xb15347a1),LL(0x35af2f75,0x6bd2796f),LL(0x4051c435,0xac957990), LL(0xc33a655d,0x2669dda3),LL(0x88514aa3,0x5d503c2e),LL(0x3753dd41,0xdfa11337),LL(0x0b754f78,0x3f054673),
+ LL(0x496125bd,0xbf185677),LL(0x3775006c,0xfb0023c8),LL(0x3a037899,0xfa0f072f),LL(0x0e4aea57,0x4222b6eb), LL(0x7866d25a,0x3dde5e76),LL(0x4837aa6f,0xb6eb04f8),LL(0x2cf1cdb8,0x5315591a),LL(0x2d4e683c,0x6dfb4f41),
+ LL(0x48ee1f3a,0x7e923ea4),LL(0x05a2afd5,0x9604d9f7),LL(0x40ea4948,0xbe1d4a33),LL(0xb44cbd2f,0x5b45f1f4), LL(0x4acc757e,0x5faf8376),LL(0x63d68ff7,0xa7cf9ab8),LL(0xdf0e404b,0x8ad62f69),LL(0x12bdafdf,0xd65f33c2),
+ LL(0xa377b14e,0xc365de15),LL(0x8e39f60c,0x6bf5463b),LL(0x2ce68148,0x62030d2d),LL(0xe6f843a8,0xd95867ef), LL(0xef5ab017,0xd39a0244),LL(0x4ab55d12,0x0bd2d8c1),LL(0x41639169,0xc9503db3),LL(0xf7660c8a,0x2d4e25b0),
+ LL(0xe224c5d7,0x760cb3b5),LL(0x68616919,0xfa3baf8c),LL(0x8d142552,0x9fbca113),LL(0x7669ebf5,0x1ab18bf1), LL(0x9bdf25dd,0x55e6f53e),LL(0xcb6cd154,0x04cc0bf3),LL(0x95e89080,0x595bef49),LL(0x104a9ac1,0xfe9459a8),
+ LL(0xcce9bb32,0xad2d89ca),LL(0xf7de8285,0xddea65e1),LL(0xb351bd4b,0x62ed8c35),LL(0x0c0e19a7,0x4150ff36), LL(0x345f4e47,0x86e3c801),LL(0x203a266c,0x3bf21f71),LL(0x855b1f13,0x7ae110d4),LL(0x07262517,0x5d6aaf6a),
+ LL(0x813d28f1,0x1e0f12e1),LL(0x7ad7a523,0x6000e11d),LL(0xc744a17b,0xc7d8deef),LL(0x14c05a00,0x1e990b48), LL(0x93e976d5,0x68fddaee),LL(0x46610d63,0x696241d1),LL(0x893dda88,0xb204e7c3),LL(0x6a3a6946,0x8bccfa65),
+ LL(0xc5cd1411,0xb59425b4),LL(0xff3658b1,0x701b4042),LL(0x4784cf93,0xe3e56bca),LL(0x8fe68d60,0x27de5f15), LL(0xf8d53f19,0x4ab9cfce),LL(0xa40a730d,0xddb10311),LL(0x4eee0a8a,0x6fa73cd1),LL(0x5249719d,0xfd548748),
+ LL(0xa8123ef0,0x49d66316),LL(0xe7f95438,0x73c32db4),LL(0x0d9e7854,0x2e2ed209),LL(0x9d9f0507,0xf98a9329), LL(0x0c6aa20a,0xc5d33cf6),LL(0x75279bb2,0x9a32ba14),LL(0x774a7307,0x7e3202cb),LL(0xe8c42dbd,0x64ed4bc4),
+ LL(0xd4caed0d,0xc20f1a06),LL(0x171d22b3,0xb8021407),LL(0xd13268d7,0xd426ca04),LL(0x25f4d126,0x92377007), LL(0x71f21a85,0x4204cbc3),LL(0xf82369ba,0x18461b7a),LL(0x3fc858f9,0xc0c07d31),LL(0xe2bab569,0x5deb5a50),
+ LL(0xd5eea89e,0xd5959d46),LL(0x08437f4b,0xfdff8424),LL(0x3cfe254f,0xf21071e4),LL(0x95468321,0x72417696), LL(0x102cae3e,0x5d8288b9),LL(0xf1965dff,0x2d143e3d),LL(0xa078d847,0x00c9a376),LL(0x26028731,0x6fc0da31),
+ LL(0xe45083a2,0xa2baeadf),LL(0x5e5b4bcd,0x66bc7218),LL(0xd04b8e7f,0x2c826442),LL(0x6c4b586b,0xc19f5451), LL(0x5b7eeed5,0x60182c49),LL(0x7aa9dfa1,0xd9954ecd),LL(0xc73884ad,0xa403a8ec),LL(0x9bb39041,0x7fb17de2),
+ LL(0xabb020e8,0x694b64c5),LL(0x19c4eec7,0x3d18c184),LL(0x1c4793e5,0x9c4673ef),LL(0x056092e6,0xc7b8aeb5), LL(0xf0f8c16b,0x3aa1ca43),LL(0xd679b2f6,0x224ed5ec),LL(0x55a205c9,0x0d56eeaf),LL(0x4b8e028b,0xbfe115ba),
+ LL(0x3927f4fe,0x97e60849),LL(0x759aa7c5,0xf91fbf94),LL(0x6be90a51,0x985af769),LL(0x78ccb823,0xc1277b78), LL(0xe7a75952,0x395b656e),LL(0x928da5f5,0x00df7de0),LL(0x4ca4454f,0x09c23175),LL(0x7aa2d3c1,0x4ec971f4),
+ LL(0xe75d9ccc,0x45c3c507),LL(0x3dc90306,0x63b7be8a),LL(0x5db44bdc,0x37e09c66),LL(0x6841c6a2,0x50d60da1), LL(0x08df1b12,0x6f9b65ee),LL(0x7ff089df,0x38734879),LL(0x3fe8013d,0x9c331a66),LL(0x5f42fcc8,0x017f5de9),
+ LL(0xe8e57567,0x43077866),LL(0xf9fcdb18,0xc9f781ce),LL(0x9b12e174,0x38131dda),LL(0x8a03752a,0x25d84aa3), LL(0x4d0c0ce2,0x45e09e09),LL(0x92bebba5,0x1564008b),LL(0xa87284c7,0xf7e8ad31),LL(0x97e7bbaa,0xb7c4b46c),
+ LL(0x97acf4ec,0x3e22a7b3),LL(0x5ea8b640,0x0426c400),LL(0x4e969285,0x5e3295a6),LL(0xa6a45670,0x22aabc59), LL(0x5f5942bc,0xb929714c),LL(0xfa3182ed,0x9a6168bd),LL(0x104152ba,0x2216a665),LL(0xb6926368,0x46908d03),
+},
+/* digit=11 base_pwr=2^77 */
+{
+ LL(0x5a1251fb,0xa9f5d874),LL(0xc72725c7,0x967747a8),LL(0x31ffe89e,0x195c33e5),LL(0xe964935e,0x609d210f), LL(0x2fe12227,0xcafd6ca8),LL(0x0426469d,0xaf9b5b96),LL(0x5693183c,0x2e9ee04c),LL(0xc8146fef,0x1084a333),
+ LL(0xaed1d1f7,0x96649933),LL(0x50563090,0x566eaff3),LL(0xad2e39cf,0x345057f0),LL(0x1f832124,0x148ff65b), LL(0xcf94cf0d,0x042e89d4),LL(0x520c58b3,0x319bec84),LL(0x5361aa0d,0x2a267626),LL(0x8fbc87ad,0xc86fa302),
+ LL(0x5c8b06d5,0xfc83d2ab),LL(0xfe4eac46,0xb1a785a2),LL(0x846f7779,0xb99315bc),LL(0xef9ea505,0xcf31d816), LL(0x15d7dc85,0x2391fe6a),LL(0xb4016b33,0x2f132b04),LL(0x181cb4c7,0x29547fe3),LL(0x650155a1,0xdb66d8a6),
+ LL(0xadc1696f,0x6b66d7e1),LL(0x0acd72d0,0x98ebe593),LL(0xcc1b7435,0x65f24550),LL(0xb4b9a5ec,0xce231393), LL(0xdb067df9,0x234a22d4),LL(0xcaff9b00,0x98dda095),LL(0x6100c9c1,0x1bbc75a0),LL(0x939cf695,0x1560a9c8),
+ LL(0x99e0925f,0xcf006d3e),LL(0x6322375a,0x2dd74a96),LL(0xb56af5ba,0xc58b446a),LL(0xe0b9b4f1,0x50292683), LL(0x1aeaffa3,0xe2c34cb4),LL(0x9b9587c1,0x8b17203f),LL(0xead1350c,0x6d559207),LL(0xfb7f9604,0x2b66a215),
+ LL(0xfe51bf74,0x0850325e),LL(0x5e460094,0x9c4f579e),LL(0x76da2f25,0x5c87b92a),LL(0x6febef33,0x889de4e0), LL(0x646083ce,0x6900ec06),LL(0xbfe12773,0xbe2a0335),LL(0xc5344110,0xadd1da35),LL(0xb802cd20,0x757568b7),
+ LL(0x00f7e6c8,0x75559779),LL(0x0facd2f0,0x38e8b94f),LL(0x03fde375,0xfea1f3af),LL(0x75881dfc,0x5e11a1d8), LL(0xc1e2f2ef,0xb3a6b02e),LL(0xc605a6c5,0x193d2bbb),LL(0x339a0b2d,0x325ffeee),LL(0x9e0c8846,0x27b6a724),
+ LL(0xf1c367ca,0xe4050f1c),LL(0xc90fbc7d,0x9bc85a9b),LL(0xe1a11032,0xa373c4a2),LL(0xad0393a9,0xb64232b7), LL(0x167dad29,0xf5577eb0),LL(0x94b78ab2,0x1604f301),LL(0xe829348b,0x0baa94af),LL(0x41654342,0x77fbd8dd),
+ LL(0xb964e39a,0xdab50ea5),LL(0xd0d3c76e,0xd4c29e3c),LL(0x56d11964,0x80dae67c),LL(0xe5ffcc2f,0x7307a8bf), LL(0x91708c3b,0x65bbc1aa),LL(0x28bf0eeb,0xa151e62c),LL(0x6fa34db7,0x6cb53381),LL(0xa29403a8,0x5139e05c),
+ LL(0x94a7cd2e,0x6ff651b4),LL(0x0699336c,0x5671ffd1),LL(0x979a896a,0x6f5fd2cc),LL(0xd8148cef,0x11e893a8), LL(0x65cf7b10,0x988906a1),LL(0xc50d8485,0x81b67178),LL(0x8a35b3de,0x7c0deb35),LL(0xc1d29799,0x423ac855),
+ LL(0xdac50b74,0xaf580d87),LL(0x5869734c,0x28b2b89f),LL(0x874e28fb,0x99a3b936),LL(0x25f3f73a,0xbb2c9190), LL(0x84a9d5b7,0x199f6918),LL(0x7e770374,0x7ebe2325),LL(0x0738efe2,0xf442e107),LL(0xcf9082d2,0xcf9f3f56),
+ LL(0x09618708,0x719f69e1),LL(0xc183f9b1,0xcc9e8364),LL(0x366a21af,0xec203a95),LL(0x068b141f,0x6aec5d6d), LL(0x994f04e9,0xee2df78a),LL(0x271245b0,0xb39ccae8),LL(0x97e43f4f,0xb875a4a9),LL(0xdb2cea98,0x507dfe11),
+ LL(0x489b03e9,0x4fbf81cb),LL(0x6ec414fa,0xdb86ec5b),LL(0xf51b3ae5,0xfad444f9),LL(0x1914e3fe,0xca7d33d6), LL(0x0ae6c4d0,0xa9c32f5c),LL(0x73969568,0xa9ca1d1e),LL(0x1aa7467e,0x98043c31),LL(0xe21b5ac6,0xe832e75c),
+ LL(0x5232123d,0x314b7aea),LL(0x65ae86db,0x08307c8c),LL(0xaa4668ed,0x06e7165c),LL(0xb4d3ec39,0xb170458b), LL(0xc19bb986,0x4d2e3ec6),LL(0xae0304ed,0xc5f34846),LL(0x6c9f9722,0x917695a0),LL(0x4cab1c0a,0x6c7f7317),
+ LL(0x9d6d2e8b,0x6295940e),LL(0x549f7c97,0xd318b8c1),LL(0x97713885,0x22453204),LL(0xa8a440fe,0x468d834b), LL(0xbfba796e,0xd81fe5b2),LL(0x6d71f116,0x152364db),LL(0xb5b66e53,0xbb8c7c59),LL(0x2641a192,0x0b12c61b),
+ LL(0xfcf0a7fd,0x31f14802),LL(0x5488b01e,0x42fd0789),LL(0x9952b498,0x71d78d6d),LL(0x07ac5201,0x8eb572d9), LL(0x4d194a88,0xe0a2a44c),LL(0xba017e66,0xd2b63fd9),LL(0xf888aefc,0x78efc6c8),LL(0x4a881a11,0xb76f6bda),
+ LL(0xb46c2397,0x187f314b),LL(0x5ded2819,0x004cf566),LL(0x38764d34,0xa9ea5704),LL(0x78084709,0xbba45217), LL(0x1171121e,0x06474571),LL(0xe7c9b671,0xad7b7eb1),LL(0x730f7507,0xdacfbc40),LL(0xc7ad7bd1,0x178cd8c6),
+ LL(0xb2a67238,0xbf0be101),LL(0xaf9c14f2,0x3556d367),LL(0xa5662075,0x104b7831),LL(0x79d9e60a,0x58ca59bb), LL(0xa569a73b,0x4bc45392),LL(0x5698f6c9,0x517a52e8),LL(0xaeadd755,0x85643da5),LL(0x2a581b84,0x1aed0cd5),
+ LL(0x80af1372,0xb9b4ff84),LL(0xf1ba5d1f,0x244c3113),LL(0xf5f98d31,0x2a5dacbe),LL(0x4375bc2a,0x2c3323e8), LL(0x5594b1dd,0x17a3ab4a),LL(0xceb4797e,0xa1928bfb),LL(0xe4886a19,0xe83af245),LL(0x72b5a74a,0x8979d546),
+ LL(0x19f9e967,0xa0f726bc),LL(0xe8fbbf4e,0xd9d03152),LL(0xb7707d40,0xcfd6f51d),LL(0x63f6e6e0,0x633084d9), LL(0x55667eaf,0xedcd9cdc),LL(0x2e44d56f,0x73b7f92b),LL(0x4e962b14,0xfb2e39b6),LL(0xf671fcbf,0x7d408f6e),
+ LL(0x164a89bb,0xcc634ddc),LL(0x3ef3bd05,0x74a42bb2),LL(0x428decbb,0x1280dbb2),LL(0x402c8596,0x6103f6bb), LL(0x355a5752,0xfa2bf581),LL(0x00946674,0x562f96a8),LL(0x6da0223b,0x4e4ca16d),LL(0x28d3aa25,0xfe47819f),
+ LL(0xf8dfcf8a,0x9eea3075),LL(0x95669825,0xa284f0aa),LL(0x867d3fd8,0xb3fca250),LL(0x269d691e,0x20757b5f), LL(0x93b8a5de,0xf2c24020),LL(0xebc06da6,0xd3f93359),LL(0xb2739c33,0x1178293e),LL(0xbcd686e5,0xd2a3e770),
+ LL(0xcd941534,0xa76f49f4),LL(0xe3c71c0e,0x0d37406b),LL(0x3b97f7e3,0x172d9397),LL(0xbd7fd0de,0xec17e239), LL(0x6f496ba2,0xe3290551),LL(0x36ad50e7,0x6a693172),LL(0x83e7eff5,0xc4e539a2),LL(0x18e1b4cf,0x752737e7),
+ LL(0x68af43ee,0xa2f7932c),LL(0x703d00bd,0x5502468e),LL(0x2fb061f5,0xe5dc978f),LL(0x28c815ad,0xc9a1904a), LL(0x470c56a4,0xd3af538d),LL(0x193d8ced,0x159abc5f),LL(0x20108ef3,0x2a37245f),LL(0x223f7178,0xfa17081e),
+ LL(0x10c8c0f5,0x27b0fb2b),LL(0x40650547,0x2102c3ea),LL(0x8ac3bfa7,0x594564df),LL(0x509dad96,0x98102033), LL(0xf1d18a13,0x6989643f),LL(0xd7fc5af0,0x35eebd91),LL(0xfaeaafd8,0x078d096a),LL(0xdef3de98,0xb7a89341),
+ LL(0xecf2a73a,0x2a206e8d),LL(0x8e551994,0x066a6397),LL(0xb98d53a2,0x3a6a088a),LL(0x2d1124aa,0x0ce7c67c), LL(0x759a113c,0x48cec671),LL(0x4f6f67fa,0xe3b373d3),LL(0xfd36727b,0x5455d479),LL(0xa13c0d81,0xe5a428ee),
+ LL(0x1c86682b,0xb853dbc8),LL(0xb8d02b2a,0xb78d2727),LL(0x8ebc329a,0xaaf69bed),LL(0x293b2148,0xdb6b40b3), LL(0xb8c4961f,0xe42ea77d),LL(0x20e5e0ab,0xb1a12f7c),LL(0x79e8b05e,0xa0ec5274),LL(0xfab60a80,0x68027391),
+ LL(0x16b1bd5e,0x6bfeea5f),LL(0x4de30ad3,0xf957e420),LL(0x6a353b9e,0xcbaf664e),LL(0x26d14feb,0x5c873312), LL(0xb65f57cb,0x4e87f98c),LL(0x5e0cdd41,0xdb60a621),LL(0xa6881440,0x67c16865),LL(0x46ab52aa,0x1093ef1a),
+ LL(0x3f4ece64,0xc095afb5),LL(0x7604551a,0x6a6bb02e),LL(0x0b26b8cd,0x55d44b4e),LL(0xf971268a,0xe5f9a999), LL(0x11a7de84,0xc08ec425),LL(0xfda469dd,0x83568095),LL(0x6c6c90a2,0x737bfba1),LL(0xbe229831,0x1cb9c4a0),
+ LL(0xbb2eec64,0x93bccbba),LL(0xda03adbe,0xa0c23b64),LL(0xe0e86ac4,0x5f7aa00a),LL(0xfc1401e6,0x470b941e), LL(0x9df43574,0x5ad8d679),LL(0x0f65d810,0x4ccfb8a9),LL(0xaa7fbd81,0x1bce80e3),LL(0x9508d20a,0x273291ad),
+ LL(0x42a92806,0xf5c4b46b),LL(0xa86ab44a,0x810684ec),LL(0xca0bc9f8,0x4591640b),LL(0x5c4b6054,0xb5efcdfc), LL(0x6e9edd12,0x16fc8907),LL(0xd4d792f9,0xe29d0b50),LL(0x9b03116d,0xa45fd01c),LL(0xc81765a4,0x85035235),
+ LL(0xb4b4b67c,0x1fe2a9b2),LL(0xe8020604,0xc1d10df0),LL(0xbc8058d8,0x9d64abfc),LL(0x712a0fbb,0x8943b9b2), LL(0x3b3def04,0x90eed914),LL(0x4ce775ff,0x85ab3aa2),LL(0x7bbc9040,0x605fd4ca),LL(0xe2c75dfb,0x8b34a564),
+ LL(0x10358560,0x41ffc94a),LL(0x9e5c28aa,0x2d8a5072),LL(0x4cc7eb15,0xe915a0fc),LL(0x8f6d0f5d,0xe9efab05), LL(0xd19e9b91,0xdbab47a9),LL(0x0276154c,0x8cfed745),LL(0x2cfede0d,0x154357ae),LL(0x19f5a4ef,0x520630df),
+ LL(0xe382360f,0x25759f7c),LL(0x88bf5857,0xb6db05c9),LL(0x6c58d46c,0x2917d61d),LL(0xfd20cb7a,0x14f8e491), LL(0x11c20340,0xb68a727a),LL(0xaf7ccbb6,0x0386f86f),LL(0xfee09a20,0x5c8bc6cc),LL(0xbb7eea35,0x7d76ff4a),
+ LL(0xdb15be7a,0xa7bdebe7),LL(0xd89f0302,0x67a08054),LL(0xc1193364,0x56bf0ea9),LL(0x62837ebe,0xc8244467), LL(0x20d841b8,0x32bd8e8b),LL(0xdbb8a54f,0x127a0548),LL(0x63b20236,0x83dd4ca6),LL(0x203491fa,0x87714718),
+ LL(0xaa8a5288,0x4dabcaaa),LL(0xaf23a1c9,0x91cc0c8a),LL(0x3f220e0c,0x34c72c6a),LL(0x1232144a,0xbcc20bdf), LL(0xa20ede1b,0x6e2f42da),LL(0x74a00515,0xc441f00c),LL(0x734b8c4b,0xbf46a5b6),LL(0x7b56c9a4,0x57409503),
+ LL(0xe4585d45,0x9f735261),LL(0x6734e642,0x9231faed),LL(0xbe70ee6c,0x1158a176),LL(0x7c3501bf,0x35f1068d), LL(0xa2d26115,0x6beef900),LL(0xef0afee3,0x649406f2),LL(0xbc2420a1,0x3f43a60a),LL(0xd5aee4ac,0x509002a7),
+ LL(0x3ff3571b,0xb46836a5),LL(0x837927c1,0x24f98b78),LL(0x4533c716,0x6254256a),LL(0xd07ee196,0xf27abb0b), LL(0x5c6d5bfd,0xd7cf64fc),LL(0xf0cd7a77,0x6915c751),LL(0x8798f534,0xd9f59012),LL(0xf81d8b5f,0x772b0da8),
+ LL(0x2e03fa69,0x1244260c),LL(0x3be1a374,0x36cf0e3a),LL(0xef06b960,0x6e7c1633),LL(0x671f90f6,0xa71a4c55), LL(0x33c673db,0x7a941251),LL(0x73e8c131,0xc0bea510),LL(0xd4f6c734,0x61a8a699),LL(0x341ed001,0x25e78c88),
+ LL(0x8e2f7d90,0x5c18acf8),LL(0x77be32cd,0xfdbf33d7),LL(0xd2eb5ee9,0x0a085cd7),LL(0xb3201115,0x2d702cfb), LL(0x85c88ce8,0xb6e0ebdb),LL(0x1e01d617,0x23a3ce3c),LL(0x567333ac,0x3041618e),LL(0x157edb6b,0x9dd0fd8f),
+ LL(0xb57872b8,0x27f74702),LL(0x657d5fe1,0x2ef26b4f),LL(0x57cf3d40,0x95426f0a),LL(0x65a6067a,0x847e2ad1), LL(0x09996a74,0xd474d9a0),LL(0x2a26115c,0x16a56acd),LL(0xd16f4d43,0x02a615c3),LL(0xaadb85b7,0xcc3fc965),
+ LL(0xce07d1b0,0x386bda73),LL(0x58ad4178,0xd82910c2),LL(0xcd2617f4,0x124f82cf),LL(0xef691770,0xcc2f5e8d), LL(0xb8c30ccc,0x82702550),LL(0x1a8e575a,0x7b856aea),LL(0xb1ab9459,0xbb822fef),LL(0xec24e38e,0x085928bc),
+ LL(0xba8f4b4d,0x5d0402ec),LL(0x00b4d58b,0xc07cd4ba),LL(0x29227e7a,0x5d8dffd5),LL(0x31bf386f,0x61d44d0c), LL(0x135e6f4d,0xe486dc2b),LL(0xe79410ef,0x680962eb),LL(0xf10088b5,0xa61bd343),LL(0xe2e28686,0x6aa76076),
+ LL(0x8fb98871,0x80463d11),LL(0xbbc76aff,0xcb26f5c3),LL(0xfbe03614,0xd4ab8edd),LL(0xc0cf2dee,0xc8eb579b), LL(0xc93bae41,0xcc004c15),LL(0x3aeca3b2,0x46fbae5d),LL(0x0f1e9ab1,0x671235cf),LL(0x9ec285c1,0xadfba934),
+ LL(0xf216c980,0x88ded013),LL(0xf79e0bc1,0xc8ac4fb8),LL(0xfb97a237,0xa29b89c6),LL(0x9922d8e7,0xb697b780), LL(0xddb945b5,0x3142c639),LL(0xe094c3a9,0x447b06c7),LL(0x72266c90,0xcdcb3642),LL(0xa9385046,0x633aad08),
+ LL(0xb57c6477,0xa36c936b),LL(0xe94dbcc6,0x871f8b64),LL(0xa591a67b,0x28d0fb62),LL(0xc1d926f5,0x9d40e081), LL(0xf2d84b5a,0x3111eaf6),LL(0xa565b644,0x228993f9),LL(0x2c83188b,0x0ccbf592),LL(0x3df3e197,0xf87b30ab),
+ LL(0x7642bca8,0xb8658b31),LL(0x52800f17,0x1a032d7f),LL(0x79bf9445,0x051dcae5),LL(0x54a2e253,0xeba6b8ee), LL(0xd4485692,0x5c8b9cad),LL(0x8986e9be,0x84bda40e),LL(0x2f0db448,0xd16d16a4),LL(0xa14d4188,0x8ec80050),
+ LL(0x98fa7aaa,0xb2b26107),LL(0xf073aa4e,0x41209ee4),LL(0xf2d6b19b,0xf1570359),LL(0xfc577caf,0xcbe6868c), LL(0x32c04dd3,0x186c4bdc),LL(0xcfeee397,0xa6c35fae),LL(0xf086c0cf,0xb4a1b312),LL(0xd9461fe2,0xe0a5ccc6),
+ LL(0x1536189f,0xc32278aa),LL(0xba6df571,0x1126c55f),LL(0xb194560e,0x0f71a602),LL(0x324bd6e1,0x8b2d7405), LL(0x3738be71,0x8481939e),LL(0x1a4d97a9,0xb5090b1a),LL(0xf05ba915,0x116c65a3),LL(0xaae448aa,0x21863ad3),
+ LL(0xa7aae5d3,0xd24e2679),LL(0x0de5c1c4,0x7076013d),LL(0xbb05b629,0x2d50f8ba),LL(0x6e66efbb,0x73c1abe2), LL(0xf2488af7,0xefd4b422),LL(0x663ba575,0xe4105d02),LL(0x53a69457,0x7eb60a8b),LL(0xc945973b,0x62210008),
+ LL(0x77a50ec6,0xfb255478),LL(0x0a37a72c,0xbf0392f7),LL(0x4be18e7a,0xa0a7a19c),LL(0x25b1e0af,0x90d8ea16), LL(0xef953f57,0x7582a293),LL(0xbdc5465a,0x90a64d05),LL(0xe2510717,0xca79c497),LL(0x18cb641f,0x560dbb7c),
+ LL(0x4b66abfb,0x1d8e3286),LL(0x59030900,0xd26f52e5),LL(0x5584941a,0x1ee3f643),LL(0x569f5958,0x6d3b3730), LL(0x4789dba5,0x9ff2a62f),LL(0x72b5c9b7,0x91fcb815),LL(0x6c8f9a0e,0xf446cb7d),LL(0x39b7ecb5,0x48f625c1),
+ LL(0x1c6219b8,0xbabae801),LL(0x28ac2f23,0xe7a562d9),LL(0x26e20588,0xe1b48732),LL(0x775af051,0x06ee1cad), LL(0xfaff79f7,0xda29ae43),LL(0x652ee9e0,0xc141a412),LL(0x195f4bd0,0x1e127f6f),LL(0x072f34f8,0x29c6ab4f),
+ LL(0x30448112,0x7b7c1477),LL(0xe4a38656,0x82b51af1),LL(0x2f315010,0x2bf2028a),LL(0x6ea88cd4,0xc9a4a01f), LL(0x257e5818,0xf63e95d8),LL(0xb4519b16,0xdd8efa10),LL(0x0da910bf,0xed8973e0),LL(0x5c0fe4a9,0xed49d077),
+ LL(0xb7caee1e,0xac3aac5e),LL(0xa7f4da57,0x1033898d),LL(0x5c6669b9,0x42145c0e),LL(0xc1aa2aa0,0x42daa688), LL(0x1a1d885a,0x629cc15c),LL(0xf4b76817,0x25572ec0),LL(0x9c8f8f28,0x8312e435),LL(0x81965490,0x8107f8cd),
+ LL(0x6fa6110c,0x516ff3a3),LL(0xfb93561f,0x74fb1eb1),LL(0x8457522b,0x6c0c9047),LL(0x6bb8bdc6,0xcfd32104), LL(0xcc80ad57,0x2d6884a2),LL(0x86a9b637,0x7c27fc35),LL(0xadf4e8cd,0x3461baed),LL(0x617242f0,0x1d56251a),
+ LL(0xc955bef4,0x0b80d209),LL(0x06adb047,0xdf02cad2),LL(0x5ec74fee,0xf0d7cb91),LL(0x1111ba44,0xd2503375), LL(0xdf53cb36,0x9671755e),LL(0x3368551b,0x54dcb612),LL(0xc8a025a4,0x66d69aac),LL(0xe77ef445,0x6be946c6),
+ LL(0xa995e094,0x719946d1),LL(0xe51e04d8,0x65e848f6),LL(0x6a1e3113,0xe62f3300),LL(0x501de503,0x1541c7c1), LL(0xf4acfade,0x4daac9fa),LL(0x44cd0b71,0x0e585897),LL(0x0a51cd77,0x544fd869),LL(0x0031016d,0x60fc20ed),
+ LL(0xa4276867,0x58b404ec),LL(0x34f34993,0x46f6c3cc),LL(0xc636e5bd,0x477ca007),LL(0x7c458b47,0x8018f5e5), LL(0xe47b668f,0xa1202270),LL(0xee14f203,0xcef48ccd),LL(0x62ff9b4d,0x23f98bae),LL(0xc589eddd,0x55acc035),
+ LL(0x64db4444,0x3fe712af),LL(0xbecdd480,0x19e9d634),LL(0xa930978a,0xe08bc047),LL(0xa1280733,0x2dbf24ec), LL(0x2cd706b2,0x3c0ae38c),LL(0x359017b9,0x5b012a5b),LL(0x72e0f5ae,0x3943c38c),LL(0x57176fa3,0x786167ea),
+ LL(0x594881dc,0xe5f9897d),LL(0xcfb820c1,0x6b5efad8),LL(0xd55018de,0xb2179093),LL(0x0bac56ce,0x39ad7d32), LL(0x2cfc0e81,0xb55122e0),LL(0xf6d89daa,0x117c4661),LL(0xcb64fa09,0x362d01e1),LL(0x3e9c4ddd,0x6a309b4e),
+ LL(0xabea49b1,0xfa979fb7),LL(0x10e2c6c5,0xb4b1d27d),LL(0x23afde7a,0xbd61c2c4),LL(0x9786d358,0xeb6614f8), LL(0x7f6f7459,0x4a5d816b),LL(0x09360e7b,0xe431a44f),LL(0xc309914c,0x8c27a032),LL(0xcaede3d8,0xcea5d68a),
+ LL(0x3a0a3f95,0x3668f665),LL(0x7ceba27b,0x89369416),LL(0xe4728fe9,0x89981fad),LL(0x8a093562,0x7102c8a0), LL(0x235d21c8,0xbb80310e),LL(0xbefb7f7b,0x505e55d1),LL(0x12958a67,0xa0a90811),LL(0x4d851fef,0xd67e106a),
+ LL(0x431dd80e,0xb84011a9),LL(0x73306cd9,0xeb7c7cca),LL(0xd1b3b730,0x20fadd29),LL(0xfe37b3d3,0x83858b5b), LL(0xb6251d5c,0xbf4cd193),LL(0x1352d952,0x1cca1fd3),LL(0x90fbc051,0xc66157a4),LL(0x89b98636,0x7990a638),
+},
+/* digit=12 base_pwr=2^84 */
+{
+ LL(0x87dec0e1,0xe5aa692a),LL(0xf7b39d00,0x010ded8d),LL(0x54cfa0b5,0x7b1b80c8),LL(0xa0f8ea28,0x66beb876), LL(0x3476cd0e,0x50d7f531),LL(0xb08d3949,0xa63d0e65),LL(0x53479fc6,0x1a09eea9),LL(0xf499e742,0x82ae9891),
+ LL(0x5ca7d866,0xab58b910),LL(0x3adb3b34,0x582967e2),LL(0xcceac0bc,0x89ae4447),LL(0x7bf56af5,0x919c667c), LL(0x60f5dcd7,0x9aec17b1),LL(0xddcaadbc,0xec697b9f),LL(0x463467f5,0x0b98f341),LL(0xa967132f,0xb187f1f7),
+ LL(0x214aeb18,0x90fe7a1d),LL(0x741432f7,0x1506af3c),LL(0xe591a0c4,0xbb5565f9),LL(0xb44f1bc3,0x10d41a77), LL(0xa84bde96,0xa09d65e4),LL(0xf20a6a1c,0x42f060d8),LL(0xf27f9ce7,0x652a3bfd),LL(0x3b3d739f,0xb6bdb65c),
+ LL(0xec7fae9f,0xeb5ddcb6),LL(0xefb66e5a,0x995f2714),LL(0x69445d52,0xdee95d8e),LL(0x09e27620,0x1b6c2d46), LL(0x8129d716,0x32621c31),LL(0x0958c1aa,0xb03909f1),LL(0x1af4af63,0x8c468ef9),LL(0xfba5cdf6,0x162c429f),
+ LL(0x753b9371,0x2f682343),LL(0x5f1f9cd7,0x29cab45a),LL(0xb245db96,0x571623ab),LL(0x3fd79999,0xc507db09), LL(0xaf036c32,0x4e2ef652),LL(0x05018e5c,0x86f0cc78),LL(0xab8be350,0xc10a73d4),LL(0x7e826327,0x6519b397),
+ LL(0x9c053df7,0xe8cb5eef),LL(0xb300ea6f,0x8de25b37),LL(0xc849cffb,0xdb03fa92),LL(0xe84169bb,0x242e43a7), LL(0xdd6f958e,0xe4fa51f4),LL(0xf4445a8d,0x6925a77f),LL(0xe90d8949,0xe6e72a50),LL(0x2b1f6390,0xc66648e3),
+ LL(0x173e460c,0xb2ab1957),LL(0x30704590,0x1bbbce75),LL(0xdb1c7162,0xc0a90dbd),LL(0x15cdd65d,0x505e399e), LL(0x57797ab7,0x68434dcb),LL(0x6a2ca8e8,0x60ad35ba),LL(0xde3336c1,0x4bfdb1e0),LL(0xd8b39015,0xbbef99eb),
+ LL(0x1711ebec,0x6c3b96f3),LL(0xce98fdc4,0x2da40f1f),LL(0x57b4411f,0xb99774d3),LL(0x15b65bb6,0x87c8bdf4), LL(0xc2eef12d,0xda3a89e3),LL(0x3c7471f3,0xde95bb9b),LL(0xd812c594,0x600f225b),LL(0x2b75a56b,0x54907c5d),
+ LL(0x8db60e35,0xa93cc5f0),LL(0xfa833319,0x743e3cd6),LL(0xf81683c9,0x7dad5c41),LL(0x9c34107e,0x70c1e7d9), LL(0xa6be0907,0x0edc4a39),LL(0x86d0b7d3,0x36d47035),LL(0x272bfa60,0x8c76da03),LL(0x0f08a414,0x0b4a07ea),
+ LL(0x45c1dd53,0x699e4d29),LL(0x231debb5,0xcadc5898),LL(0xa77f00e0,0xdf49fcc7),LL(0xa73e5a0e,0x93057bbf), LL(0x027a4cd1,0x2f8b7ecd),LL(0xc614011a,0x114734b3),LL(0x67677c68,0xe7a01db7),LL(0x7e273f4f,0x89d9be5e),
+ LL(0x089808ef,0xd225cb2e),LL(0xd59e4107,0xf1f7a27d),LL(0x8211b9c9,0x53afc761),LL(0xe6819159,0x0361bc67), LL(0x7f071426,0x2a865d0b),LL(0xe7072567,0x6a3c1810),LL(0x0d6bcabd,0x3e3bca1e),LL(0x408591bc,0xa1b02bc1),
+ LL(0x31fba239,0xe0deee59),LL(0x98bd91d1,0xf47424d3),LL(0x071a3c1d,0x0f8886f4),LL(0xa819233b,0x3f7d41e8), LL(0xcf6eb998,0x708623c2),LL(0x609a287f,0x86bb49af),LL(0x63c90762,0x942bb249),LL(0x55a9654b,0x0ef6eea5),
+ LL(0x36f5defe,0x5f6d2d72),LL(0x56f99176,0xfa9922dc),LL(0xf78ce0c7,0x6c8c5ece),LL(0xbe09b55e,0x7b44589d), LL(0x9ea83770,0xe11b3bca),LL(0x2ab71547,0xd7fa2c7f),LL(0x2a1ddcc0,0x2a3dd6fa),LL(0x5a7b7707,0x09acb430),
+ LL(0x649d4e57,0x4add4a2e),LL(0x1917526e,0xcd53a2b0),LL(0x20b44ac4,0xc5262330),LL(0xbaa2c31d,0x4028746a), LL(0x64291d4c,0x51318390),LL(0xee5ad909,0xbf48f151),LL(0x7b185681,0xcce57f59),LL(0x4854d442,0x7c3ac1b0),
+ LL(0xc093c171,0x65587dc3),LL(0x24f42b65,0xae7acb24),LL(0x955996cb,0x5a338adb),LL(0x6051f91b,0xc8e65675), LL(0x28b8d0b1,0x66711fba),LL(0xb6c10a90,0x15d74137),LL(0x3a232a80,0x70cdd7eb),LL(0x6191ed24,0xc9e2f07f),
+ LL(0xf79588c0,0xa80d1db6),LL(0xb55768cc,0xfa52fc69),LL(0x7f54438a,0x0b4df1ae),LL(0xf9b46a4f,0x0cadd1a7), LL(0x1803dd6f,0xb40ea6b3),LL(0x55eaae35,0x488e4fa5),LL(0x382e4e16,0x9f047d55),LL(0x2f6e0c98,0xc9b5b7e0),
+ LL(0x95762649,0x6b1bd2d3),LL(0xc7aea3f6,0xa9604ee7),LL(0x6dc6f896,0x3646ff27),LL(0x2860bad1,0x9bf0e7f5), LL(0x7cb44b92,0x2d92c821),LL(0xaea9c182,0xa2f5ce63),LL(0x9154a5fd,0xd0a2afb1),LL(0x95801da6,0x482e474c),
+ LL(0xb611c24b,0xc19972d0),LL(0x60a8f351,0x1d468e65),LL(0x7bcf6421,0xeb758069),LL(0x88fbc491,0xec9dd0ee), LL(0x956c2e32,0x5b59d2bf),LL(0xdcddf94e,0x73dc6864),LL(0xbcee7665,0xfd5e2321),LL(0x5e9a06c4,0xa7b4f8ef),
+ LL(0x7280f855,0xfba918dd),LL(0x8baec688,0xbbaac260),LL(0x33400f42,0xa3b3f00f),LL(0x66f2e6e4,0x3d2dba29), LL(0x98509375,0xb6f71a94),LL(0xcea423cc,0x8f33031f),LL(0x4807e6fb,0x009b8dd0),LL(0x5cdb954c,0x5163cfe5),
+ LL(0xcf41c6e8,0x03cc8f17),LL(0x037b925c,0xf1f03c2a),LL(0x66d2427c,0xc39c19cc),LL(0x7b6c18e4,0x823d24ba), LL(0x901f0b4f,0x32ef9013),LL(0xf8941c2e,0x684360f1),LL(0x2c28092e,0x0ebaff52),LL(0x256c932f,0x7891e4e3),
+ LL(0xac445e3d,0x51264319),LL(0x8ea74381,0x553432e7),LL(0x67e9c50a,0xe6eeaa69),LL(0x62e628c7,0x27ced284), LL(0x7a4afa57,0x3f96d375),LL(0xe484c150,0xde0a14c3),LL(0x38bd9923,0x364a24eb),LL(0xe5177422,0x1df18da0),
+ LL(0xd8d38a9b,0x174e8f82),LL(0xe7de1391,0x2e97c600),LL(0xa1c175dd,0xc5709850),LL(0x32ae5035,0x969041a0), LL(0x76a2086b,0xcbfd533b),LL(0xd7c2e8fe,0xd6bba71b),LL(0x099dfb67,0xb2d58ee6),LL(0x064a85d9,0x3a8b342d),
+ LL(0x522f9be3,0x3bc07649),LL(0xdf1f49a8,0x690c075b),LL(0x3854ec42,0x80e1aee8),LL(0x17689dc7,0x2a7dbf44), LL(0x3faf4078,0xc004fc0e),LL(0xdf11862c,0xb2f02e9e),LL(0xa0a1b7b3,0xf10a5e0f),LL(0x8936ec80,0x30aca623),
+ LL(0x02f40d9a,0xf83cbf05),LL(0x2c318a4d,0x4681c468),LL(0x0e9c2674,0x98575618),LL(0x1847092e,0xbe79d046), LL(0x78bd01e0,0xaf1e480a),LL(0x72a51db9,0x6dd359e4),LL(0xe3afbab6,0x62ce3821),LL(0x17733199,0xc5cee5b6),
+ LL(0x6ffd9fbb,0xe08b30d4),LL(0x36c610b7,0x6e5bc699),LL(0x9ce262cf,0xf343cff2),LL(0x68b914c1,0xca2e4e35), LL(0x16de36c5,0x011d64c0),LL(0x42e2b829,0xe0b10fdd),LL(0x6685aaf8,0x78942981),LL(0x230ede97,0xe7511708),
+ LL(0x3b922bf8,0x671ed8fc),LL(0x4c29b133,0xe4d8c0a0),LL(0x3b6e99c4,0x87eb1239),LL(0x8793beba,0xaff3974c), LL(0x2c18df9b,0x03749405),LL(0x91007139,0xc5c3a293),LL(0xe37a0b95,0x6a77234f),LL(0xb661c96b,0x02c29a21),
+ LL(0x141ecf61,0xc3aaf1d6),LL(0x3bb22f53,0x9195509e),LL(0x22d51357,0x29597404),LL(0x537bed60,0x1b083822), LL(0xe07289f0,0xcd7d6e35),LL(0x6dd86eff,0x1f94c48c),LL(0xeb0f9cfa,0xc8bb1f82),LL(0x1b2eb97d,0x9ee0b7e6),
+ LL(0x34d74e31,0x5a52fe2e),LL(0x3bf79ab6,0xa352c310),LL(0xabfeeb8f,0x97ff6c5a),LL(0xf5c97305,0xbfbe8fef), LL(0xa7904608,0xd6081ce6),LL(0xc4fca249,0x1f812f3a),LL(0xb9e5e200,0x9b24bc9a),LL(0x38012ee8,0x91022c67),
+ LL(0x30a713a1,0xe83d9c5d),LL(0x84ef0f93,0x4876e3f0),LL(0xc1fbf928,0xc9777029),LL(0xbce7d2a4,0xef7a6bb3), LL(0xdfa2a659,0xb8067228),LL(0xd877a48f,0xd5cd3398),LL(0x025d0f3f,0xbea4fd8f),LL(0x2eae7c2b,0xd67d2e35),
+ LL(0xcc5f4394,0x184de7d7),LL(0x4536e142,0xb5551b5c),LL(0xd34aa60a,0x2e89b212),LL(0xf50051d5,0x14a96fea), LL(0x0d12bb0b,0x4e21ef74),LL(0x60b9677e,0xc522f020),LL(0x2df7731d,0x8b12e467),LL(0x7b326d31,0x39f80382),
+ LL(0x39024a94,0xdfb8630c),LL(0x97319452,0xaacb96a8),LL(0xeda3867c,0xd68a3961),LL(0x77c4ffca,0x0c58e2b0), LL(0x4da919fa,0x3d545d63),LL(0xf15e2289,0xef79b69a),LL(0x808bab10,0x54bc3d3d),LL(0x45f82c37,0xc8ab3007),
+ LL(0x7c4a658a,0xc12738b6),LL(0x40e72182,0xb3c47639),LL(0x8798e44f,0x3b77be46),LL(0x17a7f85f,0xdc047df2), LL(0x5e59d92d,0x2439d4c5),LL(0xe8e64d8d,0xcedca475),LL(0x87ca9b16,0xa724cd0d),LL(0xa5540dfe,0x35e4fd59),
+ LL(0xe4bcf6b1,0xf8c1ff18),LL(0x295018fa,0x856d6285),LL(0x3263c949,0x433f665c),LL(0xa1f21409,0xa6a76dd6), LL(0xcc7b4f79,0x17d32334),LL(0x06720e4a,0xa1d03122),LL(0x81d9bed5,0xadb6661d),LL(0x11db15d1,0xf0d6fb02),
+ LL(0x1fb747d2,0x7fd11ad5),LL(0x3033762b,0xab50f959),LL(0xfbefaf5a,0x2a7e711b),LL(0x3fef2bbf,0xc7393278), LL(0x0df6f9be,0xe29fa244),LL(0x71efd215,0x9092757b),LL(0x4f3d6fd9,0xee60e311),LL(0x0acfb78b,0x338542d4),
+ LL(0x38961a0f,0x44a23f08),LL(0x986987ca,0x1426eade),LL(0x4a863cc6,0x36e6ee2e),LL(0x628b8b79,0x48059420), LL(0x7396e1de,0x30303ad8),LL(0x38c5aad1,0x5c8bdc48),LL(0x5c8f5066,0x3e40e11f),LL(0x8d246bbd,0xabd6e768),
+ LL(0x23330a01,0x68aa40bb),LL(0xc34eafa0,0xd23f5ee4),LL(0x5de02c21,0x3bbee315),LL(0xd1d8dd06,0x18dd4397), LL(0x122d7b44,0x3ba1939a),LL(0xa33870d6,0xe6d3b40a),LL(0x1c4fe3f8,0x8e620f70),LL(0xd3a50cbf,0xf6bba1a5),
+ LL(0xcfc0aee0,0x4a78bde5),LL(0xc08c50bd,0x847edc46),LL(0xad63c9b2,0xbaa2439c),LL(0x10fc2acb,0xceb4a728), LL(0x26da033d,0xa419e40e),LL(0x03e02683,0x6cc3889d),LL(0xfdccf725,0x1cd28559),LL(0x8d13d208,0x0fd7e0f1),
+ LL(0x1f0df9d4,0x01b9733b),LL(0xa2b5e4f3,0x8cc2c5f3),LL(0x3a304fd4,0x43053bfa),LL(0x0a9f1aa7,0x8e87665c), LL(0xd73dc965,0x087f29ec),LL(0x3e9023db,0x15ace455),LL(0x2bce28b4,0x2370e309),LL(0xb6b1e84a,0xf9723442),
+ LL(0xb72d9f26,0xbeee662e),LL(0xf0e47109,0xb19396de),LL(0xe13289d0,0x85b1fa73),LL(0x54e58e32,0x436cf77e), LL(0xe990ef77,0x0ec833b3),LL(0x1b11fc25,0x7373e3ed),LL(0x0fc332ce,0xbe0eda87),LL(0x8d7ea856,0xced04970),
+ LL(0x7e977ca0,0xf85ff785),LL(0xdfdd5d2b,0xb66ee8da),LL(0x905af461,0xf5e37950),LL(0x966d487c,0x587b9090), LL(0x32ba0127,0x6a198a1b),LL(0x141615ac,0xa7720e07),LL(0x996ef2f2,0xa23f3499),LL(0x470bcb3d,0xef5f64b4),
+ LL(0x92b8c559,0xa526a962),LL(0x69740a0f,0x0c14aac0),LL(0xa6bdc0a5,0x0d41a9e3),LL(0x9c48aef4,0x97d52106), LL(0x3e7c253b,0xcf16bd30),LL(0x47fdedc1,0xcc834b1a),LL(0x373aab2e,0x7362c6e5),LL(0xc5f590ff,0x264ed85e),
+ LL(0x66d41870,0x7a46d9c0),LL(0x4787ba09,0xa50c20b1),LL(0xe3d44635,0x185e7e51),LL(0x31e2d8dc,0xb3b3e080), LL(0xa179e9d9,0xbed1e558),LL(0x74a76781,0x2daa3f79),LL(0x3a40864f,0x4372baf2),LL(0x4fe75cb5,0x46900c54),
+ LL(0xf76765d0,0xb95f171e),LL(0x95c87502,0x4ad726d2),LL(0x4d7c99bd,0x2ec769da),LL(0xc36cdfa8,0x5e2ddd19), LL(0xa93e6dea,0xc22117fc),LL(0x93771123,0xe8a2583b),LL(0xfa08a3a2,0xbe2f6089),LL(0x8f0e1112,0x4809d5ed),
+ LL(0xda7a095e,0x3b414aa3),LL(0x26f5aadd,0x9049acf1),LL(0x6be8b84a,0x78d46a4d),LL(0xb732b9b3,0xd66b1963), LL(0xde6e9555,0x5c2ac2a0),LL(0xb5bd8770,0xcf52d098),LL(0x0fd28921,0x15a15fa6),LL(0x8b27536d,0x56ccb81e),
+ LL(0x9f4ccbb8,0x0f0d8ab8),LL(0xdb221729,0xed5f44d2),LL(0x00bed10c,0x43141988),LL(0x1d735b8b,0xc94348a4), LL(0x29ef8479,0x79f3e9c4),LL(0x614c693f,0x4c13a4e3),LL(0x8e143a14,0x32c9af56),LL(0xe29ac5c4,0xbc517799),
+ LL(0x2774856f,0x05e17992),LL(0x6c1bf55f,0x6e52fb05),LL(0xe4f19e16,0xaeda4225),LL(0xaf5ccb26,0x70f4728a), LL(0xb2947f22,0x5d2118d1),LL(0x281d6fb9,0xc827ea16),LL(0x8cf0eabd,0x8412328d),LL(0x03ef9dcf,0x45ee9fb2),
+ LL(0xbb937d63,0x8e700421),LL(0xcc4b37a6,0xdf8ff2d5),LL(0x5ced7b68,0xa4c0d5b2),LL(0xc7308f59,0x6537c1ef), LL(0x3b37f8e8,0x25ce6a26),LL(0xdeebc6ce,0x170e9a9b),LL(0x8728d72c,0xdd037952),LL(0x850154bc,0x445b0e55),
+ LL(0x83a7337b,0x4b7d0e06),LL(0xffecf249,0x1e3416d4),LL(0x66a2b71f,0x24840eff),LL(0xb37cc26d,0xd0d9a50a), LL(0x6fe28ef7,0xe2198150),LL(0x23324c7f,0x3cc5ef16),LL(0x769b5263,0x220f3455),LL(0xa10bf475,0xe2ade2f1),
+ LL(0x458d3671,0x28cd20fa),LL(0x2dc4847b,0x1549722c),LL(0x591941e3,0x6dd01e55),LL(0x27128ccb,0x0e6fbcea), LL(0x3bef0262,0xae1a1e6b),LL(0x8f54e103,0xfa8c472c),LL(0x72c052ec,0x7539c0a8),LL(0x5a3490e9,0xd7b27369),
+ LL(0x71684349,0x143fe1f1),LL(0x32e19b97,0x36b4722e),LL(0x90980aff,0xdc059227),LL(0x9e13d674,0x175c9c88), LL(0x6e6bfdb1,0xa7de5b22),LL(0xbedb4b46,0x5ea5b7b2),LL(0xd34a6e44,0xd5570191),LL(0xa24ff7e6,0xfcf60d2e),
+ LL(0x677819e1,0x614a392d),LL(0xaa5a29e8,0x7be74c7e),LL(0x63c85f3f,0xab50fece),LL(0x46cab337,0xaca2e2a9), LL(0x122a6fe3,0x7f700388),LL(0x882a04a8,0xdb69f703),LL(0xcf7aed57,0x9a77935d),LL(0x8d91c86f,0xdf16207c),
+ LL(0x63ed9998,0x2fca49ab),LL(0xa77ddf96,0xa3125c44),LL(0x24344072,0x05dd8a86),LL(0xfec3fb56,0xa023dda2), LL(0x0c743032,0x421b41fc),LL(0x5e438639,0x4f2120c1),LL(0xc83c1b07,0xfb7cae51),LL(0xcac2171a,0xb2370caa),
+ LL(0x6cc820fb,0x2eb2d962),LL(0xb85a44bf,0x59feee5c),LL(0x5b6598f0,0x94620fca),LL(0x7e314051,0x6b922cae), LL(0x106bed4e,0xff8745ad),LL(0xdfa1e9ab,0x546e71f5),LL(0x1ec29487,0x935c1e48),LL(0x4d936530,0x9509216c),
+ LL(0x85c9a2db,0xc7ca3067),LL(0x6be8606f,0xd6ae5152),LL(0xe14c651d,0x09dbcae6),LL(0x9bc32f96,0xc9536e23), LL(0x34521b03,0xa90535a9),LL(0x878756ff,0xf39c526c),LL(0x8aedf03c,0x383172ec),LL(0xefe0c034,0x20a8075e),
+ LL(0x64026422,0xf22f9c62),LL(0x24b9d076,0x8dd10780),LL(0x3bef2950,0x944c742a),LL(0x88a2b00b,0x55b9502e), LL(0x86a09817,0xa59e14b4),LL(0x47bb4071,0xa39dd3ac),LL(0x3be0592f,0x55137f66),LL(0xc9e63f5b,0x07fcafd4),
+ LL(0x346eb226,0x963652ee),LL(0xec2facb7,0x7dfab085),LL(0x691add26,0x273bf2b8),LL(0xf2b46c44,0x30d74540), LL(0xf2c2d065,0x05e8e73e),LL(0xd42eeac9,0xff9b8a00),LL(0x97209d22,0x2fcbd205),LL(0xde14ea2c,0xeb740ffa),
+ LL(0xa8aef518,0xc71ff913),LL(0xfff4cfa2,0x7bfc74bb),LL(0xb6b36048,0x1716680c),LL(0x9ef79af1,0x121b2cce), LL(0xa01eb3d3,0xbff3c836),LL(0x5f79077b,0x50eb1c6a),LL(0xa004bbcf,0xa48c32d6),LL(0x7d64f61d,0x47a59316),
+ LL(0x93102016,0x6068147f),LL(0x94d12576,0x12c5f654),LL(0xc9bc6b91,0xefb071a7),LL(0x6e23ea95,0x7c2da0c5), LL(0xd4a1dd5d,0xf4fd45b6),LL(0x9122b13c,0x3e7ad9b6),LL(0xe6f57a48,0x342ca118),LL(0x06f8288f,0x1c2e94a7),
+ LL(0x5a97d231,0x99e68f07),LL(0x4d838758,0x7c80de97),LL(0x05872727,0xbce0f5d0),LL(0x19c4d016,0xbe5d95c2), LL(0x9c2492ee,0x921d5cb1),LL(0x404d6fb3,0x42192dc1),LL(0x32f988d3,0x4c84dcd1),LL(0xa17b8e85,0xde26d61f),
+ LL(0x137c7408,0xc466dcb6),LL(0x36a266da,0x9a38d7b6),LL(0x83bebf1b,0x7ef5cb06),LL(0x0fd014e3,0xe5cdcbbf), LL(0xf65965a0,0x30aa376d),LL(0xebb3e95e,0x60fe88c2),LL(0x66ee6f20,0x33fd0b61),LL(0x3f41f0a0,0x8827dcdb),
+ LL(0x0c56c690,0xbf8a9d24),LL(0xddb7641d,0x40265dad),LL(0x3a6b662b,0x522b05bf),LL(0xb1478c9b,0x466d1dfe), LL(0x1484469b,0xaa616962),LL(0x02df8f9f,0x0db60549),LL(0x3cb8bf51,0xc37bca02),LL(0x21371ce8,0x5effe346),
+ LL(0xff112c32,0xe8f65264),LL(0x7b971fb2,0x8a9c736d),LL(0x7b75080d,0xa4f19470),LL(0x8839c59b,0xfc3f2c5a), LL(0x5aeb49c2,0x1d6c777e),LL(0xda1addfe,0xf3db034d),LL(0x5535affc,0xd76fee5a),LL(0xb92251fd,0x0853ac70),
+ LL(0x8b2a29d5,0x37e3d594),LL(0x4de00ddb,0x28f1f457),LL(0xf42c328b,0x8083c1b5),LL(0xe493c73b,0xd8ef1d8f), LL(0x41dc61bd,0x96fb6260),LL(0x27ee2f8a,0xf74e8a9d),LL(0x2c946a5d,0x7c605a80),LL(0x3839ccfd,0xeed48d65),
+ LL(0x3a29467a,0x9894344f),LL(0xc51eba6d,0xde81e949),LL(0xa5e5c2f2,0xdaea066b),LL(0x08c8c7b3,0x3fc8a614), LL(0x06d0de9f,0x7adff88f),LL(0x3b75ce0a,0xbbc11cf5),LL(0xfbbc87d5,0x9fbb7acc),LL(0x7badfde2,0xa1458e26),
+},
+/* digit=13 base_pwr=2^91 */
+{
+ LL(0xe039c256,0x1cb43668),LL(0x7c17fd5d,0x5f26fb8b),LL(0x79aa062b,0xeee426af),LL(0xd78fbf04,0x072002d0), LL(0xe84fb7e3,0x4c9ca237),LL(0x0c82133d,0xb401d8a1),LL(0x6d7e4181,0xaaa52592),LL(0x73dbb152,0xe9430833),
+ LL(0xbe24319a,0xf92dda31),LL(0xe095a8e7,0x03f7d28b),LL(0x98782185,0xa52fe840),LL(0x29c24dbc,0x276ddafe), LL(0x1d7a64eb,0x80cd5496),LL(0x7f1dbe42,0xe4360889),LL(0x8438d2d5,0x2f81a877),LL(0x85169036,0x7e4d52a8),
+ LL(0x1d59715d,0x19e3d5b1),LL(0xd788983e,0xc7eaa762),LL(0xabf1f248,0xe5a730b0),LL(0xfae3fd83,0xfbab8084), LL(0x53765b2f,0x65e50d21),LL(0xfa127f3d,0xbdd4e083),LL(0x397b1b10,0x9cf3c074),LL(0xb1b59fd3,0x59f8090c),
+ LL(0x615faa8f,0x7b15fd9d),LL(0x968554ed,0x8fa1eb40),LL(0x7aa44882,0x7bb4447e),LL(0x029fff32,0x2bb2d0d1), LL(0x6caa6d2f,0x075e2a64),LL(0x22e7351b,0x8eb879de),LL(0x9a506c62,0xbcd5624e),LL(0xa87e24dc,0x218eaef0),
+ LL(0x44ddfa35,0x37e56847),LL(0xdab3f747,0x9ccfc5c5),LL(0x1ee96cf4,0x9ac1df3f),LL(0x3b480b8f,0x0c0571a1), LL(0x4b3a7b3c,0x2fbeb3d5),LL(0x5dcdbb99,0x35c03669),LL(0xb2415b3a,0x52a0f5dc),LL(0x4413ed9a,0xd57759b4),
+ LL(0x3d30a2c5,0x1fe647d8),LL(0xf78a81dc,0x0857f77e),LL(0x131a4a9b,0x11d5a334),LL(0x29d393f5,0xc0a94af9), LL(0xdaa6ec1a,0xbc3a5c0b),LL(0x88d2d7ed,0xba9fe493),LL(0xbb614797,0xbb4335b4),LL(0x72f83533,0x991c4d68),
+ LL(0xd2f01cb3,0x53258c28),LL(0xd75db0b1,0x93d6eaa3),LL(0xe87d0db4,0x419a2b0d),LL(0xd8fe8493,0xa1e48f03), LL(0xc508b23a,0xf747faf6),LL(0x35d53549,0xf137571a),LL(0xfcf9b838,0x9f5e58e2),LL(0xa7fd3cf5,0xc7186cee),
+ LL(0xe978a1d3,0x77b868ce),LL(0x7ab92d04,0xe3a68b33),LL(0x87a5b862,0x51029794),LL(0x3a61d41d,0x5f0606c3), LL(0x6f9326f1,0x2814be27),LL(0xc6fe3c2e,0x2f521c14),LL(0xacdf7351,0x17464d7d),LL(0x777f7e44,0x10f5f9d3),
+ LL(0x269fb37d,0xce8e616b),LL(0x7de62de5,0xaaf73804),LL(0x4fdd4153,0xaba11175),LL(0x3770b49b,0x515759ba), LL(0xaa423a61,0x8b09ebf8),LL(0xcd41fb92,0x592245a1),LL(0x9b4c8936,0x1cba8ec1),LL(0xaf36710e,0xa87e91e3),
+ LL(0x3d34a2e3,0x1fd84ce4),LL(0xb43b5d61,0xee3759ce),LL(0x619186c7,0x895bc78c),LL(0xcbb9725a,0xf19c3809), LL(0xde744b1f,0xc0be21aa),LL(0x60f8056b,0xa7d222b0),LL(0xb23efe11,0x74be6157),LL(0x0cd68253,0x6fab2b4f),
+ LL(0x4bf1d725,0xad33ea5f),LL(0x4f6c950f,0x9c1d8ee2),LL(0xa377af06,0x544ee78a),LL(0x94a113e1,0x54f489bb), LL(0x992fb7e8,0x8f11d634),LL(0xa2a44347,0x0169a7aa),LL(0x95020e00,0x1d49d4af),LL(0xe08e120b,0x95945722),
+ LL(0xa4d32282,0xb6e33878),LL(0x48020ae7,0xe36e029d),LL(0x37a9b750,0xe05847fb),LL(0xb29e3819,0xf876812c), LL(0xd23a17f0,0x84ad138e),LL(0xf0b3950e,0x6d7b4480),LL(0x2fd67ae0,0xdfa8aef4),LL(0x52333af6,0x8d3eea24),
+ LL(0xb15d5acc,0x0d052075),LL(0xbd815bc4,0xc6d9c79f),LL(0xdfa36cf2,0x8dcafd88),LL(0x38aa9070,0x908ccbe2), LL(0xba35afce,0x638722c4),LL(0xfd6abf0b,0x5a3da8b0),LL(0xc9c335c1,0x2dce252c),LL(0x65aa799b,0x84e7f0de),
+ LL(0xb99a72cb,0x2101a522),LL(0x87618016,0x06de6e67),LL(0xe6f3653e,0x5ff8c7cd),LL(0xc7a6754a,0x0a821ab5), LL(0x7cb0b5a2,0x7e3fa52b),LL(0xc9048790,0xa7fb121c),LL(0x06ce053a,0x1a725020),LL(0x04e929b0,0xb490a31f),
+ LL(0x62dd61ad,0xe17be47d),LL(0x6be01371,0x781a961c),LL(0xdae3cbba,0x1063bfd3),LL(0x7f73c9ba,0x35647406), LL(0x2736a129,0xf50e957b),LL(0xed13f256,0xa6313702),LL(0x3a19fcc5,0x9436ee65),LL(0xe7a4c8b6,0xcf2bdb29),
+ LL(0xc5f95cd8,0xb06b1244),LL(0xf4ab95f4,0xda8c8af0),LL(0xb9e5836d,0x1bae59c2),LL(0x3acffffc,0x07d51e7e), LL(0xc2ccbcda,0x01e15e6a),LL(0x8528c3e0,0x3bc1923f),LL(0xa49fead4,0x43324577),LL(0x2aa7a711,0x61a1b884),
+ LL(0x700230ef,0xf9a86e08),LL(0xbd19adf8,0x0af585a1),LL(0xf55ad8f2,0x7645f361),LL(0x46c3614c,0x6e676223), LL(0x4e774d3f,0x23cb257c),LL(0xac102d1b,0x82a38513),LL(0x7b126aa5,0x9bcddd88),LL(0xeefd3ee4,0xe716998b),
+ LL(0xfb167583,0x4239d571),LL(0xd16c8f8a,0xdd011c78),LL(0x69a27519,0x271c2895),LL(0xd2d64b6a,0x9ce0a3b7), LL(0xd5ec6738,0x8c977289),LL(0x8840ef6b,0xa3b49f9a),LL(0x9a453419,0x808c14c9),LL(0x0cf0a2d5,0x5c00295b),
+ LL(0x1d4bcc76,0x524414fb),LL(0x459a88f1,0xb07691d2),LL(0xf70d110f,0x77f43263),LL(0xb7abf9f3,0x64ada5e0), LL(0x5b544cf5,0xafd0f94e),LL(0xfd2713fe,0xb4a13a15),LL(0x250c74f4,0xb99b7d6e),LL(0x20324e45,0x097f2f73),
+ LL(0xaffa8208,0x994b37d8),LL(0xdc29aafc,0xc3c31b0b),LL(0x7a3a607f,0x3da74651),LL(0xfe6955d6,0xd8e1b8c1), LL(0xc8418682,0x716e1815),LL(0x7dc91d97,0x541d487f),LL(0xc6996982,0x48a04669),LL(0x83a6502e,0xf39cab15),
+ LL(0xe68db055,0x025801a0),LL(0xba3338d5,0xf3569758),LL(0xee2afa84,0xb0c8c0aa),LL(0xfb6562d1,0x4f6985d3), LL(0x132ed17a,0x351f1f15),LL(0xc04365fe,0x510ed0b4),LL(0xe5b1f066,0xa3f98138),LL(0x32df03dc,0xbc9d95d6),
+ LL(0x19abd09e,0xa83ccf6e),LL(0x4ff17edb,0x0b4097c1),LL(0xd64a06ce,0x58a5c478),LL(0x544a58fd,0x2ddcc3fd), LL(0x9e8153b8,0xd449503d),LL(0x7774179b,0x3324fd02),LL(0xdbd9120c,0xaf5d47c8),LL(0x34fa94db,0xeb860162),
+ LL(0x972f07f4,0x5817bdd1),LL(0xd27bbceb,0xe5579e2e),LL(0x5f11e5a6,0x86847a1f),LL(0x7c3cf048,0xb39ed255), LL(0xa2f62e55,0xe1076417),LL(0x1bcf82a2,0x6b9ab38f),LL(0x7aeb29f9,0x4bb7c319),LL(0x17227a46,0xf6d17da3),
+ LL(0x0f968c00,0xab53ddbd),LL(0x000c880b,0xa03da7ec),LL(0x6a9ad24d,0x7b239624),LL(0x01ec60d0,0x612c0401), LL(0x109f5df1,0x70d10493),LL(0x80af7550,0xfbda4030),LL(0xc6b9a9b3,0x30b93f95),LL(0x007d9418,0x0c74ec71),
+ LL(0x6edb951f,0x94175564),LL(0x7f22c282,0x5f4a9d78),LL(0xb38d1196,0xb7870895),LL(0xa228ce7c,0xbc593df3), LL(0x6af3641a,0xc78c5bd4),LL(0x3d9b3dcc,0x7802200b),LL(0x8be33304,0x0dc73f32),LL(0x61ffb79a,0x847ed87d),
+ LL(0x6d671192,0xf85c974e),LL(0xde16f60f,0x1e14100a),LL(0x95c38797,0x45cb0d5a),LL(0x9b022da4,0x18923bba), LL(0xbbe7e86e,0xef2be899),LL(0x216067bf,0x4a1510ee),LL(0x84d5ce3e,0xd98c8154),LL(0xf92a2b90,0x1af777f0),
+ LL(0x4ef65724,0x9fbcb400),LL(0x3c0ca6fe,0x3e04a4c9),LL(0x55002994,0xfb3e2cb5),LL(0x5363ecab,0x1f3a93c5), LL(0x3923555b,0x1fe00efe),LL(0x1e1751ea,0x744bedd9),LL(0x6ab69357,0x3fb2db59),LL(0xf5e6618b,0x8dbd7365),
+ LL(0xdf1ea40e,0x99d53099),LL(0x57d61e64,0xb3f24a0b),LL(0x596eb812,0xd088a198),LL(0x5762940b,0x22c8361b), LL(0xf9c0d95c,0x66f01f97),LL(0x8e43cdae,0x88461172),LL(0xb72b15c3,0x11599a7f),LL(0x420d95cc,0x135a7536),
+ LL(0x5f7ae2f6,0x2dcdf0f7),LL(0xd7fa6da2,0x15fc6e1d),LL(0xd1d441b6,0x81ca829a),LL(0x04a106b6,0x84c10cf8), LL(0xa73fbbd0,0xa9b26c95),LL(0x4d8f6ee8,0x7f24e0cb),LL(0x1e25a043,0x48b45937),LL(0x036f3dfe,0xf8a74fca),
+ LL(0xc9f84296,0x1ed46585),LL(0x3bc278b0,0x7fbaa8fb),LL(0x6c4fcbd0,0xa8e96cd4),LL(0x73b60a5f,0x940a1202), LL(0x55a4aec8,0x34aae120),LL(0xdbd742f0,0x550e9a74),LL(0x228c68ab,0x794456d7),LL(0xa4e25ec6,0x492f8868),
+ LL(0xb2d8f398,0x682915ad),LL(0x5b84c953,0xf13b51cc),LL(0x5bb917d6,0xcda90ab8),LL(0x4ea3dee1,0x4b615560), LL(0x0a52c1c8,0x578b4e85),LL(0x20b75fc4,0xeab1a695),LL(0xaa0bb3c6,0x60c14f3c),LL(0xb8216094,0x220f448a),
+ LL(0xb0e63d34,0x4fe7ee31),LL(0xa9e54fab,0xf4600572),LL(0xd5e7b5a4,0xc0493334),LL(0x06d54831,0x8589fb92), LL(0x6583553a,0xaa70f5cc),LL(0xe25649e5,0x0879094a),LL(0x10044652,0xcc904507),LL(0x02541c4f,0xebb0696d),
+ LL(0xb9718710,0x5a171fde),LL(0xf374a9f5,0x38f1bed8),LL(0xba39bdc1,0xc8c582e1),LL(0x908cc0ce,0xfc457b0a), LL(0x883841e2,0x9a187fd4),LL(0x38725381,0x8ec25b39),LL(0x96f84395,0x2553ed05),LL(0x6f6c6897,0x095c7661),
+ LL(0x4bdc5610,0x917ac85c),LL(0x179eb301,0xb2885fe4),LL(0x8b78bdcc,0x5fc65547),LL(0xe59e4699,0x4a9fc893), LL(0x3ce299af,0xbb7ff0cd),LL(0xadf38b20,0x195be9b3),LL(0xd38ddb8f,0x6a929c87),LL(0xb21a51b9,0x55fcc99c),
+ LL(0x721a4593,0x2b695b4c),LL(0x768eaac2,0xed1e9a15),LL(0x7489f914,0xfb63d71c),LL(0x78118910,0xf98ba31c), LL(0x9b128eb4,0x80291373),LL(0xd448af4a,0x7801214e),LL(0x55418dd3,0xdbd2e22b),LL(0xd3998242,0xeffb3c0d),
+ LL(0xc7bf3827,0xdfa6077c),LL(0x47f8238f,0xf2165bcb),LL(0x8564d554,0xfe37cf68),LL(0x0a81fb98,0xe5f825c4), LL(0xffed4d6f,0x43cc4f67),LL(0xb50a34b0,0xbc609578),LL(0x5041faf1,0x8aa8fcf9),LL(0x651773b6,0x5659f053),
+ LL(0x6044d63b,0xe87582c3),LL(0x0cdb0ca0,0xa6089409),LL(0xbfb2bcf6,0x8c993e0f),LL(0x45985cfc,0xfc64a719), LL(0x83dbedba,0x15c4da80),LL(0x2be67df7,0x804ae112),LL(0xa23defde,0xda4c9658),LL(0x5156e0d3,0x12002ddd),
+ LL(0x5dd21b96,0xe68eae89),LL(0xcf44624d,0x8b99f28b),LL(0x1ec8897a,0x0ae00808),LL(0x6712f76e,0xdd0a9303), LL(0x4e233de4,0x96237522),LL(0x2b36a8a5,0x192445b1),LL(0x023993d9,0xabf9ff74),LL(0x2aad4a8f,0x21f37bf4),
+ LL(0xf8bd2bbd,0x340a4349),LL(0x4868195d,0x1d902cd9),LL(0xe5fdb6f1,0x3d27bbf1),LL(0x124f9f1c,0x7a5ab088), LL(0xf7a09e03,0xc466ab06),LL(0x31f2c123,0x2f8a1977),LL(0x041b6657,0xda355dc7),LL(0x8ece2a7c,0xcb840d12),
+ LL(0x7db32675,0xb600ad9f),LL(0x07a06f1b,0x78fea133),LL(0xb31f6094,0x5d032269),LL(0x83ec37aa,0x07753ef5), LL(0x9c0bea78,0x03485aed),LL(0xbc3f4524,0x41bb3989),LL(0x697f726d,0x09403761),LL(0xdf394820,0x6109beb3),
+ LL(0x3b6d1145,0x804111ea),LL(0xa8582654,0xb6271ea9),LL(0x24e66562,0x619615e6),LL(0xd7b6ad9c,0xa2554945), LL(0x99bfe35f,0xd9c4985e),LL(0x7b51cdf6,0x9770ccc0),LL(0x92881832,0x7c327013),LL(0x286b26d1,0x8777d45f),
+ LL(0xd847999d,0x9bbeda22),LL(0xc3525d32,0x03aa33b6),LL(0x28a959a1,0x4b7b96d4),LL(0x31e5d234,0xbb3786e5), LL(0x6961f247,0xaeb5d3ce),LL(0x02f93d3f,0x20aa85af),LL(0xd7a7ae4f,0x9cd1ad3d),LL(0x781adaa8,0xbf6688f0),
+ LL(0x7469cead,0xb1b40e86),LL(0x309fca48,0x1904c524),LL(0x4b54bbc7,0x9b7312af),LL(0x593affa2,0xbe24bf8f), LL(0xbd98764b,0xbe5e0790),LL(0xa26e299e,0xa0f45f17),LL(0x6b8fe4c7,0x4af0d2c2),LL(0x8ae8a3e6,0xef170db1),
+ LL(0x29e0ccc1,0x0e8d61a0),LL(0x60ad36ca,0xcd53e87e),LL(0xc8173822,0x328c6623),LL(0xa496be55,0x7ee1767d), LL(0x648945af,0x89f13259),LL(0x25c8009c,0x9e45a5fd),LL(0x1f61ab8c,0xaf2febd9),LL(0x8a275385,0x43f6bc86),
+ LL(0xf2142e79,0x87792348),LL(0xc6e6238a,0x17d89259),LL(0x4a839d9b,0x7536d2f6),LL(0x76a1fbdc,0x1f428fce), LL(0x0db06dfe,0x1c109601),LL(0x50a3a3cc,0xbfc16bc1),LL(0x9b30f41b,0xf9cbd9ec),LL(0x00138cce,0x5b5da0d6),
+ LL(0x56ef96a7,0xec1d0a48),LL(0x982bf842,0xb47eb848),LL(0xec3f700d,0x66deae32),LL(0xaa1181e0,0x4e43c42c), LL(0xd1a4aa2a,0xa1d72a31),LL(0xc004f3ce,0x440d4668),LL(0x45fe8a7a,0x0d6a2d3b),LL(0xfb128365,0x820e52e2),
+ LL(0x25e51b09,0x29ac5fcf),LL(0x2023d159,0x180cd2bf),LL(0xa1ebf90e,0xa9892171),LL(0x7c132181,0xf97c4c87), LL(0xc03dbb7e,0x9f1dc724),LL(0x018cbbe4,0xae043765),LL(0x0767d153,0xfb0b2a36),LL(0x249cbaeb,0xa8e2f4d6),
+ LL(0xd95ea168,0x172a5247),LL(0x2970764a,0x1758fada),LL(0x1d978169,0xac803a51),LL(0xde77e01b,0x299cfe2e), LL(0xb0a98927,0x652a1e17),LL(0x20014495,0x2e26e1d1),LL(0x7175b56a,0x7ae0af9f),LL(0xd64b9f95,0xc2e22a80),
+ LL(0xd90a060a,0x4d0ff9fb),LL(0xbaf38085,0x496a27db),LL(0xda776bcf,0x32305401),LL(0x725f209e,0xb8cdcef6), LL(0x436a0bba,0x61ba0f37),LL(0x76860049,0x263fa108),LL(0xda3542cf,0x92beb98e),LL(0xd5849538,0xa2d4d14a),
+ LL(0x12e9a1bc,0x989b9d68),LL(0x5f6e3268,0x61d9075c),LL(0x99ace638,0x352c6aa9),LL(0x920f43ff,0xde4e4a55), LL(0xd673c017,0xe5e4144a),LL(0x6f6e05ea,0x667417ae),LL(0xdcd1bd56,0x613416ae),LL(0x86693711,0x5eb36201),
+ LL(0x3a1aa914,0x2d7bc504),LL(0x76dc5975,0x175a1299),LL(0x3fc8125c,0xe900e0f2),LL(0x11198875,0x569ef68c), LL(0x63a113b4,0x9012db63),LL(0x98835766,0xe3bd3f56),LL(0x76412dea,0xa5c94a52),LL(0xaa735e5c,0xad9e2a09),
+ LL(0x508b65e9,0x405a984c),LL(0x6df1a0d1,0xbde4a1d1),LL(0xdfba80da,0x1a9433a1),LL(0x9440ad2e,0xe9192ff9), LL(0x5099fe92,0x9f649696),LL(0x0b27a54a,0x25ddb65c),LL(0xc590da61,0x178279dd),LL(0xfbde681a,0x5479a999),
+ LL(0x013fe162,0xd0e84e05),LL(0x632d471b,0xbe11dc92),LL(0xfc0e089f,0xdf0b0c45),LL(0x4c144025,0x04fb15b0), LL(0x13c99927,0xa61d5fc2),LL(0x3de2eb35,0xa033e9e0),LL(0xb8dacbb4,0xf8185d5c),LL(0x8644549d,0x9a88e265),
+ LL(0x54671ff6,0xf717af62),LL(0x5fa58603,0x4bd4241b),LL(0xe67773c0,0x06fba40b),LL(0x6a2847e9,0xc1d933d2), LL(0x689e2c70,0xf4f5acf3),LL(0x46bafd31,0x92aab0e7),LL(0x3473f6e5,0x798d76aa),LL(0x93141934,0xcc6641db),
+ LL(0xd31e535e,0xcae27757),LL(0x87c2ee11,0x04cc43b6),LL(0x2e029ffa,0x8d1f9675),LL(0xe4cc7a2c,0xc2150672), LL(0x8d68b013,0x3b03c1e0),LL(0xedf298f3,0xa9d6816f),LL(0xa2804464,0x1bfbb529),LL(0x5db22125,0x95a52fae),
+ LL(0x0e1cb64e,0x55b32160),LL(0x7e7fc9fe,0x004828f6),LL(0x1bb0fb93,0x13394b82),LL(0x35f1a920,0xb6293a2d), LL(0xd145d2d9,0xde35ef21),LL(0xbb8fa603,0xbe6225b3),LL(0x32cf252d,0x00fc8f6b),LL(0x117cf8c2,0xa28e52e6),
+ LL(0x4c371e6d,0x9d1dc89b),LL(0x36ef0f28,0xcebe0675),LL(0xa4292f81,0x5de05d09),LL(0x353e3083,0xa8303593), LL(0x7e37a9bb,0xa1715b0a),LL(0x2b8faec3,0x8c56f61e),LL(0x33c9b102,0x52507431),LL(0xa44431f0,0x0130cefc),
+ LL(0xbd865cfb,0x56039fa0),LL(0xbc5f1dd7,0x4b03e578),LL(0xbabe7224,0x40edf2e4),LL(0x3a1988f6,0xc752496d), LL(0x564beb6b,0xd1572d3b),LL(0x39a1c608,0x0db1d110),LL(0x16f60126,0x568d1934),LL(0xf354af33,0x05ae9668),
+ LL(0xc92544f2,0x19de6d37),LL(0xa35837d5,0xcc084353),LL(0x1a514ece,0xcbb6869c),LL(0x2e1d1066,0xb633e728), LL(0x936c581c,0xf15dd69f),LL(0x7439c4f9,0x96e7b8ce),LL(0x2e448a5b,0x5e676f48),LL(0xfd916bbb,0xb2ca7d5b),
+ LL(0xf5024025,0xd55a2541),LL(0xe4c2d937,0x47bc5769),LL(0x0362189f,0x7d31b92a),LL(0xef7816f9,0x83f3086e), LL(0xb587579a,0xf9f46d94),LL(0x30e76c5f,0xec2d22d8),LL(0xb000ffcf,0x27d57461),LL(0x364ffc2c,0xbb7e65f9),
+ LL(0x6652a220,0x7c7c9477),LL(0xd696c981,0x61618f89),LL(0x89effff3,0x5021701d),LL(0x7c314163,0xf2c8ff8e), LL(0x8efb4d3e,0x2da413ad),LL(0xce176d95,0x937b5adf),LL(0x2a67d51c,0x22867d34),LL(0x18eb3ac9,0x262b9b10),
+ LL(0xc43ff28b,0x4e314fe4),LL(0x6a664e7a,0x76476627),LL(0xb7a565c2,0x3e90e40b),LL(0xc1acf831,0x8588993a), LL(0x8f938829,0xd7b501d6),LL(0x3edd7d4c,0x996627ee),LL(0x90cd34c7,0x37d44a62),LL(0xf3833e8d,0xa8327499),
+ LL(0x4bf50353,0x2e18917d),LL(0x556765fb,0x85dd726b),LL(0x93d5ab66,0x54fe65d6),LL(0x915c25fe,0x3ddbaced), LL(0x12f22e85,0xa799d9a4),LL(0x6d06f6bc,0xe2a24867),LL(0x43ca1637,0xf4f1ee56),LL(0x61ece30a,0xfda2828b),
+ LL(0xa2dee7a6,0x758c1a3e),LL(0x734b2284,0xdcde2f3c),LL(0x4eaba6ad,0xaba445d2),LL(0x76cee0a7,0x35aaf668), LL(0xe5aa049a,0x7e0b04a9),LL(0x91103e84,0xe74083ad),LL(0x40afecc3,0xbeb183ce),LL(0xea043f7a,0x6b89de9f),
+},
+/* digit=14 base_pwr=2^98 */
+{
+ LL(0xfe67ba66,0x0e299d23),LL(0x93cf2f34,0x91450760),LL(0x97fcf913,0xf45b5ea9),LL(0x8bd7ddda,0x5be00843), LL(0xd53ff04d,0x358c3e05),LL(0x5de91ef7,0xbf7ccdc3),LL(0xb69ec1a0,0xad684dbf),LL(0x801fd997,0x367e7cf2),
+ LL(0xb0dc8595,0x0ca1f3b7),LL(0x9f1d9f2e,0x27de4608),LL(0xbadd82a7,0x1af3bf39),LL(0x65862448,0x79356a79), LL(0xf5f9a052,0xc0602345),LL(0x139a42f9,0x1a8b0f89),LL(0x844d40fc,0xb53eee42),LL(0x4e5b6368,0x93b0bfe5),
+ LL(0xc024789c,0x5434dd02),LL(0x41b57bfc,0x90dca9ea),LL(0x243398df,0x8aa898e2),LL(0x894a94bb,0xf607c834), LL(0xc2c99b76,0xbb07be97),LL(0x18c29302,0x6576ba67),LL(0xe703a88c,0x3d79efcc),LL(0xb6a0d106,0xf259ced7),
+ LL(0xc8de610b,0x0f893a5d),LL(0x67e223ce,0xe8c515fb),LL(0x4ead6dc5,0x7774bfa6),LL(0x925c728f,0x89d20f95), LL(0x098583ce,0x7a1e0966),LL(0x93f2a7d7,0xa2eedb94),LL(0x4c304d4a,0x1b282097),LL(0xc077282d,0x0842e3da),
+ LL(0x3b9e2d7b,0xe4d972a3),LL(0xc48218ff,0x7cc60b27),LL(0x84149d91,0x8fc70838),LL(0x2f461ecc,0x5c04346f), LL(0x614650a9,0xebe9fdf2),LL(0xc1f666ac,0x5e35b537),LL(0x88babc83,0x645613d1),LL(0xc5e1c93e,0x88cace3a),
+ LL(0x3de92e23,0x209ca375),LL(0x5fbbb6e3,0xccb03cc8),LL(0xd7b1487e,0xccb90f03),LL(0xc710941f,0xfa9c2a38), LL(0x6724ceed,0x756c3823),LL(0x192d0323,0x3a902258),LL(0xea5e038e,0xb150e519),LL(0xc7427591,0xdcba2865),
+ LL(0x78890732,0xe549237f),LL(0x53fcb4d9,0xc443bef9),LL(0xeb3480d6,0x9884d8a6),LL(0x3048b186,0x8a35b6a1), LL(0x65e9a90a,0xb4e44716),LL(0x653006c0,0x45bf380d),LL(0x4fe9ae3b,0x8f3f820d),LL(0x979a3b71,0x244a35a0),
+ LL(0x74cd06ff,0xa1010e9d),LL(0xaca3eeac,0x9c17c7df),LL(0x8063aa2b,0x74c86cd3),LL(0x734614ff,0x8595c4b3), LL(0x990f62cc,0xa3de00ca),LL(0xca0c3be5,0xd9bed213),LL(0xdf8ce9f5,0x7886078a),LL(0x5cd44444,0xddb27ce3),
+ LL(0x58926ddd,0xed374a66),LL(0x908015b8,0x138b2d49),LL(0xde1f7ab8,0x886c6579),LL(0xc3020b7a,0x888b9aa0), LL(0x3a96e355,0xd3ec034e),LL(0xf30fbe9a,0xba65b0b8),LL(0xff21367a,0x064c8e50),LL(0x0b04b46e,0x1f508ea4),
+ LL(0x747c866c,0x98561a49),LL(0x0518a062,0xbbb1e5fe),LL(0xecdc3608,0x20ff4e8b),LL(0x20184027,0x7f55cded), LL(0xf38c85f0,0x8d73ec95),LL(0x8bc3b8c3,0x5b589fdf),LL(0x0f12b66f,0xbe95dd98),LL(0x0e338e01,0xf5bd1a09),
+ LL(0x5e915918,0x65163ae5),LL(0x86f8a46b,0x6158d6d9),LL(0xeeebf99c,0x8466b538),LL(0xbca477ef,0xca8761f6), LL(0x9ebbc601,0xaf3449c2),LL(0xe0c3ae2f,0xef3b0f41),LL(0x5de63752,0xaa6c577d),LL(0x64682a51,0xe9166601),
+ LL(0xfc15aa1e,0x5a3097be),LL(0xb54b0745,0x40d12548),LL(0x519a5f12,0x5bad4706),LL(0xa439dee6,0xed03f717), LL(0x4a02c499,0x0794bb6c),LL(0xcffe71d2,0xf725083d),LL(0x0f3adcaf,0x2cad7519),LL(0x43729310,0x7f68ea1c),
+ LL(0xb7ffd977,0xe747c8c7),LL(0x80761a22,0xec104c35),LL(0x5a3ffb83,0x8395ebaf),LL(0xe4b63db7,0xfb3261f4), LL(0xd883e544,0x53544960),LL(0x8cc2eeb8,0x13520d70),LL(0xd3d65f99,0x08f6337b),LL(0x781cf95b,0x83997db2),
+ LL(0x0dbd2c01,0xce6ff106),LL(0x1f9ce934,0x4f8eea6b),LL(0x0e993921,0x546f7c4b),LL(0x5e753fc7,0x6236a324), LL(0xa16022e9,0x65a41f84),LL(0x43d1dbb2,0x0c18d878),LL(0x2d4cef9c,0x73c55640),LL(0x70444c74,0xa0428108),
+ LL(0x9afdfb3c,0x68e4f15e),LL(0x5bdfb6df,0x49a56143),LL(0x5f823d97,0xa9bc1bd4),LL(0xea111c2a,0xbceb5970), LL(0xb269bbc4,0x366b455f),LL(0xe9bc5d62,0x7cd85e1e),LL(0x4f18b086,0xc743c41c),LL(0x95294fb9,0xa4b40990),
+ LL(0x26ee8382,0x9c7c581d),LL(0x359d638e,0xcf17dcc5),LL(0xb728ae3d,0xee8273ab),LL(0xf821f047,0x1d112926), LL(0x50491a74,0x11498477),LL(0xfde0dfb9,0x687fa761),LL(0x7ea435ab,0x2c258022),LL(0x91ce7e3f,0x6b8bdb94),
+ LL(0x3bf834aa,0x4c5b5dc9),LL(0x4f6c7e4b,0x04371819),LL(0x3736bcad,0xc284e00a),LL(0x21ae8f8d,0x0d881118), LL(0xf48c8e33,0xf9cf0f82),LL(0xa1bf40db,0xa11fd075),LL(0xdc2733e5,0xdceab0de),LL(0x8e986bd7,0xc560a8b5),
+ LL(0x3929d097,0x48dd1fe2),LL(0x92f188f1,0x3885b290),LL(0xda6fcdac,0x0f2ae613),LL(0xb662a46c,0x9054303e), LL(0x0738042a,0xb6871e44),LL(0xbdaf6449,0x98e6a977),LL(0xd1c9df1b,0xd8bc0650),LL(0x36e098f9,0xef3d6451),
+ LL(0xb6d72d28,0x03fbae82),LL(0xf5d84080,0x77ca9db1),LL(0xa58efc1c,0x8a112cff),LL(0xc564cb4a,0x518d761c), LL(0xf0d1b5ce,0x69b5740e),LL(0xe9eb1785,0x717039cc),LL(0x22f53382,0x3fe29f90),LL(0x6bc7c95c,0x8e54ba56),
+ LL(0xf7f91d0f,0x9c806d8a),LL(0xa82a5728,0x3b61b0f1),LL(0x94d76754,0x4640032d),LL(0x47d834c6,0x273eb5de), LL(0x7b4e4d53,0x2988abf7),LL(0xde401777,0xb7ce66bf),LL(0x715071b3,0x9fba6b32),LL(0xad3a1a98,0x82413c24),
+ LL(0xe0e8ad93,0x5b7fc8c4),LL(0x5fab868d,0xb5679aee),LL(0x2b3946f3,0xb1f9d2fa),LL(0x5685b50a,0x458897dc), LL(0x89d0caf3,0x1e98c930),LL(0x78642e92,0x39564c5f),LL(0x0dbdaf18,0x1b77729a),LL(0x579e82e6,0xf9170722),
+ LL(0xe4515fa5,0x680c0317),LL(0xfb0c790f,0xf85cff84),LL(0x6d2e0765,0xc7a82aab),LL(0x35c82b32,0x7446bca9), LL(0x6d63184f,0x5de607aa),LL(0x262803a6,0x7c1a46a8),LL(0xaebe8035,0xd218313d),LL(0xc73c51f8,0x92113ffd),
+ LL(0x12e7e46c,0x4b38e083),LL(0x56126bd5,0x69d0a37a),LL(0x73c07e04,0xfb3f324b),LL(0x8fda7267,0xa0c22f67), LL(0x4d2c7d8f,0x8f2c0051),LL(0xcbe2cae5,0xbc45ced3),LL(0xa8f0f277,0xe1c6cf07),LL(0x1eb99a98,0xbc392312),
+ LL(0x3cc8ac85,0x75537b7e),LL(0xdd02753b,0x8d725f57),LL(0xb737df2f,0xfd05ff64),LL(0xf6d2531d,0x55fe8712), LL(0x6ab6b01c,0x57ce04a9),LL(0x7cd93724,0x69a02a89),LL(0xcf86699b,0x4f82ac35),LL(0x9cb4b232,0x8242d3ad),
+ LL(0xd62105e5,0x713d0f65),LL(0x2d29be61,0xbb222bfa),LL(0x6cfbef09,0xf2f9a79e),LL(0xd5d6782f,0xfc24d8d3), LL(0xd4129967,0x5db77085),LL(0xdc3c2a43,0xdb81c3cc),LL(0x05d8d9a3,0x9d655fc0),LL(0x54298026,0x3f5d057a),
+ LL(0x88c54694,0x1157f56d),LL(0x9b09573e,0xb26baba5),LL(0x22adffd1,0x2cab03b0),LL(0xdd69f383,0x60a412c8), LL(0x54b25039,0xed76e98b),LL(0x687e714d,0xd4ee67d3),LL(0x7b00b594,0x87739648),LL(0xc9ef709b,0xce419775),
+ LL(0x1c203a40,0x40f76f85),LL(0xeafd8f91,0x30d352d6),LL(0x95578dd2,0xaf196d3d),LL(0x77cc3f3d,0xea4bb3d7), LL(0xb98e782b,0x42a5bd03),LL(0x0624920d,0xac958c40),LL(0xfc56fcc8,0xb838134c),LL(0x89572e5e,0x86ec4ccf),
+ LL(0x9be47be0,0x69c43526),LL(0xcb28fea1,0x323b7dd8),LL(0x3a6c67e5,0xfa5538ba),LL(0x1d378e46,0xef921d70), LL(0x3c4b880e,0xf92961fc),LL(0x98940a67,0x3f6f914e),LL(0xfef0ff39,0xa990eb0a),LL(0xf0eeff9c,0xa6c2920f),
+ LL(0x51b8d9a3,0xca804166),LL(0x0ffb0db1,0x42531bc9),LL(0xaa82e7ce,0x72ce4718),LL(0xdf574741,0x6e199913), LL(0xd5d36946,0xd5f1b13d),LL(0xf68f0194,0x8255dc65),LL(0x8710d230,0xdc9df4cd),LL(0x138c1988,0x3453c20f),
+ LL(0x89a6ef01,0x9af98dc0),LL(0x9857df85,0x4dbcc3f0),LL(0x5c1ad924,0x34805601),LL(0xd0493046,0x40448da5), LL(0x4ee343e2,0xf629926d),LL(0x90e8a301,0x6343f1bd),LL(0x40815b3f,0xefc93491),LL(0xde8f66fb,0xf882a423),
+ LL(0xe7db9f57,0x3a12d5f4),LL(0x3c384c27,0x7dfba38a),LL(0x6fc660b1,0x7a904bfd),LL(0x2773b21c,0xeb6c5db3), LL(0x1cdfe049,0xc350ee66),LL(0x44540f29,0x9baac0ce),LL(0xa5ec6aad,0xbc57b6ab),LL(0x0a7c1baa,0x167ce8c3),
+ LL(0x53fb2b56,0xb23a03a5),LL(0x4e057f78,0x6ce141e7),LL(0x89e490d9,0x796525c3),LL(0xa31a7e75,0x0bc95725), LL(0x1220fd06,0x1ec56791),LL(0x408b0bd6,0x716e3a3c),LL(0xe8ebeba9,0x31cd6bf7),LL(0xbee6b670,0xa7326ca6),
+ LL(0xcd090c43,0x3d9f851c),LL(0xf12c3988,0x561e8f13),LL(0x904b7be4,0x50490b6a),LL(0x0410737b,0x61690ce1), LL(0x0f009052,0x299e9a37),LL(0xf026092e,0x258758f0),LL(0xfdfcdc0f,0x9fa255f3),LL(0xc0e1bcd2,0xdbc9fb1f),
+ LL(0x24651840,0x35f9dd6e),LL(0xa5c59abc,0xdca45a84),LL(0xecca4938,0x103d396f),LL(0xb97b3f29,0x4532da0a), LL(0x1999a6bf,0xc4135ea5),LL(0x5e6bf2ee,0x3aa9505a),LL(0x3f5be093,0xf77cef06),LL(0xa943152e,0x97d1a0f8),
+ LL(0x2e1c21dd,0x2cb0ebba),LL(0x2c6797c4,0xf41b29fc),LL(0xb300101f,0xc6e17321),LL(0xd0d79a89,0x4422b0e9), LL(0x92f1bfc4,0x49e4901c),LL(0xe1e10ed9,0x06ab1f8f),LL(0xdb2926b8,0x84d35577),LL(0x356e8ec2,0xca349d39),
+ LL(0x343bf1a9,0x70b63d32),LL(0x37d1a6b1,0x8fd3bd28),LL(0x316865b4,0x0454879c),LL(0xc458efa2,0xee959ff6), LL(0x9706dc3f,0x0461dcf8),LL(0x164e4b2e,0x737db0e2),LL(0x2f8843c8,0x09262680),LL(0x7745e6f6,0x54498bbc),
+ LL(0xa29e24af,0x359473fa),LL(0x70aa87a1,0xfcc3c454),LL(0x00573ace,0xfd2c4bf5),LL(0x28dd1965,0xb65b514e), LL(0x2193e393,0xe46ae7cf),LL(0xf5444d97,0x60e9a4e1),LL(0x00ff38ed,0xe7594e96),LL(0x0a0e0f02,0x43d84d2f),
+ LL(0xee398a21,0x8b6db141),LL(0xe3bcc5be,0xb88a56ae),LL(0x373460ea,0x0a1aa52f),LL(0x160bb19b,0x20da1a56), LL(0x65bf0384,0xfb54999d),LL(0x5d5a180e,0x71a14d24),LL(0x21737b04,0xbc44db7b),LL(0x01dd8e92,0xd84fcb18),
+ LL(0xfa44b479,0x80de937b),LL(0x5c98fd4f,0x53505499),LL(0x28f08727,0x1edb12ab),LL(0xa5f3ef53,0x4c58b582), LL(0x8327f246,0xbfb236d8),LL(0x4d7df320,0xc3a3bfaa),LL(0xb96024f2,0xecd96c59),LL(0x7f4e0433,0xfc293a53),
+ LL(0x5acf6e10,0x5341352b),LL(0xafe652c3,0xc50343fd),LL(0x18577a7f,0x4af3792d),LL(0xaf16823d,0xe1a4c617), LL(0x33425d0a,0x9b26d0cd),LL(0x9b7bc47f,0x306399ed),LL(0x706bb20b,0x2a792f33),LL(0x98111055,0x31219614),
+ LL(0x87f5d28b,0x864ec064),LL(0x962277fd,0x11392d91),LL(0xbb6aed5f,0xb5aa7942),LL(0x47e799d9,0x080094dc), LL(0x208ba19b,0x4afa588c),LL(0x8512f284,0xd3e7570f),LL(0x02f5799a,0xcbae64e6),LL(0x514b9492,0xdeebe7ef),
+ LL(0xe5c298ff,0x30300f98),LL(0x3678361f,0x17f561be),LL(0x98cb9a16,0xf52ff312),LL(0x5562d490,0x6233c3bc), LL(0x92e3a2cb,0x7bfa15a1),LL(0xe6365119,0x961bcfd1),LL(0x2c8c53b1,0x3bdd29bf),LL(0x822844ba,0x739704df),
+ LL(0x7e7b754b,0x7dacfb58),LL(0xa806c9b9,0x23360791),LL(0x23504452,0xe7eb88c9),LL(0x852c1783,0x2983e996), LL(0x958d881d,0xdd4ae529),LL(0x262c7b3c,0x026bae03),LL(0x960b52d1,0x3a6f9193),LL(0x92696cfb,0xd0980f90),
+ LL(0xd5f30851,0x4c1f428c),LL(0x2a4f6630,0x94dfed27),LL(0xfc5d48a4,0x4df53772),LL(0x933260ce,0xdd2d5a2f), LL(0xd44cc7a5,0x574115bd),LL(0xbd12533a,0x4ba6b20d),LL(0x243057c9,0x30e93cb8),LL(0x14de320e,0x794c486a),
+ LL(0xf21496e4,0xe925d4ce),LL(0xec696331,0xf951d198),LL(0x3e8d812f,0x9810e2de),LL(0x389294ab,0xd0a47259), LL(0x0e3bab66,0x513ba2b5),LL(0xabad306f,0x462caff5),LL(0xaf04c49e,0xe2dc6d59),LL(0xe0b84b0b,0x1aeb8750),
+ LL(0x2f7d0ca2,0xc034f12f),LL(0xe06acf2f,0x6d2e8128),LL(0x21facc2f,0x801f4f83),LL(0xf40ef607,0xa1170c03), LL(0x7805a99c,0xfe0a1d4f),LL(0xcc26aba5,0xbde56a36),LL(0x35531f40,0x5b1629d0),LL(0x9afa6108,0xac212c2b),
+ LL(0x15697be5,0x30a06bf3),LL(0x2c63c7c1,0x6f0545dc),LL(0x7ccdadaf,0x5d8cb842),LL(0xac7015bb,0xd52e379b), LL(0xf462c23e,0xc4f56147),LL(0x46bc24b0,0xd44a4298),LL(0xe2856d4f,0xbc73d23a),LL(0x0832bcdf,0x61cedd8c),
+ LL(0x99f241d7,0x60953556),LL(0x001a349d,0xee4adbd7),LL(0xaa89e491,0x0b35bf6a),LL(0x136f7546,0x7f0076f4), LL(0x9264da3d,0xd19a18ba),LL(0x62a7a28b,0x6eb2d2cd),LL(0x8761c971,0xcdba941f),LL(0xa3be4a5d,0x1550518b),
+ LL(0x57d0b70c,0xd0e8e2f0),LL(0xcd133ba3,0xeea8612e),LL(0x44416aec,0x814670f0),LL(0x30775061,0x424db6c3), LL(0x16213fd1,0xd96039d1),LL(0x18a3478f,0xc61e7fa5),LL(0xcb0c5021,0xa805bdcc),LL(0x0cc616dd,0xbdd6f3a8),
+ LL(0x5d97f7e2,0x06009667),LL(0xaf0bf4b6,0x31db0fc1),LL(0x5491627a,0x23680ed4),LL(0x7d741fb1,0xb99a3c66), LL(0x36b1ff92,0xe9bb5f55),LL(0x512b388d,0x29738577),LL(0x50fcf263,0xdb8a2ce7),LL(0x6c4f7b47,0x385346d4),
+ LL(0x31631f9e,0xbe86c5ef),LL(0x03a57a29,0xbf91da21),LL(0x7b23f821,0xc3b1f796),LL(0x770db354,0x0f7d00d2), LL(0xd8fe79da,0x8ffc6c3b),LL(0xd525c996,0xcc5e8c40),LL(0xcfff632a,0x4640991d),LL(0x67112528,0x64d97e8c),
+ LL(0x02f1cd1e,0xc232d973),LL(0x1dd212a4,0xce87eacb),LL(0xe69802f7,0x6e4c8c73),LL(0x1fffddbd,0x12ef0290), LL(0x1bcea6e2,0x941ec74e),LL(0x3cb92cbb,0xd0b54024),LL(0x7e8f9d05,0x809fb9d4),LL(0xf2992aae,0x3bf16159),
+ LL(0xf8a7a838,0xad40f279),LL(0x05615660,0x11aea631),LL(0xa01f6fa1,0xbf52e6f1),LL(0x3dc2aec9,0xef046995), LL(0xd8080711,0x785dbec9),LL(0x9fdedf76,0xe1aec60a),LL(0xfa21c126,0xece797b5),LL(0x05e52732,0xc66e898f),
+ LL(0x08811fdb,0x39bb69c4),LL(0x2fc7f082,0x8bfe1ef8),LL(0x174f4138,0xc8e7a393),LL(0xd58d1f98,0xfba8ad1d), LL(0xbfd2fd5b,0xbc21d0ce),LL(0x6ee60d61,0x0b839a82),LL(0xafd22253,0xaacf7658),LL(0xaae396b3,0xb526bed8),
+ LL(0x38564464,0xccc1bbc2),LL(0x8c45bc73,0x9e3ff947),LL(0x58188a78,0xcde9bca3),LL(0xd73bf8f7,0x138b8ee0), LL(0x4123c489,0x5c7e234c),LL(0xfa643297,0x66e69368),LL(0x39a15fa3,0x0629eeee),LL(0xa9e2a927,0x95fab881),
+ LL(0xeafbb1e1,0xb2497007),LL(0xe75b7a93,0xd75c9ce6),LL(0xefb68d78,0x3558352d),LL(0x223f6396,0xa2f26699), LL(0xe469b17a,0xeb911ecf),LL(0xe72d3ec2,0x62545779),LL(0x82cb113f,0x8ea47de7),LL(0x4e1fa98d,0xebe4b086),
+ LL(0x8cdfedb1,0xec2d5ed7),LL(0xfe211a74,0xa535c077),LL(0x11d244c5,0x9678109b),LL(0xbe299a76,0xf17c8bfb), LL(0xfb11fbc4,0xb651412e),LL(0x94ab3f65,0xea0b5482),LL(0x0cf78243,0xd8dffd95),LL(0xce0361d4,0x2e719e57),
+ LL(0x304ddc5b,0x9007f085),LL(0x4daba2ea,0x095e8c6d),LL(0x3f9d28a9,0x5a33cdb4),LL(0xe2283003,0x85b95cd8), LL(0xb9744733,0xbcd6c819),LL(0xfc7f5783,0x29c5f538),LL(0xd59038e4,0x6c49b2fa),LL(0x3bbe1018,0x68349cc1),
+ LL(0x21830ee5,0xcc490c1d),LL(0xe9bfa297,0x36f9c4ee),LL(0x48de1a94,0x58fd7294),LL(0x4e8f2cdc,0xaadb13a8), LL(0x81313dba,0x515eaaa0),LL(0xc2152dd8,0xc76bb468),LL(0xa653dbf8,0x357f8d75),LL(0xb14ac143,0xe4d8c4d1),
+ LL(0xb055cb40,0xbdb8e675),LL(0x977b5167,0x898f8e7b),LL(0xb82fb863,0xecc65651),LL(0x6d88f01f,0x56544814), LL(0x263a75a9,0xb0928e95),LL(0x1a22fcda,0xcfb6836f),LL(0x3f3bd37c,0x651d14db),LL(0xb6ad4664,0x1d3837fb),
+ LL(0xff4f94ab,0x7c5fb538),LL(0x6d7fb8f2,0x7243c712),LL(0xa85c5287,0xef13d60c),LL(0x4bb8dd1b,0x18cfb7c7), LL(0x72908219,0x82f9bfe6),LL(0x9d5144ab,0x35c4592b),LL(0x9cf4b42f,0x52734f37),LL(0x8c60ddc4,0x6bac55e7),
+ LL(0x94dea0f6,0xb5cd811e),LL(0xe18cc1a3,0x259ecae4),LL(0x15e660f8,0x6a0e836e),LL(0x0e02bff2,0x6c639ea6), LL(0x7e1026fd,0x8721b8cb),LL(0x63261942,0x9e73b50b),LL(0x77f01da3,0xb8c70974),LL(0x8268f57f,0x1839e6a6),
+ LL(0x5150b805,0x571b9415),LL(0xf92c7097,0x1892389e),LL(0x4a084b95,0x8d69c18e),LL(0xbe5b495c,0x7014c512), LL(0x1b07523c,0x4780db36),LL(0x2c1c64fa,0x2f6219ce),LL(0x602c105a,0xc38b81b0),LL(0x5dc8e360,0xab4f4f20),
+ LL(0xcf7d62d2,0x20d3c982),LL(0x23ba8150,0x1f36e29d),LL(0x92763f9e,0x48ae0bf0),LL(0x1d3a7007,0x7a527e6b), LL(0x581a85e3,0xb4a89097),LL(0xdc158be5,0x1f1a520f),LL(0x167d726e,0xf98db37d),LL(0x1113e862,0x8802786e),
+},
+/* digit=15 base_pwr=2^105 */
+{
+ LL(0x36f09ab0,0xefb2149e),LL(0x4a10bb5b,0x03f163ca),LL(0x06e20998,0xd0297045),LL(0x1b5a3bab,0x56f0af00), LL(0x70880e0d,0x7af4cfec),LL(0xbe3d913f,0x7332a66f),LL(0x7eceb4bd,0x32e6c84a),LL(0x9c228f55,0xedc4a79a),
+ LL(0xc55c4496,0xc37c7dd0),LL(0x25bbabd2,0xa6a96357),LL(0xadd7f363,0x5b7e63f2),LL(0x2e73f1df,0x9dce3782), LL(0xb2b91f71,0xe1e5a16a),LL(0x5ba0163c,0xe4489823),LL(0xf6e515ad,0xf2759c32),LL(0x8615eecf,0xa5e2f1f8),
+ LL(0xabded551,0x74519be7),LL(0xc8b74410,0x03d358b8),LL(0x0e10d9a9,0x4d00b10b),LL(0x28da52b7,0x6392b0b1), LL(0x0b75c904,0x6744a298),LL(0xa8f7f96c,0xc305b0ae),LL(0x182cf932,0x042e421d),LL(0x9e4636ca,0xf6fc5d50),
+ LL(0xd64cc78c,0x795847c9),LL(0x9b6cb27b,0x6c50621b),LL(0xdf8022ab,0x07099bf8),LL(0xc04eda1d,0x48f862eb), LL(0xe1603c16,0xd12732ed),LL(0x5c9a9450,0x19a80e0f),LL(0xb429b4fc,0xe2257f54),LL(0x45460515,0x66d3b2c6),
+ LL(0x822e37be,0x6ca4f87e),LL(0x253bda4e,0x73f237b4),LL(0x41190aeb,0xf747f3a2),LL(0x804cf284,0xf06fa36f), LL(0xfc621c12,0x0a6bbb6e),LL(0x40b80ec6,0x5d624b64),LL(0x7ba556f3,0x4b072425),LL(0x3e2d20a8,0x7fa0c354),
+ LL(0xe3229d41,0xe921fa31),LL(0x94531bd4,0xa929c652),LL(0xa6d38209,0x84156027),LL(0x6bdb97bd,0xf3d69f73), LL(0x16833631,0x8906d19a),LL(0x03d51be3,0x68a34c2e),LL(0x0e511cd8,0xcb59583b),LL(0xfdc132a8,0x99ce6bfd),
+ LL(0xffcdb463,0x3facdaaa),LL(0x34a38b08,0x658bbc1a),LL(0xf1a9078d,0x12a801f8),LL(0x6ab855de,0x1567bcf9), LL(0x3572359b,0xe08498e0),LL(0x8659e68b,0xcf0353e5),LL(0x7d23807c,0xbb86e9c8),LL(0x2198e8a2,0xbc08728d),
+ LL(0x453cadd6,0x8de2b7bc),LL(0xbc0bc1f8,0x203900a7),LL(0xa6abd3af,0xbcd86e47),LL(0x8502effb,0x911cac12), LL(0xec965469,0x2d550242),LL(0x29e0017e,0x0e9f7692),LL(0x65979885,0x633f078f),LL(0x4cf751ef,0xfb87d449),
+ LL(0xfc25419a,0xe1790e4b),LL(0x4bff3cfd,0x36467203),LL(0x25b6e83f,0xc8db6386),LL(0x6cad6fd2,0x6cc69f23), LL(0x6bc68bb9,0x0219e45a),LL(0x297f7334,0xe43d79b6),LL(0x465dc97c,0x7d445368),LL(0x2a0b949a,0x4b9eea32),
+ LL(0x6102d021,0x1b96c6ba),LL(0x2f4461ea,0xeaafac78),LL(0xc49f19a8,0xd4b85c41),LL(0xcf538875,0x275c28e4), LL(0xdd2e54e0,0x35451a9d),LL(0x0605618b,0x6991adb5),LL(0x7b36cd24,0x5b8b4bcd),LL(0x56f37216,0x372a4f8c),
+ LL(0xa6a5da60,0xc890bd73),LL(0xdc4c9ff0,0x6f083da0),LL(0xf0536e57,0xf4e14d94),LL(0xaaec8243,0xf9ee1eda), LL(0x8bdcf8e7,0x571241ec),LL(0x0b041e26,0xa5db8271),LL(0xe3fff040,0x9a0b9a99),LL(0x7c271202,0xcaaf21dd),
+ LL(0x4f0dd2e8,0xb4e2b2e1),LL(0x0a377ac7,0xe77e7c4f),LL(0x0d7a2198,0x69202c3f),LL(0x28200eb8,0xf759b7ff), LL(0xdcfe314e,0xc87526ed),LL(0x53d5cf99,0xeb84c524),LL(0x515138b6,0xb1b52ace),LL(0x23fca3f4,0x5aa7ff8c),
+ LL(0xb9791a26,0xff0b13c3),LL(0xcdd58b16,0x960022da),LL(0x57aad2de,0xdbd55c92),LL(0xf30fe619,0x3baaaaa3), LL(0x0d881efd,0x9a4b2346),LL(0x46325e2a,0x506416c0),LL(0x035c18d4,0x91381e76),LL(0xf27817b0,0xb3bb68be),
+ LL(0x5116f937,0x15bfb8bf),LL(0xc1268943,0x7c64a586),LL(0x8419a2c8,0x71e25cc3),LL(0x8335f463,0x9fd6b0c4), LL(0xe8ee0e0e,0x4bf0ba3c),LL(0x298c21fa,0x6f6fba60),LL(0xae66bee0,0x57d57b39),LL(0x22672544,0x292d5130),
+ LL(0xbab093b3,0xf451105d),LL(0x02839986,0x012f59b9),LL(0x3474a89c,0x8a915802),LL(0x2de03e97,0x048c919c), LL(0x91071cd5,0xc476a2b5),LL(0x034970a5,0x791ed89a),LL(0xe1b7994b,0x89bd9042),LL(0xa1057ffd,0x8eaf5179),
+ LL(0xd551ee10,0x6066e2a2),LL(0x727e09a6,0x87a8f1d8),LL(0x2c01148d,0x00d08bab),LL(0x424f33fe,0x6da8e4f1), LL(0xcf9a4e71,0x466d17f0),LL(0x3bf5cb19,0xff502010),LL(0xd062ecc0,0xdccf97d8),LL(0x81d80ac4,0x80c0d9af),
+ LL(0x033f2876,0xe87771d8),LL(0x7d5cc3db,0xb0186ec6),LL(0x3bc9bc1d,0x58e8bb80),LL(0x6f6ef60e,0x4d1395cc), LL(0x186244a0,0xa73c62d6),LL(0x110a5b53,0x918e5f23),LL(0x741b7eab,0xed4878ca),LL(0xdbe03e51,0x3038d71a),
+ LL(0xa93c3246,0x840204b7),LL(0xa0b9b4cd,0x21ab6069),LL(0xb1d64218,0xf5fa6e2b),LL(0xf3d56191,0x1de6ad0e), LL(0xff1929c7,0x570aaa88),LL(0x640e87b5,0xc6df4c6b),LL(0xc65f0ccc,0xde8a74f2),LL(0xe6f6cc01,0x8b972fd5),
+ LL(0x0b846531,0x3fff36b6),LL(0x10a5e475,0xba7e45e6),LL(0x4145b6c5,0x84a1d10e),LL(0x5e046d9d,0xf1f7f91a), LL(0x44de90d7,0x0317a692),LL(0xf199c15e,0x951a1d4a),LL(0xc9d73deb,0x91f78046),LL(0xfab8224f,0x74c82828),
+ LL(0xe7560b90,0xaa6778fc),LL(0xa7e824ce,0xb4073e61),LL(0xd642eba8,0xff0d693c),LL(0x5dccef38,0x7ce2e57a), LL(0x1df1ad46,0x89c2c789),LL(0x098346fd,0x83a06922),LL(0xda2fc177,0x2d715d72),LL(0x85b6cf1d,0x7b6dd71d),
+ LL(0x73fa9cb0,0xc60a6d0a),LL(0x328bf5a9,0xedd3992e),LL(0x832c8c82,0xc380ddd0),LL(0xa2a0bf50,0xd182d410), LL(0xd9a528db,0x7d9d7438),LL(0xcaf53994,0xe8b1a0e9),LL(0x0e19987c,0xddd6e5fe),LL(0x190b059d,0xacb8df03),
+ LL(0x8300129f,0x53703a32),LL(0x68c43bfd,0x1f637662),LL(0x00e54051,0xbcbd1913),LL(0x7bf5a8c5,0x812fcc62), LL(0x29fb85da,0x3f969d5f),LL(0x694759e8,0x72f4e00a),LL(0x790726b7,0x426b6e52),LL(0x3bdbb209,0x617bbc87),
+ LL(0x97aee317,0x511f8bb9),LL(0xe81536a8,0x812a4096),LL(0x3ac09b9b,0x137dfe59),LL(0xba8c9a7a,0x0682238f), LL(0xaeccb4bd,0x7072ead6),LL(0x692ba633,0x6a34e9aa),LL(0x6fff9d33,0xc82eaec2),LL(0x1d4d2b62,0xfb753512),
+ LL(0x1d7aadab,0x1a0445ff),LL(0xd5f6a67c,0x65d38260),LL(0x91cfb26f,0x6e62fb08),LL(0x5c7d91d6,0xef1e0fa5), LL(0x33db72cd,0x47e7c7ba),LL(0xfa7c74b2,0x017cbc09),LL(0xf50a503c,0x3c931590),LL(0x616baa42,0xcac54f60),
+ LL(0xb2369f0f,0x9b6cd380),LL(0x23c76151,0x97d3a70d),LL(0x9862a9c6,0x5f9dd6fc),LL(0x12312f51,0x044c4ab2), LL(0x834a2ddc,0x035ea0fd),LL(0xcc7b826d,0x49e6b862),LL(0x62fce490,0xb03d6883),LL(0xb37e36e9,0x62f2497a),
+ LL(0xc6458293,0x04b005b6),LL(0xe8d10af7,0x36bb5276),LL(0x8ee617b8,0xacf2dc13),LL(0xb004b3d4,0x470d2d35), LL(0xfeeb1b77,0x06790832),LL(0x85657f9c,0x2bb75c39),LL(0xc0f60004,0xd70bd4ed),LL(0x219b018b,0xfe797ecc),
+ LL(0x753aebcc,0x9b5bec2a),LL(0xc939eca5,0xdaf9f3dc),LL(0xd095ad09,0xd6bc6833),LL(0xdaa4d2fc,0x98abdd51), LL(0x8d168be5,0xd9840a31),LL(0x2325a23c,0xcf7c10e0),LL(0x7e6ecfaf,0xa5c02aa0),LL(0xb5bfdf18,0x2462e7e6),
+ LL(0xa0cc3f12,0xab2d8a8b),LL(0xbc672a29,0x68dd485d),LL(0x596f2cd3,0x72039752),LL(0xa0cf3d8d,0x5d3eea67), LL(0xe6602671,0x810a1a81),LL(0x14026c0c,0x8f144a40),LL(0x76b50f85,0xbc753a6d),LL(0x645cd4a4,0xc4dc21e8),
+ LL(0x521d0378,0xc5262dea),LL(0x05011c6f,0x802b8e0e),LL(0x0b4c19ea,0x1ba19cbb),LL(0xebf0aaec,0x21db64b5), LL(0x70342f9d,0x1f394ee9),LL(0x1bc44a14,0x93a10aee),LL(0x3efd0baa,0xa7eed31b),LL(0x1d154e65,0x6e7c824e),
+ LL(0x9966e7ee,0xee23fa81),LL(0x05b7920d,0x64ec4aa8),LL(0x2d90aad4,0x2d44462d),LL(0xdf277ad5,0xf44dd195), LL(0xbb46b6a1,0x8d6471f1),LL(0xfd885090,0x1e65d313),LL(0x13a977b4,0x33a800f5),LL(0x0797e1ef,0xaca9d721),
+ LL(0xfcff6a17,0x9a5a85a0),LL(0x1eca7cee,0x9970a3f3),LL(0xc9504be3,0xbb9f0d6b),LL(0xadd24ee2,0xe0c504be), LL(0x77fcc2f4,0x7e09d956),LL(0x65bb5fc4,0xef1a5227),LL(0x8b9286aa,0x145d4fb1),LL(0x6649028b,0x66fd0c5d),
+ LL(0x1bf4581c,0x98857ceb),LL(0xaca7b166,0xe635e186),LL(0x659722ac,0x278ddd22),LL(0x1db68007,0xa0903c4c), LL(0x48f21402,0x366e4589),LL(0xb96abda2,0x31b49c14),LL(0xe0403190,0x329c4b09),LL(0xd29f43fe,0x97197ca3),
+ LL(0x274983d8,0x8073dd1e),LL(0x55717c8f,0xda1a3bde),LL(0x0361f9d1,0xfd3d4da2),LL(0x4c7de1ce,0x1332d081), LL(0xaa6d0e10,0x9b7ef7a3),LL(0xf54f1c4a,0x17db2e73),LL(0x4cd35567,0xaf3dffae),LL(0xe56f4e71,0xaaa2f406),
+ LL(0x7ace3fc7,0x8966759e),LL(0x45a8d8c6,0x9594eacf),LL(0x91834e0e,0x8de3bd8b),LL(0x548c0421,0xafe4ca53), LL(0xe6ee81c6,0xfdd7e856),LL(0x6b891a3a,0x8f671beb),LL(0xfae63829,0xf7a58f2b),LL(0x9c11ac9f,0x9ab186fb),
+ LL(0x10b5be76,0x8d6eb369),LL(0xfb040bcd,0x046b7739),LL(0xcb73de88,0xccb4529f),LL(0xcf26be03,0x1df0fefc), LL(0xbcfcd027,0xad7757a6),LL(0xbb3165ca,0xa8786c75),LL(0x7e99a4d9,0xe9db1e34),LL(0xb06c504b,0x99ee86df),
+ LL(0xc15c9f0a,0x5b7c2ddd),LL(0x4295989e,0xdf87a734),LL(0x03d08fda,0x59ece47c),LL(0xad5fc702,0xb074d3dd), LL(0x51a03776,0x20407903),LL(0x2a608007,0x2bb1f77b),LL(0xe1153185,0x25c58f4f),LL(0x766e6447,0xe6df62f6),
+ LL(0xed51275a,0xefb3d1be),LL(0x2f0f483f,0x5de47dc7),LL(0x97c2bedf,0x7932d98e),LL(0x0219f8a1,0xd5c11927), LL(0xa73a294e,0x9d751200),LL(0x9dc20172,0x5f88434a),LL(0xa26f506a,0xd28d9fd3),LL(0x9d1dcd48,0xa890cd31),
+ LL(0x70f4d3b4,0x0aebaec1),LL(0x0ffc8d00,0xfd1a1369),LL(0x57d57838,0xb9d9c240),LL(0x68bac361,0x45929d26), LL(0x25b15ca6,0x5a2cd060),LL(0x6e474446,0x4b3c83e1),LL(0xee1e5134,0x1aac7578),LL(0xc91e2f41,0xa418f5d6),
+ LL(0x213ed68b,0x6936fc8a),LL(0x510a5224,0x860ae7ed),LL(0xdef09b53,0x63660335),LL(0xcd79c98d,0x641b2897), LL(0x01110f35,0x29bd38e1),LL(0x648b1937,0x79c26f42),LL(0x9d9164f4,0x64dae519),LL(0x0265c273,0xd85a2310),
+ LL(0x4b07e2b1,0x7173dd5d),LL(0x8d9ea221,0xd144c4cb),LL(0x1105ab14,0xe8b04ea4),LL(0xfe80d8f1,0x92dda542), LL(0xcf03dce6,0xe9982fa8),LL(0x1a22cffc,0x8b5ea965),LL(0x3fad88c4,0xf7f4ea7f),LL(0x6a5ba95c,0x62db773e),
+ LL(0x93f24567,0xd20f02fb),LL(0x315257ca,0xfd46c69a),LL(0x8bcab987,0x0ac74cc7),LL(0x5ceca2f5,0x46f31c01), LL(0x888b219e,0x40aedb59),LL(0xe1fccd02,0xe50ecc37),LL(0x911f816c,0x1bcd9dad),LL(0x8db9b00c,0x583cc1ec),
+ LL(0xa483bf11,0xf3cd2e66),LL(0xb1b2c169,0xfa08a6f5),LL(0x4be9fa28,0xf375e245),LL(0x5b6d011f,0x99a7ffec), LL(0xc4ae62da,0x6a3ebddb),LL(0x374aef5d,0x6cea00ae),LL(0x9d4d05bc,0xab5fb98d),LL(0xd560f252,0x7cba1423),
+ LL(0x208490de,0x49b2cc21),LL(0xbcfb2879,0x1ca66ec3),LL(0x1b6fb16f,0x7f1166b7),LL(0x65fe5db3,0xfff63e08), LL(0x8b2610be,0xb8345abe),LL(0x39de3df4,0xb732ed80),LL(0x211c32b4,0x0e24ed50),LL(0x848ff27d,0xd10d8a69),
+ LL(0xed4de248,0xc1074398),LL(0x10488927,0xd7cedace),LL(0x85673e13,0xa4aa6bf8),LL(0x6daf30af,0xb46bae91), LL(0xfcef7ad8,0x07088472),LL(0xd4b35e97,0x61151608),LL(0xdde29986,0xbcfe8f26),LL(0xd5a34c79,0xeb84c4c7),
+ LL(0x164e1214,0xc1eec55c),LL(0xa147bb03,0x891be86d),LL(0x0ba96835,0x9fab4d10),LL(0xa5c1ae9f,0xbf01e9b8), LL(0xb186ebc0,0x6b4de139),LL(0x85b91bca,0xd5c74c26),LL(0xc2d93854,0x5086a99c),LL(0xa7a9dfbc,0xeed62a7b),
+ LL(0x76b7618a,0x8778ed6f),LL(0x03b66062,0xbff750a5),LL(0xb65186db,0x4cb7be22),LL(0xcc3a6d13,0x369dfbf0), LL(0x7191a321,0xc7dab26c),LL(0x40ed718e,0x9edac3f9),LL(0xd0cfd183,0xbc142b36),LL(0x7c991693,0xc8af82f6),
+ LL(0x97ce0b2a,0xb3d1e4d8),LL(0xc3a55cdf,0xe6d7c87f),LL(0x68b81afe,0x35846b95),LL(0xd3c239d8,0x018d12af), LL(0x01206e15,0x2b2c6208),LL(0xa3b882c6,0xe0e42453),LL(0xa50162d5,0x854470a3),LL(0x7017a62a,0x08157478),
+ LL(0x820357c7,0x18bd3fb4),LL(0x6f1458ad,0x992039ae),LL(0x25b44aa1,0x9a1df3c5),LL(0xed3d5281,0x2d780357), LL(0xc77ad4d4,0x58cf7e4d),LL(0xf9df4fc4,0xd49a7998),LL(0x1d71205e,0x4465a8b5),LL(0x649254aa,0xa0ee0ea6),
+ LL(0xab7bd771,0x4b5eeecf),LL(0x35c262b9,0x6c873073),LL(0x3c9d61e7,0xdc5bd648),LL(0x321460d2,0x233d6d54), LL(0xfc195bcc,0xd20c5626),LL(0x04d78b63,0x25445958),LL(0x17ec8ef3,0xe03fcb3d),LL(0x46b8f781,0x54b690d1),
+ LL(0x21230646,0x82fa2c8a),LL(0x084f418c,0xf51aabb9),LL(0x1a30ba43,0xff4fbec1),LL(0x743c9df7,0x6a5acf73), LL(0xd635b4d5,0x1da2b357),LL(0xecd5c1da,0xc3de68dd),LL(0xd61af0dd,0xa689080b),LL(0xd665bf99,0xdea5938a),
+ LL(0xfe637294,0x0231d71a),LL(0xa5a81cd8,0x01968aa6),LL(0x048e63b5,0x11252d50),LL(0x6ca007e9,0xc446bc52), LL(0x96d6134b,0xef8c50a6),LL(0x9e09a05c,0x9361fbf5),LL(0xdca3291a,0xf17f85a6),LL(0xff251a21,0xb178d548),
+ LL(0xa4df3915,0x87f6374b),LL(0x2fd5d608,0x566ce1bf),LL(0x7de35102,0x425cba4d),LL(0x58c5d5e2,0x6b745f8f), LL(0x63122edf,0x88402af6),LL(0x3b989a89,0x3190f9ed),LL(0xebba3156,0x4ad3d387),LL(0xc7c469a5,0xef385ad9),
+ LL(0x3f642c29,0xb08281de),LL(0x910ffb88,0x20be0888),LL(0xd5292546,0xf353dd4a),LL(0x8377a262,0x3f1627de), LL(0xeefcd638,0xa5faa013),LL(0x74cc77c3,0x8f3bf626),LL(0xa348f55e,0x32618f65),LL(0x9fefeb9e,0x5787c0dc),
+ LL(0xd9a23e44,0xf1673aa2),LL(0x4e10690d,0x88dfa993),LL(0x2bf91108,0x1ced1b36),LL(0x3af48649,0x9193ceca), LL(0x2d738fc5,0xfb34327d),LL(0x975fee6c,0x6697b037),LL(0xc04079a5,0x2f485da0),LL(0x2feaa1ac,0x2cdf5735),
+ LL(0xbd55659e,0x76944420),LL(0x4376090c,0x7973e32b),LL(0x163b591a,0x86bb4fe1),LL(0xc196f0ca,0x10441aed), LL(0x045ad915,0x3b431f4a),LL(0xa4afacb1,0x6c11b437),LL(0x71fdbbd8,0x30b0c7db),LL(0xeda65acd,0xb642931f),
+ LL(0x9c92b235,0x4baae6e8),LL(0x6b3993a1,0xa73bbd0e),LL(0x693dd031,0xd06d60ec),LL(0x7156881c,0x03cab91b), LL(0x1db3574b,0xd615862f),LL(0x64bb061a,0x485b0185),LL(0xa0181e06,0x27434988),LL(0xc1c0c757,0x2cd61ad4),
+ LL(0x2ff9f403,0x3effed5a),LL(0x62239029,0x8dc98d8b),LL(0x1f17b70d,0x2206021e),LL(0xbf510015,0xafbec0ca), LL(0x80130dfa,0x9fed7164),LL(0x8a02dcf5,0x306dc2b5),LL(0xfeb10fc0,0x48f06620),LL(0x5a57cf51,0x78d1e1d5),
+ LL(0x192ef710,0xadef8c5a),LL(0x3b7431f9,0x88afbd4b),LL(0x64250c9e,0x7e1f7407),LL(0xb58bec07,0x6e31318d), LL(0x24f89b4e,0xfd4fc4b8),LL(0x48c36a2a,0x65a5dd88),LL(0xf024baa7,0x4f1eccff),LL(0xcba94650,0x22a21cf2),
+ LL(0x42a554f7,0x95d29dee),LL(0x002ec4ba,0x828983a5),LL(0x8badb73d,0x8112a1f7),LL(0xa27c1839,0x79ea8897), LL(0xd065fd83,0x8969a5a7),LL(0xb262a0bc,0xf49af791),LL(0xaf2b5127,0xfcdea8b6),LL(0x564c2dbc,0x10e913e1),
+ LL(0xbc21ef51,0x51239d14),LL(0x4ce57292,0xe51c3ceb),LL(0x47bbcc3b,0x795ff068),LL(0xbd7e11e6,0x86b46e1e), LL(0x80041ef4,0x0ea6ba23),LL(0x6262342e,0xd72fe505),LL(0x31d294d4,0x8abc6dfd),LL(0x1278c2c9,0xbbe017a2),
+ LL(0xb389328a,0xb1fcfa09),LL(0xd01771b5,0x322fbc62),LL(0x60b045bf,0x04c0d063),LL(0x10e52d01,0xdb652edc), LL(0x03ec6627,0x50ef932c),LL(0xc1ee50e3,0xde1b3b2d),LL(0xdc37a90d,0x5ab7bdc5),LL(0x31e33a96,0xfea67213),
+ LL(0x4f2999aa,0x6482b5cb),LL(0xb8cbf0dd,0x38476cc6),LL(0x173405bb,0x93ebfacb),LL(0xe52369ec,0x15cdafe7), LL(0xd935b7db,0xd42d5ba4),LL(0x1c99a4cd,0x648b6004),LL(0xa3b5545b,0x785101bd),LL(0x9dd67faf,0x4bf2c38a),
+ LL(0x4442449c,0xb1aadc63),LL(0x33ad4fb8,0xe0e9921a),LL(0xaa686d82,0x5c552313),LL(0x465d866c,0xdee635fa), LL(0x18ee6e8a,0xbc3c224a),LL(0xed42e02f,0xeed748a6),LL(0xd474cd08,0xe70f930a),LL(0xfff24adf,0x774ea6ec),
+ LL(0xf3480d4a,0x03e2de1c),LL(0xbc8acf1a,0xf0d8edc7),LL(0x68295a9c,0xf23e3303),LL(0xc546a97d,0xfadd5f68), LL(0x96f8acb1,0x895597ad),LL(0x671bdae2,0xbddd49d5),LL(0x21dd43f4,0x16fcd528),LL(0x6619141a,0xa5a45412),
+},
+/* digit=16 base_pwr=2^112 */
+{
+ LL(0xc360e25a,0x8ce9b6bf),LL(0x075a1a78,0xe6425195),LL(0x481732f4,0x9dc756a8),LL(0x5432b57a,0x83c0440f), LL(0xd720281f,0xc670b3f1),LL(0xd135e051,0x2205910e),LL(0xdb052be7,0xded14b0e),LL(0xc568ea39,0x697b3d27),
+ LL(0xfb3ff9ed,0x2e599b9a),LL(0x17f6515c,0x28c2e0ab),LL(0x474da449,0x1cbee4fd),LL(0x4f364452,0x071279a4), LL(0x01fbe855,0x97abff66),LL(0x5fda51c4,0x3ee394e8),LL(0x67597c0b,0x190385f6),LL(0xa27ee34b,0x6e9fccc6),
+ LL(0x14092ebb,0x0b89de93),LL(0x428e240c,0xf17256bd),LL(0x93d2f064,0xcf89a7f3),LL(0xe1ed3b14,0x4f57841e), LL(0xe708d855,0x4ee14405),LL(0x03f1c3d0,0x856aae72),LL(0xbdd7eed5,0xc8e5424f),LL(0x73ab4270,0x3333e4ef),
+ LL(0xdda492f8,0x3bc77ade),LL(0x78297205,0xc11a3aea),LL(0x34931b4c,0x5e89a3e7),LL(0x9f5694bb,0x17512e2e), LL(0x177bf8b6,0x5dc349f3),LL(0x08c7ff3e,0x232ea4ba),LL(0xf511145d,0x9c4f9d16),LL(0x33b379c3,0xccf109a3),
+ LL(0xa1f25897,0xe75e7a88),LL(0xa1b5d4d8,0x7ac6961f),LL(0x08f3ed5c,0xe3e10773),LL(0x0a892dfb,0x208a54ec), LL(0x78660710,0xbe826e19),LL(0x237df2c8,0x0cf70a97),LL(0xed704da5,0x418a7340),LL(0x08ca33fd,0xa3eeb9a9),
+ LL(0x169bca96,0x49d96233),LL(0x2da6aafb,0x04d286d4),LL(0xa0c2fa94,0xc09606ec),LL(0x23ff0fb3,0x8869d0d5), LL(0xd0150d65,0xa99937e5),LL(0x240c14c9,0xa92e2503),LL(0x108e2d49,0x656bf945),LL(0xa2f59e2b,0x152a733a),
+ LL(0x8434a920,0xb4323d58),LL(0x622103c5,0xc0af8e93),LL(0x938dbf9a,0x667518ef),LL(0x83a9cdf2,0xa1843073), LL(0x5447ab80,0x350a94aa),LL(0xc75a3d61,0xe5e5a325),LL(0x68411a9e,0x74ba507f),LL(0x594f70c5,0x10581fc1),
+ LL(0x80eb24a9,0x60e28570),LL(0x488e0cfd,0x7bedfb4d),LL(0xc259cdb8,0x721ebbd7),LL(0xbc6390a9,0x0b0da855), LL(0xde314c70,0x2b4d04db),LL(0x6c32e846,0xcdbf1fbc),LL(0xb162fc9e,0x33833eab),LL(0xb0dd3ab7,0x9939b48b),
+ LL(0xcb0c9c8c,0x5aaa98a7),LL(0x81c4375c,0x75105f30),LL(0x5ef1c90f,0xceee5057),LL(0xc23a17bf,0xb31e065f), LL(0xd4b6d45a,0x5364d275),LL(0x62ec8996,0xd363f3ad),LL(0x4391c65b,0xb5d21239),LL(0xebb41b47,0x84564765),
+ LL(0x37107c78,0x20d18ecc),LL(0x570c2a66,0xacff3b6b),LL(0x9bd0d845,0x22f975d9),LL(0xba178fa0,0xef0a0c46), LL(0x76b6028e,0x1a419651),LL(0x248612d4,0xc49ec674),LL(0x7338af55,0x5b6ac4f2),LL(0x7bee5a36,0x06145e62),
+ LL(0xe75746b5,0x33e95d07),LL(0xc40c78be,0x1c1e1f6d),LL(0x222ff8e2,0x967833ef),LL(0xb49180ad,0x4bedcf6a), LL(0x3d7a4c8a,0x6b37e9c1),LL(0x6ddfe760,0x2748887c),LL(0xaa3a5bbc,0xf7055123),LL(0x7bbb8e74,0x954ff225),
+ LL(0x97c3dfb9,0xc42b8ab1),LL(0xcf168154,0x55a549b0),LL(0xc1b50692,0xad6748e7),LL(0x6fc5cbcb,0x2775780f), LL(0xe1c9d7c8,0x4eab80b8),LL(0x3fdbcd56,0x8c69dae1),LL(0x9969eace,0x47e6b4fb),LL(0xa705cb5a,0x002f1085),
+ LL(0x6d3fea55,0x4e23ca44),LL(0xf4810568,0xb4ae9c86),LL(0x2a62f27d,0x47bfb91b),LL(0xd9bac28c,0x60deb4c9), LL(0x7de6c34c,0xa892d894),LL(0x4494587d,0x4ee68259),LL(0x1a3f8a5b,0x914ee14e),LL(0x28700385,0xbb113eaa),
+ LL(0x2115b4c9,0x81ca03b9),LL(0x8908cad1,0x7c163d38),LL(0xaa18179a,0xc912a118),LL(0x886e3081,0xe09ed750), LL(0x26f516ca,0xa676e3fa),LL(0x8e732f91,0x753cacf7),LL(0x833da8b4,0x51592aea),LL(0x4cbea8aa,0xc626f42f),
+ LL(0xa7b56eaf,0xef9dc899),LL(0x34ef7316,0x00c0e52c),LL(0xfe818a86,0x5b1e4e24),LL(0xc538be47,0x9d31e20d), LL(0x3ed68974,0x22eb932d),LL(0x7c4e87c4,0xe44bbc08),LL(0x0dde9aef,0x4121086e),LL(0x134f4345,0x8e6b9cff),
+ LL(0x711b0eb9,0x96892c1f),LL(0x780ab954,0xb905f2c8),LL(0xa20792db,0xace26309),LL(0x0684e126,0xec8ac9b3), LL(0xb40a2447,0x486ad8b6),LL(0x9fe3fb24,0x60121fc1),LL(0x1a8e3b3f,0x5626fccf),LL(0x6ad1f394,0x4e568622),
+ LL(0x196aa5a1,0xda7aae0d),LL(0x1041b5fb,0xe0df8c77),LL(0x26b318b7,0x451465d9),LL(0x7ab136e9,0xc29b6e55), LL(0x71148463,0x2c2ab48b),LL(0x64454a76,0xb5738de3),LL(0x5a03abe4,0x54ccf9a0),LL(0x0427d58e,0x377c0296),
+ LL(0x2bb39c1f,0x73f5f0b9),LL(0xe608d8c5,0x14373f2c),LL(0x00fbb805,0xdcbfd314),LL(0x83afdcfb,0xdf18fb20), LL(0x42b3523f,0x81a57f42),LL(0x87f650fb,0xe958532d),LL(0x8b0a7d7c,0xaa8dc8b6),LL(0x150166be,0x1b75dfb7),
+ LL(0x2d7d1413,0x90e4f7c9),LL(0x9834f597,0x67e2d6b5),LL(0xa808c3e8,0x4fd4f4f9),LL(0xd5281ec1,0xaf8237e0), LL(0x84687cee,0x25ab5fdc),LL(0xa5b26c09,0xc5ded6b1),LL(0xc8ea7650,0x8e4a5aec),LL(0x14cc417f,0x23b73e5c),
+ LL(0x3037bf52,0x2bfb4318),LL(0x78c725d7,0xb61e6db5),LL(0xbbb3e5d7,0x8efd4060),LL(0xdbac488e,0x2e014701), LL(0x360aa449,0xac75cf9a),LL(0x79634d08,0xb70cfd05),LL(0xfffb15ef,0xa591536d),LL(0xd07c106c,0xb2c37582),
+ LL(0xf50225f9,0xb4293fdc),LL(0xb0e12b03,0xc52e175c),LL(0xd0a8bf64,0xf649c3ba),LL(0xeb8ae3c6,0x745a8fef), LL(0x58321bc3,0x30d7e5a3),LL(0x0bc4df48,0xb1732be7),LL(0xe9ea5058,0x1f217993),LL(0x3e4fd745,0xf7a71cde),
+ LL(0x894c5bbb,0x86cc533e),LL(0x69d83082,0x6915c7d9),LL(0x5815c244,0xa6aa2d05),LL(0x49b22ce5,0xaeeee592), LL(0x78135486,0x89e39d13),LL(0x16b76f2f,0x3a275c1f),LL(0xe036e8f5,0xdb6bcc1b),LL(0x5e4709f5,0x4df69b21),
+ LL(0x2d0f39aa,0xa188b250),LL(0x15a85947,0x622118bb),LL(0xfde0f4fa,0x2ebf520f),LL(0x4860e539,0xa40e9f29), LL(0x22b57f0f,0x7b6a51eb),LL(0x7e80644a,0x849a33b9),LL(0x1cf095fe,0x50e5d16f),LL(0xec55f002,0xd754b54e),
+ LL(0x236f4a98,0x5cfbbb22),LL(0x066800bb,0x0b0c59e9),LL(0x5a9a7774,0x4ac69a8f),LL(0xd6bec948,0x2b33f804), LL(0x32e6c466,0xb3729295),LL(0x4e599c73,0x68956d0f),LL(0x155c31cc,0xa47a249f),LL(0xe1ce284e,0x24d80f0d),
+ LL(0x988baf01,0xcd821dfb),LL(0xdbb16647,0xe6331a7d),LL(0x094cb960,0x1eb8ad33),LL(0xc91bbca5,0x593cca38), LL(0x26567456,0x384aac8d),LL(0xc04b6490,0x40fa0309),LL(0xdab6c8f6,0x97834cd6),LL(0x3f91e55f,0x68a7318d),
+ LL(0xfc4d3157,0xa00fd04e),LL(0x2bf3bdea,0xb56f8ab2),LL(0x4fa57172,0x014f5648),LL(0x450abdb3,0x948c5860), LL(0x0ebd4f08,0x342b5df0),LL(0x0e82938e,0x3e5168cd),LL(0xb0df5dd0,0x7aedc1ce),LL(0xe5732516,0x6bbbc6d9),
+ LL(0x605daaa6,0xc7bfd486),LL(0xbb9a6c9e,0x46fd72b7),LL(0xa124fb89,0xe4847fb1),LL(0xa2d8ffbc,0x75959cbd), LL(0xc8a588ee,0x42579f65),LL(0xb80b499d,0x368c92e6),LL(0x999a5df1,0xea4ef6cd),LL(0x936fe604,0xaa73bb7f),
+ LL(0x6457d188,0xf347a70d),LL(0x8b7a388b,0x86eda86b),LL(0x0ccd6013,0xb7cdff06),LL(0xd0053fb2,0xbeb1b6c7), LL(0x99240a9f,0x0b022387),LL(0x776189b2,0x1bbb384f),LL(0x9066193a,0x8695e71e),LL(0x06ffac7e,0x2eb50097),
+ LL(0x4a7d2caa,0x0654a9c0),LL(0xa5aaa290,0x6f3fb3d1),LL(0xff476e8f,0x835db041),LL(0xc42295e4,0x540b8b0b), LL(0x05e214f5,0xa5c73ac9),LL(0x56a0b638,0x9a74075a),LL(0xce9e680b,0x2e4b1090),LL(0x6b8d9afa,0x57a5b479),
+ LL(0x26bfe65c,0x0dca48e7),LL(0x7290c307,0x097e391c),LL(0x6669e72e,0x683c462e),LL(0x062559ac,0xf505be1e), LL(0xe3a3035a,0x5fbe3ea1),LL(0x9cd50da8,0x6431ebf6),LL(0x1f6407f2,0xfd169d5c),LL(0x60fce6b8,0x8d838a95),
+ LL(0x650006f0,0x2a2bfa7f),LL(0x50c0fbb2,0xdfd7dad3),LL(0xccf9ad96,0x92452495),LL(0xd95635f9,0x183bf494), LL(0x4a7bd989,0x02d5df43),LL(0xa5431095,0x505385cc),LL(0xfd43f53e,0xdd98e67d),LL(0x500c34a9,0xd61e1a6c),
+ LL(0x4a8a3d62,0x5a4b46c6),LL(0x247743d2,0x8469c4d0),LL(0x88f7e433,0x2bb3a13d),LL(0x01be5849,0x62b23a10), LL(0xa63d1a4c,0xe83596b4),LL(0x7d183f3e,0x454e7fea),LL(0x17afb01c,0x643fce61),LL(0x1c4c3638,0x4e65e5e6),
+ LL(0xef74c45b,0x41d85ea1),LL(0xae328506,0x2cfbfa66),LL(0x3ada7da9,0x98b078f5),LL(0xec752fbb,0xd985fe37), LL(0x5a0148b4,0xeece68fe),LL(0x2d78136d,0x6f9a55c7),LL(0xd2b729ce,0x232dccc4),LL(0x90aafbc4,0xa27e0dfd),
+ LL(0x12b4603e,0x96474452),LL(0x6b706d14,0xa876c551),LL(0x69a9d412,0xdf145fcf),LL(0x2d479c34,0xe2ab75b7), LL(0x1a23ff97,0x12df9a76),LL(0x5d359d10,0xc6138992),LL(0xfa835f22,0x6e51c7ae),LL(0xc0fcc4d9,0x69a79cb1),
+ LL(0x594cc7e1,0xf57f350d),LL(0x3350ab79,0x3079ca63),LL(0x9aff594a,0x226fb614),LL(0x6d59a62b,0x35afec02), LL(0x06ed2c6e,0x9bee46f4),LL(0x7d939a57,0x58da1735),LL(0x8fd1797e,0x44c50402),LL(0x5ccea6ca,0xd8853e7c),
+ LL(0xa35fcd5f,0x4065508d),LL(0x495ccaeb,0x8965df8c),LL(0x12e1a962,0x0f2da850),LL(0xc1cf1cc4,0xee471b94), LL(0x0a08fb75,0xcef19bc8),LL(0x81de3591,0x704958f5),LL(0x3aef4f88,0x2867f8b2),LL(0xea9f9a5f,0x8d749384),
+ LL(0x8c9049f4,0x1b385537),LL(0x7b92d8b6,0x5be948f3),LL(0xb6e2bd6b,0xd96f725d),LL(0x958c454d,0x37a222bc), LL(0x8809bf61,0xe7c61abb),LL(0x1346f18d,0x46f07fbc),LL(0xe87c0d1c,0xfb567a7a),LL(0x7ef3d07a,0x84a461c8),
+ LL(0xd9278d98,0x0a5adce6),LL(0x9dfc73e1,0x24d94813),LL(0x054321c3,0x4f3528b6),LL(0x692ea706,0x2e03fdde), LL(0x47b533c0,0x10e60619),LL(0x2ca3c055,0x1a8bc73f),LL(0x1bb62b8f,0xae58d4b2),LL(0x584a24e3,0xb2045a73),
+ LL(0xbd76e195,0x3ab3d5af),LL(0x6938a810,0x478dd1ad),LL(0x6ee3d5cb,0x6ffab393),LL(0x22b361e4,0xdfb693db), LL(0x51dbf1a7,0xf9694496),LL(0x08a2e762,0xcab4b4ef),LL(0xd39bba9a,0xe8c92f25),LL(0xf1464d96,0x850e61bc),
+ LL(0xdc09508b,0xb7e830e3),LL(0x74317655,0xfaf6d2cf),LL(0xdf690355,0x72606ceb),LL(0xd0c3ded6,0x48bb92b3), LL(0x5c7cf892,0x65b75484),LL(0xd5d5f01f,0xf6cd7ac9),LL(0x96401d69,0xc2c30a59),LL(0xed921878,0x91268650),
+ LL(0xb78c558f,0x380bf913),LL(0xc8afdaa9,0x43c0baeb),LL(0x54f169d3,0x377f61d5),LL(0xae5ff20b,0xf8da07e3), LL(0xa8a90ea8,0xb676c49d),LL(0x83a29b21,0x81c1ff2b),LL(0x2ad8d276,0x383297ac),LL(0xba89f982,0x3001122f),
+ LL(0x6718e448,0xe1d794be),LL(0x7c3e6e13,0x246c1482),LL(0x5d26b5ef,0x56646ef8),LL(0x88069cdd,0x80f5091e), LL(0x724bdd38,0xc5992e2f),LL(0x8471e8c7,0x02e915b4),LL(0x0d0ff2a9,0x96ff320a),LL(0x4384d1a0,0xbf886487),
+ LL(0xc93f72d6,0xbbe1e6a6),LL(0xcad800ea,0xd5f75d12),LL(0xe7acf117,0xfa40a09f),LL(0x7581a355,0x32c8cdd5), LL(0x7023c499,0x74221992),LL(0x38ec3901,0xa8afe5d7),LL(0xa90e83f0,0x5691afcb),LL(0x0b8f8eac,0x41bcaa03),
+ LL(0x8d2668d5,0xe38b5ff9),LL(0x7ad81965,0x0715281a),LL(0x03c6ce11,0x1bc8fc7c),LL(0x8b650436,0xcbbee6e2), LL(0x0cdb9808,0x06b00fe8),LL(0xfe3ed315,0x17d6e066),LL(0x4d0b5018,0x2e9d38c6),LL(0x844dcaef,0xab8bfd56),
+ LL(0x513aed8b,0x42894a59),LL(0x314bd07a,0xf77f3b6d),LL(0x8e42b582,0xbbdecb8f),LL(0xd2390fe6,0xf10e2fa8), LL(0x62a2f201,0xefb95022),LL(0x50ee32b0,0x4d59ea50),LL(0x6da789a8,0xd87f7728),LL(0xf79492c4,0xcf98a2cf),
+ LL(0x720943c2,0xf9577239),LL(0x3990b9d0,0xba044cf5),LL(0x95f2884a,0x5aa8e823),LL(0x0278a0af,0x834de6ed), LL(0x5f25bd12,0xc8e1ee9a),LL(0x6f7ab271,0x9259ceaa),LL(0x77d00b76,0x7e6d97a2),LL(0xa437832a,0x5c0c6eea),
+ LL(0x5606b81d,0x5232c20f),LL(0x0d991ee5,0xabd7b375),LL(0x8632d951,0x4d2bfe35),LL(0x98ed9364,0x78f85146), LL(0xf30c3282,0x951873f0),LL(0xa789230b,0x0da8ac80),LL(0x5398967f,0x3ac7789c),LL(0xbdda0fb5,0xa69b8f7f),
+ LL(0x6add8545,0xe5db7717),LL(0x72c49b66,0x1b71cb66),LL(0x68421d77,0xd8560739),LL(0x83e3afea,0x03840fe8), LL(0x1ec69977,0xb391dad5),LL(0x307f6726,0xae243fb9),LL(0xe8ca160c,0xc88ac87b),LL(0x4ce355f4,0x5174cced),
+ LL(0xe58ba37d,0x98a35966),LL(0x7817335d,0xfdcc8da2),LL(0x83fbc7bf,0x5b752830),LL(0xd9c96984,0x68e419d4), LL(0x02a40380,0x409a39f4),LL(0x1fe977bc,0x88940faf),LL(0x8f8edea6,0xc640a94b),LL(0xed11547d,0x1e22cd17),
+ LL(0x59ffc3e2,0xe28568ce),LL(0xc1dee4e7,0x60aa1b55),LL(0x837cb363,0xc67497c8),LL(0x105a2bf2,0x06fb438a), LL(0x500d8e20,0x30357ec4),LL(0x0670db10,0x1ad9095d),LL(0xc73b7cfd,0x7f589a05),LL(0x880d6d28,0xf544607d),
+ LL(0xa20ef103,0x17ba93b1),LL(0x6ba6577b,0xad859130),LL(0x6fa214a0,0x65c91cf6),LL(0x27990da5,0xd7d49c6c), LL(0x20bb569d,0xecd9ec8d),LL(0xeeffbc33,0xbd4b2502),LL(0x6bed0467,0x2056ca5a),LL(0x5b63728c,0x7916a1f7),
+ LL(0x53a4f566,0xd4f9497d),LL(0x97b56810,0x89734664),LL(0x0494a621,0xf8e1da74),LL(0x8d011c68,0x82546a93), LL(0xc61ac162,0x1f3acb19),LL(0xabad0d3e,0x52f8fa9c),LL(0xb4b7ea43,0x15356523),LL(0xae608125,0x5a16ad61),
+ LL(0x4faed184,0xb0bcb87f),LL(0x5029f45f,0x5f236b1d),LL(0x0bc6b1fc,0xd42c7607),LL(0x68aefce3,0xc644324e), LL(0x5c5d8446,0x8e191d59),LL(0x13ae1979,0xc0208077),LL(0x3ba59cc7,0xadcaee55),LL(0xa2cb81ba,0x20ed6d6b),
+ LL(0xb6efcffc,0x0952ba19),LL(0x97c0b87c,0x60f12d68),LL(0x9caa30bc,0x4ee2c7c4),LL(0x97fbff4e,0x767238b7), LL(0x501b5d92,0xebc73921),LL(0xc2a37737,0x3279e3df),LL(0x6d197543,0x9fc12bc8),LL(0x0a40db4e,0xfa94dc6f),
+ LL(0x530ccbbd,0x7392b41a),LL(0xea823525,0x87c82146),LL(0x05d98d0c,0xa52f984c),LL(0x5ef6974c,0x2ae57d73), LL(0x3042a6dd,0x9377f7bf),LL(0x19647a64,0xb1a007c0),LL(0x0cca9767,0xfaa9079a),LL(0xf68f72d5,0x3d81a25b),
+ LL(0xff81578e,0x752067f8),LL(0x9045447d,0x78622150),LL(0x0505aa6f,0xc0c22fcf),LL(0x6bed1c77,0x1030f0a6), LL(0x1f0bd739,0x31f29f15),LL(0xe6debe85,0x2d7989c7),LL(0x8e677e98,0x5c070e72),LL(0x06e81fd5,0x0a817bd3),
+ LL(0xb0f2ac95,0xc110d830),LL(0xab20e64e,0x48d0995a),LL(0x7729cd9a,0x0f3e00e1),LL(0xdd556946,0x2a570c20), LL(0x4e86214d,0x912dbcfd),LL(0xcf615498,0x2d014ee2),LL(0x3530d76e,0x55e2b1e6),LL(0xfd0fd6d1,0xc5135ae4),
+ LL(0xd4f3049f,0x0066273a),LL(0xe7087477,0xbb8e9893),LL(0x14c6e5fd,0x2dba1ddb),LL(0x51f57e6c,0xdba37886), LL(0x5a72f2cf,0x5aaee0a6),LL(0x7bea5642,0x1208bfbf),LL(0x67872c37,0xf5c6aa3b),LL(0x43f93224,0xd726e083),
+ LL(0x061f1658,0x1854daa5),LL(0xdf0cd2b3,0xc0016df1),LL(0x833d50de,0xc2a3f23e),LL(0xbbbd3017,0x73b681d2), LL(0x3ac343c0,0x2f046dc4),LL(0x85716421,0x9c847e7d),LL(0x0917eed4,0xe1e13c91),LL(0x63a1b9c6,0x3fc9eebd),
+ LL(0x7fe02299,0x0f816a72),LL(0x294f3319,0x6335ccc2),LL(0x4745c5be,0x3820179f),LL(0x922f066e,0xe647b782), LL(0x02cafb8a,0xc22e49de),LL(0xfcc2eccc,0x299bc2ff),LL(0x6e0e8282,0x9a8feea2),LL(0xfe893205,0xa627278b),
+ LL(0x7933e47b,0xa7e19733),LL(0x2e766402,0xf4ff6b13),LL(0x98440d9f,0xa4d8be0a),LL(0x38938808,0x658f5c2f), LL(0xc95b3b3e,0x90b75677),LL(0x3137b6ff,0xfa044269),LL(0x43c47c29,0x077b039b),LL(0x8a6445b2,0xcca95dd3),
+ LL(0x2333fc4c,0x0b498ba4),LL(0xf736a1b1,0x274f8e68),LL(0x5f1d4b2e,0x6ca348fd),LL(0xa8f10199,0x24d3be78), LL(0xca14f530,0x8535f858),LL(0x5b982e51,0xa6e7f163),LL(0x36e1bf62,0x847c8512),LL(0x03448418,0xf6a7c58e),
+ LL(0xf9374ab6,0x583f3703),LL(0x6e564145,0x864f9195),LL(0x22526d50,0x33bc3f48),LL(0x1262a496,0x9f323c80), LL(0x3f046a9a,0xaa97a7ae),LL(0xdf8a039a,0x70da183e),LL(0x52aa0ba6,0x5b68f71c),LL(0x21459c2d,0x9be0fe51),
+ LL(0xcbc613e5,0xc1e17eb6),LL(0x497ea61c,0x33131d55),LL(0xaf7eded5,0x2f69d39e),LL(0xde6af11b,0x73c2f434), LL(0xa4a375fa,0x4ca52493),LL(0xb833c5c2,0x5f06787c),LL(0x3e6e71cf,0x814e091f),LL(0x8b746666,0x76451f57),
+},
+/* digit=17 base_pwr=2^119 */
+{
+ LL(0x694db7e0,0x80f9bdef),LL(0xb9fcddc6,0xedca8787),LL(0x03b8dce1,0x51981c34),LL(0x70e10ba1,0x4274dcf1), LL(0x6def6d1a,0xf72743b8),LL(0xebdb1866,0xd25b1670),LL(0x050c6f58,0xc4491e8c),LL(0x87fbd7f5,0x2be2b2ab),
+ LL(0xd111f8ec,0x3e0e5c9d),LL(0xb7c4e760,0xbcc33f8d),LL(0xbd392a51,0x702f9a91),LL(0xc132e92d,0x7da4a795), LL(0x0bb1151b,0x1a0b0ae3),LL(0x02e32251,0x54febac8),LL(0x694e9e78,0xea3a5082),LL(0xe4fe40b8,0xe58ffec1),
+ LL(0xd1e0cf9e,0xf85592fc),LL(0xc0e7b2e8,0xdea75f0d),LL(0xc135584e,0xc04215cf),LL(0x2f57092a,0x174fc727), LL(0xeb930bea,0xe7277877),LL(0x5eb02a5a,0x504caccb),LL(0xf5241b9b,0xf9fe08f7),LL(0x8d5ca954,0xe7fb62f4),
+ LL(0x29c4120b,0xfbb8349d),LL(0xc0d0d915,0x9f94391f),LL(0x5410ba51,0xc4074fa7),LL(0x150a5911,0xa66adbf6), LL(0x34bfca38,0xc164543c),LL(0xb9e1ccfc,0xe0f27560),LL(0xe820219c,0x99da0f53),LL(0xc6b4997a,0xe8234498),
+ LL(0x9d4c5423,0xcfb88b76),LL(0xb0521c49,0x9e56eb10),LL(0xbe8700a1,0x418e0b5e),LL(0xf93cb58a,0x00cbaad6), LL(0xd92a5e67,0xe923fbde),LL(0x1f347f11,0xca4979ac),LL(0x6bc0585b,0x89162d85),LL(0xac3c70e3,0xdd6254af),
+ LL(0x516e19e4,0x7b23c513),LL(0xc5c4d593,0x56e2e847),LL(0x5ce71ef6,0x9f727d73),LL(0xf79a44c5,0x5b6304a6), LL(0x3ab7e433,0x6638a736),LL(0xfe742f83,0x1adea470),LL(0x5b7fc19f,0xe054b854),LL(0xba1d0698,0xf935381a),
+ LL(0x799e9a74,0x546eab2d),LL(0xa949f729,0x96239e0e),LL(0x7090055a,0xca274c6b),LL(0x9020c9b0,0x835142c3), LL(0xa2e8807f,0xa405667a),LL(0x1aa3d39e,0x29f2c085),LL(0x42fc72f5,0xcc555d64),LL(0xfbeacb3c,0xe856e0e7),
+ LL(0x918e4936,0xb5504f9d),LL(0xb2513982,0x65035ef6),LL(0x6f4d9cb9,0x0553a0c2),LL(0xbea85509,0x6cb10d56), LL(0xa242da11,0x48d957b7),LL(0x672b7268,0x16a4d3dd),LL(0x8502a96b,0x3d7e637c),LL(0x730d463b,0x27c7032b),
+ LL(0xe4136a14,0xbdc02b18),LL(0x678e32bf,0xbacf969d),LL(0xdd9c3c03,0xc98d89a3),LL(0x23becc4f,0x7b92420a), LL(0xc64d565c,0xd4b41f78),LL(0x10f28295,0x9f969d00),LL(0xb13d051a,0xec7f7f76),LL(0xa92da585,0x08945e1e),
+ LL(0x5846426f,0x55366b7d),LL(0x247d441d,0xe7d09e89),LL(0x736fbf48,0x510b404d),LL(0xe784bd7d,0x7fa003d0), LL(0x17fd9596,0x25f7614f),LL(0x35cb98db,0x49e0e0a1),LL(0x2e83a76a,0x2c65957b),LL(0xcddbe0f8,0x5d40da8d),
+ LL(0x050bad24,0xf2b8c405),LL(0xc2aa4823,0x8918426d),LL(0xa38365a7,0x2aeab3dd),LL(0x7c91b690,0x72031717), LL(0x60a94120,0x8b00d699),LL(0xe99eaeec,0x478a255d),LL(0x6f60aafd,0xbf656a5f),LL(0x5dee77b3,0xdfd7cb75),
+ LL(0xa595939d,0x37f68bb4),LL(0x28740217,0x03556479),LL(0x84ad7612,0x8e740e7c),LL(0x9044695f,0xd89bc843), LL(0x85a9184d,0xf7f3da5d),LL(0x9fc0b074,0x562563bb),LL(0xf88a888e,0x06d2e6aa),LL(0x161fbe7c,0x612d8643),
+ LL(0xf64085e7,0x465edba7),LL(0x29aa8511,0xb230f304),LL(0xcda2d188,0x53388426),LL(0x4b666649,0x90885735), LL(0x652f54f6,0x6f02ff9a),LL(0x5fae2bf0,0x65c82294),LL(0x62f5eee3,0x7816ade0),LL(0xfcc56d70,0xdcdbdf43),
+ LL(0x54530bb2,0x9fb3bba3),LL(0xcb0869ea,0xbde3ef77),LL(0x0b431163,0x89bc9046),LL(0xe4819a35,0x4d03d7d2), LL(0x43b6a782,0x33ae4f9e),LL(0x9c88a686,0x216db307),LL(0x00ffedd9,0x91dd88e0),LL(0x12bd4840,0xb280da9f),
+ LL(0x1635e741,0x32a7cb8a),LL(0x78be02a7,0xfe14008a),LL(0x1b7ae030,0x3fafb334),LL(0x5add0ce9,0x7fd508e7), LL(0xd607ad51,0x72c83219),LL(0x8d40964a,0x0f229c0a),LL(0x1c878da2,0x1be2c336),LL(0xeab2ab86,0xe0c96742),
+ LL(0x3e538cd7,0x458f8691),LL(0x8e08ad53,0xa7001f6c),LL(0xbf5d15ff,0x52b8c6e6),LL(0x011215dd,0x548234a4), LL(0x3d5b4045,0xff5a9d2d),LL(0x4a904190,0xb0ffeeb6),LL(0x48607f8b,0x55a3aca4),LL(0x30a0672a,0x8cbd665c),
+ LL(0x42583068,0x87f834e0),LL(0xf3f6e683,0x02da2aeb),LL(0x05c12248,0x6b763e5d),LL(0x65a8aefc,0x7230378f), LL(0x71e8e5ca,0x93bd80b5),LL(0xb3b62524,0x53ab041c),LL(0x6c9c552e,0x1b860513),LL(0xd5524e66,0xe84d402c),
+ LL(0xf37f5937,0xa37f3573),LL(0xd1e4fca5,0xeb0f6c7d),LL(0xac8ab0fc,0x2965a554),LL(0x274676ac,0x17fbf56c), LL(0xacf7d720,0x2e2f6bd9),LL(0x10224766,0x41fc8f88),LL(0x85d53bef,0x517a14b3),LL(0x7d76a7d1,0xdae327a5),
+ LL(0xc4818267,0x6ad0a065),LL(0x37c1bbc1,0x33aa189b),LL(0x27392a92,0x64970b52),LL(0x2d1535ea,0x21699a1c), LL(0xc2d7a7fd,0xcd20779c),LL(0x99c83cf2,0xe3186059),LL(0x72c0b8c7,0x9b69440b),LL(0x7b9e0e4d,0xa81497d7),
+ LL(0x1f5f82dc,0x515d5c89),LL(0x6361079e,0x9a7f67d7),LL(0x11a35330,0xa8da81e3),LL(0x4b18be1b,0xe44990c4), LL(0xaf103e59,0xc7d5ed95),LL(0x8dac9261,0xece8aba7),LL(0x9394b8d3,0xbe82b099),LL(0x16adfe83,0x6830f09a),
+ LL(0x88172d01,0x250a29b4),LL(0xcaff9e02,0x8b20bd65),LL(0xe8a6329a,0xb8a7661e),LL(0xd3fce920,0x4520304d), LL(0x2b47f7ef,0xae45da1f),LL(0x5bffc540,0xe07f5288),LL(0x3464f874,0xf7997009),LL(0xa6fa1f38,0x2244c2cd),
+ LL(0x94d7d9b1,0x43c41ac1),LL(0xc82e7f17,0x5bafdd82),LL(0x5fda0fca,0xdf0614c1),LL(0xa8ae37ad,0x74b043a7), LL(0x9e71734c,0x3ba6afa1),LL(0x9c450f2e,0x15d5437e),LL(0x67e242b1,0x4a5883fe),LL(0x2c1953c2,0x5143bdc2),
+ LL(0xfc5e8920,0x542b8b53),LL(0x9a9cee08,0x363bf9a8),LL(0xc3486e08,0x02375f10),LL(0x8c5e70d2,0x2037543b), LL(0x625640b4,0x7109bccc),LL(0x8bc62c3b,0xcbc1051e),LL(0x803f26ea,0xf8455fed),LL(0xeb372424,0x6badceab),
+ LL(0x6b53f5f9,0xa2a9ce7c),LL(0x1b176d99,0x64246595),LL(0xb95c081b,0xb1298d36),LL(0x1d9a9ee6,0x53505bb8), LL(0xf2ba70b0,0x3f6f9e61),LL(0x8afad453,0xd07e16c9),LL(0xe7eb4a6a,0x9f1694bb),LL(0x3cb0bc8e,0xdfebced9),
+ LL(0x53868c8b,0x92d3dcdc),LL(0x386107a6,0x174311a2),LL(0x689b4e64,0x4109e07c),LL(0x2df3dcb6,0x30e4587f), LL(0x0811b3b2,0x841aea31),LL(0x0cce43ea,0x6144d41d),LL(0x2a9a7803,0x464c4581),LL(0x3e158930,0xd03d371f),
+ LL(0xb1f3390b,0xc676d7f2),LL(0xa5b61272,0x9f7a1b8c),LL(0xc2e127a9,0x4ebebfc9),LL(0x5dd997bf,0x4602500c), LL(0x4711230f,0x7f09771c),LL(0x020f09c1,0x058eb37c),LL(0xfee5e38b,0xab693d4b),LL(0x4653cbc0,0x9289eb1f),
+ LL(0xd51b9cf5,0xbecf46ab),LL(0x9f0121af,0xd2aa9c02),LL(0xe90dc274,0x36aaf7d2),LL(0x48b95a3c,0x909e4ea0), LL(0x6f32dbdb,0xe6b70496),LL(0x8b030b3e,0x672188a0),LL(0xcfb617e2,0xeeffe5b3),LL(0x7c82709e,0x87e947de),
+ LL(0x1770f5a7,0xa44d2b39),LL(0x0e44eb82,0xe4d4d791),LL(0x3f69712a,0x42e69d1e),LL(0xac6a820e,0xbf11c4d6), LL(0x42c4224c,0xb5e7f3e5),LL(0x449d941c,0xd6b4e81c),LL(0x5450e878,0x5d72bd16),LL(0xee25ac54,0x6a61e28a),
+ LL(0xe6f1cd95,0x33272094),LL(0x0d18673f,0x7512f30d),LL(0x5afc1464,0x32f7a4ca),LL(0x6bbb977b,0x2f095656), LL(0xa8226200,0x586f47ca),LL(0x1ac07369,0x02c868ad),LL(0xc613acbe,0x4ef2b845),LL(0x0386054c,0x43d7563e),
+ LL(0xab952578,0x54da9dc7),LL(0x26e84d0b,0xb5423df2),LL(0x9b872042,0xa8b64eeb),LL(0x5990f6df,0xac205782), LL(0x21f4c77a,0x4ff696eb),LL(0xaab273af,0x1a79c3e4),LL(0x9436b3f1,0x29bc922e),LL(0xd6d9a27a,0xff807ef8),
+ LL(0x778f22a0,0x82acea3d),LL(0x5b5e7469,0xfb10b2e8),LL(0x2818ee7d,0xc0b16980),LL(0xc91c1a2f,0x011afff4), LL(0xad124418,0x95a6d126),LL(0xe72e295f,0x31c081a5),LL(0xf2f4db75,0x36bb283a),LL(0x7acef462,0xd115540f),
+ LL(0x33f6746c,0xc7f3a8f8),LL(0xfea990ca,0x21e46f65),LL(0xcaddb0a9,0x915fd5c5),LL(0x78614555,0xbd41f016), LL(0x426ffb58,0x346f4434),LL(0x14dbc204,0x80559436),LL(0x5a969b7f,0xf3dd20fe),LL(0xe899a39a,0x9d59e956),
+ LL(0x8ad4cf4b,0xf1b0971c),LL(0x2ffb8fb8,0x03448860),LL(0x65340ba4,0xf071ac3c),LL(0xb27fd758,0x408d0596), LL(0x98c364b0,0xe7c78ea4),LL(0x051e8ab5,0xa4aac4a5),LL(0x485d9002,0xb9e1d560),LL(0x88844455,0x9acd518a),
+ LL(0xd06f56c0,0xe4ca688f),LL(0xdf027972,0xa48af70d),LL(0x5e9a609d,0x691f0f04),LL(0xee61270e,0xa9dd82cd), LL(0xa0ef18d3,0x8903ca63),LL(0x3d6ca3bd,0x9fb7ee35),LL(0xabf47d03,0xa7b4a09c),LL(0x1c67de8e,0x4cdada01),
+ LL(0x9355a244,0x52003749),LL(0x4f2151a9,0xe77fd2b6),LL(0x66b4efcb,0x695d6cf6),LL(0xda2cfe25,0xc5a0cacf), LL(0xef811865,0x104efe5c),LL(0x9ea5cc3d,0xf52813e8),LL(0x40b58dbc,0x855683dc),LL(0x175fcb11,0x0338ecde),
+ LL(0x74921592,0xf9a05637),LL(0xb9bb9d31,0xb4f1261d),LL(0x4e9c5459,0x551429b7),LL(0x6ea71f53,0xbe182e6f), LL(0xdfc50573,0xd3a3b07c),LL(0x62be8d44,0x9ba1afda),LL(0x52ab65d3,0x9bcfd2cb),LL(0xa9571802,0xdf11d547),
+ LL(0x02a2404a,0x099403ee),LL(0x21088a71,0x497406f4),LL(0x5004ae71,0x99479409),LL(0xa812c362,0xbdb42078), LL(0xd8828442,0x2b72a30f),LL(0xfcb5ed1c,0x283add27),LL(0x66a40015,0xf7c0e200),LL(0x08b295ef,0x3e3be641),
+ LL(0xe038a675,0xac127dc1),LL(0x8c5c6320,0x729deff3),LL(0xa90d2c53,0xb7df8fd4),LL(0x681e7cd3,0x9b74b0ec), LL(0xdab407e5,0x5cb5a623),LL(0x76b340c6,0xcdbd3615),LL(0x7d28392c,0xa184415a),LL(0xe96f7830,0xc184c1d8),
+ LL(0x81d3a80f,0xc3204f19),LL(0xc8e02432,0xfde0c841),LL(0x8149e0c1,0x78203b3e),LL(0x08053a73,0x5904bdbb), LL(0x101b6805,0x30fc1dd1),LL(0x49aa6d49,0x43c223bc),LL(0x7a174087,0x9ed67141),LL(0xd5997008,0x311469a0),
+ LL(0x5e43fc61,0xb189b684),LL(0xe0d3ab57,0xf3282375),LL(0xb1181da8,0x4fa34b67),LL(0x99ee52b8,0x621ed0b2), LL(0xad990676,0x9b178de1),LL(0x56d54065,0xd51de67b),LL(0x7538c201,0x2a2c27c4),LL(0x38a40f5c,0x33856ec8),
+ LL(0xbe6cdcde,0x2522fc15),LL(0x9f0c6f89,0x1e603f33),LL(0x103e30a6,0x7994edc3),LL(0x220c853e,0x033a00db), LL(0xf7bb7fd7,0xd3cfa409),LL(0x462d18f6,0x70f8781e),LL(0x687fe295,0xbbd82980),LL(0x595669f3,0x6eef4c32),
+ LL(0x2f7e85c3,0x86a9303b),LL(0x71988f9b,0x5fce4621),LL(0xc138acb5,0x5b935bf6),LL(0x25661212,0x30ea7d67), LL(0xe51ab9a2,0xef1eb5f4),LL(0xae067c78,0x0587c98a),LL(0x77ca9ca6,0xb3ce1b3c),LL(0x54b5f057,0x2a553d4d),
+ LL(0x4da29ec2,0xc7898236),LL(0xb9c57316,0xdbdd5d13),LL(0x2cd80d47,0xc57d6e6b),LL(0xfe9e7391,0x80b460cf), LL(0xf963c31e,0x98648cab),LL(0xcc4d32fd,0x67f9f633),LL(0xfdf7c687,0x0af42a9d),LL(0x0b015ea7,0x55f292a3),
+ LL(0xcd21ab3d,0x89e468b2),LL(0xc393d392,0xe504f022),LL(0xa5013af9,0xab21e1d4),LL(0xc2c28acb,0xe3283f78), LL(0x226bf99f,0xf38b35f6),LL(0x0e291e69,0xe8354274),LL(0xb20c162d,0x61673a15),LL(0xb04fbdbe,0xc101dc75),
+ LL(0x255bd617,0x8323b4c2),LL(0x6c2a9154,0x6c969693),LL(0x62679387,0xc6e65860),LL(0xb8c88e23,0x8e01db0c), LL(0x893a5559,0x33c42873),LL(0x47a3e149,0x7630f04b),LL(0xddcf35f8,0xb5d80805),LL(0x77dfe732,0x582ca080),
+ LL(0x0b1894a0,0x2c7156e1),LL(0xd81c68c0,0x92034001),LL(0xc8b115b5,0xed225d00),LL(0x83b907f2,0x237f9c22), LL(0x4470e2c0,0x0ea2f32f),LL(0x58be4e95,0xb725f7c1),LL(0xb1ae5463,0x0f1dcafa),LL(0x1ba2fc04,0x59ed5187),
+ LL(0xd0115d4d,0xf6e0f316),LL(0xd3691599,0x5180b12f),LL(0x527f0a41,0x157e32c9),LL(0xa8e0ecc0,0x7b0b081d), LL(0xbf4f0dd0,0x6dbaaa8a),LL(0x4d252696,0x99b289c7),LL(0xdbf864fe,0x79b7755e),LL(0x76cad3ab,0x6974e2b1),
+ LL(0x06ddd657,0x35dbbee2),LL(0x2ff3a96d,0xe7cbdd11),LL(0x076be758,0x88381968),LL(0x08c91f5d,0x2d737e72), LL(0x86ec3776,0x5f83ab62),LL(0x945fa7a1,0x98aa649d),LL(0x72ef0933,0xf477ec37),LL(0x098c17b1,0x66f52b1e),
+ LL(0xd803738b,0x9eec58fb),LL(0xe4e86aa4,0x91aaade7),LL(0xa5b51492,0x6b1ae617),LL(0xbbc45974,0x63272121), LL(0x862c5129,0x7e0e28f0),LL(0x3321a4a0,0x0a8f79a9),LL(0x5041c88f,0xe26d1664),LL(0x53233e3a,0x0571b805),
+ LL(0xc9520711,0xd1b0ccde),LL(0x3c8b84bf,0x55a9e4ed),LL(0xa1fef314,0x9426bd39),LL(0x6eb93f2b,0x4f5f638e), LL(0x2bf9341b,0xba2a1ed3),LL(0x4d42d5a9,0xd63c1321),LL(0x316dc7c5,0xd2964a89),LL(0xca511851,0xd1759606),
+ LL(0xf9e6ed35,0xd8a9201f),LL(0x6736925a,0xb7b5ee45),LL(0x99581af7,0x0a83fbbc),LL(0x64eeb051,0x3076bc40), LL(0x02dec312,0x5511c98c),LL(0x238dcb78,0x270de898),LL(0x539c08c9,0x2cf4cf9c),LL(0x38d3b06e,0xa70cb65e),
+ LL(0xcfe57bbd,0xb12ec10e),LL(0x35a0c2b5,0x82c7b656),LL(0x161c67bd,0xddc7d5cd),LL(0xae3a32cc,0xe32e8985), LL(0xd11a5529,0x7aba9444),LL(0x2427fa1a,0xe964ed02),LL(0x24a1770a,0x1528392d),LL(0x12c72fcd,0xa152ce2c),
+ LL(0x8ec07649,0x714553a4),LL(0x459dd453,0x18b4c290),LL(0x7b64b110,0xea32b714),LL(0x2e6f07a2,0xb871bfa5), LL(0x9e2e3c9b,0xb67112e5),LL(0x44aa90f6,0xfbf250e5),LL(0xbd539006,0xf77aedb8),LL(0xd172a66f,0x3b0cdf9a),
+ LL(0xf8c51187,0xedf69fea),LL(0x741e4da7,0x05bb67ec),LL(0x08114345,0x47df0f32),LL(0xbb9792b1,0x56facb07), LL(0x8f6229e4,0xf3e007e9),LL(0x526fba0f,0x62d103f4),LL(0xb0339d79,0x4f33bef7),LL(0xb59bfec1,0x9841357b),
+ LL(0xc34e6705,0xfa8dbb59),LL(0x7fdaa84c,0xc3c7180b),LL(0xa4108537,0xf95872fc),LL(0x932a3e5a,0x8750cc3b), LL(0xb7275d7d,0xb61cc69d),LL(0x2e59b2e9,0xffa0168b),LL(0x6ecbb493,0xca032abc),LL(0x2c9082d8,0x1d86dbd3),
+ LL(0xe28ef5ba,0xae1e0b67),LL(0xcb18e169,0x2c9a4699),LL(0x1e6bbd20,0x0ecd0e33),LL(0xaf5e81d2,0x571b360e), LL(0x101c1d45,0xcd9fea58),LL(0x18880452,0x6651788e),LL(0x1f8dd446,0xa9972635),LL(0xe37281d0,0x44bed022),
+ LL(0x33da525d,0x094b2b2d),LL(0x13144fd8,0xf193678e),LL(0xf4c1061d,0xb8ab5ba4),LL(0xdccbe0f4,0x4343b5fa), LL(0x63812713,0xa8702371),LL(0xf7611d93,0x47bf6d2d),LL(0xbd21e1d7,0x46729b8c),LL(0xd629e77d,0x7484d4e0),
+ LL(0x60dbac1f,0x830e6eea),LL(0xda06a2f7,0x23d8c484),LL(0x50ca535b,0x896714b0),LL(0xebd97a9b,0xdc8d3644), LL(0xb12177b4,0x106ef9fa),LL(0x534d5d9c,0xf79bf464),LL(0xa6ab360b,0x2537a349),LL(0xa00c744f,0xc7c54253),
+ LL(0xe5911a76,0xb3c7a047),LL(0x647f1ee7,0x61ffa5c8),LL(0x8f56ab42,0x15aed36f),LL(0xa3ff9ac9,0x6a0d41b0), LL(0xcc30d357,0x68f469f5),LL(0x6b72be96,0xbe9adf81),LL(0x903ad461,0x1cd926fe),LL(0xcaca441b,0x7e89e38f),
+ LL(0xfacf69d4,0xf0f82de5),LL(0x4775344c,0x363b7e76),LL(0xb2e36d04,0x6894f312),LL(0x11d1c9a5,0x3c6cb4fe), LL(0x4008e1f2,0x85d9c339),LL(0x249f326c,0x5e9a85ea),LL(0x678c5e06,0xdc35c60a),LL(0x9f86fba9,0xc08b944f),
+ LL(0x89f71f0f,0xde40c02c),LL(0xff3da3c0,0xad8f3e31),LL(0x42125ded,0x3ea5096b),LL(0xa7379183,0x13879cbf), LL(0x6b306a0b,0x6f4714a5),LL(0x67646c5e,0x359c2ea6),LL(0x07726368,0xfacf8943),LL(0x65ff431e,0x07a58935),
+ LL(0x68754ab0,0x24d661d1),LL(0x6f429a76,0x801fce1d),LL(0xa58ce769,0xc068a85f),LL(0x5d5eca2b,0xedc35c54), LL(0xa3f660d1,0xea31276f),LL(0xb8fc7167,0xa0184ebe),LL(0x1d8db0ae,0x0f20f21a),LL(0x56c35e12,0xd96d095f),
+ LL(0xf8c2a25b,0xedf402b5),LL(0x059204b6,0x1bb772b9),LL(0x19b4e34c,0x50cbeae2),LL(0x3fa0845a,0x93109d80), LL(0x8ef59fb5,0x54f7ccf7),LL(0x88070963,0x3b438fe2),LL(0x31f3ba9b,0x9e28c659),LL(0xead9da92,0x9cc31b46),
+ LL(0xb733aa5f,0x3c2f0ba9),LL(0xf05af235,0xdece47cb),LL(0xa2ac82a5,0xf8e3f715),LL(0x2203f18a,0xc97ba641), LL(0x09c11060,0xc3af5504),LL(0x46af512d,0x56ea2c05),LL(0xf3f28146,0xfac28daf),LL(0x959ef494,0x87fab43a),
+},
+/* digit=18 base_pwr=2^126 */
+{
+ LL(0xd4c5105f,0x09891641),LL(0x6d7fbd65,0x1ae80f8e),LL(0xbee6bdb0,0x9d67225f),LL(0x7fc4d860,0x3b433b59), LL(0x93e85638,0x44e66db6),LL(0xe3e9862f,0xf7b59252),LL(0x665c32ec,0xdb785157),LL(0xae362f50,0x702fefd7),
+ LL(0x0fefb0c3,0x3754475d),LL(0x46d7c35d,0xd48fb56b),LL(0x363798a4,0xa070b633),LL(0x8fdb98e6,0xae89f3d2), LL(0x6363d14c,0x970b89c8),LL(0x67abd27d,0x89817521),LL(0x44d5a021,0x9bf7d474),LL(0xcac72aee,0xb3083baf),
+ LL(0xbe949a44,0x389741de),LL(0x546a4fa5,0x638e9388),LL(0xa0047bdc,0x3fe6419c),LL(0xaaea57ca,0x7047f648), LL(0x41fbab17,0x54e48a90),LL(0x576bdba2,0xda8e0b28),LL(0xc72afddc,0xe807eebc),LL(0xf42577bf,0x07d3336d),
+ LL(0xbfe20925,0x62a8c244),LL(0x8fdce867,0x91c19ac3),LL(0xdd387063,0x5a96a5d5),LL(0x21d324f6,0x61d587d4), LL(0xa37173ea,0xe87673a2),LL(0x53778b65,0x23848008),LL(0x05bab43e,0x10f8441e),LL(0x4621efbe,0xfa11fe12),
+ LL(0x81685d7b,0x047b772e),LL(0xbf34a976,0x23f27d81),LL(0x915f48ef,0xc27608e2),LL(0xa521d5c3,0x3b0b43fa), LL(0x63ca7284,0x7613fb26),LL(0x1d4db837,0x7f5729b4),LL(0x583b526b,0x87b14898),LL(0xbbadd3d1,0x00b732a6),
+ LL(0x2048e396,0x8e02f426),LL(0x383d9de4,0x436b50b6),LL(0x471e85ad,0xf78d3481),LL(0xd005c8d6,0x8b01ea6a), LL(0x97015c07,0xd3c7afee),LL(0x4e3ba2ae,0x46cdf1a9),LL(0x83d3a1d2,0x7a42e501),LL(0xb541dff4,0xd54b5268),
+ LL(0x4e23e9bc,0x3f24cf30),LL(0x126e3624,0x4387f816),LL(0x3b0b6d61,0x26a46a03),LL(0x8b2d777c,0xaf1bc845), LL(0x527de79c,0x25c401ba),LL(0x4261bbb6,0x0e1346d4),LL(0x287b4bc7,0x4b96c44b),LL(0x5254562f,0x658493c7),
+ LL(0xb8a24a20,0x23f949fe),LL(0xf52ca53f,0x17ebfed1),LL(0xbcfb4853,0x9b691bbe),LL(0x6278a05d,0x5617ff6b), LL(0xe3c99ebd,0x241b34c5),LL(0x1784156a,0xfc64242e),LL(0x695d67df,0x4206482f),LL(0xee27c011,0xb967ce0e),
+ LL(0x21c80b5d,0x65db3751),LL(0xa31ecca0,0x2e7a563c),LL(0x5238a07e,0xe56ffc4e),LL(0x32ced854,0x3d6c2966), LL(0xaf70b885,0xe99d7d1a),LL(0x2d686459,0xafc3bad9),LL(0x0cc8ba5b,0x9c78bf46),LL(0x18955aa3,0x5a439519),
+ LL(0x5fe4e314,0xf8b517a8),LL(0xfcb8906f,0xe60234d0),LL(0xf2061b23,0xffe542ac),LL(0x6b4cb59c,0x287e191f), LL(0x09d877d8,0x21857ddc),LL(0x14678941,0x1c23478c),LL(0xb6e05ea4,0xbbf0c056),LL(0xb01594fe,0x82da4b53),
+ LL(0xfadb8608,0xf7526791),LL(0x7b74cdf6,0x049e832d),LL(0xc2b90a34,0xa43581cc),LL(0x9360b10c,0x73639eb8), LL(0xe1e4a71b,0x4fba331f),LL(0x8072f919,0x6ffd6b93),LL(0x65679032,0x6e53271c),LL(0xf14272ce,0x67206444),
+ LL(0xb2335834,0xc0f734a3),LL(0x90ef6860,0x9526205a),LL(0x04e2bb0d,0xcb8be717),LL(0x02f383fa,0x2418871e), LL(0x4082c157,0xd7177681),LL(0x29c20073,0xcc914ad0),LL(0xe587e728,0xf186c1eb),LL(0x61bcd5fd,0x6fdb3c22),
+ LL(0xf2f9f8e9,0x30d014a6),LL(0x4fec49d2,0x963ece23),LL(0x9605a8d9,0x862025c5),LL(0x19f8929a,0x39874445), LL(0x12bf476a,0x01b6ff65),LL(0x09cf7d91,0x598a64d8),LL(0x93be56ca,0xd7ec7749),LL(0xcbb33615,0x10899785),
+ LL(0x02eee3ad,0xb8a092fd),LL(0x30145270,0xa86b3d35),LL(0x8512b675,0x323d98c6),LL(0x62ebb40f,0x4b8bc785), LL(0x413f9cde,0x7d301f54),LL(0x2bab5664,0xa5e4fb4f),LL(0x1cbfec23,0x1d2b252d),LL(0xe177120d,0xfcd576bb),
+ LL(0x83731a34,0x04427d3e),LL(0xed836e8e,0x2bb9028e),LL(0xb612ca7c,0xb36acff8),LL(0xd3d9c73a,0xb88fe5ef), LL(0xedea4eb3,0xbe2a6bc6),LL(0x488eec77,0x43b93133),LL(0xb17106e1,0xf41ff566),LL(0x654efa32,0x469e9172),
+ LL(0x41c23fa3,0xb4480f04),LL(0xc1989a2e,0xb4712eb0),LL(0x93a29ca7,0x3ccbba0f),LL(0xd619428c,0x6e205c14), LL(0xb3641686,0x90db7957),LL(0x45ac8b4e,0x0432691d),LL(0xf64e0350,0x07a759ac),LL(0x9c972517,0x0514d89c),
+ LL(0xa8e67fc3,0x1701147f),LL(0xab2085be,0x9e2e0b8b),LL(0xac284e57,0xd5651824),LL(0x74893664,0x890d4325), LL(0xc55e68a3,0x8a7c5e6e),LL(0x4339c85a,0xbf12e90b),LL(0xf922b655,0x31846b85),LL(0x0bf4d700,0x9a54ce4d),
+ LL(0xf1a14295,0xd7f4e83a),LL(0xb285d4f9,0x916f955c),LL(0x99ffdaba,0xe57bb0e0),LL(0xeab0d152,0x28a43034), LL(0xb8a9cef8,0x0a36ffa2),LL(0xb9ec051a,0x5517407e),LL(0xea68e672,0x9c796096),LL(0xfb3c77fb,0x853db5fb),
+ LL(0xe864a51a,0x21474ba9),LL(0x6e8a1b8b,0x6c267699),LL(0x94120a28,0x7c823626),LL(0x8383a5db,0xe61e9a48), LL(0x9f84216d,0x7dd75003),LL(0xad43cd85,0xab020d07),LL(0xda12c659,0x9437ae48),LL(0xe65452ad,0x6449c2eb),
+ LL(0x2cf9d7c1,0xcc7c4c1c),LL(0xee95e5ab,0x1320886a),LL(0xbeae170c,0xbb7b9056),LL(0xdbc0d662,0xc8a5b250), LL(0xc11d2303,0x4ed81432),LL(0x1f03769f,0x7da66912),LL(0x84539828,0x3ac7a5fd),LL(0x3bccdd02,0x14dada94),
+ LL(0x7ef6b0d1,0x8b84c321),LL(0x7c933f22,0x52a9477a),LL(0xfd440b82,0x5ef6728a),LL(0x6ce4bd5e,0x5c3bd859), LL(0xf22c2d3e,0x918b80f5),LL(0xb7bb6cc5,0x368d5040),LL(0x2695a11c,0xb66142a1),LL(0xeb19ea70,0x60ac583a),
+ LL(0x0eab2437,0x317cbb98),LL(0x5e2654c8,0x8cc08c55),LL(0xe6d8307f,0xfe2d6520),LL(0x57428993,0xe9f147f3), LL(0xd2fd6cf1,0x5f9c7d14),LL(0x2d4fcbb0,0xa3ecd064),LL(0x8e7341f7,0xad83fef0),LL(0x3a63115c,0x643f23a0),
+ LL(0xe65ab743,0xd38a78ab),LL(0x35edc89c,0xbf7c75b1),LL(0x530df568,0x3dd8752e),LL(0xe308c682,0xf85c4a76), LL(0xe68acf37,0x4c9955b2),LL(0xab32af85,0xa544df3d),LL(0xa25cf493,0x4b8ec3f5),LL(0x1a622feb,0x4d8f2764),
+ LL(0xf0dcbc49,0x7bb4f7aa),LL(0x70bbb45b,0x7de551f9),LL(0x9f2ca2e5,0xcfd0f3e4),LL(0x1f5c76ef,0xece58709), LL(0x167d79ae,0x32920edd),LL(0xfa7d7ec1,0x039df8a2),LL(0xbb30af91,0xf46206c0),LL(0x22676b59,0x1ff5e2f5),
+ LL(0x6ea51d66,0x11f4a039),LL(0x807d7a26,0x506c1445),LL(0x755a9b24,0x60da5705),LL(0x1f1a319e,0x8fc8cc32), LL(0x9433d67d,0x83642d4d),LL(0x6a7dd296,0x7fa5cb8f),LL(0x9b7bde07,0x576591db),LL(0x419716fb,0x13173d25),
+ LL(0xd5b340ff,0xea30599d),LL(0xb0fe76c5,0xfc6b5297),LL(0xab8f5adc,0x1c6968c8),LL(0x901c928d,0xf723c7f5), LL(0x9773d402,0x4203c321),LL(0x1b51dd47,0xdf7c6aa3),LL(0x552be23c,0x3d49e37a),LL(0x0b5a6e87,0x57febee8),
+ LL(0x7bd8e739,0xc5ecbee4),LL(0xae63bf75,0x79d44994),LL(0x38fb8923,0x168bd00f),LL(0xd0533130,0x75d48ee4), LL(0xdb5cdf33,0x554f77aa),LL(0x3c696769,0x3396e896),LL(0xd3fd674e,0x2fdddbf2),LL(0x99d0e3e5,0xbbb8f6ee),
+ LL(0xcbae2f70,0x51b90651),LL(0x93aaa8eb,0xefc4bc05),LL(0xdd1df499,0x8ecd8689),LL(0x22f367a5,0x1aee99a8), LL(0xae8274c5,0x95d485b9),LL(0x7d30b39c,0x6c14d445),LL(0xbcc1ef81,0xbafea90b),LL(0xa459a2ed,0x7c5f317a),
+ LL(0x4ef44227,0x01211075),LL(0xdc20f496,0xa17bed6e),LL(0x819853cd,0x0cdfe424),LL(0xf71e2ce7,0x13793298), LL(0xdbbe307b,0x3c1f3078),LL(0x76ee9936,0x6dd1c20e),LL(0x423caa20,0x23ee4b57),LL(0x8efb840e,0x4ac3793b),
+ LL(0xed1f8ca0,0x934438eb),LL(0x4ebb25a2,0x3e546658),LL(0xc069896f,0xc415af0e),LL(0x9a5aa43d,0xc13eddb0), LL(0xd49eb8f6,0x7a04204f),LL(0xd74f1670,0xd0d5bdfc),LL(0x56fc0558,0x3697e286),LL(0x01cebade,0x10207371),
+ LL(0x0647a82b,0x5f87e690),LL(0x8f40054f,0x908e0ed4),LL(0x79853803,0xa9f633d4),LL(0x4a28b252,0x8ed13c9a), LL(0x1f460f64,0x3e2ef676),LL(0x36d06336,0x53930b9b),LL(0x8fc4979b,0x347073ac),LL(0x5ecd5597,0x84380e0e),
+ LL(0xc4fe3c39,0xe3b22c6b),LL(0x6c7bebdf,0xba4a8153),LL(0x25693459,0xf23ab6b7),LL(0x14922b11,0x53bc3770), LL(0x5afc60db,0x4645c8ab),LL(0x20b9f2a3,0xaa022355),LL(0xce0fc507,0x52a2954c),LL(0x7ce1c2e7,0x8c2731bb),
+ LL(0x18a0339d,0xf39608ab),LL(0x3735436c,0xac7a658d),LL(0xcd992b4f,0xb22c2b07),LL(0xf40dcfd4,0x4e83daec), LL(0x2f39ea3e,0x8a34c7be),LL(0xb0a56d2e,0xef0c005f),LL(0x6edd8038,0x62731f6a),LL(0x4e3cb075,0x5721d740),
+ LL(0xfbeeee1b,0x1ea41511),LL(0xef1d0c05,0xd1ef5e73),LL(0x73c07d35,0x42feefd1),LL(0x8a329493,0xe530a00a), LL(0xf15ebfb0,0x5d55b7fe),LL(0xd322491a,0x549de03c),LL(0x745b3237,0xf7b5f602),LL(0x1ab6e2b6,0x3632a3a2),
+ LL(0x0ef59f78,0x0d3bba89),LL(0xc9e52b9a,0x0dfc6443),LL(0x72631447,0x1dc79699),LL(0xb3be20b1,0xef033917), LL(0xb1383948,0x0c92735d),LL(0xc0dd7d7d,0xc1fc29a2),LL(0x403ed068,0x6485b697),LL(0xaac93bdc,0x13bfaab3),
+ LL(0x0deeaf52,0x410dc6a9),LL(0x4c641c15,0xb003fb02),LL(0x5bc504c4,0x1384978c),LL(0x864a6a77,0x37640487), LL(0x222a77da,0x05991bc6),LL(0x5e47eb11,0x62260a57),LL(0xf21b432c,0xc7af6613),LL(0xab4953e9,0x22f3acc9),
+ LL(0x8e41d155,0x52934922),LL(0x3ac059ef,0x4d024568),LL(0x4d884411,0xb0201755),LL(0xa59a178f,0xce8055cf), LL(0xf6204549,0xcd77d1af),LL(0xc7066759,0xa0a00a3e),LL(0x0272c229,0x471071ef),LL(0xd3c4b6b0,0x009bcf6b),
+ LL(0x22305177,0x2a2638a8),LL(0x41645bbf,0xd51d59df),LL(0xc0a7a3c0,0xa81142fd),LL(0x4c7063ee,0xa17eca6d), LL(0x60d9dcec,0x0bb887ed),LL(0x20ad2455,0xd6d28e51),LL(0xa67102ba,0xebed6308),LL(0x8bffa408,0x042c3114),
+ LL(0x8aa68e30,0xfd099ac5),LL(0x1483513e,0x7a6a3d7c),LL(0xba2d8f0c,0xffcc6b75),LL(0x1e78b954,0x54dacf96), LL(0xa4a9af89,0xf645696f),LL(0x06ac98ec,0x3a411940),LL(0x22a67a20,0x41b8b3f6),LL(0x99dec626,0x2d0b1e0f),
+ LL(0x40be34e8,0x27c89192),LL(0x91907f35,0xc7162b37),LL(0xa956702b,0x90188ec1),LL(0xdf93769c,0xca132f7d), LL(0x0e2025b4,0x3ece44f9),LL(0x0c62f14c,0x67aaec69),LL(0x22e3cc11,0xad741418),LL(0x7ff9a50e,0xcf9b75c3),
+ LL(0x4d348272,0x02fa2b16),LL(0x9959d56d,0xbd99d61a),LL(0x18762916,0xbc4f19db),LL(0x49c1ac80,0xcc7cce50), LL(0xd846bd83,0x4d59ebaa),LL(0xa9202849,0x8775a9dc),LL(0x6e1f4ca9,0x07ec4ae1),LL(0xba893f11,0x27eb5875),
+ LL(0x662cc565,0x00284d51),LL(0x0db4138d,0x82353a6b),LL(0xaa32a594,0xd9c7aaaa),LL(0xa5669c47,0xf5528b5e), LL(0x2f23c5ff,0xf3220231),LL(0x6affa3a1,0xe3e8147a),LL(0x202ddda0,0xfb423d5c),LL(0x6b871bd4,0x3d6414ac),
+ LL(0xa51a168a,0x586f82e1),LL(0x48ae5448,0xb712c671),LL(0x76233eb8,0x9a2e4bd1),LL(0x78811ca9,0x0188223a), LL(0xf7c18de1,0x553c5e21),LL(0xb27bb286,0x7682e451),LL(0x0e51e929,0x3ed036b3),LL(0xec9cb34f,0xf487211b),
+ LL(0x0c24efc8,0x0d094277),LL(0xbef737a4,0x0349fd04),LL(0x514cdd28,0x6d1c9dd2),LL(0x30da9521,0x29c135ff), LL(0xf78b0b6f,0xea6e4508),LL(0x678c143c,0x176f5dd2),LL(0x4be21e65,0x08148418),LL(0xe7df38c4,0x27f7525c),
+ LL(0x748ab1a4,0x1fb70e09),LL(0x5efe4433,0x9cba50a0),LL(0x15f75af2,0x7846c7a6),LL(0x5ee73ea8,0x2a7c2c57), LL(0x3f0a449a,0x42e566a4),LL(0xad90fc3d,0x45474c3b),LL(0x8b61d057,0x7447be3d),LL(0x3a4ec092,0x3e9d1cf1),
+ LL(0xf380a6e6,0x1603e453),LL(0x9b1437c2,0x0b86e431),LL(0xef29610a,0x7a4173f2),LL(0xf03d57f7,0x8fa729a7), LL(0x6c9c217e,0x3e186f6e),LL(0x91919524,0xbe1d3079),LL(0x153d4fb1,0x92a62a70),LL(0xd68c2f71,0x32ed3e34),
+ LL(0x9eb1a8b7,0xd785027f),LL(0xc5b22fe8,0xbc37eb77),LL(0xb9d6a191,0x466b34f0),LL(0x9a05f816,0x008a89af), LL(0x7d42c10a,0x19b028fb),LL(0x49b3f6b8,0x7fe8c92f),LL(0xa5a0ade3,0x58907cc0),LL(0x559d1a7c,0xb3154f51),
+ LL(0xd9790ed6,0x5066efb6),LL(0xa6aa793b,0xa77a0cbc),LL(0x223e042e,0x1a915f3c),LL(0x69c5874b,0x1c5def04), LL(0x73b6c1da,0x0e830078),LL(0xfcd8557a,0x55cf85d2),LL(0x0460f3b1,0x0f7c7c76),LL(0x46e58063,0x87052acb),
+ LL(0x907eae66,0x09212b80),LL(0x4d721c89,0x3cb068e0),LL(0xdd45ac1c,0xa87941ae),LL(0x0daa0dbb,0xde8d5c0d), LL(0xe3502e6e,0xda421fdc),LL(0x4d89a084,0xc8944201),LL(0xf0c24bfb,0x7307ba5e),LL(0x20bde0ef,0xda212beb),
+ LL(0xf82ce682,0xea2da24b),LL(0x07f71fe4,0x058d3816),LL(0x5ffad8de,0x35a02462),LL(0xaadcefab,0xcd7b05dc), LL(0x1d9f54ec,0xd442f8ed),LL(0xb2d3b5ca,0x8be3d618),LL(0xe06b2ce2,0xe2220ed0),LL(0x1b0da4c0,0x82699a5f),
+ LL(0x71c0c3a7,0x3ff106f5),LL(0x0d34180c,0x8f580f5a),LL(0x22d7d375,0x4ebb120e),LL(0xe9513675,0x5e5782cc), LL(0x99c82a70,0x2275580c),LL(0x15ea8c4c,0xe8359fbf),LL(0x7b415e70,0x53b48db8),LL(0x100c6014,0xaacf2240),
+ LL(0xe4652f1d,0x9faaccf5),LL(0xd56157b2,0xbd6fdd2a),LL(0x6261ec50,0xa4f4fb1f),LL(0x476bcd52,0x244e55ad), LL(0x047d320b,0x881c9305),LL(0x6181263f,0x1ca983d5),LL(0x278fb8ee,0x354e9a44),LL(0x396e4964,0xad2dbc0f),
+ LL(0x9268b3de,0x723f3aa2),LL(0xe6e0609a,0x0d1ca29a),LL(0x6cf44252,0x794866aa),LL(0x01af87ed,0x0b59f3e3), LL(0x7f4a6c51,0xe234e5ff),LL(0x61dc2f7e,0xa8768fd2),LL(0x0a94d81f,0xdafc7332),LL(0x06938ce1,0xd7f84282),
+ LL(0x0546063e,0xae0b3c0e),LL(0x5d61abc6,0x7fbadcb2),LL(0x369ac400,0xd5d7a2c9),LL(0xae67d10c,0xa5978d09), LL(0x4f85eaac,0x290f211e),LL(0xfacac681,0xe61e2ad1),LL(0x388384cd,0xae125225),LL(0xccfde30f,0xa7fb68e9),
+ LL(0x3daed4c2,0x7a59b936),LL(0x2606f789,0x80a9aa40),LL(0xf6a6d90a,0xb40c1ea5),LL(0x514d5885,0x948364d3), LL(0x70985182,0x062ebc60),LL(0x33310895,0xa6db5b0e),LL(0xe329c2f5,0x64a12175),LL(0x90ea237e,0xc5f25bd2),
+ LL(0x2d0a4c23,0x7915c524),LL(0x6bb3cc52,0xeb5d26e4),LL(0xc09e2c92,0x369a9116),LL(0xcf182cf8,0x0c527f92), LL(0x2aede0ac,0x9e591938),LL(0x6cc34939,0xb2922208),LL(0x99a34361,0x3c9d8962),LL(0xc1905fe6,0x3c81836d),
+ LL(0xa001ec5a,0x4bfeb57f),LL(0xa0dc5dba,0xe993f5bb),LL(0x724a1380,0x47884109),LL(0x32fe9a04,0x8a0369ab), LL(0x8c927db8,0xea068d60),LL(0x94655741,0xbf5f37cf),LL(0x04b6c7ea,0x47d402a2),LL(0x6af259cb,0x4551c295),
+ LL(0xed77ee8b,0x698b71e7),LL(0xf309d5c7,0xbddf7bd0),LL(0x34e780ca,0x6201c22c),LL(0x4c295ef4,0xab04f7d8), LL(0x4313a8ce,0x1c947294),LL(0x92ca4cfe,0xe532e4ac),LL(0xd0a7a97a,0x89738f80),LL(0xa580fd5b,0xec088c88),
+ LL(0x42ce9e51,0x612b1ecc),LL(0xb25fdd2a,0x8f9840fd),LL(0x01e7f839,0x3cda78c0),LL(0xece05480,0x546b3d3a), LL(0x80d30916,0x271719a9),LL(0x584c20c4,0x45497107),LL(0x5bc78608,0xaf8f9478),LL(0x277e2a4c,0x28c7d484),
+ LL(0x88a2ffe4,0xfce01767),LL(0x28e169a5,0xdc506a35),LL(0x7af9c93a,0x0ea10861),LL(0x03fa0e08,0x1ed24361), LL(0xa3d694e7,0x96eaaa92),LL(0xef50bc74,0xc0f43b4d),LL(0x64114db4,0xce6aa58c),LL(0x7c000fd4,0x8218e8ea),
+ LL(0x185f8844,0xac815dfb),LL(0x1557abfb,0xcd7e90cb),LL(0xafbfecdf,0x23d16655),LL(0x085cac4a,0x80f3271f), LL(0xd0e62f47,0x7fc39aa7),LL(0x460a48e5,0x88d519d1),LL(0xd28f101e,0x59559ac4),LL(0xca9ae816,0x7981d9e9),
+ LL(0x9ac38203,0x5c38652c),LL(0x57657fe5,0x86eaf87f),LL(0xe21f5416,0x568fc472),LL(0xe7e597b5,0x2afff39c), LL(0x256d4eab,0x3adbbb07),LL(0x8285ab89,0x22598692),LL(0x041caefe,0x35f8112a),LL(0xa5064c8b,0x95df02e3),
+ LL(0xc7004bf3,0x4d63356e),LL(0xdb83c7de,0x230a08f4),LL(0x8709a7b7,0xca27b270),LL(0xcb9abd2d,0x0d1c4cc4), LL(0x7550fee8,0x8a0bc66e),LL(0x9cf7247e,0x369cd4c7),LL(0x92b5b7e7,0x75562e84),LL(0x5802af7b,0x8fed0da0),
+ LL(0xe48fb889,0x6a7091c2),LL(0x7b8a9d06,0x26882c13),LL(0x1b82a0e2,0xa2498663),LL(0x3518152d,0x844ed736), LL(0xd86e27c7,0x282f476f),LL(0x04afefdc,0xa04edaca),LL(0x6119e34d,0x8b256ebc),LL(0x0787d78b,0x56a413e9),
+},
+/* digit=19 base_pwr=2^133 */
+{
+ LL(0x5a74be50,0x82ee061d),LL(0xdea16ff5,0xe41781c4),LL(0x99bfc8a2,0xe0b0c81e),LL(0x0b547e2d,0x624f4d69), LL(0xbdcc9ae4,0x3a83545d),LL(0x409b1e8e,0x2573dbb6),LL(0xa6c93539,0x482960c4),LL(0x5ae18798,0xf01059ad),
+ LL(0x3112795f,0x715c9f97),LL(0x984e6ee1,0xe8244437),LL(0xecb66bcd,0x55cb4858),LL(0xabaffbee,0x7c136735), LL(0x5dbec38e,0x54661595),LL(0x388ad153,0x51c0782c),LL(0xc6e0952f,0x9ba4c53a),LL(0x1b21dfa8,0x27e6782a),
+ LL(0x4ed2dbc2,0x682f903d),LL(0x7c3b2d83,0x0eba59c8),LL(0x9c7e9335,0x8e9dc84d),LL(0x0eb226d7,0x5f9b21b0), LL(0xaf267bae,0xe33bd394),LL(0xbe2e15ae,0xaa86cc25),LL(0x6a8ec500,0x4f0bf67d),LL(0xf9630658,0x5846aa44),
+ LL(0xe2c2bf15,0xfeb09740),LL(0xa9e99704,0x627a2205),LL(0xc2fbc565,0xec8d73d0),LL(0xc20c8de8,0x223eed8f), LL(0xa8363b49,0x1ee32583),LL(0xc9c2b0a6,0x1a0b6cb9),LL(0x90dbc85c,0x49f7c3d2),LL(0x1ef4c1ac,0xa8dfbb97),
+ LL(0x65c7c2ab,0xafb34d4c),LL(0xe2c5ea84,0x1d4610e7),LL(0x973c4ab5,0x893f6d1b),LL(0x945ba5c4,0xa3cdd7e9), LL(0x064417ee,0x60514983),LL(0xad6bdf2b,0x1459b23c),LL(0x5cf726c3,0x23b2c341),LL(0x32d6354a,0x3a829635),
+ LL(0xab192c18,0x294f901f),LL(0x7030164f,0xec5fcbfe),LL(0xe2246ba6,0xe2e2fcb7),LL(0x221a1a0c,0x1e7c88b3), LL(0xc92d88c5,0x72c7dd93),LL(0x1106fb59,0x41c2148e),LL(0xa0f60f14,0x547dd4f5),LL(0x63960f31,0xed9b52b2),
+ LL(0xb0a5b358,0x6c8349eb),LL(0x9e7e2ed6,0xb154c5c2),LL(0xeda462db,0xcad5eccf),LL(0x2de66b69,0xf2d6dbe4), LL(0x8665e5b2,0x426aedf3),LL(0x7b7f5723,0x488a8513),LL(0x8bcbb386,0x15cc43b3),LL(0xd791d879,0x27ad0af3),
+ LL(0x846e364f,0xc16c236e),LL(0xdea50ca0,0x7f33527c),LL(0x0926b86d,0xc4810775),LL(0x0598e70c,0x6c2a3609), LL(0xf024e924,0xa6755e52),LL(0x9db4afca,0xe0fa07a4),LL(0x66831790,0x15c3ce7d),LL(0xa6cbb0d6,0x5b4ef350),
+ LL(0xb6205969,0x2c4aafc4),LL(0xf6c7854f,0x42563f02),LL(0x1d983b48,0x016aced5),LL(0x99949755,0xfeb356d8), LL(0xd1a39bd7,0x8c2a2c81),LL(0xe6934ae9,0x8f44340f),LL(0x447904da,0x148cf91c),LL(0x0f51a926,0x7340185f),
+ LL(0x7409ab46,0x2f8f00fb),LL(0x80e289b2,0x057e78e6),LL(0xa888e5d1,0x03e5022c),LL(0x9dede4e2,0x3c87111a), LL(0x7809460b,0x5b9b0e1c),LL(0x71c9abc7,0xe751c852),LL(0xc7cc1dc9,0x8b944e28),LL(0x1d3cfa08,0x4f201ffa),
+ LL(0x3e6721ce,0x02fc905c),LL(0xd0b3674c,0xd52d70da),LL(0x18810da4,0x5dc2e5ca),LL(0x5c69dd99,0xa984b273), LL(0x84de5ca4,0x63b92527),LL(0xc852dec4,0x2f1c9872),LL(0xc2e3de09,0x18b03593),LL(0x9813dc2f,0x19d70b01),
+ LL(0xa6dc1d29,0x42806b2d),LL(0xf871e144,0xd3030009),LL(0xaaf49276,0xa1feb333),LL(0xc70bc04b,0xb5583b9e), LL(0x95695f20,0x1db0be78),LL(0x89d012b5,0xfc841811),LL(0x05f61643,0x6409f272),LL(0xd5883128,0x40d34174),
+ LL(0x67419833,0xd79196f5),LL(0x863b7b08,0x6059e252),LL(0x1c56700c,0x84da1817),LL(0xb28d3ec4,0x5758ee56), LL(0x013b0ea6,0x7da2771d),LL(0x54c5e9b9,0xfddf524b),LL(0x24305d80,0x7df4faf8),LL(0x3a97763f,0x58f5c1bf),
+ LL(0x7c696042,0xa5af37f1),LL(0x4a2538de,0xd4cba22c),LL(0x9ea42600,0x211cb995),LL(0x7b069889,0xcd105f41), LL(0xddb81e74,0xb1e1cf19),LL(0x5157b8ca,0x472f2d89),LL(0xee9db885,0x086fb008),LL(0x0f26d131,0x365cd570),
+ LL(0xa2be7053,0x284b02bb),LL(0x7ab9a6d6,0xdcbbf7c6),LL(0x20f7a530,0x4425559c),LL(0x188767c8,0x961f2dfa), LL(0x70dc80c4,0xe2fd9435),LL(0xf0784120,0x104d6b63),LL(0x53567122,0x7f592bc1),LL(0xf688ad77,0xf6bc1246),
+ LL(0x0f15dde9,0x05214c05),LL(0x0d5f2b82,0xa47a76a8),LL(0x62e82b62,0xbb254d30),LL(0x3ec955ee,0x11a05fe0), LL(0x9d529b36,0x7eaff46e),LL(0x8f9e3df6,0x55ab1301),LL(0x99317698,0xc463e371),LL(0xccda47ad,0xfd251438),
+ LL(0x23d695ea,0xca9c3547),LL(0x16e589b5,0x48ce626e),LL(0xb187d086,0x6b5b64c7),LL(0xb2207948,0xd02e1794), LL(0x7198111d,0x8b58e98f),LL(0xdcf9c3cc,0x90ca6305),LL(0xf34089b0,0x5691fe72),LL(0xfc7c80ff,0x60941af1),
+ LL(0x22eb51e5,0xa09bc0a2),LL(0xaa9cf09a,0xc0bb7244),LL(0x80159f06,0x36a8077f),LL(0xdddc560e,0x8b5c989e), LL(0x512e1f43,0x19d2f316),LL(0xad08ff62,0x02eac554),LL(0x07d20b4e,0x012ab84c),LL(0xd6d4e4e1,0x37d1e115),
+ LL(0xab7b19a8,0xb6443e1a),LL(0xdef8cd45,0xf08d067e),LL(0x685e03da,0x63adf3e9),LL(0x4792b916,0xcf15a10e), LL(0xb738a425,0xf44bcce5),LL(0x9636b2fd,0xebe131d5),LL(0x7850d605,0x94068841),LL(0xb40d749d,0x09684eaa),
+ LL(0x72ba075b,0x8c3c669c),LL(0xba469015,0x89f78b55),LL(0x3e9f8ba8,0x5706aade),LL(0xb32d7ed7,0x6d8bd565), LL(0x805f08d6,0x25f4e63b),LL(0xc3bcc1b5,0x7f48200d),LL(0xb025d847,0x4e801968),LL(0x87cbe0a8,0x74afac04),
+ LL(0x7e63d690,0x43ed2c2b),LL(0x0223cdb8,0xefb6bbf0),LL(0x2884d3fe,0x4fec3cae),LL(0xd75e25a4,0x065ecce6), LL(0x69f79071,0x6c2294ce),LL(0x044b8666,0x0d9a8e5f),LL(0x17b69d8f,0x5009f238),LL(0xc5dfdaf7,0x3c29f8fe),
+ LL(0xebae68c4,0x9067528f),LL(0x30c5ba21,0x5b385632),LL(0x1fdd1aec,0x540df119),LL(0xcfba4c78,0xcf37825b), LL(0xbeb11454,0x77eff980),LL(0x60c1b066,0x40a1a991),LL(0xf889a1c7,0xe8018980),LL(0x76c24be0,0xb9c52ae9),
+ LL(0x45650ef4,0x05fbbcce),LL(0x8aa29ac7,0xae000f10),LL(0x4f04c470,0x884b7172),LL(0x19bb5c25,0x7cd4fde2), LL(0xe8840869,0x6477b22a),LL(0x5fbd0686,0xa8868859),LL(0x1116dfba,0xf23cc02e),LL(0xd87d7776,0x76cd563f),
+ LL(0xa9d82abf,0xe2a37598),LL(0xe6c170f5,0x5f188ccb),LL(0x5066b087,0x81682200),LL(0xc7155ada,0xda22c212), LL(0xfbddb479,0x151e5d3a),LL(0x6d715b99,0x4b606b84),LL(0xf997cb2e,0x4a73b54b),LL(0x3ecd8b66,0x9a1bfe43),
+ LL(0x2a67d48a,0x1c312809),LL(0x031fa9e2,0xcd6a671e),LL(0x0e43a34a,0xbec3312a),LL(0x55ef47d3,0x1d935639), LL(0x8fea73ea,0x5ea02489),LL(0xa035afb2,0x8247b364),LL(0x5265b54c,0xb58300a6),LL(0x722c7148,0x3286662f),
+ LL(0xb4ec4c20,0xb77fd76b),LL(0x0f3fe3fd,0xf0a12fa7),LL(0x41d8c7e8,0xf845bbf5),LL(0x5ec10aa8,0xe4d969ca), LL(0x43e232a3,0x4c0053b7),LL(0x37f8a45a,0xdc7a3fac),LL(0x20d81c8f,0x3c4261c5),LL(0xb00eab00,0xfd4b3453),
+ LL(0xd36e3062,0x76d48f86),LL(0xa143ff02,0x626c5277),LL(0xaf76f42e,0x538174de),LL(0x6407ceac,0x2267aa86), LL(0x72e572d5,0xfad76351),LL(0xba7330eb,0xab861af7),LL(0x418d8657,0xa0a1c8c7),LL(0x20289a52,0x988821cb),
+ LL(0xcccc18ad,0x79732522),LL(0xf1a6e027,0xaadf3f8d),LL(0x17c2354d,0xf7382c93),LL(0xd818b689,0x5ce1680c), LL(0xd9ecbee9,0x359ebbfc),LL(0x1cae62ac,0x4330689c),LL(0xc51ac38a,0xb55ce5b4),LL(0xfe238ee8,0x7921dfea),
+ LL(0x271d1ca5,0x3972bef8),LL(0xe8aabd18,0x3e423bc7),LL(0x44a3e5e3,0x57b09f3f),LL(0x7b444d66,0x5da886ae), LL(0xa9964375,0x68206634),LL(0x699cd0ff,0x356a2fa3),LL(0xdba515e9,0xaf0faa24),LL(0xb321d79a,0x536e1f5c),
+ LL(0x5c04e4ea,0xd3b9913a),LL(0xd6f11513,0xd549dcfe),LL(0x79fd1d94,0xee227bf5),LL(0xb43f2c67,0x9f35afee), LL(0xf1314f53,0xd2638d24),LL(0xcabcd822,0x62baf948),LL(0x4ef48db0,0x5542de29),LL(0xfc5f6bb2,0xb3eb6a04),
+ LL(0x1208e16a,0x23c110ae),LL(0xf8363e24,0x1a4d15b5),LL(0x164be00b,0x30716844),LL(0xf6f4690d,0xa8e24824), LL(0x90b170cf,0x548773a2),LL(0x42f191f4,0xa1bef331),LL(0x9247aa97,0x70f418d0),LL(0x48be9147,0xea06028e),
+ LL(0xdbfb894e,0xe13122f3),LL(0xce274b18,0xbe9b79f6),LL(0xca58aadf,0x85a49de5),LL(0x11487351,0x24957758), LL(0xbb939099,0x111def61),LL(0x26d13694,0x1d6a974a),LL(0xd3fc253b,0x4474b4ce),LL(0x4c5db15e,0x3a1485e6),
+ LL(0x147c15b4,0xe79667b4),LL(0x7bc61301,0xe34f553b),LL(0x17094381,0x032b80f8),LL(0x723eaa21,0x55d8bafd), LL(0xf1c0e74e,0x5a987995),LL(0xebba289c,0x5a9b292e),LL(0xeb4c8251,0x413cd4b2),LL(0xd162db0a,0x98b5d243),
+ LL(0x68342520,0xbb47bf66),LL(0xbaa862d1,0x08d68949),LL(0xe906abcd,0x11f349c7),LL(0xed7bf00e,0x454ce985), LL(0xb55b803b,0xacab5c9e),LL(0x31e3c16d,0xb03468ea),LL(0xd273bf12,0x5c24213d),LL(0x71587887,0x211538eb),
+ LL(0x731dea2d,0x198e4a2f),LL(0x74ed7b2a,0xd5856cf2),LL(0x13a664fe,0x86a632eb),LL(0xbda41291,0x932cd909), LL(0xc0c4ddc0,0x850e95d4),LL(0x347fc2c9,0xc0f422f8),LL(0x86076bcb,0xe68cbec4),LL(0xcd6cd286,0xf9e7c0c0),
+ LL(0x0f5f27ca,0x65994ddb),LL(0xa80d59ff,0xe85461fb),LL(0x66601023,0xff05481a),LL(0xfc9ebbfb,0xc665427a), LL(0x7587fd52,0xb0571a69),LL(0x8d49efce,0x935289f8),LL(0xea420688,0x61becc60),LL(0x13a786af,0xb22639d9),
+ LL(0x361ecf90,0x1a8e6220),LL(0x25506463,0x001f23e0),LL(0x0a5c2b79,0xe4ae9b5d),LL(0xd8149db5,0xebc9cdad), LL(0x934aa728,0xb33164a1),LL(0xae9b60f3,0x750eb00e),LL(0x9b9cfbfd,0x5a91615b),LL(0xef45f7f6,0x97015cbf),
+ LL(0xbf5151df,0xb462c4a5),LL(0xb07118f2,0x21adcc41),LL(0x043fa42c,0xd60c545b),LL(0xe96be1ab,0xfc21aa54), LL(0x4e51ea80,0xe84bc32f),LL(0x259b5d8d,0x3dae45f0),LL(0xc38f1b5e,0xbb73c7eb),LL(0xe8ae617d,0xe405a74a),
+ LL(0x9f1c56bd,0xbb1ae9c6),LL(0x49f196a4,0x8c176b98),LL(0x6875092b,0xc448f311),LL(0x9f976033,0xb5afe3de), LL(0x145813e5,0xa8dafd49),LL(0xe2b34226,0x687fc4d9),LL(0x4c7ff57f,0xf2dfc92d),LL(0x401f1b46,0x004e3fc1),
+ LL(0x1430c9ab,0x5afddab6),LL(0x2238e997,0x0bdd41d3),LL(0x418042ae,0xf0947430),LL(0xcdddc4cb,0x71f9adda), LL(0xc52dd907,0x7090c016),LL(0x29e2047f,0xd9bdf44d),LL(0x1b1011a6,0xe6f1fe80),LL(0xd9acdc78,0xb63accbc),
+ LL(0x1272a95b,0xcfc7e235),LL(0xa6276ac8,0x0c667717),LL(0xe2d7eef7,0x3c0d3709),LL(0x9a685b3e,0x5add2b06), LL(0x14ea5d65,0x363ad32d),LL(0x8d7dd506,0xf8e01f06),LL(0x75b4aac6,0xc9ea2213),LL(0x0d353466,0xed2a2bf9),
+ LL(0xe9d3a7c3,0x439d79b5),LL(0x81b7f34b,0x8e0ee5a6),LL(0x1dc4ba75,0xcf3dacf5),LL(0xeb3310c7,0x1d3d1773), LL(0x7747ae83,0xa8e67112),LL(0x197d6b40,0x31f43160),LL(0xcd961400,0x0521ccee),LL(0xf6535768,0x67246f11),
+ LL(0xef0c3133,0x702fcc5a),LL(0x7e16693b,0x247cc45d),LL(0xc729b749,0xfd484e49),LL(0xb218320f,0x522cef7d), LL(0x59ab93b3,0xe56ef405),LL(0x9f181071,0x225fba11),LL(0x15330ed0,0x33bd6595),LL(0x1ddb32f7,0xc4be69d5),
+ LL(0x0448087c,0x264c7668),LL(0x71432dae,0xac30903f),LL(0x00f9bf47,0x3851b266),LL(0x6cdd6d03,0x400ed311), LL(0xf8fd2424,0x045e79fe),LL(0xfa6da98b,0xfdfd974a),LL(0x0c1e673a,0x45c9f641),LL(0x5b2c5168,0x76f2e733),
+ LL(0x2a601753,0x1adaebb5),LL(0xc57c2d49,0xb286514c),LL(0x1e0bfd24,0xd8769670),LL(0x04478922,0x950c547e), LL(0xe5d32bfe,0xd1d41969),LL(0x750d6c3e,0x30bc1472),LL(0xe0e27f3a,0x8f3679fe),LL(0xa4a6ee0c,0x8f64a7dc),
+ LL(0x633dfb1f,0x2fe59937),LL(0x977f2547,0xea82c395),LL(0x661ea646,0xcbdfdf1a),LL(0xb9085451,0xc7ccc591), LL(0x81761e13,0x82177962),LL(0x9196885c,0xda57596f),LL(0x28ffbd70,0xbc17e849),LL(0x2671d36f,0x1e6e0a41),
+ LL(0x4152fcf5,0x61ae872c),LL(0x9e77e754,0x441c87b0),LL(0xa34dff09,0xd0799dd5),LL(0x88a6b171,0x766b4e44), LL(0x11f1c792,0xdc06a512),LL(0x4be35c3e,0xea02ae93),LL(0xe90c469e,0xe5ca4d6d),LL(0x56e4ff5c,0x4df4368e),
+ LL(0x4baef62e,0x7817acab),LL(0xa85b91e8,0x9f5a2202),LL(0x6ce57610,0x9666ebe6),LL(0xf73bfe03,0x32ad31f3), LL(0x25bcf4d6,0x628330a4),LL(0x515056e6,0xea950593),LL(0xe1332156,0x59811c89),LL(0x8c11b2d7,0xc89cf1fe),
+ LL(0x04e60cc0,0x75b63913),LL(0x4625d375,0xce811e8d),LL(0x2d26e562,0x030e43fc),LL(0x608d36a0,0xfbb30b4b), LL(0x48528118,0x634ff82c),LL(0xcd285911,0x7c6fe085),LL(0x99358f28,0x7f2830c0),LL(0x665e6c09,0x2e60a95e),
+ LL(0x9b785dbf,0x08407d3d),LL(0xa759bce7,0x530889ab),LL(0x52f61239,0xf228e0e6),LL(0x6879be3c,0x2b6d1461), LL(0x51a7bbf7,0xe6902c04),LL(0x76f24a64,0x30ad99f0),LL(0x98bc6da0,0x66d9317a),LL(0xcb596ac0,0xf4f877f3),
+ LL(0x4c44f119,0xb05ff62d),LL(0xe9b77416,0x4555f536),LL(0x8caed63b,0xc7c0d059),LL(0xc358b2a9,0x0cd2b7ce), LL(0x46945fa3,0x3f33287b),LL(0xd67c8791,0xf8785b20),LL(0x9637bd08,0xc54a7a61),LL(0x18be79d7,0x54d4598c),
+ LL(0xc46d7ce1,0x889e5acb),LL(0x8b085877,0x9a515bb7),LL(0x0b7a5050,0xfac1a03d),LL(0xf2926035,0x7d3e738a), LL(0x2a6cb0eb,0x861cc2ce),LL(0x8f7adc79,0x6f2e2955),LL(0x33016376,0x61c4d451),LL(0x5ad59090,0xd9fd2c80),
+ LL(0xb2b836a1,0xe5a83738),LL(0x7c0d6622,0x855b41a0),LL(0x7cc19af1,0x186fe317),LL(0xfdd99acb,0x6465c1ff), LL(0x6974b99e,0x46e5c23f),LL(0xa2717cbe,0x75a7cf8b),LL(0x062be658,0x4d2ebc3f),LL(0x5f209c98,0x094b4447),
+ LL(0xb940cb5a,0x4af285ed),LL(0x7cc82f10,0x6706d792),LL(0x030526fa,0xc8c8776c),LL(0xa0da9140,0xfa8e6f76), LL(0x591ee4f0,0x77ea9d34),LL(0x40274166,0x5f46e337),LL(0xea671457,0x1bdf98bb),LL(0x862a1fe2,0xd7c08b46),
+ LL(0x1c08ad63,0x46cc303c),LL(0x4c845e7b,0x99543440),LL(0x48f36bf7,0x1b8fbdb5),LL(0x8c8273a7,0x5b82c392), LL(0x928435d5,0x08f712c4),LL(0x79330380,0x071cf0f1),LL(0xa8da054a,0xc74c2d24),LL(0x43c46b5c,0xcb0e7201),
+ LL(0xc0b7eff3,0x0ad7337a),LL(0xc5e48b3c,0x8552225e),LL(0x73f13a5f,0xe6f78b0c),LL(0x82349cbe,0x5e70062e), LL(0xe7073969,0x6b8d5048),LL(0xc33cb3d2,0x392d2a29),LL(0x4ecaa20f,0xee4f727c),LL(0x2ccde707,0xa068c99e),
+ LL(0xb87a2913,0xfcd5651f),LL(0x3cc252f0,0xea3e3c15),LL(0x3b6cd3e4,0x777d92df),LL(0xc5a732e7,0x7a414143), LL(0xa71ff493,0xa895951a),LL(0xbbd37cf6,0xfe980c92),LL(0xdecfeeff,0x45bd5e64),LL(0xa44c43e9,0x910dc2a9),
+ LL(0xcca9f54d,0xcb403f26),LL(0x9303f6db,0x928bbdfb),LL(0xa9eee67c,0x3c37951e),LL(0xf79961c3,0x3bd61a52), LL(0x395c9a79,0x09a238e6),LL(0x61eb352d,0x6940ca2d),LL(0xc1875631,0x7d1e5c5e),LL(0x1e1b20d1,0x1e19742c),
+ LL(0x23fc2e6e,0x4633d908),LL(0x08959149,0xa76e29a9),LL(0x84ed7da5,0x61069d9c),LL(0x5dbcad51,0x0baa11cf), LL(0x961849da,0xd01eec64),LL(0xaf3d8c28,0x93b75f1f),LL(0x1ca2ee44,0x57bc4f9f),LL(0x00e00558,0x5a26322d),
+ LL(0x61a023ef,0x1888d658),LL(0xb9e5246e,0x1d72aab4),LL(0xe5563ec0,0xa9a26348),LL(0xc3439a43,0xa0971963), LL(0xadb9b5b7,0x567dd54b),LL(0xc45a524b,0x73fac1a1),LL(0xfe38e608,0x8fe97ef7),LL(0x3f384f48,0x608748d2),
+ LL(0xc486094f,0xb0571794),LL(0x8bf3a8d6,0x869254a3),LL(0x310b0e25,0x148a8dd1),LL(0x9aa3f7d8,0x99ab9f3f), LL(0x6706c02e,0x0927c68a),LL(0x69790e6c,0x22b5e76c),LL(0x6c71376c,0x6c325260),LL(0x09ef6657,0x53a57690),
+ LL(0xedffcf3a,0x8d63f852),LL(0x3c0a6f55,0xb4d2ed04),LL(0x12519b9e,0xdb3aa8de),LL(0x1e0a569a,0x5d38e9c4), LL(0x303747e2,0x871528bf),LL(0xf5b5c18d,0xa208e77c),LL(0xca6bf923,0x9d129c88),LL(0xbf02839f,0xbcbf197f),
+ LL(0x27323194,0x9b9bf030),LL(0x339ca59d,0x3b055a8b),LL(0x0f669520,0xb46b2312),LL(0x497e5f24,0x19789f1f), LL(0xaaf01801,0x9c499468),LL(0x8b69d59c,0x72ee1190),LL(0xacf4c079,0x8bd39595),LL(0x8e0cd048,0x3ee11ece),
+ LL(0x1ed66f18,0xebde86ec),LL(0xd61fce43,0x225d906b),LL(0xe8bed74d,0x5cab07d6),LL(0x27855ab7,0x16e4617f), LL(0xb2fbc3dd,0x6568aadd),LL(0x8aeddf5b,0xedb5484f),LL(0x6dcf2fad,0x878f20e8),LL(0x615f5699,0x3516497c),
+},
+/* digit=20 base_pwr=2^140 */
+{
+ LL(0xfa181e69,0xef0a3fec),LL(0x30d69a98,0x9ea02f81),LL(0x66eab95d,0xb2e9cf8e),LL(0x24720021,0x520f2beb), LL(0x1df84361,0x621c540a),LL(0x71fa6d5d,0x12037721),LL(0x0ff5f6ff,0x6e3c7b51),LL(0xabb2bef3,0x817a069b),
+ LL(0xb294cda6,0x83572fb6),LL(0xb9039f34,0x6ce9bf75),LL(0x095cbb21,0x20e012f0),LL(0xd063f0da,0xa0aecc1b), LL(0xf02909e5,0x57c21c3a),LL(0x48ce9cdc,0xc7d59ecf),LL(0x8ae336f8,0x2732b844),LL(0x3f4f85f4,0x056e3723),
+ LL(0x89e800ca,0x8a10b531),LL(0x145208fd,0x50fe0c17),LL(0xb714ba37,0x9e43c0d3),LL(0x34189acc,0x427d200e), LL(0xe616e2c0,0x05dee24f),LL(0xee1854c1,0x9c25f4c8),LL(0x8f342a73,0x4d3222a5),LL(0xa027c952,0x0807804f),
+ LL(0x4f0d56f3,0xc222653a),LL(0xca28b805,0x961e4047),LL(0x4a73434b,0x2c03f8b0),LL(0xab712a19,0x4c966787), LL(0x864fee42,0xcc196c42),LL(0x5b0ece5c,0xc1be93da),LL(0xc131c159,0xa87d9f22),LL(0xdce45655,0x2bb6d593),
+ LL(0xb809b7ce,0x22c49ec9),LL(0xe2c72c2c,0x8a41486b),LL(0xfea0bf36,0x813b9420),LL(0xa66dac69,0xb3d36ee9), LL(0x328cc987,0x6fddc08a),LL(0x3a326461,0x0a3bcd2c),LL(0xd810dbba,0x7103c49d),LL(0x4b78a4c4,0xf9d81a28),
+ LL(0xe4d55941,0x3de865ad),LL(0x30384087,0xdedafa5e),LL(0x4ef18b9b,0x6f414abb),LL(0xfaee5268,0x9ee9ea42), LL(0x37a55a4a,0x260faa16),LL(0x015f93b9,0xeb19a514),LL(0x9e9c3598,0x51d7ebd2),LL(0x1932178e,0x523fc56d),
+ LL(0xb98fe684,0x501d070c),LL(0x124a1458,0xd60fbe9a),LL(0x92bc6b3f,0xa45761c8),LL(0xfe6f27cb,0xf5384858), LL(0xb59e763b,0x4b0271f7),LL(0x5b5a8e5e,0x3d4606a9),LL(0x05a48292,0x1eda5d9b),LL(0xe6fec446,0xda7731d0),
+ LL(0x90d45871,0xa3e33693),LL(0x06166d8d,0xe9764040),LL(0x89a90403,0xb5c33682),LL(0x72f1d637,0x4bd17983), LL(0xd5d2c53a,0xa616679e),LL(0xfdcf3b87,0x5ec4bcd8),LL(0xb66a694e,0xae6d7613),LL(0xe3fc27e5,0x7460fc76),
+ LL(0x95caabee,0x70469b82),LL(0x889501e3,0xde024ca5),LL(0x076ed265,0x6bdadc06),LL(0x5a0ef8b2,0x0cb1236b), LL(0x0972ebf9,0x4065ddbf),LL(0x22aca432,0xf1dd3875),LL(0x744aff76,0xa88b97cf),LL(0xfe8e3d24,0xd1359afd),
+ LL(0x91502cf3,0x52a3ba2b),LL(0x084db75d,0x2c3832a8),LL(0xde30b1c9,0x04a12ddd),LL(0xe31fd60c,0x7802eabc), LL(0xa37fddab,0x33707327),LL(0xfaafa973,0x65d6f2ab),LL(0x11e6f91a,0x3525c5b8),LL(0x5f46530b,0x76aeb0c9),
+ LL(0x2f93a675,0xe8815ff6),LL(0x05f48679,0xa6ec9684),LL(0x358ae884,0x6dcbb556),LL(0xe19e3873,0x0af61472), LL(0xa5f696be,0x72334372),LL(0x6f22fb70,0xc65e57ea),LL(0x946cea90,0x268da30c),LL(0x65681b2a,0x136a8a87),
+ LL(0x0f9f44d4,0xad5e81dc),LL(0x2c46585a,0xf09a6960),LL(0xc447d1b1,0xd1649164),LL(0x879dc8b1,0x3b4b36c8), LL(0x3b6b234c,0x20d4177b),LL(0x1730d9d0,0x096a2505),LL(0xef80531d,0x0611b9b8),LL(0x64bb495d,0xba904b3b),
+ LL(0x93a3147a,0x1192d9d4),LL(0x9a565545,0x9f30a5dc),LL(0x6ef07212,0x90b1f9cb),LL(0x0d87fc13,0x29958546), LL(0xc17db9ba,0xd3323eff),LL(0xcb1644a8,0xcb18548c),LL(0x4f49ffbc,0x18a306d4),LL(0x4c2e8684,0x28d658f1),
+ LL(0xa99f8c71,0x44ba60cd),LL(0x4bf742ff,0x67b7abdb),LL(0x914b3f99,0x66310f9c),LL(0xf412c161,0xae430a32), LL(0x88ace52f,0x1e6776d3),LL(0x52d7067d,0x4bc0fa24),LL(0x8f07cd1b,0x03c286aa),LL(0xa985b2c1,0x4cb8f38c),
+ LL(0x8c3bff36,0x83ccbe80),LL(0x5263e575,0x005a0bd2),LL(0x259bdcd1,0x460d7dda),LL(0xfa5cab6b,0x4a1c5642), LL(0x9fe4fc88,0x2b7bdbb9),LL(0xcc97bbb5,0x09418e28),LL(0xa12321ae,0xd8274fb4),LL(0x5c87b64e,0xb137007d),
+ LL(0xc63c4962,0x80531fe1),LL(0x981fdb25,0x50541e89),LL(0xfd4c2b6b,0xdc1291a1),LL(0xa6df4fca,0xc0693a17), LL(0x0117f203,0xb2c4604e),LL(0x0a99b8d0,0x245f1963),LL(0xc6212c44,0xaedc20aa),LL(0x520f52a8,0xb1ed4e56),
+ LL(0xf8547be3,0xfe48f575),LL(0xa9e45f98,0x0a7033cd),LL(0x18c50100,0x4b45d3a9),LL(0xa61d41da,0xb2a6cd6a), LL(0x57933c6b,0x60bbb4f5),LL(0x2b0d7ffc,0xa7538ebd),LL(0x8cd626b6,0x9ea3ab8d),LL(0x3601625a,0x8273a484),
+ LL(0x0168e508,0x88859845),LL(0x99a94abd,0x8cbc9bb2),LL(0xfab0a671,0x713ac792),LL(0x6c9ebffc,0xa3995b19), LL(0x1239e152,0xe711668e),LL(0xbbb8dff4,0x56892558),LL(0xdbf17963,0x8bfc7dab),LL(0xb3de1253,0x5b59fe5a),
+ LL(0x34a9f7ae,0x7e3320eb),LL(0xd751efe4,0xe5e8cf72),LL(0xd9be2f37,0x7ea003bc),LL(0xb6c08ef7,0xc0f551a0), LL(0x038f6725,0x56606268),LL(0x6d92d3b6,0x1dd38e35),LL(0xc3cbd686,0x07dfce7c),LL(0x651c5da8,0x4e549e04),
+ LL(0x08b19340,0x4058f93b),LL(0xcac6d89d,0xc2fae6f4),LL(0x8f159cc7,0x4bad8a8c),LL(0xcb0b601c,0x0ddba4b3), LL(0x1dd95f8c,0xda4fc7b5),LL(0xcea5c255,0x1d163cd7),LL(0x274a8c4c,0x30707d06),LL(0x2802e9ce,0x79d9e008),
+ LL(0xe6ddd505,0x02a29ebf),LL(0xb50bed1a,0x37064e74),LL(0xa7327d57,0x3f6bae65),LL(0xf83920bc,0x3846f5f1), LL(0x60df1b9b,0x87c37491),LL(0x2d1da29f,0x4cfb2895),LL(0x4ed1743c,0x10a478ca),LL(0x3edd47c6,0x390c6030),
+ LL(0x8c0a78de,0x8f3e5312),LL(0x1e85df70,0xccd02bda),LL(0xa61b6582,0xd6c75c03),LL(0xfc0eebd1,0x0762921c), LL(0xd85010c0,0xd34d0823),LL(0x0044cf1f,0xd73aaacb),LL(0xa3b5e78a,0xfb4159bb),LL(0xe5826f3f,0x2287c7f7),
+ LL(0x580b1a01,0x4aeaf742),LL(0x60423b79,0xf080415d),LL(0xa7dea144,0xe12622cd),LL(0x59d62472,0x49ea4996), LL(0x571f3913,0xb42991ef),LL(0xf5b25a8a,0x0610f214),LL(0x30b79e8f,0x47adc585),LL(0x07a065a2,0xf90e3df6),
+ LL(0x43e2e034,0x5d0a5deb),LL(0x444024aa,0x53fb5a34),LL(0x6b0c9f7f,0xa8628c68),LL(0xac563656,0x9c69c29c), LL(0xbace47b6,0x5a231feb),LL(0x9ea5a2ec,0xbdce0289),LL(0x9463853e,0x05da1fac),LL(0x509e78aa,0x96812c52),
+ LL(0x57151692,0xd3fb5771),LL(0xd98e1c44,0xeb2721f8),LL(0x32399be1,0xc0506087),LL(0xd979d8b8,0xda5a5511), LL(0xc6f56780,0x737ed55d),LL(0x0dc7a7f4,0xe20d3004),LL(0xf5941a03,0x02ce7301),LL(0xed30f83a,0x91ef5215),
+ LL(0x4092d85f,0x28727fc1),LL(0x5c49e41a,0x72d223c6),LL(0xba6a4d81,0xa7cf30a2),LL(0xb030d87d,0x7c086209), LL(0xfc588b09,0x04844c7d),LL(0x5874bbb0,0x728cd499),LL(0xe84c0495,0xcc1281ee),LL(0xec31958f,0x0769b5ba),
+ LL(0xf99c2471,0x665c228b),LL(0x191eb110,0xf2d8a11b),LL(0xd36d7024,0x4594f494),LL(0xcdcb25a1,0x482ded8b), LL(0xdadd4885,0xc958a9d8),LL(0xf1d2b547,0x7004477e),LL(0x2a0af550,0x0a45f6ef),LL(0x2f8d6351,0x4fc739d6),
+ LL(0x786f08a9,0x75cdaf27),LL(0x42c2737f,0x8700bb26),LL(0x1c4e2670,0x855a7141),LL(0x15076fef,0x810188c1), LL(0xabcd3297,0xc251d0c9),LL(0xf48108eb,0xae4c8967),LL(0x18ceed30,0xbd146de7),LL(0xc986bced,0xf9d4f07a),
+ LL(0x83fa1e08,0x5ad98ed5),LL(0xbeabd1fb,0x7780d33e),LL(0x903b1196,0xe330513c),LL(0xa47bc8c4,0xba11de9e), LL(0x02c2d064,0x684334da),LL(0xa48de23b,0x7ecf360d),LL(0x0a9089d8,0x57a1b474),LL(0xff36734c,0xf28fa439),
+ LL(0xea4570b3,0xf2a482cb),LL(0xa5ebcee9,0xee65d68b),LL(0xb9694cd5,0x988d0036),LL(0x37885d32,0x53edd0e9), LL(0xbeb9bc6d,0xe37e3307),LL(0x9f5c6768,0xe9abb907),LL(0x51f2160f,0x4396ccd5),LL(0x47336da6,0x2500888c),
+ LL(0x926fce43,0x383f9ed9),LL(0x04da2930,0x809dd1c7),LL(0x8a4cb227,0x30f6f596),LL(0x73a56b38,0x0d700c7f), LL(0xab64a065,0x1825ea33),LL(0x1338df80,0xaab9b735),LL(0x9b63f57f,0x1516100d),LL(0x27a6a634,0x2574395a),
+ LL(0x700a1acd,0xb5560fb6),LL(0xfd999681,0xe823fd73),LL(0x6cb4e1ba,0xda915d1f),LL(0x6ebe00a3,0x0d030118), LL(0x89fca8cd,0x744fb0c9),LL(0xf9da0e0b,0x970d01db),LL(0x7931d76f,0x0ad8c564),LL(0xf659b96a,0xb15737bf),
+ LL(0xa8b484e7,0xdc9933e8),LL(0x7a26dec7,0xb2fdbdf9),LL(0x9f1f0136,0x2349e9a4),LL(0x70fddddb,0x7860368e), LL(0xf9ad3e18,0xd93d2c1c),LL(0x689f4e79,0x6d6c5f17),LL(0xb24ff1b6,0x7a544d91),LL(0xfe16cd8c,0x3e12a5eb),
+ LL(0xa56b872f,0x543574e9),LL(0xfcf68ea2,0xa1ad550c),LL(0x3f560ef7,0x689e37d2),LL(0xc9d47a8b,0x8c54b9ca), LL(0x088ac342,0x46d40a4a),LL(0x1576c6d0,0xec450c7c),LL(0x1f9689e9,0xb589e31c),LL(0xb8781718,0xdacf2602),
+ LL(0xc8cb6b42,0xa89237c6),LL(0xb96ef381,0x1326fc93),LL(0xb5f07825,0x55d56c6d),LL(0x7449e22d,0xacba2eea), LL(0x633c3000,0x74e0887a),LL(0xd7cbcf71,0xcb6cd172),LL(0xc36cf1be,0x309e81de),LL(0x60ae399b,0x07a18a6d),
+ LL(0x9edce57e,0xb36c2679),LL(0xdf001d41,0x52b892f4),LL(0x16a1f2c6,0xd884ae5d),LL(0xefcc370a,0x9b329424), LL(0xbd2e21df,0x3120daf2),LL(0x02470a99,0x55298d2d),LL(0xa05db32e,0x0b78af6c),LL(0x601f5636,0x5c76a331),
+ LL(0xf8a4f29c,0xaae861ff),LL(0xd68f8d49,0x70dc9240),LL(0x81b1321c,0x960e649f),LL(0x8792e4ce,0x3d2c801b), LL(0x42521876,0xf479f772),LL(0x416c79b1,0x0bed93bc),LL(0x263e5bc9,0xa67fbc05),LL(0x521db049,0x01e8e630),
+ LL(0xc6f3431e,0x76f26738),LL(0xe3267541,0xe609cb02),LL(0x818c877c,0xb10cff2d),LL(0x786a13cb,0x1f0e75ce), LL(0x1158544d,0xf4fdca64),LL(0x6cb71ed0,0x5d777e89),LL(0xa9aa4755,0x3c233737),LL(0xe527ab40,0x7b453192),
+ LL(0x39f05ffe,0xdb59f688),LL(0x6d82574e,0x8f4f4be0),LL(0xee292d1b,0xcce3450c),LL(0x61ccd086,0xaa448a12), LL(0xf7914967,0xabce91b3),LL(0x1908a5ed,0x4537f09b),LL(0xf51042e7,0xa812421e),LL(0xec0b3a34,0xfaf5cebc),
+ LL(0x4ca6b39a,0x730ffd87),LL(0x02efd342,0x70fb72ed),LL(0xd75c8edb,0xeb4735f9),LL(0xc278aa51,0xc11f2157), LL(0xbf3bfebf,0xc459f635),LL(0x6bd9601f,0x3a1ff0b4),LL(0xc420cb73,0xc9d12823),LL(0x3c2915a3,0x3e9af3e2),
+ LL(0xb41c3440,0xe0c82c72),LL(0xe3039a5f,0x175239e5),LL(0x558795a3,0xe1084b8a),LL(0xd01e5c60,0x328d0a1d), LL(0xd3788a04,0x0a495f2e),LL(0x66c11a9f,0x25d8ff16),LL(0x9ed692d6,0xf5155f05),LL(0x4f425fe4,0x954fa107),
+ LL(0xe98aaa99,0xd16aabf2),LL(0x96b0f88a,0x90cd8ba0),LL(0xc154026a,0x957f4782),LL(0x52af56d2,0x54ee0734), LL(0x45b4147a,0xbcf89e54),LL(0x9a52816c,0x3d102f21),LL(0x39b62e77,0x6808517e),LL(0x69169ad8,0x92e25421),
+ LL(0xbb608558,0xd721d871),LL(0xf6d4ff9b,0x60e4ebae),LL(0x41f2763e,0x0ba10819),LL(0x51ee3247,0xca2e45be), LL(0x2bfd7a5f,0x66d172ec),LL(0x74d0b12d,0x528a8f2f),LL(0xdabe70dc,0xe17f1e38),LL(0x9f93983c,0x1d5d7316),
+ LL(0xdf423e31,0x51b2184a),LL(0xaedb1a10,0xcb417291),LL(0x625bcab9,0x2054ca93),LL(0xa98998f0,0x54396860), LL(0xa54ae57e,0x4e53f6c4),LL(0xee648e9d,0x0ffeb590),LL(0x6afaf6bc,0xfbbdaadc),LL(0xaa3bfb8a,0xf88ae796),
+ LL(0xd2359ed9,0x209f1d44),LL(0xf3544ce2,0xac68dd03),LL(0xfd51e569,0xf378da47),LL(0x2cc80097,0xe1abd860), LL(0x343b6e3a,0x23ca18d9),LL(0xb40a1bae,0x480797e8),LL(0x533f3e67,0xd1f0c717),LL(0x06e6cdfc,0x44896970),
+ LL(0x52a82e8d,0x8ca21055),LL(0x78460cdc,0xb2caf785),LL(0xe9037178,0x4c1b7b62),LL(0xdb514b58,0xefc09d2c), LL(0x9113be5c,0x5f2df9ee),LL(0xb3f9271c,0x2fbda78f),LL(0x8f83fc54,0xe09a81af),LL(0x8afb5141,0x06b13866),
+ LL(0x43e3865d,0x38f6480f),LL(0x1ddf47d9,0x72dd77a8),LL(0x4c205ff7,0xf2a8e971),LL(0x9d088ad8,0x46d449d8), LL(0x185d706f,0x926619ea),LL(0xc7dd7f62,0xe47e02eb),LL(0x8cbc2031,0xe7f120a7),LL(0x998d4ac9,0xc18bef00),
+ LL(0x6bdf22da,0x18f37a9c),LL(0x90dc82df,0xefbc432f),LL(0x5d703651,0xc52cef8e),LL(0xd99881a5,0x82887ba0), LL(0xb920ec1d,0x7cec9dda),LL(0xec3e8d3b,0xd0d7e8c3),LL(0x4ca88747,0x445bc395),LL(0x9fd53535,0xedeaa2e0),
+ LL(0x6cc87475,0x461b1d93),LL(0x6d2383bd,0xd92a52e2),LL(0xd7903546,0xfabccb59),LL(0x3d14b112,0x6111a761), LL(0xb3d5f612,0x0ae584fe),LL(0x60e828ec,0x5ea69b8d),LL(0x54087030,0x6c078985),LL(0xac4821fe,0x649cab04),
+ LL(0x8bdce214,0x25ecedcf),LL(0x86af7361,0xb5622f72),LL(0x7038b9e2,0x0e1227aa),LL(0xac20fa77,0xd0efb273), LL(0x79df975b,0x817ff88b),LL(0x1999503e,0x856bf286),LL(0x5038ec46,0xb4d5351f),LL(0xfc42af6e,0x740a52c5),
+ LL(0x2cbb1a3f,0x2e38bb15),LL(0x17a83429,0xc3eb99fe),LL(0xdd66bb74,0xca4fcbf1),LL(0xcde5e8fc,0x880784d6), LL(0xb4e7a0be,0xddc84c1c),LL(0xbd15a72f,0x8780510d),LL(0x81ec30e1,0x44bcf1af),LL(0x0a61073e,0x141e50a8),
+ LL(0x47be87ae,0x0d955718),LL(0xf76a4372,0x68a61417),LL(0xc607c3d3,0xf57e7e87),LL(0x5252f332,0x043afaf8), LL(0x1552a4d2,0xcc14e121),LL(0xbb4d4ab4,0xb6dee692),LL(0xa03816a4,0xb6ab74c8),LL(0x6f394a29,0x84001ae4),
+ LL(0xd795fb45,0x5bed8344),LL(0xb79f55a5,0x57326e7d),LL(0x4accdffc,0xc9533ce0),LL(0x3993fa04,0x53473caf), LL(0xa13df4c8,0x7906eb93),LL(0x97cbe46f,0xa73e51f6),LL(0x0ae4ccf8,0xd1ab3ae1),LL(0x8a5b3dbc,0x25614508),
+ LL(0x11a71b27,0x61eff962),LL(0x6bb7fa39,0xdf71412b),LL(0x2bd7f3ef,0xb31ba6b8),LL(0x69180d29,0xb0b9c415), LL(0x014cdde5,0xeec14552),LL(0x227b4bbb,0x702c624b),LL(0xd3e988f3,0x2b15e8c2),LL(0xa4f7fd04,0xee3bcc6d),
+ LL(0x42ac6c85,0x9d00822a),LL(0x1df9f2b7,0x2db0cea6),LL(0x42de1e58,0xd7cad2ab),LL(0x2d6fbb61,0x346ed526), LL(0x1a2faf09,0xb3962995),LL(0x7c25612e,0x2fa8a580),LL(0x7cf56490,0x30ae04da),LL(0x0eea3961,0x75662908),
+ LL(0x3d080847,0x3609f5c5),LL(0x5241d4f6,0xcb081d39),LL(0x77961a63,0xb4fb3810),LL(0x2abb66fc,0xc20c5984), LL(0xf902f245,0x3d40aa7c),LL(0x4e536b1e,0x9cb12736),LL(0x99b3134f,0x5eda24da),LL(0x5cd011af,0xafbd9c69),
+ LL(0xc7088c7d,0x9a16e30a),LL(0x3207389f,0x5ab65710),LL(0xe7407a53,0x1b09547f),LL(0x4fdc6eab,0x2322f9d7), LL(0x7430de4d,0xc0f2f22d),LL(0xe68ca9a9,0x19382696),LL(0x918e5868,0x17f1eff1),LL(0x586f4204,0xe3b5b635),
+ LL(0x3fbc4341,0x146ef980),LL(0x5b5eed4e,0x359f2c80),LL(0x7482e41d,0x9f35744e),LL(0xf3b224c2,0x9a9ac3ec), LL(0x91fc50ae,0x9161a6fe),LL(0xc613fa7c,0x89ccc66b),LL(0xc732f15a,0x89268b14),LL(0xb467ed03,0x7cd6f4e2),
+ LL(0xce56b40e,0xfbf79869),LL(0xc02dde98,0xf93e094c),LL(0xedee2cd7,0xefe0c3a8),LL(0xb268fd42,0x90f3ffc0), LL(0x08241aed,0x81a7fd56),LL(0x00b1afe8,0x95ab7ad8),LL(0x3e310d52,0x40127056),LL(0x09d9fc43,0xd3ffdeb1),
+ LL(0xd11a8594,0xc8f85c91),LL(0x31cf6db8,0x2e74d258),LL(0x02b5dfd0,0x829c7ca3),LL(0x69143c86,0xe389cfbe), LL(0x941768d8,0xd01b6405),LL(0x03bf825d,0x45103995),LL(0x56cd17e2,0xcc4ee166),LL(0xba037e79,0xbea3c283),
+ LL(0xd9a47520,0x4e1ac06e),LL(0xaf852404,0xfbfe18aa),LL(0x8087648a,0x5615f8e2),LL(0xb9d150d9,0x7301e47e), LL(0xb299b977,0x79f9f9dd),LL(0xa5b78314,0x76697a7b),LL(0x7d7c90e7,0x10d67468),LL(0x937210b5,0x7afffe03),
+ LL(0x28c22cee,0x5aef3e4b),LL(0x09fd55ae,0xefb0ecd8),LL(0x0d2a5d6a,0x4cea7132),LL(0x01db6357,0x9cfb5fa1), LL(0xf36e1ac5,0x395e0b57),LL(0x36cafb7d,0x008fa9ad),LL(0x5308c4db,0x8f6cdf70),LL(0x95ed2477,0x51527a37),
+ LL(0x5bd21311,0xba0dee30),LL(0x909c90d7,0x6ed41b22),LL(0x7c8696d3,0xc5f6b758),LL(0x3ce83a80,0x0db8eaa8), LL(0xb24b4b6f,0xd297fe37),LL(0x522d1f0d,0xfe58afe8),LL(0x8c98dbd9,0x97358736),LL(0x9454a527,0x6bc226ca),
+ LL(0xce53c2d0,0xa12b384e),LL(0x5e4606da,0x779d897d),LL(0x73ec12b0,0xa53e47b0),LL(0x5756f1ad,0x462dbbba), LL(0xcafe37b6,0x69fe09f2),LL(0xecce2e17,0x273d1ebf),LL(0x3cf607fd,0x8ac1d538),LL(0x12e10c25,0x8035f7ff),
+},
+/* digit=21 base_pwr=2^147 */
+{
+ LL(0x7e6c5520,0x854d34c7),LL(0xdcb9ea58,0xc27df9ef),LL(0xd686666d,0x405f2369),LL(0x0417aa85,0x29d1febf), LL(0x93470afe,0x9846819e),LL(0xe2a27f9e,0x3e6a9669),LL(0xe31e6504,0x24d008a2),LL(0x9cb7680a,0xdba7cecf),
+ LL(0x338d6e43,0xecaff541),LL(0x4541d5cc,0x56f7dd73),LL(0x96bc88ca,0xb5d426de),LL(0x9ed3a2c3,0x48d94f6b), LL(0x2ef8279c,0x6354a3bb),LL(0x0b1867f2,0xd575465b),LL(0x95225151,0xef99b0ff),LL(0xf94500d8,0xf3e19d88),
+ LL(0xe32dd620,0x92a83268),LL(0x627849a2,0x913ec99f),LL(0x2c378882,0xedd8fdfa),LL(0xee6f8cfe,0xaf96f33e), LL(0xdc3fa8a5,0xc06737e5),LL(0xb0b03a1d,0x236bb531),LL(0x89f037b0,0x33e59f29),LL(0xd9a12a53,0x13f9b5a7),
+ LL(0x51efb310,0x0d0df6ce),LL(0x958df5be,0xcb5b2eb4),LL(0x36158e59,0xd6459e29),LL(0x1466e336,0x82aae2b9), LL(0x411aa636,0xfb658a39),LL(0xd4c0a933,0x7152ecc5),LL(0x49f026b7,0xf10c758a),LL(0xcb09311f,0xf4837f97),
+ LL(0xc753c45f,0xddfb02c4),LL(0xf9c840fe,0x18ca81b6),LL(0xb0f8a3e6,0x846fd09a),LL(0xe7733dbc,0xb1162add), LL(0x236e3ab6,0x7070ad20),LL(0xb2a56326,0xf88cdaf5),LL(0x997cbc7a,0x05fc8719),LL(0x4b665272,0x442cd452),
+ LL(0xb71698f5,0x7807f364),LL(0x9f7b605e,0x6ba418d2),LL(0xa03b2cbb,0xfd20b00f),LL(0xda54386f,0x883eca37), LL(0xf3437f24,0xff0be43f),LL(0xa48bb33c,0xe910b432),LL(0x329df765,0x4963a128),LL(0xbe2fe6f7,0xac1dd556),
+ LL(0x24a0a3fc,0x557610f9),LL(0xe881c3f9,0x38e17bf4),LL(0xed0dac99,0x6ba84faf),LL(0x59eeb918,0xd4a222c3), LL(0x13f542b6,0xc79c1dbe),LL(0xe425d457,0x1fc65e0d),LL(0x1debb779,0xeffb754f),LL(0x9e08af60,0x638d8fd0),
+ LL(0x626332d5,0x994f523a),LL(0x5561bb44,0x7bc38833),LL(0x3d845ea2,0x005ed4b0),LL(0xc2a1f08a,0xd39d3ee1), LL(0xe7676b0d,0x6561fdd3),LL(0xfb706017,0x620e35ff),LL(0xf264f9a8,0x36ce424f),LL(0xda2681f7,0xc4c3419f),
+ LL(0x69beb6e8,0xfb6afd2f),LL(0x6d700d03,0x3a50b993),LL(0x0c83a14f,0xc840b2ad),LL(0x54085bef,0x573207be), LL(0x09fe7e5b,0x5af882e3),LL(0x3b40a7e1,0x957678a4),LL(0x543056e2,0x172d4bdd),LL(0x0df13c0a,0x9c1b26b4),
+ LL(0xf405ff06,0x1c30861c),LL(0x486e828b,0xebac86bd),LL(0x636933fc,0xe791a971),LL(0x7aeee947,0x50e7c2be), LL(0xfa90d767,0xc3d4a095),LL(0xe670ab7b,0xae60eb7b),LL(0x397b056d,0x17633a64),LL(0x105012aa,0x93a21f33),
+ LL(0xabb88643,0x663c370b),LL(0x22e21599,0x91df36d7),LL(0x8b761671,0x183ba835),LL(0x728f3bf1,0x381eea1d), LL(0x39966e6c,0xb9b2f1ba),LL(0xe7295492,0x7c464a28),LL(0x09b26b7f,0x0fd5f70a),LL(0xfbe009df,0xa9aba1f9),
+ LL(0x369b87ad,0x857c1f22),LL(0x32fca556,0x3c00e5d9),LL(0x90b06466,0x1ad74cab),LL(0x550faaf2,0xa7112386), LL(0x6d9bd5f5,0x7435e198),LL(0x59c3463f,0x2dcc7e38),LL(0xca7bd4b2,0xdc7df748),LL(0x9dec2f31,0x13cd4c08),
+ LL(0xe3237710,0x0d3b5df8),LL(0xcbd2f7b0,0x0dadb26e),LL(0xe4aa082b,0x9f5966ab),LL(0x350e966e,0x666ec8de), LL(0xee524216,0x1bfd1ed5),LL(0x41dab0b6,0xcd93c59b),LL(0xd186d6ba,0x658a8435),LL(0x159d1195,0x1b7d34d2),
+ LL(0x22caf46b,0x5936e460),LL(0x9a96fe4f,0x6a45dd8f),LL(0xb98f474e,0xf7925434),LL(0x0053ef15,0x41410412), LL(0x41de97bf,0x71cf8d12),LL(0xbd80bef4,0xb8547b61),LL(0xc4db0037,0xb47d3970),LL(0xfef20dff,0xf1bcd328),
+ LL(0x10caad67,0x31a92e09),LL(0x5531a1e1,0x1f591960),LL(0x5f4fc840,0x3bb852e0),LL(0x93a72c6c,0x63e297ca), LL(0x49abad67,0x3c2b0b2e),LL(0xed3db0d9,0x6ec405fc),LL(0x7fef1d40,0xdc14a530),LL(0x280896fc,0xccd19846),
+ LL(0x9bb81648,0x00f83176),LL(0x653120d0,0xd69eb485),LL(0x4ccabc62,0xd17d75f4),LL(0xb749fcb1,0x34a07f82), LL(0xbbfb5554,0x2c3af787),LL(0x62e283f8,0xb06ed4d0),LL(0xa19213a0,0x5722889f),LL(0xdcf3c7b4,0x162b085e),
+ LL(0xe0dd3eca,0xbcaecb31),LL(0xe52f13a5,0xc6237fbc),LL(0x27bac297,0xcc2b6b03),LL(0xb917f54a,0x2ae1cac5), LL(0x7845ae4f,0x474807d4),LL(0xce5972e0,0xfec7dd92),LL(0x1d7915bb,0xc3bd2541),LL(0xd94907ca,0x66f85dc4),
+ LL(0xbdbcf0ca,0xd981b888),LL(0xdf279e9f,0xd75f5da6),LL(0x7054e934,0x128bbf24),LL(0x81db134b,0x3c6ff6e5), LL(0x047d26e4,0x795b7cf4),LL(0x5049ec37,0xf370f7b8),LL(0xced945af,0xc6712d4d),LL(0x095642bc,0xdf30b5ec),
+ LL(0x4896246e,0x9b034c62),LL(0xee90bbd1,0x5652c016),LL(0x87fedb73,0xeb38636f),LL(0x0135a613,0x5e32f847), LL(0xcf933c83,0x0703b312),LL(0x1a7f47e6,0xd05bb76e),LL(0x949c2415,0x825e4f0c),LL(0x7250d6f8,0x569e5622),
+ LL(0x6568013e,0xbbe9eb3a),LL(0x22f243fc,0x8dbd203f),LL(0xb342734a,0x9dbd7694),LL(0x46afa984,0x8f6d12f8), LL(0xc9eade29,0xb98610a2),LL(0x47dd0f18,0xbab4f323),LL(0x671c0d46,0x5779737b),LL(0xd3e0a42a,0x10b6a7c6),
+ LL(0x3035b41c,0xfb19ddf3),LL(0x99c45895,0xd336343f),LL(0x54c857e5,0x61fe4938),LL(0xae4e57d5,0xc4d506be), LL(0xbbc33f75,0x3cd8c8cb),LL(0x9262c77d,0x7281f08a),LL(0xf11a2823,0x083f4ea6),LL(0x9fba2e33,0x8895041e),
+ LL(0x9c438edf,0xfcdfea49),LL(0x91edba44,0x7678dcc3),LL(0xe2ba50f0,0xf07b3b87),LL(0x43948c1b,0xc13888ef), LL(0x1140af42,0xc2135ad4),LL(0x926ed1a7,0x8e5104f3),LL(0x88f6695f,0xf24430cb),LL(0x6d73c120,0x0ce0637b),
+ LL(0xfe631e8f,0xb2db01e6),LL(0xd7bdd24b,0x1c5563d7),LL(0x369ad44f,0x8daea3ba),LL(0x8187a9f9,0x000c81b6), LL(0xaae1fd9a,0x5f48a951),LL(0x8d5aed8a,0xe35626c7),LL(0x0498c622,0x20952763),LL(0x773aa504,0x76d17634),
+ LL(0xeb300f7a,0x36d90dda),LL(0xedb5e801,0x9dcf7dfc),LL(0x74d5244c,0x645cb268),LL(0x348e3aa2,0xa127ee79), LL(0x575f1dbb,0x488acc53),LL(0x80e6161e,0x95037e85),LL(0x292650d0,0x57e59283),LL(0x14938216,0xabe67d99),
+ LL(0x3f8e1065,0x3c7f944b),LL(0x330e8924,0xed908cb6),LL(0x6f530136,0x08ee8fd5),LL(0xd7ffc169,0x2227b7d5), LL(0xb5cd6dd5,0x4f55c893),LL(0xa62796e8,0x82225e11),LL(0xcb18e12c,0x5c6cead1),LL(0x84f5a51a,0x4381ae0c),
+ LL(0x7fafa4c8,0x345913d3),LL(0x0491aac0,0x3d918082),LL(0x3e69264c,0x9347871f),LL(0xb4f4f0cd,0xbea9dd3c), LL(0x3eadd3e7,0xbda5d067),LL(0x0573bcd8,0x0033c1b8),LL(0x5da2486c,0x25589379),LL(0x86abbee7,0xcb89ee5b),
+ LL(0x22532e5d,0x8fe0a8f3),LL(0x727dfc4c,0xb6410ff0),LL(0x226726db,0x619b9d58),LL(0x7a2b2dc7,0x5ec25669), LL(0x4c3beb01,0xaf4d2e06),LL(0x7acea556,0x852123d0),LL(0xf783487a,0x0e9470fa),LL(0x5664b3eb,0x75a7ea04),
+ LL(0x6798e4ba,0x4ad78f35),LL(0xc7d0e091,0x9214e6e5),LL(0xb1290403,0xc420b488),LL(0xfc295749,0x64049e0a), LL(0x3ae9841f,0x03ef5af1),LL(0xb0b662a6,0xdbe4ca19),LL(0xfa453458,0x46845c5f),LL(0x10b66722,0xf8dabf19),
+ LL(0xcce2793b,0xb650f0aa),LL(0xc5ec47c1,0x71db851e),LL(0x3b234fa9,0x3eb78f3e),LL(0xfc0106ce,0xb0c60f35), LL(0x774eadbd,0x05427121),LL(0xce323863,0x25367faf),LL(0xcd086976,0x7541b5c9),LL(0xdc507ad1,0x4ff069e2),
+ LL(0x8776e667,0x74145256),LL(0xb23c6bb5,0x6e76142c),LL(0x1b3a8a87,0xdbf30712),LL(0x98450836,0x60e7363e), LL(0xb7366d80,0x5741450e),LL(0x4837dbdf,0xe4ee14ca),LL(0x69d4316f,0xa765eb9b),LL(0x8ef43825,0x04548dca),
+ LL(0x5ae888eb,0x9c9f4e4c),LL(0x56e9ac99,0x733abb51),LL(0xba6ac029,0xdaad3c20),LL(0x2ba3e38e,0x9b8dd3d3), LL(0x0bc5d11a,0xa9bb4c92),LL(0x9c5f88a3,0xf20127a7),LL(0x161d3cb8,0x4f52b06e),LL(0x6afaf0a6,0x26c1ff09),
+ LL(0x7189e71f,0x32670d2f),LL(0x5ecf91e7,0xc6438748),LL(0xdb757a21,0x15758e57),LL(0x290a9ce5,0x427d09f8), LL(0x38384a7a,0x846a308f),LL(0xb0732b99,0xaac3acb4),LL(0x17845819,0x9e941009),LL(0xa7ce5e03,0x95cba111),
+ LL(0xb00009c4,0x6f3d4f7f),LL(0x8ff28b5f,0xb8396c27),LL(0x1c97975d,0xb1a9ae43),LL(0xe5d9fed5,0x9d7ba8af), LL(0x34f485b6,0x338cf09f),LL(0x64122516,0xbc0ddacc),LL(0x05d471fe,0xa450da12),LL(0x628dd8c9,0x4c3a6250),
+ LL(0xd1295837,0x69c7d103),LL(0x3807eb2f,0xa2893e50),LL(0xbdb41491,0xd6e1e1de),LL(0x5e138235,0xc630745b), LL(0x48661ae1,0xc892109e),LL(0xea2b2674,0x8d17e7eb),LL(0xc328d6b5,0x00ec0f87),LL(0xf079ff9e,0x6d858645),
+ LL(0x19115ead,0x6cdf243e),LL(0x4bac4fcf,0x1ce1393e),LL(0x9c29f25b,0x2c960ed0),LL(0x9d388a05,0x59be4d8e), LL(0xd0def72b,0x0d46e06c),LL(0xe0342748,0xb923db5d),LL(0x936d4a3d,0xf7d3aacd),LL(0x0b0b099e,0x558519cc),
+ LL(0x827097ef,0x3ea8ebf8),LL(0xd054f55d,0x259353db),LL(0x6d2ed089,0x84c89abc),LL(0x8e096a7c,0x5c548b69), LL(0x994b995d,0xd587f616),LL(0xa5845601,0x4d1531f6),LL(0x451fd9f0,0x792ab31e),LL(0x65adf6ca,0xc8b57bb2),
+ LL(0x1cd5ad73,0x68440fcb),LL(0x6144da4f,0xb9c860e6),LL(0x8462beb8,0x2ab286aa),LL(0xef46797f,0xcc6b8fff), LL(0x20c8a471,0xac820da4),LL(0x77ff7faf,0x69ae05a1),LL(0xbfb5da77,0xb9163f39),LL(0x2c73ab7a,0xbd03e590),
+ LL(0xb2940d9e,0x7e862b5e),LL(0x4b9af564,0x3c663d86),LL(0xbde3033d,0xd8309031),LL(0xd42c5bc6,0x298231b2), LL(0x552ad093,0x42090d2c),LL(0xff854695,0xa4799d1c),LL(0xd31f0d00,0x0a88b5d6),LL(0xa2f26b46,0xf8b40825),
+ LL(0xf1bd7218,0xec29b1ed),LL(0x4b24c86e,0xd491c53b),LL(0x3395ea65,0xd2fe588f),LL(0x4456ef15,0x6f3764f7), LL(0xcdc34800,0xdb43116d),LL(0xc1e33955,0xcdbcd456),LL(0x74ab286b,0xefdb5540),LL(0xd18c5d7c,0x948c7a51),
+ LL(0x7378058e,0xeb81aa37),LL(0x04411154,0x41c746a1),LL(0xfb828ac7,0xa10c73bc),LL(0x9d972b29,0x6439be91), LL(0x43a2fbad,0x4bf3b4b0),LL(0x82b5e840,0x39e6dadf),LL(0x6397bd4c,0x4f716408),LL(0x7f1eeccb,0x0f7de568),
+ LL(0xd2ffbfc1,0x5865c5a1),LL(0x4ccb6451,0xf74211fa),LL(0xc0b32558,0x66368a88),LL(0x9ad7812e,0x5b539dc2), LL(0x2f3af6f6,0x579483d0),LL(0x99934ece,0x52132078),LL(0xdcc9e983,0x50b9650f),LL(0xaee42b8a,0xca989ec9),
+ LL(0xd6f62f99,0x6a44c829),LL(0x4c2a7c0c,0x8f06a309),LL(0x98a0cb0a,0x4ea2b3a0),LL(0xbeee8364,0x5c547b70), LL(0x682afe11,0x461d40e1),LL(0x7b41c0a8,0x9e0fc77a),LL(0xe20d5d36,0x79e4aefd),LL(0x32dd9f63,0x2916e520),
+ LL(0x3f883faf,0xf59e52e8),LL(0x2b868d35,0x396f9639),LL(0x4ca19881,0xc902a9df),LL(0xdb2401a6,0x0fc96822), LL(0x66f1c68d,0x41237587),LL(0xfb476c0d,0x10fc6de3),LL(0x841f5d90,0xf8b6b579),LL(0xfa24f44a,0x2ba8446c),
+ LL(0xef4a9975,0xa237b920),LL(0x2330435f,0x60bb6004),LL(0xcfb7e7b5,0xd6f4ab5a),LL(0x83435391,0xb2ac5097), LL(0xb0d1ea67,0xf036ee2f),LL(0x74c56230,0xae779a6a),LL(0xab838ae6,0x59bff8c8),LL(0x9b38e6f0,0xcd83ca99),
+ LL(0xe33deed3,0xbb27bef5),LL(0x001892a8,0xe6356f6f),LL(0x7adfbd3e,0xbf3be6cc),LL(0x33d1ac9d,0xaecbc81c), LL(0xe6e861dc,0xe4feb909),LL(0x53f5f801,0x90a247a4),LL(0x27346e57,0x01c50acb),LL(0x461acc1b,0xce29242e),
+ LL(0x2f998a91,0x04dd214a),LL(0xd4baf27b,0x271ee9b1),LL(0xe8c26722,0x7e3027d1),LL(0x1820dce5,0x21d1645c), LL(0x7501779c,0x086f242c),LL(0xfa0e8009,0xf0061407),LL(0x60187129,0xf23ce477),LL(0x0fde9bd0,0x05bbdedb),
+ LL(0x25d98473,0x682f4832),LL(0x5c658427,0xf207fe85),LL(0x4166ffa1,0xb6fdd7ba),LL(0x9eed799d,0x0c314056), LL(0x4107e28f,0x0db8048f),LL(0x41216840,0x74ed3871),LL(0x56a3c06e,0x74489f8f),LL(0x12777134,0x1e1c005b),
+ LL(0xf37ec3c3,0xdb332a73),LL(0xdd59eba0,0xc65259bd),LL(0xdb4d3257,0x2291709c),LL(0xbd389390,0x9a793b25), LL(0xe43756f0,0xf39fe34b),LL(0x9afb56c9,0x2f76bdce),LL(0x61208b27,0x9f37867a),LL(0x089972c3,0xea1d4307),
+ LL(0x8bdf623a,0x8c595330),LL(0x8441fb7d,0x5f5accda),LL(0x32ddfd95,0xfafa9418),LL(0x0fde9be7,0x6ad40c5a), LL(0xaeca8709,0x43faba89),LL(0x2c248a9d,0xc64a7cf1),LL(0x72637a76,0x16620252),LL(0x22b8d1bb,0xaee1c791),
+ LL(0x21a843b2,0xf0f798fd),LL(0x8d005cb1,0x56e4ed4d),LL(0x1f0d8abe,0x355f7780),LL(0x34522326,0x197b04cf), LL(0xfd42c13f,0x41f9b31f),LL(0xb40f933d,0x5ef7feb2),LL(0x5d60bad4,0x27326f42),LL(0x8c92cf89,0x027ecdb2),
+ LL(0x4e3352fe,0x04aae4d1),LL(0x73591b90,0x08414d2f),LL(0xb7da7d60,0x5ed6124e),LL(0x4d13d4ec,0xb985b931), LL(0x96bf36f9,0xa592d3ab),LL(0xbbdf51df,0x012dbed5),LL(0xdf6c177d,0xa57963c0),LL(0x87ca29cf,0x010ec869),
+ LL(0xbf926dff,0xba1700f6),LL(0xf4bf6bc2,0x7c9fdbd1),LL(0x64da11f5,0xdc18dc8f),LL(0xd938ae75,0xa6074b7a), LL(0xe84f44a4,0x14270066),LL(0xd27b954e,0x99998d38),LL(0xb4f38e9a,0xc1be8ab2),LL(0x15c01016,0x8bb55bbf),
+ LL(0x0ea2ab30,0xf73472b4),LL(0xf73d68dd,0xd365a340),LL(0x19c2e1eb,0xc01a7168),LL(0x34061719,0x32f49e37), LL(0x01d8b4d6,0xb73c57f1),LL(0x26b47700,0x03c8423c),LL(0xa4d8826a,0x321d0bc8),LL(0x4bc0e638,0x6004213c),
+ LL(0xc1c06681,0xf78c64a1),LL(0xef018e50,0x16e0a16f),LL(0xdb42b2b3,0x31cbdf91),LL(0xe0d36f58,0xf8f4ffce), LL(0x4cc5e3e0,0xcdcc71cd),LL(0xa129e3e0,0xd55c7cfa),LL(0x0fb2cbf1,0xccdb6ba0),LL(0xc4bce3cb,0x6aba0005),
+ LL(0xd232cfc4,0x501cdb30),LL(0xd58a3cef,0x9ddcf12e),LL(0x87e09149,0x02d2cf9c),LL(0x2c976257,0xdc5d7ec7), LL(0x0b50d7dd,0x6447986e),LL(0x807f112a,0x88fdbaf7),LL(0xb00ae9f6,0x58c9822a),LL(0x6d3d27e0,0x6abfb950),
+ LL(0x8a429f4f,0xd0a74487),LL(0xdb516609,0x0649712b),LL(0xe769b5df,0xb826ba57),LL(0x1fc7aaf2,0x82335df2), LL(0x5c93d995,0x2389f067),LL(0x68677be6,0x59ac367a),LL(0x21d9951b,0xa77985ff),LL(0x85011cce,0x038956fb),
+ LL(0xbb734e37,0x608e48cb),LL(0x2be5b26f,0xc08c0bf2),LL(0xf9b1a0d9,0x17bbdd3b),LL(0x10483319,0xeac7d898), LL(0xbc1a6dea,0xc95c4baf),LL(0x172aafdb,0xfdd0e2bf),LL(0x8235c41a,0x40373cbc),LL(0xfb6f41d5,0x14303f21),
+ LL(0x0408f237,0xba063621),LL(0xecd2d1ed,0xcad3b09a),LL(0x52abb6a2,0x4667855a),LL(0xaa8b417b,0xba9157dc), LL(0x4f013efb,0xfe7f3507),LL(0xaa38c4a2,0x1b112c4b),LL(0x9ba64345,0xa1406a60),LL(0x6993c80b,0xe53cba33),
+ LL(0xded40d23,0x45466063),LL(0x54908e25,0x3d5f1f4d),LL(0x403c3c31,0x9ebefe62),LL(0x0672a624,0x274ea0b5), LL(0x451d1b71,0xff818d99),LL(0x8f79cf79,0x80e82643),LL(0x73ce37f5,0xa165df13),LL(0xfe3a21fd,0xa744ef4f),
+ LL(0xcf551396,0x73f1e7f5),LL(0x868c676b,0xc616898e),LL(0x8c442c36,0x671c28c7),LL(0x5e0a317d,0xcfe5e558), LL(0x7051f476,0x1242d818),LL(0x14f03442,0x56fad2a6),LL(0x0a44d0f6,0x262068bc),LL(0xce6edf4e,0xdfa2cd6e),
+ LL(0xd15d1517,0x0f43813a),LL(0x377d44f5,0x61214cb2),LL(0xc639b35f,0xd399aa29),LL(0x54c51c19,0x42136d71), LL(0x08417221,0x9774711b),LL(0x52545a57,0x0a5546b3),LL(0x1150582d,0x80624c41),LL(0xfbc555bc,0x9ec5c418),
+ LL(0x771849f1,0x2c87dcad),LL(0x01d7bf6f,0xb0c932c5),LL(0x89116eb2,0x6aa5cd3e),LL(0x51ca7bd3,0xd378c25a), LL(0x9e6e3e31,0xc612a0da),LL(0xb68ad5d0,0x0417a54d),LL(0x22c6edb8,0x00451e4a),LL(0xb42827ce,0x9fbfe019),
+ LL(0xba9384a2,0x2fa92505),LL(0x64ad69c1,0x21b8596e),LL(0x983b35a6,0x8f4fcc49),LL(0x72754672,0xde093760), LL(0xf7bffe6d,0x2f14ccc8),LL(0x5d94263d,0x27566bff),LL(0x2df3ec30,0xb5b4e9c6),LL(0x3e6ea6ba,0x94f1d7d5),
+ LL(0xaaca5e9b,0x97b7851a),LL(0x56713b97,0x518aa521),LL(0x150a61f6,0x3357e8c7),LL(0xec2c2b69,0x7842e7e2), LL(0x6868a548,0x8dffaf65),LL(0xe068fc81,0xd963bd82),LL(0x65917733,0x64da5c8b),LL(0x7b247328,0x927090ff),
+},
+/* digit=22 base_pwr=2^154 */
+{
+ LL(0xd298c241,0x214bc9a7),LL(0x56807cfd,0xe3b697ba),LL(0x4564eadb,0xef1c7802),LL(0xb48149c5,0xdde8cdcf), LL(0x5a4d2604,0x946bf0a7),LL(0x6c1538af,0x27154d7f),LL(0xde5b1fcc,0x95cc9230),LL(0x66864f82,0xd88519e9),
+ LL(0x7cb1282c,0xb828dd1a),LL(0xbe46973a,0xa08d7626),LL(0xe708d6b2,0x6baf8d40),LL(0x4daeb3f3,0x72571fa1), LL(0xf22dfd98,0x85b1732f),LL(0x0087108d,0x87ab01a7),LL(0x5988207a,0xaaaafea8),LL(0x69f00755,0xccc832f8),
+ LL(0x36ff3bf0,0x964d950e),LL(0xf0b34638,0x8ad20f6f),LL(0xb5d7585f,0x4d9177b3),LL(0xef3f019f,0xcf839760), LL(0x8288c545,0x582fc5b3),LL(0x13116bd1,0x2f8e4e9b),LL(0x332120ef,0xf91e1b2f),LL(0x2a17dd23,0xcf568724),
+ LL(0xca8d9d1a,0x488f1185),LL(0xd987ded2,0xadf2c77d),LL(0x60c46124,0x5f3039f0),LL(0x71e095f4,0xe5d70b75), LL(0x6260e70f,0x82d58650),LL(0xf750d105,0x39d75ea7),LL(0x75bac364,0x8cf3d0b1),LL(0x21d01329,0xf3a7564d),
+ LL(0x2f52d2a7,0x182f04cd),LL(0xe2df565a,0x4fde149a),LL(0xa79fb2f7,0xb80c5eec),LL(0x22ddc897,0xab491d7b), LL(0xc6312c7f,0x99d76c18),LL(0x6aa41a57,0xca0d5f3d),LL(0xd15363a0,0x71207325),LL(0xbeb252c2,0xe82aa265),
+ LL(0xec3128c2,0x94ab4700),LL(0x8e383f49,0x6c76d862),LL(0xc03024eb,0xdc36b150),LL(0x53daac69,0xfb439477), LL(0x8dc79623,0xfc68764a),LL(0xb440fbb2,0x5b86995d),LL(0xccc5ee0d,0xd66879bf),LL(0x95aa8bd3,0x05228942),
+ LL(0x1e6a75c1,0xb51a40a5),LL(0x0ea7d817,0x24327c76),LL(0x07774597,0x06630182),LL(0x97fa7164,0xd6fdbec3), LL(0x13c90f48,0x20c99dfb),LL(0x686ef263,0xd6ac5273),LL(0xfef64eeb,0xc6a50bdc),LL(0x86fdfc32,0xcd87b281),
+ LL(0x3fcd3efc,0xb24aa43e),LL(0xb8088e9a,0xdd26c034),LL(0xbd3d46ea,0xa5ef4dc9),LL(0x8a4c6a6f,0xa2f99d58), LL(0x2f1da46c,0xddabd355),LL(0x1afacdd1,0x72c3f8ce),LL(0x92d40578,0xd90c4eee),LL(0xca623b94,0xd28bb41f),
+ LL(0x745edc11,0x50fc0711),LL(0x3dc87558,0x9dd9ad7d),LL(0xb49d1e64,0xce6931fb),LL(0xc98bd0f9,0x6c77a0a2), LL(0x6baf7cb1,0x62b9a629),LL(0xccf72d22,0xcf065f91),LL(0x79639071,0x7203cce9),LL(0xf9cb732f,0x09ae4885),
+ LL(0xee8314f3,0x5e7c3bec),LL(0xdbea298f,0x1c068aed),LL(0x7c80acec,0x08d381f1),LL(0xe330495b,0x03b56be8), LL(0x9222882d,0xaeffb8f2),LL(0xc4af8bf7,0x95ff38f6),LL(0x1fc57d8c,0x50e32d35),LL(0x17b444f0,0x6635be52),
+ LL(0xa5177900,0x04d15276),LL(0xf6858752,0x4e1dbb47),LL(0xc615796c,0x5b475622),LL(0x691867bf,0xa6fa0387), LL(0x2844c6d0,0xed7f5d56),LL(0x03a2477d,0xc633cf9b),LL(0x2d3721d6,0xf6be5c40),LL(0xe9fd68e6,0xaf312eb7),
+ LL(0xe7417ce1,0x242792d2),LL(0x970ee7f5,0xff42bc71),LL(0x5c67a41e,0x1ff4dc6d),LL(0x20882a58,0x77709b7b), LL(0xbe217f2c,0x3554731d),LL(0x5bb72177,0x2af2a8cd),LL(0x591dd059,0x58eee769),LL(0x4bba6477,0xbb2930c9),
+ LL(0x7d930cfc,0x863ee047),LL(0x396fd1f4,0x4c262ad1),LL(0x039af7e1,0xf4765bc8),LL(0x5ba104f6,0x2519834b), LL(0xd105f961,0x7cd61b4c),LL(0xd63bca54,0xa5415da5),LL(0x88a1f17c,0x778280a0),LL(0x2329512c,0xc4968949),
+ LL(0xcecdaa7a,0x174a9126),LL(0x0b13247b,0xfc8c7e0e),LL(0x3484c1c4,0x29c110d2),LL(0x831dfc3b,0xf8eb8757), LL(0xc0067452,0x022f0212),LL(0x7b9b926c,0x3f6f69ee),LL(0xef42daf4,0x09032da0),LL(0x83f80de4,0x79f00ade),
+ LL(0x81236c97,0x6210db71),LL(0x3ee0781f,0x74f7685b),LL(0xa3e41372,0x4df7da7b),LL(0xb1a1553e,0x2aae38b1), LL(0xf6dd9d1b,0x1688e222),LL(0x5b8b6487,0x57695448),LL(0x4b2edeaa,0x478d2127),LL(0x1e85956a,0xb2818fa5),
+ LL(0xf176f2c0,0x1e6addda),LL(0xe2572658,0x01ca4604),LL(0x85342ffb,0x0a404ded),LL(0x441838d6,0x8cf60f96), LL(0xc9071c4a,0x9bbc691c),LL(0x34442803,0xfd588744),LL(0x809c0d81,0x97101c85),LL(0x8c456f7f,0xa7fb754c),
+ LL(0xd51805e1,0xc95f3c5c),LL(0xb299dca8,0xab4ccd39),LL(0x47eaf500,0x3e03d20b),LL(0xd7b80893,0xfa3165c1), LL(0xe160e552,0x005e8b54),LL(0x9019d11f,0xdc4972ba),LL(0x0c9a4a7a,0x21a6972e),LL(0x37840fd7,0xa52c258f),
+ LL(0xc1e99d81,0xf8559ff4),LL(0xa3c617c0,0x08e1a7d6),LL(0x248c6ba7,0xb398fd43),LL(0xd1283794,0x6ffedd91), LL(0xd629d208,0x8a6a59d2),LL(0x3490530e,0xa9d141d5),LL(0x38505989,0x42f6fc18),LL(0x479d94ee,0x09bf250d),
+ LL(0xb3822790,0x223ad3b1),LL(0x93b8971c,0x6c5926c0),LL(0x75f7fa62,0x609efc7e),LL(0x1ec2d989,0x45d66a6d), LL(0x987d2792,0x4422d663),LL(0x3eb31d2b,0x4a73caad),LL(0xa32cb9e6,0xf06c2ac1),LL(0x91aeba84,0xd9445c5f),
+ LL(0xaf71013f,0x6af7a1d5),LL(0x0bedc946,0xe68216e5),LL(0xd27370a0,0xf4cba30b),LL(0x870421cc,0x7981afbf), LL(0x9449f0e1,0x02496a67),LL(0x0a47edae,0x86cfc4be),LL(0xb1feca22,0x3073c936),LL(0x03f8f8fb,0xf5694612),
+ LL(0x901515ea,0xd063b723),LL(0x749cf038,0x4c6c77a5),LL(0xab9e5059,0x6361e360),LL(0xa76a37c0,0x596cf171), LL(0x6530ae7a,0x800f53fa),LL(0x0792a7a6,0x0f5e631e),LL(0xefdb81c9,0x5cc29c24),LL(0x3f9c40ba,0xa269e868),
+ LL(0x2cb7191e,0xec14f9e1),LL(0xe5b08ea6,0x78ea1bd8),LL(0x46332bb9,0x3c65aa9b),LL(0xbf80ce25,0x84cc22b3), LL(0xd49d5bf1,0x0098e9e9),LL(0x19087da4,0xcd4ec1c6),LL(0xaef6e357,0x3c9d07c5),LL(0x9f8f64b8,0x839a0268),
+ LL(0xc6d8607f,0xc5e9eb62),LL(0x6aa995e4,0x759689f5),LL(0xbbb48317,0x70464669),LL(0xe402417d,0x921474bf), LL(0x2a354c8c,0xcabe135b),LL(0x812fa4b5,0xd51e52d2),LL(0x53311fe8,0xec741096),LL(0xb864514b,0x4f774535),
+ LL(0x5bde48f8,0xbcadd671),LL(0x2189bc7d,0xc9703873),LL(0xc709ee8a,0x5d45299e),LL(0x845aaff8,0xd1287ee2), LL(0xdb1dbf1f,0x7d1f8874),LL(0x990c88d6,0xea46588b),LL(0x84368313,0x60ba649a),LL(0x60d543ae,0xd5fdcbce),
+ LL(0x810d5ab0,0x90b46d43),LL(0x04d7e5cc,0x6739d8f9),LL(0x0d337c33,0x021c1a58),LL(0x68e67c40,0x00a61162), LL(0x379f0a1f,0x95ef413b),LL(0xe9e2ab95,0xfe126605),LL(0x2f5f199c,0x67578b85),LL(0x2cb84913,0xf5c00329),
+ LL(0x37577dd8,0xf7956430),LL(0x29c5fe88,0x83b82af4),LL(0xcdbdc132,0x9c1bea26),LL(0x9c04339e,0x589fa086), LL(0xb13799df,0x033e9538),LL(0xd295d034,0x85fa8b21),LL(0xbd9ddcca,0xdf17f73f),LL(0xddb66334,0xf32bd122),
+ LL(0x858b044c,0x55ef88a7),LL(0x5aa9e397,0x1f0d69c2),LL(0x40d85559,0x55fd9cc3),LL(0x7785ddb2,0xc774df72), LL(0xd3bd2e1c,0x5dcce9f6),LL(0xa85dfed0,0xeb30da20),LL(0xd3ed09c4,0x5ed7f5bb),LL(0x82a9c1bd,0x7d42a35c),
+ LL(0x9890272d,0xcf3de995),LL(0x3e713a10,0x75f3432a),LL(0xe28227b8,0x5e13479f),LL(0xfefacdc8,0xb8561ea9), LL(0x8332aafd,0xa6a297a0),LL(0x73809b62,0x9b0d8bb5),LL(0x0c63036f,0xd2fa1cfd),LL(0xbd64bda8,0x7a16eb55),
+ LL(0x78e62ddc,0x3f5cf5f6),LL(0x07fd752b,0x2267c454),LL(0x5e437bbe,0x5e361b6b),LL(0x8354e075,0x95c59501), LL(0xf2b254d9,0xec725f85),LL(0x2cb52b4e,0x844b617d),LL(0xcf425fb5,0xed8554f5),LL(0x2af9f312,0xab67703e),
+ LL(0x3cf48283,0x4cc34ec1),LL(0x9c8a705e,0xb09daa25),LL(0x5b7d4f84,0xd1e9d0d0),LL(0xdb38929d,0x4df6ef64), LL(0xaa21ba46,0xe16b0763),LL(0xa293f8fb,0xc6b1d178),LL(0xd520aabf,0x0ff5b602),LL(0xc339397a,0x94d671bd),
+ LL(0x4f5792fa,0x7c7d98cf),LL(0x11215261,0x7c5e0d67),LL(0xa7c5a6d4,0x9b19a631),LL(0x7a45274d,0xc8511a62), LL(0xa5a60d99,0x0c16621c),LL(0xcf5e48cb,0xf7fbab88),LL(0xf7ddee08,0xab1e6ca2),LL(0xe7867f3c,0x83bd08ce),
+ LL(0x2ac13e27,0xf7e48e8a),LL(0x4eb1a9f5,0x4494f6df),LL(0x981f0a62,0xedbf84eb),LL(0x536438f0,0x49badc32), LL(0x004f7571,0x50bea541),LL(0xdf1c94ee,0xbac67d10),LL(0xb727bc31,0x253d73a1),LL(0x30686e28,0xb3d01cf2),
+ LL(0x55fd0b8b,0x51b77b1b),LL(0xfeec3173,0xa099d183),LL(0x670e72b7,0x202b1fb7),LL(0xa8e1635f,0xadc88b33), LL(0xf989d905,0x34e8216a),LL(0x29b58d01,0xc2e68d20),LL(0x6fe55a93,0x11f81c92),LL(0x8f296f40,0x15f1462a),
+ LL(0xea3d62f2,0x1915d375),LL(0x01c8977d,0xa17765a3),LL(0xe47b26f6,0x7559710a),LL(0x535077a5,0xe0bd29c8), LL(0x08d84858,0x615f976d),LL(0x69ced5c1,0x370dfe85),LL(0xa734fa56,0xbbc7503c),LL(0x91ac4574,0xfbb9f1ec),
+ LL(0x060dd7ef,0x95d7ec53),LL(0x6e657979,0xeef2dacd),LL(0xe2a08235,0x54511af3),LL(0x1f4aea3d,0x1e324aa4), LL(0xe6e67671,0x550e7e71),LL(0xbf52faf7,0xbccd5190),LL(0x223cc62a,0xf880d316),LL(0x2b32eb5d,0x0d402c7e),
+ LL(0x306a5a3b,0xa40bc039),LL(0x96783a1b,0x4e0a41fd),LL(0x0253cdd4,0xa1e8d39a),LL(0xc7388638,0x6480be26), LL(0x2285f382,0xee365e1d),LL(0xec0b5c36,0x188d8d8f),LL(0x1f0f4d82,0x34ef1a48),LL(0xa487d29a,0x1a8f43e1),
+ LL(0x77aefb3a,0x8168226d),LL(0x1e72c253,0xf69a751e),LL(0xe9594df1,0x8e04359a),LL(0xd14c0467,0x475ffd7d), LL(0x3844e95c,0xb5a2c2b1),LL(0xdd12ef94,0x85caf647),LL(0xf1063d00,0x1ecd2a9f),LL(0x23843311,0x1dd2e229),
+ LL(0x73d17244,0x38f0e09d),LL(0x8fc653f1,0x3ede7746),LL(0xdc20e21c,0xae4459f5),LL(0x6a8599ea,0x00db2ffa), LL(0x30cfd905,0x11682c39),LL(0xa5c112a6,0x4934d074),LL(0x568bfe95,0xbdf063c5),LL(0x016c441a,0x779a440a),
+ LL(0x97d6fbdc,0x0c23f218),LL(0xe0776aac,0xd3a5cd87),LL(0xd712e8db,0xcee37f72),LL(0x26f74e8d,0xfb28c70d), LL(0xb61301a0,0xffe0c728),LL(0xd3724354,0xa6282168),LL(0x768ffedc,0x7ff4cb00),LL(0x03b02de9,0xc51b3088),
+ LL(0x3902dda5,0xa5a8147c),LL(0xfe6973b4,0x35d2f706),LL(0xc257457e,0x5ac2efcf),LL(0x8700611b,0x933f48d4), LL(0x4912beb2,0xc365af88),LL(0x162edf94,0x7f5a4de6),LL(0x0c32f34b,0xc646ba7c),LL(0xb2091074,0x632c6af3),
+ LL(0x753e43a9,0x58d4f2e3),LL(0x24d4e23f,0x70e1d217),LL(0xafede6a6,0xb24bf729),LL(0x710c8b60,0x7f4a94d8), LL(0x8d4faa6a,0xaad90a96),LL(0xb066b690,0xd9ed0b32),LL(0x78b6dbfd,0x52fcd37b),LL(0x8bd2b431,0x0b64615e),
+ LL(0xcfb9fad5,0x228e2048),LL(0x240b76bd,0xbeaa386d),LL(0x90dad7bc,0x2d6681c8),LL(0x06d38f5e,0x3e553fc3), LL(0x9d5f9750,0xf27cdb9b),LL(0xd28c5b0e,0x3e85c52a),LL(0x5247c39b,0x190795af),LL(0xbddd6828,0x547831eb),
+ LL(0x4a82f424,0xf327a227),LL(0x7e47f89d,0x36919c78),LL(0x43c7392c,0xe4783919),LL(0x2316fefe,0xf101b9aa), LL(0x1c5009d2,0xbcdc9e9c),LL(0x9cd18345,0xfb55ea13),LL(0xa3ce77c7,0xf5b5e231),LL(0xd2f2cb3d,0xde6b4527),
+ LL(0x9bb26f5f,0x10f6a333),LL(0x044d85b6,0x1e85db8e),LL(0x94197e54,0xc3697a08),LL(0xa7cb4ea8,0x65e18cc0), LL(0xa471fe6e,0xa38c4f50),LL(0x2f13439c,0xf031747a),LL(0xc007318b,0x53c4a6ba),LL(0x1deccb3d,0xa8da3ee5),
+ LL(0x558216b1,0x0555b31c),LL(0x2f79e6c2,0x90c7810c),LL(0xfe8eed3c,0x9b669f4d),LL(0xe0fac126,0x70398ec8), LL(0xf701b235,0xa96a449e),LL(0xeb94f395,0x0ceecdb3),LL(0xd0cb7431,0x285fc368),LL(0x16a18c64,0x0d37bb52),
+ LL(0xb880d2dd,0x05110d38),LL(0x65930d57,0xa60f177b),LL(0xf36235f5,0x7da34a67),LL(0x183816b9,0x47f5e17c), LL(0xdb394af4,0xc7664b57),LL(0x7036f789,0x39ba215d),LL(0x2f27b472,0x46d2ca0e),LL(0xf73a84b7,0xc42647ee),
+ LL(0x64488f1d,0x44bc7545),LL(0xf4cf85d5,0xaa922708),LL(0x53e4df63,0x721a01d5),LL(0x5db46ced,0x649c0c51), LL(0x3cffcb6c,0x6bf0d64e),LL(0x50f71d96,0xe3bf93fe),LL(0xbcc194a0,0x75044558),LL(0x6afdc554,0x16ae3372),
+ LL(0x5ca48f3f,0xbfc01adf),LL(0xe22a9b84,0x64352f06),LL(0xc1099e4a,0xcee54da1),LL(0xfa1b89c0,0xbbda54e8), LL(0x6f6e55fb,0x166a3df5),LL(0x20176f88,0x1ca44a24),LL(0xdfb7b5ff,0x936afd88),LL(0x8611d4a0,0xe34c2437),
+ LL(0x86142103,0x7effbb75),LL(0x1f34fc4d,0x6704ba1b),LL(0x10c1b122,0x7c2a468f),LL(0x8c6aace9,0x36b3a610), LL(0x75a0d050,0xabfcc0a7),LL(0x3ce33e32,0x066f9197),LL(0x29fe09be,0xce905ef4),LL(0xa8376351,0x89ee25ba),
+ LL(0xfd29dc76,0x2a3ede22),LL(0x36f17260,0x7fd32ed9),LL(0x284b4126,0x0cadcf68),LL(0xa7951fc8,0x63422f08), LL(0x0807e199,0x562b24f4),LL(0x22ad4490,0xfe9ce5d1),LL(0x0db2b1b4,0xc2f51b10),LL(0xe4541d0d,0xeb3613ff),
+ LL(0x2680813b,0xbd2c4a05),LL(0x561b08d6,0x527aa55d),LL(0xa7205558,0xa9f8a40e),LL(0x243d0bec,0xe3eea56f), LL(0xa0ff58b3,0x7b853817),LL(0x1a69e627,0xb67d3f65),LL(0xa869b5d6,0x0b76bbb9),LL(0x546723ed,0xa3afeb82),
+ LL(0x3e554892,0x5f24416d),LL(0x430e2a45,0x8413b53d),LL(0x9032a2a0,0x99c56aee),LL(0xeec367b1,0x09432bf6), LL(0xdaf0ecc1,0x552850c6),LL(0x5bc92048,0x49ebce55),LL(0x54811307,0xdfb66ba6),LL(0x6f298597,0x1b84f797),
+ LL(0x8d1d7a0d,0x79590481),LL(0x3a6fa556,0xd9fabe03),LL(0xba9e5d35,0xa40f9c59),LL(0xf6247577,0xcb1771c1), LL(0xe9a6312b,0x542a47ca),LL(0x552dd8c5,0xa34b3560),LL(0x0d794716,0xfdf94de0),LL(0x9c623094,0xd46124a9),
+ LL(0x68afe8b4,0x56b7435d),LL(0x6c0d8ea1,0x27f20540),LL(0x73186898,0x12b77e14),LL(0x7479490f,0xdbc3dd46), LL(0xc03b0c05,0x951a9842),LL(0x7921bc96,0x8b1b3bb3),LL(0x2b202e0a,0xa573b346),LL(0x47254d56,0x77e4665d),
+ LL(0xd23e3984,0x08b70dfc),LL(0xebd14236,0xab86e8bc),LL(0x57114ba7,0xaa3e07f8),LL(0xab0ef4f2,0x5ac71689), LL(0x0139d9af,0x88fca384),LL(0x76644af0,0x72733f88),LL(0x65d74f4a,0xf122f72a),LL(0xa5626c7a,0x13931577),
+ LL(0x70f8d5a4,0xd5b5d9eb),LL(0xd7bbb228,0x375adde7),LL(0x0c1c0b32,0x31e88b86),LL(0x173edbaa,0xd1f568c4), LL(0x5459df02,0x1592fc83),LL(0x0fcd9a7e,0x2beac0fb),LL(0x1b473b0a,0xb0a6fdb8),LL(0x0fe8fc48,0xe3224c6f),
+ LL(0xe87edf5b,0x680bd00e),LL(0x20e77cf5,0x30385f02),LL(0x4d42d1b2,0xe9ab98c0),LL(0xd3816d77,0x72d191d2), LL(0x0917d9e5,0x1564daca),LL(0x1f8fed7f,0x394eab59),LL(0x7fbb3896,0xa209aa8d),LL(0xbe6ac98e,0x5564f3b9),
+ LL(0xd73654ef,0xead21d05),LL(0x13d78d74,0x68d1a9c4),LL(0x6d4973a0,0x61e01708),LL(0x46e6d32a,0x83da3500), LL(0x68ae0118,0x6a3dfca4),LL(0xd02da069,0xa1b9a4c9),LL(0xebab8302,0x0b2ff9c7),LL(0x944ba436,0x98af07c3),
+ LL(0x995f0f9f,0x85997326),LL(0x71b58bc6,0x467fade0),LL(0xbd625a2b,0x47e4495a),LL(0x33c3b8cd,0xfdd2d01d), LL(0xc693f9fa,0x2c38ae28),LL(0x348f7999,0x48622329),LL(0x2161f583,0x97bf738e),LL(0x565e8cc9,0x15ee2fa7),
+ LL(0x5777e189,0xa1a5c845),LL(0x456f2829,0xcc10bee0),LL(0xda762bd5,0x8ad95c56),LL(0xe9d91da8,0x152e2214), LL(0x7cb23c74,0x975b0e72),LL(0xa90c66df,0xfd5d7670),LL(0x225ffc53,0xb5b5b8ad),LL(0xfaded2ae,0xab6dff73),
+ LL(0x6f4cbe9d,0xebd56781),LL(0x6a574bd7,0x0ed8b249),LL(0x81a881fa,0x41c246fe),LL(0xc3db9c70,0x91564805), LL(0x5b862809,0xd7c12b08),LL(0x55858d7b,0x1facd1f1),LL(0xaf09e92a,0x7693747c),LL(0x189a425f,0x3b69dcba),
+ LL(0x967365ef,0x0be28e9f),LL(0xe801f5c9,0x57300eb2),LL(0xd583352f,0x93b8ac6a),LL(0xcd05b2b7,0xa2cf1f89), LL(0x4dcc40cc,0x7c0c9b74),LL(0xada523fb,0xfee38c45),LL(0x1099cc4d,0xb49a4dec),LL(0x69f069c6,0x325c377f),
+ LL(0x476cc9ff,0xe12458ce),LL(0xc6d4cb63,0x580e0b6c),LL(0x9072289b,0xd561c8b7),LL(0xa619e6da,0x0377f264), LL(0x88e591a5,0x26685362),LL(0x7523ca2b,0xa453a7bd),LL(0xc1df4533,0x8a9536d2),LL(0xbe972f79,0xc8e50f2f),
+ LL(0x6d3549cf,0xd433e50f),LL(0xfacd665e,0x6f33696f),LL(0xce11fcb4,0x695bfdac),LL(0xaf7c9860,0x810ee252), LL(0x7159bb2c,0x65450fe1),LL(0x758b357b,0xf7dfbebe),LL(0xd69fea72,0x2b057e74),LL(0x92731745,0xd485717a),
+},
+/* digit=23 base_pwr=2^161 */
+{
+ LL(0xee36860c,0x896c42e8),LL(0x4113c22d,0xdaf04dfd),LL(0x44104213,0x1adbb7b7),LL(0x1fd394ea,0xe5fd5fa1), LL(0x1a4e0551,0x68235d94),LL(0x18d10151,0x6772cfbe),LL(0x09984523,0x276071e3),LL(0x5a56ba98,0xe4e879de),
+ LL(0x285b9491,0xaaafafb0),LL(0x1e4c705e,0x01a0be88),LL(0x2ad9caab,0xff1d4f5d),LL(0xc37a233f,0x6e349a4a), LL(0x4a1c6a16,0xcf1c1246),LL(0x29383260,0xd99e6b66),LL(0x5f6d5471,0xea3d4366),LL(0xff8cc89b,0x36974d04),
+ LL(0xcfe89d80,0xc26c49a1),LL(0xda9c8371,0xb42c026d),LL(0xdad066d2,0xca6c013a),LL(0x56a4f3ee,0xfb8f7228), LL(0xd850935b,0x08b579ec),LL(0xd631e1b3,0x34c1a74c),LL(0xac198534,0xcb5fe596),LL(0xe1f24f25,0x39ff21f6),
+ LL(0x8f929057,0x27f29e14),LL(0xc0c853df,0x7a64ae06),LL(0x58e9c5ce,0x256cd183),LL(0xded092a5,0x9d9cce82), LL(0x6e93b7c7,0xcc6e5979),LL(0x31bb9e27,0xe1e47092),LL(0xaa9e29a0,0xb70b3083),LL(0x3785e644,0xbf181a75),
+ LL(0x8ead09f7,0xf53f2c65),LL(0x9780d14d,0x1335e1d5),LL(0xcd1b66bc,0x69cc20e0),LL(0xbbe0bfc8,0x9b670a37), LL(0x28efbeed,0xce53dc81),LL(0x8326a6e5,0x0c74e77c),LL(0xb88e9a63,0x3604e0d2),LL(0x13dc2248,0xbab38fca),
+ LL(0x5c0a3f1e,0x8ed6e8c8),LL(0x7c87c37f,0xbcad2492),LL(0x9ee3b78d,0xfdfb62bb),LL(0xcbceba46,0xeba8e477), LL(0xeeaede4b,0x37d38cb0),LL(0x7976deb6,0x0bc498e8),LL(0x6b6147fb,0xb2944c04),LL(0xf71f9609,0x8b123f35),
+ LL(0xde79dc24,0xa155dcc7),LL(0x558f69cd,0xf1168a32),LL(0x0d1850df,0xbac21595),LL(0xb204c848,0x15c8295b), LL(0x7d8184ff,0xf661aa36),LL(0x30447bdb,0xc396228e),LL(0xbde4a59e,0x11cd5143),LL(0x6beab5e6,0xe3a26e3b),
+ LL(0x1402b9d0,0xd3b3a13f),LL(0x2c7bc863,0x573441c3),LL(0x578c3e6e,0x4b301ec4),LL(0x0adaf57e,0xc26fc9c4), LL(0x7493cea3,0x96e71bfd),LL(0x1af81456,0xd05d4b3f),LL(0x6a8c608f,0xdaca2a8a),LL(0x0725b276,0x53ef07f6),
+ LL(0x7824fc56,0x07a5fbd2),LL(0x13289077,0x34675218),LL(0xe0c48349,0x5bf69fd5),LL(0xb6aa7875,0xa613ddd3), LL(0x5450d866,0x7f78c19c),LL(0x8f84a481,0x46f4409c),LL(0x90fce239,0x9f1d1928),LL(0xb2ce44b9,0x016c4168),
+ LL(0xc7435978,0xbae023f0),LL(0x20e30e19,0xb152c888),LL(0xe3fa6faf,0x9c241645),LL(0x84823e60,0x735d95c1), LL(0x03955317,0x03197573),LL(0xf03b4995,0x0b4b02a9),LL(0x70274600,0x076bf559),LL(0xaaf57508,0x32c5cc53),
+ LL(0x60624129,0xe8af6d1f),LL(0x9a5e2b5e,0xb7bc5d64),LL(0x5f082d72,0x3814b048),LL(0xce19677a,0x76f267f2), LL(0xb36eed93,0x626c630f),LL(0x3bf56803,0x55230cd7),LL(0xce2736a0,0x78837949),LL(0xaa6c55f1,0x0d792d60),
+ LL(0xd5c7c5d2,0x0318dbfd),LL(0x072b342d,0xb38f8da7),LL(0x7b8de38a,0x3569bddc),LL(0xa1c94842,0xf25b5887), LL(0x2946ad60,0xb2d5b284),LL(0xe9d1707e,0x854f29ad),LL(0x2c6a4509,0xaa5159dc),LL(0x57189837,0x899f94c0),
+ LL(0xf4a55b03,0xcf6adc51),LL(0x35e3b2d5,0x261762de),LL(0x04827b51,0x4cc43012),LL(0xc6021442,0xcd22a113), LL(0x247c9569,0xce2fd61a),LL(0xd152beca,0x59a50973),LL(0x63a716d4,0x6c835a11),LL(0x187dedcf,0xc26455ed),
+ LL(0x49ce89e7,0x27f536e0),LL(0xcc890cb5,0x18908539),LL(0xd83c2aa1,0x308909ab),LL(0x1ab73bd3,0xecd3142b), LL(0xb3f5ab84,0x6a85bf59),LL(0xf2bea4c6,0x3c320a68),LL(0x6da4541f,0xad8dc538),LL(0xb7c41186,0xeaf34eb0),
+ LL(0x977c97c4,0x1c780129),LL(0xc57eb9fa,0x5ff9beeb),LL(0xc822c478,0xa24d0524),LL(0x461cd415,0xfd8eec2a), LL(0xf027458c,0xfbde194e),LL(0x1d1be115,0xb4ff5319),LL(0x4866d6f4,0x63f874d9),LL(0xb21ad0c9,0x35c75015),
+ LL(0x46ac49d2,0xa6b5c9d6),LL(0x83137aa9,0x42c77c0b),LL(0x68225a38,0x24d000fc),LL(0x2fe1e907,0x0f63cfc8), LL(0xc6441f95,0x22d1b01b),LL(0xec8e448f,0x7d38f719),LL(0x787fb1ba,0x9b33fa5f),LL(0x190158df,0x94dcfda1),
+ LL(0x5f6d4a09,0xc47cb339),LL(0xee52b826,0x6b4f355c),LL(0xf51b930a,0x3d100f5d),LL(0x9f668f69,0xf4512fac), LL(0x206c4c74,0x546781d5),LL(0xcb4d2e48,0xd021d4d4),LL(0xca085c2d,0x494a54c2),LL(0x520850a8,0xf1dbaca4),
+ LL(0x490a1aca,0x63c79326),LL(0x41526b02,0xcb64dd9c),LL(0xa2979258,0xbb772591),LL(0x48d97846,0x3f582970), LL(0x7c213ba7,0xd66b70d1),LL(0xe8a0ced4,0xc28febb5),LL(0xc10338c1,0x6b911831),LL(0xbf0126f3,0x0d54e389),
+ LL(0x4af206ee,0x7048d460),LL(0x77e97cb9,0x786c88f6),LL(0xac64802e,0xd4375ae1),LL(0xd53ec11c,0x469bcfe1), LL(0x47062230,0xfc9b340d),LL(0xc5b4a3ac,0xe743bb57),LL(0x59ef45ac,0xfe00b4aa),LL(0x59edf188,0x29a4ef23),
+ LL(0xb483689b,0x40242efe),LL(0x513ac262,0x2575d3f6),LL(0x0ca6db72,0xf30037c8),LL(0x98864be2,0xc9fcce82), LL(0x0149362d,0x84a112ff),LL(0x1c4ae971,0x95e57582),LL(0x945cf86c,0x1fa4b1a8),LL(0x0b024a2f,0x4525a734),
+ LL(0x8f338360,0xe76c8b62),LL(0x28edf32b,0x483ff593),LL(0x298b1aec,0x67e8e90a),LL(0x736d9a21,0x9caab338), LL(0x66892709,0x5c09d2fd),LL(0xb55a1d41,0x2496b4dc),LL(0xe24a4394,0x93f5fb1a),LL(0x6fa8f6c1,0x08c75049),
+ LL(0xc905d85f,0xcaead1c2),LL(0x0733ae57,0xe9d7f790),LL(0xf07cdd94,0x24c9a65c),LL(0xa4b55931,0x7389359c), LL(0x367e45f7,0xf58709b7),LL(0xcb7e7adc,0x1f203067),LL(0xc7b72818,0x82444bff),LL(0xbaac8033,0x07303b35),
+ LL(0xd13b7ea1,0x1e1ee4e4),LL(0xe0e74180,0xe6489b24),LL(0x7e70ef70,0xa5f2c610),LL(0xbdd10894,0xa1655412), LL(0x7af4194e,0x555ebefb),LL(0x8e89bd9c,0x533c1c3c),LL(0x89895856,0x735b9b57),LL(0x567f5c15,0x15fb3cd2),
+ LL(0x526f09fd,0x057fed45),LL(0x8128240a,0xe8a4f10c),LL(0xff2bfd8d,0x9332efc4),LL(0xbd35aa31,0x214e77a0), LL(0x14faa40e,0x32896d73),LL(0x01e5f186,0x767867ec),LL(0x17a1813e,0xc9adf8f1),LL(0x54741795,0xcb6cda78),
+ LL(0x349d51aa,0xb7521b6d),LL(0xe3c7b8e9,0xf56b5a9e),LL(0x32a096df,0xc6f1e5c9),LL(0xa3635024,0x083667c4), LL(0x18087f2f,0x365ea135),LL(0xd136e45d,0xf1b8eaac),LL(0x73aec989,0xc8a0e484),LL(0x142c9259,0xd75a324b),
+ LL(0x01dae185,0xb7b4d001),LL(0x9b7a94bc,0x45434e0b),LL(0xfbd8cb0b,0xf54339af),LL(0xe98ef49e,0xdcc4569e), LL(0x09a51299,0x7789318a),LL(0xb2b025d8,0x81b4d206),LL(0xfae85792,0xf64aa418),LL(0xacd7baf7,0x3e50258f),
+ LL(0x2996864b,0xdce84cdb),LL(0x1f485fa4,0xa2e67089),LL(0x534c6a5a,0xb28b2bb6),LL(0xc94b9d39,0x31a7ec6b), LL(0xd6bc20da,0x1d217766),LL(0x86761190,0x4acdb5ec),LL(0x73701063,0x68726328),LL(0x2128c29b,0x4d24ee7c),
+ LL(0xa19fd868,0xc072ebd3),LL(0xdb8ddd3b,0x612e481c),LL(0x1a64d852,0xb4e1d754),LL(0xc4c6c4ab,0x00ef95ac), LL(0xaa0a6c46,0x1536d2ed),LL(0x43774790,0x61294086),LL(0x343fda10,0x54af25e8),LL(0xfd25d6f2,0x9ff9d98d),
+ LL(0x468b8835,0x0746af7c),LL(0x730ecea7,0x977a31cb),LL(0xc2cf4a81,0xa5096b80),LL(0x6458c37a,0xaa986833), LL(0xa6bd9d34,0x6af29bf3),LL(0x33c5d854,0x6a62fe9b),LL(0xb7133b5e,0x50e6c304),LL(0x7d6e6848,0x04b60159),
+ LL(0x5579bea4,0x4cd296df),LL(0x5ceedaf1,0x10e35ac8),LL(0xe3bcc5b1,0x04c4c5fd),LL(0x89412cf9,0x95f9ee8a), LL(0x82b6eb0f,0x2c9459ee),LL(0x95c2aadd,0x2e845765),LL(0xd327fcfe,0x774a84ae),LL(0x0368d476,0xd8c93722),
+ LL(0xf83e8a3b,0x0dbd5748),LL(0x8d2495f3,0xa579aa96),LL(0xae496e9b,0x535996a0),LL(0xb7f9bcc2,0x07afbfe9), LL(0x5b7bd293,0x3ac1dc6d),LL(0x7022323d,0x3b592cff),LL(0x9c0a3e76,0xba0deb98),LL(0x4b197acb,0x18e78e9f),
+ LL(0x296c36ef,0x211cde10),LL(0x82c4da77,0x7ee89672),LL(0xa57836da,0xb617d270),LL(0x9cb7560b,0xf0cd9c31), LL(0xe455fe90,0x01fdcbf7),LL(0x7e7334f3,0x3fb53cbb),LL(0x4e7de4ec,0x781e2ea4),LL(0x0b384fd0,0x8adab3ad),
+ LL(0x53d64829,0x129eee2f),LL(0xa261492b,0x7a471e17),LL(0xe4cb4a2c,0xe4f9adb9),LL(0x97ba2c2d,0x3d359f6f), LL(0x0aacd697,0x346c6786),LL(0x75c2f8a8,0x92b444c3),LL(0xd85df44e,0xc79fa117),LL(0x398ddf31,0x56782372),
+ LL(0xbbbab3b8,0x60e690f2),LL(0x8b04816b,0x4851f8ae),LL(0x9c92e4d2,0xc72046ab),LL(0x7cf3136b,0x518c74a1), LL(0xf9877d4c,0xff4eb50a),LL(0xa919cabb,0x14578d90),LL(0xac5eb2b6,0x8218f8c4),LL(0x542016e4,0xa3ccc547),
+ LL(0x327f8349,0x025bf48e),LL(0xf43cb641,0xf3e97346),LL(0x500f1085,0xdc2bafdf),LL(0x2f063055,0x57167876), LL(0x411925a6,0x5bd914b9),LL(0xa1123de5,0x7c078d48),LL(0x182b165d,0xee6bf835),LL(0xba519727,0xb11b5e5b),
+ LL(0x1eea7b85,0xe33ea76c),LL(0x92d4f85e,0x2352b461),LL(0xafe115bb,0xf101d334),LL(0x889175a3,0xfabc1294), LL(0x5233f925,0x7f6bcdc0),LL(0xe77fec55,0xe0a802db),LL(0x8069b659,0xbdb47b75),LL(0xf98fbd74,0x1c5e12de),
+ LL(0x4b8457ee,0x869c58c6),LL(0x4f7ea9f7,0xa5360f69),LL(0xf460b38f,0xe576c09f),LL(0x22b7fb36,0x6b70d548), LL(0x3bfae315,0x3fd237f1),LL(0xcbdff369,0x33797852),LL(0x25b516f9,0x97df25f5),LL(0xba38ad2d,0x46f388f2),
+ LL(0x89d8ddbb,0x656c4658),LL(0x70f38ee8,0x8830b26e),LL(0xde1212b0,0x4320fd5c),LL(0xe4a2edb2,0xc34f30cf), LL(0x56ab64b8,0xabb131a3),LL(0xd99c5d26,0x7f77f0cc),LL(0xbf981d94,0x66856a37),LL(0x738bd76e,0x19e76d09),
+ LL(0x96238f39,0xe76c8ac3),LL(0xa830b366,0xc0a482be),LL(0x0b4eb499,0xb7b8eaff),LL(0x4bfb4865,0x8ecd83bc), LL(0xa2f3776f,0x971b2cb7),LL(0xf4b88adf,0xb42176a4),LL(0xbe1fa446,0xb9617df5),LL(0xcd031bd2,0x8b32d508),
+ LL(0x53b618c0,0x1c6bd47d),LL(0x6a227923,0xc424f46c),LL(0xdd92d964,0x7303ffde),LL(0x71b5abf2,0xe9712878), LL(0xf815561d,0x8f48a632),LL(0xd3c055d1,0x85f48ff5),LL(0x7525684f,0x222a1427),LL(0x67360cc3,0xd0d841a0),
+ LL(0x0b9267c6,0x4245a926),LL(0xcf07f863,0xc78913f1),LL(0x4d0d9e24,0xaa844c8e),LL(0x3d5f9017,0xa42ad522), LL(0xa2c989d5,0xbd371749),LL(0xe1f5e78e,0x928292df),LL(0x0a1ea6da,0x493b383e),LL(0x13aee529,0x5136fd8d),
+ LL(0xf2c34a99,0x860c44b1),LL(0xbf5855ac,0x3b00aca4),LL(0xfaaf37be,0xabf6aaa0),LL(0x2a53ec08,0x65f43682), LL(0xa11b12e1,0x1d9a5801),LL(0xe20ed475,0x78a7ab2c),LL(0x9a41e0d5,0x0de1067e),LL(0x305023ea,0x30473f5f),
+ LL(0x169c7d97,0xdd3ae09d),LL(0xcfaef9cd,0x5cd5baa4),LL(0x65a44803,0x5cd7440b),LL(0x47f364de,0xdc13966a), LL(0x2b8357c1,0x077b2be8),LL(0xe9d57c2a,0x0cb1b4c5),LL(0x05ff363e,0x7a4ceb32),LL(0xca35a9ef,0xf310fa4d),
+ LL(0xf97f68c6,0xdbb7b352),LL(0x0b02cf58,0x0c773b50),LL(0x3c1f96d9,0xea2e4821),LL(0xeee01815,0xffb357b0), LL(0xe0f28039,0xb9c924cd),LL(0x46a3fbe4,0x0b36c95a),LL(0x5e46db6c,0x1faaaea4),LL(0x1928aaff,0xcae575c3),
+ LL(0xa70dab86,0x7f671302),LL(0x71c58cfc,0xfcbd12a9),LL(0xbee0cb92,0xcbef9acf),LL(0xf8c1b583,0x573da0b9), LL(0x0d41d550,0x4752fcfe),LL(0x2155cffe,0xe7eec0e3),LL(0x545ae248,0x0fc39fcb),LL(0x8065f44e,0x522cb8d1),
+ LL(0x70cbb96c,0x263c962a),LL(0xbcd124a9,0xe034362a),LL(0x3c2ae58d,0xf120db28),LL(0xfef6d507,0xb9a38d49), LL(0x1ff140fd,0xb1fd2a82),LL(0x20aee7e0,0xbd162f30),LL(0xcb251949,0x4e17a5d4),LL(0x4f7e1c3d,0x2aebcb83),
+ LL(0x937b0527,0x608eb25f),LL(0xeb7d9997,0xf42e1e47),LL(0xb8a53a29,0xeba699c4),LL(0xe091b536,0x1f921c71), LL(0x5b26bbd5,0xcce29e7b),LL(0x3b61a680,0x7a8ef5ed),LL(0xba1f1c7e,0xe5ef8043),LL(0x18158dda,0x16ea8217),
+ LL(0x599ff0f9,0x01778a2b),LL(0x8104fc6b,0x68a923d7),LL(0xda694ff3,0x5bfa44df),LL(0xf7667f12,0x4f7199db), LL(0xe46f2a79,0xc06d8ff6),LL(0xe9f8131d,0x08b5dead),LL(0xabb4ce7c,0x02519a59),LL(0xb42aec3e,0xc4f710bc),
+ LL(0x78bde41a,0x3d77b057),LL(0xb4186b5a,0x6474bf80),LL(0x88c65741,0x048b3f67),LL(0x03c7c154,0xc64519de), LL(0x0edfcc4f,0xdf073846),LL(0x48f1aa6b,0x319aa737),LL(0xca909f77,0x8b9f8a02),LL(0x7580bfef,0x90258139),
+ LL(0xc0c22719,0xd8bfd3ca),LL(0xc9ca151e,0xc60209e4),LL(0xd9a1a69c,0x7a744ab5),LL(0x14937f8f,0x6de5048b), LL(0xe115ac04,0x171938d8),LL(0x1c6b16d2,0x7df70940),LL(0x7f8e94e7,0xa6aeb663),LL(0x2a2cf094,0xc130388e),
+ LL(0x77f54e6e,0x1850be84),LL(0x65d60fe5,0x9f258a72),LL(0x6c9146d6,0xff7ff0c0),LL(0xe63a830b,0x039aaf90), LL(0x9460342f,0x38f27a73),LL(0x3f795f8a,0x4703148c),LL(0x9681a97e,0x1bb5467b),LL(0xecaeb594,0x00931ba5),
+ LL(0x786f337c,0xcdb6719d),LL(0xe704397d,0xd9c01cd2),LL(0x555c2fef,0x0f4a3f20),LL(0x7c0af223,0x00452509), LL(0x84db8e76,0x54a58047),LL(0x93c8aa06,0x3bacf1aa),LL(0xf7919422,0x11ca957c),LL(0x78cdaa40,0x50641053),
+ LL(0x9f7144ae,0x7a303874),LL(0x43d4acfd,0x170c963f),LL(0x58ddd3ef,0x5e148149),LL(0x9e72dba8,0xa7bde582), LL(0x6fa68750,0x0769da8b),LL(0x572e0249,0xfa64e532),LL(0x2619ad31,0xfcaadf9d),LL(0xa7b349cd,0x87882daa),
+ LL(0x6c67a775,0x9f6eb731),LL(0xefc5d0b1,0xcb10471a),LL(0xe1b806b2,0xb433750c),LL(0x57b1ae7e,0x19c5714d), LL(0xed03fd3f,0xc0dc8b7b),LL(0x31bc194e,0xdd03344f),LL(0x8c6320b5,0xa66c52a7),LL(0xd0b6fd93,0x8bc82ce3),
+ LL(0xb35f1341,0xf8e13501),LL(0x25a43e42,0xe53156dd),LL(0x4daeb85c,0xd3adf27e),LL(0xbbeddeb5,0xb81d8379), LL(0x2e435867,0x1b0b546e),LL(0xeba5dd60,0x9020eb94),LL(0x8210cb9d,0x37d91161),LL(0x5c91f1cf,0x4c596b31),
+ LL(0x0e0b040d,0xb228a90f),LL(0x45ff897f,0xbaf02d82),LL(0x00fa6122,0x2aac79e6),LL(0x8e36f557,0x24828817), LL(0x113ec356,0xb9521d31),LL(0x15eff1f8,0x9e48861e),LL(0xe0d41715,0x2aa1d412),LL(0x53f131b8,0x71f86203),
+ LL(0x3fd19408,0xf60da8da),LL(0x278d9d99,0x4aa716dc),LL(0xa8c51c90,0x394531f7),LL(0xf59db51c,0xb560b0e8), LL(0xfa34bdad,0xa28fc992),LL(0x9cd4f8bd,0xf024fa14),LL(0x23a9d0d3,0x5cf530f7),LL(0xe28c9b56,0x615ca193),
+ LL(0x6f73c51e,0x6d2a483d),LL(0xea0dc2dd,0xa4cb2412),LL(0x1eb917ff,0x50663c41),LL(0xeade299e,0x3d3a74cf), LL(0x4a7a9202,0x29b3990f),LL(0xa7b15c3d,0xa9bccf59),LL(0xa5df9208,0x66a3ccdc),LL(0x43f2f929,0x48027c14),
+ LL(0x40b557f0,0xd385377c),LL(0xcd684660,0xe001c366),LL(0xe2183a27,0x1b18ed6b),LL(0x63210329,0x879738d8), LL(0xbda94882,0xa687c74b),LL(0xa684b299,0xd1bbcc48),LL(0x863b3724,0xaf6f1112),LL(0x2c8ce9f8,0x6943d1b4),
+ LL(0x098cafb4,0xe044a3bb),LL(0x60d48caf,0x27ed2310),LL(0x3a31b84d,0x542b5675),LL(0xfcddbed7,0xcbf3dd50), LL(0x41b1d830,0x25031f16),LL(0xcb0c1e27,0xa7ec851d),LL(0xb5ae75db,0xac1c8fe0),LL(0x08c52120,0xb24c7557),
+ LL(0x1d4636c3,0x57f811dc),LL(0x681a9939,0xf8436526),LL(0x9c81adb3,0x1f6bc6d9),LL(0x5b7d80d4,0x840f8ac3), LL(0xf4387f1a,0x731a9811),LL(0xb5156880,0x7c501cd3),LL(0xdfe68867,0xa5ca4a07),LL(0x5fcea120,0xf123d8f0),
+ LL(0xd607039e,0x1fbb0e71),LL(0xcd3a4546,0x2b70e215),LL(0x53324091,0x32d2f01d),LL(0x180ab19b,0xb796ff08), LL(0x3c57c4aa,0x32d87a86),LL(0xb7c49a27,0x2aed9caf),LL(0x31630d98,0x9fb35eac),LL(0x5c3e20a3,0x338e8cdf),
+ LL(0x66cde8db,0x80f16182),LL(0x2d72fd36,0x4e159980),LL(0x9b6e5072,0xd7b8f13b),LL(0x3b7b5dc1,0xf5213907), LL(0x8ce4396e,0x4d431f1d),LL(0xa7ed2142,0x37a1a680),LL(0xd01aaf6b,0xbf375696),LL(0xe63aab66,0xaa1c0c54),
+ LL(0x4ed80940,0x3014368b),LL(0x7a6fcedd,0x67e6d056),LL(0xca97579f,0x7c208c49),LL(0xa23597f6,0xfe3d7a81), LL(0x7e096ae2,0x5e203202),LL(0x24b39366,0xb1f3e1e7),LL(0x2fdcdffc,0x26da26f3),LL(0x6097be83,0x79422f1d),
+},
+/* digit=24 base_pwr=2^168 */
+{
+ LL(0x9db3b381,0x263a2cfb),LL(0xd4df0a4b,0x9c3a2dee),LL(0x7d04e61f,0x728d06e9),LL(0x42449325,0x8b1adfbc), LL(0x7e053a1b,0x6ec1d939),LL(0x66daf707,0xee2be5c7),LL(0x810ac7ab,0x80ba1e14),LL(0xf530f174,0xdd2ae778),
+ LL(0x205b9d8b,0x0435d97a),LL(0x056756d4,0x6eb8f064),LL(0xb6f8210e,0xd5e88a8b),LL(0xec9fd9ea,0x070ef12d), LL(0x3bcc876a,0x4d849505),LL(0xa7404ce3,0x12a75338),LL(0xb8a1db5e,0xd22b49e1),LL(0x14bfa5ad,0xec1f2051),
+ LL(0xb6828f36,0xadbaeb79),LL(0x01bd5b9e,0x9d7a0258),LL(0x1e844b0c,0xeda01e0d),LL(0x887edfc9,0x4b625175), LL(0x9669b621,0x14109fdd),LL(0xf6f87b98,0x88a2ca56),LL(0x170df6bc,0xfe2eb788),LL(0xffa473f9,0x0cea06f4),
+ LL(0xc4e83d33,0x43ed81b5),LL(0x5efd488b,0xd9f35879),LL(0x9deb4d0f,0x164a620f),LL(0xac6a7394,0xc6927bdb), LL(0x9f9e0f03,0x45c28df7),LL(0xfcd7e1a9,0x2868661e),LL(0xffa348f1,0x7cf4e8d0),LL(0x398538e0,0x6bd4c284),
+ LL(0x289a8619,0x2618a091),LL(0x6671b173,0xef796e60),LL(0x9090c632,0x664e46e5),LL(0x1e66f8fb,0xa38062d4), LL(0x0573274e,0x6c744a20),LL(0xa9271394,0xd07b67e4),LL(0x6bdc0e20,0x391223b2),LL(0xeb0a05a7,0xbe2d93f1),
+ LL(0x3f36d141,0xf23e2e53),LL(0x4dfca442,0xe84bb3d4),LL(0x6b7c023a,0xb804a48d),LL(0x76431c3b,0x1e16a8fa), LL(0xddd472e0,0x1b5452ad),LL(0x0d1ee127,0x7d405ee7),LL(0xffa27599,0x50fc6f1d),LL(0xbf391b35,0x351ac53c),
+ LL(0x4444896b,0x7efa14b8),LL(0xf94027fb,0x64974d2f),LL(0xde84487d,0xefdcd0e8),LL(0x2b48989b,0x8c45b260), LL(0xd8463487,0xa8fcbbc2),LL(0x3fbc476c,0xd1b2b3f7),LL(0xc8f443c0,0x21d005b7),LL(0x40c0139c,0x518f2e67),
+ LL(0x06d75fc1,0x56036e8c),LL(0x3249a89f,0x2dcf7bb7),LL(0xe245e7dd,0x81dd1d3d),LL(0xebd6e2a7,0xf578dc4b), LL(0xdf2ce7a0,0x4c028903),LL(0x9c39afac,0xaee36288),LL(0x146404ab,0xdc847c31),LL(0xa4e97818,0x6304c0d8),
+ LL(0xa91f6791,0xae51dca2),LL(0x9baa9efc,0x2abe4190),LL(0x559c7ac1,0xd9d2e2f4),LL(0xfc9f773a,0xe82f4b51), LL(0x4073e81c,0xa7713027),LL(0xfbb596fc,0xc0276fac),LL(0xa684f70c,0x1d819fc9),LL(0xc9f7b1e0,0x29b47fdd),
+ LL(0x459b1940,0x358de103),LL(0x5b013e93,0xec881c59),LL(0x49532ad3,0x51574c93),LL(0xb37b46de,0x2db1d445), LL(0xdf239fd8,0xc6445b87),LL(0x151d24ee,0xc718af75),LL(0xf43c6259,0xaea1c4a4),LL(0x70be02f7,0x40c0e5d7),
+ LL(0x721b33f2,0x6a4590f4),LL(0xfedf04ea,0x2124f1fb),LL(0x9745efe7,0xf8e53cde),LL(0x65f046d9,0xe7e10432), LL(0xe4d0c7e6,0xc3fca28e),LL(0x87253b1b,0x847e339a),LL(0x3743e643,0x9b595348),LL(0x4fd12fc5,0xcb6a0a0b),
+ LL(0x27d02dcc,0xfb6836c3),LL(0x7a68bcc2,0x5ad00982),LL(0x005e912d,0x1b24b44c),LL(0x811fdcfe,0xcc83d20f), LL(0x666fba0c,0x36527ec1),LL(0x14754635,0x69948197),LL(0x556da9c2,0xfcdcb1a8),LL(0x81a732b2,0xa5934267),
+ LL(0xa714181d,0xec1214ed),LL(0x6067b341,0x609ac13b),LL(0xa545df1f,0xff4b4c97),LL(0x34d2076b,0xa1240501), LL(0x1409ca97,0x6efa0c23),LL(0x20638c43,0x254cc1a8),LL(0xdcfb46cd,0xd4e363af),LL(0x03942a27,0x62c2adc3),
+ LL(0x56e46483,0xc67b9df0),LL(0x63736356,0xa55abb20),LL(0xc551bc52,0xab93c098),LL(0xb15fe64b,0x382b49f9), LL(0x4dff8d47,0x9ec221ad),LL(0x437df4d6,0x79caf615),LL(0xbb456509,0x5f13dc64),LL(0x191f0714,0xe4c589d9),
+ LL(0x3fd40e09,0x27b6a8ab),LL(0x77313ea9,0xe455842e),LL(0x1f55988b,0x8b51d1e2),LL(0x062bbbfc,0x5716dd73), LL(0x4e8bf3de,0x633c11e5),LL(0x1b85be3b,0x9a0e77b6),LL(0x0911cca6,0x56510729),LL(0xefa6590f,0x27e76495),
+ LL(0x070d3aab,0xe4ac8b33),LL(0x9a2cd5e5,0x2643672b),LL(0x1cfc9173,0x52eff79b),LL(0x90a7c13f,0x665ca49b), LL(0xb3efb998,0x5a8dda59),LL(0x052f1341,0x8a5b922d),LL(0x3cf9a530,0xae9ebbab),LL(0xf56da4d7,0x35986e7b),
+ LL(0xff3513cc,0x3a636b5c),LL(0x3198f7dd,0xbb0cf8ba),LL(0x41f16f86,0xb8d40522),LL(0xde13a7bf,0x760575d8), LL(0x9f7aa181,0x36f74e16),LL(0xf509ed1c,0x163a3ecf),LL(0x3c40a491,0x6aead61f),LL(0xdfe8fcaa,0x158c95fc),
+ LL(0x13cda46f,0xa3991b6e),LL(0x342faed0,0x79482415),LL(0x666b5970,0xf3ba5bde),LL(0xb26ab6dd,0x1d52e6bc), LL(0x8608dd3d,0x768ba1e7),LL(0xea076586,0x4930db2a),LL(0xe7dc1afa,0xd9575714),LL(0xf7c58817,0x1fc7bf7d),
+ LL(0xd9eee96c,0x6b47accd),LL(0xe58cec37,0x0ca277fb),LL(0xe702c42a,0x113fe413),LL(0xc47cbe51,0xdd1764ee), LL(0x7b3ed739,0x041e7cde),LL(0x5ce9e1c0,0x50cb7459),LL(0x2925b212,0x35568513),LL(0x001b081c,0x7cff95c4),
+ LL(0x8088b454,0x63ee4cbd),LL(0x9a9e0c8a,0xdb7f32f7),LL(0x6b2447cb,0xb377d418),LL(0xd370219b,0xe3e982aa), LL(0xc2a2a593,0x06ccc1e4),LL(0x0773f24f,0x72c36865),LL(0x95859423,0xa13b4da7),LL(0x75040c8f,0x8bbf1d33),
+ LL(0xda50c991,0x726f0973),LL(0x822d6ee2,0x48afcd5b),LL(0x20fd7771,0xe5fc718b),LL(0xfd0807a1,0xb9e8e77d), LL(0x99a7703d,0x7f5e0f44),LL(0x618e36f3,0x6972930e),LL(0x23807bbe,0x2b7c77b8),LL(0xcb27ff50,0xe5b82405),
+ LL(0xbd379062,0xba8b8be3),LL(0x2dce4a92,0xd64b7a1d),LL(0xb2952e37,0x040a73c5),LL(0xd438aeca,0x0a9e252e), LL(0xc39d3bcb,0xdd43956b),LL(0xb32b2d63,0x1a31ca00),LL(0x5c417a18,0xd67133b8),LL(0x2ef442c8,0xd08e4790),
+ LL(0x255c0980,0x98cb1ae9),LL(0x2b4a739f,0x4bd86381),LL(0x1e4a45a1,0x5a5c31e1),LL(0x9cb0db2f,0x1e5d55fe), LL(0x8ff5cc29,0x74661b06),LL(0x0eb8a4f4,0x026b389f),LL(0x58848c24,0x536b21a4),LL(0x81dc72b0,0x2e5bf8ec),
+ LL(0xad886aac,0x03c187d0),LL(0xb771b645,0x5c16878a),LL(0xc74045ab,0xb07dfc6f),LL(0x7800caed,0x2c6360bf), LL(0xb9c972a3,0x24295bb5),LL(0x7c9a6dba,0xc9e6f88e),LL(0x92a79aa6,0x90ffbf24),LL(0x41c26ac2,0xde29d50a),
+ LL(0xd309cbe6,0x9f0af483),LL(0xe0bced4f,0x5b020d8a),LL(0xb38023e3,0x606e986d),LL(0x1abc6933,0xad8f2c9d), LL(0xe7400e93,0x19292e1d),LL(0x52be5e4d,0xfe3e18a9),LL(0x2e0680bf,0xe8e9771d),LL(0xc54db063,0x8c5bec98),
+ LL(0x74a55d1f,0x2af9662a),LL(0x046f66d8,0xe3fbf28f),LL(0xd4dc4794,0xa3a72ab4),LL(0x5c7c2dd8,0x09779f45), LL(0xc3d19d8d,0xd893bdaf),LL(0x57d6a6df,0xd5a75094),LL(0x952e6255,0x8cf8fef9),LL(0xda9a8aff,0x3da67cfb),
+ LL(0x2c160dcd,0x4c23f62a),LL(0x8f90eaef,0x34e6c5e3),LL(0xa9a65d5a,0x35865519),LL(0x8fd38a3d,0x07c48aae), LL(0x50068527,0xb7e7aeda),LL(0x1c90936a,0x2c09ef23),LL(0xe879324c,0x31ecfeb6),LL(0xfb0ec938,0xa0871f6b),
+ LL(0xd84d835d,0xb1f0fb68),LL(0x861dc1e6,0xc90caf39),LL(0x7594f8d7,0x12e5b046),LL(0x65012b92,0x26897ae2), LL(0xa4d6755d,0xbcf68a08),LL(0x0991fbda,0x403ee41c),LL(0x3bbf17e8,0x733e343e),LL(0x679b3d65,0xd2c7980d),
+ LL(0xd2e11305,0x33056232),LL(0xf3c07a6f,0x966be492),LL(0xbb15509d,0x6a8878ff),LL(0x0a9b59a4,0xff221101), LL(0xabe30129,0x6c9f564a),LL(0x336e64cf,0xc6f2c940),LL(0x8b0c8022,0x0fe75262),LL(0x6ae8db87,0xbe0267e9),
+ LL(0x93bc042b,0x22e192f1),LL(0xb237c458,0xf085b534),LL(0x832c4168,0xa0d192bd),LL(0xbdf6271d,0x7a76e9e3), LL(0xb88911b5,0x52a882fa),LL(0xb4db0eb5,0xc85345e4),LL(0x81a7c3ff,0xa3be02a6),LL(0xf0ec0469,0x51889c8c),
+ LL(0xa5e829e5,0x9d031369),LL(0x1607aa41,0xcbb4c6fc),LL(0x241d84c1,0x75ac59a6),LL(0x8829e0ee,0xc043f2bf), LL(0x8ea5e185,0x82a38f75),LL(0xd87cbd9f,0x8bda40b9),LL(0x2d8fc601,0x9e65e75e),LL(0xa35690b3,0x3d515f74),
+ LL(0xda79e5ac,0x534acf4f),LL(0x8630215f,0x68b83b3a),LL(0xd085756e,0x5c748b2e),LL(0xe5d37cb2,0xb0317258), LL(0xc5ccc2c4,0x6735841a),LL(0x3d9d5069,0x7d7dc96b),LL(0xfd1754bd,0xa147e410),LL(0xd399ddd5,0x65296e94),
+ LL(0xbc8fa5bc,0xf6b5b2d0),LL(0x500c277b,0x8a5ead67),LL(0xdfa08a5d,0x214625e6),LL(0x959cf047,0x51fdfedc), LL(0x289fca32,0x6bc9430b),LL(0x9d9bdc3f,0xe36ff0cf),LL(0x58ea0ede,0x2fe187cb),LL(0x5a900b3f,0xed66af20),
+ LL(0x5fa9f4d6,0x00e0968b),LL(0x37a362e7,0x2d4066ce),LL(0xbd07e772,0xa99a9748),LL(0x06a4f1d0,0x710989c0), LL(0xce40cbd8,0xd5dedf35),LL(0x1743293d,0xab55c5f0),LL(0x8aa24e2c,0x766f1144),LL(0x605fbcb4,0x94d874f8),
+ LL(0xa518001b,0xa365f0e8),LL(0x9d04ef0f,0xee605eb6),LL(0xba8d4d25,0x5a3915cd),LL(0xb5113472,0x44c0e1b8), LL(0x8b6740dc,0xcbb024e8),LL(0xee1d4f0c,0x89087a53),LL(0x1fc4e372,0xa88fa05c),LL(0xaf8b3af2,0x8bf395cb),
+ LL(0xdeb8568b,0x1e71c9a1),LL(0x80fb3d32,0xa35daea0),LL(0x2cf8fb81,0xe8b6f266),LL(0x9490696a,0x6d51afe8), LL(0x51803a19,0x81beac6e),LL(0x86219080,0xe3d24b7f),LL(0xdf6f463c,0x727cfd9d),LL(0x72284ee8,0x8c6865ca),
+ LL(0xb743f4ef,0x32c88b7d),LL(0xe7d11dce,0x3793909b),LL(0x2ff2ebe8,0xd398f922),LL(0xe5e49796,0x2c70ca44), LL(0xcb1131b1,0xdf4d9929),LL(0x25888e79,0x7826f298),LL(0xf1d8740a,0x4d3a112c),LL(0x270afa8b,0x00384cb6),
+ LL(0x3ab48095,0xcb64125b),LL(0x62d05106,0x3451c256),LL(0xa4955845,0xd73d577d),LL(0xbf9f4433,0x39570c16), LL(0xadecf263,0xd7dfaad3),LL(0xdc76e102,0xf1c3d8d1),LL(0x54c6a836,0x5e774a58),LL(0x3e92d47b,0xdad4b672),
+ LL(0xf0d796a0,0xbe7e990f),LL(0xdf0e8b02,0x5fc62478),LL(0x030c00ad,0x8aae8bf4),LL(0x9004ba0f,0x3d2db93b), LL(0xd85d5ddc,0xe48c8a79),LL(0x6bb07f34,0xe907caa7),LL(0xa39eaed5,0x58db343a),LL(0xadaf5724,0x0ea6e007),
+ LL(0xd23233f3,0xe00df169),LL(0x77cb637f,0x3e322796),LL(0x1da0cf6c,0x1f897c0e),LL(0x31d6bbdd,0xa651f5d8), LL(0x1a230c76,0xdd61af19),LL(0xcdaa5e4a,0xbd527272),LL(0xd0abcd7e,0xca753636),LL(0x370bd8dc,0x78bdd37c),
+ LL(0x17cd93fe,0xc23916c2),LL(0xdadce6e2,0x65b97a4d),LL(0x174e42f8,0xe04ed4eb),LL(0xbb21480a,0x1491ccaa), LL(0x23196332,0x145a8280),LL(0x587b479a,0x3c3862d7),LL(0x01dcd0ed,0x9f4a88a3),LL(0x3ea12f1f,0x4da2b7ef),
+ LL(0xb126e48e,0xf8e7ae33),LL(0xf494e237,0x404a0b32),LL(0xc55acadb,0x9beac474),LL(0xcbec9fd9,0x4ee5cf3b), LL(0x7df3c8c3,0x336b33b9),LL(0xb76808fd,0xbd905fe3),LL(0xaa45c16a,0x8f436981),LL(0x3dd27b62,0x255c5bfa),
+ LL(0xc3dd9b4d,0x71965cbf),LL(0xfc068a87,0xce23edbf),LL(0x745b029b,0xb78d4725),LL(0xcefdd9bd,0x74610713), LL(0x1266bf52,0x7116f75f),LL(0x18e49bb6,0x02046722),LL(0x3d6f19e3,0xdf43df9f),LL(0xe685cb2f,0xef1bc7d0),
+ LL(0x7078c432,0xcddb27c1),LL(0xb77fedb7,0xe1961b9c),LL(0xc2290570,0x1edc2f5c),LL(0x19cbd886,0x2c3fefca), LL(0xc2af389a,0xcf880a36),LL(0xbda71cea,0x96c610fd),LL(0x32aa8463,0xf03977a9),LL(0x8586d90a,0x8eb7763f),
+ LL(0x2a296e77,0x3f342454),LL(0x42837a35,0xc8718683),LL(0x6a09c731,0x7dc71090),LL(0x51b816db,0x54778ffb), LL(0xaf06defd,0x6b33bfec),LL(0x8592b70b,0xfe3c105f),LL(0x61da6114,0xf937fda4),LL(0x4c266ad7,0x3c13e651),
+ LL(0x855938e8,0xe363a829),LL(0x9de54b72,0x2eeb5d9e),LL(0x20ccfab9,0xbeb93b0e),LL(0x25e61a25,0x3dffbb5f), LL(0x1acc093d,0x7f655e43),LL(0x3964ce61,0x0cb6cc3d),LL(0xe5e9b460,0x6ab283a1),LL(0xa1c7e72d,0x55d787c5),
+ LL(0xdeadbf02,0x4d2efd47),LL(0xac459068,0x11e80219),LL(0x71f311f0,0x810c7626),LL(0x4ab6ef53,0xfa17ef8d), LL(0x93e43bff,0xaf47fd25),LL(0x0be40632,0x5cb5ff3f),LL(0x8ee61da3,0x54687106),LL(0xb08afd0f,0x7764196e),
+ LL(0xf0290a8f,0x831ab3ed),LL(0xcb47c387,0xcae81966),LL(0x184efb4f,0xaad7dece),LL(0x4749110e,0xdcfc53b3), LL(0x4cb632f9,0x6698f23c),LL(0xb91f8067,0xc42a1ad6),LL(0x6284180a,0xb116a81d),LL(0xe901326f,0xebedf5f8),
+ LL(0x97e3e044,0xf2274c9f),LL(0x11d09fc9,0x42018520),LL(0xd18e6e23,0x56a65f17),LL(0x352b683c,0x2ea61e2a), LL(0x575eaa94,0x27d291bc),LL(0xb8ff522d,0x9e7bc721),LL(0xa7f04d6f,0x5f7268bf),LL(0xaba41748,0x5868c73f),
+ LL(0x7be0eead,0x9f85c2db),LL(0xff719135,0x511e7842),LL(0xc5ea90d7,0x5a06b1e9),LL(0x26fab631,0x0c19e283), LL(0xe9206c55,0x8af8f0cf),LL(0x3553c06a,0x89389cb4),LL(0xf65f8004,0x39dbed97),LL(0xc508991d,0x0621b037),
+ LL(0x96e78cc4,0x1c52e635),LL(0x0c06b4a8,0x5385c8b2),LL(0xb0e87d03,0xd84ddfdb),LL(0x934bafad,0xc49dfb66), LL(0x59f70772,0x7071e170),LL(0x3a1db56b,0x3a073a84),LL(0x3b8af190,0x03494903),LL(0xd32920f0,0x7d882de3),
+ LL(0xb2cf8940,0x91633f0a),LL(0x6f948f51,0x72b0b178),LL(0x782653c8,0x2d28dc30),LL(0xdb903a05,0x88829849), LL(0x6a19d2bb,0xb8095d0c),LL(0x86f782cb,0x4b9e7f0c),LL(0x2d907064,0x7af73988),LL(0x8b32643c,0xd12be0fe),
+ LL(0x0e165dc3,0x358ed23d),LL(0x4e2378ce,0x3d47ce62),LL(0xfeb8a087,0x7e2bb0b9),LL(0xe29e10b9,0x3246e8ae), LL(0x03ce2b4d,0x459f4ec7),LL(0xbbc077cf,0xe9b4ca1b),LL(0x0e9940c1,0x2613b4f2),LL(0x047d1eb1,0xfc598bb9),
+ LL(0x45036099,0x9744c62b),LL(0x167c65d8,0xa9dee742),LL(0xdabe1943,0x0c511525),LL(0x93c6c624,0xda110554), LL(0x651a3be2,0xae00a52c),LL(0x884449a6,0xcda5111d),LL(0xff33bed1,0x063c06f4),LL(0x0d3d76b4,0x73baaf9a),
+ LL(0x7fc63668,0x52fb0c9d),LL(0x0c039cde,0x6886c9dd),LL(0x55b22351,0x602bd599),LL(0x360c7c13,0xb00cab02), LL(0x81b69442,0x8cb616bc),LL(0xb55c3cee,0x41486700),LL(0xf49ba278,0x71093281),LL(0x64a50710,0xad956d9c),
+ LL(0x638a7e81,0x9561f28b),LL(0x5980ddc3,0x54155cdf),LL(0xd26f247a,0xb2db4a96),LL(0x4787d100,0x9d774e4e), LL(0x078637d2,0x1a9e6e2e),LL(0x5e0ae06a,0x1c363e2d),LL(0xe9cfa354,0x7493483e),LL(0x7f74b98d,0x76843cb3),
+ LL(0xd4b66947,0xbaca6591),LL(0x04460a8c,0xb452ce98),LL(0x43768f55,0x6830d246),LL(0x7dff12df,0xf4197ed8), LL(0x400dd0f7,0x6521b472),LL(0x4b1e7093,0x59f5ca8f),LL(0x080338ae,0x6feff11b),LL(0xa29ca3c6,0x0ada31f6),
+ LL(0x94a2c215,0x24794eb6),LL(0x05a57ab4,0xd83a43ab),LL(0x2a6f89fe,0x264a543a),LL(0xdd5ec7c2,0x2c2a3868), LL(0x8439d9b2,0xd3373940),LL(0x0acd1f11,0x715ea672),LL(0xe7e6cc19,0x42c1d235),LL(0xb990585c,0x81ce6e96),
+ LL(0xd809c7bd,0x04e5dfe0),LL(0x8f1050ab,0xd7b2580c),LL(0xd8a4176f,0x6d91ad78),LL(0x4e2e897c,0x0af556ee), LL(0x921de0ac,0x162a8b73),LL(0x7ea78400,0x52ac9c22),LL(0xefce2174,0xee2a4eea),LL(0x6d637f79,0xbe61844e),
+ LL(0x789a283b,0x0491f1bc),LL(0x880836f4,0x72d3ac3d),LL(0x88e5402d,0xaa1c5ea3),LL(0xd5cc473d,0x1b192421), LL(0x9dc84cac,0x5c0b9998),LL(0x9c6e75b8,0xb0a8482d),LL(0x3a191ce2,0x639961d0),LL(0x6d837930,0xda3bc865),
+ LL(0x056e6f8f,0xca990653),LL(0x64d133a7,0x84861c41),LL(0x746abe40,0x8b403276),LL(0xebf8e303,0xb7b4d51a), LL(0x220a255d,0x05b43211),LL(0x02419e6e,0xc997152c),LL(0x630c2fea,0x76ff47b6),LL(0x281fdade,0x50518677),
+ LL(0xcf902b0b,0x3283b8ba),LL(0x37db303b,0x8d4b4eb5),LL(0x755011bc,0xcc89f42d),LL(0xdd09d19b,0xb43d74bb), LL(0x8adba350,0x65746bc9),LL(0xb51c1927,0x364eaf8c),LL(0x10ad72ec,0x13c76596),LL(0xf8d40c20,0x30045121),
+ LL(0xea7b979b,0x6d2d99b7),LL(0xe6fb3bcd,0xcd78cd74),LL(0x86cffbfe,0x11e45a9e),LL(0x637024f6,0x78a61cf4), LL(0x3d502295,0xd06bc872),LL(0x458cb288,0xf1376854),LL(0x342f8586,0xb9db26a1),LL(0x4beee09e,0xf33effcf),
+ LL(0xb30cfb3a,0xd7e0c4cd),LL(0x6c9db4c8,0x6d09b8c1),LL(0x07c8d9df,0x40ba1a42),LL(0x1c52c66d,0x6fd495f7), LL(0x275264da,0xfb0e169f),LL(0xe57d8362,0x80c2b746),LL(0x49ad7222,0xedd987f7),LL(0x4398ec7b,0xfdc229af),
+},
+/* digit=25 base_pwr=2^175 */
+{
+ LL(0x52666a58,0xb0d1ed84),LL(0xe6a9c3c2,0x4bcb6e00),LL(0x26906408,0x3c57411c),LL(0x13556400,0xcfc20755), LL(0x5294dba3,0xa08b1c50),LL(0x8b7dd31e,0xa30ba286),LL(0x991eca74,0xd70ba90e),LL(0xe762c2b9,0x094e142c),
+ LL(0x979f3925,0xb81d783e),LL(0xaf4c89a7,0x1efd130a),LL(0xfd1bf7fa,0x525c2144),LL(0x1b265a9e,0x4b296904), LL(0xb9db65b6,0xed8e9634),LL(0x03599d8a,0x35c82e32),LL(0x403563f3,0xdaa7a54f),LL(0x022c38ab,0x9df088ad),
+ LL(0xbb3fd30a,0xe5cfb066),LL(0xeff0354e,0x429169da),LL(0x3524e36c,0x809cf852),LL(0x0155be1d,0x136f4fb3), LL(0x1fbba712,0x4826af01),LL(0x506ba1a1,0x6ef0f0b4),LL(0x77aea73e,0xd9928b31),LL(0x5eaa244e,0xe2bf6af2),
+ LL(0x4237b64b,0x8d084f12),LL(0xe3ecfd07,0x688ebe99),LL(0xf6845dd8,0x57b8a70c),LL(0x5da4a325,0x808fc59c), LL(0xa3585862,0xa9032b2b),LL(0xedf29386,0xb66825d5),LL(0x431ec29b,0xb5a5a8db),LL(0x3a1e8dc8,0xbb143a98),
+ LL(0x12ae381b,0x35ee94ce),LL(0x86ccda90,0x3a7f176c),LL(0x4606eaca,0xc63a657e),LL(0x43cd04df,0x9ae5a380), LL(0xed251b46,0x9bec8d15),LL(0xcaca5e64,0x1f5d6d30),LL(0x9ff20f07,0x347b3b35),LL(0xf7e4b286,0x4d65f034),
+ LL(0xf111661e,0x9e93ba24),LL(0xb105eb04,0xedced484),LL(0xf424b578,0x96dc9ba1),LL(0xe83e9069,0xbf8f66b7), LL(0xd7ed8216,0x872d4df4),LL(0x8e2cbecf,0xbf07f377),LL(0x98e73754,0x4281d899),LL(0x8aab8708,0xfec85fbb),
+ LL(0xa5ba5b0b,0x9a3c0dee),LL(0x42d05299,0xe6a116ce),LL(0xe9b02d42,0xae9775fe),LL(0xa1545cb6,0x72b05200), LL(0x31a3b4ea,0xbc506f7d),LL(0x8bbd9b32,0xe5893078),LL(0xe4b12a97,0xc8bc5f37),LL(0x4a73b671,0x6b000c06),
+ LL(0x765fa7d0,0x13b5bf22),LL(0x1d6a5370,0x59805bf0),LL(0x4280db98,0x67a5e29d),LL(0x776b1ce3,0x4f53916f), LL(0x33ddf626,0x714ff61f),LL(0xa085d103,0x4206238e),LL(0xe5809ee3,0x1c50d4b7),LL(0x85f8eb1d,0x999f450d),
+ LL(0xe4c79e9b,0x658a6051),LL(0xc66a9fea,0x1394cb73),LL(0xc6be7b23,0x27f31ed5),LL(0x5aa6f8fe,0xf4c88f36), LL(0x4aaa499e,0x0fb0721f),LL(0xe3fb2a6b,0x68b3a7d5),LL(0x3a92851d,0xa788097d),LL(0xe96f4913,0x060e7f8a),
+ LL(0x1a3a93bc,0x82eebe73),LL(0xa21adc1a,0x42bbf465),LL(0xef030efd,0xc10b6fa4),LL(0x87b097bb,0x247aa4c7), LL(0xf60c77da,0x8b8dc632),LL(0xc223523e,0x6ffbc26a),LL(0x344579cf,0xa4f6ff11),LL(0x980250f6,0x5825653c),
+ LL(0xbc1aa2b9,0xb2dd097e),LL(0x37a0333a,0x07889393),LL(0x37a0db38,0x1cf55e71),LL(0x792c1613,0x2648487f), LL(0x3fcef261,0xdad01336),LL(0x0eabf129,0x6239c81d),LL(0x9d276be2,0x8ee761de),LL(0x1eda6ad3,0x406a7a34),
+ LL(0x4a493b31,0x4bf367ba),LL(0x9bf7f026,0x54f20a52),LL(0x9795914b,0xb696e062),LL(0x8bf236ac,0xcddab96d), LL(0xed25ea13,0x4ff2c70a),LL(0x81cbbbe7,0xfa1d09eb),LL(0x468544c5,0x88fc8c87),LL(0x696b3317,0x847a670d),
+ LL(0x64bcb626,0xf133421e),LL(0x26dee0b5,0xaea638c8),LL(0xb310346c,0xd6e7680b),LL(0xd5d4ced3,0xe06f4097), LL(0x7512a30b,0x09961452),LL(0xe589a59a,0xf3d867fd),LL(0x52d0c180,0x2e73254f),LL(0x333c74ac,0x9063d8a3),
+ LL(0xd314e7bc,0xeda6c595),LL(0x467899ed,0x2ee7464b),LL(0x0a1ed5d3,0x1cef423c),LL(0x69cc7613,0x217e76ea), LL(0xe7cda917,0x27ccce1f),LL(0x8a893f16,0x12d8016b),LL(0x9fc74f6b,0xbcd6de84),LL(0xf3144e61,0xfa5817e2),
+ LL(0x0821ee4c,0x1f354164),LL(0x0bc61992,0x1583eab4),LL(0x1d72879f,0x7490caf6),LL(0xf76ae7b2,0x998ad9f3), LL(0xa41157f7,0x1e181950),LL(0xe8da3a7e,0xa9d7e1e6),LL(0x8426b95f,0x963784eb),LL(0x542e2a10,0x0ee4ed6e),
+ LL(0xac751e7b,0xb79d4cc5),LL(0xfd4211bd,0x93f96472),LL(0xc8de4fc6,0x8c72d3d2),LL(0xdf44f064,0x7b69cbf5), LL(0xf4bf94e1,0x3da90ca2),LL(0xf12894e2,0x1a5325f8),LL(0x7917d60b,0x0a437f6c),LL(0x96c9cb5d,0x9be70486),
+ LL(0xe1dc5c05,0xb4d880bf),LL(0xeebeeb57,0xd738adda),LL(0xdf0fe6a3,0x6f0119d3),LL(0x66eaaf5a,0x5c686e55), LL(0xdfd0b7ec,0x9cb10b50),LL(0x6a497c21,0xbdd0264b),LL(0x8c546c96,0xfc093514),LL(0x79dbf42a,0x58a947fa),
+ LL(0x49ccd6d7,0xc0b48d4e),LL(0x88bd5580,0xff8fb02c),LL(0x07d473b2,0xc75235e9),LL(0xa2188af3,0x4fab1ac5), LL(0x97576ec0,0x030fa3bc),LL(0x0b7e7d2f,0xe8c946e8),LL(0x70305600,0x40a5c9cc),LL(0xc8b013b4,0x6d8260a9),
+ LL(0x70bba85c,0x0368304f),LL(0xa4a0d311,0xad090da1),LL(0x2415eec1,0x7170e870),LL(0x8461ea47,0xbfba35fe), LL(0xc1e91938,0x6279019a),LL(0x1afc415f,0xa47638f3),LL(0xbcba0e0f,0x36c65cbb),LL(0x034e2c48,0x02160efb),
+ LL(0x615cd9e4,0xe6c51073),LL(0xf1243c06,0x498ec047),LL(0xb17b3d8c,0x3e5a8809),LL(0x0cc565f1,0x5cd99e61), LL(0x7851dafe,0x81e312df),LL(0xa79061e2,0xf156f5ba),LL(0x880c590e,0x80d62b71),LL(0x0a39faa1,0xbec9746f),
+ LL(0xc8ed1f7a,0x1d98a9c1),LL(0xa81d5ff2,0x09e43bb5),LL(0x0da0794a,0xd5f00f68),LL(0x661aa836,0x412050d9), LL(0x90747e40,0xa89f7c4e),LL(0xb62a3686,0x6dc05ebb),LL(0x308e3353,0xdf4de847),LL(0x9fb53bb9,0x53868fbb),
+ LL(0xcfdcf7dd,0x2b09d2c3),LL(0x723fcab4,0x41a9fce3),LL(0x07f57ca3,0x73d905f7),LL(0xac8e1555,0x080f9fb1), LL(0x9ba7a531,0x7c088e84),LL(0xed9a147f,0x07d35586),LL(0xaf48c336,0x602846ab),LL(0x0ccf0e79,0x7320fd32),
+ LL(0xb18bd1ff,0xaa780798),LL(0xafdd2905,0x52c2e300),LL(0x434267cd,0xf27ea3d6),LL(0x15605b5f,0x8b96d16d), LL(0x4b45706b,0x7bb31049),LL(0x743d25f8,0xe7f58b8e),LL(0x87f30076,0xe9b5e45b),LL(0x5d053d5a,0xd19448d6),
+ LL(0xd3210a04,0x1ecc8cb9),LL(0xdafb5269,0x6bc7d463),LL(0x67c3489f,0x3e59b10a),LL(0x65641e1b,0x1769788c), LL(0xbd6cb838,0x8a53b82d),LL(0x236d5f22,0x7066d6e6),LL(0x6908536e,0x03aa1c61),LL(0x66ae9809,0xc971da0d),
+ LL(0xc49a2fac,0x01b3a86b),LL(0x3092e77a,0x3b8420c0),LL(0x7d6fb556,0x02057300),LL(0xbff40a87,0x6941b2a1), LL(0x0658ff2a,0x140b6308),LL(0x3424ab36,0x87804363),LL(0x5751e299,0x0253bd51),LL(0x449c3e3a,0xc75bcd76),
+ LL(0x7f8f875d,0x92eb4090),LL(0x56c26bbf,0x9c9d754e),LL(0x8110bbe7,0x158cea61),LL(0x745f91ea,0x62a6b802), LL(0xc6e7394b,0xa79c41aa),LL(0xad57ef10,0x445b6a83),LL(0x6ea6f40c,0x0c5277eb),LL(0x88633365,0x319fe96b),
+ LL(0x385f63cb,0x0b0fc61f),LL(0x22bdd127,0x41250c84),LL(0x09e942c2,0x67d153f1),LL(0xc021ad5d,0x60920d08), LL(0x724d81a5,0x229f5746),LL(0x5bba3299,0xb7ffb892),LL(0xde413032,0x518c51a1),LL(0x3c2fd94c,0x2a9bfe77),
+ LL(0x3191f4fd,0xcbcde239),LL(0xd3d6ada1,0x43093e16),LL(0x58769606,0x184579f3),LL(0xd236625c,0x2c94a8b3), LL(0x5c437d8e,0x6922b9c0),LL(0xd8d9f3c8,0x3d4ae423),LL(0x2e7090a2,0xf72c31c1),LL(0xd76a55bd,0x4ac3f5f3),
+ LL(0x6b6af991,0x342508fc),LL(0x1b5cebbd,0x0d527100),LL(0xdd440dd7,0xb84740d0),LL(0x780162fd,0x748ef841), LL(0xdfc6fafb,0xa8dbfe0e),LL(0xf7300f27,0xeadfdf05),LL(0xfeba4ec9,0x7d06555f),LL(0x9e25fa97,0x12c56f83),
+ LL(0xd39b8c34,0x77f84203),LL(0x3125eddb,0xed8b1be6),LL(0xf6e39dc5,0x5bbf2441),LL(0x6a5d678a,0xb00f6ee6), LL(0x57d0ea99,0xba456ecf),LL(0x17e06c43,0xdcae0f58),LL(0x0f5b4baa,0x01643de4),LL(0xd161b9be,0x2c324341),
+ LL(0xe126d468,0x80177f55),LL(0x76748e09,0xed325f1f),LL(0xcfa9bdc2,0x6116004a),LL(0x3a9fb468,0x2d8607e6), LL(0x6009d660,0x0e573e27),LL(0x8d10c5a1,0x3a525d2e),LL(0x3b9009a0,0xd26cb45c),LL(0xde9d7448,0xb6b0cdc0),
+ LL(0xe1337c26,0x949c9976),LL(0xd73d68e5,0x6faadebd),LL(0xf1b768d9,0x9e158614),LL(0x9cc4f069,0x22dfa557), LL(0xbe93c6d6,0xccd6da17),LL(0xa504f5b9,0x24866c61),LL(0x8d694da1,0x2121353c),LL(0x0140b8c6,0x1c6ca580),
+ LL(0xe964021e,0xc245ad8c),LL(0x032b82b3,0xb83bffba),LL(0x47ef9898,0xfaa220c6),LL(0x982c948a,0x7e8d3ac6), LL(0xbc2d124a,0x1faa2091),LL(0x05b15ff4,0xbd54c3dd),LL(0xc87c6fb7,0x386bf3ab),LL(0xfdeb6f66,0xfb2b0563),
+ LL(0x5b45afb4,0x4e77c557),LL(0xefb8912d,0xe9ded649),LL(0x42f6e557,0x7ec9bbf5),LL(0x62671f00,0x2570dfff), LL(0x88e084bd,0x2b3bfb78),LL(0xf37fe5b4,0xa024b238),LL(0x95649aee,0x44e7dc04),LL(0x5e7ec1d8,0x498ca255),
+ LL(0xaaa07e86,0x3bc766ea),LL(0xf3608586,0x0db6facb),LL(0xbdc259c8,0xbadd2549),LL(0x041c649f,0x95af3c6e), LL(0x02e30afb,0xb36a928c),LL(0x008a88b8,0x9b5356ad),LL(0xcf1d9e9d,0x4b67a5f1),LL(0xa5d8d8ce,0xc6542e47),
+ LL(0x7adfb6cc,0x73061fe8),LL(0x98678141,0xcc826fd3),LL(0x3c80515a,0x00e758b1),LL(0x41485083,0x6afe3247), LL(0xb6ae8a75,0x0fcb08b9),LL(0x4acf51e1,0xb8cf388d),LL(0x6961b9d6,0x344a5560),LL(0x6a97fd0c,0x1a6778b8),
+ LL(0xecc4c7e3,0xd840fdc1),LL(0x16db68cc,0xde9fe47d),LL(0xa3e216aa,0xe95f89de),LL(0x9594a8be,0x84f1a6a4), LL(0x5a7b162b,0x7ddc7d72),LL(0xadc817a3,0xc5cfda19),LL(0x78b58d46,0x80a5d350),LL(0x82978f19,0x93365b13),
+ LL(0x26a1fc90,0x2e44d225),LL(0x4d70705d,0x0d6d10d2),LL(0xd70c45f4,0xd94b6b10),LL(0xb216c079,0x0f201022), LL(0x658fde41,0xcec966c5),LL(0x7e27601d,0xa8d2bc7d),LL(0xff230be7,0xbfcce3e1),LL(0x0033ffb5,0x3394ff6b),
+ LL(0x8132c9af,0xd890c509),LL(0x361e7868,0xaac4b0eb),LL(0xe82d15aa,0x5194ded3),LL(0x23ae6b7d,0x4550bd2e), LL(0xea5399d4,0x3fda318e),LL(0x91638b80,0xd989bffa),LL(0xa14aa12d,0x5ea124d0),LL(0x3667b944,0x1fb1b899),
+ LL(0x44c44d6a,0x95ec7969),LL(0x57e86137,0x91df144a),LL(0x73adac44,0x915fd620),LL(0x59a83801,0x8f01732d), LL(0x3aa0a633,0xec579d25),LL(0xc9d6d59c,0x06de5e7c),LL(0xb1ef8010,0xc132f958),LL(0xe65c1a02,0x29476f96),
+ LL(0xd34c3565,0x336a77c0),LL(0x1b9f1e9e,0xef1105b2),LL(0xf9e08002,0x63e6d08b),LL(0xc613809e,0x9aff2f21), LL(0x3a80e75d,0xb5754f85),LL(0x6bbda681,0xde71853e),LL(0x8197fd7a,0x86f041df),LL(0x127817fa,0x8b332e08),
+ LL(0xb9c20cda,0x05d99be8),LL(0xd5cd0c98,0x89f7aad5),LL(0x5bb94183,0x7ef936fe),LL(0xb05cd7f2,0x92ca0753), LL(0x74a1e035,0x9d65db11),LL(0x13eaea92,0x02628cc8),LL(0x49e4fbf2,0xf2d9e242),LL(0xe384f8b7,0x94fdfd9b),
+ LL(0x63428c6b,0x65f56054),LL(0x90b409a5,0x2f7205b2),LL(0xff45ae11,0xf778bb78),LL(0xc5ee53b2,0xa13045be), LL(0x03ef77fe,0xe00a14ff),LL(0xffef8bef,0x689cd59f),LL(0x1e9ade22,0x3578f0ed),LL(0x6268b6a8,0xe99f3ec0),
+ LL(0xea1b3c3e,0xa2057d91),LL(0xb8823a4a,0x2d1a7053),LL(0x2cca451e,0xabbb336a),LL(0x2218bb5d,0xcd2466e3), LL(0xc8cb762d,0x3ac1f42f),LL(0x7690211f,0x7e312aae),LL(0x45d07450,0xebb9bd73),LL(0x46c2213f,0x207c4b82),
+ LL(0x375913ec,0x99d425c1),LL(0x67908220,0x94e45e96),LL(0xcd67dbf6,0xc08f3087),LL(0xc0887056,0xa5670fbe), LL(0x66f5b8fc,0x6717b64a),LL(0x786fec28,0xd5a56aea),LL(0xc0ff4952,0xa8c3f55f),LL(0x457ac49b,0xa77fefae),
+ LL(0x98379d44,0x29882d7c),LL(0x509edc8a,0xd000bdfb),LL(0xe66fe464,0xc6f95979),LL(0xfa61bde0,0x504a6115), LL(0xeffea31a,0x56b3b871),LL(0xf0c21a54,0x2d3de26d),LL(0x834753bf,0x21dbff31),LL(0x69269d86,0xe67ecf49),
+ LL(0x151fe690,0x7a176952),LL(0x7f2adb5f,0x03515804),LL(0xd1b62a8d,0xee794b15),LL(0xaae454e6,0xf004ceec), LL(0xf0386fac,0x0897ea7c),LL(0xd1fca751,0x3b62ff12),LL(0x1b7a04ec,0x154181df),LL(0xfb5847ec,0x2008e04a),
+ LL(0x41dbd772,0xd147148e),LL(0x22942654,0x2b419f73),LL(0xe9c544f7,0x669f30d3),LL(0xc8540149,0x52a2c223), LL(0x634dfb02,0x5da9ee14),LL(0xf47869f3,0x5f074ff0),LL(0xa3933acc,0x74ee878d),LL(0x4fe35ed1,0xe6510651),
+ LL(0xf1012e7a,0xb3eb9482),LL(0xa8a566ae,0x51013cc0),LL(0x47c00d3b,0xdd5e9243),LL(0x946bb0e5,0x7fde089d), LL(0xc731b4b3,0x030754fe),LL(0x99fda062,0x12a136a4),LL(0x5a1a35bc,0x7c1064b8),LL(0x446c84ef,0xbf1f5763),
+ LL(0xa16d4b34,0xed29a56d),LL(0xdca21c4f,0x7fba9d09),LL(0x6d8de486,0x66d7ac00),LL(0x73a2a5e1,0x60061987), LL(0x9da28ff0,0x8b400f86),LL(0x43c4599c,0x3133f708),LL(0xee28cb0d,0x9911c9b8),LL(0x8e0af61d,0xcd7e2874),
+ LL(0x72ed91fc,0x5a85f0f2),LL(0x9cd4a373,0x85214f31),LL(0x1925253c,0x881fe5be),LL(0x91e8bc76,0xd8dc98e0), LL(0x585cc3a2,0x7120affe),LL(0x735bf97a,0x724952ed),LL(0x3eb34581,0x5581e7dc),LL(0xe52ee57d,0x5cbff4f2),
+ LL(0x87d8cc7b,0x8d320a0e),LL(0xf1d280d0,0x9beaa7f3),LL(0x9beec704,0x7a0b9571),LL(0x5b7f0057,0x9126332e), LL(0x8ed3bd6d,0x01fbc1b4),LL(0xd945eb24,0x35bb2c12),LL(0x9a8ae255,0x6404694e),LL(0x8d6abfb3,0xb6092eec),
+ LL(0xcc058865,0x4d76143f),LL(0x6e249922,0x7b0a5af2),LL(0x6a50d353,0x8aef9440),LL(0x64f0e07a,0xe11e4bcc), LL(0xa14a90fa,0x4472993a),LL(0xba0c51d4,0x7706e20c),LL(0x1532672d,0xf403292f),LL(0x21829382,0x52573bfa),
+ LL(0x3b5bdb83,0x6a7bb6a9),LL(0xa4a72318,0x08da65c0),LL(0x63eb065f,0xc58d22aa),LL(0x1b15d685,0x1717596c), LL(0xb266d88b,0x112df0d0),LL(0x5941945a,0xf688ae97),LL(0x7c292cac,0x487386e3),LL(0x57d6985c,0x42f3b50d),
+ LL(0x6a90fc34,0x6da4f998),LL(0x65ca8a8d,0xc8f257d3),LL(0x6951f762,0xc2feabca),LL(0x74c323ac,0xe1bc81d0), LL(0x251a2a12,0x1bc68f67),LL(0xbe8a70dc,0x10d86587),LL(0xf0f84d2e,0xd648af7f),LL(0x6a43ac92,0xf0aa9ebc),
+ LL(0x27596893,0x69e3be04),LL(0x45bf452b,0xb6bb02a6),LL(0xf4c698c8,0x0875c11a),LL(0xbece3794,0x6652b5c7), LL(0x4f5c0499,0x7b3755fd),LL(0xb5532b38,0x6ea16558),LL(0xa2e96ef7,0xd1c69889),LL(0x61ed8f48,0x9c773c3a),
+ LL(0x9b323abc,0x2b653a40),LL(0xf0e1d791,0xe26605e1),LL(0x4a87157a,0x45d41064),LL(0xcbbce616,0x8f9a78b7), LL(0xc407eddd,0xcf1e44aa),LL(0xa35b964f,0x81ddd1d8),LL(0xfd083999,0x473e339e),LL(0x8e796802,0x6c94bdde),
+ LL(0x8545d185,0x5a304ada),LL(0x738bb8cb,0x82ae44ea),LL(0xdf87e10e,0x628a35e3),LL(0xa15b9fe3,0xd3624f3d), LL(0x14be4254,0xcc44209b),LL(0xbdbc2ea5,0x7d0efcbc),LL(0x04c37bbe,0x1f603362),LL(0x56a5852c,0x21f363f5),
+ LL(0xa8501550,0xa1503d1c),LL(0xd8ab10bb,0x2251e0e1),LL(0x6961c51c,0xde129c96),LL(0x81910f68,0x1f7246a4), LL(0x5f2591f2,0x2eb744ee),LL(0x5e627157,0x3c47d33f),LL(0x22f3bd68,0x4d6d62c9),LL(0xcb8df856,0x6120a64b),
+ LL(0x7b5d07df,0x3a9ac6c0),LL(0x7ef39783,0xa92b9558),LL(0xab3a9b4f,0xe128a134),LL(0xb1252f05,0x41c18807), LL(0x80ba9b1c,0xfc7ed089),LL(0xc532a9dd,0xac8dc6de),LL(0x55246809,0xbf829cef),LL(0x5b4ee80f,0x101b784f),
+ LL(0xb6f11603,0xc09945bb),LL(0x41d2801e,0x57b09dbe),LL(0xa97534a8,0xfba5202f),LL(0xc17b9614,0x7fd8ae5f), LL(0x78308435,0xa50ba666),LL(0xd3868c4d,0x9572f77c),LL(0x2dd7aab0,0x0cef7bfd),LL(0x2c7c79ff,0xe7958e08),
+ LL(0x25346689,0x81262e42),LL(0xb07c7004,0x716da290),LL(0xb7950ee3,0x35f911ea),LL(0x261d21b5,0x6fd72969), LL(0x08b640d3,0x52389803),LL(0x887f12a1,0x5b0026ee),LL(0x742e9311,0x20e21660),LL(0x5ff77ff7,0x0ef6d541),
+ LL(0xf9c41135,0x969127f0),LL(0x68a64993,0xf21d60c9),LL(0xe541875c,0x656e5d0c),LL(0xa1d3c233,0xf1e0f84e), LL(0x06002d60,0x9bcca359),LL(0x06191552,0xbe2da60c),LL(0x61181ec3,0x5da8bbae),LL(0x65806f19,0x9f04b823),
+ LL(0xd4b79bb8,0xf1604a7d),LL(0x52c878c8,0xaee806fb),LL(0x8d47b8e8,0x34144f11),LL(0x949f9054,0x72edf52b), LL(0x2127015a,0xebfca84e),LL(0x9cb7cef3,0x9051d0c0),LL(0x296deec8,0x86e8fe58),LL(0x41010d74,0x33b28188),
+},
+/* digit=26 base_pwr=2^182 */
+{
+ LL(0x171b445f,0x01079383),LL(0x8131ad4c,0x9bcf21e3),LL(0xc93987e8,0x8cdfe205),LL(0xc92e8c8f,0xe63f4152), LL(0x30add43d,0x729462a9),LL(0xc980f05a,0x62ebb143),LL(0x3b06e968,0x4f3954e5),LL(0x242cf6b1,0xfe1d75ad),
+ LL(0xaf8685c8,0x5f95c6c7),LL(0x2f8f01aa,0xd4c1c8ce),LL(0x2574692a,0xc44bbe32),LL(0xd4a4a068,0xb8003478), LL(0x2eca3cdb,0x7c8fc6e5),LL(0xec04d399,0xea1db16b),LL(0x8f2bc5cf,0xb05bc82e),LL(0xf44793d2,0x763d517f),
+ LL(0x08bd98d0,0x4451c1b8),LL(0x6575f240,0x644b1cd4),LL(0x7375d270,0x6907eb33),LL(0xfa2286bd,0x56c8bebd), LL(0xc4632b46,0xc713d2ac),LL(0xafd60242,0x17da427a),LL(0xc95c7546,0x313065b7),LL(0xbf17a3de,0xf8239898),
+ LL(0x4c830320,0xf3b7963f),LL(0x903203e3,0x842c7aa0),LL(0xe7327afb,0xaf22ca0a),LL(0x967609b6,0x38e13092), LL(0x757558f1,0x73b8fb62),LL(0xf7eca8c1,0x3cc3e831),LL(0xf6331627,0xe4174474),LL(0xc3c40234,0xa77989ca),
+ LL(0x44a081e0,0xe5fd17a1),LL(0xb70e296a,0xd797fb7d),LL(0x481f719c,0x2b472b30),LL(0xfe6f8c52,0x0e632a98), LL(0xc5f0c284,0x89ccd116),LL(0x2d987c62,0xf51088af),LL(0x4c2de6cf,0x2a2bccda),LL(0xf679f0f9,0x810f9efe),
+ LL(0x7ffe4b3e,0xb0f394b9),LL(0xe5fa5d21,0x0b691d21),LL(0x9dfbbc75,0xb0bd7747),LL(0xfaf78b00,0xd2830fda), LL(0x52434f57,0xf78c249c),LL(0x98096dab,0x4b1f7545),LL(0x8ff8c0b3,0x73bf6f94),LL(0x454e134c,0x34aef03d),
+ LL(0xb7ac7ec5,0xf8d151f4),LL(0xe50da7d5,0xd6ceb95a),LL(0xdc3a0eb8,0xa1b492b0),LL(0xb3dd2863,0x75157b69), LL(0xc5413d62,0xe2c4c74e),LL(0xbc5fc4c7,0xbe329ff7),LL(0x60fa9dda,0x835a2aea),LL(0x7445cb87,0xf117f5ad),
+ LL(0xb0166f7a,0xae8317f4),LL(0xceec74e6,0xfbd3e3f7),LL(0xe0874bfd,0xfdb516ac),LL(0xc681f3a3,0x3d846019), LL(0x7c1620b0,0x0b12ee5c),LL(0x2b63c501,0xba68b4dd),LL(0x6668c51e,0xac03cd32),LL(0x4e0bcb5b,0x2a6279f7),
+ LL(0x6ae85c10,0x17bd69b0),LL(0x1dfdd3a6,0x72946979),LL(0x2c078bec,0xd9a03268),LL(0xbfd68a52,0x41c6a658), LL(0x0e023900,0xcdea1024),LL(0xb10d144d,0xbaeec121),LL(0x058ab8dc,0x5a600e74),LL(0xbb89ccdd,0x1333af21),
+ LL(0x3aaba1f1,0xdf25eae0),LL(0x3b7144cf,0x2cada16e),LL(0x71ab98bc,0x657ee27d),LL(0x7a6fc96e,0x99088b4c), LL(0x3549dbd4,0x05d5c0a0),LL(0xf158c3ac,0x42cbdf8f),LL(0x87edd685,0x3fb6b3b0),LL(0x86f064d0,0x22071cf6),
+ LL(0xff2811e5,0xd2d6721f),LL(0xfe7fae8c,0xdb81b703),LL(0xd3f1f7bb,0x3cfb74ef),LL(0x16cdeb5d,0x0cdbcd76), LL(0x566a808c,0x4f39642a),LL(0x340064d6,0x02b74454),LL(0x0528fa6f,0xfabbadca),LL(0xd3fc0bb6,0xe4c3074c),
+ LL(0xb796d219,0xb32cb8b0),LL(0x34741dd9,0xc3e95f4f),LL(0x68edf6f5,0x87212125),LL(0xa2b9cb8e,0x7a03aee4), LL(0xf53a89aa,0x0cd3c376),LL(0x948a28dc,0x0d8af9b1),LL(0x902ab04f,0xcf86a3f4),LL(0x7f42002d,0x8aacb62a),
+ LL(0xf62ffd52,0x106985eb),LL(0x5797bf10,0xe670b54e),LL(0xc5e30aef,0x4b405209),LL(0x4365b5e9,0x12c97a20), LL(0x1fe32093,0x104646ce),LL(0x3907a8c9,0x13cb4ff6),LL(0xd46e726b,0x8b9f30d1),LL(0xaba0f499,0xe1985e21),
+ LL(0x10a230cd,0xc573dea9),LL(0xcd30f947,0x24f46a93),LL(0xabe2010a,0xf2623fcf),LL(0x73f00e4f,0x3f278cb2), LL(0x50b920eb,0xed55c67d),LL(0x8e760571,0xf1cb9a2d),LL(0x0895b709,0x7c50d109),LL(0x190d4369,0x4207cf07),
+ LL(0xc4127fe1,0x3b027e81),LL(0x3ae9c566,0xa9f8b9ad),LL(0xacbfbba5,0x5ab10851),LL(0x569556f5,0xa747d648), LL(0x2ba97bf7,0xcc172b5c),LL(0xbcfa3324,0x15e0f77d),LL(0x7686279d,0xa345b797),LL(0xe38003d3,0x5a723480),
+ LL(0x8f5fcda8,0xfd8e139f),LL(0xbdee5bfd,0xf3e558c4),LL(0xe33f9f77,0xd76cbaf4),LL(0x71771969,0x3a4c97a4), LL(0xf6dce6a7,0xda27e84b),LL(0x13e6c2d1,0xff373d96),LL(0xd759a6e9,0xf115193c),LL(0x63d2262c,0x3f9b7025),
+ LL(0x317cd062,0xd9764a31),LL(0x199f8332,0x30779d8e),LL(0x16b11b0b,0xd8074106),LL(0x78aeaed8,0x7917ab9f), LL(0x28fb1d8e,0xb67a9cbe),LL(0x136eda33,0x2e313563),LL(0xa371a86c,0x010b7069),LL(0x6744e6b7,0x44d90fa2),
+ LL(0xd6b3e243,0x68190867),LL(0x59048c48,0x9fe6cd9d),LL(0x95731538,0xb900b028),LL(0x32cae04f,0xa012062f), LL(0x9399d082,0x8107c8bc),LL(0x41df12e2,0x47e8c54a),LL(0xb6ef3f73,0x14ba5117),LL(0x81362f0b,0x22260bea),
+ LL(0x1a18cc20,0x90ea261e),LL(0x2321d636,0x2192999f),LL(0xe311b6a0,0xef64d314),LL(0x3b54a1f5,0xd7401e4c), LL(0x6fbca2ba,0x19019983),LL(0x8fbffc4b,0x46ad3293),LL(0x3786bf40,0xa142d3f6),LL(0xb67039fc,0xeb5cbc26),
+ LL(0x252bd479,0x9cb0ae6c),LL(0x12b5848f,0x05e0f88a),LL(0xa5c97663,0x78f6d2b2),LL(0xc162225c,0x6f6e149b), LL(0xde601a89,0xe602235c),LL(0xf373be1f,0xd17bbe98),LL(0xa8471827,0xcaf49a5b),LL(0x18aaa116,0x7e1a0a85),
+ LL(0x270580c3,0x6c833196),LL(0xf1c98a14,0x1e233839),LL(0xae34e0a5,0x67b2f7b4),LL(0xd8ce7289,0x47ac8745), LL(0x100dd467,0x2b74779a),LL(0x4ee50d09,0x274a4337),LL(0x83608bc9,0x603dcf13),LL(0xc89e8388,0xcd9da6c3),
+ LL(0x355116ac,0x2660199f),LL(0xb6d18eed,0xcc38bb59),LL(0x2f4bc071,0x3075f31f),LL(0x265dc57e,0x9774457f), LL(0xc6db88bb,0x06a6a9c8),LL(0x4ec98e04,0x6429d07f),LL(0x05ecaa8b,0x8d05e57b),LL(0x7872ea7b,0x20f140b1),
+ LL(0xca494693,0xdf8c0f09),LL(0xf252e909,0x48d3a020),LL(0x57b14b12,0x4c5c29af),LL(0xbf47ad1c,0x7e6fa37d), LL(0x49a0c938,0x66e7b506),LL(0x6be5f41f,0xb72c0d48),LL(0xb2359412,0x6a6242b8),LL(0x8e859480,0xcd35c774),
+ LL(0x87baa627,0x12536fea),LL(0xf72aa680,0x58c1fec1),LL(0x601e5dc9,0x6c29b637),LL(0xde9e01b9,0x9e3c3c1c), LL(0x2bcfe0b0,0xefc8127b),LL(0x2a12f50d,0x35107102),LL(0x4879b397,0x6ccd6cb1),LL(0xf8a82f21,0xf792f804),
+ LL(0xa9b46402,0x509d4804),LL(0xc10f0850,0xedddf85d),LL(0x4b6208aa,0x928410dc),LL(0x391012dc,0xf6229c46), LL(0x7727b9b6,0xc5a7c41e),LL(0xaa444842,0x289e4e4b),LL(0xe9a947ea,0x049ba1d9),LL(0x83c8debc,0x44f9e47f),
+ LL(0x611f8b8e,0xfa77a1fe),LL(0xf518f427,0xfd2e416a),LL(0x114ebac3,0xc5fffa70),LL(0x5d89697b,0xfe57c4e9), LL(0xb1aaf613,0xfdd053ac),LL(0xea585a45,0x31df210f),LL(0x24985034,0x318cc10e),LL(0x5f1d6130,0x1a38efd1),
+ LL(0x0b1e9e21,0xbf86f237),LL(0x1dbe88aa,0xb258514d),LL(0x90c1baf9,0x1e38a588),LL(0xbdb9b692,0x2936a01e), LL(0x6dd5b20c,0xd576de98),LL(0x70f98ecf,0xb586bf71),LL(0xc42d2fd7,0xcccf0f12),LL(0xfb35bd7b,0x8717e61c),
+ LL(0x35e6fc06,0x8b1e5722),LL(0x0b3e13d5,0x3477728f),LL(0xaa8a7372,0x150c294d),LL(0x3bfa528a,0xc0291d43), LL(0xcec5a196,0xc6c8bc67),LL(0x5c2e8a7c,0xdeeb31e4),LL(0xfb6e1c51,0xba93e244),LL(0x2e28e156,0xb9f8b71b),
+ LL(0x968a2ab9,0xce65a287),LL(0x46bbcb1f,0xe3c5ce69),LL(0xe7ae3f30,0xf8c835b9),LL(0xff72b82b,0x16bbee26), LL(0xfd42cd22,0x665e2017),LL(0xf8b1d2a0,0x1e139970),LL(0x79204932,0x125cda29),LL(0x49c3bee5,0x7aee94a5),
+ LL(0x89821a66,0x68c70160),LL(0x8f981669,0xf7c37678),LL(0x48cc3645,0xd90829fc),LL(0xd70addfc,0x346af049), LL(0x370bf29c,0x2057b232),LL(0x42e650ee,0xf90c73ce),LL(0xa126ab90,0xe03386ea),LL(0x975a087b,0x0e266e7e),
+ LL(0x0fca65d9,0x80578eb9),LL(0x16af45b8,0x7e2989ea),LL(0xcac75a4e,0x7438212d),LL(0x4fef36b8,0x38c7ca39), LL(0xd402676a,0x8650c494),LL(0xf72c7c48,0x26ab5a66),LL(0xce3a464e,0x4e6cb426),LL(0x2b72f841,0xf8f99896),
+ LL(0x1a335cc8,0x8c318491),LL(0x6a5913e4,0x563459ba),LL(0xc7b32919,0x1b920d61),LL(0xa02425ad,0x805ab8b6), LL(0x8d006086,0x2ac512da),LL(0xbcf5c0fd,0x6ca4846a),LL(0xac2138d7,0xafea51d8),LL(0x344cd443,0xcb647545),
+ LL(0xbd7d9040,0x0429ee8f),LL(0x819b9c96,0xee66a2de),LL(0xdea7d744,0x54f9ec25),LL(0x671721bb,0x2ffea642), LL(0x114344ea,0x4f19dbd1),LL(0xfd0dbc8b,0x04304536),LL(0x29ec7f91,0x014b50aa),LL(0xbb06014d,0xb5fc22fe),
+ LL(0x1ee682e0,0x60d963a9),LL(0xfe85c727,0xdf48abc0),LL(0x2e707c2d,0x0cadba13),LL(0xa645aeff,0xde608d3a), LL(0xedafd883,0x05f1c28b),LL(0xbd94de1f,0x3c362ede),LL(0x13593e41,0x8dd0629d),LL(0x766d6eaf,0x0a5e736f),
+ LL(0xf68cf9d1,0xbfa92311),LL(0xc1797556,0xa4f9ef87),LL(0x5601c209,0x10d75a1f),LL(0x09b07361,0x651c374c), LL(0x88b5cead,0x49950b58),LL(0x6fa9dbaa,0x0ef00058),LL(0x4e15f33a,0xf51ddc26),LL(0x2ef46140,0x1f8b5ca6),
+ LL(0xee9523f0,0x343ac0a3),LL(0x975ea978,0xbb75eab2),LL(0x107387f4,0x1bccf332),LL(0x9ab0062e,0x790f9259), LL(0x1e4f6a5f,0xf1a363ad),LL(0x62519a50,0x06e08b84),LL(0x7265f1ee,0x60915187),LL(0x93ae985e,0x6a80ca34),
+ LL(0xaaba4864,0x81b29768),LL(0x8d52a7d6,0xb13cabf2),LL(0x8ead03f1,0xb5c36348),LL(0x81c7c1c0,0xc932ad95), LL(0xcae1e27b,0x5452708e),LL(0x1b0df648,0x9dac4269),LL(0xdfcdb8bc,0x233e3f0c),LL(0xec540174,0xe6ceccdf),
+ LL(0x95081181,0xbd0d845e),LL(0x699355d5,0xcc8a7920),LL(0xc3b375a8,0x111c0f6d),LL(0xfd51e0dc,0xfd95bc6b), LL(0x6888523a,0x4a106a26),LL(0xcb01a06d,0x4d142bd6),LL(0xadb9b397,0x79bfd289),LL(0xe9863914,0x0bdbfb94),
+ LL(0x1660f6a6,0x29d8a229),LL(0x551c042d,0x7f6abcd6),LL(0x0ac3ffe8,0x13039deb),LL(0xec8523fb,0xa01be628), LL(0x0ca1c328,0x6ea34103),LL(0xb903928e,0xc74114bd),LL(0x9e9144b0,0x8aa4ff4e),LL(0x7f9a4b17,0x7064091f),
+ LL(0xe447f2c4,0xa3f4f521),LL(0x604291f0,0x81b8da7a),LL(0x7d5926de,0xd680bc46),LL(0x34a1202f,0x84f21fd5), LL(0x4e9df3d8,0x1d1e3181),LL(0x39ab8d34,0x1ca4861a),LL(0x5b19aa4a,0x809ddeec),LL(0x4d329366,0x59f72f7e),
+ LL(0x386d5087,0xa2f93f41),LL(0xdd67d64f,0x40bf739c),LL(0x66702158,0xb4494205),LL(0x73b1e178,0xc33c65be), LL(0x38ca6153,0xcdcd657c),LL(0xdc791976,0x97f4519a),LL(0xcd6e1f39,0xcc7c7f29),LL(0x7e3c3932,0x38de9cfb),
+ LL(0x7b793f85,0xe448eba3),LL(0xf067e914,0xe9f8dbf9),LL(0xf114ae87,0xc0390266),LL(0xcd6a8e2a,0x39ed75a7), LL(0x7ffba390,0xadb14848),LL(0x6af9bc09,0x67f8cb8b),LL(0x9c7476db,0x322c3848),LL(0x52a538d6,0xa320fecf),
+ LL(0xb2aced2b,0xe0493002),LL(0x616bd430,0xdfba1809),LL(0xc331be70,0x531c4644),LL(0x90d2e450,0xbc04d32e), LL(0x0f9f142d,0x1805a0d1),LL(0x47ee5a23,0x2c44a0c5),LL(0x3989b4e3,0x31875a43),LL(0x0c063481,0x6b1949fd),
+ LL(0xbe0f4492,0x2dfb9e08),LL(0xe9d5e517,0x3ff0da03),LL(0xf79466a8,0x03dbe9a1),LL(0x15ea9932,0x0b87bcd0), LL(0xab1f58ab,0xeb64fc83),LL(0x817edc8a,0x6d9598da),LL(0x1d3b67e5,0x699cff66),LL(0x92635853,0x645c0f29),
+ LL(0xeabaf21c,0x253cdd82),LL(0x2241659e,0x82b9602a),LL(0x2d9f7091,0x2cae07ec),LL(0x8b48cd9b,0xbe4c720c), LL(0x6f08d6c9,0x6ce5bc03),LL(0xaf10bf40,0x36e8a997),LL(0x3e10ff12,0x83422d21),LL(0xbcc12494,0x7b26d3eb),
+ LL(0xc9469ad6,0xb240d2d0),LL(0x30afa05b,0xc4a11b4d),LL(0xdd6ba286,0x4b604ace),LL(0x3ee2864c,0x18486600), LL(0x8d9ce5be,0x5869d6ba),LL(0xff4bfb0d,0x0d8f68c5),LL(0x5700cf73,0xb69f210b),LL(0x6d37c135,0x61f6653a),
+ LL(0x5aff5a48,0xff3d432b),LL(0x72ba3a69,0x0d81c4b9),LL(0xfa1899ef,0xee879ae9),LL(0x2d6acafd,0xbac7e2a0), LL(0x1c664399,0xd6d93f6c),LL(0x5bcb135d,0x4c288de1),LL(0x9dab7cbf,0x83031dab),LL(0x3abbf5f0,0xfe23feb0),
+ LL(0xcdedca85,0x9f1b2466),LL(0x1a09538c,0x140bb710),LL(0x5e11115d,0xac8ae851),LL(0x6f03f59e,0x0d63ff67), LL(0x7d234afb,0x755e5551),LL(0x7e208fc1,0x61c2db4e),LL(0xf28a4b5d,0xaa9859ce),LL(0x34af030f,0xbdd6d4fc),
+ LL(0x3be01cb1,0xd1c4a26d),LL(0x243aa07c,0x9ba14ffc),LL(0xb2503502,0xf95cd3a9),LL(0x7d2a93ab,0xe379bc06), LL(0xd4ca8d68,0x3efc18e9),LL(0x80bb412a,0x083558ec),LL(0x9645a968,0xd903b940),LL(0x9ba6054f,0xa499f0b6),
+ LL(0xb8349abe,0x208b573c),LL(0x30b4fc1c,0x3baab3e5),LL(0xcb524990,0x87e978ba),LL(0xccdf0e80,0x3524194e), LL(0x7d4bcc42,0x62711725),LL(0xb90109ba,0xe90a3d9b),LL(0x1323e1e0,0x3b1bdd57),LL(0x5eae1599,0xb78e9bd5),
+ LL(0x9e03d278,0x0794b746),LL(0xd70e6297,0x80178605),LL(0x99c97855,0x171792f8),LL(0xf5a86b5c,0x11b393ee), LL(0xd8884f27,0x48ef6582),LL(0xbf19ba5f,0xbd44737a),LL(0xa42062c6,0x8698de4c),LL(0x61ce9c54,0x8975eb80),
+ LL(0xd7fe71f3,0xd50e57c7),LL(0xbc97ce38,0x15342190),LL(0x4df07b63,0x51bda2de),LL(0x200eb87d,0xba12aeae), LL(0xa9b4f8f6,0xabe135d2),LL(0xfad6d99c,0x04619d65),LL(0x7994937c,0x4a6683a7),LL(0x6f94f09a,0x7a778c8b),
+ LL(0x20a71b89,0x8c508623),LL(0x1c229165,0x241a2aed),LL(0xaaf83a99,0x352be595),LL(0x1562bac8,0x9fbfee7f), LL(0x5c4017e3,0xeaf658b9),LL(0x15120b86,0x1dc7f9e0),LL(0x4c034d6f,0xd84f13dd),LL(0xeaea3038,0x283dd737),
+ LL(0xcd85d6a2,0x197f2609),LL(0xfae60177,0x6ebbc345),LL(0x4e12fede,0xb80f031b),LL(0x07a2186b,0xde55d0c2), LL(0x24dcdd5a,0x1fb3e37f),LL(0x7ed191fb,0x8d602da5),LL(0x76023e0d,0x108fb056),LL(0x459c20c0,0x70178c71),
+ LL(0x3fe54cf0,0xfad5a386),LL(0x02bbb475,0xa4a3ec4f),LL(0x919d94d7,0x1aa5ec20),LL(0xa81e4ab3,0x5d3b63b5), LL(0x5ad3d2af,0x7fa733d8),LL(0xd1ac7a37,0xfbc586dd),LL(0x40779614,0x282925de),LL(0xe74a242a,0xfe0ffffb),
+ LL(0x906151e5,0x3f39e67f),LL(0x55e10649,0xcea27f5f),LL(0xc17cf7b7,0xdca1d4e1),LL(0x2fe2362d,0x0c326d12), LL(0x7dd35df3,0x05f7ac33),LL(0xc396dbdf,0x0c3b7639),LL(0x03b7db1c,0x0912f5ac),LL(0x5c9ed4a9,0x9dea4b70),
+ LL(0xaae3f639,0x475e6e53),LL(0xfc278bac,0xfaba0e7c),LL(0x9490375f,0x16f9e221),LL(0xa5a7ed0a,0xaebf9746), LL(0xf41ad5d6,0x45f9af3f),LL(0xb2e99224,0x03c4623c),LL(0xb3cf56aa,0x82c5bb5c),LL(0x34567ed3,0x64311819),
+ LL(0x8be489ac,0xec57f211),LL(0xb9a1104b,0x2821895d),LL(0x6064e007,0x610dc875),LL(0x5b20d0fe,0x8e526f3f), LL(0x5b645aee,0x6e71ca77),LL(0x800e10ff,0x3d1dcb9f),LL(0x189cf6de,0x36b51162),LL(0x6bb17353,0x2c5a3e30),
+ LL(0x2a6c6fbf,0xc186cd3e),LL(0x4bf97906,0xa74516fa),LL(0x279d6901,0x5b4b8f4b),LL(0x2b573743,0x0c4e57b4), LL(0xb6e386b6,0x75fdb229),LL(0x99deac27,0xb46793fd),LL(0xcf712629,0xeeec47ea),LL(0xcbc3b2dd,0xe965f3c4),
+ LL(0x425c6559,0x8dd1fb83),LL(0x0af06fda,0x7fc00ee6),LL(0x33d956df,0xe98c9225),LL(0x4fbdc8a2,0x0f1ef335), LL(0xb79b8ea2,0x2abb5145),LL(0xbdbff288,0x40fd2945),LL(0xd7185db7,0x6a814ac4),LL(0xc084609a,0xc4329d6f),
+ LL(0xed1be45d,0xc9ba7b52),LL(0xe4cd2c74,0x891dd20d),LL(0x824139b1,0x5a4d4a7f),LL(0xb873c710,0x66c17716), LL(0x2843c4e0,0x5e5bc141),LL(0xb97eb5bf,0xd5ac4817),LL(0x450c95c7,0xc0f8af54),LL(0x318406c5,0xc91b3fa0),
+ LL(0xab9d97f8,0x360c340a),LL(0x90a2d611,0xfb57bd07),LL(0xa6a6f7e5,0x4339ae3c),LL(0x2feb8a10,0x9c1fcd2a), LL(0xc7ea7432,0x972bcca9),LL(0x308076f6,0x1b0b924c),LL(0x2a5b4ca5,0x80b2814a),LL(0x61ef3b29,0x2f78f55b),
+ LL(0xc18a414f,0xf838744a),LL(0x903d0a86,0xc611eaae),LL(0x2a453f55,0x94dabc16),LL(0x14efb279,0xe6f2e3da), LL(0x9320dc3c,0x5b7a6017),LL(0x8df6b5a4,0x692e382f),LL(0x2d40fa90,0x3f5e15e0),LL(0x643dd318,0xc87883ae),
+ LL(0x53544774,0x511053e4),LL(0x3adba2bc,0x834d0ecc),LL(0xbae371f5,0x4215d7f7),LL(0x6c8663bc,0xfcfd57bf), LL(0xd6901b1d,0xded2383d),LL(0xb5587dc3,0x3b49fbb4),LL(0x07625f62,0xfd44a08d),LL(0x9de9b762,0x3ee4d65b),
+},
+/* digit=27 base_pwr=2^189 */
+{
+ LL(0x0d63d1fa,0x64e5137d),LL(0x02a9d89f,0x658fc052),LL(0x50436309,0x48894874),LL(0xd598da61,0xe9ae30f8), LL(0x818baf91,0x2ed710d1),LL(0x8b6a0c20,0xe27e9e06),LL(0x1c1a6b44,0x1e28dcfb),LL(0xd6ac57dc,0x883acb64),
+ LL(0xc2c6ff70,0x8735728d),LL(0xc5dc2235,0x79d6122f),LL(0x19e277f9,0x23f5d003),LL(0xdded8cc7,0x7ee84e25), LL(0x63cd880a,0x91a8afb0),LL(0x3574af60,0x3f3ea7c6),LL(0x02de7f42,0x0cfcdc84),LL(0xb31aa152,0x62d0792f),
+ LL(0x8a5807ce,0x8e1b4e43),LL(0xe4109a7e,0xad283893),LL(0xafd59dda,0xc30cc9cb),LL(0x3d8d8093,0xf65f36c6), LL(0xa60d32b2,0xdf31469e),LL(0x3e8191c8,0xee93df4b),LL(0x355bdeb5,0x9c1017c5),LL(0x8616aa28,0xd2623185),
+ LL(0xdec31a21,0xb02c83f9),LL(0x6ad9d573,0x988c8b23),LL(0xa57be365,0x53e983ae),LL(0x646f834e,0xe968734d), LL(0x5da6309b,0x9137ea8f),LL(0xc1f1ce16,0x10f3a624),LL(0xca440921,0x782a9ea2),LL(0x5b46f1b5,0xdf94739e),
+ LL(0xcce85c9b,0x9f9be006),LL(0xa4c7c2d3,0x360e70d6),LL(0xaefa1e60,0x2cd5beea),LL(0x8c3d2b6d,0x64cf63c0), LL(0xe1cf6f90,0xfb107fa3),LL(0xd5e044e6,0xb7e937c6),LL(0xce34db9f,0x74e8ca78),LL(0x3e210bd0,0x4f8b36c1),
+ LL(0x34a35ea8,0x1df165a4),LL(0x4d4412f6,0x3418e0f7),LL(0x518836c3,0x5af1f8af),LL(0x130e1965,0x42ceef4d), LL(0x543a1957,0x5560ca0b),LL(0x886cb123,0xc33761e5),LL(0xfe98ed30,0x66624b1f),LL(0x1090997d,0xf772f4bf),
+ LL(0x4885d410,0xf4e540bb),LL(0x9ba5f8d7,0x7287f810),LL(0xde98dfb1,0x22d0d865),LL(0xbcfbb8a3,0x49ff51a1), LL(0x6bc3012e,0xb6b6fa53),LL(0x170d541d,0x3d31fd72),LL(0x4b0f4966,0x8018724f),LL(0x87dbde07,0x79e7399f),
+ LL(0xf4f8b16a,0x56f8410e),LL(0xc47b266a,0x97241afe),LL(0x6d9c87c1,0x0a406b8e),LL(0xcd42ab1b,0x803f3e02), LL(0x04dbec69,0x7f0309a8),LL(0x3bbad05f,0xa83b85f7),LL(0xad8e197f,0xc6097273),LL(0x5067adc1,0xc097440e),
+ LL(0x3524ff16,0x730eafb6),LL(0x823fc6ce,0xd7f9b51e),LL(0x443e4ac0,0x27bd0d32),LL(0x4d66f217,0x40c59ad9), LL(0x17c387a4,0x6c33136f),LL(0xeb86804d,0x5043b8d5),LL(0x675a73c9,0x74970312),LL(0xf16669b6,0x838fdb31),
+ LL(0x418e7ddd,0xc507b6dd),LL(0x472f19d6,0x39888d93),LL(0x0c27eb4d,0x7eae26be),LL(0xfbabb884,0x17b53ed3), LL(0x2b01ae4f,0xfc27021b),LL(0xcf488682,0x88462e87),LL(0x215e2d87,0xbee096ec),LL(0xd242e29b,0xeb2fea9a),
+ LL(0xb821fc28,0x5d985b5f),LL(0xdc1e2ad2,0x89d2e197),LL(0x9030ba62,0x55b566b8),LL(0x4f41b1c6,0xe3fd41b5), LL(0xb9a96d61,0xb738ac2e),LL(0x369443f4,0x7f8567ca),LL(0xf803a440,0x8698622d),LL(0x8fe2f4dc,0x2b586236),
+ LL(0x56b95bce,0xbbcc00c7),LL(0x616da680,0x5ec03906),LL(0x72214252,0x79162ee6),LL(0x86a892d2,0x43132b63), LL(0x2f3263bf,0x4bdd3ff2),LL(0x9cd0a142,0xd5b3733c),LL(0x44415ccb,0x592eaa82),LL(0x8d5474ea,0x663e8924),
+ LL(0x5236344e,0x8058a25e),LL(0xbda76ee6,0x82e8df9d),LL(0x11cc3d22,0xdcf6efd8),LL(0x3b4ab529,0x00089cda), LL(0xbd38a3db,0x91d3a071),LL(0xef72b925,0x4ea97fc0),LL(0xea3edf75,0x0c9fc15b),LL(0xa4348ed3,0x5a6297cd),
+ LL(0xce7c42d4,0x0d38ab35),LL(0x82feab10,0x9fd493ef),LL(0x82111b45,0x46056b6d),LL(0x73efc5c3,0xda11dae1), LL(0x5545a7fb,0xdc740278),LL(0x40d507e6,0xbdb2601c),LL(0x7066fa58,0x121dfeeb),LL(0x39ae8c2a,0x214369a8),
+ LL(0x06e0956c,0x195709cb),LL(0x010cd34b,0x4c9d254f),LL(0x0471a532,0xf51e13f7),LL(0x1e73054d,0xe19d6791), LL(0xdb5c7be3,0xf702a628),LL(0xb24dde05,0xc7141218),LL(0xf29b2e2e,0xdc18233c),LL(0x85342dba,0x3a6bd1e8),
+ LL(0xb311898c,0x3f747fa0),LL(0xcd0eac65,0xe2a272e4),LL(0xf914d0bc,0x4bba5851),LL(0xc4a43ee3,0x7a1a9660), LL(0xa1c8cde9,0xe5a367ce),LL(0x7271abe3,0x9d958ba9),LL(0x3d1615cd,0xf3ff7eb6),LL(0xf5ae20b0,0xa2280dce),
+ LL(0xcf640147,0x56dba5c1),LL(0x5e83d118,0xea5a2e3d),LL(0xda24c511,0x04cd6b6d),LL(0xe854d214,0x1c0f4671), LL(0x69565381,0x91a6b7a9),LL(0xdecf1f5b,0xdc966240),LL(0xfcf5d009,0x1b22d21c),LL(0x9021dbd5,0x2a05f641),
+ LL(0xd4312483,0x8c0ed566),LL(0x643e216f,0x5179a95d),LL(0x17044493,0xcc185fec),LL(0x54991a21,0xb3063339), LL(0x0081a726,0xd801ecdb),LL(0x4fa89bbb,0x0149b0c6),LL(0x4391b6b9,0xafe9065a),LL(0xd633f3a3,0xedc92786),
+ LL(0xae6a8e13,0xe408c24a),LL(0x9f3897ab,0x85833fde),LL(0xd81a0715,0x43800e7e),LL(0xb44ffc5f,0xde08e346), LL(0xcdeff2e0,0x7094184c),LL(0x165eaed1,0x49f9387b),LL(0x777c468a,0x635d6129),LL(0x538c2dd8,0x8c0dcfd1),
+ LL(0x7a6a308b,0xd6d9d9e3),LL(0x4c2767d3,0x62375830),LL(0xf38cbeb6,0x874a8bc6),LL(0xccb6fd9e,0xd94d3f1a), LL(0xba21f248,0x92a9735b),LL(0x6cd1efb0,0x272ad0e5),LL(0x05b03284,0x7437b69c),LL(0x6948c225,0xe7f04702),
+ LL(0xcba2ecec,0x8a56c04a),LL(0xe3a73e41,0x0c181270),LL(0x03e93725,0x6cb34e9d),LL(0x496521a9,0xf77c8713), LL(0xfa7f9f90,0x94569183),LL(0x8c9707ad,0xf2e7aa4c),LL(0x26c1c9a3,0xced2c9ba),LL(0x40197507,0x9109fe96),
+ LL(0xe9adfe1c,0x9ae868a9),LL(0x314e39bb,0x3984403d),LL(0xf2fe378f,0xb5875720),LL(0xba44a628,0x33f901e0), LL(0x3652438c,0xea1125fe),LL(0x9dd1f20b,0xae9ec4e6),LL(0xbebf7fbd,0x1e740d9e),LL(0x42dbe79c,0x6dbd3ddc),
+ LL(0xedd36776,0x62082aec),LL(0xe9859039,0xf612c478),LL(0x032f7065,0xa493b201),LL(0x4ff9b211,0xebd4d8f2), LL(0xaac4cb32,0x3f23a0aa),LL(0x15ed4005,0xea3aadb7),LL(0xafa27e63,0xacf17ea4),LL(0xc11fd66c,0x56125c1a),
+ LL(0x3794f8dc,0x266344a4),LL(0x483c5c36,0xdcca923a),LL(0x3f9d10a0,0x2d6b6bbf),LL(0x81d9bdf3,0xb320c5ca), LL(0x47b50a95,0x620e28ff),LL(0xcef03371,0x933e3b01),LL(0x99100153,0xf081bf85),LL(0xc3a8c8d6,0x183be9a0),
+ LL(0xd6bbe24d,0x4e3ddc5a),LL(0x53843795,0xc6c74630),LL(0x65ec2d4c,0x78193dd7),LL(0xcd3c89b2,0xb8df26cc), LL(0x5a483f8d,0x98dbe399),LL(0x7dd3313a,0x72d8a957),LL(0xab0bd375,0x65087294),LL(0x7c259d16,0xfcd89248),
+ LL(0x7613aa81,0x8a9443d7),LL(0x85fe6584,0x80100800),LL(0x7fb10288,0x70fc4dbc),LL(0xe86beee8,0xf58280d3), LL(0x7c978c38,0x14fdd82f),LL(0x0de44d7b,0xdf1204c1),LL(0x4160252f,0xa08a1c84),LL(0xc17646a5,0x591554ca),
+ LL(0xa05bd525,0x214a37d6),LL(0x07957b3c,0x48d5f09b),LL(0xd7109bc9,0x0247cdcb),LL(0x30599ce7,0x40f9e4bb), LL(0xf46ad2ec,0xc325fa03),LL(0xc3e3f9ee,0x00f766cf),LL(0xd43a4577,0xab556668),LL(0x3ee03b93,0x68d30a61),
+ LL(0x77b46a08,0x7ddc81ea),LL(0xc7480699,0xcf5a6477),LL(0x6633f683,0x43a8cb34),LL(0x92363c60,0x1b867e6b), LL(0x1f60558e,0x43921114),LL(0x2f41450e,0xcdbcdd63),LL(0xcc630e8b,0x7fc04601),LL(0x97038b43,0xea7c66d5),
+ LL(0x04e99fd8,0x7259b8a5),LL(0x4785549a,0x98a8dd12),LL(0x840552e1,0x0e459a7c),LL(0x4bb0909e,0xcdfcf4d0), LL(0x53758da7,0x34a86db2),LL(0xeac997e1,0xe643bb83),LL(0x530c5b7e,0x96400bd7),LL(0xb41c8b52,0x9f97af87),
+ LL(0xfbeee3f9,0x34fc8820),LL(0x49091afd,0x93e53490),LL(0x9a31f35c,0x764b9be5),LL(0x57e3d924,0x71f37864), LL(0x943aa75e,0x02fb34e0),LL(0xab8ff6e4,0xa18c9c58),LL(0x33cf0d19,0x080f31b1),LL(0x083518a7,0x5c9682db),
+ LL(0xb709c3de,0x873d4ca6),LL(0x3575b8f0,0x64a84262),LL(0x020154bb,0x6275da1f),LL(0xd17cf1ab,0x97678caa), LL(0x951a95c3,0x8779795f),LL(0x50fccc08,0xdd35b163),LL(0x33d8f031,0x32709627),LL(0x498dd85c,0x3c5ab10a),
+ LL(0x41dca566,0xb6c185c3),LL(0xd8622aa3,0x7de7feda),LL(0x901b6dfb,0x99e84d92),LL(0x7c4ad288,0x30a02b0e), LL(0x2fd3cf36,0xc7c81daa),LL(0xdf89e59f,0xd1319547),LL(0xcd496733,0xb2be8184),LL(0x93d3412b,0xd5f449eb),
+ LL(0x25fe531d,0x7ea41b1b),LL(0x6a1d5646,0xf9797432),LL(0x2bde501a,0x86067f72),LL(0x0c85e89c,0xf91481c0), LL(0xf8b05bc6,0xca8ee465),LL(0x02e83cda,0x1844e1cf),LL(0xb4dbe33b,0xca82114a),LL(0x4eabfde2,0x0f9f8769),
+ LL(0x38b27fe2,0x4936b1c0),LL(0xaba402df,0x63b6359b),LL(0x656bdbab,0x40c0ea2f),LL(0x6580c39c,0x9c992a89), LL(0x2a60aed1,0x600e8f15),LL(0xe0bf49df,0xeb089ca4),LL(0x2d42d99a,0x9c233d7d),LL(0x4c6bc2fa,0x648d3f95),
+ LL(0xe1add3f3,0xdcc383a8),LL(0x4f64a348,0xf42c0c6a),LL(0x0030dbdb,0x2abd176f),LL(0x7d6c215e,0x4de501a3), LL(0x4b9a64bc,0x4a107c1f),LL(0x2496cd59,0xa77f0ad3),LL(0x7688dffb,0xfb78ac62),LL(0x67937d8e,0x7025a2ca),
+ LL(0xd1a8f4e7,0xfde8b2d1),LL(0x7354927c,0xf5b3da47),LL(0xd9205735,0xe48606a3),LL(0xe177b917,0xac477cc6), LL(0xa883239a,0xfb1f73d2),LL(0xcc8b8357,0xe12572f6),LL(0xfb1f4f86,0x9d355e9c),LL(0xd9f3ec6e,0x89b795f8),
+ LL(0xb54398dc,0x27be56f1),LL(0x3fedeed5,0x1890efd7),LL(0x9c6d0140,0x62f77f1f),LL(0x596f0ee4,0x7ef0e314), LL(0xcc61dab3,0x50ca6631),LL(0xf4866e4f,0x4a39801d),LL(0xae363b39,0x66c8d032),LL(0x2ead66aa,0x22c591e5),
+ LL(0xde02a53e,0x954ba308),LL(0xd389f357,0x2a6c060f),LL(0xfbf40b66,0xe6cfcde8),LL(0xc6340ce1,0x8e02fc56), LL(0x73adb4ba,0xe4957795),LL(0xa7b03805,0x7b86122c),LL(0x0c8e6fa6,0x63f83512),LL(0x057d7804,0x83660ea0),
+ LL(0x21ba473c,0xbad79105),LL(0xded5389d,0xb6c50bee),LL(0xaa7c9bc0,0xee2caf4d),LL(0x8c4e98a7,0xd97b8de4), LL(0xab3bbddb,0xa9f63e70),LL(0x2597815a,0x3898aabf),LL(0xac15b3d9,0x7659af89),LL(0x703ce784,0xedf7725b),
+ LL(0xe085116b,0x25470fab),LL(0x87285310,0x04a43375),LL(0xe2bfd52f,0x4e39187e),LL(0x7d9ebc74,0x36166b44), LL(0xfd4b322c,0x92ad433c),LL(0xba79ab51,0x726aa817),LL(0xc1db15eb,0xf96eacd8),LL(0x0476be63,0xfaf71e91),
+ LL(0x641fad98,0xdd69a640),LL(0x29622559,0xb7995918),LL(0xde4199dc,0x03c6daa5),LL(0xad545eb4,0x92cadc97), LL(0x256534e4,0x1028238b),LL(0x8595409a,0x73e80ce6),LL(0xd05dc59b,0x690d4c66),LL(0x981dee80,0xc95f7b8f),
+ LL(0xd856ac25,0xf4337014),LL(0xac524dca,0x441bd9dd),LL(0x5f0499f5,0x640b3d85),LL(0xd5fda182,0x39cf84a9), LL(0xb2aa95a0,0x04e7b055),LL(0x0ddf1860,0x29e33f0a),LL(0x423f6b43,0x082e74b5),LL(0x0aaa2b0f,0x217edeb9),
+ LL(0x83cbea55,0x58b83f35),LL(0xbc185d70,0xc485ee4d),LL(0x1e5f6992,0x833ff03b),LL(0xcf0c0dd5,0xb5b9b9cc), LL(0x4e9e8a50,0x7caaee8e),LL(0x6269dafd,0x462e907b),LL(0xfbe791c6,0x6ed5cee9),LL(0xed430790,0x68ca3259),
+ LL(0x13b5ba88,0x2b72bdf2),LL(0x35ef0ac4,0x60294c8a),LL(0x19b99b08,0x9c3230ed),LL(0x6c2589aa,0x560fff17), LL(0xd6770374,0x552b8487),LL(0x9a56f685,0xa373202d),LL(0x45f175d9,0xd3e7f907),LL(0xd080d810,0x3c2f315f),
+ LL(0x7b9520e8,0x1130e9dd),LL(0x0af037b5,0xc078f9e2),LL(0x1e9c104c,0x38cd2ec7),LL(0xc472fe92,0x0f684368), LL(0x6247e7ef,0xd3f1b5ed),LL(0x396dfe21,0xb32d33a9),LL(0x4a9aa2c2,0x46f59cf4),LL(0xff0f7e41,0x69cd5168),
+ LL(0x4b3234da,0x3f59da0f),LL(0xb4579ebe,0xcf0b0235),LL(0x6d2476c7,0x6d1cbb25),LL(0x9dc30f08,0x4f0837e6), LL(0x906f6e98,0x9a4075bb),LL(0xc761e7d1,0x253bb434),LL(0x6e73af10,0xde2e645f),LL(0x0c5f131c,0xb89a4060),
+ LL(0xb8cc037f,0xd12840c5),LL(0x7405bb47,0x3d093a5b),LL(0x206348b8,0x6202c253),LL(0xc55a3ca7,0xbf5d57fc), LL(0x8c3bef48,0x89f6c90c),LL(0x5a0a960a,0x23ac7623),LL(0x552b42ab,0xdfbd3d6b),LL(0x132061f6,0x3ef22458),
+ LL(0xc97e6516,0xd74e9bda),LL(0xc230f49e,0x88779360),LL(0x1e74ea49,0xa6ec1de3),LL(0x3fb645a2,0x581dcee5), LL(0x8f483f14,0xbaef2391),LL(0xd137d13b,0x6d2dddfc),LL(0xd2743a42,0x54cde50e),LL(0xe4d97e67,0x89a34fc5),
+ LL(0x12e08ce5,0x13f1f5b3),LL(0xa7f0b2ca,0xa80540b8),LL(0x01982805,0x854bcf77),LL(0x233bea04,0xb8653ffd), LL(0x02b0b4c9,0x8e7b8787),LL(0x9acb170a,0x2675261f),LL(0x930c14e5,0x061a9d90),LL(0xdef0abea,0xb59b30e0),
+ LL(0x0200ec7d,0x1dc19ea6),LL(0x0bce132b,0xb6f4a3f9),LL(0xf13e27e0,0xb8d5de90),LL(0x1fade16f,0xbaee5ef0), LL(0xe4c6cf38,0x6f406aaa),LL(0xd1369815,0xab4cfe06),LL(0xefd550c6,0x0dcffe87),LL(0x75ff7d39,0x9d4f59c7),
+ LL(0x51deb6ad,0xb02553b1),LL(0xb1877749,0x812399a4),LL(0xca6006e1,0xce90f71f),LL(0xb02b6e77,0xc32363a6), LL(0xdc36c64d,0x02284fbe),LL(0xa7e1ae61,0x86c81e31),LL(0xb909d94a,0x2576c7e5),LL(0x818b2bb0,0x8b6f7d02),
+ LL(0x56faa38a,0xeca3ed07),LL(0x9305bb54,0xa3790e6c),LL(0x7bc73061,0xd784eeda),LL(0x6dd50614,0xbd56d369), LL(0x229a8aa9,0xd6575949),LL(0x4595ec28,0xdcca8f47),LL(0x06ab4fe6,0x814305c1),LL(0x24f43f16,0xc8c39768),
+ LL(0x523f2b36,0xe2a45f36),LL(0x920d93bb,0x995c6493),LL(0x90f1632b,0xf8afdab7),LL(0x1c295954,0x79ebbecd), LL(0x79592f48,0xc7bb3ddb),LL(0x5f88e998,0x67216a7b),LL(0xbc01193e,0xd91f098b),LL(0xb1db83fc,0xf7d928a5),
+ LL(0xe991f600,0x55e38417),LL(0x2981a934,0x2a91113e),LL(0x06b13bde,0xcbc9d648),LL(0x0755ff44,0xb011b6ac), LL(0x045ec613,0x6f4cb518),LL(0xc2f5930a,0x522d2d31),LL(0x382e65de,0x5acae1af),LL(0x27bc966f,0x57643067),
+ LL(0x1c7193f0,0x5e12705d),LL(0x3be8858e,0xf0f32f47),LL(0x96c6dfc7,0x785c3d7d),LL(0xbf31795d,0xd75b4a20), LL(0x342659d4,0x91acf17b),LL(0x44f0378f,0xe596ea34),LL(0xce52129d,0x4515708f),LL(0x79f2f585,0x17387e1e),
+ LL(0x49dee168,0x72cfd2e9),LL(0x3e2af239,0x1ae05223),LL(0x1d94066a,0x009e75be),LL(0x38abf413,0x6cca31c7), LL(0x9bc49908,0xb50bd61d),LL(0xf5e2bc1e,0x4a9b4a8c),LL(0x946f83ac,0xeb6cc5f7),LL(0xebffab28,0x27da93fc),
+ LL(0x4821c8c5,0xea314c96),LL(0xa83c15f4,0x8de49ded),LL(0x7af33004,0x7a64cf20),LL(0xc9627e10,0x45f1bfeb), LL(0x54b9df60,0x878b0626),LL(0xa95c0b33,0x5e4fdc3c),LL(0xc2035d8e,0xe54a37ca),LL(0x80f20b8c,0x9087cda9),
+ LL(0x8319ade4,0x36f61c23),LL(0xde8cfdf8,0x766f287a),LL(0x346f3705,0x48821948),LL(0x16e4f4a2,0x49a7b853), LL(0x5cedadfd,0xb9b3f8a7),LL(0x8db2a815,0x8f562815),LL(0x01f68f95,0xc0b7d554),LL(0x688a208e,0x12971e27),
+ LL(0xd0ff34fc,0xc9f8b696),LL(0x1222718c,0x20824de2),LL(0x0c95284d,0x7213cf9f),LL(0xdc158240,0xe2ad741b), LL(0x54043ccf,0x0ee3a6df),LL(0xd84412b3,0x16ff479b),LL(0xdfc98af0,0xf6c74ee0),LL(0x52fcd2fb,0xa78a169f),
+ LL(0x99c930e9,0xd8ae8746),LL(0x49e117a5,0x1d33e858),LL(0x6624759f,0x7581fcb4),LL(0x5bedc01d,0xde50644f), LL(0xcaf3155e,0xbeec5d00),LL(0xbc73e75f,0x672d66ac),LL(0x270b01db,0x86b9d8c6),LL(0x50f55b79,0xd249ef83),
+ LL(0x73978fe3,0x6131d6d4),LL(0x754b00a1,0xcc4e4542),LL(0x57dfcfe9,0x4e05df05),LL(0x51ef6bf0,0x94b29cdd), LL(0x9bc7edf2,0xe4530cff),LL(0xd3da65f3,0x8ac236fd),LL(0xc8eb0b48,0x0faf7d5f),LL(0x660eb039,0x4d2de14c),
+ LL(0x60430e54,0xc006bba7),LL(0xda3289ab,0x10a2d0d6),LL(0xd7979c59,0x9c037a5d),LL(0xa116d944,0x04d1f3d3), LL(0x8a0983cd,0x9ff22473),LL(0xc883cabb,0x28e25b38),LL(0x47a58995,0xe968dba5),LL(0x774eebdf,0x2c80b505),
+ LL(0x4a953beb,0xee763b71),LL(0x1642e7f6,0x502e223f),LL(0x61d5e722,0x6fe4b641),LL(0xdbef5316,0x9d37c5b0), LL(0xf8330bc7,0x0115ed70),LL(0x75a72789,0x139850e6),LL(0xffceccc2,0x27d7faec),LL(0x4fd9f7f6,0x3016a860),
+ LL(0x4cd8f64c,0xc492ec64),LL(0x279d7b51,0x58a2d790),LL(0x1fc75256,0x0ced1fc5),LL(0x8f433017,0x3e658aed), LL(0x05da59eb,0x0b61942e),LL(0x0ddc3722,0xba3d60a3),LL(0x742e7f87,0x7c311cd1),LL(0xf6b01b6e,0x6473ffee),
+},
+/* digit=28 base_pwr=2^196 */
+{
+ LL(0x692ac542,0x8303604f),LL(0x227b91d3,0xf079ffe1),LL(0x15aaf9bd,0x19f63e63),LL(0xf1f344fb,0xf99ee565), LL(0xd6219199,0x8a1d661f),LL(0xd48ce41c,0x8c883bc6),LL(0x3c74d904,0x1065118f),LL(0x0faf8b1b,0x713889ee),
+ LL(0x81a1b3be,0x972b3f8f),LL(0xce2764a0,0x4f3ce145),LL(0x28c4f5f7,0xe2d0f1cc),LL(0xc7f3985b,0xdeee0c0d), LL(0xd39e25c3,0x7df4adc0),LL(0xc467a080,0x40619820),LL(0x61cf5a58,0x440ebc93),LL(0x422ad600,0x527729a6),
+ LL(0xb1b76ba6,0xca6c0937),LL(0x4d2026dc,0x1a2eab85),LL(0x19d9ae0a,0xb1715e15),LL(0xbac4a026,0xf1ad9199), LL(0x07ea7b0e,0x35b3dfb8),LL(0x3ed9eb89,0xedf5496f),LL(0x2d6d08ab,0x8932e5ff),LL(0x25bd2731,0xf314874e),
+ LL(0x3f73f449,0xefb26a75),LL(0x8d44fc79,0x1d1c94f8),LL(0x3bc0dc4d,0x49f0fbc5),LL(0x3698a0d0,0xb747ea0b), LL(0x228d291e,0x5218c3fe),LL(0x43c129d6,0x35b804b5),LL(0xd1acc516,0xfac859b8),LL(0x95d6e668,0x6c10697d),
+ LL(0x0876fd4e,0xc38e438f),LL(0x83d2f383,0x45f0c307),LL(0xb10934cb,0x203cc2ec),LL(0x2c9d46ee,0x6a8f2439), LL(0x65ccde7b,0xf16b431b),LL(0x27e76a6f,0x41e2cd18),LL(0x4e3484d7,0xb9c8cf8f),LL(0x8315244a,0x64426efd),
+ LL(0xfc94dea3,0x1c0a8e44),LL(0xdad6a0b0,0x34c8cdbf),LL(0x04113cef,0x919c3840),LL(0x15490ffa,0xfd32fba4), LL(0x795dcfb7,0x58d190f6),LL(0x83588baf,0xfef01b03),LL(0xca1fc1c0,0x9e6d1d63),LL(0xf0a41ac9,0x53173f96),
+ LL(0xba16f73b,0x2b1d402a),LL(0x8cf9b9fc,0x2fb31014),LL(0x446ef7bf,0x2d51e60e),LL(0xb91e1745,0xc731021b), LL(0x4fee99d4,0x9d3b4724),LL(0xfac5c1ea,0x4bca48b6),LL(0xbbea9af7,0x70f5f514),LL(0x974c283a,0x751f55a5),
+ LL(0xcb452fdb,0x6e30251a),LL(0x50f30650,0x31ee6965),LL(0x933548d9,0xb0b3e508),LL(0xf4b0ef5b,0xb8949a4f), LL(0x3c88f3bd,0x208b8326),LL(0xdb1d9989,0xab147c30),LL(0x44d4df03,0xed6515fd),LL(0xe72eb0c5,0x17a12f75),
+ LL(0x36cf69db,0x3b59796d),LL(0x56670c18,0x1219eee9),LL(0x7a070d8e,0xfe3341f7),LL(0xa327f90c,0x9b70130b), LL(0x0ae18e0e,0x36a32462),LL(0x46c0a638,0x2021a623),LL(0xc62eb0d4,0x251b5817),LL(0x4c762293,0x87bfbcdf),
+ LL(0xcdd61d64,0xf78ab505),LL(0xc8c18857,0x8c7a53fc),LL(0x16147515,0xa653ce6f),LL(0xea7d52d5,0x9c923aa5), LL(0x5c18871f,0xc24709cb),LL(0x73b3cc74,0x7d53bec8),LL(0xfdd1d4c4,0x59264aff),LL(0x240da582,0x5555917e),
+ LL(0x548f5a0e,0xcae8bbda),LL(0x3bbfbbe1,0x1910eaba),LL(0x7677afc3,0xae579685),LL(0x73ff0b5c,0x49ea61f1), LL(0x4f7c3922,0x78655478),LL(0x20c68eef,0x95d337cd),LL(0xdf779ab9,0x68f1e1e5),LL(0xb5cf69a8,0x14b491b0),
+ LL(0x28e3fe89,0x7a6cbbe0),LL(0xc5aac0eb,0xe7e1fee4),LL(0x697e5140,0x7f47eda5),LL(0xb454921f,0x4f450137), LL(0x95cd8185,0xdb625f84),LL(0xcdb2e583,0x74be0ba1),LL(0xdd5e6de4,0xaee4fd7c),LL(0xe8101739,0x4251437d),
+ LL(0xac620366,0x686d72a0),LL(0xb6d59344,0x4be3fb9c),LL(0xa1eb75b9,0x6e8b44e7),LL(0x91a5c10c,0x84e39da3), LL(0xb38f0409,0x37cc1490),LL(0x2c2ade82,0x02951943),LL(0x1190a2d8,0x9b688783),LL(0x231182ba,0x25627d14),
+ LL(0x658a6d87,0x6eb550aa),LL(0xcf9c7325,0x1405aaa7),LL(0x5c8748c9,0xd147142e),LL(0x53ede0e0,0x7f637e4f), LL(0x14ffad2c,0xf8ca2776),LL(0xbafb6791,0xe58fb1bd),LL(0xbf8f93fc,0x17158c23),LL(0x0a4a4655,0x7f15b373),
+ LL(0xd842ca72,0x39d4add2),LL(0x3ed96305,0xa71e4391),LL(0x6700be14,0x5bb09cbe),LL(0xd8befcf6,0x68d69d54), LL(0x37183bcf,0xa45f5367),LL(0x3370dff7,0x7152b7bb),LL(0xbf12525b,0xcf887baa),LL(0xd6d1e3cd,0xe7ac7bdd),
+ LL(0x81fdad90,0x25914f78),LL(0x0d2cf6ab,0xcf638f56),LL(0xcc054de5,0xb90bc03f),LL(0x18b06350,0x932811a7), LL(0x9bbd11ff,0x2f00b330),LL(0xb4044974,0x76108a6f),LL(0xa851d266,0x801bb9e0),LL(0xbf8990c1,0x0dd099be),
+ LL(0xabe32986,0x58c5aaaa),LL(0x50d59c27,0x0fe9dd2a),LL(0x8d307305,0x84951ff4),LL(0x86529b78,0x6c23f829), LL(0x0b136a79,0x50bb2218),LL(0x77a20996,0x7e2174de),LL(0xc0bb4da6,0x6f00a4b9),LL(0xefdde8da,0x89a25a17),
+ LL(0xc11ee01d,0xf728a27e),LL(0xe5f10dfb,0xf900553a),LL(0x02ec893c,0x189a83c8),LL(0x23f66d77,0x3ca5bdc1), LL(0x97eada9f,0x98781537),LL(0x10256230,0x59c50ab3),LL(0x323c69b3,0x346042d9),LL(0x2c460449,0x1b715a6d),
+ LL(0x6ae06e0b,0xa41dd476),LL(0x9d42e25f,0xcdd7888e),LL(0x56b25a20,0x0f395f74),LL(0x8700e27e,0xeadfe0ae), LL(0x69950093,0xb09d52a9),LL(0x327f8d40,0x3525d9cb),LL(0x67df886a,0xb8235a94),LL(0x035faec2,0x77e4b0dd),
+ LL(0x517d7061,0x115eb20a),LL(0x6c2df683,0x77fe3433),LL(0xcdc6fc67,0x6870ddc7),LL(0x0b87de83,0xb1610588), LL(0xd9c4ddbe,0x343584ca),LL(0x3d754be2,0xb3164f1c),LL(0xc1e6c894,0x0731ed3a),LL(0x4f6b904c,0x26327dec),
+ LL(0x97b5cd32,0x9d49c6de),LL(0xb5eceecd,0x40835dae),LL(0xd9ded7fe,0xc66350ed),LL(0x7a678804,0x8aeebb5c), LL(0x5b8ee9ec,0x51d42fb7),LL(0x8e3ca118,0xd7a17bdd),LL(0x2ef4400e,0x40d7511a),LL(0x875a66f4,0xc48990ac),
+ LL(0x2199e347,0x8de07d2a),LL(0x2a39e051,0xbee75556),LL(0x916e51dc,0x56918786),LL(0x4a2d89ec,0xeb191313), LL(0x37d341ed,0x6679610d),LL(0x56d51c2b,0x434fbb41),LL(0xd7492dba,0xe54b7ee7),LL(0x59021493,0xaa33a79a),
+ LL(0xe4bd6d3d,0x49fc5054),LL(0x5ab551d0,0x09540f04),LL(0x4942d3a6,0x8acc9085),LL(0x2d28323b,0x231af02f), LL(0x0992c163,0x93458cac),LL(0x888e3bb4,0x1fef8e71),LL(0xbe8c268c,0x27578da5),LL(0xe805ec00,0xcc8be792),
+ LL(0xc61c3855,0x29267bae),LL(0x58c1fd3b,0xebff429d),LL(0x8c0b93b8,0x22d886c0),LL(0x2ddb8953,0xca5e00b2), LL(0xc3fed8b7,0xcf330117),LL(0x819c01f6,0xd49ac6fa),LL(0x3c0fbd54,0x6ddaa6bd),LL(0x8049a2cf,0x91743068),
+ LL(0xaff2ef81,0xd67f981e),LL(0x2818ae80,0xc3654d35),LL(0x1b2aa892,0x81d05044),LL(0x3d099328,0x2db067bf), LL(0x703dcc97,0xe7c79e86),LL(0xe133e215,0xe66f9b37),LL(0xe39a7a5c,0xcdf119a6),LL(0x876f1b61,0x47c60de3),
+ LL(0xd860f1b2,0x6e405939),LL(0xf5ed4d4a,0x3e9a1dbc),LL(0xc9b6bcbd,0x3f23619e),LL(0x734e4497,0x5ee790cf), LL(0x5bdaf9bb,0xf0a834b1),LL(0x4ca295f0,0x02cedda7),LL(0xcb8e378c,0x4619aa2b),LL(0xcc987ea4,0xe5613244),
+ LL(0x76b23a50,0x0bc022cc),LL(0x0a6c21ce,0x4a2793ad),LL(0x89cac3f5,0x38328780),LL(0xcba26d56,0x29176f1b), LL(0x4f6f59eb,0x06296187),LL(0x8bdc658e,0x86e9bca9),LL(0x57e30402,0x2ca9c4d3),LL(0x516a09bb,0x5438b216),
+ LL(0x7672765a,0x0a6a063c),LL(0x0547b9bf,0x37a3ce64),LL(0x98b1a633,0x42c099c8),LL(0x05ee6961,0xb5ab800d), LL(0x11a5acd6,0xf1963f59),LL(0x46201063,0xbaee6157),LL(0xa596210a,0x36d9a649),LL(0x1ba7138c,0xaed04363),
+ LL(0xa4a82b76,0xcf817d1c),LL(0xf3806be9,0x5586960e),LL(0x09dc6bb5,0x7ab67c89),LL(0x114fe7eb,0x52ace7a0), LL(0xcbbc9b70,0xcd987618),LL(0x604ca5e1,0x4f06fd5a),LL(0x6dbde133,0x90af14ca),LL(0x948a3264,0x1afe4322),
+ LL(0xc44b2c6c,0xa70d2ca6),LL(0x0ef87dfe,0xab726799),LL(0x2e696377,0x310f64dc),LL(0x4c8126a0,0x49b42e68), LL(0xcea0b176,0x0ea444c3),LL(0xcb269182,0x53a8ddf7),LL(0xbbba9dcb,0xf3e674eb),LL(0xd8669d33,0x0d2878a8),
+ LL(0xd019b6a3,0x04b935d5),LL(0x406f1e46,0xbb5cf88e),LL(0x5b57c111,0xa1912d16),LL(0x19ebfd78,0x9803fc21), LL(0xc07764a9,0x4f231c9e),LL(0xb75bd055,0xd93286ee),LL(0x8ee6c9de,0x83a9457d),LL(0x6087ec90,0x04695915),
+ LL(0x58d6cd46,0x14c6dd8a),LL(0x8e6634d2,0x9cb633b5),LL(0xf81bc328,0xc1305047),LL(0x26a177e5,0x12ede0e2), LL(0x065a6f4f,0x332cca62),LL(0x67be487b,0xc3a47ecd),LL(0x0f47ed1c,0x741eb187),LL(0xe7598b14,0x99e66e58),
+ LL(0x63d0ff12,0x6f0544ca),LL(0xb610a05f,0xe5efc784),LL(0x7cad7b47,0xf72917b1),LL(0xf2cac0c0,0x3ff6ea20), LL(0xf21db8b7,0xcc23791b),LL(0xd7d93565,0x7dac70b1),LL(0x694bdaad,0x682cda1d),LL(0x1023516d,0xeb88bb8c),
+ LL(0xdfdbeb1b,0xc4c634b4),LL(0xb4ee4dea,0x22f5ca72),LL(0xe6524821,0x1045a368),LL(0x052b18b2,0xed9e8a3f), LL(0xb961f49a,0x9b7f2cb1),LL(0x7b009670,0x7fee2ec1),LL(0x22507a6d,0x350d8754),LL(0x4db55f1d,0x561bd711),
+ LL(0x320bbcaf,0x4c189ccc),LL(0xdf1de48c,0x568434cf),LL(0x0fa8f128,0x6af1b00e),LL(0x8907583c,0xf0ba9d02), LL(0x32ff9f60,0x735a4004),LL(0xc25dcf33,0x3dd8e4b6),LL(0x42c74cef,0xf2230f16),LL(0x013fa8ad,0xd8117623),
+ LL(0xf51fe76e,0x36822876),LL(0x11d62589,0x8a6811cc),LL(0x46225718,0xc3fc7e65),LL(0xc82fdbcd,0xb7df2c9f), LL(0xdd7b205b,0x3b1d4e52),LL(0x47a2e414,0xb6959478),LL(0xefa91148,0x05e4d793),LL(0xfd2e9675,0xb47ed446),
+ LL(0x04c9d9bf,0x1a7098b9),LL(0x1b793048,0x661e2881),LL(0xb01ee461,0xb1a16966),LL(0x2954746f,0xbc521308), LL(0x2477de50,0xc909a0fc),LL(0x7dbd51ef,0xd80bb41c),LL(0x53294905,0xa85be7ec),LL(0x83958f97,0x6d465b18),
+ LL(0xfb6840fd,0x16f6f330),LL(0x3401e6c8,0xfaaeb214),LL(0xccb5b4f8,0xaf83d30f),LL(0x266dec4b,0x22885739), LL(0x7bc467df,0x51b4367c),LL(0xd842d27a,0x926562e3),LL(0x0fea14a6,0xdfcb6614),LL(0xf2734cd9,0xeb394dae),
+ LL(0x11c0be98,0x3eeae5d2),LL(0x814e8165,0xb1e6ed11),LL(0xe52bce1c,0x191086bc),LL(0xa75a04da,0x14b74cc6), LL(0x8c060985,0x63cf1186),LL(0x2dbd7f7c,0x071047de),LL(0xce0942ca,0x4e433b8b),LL(0xd8fec61d,0xecbac447),
+ LL(0xebf3232f,0x8f0ed0e2),LL(0xc52a2edd,0xfff80f9e),LL(0x75b55fdb,0xad9ab433),LL(0xe42e0c11,0x73ca7820), LL(0xe6251b46,0x6dace0a0),LL(0x4c0d932d,0x89bc6b5c),LL(0x095da19a,0x3438cd77),LL(0x8d48bdfb,0x2f24a939),
+ LL(0x766561b7,0x99b47e46),LL(0x0ed0322a,0x736600e6),LL(0x638e1865,0x06a47cb1),LL(0xcb136000,0x927c1c2d), LL(0x0cc5df69,0x29542337),LL(0x09d649a9,0x99b37c02),LL(0x6aefdb27,0xc5f0043c),LL(0x1be95c27,0x6cdd9987),
+ LL(0x390420d2,0x69850931),LL(0x0983efa4,0x299c40ac),LL(0xaf39aead,0x3a05e778),LL(0x43a45193,0x84274408), LL(0x91a711a0,0x6bcd0fb9),LL(0x9f52ab17,0x461592c8),LL(0xda3c6ed6,0xb49302b4),LL(0x330d7067,0xc51fddc7),
+ LL(0xda50d531,0x94babeb6),LL(0xa6a7b9da,0x521b840d),LL(0x404bdc89,0x5305151e),LL(0xd0d07449,0x1bcde201), LL(0x3b76a59a,0xf427a78b),LL(0x07791a1b,0xf84841ce),LL(0xbf91ed1c,0xebd314be),LL(0xbf172943,0x8e61d34c),
+ LL(0x5541b892,0x1d5dc451),LL(0xfc9d9e54,0xb186ee41),LL(0xd5bf610d,0x9d9f345e),LL(0xf6acca9f,0x3e7ba65d), LL(0xa8369486,0x9dda787a),LL(0x8eb5ba53,0x09f9dab7),LL(0xd6481bc3,0x5afb2033),LL(0xafa62104,0x76f4ce30),
+ LL(0xf4f066b5,0xa8fa00cf),LL(0x461dafc2,0x89ab5143),LL(0xa3389998,0x44339ed7),LL(0xbc214903,0x2ff862f1), LL(0xb05556e3,0x2c88f985),LL(0x3467081e,0xcd96058e),LL(0xedc637ea,0x7d6a4176),LL(0x36a5acdc,0xe1743d09),
+ LL(0x7eb37726,0x66fd72e2),LL(0x1481a037,0xf7fa264e),LL(0x45f4aa79,0x9fbd3bde),LL(0x767c3e22,0xed1e0147), LL(0x82e7abe2,0x7621f979),LL(0x45f633f8,0x19eedc72),LL(0x6137bf3a,0xe69b155e),LL(0x414ee94e,0xa0ad13ce),
+ LL(0x1c0e651a,0x93e3d524),LL(0x02ce227e,0xab1a6e2a),LL(0x4ab27eca,0xe7af1797),LL(0xbd444f39,0x245446de), LL(0x56c07613,0x59e22a21),LL(0xf4275498,0x43deafce),LL(0x67fd0946,0x10834ccb),LL(0x47406edf,0xa75841e5),
+ LL(0x7b0ac93d,0xebd6a677),LL(0x78f5e0d7,0xa6e37b0d),LL(0x76f5492b,0x2516c096),LL(0x9ac05f3a,0x1e4bf888), LL(0x4df0ba2b,0xcdb42ce0),LL(0x5062341b,0x935d5cfd),LL(0x82acac20,0x8a303333),LL(0x5198b00e,0x429438c4),
+ LL(0x049d33fa,0x1d083bc9),LL(0x946f67ff,0x58b82dda),LL(0x67a1d6a3,0xac3e2db8),LL(0x1798aac8,0x62e6bead), LL(0xde46c58c,0xfc85980f),LL(0x69c8d7be,0xa7f69379),LL(0x837b35ec,0x23557927),LL(0xe0790c0c,0x06a933d8),
+ LL(0x077ff55d,0x827c0e9b),LL(0xbb26e680,0x53977798),LL(0x1d9cb54f,0x59530874),LL(0x4aac53ef,0xcca3f449), LL(0xa07eda0f,0x11dc5c87),LL(0xfd6400c8,0xc138bccf),LL(0x13e5da72,0x549680d3),LL(0x4540617e,0xc93eed82),
+ LL(0x4d0b75c0,0xfd3db157),LL(0x6386075b,0x9716eb42),LL(0x817b2c16,0x0639605c),LL(0xf1e4f201,0x09915109), LL(0x5cca6c3b,0x35c9a928),LL(0x3505c900,0xb25f7d1a),LL(0x630480c4,0xeb9f7d20),LL(0x2a1a501c,0xc3c7b8c6),
+ LL(0x5a1f8e24,0x3f99183c),LL(0x9dd255f0,0xfdb118fa),LL(0xc27f62a6,0xb9b18b90),LL(0x396ec191,0xe8f732f7), LL(0x0be786ab,0x524a2d91),LL(0x0ac5a0f5,0x5d32adef),LL(0x9725f694,0x9b53d4d6),LL(0x0510ba89,0x032a76c6),
+ LL(0xebeb1544,0x840391a3),LL(0x3ed73ac3,0x44b7b88c),LL(0x256cb8b3,0xd24bae7a),LL(0xe394cb12,0x7ceb151a), LL(0x5bc1e6a8,0xbd6b66d0),LL(0x090f07bf,0xec70cecb),LL(0x7d937589,0x270644ed),LL(0x5f1dccfe,0xee9e1a3d),
+ LL(0x745b98d2,0xb0d40a84),LL(0x2556ed40,0xda429a21),LL(0x85148cb9,0xf676eced),LL(0xded18936,0x5a22d40c), LL(0x70e8a4ce,0x3bc4b9e5),LL(0x9eae0379,0xbfd1445b),LL(0x1a0bd47e,0xf23f2c0c),LL(0xe1845531,0xa9c0bb31),
+ LL(0x0a4c3f6b,0x9ddc4d60),LL(0x2c15ef44,0xbdfaad79),LL(0x7f484acc,0xce55a236),LL(0x055b1f15,0x08653ca7), LL(0x538873a3,0x2efa8724),LL(0xace1c7e7,0x09299e5d),LL(0xade332ba,0x07afab66),LL(0x92dd71b7,0x9be1fdf6),
+ LL(0x5758b11c,0xa49b5d59),LL(0xc8654f40,0x0b852893),LL(0x52379447,0xb63ef6f4),LL(0x105e690c,0xd4957d29), LL(0x646559b0,0x7d484363),LL(0x49788a8e,0xf4a8273c),LL(0x34ce54a9,0xee406cb8),LL(0xf86fda9b,0x1e1c260f),
+ LL(0xcf6a4a81,0xe150e228),LL(0x1b488772,0x1fa3b6a3),LL(0xc5a9c15b,0x1e6ff110),LL(0x8ad6aa47,0xc6133b91), LL(0x9dffa978,0x8ac5d55c),LL(0x5f3965f2,0xba1d1c1d),LL(0x7732b52f,0xf969f4e0),LL(0xa5172a07,0xfceecdb5),
+ LL(0x10f2b8f5,0xb0120a5f),LL(0x5c4c2f63,0xc83a6cdf),LL(0xf8f9c213,0x4d47a491),LL(0xd3f1bbd5,0xd9e1cce5), LL(0xaba7e372,0x0d91bc7c),LL(0xdfd1a2db,0xfcdc74c8),LL(0x374618e5,0x05efa800),LL(0x15a7925e,0x11216969),
+ LL(0xf6021c5d,0xd4c89823),LL(0xeff14423,0x880d5e84),LL(0x6dcd1396,0x6523bc5a),LL(0x113c978b,0xd1acfdfc), LL(0xbbb66840,0xb0c164e8),LL(0x72b58459,0xf7f4301e),LL(0xa638e8ec,0xc29ad4a6),LL(0x46b78699,0xf5ab8961),
+ LL(0x0e954750,0x9dbd7974),LL(0x64f9d2c6,0x0121de88),LL(0xd985232e,0x2e597b42),LL(0x53451777,0x55b6c3c5), LL(0x519cb9fb,0xbb53e547),LL(0x8428600d,0xf134019f),LL(0xe081791a,0x5a473176),LL(0x35fb0c08,0x2f3e2263),
+ LL(0x73d273b0,0xb28c3017),LL(0x7721ef9a,0xccd21076),LL(0xb650dc39,0x054cc292),LL(0x6188045e,0x662246de), LL(0x6b83c0d1,0x904b52fa),LL(0x97e9cd46,0xa72df267),LL(0x899725e4,0x886b43cd),LL(0xd849ff22,0x2b651688),
+ LL(0x02f34533,0x60479b79),LL(0x0c77c148,0x5e354c14),LL(0xa8537c78,0xb4bb7581),LL(0xefe1495f,0x188043d7), LL(0x8c1d5026,0x9ba12f42),LL(0x93d4aaab,0x2e0c8a26),LL(0xaa57c450,0xbdba7b8b),LL(0x9bbdafef,0x140c9ad6),
+ LL(0x25ac0f18,0x2067aa42),LL(0x04d1fbf3,0xf7b1295b),LL(0xa4b04824,0x14829111),LL(0x33bd5e91,0x2ce3f192), LL(0x8f2e1b72,0x9c7a1d55),LL(0x302aa243,0xfe932286),LL(0xd4be9554,0x497ca7b4),LL(0xe0547a6e,0xb8e821b8),
+ LL(0x67e573e0,0xfb2838be),LL(0x4084c44b,0x05891db9),LL(0x96c1c2c5,0x91311373),LL(0xd958444b,0x6aebfa3f), LL(0xe56e55c1,0xac9cdce9),LL(0x2caa46d0,0x7148ced3),LL(0xb61fe8eb,0x2e10c7ef),LL(0xff97cf4d,0x9fd835da),
+},
+/* digit=29 base_pwr=2^203 */
+{
+ LL(0x081e9387,0xa36da109),LL(0x8c935828,0xfb9780d7),LL(0xe540b015,0xd5940332),LL(0xe0f466fa,0xc9d7b51b), LL(0xd6d9f671,0xfaadcd41),LL(0xb1a2ac17,0xba6c1e28),LL(0xed201e5f,0x066a7833),LL(0xf90f462b,0x19d99719),
+ LL(0x060b5f61,0xf431f462),LL(0x7bd057c2,0xa56f46b4),LL(0x47e1bf65,0x348dca6c),LL(0x41bcf1ff,0x9a38783e), LL(0xda710718,0x7a5d33a9),LL(0x2e0aeaf6,0x5a779987),LL(0x2d29d187,0xca87314d),LL(0xc687d733,0xfa0edc3e),
+ LL(0x6a31e09b,0x9df33621),LL(0xc1350e35,0xde89e44d),LL(0x4ca0cf52,0x29214871),LL(0x0b88a538,0xdf379672), LL(0x2591d61b,0xc92a510a),LL(0x585b447b,0x79aa87d7),LL(0xe5287f77,0xf67db604),LL(0x5efe7a80,0x1697c8bf),
+ LL(0xcb198ac7,0x1c894849),LL(0x0f264665,0xa884a93d),LL(0x9b200678,0x2da964ef),LL(0x009834e6,0x3c351b87), LL(0xe2c4b44b,0xafb2ef9f),LL(0x3326790c,0x580f6c47),LL(0x0b02264a,0xb8480521),LL(0x42a194e2,0x8ba6f9e2),
+ LL(0x8fb54738,0xfc87975f),LL(0x27c3ead3,0x35160788),LL(0xb74a085a,0x834116d2),LL(0xa62fe996,0x53c99a73), LL(0x5b81c51b,0x87585be0),LL(0xbe0852b7,0x925bafa8),LL(0xa84d19a7,0x76a4fafd),LL(0x585206d4,0x39a45982),
+ LL(0x5eb03c0e,0x499b6ab6),LL(0x72bc3fde,0xf19b7954),LL(0x6e3a80d2,0xa86b5b9c),LL(0x6d42819f,0xe4377508), LL(0xbb3ee8a3,0xc1663650),LL(0xb132075f,0x75eb14fc),LL(0x7ad834f6,0xa8ccc906),LL(0xe6e92ffd,0xea6a2474),
+ LL(0x0f8d6758,0x9d72fd95),LL(0x408c07dd,0xcb84e101),LL(0xa5e23221,0xb9114bfd),LL(0xe94e742c,0x358b5fe2), LL(0x95f40e75,0x1c0577ec),LL(0x3d73f3d6,0xf0155451),LL(0xbd1b9b66,0x9d55cd67),LL(0xaf8d63c7,0x63e86e78),
+ LL(0xd3c095f1,0x39d934ab),LL(0xe4b76d71,0x04b261be),LL(0xe73e6984,0x1d2e6970),LL(0x5e5fcb11,0x879fb23b), LL(0xdfd75490,0x11506c72),LL(0x61bcf1c1,0x3a97d085),LL(0xbf5e7007,0x43201d82),LL(0x798232a7,0x7f0ac52f),
+ LL(0x6eb564d4,0x2715cbc4),LL(0x9e570e29,0x8d6c752c),LL(0x9ef5fd5d,0xf80247c8),LL(0xd53eb514,0xc3c66b46), LL(0x0f87de56,0x9666b401),LL(0xc6c603b5,0xce62c06f),LL(0x7e4fc942,0xae7b4c60),LL(0x663a9c19,0x38ac0b77),
+ LL(0x4b049136,0xcb4d20ee),LL(0x356a4613,0x8b63bf12),LL(0x70e08128,0x1221aef6),LL(0x4acb6b16,0xe62d8c51), LL(0x379e7896,0x71f64a67),LL(0xcafd7fa5,0xb25237a2),LL(0x3841ba6a,0xf077bd98),LL(0x3cd16e7e,0xc4ac0244),
+ LL(0x21fea4ca,0x548ba869),LL(0xf3dfdac1,0xd36d0817),LL(0xf4685faf,0x09d8d71f),LL(0xc52c459a,0x8eff66be), LL(0x0b57235e,0x182faee7),LL(0x0106712b,0xee3c39b1),LL(0xc0fcdcb0,0x5107331f),LL(0xa51054ba,0x669fb9dc),
+ LL(0x319d7682,0xb25101fb),LL(0x0a982fee,0xb0293129),LL(0x0261b344,0x51c1c9b9),LL(0xbfd371fa,0x0e008c5b), LL(0x0278ca33,0xd866dd1c),LL(0xe5aa53b1,0x666f76a6),LL(0x6013a2cf,0xe5cfb779),LL(0xa3521836,0x1d3a1aad),
+ LL(0x73faa485,0xcedd2531),LL(0xc0a76878,0xc8ee6c4f),LL(0x2a11667d,0xddbccfc9),LL(0x1c2f695a,0x1a418ea9), LL(0x51f73971,0xdb11bd92),LL(0xda2ed89f,0x3e4b3c82),LL(0xe73e0319,0x9a44f3f4),LL(0x303431af,0xd1e3de0f),
+ LL(0x50f75f9c,0x3c5604ff),LL(0x7e752b22,0x1d8eddf3),LL(0x3c9a1118,0x0ef074dd),LL(0xccb86d7b,0xd0ffc172), LL(0x037d90f2,0xabd1ece3),LL(0x6055856c,0xe3f307d6),LL(0x7e4c6daf,0x422f9328),LL(0x334879a0,0x902aac66),
+ LL(0x94cdfade,0xb6a1e7bf),LL(0x7fc6d634,0x6c97e1ed),LL(0xa2fb63f8,0x662ad24d),LL(0xa5928405,0xf81be1b9), LL(0xd14b4206,0x86d765e4),LL(0x8fa0db65,0xbecc2e0e),LL(0xb17fc76c,0xa28838e0),LL(0xe37cf24e,0xe49a602a),
+ LL(0x567193ec,0x76b4131a),LL(0xe5f6e70b,0xaf3c305a),LL(0x031eebdd,0x9587bd39),LL(0x71bbe831,0x5709def8), LL(0x0eb2b669,0x57059983),LL(0x875b7029,0x4d80ce1b),LL(0x0364ac16,0x838a7da8),LL(0xbe1c83ab,0x2f431d23),
+ LL(0xf9294dd3,0xe56812a6),LL(0x9b4b0d77,0xb448d01f),LL(0x04e8305c,0xf3ae6061),LL(0x94d8c63e,0x2bead645), LL(0x84fd8b07,0x0a85434d),LL(0xf7a9dee5,0x537b983f),LL(0xef55bd85,0xedcc5f18),LL(0x21c6cf8b,0x2041af62),
+ LL(0xb940c71e,0x8e52874c),LL(0xdb5f4b3a,0x211935a9),LL(0x301b1dc3,0x94350492),LL(0x29958620,0x33d2646d), LL(0xef911404,0x16b0d64b),LL(0x9a3c5ef4,0x9d1f25ea),LL(0x4a352c78,0x20f200eb),LL(0x4bd0b428,0x43929f2c),
+ LL(0xc7196e29,0xa5656667),LL(0x9391be48,0x7992c2f0),LL(0x9ee0cd6e,0xaaa97cbd),LL(0x3dc8c9bf,0x51b0310c), LL(0xdd9f22cb,0x237f8acf),LL(0xb585d584,0xbb1d81a1),LL(0x8c416388,0x8d5d85f5),LL(0x42fe474f,0x0d6e5a5a),
+ LL(0x38235d4e,0xe7812766),LL(0x496e3298,0x1c62bd67),LL(0x3f175bc8,0x8378660c),LL(0x17afdd4d,0x4d04e189), LL(0x85a8068c,0x32a81601),LL(0x92b29a85,0xdb58e4e1),LL(0xc70d8a3b,0xe8a65b86),LL(0x98a0403b,0x5f0e6f4e),
+ LL(0x69ed2370,0x08129684),LL(0x0871ee26,0x34dc30bd),LL(0x7c9c5b05,0x3a5ce948),LL(0x43a90c87,0x7d487b80), LL(0xdd0e7179,0x4089ba37),LL(0xb4041811,0x45f80191),LL(0x98747ba5,0x1c3e1058),LL(0x6e1ae592,0x98c4e13a),
+ LL(0xe82c9f9e,0xd44636e6),LL(0xc33a1043,0x711db87c),LL(0xaa8aec05,0x6f431263),LL(0x2744a4aa,0x43ff120d), LL(0xae77779b,0xd3bd892f),LL(0x8cdc9f82,0xf0fe0cc9),LL(0xf1c5b1bc,0xca5f7fe6),LL(0x44929a72,0xcc63a682),
+ LL(0x09dbe19a,0xc7eaba0c),LL(0x6b5c73c2,0x2f3585ad),LL(0x0ae50c30,0x8ab8924b),LL(0x638b30ba,0x17fcd27a), LL(0x10b3d5a5,0xaf414d34),LL(0x2a9accf1,0x09c107d2),LL(0x946a6242,0x15dac49f),LL(0xd707d642,0xaec3df2a),
+ LL(0x3f894ae0,0x2c2492b7),LL(0xb75f18ce,0xf59df3e5),LL(0x8f53cad0,0x7cb740d2),LL(0xc4f01294,0x3eb585fb), LL(0x32c7f717,0x17da0c86),LL(0xaf943f4c,0xeb8c795b),LL(0xf67c51d2,0x4ee23fb5),LL(0x68889949,0xef187575),
+ LL(0x0389168b,0xa6b4bdb2),LL(0xea577d03,0xc4ecd258),LL(0x55743082,0x3a63782b),LL(0xc72f08cd,0x6f678f4c), LL(0x65e58dd8,0x553511cf),LL(0xd402c0cd,0xd53b4e3e),LL(0xa037c14c,0x37de3e29),LL(0xc05712aa,0x86b6c516),
+ LL(0xb38dff6f,0x2834da3e),LL(0xea636be8,0xbe012c52),LL(0x61dd37f8,0x292d238c),LL(0x8f8142db,0x0e54523f), LL(0x036a05d8,0xe31eb436),LL(0x1e93c0ff,0x83e3cdff),LL(0x50821ddf,0x3fd2fe0f),LL(0xff9eb33b,0xc8e19b0d),
+ LL(0xb569a5fe,0xc8cc943f),LL(0xd4342d75,0xad0090d4),LL(0xcaeca000,0x82090b4b),LL(0x1bd410eb,0xca39687f), LL(0x65959d77,0xe7bb0df7),LL(0x9c964999,0x39d78218),LL(0xb2415451,0xd87f62e8),LL(0xbed76108,0xe5efb774),
+ LL(0xe822f0d0,0x3ea011a4),LL(0x5a8704f8,0xbc647ad1),LL(0x50c6820f,0xbb315b35),LL(0xb7e76bec,0x863dec3d), LL(0xf017bfc7,0x01ff5d3a),LL(0x976b8229,0x20054439),LL(0x0bbd0d3b,0x067fca37),LL(0x7f5e3d0f,0xf63dde64),
+ LL(0x2a4c94e9,0x22dbefb3),LL(0x96f8278a,0xafbff0fe),LL(0x3503793d,0x80aea0b1),LL(0x5f06cd29,0xb2238029), LL(0x8ec3feca,0x65703e57),LL(0x393e7053,0x06c38314),LL(0x7c6734c4,0xa0b751eb),LL(0xc59f0f1e,0xd2e8a435),
+ LL(0x5e9ca895,0x147d9052),LL(0x972072df,0x2f4dd31e),LL(0xe6c6755c,0xa16fda8e),LL(0xcf196558,0xc66826ff), LL(0x0cf43895,0x1f1a76a3),LL(0x83c3097b,0xa9d604e0),LL(0x66390e0e,0xe1908309),LL(0xb3c85eff,0xa50bf753),
+ LL(0xf6a70251,0x0696bdde),LL(0x3c6ab16a,0x548b801b),LL(0xa4d08762,0x37fcf704),LL(0xdff76c4e,0x090b3def), LL(0x69cb9158,0x87e8cb89),LL(0x995ece43,0x44a90744),LL(0x0ad9fbf5,0xf85395f4),LL(0x4fb0c82d,0x49b0f6c5),
+ LL(0xadf7cccf,0x75d9bc15),LL(0xdfa1e1b0,0x81a3e5d6),LL(0x249bc17e,0x8c39e444),LL(0x8ea7fd43,0xf37dccb2), LL(0x907fba12,0xda654873),LL(0x4a372904,0x35daa6da),LL(0x6283a6c5,0x0564cfc6),LL(0x4a9395bf,0xd09fa4f6),
+ LL(0xaeb19a36,0x688e9ec9),LL(0xc7bfbfb4,0xd913f1ce),LL(0x61c2faa6,0x797b9a3c),LL(0x6a0a9c12,0x2f979bec), LL(0x359679ec,0xb5969d0f),LL(0x079b0460,0xebcf523d),LL(0x10fab870,0xfd6b0008),LL(0x9373a39c,0x3f2edcda),
+ LL(0x6f568431,0x0d64f9a7),LL(0x02f8898c,0xf848c27c),LL(0x260b5bd5,0xf418ade1),LL(0x6973dee8,0xc1f3e323), LL(0x26c185dd,0x46e9319c),LL(0x546f0ac4,0x6d85b7d8),LL(0x247f9d57,0x427965f2),LL(0xb0035f48,0xb519b636),
+ LL(0xab87d59c,0x6b6163a9),LL(0x39caaa11,0xff9f58c3),LL(0x3177387b,0x4ac39cde),LL(0x873e77f9,0x5f6557c2), LL(0x36a83041,0x67504006),LL(0x75ef196c,0x9b1c96ca),LL(0xb08c7940,0xf34283de),LL(0x1128c316,0x7ea09644),
+ LL(0x6aa39dff,0xb510b3b5),LL(0x9f8e4d8c,0x59b43da2),LL(0x9e4c4b9f,0xa8ce31fd),LL(0xc1303c01,0x0e20be26), LL(0xe8ee47c9,0x18187182),LL(0x7db98101,0xd9687cdb),LL(0xa1e14ff6,0x7a520e4d),LL(0x8836d572,0x429808ba),
+ LL(0x4944b663,0xa37ca60d),LL(0xa3f91ae5,0xf901f7a9),LL(0x9e36e3b1,0xe4e3e76e),LL(0x29d93250,0x9aa219cf), LL(0x056a2512,0x347fe275),LL(0xde65d95c,0xa4d643d9),LL(0x699fc3ed,0x9669d396),LL(0xcf8c6bbe,0xb598dee2),
+ LL(0xdda9e5c6,0x682ac1e5),LL(0xcaa9fc95,0x4e0d3c72),LL(0x772bea44,0x17faaade),LL(0xab0009c8,0x5ef8428c), LL(0x460ff016,0xcc4ce47a),LL(0x725281cb,0xda6d12bf),LL(0x0223aad2,0x44c67848),LL(0x36256e28,0x6e342afa),
+ LL(0x93a37c04,0x1400bb0b),LL(0xdd10bd96,0x62b1bc9b),LL(0x0dac46b7,0x7251adeb),LL(0x7be4ef51,0x7d33b92e), LL(0xe61fa29a,0x28b2a94b),LL(0x06422233,0x4b2be13f),LL(0x330d8d37,0x36d6d062),LL(0xb28ca005,0x5ef80e1e),
+ LL(0x6d16768e,0x174d4699),LL(0x628bf217,0x9fc4ff6a),LL(0x154e490d,0x77705a94),LL(0x8d2d997a,0x9d96dd28), LL(0xce5d72c4,0x77e2d9d8),LL(0xc11c714f,0x9d06c5a4),LL(0x79e4a03e,0x02aa5136),LL(0x030ff28b,0x1386b3c2),
+ LL(0xfb283f61,0xfe82e8a6),LL(0xf3abc3fb,0x7df203e5),LL(0x3a4d3622,0xeec7c351),LL(0xdf762761,0xf7d17dbf), LL(0x522055f0,0xc3956e44),LL(0x8fa748db,0xde3012db),LL(0xbf1dcc14,0xca9fcb63),LL(0xbe4e2f3a,0xa56d9dcf),
+ LL(0x8bcec9c2,0xb86186b6),LL(0x680b9f06,0x7cf24df9),LL(0xc0d29281,0xc46b45ea),LL(0x07b10e12,0xfff42bc5), LL(0x4d289427,0x12263c40),LL(0xb4848ec4,0x3d5f1899),LL(0xd040800c,0x11f97010),LL(0x300feb20,0xb4c5f529),
+ LL(0xde94fdcb,0xcc543f8f),LL(0xc7c2f05e,0xe96af739),LL(0x882692e1,0xaa5e0036),LL(0x950d4ae9,0x09c75b68), LL(0xb5932a7a,0x62f63df2),LL(0xde0979ad,0x2658252e),LL(0xb5e69631,0x2a19343f),LL(0x525b666b,0x718c7501),
+ LL(0xea40dc3a,0x26a42d69),LL(0xaecc018f,0xdc84ad22),LL(0x3270f04a,0x25c36c7b),LL(0x50fa72ed,0x46ba6d47), LL(0x93e58a8e,0x6c37d1c5),LL(0x120c088c,0xa2394731),LL(0xcb6e86da,0xc3be4263),LL(0x7126d038,0x2c417d36),
+ LL(0x8b6f8efa,0x5b70f9c5),LL(0x37718536,0x671a2faa),LL(0xb539c92b,0xd3ced3c6),LL(0xa31203c2,0xe56f1bd9), LL(0x9ff3c8eb,0x8b096ec4),LL(0x43491cea,0x2deae432),LL(0x17943794,0x2465c6eb),LL(0x20586843,0x5d267e66),
+ LL(0xb07159d0,0x9d3d116d),LL(0xc1896210,0xae07a67f),LL(0xbb961579,0x8fc84d87),LL(0x1c1f8dd6,0x30009e49), LL(0xe3132819,0x8a8caf22),LL(0xf23ab4ff,0xcffa197c),LL(0x205dd687,0x58103a44),LL(0x0ded67a2,0x57b796c3),
+ LL(0xa1779ad7,0x0b9c3a6c),LL(0x357c09c5,0xa33cfe2e),LL(0x3db4a57e,0x2ea29315),LL(0x8ebeb52e,0x91959695), LL(0xe546c879,0x118db9a6),LL(0x6295c8d6,0x8e996df4),LL(0x55ec806b,0xdd990484),LL(0x165c1035,0x24f291ca),
+ LL(0x440e2229,0xcca523bb),LL(0x73ef4d04,0x324673a2),LL(0x3e11ec39,0xaf3adf34),LL(0xdc5968d3,0x6136d7f1), LL(0xb053a927,0x7a7b2899),LL(0xae067ecd,0x3eaa2661),LL(0x02779cd9,0x8549b9c8),LL(0xc53385ea,0x061d7940),
+ LL(0xf06d18bd,0x3e0ba883),LL(0xb2700843,0x4ba6de53),LL(0x591a9e4d,0xb966b668),LL(0x7f4fa0ed,0x93f67567), LL(0x4347237b,0x5a02711b),LL(0xe794608e,0xbc041e2f),LL(0x70f73d8c,0x55af10f5),LL(0xbb7564f7,0xd2d4d4f7),
+ LL(0xb3e93ce7,0xd7d27a89),LL(0x5d3a2c1b,0xf7b5a875),LL(0x255b218a,0xb29e68a0),LL(0x8af76754,0xb533837e), LL(0x579fab2e,0xd1b05a73),LL(0xecd74385,0xb41055a1),LL(0x445e9115,0xb2369274),LL(0xf520274e,0x2972a7c4),
+ LL(0xf678e68a,0x6c08334e),LL(0x99b057ed,0x4e4160f0),LL(0x52ccb69a,0x3cfe11b8),LL(0x21c8f772,0x2fd1823a), LL(0x3298f055,0xdf7f072f),LL(0xfec74a6e,0x8c0566f9),LL(0x5bb4d041,0xe549e019),LL(0x9208d850,0x7c3930ba),
+ LL(0xaaa2902b,0xe07141fc),LL(0xe4f69ad3,0x539ad799),LL(0x813f9ffd,0xa6453f94),LL(0x375bc2f7,0xc58d3c48), LL(0x5dc64e96,0xb3326fad),LL(0xb240e354,0x3aafcaa9),LL(0xaca1e7a9,0x1d1b0903),LL(0x1211b8a0,0x4ceb9767),
+ LL(0xe32a858e,0xeca83e49),LL(0xae907bad,0x4c32892e),LL(0x2eb9b494,0xd5b42ab6),LL(0x1eabae1b,0x7fde3ee2), LL(0xcaf54957,0x13b5ab09),LL(0xe5f5d5d5,0xbfb028be),LL(0x2003e2c0,0x928a0650),LL(0x67476843,0x90793aac),
+ LL(0xc81710a0,0x5e942e79),LL(0x27ccadd4,0x557e4a36),LL(0x4bcf6d0c,0x72a2bc56),LL(0x26d7b80c,0x09ee5f43), LL(0xd4292f19,0x6b70dbe9),LL(0x63f16b18,0x56f74c26),LL(0x35fbb42a,0xc23db0f7),LL(0x6ae10040,0xb606bdf6),
+ LL(0x044573ac,0x1eb15d4d),LL(0x556b0ba4,0x7dc3cf86),LL(0xc60df6f7,0x97af9a33),LL(0xa716ce8c,0x0b1ef85c), LL(0xc96958be,0x2922f884),LL(0x35690963,0x7c32fa94),LL(0xeaa00061,0x2d7f667c),LL(0x3547365c,0xeaaf7c17),
+ LL(0x87032d58,0x1eb4de46),LL(0x5e2c79e0,0xc54f3d83),LL(0x5d04ef23,0x07818df4),LL(0x673d41b4,0x55faa9c8), LL(0x89b95355,0xced64f6f),LL(0xb7415c84,0x4860d2ea),LL(0x050ebad3,0x5fdb9bd2),LL(0x6685a5bf,0xdb53e0cc),
+ LL(0x9feb6593,0xb830c031),LL(0x6accff17,0xdd87f310),LL(0x9f555c10,0x2303ebab),LL(0x287e7065,0x94603695), LL(0x2e83358c,0xf88311c3),LL(0xeefb0178,0x508dd9b4),LL(0x2dba8652,0x7ca23706),LL(0x0047abe5,0x62aac5a3),
+ LL(0x8b1ea7b3,0x9a61d2a0),LL(0xae8b1485,0xd495ab63),LL(0x87052f99,0x38740f84),LL(0xb2974eea,0x178ebe5b), LL(0x5b36d17f,0x030bbcca),LL(0xaaf86eea,0xb5e4cce3),LL(0x68f8e9e0,0xb51a0220),LL(0x09eb3e75,0xa4348796),
+ LL(0xeef1a752,0xbe592309),LL(0x6f2aa1ed,0x5d7162d7),LL(0x0f007dd2,0xaebfb5ed),LL(0xc89edd22,0x255e14b2), LL(0x0303b697,0xba85e072),LL(0xf05720ff,0xc5d17e25),LL(0x5128ebb6,0x02b58d6e),LL(0xd754e113,0x2c80242d),
+ LL(0xabfae1ca,0x919fca5f),LL(0x1a21459b,0x937afaac),LL(0x1f66a4d2,0x9e0ca91c),LL(0x23ec1331,0x194cc7f3), LL(0x8aa11690,0xad25143a),LL(0x09b59e08,0xbe40ad8d),LL(0xe750860a,0x37d60d9b),LL(0xc6bf434c,0x6c53b008),
+ LL(0x1356eb80,0xb572415d),LL(0x9578ded8,0xb8bf9da3),LL(0x5e8fb38b,0x22658e36),LL(0x5af8cb22,0x9b70ce22), LL(0x829a8180,0x7c00018a),LL(0xb81ed295,0x84329f93),LL(0x5f3cea83,0x7c343ea2),LL(0x67586536,0x38f8655f),
+ LL(0x1d3ec517,0xa661a0d0),LL(0x512321ae,0x98744652),LL(0xeca92598,0x084ca591),LL(0x1dcb3feb,0xa9bb9dc9), LL(0x78b4c240,0x14c54355),LL(0x610cafdc,0x5ed62a3b),LL(0x1b38846b,0x07512f37),LL(0xb0e38161,0x571bb70a),
+ LL(0x2da705d2,0xb556b95b),LL(0xb1a08f98,0x3ef8ada6),LL(0xddecfbe5,0x85302ca7),LL(0x943105cd,0x0e530573), LL(0x21a9255d,0x60554d55),LL(0xf2f3802a,0x63a32fa1),LL(0xcd477875,0x35c8c5b0),LL(0x6ad42da1,0x97f458ea),
+ LL(0xeb6b242d,0x832d7080),LL(0x3b71e246,0xd30bd023),LL(0xbe31139d,0x7027991b),LL(0x462e4e53,0x68797e91), LL(0x6b4e185a,0x423fe20a),LL(0x42d9b707,0x82f2c67e),LL(0x4cf7811b,0x25c81768),LL(0x045bb95d,0xbd53005e),
+},
+/* digit=30 base_pwr=2^210 */
+{
+ LL(0x9d8e68fd,0xe5f649be),LL(0x1b044320,0xdb0f0533),LL(0xe0c33398,0xf6fde9b3),LL(0x66c8cfae,0x92f4209b), LL(0x1a739d4b,0xe9d1afcc),LL(0xa28ab8de,0x09aea75f),LL(0xeac6f1d0,0x14375fb5),LL(0x708f7aa5,0x6420b560),
+ LL(0x6254dc41,0x9eae499c),LL(0x7a837e7e,0x7e293924),LL(0x090524a7,0x74aec08c),LL(0x8d6f55f2,0xf82b9219), LL(0x1402cec5,0x493c962e),LL(0xfa2f30e7,0x9f17ca17),LL(0xe9b879cb,0xbcd783e8),LL(0x5a6f145f,0xea3d8c14),
+ LL(0x5e0dee6e,0xdede15e7),LL(0xdc628aa2,0x74f24872),LL(0x7861bb93,0xd3e9c4fe),LL(0x6187b2e0,0x56d4822a), LL(0xc59826f9,0xb66417cf),LL(0x2408169e,0xca260969),LL(0xc79ef885,0xedf69d06),LL(0xdc7d138f,0x00031f8a),
+ LL(0x0ebcf726,0x103c46e6),LL(0x6231470e,0x4482b831),LL(0x487c2109,0x6f6dfaca),LL(0x62e666ef,0x2e0ace97), LL(0x1f8d1f42,0x3246a9d3),LL(0x574944d2,0x1b1e83f1),LL(0xa57f334b,0x13dfa63a),LL(0x9f025d81,0x0cf8daed),
+ LL(0x00ee11c1,0x30d78ea8),LL(0xb5e3dd75,0xeb053cd4),LL(0xd58c43c5,0x9b65b13e),LL(0xbd151663,0xc3ad49bd), LL(0xb6427990,0x99fd8e41),LL(0x707eae1e,0x12cf15bd),LL(0x1aabb71e,0x29ad4f1b),LL(0x07545d0e,0x5143e74d),
+ LL(0xc88bdee1,0x30266336),LL(0x5876767c,0x25f29306),LL(0xc6731996,0x9c078571),LL(0xed552951,0xc88690b2), LL(0x852705b4,0x274f2c2d),LL(0x4e09552d,0xb0bf8d44),LL(0x986575d1,0x7628beeb),LL(0x7f864651,0x407be238),
+ LL(0xa639fc6b,0x0e5e3049),LL(0x86003625,0xe75c35d9),LL(0x5dcc1646,0x0cf35bd8),LL(0x6c26273a,0x8bcaced2), LL(0xb5536742,0xe22ecf1d),LL(0x1a9e068b,0x013dd897),LL(0x8a7909c5,0x17f411cb),LL(0x861dd506,0x5757ac98),
+ LL(0x1e935abb,0x85de1f0d),LL(0x154de37a,0xdefd10b4),LL(0x369cebb5,0xb8d9e392),LL(0x761324be,0x54d5ef9b), LL(0x74f17e26,0x4d6341ba),LL(0x78c1dde4,0xc0a0e3c8),LL(0x87d918fd,0xa6d77581),LL(0x02ca3a13,0x66876015),
+ LL(0xf36658f0,0xc7313e9c),LL(0x71f8057e,0xc433ef1c),LL(0x1b6a835a,0x85326246),LL(0x7c86394c,0xc8f05398), LL(0xe983c4a1,0xff398cdf),LL(0x03b7b931,0xbf5e8162),LL(0xb7b9045b,0x93193c46),LL(0xa4a6e46b,0x1e4ebf5d),
+ LL(0x43a24fe7,0xf9942a60),LL(0xffb3492b,0x29c1191e),LL(0x902fde05,0x9f662449),LL(0x6713c32d,0xc792a7ac), LL(0xb737982c,0x2fd88ad8),LL(0xa21e60e3,0x7e3a0319),LL(0x7383591a,0x09b0de44),LL(0x8310a456,0x6df141ee),
+ LL(0xe6d6f471,0xaec1a039),LL(0x1198d12e,0x14b2ba0f),LL(0x3aeee5ac,0xebc1a160),LL(0xe0b964ce,0x401f4836), LL(0x4fd03f66,0x2ee43796),LL(0xdd8f3f12,0x3fdb4e49),LL(0x29380f18,0x6ef267f6),LL(0x8da64d16,0x3e8e9670),
+ LL(0x207674f1,0xbc19180c),LL(0x33ae8fdb,0x112e09a7),LL(0x6aaeb71e,0x99667554),LL(0xe101b1c7,0x79432af1), LL(0xde2ddec6,0xd5eb558f),LL(0x5357753f,0x81392d1f),LL(0x3ae1158a,0xa7a76b97),LL(0x4a899991,0x416fbbff),
+ LL(0x0d4a9dcf,0x9e65fdfd),LL(0x944ddf12,0x7bc29e48),LL(0x3c856866,0xbc1a92d9),LL(0x6e98dfe2,0x273c6905), LL(0xcdfaa6b8,0x69fce418),LL(0x5061c69f,0x606bd823),LL(0x6af75e27,0x42d495a0),LL(0x6d873a1f,0x8ed3d505),
+ LL(0x6ab25b6a,0xaf552841),LL(0x2b1a4523,0xc6c0ffc7),LL(0x21c99e03,0xab18827b),LL(0x9034691b,0x060e8648), LL(0x93c7f398,0x5207f90f),LL(0x82f8d10b,0x9f4a96cb),LL(0x3ad0f9e3,0xdd71cd79),LL(0xfc3a54f5,0x84f435d2),
+ LL(0x8e33787f,0x4b03c55b),LL(0xa6384673,0xef42f975),LL(0x5051b9f0,0xff7304f7),LL(0x741c87c2,0x18aca1dc), LL(0x2d4bfe80,0x56f120a7),LL(0x053e732c,0xfd823b3d),LL(0x7537ca16,0x11bccfe4),LL(0x1b5a996b,0xdf6c9c74),
+ LL(0x904fc3fa,0xee7332c7),LL(0xc7e3636a,0x14a23f45),LL(0xf091d9aa,0xc38659c3),LL(0xb12d8540,0x4a995e5d), LL(0xf3a5598a,0x20a53bec),LL(0xb1eaa995,0x56534b17),LL(0xbf04e03c,0x9ed3dca4),LL(0xd8d56268,0x716c563a),
+ LL(0x1d6178e7,0x27ba77a4),LL(0x68a1ff8e,0xe4c80c40),LL(0x0a13f63d,0x75011099),LL(0xa61d46f3,0x7bf33521), LL(0x10b365bb,0x0aff218e),LL(0x0fd7ea75,0x81021804),LL(0xa4b3a925,0x05a3fd8a),LL(0x9b3db4e6,0xb829e75f),
+ LL(0x4d53e5fb,0x6bdc75a5),LL(0xd52717e3,0x04a5dc02),LL(0xe9a42ec2,0x86af502f),LL(0x2630e382,0x8867e8fb), LL(0xbec9889b,0xbf845c6e),LL(0xcb47c98d,0x54f491f2),LL(0x790c2a12,0xa3091fba),LL(0xc20f708b,0xd7f6fd78),
+ LL(0xacde5e17,0xa569ac30),LL(0x6852b4d7,0xd0f996d0),LL(0x4609ae54,0xe51d4bb5),LL(0x0daed061,0x3fa37d17), LL(0x34b8fb41,0x62a88684),LL(0x9efb64f1,0x99a2acbd),LL(0x6448e1f2,0xb75c1a5e),LL(0x42b5a069,0xfa99951a),
+ LL(0x2f3b26e7,0x6d956e89),LL(0xda875247,0xf4709860),LL(0x2482dda3,0x3ad15179),LL(0x017d82f0,0xd64110e3), LL(0xfad414e4,0x14928d2c),LL(0x2ed02b24,0x2b155f58),LL(0xcb821bf1,0x481a141b),LL(0x4f81f5da,0x12e3c770),
+ LL(0x9fff8381,0xe49c5de5),LL(0x5bbec894,0x11053232),LL(0x454d88c4,0xa0d051cc),LL(0x1f8e531b,0x4f6db89c), LL(0xca563a44,0x34fe3fd6),LL(0x58da8ab9,0x7f5c2215),LL(0x9474f0a1,0x8445016d),LL(0xcb7d8a0a,0x17d34d61),
+ LL(0x1c474019,0x8e9d3910),LL(0xd52ceefb,0xcaff2629),LL(0xc1622c2b,0xf9cf3e32),LL(0xe9071a05,0xd4b95e3c), LL(0x1594438c,0xfbbca61f),LL(0x04aadedf,0x1eb6e6a6),LL(0x68e14940,0x853027f4),LL(0xdfabda9c,0x221d322a),
+ LL(0xb7cb179a,0xed8ea9f6),LL(0xb7934dcc,0xdc7b764d),LL(0x5e09180d,0xfcb13940),LL(0xb47dc2dd,0x6629a6bf), LL(0x9f5a915e,0xbfc55e4e),LL(0x6204441e,0xb1db9d37),LL(0x930c5f53,0xf82d68cf),LL(0xcbb605b1,0x17d3a142),
+ LL(0x308780f2,0xdd5944ea),LL(0x3845f5e4,0xdc8de761),LL(0x7624d7a3,0x6beaba7d),LL(0x304df11e,0x1e709afd), LL(0x02170456,0x95364376),LL(0xc8f94b64,0xbf204b3a),LL(0x5680ca68,0x4e53af7c),LL(0xe0c67574,0x0526074a),
+ LL(0xecd92af6,0x95d8cef8),LL(0x6cd1745a,0xe6b9fa7a),LL(0xa325c3e4,0x3d546d3d),LL(0x9ae93aae,0x1f57691d), LL(0x9d2e1a33,0xe891f3fe),LL(0xac063d35,0xd430093f),LL(0x5513a327,0xeda59b12),LL(0x5536f18f,0xdc2134f3),
+ LL(0x5c210286,0xaa51fe2c),LL(0x1cab658c,0x3f68aaee),LL(0xf9357292,0x5a23a00b),LL(0x7efdabed,0x9a626f39), LL(0x199d78e3,0xfe2b3bf3),LL(0x71bbc345,0xb7a2af77),LL(0x1e59802c,0x3d19827a),LL(0xb487a51c,0x823bbc15),
+ LL(0x99d0a422,0x856139f2),LL(0xf456c6fb,0x9ac3df65),LL(0x701f8bd6,0xaddf65c6),LL(0x3758df87,0x149f321e), LL(0x721b7eba,0xb1ecf714),LL(0x31a3312a,0xe17df098),LL(0xd5c4d581,0xdb2fd6ec),LL(0x8fcea1b3,0xfd02996f),
+ LL(0x7882f14f,0xe29fa63e),LL(0x07c6cadc,0xc9f6dc35),LL(0xb882bed0,0x46f22d6f),LL(0xd118e52c,0x1a45755b), LL(0x7c4608cf,0x9f2c7c27),LL(0x568012c2,0x7ccbdf32),LL(0x61729b0e,0xfcb0aedd),LL(0xf7d75dbf,0x7ca2ca9e),
+ LL(0x6f640f62,0xf58fecb1),LL(0x39f51946,0xe274b92b),LL(0x6288af44,0x7f4dfc04),LL(0xeac329e5,0x0a91f32a), LL(0xd6aaba31,0x43ad274b),LL(0x0f6884f9,0x719a1640),LL(0xdaf91e20,0x685d29f6),LL(0x27e49d52,0x5ec1cc33),
+ LL(0x3b54a059,0x38f4de96),LL(0xefbcfdb3,0x0e0015e5),LL(0x4dbb8da6,0x177d23d9),LL(0x97a617ad,0x98724aa2), LL(0xfdb6558e,0x30f0885b),LL(0xc7899a96,0xf9f7a28a),LL(0x872dc112,0xd2ae8ac8),LL(0x73c3c459,0xfa0642ca),
+ LL(0xe7dfc8d6,0x15296981),LL(0x1fb5b94a,0x67cd4450),LL(0x0eddfd37,0x0ec71cf1),LL(0x9a8eddc7,0xc7e5eeb3), LL(0x81d95028,0x02ac8e3d),LL(0x70b0e35d,0x0088f172),LL(0xe1881fe3,0xec041fab),LL(0xd99e7faa,0x62cf71b8),
+ LL(0xe0f222c2,0x5043dea7),LL(0x72e65142,0x309d42ac),LL(0x9216cd30,0x94fe9ddd),LL(0x0f87feec,0xd6539c7d), LL(0x432ac7d7,0x03c5a57c),LL(0x327fda10,0x72692cf0),LL(0x280698de,0xec28c85f),LL(0x7ec283b1,0x2331fb46),
+ LL(0x2867e633,0xd34bfa32),LL(0x0a9cc815,0x78709a82),LL(0x875e2fa5,0xb7fe6964),LL(0x9e98bfb5,0x25cc064f), LL(0x493a65c5,0x9eb0151c),LL(0x53182464,0x5fb5d941),LL(0xf04618e2,0x69e6f130),LL(0xf89c8ab6,0xa8ecec22),
+ LL(0xb96209bd,0xcd6ac88b),LL(0xb3e1c9e0,0x65fa8cdb),LL(0x4a8d8eac,0xa47d22f5),LL(0x8d33f963,0x83895cdf), LL(0xb56cd3d1,0xa8adca59),LL(0xdaf38232,0x10c8350b),LL(0xa5080a9f,0x2b161fb3),LL(0x3af65b3a,0xbe7f5c64),
+ LL(0x97403a11,0x2c754039),LL(0x121b96af,0x94626cf7),LL(0x6a983ec2,0x431de7c4),LL(0x52cc3df7,0x3780dd3a), LL(0x2baf8e3b,0xe28a0e46),LL(0x51d299ae,0xabe68aad),LL(0x647a2408,0x603eb8f9),LL(0x5c750981,0x14c61ed6),
+ LL(0xc53352e7,0x88b34414),LL(0x1337d46e,0x5a34889c),LL(0xf95f2bc8,0x612c1560),LL(0xd4807a3a,0x8a3f8441), LL(0x5224da68,0x680d9e97),LL(0xc3eb00e9,0x60cd6e88),LL(0x9a6bc375,0x3875a98e),LL(0x4fd554c2,0xdc80f924),
+ LL(0x6ac77407,0x6c4b3415),LL(0x25420681,0xa1e5ea8f),LL(0x4607a458,0x541bfa14),LL(0x96d7fbf9,0x5dbc7e7a), LL(0x31590a47,0x646a851b),LL(0x15ee6df8,0x039e85ba),LL(0xd7b43fc0,0xd19fa231),LL(0x299a0e04,0x84bc8be8),
+ LL(0xf20df03a,0x2b9d2936),LL(0x8608d472,0x24054382),LL(0x9149202a,0x76b6ba04),LL(0x3670e7b7,0xb21c3831), LL(0xd6fdee10,0xddd93059),LL(0x78488e71,0x9da47ad3),LL(0xa0fcfb25,0x99cc1dfd),LL(0x64696954,0x42abde10),
+ LL(0x17eab9fe,0x14cc15fc),LL(0xd3e70972,0xd6e863e4),LL(0x6432112c,0x29a7765c),LL(0x5b0774d8,0x88660001), LL(0x2c088eae,0x3729175a),LL(0x8230b8d4,0x13afbcae),LL(0x915f4379,0x44768151),LL(0xd8d22812,0xf086431a),
+ LL(0xc298b974,0x37461955),LL(0xf8711e04,0x905fb5f0),LL(0xfe969d18,0x787abf3a),LL(0x6f6a494e,0x392167c2), LL(0x28c511da,0xfc7a0d2d),LL(0xb66a262d,0xf127c7dc),LL(0xfd63fdf0,0xf9c4bb95),LL(0x3913ef46,0x90016589),
+ LL(0x11aa600d,0x74d2a73c),LL(0x9fb5ab52,0x2f5379bd),LL(0x7fb70068,0xe49e53a4),LL(0x404aa9a7,0x68dd39e5), LL(0x2ecaa9c3,0xb9b0cf57),LL(0xe824826b,0xba0e103b),LL(0x4631a3c4,0x60c2198b),LL(0xfa8966a2,0xc5ff84ab),
+ LL(0xac95aff8,0x2d6ebe22),LL(0xb5a46d09,0x1c9bb6db),LL(0x53ee4f8d,0x419062da),LL(0xbb97efef,0x7b9042d0), LL(0x830cf6bd,0x0f87f080),LL(0x6ec8a6c6,0x4861d19a),LL(0x202f01aa,0xd3a0daa1),LL(0xf25afbd5,0xb0111674),
+ LL(0x1afb20d9,0x6d00d6cf),LL(0x40671bc5,0x13695000),LL(0x2485ea9b,0x913ab0dc),LL(0x9eef61ac,0x1f2bed06), LL(0x6d799e20,0x850c8217),LL(0x3271c2de,0x93415f37),LL(0x6c4f5910,0x5afb06e9),LL(0xc4e9e421,0x688a52df),
+ LL(0xe2a9a6db,0x30495ba3),LL(0x58f9268b,0x4601303d),LL(0x7eb0f04f,0xbe3b0dad),LL(0x4456936d,0x4ea47250), LL(0xd33fd3e7,0x8caf8798),LL(0xeb433708,0x1ccd8a89),LL(0x87fd50ad,0x9effe3e8),LL(0x6b29c4df,0xbe240a56),
+ LL(0xca0e7ebd,0xec4ffd98),LL(0xe748616e,0xf586783a),LL(0xc77baa99,0xa5b00d8f),LL(0xb4f34c9c,0x0acada29), LL(0x0fe723ac,0x36dad67d),LL(0x39c36c1e,0x1d8e53a5),LL(0x1f4bea41,0xe4dd342d),LL(0xebc9e4e0,0x64fd5e35),
+ LL(0x57908805,0x96f01f90),LL(0x5ed480dd,0xb5b9ea3d),LL(0x3efd2dd0,0x366c5dc2),LL(0x6e9dfa27,0xed2fe305), LL(0x6e9197e2,0x4575e892),LL(0xab502a5d,0x11719c09),LL(0xe81f213f,0x264c7bec),LL(0x55f5c457,0x741b9241),
+ LL(0x49a5f4f4,0x78ac7b68),LL(0x9fc45b7d,0xf91d70a2),LL(0xb0f5f355,0x39b05544),LL(0xeef930d9,0x11f06bce), LL(0x038d05e1,0xdb84d25d),LL(0xbacc1d51,0x04838ee5),LL(0x9e8ee00b,0x9da3ce86),LL(0xc36eda1f,0xc3412057),
+ LL(0x64d9c2f4,0xae80b913),LL(0xa010a8ff,0x7468bac3),LL(0x37359d41,0xdfd20037),LL(0x15efeacc,0x1a0f5ab8), LL(0x659d0ce0,0x7c25ad2f),LL(0x6785cff1,0x4011bcbb),LL(0x7e2192c7,0x128b9912),LL(0x13ccb0e8,0xa549d8e1),
+ LL(0xc85438b1,0x805588d8),LL(0xbc25cb27,0x5680332d),LL(0x1a4bfdf4,0xdcd1bc96),LL(0x706f6566,0x779ff428), LL(0xf059987a,0x8bbee998),LL(0xcc686de7,0xf6ce8cf2),LL(0x953cfdb2,0xf8ad3c4a),LL(0x2205da36,0xd1d426d9),
+ LL(0xc781a241,0xb3c0f13f),LL(0xd75362a8,0x3e89360e),LL(0xc8a91184,0xccd05863),LL(0xefa8a7f4,0x9bd0c9b7), LL(0x8a912a4b,0x97ee4d53),LL(0xbcf518fd,0xde5e15f8),LL(0xc467e1e0,0x6a055bf8),LL(0x1587e256,0x10be4b4b),
+ LL(0x668621c9,0xd90c14f2),LL(0xab9c92c1,0xd5518f51),LL(0xd6d47b3c,0x8e6a0100),LL(0x66716175,0xcbe980dd), LL(0xddd83683,0x500d3f10),LL(0x99cac73c,0x3b6cb35d),LL(0x6083d550,0x53730c8b),LL(0xdf0a1987,0xcf159767),
+ LL(0x43ad73b3,0x84bfcf53),LL(0x4f035a94,0x1b528c20),LL(0x33eeac69,0x4294edf7),LL(0x817f3240,0xb6283e83), LL(0x0a5f25b1,0xc3fdc959),LL(0x5844ee22,0xefaf8aa5),LL(0xdbdde4de,0xde269ba5),LL(0xc56133bf,0xe3347160),
+ LL(0x8d9ea9f8,0xc1184219),LL(0xf3fc1ab5,0x090de5db),LL(0x0bf22cda,0x404c37b1),LL(0xf5618894,0x7de20ec8), LL(0xecdaecab,0x754c588e),LL(0x88342743,0x6ca4b0ed),LL(0xf4a938ec,0x76f08bdd),LL(0x91493ccb,0xd182de89),
+ LL(0xc8a4186a,0xd652c53e),LL(0x946d8e33,0xb3e878db),LL(0x5f37663c,0x088453c0),LL(0xb407748b,0x5cd9daaa), LL(0x586d5e72,0xa1f5197f),LL(0xc443ca59,0x47500be8),LL(0xe2652424,0x78ef35b2),LL(0x6dd7767d,0x09c5d26f),
+ LL(0xa74d3f7b,0x7175a79a),LL(0xcf5ea459,0x0428fd8d),LL(0xa5d1746d,0x511cb97c),LL(0xe71d1278,0x36363939), LL(0x10350bf4,0xcf2df955),LL(0x60aae782,0xb3817439),LL(0x3e688809,0xa748c0e4),LL(0xd7a5a006,0x98021fbf),
+ LL(0x0e367a98,0x9076a70c),LL(0x0f62b7c2,0xbea1bc15),LL(0x30fe0343,0x2645a68c),LL(0x699dc14f,0xacaffa78), LL(0x457bf9c4,0xf4469964),LL(0x0d2ead83,0x0db6407b),LL(0xb2c6f3eb,0x68d56cad),LL(0xf376356c,0x3b512e73),
+ LL(0xfce10408,0xe43b0e1f),LL(0x5a5e257d,0x89ddc003),LL(0x0362e5b3,0xb0ae0d12),LL(0xb0519161,0x07f983c7), LL(0x5d5231e7,0xc2e94d15),LL(0x0b4f9513,0xcff22aed),LL(0x6ad0b0b5,0xb02588dd),LL(0x11d0dcd5,0xb967d1ac),
+ LL(0xcf777b6c,0x8dac6bc6),LL(0x4c6d1959,0x0062bdbd),LL(0x0ef5cc85,0x53da71b5),LL(0x4006f14f,0x07012c7d), LL(0xac47800d,0x4617f962),LL(0xc102ed75,0x53365f2b),LL(0x4ab8c9d3,0xb422efcb),LL(0x34af31c9,0x195cb26b),
+ LL(0x05f2c4ce,0x3a926e29),LL(0x9856966c,0xbd2bdecb),LL(0x85527015,0x5d16ab3a),LL(0x4486c231,0x9f81609e), LL(0xda350002,0xd8b96b2c),LL(0xfa1b7d36,0xbd054690),LL(0xe71d79bc,0xdc90ebf5),LL(0x08964e4e,0xf241b6f9),
+ LL(0x2fe3cd4c,0x7c838643),LL(0xb4bc633c,0xe0f33acb),LL(0x3d139f1f,0xb4a9ecec),LL(0xdc4a1f49,0x05ce69cd), LL(0xf5f98aaf,0xa19d1b16),LL(0x6f23e0ef,0x45bb71d6),LL(0x46cdfdd3,0x33789fcd),LL(0xcee040ca,0x9b8e2978),
+ LL(0xae0a6828,0x9c69b246),LL(0x7078d5aa,0xba533d24),LL(0x7bb4fbdb,0x7a2e42c0),LL(0x7035385c,0xcfb4879a), LL(0x3281705b,0x8c3dd30b),LL(0x404fe081,0x7e361c6c),LL(0x3f604edf,0x7b21649c),LL(0xe52ffe47,0x5dbf6a3f),
+ LL(0x4b54d9bf,0xc41b7c23),LL(0x3511c3d9,0x1374e681),LL(0xc1b2b758,0x1863bf16),LL(0x1e9e6a96,0x90e78507), LL(0x5d86f174,0xab4bf98d),LL(0x85e96fe4,0xd74e0bd3),LL(0xcac5d344,0x8afde39f),LL(0xbd91b847,0x90946dbc),
+ LL(0xfe1a838c,0xf5b42358),LL(0x620ac9d8,0x05aae6c5),LL(0xa1ce5a0b,0x8e193bd8),LL(0x4dabfd72,0x8f710571), LL(0x182caaac,0x8d8fdd48),LL(0x040745cf,0x8c4aeefa),LL(0xf3b93e6d,0x73c6c30a),LL(0x16f42011,0x991241f3),
+ LL(0xe457a477,0xa0158eea),LL(0xee6ddc05,0xd19857db),LL(0x18c41671,0xb3265224),LL(0x3c2c0d58,0x3ffdfc7e), LL(0x26ee7cda,0x3a3a5254),LL(0xdf02c3a8,0x341b0869),LL(0x723bbfc8,0xa023bf42),LL(0x14452691,0x3d15002a),
+},
+/* digit=31 base_pwr=2^217 */
+{
+ LL(0x85edfa30,0x5ef7324c),LL(0x87d4f3da,0x25976554),LL(0xdcb50c86,0x352f5bc0),LL(0x4832a96c,0x8f6927b0), LL(0x55f2f94c,0xd08ee1ba),LL(0x344b45fa,0x6a996f99),LL(0xa8aa455d,0xe133cb8d),LL(0x758dc1f7,0x5d0721ec),
+ LL(0x79e5fb67,0x6ba7a920),LL(0x70aa725e,0xe1331feb),LL(0x7df5d837,0x5080ccf5),LL(0x7ff72e21,0xe4cae01d), LL(0x0412a77d,0xd9243ee6),LL(0xdf449025,0x06ff7cac),LL(0x23ef5a31,0xbe75f7cd),LL(0x0ddef7a8,0xbc957822),
+ LL(0xb0ce1c55,0x8cf7230c),LL(0x0bbfb607,0x5b534d05),LL(0x0e16363b,0xee1ef113),LL(0xb4999e82,0x27e0aa7a), LL(0x79362c41,0xce1dac2d),LL(0x91bb6cb0,0x67920c90),LL(0x2223df24,0x1e648d63),LL(0xe32e8f28,0x0f7d9eef),
+ LL(0xfa833834,0x6943f39a),LL(0xa6328562,0x22951722),LL(0x4170fc10,0x81d63dd5),LL(0xaecc2e6d,0x9f5fa58f), LL(0xe77d9a3b,0xb66c8725),LL(0x6384ebe0,0x11235cea),LL(0x5845e24a,0x06a8c118),LL(0xebd093b1,0x0137b286),
+ LL(0x44ace150,0xc589e1ce),LL(0x4381e97c,0xe0f8d3d9),LL(0x62c5a4b8,0x59e99b11),LL(0xfd0ec9f9,0x90d262f7), LL(0x283e13c9,0xfbc854c9),LL(0xaedc7085,0x2d04fde7),LL(0x47dcbecb,0x057d7765),LL(0x9a76fa5f,0x8dbdf591),
+ LL(0x0de1e578,0xd0150695),LL(0xe9f72bc6,0x2e1463e7),LL(0x1b39eca5,0xffa68441),LL(0x7c037f2f,0x673c8530), LL(0x747f91da,0xd0d6a600),LL(0xc9cb78e9,0xb08d43e1),LL(0x27b5cef5,0x0fc0c644),LL(0xa60a2fd6,0x5c1d160a),
+ LL(0x28c8e13b,0xf98cae53),LL(0xb2eddcd1,0x375f10c4),LL(0x5cce06ad,0xd4eb8b7f),LL(0x80a2e1ef,0xb4669f45), LL(0x5bbd8699,0xd593f9d0),LL(0xe7976d13,0x5528a4c9),LL(0x1c7e28d3,0x3923e095),LL(0x3f6bb577,0xb9293790),
+ LL(0xc42bd6d2,0xdb567d6a),LL(0xbb1f96ae,0x6df86468),LL(0x4843b28e,0x0efe5b1a),LL(0x6379b240,0x961bbb05), LL(0x70a6a26b,0xb6caf5f0),LL(0x328e6e39,0x70686c0d),LL(0x895fc8d3,0x80da06cf),LL(0xb363fdc9,0x804d8810),
+ LL(0x207f1670,0xbe22877b),LL(0x4e615291,0x9b0dd188),LL(0x97a3c2bf,0x625ae8dc),LL(0x439b86e8,0x08584ef7), LL(0xdcd898ff,0xde7190a5),LL(0x2058ee3d,0x26286c40),LL(0x5f87b1c1,0x3db0b217),LL(0x102a6db5,0xcc334771),
+ LL(0x2f770fb1,0xd99de954),LL(0x4cd7535e,0x97c1c620),LL(0x3f09cefc,0xd3b6c448),LL(0x5a63b4f8,0xd725af15), LL(0xc01e20ec,0x0c95d24f),LL(0x9ae7121f,0xdfd37494),LL(0xec77b7ec,0x7d6ddb72),LL(0x0353a4ae,0xfe079d3b),
+ LL(0x2e6ac8d2,0x3066e70a),LL(0x106e5c05,0x9c6b5a43),LL(0xede59b8c,0x52d3c6f5),LL(0xfccec9ae,0x30d6a5c3), LL(0x4fc0a9ef,0xedec7c22),LL(0x95c16ced,0x190ff083),LL(0x94de0fde,0xbe12ec8f),LL(0x852d3433,0x0d131ab8),
+ LL(0x85701291,0x42ace07e),LL(0x194061a8,0x94793ed9),LL(0xd7f4a485,0x30e83ed6),LL(0xf9eeff4d,0x9eec7269), LL(0x0c9d8005,0x90acba59),LL(0x1e79b9d1,0x5feca458),LL(0x1d506a1e,0x8fbe5427),LL(0x2439cfa7,0xa32b2c8e),
+ LL(0x73dd0b4e,0x1671c173),LL(0x44a054c6,0x37a28214),LL(0x4e8b53f1,0x81760a1b),LL(0xf9f93b9e,0xa6c04224), LL(0xcf671e3c,0x18784b34),LL(0xcda9b994,0x81bbecd2),LL(0xb2ab3848,0x38831979),LL(0xf2e03c2d,0xef54feb7),
+ LL(0xfb8088fa,0xcf197ca7),LL(0x4ddc96c5,0x01427247),LL(0x30777176,0xa2d2550a),LL(0x4d0cf71d,0x53469898), LL(0x3a2aaac6,0x6ce937b8),LL(0x5af38d9b,0xe9f91dc3),LL(0xc8bf2899,0x2598ad83),LL(0xb5536c16,0x8e706ac9),
+ LL(0xf688dc98,0x40dc7495),LL(0x124c4afc,0x26490cd7),LL(0x1f18775c,0xe651ec84),LL(0xb4fdaf4a,0x393ea6c3), LL(0x7f338e0d,0x1e1f3343),LL(0x6053e7b5,0x39fb832b),LL(0x619e14d5,0x46e702da),LL(0xcdeef6e0,0x859cacd1),
+ LL(0x4462007d,0x63b99ce7),LL(0x4cb5f5b7,0xb8ab48a5),LL(0xf55edde7,0x9ec673d2),LL(0x8cfaefda,0xd1567f74), LL(0x0887bcec,0x46381b6b),LL(0xe178f3c2,0x694497ce),LL(0x1e6266cb,0x5e6525e3),LL(0x697d6413,0x5931de26),
+ LL(0x0e58d493,0x87f8df7c),LL(0x58b73f12,0xb1ae5ed0),LL(0xdea0c34d,0xc368f784),LL(0x859a91a0,0x9bd0a120), LL(0xcc863c68,0xb00d88b7),LL(0x3d1f4d65,0x3a1cc11e),LL(0x0aa85593,0xea38e0e7),LL(0x7dc4aee8,0x37f13e98),
+ LL(0xbc947bad,0x10d38667),LL(0x2a36ee2e,0x738e07ce),LL(0xc577fcac,0xc93470cd),LL(0x2782470d,0xdee1b616), LL(0x2e793d12,0x36a25e67),LL(0xe0f186da,0xd6aa6cae),LL(0x80e07af7,0x474d0fd9),LL(0xba8a5cd4,0xf7cdc47d),
+ LL(0xab15247f,0x28af6d9d),LL(0x493a537f,0x7c789c10),LL(0x23a334e7,0x7ac9b110),LL(0x12c9c277,0x0236ac09), LL(0x1d7a5144,0xa7e5bd25),LL(0xf13ec4ec,0x098b9c2a),LL(0xd3f0abca,0x3639daca),LL(0xa23960f9,0x642da81a),
+ LL(0x4f7269b1,0x7d2e5c05),LL(0xe287c385,0xfcf30777),LL(0xf2a46f21,0x10edc84f),LL(0x4f43fa36,0x35441757), LL(0xfd703431,0xf1327899),LL(0x16dd587a,0xa438d7a6),LL(0xe9c8352d,0x65c34c57),LL(0x5cc5a24e,0xa728edab),
+ LL(0x42531689,0xaed78abc),LL(0x010963ef,0x0a51a0e8),LL(0xd717d9b3,0x5776fa0a),LL(0x7dd3428b,0xf356c239), LL(0x8d3a3dac,0x29903fff),LL(0x3d94491f,0x409597fa),LL(0xbf4a56a4,0x4cd7a5ff),LL(0x8adab462,0xe5096474),
+ LL(0x5c3427b0,0xa97b5126),LL(0xd282c9bd,0x6401405c),LL(0x222c5c45,0x3629f8d7),LL(0xe8d50aed,0xb1c02c16), LL(0xd9635bc9,0xbea2ed75),LL(0x6e24552f,0x226790c7),LL(0x65f1d066,0x3c33f2a3),LL(0x6dfccc2e,0x2a43463e),
+ LL(0xdb483761,0x8cc3453a),LL(0x65d5672b,0xe7cc6085),LL(0xde3efc87,0x277ed6cb),LL(0x69234eaf,0x19f2f368), LL(0x5c0b800b,0x9aaf4317),LL(0x8b6da6e2,0x1f1e7c89),LL(0xb94ec75e,0x6cfb4715),LL(0x453118c2,0xd590dd5f),
+ LL(0x1f17a34c,0x14e49da1),LL(0x235a1456,0x5420ab39),LL(0x2f50363b,0xb7637241),LL(0xc3fabb6e,0x7b15d623), LL(0xe274e49c,0xa0ef40b1),LL(0x96b1860a,0x5cf50744),LL(0x66afe5a4,0xd6583fbf),LL(0xf47e3e9a,0x44240510),
+ LL(0x11b2d595,0x99254343),LL(0xeec8df57,0xf1367499),LL(0x3e73dd05,0x3cb12c61),LL(0x7dac102a,0xd248c033), LL(0xa77739f5,0xcf154f13),LL(0x23d2af42,0xbf4288cb),LL(0x32e4a1cf,0xaa64c9b6),LL(0xc8a208f3,0xee8c07a8),
+ LL(0x6fe8393f,0xe10d4999),LL(0xe91f3a32,0x0f809a3f),LL(0x802f63c8,0x61096d1c),LL(0x57750d3d,0x289e1462), LL(0x9889feea,0xed06167e),LL(0xe0993909,0xd5c9c0e2),LL(0x56508ac6,0x46fca0d8),LL(0x4f1b8e83,0x91826047),
+ LL(0x9a4a2751,0x4f2c877a),LL(0xcae6fead,0x71bd0072),LL(0x06aa1941,0x38df8dcc),LL(0x63beeaa8,0x5a074b4c), LL(0xc1cec8ed,0xd6d65934),LL(0xaabc03bd,0xa6ecb49e),LL(0xde8a8415,0xaade91c2),LL(0x691136e0,0xcfb0efdf),
+ LL(0x23ab3495,0x11af45ee),LL(0x0b77463d,0xa132df88),LL(0x815d06f4,0x8923c15c),LL(0x0d61a436,0xc3ceb3f5), LL(0xe88fb1da,0xaf52291d),LL(0x1da12179,0xea057974),LL(0xd2fef720,0xb0d7218c),LL(0x8e1d8845,0x6c0899c9),
+ LL(0x752ddad7,0x98157504),LL(0xa1a68a97,0xd60bd74f),LL(0xf658fb99,0x7047a3a9),LL(0x5f8511e4,0x1f5d86d6), LL(0x4b5a6d88,0xb8a4bc42),LL(0x1abefa7d,0x69eb2c33),LL(0x13c9c510,0x95bf39e8),LL(0xd48aab43,0xf571960a),
+ LL(0x704e23c6,0x7e8cfbcf),LL(0x28aaa65b,0xc71b7d22),LL(0x245e3c83,0xa041b2bd),LL(0xd21854ff,0x69b98834), LL(0x963bfeec,0x89d227a3),LL(0xde7da7cb,0x99947aaa),LL(0xee68a9b1,0x1d9ee9db),LL(0x698ec368,0x0a08f003),
+ LL(0x78ef2487,0xe9ea4094),LL(0x02cfec26,0xc8d2d415),LL(0xb7dcf328,0xc52f9a6e),LL(0x85b6a937,0x0ed489e3), LL(0xbef3366e,0x9b94986b),LL(0xedddddb8,0x0de59c70),LL(0xeadddbe2,0xffdb748c),LL(0x8266ea40,0x9b9784bb),
+ LL(0x1a93507a,0x142b5502),LL(0x8d3c06cf,0xb4cd1187),LL(0x91ec3f40,0xdf70e76a),LL(0x4e7553c2,0x484e81ad), LL(0x272e9d6e,0x830f87b5),LL(0xc6ff514a,0xea1c93e5),LL(0xc4192a8e,0x67cc2adc),LL(0x42f4535a,0xc77e27e2),
+ LL(0xd2b713c5,0x9cdbab36),LL(0xcf7b0cd3,0x86274ea0),LL(0x09af826b,0x784680f3),LL(0x0c72dea3,0xbfcc837a), LL(0xd6529b73,0xa8bdfe9d),LL(0x63a88002,0x708aa228),LL(0xc91d45b9,0x6c7a9a54),LL(0xfd004f56,0xdf1a38bb),
+ LL(0xb8bad853,0x2e8c9a26),LL(0x3723eae7,0x2d52cea3),LL(0x56ca2830,0x054d6d81),LL(0x9a8dc411,0xa3317d14), LL(0xfd4ddeda,0xa08662fe),LL(0xb55d792b,0xed2a153a),LL(0xbfc6e944,0x7035c16a),LL(0x00171cf3,0xb6bc5834),
+ LL(0x83d102b6,0xe27152b3),LL(0x0646b848,0xfe695a47),LL(0x916e6d37,0xa5bb09d8),LL(0x0d17015e,0xb4269d64), LL(0x0a1d2285,0x8d8156a1),LL(0x46d26d72,0xfeef6c51),LL(0x4c5434a7,0x9dac57c8),LL(0x59d39e31,0x0282e5be),
+ LL(0x721c486d,0xedfff181),LL(0xbc58824e,0x301baf10),LL(0x00570031,0x8136a6aa),LL(0x1cddde68,0x55aaf78c), LL(0x59c63952,0x26829371),LL(0x8bc25baf,0x3a3bd274),LL(0xb7e52dc3,0xecdf8657),LL(0xfd78e6c8,0x2dd8c087),
+ LL(0xf5531461,0x20553274),LL(0x5d95499b,0x8b4a1281),LL(0x1a80f9d2,0xe2c8763a),LL(0x4ddec758,0xd1dbe32b), LL(0x30c34169,0xaf12210d),LL(0x78baa533,0xba74a953),LL(0xa438f254,0x3d133c6e),LL(0x201bef5b,0xa431531a),
+ LL(0xf669d7ec,0x15295e22),LL(0x357fb515,0xca374f64),LL(0xeaa3fdb3,0x8a8406ff),LL(0xdf3f2da8,0x106ae448), LL(0x33c8e9a1,0x8f9b0a90),LL(0x71ad5885,0x234645e2),LL(0x1c0aed14,0x3d083224),LL(0x7a942d46,0xf10a7d3e),
+ LL(0x40d5c9be,0x7c11deee),LL(0xba84ed98,0xb2bae7ff),LL(0xaad58ddd,0x93e97139),LL(0x3f6d1fa3,0x3d872796), LL(0x8569ff13,0x483aca81),LL(0x9a600f72,0x8b89a5fb),LL(0xc06f2b86,0x4cbc27c3),LL(0x63ad9c0b,0x22130713),
+ LL(0x48ac2840,0xb5358b1e),LL(0xecba9477,0x18311294),LL(0xa6946b43,0xda58f990),LL(0x9ab41819,0x3098baf9), LL(0x4198da52,0x66c4c158),LL(0x146bfd1b,0xab4fc17c),LL(0xbf36a908,0x2f0a4c3c),LL(0x58cf7838,0x2ae9e34b),
+ LL(0x3fa11b1f,0xf411529e),LL(0x974af2b4,0x21e43677),LL(0xc230793b,0x7c20958e),LL(0x16e840f3,0x710ea885), LL(0xc5dc67cf,0xfc0b21fc),LL(0x88405718,0x08d51647),LL(0xcfe49eb7,0xd955c21f),LL(0x56dd4a1f,0x9722a5d5),
+ LL(0xc861baa5,0xc9ef50e2),LL(0x9505ac3e,0xc0c21a5d),LL(0x8b7c063f,0xaf6b9a33),LL(0x2f4779c1,0xc6370339), LL(0x638167c3,0x22df99c7),LL(0x795db30c,0xfe6ffe76),LL(0xa4854989,0x2b822d33),LL(0x30563aa5,0xfef031dd),
+ LL(0xd57c667f,0x16b09f82),LL(0xcc0b76f1,0xc70312ce),LL(0xc9118aec,0xbf04a9e6),LL(0x3409d133,0x82fcb419), LL(0xab45d44d,0x1a8ab385),LL(0x617b83a3,0xfba07222),LL(0x58e81b52,0xb05f50dd),LL(0x21ce5aff,0x1d8db553),
+ LL(0xe344a873,0x3097b8d4),LL(0xfe36d53e,0x7d8d116d),LL(0x7875e750,0x6db22f58),LL(0x43e144ea,0x2dc5e373), LL(0xe799eb95,0xc05f32e6),LL(0x6899e6ec,0xe9e5f4df),LL(0x1fab23d5,0xbdc3bd68),LL(0x73af60e6,0xb72b8ab7),
+ LL(0x2cecc84a,0x8db27ae0),LL(0x7bdb871c,0x600016d8),LL(0xd7c46f58,0x42a44b13),LL(0xc3a77d39,0xb8919727), LL(0xdafd6088,0xcfc6bbbd),LL(0x6bd20d39,0x1a740146),LL(0x98c41072,0x8c747abd),LL(0xbdf68ea1,0x4c91e765),
+ LL(0x08819a78,0x7c95e5ca),LL(0xc9587921,0xcf48b729),LL(0xdebbcc7d,0x091c7c5f),LL(0xf0e05149,0x6f287404), LL(0x26cd44ec,0xf83b5ac2),LL(0xcfea250e,0x88ae32a6),LL(0x1d06ebc5,0x6ac5047a),LL(0xd434f781,0xc7e550b4),
+ LL(0x5c727bd2,0x61ab1cf2),LL(0x1cf915b0,0x2e4badb1),LL(0xf69d3920,0x1b4dadec),LL(0xf14c1dfe,0xe61b1ca6), LL(0xbd6bd51f,0x90b479cc),LL(0x8045ec30,0x8024e401),LL(0x25ef0e62,0xcab29ca3),LL(0x49e4ebc0,0x4f2e9416),
+ LL(0x0ccced58,0x45eb40ec),LL(0x0da44f98,0x25cd4b9c),LL(0x871812c6,0x43e06458),LL(0x16cef651,0x99f80d55), LL(0xce6dc153,0x571340c9),LL(0xd8665521,0x138d5117),LL(0x4e07014d,0xacdb45bc),LL(0x84b60b91,0x2f34bb38),
+ LL(0x2ae8921e,0xf44a4fd2),LL(0x892ba1e2,0xb039288e),LL(0xb1c180b2,0x9da50174),LL(0x1693dc87,0x6b70ab66), LL(0xe7057481,0x7e9babc9),LL(0x9c80dc41,0x4581ddef),LL(0x51294682,0x0c890da9),LL(0x3f4736e5,0x0b5629d3),
+ LL(0xb06f5b41,0x2340c79e),LL(0x4e243469,0xa42e84ce),LL(0x045a71a9,0xf9a20135),LL(0xd27b6fb6,0xefbfb415), LL(0x9d33cd6f,0x25ebea23),LL(0xaa6c0af8,0x9caedb88),LL(0xd9ce6f96,0x53dc7e9a),LL(0x51e0b15a,0x3897f9fd),
+ LL(0x8e5d788e,0xf51cb1f8),LL(0xe1d490ee,0x1aec7ba8),LL(0xcc58cb3c,0x265991e0),LL(0x9fc3ad31,0x9f306e8c), LL(0x5040a0ac,0x5fed006e),LL(0xfb476f2e,0xca9d5043),LL(0xbeea7a23,0xa19c06e8),LL(0x0edabb63,0xd2865801),
+ LL(0x6967469a,0xdb92293f),LL(0x8d8a8ed8,0x2894d839),LL(0xbbc77122,0x87c9e406),LL(0x2ea3a26a,0x8671c6f1), LL(0xd7de9853,0xe42df8d6),LL(0xb1f2bcc7,0x2e3ce346),LL(0x899d50cf,0xda601dfc),LL(0xfb1b598f,0xbfc913de),
+ LL(0xe61f7908,0x81c4909f),LL(0x9bbc7b29,0x192e304f),LL(0xc104b338,0xc3ed8738),LL(0x783f5d61,0xedbe9e47), LL(0x2db30660,0x0c06e9be),LL(0xc0eb7d8e,0xda3e613f),LL(0x322e096e,0xd8fa3e97),LL(0xd336e247,0xfebd91e8),
+ LL(0xdf655a49,0x8f13ccc4),LL(0x5eb20210,0xa9e00dfc),LL(0xc656b6ea,0x84631d0f),LL(0xd8c0d947,0x93a058cd), LL(0x67bd3448,0x6846904a),LL(0xf394fd5c,0x4a3d4e1a),LL(0xdb225f52,0xc102c1a5),LL(0xfc4f5e9a,0xe3455bba),
+ LL(0x4b9ad1ce,0x6b36985b),LL(0x5bb7f793,0xa9818536),LL(0x48b1a416,0x6c25e1d0),LL(0x3c81bee7,0x1381dd53), LL(0x7a4a7620,0xd2a30d61),LL(0x39b8944c,0xc8412926),LL(0x7a97c33a,0x3c1c6fbe),LL(0x938664e7,0x941e541d),
+ LL(0x4a34f239,0x417499e8),LL(0xb90402d5,0x15fdb83c),LL(0x433aa832,0xb75f46bf),LL(0x63215db1,0xb61e15af), LL(0xa127f89a,0xaabe59d4),LL(0x07e816da,0x5d541e0c),LL(0xa618b692,0xaaba0659),LL(0x17266026,0x55327733),
+ LL(0x95f57552,0xaf53a0fc),LL(0x6cacb0c9,0x32947650),LL(0xc821be01,0x253ff58d),LL(0xa06f1146,0xb0309531), LL(0x05c2e54d,0x59bbbdf5),LL(0x26e8dd22,0x158f27ad),LL(0x397e1e53,0xcc5b7ffb),LL(0x7fc1e50d,0xae03f65b),
+ LL(0x9c95f0f9,0xa9784ebd),LL(0x24640771,0x5ed9deb2),LL(0x035561c4,0x31244af7),LL(0x7ee857de,0x87332f3a), LL(0x2b9e0d88,0x09e16e9e),LL(0x56a06049,0x52d910f4),LL(0xa9592f48,0x507ed477),LL(0x2365d678,0x85cb917b),
+ LL(0x4c8998d1,0xf8511c93),LL(0x730ea58f,0x2186a3f1),LL(0xb2029db0,0x50189626),LL(0x02ceb75a,0x9137a6d9), LL(0x748bc82c,0x2fe17f37),LL(0x80469f8c,0x87c2e931),LL(0xbf891aa2,0x850f71cd),LL(0x75ec3d8d,0x0ca1b89b),
+ LL(0x5e1cd3cd,0x516c43aa),LL(0x9a887c28,0x89397808),LL(0xddea1f9f,0x0059c699),LL(0x8e6868f7,0x7737d6fa), LL(0x60f1524b,0x6d93746a),LL(0xba052aa7,0x36985e55),LL(0xed923ea5,0x41b1d322),LL(0x25852a11,0x3429759f),
+ LL(0x092e9f41,0xbeca6ec3),LL(0x62256bbd,0x3a238c66),LL(0x70ad487d,0xd82958ea),LL(0x65610d93,0x4ac8aaf9), LL(0x5e4ccab0,0x3fa101b1),LL(0x9de14bfb,0x9bf430f2),LL(0x6531899d,0xa10f5cc6),LL(0xea8ce17d,0x590005fb),
+ LL(0x24544cb6,0xc437912f),LL(0xd79ac2e3,0x9987b71a),LL(0xc058a212,0x13e3d9dd),LL(0xd2de9606,0x00075aac), LL(0x6cac8369,0x80ab508b),LL(0xf54f6c89,0x87842be7),LL(0x6bc532a4,0xa7ad663d),LL(0x78a91bc8,0x67813de7),
+ LL(0xc3427239,0x5dcb61ce),LL(0xc56934d9,0x5f3c7cf0),LL(0xe3191591,0xc079e0fb),LL(0xb01aada7,0xe40896bd), LL(0x0492d25f,0x8d466791),LL(0xe7408276,0x8aeb30c9),LL(0x9287aacc,0xe9437495),LL(0x79fe03d4,0x23d4708d),
+ LL(0xd0c05199,0x8cda9cf2),LL(0xfae78454,0x502fbc22),LL(0xf572a182,0xc0bda9df),LL(0x6158b372,0x5f9b71b8), LL(0x2b82dd07,0xe0f33a59),LL(0x9523032e,0x76302735),LL(0xc4505a32,0x7fe1a721),LL(0xf796409f,0x7b6e3e82),
+},
+/* digit=32 base_pwr=2^224 */
+{
+ LL(0x35d0b34a,0xe3417bc0),LL(0x8327c0a7,0x440b386b),LL(0xac0362d1,0x8fb7262d),LL(0xe0cdf943,0x2c41114c), LL(0xad95a0b1,0x2ba5cef1),LL(0x67d54362,0xc09b37a8),LL(0x01e486c9,0x26d6cdd2),LL(0x42ff9297,0x20477abf),
+ LL(0x292a9287,0xa004dcb3),LL(0x77b092c7,0xddc15cf6),LL(0x806c0605,0x083a8464),LL(0x3db997b0,0x4a68df70), LL(0x05bf7dd0,0x9c134e45),LL(0x8ccf7f8c,0xa4e63d39),LL(0x41b5f8af,0xa6e6517f),LL(0xad7bc1cc,0xaa8b9342),
+ LL(0x1e706ad9,0x126f35b5),LL(0xc3a9ebdf,0xb99cebb4),LL(0xbf608d90,0xa75389af),LL(0xc6c89858,0x76113c4f), LL(0x97e2b5aa,0x80de8eb0),LL(0x63b91304,0x7e1022cc),LL(0x6ccc066c,0x3bdab605),LL(0xb2edf900,0x33cbb144),
+ LL(0x7af715d2,0xc4176471),LL(0xd0134a96,0xe2f7f594),LL(0xa41ec956,0x2c1873ef),LL(0x77821304,0xe4e7b4f6), LL(0x88d5374a,0xe5c8ff97),LL(0x80823d5b,0x2b915e63),LL(0xb2ee8fe2,0xea6bc755),LL(0xe7112651,0x6657624c),
+ LL(0xdace5aca,0x157af101),LL(0x11a6a267,0xc4fdbcf2),LL(0xc49c8609,0xdaddf340),LL(0xe9604a65,0x97e49f52), LL(0x937e2ad5,0x9be8e790),LL(0x326e17f1,0x846e2508),LL(0x0bbbc0dc,0x3f38007a),LL(0xb11e16d6,0xcf03603f),
+ LL(0x7442f1d5,0xd6f800e0),LL(0x66e0e3ab,0x475607d1),LL(0xb7c64047,0x82807f16),LL(0xa749883d,0x8858e1e3), LL(0x8231ee10,0x5859120b),LL(0x638a1ece,0x1b80e7eb),LL(0xc6aa73a4,0xcb72525a),LL(0x844423ac,0xa7cdea3d),
+ LL(0xf8ae7c38,0x5ed0c007),LL(0x3d740192,0x6db07a5c),LL(0x5fe36db3,0xbe5e9c2a),LL(0x76e95046,0xd5b9d57a), LL(0x8eba20f2,0x54ac32e7),LL(0x71b9a352,0xef11ca8f),LL(0xff98a658,0x305e373e),LL(0x823eb667,0xffe5a100),
+ LL(0xe51732d2,0x57477b11),LL(0x2538fc0e,0xdfd6eb28),LL(0x3b39eec5,0x5c43b0cc),LL(0xcb36cc57,0x6af12778), LL(0x06c425ae,0x70b0852d),LL(0x5c221b9b,0x6df92f8c),LL(0xce826d9c,0x6c8d4f9e),LL(0xb49359c3,0xf59aba7b),
+ LL(0xda64309d,0x5c8ed8d5),LL(0x91b30704,0x61a6de56),LL(0x2f9b5808,0xd6b52f6a),LL(0x98c958a7,0x0eee4194), LL(0x771e4caa,0xcddd9aab),LL(0x78bc21be,0x83965dfd),LL(0xb3b504f5,0x02affce3),LL(0x561c8291,0x30847a21),
+ LL(0x52bfda05,0xd2eb2cf1),LL(0x6197b98c,0xe0e4c4e9),LL(0xf8a1726f,0x1d35076c),LL(0x2db11e3d,0x6c06085b), LL(0x4463ba14,0x15c0c4d7),LL(0x0030238c,0x9d292f83),LL(0x3727536d,0x1311ee8b),LL(0xbeaedc1e,0xfeea86ef),
+ LL(0x66131e2e,0xb9d18cd3),LL(0x80fe2682,0xf31d974f),LL(0xe4160289,0xb6e49e0f),LL(0x08e92799,0x7c48ec0b), LL(0xd1989aa7,0x818111d8),LL(0xebf926f9,0xb34fa0aa),LL(0xa245474a,0xdb5fe2f5),LL(0x3c7ca756,0xf80a6ebb),
+ LL(0xafa05dd8,0xa7f96054),LL(0xfcaf119e,0x26dfcf21),LL(0x0564bb59,0xe20ef2e3),LL(0x61cb02b8,0xef4dca50), LL(0x65d30672,0xcda7838a),LL(0xfd657e86,0x8b08d534),LL(0x46d595c8,0x4c5b4395),LL(0x425cb836,0x39b58725),
+ LL(0x3de9abe3,0x8ea61059),LL(0x9cdc03be,0x40434881),LL(0xcfedce8c,0x9b261245),LL(0xcf5234a1,0x78c318b4), LL(0xfde24c99,0x510bcf16),LL(0xa2c2ff5d,0x2a77cb75),LL(0x27960fb4,0x9c895c2b),LL(0xb0eda42b,0xd30ce975),
+ LL(0x1a62cc26,0xfda85393),LL(0x50c0e052,0x23c69b96),LL(0xbfc633f3,0xa227df15),LL(0x1bae7d48,0x2ac78848), LL(0x187d073d,0x487878f9),LL(0x967f807d,0x6c2be919),LL(0x336e6d8f,0x765861d8),LL(0xce528a43,0x88b8974c),
+ LL(0xff57d051,0x09521177),LL(0xfb6a1961,0x2ff38037),LL(0xa3d76ad4,0xfc0aba74),LL(0x25a7ec17,0x7c764803), LL(0x48879bc8,0x7532d75f),LL(0x58ce6bc1,0xea7eacc0),LL(0x8e896c16,0xc82176b4),LL(0x2c750fed,0x9a30e0b2),
+ LL(0x421d3aa4,0xc37e2c2e),LL(0xe84fa840,0xf926407c),LL(0x1454e41c,0x18abc03d),LL(0x3f7af644,0x26605ecd), LL(0xd6a5eabf,0x242341a6),LL(0x216b668e,0x1edb84f4),LL(0x04010102,0xd836edb8),LL(0x945e1d8c,0x5b337ce7),
+ LL(0xc055dc14,0xd2075c77),LL(0x81d89cdf,0x2a0ffa25),LL(0x6ffdcbaf,0x8ce815ea),LL(0xfb648867,0xa3428878), LL(0x884655fb,0x277699cf),LL(0x364d3e41,0xfa5b5bd6),LL(0x441e1cb7,0x01f680c6),LL(0xb70a7d67,0x3fd61e66),
+ LL(0xcc78cf66,0x666ba2dc),LL(0x6fdbff77,0xb3018174),LL(0x168d4668,0x8d4dd0db),LL(0x1dab3a2a,0x259455d0), LL(0xcde3acec,0xf58564c5),LL(0x13adb276,0x77141925),LL(0x8a303f65,0x527d725d),LL(0xe6f38f7b,0x55deb6c9),
+ LL(0xb1fa70fb,0xfd5bb657),LL(0xd8073a00,0xfa07f50f),LL(0xbca02500,0xf72e3aa7),LL(0x9975740d,0xf68f895d), LL(0x5cae2a6a,0x30112060),LL(0x02874842,0x01bd7218),LL(0x7ce47bd3,0x3d423891),LL(0x789544f6,0xa66663c1),
+ LL(0x3272d838,0x864d05d7),LL(0xfa6295c5,0xe22924f9),LL(0x6c2fda32,0x8189593f),LL(0xb184b544,0x330d7189), LL(0xbde1f714,0x79efa62c),LL(0xe5cb1a63,0x35771c94),LL(0x641c8332,0x2f4826b8),LL(0xc8cee854,0x00a894fb),
+ LL(0x36194d40,0xb4b9a39b),LL(0x77612601,0xe857a7c5),LL(0x4ecf2f58,0xf4209dd2),LL(0x5a033487,0x82b9e66d), LL(0xe4e8b9dd,0xc1e36934),LL(0xa42377d7,0xd2372c9d),LL(0x0e3ae43b,0x51dc94c7),LL(0x04474f6f,0x4c57761e),
+ LL(0x1058a318,0xdcdacd0a),LL(0x78053a9a,0x369cf3f5),LL(0x31c68de2,0xc6c3de50),LL(0x3c4b6d9f,0x4653a576), LL(0xaa4e5c97,0x1688dd5a),LL(0xb7ab3c74,0x5be80aa1),LL(0xbc65c283,0x70cefe7c),LL(0x06867091,0x57f95f13),
+ LL(0x4415503b,0xa39114e2),LL(0x4cbb17e9,0xc08ff7c6),LL(0xd7dec966,0x1eff674d),LL(0x53376f63,0x6d4690af), LL(0xea74237b,0xff6fe32e),LL(0xcd57508e,0xc436d17e),LL(0xedcc40fe,0x15aa28e1),LL(0x581bbb44,0x0d769c04),
+ LL(0x34eaacda,0xc240b6de),LL(0x2ba0f1de,0xd9e116e8),LL(0x79438e55,0xcbe45ec7),LL(0x96f752d7,0x91787c9d), LL(0xf129ac2f,0x897f532b),LL(0x5a36e22c,0xd307b7c8),LL(0x749fb8f3,0x91940675),LL(0x157fdb28,0xd14f95d0),
+ LL(0x6ae55043,0xfe51d029),LL(0x44a87de1,0x8931e98f),LL(0x09e4fee2,0xe57f1cc6),LL(0x4e072d92,0x0d063b67), LL(0xed0e4316,0x70a998b9),LL(0x306aca46,0xe74a736b),LL(0x4fda97c7,0xecf0fbf2),LL(0x3e178d93,0xa40f65cb),
+ LL(0x16df4285,0x16253604),LL(0xd0c56ae2,0xb0c9babb),LL(0xcfc5cfc3,0x73032b19),LL(0x09752056,0xe497e5c3), LL(0x164bda96,0x12096bb4),LL(0xa0b74da1,0x1ee42419),LL(0x403826ba,0x8fc36243),LL(0xdc09e660,0x0c8f0069),
+ LL(0xc27253c9,0x8667e981),LL(0x92b36a45,0x05a6aefb),LL(0x9cb7bb46,0xa62c4b36),LL(0x11f7027b,0x8394f375), LL(0x5f109d0f,0x747bc79c),LL(0x5b8cc60a,0xcad88a76),LL(0x58f09e68,0x80c5a66b),LL(0xf6127eac,0xe753d451),
+ LL(0x5b0ec6f5,0xc44b74a1),LL(0x5289b2b8,0x47989fe4),LL(0x58d6fc73,0x745f8484),LL(0xf61c70ab,0xec362a6f), LL(0xb3a8ad41,0x070c98a7),LL(0x7b63db51,0x73a20fc0),LL(0xf44c35f4,0xed2c2173),LL(0x9acc9dca,0x8a56149d),
+ LL(0x9ac6e0f4,0x98f17881),LL(0xa413b5ed,0x360fdeaf),LL(0xa300b0fd,0x0625b8f4),LL(0x5b3222d3,0xf1f4d76a), LL(0x587f76b8,0x9d6f5109),LL(0x2317fdb5,0x8b4ee08d),LL(0x8c68b095,0x88089bb7),LL(0x5808d9b9,0x95570e9a),
+ LL(0x35d33ae7,0xa395c36f),LL(0x50bb5a94,0x200ea123),LL(0x0bafe84b,0x20c789bd),LL(0x0919276a,0x243ef52d), LL(0xe23ae233,0x3934c577),LL(0xa460d1ec,0xb93807af),LL(0xf8fa76a4,0xb72a53b1),LL(0xc3ca4491,0xd8914cb0),
+ LL(0x3fb42622,0x2e128494),LL(0x500907d5,0x3b2700ac),LL(0x1a95ec63,0xf370fb09),LL(0x31b6dfbd,0xf8f30be2), LL(0x69e55f15,0xf2b2f8d2),LL(0xcc1323e9,0x1fead851),LL(0xd9e5eef6,0xfa366010),LL(0xe316107e,0x64d487b0),
+ LL(0xd23ddc82,0x4c076b86),LL(0x7e0143f0,0x03fd344c),LL(0x317af2c5,0xa95362ff),LL(0xe18b7a4f,0x0add3db7), LL(0x8260e01b,0x9c673e3f),LL(0x54a1cc91,0xfbeb49e5),LL(0x92f2e433,0x91351bf2),LL(0x851141eb,0xc755e7ec),
+ LL(0x29607745,0xc9a95139),LL(0xa26f2b28,0x0ca07420),LL(0x4bc6f9dd,0xcb2790e7),LL(0xadcaffc0,0x345bbb58), LL(0xbe0f27a2,0xc65ea38c),LL(0x641fcb56,0x67c24d7c),LL(0xa9e2c757,0x2c25f0a7),LL(0x16f16c49,0x93f5cdb0),
+ LL(0xc5ee30a1,0x2ca5a9d7),LL(0xb909b729,0xd1593635),LL(0xdadeff48,0x804ce9f3),LL(0xb07c30c3,0xec464751), LL(0x9e49af6a,0x89d65ff3),LL(0x6f3d01bc,0xf2d6238a),LL(0x0bced843,0x1095561e),LL(0xc8a13fd8,0x51789e12),
+ LL(0x763231df,0xd633f929),LL(0xe7cbddef,0x46df9f7d),LL(0xcb265da8,0x01c889c0),LL(0xaf4336d2,0xfce1ad10), LL(0xfc6a0a7e,0x8d110df6),LL(0x6da425dc,0xdd431b98),LL(0x1834aabe,0xcdc4aeab),LL(0x8439b7fc,0x84deb124),
+ LL(0x3c2a5998,0x8796f169),LL(0x7947190d,0x9b9247b4),LL(0x11597014,0x55b9d9a5),LL(0x7b1566ee,0x7e9dd70d), LL(0xcbcd5e64,0x94ad78f7),LL(0x9bd4c032,0x0359ac17),LL(0x7cc222ae,0x3b11baaf),LL(0xba78e812,0xa6a6e284),
+ LL(0x24cea1a0,0x8392053f),LL(0x33621491,0xc97bce4a),LL(0x35399ee9,0x7eb1db34),LL(0xece81ad1,0x473f78ef), LL(0xf63d3d0d,0x41d72fe0),LL(0xafab62fc,0xe620b880),LL(0x93158383,0x92096bc9),LL(0x8f896f6c,0x41a21357),
+ LL(0xc7dcfcab,0x1b5ee2fa),LL(0x9546e007,0x650acfde),LL(0xb1b02e07,0xc081b749),LL(0xf9eca03d,0xda9e41a0), LL(0x175a54ab,0x013ba727),LL(0xea5d8d10,0xca0cd190),LL(0x95fd96a9,0x85ea52c0),LL(0xbc5c3940,0x2c591b9f),
+ LL(0x2bad4d5f,0x6fb4d4e4),LL(0xfef0059b,0xfa4c3590),LL(0xf5122294,0x6a10218a),LL(0xa85751d1,0x9a78a81a), LL(0xa98e84e7,0x04f20579),LL(0x4997e5b5,0xfe1242c0),LL(0xca21e1e4,0xe77a273b),LL(0x9411939d,0xfcc8b1ef),
+ LL(0x92d0487a,0xe20ea302),LL(0x294b91fe,0x1442dbec),LL(0xbb6b0e8f,0x1f7a4afe),LL(0x6889c318,0x1700ef74), LL(0x70f1fc62,0xf5bbffc3),LL(0x69c79cca,0x3b31d4b6),LL(0xa7f6340d,0xe8bc2aab),LL(0xa725e10a,0xb0b08ab4),
+ LL(0xae340050,0x44f05701),LL(0x1cf0c569,0xba4b3016),LL(0xfbe19a51,0x5aa29f83),LL(0xb71d752e,0x1b9ed428), LL(0xeb4819f5,0x1666e54e),LL(0x9e18b75b,0x616cdfed),LL(0x3ee27b0b,0x112ed5be),LL(0x44c7de4d,0xfbf28319),
+ LL(0xe0e60d84,0xd685ec85),LL(0x1db7ee78,0x68037e30),LL(0x003c4d6e,0x5b65bdcd),LL(0x93e29a6a,0x33e7363a), LL(0x08d0756c,0x995b3a61),LL(0x2faf134b,0xd727f85c),LL(0x1d337823,0xfac6edf7),LL(0x0439b8b4,0x99b9aa50),
+ LL(0xe2b4e075,0x722eb104),LL(0x437c4926,0x49987295),LL(0x46a9b82d,0xb1e4c0e4),LL(0x57a006f5,0xd0cb3197), LL(0xd7808c56,0xf3de0f7d),LL(0x51f89772,0xb5c54d8f),LL(0xadbd31aa,0x500a114a),LL(0x295f6cab,0x9afaaaa6),
+ LL(0x04cf667a,0x94705e21),LL(0x9d3935d7,0xfc2a811b),LL(0x6d09267c,0x560b0280),LL(0xf780e53b,0xf19ed119), LL(0x067b6269,0xf0227c09),LL(0x5caef599,0x967b8533),LL(0x68efeebc,0x155b9243),LL(0xc497bae6,0xcd6d34f5),
+ LL(0x6cceb370,0x1dd8d5d3),LL(0xa78d7bf9,0x2aeac579),LL(0x70b67a62,0x5d65017d),LL(0x17c53f67,0x70c8e44f), LL(0x86a34d09,0xd1fc0950),LL(0xe7134907,0xe0fca256),LL(0x80fdd315,0xe24fa29c),LL(0xd87499ad,0x2c4acd03),
+ LL(0x3b5a9ba6,0xbaaf7517),LL(0x12e51a51,0xb9cbe1f6),LL(0x5e154897,0xd88edae3),LL(0x77b66ca0,0xe4309c3c), LL(0xf67f3746,0xf5555805),LL(0xa36401ff,0x85fc37ba),LL(0xd9499a53,0xdf86e2ca),LL(0xecbc955b,0x6270b2a3),
+ LL(0x974ad33b,0xafae64f5),LL(0xfe7b2df1,0x04d85977),LL(0x4ab03f73,0x2a3db3ff),LL(0x8702740a,0x0b87878a), LL(0x5a061732,0x6d263f01),LL(0xa32a1901,0xc25430ce),LL(0xdb155018,0xf7ebab3d),LL(0x63a9b78e,0x3a86f693),
+ LL(0xda9f3804,0x349ae368),LL(0xa164349c,0x470f07fe),LL(0x8562baa5,0xd52f4cc9),LL(0x2b290df3,0xc74a9e86), LL(0x43471a24,0xd3a1aa35),LL(0xb8194511,0x239446be),LL(0x81dcd44d,0xbec2dd00),LL(0xc42ac82d,0xca3d7f0f),
+ LL(0xfdaf4520,0x1f3db085),LL(0x4549daf2,0xbb6d3e80),LL(0x19ad5c42,0xf5969d8a),LL(0xdbfd1511,0x7052b13d), LL(0x682b9060,0x11890d1b),LL(0xac34452c,0xa71d3883),LL(0x783805b4,0xa438055b),LL(0x4725b23e,0x43241277),
+ LL(0x4901bbed,0xf20cf96e),LL(0xf432a2bb,0x6419c710),LL(0xdfa9cd7d,0x57a0fbb9),LL(0x00daa249,0x589111e4), LL(0x7b60554e,0x19809a33),LL(0xede283a4,0xea5f8887),LL(0x503bfd35,0x2d713802),LL(0x585d2a53,0x151bb0af),
+ LL(0x43b30ca8,0x40b08f74),LL(0xd9934583,0xe10b5bba),LL(0xb51110ad,0xe8a546d6),LL(0x28e0b6c5,0x1dd50e66), LL(0xcff2b821,0x292e9d54),LL(0x47281760,0x3882555d),LL(0x3724d6e3,0x134838f8),LL(0x22ddcda1,0xf2c679e0),
+ LL(0x6d2a5768,0x40ee8815),LL(0x1c1e7e2d,0x7f227bd2),LL(0xd04ff443,0x487ba134),LL(0xc614e54b,0x76e2ff3d), LL(0xa3177ec7,0x36b88d6f),LL(0x2328fff5,0xbf731d51),LL(0x49ba158e,0x758caea2),LL(0x02938188,0x5ab8ff4c),
+ LL(0x35edc56d,0x33e16056),LL(0x7e940d79,0x5a69d349),LL(0x03866dcb,0x6c4fd001),LL(0x4893cdef,0x20a38f57), LL(0xfac3a15b,0xfbf3e790),LL(0x7a4f8e6b,0x6ed7ea2e),LL(0xbc3aca86,0xa663eb4f),LL(0x080d53f7,0x22061ea5),
+ LL(0xf546783f,0x2480dfe6),LL(0x5a0a641e,0xd38bc6da),LL(0x2ede8965,0xfb093cd1),LL(0xacb455cf,0x89654db4), LL(0x26e1adee,0x413cbf9a),LL(0x373294d4,0x291f3764),LL(0x648083fe,0x00797257),LL(0x208cc341,0x25f504d3),
+ LL(0xc3a0ee43,0x635a8e5e),LL(0x679898ff,0x70aaebca),LL(0x5dc63d56,0x9ee9f547),LL(0xffb34d00,0xce987966), LL(0x5e26310a,0xf9f86b19),LL(0x382a8ca8,0x9e435484),LL(0xc2352fe4,0x253bcb81),LL(0x4474b571,0xa4eac8b0),
+ LL(0xc1ad8cf8,0xc1b97512),LL(0x99e0b697,0x193b4e9e),LL(0x01e85df0,0x939d2716),LL(0xcd44eafd,0x4fb265b3), LL(0xe51e1ae2,0x321e7dcd),LL(0xe3d8b096,0x8e3a8ca6),LL(0x52604998,0x8de46cb0),LL(0x39072aa7,0x91099ad8),
+ LL(0x93aa96b8,0x2617f91c),LL(0x7fca2e13,0x0fc8716b),LL(0x95328723,0xa7106f5e),LL(0x262e6522,0xd1c9c40b), LL(0x42b7c094,0xb9bafe86),LL(0x1543c021,0x1873439d),LL(0x5cbefd5d,0xe1baa5de),LL(0x521e8aff,0xa363fc5e),
+ LL(0xf862eaac,0xefe6320d),LL(0x22c647dc,0x14419c63),LL(0x4e46d428,0x0e06707c),LL(0x4a178f8f,0xcb6c834f), LL(0xd30f917c,0x0f993a45),LL(0x9879afee,0xd4c4b049),LL(0x70500063,0xb6142a1e),LL(0xa5d9d605,0x7c9b41c3),
+ LL(0x2f8ba2c7,0xbc00fc2f),LL(0x7c67aa28,0x0966eb2f),LL(0x5a786972,0x13f7b516),LL(0x8a2fbba0,0x3bfb7557), LL(0x5a2b9620,0x131c4f23),LL(0x6faf46be,0xbff3ed27),LL(0x7e172323,0x9b4473d1),LL(0x339f6246,0x421e8878),
+ LL(0x25a41632,0x0fa8587a),LL(0xa35b6c93,0xc0814124),LL(0x59ebb8db,0x2b18a9f5),LL(0x76edb29c,0x264e3357), LL(0xc87c51e2,0xaf245ccd),LL(0x501e6214,0x16b3015b),LL(0x0a3882ce,0xbb31c560),LL(0xfec11e04,0x6961bb94),
+ LL(0xeff7a3a0,0x3b825b8d),LL(0xb1df7326,0xbec33738),LL(0x99604a1f,0x68ad747c),LL(0x9a3bd499,0xd154c934), LL(0x1cc7a906,0xac33506f),LL(0x6c560e8f,0x73bb5392),LL(0x263e3944,0x6428fcbe),LL(0x1c387434,0xc11828d5),
+ LL(0x3e4b12ff,0x3cd04be1),LL(0x2d88667c,0xc3aad9f9),LL(0x248120cf,0xc52ddcf8),LL(0x2a389532,0x985a892e), LL(0x3bb85fa0,0xfbb4b21b),LL(0x8dfc6269,0xf95375e0),LL(0x7ee2acea,0xfb4fb06c),LL(0x309c4d1f,0x6785426e),
+ LL(0xd8ceb147,0x659b17c8),LL(0xb70a5554,0x9b649eee),LL(0xac6bc634,0x6b7fa0b5),LL(0x1d6e732f,0xd99fe2c7), LL(0x8d3abba2,0x30e6e762),LL(0xa797b799,0x18fee6e7),LL(0xc696464d,0x5c9d360d),LL(0x27bfde12,0xe3baeb48),
+ LL(0xf23206d5,0x2bf5db47),LL(0x1d260152,0x2f6d3420),LL(0x3f8ff89a,0x17b87653),LL(0x378fa458,0x5157c30c), LL(0x2d4fb936,0x7517c5c5),LL(0xe6518cdc,0xef22f7ac),LL(0xbf847a64,0xdeb483e6),LL(0x92e0fa89,0xf5084558),
+},
+/* digit=33 base_pwr=2^231 */
+{
+ LL(0xdf7304d4,0xab9659d8),LL(0xff210e8e,0xb71bcf1b),LL(0xd73fbd60,0xa9a2438b),LL(0x5d11b4de,0x4595cd1f), LL(0x4835859d,0x9c0d329a),LL(0x7dbb6e56,0x4a0f0d2d),LL(0xdf928a4e,0xc6038e5e),LL(0x8f5ad154,0xc9429621),
+ LL(0xf23f2d92,0x91213462),LL(0x60b94078,0x6cab71bd),LL(0x176cde20,0x6bdd0a63),LL(0xee4d54bc,0x54c9b20c), LL(0x9f2ac02f,0x3cd2d8aa),LL(0x206eedb0,0x03f8e617),LL(0x93086434,0xc7f68e16),LL(0x92dd3db9,0x831469c5),
+ LL(0x8f981354,0x8521df24),LL(0x3588a259,0x587e23ec),LL(0xd7a0992c,0xcbedf281),LL(0x38961407,0x06930a55), LL(0xbe5bbe21,0x09320deb),LL(0x2491817f,0xa7ffa5b5),LL(0x09065160,0xe6c8b4d9),LL(0xfff6d2a9,0xac4f3992),
+ LL(0x3ae9c1bd,0x7aa7a158),LL(0xe37ce240,0xe0af6d98),LL(0x28ab38b4,0xe54342d9),LL(0x0a1c98ca,0xe8b75007), LL(0xe02358f2,0xefce86af),LL(0xea921228,0x31b8b856),LL(0x0a1c67fc,0x052a1912),LL(0xe3aead59,0xb4069ea4),
+ LL(0x7fa03cb3,0x3232d6e2),LL(0x0fdd7d88,0xdb938e5b),LL(0x2ccbfc5d,0x04c1d2cd),LL(0xaf3a580f,0xd2f45c12), LL(0x7883e614,0x592620b5),LL(0xbe7c5f26,0x5fd27e68),LL(0x1567e1e3,0x139e45a9),LL(0x44d8aaaf,0x2cc71d2d),
+ LL(0xe36d0757,0x4a9090cd),LL(0xd9a29382,0xf722d7b1),LL(0x04b48ddf,0xfb7fb04c),LL(0xebe16f43,0x628ad2a7), LL(0x20226040,0xcd3fbfb5),LL(0x5104b6c4,0x6c34ecb1),LL(0xc903c188,0x30c0754e),LL(0x2d23cab0,0xec336b08),
+ LL(0x1e206ee5,0x473d62a2),LL(0x8c49a633,0xf1e27480),LL(0xe9f6b2c3,0x87ab956c),LL(0x62b606ea,0x61830b48), LL(0xe78e815f,0x67cd6846),LL(0x4c02082a,0xfe40139f),LL(0x952ec365,0x52bbbfcb),LL(0x6b9836ab,0x74c11642),
+ LL(0x558df019,0x9f51439e),LL(0xac712b27,0x230da4ba),LL(0x55185a24,0x518919e3),LL(0x84b78f50,0x4dcefcdd), LL(0xa47d4c5a,0xa7d90fb2),LL(0xb30e009e,0x55ac9abf),LL(0x74eed273,0xfd2fc359),LL(0xdbea8faf,0xb72d824c),
+ LL(0x4513e2ca,0xce721a74),LL(0x38240b2c,0x0b418612),LL(0xd5baa450,0x05199968),LL(0x2b0e8c25,0xeb1757ed), LL(0x3dfac6d5,0x6ebc3e28),LL(0x48a237f5,0xb2431e2e),LL(0x52f61499,0x2acb5e23),LL(0xe06c936b,0x5558a2a7),
+ LL(0xcbb13d1b,0xd213f923),LL(0x5bfb9bfe,0x98799f42),LL(0x701144a9,0x1ae8ddc9),LL(0x4c5595ee,0x0b8b3bb6), LL(0x3ecebb21,0x0ea9ef2e),LL(0x3671f9a7,0x17cb6c4b),LL(0x726f1d1f,0x47ef464f),LL(0x6943a276,0x171b9484),
+ LL(0x7ef0329c,0x51a4ae2d),LL(0x91c4402a,0x08509222),LL(0xafd45bbc,0x64a61d35),LL(0x3035a851,0x38f096fe), LL(0xa1dec027,0xc7468b74),LL(0x4fc7dcba,0xe8cf10e7),LL(0xf4a06353,0xea35ff40),LL(0x8b77dd66,0x0b4c0dfa),
+ LL(0xde7e5c19,0x779b8552),LL(0xc1c0256c,0xfab28609),LL(0xabd4743d,0x64f58eee),LL(0x7b6cc93b,0x4e8ef838), LL(0x4cb1bf3d,0xee650d26),LL(0x73dedf61,0x4c1f9d09),LL(0xbfb70ced,0xaef7c9d7),LL(0x1641de1e,0x1ec0507e),
+ LL(0xcde45079,0xcd7e5cc7),LL(0x516ac9e4,0xde173c9a),LL(0xc170315c,0x517a8494),LL(0x91d8e8fb,0x438fd905), LL(0xc7d9630b,0x5145c506),LL(0xf47d4d75,0x6457a87b),LL(0x0d9a80e8,0xd31646bf),LL(0xcef3aabe,0x453add2b),
+ LL(0xa607419d,0xc9941109),LL(0xbb6bca80,0xfaa71e62),LL(0x07c431f3,0x34158c13),LL(0x992bc47a,0x594abebc), LL(0xeb78399f,0x6dfea691),LL(0x3f42cba4,0x48aafb35),LL(0x077c04f0,0xedcd65af),LL(0xe884491a,0x1a29a366),
+ LL(0x1c21f2bf,0x023a40e5),LL(0xa5057aee,0xf99a513c),LL(0xbcab072e,0xa3fe7e25),LL(0x40e32bcf,0x8568d2e1), LL(0xd3f69d9f,0x904594eb),LL(0x07affab1,0x181a9733),LL(0xb6e330f4,0xe4d68d76),LL(0xc75a7fc1,0x87a6dafb),
+ LL(0xef7d9289,0x549db2b5),LL(0x197f015a,0x2480d4a8),LL(0xc40493b6,0x61d5590b),LL(0x6f780331,0x3a55b52e), LL(0x309eadb0,0x40eb8115),LL(0x92e5c625,0xdea7de5a),LL(0xcc6a3d5a,0x64d631f0),LL(0x93e8dd61,0x9d5e9d7c),
+ LL(0x206d3ffc,0xf297bef5),LL(0x7d808bd4,0x23d5e033),LL(0xd24cf5ba,0x4a4f6912),LL(0x09cdaa8a,0xe4d8163b), LL(0xd3082e8e,0x0e0de9ef),LL(0x0192f360,0x4fe1246c),LL(0x4b8eee0a,0x1f900150),LL(0xf1da391b,0x5219da81),
+ LL(0xf7ea25aa,0x7bf6a5c1),LL(0xfbb07d5f,0xd165e6bf),LL(0x89e78671,0xe3539361),LL(0x2bac4219,0xa3fcac89), LL(0xf0baa8ab,0xdfab6fd4),LL(0xe2c1c2e5,0x5a4adac1),LL(0x40d85849,0x6cd75e31),LL(0x19b39181,0xce263fea),
+ LL(0x07032c72,0xcb6803d3),LL(0x790968c8,0x7f40d5ce),LL(0xdce978f0,0xa6de86bd),LL(0x368f751c,0x25547c4f), LL(0x65fb2a9e,0xb1e685fd),LL(0x1eb9179c,0xce69336f),LL(0x12504442,0xb15d1c27),LL(0xb911a06b,0xb7df465c),
+ LL(0x315980cd,0xb8d804a3),LL(0xfa3bebf7,0x693bc492),LL(0x2253c504,0x3578aeee),LL(0xcd2474a2,0x158de498), LL(0xcfda8368,0x1331f5c7),LL(0x78d7177e,0xd2d7bbb3),LL(0xf3c1e46e,0xdf61133a),LL(0xd30e7be8,0x5836ce7d),
+ LL(0x94f834cb,0x83084f19),LL(0x429ed782,0xd35653d4),LL(0x59e58243,0xa542f16f),LL(0x0470a22d,0xc2b52f65), LL(0x18f23d96,0xe3b6221b),LL(0x3f5252b4,0xcb05abac),LL(0x87d61402,0xca00938b),LL(0x411933e4,0x2f186cdd),
+ LL(0x9a29a5c5,0xe042ece5),LL(0x3b6c8402,0xb19b3c07),LL(0x19d92684,0xc97667c7),LL(0xebc66372,0xb5624622), LL(0x3c04fa02,0x0cb96e65),LL(0x8eaa39aa,0x83a7176c),LL(0xeaa1633f,0x2033561d),LL(0x4533df73,0x45a9d086),
+ LL(0x3dc090bc,0xe0542c1d),LL(0xaa59c167,0x82c996ef),LL(0x0ee7fc4d,0xe3f735e8),LL(0x7c35db79,0x7b179393), LL(0xf8c5dbfd,0xb6419e25),LL(0x1f327b04,0x4d9d7a1e),LL(0x298dfca8,0x979f6f9b),LL(0x8de9366a,0xc7c5dff1),
+ LL(0x04c82bdd,0x1b7a588d),LL(0xf8319dfd,0x68005534),LL(0xd8eb9580,0xde8a55b5),LL(0x8d5bca81,0x5ea886da), LL(0x252a0b4d,0xe8530a01),LL(0x35eaa0a1,0x1bffb4fe),LL(0xd8e99563,0x2ad828b1),LL(0x95f9cd87,0x7de96ef5),
+ LL(0xd77d970c,0x4abb2d0c),LL(0xd33ef9cb,0x03cfb933),LL(0x8b211fe9,0xb0547c01),LL(0xa56ed1c6,0x2fe64809), LL(0xc2ac98cc,0xcb7d5624),LL(0x1a393e33,0x2a1372c0),LL(0x29660521,0xc8d1ec1c),LL(0xb37ac3e9,0xf3d31b04),
+ LL(0x5ece6e7c,0xa29ae9df),LL(0x0facfb55,0x0603ac8f),LL(0xdda233a5,0xcfe85b7a),LL(0xbd75f0b8,0xe618919f), LL(0x99bf1603,0xf555a3d2),LL(0xf184255a,0x1f43afc9),LL(0x319a3e02,0xdcdaf341),LL(0x03903a39,0xd3b117ef),
+ LL(0x65d1d131,0xe095da13),LL(0xc37ad03e,0x86f16367),LL(0x462cd8dd,0x5f37389e),LL(0xd67a60e6,0xc103fa04), LL(0xf4b478f0,0x57c34344),LL(0xe117c98d,0xce91edd8),LL(0x231fc12e,0x001777b0),LL(0xb207bccb,0x11ae47f2),
+ LL(0x20f8a242,0xd983cf8d),LL(0xf22e1ad8,0x7aff5b1d),LL(0x7fc4feb3,0x68fd11d0),LL(0xb0f1c3e1,0x5d53ae90), LL(0xec041803,0x50fb7905),LL(0x14404888,0x85e3c977),LL(0xac628d8f,0x0e67faed),LL(0x6668532c,0x2e865150),
+ LL(0x6a67a6b0,0x15acaaa4),LL(0xb25cec41,0xf4cdee25),LL(0xe4c6701e,0x49ee565a),LL(0xfc7d63d8,0x2a04ca66), LL(0xef0543fb,0xeb105018),LL(0xd1b0d81d,0xf709a4f5),LL(0x2915d333,0x5b906ee6),LL(0x96f1f0ab,0xf4a87412),
+ LL(0x4d82f4c2,0xb6b82fa7),LL(0x6804efb3,0x90725a60),LL(0xadc3425e,0xbc82ec46),LL(0x2787843e,0xb7b80581), LL(0xdd1fc74c,0xdf46d91c),LL(0xe783a6c4,0xdc1c62cb),LL(0x1a04cbba,0x59d1b9f3),LL(0x95e40764,0xd87f6f72),
+ LL(0x317f4a76,0x02b4cfc1),LL(0x91036bce,0x8d2703eb),LL(0xa5e72a56,0x98206cc6),LL(0xcf53fb0f,0x57be9ed1), LL(0xef0b17ac,0x09374571),LL(0xd9181b38,0x74b2655e),LL(0x89935d0e,0xc8f80ea8),LL(0x91529936,0xc0d9e942),
+ LL(0x1e84e0e5,0x19686041),LL(0xaea34c93,0xa5db84d3),LL(0x7073a732,0xf9d5bb19),LL(0x6bcfd7c0,0xb8d2fe56), LL(0xf3eb82fa,0x45775f36),LL(0xfdff8b58,0x8cb20ccc),LL(0x8374c110,0x1659b65f),LL(0x330c789a,0xb8b4a422),
+ LL(0x6fe8208b,0x75e3c3ea),LL(0x286e78fe,0xbd74b9e4),LL(0xd7d93a1a,0x0be2e81b),LL(0xdd0a5aae,0x7ed06e27), LL(0x6be8b800,0x721f5a58),LL(0xd846db28,0x428299d1),LL(0x5be88ed3,0x95cb8e6b),LL(0x1c034e11,0xc3186b23),
+ LL(0x8977d99b,0xa6312c9e),LL(0x83f531e7,0xbe944331),LL(0x18d3b1d4,0x8232c0c2),LL(0xe1247b73,0x617aae8b), LL(0x282aec3b,0x40153fc4),LL(0xf7b8f823,0xc6063d2f),LL(0x3304f94c,0x68f10e58),LL(0xee676346,0x31efae74),
+ LL(0x40a9b97c,0xbadb6c6d),LL(0x4f666256,0x14702c63),LL(0x5184b2e3,0xdeb954f1),LL(0x94b6ca40,0x5184a526), LL(0x003c32ea,0xfff05337),LL(0x205974c7,0x5aa374dd),LL(0x4b0dd71a,0x9a763854),LL(0xdeb947ec,0x459cd27f),
+ LL(0x459c2b92,0xa6e28161),LL(0x75ee8ef5,0x2f020fa8),LL(0x30b06310,0xb132ec2d),LL(0xbc6a4530,0xc3e15899), LL(0xaa3f451a,0xdc5f53fe),LL(0xc2d9acac,0x3a3c7f23),LL(0x6b27e58b,0x2ec2f892),LL(0xd742799f,0x68466ee7),
+ LL(0x1fa26613,0x98324dd4),LL(0xbdc29d63,0xa2dc6dab),LL(0xd712d657,0xf9675faa),LL(0x21fd8d15,0x813994be), LL(0xfd4f7553,0x5ccbb722),LL(0xf3a36b20,0x5135ff8b),LL(0x69559df5,0x44be28af),LL(0x9d41bf30,0x40b65bed),
+ LL(0x3734e520,0xd98bf2a4),LL(0x209bdcba,0x5e3abbe3),LL(0xbc945b35,0x77c76553),LL(0xc6ef14aa,0x5331c093), LL(0x76b60c80,0x518ffe29),LL(0x7ace16f8,0x2285593b),LL(0xbe2b9784,0xab1f64cc),LL(0xab2421b6,0xe8f2c0d9),
+ LL(0xc1df065c,0x617d7174),LL(0x5f6578fa,0xafeeb5ab),LL(0x263b54a8,0x16ff1329),LL(0xc990dce3,0x45c55808), LL(0xecc8c177,0x42eab6c0),LL(0x5982ecaa,0x799ea9b5),LL(0xb607ef8e,0xf65da244),LL(0x32a3fc2c,0x8ab226ce),
+ LL(0x7ea973dc,0x745741e5),LL(0x20888f2e,0x5c00ca70),LL(0x45fd9cf1,0x7cdce3cf),LL(0x5507f872,0x8a741ef1), LL(0x196b4cec,0x47c51c2f),LL(0xc97ea618,0x70d08e43),LL(0x15b18a2b,0x930da15c),LL(0x2f610514,0x33b6c678),
+ LL(0x07ac9794,0xc662e4f8),LL(0xba06cb79,0x1eccf050),LL(0xe7d954e5,0x1ff08623),LL(0x24cf71c3,0x6ef2c5fb), LL(0x67978453,0xb2c063d2),LL(0x1d654af8,0xa0cf3796),LL(0x7ebdaa37,0x7cb242ea),LL(0xb86747e0,0x206e0b10),
+ LL(0xd5ecfefc,0x481dae5f),LL(0xc2bff8fc,0x07084fd8),LL(0xea324596,0x8040a01a),LL(0xd4de4036,0x4c646980), LL(0xd65abfc3,0x9eb8ab4e),LL(0x13541ec7,0xe01cb91f),LL(0xfd695012,0x8f029adb),LL(0x3c7569ec,0x9ae28483),
+ LL(0xa66d80a1,0xa5614c9e),LL(0x75f5f911,0x680a3e44),LL(0xceba4fc1,0x0c07b14d),LL(0xa13071c1,0x891c285b), LL(0x799ece3c,0xcac67ceb),LL(0x41e07e27,0x29b910a9),LL(0xf2e43123,0x66bdb409),LL(0x7ac9ecbe,0x06f8b137),
+ LL(0x38547090,0x5981fafd),LL(0x85e3415d,0x19ab8b9f),LL(0xc7e31b27,0xfc28c194),LL(0x6fbcbb42,0x843be0aa), LL(0xa6db836c,0xf3b1ed43),LL(0x01a45c05,0x2a1330e4),LL(0x95c1a377,0x4f19f3c5),LL(0x44b5ee33,0xa85f39d0),
+ LL(0x4ae52834,0x3da18e6d),LL(0x7423dcb0,0x5a403b39),LL(0xf2374aef,0xbb555e0a),LL(0x1e8ca111,0x2ad599c4), LL(0x014b3bf8,0x1b3a2fb9),LL(0xf66d5007,0x73092684),LL(0xc4340102,0x079f1426),LL(0x8fddf4de,0x1827cf81),
+ LL(0xf10ff927,0xc83605f6),LL(0x23739fc6,0xd3871451),LL(0xcac1c2cc,0x6d163450),LL(0xa2ec1ac5,0x6b521296), LL(0x6e3cb4a5,0x0606c4f9),LL(0x778abff7,0xe47d3f41),LL(0xbe8e3a45,0x425a8d5e),LL(0xa6102160,0x53ea9e97),
+ LL(0x39cbb688,0x477a106e),LL(0xf3386d32,0x532401d2),LL(0xb1b9b421,0x8e564f64),LL(0x81dad33f,0xca9b8388), LL(0x2093913e,0xb1422b4e),LL(0x69bc8112,0x533d2f92),LL(0xebe7b2c7,0x3fa017be),LL(0xcaf197c6,0xb2767c4a),
+ LL(0xaedbae9f,0xc925ff87),LL(0x36880a54,0x7daf0eb9),LL(0x9c4d0e71,0x9284ddf5),LL(0x316f8cf5,0x1581cf93), LL(0x3ac1f452,0x3eeca887),LL(0xfb6aeffe,0xb417fce9),LL(0xeefb8dc3,0xa5918046),LL(0x02209400,0x73d318ac),
+ LL(0x728693e5,0xe800400f),LL(0x339927ed,0xe87d814b),LL(0x57ea9910,0x93e94d3b),LL(0x2245fb69,0xff8a35b6), LL(0x7f200d34,0x043853d7),LL(0x0f653ce1,0x470f1e68),LL(0x59a06379,0x81ac05bd),LL(0x03930c29,0xa14052c2),
+ LL(0x26bc2797,0x6b72fab5),LL(0x99f16771,0x13670d16),LL(0x1e3e48d1,0x00170052),LL(0xb7adf678,0x978fe401), LL(0xd41c5dd4,0x55ecfb92),LL(0xc7b27da5,0x5ff8e247),LL(0x013fb606,0xe7518272),LL(0x2f547a3c,0x5768d7e5),
+ LL(0x60017a5f,0xbb24eaa3),LL(0x9c64ce9b,0x6b18e6e4),LL(0x103dde07,0xc225c655),LL(0x7592f7ea,0xfc3672ae), LL(0xd06283a1,0x9606ad77),LL(0xe4d59d99,0x542fc650),LL(0x2a40e7c2,0xabb57c49),LL(0xa8db9f55,0xac948f13),
+ LL(0xb04465c3,0x6d4c9682),LL(0x6468bd15,0xe3d062fa),LL(0x5f318d7e,0xa51729ac),LL(0x9eb6fc95,0x1fc87df6), LL(0x0591f652,0x63d146a8),LL(0x589621aa,0xa861b8f7),LL(0xce31348c,0x59f5f15a),LL(0x440da6da,0x8f663391),
+ LL(0xb591ffa3,0xcfa778ac),LL(0x4cdfebce,0x027ca9c5),LL(0x444ea6b3,0xbe8e05a5),LL(0xa78d8254,0x8aab4e69), LL(0xb474d6b8,0x2437f04f),LL(0x045b3855,0x6597ffd4),LL(0xca47ecaa,0xbb0aea4e),LL(0x85c7ebfc,0x568aae83),
+ LL(0xc73b2383,0x0e966e64),LL(0xd17d8762,0x49eb3447),LL(0x8da05dab,0xde107821),LL(0x016b7236,0x443d8baa), LL(0xea7610d6,0x163b63a5),LL(0xce1ca979,0xe47e4185),LL(0x80baa132,0xae648b65),LL(0x0e0d5b64,0xebf53de2),
+ LL(0xd3c8c1ca,0x8d3bfcb4),LL(0x5d04b309,0x0d914ef3),LL(0x3de7d395,0x55ef6415),LL(0x26b850e8,0xbde1666f), LL(0xd449ab19,0xdbe1ca6e),LL(0xe89a2672,0x8902b322),LL(0xdacb7a53,0xb1674b7e),LL(0xf52523ff,0x8e9faf6e),
+ LL(0x9a85788b,0x6ba535da),LL(0xbd0626d4,0xd21f03ae),LL(0xe873dc64,0x099f8c47),LL(0x018ec97e,0xcda8564d), LL(0xde92c68c,0x3e8d7a5c),LL(0x73323cc4,0x78e035a1),LL(0xf880ff7c,0x3ef26275),LL(0x273eedaa,0xa4ee3dff),
+ LL(0xaf4e18f8,0x58823507),LL(0x0672f328,0x967ec9b5),LL(0x559d3186,0x9ded19d9),LL(0x6cdce39c,0x5e2ab3de), LL(0x11c226df,0xabad6e4d),LL(0x87723014,0xf9783f43),LL(0x1a885719,0x9a49a0cf),LL(0x90da9dbf,0xfc0c1a5a),
+ LL(0x571d92ac,0x8bbaec49),LL(0x4692517f,0x569e85fe),LL(0xa14ea4af,0x8333b014),LL(0x12e5c5ad,0x32f2a62f), LL(0x06d89b85,0x98c2ce3a),LL(0x2ff77a08,0xb90741aa),LL(0x01f795a2,0x2530defc),LL(0x84b3c199,0xd6e5ba0b),
+ LL(0x12e4c936,0x7d8e8451),LL(0xbd0be17b,0xae419f7d),LL(0x22262bc9,0xa583fc8c),LL(0x91bfe2bd,0x6b842ac7), LL(0x440d6827,0x33cef4e9),LL(0xef81fb14,0x5f69f4de),LL(0x234fbb92,0xf16cf6f6),LL(0xd9e7e158,0x76ae3fc3),
+ LL(0xe9740b33,0x4e89f6c2),LL(0x4962d6a1,0x677bc85d),LL(0x68d10d15,0x6c6d8a7f),LL(0x0257b1cd,0x5f9a7224), LL(0x4ad85961,0x7096b916),LL(0xe657ab4a,0x5f8c47f7),LL(0xf7461d7e,0xde57d7d0),LL(0x80ce5ee2,0x7eb6094d),
+ LL(0x34190547,0x0b1e1dfd),LL(0xf05dd150,0x8a394f43),LL(0x97df44e6,0x0a9eb24d),LL(0x87675719,0x78ca06bf), LL(0x6ffeec22,0x6f0b3462),LL(0x36cdd8fb,0x9d91bcea),LL(0xa105be47,0xac83363c),LL(0x069710e3,0x81ba76c1),
+ LL(0x28c682c6,0x3d1b24cb),LL(0x8612575b,0x27f25228),LL(0xe8e66e98,0xb587c779),LL(0x405eb1fe,0x7b0c03e9), LL(0x15b548e7,0xfdf0d030),LL(0x38b36af7,0xa8be76e0),LL(0x4f310c40,0x4cdab04a),LL(0xf47ecaec,0x6287223e),
+ LL(0x8b399320,0x678e6055),LL(0xc01e4646,0x61fe3fa6),LL(0x03261a5e,0xc482866b),LL(0x5c2f244a,0xdfcf45b8), LL(0x2f684b43,0x8fab9a51),LL(0xc7220a66,0xf796c654),LL(0xf5afa58f,0x1d90707e),LL(0x4fdbe0de,0x2c421d97),
+ LL(0xaf2ebc2f,0xc4f4cda3),LL(0xcb4efe24,0xa0af843d),LL(0x9ccd10b1,0x53b857c1),LL(0x914d3e04,0xddc9d1eb), LL(0x62771deb,0x7bdec8bb),LL(0x91c5aa81,0x829277aa),LL(0x832391ae,0x7af18dd6),LL(0xc71a84ca,0x1740f316),
+},
+/* digit=34 base_pwr=2^238 */
+{
+ LL(0xeeaf8c49,0x8928e99a),LL(0x6e24d728,0xee7aa73d),LL(0xe72b156c,0x4c5007c2),LL(0xed408a1d,0x5fcf57c5), LL(0xb6057604,0x9f719e39),LL(0xc2868bbf,0x7d343c01),LL(0x7e103e2d,0x2cca254b),LL(0xf131bea2,0xe6eb38a9),
+ LL(0x8be762b4,0xb33e624f),LL(0x058e3413,0x2a9ee4d1),LL(0x67d805fa,0x968e6369),LL(0x7db8bfd7,0x9848949b), LL(0xd23a8417,0x5308d7e5),LL(0xf3e29da5,0x892f3b1d),LL(0x3dee471f,0xc95c139e),LL(0xd757e089,0x8631594d),
+ LL(0xde918dcc,0xe0c82a3c),LL(0x26fdcf4b,0x2e7b5994),LL(0x32cb1b2d,0x82c50249),LL(0x7657ae07,0xea613a9d), LL(0xf1fdc9f7,0xc2eb5f6c),LL(0x879fe682,0xb6eae8b8),LL(0x591cbc7f,0x253dfee0),LL(0x3e1290e6,0x000da713),
+ LL(0x1f095615,0x1083e2ea),LL(0x14e68c33,0x0a28ad77),LL(0x3d8818be,0x6bfc0252),LL(0xf35850cd,0xb585113a), LL(0x30df8aa1,0x7d935f0b),LL(0x4ab7e3ac,0xaddda07c),LL(0x552f00cb,0x92c34299),LL(0x2909df6c,0xc33ed1de),
+ LL(0x80e87766,0x22c2195d),LL(0x9ddf4ac0,0x9e99e6d8),LL(0x65e74934,0x09642e4e),LL(0xff1ff241,0x2610ffa2), LL(0x751c8159,0x4d1d47d4),LL(0xaf3a9363,0x697b4985),LL(0x87477c33,0x0318ca46),LL(0x9441eff3,0xa90cb565),
+ LL(0x36f024cb,0x58bb3848),LL(0x36016168,0x85be1f77),LL(0xdc7e07f1,0x6c59587c),LL(0xaf1d8f02,0x191be071), LL(0xcca5e55c,0xbf169fa5),LL(0xf7d04eac,0x3864ba3c),LL(0x8d7d05db,0x915e367f),LL(0xa6549e5d,0xb48a876d),
+ LL(0x580e40a2,0xef89c656),LL(0x728068bc,0xf194ed8c),LL(0xa47990c9,0x74528045),LL(0x5e1a4649,0xf53fc7d7), LL(0x78593e7d,0xbec5ae9b),LL(0x41db65d7,0x2cac4ee3),LL(0x04a3d39b,0xa8c1eb24),LL(0x03f8f3ef,0x53b7d634),
+ LL(0x3e07113c,0x2dc40d48),LL(0x7d8b63ae,0x6e4a5d39),LL(0x79684c2b,0x5582a94b),LL(0x622da26c,0x932b33d4), LL(0x0dbbf08d,0xf534f651),LL(0x64c23a52,0x211d07c9),LL(0xee5bdc9b,0x0eeece0f),LL(0xf7015558,0xdf178168),
+ LL(0x0a712229,0xd4294635),LL(0x09273f8c,0x93cbe448),LL(0x8f13bc83,0x00b095ef),LL(0x8798978c,0xbb741972), LL(0x56dbe6e7,0x9d7309a2),LL(0x5a5d39ec,0xe578ec56),LL(0x851f9a31,0x3961151b),LL(0xe5709eb4,0x2da7715d),
+ LL(0x53dfabf0,0x867f3017),LL(0xb8e39259,0x728d2078),LL(0x815d9958,0x5c75a0cd),LL(0x16603be1,0xf84867a6), LL(0x70e35b1c,0xc865b13d),LL(0x19b03e2c,0x02414468),LL(0xac1f3121,0xe46041da),LL(0x6f028a7c,0x7c9017ad),
+ LL(0x0a482873,0xabc96de9),LL(0xb77e54d4,0x4265d6b1),LL(0xa57d88e7,0x68c38e79),LL(0x9ce82de3,0xd461d766), LL(0x64a7e489,0x817a9ec5),LL(0xa0def5f2,0xcc5675cd),LL(0x985d494e,0x9a00e785),LL(0x1b03514a,0xc626833f),
+ LL(0x83cdd60e,0xabe7905a),LL(0xa1170184,0x50602fb5),LL(0xb023642a,0x689886cd),LL(0xa6e1fb00,0xd568d090), LL(0x0259217f,0x5b1922c7),LL(0xc43141e4,0x93831cd9),LL(0x0c95f86e,0xdfca3587),LL(0x568ae828,0xdec2057a),
+ LL(0xf98a759a,0xc44ea599),LL(0xf7c23c1d,0x55a0a7a2),LL(0x94c4f687,0xd5ffb6e6),LL(0x12848478,0x3563cce2), LL(0xe7b1fbe1,0x812b3517),LL(0x4f7338e0,0x8a7dc979),LL(0x52d048db,0x211ecee9),LL(0xc86ea3b8,0x2eea4056),
+ LL(0xba772b34,0xd8cb68a7),LL(0x5f4e2541,0xe16ed341),LL(0x0fec14db,0x9b32f6a6),LL(0x391698be,0xeee376f7), LL(0x83674c02,0xe9a7aa17),LL(0x5843022a,0x65832f97),LL(0x5ba4990f,0x29f3a8da),LL(0xfb8e3216,0x79a59c3a),
+ LL(0xbd19bb16,0x9cdc4d2e),LL(0xb3262d86,0xc6c7cfd0),LL(0x969c0b47,0xd4ce14d0),LL(0x13e56128,0x1fa352b7), LL(0x973db6d3,0x383d55b8),LL(0xe8e5b7bf,0x71836850),LL(0xe6bb571f,0xc7714596),LL(0x2d5b2dd2,0x259df31f),
+ LL(0x913cc16d,0x568f8925),LL(0xe1a26f5a,0x18bc5b6d),LL(0xf5f499ae,0xdfa413be),LL(0xc3f0ae84,0xf8835dec), LL(0x65a40ab0,0xb6e60bd8),LL(0x194b377e,0x65596439),LL(0x92084a69,0xbcd85625),LL(0x4f23ede0,0x5ce433b9),
+ LL(0x6ad65143,0xe8e8f04f),LL(0xd6e14af6,0x11511827),LL(0x8295c0c7,0x3d390a10),LL(0x621eba16,0x71e29ee4), LL(0x63717b46,0xa588fc09),LL(0xe06ad4a2,0x02be02fe),LL(0x04c22b22,0x931558c6),LL(0x12f3c849,0xbb4d4bd6),
+ LL(0x20efd662,0x54a4f496),LL(0xc5952d14,0x92ba6d20),LL(0xcc9784c2,0x2db8ea1e),LL(0x4b353644,0x81cc10ca), LL(0x4b4d7f6c,0x40b570ad),LL(0x84a1dcd2,0x5c9f1d96),LL(0x3147e797,0x01379f81),LL(0x2bd499f5,0xe5c6097b),
+ LL(0x328e5e20,0x40dcafa6),LL(0x54815550,0xf7b5244a),LL(0x47bfc978,0xb9a4f118),LL(0xd25825b1,0x0ea0e79f), LL(0x646c7ecf,0xa50f96eb),LL(0x446dea9d,0xeb811493),LL(0xdfabcf69,0x2af04677),LL(0xc713f6e8,0xbe3a068f),
+ LL(0x42e06189,0x860d523d),LL(0x4e3aff13,0xbf077941),LL(0xc1b20650,0x0b616dca),LL(0x2131300d,0xe66dd6d1), LL(0xff99abde,0xd4a0fd67),LL(0xc7aac50d,0xc9903550),LL(0x7c46b2d7,0x022ecf8b),LL(0x3abf92af,0x3333b1e8),
+ LL(0x6c491c14,0x11cc113c),LL(0x80dd3f88,0x05976688),LL(0x29d932ed,0xf5b4d9e7),LL(0xa2c38b6d,0xe982aad8), LL(0x8be0dcf0,0x6f925347),LL(0x65ca53f2,0x700080ae),LL(0x443ca77f,0xd8131156),LL(0xec51f984,0xe92d6942),
+ LL(0x85dfe9ae,0xd2a08af8),LL(0x4d2a86ca,0xd825d9a5),LL(0x39dff020,0x2c53988d),LL(0x430cdc40,0xf38b135a), LL(0x62a7150b,0x0c918ae0),LL(0x0c340e9b,0xf31fd8de),LL(0x4dbbf02e,0xafa0e7ae),LL(0x5eba6239,0x5847fb2a),
+ LL(0xdccbac8b,0x6b1647dc),LL(0x06f485c8,0xb642aa78),LL(0x7038ecdf,0x873f3765),LL(0xfa49d3fe,0x2ce5e865), LL(0xc98c4400,0xea223788),LL(0xf1fa5279,0x8104a8cd),LL(0x06becfd7,0xbcf7cc7a),LL(0xc8f974ae,0x49424316),
+ LL(0x84d6365d,0xc0da65e7),LL(0x8f759fb8,0xbcb7443f),LL(0x7ae81930,0x35c712b1),LL(0x4c6e08ab,0x80428dff), LL(0xa4faf843,0xf19dafef),LL(0xffa9855f,0xced8538d),LL(0xbe3ac7ce,0x20ac409c),LL(0x882da71e,0x358c1fb6),
+ LL(0xfd349961,0xafa9c0e5),LL(0x8421c2fc,0x2b2cfa51),LL(0xf3a28d38,0x2a80db17),LL(0x5d138e7e,0xa8aba539), LL(0x6e96eb8d,0x52012d1d),LL(0xcbaf9622,0x65d8dea0),LL(0xb264f56c,0x57735447),LL(0x1b6c8da2,0xbeebef3f),
+ LL(0xce785254,0xfc346d98),LL(0xbb64a161,0xd50e8d72),LL(0x49794add,0xc03567c7),LL(0x752c7ef6,0x15a76065), LL(0x961f23d6,0x59f3a222),LL(0x73ecc0b0,0x378e4438),LL(0x5a82fde4,0xc74be434),LL(0xd8b9cf34,0xae509af2),
+ LL(0x577f44a1,0x4a61ee46),LL(0xb611deeb,0xe09b748c),LL(0xf5f7b884,0xc0481b2c),LL(0x61acfa6b,0x35626678), LL(0xbf8d21e6,0x37f4c518),LL(0xb205a76d,0x22d96531),LL(0x954073c0,0x37fb85e1),LL(0x65b3a567,0xbceafe4f),
+ LL(0xbe42a582,0xefecdef7),LL(0x65046be6,0xd3fc6080),LL(0x09e8dba9,0xc9af13c8),LL(0x641491ff,0x1e6c9847), LL(0xd30c31f7,0x3b574925),LL(0xac2a2122,0xb7eb72ba),LL(0xef0859e7,0x776a0dac),LL(0x21900942,0x06fec314),
+ LL(0xf8c22049,0x2464bc10),LL(0x875ebf69,0x9bfbcce7),LL(0x4336326b,0xd7a88e2a),LL(0x5bc2acfa,0xda05261c), LL(0xeba7efc8,0xc29f5bdc),LL(0x25dbbf2e,0x471237ca),LL(0x2975f127,0xa72773f2),LL(0x04d0b326,0xdc744e8e),
+ LL(0xa56edb73,0x38a7ed16),LL(0x2c007e70,0x64357e37),LL(0x5080b400,0xa167d15b),LL(0x23de4be1,0x07b41164), LL(0x74c89883,0xb2d91e32),LL(0x2882e7ed,0x3c162821),LL(0x7503e482,0xad6b36ba),LL(0x0ea34331,0x48434e8e),
+ LL(0x2c7ae0b9,0x79f4f24f),LL(0x1939b44a,0xc46fbf81),LL(0x56595eb1,0x76fefae8),LL(0xcd5f29c7,0x417b66ab), LL(0xc5ceec20,0x5f2332b2),LL(0xe1a1cae2,0xd69661ff),LL(0x9b0286e6,0x5ede7e52),LL(0xe276b993,0x9d062529),
+ LL(0x7e50122b,0x324794b0),LL(0x4af07ca5,0xdd744f8b),LL(0xd63fc97b,0x30a12f08),LL(0x76626d9d,0x39650f1a), LL(0x1fa38477,0x101b47f7),LL(0xd4dc124f,0x3d815f19),LL(0xb26eb58a,0x1569ae95),LL(0x95fb1887,0xc3cde188),
+ LL(0xf9539a48,0x54e9f37b),LL(0x7408c1a5,0xb0100e06),LL(0xea580cbb,0x821d9811),LL(0x86e50c56,0x8af52d35), LL(0xdbbf698b,0xdfbd9d47),LL(0x03dc1c73,0x2961a1ea),LL(0xe76a5df8,0x203d38f8),LL(0x6def707a,0x08a53a68),
+ LL(0x1bee45d4,0x26eefb48),LL(0x3c688036,0xb3cee346),LL(0xc42f2469,0x463c5315),LL(0x81378162,0x19d84d2e), LL(0x1c4d349f,0x22d7c3c5),LL(0x163d59c5,0x65965844),LL(0xb8abceae,0xcf198c56),LL(0x628559d5,0x6fb1fb1b),
+ LL(0x07bf8fe3,0x8bbffd06),LL(0x3467734b,0x46259c58),LL(0x35f7f0d3,0xd8953cea),LL(0xd65b0ff1,0x1f0bece2), LL(0xf3c72914,0xf7d5b4b3),LL(0x3cb53389,0x29e8ea95),LL(0x836b6d46,0x4a365626),LL(0xea174fde,0xe849f910),
+ LL(0xf4737f21,0x7ec62fbb),LL(0x6209f5ac,0xd8dba5ab),LL(0xa5f9adbe,0x24b5d7a9),LL(0xa61dc768,0x707d28f7), LL(0xcaa999ea,0x7711460b),LL(0x1c92e4cc,0xba7b174d),LL(0x18d4bf2d,0x3c4bab66),LL(0xeb8bd279,0xb8f0c980),
+ LL(0x324b4737,0x024bea9a),LL(0x32a83bca,0xfba9e423),LL(0xa232dced,0x6e635643),LL(0x2571c8ba,0x99619367), LL(0x54b7032b,0xe8c9f357),LL(0x2442d54a,0xf936b3ba),LL(0x8290c65a,0x2263f0f0),LL(0xee2c7fdb,0x48989780),
+ LL(0x13d4f95e,0xadc5d55a),LL(0xad9b8500,0x737cff85),LL(0x8a73f43d,0x271c557b),LL(0xe18bc476,0xbed617a4), LL(0x7dfd8ab2,0x66245401),LL(0x3a2870aa,0xae7b89ae),LL(0x23a7e545,0x1b555f53),LL(0xbe057e4c,0x6791e247),
+ LL(0x324fa34d,0x860136ad),LL(0x4cbeae28,0xea111447),LL(0xbedd3299,0x023a4270),LL(0xc1c35c34,0x3d5c3a7f), LL(0x8d0412d2,0xb0f6db67),LL(0xfcdc6b9a,0xd92625e2),LL(0x4e28a982,0x92ae5ccc),LL(0x47a3ce7e,0xea251c36),
+ LL(0x790691bf,0x9d658932),LL(0x06b736ae,0xed610589),LL(0xc0d63b6e,0x712c2f04),LL(0xc63d488f,0x5cf06fd5), LL(0xd9588e41,0x97363fac),LL(0x2b93257e,0x1f9bf762),LL(0x667acace,0xa9d1ffc4),LL(0x0a061ecf,0x1cf4a1aa),
+ LL(0xdc1818d0,0x40e48a49),LL(0xa3621ab0,0x0643ff39),LL(0xe39ef639,0x5768640c),LL(0x04d86854,0x1fc099ea), LL(0xeccd28fd,0x9130b9c3),LL(0x7eec54ab,0xd743cbd2),LL(0xe5b475b6,0x052b146f),LL(0x900a7d1f,0x058d9a82),
+ LL(0x91262b72,0x65e02292),LL(0xbb0edf03,0x96f924f9),LL(0xfe206842,0x5cfa59c8),LL(0x5eafa720,0xf6037004), LL(0x18d7dd96,0x5f30699e),LL(0xcbab2495,0x381e8782),LL(0xdd8be949,0x91669b46),LL(0x26aae8ef,0xb40606f5),
+ LL(0xfc6751a4,0x2812b839),LL(0xfba800ef,0x16196214),LL(0x4c1a2875,0x4398d5ca),LL(0x653d8349,0x720c00ee), LL(0xd820007c,0xc2699eb0),LL(0xa39b5825,0x880ee660),LL(0x471f6984,0x70694694),LL(0xe3dda99a,0xf7d16ea8),
+ LL(0xc0519a23,0x28d675b2),LL(0x4f6952e3,0x9ebf94fe),LL(0xa2294a8a,0xf28bb767),LL(0xfe0af3f5,0x85512b4d), LL(0x99b16a0d,0x18958ba8),LL(0xba7548a7,0x95c2430c),LL(0xa16be615,0xb30d1b10),LL(0x85bfb74c,0xe3ebbb97),
+ LL(0x18549fdb,0xa3273cfe),LL(0x4fcdb792,0xf6e200bf),LL(0x83aba56c,0x54a76e18),LL(0x89ef6aa2,0x73ec66f6), LL(0xd1b9a305,0x8d17add7),LL(0xb7ae1b9d,0xa959c5b9),LL(0x6bcc094a,0x88643522),LL(0xd7d429b9,0xcc5616c4),
+ LL(0xe6a33f7c,0xa6dada01),LL(0x9d4e70ad,0xc6217a07),LL(0x09c15b7c,0xd619a818),LL(0x0e80c854,0xea06b329), LL(0xa5f5e7b9,0x174811ce),LL(0x787c65f4,0x66dfc310),LL(0x3316ab54,0x4ea7bd69),LL(0x1dcc0f70,0xc12c4acb),
+ LL(0x1e407dd9,0xe4308d1a),LL(0x91afa997,0xe8a3587c),LL(0xab77b7a5,0xea296c12),LL(0x673c0d52,0xb5ad49e4), LL(0x7006085a,0x40f9b2b2),LL(0x87bf6ec2,0xa88ff340),LL(0x4e3066a6,0x978603b1),LL(0xb5e486e2,0xb3f99fc2),
+ LL(0xb2e63645,0x07b53f5e),LL(0x84c84232,0xbe57e547),LL(0x7214d5cf,0xd779c216),LL(0x029a3aca,0x617969cd), LL(0x8a7017a0,0xd17668cd),LL(0xbe9b7ee8,0x77b4d19a),LL(0x9c161776,0x58fd0e93),LL(0xd5968a72,0xa8c4f4ef),
+ LL(0x67b3de77,0x296071cc),LL(0x634f7905,0xae3c0b8e),LL(0x8a7100c9,0x67e440c2),LL(0xeb4b9b42,0xbb8c3c1b), LL(0xc51b3583,0x6d71e8ea),LL(0x9525e642,0x7591f5af),LL(0x13f509f3,0xf73a2f7b),LL(0x5619ac9b,0x618487aa),
+ LL(0x9d61718a,0x3a72e5f7),LL(0x7592d28c,0x00413bcc),LL(0x963c35cf,0x7d9b11d3),LL(0xb90a46ed,0x77623bcf), LL(0xdcdd2a50,0xdeef273b),LL(0x0601846e,0x4a741f9b),LL(0x0ec6e929,0x33b89e51),LL(0x8b7f22cd,0xcb02319f),
+ LL(0x084bae24,0xbbe1500d),LL(0x343d2693,0x2f0ae8d7),LL(0x7cdef811,0xacffb5f2),LL(0x263fb94f,0xaa0c030a), LL(0xa0f442de,0x6eef0d61),LL(0x27b139d3,0xf92e1817),LL(0x0ad8bc28,0x1ae6deb7),LL(0xc0514130,0xa89e38dc),
+ LL(0xd2fdca23,0x81eeb865),LL(0xcc8ef895,0x5a15ee08),LL(0x01905614,0x768fa10a),LL(0x880ee19b,0xeff5b8ef), LL(0xcb1c8a0e,0xf0c0cabb),LL(0xb8c838f9,0x2e1ee9cd),LL(0x8a4a14c0,0x0587d8b8),LL(0x2ff698e5,0xf6f27896),
+ LL(0x89ee6256,0xed38ef1c),LL(0x6b353b45,0xf44ee1fe),LL(0x70e903b3,0x9115c0c7),LL(0x818f31df,0xc78ec0a1), LL(0xb7dccbc6,0x6c003324),LL(0x163bbc25,0xd96dd1f3),LL(0x5cedd805,0x33aa82dd),LL(0x7f7eb2f1,0x123aae4f),
+ LL(0xa26262cd,0x1723fcf5),LL(0x0060ebd5,0x1f7f4d5d),LL(0xb2eaa3af,0xf19c5c01),LL(0x9790accf,0x2ccb9b14), LL(0x52324aa6,0x1f9c1cad),LL(0x7247df54,0x63200526),LL(0xbac96f82,0x5732fe42),LL(0x01a1c384,0x52fe771f),
+ LL(0xb1001684,0x546ca13d),LL(0xa1709f75,0xb56b4eee),LL(0xd5db8672,0x266545a9),LL(0x1e8f3cfb,0xed971c90), LL(0xe3a07b29,0x4e7d8691),LL(0xe4b696b9,0x7570d9ec),LL(0x7bc7e9ae,0xdc5fa067),LL(0xc82c4844,0x68b44caf),
+ LL(0xbf44da80,0x519d34b3),LL(0x5ab32e66,0x283834f9),LL(0x6278a000,0x6e608797),LL(0x627312f6,0x1e62960e), LL(0xe6901c55,0x9b87b27b),LL(0x24fdbc1f,0x80e78538),LL(0x2facc27d,0xbbbc0951),LL(0xac143b5a,0x06394239),
+ LL(0x376c1944,0x35bb4a40),LL(0x63da1511,0x7cb62694),LL(0xb7148a3b,0xafd29161),LL(0x4e2ea2ee,0xa6f9d9ed), LL(0x880dd212,0x15dc2ca2),LL(0xa61139a9,0x903c3813),LL(0x6c0f8785,0x2aa7b46d),LL(0x901c60ff,0x36ce2871),
+ LL(0xe10d9c12,0xc683b028),LL(0x032f33d3,0x7573baa2),LL(0x67a31b58,0x87a9b1f6),LL(0xf4ffae12,0xfd3ed11a), LL(0x0cb2748e,0x83dcaa9a),LL(0x5d6fdf16,0x8239f018),LL(0x72753941,0xba67b49c),LL(0xc321cb36,0x2beec455),
+ LL(0x3f8b84ce,0x88015606),LL(0x8d38c86f,0x76417083),LL(0x598953dd,0x054f1ca7),LL(0x4e8e7429,0xc939e110), LL(0x5a914f2f,0x9b1ac2b3),LL(0xe74b8f9c,0x39e35ed3),LL(0x781b2fb0,0xd0debdb2),LL(0x2d997ba2,0x1585638f),
+ LL(0x9e2fce99,0x9c4b646e),LL(0x1e80857f,0x68a21081),LL(0x3643b52a,0x06d54e44),LL(0x0d8eb843,0xde8d6d63), LL(0x42146a0a,0x70321563),LL(0x5eaa3622,0x8ba826f2),LL(0x86138787,0x227a58bd),LL(0x10281d37,0x43b6c03c),
+ LL(0xb54dde39,0x6326afbb),LL(0xdb6f2d5f,0x744e5e8a),LL(0xcff158e1,0x48b2a99a),LL(0xef87918f,0xa93c8fa0), LL(0xde058c5c,0x2182f956),LL(0x936f9e7a,0x216235d2),LL(0xd2e31e67,0xace0c0db),LL(0xf23ac3e7,0xc96449bf),
+ LL(0x170693bd,0x7e9a2874),LL(0xa45e6335,0xa28e14fd),LL(0x56427344,0x5757f6b3),LL(0xacf8edf9,0x822e4556), LL(0xe6a285cd,0x2b7a6ee2),LL(0xa9df3af0,0x5866f211),LL(0xf845b844,0x40dde2dd),LL(0x110e5e49,0x986c3726),
+ LL(0xf7172277,0x73680c2a),LL(0x0cccb244,0x57b94f0f),LL(0x2d438ca7,0xbdff7267),LL(0xcf4663fd,0xbad1ce11), LL(0xd8f71cae,0x9813ed9d),LL(0x961fdaa6,0xf43272a6),LL(0xbd6d1637,0xbeff0119),LL(0x30361978,0xfebc4f91),
+ LL(0x2f41deff,0x02b37a95),LL(0xe63b89b7,0x0e44a59a),LL(0x143ff951,0x673257dc),LL(0xd752baf4,0x19c02205), LL(0xc4b7d692,0x46c23069),LL(0xfd1502ac,0x2e6392c3),LL(0x1b220846,0x6057b1a2),LL(0x0c1b5b63,0xe51ff946),
+},
+/* digit=35 base_pwr=2^245 */
+{
+ LL(0x566c5c43,0x6e85cb51),LL(0x3597f046,0xcff9c919),LL(0x4994d94a,0x9354e90c),LL(0x2147927d,0xe0a39332), LL(0x0dc1eb2b,0x8427fac1),LL(0x2ff319fa,0x88cfd8c2),LL(0x01965274,0xe2d4e684),LL(0x67aaa746,0xfa2e067d),
+ LL(0x3e5f9f11,0xb6d92a7f),LL(0xd6cb3b8e,0x9afe153a),LL(0xddf800bd,0x4d1a6dd7),LL(0xcaf17e19,0xf6c13cc0), LL(0x325fc3ee,0x15f6c58e),LL(0xa31dc3b2,0x71095400),LL(0xafa3d3e7,0x168e7c07),LL(0x94c7ae2d,0x3f8417a1),
+ LL(0x813b230d,0xec234772),LL(0x17344427,0x634d0f5f),LL(0xd77fc56a,0x11548ab1),LL(0xce06af77,0x7fab1750), LL(0x4f7c4f83,0xb62c10a7),LL(0x220a67d9,0xa7d2edc4),LL(0x921209a0,0x1c404170),LL(0xface59f0,0x0b9815a0),
+ LL(0x319540c3,0x2842589b),LL(0xa283d6f8,0x18490f59),LL(0xdaae9fcb,0xa2731f84),LL(0xc3683ba0,0x3db6d960), LL(0x14611069,0xc85c63bb),LL(0x0788bf05,0xb19436af),LL(0x347460d2,0x905459df),LL(0xe11a7db1,0x73f6e094),
+ LL(0xb6357f37,0xdc7f938e),LL(0x2bd8aa62,0xc5d00f79),LL(0x2ca979fc,0xc878dcb9),LL(0xeb023a99,0x37e83ed9), LL(0x1560bf3d,0x6b23e273),LL(0x1d0fae61,0x1086e459),LL(0x9a9414bd,0x78248316),LL(0xf0ea9ea1,0x1b956bc0),
+ LL(0xc31b9c38,0x7b85bb91),LL(0x48ef57b5,0x0c5aa90b),LL(0xaf3bab6f,0xdedeb169),LL(0x2d373685,0xe610ad73), LL(0x02ba8e15,0xf13870df),LL(0x8ca7f771,0x0337edb6),LL(0xb62c036c,0xe4acf747),LL(0xb6b94e81,0xd921d576),
+ LL(0x2c422f7a,0xdbc86439),LL(0xed348898,0xfb635362),LL(0xc45bfcd1,0x83084668),LL(0x2b315e11,0xc357c9e3), LL(0x5b2e5b8c,0xb173b540),LL(0xe102b9a4,0x7e946931),LL(0x7b0fb199,0x17c890eb),LL(0xd61b662b,0xec225a83),
+ LL(0xee3c76cb,0xf306a3c8),LL(0xd32a1f6e,0x3cf11623),LL(0x6863e956,0xe6d5ab64),LL(0x5c005c26,0x3b8a4cbe), LL(0x9ce6bb27,0xdcd529a5),LL(0x04d4b16f,0xc4afaa52),LL(0x7923798d,0xb0624a26),LL(0x6b307fab,0x85e56df6),
+ LL(0x2bf29698,0x0281893c),LL(0xd7ce7603,0x91fc19a4),LL(0xad9a558f,0x75a5dca3),LL(0x4d50bf77,0x40ceb3fa), LL(0xbc9ba369,0x1baf6060),LL(0x597888c2,0x927e1037),LL(0x86a34c07,0xd936bf19),LL(0xc34ae980,0xd4cf10c1),
+ LL(0x859dd614,0x3a3e5334),LL(0x18d0c8ee,0x9c475b5b),LL(0x07cd51d5,0x63080d1f),LL(0xb88b4326,0xc9c0d0a6), LL(0xc234296f,0x1ac98691),LL(0x94887fb6,0x2a0a83a4),LL(0x0cea9cf2,0x56511427),LL(0xa24802f5,0x5230a6e8),
+ LL(0x72e3d5c1,0xf7a2bf0f),LL(0x4f21439e,0x37717446),LL(0x9ce30334,0xfedcbf25),LL(0x7ce202f9,0xe0030a78), LL(0x1202e9ca,0x6f2d9ebf),LL(0x75e6e591,0xe79dde6c),LL(0xf1dac4f8,0xf52072af),LL(0xbb9b404d,0x6c8d087e),
+ LL(0xbce913af,0xad0fc73d),LL(0x458a07cb,0x909e587b),LL(0xd4f00c8a,0x1300da84),LL(0xb54466ac,0x425cd048), LL(0x90e9d8bf,0xb59cb9be),LL(0x3e431b0e,0x991616db),LL(0x531aecff,0xd3aa117a),LL(0x59f4dc3b,0x91af92d3),
+ LL(0xe93fda29,0x9b1ec292),LL(0xe97d91bc,0x76bb6c17),LL(0xaface1e6,0x7509d95f),LL(0xbe855ae3,0x3653fe47), LL(0x0f680e75,0x73180b28),LL(0xeeb6c26c,0x75eefd1b),LL(0xb66d4236,0xa4cdf29f),LL(0x6b5821d8,0x2d70a997),
+ LL(0x20445c36,0x7a3ee207),LL(0x59877174,0x71d1ac82),LL(0x949f73e9,0x0fc539f7),LL(0x982e3081,0xd05cf3d7), LL(0x7b1c7129,0x8758e20b),LL(0x569e61f2,0xffadcc20),LL(0x59544c2d,0xb05d3a2f),LL(0x9fff5e53,0xbe16f5c1),
+ LL(0xaad58135,0x73cf65b8),LL(0x037aa5be,0x622c2119),LL(0x646fd6a0,0x79373b3f),LL(0x0d3978cf,0x0e029db5), LL(0x94fba037,0x8bdfc437),LL(0x620797a6,0xaefbd687),LL(0xbd30d38e,0x3fa5382b),LL(0x585d7464,0x7627cfbf),
+ LL(0x4e4ca463,0xb2330fef),LL(0x3566cc63,0xbcef7287),LL(0xcf780900,0xd161d2ca),LL(0x5b54827d,0x135dc539), LL(0x27bf1bc6,0x638f052e),LL(0x07dfa06c,0x10a224f0),LL(0x6d3321da,0xe973586d),LL(0x26152c8f,0x8b0c5738),
+ LL(0x34606074,0x07ef4f2a),LL(0xa0f7047a,0x80fe7fe8),LL(0xe1a0e306,0x3d1a8152),LL(0x88da5222,0x32cf43d8), LL(0x5f02ffe6,0xbf89a95f),LL(0x806ad3ea,0x3d9eb9a4),LL(0x79c8e55e,0x012c17bb),LL(0x99c81dac,0xfdcd1a74),
+ LL(0xb9556098,0x7043178b),LL(0x801c3886,0x4090a1df),LL(0x9b67b912,0x759800ff),LL(0x232620c8,0x3e5c0304), LL(0x70dceeca,0x4b9d3c4b),LL(0x181f648e,0xbb2d3c15),LL(0x6e33345c,0xf981d837),LL(0x0cf2297a,0xb626289b),
+ LL(0x8baebdcf,0x766ac659),LL(0x75df01e5,0x1a28ae09),LL(0x375876d8,0xb71283da),LL(0x607b9800,0x4865a96d), LL(0x237936b2,0x25dd1bcd),LL(0x60417494,0x332f4f4b),LL(0x370a2147,0xd0923d68),LL(0xdc842203,0x497f5dfb),
+ LL(0x32be5e0f,0x9dc74cbd),LL(0x17a01375,0x7475bcb7),LL(0x50d872b1,0x438477c9),LL(0xffe1d63d,0xcec67879), LL(0xd8578c70,0x9b006014),LL(0x78bb6b8b,0xc9ad99a8),LL(0x11fb3806,0x6799008e),LL(0xcd44cab3,0xcfe81435),
+ LL(0x2f4fb344,0xa2ee1582),LL(0x483fa6eb,0xb8823450),LL(0x652c7749,0x622d323d),LL(0xbeb0a15b,0xd8474a98), LL(0x5d1c00d0,0xe43c154d),LL(0x0e3e7aac,0x7fd581d9),LL(0x2525ddf8,0x2b44c619),LL(0xb8ae9739,0x67a033eb),
+ LL(0x9ef2d2e4,0x113ffec1),LL(0xd5a0ea7f,0x1bf6767e),LL(0x03714c0a,0x57fff75e),LL(0x0a23e9ee,0xa23c422e), LL(0x540f83af,0xdd5f6b2d),LL(0x55ea46a7,0xc2c2c27e),LL(0x672a1208,0xeb6b4246),LL(0xae634f7a,0xd13599f7),
+ LL(0xd7b32c6e,0xcf914b5c),LL(0xeaf61814,0x61a5a640),LL(0x208a1bbb,0x8dc3df8b),LL(0xb6d79aa5,0xef627fd6), LL(0xc4c86bc8,0x44232ffc),LL(0x061539fe,0xe6f9231b),LL(0x958b9533,0x1d04f25a),LL(0x49e8c885,0x180cf934),
+ LL(0x9884aaf7,0x89689595),LL(0x07b348a6,0xb1959be3),LL(0x3c147c87,0x96250e57),LL(0xdd0c61f8,0xae0efb3a), LL(0xca8c325e,0xed00745e),LL(0xecff3f70,0x3c911696),LL(0x319ad41d,0x73acbc65),LL(0xf0b1c7ef,0x7b01a020),
+ LL(0x63a1483f,0xea32b293),LL(0x7a248f96,0x89eabe71),LL(0x343157e5,0x9c6231d3),LL(0xdf3c546d,0x93a375e5), LL(0x6a2afe69,0xe76e9343),LL(0xe166c88e,0xc4f89100),LL(0x4f872093,0x248efd0d),LL(0x8fe0ea61,0xae0eb3ea),
+ LL(0x9d79046e,0xaf89790d),LL(0x6cee0976,0x4d650f2d),LL(0x43071eca,0xa3935d9a),LL(0x283b0bfe,0x66fcd2c9), LL(0x696605f1,0x0e665eb5),LL(0xa54cd38d,0xe77e5d07),LL(0x43d950cf,0x90ee050a),LL(0xd32e69b5,0x86ddebda),
+ LL(0xfddf7415,0x6ad94a3d),LL(0x3f6e8d5a,0xf7fa1309),LL(0xe9957f75,0xc4831d1d),LL(0xd5817447,0x7de28501), LL(0x9e2aeb6b,0x6f1d7078),LL(0xf67a53c2,0xba2b9ff4),LL(0xdf9defc3,0x36963767),LL(0x0d38022c,0x479deed3),
+ LL(0x3a8631e8,0xd2edb89b),LL(0x7a213746,0x8de855de),LL(0xb00c5f11,0xb2056cb7),LL(0x2c9b85e4,0xdeaefbd0), LL(0xd150892d,0x03f39a8d),LL(0x218b7985,0x37b84686),LL(0xb7375f1a,0x36296dd8),LL(0xb78e898e,0x472cd4b1),
+ LL(0xe9f05de9,0x15dff651),LL(0x2ce98ba9,0xd4045069),LL(0x9b38024c,0x8466a7ae),LL(0xe5a6b5ef,0xb910e700), LL(0xb3aa8f0d,0xae1c56ea),LL(0x7eee74a6,0xbab2a507),LL(0x4b4c4620,0x0dca11e2),LL(0x4c47d1f4,0xfd896e2e),
+ LL(0x308fbd93,0xeb45ae53),LL(0x02c36fda,0x46cd5a2e),LL(0xbaa48385,0x6a3d4e90),LL(0x9dbe9960,0xdd55e62e), LL(0x2a81ede7,0xa1406aa0),LL(0xf9274ea7,0x6860dd14),LL(0x80414f86,0xcfdcb0c2),LL(0x22f94327,0xff410b10),
+ LL(0x49ad467b,0x5a33cc38),LL(0x0a7335f1,0xefb48b6c),LL(0xb153a360,0x14fb54a4),LL(0xb52469cc,0x604aa9d2), LL(0x754e48e9,0x5e9dc486),LL(0x37471e8e,0x693cb455),LL(0x8d3b37b6,0xfb2fd7cd),LL(0xcf09ff07,0x63345e16),
+ LL(0x23a5d896,0x9910ba6b),LL(0x7fe4364e,0x1fe19e35),LL(0x9a33c677,0x6e1da8c3),LL(0x29fd9fd0,0x15b4488b), LL(0x1a1f22bf,0x1f439254),LL(0xab8163e8,0x920a8a70),LL(0x07e5658e,0x3fd1b249),LL(0xb6ec839b,0xf2c4f79c),
+ LL(0x4aa38d1b,0x1abbc3d0),LL(0xb5d9510e,0x3b0db35c),LL(0x3e60dec0,0x1754ac78),LL(0xea099b33,0x53272fd7), LL(0x07a8e107,0x5fb0494f),LL(0x6a8191fa,0x4a89e137),LL(0x3c4ad544,0xa113b7f6),LL(0x6cb9897b,0x88a2e909),
+ LL(0xb44a3f84,0x17d55de3),LL(0x17c6c690,0xacb2f344),LL(0x10232390,0x32088168),LL(0x6c733bf7,0xf2e8a61f), LL(0x9c2d7652,0xa774aab6),LL(0xed95c5bc,0xfb5307e3),LL(0x4981f110,0xa05c73c2),LL(0xa39458c9,0x1baae31c),
+ LL(0xcbea62e7,0x1def185b),LL(0xeaf63059,0xe8ac9eae),LL(0x9921851c,0x098a8cfd),LL(0x3abe2f5b,0xd959c3f1), LL(0x20e40ae5,0xa4f19525),LL(0x07a24aa1,0x320789e3),LL(0x7392b2bc,0x259e6927),LL(0x1918668b,0x58f6c667),
+ LL(0xc55d2d8b,0xce1db2bb),LL(0xf4f6ca56,0x41d58bb7),LL(0x8f877614,0x7650b680),LL(0xf4c349ed,0x905e16ba), LL(0xf661acac,0xed415140),LL(0xcb2270af,0x3b8784f0),LL(0x8a402cba,0x3bc280ac),LL(0x0937921a,0xd53f7146),
+ LL(0xe5681e83,0xc03c8ee5),LL(0xf6ac9e4a,0x62126105),LL(0x936b1a38,0x9503a53f),LL(0x782fecbd,0x3d45e2d4), LL(0x76e8ae98,0x69a5c439),LL(0xbfb4b00e,0xb53b2eeb),LL(0x72386c89,0xf1674712),LL(0x4268bce4,0x30ca34a2),
+ LL(0x78341730,0x7f1ed86c),LL(0xb525e248,0x8ef5beb8),LL(0xb74fbf38,0xbbc489fd),LL(0x91a0b382,0x38a92a0e), LL(0x22433ccf,0x7a77ba3f),LL(0xa29f05a9,0xde8362d6),LL(0x61189afc,0x7f6a30ea),LL(0x59ef114f,0x693b5505),
+ LL(0xcd1797a1,0x50266bc0),LL(0xf4b7af2d,0xea17b47e),LL(0x3df9483e,0xd6c4025c),LL(0xa37b18c9,0x8cbb9d9f), LL(0x4d8424cf,0x91cbfd9c),LL(0xab1c3506,0xdb7048f1),LL(0x028206a3,0x9eaf641f),LL(0x25bdf6ce,0xf986f3f9),
+ LL(0x224c08dc,0x262143b5),LL(0x81b50c91,0x2bbb09b4),LL(0xaca8c84f,0xc16ed709),LL(0xb2850ca8,0xa6210d9d), LL(0x09cb54d6,0x6d8df67a),LL(0x500919a4,0x91eef6e0),LL(0x0f132857,0x90f61381),LL(0xf8d5028b,0x9acede47),
+ LL(0x90b771c3,0x844d1b71),LL(0xba6426be,0x563b71e4),LL(0xbdb802ff,0x2efa2e83),LL(0xab5b4a41,0x3410cbab), LL(0x30da84dd,0x555b2d26),LL(0xee1cc29a,0xd0711ae9),LL(0x2f547792,0xcf3e8c60),LL(0xdc678b35,0x03d7d5de),
+ LL(0xced806b8,0x071a2fa8),LL(0x697f1478,0x222e6134),LL(0xabfcdbbf,0xdc16fd5d),LL(0x121b53b8,0x44912ebf), LL(0x2496c27c,0xac943674),LL(0x1ffc26b0,0x8ea3176c),LL(0x13debf2c,0xb6e224ac),LL(0xf372a832,0x524cc235),
+ LL(0x9f6f1b18,0xd706e1d8),LL(0x44cce35b,0x2552f005),LL(0xa88e31fc,0x8c8326c2),LL(0xf9552047,0xb5468b2c), LL(0x3ff90f2b,0xce683e88),LL(0x2f0a5423,0x77947bdf),LL(0xed56e328,0xd0a1b28b),LL(0xc20134ac,0xaee35253),
+ LL(0x3567962f,0x7e98367d),LL(0x8188bffb,0x379ed61f),LL(0xfaf130a1,0x73bba348),LL(0x904ed734,0x6c1f75e1), LL(0x3b4a79fc,0x18956642),LL(0x54ef4493,0xf20bc83d),LL(0x9111eca1,0x836d425d),LL(0x009a8dcf,0xe5b5c318),
+ LL(0x13221bc5,0x3360b25d),LL(0x6b3eeaf7,0x707baad2),LL(0x743a95a1,0xd7279ed8),LL(0x969e809f,0x7450a875), LL(0xe5d0338f,0x32b6bd53),LL(0x2b883bbc,0x1e77f7af),LL(0x1063ecd0,0x90da12cc),LL(0xc315be47,0xe2697b58),
+ LL(0xda85d534,0x2771a5bd),LL(0xff980eea,0x53e78c1f),LL(0x900385e7,0xadf1cf84),LL(0xc9387b62,0x7d3b14f6), LL(0xcb8f2bd2,0x170e74b0),LL(0x827fa993,0x2d50b486),LL(0xf6f32bab,0xcdbe8c9a),LL(0xc3b93ab8,0x55e906b0),
+ LL(0x8fe280d1,0x747f22fc),LL(0xb2e114ab,0xcd8e0de5),LL(0xe10b68b0,0x5ab7dbeb),LL(0xa480d4b2,0x9dc63a9c), LL(0x4be1495f,0x78d4bc3b),LL(0x9359122d,0x25eb3db8),LL(0x0809cbdc,0x3f8ac05b),LL(0xd37c702f,0xbf4187bb),
+ LL(0x1416a6a5,0x84cea069),LL(0x43ef881c,0x8f860c79),LL(0x38038a5d,0x41311f8a),LL(0xfc612067,0xe78c2ec0), LL(0x5ad73581,0x494d2e81),LL(0x59604097,0xb4cc9e00),LL(0xf3612cba,0xff558aec),LL(0x9e36c39e,0x35beef7a),
+ LL(0xdbcf41b9,0x1845c7cf),LL(0xaea997c0,0x5703662a),LL(0xe402f6d8,0x8b925afe),LL(0x4dd72162,0xd0a1b1ae), LL(0x03c41c4b,0x9f47b375),LL(0x0391d042,0xa023829b),LL(0x503b8b0a,0x5f5045c3),LL(0x98c010e5,0x123c2688),
+ LL(0x36ba06ee,0x324ec0cc),LL(0x3dd2cc0c,0xface3115),LL(0xf333e91f,0xb364f3be),LL(0x28e832b0,0xef8aff73), LL(0x2d05841b,0x1e9bad04),LL(0x356a21e2,0x42f0e3df),LL(0x4add627e,0xa3270bcb),LL(0xd322e711,0xb09a8158),
+ LL(0x0fee104a,0x86e326a1),LL(0x3703f65d,0xad7788f8),LL(0x47bc4833,0x7e765430),LL(0x2b9b893a,0x6cee582b), LL(0xe8f55a7b,0x9cd2a167),LL(0xd9e4190d,0xefbee3c6),LL(0xd40c2e9d,0x33ee7185),LL(0xa380b548,0x844cc9c5),
+ LL(0x66926e04,0x323f8ecd),LL(0x8110c1ba,0x0001e38f),LL(0xfc6a7f07,0x8dbcac12),LL(0x0cec0827,0xd65e1d58), LL(0xbe76ca2d,0xd2cd4141),LL(0xe892f33a,0x7895cf5c),LL(0x367139d2,0x956d230d),LL(0xd012c4c1,0xa91abd3e),
+ LL(0x87eb36bf,0x34fa4883),LL(0x914b8fb4,0xc5f07102),LL(0xadb9c95f,0x90f0e579),LL(0x28888195,0xfe6ea8cb), LL(0xedfa9284,0x7b9b5065),LL(0x2b8c8d65,0x6c510bd2),LL(0xcbe8aafd,0xd7b8ebef),LL(0x96b1da07,0xedb3af98),
+ LL(0x6295d426,0x28ff779d),LL(0x3fa3ad7b,0x0c4f6ac7),LL(0x8b8e2604,0xec44d054),LL(0x8b0050e1,0x9b32a66d), LL(0xf0476ce2,0x1f943366),LL(0xa602c7b4,0x7554d953),LL(0x524f2809,0xbe35aca6),LL(0xfd4edbea,0xb6881229),
+ LL(0x508efb63,0xe8cd0c8f),LL(0x6abcefc7,0x9eb5b5c8),LL(0xb441ab4f,0xf5621f5f),LL(0xb76a2b22,0x79e6c046), LL(0xe37a1f69,0x74a4792c),LL(0x03542b60,0xcbd252cb),LL(0xb3c20bd3,0x785f65d5),LL(0x4fabc60c,0x8dea6143),
+ LL(0xde673629,0x45e21446),LL(0x703c2d21,0x57f7aa1e),LL(0x98c868c7,0xa0e99b7f),LL(0x8b641676,0x4e42f66d), LL(0x91077896,0x602884dc),LL(0xc2c9885b,0xa0d690cf),LL(0x3b9a5187,0xfeb4da33),LL(0x153c87ee,0x5f789598),
+ LL(0x52b16dba,0x2192dd47),LL(0x3524c1b1,0xdeefc0e6),LL(0xe4383693,0x465ea76e),LL(0x361b8d98,0x79401711), LL(0xf21a15cb,0xa5f9ace9),LL(0xefee9aeb,0x73d26163),LL(0xe677016c,0xcca844b3),LL(0x57eaee06,0x6c122b07),
+ LL(0x15f09690,0xb782dce7),LL(0x2dfc0fc9,0x508b9b12),LL(0x65d89fc6,0x9015ab4b),LL(0xd6d5bb0f,0x5e79dab7), LL(0x6c775aa2,0x64f021f0),LL(0x37c7eca1,0xdf09d8cc),LL(0xef2fa506,0x9a761367),LL(0x5b81eec6,0xed4ca476),
+ LL(0x10bbb8b5,0x262ede36),LL(0x0641ada3,0x0737ce83),LL(0xe9831ccc,0x4c94288a),LL(0x8065e635,0x487fc1ce), LL(0xb8bb3659,0xb13d7ab3),LL(0x855e4120,0xdea5df3e),LL(0x85eb0244,0xb9a18573),LL(0xa7cfe0a3,0x1a1b8ea3),
+ LL(0x67b0867c,0x3b837119),LL(0x9d364520,0x8d5e0d08),LL(0xd930f0e3,0x52dccc1e),LL(0xbf20bbaf,0xefbbcec7), LL(0x0263ad10,0x99cffcab),LL(0xfcd18f8a,0xd8199e6d),LL(0xe9f10617,0x64e2773f),LL(0x08704848,0x0079e8e1),
+ LL(0x8a342283,0x1169989f),LL(0xa83012e6,0x8097799c),LL(0x8a6a9001,0xece966cb),LL(0x072ac7fc,0x93b3afef), LL(0x2db3d5ba,0xe6893a2a),LL(0x89bf4fdc,0x263dc462),LL(0xe0396673,0x8852dfc9),LL(0x3af362b6,0x7ac70895),
+ LL(0x5c2f342b,0xbb9cce4d),LL(0xb52d7aae,0xbf80907a),LL(0x2161bcd0,0x97f3d3cd),LL(0x0962744d,0xb25b0834), LL(0x6c3a1dda,0xc5b18ea5),LL(0x06c92317,0xfe4ec7eb),LL(0xad1c4afe,0xb787b890),LL(0x0ede801a,0xdccd9a92),
+ LL(0xdb58da1f,0x9ac6ddda),LL(0xb8cae6ee,0x22bbc12f),LL(0x815c4a43,0xc6f8bced),LL(0xf96480c7,0x8105a92c), LL(0x7a859d51,0x0dc3dbf3),LL(0x3041196b,0xe3ec7ce6),LL(0x0d1067c9,0xd9f64b25),LL(0x3d1f8dd8,0xf2321321),
+ LL(0x76497ee8,0x8b5c619c),LL(0xc717370e,0x5d2b0ac6),LL(0x4fcf68e1,0x98204cb6),LL(0x62bc6792,0x0bdec211), LL(0xa63b1011,0x6973ccef),LL(0xe0de1ac5,0xf9e3fa97),LL(0x3d0e0c8b,0x5efb693e),LL(0xd2d4fcb4,0x037248e9),
+},
+/* digit=36 base_pwr=2^252 */
+{
+ LL(0x1ec34f9e,0x80802dc9),LL(0x33810603,0xd8772d35),LL(0x530cb4f3,0x3f06d66c),LL(0xc475c129,0x7be5ed0d), LL(0x31e82b10,0xcb9e3c19),LL(0xc9ff6b4c,0xc63d2857),LL(0x92a1b45e,0xb92118c6),LL(0x7285bbca,0x0aec4414),
+ LL(0x1e29a3ef,0xfc189ae7),LL(0x4c93302e,0xcbe906f0),LL(0xceaae10e,0xd0107914),LL(0xb68e19f8,0xb7a23f34), LL(0xefd2119d,0xe9d875c2),LL(0xfcadc9c8,0x03198c6e),LL(0x4da17113,0x65591bf6),LL(0x3d443038,0x3cf0bbf8),
+ LL(0x2b724759,0xae485bb7),LL(0xb2d4c63a,0x945353e1),LL(0xde7d6f2c,0x82159d07),LL(0x4ec5b109,0x389caef3), LL(0xdb65ef14,0x4a8ebb53),LL(0xdd99de43,0x2dc2cb7e),LL(0x83f2405f,0x816fa3ed),LL(0xc14208a3,0x73429bb9),
+ LL(0xb01e6e27,0xb618d590),LL(0xe180b2dc,0x047e2ccd),LL(0x04aea4a9,0xd1b299b5),LL(0x9fa403a4,0x412c9e1e), LL(0x79407552,0x88d28a36),LL(0xf332b8e3,0x49c50136),LL(0xe668de19,0x3a1b6fcc),LL(0x75122b97,0x178851bc),
+ LL(0xfb85fa4c,0xb1e13752),LL(0x383c8ce9,0xd61257ce),LL(0xd2f74dae,0xd43da670),LL(0xbf846bbb,0xa35aa23f), LL(0x4421fc83,0x5e74235d),LL(0xc363473b,0xf6df8ee0),LL(0x3c4aa158,0x34d7f52a),LL(0x9bc6d22e,0x50d05aab),
+ LL(0xa64785f4,0x8c56e735),LL(0x5f29cd07,0xbc56637b),LL(0x3ee35067,0x53b2bb80),LL(0xdc919270,0x50235a0f), LL(0xf2c4aa65,0x191ab6d8),LL(0x8396023b,0xc3475831),LL(0xf0f805ba,0x80400ba5),LL(0x5ec0f80f,0x8881065b),
+ LL(0xcc1b5e83,0xc370e522),LL(0x860b8bfb,0xde2d4ad1),LL(0x67b256df,0xad364df0),LL(0xe0138997,0x8f12502e), LL(0x7783920a,0x503fa0dc),LL(0xc0bc866a,0xe80014ad),LL(0xd3064ba6,0x3f89b744),LL(0xcba5dba5,0x03511dcd),
+ LL(0x95a7b1a2,0x197dd46d),LL(0x3c6341fb,0x9c4e7ad6),LL(0x484c2ece,0x426eca29),LL(0xde7f4f8a,0x9211e489), LL(0xc78ef1f4,0x14997f6e),LL(0x06574586,0x2b2c0910),LL(0x1c3eede8,0x17286a6e),LL(0x0f60e018,0x25f92e47),
+ LL(0x31890a36,0x805c5646),LL(0x57feea5b,0x703ef600),LL(0xaf3c3030,0x389f747c),LL(0x54dd3739,0xe0e5daeb), LL(0xc9c9f155,0xfe24a4c3),LL(0xb5393962,0x7e4bf176),LL(0xaf20bf29,0x37183de2),LL(0xf95a8c3b,0x4a1bd7b5),
+ LL(0x46191d3d,0xa83b9699),LL(0x7b87f257,0x281fc8dd),LL(0x54107588,0xb18e2c13),LL(0x9b2bafe8,0x6372def7), LL(0x0d8972ca,0xdaf4bb48),LL(0x56167a3f,0x3f2dd4b7),LL(0x84310cf4,0x1eace32d),LL(0xe42700aa,0xe3bcefaf),
+ LL(0xd785e73d,0x5fe5691e),LL(0x2ea60467,0xa5db5ab6),LL(0xdfc6514a,0x02e23d41),LL(0xe03c3665,0x35e8048e), LL(0x1adaa0f8,0x3f8b118f),LL(0x84ce1a5a,0x28ec3b45),LL(0x2c6646b8,0xe8cacc6e),LL(0xdbd0e40f,0x1343d185),
+ LL(0xcaaa358c,0xe5d7f844),LL(0x9924182a,0x1a1db7e4),LL(0x9c875d9a,0xd64cd42d),LL(0x042eeec8,0xb37b515f), LL(0x7b165fbe,0x4d4dd409),LL(0xe206eff3,0xfc322ed9),LL(0x59b7e17e,0x7dee4102),LL(0x8236ca00,0x55a481c0),
+ LL(0xc23fc975,0x8c885312),LL(0x05d6297b,0x15715806),LL(0xf78edd39,0xa078868e),LL(0x03c45e52,0x956b31e0), LL(0xff7b33a6,0x470275d5),LL(0x0c7e673f,0xc8d5dc3a),LL(0x7e2f2598,0x419227b4),LL(0x4c14a975,0x8b37b634),
+ LL(0x8b11888c,0xd0667ed6),LL(0x803e25dc,0x5e0e8c3e),LL(0xb987a24a,0x34e5d0dc),LL(0xae920323,0x9f40ac3b), LL(0x34e0f63a,0x5463de95),LL(0x6b6328f9,0xa128bf92),LL(0xda64f1b7,0x491ccd7c),LL(0xc47bde35,0x7ef1ec27),
+ LL(0xa36a2737,0xa857240f),LL(0x63621bc1,0x35dc1366),LL(0xd4fb6897,0x7a3a6453),LL(0xc929319d,0x80f1a439), LL(0xf8cb0ba0,0xfc18274b),LL(0x8078c5eb,0xb0b53766),LL(0x1e01d0ef,0xfb0d4924),LL(0x372ab09c,0x50d7c67d),
+ LL(0x3aeac968,0xb4e370af),LL(0xc4b63266,0xe4f7fee9),LL(0xe3ac5664,0xb4acd4c2),LL(0xceb38cbf,0xf8910bd2), LL(0xc9c0726e,0x1c3ae50c),LL(0xd97b40bf,0x15309569),LL(0xfd5a5a1b,0x70884b7f),LL(0xef8314cd,0x3890896a),
+ LL(0xa5618c93,0x58e1515c),LL(0x77d942d1,0xe665432b),LL(0xb6f767a8,0xb32181bf),LL(0x3a604110,0x753794e8), LL(0xe8c0dbcc,0x09afeb7c),LL(0x598673a3,0x31e02613),LL(0x7d46db00,0x5d98e557),LL(0x9d985b28,0xfc21fb8c),
+ LL(0xb0843e0b,0xc9040116),LL(0x69b04531,0x53b1b3a8),LL(0x85d7d830,0xdd1649f0),LL(0xcb7427e8,0xbb3bcc87), LL(0xc93dce83,0x77261100),LL(0xa1922a2a,0x7e79da61),LL(0xf3149ce8,0x587a2b02),LL(0xde92ec83,0x147e1384),
+ LL(0xaf077f30,0x484c83d3),LL(0x0658b53a,0xea78f844),LL(0x027aec53,0x912076c2),LL(0x93c8177d,0xf34714e3), LL(0xc2376c84,0x37ef5d15),LL(0x3d1aa783,0x8315b659),LL(0xef852a90,0x3a75c484),LL(0x16086bd4,0x0ba0c58a),
+ LL(0x529a6d48,0x29688d7a),LL(0xc2f19203,0x9c7f250d),LL(0x682e2df9,0x123042fb),LL(0xad8121bc,0x2b7587e7), LL(0xe0182a65,0x30fc0233),LL(0xe3e1128a,0xb82ecf87),LL(0x93fb098f,0x71682861),LL(0x85e9e6a7,0x043e21ae),
+ LL(0x66c834ea,0xab5b49d6),LL(0x47414287,0x3be43e18),LL(0x219a2a47,0xf40fb859),LL(0xcc58df3c,0x0e6559e9), LL(0x0c6615b4,0xfe1dfe8e),LL(0x56459d70,0x14abc8fd),LL(0x05de0386,0x7be0fa8e),LL(0xe9035c7c,0x8e63ef68),
+ LL(0x53b31e91,0x116401b4),LL(0x4436b4d8,0x0cba7ad4),LL(0x107afd66,0x9151f9a0),LL(0x1f0ee4c4,0xafaca8d0), LL(0x9ee9761c,0x75fe5c1d),LL(0xf0c0588f,0x3497a16b),LL(0x0304804c,0x3ee2bebd),LL(0xc2c990b9,0xa8fb9a60),
+ LL(0x39251114,0xd14d32fe),LL(0xcac73366,0x36bf25bc),LL(0xdba7495c,0xc9562c66),LL(0x46ad348b,0x324d301b), LL(0xd670407e,0x9f46620c),LL(0xe3733a01,0x0ea8d4f1),LL(0xb0c324e0,0xd396d532),LL(0x03c317cd,0x5b211a0e),
+ LL(0x5ffe7b37,0x090d7d20),LL(0x1747d2da,0x3b7f3efb),LL(0xb54fc519,0xa2cb525f),LL(0xf66a971e,0x6e220932), LL(0xb486d440,0xddc160df),LL(0x3fe13465,0x7fcfec46),LL(0x76e4c151,0x83da7e4e),LL(0xd8d302b5,0xd6fa48a1),
+ LL(0x5872cd88,0xc6304f26),LL(0x278b90a1,0x806c1d3c),LL(0xcaf0bc1c,0x3553e725),LL(0xbb9d8d5c,0xff59e603), LL(0x7a0b85dd,0xa4550f32),LL(0x93ecc217,0xdec5720a),LL(0x69d62213,0x0b88b741),LL(0x5b365955,0x7212f245),
+ LL(0xb5cae787,0x20764111),LL(0x1dfd3124,0x13cb7f58),LL(0x1175aefb,0x2dca77da),LL(0xffaae775,0xeb75466b), LL(0xdb6cff32,0x74d76f3b),LL(0x61fcda9a,0x7440f37a),LL(0xb525028b,0x1bb3ac92),LL(0xa1975f29,0x20fbf8f7),
+ LL(0xdf83097f,0x982692e1),LL(0x554b0800,0x28738f6c),LL(0xa2ce2f2f,0xdc703717),LL(0x40814194,0x7913b93c), LL(0x1fe89636,0x04924593),LL(0xf78834a6,0x7b98443f),LL(0x5114a5a1,0x11c6ab01),LL(0xffba5f4c,0x60deb383),
+ LL(0x01a982e6,0x4caa54c6),LL(0x3491cd26,0x1dd35e11),LL(0x7cbd6b05,0x973c315f),LL(0x52494724,0xcab00775), LL(0x6565e15a,0x04659b1f),LL(0x8c8fb026,0xbf30f529),LL(0xa8a0de37,0xfc21641b),LL(0xfa5e5114,0xe9c7a366),
+ LL(0x52f03ad8,0xdb849ca5),LL(0x024e35c0,0xc7e8dbe9),LL(0xcfc3c789,0xa1a2bbac),LL(0x9c26f262,0xbf733e7d), LL(0xb8444823,0x882ffbf5),LL(0x6bf8483b,0xb7224e88),LL(0x65bef640,0x53023b8b),LL(0xd4d5f8cd,0xaabfec91),
+ LL(0x079ea1bd,0xa40e1510),LL(0xd05d5d26,0x1ad9addc),LL(0x13e68d4f,0xdb3f2eab),LL(0x640f803f,0x1cff1ae2), LL(0xd4cee117,0xe0e7b749),LL(0x4036d909,0x8e9f275b),LL(0x8f4d4c38,0xce34e31d),LL(0xd75130fc,0x22b37f69),
+ LL(0xb4014604,0x83e0f1fd),LL(0x89415078,0xa8ce9919),LL(0x41792efe,0x82375b75),LL(0x97d4515b,0x4f59bf5c), LL(0x923a277d,0xac4f324f),LL(0x650f3406,0xd9bc9b7d),LL(0x8a39bc51,0xc6fa87d1),LL(0x5ccc108f,0x82588530),
+ LL(0x82e4c634,0x5ced3c9f),LL(0x3a4464f8,0x8efb8314),LL(0x7a1dca25,0xe706381b),LL(0x5a2a412b,0x6cd15a3c), LL(0xbfcd8fb5,0x9347a8fd),LL(0x6e54cd22,0x31db2eef),LL(0xf8d8932f,0xc4aeb11e),LL(0x344411af,0x11e7c1ed),
+ LL(0xdc9a151e,0x2653050c),LL(0x3bb0a859,0x9edbfc08),LL(0xfd5691e7,0x926c81c7),LL(0x6f39019a,0x9c1b2342), LL(0x7f8474b9,0x64a81c8b),LL(0x01761819,0x90657c07),LL(0x55e0375a,0x390b3331),LL(0xb6ebc47d,0xc676c626),
+ LL(0xb7d6dee8,0x51623247),LL(0x79659313,0x0948d927),LL(0xe9ab35ed,0x99700161),LL(0x8ddde408,0x06cc32b4), LL(0x061ef338,0x6f2fd664),LL(0xc202e9ed,0x1606fa02),LL(0x929ba99b,0x55388bc1),LL(0x1e81df69,0xc4428c5e),
+ LL(0xf91b0b2a,0xce2028ae),LL(0xf03dfd3f,0xce870a23),LL(0x0affe8ed,0x66ec2c87),LL(0x284d0c00,0xb205fb46), LL(0x44cefa48,0xbf5dffe7),LL(0xa19876d7,0xb6fc37a8),LL(0x08b72863,0xbecfa84c),LL(0x2576374f,0xd7205ff5),
+ LL(0x8887de41,0x80330d32),LL(0x869ea534,0x5de0df0c),LL(0x3c56ea17,0x13f42753),LL(0x452b1a78,0xeb1f6069), LL(0xe30ea15c,0x50474396),LL(0xc1494125,0x575816a1),LL(0xfe6bb38f,0xbe1ce55b),LL(0x96ae30f7,0xb901a948),
+ LL(0xd8fc3548,0xe5af0f08),LL(0xd73bfd08,0x5010b5d0),LL(0x53fe655a,0x993d2880),LL(0x1c1309fd,0x99f2630b), LL(0xb4e3b76f,0xd8677baf),LL(0xb840784b,0x14e51ddc),LL(0xbf0092ce,0x326c750c),LL(0xf528320f,0xc83d306b),
+ LL(0x77d4715c,0xc4456715),LL(0x6b703235,0xd30019f9),LL(0xd669e986,0x207ccb2e),LL(0xf6dbfc28,0x57c824af), LL(0xd8f92a23,0xf0eb532f),LL(0x9bb98fd2,0x4a557fd4),LL(0xc1e6199a,0xa57acea7),LL(0x8b94b1ed,0x0c663820),
+ LL(0xf83a9266,0x9b42be8f),LL(0x0101bd45,0xc7741c97),LL(0x07bd9ceb,0x95770c11),LL(0x8b2e0744,0x1f50250a), LL(0x1477b654,0xf762eec8),LL(0x15efe59a,0xc65b900e),LL(0x9546a897,0x88c96148),LL(0xc30b4d7c,0x7e8025b3),
+ LL(0x12045cf9,0xae4065ef),LL(0x9ccce8bd,0x6fcb2caf),LL(0xf2cf6525,0x1fa0ba4e),LL(0xcb72c312,0xf683125d), LL(0xe312410e,0xa01da4ea),LL(0x6cd8e830,0x67e28677),LL(0x98fb3f07,0xabd95752),LL(0xeef649a5,0x05f11e11),
+ LL(0x9d3472c2,0xba47faef),LL(0xc77d1345,0x3adff697),LL(0xdd15afee,0x4761fa04),LL(0xb9e69462,0x64f1f61a), LL(0x9bfb9093,0xfa691fab),LL(0xa1133dfe,0x3df8ae8f),LL(0x58cc710d,0xcd5f8967),LL(0x16c7fe79,0xfbb88d50),
+ LL(0xe88c50d1,0x8e011b4c),LL(0xa8771c4f,0x7532e807),LL(0xe2278ee4,0x64c78a48),LL(0x3845072a,0x0b283e83), LL(0x49e69274,0x98a6f291),LL(0x1868b21c,0xb96e9668),LL(0xb1a8908e,0x38f0adc2),LL(0x1feb829d,0x90afcff7),
+ LL(0x210b0856,0x9915a383),LL(0xdef04889,0xa5a80602),LL(0x7c64d509,0x800e9af9),LL(0xb8996f6f,0x81382d0b), LL(0x81927e27,0x490eba53),LL(0x4af50182,0x46c63b32),LL(0xd3ad62ce,0x784c5fd9),LL(0xf8ae8736,0xe4fa1870),
+ LL(0xd7466b25,0x4ec9d0bc),LL(0xdb235c65,0x84ddbe1a),LL(0x163c1688,0x5e2645ee),LL(0x00eba747,0x570bd00e), LL(0x128bfa0f,0xfa51b629),LL(0x6c1d3b68,0x92fce1bd),LL(0xb66778b1,0x3e7361dc),LL(0x5561d2bb,0x9c7d249d),
+ LL(0x0bbc6229,0xa40b28bf),LL(0xdfd91497,0x1c83c05e),LL(0xf083df05,0x5f9f5154),LL(0xeee66c9d,0xbac38b3c), LL(0xec0dfcfd,0xf71db7e3),LL(0x8b0a8416,0xf2ecda8e),LL(0x7812aa66,0x52fddd86),LL(0x4e6f4272,0x2896ef10),
+ LL(0x0fe9a745,0xff27186a),LL(0x49ca70db,0x08249fcd),LL(0x441cac49,0x7425a2e6),LL(0xece5ff57,0xf4a0885a), LL(0x7d7ead58,0x6e2cb731),LL(0x1898d104,0xf96cf7d6),LL(0x4f2c9a89,0xafe67c9d),LL(0x1c7bf5bc,0x89895a50),
+ LL(0x573cecfa,0xdc7cb8e5),LL(0xd15f03e6,0x66497eae),LL(0x3f084420,0x6bc0de69),LL(0xacd532b0,0x323b9b36), LL(0x0115a3c1,0xcfed390a),LL(0x2d65ca0e,0x9414c40b),LL(0x2f530c78,0x641406bd),LL(0x833438f2,0x29369a44),
+ LL(0x903fa271,0x996884f5),LL(0xb9da921e,0xe6da0fd2),LL(0x5db01e54,0xa6f2f269),LL(0x6876214e,0x1ee3e9bd), LL(0xe27a9497,0xa26e181c),LL(0x8e215e04,0x36d254e4),LL(0x252cabca,0x42f32a6c),LL(0x80b57614,0x99481487),
+ LL(0x40d9cae1,0x4c4dfe69),LL(0x11a10f09,0x05869580),LL(0x3491b64b,0xca287b57),LL(0x3fd4a53b,0x77862d5d), LL(0x50349126,0xbf94856e),LL(0x71c5268f,0x2be30bd1),LL(0xcbb650a6,0x10393f19),LL(0x778cf9fd,0x639531fe),
+ LL(0xb2935359,0x02556a11),LL(0xaf8c126e,0xda38aa96),LL(0x0960167f,0x47dbe6c2),LL(0x501901cd,0x37bbabb6), LL(0x2c947778,0xb6e979e0),LL(0x7a1a1dc6,0xd69a5175),LL(0x9d9faf0c,0xc3ed5095),LL(0x1d5fa5f0,0x4dd9c096),
+ LL(0x64f16ea8,0xa0c4304d),LL(0x7e718623,0x8b1cac16),LL(0x7c67f03e,0x0b576546),LL(0xcbd88c01,0x559cf5ad), LL(0x0e2af19a,0x074877bb),LL(0xa1228c92,0x1f717ec1),LL(0x326e8920,0x70bcb800),LL(0x4f312804,0xec6e2c5c),
+ LL(0x3fca4752,0x426aea7d),LL(0x2211f62a,0xf12c0949),LL(0x7be7b6b5,0x24beecd8),LL(0x36d7a27d,0xb77eaf4c), LL(0xfda78fd3,0x154c2781),LL(0x264eeabe,0x848a83b0),LL(0x4ffe2bc4,0x81287ef0),LL(0xb6b6fc2a,0x7b6d88c6),
+ LL(0xce417d99,0x805fb947),LL(0x8b916cc4,0x4b93dcc3),LL(0x21273323,0x72e65bb3),LL(0x6ea9886e,0xbcc1badd), LL(0x4bc5ee85,0x0e223011),LL(0xc18ee1e4,0xa561be74),LL(0xa6bcf1f1,0x762fd2d4),LL(0x95231489,0x50e6a5a4),
+ LL(0xa00b500b,0xca96001f),LL(0x5d7dcdf5,0x5c098cfc),LL(0x8c446a85,0xa64e2d2e),LL(0x971f3c62,0xbae9bcf1), LL(0x8435a2c5,0x4ec22683),LL(0x4bad4643,0x8ceaed6c),LL(0xccccf4e3,0xe9f8fb47),LL(0x1ce3b21e,0xbd4f3fa4),
+ LL(0xa3db3292,0xd79fb110),LL(0xb536c66a,0xe28a37da),LL(0x8e49e6a9,0x279ce87b),LL(0xfdcec8e3,0x70ccfe8d), LL(0x3ba464b2,0x2193e4e0),LL(0xaca9a398,0x0f39d60e),LL(0xf82c12ab,0x7d7932af),LL(0x91e7e0f7,0xd8ff50ed),
+ LL(0xfa28a7e0,0xea961058),LL(0x0bf5ec74,0xc726cf25),LL(0xdb229666,0xe74d55c8),LL(0xa57f5799,0x0bd9abbf), LL(0x4dfc47b3,0x7479ef07),LL(0x0c52f91d,0xd9c65fc3),LL(0x36a8bde2,0x8e0283fe),LL(0x7d4b7280,0xa32a8b5e),
+ LL(0x12e83233,0x6a677c61),LL(0xdcc9bf28,0x0fbb3512),LL(0x0d780f61,0x562e8ea5),LL(0x1dc4e89c,0x0db8b22b), LL(0x89be0144,0x0a6fd1fb),LL(0xca57113b,0x8c77d246),LL(0xff09c91c,0x4639075d),LL(0x5060824c,0x5b47b17f),
+ LL(0x16287b52,0x58aea2b0),LL(0xd0cd8eb0,0xa1343520),LL(0xc5d58573,0x6148b4d0),LL(0x291c68ae,0xdd2b6170), LL(0x1da3b3b7,0xa61b3929),LL(0x08c4ac10,0x5f946d79),LL(0x7217d583,0x4105d4a5),LL(0x25e6de5e,0x5061da3d),
+ LL(0xec1b4991,0x3113940d),LL(0x36f485ae,0xf12195e1),LL(0x731a2ee0,0xa7507fb2),LL(0x6e9e196e,0x95057a8e), LL(0x2e130136,0xa3c2c911),LL(0x33c60d15,0x97dfbb36),LL(0xb300ee2b,0xcaf3c581),LL(0xf4bac8b8,0x77f25d90),
+ LL(0x6d840cd6,0xdb1c4f98),LL(0xe634288c,0x471d62c0),LL(0xcec8a161,0x8ec2f85e),LL(0xfa6f4ae2,0x41f37cbc), LL(0x4b709985,0x6793a20f),LL(0xefa8985b,0x7a7bd33b),LL(0x938e6446,0x2c6a3fbd),LL(0x2a8d47c1,0x19042619),
+ LL(0xcc36975f,0x16848667),LL(0x9d5f1dfb,0x02acf168),LL(0x613baa94,0x62d41ad4),LL(0x9f684670,0xb56fbb92), LL(0xe9e40569,0xce610d0d),LL(0x35489fef,0x7b99c65f),LL(0x3df18b97,0x0c88ad1b),LL(0x5d0e9edb,0x81b7d9be),
+ LL(0xc716cc0a,0xd85218c0),LL(0x85691c49,0xf4b5ff90),LL(0xce356ac6,0xa4fd666b),LL(0x4b327a7a,0x17c72895), LL(0xda6be7de,0xf93d5085),LL(0x3301d34e,0xff71530e),LL(0xd8f448e8,0x4cd96442),LL(0x2ed18ffa,0x9283d331),
+ LL(0x2a849870,0x4d33dd99),LL(0x41576335,0xa716964b),LL(0x179be0e5,0xff5e3a9b),LL(0x83b13632,0x5b9d6b1b), LL(0xa52f313b,0x3b8bd7d4),LL(0x637a4660,0xc9dd95a0),LL(0x0b3e218f,0x30035962),LL(0xc7b28a3c,0xce1481a3),
+ LL(0x43228d83,0xab41b43a),LL(0x4ad63f99,0x24ae1c30),LL(0x46a51229,0x8e525f1a),LL(0xcd26d2b4,0x14af860f), LL(0x3f714aa1,0xd6baef61),LL(0xeb78795e,0xf51865ad),LL(0xe6a9d694,0xd3e21fce),LL(0x8a37b527,0x82ceb1dd),
+}
+};
+#endif /* _DISABLE_ECP_256R1_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_nistP256r1_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 7,
+ /* select function */ p256r1_select_ap_w7,
+ /* precomputed data */ (BNU_CHUNK_T*)ec_p256r1_precomputed
+ };
+ return &t;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpp384r1precomca.c b/ext/ipp/sources/ippcp/src/pcpp384r1precomca.c
new file mode 100644
index 0000000..9e87cb3
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpp384r1precomca.c
@@ -0,0 +1,1523 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (P384r1 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (384)
+#define LEN_P384 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* P384 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P384];
+ BNU_CHUNK_T Y[LEN_P384];
+} P384_POINT_AFFINE;
+
+extern const __ALIGN64 P384_POINT_AFFINE ec_p384r1_precomputed[77][16];
+
+
+#if defined ( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_384R1_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+const __ALIGN64 P384_POINT_AFFINE ec_p384r1_precomputed[77][16] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0x49c0b528,0x3dd07566),LL(0xa0d6ce38,0x20e378e2),LL(0x541b4d6e,0x879c3afc),LL(0x59a30eff,0x64548684),LL(0x614ede2b,0x812ff723),LL(0x299e1513,0x4d3aadc2), LL(0x4b03a4fe,0x23043dad),LL(0x7bb4a9ac,0xa1bfa8bf),LL(0x2e83b050,0x8bade756),LL(0x68f4ffd9,0xc6c35219),LL(0x3969a840,0xdd800226),LL(0x5a15c5e9,0x2b78abc2),
+ LL(0x783dde91,0xc8229e55),LL(0x022b53f0,0x8e6c8f2e),LL(0xff9d48a1,0x3504e6f0),LL(0xf0687f50,0xda821495),LL(0x2de4b506,0x9c90a4fd),LL(0x427460c3,0xdb93b776), LL(0x3140bfda,0x42ea8463),LL(0xc2aaccd8,0xe8e8e4a8),LL(0xdc588258,0x15e4f18b),LL(0x5172bad9,0x09f1fe41),LL(0x00b0e684,0x070d4309),LL(0x123df0c2,0xe34947f7),
+ LL(0xc1dc4073,0x05e4dbe6),LL(0xf04f779c,0xc54ea9ff),LL(0xa170ccf0,0x6b2034e9),LL(0xd51c6c3e,0x3a48d732),LL(0x263aa470,0xe36f7e2d),LL(0xe7c1c3ac,0xd283fe68), LL(0xc04ee157,0x7e284821),LL(0x7ae0e36d,0x92d789a7),LL(0x4ef67446,0x132663c0),LL(0xd2e1d0b4,0x68012d5a),LL(0x5102b339,0xf6db68b1),LL(0x983292af,0x465465fc),
+ LL(0xebb68f2c,0x0aae8477),LL(0xee0421e3,0x30594ccb),LL(0x0aecac46,0x2e4f153b),LL(0x736400ad,0x078358d4),LL(0xd685d979,0xfb40f647),LL(0x34179228,0xcfeee6dd), LL(0x9b3a03b2,0x54f3e8e7),LL(0x7bfec97e,0xe74bb7f1),LL(0x4c542ad1,0x8e3e61a3),LL(0x0418c693,0x147162d3),LL(0x3820017d,0xe607b9e3),LL(0x303df319,0x50946875),
+ LL(0x68f1f0df,0xbb595eba),LL(0xcc873466,0xc185c0cb),LL(0x293c703b,0x7f1eb1b5),LL(0xaacc05e6,0x60db2cf5),LL(0xe2e8e4c6,0xc676b987),LL(0x1d178ffb,0xe1bb26b1), LL(0x7073fa21,0x2b694ba0),LL(0x72f34566,0x22c16e2e),LL(0x01c35b99,0x80b61b31),LL(0x982c0411,0x4b237faf),LL(0x24de236d,0xe6c59440),LL(0xe209e4a3,0x4db1c9d6),
+ LL(0x7d56dad8,0x7eb5c931),LL(0x39d3413a,0xcb2454b3),LL(0x580d57f2,0xec52930f),LL(0x1bdf6015,0x2a33f666),LL(0x2b02d33b,0x4f0f6a96),LL(0xf0430c40,0xc482e189), LL(0xa7b08203,0x3f62b16e),LL(0x5b3d4dce,0x739ac69d),LL(0xb79e33b0,0x8bd4bffc),LL(0x1b546f05,0x93c9e5f6),LL(0xdf21559a,0x586d8ede),LL(0xaf2a9eba,0xc9962152),
+ LL(0x7d69222b,0xdf13b9d1),LL(0x874774b1,0x4ce6415f),LL(0x211faa95,0x731edcf8),LL(0x659753ed,0x5f4215d1),LL(0x9db2df55,0xf893db58),LL(0x1c89025b,0x932c9f81), LL(0x7706a61e,0x0996b220),LL(0xa8641c79,0x135349d5),LL(0x50130844,0x65aad76f),LL(0x01fff780,0x0ff37c04),LL(0x693b0706,0xf57f238e),LL(0xaf6c9b3e,0xd90a16b6),
+ LL(0xdd9bcbba,0x23f60a05),LL(0xae9b587a,0x9e336de5),LL(0x93d7e30f,0x1c5c2e71),LL(0x4f3ddb37,0x1d9aebd6),LL(0x16b66423,0x1c7b5fe1),LL(0x349cd9b1,0x5db4f184), LL(0xe6655a44,0x0d2cfe83),LL(0xb7e55e87,0x836dbb36),LL(0x7d8686e4,0x701754bf),LL(0xa42dbba2,0xe9923263),LL(0xc48ecf0e,0x7008d943),LL(0x0d27ef61,0x3c0c6dd7),
+ LL(0x2353b92f,0x2f5d200e),LL(0x3fd7e4f9,0xe35d8729),LL(0xa96d745d,0x26094833),LL(0x3cbfff3f,0xdc351dc1),LL(0xdad54d6a,0x26d464c6),LL(0x53636c6a,0x5cab1d1d), LL(0xb18ec0b0,0xf2813072),LL(0xd742aa2f,0x3777e270),LL(0x033ca7c2,0x27f061c7),LL(0x68ead0d8,0xa6ecaccc),LL(0xee69a754,0x7d9429f4),LL(0x31e8f5c6,0xe7706334),
+ LL(0xc8d99c02,0x845539d3),LL(0xe58d6787,0x2a15a9a6),LL(0xab225fa3,0xe9f6368e),LL(0xeb32cabe,0x54a612d7),LL(0x5c4845ec,0xc2f64602),LL(0xdb1c212e,0xa91a5280), LL(0xe67b5fce,0xbb971f78),LL(0x13b9e85c,0x03a530eb),LL(0x794eabfd,0x592ac0ba),LL(0xcfd7fd1d,0x81961b8c),LL(0x47a9b8aa,0x3e03370a),LL(0xc80174e8,0x6eb995be),
+ LL(0xb68b8c7d,0xc7708b19),LL(0x44377aba,0x4532077c),LL(0x6cdad64f,0x0dcc6770),LL(0x147b6602,0x01b8bf56),LL(0xf0561d79,0xf8d89885),LL(0x7ba9c437,0x9c19e9fc), LL(0xbdc4ba25,0x764eb146),LL(0xac144b83,0x604fe46b),LL(0x8a77e780,0x3ce81329),LL(0xfe9e682e,0x2e070f36),LL(0x3a53287a,0x41821d0c),LL(0x3533f918,0x9aa62f9f),
+ LL(0x70313de0,0x3db84772),LL(0x5d970420,0xd4258cc5),LL(0xc8edfee1,0x03aced26),LL(0x35d77d83,0xf67eb422),LL(0xcf9ab45c,0x523c40db),LL(0x9c35b26d,0x627b415f), LL(0x8be55ed8,0xfacc45e4),LL(0x27aa651a,0x80d60af6),LL(0xd0e102ac,0x8c79848f),LL(0x66bed5af,0x40c64a4e),LL(0xf7942f0e,0x0329eab1),LL(0xf9c4af3d,0x0c6e430e),
+ LL(0x75ccbdfb,0x9b7aeb7e),LL(0xf6749a95,0xb25e28c5),LL(0x33b7d4ae,0x8a7a8e46),LL(0xd9c1bd56,0xdb5203a8),LL(0xed22df97,0xd2657265),LL(0x8cf23c94,0xb51c56e1), LL(0x6c3d812d,0xf4d39459),LL(0x87cae0c2,0xd8e88f1a),LL(0xcf4d0fe3,0x789a2a48),LL(0xfec38d60,0xb7feac2d),LL(0x3b490ec3,0x81fdbd1c),LL(0xcc6979e1,0x4617adb7),
+ LL(0x8f75244c,0x5865e501),LL(0x01ec909f,0xd02225fb),LL(0xb1f85c2a,0xca6b1af8),LL(0x88957166,0x44ce05ff),LL(0x5710c0c9,0x8058994c),LL(0x32f6b1ba,0x46d227c4), LL(0x03cb68e5,0xbe4b4a90),LL(0x730a99d1,0x540b8b82),LL(0xe11dbbbf,0x1ecc8585),LL(0xd9c3b691,0x72445345),LL(0x13690a74,0x647d24db),LL(0xdefbadf5,0x4429839d),
+ LL(0x4709f4a9,0x446ad888),LL(0xec3dabd8,0x2b7210e2),LL(0x50e07b34,0x83ccf195),LL(0x789b3075,0x59500917),LL(0xeb085993,0x0fc01fd4),LL(0x4903026b,0xfb62d26f), LL(0x6fe989bb,0x2309cc9d),LL(0x144bd586,0x61609cbd),LL(0xde06610c,0x4b23d3a0),LL(0xd898f470,0xdddc2866),LL(0x400c5797,0x8733fc41),LL(0xd0bc2716,0x5a68c6fe),
+ LL(0x7c33ed91,0xda6e8a7f),LL(0x0ecdd2d8,0x992afb5b),LL(0x7917652a,0x37cf6551),LL(0x2887d5ff,0x317b63ea),LL(0x13bdc3fa,0x37065f53),LL(0x435abaa1,0xa10896aa), LL(0xefabca26,0x9b21615f),LL(0x230cf00d,0xeb07ddea),LL(0x154d410f,0x914871dc),LL(0xc88ee148,0xb333bdfb),LL(0xa72d1967,0x51c305c6),LL(0x81ef2513,0x659db481),
+},
+/* digit=1 base_pwr=2^5 */
+{
+ LL(0x8c0a64a4,0xad852b87),LL(0x08f779d5,0x0d784cf2),LL(0xc651b1dd,0x1896b9fc),LL(0x12e8dc87,0xba8953d6),LL(0xa631cfb0,0x3a9865ba),LL(0x626b3d79,0x5dd2a4a0), LL(0x687c20bb,0x1148bc72),LL(0xf2a52bfd,0xa372dfc2),LL(0x9448fd08,0x77315f9e),LL(0x0a2377b6,0x4bcb06f0),LL(0xb35b4ff0,0x73b42725),LL(0xaabca99f,0xc510ad93),
+ LL(0x8e89b258,0xed4de4f8),LL(0x297a9a37,0x957c980f),LL(0xf8a0580d,0xe04b3d30),LL(0xca57b7bd,0xa309199d),LL(0x3be44d56,0xfc8e87cf),LL(0xd1b30e5c,0x4f5d5ab6), LL(0x30a9325b,0xb213c6a0),LL(0xf091bc01,0x0fd1c52d),LL(0x1090fede,0xfe51bbbf),LL(0x301fe259,0x6d97cabc),LL(0x5ecd3fe8,0x3ee12789),LL(0x9404ca51,0x888b708b),
+ LL(0x1d15bba7,0xdc529385),LL(0x148840d4,0x8fd61e31),LL(0x52ce08f6,0xee21597e),LL(0x81998af2,0x26de4c65),LL(0x9741eb42,0xcb4aa43c),LL(0x39c18b96,0x8bf3dccc), LL(0xd872984e,0x66e1d5da),LL(0x7dd87c39,0x507e2405),LL(0x305ee4f0,0x8545396f),LL(0xc831254b,0xf9d19ea0),LL(0x5d5680b8,0xcee0842f),LL(0x5a4434a4,0xb257fb6c),
+ LL(0x8258030f,0xe484fd9f),LL(0xf21af80a,0x0f4fa5ef),LL(0x7c1c3984,0xc0dd449e),LL(0x18eb5195,0xf3133891),LL(0x777a16d2,0x0336aab8),LL(0xc241720a,0xa6661cc4), LL(0xa7efacd0,0x678db970),LL(0x6461e382,0x22896865),LL(0xa022c7a4,0x5d85a0e4),LL(0x34a02a6b,0xb01f1e04),LL(0xa5791ce3,0x2657eedd),LL(0xa277ac5b,0x239dcab2),
+ LL(0x0b3db49f,0x7f74672d),LL(0xadc8418d,0x026275e9),LL(0xfe7cc4ee,0x18866523),LL(0xbbf36aca,0x3546317b),LL(0x80caf049,0x282313fa),LL(0x9a49d91c,0x08275c9c), LL(0xab71c2a8,0xe41f92ec),LL(0x1dd95aae,0xb5674698),LL(0xa8c4dc57,0x82347685),LL(0xa847fd1e,0xf78b23d6),LL(0xb692f868,0x8194f070),LL(0xa5f2ad03,0xfe0dee06),
+ LL(0x22abee22,0x61361c06),LL(0x2f42a470,0xe82123bc),LL(0x3c6ceff4,0x2c97dda1),LL(0xadcb0453,0xc2eea21f),LL(0xc78ec9ff,0xdf2a4407),LL(0x9625c735,0x54557c55), LL(0x7c440c0a,0xc693c985),LL(0xe56622c1,0x918e7324),LL(0xa5f0900f,0x8f990d2b),LL(0xc6aeeaef,0xa5b7d193),LL(0x450456e3,0x9f053d95),LL(0xad418ef1,0xdf783b1c),
+ LL(0xbe6c3221,0x08d2ce13),LL(0x9c0624ea,0x0f53824c),LL(0x5da25412,0xad3ca744),LL(0x93fea7cc,0xecb38a41),LL(0xcba623c4,0x8ae838d8),LL(0x41d85222,0xa75c8da5), LL(0x290807c8,0x9f48b828),LL(0x22f4ab6a,0x4df75f09),LL(0x7cab82a9,0x02511a3e),LL(0x21da354e,0xcc052dc3),LL(0x03ca73e9,0x7db6c1f3),LL(0xcb99244e,0xca1d4279),
+ LL(0x6ae54da1,0x9a7a5b42),LL(0x7040b022,0xcfcadaab),LL(0x3d9f0e61,0x7539438e),LL(0xe328c2e2,0x013c6719),LL(0xcccbf891,0x7f4a706c),LL(0x735a2d28,0xa335ab82), LL(0x3d984124,0x46694ef0),LL(0xc166b337,0x0e0bdfab),LL(0x423d47e4,0x9d54ed8b),LL(0xf44c9180,0x8075a8cb),LL(0xabe9b384,0xd4f5b184),LL(0x41abdc75,0x424dd00b),
+ LL(0xf2432ae5,0x36137ae5),LL(0xad5f443d,0x2d941abc),LL(0xee013f80,0xe31e96f2),LL(0x26385266,0x24127d20),LL(0xeae97f8b,0xd4004cf3),LL(0x62527c9e,0xbf3b201a), LL(0xcb8a2a2f,0x0cd0fee1),LL(0x8fdceb43,0x48894469),LL(0x2250a356,0xe67565ba),LL(0x2ccfe7d1,0xbbb5f8ca),LL(0xa350fe88,0x431a268f),LL(0x4e5b64d2,0xd2eb0373),
+ LL(0xf5d0255f,0x2ad7ae0d),LL(0xd0836f8b,0x4c04dee0),LL(0x4ec33606,0x15e3493e),LL(0x5f5eea30,0x590aefe6),LL(0x2e49ba54,0x09ef5a2e),LL(0x69a0d232,0xf56d447f), LL(0xe2510f5e,0x045f26b6),LL(0x9941083a,0xf90e1888),LL(0xe66f6b9b,0x6e6a3bd6),LL(0x251f82ae,0x637ad390),LL(0x43cdf91a,0xc40374b6),LL(0x2d6c6d88,0x62f5f8ad),
+ LL(0x11ff6e09,0x3da03590),LL(0xa685c0e8,0x41194047),LL(0x72b9c9ce,0x7c5323ff),LL(0x4f599daf,0xf84ce505),LL(0x5882ef19,0xd0dec10e),LL(0xde1e3a06,0x1ca3449d), LL(0xb09af84a,0x317e4e7f),LL(0x1a46bc75,0x0ebaa2c9),LL(0xc103f200,0x42b00a72),LL(0xc3719155,0x1c30ada5),LL(0x5c1cb58c,0x565bacfa),LL(0x35fa4670,0x374f516c),
+ LL(0x400f1d87,0x99a710b1),LL(0xee47be8b,0xec3ca386),LL(0x37168fee,0x3a00dcad),LL(0x1765a0df,0x1a69d674),LL(0x917c4909,0x85233afe),LL(0xe9bd6210,0xa3aa97a4), LL(0x310885f3,0x01010526),LL(0xb5007b08,0x21c5de3f),LL(0xee8ddabd,0x5df0c6ef),LL(0x0f6dfdef,0x5d17d45a),LL(0x251c9f79,0xb73d831a),LL(0xcb1df19d,0x397779e6),
+ LL(0xaf897b90,0xe97f7bcf),LL(0xe05af5ab,0xbaeecdda),LL(0x1b81fd5b,0x3c80856e),LL(0xeca4f983,0xea309bd0),LL(0x22ab76a2,0x534d8950),LL(0x6d620cfe,0xa8d63627), LL(0x6b0cfcfc,0xa13d622c),LL(0x84d9147e,0x584a9d2e),LL(0xd200ea9c,0xf23b9565),LL(0x193d5fe0,0x5f44b61a),LL(0x64b4c78d,0x430a3d3a),LL(0xc91c2b41,0x045dc592),
+ LL(0xbe13c1e4,0xafd6bf05),LL(0xe2ea8c26,0x256e2b98),LL(0x903983f4,0x06711695),LL(0x217c1577,0xbefbfbcb),LL(0x7324c85c,0xa214b26a),LL(0xdd98b968,0xfa2d4711), LL(0xf5d9cc93,0xed722297),LL(0xd45f8635,0x65cec50f),LL(0xc792e6b3,0x41627e4a),LL(0x228dbb39,0xc254a08c),LL(0xdf6fb26b,0x5b28fd3f),LL(0x4bdc6969,0x1471d353),
+ LL(0x7c20f79d,0x8600c734),LL(0xca3052ba,0x2bef7d87),LL(0x7b082112,0xc52d0bdf),LL(0x2bf757ca,0x0e649a4b),LL(0xb13eeb84,0x0c1f41bd),LL(0x8ecf9ace,0xd7115e8f), LL(0x1698ba68,0xa62f5e31),LL(0xc862e751,0x6a06d7be),LL(0xf95eee3f,0xd875c1a4),LL(0xa0b2b331,0xb25f8da3),LL(0x1827c037,0x4e52fd11),LL(0x9d72ba3c,0xacd38c2a),
+ LL(0xd7801edf,0x5e2cb07f),LL(0x3adc065a,0xf9fa2c0b),LL(0xd4de1f25,0xa296c53f),LL(0x838f7169,0xd408060c),LL(0x2e8a6ce7,0x68e19d7b),LL(0x94b58671,0x2cc6e06c), LL(0xc1cb6151,0x93d02a07),LL(0x35003126,0xa10fb4cf),LL(0x1aa3bc4e,0x6aa069f5),LL(0xdd09b142,0x0e44fbf0),LL(0x832e5945,0xe264f343),LL(0x1fc166ac,0x5dca2adc),
+},
+/* digit=2 base_pwr=2^10 */
+{
+ LL(0xa0eb176a,0x56ad7582),LL(0x6e19aa00,0x085b5a36),LL(0xe2c8b036,0x85f2c6ff),LL(0xfcd7336b,0x55c6d357),LL(0x22a46acd,0xb1ecc56d),LL(0x36277ac7,0x8e0f9767), LL(0x01878921,0xa4ed11e9),LL(0x7f4fb650,0xd3835566),LL(0x266158aa,0x5fdaba45),LL(0x89e0dff0,0x6f0b27fd),LL(0xeb6b02d0,0x32ef7ae2),LL(0xcc1b46e1,0x2f145871),
+ LL(0xf6e9f82c,0xe65245ce),LL(0xf6da7b5a,0x9e234dff),LL(0xbad2c806,0x5677c121),LL(0x060fcf24,0xc52dec32),LL(0x5d78ccca,0x78d07067),LL(0x1bc8b6fb,0x630002ea), LL(0xeb2e99ae,0xc5cb86be),LL(0x8551d16f,0xf13981e7),LL(0xc92a70d7,0xfbb7cdf2),LL(0xf53cd2a1,0x5a9ff1f1),LL(0x984f1139,0xfdbe6b7a),LL(0xa470a9f1,0x4403d046),
+ LL(0x8d040c69,0xb5b16cd4),LL(0xf95a2dc4,0xfdaba315),LL(0x61ce4704,0xc9fef349),LL(0xdbb53ed6,0x5fe87a0d),LL(0x73d70f93,0x3f0ccc79),LL(0x46724a1a,0x4601d1bc), LL(0x24f08565,0x5c4a15ae),LL(0xaa577320,0x5eda1e8a),LL(0xbb32d307,0xe31ebb35),LL(0xdc770a0e,0xcdc6f13b),LL(0xc434c2f8,0xbe3ae514),LL(0x3a0ef0d1,0x57c7fdf6),
+ LL(0x0f547eba,0xeb06571c),LL(0x6246c0dc,0xf292c38d),LL(0x26eed224,0xa1859667),LL(0x6100e387,0x8d9e56e4),LL(0xdc6298d1,0x470506b9),LL(0xf3350ad0,0xb19e084c), LL(0x12abd898,0x83eb62a8),LL(0x2222342c,0x70f152cc),LL(0xe1bd4a82,0xb089e880),LL(0xcaf3b3fc,0xd4d1e70f),LL(0x95ffd65c,0xd0b1ec63),LL(0x9b184ebb,0x79f27f3a),
+ LL(0xb92a9a13,0xc2467f9a),LL(0x6add349a,0x0c3ee8eb),LL(0x45e99644,0x59250eda),LL(0xc8a2df27,0x22ce0635),LL(0x312e8698,0xec7b643e),LL(0xaebd1587,0x334ccf2e), LL(0x6bca2900,0x0c1c6873),LL(0x09826cb1,0x00beb4c2),LL(0xcde6b725,0x12dbb586),LL(0x66dfed41,0x8d7cee6c),LL(0x014de4c8,0xc38deba2),LL(0x6248442d,0xa3ba6ec7),
+ LL(0xd42aeb95,0x3c686079),LL(0x85e3ea0f,0xc162e5e9),LL(0x1bbb2455,0x34cf5861),LL(0x8773b064,0x7650de1d),LL(0xd2bab35d,0x3b7562c6),LL(0x33d0741b,0x83191b44), LL(0x3a6bd9cf,0x4b604db0),LL(0x074aed21,0x87cd84db),LL(0xd4f91f9c,0x02a042d2),LL(0xe42c2a67,0x5a5d52e5),LL(0x1d5f216a,0x31291acd),LL(0xcd6203c8,0x9c3971bc),
+ LL(0xaa1ef488,0x92e4c851),LL(0x846528a9,0x4f91fc22),LL(0x5dc13a84,0xaa2f5d2d),LL(0xf1072d4d,0xba06aa68),LL(0x5e3a2ba9,0xf4f3b17c),LL(0x5e4dde77,0xff36a535), LL(0xae17dddc,0xe8ef143a),LL(0xa1fcd4ec,0xcc82631b),LL(0xc7d3963b,0x97db807e),LL(0x21d85ce2,0xe4aff045),LL(0x74667392,0x2d6480e6),LL(0xa55d0b3f,0xc8ce97f3),
+ LL(0x4c14ee0e,0xd4277731),LL(0x5e881c3f,0xda8146d1),LL(0x99f1867c,0x6b0746b0),LL(0x602dd4cc,0x1ec73d72),LL(0x38081120,0x27fae515),LL(0x2f8b2f2d,0x6a677bdc), LL(0xd60544e9,0xb924af64),LL(0xdcfc6b16,0x1439e183),LL(0x068565ac,0x4e88e9ae),LL(0xa9a4f146,0x8a3dbd25),LL(0x3f93f734,0xdb4a3e48),LL(0x8f1d33bc,0xb1971c05),
+ LL(0x56e8d1d1,0x059a5f98),LL(0x5c228e89,0x93a2d2ac),LL(0xfea48feb,0x0bc2c885),LL(0x7b7e188c,0x27fdf3be),LL(0xd399ba6e,0xec579682),LL(0xb3fdb5d0,0x01b12e12), LL(0x742f66b8,0x8e00941b),LL(0x478d8ee4,0xd79bc58f),LL(0x9ad50729,0xefdcd053),LL(0x3bf7bfea,0x8738666f),LL(0xd7afaff1,0x20192810),LL(0xd233e892,0x6c13e29e),
+ LL(0xff9ae345,0xf1f5df24),LL(0x3dd75336,0x5b8038b9),LL(0x7d2c0058,0x4746c5da),LL(0x51ddd827,0x667b07bd),LL(0x8cfdfd25,0x1b3c67c2),LL(0x06dac0d6,0x058dea06), LL(0x846c847d,0xd19040fd),LL(0x07d00ec6,0x4e5cbe59),LL(0xf1930296,0x2dc442fe),LL(0xfdb583be,0x12f89640),LL(0x5606f66b,0x0694f44f),LL(0xbbef8446,0xa9fcca6c),
+ LL(0x4b5cb12f,0x0c229fb9),LL(0xe930ff3e,0x0486ba2d),LL(0xb80c37f6,0x00797293),LL(0xb43335e0,0x71be9538),LL(0xda0d9cb7,0x0a604693),LL(0x745cc02e,0xb248f30d), LL(0xd9a3013b,0xfa889343),LL(0x53d6a4d4,0xd8642bc0),LL(0xe216af4b,0x9f89c21a),LL(0x41947320,0x86272900),LL(0xa269c49a,0x06f5f8f7),LL(0x727495ba,0xb3bc6d62),
+ LL(0xd1066e5a,0xd1de964b),LL(0x749909df,0x26ccad6b),LL(0x0de9eb07,0xbc4b55af),LL(0xa60289bf,0x9f11b995),LL(0x52392c61,0x3e59000c),LL(0x5ccff4fc,0x2128c46a), LL(0xea1e0d5e,0xb28b306b),LL(0xf5cfa47d,0x5f6ef5d5),LL(0xe3f824fa,0x59b0542c),LL(0x2f52b71c,0x70f097b2),LL(0x04c6d263,0x4483b726),LL(0x34d93e5b,0x48720be7),
+ LL(0x95ad5fe3,0x864bbbb7),LL(0xe8113888,0x24f15dcb),LL(0x6edb61fe,0x968fcf60),LL(0xc7e1aff9,0xbf266d1c),LL(0x3f4a5d91,0xd85a1555),LL(0xf8416ead,0xd5ff238e), LL(0x30d18538,0xcc0e75da),LL(0xb2b91d71,0xcf8a5435),LL(0x027a7e72,0xfae90226),LL(0x627c27f7,0x8e39918c),LL(0x18d454b0,0x5b8235c9),LL(0x44987803,0xef92e643),
+ LL(0x41ff08a5,0xb39b33ce),LL(0x32450c03,0xaf6dfb28),LL(0x7b45c3f2,0xe21947c5),LL(0xbc35bfdf,0x21b529f6),LL(0x4c5be366,0xc0a26928),LL(0xd366b21e,0x73856f3a), LL(0x3df444f7,0x53e26b66),LL(0x8b9c7ac1,0xb18a295e),LL(0x301f1f11,0x6b9df497),LL(0x7607f372,0x6e77d0e2),LL(0xc311fc01,0xd2e6b296),LL(0x7a396a6c,0x18a224e0),
+ LL(0x9b97dff2,0x8507c707),LL(0x983d26af,0xacc0b6a5),LL(0x2b62fdb2,0xdcc30fd6),LL(0xa68ab541,0xe9b03755),LL(0x13b6c3a0,0x270bc073),LL(0x649051fc,0x952ec4b9), LL(0xe70ceb83,0x4814c2c2),LL(0xc090e636,0x07632da5),LL(0x11fcdb0b,0x1c340686),LL(0x113f2ce9,0x7b4985d7),LL(0x16da3a7d,0xc3072347),LL(0x0d7d36ab,0xf0575aef),
+ LL(0x3a7f43c3,0x721bb836),LL(0xc12dca0f,0xab5b3108),LL(0x34853870,0x9cc9a789),LL(0xaf598c4f,0x78b604a7),LL(0x476f27c8,0xd370375e),LL(0x0b15cba5,0x9f0415b8), LL(0xd400dc1f,0x2bcfd9a4),LL(0x4bc62ddd,0x2a6fe03b),LL(0xa211b19f,0xb05a6464),LL(0x9990b504,0xce059d41),LL(0xd94951d3,0x011c5f87),LL(0x00d9c7b0,0x13cec089),
+},
+/* digit=3 base_pwr=2^15 */
+{
+ LL(0x9b280fd9,0xf365419f),LL(0x46365672,0x13e3b127),LL(0xc41880aa,0x8a91c165),LL(0xf9712fbd,0x3eb27a97),LL(0x76c55678,0xa6587aec),LL(0x02cd79cf,0x7c3a04b7), LL(0xda712eb8,0xfc878f9c),LL(0x0fca3e02,0x076e6117),LL(0xcaf6df5e,0x09a184d8),LL(0xaabcde75,0xd32bf232),LL(0x03de597a,0xf601d0de),LL(0xc5da2858,0x85d2b5fc),
+ LL(0xae899afa,0xb6029961),LL(0x681b6e1b,0x8eedd66e),LL(0x4df3e5b1,0x82db693b),LL(0xa0c3e357,0xb5131488),LL(0xccb2f577,0xbfb01ff3),LL(0x27a72cc3,0x28ea9470), LL(0xe39e325e,0x26170928),LL(0x84f80188,0x42d4876b),LL(0x4c872d76,0x0bec6a63),LL(0xb14d9c9f,0xa0a7cc90),LL(0x4f6c7778,0x8a32d2c4),LL(0x3b889a4c,0xe7cd346e),
+ LL(0x437f2efb,0xea95b5c9),LL(0x8e52ce8e,0x67d3e9b5),LL(0x88ff5455,0xfb331024),LL(0xc3101ded,0x883ec9fc),LL(0x0ca5f1f9,0x056218e2),LL(0xbccc65d8,0x4c9b2483), LL(0x123db2ec,0x13199b26),LL(0x9aff90db,0xbc1d8247),LL(0x367516f6,0xc4a9311d),LL(0xcb6e90d6,0x3b40c867),LL(0x4034415c,0xff674ff8),LL(0xa1821e7e,0x2787db45),
+ LL(0x609683ac,0x860ef794),LL(0x9af1c522,0xf0631ad3),LL(0x2ee7f522,0x322c8366),LL(0x54122af0,0x58ccd95f),LL(0x2bbb2d80,0x7454880c),LL(0x86d8d577,0xea173d82), LL(0xea1cc801,0xd5a3057c),LL(0xbbb2a189,0xfd08d482),LL(0xc3c512f8,0x26aac99e),LL(0x556d891e,0xc3eac036),LL(0xbf9f6112,0x866c3aa7),LL(0xc144f7e9,0x7c4c8fb9),
+ LL(0x8343f5dd,0xc0c1eb0f),LL(0x0126fa2d,0xa205e66a),LL(0x44fd8be4,0x37530a32),LL(0x96ab64cf,0x3c7af6f6),LL(0x76657202,0x1f043050),LL(0x828f3fb1,0x2c59d31c), LL(0xe7f5926e,0xa61cba51),LL(0x91ebeb81,0xb2de4273),LL(0xbb855476,0x976f2c34),LL(0x269e4f86,0x0c6c02c3),LL(0xe2e01fff,0xc69bed8f),LL(0x480bf7b4,0x19aa421c),
+ LL(0xb617206b,0xad0d24c7),LL(0x9dd13f59,0xb8be483f),LL(0x7655aa29,0xa55134ff),LL(0x7a5e217e,0xa3d10385),LL(0x3a21b295,0xfbb9eeb5),LL(0xc84a136d,0x1de71555), LL(0x0b7487b3,0x7579398e),LL(0xa14dce87,0xc6ca9575),LL(0x46452257,0x99b32e1e),LL(0x479d8f2c,0x99d54955),LL(0x930b80ef,0xc2a8a6a1),LL(0x656c850b,0x58d9db81),
+ LL(0xa682508c,0x6c85a0ed),LL(0xedcce6c8,0x8350b515),LL(0x6f95898d,0xa84a6765),LL(0x1e419847,0x55b0ae97),LL(0xdd6a885d,0x11115c6e),LL(0x4fb174a4,0x6f0beaf6), LL(0x815af3af,0xaaae44b2),LL(0x927a2c1c,0xcf0697b9),LL(0xd7d645ee,0x37639d62),LL(0x2effec37,0x157b7eda),LL(0x9b9c66e6,0xb55e5075),LL(0x85f597ec,0x33a66a1f),
+ LL(0x8f7782b6,0x171898aa),LL(0x499b3a81,0x8b7a706b),LL(0xfdb2c1ba,0xbc0e835f),LL(0x591f5aaf,0x4ee30281),LL(0xcc272c6a,0xfd71de3b),LL(0x6e93f68a,0x532800c4), LL(0x8365c576,0x35ee0804),LL(0xcd4c0221,0x6c2bcc94),LL(0x957b2ff6,0x49f37ff5),LL(0x5ec029c0,0x315d8e7e),LL(0xef324c12,0x33230602),LL(0x966b2578,0xf5847f9b),
+ LL(0x1453b1e1,0xc29b123e),LL(0x20059b44,0xefb07788),LL(0x9291671e,0x15554ade),LL(0x429dea37,0xeb5a1980),LL(0x6c4b867d,0xf96dacbb),LL(0xabab4d68,0x4f5563d6), LL(0xcbe76297,0xb5b0ecff),LL(0x51d6bd43,0x5a22996a),LL(0xb7e5cfc6,0x0088ec95),LL(0xfe373e05,0x4863a5a1),LL(0xc244d93d,0x42b7925b),LL(0x40117113,0x85bad135),
+ LL(0xf9daa551,0x86283e21),LL(0x1f696f1b,0x47fd23f8),LL(0xb9784a9a,0x7d029b1b),LL(0xa0c0acb5,0x7c7798be),LL(0x6d7c682b,0x41241c71),LL(0x1d33c2b0,0x11c6c113), LL(0x3565cf32,0x5d469ca2),LL(0xbad4bdbf,0xa949f022),LL(0xa13cf4cd,0x3d054cc2),LL(0x9e3ce279,0x13bd2166),LL(0x8a4beafc,0x01bc70e6),LL(0x8aba087e,0xb39e351d),
+ LL(0x82357232,0x26072a5d),LL(0x9f0fd2f1,0x3762764e),LL(0x0c16733e,0x9c5813f6),LL(0x718951d4,0xea2e0e03),LL(0x69e63818,0xae195bd4),LL(0xfa2f9a6e,0x241a4afc), LL(0x9165d59a,0x0e97519f),LL(0x58e5af1b,0x416bd373),LL(0x8197b7ec,0xc4e81128),LL(0x9c6ba0d0,0x4145be2c),LL(0x7d40b98a,0xc82cb2a1),LL(0xbccfa8b8,0xc3c28487),
+ LL(0xa4ee10a1,0x84aa863e),LL(0x87919ccd,0x24d805a6),LL(0xb5c399b2,0x553f3206),LL(0x3cc109bd,0x775b9217),LL(0xfe384088,0x25c01263),LL(0xd5f743cf,0xa3c4418b), LL(0xdf91f1f0,0x3d69705d),LL(0x9ebddad1,0x547d4626),LL(0x2626cebd,0x0198ab1a),LL(0x85b1afe8,0xaf8320f2),LL(0xe17e6efd,0xb9c0968c),LL(0x90215bb6,0xfedc75c2),
+ LL(0x143ff74d,0x8061d340),LL(0xa23aa7b3,0x59e94fc6),LL(0x914c3b81,0xf7c79a0b),LL(0x702c6ae7,0x5a836211),LL(0x718123c3,0x2570d63c),LL(0xc9f5ce3c,0x7e86d11e), LL(0x17bcce3b,0x80f03f97),LL(0x465a7446,0x073975b1),LL(0xcb357ace,0x29f66de7),LL(0x04894fb0,0xe87bd12c),LL(0x51a0b5ae,0xfc501a26),LL(0x02207a3b,0x20a3170c),
+ LL(0x5fe63bd4,0x3ee52d8f),LL(0x7a7da77c,0x09f8405c),LL(0x1881a757,0x35ce95c6),LL(0xc13e3707,0x0a8cf9d9),LL(0x48d2d3f6,0xe71258d5),LL(0x0bbe7c0d,0xcf4fd691), LL(0xfb9479f1,0xbd6496e1),LL(0xab8cb3a2,0x711c669a),LL(0x58cfdfb4,0xcbe85013),LL(0x59275b4a,0x655c902b),LL(0x20f722ba,0x7e0ff05b),LL(0x42b17aad,0xcb00031d),
+ LL(0xd54bf1a4,0x3360ff11),LL(0x5c79494b,0xbab994cb),LL(0x757d7771,0x953ad553),LL(0x68b58ed5,0xf17f14f0),LL(0x7523c422,0x22361531),LL(0x5ebf0d49,0xf0f05f96), LL(0x49182267,0x33866765),LL(0xad71c3eb,0xf87eccc1),LL(0x913d8dca,0xd7708e18),LL(0xb193eef9,0x27fe27e1),LL(0xcc45e65d,0x33376365),LL(0xd700ac20,0x599b4778),
+ LL(0xed068028,0xda643272),LL(0xa91fb87f,0x86b52135),LL(0x35b43943,0x23865a7c),LL(0x4606bbf2,0x6ac01588),LL(0x1559fb9a,0x9660ab72),LL(0x3ce2f1a5,0x1fcb09e7), LL(0x793d2f0c,0x62af29ab),LL(0x3aee7efc,0xad5aaef5),LL(0x44c11037,0xee9f29b7),LL(0xd36c2571,0xb2a19cf1),LL(0x65b552b7,0xb87d88e2),LL(0xbeb253d4,0xd8b4f172),
+},
+/* digit=4 base_pwr=2^20 */
+{
+ LL(0x72876ae8,0x31bdb483),LL(0x961ed1bf,0xe3325d98),LL(0x9b6fc64d,0x18c04246),LL(0x15786b8c,0x0dcc15fa),LL(0x8e63da4a,0x81acdb06),LL(0xdada70fb,0xd3a4b643), LL(0xdea424eb,0x46361afe),LL(0x89b92970,0xdc2d2cae),LL(0x615694e6,0xf389b61b),LL(0x872951d2,0x7036def1),LL(0xd93badc7,0x40fd3bda),LL(0x380a68d3,0x45ab6321),
+ LL(0xce0b5b72,0xc5cf8997),LL(0x9d7154ba,0x350adde1),LL(0x307b254a,0x8139681e),LL(0x75cd94d7,0xcc87fb57),LL(0x78684954,0x90e70274),LL(0x95ceb991,0xc4fdf4c0), LL(0x8762c84c,0x91bbc0ab),LL(0xce09e8ad,0x5e09e226),LL(0x4b93d45f,0x1cb83d70),LL(0xf541da1f,0xe2299024),LL(0x4b7ffd10,0x3eef7ce1),LL(0xb3fc1b9a,0x53ee63bb),
+ LL(0x81a2703a,0x23c1f744),LL(0xb9859136,0x1a5d075c),LL(0x5afd1bfd,0xa4f82c9d),LL(0xf89d76fe,0xa3d1e9a4),LL(0x75702f80,0x964f7050),LL(0xf56c089d,0x182bf349), LL(0xbe0da6e1,0xe205fa8f),LL(0x0a40f8f3,0x32905eb9),LL(0x356d4395,0x331a1004),LL(0xfdbbdfde,0x58b78901),LL(0x9ba00e71,0xa52a1597),LL(0x55497a30,0xe0092e1f),
+ LL(0x03682f59,0xe5004e80),LL(0xf642ac0f,0xccdb9cb7),LL(0xbd869f77,0x405f50d1),LL(0xe7ebea2c,0xecffa54d),LL(0xd87620ba,0x3354dc22),LL(0xb1c01ff4,0x01bb2988), LL(0xe16477fd,0xd9370076),LL(0x2e71ba4b,0x45303d2a),LL(0x3291e5c5,0xc0de7627),LL(0xf0a7ca55,0x5cfebd87),LL(0x9e592a30,0xde116280),LL(0xa78ebce4,0xdd26e577),
+ LL(0x70ee8f39,0x5562a856),LL(0x64e52a9c,0x86b0c117),LL(0x09c75b8c,0xc19f3174),LL(0x24923f80,0x21c7cc31),LL(0x8f5b291e,0xe63fe47f),LL(0x0dc08b05,0x3d6d3c05), LL(0xee0c39a1,0x58ae455e),LL(0x0ad97942,0x78bea431),LL(0x3ee3989c,0x42c7c97f),LL(0xf38759ae,0xc1b03af5),LL(0xbcf46899,0x1a673c75),LL(0x8d508c7d,0x4831b7d3),
+ LL(0xff1735a8,0x1e9b23b9),LL(0x2b0e4b7b,0xc3bf3d5b),LL(0x59b7721c,0xd4cc00fe),LL(0x9e2f4ceb,0xd5c36f9c),LL(0xc90af70e,0xdeca06ba),LL(0x416ee799,0x42676f12), LL(0x6f748c6f,0x0d7afe1b),LL(0x39c39d55,0x0b7a6de5),LL(0xe6eaed18,0x11e43d6e),LL(0x496087e0,0x5baf8602),LL(0xb1a3a66e,0xf833634f),LL(0x79398677,0x25098c8a),
+ LL(0xc552e354,0x76512d1b),LL(0x273020fd,0x2b7eb6df),LL(0x025a5f25,0xd1c73aa8),LL(0x5cbd2a40,0x2aba1929),LL(0xc88d61c6,0xb53cadc3),LL(0x098290f3,0x7e66a95e), LL(0xaf4c5073,0x72800ecb),LL(0x9dc63faf,0x81f2725e),LL(0x282ba9d1,0x14bf92a7),LL(0xbd5f1bb2,0x90629672),LL(0xa97c6c96,0x362f68eb),LL(0x7ea9d601,0xb1d3bb8b),
+ LL(0xd4720770,0xe141e763),LL(0xddb3b450,0xb9739e70),LL(0x96131446,0x46e6cde4),LL(0xcb6c2ef7,0x0458a5d5),LL(0x532f9fd8,0xb7747634),LL(0x16544457,0xf62d3721), LL(0xd3100854,0xbfacb4de),LL(0xb39d3f62,0x70788a31),LL(0xf22d92e4,0x9b543220),LL(0x55723258,0xaa4590f6),LL(0x01ddb8bc,0xc7b6730e),LL(0x69e1e7bd,0xae252cf8),
+ LL(0xa9c94429,0x73878f7f),LL(0x456ca6d8,0xb35c3bc8),LL(0xf721923a,0xd96f0b3c),LL(0xe6d44fa1,0x28d8f06c),LL(0xd5cd671a,0x94efdcdc),LL(0x3f97d481,0x0299ab93), LL(0x2fd1d324,0xb7ced6ea),LL(0x7e932ec2,0xbd683208),LL(0xcb755a6e,0x24ed31fb),LL(0xe48781d2,0xa636098e),LL(0xf0a4f297,0x8687c63c),LL(0x07478526,0xbb523440),
+ LL(0xdd4b8d8d,0xc618cf0d),LL(0x40dcfbfb,0x471cda86),LL(0x08882ce6,0xba0dd7ac),LL(0x6cd336e7,0x58e5d2f5),LL(0xaf096540,0xcdda8301),LL(0x3cf31600,0xf6d26846), LL(0x2197efd5,0x6150cd98),LL(0x55fb0877,0x4440fbfa),LL(0x90757f1d,0xca31871c),LL(0xbdd756c8,0xc4a1faac),LL(0xcbb8421e,0xc9d4ac1b),LL(0xb17c43be,0x3c0c2914),
+ LL(0x34124b56,0x2e5f7419),LL(0x4b3f02ca,0x1f223ae1),LL(0xe8336c7e,0x6345b427),LL(0xf5d0e3d0,0x92123e16),LL(0x45e79f3a,0xdaf0d14d),LL(0x6f3bd0c6,0x6aca6765), LL(0x403813f4,0xf6169fab),LL(0x334a4c59,0x31dc39c0),LL(0xd589866d,0x74c46753),LL(0x984c6a5d,0x5741511d),LL(0x97fed2d3,0xf2631287),LL(0x11614886,0x5687ca1b),
+ LL(0xaa6fe9ea,0x46fdb65c),LL(0x05494cd9,0xe0d48e5e),LL(0x4afbf837,0x5adef570),LL(0x1c9e2cad,0xc96ba4b9),LL(0x054a158c,0x1e8158f7),LL(0x9e38b88d,0x47be7320), LL(0x6d2993ec,0x9b99971e),LL(0xdf980ecc,0xac9b0bfa),LL(0xd96ca391,0x9da09642),LL(0x9bf4305c,0xd6710536),LL(0xa0dfafae,0x40cc1adf),LL(0xa209699b,0xe27e32f8),
+ LL(0x33836d4b,0x076d902a),LL(0x24afb557,0xec6c5c43),LL(0xa0516a0f,0xa0fe2d1c),LL(0x00d22ecc,0x6fb8d737),LL(0xdaf1d7b3,0xf1de9077),LL(0xd4c0c1eb,0xe4695f77), LL(0xb4375573,0x5f0fd8a8),LL(0x5e50944f,0x76238359),LL(0x635cd76f,0x65ea2f28),LL(0x25fde7b0,0x08547769),LL(0x51944304,0xb2345a2e),LL(0xa16c980d,0x86efa2f7),
+ LL(0x36e87d82,0xeaaddeb8),LL(0x1ffd7210,0xc12587a7),LL(0x731f6838,0xf93d2f5c),LL(0xf7097a65,0xb96594e8),LL(0xb016e8d3,0x08d6717a),LL(0x1984d825,0x9c378de8), LL(0xcb2a0c26,0x627d41e7),LL(0xc697ceb1,0x1f447501),LL(0xc760550b,0x8dc40831),LL(0x7fac97b0,0x70ad4870),LL(0x7021c170,0x5ac7f22e),LL(0x929d5931,0xa6f730e4),
+ LL(0xbf4d1d63,0x4ccbe2d0),LL(0x397366d5,0x32e33401),LL(0x71bda2ce,0xc83afdde),LL(0x478ed9e6,0x8dace2ac),LL(0x763fdd9e,0x3ac6a559),LL(0xb398558f,0x0ffdb04c), LL(0xafb9d6b8,0x6c1b99b2),LL(0x27f815dd,0x572ba39c),LL(0x0dbcf842,0x9de73ee7),LL(0x29267b88,0x2a3ed589),LL(0x15ebbbb3,0xd46a7fd3),LL(0xe29400c7,0xd1d01863),
+ LL(0xd186cb09,0x7d27d71f),LL(0x3bc213c7,0x67cb7f4e),LL(0x6075b2cf,0x418cafeb),LL(0xd93a06f7,0xc0d691e6),LL(0x9dd001b9,0xc16a9525),LL(0x026f17b9,0xa0583230), LL(0x7845900b,0x4c1041b0),LL(0x47a22aae,0x28740791),LL(0x2c1758e9,0x8d08efd6),LL(0xe6c3229a,0x9cc6f207),LL(0x082d8924,0xec69e902),LL(0xf331dfe7,0x9cfa1dea),
+},
+/* digit=5 base_pwr=2^25 */
+{
+ LL(0xabe7c60e,0x8ec4335f),LL(0x0a6a9fb5,0x01f198c1),LL(0x01141ab6,0x3ff96de0),LL(0x2eca98a1,0xb21acc2c),LL(0x10fdf648,0x61548490),LL(0xd1403e8b,0x2c01a99c), LL(0x6fa509d7,0xf1a35f30),LL(0xe3f08e9f,0xf7715fe3),LL(0x7fc9a752,0x89c26c07),LL(0x420d48a0,0x8d2535fe),LL(0x52fe2e73,0x80ec5ddd),LL(0x71704f39,0x041b8df0),
+ LL(0xc65fafce,0x498808ed),LL(0x4e806bc3,0x3676a7cc),LL(0x76c6b964,0x796e25f1),LL(0xac474261,0x1aced64b),LL(0x29a460c1,0xa62470fc),LL(0x5e751e48,0x77501dce), LL(0x6d9e3641,0xcc00053b),LL(0x9a3f5a0b,0x2b5bc4ae),LL(0x3f9ca178,0xddaccc2e),LL(0x0b80d1b0,0xad33f34a),LL(0x64642225,0x6a76df93),LL(0x778e761b,0xc145f36f),
+ LL(0xc10b43ae,0xdffb03ae),LL(0x9433a54b,0x39b1266e),LL(0xb19fe0db,0x4c262521),LL(0x3d5c7fee,0x0ec1e54f),LL(0x05e68e1e,0x2856510b),LL(0xdc80b8a6,0x49382c1e), LL(0x2471bdd5,0x80a50931),LL(0x81974aa9,0xe8cde185),LL(0x28235c52,0xca6112ee),LL(0x301f9653,0xd28a0eb8),LL(0xe11fcdf8,0x22b11e26),LL(0xe4d735f3,0x97e6fc5d),
+ LL(0xecc5f6da,0x9c66a32b),LL(0x1719ba2c,0xe4ff4043),LL(0x21e716ef,0x8c6cfab7),LL(0x96ed74e6,0x32c8fccb),LL(0x0b110c83,0x475890dd),LL(0x5cb4eefe,0xdfada95f), LL(0x93240fe1,0x9d7b89a6),LL(0x210b776f,0x6afdb2d0),LL(0xca7a7d52,0xc3f0b55b),LL(0x55d04585,0xa6e56a06),LL(0x4257acc5,0x818e221c),LL(0xfcb8d39e,0x05207b63),
+ LL(0xac993097,0x00fc2cfe),LL(0x76b4508c,0x4d3532b1),LL(0xa24c9add,0x0887cb17),LL(0x1a9972dd,0x2698a3e0),LL(0x26352346,0xa6f0258b),LL(0x3132792c,0xf6791599), LL(0x92f39495,0x2c3d2ebb),LL(0x3f9e744c,0xf8405894),LL(0x54833968,0xba220301),LL(0xb7936d27,0xa0c5454e),LL(0xb0ca30ec,0xdd9078e1),LL(0x5a80ec29,0xfa5e78ae),
+ LL(0xe68b9c0c,0xc948333b),LL(0x265cb56b,0x96e30042),LL(0x3c12bd22,0x957516bd),LL(0x0033e495,0x0d328473),LL(0xc9e2117d,0x23ff9704),LL(0xe3d28a72,0x81693f98), LL(0xf8066b56,0x7a0ba6c9),LL(0x332bdbe8,0x0e2e2242),LL(0xe9f4ce83,0x885d3c00),LL(0x8ae96eae,0x3145e5ec),LL(0x91e3d14c,0x8d4b26d4),LL(0xa9ad6fe2,0x17b5782a),
+ LL(0xcabd9b94,0x39062094),LL(0xc68dc31e,0x20b3910b),LL(0x0b708450,0x7d78a043),LL(0x522bd0d5,0xe113da29),LL(0xf7f27be8,0xc46fa10a),LL(0x295393a0,0x8258b2ce), LL(0x28d958d8,0xf69dc622),LL(0x991261e9,0x97b796c0),LL(0x36482f74,0xaedea55e),LL(0xeec962cd,0x6e4f2e3c),LL(0x2a06b626,0x782f495a),LL(0xfe23dd4b,0x41e32a4d),
+ LL(0xd8ada6cc,0x0a74da82),LL(0xbea55457,0xc6b98a3c),LL(0x57c2f5ac,0x896c26bb),LL(0x845d45e4,0x981e2f72),LL(0x7e9a7d36,0xca152b87),LL(0x7b582e8f,0x49666d45), LL(0x49fc20b9,0xea3b9bda),LL(0x7c71f153,0x5bcbc84a),LL(0x5748a654,0xd346fc5d),LL(0x622665ee,0x7ac2f217),LL(0xb6f16e27,0xbb5efe7f),LL(0x644c9dc8,0xb1810a70),
+ LL(0x2e4b40f5,0xe0c7946c),LL(0x7dd0f6de,0x7ef21fe5),LL(0xf81f21f3,0xc2a8cdd8),LL(0xc7ebe7a3,0x6ad73e42),LL(0x5d42a7be,0x3e8099c3),LL(0x6df16d22,0x151c6de8), LL(0x5293c104,0x214a649b),LL(0x56b4d1d3,0x769763d1),LL(0xe3bebab4,0x78b33355),LL(0xc78a804e,0xe10a70ce),LL(0x211f735e,0x985a16fe),LL(0x56605fc0,0xfd50c868),
+ LL(0x8f646cdb,0x16bcf31c),LL(0x059f65cc,0xe9b4b8a9),LL(0xf8971dbd,0x34a47964),LL(0xcfe021f8,0xd76f597f),LL(0x573891a6,0x23bab19c),LL(0x2645a244,0xdf670285), LL(0x4347674f,0xcc338b2c),LL(0x4c07ab3e,0x1ddd83da),LL(0x31bf757d,0xee6bb102),LL(0x032ec673,0x3f2828c5),LL(0x0cd7c8f8,0xcf0daf5f),LL(0x56eba0e0,0x1b5d1126),
+ LL(0xdcf6b460,0xd9b864d9),LL(0x5141107c,0xf453164e),LL(0xb019575e,0xac36ccb9),LL(0xa0040dea,0x996c97bb),LL(0x86b7899e,0xf684e539),LL(0x6b00d106,0xb11bb533), LL(0xbe831360,0x86af64aa),LL(0xb21650cc,0xbda68250),LL(0xffd7b0c6,0xc080ad14),LL(0x1a3844b9,0xa7cd582f),LL(0x4531ed01,0x3656ad08),LL(0x0af8481d,0xe12b761e),
+ LL(0x8532b8e4,0x94a35f64),LL(0x2227ce87,0xc2cf81f8),LL(0x7f8ce7c5,0x2c0a163f),LL(0xba5e1907,0xe9de5d0f),LL(0xc1c14999,0x0a58d572),LL(0xd934e441,0x406a3ecc), LL(0xc315d861,0xf9ef9a75),LL(0x864a28bd,0xa18abeae),LL(0x60831100,0x9e65f3c3),LL(0x2d4749cd,0xf757107b),LL(0xe8d782bb,0x8fec38eb),LL(0xbe94b2ae,0x74b4d444),
+ LL(0x59480d9b,0x796fc73b),LL(0xe0555912,0x9f33407a),LL(0xbcd9a4bb,0xbc428d52),LL(0x82ac0b57,0xffe3b15b),LL(0xab58a714,0x0f4cbd0a),LL(0x353b82bf,0xe3b57ece), LL(0xf77aa72a,0x67e16b95),LL(0x112a81cc,0x7b5d3eda),LL(0x8d749470,0x6795b775),LL(0xfe097d37,0x334bb4fc),LL(0x64deebc3,0x0489c0ce),LL(0x85092a86,0x0cf28e29),
+ LL(0x29843096,0x0cc8d80b),LL(0x6aaf8c7c,0x1f5107d7),LL(0xd1647601,0x6fb26e1a),LL(0x2e2ca8c0,0x66da08d5),LL(0x34d9e92a,0xac0a6fbb),LL(0x52203763,0x596cc78b), LL(0x8e88a471,0x145521ab),LL(0x64bde8f6,0x9bdbd482),LL(0x01b4d2ea,0x5a4d25bd),LL(0x6e7152ae,0xef1fc362),LL(0xfba5462d,0xd188389a),LL(0xf01d497c,0x951d4667),
+ LL(0xbcc5466f,0x294045fb),LL(0x039461a1,0x145c2078),LL(0x2a620ace,0x21c890c8),LL(0x896d0458,0x1ecc5928),LL(0xd3f9fb46,0x14130b9c),LL(0x461506dc,0xf001b3c2), LL(0x97a1b5c2,0xd90a95e2),LL(0xdf6487be,0x9e37948e),LL(0x3b165a95,0x00ce787c),LL(0xe49c468d,0x10d4f2a6),LL(0xacd25333,0xf0f26eb8),LL(0x63f3570b,0x25b513b0),
+ LL(0x9bc5917b,0x98d08981),LL(0x187fac5d,0x9f90885d),LL(0x7cfc13db,0x651b1828),LL(0x8655a658,0x2d606e4c),LL(0x63c91b71,0xba64d3c5),LL(0xb82a5090,0x36c7d7d8), LL(0xcab1d598,0x2d1dff02),LL(0xbe78f90d,0xa95788d7),LL(0x0ea1fe01,0x1ac2ee6b),LL(0xd5c1273c,0xc100b60c),LL(0xeae603e7,0x4496084c),LL(0x77c2fdfb,0x7fcaaf5f),
+},
+/* digit=6 base_pwr=2^30 */
+{
+ LL(0x6abdd842,0xe8e3225a),LL(0x3b367b02,0x8c85f18f),LL(0x9f42edb9,0xf147a421),LL(0x0d411d4d,0x6d4bc00d),LL(0x70014bb4,0xa1a13a27),LL(0xfa10166f,0xb896d97b), LL(0x0c302c6d,0xb2a1dfa7),LL(0x808a63a4,0x0a24bd5d),LL(0xf88c7359,0x8409a3a2),LL(0x347726a0,0x071f3838),LL(0x27507bb9,0xd18a551c),LL(0xb359b167,0xe0c4cc34),
+ LL(0x80e9d9f3,0xa44f6ef8),LL(0x1d14d618,0xaa7621e9),LL(0x0eaf6671,0xcb0e4ed8),LL(0x181514a2,0x2bf485f8),LL(0x0a2927ea,0x74670e18),LL(0x12c14645,0xe1b54616), LL(0x2a67ed61,0x4068c074),LL(0x739063ca,0xd10c7a57),LL(0x698b2816,0x391b651d),LL(0x6da14fa8,0xf310d169),LL(0xd8a578b1,0xa089be6b),LL(0x44389ad7,0xa314b3a8),
+ LL(0x68ed0760,0x664ff053),LL(0x38fae9fe,0xc3cdc991),LL(0xf1f30a86,0x3fe057aa),LL(0x2d08c72a,0xbae99022),LL(0x6f09e13f,0x4f5faf3f),LL(0x13d26b29,0x44461a44), LL(0xf95418ed,0xc2504c1b),LL(0xdb3ff26c,0x12766ea7),LL(0x07a22399,0x2f956e95),LL(0x5a00cdd3,0x2716e70f),LL(0x0e9fba99,0x80c02014),LL(0x0519875d,0xbe587ac3),
+ LL(0x70128295,0xba86aec1),LL(0xc12f35ce,0x83a09b65),LL(0x89df2f80,0x8978ff07),LL(0x97a773d5,0x85750cfd),LL(0xfc3f35f6,0x806bb730),LL(0xfed868c9,0x04503422), LL(0x86ffdbae,0xdc0fcde0),LL(0x1860f43b,0x8f4297e1),LL(0x8d3ad6cd,0xfefb7d02),LL(0x97293550,0x5c652b59),LL(0xed5cfbba,0x32e12942),LL(0x98800d22,0x06192aaf),
+ LL(0x3c9eb0ca,0xccf0fb42),LL(0x4aa03b40,0x8703c669),LL(0x4001af07,0x44c735a7),LL(0x2e874ed1,0x9616dd93),LL(0x474ba621,0x5c2e8520),LL(0xfa93d8b4,0xddf13cd3), LL(0x75df1b67,0xd68c9b45),LL(0x8f80d389,0x4cd24228),LL(0xc09f47fc,0x0f1a16bc),LL(0x9cd4842a,0xc414dc6a),LL(0x1f353c6d,0xbb0fa94f),LL(0x1950d073,0x40512455),
+ LL(0x4d2edd5f,0x935b9e24),LL(0xefb287b8,0xfeb46fb5),LL(0xf5018b92,0xa51700a3),LL(0x23864e2a,0xc328beba),LL(0x995f70c1,0x113b5c9a),LL(0xda1b5d51,0xc0b11c22), LL(0xf4a360cb,0x9b99b907),LL(0xadf0b094,0xf4ee9995),LL(0xf94b3f0e,0xf67c7cf2),LL(0xdcaf10cc,0x664a51a1),LL(0xe937a669,0xa3709ccc),LL(0x4862f098,0xea97bace),
+ LL(0xc942a3f5,0x51758334),LL(0x32182ba6,0x7cc01e88),LL(0x74de4fe6,0x772af257),LL(0xe9667bf8,0xb1b3c448),LL(0x8079caf6,0x71cb2738),LL(0x1d823a40,0x48890c64), LL(0x0e9edbda,0x47a5887b),LL(0xbe089e5a,0x916dfb0c),LL(0x1eb42ddf,0x3185090e),LL(0xb7f3af26,0x3c7eaa13),LL(0x9e9963b2,0x940ed8c7),LL(0x3426ac10,0xd85e77db),
+ LL(0x2efffd95,0x162cdf34),LL(0xd59086e8,0x92111fda),LL(0x454eb977,0x4478d114),LL(0xdea38a67,0x8ce403d8),LL(0x7435728a,0xd459633b),LL(0xa63b0504,0x3a7be4e3), LL(0x335dba3e,0x0c74066b),LL(0xc6ea6ee5,0x4e8fb1d7),LL(0xa99690ed,0x3398b588),LL(0x3ad77562,0x4949517c),LL(0xcbbb60ee,0xf9824f09),LL(0x85660bec,0x9fdcafdf),
+ LL(0x8875d9e8,0xf26bd861),LL(0xbea9c273,0x22e2380d),LL(0x91995508,0x5f151837),LL(0x648aa1c6,0xb97f40a6),LL(0x3977d848,0x7478f5f8),LL(0x35b57de6,0x21e876ae), LL(0xa93fc7f6,0xf620b180),LL(0x1b148996,0xf49bd07e),LL(0x1c4f60e1,0xfb085726),LL(0x7ad6b84d,0x6a6653af),LL(0x2e05b686,0x913a2d02),LL(0x407dda9a,0x94746629),
+ LL(0xda684157,0xb8465d16),LL(0xb238faae,0xdadde1ab),LL(0xc6b9bea8,0xe2cd45e7),LL(0x5cf413d5,0x7251d4a1),LL(0xaae1765b,0x615cea8b),LL(0x13f36885,0x75aa8318), LL(0xb8767cc1,0x7d5b0bf7),LL(0x8022968c,0xec38a8ff),LL(0x2a07faeb,0x034805b6),LL(0x33b7321e,0x916f9eb0),LL(0xc0c577ce,0x34963633),LL(0xabb8d3ce,0x8ee07efd),
+ LL(0xa8a29345,0xa0bd6c0d),LL(0x5d7f5ef9,0xc676b6c5),LL(0x20ad7259,0x303b6d7c),LL(0xd8fe09a7,0x06542a19),LL(0xa959014a,0x5a06653c),LL(0x5bcfe0cb,0xf45fd79a), LL(0x4e583468,0x29058d98),LL(0x0cd7afc0,0xf1bd25e6),LL(0xf7dbe54c,0x2a88246e),LL(0x35e0ef3d,0x680eaff8),LL(0x726e59b9,0x5942c97f),LL(0x8d5c0825,0x43e97139),
+ LL(0xa406d4d7,0x2daddb11),LL(0xa2a33d81,0xb02b5da5),LL(0x21a6aa89,0xb73ce827),LL(0x467506de,0x10919587),LL(0x428d8daa,0x0927724c),LL(0x7c17adfd,0x0ede991f), LL(0xbf7ddb3d,0x8518dab1),LL(0x2a54e1b8,0x04b091c4),LL(0x89e7a398,0x5943c37f),LL(0xe273f6f3,0x8e63f5e8),LL(0x83143d22,0xc6d0352b),LL(0xebd1628e,0x30e43182),
+ LL(0x9991167e,0x606658a9),LL(0x72c4b43d,0xb8773e15),LL(0xe025abce,0x6cb364cd),LL(0x0c5a653e,0xafa58e9b),LL(0x134a68bf,0xa7e35a54),LL(0xba4d9db6,0xcb831d42), LL(0xde83ef97,0xae37348e),LL(0x62ddd553,0x4ac64a6a),LL(0x715bb6b4,0x5feb5e0d),LL(0x043424b2,0xf876efae),LL(0xad91a9ef,0x7b56a291),LL(0x356f3ade,0x817c7053),
+ LL(0x8dff7dff,0x3d6e8d6d),LL(0xd5be4ad1,0x6b6c194a),LL(0xb6fcd08b,0x57b93f2d),LL(0xf3761f23,0x99f09948),LL(0xac8b018f,0x4062f3d6),LL(0xa27af72c,0x4b58ac05), LL(0x04d0cdfd,0x4abcc815),LL(0xbda4b02f,0xa50043e0),LL(0x27a9c083,0xe11297e5),LL(0x9779c5b3,0x2b2d8d52),LL(0xdfdecfed,0x3de3d330),LL(0xae7fc522,0xfe2487ca),
+ LL(0x8f7a83e5,0x1c2fc508),LL(0xb9970c92,0xa7c56233),LL(0x8bafa66f,0x949c7173),LL(0x5bbb0490,0x1e299b2d),LL(0x18fcb9e8,0xb9a79e7c),LL(0x9cb5cc50,0xe6372ce6), LL(0xf465c6aa,0x114fc628),LL(0x8cb797f6,0xc5539520),LL(0xa73ad211,0x7df94ed7),LL(0x8e0cd008,0x41eb8e1f),LL(0x004cbb0d,0xb028725a),LL(0x372c1656,0x1340186d),
+ LL(0x978029bb,0x4074ee27),LL(0xbae0d0c0,0xa9394bda),LL(0x72cecb4b,0xaa01d539),LL(0x9a7dd9c4,0x4b0cf127),LL(0x5bc787cf,0x3e3e3f16),LL(0x942de53f,0xdf48f7e1), LL(0x567b9d0e,0x0cc69719),LL(0x8d0d2750,0x631e3315),LL(0x92314a09,0x9fedc1e2),LL(0x14a1adcb,0x7547d226),LL(0x8662b86a,0x405561a4),LL(0xf5480b7d,0x149fa2b1),
+},
+/* digit=7 base_pwr=2^35 */
+{
+ LL(0xbda4aaa7,0x923d0b44),LL(0xfee29f7b,0xced14ce4),LL(0x9cf5b87d,0x1656be00),LL(0x1d61103d,0x13a37d0d),LL(0xfb652393,0x1d705880),LL(0xed712ed8,0x870a31bb), LL(0xad7c21e3,0x15ad02e6),LL(0xc36c2831,0xf004e447),LL(0xba2b3ffd,0x56aa376c),LL(0x9745443c,0xc3be2b2f),LL(0xeb903660,0x47c8a870),LL(0x6c6c192d,0x976c303e),
+ LL(0xf4fb80d4,0x148bd39c),LL(0xfff04e65,0x469b208c),LL(0xce548415,0xf397fbe2),LL(0x87fdde9f,0x441e5c2c),LL(0xfee9c179,0x6366b49f),LL(0x2938dc71,0x38d02bd3), LL(0xc49c5444,0x26d450fa),LL(0x2b23d3d7,0x4569f95d),LL(0x298fd876,0x5f68bf4d),LL(0x544768b6,0xe86df047),LL(0xf8491267,0x40b69a32),LL(0xf917c71a,0xcbf3adf9),
+ LL(0x8125489c,0x32498d4d),LL(0xa5a46ae0,0x965e8d07),LL(0xe96a7e29,0x6cea5e47),LL(0x668039ff,0xf78293a4),LL(0xf63edd32,0x62548a96),LL(0xa83e8256,0xe8e6af95), LL(0x0db6263b,0x76e60c3b),LL(0x21b3d668,0xa1ee4b06),LL(0x9e49b0b5,0xa17dbf8b),LL(0x7eb366fd,0x4b29ba12),LL(0xd29b565f,0x5e0ed781),LL(0x199b36f9,0x8cb50d53),
+ LL(0x29aa3150,0xa66c7035),LL(0x479e61fc,0xd038a5ab),LL(0xb5ab5410,0xdee33e96),LL(0x7c57d123,0xd068929c),LL(0xf1d6ad37,0x0839a208),LL(0x123f8178,0x8f523dab), LL(0xa67d3840,0xb3e5e524),LL(0x52eb59df,0x88bda75e),LL(0x389f2dd3,0x513a0ab7),LL(0x890bba6f,0x3197a145),LL(0x6f66bf09,0x61add75b),LL(0x4eef1722,0x5c9dfc15),
+ LL(0x07769b1b,0x66dc2850),LL(0x4d71fac4,0xe07fb741),LL(0xc2abbe60,0x5ae688a6),LL(0xdcbfd296,0x08ae92fa),LL(0xb43044d1,0xbc291256),LL(0x9fcdf213,0x0e1d71ed), LL(0x02485685,0xf0c5b281),LL(0xe3f68f42,0x5d3f9302),LL(0xffe4f036,0xbbbfac50),LL(0x74fdba44,0xb5b5f261),LL(0x0d746760,0x4ebe1d07),LL(0xc37f04b7,0xbb0f7812),
+ LL(0x6df1199d,0x810b6ab3),LL(0xb4f293b7,0xc229308b),LL(0x89897750,0x3cf838dd),LL(0x7a336c9a,0x3e391e4e),LL(0x176f89c0,0x70148337),LL(0xbc4f1e22,0x54b15bac), LL(0x2c0f2885,0x32b104f9),LL(0x67034f2a,0x2c39cefa),LL(0xbf178ac1,0xb8310437),LL(0xc99370d5,0x722299f5),LL(0x332b93a8,0x0a493cf0),LL(0xa420f719,0x00e0ab41),
+ LL(0x4cab24da,0xf2592543),LL(0xe7c3b9c5,0x52be9bbc),LL(0x4660d1a0,0xaab7a8b6),LL(0x9a9600f4,0x09738b81),LL(0x37de9e3c,0x58f0c866),LL(0x5db31f4f,0x0aea5cc1), LL(0x499868be,0xe480406f),LL(0xf6913a44,0x0d8fc7f0),LL(0x35f2e14e,0x72823644),LL(0x45e37a93,0xb147b310),LL(0xf15c1af7,0xb1e7aa5b),LL(0xb03e7713,0xa8685068),
+ LL(0x21c34c2b,0x21feb7fc),LL(0xddb0140e,0xab6a553a),LL(0x24b04e6f,0x03a65576),LL(0x342cb0ad,0x2531f186),LL(0xa24f6426,0x088c4d54),LL(0x06a873ea,0x9a0ee15c), LL(0xd33bc748,0xdbe0253f),LL(0x5db8ac9e,0xdad3339f),LL(0x73e65901,0xeaaf3681),LL(0xccbfa504,0x71f1fab2),LL(0x4b0e163e,0xb7b84522),LL(0x3c779f3b,0xe0fca837),
+ LL(0x46baf373,0x710988eb),LL(0xb57d5018,0x8cceb935),LL(0xa45fdf17,0x1864603f),LL(0xef48e6d0,0x3dcaae73),LL(0x590322c5,0xadd9420b),LL(0x9b135f67,0x947783e3), LL(0x8bf5049f,0xfde76368),LL(0x2caa4023,0xf00e4c18),LL(0xd355b3d6,0x4d3b0f23),LL(0x20d5799d,0x181fabcc),LL(0xab2ad0af,0x29499b40),LL(0xf9a938aa,0xf6e66328),
+ LL(0xbcbe922d,0xcd7b3c42),LL(0x95dd1a5c,0x2fe02b3b),LL(0x24ef5c38,0xeb66bcbd),LL(0xe579c309,0x7edcc21c),LL(0x16f6c900,0x7b19d491),LL(0xb6317c2c,0x36019ecd), LL(0x91d9001c,0x554ba553),LL(0x14f31e44,0xa5e30b98),LL(0xffda4032,0x3d1fe33b),LL(0x2306675c,0x5dfec478),LL(0x000c91e7,0xbe59305e),LL(0x25a6b879,0x3c4e52a3),
+ LL(0xc5ea88ac,0x02fcc14e),LL(0x56d093b6,0xca29bb6d),LL(0x0e6fe94d,0x876aeda9),LL(0xd7225a9d,0xfa11a142),LL(0x3d03fed8,0xfea3ca05),LL(0xc54d5962,0x435854c6), LL(0x54a6dfd5,0xd7707374),LL(0xa3e55d02,0xb8960017),LL(0x04d65c3e,0xd4015a0c),LL(0xe98a1204,0x397f93d1),LL(0x5f3ed850,0xb0efa2e5),LL(0x8a3ec67b,0x18f24469),
+ LL(0xd62cd9f9,0xa35802f5),LL(0x4148436e,0x0ca9c15d),LL(0x472b9d21,0x261a991d),LL(0xa2f8e875,0xd81a1ed6),LL(0x699b6d63,0x942f213a),LL(0x0ae57758,0x041a12fc), LL(0xbd70aabb,0x61191c82),LL(0xee4c23b3,0x3776eb8b),LL(0x52511222,0xabe23e86),LL(0x30dabb91,0x66dd967d),LL(0x7ed27424,0x77650c59),LL(0xab25a050,0x08ea2ebd),
+ LL(0xb6cb5a02,0xa410ba3a),LL(0xd07c5c6b,0x6eb40d15),LL(0x07dcc811,0x0de81e91),LL(0x2631b7af,0x996f46eb),LL(0x5b7a22f3,0x5a350ba7),LL(0x634159af,0xf42b24e7), LL(0xc30952fd,0x07bae0ab),LL(0xd644e0b0,0x3488cda2),LL(0xe2111e12,0x23ae40d0),LL(0xc80cdb56,0x650af54e),LL(0x7d4aa2a8,0x0f33a30b),LL(0x442a00e8,0x4e8d3e98),
+ LL(0x59a8bc95,0xa624ab37),LL(0x1c971228,0x4b7e3fa6),LL(0x73aa694b,0xe8229c42),LL(0x779288ab,0x0cc31029),LL(0x57575e0e,0xf8eff30f),LL(0x7d52803e,0xee5e0194), LL(0x8a78f632,0x32d87e55),LL(0xe454904e,0x48a06031),LL(0x16c6e626,0xaa2cb8dd),LL(0x2c140452,0xadd098ac),LL(0x2d3031b1,0xd25f285d),LL(0x75b59543,0xfb5fbbe1),
+ LL(0xd7a21503,0x2297041f),LL(0x657f03f0,0xfe7738c2),LL(0x168fa34a,0x994a8deb),LL(0xa53c4fdb,0x0c772e02),LL(0x50124cd3,0x67f835d1),LL(0x6993cbbe,0x0e0d2635), LL(0x5257f11d,0x9857ed84),LL(0xac556942,0xdc23a728),LL(0xdeb32a7f,0xf0e1bb29),LL(0xee0d70f4,0xb8c3c43f),LL(0xc60ad214,0xc294b0ef),LL(0x679067ca,0xa4d438dc),
+ LL(0x05c755e4,0x520b0bb9),LL(0xf89f0048,0xa2c2c59b),LL(0x73c23975,0x85c1c73a),LL(0x783aabba,0x6e4dec49),LL(0xb0463155,0x69f0c69b),LL(0x9c97b17b,0x61a42b94), LL(0x45d331a3,0x55af24a9),LL(0xf5fe81fd,0x4b0e63f8),LL(0x708671c4,0x4034283d),LL(0x5fd9001a,0x200ddab3),LL(0x342eaf3b,0xe45f28e4),LL(0x1ba936c4,0x3e8375b4),
+},
+/* digit=8 base_pwr=2^40 */
+{
+ LL(0xec074aea,0xb083ba6a),LL(0x7f0b505b,0x46fac5ef),LL(0xfc82dc03,0x95367a21),LL(0x9d3679d8,0x227be26a),LL(0x7e9724c0,0xc70f6d6c),LL(0xf9ebec0f,0xcd68c757), LL(0x8ff321b2,0x29dde03e),LL(0x031939dc,0xf84ad7bb),LL(0x0f602f4b,0xdaf590c9),LL(0x49722bc4,0x17c52888),LL(0x089b22b6,0xa8df99f0),LL(0xe59b9b90,0xc21bc5d4),
+ LL(0x51c2bb65,0x6f577529),LL(0x4b874bdb,0x4a0c1c28),LL(0x78b96c6d,0x19a18427),LL(0x2f593505,0xa674f992),LL(0x6b7209d6,0x5abeeec4),LL(0x47cf5fff,0x42d15d01), LL(0xb49e3b4e,0xe24509b7),LL(0x639ee6e8,0x81be939c),LL(0x5761e8e3,0x7f7daf59),LL(0xd420a288,0xed5cfcb8),LL(0x7a0ff696,0x365b29eb),LL(0x99a1ac8f,0x7d146805),
+ LL(0x8a31973f,0x4936c6a0),LL(0x83b8c205,0x54d442fa),LL(0x5714f2c6,0x03aee8b4),LL(0x3f5ac25a,0x139bd692),LL(0xb5b33794,0x6a2e42ba),LL(0x3ff7bba9,0x50fa1164), LL(0xf7e2c099,0xb61d8643),LL(0xbd5c6637,0x2366c993),LL(0x72eb77fa,0x62110e14),LL(0x3b99c635,0x3d5b96f1),LL(0xf674c9f2,0x956ecf64),LL(0xef2ba250,0xc56f7e51),
+ LL(0xadcdaa68,0x9ee1ec3a),LL(0xdcbb6548,0xd98c498f),LL(0x88102ac0,0x32b97375),LL(0xc08527f4,0xdd296cf9),LL(0xfae3dfbe,0xb74f8145),LL(0x6cd7cc4f,0x84131eb9), LL(0x927ff15b,0xa0f2fe7a),LL(0xeee1a4b4,0x6b0ade4d),LL(0x0eeb90a7,0x6e7df2d4),LL(0xbe4de684,0xe2f46e20),LL(0x3fdd06bc,0xcd28feba),LL(0xe6d6d9f6,0x8e4205ae),
+ LL(0xff602c1b,0x246ffcb6),LL(0x6e1258e0,0x1e1a1d74),LL(0x250e6676,0xb4b43ae2),LL(0x924ce5fa,0x95c1b5f0),LL(0xebd8c776,0x2555795b),LL(0xacd9d9d0,0x4c1e03dc), LL(0x9ce90c61,0xe1d74aa6),LL(0xa9c4b9f9,0xa88c0769),LL(0x95af56de,0xdf74df27),LL(0xb331b6f4,0x24b10c5f),LL(0x6559e137,0xb0a6df9a),LL(0xc06637f2,0x6acc1b8f),
+ LL(0xf4a59550,0x9ad73168),LL(0x8409d7af,0x2a488d69),LL(0x30b3a5f4,0x9e946c2d),LL(0xc89723d5,0x7bc4ced7),LL(0xbd31f607,0x79f514a1),LL(0x3a274341,0x7d493f59), LL(0xd45d55d1,0x7eb01027),LL(0x14735d1e,0x63f76909),LL(0x35be21cb,0x718d760f),LL(0x7c793331,0xba58160b),LL(0x8d30d29e,0xfbc0ce1f),LL(0xc6f4b03a,0x4645c0c2),
+ LL(0x34b4e381,0xbd8c0868),LL(0x30dff271,0x278cacc7),LL(0x02459389,0x87ed12de),LL(0xdef840b6,0x3f7d98ff),LL(0x5f0b56e1,0x71eee0cb),LL(0xd8d9be87,0x462b5c9b), LL(0x98094c0f,0xe6b50b5a),LL(0x508c67ce,0x26f3b274),LL(0x7cb1f992,0x418b1bd1),LL(0x4ff11827,0x607818ed),LL(0x9b042c63,0xe630d93a),LL(0x8c779ae3,0x38b9eff3),
+ LL(0xf78d33ef,0x35d47426),LL(0x8440c42c,0x4af25db2),LL(0x2e91bf5e,0xbd6a15e2),LL(0xc08b6b1a,0xe366a84c),LL(0x55b97de8,0x759c122f),LL(0x08a03f29,0xecec558f), LL(0xea9d2060,0xdcc9fca2),LL(0x9f361fe1,0xb3e49b8e),LL(0x9b59cd04,0xdeae3902),LL(0x6f5e5bd4,0xf532ede0),LL(0x36099f4d,0x84fbeeb9),LL(0x088d2052,0x73576b1f),
+ LL(0x729c5431,0xe8767d36),LL(0xbb94642c,0xa8bd07c0),LL(0x58f2e5b2,0x0c11fc8e),LL(0x547533fe,0xd8912d48),LL(0x230d91fb,0xaae14f5e),LL(0x676dfba0,0xc122051a), LL(0x5ea93078,0x9ed4501f),LL(0xbd4bee0a,0x2758515c),LL(0x94d21f52,0x97733c6c),LL(0x4ad306a2,0x139bcd6d),LL(0x298123cc,0x0aaecbdc),LL(0x1cb7c7c9,0x102b8a31),
+ LL(0x139a9f83,0x2b85dd03),LL(0xf55cbff9,0x02740ec2),LL(0xdc3bd5f6,0xdca3616a),LL(0xa5da9b2c,0x52843de5),LL(0x1e22c1cb,0x7ee7890a),LL(0x4aee5c76,0xd5cf1511), LL(0xc7234c24,0x86d70af0),LL(0x6b6a709f,0x1735378b),LL(0x423f32e5,0x9989ed21),LL(0xe739b1fd,0x4675a4ff),LL(0x304ce529,0x873edb62),LL(0x7f1db13e,0x60b6624a),
+ LL(0xfaf46675,0x22a28e59),LL(0x10a31e7d,0x10757308),LL(0x2b4c2f4f,0xc7eeac84),LL(0xb5ef5184,0xba370148),LL(0x8732e055,0x4a5a2866),LL(0xb887c36f,0x14b8dcdc), LL(0x433f093d,0xdba8c85c),LL(0x1c9a201c,0x73df549d),LL(0x70f927d8,0x69aa0d7b),LL(0xd7d2493a,0xfa3a8685),LL(0x0a7f4013,0x6f48a255),LL(0xdd393067,0xd20c8bf9),
+ LL(0x6b512bc6,0xee43828c),LL(0x50b91e60,0xf73dc9f5),LL(0xf5dbde6b,0x68f23f30),LL(0xddd15e00,0xaf2fe9e3),LL(0x86578d49,0xfbf34dae),LL(0x6c130010,0x68979655), LL(0x09942897,0x137a5fc3),LL(0x9959f06d,0xff1f0bfe),LL(0xbd7ee14b,0x2dd0a04a),LL(0xe54e2161,0x59c46072),LL(0xea7518ad,0xf470bdae),LL(0x40c471cd,0xce556e43),
+ LL(0x81625e78,0x4ec874ea),LL(0x3fbe9267,0x8b8d8b5a),LL(0x9421ec2f,0xa3d9d164),LL(0x880ea295,0x490e92d9),LL(0xd8f3b6da,0x745d1edc),LL(0x8f18ba03,0x0116628b), LL(0x834eadce,0x0ff6bce0),LL(0x000827f7,0x464697f2),LL(0x498d724e,0x08dccf84),LL(0x1e88304c,0x7896d365),LL(0x135e3622,0xe63ebcce),LL(0xdc007521,0xfb942e8e),
+ LL(0x829ee0c7,0x6b97dae4),LL(0xf274bc7d,0xcaaad7e3),LL(0x512f7d86,0x87bee424),LL(0x3f7b0dde,0xb5a03e5b),LL(0xf9fca5a8,0xc29db9c1),LL(0xede64af8,0x538a6f8b), LL(0x8b3c715f,0x0e518ba8),LL(0x3cb5b861,0xc1cb4c31),LL(0xc76dbfa0,0x5cd61604),LL(0xffdac22e,0xc557e50d),LL(0xf67b53e8,0x7892fc51),LL(0xea7c141c,0xa42f85c1),
+ LL(0xa3688621,0xbb155a66),LL(0xf91b52a3,0xed2fd7cd),LL(0xea20cb88,0x52798f5d),LL(0x373f7dd8,0x069ce105),LL(0x8ca78f6b,0xf9392ec7),LL(0x6b335169,0xb3013e25), LL(0x6b11715c,0x1d92f800),LL(0xff9dc464,0xadd4050e),LL(0x8465b84a,0x2ac22659),LL(0x465b2bd6,0x2729d646),LL(0xe4eff9dd,0x6202344a),LL(0xcd9b90b9,0x51f3198f),
+ LL(0x22b25f2e,0x2ba8c790),LL(0x1af0f4a8,0xf4670a51),LL(0x2fc2451e,0x6842f36a),LL(0xbb91e1e3,0xfc5c9558),LL(0xc3ead762,0x035d1dfc),LL(0x031e5556,0x3d0721cb), LL(0x3af18a2e,0x3af0cc81),LL(0xbd11a363,0x7888cee2),LL(0x6ade1d12,0x80c3de0a),LL(0x93b2dcb5,0xe8c3a5bd),LL(0x90a2214d,0xe3adbd7c),LL(0x1192948d,0xfe8646d5),
+},
+/* digit=9 base_pwr=2^45 */
+{
+ LL(0xba958101,0x65026297),LL(0x8eef151d,0xbeb4adf9),LL(0x60c8bbf7,0x623763a4),LL(0x8b2a7120,0xfa8f5ad7),LL(0x085497e7,0xfd744bdf),LL(0x2ba35618,0xf9b6f97e), LL(0xf8a15e86,0x0cebfe9d),LL(0x29576088,0x47a6d013),LL(0xfcf19627,0x655817a3),LL(0xc2f11261,0x30ab44f7),LL(0xddf2c850,0xbb001c9d),LL(0x073260c3,0xb45c7eff),
+ LL(0xe2319f38,0xfa7d1236),LL(0xa551d3fe,0x9ba1a1c0),LL(0xbeb1282b,0x9ea27288),LL(0x07fee8a9,0x1c069efa),LL(0x5870fee9,0x5749c7b5),LL(0xafcec6fa,0xbedca76f), LL(0x4c63c5e2,0xa3f8f1b1),LL(0x94758ac3,0xaa1bb156),LL(0xb59dc06e,0x753329a9),LL(0x98a92c38,0xfa8e5f5b),LL(0x3c2b4662,0x6b6f46fd),LL(0xec04c6c6,0x716f41a1),
+ LL(0x59b11c7a,0x0430af77),LL(0xd4f47aca,0xf71cc5b1),LL(0x12e9190f,0xe1a7905f),LL(0x12db9e14,0x1c689b70),LL(0x0abaeeac,0x6bdd3dc9),LL(0x504f0319,0x97f1c244), LL(0xa7a54b51,0x874afd61),LL(0xe3d979b8,0xd4604ecb),LL(0xebf4aab1,0x0d33eee1),LL(0x1aa49fe6,0xa3631cac),LL(0xf2217cfd,0x0d8340fb),LL(0x423b7e77,0xf6373284),
+ LL(0x9563e3bb,0x78a53b5a),LL(0x86af355c,0x19c75eb2),LL(0x019a6f8e,0x3520f427),LL(0xdc3ad0ba,0xde6fcad6),LL(0x79745b7c,0xfec96e4f),LL(0xb133f2dc,0x5e566bbd), LL(0x26561be7,0x50088a2b),LL(0xc5fddfc7,0x16275b4c),LL(0x23ae4b9d,0xf21332ff),LL(0x85246712,0x8cbc659e),LL(0xf50b515e,0x27fa9c8d),LL(0x494ac8b7,0x25ecf745),
+ LL(0x641e3bd1,0x437b7224),LL(0x80a58460,0x84e39f79),LL(0x09759523,0x68e52927),LL(0xe77f5904,0x0176a3ac),LL(0xe151e242,0xde92fb15),LL(0xeb1438d4,0x79965c9a), LL(0x596700b9,0x318a810a),LL(0xc2198cbe,0xa8a6ec57),LL(0xbf030fd2,0xd7709aaa),LL(0x72f5d326,0xb4320234),LL(0xb03bce50,0xc9945214),LL(0xd4ecba09,0x0bc06d9b),
+ LL(0x96fffb94,0xa1972c21),LL(0x99d7633b,0xbe040930),LL(0x7e23d66e,0xb116ff40),LL(0x949a19f1,0xcb12b2bb),LL(0x79e49e91,0x75df10ee),LL(0x4890bcf4,0xa3bf9076), LL(0x09a30252,0xcbaa76a6),LL(0x0ee5728e,0x17c224a9),LL(0xf4f3f4cb,0xcbc56e5c),LL(0x4fe868a5,0x8a07110f),LL(0x25e110a2,0x23289f21),LL(0xd7693c45,0x0289c12b),
+ LL(0xf184c91f,0x06ba6db1),LL(0x45fd0382,0x3c0a348a),LL(0x4434b527,0x0d535b6e),LL(0x692bae0b,0x7bbfa2c8),LL(0xbe7fe51c,0x5c59a08e),LL(0x36e80cb8,0xbaa7d2be), LL(0xbed3cae8,0x8a42d8d1),LL(0x15ff4962,0xd9e0bc0d),LL(0x644c75ff,0xe51fce93),LL(0xb9392d63,0x40222561),LL(0x023b4787,0x8ab1d286),LL(0xa1b3190d,0xfa85c220),
+ LL(0x2b0c535b,0x29864753),LL(0x70506296,0x90dd6953),LL(0x216ab9ac,0x038cd6b4),LL(0xbe12d76a,0x3df9b7b7),LL(0x5f347bdb,0x13f4d978),LL(0x13e94489,0x222c5c9c), LL(0x2680dc64,0x5f8e796f),LL(0x58352417,0x120e7cb7),LL(0xd10740b8,0x254b5d8a),LL(0x5337dee6,0xc38b8efb),LL(0x94f02247,0xf688c2e1),LL(0x6c25bc4c,0x7b5c75f3),
+ LL(0x938e2480,0x1213a2fc),LL(0xed7b85a1,0x2dff0ea8),LL(0x0cc9619f,0x4f280c74),LL(0x66678817,0x3a215bc5),LL(0x327985a8,0xa51602ca),LL(0x10f02615,0xd6916920), LL(0x3dc4f2b6,0xd01274aa),LL(0x3ff804d1,0x40feccd7),LL(0xa2100fa4,0xe508a27c),LL(0xd90cc776,0x37cc757e),LL(0xb74827c4,0xaec4884b),LL(0x4ac34a27,0x0c904582),
+ LL(0xf761baaa,0x6ad3f9d3),LL(0xa5ae6088,0x3936d0d9),LL(0x83a0dd41,0x54d5bff0),LL(0x70cfa7fe,0x418c4b20),LL(0x892317fc,0xdc4d4742),LL(0x265359a1,0x1248e2c0), LL(0x2120ad82,0xa14ee83c),LL(0x89260c26,0x048b7b27),LL(0xb5fe2775,0x637e71d5),LL(0xf3e08f62,0x849213d5),LL(0x5a9faeb1,0x8a8a2da8),LL(0xef96612f,0x57047761),
+ LL(0x027a3ba4,0x7608efa7),LL(0xcf450422,0x14cb67ad),LL(0x5330ef70,0xc55a7aae),LL(0x64901358,0x3f18a78d),LL(0xfeb668df,0x264d3a5c),LL(0xbcf7c23b,0xdc0569c0), LL(0x6ae18907,0x93af8a9b),LL(0x24b8e961,0x55dd3e3a),LL(0x36171692,0x1c3fcd34),LL(0x2f1f7ca5,0xfc0ab80c),LL(0x564878a7,0x0dadc166),LL(0x000d81f3,0x7d20d34b),
+ LL(0xb19231b4,0x0e8d03f8),LL(0xdcda852b,0xe4498dbd),LL(0x31a8dddb,0x9963a6bb),LL(0xd949c6cf,0x80bfba33),LL(0x1b6e1ab7,0x72e48395),LL(0x82d7301d,0x35a2a802), LL(0x01edd784,0xcfce9b91),LL(0xcd9bcb9c,0x794ab50e),LL(0xf465c3ca,0xe1f90e0c),LL(0x902b1b57,0xb7ded4b5),LL(0x8a8c27b4,0xe593dafc),LL(0x6f940ca0,0xa80faad4),
+ LL(0x421e65d3,0x5396fd32),LL(0x15e91d37,0x6c826fe2),LL(0x3cc3d9cb,0x14c80f4a),LL(0x43028c7f,0xdb760a13),LL(0xce1a3e42,0xd7a541bd),LL(0xb81193f1,0x4726a5b7), LL(0xf004d745,0x5c96916d),LL(0xad031ec3,0xc86961c0),LL(0xb8d28a4f,0xb5a73c58),LL(0x7ed16163,0x9a7bcb0e),LL(0x2fbd18f5,0x3f6871f3),LL(0x42155e84,0xebef020a),
+ LL(0x4cdd5d8c,0xce6c810c),LL(0x078c9bc1,0x9fc290a4),LL(0x96d47e78,0x84debffd),LL(0x143590fe,0xf291d301),LL(0x69111f3a,0x7cc5c36d),LL(0x46311370,0x3a2cdc42), LL(0x9e6f14a7,0xd3d8bb98),LL(0x481e22db,0xfeb97d41),LL(0x462748fe,0xe1e20cfb),LL(0xa2eaf3c7,0xcf8f5dd0),LL(0x302a52d4,0xb4f9acd4),LL(0x8d715c96,0x1c154dcd),
+ LL(0xb13ddc9c,0x5f492236),LL(0xbabe466c,0xc930fb0e),LL(0x5c017d52,0x21daa0b9),LL(0xea9a6c9b,0xc182a975),LL(0x4fd839af,0x45d3d6c0),LL(0x3d89b744,0x9e4ce10a), LL(0x3a947f16,0x906af540),LL(0xa377f4f3,0xa0f8e1b7),LL(0xe343d7c1,0x268360cc),LL(0xbddbeb1a,0x66fe9eb7),LL(0xc3bafefc,0xf5c80368),LL(0x6664d04e,0x0e183ee0),
+ LL(0xfda8520e,0x36c9dbbe),LL(0x6ae3ea98,0x573507ce),LL(0x96a8f9f1,0x1ab38db6),LL(0x6b01e6bc,0xe031d235),LL(0x8afc4ada,0x10466ae6),LL(0xed9c44e4,0x3b35df41), LL(0xc7bd99e8,0x61272c12),LL(0x805afd79,0x6a4ae7b4),LL(0x0ecc49eb,0xf4c47a91),LL(0xcbe84d5c,0xeb95dfec),LL(0x8ee497d7,0x43f3b71c),LL(0x4c6fece4,0x2547af52),
+},
+/* digit=10 base_pwr=2^50 */
+{
+ LL(0xced45039,0xe323ed0c),LL(0xa90aa713,0x04ce0b67),LL(0xe8d68e4e,0x9c092f06),LL(0xd0742e5d,0xd8f5555a),LL(0x00d3df92,0xe2d175bf),LL(0x4f71aeab,0x8ca55f15), LL(0x642d391d,0xd1762d72),LL(0xaec466bd,0x0dfdd3c2),LL(0x6281f2a7,0x2caacb4c),LL(0x3603e53a,0x635ba470),LL(0x49fecf29,0x94a9811d),LL(0x466bf361,0x3a42cf09),
+ LL(0x11bccf2f,0x0f05710b),LL(0x7aec1bc6,0x7113085a),LL(0x46b8d0e2,0x137da67a),LL(0x698b78cc,0x454b89fc),LL(0x258a9393,0xf2a6e1de),LL(0x16488e69,0x5f1804e7), LL(0x15b3bf35,0x7c6c5502),LL(0xb05c2ec1,0x3b0e09a5),LL(0x92f15247,0x4b9de30e),LL(0x27e70a0a,0x09d4ca93),LL(0x0d149363,0x9c8b1634),LL(0xce642137,0x54a8287c),
+ LL(0x346a764e,0x49ecd6f3),LL(0x4105e657,0xe46847f1),LL(0x7550f608,0xce9cb2b5),LL(0xf4cf062e,0x45f1a1f7),LL(0x2c27d38a,0xcdb19a11),LL(0x84e50b19,0x36d375b2), LL(0x0dba6405,0xf4369154),LL(0x040354dc,0x4c9dc863),LL(0xa24d09cf,0x7229e70e),LL(0x7cf6831b,0xe72aa86c),LL(0x25392838,0x487fb684),LL(0x430b9b47,0xe88bed04),
+ LL(0x666fa8a8,0xf8a8499b),LL(0x71bba84a,0xd0f94015),LL(0x515e1328,0xb85e1b1d),LL(0xa941e788,0x88a2636b),LL(0x2b5dd8d8,0xa045241d),LL(0x332f0350,0x161be476), LL(0xa18fac6b,0x96c4b205),LL(0x73fc5337,0x5cbe8d5e),LL(0xd00b6029,0x6fc33fc6),LL(0x89aa3b79,0x07a914ee),LL(0xa4d4dd00,0x35353eb7),LL(0x673e8956,0xc026bdc0),
+ LL(0x67103852,0xccda3721),LL(0x0c54de53,0xf78d2247),LL(0xafa44aa5,0xebd16036),LL(0x64a24ab9,0x7b880248),LL(0x1c2bc78e,0x86b38e96),LL(0x8d63b295,0xd0aa0d05), LL(0xc62fcbf1,0x24912955),LL(0xb9ac435c,0x77a68156),LL(0x1b360b26,0x432401c7),LL(0x4c58ef8c,0x091f19f3),LL(0x83d46c9d,0x3a4a61f4),LL(0xe8d616cd,0xad0e5c72),
+ LL(0xcdaa6831,0x33b029bc),LL(0x4c1f9ced,0x2548552d),LL(0xdece1c8c,0x35f1a002),LL(0xacc23aa5,0xc6b87fd7),LL(0xbab029a4,0x0b8bb275),LL(0x30bfb42d,0xf07bc067), LL(0x1f69ce9d,0x1688ff5d),LL(0xdb10585e,0xeedb7b5e),LL(0xd432c197,0xb7a88cf0),LL(0x015a350a,0x20731bdd),LL(0x63223f5c,0x5fa18354),LL(0x8024693f,0xe392e131),
+ LL(0x0154731e,0xdfaeea0a),LL(0xe15a0388,0x9e53419d),LL(0x25a992c8,0x2ad6a83c),LL(0xe125501a,0xa2ba020f),LL(0xd4dd04dc,0x894ebaf8),LL(0x50765559,0xd48cb958), LL(0x80dec92b,0xf9b58d09),LL(0x9da299d7,0x2a0e1165),LL(0xefe9cb11,0x3c081853),LL(0xa511c5e0,0xb9f3b702),LL(0x70486180,0xa8f7a25f),LL(0x591b3e2f,0xc0358b25),
+ LL(0xeaddf274,0xf36e8398),LL(0x6a5e4ddb,0xe41553a1),LL(0x4efc5b0c,0x36ab0746),LL(0xd316c434,0xb211e59a),LL(0x16ccf839,0x2515ec9f),LL(0x03dc6a07,0x6ecb7465), LL(0xc65c1b07,0x842b7275),LL(0x35750ab6,0xf7ceeec5),LL(0xcef5255d,0x967d711c),LL(0x5108cb92,0xcd3bfb07),LL(0xec1b9740,0xe50c0d8a),LL(0x1a9e6308,0x9e8d5661),
+ LL(0xccb8a36a,0x84f8ea13),LL(0xa05709a2,0x5f7aeeff),LL(0x60574f37,0x4942d04e),LL(0xe048b400,0x855b13e9),LL(0xa6b59c09,0x747e4067),LL(0x074d3990,0xc349fb05), LL(0xec2c7e03,0x398e6afa),LL(0xec2d5a4c,0xce361865),LL(0xb6f57d22,0xfc04bf8e),LL(0x759ce6c6,0xf0e0b84c),LL(0x5ee7e528,0xb6514123),LL(0xf5c0f9b9,0x8ca144bd),
+ LL(0xf6a58536,0xc1370dae),LL(0xc56b0ae9,0x6f2e5b37),LL(0x92f6b6a3,0x5511d682),LL(0xae575249,0x2e9e5034),LL(0x1d14bed7,0x3e5a32f8),LL(0x75efd17a,0xa346a86f), LL(0x0309fd7a,0x4f2510a6),LL(0xd0b1425e,0x689ecd74),LL(0x9f771e24,0x9e9bebe1),LL(0xadc5b48c,0x20188045),LL(0xb845230b,0xe49811b6),LL(0x5a8687f8,0x420855ec),
+ LL(0xbae1b94d,0xe650e49a),LL(0xe3199794,0xb6b162e6),LL(0xb4ec0480,0xdc706859),LL(0x4b1a06ca,0x28b618c2),LL(0x403acdc2,0x0929a001),LL(0x2da3aefd,0x796dfd97), LL(0xef4c1673,0x16389072),LL(0xfc94a4f5,0x600d8bd7),LL(0xe5f386a9,0xf003214d),LL(0xe62cbb48,0xa7af0499),LL(0xde82bad5,0x750a3b00),LL(0x8e7dc8ee,0x6c615b83),
+ LL(0xd71543a6,0x283eec26),LL(0xa7627841,0x98fa08be),LL(0x27ad302d,0x269a83b8),LL(0xbde3fdd0,0x225f2f12),LL(0x0130b3a6,0x046fcf38),LL(0xc3ed9043,0xea733c1a), LL(0x70aa08d1,0xf870f14d),LL(0x34391e0b,0x643d18b8),LL(0x847be772,0xf3e1d5f4),LL(0xd0ed73a0,0xa9498223),LL(0x14b3babb,0x6933ccf0),LL(0x37f08f70,0xc2439ae4),
+ LL(0xf88d049b,0xb643f4e0),LL(0x12682fcf,0x5e0ac1fb),LL(0x9f981c8f,0xeaf7874d),LL(0xb1af779d,0x9c2adfd2),LL(0xdaa8c275,0x9a7abead),LL(0x24cacec4,0x09ad5521), LL(0x0ead1646,0x069cd5c4),LL(0x0a6157d1,0x5186bf19),LL(0x96503506,0xcc222a93),LL(0xbd29686e,0xfeaa7bde),LL(0xa7257c8d,0xb0d65b0d),LL(0x98aa227f,0xc31c0a88),
+ LL(0x5be1d45b,0xb4b7651f),LL(0x7f0cf680,0x0425200a),LL(0x8960be95,0x200d12b4),LL(0x4945b193,0x02fdd1a1),LL(0x27d046d8,0xedd70e3e),LL(0x83f14e12,0xc1cc086a), LL(0x2629396e,0x1580e72b),LL(0xf9ed73c1,0xc87439db),LL(0xa90c5128,0x5debdf30),LL(0x9fbe14ef,0x0b6c020e),LL(0x0149a0b0,0x168da56a),LL(0x79c58ac6,0xc66a4dbd),
+ LL(0x330b8e2e,0x800aec84),LL(0x335837bf,0x1a2c033e),LL(0xfe6f6dd9,0xf1a91551),LL(0x1de7360a,0x326c42b2),LL(0x7b66f9d5,0x300e740b),LL(0x68ce95d4,0x53bcc700), LL(0x3d80f228,0xc9e225ac),LL(0x6977dfdb,0x64b2ad4e),LL(0x01f23221,0xac863b08),LL(0xdf11e5f7,0x0517a648),LL(0x68d11050,0xbf7aedcb),LL(0x77b3029c,0x2607e337),
+ LL(0x206add5d,0x1afa6aa6),LL(0x150ea4c9,0x66cfbbae),LL(0x5d36da4f,0x07fb920b),LL(0x291e774f,0x144d51f9),LL(0xf40d87a8,0x26c2c134),LL(0xa932f1a0,0xc8cf3524), LL(0x5aeb0bde,0x35bb2a42),LL(0xc4be960a,0x5cfcc1da),LL(0xaa1838ed,0x5c40cabf),LL(0xe2855f1f,0xea0c05ff),LL(0xfd525934,0x931ebb02),LL(0x16246fd4,0x31a7b78f),
+},
+/* digit=11 base_pwr=2^55 */
+{
+ LL(0x6d6ae962,0xcd92906c),LL(0x9807d881,0x62835615),LL(0x1fdc1915,0x0d692978),LL(0x269d611e,0x45d01a8c),LL(0x9665b00a,0xe7bd1e70),LL(0x9bcaa388,0x08638534), LL(0x2dd24299,0x8f189e88),LL(0xb82fb270,0x5f643392),LL(0xc633b111,0xca65bf16),LL(0xd6f1dac8,0xc6adc9c9),LL(0xa3c3381d,0x0df2c293),LL(0x8388cd12,0xdd6ae97d),
+ LL(0x3863db02,0xffdbd0eb),LL(0x2f57e10f,0x8b825683),LL(0x35e7a3a2,0xc11acead),LL(0x67833028,0x4998cf8c),LL(0x844c7976,0x8f3a346b),LL(0xdb9b1a1c,0x0a9d872c), LL(0xb98d445d,0x8735dabc),LL(0x305fa0a9,0x93790d80),LL(0xd267a01a,0x7c0add49),LL(0xffa20d11,0x2b46c913),LL(0xd8ab2d4a,0xf2acef26),LL(0x3d926080,0x71b701b9),
+ LL(0xfbf536a1,0x7cae584d),LL(0x5b52faa9,0x0af06fc2),LL(0x2827b872,0x807706dc),LL(0x59903742,0xf029478f),LL(0x85cd7aed,0x0e8c393c),LL(0xa331bee7,0x2e1e6ade), LL(0xcdb7f97a,0xf5d13dad),LL(0x8577c3cc,0xdb22fed1),LL(0x81e39043,0x6f453180),LL(0xa00a806c,0x41d4bb25),LL(0xe28670a7,0xe6064b92),LL(0xa7c63f88,0x733a31c8),
+ LL(0x5133de8e,0xe9d2a98a),LL(0xb81b8b00,0x37083b60),LL(0xceaf86ae,0xf399325d),LL(0x8f161525,0x03b17c88),LL(0x84211b9d,0xd8ac35c9),LL(0x9050ca48,0x22083784), LL(0xc9fab832,0xa818c44b),LL(0xe5aea7da,0x8882bcce),LL(0xf8715b04,0x633aaf35),LL(0x9d8829a9,0x5463e1b9),LL(0x84a820f1,0xb18df52d),LL(0xd096675d,0x9d5ef891),
+ LL(0xc2b47dd2,0x394174d0),LL(0x30a87997,0x06b117a8),LL(0x894731e5,0xcfd81d41),LL(0xc84e7d05,0x6476b1af),LL(0x743b8218,0x37069fe2),LL(0xa36173d8,0x93f21550), LL(0xedadef86,0xa8ae70f4),LL(0x76366073,0xdac5d021),LL(0x1c982076,0x4063ba57),LL(0x2d24d61e,0xc3471b5f),LL(0xae4d820f,0x57b69c41),LL(0xc463a391,0xf73e14a4),
+ LL(0xac60496d,0xd54e2c7c),LL(0x04cd50a4,0xc06d5e5d),LL(0xe60f7f59,0xcb4105e8),LL(0x427483ad,0x705db308),LL(0xf2bff383,0xf73ba98b),LL(0x0220e6e9,0xa945611a), LL(0xd957e12b,0xc01c46b8),LL(0xacb1f371,0x458897b7),LL(0xfa3403e6,0xf738dc0b),LL(0xd2202896,0x098bc687),LL(0x5f882e5e,0xec0c217a),LL(0xa1f4eb13,0x8f25af77),
+ LL(0x195736e9,0x86e6a8fc),LL(0x1a20620f,0x88099bf3),LL(0x9cdc1db9,0xf3d9998b),LL(0x47042834,0xf36d583e),LL(0x25a0d589,0xcd4519d8),LL(0x1e04a91d,0x78c435ab), LL(0xe44d9e31,0x0428e76e),LL(0xce821aab,0x63994993),LL(0x2625cfce,0xd167ceb7),LL(0x0ddf2b89,0x9f242245),LL(0x717ffb5e,0x182e33d6),LL(0x26de205c,0x3800290e),
+ LL(0x59ee4124,0x2615c782),LL(0x76532b4b,0x4dc2824c),LL(0x1c84a04b,0x9c3b1d77),LL(0xcb9f9e34,0xb6fc203f),LL(0xc64f7846,0xbed65464),LL(0xeb004248,0x04f520a2), LL(0x4a58fd22,0x5c017727),LL(0xc10d9472,0x25958482),LL(0xaceb0e3a,0xb78c6666),LL(0xfc046f0a,0x18d3c188),LL(0x1baa9595,0x7f3e2f30),LL(0x8a2844e8,0xa574f8cd),
+ LL(0x4bcc5a81,0x9fd2e524),LL(0xd3f2f80f,0xc73e2598),LL(0x15dc157c,0xff838e9c),LL(0xc522319e,0x0b2491d2),LL(0x909592d6,0x2b65f042),LL(0x849f5dee,0xf113045c), LL(0x9b287c3d,0x84fe31be),LL(0x80097bd0,0xd0481262),LL(0x63660f87,0xaf203cba),LL(0x0ea001b3,0x5621c3d8),LL(0x346ea29b,0x125a5eaa),LL(0x3ca79649,0x3dcec22c),
+ LL(0x81c2d81f,0xc899eba3),LL(0xf3f0a431,0xb27267d6),LL(0xda55568e,0x607c8629),LL(0x2b1dc1d9,0x6b547228),LL(0xc9c001ff,0x23232311),LL(0x488f8b85,0x207a2eb2), LL(0xdac37a28,0x3867ac9a),LL(0x2584a5f0,0xa36d14d3),LL(0xa74488ff,0x7398c647),LL(0xbe087640,0xf6ed920f),LL(0x6319a571,0x72beddc7),LL(0x6a244aeb,0x55c2cd82),
+ LL(0x9ede92f1,0x42df5630),LL(0x76503aa7,0xe6957bc4),LL(0xfbec9577,0xe7abfe12),LL(0x274b7f6c,0x9660e762),LL(0x35f12ea2,0xf78af22c),LL(0xb51bec2c,0x73ab1bbb), LL(0x1641f424,0x5e8e40e6),LL(0x0905e4be,0x1af751d9),LL(0x1c033198,0xb5130ade),LL(0xa22f5f19,0x96d47ab2),LL(0x55340d4c,0x5aff3e66),LL(0x1bed65fa,0xab4aa5a7),
+ LL(0x25f8a53b,0xb7da79c6),LL(0xd331ad8e,0x6b950bdf),LL(0x4aa36d18,0x3481b7b5),LL(0xed0e3091,0x6efeaf88),LL(0xc993074c,0xeb017bdd),LL(0x529dd654,0x8431a6d6), LL(0xbd069585,0xf5177231),LL(0x3ce85096,0x6d753b10),LL(0x4ca26741,0x194d82d3),LL(0xadcd1650,0xeaeffe15),LL(0xaf7758b7,0x4dcec3d9),LL(0x4cc2c819,0xf5fdf666),
+ LL(0xae850261,0x7e9ad6e8),LL(0x11960968,0xbeb25ca0),LL(0xad4cfa42,0x60c5f0ee),LL(0xeca5c508,0x81714b3f),LL(0xb78a290f,0x810e71d7),LL(0x3260114c,0x03536cec), LL(0x6a16cdf6,0x24d29f0f),LL(0x4a4c964c,0xec45a58a),LL(0xea344b44,0xbaaa5fb3),LL(0xfeb783f6,0xf1b7a68c),LL(0x3ddd7062,0x533c4b72),LL(0x1598b5f7,0x6a33a0dc),
+ LL(0xa9810744,0x94bdc7f4),LL(0xf045d859,0x464195da),LL(0xd654cb57,0x27e2dab0),LL(0x7a491956,0x1d4e1e53),LL(0x31d5d099,0xa1ef570c),LL(0x295f3de7,0x01cd21ee), LL(0xb8249038,0x8681b00d),LL(0x93781b71,0x17c31bce),LL(0x6a1b5748,0x4324e90c),LL(0x1222e554,0x44f9324c),LL(0xffd53dd0,0xe30ba10f),LL(0xb48eeef0,0x2e5817a8),
+ LL(0x24b3a9a7,0x6b0ee060),LL(0xd5f6545c,0xcf78c3fe),LL(0xfe0f2ec6,0x050bedaa),LL(0xb3e6b4f8,0x0b7774b8),LL(0x2b4a853e,0x096b9e19),LL(0x0698f7ca,0xa7463661), LL(0xf090c97b,0xe1d1d1be),LL(0x55517a2f,0xbc1e09d9),LL(0x5868ee3d,0xb3e24dd5),LL(0xd7b83619,0xd6103494),LL(0x3b0129b3,0xaf739559),LL(0x3ded9fb3,0xef42bb60),
+ LL(0xc8fccaa9,0xa349bb66),LL(0x31a53ee7,0x7888755f),LL(0xc18d3750,0xa6e1d891),LL(0xae8d2bfb,0x9985aa4d),LL(0x31b33078,0x8baec9ae),LL(0x98750e94,0xee68295a), LL(0xd6ddf305,0x0d834bf8),LL(0x9762126c,0xab33dff3),LL(0x0c51d098,0x0c22faaa),LL(0xb887a10f,0x32404042),LL(0x248bed32,0x31f6a614),LL(0x1ce0d662,0x311f8630),
+},
+/* digit=12 base_pwr=2^60 */
+{
+ LL(0xedc9ce62,0xac6dbdf6),LL(0x0f9c006e,0xa58f5b44),LL(0xdc28e1b0,0x16694de3),LL(0xa6647711,0x2d039cf2),LL(0xc5b08b4b,0xa13bbe6f),LL(0x10ebd8ce,0xe44da930), LL(0x19649a16,0xcd472087),LL(0x683e5df1,0xe18f4e44),LL(0x929bfa28,0xb3f66303),LL(0x818249bf,0x7c378e43),LL(0x847f7cd9,0x76068c80),LL(0x987eba16,0xee3db6d1),
+ LL(0xae658422,0x1238e097),LL(0x568df55f,0xb4631ddb),LL(0xf74c5c50,0x451254e7),LL(0x8805813b,0x238b16d2),LL(0x925e7a6e,0x23987b28),LL(0x2a1a10bc,0x93b72e2d), LL(0x05e44b7f,0x944c784d),LL(0x8c8e3120,0x7d70fd09),LL(0xead45716,0x6bf1ab2a),LL(0x31c04205,0xd5f8f0e6),LL(0xa10b8881,0xac062526),LL(0xfe5505a8,0xa1a83cf0),
+ LL(0xc42a2f52,0xcbbd8576),LL(0x9d2b06bb,0x9acc6f70),LL(0x2e6b72a4,0xe5cb5620),LL(0x7c024443,0x5738ea0e),LL(0xb55368f3,0x8ed06170),LL(0x1aeed44f,0xe54c99bb), LL(0xe2e0d8b2,0x3d90a6b2),LL(0xcf7b2856,0x21718977),LL(0xc5612aec,0x089093dc),LL(0x99c1bacc,0xc272ef6f),LL(0xdc43eaad,0x47db3b43),LL(0x0832d891,0x730f30e4),
+ LL(0x37d83369,0xac92ee15),LL(0xfecec65c,0xc968c187),LL(0x6e7a3265,0x29a7ca87),LL(0x8456c9af,0x0f2b7e7a),LL(0x9754326f,0x7471824e),LL(0x364d2ec8,0x498687bf), LL(0x3c6ee351,0x86d8aacd),LL(0xf6f41e85,0x01ee6823),LL(0x1d79f7eb,0x9805fc88),LL(0x0040547d,0x377ac3a4),LL(0x61b4e90b,0xd39215d4),LL(0x4c5fd81b,0x2547416e),
+ LL(0x0c7fecdb,0x9ffe5563),LL(0xf88101e5,0x55cc67b6),LL(0xcbefa3c7,0x3039f981),LL(0x667bfd64,0x2ab06883),LL(0x4340e3df,0x9007a257),LL(0x5a3a49ca,0x1ac3f3fa), LL(0xc97e20fd,0x9c7be629),LL(0xa3dae003,0xf61823d3),LL(0xe7380dba,0xffe7ff39),LL(0x9facc3b8,0x620bb9b5),LL(0x31ae422c,0x2ddcb8cd),LL(0xd12c3c43,0x1de3bcfa),
+ LL(0xf6e10789,0x03621d34),LL(0x410c4004,0xc72143b8),LL(0x6ca2933a,0x886d00f6),LL(0xde1494a2,0xd0a22382),LL(0x0bdcdf82,0xb8656c4d),LL(0xc4a58832,0x5199d9d3), LL(0xe1c0f449,0xa982c1aa),LL(0x5a922bdb,0xe9cefb90),LL(0x31390c6d,0xfc268de4),LL(0x8c4fe595,0xea4160e1),LL(0x6790d82f,0x6c427a63),LL(0xfc519907,0xaceb0154),
+ LL(0xd6e0f9a9,0x8c074946),LL(0x51c3b05b,0x662fa995),LL(0x04bb2048,0x6cdae969),LL(0xd6dc8b60,0x6dec9594),LL(0x54438bbc,0x8d265869),LL(0x1b0e95a5,0x88e983e3), LL(0x60cbf838,0x8189f114),LL(0x771dc46b,0x77190697),LL(0x27f8ec1a,0x775775a2),LL(0x607e3739,0x7a125240),LL(0x4f793e4e,0xafae84e7),LL(0x5bf5baf4,0x44fa17f3),
+ LL(0x07a6fbf8,0xa10292b9),LL(0x3fa6235b,0x292c1a20),LL(0x73ad7a1f,0x7a36f18f),LL(0x5897b11f,0x8b2c7b0c),LL(0xcb664c61,0xf7b9a272),LL(0x8f81e22c,0xb6d366af), LL(0x8e342bba,0x3b99b211),LL(0xb06ced2b,0x03ce158b),LL(0x001db74b,0x3af1175d),LL(0x7159cb8a,0x526f0846),LL(0xebde4601,0x6a3c6e1f),LL(0x8c232eac,0xfad5963b),
+ LL(0xd03ac439,0xa21e69a5),LL(0x88aa8094,0x2069c5fc),LL(0x8c08f206,0xb041eea7),LL(0x3d65b8ed,0x55b9d461),LL(0xd392c7c4,0x951ea25c),LL(0x9d166232,0x4b9a1cec), LL(0xfcf931a4,0xc184fcd8),LL(0x063ad374,0xba59ad44),LL(0x1aa9796f,0x1868ad2a),LL(0xdff29832,0x38a34018),LL(0x03df8070,0x01fc8801),LL(0x48dd334a,0x1282cce0),
+ LL(0x42a993b1,0x21387e8a),LL(0x68b1f2a0,0xbcb65533),LL(0xa5f7e4b9,0x3161d87a),LL(0x1bce0a84,0x927b4130),LL(0x87be0ae9,0x3aabd327),LL(0x0aed169d,0x0163c6aa), LL(0x11584051,0xad1e0f0e),LL(0x74093225,0x1ba46302),LL(0x0a6a1f01,0xed045618),LL(0x6da060ed,0x15d07c63),LL(0xb7e003ae,0xa4584f72),LL(0xa02ec136,0xf6e6b7c4),
+ LL(0x26d8503c,0x76aa9557),LL(0x6bc3e3d0,0xbe962b63),LL(0x97de8841,0xf5ca93e5),LL(0xaf3f2c16,0x1561b05e),LL(0xd34bff98,0x34be00aa),LL(0xd23d2925,0xea21e6e9), LL(0x394c3afb,0x55713230),LL(0xd6c8beca,0xeaf0529b),LL(0x202b9a11,0xff38a743),LL(0x6d3a398b,0xa13e39fc),LL(0x86e2615a,0x8cbd644b),LL(0x191057ec,0x92063988),
+ LL(0x74962b2e,0x71503219),LL(0xe1db7ec7,0x3beeaf81),LL(0x445c4e88,0x702784cc),LL(0x9baad7ed,0x7aa58315),LL(0xd044b38a,0x72b76e2f),LL(0x6a7f2101,0x35a2bb8f), LL(0xa14c2bf2,0x5e6ae263),LL(0x34bb719d,0x8fb614c0),LL(0x5dcd7c65,0x7949eeca),LL(0x7670aeb1,0xb198be58),LL(0x93cabf25,0xb2238dfc),LL(0x1a422b95,0x6a6d4555),
+ LL(0x13f89146,0x787835ce),LL(0x69446c3f,0x7fcd42cc),LL(0x840e679d,0x0da2aa98),LL(0x18779a1b,0x44f20523),LL(0xefbf5935,0xe3a3b34f),LL(0xb9947b70,0xa5d2cfd0), LL(0x27f4e16f,0xae2af4ef),LL(0xb9d21322,0xa7fa70d2),LL(0xb3fd566b,0x68084919),LL(0xd7aad6ab,0xf04d71c8),LL(0x10bc4260,0xdbea21e4),LL(0x8d949b42,0xaa7dc665),
+ LL(0xf7848707,0x3ddea6d9),LL(0x6dbcf13a,0xc11260d0),LL(0xa16508f0,0x62c5ee60),LL(0xcb56535c,0x4bdfa38f),LL(0x4fa5a6b0,0xd391e786),LL(0x2d4cd296,0x173c3d70), LL(0x5fa3f53c,0x9c5c596f),LL(0x1ddd3732,0x77d39514),LL(0xa5bf4edc,0xca1bb91d),LL(0x1cd98b09,0xb23afd38),LL(0x60bdfa0f,0x198248ed),LL(0xfb69a4b1,0x559dd99c),
+ LL(0x6ccb8213,0xd8e958a0),LL(0x91900b54,0x118d9db9),LL(0x85e8ced6,0x09bb9d49),LL(0x24019281,0x410e9fb5),LL(0x6d74c86e,0x3b31b4e1),LL(0x020bb77d,0x52bc0252), LL(0x27092ce4,0x5616a26f),LL(0xa08f65cd,0x67774dbc),LL(0xc08bd569,0x560ad494),LL(0xad498783,0xbe26da36),LL(0x7f019c91,0x0276c8ab),LL(0x5248266e,0x09843ada),
+ LL(0xb1b43eef,0xa54768da),LL(0xe14fda22,0x13e41f47),LL(0xfaef6863,0x774df203),LL(0xbd7471b3,0xf795a034),LL(0xb47de2e9,0xf0958718),LL(0xe1160cff,0xc92f7888), LL(0x0146c790,0x86ded97b),LL(0x480a4b7b,0x015918f5),LL(0x424e8459,0x05588920),LL(0xeecf8b2b,0x37455914),LL(0xb968a6fa,0xe7d3df1f),LL(0xbad0719f,0x07a0ffd6),
+},
+/* digit=13 base_pwr=2^65 */
+{
+ LL(0x98d23f6f,0x2566021f),LL(0x34ca97ca,0xfb883e12),LL(0xd9f51b69,0x34e047a5),LL(0xf8efa646,0x0b50d91d),LL(0x971f584f,0xc2bbcbb2),LL(0x0907c91c,0x4136f0e4), LL(0xe735cc48,0xa7ebeb0d),LL(0xe113c8fa,0xa7d1bedc),LL(0x3f5c962a,0xc04d9a07),LL(0x3ff74a2f,0x95c155e5),LL(0x3df0749d,0x923c65a5),LL(0x27ae35d0,0x10d5f812),
+ LL(0xecee6e87,0xd5469c7b),LL(0x33a4c917,0x056180bc),LL(0xa16caa7a,0xf881ca21),LL(0xe6cc7f39,0x221de182),LL(0x31378723,0x10d61ab5),LL(0x520c9660,0xfb763bd9), LL(0x0d6b1541,0x145214cd),LL(0xd70223e7,0xd9f7ff2d),LL(0x0cb1fe69,0x9fce59e3),LL(0x3e299fe7,0x2e6e77fa),LL(0xd5af78cf,0x3a0cf652),LL(0x3e852159,0x50cc42c5),
+ LL(0xdf764716,0x0791dfa1),LL(0x8c66da07,0x31bf6876),LL(0xccedf4f3,0x49f25b77),LL(0x5d965c05,0x05170ccd),LL(0xd49e6727,0x37d9521b),LL(0x86a00176,0x15482512), LL(0x6c00eb48,0xdab44493),LL(0xe00c5c5d,0x102c6b95),LL(0x4c2506ba,0x43660c3e),LL(0x5ec6f132,0xb2fb2616),LL(0x99ac7691,0xccc4221a),LL(0xa576deb5,0x05b29758),
+ LL(0xad8c49b7,0x4a873076),LL(0x7146575f,0x891598ce),LL(0x427ea198,0xc1d3042f),LL(0xed259219,0xdc592111),LL(0x234850ca,0x0abdbd16),LL(0x43b6fe8d,0x26b94126), LL(0x36a1cfe9,0xd3c79d17),LL(0x9a2b3baf,0x57638621),LL(0x5a98bf65,0xa736535d),LL(0xab2cdb2b,0xacb3b7dd),LL(0xdaaf89ee,0x37d3743a),LL(0x0b348532,0xf19d9aba),
+ LL(0xd93c54b2,0xafad01a0),LL(0x95536c49,0x659bff96),LL(0xb9734c15,0x7b91aac2),LL(0x24e02f59,0x55c7f082),LL(0x3a26e551,0xebcb71e7),LL(0x6c6343eb,0x5b7225f7), LL(0x17d5e775,0x021c48fb),LL(0xbd859c87,0x57536a42),LL(0xae2b63e9,0x24852cc0),LL(0xc0ce0ef1,0x21515020),LL(0x8fed825e,0x2ac7336c),LL(0xa0152819,0x4bc87fee),
+ LL(0x4654712c,0xe7c396d6),LL(0x7a26e994,0x1fa5ea50),LL(0x09012b83,0xaa987687),LL(0xe9b17e98,0xf1ef9792),LL(0x6dc2db10,0x2c22bcb0),LL(0xed4be80e,0xae42ddf6), LL(0x2e743405,0x672080f6),LL(0x5b7821d1,0xa15a7f97),LL(0x47adbf07,0x0cd912f2),LL(0xb6c4ae8f,0x6919c0dc),LL(0x14c6253c,0x62b13edd),LL(0xf8032287,0x66f35919),
+ LL(0x9d628e1d,0x2713b58c),LL(0xfaa8ba1e,0x3729960a),LL(0xab53bc93,0xc3438130),LL(0xe9c165e7,0xcef9eda5),LL(0xfd02650b,0x9bacd1c3),LL(0x540ece72,0xbb300334), LL(0xd9c4f0ed,0x21f5a5d3),LL(0xf7c19269,0x1ba32e4f),LL(0x2cf320fb,0x8f073beb),LL(0x5599646f,0xb49766c4),LL(0x49e4f200,0x68180d66),LL(0xeaeddb36,0x8203d8ae),
+ LL(0x2caf088b,0xa68295da),LL(0x5c8709fe,0x23d6439a),LL(0xfe0c3df0,0x8deba0cf),LL(0x3cd00a1a,0x5b4d037b),LL(0xaa0f9088,0xe9edc429),LL(0x5847def7,0x6f5827e3), LL(0x306ad966,0x9739d03d),LL(0xaed51d04,0x7c6b18af),LL(0x1759060a,0xdc3d34ff),LL(0xa7e94dbb,0x029e9aa9),LL(0xf7e8b7f3,0x2a3cdfa0),LL(0xbbd8f6f4,0x42f87bf0),
+ LL(0xed210253,0x516f138b),LL(0x4433461a,0x5ec2fa32),LL(0xcdaf1280,0x0dbe2c66),LL(0x9fbf3318,0x086b91e5),LL(0x399a1ca6,0xfb0223ee),LL(0x0db5b20f,0xd6f86d9b), LL(0x5752d618,0xec02bca2),LL(0xaf69f3f1,0x952fafca),LL(0x33c4d294,0xf304cb75),LL(0xdac65608,0x78085727),LL(0x840a4466,0x22f302ef),LL(0xc371c31f,0x33fb889d),
+ LL(0x4f890542,0xaa4711f5),LL(0xeba822c4,0x862421d9),LL(0x848280fc,0x2f667179),LL(0xc201ed75,0x4de16d87),LL(0xc5e61b5d,0xd20e1399),LL(0x9ed67ec7,0x3f7114b4), LL(0x9b5a88f9,0x561fd497),LL(0xd84db2c1,0xb202eb86),LL(0xc8637d3d,0x67d8fb90),LL(0x032b1853,0x3d1d78a1),LL(0xef1af9ac,0xe07bf775),LL(0xa57d6ada,0x691e1dee),
+ LL(0x3801c65d,0x834701da),LL(0x955aa27d,0x5bb35c48),LL(0xdb7ad387,0x0ef0f375),LL(0x06cd1d53,0xd25e337f),LL(0x90cd91de,0x757a1f9d),LL(0xd61bbd60,0x1604f153), LL(0x8bb95dc4,0x6a01e8cf),LL(0x75bbdb13,0x34b7be62),LL(0x21e9b029,0x0a96b3a1),LL(0x2946df44,0x25615c3b),LL(0x19d04842,0x5eda7d19),LL(0xfba84668,0x08317975),
+ LL(0xa55a3a4d,0x12474bd8),LL(0x9e471af4,0xe326aaf1),LL(0x8caadaa6,0xf201a930),LL(0x35304341,0x546821f8),LL(0x088353e1,0x7fe452c3),LL(0xfc82566a,0x8f1ff628), LL(0xd99f8967,0x49526f46),LL(0xa4009690,0xb19c80c0),LL(0x1cbc0716,0xeccf9759),LL(0xaf4cbc8b,0x2e13ae2c),LL(0xf32e29ad,0x12b0df13),LL(0x0b1565f0,0xa2005d6e),
+ LL(0xd06014e0,0xdb891eed),LL(0x03e9970a,0x69685d61),LL(0x02838113,0x3a612db4),LL(0xdcdef0b0,0xc1cd7b3a),LL(0xa41d6c1e,0x612b299d),LL(0x0ed386a0,0x982161ed), LL(0x3ea1bf1e,0xb36bbe2f),LL(0xceb2a5ec,0x0d8c3752),LL(0xec03bddd,0xc02cd7f6),LL(0x52631d9e,0xa87977c1),LL(0x7e398d7e,0x7b546cc3),LL(0x04845671,0x5b1218a8),
+ LL(0x6cb173d1,0xfa3e43e5),LL(0x4591b5a5,0x2502258d),LL(0x8ca9682a,0xae8c4b55),LL(0xec81a288,0x8cb1ffb4),LL(0xbfc84fd1,0xd11ae888),LL(0xd774577c,0xa3b083a0), LL(0x1da9afc5,0x119b41c1),LL(0x2934e22b,0x44bc7762),LL(0x7c639d6c,0xa04694f3),LL(0x32c5b8ea,0xd5e1ce57),LL(0x9749e8b6,0xd507c39b),LL(0x55255b63,0x16cc0b57),
+ LL(0x614f6f37,0x71e5df78),LL(0xa0b80bee,0x5cf0e08d),LL(0x1e32051f,0x1f8dae17),LL(0x83bc233b,0x54ae365d),LL(0x1b84aaa6,0x97ea005b),LL(0x64c75139,0xf4766d92), LL(0x41215701,0x9b93bbf2),LL(0x8cf8a865,0xb18f042d),LL(0x0867556f,0x5dfb96dd),LL(0x597fd6a1,0xe9fafbb8),LL(0xfe48bbc6,0x729b2f50),LL(0x7f37ff9b,0x2cf85f6b),
+ LL(0x378ef62b,0xcd8c2ec9),LL(0x91a7c4b9,0x7f4a3c54),LL(0xdb83e1ab,0xe12386d4),LL(0xbb549bb5,0x9a792032),LL(0x2807c0f1,0xaf81cba6),LL(0xabf2008e,0xd4ad7d87), LL(0x7e9ad6cd,0x9d7a7230),LL(0x8b517b2a,0xb30636b0),LL(0xec900516,0x47c324da),LL(0x7193eb30,0x408cd0d3),LL(0xd315c655,0x8f0bcce2),LL(0x869d6c22,0x540ad4e0),
+},
+/* digit=14 base_pwr=2^70 */
+{
+ LL(0xdae0ff8b,0x4b5e753d),LL(0xda3d97b5,0xe55c83e4),LL(0x42fa905b,0x4034d75f),LL(0xc33e462b,0x89b85eda),LL(0x058de3bb,0x31f413c3),LL(0x6ba75391,0x66c01c80), LL(0x373e28de,0x3f500202),LL(0x4b9be739,0x5090b33b),LL(0xefa2addd,0x7297aa10),LL(0x1a6566aa,0x3e8ccdbe),LL(0xd7b4f214,0x4dfda07f),LL(0x7cb1cae7,0xa659bd1e),
+ LL(0x87d11691,0x31796c23),LL(0xa9de506c,0x02991ea2),LL(0x6cb0c301,0x4ff0cb71),LL(0xd1702ca9,0xdd0cdbd7),LL(0xe1a02a90,0x470a26c8),LL(0xd7054625,0xb705b7ba), LL(0xd4a1a268,0xfadc2e86),LL(0x68e9f923,0x0fd97646),LL(0x2951a8fe,0x042b5ebb),LL(0x64197a76,0xe4af9d03),LL(0x249c1b5d,0xdd2c6bb3),LL(0xf01932b1,0x60af89bd),
+ LL(0x41afcd64,0x4374145d),LL(0x49d21198,0x98b72d60),LL(0xdfde8a41,0xc0ff394b),LL(0xee1ff7a5,0xed1112e5),LL(0xcb5036fc,0x87a920e8),LL(0x2deb225e,0x437123f6), LL(0xb9ad8c58,0x37e527af),LL(0xabfaef38,0x3e3c9998),LL(0x50b2b4e2,0xb656bcc5),LL(0x3bf5699d,0xfacc8a19),LL(0xe616307a,0x98cec74f),LL(0xd3ef8bab,0x34af333d),
+ LL(0x744ec273,0x9ded9b0d),LL(0x2e79e4d5,0x5bdfe547),LL(0x39393728,0x94f3aaf5),LL(0xa438413e,0x22136862),LL(0x373c7de3,0x449286da),LL(0x29aa1540,0xa709d85d), LL(0x0284a4f6,0x1bd13e41),LL(0xf0799c8b,0x37b54d69),LL(0x6bcd0cb2,0xd43b558f),LL(0x9e610369,0xf5757c0e),LL(0xc16e0651,0x15c80b23),LL(0x001820aa,0xacb2cf64),
+ LL(0xeec37f48,0x0629e4dd),LL(0xda7de716,0x3f7556a2),LL(0x661662bc,0xcacd8f27),LL(0xeaf01690,0x65d8bc2c),LL(0x7c39c893,0x83ac6647),LL(0xf59440e1,0x353f60db), LL(0x852c575a,0x2597b0d6),LL(0x3a40c2b3,0x410885f7),LL(0x2fcc2488,0x953ab347),LL(0xef4cc6d8,0x9f753e5e),LL(0x97f69e63,0xfc32bb4d),LL(0x87e8c264,0x461c1b0c),
+ LL(0xac4b62f5,0x2bea7e75),LL(0xc6297871,0xcf255dcd),LL(0x81b25c72,0xdd88db87),LL(0xb617dc04,0x77ad90b3),LL(0x0ed4a7d6,0x65ee1382),LL(0xd9644c8f,0x4c08df9c), LL(0x525a023f,0x072d3784),LL(0xfce399fb,0x1aef69ce),LL(0xd7f29044,0xb07fd78e),LL(0x43043fa7,0xa3754e14),LL(0xff9fe4d9,0x97bdae92),LL(0x700fe6b8,0xad63ba6a),
+ LL(0xa1ca17db,0xa571929b),LL(0x45e146b8,0xce7a12f5),LL(0xd9eb426d,0x39df1446),LL(0xdc27f268,0x1e48b3f8),LL(0xff548455,0xa2d7dfa1),LL(0x6ef1cc82,0x750068b8), LL(0x667fce62,0x4d699306),LL(0x131c5412,0x98540b9d),LL(0x47c580b0,0xf8a62cd3),LL(0x73795005,0x2b55460f),LL(0x7b8db337,0x3206c025),LL(0xd0dda5a2,0x2280934b),
+ LL(0x2352478c,0x10a8aabd),LL(0x1364c40f,0x599d9dfa),LL(0x076945a2,0xa009df1a),LL(0x03861f02,0xf869152c),LL(0x9f866a3c,0xc405226e),LL(0x8b41ecbb,0x93bd737d), LL(0x33901eed,0xb5c9ed10),LL(0x99312b80,0x90e4ce8f),LL(0x57589279,0x1a9ef22e),LL(0x7fe2d6aa,0x83ef607d),LL(0x3473dbfa,0xf2da8454),LL(0x57879066,0x14f36d3a),
+ LL(0x0ea3ce34,0x2c780f22),LL(0x4b8aac72,0x240a211e),LL(0xc2625a99,0x7a266e5d),LL(0x3b30c878,0x1cb15d3e),LL(0x0e1b21d3,0x8cd8ccab),LL(0xadc1a6b3,0x53c64279), LL(0x60bf708d,0xe60d15b9),LL(0x0cb5ad4b,0x6e431c1b),LL(0x82033111,0xec874c3e),LL(0x9141eae5,0x88054a1d),LL(0xddf53a28,0x98438a5a),LL(0xfa12c657,0x168f0b0f),
+ LL(0x629d7a57,0xd621ce26),LL(0xcc1f8af1,0xbf571de7),LL(0x304adaa3,0x2c5cfaf9),LL(0x3f283b49,0x950addbd),LL(0xee6d1cd1,0x622dc27c),LL(0x1f0863fb,0x26d92004), LL(0xa41ec585,0xe243b2a2),LL(0x2bea6235,0x0dbd9adf),LL(0x6f0820f5,0xcb083c4d),LL(0xd5493931,0x809ecbaf),LL(0x14b7ffa8,0x96470674),LL(0x53fc2224,0x2cdfe22e),
+ LL(0x7cd74a06,0xc8b1333c),LL(0x271006bf,0x7d5ac4dc),LL(0xc14e0e56,0xe9377d9f),LL(0x7a92ab1f,0xaa8651db),LL(0x5fc11fb5,0x77cee814),LL(0x27870b14,0x1e7c5ca0), LL(0x6f959698,0xdeef4b3f),LL(0x5daa9bda,0x7c59f26e),LL(0xfd312368,0x4d0d5aec),LL(0xb738de68,0x5247a6f3),LL(0x90c04807,0x1c4e8ba9),LL(0xcce126ca,0x0554b41b),
+ LL(0xa81cc26a,0x3df98ea9),LL(0x83b2c6f3,0x982ed568),LL(0xea6d6976,0xc9cbd1b5),LL(0x7e25ffbc,0x3f9f2319),LL(0x7da6280e,0xbca8e056),LL(0x35cda713,0x7abd3166), LL(0x740ae011,0x46ef321d),LL(0xdb214a33,0xb17f6c75),LL(0x51de4044,0x37b73b4b),LL(0xccd9ba8d,0x5bccf3cc),LL(0xd0f7045b,0xa2ca080d),LL(0x68cf4dcc,0x79caf906),
+ LL(0xa7b07d22,0xcc3605a9),LL(0xb4ebe4e7,0x4370eb18),LL(0x248867c1,0xbe393039),LL(0xcb1a75ff,0xc8e4851e),LL(0x39cb6da4,0x215f3fbe),LL(0xe41f9a34,0x6f2102ee), LL(0xdfae7c27,0x61d484ab),LL(0x6f1260fc,0xf5143bd2),LL(0x7514bccc,0xa70b6c06),LL(0xd23506f5,0xe71ca833),LL(0xeae03a8e,0xe2f50ba8),LL(0x83c33359,0x2ac3b508),
+ LL(0x3655cabd,0xe94b930f),LL(0xa342443c,0x6ef6aac4),LL(0xbae255da,0x2feb8005),LL(0xac6e2095,0x4625a15c),LL(0x0ec76c1e,0x75c6311d),LL(0x9b81c6f2,0x896a0740), LL(0x073378bb,0xbad3e2f9),LL(0x29266ec0,0x2984a106),LL(0xa788010a,0xa68a5351),LL(0x017cd052,0x321aa113),LL(0x2f34db5c,0xecfb6175),LL(0xca2b51df,0xfe080ced),
+ LL(0x03360c88,0xba296908),LL(0x36311812,0x3fb087c0),LL(0xd9ff6a48,0xec5fb10a),LL(0x207dd8e1,0x52f7077f),LL(0x44c02fbc,0x8e65cfb8),LL(0xfbf4bfd5,0x4f4fcde2), LL(0x6cc74320,0xd1ff5415),LL(0xf68b036a,0xf989d544),LL(0x973bd9be,0xafedc2db),LL(0x4785e26a,0x7bdc3569),LL(0x751ae9ba,0x0df36796),LL(0xccdabd95,0xfebde691),
+ LL(0xc77488cc,0x3499b44b),LL(0xaa8f3c10,0xde000e01),LL(0xc1f517d7,0x30140406),LL(0x82a174e8,0xd4b3c8eb),LL(0xaf2c9b3a,0xc8835b13),LL(0x443716f4,0x2cd7626e), LL(0x9c22de71,0x336c4f4b),LL(0xf2529f60,0x9dd2b277),LL(0x828c34d3,0x6ffba2dc),LL(0x34d0d1f7,0x257a345c),LL(0x6ca4fbce,0xbc1eff05),LL(0x0768349f,0x05b33562),
+},
+/* digit=15 base_pwr=2^75 */
+{
+ LL(0x10fa53ce,0x5d7afe9a),LL(0x1ff49021,0xe2415b50),LL(0xc6523492,0xe39a067d),LL(0x27557f5d,0x34585275),LL(0x930e9f9d,0x756b8d86),LL(0x040d52d8,0x88df6219), LL(0x5362b045,0x606eb60b),LL(0x9e383cbe,0xd179818c),LL(0xe068d293,0xa6215748),LL(0x2fce158d,0x73fbdca2),LL(0xcb183c8f,0x9cfee07d),LL(0xa5e03c98,0xc0bf2beb),
+ LL(0xf14a99d9,0x86230934),LL(0x97c1c092,0x1cf9c66e),LL(0x6f595ed3,0x01e186ba),LL(0xe2284a58,0xd3291c3d),LL(0x1b9e5e25,0x03dee231),LL(0x15cc9f53,0xf2e9b4ad), LL(0x9770c29d,0x4fba1567),LL(0x50c4ae2f,0xbf7d6736),LL(0x2532d015,0x86901eb9),LL(0x4e7455de,0x4396fd78),LL(0xbcf811c9,0x2fbcea8f),LL(0xae952b37,0x3981ad15),
+ LL(0x4caea411,0x5563ba50),LL(0x59297ddc,0x6d06f7ff),LL(0xb2fb7a6e,0x244c00ac),LL(0x35df586e,0x25aac3d4),LL(0xd67be5f9,0x6c6777e4),LL(0x11c24c8a,0x476cbbf1), LL(0x83b496fc,0x60832359),LL(0x09a871a0,0xcc13c191),LL(0x56f78170,0x7c0e049f),LL(0x6eafe939,0x19bda64b),LL(0x09aa41e3,0x04381fb6),LL(0x0b8c4500,0xe4d4dcbb),
+ LL(0x4cb89afa,0x6bd2c54d),LL(0x36527751,0xe78c8bfa),LL(0xe3eee747,0x27f52654),LL(0x9598d907,0x56f20583),LL(0x27cb3712,0x5f91c2d0),LL(0xa3e33c5b,0xc501819f), LL(0x4eded738,0x248490aa),LL(0x27789065,0xde7ac944),LL(0x74f7d38b,0x20138b3d),LL(0x2fb60214,0xae791f60),LL(0xbd033d4e,0x6b4fb300),LL(0xbdfd1f17,0xc69c25d9),
+ LL(0x92717482,0x8a5cb7ae),LL(0xc49d53e9,0x3dc97730),LL(0x5302d584,0x07b1e2cc),LL(0x397b46cb,0x06617e8e),LL(0xe8e9f451,0x73426657),LL(0xdd517335,0x82dcb228), LL(0x5cad6d10,0x39cde297),LL(0x2e4b0ebd,0x76991f56),LL(0x5020cfc6,0xf3e3b3b2),LL(0xe51bbaca,0x35a63790),LL(0x4a23f2ec,0x47b21e6f),LL(0x620e0b06,0x964c6fb5),
+ LL(0xbe832a0c,0x9bd2b68d),LL(0xf1e49e28,0x0efa6b60),LL(0x89586da1,0x67e7f359),LL(0xfd0944ca,0xbc04c8aa),LL(0xf0569b5a,0xb8db5424),LL(0x0cc5546e,0xc27dd125), LL(0xad67b577,0x8f0ef9df),LL(0x9824cbc2,0x1b5d4068),LL(0x4e7329b8,0x2ec1eb64),LL(0xe6896b04,0x3e0e7f37),LL(0xc118b6bf,0xad2bff11),LL(0x40f93fa6,0xe17ec8dc),
+ LL(0x98692833,0xc7e68075),LL(0xe1257bf1,0x311dd043),LL(0xe6258442,0xd4356992),LL(0x05ddf6d2,0x7868deca),LL(0x95a0951b,0x61b3a961),LL(0x61c6fc20,0x0cda07bf), LL(0x2d061312,0xac9aa65d),LL(0xb65f1a23,0x4d9c4f20),LL(0xb06611a8,0x862e4927),LL(0x6cccfba0,0x0d1c906e),LL(0x6a49234c,0x0c82ac34),LL(0xaadbaea7,0x70f3c70b),
+ LL(0xbe21a890,0x0c3d2056),LL(0x8fcfba99,0x1c1ffbfb),LL(0x1fbf56ca,0x1b68a98b),LL(0x396e31cd,0x56fd85ff),LL(0x4382c03b,0xd2ca5844),LL(0x7d3ef917,0xc442030a), LL(0x426afafa,0x4129a731),LL(0x5eaae9c6,0xacff17ff),LL(0x653f3b23,0x9e854180),LL(0x9ee066bd,0xe65a1a14),LL(0x362ea5fe,0x3420084e),LL(0xc7911e2e,0x6fe58801),
+ LL(0x02a97a2b,0x4dd38c42),LL(0xfdb98b51,0x2a8d49c2),LL(0x5cb2e0ca,0x7034c753),LL(0xc4b59d32,0x87e0d6d3),LL(0x35514758,0x9544bb07),LL(0x4ff27eb0,0x9ed743da), LL(0xa0163883,0x1d21a1ad),LL(0x38c57492,0xd6442498),LL(0xf2fd1b7f,0xf46e8acc),LL(0xc8005cfe,0xec9932c5),LL(0xb802c109,0x5fe24f52),LL(0xe3ee9ba7,0x5539c03b),
+ LL(0x05a95afb,0x4c3f4f49),LL(0xf5db9d6b,0xd53a1d3a),LL(0x1844be86,0x0fbd9bad),LL(0x272afc14,0x6b3b80ee),LL(0xaa40a738,0xd727b0b6),LL(0x4d809a37,0x8a21bf45), LL(0x70767232,0x09fb0640),LL(0x45bf5d89,0xa671a2cc),LL(0xd73a211b,0xa7e5ff8a),LL(0xd9a6b97d,0xccdbf621),LL(0xc89e8f56,0x38448e2c),LL(0x2126da09,0x07e4e9c3),
+ LL(0x7adcc8b8,0x762e6584),LL(0x7924eafd,0xedef40a7),LL(0x5913e468,0xe1990688),LL(0x289bc581,0x1882db47),LL(0xe6084637,0x680cd99b),LL(0x1adacd71,0x5249f00e), LL(0x933bf6cb,0x0d3b583f),LL(0x9b02a63d,0x51c86774),LL(0x1dc57813,0x0be0ada7),LL(0x1e2c5f9f,0xd4b63964),LL(0x2c77c4e5,0x810b38b0),LL(0x862013cb,0x9f06b31d),
+ LL(0x6c4be6a0,0x43f0ae67),LL(0x504bffeb,0xabc6a17a),LL(0xdbb4492e,0xd5be6c25),LL(0x84bff97f,0x7efc9ee8),LL(0x062da2e2,0x54fbd9d7),LL(0xc6d2ac32,0x1befeb61), LL(0xcbafef5b,0x14cf6dc0),LL(0x71d12192,0x8e640e47),LL(0xd9a16800,0xd0566543),LL(0xbeb1e28d,0x9cc2ade9),LL(0x38e65833,0xcbfeb450),LL(0xd0f5acb2,0x3852eaac),
+ LL(0x3b5a25dc,0x8bbac220),LL(0x7deb0149,0x6e216404),LL(0x7ae10837,0x3d6eecea),LL(0xeb944203,0x2ab3cd3d),LL(0x5114d51a,0x8fdcb595),LL(0x92471196,0xfbf0f726), LL(0xb20cdb3f,0x6523ea38),LL(0x5796c8f8,0xc08ad84a),LL(0x71b564cb,0xd7977bc2),LL(0x5d66093e,0x16a9e700),LL(0x144cd814,0x67fb9a6f),LL(0xeecab0d4,0xbf2094bb),
+ LL(0x6c50f6a1,0x4f10299a),LL(0x69a1caf7,0xa51c6774),LL(0x0cbede41,0x024b18bc),LL(0x6b03ac7d,0x7883c01e),LL(0x1c5213be,0xa7b99e74),LL(0x85a97540,0x529fad7a), LL(0x03125409,0x0b6fe59d),LL(0x76275b90,0xf1581679),LL(0x6ad18919,0xcaa0969d),LL(0xee7761dc,0xc47afe13),LL(0xdfb12539,0xcae681fc),LL(0x02ea65f4,0x58dabc76),
+ LL(0x35a505bf,0x3f19ec08),LL(0xb0032e38,0x83186122),LL(0x2b3126ec,0xe5c2eac4),LL(0xf752524f,0x4368683f),LL(0x3ab28694,0x03de9cdd),LL(0x61d0253b,0xfc5e70df), LL(0x789a16d4,0x7991742a),LL(0x226ee928,0xefdb8003),LL(0xa4e62a4f,0x0468fe4c),LL(0xd07dd729,0x3ce92ccb),LL(0xfe688c1e,0x447bed93),LL(0xcae39d89,0xd5ff355d),
+ LL(0xc4650b85,0x5e930d65),LL(0x6350da54,0xbe96b2ae),LL(0xfa08bd49,0xcfac4f7e),LL(0xa6e10f64,0x277e8456),LL(0x407ac162,0x41be3067),LL(0x52a9b68b,0xcfd1d032), LL(0x9c337e0b,0x8d8d216a),LL(0x4e1b9cf5,0xace044dc),LL(0xc60d54c3,0xad9a4102),LL(0x28815187,0xb09420f0),LL(0x0b3b8e59,0x881179c6),LL(0x5b09aba1,0x872685ed),
+},
+/* digit=16 base_pwr=2^80 */
+{
+ LL(0x5852b59b,0x22313dee),LL(0xb6a0b37f,0x6f56c8e8),LL(0xa76ec380,0x43d6eeae),LL(0x0275ad36,0xa1655136),LL(0xdf095bda,0xe5c1b65a),LL(0x367c44b0,0xbd1ffa8d), LL(0x6b48af2b,0xe2b419c2),LL(0x3da194c8,0x57bbbd97),LL(0xa2baff05,0xb5fbe51f),LL(0x6269b5d0,0xa0594d70),LL(0x23e8d667,0x0b07b705),LL(0x63e016e7,0xae1976b5),
+ LL(0x236b71dc,0x022aa09d),LL(0xa65a7640,0xb1ce6a0e),LL(0xb38b417a,0x317344c5),LL(0x436451ec,0x29a74cdb),LL(0xa8b1c876,0xd898eb6c),LL(0xb74eeffd,0xf0134f99), LL(0x225d71f7,0x0d9eab64),LL(0xceb3cc2d,0x9679b453),LL(0x14dbff2f,0x37c894ce),LL(0x27065280,0x3704d349),LL(0xba29a0cd,0x9ee435d8),LL(0x09c11c4f,0x675bea14),
+ LL(0xfbecaaae,0x2fde4893),LL(0x30332229,0x444346de),LL(0x09456ed5,0x157b8a5b),LL(0x25797c6c,0x73606a79),LL(0x33c14c06,0xa9d0f47c),LL(0xfaf971ca,0x7bc8962c), LL(0x65909dfd,0x6e763c51),LL(0x14a9bf42,0x1bbbe41b),LL(0xc49e9efc,0xd95b7ecb),LL(0xb38f2b59,0x0c317927),LL(0xb3c397db,0x97912b53),LL(0x45c7abc7,0xcb3879aa),
+ LL(0x714a10e8,0x8b3269a2),LL(0xa4a2727e,0x64cef040),LL(0xe428865c,0xbc5ac714),LL(0xfdaba094,0x531dd17f),LL(0x18d657f2,0x86d24057),LL(0x2f99dbbf,0xe807b0d9), LL(0x6848ef88,0xc428a80f),LL(0xd0b73ce5,0xb3ef0709),LL(0x22a5d255,0xa7526919),LL(0x18a18586,0xbfe63923),LL(0xfcf633b3,0x28a0c772),LL(0x3f3c5298,0xad22b4ec),
+ LL(0x24359b81,0xcd81bdcf),LL(0xdb4c321c,0x6fd326e2),LL(0xf8ebe39c,0x4cb0228b),LL(0xb2cdd852,0x496a9dce),LL(0xd0e9b3af,0x0f115a1a),LL(0xd8eeef8a,0xaa08bf36), LL(0x06e5e739,0x5232a515),LL(0x8407a551,0x21fae9d5),LL(0x8994b4e8,0x289d18b0),LL(0x09097a52,0xb4e346a8),LL(0x324621d0,0xc641510f),LL(0x95a41ab8,0xc567fd4a),
+ LL(0x7176dd90,0xc8c9b0ae),LL(0x2917d487,0xa9560454),LL(0xe62c508e,0xb03b7946),LL(0xe9fe2321,0x60425926),LL(0x80c1d136,0x73b10bba),LL(0x9d218c9c,0xc30a847d), LL(0x2073859f,0x6ed0c8ef),LL(0x432dd97f,0xa176eabf),LL(0xb9e96167,0x3078096a),LL(0xc473e377,0xb28f0e6c),LL(0x683a3bc8,0xb44e4995),LL(0xd3523796,0x483512ee),
+ LL(0xd57c8de9,0x261578c7),LL(0x3836c5c8,0xb9bc491f),LL(0x14c8038f,0x993266b4),LL(0xfaa7cc39,0xbacad755),LL(0xd69b7e27,0x418c4def),LL(0xae751533,0x53fdc5cd), LL(0xc3eea63a,0x6f3bd329),LL(0xe53dd29e,0xa7a22091),LL(0xdc4c54ec,0xb7164f73),LL(0x44d3d74e,0xca66290d),LL(0x4c9ea511,0xf77c6242),LL(0x1f714c49,0x34337f55),
+ LL(0xfa43699c,0x93a62e7c),LL(0x1bc422d9,0xdad73890),LL(0x10cc9544,0x265e3cbb),LL(0x2f37154c,0x28cceb06),LL(0x3bf2e08b,0x6b79b071),LL(0x3ab39091,0x88e025df), LL(0x126522bd,0x50a8d04d),LL(0xb779bacf,0xeabbc1b7),LL(0xc21cc62e,0x3db4336a),LL(0x6fc00450,0x4747f0a3),LL(0x544b2d95,0x067cbf1c),LL(0xfd2be7a7,0x2480b7d8),
+ LL(0xa64b6c4b,0x5ed2b216),LL(0x3aae640d,0x1c38794f),LL(0x8905794f,0x30bbaee0),LL(0xc8699cfb,0x0d9ee41e),LL(0xcf7b7c29,0xaf38daf2),LL(0x43e53513,0x0d6a05ca), LL(0x2606ab56,0xbe96c644),LL(0xe9eb9734,0x13e7a072),LL(0x5ff50cd7,0xf9669445),LL(0x47da6f1d,0x68ef26b5),LL(0x23687cb7,0xf0028738),LL(0x6217c1ce,0x5ed9c876),
+ LL(0xb6ba9a0d,0x21965f08),LL(0x06cab532,0xa744f068),LL(0x5d4b9a92,0xd15d5fa4),LL(0x955ee1f4,0xc79fc89b),LL(0x7b2775f6,0x6367e8b2),LL(0xe2294382,0x2076cd8b), LL(0xc9089d2e,0xe5c20ced),LL(0xd76d6424,0xe6097605),LL(0x02b41ca6,0xa69f79eb),LL(0x63e07498,0x9738d39d),LL(0x92974776,0x35c14a6a),LL(0x7270fd02,0x3a000a51),
+ LL(0x0a3a9691,0x423ba513),LL(0xb3179296,0xf421b1e7),LL(0x1a871e1b,0x6b51bcdb),LL(0x464e4300,0x6e3bb5b5),LL(0xfc6c54cc,0x24171e2e),LL(0xd3e58dc2,0xa9dfa947), LL(0x9de9cfa7,0x175b3309),LL(0x2d1015da,0x707b2529),LL(0x993ea65a,0xcbb95f17),LL(0x0447450d,0x93515063),LL(0x1b2753c9,0x0f47b205),LL(0xe7d427cf,0x4a0bab14),
+ LL(0x58e996c5,0x2724c535),LL(0xd7453876,0x24010322),LL(0x74818d0b,0x3532b79c),LL(0xb27b07e9,0x1984146e),LL(0x471646df,0x948b0c4f),LL(0x32ef8e08,0x551b1c61), LL(0x25f892bb,0x22c08434),LL(0x4853c594,0x8fd873a8),LL(0xffdf802e,0xff0bdf02),LL(0x8239b779,0x527d6993),LL(0x27ace140,0xed66f25c),LL(0xa1a846a0,0x7389d738),
+ LL(0xb5aa7ca1,0xa39def39),LL(0xc47c33df,0x591cb173),LL(0x6bbab872,0xa09dac79),LL(0x7208ba2f,0x3ef9d7cf),LL(0x7a0a34fc,0x3cc18931),LL(0xbcc3380f,0xae31c62b), LL(0x0287c0b4,0xd72a6794),LL(0x68e334f1,0x3373382c),LL(0xbd20c6a6,0xd0310ca8),LL(0x42c033fd,0xa2734b87),LL(0x8dce4509,0xa5d390f1),LL(0x3e1afcb5,0xfc84e74b),
+ LL(0x12e471f2,0xd605097e),LL(0x2bb4aa64,0x8cff86ab),LL(0xea65a755,0x4a878412),LL(0x2f2b55fb,0xfa790b77),LL(0x5098a08f,0xd13fb9b3),LL(0xb359117d,0x39e474d7), LL(0xe8e5a3d5,0xc37499c1),LL(0xc7586167,0x5abf6859),LL(0x310fec8a,0x13143ba8),LL(0x75918fc2,0x3543979f),LL(0xcbb0bde9,0xf55a9b62),LL(0x29359b93,0xd6c1d000),
+ LL(0xf2cd8a9c,0xb028334d),LL(0x570f76f6,0xb8719291),LL(0x01065a2d,0x662a386e),LL(0x53d940ae,0xdf1634cb),LL(0x8f5b41f9,0x625a7b83),LL(0xee6aa1b4,0xa033e4fe), LL(0x1e42babb,0x51e9d463),LL(0x0d388468,0x660bc2e4),LL(0xfcbb114a,0x3f702189),LL(0xb414ca78,0x6b46fe35),LL(0x4a57316b,0x328f6cf2),LL(0x381ad156,0x917423b5),
+ LL(0xd52eb122,0x0233e423),LL(0x1154b0c9,0xc2848352),LL(0x6349e35b,0x2ca09cef),LL(0xded2ec54,0x3b70afc3),LL(0x52dded3d,0xc813474d),LL(0x12f00ee0,0x2d3f21bf), LL(0x92f215c6,0xa0908f76),LL(0x4e9c0440,0xb97d60e9),LL(0x34b6a8e0,0x84ad10c1),LL(0x6e7c163e,0x6f37fd95),LL(0xd057e0c3,0x7caae8c8),LL(0x553721a2,0x534f52c2),
+},
+/* digit=17 base_pwr=2^85 */
+{
+ LL(0x72a041b2,0xa354c1de),LL(0x29d1330a,0xe83df259),LL(0x9d532bbd,0x67661099),LL(0x52011751,0xb7c2f4cf),LL(0xf659e35e,0x6945d34f),LL(0xa1303b7b,0x6217d20b), LL(0x25751bad,0xa200ddba),LL(0x01d3566d,0xa74a7290),LL(0xaa82b46f,0x3018445f),LL(0xfccedc1b,0xc3e6a3ac),LL(0x3353e29f,0xe86ae870),LL(0xfd7e8547,0x1c8085bb),
+ LL(0xb4dcea78,0x306b63e3),LL(0x13636935,0x4b102092),LL(0x8bdeddea,0x36bb6889),LL(0x67a329ac,0x9331655d),LL(0xba92ccce,0x14c7fe26),LL(0xbe0519b4,0x4e7d6929), LL(0x164d50e2,0x0dc39dbd),LL(0xb1679cc5,0xd4c430a0),LL(0xfa8682ba,0xc7f78818),LL(0xb60aad97,0x43396ead),LL(0xff2c64cc,0x751784d7),LL(0x866af43e,0xd37928be),
+ LL(0x5a91c9aa,0xf0a69e68),LL(0x05c13197,0x0304d201),LL(0xcd14af1d,0x773a3ab7),LL(0x558d555d,0xc0b88edd),LL(0xd2e63dd6,0xeb12d197),LL(0xbcd9cdb3,0x4a8e849f), LL(0x965eaa14,0x06432985),LL(0x1a5a6f43,0x453d9386),LL(0x4171b9bc,0xbd28f616),LL(0xbbfcf90a,0x37781639),LL(0x3a36084d,0x1f93898f),LL(0xdd00ca75,0x1fefd8b7),
+ LL(0x2b2f1bcc,0xb9207dbc),LL(0xa3e83ef7,0x6afd6871),LL(0x34ba150b,0x49924e55),LL(0xdfec9972,0x2935ebf1),LL(0xb76f870d,0x34bf5e94),LL(0x4c20385c,0x22d0f32b), LL(0x8ccc8e72,0xc78ac172),LL(0x0ccecb0a,0x7b45b822),LL(0xcfb4b8ba,0x76c67ee4),LL(0xcd8724b6,0xecfaefb2),LL(0x340bc1ef,0xe9bc3d67),LL(0xca5541b5,0xed40b2b9),
+ LL(0x069e6432,0x9b8a3eb3),LL(0x721397f7,0x43aaa7fc),LL(0xa7e83a71,0x46e23c6c),LL(0x93fa3c25,0x71b261d5),LL(0x0f523a72,0x4a47a105),LL(0x8dcad752,0x31919e89), LL(0x0c5dd2ad,0x4c8b06e7),LL(0x8bdc55e7,0x677ec5f3),LL(0xcb1b5828,0x4372d55d),LL(0xf04dd321,0x7bf054c1),LL(0x2e44584e,0x4e8c1a99),LL(0x51d35d78,0x68078037),
+ LL(0x81d311b3,0x25ae3499),LL(0x3b16037b,0x8640f52a),LL(0x1d947065,0xac083994),LL(0xe2e693d2,0x3723c75e),LL(0xb66f429e,0x65040a51),LL(0x035a3a53,0x7f582b0b), LL(0x0a166da6,0x20eca9e1),LL(0x2c4cc565,0x45b37e20),LL(0x7a8a96e3,0xeab88295),LL(0xb60a1a1b,0x99e771da),LL(0x23b03965,0x2cdd778c),LL(0x91052478,0x8d4d7a72),
+ LL(0x7e8f73b5,0xa52d3c2d),LL(0x51842657,0x86d80633),LL(0xb3949eba,0x58f01253),LL(0xe79367d0,0x97689f15),LL(0x0d820328,0x918bf9a3),LL(0x41c959df,0x2d4bc994), LL(0x8c16ee54,0x37392f6e),LL(0xe6f0849b,0x9f726d58),LL(0xb8208f08,0x497de1e4),LL(0xd51a29b3,0x60c51233),LL(0xc9e1d465,0x0f61fb03),LL(0xfbe2613c,0x09494bd0),
+ LL(0x154d0f99,0x4f293478),LL(0xd07a24b3,0x1b82320d),LL(0x64d55f6f,0x1bf7c94f),LL(0x725c5125,0x4489b57d),LL(0xb1b6a091,0x3aa4d43a),LL(0xcf7a60fa,0x054842bd), LL(0x2aeb4cb6,0xaa918a4d),LL(0xac7d317b,0xcbdaff99),LL(0x6812a03c,0xed0e00a1),LL(0x0b0a1e4b,0xb09acf27),LL(0xac28386b,0xc73a41f7),LL(0xf4cd1321,0x43134dbd),
+ LL(0xd8c33924,0x08336ffe),LL(0x5140b253,0x15b56cbf),LL(0x306caedb,0x38dcd310),LL(0x47944afd,0x04ecd496),LL(0x68a48f95,0x1280d23f),LL(0x34363c6e,0xf4142204), LL(0xcaa8717f,0xd0a397ea),LL(0xc3994b80,0xb51a1669),LL(0x6c56808b,0xa02eed91),LL(0x83545c3c,0xc3ab55c5),LL(0xfd26114a,0x8b835820),LL(0xffff324c,0xe0cfa4a6),
+ LL(0x51c0d95e,0xcf63d279),LL(0xac86a014,0x3b170a0b),LL(0x881095e1,0xc21eaaa9),LL(0x6069a3eb,0xed2fda11),LL(0xbd2f1c5a,0x536264b9),LL(0xde312c2c,0x819e1cff), LL(0xdfd6ce38,0x6c30f983),LL(0x980b439e,0x2f32cc4c),LL(0x3b9c03b2,0x9fab10b6),LL(0x011ab74a,0xdfebe34e),LL(0xb80963f6,0x587360e3),LL(0x8692e352,0x3db1f610),
+ LL(0xfe3d070b,0x63a094c5),LL(0x88515eb1,0xf769b919),LL(0x50d1131d,0xafe86e14),LL(0x6774d3d4,0x6bf27788),LL(0xffd805d0,0x7231d699),LL(0x6304116e,0x05132e5b), LL(0xe34ce5bc,0x3d5e255b),LL(0xc95e3089,0xfd9c3bd0),LL(0xb83cbac9,0x22a24023),LL(0xb0b3b98a,0xfb6d2b6f),LL(0xf7e36fcd,0x74af1115),LL(0xf9da3bf0,0xcfe15eaf),
+ LL(0xbb2fcdae,0x266d2c1c),LL(0x52be93f2,0xb538d4a2),LL(0x73bd0094,0x774c88ba),LL(0x81a7e042,0x65283a9b),LL(0xd0381625,0xe1438bbf),LL(0x4d0db206,0x450e1f64), LL(0x4e60fc4a,0xb38ae9ef),LL(0x12719817,0x14ce87e1),LL(0x570303f0,0x831d41ec),LL(0x28850444,0x71729170),LL(0xccd609f5,0x2077ea32),LL(0xcd273fdc,0x091d1166),
+ LL(0x4b2ca517,0xdf216dd8),LL(0xc6b74c4d,0xb3eec4b9),LL(0x1c14e77b,0xf564e6c8),LL(0x2c2c9395,0xcde25f1c),LL(0x049fcc83,0x7e31f7a5),LL(0x9284c753,0x6913707b), LL(0x58e6eb5f,0xb92a6f24),LL(0x95148292,0x85b0cab5),LL(0x7449be92,0xeaad036d),LL(0xeb94a702,0x2f6a2888),LL(0x47d59fb0,0xd7d8773d),LL(0x03c0bf25,0x612d2573),
+ LL(0x84d2c3bb,0xb872a105),LL(0x39196026,0x44bca571),LL(0x4e352e5d,0x857327d8),LL(0xd925f99f,0xa6c6004a),LL(0xbab79ead,0x48aaf266),LL(0xadab2a3f,0x213ad923), LL(0xf371cc48,0x3be29b6d),LL(0x2385c9f4,0xe732b906),LL(0x23f0a84e,0x562e0be1),LL(0x28c4b0db,0xbb6b0172),LL(0xf4c6d8be,0x71a93ae5),LL(0x551f1fe9,0x76b8bb16),
+ LL(0xc39926a8,0xbbfaaa94),LL(0x60a138aa,0xb9a59fdb),LL(0x947e30e9,0x217a1aa2),LL(0xc52c9fff,0xcac988c9),LL(0x3bae3c39,0x5676473a),LL(0x857f04c9,0x7d84b353), LL(0xdd324e24,0xdeded30c),LL(0x9c242899,0xf07c678a),LL(0x8cb64f3b,0x956d0553),LL(0x502cb2b0,0x9d34e2f5),LL(0x51dd03b3,0x99e1054a),LL(0x4d60a593,0x86b8bfa5),
+ LL(0x754d15e9,0x10a53b90),LL(0x5f4c7218,0x6cde9a0c),LL(0xabef2b96,0x740d513f),LL(0xd3f802fd,0xff6cc47c),LL(0xeb0627af,0x1be6825b),LL(0x5886c2dc,0xdb21ede5), LL(0xf5daaed7,0xb6cfb2c6),LL(0xfae29a9c,0x68b61aa8),LL(0x3a5a485b,0x7a1e16f5),LL(0xe7b2223e,0x16b60b92),LL(0x36a13a9b,0x332f33d8),LL(0x876cd1a2,0x4567c313),
+},
+/* digit=18 base_pwr=2^90 */
+{
+ LL(0x4aea3fa2,0xa896d28e),LL(0x6db06ee9,0xc6137a45),LL(0x06fb15cc,0x1bbafe8c),LL(0x1cdffdad,0x2daab296),LL(0xe1119b3a,0x984defc8),LL(0xde2a25a3,0x9cd44c3c), LL(0x54ed6d73,0xa7f54ece),LL(0x50907054,0xd283017f),LL(0x6a3b9442,0x69130efc),LL(0x6785163b,0x5d17f127),LL(0x172b1d0a,0xc019911b),LL(0x7e3e093c,0xa19c745f),
+ LL(0xab83d932,0xe185bdc2),LL(0xd7c4e754,0x0a75845d),LL(0xc3fe5695,0x1f6f3397),LL(0x61f6a04f,0x6c9f3a5f),LL(0xb390a92b,0x3c0f9d4b),LL(0x4793b454,0x9e3336b7), LL(0x1472f06b,0x91ad0c34),LL(0x892cbdd7,0x4110047a),LL(0x65d53c83,0xfa24d905),LL(0x4176007d,0xd63e5833),LL(0x2cd1623c,0x741089fd),LL(0x2685d345,0x6b3d9202),
+ LL(0x3586c802,0x1ac37f31),LL(0xa9cb8662,0x70daca37),LL(0x8d9c7bf6,0x6e57d6a7),LL(0xe97eec9b,0x27069e2c),LL(0x4e877a82,0x16284ceb),LL(0x774f6288,0x30856e26), LL(0xfa33820f,0x88e53ea7),LL(0x715ced07,0xbfe3b89f),LL(0x743b11c6,0x6cf55589),LL(0x2edd201e,0x020f8a09),LL(0xb15c27e0,0xc80afc2c),LL(0xcc53751a,0x56557371),
+ LL(0xc9cb7f6d,0x1d510157),LL(0x46ab7372,0x532a0773),LL(0xc6dde9e2,0x2ea07e2f),LL(0x37d5bb1f,0xceed9ad9),LL(0x98cc6e28,0x3121994b),LL(0x67ad8fc4,0x67d2fbb5), LL(0xdc9f195d,0x34707fb3),LL(0x1fd5a013,0x6a601f48),LL(0x81ef6cb5,0xfe939b8d),LL(0x1223a9a1,0x5c51e8ab),LL(0xdb74cf37,0x8f6d7993),LL(0x972808e1,0x0b81c5b7),
+ LL(0xe26e1212,0xcc54c384),LL(0xfee6836b,0xf4c6a3cb),LL(0x91cccc5d,0x62589405),LL(0x135a7e68,0x5ed3f3ce),LL(0xe1994768,0x11cc139f),LL(0x77c07147,0x6386c5c4), LL(0x75fb9b2d,0x444230ae),LL(0x8029bfeb,0xa5972fd9),LL(0xdb5f8291,0x46e687ec),LL(0x0de6d5f7,0xf00bf689),LL(0x36af6be3,0xbf946c50),LL(0xd39dee1d,0xd6d9aaef),
+ LL(0x3bf921af,0xcb4e8512),LL(0x532e81d3,0x28fc6332),LL(0xf69f907d,0x682d8637),LL(0x5f759a16,0xbd9fa8f4),LL(0x51f03716,0x091ea9fa),LL(0x32c630e9,0xd685a141), LL(0x3d249cf4,0x7600c9ac),LL(0x002cd2b5,0x687e2022),LL(0x55334058,0x7ec205ab),LL(0x3ecf1368,0x9d0d86b1),LL(0xfc7baf6d,0xb3fc17a7),LL(0x361c91cd,0x57939961),
+ LL(0x37318b6d,0xeb74751b),LL(0x5abe7213,0xb967a3cf),LL(0x02ab79cc,0x80741539),LL(0xafbc3e08,0x11b647ae),LL(0x9e949616,0x3e34458e),LL(0x72591fad,0x6d714d62), LL(0x131b7659,0x813ba91c),LL(0xfd0e295e,0x7f836d36),LL(0xc5d7be99,0x192531f8),LL(0x901e480e,0xce83f561),LL(0xf1bba4dd,0x7b187da4),LL(0xf5c82a33,0x090754d0),
+ LL(0x010c0754,0x0db33228),LL(0x8eca7c59,0x10635ffa),LL(0x0e8a38fa,0x6efd8538),LL(0x769360d8,0xc1812ea5),LL(0x76f27ef5,0x505723dc),LL(0xf35af2e8,0xd0358e02), LL(0xd99419ee,0x9f7bb7fe),LL(0x430a0e2d,0x87c66e83),LL(0x773eaf7f,0x01187549),LL(0x89d51bda,0x05bbbba4),LL(0x640ccde6,0x52cabb06),LL(0xe7ff387d,0x0d5cb557),
+ LL(0x526f59f3,0xa338a9f7),LL(0x216004f8,0x9b866285),LL(0xeb6fcc58,0xe94cfd05),LL(0x2432ba24,0xc60b12ea),LL(0xef1227f5,0x3bb7acf1),LL(0x5ec503dd,0x176e0ef7), LL(0x236f9707,0x9c2337f7),LL(0xe029aa27,0xdc2b0f77),LL(0xa5f85372,0xb795424a),LL(0x1485af98,0x2eb6d54b),LL(0x7e3f46c7,0xd2ce87dd),LL(0x830f743c,0xc5eaf6ad),
+ LL(0x10e06f1a,0x709d61ca),LL(0x78eba75c,0xaa1e9fc5),LL(0x914b2cfc,0xf85d062f),LL(0x9089d85c,0xe73b3baf),LL(0xc4a284b9,0x4ac05fea),LL(0x3acb7268,0x92c78a43), LL(0xee45bb4d,0x7b5586f8),LL(0x6ac0a9e7,0xc39a0d0e),LL(0x4d6f9ab8,0xe4bbe3d5),LL(0x1fd46a08,0x1489463f),LL(0x29dba364,0x3ba31825),LL(0x8138511b,0x94f000d6),
+ LL(0xee9b6d83,0x9f8eafec),LL(0xf4eac676,0x069d5ad9),LL(0xb5687ebb,0xbf9ccc6e),LL(0x9d213f1d,0x5d0f44be),LL(0x0d0d6e70,0x372b5296),LL(0xf8bb90f3,0xef1466ef), LL(0x949789b2,0x2ec1daae),LL(0xb40be288,0x5c7d9b6d),LL(0xc351e87f,0x48319460),LL(0x5db0fde9,0xfeaa721c),LL(0xd16dc699,0xb33d58e9),LL(0x3ca8d3d6,0xe3f296f2),
+ LL(0xc39c1cef,0x70187dfb),LL(0x0c50c71e,0xa785216e),LL(0x6a6c0d60,0x30188b81),LL(0x6a27e97b,0xeaeda67d),LL(0x6ba389aa,0x4a519282),LL(0xa2bf1273,0xb96c7c7e), LL(0x267fe714,0x8ff10657),LL(0x996d91b7,0xdff4a271),LL(0x1dc7aed4,0xe34ba3e1),LL(0x38853d61,0xc457048b),LL(0x1ccbf658,0xe89825db),LL(0x6b255edd,0x68c7b455),
+ LL(0x49d38208,0x2f6f6a0f),LL(0x11ee2340,0x38fbcb5b),LL(0x865a4304,0x06e43b73),LL(0x06d728ad,0x08c696e6),LL(0x961c650b,0xdb82930d),LL(0xc20c5b68,0xf1de8cb5), LL(0xf8e1f9b9,0xd8e3cf7b),LL(0xf3a304ed,0xd6e081ab),LL(0xcd3cb8bb,0xf08d8624),LL(0xb26aa9cb,0xa3fe7742),LL(0x0de295f6,0xa3a9d220),LL(0xb9579b7f,0xfd465046),
+ LL(0x74871e18,0xdc14cb2a),LL(0xfcb8974a,0x017b1340),LL(0x6e93c20f,0xea5cb054),LL(0xa9e2ad1f,0xa7c078ad),LL(0xbeb26838,0xa37207d4),LL(0xde7ee8ee,0xcd8b3b25), LL(0x2801a7ff,0xdca6606a),LL(0x0f8af3fa,0xad2fedcf),LL(0x9b530c05,0xf27d30b4),LL(0x6b2a4613,0x071fc1c3),LL(0xb72cea9f,0x363aaa99),LL(0x3d350374,0x7a33ed8f),
+ LL(0xf2f3e9ea,0xac02833f),LL(0x956fb86e,0x43bcbde0),LL(0x95735c62,0xf888696b),LL(0xe7b2fd9e,0xefa03aae),LL(0xe75b2684,0x0e563e92),LL(0xd7f335bd,0xa49d2f31), LL(0x8ac31404,0x08664171),LL(0x07ccf31f,0x35866eab),LL(0x04122373,0x6bca6111),LL(0xcb21398b,0x730c92e5),LL(0xb93102d5,0x283791a8),LL(0x50dc1b38,0x4b41d94d),
+ LL(0xbb20fabf,0xc377b373),LL(0xf986b847,0x68d3aa52),LL(0xf39b6894,0xd9c2f2ad),LL(0xbd6da22e,0x1bbff106),LL(0x7e09678e,0x3f7e5b8e),LL(0x7ed3ee78,0xad6a8789), LL(0xaf9807b9,0x689e6b31),LL(0xbd1f6ef2,0xeca87778),LL(0xdda78c54,0x17d3277e),LL(0xefb65cb7,0xe686cacc),LL(0x19a30f0c,0x758aa1ab),LL(0xb11f071e,0xb40df97f),
+},
+/* digit=19 base_pwr=2^95 */
+{
+ LL(0x953b9223,0x16f3708b),LL(0x770e7cf3,0x0d3780f8),LL(0x27bb71a8,0x97a615b2),LL(0x162f8b55,0xa8b9a864),LL(0xd91e3fb9,0x80ee8362),LL(0xf83a4ff6,0xb2009a09), LL(0xc1696281,0x07a7873a),LL(0x23095ddc,0x17ff00c2),LL(0x860d60ba,0x427f683d),LL(0x1f87d32a,0xea995927),LL(0xa050319d,0xb2ac69fa),LL(0xd2d0b9ce,0x30c362b9),
+ LL(0xf26feef9,0x24480c57),LL(0x3a0e1240,0xc31a2694),LL(0x273e2bc7,0x735002c3),LL(0x3ef1ed4c,0x8c42e9c5),LL(0x7f4948e8,0x028babf6),LL(0x8a978632,0x6a502f43), LL(0xb74536fe,0xf5f13a46),LL(0xd8a9f0eb,0x1d218bab),LL(0x37232768,0x30f36bcc),LL(0x576e8c18,0xc5317b31),LL(0x9bbcb766,0xef1d57a6),LL(0xb3e3d4dc,0x917c4930),
+ LL(0xaae4bfd4,0xff41d51f),LL(0x17c44fac,0xcf50b141),LL(0x657a1ea4,0x078b808e),LL(0x93c00c55,0xc5aac1a8),LL(0xcc4d1c0f,0xcb99cfd0),LL(0x3fa123a6,0x1d104893), LL(0x023ca92f,0x49646059),LL(0xf3982134,0x5833e326),LL(0xc5781cdd,0x2e0d4bc9),LL(0x8d5e75f5,0x5f7f84ed),LL(0xe1e8a383,0xb6655f1f),LL(0x296e4943,0xcc18514c),
+ LL(0xb475d8f3,0x53ebbaae),LL(0xff76beda,0x3d6ea31c),LL(0x340986b4,0x3c15f25d),LL(0x3365312a,0xc5925d2e),LL(0x51641f96,0xc35d3ee2),LL(0x984128e4,0x11eb2f75), LL(0x3d04bc99,0xb41a21a8),LL(0x6436c3d0,0xf2d28600),LL(0xfaf5663c,0x4ffcf4c0),LL(0x0a62c9dc,0x889d285a),LL(0xcb2d60c5,0x0908665a),LL(0x0a131be5,0xe2f19c59),
+ LL(0xb1e46617,0xa93a7dbc),LL(0xd77195a7,0xd0ad4a47),LL(0xe5948165,0x020d8467),LL(0x25267b60,0xa3375bd9),LL(0x8c44e226,0x8cf54ab2),LL(0xf2bf5bfe,0xc4f7f467), LL(0xc414077a,0xde336f92),LL(0xc92d7219,0x92656952),LL(0xc09ee1d9,0x31645a70),LL(0x292630eb,0x8cfe567d),LL(0x7c16c0a8,0xb835edb9),LL(0x48dee1be,0x8ac88e9c),
+ LL(0x22319bfb,0x318feb4c),LL(0xa1ee9625,0xfd0a1331),LL(0x5b238661,0x1e4a786d),LL(0xa722c591,0x88e04305),LL(0xf406cb01,0x38eb062a),LL(0xe7216364,0x21caa381), LL(0xf0e1f665,0x450c1d29),LL(0x207a1320,0x369af7bf),LL(0x6f6c0680,0xfe46a53a),LL(0x25eac032,0x4553199a),LL(0xffc49722,0x41fa659a),LL(0xbbcb7a29,0xfb9e0c73),
+ LL(0x7e09207e,0xca53bd85),LL(0xfa171b01,0xa304cf7d),LL(0x881beffa,0xa93499d7),LL(0x95cf1295,0xc0b04ee5),LL(0x90cd1e30,0xe0cf548e),LL(0x821b4efc,0xfa82436e), LL(0x979ab01d,0xbb4d7958),LL(0xd48ca82b,0x4a1c815b),LL(0x627640fd,0xbacf6a1b),LL(0xabd9a758,0x31150946),LL(0x906bea56,0x2c9d7d14),LL(0x17e06ed1,0xd2450bcf),
+ LL(0x091354ff,0xc0de60f5),LL(0xa1bd1975,0xd7cc38bb),LL(0xe734e2df,0xf4122aa8),LL(0xef773db6,0x08f40f63),LL(0xce2d71c5,0x0a7e9484),LL(0x78a3f825,0xcc791733), LL(0xb47beec9,0x0cac7a5b),LL(0xa3f7b5b6,0x1cbea0e4),LL(0xd3e18145,0xecf19a90),LL(0x0aadf689,0x0d1b062a),LL(0xf3f0acf7,0x42299f1f),LL(0x5ac252b9,0x63a64539),
+ LL(0x8db83d7d,0xfda26247),LL(0x2ad24ac5,0x3a2d1c29),LL(0xa01d0daa,0x586b6219),LL(0x949dbc96,0xa92f773b),LL(0x5dc355d0,0x89c9668d),LL(0xb5e40672,0x0aaeecdf), LL(0x2c701014,0x5945a47f),LL(0xc5590e89,0x50e4a494),LL(0x7fd21edd,0x307cbd9f),LL(0xb85543b7,0x96005378),LL(0xba214861,0x9f87fddf),LL(0xf9d9d2c7,0xcdd615c5),
+ LL(0x5bd11a42,0xa4bfe151),LL(0x0ea6729b,0x38920da2),LL(0xa0ee708f,0x41e28260),LL(0xabc9d5f5,0xff4fdff4),LL(0xffaae99e,0x6ed92241),LL(0xc04fe4d9,0x6075ce0d), LL(0x5db066f5,0xf10a173e),LL(0xe75ef129,0xa2edee12),LL(0x8ed02e85,0xd2a0823f),LL(0x2e522dc1,0xffa78cf4),LL(0x00c939fd,0x07041e46),LL(0x3a9a8bba,0x3369357f),
+ LL(0x1a4e68b1,0x3b202533),LL(0xf7504686,0xa2ead2d7),LL(0xa569cb36,0xb0bb1808),LL(0xc015c68f,0x953f539c),LL(0x9a6fefe1,0x45c876dc),LL(0xbede60ec,0xe87ce8ac), LL(0xf3c69642,0xecfc84dd),LL(0x3a90826b,0xabe549ed),LL(0x57cca429,0x03a29df4),LL(0xb8e72b83,0x08d4e9a1),LL(0x79e7ef57,0x88d9c51b),LL(0xdc075e38,0x48102f0e),
+ LL(0xba264fa8,0xa1fc20f7),LL(0x4105e64a,0x0f625415),LL(0x8e2e8e16,0x2e5581c2),LL(0x4c456234,0x912c80fa),LL(0xe9e31ad4,0x7fd61fb9),LL(0x1c19e811,0xa5de4e7d), LL(0x2961b64d,0x6a7ab2cc),LL(0x5bb2da03,0xbf06db25),LL(0xab06af4d,0x33f76a85),LL(0x4866378d,0xda387e54),LL(0x56826f8c,0xbb71deb8),LL(0xeb64ecb6,0xbbe3ce38),
+ LL(0xbb63bdd0,0x2a6f3d84),LL(0xc2792d41,0x8b5becec),LL(0xec9fa26b,0xb0412202),LL(0xbc706607,0xbdaad566),LL(0xd8d361d4,0xd34e3ef1),LL(0xeb3c3f14,0xb4fe020e), LL(0x82656dd4,0xc6bac95d),LL(0x88ffb328,0x8cf56ba0),LL(0xdc84969a,0x33f04dda),LL(0xa5f1d0eb,0x642d93d6),LL(0x93ce88dd,0x122e35f6),LL(0x02c0e82a,0xbcffc369),
+ LL(0xfd5d084c,0x0e935934),LL(0x9121a6e0,0x7cd4992a),LL(0x8e15d863,0xab773dba),LL(0xcab64644,0x9cea4a51),LL(0x2efff061,0x516754d7),LL(0xcd3a36a4,0xd8af89da), LL(0x4615774e,0xc7d352ac),LL(0x21ae0d27,0xd1bb914b),LL(0x9199938e,0x8a8aed97),LL(0xcd6f3495,0xeb06789a),LL(0x775f93ee,0xc51d7766),LL(0x0a8af851,0x7eb6909f),
+ LL(0x6a82fd92,0xf6708309),LL(0xfffaccf2,0x08652b2b),LL(0xf0da4c5c,0x8ac0e67b),LL(0xb0fabc5d,0x26c5a4be),LL(0xb1dcad44,0x3e5ad350),LL(0x3aa30664,0xb539e10e), LL(0xa41fef81,0x266f4163),LL(0x78ef116f,0x860401ec),LL(0x3563575b,0xb0fc5cc3),LL(0xd4c9e03a,0xc28a5cb5),LL(0xcc9bbe6c,0x93399eff),LL(0x9c9a84a2,0x50a48cb2),
+ LL(0x5c1d4586,0x44bfd166),LL(0x8d1d86d6,0x46434e19),LL(0xc3936683,0xe50fcf81),LL(0x8b08680f,0xc9b4eb06),LL(0x2832aab0,0xf90882c5),LL(0xecbf5dda,0x42823cef), LL(0x44ae08f0,0xfd4d51c7),LL(0xbbd21c1c,0xb54a08f1),LL(0xfb187c34,0xb72953db),LL(0xf8ed037f,0x166f7f26),LL(0x097bad45,0xd2b1077a),LL(0x790dd808,0x47794cdc),
+},
+/* digit=20 base_pwr=2^100 */
+{
+ LL(0xd1d1b007,0xa05c751c),LL(0x0213e478,0x016c213b),LL(0xf4c98fee,0x9c56e26c),LL(0xe7b3a7c7,0x6084f8b9),LL(0xdecc1646,0xa0b042f6),LL(0xfbf3a0bc,0x4a6f3c1a), LL(0x51c9f909,0x94524c2c),LL(0x3a6d3748,0xf3b3ad40),LL(0x7ce1f9f5,0x18792d6e),LL(0xfc0c34fa,0x8ebc2fd7),LL(0x780a1693,0x032a9f41),LL(0x56a60019,0x34f9801e),
+ LL(0x62c36887,0xa4b957d2),LL(0xfc24cff8,0xaf15a485),LL(0xa271d9e0,0x11575e80),LL(0x4b9367e5,0x0fff68d4),LL(0x2279779f,0xf55ba673),LL(0xd4d68f68,0x9d72cca6), LL(0x590ffe4c,0x01474ab1),LL(0x074d634b,0xd20f44e1),LL(0x36111d25,0x63903a83),LL(0xab531cef,0x37342a5f),LL(0x702ed867,0xd3c93fe7),LL(0x6279f7e1,0x05d14369),
+ LL(0xf0db3751,0xb398290c),LL(0xba42c976,0x01170580),LL(0x56560b89,0x3e71aa29),LL(0x50e6647b,0x80817aac),LL(0xa0be42da,0x35c833ad),LL(0xf1baba4e,0xfa3c6148), LL(0xcd8f6253,0xc57be645),LL(0xc657ad0d,0x77cee46b),LL(0x0defd908,0x83007731),LL(0x899cba56,0x92fe9bce),LL(0xbceffb5a,0x48450ec4),LL(0xf2f5f4bf,0xe615148d),
+ LL(0xcbaf4685,0xdccf68bc),LL(0x270a2bcc,0xb333e464),LL(0x254dd3e3,0xe43ae199),LL(0xddce5c84,0xe8526e26),LL(0xea0b4258,0x52bad815),LL(0x094574c4,0x67c12c1b), LL(0x861545b7,0xa5362fcb),LL(0xc2b2eb62,0x3e904c35),LL(0xeeffc2cd,0x0f9312b5),LL(0x14de4e5b,0x5475657b),LL(0xf0233fa5,0x746e67d4),LL(0x35471ec2,0xb5157d7f),
+ LL(0x90b86166,0xf55edabb),LL(0x075430a2,0x27f7d784),LL(0x9bf17161,0xf53e822b),LL(0xafe808dc,0x4a5b3b93),LL(0xd7272f55,0x590bbbde),LL(0xeaea79a1,0x233d63fa), LL(0xfe1eba07,0xd7042bea),LL(0x10750d7e,0xd2b9aea0),LL(0x31078aa5,0xd8d1e690),LL(0x7e37bc8b,0x9e837f18),LL(0x85008975,0x9558ff4f),LL(0x421fe867,0x93edb837),
+ LL(0x1f23a0d8,0x3503d937),LL(0xc321dde0,0x64c598a8),LL(0x5b52e0f0,0x67f101ef),LL(0xf955b5fa,0xb6b5b4c2),LL(0x880e0569,0xb5f03d53),LL(0xc99393ef,0x121c3ac1), LL(0x57330666,0x90755bd6),LL(0xd4d71d3d,0x70ae5793),LL(0x9e9ce792,0x326ffd51),LL(0x96ccfa14,0x1b772d73),LL(0x874a22de,0x652710f4),LL(0xdb210342,0x72768469),
+ LL(0x83d55b5a,0xaa6489df),LL(0x86bf27f7,0xea092e49),LL(0x5fa2efec,0x4d8943a9),LL(0x720e1a8c,0xc9baae53),LL(0x95a4f8a3,0xc055444b),LL(0xa7c1206b,0x93bd01e8), LL(0x714a27df,0xd97765b6),LL(0x193f1b16,0xd622d954),LL(0xf1503b15,0x115cc35a),LL(0xa9fa21f8,0x1dd5359f),LL(0x6dfed1f1,0x197c3299),LL(0xf77f2679,0xdee8b7c9),
+ LL(0x171c1439,0x58d6998e),LL(0x01feedec,0xfd4a98f4),LL(0x65739fce,0x420b2a01),LL(0x22f7a073,0x5c5db308),LL(0x05042f00,0x016c5478),LL(0xa12413d9,0x5fc73ce2), LL(0xe932aa17,0x8ceb2d70),LL(0x0537afaf,0xb4d66b67),LL(0x339c146b,0x2638d012),LL(0x28ac0555,0x02fbb7b6),LL(0x62d46e63,0x7fcb0c81),LL(0x066d088e,0xeaa9ff4f),
+ LL(0x394fd855,0x5405179f),LL(0x49fdfb33,0xc9d6e244),LL(0xbd903393,0x70ebcab4),LL(0xa2c56780,0x0d3a3899),LL(0x683d1a0a,0x012c7256),LL(0x80a48f3b,0xc688fc88), LL(0x6f7df527,0x18095754),LL(0x71315d16,0x9e339b4b),LL(0xa956bb12,0x90560c28),LL(0xd42eee8d,0x2becea60),LL(0x50632653,0x82aeb9a7),LL(0xdfa5cd6a,0xed34353e),
+ LL(0x2d189057,0x8273db99),LL(0xe1b5f8cc,0x4d1b05fc),LL(0x0a7c32d1,0x5fec7c83),LL(0xea9b4d45,0x28ddaf28),LL(0xa2fc58be,0xb6bb62ac),LL(0x4a41852d,0xfc65b7aa), LL(0x1c9e6045,0x6e765194),LL(0xfc116257,0x3acabf28),LL(0x4b5a4ba8,0xc9d5e805),LL(0xcbdcf1eb,0x9a072259),LL(0x439fc8fc,0xc67cf643),LL(0xb4333aa8,0x917ef6f8),
+ LL(0x91aecce4,0x82154d2c),LL(0x5041887f,0x312c6070),LL(0xfb9fbd71,0xecf589f3),LL(0xb524bde4,0x67660a7d),LL(0x724acf23,0xe99b029d),LL(0x6d1cd891,0xdf06e4af), LL(0x80ee304d,0x07806cb5),LL(0x7443a8f8,0x0c70bb9f),LL(0x08b0830a,0x01ec3414),LL(0x5a81510b,0xfd7b63c3),LL(0x453b5f93,0xe90a0a39),LL(0x9bc71725,0xab700f8f),
+ LL(0xfc37efed,0x311ebba2),LL(0x60cfd6bc,0x8a6a42d6),LL(0xf2a4871e,0xb4051b3a),LL(0xc2f0ebf0,0x66ce77b8),LL(0x0ad28477,0x84abc948),LL(0x63d9d11a,0xc82e5c62), LL(0x007dcf93,0x99ffc70c),LL(0xd964c822,0x5e974edf),LL(0x513085e3,0x0fee3572),LL(0x46ce8444,0xbe67a880),LL(0x06d17129,0x136ceeb8),LL(0x662d86fd,0x0da512ae),
+ LL(0xb9f00793,0x9401aec2),LL(0xb997f0bf,0x064ec4f4),LL(0x849240c8,0xdc0cc1fd),LL(0xb6e92d72,0x39a75f37),LL(0x0224a4ab,0xaa43ca5d),LL(0x54614c47,0x9c4d6325), LL(0xc6709da3,0x1767366f),LL(0x23479232,0xa6b482d1),LL(0x84d63e85,0x54dc6ddc),LL(0xc99d3b9e,0x0accb5ad),LL(0xe8aa3abf,0x211716bb),LL(0x69ec6406,0xd0fe25ad),
+ LL(0x57e0105d,0xe7acaa84),LL(0x3851fd57,0x3c06d3bd),LL(0x2a9c631b,0x23cf3c61),LL(0x33863bf8,0x13888aaa),LL(0x717783ee,0xf2396355),LL(0x36b300e1,0xf21e1a48), LL(0x9d27b4cb,0xa734cb3b),LL(0x796e34b6,0x0a7effed),LL(0x3615cc7a,0xfc586477),LL(0x88844a21,0x1f98ed77),LL(0x7ad4c7bd,0xd6e28940),LL(0xe9331c7e,0xa00d64eb),
+ LL(0xdf85c705,0x0d5c1769),LL(0xa409dcd1,0x7086c93d),LL(0x0e8d75d8,0x9710839d),LL(0xebdd4177,0x17b7db75),LL(0xf649a809,0xaf69eb58),LL(0x8a84e220,0x6ef19ea2), LL(0x65c278b2,0x36eb5c66),LL(0x81ea9d65,0xd2a15128),LL(0x769300ad,0x4fcba840),LL(0xc8e536e5,0xc2052ccd),LL(0xac263b8f,0x9caee014),LL(0xf9239663,0x56f7ed7a),
+ LL(0x713b8541,0x17e3d0b8),LL(0xc6b5e839,0xf372b048),LL(0xd0bb1848,0xf8ef0261),LL(0xc71a3bbe,0x9b804cee),LL(0x542a88ae,0x00b7d171),LL(0xe9097b9e,0xf2b8ed10), LL(0x2c0a009a,0xdbad9f12),LL(0x205fb1bf,0x245fc1e9),LL(0xb83debf5,0xa8a4834f),LL(0x637e449b,0xc3ee226d),LL(0xcab82664,0xe3070d93),LL(0xb37320e8,0x24b8094d),
+},
+/* digit=21 base_pwr=2^105 */
+{
+ LL(0x25059699,0xb506b7b9),LL(0x01ab02e5,0x349fd83f),LL(0x3789281e,0x64b729ad),LL(0xf9af4561,0x69ae8f81),LL(0x56f91860,0x007befe1),LL(0xedc250fb,0xb578c566), LL(0x67ae4801,0x1c16d75a),LL(0xa1d3f592,0x04c35a7e),LL(0x36881f89,0x5dc97da9),LL(0x03a5b1ea,0xaddb6031),LL(0x3e153a0f,0x7eb515b1),LL(0x2b4a1ee2,0xdc3a9219),
+ LL(0x512cc92a,0xe7365f9e),LL(0x5172a654,0x9efdcf8b),LL(0x8e611fc3,0xbfb389ac),LL(0x699c227d,0xce778fd5),LL(0x3ff2ef17,0xdc1f47b6),LL(0x02672ed4,0x2ae0f683), LL(0xa8e879cb,0x51c63806),LL(0x3909f526,0xd3dfecf0),LL(0xe00e12a2,0x375b3d13),LL(0xbf8df325,0x91f9f750),LL(0x1df5f21a,0xf1ea0e42),LL(0x32c60584,0xaed73e7f),
+ LL(0xe0728e6d,0x03b07fb5),LL(0x1012234e,0x9e046920),LL(0x35637644,0x272e6449),LL(0xa55bcadf,0x2b6ad1c2),LL(0x5c71c6af,0x86c52776),LL(0xc1678806,0xa25bd60b), LL(0x76bb32f8,0x0cae8294),LL(0x33e03cb2,0x389ce4e6),LL(0x7513dfb6,0x504df833),LL(0x1b351dda,0x4260ee8e),LL(0xdbaf7cd0,0xa473c5d9),LL(0x71e390fd,0x22cb7cb4),
+ LL(0x26caebd8,0x1d9aa9fa),LL(0x26b7a673,0x6b646869),LL(0x7f167b47,0x7ebed6a1),LL(0x5bd9153d,0x324c13f8),LL(0x4c682ba6,0xe9ea5b73),LL(0x7e3ff6e2,0x2961da7d), LL(0x01a83dad,0x1ed2b050),LL(0xc4a2f60a,0xb232951d),LL(0xd68b8ec6,0xafcea5d3),LL(0x1c6ce0d2,0x21dc058d),LL(0xe719410c,0x0043de75),LL(0xe15cf534,0x4edd792c),
+ LL(0x3babe09e,0x0f45245f),LL(0xa9f2fac5,0x0959326f),LL(0x5cc136e5,0x7629e7fb),LL(0xe48b7eb0,0x208bd5a6),LL(0xb75a85cb,0x637891d6),LL(0x9f27b57e,0xf0ad9d8d), LL(0xe0454b05,0x437b6944),LL(0x02ed3592,0x022c51d7),LL(0x0dc0a769,0x0f79e2bd),LL(0xd9b81f9b,0x54ace1fd),LL(0xf95ea8dc,0x38611d66),LL(0xf0e6147b,0x52443ca8),
+ LL(0x8bc272d0,0x857d6855),LL(0xb5be2485,0x4583eeee),LL(0xfe0152ec,0xb83586da),LL(0xe830294a,0x8b0eb223),LL(0xa5b0e880,0x757582b6),LL(0x9cca7fff,0x5140c016), LL(0xe9228f12,0x07a00782),LL(0xd4973080,0xb96e2b5d),LL(0xe88efbe6,0x3cceb9a6),LL(0x73fcdd25,0x9955b630),LL(0x2805d470,0x04f26ab0),LL(0x424da086,0x90b38299),
+ LL(0xf4f6c5b4,0x73f1ae48),LL(0x4a477f01,0xee5af13d),LL(0xddb93d52,0x274614a2),LL(0xc320aaf5,0x90b0c563),LL(0xef990b0b,0xee2303c8),LL(0x3061f140,0x00d028e7), LL(0xcb3d8eaf,0xff705011),LL(0x62594f4c,0xae1d9908),LL(0xdafea438,0x22a27cec),LL(0xc5962ea9,0xa78e12d5),LL(0x8e65f9cf,0x5bbe9d87),LL(0xf47cefa6,0xa222580c),
+ LL(0x959abb9e,0xf7aaa732),LL(0x2ebf80b9,0x1222ad0a),LL(0x2e0c286e,0xa1a41737),LL(0x5da3472d,0x3b668502),LL(0x7576f2a2,0xbc0d116b),LL(0xa36a27d4,0xfdbcad95), LL(0x9d54f7ee,0xcdb3f474),LL(0x8a5643a3,0xe2e0f5f9),LL(0x69d4f171,0xc70d11b9),LL(0x6cca4ef7,0xdf96d136),LL(0x2fc6afdf,0x570693db),LL(0x567504da,0x5059e67b),
+ LL(0x7fe632a2,0x2c8107d4),LL(0xede7bff8,0xfc46c745),LL(0x4650025b,0x2d3b1286),LL(0xe74cd65f,0x815ef3cb),LL(0xa256f01c,0x5431b01b),LL(0x39915cfa,0xe832ff11), LL(0x07d7af84,0x2c106de6),LL(0x6d4753e7,0x67303b78),LL(0x6d75c8de,0x5f886ffa),LL(0x967131cf,0x932a6c20),LL(0x70aebbb0,0x5bc94a91),LL(0xfd56e06d,0xa85b3044),
+ LL(0xe7eba799,0xc904558a),LL(0xb2fa7331,0x46b6031b),LL(0x0653675c,0x6620e2b5),LL(0x7d2218f7,0xd1373a35),LL(0xaf55a5e7,0x0f4b3ca3),LL(0x714e70c2,0x50774160), LL(0x69188455,0xacc63d14),LL(0x043b8b30,0x89a795fe),LL(0xe1e4b9cf,0xac2fd66c),LL(0x1bf67f26,0xac792702),LL(0x1143d437,0xb9513f0d),LL(0x811f2931,0x02198050),
+ LL(0x7b480776,0x6d4acdba),LL(0x66dffeb5,0x8b518cd4),LL(0x51918859,0x8826c994),LL(0x38fad835,0xd2b6a7a0),LL(0x6929a870,0xd315417a),LL(0xc5a769e1,0x05d85252), LL(0xec0d091e,0x2fa06335),LL(0x87768c88,0xb0cc3372),LL(0x58a2eb9d,0xacbda5ba),LL(0x76b7b057,0x2a404fc9),LL(0x838c6135,0x073abb71),LL(0x5cfc4f3c,0xbdf89b13),
+ LL(0x3508675f,0xd00eb9c5),LL(0xa117dc95,0x92ec76a4),LL(0x334ca15c,0xf58d6f85),LL(0x9cee0544,0xeeb52216),LL(0xf21457c2,0x3eb9847f),LL(0x5524c60d,0x547908bc), LL(0x5198709b,0xb5b49d22),LL(0x324abc67,0x718abce6),LL(0x4abd54ba,0xdab8ff2f),LL(0x7184d444,0x98be59e6),LL(0xbabeb4b0,0x45b74b54),LL(0xff71a5ac,0xd8d8bb30),
+ LL(0x8ec13e6f,0x8aedf7e2),LL(0xd950792d,0x8b952620),LL(0x04918f59,0x36e9dac2),LL(0xd3dd47ed,0x5e49a5a2),LL(0xe863c2bd,0xb17455be),LL(0x326a0d66,0x8caac6a9), LL(0x27bb72e1,0xb6c3f5e4),LL(0xee5fe09b,0x17566c9d),LL(0x5e3db64d,0xfd6bbcc2),LL(0x3189319c,0xd437d07a),LL(0xcd3166a5,0xad00dfc4),LL(0x0bd63003,0xab75927b),
+ LL(0xafc43be8,0xa7672a39),LL(0xc72f97aa,0xefc49015),LL(0x0e48f2ed,0x81c63c05),LL(0x833a22cc,0x62f39f32),LL(0x72c0c0c4,0xf7a34801),LL(0xa4158538,0x4711cd41), LL(0x1d15f2f3,0xa3c99a4d),LL(0x7bee1b47,0x4b82c1c1),LL(0x9d199f10,0xc7d60b48),LL(0x5f16fa95,0xd1d1f03d),LL(0x32fbeaf2,0x96c780c9),LL(0x376ff106,0x0662e250),
+ LL(0x78571c8f,0x728e3346),LL(0x6cb339d3,0xd0a886b5),LL(0x0a5671ba,0xf4ea3338),LL(0xa64850a4,0x43823401),LL(0x33117b9d,0xa7729cd5),LL(0x2b78cffb,0x4dd45760), LL(0x5a67d812,0xbe057111),LL(0x5105a3fc,0x7ec6cf92),LL(0x0ccafeec,0x5dbcb4bc),LL(0x803092f8,0xa7587f15),LL(0xa884efad,0x67ee61d5),LL(0xca47d9ca,0xd4ced554),
+ LL(0x3b03dcbc,0x02c6b608),LL(0x3b9d868a,0x2b20149e),LL(0x4f57eb0c,0xaf5ab01d),LL(0xd750e515,0x59935b94),LL(0x8f89ad68,0x32721b40),LL(0xa7e3ceff,0x673bd755), LL(0xef3b3393,0xbd462fd8),LL(0x0e59a120,0x99142264),LL(0x9263fa61,0x4162da61),LL(0xb6488eb3,0x2ed1f2de),LL(0x725680c4,0xb0bd37a8),LL(0x29ec27b0,0x17218bf0),
+},
+/* digit=22 base_pwr=2^110 */
+{
+ LL(0x4bd044ef,0xfb09e756),LL(0xbb964fb3,0xdbc9fcdf),LL(0xcdb1f4f5,0x451c5b01),LL(0xf1dd1cf0,0xb02f9068),LL(0x0c687e41,0xd4765e7c),LL(0xd1967bd3,0x89b64981), LL(0xf0439d65,0x06a0e4ec),LL(0xa5abbcec,0x564c387d),LL(0xc651d806,0xc1e9d01a),LL(0x0618a96c,0x5e6ebd83),LL(0xc54ad8ce,0x9ce1aace),LL(0x9953f90f,0xe5248a08),
+ LL(0xbb296c27,0xda2b0725),LL(0xd341171b,0x1f22ffa4),LL(0x5b132756,0xc721e35a),LL(0xfadb6907,0xe5695e84),LL(0xc283f546,0xbc5a3bf4),LL(0xdde128ae,0x9182cb3e), LL(0x6592e05e,0x179c7fa6),LL(0xf38e8586,0x1e604790),LL(0xa16bad55,0xaf7e83be),LL(0x9137ecd8,0x6f41231e),LL(0x8f30d1ab,0xac87543d),LL(0xb1ee0ee8,0x630a9d87),
+ LL(0x0850b471,0xd8ccf550),LL(0xf7ebfcd8,0xea8f73d2),LL(0x7f138136,0xfb374f99),LL(0x6cd70e73,0x6b3a1ab8),LL(0x42f40008,0xc4577c13),LL(0xa0517e75,0xb23800f9), LL(0x7088a19b,0x79deaa45),LL(0x702183ed,0xa8410f51),LL(0x2c9f6594,0xe2761fa1),LL(0x52868276,0xed1d0112),LL(0xc22157a4,0x9e9805d7),LL(0xac7653e9,0xbe4aa213),
+ LL(0x5e4f1914,0x359cbfa0),LL(0xd922176a,0x6992cd48),LL(0x630cbcb5,0x2fd5e90f),LL(0x6ddbf238,0x2b0f6130),LL(0x3af753e6,0x5070970a),LL(0x41727016,0x433d0094), LL(0x9dca97e2,0x2eb15b3b),LL(0x00d96875,0x3a7379cd),LL(0xe930a75c,0x0d4374ae),LL(0x849e7727,0x3cd36046),LL(0x336a19ff,0x9ac3117e),LL(0x433ddc04,0x2d1373c9),
+ LL(0x13a2a0f2,0xa60026f0),LL(0xd6d8a91c,0x173b08a8),LL(0x2b0ff7fb,0xfa6b3eea),LL(0x4201b05d,0xd5417c7e),LL(0x598f4c56,0x91dacda7),LL(0x0a1513a5,0x00323d9a), LL(0x38bf2619,0x079a4ef1),LL(0xee3512cc,0xfe91faae),LL(0xbc03468f,0xbf9aabdf),LL(0x01d3ca1f,0x0d46d3a2),LL(0x3e677e61,0x6bfad511),LL(0x6dabf925,0x219a70aa),
+ LL(0x8faa3eca,0x8e145869),LL(0x511c5e09,0x811c0ab1),LL(0xc39fd20b,0x08a52f04),LL(0x5e5f514e,0xa7c22263),LL(0x8507e5c6,0x365701af),LL(0x495177cc,0xba1c1ce2), LL(0xbd3d7f93,0xed128050),LL(0x05af7fa4,0xf5b3a508),LL(0x7eb1e384,0xe27a017c),LL(0x1fbca0a7,0xaa95d99a),LL(0xbaa36562,0x61a459cf),LL(0xb7f845c1,0xc1ee4d7b),
+ LL(0xa4945d9f,0x164a4fa1),LL(0x8ce7f161,0xf9fb0327),LL(0x9891eb36,0x5284c704),LL(0x9bd23713,0x9ca1ee6b),LL(0xbdc043e0,0xb364fe43),LL(0xae82eb35,0xcf9c9e70), LL(0xbcde9b87,0xa375b9d5),LL(0x6d5ada37,0x55f437d7),LL(0x85bf9126,0x49fc8d72),LL(0xbd83c1bc,0xf13cbab7),LL(0xf847972a,0xc3d75306),LL(0xb1da55aa,0x8c27482a),
+ LL(0xe4362d67,0x985dcb43),LL(0xa939bea4,0xecb860c2),LL(0x55fbf1d5,0x40597f30),LL(0x43fcd98a,0xb6d166bf),LL(0x15ec99ca,0x59325709),LL(0xc5bdd370,0xe05ae3b9), LL(0x0c7b943b,0xc18f7827),LL(0x4dd572cc,0x84bde9c6),LL(0xf478e56b,0x5d50a89d),LL(0x64d29053,0x242c2f48),LL(0x61cf7e0e,0xcda12c61),LL(0xac8d1d40,0xf8b6890e),
+ LL(0x37d03584,0x3f2c311e),LL(0xbb91574c,0xb387b3cc),LL(0x8d7aa7af,0xa64914d1),LL(0xea0fb673,0x7586999a),LL(0x14e5014b,0x25ee7a70),LL(0x557fce0f,0x1015b142), LL(0x10cc9d92,0xbb839712),LL(0xabbb3b2a,0x31118426),LL(0xa29866e5,0xc3a4fa6f),LL(0x66310a76,0xbdb3a495),LL(0xa11055e7,0xd397ceb6),LL(0x0240bd0d,0xc8d47e10),
+ LL(0xfc8d5f6c,0x76624aad),LL(0x0144a0ff,0xb7dbb41a),LL(0x30df5bea,0xd7be190f),LL(0x9ed58b6a,0xb61e3e97),LL(0x14bf09f6,0xce192eb3),LL(0x27ad3fc4,0x3d6632af), LL(0xcdd7c93b,0x51f180e8),LL(0x932c89f0,0x257df031),LL(0xb680f621,0xed1ffbcb),LL(0x34ef3db2,0x6d8be601),LL(0x044b7f8a,0xc32869e3),LL(0x09958ada,0x8db40995),
+ LL(0x7ebfc0d7,0x004888a9),LL(0x0f90df8a,0x5546c1b1),LL(0xddfb6a92,0x9c73aa4e),LL(0x2782e2a4,0xb492a723),LL(0x2b9b9390,0x5e79ce87),LL(0x2564d95a,0xb8165f79), LL(0xa8f207cb,0x235665e2),LL(0x1087fea6,0xdef16762),LL(0x7b9d891a,0xf4275ea2),LL(0x1f98a6d9,0x70b2662a),LL(0x5fd15926,0x2990c521),LL(0xc30089d5,0x2734975d),
+ LL(0xb6b11af8,0x7a9a9dd7),LL(0x16a42f8f,0xac4c50dd),LL(0x6726c324,0x1550267b),LL(0x7f841afb,0x12cfb2fd),LL(0x2f046430,0xa41b1905),LL(0xb7d786cb,0x8f5f5373), LL(0x729e09fb,0x7b61b39c),LL(0x2626da4c,0x07a5415f),LL(0x4a348905,0x65d6efb8),LL(0xf2e864b9,0xf377862c),LL(0xab96cdb2,0x3c94000d),LL(0x8efef0f6,0x2176321a),
+ LL(0xaffedcf4,0xfbd2489f),LL(0x41feb03e,0xe41dfcac),LL(0xe9a86cd1,0xf13f6579),LL(0xb7ff732f,0xfe3c2a91),LL(0x82f008fc,0xd447c728),LL(0x0e1924b1,0xe4e9c054), LL(0x048bb350,0xe0d6bfc3),LL(0x2fb5fc5b,0x5fe1c204),LL(0xaa50972b,0x70799d49),LL(0xd2c42b50,0x7c79c24e),LL(0x5405cd06,0x4ffa2c53),LL(0xc7ba6f8b,0xd890bea7),
+ LL(0x94747d5c,0xee68456d),LL(0xef40112f,0x5c0312fe),LL(0x0fcb2565,0x57a480bc),LL(0x7c529c68,0x549b31ad),LL(0x402bdb03,0xcfdc5d33),LL(0xbf45407e,0x955bfd5d), LL(0x1fdb20fd,0x8381a1ec),LL(0x4fe0b38e,0x89dafbdc),LL(0x68f59249,0xf33c8706),LL(0x68be67d2,0xb6cc7618),LL(0xea4845b8,0xa7897c7c),LL(0x93f2f9a9,0x6773f08b),
+ LL(0x14a03fc5,0x642405c1),LL(0x4cf34763,0x5b973584),LL(0x3331c03d,0x9f24c2cc),LL(0x6f9bf4f5,0x56428a37),LL(0x703e5e73,0x2e83d070),LL(0x573c3cf4,0xb8e4e61a), LL(0x8f3e3efe,0x7a18ec58),LL(0xb812e5a7,0xbab02660),LL(0x8289de63,0xee826e36),LL(0xc1a8eb16,0x86d263f9),LL(0xd7b85103,0xee8f3e72),LL(0xe567c787,0xa3627d9b),
+ LL(0xc1c1bc68,0x8c558000),LL(0x83fd6ca6,0x9e48a67a),LL(0xeb7a35cb,0xacf0d75c),LL(0xf0a93110,0x0fbdce4c),LL(0x9cc50c85,0x82b2d13a),LL(0xcef70d6f,0x696fd259), LL(0x457b88c2,0x1cc9be2e),LL(0x1f04c0bc,0x0d58b34b),LL(0x195a532b,0x52bd479f),LL(0x1ab3605c,0x769fe6ca),LL(0x8a24c1e0,0xba6a63e4),LL(0x99da5d7a,0x86dea462),
+},
+/* digit=23 base_pwr=2^115 */
+{
+ LL(0x65682820,0x509abccb),LL(0x4ff86137,0xfbfa1d09),LL(0x640bc2f6,0x1ae371bd),LL(0x8f546c68,0xa155c297),LL(0xc08b8cbf,0x8858cadc),LL(0x1d96948b,0xafac5b0a), LL(0x82e25016,0x919cb226),LL(0xb064ffc3,0xd147df4a),LL(0xb4abe560,0x25dd0f1a),LL(0x9cb75bd1,0xc6bbe636),LL(0x47a778e4,0xbb367cf9),LL(0xbde524b3,0x5714aa4d),
+ LL(0x166915df,0xc6307399),LL(0x5da8a26e,0xb35545bc),LL(0xe3a99321,0x8e0126aa),LL(0xda9308d1,0x0fbfdf76),LL(0x6168e505,0x2163ed6b),LL(0x7500d8bd,0x71f3d008), LL(0x5ac13f65,0xf5715960),LL(0x55172d5b,0xc1cd9a67),LL(0x53d84c65,0x6b225f7e),LL(0x025029da,0x9c031269),LL(0x17d89aed,0x54c1edfa),LL(0x6b435150,0x5b023878),
+ LL(0x1e94d949,0x1e7ae160),LL(0xe78e6221,0x177dc53e),LL(0x7aeb9882,0x8af29d8f),LL(0x9e3f3906,0x2d9a60fd),LL(0xdf962156,0x6979fcd6),LL(0x7e1e54b8,0xdd2fe588), LL(0x76643453,0x9cccf310),LL(0x4e0643d0,0x94ece1a8),LL(0xc111d8cf,0x745449cb),LL(0xe6cfbd97,0x872afa4a),LL(0x10dfb34e,0x5c27b7ca),LL(0x533480fe,0x505e62bc),
+ LL(0xae238fa1,0x009ef80a),LL(0x486af6b5,0xb41d9b24),LL(0x685add95,0xab4455ed),LL(0x72c7dac8,0x18f323f6),LL(0xe372f168,0xe7009790),LL(0x067bea99,0x4d5bcba6), LL(0x51a2a9a9,0xf15bdbcc),LL(0x2fac9169,0xde7e4f74),LL(0x4bdbec36,0x2fd62c30),LL(0x1b3ac6c7,0x8b3ea93d),LL(0x9c293889,0xce1c8e5c),LL(0x11564f8b,0x19664dda),
+ LL(0x175418b2,0x5f266f13),LL(0x03a626f9,0x6bd7a869),LL(0x4a6f11ca,0xc7b53230),LL(0xbfc8cced,0xa216b056),LL(0xb288cb7c,0xa274d5d8),LL(0x924897ad,0x6fc4a35d), LL(0x81fc6940,0x1ea532eb),LL(0x2acbbc45,0x2fcd817e),LL(0x67814fa3,0x45eee93f),LL(0x1229e035,0x3b3da48c),LL(0xefd8e3d7,0xd049a976),LL(0xbf81f314,0x8087dff7),
+ LL(0xbd366155,0x77faac22),LL(0x282f11b5,0x13cc4038),LL(0x5fbd35ab,0x31ad1dd4),LL(0x45d6d40e,0x7e0de9da),LL(0x39749ef6,0xa16c5f19),LL(0x85691cf2,0x761cd6cf), LL(0x4d59b802,0x156536ad),LL(0x87c4b11d,0xee98dc41),LL(0xd35088fc,0x165a1eac),LL(0x38fb995c,0xce8a7335),LL(0x3293b3a5,0x34d0d331),LL(0x8b570e79,0xfcf548ca),
+ LL(0xa85af34a,0x7be5946e),LL(0xda6fb0e0,0x420593c9),LL(0x987f9246,0x40b83c00),LL(0xa15d192b,0xac35f4e9),LL(0x776a678c,0x1979bd33),LL(0x8f6068d3,0x0a7d973e), LL(0x7e6298fe,0x71d322e8),LL(0x36af9b65,0xbb23a299),LL(0x6644c50c,0x14e2b970),LL(0x73570bd3,0x5f7f2073),LL(0x9055538b,0x40215c56),LL(0x365500c9,0x91372e64),
+ LL(0x9af0a75c,0x6a3a2327),LL(0x9f1f250d,0xf832a815),LL(0x22a82d3f,0x17030c33),LL(0x14cbc835,0x24bf18ea),LL(0xb2da2727,0x319dc4ca),LL(0x6d020d4a,0x481df360), LL(0x7fc22ba5,0xaeebdd8a),LL(0xa91e28ab,0xbd0515c6),LL(0x595f361d,0xfc8a2978),LL(0x1ae8fa3c,0xe60dd96c),LL(0xa5341575,0x19c2109a),LL(0x06a0ee48,0xfd6e92bb),
+ LL(0x77b5c7c5,0x650008f9),LL(0x02a6d087,0x4bcf6002),LL(0x82234273,0x391ebfa3),LL(0x86cd884e,0x9dcb05d3),LL(0x8753b3fa,0x1b5e7afa),LL(0x2d1e513c,0xd453e9b4), LL(0x4b3a74b4,0x3b1a0dea),LL(0x5bebd592,0xf8989aac),LL(0x61dc640b,0xac3ec9f5),LL(0x6c4b301b,0x4ba9dd0a),LL(0x04e48df6,0xf686a5fe),LL(0x0631d1e6,0x8b0d2d76),
+ LL(0x03c87a20,0x443deaab),LL(0xbb817740,0x57dbd224),LL(0xd51d6acd,0xf88918de),LL(0x7d4ec9be,0x48c9b2f1),LL(0xdfc48a69,0x78b41104),LL(0x78827f54,0x44a81443), LL(0x16a22495,0x74ed7949),LL(0xea92d3e6,0x6b9e9128),LL(0x0d9fe252,0x6fe6449b),LL(0xc14e825a,0x31743d06),LL(0x08690f00,0xd9d4ad8c),LL(0x0e65f748,0x562e2f60),
+ LL(0xb1befb0a,0xe9e01117),LL(0xd25cb1ae,0x7ce74721),LL(0x2d4437ad,0x946216c6),LL(0xea8b2d85,0x83b03131),LL(0x2c4fa895,0x3614b15d),LL(0xc23c6bf7,0x393317d9), LL(0xdcd80eb4,0xda73495a),LL(0x6338db53,0x850dfb46),LL(0xc9b8943a,0x3329c498),LL(0x0765d94a,0x1ee615b5),LL(0xd67c17b3,0x2d16a6cf),LL(0x6f8a9ed5,0x050d6bfe),
+ LL(0x8b7f8cb2,0x92501ff8),LL(0x578a4cfd,0xcdaa6c93),LL(0xe5303846,0x95b99a05),LL(0x2543d1a9,0x30a72fdc),LL(0x11808771,0x6648126b),LL(0xeefb8145,0x6980dd99), LL(0xf1949aad,0xd9a87f83),LL(0xf7b8ab95,0x3b4f208d),LL(0xc40122e4,0x3341e118),LL(0x853b291e,0xe513567f),LL(0x3b565bad,0xd4f1bbb7),LL(0xa7658f77,0x86207b43),
+ LL(0xf87cd72c,0xe5737dce),LL(0x7a1c9f7f,0xdf41230a),LL(0x34e0d519,0x7fe5cfcf),LL(0x26033c9d,0x83cc1da5),LL(0xe16dffd0,0x4195ef1a),LL(0x8af91671,0x7c388f6e), LL(0x62283e40,0xeb1002b8),LL(0xa96be04c,0x08122e57),LL(0xdf9fac7c,0x48cb2d0c),LL(0x41f0946d,0xa3c007ae),LL(0xcec27088,0x4d6fa5c5),LL(0xdcd5fcfa,0xe1fbc03e),
+ LL(0x9bece059,0xbab37a63),LL(0x7fa28fc3,0x5a60ec87),LL(0x1d4a8f5b,0x69e1086c),LL(0x65814282,0x3a873844),LL(0x2676cc7d,0xb642dc16),LL(0x97e423a0,0x8d152bb9), LL(0x160ff40b,0x66ac1b37),LL(0xf657547a,0x7410ba67),LL(0xadcc6823,0x8f47debb),LL(0xb1536fa1,0x44e9bf64),LL(0x939e5461,0x1cfdd504),LL(0x43bb3b90,0xba5729e1),
+ LL(0xdd63f6d4,0xb5c26108),LL(0x60229177,0xefb8dfc7),LL(0x23e4cc7d,0x9d980889),LL(0xc211c92b,0x59579ee8),LL(0x35fe17b4,0x6f146300),LL(0x0ca61e4a,0x6c1e7075), LL(0x19d582e1,0x8671156d),LL(0x07230605,0x36a3d858),LL(0xa352dcdc,0xd9314e61),LL(0x4c6bc2b1,0x7a9d0de7),LL(0xc894ab77,0xb57d3f71),LL(0xd4e5a04e,0xb3564bc7),
+ LL(0xcde5e785,0x2e32f896),LL(0xb9db8f31,0xcd55ae7a),LL(0x8f832885,0x278db1ad),LL(0xadcbd933,0x271d9078),LL(0x4a64f863,0x2208fae3),LL(0x39c89365,0x974046e0), LL(0xb3cd0cd3,0xcb46f272),LL(0x74e59edc,0x31f34e1a),LL(0xedd50418,0x3421d316),LL(0xcabe36ed,0xb1d8a064),LL(0x362efcda,0xdb13e560),LL(0xc71eb3ee,0x567c2b6c),
+},
+/* digit=24 base_pwr=2^120 */
+{
+ LL(0x70d4d7bc,0x2af8ed81),LL(0xb632435c,0xabc3e15f),LL(0x78219356,0x4c0e726f),LL(0xb87254c4,0x8c1962a1),LL(0xc9e7691a,0x30796a71),LL(0xa75a12ee,0xd453ef19), LL(0x13ae4964,0x535f42c2),LL(0x0da9586a,0x86831c3c),LL(0xe39a7a58,0xb7f1ef35),LL(0xd459b91a,0xa2789ae2),LL(0x02fd429d,0xeadbca7f),LL(0x65290f57,0x94f215d4),
+ LL(0x4b950889,0xc0855002),LL(0x8ce24da0,0xee99dbfe),LL(0x4318e860,0xdda71d96),LL(0x04fe9b85,0x01d3d396),LL(0xe25e7e20,0xda4bc065),LL(0xe076c81c,0xd3a50b87), LL(0x31e5f494,0x5b9f8219),LL(0xa6a1b821,0x6a140527),LL(0xd8dd159b,0xf52683e4),LL(0x20b18043,0xca9c8887),LL(0x08a0d8f5,0x73c040fa),LL(0x179525c4,0x92e482e8),
+ LL(0x1cfb79ac,0x37ed2be5),LL(0xe7af84c3,0x801946f3),LL(0xe77c2f00,0xb061ad8a),LL(0x44de16a8,0xe87e1a9a),LL(0x7ee490ff,0xdf4f57c8),LL(0x005993ed,0x4e793b49), LL(0xbccb593f,0xe1036387),LL(0x95e09b80,0xf1749411),LL(0x5ab42f91,0x59cb20d1),LL(0xac0ff033,0xa738a18d),LL(0x2ac1e7f4,0xda501a2e),LL(0x84d8a6e0,0x1b67eda0),
+ LL(0xa4d2313e,0x3a828904),LL(0x92e66888,0xbf4946b1),LL(0xe5fa19d2,0xc574898a),LL(0x5e1c5fa4,0x0b13dbb6),LL(0x7c390fc2,0xf11343ba),LL(0xd7d32187,0x35b1418f), LL(0x83e7fe7b,0xc92cb1bb),LL(0xd78365c4,0x0b969455),LL(0x672f2af7,0xda69dfe5),LL(0x30932441,0x9c62d7b4),LL(0x94af02d6,0x165672ad),LL(0xcde81c22,0xd2cc734d),
+ LL(0x1080e90b,0x1d27efce),LL(0x3fd01dc6,0xa2815246),LL(0xcaa26d18,0x99a3fb83),LL(0xb82babbe,0xd27e6133),LL(0xd783dd60,0x61030dfd),LL(0x73c78cb8,0x295a2913), LL(0x68be6a92,0x8707a2cf),LL(0xeeb3474a,0xc9c2fb98),LL(0xa2b176b8,0x7c3fd412),LL(0xc7202101,0xd5b52e2f),LL(0xf0a6d536,0x24a63030),LL(0x04648ec0,0x05842de3),
+ LL(0x33f4d416,0xd45e3501),LL(0x4bf9131e,0xbb40233a),LL(0xe302483a,0x1532a088),LL(0x2c2485c0,0x3475e8b8),LL(0x969cdbe6,0x08f9ea56),LL(0x253cd738,0x31928645), LL(0xac9836be,0x1cf323a4),LL(0x02b6e4de,0xdf647ccf),LL(0xc06f3d09,0x9a31e84f),LL(0x39efe6d9,0xd326b86e),LL(0x14ac4dec,0x77e3e1df),LL(0xf3e0c582,0xf2d5917a),
+ LL(0x30577ac9,0x67477cdc),LL(0x244f92a8,0x51dd9775),LL(0x917eec66,0x31fd60b9),LL(0xd66c5c1d,0xacd95bd4),LL(0xbf9508ba,0x2e0551f3),LL(0x688cb243,0x121168e1), LL(0x4540d230,0x8c039740),LL(0x009ecdf9,0xc4ed3cf6),LL(0x44db62af,0x191825e1),LL(0xc4a030da,0x3ee8acab),LL(0x94081504,0x8ab154a8),LL(0x486c9cd0,0x1fe09e4b),
+ LL(0x02cf37fd,0xe92b56c0),LL(0xf71b34de,0xa75bbcb0),LL(0x50f5c482,0x7754d0ef),LL(0x11fa89fe,0x850a9ef6),LL(0xba4ea7d8,0x97d74b1b),LL(0xaab7ba2e,0xfc757c25), LL(0xf2a67fdd,0x06f30ab0),LL(0x12e72af8,0xb10aba14),LL(0x7a2e053d,0x47580bca),LL(0xdcf0e14c,0x85795598),LL(0xd6f55310,0xc3596781),LL(0x4c9b7e18,0x8ab251b7),
+ LL(0xd113450b,0x512f82f9),LL(0x2dbc9197,0x5878c901),LL(0xe13f355b,0xdb87412b),LL(0x935b8a5e,0x0a0a4a9b),LL(0xf25a5351,0x818587bd),LL(0x31e3d9c7,0xe8079310), LL(0x611bc1b1,0x8b1d47c7),LL(0x72a823f2,0x51722b58),LL(0x53b36b3e,0x6f97ee8a),LL(0x946dd453,0x6e085aac),LL(0xe65e6533,0x2ec5057d),LL(0x4bb18801,0xf82d9d71),
+ LL(0x4dbb8798,0x4ab13850),LL(0x72d04cd2,0x0e7980d7),LL(0x0b3271c6,0x1755c566),LL(0x9d9d1468,0x8414efb0),LL(0x1795ce66,0x61a58630),LL(0x232924a1,0xb6a8b393), LL(0xae031bd6,0xa992f0ce),LL(0x2915acc1,0x6747fb5f),LL(0x93e9c0d2,0x03daa266),LL(0x5400d554,0xc18fa364),LL(0x9497e895,0xaf04ff8d),LL(0x50b6b339,0x86c3cfc2),
+ LL(0x8ba5aa8e,0xad81fa93),LL(0x8f7aa69e,0x723e628e),LL(0xef35937c,0x0ba7c2de),LL(0x6decfb40,0x83a43ec5),LL(0xe60c4f2d,0xf520f849),LL(0x457e3b5e,0x8260e8ae), LL(0xbf1d9ed7,0x7ce874f0),LL(0x7f1a5466,0x5fde3553),LL(0x0c162dbb,0x5a63777c),LL(0xdad87289,0x0fd04f8c),LL(0x640761d5,0xca2d9e0e),LL(0x38501adb,0x4615cff8),
+ LL(0x04e1e6e3,0x376b2a7f),LL(0xa31774b4,0xea0dcb70),LL(0x5cbdec2e,0xfc7fe4cc),LL(0xf03f459e,0x8568499d),LL(0x8b78900e,0xe9fd8fb2),LL(0xe431bf97,0xd33c6e30), LL(0xc896e766,0xd904b8f5),LL(0x82748cef,0xa8f577cf),LL(0x87e044b3,0x93dd921b),LL(0xf76eebe9,0x23d79837),LL(0xe569feeb,0x5e0a7493),LL(0x414dddb6,0xd0797549),
+ LL(0x110b4a25,0x9422789b),LL(0x70ad8cc1,0x5c26779f),LL(0xec4f1e14,0x4ee6a748),LL(0x5c7ab5e0,0xfb584a0d),LL(0xfb21ee66,0xed1dcb0b),LL(0x11c6863c,0xdbed1f00), LL(0xb1b1d187,0xd2969269),LL(0xafe964e6,0xf7d0c3f2),LL(0x12bb865e,0xe05ee93f),LL(0xed79118e,0x1afb7bee),LL(0x0f0fe453,0x220af138),LL(0x52782ab9,0x1463aa1a),
+ LL(0xbfe5b1a7,0xfd9e3542),LL(0x75938cea,0xb42d2a41),LL(0x3befb760,0x74688a15),LL(0x2e33dbe7,0x8daeeaa2),LL(0x3e677801,0xc9c1ea08),LL(0x34effe1e,0x68ecf4e4), LL(0xd294c321,0x927700cc),LL(0xe940afc5,0x9e2e723d),LL(0x7cf6cd43,0xbcfac07a),LL(0xd1006bc3,0xa009ef94),LL(0x373d13e3,0xa02016b0),LL(0xabae5822,0x4e097adb),
+ LL(0xd7dbe5f9,0x7c139d56),LL(0x0b83685b,0xfc16e611),LL(0x9018463c,0xfa723c02),LL(0x840bf5d7,0xc472458c),LL(0x0af07591,0x4d809359),LL(0x3308dfd9,0x418d8830), LL(0x0c365ae3,0x9b381e04),LL(0xf8190fd1,0x3780bf33),LL(0xdd03e854,0x45397418),LL(0x4e51e491,0xa95d030f),LL(0xe3286cea,0x87c8c686),LL(0x900b5f83,0x01c773bf),
+ LL(0xc898b8bc,0x8db8b78c),LL(0x502940cd,0x686896da),LL(0x2dde2e3c,0x67e50f02),LL(0x8cbf406c,0x2e2461f3),LL(0xe1f7ff60,0x32182781),LL(0xe30e2688,0x26934b05), LL(0xfc4494f6,0x95adc204),LL(0x161b7499,0x4c7f30c5),LL(0xb7341737,0xd5caf060),LL(0xd128d46c,0xed93187f),LL(0x20fc1e04,0x3f2819cb),LL(0x2b7f70a1,0x48c4086f),
+},
+/* digit=25 base_pwr=2^125 */
+{
+ LL(0x0ece13ae,0xd74d09c1),LL(0x57a6bd95,0x5e59d9e0),LL(0xe132b940,0xdb1ccfdc),LL(0x843d3c66,0xa0e5309c),LL(0xf9cb3ef4,0x1fbd03a5),LL(0x00ea5177,0xcdc9ef0a), LL(0xcb784a6b,0x1ebf5a15),LL(0x8a0d109a,0xa67382af),LL(0xa0d34d15,0x3256c37a),LL(0x0fca43af,0xee40efa5),LL(0xb9841bde,0xc299bbd4),LL(0x3bef4a0b,0x6df68f60),
+ LL(0xd9d7c50a,0xe01295fd),LL(0x67f8ef0d,0xaf31b4ea),LL(0x9eaf8eb7,0x2ec9689f),LL(0xc622acc5,0x327b96c5),LL(0xb2757f2a,0xae918f81),LL(0x4fd6606e,0x74927d68), LL(0x18574215,0x09bb7fce),LL(0xe8e68b72,0xfea383bc),LL(0x5fb47511,0xdf2a6f12),LL(0x8e399520,0xbe88faa1),LL(0x3fb1c3a2,0x0166d57e),LL(0xe525f81f,0x5907ef2f),
+ LL(0x57797e5c,0xf24fab9b),LL(0x3add682c,0xd8500987),LL(0x33ac4fb5,0x75e370e7),LL(0xc8a69765,0xd8d61642),LL(0x5e30aa0e,0xf057f10a),LL(0x4f1e8637,0xaf953087), LL(0x701cd1a0,0x887f06b3),LL(0x8a200082,0xd7c6a9c6),LL(0x6e6483a0,0x4319f7eb),LL(0x475d4bfd,0x44f1aaff),LL(0x0f811fc7,0xa8ee73b5),LL(0x82916f8b,0xbb67bcdc),
+ LL(0x8a37f660,0xdefe3a7b),LL(0x858f5765,0x7898db8c),LL(0x73d1f9b4,0x7366c26a),LL(0x237ae8b7,0x35d5d718),LL(0xb4478259,0x3efb20fe),LL(0xaa545ee3,0xccd0fed7), LL(0xed22d152,0x750edd05),LL(0xee20d4c6,0x4f8020f9),LL(0x0a9e29dc,0x16e60f37),LL(0xbfbec7f6,0x9cf0a136),LL(0x2e47e143,0xb430a34b),LL(0xc6cdd1a9,0x2e2560bb),
+ LL(0x2a9af85a,0x2cb5625c),LL(0xfea96b60,0x9ba19601),LL(0xd7549809,0x25dd6aca),LL(0x5b4c31e9,0x9c02e613),LL(0xe09dbb63,0x40c4baea),LL(0xf49beece,0x38455db7), LL(0x5b848716,0xe9846d0d),LL(0xd2ebce35,0x9c63043d),LL(0xbc26a79e,0xedee8e86),LL(0x0869c85f,0x70c46f94),LL(0x7bc49e34,0x34b05934),LL(0xa80d7d8e,0x737fe693),
+ LL(0xe4161a65,0x799352da),LL(0x56253ce6,0xe5cf7ad8),LL(0x6de32775,0xf606bf79),LL(0x57fce8db,0xddc0f3a3),LL(0x16cf4a47,0x1075fc23),LL(0xb27c5ad8,0x078f0e04), LL(0x3f7100aa,0x9fc47795),LL(0x4673ffa2,0x3ac48925),LL(0xf9cd8348,0xb8263f42),LL(0x68cc92d5,0x5bdfde30),LL(0x1ac37f9c,0x2250927b),LL(0xb33da359,0x26ec8328),
+ LL(0x236eaa28,0x76923635),LL(0x657d0640,0x5acc650b),LL(0xc20a58ab,0x2652ec7e),LL(0x1a5459f9,0x93385f9f),LL(0x306e2091,0x45952d39),LL(0x34cef2f2,0xb31f5a42), LL(0x1f3c055f,0x0d9b0484),LL(0xae3b1f4d,0x6c5ef8ee),LL(0xbd24becd,0xd3fdb464),LL(0xa2210148,0x49b11a10),LL(0x1472893a,0x73de2855),LL(0x6ee531f7,0x99435b57),
+ LL(0xc88d568a,0xf186d6bc),LL(0x528535dd,0x872bc4c7),LL(0xdfe64dc3,0xc9e7432e),LL(0xd795ea57,0xd9fc4832),LL(0xc845af2b,0xf4ffdb81),LL(0x2b670517,0x66d7e788), LL(0xd7b7a1c6,0xa7c1be04),LL(0xd5b2a249,0xbed88479),LL(0x03f2ef6d,0x62ff8aba),LL(0x20dc701d,0x60ecaac4),LL(0x4ff10119,0x9f4b559f),LL(0x3cd54fd0,0x0582c931),
+ LL(0x3940d5dd,0x271f5d70),LL(0x192fb2b6,0x7707d109),LL(0xda210560,0xc6131828),LL(0x0bc534c0,0x21750048),LL(0x23487a61,0xa96593d1),LL(0x0b9c6e92,0xdab1698b), LL(0x1f7abe02,0x8a7951a5),LL(0xecd49e72,0xa9394a4b),LL(0x2f6f53d5,0x95ba141d),LL(0x6cdb90cc,0x03809379),LL(0x0586a3ef,0xa5e0ebf3),LL(0x70606681,0x75f006dd),
+ LL(0x12bbaeb6,0xea9da8f0),LL(0x8c9f8360,0x3fba06b1),LL(0xb28c0ac3,0xc11bd7ab),LL(0xaa8a01bd,0x1e05af2f),LL(0xf000b1c3,0xae1e99c5),LL(0x53d79930,0x93ee8064), LL(0x4c4f5513,0x5728089e),LL(0xb1f70b76,0x755351f3),LL(0x675f77ef,0x187ac651),LL(0x53067d84,0x5cf7bfb5),LL(0x8174b5c0,0x62929083),LL(0x8d5be74d,0x720e2079),
+ LL(0x15c26385,0xcdb0e974),LL(0x40c9a381,0x7110dd68),LL(0x8180d82b,0x1fd85657),LL(0xb97cf516,0xa42cad51),LL(0xc8e096e2,0xd0e97506),LL(0xac077c1c,0x9372ac5c), LL(0x528c6d23,0x080cac77),LL(0xc192bee8,0xa62b7b39),LL(0x596c03b4,0xf1b2be68),LL(0x65cdde1a,0x9e367c67),LL(0xa97f58bb,0xdb0a51db),LL(0xc29dbc0d,0xa9b52c4d),
+ LL(0xf5eb9ad1,0xab8cc09f),LL(0x132edbfe,0x97a4de76),LL(0x8baf6347,0xa2e11c54),LL(0x683cfcf6,0xcee54229),LL(0xdcfc6555,0xe1e993b8),LL(0xbe9df066,0x333bf16a), LL(0x060d62df,0x5207e093),LL(0x69b0f5fa,0xfa32324d),LL(0xd3243d2d,0xef16fbcf),LL(0xf04f8e45,0x540a2e59),LL(0x48317bba,0xb5e70f9c),LL(0x5b35baa1,0x00dbe9b2),
+ LL(0x04a6bdf1,0xa7c2e951),LL(0x45310414,0xe7b50010),LL(0x250deed3,0x0ad7ac85),LL(0x07fd3b65,0xeb7ad465),LL(0x6bdc321a,0xcac35e8c),LL(0xe992ce8e,0xf773a3e9), LL(0x0f682437,0x99cbc651),LL(0x7ff5f4b3,0x62f7b15d),LL(0x6d131441,0xf3c08dfd),LL(0xfbb0fd4b,0x8b998754),LL(0xe061d5b7,0x88dae889),LL(0x2a346488,0x9f6e8dca),
+ LL(0xebb512ee,0x0eaed675),LL(0x058efbd5,0x347e0756),LL(0x296d3d47,0xadf792ca),LL(0x4654d012,0x57f00c0a),LL(0xbccc5803,0xa1e08a04),LL(0x5b2f11d1,0x610677f0), LL(0xb81acfd2,0x0d9393d7),LL(0x0587c219,0xb258e157),LL(0xb4ceba47,0x372a1857),LL(0x3ecc1c5d,0xe1ce8bb5),LL(0x922cecd0,0x7efdf301),LL(0x0d8aa653,0xcab8cb17),
+ LL(0xd85124dd,0xc60f118a),LL(0xa77febb9,0x4a045272),LL(0x45555221,0xbae0edf5),LL(0xab65b900,0x1fb21695),LL(0xd56b9882,0x9179d546),LL(0x006bc680,0xead5f78e), LL(0xed9d8095,0x6c3ef1c1),LL(0xd024f8cd,0xe22832c1),LL(0x157c5363,0x8c783b9d),LL(0x000d3603,0x25c1bd7e),LL(0xe8ff7a81,0x4e76a723),LL(0x4a955196,0xa55cfcb4),
+ LL(0x79d05497,0x31954a56),LL(0xfe76d4d8,0xc12520b6),LL(0xe37ef1d2,0x8c433ec5),LL(0x75bc3b66,0xcd0f2035),LL(0x249cd98b,0x3723f145),LL(0xea3b42a3,0x1356e0d2), LL(0xf174c7b5,0xf607fee0),LL(0x0127be39,0x318afc5e),LL(0xcea5417f,0xd47b5d74),LL(0x10fca22b,0x6891940a),LL(0x2b635e8b,0x5cea4133),LL(0xb5934fef,0x93db2ed6),
+},
+/* digit=26 base_pwr=2^130 */
+{
+ LL(0x41b959b5,0xb1f4fead),LL(0xe71890c0,0x6edb53a9),LL(0x2e28aa2a,0x48b47efe),LL(0xb3151d67,0x70dad2e9),LL(0x436a3460,0x87a8178b),LL(0x801f7af7,0x0f86f9f5), LL(0xa982fc14,0xfab462e3),LL(0xcb03e978,0xe29126ba),LL(0xe6681282,0xb4696b3f),LL(0x6a3fdc1d,0x3bd9910a),LL(0x49e37dac,0x44091284),LL(0xcf605fb3,0x3b4bfabc),
+ LL(0xdf9a9f18,0x57edf71e),LL(0x627a0b79,0xbf834240),LL(0xa6934160,0xb37aba1a),LL(0x5e639a54,0xd45b3d2c),LL(0x70bce957,0x62c6b9ad),LL(0x5d7e87f3,0x16bc35a7), LL(0x66b4a982,0xb0216982),LL(0x0e51c9bc,0xb56050dd),LL(0x478e4b91,0x15aa692b),LL(0xbe3fe25a,0xdd67cf29),LL(0x06bdd4a8,0xf1ef75b0),LL(0x41df627a,0xf71a285b),
+ LL(0xb7a3ce87,0x3176a43a),LL(0x5f130e73,0x9fa09e97),LL(0x9368e156,0x971cc37b),LL(0xb8981792,0x2cabf535),LL(0x4d0f0bc0,0xaec2862e),LL(0x3ce8c100,0xa1a48c18), LL(0x4af2eae9,0x288f4e69),LL(0x1f9339bd,0x778845f2),LL(0x17dfaa6a,0x1ef5fdfd),LL(0x3483a6fc,0xc784117e),LL(0xf3c5c19e,0xe8c82f05),LL(0x1da87ab6,0xf39b3c1d),
+ LL(0x8a541be6,0xa58a27c5),LL(0x54fd7683,0xaf669499),LL(0x00079a25,0x24318266),LL(0x2606caf5,0x113f6fcf),LL(0x16cb28c8,0xf6ff2be3),LL(0x3c17caa6,0x8f7fc60e), LL(0x7d35e26c,0x8ea577e0),LL(0xf0628903,0xc3e744c0),LL(0x592a57ee,0x4b28eff4),LL(0x5e3f67b2,0x76e1f87c),LL(0xfb008902,0x40d7a676),LL(0x4b6e6b7e,0x68a9dc76),
+ LL(0xe4fbe1d8,0xfc14716f),LL(0x88d5fc05,0x711c4f60),LL(0x8ab2552f,0x53df2711),LL(0xb3039434,0xeb4a3587),LL(0x825eba03,0x84223085),LL(0xf69569cf,0x1aff30b7), LL(0x30d38055,0x752a2b25),LL(0x7dc7727e,0x8fb8ef5e),LL(0x679f84b9,0x8f0b8bea),LL(0x004815a9,0x076e7b05),LL(0x65debb2f,0x93275037),LL(0x83a686b0,0x24f92c79),
+ LL(0xdff082f7,0xf9597802),LL(0xeb44042c,0xb47fcfee),LL(0x8ac1e9a9,0x0e2570c9),LL(0x9168391b,0x144f5763),LL(0xfe49b3b2,0x7c5fe9e6),LL(0xe1202056,0x30dd5a41), LL(0xe5132272,0xb0866f7c),LL(0x199d029c,0xaa2d7c60),LL(0x2bd29ff9,0xb37c3232),LL(0x29bc5c36,0x6c0e511b),LL(0xbaa69a42,0xb64e16b6),LL(0x28545caf,0x9fd7d79b),
+ LL(0x0c3576d3,0x0620003c),LL(0x31b24876,0xa9608ecd),LL(0x2d83f362,0x7dcb576a),LL(0x7df98941,0x88a3a38a),LL(0xb3596afe,0xdd182e8a),LL(0xe02a5357,0x9c740d01), LL(0xb75d5d3b,0x2fed2fcc),LL(0x8d34ca34,0xd0ea6d50),LL(0x8f4bd1dd,0xfe4b8743),LL(0xb130c5c5,0x73c5acd3),LL(0x2dadbb20,0x9f8b0817),LL(0xc5a59dfc,0x34b74294),
+ LL(0x12575913,0x76e2751a),LL(0x4a5f8c4a,0x2c605991),LL(0x71fba662,0x58322dfb),LL(0x5e0886af,0x228aec08),LL(0x6aee544c,0x8d83b627),LL(0xe29f9639,0x338f5fb6), LL(0xbf5e19fa,0x1ba4cfe0),LL(0xb9e4f8f6,0x2eea84c5),LL(0xcee95d92,0x7e0eed58),LL(0xbe535540,0x2d29282a),LL(0x07a9a1f4,0x866638b6),LL(0x6ab8dc82,0x91599977),
+ LL(0xa2144cce,0x6741d444),LL(0x771c7c6c,0x06ce4c04),LL(0xae0ff352,0x3d5bc2d2),LL(0x0e05ca8a,0xa0ae03ba),LL(0x833183d8,0xbf718851),LL(0xccdc956f,0x7095f4d4), LL(0xb3ab0c80,0x23268e4a),LL(0xc16c6dad,0x984cf1eb),LL(0x67120ec8,0xc2333145),LL(0x9cd9a03f,0xc615f60e),LL(0xb3d16871,0xe9e35fd3),LL(0x15e76b83,0xc9b9853d),
+ LL(0xbb7fefd2,0xd8e314ab),LL(0xaa61ea98,0x74d946ba),LL(0x00fd45fb,0x10cfd8b5),LL(0x357f8e42,0x87dfda88),LL(0x27bf7a3a,0x6dab4a2f),LL(0x03b613f5,0x4dd49a15), LL(0x74f2c1a8,0x1f5491dc),LL(0xcc8ee02e,0x98d17370),LL(0x3f141b03,0x01ef39fe),LL(0x6984d4c3,0xa5b04673),LL(0x4a926cdb,0x10c40183),LL(0xe2af1758,0x3e7bbe18),
+ LL(0xc2faa336,0xda178c95),LL(0x68d20d12,0xb4ae744b),LL(0x5e066620,0x5b75f4e9),LL(0x41e95800,0x4138315f),LL(0x010c2c6a,0xf5c97da9),LL(0xe07bbf8d,0xbc4ff40f), LL(0x21709050,0xbdd6bc9f),LL(0xc5f7bb78,0xf3f4dcf2),LL(0x9b1da924,0x584ce030),LL(0xec3d9507,0x44b81c48),LL(0x73e1961e,0x1dfab021),LL(0xa77458a8,0x9212120e),
+ LL(0xf9612455,0x599ece96),LL(0xc725cba4,0xe1c6eb81),LL(0x6373ccee,0x2afc5ba8),LL(0xc64f7261,0xe4556833),LL(0x414ce1ab,0xf29ad540),LL(0x3ee82a77,0x7094e067), LL(0xdc9716fa,0xfa26eaa0),LL(0x9ceb36af,0x340da4be),LL(0x4e1c94bd,0x9570ade5),LL(0x20b0ddbe,0xf4a86d8e),LL(0xdc6eff6f,0x967ab653),LL(0xe8bab7a4,0x48890be5),
+ LL(0xc96437e8,0x74ee2fe8),LL(0x0bfd2bb3,0xeafe095d),LL(0x103d0a33,0xc75f0e53),LL(0x70f13700,0x22190801),LL(0x101d133f,0x96684d5b),LL(0xf21b224b,0x6c98178f), LL(0x1d59dd67,0xe3003316),LL(0x734e7699,0x933de68f),LL(0xa305ea84,0xa3883631),LL(0x6d66c90f,0x21afb4d0),LL(0x330568ce,0xebeecc72),LL(0x62b5a3ae,0x6b65b757),
+ LL(0xf637841c,0x4069700f),LL(0xb1c94076,0x6ee84605),LL(0x829e1bc4,0xcd64ecd7),LL(0x45cdda86,0x606944a8),LL(0x58f036ae,0xb0f2d5fe),LL(0xec18a23f,0x0391590a), LL(0x1a82e6c2,0xe29e3891),LL(0x6bd4a55b,0x5489a628),LL(0x7ae6380c,0xf3e7a351),LL(0x6ae0ae07,0xb3272f23),LL(0xe66cd800,0xb605a039),LL(0x2aac1b66,0xd4e522ea),
+ LL(0x8b153f87,0xbb9d0b1c),LL(0x518a921d,0xa3d52cbe),LL(0x2110cd42,0x232a29d2),LL(0x8a40d59b,0x9083e225),LL(0xaa50f55d,0x3b00382e),LL(0xc02cf900,0x4ad64680), LL(0x36cad5d1,0x2f25bd26),LL(0x64eb9c45,0x9c693e85),LL(0xccf60708,0xe4ea93e5),LL(0xf9270541,0xb932b958),LL(0x5eb454ce,0xee93f51f),LL(0x38840e07,0x1e82e354),
+ LL(0xaf4d260b,0xa16c79cf),LL(0xfab3c3c8,0xfe853f6c),LL(0xc2f47e68,0xb8bd6aa0),LL(0x2c9b4914,0x277d590f),LL(0x097242a8,0xb6d1c810),LL(0x45f75512,0xcf2f3d8e), LL(0x74a20c3b,0x2176162b),LL(0x2b2bcdda,0xeee8bcb8),LL(0xa503aee7,0xfcf8c0d1),LL(0x7af4dd78,0x5d1f94a5),LL(0x2ab43be4,0x8f0bc1a6),LL(0xba9e071b,0xd22dbf16),
+},
+/* digit=27 base_pwr=2^135 */
+{
+ LL(0xb4e814b3,0x705bfe37),LL(0x702013c6,0x22f0de61),LL(0xbc456797,0x811e77a9),LL(0x17081a2f,0x4f52c4e6),LL(0x9fe1640e,0x87405d81),LL(0x707711d7,0x53fa82b7), LL(0x0ee4aea6,0xdc6fff83),LL(0xfd60373d,0x8413e22f),LL(0xa9cf3ead,0x0ecb66be),LL(0x87139b8b,0x7418372e),LL(0x5e42b4d7,0x6aaccf29),LL(0x31fc932e,0xb6dc5925),
+ LL(0xb88ee8f9,0xfa3b4c8e),LL(0xb521ab57,0x1f288e60),LL(0x2e8c4d8c,0x06aa3956),LL(0xcf89935b,0x4981c3e5),LL(0x45fa071e,0xbdbd0c47),LL(0x496073be,0xa78f831c), LL(0xa4e5c001,0x09a72986),LL(0x709cb728,0xac527731),LL(0x988f2781,0x9a64b5b3),LL(0x73b1719d,0x6ac9440d),LL(0xe3d2e807,0x58ad54c7),LL(0x8f06742b,0x1c157448),
+ LL(0x75c953b2,0x6b5b7b2a),LL(0xa7f1cd5b,0x927ed77c),LL(0x4cba0e5e,0x2e8c5399),LL(0x3f4a941b,0x03aeb14a),LL(0xa1385c8a,0xedbad9a0),LL(0x67fd2258,0x925a49c1), LL(0x3365ffed,0xe7e368ee),LL(0xd106eb87,0xcc4aad2d),LL(0xa980b53b,0x4ce908da),LL(0x16929ac8,0xd3f49540),LL(0xd5c05c32,0x613c804d),LL(0xd7973344,0xa42290cc),
+ LL(0xa98cf218,0x33952177),LL(0x579ee53a,0x841d9e1f),LL(0x0a285bd5,0x1084d61e),LL(0x71171b1c,0x3935a84e),LL(0xf29b29f9,0x8ac2433c),LL(0x6dd1e9bd,0x5dd868b5), LL(0x8d102390,0x88da0478),LL(0x657400d1,0x1140735a),LL(0x9d5b19e1,0xa792a25f),LL(0x6a27fa79,0x9ee015cb),LL(0x7ba16a8e,0xea3bf8b5),LL(0xc15fde67,0xc5f0cc26),
+ LL(0xee2c3290,0x2e152d95),LL(0x4a9ceda4,0x8437df2e),LL(0x3c7ebfd1,0x4151754e),LL(0x88f80aea,0x556c59a8),LL(0x8de44dbc,0x8d099c5d),LL(0x77abeecc,0x9ecce7fc), LL(0x3aa311cf,0x5e0a0f38),LL(0xb8f2bff5,0x99ff1eec),LL(0xb5dcf488,0x5ae0b483),LL(0x91483a02,0x11212c45),LL(0x312134a1,0x99fe0738),LL(0xa72745ef,0x3b855db0),
+ LL(0x892c8eec,0x37f50e43),LL(0x7d85a7e2,0xf06a2f04),LL(0xe1d11150,0x3916af85),LL(0x6785ae1c,0xf56e852f),LL(0xae6ada8c,0xbf8c72ad),LL(0xe13285b2,0x1fcd53e3), LL(0xbd56d348,0x5327920c),LL(0x445658a8,0x82a394fb),LL(0x3caf3792,0xa7132857),LL(0x550ffe1c,0xb15ab34b),LL(0x6a5d4e4f,0x81898066),LL(0x2f854f9d,0x0bda153b),
+ LL(0x722730fe,0x77a31009),LL(0xd5cdd297,0x93707ac4),LL(0xd3811e8c,0xa290be39),LL(0x92a5cdb7,0x831a9b95),LL(0xe7342270,0xc74cda84),LL(0x3f48affc,0x96466190), LL(0x5520b0f0,0xb0496cca),LL(0xbae930ff,0xc8742cd9),LL(0xeaea703a,0x3a30737a),LL(0xfb758854,0x0a8e6fb7),LL(0x6796f4d1,0x9ab9523e),LL(0xfdf7140f,0x36e6c05d),
+ LL(0x64ef6a95,0x3b623150),LL(0xaaa5b792,0x97645381),LL(0x56471100,0x4bc2c31c),LL(0x1bae8d2a,0x4a0e73bb),LL(0x8df1f76a,0xbfc0770a),LL(0xa7bb16ca,0x5089916f), LL(0xf31fe82e,0x2afe5b1c),LL(0xf0119977,0x0b06831d),LL(0xa1af2a82,0x97caa333),LL(0xdafed6cd,0x93cb92c5),LL(0x92c3b2e3,0x09553e7e),LL(0x61af2956,0x3d9c4b7d),
+ LL(0x08f84746,0xd83f574a),LL(0xca07f5f8,0x48fc9715),LL(0xdcc51638,0xb3d5d0d2),LL(0x6153bdcd,0xc2a5e335),LL(0x8aa4ef74,0x8242cd9a),LL(0x0bdaa0d0,0xe71ba25b), LL(0xa4ff172d,0x4342d4bb),LL(0xfc1341a2,0x81db10df),LL(0x7dacb140,0xdd93dd87),LL(0xd12d347f,0x6f8a4e81),LL(0x1bc369be,0x0d4e7e46),LL(0x1fafd0c5,0x3ce10a77),
+ LL(0xe67145b6,0x5559dd31),LL(0x5b2427e7,0xf2d905b4),LL(0xcaf57d0c,0x0d840fab),LL(0x78742ab6,0x96258665),LL(0x409c1c8e,0xc85482ad),LL(0xadaa6167,0xdca2a058), LL(0x0c8885fd,0xec26ad9a),LL(0x2a600cb2,0x1b93b8a2),LL(0x2539986b,0x340aa7fc),LL(0xa23dee41,0xd7674876),LL(0x2e1a9837,0xa948a929),LL(0x71438da9,0x9ae67d2a),
+ LL(0xd56bdf1f,0xeac6f447),LL(0xc2b502ff,0xb22e8425),LL(0xfca5a501,0xe1cc9d3d),LL(0xb64baf39,0x8192bc29),LL(0x52ce849e,0xeb2c901a),LL(0x1dd506f1,0x7f5f38b1), LL(0x0f0a1d68,0xfb3684b1),LL(0xe9240ff8,0x16c4aacd),LL(0x5a4d8995,0xffa68243),LL(0x54e4c95d,0x27264ab5),LL(0x4f34ffaa,0x9aa40cdc),LL(0x5fd818ee,0xcb8a30a3),
+ LL(0xf7f35053,0x39038863),LL(0x328787d2,0x421a17f3),LL(0xf3d8310f,0x38aa682e),LL(0xf4123153,0xb52d41e8),LL(0x7026310b,0x4fbef3dd),LL(0xf6ff5692,0x0c6bd7ad), LL(0xa9be5d0c,0x3831c6b2),LL(0xe8d328b8,0xb5c9ae85),LL(0x6516bba4,0x76d26abc),LL(0x446d35a8,0xc237f9a5),LL(0xf012a8d0,0xb2b16c0f),LL(0x0ee0315b,0xddf2b7fe),
+ LL(0x056ad6c2,0xbb85b640),LL(0xac074372,0x7c51ef96),LL(0xf10b43fc,0x1c7ce31c),LL(0x26f4d3a4,0x08e4101b),LL(0x3968459f,0xd18511c4),LL(0xd6d07839,0x00e20c3f), LL(0xe4fcdc11,0xd5bcd598),LL(0xc877f6a2,0x99e9a4d0),LL(0xbd491646,0x9c5dd9d0),LL(0x9bfd7a1a,0x83918f60),LL(0x7e2b95a3,0x4bc130cd),LL(0xfbc31c83,0x668825fb),
+ LL(0x06a9ad54,0x817d77b1),LL(0x89a25eca,0x3a999d7d),LL(0xda68b768,0xd3ac4107),LL(0xbebc4c4d,0x6904bcdd),LL(0xa53d39e9,0xb0d2103c),LL(0x30a5e950,0xdba86bd2), LL(0x4f52208e,0xb0925680),LL(0x28495b2c,0x37c3156a),LL(0xc15855ae,0x2389ab34),LL(0x3017194f,0xc14dfd96),LL(0x1146b838,0x420e0719),LL(0x8fb4b6fc,0x1a9f909b),
+ LL(0xdd63404d,0x2926ef17),LL(0x1399cc68,0x0e89c4d4),LL(0xf7ec20b8,0x6507fede),LL(0x88c751d6,0x1ac084ff),LL(0xdefe29e6,0x31bc08be),LL(0x4f0692c5,0xd4219971), LL(0x36069bc0,0x4d6ee742),LL(0xff80f3d7,0x3868ef6a),LL(0x5a9c6f4b,0x6df02d7c),LL(0x101abf69,0x2c3096bb),LL(0x8eaacaeb,0x0c2b01ec),LL(0xeb2e687a,0x65914c20),
+ LL(0x79ed523a,0x13722ab0),LL(0x249d5624,0x33b29bec),LL(0xf76fdaf7,0xd3d0f467),LL(0x12ddfd9a,0x7ce072f9),LL(0x47bdefd3,0xce918a57),LL(0x750e5315,0x14d38ab4), LL(0x3346f647,0x08bbb20e),LL(0x05b26894,0x428b917f),LL(0xca865ba6,0xc8fb5c21),LL(0x2e6e8e6f,0xee6e41e0),LL(0x4c608b60,0xd00ae621),LL(0x6ff685cd,0x65975639),
+},
+/* digit=28 base_pwr=2^140 */
+{
+ LL(0xa368eff6,0xbbccce39),LL(0x8ceb5c43,0xd8caabdf),LL(0xd2252fda,0x9eae35a5),LL(0x54e7dd49,0xa8f4f209),LL(0x295100fd,0xa56d72a6),LL(0x56767727,0x20fc1fe8), LL(0x0bbaa5ab,0xbf60b248),LL(0x313911f2,0xa4f3ce5a),LL(0xb93dab9c,0xc2a67ad4),LL(0x22d71f39,0x18cd0ed0),LL(0x5f304db2,0x04380c42),LL(0x6729c821,0x26420cbb),
+ LL(0x0eb008c8,0xca07923c),LL(0x9985912e,0xab79402d),LL(0x3cb02510,0x41e379e8),LL(0xbeb383ef,0xfabac005),LL(0x1076dd0d,0x24d12d9a),LL(0xb208f127,0x95afd46f), LL(0xb1031e46,0x9cc38a60),LL(0x7009f6bc,0x93e21e97),LL(0x8ac219ef,0x6f6360d9),LL(0xaf284c80,0x1edaab3f),LL(0x019e366a,0x9c3b5281),LL(0xbc9e9726,0x6475c579),
+ LL(0xbdfbcae8,0x26bd07d6),LL(0xdf01a80a,0x10b5173f),LL(0x6798b96c,0xd831c546),LL(0x1d3f3859,0x1d6b4108),LL(0x991b9ec7,0x501d38ec),LL(0xd78431a9,0x26319283), LL(0x118b343c,0x8b85baf7),LL(0x58def7d0,0x4696cddd),LL(0x7acdcf58,0xefc7c110),LL(0x848d5842,0xd9af415c),LL(0x0ac7fdac,0x6b5a06bc),LL(0xa344319b,0x7d623e0d),
+ LL(0x8d85a25a,0x8410d829),LL(0x4af81a14,0x48ee0135),LL(0x18c25348,0xae460d0d),LL(0x7eb035a3,0x5d0279a0),LL(0x9a114414,0x87e7c128),LL(0xc0744f79,0x17c08a8e), LL(0x025cdbe3,0xb7b2b4f1),LL(0x82d1af60,0x9a74f15d),LL(0xb51ee685,0x124a7395),LL(0xf6122422,0xf2937c4b),LL(0x07f1a7ff,0xb4ec1332),LL(0xf886032e,0xad801112),
+ LL(0x0c9d3547,0x4c0d7806),LL(0xcf2aed47,0x993f048d),LL(0xe4b57e22,0x5217c453),LL(0xf4172b28,0xb4669e35),LL(0x49f999f8,0x509a3cd0),LL(0x87c69d41,0xd19f8632), LL(0x4c8fded0,0xe14d01e8),LL(0xeafd9e1c,0x342880fd),LL(0x70dc2bf0,0x0e17bff2),LL(0xc0186400,0x46560b7b),LL(0x49a4dd34,0xe28c7b9c),LL(0x0f325d06,0x18211916),
+ LL(0x7bb5346e,0xdd4eb3d0),LL(0x382e7db7,0x9a46ad01),LL(0xdc1973c7,0x1200285d),LL(0xa0046b98,0xfd342bea),LL(0x1219a7fc,0xd1917349),LL(0xb7caffe5,0x5383d319), LL(0x2e0fa118,0xea5a0c4e),LL(0xa5457b28,0x1cc2de3c),LL(0x6046eeea,0x5b2a16dc),LL(0xcc8e64b1,0x1755e1fe),LL(0x9e7fadda,0x51e4946e),LL(0xfcbf4ec2,0xf805422f),
+ LL(0xd7e02e18,0x46d70888),LL(0xd9f11fd9,0x7c806954),LL(0x4fbea271,0xe4948fca),LL(0xbd80a9df,0x7d6c7765),LL(0xf3871c71,0x1b470ea6),LL(0x8330a570,0xd62de244), LL(0xc659c3a7,0xdaecddc1),LL(0x077f7afc,0x8621e513),LL(0xcaeeef13,0x56c7cd84),LL(0xc685a356,0xc60c910f),LL(0x9dd93ddc,0xe68bc5c5),LL(0xfeb64895,0xd904e89f),
+ LL(0xbd08ffaf,0xf877e8c6),LL(0xaf23012f,0x24718fef),LL(0x2b004cfe,0x19ff269f),LL(0x95450f8b,0x8adc5d77),LL(0xe2a7d458,0x688ce8bc),LL(0x97bd7fdc,0x74d7445b), LL(0x41e6abad,0x1b9f4ad6),LL(0xf00e4bf5,0x6652ed05),LL(0x71d83d86,0xabee1f7e),LL(0x25ffc219,0xe693c76d),LL(0xc873f553,0x1c9a84af),LL(0x66d77a55,0x84d27187),
+ LL(0x8ba7917a,0x75d874fb),LL(0xfd043bd4,0x18fa7f53),LL(0x1fc3979e,0x212a0ad7),LL(0x5d6eac0e,0x5703a7d9),LL(0x017dead5,0x222f7188),LL(0x0f6c1817,0x1ec687b7), LL(0x238bacb6,0x23412fc3),LL(0x54ced154,0xb85d70e9),LL(0xbda674d0,0xd4e06722),LL(0x36f5a0c2,0x3ea5f178),LL(0xf5c6d2ca,0x7e7d79cf),LL(0x3dbb3c73,0x1fff9464),
+ LL(0x7e5f7121,0xe566dc05),LL(0x2ed07bc3,0xccac74e2),LL(0xc70401b4,0xaabfdfcd),LL(0x6254e0db,0xac9fc449),LL(0x11c7de05,0x358d885f),LL(0xd60772b4,0xb8e6a4a9), LL(0xcfe917ce,0x884272a5),LL(0x9a3d347a,0xdfbe9868),LL(0xc9d1bacc,0x06b90848),LL(0xdb8c6288,0xc4ccedb6),LL(0x79e5683e,0x892878b9),LL(0x243273e3,0x1b521829),
+ LL(0xf163e4a8,0x916e19d0),LL(0x1489df17,0x1e6740e7),LL(0x339f3a47,0x1eaf9723),LL(0x124b8dad,0x22f0ed1a),LL(0x49c3dd04,0x39c9166c),LL(0xce1e9acc,0x628e7fd4), LL(0x40031676,0x124ddf27),LL(0x1eddb9be,0x00256939),LL(0xd360b0da,0xd39e25e7),LL(0x4aa6c4c9,0x6e3015a8),LL(0x623eda09,0xc6a2f643),LL(0x50aa99fb,0xbeff2d12),
+ LL(0xbf0c6fbe,0x099369c4),LL(0xfe7d5727,0x976f78b2),LL(0xd18267a9,0x32feb503),LL(0x1a7dd0fe,0x162c4150),LL(0x26b8e969,0x3141e377),LL(0x3b53a94a,0x50497a64), LL(0x607b4cfc,0x96159f41),LL(0x2f111bab,0x1999b704),LL(0x760f2eae,0x3254987c),LL(0x841014fa,0x5308075b),LL(0x4e7adad8,0xc634127e),LL(0x59ffbfe6,0x32a70a60),
+ LL(0x93ee8089,0x1feef7ce),LL(0x252dd7bd,0xc6b180bc),LL(0x1788f051,0xa16fb20b),LL(0xe046ed39,0xd86fd392),LL(0x9378ce1d,0xda0a3611),LL(0xa5f7a61d,0x121ef3e7), LL(0x92d13cae,0x94d22061),LL(0x77c72e08,0x5076046a),LL(0x7d2308b9,0xf18bc233),LL(0x17f977b1,0x004db3c5),LL(0x0471c11d,0xd05ae399),LL(0x85cd1726,0x86a2a557),
+ LL(0xa1f857e6,0x7279c369),LL(0x27fb373a,0x029d30ef),LL(0x6827358b,0xe82cbc80),LL(0xa18f57ab,0x2bfe09aa),LL(0xe5503492,0x63bf3145),LL(0xfb28ee43,0x7ea15bea), LL(0x5eec91b8,0x8e6d428f),LL(0x611b1799,0x215e03e9),LL(0x61d476de,0xb9957371),LL(0xe76726a5,0x2320c764),LL(0x8e5e26f5,0xc5de8817),LL(0x9161e0b7,0x24aae069),
+ LL(0x72107804,0xb8d9b286),LL(0x3303b79b,0xb5a7c413),LL(0x5fa37ded,0x927eef78),LL(0xad67daba,0xa1c5cf1e),LL(0x7360e7c7,0xaa5e3fb2),LL(0x0a0c0993,0x8354e61a), LL(0x7f5458cc,0x2ec73af9),LL(0x48474325,0xde4cb488),LL(0x7209bc69,0x2dd134c7),LL(0x451a2abe,0xb70c5567),LL(0x8e293018,0x2cd1b200),LL(0xd33c0d72,0x15f8da7a),
+ LL(0x893b9a2d,0x5584cbb3),LL(0x00850c5d,0x820c660b),LL(0x7df2d43d,0x4126d826),LL(0x0109e801,0xdd5bbbf0),LL(0x38172f1c,0x85b92ee3),LL(0xf31430d9,0x609d4f93), LL(0xeadaf9d6,0x1e059a07),LL(0x0f125fb0,0x70e6536c),LL(0x560f20e7,0xd6220751),LL(0x7aaf3a9a,0xa59489ae),LL(0x64bae14e,0x7b70e2f6),LL(0x76d08249,0x0dd03701),
+},
+/* digit=29 base_pwr=2^145 */
+{
+ LL(0x31cb94c9,0xaff47822),LL(0x803c1af4,0xf1b5a0b7),LL(0x2ef696a9,0xbeb85f8d),LL(0x4fa94fca,0x8ce5baab),LL(0x00d41a43,0x0a32f962),LL(0x74f6e772,0x0f69ad57), LL(0x6ccb5157,0xbe0221af),LL(0x2a4f91ff,0xcb83969a),LL(0xa7e49f39,0x78ff85d6),LL(0xcb5d3c63,0x63006589),LL(0x96eb65f5,0xe8e43835),LL(0xff8adbdf,0x79f59da9),
+ LL(0x10eeed24,0x082ea61d),LL(0x143fd59d,0x7c9d5ade),LL(0x2e54f5cf,0x7d33df96),LL(0xe39dc6ab,0x340b0d36),LL(0x8d179b13,0xd97a8b84),LL(0x288d388c,0x88184bb0), LL(0xe116ae6d,0x2237e507),LL(0x211b2cf0,0x3e97b063),LL(0x42be7459,0x645f8bcb),LL(0xde2176b6,0xce2b0f54),LL(0xd1e2f09c,0xaf570a09),LL(0x57fdc001,0x110adf56),
+ LL(0x842e4246,0x9d21c740),LL(0x4ab098a5,0x30f474c4),LL(0xaae5d701,0x57f8b1a3),LL(0x91978d15,0x477e4f88),LL(0x0fb85b1e,0x2913ffb4),LL(0x58489fb4,0x80aedb22), LL(0x0912d86a,0x0e1ab267),LL(0x82933f3a,0xea5e6a41),LL(0x57ab8d86,0xf578ccb6),LL(0x547f64bd,0x339fd796),LL(0x3f3e497e,0x90469394),LL(0x1d864706,0x2cde596c),
+ LL(0xbcb6db29,0x158bfe27),LL(0x0054d963,0x96721241),LL(0x8e71aca1,0xf07b153b),LL(0x71b11643,0x5e676981),LL(0xd04e2f90,0x77b7dd7d),LL(0xf0dcf109,0x07814aa6), LL(0xfe1d0b1e,0xd3bab2a4),LL(0xbe69e691,0x50abba31),LL(0xc6f53cd9,0x54fe99af),LL(0x628039e4,0x071f2a4f),LL(0xb183aa16,0xf1f44181),LL(0x5010f6f9,0xdf0138e0),
+ LL(0xaff45947,0x5737f903),LL(0x62c5dfd1,0xe576f8ff),LL(0xe1e379a2,0x2a7d4f18),LL(0xf2f26f8c,0x8596ffaf),LL(0xfab86608,0x12f49653),LL(0x3aab1eaf,0xcc618497), LL(0x865d9611,0x7b5d029f),LL(0xbf6861f5,0x87af2d58),LL(0x31b2d7cf,0xb7653646),LL(0x8be46ef9,0x60f47e05),LL(0xb1c175ce,0xa21106a9),LL(0xdeb065b6,0x21cb0e27),
+ LL(0xb340f4eb,0xb287e26d),LL(0xb34c2948,0xa397cfd1),LL(0x9a7ead15,0x0d91d763),LL(0x66e88f14,0xd71901b9),LL(0xb4884ac2,0x02447ad3),LL(0xd006f448,0x5e6f7545), LL(0xec5744e3,0x2af6bfee),LL(0xf55cd6ab,0x643f46b1),LL(0x87b2c127,0x13400bc4),LL(0x4629859b,0xd1dddff4),LL(0x20feecb9,0x9710cae0),LL(0xd02d4300,0x594bc27c),
+ LL(0xaa331700,0xb0233c4d),LL(0x30b3a854,0x3bf63a61),LL(0x49b806e2,0xc269d68b),LL(0xda8ddca6,0x4a079274),LL(0x0db04d76,0x256bc009),LL(0x1f47dfee,0x7395c11c), LL(0x13886ec2,0x51bbcc95),LL(0x244d1f0d,0x9d5377eb),LL(0xff9e6b3a,0xa6e0f054),LL(0x204e5258,0x307f9e93),LL(0x8d34d97b,0x8069c01d),LL(0x43c24997,0x30f785ce),
+ LL(0x9c77ca60,0xb1e36501),LL(0x01018e14,0xfe084a23),LL(0xa4bfdcec,0xbf451d2c),LL(0xb29cdcfe,0xd210892f),LL(0x94514871,0x5b12bcd8),LL(0x1809b1e3,0xd03ca18c), LL(0x5858e4ea,0x09b24311),LL(0xe57524b4,0x37b30d50),LL(0x5de334b5,0xcef0a16b),LL(0x0b116076,0xfe0bd1e2),LL(0x89ae2bf4,0x54e4b482),LL(0x68c8a937,0xfbcc5e1a),
+ LL(0x91ae19fb,0xf7473902),LL(0x1bed3f8d,0xc1c228d3),LL(0x6552154e,0x763ba8ee),LL(0xe2063ce7,0xb7b60248),LL(0x178a5184,0xafaf01b8),LL(0x7901d21a,0xe193b834), LL(0x260eb30f,0x1d29f7d6),LL(0xc23b4b94,0x030516c6),LL(0x7dc4a09a,0x30a8046a),LL(0xb5ee1147,0x8414133a),LL(0x4453f1a6,0x7ec8dccf),LL(0x59da8e8d,0xe380e69c),
+ LL(0x22c77f4b,0x28fdf72f),LL(0x32485220,0xfa077b15),LL(0xd6325081,0xc3801faf),LL(0x891ff5df,0x8dd4e3c9),LL(0xaa73c827,0x6726c5ec),LL(0xe9b9b128,0x12af9707), LL(0xff25cf07,0x5e6ae3cb),LL(0xd7cb7adc,0x0613bef8),LL(0xcef4cd47,0xfd426caa),LL(0xced0e435,0xe14ed3ef),LL(0x6000ec80,0x8323a861),LL(0x941f8071,0x58221041),
+ LL(0xa83eb17c,0x6f766821),LL(0xbd7ff851,0x91fe58c1),LL(0x9063af8a,0x7ce09f04),LL(0x6c109e02,0x5230b3c6),LL(0x36274fb9,0x501adb33),LL(0x90547af3,0xcfb34bec), LL(0x40f61ec9,0x622d1387),LL(0x0e3e98d1,0xdf26e4c6),LL(0x7c676ee3,0x6b3b3d62),LL(0xf0244737,0x9f841097),LL(0x4fc8dd58,0xcfaf6ead),LL(0xcd534ab4,0x4f5d463b),
+ LL(0x64be0f56,0xa5023e13),LL(0x0046f45c,0x6a7310e0),LL(0xec8700d3,0xe0af09ae),LL(0xeb2d38f0,0xdea5fb7c),LL(0x859852e6,0xc038eae6),LL(0x8c34f04c,0xd515fb4c), LL(0x1488c207,0x546b778e),LL(0x6258d8ba,0x8cf4f114),LL(0x5182c96c,0x474e60d8),LL(0x3dbde757,0xcd038730),LL(0x76ab01ff,0x387232f8),LL(0x28231392,0x277614f6),
+ LL(0x80b86bc6,0x930c3c59),LL(0xa06d10a8,0xebc8c144),LL(0x81e55432,0x20743ddd),LL(0x006d3073,0x059521d4),LL(0x12dbc785,0x8d4fe303),LL(0xdf4901d6,0x15a4debc), LL(0xb37b2d8b,0xc9b226b1),LL(0x0fe9bdbf,0x385ac3c9),LL(0xfeaa5bff,0x64df89f7),LL(0x81de42ba,0x67de8e03),LL(0x5bf63f6f,0x12bd8322),LL(0x32b4ec13,0xb499f8ff),
+ LL(0x9608c827,0xba0800b8),LL(0x47dfcd84,0x560c31f5),LL(0x520dba6e,0xd52e8fdc),LL(0x854fa4ee,0x66a917c2),LL(0xc6e5d664,0xfc543b79),LL(0x32b530aa,0x5b643692), LL(0x563a3933,0x427dc1ef),LL(0x88d5902f,0x4e47c929),LL(0x93eca4fb,0x9eff3a40),LL(0x59260a69,0xc5b396ee),LL(0x48e70137,0x936a5062),LL(0x21bba959,0x69eb44f6),
+ LL(0xab9f58a2,0x0af34aa7),LL(0x7d150dcb,0x0ba16d98),LL(0xb7c119b4,0x444d5495),LL(0x5ecc3210,0x317a55e5),LL(0xb1aa90c0,0x8fa3b3ce),LL(0x0b2e9392,0x8e7c7539), LL(0xe8921afa,0x5ee5f3e8),LL(0xa3100dd3,0x3934ea8d),LL(0x4c8ae6ce,0x955045b1),LL(0x649897fc,0xa54acb5f),LL(0xe7081246,0x4204fab6),LL(0x6dce3a55,0xec3dc968),
+ LL(0x3ef5a413,0x309b1eb3),LL(0xa81f43fb,0xa7607981),LL(0xbf8a894c,0x87c2b81e),LL(0x0d293293,0x27a40bce),LL(0xe4bf3714,0x7f4c315b),LL(0x01236895,0x03fdc14e), LL(0xdff053fe,0x319c88f8),LL(0xea3fa121,0x146bb448),LL(0xf0dd1380,0xfcc2a05d),LL(0x4acba9fa,0xc8d55b02),LL(0x5927313e,0x871358de),LL(0x17ce294a,0xfd1d81d3),
+},
+/* digit=30 base_pwr=2^150 */
+{
+ LL(0xff63ae69,0xd3797831),LL(0xce4c7eaf,0xa753de02),LL(0x11a4e339,0x2ff7a6a6),LL(0x5328043a,0x904f86f0),LL(0x12e9f7dd,0xe29d31c0),LL(0xc0a51904,0x8825a639), LL(0xebfc2cc7,0x070c2696),LL(0xc5f7a943,0xc03ce643),LL(0x12c8a1f5,0x5b970d0c),LL(0xab352a83,0x572aaaa1),LL(0x0c5eb0c7,0x63df45a9),LL(0xd4977599,0x95c951e1),
+ LL(0xbca07a42,0x2c5b0e42),LL(0x7a0dffa1,0xbe57f359),LL(0x9aa90727,0xace48595),LL(0xf658699b,0x32be886a),LL(0xda3b18e6,0xce75d6c6),LL(0x69caf667,0x9d563e4f), LL(0x065eb772,0xc17c66cf),LL(0x4df9f6ef,0xfbe12381),LL(0x623db4ef,0xceb80041),LL(0xc74762e1,0xe75615b2),LL(0x8671c52f,0xade8a543),LL(0xcacaf2ec,0xb713c401),
+ LL(0x467eb167,0xe6d039ef),LL(0x74696cf9,0xa7e0959d),LL(0x7078d8a0,0xf3a19b9d),LL(0x07cdc6f6,0x5d4ec99c),LL(0x8386eed8,0x4842d0f9),LL(0x545fc0d5,0x48f5ab80), LL(0x6d39c2f7,0x8906fc62),LL(0x1bf5366a,0x1c050d69),LL(0x9f54d0d6,0xac506c57),LL(0xf9e4b94c,0x9a356a6e),LL(0x08a75e61,0x62632c51),LL(0xc6951dc2,0xfc1b9fa5),
+ LL(0xa4886619,0xa933aaf7),LL(0x4af13c7f,0x9ec1915f),LL(0x854de496,0x25a9dff8),LL(0x247bec15,0xa8b31d9b),LL(0x4661e58d,0x468a25c8),LL(0x786a0707,0x8989c046), LL(0xbb66922e,0x282db8ca),LL(0x45ca29ff,0x73bf240d),LL(0xeaeda06e,0xa2c40faa),LL(0xadd94b47,0x69632929),LL(0xb0069076,0xc72354f6),LL(0x7878e92c,0x8d197fbf),
+ LL(0xa83bbb88,0x69a9ebd8),LL(0x29f98875,0xcbab0b5a),LL(0x4e7611f0,0x325e487e),LL(0xd955cc3b,0x90aa24b1),LL(0x3c264d53,0x840e70a1),LL(0xad7f4f81,0x15bcf88b), LL(0x2cf0df0a,0xe47552cc),LL(0x79205ea9,0xcb999733),LL(0x10d5ca45,0x25dc58bd),LL(0x1228b978,0x0947d715),LL(0x4f2c7c4a,0x9a0204da),LL(0x4690052c,0x4377ea4a),
+ LL(0xb8e79179,0x015c325e),LL(0x5b57dce6,0xf4fc6133),LL(0x78d6858f,0x27a51e5d),LL(0x4dd5f180,0x13babcab),LL(0x847e499e,0xfaa19cb1),LL(0x08aaea61,0xe2688ae6), LL(0xe86100d5,0xe20d7edc),LL(0xed2fedac,0xa9b0d46b),LL(0x1d357ded,0x5e99cc0c),LL(0x723cac89,0x4c1263ab),LL(0xf15e22f4,0xad5f3e6f),LL(0xd77dae65,0xf25f3950),
+ LL(0x37e8e6b2,0x3c0e2b97),LL(0x575da8b7,0xa2037913),LL(0xb925cbb2,0xeedf0a75),LL(0xc561b405,0x4f28ec1b),LL(0x2901931c,0x368fb274),LL(0x2f26221f,0x52b54eee), LL(0x247812a9,0x381845b6),LL(0x9115a0df,0xf9bcc961),LL(0xcb84d25b,0xef127dfe),LL(0xfa10e0a7,0x4256afe5),LL(0x353a15eb,0x0c08a532),LL(0x6a91e61e,0xbbd15b17),
+ LL(0x6150771a,0x854b0584),LL(0xd9ca9868,0x35fdd9b4),LL(0x4c32fc71,0xec829389),LL(0x9ec8f90d,0x882fad4c),LL(0xc6c7b9c0,0x2d39990d),LL(0xd71a25e5,0x7fbc201b), LL(0x5166da7d,0x6b852e65),LL(0x3d8c6e36,0xc6bde23a),LL(0x5857f048,0x37001154),LL(0x1ccb9bc8,0x746621fc),LL(0x612bb853,0x97e44e63),LL(0x758da4ed,0xabc3b450),
+ LL(0xbb44db8a,0x856463a8),LL(0x4baf2f64,0x18ec5abe),LL(0x92980518,0x75efa67d),LL(0x94b03911,0xabd300f8),LL(0xc1cd1cf7,0x4ea44bd4),LL(0x124ef41a,0x525c3583), LL(0x6b3a701c,0x03c18c0a),LL(0xcc7b6885,0x5ef82731),LL(0xa00d0089,0xb3716386),LL(0x741c0ea9,0xed9af50c),LL(0x8a36f03f,0x31f0e49a),LL(0xca724a16,0xce993757),
+ LL(0x9a90c6b9,0x2b6bf5e2),LL(0xa2c0b35f,0x9b134fc8),LL(0xa6717af8,0xd64157f8),LL(0x45dd16f0,0x7228156c),LL(0xdaa99226,0x0a9ab894),LL(0xbccb07e5,0xa7b130f7), LL(0x4d9243d5,0x2b7ab41f),LL(0x88568fa4,0x570b4ed0),LL(0xc9c84d91,0x666b98be),LL(0x02124f7a,0x2a75793d),LL(0x0aa16891,0x0fb9b82e),LL(0x3cc7f2d7,0x71e94c93),
+ LL(0xf47211c0,0xb7c13bfb),LL(0xe70929ae,0x738fe4a9),LL(0x423db6f3,0x4cdac99b),LL(0xe4255a4d,0x3883201a),LL(0x9730d749,0x7ffe82d3),LL(0xafbaaabb,0x033ba755), LL(0xf836d62b,0xa302ba65),LL(0x143a88bb,0xc626f604),LL(0x31c16b3f,0xe1d189aa),LL(0x7d68ab17,0x4664c050),LL(0xc02eb56b,0xcffc651c),LL(0x6ab49c24,0x6c52f3c4),
+ LL(0x8fb415b7,0x58775857),LL(0x9e88dca3,0xab580f15),LL(0xa62265d2,0x86a12e3d),LL(0x72d98b08,0x8ec42786),LL(0xf61e9c85,0xb9da8016),LL(0x800994ce,0xa895aedb), LL(0xe38ef526,0x63d0878c),LL(0x1efb6575,0xa081d714),LL(0x6a1c1efa,0x780b9e12),LL(0xebd0497a,0xeed68d0e),LL(0x9265231e,0xbfeee3d2),LL(0x80e03127,0x46f751da),
+ LL(0x03e4074c,0x806dce0b),LL(0x6973bc6d,0xd4054700),LL(0xa2897b68,0x8c4d393e),LL(0xc7f9af16,0x7d592d04),LL(0x4f895dbf,0x0625826a),LL(0x37dfc8a1,0x038bed29), LL(0x4799d78a,0x981862da),LL(0x6675c1b3,0xf34c1895),LL(0x8706afd3,0x64de9a5b),LL(0xf74e6ca3,0xc80ff68e),LL(0x83ed8cf2,0x26a90422),LL(0x77a47011,0xc1f5ce53),
+ LL(0x4aabf727,0x0bd15783),LL(0x54fce3ad,0xfe79d2dd),LL(0x1a77ce78,0x242b1806),LL(0xda7e489c,0x30cf6c32),LL(0xb2966f38,0x854e43f8),LL(0xa2dd4ea3,0x6e5fb045), LL(0xde3c9b7a,0xb2a48aec),LL(0x3625ebd6,0x66ac77e6),LL(0x0bcbabe2,0x332a969b),LL(0x5be51225,0x19de2701),LL(0x5b9b80e6,0xf26c73fc),LL(0x91025007,0x98c9cbf7),
+ LL(0xbc098b8e,0x1e41874e),LL(0x8a234773,0x758ccd5f),LL(0xc1bc847f,0x47ab76ca),LL(0xc540ceaf,0x377f32e9),LL(0x69c2df21,0xba8897c3),LL(0x233c3a02,0x6afacb01), LL(0xfb54ffb1,0xf1609b45),LL(0xb8f9c150,0xb7a98e5a),LL(0x08b1977e,0x607478b0),LL(0xd48b7a90,0xa9500582),LL(0x32fa7597,0xacd841e3),LL(0xf9333957,0xdf53373d),
+ LL(0x04926a41,0xd25f6508),LL(0x514045da,0x7236b475),LL(0x08b9b08b,0x0b360311),LL(0x3fe92e91,0x16477aff),LL(0x03189ddc,0x6e5f6cb1),LL(0xc698a38f,0x81ff008e), LL(0xc93adb23,0x02a09218),LL(0x445d8fae,0x71fcecd3),LL(0x8fd6b76c,0x55a15eac),LL(0x11ef96b4,0x1e37ec36),LL(0x30e433b5,0xd1b3b3fc),LL(0x51d174c3,0x49518733),
+},
+/* digit=31 base_pwr=2^155 */
+{
+ LL(0xb8c9f82e,0x7914213d),LL(0xfc038e90,0x7a3e4e38),LL(0x26a34238,0x6edae5a1),LL(0x701ce8c7,0xe566bf50),LL(0x55656e02,0x3562e875),LL(0xb4e8efbf,0x48325ebf), LL(0x66505ec3,0x5f10a504),LL(0x8da78aec,0xd8b9834b),LL(0xcc2f2e40,0x49d1fc25),LL(0xaf5718c1,0xe973bb1c),LL(0xd2d6b890,0x9b8825da),LL(0xe2f00f12,0x7de7885e),
+ LL(0x7ef79898,0xe37211be),LL(0x21344d16,0xa8103877),LL(0xa1b9f8b4,0xfdcd7e26),LL(0x7d7f72d5,0x5641e45d),LL(0xc449c920,0x5377c1be),LL(0xefc7b2a1,0xd3edcb0c), LL(0xe14b42fc,0xc657a9ff),LL(0x00831b07,0xc8f858c8),LL(0xd020eaa8,0x6bfcd1bc),LL(0x3f6860c7,0x17534b0a),LL(0x84c7c806,0x8ce57222),LL(0x2bd7456b,0xa1d40eaf),
+ LL(0xc9aa57ee,0xe0c93007),LL(0x8895a604,0xebb2d47b),LL(0xc4fd6ffe,0xb8aebc49),LL(0x73f300b6,0x2c06e1e5),LL(0x81628b8b,0xa019070d),LL(0xbaf8c1ea,0x2db1690b), LL(0xcc94ccd2,0xb3fce6c8),LL(0x85bcdf4f,0xf3014638),LL(0xe2f82c32,0xb1e62616),LL(0x68295a54,0x85581e24),LL(0xbf51f8fa,0x0f2e2ff5),LL(0x155c1f6f,0x940716f1),
+ LL(0x4e623856,0xaed02b6b),LL(0x3e1d74cb,0x7a6d2bef),LL(0x654e7c30,0x82226ec4),LL(0xe7034bfd,0x008ac003),LL(0x7fd6b555,0xe343c540),LL(0x1b429d44,0xca1b2907), LL(0x9c3ceea2,0xe0702a33),LL(0x732694c3,0x48079aa9),LL(0xd4652401,0x7e6d72f6),LL(0x35f60043,0xd92655ed),LL(0x273e8cc4,0xa0dbaac6),LL(0x3c3ffb40,0x0bb8f0f9),
+ LL(0xc95cd23b,0xb41b87b6),LL(0x55e371a4,0xb99714ba),LL(0x6f571ceb,0xb138ee8f),LL(0x80146ec7,0x09c42be4),LL(0xee9aa125,0x275ee21e),LL(0x3a878b59,0x0cef4d6f), LL(0xa801068d,0xd436eb1c),LL(0x762b8a80,0xe2c5448c),LL(0xf3640eca,0x243beee1),LL(0x32bbba7a,0xf979458b),LL(0xa63407d3,0x6bc26cfe),LL(0x392dd1d3,0xd3b6e132),
+ LL(0x3de4ba2e,0xbc06ecab),LL(0x9e491bcd,0xf51ca063),LL(0x453c94be,0xa6fc6fa0),LL(0xed1a6731,0x5460f943),LL(0x4ec3f1fb,0xeb11656a),LL(0xff1e7d4e,0x2fcb2cab), LL(0x8fea2286,0x59526467),LL(0x4e0bee38,0x838117a3),LL(0x24fd2ce5,0x7bdf5888),LL(0x9f2c2925,0x13df0c83),LL(0xdee97f30,0x1bf621e6),LL(0xebea6641,0xb43b2558),
+ LL(0x8e729329,0x246c8660),LL(0xd693dac8,0x39fcc41d),LL(0xc062a6c0,0x48a65b54),LL(0x6a5a3101,0x368a5770),LL(0x47ed1988,0xd143600f),LL(0xa764ce3d,0x48466d92), LL(0x5a22cb6b,0xb0500613),LL(0xedea070c,0xf1d77247),LL(0x617f2464,0xb1ddd151),LL(0x28b83fd9,0x79050698),LL(0xd70bf93e,0x021abb26),LL(0xab5a5e1e,0x590b3c42),
+ LL(0x1cfb991f,0x5906a35c),LL(0x740a7744,0xb62a4f80),LL(0x36f84763,0x65c8ac91),LL(0xbe0f1dd3,0xf73b3deb),LL(0xa2d26c21,0x40358868),LL(0x76792ae7,0xd907e90a), LL(0x668c3d5f,0x3ecea167),LL(0x6754b49c,0x731068f2),LL(0x0e006243,0x6db89109),LL(0xdd94681b,0xd29106e6),LL(0xa85a3de2,0xb40b8694),LL(0x936b86cc,0xc80c7bf1),
+ LL(0x11913575,0x003d45d0),LL(0x87e1186b,0x866cb2dd),LL(0x46b69a22,0x692f6301),LL(0x8174c1d1,0xd296a55c),LL(0x9f17af00,0x77ef6fbe),LL(0x3aa922e1,0x6b588be9), LL(0x033e6dd7,0x99ecb44f),LL(0x1d22b7cd,0x32edea2c),LL(0xba7006f3,0x3122b027),LL(0xbb6ebc5c,0x8950054b),LL(0x82dab805,0x4f6d6061),LL(0x1bae5f1b,0xc1205518),
+ LL(0xe08c180f,0x28d33e79),LL(0xf6aec9ce,0x768c7794),LL(0xce683c5b,0x5a749f3b),LL(0x8371fe75,0x717629d9),LL(0x57712c1d,0x5e828fc0),LL(0x7e4c61aa,0xb46c6ed1), LL(0x5bccf95c,0x5d927bad),LL(0xd72f68ec,0x55d6fc80),LL(0x98591dc2,0x560a99a3),LL(0x4836664c,0xc885fe8a),LL(0x26d79298,0xd18acd42),LL(0x185df1d7,0x05e4cd17),
+ LL(0xfcc83355,0xebc60e21),LL(0xd9119b77,0xc94dbc02),LL(0x2f18ae9a,0xceb05a31),LL(0xb8f69016,0xa8462962),LL(0x8f67b5f4,0x58dde5a4),LL(0xaf3c234d,0xb8bdf9c9), LL(0x80e85df8,0xe95c069f),LL(0xab3aa0e5,0x9d525e1b),LL(0x76276d8b,0x73c8a92f),LL(0x163530ef,0x7feb4abd),LL(0x5ef5ad73,0x8ca949b3),LL(0x2e3d057b,0xe129431e),
+ LL(0x60dec308,0x9d8a925b),LL(0x6b3ea363,0xb72e3efa),LL(0xdfb534b8,0x4f53ca6d),LL(0x6dd78a32,0x4e64874c),LL(0xc2a146d5,0x336e5b46),LL(0x98395201,0x07c76d63), LL(0x8fe3e815,0xa4c09522),LL(0x3221cc26,0x887e659d),LL(0xc36286ec,0x0ff92f64),LL(0xc3ebb08c,0x57b1b903),LL(0x65f00c30,0xc6bdc9b6),LL(0x9a46d36e,0x82624226),
+ LL(0x1a0b619a,0xc782c16c),LL(0xbe316086,0x8643d42b),LL(0xc0daa421,0x49d2966b),LL(0xb7b487e0,0x080b1caf),LL(0x144de273,0x1d33bb53),LL(0x6faf7ed9,0x8bafce2d), LL(0x408d4636,0xdafbe3cf),LL(0x7ee8835b,0xf10527df),LL(0xe2e75522,0xe1123f3e),LL(0xebe27d60,0xb388c64b),LL(0xe3f1f55e,0x2cb38dc1),LL(0xe34524d8,0x57ff8e43),
+ LL(0x85653dc8,0xd67dc92b),LL(0x0bc93ab9,0x8e0970af),LL(0x8b87c0af,0xb6f09baa),LL(0x52760ef4,0x5a8a9030),LL(0x1047bf85,0x2e2ae756),LL(0x85bd4e74,0xd049078f), LL(0x3729f708,0xced11ff8),LL(0xd91068a6,0xdd21cbeb),LL(0x24b3e911,0x83d488ff),LL(0x1afd2196,0x6e166fda),LL(0x4f0d2128,0x66a91211),LL(0x05c9f39c,0xd11078ed),
+ LL(0xbdbdf0cf,0xd87003d3),LL(0x56c298f1,0xe9750b5b),LL(0xb73ad05d,0xc256c3a2),LL(0x2ee94279,0xe0779a19),LL(0x279626a3,0x31d8b3c6),LL(0x90163bc8,0x469056bb), LL(0x23755853,0xe6aeabc6),LL(0x896a6f4c,0x9fffdfe2),LL(0xa36cf41b,0x15c1ce78),LL(0xeee41941,0xd4c8c025),LL(0x7653be9d,0xf7a917ee),LL(0x59d52222,0xfa3cba96),
+ LL(0x5f8ab132,0x913f9207),LL(0x5c14080f,0xd5b6792c),LL(0x787c3594,0xefab4e2c),LL(0xe7b7b7dd,0xa55d465f),LL(0x34e28e6a,0x921aaad8),LL(0x12d6a7bc,0xc4f3a35e), LL(0x6115a5ae,0x109803c4),LL(0xe709f9a1,0xc023098c),LL(0x99c5bb66,0x1a8c8bdb),LL(0xbc7c2da7,0x1cd1c2b6),LL(0x5f927eef,0x50189c97),LL(0x229f9410,0x493823d1),
+},
+/* digit=32 base_pwr=2^160 */
+{
+ LL(0xf0ce2df4,0x11a8fde5),LL(0xfa8d26df,0xbc70ca3e),LL(0xc74dfe82,0x6818c275),LL(0x38373a50,0x2b0294ac),LL(0xe8e5f88f,0x584c4061),LL(0x7342383a,0x1c05c1ca), LL(0x911430ec,0x263895b3),LL(0xa5171453,0xef9b0032),LL(0x84da7f0c,0x144359da),LL(0x924a09f2,0x76e3095a),LL(0xd69ad835,0x612986e3),LL(0x392122af,0x70e03ada),
+ LL(0x6754f492,0x3ee0a31c),LL(0x96769ff5,0x02636c6b),LL(0xf0fbfa96,0x90a64f4f),LL(0xfafea65a,0x513f054e),LL(0x9cf4b9f9,0x796ba747),LL(0x932a9590,0x3198c068), LL(0x549ee095,0x93af8a65),LL(0xa212760f,0xb8b6f72c),LL(0xc1a46c8f,0x23bc71e9),LL(0x4c9bca72,0x000643af),LL(0x848cea30,0xb6d967c7),LL(0x73312ec2,0xe06b6b4e),
+ LL(0x67aad17b,0xfeb707ee),LL(0x83042995,0xbb21b287),LL(0x9a0d32ba,0x26de1645),LL(0x1ffb9266,0x9a2ff38a),LL(0x8f578b4a,0x4e5ad96d),LL(0x883e7443,0x26cc0655), LL(0x2ee9367a,0x1d8eecab),LL(0x881de2f8,0x42b84337),LL(0xd758ae41,0xe49b2fae),LL(0x4a85d867,0x6a9a2290),LL(0xe68cba86,0x2fb89dce),LL(0x7f09a982,0xbc252635),
+ LL(0x1d85a725,0x52ec9956),LL(0xf3208012,0x0f9be000),LL(0x6dcc7816,0xe881337c),LL(0x791f7cf1,0xe4e7b6d9),LL(0x59885a42,0xfaa717aa),LL(0xf9c01e41,0xb1bbb5c7), LL(0xa0361880,0xcf208d58),LL(0x20afa350,0x24426e40),LL(0x264ce04a,0x7261871b),LL(0xcd42026a,0x66be4a86),LL(0x829f99fe,0xc5397b77),LL(0x24578e2b,0xffe4a6bc),
+ LL(0x8c61aaac,0xadc79436),LL(0x5e926563,0x24c7fd13),LL(0x0406c129,0xef9faaa4),LL(0x8b658d3c,0xf4e6388c),LL(0x1e435baf,0x7262beb4),LL(0xfdaeac99,0x3bf622cc), LL(0x4e1aeddc,0xd359f7d8),LL(0xd78c17b7,0x05dc4f8c),LL(0x29498ba5,0xb18cf032),LL(0x85bf35ad,0xc67388ca),LL(0x62aa4bc8,0x8a7a6aa2),LL(0x72f4627a,0x0b8f458e),
+ LL(0xf822d5f9,0x0733667a),LL(0x18339700,0xd7f81b9e),LL(0xa7bc265f,0x7ca29b27),LL(0xeb4f0c7a,0x9fefa698),LL(0x01f27630,0x7b6f3513),LL(0xfcfb1133,0x72f0f152), LL(0x5c81eb14,0x9928d9d0),LL(0xed8ff6cb,0xa16ac36b),LL(0xe041bef3,0x7fbd1acb),LL(0xf8d99854,0x7d25159a),LL(0xdb5a0dc5,0x2ec3a7d8),LL(0x87e3e933,0xd86fc4cc),
+ LL(0xc68e4488,0x3fb812ee),LL(0x60ef7281,0x53c5eaa4),LL(0x8fbefbe4,0xe5724183),LL(0xa4b24a05,0x2b7d49f4),LL(0x710c0a43,0x23b138d0),LL(0xa85ec1db,0x16a5b4c1), LL(0x305feb02,0x7cc1f3d7),LL(0x5b6c1b54,0x52f7947d),LL(0x8f56981c,0x1bda2312),LL(0xb4080a01,0x68663eae),LL(0x9f999b7f,0x8dd7ba7e),LL(0xb686580c,0xd8768d19),
+ LL(0x4c20e15f,0xba8418f3),LL(0xfb54404e,0x7eed2494),LL(0xbce1e82d,0x4e6438d7),LL(0xb397915b,0x9e489b3e),LL(0xfb4cf659,0xa9baea9f),LL(0x42ef4aff,0x8bc5b2ba), LL(0x7e62a188,0xae3fb533),LL(0x496e8e35,0xcd648493),LL(0xdefe047b,0x89728e28),LL(0xd24e60fe,0x63a8c679),LL(0x470f710c,0xadacbf92),LL(0x5e198d3c,0xd470aeb9),
+ LL(0x7afdda94,0xbcd0e0ad),LL(0x34a30687,0x95a0dbbe),LL(0x8c5e2665,0xbbe3c3df),LL(0xebf2bc16,0x742becd8),LL(0x3fa163a6,0x300ceb48),LL(0x4663354b,0x0c5d02ee), LL(0xb5e606a4,0xe4fb9ad6),LL(0xcf49ff95,0x93f507b8),LL(0x585c193b,0x9406a90c),LL(0x4ecf9517,0xad1440c1),LL(0x9cea53f1,0x184cb475),LL(0x8ef11302,0x6855c474),
+ LL(0x7a3e874a,0x8e3807dd),LL(0x89ac3a99,0xc4edb45b),LL(0x4bfd77d2,0x9ba9cdaf),LL(0xb540fffc,0x31d33f59),LL(0x0c60028b,0x404c8779),LL(0x89688c81,0x7f89da71), LL(0x504b862b,0xdd3390e5),LL(0xe937efe3,0xdf1e721b),LL(0x63e6036f,0x5833d0df),LL(0x385fbab4,0x7712527a),LL(0xd210c0d4,0x6347236b),LL(0x8d238e2d,0x12d7733c),
+ LL(0xedcafa52,0x00ecb523),LL(0x086f69d3,0x0da0ae0e),LL(0xc242f347,0xc384de15),LL(0x848c12b7,0xfb050e6e),LL(0x64e015ce,0x22f67654),LL(0x7ca122f2,0xcbdc2a48), LL(0x445fb02c,0xa940d973),LL(0x3767d89d,0x00f31e78),LL(0x613dabdd,0x2b65a237),LL(0xc875ae09,0x2be0ab05),LL(0xba204f8e,0xb22e54fd),LL(0x0f7687b9,0x65e2029d),
+ LL(0x302e943f,0x0ecb0723),LL(0x4a443e78,0xd180ca1e),LL(0x23dd2c9e,0x39e78911),LL(0x01fe50bb,0xfa2a4404),LL(0x154d39d1,0x4678e7ed),LL(0xaf513e01,0x64ddaee1), LL(0x634904da,0x6d4c615a),LL(0xba5c900c,0x937c6326),LL(0xeb6c8582,0x70658f5f),LL(0xf3d65166,0x2a04fd51),LL(0xb676eb47,0xcefe7472),LL(0xf597d887,0xd3565a71),
+ LL(0x1855a71c,0xffd82538),LL(0x438bd8d8,0x26a330b3),LL(0xf9d8c5f9,0x89628311),LL(0x953738a0,0x8d5fb9cf),LL(0xedfcd4e5,0xcb7159c9),LL(0x2064c7c2,0xd64e5230), LL(0x689f3cfe,0xf858ed80),LL(0x56128b67,0x4830e309),LL(0xe0e90688,0x2e1692da),LL(0xca9cc232,0xab818913),LL(0xa5d229a6,0xe2e30c23),LL(0x0e740e23,0xa544e8b1),
+ LL(0xe5dcba80,0x299520f4),LL(0x2b758045,0x522ad4b5),LL(0x193b36d4,0x54eabe27),LL(0x45e9e442,0xda4d3bff),LL(0x637311f3,0x44cb9252),LL(0x71338ebf,0x4cd620a9), LL(0xcc9524fb,0xec908157),LL(0xa8c955d7,0x2731a11b),LL(0x5cb94009,0x72a5e054),LL(0x9126cfe8,0x7eee8f3b),LL(0x3dd5d5ce,0xc71e2920),LL(0x22069494,0xe886f91a),
+ LL(0xdc61e6cc,0x1c15e569),LL(0x58fc7800,0x8fd72967),LL(0x37a9dfc5,0xe61e7db7),LL(0x5afd7822,0x3f34a9c6),LL(0x19e80773,0x0a112742),LL(0x4760fc58,0xa353460c), LL(0xb3124c71,0x2fb7deeb),LL(0x2d4009cc,0x48463627),LL(0xc3a10370,0x399d1933),LL(0x54388dbd,0x7eb19450),LL(0x7c2a006a,0x8ecce639),LL(0x55c932a0,0x3d565daf),
+ LL(0x0db962c0,0x294d2955),LL(0x6d523ab0,0xd6994ef4),LL(0x58f95037,0xfa1a7f91),LL(0x64420c94,0xb1379811),LL(0x093caea8,0x2b686e1e),LL(0xf9e1c340,0xdef10944), LL(0x611d9bf5,0xcd1beecf),LL(0xa1b5267b,0x34696c50),LL(0x2dfc2b16,0xcecbc719),LL(0xcee7e854,0x2cdb955d),LL(0xf2635cc8,0x9fefc321),LL(0x2936f7d3,0x276d2e4f),
+},
+/* digit=33 base_pwr=2^165 */
+{
+ LL(0x67141724,0x4962c021),LL(0xabe7762f,0x5f81eabe),LL(0xdd189c3f,0x78549a79),LL(0x6ce517a7,0x47675cdd),LL(0x32d6bb97,0x5102294e),LL(0x6ed1a029,0xb19500c6), LL(0xb16a206c,0x3efb54e8),LL(0x0dc135b8,0x7dbdcc25),LL(0x8967fb04,0x955bc294),LL(0xbe04e909,0x373615c9),LL(0x111efad6,0xf1fcf820),LL(0x6fd2e97a,0x8530f97d),
+ LL(0xb4805410,0x3f2b5bd4),LL(0xf96c5ee7,0x201ca7a9),LL(0x94256fe1,0x532ef2db),LL(0x318ddb03,0xacbfc459),LL(0x5f24c8e1,0x2375f9fd),LL(0x370783db,0xd27c479b), LL(0x56541ae6,0x1bd461e8),LL(0x7f7ea49a,0x78f054a7),LL(0x8845f315,0xc9f8777d),LL(0x97fc92c7,0x81aed296),LL(0x49929540,0x9f2f8d79),LL(0xff5ebfe0,0x7531e78b),
+ LL(0x543b3e41,0xbd9a66d6),LL(0x2ae73774,0x2948c0a6),LL(0xef38e9b3,0xa75151df),LL(0x754fb3fb,0xa3348ae5),LL(0x13069b72,0x1218fa8f),LL(0x0835dfaf,0x532bb051), LL(0xdf2be3c6,0x2121a98e),LL(0x9e5199bc,0x85980de6),LL(0x1a1eb6ee,0x1b23a4be),LL(0xadeb3ae5,0xb5c48b92),LL(0xedea2b45,0xeebd305d),LL(0xc37198ea,0x20543f04),
+ LL(0x0fab968c,0xd0960bd8),LL(0xae028db0,0x6899e4fa),LL(0xa9850916,0x975ccc77),LL(0xe5f81554,0xb41bd531),LL(0xc8cff2c8,0xbdf8ab57),LL(0xf5822be3,0xea306a01), LL(0xbefbdbbe,0x1f0ac0e7),LL(0x60519f87,0x72f4b0e9),LL(0xe3cc86ab,0x22bd8b82),LL(0x2b2beaee,0xc43bde8d),LL(0x412617ff,0x8168781e),LL(0xb7ee7096,0xc5610627),
+ LL(0x40671bd2,0xc4085538),LL(0x599f8eba,0xccb74902),LL(0x8d65e832,0x477a4a09),LL(0xf1241626,0xc620c314),LL(0xe7344054,0x05f2f152),LL(0x6d83320d,0x2483a2d9), LL(0x0e344da8,0x167439d7),LL(0x1002fb36,0xa0c02b1b),LL(0x30afbda2,0x46cb4a70),LL(0x229d4efe,0xe74e3488),LL(0x1cef3aec,0xd371dce2),LL(0x7c3f2521,0x96e0592c),
+ LL(0xcc5f4a6e,0xdec0e091),LL(0x201108d0,0x055ff295),LL(0xdc202800,0x2b371998),LL(0x0d5f5f9d,0x1b650d83),LL(0xa0226262,0x29be5503),LL(0x185bf3f1,0x0f3681ac), LL(0x8c3e2c4f,0x4f5c44b4),LL(0x717814fd,0xcfe74a51),LL(0x7b52a561,0xb0ce4183),LL(0xee634895,0xde143e3a),LL(0x48d46b2f,0x08f83100),LL(0x6386486d,0x34b79d55),
+ LL(0xee1388ba,0xa60659c4),LL(0x7eca29dd,0x475a4d06),LL(0x66470e08,0xf1ef88c1),LL(0x687c716a,0x71cac87a),LL(0x86f43fff,0x994fb1ee),LL(0x43384658,0x53ded2ef), LL(0x56c41587,0x317d9024),LL(0x9dea0f26,0x6807f0ad),LL(0xa0b0d53b,0xfee8beaa),LL(0xb0288c94,0x15c06a1f),LL(0x47028bce,0x4b9eab03),LL(0x1446bc6e,0x6d214435),
+ LL(0x01a8eb44,0x0869457a),LL(0x7a7bedd7,0x52223985),LL(0x00057505,0x2c04b0c6),LL(0x0b09adeb,0x468be6e8),LL(0x6f81474f,0x2f3bf32b),LL(0xa712ccce,0xf54f949d), LL(0x4cdd8f2a,0x292cee42),LL(0x9c221be1,0x3d9fdf6b),LL(0x56f47b2a,0xe54da661),LL(0x840b5d1b,0x2ca76835),LL(0x8a6e8cf6,0xb52adb6a),LL(0xdade153e,0x8b416a6b),
+ LL(0x3fd55732,0xb8c3a138),LL(0x2fd63498,0x4b348243),LL(0xf52c44d3,0x60cc7a0f),LL(0x9422c87e,0x9787f356),LL(0x60ad9f57,0x0fae6177),LL(0x82e307c4,0xb9ac12d8), LL(0x79416b16,0x52316618),LL(0x91611196,0xe603cb9a),LL(0xe34c3a39,0x0ce22a84),LL(0x5b2dca8b,0xcb191237),LL(0x9e5b750a,0xcb87c227),LL(0x13a02f00,0x7feccba0),
+ LL(0xa3cd6034,0xd3a66685),LL(0x3a283c3a,0x74ad77ad),LL(0x66644cd0,0x0c903afb),LL(0xc1f90202,0x34e18018),LL(0x0008aa04,0x8fa168e7),LL(0xbe8e35ae,0x871573df), LL(0xf4561f77,0x8841591e),LL(0xc6cd0f01,0x55e3033d),LL(0xfe1fa6ff,0x44327c97),LL(0xdddfcba8,0xed4e69d6),LL(0x52d907ec,0xe82e1e42),LL(0x79064b8d,0x8a5d9a71),
+ LL(0xc26f1000,0xa47a884c),LL(0x44a4b7cb,0x9f047634),LL(0x89813d5f,0xa5a2bf4e),LL(0xd8e9318d,0x83ce02c9),LL(0x2c86c874,0xf2731254),LL(0x02a0813f,0xb76a3096), LL(0x0c8b505d,0x1fabaa2d),LL(0x4895425b,0xad693de0),LL(0xa55ff754,0xaf7f5848),LL(0xeadfa222,0x098a328f),LL(0x470c5898,0x4c20adfb),LL(0x5d199733,0xe4b23ead),
+ LL(0x9a605b1a,0x37b29ca7),LL(0x30caed34,0x2ca364f6),LL(0x3c2ff02f,0x1e538aae),LL(0x42c6a320,0xc10c493c),LL(0xa2b9e130,0x92f18f28),LL(0xdd0ed08f,0xaf249c41), LL(0x70285f2f,0x42039a52),LL(0xcfd3ebb0,0x4e502f2e),LL(0x6e39b30f,0x42821914),LL(0x70e820ca,0xdbc809f1),LL(0xd2781e34,0xbccb5567),LL(0xbe3d05dd,0x8c1e3bfc),
+ LL(0x43eeed0a,0xa29f0b65),LL(0xfd8b3697,0x0b96b6a1),LL(0x88f8755a,0xc2454ada),LL(0xaf85d4ac,0x57202337),LL(0xa7aaef40,0xaddfc388),LL(0xb156a5fc,0xc1495163), LL(0x1f1a8775,0x67abbbcb),LL(0x5958bb8b,0xb83e3dd6),LL(0x36dbf23c,0x17119d02),LL(0xb954337a,0xeb336460),LL(0x6f46dca7,0x9b101001),LL(0xbc991dbe,0xef862ae8),
+ LL(0x66befae3,0xaa878db5),LL(0x05110c6f,0x28bb9c9e),LL(0x4caa069a,0xc3a57a8c),LL(0x594a2753,0xbb5b550e),LL(0x5187afb8,0x01ab8056),LL(0xb9255f65,0x1f7c9ed3), LL(0x146f6635,0xcd669e2b),LL(0xcb9457a3,0xa8f2d4b6),LL(0x849dba46,0x0f0541aa),LL(0x2cc9c7e9,0x2537bf02),LL(0xd79ac77e,0x872b4f59),LL(0xe0a44aa9,0x705c2219),
+ LL(0x3849051d,0x03b42dbb),LL(0xf27a63a6,0xe2efcfe3),LL(0xceb478c2,0xf709a5ff),LL(0xc4f7feda,0x2cc86b82),LL(0x066a1c08,0xefa834e4),LL(0x309fd644,0x153b64ef), LL(0xe62168ff,0x8cff4eb0),LL(0x095d9f3b,0x0d7781db),LL(0x10bce338,0x01f8e1af),LL(0x139d8f2b,0x14aa9a02),LL(0x259ec819,0x1985d844),LL(0x3a072e8e,0xd7758b21),
+ LL(0x8565afc9,0x65f7d2c1),LL(0x70fa7b82,0x764c8971),LL(0x986436f2,0xe268634c),LL(0x33356165,0x6334d8d1),LL(0x9ec7957d,0xf1716426),LL(0xb8093983,0xae834331), LL(0xd2dfcce7,0xedb1fe5c),LL(0x68463e5c,0x6195b863),LL(0xa691b665,0x746e5f4d),LL(0xe1e2727e,0x61171291),LL(0x6f27b029,0xbb4aa8f1),LL(0x7f42c197,0x1037657d),
+},
+/* digit=34 base_pwr=2^170 */
+{
+ LL(0x0d5b855a,0xfe19901b),LL(0x2f745022,0x5facb955),LL(0x56c4ce5c,0x92fd0125),LL(0x938c89ab,0x23172d65),LL(0xaaa587b1,0xa71f8a33),LL(0xb55c9c50,0x511a3745), LL(0x7185086e,0xec005f6a),LL(0xf894c6ab,0x6dfc2761),LL(0x9e26361f,0x98a4d67f),LL(0x21389c25,0x7f0a2b23),LL(0x95ffbcee,0xd1588207),LL(0x9f36a888,0x4d6b29ab),
+ LL(0xd0a701a5,0xeccb421e),LL(0xb60cd286,0xad4cb9a5),LL(0x05a53972,0xd344da9e),LL(0x7bc99fea,0x3a8035e0),LL(0xc0f77bf5,0xe0214485),LL(0xe54df78a,0x50ada30e), LL(0x4ec2d576,0xdef45af6),LL(0x5f9a8678,0xa05d6184),LL(0xc337e017,0xa9b17db1),LL(0xb84671d5,0x026a4f66),LL(0x3b7d696d,0x60614234),LL(0x81cfd22a,0x71ed9aaf),
+ LL(0x439ada39,0x1b76a3c5),LL(0x89236ae5,0x818829cf),LL(0x750f8129,0x2277cb7a),LL(0x4d46502b,0x44aa462a),LL(0x64f06dc8,0x7a12e1e1),LL(0xba5630cf,0xb9a3300d), LL(0x55b05f4b,0xd2cc8d9c),LL(0xa700be7a,0x6d0b0b88),LL(0x9617500c,0xa7be9969),LL(0xc03f8a50,0x2b5b8dea),LL(0x785b3dfd,0x712f703e),LL(0xccf93950,0x96a5a60a),
+ LL(0xee828fba,0xfeb984b3),LL(0xe2bd188c,0x8273f830),LL(0x3ca0a99f,0x177ef97e),LL(0xacc000ac,0x76d4796d),LL(0xb140f51a,0xbad0fa6e),LL(0x06ebc810,0xb2756567), LL(0xa18cb32f,0xf89eb78f),LL(0xa65285b0,0xcfc37eae),LL(0xb25e9d1b,0xe2b29cfb),LL(0xb4e7aef3,0x9388ea8f),LL(0xe267e845,0xee606c12),LL(0x9f5806d7,0x6b103c54),
+ LL(0x3766f2ae,0xf418e3f6),LL(0x053ef1c1,0x4a3ad3c8),LL(0x560db262,0xd01e5b5b),LL(0xc02bf4c3,0xa583edc7),LL(0x52f318d3,0x7c9f7060),LL(0x1f5e1ffe,0x0852556f), LL(0xfeb0e63c,0xe1c70aa7),LL(0x89a8c058,0x59f0a3f9),LL(0x1ffc0ade,0x4aa4cf02),LL(0x38a78632,0xbb880e41),LL(0x6f28f096,0x35b0f759),LL(0xd5757d7d,0xf9c4fe17),
+ LL(0xfd6376eb,0x78b8879c),LL(0xc01e1edb,0x22a76461),LL(0x369cf0c4,0x6a44be39),LL(0x5ae54539,0x6653670d),LL(0x6fb43ad0,0x257bd751),LL(0x12baffdd,0xb3ac3715), LL(0x7548eabb,0x48659d61),LL(0x0cd468cb,0xd8f931f8),LL(0x49e3b531,0x98f02415),LL(0x70df011f,0x90b0d716),LL(0xab98f066,0x26d73c54),LL(0x88475d5e,0x06591ec9),
+ LL(0x412b84c3,0x627f6328),LL(0xa04545d2,0xd427e977),LL(0x104f25c2,0x5b0145bc),LL(0x2ac7ad62,0xa6931c4f),LL(0x1f8d42f5,0x40761143),LL(0xe7f8a0b3,0xfda5a76b), LL(0xfe0946b9,0x4f1ca5cf),LL(0xbeb2d427,0x6def7b9f),LL(0xc9a0d136,0x984bd4bb),LL(0x5b3af1c1,0xb9a77823),LL(0x38ac2087,0x04ee66ae),LL(0x26d9dbb9,0x63374ed9),
+ LL(0x44ba39e6,0xcf947c06),LL(0xedfe78d7,0xf5d5216c),LL(0x5f1835c9,0xd00115c0),LL(0xd8c79d90,0xdf084152),LL(0x6db5f791,0xc0c3a684),LL(0x749b18cd,0x40514451), LL(0x734df3f1,0xd314b7d5),LL(0x7f541415,0xbccdd3f0),LL(0x6855a942,0x97ed5af0),LL(0xe9d02ab9,0xea84ae9e),LL(0x3238a5d0,0xb87e9034),LL(0x650a0eab,0xd12d25c3),
+ LL(0x86a515a9,0x1473b55b),LL(0x3b337c64,0xa9e3230a),LL(0x9db668f1,0x7e8bf904),LL(0xf27f9fc9,0x1db2c25e),LL(0x2d9e467e,0x0c108607),LL(0xa3f00d52,0x4505579a), LL(0x240400a7,0xe2ad661b),LL(0x11af4874,0x8022294c),LL(0x78bba8e8,0x29e90370),LL(0xf6baca04,0xbf0fbf08),LL(0x4101fab0,0x2e46d2b7),LL(0xc61089e6,0x66065490),
+ LL(0x09f8a1cb,0x2131ce5b),LL(0x8ab129e2,0x7b373ed2),LL(0x77c1292a,0x463cc8d6),LL(0x94ffe9c5,0xa9b7cf65),LL(0xb99bfc4f,0x129125ce),LL(0x9820d323,0x819b4284), LL(0x76541a41,0x3f709763),LL(0xe32c7a7b,0xfd679ae5),LL(0xf65b6b3c,0xc39a208d),LL(0x50002745,0x1c22ebc0),LL(0xe2bcd202,0x268f19dd),LL(0x9c3d4266,0xfeac809c),
+ LL(0x87dcdbdb,0x07467837),LL(0x320493d8,0x4cce33be),LL(0x713c7746,0x9ab08cbe),LL(0x9c6dc5cb,0xd6f0c1de),LL(0x2ac03761,0x19400538),LL(0xd0547be5,0x3fc11f38), LL(0x819fe3fd,0x66b378ce),LL(0x3700fe7e,0x6a590acc),LL(0x8924b396,0x4c976a72),LL(0x70b9b250,0xa5006d8d),LL(0x12b85f9c,0x2fdce1b2),LL(0x495f8f1c,0x5858f7ce),
+ LL(0x903ff177,0x357540ab),LL(0x276af514,0x225280b8),LL(0x14d7fed3,0x33d273ac),LL(0xd186ee3d,0xfef6b9ff),LL(0x01a7b1d9,0xa94c2071),LL(0x50bc8bc2,0x4ea36274), LL(0xfa98a918,0xc68959c9),LL(0xc7bdc262,0x8f5eccee),LL(0xe6861310,0x7a73a4fc),LL(0xc828330f,0x19bcac90),LL(0x7ef74fdb,0x73e3b66f),LL(0x52d8f2f4,0x60f76983),
+ LL(0x7e03a14e,0xab357804),LL(0x8caf673f,0x0f4f2868),LL(0x66530425,0x919e661e),LL(0x91ba47c5,0x28da445c),LL(0x66c394fe,0xd6d05375),LL(0x02e8ae91,0xfe1864a3), LL(0xa753aec4,0xd34baca2),LL(0xa2c8d292,0x43b7ffe7),LL(0x04efb8f1,0x496659eb),LL(0xe0252dfd,0x310ec2a9),LL(0x9168a80e,0x98173d2f),LL(0x31497255,0xa3e018d6),
+ LL(0xd9d9284a,0x3266c887),LL(0x73646ab7,0x690f818b),LL(0xaf7fc33b,0x67315ec6),LL(0xc30b1ccb,0x181e61ab),LL(0x105a9e1c,0x1b81e6cd),LL(0x5078b9bb,0x62a15daf), LL(0x6fa8cc65,0x74f9840f),LL(0x43388573,0x356b7774),LL(0x06b3fd46,0xba0f7d05),LL(0x92b4fdad,0xb0ac864c),LL(0xef192cde,0xcdeac253),LL(0xc313b4a7,0x0c24810b),
+ LL(0x1adb09b7,0xef8c40bf),LL(0x0b74992a,0x2efeb49c),LL(0x2b79957f,0x3f0f8a41),LL(0x87a06873,0x08927bfe),LL(0x9288cb9a,0x1f63a410),LL(0xdf2b373a,0x8c66fb70), LL(0x980facae,0x98da4712),LL(0xd819d026,0x15ce5b17),LL(0x749a671a,0x097571a5),LL(0x894dd269,0x85a40804),LL(0x34cb6797,0x3e89c13c),LL(0xd07119a4,0x2d19d5e4),
+ LL(0xecbafb80,0x58225208),LL(0xaa73d6de,0x4f212035),LL(0x62fe86db,0x1224e455),LL(0x2dc5b2f1,0xa8c8a478),LL(0xc3096555,0x8a957b8d),LL(0xb1591452,0x6a3248b0), LL(0xcb604c18,0x1e563c58),LL(0x9bf1045e,0x32808cb5),LL(0x9462e7a2,0xf8f62de9),LL(0xc2489214,0x6b3dfe91),LL(0x2174639c,0x6c1d8fc4),LL(0xef88d4b5,0xdfca11b8),
+},
+/* digit=35 base_pwr=2^175 */
+{
+ LL(0x18690ad0,0x5a4a5ce4),LL(0xfe27f51a,0xd0f788e0),LL(0x4efe9a30,0xd459388e),LL(0xef9d074b,0x3a45c11a),LL(0x93ab9cb0,0xf68ab50b),LL(0xecd9a566,0x62fbc397), LL(0xcc587a7e,0xbfb79b7f),LL(0x92870bae,0xfcf4d66f),LL(0x877390f0,0x4f31aa21),LL(0xe314cfb5,0x2de0c645),LL(0x238eab12,0x56d904f6),LL(0xccb4d4f6,0x4d104a42),
+ LL(0x29358cd3,0x3eb83a87),LL(0xb9c6d430,0xad741295),LL(0x53abe4e9,0x57b8c77a),LL(0xbb9feb82,0x0a14673e),LL(0xf26f922e,0xc0a6cbf7),LL(0xa32e526c,0x213de299), LL(0x7b6ca858,0xca417e67),LL(0xfc2e0900,0x8d6ae0f7),LL(0x62e135dd,0x2bae0e7a),LL(0xa7ee82c7,0x962bdcae),LL(0xe5776c74,0x573d7f6a),LL(0x6ffbefeb,0x9c4de649),
+ LL(0x09335d38,0x8c962fc8),LL(0xeb38d176,0x26d1bc81),LL(0xc47711ed,0xe1aeb295),LL(0x6cbe3e4e,0x0812b992),LL(0x0ab9805d,0xeecacaf9),LL(0x3521a0ad,0x82fefbaa), LL(0xe2c31b9d,0x3a6948c0),LL(0xe82daf2b,0xb7d3905b),LL(0x25a34c37,0xbd3ac90e),LL(0x61453063,0x55afd99b),LL(0x90b99303,0x56d87cd1),LL(0x97ddb0a3,0xc9bf82dd),
+ LL(0x68916917,0xcbc0bb19),LL(0x1094bf88,0x0bbb9f92),LL(0xd3806442,0xf62cb350),LL(0x397a7602,0xe4d2f1cc),LL(0x43987d82,0xa54bd48e),LL(0x4f0a19fa,0x77b6f831), LL(0x6e766443,0xfa0c9a45),LL(0xf51ba70b,0x995ae0ff),LL(0x9cbd8d33,0x8e242c5b),LL(0x13d97956,0x1671eb08),LL(0x40da55fa,0xccae388f),LL(0xf376dce5,0x97cc48fa),
+ LL(0xe8c91718,0x1c2919bb),LL(0x5097bde3,0x9dbb727a),LL(0xf8ea2fb2,0x23f87ae7),LL(0xba310121,0xe1bfffdc),LL(0x75329669,0x5938c50c),LL(0x0549855c,0x716c63e0), LL(0x654814f0,0xe091b0c9),LL(0x0e43daee,0xa20535d1),LL(0x593ddd04,0x16ce68b2),LL(0xf59900bd,0x7813a49a),LL(0xd3e5d232,0xef0d3eec),LL(0x0ee3fd4d,0xe7d12cc4),
+ LL(0xef01fc5f,0xe54d92cd),LL(0xdda2e25a,0xc46c2ab8),LL(0x849f6142,0x7c907fd2),LL(0xacd0202d,0xbb11dd2d),LL(0x1d92d19a,0xa4913a70),LL(0xcf610677,0xe9a26ae0), LL(0x538943c5,0xfff1e1d5),LL(0xa47b2204,0x5943dcc4),LL(0x92cabf71,0xcafcf33a),LL(0xe329d1ad,0xd571e13c),LL(0x7a9a0e4c,0x7626ad23),LL(0x130d7f86,0xf0aa0d9f),
+ LL(0x19e6aa7e,0x09df3a44),LL(0x5841b1cd,0xe27ad047),LL(0xbde75934,0x02d2a69f),LL(0xfd9ba435,0xb0e05e53),LL(0xe008c16e,0x4732d88a),LL(0xea72110d,0xdebc4777), LL(0x2e3143ad,0xccb7d993),LL(0xea8cd06a,0x674f3753),LL(0x051562cf,0x56012a7a),LL(0x25f74cd6,0x961df684),LL(0x214d8a95,0x26630e71),LL(0x65d92f84,0x584e8d63),
+ LL(0xebc5557c,0x8a89daef),LL(0x275e1649,0x7ca71403),LL(0x5b80bb4a,0x48d92377),LL(0xa45b3626,0x0a587c52),LL(0xc75bfe91,0xdaff503c),LL(0x116d07d7,0xd845d3e6), LL(0xa51eeca2,0x6b5a4715),LL(0x74481991,0x34ac02bd),LL(0x595abf8d,0x8f076cfc),LL(0xed0391ce,0xc9de4ce9),LL(0xe1fcabd3,0xaaaad03a),LL(0x87b199ed,0x8d48ec00),
+ LL(0xae5dd482,0xbd0f2653),LL(0x060032dc,0x59f968dd),LL(0x67283310,0x6bea33e0),LL(0x012aa50c,0xccce88cc),LL(0x66838f46,0xbb6d7f2f),LL(0x05ec9bcb,0xb764c95f), LL(0x51477cca,0xd097b604),LL(0x82b20a85,0xc2fbda7b),LL(0x24e9ca8d,0x75fe07a4),LL(0x0cc40d01,0xfc4fa824),LL(0x0c0e95f7,0x0b17d5f9),LL(0x6e1e46dc,0x285e6e8a),
+ LL(0xbc9b2654,0xb0641d09),LL(0x8aa8fa35,0xf9fcc2e6),LL(0x00d5ec6e,0xd12a5b4b),LL(0x5569d89a,0x9be1a111),LL(0xffac7208,0x9c0566de),LL(0x7034edf1,0x7a9fd4ff), LL(0x9571c375,0x636aeb6b),LL(0x55cdf187,0x60d05aec),LL(0x734e9d2f,0xf4e2f898),LL(0x5ccdc6bc,0xdaf74219),LL(0x608a4f28,0x9d39249f),LL(0x8820e2c3,0xb5f1bb5e),
+ LL(0xd9589548,0xd02e9936),LL(0x5341402f,0x8f1bf575),LL(0x057300aa,0x1535a443),LL(0x65d29324,0x3062478e),LL(0xc656a3f3,0x4203351f),LL(0x6569c4ff,0xbeb21b51), LL(0xe1f0f263,0x8113ce70),LL(0x03f9320c,0x59d12939),LL(0xd08f8936,0x95061255),LL(0x97d4b705,0x8be3c0f9),LL(0x827837c2,0x0259742e),LL(0x95c65cda,0xf55ea28d),
+ LL(0x603dc3dc,0x62024812),LL(0xefd67b57,0x25dc5337),LL(0xd7f033fd,0x86b3eb38),LL(0x32646d6f,0xee3226b2),LL(0xf1dae596,0x8c4825f6),LL(0xa5bcb8e5,0xd2303055), LL(0x3c0baa76,0x904a5349),LL(0xe08646a7,0xe60f6125),LL(0x21d45f89,0xaf6a329f),LL(0x06605546,0xf20ad88a),LL(0x19a93d14,0xcf7a0e96),LL(0x91c97174,0xf1eabcc8),
+ LL(0x8f02af51,0x72b76e9e),LL(0xd580f95a,0xac94cbf1),LL(0x01d854a4,0x2e9cd748),LL(0x1f08a1bc,0x4ed4e906),LL(0x9d2bd936,0x0a2b2841),LL(0x51c89dda,0xbf863500), LL(0xe3f00bf5,0x9407b0e7),LL(0x28b57ac1,0x6b1f71ff),LL(0xcd28801f,0xc1dfe03f),LL(0xafa55309,0xf3d83d64),LL(0x8af8f76f,0x47aafba2),LL(0x6604b2e9,0x54eed45f),
+ LL(0x0f3e541f,0x59edd264),LL(0x82b76ba8,0x318674b5),LL(0x4e7f0716,0xbf4a0d30),LL(0x19b88200,0x36fc0e41),LL(0x40da801e,0x91db5602),LL(0x2c72c2c7,0x638371ad), LL(0xd5822da7,0xfe960c25),LL(0x4a7415e1,0x7a7571d1),LL(0xbccc1576,0x5a6480fe),LL(0xc3c88f47,0x72f4e5e5),LL(0x9a7bd8ec,0x224e7e74),LL(0x7631455e,0x3ebbf52c),
+ LL(0x8608ab37,0xae3c2bc0),LL(0x39f336b6,0x35e3da8c),LL(0x81f44511,0x74136642),LL(0x1d8506e7,0x21ce7c51),LL(0x846165f1,0x9b6718b3),LL(0xf5cabf6a,0x9e455007), LL(0x02611073,0xec582a0e),LL(0x83bf042e,0x269aa18d),LL(0x86306757,0x7c54fb7c),LL(0x1b948faf,0x45333602),LL(0xb7025d73,0xd3a5c508),LL(0x428471e4,0xcd6e555b),
+ LL(0x11a224e6,0x42c9fad5),LL(0x69b2ac26,0x6b6aeb8b),LL(0xb149854b,0x0cf4c7fd),LL(0x2fc359eb,0x4a7d9000),LL(0x29ec8603,0x9ff0c3ea),LL(0x9b24ee14,0x157ae785), LL(0x8979e9bb,0x638c809a),LL(0x7869d8c5,0x347dfb2e),LL(0xa07ea547,0x2fb1e0f8),LL(0xaecdec3f,0x1e580d32),LL(0x0f74025b,0xbbf89573),LL(0xdd529164,0xeb94d71b),
+},
+/* digit=36 base_pwr=2^180 */
+{
+ LL(0x8d688e31,0xfa2db51a),LL(0xa09c88d4,0x225b696c),LL(0x6059171f,0x9f88af1d),LL(0x782a0993,0x1c5fea5e),LL(0x4ec710d3,0xe0fb1588),LL(0xd32ce365,0xfaf372e5), LL(0x26506f45,0xd9f896ab),LL(0x8373c724,0x8d350338),LL(0xca6e7342,0x1b76992d),LL(0x6fd0c08b,0x76338fca),LL(0xa00f5c23,0xc3ea4c65),LL(0xb316b35b,0xdfab29b3),
+ LL(0x04a8313d,0x14f962e4),LL(0x5f1f5a26,0xc6e3e7c4),LL(0x79e777be,0x2c0e11c0),LL(0x4657c31b,0xa1705efb),LL(0x3c494de3,0x02688fd2),LL(0x412a8718,0x75664a84), LL(0x7a422f8a,0x878fc7ad),LL(0x7419bd0a,0xe5d581df),LL(0x704b70c0,0x7c813c4c),LL(0x7323c008,0x98553da8),LL(0x63089f1a,0x4f63cec6),LL(0x9655d291,0x9626d6fa),
+ LL(0x483aebf9,0x84e5541f),LL(0x49165772,0x8adff7dc),LL(0x9beaad3c,0xe0a43ad6),LL(0xf51c2714,0x97dd1820),LL(0x57ea5b0c,0xac2b4cb4),LL(0xd11767ca,0x87dbd011), LL(0xbfc7957a,0x18ccf36c),LL(0x1bc79227,0xd4a08841),LL(0xd8d292a8,0x9811ce43),LL(0xd58c4ee7,0x72c5fc68),LL(0xd35c65a7,0x5bc0f0be),LL(0xcbbf9669,0x0b446dbc),
+ LL(0x507f8b27,0x10586ea7),LL(0xa261f7d7,0x1510deb9),LL(0xdfbfa352,0xa42fc4d7),LL(0x1e1c2291,0xbf38c382),LL(0x0e11760a,0x46e40ef6),LL(0xdcb974d7,0xc24f6061), LL(0xa7619027,0x755b105b),LL(0xb8ffa759,0x8004bf09),LL(0x0945db60,0xa630d0b0),LL(0xf2809e1c,0xa160ac9c),LL(0xdc6c95c5,0x38fc1113),LL(0x5d52574f,0x01f54098),
+ LL(0x9cee9bce,0x7eba3da6),LL(0xd5377750,0x3e2c1248),LL(0x2b93d8b2,0x8c917d98),LL(0x7cad1f75,0xca8fc6ac),LL(0xa0ff150a,0x5f581f19),LL(0xe08327fa,0x872cc14a), LL(0xe9333188,0xc774f187),LL(0x497af7e8,0x528ed4ac),LL(0x8ad72b10,0xce036e9b),LL(0x917986cf,0x463f9ebb),LL(0x1325cf9b,0xbe516328),LL(0xdd7e5fea,0xd28d5c50),
+ LL(0x0b237b7b,0xa4e9f29f),LL(0x4270ee2d,0x8ed65b09),LL(0x2993359d,0x0e2184e4),LL(0x224d5aa3,0x4f96ce7f),LL(0x3a132c48,0x0862e200),LL(0x0f015f5f,0x5bbc6ad8), LL(0xd7162f5c,0xab9d5149),LL(0x1267e5d2,0xfe657729),LL(0xc1fd96e2,0x4865e671),LL(0x71a703b2,0x7baf4dbe),LL(0x142add10,0x83dd6cf9),LL(0x98461d30,0xab4fc1aa),
+ LL(0xdd58bbe3,0x714c1d1b),LL(0x039afd0f,0x85ba01ae),LL(0x6951ac80,0x7f23ea3a),LL(0xac00c837,0x5c599290),LL(0xbf24cc1b,0xf6efa2b3),LL(0x1e84462b,0x393d8e42), LL(0xf8b89453,0x9bda627d),LL(0xb23e0d1b,0xe66fff2e),LL(0xc3b94ec2,0xd1ee7089),LL(0x3031699a,0xf75dba6e),LL(0x242b2453,0x8ff75f79),LL(0x289bfed4,0xe721edeb),
+ LL(0x698ee21c,0xcda68a7e),LL(0x6a5e725e,0xc7414d19),LL(0xdce20b91,0x483be2da),LL(0xfc69dca6,0x7de1601c),LL(0xac4f9891,0x4bec17aa),LL(0x8d479a56,0xe8741dd1), LL(0xac23a286,0xc623cb8d),LL(0x166133f0,0xe20a96b5),LL(0x30dcde61,0xda9bb7c0),LL(0x3a1733fd,0xf84ea327),LL(0xe82fac31,0xd7afb6c3),LL(0xd3897449,0x37ea7d35),
+ LL(0xc1390fa8,0x083215a1),LL(0x6dce8ce0,0x901d686a),LL(0x837073ff,0x4ab1ba62),LL(0x34beaba5,0x10c287aa),LL(0x46985239,0xb4931af4),LL(0xb053c4dc,0x07639899), LL(0xe721eecd,0x29e7f44d),LL(0x57b3ff48,0x65817182),LL(0x5054e2e0,0x198542e2),LL(0x84616de8,0x923c9e15),LL(0xad465bb9,0x2a9c15e1),LL(0x16319245,0xd8d4efc7),
+ LL(0xfd028642,0xed85257e),LL(0xb96a2068,0x93657f45),LL(0xa13ac381,0xfef64eda),LL(0x56c557a3,0x108f6ff2),LL(0x9204e3f7,0xe690d92b),LL(0x03ef8640,0x902a3e38), LL(0x6416f50e,0xaefd4922),LL(0xb7eae8f0,0x9b272152),LL(0x29d93d8d,0xa911921f),LL(0x5eeeea56,0x7c6bc499),LL(0x3ca7c720,0xbd3439d8),LL(0xc39b208d,0x2f8cf2e3),
+ LL(0x9961a674,0x72dc7943),LL(0xa0e13668,0x839a0a52),LL(0x334945ea,0xd7a53fa9),LL(0xe7aa25db,0xdb21db77),LL(0x66e96da3,0xb6675a7d),LL(0xe66f33c0,0x2c31c406), LL(0x6ec7b9cb,0x45020b62),LL(0x0391f267,0xff46e9cd),LL(0x0fa2f221,0x7dabd744),LL(0x9d4a2a3e,0x9a32364b),LL(0x52d2e47a,0xf0f84ae8),LL(0x888f488a,0xd0b872bb),
+ LL(0x0370327b,0x120649b2),LL(0xcd48cdc6,0x0e76555a),LL(0xca01db03,0x4ed54dec),LL(0xac601d22,0x7be21319),LL(0x01b6576e,0xf7116619),LL(0x4e73537f,0x7839fa06), LL(0xe46e860a,0x169d43ac),LL(0x3078eed9,0xde6d658c),LL(0x5032142b,0x8df73139),LL(0x9b3c76c7,0x6be199b0),LL(0xf8bbffe5,0xc2f385f6),LL(0xd5ffd28c,0x848df7f3),
+ LL(0xc9790eef,0x531e4cef),LL(0x2b8d1a58,0xf7b5735e),LL(0xef568511,0xb8882f1e),LL(0x86a86db3,0xafb08d1c),LL(0xf54de8c7,0x88cb9df2),LL(0x9a683282,0xa44234f1), LL(0xa6e9ab2e,0xbc1b3d3a),LL(0x87fc99ee,0xefa071fb),LL(0xa102dc0f,0xfa3c737d),LL(0xd6a0cbd2,0xdf3248a6),LL(0x1ecc1bf4,0x6e62a4ff),LL(0xc8f1bc17,0xf718f940),
+ LL(0xf874628f,0xa342bf65),LL(0xc71a57bd,0x18de3f8a),LL(0x71fc321b,0xb4d12a17),LL(0xa25ebf10,0x96716602),LL(0x1a286d80,0x744f6820),LL(0xe3cf63b8,0xd60bad1d), LL(0x4368da09,0x0c0b1ac4),LL(0x73a6d3be,0x53afeae3),LL(0xa90af331,0x4d2e6ce2),LL(0x88bc0638,0xd797224f),LL(0x9396d893,0x10c60b2d),LL(0xfe45e1a8,0xae3b0c11),
+ LL(0x4f63f026,0x2c8b0aad),LL(0x50b253cc,0x2aff6238),LL(0x10c4d122,0xcab3e942),LL(0x07cd2816,0x52b59f04),LL(0x982c41fc,0x22322803),LL(0x8cf50b19,0x38844e66), LL(0xbe3264cd,0x42a959f7),LL(0x6c983524,0xbddc24bd),LL(0x462b8640,0xa489eb0c),LL(0x98029be7,0xb7c05092),LL(0xa1addc64,0xd5546b5f),LL(0xa0c655af,0xe7cac1fc),
+ LL(0xc6a6d6d1,0xa189f30f),LL(0x69665ab8,0xdd674d36),LL(0x7d8da76d,0x307c9ec3),LL(0xc1ea7c10,0xb3e1d006),LL(0xb88c62d4,0xc15e20b3),LL(0x0bff3b3a,0xb0000ec5), LL(0x9ff9aa5c,0x9e330eb1),LL(0xdf578877,0x8663f9fd),LL(0x02e1eb2a,0x157d3cb0),LL(0xf525e4d4,0x638f297b),LL(0x34a3dff1,0xa20f8332),LL(0x45a9c051,0x748ea86b),
+},
+/* digit=37 base_pwr=2^185 */
+{
+ LL(0xbc266ee3,0xfe9fdde8),LL(0xba18e6c7,0x91668688),LL(0xddde6f6e,0xa65349ac),LL(0x7e54356c,0xc53c29c9),LL(0x5709f73c,0xee15ad94),LL(0xe5429277,0x033b3940), LL(0xd0c3475a,0xf52035cd),LL(0x93f1f1f0,0x9c5bef4d),LL(0xca319bd4,0x26e0b0ce),LL(0x6951fd8d,0x4e7eb67b),LL(0x95c34d6f,0xac3a6f43),LL(0x00f60b59,0x1f2769e6),
+ LL(0xfb787270,0xbd10b8bf),LL(0xe43aaab6,0x4f0b1566),LL(0xc0c90781,0x9a18be5e),LL(0x1ad167ce,0x3677f4c7),LL(0xa68c1c56,0xccb254e2),LL(0xe2c4d275,0x392493e6), LL(0xd5b63617,0x44958cb1),LL(0x4caa4e7c,0x178f141a),LL(0xa2ffdbd5,0x7445a767),LL(0xb0b6c22d,0x0e789c99),LL(0x5dc92b2e,0x3ff8b656),LL(0xeca98782,0x1623e5c3),
+ LL(0x78207cef,0xfadf9be9),LL(0x9cb5718e,0x97d5ba56),LL(0x2f995393,0xcbad24ec),LL(0x61203303,0x6236a268),LL(0x6589a4be,0xe4bafc33),LL(0x5e23fa82,0x6cba7718), LL(0x4583e65a,0x8ccbc577),LL(0x4bc2f415,0xe5d88bca),LL(0x41df8dd1,0xe6bc2d58),LL(0x14d31fcd,0xec24e1d9),LL(0xfc26010b,0xacaaf13e),LL(0xe01b92f3,0x7e1da447),
+ LL(0x899ef333,0x6f6a6104),LL(0x39067165,0x95496f6d),LL(0xb51989e5,0x42fd9a6a),LL(0x68f5b168,0x1b60ce0f),LL(0x56f7fe67,0x97324d87),LL(0x676815a8,0x443812f7), LL(0x685a7260,0x265ee994),LL(0x6c6515f0,0x342c7b2f),LL(0x34b4adb0,0xe9092323),LL(0x1e5a8d18,0xddcd233e),LL(0x5f4f6456,0x3dc5b27c),LL(0x7f421d9b,0x9664533a),
+ LL(0xff7543c0,0xc48bc829),LL(0x4d72bfaa,0xc0bda14c),LL(0x03be0af1,0x2f470ec7),LL(0x92d37eb4,0xc70f1e8e),LL(0x418f410f,0x08abdd98),LL(0x35386176,0xe38c74ab), LL(0x8c00426c,0x9c07cfdd),LL(0xa998f1ad,0xba74c310),LL(0xb7d2dda8,0x76b45140),LL(0x4948330e,0xa52b5e58),LL(0x8d8efb26,0x9b733234),LL(0x5d19a312,0x5d176373),
+ LL(0x987cf64a,0x43b58def),LL(0x3d4bcd4e,0xc95b16c6),LL(0xbcd9b923,0x5d1b1373),LL(0x522e052b,0xaf560542),LL(0x83800352,0xc2ff8f75),LL(0x7fe2a4ea,0x11723aa1), LL(0xe94bd9bd,0x28de7668),LL(0x874018a5,0x0ce80e0f),LL(0x8d43e726,0x0fe3755d),LL(0xf9b075c5,0xa78296ac),LL(0x82207423,0x76d58d98),LL(0x1db99205,0x5c5bc697),
+ LL(0xe3b7e746,0x583ee7df),LL(0xa4fab3a8,0x0b6659e4),LL(0x1946db5d,0x34ee0275),LL(0x1a12eeca,0x5ae3c0ba),LL(0x4ccb83e7,0x36756ed4),LL(0xa80eaf3a,0x973b0861), LL(0x6982ca90,0x969e38f4),LL(0x018d01fc,0x9a9bcd10),LL(0x3272476a,0xb540e953),LL(0x75ab7002,0xcf91dd0a),LL(0x39ceb983,0x2c7d363f),LL(0x974747c7,0x4369c221),
+ LL(0xf893a2ca,0xbfc40c30),LL(0x0623bad1,0xdf96980e),LL(0xc027511c,0x4fd7b54d),LL(0xcf3484ce,0xf4799284),LL(0x069beea5,0x655ab811),LL(0x7392e280,0x52588bc8), LL(0x4f0c17cb,0x522e7b40),LL(0xc705e9b2,0xc0d88aca),LL(0x77f3913f,0x9cf1b958),LL(0x7dd52514,0x3e06b926),LL(0x2908cbca,0x992e920e),LL(0x6d6ed529,0x13baced2),
+ LL(0x95ab4944,0x41c59b9c),LL(0xf32dcf4b,0xfacdd4fa),LL(0xef361bc3,0x6401bcb6),LL(0x697706ff,0x8d1fbbf7),LL(0x12fafc26,0xa9dcd2cd),LL(0xced1b64c,0xc1fce537), LL(0x06433b06,0x760b3eb2),LL(0xf6f894d2,0x53a27b08),LL(0x851c8bce,0xb50135cd),LL(0x0e058bf5,0x9bf9a243),LL(0xcc0a78ef,0x231624a6),LL(0xff090623,0x8200be42),
+ LL(0x67a470ce,0x5a0f6f6b),LL(0x7ccca885,0x7b8c2a88),LL(0x25f812da,0x4421fe13),LL(0xe0833478,0xc7a9c622),LL(0x94829d7c,0x6aff42db),LL(0x37d888fe,0x6fc2f23b), LL(0x64b75c84,0x9cfb8a14),LL(0x46139fee,0x56e1b7d4),LL(0xfe72fca5,0xcc6943b8),LL(0xc3d621cd,0x12e757e1),LL(0x72c1571a,0x6d9d63b0),LL(0x7b300fc6,0xa1fc3db1),
+ LL(0x393e37ca,0x7d58f7e6),LL(0x5e47e4c4,0x30290d9b),LL(0xa69dc1eb,0x831e5039),LL(0x5a758799,0xe2f42725),LL(0xc8f86525,0xe8166ff7),LL(0xaa85cc41,0x28e08f58), LL(0xe5409138,0x66be9bb7),LL(0xdcbb88ca,0x7d0f8807),LL(0xe7803e98,0x870cd794),LL(0xd59d39c6,0x78fd1eae),LL(0xcc0e56c0,0x1aabe0af),LL(0x5bf0f272,0x7f8de733),
+ LL(0xfdf88aba,0x36aa63d9),LL(0xcdf43217,0x87198fdc),LL(0xa9a923c9,0xd8fe6f62),LL(0xee2ae4ba,0x85c81a0e),LL(0x32dbcb0b,0x7c20dea0),LL(0x129a31c6,0x08baa938), LL(0xb1d60f99,0xa47b3003),LL(0x6905192e,0x31459993),LL(0x32cf2c7c,0x67e22899),LL(0x3b3c32bc,0x4c5f4375),LL(0xd499aa00,0x8de5d14d),LL(0xa311dac5,0x54875c3f),
+ LL(0x898dc5c7,0xb6475210),LL(0x080e62b4,0x0f709811),LL(0xbb3bffd9,0x8a0016a7),LL(0xafb97dc7,0xfc56d337),LL(0xca1b43d9,0xff911c89),LL(0x9187747a,0x9f8d40b7), LL(0x5700a9ea,0xf6ba5214),LL(0x8c04b9b7,0x7bc1c0e3),LL(0xa2c924d2,0x2dd3de09),LL(0x717b13cf,0x12378655),LL(0x6e9d0e85,0x090f2556),LL(0x88f728c3,0xf66a337d),
+ LL(0xe5140e1e,0x1f90b9b6),LL(0xea2d44e5,0x7ab77ce1),LL(0xf4878fcf,0xc8a3343e),LL(0xc544e407,0xbeb73f7c),LL(0xfec32a61,0xdb3a8266),LL(0x38db88f8,0xbe30a82e), LL(0x525080cc,0xf33ad1df),LL(0x1a553e27,0xf66aa44d),LL(0xa9b7b198,0x3194733f),LL(0xb4b9b4c1,0xd87c8145),LL(0x68883c51,0xca7cd392),LL(0xca49b152,0x2d12a779),
+ LL(0x2c4ffe71,0x407842b5),LL(0xc3f5593b,0xfa9a9143),LL(0x69f25d01,0x97f9f32a),LL(0x4571d150,0x78e3d5fd),LL(0x89878e86,0x8cbd1078),LL(0x633ed774,0xd4a4be53), LL(0xd65d0ef1,0x2e6cf7f0),LL(0x18a2e243,0x5cefa892),LL(0x130c9ba1,0xb2e8ccb6),LL(0xde1ec2f9,0xda209fc8),LL(0xb3448d09,0x64845a36),LL(0x92896b12,0xbde9ae0a),
+ LL(0xbfc6c637,0x8a46c911),LL(0xe4fa4fe6,0x8dc3d699),LL(0x5cf8e4c9,0xd4ba64f1),LL(0x01cb3488,0x01b3908a),LL(0x38bd7ded,0x69b1fa5d),LL(0x18b2eae1,0x92ad4838), LL(0xb33955b6,0x619324be),LL(0x5c8a6df7,0xc7f37335),LL(0x925b3f69,0xa397f42e),LL(0x5f7e4d11,0x32169a49),LL(0x8d0d9f01,0xc0fa9a54),LL(0x89d8f2e5,0xf52a1f22),
+},
+/* digit=38 base_pwr=2^190 */
+{
+ LL(0xba8e0a52,0x9c0d5231),LL(0x93e465d7,0x94d0509e),LL(0x98515454,0x67df90dd),LL(0x8dbfb46a,0x223e8b9c),LL(0x6d757ce3,0xf39529a3),LL(0xb4648296,0xffec9175), LL(0xf78aae7b,0x330749e8),LL(0x45f93cc3,0x19e55496),LL(0x94083aa8,0x8c320b34),LL(0x21e321c6,0x1161f5a3),LL(0xde3e7892,0x0980deed),LL(0x6ad76ccc,0x605aa919),
+ LL(0x180660f7,0x73fa3508),LL(0x2d24936f,0x4cae013e),LL(0x58493d98,0xf64a549f),LL(0xdc79f602,0xd9ceae0a),LL(0xd1512b84,0x6569e37b),LL(0x151c9151,0x11e4c022), LL(0xb55c5813,0x075678c2),LL(0x09d3cb16,0xb26cdb58),LL(0xa57fb969,0x6334dca3),LL(0x223dc3ce,0x0ed90820),LL(0xbd11e277,0x74f9c3ae),LL(0x79c0b8e2,0xaeefed36),
+ LL(0x2a24c385,0x0e2fc74c),LL(0x34679278,0x836a4740),LL(0x817e2c41,0x25518f16),LL(0xb4b7d3c1,0x8b573a8e),LL(0x4ab56adf,0x012797f9),LL(0xfa2ab690,0x9e0e56d0), LL(0x1c9f6f08,0x009ba1ee),LL(0x2f412e9e,0x8ebf4aac),LL(0x1cfb4e02,0xb143122a),LL(0xcbf2b783,0x988cf0ec),LL(0x57f5be97,0x44a7ed96),LL(0x51804147,0xbdcad872),
+ LL(0x2f9fbe67,0x378205de),LL(0x7f728e44,0xc4afcb83),LL(0x682e00f1,0xdbcec06c),LL(0x114d5423,0xf2a145c3),LL(0x7a52463e,0xa01d9874),LL(0x7d717b0a,0xfc0935b1), LL(0xd4d01f95,0x9653bc4f),LL(0x9560ad34,0x9aa83ea8),LL(0xaf8e3f3f,0xf77943dc),LL(0xe86fe16e,0x70774a10),LL(0xbf9ffdcf,0x6b62e6f1),LL(0x588745c9,0x8a72f39e),
+ LL(0xb1bafbc4,0xa96955b9),LL(0x646ece39,0x8dcb55a7),LL(0xeb00e541,0x2b62784f),LL(0x2693249b,0x462f9d7d),LL(0x794c189d,0x8b264697),LL(0x63354e69,0xded6ff55), LL(0xeed1089f,0x7c8ea441),LL(0x1462f461,0xe355f75c),LL(0x1210fd5b,0x87b691f6),LL(0x6983cb27,0x7291bffb),LL(0x92800095,0x9ed83afc),LL(0x1f24d923,0x307a3dc8),
+ LL(0xd7804b2f,0x7cec60ea),LL(0x45c11441,0x00644643),LL(0x769cd685,0x3c6de88b),LL(0xc7f01232,0x34709186),LL(0xedd2bd0d,0xd9eef41e),LL(0xe427faa9,0x3bafcccd), LL(0xc07e701a,0x33e5350e),LL(0xa87c1fd1,0x9cb2eb47),LL(0x0d5f5b28,0x9fa9a779),LL(0x07ea2e53,0xa2e7076b),LL(0x5c169cf4,0x72f4da32),LL(0x7e751588,0xb7f19294),
+ LL(0x32dd7a30,0x47eb1335),LL(0xa9db654d,0x9d058169),LL(0x6e7a2b1a,0x375c59df),LL(0x7a35f29f,0x55d37c67),LL(0x493c4cde,0xc78a3678),LL(0x8d83e31b,0xe5f0e2d6), LL(0xe9777bf9,0xf7927002),LL(0xa5afdfc7,0xdd559324),LL(0xb81c08cc,0x077c6c48),LL(0xaa2ef694,0xba1c98cc),LL(0x4c02dd46,0x06c6c954),LL(0x7dd3145e,0x211e50f3),
+ LL(0x06616d0d,0x2a5f8ecf),LL(0xc7deb373,0xca9b1cb8),LL(0xc59c4301,0x9de31ced),LL(0x0111d998,0x1e0f40b1),LL(0x960d5b95,0xd29d229f),LL(0xd1dabab8,0x10563249), LL(0xa05ecac9,0x7b225cc9),LL(0x78f3b8a0,0xb02e6896),LL(0xf5fb06b2,0x009b52a1),LL(0x842b9081,0x8a575d3f),LL(0xe9272512,0xfddb48af),LL(0x0b452cb7,0xd39b8f1d),
+ LL(0x67e09987,0x0d6b9c7c),LL(0x0761ad52,0x261a564d),LL(0x9f60925b,0xec462174),LL(0x18529b03,0x83ee0c12),LL(0xfbcfff74,0x72972467),LL(0x6abc4bfb,0x37fc074c), LL(0x54e65e89,0x8b6015bd),LL(0x991583cb,0xde8583eb),LL(0xb4d2c62a,0x379548e1),LL(0x9b24a5e5,0x88024a9a),LL(0xfc03abfc,0x633aa869),LL(0x8fa35283,0xa27657b9),
+ LL(0x61d9e770,0xde9703b4),LL(0xef4653ef,0x02d4091d),LL(0x576eb5e1,0xefd229aa),LL(0xf77eb987,0xc0b0b243),LL(0xeefe8f71,0xb11309b2),LL(0x68478044,0xfeeacf2f), LL(0x43ac3dd7,0x8dfd8e86),LL(0xb07f95c3,0xc0a24181),LL(0x24be161c,0x551ca096),LL(0xb098cdc3,0x6cb2c1d4),LL(0xe74f84f8,0xbfc74e9b),LL(0x067e3388,0xe58e14d9),
+ LL(0xf025baa6,0x9eca6f94),LL(0xbcf9c741,0xb2db0741),LL(0x90bb8f56,0xf8e2aab5),LL(0x08762829,0x47729032),LL(0xe2a266c8,0x067a0c5a),LL(0x71b7d7d0,0x22b104c7), LL(0x53e406db,0x4a48cd69),LL(0x24f0070b,0xb85e44d5),LL(0xe10133ff,0x6168262f),LL(0xe4874e8f,0xdfc02315),LL(0xca317e3b,0x20dba2d7),LL(0xe1d2c0c3,0x441c56d2),
+ LL(0x808dc4b1,0xae10069e),LL(0x8fb3ba73,0x64df30e1),LL(0x7ebaad0b,0xbbe4caf2),LL(0x3dd6119c,0x5907bf37),LL(0x9dfceefe,0x0a723dff),LL(0xf7cffc7e,0x59bff4dd), LL(0x6a6f43c2,0x7bc95fa2),LL(0x3ca0e2b3,0x9001d1d5),LL(0x27b3335b,0x316a7ecd),LL(0x7b8d7d49,0xbf08e672),LL(0xc619058f,0x4b209f93),LL(0x59d8f9ea,0x4c0ca01e),
+ LL(0xcae69c3b,0x18c452c4),LL(0xef0f00fa,0xf45690ac),LL(0x4f66a5cc,0x3b363aa0),LL(0x47718c52,0x9dd41c0a),LL(0x7e5cd370,0xfa219d7e),LL(0xb2196dfb,0x5d384db7), LL(0x90b4d46b,0x5e14749b),LL(0xd9db9481,0x55796656),LL(0xc8cf353e,0x3bf13d0a),LL(0xa95c485a,0xb89a28a6),LL(0x5da29783,0x568fa3d0),LL(0xd182b1a4,0x4aa008ee),
+ LL(0xb09fa8f3,0xf7e1ed3b),LL(0x1da5be9e,0xbb4fe6f7),LL(0xf4d1ba21,0xcbab0e01),LL(0x76a5f326,0xb7327410),LL(0x206092af,0xd94d2349),LL(0x728e0e4d,0x739f3cd0), LL(0xf81fd823,0x568644aa),LL(0x6110e2f6,0x510cff6b),LL(0x566c3598,0xef4cf1ac),LL(0x62aae69b,0x2c26f171),LL(0x8964a2a5,0x1e436046),LL(0x3e472c50,0x83c0bbf6),
+ LL(0xaabd965a,0x79c04804),LL(0x43d0b660,0x9581aab4),LL(0x5ba71d23,0x59bff003),LL(0xb6a0cd80,0x212ecd58),LL(0xbf1ea5d6,0x29bdcd33),LL(0x77a002e1,0x59fd2ff4), LL(0x8d9cd247,0x3c9d2130),LL(0xb1786da3,0x790e9dbc),LL(0x14464d04,0x967ee5e7),LL(0x2b5373af,0xd6f7ebbd),LL(0x39768d40,0x1c0b22d5),LL(0x913f6cc3,0xdfb54983),
+ LL(0x51b3f1ce,0x167ec88a),LL(0x420024c8,0x19756ee0),LL(0x3877e634,0x10f2e244),LL(0x03462cb3,0x6321bf26),LL(0x9d3afcee,0x1dbd10ee),LL(0x2ca17dcd,0x0726f5f2), LL(0x0bacf018,0x09465266),LL(0xe1feb969,0xc92a9f2d),LL(0x5e1c5912,0x0043b0f9),LL(0x757d3a63,0xa09b94d1),LL(0x9fdef1e0,0x53395652),LL(0xd4fedd41,0x9826886c),
+},
+/* digit=39 base_pwr=2^195 */
+{
+ LL(0xec65b53e,0x2e75a26e),LL(0x70552fb3,0xfeb630b2),LL(0xee7d8e4a,0x53dfd057),LL(0x8994f449,0xb959110d),LL(0xbb538367,0xb4a16596),LL(0xef82f29c,0xa70917bd), LL(0x43bba6ae,0x5a764300),LL(0xcfbc194a,0xee207476),LL(0x03a4184b,0xc7eab238),LL(0x0f7fcd62,0x60c67ef2),LL(0xdfa8a0c6,0x41e05799),LL(0x04d352b0,0x5d7d05e6),
+ LL(0x436b59f5,0xc97c01eb),LL(0xef1848ab,0x1d15aca7),LL(0x7fa7d3c2,0xdba1ce80),LL(0x81060874,0x69e6f96e),LL(0x4d7eeead,0x6e3e0df7),LL(0xb0c87f3d,0x8a3b5e85), LL(0xc8a23914,0xc55ae3db),LL(0xbf6d27d9,0x5cdc2a92),LL(0x1de7860a,0xa6008c59),LL(0x6e546731,0x8202f8b6),LL(0xaa1e45d4,0x652f2d07),LL(0x6df5415a,0x146f214f),
+ LL(0x651ed62d,0x4b01246a),LL(0x0b9eb006,0x9f6824a3),LL(0xba95697f,0x763ae8fe),LL(0xefe2182e,0xeff4f88d),LL(0x74ba79b4,0x2c2ef50c),LL(0x1d23d649,0x319df6c9), LL(0xf6c273a8,0x481f9faf),LL(0x9706dc07,0xe7156457),LL(0x424d5cb9,0x06f0617a),LL(0xa8ad220a,0x6d6b5d8b),LL(0xa2bd8c40,0xa485ca14),LL(0x54cb54f6,0x7a7a15bf),
+ LL(0xce5fb4d9,0x041c706c),LL(0xb22a79a7,0xddc78cb3),LL(0x839e9d5a,0x7dc4cd27),LL(0xbf3c4c06,0xdfc9db83),LL(0x38b7bd22,0x85b80941),LL(0xd0f4c2da,0x1007dea2), LL(0xc633fba0,0xd7b34006),LL(0x4476e55f,0xa8880acf),LL(0x75236685,0xa340b2c2),LL(0x0113a85f,0x5ddd0551),LL(0x9cb32704,0x7dfc7ab2),LL(0xdabf22ff,0x9a334a33),
+ LL(0x7e546950,0xa8261c31),LL(0x26706dc1,0x89d19cae),LL(0xedc9af36,0xf8dbf6ca),LL(0x7e446207,0xda79fe4e),LL(0x81cee38d,0x8bbc3195),LL(0xb5be9577,0x9d121e9c), LL(0xcddb5a61,0xdb3fff88),LL(0x3ee86665,0x751cad15),LL(0x3d07abad,0x5c0986df),LL(0x83fe8451,0xf77489b3),LL(0xf90d3e94,0x3546c5a9),LL(0xd8a694b7,0x1ec54bd1),
+ LL(0xd7d1146b,0x2fbce9be),LL(0xb3980bd2,0xcec9e5d8),LL(0x9f4cbaf0,0x48ea4593),LL(0x2574a3bd,0x56c54009),LL(0xe792c39a,0x84a39630),LL(0xeef81343,0xe5c690f8), LL(0x17655bc9,0xf996760f),LL(0x6c0c191c,0x6009c215),LL(0x966d7027,0xa0ca12e6),LL(0x2e6f7c63,0x92a6d5d5),LL(0x9bd13ead,0x46809d26),LL(0x67aac681,0x3c11fa79),
+ LL(0xea8edc01,0xca2876f9),LL(0x28d411c8,0x85c1a4ac),LL(0xfb0299a8,0x4d5fca4c),LL(0x17fe8b37,0xa1df6c5a),LL(0xcc062556,0x2ffb3570),LL(0x465ef78f,0x4c59773e), LL(0xb3601ca5,0xea3e39ae),LL(0xb7d30864,0x9806345f),LL(0xe6600e5d,0x428fe41f),LL(0x067a59c0,0x19bd665d),LL(0x908cdb52,0xbd6b8272),LL(0x0b2707d8,0xb6025028),
+ LL(0xabe2cc87,0x3fc9b3cf),LL(0x514e77fe,0xfd8d64e3),LL(0xfe1ad535,0x2003a58a),LL(0xcb39149f,0xcec4be38),LL(0xbdedf470,0x4d578c99),LL(0x3a356519,0xcd35d7a3), LL(0x8b078d6b,0x7a762f27),LL(0x31ae2701,0x3b6891ed),LL(0x270c508e,0xdc0e817f),LL(0x9fdb29c8,0x5a7be204),LL(0xcb2711d3,0xfa1a0be3),LL(0x3786a0c2,0x5865f55f),
+ LL(0x23bd1613,0x5f5db9af),LL(0xcfd5bc16,0x0071d2c4),LL(0x81adfd03,0x273d7ad1),LL(0xa0570ffa,0x683508f4),LL(0x611a75fc,0xa49f5c08),LL(0x8fbcfbb1,0xfca5bd12), LL(0x2a4fc49c,0x7eabb339),LL(0xad6e6d32,0xdc5fae69),LL(0xe0b03dce,0x2e599c43),LL(0x7ca7250c,0xf4ad8d3e),LL(0xedeee0fe,0x626c1f7e),LL(0xaab0b3f0,0x2296376f),
+ LL(0x2f641cff,0x1d0af6b5),LL(0x3648c4a0,0xa932adeb),LL(0xb1ea8fc4,0x67641951),LL(0xb1fae482,0xc0b90064),LL(0x6623477b,0x7012642f),LL(0x5bf019ce,0x1cddc024), LL(0xc2c32737,0xca1f4675),LL(0x97d6b18c,0x11525a5e),LL(0xd3868de9,0x9c034ef2),LL(0x044e0c18,0x0533d921),LL(0xcb5e38c3,0xba6cf14e),LL(0x509d7053,0x438309f3),
+ LL(0x790b3f68,0x0b82b506),LL(0x12c1f59d,0x75b38ef1),LL(0x4dbdd80b,0x6bc1e007),LL(0xd13bb11c,0xf81480db),LL(0x17259091,0x25131887),LL(0xc61dde4e,0xc5c8823e), LL(0x9b2736d1,0x0ddb06a0),LL(0xa785e570,0x64dfb1fe),LL(0xcc593359,0x6f8f9945),LL(0xd186352c,0xe8e457a9),LL(0x7c342abc,0x389479b6),LL(0x4cc71b3b,0xc73ddfee),
+ LL(0xc4ff9f0b,0xe164268e),LL(0xe6c36e63,0x6c8e9349),LL(0x78ab17f3,0x734f9794),LL(0x0179ed0e,0x46d468de),LL(0xdfa26867,0x7e68f006),LL(0xe3d0485d,0xe4d4a85d), LL(0xf84c0f8f,0x0913a1d7),LL(0x25a9c9cd,0x4095c8c0),LL(0x49eadd08,0xeeb1a79e),LL(0x7dd8f954,0x433f5e41),LL(0x30bb26d0,0x70a62814),LL(0xff5e8e29,0xad94d8f6),
+ LL(0x5652a3c0,0x0b614a64),LL(0x34597010,0x89279185),LL(0x810a812f,0x06c97f68),LL(0xbe358e91,0x566120f4),LL(0xc044ff3c,0xcb1f8b75),LL(0x7d1a468b,0x77b3b0b0), LL(0x7d49aad9,0x37a72862),LL(0x8646efd4,0x3ada117b),LL(0x21bac6d0,0xd8626c0d),LL(0xdd2c980c,0x2263d74c),LL(0xfd1b6bda,0x8afd14c0),LL(0xcae64c0b,0x693742cb),
+ LL(0x9e32c0a4,0x6a352b57),LL(0x77ec7a40,0x5274a082),LL(0x240e6dc5,0xee1f7c7a),LL(0xd313b4a9,0x85d5be62),LL(0x5c01a405,0x1522c5d2),LL(0x960afd5a,0xcfa08aab), LL(0x8e8a93dc,0xa3cb77f3),LL(0x6d1c98c7,0xaacb1676),LL(0x3b93fa9d,0x84090c7d),LL(0x3c0383ad,0xc77f1ee1),LL(0x76f7a220,0x461c93b7),LL(0x04ac0bfc,0x66d63a1d),
+ LL(0xd2343e0b,0x3d1904c6),LL(0x775f877f,0x8ce038f7),LL(0xd797f231,0xa9d4dce1),LL(0x16c08c2f,0xb6712aa7),LL(0x335ad61a,0x5045b87a),LL(0x7115bb4b,0x44a251fb), LL(0xe66511bc,0x2363cf68),LL(0x81cc48f3,0xed8ab553),LL(0x725c6bae,0x8bf71687),LL(0xc23ab12c,0x16e0d015),LL(0x21f333c0,0xfbdcc064),LL(0x62c9f01d,0xe73df709),
+ LL(0x4751207f,0x3c7d6b64),LL(0xe440c1a2,0x65e1f96a),LL(0xaa0eaa1e,0x8ed15d20),LL(0xc0eab490,0xe944ad2f),LL(0xf6d9f260,0x71525aa1),LL(0x16146ba3,0x5cd14c88), LL(0x14a41275,0xf9401908),LL(0x2288618d,0x3bb7ea74),LL(0xcab1060a,0x6a4e1c37),LL(0xc8cac96f,0x357fe4d0),LL(0x6a2466ec,0x97a8b8ab),LL(0x9c01be70,0xb6e83fdb),
+},
+/* digit=40 base_pwr=2^200 */
+{
+ LL(0x2a7aeced,0x5b0b5d69),LL(0x01dc545f,0x4c03450c),LL(0x404a3458,0x72ad0a4a),LL(0x9f467b60,0x1de8e255),LL(0x90634809,0xa4b35705),LL(0x706f0178,0x76f30205), LL(0x4454f0e5,0x588d21ab),LL(0x64134928,0xd22df549),LL(0x241bcd90,0xf4e7e73d),LL(0x2facc7cc,0xb8d8a1d2),LL(0x1d25d2a0,0x483c35a7),LL(0x1ef9f608,0x7f8d2545),
+ LL(0x22ec7edd,0xa7040160),LL(0xcc9c8ee8,0x19124972),LL(0x2ccb9417,0x697f301f),LL(0x6f00d8aa,0x3ee87764),LL(0x8138a017,0x2b5afaf8),LL(0x832d7543,0xf152b14c), LL(0x383052f9,0x27c27ce2),LL(0xe1dae11b,0x4746c5b5),LL(0x5b752008,0x92dc5ac7),LL(0xe84fe5f1,0xcf382e01),LL(0x7d5929ce,0x90e03419),LL(0x15ca3ffa,0xafee3abb),
+ LL(0x54ebc926,0xcb51f039),LL(0xb8d4a7bb,0xe235d356),LL(0xb41fe1a6,0x93c8fafa),LL(0xa719f254,0x6297701d),LL(0x644f5cde,0x6e9165bc),LL(0x0c11c542,0x6506329d), LL(0xa92b4250,0xa2564809),LL(0x889c2e3e,0x0e9ac173),LL(0x22b1d1be,0x286a5926),LL(0x6ecdd041,0x86a3d752),LL(0x649f9524,0x4b867e0a),LL(0x0629cb0f,0x1fe7d95a),
+ LL(0x1c6d03b0,0x11dd860e),LL(0x09eec660,0x30c17008),LL(0x35c0192f,0xd4f8aff6),LL(0xe3a4a900,0x96a727b1),LL(0xde78c8ba,0x1426daff),LL(0x8d1527c4,0xfacaa9bd), LL(0xcd072989,0x0c0d5234),LL(0x918550b5,0x1936c20d),LL(0x3d914fb3,0x4828bee4),LL(0xf3ba26a6,0x8324ea38),LL(0xa94eb26f,0x027590f3),LL(0xacd957bf,0xfd354295),
+ LL(0xca5baf54,0xf4f66843),LL(0xefe7db78,0x298db357),LL(0x7365712f,0xf607e86e),LL(0x8a822bc0,0xd5882298),LL(0xc61299b3,0x2cfbd63a),LL(0x67167b1a,0x6f713d9b), LL(0xde0b077a,0x750f673f),LL(0xee2178da,0x07482708),LL(0x69123c75,0x5e6d5bd1),LL(0xeab99b37,0x6a93d1b6),LL(0x8caec6a3,0x6ef4f7e6),LL(0xcf3ed818,0x7be411d6),
+ LL(0x3dfb423c,0x959353be),LL(0x36d41cc8,0x8458e858),LL(0x99d7a4f4,0x6a4826f7),LL(0x52fe4b65,0xab146ece),LL(0x35038573,0x94fc21d7),LL(0xf4d56e84,0x26f50135), LL(0x3162d92d,0xe15ca04d),LL(0x34ed4e84,0x8f652fcd),LL(0x4f21a910,0xef7e7924),LL(0xdcc76132,0x2eecb7e9),LL(0xdbe89048,0x5b484745),LL(0x6e43a2c5,0xbf8c490f),
+ LL(0x63a0a7d2,0xf92b3073),LL(0x881dc8cf,0x32da431c),LL(0xc578e3a3,0xe51bd5ed),LL(0x9587fa22,0xefda70d2),LL(0x9b2eba85,0xcfec1708),LL(0xaf7ba530,0x6ab51a4b), LL(0x98174812,0x5ac155ae),LL(0xccb076e3,0xcaf07a71),LL(0xc38718a7,0x280e86c2),LL(0xd63745b7,0x9d12de73),LL(0xbf8a79aa,0x0e8ea855),LL(0xbd705bf7,0x5eb2bed8),
+ LL(0xda756624,0x3ede2484),LL(0x73b13062,0xb22da2ab),LL(0x962a667b,0x56069e93),LL(0x130f2cea,0xc931266b),LL(0xa7366a66,0x4bd6a6fc),LL(0xaa5ac3b1,0x23f30563), LL(0xd7c2b26f,0xa025d0ef),LL(0x62129bc7,0x597ce7d8),LL(0x2b3057f2,0x4809927f),LL(0x1499f884,0xb001c10a),LL(0x30b9a653,0x309d141c),LL(0xbf659d05,0xadddce7d),
+ LL(0xae16de53,0x33fe9578),LL(0x10bec902,0x3ae85eb5),LL(0x44af850e,0xc4f49658),LL(0x087dd658,0x6ea222b3),LL(0xa51f1447,0xb255e6fd),LL(0x117e3f48,0xb35e4997), LL(0x05616ca1,0x562e813b),LL(0x8a61e156,0xdf5925d6),LL(0x571c728b,0xb2fa8125),LL(0xa2f2d1cf,0x00864805),LL(0x1bccb6ff,0x2dc26f41),LL(0x63ae37dd,0xebd5e093),
+ LL(0x9303b5b0,0xe448127c),LL(0x7a74ec27,0x6ac65681),LL(0x86f0e7ec,0x05128a52),LL(0x7603a73c,0x9d9f32c1),LL(0x556c51ea,0xb5a799bf),LL(0xa9a9a416,0xea94f169), LL(0xaebde511,0xebb3e549),LL(0xf9cccd3f,0x9037046a),LL(0xf08a8254,0x2a9343a8),LL(0xd40c7f26,0xc5cc43f6),LL(0xb39677d2,0xe1146cdc),LL(0xbe66d4b6,0x6cbfec8b),
+ LL(0x0a285611,0xd2d68bb3),LL(0xdc8378f2,0x3eae7596),LL(0x6cc688a3,0x2dc6ccc6),LL(0x011f5dfb,0xc45e5713),LL(0x62d34487,0x6b9c4f6c),LL(0x1fc65551,0xfad6f077), LL(0x62b23b52,0x5e3266e0),LL(0xe98f4715,0xf1daf319),LL(0x3ed0ae83,0x064d12ea),LL(0x564125cb,0x5ccf9326),LL(0xc63c1e9f,0x09057022),LL(0xdc9b5d2e,0x7171972c),
+ LL(0xb0a219fd,0x10867369),LL(0x5ab56581,0xe7efac97),LL(0x7813f6f5,0xde3372e8),LL(0x1d4b8ed3,0x3bbe5977),LL(0x53376573,0xf17f61e5),LL(0x97964b90,0xf719d06d), LL(0xb24d2e4a,0xb1e8c483),LL(0x184379eb,0x53709647),LL(0x8a8fcb83,0xb739eb82),LL(0x60163017,0x5d2f3a4d),LL(0xf823b4af,0xccedf4f4),LL(0xff315eae,0xa6e166a1),
+ LL(0xeabd21b2,0x2364fd9a),LL(0x9174ad6d,0x3ce5f4bb),LL(0xb38688c0,0xa4d6d5d0),LL(0x6d87fd7d,0x2292a2d2),LL(0x4ca02e54,0x2a7d1b53),LL(0xb4185715,0x7bee6e7e), LL(0x8fc63acd,0x73e54609),LL(0x4064e09d,0xf4d93a12),LL(0x2b92daa5,0xd20e157a),LL(0xc4b81a00,0x90d125db),LL(0x7682de13,0xcb951c9e),LL(0x27987545,0x1abe58f4),
+ LL(0xe1c01fab,0x76452ac1),LL(0x6bd32f0c,0x167d7326),LL(0x4a283a42,0x72d209c1),LL(0x48ea0ba9,0xd26859b6),LL(0x6369309b,0x7b3e5c46),LL(0x93c9a0b9,0x474a9625), LL(0xc76e25dc,0x676ea3e4),LL(0x71400c71,0xb0c9ccf7),LL(0x36f83518,0xc4295870),LL(0x267f0c25,0xb86c1b39),LL(0x28884a80,0x8a3e3524),LL(0x43ba8e28,0xea182c45),
+ LL(0x30c70c8d,0x6d351640),LL(0xce2361b8,0x8047d811),LL(0xdf8e2c81,0x3f8b3d4f),LL(0x33fa1f6c,0x5d595477),LL(0xe29b8a91,0xf769fe5a),LL(0xd737b2a2,0x26f0e606), LL(0xb8b31c6a,0x70cbfa5d),LL(0x863d3aea,0x0f883b4a),LL(0xe386ae2f,0x156a4479),LL(0xade8a684,0xa17a2fcd),LL(0xe2a7e335,0x78bdf958),LL(0x3b9e3041,0xd1b4e673),
+ LL(0xaf2825c1,0xa6c32900),LL(0xd223a04e,0xb37c46c1),LL(0x063de7ea,0x691e7d39),LL(0x10daf9bd,0x998df4e7),LL(0x718b5d7a,0xc7085b9e),LL(0x16b3d4b8,0xd41abcc8), LL(0xf9bc4041,0x4dfce693),LL(0x659ec7a8,0x383677ed),LL(0x4491fb34,0x2c1904bf),LL(0x4552451c,0x7c1bf111),LL(0x3c5e5e40,0x6562cc2c),LL(0xfe0e4372,0x1ecaa2a1),
+},
+/* digit=41 base_pwr=2^205 */
+{
+ LL(0xf3087bc8,0x84c3630b),LL(0x74be6e26,0x152691e6),LL(0xf61af001,0x5abd125f),LL(0xbfea3525,0x69bca56f),LL(0x00e0cb6e,0x384af199),LL(0xd00475a6,0xb0b13cfe), LL(0x5e394049,0xedafde49),LL(0xdaf2add6,0xd988b558),LL(0x6c8ffcc9,0xf14cf97a),LL(0xe5a9cc5c,0x4d6cec23),LL(0x8a104e05,0xb0d678f8),LL(0x9fb527c1,0x80a7fcba),
+ LL(0xc22137d2,0x0d6cadbf),LL(0x628a3298,0xb5db59d3),LL(0x4ab19507,0x3b433c73),LL(0x660086b3,0x4fc53405),LL(0xa1eb0f43,0x770ae903),LL(0xf6b5b58d,0x31b5857e), LL(0xd392868e,0xe206e141),LL(0x4b31de04,0x8be6956f),LL(0x47449e07,0xcfbfca2f),LL(0x39fef8e1,0xebaef256),LL(0xc16fc80c,0x959e37b8),LL(0xe911d61b,0x8bb4bdd2),
+ LL(0x4343bbf8,0xc483d4b2),LL(0x8a0fc95e,0x42aca2e1),LL(0xcbab1fb0,0x5165df6f),LL(0xf6cdfc0c,0xeb284370),LL(0x994320fc,0xab565c00),LL(0x62133e80,0xc0d157fd), LL(0x5b69644a,0x7850cda5),LL(0x806ec8b8,0xe37ae76a),LL(0xc2c82edd,0xd14b805c),LL(0xcf244539,0xcb5468b6),LL(0x25dbe92d,0x97d43ee8),LL(0x89fb8f1e,0x14422436),
+ LL(0xa0a85236,0xd7bf2ac6),LL(0x7194c46d,0x2921b55c),LL(0x9afa9762,0x162fabaa),LL(0xb62b36ab,0x7b7f1664),LL(0x296a84e9,0x77b9f797),LL(0x7dbd843d,0xfcc1ad65), LL(0xcd77b7f6,0xc6e9c1e1),LL(0x917067c9,0x9cf0e272),LL(0x3bfa90bf,0xfa7fa93d),LL(0xd050e46a,0x55846fe9),LL(0x35c56256,0x473b9a0d),LL(0x2b656a65,0xadd29e33),
+ LL(0xebc69b0b,0x926c2552),LL(0xd4c7432e,0x953a850f),LL(0xb9359035,0x0ee85e14),LL(0xbde090a5,0x8b10b01a),LL(0xec423943,0xb2878dca),LL(0xf70bde20,0x2571a178), LL(0xf5ebeee5,0x24ed159a),LL(0x043f6539,0x60c202af),LL(0xc8d4ffc3,0xdaaa76f4),LL(0x06eda10f,0x2fc1f1ba),LL(0x88ded556,0xddf159ee),LL(0xe67b1ec4,0xcfa71782),
+ LL(0xd5d826b0,0x31521f66),LL(0x40787844,0x0a636952),LL(0x9c8f934e,0xc0a3bd05),LL(0x2f0ce835,0x12c57dd4),LL(0x67064213,0x847f6a99),LL(0xa88bd71a,0x1c9e1a7a), LL(0x171e8407,0xc4060eb2),LL(0xed106780,0xdf78d8df),LL(0x0d704729,0xa3d28ceb),LL(0x46ca3912,0x4f8e5232),LL(0x017791f4,0x09e9f852),LL(0x1e6ea97d,0x59400663),
+ LL(0x83939224,0x547b0d95),LL(0x1e026769,0x3a0823ff),LL(0x25bd43ac,0x60166715),LL(0x18ba5f64,0xb6cf475e),LL(0xc8b6d09d,0xa22f9c92),LL(0x3ccf50ab,0x73055368), LL(0xee6deefe,0xa6de248e),LL(0xacc3ca20,0x32aaf8b2),LL(0xad44e674,0x0e254c5b),LL(0x35f95f98,0x8aa73e65),LL(0x60a2dc1e,0xe6226001),LL(0x9109020a,0xdf948210),
+ LL(0x2893f2f7,0x372798f0),LL(0x9e5030ca,0x4f62bfac),LL(0x8a1e2567,0x5e64f9a9),LL(0xe70391c8,0x5870254c),LL(0x41f02458,0x2def81a3),LL(0x1d087bed,0x25d4e4dc), LL(0x4fe24a13,0x3557d07d),LL(0xdc3112bc,0x6da49186),LL(0x5f73ba50,0x08c8c567),LL(0x9c7c6706,0x5309050b),LL(0xbd985072,0x2ab67da3),LL(0xe5df4e96,0x9bafa8b1),
+ LL(0x5c02f173,0x3ac66289),LL(0x76d566e5,0x6a110e38),LL(0xb9577e26,0xd9cc14e2),LL(0xfdfe617e,0x6f3d5df9),LL(0x352bb2ca,0x8fac740f),LL(0xc28e6310,0x50bc8a0c), LL(0x77ac93f7,0x6e572fc4),LL(0x605bb8e9,0x56277377),LL(0x402b8c55,0xad6d0637),LL(0x4509eda7,0xdab37791),LL(0x0854e91b,0xae770abc),LL(0x742b3de8,0x523bd278),
+ LL(0x17fecb90,0xc2cbd644),LL(0xb32dffdb,0x61616eb3),LL(0x9f5d2095,0xdc4485a2),LL(0x6553371b,0xf7891124),LL(0xbf9b20af,0x4f06ba18),LL(0x1a2c4df1,0x136d4f29), LL(0xfb8b685f,0xc04aca34),LL(0xf2b657bb,0xeec83c20),LL(0x5925a36a,0x4da5d70a),LL(0x72ff2965,0x80608741),LL(0x9f352620,0x2e0dd9ff),LL(0x46d1a7a8,0x5f0afa67),
+ LL(0xf46aace5,0xa995a95b),LL(0x9eaa630a,0x44ede537),LL(0x00336e3b,0x421f3b35),LL(0xcf47c9ed,0xbf897478),LL(0x259e0827,0xf360ae32),LL(0x2e6a9f6b,0x04e0e3e8), LL(0xa9136702,0xb26eae5f),LL(0x853674b4,0xd6cb15a1),LL(0x748bcbc9,0xf81276e2),LL(0x0a4ca1d7,0x7fc02e22),LL(0xcd82f330,0xf650f48e),LL(0xabaa8859,0xf4ea7c1d),
+ LL(0x95c746ec,0x1ccd44ff),LL(0x10405763,0xe18914b5),LL(0x21a3a927,0x50ed6443),LL(0x43ef8e8f,0x4f96a1b1),LL(0x77952bf8,0x7f5645e5),LL(0x66dbdf15,0x4bc5c7ab), LL(0x23930a08,0xacc16126),LL(0x504cf9b6,0xbf5ed482),LL(0xd71ecbd7,0xdeb7a798),LL(0x4a4dd859,0xf62e63b1),LL(0xdaf714d9,0x668809a7),LL(0xf3a4329e,0xdd836382),
+ LL(0xc48f3ad5,0x894bdbd9),LL(0x09e167f6,0x687ff8de),LL(0x30371c43,0xf06104a9),LL(0xce84dd10,0x82fd34b7),LL(0x66ce5abd,0xae122deb),LL(0xfc4a90b2,0x31f041d2), LL(0x9a01c607,0x2589535c),LL(0x695bd7ab,0x231bcc85),LL(0x62e3a31d,0xc67c3062),LL(0x7af3e186,0x31be4475),LL(0x88efa7f1,0x1a2077a3),LL(0x815fad1a,0xffe53e22),
+ LL(0x66229776,0xdd155913),LL(0xf7882064,0x84093730),LL(0xe50ee337,0x6dddcb14),LL(0x7a1f7e81,0xa8e6ec59),LL(0xf3738a6a,0x8467f998),LL(0xad3f1840,0x70fcc6bc), LL(0x723b3f4b,0xf82eb4be),LL(0x06beec1b,0xf0f39354),LL(0x7ddcb539,0x1b181ea3),LL(0xad6a81b9,0x9c82c4fa),LL(0x5c612c2b,0xcc5ea543),LL(0xbb258d6f,0x63ce7571),
+ LL(0x0b96547f,0x1b588855),LL(0x65d1a59d,0x4539c9c0),LL(0x26e15084,0xd6c95fea),LL(0x86b96242,0xf84ad9e2),LL(0x451a5486,0x92f57d6d),LL(0x06a9e87e,0x0215cfcb), LL(0xf66e46f3,0xe05b10ea),LL(0x655a0642,0xe7b0e72f),LL(0x7b117f43,0x03503267),LL(0x779ea4a1,0xf5b78105),LL(0xa4adac77,0x28ee00fa),LL(0x6a93a2b1,0x1ea67d71),
+ LL(0x26882c6c,0x7be81fb1),LL(0xecd25498,0xe2d5a251),LL(0x7a8d1678,0xbb3d40e2),LL(0xd520811e,0x1806c67a),LL(0x86f65d23,0xadd4bb66),LL(0xe20e23d7,0x3a62b1b3), LL(0x6548b3eb,0x208b4700),LL(0xb7ec2809,0x0497f09a),LL(0x121c37e2,0xbd3964f8),LL(0xa598efbb,0xd35ef301),LL(0xc5eef966,0xbd76a276),LL(0x0af64e46,0x64700a7f),
+},
+/* digit=42 base_pwr=2^210 */
+{
+ LL(0xd3812087,0x169474a2),LL(0x6698ca7a,0x9de300da),LL(0x2ede425b,0x8589de92),LL(0x6df8a890,0x50e03fea),LL(0x4ba8b8e3,0x0d8a5c1c),LL(0x3fffb91a,0xf273aa67), LL(0x75fc8236,0x21cf0544),LL(0x9799c242,0x6ceafacf),LL(0xd0962c81,0xc3237eae),LL(0x213f6004,0x43d6ac34),LL(0xd4148b6b,0x45e619b2),LL(0xea5fb80a,0xfafa18b5),
+ LL(0x2f063b51,0x9a8580aa),LL(0x1c216613,0xa83c8ff7),LL(0xbe07f781,0xb4da0970),LL(0x712f7b7c,0x0ac2a260),LL(0x436a7b97,0xc9b8ee84),LL(0x11fb2f62,0xd758c20d), LL(0xf170b799,0x5daabed9),LL(0xc46bc387,0x018d2fdd),LL(0xd96cfb8e,0x82d6b5b7),LL(0x44d9e843,0x4d7d0d93),LL(0x91e7da3c,0xfa2a9ea9),LL(0xd531b253,0x8230c1a3),
+ LL(0x5ec31754,0x82412f52),LL(0x9d32e890,0x42f462c8),LL(0xce897ff2,0x1e7b58ce),LL(0x41164628,0xcfef7852),LL(0xd8bb22ef,0x34ee0422),LL(0x7d32f01b,0x6e0d44ac), LL(0x5a3cc196,0x96825165),LL(0x99eb23d3,0xa26724dc),LL(0xa75f7252,0xdb575faf),LL(0x62a3e5b1,0x778e3330),LL(0x84cccc80,0x8689884e),LL(0xb645502d,0x9883cd19),
+ LL(0x34220e26,0x4cc41f28),LL(0xa49749c4,0xb5937c6d),LL(0x0fa1ca24,0x70536664),LL(0x91e5edaf,0xeeb40f3b),LL(0xf1d3de14,0xcdf98235),LL(0xff018c43,0xa65e5b7e), LL(0xacee3a6e,0xaa3228e7),LL(0xe08f4ff1,0xb63a6289),LL(0x650b2daa,0x90e90425),LL(0x6d875f17,0xe4a8cad2),LL(0x9ce8a46e,0xc212029c),LL(0x5ed7cfb5,0xce051283),
+ LL(0x59b79436,0xb0df2261),LL(0xa195be26,0x82bd0daf),LL(0x3398c317,0xbc99a94b),LL(0x3c96ee31,0xbeb44c90),LL(0x664d2e46,0x3c39ad81),LL(0x0a3e0585,0x08178752), LL(0x413e269a,0x9a054b6b),LL(0x98c3b62e,0xbe58891d),LL(0xe5734974,0xe7fa4c4d),LL(0xd0a846a8,0x8ac535f4),LL(0xa651339c,0xea0f95f1),LL(0xd96aa239,0xa255274f),
+ LL(0x9534047e,0xe23b7b22),LL(0x3a3bd625,0xbd70aea8),LL(0x238db60b,0xf44b05fe),LL(0x0293abcf,0x9c46fb14),LL(0xbfd8875b,0x12cab5d3),LL(0x12dd0c65,0x1f38d4aa), LL(0x2adf9805,0x4bed4157),LL(0x8a56609d,0x3f87da92),LL(0xda02c903,0x10b93363),LL(0x21ce4786,0x7ecc7266),LL(0x1e3da5bf,0x8ae36685),LL(0xd3edee12,0x196040ff),
+ LL(0xe81508e8,0x4805841f),LL(0xa4808642,0xe2a578d3),LL(0xcd0b2555,0x6bbf10ac),LL(0xaf5cde28,0xc5071eff),LL(0x9a7124a9,0x665e7543),LL(0xc1437981,0x157c11ed), LL(0x7aeddd8b,0x2019367d),LL(0x386e3b8a,0x74a1e104),LL(0xfbe09a42,0xe72d429b),LL(0x061b862e,0xaca96fd9),LL(0x122595f8,0xbb2d2bc8),LL(0xc509d644,0xc90c6503),
+ LL(0xcff05ada,0xadb5966f),LL(0x5c57284e,0x8ed26c02),LL(0x44693a95,0xa76e73e2),LL(0x5982bbd3,0x14da7435),LL(0x5d2ca132,0x46e982cd),LL(0x24938e76,0x8f390740), LL(0x0a89b09a,0x749206b3),LL(0x93b4a1e5,0x429653c7),LL(0x7025bb7c,0xbee3d156),LL(0x19555c9e,0xe23f0e1e),LL(0x751639ba,0x0dec3837),LL(0x05d43bd0,0xb36cb844),
+ LL(0x74f90b6e,0xae76a96e),LL(0x24c6789c,0x5fa8e948),LL(0x03abbb81,0x2b3584bb),LL(0x5c451f72,0xe19ce47c),LL(0xd619ac7a,0x35792fba),LL(0x50059bf4,0xfa0282a2), LL(0xdabe692f,0x562bfd14),LL(0x47eeb6c2,0x1aaf542c),LL(0x045d0360,0x392d5bba),LL(0xd80fe998,0x4e7bb31b),LL(0x1111e14d,0x08f62ef3),LL(0x4e9ee1b8,0x4de917b0),
+ LL(0x67166271,0x8b9d2d58),LL(0x142bab7c,0x658db4ea),LL(0xa4ad2849,0xdf84932f),LL(0x5f6f86a7,0x04b11335),LL(0x50cfcea7,0x2de6b29c),LL(0x9be6a3a3,0x46d8f68a), LL(0xaf0204af,0xfb88cda7),LL(0x26029d72,0x3ece4491),LL(0x3f946dfd,0x69fef1e2),LL(0x01ef7bb5,0x708532fb),LL(0xeb3795a2,0x78d5053d),LL(0x6b36d57b,0x819a6320),
+ LL(0xe509d19e,0xca07e0c1),LL(0x9f6281b1,0x6c7e42c3),LL(0x77b66728,0x0e2ff439),LL(0x80e76251,0x1d740e78),LL(0x31a0eb23,0x6bfae4c6),LL(0xaa9b0b3b,0xd78ca917), LL(0x991e1781,0xe140c662),LL(0x0dd3cfee,0x6e396b5f),LL(0x6ce7f6c7,0xf0a1d197),LL(0xd5b01564,0xbe10f8ef),LL(0x101a5194,0x865cbd54),LL(0x66861ded,0xf6658852),
+ LL(0x5b28f7da,0xe4e52e86),LL(0x9a58683f,0xeb43a680),LL(0xb49f2b38,0x73b951bf),LL(0x3f8097cf,0x7b6cb7db),LL(0x328fbf05,0x9dfb8d0b),LL(0xebce6211,0x491635a5), LL(0x90fdd577,0xa31a1523),LL(0x1cd2f39c,0x334120df),LL(0x6b563876,0x1d22834e),LL(0x10ee5a28,0xfd91b30d),LL(0x59aee4ea,0x3d7a282d),LL(0x73300a76,0x36814c6b),
+ LL(0x6621c251,0x7b584add),LL(0x4233aba3,0x98da669d),LL(0x33aa2065,0x4d652b79),LL(0xdf7b4ed4,0x901bcfb8),LL(0x48012f81,0xb2ce5879),LL(0x3cb71b88,0xc18e2cd6), LL(0xff86279d,0xadb0f2bd),LL(0x5bd15866,0x46d9e5d6),LL(0xc635a4c0,0x11b1fb3e),LL(0x01b1006a,0x8bcd0ad2),LL(0xcbab210b,0x0f6f7502),LL(0x0d6b3995,0xd6cc3e56),
+ LL(0x137264c5,0xa54a6420),LL(0xf9c2e45e,0xa6ef0e78),LL(0xd58d850c,0xba8b5a73),LL(0x6ef6fc3e,0xc0209ed8),LL(0x91f7518a,0xe39dd0f3),LL(0x42b3eda6,0x74697b89), LL(0xabfc9150,0x2dccac36),LL(0x98b2f5a5,0x80e4fba2),LL(0x771018d5,0xe0e56fd2),LL(0x4c22bb94,0xa31fd168),LL(0x1a66ef21,0x8b0998f7),LL(0xb5a53ddb,0xed483e55),
+ LL(0xf23978eb,0x95db1c0e),LL(0xf04011f4,0x80ad1612),LL(0x4d7ae83d,0xe76bd182),LL(0x8fc3bd60,0x841d6e66),LL(0x6875e2d0,0xb68e8079),LL(0xd5d9dee7,0xe3965efc), LL(0x58930931,0xc488bb7e),LL(0xa907aa24,0x52f4de19),LL(0x321cc197,0x39aebbdd),LL(0x67de5c66,0xd2f5b1f9),LL(0x8efe3e76,0x60f1a8c2),LL(0xaf988831,0xf40604a0),
+ LL(0x0acb5935,0x78b5c14c),LL(0x4311d3be,0xd9ec715c),LL(0x09e1759e,0xffa22ab2),LL(0xb4b2f68c,0x5a86263d),LL(0x6b5be7f4,0x71e77c51),LL(0x19844f6d,0xfb5bea3a), LL(0x0890ffab,0x2519d006),LL(0xf0329ef0,0x426a03f0),LL(0x85b3c2a9,0x2c6d74a6),LL(0xc294f449,0x9306f68f),LL(0x2c69fb46,0x552e77c2),LL(0x10bb9886,0x7c7337ad),
+},
+/* digit=43 base_pwr=2^215 */
+{
+ LL(0x44b133d9,0x3313a9d5),LL(0x2da910dd,0xdb85c25d),LL(0x5e4dd5cd,0xc0fdef91),LL(0xc565dd67,0x902a2a93),LL(0x7fed05ac,0xd8eba4dc),LL(0xe157dae9,0xd453995c), LL(0xf250cb55,0xd655d0b3),LL(0x86119222,0x4194a09e),LL(0x0652872b,0x5b7e525a),LL(0xe68c0ddb,0xaf7968ef),LL(0xf51cb31c,0x2ec02930),LL(0xf2be071e,0x237f3ae4),
+ LL(0x94d0864f,0x9b23ab4e),LL(0x009c9fc1,0x46356266),LL(0xe798edf9,0xdbe99e51),LL(0x307675c7,0x38547449),LL(0x628c0fb6,0x23ffaf55),LL(0x1698c372,0x56ccd2a3), LL(0x8347ce95,0x39f45a57),LL(0x4f2c6118,0xe0aaec74),LL(0x4af138fc,0x2a89079e),LL(0x2ee4ecc0,0xb86371ea),LL(0x06bbf92f,0x076d256a),LL(0xae3c4c51,0x9073adb8),
+ LL(0x4c99252c,0xdaa77b43),LL(0x326cb0e1,0x59e38731),LL(0x03ca6c85,0x281a38cc),LL(0x433835a0,0x83565666),LL(0x30a928fd,0x3654ec9e),LL(0x7cb281f8,0x1c82abca), LL(0x13fafa6f,0xbeba0fe5),LL(0x99440e63,0x67432292),LL(0x0034d0cf,0xd62777af),LL(0x9cde52a0,0xd42b95fe),LL(0x6a23630f,0xb5b891bc),LL(0x64594976,0x8e4d2984),
+ LL(0x743c15d9,0xba2e9543),LL(0x1c99c984,0x7d5812db),LL(0x45bdc19e,0xf94db951),LL(0x382e77bd,0x951d00ae),LL(0xb220b29a,0x9940a5fb),LL(0x58fc91f1,0x6908d50e), LL(0xdd0940fe,0x682e42ea),LL(0xa1d32009,0x2124e23a),LL(0x16294d05,0xbe158100),LL(0x2e326d68,0xaea13fe3),LL(0x15e64fce,0xc0dfe1ef),LL(0xb8237a8a,0x32dbc0b5),
+ LL(0x663771f8,0xea6f1448),LL(0x9a0906cb,0xbf11f126),LL(0xd1a6a6a5,0x8c08219d),LL(0xdd56f277,0xf2af6e04),LL(0xd569188a,0x8ad26705),LL(0x6e071c9b,0xf0547631), LL(0xfd4aa6ec,0x945f40bd),LL(0x8486987c,0xbd6a8a8d),LL(0xb947b6f2,0x4f577728),LL(0x7aab6bc1,0xe2754a8e),LL(0xfb48a9ab,0x918d02cd),LL(0xbf904200,0x7e3ddaea),
+ LL(0x0bc28725,0xe59b8002),LL(0x149f8991,0xc6f8fa54),LL(0x5af5b47e,0x8799172a),LL(0x160d7e8d,0xf72c9780),LL(0xb2f9a549,0x1d1ce972),LL(0x4857b44a,0x8fce3f16), LL(0x1ed5e0e5,0x2545bdd7),LL(0xc259176a,0x222c33a7),LL(0x4e23c064,0x5a60343a),LL(0x1d1fd9cd,0x986779f9),LL(0x3570b5b3,0x5bd5611b),LL(0xf9d765a3,0x2758caea),
+ LL(0x3a16e352,0xd8135f00),LL(0x55d4e996,0xbfc784b2),LL(0x0a6874d0,0x5da46321),LL(0xe8e1e4d0,0xf1635286),LL(0xa0e9c4de,0xe71332b3),LL(0x60fc995e,0x5f076117), LL(0xc19ebb59,0x1c1305d1),LL(0x4603baa2,0x1d5987f2),LL(0xea7c9f9c,0x6b7885b0),LL(0xfe9ba1fc,0x362734e8),LL(0xb3892110,0x49a3ff32),LL(0xd4997512,0x0e5b2166),
+ LL(0xc36d3f25,0x6ee65a08),LL(0xe393e4d4,0x7b6c811f),LL(0x2876e523,0xc4a2cc38),LL(0xd3bf53aa,0xab7aba26),LL(0xdb7f290c,0x5bf00871),LL(0x1ee6d5bd,0x3cb1cd13), LL(0xde998ada,0x4cafb218),LL(0xf6319101,0xa1ecf36a),LL(0x20b281cc,0xa1fe7855),LL(0x64d9c65e,0xe457198e),LL(0xc5a0e67b,0xa3d1a6d0),LL(0x90cc468a,0x69ddbc32),
+ LL(0x53a38094,0x3f3cb2a5),LL(0x3b19448a,0xc9308152),LL(0x925ba579,0x9cf32819),LL(0x1801e686,0x44b9590a),LL(0xdf04be40,0xab6b284c),LL(0x2c216ae7,0xc40a58e6), LL(0x018a60e8,0xa6ced619),LL(0x83e5cc65,0x83d4cde1),LL(0xb5a91945,0xe2559f51),LL(0xef0f53ee,0x53d9122b),LL(0x32e40a83,0x474c281b),LL(0x944dfe65,0x332324a7),
+ LL(0xa1fd057d,0xcb0a3657),LL(0xb4aa013b,0xad79ae60),LL(0x97ed887a,0x0b852109),LL(0x30d9b297,0x5fec3e1f),LL(0x10fb9c74,0x4ce4149f),LL(0x8cbff785,0x4e08b4d9), LL(0x2f07cbae,0x81b0d7b4),LL(0x495230ae,0x08bc321e),LL(0x2b841eb8,0xaec221de),LL(0xd83c22e6,0x62c7d86a),LL(0x85affe91,0x5504dcf8),LL(0xf445481d,0x785a06f1),
+ LL(0x18670cf4,0x8b68acc4),LL(0xcba49dca,0x64073a95),LL(0x9f508534,0x633757b0),LL(0x916f3a09,0x78ad9df7),LL(0x08617468,0x46187c92),LL(0xc5f77b94,0x48f37eb6), LL(0xd058bb27,0x333224f0),LL(0xd8852abb,0x7f28ace7),LL(0xa2e62327,0x8c9f634f),LL(0xc4116c1b,0x75212283),LL(0xcc0c0851,0xb7723ad0),LL(0x5b72e5aa,0xc8a4cff1),
+ LL(0x6dadc46f,0xd4ee3f7f),LL(0x5d7febd6,0xa1f3dc92),LL(0x63ebab5b,0x4c0bee13),LL(0x005ec237,0x70e32d77),LL(0xc52fb006,0x302fc73d),LL(0x8f159899,0x1af84c0a), LL(0x0686232a,0x42a5478f),LL(0x8a308687,0xb4fc5634),LL(0xc8378f0d,0x042c4970),LL(0x8e2c86c5,0x70c19575),LL(0x84c7c767,0x61a95e68),LL(0xd6fb43a8,0xd96a8216),
+ LL(0x1a2db746,0x67f8fa3e),LL(0xba267cad,0x2f041d4a),LL(0x65bafbee,0xdf8126ea),LL(0xfad7b234,0xf63fc68f),LL(0x702db8ab,0x4280e1e1),LL(0x02468fc2,0xbe6122f2), LL(0xc89b74de,0x06b076d0),LL(0x4bbdb7cc,0xc2515543),LL(0x50eb6108,0xae82a08f),LL(0x2f0f3f5e,0xf49da234),LL(0xeca6448e,0x7d1923b2),LL(0x70b144ab,0x9e01d58c),
+ LL(0xee49a1bf,0xeaf237a8),LL(0x4ea1da86,0x78bf04bf),LL(0x3f251ad5,0x5fbffa47),LL(0xd828578e,0xc40570f6),LL(0xd4e118ad,0x5cc65c0d),LL(0x5da48548,0x9e18ff96), LL(0xef7e714b,0xe27fc2e7),LL(0x13df7524,0x19ff3f7c),LL(0x5e27fb12,0x35a32fa5),LL(0x10003fae,0x7fcfd728),LL(0xf49800c1,0xc74b50a3),LL(0xdbafb2e6,0xbf0732eb),
+ LL(0xc1238c95,0x1d1b02ab),LL(0xee8c4d2b,0x85b3878a),LL(0xc761afd0,0x23ba366c),LL(0x4f023bb7,0x47324d03),LL(0x388c8e5b,0x75902ccc),LL(0x86e2e6b6,0x374484b9), LL(0x9f548719,0x38360f84),LL(0x41cbc7ef,0xdf999916),LL(0x5091ed27,0xa9cbe298),LL(0xc5f2cb5d,0xcf5a1440),LL(0xd413500d,0x5bdff729),LL(0x373f8b2d,0x55530d56),
+ LL(0x543c1255,0x0c62fd2d),LL(0xef361a27,0x71ea9c6f),LL(0xcef3f9e3,0x76b0933d),LL(0x9889ffa2,0x51b1ec2d),LL(0x9a3c88d2,0x9e84b2ba),LL(0x1913e52f,0xc8996b96), LL(0xcee43e36,0xbafc5e94),LL(0x70c658b7,0xd9898d24),LL(0xbed17108,0x4e9bcc41),LL(0x6c7a41c8,0x0db5b733),LL(0x795369cd,0xd4be07a7),LL(0x7bd3a934,0xb899f92f),
+},
+/* digit=44 base_pwr=2^220 */
+{
+ LL(0xde1e4e55,0x3f2eff53),LL(0xe4d3ecc4,0x6b749943),LL(0x0dde190d,0xaf10b18a),LL(0xa26b0409,0xf491b98d),LL(0xa2b1d944,0x66080782),LL(0x97e8c541,0x59277dc6), LL(0x006f18aa,0xfdbfc5f6),LL(0xfadd8be1,0x435d165b),LL(0x57645ef4,0x8e5d2638),LL(0xa0258363,0x31bcfda6),LL(0xd35d2503,0xf5330ab8),LL(0xc7cab285,0xb71369f0),
+ LL(0x14c5969b,0xf16938f5),LL(0x944b2271,0xde2e3cf0),LL(0x0b6490d6,0x2d509553),LL(0xa28a296a,0x8432fef1),LL(0x8d26415c,0x6f254dd0),LL(0xd50c2865,0x3780eead), LL(0x665b8794,0x4f5bc455),LL(0x56cb7018,0xef31fb9e),LL(0x65e59340,0xbab8dd6e),LL(0xa56dc2ea,0x676baca2),LL(0xeaa90e05,0x38eea06b),LL(0x174bada0,0x26e64224),
+ LL(0x40acc5a8,0xe6a19dcc),LL(0xdbc6dbf8,0x1c3a1ff1),LL(0xc6455613,0xb4d89b9f),LL(0xa7390d0e,0x6cb0fe44),LL(0x59ea135a,0xade197a4),LL(0x20680982,0xda6aa865), LL(0x5a442c1b,0x03db9be9),LL(0x2bfb93f2,0x221a2d73),LL(0x753c196c,0x44dee8d4),LL(0x0b7c6ff5,0x59adcc70),LL(0x4ca1b142,0xc6260ec2),LL(0x46cbd4f2,0x4c3cb5c6),
+ LL(0x2cb40964,0xa35e411c),LL(0xc331a3d6,0xdd7d4f4c),LL(0x89a66f2b,0x7c7c859e),LL(0x0def8ecd,0x9908c37e),LL(0x344947b7,0x8274124e),LL(0x568b0ce8,0x0d279f7b), LL(0x866091ec,0xe5291961),LL(0x3a08acc7,0xb056e3bf),LL(0x56bd3a7d,0x60fb39e1),LL(0x268f8562,0xe56a34d6),LL(0x13fd8293,0xb3a1fe16),LL(0x67537fcb,0x6a41e1a9),
+ LL(0xa417111f,0x8a15d6fe),LL(0x71d93fcc,0xfe4a16bd),LL(0x55bbe732,0x7a7ee38c),LL(0x1ff94a9d,0xeff146a5),LL(0xdd585ab5,0xe572d13e),LL(0x06491a5d,0xd879790e), LL(0x2a58cb2e,0x9c84e1c5),LL(0x6c938630,0xd79d1374),LL(0x385f06c7,0xdb12cd9b),LL(0x7a7759c3,0x0c93eb97),LL(0x683bd706,0xf1f5b0fe),LL(0x85ec3d50,0x541e4f72),
+ LL(0xc6bb5e5f,0x89e48d8b),LL(0x1ea95a10,0x0880ede0),LL(0x302c0daa,0x60f033d7),LL(0x048eefe3,0x15e4578a),LL(0xb0a72244,0xfd6dec89),LL(0x309489cd,0x1f7cd75e), LL(0xe9aba7fd,0x7cdcc2a0),LL(0xf28ba00f,0xd18dc5c7),LL(0x5812b55f,0xa6300a45),LL(0x2ca31d8c,0x8fa5c415),LL(0x4f3a5b5a,0x36aa3c23),LL(0xc86cf4e0,0xd128739e),
+ LL(0x81833608,0x9a0e1535),LL(0x6e2833ac,0x5cce871e),LL(0xfb29777c,0xc17059ea),LL(0xe354cafd,0x7e40e5fa),LL(0x4d07c371,0x9cf59405),LL(0xa71c3945,0x64ce36b2), LL(0x56caf487,0x69309e96),LL(0x1ae3454b,0x3d719e9f),LL(0xe25823b6,0xf2164070),LL(0x0bc27359,0xead851bd),LL(0xb0925094,0x3d21bfe8),LL(0x34a97f4e,0xa783b1e9),
+ LL(0x13575004,0xd9272830),LL(0x20b2275e,0x01a330d6),LL(0x450db713,0x58b9207f),LL(0x23e16d95,0xae953384),LL(0xe60e349c,0x4f10c6d4),LL(0xfeb122bc,0x541d03ec), LL(0x2c648211,0x22548cd2),LL(0xd01354f5,0x5c2dc84c),LL(0xb6167b3c,0xa1c6f912),LL(0x7902d2ba,0x6967bab2),LL(0x36de34ba,0xebbe0b08),LL(0x4b79625e,0x6985b33a),
+ LL(0x9546491a,0x406b0c26),LL(0xf293c4e5,0x9e5e15e2),LL(0x15b164db,0xc60d6413),LL(0x0c75a78e,0x0da46f53),LL(0xea0c656b,0x7c599bb7),LL(0x1b1a8122,0x0f07a512), LL(0x15172686,0x14c7204a),LL(0x5165625d,0x8faedff8),LL(0x37aede40,0x20f260ce),LL(0x8f357ffe,0xc81f771e),LL(0xb0912557,0x25499197),LL(0x4c739c74,0x736197dc),
+ LL(0xaefdd5e1,0xf2d015bd),LL(0x4bf9edae,0x33b4e21c),LL(0x64b35fcc,0x4860aadc),LL(0xf13f8112,0x77b657e9),LL(0x90dc84fe,0x65f28625),LL(0xd66be036,0x4eabfd22), LL(0x6ff05dd0,0xb0213123),LL(0xa9fe5d11,0xa104d4aa),LL(0x9b8ae390,0xdc7efe3b),LL(0xeb87fb5c,0x46918b54),LL(0x72b7172a,0xf5771d71),LL(0x13587bf0,0x41e49e47),
+ LL(0x381b3462,0x6151bab1),LL(0x43dbd344,0x27e5a078),LL(0xa1c3e9fb,0x2cb05bd6),LL(0x27cf2a11,0x2a759760),LL(0xff43e702,0x0adcf9db),LL(0x1f484146,0x4bbf03e2), LL(0x55b6521a,0x0e74997f),LL(0xade17086,0x15629231),LL(0x7493fc58,0x7f143e86),LL(0xaf8b9670,0x60869095),LL(0x7e524869,0x482cfcd7),LL(0x1d454756,0x9e8060c3),
+ LL(0x9004b845,0x3ec55ddc),LL(0xbe7b06eb,0x5101127c),LL(0xfc4176e9,0xdddafd57),LL(0xe4a31ddc,0xd8cb31c0),LL(0xd42feabb,0x94e83a89),LL(0x2f74ec68,0xd4401def), LL(0x5adb654d,0x9c9defb6),LL(0x5053eeda,0x9a3513f0),LL(0x7cdb455e,0xceab2dec),LL(0x59d24f59,0x99542808),LL(0x31d30504,0x22ead452),LL(0x0521a229,0xe9df48f9),
+ LL(0xc88b4d3b,0xe495747a),LL(0xae8a948f,0xb7559835),LL(0xdeb56853,0x67eef3a9),LL(0x9dee5adf,0x0e20e269),LL(0x61f0a1aa,0x9031af67),LL(0x683402bc,0x76669d32), LL(0x06718b16,0x90bd2313),LL(0x864efdac,0xe1b22a21),LL(0x6620089f,0xe4ffe909),LL(0x3428e2d9,0xb84c842e),LL(0xfe3871fc,0x0e28c880),LL(0x3f21c200,0x8932f698),
+ LL(0x441d0806,0x36dd28ea),LL(0x21518207,0x6680c72c),LL(0x0a484dbc,0xc5d40e28),LL(0xa3a2ba6e,0xdb1170c6),LL(0x40a91c7d,0x07290fd1),LL(0x95ee9ca2,0xdd125716), LL(0x07876188,0x595dad63),LL(0x499d4827,0x6fcf18c0),LL(0x206e617d,0xdcd946a3),LL(0xe7bceaef,0x6cf08f51),LL(0xb19a06ac,0x7a85c02d),LL(0x7140a7df,0xf1365fc6),
+ LL(0x6c90ea5d,0x603f00ce),LL(0x40a2f693,0x64739307),LL(0x2174e517,0xaf65148b),LL(0xf784ae74,0x162fc2ca),LL(0x4d5f6458,0x0d9a8825),LL(0x43aace93,0x0c2d5861), LL(0x9f73cbfc,0xbf1eadde),LL(0x9c68bbca,0xde9c34c0),LL(0x67ef8a1a,0x6d95602d),LL(0xa791b241,0x0af2581b),LL(0x12cad604,0x14f77361),LL(0xe2acd1ad,0x19f2354d),
+ LL(0x771560ab,0x9e857f33),LL(0x250f109d,0x4ae1ba22),LL(0xff4f6566,0xf8538d68),LL(0xac339148,0x35380f15),LL(0x5ddfc12f,0xfef0bfdd),LL(0x1387d93e,0xf706c6bf), LL(0x5357e131,0x618ce77d),LL(0x236478c4,0xf0921744),LL(0x00dc0da5,0x24eaf06e),LL(0x07603cc7,0x049113be),LL(0x8f6963c7,0x5cf48908),LL(0xede4a300,0xbe5eb9e6),
+},
+/* digit=45 base_pwr=2^225 */
+{
+ LL(0x5d066c15,0x77e486f8),LL(0x4ed5307d,0x0c05b6c2),LL(0x7df36628,0x322b28ab),LL(0x6704dcd6,0x2d14d131),LL(0xf29a3567,0xd359977a),LL(0xec96d3b6,0xc29bb132), LL(0xe6bfa701,0xfd6e400a),LL(0x4c7e5101,0x03db9924),LL(0x9b8533af,0x62d81c7d),LL(0x8de66eb8,0xefa638c2),LL(0xe86784ee,0x7405a9d7),LL(0xa6c22223,0xafaa74ef),
+ LL(0xb9d36e91,0xf9b2dba4),LL(0xfda9b2c4,0x5fb4f6ce),LL(0x3b8104ee,0x7692a4f3),LL(0xe4e1896e,0x5da885b0),LL(0x73d2aa36,0xc2a30fec),LL(0x86f60bca,0x7d06e6af), LL(0x87287887,0xbc8bf16d),LL(0x3d701bec,0x6c3dd86a),LL(0x7e35610a,0x8e79e2f3),LL(0x82f9d71c,0x981139f4),LL(0x24e62733,0xf8997ec4),LL(0xa3518061,0x330d989a),
+ LL(0xca89fbad,0x4e6ef410),LL(0x53933b78,0xe0fc53ba),LL(0xfd41d143,0xa4f03403),LL(0xe0774c37,0x3a507177),LL(0x8ec7484a,0x078e8c56),LL(0xfbb3f66b,0xfb73c6b6), LL(0x3bfbdff6,0x169c9475),LL(0x0a232243,0x44d28606),LL(0x08303114,0x3e8e9685),LL(0xfad0def2,0x7a9797b8),LL(0xefc1c8da,0x0ad14404),LL(0x21ced721,0x6daae4e9),
+ LL(0x88dd2dc2,0xc7e9ddef),LL(0x19a0c0b5,0x2c21a998),LL(0xb239bb82,0x6bc0746d),LL(0x28ea1341,0xc811a8eb),LL(0x1d1309b0,0x5f714ca7),LL(0xd4eb9b34,0x79eabd20), LL(0xdf0fb30f,0xe0e5afdc),LL(0x8c0814c6,0x1b01a16d),LL(0x84334366,0x670e1e7b),LL(0x0eed1116,0xc8c38f9a),LL(0x619bbd50,0xf914fae2),LL(0x51c1995a,0x1ed062cb),
+ LL(0xcb583422,0xd4e60e15),LL(0x320f296f,0xc6b1ef90),LL(0xd9bfc834,0x0714bad0),LL(0x9050e2c2,0x5ee2ca8c),LL(0x24f7cf1d,0x074a8ca8),LL(0x10df8516,0xb9750249), LL(0xc2636d2c,0xecee8ab7),LL(0x3b4b7bbd,0x308e5af1),LL(0xee2ae021,0xfed4f27e),LL(0x2065253b,0x7cd4bb19),LL(0x4de525b4,0x6b21a3f8),LL(0xac27fddb,0x0f10e7bd),
+ LL(0x870e29cb,0xd5068487),LL(0xfc52d5cb,0xf9420b85),LL(0x496d000d,0x50c3265a),LL(0x166bd6b4,0xe605414a),LL(0xc62b2a6c,0x4de8d724),LL(0xa1a11048,0x16af06f2), LL(0x45f43c4c,0x5406bde9),LL(0x751ad18e,0x5e15bf6c),LL(0xb6a59587,0xa846e665),LL(0x1816ac55,0xcdb28a7d),LL(0x819b73f8,0x899b3551),LL(0xbc848d08,0x2d46297b),
+ LL(0x299127be,0xdc4cc720),LL(0xfaab8165,0x5b34e762),LL(0xb39c120d,0x2289b2f7),LL(0x6e52b913,0x687a78d0),LL(0x2a3ea6a5,0xd2a091dd),LL(0x38eab329,0xc61eced6), LL(0x7887ff2b,0x652231ea),LL(0x0479db4e,0x77a56875),LL(0xd43c5722,0x1ef471c8),LL(0xf3764c34,0xf82bf436),LL(0x0445cafe,0x962af405),LL(0x5ff47259,0xed8b227f),
+ LL(0xd89594ab,0xde849cd1),LL(0x0ec4fb3a,0x00e2d2b1),LL(0xabe92fba,0x3fbd9e3d),LL(0x3324900a,0x785414d4),LL(0xde20904e,0xdaead1ab),LL(0xaa5f1ba8,0xb493e121), LL(0x6eaea0dc,0xd60a4f2d),LL(0x6fca8596,0x394746b5),LL(0x34efa243,0x163dc789),LL(0x216a8d8c,0x3067dccf),LL(0xa901617b,0x116b6534),LL(0xbbabe51e,0x8c4bd099),
+ LL(0xac3a082c,0xc8c2df45),LL(0xc8d4c40e,0xc353d074),LL(0x5a3c2de7,0xb214f9c0),LL(0xf86b0214,0x504bc42c),LL(0xd1922a58,0xc82df5cb),LL(0xa5bc3267,0x40887948), LL(0x88ba8bb2,0x04bcd217),LL(0x046fd401,0xe21b3e7f),LL(0x616af5cf,0x8419c338),LL(0xaedfce9d,0x7f24760b),LL(0xddbd519a,0xded8035b),LL(0x1693faab,0x1f1fb0d7),
+ LL(0xd02ffcf6,0xbb067b49),LL(0x3e657299,0x7cedf8f9),LL(0x406bbfe3,0xc3829961),LL(0x37c12472,0xefe4b5aa),LL(0xfec7dee8,0x7dc01cf9),LL(0x89472f50,0x70a9db23), LL(0xb31bf737,0x29c269f8),LL(0xae3fa7db,0xa26deac3),LL(0x33caca41,0x0046e912),LL(0xb6e78b55,0x3bf4bc8a),LL(0xd9eb5ef1,0xca83bc6c),LL(0xc0c5deff,0x73f25c62),
+ LL(0x44b4aae8,0x697dc47d),LL(0x782c331c,0xb3525cc0),LL(0x0bd7c78c,0xff71cca4),LL(0x10c0ab69,0x5f3d7766),LL(0xe2ba07e3,0xbdc10267),LL(0xe6373f6e,0xc656f75c), LL(0xb5607b62,0x9e2938b4),LL(0x10b0a0f7,0xa65017d4),LL(0x5cc6ac25,0x8dad3119),LL(0x8ba5d1e6,0x00f8f2d1),LL(0x43305aef,0x608137bc),LL(0xdcb81cb1,0xddad34bb),
+ LL(0xb1f82ca5,0xe133d941),LL(0xfdf115bf,0x2af8b98b),LL(0x57aaa6f3,0xdc6179c8),LL(0x130ade06,0xabaa83e9),LL(0x0e8bffd1,0x7836b6fb),LL(0xfa103703,0xc479751f), LL(0x9c89963b,0x0ff3c129),LL(0x0b84c24f,0xe6407256),LL(0xf34f6bc9,0xa92a4ea2),LL(0x3197989b,0xba45b305),LL(0x99243aab,0xd12b5a01),LL(0x442af625,0x3015772c),
+ LL(0xe6f065c5,0xd95fca81),LL(0xfc8655de,0x45e886d5),LL(0x27cff79e,0x35809577),LL(0x625877d9,0x92a39a34),LL(0xdfee17ee,0xdda02684),LL(0x986f635b,0x6354f871), LL(0xd409c182,0xb3a6e9ed),LL(0xc4fbbb3a,0xf0b1c8d9),LL(0x9b77aded,0x28721c01),LL(0xbf94f028,0x3c356df1),LL(0x29a81f1a,0xff221bd2),LL(0x56b20b0d,0x20edf2e8),
+ LL(0x835fda9e,0x97fff124),LL(0x0bc68512,0xa79ceb2f),LL(0xa2fc3995,0x70ba93d1),LL(0x9e51c5ee,0x62bd28ab),LL(0xd5bbbaa9,0xb95fa624),LL(0x8c1f571e,0x0654dc45), LL(0x65a45ed6,0xb9a4edc6),LL(0x21ad0612,0xbf5ed1bc),LL(0xb1a3551b,0x74adc1a1),LL(0xdbbd6cef,0x3dfa3dc8),LL(0x2fa3afd2,0xce5dd40b),LL(0x30a746ca,0x14894e0f),
+ LL(0xb8ca2a2c,0x7e729c58),LL(0xcaac04af,0x0f32ea1e),LL(0xbdd549e3,0x47267f13),LL(0x90be3b50,0x35b94406),LL(0x4b27f670,0xad0f2bb1),LL(0x92341803,0xd7e5874e), LL(0x1f9ec462,0x7dc841cf),LL(0x512b2a42,0xebeff994),LL(0x320dc858,0x22998a7f),LL(0x19946f59,0xf08eb5c7),LL(0xa68ea75e,0x228c8dcd),LL(0x7b20dee5,0x40dc6dc3),
+ LL(0xb3952db4,0x929454f6),LL(0x4d3f69f5,0x412142ec),LL(0xee25c0b0,0xf5b0a7c5),LL(0x2e752295,0x7d3372ff),LL(0x6eacac68,0xd6dadc7d),LL(0xa96a8e3c,0x5f0076cc), LL(0x71725b3a,0xea831db6),LL(0xc29ab454,0x4a286c89),LL(0x72e3c00c,0x5ff817e5),LL(0x2a5fb6ba,0xb022e25d),LL(0xbb392476,0xb611c5bc),LL(0x190485a0,0x062c14dc),
+},
+/* digit=46 base_pwr=2^230 */
+{
+ LL(0xc419b0aa,0x0372678d),LL(0xc13fdf17,0xf95031d8),LL(0xb79594c3,0xebaebca4),LL(0xaf3b75cf,0xe587850b),LL(0x2c1e09c6,0x534183ac),LL(0xc08204cd,0x3f5b0bfd), LL(0xe297cc77,0xdac2cf06),LL(0xd0487084,0x5e47d9c6),LL(0x90b0f6c2,0xf6f509f4),LL(0xc2c62207,0x3ffc3cd6),LL(0x32ff1887,0xbb21eb11),LL(0xe62ccc6f,0x2116a023),
+ LL(0x16960728,0x406a7e21),LL(0x5597d8c4,0xd03923f8),LL(0x020748ee,0xd4402eff),LL(0xf39b58db,0x7827442a),LL(0x8d8cfb04,0x77e3f276),LL(0xe45a978f,0xf6eb49c8), LL(0x49247f6a,0x9db08299),LL(0x06669fe5,0xce71a747),LL(0xb82775f5,0xe434ce47),LL(0x63910016,0xe84995ef),LL(0x1e47792f,0xa35e8b97),LL(0x7c6aaeb9,0xc779cb3d),
+ LL(0xff381db7,0x66428800),LL(0x55574ac6,0xa9b9d019),LL(0xbdf4a86c,0x30cdc21f),LL(0x741c4a26,0x2ec38d35),LL(0x0b6be057,0x35496c23),LL(0x01656b1f,0xaecc67e6), LL(0xf7d70324,0x781af00f),LL(0x5d7ee71e,0xac0e6579),LL(0xa6b14e3a,0x60a35c6c),LL(0x0e6c1c3a,0xacd6813b),LL(0x1faeef73,0xd7f77024),LL(0x23eddf05,0xd2254b8f),
+ LL(0xaf31ea1d,0x1fa064cf),LL(0x48e8d974,0x2a9547a8),LL(0xfa9d9453,0xda8102a1),LL(0xdc6bd7ea,0x786aecab),LL(0xca2f6044,0xcaf91e3b),LL(0x8573f208,0x67d86ea7), LL(0xc505ae24,0xd309fce9),LL(0x7f86eb8e,0x67ddc5b1),LL(0xf3d53056,0x57791ae0),LL(0x0d1fd61e,0x26b053f0),LL(0x045ebfa6,0x91c962c0),LL(0x076ed979,0xe95246de),
+ LL(0x5f6e9ea4,0xc49c9989),LL(0xe16ec8e4,0x4a91578b),LL(0x0aeb5ac5,0xa1c54e89),LL(0xee09b9a0,0xa9094b07),LL(0x09a74b27,0x3587752f),LL(0x44bbfed0,0x973bf8b0), LL(0x5636a52e,0x91c26f23),LL(0xeb7e3b41,0x8ac948b8),LL(0xfc457d56,0x14234675),LL(0xc76398a3,0xde98e4fa),LL(0x0f4a46e0,0xa80f7311),LL(0x22b66fa3,0xcba089bd),
+ LL(0x0746d174,0x156eaf57),LL(0xcda35250,0xa2d4a83d),LL(0x0290fa02,0x60a9f48c),LL(0x5c33b4ac,0x9855d26d),LL(0x97eb1c30,0x06e379c6),LL(0x6e219664,0x4f2e2dbe), LL(0x29006065,0x6b7448f8),LL(0x115062a9,0x237a1f31),LL(0xad92cb24,0x5c635a90),LL(0x2eed977e,0x2e857f8c),LL(0x856dc88a,0x3d512df7),LL(0xe597a27b,0xbde85263),
+ LL(0x10a98e42,0x0b114aea),LL(0xae19dd14,0x6133aa52),LL(0xa99eb2c5,0x0c235df2),LL(0x7f59582c,0x0085a619),LL(0x8cf7feba,0xf9002bba),LL(0xaf6a3261,0x275742d7), LL(0x249e8e9e,0x302b4823),LL(0xce696f91,0xa142aba9),LL(0x64c37b14,0xdeb28c44),LL(0x0766002f,0x14bb8f23),LL(0xc52fe891,0xafeff88b),LL(0x46faeb2d,0xb9d493ae),
+ LL(0xe7c03ce4,0x49f24994),LL(0x2aed9ba3,0x274a8c13),LL(0xd5e91bc0,0x897b9103),LL(0xcb404f68,0x63db1efb),LL(0x42f7fc02,0x70efd9d8),LL(0xc6a230af,0xd6e02921), LL(0x11ae0a56,0x8d5b199f),LL(0xce33da6a,0xc98287de),LL(0x504dd889,0xde583d34),LL(0xf823686f,0x03756001),LL(0x95fc73dc,0xf19ab86f),LL(0x93f12f42,0x300406c6),
+ LL(0xa427d89c,0x68fdb78a),LL(0xa3944c0d,0x84e9ba49),LL(0xc1833422,0x1c3569b1),LL(0x1a01f4b9,0x30773fc0),LL(0x7da01321,0x18b8f17d),LL(0x7198c85e,0x8370fb0f), LL(0x99a898e3,0xda12c8d4),LL(0x8ba82ded,0x7667b46a),LL(0x77e1e31f,0x2aab259b),LL(0xbe71c9bc,0xd03f7708),LL(0x8e43eb38,0x9f784cce),LL(0x21c1208c,0x7ddedc8b),
+ LL(0x7759701c,0x2f73595f),LL(0x6fe0e0d9,0x8dc2069a),LL(0xc286a65d,0xb7de7114),LL(0x84c0e487,0xfecc429e),LL(0x14344c07,0x51061a2c),LL(0x96869e37,0x4d709725), LL(0x2be9403b,0x8b02781f),LL(0xde3ab5d9,0x6cb6aa02),LL(0xff6bdc9a,0xb013508e),LL(0xe5438c58,0x568d2e84),LL(0xe4206c3b,0x7b35a979),LL(0xb17a8bc7,0x0bb793c0),
+ LL(0x57ed2360,0x41248052),LL(0x6ba9bd95,0xfc0cb1b6),LL(0x2337a8fd,0x342f16db),LL(0x88099007,0xe1417411),LL(0x8cd74752,0xc96c29ee),LL(0xedf5fb4a,0x376047cc), LL(0x439546c1,0x5f40ce08),LL(0x1a235de8,0x14d2c666),LL(0x98e355f0,0x9b66892d),LL(0xa4bb19e9,0x8a65f6dd),LL(0x046a2581,0xf72848f8),LL(0x8373b2b6,0xfed74b3b),
+ LL(0xfa4dd561,0x3f896ca9),LL(0xd2de2ecb,0x4b9a98ab),LL(0x600e4e2a,0xd0741632),LL(0x69e702d5,0x87c7db5f),LL(0x53e0df2b,0x1f5a3b80),LL(0xf443dfba,0xe1e24b49), LL(0x5eef3a1d,0xeb90e230),LL(0xd38f73fc,0x8f3fc8a6),LL(0xa5aa335a,0xfb1e8299),LL(0x4197b32a,0xd78504cd),LL(0x6755918e,0x0e7a79cc),LL(0x883b1c72,0xc7c98ae2),
+ LL(0x969088c1,0x4b74fcbd),LL(0x361a8c96,0x4d16f895),LL(0x760d61fa,0xefcb6ced),LL(0xcc3e8808,0x3f14a7cb),LL(0x664ea335,0x51f5fd2c),LL(0x3a65d305,0xe0cad090), LL(0x031a6911,0x86409de9),LL(0xe5f9715b,0x23ea4aed),LL(0x1f3532c6,0x6e5b8cea),LL(0x11271ead,0x33fc873e),LL(0x5b8131d7,0x842b59a6),LL(0x61b7bf60,0xbd95818a),
+ LL(0x03d2becc,0x1a12727c),LL(0xc6741372,0x810a37df),LL(0xb7049f39,0x44ac483f),LL(0xa36fc614,0xab73e5e7),LL(0xeeff8aeb,0x298d453f),LL(0x7e1b586b,0x2127dd16), LL(0xe07bd60c,0xeadc5c54),LL(0xf5e2d2e2,0x67cdae00),LL(0xc9d2f10a,0x03fe0446),LL(0x95e38ed2,0x07840987),LL(0xe1a6306e,0x5d348a7c),LL(0x562f5463,0x4903f1b6),
+ LL(0x4a3862e8,0x906ab8a8),LL(0xb2f5c878,0x8fc76114),LL(0x2035287f,0x2dac3952),LL(0x18af4378,0xaa8372f3),LL(0xdbf64476,0x915050c9),LL(0xe992d0c8,0x896f734d), LL(0x3a35846c,0x5c3e36da),LL(0xac8f4fc3,0xfe774b4a),LL(0xaadd8a59,0x66347050),LL(0x2cd12be8,0xea94ebda),LL(0xdab94de0,0x45b1e7e2),LL(0x264b508c,0x539d580e),
+ LL(0xb44b1d0c,0xbf66baa5),LL(0xa44f8eda,0xbbed18ed),LL(0xeaaa466c,0x80bc32ab),LL(0xe5f2733b,0x605b7897),LL(0xa2531afa,0xe9e7e3a1),LL(0x3deb8369,0x25d66db3), LL(0xb2f25d10,0x36212ea3),LL(0xa08d303e,0x52d6b3f4),LL(0x444e9e9f,0xefa54b31),LL(0x69530c1b,0x9c2229a1),LL(0x4b79bdd1,0x68feb985),LL(0x8b984cc3,0xd570e84f),
+},
+/* digit=47 base_pwr=2^235 */
+{
+ LL(0x845f26e4,0xd6a4d25c),LL(0x1b039dff,0x71e554ce),LL(0x1cdedfc0,0x94205973),LL(0x03d6502f,0x0c4e3856),LL(0xe15ce8c8,0x981a4fc5),LL(0x7aca30b7,0x85d1b0f1), LL(0x77bb9e43,0xf2037ef7),LL(0xe87ae187,0xc52804f4),LL(0x71f3e4e3,0x9c98a23c),LL(0xf47b504b,0xa73c8b89),LL(0x023233aa,0xb9e33f54),LL(0xf92c9f68,0xf2bcfc17),
+ LL(0x7b3b336d,0xba03ba3b),LL(0x28c9c55d,0xe57ce509),LL(0x4f0f60b2,0xf96b8cfe),LL(0x6fcccd96,0xb908d77e),LL(0xe79dd17a,0x7208ef7d),LL(0x3ec3d048,0x73909533), LL(0x1163fe78,0x9c5ad2da),LL(0xcd4a15c2,0x4e2a8685),LL(0x470eb938,0xac999449),LL(0xee7d772f,0xfaaf27fb),LL(0xd0b7ad09,0xfbe402ab),LL(0x57db00a9,0x704d4f0e),
+ LL(0xe12b4e64,0xe93ee31a),LL(0x662d17f4,0x2ab8e378),LL(0x69516582,0x2544bd99),LL(0x2e1e5485,0x7bf80e4b),LL(0x729d9361,0xf30f0b14),LL(0x8268d40f,0xb3ffb5d1), LL(0xac193a63,0x34605055),LL(0xf8e04d69,0x9e5ca9a9),LL(0x085ecbb2,0xcbbeebc1),LL(0xf340eac4,0xda03b75b),LL(0x84436462,0x3bf9468a),LL(0x0f26f20c,0xdfa8b4c8),
+ LL(0x3fc14a85,0x10c082a6),LL(0x1c0b14c4,0x59389ebc),LL(0x4cb291a7,0x785d935b),LL(0x13e9ce08,0xfc2ae153),LL(0x4df6f1c4,0x3146fabf),LL(0xc87dd24c,0xa2a4a457), LL(0x1deb49bb,0x85fdd877),LL(0x9b055934,0x2b784370),LL(0x3e7e0297,0xc81d0501),LL(0xb92df904,0xb56ddd1f),LL(0x295ddccb,0x4612df9f),LL(0x0e27cf1d,0xc24bd4cf),
+ LL(0x422ea2c0,0x5564875b),LL(0x8285b03f,0xabc2e7de),LL(0x733e9f1f,0xfd662091),LL(0x68465da3,0x68f16745),LL(0x38fa6f63,0x965a0a05),LL(0xdfae710d,0x0ed70fee), LL(0x153b24da,0x56c6227f),LL(0x01470f6e,0xf1dcf574),LL(0xf51771cf,0x9992caa8),LL(0x14a9b029,0xa884b481),LL(0x7b9a4062,0xad11cbaa),LL(0xe55533e0,0x60ec99d8),
+ LL(0x18674f49,0x86d9b060),LL(0x97bb1a7d,0x81b06486),LL(0x27d9d64c,0x9b6e8e7c),LL(0xba04e6ad,0x79bd66ba),LL(0x828abbbe,0x77e4d0b0),LL(0xcc540d04,0xae7548ac), LL(0x869cbebf,0xf5d8a46f),LL(0x38a6cc83,0x99fb1a63),LL(0x563fe6b4,0xb93bb852),LL(0x97cdd04f,0x06bb3ae9),LL(0x8b7de47d,0x07f011d4),LL(0xde78f61c,0x8d90e2e4),
+ LL(0xd33cb6e2,0x731c6dd6),LL(0x8cce0290,0xa3ea317e),LL(0x1c42206e,0xdca9b2f9),LL(0xd1e5dfd9,0x6acbbce9),LL(0x2fc948cd,0x40745846),LL(0xa82f9cec,0xc7a50d91), LL(0x4c1aa161,0xb906d69e),LL(0x0ebe948e,0x3a9b14be),LL(0xb63aeb70,0x11a9f12c),LL(0xead745f2,0x0365b4cc),LL(0xf9f16c17,0x5f6c2bbd),LL(0xa03e558e,0x89131238),
+ LL(0xd1944d1b,0x7830460f),LL(0x84350af2,0xc56f08e7),LL(0x307d9c78,0x73bee2aa),LL(0x5aad8b6c,0x1b02af1b),LL(0x03848db5,0x5e318827),LL(0xf230f476,0x4785958b), LL(0x4f80e25d,0x4ea6535d),LL(0xd23c7f72,0x9958c9c7),LL(0x2fd33cab,0x4c197b33),LL(0xc566914f,0x24c7b0b1),LL(0x71952d3b,0x956ce3c3),LL(0xfabae5f2,0x8735694b),
+ LL(0x40ec913c,0xde37ae28),LL(0x056685b3,0xdc915f83),LL(0xf66a4501,0xf7bc3488),LL(0x6a900e5f,0x30e61042),LL(0xca3cf645,0x505525c1),LL(0xb1f3ed40,0x35338c53), LL(0xd70b7c41,0x6823159a),LL(0x7384ba7c,0x660f518a),LL(0x2482056b,0xc6cf6a4b),LL(0x1df15990,0xb308b215),LL(0xfb5c130b,0xba63b2e3),LL(0x277b7515,0x1c660db8),
+ LL(0xfddc9fdd,0x8a95e5c1),LL(0x5adab0c3,0x679d4e0f),LL(0xcda40bc0,0x1859df6a),LL(0x8234471d,0xf9097aa5),LL(0x783c0100,0xaddc0c9b),LL(0xfeb7067c,0x55388dc8), LL(0x80a2eac7,0xe3805fd1),LL(0xec886879,0xf800a75c),LL(0x1943a0a0,0xa4599992),LL(0x1dfe627e,0xb47f0619),LL(0xda06515f,0x313d4f09),LL(0x1f54a73e,0xde26052d),
+ LL(0x6827365d,0x85a1b879),LL(0x667debe8,0x595a6915),LL(0x93a3d50f,0x214670fb),LL(0xb37de08e,0x9dfb028e),LL(0x9c6cf2a9,0xdd077e2f),LL(0xc9b96e8e,0x96897d8f), LL(0xefd39543,0xe6e93c07),LL(0x4454e73d,0x19dcdaa4),LL(0xd7b8c758,0x4a67424f),LL(0xb1e91e2a,0x03d4de0d),LL(0xe887b6b6,0x7c843988),LL(0x6ffdcfff,0x7db4f3da),
+ LL(0xd8bb43ec,0x0db87bc3),LL(0x13a7b669,0xbf71d27c),LL(0xa3fd2a60,0xea81e9c4),LL(0xc9f017e5,0x190c9c71),LL(0xbcc75768,0x21864180),LL(0x43dbcde6,0x137bd615), LL(0x5d468ff5,0x5b090c71),LL(0x126c6bc6,0x3a622b60),LL(0xa918bf24,0xfef3d268),LL(0xae204f49,0xe10c52c8),LL(0x86d7c356,0xf4be898d),LL(0x2fdb5a17,0x8276da18),
+ LL(0x7f2ad562,0x89c992af),LL(0xafc83ad3,0x7e1459d9),LL(0x9278dd04,0x4c0d9681),LL(0xd8eebe36,0x4496d9a7),LL(0xb8d4b1a2,0x7c037261),LL(0xbad3d6d7,0x827c49a5), LL(0x836926ae,0xf4d94deb),LL(0x4064af58,0x65417bf6),LL(0xfcdafc9f,0xa79471ac),LL(0x8123312d,0x3f85ccb4),LL(0xa3360be4,0x4d374cad),LL(0xee325a2b,0x56b476d6),
+ LL(0x41af8c08,0x0079c69d),LL(0xacbe515e,0x7dcfa4f4),LL(0x01396859,0xb8d18666),LL(0x946fbedd,0x08590ca4),LL(0x641aace4,0x7fecd9b9),LL(0x2936a1b6,0xaad5cc44), LL(0xf92c5958,0x925b6235),LL(0x82d6231e,0x7b1442f1),LL(0x8c6fb34a,0x971e663d),LL(0x2fc1c10d,0x543146dc),LL(0x0642b822,0x6e4053c7),LL(0x492e524d,0x4a49f247),
+ LL(0x17ba53f1,0x1b51f7b4),LL(0x3d5c43bf,0x170ff1eb),LL(0x681f7ee7,0xc2f160f8),LL(0x47814310,0x4c0a54d0),LL(0xa83d061c,0xfc689a13),LL(0x7ff6333d,0x1cbc99b4), LL(0x6581cd16,0xe19fd790),LL(0x9ca37b0c,0x67da79c7),LL(0x63bd0b5c,0x2507d167),LL(0x1befb82b,0x4449985b),LL(0x914699ec,0x6bea3969),LL(0xef202abb,0x9f606dd4),
+ LL(0x597bd10e,0xca9872e1),LL(0x4aed951f,0x6725cc9a),LL(0x4e05b280,0x96b17cb8),LL(0xfa234d45,0x97987146),LL(0xbb35a7d8,0xba78949e),LL(0x6fc59384,0xb82e9b9f), LL(0x70f165c7,0xa303e54a),LL(0xb9c2cad9,0xfd6bb0dc),LL(0xee722045,0xe57e2de8),LL(0x63e27035,0xa05c1065),LL(0x02d2fe6f,0xaa38e866),LL(0xee2f6aad,0x78e02fa8),
+},
+/* digit=48 base_pwr=2^240 */
+{
+ LL(0x5e3c647b,0xc0426b77),LL(0x8cf05348,0xbfcbd939),LL(0x172c0d3d,0x31d312e3),LL(0xee754737,0x5f49fde6),LL(0x6da7ee61,0x895530f0),LL(0xe8b3a5fb,0xcf281b0a), LL(0x41b8a543,0xfd149735),LL(0x3080dd30,0x41a625a7),LL(0x653908cf,0xe2baae07),LL(0xba02a278,0xc3d01436),LL(0x7b21b8f8,0xa0d0222e),LL(0xd7ec1297,0xfdc270e9),
+ LL(0xe2a07891,0x4f120aa7),LL(0xa25d3225,0x9158bab3),LL(0xcfe5f7a8,0xc96bac5e),LL(0xbbf3cec6,0xd4e73d59),LL(0x60361cd5,0xed8d2335),LL(0x562f444c,0x9b1a252c), LL(0xc70f23c2,0xbd37d3cf),LL(0xa52ea19e,0xf13b3b6e),LL(0x3d2f41ed,0x7e35535a),LL(0xe8b1743e,0x0353b52e),LL(0x7b5a2765,0x31d89dfd),LL(0x8d9ea8b8,0x2b7ac684),
+ LL(0x9f101e64,0x06a67bd2),LL(0xe1733a4a,0xcb6e0ac7),LL(0x97bc62d2,0xee0b5d51),LL(0x24c51874,0x52b17039),LL(0x82a1a0d5,0xfed1f423),LL(0xdb6270ac,0x55d90569), LL(0x5d73d533,0x36be4a9c),LL(0x976ed4d5,0xbe9266d6),LL(0xb8f8074b,0xc17436d3),LL(0x718545c6,0x3bb4d399),LL(0x5c757d21,0x8e1ea355),LL(0x8c474366,0xf7edbc97),
+ LL(0xc46db855,0x73457010),LL(0xdd579fb8,0xccb68c43),LL(0x9c25fe5b,0x705b0e8c),LL(0x82dd0485,0x40f36ea1),LL(0x27ac2805,0x3d55bc85),LL(0xad921b92,0x15177c6f), LL(0x5ab18cab,0x51586cd5),LL(0xcbb4488c,0xf51b5296),LL(0x84f0abca,0xbb4e605e),LL(0x772dd0da,0x354ef8e3),LL(0x5e4e1d41,0x7f1a8f79),LL(0xde5d8491,0x93461f09),
+ LL(0x6ea83242,0xec72c650),LL(0x1b2d237f,0xf7de7be5),LL(0x1819efb0,0x3c5e2200),LL(0x8cdde870,0xdf5ab6d6),LL(0x92a87aee,0x75a44e9d),LL(0xbcf77f19,0xbddc46f4), LL(0x669b674d,0x8191efbd),LL(0xed71768f,0x52884df9),LL(0x65cf242c,0xe62be582),LL(0x80b1d17b,0xae99a3b1),LL(0x92de59a9,0x48cbb446),LL(0x2dcb3ce2,0xd3c226cf),
+ LL(0x9311182c,0xf3899558),LL(0xb657a7b7,0x1bee4c4b),LL(0x2df8d1a7,0x0b1c4fd3),LL(0x76d3fbbf,0xf16bcc23),LL(0xf4fd52bc,0xd5888916),LL(0xd5cde1f0,0x3de6cfb4), LL(0xd4a07dfd,0x764ffffd),LL(0xe2642182,0x5e674426),LL(0xccd57b85,0x34f64762),LL(0x29351062,0x2233a4c3),LL(0xd9c642f3,0xdf076095),LL(0x59f0df34,0xac917a2c),
+ LL(0x9fd94ec4,0x9580cdfb),LL(0x28631ad9,0xed273a6c),LL(0xc327f3e7,0x5d3d5f77),LL(0x35353c5f,0x05d5339c),LL(0x5c258eb1,0xc56fb5fe),LL(0xedce1f79,0xeff8425e), LL(0xcf83cf9c,0xab7aa141),LL(0x207d6d4f,0xbd2a690a),LL(0x458d9e52,0xe1241491),LL(0xaa7f0f31,0xdd2448cc),LL(0xf0fda7ab,0xec58d3c7),LL(0xc91bba4d,0x7b6e122d),
+ LL(0x775f516f,0x3bd258d8),LL(0xc715927f,0x4bedebd5),LL(0xe3f966a0,0x5b432512),LL(0x709d0c2d,0x338bfca7),LL(0x49658259,0xd142cc10),LL(0x636b8023,0xfabc6138), LL(0x4d4ef14d,0xa9ef9401),LL(0xc54c570c,0xd5917ac1),LL(0x5cb64487,0xfd2f63c5),LL(0x1cea475b,0xbae949b1),LL(0x1e67a25f,0xa4544603),LL(0xdc6a7a6a,0xa547abc1),
+ LL(0xb1b48156,0x2a2dedaf),LL(0xbb93db87,0xa0a2c63a),LL(0x08acd99e,0xc6559078),LL(0xfe4ac331,0x03ea42af),LL(0xeb180ed6,0x43d2c14a),LL(0xb1156a1a,0xc2f293dd), LL(0xa9d81249,0x1fafabf5),LL(0x9a8eee87,0x39addead),LL(0x119e2e92,0x21e206f2),LL(0xd74dceb6,0xbc5dcc2e),LL(0x0a73a358,0x86647fa3),LL(0x2f53f642,0xead8bea4),
+ LL(0xb12c4bb1,0x158d814d),LL(0x2f0cf4fa,0xe52f75d2),LL(0x6141b59c,0xf106023e),LL(0xbeb9d941,0x5eb8b8eb),LL(0x90cf579c,0x1dd39729),LL(0x69ee6efa,0xb273252e), LL(0x3e9947a0,0xe43a3c59),LL(0x6c19dd01,0xd605124f),LL(0x05c578b0,0x8090fdbd),LL(0x622ff18c,0x8e6c535a),LL(0x57d12071,0x3600b0c2),LL(0x78d001d7,0x6d026e5c),
+ LL(0x91c09091,0x636225f5),LL(0x71bdcfdf,0xccf5070a),LL(0xb9668ee2,0x0ef8d625),LL(0xb5e04e4f,0x57bdf6cd),LL(0x7c75ea43,0xfc6ab0a6),LL(0xf7fd6ef3,0xeb6b8afb), LL(0x2a3df404,0x5b2aeef0),LL(0xb9823197,0x31fd3b48),LL(0x83a7eb23,0x56226db6),LL(0x5bb1ed2f,0x3772c21e),LL(0xcd1aba6a,0x3e833624),LL(0xac672dad,0xbae58ffa),
+ LL(0xdaff1807,0x00e0a003),LL(0x92c94fd0,0xcb9d1559),LL(0xcebbf905,0x3c2b5c3d),LL(0xd338afa9,0x9c799ec7),LL(0x4e2cfccc,0x60b9908c),LL(0xae3c6f92,0x4bfe1a57), LL(0xfb116150,0x480d310e),LL(0xe3e7888e,0xa1ed6c31),LL(0x720b5196,0x841a11d9),LL(0x8adff37d,0xcc337d17),LL(0x5faa86c5,0x08c66826),LL(0x9dfcc7ad,0x945c90d4),
+ LL(0x31ba1705,0xce92224d),LL(0xf0197f63,0x022c6ed2),LL(0xa4dc1113,0x21f18d99),LL(0x03616bf1,0x5cd04de8),LL(0x9ff12e08,0x6f900679),LL(0x48e61ddf,0xf59a3315), LL(0xb51bd024,0x9474d42c),LL(0x9051e49d,0x11a0a413),LL(0xdce70edb,0x79c92705),LL(0x34198426,0x113ce278),LL(0xea8616d2,0x8978396f),LL(0xea894c36,0x9a2a14d0),
+ LL(0x8e2941a6,0x9f9ac960),LL(0x2fc4fe1e,0x43e7ff90),LL(0x6033e041,0x5ec41359),LL(0x6f6ff0f3,0x5ce791c4),LL(0x9d907343,0x8d134b89),LL(0x86304df2,0x7bd15c77), LL(0x77c4a913,0x2cd2ebc7),LL(0x45f07153,0xcd86a39d),LL(0x88bc423b,0xe7e12d2e),LL(0x0b3163f4,0x478e814b),LL(0xbe8ec766,0x78bd9c8a),LL(0x7709ce48,0x6a5763e8),
+ LL(0x604f6e4a,0x4f1e1254),LL(0x0187d585,0x4513b088),LL(0x19e0f482,0x9022f257),LL(0xe2239dbf,0x51fb2a80),LL(0x998ed9d5,0x49940d9e),LL(0x6c932c5d,0x0583d241), LL(0xf25b73f7,0x1188cec8),LL(0x3b3d06cd,0xa28788cb),LL(0xa083db5a,0xdea194ec),LL(0x22df4272,0xd93a4f7e),LL(0x6a009c49,0x8d84e4bf),LL(0x3e3e4a9e,0x893d8dd9),
+ LL(0x8d095606,0xd699ea2d),LL(0x1e0ddd3a,0x3cd080c5),LL(0x66a8b35b,0x46604bad),LL(0x4233fccb,0x0c779b62),LL(0xbfd3cf0c,0x578458ac),LL(0x96bf57af,0x6820f665), LL(0xbf1f302c,0xa9724245),LL(0x277a6c3e,0xbbde24da),LL(0xc6be8c14,0x0980a5b8),LL(0x774d62c4,0x6230e3ec),LL(0x4fbde24b,0xda1467d8),LL(0xcc862204,0xd9d68d07),
+},
+/* digit=49 base_pwr=2^245 */
+{
+ LL(0x7378f90d,0x67c51634),LL(0x66647082,0xbc201a79),LL(0x9ee450cf,0x77fcc8dc),LL(0xb41a3e2f,0x8dd2b318),LL(0x93bf0689,0xdf6a935e),LL(0xa92e5464,0x75edabf3), LL(0x604d208a,0x49afcd9f),LL(0xd465ca48,0x372f0ea7),LL(0xc7ea7810,0xcdbd8ad2),LL(0x550822b2,0xfe61571e),LL(0x86606adc,0x744a4f93),LL(0xd9d4e110,0x6beb3c9c),
+ LL(0xe700b9f2,0x1fef389c),LL(0x425bc8ab,0x63029466),LL(0x37f04a33,0xbd770a14),LL(0xd0169369,0xc7438e29),LL(0xe2377cc3,0x6b265742),LL(0xc369fa4f,0xdf24bf96), LL(0x0ad94e08,0xdfdbcf47),LL(0x7f75a7dc,0xd101b861),LL(0x2a9c483c,0x5574a0b8),LL(0x2de43228,0x0563fe94),LL(0xead1fabe,0x58ca0e8a),LL(0x66023966,0xdc3d9a84),
+ LL(0xc3fd20e5,0x383bda07),LL(0x5c29449b,0x9619b1df),LL(0x369f39bf,0x6f3c717d),LL(0x1a5a3900,0x1bb593d1),LL(0x2aec6c2b,0xd0f07ecc),LL(0x4240b202,0x9d72eb2a), LL(0xc50e4a0c,0x35342f6c),LL(0x6b93bf61,0x701b4662),LL(0xccb6a888,0xfcd6eb09),LL(0x85aa42c5,0xabb7a6f7),LL(0xaa4e5895,0x952f8824),LL(0x5c406582,0x49860db8),
+ LL(0x3955812b,0x3667a720),LL(0x284d1dac,0x0d73483b),LL(0xfc62f791,0xe084535e),LL(0x389faf7f,0x5bc1652b),LL(0x3a71b7f6,0x40cf5168),LL(0xd4f39703,0x8a4b19fa), LL(0x2a8eff13,0x823e754a),LL(0xbffa5afc,0xf01b2021),LL(0x7225b319,0x5639ee02),LL(0xfc282f16,0x7533bc86),LL(0xc69f61ae,0x710009d2),LL(0xbf65e803,0xe30c499d),
+ LL(0x734b4ec3,0x0da7ac1b),LL(0x12a2afbe,0xf47fc1d0),LL(0x87dce4a2,0xbbbc99be),LL(0xdd5c6378,0xf7264b4e),LL(0xf618ffdc,0xe9409305),LL(0xd1846ac1,0xafadda9b), LL(0xa21850d4,0xe734f9d0),LL(0x8722a316,0x199cb44f),LL(0x38cae89f,0xcfe8704b),LL(0x6b151b57,0x2db1e56b),LL(0x69ce7b2c,0x116ca5cf),LL(0x57de97c8,0xe9b8625f),
+ LL(0xaf247c49,0x18811bd5),LL(0xe124dbda,0xbc180793),LL(0x21234fc4,0xed978d3a),LL(0x0616ae15,0x516dd9a7),LL(0x74e430b8,0x8f806777),LL(0x06e8fc49,0x90942569), LL(0xa4e61235,0x4ca03fb5),LL(0xb617f361,0xb91de709),LL(0x0ed08bc3,0x0898d82d),LL(0x8cb08146,0x2bd71236),LL(0xe213176d,0x45b92d45),LL(0xf2bf5b9c,0x05894791),
+ LL(0x2695ea2b,0x0d79cb89),LL(0xc88e538a,0x2cb0f8df),LL(0xa80f36fe,0xc1b8dc3d),LL(0x84f00cc2,0xd756fa66),LL(0x9cb9efb2,0xa6f1cdec),LL(0xa6a21818,0x5c3f15a8), LL(0x6995d09f,0x9a7ee351),LL(0xd70434bf,0x88885463),LL(0x4f7d5d33,0x18cecc6d),LL(0x6b353bd1,0x3f013886),LL(0x0d9ad368,0x53bf798b),LL(0x28dbc3ee,0xeffd465a),
+ LL(0xb5d98ac1,0xeb29e44c),LL(0x0e227a4f,0xe47e57f8),LL(0x3d2bf688,0xd09c0494),LL(0x47428dd2,0x3ab7799a),LL(0xe9aafac8,0xdc558d6b),LL(0x87f9f6e0,0xc042c4cd), LL(0x89fb4693,0x93842bcd),LL(0x7068fbf7,0x62dbc82f),LL(0x7e6d47b5,0x16455268),LL(0x4c37eeee,0xab304b7a),LL(0x3fc412ce,0xdbb3d4e1),LL(0xa726a2c8,0x4f65dad0),
+ LL(0x605cdaee,0xb25e01b2),LL(0xbc57969d,0x74abec55),LL(0xcdd9d41a,0x9c57bfab),LL(0x4a9e32a3,0xa3330e3f),LL(0xe5792fd8,0x5929a0d8),LL(0x71ea2cde,0x830b4ea2), LL(0xfd06d246,0x80065ac1),LL(0x32e64a25,0xa2b416e6),LL(0xc0c927a9,0x3950bde7),LL(0x679d9b8c,0x9951f3bd),LL(0x651b6855,0xc235a274),LL(0x5ad97bc1,0xbfe5e08e),
+ LL(0x744ae145,0x4409a5b6),LL(0x7f620908,0x5e83fa0b),LL(0x2e140aa0,0xfc489bec),LL(0xe3cae337,0x5805a462),LL(0xc2211c21,0xe56e9ff7),LL(0x0c955362,0xb722f2b4), LL(0x41371f33,0xb098a32f),LL(0xbb4923d6,0xe6ccecea),LL(0xd82a311c,0x1cfbe2b3),LL(0x6b98f917,0xcf942893),LL(0x92ef848c,0xd60dc624),LL(0x5adb5228,0x34af446e),
+ LL(0x796ce1ca,0x0eb7e743),LL(0xd851377c,0x138653e5),LL(0x2b11c8e0,0x69c7c86f),LL(0xcdf2b205,0x878ec1de),LL(0xae0e8562,0x03e6688a),LL(0x935a36a8,0x20810666), LL(0x26635c50,0xc8ab7c7f),LL(0x744a21db,0xe75cdb06),LL(0xd720e198,0x4e26f32f),LL(0xd8cded81,0xa1c6395a),LL(0x6ce4fc04,0xb75dc6ea),LL(0x004623b5,0x71750b33),
+ LL(0x7e60c447,0xbdef8407),LL(0x2a65acca,0x88570f71),LL(0x0bb6aa79,0xef3d4a40),LL(0x60212976,0x5c9d1890),LL(0x1d96c43c,0x80179ea2),LL(0x53d2948e,0x3f002e6d), LL(0x49d78183,0x14b2cc91),LL(0xb496c279,0x7a549c71),LL(0x44995f6d,0xf4beac3f),LL(0x00bc78fe,0x5a342398),LL(0x60e42da0,0xa874dc1b),LL(0xcf5824d5,0x3a984010),
+ LL(0xdfb9760c,0xe514ee06),LL(0x77b8951f,0xb8862d75),LL(0xf8ee1141,0x0144676e),LL(0x02eb3e82,0x49561a30),LL(0x4ff9f897,0xb3541c15),LL(0xa7a99791,0x1670edf0), LL(0x64aea7f9,0xd41d6035),LL(0x2b3463b4,0xf66ffd09),LL(0xc3b26fb6,0x0784e015),LL(0xec46f8c8,0x88edce33),LL(0xb6381011,0x1b1e25a3),LL(0xff95ab97,0xbfaadc03),
+ LL(0x0c7be4e1,0x727a59fe),LL(0xf58ced15,0x75a7d5e3),LL(0x90f569e7,0x146fc0d9),LL(0xb7f1dc54,0x94dbccd2),LL(0xb75bf232,0x0df1ef90),LL(0xa2568190,0x2943a082), LL(0x67837b06,0x75f2f80d),LL(0x24b44b6e,0x07e3506f),LL(0xd0d2231b,0x7c30829a),LL(0x93277abf,0x9ce577ca),LL(0xb17549ec,0xa19d1868),LL(0x25e8c4d7,0x0ad6ff55),
+ LL(0x1c24d075,0x16b38dfe),LL(0x992959f6,0x3acd4c36),LL(0xac2da7ab,0xdaf2fe88),LL(0x89644935,0x76e8ff0e),LL(0xe85f7076,0xb8547c26),LL(0x1cdea7ce,0x9f149faa), LL(0x9e125d84,0x181a6072),LL(0x18751ce6,0xc4aef9fa),LL(0x0e00f00a,0x451c8466),LL(0xc4e3e6b8,0x662b3e7a),LL(0xc6b64507,0x57b7114e),LL(0x0b37fb70,0x07aeb198),
+ LL(0x4516234a,0x79d88e00),LL(0x31f9ceda,0x98dd3cb9),LL(0xce7d606e,0xb528000f),LL(0x2fa27fd3,0xc773557e),LL(0xe19436af,0x55b53dd3),LL(0xe10b64c7,0x675084b3), LL(0x56d56374,0xe5832665),LL(0x307e2e60,0xf8f7fd2a),LL(0x7af3e3dc,0x7b93bf53),LL(0xf47d298c,0x94fafa2c),LL(0x21121369,0x94c2ff9a),LL(0x33468ff6,0xa41de95f),
+},
+/* digit=50 base_pwr=2^250 */
+{
+ LL(0x1b270599,0xbe45d81a),LL(0x97d6c603,0x50696e7d),LL(0xb078ea89,0x63c5a516),LL(0xb4464764,0x9f3efe41),LL(0x101e5232,0x84580e24),LL(0xc8ae8220,0x00850a1a), LL(0xed55c404,0xbff4077d),LL(0xf2e7bf50,0xd74de734),LL(0x07e1c03d,0x4df4eef2),LL(0x6e654d58,0x4ab3d039),LL(0x086f1596,0xb20056cd),LL(0x8acd7cd5,0xe4d08a27),
+ LL(0xc90b13f5,0x8cd6c9f7),LL(0x52a9d469,0xec0c187d),LL(0x89b8ad2b,0x9c0db0f5),LL(0x0d9c999d,0x692a8db7),LL(0xc9f84ab4,0xa407fd03),LL(0xcc9a906c,0xa5742fd1), LL(0xc8e72867,0x4813a765),LL(0xe2e9a10f,0x9c65943d),LL(0x4fa0a23e,0xca6bf293),LL(0xcb1f8d7a,0x1dfa3af7),LL(0x98d10c53,0x28036f54),LL(0x0e012c13,0x7bfbcaf2),
+ LL(0x893e8032,0x2d9513a9),LL(0xf4688db4,0x49257f7a),LL(0x3af4d9ac,0x73d8b12c),LL(0x48a13c4d,0x903dc9fa),LL(0x60709433,0x6190753e),LL(0x49387d24,0xa093364e), LL(0x3b261e16,0x0436949e),LL(0x4a3055b6,0x96db3b27),LL(0xe85dfe23,0x514eacc7),LL(0x5d8805c9,0x1538b25c),LL(0x664a20f6,0xd4c6b75b),LL(0x4753292d,0xd1984f21),
+ LL(0x4ec177f6,0xa53f1a10),LL(0x3faa5ca8,0x4a2ef9aa),LL(0x32976d13,0x30efed85),LL(0x5ee692d1,0xcf5ada16),LL(0x259e7cc1,0x3ceda69d),LL(0x9baab472,0x2aae29e9), LL(0x737cc8bc,0x7ee5baef),LL(0x7fe68ded,0x1717af74),LL(0xcfdaff63,0x9e5c8dda),LL(0xcec07693,0x575c8db9),LL(0xfdfb509d,0x9afc8ae0),LL(0x85651697,0x27836d36),
+ LL(0x85e79c26,0x9d152839),LL(0xd36ab6f7,0x8d87faad),LL(0xa87afe15,0x08d4fe09),LL(0xfab81fd4,0x1e10b10f),LL(0x93c98a84,0x3cbd17d3),LL(0x246ceed3,0xbd40a4e8), LL(0x9a09d134,0x582d9de0),LL(0x4ee37dec,0x120440c2),LL(0x2f1073e4,0x4d4ff934),LL(0xf45e648d,0x7da76757),LL(0xebcbb80b,0x4427a608),LL(0x30e661a7,0xc6bccb54),
+ LL(0x135e2a30,0xb7b7628f),LL(0xb526fa7b,0x863552c4),LL(0xe0e30451,0x6ec18d05),LL(0x5769db60,0x1b36c93a),LL(0x170c236c,0xf0fe0007),LL(0x66130046,0xeceb540c), LL(0x3fc4bdbe,0x86a7a74d),LL(0xfbae3320,0x066b097b),LL(0x6e5c21ae,0x78fb5247),LL(0xe1adf398,0x3e19e9fc),LL(0x1a32a745,0x429b9cbd),LL(0x36d1a2b8,0xedd2c40f),
+ LL(0xceeaeed7,0x993ca8a9),LL(0x62545429,0xb2d28681),LL(0x91cf32d4,0x24003737),LL(0xd88bd4f0,0xda9ef96f),LL(0xe1b2d52a,0x916a4947),LL(0xf31b107c,0x5ef7f9d0), LL(0x62d3d3cb,0x3c424ba8),LL(0x7c3c3bba,0xab155cc2),LL(0x4bae8070,0x6a0404b2),LL(0xdf36677c,0x5f3d0592),LL(0x9a0e4800,0x7c9f2bef),LL(0x97959a09,0x6babbcb4),
+ LL(0x17eb9264,0xa7342f95),LL(0x0a8a6eef,0x9264a6a0),LL(0x7471c384,0x50e48bf0),LL(0x30827f34,0x729e5ab1),LL(0xea779c23,0x17199191),LL(0x9fa9fd58,0xd13ab853), LL(0x3b1d773e,0x7d579937),LL(0xd196c3df,0x65f8e7c6),LL(0xe8541725,0x253f7d51),LL(0xec720355,0x107a793d),LL(0x6aa16268,0x1c14d056),LL(0x8bbb231b,0x9dc5fca3),
+ LL(0x897a05a4,0x69935431),LL(0x51eaa290,0x34397b68),LL(0xf58fb7a5,0x90ec1a37),LL(0x50c4d76b,0xf10d0783),LL(0xcc47f990,0xeb9db48c),LL(0x0cea5865,0xef0b97a2), LL(0xd9f94396,0x04708d6f),LL(0x41c21452,0x82ff5771),LL(0xdbb65bdd,0x772d8493),LL(0xddf73c8c,0x561abc8b),LL(0x9830ff05,0x98a56463),LL(0x9f0d4cad,0x73e28296),
+ LL(0x589cb234,0x7fa7064e),LL(0x65ca4f3c,0xdfa4e846),LL(0x792d5254,0x476b6618),LL(0x583bdaeb,0xc0ce93bc),LL(0xe4ab5dc9,0x30b11dac),LL(0xf5c89e2f,0x237a64e5), LL(0x7dba60b7,0x54339fad),LL(0x084b09ed,0x0072505a),LL(0xb140717a,0x5e89c81f),LL(0xb407595d,0xd56de3a2),LL(0x0aab0d25,0x9f3a6c42),LL(0xa685543d,0x6c2aa69d),
+ LL(0x6cd00d89,0xda5fcddc),LL(0xac9ef99d,0x0b8c3feb),LL(0xa19298e3,0x16569ca8),LL(0x2783ac1d,0x5d998d56),LL(0xc18ecbdf,0x298c681c),LL(0xe6e13de4,0x209323d1), LL(0xbd75118d,0xe064255e),LL(0x43f945ef,0x78f69fd3),LL(0x95e6ff8f,0x9a4d591f),LL(0x3b378848,0xfa621d46),LL(0xe4d12bb8,0x4c951f31),LL(0x00ebfea6,0xefe8d01b),
+ LL(0x12b09f53,0xf5689c5e),LL(0x9e87ff7d,0xc1da32e1),LL(0x12eaa533,0x1af879d0),LL(0xd9271e94,0xdba775e6),LL(0x10e63c34,0x60f85073),LL(0xa686a24b,0x445f3e21), LL(0x15bc277e,0xed5ca8fa),LL(0x364ab7ab,0x9839198a),LL(0x6d90a7d4,0xe2ee3942),LL(0xccd37e76,0xe5b3e4cb),LL(0xf1412e0f,0x9013bd08),LL(0xce999048,0x82f5c532),
+ LL(0xf4bbf123,0xdd7ff816),LL(0xde3e9923,0xbf1a5fd0),LL(0x68d10f94,0x8c388f8c),LL(0x45057388,0x4e9cf0c4),LL(0x8d010855,0xcff64aa3),LL(0x7d8f55fc,0x4b639596), LL(0xbddc00c5,0xca314522),LL(0x3da89cfa,0x95482d72),LL(0x9eb9a710,0xb9bf18b8),LL(0x4651cc5d,0x0936a88e),LL(0xf59d0f45,0xec20ac01),LL(0x8ba74374,0x011a4868),
+ LL(0xf9c4caf8,0x07252272),LL(0x290ab63f,0x9b016799),LL(0x558d649d,0xeaa616bb),LL(0xa66d8089,0x00f2ef38),LL(0xf72863ae,0x284b0146),LL(0x1968cf45,0x9a207d77), LL(0xbdcbb689,0x33d7bac8),LL(0xe5348dae,0x393f34d5),LL(0x6f524620,0xeb86c8f1),LL(0x610689f8,0x62500c62),LL(0x6b7fa65e,0x66febc05),LL(0xfb836b3e,0x39c8a70b),
+ LL(0x5e4d0351,0xb91977b5),LL(0x9e8dddf7,0xd8ed39aa),LL(0x9d1b25c3,0x9ae994c2),LL(0x6ca7b19b,0x7369e189),LL(0xec0d7c2c,0x33deb695),LL(0xede6435b,0xddcc6250), LL(0x145a654d,0x44b7ba23),LL(0xd280567e,0x653ee81a),LL(0x0a39d324,0x7694c972),LL(0xe97e1710,0xf0af25b1),LL(0x3ee1a076,0x6e154646),LL(0x7ccfde8c,0x062ce983),
+ LL(0xf3fe3441,0x61d0e01b),LL(0x2af47609,0x674e5233),LL(0xb362902d,0xd4a4e224),LL(0x9e0a5d16,0x45923c12),LL(0x95e580e9,0x4fc2bdd4),LL(0xa8c3d954,0x6d1d974c), LL(0xd0bbeaaa,0xaeff1135),LL(0x1baafc9e,0x013ab5b3),LL(0xab8f9f31,0x80907d3e),LL(0x6d566c15,0xaf2c1216),LL(0x952e6fa7,0x0082daba),LL(0x2df9e03a,0xa4671003),
+},
+/* digit=51 base_pwr=2^255 */
+{
+ LL(0x1fd64063,0x5f79f0df),LL(0x81e118ec,0xd2d39dd3),LL(0x11571c5b,0xd631a68e),LL(0x2474faf7,0x6d072b4e),LL(0x862a924a,0x5e043a6d),LL(0xb0fc8d7a,0xcae58bd8), LL(0xb1351f28,0xf54bb7f3),LL(0x0413275e,0x4588b628),LL(0x5909ec04,0x81459f4c),LL(0xabd16460,0xd28cda25),LL(0x8db1c69e,0xbb676d01),LL(0xac5036f4,0xc0056e2d),
+ LL(0x44ce3ad8,0xdbe04c30),LL(0x4ce8aad5,0x995fbb1b),LL(0x70911457,0xdbf8b546),LL(0x3f7a1757,0x9e683b5b),LL(0x9c7bd62c,0x7b89a08a),LL(0x0b3fc97e,0x448865a4), LL(0x3bb01e94,0x0ac9abfc),LL(0x1e756124,0xa0776042),LL(0xd9deed97,0x0aa6c335),LL(0x72603e08,0xe270580f),LL(0x6c783bb2,0x70857a94),LL(0xcaa929ae,0xa0047774),
+ LL(0xb25c4d4a,0x292f8874),LL(0x7e79f526,0x54961fd8),LL(0x008c6ec9,0x949a1fae),LL(0x525524fd,0x6ae82f0d),LL(0x2edbcb1a,0xd1f6f4ef),LL(0x977ddffb,0x41617a6d), LL(0x1baf0668,0x6ae38fb7),LL(0xd538ab3c,0xa79ea228),LL(0xfc44e273,0x70babb05),LL(0xbca85910,0x247384fb),LL(0x6a564959,0xdc0e069b),LL(0x1a7438ad,0x37a9c552),
+ LL(0x8fa06859,0xf071c987),LL(0x1a52390b,0x0083e531),LL(0x61483bc2,0x845eb12a),LL(0x1caf6dd6,0x17471d80),LL(0xddc21b92,0x7b603616),LL(0xb992536d,0xd38fe0f6), LL(0x297c25a4,0x433f0652),LL(0xb1c4bf41,0x03d4d8fc),LL(0xa9adf49b,0xdf617386),LL(0x2cb2944f,0x4bfeb399),LL(0xb3d9c076,0xbf288427),LL(0x965b4576,0x17818c3e),
+ LL(0x689f43ef,0x2bb798ff),LL(0x5f26ec54,0x5813e441),LL(0x5005c929,0x51f64c49),LL(0x4b42e417,0x60e213a5),LL(0x62cc3734,0xc1528442),LL(0x09d994e1,0x6ecd6c3b), LL(0x83dd047f,0xa6e72f71),LL(0xb0019803,0x3836f663),LL(0x257493cb,0xbcf1265b),LL(0x9e62d78b,0x59b15ff0),LL(0x6cb92ecf,0xaac5ed5b),LL(0x9662651c,0x37e6ad7d),
+ LL(0xa17e560c,0xce23a19a),LL(0x62550e2b,0x6491b95f),LL(0x1d15a005,0xc7200012),LL(0xf4355a1f,0x15fde735),LL(0x607f7807,0x3849761f),LL(0x18204691,0xcbe322d0), LL(0xa95e8e91,0x75756e4e),LL(0x817a9b8e,0x365959fe),LL(0x3d4ce3dc,0x63123276),LL(0xf1d66e00,0xa769d2fe),LL(0xc28829e6,0x8624ddba),LL(0xd2df06ef,0x03274297),
+ LL(0x16f01d7b,0x52fced31),LL(0xdaf046aa,0x88c6b172),LL(0xfe7a338e,0x1a189403),LL(0x61798b1e,0x39741ecd),LL(0x2934b879,0x6a47b071),LL(0x828d1e9d,0x3b1a5dd1), LL(0x7f35a7ef,0xd4bd4848),LL(0xc1eebaf8,0x71774b5b),LL(0xd55344ba,0xa86471e5),LL(0x7b8a483a,0xfbf145f1),LL(0xaa53802c,0x70f9b214),LL(0x10b066e1,0x995af930),
+ LL(0x27a28f9d,0x9ec11597),LL(0xb847cd83,0x96f2c44b),LL(0x31fca111,0xacf794e1),LL(0x96076f45,0x438b9178),LL(0x51732588,0xad71035b),LL(0xa5d910da,0x2db32f32), LL(0xfe1cc184,0xefaad0e8),LL(0x2e00bbed,0x6f0360b5),LL(0x474ce326,0x99402426),LL(0x2aa270da,0xd53b687a),LL(0xd78fa6eb,0x96c8bb78),LL(0x6e699411,0xd07f3bba),
+ LL(0x361dae4c,0x07276886),LL(0x84c57896,0xb26f2579),LL(0x5f0c2bf4,0xe8b59ef5),LL(0xdd64aaac,0xf544c145),LL(0x9fdcb039,0xa9dc03bb),LL(0x58c44b72,0xeb1e9aeb), LL(0x1d6bf26e,0x39a4fe8e),LL(0xeaf8e241,0x2c4285cc),LL(0x14770f31,0x647ce584),LL(0x062f0912,0xe5bfeb70),LL(0xe8314467,0x7031db80),LL(0xd658d2cd,0xac970937),
+ LL(0xefe1757b,0x2dfc39e6),LL(0xb5d2cb93,0xab52fbf3),LL(0x313aa477,0x1cf12123),LL(0x9c6acbd1,0x785b025b),LL(0xe4d54177,0xb4aeb5b8),LL(0xd943c1ea,0xde3d28f8), LL(0x5b0b1921,0x7892db85),LL(0x58caff2d,0xc09ff903),LL(0x1cbd3231,0xbdee13c6),LL(0x00b6c34e,0x873e0a77),LL(0xe23de32b,0xb279505a),LL(0xc5a03302,0xf056ffdc),
+ LL(0x6ba563ee,0x0ac76959),LL(0xb9a51868,0x2053a5fb),LL(0x06178e3c,0x60e2555f),LL(0xc0933775,0x1bc99e72),LL(0xb7d5160e,0x4a2d31b2),LL(0x895d1db8,0x7cc03ff3), LL(0xee53e79f,0x98fb331e),LL(0x8583b893,0xc2f0a93f),LL(0x49802eb4,0x8fa79ed8),LL(0x55ce8dcd,0xe9548175),LL(0x1d4d44f1,0xb5155a21),LL(0x89570a82,0xbb044d28),
+ LL(0xe1f833e0,0x430b669f),LL(0x6d8127bd,0x1797ac3a),LL(0x4c33493e,0x01ad730c),LL(0xca00ed39,0x8c882c1f),LL(0xd24a5516,0xab2e9c89),LL(0xf5d0327d,0x21a49e0a), LL(0x58a280d1,0x46488bd8),LL(0x772ed759,0xfc4a1e8a),LL(0xaecfac7c,0xf9f60e90),LL(0xac6a9e8c,0x4afd1f5f),LL(0xc98bcda8,0x57a20bf8),LL(0x8b46b998,0xa1107ea0),
+ LL(0x45fc08c4,0xe931c21b),LL(0x3aca653f,0x13fad41f),LL(0xec1fe395,0xf28a3515),LL(0xcf55cc91,0x191a4f2d),LL(0x90535f59,0x46fb07b7),LL(0xd69686a9,0x76c60cc1), LL(0xc8122c04,0x1e7dec15),LL(0x1b72798c,0x0743fcf0),LL(0x1e5939fd,0xb10c96bd),LL(0x6e8338e5,0x261e6c0a),LL(0xe5cdaa43,0x56148d3c),LL(0xa031239a,0x3f004371),
+ LL(0x0db0c9c0,0x1f2f6c1f),LL(0xac770b5f,0xca4e1964),LL(0x569c090b,0x20dce4a6),LL(0xdb3986d0,0xe4f7401a),LL(0x85f553ea,0x13897994),LL(0x09026bff,0x119ad50d), LL(0xe265a0a9,0x88067aa7),LL(0x7f749167,0x209c62b4),LL(0x459bf269,0x84165019),LL(0x8b6e76f6,0xec125bd5),LL(0x1f0d2434,0xd636f932),LL(0x8e05e0b0,0xf6023a4c),
+ LL(0x65ea2b23,0x84c14e31),LL(0x19e93301,0xb68121be),LL(0xb25d9a83,0x9c1a873f),LL(0xd13773f0,0xafb9d04c),LL(0x51c32d57,0xd05014da),LL(0x0904efdc,0xff2e350b), LL(0xa0a01069,0x20bd7d22),LL(0x6c3b3fd8,0x3e74eb0f),LL(0xb743b72c,0x643ea531),LL(0x8e3ae785,0xa2fe7414),LL(0x92e8d320,0xb8fe89bf),LL(0x495f6d28,0x58985dc1),
+ LL(0x389283ba,0xfe1f11ad),LL(0x0cd91b22,0xc87e20b6),LL(0x3c5babf8,0x99d0015a),LL(0x5929ea0a,0x7e795b4d),LL(0x1dfb7b7e,0xc9cf6833),LL(0xa64992e8,0xc1c07346), LL(0x9889746d,0x0b7e0dd8),LL(0x1c43ea4a,0xa89d7b46),LL(0x34f02b96,0x64023cf0),LL(0x5662f0c8,0xf7dd410a),LL(0xa1058cca,0xa3bb6088),LL(0x4e7801ed,0xedb25dc3),
+},
+/* digit=52 base_pwr=2^260 */
+{
+ LL(0xdd93d50a,0x140a0f9f),LL(0x83b7abac,0x4799ffde),LL(0x04a1f742,0x78ff7c23),LL(0x195ba34e,0xc0568f51),LL(0x3b7f78b4,0xe9718360),LL(0xf9efaa53,0x9cfd1ff1), LL(0xbb06022e,0xe924d2c5),LL(0xfaa2af6d,0x9987fa86),LL(0x6ee37e0f,0x4b12e73f),LL(0x5e5a1dde,0x1836fdfa),LL(0x9dcd6416,0x7f1b9225),LL(0x677544d8,0xcb2c1b4d),
+ LL(0xda1c29ab,0x279fd119),LL(0x2b30d40c,0xbd068802),LL(0xda44105d,0xd8f57da4),LL(0x28223fe1,0xb1814b7a),LL(0xe06f2d2e,0xcf2fd241),LL(0x01dfde06,0x99003a02), LL(0xfded7e4b,0x876a31af),LL(0x2f725094,0x1efaf827),LL(0x493a6a0a,0x5117d608),LL(0xa88c03e7,0xdcec8088),LL(0xea916897,0xeae1d352),LL(0x6e8b2c57,0x8cdc2810),
+ LL(0x9c213d95,0x0254486d),LL(0xcb2f6e94,0x68a9db56),LL(0x000f5491,0xfb5858ba),LL(0x34009fb6,0x1315bdd9),LL(0xc42bde30,0xb18a8e0a),LL(0xf1070358,0xfdcf93d1), LL(0x3022937e,0xbeb1db75),LL(0xcac20db4,0x9b9eca7a),LL(0xe4122b20,0x152214d4),LL(0xaabccc7b,0xd3e673f2),LL(0xaed07571,0x94c50f64),LL(0xe66b4f17,0xd767059a),
+ LL(0x54e93c1e,0x09f8bb06),LL(0xad81e27c,0xb0045884),LL(0x076e13eb,0x26ebc7b6),LL(0x5d5ac07f,0xbda0b553),LL(0x48ab69e6,0xbcb81322),LL(0x1c0f21fa,0xd3847d2e), LL(0xc834d740,0x7a466528),LL(0xe0823ff2,0x6c67a79a),LL(0x4c1d7cb8,0x85dd1186),LL(0x2d081301,0x096f849f),LL(0x8a5ea0f0,0xb4f503dd),LL(0xd1bf69b2,0x71ee0889),
+ LL(0xdcd6d14b,0x40336b12),LL(0xe3b4919c,0xf6bcff5d),LL(0x9c841f0c,0xc337048d),LL(0x1d617f50,0x4ce6d025),LL(0x8117d379,0x00fef219),LL(0xf95be243,0x18b7c4e9), LL(0x38df08ff,0x98de119e),LL(0x8d772d20,0xdfd803bd),LL(0x0f9678bd,0x94125b72),LL(0x334ace30,0xfc5b57cd),LL(0xb7e86e04,0x09486527),LL(0x6e552039,0xfe9f8bcc),
+ LL(0x02a2d1e6,0x4ab7a22c),LL(0x1371d5a4,0x967e19a3),LL(0x078de336,0x20f59f95),LL(0xf7869245,0xfd28fa36),LL(0xcbf1d96f,0x1de42581),LL(0x366e1f0f,0x2e0127d7), LL(0x2258c741,0xbc65fa9d),LL(0xdd6d65f8,0x1f2f3356),LL(0x4a0822a9,0x06384f3a),LL(0xfd05a0aa,0x1c81332b),LL(0xd95ee3ce,0xbfb12361),LL(0x42016d00,0x180aaf06),
+ LL(0xd6f5a10e,0x3b75c45b),LL(0xc1c35f38,0xfd4680f4),LL(0xf8e0a113,0x5450227d),LL(0x73ddba24,0x5e69f1ae),LL(0x57f24645,0x2007b80e),LL(0x3d159741,0xc63695dc), LL(0x4530f623,0xcbe54d29),LL(0x2869586b,0x986ad573),LL(0x4cc39f73,0xe19f7059),LL(0x2b1b8da9,0x80f00ab3),LL(0x73f68d26,0xb765aaf9),LL(0xe993f829,0xbc79a394),
+ LL(0x95b3287d,0x0a159f62),LL(0x48cecad0,0xb18f8759),LL(0x1661a23f,0x6d1ab8ee),LL(0xc95c41b3,0xcae7f40e),LL(0x7c51eb56,0xbc3d2040),LL(0xe8754250,0xa7527283), LL(0x1f9e668a,0x81561056),LL(0x900f5912,0xb8aa7296),LL(0x6af2a00c,0xabdbc1bf),LL(0x2d0a56c0,0xe9a94254),LL(0x7bc8959e,0x4774a7b7),LL(0x19cef2f3,0x0a837ff0),
+ LL(0xf310d2a0,0x9c441043),LL(0xdc5eb106,0x2865ee58),LL(0x9cb8065c,0x71a95922),LL(0xa052af0f,0x8eb3a733),LL(0xb09d716e,0x56009f42),LL(0xabcbe6ad,0xa7f923c5), LL(0xfa375c01,0x263b7669),LL(0x21ef27a2,0x641c47e5),LL(0xb08ffd25,0xa89b474e),LL(0xf0a239f3,0x5be8ec3f),LL(0x242a6c5a,0x0e79957a),LL(0x0c6c75f5,0x1dfb26d0),
+ LL(0xa084fae6,0x36f3a3d8),LL(0x9a9b0d95,0x75983589),LL(0xcc80fcb6,0x70722186),LL(0x96d84c04,0xf28ed0c7),LL(0xffb63f90,0x95a32263),LL(0x98766034,0xdd7d60a0), LL(0x1d5c387c,0xe193a31f),LL(0xb8310f8b,0x6c5eca7e),LL(0xc083ff47,0xfe61d523),LL(0xcb2944e9,0x90c832db),LL(0x593334b7,0xa9f3f293),LL(0x2d7d1c33,0xe6cde2e1),
+ LL(0x9dfbf22a,0x2fd97b9b),LL(0x5643532d,0xdec16cc8),LL(0x60fee7c3,0xdf0e6e39),LL(0x545860c8,0xd09ad7b6),LL(0x73fc3b7c,0xcc16e984),LL(0x0d4e1555,0x6ce734c1), LL(0x4b5f6032,0xc6efe68b),LL(0x14f54073,0x3a64f34c),LL(0xac44dc95,0x25da689c),LL(0x5358ad8a,0x990c477e),LL(0xf36da7de,0x00e958a5),LL(0xc9b6f161,0x902b7360),
+ LL(0xf144b6cc,0xbd079cf1),LL(0xb4f4a764,0x7f86e29b),LL(0xf21f9cbf,0x5b08b290),LL(0x75e3aeb9,0xada0c85b),LL(0x6666c2df,0xd0789f8b),LL(0xd71ec2ec,0xcf5d8a8c), LL(0xe7e4364b,0x6f7780c3),LL(0x85d2eb75,0xdd9a6529),LL(0xd952a38e,0x8222f66b),LL(0x27260a29,0x9dd5f7eb),LL(0x57947178,0xce49b344),LL(0xcdda7e39,0xaa215f82),
+ LL(0x9347b90a,0x454ab42c),LL(0xa698b02b,0xcaebe64a),LL(0xfb86fa40,0x119cdc69),LL(0xc3109281,0x2e5cb7ad),LL(0xcd0c3d00,0x67bb1ec5),LL(0x83f25bbf,0x5d430bc7), LL(0x5cde0abb,0x69fd84a8),LL(0x9816b688,0x69da263e),LL(0x0e53cbb8,0xe52d93df),LL(0xadd2d5a7,0x42cf6f25),LL(0xc87ca88f,0x227ba59d),LL(0xda738554,0x7a1ca876),
+ LL(0x3004db31,0xaa44b286),LL(0xd43e4430,0x86f43d7a),LL(0xb0b0240d,0xdc4874cd),LL(0xadc45a06,0x79986a23),LL(0x3cee4631,0xbb275b44),LL(0x63a217aa,0x21daee8a), LL(0xd7b25c02,0x1e7c5397),LL(0xc5e668fa,0xe677d3cb),LL(0xed51b4bf,0xc7c84e28),LL(0x923e5408,0x7ca19e99),LL(0xc3f832e7,0xc6f8a595),LL(0x5fb049a3,0x2d0a789c),
+ LL(0x1cac82c4,0x3fa5c105),LL(0x8a78c9be,0x23c76087),LL(0x1c5cfa42,0xe98cdad6),LL(0x0a6c0421,0x09c30252),LL(0x42fc61b9,0x149bac7c),LL(0x3004a3e2,0x3a1c22ac), LL(0x202c7fed,0xde6b0d6e),LL(0xe7e63052,0xb2457377),LL(0x3706b3ef,0x31725fd4),LL(0x2b1afdbf,0xe16a347d),LL(0x8c29cf66,0xbe4850c4),LL(0x2939f23c,0x8f51cc4d),
+ LL(0x44922386,0x114a25c8),LL(0x6d4e8b57,0xdd084d44),LL(0x1e7bd7de,0xc49b6841),LL(0xd6da54db,0x5b0359fa),LL(0x3f0da321,0xa6e6e5f9),LL(0xd640a87e,0xb65ec55c), LL(0xae64020e,0xc1a4f6ce),LL(0x088e1337,0x91e29cd2),LL(0x3c0a631c,0xf44ceb8e),LL(0xb756445f,0x0205b11d),LL(0x5bc8880e,0x04844e84),LL(0xb85e00d3,0xb630ddc0),
+},
+/* digit=53 base_pwr=2^265 */
+{
+ LL(0xae7ce296,0xe76894c3),LL(0xa6cafc34,0x87737ee2),LL(0xe55cd1e6,0x566dfcfb),LL(0x3a7ad5b9,0x5421a9f2),LL(0x4687a4ef,0xa005838a),LL(0x23a2c423,0x3837219a), LL(0x8a82cd1b,0x4b780012),LL(0xc728b588,0x401c07be),LL(0x37ced8f3,0x2b5f69e9),LL(0x8c1e1eaa,0x306b621d),LL(0xd389cc4d,0x8acbbe71),LL(0xf4ab7774,0x922fa665),
+ LL(0xd35c2d80,0x2df6f242),LL(0x3493ce97,0xf65a99a9),LL(0x372bcc87,0x9e80232b),LL(0x6e428cc5,0x26ba13b8),LL(0x13a1b763,0x2526ef1f),LL(0xdc97c5f3,0xcef3edcd), LL(0xbde16b73,0x4954867f),LL(0x368ff6cb,0x9817813d),LL(0xbe143027,0x7e39fa69),LL(0xcf54f28b,0x12329463),LL(0x7597c2da,0xcf0991dc),LL(0x52e07099,0x0cda3969),
+ LL(0xee993749,0xdc9daeef),LL(0x7ff3d775,0xd40c8a54),LL(0xca53d53d,0x206d2271),LL(0x4d1aa50b,0xb0546335),LL(0x88001e99,0x52bca910),LL(0x17fb7aa4,0x25c117c2), LL(0x42685945,0xfff3af95),LL(0x8f4ce0fb,0x083fd4de),LL(0x24753989,0xaac004be),LL(0xe90950c6,0x4a5de2b6),LL(0x738efe5b,0xb46af0ab),LL(0xdb4459f9,0xcf80a17f),
+ LL(0xf303955d,0x412f64a3),LL(0xbd692593,0xe92bdca9),LL(0xc2e964e0,0xfbe6cdc2),LL(0x0011cb01,0xe9a3b1fd),LL(0xcf228f23,0x6c30762d),LL(0xbe9199a1,0x1270b84a), LL(0xe3c9cbb1,0x732711df),LL(0xd91d9513,0xa3aabe37),LL(0xc6eceba7,0x8ee08ba0),LL(0xf3c3d31d,0xb1711531),LL(0x3c716948,0x65060b63),LL(0x2ff2cadd,0x046b4ea1),
+ LL(0x961719fe,0xdeb7a462),LL(0x76ba6ed7,0x5e22796d),LL(0x25d22208,0x5907daf2),LL(0x2c21c04c,0xd98260a7),LL(0xe090f349,0x56b24923),LL(0xa31a8f95,0xb5960ad9), LL(0xf8b1da62,0xb6ac57ce),LL(0x9f14f70f,0xe47d0995),LL(0x04dba20b,0x0ba6eb01),LL(0x46b60e27,0x41ca71c8),LL(0x6bf5eeef,0x2bbfdb30),LL(0xf075b238,0x58e16788),
+ LL(0xbab220c6,0x25d1124f),LL(0x61524e3e,0xcd1423c8),LL(0x0434fb51,0x75e4f45f),LL(0x5180ab2b,0xb5180a8f),LL(0x5b22e388,0x144e214e),LL(0x92263054,0x6b16dad1), LL(0x40863566,0x3ea75907),LL(0xdada3b46,0x372d5abd),LL(0x893d210f,0xb3ff5a3a),LL(0x5e29f3dc,0x39f8d1ce),LL(0x68200e82,0x559186ce),LL(0x1202cb66,0xf4876454),
+ LL(0xeaf4f2a1,0x699c2db9),LL(0x61c0c17c,0x8cd33227),LL(0x64f16a56,0x971b50d4),LL(0x102bbe10,0xcd00d42b),LL(0xb05f3cac,0x928d0ae2),LL(0x14bcf472,0x245dbe38), LL(0x947c0184,0x43d29526),LL(0x4612a4ea,0x24089968),LL(0x6c2b4541,0xbc763fcd),LL(0xf82448fa,0xb4e7ae0f),LL(0xb02b6459,0x94f1fa15),LL(0x67d39bbd,0xbcafa1ec),
+ LL(0x8b540904,0x6f178dbf),LL(0x8720472a,0x0264bccd),LL(0x59b46611,0xa6e8b4b4),LL(0xc72b4a58,0xafce8267),LL(0xa45985ad,0x21142175),LL(0xe649d733,0xd23401df), LL(0x85dc7720,0x6bf42fe0),LL(0x40e3f2f5,0xc5c8ab94),LL(0xcd029197,0xb0c8a58a),LL(0x215492e1,0xa73ff329),LL(0xb1b5a5f0,0x895c545e),LL(0x6fcaf49b,0x6dbc2445),
+ LL(0x44cc852a,0x705ad3d8),LL(0xb80518e0,0x10bb5add),LL(0x0de9f160,0xa34905bb),LL(0x94b1aacd,0x7d45aae3),LL(0x7fd5de7a,0xd30411d0),LL(0x4d0167cd,0xe2fc6206), LL(0x10ce71cf,0xd3b19612),LL(0xb28225fd,0x8e8096b6),LL(0x64a1c849,0x4b46fa80),LL(0xa51364e9,0x160479ac),LL(0xfaa3f0f2,0x9ebb6fdb),LL(0xf1511754,0x9ce029b9),
+ LL(0x0f2d76a3,0x25ef32d6),LL(0xaf4a7d46,0x540650b9),LL(0xd991d7f4,0x8979a4b8),LL(0x99202400,0xdaa706c2),LL(0xf19d281d,0x8a729680),LL(0x4ec44de2,0xde25bdc4), LL(0xc2054496,0x0fc50832),LL(0x0aaf2941,0xfee72fb6),LL(0xb82ed4f0,0xc8263e64),LL(0x6f49055c,0x91a8cb73),LL(0xf2bb515c,0xb7585458),LL(0xb855e6c6,0x03d2b23a),
+ LL(0xa0879d68,0x8e11e8e8),LL(0xbf7a84ac,0x2bea77a3),LL(0xa74b45d0,0x98140930),LL(0x810e587c,0x1ce28654),LL(0x8869daac,0x0a30756b),LL(0x39d2fe12,0xbf5e8245), LL(0xcac16a87,0xe6414992),LL(0x437aff7b,0xd2fa182d),LL(0xb6146094,0x4e61412d),LL(0x2f31bb4b,0x30a949ec),LL(0x22dc8ac6,0xf254c71f),LL(0x1ab2a0bd,0x1d9ed85c),
+ LL(0xcfd3f182,0x09ec1e3d),LL(0xadae7af9,0x1f1c30b5),LL(0x6b454164,0xf3a33f7c),LL(0x94647c4f,0x0318926f),LL(0x87db14ec,0x8e37bdd7),LL(0x2ab364d3,0x811cbd34), LL(0x7c2b369d,0x1dd1e507),LL(0xa28056bd,0x7a57bc46),LL(0x089efe44,0xfca5be4b),LL(0x6dc1290e,0xb3bd84d7),LL(0x8793e6ae,0x40d7af09),LL(0xa3723942,0x4e08e11f),
+ LL(0xeb73ec7d,0x649eeabb),LL(0x26a9aaf9,0x10983304),LL(0x4e296235,0xf22e4514),LL(0x7b85f801,0x695c8df4),LL(0x3ae7caaa,0xd4553344),LL(0xffbba90e,0x3e35bd47), LL(0x5d13b9ec,0xdd04f7c9),LL(0xe259f70d,0xe39a5d12),LL(0x201ae17c,0x39073063),LL(0x6a85435f,0xdba3eda0),LL(0xe948924a,0x6df48093),LL(0x00e3394f,0x9ffc4dcf),
+ LL(0x899ffebb,0xca3709ad),LL(0x77c00602,0x1a873778),LL(0xa99b4af0,0x5ff40c2a),LL(0xa80e870c,0x680464e5),LL(0x94e10b1d,0xd2f7f044),LL(0x4e9aa1a7,0xee9b206c), LL(0x96cbe950,0xb536d675),LL(0x9e8305f3,0x84185689),LL(0x369fa255,0xae1b669c),LL(0x7233e1ea,0x62e26026),LL(0x6aa60c24,0xac05c513),LL(0xd2691677,0xdfc6814f),
+ LL(0x397147d6,0xbe414528),LL(0x42592203,0x74851314),LL(0x0364b0eb,0x9084d330),LL(0x6ad70814,0xf8e5d6d5),LL(0xffb4ac5f,0xfcd4e0e3),LL(0x1fbf8899,0xf652417a), LL(0xccbd7eaa,0xb1165da7),LL(0x6e2d4e8c,0xf5dbd11a),LL(0x32ddcea8,0x5dab120a),LL(0x9892f728,0x30aaa56f),LL(0xd3d73838,0x71c2412d),LL(0xd2e2becb,0xbc0253d1),
+ LL(0x0a02b0fb,0x8baef5df),LL(0xc2b92b02,0x58a2b06b),LL(0x54c8267a,0x268558d7),LL(0xccf70393,0xf924f795),LL(0xf68ee021,0xe3763f30),LL(0x5c01ba4b,0xc1e856f0), LL(0x722b6bff,0xcc01a3e9),LL(0xed5b3b02,0xd2be4623),LL(0x6c45e33f,0x1ab3512e),LL(0x4ef433f6,0xa978fe48),LL(0x8e21f5af,0x23e2ea01),LL(0x11524a40,0x49647d88),
+},
+/* digit=54 base_pwr=2^270 */
+{
+ LL(0xd087b788,0xe1d42d94),LL(0xba0e176a,0xfbfb221a),LL(0x83686966,0x5f6698e7),LL(0x74a30dbf,0xbb5e1594),LL(0xcfd20230,0xef86bb5b),LL(0x403b8f8b,0xf055a1c5), LL(0xd9d85ea7,0xf249aac8),LL(0x3d200198,0x7318f7bc),LL(0xefca9a90,0x3b80960c),LL(0x8f449c4b,0xf28e3388),LL(0xf0cfe09e,0x0cdfc61b),LL(0x8b22cd26,0x3b169c63),
+ LL(0x203bb368,0x923e948c),LL(0x231a80e0,0x58e37a2b),LL(0x6df27deb,0x345a011a),LL(0xd57f4ca2,0xba6784c1),LL(0x114196e9,0xf01b3703),LL(0x1aab426d,0x981a63eb), LL(0x51770c1c,0x2ffdc978),LL(0xefa722fc,0xddd19da6),LL(0x16f09c1e,0x5ca1c012),LL(0x5b9cc0b6,0x612021de),LL(0x5e150569,0x910e10e9),LL(0xe2ab93ea,0xacace9dc),
+ LL(0x5070e0a9,0x0cdd8372),LL(0xec550783,0x7c5ad562),LL(0x4f3b8d2b,0x9652b847),LL(0xe6e98d73,0xfdd60d93),LL(0xa3479d0b,0xd51cae2c),LL(0xee05c006,0x11b93b6d), LL(0x8a3b40d5,0x9d72b82d),LL(0xa7d24855,0xc6e996fe),LL(0x398603de,0x420672f7),LL(0x9a1af2ce,0xd551b34a),LL(0x13bdce0c,0xdeb8c1d9),LL(0xebbeba7a,0x56ca926d),
+ LL(0x9db9ca19,0xac58c9e0),LL(0x390054d0,0xd308ea5d),LL(0x2cc42529,0x32ef4afc),LL(0x97c2bdf9,0x08bd48b3),LL(0xa849e19a,0xac8a7803),LL(0x75c31496,0xcd51c0da), LL(0xf0e2d49f,0x733dc7de),LL(0xb44b8cc5,0x7c9caad1),LL(0x47be21a8,0x6d9c5b08),LL(0x5ebf426f,0xfab0fdc5),LL(0xf94e9e5b,0xd60748ca),LL(0x69366089,0x3072e592),
+ LL(0x007d3d4d,0x8f24cfd9),LL(0xcb27ae66,0x2f4f7195),LL(0x9c1ed35e,0x8166162e),LL(0x4f4bdfd8,0xfdcf7666),LL(0x3b5373ca,0x6dc993bc),LL(0xa3ec42d5,0x2faa34d6), LL(0xc6b6109e,0x1cce84cb),LL(0x43632b7e,0x7a4178ad),LL(0xb2aab55b,0x6899adb5),LL(0x683c1397,0x080e42bd),LL(0x10960bfe,0x34d5e192),LL(0x7223406a,0x65415d21),
+ LL(0x6254954d,0x8acd0a3e),LL(0x1d8c2442,0x708f9359),LL(0x6dab2ff9,0x85f59135),LL(0x33a9d96a,0x9df92007),LL(0xcaa797ad,0xac9849a7),LL(0xfe95aa38,0xcea2067f), LL(0x995cb879,0x5a3c21b4),LL(0x69d4f07d,0x5c981a5d),LL(0xf0dc9aa6,0x028cf95d),LL(0xc68fd96a,0xcc5cee93),LL(0x0b69676f,0x8a5e73ee),LL(0x832d230b,0x190a7229),
+ LL(0xd40c5d9f,0xc0ab244b),LL(0xf3ef03ed,0xc05a11cf),LL(0x650ea714,0x1593d8ad),LL(0xfc6a1235,0x1edb6cbd),LL(0x4e451d0b,0xead76e1e),LL(0xae7ee558,0x4759e3c0), LL(0x7c8145e2,0x480627be),LL(0x88a339a2,0x82cec2c7),LL(0x752b0f58,0x17e887b6),LL(0xaa6c9df1,0x91c866d0),LL(0x29b3b1d3,0xd9a54848),LL(0xf641bbc1,0x17ae47ae),
+ LL(0xf0ef77c5,0xb06c17a3),LL(0x6df6bf59,0xc144e784),LL(0x0038aeb2,0x2440ae99),LL(0x58b402ca,0x83bf711b),LL(0xb577732a,0xb8763e00),LL(0xf651a932,0x509e91ef), LL(0x00ac109e,0xbe02ab9d),LL(0x8dfd78f1,0xfbcb426c),LL(0x4283f80f,0x7ed272f6),LL(0x2365da5e,0x098cf057),LL(0x05dc6beb,0xd90e6f18),LL(0xcf7b9d72,0x09ef177f),
+ LL(0x199785d5,0xebee13d1),LL(0x92f8f141,0x3d370648),LL(0x15e3a026,0x56595c83),LL(0xe6e5c659,0xa0f4960e),LL(0xc052f5d6,0x27d5bc54),LL(0x8677ef24,0x9c5437dc), LL(0xdb9b78fc,0x28ae53a3),LL(0xd91113f9,0x025b81a7),LL(0x6ac445f9,0xfb423fb3),LL(0x575649cf,0xb555a8b5),LL(0x06ae0cb6,0x3ac93b08),LL(0x8d2e3be1,0x7a706bb5),
+ LL(0x97c0cb32,0xcabd7301),LL(0x65f83e1d,0x1698cfd3),LL(0x62043a8b,0x44833254),LL(0x3b4c8bac,0x43d1641f),LL(0xe344a05a,0xcc394a5b),LL(0x853c1f6d,0x9e085b71), LL(0xcf627733,0x35a67867),LL(0xeab971dc,0x9d668c2b),LL(0x46c5f3bd,0x458a801d),LL(0x446c5e3b,0xb7b08696),LL(0xc15fc828,0x468ae44a),LL(0xab2761ff,0x9503fd49),
+ LL(0xce8d4427,0x7278f12f),LL(0xeb15f81f,0x036aef18),LL(0xa58e95ea,0xcbe64b86),LL(0x59b2428c,0xf933a850),LL(0x52f1b0fb,0x8d117bfc),LL(0x0bed33e2,0xba9dbc6f), LL(0x6ece7dc5,0x3e152fb5),LL(0xeb80d7ff,0x90e88871),LL(0xddf09489,0x0aa265aa),LL(0x2476414f,0xa17584cc),LL(0xcb0418ea,0x2d241d33),LL(0xc3a7529b,0x1c40e835),
+ LL(0xe3e1aee9,0x89b2edba),LL(0xe55e4aca,0x33533137),LL(0x8943fce4,0x1dded9ce),LL(0x5a2ff996,0xaaf07ff4),LL(0xc96e87fe,0x69e60f92),LL(0xb9ee808c,0xc2e5c1d5), LL(0xbe466616,0x79d6d8c6),LL(0xdffe4e28,0x897f6c2f),LL(0x350b7fc9,0xc8a65267),LL(0x8a2abab0,0xe9fcb46d),LL(0x2c4faf7c,0x57c3bfc6),LL(0xa8207c8a,0x41a8cc2a),
+ LL(0xa74858fb,0xb60e8daa),LL(0x50c7c2f8,0xaa4c8ca5),LL(0x31a39837,0x9eb37096),LL(0x69f44aa5,0x5742fb32),LL(0x51e793a0,0x086aa479),LL(0x55e7c373,0x9bcaf657), LL(0x1b13101d,0x63cee90c),LL(0xe7d42d91,0xbc410452),LL(0x913aa0fb,0x3041007f),LL(0x502be876,0x9a00ad14),LL(0xb8677568,0xa137a443),LL(0x46ca4efa,0x5b26b995),
+ LL(0xaed60a78,0xe33585b7),LL(0x3cbb2e24,0xd208deea),LL(0x1aca34e8,0xff32cccb),LL(0x7b64d250,0x52ebce07),LL(0x84d8b907,0x93a4d0a1),LL(0x77de8d42,0xd759bef0), LL(0x5d07487d,0xbd60c87a),LL(0xc74f79df,0x63620986),LL(0x4a52f837,0x54f5f2c8),LL(0xf3cec619,0x340a1f53),LL(0xfc85bf85,0x1e922bc4),LL(0xc3bfdf09,0xc92e7b85),
+ LL(0x0eb9e6bc,0xeb1a37c3),LL(0x4fbf1cb1,0x8c393d89),LL(0xd1f10389,0x6ac9427e),LL(0x7c8caefc,0x77b8cfc1),LL(0x1a61bdd5,0x554ab4af),LL(0xad75e46b,0x661a99f1), LL(0x439a0456,0x11fc01bb),LL(0x8d0046c9,0x5b7fedd2),LL(0xfbece9e3,0xcfded2ef),LL(0x11440124,0x4e4dcb0b),LL(0xdee23c7d,0x2a5fd0fa),LL(0xf662402c,0xaa5f345a),
+ LL(0xeeb791c4,0x6f101762),LL(0xdf261eff,0x0d942184),LL(0xac1dc827,0x2c58e2aa),LL(0xf835a1b6,0x51410e89),LL(0x629915a4,0x981333a7),LL(0x0c14148d,0x371891b6), LL(0xc0904446,0x4d20b3d3),LL(0x949776d8,0xdda7ecc8),LL(0x2a2645f7,0xa664b68c),LL(0xadd082ea,0x7a6bc857),LL(0x3e5ff206,0xe7467dc6),LL(0x04e2dfcc,0x40a6c340),
+},
+/* digit=55 base_pwr=2^275 */
+{
+ LL(0x03744726,0xa2354569),LL(0xd8d275ac,0xd2169e6d),LL(0x132c5689,0xab0c247b),LL(0xcc4760bb,0x129a5c9d),LL(0x26ae821b,0x03eba467),LL(0x3df1cf83,0x67a33fda), LL(0xb8421b7a,0x010813cf),LL(0x98cd6d76,0x7b0f5070),LL(0x1fe4b600,0x907320b3),LL(0x98dd3239,0xda3bfeb3),LL(0x41abb34c,0x23f1ed16),LL(0x946f85f1,0x01b30f29),
+ LL(0x9666f8ea,0x28524830),LL(0xeff6502b,0xd579b3df),LL(0x00e4f78a,0x3a66fa99),LL(0x54a3f7a3,0xfd8a65bb),LL(0x1965a79a,0x505d3f63),LL(0x1891469a,0x9524972c), LL(0x3354da3a,0x78367cbc),LL(0xe4941c6e,0xbfe1fe3d),LL(0xf5af173e,0xe41bb3f6),LL(0x5ca36597,0x57cb03ca),LL(0x7b99f795,0x27f86cb8),LL(0xad4dcef1,0x5cae6514),
+ LL(0xd87a86c9,0x4952a350),LL(0x034f45f9,0x08ed7da7),LL(0x2bd716d0,0x1e9ff827),LL(0xf1d9331f,0x2471fd15),LL(0xd7370b75,0x0c708362),LL(0xfc1a1051,0xaddedde6), LL(0xdb27b186,0xf4475288),LL(0x3760bc11,0x5be4d46b),LL(0x06d47ee1,0xe44435d9),LL(0xd0b7c8a2,0x865cf7c8),LL(0x8d31a252,0xdb412be0),LL(0x2f24d71c,0x4b90a932),
+ LL(0x55f0ad9f,0x38a49bf5),LL(0xf3618639,0x1a84c6b8),LL(0x01b2f7c2,0x5f709eca),LL(0x5be8359f,0xc479a650),LL(0xd6646b3f,0x6b6a22bf),LL(0xcc5b711b,0xcce78878), LL(0xb446cc63,0x8e7dbc63),LL(0x218f800f,0x231bd027),LL(0x030271eb,0x2d3a7e04),LL(0xe22fb3c7,0xb08b5978),LL(0x9be0d46c,0x860d6278),LL(0x1d49a915,0x253a31c2),
+ LL(0x376bdc3f,0xbad6b669),LL(0x23a9ff38,0xc4a8e7bc),LL(0x555fb0a3,0x3f54d8c4),LL(0x2b23db1b,0xfb3d5e1d),LL(0xf0d7eba9,0x6379f78a),LL(0xfa0beffa,0x36004feb), LL(0x334ff01a,0xdf0a373c),LL(0xdff12a1c,0x10314749),LL(0xf184c1b3,0x1d52ddc7),LL(0xab02d404,0x79431663),LL(0x7f4d3795,0x1a6488c1),LL(0x7cca9102,0x3363660f),
+ LL(0x04dc109c,0x56d65156),LL(0x09c1d307,0xcd740cc8),LL(0x10dfaead,0xef9e049f),LL(0xe30b70b8,0x19750b3a),LL(0x15c6a562,0x11ed8600),LL(0x12097026,0x53bdf97e), LL(0x6c0d908f,0x79559d05),LL(0xb506d527,0x8f1d75ba),LL(0xae8fb3c4,0xd6fd7323),LL(0xa4111f88,0x834639c9),LL(0xa310a683,0xfc69a029),LL(0x255f2e9a,0xa4467bbb),
+ LL(0xa3526fec,0x5f0a58a8),LL(0x02f028c1,0x849c171b),LL(0x56a5d3b5,0x34d77ce8),LL(0x54d5a92b,0x97016217),LL(0x2cc5b70b,0x0cce35c1),LL(0xe83f1f4a,0xd9d5a00a), LL(0x26a0368b,0x064223f8),LL(0x40e16452,0x328a9f69),LL(0xd305ad2c,0x3a6ac093),LL(0xbeba7c44,0x759d9a16),LL(0x637ce7c8,0x86021de7),LL(0xcc80c1cc,0x276bed61),
+ LL(0xbbe4bdda,0x66797f56),LL(0xda51b1a2,0xb92a369e),LL(0x31adb034,0x18eef4a5),LL(0x5d185cfc,0xcf1cb5ee),LL(0xbd53c27b,0xf596a59b),LL(0x69002569,0x1e1dd6f5), LL(0x7687e48a,0xd9433e79),LL(0x0cbcb9ce,0x7d8d24c2),LL(0x65d68ecd,0x233cd7ed),LL(0xfb2aded8,0x201bbe09),LL(0xac9b750e,0x987f4975),LL(0x337f7f25,0x949da385),
+ LL(0x9c7de99f,0x00c2ee1c),LL(0x15e50391,0x28a7461d),LL(0xa1c77952,0x1bdc0e32),LL(0xd53d640d,0xe98242c4),LL(0xcf153c7d,0x1a4724d2),LL(0xba477d46,0x194e5dcc), LL(0x3a0d4ccd,0x871c8cfe),LL(0x9af451fb,0x62010af0),LL(0x6ddec75c,0x9b354f9e),LL(0x680e3511,0xe5db0a5d),LL(0xd247745b,0x183d1270),LL(0xeecf52dc,0x9910867a),
+ LL(0x0410ca0b,0x6fb6b7bc),LL(0xb3c13935,0x0e16eed2),LL(0x316ff531,0x98ad89d8),LL(0x9894d65f,0x4800ee17),LL(0x48280170,0x034ea3c4),LL(0xc30be537,0x8126d12d), LL(0x5120e525,0x43c2d27e),LL(0xee65df90,0x96a5d498),LL(0x5eaef29a,0x65454010),LL(0x7b678fc7,0x1d8f07a1),LL(0x7b301270,0x54bc6f73),LL(0xe9473365,0xe58a8102),
+ LL(0x4ac6cf02,0x460c2990),LL(0x420a35b7,0x01482cfa),LL(0x34680972,0xf793933a),LL(0x17e2367b,0x2cd1f500),LL(0x3944f060,0x2411c352),LL(0x11c06b05,0x3d58b974), LL(0xcddebb3b,0x4552e369),LL(0x009aeab9,0xe1c38aec),LL(0x353b6e4f,0x9d34737c),LL(0xb16d7b0c,0xf2c99e2c),LL(0x7bbba6a2,0x57029fa4),LL(0xd13ef64d,0x0565d1bc),
+ LL(0xa329deb1,0x3561b3fe),LL(0xf1c3c3e4,0xfdca0e34),LL(0x47fb79d6,0x43748313),LL(0xc48002ed,0xa7f497e1),LL(0x2c44dcb0,0x86221cce),LL(0x43785e06,0x65e3f046), LL(0xdf4cf461,0x9ee9061f),LL(0xf022d27a,0xc7479e8c),LL(0x76f7f52b,0x1d8de85b),LL(0x0fd6c65f,0x39a713c9),LL(0x711f8a39,0xf74ca067),LL(0x8ebc640a,0xad1119ad),
+ LL(0x8ba85dff,0x59753bf6),LL(0xd1c89bce,0xec8b82ef),LL(0xb8b6a683,0xd7f1a651),LL(0x6f84416d,0x9c329bf3),LL(0xe68db225,0xaecbf4b9),LL(0x5a614d23,0x94ec3b0f), LL(0x93a9543d,0xbcb66725),LL(0xf19132ed,0x90c46c46),LL(0x950b080f,0x4767c73c),LL(0x971fd9e5,0x0b9b143e),LL(0x8ec8c68d,0xbce6886f),LL(0xd47f512e,0x167b0f8a),
+ LL(0xcd74009d,0x1942c2ff),LL(0xe9c286a4,0x71c4d5f5),LL(0x771a5972,0xf3c152b5),LL(0x363c2048,0x4cfb1e74),LL(0x9ddb8da2,0xcd2ce824),LL(0xa5ee443d,0x5d97c8e0), LL(0x68d7b3d5,0x6fa84b3d),LL(0x9ce14ec3,0x97eaa76d),LL(0x8e13869d,0x2e457136),LL(0x96f0f8a1,0x39ac6a0c),LL(0x42d93dc0,0xe24458ac),LL(0x5f60bec9,0x7eb3689d),
+ LL(0x588360ec,0x29544fe8),LL(0xffb550ea,0xa1aa9b9f),LL(0x4af4d28d,0xe1f6cf99),LL(0x0c6fd477,0x723d48b0),LL(0x5c81b252,0xf51f1b2f),LL(0x4f5a33ee,0x88ec11c0), LL(0x2cd72de4,0x7747f043),LL(0xd71c92c1,0xcca69b0a),LL(0x4e8cc763,0x9455d86e),LL(0xc08444e0,0xc9e0aa1b),LL(0xe8fffa63,0x93803b68),LL(0x2d781b7d,0xc296af29),
+ LL(0xb08d2d0e,0x514cc1dc),LL(0x30e93536,0x4e6b379e),LL(0x2fc9230f,0xf0e422ac),LL(0x92e23e21,0xaa50a1ad),LL(0x676d1ac0,0x70ac46d8),LL(0xf9f54493,0x698b9991), LL(0x8649519f,0x59a6b86a),LL(0xe3511da4,0xc1f11ad6),LL(0x3192968c,0xd3d9cff1),LL(0x0b342dd8,0x13e700b4),LL(0x3b1da441,0xfd5dc7bb),LL(0x2c883760,0x02426e7c),
+},
+/* digit=56 base_pwr=2^280 */
+{
+ LL(0x1c4c9d90,0x9e9af315),LL(0xd12e0a89,0x8665c5a9),LL(0x58286493,0x204abd92),LL(0xb2e09205,0x79959889),LL(0xfe56b101,0x0c727a3d),LL(0x8b657f26,0xf366244c), LL(0xcca65be2,0xde35d954),LL(0xb0fd41ce,0x52ee1230),LL(0x36019fee,0xfa03261f),LL(0x66511d8f,0xafda42d9),LL(0x821148b9,0xf63211dd),LL(0x6f13a3e1,0x7b56af7e),
+ LL(0xcc8998d6,0x3997900e),LL(0xbaa60da1,0x8fa564b7),LL(0x661f3c57,0x71bf5b0a),LL(0xaab1292b,0x44b13388),LL(0xd4d993f2,0xcbe80cb9),LL(0x2203f966,0x0b19b4c9), LL(0x0080f259,0xbc82a652),LL(0xad96dea3,0x870ebc08),LL(0x502f0003,0xa388c7e7),LL(0x56a38f73,0x9c704ef0),LL(0x3487d9b0,0x93cde8a7),LL(0xec11a1f3,0x5e9148b0),
+ LL(0x5913e184,0x47fe4799),LL(0x82145900,0x5bbe584c),LL(0x9a867173,0xb76cfa8b),LL(0x514bf471,0x9bc87bf0),LL(0x71dcf1fc,0x37392dce),LL(0x3ad1efa8,0xec3efae0), LL(0x14876451,0xbbea5a34),LL(0x6217090f,0x96e5f543),LL(0x9b1665a9,0x5b3d4ecd),LL(0xe329df22,0xe7b0df26),LL(0x0baa808d,0x18fb438e),LL(0xdd516faf,0x90757ebf),
+ LL(0xa748b8f5,0x63f27a25),LL(0x2cd246c4,0x68c8f3ec),LL(0x65f9ce38,0x5d317cd9),LL(0x635ba300,0x162c92e0),LL(0xfe343662,0x5259f64f),LL(0x8e614ac8,0x4a6b2b66), LL(0x01177c3b,0x97fb55bb),LL(0xa705cb01,0xfb586c21),LL(0x78061824,0xa57e7325),LL(0x6c1e6306,0x892f6b38),LL(0x2367b14c,0xf12e4c07),LL(0xc83a48c5,0x580d5fe2),
+ LL(0xd5a98d68,0x1e6f9a95),LL(0x849da828,0x759ea7df),LL(0x6e8b4198,0x365d5625),LL(0x7a4a53f9,0xe1b9c53b),LL(0xe32b9b16,0x55dc1d50),LL(0xbb6d5701,0xa4657ebb), LL(0xeacc76e2,0x4c270249),LL(0x162b1cc7,0xbe49ec75),LL(0x0689902b,0x19a95b61),LL(0xa4cfc5a8,0xdd5706bf),LL(0x14e5b424,0xd33bdb73),LL(0xe69eba87,0x21311bd1),
+ LL(0xea2bafb3,0x6897401c),LL(0x15c56fe4,0x7b96ecc2),LL(0x39e2b43b,0xe511b329),LL(0xbf809331,0x39522861),LL(0xc958f8f4,0x815f6c1d),LL(0xc213e727,0x2abbdf6b), LL(0xc39bc01f,0xeb09ae59),LL(0x676b56a5,0xffe3b831),LL(0xa20f86c6,0x8f4815a2),LL(0x9aa30807,0x748a1766),LL(0x1b758878,0xf1f46a21),LL(0x6f6fc3d7,0xbd421fe7),
+ LL(0x72a21acc,0x75ba2f9b),LL(0xa28edb4c,0x356688d4),LL(0x610d080f,0x3c339e0b),LL(0x33a99c2f,0x614ac293),LL(0xaa580aff,0xa5e23af2),LL(0xe1fdba3a,0xa6bcb860), LL(0xb43f9425,0xaa603365),LL(0xf7ee4635,0xae8d7126),LL(0x56330a32,0xa2b25244),LL(0x9e025aa3,0xc396b5bb),LL(0xf8a0d5cf,0xabbf77fa),LL(0xea31c83b,0xb322ee30),
+ LL(0x0d6ded89,0x300b0484),LL(0xc3ab55ed,0x0b1092cb),LL(0x0cc10a74,0x17d9c542),LL(0xeff9d010,0x7f637e84),LL(0x27aa1285,0xd732aa1e),LL(0xe2a77114,0xedb97340), LL(0x5ef4dfb0,0x62acf158),LL(0xba1d7b81,0x1e94fc6e),LL(0x2e6eb2db,0x88bec5d2),LL(0x8d18263d,0xaec27202),LL(0xe4bbd6ac,0x4b687353),LL(0x0ff7e4c0,0x031be351),
+ LL(0x7890e234,0x04881384),LL(0x672e70c6,0x387f1159),LL(0x7b307f75,0x1468a614),LL(0xed85ec96,0x56335b52),LL(0xd45bcae9,0xda1bb60f),LL(0xf9faeadd,0x4d94f3f0), LL(0xfc78d86b,0x6c6a7183),LL(0x3018dec6,0xa425b5c7),LL(0x2d877399,0xb1549c33),LL(0x92b2bc37,0x6c41c50c),LL(0x83ee0ddb,0x3a9f380c),LL(0xc4599e73,0xded5feb6),
+ LL(0xf086d06c,0x6c00f388),LL(0x5add0cf4,0x17ee4503),LL(0x07caf89c,0xf96984c7),LL(0x648ed5e9,0x9d49d667),LL(0xa0164881,0x3ef95015),LL(0x7d9c651f,0x39e28e44), LL(0x59f37780,0xb13ad240),LL(0xb9522225,0x08cee349),LL(0x2ba1b214,0x9245ee6f),LL(0xa886d8d2,0x12bedaa9),LL(0xfcb8186f,0xe139ae08),LL(0xfc2ef864,0x99203fb6),
+ LL(0x0b7f8354,0x14d34c21),LL(0x9177ce45,0x1475a1cd),LL(0x9b926e4b,0x9f5f764a),LL(0x05dd21fe,0x77260d1e),LL(0xc4b937f7,0x3c882480),LL(0x722372f2,0xc92dcd39), LL(0xec6f657e,0xf636a1be),LL(0x1d30dd35,0xb0e6c312),LL(0xe4654efe,0xfe4b0528),LL(0x21d230d2,0x1c4a6820),LL(0x98fa45ab,0x615d2e48),LL(0x01fdbabf,0x1f35d6d8),
+ LL(0x64c9323d,0x3c292847),LL(0x0491f77d,0x40115a89),LL(0x2d7a05f5,0xec141ade),LL(0x222a5f9f,0x0c35e4d9),LL(0x442a3e9b,0x5ea51791),LL(0xe51b841e,0x17e68ece), LL(0xd6ae9174,0x415c0f6c),LL(0x9ffd7595,0xe6df85f8),LL(0x8dedf59c,0x65fc694f),LL(0xfee92718,0xc609503e),LL(0x97d565ae,0x57d2592e),LL(0x7e20862b,0xb761bf15),
+ LL(0x3a7b10d1,0xa636eeb8),LL(0xf4a29e73,0x4e1ae352),LL(0xe6bb1ec7,0x01704f5f),LL(0x0ef020ae,0x75c04f72),LL(0x5a31e6a6,0x448d8cee),LL(0x208f994b,0xe40a9c29), LL(0xfd8f9d5d,0x69e09a30),LL(0x449bab7e,0xe6a5f7eb),LL(0x2aa1768b,0xf25bc18a),LL(0x3c841234,0x9449e404),LL(0x016a7bef,0x7a3bf43e),LL(0x2a150b60,0xf25803e8),
+ LL(0x82376117,0xd443b265),LL(0x1a1beb0d,0xb91087c1),LL(0x45cc5951,0x3fe62a65),LL(0xe6e472d5,0x49c754bc),LL(0x77c424eb,0x7e60bb81),LL(0x830cbb97,0xbcd4088e), LL(0xba26df7b,0x3da5c94e),LL(0xf72b4338,0x508b4f55),LL(0x69ad7784,0x409c5c74),LL(0xfdf44d6a,0x82e5f1b0),LL(0xeed2766f,0x10654a1c),LL(0xa6e83f4a,0xef1e65fa),
+ LL(0xb215f9e0,0xe44a2a57),LL(0x19066f0a,0x38b34dce),LL(0x40bb1bfb,0x8bb91dad),LL(0xe67735fc,0x64c9f775),LL(0x88d613cd,0xde142417),LL(0x1901d88d,0xc5014ff5), LL(0xf38116b0,0xa250341d),LL(0x9d6cbcb2,0xf96b9dd4),LL(0x76b3fac2,0x15ec6c72),LL(0x8124c1e9,0x88f1952f),LL(0x975be4f5,0x6b72f8ea),LL(0x061f7530,0x23d288ff),
+ LL(0x5f56dc3c,0xa6e19d0a),LL(0x0b88326a,0xe387e269),LL(0x0ee527a4,0xef738095),LL(0x7c4278a6,0x78b7174b),LL(0xe70798ff,0xc133d867),LL(0x9e9230ca,0x9d0fef75), LL(0x1a955ab9,0x7431eef0),LL(0x8868d922,0x3772e703),LL(0x8d6af3f7,0xf7a4306a),LL(0xbbec076a,0x633bb5a0),LL(0x7a257ca3,0x6d07623e),LL(0x21c00663,0xffb5e165),
+},
+/* digit=57 base_pwr=2^285 */
+{
+ LL(0xbb71e9b0,0x35ae891b),LL(0x522b77f0,0x1f6ce6ca),LL(0xe63745c4,0xc2dab3ca),LL(0xf218d139,0x55b8c185),LL(0x89f3b0e2,0x6ab039c8),LL(0xc644c3fa,0xd9e25bfd), LL(0x3e2ed47b,0xc8496f20),LL(0x8d67e17c,0xc395ec02),LL(0x92114918,0x5c678392),LL(0xef73f345,0xe962e52f),LL(0x54fcfb22,0x3818baf3),LL(0x9d4bc911,0x4d75d65d),
+ LL(0x022ea83a,0x7f1f985c),LL(0xa7584e7f,0x90a22662),LL(0x5188fcf6,0xb40a930a),LL(0xa3a82904,0x3fad79ab),LL(0xf3151027,0x7bee8d22),LL(0xc2c3e17b,0x79a1a838), LL(0x33cc3509,0x1fbe06e9),LL(0x9abd5cca,0x629c56aa),LL(0x2d9cf7a5,0xfff290ec),LL(0x9bd062c5,0x5d0dedaa),LL(0xd7d35381,0x080344ab),LL(0xf5cf9eda,0x0848373a),
+ LL(0xa1b31832,0x170098de),LL(0x2cd8c540,0xc6876bf9),LL(0x8660d773,0x35b1b04b),LL(0x5152ad1e,0x8b4b6c4b),LL(0x4a8e92aa,0x0b0bd1c2),LL(0x88172f4e,0xd814f6f4), LL(0x41ac83d1,0x13a76899),LL(0xf1d80357,0x355933b4),LL(0x3dc17e72,0x4b394f97),LL(0x0a7124b2,0x1b0cd166),LL(0xce8a372c,0x7549880c),LL(0xe712603b,0x79f53f7e),
+ LL(0x7a0c0bc0,0x31d31f7a),LL(0xb251d2bf,0x7a37a84a),LL(0x52f04d67,0x1793362e),LL(0x21c7b651,0x5808e709),LL(0xed6f47f6,0x33fe9123),LL(0x58f71405,0xdeb1dde9), LL(0xae56b472,0x821d3045),LL(0xe02043ad,0x9f61f761),LL(0x5b2048a9,0x932ddb14),LL(0xd7811330,0x17d989fe),LL(0x128fd85f,0x032ae4cb),LL(0x7d1ef434,0x8f1956b4),
+ LL(0xce1d819c,0x30cc44e0),LL(0x15a3a414,0x3c2c4f04),LL(0x665b634b,0x7f06d2c2),LL(0x7df0bd69,0xf609fe64),LL(0x6a0dbf94,0x4b0c8c36),LL(0x46e9b487,0xd0a3a752), LL(0x9578a83f,0x7407e157),LL(0xfe0f975f,0xc46ffa4f),LL(0x1efaeccf,0xb086f199),LL(0x64796c18,0xf984b69d),LL(0x8ebfb97d,0x14de44fa),LL(0xf5245ba6,0x47bcb675),
+ LL(0x0dbafc49,0xed58c1ab),LL(0x6fa8b473,0x41995a5a),LL(0x85450ccb,0x3af3853d),LL(0x601fe529,0x18d1a7be),LL(0xdab2d926,0xd196520f),LL(0x56213ae9,0xd1f2c1e9), LL(0x77ded01d,0x37218255),LL(0xa7905433,0x366c552d),LL(0x7d9430d1,0x023d0373),LL(0x9ddf69ea,0x65d70cb6),LL(0xd4d3fa24,0x6321df7a),LL(0xb91084c3,0x77b1c2bf),
+ LL(0x0aef0ff7,0x2434dbdf),LL(0x9cc3d2ba,0xca74413e),LL(0x3dcbaeb9,0x0aee0d65),LL(0x4184a72e,0x89568076),LL(0xbe7d4e0f,0x3d7e4f61),LL(0xae441b4c,0x284a8608), LL(0x6a67283c,0x7274fd92),LL(0xc06e0b84,0xa222be15),LL(0xe4623e88,0xa0713cd7),LL(0x4710aa33,0x0ff4a317),LL(0x044dcecd,0xc9a35a65),LL(0xde77a24b,0x7bae1eca),
+ LL(0x16973cf4,0x070d34e1),LL(0x7e4f34f7,0x20aee08b),LL(0x5eb8ad29,0x269af9b9),LL(0xa6a45dda,0xdde0a036),LL(0x63df41e0,0xa18b528e),LL(0xa260df2a,0x03cc71b2), LL(0xa06b1dd7,0x24a6770a),LL(0x9d2675d3,0x5bfa9c11),LL(0x96844432,0x73c1e2a1),LL(0x131a6cf0,0x3660558d),LL(0x2ee79454,0xb0289c83),LL(0xc6d8ddcd,0xa6aefb01),
+ LL(0x81069df0,0xda10f552),LL(0x560ea55a,0x70088f4e),LL(0xda8cbaa5,0xdcee31af),LL(0xbe16a7b7,0x1213b76a),LL(0x781114d1,0x4fffa388),LL(0x904479d2,0x2cc19aa9), LL(0x85eec3cd,0xc4ebf9be),LL(0xbaff7431,0x48ea527a),LL(0x52d3ce22,0xa5b6fdca),LL(0x7e139d7a,0xbcb07835),LL(0x5de5de75,0xc7f17551),LL(0x15bcf7aa,0x005ab4d9),
+ LL(0x41383866,0x041511b0),LL(0xdb9c2b4c,0x7c90692a),LL(0x61deb106,0x736cc6af),LL(0xb5b84abe,0x57d428cb),LL(0x35dbcca9,0x14bc4981),LL(0x37f3ef2e,0xece90041), LL(0x85066bd0,0xe2c33711),LL(0xabef34c2,0x335bd50b),LL(0xb017a337,0x755f513d),LL(0x284445ad,0x28d263e2),LL(0xecb8436e,0x83402ba9),LL(0xf31d28d4,0x66357324),
+ LL(0xbce3cea0,0x05fb9811),LL(0xdf2b07df,0x74adb5b5),LL(0x0c4e5e2a,0x870e63b8),LL(0xe5fec889,0xe873cba7),LL(0x19cd8a3e,0x28b0e005),LL(0x48112c8c,0xbb16491b), LL(0x5df42faa,0xddb8cfb5),LL(0x2ab1a097,0x35f952ae),LL(0xd2dfa18f,0x35e885e1),LL(0x5b4a0277,0xc3ec2325),LL(0xc5aecee0,0xdbe2e40c),LL(0x0690080a,0x133383c9),
+ LL(0x7521f457,0xe5d473dc),LL(0xa00be577,0xe9ef09bd),LL(0xb6eaa640,0xf6d0965f),LL(0x75726560,0xeb494868),LL(0x28817302,0x452116d5),LL(0xfbde3597,0xf0424fdb), LL(0xbb454915,0xd6096da3),LL(0x41422141,0xde482808),LL(0x2d19fac0,0x7a135197),LL(0x21393f6f,0xdc9a5ec4),LL(0xeb2c8ada,0xcabcc1e3),LL(0x42d8c4f2,0xd4366431),
+ LL(0x34246834,0x46c7b438),LL(0x2eb9f9bc,0xa0a570c3),LL(0x586a0fdd,0x3e01db21),LL(0x9d21192c,0x15732b07),LL(0xfd747dd8,0xe544b5c9),LL(0x7ed374fb,0xeee7e104), LL(0x3b75a586,0xfa619086),LL(0xe8a4cfd4,0x9d0909f4),LL(0xccd93fa4,0x30e0e476),LL(0xa14595d4,0x5bdc5c02),LL(0xe245400f,0xf6f8ab6a),LL(0xa4198419,0x7bd194ce),
+ LL(0x68e190a6,0x713a654c),LL(0x3037a8e6,0x6317f6ab),LL(0x6b6bafef,0x005f412a),LL(0xb53eb41a,0xf67f8201),LL(0xf51ccf93,0x96585fcb),LL(0x045104e0,0x68ed706e), LL(0x40db03d9,0x535dc2a7),LL(0xda583d56,0xb9f0b69d),LL(0x414dc76a,0xeed71cb1),LL(0xc5e7698e,0x7368aabd),LL(0x4689da93,0x3eb6a4f1),LL(0xfcb73b42,0x753fa65a),
+ LL(0x9b860b0f,0xf5131aad),LL(0xd9bcf9c9,0x19af93ce),LL(0x307ca1ca,0x69b9765d),LL(0x87936c0b,0x0b735808),LL(0x1107f1cb,0x10eaf7ae),LL(0x16dfe03b,0x15211ad5), LL(0xb11c8af6,0x9bde40d5),LL(0xed1fc8be,0x513ea01a),LL(0x5412ab86,0x2f04be27),LL(0x9de582fc,0x2a1adc4a),LL(0x00de0043,0xb0c43235),LL(0x006efb33,0x689e15e4),
+ LL(0x89e4e449,0x0ed1082f),LL(0x833f2378,0xdb1fb471),LL(0xece77352,0xa35fef0e),LL(0x4bf0c426,0x76adaa46),LL(0xa011b2fb,0xfbab929a),LL(0x9d8cc4d3,0x6f475d5b), LL(0x74351480,0xbe6d7f21),LL(0x93e4a7ae,0x2d1362d1),LL(0x106ceaab,0xc7e2cba5),LL(0x45258697,0xfe94528a),LL(0x075945b0,0x7109b17d),LL(0xcae17f7a,0xfd395b2c),
+},
+/* digit=58 base_pwr=2^290 */
+{
+ LL(0x310404a8,0xfc1faedc),LL(0xd3bcb128,0xea339148),LL(0x6416defd,0xf0048545),LL(0xc58653e7,0x75de7770),LL(0xe2f6f99e,0xdd2dcbeb),LL(0xd159ac07,0xa4380ef4), LL(0xe4173608,0x45dd713c),LL(0x446a6789,0x44919b61),LL(0x6b962b38,0x3f73756b),LL(0xbffd3f0c,0x3cb9f53b),LL(0x7f08ebae,0xd723c40b),LL(0x0c3cddba,0x998a9b17),
+ LL(0xf6ba1469,0xf6377e3b),LL(0x09c832d3,0xc334fb6c),LL(0xc21c0cf1,0x7f85ac42),LL(0x857d8edb,0x7a3e31c9),LL(0x27b77ed6,0x2eb10763),LL(0x38dae10b,0x2bfbbdbc), LL(0x7bae3b4f,0xed7c6fb1),LL(0x36d04e6f,0xc5911d9f),LL(0x4569e72f,0x4dc43550),LL(0xbedae3ab,0xaa82fb97),LL(0x4f27e463,0x06d37bef),LL(0xf0c35a11,0xd0dbce6d),
+ LL(0x661019ec,0x43c78835),LL(0x24e66d29,0x68e916b1),LL(0x24094671,0x02c0f3a2),LL(0xd0f17d86,0xab6f1c05),LL(0xa22d4264,0x6d3bac72),LL(0xf6e5fafe,0xd7b8f152), LL(0x39447eb3,0x95627c63),LL(0x79e1ff93,0xfd159018),LL(0x5ad80806,0x39277c83),LL(0x0d7c7b74,0x758aafc9),LL(0x4cb8bec9,0x605ad8ca),LL(0x5741828a,0x6a90085c),
+ LL(0xff8b1fbe,0x6edf5561),LL(0xf6eac0c0,0x614b788e),LL(0xd8d66d29,0x7699ae56),LL(0xe9d58eb2,0x5f81602a),LL(0xfaf9176d,0xd0c04874),LL(0x523153b1,0x4b3a0046), LL(0xf6315883,0x9690930f),LL(0xa60ca92d,0xa81c0b44),LL(0x73bcba90,0x2d0e7258),LL(0xe902e329,0x57efe72d),LL(0x76bc27b9,0x3fcd5986),LL(0x93940c09,0x492adf03),
+ LL(0xf820c195,0x6895dbe2),LL(0x3f6c7b40,0x3787a500),LL(0xac1e90f3,0xdc718243),LL(0xba5d0870,0x352f8c91),LL(0xec0112b5,0xf3d1c53e),LL(0x6b84f64a,0x08a0782f), LL(0x8eedd5d4,0xd659e635),LL(0x29537276,0xfc30df6c),LL(0xa1755ce0,0xbfb09978),LL(0xaa2b4187,0x227f7b12),LL(0x226539d2,0x828730b9),LL(0xb2472c95,0x9051a37c),
+ LL(0xb39317b8,0x7de743e2),LL(0x2d372acf,0x9205d447),LL(0x3eeb0012,0x8226fc30),LL(0x2af74be6,0xab2a3e05),LL(0x4af91ac0,0xbe476780),LL(0x0ca36bf4,0x98497c71), LL(0x8d6dedb4,0x74fdf7cd),LL(0xa0fc5919,0xb50778ee),LL(0x2fcd7c63,0x5d5ec33f),LL(0x7f33cde0,0x667b8193),LL(0x38364d44,0xce48ae4b),LL(0x223ed67e,0xb8578963),
+ LL(0x9567f5f4,0x4b20d182),LL(0x18f02b34,0xde7e8149),LL(0xecff9dd7,0xc9a4be7b),LL(0x9812fd3f,0xe2f70bbe),LL(0x9c889263,0x471bf90c),LL(0x3e61f5bf,0xb60d01b5), LL(0xd22d855b,0x258c7f89),LL(0xb75a7d4f,0x35ef5c15),LL(0xb247f27d,0x26d8e1da),LL(0x8d0f7757,0xcf136199),LL(0x3f8e894d,0x31244780),LL(0xe1a3d47d,0x8d2a20ba),
+ LL(0xc795a2c7,0xc68b641e),LL(0x5a4d6647,0x4fe559b1),LL(0xd89ce668,0xeda98cba),LL(0x6c269d8e,0x15f84dc0),LL(0xcbf34023,0xf0eb685e),LL(0xc032634a,0x3668c530), LL(0xe4531f59,0x2e3d7fff),LL(0x85494d06,0xe6270306),LL(0xa3e050df,0xf02cabcf),LL(0xc001dcd9,0xccd2da67),LL(0x066d2d52,0x50aa3723),LL(0x7224a41f,0xdb075650),
+ LL(0x43c1e526,0xeaf0b05d),LL(0x5c673e17,0x7eddb25a),LL(0xc1f9bda7,0xfce700de),LL(0x646a1550,0x4e6f4c70),LL(0x8ba60c35,0xae06c3e5),LL(0xc0c89c50,0x1a57101f), LL(0x60a36192,0xdb35b1f3),LL(0x265c3ed1,0xf740a467),LL(0x6175e771,0xeab65a88),LL(0xcbe28ed4,0xd94c8cc6),LL(0x465dd7a8,0xac347e7b),LL(0xca9b899d,0xca927337),
+ LL(0xdd045c9e,0x3499422e),LL(0x727f1f25,0x5119c675),LL(0xd76e7077,0xf44a89ae),LL(0x8eb17f39,0x9d6967b5),LL(0x2bbed398,0x49b39b81),LL(0x07deb5e9,0x05b3a455), LL(0x62039ba0,0x8fa1ebf3),LL(0x0b650544,0x52c3d14b),LL(0x37d3fd20,0x2603aaf7),LL(0xec70bfc0,0xb6fe1148),LL(0xfeb74df8,0xe68b8475),LL(0xe1f4aba2,0x56fafdcb),
+ LL(0xa05b2adf,0xd061bce6),LL(0x8b7cf4c6,0xdb6e9324),LL(0x189f7ce1,0x6344c3b6),LL(0x3cfe678d,0x06993dc9),LL(0xb6e22f1b,0xb00b5227),LL(0x780137c1,0x8f836e4c), LL(0x1e9ad145,0xaf822953),LL(0xdfaaa159,0xb438997c),LL(0x904396e6,0x03e27459),LL(0xc8259d86,0xd06a0fdb),LL(0xe040907b,0x8afe766b),LL(0x038fbdba,0x0f5ff265),
+ LL(0xe1aa5953,0x4b1f8698),LL(0xbf0a531c,0x94af5c0c),LL(0x6536e156,0xba1c49f5),LL(0x09c95a75,0x31c31631),LL(0x0a6d9af1,0x268a308f),LL(0xfa9ca8b7,0x185b9762), LL(0x65035840,0xc3b1cbcd),LL(0xb429c82a,0x17b276c6),LL(0x34396850,0x1b4ec7b3),LL(0x048a6943,0x42f21d5a),LL(0x5b5820bf,0x0bf948f5),LL(0xb48dca58,0xac944487),
+ LL(0xac575242,0xefa91b2e),LL(0xcdaca77a,0x58280b99),LL(0xcf39d117,0x5c3f8382),LL(0x70e5d17c,0x4d460dba),LL(0x12f6d6ad,0x440b4db8),LL(0x7f3a6bb8,0x14b9b335), LL(0x837833cf,0xfbb3746a),LL(0xda482df0,0xbbf4735b),LL(0x9fbf146f,0x4efe32c0),LL(0x346e3b9e,0x65e5d7c2),LL(0x434ce5d5,0x742e81ce),LL(0x3bb80bd5,0x87e2b772),
+ LL(0xe02f8540,0x18d0983b),LL(0xe8058c66,0x708654c7),LL(0x92894720,0x0b137f68),LL(0x4345444d,0x0b8b62e9),LL(0xbfd043d0,0x426807d3),LL(0x2a1ac390,0x17ac2e64), LL(0xf2076839,0xd037e79c),LL(0x3ba4d3f2,0x991d4ff0),LL(0xd3724bfa,0x3937247e),LL(0x218413d1,0xb5b50d34),LL(0x28157b81,0x2accc172),LL(0xc472e8b2,0xd07f18b7),
+ LL(0xca12be15,0x0df64ab2),LL(0xc2f0d0f9,0xdbac68f8),LL(0xa2107d3e,0x5772ba8b),LL(0x76724cfe,0x32c43ac9),LL(0x166229b7,0x6f4a367e),LL(0x230b3527,0x9c8bdb42), LL(0xe71f261d,0x343d644d),LL(0x26283547,0x45c849bf),LL(0xd8e4c7b0,0x3a42b9b8),LL(0x9f8af5c7,0x0aff84ad),LL(0x418cfee8,0x453c3a30),LL(0xa241633a,0x6be57cdb),
+ LL(0x65b55050,0x04418b59),LL(0xd324aa67,0xa8a797c3),LL(0x7c65a6d9,0x5f87e22c),LL(0x1dbeffe4,0xaac71065),LL(0xbd3cc05c,0xff619d64),LL(0xe65c92c4,0x9a29c966), LL(0xdad7fcbd,0x23af2b21),LL(0x153b817f,0x4950a767),LL(0xc6478c55,0xc34a7efa),LL(0xf6cd140e,0x57cde95a),LL(0xf5a0db2e,0x64b74575),LL(0x75d7fb76,0xd4b5ea52),
+},
+/* digit=59 base_pwr=2^295 */
+{
+ LL(0x8e72aafb,0x28405062),LL(0x8ea8bf00,0x655bf353),LL(0x05547f7b,0x789d9444),LL(0x3441e472,0x7fa445ed),LL(0x4a44ce87,0xfeb19825),LL(0x129aed14,0xccb5f12c), LL(0xaf94fb34,0x22b05de3),LL(0xd3f03199,0x7422a040),LL(0xa83f7f08,0xfba252ca),LL(0xcefaa757,0x0f6ad6e6),LL(0x6517d806,0xe1ad1871),LL(0x8e9d97ad,0xd16dc8ed),
+ LL(0xa3736eb6,0xcbb99194),LL(0x36dcf470,0xdd5161cd),LL(0xb6ab6c03,0xd50b24aa),LL(0xbc41f4b7,0x419d2810),LL(0x295496cf,0xe2e88d7a),LL(0xf2457ac0,0x350713f2), LL(0x0427e2ae,0x838e4a36),LL(0x4d974e5a,0x7631472a),LL(0x7a5c5fdc,0x9fa3ab1c),LL(0xde34cb8d,0x324798cd),LL(0x889105fe,0xbfa5a9d0),LL(0xfd0df249,0xd05dad34),
+ LL(0xcb419fc3,0x536e5657),LL(0x1d271dd1,0xe8c208bc),LL(0x22d2b9ad,0x6a3713bd),LL(0x471d808d,0xa4c761a7),LL(0x7e6dca35,0xd93aafb6),LL(0x8f55ca32,0xc46c0ae3), LL(0xa78bfca0,0x55dc0de7),LL(0x3407d0ca,0xe9cfb301),LL(0xb3256c14,0x777e2a60),LL(0x6d8fee02,0x32b2238c),LL(0x46e43ee8,0xe8b35396),LL(0x247985dd,0x310bc1ba),
+ LL(0x581f9d3c,0x9974759c),LL(0xe5cb1973,0x9e76a970),LL(0xc64941ca,0x8afec58e),LL(0x01d05575,0x2d7c57fa),LL(0x5c448db5,0xc07c74cc),LL(0x01bb1440,0xa52474ce), LL(0x00115bbb,0x93162d97),LL(0xfd7480f9,0x483b6147),LL(0x6af18ded,0x4f28c57e),LL(0x174a3089,0x36faed8f),LL(0xa3dd6265,0x702dbd64),LL(0x6adc0d7b,0x86a9c43f),
+ LL(0xb9de7b63,0xa3510710),LL(0x4019c9df,0x9f364ad1),LL(0x9b5bdce3,0x5b66a5d7),LL(0x78b1b385,0x2b2f6951),LL(0x3cfa9f99,0x3e4783d3),LL(0x6bd6bcf4,0x1af51750), LL(0x81d8d7ef,0xf9c0686a),LL(0x37c068d3,0xdc0f22ec),LL(0x93545faf,0xe1b86653),LL(0xa8a52881,0x37ca8501),LL(0x5603e359,0x07ac5c8a),LL(0x542cc937,0x98fb2bab),
+ LL(0x0c5bbd3e,0x4981be69),LL(0x185fdb55,0xb047df0a),LL(0x74cff00c,0x3168e050),LL(0xb52c7f9c,0x111150a1),LL(0xa51c7986,0x0db2ed84),LL(0xe61272ad,0x7d991630), LL(0x28de14dd,0x7443d936),LL(0xa5daed5f,0xfdf31f41),LL(0x866b5e40,0x71e0ef4e),LL(0xb965a670,0x05c57a45),LL(0x70e1aa77,0x85bdb58c),LL(0x9df3ce32,0xe4d1fe2a),
+ LL(0x2f722563,0x5d461898),LL(0x567db14c,0x11d22b39),LL(0x6779cd40,0x9a8f004e),LL(0x5473ecd5,0x0812ae3d),LL(0x4e6c296a,0x4ed82862),LL(0x064ee61f,0x2d9ce40c), LL(0xd8a9eb1e,0x4856d586),LL(0x5d1b5e3a,0x2ddd6b12),LL(0x382fba3c,0x0ab5eec0),LL(0xfcf4a9c8,0x302018df),LL(0xab3cdedb,0x7b4e6fd2),LL(0x8f64cb1d,0x266c246a),
+ LL(0xf5c3af59,0xc41e4aed),LL(0x6de9a78a,0xa0284ad0),LL(0x8ed812d2,0xf5eaab7b),LL(0x1afb58b8,0x7801fbb8),LL(0x71efcc3a,0xbe5cdba6),LL(0xcd10cb91,0xe31a0e3c), LL(0x85dc0bc6,0x882e821e),LL(0xbb32e506,0xd3ad070f),LL(0xd8a0f038,0x3afede2b),LL(0x857fd3a0,0xe20a117c),LL(0x3060f767,0xebaa2aa4),LL(0x2b9d1da1,0x6524aa0d),
+ LL(0x88cffe33,0x9cc5847c),LL(0x6e8eb6c1,0xff726b0f),LL(0x1bc45d8e,0x9bb2ca16),LL(0xa6d8a5a6,0xe7903009),LL(0x47db2201,0x4f089cc0),LL(0xe6b5928a,0x4135884d), LL(0xe5c017cf,0xb1a86a0a),LL(0xb0a393df,0xb1d9bf6d),LL(0x28bb3277,0x33d9c1c6),LL(0x45b582ce,0xcb05b67b),LL(0xf33792c5,0xa72585fc),LL(0xa7d1ed84,0x78b7c5e8),
+ LL(0x9346df25,0x70e478fb),LL(0xb4a4ada5,0x01dc0c2e),LL(0x5be36ea7,0xaec82b00),LL(0x6717e06a,0x82618b8f),LL(0x008f1977,0x2db1f6d4),LL(0x16b390d1,0x4e493f3b), LL(0x990a75eb,0xfe86fd4d),LL(0x783f6076,0xa1cf7f99),LL(0x0c049158,0x6cbb23e7),LL(0xed456235,0xd05be7e5),LL(0x9bd836ef,0x60137406),LL(0x32e5f604,0x94ec9644),
+ LL(0x3d87bfa8,0x3361e1ce),LL(0x8dcca4f0,0x92f235e7),LL(0xbe323fd1,0xc8084cb4),LL(0xc24c6d16,0x3fd481a5),LL(0x2cea81ba,0x9b1bd940),LL(0x0c5aa59f,0xf5091191), LL(0xf81d5e2a,0x4cd8c9ef),LL(0x1550bff4,0x5ad00013),LL(0x8cc32e55,0x29d47b9f),LL(0x11694ece,0x66e3e6f1),LL(0x7950dd7e,0xd5edf701),LL(0x0f6350c6,0x9ccb1096),
+ LL(0x18f2470c,0x09db138d),LL(0xf613658f,0x63bd2290),LL(0x4feebab9,0x0bb64779),LL(0x7fdb1e71,0xfce4aee1),LL(0xa7f1f65d,0x7d5c0c61),LL(0x8d02d6cd,0x46405b61), LL(0x6fdcb0d0,0x7cac0485),LL(0x2f8ec5af,0x85224c4b),LL(0xdb0aa864,0xb5879a59),LL(0xff94f8b5,0x75f391b8),LL(0x49c97f8e,0xa6c994ae),LL(0xd690b232,0x4d968fad),
+ LL(0x67e0b4e7,0xf5cd290a),LL(0x7c1594b6,0xaa6fa680),LL(0xb63270be,0xebedfbd7),LL(0xa369bfee,0x574b410b),LL(0x020ea888,0x431cba5a),LL(0x56c71d47,0xd3a3102f), LL(0xa90a853a,0x4894bfe0),LL(0x5f9c4b6b,0xd78bd98b),LL(0xd900c5c1,0x9b1324f6),LL(0x718c2147,0xc65c944d),LL(0xa987f634,0xf661de6b),LL(0x172628d8,0x0315e69f),
+ LL(0x22ea5f1c,0x07c60c75),LL(0xa36bee4f,0x35beae34),LL(0xdcba8997,0xa8b00a09),LL(0x802ce50c,0xa77f1f3a),LL(0x2a2144b0,0x6c4050df),LL(0xab1b10db,0xf79bfa96), LL(0x433a9b1c,0x9025d470),LL(0x90d9eec8,0xaf3e3917),LL(0x9ae2d535,0xbcad2d62),LL(0xeff0f6a9,0x7a152829),LL(0x925fa5a0,0xe87345cd),LL(0x0e84039c,0x6ce00720),
+ LL(0x07f6a05a,0xdae449c0),LL(0x5bf26c9e,0xbc1b84f5),LL(0xb1c13820,0xe3b3f9ed),LL(0x4090598b,0x5442ad5b),LL(0x13749e4d,0x794ef656),LL(0x948b71c5,0xde809180), LL(0xe203c5b5,0x4c72dc7d),LL(0x1b349fc4,0x8902b097),LL(0x225a1569,0xa899bedb),LL(0xe6ff3f53,0xeb7da73d),LL(0x7c0be37b,0x6ee8e160),LL(0xa31bf943,0x9ee667d2),
+ LL(0xdb81146d,0x5017e145),LL(0x45c54db8,0xc7d2086d),LL(0xfa98234a,0x2541059d),LL(0x9985af98,0x4bf344d9),LL(0x7b5b7b1c,0x39737ed6),LL(0x87c411ad,0x8e246919), LL(0xb877a75f,0x2fad8ced),LL(0x17e60ee2,0xe42352df),LL(0x404043f7,0x1a53d856),LL(0x863927a1,0x6c1f07a5),LL(0xb6892121,0x38d3a4f4),LL(0x01976c8f,0xf4c10920),
+},
+/* digit=60 base_pwr=2^300 */
+{
+ LL(0xc2ec3731,0xbcc88422),LL(0x10dc4ec2,0x78a3e4d4),LL(0x2571d6b1,0x745da1ef),LL(0x739a956e,0xf01c2921),LL(0xe4bffc16,0xeffd8065),LL(0xf36fe72c,0x6efe62a1), LL(0x0f4629a4,0xf49e90d2),LL(0x8ce646f4,0xadd1dcc7),LL(0xb7240d91,0xcb78b583),LL(0x03f8387f,0x2e1a7c3c),LL(0x3200f2d9,0x16566c22),LL(0xaaf80a84,0x2361b14b),
+ LL(0x246dc690,0x7a1a522b),LL(0x4b61ab70,0xb563cbe1),LL(0x3d4ac4ab,0x41bb4abe),LL(0x37f996e8,0xc52950b3),LL(0x79727761,0x01d991e6),LL(0x978fd7d2,0x35de93bd), LL(0x5706d336,0x86bad5e6),LL(0xe7f26c20,0x10844155),LL(0x05757453,0x58ffeb77),LL(0x3939df77,0xbb186129),LL(0x6a78ea0f,0xbfdd394a),LL(0x6e33e1d3,0x907ff054),
+ LL(0xb5733309,0xdb1cffd2),LL(0x0f9dd939,0x24bc250b),LL(0xa3c1db85,0xa4181e5a),LL(0xac55d391,0xe5183e51),LL(0xefd270d0,0x2793d5ef),LL(0xc0631546,0x7d56f63d), LL(0x0c1ee59d,0xecb40a59),LL(0xbb5bfa2c,0xe613a9e4),LL(0x6c5830f9,0xa89b14ab),LL(0xa03f201e,0x4dc477dc),LL(0xc88c54f6,0x5604f5da),LL(0x2acfc66e,0xd49264dc),
+ LL(0x0df93b34,0xa7f29532),LL(0x5c14df30,0x855934f2),LL(0xefae348c,0xd2f54ce9),LL(0xac52758d,0x5acb931c),LL(0xd22961a4,0x287b3e18),LL(0x748f8fe1,0x42a5516d), LL(0x877224ca,0x1b62b341),LL(0xd30a4aa7,0xaff58db3),LL(0xbe8da847,0xbad78dad),LL(0x54f18276,0x85fa7109),LL(0x7c4bfdad,0xe2cc9d28),LL(0x2c75f237,0xbb131f76),
+ LL(0x1c4dfa95,0x283dd7f0),LL(0x62c0b160,0xb898cc2c),LL(0x870282aa,0xba08c095),LL(0xf4e36324,0xb02b00d8),LL(0x604cecf2,0x53aaddc0),LL(0x84ddd24e,0xf1f927d3), LL(0xe2abc9e1,0x34bc00a0),LL(0x60289f88,0x2da1227d),LL(0xcef68f74,0x5228eaaa),LL(0x3c029351,0x40a790d2),LL(0x8442e3b7,0xe0e9af5c),LL(0xa9f141e0,0xa3214142),
+ LL(0x03844670,0xcdcdd7d7),LL(0xb4a23f91,0x79ec59af),LL(0xc00ce5c3,0x5923c569),LL(0xc589d0c7,0x099c17ff),LL(0x89fa6fe6,0x0335eeea),LL(0xa4e868c4,0x916bcaca), LL(0xfb687bd5,0xb7037325),LL(0x9853b564,0x57d6bca7),LL(0xd5e26d28,0xdf3132ef),LL(0xde919cbe,0x7ed994b8),LL(0x6fbbb18d,0x12df67cd),LL(0x6baff508,0x516e07c0),
+ LL(0xf9a58e3d,0x72f4949e),LL(0xa48660a6,0x738c700b),LL(0x092a5805,0x71b04726),LL(0x0f5cdb72,0xad5c3c11),LL(0x554bfc49,0xd4951f9e),LL(0x6131ebe7,0xee594ee5), LL(0x3c1af0a9,0x37da59f3),LL(0xcb040a63,0xd7afc73b),LL(0x4d89fa65,0xd020962a),LL(0x71d824f5,0x2610c61e),LL(0x3c050e31,0x9c917da7),LL(0xe6e7ebfb,0x3840f92f),
+ LL(0x97e833e4,0xf2ec9ef5),LL(0x34ec7e41,0x97bdef97),LL(0x7d2ac6e3,0x90e2b238),LL(0x0318a3b7,0xcf682b12),LL(0xea84a7a0,0x7fe76089),LL(0x16546d05,0x85c489f9), LL(0x6abdda05,0xf987118f),LL(0xaa4b95fc,0x675cf998),LL(0x888a7e8c,0x544c7774),LL(0x63ec5831,0xbd2647ba),LL(0xfd2fe985,0xb479cea3),LL(0x28d163e8,0xa0421345),
+ LL(0x8d8b8ced,0x50fbd7fe),LL(0x47d240ae,0xc7282f75),LL(0x1930ff73,0x79646a47),LL(0x2f7f5a77,0x2e0bac4e),LL(0x26127e0b,0x0ee44fa5),LL(0x82bc2aa7,0x678881b7), LL(0x67f5f497,0xb9e5d384),LL(0xa9b7106b,0x8f94a7d4),LL(0x9d329f68,0xbf7e0b07),LL(0x45d192fb,0x169b93ea),LL(0x20dbe8c0,0xccaa9467),LL(0x938f9574,0xd4513a50),
+ LL(0xe5947c6f,0xd93506a4),LL(0x39b81d08,0x4340d76a),LL(0x17930d30,0x741aee59),LL(0x18fdb81c,0xfea3d99a),LL(0x289bcb07,0x1088ff6b),LL(0xb7c082c6,0xc6b45602), LL(0x453d8d69,0x50e2baab),LL(0xe893e183,0xda9bf561),LL(0xb29a284d,0x0af25f86),LL(0x73e01380,0x0e92e674),LL(0x2be00e59,0xe173a0e3),LL(0xada8954a,0x402d2f3d),
+ LL(0x054cb874,0x841c96b4),LL(0xa3c26834,0xd75b1af1),LL(0xee6575f0,0x7237169d),LL(0x0322aadc,0xd71fc7e5),LL(0x949e3a8e,0xd7a23f1e),LL(0xdd31d8c7,0x77e2d102), LL(0xd10f5a1f,0x5ad69d09),LL(0xb99d9a0b,0x526c9cb4),LL(0x972b237d,0x521bb10b),LL(0xa326f342,0x1e4cd42f),LL(0xf0f126ca,0x5bb6db27),LL(0xa4a515ad,0x587af22c),
+ LL(0x0399721d,0xca9cb389),LL(0xa3291479,0x03ad9f4a),LL(0x6dee003d,0xd85b5df5),LL(0x64a4f83a,0xe1fa7b02),LL(0xb73f7324,0x01c4cbfd),LL(0x5cf2ddf4,0x707010d4), LL(0xb12e02f8,0x3c6df430),LL(0x85531489,0x921a2901),LL(0x91d1022c,0x302fc77c),LL(0x342d8f3f,0xc3733ec0),LL(0x6195a665,0xb83bc75f),LL(0xa79f8027,0x4a14b9e7),
+ LL(0xb12e542f,0x1123a531),LL(0xb9eb2811,0x1d01a64d),LL(0xf2d70f87,0xa4a3515b),LL(0xb4bd0270,0xfa205234),LL(0x5eda26b9,0x74b81830),LL(0x56578e75,0x9305d6e6), LL(0x9f11be19,0xf38e69de),LL(0x44dbe89f,0x1e2a5c23),LL(0xfd286654,0x1077e7bc),LL(0x0fca4741,0xd3669894),LL(0x278f8497,0x893bf904),LL(0xeb3e14f4,0xd6ac5f83),
+ LL(0xe2a57359,0x9f0e5428),LL(0x14998c16,0xc690a3c7),LL(0xde37e07e,0xd73c3ca2),LL(0xdba0bc0d,0x2ddf91b8),LL(0x7570ae71,0x69d834b2),LL(0x735195a6,0x2ac8bed4), LL(0x3b1fcc5c,0xcd8c51ff),LL(0x1ba6863f,0x7aa8cf4e),LL(0xae70f428,0xebb69e72),LL(0xaa9e936d,0xa29409df),LL(0x5a332b9b,0x43f6ee80),LL(0xc2eab0a9,0x0de49efa),
+ LL(0x488f5f74,0x327b9dab),LL(0xcab7364f,0x2b44f4b8),LL(0x19b6c6bd,0xb4a6d22d),LL(0xfc77cd3e,0xa087e613),LL(0xb0b49bc7,0x4558e327),LL(0xcd835d35,0x188805be), LL(0xc1dc1007,0x592f293c),LL(0x6af02b44,0xfaee660f),LL(0x904035f2,0x5bfbb3bf),LL(0x79c07e70,0xd7c9ae60),LL(0x234896c2,0xc5287dd4),LL(0xcb0e4121,0xc4ce4523),
+ LL(0x2310333e,0x04baa176),LL(0x7b9bad46,0xdc75e35f),LL(0xc6cd6108,0xc4a6031d),LL(0x30bf87a5,0xba2534d0),LL(0x31e497cc,0x7ebc6e21),LL(0x851fd665,0x8a2a82b4), LL(0x6d5faf40,0x9ecae011),LL(0x96956ecb,0xfa3a6d7f),LL(0x2fa52782,0x39e8a9c2),LL(0x236d442e,0x74c93801),LL(0xb1c289ce,0x8b21ba23),LL(0x25c769cf,0x7f3e221b),
+},
+/* digit=61 base_pwr=2^305 */
+{
+ LL(0xca114c4a,0x761e10e2),LL(0x894301b3,0xe39d121d),LL(0x3dbc6fca,0xa0870ff4),LL(0xcbe0ba8a,0x97651286),LL(0xc0f1ff6a,0x47d46075),LL(0x3abeb5b6,0x18669c84), LL(0xad8d9309,0x1234c80e),LL(0x1f6f97ff,0x1ccbe4d5),LL(0xd82ab780,0x399a2d41),LL(0xde426e50,0x8a03afaf),LL(0xca6dde77,0xa2bcb109),LL(0x0618f5ec,0x840e13b0),
+ LL(0xec645a62,0x15d47e52),LL(0x8d6d4423,0xabe0ddb3),LL(0x70cddb11,0x51226a30),LL(0x2b5a8db7,0x63a253d3),LL(0xbef37d65,0xe8be4d1f),LL(0xc0920b91,0x41e625d9), LL(0xd9d040ec,0x08b713a8),LL(0xc450cdba,0x467fb08d),LL(0x917ee393,0xa8975877),LL(0x1528cd12,0x294792e9),LL(0x37daf6aa,0x4512dc8c),LL(0x197a99b9,0xa83becc9),
+ LL(0x538d92d8,0x3b21dc1f),LL(0xc005aa86,0xc80b22b3),LL(0x0da87d65,0xf536e5d3),LL(0x0cd999a0,0x4ce10edf),LL(0x50e08f5d,0x89491814),LL(0x526647e6,0x77fd8f2e), LL(0x250099fd,0xcb207ee9),LL(0xfd6aa078,0x03c7d1ab),LL(0x25e0cf15,0x7d4940d2),LL(0x067fa052,0xb688b311),LL(0xa98b2e21,0x89308326),LL(0x72311eab,0x3ee4cc2b),
+ LL(0x68d7dfcf,0x37be5d3f),LL(0xb945e6f2,0x97bdbd49),LL(0x9d1569e7,0x165a24b5),LL(0xb4e293ab,0x254aaf59),LL(0x6fb7c0a4,0x3c751fbd),LL(0x5018cb18,0x14eda4ba), LL(0x1b5f6aed,0xacb3b897),LL(0x1e4b6b78,0x6d10be44),LL(0x621df6d7,0x245d7258),LL(0x185f0e2a,0x2af0e283),LL(0x8fddbd81,0x1e7edc81),LL(0xc538d02a,0xbd1e6c72),
+ LL(0xaa006a4f,0x12014812),LL(0x83374604,0xf84aa1a2),LL(0x0ee4a8ae,0x9f8475d9),LL(0x135811df,0x37a1b21d),LL(0x1166af52,0x34143171),LL(0xf5a33016,0x204dd449), LL(0x372b6edd,0xc838d3d5),LL(0x3987611c,0x314f3053),LL(0xd112605c,0x819adbe0),LL(0xf6b32c5c,0x45da01ae),LL(0x7e3b13a9,0x3deb3018),LL(0x79058926,0x0e78a3a2),
+ LL(0x42adface,0xaab5f0c7),LL(0xcb580132,0x50d9f53f),LL(0xb5fd6ebf,0x68a3c689),LL(0x9cde184a,0xdea2f2ee),LL(0x13a98466,0x8c174c44),LL(0xcb4d921b,0x8c4e2ae1), LL(0x2d4c6d5a,0xba973c6c),LL(0x61d2ec5f,0xc6150714),LL(0x666d8bf9,0x2aba1375),LL(0xd41272cd,0x2fa2768f),LL(0xa0bc34bf,0x49f3b8d7),LL(0xca45e5fc,0x61118166),
+ LL(0x2665ae2e,0x92f565ea),LL(0x1aefd472,0xaaa91acf),LL(0xfbb062aa,0x3878c718),LL(0x7de3c64d,0xde46e7d8),LL(0xbd506a76,0xff9900a4),LL(0x3daa73b9,0x4e30ed72), LL(0x7cbaff42,0xd6be9446),LL(0x5dd691f4,0x26fe6305),LL(0x6d393800,0x64ef093c),LL(0x7bb8f155,0x2448c67a),LL(0xe5d732d7,0x9da6e75f),LL(0x50b080e0,0xe837a602),
+ LL(0x844626a2,0x6858b674),LL(0x0cbba6a6,0x610cd40f),LL(0x29d9194d,0x324e674e),LL(0xdcb30a51,0x2dc6fdf6),LL(0x528aa549,0x3f3ecb77),LL(0x23ffaa92,0x0721f8f9), LL(0x27a77538,0xd8efcbd6),LL(0xd6162c9c,0xf4e642bf),LL(0x4cf4a16f,0x04f2b0b7),LL(0xbbf335fd,0xbc0bb49f),LL(0x5a928c36,0xc6b6e5bd),LL(0xd893dd45,0x981b01f4),
+ LL(0x518f01dc,0x2836b977),LL(0xa06c7362,0x117e833e),LL(0x31152b22,0xcda89f2c),LL(0x34be0102,0x2084c5c4),LL(0x2bfac8c2,0x6478de75),LL(0xebda5ede,0x9f7e901a), LL(0x5aa25b6f,0x5f43adfc),LL(0xcdd0eee3,0xfb719dca),LL(0xf9b16d84,0x14431b2d),LL(0x97f04b2b,0x846261af),LL(0x1edd7d4d,0xcc6100b8),LL(0x87cde5f4,0x6197c87f),
+ LL(0xa01cb6d9,0x4a9e6281),LL(0x87065307,0x699c0719),LL(0xdffa58be,0xa8ca4971),LL(0x89efaadd,0x8adc304f),LL(0x1f3c79d2,0xeef0af15),LL(0x581587e8,0xb3be9c6c), LL(0xda0be326,0x79010ad2),LL(0x4be00f8b,0x4f361e1e),LL(0xc53f3c74,0x180e66ba),LL(0xb2521c2d,0xa668c3f3),LL(0xabb73a09,0x60bc2fa6),LL(0x4392692f,0x0bda0ff6),
+ LL(0x9aa349d0,0x2e88f308),LL(0xa7cf751f,0x9f19df26),LL(0x4885be75,0x1e0229c7),LL(0xa32fce2e,0x6770eee2),LL(0x562d99d7,0x448366e4),LL(0x8bc7484a,0x7670bd68), LL(0x92d83c6b,0x15374837),LL(0x14f7c403,0xe0f499f8),LL(0x8a6b78f6,0x4cf02671),LL(0x9849e689,0x75f6e30a),LL(0xcad5065a,0xaf6fe2a5),LL(0x43ba98aa,0x6378401b),
+ LL(0xd2446552,0x26d6d225),LL(0xd2600e42,0x9b74929e),LL(0x447126d2,0xcef3a052),LL(0x4d1c7e0a,0xcba2f70c),LL(0x020d33a3,0x0250a96f),LL(0xa5e587d9,0x9c946f94), LL(0x86653ae6,0xc7d4343f),LL(0x8884e9c6,0x9c832859),LL(0x1c234f88,0xa44fa8c5),LL(0x987f04dc,0x7193e6db),LL(0x6a25ff37,0x24efebac),LL(0x953b3db8,0xe23f0a14),
+ LL(0x491d9ba9,0xb13db9bb),LL(0x5556de42,0x7105da91),LL(0xbd48b3d9,0xafa75d3b),LL(0xed6c519c,0x10246797),LL(0x1aa866f5,0x83b27882),LL(0x54f64e96,0x66f4ceaa), LL(0x43c07b18,0xf4f03faf),LL(0xdd18ddec,0x97eed374),LL(0x6c454f23,0x43b702f1),LL(0x3cb61e31,0x3c53810c),LL(0xedcaea49,0x8a50cfe9),LL(0x89a6acd9,0xfb70772b),
+ LL(0xa01edb12,0xedc09655),LL(0x7ad80675,0xdaa9f823),LL(0xf6a1052d,0xb7f23b6c),LL(0x697dc18b,0x22dc809f),LL(0x6c8bcd69,0x0453593f),LL(0xc9b43cf0,0x80f76d8b), LL(0x8c5b3ba9,0x8e781e17),LL(0x66a0b318,0x66544c7c),LL(0x9d95b620,0xedd99cbd),LL(0xbdf0933e,0xc36c4334),LL(0x8b59acf3,0x3d550b68),LL(0x6ca6a2b7,0xcd7d1701),
+ LL(0xc3d5ad9a,0x94457602),LL(0x3a7a1abc,0xa1a9608e),LL(0x31a107cb,0x16eb2310),LL(0x987bf106,0x5d921026),LL(0xd2ccc296,0xec2e5789),LL(0xb8f2fbd4,0x87b86d1b), LL(0x6da88d7d,0x939b5802),LL(0xe19707e2,0x22fa6ef8),LL(0xc547ce83,0x8b95bd5d),LL(0xd16fb119,0x91268688),LL(0x6e3627f2,0xbf199148),LL(0xc31ab346,0xd072bdf2),
+ LL(0xf810465b,0xfb083c2a),LL(0x02ce0dee,0xb66a8de9),LL(0x47a81b95,0x6e4130e7),LL(0x58a98737,0xcd704dc6),LL(0x592829c9,0x842ae329),LL(0xbe20dd63,0x99bedc34), LL(0xd53b2df4,0xabee8e55),LL(0x6010b37c,0x6ce65758),LL(0x467112b9,0x781f39b2),LL(0xbe341038,0x6f06058f),LL(0x12a2f8be,0x5effdca5),LL(0xaf34466e,0xaa9bdad7),
+},
+/* digit=62 base_pwr=2^310 */
+{
+ LL(0x9c216137,0xab86639e),LL(0x82b18d64,0x45a12fb8),LL(0xd763f0bb,0xb5734418),LL(0x11a9802c,0xd2cc3322),LL(0x81269b8a,0xe41d7db8),LL(0x2ecfa355,0x91072fc1), LL(0x04ce306f,0x59d69125),LL(0xa131b86d,0x916d9d4d),LL(0x8a739738,0x84478b6b),LL(0x1cc83ae3,0xe86ad7d9),LL(0x797ccd97,0xbc9b2084),LL(0x694944c6,0xc1e94af4),
+ LL(0x895c0318,0x585edee3),LL(0x45e8205b,0x775e142f),LL(0xd85ad31f,0x3bd7924f),LL(0x9124bffa,0x2e7d8f91),LL(0x44c62868,0x885397c0),LL(0x7fda9f5d,0xc0c2dff4), LL(0xc14e693d,0xd302582e),LL(0x6cec31ba,0x53d6e33a),LL(0x63653c06,0xb0216b5b),LL(0x9c70dad4,0x8f08a1ad),LL(0xffbba93d,0xccf014aa),LL(0xa33f12b7,0x900b0d2c),
+ LL(0x9b8cfa41,0x0dd2395e),LL(0xd4f92a44,0x50e203ab),LL(0x6630023b,0x7280aff1),LL(0x07de820e,0xfcce59dc),LL(0xbc8189ad,0xa686be05),LL(0xaac70b7e,0xac4b59bf), LL(0x7a3c71ac,0xd2c0070e),LL(0x35ac1c47,0x1d550add),LL(0xfb881c1b,0xd42b6389),LL(0xd0dafd42,0x57ca3fcc),LL(0xbe26ccc9,0x909e8284),LL(0xa002235c,0x1abe7595),
+ LL(0xa6a1913d,0x1e34781a),LL(0x7d0adc38,0x9a8f3228),LL(0x28af85ba,0xfc185ccc),LL(0x3ae9ba11,0xc923d78b),LL(0xa7bdb313,0x7d494d7e),LL(0xaf8f8b87,0xf774dfa5), LL(0x16e863b8,0xc178ccc1),LL(0xa8899691,0x2d472f2a),LL(0x80a50372,0x608747cc),LL(0xe6f90197,0x8147aa90),LL(0x78c2f216,0x4683d4c9),LL(0x552f3b51,0x8323652c),
+ LL(0xcc2c9a2a,0xa5c08e8b),LL(0x8baaf0fc,0x70e1b405),LL(0x9e36e50c,0xf29e1e5c),LL(0x80f258c5,0xa3d90800),LL(0xecad4498,0xc9ceac25),LL(0xca32f3fe,0xcb73130f), LL(0x48b3863d,0x2dbe620c),LL(0x14ff53bf,0x8c52727f),LL(0x6b45e9b8,0xb60b22a8),LL(0xf6483c5d,0x81e05bc0),LL(0xcd542972,0x217caa6b),LL(0xfa780778,0xffab716a),
+ LL(0x0d7410d6,0xe5d3e0d8),LL(0x2be432c9,0xcfa9ed74),LL(0xa85a0686,0x60044434),LL(0x6ad6918a,0x93b35716),LL(0x051762be,0x1a3c3e6d),LL(0xb0ab32d6,0x80813589), LL(0xaad403fd,0x64214b92),LL(0x4d3fb746,0x684befc1),LL(0x79515046,0xaca5a514),LL(0x72e84485,0xacdba034),LL(0x287d9e97,0x61aa2834),LL(0xcad222e7,0x07a515a5),
+ LL(0x8af19670,0xb0309306),LL(0x34c6bf0f,0xd784125a),LL(0x255a8396,0x0b425ee0),LL(0xfb541162,0x91076433),LL(0x86f47a0e,0xc4d81885),LL(0xfd7bc7c1,0x3b767d54), LL(0xbee196e9,0x98b405d3),LL(0xedaccf4a,0x4ef9c511),LL(0x03f4f1a6,0x5a6deb65),LL(0x1b4c5104,0x4a22ca64),LL(0x9145ce41,0x2cce3667),LL(0x3206810d,0xd0518752),
+ LL(0x037bebad,0x29d81538),LL(0xd9e0b78c,0x76e52c73),LL(0x8783d1fd,0xaa4ace6e),LL(0xf0e3c126,0x9c14ebdd),LL(0x6eca4b71,0x0eb1c08d),LL(0x1c91df35,0xd10c6b96), LL(0xe81bb84a,0xdb8119bb),LL(0x17e3ceef,0xf784d3c1),LL(0x35436f81,0x053c9168),LL(0x9b18d212,0xeb41ccbb),LL(0xb1bc3497,0x93b3fb43),LL(0x8c1ced81,0xd85a7c75),
+ LL(0x811af84a,0x004105c3),LL(0xa7934a0f,0x01307934),LL(0x9b3226a1,0x179fd49b),LL(0xde6834b4,0x195d9e5c),LL(0x0e6051bd,0xfbb79dc0),LL(0x367f4487,0x354273ed), LL(0x74fb892d,0x4afa9d45),LL(0xa1b7f3bb,0x03ae905e),LL(0x592f6122,0xea32cd5d),LL(0xf1103301,0xa758eed2),LL(0xc59d1cc8,0x9dde4238),LL(0x51022a42,0xe2760bcc),
+ LL(0xd377d7b0,0x54f84d70),LL(0x3344bc4e,0xb745d190),LL(0x8f33aa53,0x1c693ed0),LL(0x8bfbee7f,0x990ed45f),LL(0xe9b258fb,0xad620c9f),LL(0x1a54bf46,0x465ccb10), LL(0xebc40951,0x5330a0d3),LL(0xa405da61,0x34423e8c),LL(0xb83043b6,0xeef1ce78),LL(0xac06d182,0x99678f22),LL(0x1802f14c,0x9213f57d),LL(0xadf11fda,0xf8549616),
+ LL(0xb6e392e1,0xf31796d2),LL(0x93b3395e,0x199d6248),LL(0x12f9b763,0xef14c7c2),LL(0x43edb7a5,0x721ebf21),LL(0x5e96f3ba,0xa40b8894),LL(0x4cff8394,0x8770608c), LL(0x8d0def0e,0x990c99ae),LL(0xa15a5649,0x292b26df),LL(0x91ca89d7,0xa98fda2c),LL(0x973e5f5f,0x916cb1b4),LL(0xa72de0bb,0xa2823f13),LL(0x8cd3219d,0x415f7bd2),
+ LL(0x3ed03d5f,0x521f4af7),LL(0xeaf9064c,0xe3461f66),LL(0xae03777f,0xad099ab7),LL(0xb65f73ff,0x541cadcd),LL(0xa86059b9,0x53430463),LL(0x043e9f82,0x8ff88fe5), LL(0xe42cde45,0xd515f4c7),LL(0xf41c3269,0xf7f3dec3),LL(0x7ef1b8ff,0x7bed5356),LL(0x1295b5fe,0x8782b45f),LL(0x03917627,0xab54ebaa),LL(0x8787ed9f,0x8516beb2),
+ LL(0x65b68624,0xba7df5a9),LL(0x6e7d58bb,0x30b4d6ed),LL(0xdbb81762,0x67e52341),LL(0x0deeac1d,0xd697ab1b),LL(0x5577ea92,0x01d15e8e),LL(0x98fb38da,0xbb12d724), LL(0x4e04908d,0x302faa6d),LL(0x09b90a9c,0x66cf6cb9),LL(0x98d96736,0xcd665dbd),LL(0xb86f3af4,0xf7d3c528),LL(0x1d8b07f4,0x4844c754),LL(0x1eaf7dc0,0x2a77d7b9),
+ LL(0x1d70eb73,0x53e59f25),LL(0xe69d0525,0x8aed17af),LL(0x64413768,0x26ddc178),LL(0x5e48c349,0xa7c8d40f),LL(0x87ff01fb,0x29ad92d1),LL(0x965b2de1,0x8f4e1b3b), LL(0x1446eca2,0xb83cfadf),LL(0xe609d416,0x7432bda4),LL(0xf1c7de69,0xcf97e8a3),LL(0x32f55f07,0x45899bd8),LL(0x51175738,0x41a68117),LL(0xb8efff21,0x89eeb115),
+ LL(0x936c3eba,0x54a01e60),LL(0xec01b12c,0xf326fe96),LL(0x66e4de2e,0xcdfaf003),LL(0x392fd0a8,0xc53dba07),LL(0x6ec46004,0x00d9b80f),LL(0x3ba63f8d,0x84d59be8), LL(0x9dea6062,0xbac4ea43),LL(0xadd568ca,0xb4b4845b),LL(0xd225e2d0,0xa6ca3d34),LL(0xb50070a2,0xce72955d),LL(0x21c78b68,0x56e5c913),LL(0x999488a3,0x888eb198),
+ LL(0x11c92f34,0x5255508c),LL(0xa294d382,0x9a346cf3),LL(0x3095205b,0xd9765eea),LL(0x2c470ef7,0xfea2ed70),LL(0x9c40bf0a,0xf5e8a0fc),LL(0xe4137a16,0xb572390e), LL(0x2bf2f545,0xb9175371),LL(0x58cd9cc7,0x2c2d0f4c),LL(0x02385486,0xbea6bce9),LL(0xa8bc3a94,0x46208408),LL(0x3ac45044,0x64a87a2a),LL(0x7df70151,0xe40da33c),
+},
+/* digit=63 base_pwr=2^315 */
+{
+ LL(0x39161b8a,0xee9e25d9),LL(0xe2eead91,0x8763f2a2),LL(0xd2d91300,0xd2fc1157),LL(0xffcbe50f,0xe7597e2f),LL(0xe11d376e,0x4be3814f),LL(0xdbf14562,0x1eab3d7e), LL(0xc0ad183a,0x38a107c0),LL(0x7c753bbf,0x82976626),LL(0xcaebd481,0x18014e09),LL(0xf9ace60d,0xb28c331b),LL(0x211cb8e7,0xe8fba04f),LL(0xe42dc65e,0x41c4b797),
+ LL(0xc3e88580,0x009dc2f4),LL(0x99db1fb5,0x4a405be8),LL(0xec5d91fe,0xc89bfaa2),LL(0xf160afcb,0x461be9a0),LL(0x7d7566b5,0xfdd084bb),LL(0xe48099a2,0x795275e8), LL(0xfe9815db,0x1b461fc9),LL(0x73627bbc,0x576214cd),LL(0x9f09a206,0x3246332d),LL(0x6941d6ef,0xbde4c0c3),LL(0xf387f5f6,0x44ef03fd),LL(0x57b63400,0x99c8ac01),
+ LL(0x2f6e4301,0xaa512f20),LL(0xbf94a1cc,0xef668a5f),LL(0x15861b88,0x08713c30),LL(0xc99bb2b6,0x49d47551),LL(0xe2f0258e,0x6db5f812),LL(0x998d7435,0x70c9b299), LL(0x5d176ae0,0x46168e1c),LL(0xf730ec30,0xec3306e4),LL(0xab69c15d,0x49439df3),LL(0xea0143e4,0x1040408b),LL(0xbc549b0a,0xb48ab8ea),LL(0x10f89223,0x4aa38bbf),
+ LL(0x9598f49a,0x7e485159),LL(0x9629305b,0xbdac3d5e),LL(0xa6fbabfb,0x20de0daf),LL(0x8f09fff7,0x04f01583),LL(0x6a06994f,0x5a056297),LL(0x6e3ccd33,0xf51dac8f), LL(0x3af507b8,0xc087ef9c),LL(0x6a5c6663,0x525ab76e),LL(0xd916ee93,0x4fc04814),LL(0xd23d140b,0x3369c978),LL(0x1662028f,0xb0fcd70f),LL(0xe1e28adb,0x2ca77de2),
+ LL(0xc512bc71,0x838acd1b),LL(0xdc18afd0,0xac06d6bd),LL(0x9ec45f4b,0xc991c1e3),LL(0xcc27c68e,0x667c5e89),LL(0xed07f829,0x0e059b04),LL(0xcec4b3a7,0xceccf1d4), LL(0xb953f9a1,0x3d9c2dc9),LL(0x2d599b16,0x4be2f7e7),LL(0x97256c26,0x1a2054b1),LL(0x8b4fdfeb,0xcf66fa47),LL(0x8134d7ef,0x896cc1b3),LL(0xd41dadbc,0xa17264ca),
+ LL(0x37627e56,0xe3ccfe8e),LL(0x7b6b21a6,0x00733a86),LL(0xb605c427,0x3f13e2cb),LL(0xb0d80992,0x5ee12395),LL(0xb9991381,0x4dcaea94),LL(0x8c4c4b6e,0x4cfed7ee), LL(0x7f7f45df,0xd7aad54b),LL(0xb3809bf8,0x2229407f),LL(0x68048fd9,0x6eb31eee),LL(0xd57225fc,0x693842df),LL(0xa88dfd3f,0x3e62cd85),LL(0xd5462cf1,0xc6307d53),
+ LL(0xf344f5fd,0x2d15615e),LL(0xa7f23989,0xe0ba6a8a),LL(0x1c84e3f2,0xbbfc5804),LL(0x6f4ba826,0x22ffeaae),LL(0x94292682,0x1e9bf274),LL(0x46c02af9,0xc768f891), LL(0x177cdafa,0x894127d6),LL(0x2acdc791,0x8d0523da),LL(0xdc78c3c4,0x71ada9ae),LL(0x2c532a01,0xf21dbbb9),LL(0xacb20fda,0x0c797d5e),LL(0x16cf57b0,0x1ff99d76),
+ LL(0x493c1d64,0x99b5f150),LL(0xfb74075e,0x3422b656),LL(0xff19bf24,0xe7493900),LL(0x260925ed,0xc82e5b80),LL(0xc0ea1eaf,0x3398d340),LL(0x1287121e,0xe7de2ba1), LL(0x87847031,0xea6dfb0b),LL(0x566af2f2,0x73bed0a1),LL(0x12012999,0xe26678bf),LL(0x32e5cebc,0xb5369e4d),LL(0x6d181e32,0x2304eac8),LL(0x3d364add,0xafdbd954),
+ LL(0x75da4189,0x5b1a53ca),LL(0x2eb4862b,0xa9048580),LL(0x2783ad6a,0x31942409),LL(0x1a9e025e,0x15a4c5e1),LL(0x13837199,0x841bc533),LL(0xe642954a,0x6e9d3e14), LL(0xd436ec5c,0xf4a02bbd),LL(0xc6d6ad53,0x62fe177b),LL(0xac86425a,0xedbf1e4e),LL(0xd9f752f5,0xff9359c8),LL(0x2d7ad656,0x79c685d9),LL(0xfdde9052,0x8d82c0c4),
+ LL(0x702f640d,0xf55f868e),LL(0x1dedda11,0xe459aa9b),LL(0xbb5ba193,0xbec0ff9b),LL(0x57724703,0xf7325c49),LL(0x23e0e4fb,0x5ab8f063),LL(0xecb0fd7c,0xfbf02e91), LL(0xa2e5fa31,0xcc72e8da),LL(0x32cb53cf,0x47de2528),LL(0x4252763c,0xbfa646e6),LL(0xb8d81de3,0x7a769efe),LL(0x1e772f00,0xf5ec7003),LL(0x2729aa5e,0x049bea9a),
+ LL(0x759090d6,0xe987ba54),LL(0x619ef08b,0x904d6901),LL(0x2024a6fc,0x9e16d138),LL(0xa9f3b7e4,0xb6f0459b),LL(0x17ee069a,0x1f2a5308),LL(0x2be31049,0x99403b2e), LL(0xbfb2f288,0xba1663c6),LL(0xc7a92b41,0xf829195c),LL(0x8ae621b1,0x89b915ee),LL(0x50f8ea92,0x3fbbb1e1),LL(0x8c901ddc,0xb1fe7f97),LL(0xbbc69ca4,0x16d1f62c),
+ LL(0xfda072db,0x51f19bb3),LL(0xe3f7e0a2,0xa815459f),LL(0x987112ca,0x5f7cde2f),LL(0x759de2cb,0xdc51d948),LL(0xed49bd98,0x9d05c410),LL(0x364341fd,0xf063ab99), LL(0xd1aa0a11,0xd7869d68),LL(0x5d862d01,0xc2029106),LL(0xc2591073,0x7f258180),LL(0x6ebc4ebc,0x7b90fc7a),LL(0x3dda1d68,0x5565390f),LL(0xa44e4493,0xae77fca8),
+ LL(0x47c49ee8,0x97564e48),LL(0xab4ebef5,0xc56bb5a9),LL(0x7b4f86bc,0x80d96941),LL(0x41026cf0,0xa594b4e5),LL(0x5a89ece9,0xd56c8996),LL(0x6a0f922b,0xbcf60931), LL(0x1103475c,0x70259616),LL(0x8a2a2abb,0xb1224fb5),LL(0x715cd61b,0x0a437a03),LL(0x739921ed,0xcbe2d2b2),LL(0x385541c4,0xf3b1b5e9),LL(0xae010520,0x5d0984f4),
+ LL(0xcfd9295e,0xb4a2742d),LL(0xae929cd0,0x9cd36774),LL(0xdd7fcf4f,0xb15fadcc),LL(0x37d4fcc6,0x0b1fa2b3),LL(0xf01c7ab7,0x242c7b26),LL(0x50574cc9,0x2be8131b), LL(0xbd89a03c,0x6ee50f42),LL(0x005e7765,0xc7f6ff8f),LL(0x8420501b,0x04d13af1),LL(0x1b6e7d2a,0xc22e092b),LL(0xe9516f80,0xa393be7e),LL(0xb80bb5b5,0xa2593652),
+ LL(0x8b23bebb,0x5caa5da6),LL(0x1fdbbdf4,0xa1ad33e8),LL(0x4e5c1de0,0x18dc93cf),LL(0x5bd9e178,0xc3e6addb),LL(0x7cb8cd03,0xf30d517e),LL(0xf1abc417,0xbb84ce54), LL(0x67699659,0x0774b64c),LL(0xb7d4a401,0x228005b9),LL(0x80b2d3d2,0xd8c2ec5b),LL(0x3450ba7f,0x419c4cd9),LL(0x789286a6,0x520ae681),LL(0xaa8bcfbb,0x24b67ea9),
+ LL(0x0f74808f,0x9e41b9b7),LL(0x0c061bdb,0x2d835dae),LL(0xf272346c,0x67e50c8c),LL(0xdef57493,0xc98a5ef5),LL(0xa02676fc,0xc2dea8af),LL(0x6ace4659,0x59508de2), LL(0xda6cd733,0xc2b707aa),LL(0x4be7bfb9,0x6c1f226a),LL(0xa778c20b,0x5b580fa2),LL(0x57af166b,0x272c3a1d),LL(0xca78ce62,0xe47a64a9),LL(0x71d35087,0xd12db7d7),
+},
+/* digit=64 base_pwr=2^320 */
+{
+ LL(0x1a42e5e7,0xc20fb911),LL(0x81d12863,0x075a678b),LL(0x5cc0aa89,0x12bcbc6a),LL(0x4fb9f01e,0x5279c6ab),LL(0x11ae1b89,0xbc8e1789),LL(0xc290003c,0xae74a706), LL(0x79df3f45,0x9949d6ec),LL(0x96c8d37f,0xba18e262),LL(0xdd2275bf,0x68de6ee2),LL(0xc419f1d5,0xa9e4fff8),LL(0xa52b5a40,0xbc759ca4),LL(0x63b0996d,0xff18cbd8),
+ LL(0x844eefc5,0xf6827150),LL(0x4515ef68,0x002e82c4),LL(0xc51916c4,0xa46c8f55),LL(0x61ee081f,0x98c3524b),LL(0xad64872a,0x5ab7f2c2),LL(0x7e555faa,0x0b503ff0), LL(0xb4c58d29,0x802e0d23),LL(0x2fd917fe,0x12289040),LL(0x7af20d26,0xb56d1908),LL(0x6be50784,0x8d619e21),LL(0x1372b851,0x10fdbb72),LL(0x4935576e,0xf2c1673e),
+ LL(0xd7dd47e5,0x73c57fde),LL(0xd49a7f5d,0xb0fe5479),LL(0xcfb9821e,0xd25c71f1),LL(0xcf6a1d68,0x9427e209),LL(0xacd24e64,0xbf3c3916),LL(0xbda7b8b5,0x7e9f5583), LL(0xcf971e11,0xe7c5f7c8),LL(0x3c7f035e,0xec16d5d7),LL(0xe66b277c,0x818dc472),LL(0xb2816f1e,0x4413fd47),LL(0x48383c6d,0x40f262af),LL(0x4f190537,0xfb057584),
+ LL(0x51a135f6,0xd97a9b14),LL(0x97b4df14,0x6d16aaf5),LL(0x54818818,0xc57160c2),LL(0x1d59be44,0x4dbdeab6),LL(0x81f2b247,0xb93a9dad),LL(0xecbcab33,0xe2868cf5), LL(0x83a86711,0x5e1ce828),LL(0x29c55428,0x29a9ca2f),LL(0x2d82b0df,0xe716273a),LL(0xac8ff52f,0xb017f5f6),LL(0x70ea7ccd,0x7563e799),LL(0x3f0e674b,0x5fedf0a6),
+ LL(0x08962f6b,0x487edc07),LL(0x190a7e55,0x6002f1e7),LL(0x10fdba0c,0x7fc62bea),LL(0x2c3dbf33,0xc836bbc5),LL(0x4f7d2a46,0x4fdfb5c3),LL(0xdca0df71,0x824654de), LL(0x0c23902b,0x30a07676),LL(0x77fbbf37,0x7f1ebb93),LL(0xfacc13db,0xd307d49d),LL(0xae1a261a,0x148d673a),LL(0x52d98650,0xe008f95b),LL(0x9f558fde,0xc7614440),
+ LL(0xaf907da2,0xd084564b),LL(0x51d4997a,0x5b2ae487),LL(0x3bc7206d,0x24bd4bf6),LL(0xfc3d5772,0xdd37b4ef),LL(0x35c4924f,0x8156d6f6),LL(0x1d1d396e,0x21e067c3), LL(0xd40c7db8,0x977b3b39),LL(0xf5ad63bc,0x7ea4ecb4),LL(0xae811d70,0xe581f9c4),LL(0xa06c7f0d,0xe5441d5c),LL(0x1949d87f,0x0275c92b),LL(0x780469bb,0x511fd3e1),
+ LL(0x9cb16650,0x17cd6af6),LL(0x69f4eebe,0x86cc27c1),LL(0x78822432,0x7e495b1d),LL(0x1b974525,0xfed338e3),LL(0x86f3ce21,0x527743d3),LL(0xb515c896,0x87948ad3), LL(0xb17f2fb8,0x9fde7039),LL(0xd9b89d96,0xa2fa9a5f),LL(0x36ff74dc,0x5d46600b),LL(0x8302c3c9,0x8ea74b04),LL(0xf744b5eb,0xd560f570),LL(0xfe762402,0xc921023b),
+ LL(0x88d7b3fb,0xa7f85014),LL(0xec78386e,0x3b5ec513),LL(0x2ad5053d,0xc6586b8a),LL(0xfbcebe43,0x88c09a43),LL(0x20054f16,0xde7f2a4a),LL(0xbbbb147f,0x63daba80), LL(0x7d352b55,0x087e48f3),LL(0x8317ab79,0x997e32a0),LL(0x7f27cac7,0x8ae802ff),LL(0x37b1f6e1,0xb01a131c),LL(0x9a6d1dea,0x3f0d4c2e),LL(0xe7ceef80,0xe06114fc),
+ LL(0xfff4c8ed,0xa35ab657),LL(0x8a5fabd7,0x017c6124),LL(0x09acda28,0x56463025),LL(0x14cf238a,0x6038d361),LL(0xaf1b9f07,0x1428b1b6),LL(0x7482e95c,0x5827ff44), LL(0x780ff362,0xcb997e18),LL(0xe0bcac1e,0x2b89d702),LL(0xa837ddc8,0xc632a0b5),LL(0x59762647,0xf3efcf1f),LL(0x38b0d60a,0xe9ba309a),LL(0x20b5fb37,0x05deabdd),
+ LL(0xe5ea795b,0x1e2a4fb1),LL(0x89ef6c3d,0x862616a2),LL(0xf69e2f1d,0x24617f4f),LL(0xffa0eb28,0xe0be24fe),LL(0x4b76a8ad,0x0ffb092f),LL(0x3a0dc9e8,0x21549090), LL(0xe9080e04,0xf255fe06),LL(0x39228e7f,0xd270d25e),LL(0x5d6c6f1c,0x198e45db),LL(0x4373044c,0x6c9060ad),LL(0x61a8cc25,0x3af93464),LL(0xf22bbaa3,0x1945bf59),
+ LL(0xcb8af047,0xd44e5dba),LL(0x943cfe82,0x15400cb4),LL(0x9df88b67,0xdbd69575),LL(0xb2405a7d,0x8299db2b),LL(0x0b1d80cd,0x46e3bf77),LL(0xe82ba3d9,0xc50cf66c), LL(0xf2f747a9,0xb2910a07),LL(0x5adc89c1,0xf6b669db),LL(0x9052b081,0x3b5ef1a0),LL(0xb594ace2,0x0f5d5ed3),LL(0xd5f01320,0xda30b8d5),LL(0xaafcd58f,0x0d688c5e),
+ LL(0x359590bf,0x311df84c),LL(0xdf6ca4b4,0xf907d69d),LL(0x82f22c64,0x876fd367),LL(0x9713e68c,0x64c4d14d),LL(0x6b07f539,0xd431858d),LL(0x84990283,0x39dfea33), LL(0x80cf6498,0x6afb8cf0),LL(0xde060e9e,0x327056bc),LL(0x49a71086,0x5103ce4a),LL(0xcdf853ab,0xfc94be75),LL(0x8ca579cd,0x2bfb105f),LL(0x50454b41,0x02d19c3a),
+ LL(0x2a161074,0x5eee3a31),LL(0xefe2be37,0x6baaae56),LL(0xe3d78698,0xf9787f61),LL(0x50630a30,0xc6836b26),LL(0x1445def1,0x7445b85d),LL(0xd568a6a5,0xd72016a2), LL(0xe355614f,0x9dd6f533),LL(0x91e04588,0x637e7e5f),LL(0xb9fb1391,0x42e142f3),LL(0x41afe5da,0x0d07c05c),LL(0x1394edf1,0xd7cd25c8),LL(0xb99288ee,0xebe6a0fc),
+ LL(0x7d4867b7,0xd9e2c5ee),LL(0x87873152,0x2c5602e0),LL(0x2c06b73a,0xb3358aa6),LL(0x09063076,0x967aec39),LL(0xd2f654fc,0x94dec534),LL(0xd69f485e,0x119aa4ed), LL(0x35bc085d,0xb7c597b8),LL(0xbdbe0d0c,0x8781396d),LL(0x22f92ef5,0xba688929),LL(0xd438f5ec,0xeece3d4e),LL(0x44faac8b,0x4ead06f8),LL(0x9ef7c5f1,0x86a01ba9),
+ LL(0xbabbad86,0xb8e63b7b),LL(0x90d66766,0x63226a9f),LL(0x5cf26666,0x26381836),LL(0x4cadd0bf,0xccbd142d),LL(0x9ac29470,0xa070965e),LL(0x25ff23ed,0x6bdca260), LL(0x87dca7b3,0xd4e00fd4),LL(0x9e0e8734,0xa5097833),LL(0x048173a4,0xf73f162e),LL(0x9c3c2fa2,0xd23f9196),LL(0xe4ac397a,0x9ab98b45),LL(0x543f2d4b,0x2baa0300),
+ LL(0xcde121c7,0xaa03b474),LL(0x55e52c76,0x74a648cb),LL(0xf37b57bc,0xb286ef86),LL(0x2a6371d2,0x95b797eb),LL(0x4077ccbd,0xa489ef89),LL(0x8e99ca6d,0xf46ade04), LL(0x23242d03,0x5cf9e237),LL(0xcb708390,0x33c7d32a),LL(0xba7ba477,0x329523b6),LL(0x57de30bf,0xd406ab87),LL(0x1536ca01,0xaa10e4a2),LL(0xdfa7aac5,0xdcec94f4),
+},
+/* digit=65 base_pwr=2^325 */
+{
+ LL(0x1f5a9609,0x762a5eec),LL(0x765b337f,0xfe4f5f6a),LL(0xaa4f964a,0x0fd534ae),LL(0xd6526f01,0xcf46648e),LL(0x18d71d72,0xbc62a54a),LL(0x4f8488ea,0x48d94f2a), LL(0xa0c72a86,0x62c40de7),LL(0x725dd2ef,0xd73ac51a),LL(0x6ab19096,0x3a51d746),LL(0x2dd1ad3d,0xf07bea4b),LL(0x2ef88078,0x2a0ec467),LL(0x664e435d,0x92598cb3),
+ LL(0xb515fff5,0xee6e7006),LL(0x13258ed5,0xaedf6e39),LL(0xfc45111b,0x373adf7d),LL(0x875c23c8,0x0c7535b1),LL(0x97039d49,0x2a7e04f8),LL(0x9afd1a06,0xd76787ae), LL(0x91b6dc89,0x049dd385),LL(0x932dab78,0x8f0c8ad0),LL(0x925498c2,0xdce057b9),LL(0xda25daa3,0x7b9c9bd2),LL(0xd4decb7d,0x6d0b70a3),LL(0x03df76ef,0x099a2183),
+ LL(0xd8948f95,0x779905b6),LL(0x91cd0206,0x3c7085b5),LL(0x679096db,0xce9af0aa),LL(0xf558913c,0xfdf04f10),LL(0x6f24a2e2,0x05300cb0),LL(0x5d581b35,0xf9d9a2f2), LL(0x6a713751,0x855c8de9),LL(0x0e0c0dfb,0xc9ac24bc),LL(0x97740d65,0x67612a41),LL(0x44c9360d,0x7588a527),LL(0x325cc880,0x928ac910),LL(0xacdd3188,0xa74abdaf),
+ LL(0xb9d926c2,0x3c6c5618),LL(0x4a9099f9,0x7e14c3ae),LL(0xae2fb830,0xb3259c90),LL(0xec31a504,0xf7cc6e43),LL(0x126230bd,0x83bb13c6),LL(0xff1dae3a,0x5a1f4313), LL(0x49b0b65b,0x0cc6c1a5),LL(0x274a84c2,0x67fa836a),LL(0xe604a58d,0xd454c75f),LL(0x2491f872,0xceadfd91),LL(0x9ce116a5,0x6c5575da),LL(0xb24a4481,0xfaa4903f),
+ LL(0x5a4703aa,0x7a8a898d),LL(0x1cd6f9d6,0xc59933ea),LL(0xd28124cd,0x703265f5),LL(0x0178d1fe,0xe1c1bee1),LL(0x241262e9,0x9ff31cd4),LL(0xa3c9f80f,0x9174a939), LL(0xbc2a62ee,0x0f7a3d2d),LL(0x62f1b3ac,0x0454051c),LL(0xa2421254,0x83502c9e),LL(0xb684199b,0xb4fa51fc),LL(0xc5e36a44,0x257e9e2b),LL(0x97d8647f,0x14efeed5),
+ LL(0x5cecb21f,0x6e96a819),LL(0xd8beecae,0x3a58d8b2),LL(0xc0c715a8,0x93c3cbb0),LL(0x541759b7,0xfb06f977),LL(0x771c3d2c,0xf25ba095),LL(0xa3bfd322,0x7560446e), LL(0xa015cb4f,0x7cd99f35),LL(0x0786f235,0xa0e54196),LL(0x8b8e291a,0x0f868f76),LL(0x2f95050b,0xc8260b0b),LL(0xf4c0a462,0xaf38376e),LL(0x98a3395d,0x2b3c0f3b),
+ LL(0xb9d0bdf0,0x0952b888),LL(0x8ce32fb7,0x3973763c),LL(0x6dd860c7,0x221f0ba5),LL(0xb16ac501,0xbb7a27fe),LL(0xbc8fe58f,0xf113b194),LL(0x65839ffb,0x18f3297a), LL(0x8dc30003,0xa2d4eb7c),LL(0x8e334479,0x3fb4b487),LL(0x1a8310e3,0xa4f32c65),LL(0xf78f46ac,0x944cd644),LL(0xf96fb91f,0x14e40c4a),LL(0x4ddf6e72,0xc31402bd),
+ LL(0xb45a8002,0xc5ad791e),LL(0xba2d7a40,0x4a23fd68),LL(0x98544bc4,0x673b9e49),LL(0xd273c360,0x934d8f55),LL(0x68a75a8c,0x7fb48d07),LL(0x5e0fac97,0x2e620105), LL(0xf10ed580,0xbe01655f),LL(0x9e96731f,0xd21d52ae),LL(0x53325138,0x74f830de),LL(0xde9f3fc5,0xa7240331),LL(0xa7e01fa5,0x96b25206),LL(0x07eda4b4,0x3fcfedee),
+ LL(0x9336b8bb,0xf1b08a42),LL(0x9a768ca6,0xbaaa5571),LL(0x2c0a2938,0x70180b4c),LL(0x92dd3c07,0x8e735436),LL(0xe3fd5b1c,0x2dd3af0b),LL(0x1f1af8b8,0x3cf3d179), LL(0xd558c174,0xaff210c6),LL(0xe2560d5e,0x1007938a),LL(0x8f99a78f,0xa625558c),LL(0xc1b91dea,0xa61d5edf),LL(0xdab80815,0xa86a4e5b),LL(0x78283ea3,0x88944bfe),
+ LL(0x0ee6d492,0xeec9b118),LL(0xb7ef00fc,0xf2bd388f),LL(0x3191c902,0x5c6c0bbf),LL(0xd42366de,0x6796929a),LL(0x3285710d,0xeecb5b3f),LL(0x41bad8a3,0x58d6773d), LL(0xd0f05005,0x7cdbade6),LL(0x0e25444b,0xb117e1ba),LL(0xfe4dc071,0xa52b4926),LL(0xe0669f10,0xce8a1b69),LL(0x0db21d46,0x5e765439),LL(0xd929bfab,0xc5dcdea4),
+ LL(0xa36aea84,0x67832f48),LL(0xfc78df1d,0x25256118),LL(0x03b8f04d,0x5a085d70),LL(0x108969c2,0x19a25d9c),LL(0xb70b14b7,0xb6fe713b),LL(0xfa6b89d8,0xba23ac4a), LL(0xc2684b8c,0x6a88e4e7),LL(0x6ab59297,0x3e816609),LL(0x30151aaf,0xdb7927fe),LL(0xaa7d95da,0x0fd67681),LL(0x17432b4c,0xc60e5dd5),LL(0xed48ccda,0x3192dc27),
+ LL(0x8af859e2,0x2116a017),LL(0xbd9f8800,0x8a77a7a2),LL(0xf1f2034d,0xc78836fb),LL(0x3864566b,0x8fd4299a),LL(0x29f9deca,0x0386eead),LL(0x2f1a677c,0x2042ef18), LL(0x2af95cc8,0xed4511c0),LL(0xc93dfbc5,0xdb0a334d),LL(0xb64ab345,0x0d788ac9),LL(0xb20638f2,0xd8410402),LL(0x592448e6,0x8aca5131),LL(0x000de69b,0x3ac508d2),
+ LL(0x4f9b2400,0x1ee6d3b5),LL(0x00c9c182,0x4c71999a),LL(0x35fc481e,0xd6b1c470),LL(0xf8b5d59c,0xf41ef454),LL(0x2824a13d,0x7edbc3c9),LL(0xb7aa0ade,0xa3baba91), LL(0x2b97b392,0x75c77e71),LL(0x9cc2d53c,0x8ec107d6),LL(0x29322233,0x652146fe),LL(0xe679e990,0x710578df),LL(0x260547db,0x47f838ba),LL(0x23a78365,0xa4e57bec),
+ LL(0xefb058db,0xe4320313),LL(0x3d04e752,0xaad2377c),LL(0x9865c63e,0x3f8cbca9),LL(0x3009e55d,0xe89238a5),LL(0x12519936,0x58fad5fe),LL(0xb024b695,0x03b16a00), LL(0xf8f3b8c7,0xa556d096),LL(0xd8a599c4,0xce6df197),LL(0x6a13b031,0x45ac8a25),LL(0xca6819e8,0x31af2dcc),LL(0x390418e9,0x7a4dce86),LL(0x4600d7f4,0xdd24b0bd),
+ LL(0xb96e667f,0x88a8aa87),LL(0x4e704eaa,0xb9a76c18),LL(0x72c924b7,0x25d4edc1),LL(0x16b67f80,0xe56872a8),LL(0xc464e4ff,0xda0dbb11),LL(0xc8cec410,0x0435f391), LL(0x0983fd7a,0x8d9b4043),LL(0xe7ff343c,0x51ec5bc1),LL(0x85994bc9,0x8bc85fc4),LL(0x8806c150,0x69c78834),LL(0x3db3665b,0x542cec89),LL(0xfd720bde,0x931bc4b0),
+ LL(0x8d5c039f,0x3e6e9381),LL(0x8a8d2cc9,0x80949422),LL(0xb843ec06,0xf2d7c8b4),LL(0xaf8a23f1,0x0055d882),LL(0xd3792335,0xe848010e),LL(0x55e08e74,0x9b41a55f), LL(0x5de83059,0x956ea8e9),LL(0x3263678e,0xf159a997),LL(0xcca1b548,0x5f7b9271),LL(0xf1d0b7f1,0xd41d2281),LL(0x5c9963fb,0xb187047b),LL(0x02536cd8,0x213ff6af),
+},
+/* digit=66 base_pwr=2^330 */
+{
+ LL(0x0d0fa76c,0xe51a9570),LL(0x4d2e9c8e,0x67c7890e),LL(0xf974d2cb,0xc6160fa2),LL(0x4c6a78de,0xe00474f7),LL(0x0ac89d11,0xee916e51),LL(0xf826f133,0x1adad97a), LL(0x8d2d77f3,0x3fc65d3f),LL(0x0ba6c300,0xda942075),LL(0x0b9196b1,0x5237a82e),LL(0xa572b6f5,0x4975e680),LL(0xb9bed2bc,0x41ea8b92),LL(0x9826825e,0xbe0ad710),
+ LL(0x9fcaba39,0x8a390dca),LL(0x278d22b3,0x3879f0b4),LL(0xbc5e82f1,0x77bbea69),LL(0x4628d6f1,0x71f02e2d),LL(0xf968e240,0x6260790c),LL(0x665270ee,0x1c7f3df5), LL(0x1a87b1c8,0x33639545),LL(0x4ffd9fb8,0x2011fd21),LL(0x7807ed55,0x69060f86),LL(0x9dfa452c,0x1b0ac011),LL(0x06d27c0d,0xbbdb25fe),LL(0xa60ef90c,0x5c25d23a),
+ LL(0x734b2e9c,0xd3eb69e4),LL(0xc35ff1b3,0x1c2754e2),LL(0x9f3e8c51,0xa26681e6),LL(0xa2cae737,0x7892ad11),LL(0xcbd8bda6,0x88b1da43),LL(0x419d21c4,0x8a576942), LL(0xc90f4545,0x7c124343),LL(0x26453bae,0xa5a8d93b),LL(0x76ae72e8,0x9a4c08fd),LL(0x7b064e94,0xa08b82d9),LL(0x83725330,0x4f803ba0),LL(0x865235f3,0x33672455),
+ LL(0xc8110f1f,0x1877dfd0),LL(0x18db27c2,0xea88f59d),LL(0xc78e295e,0x9d089536),LL(0x74a04cc5,0xcbb5d553),LL(0x827f75ed,0xe3666006),LL(0x61e7378c,0x8557b81a), LL(0xed223f48,0x74170170),LL(0xd86ee829,0x84197a6e),LL(0xac1c4a0f,0xd75a30f8),LL(0x3cd92824,0xd7e7be0d),LL(0x1b5e86d4,0x5ea0abdb),LL(0xb3b615ef,0x41146ae1),
+ LL(0x1ae5e9da,0x570deceb),LL(0xb73ead01,0x5c079c70),LL(0xd2ce6639,0x522a30a6),LL(0xf4056ac9,0x71dc5c3f),LL(0xbaac149f,0xd93c7a2d),LL(0xf1844ceb,0x5c3298b8), LL(0x8c23c0dc,0x282adf40),LL(0x9b646f86,0xbe498189),LL(0x628da9e5,0xe77c1950),LL(0xa1fd5a18,0x38cc27ba),LL(0xaacdca52,0xb5579728),LL(0xc8e1ecbd,0x8d34fdb4),
+ LL(0xadea7d6a,0x323f2102),LL(0xb694b253,0x035b354e),LL(0x5b8a36c2,0x66dc4e4a),LL(0x71795ca4,0xb6092224),LL(0xd300d80f,0xd8c6d7ee),LL(0xb3b94954,0xf31f258d), LL(0x277ced5b,0x0f2eb679),LL(0xeba40e3f,0x0b16efa3),LL(0x0dca4f36,0x40003507),LL(0x59a9a3a1,0xd34c91cb),LL(0x86da6408,0x5e8fea32),LL(0x03f31728,0xf237959f),
+ LL(0xbbaaedc6,0x1b5bc630),LL(0xb49cbb3b,0xe7d25088),LL(0x0deb8cf0,0x5622cbf7),LL(0xd309c3ba,0x3b20803c),LL(0xff45e2fc,0x64c2e7de),LL(0x9aab84a5,0xfa730ffb), LL(0x4edfb52e,0xba83cc51),LL(0x748bbd69,0xe05c0140),LL(0x2254ec43,0x27bbb5f5),LL(0x324c8c40,0xca740989),LL(0xd26491b4,0xa21488b1),LL(0x69d8626b,0xe2753a1f),
+ LL(0x8956146c,0x618ca06b),LL(0x552cdecf,0xd51f1e6f),LL(0xa3b6ce7d,0x981372cc),LL(0x5f14bb57,0xb44a68ee),LL(0x6373abbb,0xfc1167e9),LL(0x767d4c0a,0x3d621f8b), LL(0xf6ecc778,0xc6dcdfeb),LL(0x82d1fbdd,0xddda9262),LL(0xbfcbf2f7,0x477501aa),LL(0x67aa8277,0x0be7228a),LL(0x1daab9cd,0x5de7b833),LL(0x262feb4a,0xb88a4f9a),
+ LL(0x936fb33f,0x28f18586),LL(0x381bf7bb,0x9809b2ab),LL(0xeac3c252,0xf6e16931),LL(0x5e151187,0x366d1833),LL(0x7a3b6460,0xe5b4c235),LL(0x0a68bc91,0x693a9fa5), LL(0x6a7f8b6e,0xa35f104a),LL(0x688676c4,0x3e5d6981),LL(0x0651a609,0xc0c081b1),LL(0xd77057c9,0x6df5da2d),LL(0xc4602847,0x8bb271bb),LL(0xc4bd07d8,0x322547b3),
+ LL(0x233d39e4,0x8c283529),LL(0xc6092096,0x96300796),LL(0x5dde766c,0x2c549de5),LL(0xb4151002,0x27e0b444),LL(0xf2f88f1b,0x802e5fc3),LL(0x8ba1956d,0x2af579c2), LL(0xd68196c7,0x52edd04e),LL(0x74a202b0,0x2e22e714),LL(0x8bf66459,0x33894824),LL(0x9e39df55,0x8f0d8c25),LL(0x6c5276d9,0xee4f109e),LL(0xc5dc0bf0,0xc0c893f0),
+ LL(0xf8482849,0x06054c76),LL(0x5fcca65d,0xc24b4a6a),LL(0xa17ebda3,0x71c27e01),LL(0x1be9dfb8,0x1ffce028),LL(0xebc43854,0x3784c950),LL(0xd5086510,0xcf0ecc2d), LL(0xbe24d8eb,0x86d0fc3c),LL(0x1f21788e,0x5bad0191),LL(0xc49b3a12,0xe2c3bcb9),LL(0xf7d5992d,0x66f82433),LL(0x13969246,0xf7cc5eb9),LL(0x8660a6da,0xe52defd4),
+ LL(0x53fd1a04,0x7a9623b6),LL(0x3a3b8500,0x13bd35bf),LL(0xe0f8e530,0xf8a5dec9),LL(0x1d65dcd4,0x88bcbe29),LL(0x6739541c,0x09fe3803),LL(0xe716a97a,0xebd04b7f), LL(0x1e5ef7cb,0xbd8e34df),LL(0xd7c4fd6c,0xddfc4243),LL(0x3519411f,0x0183d905),LL(0xf7a3c483,0x63450996),LL(0x01355739,0x18283cea),LL(0x9aaa72f7,0x8c1d72cf),
+ LL(0x8dc72468,0x551e1b4e),LL(0xa7b2f1ac,0x8a926cb2),LL(0x0fd12fad,0xb873e83b),LL(0xa4e7fb13,0xb6cde14f),LL(0x5befc256,0x81ae4141),LL(0xb4c7631c,0xffb0c636), LL(0x8a2478fe,0x80f1408f),LL(0x44fa7605,0xde6d051d),LL(0x4d44a1e4,0x5a15b1f8),LL(0xa0daafe3,0x1a0031c5),LL(0x597652a7,0x304338dd),LL(0xf257f17a,0x6830dcc7),
+ LL(0x193aabbc,0x4a67ec76),LL(0xd74761f9,0x3da6dec6),LL(0x0b35bb70,0x751720c9),LL(0x8d9e0f8b,0xe5e04905),LL(0x0858f29c,0x3cd37c84),LL(0xb881733e,0x7ff1abfb), LL(0x0c4f7694,0xa0c2698b),LL(0x96b95e4e,0xc7364192),LL(0x37ece651,0xcfa55c55),LL(0x7cb1e9e1,0xa2bbd6ae),LL(0xa0eb0e8a,0xcd2292b9),LL(0x8d5030d0,0x8aba99e1),
+ LL(0xdc4a1d3e,0xb7c74c58),LL(0x0331ea39,0xe3ec3016),LL(0x023c8712,0x83afb271),LL(0xc9c82680,0xc2670d56),LL(0xfeca1061,0xd426f350),LL(0xba6edc01,0xe8aee692), LL(0x46e801d9,0xc916fbe5),LL(0x7097286e,0xcb001c37),LL(0x78ee1328,0xfcf79d26),LL(0xb6a4afb3,0xb05b0634),LL(0x306da14f,0x2ab327bb),LL(0xba5ff534,0xc11a0294),
+ LL(0xe19763dd,0x7b7da028),LL(0x8b98ff78,0x662f54df),LL(0x51f3dbd9,0xc056d83c),LL(0xa91d085a,0xe2f4d46f),LL(0xeb35262d,0x31759c9c),LL(0x0c9dd29e,0x624d0cf2), LL(0x1624b02d,0x108cf9bb),LL(0x345531d6,0xa241444e),LL(0x73d372b2,0xf69816b2),LL(0xd5415e53,0x126575a7),LL(0x306b8b0e,0x546bb4c1),LL(0x4d54ea5e,0x82bb0c12),
+},
+/* digit=67 base_pwr=2^335 */
+{
+ LL(0xf9474bb7,0xdaa7fcc9),LL(0xafa5db2a,0x3c82e74b),LL(0x9894edce,0xfbf918c5),LL(0xa9ac29a7,0x470c45ed),LL(0xbc372f2c,0xdfd44f6f),LL(0xa1e38d3f,0x73a4790a), LL(0xa9674837,0x23d2400b),LL(0x136a92da,0x3dad71bc),LL(0x48baa4ab,0xc76a4881),LL(0xbc26e6b0,0x73227e4e),LL(0xe8ef5662,0xe732edcf),LL(0x0c5662bb,0xfe96aa5f),
+ LL(0x139b3239,0x87c7dd7d),LL(0x4d833bae,0x8b57824e),LL(0x9fff0015,0xbcbc4878),LL(0x909eaf1a,0x8ffcef8b),LL(0xf1443a78,0x9905f4ee),LL(0xe15cbfed,0x020dd4a2), LL(0xa306d695,0xca2969ec),LL(0xb93caf60,0xdf940cad),LL(0x87ea6e39,0x67f7fab7),LL(0xf98c4fe5,0x0d0ee10f),LL(0xc19cb91e,0xc646879a),LL(0x7d1d7ab4,0x4b4ea50c),
+ LL(0xe2fdc88b,0x7e047d9c),LL(0x715be007,0x4f6166d9),LL(0xd0debb0a,0xd9661068),LL(0xc3dafce2,0x82f02fd3),LL(0x00f8df79,0x41a6b644),LL(0x6cedd3a8,0xccd5a798), LL(0xf11431b2,0xb6617354),LL(0x8a677e83,0x116d0274),LL(0x89ef485a,0x2f399390),LL(0x5e2270d2,0x3ee06862),LL(0x06d6c72f,0x8c9a70de),LL(0x4e4497e3,0xd7e69177),
+ LL(0x7db62b5a,0xcfbcbc4a),LL(0x4ab45dde,0x2919bf51),LL(0x22322f91,0x735de056),LL(0x7662ae23,0xd2590bda),LL(0xd82be7a6,0x63d468fe),LL(0x695ea172,0xc84d0435), LL(0x20a6fccd,0xc50f4941),LL(0x620f44f1,0x2d613990),LL(0x1fd25778,0x680ccd04),LL(0x4a3d0808,0x25ddac44),LL(0xc4684cba,0x41d8b738),LL(0x53963888,0x2611645f),
+ LL(0xe9f43747,0xffe6bb22),LL(0x22f6cd09,0xf387957b),LL(0x607a4892,0x3eb09302),LL(0xf3d2f552,0x52c733a8),LL(0x741bd215,0xcc935b2e),LL(0x1ae0b28e,0x5fff37e3), LL(0xc2e9bc20,0x4234e33c),LL(0x39ea2555,0x4ee1488e),LL(0x17156a8a,0xb8821daf),LL(0x1af16ade,0xc7b45844),LL(0x5b4fa74d,0xc1009ec7),LL(0x5d7cf8bd,0xe0262e65),
+ LL(0xb0279be5,0xb05cb834),LL(0xf08c5f93,0x2de7d0eb),LL(0xefa9e4f0,0xf023b5aa),LL(0x9bd075ec,0xb8061e5d),LL(0x1aa41bfb,0x7d2ba50f),LL(0x90865d96,0x8963f3e3), LL(0x4713ec7a,0x7f221a79),LL(0x8500b4c3,0xc83bc517),LL(0xf6ab1540,0x085feb6a),LL(0xdc87cd93,0xfd141024),LL(0x3239dbf6,0x3e196fdb),LL(0xdbcd5364,0xb7cf3e16),
+ LL(0x41a64252,0x72544edb),LL(0xa6fe493d,0x5f3d376f),LL(0xd635df1e,0x17ae424f),LL(0xdf598c63,0x69cb55a0),LL(0x6ce0f1d5,0x31297f4a),LL(0x1bd11b61,0x4573bb7d), LL(0x45a1e918,0x1d8a65c1),LL(0xe5dc2e63,0x2729ab25),LL(0x3ecc307b,0xa3dd0df0),LL(0x952019dd,0x4856546f),LL(0xc784e4fe,0xf8d39888),LL(0x0043b09e,0xdc6732c7),
+ LL(0xe03a2fb4,0x1466c9f5),LL(0x862a58a2,0xb866c006),LL(0xb5865550,0x291e8c75),LL(0xe65862cc,0x1ddb7154),LL(0x2b997167,0x285153bc),LL(0x954b6c19,0xe2fce0e7), LL(0x16dc2937,0x985d4506),LL(0xee41d9c3,0xf7f14216),LL(0xfa5fe5e5,0x39e098da),LL(0xf90f231d,0x3fc26046),LL(0x32afd0b5,0xde5d5ced),LL(0x60c09c18,0xad688b1d),
+ LL(0x8f84e987,0xefd9aed0),LL(0xae8c8308,0x5ee0c707),LL(0x2aafc403,0x4c8a7653),LL(0xa232436a,0xfafb60ce),LL(0x9934f053,0xc641294d),LL(0x30310529,0xc673e5b2), LL(0x9066469d,0x3c8fa99a),LL(0x7c09af37,0x5626038b),LL(0xabd66748,0x6ffd8f9b),LL(0xcea58a67,0x21ced048),LL(0x1496d048,0x31071213),LL(0xa9c28d0d,0xfa575242),
+ LL(0x0f806b59,0x3720b172),LL(0xf224597b,0x1f696d47),LL(0x5b54eefc,0x03c46e31),LL(0x72b0edaa,0x387e4664),LL(0xee77476e,0xfc59b03d),LL(0x607a7259,0x86854e54), LL(0x3e9320dc,0x1478bcee),LL(0x8c9d87e4,0x4aa825a8),LL(0xcf272ee0,0x71272f72),LL(0x8bd885cd,0x19e3a4a3),LL(0x376ba31c,0x9af6415b),LL(0x807b2b36,0x6394b5a7),
+ LL(0x77460193,0x1bf6c56b),LL(0x5666ae6d,0xd6f7fabf),LL(0xe3e839d1,0xdf677909),LL(0x08cb9984,0x9124d341),LL(0x86a0c7c3,0xbb6b591d),LL(0x8f527a6a,0x4bf33423), LL(0x26941bfe,0x7d137790),LL(0xcf6e4481,0x15a0b541),LL(0x124d5b9b,0xdf833b87),LL(0xa7fdf95d,0x85827dc5),LL(0x49e520af,0xf05a2c45),LL(0x91e0645a,0xfb506d53),
+ LL(0xe572e06d,0xdbfcfa75),LL(0x8b7d5653,0xafa019d0),LL(0x67a19b60,0xcc6c851d),LL(0x31ae1a67,0xace88bf4),LL(0x93d1e135,0x74554a61),LL(0x4211890a,0x51ba2cdd), LL(0x9e8d1f02,0x7cb32689),LL(0x8b66ab99,0x29a6b825),LL(0x766e72f3,0x0a672c21),LL(0x880642e3,0x24bb718a),LL(0x184d2b36,0x425dc41d),LL(0x891024ab,0x96a1468e),
+ LL(0x665fe173,0xeff22b64),LL(0xef2eabea,0x38efdef6),LL(0x21a309df,0x8a1f3791),LL(0x2431e2ed,0xa9cf02cf),LL(0x1d939394,0xf38507dc),LL(0x82fc3178,0xf116b085), LL(0xc7571366,0x4c5460dc),LL(0x978495fd,0x99efd9dd),LL(0xf26e347d,0x5159dd41),LL(0xe97ee9f1,0x692962ce),LL(0x6a288815,0x1e2f3af2),LL(0xa71ade78,0x03512344),
+ LL(0x26df7050,0x3180789c),LL(0x96cdfd31,0xe375a43e),LL(0xe99e922d,0x7951b895),LL(0x3d0bbe80,0x987ea250),LL(0xe2fe79c0,0x6d2f49f0),LL(0xc2b18d2a,0xc9c2c636), LL(0xd8c8620c,0x707798f3),LL(0xd5c6a0ee,0xc2d603da),LL(0xbc447940,0x46cf1e32),LL(0x38a845f3,0x4dfc1459),LL(0x455e5d92,0x210083fe),LL(0xa1fedc3f,0x6be989ea),
+ LL(0x9f019162,0x55d4fdc3),LL(0xf1ec4585,0xa8222d08),LL(0x3a0ae4f9,0xd987e3eb),LL(0xa9c7a693,0x07deda59),LL(0xf04ee53f,0xc06567d9),LL(0x71364c4d,0x93945788), LL(0xbaa5bc16,0xbb2a2422),LL(0xbfa3931a,0x89574a5d),LL(0xf300f081,0xf09b331e),LL(0x1a0ff82b,0x644de9b7),LL(0xa5ecdf9b,0xae023ce4),LL(0xc1907aac,0x5b67cf8b),
+ LL(0xdacc038c,0x72fc8198),LL(0xf1077bbd,0x5fdae1d9),LL(0xd99e3036,0x369198bb),LL(0x0efddfca,0x6b68390a),LL(0xf0914741,0x8c35f3e4),LL(0xca7d7807,0xd2bc54ec), LL(0x3a8695d1,0x564d991e),LL(0x1b0d937d,0x5e1e14c8),LL(0x5d635893,0x51f30dab),LL(0xf944e49a,0x0427e346),LL(0x6a233bc0,0x1e0bf1b5),LL(0x617bf93e,0x75b0ee6c),
+},
+/* digit=68 base_pwr=2^340 */
+{
+ LL(0xd2e15a8c,0xd23658c8),LL(0x16ba28ca,0x23f93df7),LL(0x082210f1,0x6dab10ec),LL(0xbfc36490,0xfb1add91),LL(0x9a4f2d14,0xeda8b02f),LL(0x56560443,0x9060318c), LL(0x64711ab2,0x6c01479e),LL(0xe337eb85,0x41446fc7),LL(0x71888397,0x4dcf3c1d),LL(0x13c34fd2,0x87a9c04e),LL(0x510c15ac,0xfe0e08ec),LL(0xc0f495d2,0xfc0d0413),
+ LL(0xc4e81268,0xb097b2c5),LL(0x1d50ca8c,0x7ef17552),LL(0x42099644,0x638266e9),LL(0xff729073,0x43d059de),LL(0x148c3940,0xeebb5fe1),LL(0xdaa8e925,0xb82e73d1), LL(0x254380fd,0xf43c78d8),LL(0xfce37fa0,0x2beabc58),LL(0x6b636357,0xcdd5a7d6),LL(0xe096a954,0x8b70a2eb),LL(0xd0afa2fc,0x011d5419),LL(0x04fb095a,0x3e49eb67),
+ LL(0x156636c2,0xeb05c516),LL(0x090e93fc,0x2f613aba),LL(0x489576f5,0xcfd573cd),LL(0x535a8d57,0xe6535380),LL(0x671436c4,0x13947314),LL(0x5f0a122d,0x1172fb0c), LL(0xc12f58f6,0xaecc7ec1),LL(0x8e41afd2,0xfe42f957),LL(0x3d4221aa,0xdf96f652),LL(0x2851996b,0xfef5649f),LL(0xd5cfb67e,0x46fb9f26),LL(0xef5c4052,0xb047bfc7),
+ LL(0x168d5e60,0x88e7ac8e),LL(0x6188a98f,0x53abd569),LL(0x18be419a,0x3b96d529),LL(0xc057621c,0x7e75e354),LL(0x5ce57e59,0xcb1b709f),LL(0x844f2463,0xe78befa2), LL(0x3276d4a0,0x53608199),LL(0x157f2024,0x92636ade),LL(0xe0411414,0x6dd0d348),LL(0x4d73eeae,0x5b28e950),LL(0x690ed85e,0x08439232),LL(0x6da14b58,0xdde1a349),
+ LL(0xf4484374,0x5cbdc442),LL(0xf92452ef,0x6b156957),LL(0xc118d02a,0x58a26886),LL(0x75aaf276,0x87ff74e6),LL(0xf65f6ec1,0xb133be95),LL(0x4b1b8d32,0xa89b6284), LL(0x09c81004,0xdd8a8ef3),LL(0x0cf21991,0x7f8225db),LL(0x26623faf,0xd525a6db),LL(0xbae15453,0xf2368d40),LL(0x84f89fc9,0x55d6a84d),LL(0x86021a3e,0xaf38358a),
+ LL(0x33c12f53,0x10520b27),LL(0x9286a1f5,0x97d4ef43),LL(0x8948f78b,0x12468ef8),LL(0x50ad452e,0x40a9d275),LL(0xc1c48470,0x5e382347),LL(0x33e73ace,0x5cd739fd), LL(0x1041f8f3,0x7d83d02f),LL(0xe314ad92,0x32642eb0),LL(0x885679e6,0x6716d448),LL(0xfc95919c,0x0e12bdd5),LL(0x92c2194a,0x7da44204),LL(0x15ffcd2d,0x78956db1),
+ LL(0xff52e280,0xbd048bdc),LL(0x526a1795,0x8a51d0b2),LL(0xa985ac0f,0x40aaa758),LL(0xf2c7ace9,0x6039bcdc),LL(0x6aec347d,0x712092cc),LL(0x6b5acab7,0x7976d090), LL(0x6eed9617,0x1ebcf80d),LL(0xb0f404a4,0xb3a63149),LL(0xd0b610ef,0x3fdd3d1a),LL(0x98c28ac7,0xdd3f6f94),LL(0x3a59750f,0x650b7794),LL(0x2d3991ac,0xec59bab1),
+ LL(0x39ed9ec9,0x6cbd2757),LL(0xfe5d4aa8,0x5db68a68),LL(0xe4c58c7b,0x177eaa0b),LL(0x0e488784,0x603551ef),LL(0xdf916b0f,0xc8eba131),LL(0x159732e2,0xd0dbceda), LL(0xb0834afa,0x55acca84),LL(0xb59ffbf5,0xdbe98440),LL(0x3bd3b202,0x162a2c70),LL(0x6ddd8eba,0x4c5e5d25),LL(0x77b1d93d,0x66e7844a),LL(0x110b9dcf,0x1292bc0e),
+ LL(0x2e552766,0x01f40e88),LL(0x66f5354f,0x1fe3d509),LL(0xb3a8ea7f,0x0e46d006),LL(0xf831cd6a,0xf75ab629),LL(0x91465119,0xdad808d7),LL(0x17ef9b10,0x442405af), LL(0x672bdfcb,0xd5fe0a96),LL(0x355dbdec,0xa9dfa422),LL(0x79b25636,0xfdb79aa1),LL(0xeece8aec,0xe7f26ffd),LL(0x7edd5aa2,0xb5925550),LL(0x8eb3a6c2,0x2c8f6ff0),
+ LL(0x9341a2e0,0x34a4632c),LL(0xc525bc5a,0x05ca421b),LL(0x4ae3284a,0x441cf2eb),LL(0x146012ab,0x1a57684e),LL(0x30acfd0e,0x23a52ee3),LL(0x7d29e389,0xc3f4d94a), LL(0xb4154640,0xfbd4d48e),LL(0xaf9ec396,0x2352e791),LL(0x7327caee,0x45813e8e),LL(0xd9db7e81,0x977f7a08),LL(0x5f53d15d,0xbe55b630),LL(0x6a23f0dc,0xee182ac6),
+ LL(0x757d6136,0x88887756),LL(0x88b92e72,0xad9ac183),LL(0x8785d3eb,0x92cb2fc4),LL(0x9319764b,0xd1a542fe),LL(0x626a62f8,0xaf4cc78f),LL(0x26bffaae,0x7f3f5fc9), LL(0x40ae2231,0x0a203d43),LL(0x387898e8,0xa8bfd9e0),LL(0x474b7ddd,0x1a0c379c),LL(0x34fd49ea,0x03855e0a),LL(0xb3ef4ae1,0x02b26223),LL(0xe399e0a3,0x804bd8cf),
+ LL(0x7cdc2211,0x22723fa3),LL(0x31ddb2bd,0x1d339232),LL(0x46626fe6,0x63f354c1),LL(0xf67a4257,0xd0f68526),LL(0x8d3d00b6,0x79aa889b),LL(0x0de4c413,0xca5fc8a7), LL(0xd2879266,0xe311a966),LL(0x5f21e1dd,0xc8d982fe),LL(0xcbb159ff,0xc51f1604),LL(0x092d83ce,0xb449deb8),LL(0x644fd0be,0x4a5f68f8),LL(0xbffb0088,0xeef3fa4d),
+ LL(0xde865713,0x11a9f3d0),LL(0xbde98821,0x81e36b6b),LL(0x6aa891d0,0x324996c8),LL(0x395682b5,0x7b95bdc1),LL(0xc1600563,0x47bf2219),LL(0x643e38b4,0x7a473f50), LL(0xf5738288,0x0911f50a),LL(0x6f9c415b,0xdf947a70),LL(0x67a067f6,0xbdb994f2),LL(0x88be96cd,0x3f4bec1b),LL(0xe56dd6d9,0x9820e931),LL(0x0a80f419,0xb138f14f),
+ LL(0x3b32932e,0x2b4056a4),LL(0xbd8a1cb8,0x1c74deb6),LL(0xb181b5a0,0x09601843),LL(0xdc6a92d8,0x50a92353),LL(0x2d6f4331,0xe86c022c),LL(0x3a3ae821,0x0d9671dc), LL(0xc8228d82,0x3d618a20),LL(0xa5292169,0x20e809c1),LL(0x3803f840,0x3b2fe5e7),LL(0x416eb670,0x1f2978e9),LL(0xc35b795c,0x44dcc410),LL(0x503ce975,0xbf5065c0),
+ LL(0x0429077a,0xa11a1a8f),LL(0x10351c68,0x2bb1e33d),LL(0x89459a27,0x3c25abfe),LL(0x6b8ac774,0x2d0091b8),LL(0x3b2415d9,0xdafc7853),LL(0x9201680d,0xde713cf1), LL(0x68889d57,0x8e5f445d),LL(0x60eabf5b,0x608b209c),LL(0xf9cfa408,0x10ec0acc),LL(0x4d1ee754,0xd5256b9d),LL(0x0aa6c18d,0xff866bab),LL(0xacb90a45,0x9d196db8),
+ LL(0xf9e89bea,0x1b66faab),LL(0x3a441284,0xc81c5ddc),LL(0xa675f7c8,0x1a82f3a0),LL(0x30313a71,0x82884a2f),LL(0x58aea9e6,0x7ac5d7b0),LL(0xcd5ff05d,0x1954f075), LL(0x6178d270,0x7c29638d),LL(0x19381929,0x6af7f8ba),LL(0xa17ae3a7,0xe85e3c47),LL(0x7009e38a,0x91b107c7),LL(0xf1f9c52e,0xf3b777d8),LL(0x11b688a0,0x5b7b74ff),
+},
+/* digit=69 base_pwr=2^345 */
+{
+ LL(0xc0385874,0x4ae3d232),LL(0xcbf96d2a,0x83bda9e6),LL(0xec62fd6a,0xba73c769),LL(0x62a4720c,0xd586ba7f),LL(0x0cc1f491,0x6497cd14),LL(0x7b2ac571,0x8b012b70), LL(0x268fd705,0xa65eabb6),LL(0x1431873d,0x8caf100a),LL(0x231457d7,0x25b31b84),LL(0x901645c5,0xcab62f75),LL(0xb2f7b656,0x2377d74d),LL(0x2d33c95c,0x4008277c),
+ LL(0xed001c43,0xaae2f448),LL(0xcf4be493,0x08ad1d9b),LL(0x82c1f372,0x3262b2f4),LL(0x351a5f7f,0x5521febd),LL(0x916c75a8,0xf8ec9190),LL(0x2728dfb8,0xf3c258c7), LL(0x8af19574,0x5dd4ff4f),LL(0x5d076b1c,0xefddf579),LL(0xba8b777a,0x318b5b98),LL(0xfb7f8409,0xd971d426),LL(0xb0fd31db,0xed1465e8),LL(0x00f66347,0x80d24d43),
+ LL(0x1ae586a2,0x5ba5288c),LL(0x1b715821,0x044f1fc6),LL(0x602f3c65,0xc1a9a997),LL(0xe08c0223,0xc5c7512f),LL(0x367e6f1d,0x48a19c3c),LL(0xfb241597,0xa9f2195d), LL(0xb5ba32a6,0x9f674a5f),LL(0x0a312742,0x275a060f),LL(0x03d6f13e,0x5aeb8c43),LL(0x917433fb,0x0fed575d),LL(0x59f53490,0xe4a5ef9a),LL(0xf315e616,0xa9f86145),
+ LL(0x7e5a59f4,0x315ad7a4),LL(0x543c8b00,0x1c615bfc),LL(0xbaa56473,0xe12f97a8),LL(0x46edcfcb,0xf263db44),LL(0x3c1a968e,0x47cf91d5),LL(0xc15db875,0x1a1165b4), LL(0x3479616a,0x5d35e53a),LL(0x5c59958f,0x649f87b4),LL(0x246da3d3,0x5d3d11ea),LL(0x53f06820,0xc1ddfcc6),LL(0x6610c00f,0x8169d711),LL(0x4bddc8c7,0x15f16ba5),
+ LL(0x1e548ef0,0xcf19fb2a),LL(0xcc694171,0x8bb6dfa0),LL(0x5c5e390f,0xeb1668ca),LL(0xe1975263,0xf5a3485b),LL(0x442cc850,0x4edfc596),LL(0xf9627d74,0x9901f447), LL(0x84d0413a,0x3a6b85c9),LL(0x67de639c,0x14663661),LL(0x11705bbb,0x9fc9fdcf),LL(0xbff2cf80,0x6d066e2b),LL(0xdc3026fd,0x38dedc2f),LL(0x1b828538,0xad533a98),
+ LL(0xb7bfa29e,0x6c75bc93),LL(0x18ef6d69,0xf86f22b2),LL(0x36dcadf2,0x90ce6a15),LL(0x7ce50921,0xf11f711c),LL(0x38a479e3,0x0739ceda),LL(0x6ec3dbc6,0x840b825e), LL(0x9fa23481,0x7c36c0a5),LL(0x70cb186d,0xceb61fd1),LL(0x26e4754d,0xac6f7d3c),LL(0xf317b385,0x4076d3b5),LL(0x3fd9e9c7,0x52f1bd72),LL(0xbf316043,0x6649d8b6),
+ LL(0x243cfbd5,0xdc2870f8),LL(0x1ab496f3,0x000b71b3),LL(0x708f4507,0x53511a3f),LL(0x1949d835,0xbd7bd038),LL(0x938f4db6,0x723a007d),LL(0x2d04e9fd,0x5bc8679e), LL(0x76ec7fc4,0x51ca5fd1),LL(0x988f354e,0x86c4205c),LL(0x2a0a4a90,0x9042e76b),LL(0x4ad44d2d,0x368f52a8),LL(0x912edfb7,0xddc2cab8),LL(0xcde80199,0xde74ccf5),
+ LL(0x3e455a61,0x8002f458),LL(0x5bea205a,0xafbafd37),LL(0xfb93f735,0xa8ced112),LL(0x196e3084,0x27cb6292),LL(0x77e8c744,0x72395bdd),LL(0xee71f5ff,0x02e018d8), LL(0xc1337a1d,0x7cfc14d9),LL(0xd7b4d86e,0x94e14c0a),LL(0xd213738e,0x66e50129),LL(0xbc0b5ea3,0x7a905d91),LL(0xfca06700,0x92cb630a),LL(0xbf3a0821,0x65e06d5c),
+ LL(0x55c2369d,0xa81e4a4e),LL(0x60a0f544,0x394de01b),LL(0xa8906e17,0x22acfd07),LL(0xcc9bc4d0,0xf59b37a6),LL(0x7ffec12f,0xdd16a22c),LL(0xd5976455,0x07decc2a), LL(0xabe1d122,0xc5019463),LL(0xe318c92c,0x2bf0ac0c),LL(0xb2bfc47b,0xfa50280a),LL(0xc7cf8bff,0x53354fc5),LL(0xe20ca341,0xaea1d293),LL(0x8b626244,0xec25ecda),
+ LL(0xfd8ba33e,0x313b66ca),LL(0xfabe27dd,0x10bdb130),LL(0x125e2b8c,0x1181334c),LL(0xdb6f94ba,0x0f4f198f),LL(0xac3f5de9,0xf7000076),LL(0x9d6402ae,0x1a78813d), LL(0xc8a9e758,0x3427f75d),LL(0xb01f791f,0xcdac8b34),LL(0x2a9ebaf5,0x922c36d1),LL(0xb0487cc4,0x195ea05f),LL(0xa808baec,0xe33de901),LL(0x57291d89,0x15e1d5ac),
+ LL(0xc21cdd1f,0x4e2a05c1),LL(0xdd46e76a,0x8a232097),LL(0xd871b1d6,0x8b55313c),LL(0xaf396bc4,0x976ce5f6),LL(0xafd381b1,0xeb91527d),LL(0x14455ee2,0x6cfd4490), LL(0x1f274d1e,0x8723be9e),LL(0x1999fa9f,0x1c63fd01),LL(0x8049b6f8,0x5f172625),LL(0x99a51b4d,0xe18a3ecd),LL(0xb13d4e65,0x329fc2c1),LL(0x0f18f300,0x94da252b),
+ LL(0xe28fd10d,0x7b151b98),LL(0x1dd884cf,0x8fc01ce8),LL(0x98d56c2c,0x1f0ffb50),LL(0xb084606d,0xf9df1fa2),LL(0xdc7d2008,0xf86232bf),LL(0xd8751699,0xeae5cb8f), LL(0x83ed54fd,0x70f02298),LL(0x86087697,0xb575283a),LL(0x0302e2c3,0xad219135),LL(0xc4b57e01,0x1c09a0d6),LL(0xc541b9fb,0x0f65e1e1),LL(0xf4fe76c0,0x85493d9b),
+ LL(0x191c21cc,0x353718ce),LL(0x4ad6bd18,0x08e6edf6),LL(0x4dc5b572,0xc2bb0d6e),LL(0x88193daa,0x328e19df),LL(0x7211c958,0xccc9f6ab),LL(0x58aae5c5,0x377d99ef), LL(0x1c823442,0x40e2ecc9),LL(0x8b0d36ab,0x036d6d52),LL(0xda4d0ad3,0x2fe0cd7e),LL(0xfc8af791,0xb8fc3c7f),LL(0x2b201b20,0xdb7e44a4),LL(0xebcf527d,0xa5176004),
+ LL(0xfa5256d2,0xe19b7576),LL(0xdb3f8bfd,0x418d5425),LL(0x951a1719,0x00424869),LL(0x533b69b0,0x2383c7a8),LL(0xe67a86fd,0x166a38e2),LL(0x5876c435,0xa6baa01c), LL(0x84a208f5,0x574ddc45),LL(0x26b18dbb,0x8cee30b8),LL(0xe9f6b30d,0xeced99c1),LL(0xa7d34bea,0xb638d88d),LL(0x069adedf,0xa4836806),LL(0x7a07c593,0x62beb7ee),
+ LL(0x724fb94d,0x5093950b),LL(0x8117ff50,0x10782271),LL(0x9f5961d7,0xdc9e34b5),LL(0x2351a33e,0xfaa2fc01),LL(0xd5fc462e,0xb9e0f1d9),LL(0xdd9c6914,0x276a5b3b), LL(0x75365ca5,0xe6136d17),LL(0xa91eed68,0x228b77e2),LL(0x411e4770,0x5cd6a269),LL(0x17590390,0xd8857b0e),LL(0xa0d45faf,0xe7094f3a),LL(0xf40693e4,0xe52d11dc),
+ LL(0xe5f5b545,0xe96c4aeb),LL(0x2d4c43b0,0x10a85a00),LL(0x32f9151d,0xf86ad2f6),LL(0x302b99e2,0x05daf874),LL(0x14fd3171,0x4299dbfa),LL(0x812cfc62,0x27cbedd6), LL(0xb8772164,0x42e61536),LL(0x6a5423ef,0x52eecef7),LL(0x548fffa3,0xc34c6c70),LL(0x7b6db825,0x1fbed777),LL(0x4ef2989e,0x850bded4),LL(0x815463ee,0x3b8a542c),
+},
+/* digit=70 base_pwr=2^350 */
+{
+ LL(0x3079fe2f,0x9decf217),LL(0x7c817f6d,0xc32ec570),LL(0xaeb36b92,0xd5649ce8),LL(0x58fb4dc8,0xab9f77d1),LL(0xb52d60cf,0x66b11fb6),LL(0xeaaa4619,0xe217941d), LL(0x1607c412,0xf3522a9a),LL(0xc2a3d8c9,0xea2eba4f),LL(0x25e38722,0x267997c6),LL(0x2d4595ee,0xed5047b7),LL(0x55e5456c,0xaaa41e5f),LL(0x78cfc6fe,0x891e3d12),
+ LL(0xd7357a51,0xa438634e),LL(0x18c04d59,0x918f14cd),LL(0xac40dd56,0x2ab4dedf),LL(0x4956a5de,0x758e95ee),LL(0x5113f84d,0xfc11e394),LL(0x6059f16c,0x6d71b673), LL(0xfb357c3f,0xfd8e2236),LL(0x32dca873,0xd7c86812),LL(0x8ea13b44,0x02aeb153),LL(0x013d3827,0xde1275d3),LL(0x659ca201,0x470a7b7e),LL(0x5c77b351,0x862c83c5),
+ LL(0x05084cfb,0xfc9b800f),LL(0x496f23fc,0x1c4d4510),LL(0xc1d08465,0xfea0003c),LL(0x9af48a41,0xf0281da0),LL(0x44d32eed,0xa5c0d971),LL(0x023a2e31,0x2613b73e), LL(0x7dc8ac1a,0x455013c8),LL(0x5958b3da,0x581b1319),LL(0x2290aaea,0xd293f2f2),LL(0x96f6223b,0xa0682564),LL(0x69410ef6,0x38fd18fa),LL(0x2b2cf629,0x74eaf35f),
+ LL(0xc7ff5b50,0x281f6e58),LL(0xcf9cd114,0xbc67791e),LL(0xfd89abd8,0xe29fa41a),LL(0x7984feef,0xfcb0b0b0),LL(0xd9d20a64,0x0b0928a6),LL(0x6979ccd5,0x2fd385c4), LL(0x1fbe72e4,0xce9c34c8),LL(0xaad0135f,0x69364344),LL(0x50946a5b,0xd4646352),LL(0xf39f53b9,0xb09a97c6),LL(0xdcbc8b64,0x1d47bc20),LL(0xd458b0d6,0xcda5c7bd),
+ LL(0x87eff3b3,0xad5b8c28),LL(0x9937833a,0xa8a3917d),LL(0x200c3b49,0xbafdc493),LL(0x972c6fbf,0x9e27aac5),LL(0x0518c97d,0xfd292bb2),LL(0x33515a63,0xa62126db), LL(0x1bcfc875,0x9892a8bb),LL(0xe0b674d1,0x93b066b7),LL(0x7fd3d080,0xcde9b008),LL(0x59401ae8,0x1e285a88),LL(0x82cfea96,0x4679e329),LL(0x23e615d3,0x52406ea0),
+ LL(0x8b6e9462,0x27de6113),LL(0x473464bf,0xb8ade1dc),LL(0x94dacc08,0x911ad493),LL(0x44252cb1,0xd036f28e),LL(0xd13dc20d,0x3865abf6),LL(0xd528f0ba,0xcea487cd), LL(0x4fc290fe,0x14d77eaf),LL(0xc5084101,0x5106533b),LL(0xcda9eccd,0x11001dc7),LL(0x49fc4a78,0xb79ad4bc),LL(0x4567f8a9,0x4f6369f5),LL(0xdf7ab817,0x64050aa2),
+ LL(0xde07f615,0xffe057aa),LL(0x342700bd,0xf3f91b55),LL(0x27a839f9,0x294761e1),LL(0x80eafe1c,0x6411a2b4),LL(0x0737b80a,0x4900eb12),LL(0xbb73264c,0xa1134d10), LL(0x0ddbf7f1,0x0ebfad73),LL(0xcd1f73ec,0x57bbe692),LL(0xa20f8944,0x675931fc),LL(0xfad2ad19,0x1950eeff),LL(0x9cdf88a0,0x60d30402),LL(0x33fd2c6e,0x121af89e),
+ LL(0x295c4db2,0x763e3664),LL(0xdbbaa92d,0x632fd676),LL(0xc66b40e9,0x62ab11a8),LL(0xf384b708,0x06244698),LL(0x69197876,0xe7cdf3bd),LL(0x064f8837,0x9cc79c48), LL(0x9486589e,0x95900a22),LL(0x2ff01639,0x7953f6e7),LL(0xdd3e6e46,0x3f65fbbd),LL(0xbaa2e2a0,0x84f52e06),LL(0xe3852824,0x1dc462a8),LL(0x7e4c032c,0x9be69c3f),
+ LL(0x70977e01,0xa40afc36),LL(0xa6c3b289,0x965f110d),LL(0x805a8491,0xc4952f87),LL(0x0b65e2d3,0xb36804b8),LL(0xe8cf2b2b,0xd3f6f5ac),LL(0xa4b71938,0x0f37a79d), LL(0x489ef671,0xb2f810d9),LL(0x2df23cd8,0x1feae026),LL(0x21a14e4f,0x7412eee3),LL(0x179d51fa,0x1458b8ad),LL(0xe201509c,0x2156a90e),LL(0x72605867,0x39f29fca),
+ LL(0xb2e066e3,0x231f70ad),LL(0xbb477a19,0xf09db880),LL(0x907e5c63,0xdfa0e503),LL(0xf97022ad,0x12fe09f4),LL(0x20bce7dd,0xdbf06f36),LL(0xf1371cba,0x0140e197), LL(0x64b0b4b0,0x917b6da4),LL(0x20fe3320,0x9a6f4d9b),LL(0xd66bdf87,0x0981d60e),LL(0x62d3487c,0xb430e4e0),LL(0x34dc4a94,0xc3440fb9),LL(0x09a5e3c9,0xe7972dda),
+ LL(0x93f47052,0x29d63940),LL(0x847e5937,0xadf04e70),LL(0x731bab6f,0xa0ef4fee),LL(0x6ee7d7bd,0x21de3195),LL(0xbd716777,0x99af4a8d),LL(0xdf4c569e,0x9e15c983), LL(0xe94401ea,0x2ec7bc0c),LL(0x85727722,0xda1835ad),LL(0x5dad81da,0x2b5862ce),LL(0x88dddc2e,0xb2be5081),LL(0x1414286b,0xa0248210),LL(0x8ea33f3f,0xc52c436d),
+ LL(0x3b24e776,0xcc580ea7),LL(0x9d721d6e,0x0f3a8b18),LL(0xb23480cf,0x8665604f),LL(0x34414689,0x95787cba),LL(0x4d10a945,0x425d7c6f),LL(0xb2f1cc78,0xb5ec2626), LL(0x8658de6b,0x55da8885),LL(0xe9aba03e,0xb50919d1),LL(0xd99e417e,0xc64881d7),LL(0xbf28fba2,0x1eeba5aa),LL(0x504eff80,0x20feb7b3),LL(0x50debfb7,0x9f5f9db6),
+ LL(0x230923db,0x4eb94584),LL(0x7b3a6929,0xba861128),LL(0xab1d6b31,0x5aa7faa3),LL(0x16ae0966,0x95c1e239),LL(0xa2fe2297,0x98674fd3),LL(0x3c42d488,0xa8da0ee5), LL(0xe0740db0,0x103cabac),LL(0x5bf16882,0xf0b860d4),LL(0x289e48ce,0x03cb0cdc),LL(0x9e52c7d5,0x3c15d375),LL(0x98103ca2,0x524f7319),LL(0xc609ffeb,0x828ed65c),
+ LL(0x83dfb993,0x518f231b),LL(0x37c0826c,0x4b0987db),LL(0xd5177ead,0x0c34961c),LL(0x452c92da,0x9d882d3e),LL(0x8765bced,0xbfeaf558),LL(0xb9962295,0x83957b62), LL(0x7bb084cf,0x2d1d0175),LL(0xe8cffcfc,0x04c4cfcd),LL(0x8d4536c1,0x2f35e33d),LL(0xd83124cf,0xbebb31cb),LL(0xabb29019,0xe342bed2),LL(0x2692a0d3,0x2af0fcde),
+ LL(0xc7e3b29f,0xece5d865),LL(0x622839dd,0xe58106a4),LL(0xf2969d76,0xf5272d43),LL(0x2a1a240f,0x90c72c1b),LL(0xaf15e14f,0x1e2aa0ac),LL(0xf1b6b5a0,0xfa2f1c7b), LL(0x880224a5,0xfb5d343d),LL(0xf91881c5,0x47b88a84),LL(0xdd142fe7,0x140f5ee9),LL(0x24b37c44,0x4e76982e),LL(0x578b482b,0x6aaf61e9),LL(0x765bc4e2,0x01950e22),
+ LL(0xe8a2e8f0,0x20ebf79c),LL(0xaca418a2,0xec040d0d),LL(0x8d630d2a,0x016c07e7),LL(0xfa605dcb,0x20021d57),LL(0x42d04705,0x6190f3e9),LL(0x8974b7e6,0x4e000df5), LL(0x5abcedac,0x6710da6c),LL(0x5f95d37c,0xf31aa496),LL(0xa5830899,0x192c4b8b),LL(0xea7dbcdd,0x171ab8c4),LL(0x8cdf1097,0x715f6081),LL(0x205d10ed,0x0e0135bf),
+},
+/* digit=71 base_pwr=2^355 */
+{
+ LL(0xc8d2bf7b,0xd2db4d35),LL(0x81571d06,0x52105d09),LL(0x723a57bf,0x447565cc),LL(0xd8ded62c,0xd98c3597),LL(0xde2f1a9e,0x0aeac6d9),LL(0x0a98d3b2,0xd363b0b7), LL(0x02ad9933,0xd9708f07),LL(0x64f5809d,0x93346775),LL(0x49cda010,0x499332cf),LL(0x858467e2,0x546df74a),LL(0x93748e8e,0x8b84a550),LL(0x06f09073,0x9e88ef97),
+ LL(0x52133095,0xc0a40cac),LL(0x93c162bb,0xfe1b22fd),LL(0x34018741,0x8625898c),LL(0x36d9e57a,0x69c9f3f6),LL(0x378aa211,0x69d9d7f3),LL(0xe7dca168,0x6b03f897), LL(0xf997a48f,0x24d49aeb),LL(0xc149ac40,0x1d984c67),LL(0x576f533f,0x667c1d01),LL(0x9ef82ece,0x372eee19),LL(0xc207c14d,0x577723c0),LL(0x0eed37f6,0x4225907a),
+ LL(0xc5a5a001,0xb8623f36),LL(0x86878b74,0x21847b80),LL(0xd05ac443,0xd19f57f6),LL(0xb9f8acec,0x9bd22882),LL(0x2b41b60a,0x128186d8),LL(0x71980fd1,0x1772e6b0), LL(0x812dfff5,0x22c5ee68),LL(0x7f952796,0xccbd2fe2),LL(0x7da6d35a,0x0d49bfde),LL(0xc249f319,0x348b48db),LL(0xc16a8c0f,0xdb376657),LL(0x002cf8b4,0x28ef362a),
+ LL(0xbc0e0903,0xc61db977),LL(0x645c32fb,0xbaf6e4da),LL(0x060b1adb,0xce89b8ca),LL(0x88e2c178,0x41db4481),LL(0x923bdd3c,0xba6339f3),LL(0xd29db42c,0xff25b818), LL(0xe6d6b35d,0x3521116e),LL(0xb22f16ac,0x4e1bd283),LL(0xbd79fe5d,0x9357c984),LL(0x9d45eee4,0x2eda73be),LL(0x6288e01f,0x1a50c59f),LL(0x75018873,0x37baf649),
+ LL(0x751f66f6,0x431ea808),LL(0xf1b8e577,0x06feeefa),LL(0x488a8eee,0xd109d9f0),LL(0xc69843c5,0xeb826b96),LL(0x8b42da29,0x972272e9),LL(0xa137ee9c,0xa9ea9ad1), LL(0x25163be5,0x0385aa95),LL(0x34c32f2b,0x963e9640),LL(0x4dfd935a,0x9067aa89),LL(0xbc3f5f3c,0x6ab23131),LL(0xf302e0e1,0xb96c3406),LL(0xd65f811a,0xc8caad4e),
+ LL(0x750261dc,0xf323953b),LL(0x38552a8c,0xb8563bf1),LL(0xbd32cb8c,0x2937dfd9),LL(0x7ecf3538,0x07c4e563),LL(0xb6399415,0xb573960e),LL(0xdd1a4a06,0xc1ced6c1), LL(0x787ddf7a,0xc625f400),LL(0x1ce6778f,0xd998c28b),LL(0x6220f24d,0x66c51e5b),LL(0x27d01c6f,0x9f97d758),LL(0x0412372d,0x60b15724),LL(0x04d55048,0x2253abc1),
+ LL(0xfad177ed,0x15952eb8),LL(0x05058d9f,0x57aaf91d),LL(0x8ab1b9d9,0x268ba730),LL(0xd5b8f86a,0x7decfc47),LL(0x0879ab02,0x596353e7),LL(0x9a68d5a4,0xa3ff2311), LL(0x7534fb5a,0x257c68a1),LL(0x160ec5ea,0x84f7c9de),LL(0x6754185f,0x1b2b770c),LL(0xa74562f7,0xf321ac71),LL(0x264a1961,0x28bf0a15),LL(0x86a033ae,0x0093db73),
+ LL(0x097f322f,0xc552c6c6),LL(0x8bc06287,0xdf59a302),LL(0x19610b0c,0xc9ed375c),LL(0xb051dad5,0xf0e7b4eb),LL(0xc6556643,0x7267a304),LL(0xc96dc1d8,0x0044f6d8), LL(0xf4fc3725,0xf0ed5f9a),LL(0x9de8e1ff,0xbbaf9f2c),LL(0xaf5a4b4b,0xef5d66f4),LL(0x20644cf2,0x0b5bed3d),LL(0x75ae23c0,0xf7e4543a),LL(0x41325b66,0x696f60dc),
+ LL(0xcfc0dd38,0x4fd0b582),LL(0x55b7b68a,0x47fd984f),LL(0x699460ec,0x2722a0cb),LL(0xfa26d4c4,0x81b4afd8),LL(0x941c86e4,0xb921d0d5),LL(0xef4db114,0x7208f094), LL(0x17ddadf8,0x2997f43c),LL(0x21bc290d,0xd1aabdea),LL(0x86182be1,0x64e20e00),LL(0xcbddb8eb,0x9bd11568),LL(0x3ba0e6b5,0x639db1d4),LL(0x429a6b4f,0xb99b11fb),
+ LL(0xaaa48cd8,0x04ef7ad5),LL(0x8a8ac319,0xb97a6501),LL(0x47591d88,0x9ae38a6a),LL(0x6902edb4,0x27d91254),LL(0x812b143a,0x5dae3d83),LL(0x93a2fdf6,0x02ee1353), LL(0x72410377,0x07a00389),LL(0x56e10c82,0xa2fbd343),LL(0x72b1bcb9,0x3fd6c171),LL(0x2d0033c7,0xa8d70f93),LL(0x2916c28a,0x9ea9eea3),LL(0x423edad7,0xecb7e486),
+ LL(0xc515bacf,0x5525fbb0),LL(0xa2aa22ba,0x48a72394),LL(0x0b9e3fe3,0x9bcd64c9),LL(0x1975aa86,0xe9e11d17),LL(0xc9dbdaac,0xa435bbf0),LL(0xe30c8911,0xe8451f6c), LL(0x5bc2d12f,0xa1706d89),LL(0x406d4883,0xfe73ff43),LL(0x49d5739c,0xb713efc6),LL(0x05c1ec9a,0xdfd0bbf8),LL(0x5e6b3bd0,0xde17c52c),LL(0x5be196af,0x57e06034),
+ LL(0x2c20f868,0x9949b33d),LL(0xb5706250,0xdb3aa790),LL(0x88e17f2b,0x88ce71e7),LL(0xda9c0881,0xd851baf2),LL(0x86d8c9e9,0xe869c5ba),LL(0xa01425b6,0x1af68d65), LL(0x9bbd3963,0xeae8b1c6),LL(0xec087425,0xf34900b1),LL(0xc374bb96,0x14942910),LL(0x05487483,0x3e13c457),LL(0x35bc6ee1,0xe0e6fad4),LL(0xb54d247b,0xc7c38dc7),
+ LL(0x8bd92789,0x420dd8f6),LL(0x4ce541dd,0x3831b0e9),LL(0x31ed7f7f,0xbde477e4),LL(0x29c5557b,0xb46eb7f2),LL(0xc56940e0,0x00a07499),LL(0xabacf00e,0xabb9d567), LL(0xc5ba9d0c,0x9f63b87d),LL(0x708d4f4c,0xf4c5c4a3),LL(0xde7fcf63,0xdbde9879),LL(0x616cf5d6,0xbe88f949),LL(0xd1aa38be,0x17560674),LL(0x9c436175,0x160ec365),
+ LL(0xb9bd0afb,0x9c85e50a),LL(0xd26ac425,0x2b66a1c0),LL(0x807f33db,0xcb78ce81),LL(0x3db81e06,0x9d337d8a),LL(0x72638d70,0xe223eae4),LL(0x6bf2ebab,0x7f9ea217), LL(0x9b634059,0x2804b59c),LL(0xf3dc8d46,0x1043fbf4),LL(0x7bc6949c,0x321eca1e),LL(0x8f051155,0xbf2906c0),LL(0x9c539f40,0xb802a328),LL(0x073cd808,0x08bcca20),
+ LL(0xcea8bf63,0x08cb6315),LL(0xb59ee7fa,0x7ac2699d),LL(0x8d1601e0,0x4cd2c8a9),LL(0x7b90d9c3,0x6d7188e3),LL(0x6bfe73d3,0x63486716),LL(0xcf9f30b0,0x49ed7faa), LL(0xc9515fd6,0xf7edf5d6),LL(0x8a8ae607,0xbb3ab848),LL(0x21c5c388,0xe6e6b209),LL(0x5b1e03bc,0x5dca0a1d),LL(0x94a8b174,0x15670f59),LL(0x68c27a97,0x6f79e381),
+ LL(0xab463fa6,0x6d34bdf6),LL(0x0093b9cb,0x7bb127b6),LL(0x5a3bfdd0,0x61d05113),LL(0xf1296bdd,0x4abab575),LL(0x4d2e9a7c,0x72da6849),LL(0x8d11f03d,0x90267bca), LL(0x3e9b310b,0x47811122),LL(0x1b1920cd,0x8ffe91d3),LL(0x7521898e,0xec293ec6),LL(0x96c1da75,0xf0cf0269),LL(0x80f2c7b3,0xb0dbd4c3),LL(0x34e4baf8,0xe5281755),
+},
+/* digit=72 base_pwr=2^360 */
+{
+ LL(0xdd14d47e,0xc32730e8),LL(0xc0f01e0f,0xcdc1fd42),LL(0x3f5cd846,0x2bacfdbf),LL(0x7272d4dd,0x45f36416),LL(0x5eb75776,0xdd813a79),LL(0x50997be2,0xb57885e4), LL(0xdb8c9829,0xda054e2b),LL(0xaab5a594,0x4161d820),LL(0x026116a3,0x4c428f31),LL(0xdcd85e91,0x372af9a0),LL(0x673adc2d,0xfda6e903),LL(0xa8db59e6,0x4526b8ac),
+ LL(0xcecb916f,0x51a033a5),LL(0x8d7de61c,0x2ac62f63),LL(0xa42a266e,0x92eece49),LL(0x82c4d11e,0x87e037db),LL(0x6fbae08a,0x875be141),LL(0xc539478c,0xf348fe26), LL(0xff94c01e,0x51f8b907),LL(0x19695a9d,0xc46cc0e0),LL(0x6c51b9c2,0x2c74bd66),LL(0xee565de8,0x635d3d24),LL(0x8982c8c3,0x6bd65663),LL(0xdaf6a93c,0x5c345b79),
+ LL(0xe23a8472,0x68fe359d),LL(0x4ce3c101,0x43eb12bd),LL(0xfc704935,0x0ec652c3),LL(0x52e4e22d,0x1eeff1f9),LL(0x083e3ada,0xba6777cb),LL(0x8befc871,0xab52d7dc), LL(0x497cbd59,0x4ede689f),LL(0x27577dd9,0xc8ae42b9),LL(0x7ab83c27,0xe0f08051),LL(0x2c8c1f48,0x1f3d5f25),LL(0xaf241aac,0x57991607),LL(0xb8a337e0,0xc4458b0a),
+ LL(0x210c3144,0x179c59cf),LL(0x33eebbc4,0xfb613c57),LL(0xba0cf384,0xdda75cfd),LL(0x3a8fbafa,0x94081a5b),LL(0x33384e0b,0xb91de90a),LL(0x27aa2a45,0x7d1f8f40), LL(0x62031148,0x0747bcc1),LL(0xf324160b,0xd2db8e39),LL(0x722484f0,0x9c1ce3e9),LL(0xa62d1dda,0x13a7ee5d),LL(0x3a963bce,0x77fd7934),LL(0x83d2f21b,0xcd3d8717),
+ LL(0x51dd1ba9,0x3dbb3fa6),LL(0x545e960b,0xe53c1c4d),LL(0x793ce803,0x35ac6574),LL(0x83dbce4f,0xb2697dc7),LL(0xe13cf6b0,0xe35c5bf2),LL(0xb0c4a164,0x35034280), LL(0xd9c0d3c1,0xaa490908),LL(0xcb4d2e90,0x2cce614d),LL(0x54d504e4,0xf646e96c),LL(0xb73310a3,0xd74e7541),LL(0x18bde5da,0xead71596),LL(0xaa09aef7,0x96e7f4a8),
+ LL(0x2d8bcd6e,0x609deb16),LL(0x2591750d,0xe42f23a9),LL(0xb378305c,0x4a9f3132),LL(0x69275f5e,0xf1017998),LL(0x61b089b5,0x14be7467),LL(0x0c81b0c5,0x05f620d2), LL(0x6cb8412e,0xca90a9c0),LL(0x15b1b0d5,0xfe0f6a89),LL(0x20c71988,0x1b25ac96),LL(0x390aedd0,0xb971b61a),LL(0x79d8cd39,0x995214d7),LL(0x65c6e11a,0xd7fa135b),
+ LL(0x5d6e5f48,0xa8393a24),LL(0xf9175ce8,0x2c8d7ea2),LL(0x55a20268,0xd8824e02),LL(0xa446bcc6,0x9dd9a272),LL(0x5351499b,0xc929cded),LL(0xcfe76535,0xea5ad9ec), LL(0xdc32d001,0x26f3d7d9),LL(0x43eb9689,0x51c3be83),LL(0x759e6ddb,0x91fdcc06),LL(0xe302b891,0xac2e1904),LL(0xc207e1f7,0xad25c645),LL(0xab3deb4a,0x28a70f0d),
+ LL(0x0f3ff12d,0xa13f19b4),LL(0x019564aa,0x57ee08b1),LL(0x7044a6f4,0x00ec0c99),LL(0xdca1075c,0xaf5665f8),LL(0x0620ab0c,0xded5ca3f),LL(0xa896deff,0x9b2cb8c7), LL(0x07df2345,0x032ab2b3),LL(0xf1da3f88,0x964d109e),LL(0x25133304,0x2286b6f7),LL(0x977a4567,0x0d16d531),LL(0xf1abae4f,0x00a66036),LL(0x95f0103b,0x5debab1d),
+ LL(0x03bea8f1,0x922d7f97),LL(0x584570be,0x3ad820d4),LL(0x3cd46b43,0x0ce0a850),LL(0xae66743d,0x4c07911f),LL(0xfda60023,0x66519eb9),LL(0xec2acd9c,0x7f83004b), LL(0xc3117ead,0x001e0b80),LL(0x0722ba25,0xbb72d541),LL(0x6e9a5078,0x3af7db96),LL(0x701b6b4c,0x86c5774e),LL(0x37824db5,0xbd2c0e8e),LL(0xbfac286d,0x3ae3028c),
+ LL(0x5fb7c5a8,0xfd1b413f),LL(0x0206cba1,0x6152b9de),LL(0xd8f51960,0x487f8e3a),LL(0x033ca1bc,0xac34a23c),LL(0x60258d55,0x90bba98f),LL(0xbd9098f2,0x30421acf), LL(0x89c0ce44,0xd9c601f9),LL(0x2f2f1af1,0x621bda83),LL(0x38c45441,0x14fa7ef6),LL(0xe47faa31,0xbd5dc10f),LL(0x74eeb6a1,0x9dce0dcb),LL(0x06346849,0x2cca3e66),
+ LL(0xa33e071b,0x83d4d4a8),LL(0x61444bb5,0x881c0a92),LL(0x520e3bc3,0xeea1e292),LL(0x2aaab729,0x5a5f4c3c),LL(0xe63c7c94,0x0b766c5e),LL(0xbb2cc79c,0x62bb8a9f), LL(0xaa5dc49d,0x97adc7d2),LL(0x31718681,0x30cc26b3),LL(0x56e86ede,0xac86e6ff),LL(0xcd52f7f2,0x37bca7a2),LL(0x9ce6d87f,0x734d2c94),LL(0xc2f7e0ca,0x06a71d71),
+ LL(0x20066faf,0xcdb67ea9),LL(0xc7fb7154,0x929b4d2a),LL(0x7fdeb411,0x5842d968),LL(0xafe55cb9,0x2ddf764a),LL(0x47df3cf4,0x608bf76f),LL(0x5984e339,0x1862463b), LL(0x944d22a2,0x7feea86f),LL(0x281f2b84,0xf8562c30),LL(0xbd358ea4,0x332a54d2),LL(0xe7fe1ede,0xa54dec9f),LL(0x932264d4,0x9c8e52a4),LL(0x89817f5b,0x428acd1a),
+ LL(0xc6357d33,0x559dcf75),LL(0x652517de,0x4616d940),LL(0x1ccf207b,0x3d576b98),LL(0x1979f631,0x51e2d1ef),LL(0x06ae8296,0x57517ddd),LL(0xd6e7151f,0x309a3d7f), LL(0x0e3a6fe5,0xba2a23e6),LL(0xd28b22c3,0x76cf674a),LL(0xf8b808c3,0xd235ad07),LL(0x6b71213a,0x7bbf4c58),LL(0x93271ebb,0x0676792e),LL(0x05b1fc31,0x2cfd2c76),
+ LL(0xeda2fa8f,0x42aeebc4),LL(0xe77a9c5b,0xda91ada3),LL(0xc585a572,0x29b9d55f),LL(0xa256353d,0xb0e52414),LL(0x29adbd21,0x1d0e7d5f),LL(0xd057d175,0x7ee5ff9c), LL(0xc9097bf9,0x0bf76fcf),LL(0xfe09f5b3,0x023170f8),LL(0x0799f989,0x8a67c124),LL(0xc6a20819,0x4ce28eeb),LL(0x79502d13,0xfc1d7c91),LL(0xde43f895,0x7922d2d9),
+ LL(0x37a450f5,0x4258e5c0),LL(0x52d2b118,0xc3245f1b),LL(0x82bc5963,0x6df7b484),LL(0x9c273d1e,0xe520da4d),LL(0x2c3010e5,0xed78e012),LL(0x3c1d4c05,0x11222948), LL(0xc692b490,0xe3dae5af),LL(0xc197f793,0x3272bd10),LL(0xe709acaa,0xf7eae411),LL(0x778270a6,0x00b0c95f),LL(0x220d4350,0x4da76ee1),LL(0xab71e308,0x521e1461),
+ LL(0x96230a58,0xf2cdae31),LL(0xf304e1ea,0x47cf36b4),LL(0xd750b29b,0x9d14f25a),LL(0xdba15f3e,0x931b9c65),LL(0xbf9fe2dd,0x34db169e),LL(0x52663433,0x8a89e47c), LL(0x026ec31f,0x8859a4f8),LL(0xa913ceea,0xeeb703ea),LL(0x67ac4db7,0x74638d6a),LL(0xbe25d755,0x5c8ea7b2),LL(0x38db10ee,0x8a0f0a87),LL(0xe890bcd3,0x96a26bac),
+},
+/* digit=73 base_pwr=2^365 */
+{
+ LL(0x64a5e869,0x883533af),LL(0x6973ec23,0xaaa778c2),LL(0x46d0fcf3,0x8f0b5fb5),LL(0x4ab05da7,0x7e6b0a0a),LL(0xc67b6614,0xcd91a869),LL(0x6c6f7cf2,0x7de9f2ff), LL(0xd1ec14c3,0xc072a106),LL(0x42a128ee,0x3f4b9606),LL(0x8f0ce946,0x7378192c),LL(0xd1149441,0xdf2e7b9f),LL(0x14ccf45a,0x4fa17cb6),LL(0x45f03568,0x575680e9),
+ LL(0x8f458c68,0x8b70e94f),LL(0x4160ecc7,0x29272654),LL(0x4d3ef22f,0xe22219ba),LL(0x1999f948,0x7f8a712a),LL(0xabfe7302,0x25575e96),LL(0x564a1af0,0x21c6ffc6), LL(0x7e8500da,0x045e9c66),LL(0x04ef8ea6,0xef7c3cf7),LL(0xc3db161a,0xdd23b825),LL(0xba33a906,0x05fb173a),LL(0x870e41f2,0x9a8b5ecb),LL(0xccc30d1d,0xf3d9db0b),
+ LL(0xe873ff0f,0xd9243926),LL(0xf20b0e49,0x2e2a5ab6),LL(0x0e35f201,0xa1bcfeee),LL(0x196f23f3,0xd25be5f3),LL(0xffc1d068,0x298c67f2),LL(0x0c3d950b,0x77dae55c), LL(0x8822c996,0x5e15ab99),LL(0x83f60a98,0x52de2e6d),LL(0x47a7e269,0xa9f82ec9),LL(0x2ac22e49,0xf02af9a2),LL(0xa706f090,0xdfb3103f),LL(0x3cf8dcb0,0x12559962),
+ LL(0x88ad12b2,0xb7b85625),LL(0x1e44b254,0x81f5958b),LL(0xc91b8ffd,0xb4ebddd5),LL(0x55d38511,0xef815ae1),LL(0x1b0da525,0x98587d55),LL(0x34a9ebbd,0x1d418177), LL(0x1e6057d7,0x844811fb),LL(0x76e5976d,0x0c169771),LL(0xf623789b,0x4b268bb4),LL(0x40498058,0xb26ae5be),LL(0x3c2b435a,0xb47a5ded),LL(0x8fceceb3,0xe15a684b),
+ LL(0xd09dc3c8,0x122a3eed),LL(0xaefe0819,0x6a19907f),LL(0xda325339,0x057aafa1),LL(0xd42a5345,0x138033bd),LL(0x1a065ebe,0x8ac206af),LL(0x25c31ed6,0x0a46f5ae), LL(0xd7e379db,0x7fc577a9),LL(0x69dcee54,0xc6df6943),LL(0xa8336bc1,0x4c167ba2),LL(0xf3a1339c,0x0fbd9708),LL(0x226f612f,0xc6b8c01f),LL(0xd51332e1,0x5d4ed789),
+ LL(0x5a1abcd8,0x26aa2c2e),LL(0x9609d9d8,0x2b16a12e),LL(0xa2bee00c,0xe485a551),LL(0xf4f2292e,0xfa28c30b),LL(0xb7358f1b,0x99abef78),LL(0x10a276a1,0xda6b3cdf), LL(0x47c03f71,0xbd3858b7),LL(0xb22d05d1,0x4f0bf5f0),LL(0x8250f760,0x2d80f5d2),LL(0x8cd9666c,0x060f9b27),LL(0xb1b014a9,0x6a6c40b0),LL(0x8c440a9e,0x44537af3),
+ LL(0x76faaca5,0xb564cfd6),LL(0x920dd223,0x8a6e3925),LL(0xa590a383,0xee59a140),LL(0xa1922ad9,0x9e29b552),LL(0x60a0da63,0x604367de),LL(0x92c35fd0,0xc498aca5), LL(0x250ed8a0,0x74135082),LL(0x6c7c3e77,0x5d109d1a),LL(0xc63dff94,0xf9e2d84d),LL(0xf7aa2b0e,0xca50f5e4),LL(0xd543d389,0x7cba9e87),LL(0xd8fd1292,0xaf5fbbef),
+ LL(0x4fc11c3a,0x70765683),LL(0x66aac4d1,0x53a94031),LL(0xa6db6169,0x2a935ef0),LL(0x2032d599,0x00292761),LL(0x3a6f1316,0xb5babb2d),LL(0xdb26af51,0x601a7dfa), LL(0x1322d983,0x00c34013),LL(0x2bb507c5,0x45b062ec),LL(0x0f9b3656,0xa1bbe2ed),LL(0x34031d18,0xe17a5d49),LL(0xf8fe1224,0xe3661047),LL(0x623c6cf5,0x0e4f3b3d),
+ LL(0xca45cccf,0xffaac084),LL(0x061ffe3c,0xaea5cc3d),LL(0xb355f387,0x7c5d7c60),LL(0x99cba92d,0x4bbb2a0c),LL(0x2f7768d6,0x6b4ba3ef),LL(0xcc5f9c40,0xc7484ed2), LL(0x52b57a7e,0x5d4e92fc),LL(0xca2c200b,0xba9f16c4),LL(0x3797ccba,0xebe02a8a),LL(0x38c4133a,0xb6b3f421),LL(0x8153d033,0xad5d85b6),LL(0x5714f269,0x782d6ee8),
+ LL(0x9c0cf752,0x7845b696),LL(0x5a732acf,0xb82d052b),LL(0x1262877b,0x7760564c),LL(0x8ecc7aa5,0x29b3c57a),LL(0xdf1ebbed,0xb58eccb0),LL(0x3c3a3303,0x86fc1544), LL(0x13060f0e,0x44761ddf),LL(0x7371a5a8,0x5a3dacfd),LL(0xf7cbc2bc,0x846f6faa),LL(0x368caabf,0xf5e098b0),LL(0x10c08769,0xe23ea107),LL(0x1563fcda,0xbc5df1db),
+ LL(0x142d8955,0x65c3a54e),LL(0xe7814f25,0x5c6583cc),LL(0xd924dc7d,0xbd5a07d8),LL(0xc28f6e8e,0x9f717bd9),LL(0x3b6540a7,0xa0c4ec4e),LL(0x142b3283,0x3153bb2b), LL(0x9b296946,0x53bf403c),LL(0xb1cdb6d2,0x659a828a),LL(0x1369af19,0xe9517d81),LL(0x8990e7a0,0xd8c7a099),LL(0xe535cd04,0xbaa9f59d),LL(0x0f269551,0xbb0cc68e),
+ LL(0x6a78c6e5,0x3c00ac52),LL(0xdefaa52c,0x9c61aca6),LL(0x39794a09,0x00341289),LL(0x41cd7c0a,0xe08910d1),LL(0xa732e3bc,0xa58ffbb6),LL(0x91fe8fd8,0x87bf51ab), LL(0x4a59e2be,0xc4f4f267),LL(0x438071c8,0xdeb512c7),LL(0xe9cd290b,0xddf82842),LL(0x6ae85fe0,0x3e17311d),LL(0xb41be881,0x6e9236a9),LL(0x53555ebf,0xbb9ddf98),
+ LL(0x09f3f0be,0xccc163ea),LL(0x6a5b0a63,0x9932b56f),LL(0x9c69668e,0xf89fae91),LL(0x5ce13021,0x555f9821),LL(0x37037aa9,0x4b02693f),LL(0xbde50f35,0xc4afee79), LL(0x02aa6c7a,0x4b0919c2),LL(0x991e15e9,0x3166de2a),LL(0x7077fb38,0x284baa3e),LL(0xa116ddec,0xbb7a6416),LL(0xb7636772,0xe8c89547),LL(0x0ef92c54,0xff940362),
+ LL(0xe2ce6008,0xd5d81275),LL(0x0b3b9d10,0xc45bdf25),LL(0x6cbc83e2,0x15ab5da3),LL(0xc52a66cb,0x85a18cf8),LL(0xb042c047,0x77e202b8),LL(0xe7e7997e,0xc4dc3de2), LL(0x995fa67a,0xfe9335b1),LL(0x75b96a00,0x809e161d),LL(0xa0c3baea,0xfb03c2a5),LL(0x888c2f77,0x5c7e0523),LL(0x87ad10e2,0xa8fda1c8),LL(0x858a3577,0x90484f78),
+ LL(0xf9fde126,0x49e41f0a),LL(0x3613d3c2,0xec960044),LL(0x10421d3b,0x2c62a49d),LL(0x8131a0d8,0xe2402464),LL(0xbdf794fc,0x8a7ce188),LL(0x4665b1b6,0x704dea7d), LL(0x4d57c6ba,0xbdb9c18e),LL(0xf669b3c0,0x5288a053),LL(0x78a5e252,0xbf7d01b8),LL(0x26b9cb7d,0xb26cccf9),LL(0x84326c47,0x14191a32),LL(0x91f8425b,0x460ff747),
+ LL(0xbd27be7b,0x59367582),LL(0x1ab2c596,0x92bf5bbc),LL(0xf6a27741,0x5d96351a),LL(0x7f929e0d,0xeab94db8),LL(0x043f1afb,0x865ba011),LL(0x5fb631dd,0x43acea12), LL(0xb2fd1436,0x192e0652),LL(0x7b38d121,0x44f22ff1),LL(0xb7cae5f6,0x7bcc228d),LL(0x6a828b03,0x02eaeccd),LL(0x91f301aa,0x7c48a2ea),LL(0xf5eb1a07,0x1e090717),
+},
+/* digit=74 base_pwr=2^370 */
+{
+ LL(0x941948e3,0xdf0ae8df),LL(0x1d010bcd,0x123fee90),LL(0x1dd28691,0xde3717ca),LL(0x709b678e,0x0c1db879),LL(0x400acdc6,0x0288959a),LL(0x5ca2d03a,0x66c69181), LL(0xdbbb75de,0xe52534b3),LL(0x3de927cf,0xe914938c),LL(0x73eece30,0x1a9a34f8),LL(0x642a6799,0x0fb0c7bd),LL(0xeaa7e8a8,0x375cc0cf),LL(0xd00ec238,0x75fb9eb5),
+ LL(0xb72958eb,0x9ca8cc9d),LL(0x1014f562,0x3c8cd0db),LL(0x059b2bba,0x72115d53),LL(0x730e5dc3,0x8fe7ac30),LL(0x841d8998,0x4e67ef69),LL(0xc8ed37a5,0xfb6439ff), LL(0x26df84c4,0x48164b3e),LL(0x365bc99e,0x37d492ad),LL(0xbeed38ce,0xb7fd4643),LL(0xa3e30b3d,0x993cfa9f),LL(0x01ddd484,0xdcc5e7af),LL(0x6840175d,0x5edf3ac0),
+ LL(0x0c19c625,0x3ee87e54),LL(0xf4a10f9a,0xe4ae611f),LL(0x0aec21e5,0x27d65512),LL(0x8bea1b16,0x737578f5),LL(0x5fb7a3a2,0x6e2b6bf7),LL(0x14f65000,0xecc59251), LL(0xb8dd544c,0x53e1167c),LL(0xc5862fdc,0xee60e60f),LL(0x6cccabeb,0xc86582cf),LL(0x8b4d37c6,0x849fc15d),LL(0x8f4a87bc,0xaa7960ad),LL(0x3b7f0a6d,0x17fe1082),
+ LL(0x51d33c11,0x79768e9f),LL(0xa4b24889,0xeec34505),LL(0xbe0c67d7,0xc194821b),LL(0x6909fdfc,0x537a6a4a),LL(0x95ccdda7,0xae6d7051),LL(0x92b3926c,0xed4b7222), LL(0x6b24a3d4,0x2c5dd6af),LL(0xe4386095,0x9282ec39),LL(0x397a3bd3,0xdd3c7388),LL(0x8baf59c2,0x9d176c6a),LL(0x380ec958,0xd5c6219e),LL(0x54e8e315,0x194fc116),
+ LL(0x79650de1,0x3c67c65c),LL(0x00bfb2ac,0x8e2a220b),LL(0x42f02a3d,0x59d225dc),LL(0x5d60e54f,0xc52ce4b2),LL(0x3f306112,0x8894e3cb),LL(0x50d85aec,0xb78a037b), LL(0x2d85f328,0xeeeb3b40),LL(0xe0406ddd,0x3d391b37),LL(0x0502141b,0x5273ebe9),LL(0xe092bfeb,0xd17023e7),LL(0x282f5aed,0x04564385),LL(0x55d82356,0x7e55a4e2),
+ LL(0x01ec1432,0x0b7576f9),LL(0xabc5f603,0x84b30eec),LL(0xf4a84b7a,0xdaaf7ba9),LL(0x3bb37a99,0x9e3a5daa),LL(0x80378cff,0x56bd9648),LL(0x8e6ed856,0x2fdeeeb7), LL(0x3c81ac34,0x079014a7),LL(0xb4211c27,0xf8de4004),LL(0x7fe4391e,0x0cee3df9),LL(0x2fd2fc38,0x441aa7fb),LL(0x4d1b575a,0xeba7be86),LL(0x231c2d01,0xca2fb5b7),
+ LL(0xd205869c,0x8307bc81),LL(0x9388e917,0xdd282809),LL(0xbb572a87,0xdd4cb2de),LL(0x14f0db39,0x5a41595d),LL(0xf4e5c71e,0xd5db5f59),LL(0x4a87f672,0xcc9c9f6f), LL(0x012e65ce,0x4ddce8c3),LL(0xab3a94d3,0xaae28eaf),LL(0x0b333aba,0xd4b95011),LL(0x914eb476,0x3e171506),LL(0x69bbfa63,0x109ee9ab),LL(0x5dff5471,0xbddba098),
+ LL(0x463a8251,0x0683349e),LL(0x5103e72c,0x97dc4f47),LL(0x50663b9e,0x47c71810),LL(0x9733dac6,0xf327d149),LL(0x292137c5,0x03f55e4a),LL(0xda59e1c7,0xccc6232a), LL(0xadc59cb8,0xbaa8b4dd),LL(0xfe7486e4,0x45370d35),LL(0xb0322df9,0x99a88c1d),LL(0xfd69954f,0x394440a7),LL(0xa5a29889,0x9060473d),LL(0x2f04864a,0xc8ca43e3),
+ LL(0x9451d422,0xf08c8efc),LL(0xba846ac3,0xc8beae41),LL(0x807df062,0x0157f46c),LL(0xdeaada6a,0x080eac20),LL(0xa3bfddd0,0xdf146f3d),LL(0x617d19d7,0x8ed7c2c6), LL(0x40439488,0x314ea3e7),LL(0xb3e6806f,0x544132c7),LL(0xa215a3a2,0x9b9bb477),LL(0xe33f80b0,0x9310fee9),LL(0xe71769af,0xf277895c),LL(0x7d99d5b9,0xe8218e1a),
+ LL(0xdd8b9644,0xd5c7241a),LL(0x993116d2,0x45a5f2d1),LL(0x823048df,0xbacacd4a),LL(0x2568547a,0xa278fa04),LL(0xbff72820,0x3a4f2482),LL(0x13e4314a,0x1305d1a7), LL(0x34ba28e3,0x9d84c333),LL(0x6a32fb41,0x9995b5bb),LL(0x520946d8,0xb0f75f3c),LL(0xde98aa63,0xd7c4b8b7),LL(0xba856b6b,0xee5efcf3),LL(0x3324ed66,0x36af3368),
+ LL(0xbb2af5fb,0x29c741c3),LL(0x89e6241e,0xb9c92da6),LL(0x474b7c0f,0x07dace3c),LL(0xd996b6a8,0xd0b3f9bc),LL(0x07c662de,0xe97e3847),LL(0x6c851030,0xbf6d1e05), LL(0x99f1aade,0x150c5e93),LL(0x9bd848d5,0x9c1e2351),LL(0x09cab3db,0xeb808a55),LL(0x9a49916f,0x1bfbe08d),LL(0x64ab0e4e,0xc6a70ea7),LL(0x7823f505,0x77d189f2),
+ LL(0x5827fe2c,0x90762c1f),LL(0xeaffda88,0x20160f7a),LL(0x5c47c645,0x7420849f),LL(0x6d72e748,0xb0823195),LL(0x8ee11773,0xaeac683b),LL(0xfb5c550e,0x8c2a0a79), LL(0x6c07cc1e,0x6d986d69),LL(0xba8398b9,0x57269140),LL(0xd94d5223,0xd13e136f),LL(0xed5b01c6,0x1aa75419),LL(0x408fcdcc,0x7c2014b1),LL(0xcffde5ee,0x0680a985),
+ LL(0x23133885,0xfbe88fce),LL(0x7c5a5c4b,0x3c2e3669),LL(0xbbacc6e1,0xe36cf261),LL(0x96ae3cad,0xa72c7bb1),LL(0x4cb1a375,0x08e37103),LL(0x2a02baee,0x5521f445), LL(0xc157e471,0xda9329ba),LL(0x68470808,0x3f90cad1),LL(0xa657de60,0x24182208),LL(0x67c10d1b,0x17c082b7),LL(0x9928d6fd,0x9e222648),LL(0x36ced38f,0x1578c895),
+ LL(0x42c5a7ee,0x92fc9a33),LL(0xf9f0ed71,0x8768614a),LL(0x87ebfb66,0x1ea5f7ed),LL(0xd361069c,0x296852de),LL(0x0192498e,0x1cec6f1a),LL(0xa9cca3aa,0xbfd4858f), LL(0x2ef240e8,0xfba98c24),LL(0xab635d9f,0xc8b500e4),LL(0x913a3edd,0x9f49c572),LL(0xd42b2d4d,0xe6181f93),LL(0x6aa77fa3,0xf96b5db2),LL(0xe43558d8,0xdfb2241f),
+ LL(0x7481cd31,0x8f8a1964),LL(0x17b37aa7,0xd5b8197e),LL(0x7ac0dbf6,0x7cfbcd19),LL(0x93662f46,0x4ecd8954),LL(0x0501365f,0x104a090d),LL(0x7f097083,0x828694cd), LL(0x6dc105dd,0x60b865f3),LL(0x85cd4ed7,0x00549f1b),LL(0xcc197cc9,0xd262e38b),LL(0x9a262b4f,0x5d3271de),LL(0xa953d539,0xc7df47e9),LL(0x5b9a86a6,0xab8f1c8a),
+ LL(0xedee15a5,0xc7d0abb2),LL(0x228cc4a1,0x72dc0105),LL(0xa80767de,0xeb67defc),LL(0x71820908,0x6fa174d8),LL(0x5674d19a,0x3215df48),LL(0x960a081a,0xf944531a), LL(0xef2cce62,0x93ed7180),LL(0xc8bcfc0d,0xb318edbf),LL(0xfe787e58,0x0909d56e),LL(0x8fe8b96f,0x5ae74fc9),LL(0x35ab6811,0x8fc342c4),LL(0x0b991e0c,0x6fc6cc5c),
+},
+/* digit=75 base_pwr=2^375 */
+{
+ LL(0x542f4e90,0x55671129),LL(0x0623d4cd,0x43bedccf),LL(0xe99ca16b,0x7e21207c),LL(0x7c7a26b9,0x785fa105),LL(0xc2c3ab00,0x33c28658),LL(0xd79cd59f,0xcce42a48), LL(0xb8c3bc75,0x9a674db4),LL(0x6904e3fe,0xea701d15),LL(0x66bf2c6c,0x990e7221),LL(0xbd4c3791,0xba29affa),LL(0x20696ee1,0xd98510cf),LL(0xf93d26a5,0x722ed471),
+ LL(0xbc579793,0xe7cf5bac),LL(0xd73f881c,0x11db7ddf),LL(0x04fa8473,0x9c1a531d),LL(0x5780efda,0x399e8484),LL(0x4f62cb5a,0x6e9c12be),LL(0x94a5df3b,0xf21bdc49), LL(0x11da2a4f,0x3c15fe12),LL(0x23e631d1,0xdea123bb),LL(0xbe294c90,0x3ef76da4),LL(0xa99b8398,0x5cf21d5a),LL(0x751b9f6a,0x50679cf8),LL(0x54d0b7bf,0x4b3f3b9c),
+ LL(0x75a46271,0x6c8d97e0),LL(0x9dbed39f,0x0fa0c4cd),LL(0xde74ac6c,0xfb6da5e2),LL(0xc17c1ec5,0x041ce886),LL(0xd7419105,0xb42941a8),LL(0x002fdfd5,0x79768eee), LL(0x88c8111f,0x64849afd),LL(0x814192d6,0xf425fe14),LL(0x0448fd7e,0xe916e864),LL(0x72ed351f,0x31e224ad),LL(0x7c0183c1,0x73e6e6ac),LL(0x21bf7ceb,0x375657c6),
+ LL(0x03bdf6d6,0xc84f9172),LL(0x69f60e03,0xcfc47187),LL(0xa05068ea,0xcdc4753b),LL(0x077777ef,0xa177ad14),LL(0x7e4cf44a,0x0b7f54eb),LL(0x1860144e,0x4ee443f9), LL(0x42bb6a93,0x1279ed4d),LL(0x436c1b54,0x511137d7),LL(0xb8cdb6ce,0xebc958fa),LL(0xa0c7614a,0xbc4f93f4),LL(0x7b2c6d8e,0xc5bd6cde),LL(0x8d65f38a,0xecff7dd7),
+ LL(0xe45543d5,0x9a4af7af),LL(0x6a04c87b,0xb7478fe0),LL(0x66f72454,0x974eebba),LL(0x5901d1ec,0x682578fa),LL(0xe82b048b,0xc3595199),LL(0xbbc19ba2,0x83da52fb), LL(0x90450b02,0x40f337af),LL(0x439c46d7,0xbd1ea60b),LL(0x00d0ed85,0x4f3e4818),LL(0x766d9e20,0x59d0a0a9),LL(0x56a16718,0xe81dc4d6),LL(0xdf3d3d98,0xac872a21),
+ LL(0xbbaae09b,0x4da7d63a),LL(0x0783fab2,0xcae05f37),LL(0x68841d1e,0x1e8c0016),LL(0xb10366f6,0x0688f485),LL(0x05b121e9,0x38ee34b0),LL(0x14e0dc1e,0x2779f009), LL(0xdbff60ce,0x83c1d44e),LL(0x4105c8c2,0x63fbcf82),LL(0x53715349,0x6b732744),LL(0xc5ca18f6,0x5065bdcd),LL(0x2def86e3,0x677313cf),LL(0x33ebff5d,0x6c54d224),
+ LL(0x88b3fc7b,0x35361c91),LL(0xc22a219e,0x706cf8c5),LL(0x886348e9,0x545bb34b),LL(0x4594a530,0xf25eef25),LL(0x73843cbb,0x59427ed0),LL(0xbeea8c4d,0x39638f20), LL(0x960e3c28,0x4e7d445f),LL(0xd383df18,0x989abc64),LL(0x04694ba7,0xb4238e02),LL(0x0203d67f,0xa3753137),LL(0x86d01fc1,0x404bc421),LL(0xb162392d,0x1af37190),
+ LL(0xf65de0f5,0xffec6674),LL(0xd23ad193,0x4043079c),LL(0xee61bc95,0x31811365),LL(0x8948b6e2,0x358bbd6e),LL(0xe31644be,0x1cd9c342),LL(0x60a8a7a7,0xbab3aa8c), LL(0xa375beb6,0xe065519f),LL(0x4439990c,0xf7d0b041),LL(0x8517ae8a,0x8957c03b),LL(0x73750d6e,0xc96a0401),LL(0xb2aee6d7,0x4eb2e364),LL(0xed099114,0x813054fe),
+ LL(0xec3c19fe,0x79d98e89),LL(0x429341e7,0x860ec5a6),LL(0x25dd60c0,0x80ab8568),LL(0xe47973db,0x7d0b3f3f),LL(0xf7899dfb,0x654435bd),LL(0xe6542b1d,0x54c59689), LL(0xbed69ab6,0x171c6842),LL(0x188a3126,0x82b8024d),LL(0x9c37538d,0x31bf057d),LL(0xcb0be742,0xe079326a),LL(0x29ace4e3,0x0232e981),LL(0xce8596ab,0x7b06fb86),
+ LL(0xcaada268,0x71714896),LL(0xfd0e302c,0xbb3d05dc),LL(0xfe56d08f,0xb0785f33),LL(0x38a1b2ef,0xdd43e0f6),LL(0x360fc15a,0x2df35cfb),LL(0x90b3ed36,0x97173f0f), LL(0xb720544e,0xd4970bdd),LL(0x94a01944,0xb6075f76),LL(0x4a43c4f3,0xc99e8a3e),LL(0xd9cb4808,0x8013609f),LL(0xecc3d094,0xf3fef0ea),LL(0x8642d223,0x3829fac7),
+ LL(0x0402156b,0xb7613dab),LL(0x0b20ec7a,0x4ad70f1c),LL(0x9c46dd4d,0xd9189b20),LL(0x4bd5235a,0x4b22485f),LL(0x88822a0d,0x6e972031),LL(0x2c136807,0x3cf8d823), LL(0x0884e550,0x5997fa64),LL(0x293aedb8,0x73110b25),LL(0x35319a22,0x7e820168),LL(0xa6c668ba,0x2222c809),LL(0x31e0bfb8,0x2f316be2),LL(0x0d832198,0x86cf3a2d),
+ LL(0x684456b1,0xffe3104b),LL(0xf0f49278,0x37ba0db6),LL(0xcca2f150,0x15aaed42),LL(0xc421c694,0x8618aa02),LL(0xfab87b36,0x4d6a091d),LL(0x0e786d5f,0x304eaea0), LL(0x2c114074,0x0be97747),LL(0xad387a8d,0xf57e3a19),LL(0x7a70d421,0x6094823b),LL(0x09de860f,0x59287918),LL(0x6dcf6020,0x7f7fca49),LL(0x5f46086e,0x57580c61),
+ LL(0x5d89002f,0xeab34616),LL(0x72a01a68,0xb3115628),LL(0xdce0c191,0x2f0ced58),LL(0x1a895760,0xec08b09a),LL(0xae62153c,0x206faa7f),LL(0xcf2895bf,0xc31e3815), LL(0x9ac88636,0xd57fbf57),LL(0xce91affd,0x966f5a84),LL(0x63620a73,0x092458b9),LL(0x50805fc1,0xda7b4910),LL(0x5c561649,0x1fc60a25),LL(0x4f899e20,0x8110a1a9),
+ LL(0xf0cb1370,0xb509f702),LL(0xc658441f,0xbdfcf4a0),LL(0x7f07f328,0x853d832a),LL(0x8fbdcb83,0x074fdecd),LL(0xd6a4650d,0x80ed8de9),LL(0xa5d68720,0x61c39ce8), LL(0x3177feb4,0xe66666d2),LL(0xafacf38b,0xdbf3fc57),LL(0x0da620fb,0x7e2d9951),LL(0xdf866f77,0x901145ff),LL(0xdb045beb,0x442a37e5),LL(0xbeb1b008,0x0cb0600f),
+ LL(0x54d7a6af,0x1e6604d3),LL(0x07c97f80,0xba6ae4d0),LL(0x77c527fb,0x5e3d978b),LL(0xe93a0d78,0xd0642c72),LL(0xb3c3c215,0x06d8ae5c),LL(0x4eb9a4c9,0x8bf36e5a), LL(0x4d505a53,0x1ca6403c),LL(0xd2f5c7a3,0x0187be5a),LL(0x9f850eac,0x68cce2ba),LL(0x5805353b,0x81055e4a),LL(0x89b4eb85,0x3c242c1d),LL(0xdda42eb8,0xee4a6691),
+ LL(0x7c34f095,0xbb39a17a),LL(0x22fbbe61,0x7be330a8),LL(0xb91f1482,0x6be6abe3),LL(0xbd39a2bc,0xf972804f),LL(0xf91d813e,0x06737e54),LL(0x1a87cd4a,0xbd606668), LL(0xf538d56e,0xbf88b2e5),LL(0x34afd68f,0xb8206a81),LL(0xa58af042,0x7a93aedf),LL(0xac0511b0,0x8853cdf6),LL(0x067e2c19,0x9d7f416d),LL(0xf9671d8a,0x5d0bc923),
+},
+/* digit=76 base_pwr=2^380 */
+{
+ LL(0x204be028,0x2e7d0a16),LL(0xd0e41851,0x4f1d082e),LL(0x3eb317f9,0x15f1ddc6),LL(0x5adf71d7,0xf0275071),LL(0xee858bc3,0x2ce33c2e),LL(0xda73b71a,0xa24c76d1), LL(0x6c70c483,0x9ef6a70a),LL(0x05cf9612,0xefcf1705),LL(0x7502de64,0x9f5bf5a6),LL(0xa4701973,0xd11122a1),LL(0xa2ea7b24,0x82cfaac2),LL(0x0a4582e1,0x6cad67cc),
+ LL(0x51e4de5e,0x96a1e74f),LL(0xe37f5006,0x72913696),LL(0xbe35109c,0x12449c4f),LL(0x4521d7e6,0x1fad8b30),LL(0x57d00293,0xc85eb23d),LL(0x35f68229,0x4ebd334b), LL(0x2df5acf1,0x7c5b8668),LL(0x5463de2e,0xc2b4da6e),LL(0x757cd570,0x067b0456),LL(0x3a1c866b,0xeaab81be),LL(0xbbba88c0,0x72a6af75),LL(0x0ef567dc,0xaed4dbde),
+ LL(0xb4dc8600,0x597a26ff),LL(0xf9288555,0x264a09f3),LL(0x5c27f5f6,0x0b06aff6),LL(0xd8d544e6,0xce5ab665),LL(0x99275c32,0x92f031be),LL(0xf42e0e7c,0xaf51c5bb), LL(0x1e37b36d,0x5bb28b06),LL(0x8473543a,0x583fba6a),LL(0xf93fb7dc,0xe73fd299),LL(0x6e2ccad9,0xfcd999a8),LL(0x334d4f57,0xb8c8a6df),LL(0x9a2acc9b,0x5adb28dd),
+ LL(0x7d221ab6,0x3afdee27),LL(0x47bb619e,0xecf10abc),LL(0xba4a3301,0x340c8ee3),LL(0x2a883b7f,0x1a6ea51a),LL(0xd5d7412b,0x64f27976),LL(0x91251b6e,0x7fcf0ecc), LL(0x365b18b7,0x5f3f8f41),LL(0xe2e13e58,0x38e48b96),LL(0xad61b2cb,0xde3b73d6),LL(0xd542676d,0xf08398d5),LL(0x8e7d712b,0xd373931e),LL(0x7f96e023,0x89325d7a),
+ LL(0x111792b9,0x5adf3d9a),LL(0x4f1e0d09,0x1c77a305),LL(0xa82d3736,0xf9fbce33),LL(0x718c8aa3,0xf307823e),LL(0x416ccf69,0x860578cf),LL(0x1ef8465b,0xb942add8), LL(0xcd9472e1,0x9ee0cf97),LL(0xb01528a8,0xe6792eef),LL(0xc09da90b,0xf99b9a8d),LL(0xcbf3ccb8,0x1f521c2d),LL(0x91a62632,0x6bf66948),LL(0x854fe9da,0xcc7a9ceb),
+ LL(0x4b3759cf,0xe44e3f86),LL(0x9d74e3f6,0x90cab0eb),LL(0x01c4e171,0x10042545),LL(0xce52defb,0xc12df68c),LL(0xf363100a,0xb1fae2fb),LL(0x3573235f,0x5016c853), LL(0x1d922e9b,0x8d4deb66),LL(0x17f84ef2,0x8a20d423),LL(0x5a4e118e,0x32498583),LL(0x308772e9,0x5abfa961),LL(0xf54e4876,0x41c7611f),LL(0x1f5867b2,0xc1da40d3),
+ LL(0x491ccb92,0x46303171),LL(0x2771235b,0xa80a8c0d),LL(0xf172c7cf,0xd8e497ff),LL(0x35b193cf,0x7f7009d7),LL(0xf19df4bc,0x6b9fd3f7),LL(0xb46f1e37,0xada548c3), LL(0xc7a20270,0x87c6eaa9),LL(0xae78ef99,0xef2245d6),LL(0x539eab95,0x2a121042),LL(0x79b8f5cc,0x29a6d5d7),LL(0xb77840dc,0x33803a10),LL(0x11a6a30f,0xfedd3a70),
+ LL(0x85adde98,0x3c90a59f),LL(0xe5269140,0x35414174),LL(0x1a0d58e2,0x9aca885c),LL(0x6816b009,0x77b9b6dd),LL(0x9ee4718f,0x8e5c1213),LL(0x4e4eac45,0x60ad991e), LL(0x4d71f624,0xc00c3569),LL(0x5bc5fd2a,0xacbf4eb2),LL(0x5eaf3eaa,0xcba1ffc7),LL(0x42a87e32,0x5f99092d),LL(0x6f7a882f,0x2e7b49c7),LL(0x29040512,0x5e9bfc5c),
+ LL(0x142403d1,0xfa070e22),LL(0x15c6f7f5,0x68ff3160),LL(0x223a0ce8,0xe09f04e6),LL(0x53e14183,0x22bbd018),LL(0xcf45b75b,0x35d9fafc),LL(0x7eceec88,0x3a34819d), LL(0xd33262d2,0xd9cf7568),LL(0x841d1505,0x431036d5),LL(0x9eb2a79a,0x0c800565),LL(0x5f7edc6a,0x8e77d9f0),LL(0x65e800aa,0x19e12d05),LL(0xb7784e7c,0x335c8d36),
+ LL(0x30a3ada1,0x75cba9d5),LL(0xf8ae9565,0xb69e308b),LL(0xca7b8369,0x990e3425),LL(0xe0a7ad0b,0x9f67567f),LL(0x18bd01b7,0x76ed6fe7),LL(0x2ff95cfe,0x282358aa), LL(0x410f8841,0x28d2ea41),LL(0xccd67c81,0x89d1533f),LL(0xb6a7b8f9,0x969bb272),LL(0x26330782,0x54f8664c),LL(0x1dcd9164,0xb89f3ae8),LL(0x3d962c14,0x54d845b9),
+ LL(0x6484fd40,0x8b2fc4e9),LL(0xa35d24ea,0xee702764),LL(0xb871c3f3,0x15b28ac7),LL(0xe097047f,0x805b4048),LL(0x647cad2f,0xd6f1b8df),LL(0xdc7dd67f,0xf1d5b458), LL(0x25148803,0x324c529c),LL(0x21274faf,0xf6185ebe),LL(0x95148b55,0xaf14751e),LL(0x28f284f4,0x283ed89d),LL(0x4cbebf1a,0x93ad20e7),LL(0x882935e1,0x5f6ec65d),
+ LL(0x6c0f3509,0xb3984b17),LL(0xd8b4d6bc,0xf9fa4483),LL(0x7dec20d2,0xf4ac2b67),LL(0xb3dbe034,0x67ef024e),LL(0x0f94f4d7,0x2dcc5118),LL(0x74a51393,0x024cdcfd), LL(0x20e7abcb,0xf1c0fead),LL(0xd3a7414f,0xffc18f81),LL(0x7062cb0b,0xb00ce556),LL(0x817bc8d1,0xeccb0521),LL(0x40411c15,0xa0c0fe60),LL(0x1defbe00,0x05311322),
+ LL(0xa4dcefe9,0xe222eba4),LL(0xec1ceb74,0x63ad235f),LL(0xe05b18e7,0x2e0bf749),LL(0xb48bdd87,0x547bd050),LL(0xf5aa2fc4,0x0490c970),LL(0x2b431390,0xced5e4cf), LL(0x51d2898e,0x07d82704),LL(0x083b57d4,0x44b72442),LL(0x5037fce8,0xa4ada230),LL(0x50510da6,0x55f7905e),LL(0x8d890a98,0xd8ee724f),LL(0x11b85640,0x925a8e7c),
+ LL(0x56467257,0xda828fe5),LL(0xd640c2a1,0x5e9abf67),LL(0xc25c696a,0x0eed233c),LL(0xb3e1d84f,0x72483dc5),LL(0x4f114abc,0x30bf1ee3),LL(0xd1f9bce8,0xf58b321e), LL(0x97524f33,0xcb26564c),LL(0x1e453229,0xdc2f105e),LL(0x72a982dd,0x9da43ceb),LL(0xfeef8862,0xecf5649d),LL(0x1fa2f06d,0xd8afda34),LL(0x55035432,0xf0d0ced3),
+ LL(0x1ca459ed,0x5bfa10cd),LL(0x6dcf56bf,0x593f085a),LL(0xc0579c3e,0xe6f0ad9b),LL(0x2527c1ad,0xc11c95a2),LL(0xcf1cb8b3,0x7cfa71e1),LL(0x1d6dc79d,0xedcff833), LL(0x432521c9,0x581c4bbe),LL(0x144e11a0,0xbf620096),LL(0xbe3a107b,0x54c38b71),LL(0xe2606ec0,0xed555e37),LL(0xd721d034,0x3fb148b8),LL(0x0091bc90,0x79d53dad),
+ LL(0x08d1be5d,0xcf17f9dc),LL(0xafdfeb23,0xb55de4c8),LL(0xe437b29c,0xa69454ff),LL(0xe27ee9e2,0x6628d789),LL(0xee3af03b,0x56e3b975),LL(0x2f532d62,0x0083fe9c), LL(0xe63e7511,0xcae15213),LL(0x86ed849c,0xdb5384f3),LL(0xfa4d825f,0x902ba959),LL(0x5ae17566,0xbad700d5),LL(0x14c82eb4,0x16b2c5dc),LL(0x36708ea7,0xa4b057a7),
+}
+};
+#endif /* _DISABLE_ECP_384R1_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_nistP384r1_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 5,
+ /* select function */ p384r1_select_ap_w5,
+ /* precomputed data */ (BNU_CHUNK_T*)ec_p384r1_precomputed
+ };
+ return &t;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpp521r1precomca.c b/ext/ipp/sources/ippcp/src/pcpp521r1precomca.c
new file mode 100644
index 0000000..30d9982
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpp521r1precomca.c
@@ -0,0 +1,4056 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (P521r1 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (521)
+#define LEN_P521 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* P521 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P521];
+ BNU_CHUNK_T Y[LEN_P521];
+} P521_POINT_AFFINE;
+
+extern const __ALIGN64 P521_POINT_AFFINE ec_p521r1_precomputed[105][16];
+
+
+#if defined ( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_521R1_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+#if ((_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LP64) || (_IPP_ARCH == _IPP_ARCH_LRB) || (_IPP_ARCH == _IPP_ARCH_LRB2))
+const __ALIGN64 P521_POINT_AFFINE ec_p521r1_precomputed[105][16] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0x81adc101,0xb331a163),LL(0x18e172de,0x4dfcbf3f),LL(0xe0c2b521,0x6f19a459),LL(0x93d17fd4,0x947f0ee0),LL(0x3bf7f3ac,0xdd50a5af),LL(0xb035a69e,0x90fc1457),LL(0x9c829fda,0x214e3240),LL(0xb311cada,0xe6cf1f65),L_(0x00000074), LL(0x5a9e268e,0x28460e4a),LL(0x3b4fe8b3,0x20445f4a),LL(0x43513961,0xb09a9e38),LL(0x809fd683,0x2062a85c),LL(0x4caf7a13,0x164bf739),LL(0x8b939f33,0x340bd7de),LL(0x24abcda2,0xeccc7aa2),LL(0xda163e8d,0x022e452f),L_(0x000001e0),
+ LL(0x640909df,0x1e90cf08),LL(0x99dd36bc,0xb3fa1f1c),LL(0xb26b07ec,0xa0e797d1),LL(0x1d1ae2d7,0x83d50825),LL(0x6d377aaa,0x4bd9d902),LL(0x82ebb4df,0x1a96372a),LL(0xcd8e6603,0x3a3a0193),LL(0x40a46141,0x3417e594),L_(0x0000013f), LL(0x31fe1b6c,0x813d2ee3),LL(0x6b30fa0d,0x7b8df1ab),LL(0x4af6e07a,0x7a757e5f),LL(0xd4cd1924,0xb5c9c9bf),LL(0xef4f928f,0xddd9f1bb),LL(0x4c836216,0xa05590d1),LL(0x3e26d4bb,0x5ae35a88),LL(0x777769f8,0x8053f9f6),L_(0x00000133),
+ LL(0x4910f78a,0xbee9cf4d),LL(0x976f1bd6,0x02d2c8ce),LL(0x43161975,0x0dd75a48),LL(0x8b5acff1,0x028ed35e),LL(0x251d2419,0xe8d69f8b),LL(0x0896bd46,0x5cf2d6bd),LL(0x2d891ecd,0x3cda9537),LL(0x325acaca,0xaeec8eb5),L_(0x0000008c), LL(0xee5f7e98,0x72cfa6c0),LL(0x50f74360,0x212fac46),LL(0xde49d2c8,0x867882e4),LL(0x68ef61e3,0xd816ad67),LL(0x67c6e2ba,0x761716ea),LL(0x8fd1aae7,0x8be97c55),LL(0xd4154e81,0x7978aabf),LL(0x63655c0a,0xeccbcfc3),L_(0x0000016e),
+ LL(0xd92b8ab0,0x798d6d77),LL(0x09438c81,0xf17de43a),LL(0x2d8472d2,0x3350ea81),LL(0x4f83c578,0xa8745c47),LL(0x257f1e83,0x56432cf1),LL(0xaaa0e9e7,0x7e0362ea),LL(0x8e2ff9cd,0x66e30e44),LL(0xa43e4838,0x61aa5a41),L_(0x00000102), LL(0xe109849e,0x86a0825b),LL(0xfe1a3726,0xecf10fa3),LL(0x78234ce8,0xf75dbfd7),LL(0xa854adc2,0xa029127b),LL(0xf2a5d1c2,0xf93cf941),LL(0xf178cc83,0x0dad731f),LL(0x7b737197,0xdb2a90d7),LL(0xc7585a55,0x5b39f00b),L_(0x000000e9),
+ LL(0xf14a49e9,0x3c194afc),LL(0x4b764798,0x9c6ad5a8),LL(0xf36c498b,0xd194ebf0),LL(0x5789bf3c,0x11b8897f),LL(0x36af180a,0x721c1e06),LL(0x5c78bbd6,0x926781ed),LL(0x7eda9f86,0x5fbd2cb7),LL(0xc8e02758,0x639ede19),L_(0x00000019), LL(0xc6f75980,0x65d6f9bb),LL(0xf46f5848,0xfc0b9e61),LL(0x92b9aa7b,0xbce8f803),LL(0x108e7aff,0xba188aa0),LL(0xe4839679,0x43ddb44b),LL(0xe4d01a38,0x28f6ec0b),LL(0x47439700,0x488e6c7f),LL(0x88a54089,0x764515b9),L_(0x000000eb),
+ LL(0x75b36d64,0x5cfb915a),LL(0xf6fbc903,0x5711b98d),LL(0xab2bf9c0,0x4617b374),LL(0x11ca98df,0xca70393d),LL(0x0b0a9fb9,0xa92fde65),LL(0x56f25580,0x79cc0a83),LL(0x4bbfeb8e,0xcab11e98),LL(0x7ca24068,0xa9977f9a),L_(0x0000010c), LL(0x6b433193,0x8bf78095),LL(0xbc2c6a27,0x6f0f5666),LL(0x5aae506d,0x101ee3dc),LL(0x26f13a79,0x4efcb64c),LL(0x872b3246,0x4b655b96),LL(0x93100d45,0x47392054),LL(0xb9ed2d40,0x889555dd),LL(0x82a371d8,0x35716e93),L_(0x000001ac),
+ LL(0x766756df,0x6a15b574),LL(0xc4140b76,0xcd00e756),LL(0xa87ee130,0xe237ca9f),LL(0x986e71dd,0x6c64d36f),LL(0x855fe34c,0x2ec61846),LL(0x617b88a6,0x14780c69),LL(0x747aa419,0x062f9170),LL(0xed05839d,0xa3775b2f),L_(0x000001b1), LL(0xdf66eaa8,0x8d8f4b46),LL(0xe4829292,0x3dae35c5),LL(0x952eef7e,0x2fcf3b38),LL(0xa2c8e70d,0x15ca91d1),LL(0x49e6f64f,0x2ab5e879),LL(0xc51365ef,0x6eb8edec),LL(0x68141278,0x3c5ae2c1),LL(0xbd1ceb42,0x8868ec18),L_(0x00000150),
+ LL(0x03ed8c07,0x340208b1),LL(0x2a553c67,0x02c37cf5),LL(0xdad37a02,0x0d5ab144),LL(0x0de46bcf,0xf845acc6),LL(0xdc2bcfa4,0xc7adff52),LL(0x82fc1314,0x0545c51d),LL(0xc54d801f,0x2dea714e),LL(0xcb580871,0x31541a41),L_(0x000001b9), LL(0x475550bf,0x0e58cc64),LL(0x788f8bc0,0xa9c56b21),LL(0xa004a389,0x34cf9dd4),LL(0xf832e2bc,0x5ff85d06),LL(0x552c88da,0x78c4f4e0),LL(0x30833bd4,0xada841ef),LL(0xf4f16038,0xcd227c76),LL(0xb73c429d,0x10247ed5),L_(0x00000024),
+ LL(0x78d67878,0x03d614e2),LL(0x3cb3e5f1,0x330fa2b1),LL(0x5ec2e694,0xc7a7a85d),LL(0x6fb92d18,0x1af9e2ab),LL(0x9cb09a6d,0x32ba14f0),LL(0xa2dc635b,0x4c962558),LL(0x0dcc43a3,0x44769a2a),LL(0x8ab8ab6a,0x13517adf),L_(0x0000010c), LL(0x6326a2bb,0x270a8b98),LL(0x435cd695,0x9a1d5075),LL(0x74944407,0x3eb9b615),LL(0x67a55fec,0x4207fab7),LL(0xbab02bd6,0x3706b4f2),LL(0x131eeda2,0xdb6412dd),LL(0x2a770e75,0xc7184453),LL(0xbd13d749,0xcf85aaaa),L_(0x000000f9),
+ LL(0xc8af6987,0x90643ae3),LL(0xd0279799,0xcd43ff84),LL(0x8f8d4740,0xf9be1720),LL(0xd4c21049,0x94ced526),LL(0xbc7e6131,0x885163e0),LL(0x588d6d44,0xe1a54923),LL(0xcd604d63,0x66c80ec3),LL(0xdb390f62,0x0efe7f3d),L_(0x00000194), LL(0xae124585,0xacfad765),LL(0x4c09af63,0x0b94aa5e),LL(0x1cb9cfd5,0xf7f9b44b),LL(0xb1ee2bf5,0x5da9b7b0),LL(0xea26cc32,0x695fa9a4),LL(0xc53177b1,0x05d4bfeb),LL(0x0a2128d9,0xb0617759),LL(0xd86515d3,0x4edd7559),L_(0x0000005d),
+ LL(0x04967f7b,0xcd229d61),LL(0x16ed066d,0x81766070),LL(0x27d264d4,0x4280ae01),LL(0x75f18c88,0x0de8cd8d),LL(0x999331ed,0x2979ede2),LL(0x2a794c8b,0x4aa1f796),LL(0xf6be0bc2,0xe7f6aee3),LL(0xab9da18a,0xaa378d1c),L_(0x000000ff), LL(0x0ff2ee88,0x0425becc),LL(0xc9672464,0xaeac43a7),LL(0x71fa40cd,0x9b6e5640),LL(0x8c8a54a9,0x559c4919),LL(0x8745a152,0x158de454),LL(0xea705cdc,0x49f6974a),LL(0x31085e82,0x149d6eab),LL(0x3b82a7d9,0xc24e8654),L_(0x00000094),
+ LL(0x3b24fe08,0xc6703677),LL(0xb8dfc216,0x58bdf34a),LL(0xae298494,0x009bba63),LL(0x4d30749c,0x98a3bff7),LL(0xbe1fdc0d,0xd3227485),LL(0xd2cb3b89,0xdb083e7b),LL(0xabcac22b,0x0f40c3a0),LL(0xba4e3fef,0x2ef27d74),L_(0x0000010e), LL(0x651a9249,0xf850122d),LL(0xd1940d8b,0x363cf3d8),LL(0x91127ad7,0x184425d3),LL(0x7ca8dcdb,0xdb660853),LL(0x21ec37e6,0x4beb68c4),LL(0x5fb50be0,0xd22f2025),LL(0xd5b8a4a6,0x23b1ff32),LL(0x81d34165,0x7f1e70e8),L_(0x000001e0),
+ LL(0x3e6130e5,0xd39f8fa6),LL(0x46997de6,0xfc0c43c2),LL(0x80559c77,0x74a5f61d),LL(0xf3cd5c47,0xb51aa852),LL(0x84701e4c,0x3099622c),LL(0x5f57adc3,0x1c2776e9),LL(0x66f0da61,0x0d49fb9b),LL(0x95a49243,0xce6bc32e),L_(0x00000156), LL(0x3adb5e07,0xe4c23b96),LL(0xfd811538,0xfb948d00),LL(0x57c88bf4,0xe1b0ccf5),LL(0x9a8e5fdd,0x1f936fee),LL(0xac1c5e3b,0x9560deae),LL(0xd72e0f10,0xe34e3d33),LL(0x1c36aa10,0x04676a85),LL(0x6d51f6ad,0xd48d0c93),L_(0x000001f6),
+ LL(0xf71546c6,0xba61d6f1),LL(0x16e9a196,0xae964f34),LL(0x5c0977df,0x5533b3fb),LL(0x25bde3a2,0x16bcef9f),LL(0x645c4b91,0xccba7e03),LL(0xd5f0598c,0x17ea7d85),LL(0x0a4a08b5,0x68cac5a0),LL(0x7d57c26f,0xd4f0dc66),L_(0x000001b2), LL(0x8d5d76b2,0xa5172924),LL(0xc293806a,0x5f20b34f),LL(0xa9d43e42,0x06adb487),LL(0xf8e899ee,0x2608f44d),LL(0xd8da79ac,0xb1683bc0),LL(0x4dc36bf6,0x350423e7),LL(0x15c728c1,0xfdc23809),LL(0x5dd5da5e,0xe96b3148),L_(0x000001ad),
+ LL(0x26af2e49,0xaa9adab6),LL(0x9bde5c6d,0x5ef4d7f1),LL(0x4c0f1fc9,0x8ecdc6cb),LL(0x8e47e019,0xff3c3ade),LL(0x13ede807,0x08dc8e67),LL(0x996f8947,0x296b4bda),LL(0x185a0504,0x07dc7de6),LL(0xe2a36a18,0xf820aac7),L_(0x00000032), LL(0x89c55c4e,0x32ed1a36),LL(0x4050a3aa,0xecab1a1a),LL(0x6622355e,0xc9237ec8),LL(0x11964b64,0x4010a471),LL(0x644ca385,0x6abf4831),LL(0x34cba42f,0x5d25b108),LL(0x54dd6906,0xb1ef824b),LL(0x9199f6df,0xb53e7326),L_(0x0000008e),
+ LL(0x362a2722,0x17f45f44),LL(0x47c0d420,0x299d3628),LL(0x4003ee6e,0x6f86dfae),LL(0xd3cc2b18,0x5072cb2e),LL(0xc430e500,0x294a1ff8),LL(0x69058c45,0x9eeb197c),LL(0x30c97e9f,0x859543fb),LL(0x13563a1d,0x2eed4bed),L_(0x00000168), LL(0x0f160b5d,0x5f1e8dcd),LL(0x7c4de39d,0x99a97139),LL(0x69468c31,0x294f1802),LL(0xd64eccc4,0xd505983a),LL(0x9cc6daa3,0x60e0c170),LL(0x64a5b5c1,0x8763e518),LL(0x61dc006a,0xb9099af2),LL(0xc69e9f34,0x0fe38a58),L_(0x00000180),
+},
+/* digit=1 base_pwr=2^5 */
+{
+ LL(0x65b4828e,0x4f59ae8d),LL(0x5c3b72b5,0xc123c8ad),LL(0xae6b62e3,0xca4e7ba3),LL(0xeb5d2e8f,0x7633eb4d),LL(0xaee39acb,0xeb750251),LL(0x77dcf2f5,0x1c6dd3f6),LL(0x32a70340,0x9a1f1f0b),LL(0x7ca5d0ad,0x4a21b83d),L_(0x00000123), LL(0xfd346502,0x5511dec3),LL(0x4c8a50ab,0x1b4ae54d),LL(0xb2d5cb0b,0x6fe6cc64),LL(0xe3f5079b,0x5cdba6f0),LL(0xdc0c66eb,0xbef10266),LL(0xe32e16eb,0xb3e0ef80),LL(0x5faff80c,0x347fbdec),LL(0xaff9f041,0x088b1af3),L_(0x0000015c),
+ LL(0x5f738444,0xa16ae6a8),LL(0xc671907b,0xa0da9ee1),LL(0x014d027e,0x0efad55c),LL(0x0b01f380,0xb9d3e016),LL(0xe2f7ed1b,0x938df5e9),LL(0xe67c4396,0xd65b0a5c),LL(0xd40c305d,0x533f5edd),LL(0x01c97f61,0x68a79ebe),L_(0x00000176), LL(0x3ae123a4,0xad9d235c),LL(0x2c52fc6f,0xea2d78b8),LL(0xedd0329e,0x21e0e0d2),LL(0xf1d7cac0,0x887a53dc),LL(0xd0a846a5,0xc5d60b2d),LL(0x1b4f43d5,0x0e8631dd),LL(0x4597d8ee,0x36cdd8e6),LL(0xbe2bdcac,0xb9d50810),L_(0x00000102),
+ LL(0x7955b135,0x571ccaa7),LL(0xcc45066e,0x3f9b1980),LL(0x05f6f02b,0x6757639e),LL(0xe84f381f,0x4e03775c),LL(0x5ef348d1,0x4770c353),LL(0x3845ff7f,0x5fb50c57),LL(0xedbd5036,0x5b16a317),LL(0xe0ae9613,0xbda8a1ca),L_(0x0000011c), LL(0xac6debc0,0x2efb5af8),LL(0xce499e42,0xdea5dcca),LL(0xf85f9a34,0x8fc76f8d),LL(0x07899ffe,0x0f62f621),LL(0xbdb94b70,0x648a20af),LL(0xfe99ecf5,0x436c353f),LL(0xd5421253,0x3fcac929),LL(0xe3d53ffd,0xa9413337),L_(0x00000092),
+ LL(0x967c9f8e,0xf05f3504),LL(0x72b9b7d4,0xdabb5813),LL(0x90711a09,0xa79713f3),LL(0x40b52fc0,0xbea8efb8),LL(0xb43b138e,0xcba724a4),LL(0x7bae703e,0x96698925),LL(0x5de16b6e,0xd41e4b4c),LL(0x80a9811f,0xc1b18e03),L_(0x0000000f), LL(0x7d41aa0a,0x989bdb97),LL(0x0964efd8,0x725e184a),LL(0x049a3954,0x09871a1a),LL(0x92325673,0x462734e1),LL(0x586e4cd6,0x54d24ffa),LL(0xe1d8d7ce,0xb30da7d5),LL(0x69f3efbc,0x416e700f),LL(0xef7de3d3,0xe729987f),L_(0x0000001e),
+ LL(0x4f9e94f1,0x08a54bd7),LL(0x32ffe09a,0x456c0723),LL(0xd6fc852f,0x40d62750),LL(0x2ffa7f72,0x4aeb61e4),LL(0xe7b77ac3,0x502b124f),LL(0xfe47dfb6,0x4dd6a90a),LL(0x06cd1ac4,0xa6600862),LL(0x47e8bdf2,0x9f7f4801),L_(0x000001f1), LL(0x059ad258,0x0fde861b),LL(0xc7487c32,0x94ff60ca),LL(0x23970cbd,0x72b3e644),LL(0x6984aedb,0xcc2f8476),LL(0x43e3b1aa,0x4e288fca),LL(0xd6b84507,0x5c070a30),LL(0xcde70c2f,0x806889c8),LL(0x9397e29b,0x4c71559f),L_(0x000001e0),
+ LL(0xb013de1e,0x85707b44),LL(0xfaa21460,0xdf0df8fc),LL(0x6496b635,0xa66cdf1c),LL(0x72a3871c,0x9e220e51),LL(0x55171f57,0x76519fbf),LL(0x2bc7ff1e,0x1fe67c09),LL(0x4f8bd386,0x55ed0240),LL(0xc5765e29,0x1c77281d),L_(0x000001f5), LL(0x85021f4e,0x9e78f5c3),LL(0x38d57586,0x6a14b857),LL(0xa24ce77d,0x956a40cd),LL(0x6eeb21f0,0x384b0097),LL(0x30d4fd92,0x3f99bf29),LL(0xce9aade0,0x0b162be5),LL(0xc168443c,0x056730f0),LL(0x8b3af3cd,0x86e7a481),L_(0x0000012a),
+ LL(0x5c84256a,0xd9b7e5ae),LL(0xd2292194,0xc11a98a6),LL(0x0b648125,0x59e37b44),LL(0xaf635b08,0x25aea6af),LL(0x19039f0b,0xd7528475),LL(0xd304853b,0x17b80f08),LL(0x08f86bd4,0x16cad388),LL(0x4ba43b52,0xd0f1e285),L_(0x0000005e), LL(0x4e262ae5,0x7719f6ae),LL(0x0e419d0c,0x808c65ad),LL(0x5ed42353,0x2e40948b),LL(0xc831c79b,0x95dfdfbe),LL(0x1f8615c2,0x19810fc6),LL(0xd5083188,0xc73c4dd3),LL(0x9df9fc10,0xb9ee4c0f),LL(0xb094cd65,0x75870f78),L_(0x000000a4),
+ LL(0x83c0ad6b,0x56757d02),LL(0xc834df00,0xc0d9c745),LL(0xe5caf285,0x91f23599),LL(0x620faea3,0x2d4e48a9),LL(0xb7461523,0x99bdc7a7),LL(0xf47934e5,0xd4dc2fd4),LL(0x4f65ada3,0x4c81e39c),LL(0x3c079897,0x64a2c57e),L_(0x00000010), LL(0xea9cd04f,0x3fa38d40),LL(0x22a435ef,0xc247d609),LL(0xa826a53b,0x3d8a1866),LL(0xcede94d3,0x75ac695c),LL(0x2b9c71de,0x8bcb2e7b),LL(0xd52b9aa7,0x1a8316e1),LL(0x40f2da2b,0xe2a07695),LL(0x49881db4,0x7e4c0ddd),L_(0x00000021),
+ LL(0x14f3b7ed,0x7118ea7a),LL(0xe663ce23,0xd6a550c8),LL(0x67612dfd,0x45b8de7d),LL(0xd0a752b6,0x1b9bd789),LL(0x60ad3301,0x023b6c29),LL(0xcc26ecce,0xa078b41a),LL(0x61239a1a,0xee942cd7),LL(0x6922505f,0x5e08263e),L_(0x00000187), LL(0xe0703b39,0x1108fef0),LL(0xe9adb593,0xe4610492),LL(0x509096b8,0x26279733),LL(0x4c917c92,0xc7a80802),LL(0x7516cc5c,0x8edbea9c),LL(0x131d3769,0x1db92a9d),LL(0xe32f86b9,0xc3bfb615),LL(0x16237fcf,0xdaad00e7),L_(0x00000105),
+ LL(0xf41dbbe2,0x726d1da3),LL(0xd0f5eba7,0x5afe82c9),LL(0x00a2bafd,0xa7f8f99a),LL(0x8c282afe,0x5344cf5a),LL(0xa7ab3e18,0xb4f699ab),LL(0x2626fca8,0x345363ae),LL(0xc44f5f11,0x9cac1c3a),LL(0xa135f6b3,0x2cc9c6d3),L_(0x00000083), LL(0xff61db3e,0x90784ad0),LL(0x4491c85e,0xc87a8f35),LL(0x23793bcb,0x9606baed),LL(0xcd6ee91d,0xaa42a14a),LL(0x54d429b3,0x40a29e37),LL(0x89ff244a,0xd4a2c066),LL(0x0bb505cb,0xdc545060),LL(0xfc93a903,0xad7e26a4),L_(0x0000006e),
+ LL(0x2c4f1dd9,0x8ceb07a2),LL(0x96bcc3d3,0x99d9281c),LL(0x3db83972,0x3ff2e9a3),LL(0x16268498,0x00d03fc3),LL(0xf0d72767,0x974db3bc),LL(0x52e2c15d,0xcfc51b17),LL(0xe4156324,0x10aa8cfe),LL(0x989f0141,0x8e68c302),L_(0x00000148), LL(0xb8c928ab,0xb1ff4858),LL(0x798b01e9,0xb7bcaeeb),LL(0xb107b933,0x0bdcd04d),LL(0x5499a0b1,0x26fd1d2e),LL(0xacddcbd8,0x56837ddc),LL(0xa9081a22,0x3bdf1491),LL(0x05c3276e,0xc07890c9),LL(0x91891ac9,0xa184d413),L_(0x000001ab),
+ LL(0xfb3d55c4,0x8bff7233),LL(0x91b8350b,0xf62b4383),LL(0xb265f67b,0xc46f7226),LL(0x21d7036a,0xef90907e),LL(0x8034aa28,0xdabc0434),LL(0xd005b709,0xb12cb388),LL(0x06bb608b,0xe65c7159),LL(0xeb7b8a18,0x11e0f987),L_(0x0000019b), LL(0xc295c43f,0x8d53586a),LL(0x0ab2f2c0,0xe3db9e6a),LL(0x80aa8220,0xb7b44599),LL(0x2bea87eb,0xa54e5ad3),LL(0x6c5ac479,0x93b927af),LL(0x83fb3fac,0x62a4775c),LL(0x9c4bd501,0x657b8d9a),LL(0x88136dc2,0x31811cf2),L_(0x00000073),
+ LL(0x67baa023,0x4d4e2e15),LL(0xa3ad1cf1,0xf792f378),LL(0x7aef7449,0x4d833ce0),LL(0x5394ba78,0x06fcfedb),LL(0xf33fd365,0x76965949),LL(0x9c4ccb42,0x4e9fbd73),LL(0x61aaa0a9,0x9fa1995c),LL(0x3ba114e8,0x462ee846),L_(0x0000008d), LL(0xed8f7990,0x0442839b),LL(0x46e8546b,0x4cfa345f),LL(0x0d411f16,0xc1e9119e),LL(0xf8d99149,0x0deb6f34),LL(0xb98975e2,0x6508c235),LL(0x6e32684a,0x741c5884),LL(0x99583d46,0xacaecb2f),LL(0xd61998e0,0xdc28ccee),L_(0x000001fc),
+ LL(0x1b2220c8,0x22a3dc2c),LL(0xbc8dbffe,0xf713e616),LL(0xbe6a57a2,0xbe89cc5f),LL(0x5dfb0ead,0xb5bd5287),LL(0x5dba909b,0xff87fb08),LL(0x124b1f29,0xd39afe41),LL(0x8ad8951f,0x0e13a626),LL(0x2f09f744,0x4826695e),L_(0x00000020), LL(0xe7dc7a13,0x89f11d49),LL(0xd8b689b1,0x42cf8f40),LL(0x8f4bb929,0x1093f58a),LL(0x41b6334a,0x5f1b0229),LL(0xcbfc9d3f,0xfa09f9c8),LL(0x4f838812,0x4ae0b40b),LL(0x114194e2,0x6d9844d6),LL(0x69722fe6,0x15e4c6d7),L_(0x0000004f),
+ LL(0xa12d6b0f,0x2f86d0f6),LL(0xf27fea27,0xb102e317),LL(0xf76070d1,0xb05afc5b),LL(0x1c9d3a3b,0x5dd0f5d9),LL(0x00e4d9fc,0xee4d6689),LL(0x65f0f1c6,0x2a86ba85),LL(0xde562216,0x3e6bfc0d),LL(0xdbfc35a2,0x9af0f242),L_(0x000000da), LL(0xae71ea00,0x941bae5d),LL(0x2b9df6f5,0x5be1e379),LL(0x818b63c5,0x35a1da29),LL(0x7c374ecf,0x81936096),LL(0x91cdc4c0,0x32597a76),LL(0x72e4e5df,0x3e8a2fa3),LL(0x5b7351e8,0x916e7f8d),LL(0x19372aca,0xabd62e9d),L_(0x0000016a),
+ LL(0x4a1a9b59,0xc98396a0),LL(0x1d4dea3f,0x2852471e),LL(0xf1b1b604,0x9e270a42),LL(0xbff87527,0xe46c1327),LL(0xfe022231,0xfc05c823),LL(0xe4c1b07e,0xa4581988),LL(0x46e86dbf,0xc3803e03),LL(0xf3ea14d7,0x8c2f4163),L_(0x00000069), LL(0x1c64b3b6,0x474df73f),LL(0x3f77cba0,0x82f0ebae),LL(0x9fac52f4,0xeabe2a5c),LL(0x4d046303,0x5a86c777),LL(0xd8716f60,0x16157561),LL(0x76cfe4cf,0x564b6dae),LL(0xf10528e0,0x9113bb26),LL(0x878d8ad6,0x933ccc8b),L_(0x0000002f),
+},
+/* digit=2 base_pwr=2^10 */
+{
+ LL(0xff6fab57,0x7c6312ff),LL(0xb394c36d,0xd8c526b5),LL(0xae9f8123,0x6b7fb3e1),LL(0x7287a461,0x2d9f22f9),LL(0xd21b31a9,0x895d4a0f),LL(0xd7cbfded,0x81ff2d23),LL(0x5c105748,0xe830bd0b),LL(0x4fe2bd04,0x9dfeb777),L_(0x000001d6), LL(0xf68f023b,0x83b243fc),LL(0x7e7441cd,0xa23e166b),LL(0x5c91b009,0x85f70865),LL(0x122f85c7,0x22e7768c),LL(0x6db40321,0x2fb75185),LL(0xd6df94b8,0x80b31836),LL(0x98df3edc,0xeea7ce80),LL(0x05298e9a,0x048ecb96),L_(0x000000e6),
+ LL(0xa74584c1,0x8ec6fc14),LL(0x292021e4,0xa9680402),LL(0x9500ecd0,0xed719b16),LL(0x41202339,0xb81e8a19),LL(0xb85440eb,0xd40e8e4d),LL(0x3f6a53c2,0x84a12a31),LL(0x2796c5c6,0x497c0088),LL(0x91636765,0x751837b7),L_(0x0000000c), LL(0xb89a9335,0xd4740897),LL(0xfeb6c7cf,0x05fd0f39),LL(0x66755043,0x24da0165),LL(0x915708d7,0xcde5846c),LL(0xc7bb1c3f,0x0cbcc847),LL(0x5d5c58a4,0xd0093587),LL(0x531dd999,0x178ab52f),LL(0x88ff3f98,0x4485d318),L_(0x0000007c),
+ LL(0x4bebd902,0x7f523b68),LL(0x91acdac6,0xe5501216),LL(0x656f99d2,0x9d6ec374),LL(0xe158465f,0xf67a8845),LL(0x15ed0b99,0x0ea75aec),LL(0x01226fd6,0xc000f5ba),LL(0x0a951866,0x2eb378e5),LL(0x185feb1f,0x746f4b9e),L_(0x0000008c), LL(0x8a0bff22,0xae887bf0),LL(0xc9deb828,0x2d928546),LL(0x4d8afcb8,0x7759681c),LL(0x47a77426,0x1f2422bc),LL(0x9941fb7f,0xc9c44935),LL(0x3b4f41a6,0x50ea43ef),LL(0x708dbefd,0x5c9f2544),LL(0xcef3425f,0x8d085b3a),L_(0x0000003d),
+ LL(0xe2354e89,0x4dbc092f),LL(0xa2f27fd6,0xfff03850),LL(0x2ad51407,0x2ffc14aa),LL(0xc4b80840,0xbe516b67),LL(0x4499107f,0x0f027098),LL(0x715688b4,0x5e2c9af3),LL(0xbddce779,0x26ec8f7d),LL(0xcc8a5dc6,0xcc9e1305),L_(0x0000012a), LL(0x6e30ed0c,0xcd14a595),LL(0xce664e13,0x678ff921),LL(0xb7485d5a,0xed6fe685),LL(0xdd61d65f,0x2b7d0453),LL(0xa066d915,0x81e48dc7),LL(0x0c3395f0,0xc1cb1256),LL(0x6053e587,0x630f2cdd),LL(0xc776afca,0xf0d70553),L_(0x00000014),
+ LL(0xfa927e34,0x71ac09f5),LL(0xd012b2e5,0x9190907b),LL(0xc03bb972,0xab45bb80),LL(0x8ed0d272,0x3b41e8eb),LL(0xaa3449d8,0xd2d64ef1),LL(0x4e6b21d4,0x9f7e0342),LL(0x9eb72363,0xb6336622),LL(0x69f35a65,0x9114adb9),L_(0x0000017e), LL(0x75b2adb4,0x18b88dd7),LL(0x489c82e7,0x1d050011),LL(0x5e1bdb72,0x80ac7d35),LL(0x3a785f6c,0x6bb1ceb8),LL(0x4d0595c0,0x47ba8e65),LL(0xf29ab5dc,0xfba4c7c5),LL(0x768427d3,0xf250f0c9),LL(0x38fed5ff,0x60390918),L_(0x0000018f),
+ LL(0x41d4c16a,0xd8129c74),LL(0x33a20918,0x56ec57a8),LL(0x44da27b8,0xfe03052c),LL(0x5c69a6e2,0xb8645b34),LL(0x61e0489c,0xedf7eb89),LL(0x0d9cee51,0xb459ccf4),LL(0x4bbdc11a,0x2e3c7f1a),LL(0x22591a2d,0xab74c4c7),L_(0x000001f8), LL(0x97907b5b,0xffdc8f5b),LL(0x9755e96d,0x00d903b0),LL(0x73fc3336,0xa3ed2567),LL(0xa44f5c0a,0x78da9c2e),LL(0x130585a8,0x5d2a5778),LL(0xf488bddc,0x203a9db6),LL(0x0d642fb8,0x49bb8671),LL(0x86aadd4d,0xc216425a),L_(0x000000a8),
+ LL(0x0f4d050a,0x106b0907),LL(0x6c59b6a4,0x77bee1fa),LL(0x082792c1,0x39609b3e),LL(0x4e300675,0x9586b280),LL(0x41820c34,0xf4b318a9),LL(0x568da4bf,0x504b9f0d),LL(0x18b54e1d,0x7cd449b1),LL(0xea63bc73,0x35d4426b),L_(0x000001d7), LL(0xa3569b00,0x0b6fffaa),LL(0x5b9ffa5e,0xc584b1b6),LL(0xb1ee386e,0x00bfc921),LL(0x2e48b6f0,0xc1a25580),LL(0x90b9e7af,0x232ccaec),LL(0x60d7386e,0xbcde0a94),LL(0x27832dfe,0x20ca19ad),LL(0xa34dad1d,0x2a628682),L_(0x000001ca),
+ LL(0x86b1f786,0x61a19c36),LL(0x5540d3da,0xde90b954),LL(0xfed5fc9d,0x08cbe546),LL(0x6579be89,0x931292ec),LL(0x31c8bf2b,0xde0b2215),LL(0x64709233,0xf0e33dcf),LL(0xa91e2913,0x99299206),LL(0x933880d8,0xab37b024),L_(0x00000107), LL(0x081c0df1,0x6eb1d587),LL(0x5f29f3ee,0x6f46862b),LL(0x13755e24,0xe2652ae3),LL(0x952c2e51,0xba6a65e2),LL(0x013b9446,0x3fd1b792),LL(0x5e7bffb4,0x96a14917),LL(0x66af7dd8,0x68a41011),LL(0x553d0d5f,0x4ff29cf9),L_(0x000001a3),
+ LL(0x1c733b58,0x1d7e25bf),LL(0x707d2643,0xb62058b6),LL(0x3eddf1f7,0xcf147bf5),LL(0x09f87dab,0x11a1e31b),LL(0x9b643ba2,0x4287faad),LL(0x31ecf4ec,0xfdf5220a),LL(0xa4f09336,0x8916b869),LL(0xd2c73095,0xe07b7112),L_(0x000001a5), LL(0x46af9424,0xea00c98e),LL(0x31798ea9,0xee9f1bb9),LL(0xa0db3168,0x33aa5ab3),LL(0x5107a1fa,0xbb110cf5),LL(0xccdd22ec,0xedd17aae),LL(0x8bb0cd07,0x610d689f),LL(0xcf178778,0xcca4e56f),LL(0x95d696e3,0xaef30431),L_(0x00000088),
+ LL(0xf37c6266,0x7352fa9e),LL(0x4590e4bc,0x951e01ab),LL(0x42b51fb7,0x3643ff6f),LL(0x1a3be50c,0xdad9a3a4),LL(0x5c6479b6,0xb0a91741),LL(0x5f9d3ca9,0x841c9d52),LL(0xbed2f70d,0xdc8331dc),LL(0x3fce8436,0x0a312707),L_(0x000000b2), LL(0xa224f65a,0x4d9d7ef9),LL(0xaec9953a,0x62242fd1),LL(0x04665dd7,0x49b9eb5e),LL(0x7d7f1a35,0x6a03ee74),LL(0xcabc639f,0x22cc5c02),LL(0xf26d2603,0xbb312bf5),LL(0x05ee7955,0x10cf1634),LL(0x00c226f0,0x3baa95d6),L_(0x000000bc),
+ LL(0x56832121,0x968950c6),LL(0xa826a58f,0xe858945d),LL(0x3a7fc7e7,0xd63d6714),LL(0x63d3c677,0xc319d1ba),LL(0x349e7bde,0xb4155a1d),LL(0x03a4c66e,0x3ddc0044),LL(0x77aa278e,0xccce8941),LL(0xd867d113,0x4e46021e),L_(0x00000105), LL(0x2cac2d26,0x6dd54385),LL(0xd8308ab7,0x2e1458d6),LL(0x0d0a4aaf,0x924e3bd4),LL(0x309fb2fb,0x2f7cd47f),LL(0x5161e4da,0xbc75672b),LL(0x27fa09f8,0x0e420bf8),LL(0x6bf78336,0x83d1b09e),LL(0x3c3d3117,0x89323d7e),L_(0x00000197),
+ LL(0xe5de2792,0xe8b9e5f2),LL(0x9e4c557e,0xa63316be),LL(0xc510883d,0xfba63955),LL(0x58616eed,0x5eba66cb),LL(0x1f901bb5,0x7d93dd07),LL(0xe4c33f46,0xd7520d11),LL(0x9c2288bd,0x3c9b7282),LL(0xa3f22d4f,0xf979cce9),L_(0x00000016), LL(0x6b3408c8,0x69f91fa6),LL(0x1780ab39,0x9f2b3904),LL(0x1e17f9e9,0x0408a22e),LL(0xf102825a,0xe814b39a),LL(0x4077db13,0x717c70c1),LL(0x116e8d04,0x1642fd91),LL(0x5157bba1,0x072760c2),LL(0x223d53fd,0xf596860d),L_(0x00000130),
+ LL(0x0b6e1126,0xd03914a2),LL(0x1f8fa1cb,0xbc0f726e),LL(0xc55472bc,0x9dcf7393),LL(0xcc596835,0x86ab65ea),LL(0x0c9b7622,0x90362f16),LL(0x8c0ca08c,0xe8de2a3c),LL(0xec48a671,0xbde41568),LL(0x0286ac32,0xd27da64f),L_(0x00000038), LL(0xa6fda916,0xf6c82cd6),LL(0x53a87083,0x3e753ee6),LL(0xab548bed,0x07afab6b),LL(0xc34ddb60,0xc0dc2ddc),LL(0x378f8e85,0x399c4261),LL(0x5087e698,0x6f7e49f2),LL(0x07f39938,0x6345ae4d),LL(0xc730c9c6,0xb6c2765f),L_(0x000001f3),
+ LL(0x62619340,0xe4292c6d),LL(0xf4cf1a41,0xfb9a8b65),LL(0xf774c321,0x5046d341),LL(0x7b28d6b2,0xfe598075),LL(0xb06becbe,0xc3187f95),LL(0xd220a206,0xc278703d),LL(0x54ba06d2,0xb514e8c6),LL(0xda1d824d,0xc959300e),L_(0x000000df), LL(0xbb2a1c22,0x7fbd13f4),LL(0xec877f9e,0xd0e494f0),LL(0x209c6b0a,0x529b0f0c),LL(0xc6b1073b,0x50fb2f00),LL(0xd17f2e67,0x80cd82a4),LL(0x62378ddb,0x9f57c57d),LL(0x0162b312,0xc234e4cb),LL(0x8483d5e6,0x501d8ec9),L_(0x0000013f),
+ LL(0x4bb68070,0x0d037502),LL(0xd53d7a18,0x424ed14d),LL(0xd13f986d,0x29de6753),LL(0x3e4dbff0,0x6d33dc1f),LL(0xf6b77dc2,0x87ad5722),LL(0xbf6050c2,0xaea8f254),LL(0x83742064,0xb17406b4),LL(0x7d90e061,0x13b29245),L_(0x00000002), LL(0xb43c52b6,0x7f20e8bb),LL(0x5bf160f5,0x8562b323),LL(0x1d2d2e90,0x4b31d400),LL(0xea7b242c,0x4a1acb5c),LL(0x229d7510,0xc93f9b92),LL(0x3eba408b,0xb068a0e7),LL(0xb0525ab0,0xb376d6b0),LL(0xd96dff43,0xf1b03f82),L_(0x000001b4),
+ LL(0xd1e5c64c,0x77ddddf5),LL(0x631d2365,0xc4b6db39),LL(0x5fc5e812,0xd1cccab0),LL(0xc38ec807,0x8729f1a1),LL(0x1629e92c,0xc999e406),LL(0x6b4c00d1,0x781d88f5),LL(0x3cac8f29,0xcce3380c),LL(0x16b02141,0xc7e0e0cc),L_(0x00000120), LL(0xd88382b9,0x76234580),LL(0xd02da7d0,0xe2d27b0a),LL(0xcc82cf5a,0x3adad7f2),LL(0x2c08a15c,0x7009305d),LL(0x55fa7b4d,0xde9e632a),LL(0x0b55b693,0x2a821156),LL(0xb565732e,0x3788cf98),LL(0x89f0adb6,0x2d1f6054),L_(0x0000018e),
+},
+/* digit=3 base_pwr=2^15 */
+{
+ LL(0x5b21bde5,0xb0c6a7b6),LL(0x23a29c73,0x9c3eafc7),LL(0x392643c3,0xf81be3c4),LL(0x88c0b213,0xec734fa3),LL(0x33b98ae3,0x9b26d37a),LL(0x23074268,0x687a332e),LL(0x28354ec1,0x6935b64e),LL(0xf60d4b7e,0x9d55aecf),L_(0x000001a7), LL(0x910afa18,0xd6073362),LL(0x8bcd336b,0x5b5f67fb),LL(0xb6c7a784,0x5633e845),LL(0xdf601730,0xa907be72),LL(0x2814a576,0xfe65734d),LL(0xc7084b86,0x0758f113),LL(0xd7bad9f2,0x5030c22c),LL(0x3ef6af2a,0x7ff1cabc),L_(0x00000164),
+ LL(0xeb37269e,0x6184cce9),LL(0xac65525f,0x5051a406),LL(0xc9acc4f2,0x651c4a44),LL(0xb637bdd2,0x571fa6bd),LL(0x2ae9ce59,0x4cf1489d),LL(0xf56bdf32,0x61b0a821),LL(0xe5fa827f,0x9dcea620),LL(0x4b46a244,0x7027c9ed),L_(0x00000094), LL(0x0d4d4505,0x0495f1c5),LL(0x27a410cd,0xee6432c2),LL(0xbc9ba135,0x73536858),LL(0x53142570,0x7e39c350),LL(0xd0616e0b,0x316eeb65),LL(0xa694a069,0x55bbe949),LL(0x9aba0dc4,0x1f9d7b76),LL(0x32d36d72,0x1dcb7a1d),L_(0x00000004),
+ LL(0x4d5e5081,0x0fce6d79),LL(0x49c3fb55,0x3a2f9da5),LL(0x3a8e9a7e,0x44e158ff),LL(0xd771a67e,0x7de21bd3),LL(0xa6180b0e,0x5cf6b900),LL(0x349f9cad,0x53ff2b3f),LL(0x783786f1,0xe350b1ce),LL(0xec23cb86,0x58690faa),L_(0x000001ef), LL(0x09eb4774,0xe8902691),LL(0x4d7ea0cd,0xdfaca68b),LL(0x13648702,0x595a974f),LL(0x5bd316f2,0xbf226a22),LL(0xbb11b239,0xeaee978b),LL(0x2ab1e433,0xc7607b51),LL(0x870c9a0f,0x43795a95),LL(0xe00a29c5,0x53d7cad7),L_(0x00000060),
+ LL(0xfc15e51c,0x9b30d330),LL(0x8312448f,0x499ca6a8),LL(0x27c12fd1,0xaf5a132e),LL(0xc3fb765e,0x01b2d2a5),LL(0x07951a8d,0xce3517c8),LL(0x97c68ed6,0xe67d936a),LL(0x8cdd161c,0xad5eb28f),LL(0x795d9876,0x6496ac4a),L_(0x00000197), LL(0x4de7c0ea,0x7fd91252),LL(0x6e4dff62,0xe44601e6),LL(0xa96a9194,0x84a673b1),LL(0xf81ccae8,0x06054966),LL(0x2eba8c5d,0x53226945),LL(0x77e70b53,0x17deba76),LL(0x98891e5c,0x2fe55a92),LL(0xccf9a70e,0x8b39032d),L_(0x000000d4),
+ LL(0x4b1d8796,0x2c87d9f4),LL(0xce45ab56,0x0de1dc21),LL(0xa16d3789,0x72ace7c2),LL(0xe08192c8,0xe7012d3c),LL(0x4840d465,0x2d9fcc09),LL(0xd2d9e7c8,0xb83abe6f),LL(0x4dc89aa4,0x57f505dd),LL(0x58ef6f90,0xc12ca416),L_(0x000000e4), LL(0x0a635439,0x9e8dd733),LL(0x4f047388,0x1231cdd3),LL(0x536cd1c8,0x45523810),LL(0xd1e5a85f,0x4bcff7cb),LL(0x3fceb99e,0x86ad3d2f),LL(0x00ae1467,0xddf93ca7),LL(0xab6574df,0x4160edd9),LL(0x611238b6,0x0bbbbc9e),L_(0x000000eb),
+ LL(0x2f4ff50a,0x4b9dc9a7),LL(0x4e86b3f7,0xd56a4df5),LL(0xb7fc672c,0xc91daa4c),LL(0x047ac313,0xd8b04fac),LL(0x71df8b53,0xd047ffb7),LL(0x48cf7c44,0xe196a8ad),LL(0xbf663542,0xea4fed68),LL(0x45aa68b0,0xdbd49e0b),L_(0x00000083), LL(0x389e5cb0,0xd77d603e),LL(0x33664de2,0x5ef7dee2),LL(0x994f9685,0xc8ab10b1),LL(0x5e3c5bf8,0xf5ab3d23),LL(0xff2ae5c2,0xdbff37af),LL(0x9d0fd0f4,0x50db50de),LL(0xa6d91d52,0xe2c950fc),LL(0xa742da0b,0x0ec3836f),L_(0x000001c7),
+ LL(0xccb5796a,0xea3797f2),LL(0x00f8c37d,0x0b3e1166),LL(0xce0936fa,0xb532c55c),LL(0x204a444f,0xeef2ac73),LL(0xa6b09c79,0x31515d9e),LL(0xac9e3e09,0xdd05ab36),LL(0xe9cef435,0x319eb710),LL(0xfa2d9fd3,0x1d7ac545),L_(0x000000bc), LL(0x588c66b6,0x595b4001),LL(0x2f76c04a,0x0f70018c),LL(0x74e5849f,0xa9c62272),LL(0xb2abd908,0xaecd915f),LL(0x5ffbaabb,0x9fa73bfe),LL(0x111c8c5f,0x35b0554e),LL(0x77c9c2a7,0xcc8177e6),LL(0xe83b44a5,0x3bc6ae04),L_(0x000001ec),
+ LL(0x53c1578f,0x229b222a),LL(0xb1bb114a,0xff59f733),LL(0x887f6c13,0x2679cded),LL(0xbbad5dfb,0xd35dec8b),LL(0xea94d41f,0x90930770),LL(0xd4f0a601,0x2ad07da8),LL(0x2142901c,0x48f142ed),LL(0x692aaa86,0x252e4559),L_(0x00000142), LL(0x47539509,0x9b4f335e),LL(0x78c42f0d,0xc2716105),LL(0xfda89975,0x2c49b195),LL(0x35776137,0x3ac76051),LL(0x4de0d058,0xfcd0c4d5),LL(0x47ffa549,0xe11bc35f),LL(0x31f21817,0x3f57a567),LL(0x46ac2b10,0xcde0cd71),L_(0x00000084),
+ LL(0x3acc431b,0xaecaf4a5),LL(0xcd468ef8,0x60b977fb),LL(0xbcb8a438,0x3938f4bc),LL(0xcfcf5c2b,0x2c7337c9),LL(0x7bb844f3,0x23c47750),LL(0xdea5e248,0xf126971b),LL(0x47ee8dea,0x6f1d664c),LL(0xd5392932,0x3efa21b6),L_(0x0000018b), LL(0x3e152528,0x5940abfb),LL(0x28ef7f36,0x3e9bee76),LL(0x8f415722,0x360759cd),LL(0x11a30e1c,0x3c8733e8),LL(0x78196a73,0xc43394c7),LL(0xf3a60c7e,0xac3864e9),LL(0x776e1d00,0x0c19158c),LL(0x2e4681b7,0x517321cc),L_(0x00000040),
+ LL(0xcba05043,0x69bb2a3b),LL(0x59d22ba1,0x18bc1523),LL(0xee4d727c,0xbabfd9ca),LL(0x4c8338aa,0xe3550512),LL(0xa9cc3cca,0xe599b6e8),LL(0x15386807,0xc5ab3c64),LL(0x3919da2f,0xd2ee43d4),LL(0x801a4c6f,0x38ead934),L_(0x000001be), LL(0x64a97d4d,0x8b8c66b5),LL(0x7834d44e,0x74807217),LL(0x690ef307,0x926feb1c),LL(0x54c7151d,0xbe2f1f34),LL(0x456bd03f,0xc48ce8e6),LL(0x04a6964d,0xafec270c),LL(0xe8febbc7,0x483b3a5f),LL(0xd30f159a,0x96cb139a),L_(0x000000ca),
+ LL(0x77df0935,0x0e87f867),LL(0xf99ad667,0x75faf57c),LL(0x011dcb9c,0x6c05cb53),LL(0x4f1f75a2,0x3556cade),LL(0x2dea9ad0,0x3f87760d),LL(0xb590f7b4,0xe73b9512),LL(0xc497a74f,0x5a5a684b),LL(0x8d18f07d,0x8e2fa89c),L_(0x00000050), LL(0xb516cc59,0xc3adce30),LL(0x12408706,0x4d73c59c),LL(0xcce1c5bc,0x2ddcd22c),LL(0x381eb1ab,0x0b77c42b),LL(0x43827dd9,0xaee2e20f),LL(0x0ecadad8,0x4d7ed6ba),LL(0x141b0bef,0x69fa3aa0),LL(0x9ae275eb,0x3d138706),L_(0x00000114),
+ LL(0x3d8a013e,0x7fc0e976),LL(0x65d7b1d3,0xc8c06baa),LL(0x608a4b87,0x2e527b8c),LL(0xa2d8c259,0xcc19bb3a),LL(0xb09308aa,0x4ce5b0ad),LL(0x2458761d,0x7a6ee0f4),LL(0xd73d4f70,0xd791c442),LL(0x0d3867f8,0x3ba7a1a6),L_(0x00000094), LL(0xe51b0763,0x0e7ffca3),LL(0x467af3d9,0x60c44d23),LL(0x9427b9fa,0xe4a16358),LL(0xaff54ce0,0x55e4129a),LL(0x275c2816,0xcbefd5ea),LL(0x7c03c7fc,0xb7160ce2),LL(0xc97ca421,0x84bb35f0),LL(0xea69ee6f,0x35e0436e),L_(0x000001ec),
+ LL(0xfe162d02,0xf585af17),LL(0xbac45c7f,0xf7251745),LL(0xd6aa93a1,0x8a56414c),LL(0x8fa35248,0xf6e64410),LL(0x1720b12e,0x81f59ca8),LL(0x6cb0f80a,0x232a9916),LL(0x205cfe62,0x872efe0b),LL(0xdcba9616,0xa3d26e5c),L_(0x00000021), LL(0x9ac2f018,0x06a36051),LL(0x478ec567,0x7d42157a),LL(0xa110b6a7,0x0c863ff6),LL(0xb1e77441,0xa6979407),LL(0x7c13c78a,0x6a0ad3b6),LL(0x08c47fd0,0x34e0edd0),LL(0xcd2ed5cb,0x8df0c73d),LL(0x41a8e1a2,0x73883967),L_(0x0000012e),
+ LL(0x94304215,0x7d33b8c9),LL(0xa6572311,0x3fceee3a),LL(0x1482e2ca,0x52560262),LL(0x6d96dfdb,0xa105a9eb),LL(0xbdc41e36,0x8c0fd8b7),LL(0xa2f2edd5,0xb271c58b),LL(0x050043d8,0x4a51907c),LL(0xa79966a3,0x0fa52e13),L_(0x000000ee), LL(0x6d5fc916,0xdac2d706),LL(0x62accbe2,0x0b78e0d4),LL(0x8397028d,0x2c9d107f),LL(0x711b525e,0xfedd5666),LL(0x0c96203d,0x88395725),LL(0x2be09463,0xf9856d0f),LL(0x6dd96c8f,0x9c7a6702),LL(0x4398fe82,0xfc430b6d),L_(0x000001ac),
+ LL(0x41758c46,0xaa02764f),LL(0x7d06225f,0x36596aaf),LL(0x23dab345,0x0047b230),LL(0x1f940005,0x1c2f1ccf),LL(0xb4fb0f0c,0x82a82a8c),LL(0x589309ef,0xc66190cb),LL(0x19fbd0a3,0x839f41c1),LL(0x0fe2846b,0xcc1c9536),L_(0x0000019c), LL(0x917c26bb,0x729f81c7),LL(0x27782d0b,0x55359881),LL(0x76e1016b,0xcaad48a7),LL(0x26d82543,0xc89767f1),LL(0xcf1f4470,0xd4acb529),LL(0xe5b4bfed,0x7b75fd29),LL(0xae8ee068,0xc3d34db9),LL(0x3b3ffbcb,0x9c535467),L_(0x000001d7),
+ LL(0xe3f00489,0x9faba8ba),LL(0x5f421abd,0xe82276fc),LL(0x94ac402c,0x91f2efc8),LL(0x7d55bead,0x8241f32e),LL(0xcc1090d2,0xe8bce170),LL(0x19f59df3,0xe27350cb),LL(0x4ac35c2d,0x3e6cfc43),LL(0xd13cf90c,0x84bc2847),L_(0x000000a7), LL(0x54f1aa33,0xfd3f87f7),LL(0x2713cbe9,0x4fd8d338),LL(0x34163c33,0x46cada61),LL(0x7214cbe3,0x6aa94a54),LL(0x30a042dd,0xf7b92358),LL(0xe120acf2,0x09be500b),LL(0x30c3e8d0,0x51dc7f0d),LL(0x6f225e27,0xb7edd06e),L_(0x00000114),
+},
+/* digit=4 base_pwr=2^20 */
+{
+ LL(0xe47d13c6,0x20c1256f),LL(0x2fd11810,0x5aa78701),LL(0xc4a46931,0xea26a86c),LL(0x056b1163,0xbe00b905),LL(0xa0ac68e4,0x52f1dad4),LL(0xc19c5769,0xc6fde2d8),LL(0xbbc11dae,0x6293f810),LL(0x3a3baf9c,0x5056fba0),L_(0x00000137), LL(0xbfc9af73,0x5973f08b),LL(0x4cc716b5,0x8efce6c1),LL(0xb5b613b1,0x64d3ad94),LL(0x248f005d,0xba83b800),LL(0xa375eb34,0xc9ee4cf2),LL(0x413af2a4,0x68a27d29),LL(0x25ea8722,0x8d12fde5),LL(0xc9c082bd,0x2d233189),L_(0x000000fa),
+ LL(0xc1b123bb,0x85f1bef2),LL(0xa73fb5cd,0x111a8c9c),LL(0x1a80d76a,0x8d3b7461),LL(0x2e325f88,0x7765b87f),LL(0xc8ad9e3f,0x92e36012),LL(0x2c7cf6c4,0xbf5a9dc4),LL(0x7d5db366,0x6228a81d),LL(0x915359f9,0x725123cd),L_(0x00000172), LL(0x2cfcba5e,0x8b6c7a0e),LL(0xa38cc5da,0xee14f97f),LL(0xb43bb38e,0x770c4afd),LL(0xaa0f15c0,0x138850f3),LL(0x3953b993,0x2658cf7e),LL(0xb70f0779,0x1d447c8b),LL(0xd78fd38c,0x681177a0),LL(0x8e23ebe4,0x704ca751),L_(0x0000009d),
+ LL(0x527a9d3e,0xba8fa7e4),LL(0x4e9fda74,0x334944db),LL(0x404855f4,0x65201753),LL(0x31df130f,0x19a9846d),LL(0x661cb9d7,0xbc651ab9),LL(0xc04c2995,0x91c2b653),LL(0x1b2c3fb5,0x1b65fb33),LL(0xc90b91d2,0x9233b624),L_(0x0000001f), LL(0x061f9eb8,0xfceac108),LL(0x86d9cc5a,0x4cdd0a2e),LL(0x0e2ec8f9,0x309b7d38),LL(0xf2c40675,0x0d2223f6),LL(0xc1e34e32,0xa3be480d),LL(0xb364f62b,0xec527b72),LL(0x3595753d,0xf6639f06),LL(0x4e283d90,0x67ed0c35),L_(0x000001d5),
+ LL(0xd4783247,0x5667e2e3),LL(0x2b33e937,0x711cfb9d),LL(0x5cc9c7d0,0xedf0adb9),LL(0xc5aaa7c2,0x610b704f),LL(0x770150b6,0x1107368e),LL(0xf9af2a47,0x06e6cc4e),LL(0xfe1e566d,0x814dd0ca),LL(0x7ca67146,0x6c67f663),L_(0x000001d3), LL(0x3ca6a46e,0xecb744b3),LL(0xd960d19d,0xc0bcfa2a),LL(0x99ff41db,0x933b28a6),LL(0xb97977ca,0x951faf63),LL(0xca3752a7,0x15168f23),LL(0x01e0f16b,0x4ea397d9),LL(0x05f55f96,0x3b374a51),LL(0x813c0d40,0xe408ed3a),L_(0x00000143),
+ LL(0x0a55f862,0x937586c5),LL(0x83c230d0,0x61062265),LL(0x9c8f1eaf,0x10419f67),LL(0x2c698769,0x8d67dbad),LL(0x4407836e,0x4c3c184d),LL(0x99fd2f81,0x52a37538),LL(0x7825fefa,0x45a721e3),LL(0xfff07585,0xa4b823d5),L_(0x00000098), LL(0xd4ed2584,0x96e376eb),LL(0x6a23fbe4,0x5f76504d),LL(0xb69ec350,0x545afc26),LL(0xfb28fe6b,0x87ed2073),LL(0xaf95f20e,0xa6145047),LL(0x4d27cd1b,0xc4cc53f8),LL(0xa35d865d,0x9ee96b7f),LL(0xb07b711a,0x430aefde),L_(0x000000ec),
+ LL(0x69146afc,0xc7354ba1),LL(0x9fdb88ca,0xdc64a8c7),LL(0x9f85e2ef,0x7f3a69d0),LL(0x5631012d,0xd2bed232),LL(0xfd4d1f17,0x04dfd89c),LL(0xe64d46be,0xd5598288),LL(0x9f8bf20f,0x1f269d18),LL(0xc11d0864,0x333e29ff),L_(0x000001fc), LL(0xb8320599,0x9cc7dab1),LL(0xbbef8e94,0x5c714223),LL(0x7f10fed7,0xbb61d266),LL(0x09c647b0,0xe823dbf3),LL(0xf58db2b8,0x4601c5a1),LL(0x3a71fa3e,0x344f9c02),LL(0x0b5cbdd6,0x77b11f1a),LL(0xf8df6a65,0x6eb12db5),L_(0x0000007e),
+ LL(0x2c64c2a6,0x0db94e9f),LL(0x9c4cc346,0x646b9dff),LL(0x339e03c0,0x7ae26f18),LL(0x64dca76c,0x2ba1712f),LL(0x2c804061,0x16950e5f),LL(0xb5bf0fae,0x13d1569e),LL(0x185858b6,0x5b35ba86),LL(0x6880b124,0x3c937406),L_(0x0000019a), LL(0xe1c9646a,0xee5f1c44),LL(0x96f83044,0x10924610),LL(0xe69176fe,0x5cfb2614),LL(0x324a7887,0x825516a8),LL(0xfbad9007,0xc065d69c),LL(0x3d71727b,0x06621f87),LL(0x85c81c53,0xe21856f1),LL(0x3ac1471a,0x68582e4e),L_(0x0000007e),
+ LL(0xb68f07c0,0x9ace1c67),LL(0x5469124c,0x24f3ddfa),LL(0xccd6db20,0xaadd52b4),LL(0x74a2fc6f,0x24af0765),LL(0x17b27151,0xb5105915),LL(0x118a106b,0x7e240081),LL(0xcffda2d6,0xc6925ec7),LL(0x88b3b39f,0x37b374e2),L_(0x00000120), LL(0x541ec518,0xefd91b81),LL(0x3a683e17,0xa72b7c41),LL(0x952a60ed,0x0495c130),LL(0x9c4b61d8,0xbf06a574),LL(0x872c4bf6,0x0c7cbd39),LL(0xe01cb7ce,0x989f1a82),LL(0x726d7547,0x44906b41),LL(0x52742de9,0x2e02ff37),L_(0x0000009f),
+ LL(0xeedd6da3,0x8dd4b66d),LL(0x73240fb0,0xb6e39bb1),LL(0x1303b771,0x195468c6),LL(0x7bd7b8e4,0x9c3d4d09),LL(0xa8684e6d,0x724f9017),LL(0x31c9bec6,0x2fd691e3),LL(0x727ff44a,0x5f3d4db7),LL(0x89060924,0x984ffa88),L_(0x000001b0), LL(0xcf998e88,0x0c1bfdeb),LL(0x6d85f7e8,0x4b0cbc59),LL(0xccccc632,0xe1faf1ce),LL(0xc7a0620b,0xf6e95c18),LL(0x0aa71a3a,0x8fa50a9c),LL(0x49a07249,0x8cf3e64b),LL(0xaed36f6a,0x94bd6377),LL(0xa4cf33ed,0xeb0073d7),L_(0x0000013f),
+ LL(0xadc752d7,0x87c3614b),LL(0x53d1d5ef,0xaa78183f),LL(0x8ea4ef11,0x5c12de26),LL(0x84a5c0b0,0x3315c75e),LL(0x4f1d31e4,0x0d7a1bdb),LL(0x97ef83ed,0x8d2ce325),LL(0x91dd29d3,0x3340be93),LL(0x184b8ada,0x0f8f6087),L_(0x000001c1), LL(0x9fad91c5,0x8ce9dccb),LL(0x96d5b0b9,0x641d29f6),LL(0xb48f1d66,0x50813cfd),LL(0x8881842c,0x7ff13a32),LL(0x3fa7e856,0x78eaa08d),LL(0x7984e336,0xfbc798ef),LL(0x67c2e064,0xb3fc5a0a),LL(0x23e92b2d,0xe38a9115),L_(0x00000008),
+ LL(0xb65bfdd1,0x3691b2b4),LL(0x9b215aee,0x5cf3f209),LL(0xa1d61cff,0x4a0f639e),LL(0x2783ba69,0x62cddd5b),LL(0x1490682d,0x5648b7c2),LL(0x074ffd3c,0xeb8c7a90),LL(0x0e9bddbd,0xf3751b7e),LL(0xbce879c7,0xa3bfa1d5),L_(0x000000d9), LL(0x8d0510d3,0x20a30aeb),LL(0xe42922b6,0x3498a06c),LL(0xa129b145,0x26cc79e5),LL(0x9d307ed3,0x1c156f64),LL(0x2baf6215,0x14f481b2),LL(0x9b79cac0,0x2eb38c02),LL(0xc564e629,0xde0cf55a),LL(0x24a1582a,0xad5a0f7d),L_(0x000001d5),
+ LL(0xea9885d3,0xa68ccc39),LL(0x6997bdf9,0x05de1b77),LL(0x553e670c,0xee7e6f6d),LL(0xadae5917,0x199db8cd),LL(0xecf2088a,0xc33572de),LL(0xa41c0fa0,0x7b432d00),LL(0x1dc922e3,0xc58b8529),LL(0xb5615888,0xb9f1df40),L_(0x0000017e), LL(0x8b5496a0,0xe11804a4),LL(0x9626517b,0xb50d5ff0),LL(0x34399d8f,0xeb302429),LL(0x18d0e9c5,0x47c13487),LL(0x18ec316e,0x851d2afc),LL(0x1b701f2c,0x167d9f22),LL(0x883a9116,0xa8f932f6),LL(0xc3a9d8fd,0x0da0e796),L_(0x00000102),
+ LL(0xd19a69ad,0x029cd0ab),LL(0x5d899070,0xb5278a7b),LL(0xe7ecc032,0xabde08a8),LL(0x9fa79438,0xd3d2c019),LL(0x80363047,0x66ae4725),LL(0x141bc210,0xeab542c4),LL(0xdf1d8696,0xd1c060a0),LL(0x3908c1f0,0xfa788627),L_(0x000001d3), LL(0x31ffefe1,0x677d387d),LL(0x76fb5476,0x05f7c0d8),LL(0x3a298203,0x2097dc46),LL(0xe5119f75,0x1f8bd7b9),LL(0x5996aa0e,0x61982b25),LL(0x92c77df7,0x119a9371),LL(0xac8b008e,0x7f9b0675),LL(0x346bbe9d,0x8f2407d2),L_(0x00000037),
+ LL(0x68bd6724,0xab5b8457),LL(0x52f7bee1,0xbc2db536),LL(0x07aae0d0,0x58623dce),LL(0xa3e03da9,0xf444f5c3),LL(0xe7b9b75d,0xdb04bbba),LL(0x8fa837de,0xb065c230),LL(0xed346416,0x51909adb),LL(0x16d6222a,0x3c084209),L_(0x000001f1), LL(0xe28ca284,0xdf2f5e19),LL(0xbbb390fd,0x38ba1ac8),LL(0xc03099bd,0xa1e828bc),LL(0x6f1d5124,0xb83c59a2),LL(0xfd863005,0xc17a0d0d),LL(0x97857c15,0x2d92fc6c),LL(0xd53a6942,0xb70e5498),LL(0x36d4d6e3,0x368524fa),L_(0x00000187),
+ LL(0xb1d0aee2,0xc5143f3d),LL(0xcda50c31,0x34bd47c0),LL(0x5f0ed71c,0x1dee87b7),LL(0x24882cc9,0x7e3bbffb),LL(0xd1c7d1fb,0x1e403329),LL(0x92474fcc,0x53d4ee41),LL(0xbcade2fb,0xbd25257b),LL(0x48035309,0x1ff4afd1),L_(0x000000f3), LL(0x35e3b8a0,0xf76b6465),LL(0x54f67634,0x6c3176f4),LL(0x76970368,0x7bbaa2a0),LL(0xe3ebf308,0xc5082d82),LL(0x65ccfb3f,0xec84bb5f),LL(0xf3b5795a,0x4999273e),LL(0xa51dd238,0x7a764cec),LL(0xe6317658,0xd0cd1c12),L_(0x000000d5),
+ LL(0xcba7983d,0x440872f1),LL(0x28a369cd,0xf5dafa9c),LL(0x07ce63b6,0xc12c54cd),LL(0x4f79c12d,0x0a67eec8),LL(0xee7a34a0,0xdbc7a4ed),LL(0xff4e7f63,0x40f7ea82),LL(0x50ab4929,0xdc3353f9),LL(0xcd953027,0x1b37a3c6),L_(0x000001e2), LL(0xb77d6e77,0x4c5f758a),LL(0x416ce18f,0xa1adfbab),LL(0xb9e45e70,0xa53a6ae6),LL(0xf8e38074,0x19bbc5ea),LL(0x639d3359,0x66580a40),LL(0x3c3446f8,0xabe333f8),LL(0xf20b5de7,0x703c0639),LL(0xd4a42c48,0x59dbbfad),L_(0x000000d6),
+},
+/* digit=5 base_pwr=2^25 */
+{
+ LL(0xc7d07442,0xd025b49c),LL(0xa66a4107,0x4a0b9d5c),LL(0x09a27870,0x383562d7),LL(0xb8b27e26,0x8bfb3e1f),LL(0xcd156bc2,0x06132452),LL(0x49ca82ac,0x92d3d9a2),LL(0xa22d3a0e,0xd34655b5),LL(0xa2b19aaf,0x36ff20de),L_(0x0000008d), LL(0x5835a5bc,0x86f6b302),LL(0x1143727c,0x8192a853),LL(0xc5c00385,0x52b2fd4b),LL(0xdaf1da93,0x5e79d62b),LL(0xde7c27d2,0x23c74903),LL(0x18fc4730,0xd6b3ad47),LL(0x3e48286e,0xe1fb2466),LL(0xde5e2dbe,0x558feb16),L_(0x00000057),
+ LL(0xf7f37af3,0xf33aa997),LL(0x399f83a0,0xac6eebd0),LL(0xf152344e,0x1e36ba58),LL(0xb233cc5d,0xbcb7b01b),LL(0xb95ccb58,0x0e6e01c3),LL(0xbd70b347,0x28b73f3c),LL(0x471f1429,0x192a8fa5),LL(0x72f33fe8,0x51b82a42),L_(0x00000077), LL(0x1a1be232,0x91ea1f80),LL(0x29d67e20,0x9219d0e0),LL(0x355df0fe,0x86128187),LL(0xb88069ec,0x196ceb57),LL(0xc5d6f3e9,0xcb831fc0),LL(0x61a90e72,0x76ccb185),LL(0x875cf514,0x775daca6),LL(0x5e9d0fdc,0xf11fb0d6),L_(0x00000156),
+ LL(0xc6a99de8,0x4f6f0528),LL(0x8365a540,0xd607f5f7),LL(0xa6130da7,0x85d457a1),LL(0x282ce8f3,0x7a71db8c),LL(0xf22e8e12,0x675b1780),LL(0x1ed981d1,0x54455f27),LL(0x879b7161,0xd4c8d2d0),LL(0xe53f2395,0xfbb885ea),L_(0x0000002f), LL(0x9830814f,0xdd4e8a69),LL(0xc1a29f03,0xd15d6f60),LL(0x620f1843,0x51aa6497),LL(0xb9253703,0x3bdc3d85),LL(0xb15aa83f,0xd5713630),LL(0x38bafd76,0x46f5b250),LL(0xa324c450,0xc7ef0e3a),LL(0x428ff854,0x3074cd9a),L_(0x00000187),
+ LL(0xda6a189a,0xdb38150e),LL(0x98edde21,0x02c3ed54),LL(0x10e8c4a8,0x92441512),LL(0x5d3d5708,0xf9b009f9),LL(0x785d69a6,0xac80e954),LL(0xa197859e,0x166d8dbf),LL(0x9a954ad6,0x5cac81cf),LL(0xd5536054,0x01aaa83b),L_(0x0000002d), LL(0xc362ba43,0x578a0342),LL(0x2cf62469,0xb8dd8820),LL(0x8c4987d0,0xc2b48e0f),LL(0x3b1becfe,0xd5c621a6),LL(0xa90343a0,0xf668f2b6),LL(0xfe098700,0x9c088bd4),LL(0xbd8fa882,0x3f0936a8),LL(0x67794851,0xae92e720),L_(0x00000133),
+ LL(0x96b1f8f9,0x45dfbf2f),LL(0x3cd0f06a,0x39d3c154),LL(0xf941b6e2,0x350febe9),LL(0x2d076edd,0x4d560b52),LL(0x55928e0b,0x2b184b05),LL(0x9f1196dc,0x85b25794),LL(0x6b4f0570,0x942eaf69),LL(0xe7c1e0be,0xd7c08589),L_(0x00000017), LL(0xe3a9890c,0x7bc564b2),LL(0x3dbde8c2,0x8d95012a),LL(0xeff3d407,0xa7b28d48),LL(0x08aae60c,0x1b0df773),LL(0xe7d844e8,0xf5cd9389),LL(0xe907a4ac,0x0fa28183),LL(0x6e40930b,0x381dd63b),LL(0x20fcef80,0xa89662a0),L_(0x0000003a),
+ LL(0xbd48b590,0x33be7ac9),LL(0xf700265a,0xf01390c9),LL(0x82de52e5,0x6ffa798e),LL(0xd0dd94ce,0xd994953e),LL(0x2a40701e,0xdc206da1),LL(0xf9937624,0x9641d8d6),LL(0x68b09fde,0xfb08d3aa),LL(0x515609bd,0xc7a5c685),L_(0x00000107), LL(0x81a858ff,0x34c11eaf),LL(0x007f99c6,0x3e931cb9),LL(0xfb91b432,0x97268272),LL(0xb16a5f9f,0x14f51fca),LL(0x22fdf379,0x448325ce),LL(0xa5ef4116,0x36a8c292),LL(0xb6fe6cbe,0xee4ed4ed),LL(0xd30012d0,0x5ebc5cb5),L_(0x00000061),
+ LL(0x4947635b,0x6edf3f2a),LL(0xc68eb226,0x00200346),LL(0x880aea4d,0x8d31f029),LL(0x006895c8,0xf085775e),LL(0x89fcfc5e,0xd25cf0d0),LL(0xb2a191ee,0x4508a2eb),LL(0xc9428552,0x90ca4e90),LL(0x22abade9,0x985e1eac),L_(0x000001a8), LL(0x90df5f6c,0x31e5ce6f),LL(0x96705235,0xdb11d250),LL(0xee984de1,0xfa51e382),LL(0x06a31aa7,0x47482dcf),LL(0xb9587e74,0x988048ce),LL(0x51593c99,0xca987f12),LL(0x6fe30df1,0xffd978f6),LL(0xfa604f59,0x8e6925df),L_(0x00000032),
+ LL(0x4c96e5ee,0x24f8517a),LL(0x039e54c1,0x2549eb0e),LL(0x1ec83d52,0xeb02627a),LL(0x18a8ead8,0x95771e96),LL(0x497c2cef,0xd4f3a6b4),LL(0x1c4917c7,0x080b55a4),LL(0xe8babd80,0x90585b7b),LL(0x6c548c79,0xdabe54a0),L_(0x00000064), LL(0x978d3828,0x2b269bac),LL(0xdf9b98b0,0xc4ed8c6b),LL(0x0247e075,0xd8e1a299),LL(0xbc830716,0x019c94ed),LL(0x3458f33a,0x9c1665fb),LL(0xcd4d82fa,0xff63e700),LL(0x2326e507,0x41c9bbfa),LL(0x5b452b83,0xc9214a3f),L_(0x000000df),
+ LL(0x23971495,0x3a39f3de),LL(0x6207af25,0x48efebf2),LL(0xe105123f,0xc14c4d56),LL(0xe2f0d038,0xe91d26ba),LL(0x4b6de581,0x4ec88307),LL(0x8f223417,0x0cd6e3f2),LL(0x6ecd94a5,0x986d1a76),LL(0x75765814,0x6e247362),L_(0x000000a2), LL(0xb07a61db,0x8b83a718),LL(0x6e918a1b,0xc07b54ba),LL(0x67b07959,0x22adb8dc),LL(0x96a7a38b,0x2810db83),LL(0xd80ec3cd,0x512687fb),LL(0x3b7485fc,0x6a994329),LL(0x746aec5a,0xd193ecb8),LL(0x6e8d782e,0x72720264),L_(0x000001e3),
+ LL(0xd528a6e2,0x18efe68e),LL(0x7f9ec076,0xd1c7c3de),LL(0x2cb36021,0x39cd1c50),LL(0x4584b14d,0x997b5332),LL(0x4275cf71,0x8ac5db4a),LL(0x47f829e4,0x0bc80acc),LL(0x41dd84b4,0x93021863),LL(0x498e9e29,0x6c2be4f1),L_(0x000000f7), LL(0x3b0142c7,0xa59f6acf),LL(0x50030fe6,0xbe6f68fb),LL(0x21480f26,0x217fd94a),LL(0x7a75421a,0xfc5b6dc5),LL(0x7f8cd384,0x19e9f3af),LL(0x674a2419,0xd009b54a),LL(0x454fa1ef,0x6bd82b7f),LL(0xf5bea7db,0x31688d56),L_(0x000000fb),
+ LL(0x5eccd42c,0x24d7621f),LL(0x92168834,0x1fc413da),LL(0x47855bbd,0x13a9e461),LL(0x17199daf,0x4e3536bc),LL(0x42c2a13c,0x2b4a64a6),LL(0xa8670cf2,0x38d86ada),LL(0x6c221d69,0x68ee0d8d),LL(0x91def21c,0xa5126dec),L_(0x000001f3), LL(0x87485e27,0x03f14fd3),LL(0x378bafe9,0xef0ab60c),LL(0x11be6eda,0xe18440ad),LL(0x59ce941a,0xead8d861),LL(0x59cf0928,0xd51985bf),LL(0x608dbb83,0x54f87d88),LL(0xb568f14f,0x15b84493),LL(0xb574903f,0xbc432c12),L_(0x0000006d),
+ LL(0xe7e4f826,0x79d38b74),LL(0x7eaa6aae,0xf84e0117),LL(0xdb942db5,0x77a0b212),LL(0xd22fb9bf,0xc56ffa35),LL(0x3c3e0310,0xdf48ef3e),LL(0x9f901558,0x372e6e7b),LL(0xa69d9dbe,0x0da5fd74),LL(0xeaa231af,0x1a06775c),L_(0x000001b6), LL(0x0771a3ac,0xd09d3577),LL(0x7802613d,0x61b4d69e),LL(0x19ba2ee8,0xa78fefe1),LL(0x46a7d09b,0x7be0e7b7),LL(0xedbd7a6a,0xed289bee),LL(0x894b4148,0x613e6a64),LL(0x4ced52a0,0xf2a487de),LL(0x58c856b6,0x802d7250),L_(0x00000032),
+ LL(0xffe70196,0xd1a6df86),LL(0x365ca885,0xca64af53),LL(0xfb62f8cc,0xbd654db8),LL(0x7be4b7f7,0x029300b0),LL(0x8e5d1bd5,0xc892e13f),LL(0x2c67f87f,0xcc4777a4),LL(0x8b3a46c0,0xba6516c2),LL(0x7400b2a4,0x6cbe8178),L_(0x0000003d), LL(0x43d5f5dd,0x24153eca),LL(0x540f05b7,0x19221aa5),LL(0x97f95061,0x09e289a2),LL(0xbba5984c,0xf2867a5f),LL(0xa0f6739b,0x0f075e42),LL(0xa0718647,0xab768457),LL(0xa0b31eb8,0xae89b1c6),LL(0xf7e66ea8,0x127d85c9),L_(0x000000df),
+ LL(0x49e4dae9,0x6d5a6301),LL(0x8cd94792,0x3dd861e6),LL(0x97b8baf4,0xfe513cef),LL(0x04f520d2,0x71773dad),LL(0x05832bb5,0xe9f256e1),LL(0x644c2754,0x40df1966),LL(0x700981f0,0x9215b453),LL(0x5dacb6f1,0xc1eb3c97),L_(0x000001dd), LL(0xd29b37a5,0xbd504fe7),LL(0x365fddbf,0x8fd2242a),LL(0xc2c35f7a,0x4bda285f),LL(0xc1adbae0,0xe964cfd7),LL(0x9f4dbf4e,0x29f5bb5b),LL(0xebe1db2e,0xaab3521e),LL(0xeb26c679,0x17b1e0d2),LL(0x460499ac,0x5a9383dc),L_(0x0000000a),
+ LL(0xbe71a28d,0x13ec332c),LL(0xb2a67fff,0xb50e03f5),LL(0x50971210,0xfca3bc03),LL(0xa67e12aa,0x4ad52b09),LL(0xbb90dbda,0xff71aa12),LL(0x0edb116e,0x6d43afd2),LL(0x0827d59a,0x97de7056),LL(0x29d216bb,0x7a131b7f),L_(0x00000160), LL(0x6cd8ac84,0xb922ac22),LL(0xfa7cdb03,0xf832d6ed),LL(0x58c5a459,0xd373c013),LL(0x7af850a7,0xec4706eb),LL(0x2c0a7082,0x67642828),LL(0x10a909d7,0xae5e13c9),LL(0xab317113,0x5697d646),LL(0x62e5e289,0x83fffcd8),L_(0x00000122),
+ LL(0xf34910df,0x331109fa),LL(0x16fb0987,0x7dc5b06e),LL(0xf23db224,0x62c76a0d),LL(0x3f2f53ef,0xf6843163),LL(0x41397218,0x63cbe6a9),LL(0x6d05ffc2,0xb14a253b),LL(0x7ed103a8,0x8ee0b454),LL(0xf389d693,0x3310d7c6),L_(0x0000014f), LL(0xe61f0fe2,0xe3ae5ea5),LL(0xeba63d9e,0x281cc803),LL(0xff5d7d44,0x5a289454),LL(0xfa26da52,0x8b5bf3e7),LL(0x8b9a0868,0xf6c91ab8),LL(0x565a2877,0x10a39907),LL(0x737c0212,0x1223d6a1),LL(0xe131db55,0x19f277aa),L_(0x00000014),
+},
+/* digit=6 base_pwr=2^30 */
+{
+ LL(0x77485e2c,0x205e28d0),LL(0x97a1a0b2,0x662c120e),LL(0x6679b5d8,0xd256806d),LL(0x56f0da8b,0x5177882d),LL(0xb3a0c292,0x1fd447d9),LL(0x15eb4fc8,0xd44b077e),LL(0xf15d98b7,0x44ac5bb0),LL(0x2721ac99,0x38b1a539),L_(0x00000164), LL(0xb3161c22,0x2615ec8d),LL(0x7c193099,0x6014ef39),LL(0xde0771a4,0x7929bb3e),LL(0x2d975e02,0xcd3fad00),LL(0xd387bd9d,0x38c634c3),LL(0x4ebf2479,0x08079c3f),LL(0x2c2da2b5,0xe2b2209a),LL(0xd2e85151,0xbb80ad2e),L_(0x000001f4),
+ LL(0x3d0b9c70,0x8f90c95c),LL(0xb8f686b4,0x17d91844),LL(0xa7467794,0xb498e1e2),LL(0x354bd2f6,0xdf2e61e9),LL(0xaea1ed2a,0xb0db08d1),LL(0xf347f08d,0x02cba497),LL(0x78713784,0x5de0850c),LL(0x51753c73,0xed5b7079),L_(0x000001f9), LL(0x5f819b71,0xd4d045e4),LL(0x91e83186,0xd4180245),LL(0x2f07b1ad,0x059bab68),LL(0x1d467074,0x2b0f371c),LL(0xb0e391ea,0x80e5f219),LL(0xf22e68c2,0xb058f844),LL(0x79b7f960,0x6ca98996),LL(0xd1250203,0x1f63acdb),L_(0x0000008a),
+ LL(0x8ce35c47,0x6f5a9e54),LL(0xbda97f65,0xaf7af291),LL(0x3726d93c,0x49f05287),LL(0x2f95260a,0x41ba40c2),LL(0x77d547dd,0x957f51b5),LL(0x05f74755,0x8ef3d171),LL(0xabb35056,0x131fa675),LL(0x73e0ad7e,0xf2cdf14a),L_(0x0000000e), LL(0x411ad210,0xe74e4c04),LL(0x5dd32692,0x56454c03),LL(0xbec75c70,0xcf373902),LL(0xf969fbf4,0xcc237598),LL(0xc6be1f8c,0x25a52045),LL(0x1317acb0,0xbd2ef98d),LL(0x4c09bec9,0x87e896e1),LL(0xa4033c40,0x16b064d0),L_(0x000000c5),
+ LL(0x9acb75bc,0x2223b656),LL(0xf580463d,0x7a55f8bf),LL(0xbd3d896f,0x19d6f3c8),LL(0xdc1bc358,0xf8dfdd32),LL(0xa2786cfc,0x57477a57),LL(0xae5589b6,0x9f47a3b0),LL(0x06de5eae,0x93f21788),LL(0x2c782fcd,0xd9479ee3),L_(0x0000016d), LL(0xbeebc5d3,0x0929435c),LL(0x52a35de2,0x5b11dd83),LL(0x4ce809af,0x080ab8c3),LL(0xe25a76cf,0x50478b1c),LL(0x216bfb22,0x103b3ff7),LL(0xd87f4762,0x99b34133),LL(0x41327480,0x95f627aa),LL(0xa729b689,0x62b3cf30),L_(0x000000fb),
+ LL(0x2f95c649,0x721c2b47),LL(0x251bc403,0xb04b42b0),LL(0x43b1fedb,0x73ae072d),LL(0xe91e26a3,0x0d23d9bf),LL(0xbe237693,0x40c88f4f),LL(0x3424beb1,0x6a55a156),LL(0xa0854744,0x26b2b7ac),LL(0xd61d14b6,0x4ee7f1ff),L_(0x0000000f), LL(0x0da4f895,0xa08faeb0),LL(0x9b46600b,0xfac400c9),LL(0x541f8756,0xfa469aa7),LL(0x961867a9,0x9f699a76),LL(0xaf3ea90e,0x6fa24828),LL(0x87c1ec18,0xb4eae9ea),LL(0x13538c6c,0xd16f2fd6),LL(0x3f2706c2,0x1ba2b83f),L_(0x00000147),
+ LL(0x792b76d7,0xbdd4d4a0),LL(0x305ae6fd,0x1d7bb497),LL(0xfd52a449,0x143fec43),LL(0xf6e16ac4,0xebf21b11),LL(0x8a70f179,0xdc6c0238),LL(0xb6be355d,0xd156ead0),LL(0x45178899,0x91cfd7f1),LL(0xdeb4b443,0x63af6554),L_(0x0000001a), LL(0x3a841a01,0xc755678e),LL(0x78e21693,0x747e0d46),LL(0x04110693,0x8c5bb7f8),LL(0x878fdb74,0xb933a4bb),LL(0x90576198,0x4a53f37a),LL(0xb6123d17,0x9e11e3a2),LL(0x6fc61c48,0xf4f2778d),LL(0x0bd5422a,0x78936064),L_(0x0000002a),
+ LL(0x889e1c3e,0x1cdfc255),LL(0x0e89d4d5,0x620f831a),LL(0x353a0af0,0xb276e069),LL(0x687747f6,0x848dd0c6),LL(0xf27dfd62,0x0bb6c7d1),LL(0x05846ed2,0x561ca5d7),LL(0x17ec1af8,0x39a2756b),LL(0x4280d8ec,0xf4bc9db5),L_(0x0000002c), LL(0xe51a0c90,0x827b9727),LL(0x96e34ce9,0x3fe216b6),LL(0x79c77aa0,0x6720f347),LL(0xfad412f9,0x695ff127),LL(0x74dee9fa,0x5f1b0845),LL(0xe65f23d5,0xbfbfe9e6),LL(0x3e545ad7,0xe1c9f0ed),LL(0x92d8678d,0x9914fd4c),L_(0x00000088),
+ LL(0x3d108b40,0x479267d4),LL(0x0396f4d9,0x88692b5b),LL(0xb1e5f7f0,0xfd9437e3),LL(0x9509c3c1,0xb9b9b7fa),LL(0x15a75e6c,0xba37b6c1),LL(0x5b42f650,0xdbbc62d0),LL(0x5b3cf510,0x6d5fe62d),LL(0xc6a49bf0,0x824e6593),L_(0x00000049), LL(0x6b1fb538,0xcc7f70f3),LL(0xeb94fc53,0x6a2b34a3),LL(0x82c0e60f,0xea4bc9d4),LL(0x8f42888a,0x7ab9ed31),LL(0xc0fe3ed3,0x1a505ae0),LL(0xe94fad3b,0x545382c9),LL(0xfa0f3128,0x9ae4fb8e),LL(0x44bd4be6,0xa516fe88),L_(0x00000003),
+ LL(0xb0f06a74,0x5455aac0),LL(0x2a8889b3,0xc9b0d66d),LL(0x1c5bf83e,0x736f64af),LL(0xeb5d7b9e,0xb0411171),LL(0xfd19cd82,0x22d46926),LL(0xdc65529f,0x1a902efa),LL(0x2603fa26,0xa829e75c),LL(0x4e40cf1f,0x25ea27fc),L_(0x0000007d), LL(0x5762e183,0x4b68fce9),LL(0xe6bccc3f,0x83ed8b75),LL(0x047d0099,0x864c3567),LL(0x85060d1b,0x1ddc1dd9),LL(0x3ee4ae76,0x974e9669),LL(0x389206d2,0x6126092a),LL(0x91ac46ae,0xe4c7cd87),LL(0x450710f2,0x9e581f06),L_(0x00000040),
+ LL(0xa9671b83,0x291b3bd9),LL(0x42264245,0x08f40ce6),LL(0x9254ae8e,0x244beb5d),LL(0x6f14d800,0x0b345a89),LL(0xe0141c82,0xb5b0de4a),LL(0xf52d10c3,0x2ca8fb1f),LL(0xebf183aa,0xdb884d75),LL(0x8611998a,0xd2bb9afb),L_(0x0000019a), LL(0xf19b2de4,0xa6d267bb),LL(0xe6bc257b,0xf0568557),LL(0x2160d875,0x6b9e2dd7),LL(0xb1fad31a,0x9c709714),LL(0xed3d24a8,0xf7d05de5),LL(0x61431dc5,0xdc526178),LL(0x0501b15f,0xe40e89ee),LL(0xb2aa5088,0xf3025f1d),L_(0x000001f8),
+ LL(0x7bfa3bb6,0x859759f0),LL(0xb249eb45,0xff4d25bf),LL(0xb8020268,0xd9737355),LL(0x9d4a831f,0x84343cef),LL(0xba7e139e,0x5bb5557e),LL(0xb24bfdbf,0x3ab8fb19),LL(0x31a1b161,0x3fa57146),LL(0x4ec60d24,0x01fac245),L_(0x00000125), LL(0x4ddf36d2,0x3e8c0bac),LL(0x5b116d34,0x0f307133),LL(0x62db28ba,0x9a0533b5),LL(0x0939b6eb,0xacf1cf00),LL(0x89d1c401,0x693e7c92),LL(0x4b14c89d,0x0945b630),LL(0x4ed7b53a,0x4b162dc1),LL(0x79a7fa4b,0x3e6b7dc4),L_(0x000001c0),
+ LL(0x591d8c23,0xb35e8088),LL(0x24bb4a7a,0x9e47ec6e),LL(0x968fd370,0xe7d95582),LL(0x474d55e3,0x783f2538),LL(0x9d35c0f8,0x83b454e1),LL(0x4578fbe5,0x114b724c),LL(0x98f51326,0x97ee546b),LL(0xf190d99b,0x801229b8),L_(0x00000091), LL(0xaa86765c,0x7ee4a0a2),LL(0x8b19b4b6,0xd4f5faa0),LL(0xc220cb11,0x6ad0862b),LL(0xce1c7d42,0xd7a63508),LL(0x3236a72d,0xeaae4777),LL(0x36cda4ac,0xbe3fcce9),LL(0x808ba7a0,0x972c3840),LL(0x79c14a5b,0xcda4655c),L_(0x00000087),
+ LL(0x4283d37a,0xf72e10a1),LL(0x23f718f8,0x07515abf),LL(0x820e2eb6,0xc81af50b),LL(0xea92c2b4,0x06af11fd),LL(0x71048468,0x755ab069),LL(0x6ada8b6e,0x5f2e0402),LL(0xe7b549c5,0xa45c27e8),LL(0x13b56922,0x1760f8ae),L_(0x00000001), LL(0xc7aa6c54,0xacb0965f),LL(0xc6437d60,0x30e79f87),LL(0x93a0e68a,0xcb0f4dcf),LL(0x3613f9b0,0x02e2383c),LL(0x32355c62,0x3ec75821),LL(0x4a835dde,0x4891bfda),LL(0xa38a3a87,0xd0206185),LL(0x9de0b9b9,0xa9cedb8c),L_(0x000001f4),
+ LL(0x2fe65202,0x8b5ddb45),LL(0xdc46fb16,0x8166a790),LL(0x41a5e4a7,0xc854c900),LL(0x342b51ba,0xeb4a908e),LL(0x116e0741,0xb76499d7),LL(0xc1551311,0x6cc7399a),LL(0xccaf37b4,0xf2094cc8),LL(0x9c29f265,0xc4a1fb65),L_(0x000000c7), LL(0x0d15a232,0xa4cf272a),LL(0xcfc8b9dd,0x9fd1f1c4),LL(0xb8e8cb4f,0x8ddfade3),LL(0xfd72dadc,0xf084903f),LL(0x764ba410,0x9094e8a7),LL(0xf43466f6,0xb9869fee),LL(0x1564c4ac,0x82a6cc83),LL(0x7742c943,0x89c1b557),L_(0x0000016c),
+ LL(0x6d728fc3,0x7e25b95d),LL(0x08c1d55c,0x50011066),LL(0x2de90a9b,0x63db375d),LL(0x46d6ba3b,0x2d3fa9bd),LL(0x9ae8aa53,0x9fb12874),LL(0xabf67a35,0xd1f1f45f),LL(0x05d8099d,0xdc479fc0),LL(0xdf2cdfde,0x779d8b52),L_(0x000001a9), LL(0x9e4fbdda,0x8f62ac2a),LL(0x4ab94029,0x56a0908f),LL(0xbb03c1b4,0x9ce0943b),LL(0x6319d2ed,0xe2d743f7),LL(0x910c2363,0x871683b7),LL(0x78ddf2fb,0x43f08ff4),LL(0xb7c5e230,0x2ebe58e7),LL(0x1c175b19,0xc02e1520),L_(0x00000185),
+ LL(0x39096d41,0xec7786aa),LL(0x70017bcc,0x26576a40),LL(0x926b1ae0,0x5e810d17),LL(0x6c002685,0xdef24d30),LL(0xd826c439,0x78ac55c7),LL(0xe40f66cc,0xfbf9b521),LL(0xe26697c9,0x01aaaf8a),LL(0x46a75caf,0xd094aec3),L_(0x000000a9), LL(0xc1b67b75,0x99a161f4),LL(0xcc3c7e5f,0x88977e72),LL(0xfefa749b,0xd6e24cf4),LL(0x56863737,0x4607a910),LL(0x4dcfe4ed,0x01768685),LL(0xac7bc09c,0x9ec211ac),LL(0xc731394d,0xac76909c),LL(0xd59e4dd8,0x246fb612),L_(0x000001c7),
+},
+/* digit=7 base_pwr=2^35 */
+{
+ LL(0x31c9da36,0x5592f380),LL(0x0dd54d04,0x44d05f6f),LL(0x298fe241,0xe2d191b2),LL(0xad46274a,0x9113fc1e),LL(0xcc54c590,0x0dea702c),LL(0x763ea8c1,0x74f208c5),LL(0x35441e72,0x578c5736),LL(0x3706b2f2,0x81343695),L_(0x0000003b), LL(0xa85cfcd7,0x88ada464),LL(0x4c2605a5,0xd5464606),LL(0x004bbf31,0xca04e18d),LL(0x03210805,0x998cccf9),LL(0x89627867,0x48398a6f),LL(0x8d2faed1,0xca85dacf),LL(0xde01ea7e,0x92784742),LL(0x0feb7d82,0x9fe5859b),L_(0x000000b8),
+ LL(0x5f01aa9d,0x05a73aaf),LL(0xe5e08d95,0x18e919ab),LL(0x9fd8bcd3,0x5b386f06),LL(0xd6891589,0x0b5abd07),LL(0x07bc244a,0x339901b0),LL(0xc3693691,0x684cff05),LL(0x179dcef7,0xe69b7993),LL(0xb0125196,0x23db7308),L_(0x00000028), LL(0x6d0d0635,0xf88e8361),LL(0x0c66e267,0x2f9f93bf),LL(0x6d375b82,0x09656c0d),LL(0x6d5dc021,0x0c1fc16b),LL(0xba81db53,0x86bf6541),LL(0xb4caf94b,0x1a6d443c),LL(0x87f59d3c,0x0e10fe1a),LL(0xb72afcd6,0x8d7e1995),L_(0x00000008),
+ LL(0xcb74d13d,0x3c2640b0),LL(0xef7a7df4,0xf6850378),LL(0x2a55c175,0xed04fb24),LL(0x8b6f667a,0xa7e743ff),LL(0x93061f72,0xdf46d114),LL(0xdaa59d80,0x9d4ed766),LL(0x49c1e1f8,0x4b991a82),LL(0x2fe74922,0x2e41804d),L_(0x00000122), LL(0xa863fded,0xf37b7a2c),LL(0x140444d6,0x8f14ff32),LL(0xf54bdbb6,0x34a9f316),LL(0xde42c24e,0x9515de8e),LL(0x96a88eec,0xf1959aa3),LL(0xdcd09006,0x30671815),LL(0x058c4643,0xb6c6d2af),LL(0x65dac0ec,0xd1a5f578),L_(0x000001f4),
+ LL(0x50517e7c,0x0a5b8daa),LL(0xd4667616,0x8dcdbdbe),LL(0x16e7a7e7,0x1b0f5e9c),LL(0x9178e1fc,0x3cb9503e),LL(0xf2294c93,0xe6f78b36),LL(0x420442aa,0xfb2d6ec3),LL(0x01e17c7f,0x7d30fddc),LL(0x9c7293b8,0x36bed473),L_(0x00000128), LL(0x2ebfd049,0x4975943e),LL(0x84cf37b8,0xab2857b7),LL(0x645eaa02,0xe12a0d65),LL(0x3d30b0ac,0x267c93aa),LL(0x30be3eff,0x6fa69542),LL(0x903aa7ed,0x2cdb01e1),LL(0x311ae0c8,0xc5056d4c),LL(0x275f0bd3,0x94d54a98),L_(0x00000020),
+ LL(0x8cee0a0b,0x8c942dd7),LL(0x62d7fcf1,0xc893077d),LL(0x643ea78e,0xda471b28),LL(0x4e9d9fdb,0xfb673df7),LL(0xe64cf76a,0x51536a0a),LL(0xfccba343,0x5fc020fd),LL(0x279bce99,0xdee7d155),LL(0xb7f5fd72,0x68c90549),L_(0x0000012d), LL(0xd5aaeab9,0x4ecec5bb),LL(0xe6b0baf4,0x6a4bc82c),LL(0x18f9ed0f,0x93eb1856),LL(0xdc69912e,0x6f327c7d),LL(0x2be0e2b3,0x52fbc6f3),LL(0xe7e8bfdb,0x24b3acf0),LL(0xd81de1d4,0x62a84326),LL(0xe49b2810,0xc3912b42),L_(0x00000136),
+ LL(0xa4f2bbd9,0x551c0660),LL(0x2fe061f4,0x91d40c3d),LL(0xa2b6dd70,0x7cc4883d),LL(0xbd2bf743,0x58011dda),LL(0xaee852f2,0x71bdaba7),LL(0x39f463ce,0xbd7c195b),LL(0xfb33b881,0xede085fe),LL(0xbf7d695a,0xf8fa2471),L_(0x00000180), LL(0x83554b40,0xc96eeab9),LL(0x8a6f5a6d,0x07f71f13),LL(0xb29f154f,0x242d7a9e),LL(0xb707d1c7,0xf3c7f1af),LL(0x44aee842,0x0af2896b),LL(0x01f56999,0xc5c5b556),LL(0x1e36ed07,0xcca26786),LL(0x245430fa,0xa78eb214),L_(0x0000016e),
+ LL(0xa3dd17dc,0x0f4d9fba),LL(0xa4eddc14,0x9ebcb886),LL(0x420f1510,0x3c114b65),LL(0x4e6c23f6,0xba3fc70d),LL(0x5f6bd766,0x718ac792),LL(0x532bdc38,0x5c2b8f46),LL(0x03efcc7f,0x72c3a472),LL(0x5c2b9a45,0x9dc110c9),L_(0x000001f4), LL(0x58ea447d,0x1a6af2f7),LL(0xb5c3ea1c,0x8052b6c2),LL(0xab27ec8a,0xa3cff07f),LL(0x4c92575d,0x00fa9778),LL(0x4b43265d,0xff1e188a),LL(0x6c53a129,0xedc9e95e),LL(0xfcb7ddb8,0xfb7de911),LL(0xc1dd8dd6,0x6e53bbb5),L_(0x00000072),
+ LL(0xe68e2079,0x7daeaaab),LL(0x6eaee317,0x6e35398b),LL(0xf5c1267a,0xd01bbbbb),LL(0xa2b92ae2,0x3af1a4f4),LL(0x5cdfa4bf,0x5532088e),LL(0x638a58f5,0x2a0ec8ee),LL(0xbce5e7aa,0x79c3f50b),LL(0x46a16448,0x378387c2),L_(0x0000005e), LL(0x84e88e18,0x6769ee88),LL(0x8ec2984b,0x62fea90f),LL(0x1f9e47bd,0xe7522665),LL(0x3d9f9867,0x916cb049),LL(0x5be2cccb,0x1106987f),LL(0x71156e1c,0x7bad869c),LL(0x011576bd,0x945007a5),LL(0x38b76a6e,0xc18de41f),L_(0x000000ae),
+ LL(0xa84cca21,0x6ee5a7d6),LL(0x2831843a,0x58bef9ba),LL(0xe4f07223,0xd00147a3),LL(0xe1c40e6b,0xd10e53e0),LL(0xe7025e87,0x5d5f797a),LL(0xf0dd838b,0xe3b65b5f),LL(0x16931c80,0xd1ff0eb8),LL(0x42704c55,0xffc29bf2),L_(0x000000d4), LL(0xe3300a5d,0x279cdc4f),LL(0xed03963d,0x51c15682),LL(0x4a0c613e,0xc3d504ac),LL(0x6ef1db42,0xba61ce4e),LL(0xf8742eaf,0x2e74a6d4),LL(0x3efa3cf5,0xd53943f5),LL(0x201c12e1,0x253da54a),LL(0xa468664c,0xa35c5fd4),L_(0x00000012),
+ LL(0x9c6f67ac,0x687c5994),LL(0x7a229d23,0x8aa53c89),LL(0x118e3e78,0x080e973b),LL(0x15c794e3,0x5a91046f),LL(0x30c0f281,0x5ac04ed5),LL(0xfe35eb92,0x0c5478a4),LL(0xfe18e707,0x7d9c57a1),LL(0x4bf409ce,0xfcd17edd),L_(0x000000aa), LL(0x8174557a,0x3d2850fe),LL(0x23469475,0x2c45c37e),LL(0xc528ec7d,0xf346792a),LL(0xa36bdd41,0xca964be2),LL(0x11d67932,0x3fef3e79),LL(0xc72673a0,0xf0bc0101),LL(0x53d6358e,0xb9caaba6),LL(0x2bf874e2,0xbbcc3188),L_(0x0000005e),
+ LL(0x5993ad4f,0xf22d90c1),LL(0x24df4deb,0x449aa491),LL(0x37a9290e,0xd1657f10),LL(0xc6bbdf04,0x4ba3ee4b),LL(0x4075fc0e,0xe3e07500),LL(0xf134a6c8,0x7661f086),LL(0x2b3b9213,0xfd4c08de),LL(0x6f51f169,0xcae8fa7f),L_(0x00000104), LL(0xb2f528e4,0x9303da25),LL(0x1e8df3c5,0x6a92d1ac),LL(0xb326f2a6,0xafc6ed8c),LL(0x46ef258d,0xe7d3b364),LL(0x53fe6ba5,0x7b2d91d1),LL(0x669d23c2,0x150f6968),LL(0xc05b6015,0x230a0105),LL(0x376b2356,0x3df6108a),L_(0x00000172),
+ LL(0x05384e00,0x5490baa5),LL(0x148d7d84,0xae379993),LL(0xd948464c,0xac4f8ace),LL(0xddaf46fe,0x68d1b7c8),LL(0x6c39b672,0x10d4770e),LL(0x5967ac57,0x30a2c195),LL(0x2098b748,0x19047735),LL(0x858d17fe,0xe5071ced),L_(0x00000191), LL(0xb56551f3,0x44b4f003),LL(0x2a7e4193,0x767f8087),LL(0x1262c90a,0x91770fa4),LL(0x25315a97,0x4bc5606e),LL(0x696dd31a,0x6a665041),LL(0x7ec13746,0xbd01da6d),LL(0xac07c562,0x59de1e2c),LL(0x4bc4a92e,0x8f7d2999),L_(0x00000106),
+ LL(0x5f2d1510,0x37e7ccad),LL(0x0f93acce,0x909c5616),LL(0x3802c7e4,0x50e428ab),LL(0x3b424aa7,0xdee4af73),LL(0xc7e0291d,0x5bbec3a0),LL(0x3889c563,0x7854dc66),LL(0xe5ea7c0c,0x7701185f),LL(0x9cdf7704,0x0b88a64a),L_(0x000001ad), LL(0x6c0c71ab,0xe5481dba),LL(0xc168583c,0xbb4cbf39),LL(0xec84a971,0x16e6876e),LL(0xdde2891b,0x4940610a),LL(0x9e03560a,0x5406bed1),LL(0x992e1390,0x475b7757),LL(0xc2108310,0x7cc85b3f),LL(0xffbf072b,0x82170451),L_(0x000001eb),
+ LL(0xb05a9bf6,0x9d172698),LL(0x0dde3c4b,0xb8a86057),LL(0x4dad7e2a,0x376d08bb),LL(0x709cc4fe,0x2d396e50),LL(0xb38f91df,0x78138716),LL(0x6a45d957,0x7a064e9a),LL(0xeda47781,0xf79bf83f),LL(0x037062a4,0x2aff8e01),L_(0x000000a1), LL(0xbd0ea3b4,0x49748577),LL(0xa23c2d1e,0xdb9b468c),LL(0x79fc968b,0x9d5d5807),LL(0xb4f35908,0xae7478af),LL(0x7ffb5a37,0x6f6ac1a1),LL(0x0ad6d095,0x35d076fb),LL(0xcc73da49,0x4e896c83),LL(0xf0b38ddd,0xcd942654),L_(0x0000011f),
+ LL(0xcfb2b4bb,0xf362300f),LL(0x940a7fee,0x0c8996fe),LL(0xff7970e2,0x434f05d2),LL(0x3ed8edff,0xc3ed10ba),LL(0x5ebc5312,0xdee87d6d),LL(0xa445169b,0x12a8674e),LL(0xc4cceb87,0xd8da7725),LL(0x51c6dc7d,0xea8956f4),L_(0x000001af), LL(0x82d880a3,0x7d3585a5),LL(0xa5517351,0x13fe8bb4),LL(0x74f18cb5,0xe68912ee),LL(0x7950c8df,0x1512d84f),LL(0x2fbcbaca,0x7df13019),LL(0x0de4c1a1,0xe29f312a),LL(0xabb943b7,0x656e2b95),LL(0x7ae2e506,0xfc56ddff),L_(0x000000ab),
+ LL(0x8e947b1a,0xccd06bf8),LL(0xa717a0ac,0x6ceb8a0c),LL(0xb428946c,0x2bd2594e),LL(0x5c199265,0x80688236),LL(0x3a824141,0x74f2f352),LL(0xb634a60c,0x83ce2e27),LL(0xf4680f2b,0x33426806),LL(0x485e159f,0x18c76ca1),L_(0x00000137), LL(0xe0c9dd7b,0x1f63dec4),LL(0xd74bb74e,0x6f95ccb7),LL(0x4a5f0944,0xc75d0662),LL(0xd36f4555,0xd6e7583f),LL(0x23cc2b28,0x783fa303),LL(0x2c0c49bb,0x4f771001),LL(0x907cd3d6,0xac90f899),LL(0xe2c79e69,0x2cb352bd),L_(0x000000c1),
+},
+/* digit=8 base_pwr=2^40 */
+{
+ LL(0xe05ab80b,0x93bc2a7f),LL(0x46f49f7a,0xcc0b41a2),LL(0x91072db7,0xd30ac7ec),LL(0x53711f97,0x9de685e7),LL(0xef0acc16,0xb8a2ae9a),LL(0x6bded4c6,0x4497e3c4),LL(0x04789cdc,0xb2b2ea26),LL(0xfea082fe,0xe890cba4),L_(0x0000018f), LL(0x50768242,0x66edbc5c),LL(0xa472aca4,0x5ad15298),LL(0xa8066050,0x1b16ca97),LL(0x38b0c1cc,0xa2937bbf),LL(0x4d56c3dd,0x72545fac),LL(0x7e35494b,0x4b5790f0),LL(0x903e9ca7,0xb0c8bc40),LL(0xc4b43111,0x5923f9e9),L_(0x00000146),
+ LL(0xb73ff4e5,0xc18b52bf),LL(0x6410d489,0x28530a4d),LL(0xae318bb5,0x3f7d7028),LL(0xb534b71f,0x0b21b686),LL(0x1f599597,0xf01ea275),LL(0x663379dd,0x800a1322),LL(0x77c11915,0x6db4beae),LL(0xe3261c47,0xe89c22a1),L_(0x000000e8), LL(0xa7b1dfa3,0xfce16965),LL(0xd6426762,0x2e53d9af),LL(0x532ec13f,0x1e801ed5),LL(0xe9efe413,0x6963e2f9),LL(0x8aecc3c8,0x5f46e509),LL(0xb47801a3,0xc3d8faa2),LL(0x3b6f3406,0x349f37b4),LL(0xadb57971,0x49ef39f4),L_(0x000001d7),
+ LL(0x126ca585,0xf9dcaceb),LL(0x5a73dec3,0xd887946c),LL(0x0e0ffb30,0xe7e62831),LL(0x84126935,0xe074c83b),LL(0x158a7df5,0x18b04291),LL(0x08eaada2,0xfa20f72a),LL(0x40d05438,0x9aa8c4aa),LL(0x8405e6ac,0xb7559284),L_(0x00000192), LL(0x74e90dac,0x7981326c),LL(0xf1a037a8,0x13ab2cdb),LL(0x9887e290,0x98bd3d86),LL(0xfecffd65,0x3c803a95),LL(0x2fd8393b,0x3e4c5072),LL(0x129b699c,0x5e3c4e70),LL(0xfa72cdd6,0x65f24da0),LL(0x6c0ccbba,0x5325682f),L_(0x00000097),
+ LL(0xd21b98be,0x728d8231),LL(0xeede07ff,0x52ba3f46),LL(0xc57dc8bc,0xbbd28782),LL(0x49d96a93,0x9e0a7a0e),LL(0x49576560,0xe9fbe4aa),LL(0x79dbfb8a,0xcccb4c5f),LL(0xe1789960,0xd25ebfd5),LL(0x09b74da3,0x56df642b),L_(0x0000002e), LL(0xbe83a30e,0xd17057a2),LL(0xa759ce4d,0xab9d226b),LL(0x57744ef0,0xb7115a63),LL(0xdddc9ee2,0xd77f24c2),LL(0xdfee8900,0x2142ea1a),LL(0xa9d5346a,0x6d500f3f),LL(0xa84ecd7e,0x7a1527e7),LL(0xae35caeb,0x10e6262d),L_(0x00000081),
+ LL(0xaea7c3e5,0xcd457989),LL(0xbd6196a6,0xdd85ca16),LL(0x6f76c2cb,0xcfd847e9),LL(0xaa25840d,0x8ea001b3),LL(0x444e27ec,0xa898be24),LL(0x8a0c53dd,0xb3e4397d),LL(0xfa5f98a5,0x64ea9863),LL(0xbe8e1973,0x922c6bbf),L_(0x000001bd), LL(0x5084e379,0x0664b7db),LL(0x54735a19,0x990568c9),LL(0x7371d65a,0x52b4c902),LL(0x600bdaf0,0xc2cc9668),LL(0x4697299e,0xbadac668),LL(0xeb4949cf,0x33272f7c),LL(0xeda14ca0,0x3989fbe1),LL(0xd9927092,0x0f1714c9),L_(0x000000a8),
+ LL(0xd2d2e356,0x00da9fad),LL(0x39d9c06e,0x69b9bebe),LL(0x7878b1c2,0x50e16aa4),LL(0xa0545c03,0x04f7fb31),LL(0x5d57a4d6,0xd233dc43),LL(0x629977c5,0x87e54a59),LL(0xaa747e53,0x0cca577c),LL(0x80698068,0x3aa24734),L_(0x0000007f), LL(0xff177c1c,0xf46ecf72),LL(0x87d84398,0x5b5e3ea0),LL(0xf8e3dbad,0xc29bdf29),LL(0xc86793b7,0x8b4ad4a2),LL(0x337e0dd4,0x34cf9d25),LL(0xc858ea72,0xb282be01),LL(0xe90a676b,0x7590c7bf),LL(0x7d306f50,0x155053c4),L_(0x00000115),
+ LL(0xbb970cd1,0xfa311b42),LL(0xa08e6727,0x609fc56f),LL(0x6285b2f7,0x07ce1a3e),LL(0xe94807c3,0xc9c1df6d),LL(0x19a317d8,0xd70b9796),LL(0x052a3379,0x870efdde),LL(0xaa7d20b3,0x8f7406db),LL(0xbb6e443d,0x511beafe),L_(0x00000155), LL(0x0634dd62,0xd62e82c9),LL(0x9d51e499,0x9995a224),LL(0x615ca9d8,0xd99162d9),LL(0xab897ac7,0x51034000),LL(0x24f35e95,0xb70ca9d9),LL(0x853be7df,0xff11b526),LL(0x38dc8c8a,0x463b8a66),LL(0x3331fb01,0xb55e7404),L_(0x000000e7),
+ LL(0xa03485a9,0x508d4f13),LL(0xdd3ccf18,0xf25524c5),LL(0xd8ab1776,0xe0bf0c9e),LL(0x017a54a5,0x1226e24a),LL(0xb9626be8,0xb0e5b1ec),LL(0x8b7b3bc5,0xf24c6acb),LL(0x14da0130,0x46736054),LL(0x7db2f1d9,0x73af8b9c),L_(0x000001ae), LL(0x806025a6,0xb11a4baf),LL(0xf7b99ef6,0x1e9bb68c),LL(0xb7054990,0xa5ca0071),LL(0xe57cc5d4,0x55009f7b),LL(0x501abab5,0x08dbaab6),LL(0x2d17b21b,0xcde35c58),LL(0x9921c7ba,0x9991c48d),LL(0x3f13fb4b,0xc6f664c9),L_(0x00000172),
+ LL(0x63f229e4,0xaf8f0fbd),LL(0x3fffd972,0x513637b7),LL(0xa381ede6,0x3a907a7b),LL(0xef4d7386,0xdec53a87),LL(0xfaf3ac39,0x6072c595),LL(0x7077416d,0x25742340),LL(0x8d4d4598,0x0272fbab),LL(0xc3dce550,0x44d3c246),L_(0x0000013a), LL(0x95e9dda0,0x8a45d7f7),LL(0xf5989e00,0xa25dc323),LL(0x31cb7128,0xd19e79bc),LL(0x87f0b5cb,0xf782a69b),LL(0x62e18e62,0x4a3bc664),LL(0xacc62f0f,0x8a21efa3),LL(0x855aaaab,0x5dc442d8),LL(0x895a7f3a,0x7fccf9f6),L_(0x0000017f),
+ LL(0x6c85234b,0xf6a194a7),LL(0x21638407,0x8d081ace),LL(0xe465a985,0x1e6d4f3f),LL(0x596aa1dd,0x800bb059),LL(0xf63247cf,0x88ecdd17),LL(0xd80d0066,0xd6196a9e),LL(0x359a8606,0x6d1c0b4e),LL(0xf12ac0e0,0x1f003c05),L_(0x000000e8), LL(0xfd00b6d4,0xe591e392),LL(0x88389649,0x09f83a93),LL(0x2b4134e0,0x9d2fd6ac),LL(0x3ada50c0,0xd488e638),LL(0xa2f5e7c7,0x6ae6d5dd),LL(0xece41bdd,0x626ed9b1),LL(0x83fc37eb,0x0ec94ba6),LL(0x390a5c6f,0xd316539d),L_(0x00000034),
+ LL(0x42827af1,0xf8cf81f2),LL(0xdd03c701,0xce67a0a5),LL(0x957637c9,0x4af6b68e),LL(0x49c7193a,0x2b716eb7),LL(0xa9f1106e,0x04a50d86),LL(0x5cdc8e58,0x29fe3e8a),LL(0x404173b6,0x2217e337),LL(0x8d0fe7b4,0x41f85927),L_(0x000000ee), LL(0x6c97abbd,0xf0033298),LL(0x7982223c,0xeed36f1b),LL(0xc078a101,0xc8a52b8f),LL(0x54b52769,0xfd843c12),LL(0x0c71b06d,0xdaa31445),LL(0xd139607d,0x996c457f),LL(0x3373eded,0x0d6abc25),LL(0x616b57db,0x27a4f9a0),L_(0x00000005),
+ LL(0x1be04a5c,0x24d46da3),LL(0xc28ba5d6,0x84ca0be2),LL(0x69aff480,0xb7d623cf),LL(0xeee1ba2a,0xc4a065a8),LL(0xe236787f,0xd893b3f3),LL(0xaa351426,0x2106fcf4),LL(0xc4d98be5,0xf2dfc4d7),LL(0x534e82e2,0x4f43180c),L_(0x000000bf), LL(0x0a626913,0xea92fe7d),LL(0x3cd0971d,0xb9b4d4bf),LL(0x5fa502b8,0x56e42bc0),LL(0x2f95fd57,0x9a55a6ac),LL(0xefd75261,0x9c01cac4),LL(0xc54d4200,0x8b9c411f),LL(0x9a2d86c0,0x84f22245),LL(0x0123f4e9,0x924fe183),L_(0x00000190),
+ LL(0x59d5704e,0x5adfc431),LL(0xed2fd11e,0x1a785308),LL(0xb3ad4ad2,0x534b1813),LL(0x19e08445,0x77328159),LL(0x557af465,0xcd28509e),LL(0x114e6813,0x908aacef),LL(0xdd6f9e0a,0xea30d82c),LL(0x5aec37e4,0x56efd94a),L_(0x00000184), LL(0x9ccb322c,0x9a808c1f),LL(0x8215d192,0x00e65251),LL(0x2e216a64,0x8be89e79),LL(0xa21b58aa,0x1bae586d),LL(0xde6dc431,0x6074af45),LL(0xd9ffe269,0x144f7409),LL(0x7968f9ca,0x4c70bef4),LL(0x057ee0b0,0x464dfc55),L_(0x00000158),
+ LL(0x42555bd7,0xda8f0d55),LL(0xbc3cfc53,0xf7a0b6a9),LL(0xc3851a8d,0xd221e3bc),LL(0x3b6631e9,0x73e218ec),LL(0xd802d5a9,0xbb393674),LL(0x357ad609,0x17e839e5),LL(0x26a2911a,0xfd4ff33d),LL(0xa9163042,0x40c85178),L_(0x00000088), LL(0xd26e52f2,0xebbb0dce),LL(0x628d1685,0xc4b138ed),LL(0xad6058b9,0x1ab4e65c),LL(0xd77f3507,0xa315e387),LL(0x01e25773,0xc1c7fc22),LL(0x5f337f59,0x9dd402d9),LL(0xc4922f4d,0x8947a84e),LL(0x52e76d6f,0x83ef2457),L_(0x0000008b),
+ LL(0xd7a5547f,0x67dd4533),LL(0xed953e34,0x0ffa9336),LL(0x4fc44042,0xb44d3a69),LL(0x0c1288b1,0x7f745c6a),LL(0x0c5f14a6,0x345f8ac2),LL(0x765ee067,0xcfed50e8),LL(0x659b1874,0x5ef0443b),LL(0x26abda6a,0x894afeee),L_(0x00000163), LL(0x6f34576d,0xabe2ed4e),LL(0x46dcead8,0x196272e0),LL(0x64053114,0x13a8b18e),LL(0xbcb0e703,0xf9b6c7a1),LL(0xaecaa246,0xb17e245a),LL(0xd0c5c4d7,0xce6786b6),LL(0x01f4866b,0x12c94128),LL(0xea713e45,0x75975359),L_(0x00000004),
+ LL(0x15f3e5c9,0xb900e09c),LL(0xf45b409f,0x7837bf97),LL(0xff4a0108,0x2bcafcbc),LL(0x6b8d204b,0x0da165ec),LL(0x8423a60a,0xb1171697),LL(0xf8295351,0x3eb1f2f7),LL(0x1f58e2d1,0x2b669228),LL(0xbbed8459,0x5f9819ae),L_(0x0000005f), LL(0xd668278e,0x7b7ea077),LL(0x53ee2ff7,0x5b359b96),LL(0x98e8334b,0x87baabe1),LL(0x85a52104,0x95a5886c),LL(0xc237881a,0x809649f4),LL(0x7f95c6f6,0xd3395612),LL(0xed6c6419,0x657d29fa),LL(0xa5be49aa,0x7ae0b376),L_(0x000001a6),
+},
+/* digit=9 base_pwr=2^45 */
+{
+ LL(0xcbbde736,0x45fb32ba),LL(0x8a721e35,0x5c4674f0),LL(0x584020b4,0x84a774fc),LL(0xadafd3a2,0x477afffe),LL(0x266e1004,0xd6a2c4ec),LL(0x326c6652,0x428066dc),LL(0x0b3a65b9,0x4c7d5c77),LL(0xe355b810,0x4b6af237),L_(0x0000018c), LL(0xca1cffd4,0x1c0b97b7),LL(0xde135822,0xcc7ac435),LL(0x876cab38,0x8f30b09e),LL(0xec654cdc,0xcb3a4f5a),LL(0x26a9da0c,0xb2ac30ca),LL(0x8e2a6fa3,0x77ee1103),LL(0x545c20a5,0xf50fb144),LL(0x97bff8e2,0x58359a6d),L_(0x00000131),
+ LL(0xcf89d246,0xb2c8ba9c),LL(0xddf8d1b9,0x7f24e874),LL(0x27291ffd,0x563287c7),LL(0xd028bd9d,0xd01bdb48),LL(0x3b0c1265,0x71b99b97),LL(0x618319b9,0xf686050d),LL(0x8420d531,0xc411c3a3),LL(0xaed7c201,0x468eb84c),L_(0x00000197), LL(0x5bf609a2,0xf6eb2fc0),LL(0x1dab9da1,0xc275b73e),LL(0x49847c3a,0x54d322f9),LL(0xf0578805,0xdd0cd2b7),LL(0x4958eafe,0x185bb3e7),LL(0xd9061a48,0x5c6dfcd8),LL(0xf9ac370d,0xa0217866),LL(0xf54cb188,0xa132c3b5),L_(0x0000017a),
+ LL(0x9e0b2bbd,0xf197825d),LL(0x1340276a,0x4bbcc96d),LL(0xd82fe632,0xcad6233b),LL(0xc290475e,0x0cd8d04a),LL(0x738cce9a,0x8e8e067d),LL(0xaa038ad0,0xd83e4317),LL(0xa7ce55aa,0xd5e91f49),LL(0x856a1887,0x5efeae92),L_(0x00000013), LL(0x035b085a,0x9bfa0b6a),LL(0x3d153ead,0xef7bc585),LL(0xca7f6fb4,0x0b798e2a),LL(0xf8abfbb3,0x53595cf1),LL(0x79182066,0x1774e7d1),LL(0x862d3928,0x8b4548df),LL(0xdb1e4086,0x6e38fc52),LL(0x72153b33,0xe2e4b80e),L_(0x0000012c),
+ LL(0xdc232332,0xf5595043),LL(0xe1b752f3,0x1b9318d9),LL(0xf6e2b364,0x5c02bb70),LL(0x38d64e0f,0x9d8f2870),LL(0x07542416,0xa62f3a1b),LL(0x3b8c6755,0xd59701bf),LL(0x2b642127,0x20fbe8ba),LL(0xfac17f0c,0x3410177d),L_(0x00000126), LL(0x0c65efbc,0x2b08cc56),LL(0x70680750,0xe532cef6),LL(0x7a1e8980,0x29a4a8b8),LL(0x3b679637,0xcb3a4f19),LL(0x0043db7c,0x92e07ae8),LL(0x346fea83,0x0da35be0),LL(0xef33f7a0,0xcb41f4e9),LL(0x271ea778,0xbb760e77),L_(0x0000016e),
+ LL(0xe8812fbf,0x120e5ac8),LL(0xcad14e90,0xd45b7941),LL(0x130b3936,0x78bbd634),LL(0x3839fe90,0x8f94ae22),LL(0xfb2c2b29,0xbd4d9761),LL(0xb2caaa91,0xf6e513d3),LL(0x37bd3dff,0xa0f24baa),LL(0x9dd2846a,0x1d27a8db),L_(0x000000ce), LL(0x62a47784,0xd4e2cdab),LL(0x8296eec9,0xee13214a),LL(0xce1e6780,0x6fed4902),LL(0x8ec28ea6,0x28576525),LL(0xa9bf0652,0x0afbfe7d),LL(0x0c66edcd,0x9e743eb7),LL(0xc8ec4a8a,0x64589360),LL(0x09bf2d23,0x7a6453a2),L_(0x0000017a),
+ LL(0x91c1326b,0x4d44bd26),LL(0x5e7c9a8b,0xfa441738),LL(0x3f4fd525,0x8cdf278d),LL(0x5b1fa4df,0x60600772),LL(0xb7e79779,0x15388443),LL(0x6b7719f4,0xd7a3aeca),LL(0x17dd158d,0x02441c0d),LL(0x3d070ec1,0xd5eb5d02),L_(0x000000c9), LL(0x84252a63,0x0ab898cb),LL(0x01117e64,0xee325365),LL(0x6f680374,0xbc1ae420),LL(0xdaebee10,0x98a23bbf),LL(0xfec8e51b,0xb59efdf3),LL(0xbbf08b12,0xa18137ff),LL(0x1532459f,0x04b7fdbe),LL(0x60238519,0x37b3447b),L_(0x0000000e),
+ LL(0x2c315da2,0x6b53a82a),LL(0xad2c8749,0x5a5a47d3),LL(0x75f76d03,0x60558c44),LL(0x6ecf38ff,0x957fd8a0),LL(0x7695311e,0xcd47da64),LL(0x215ee9fe,0x35b22e22),LL(0x4796f4b7,0x949a56db),LL(0xf62c912e,0x74debc0c),L_(0x00000191), LL(0x55d8aab4,0x9bd8df8c),LL(0x203b317a,0x637e055c),LL(0x03c45bfe,0x90fbadef),LL(0x1132b50f,0xaf36e7bf),LL(0x20a98c58,0x4f36088b),LL(0xdebbd429,0xcbb98ba8),LL(0x391e4230,0x3091f3e1),LL(0xb3356938,0xd86355bd),L_(0x00000072),
+ LL(0xc1f9460e,0xf79ba658),LL(0xb48e1df3,0x3eb15b18),LL(0x5fc03a10,0x3bed592a),LL(0x3591ad26,0x127b78a3),LL(0x07e9d80a,0xc0337c7b),LL(0x349dd74f,0x364ed2a0),LL(0xb1a807c5,0x588d4203),LL(0xecd92cca,0x772a1716),L_(0x0000019e), LL(0xf66f295e,0xf6fc1df3),LL(0x42d25980,0x8922f157),LL(0x36f0fdb0,0xa583206a),LL(0x8cc1fe47,0xc73f8816),LL(0x1d279801,0xe1b77767),LL(0x7ac8979c,0x3dba6831),LL(0xa98b4836,0x60d40152),LL(0xc7f36b74,0xc3d46c62),L_(0x000001a1),
+ LL(0x3a2954f2,0xed4a0395),LL(0x99b5cc1c,0x4cddc23e),LL(0x1d30267a,0x16bee440),LL(0xcd4130db,0x553abd41),LL(0x6652be0e,0x6e659595),LL(0x22061ff2,0xf0c20235),LL(0x72c720f6,0x077f6daf),LL(0x8079b1de,0x1ad9ac77),L_(0x00000151), LL(0x3b6a7cb2,0x6701fea0),LL(0xdd8e0cb1,0x5849b249),LL(0xf395a61b,0xb92466c3),LL(0xc2b702c7,0x77432a31),LL(0xbd7899d3,0x28b4ebc6),LL(0x307f0a10,0x0b06f919),LL(0x5c8246fb,0x7154af20),LL(0x8f032be2,0xc88de5c5),L_(0x00000009),
+ LL(0x30655c0a,0x344eafa5),LL(0x0a16f77b,0x724f29ca),LL(0xdbafe962,0x94bbb419),LL(0x30985479,0x2b2c87d2),LL(0x3775b2ba,0xe0e3814b),LL(0xbd366c77,0x1130e80c),LL(0x7b644025,0xf10ea539),LL(0xe1da2161,0xf66677b2),L_(0x00000015), LL(0x08673ef7,0x11454e50),LL(0xd8ab26fa,0x45948446),LL(0x2a4b8bd4,0x35518731),LL(0x34c59cba,0xcc005baf),LL(0xbd4d3f49,0x06c483a0),LL(0xa3e5d238,0xd77da187),LL(0xc4657e79,0xa31fff1d),LL(0x33918629,0x0e898785),L_(0x000001c6),
+ LL(0x48a7aa5d,0xd39844b5),LL(0xc0ae95fc,0x0cd04d32),LL(0x608fd1bf,0x2b33bcf9),LL(0x8e195302,0x3567e13c),LL(0xb9784d4d,0x6f12914d),LL(0xf39a6a6c,0xf4d361ba),LL(0xcf170781,0x366e62a5),LL(0x70b10e90,0xa3bce706),L_(0x000001dc), LL(0x4172b25a,0x65a7fa0b),LL(0xdf710618,0x93abe742),LL(0x7805a257,0x738295fd),LL(0x76e1d4b4,0xcb5b0f15),LL(0xc121708d,0x716ee171),LL(0x14725b57,0xd2227241),LL(0x2e484d37,0x34400369),LL(0xef0bb7f5,0xebdf59e5),L_(0x00000105),
+ LL(0xf6fa11c3,0xf35d7da4),LL(0x0ee635c0,0x6c91936e),LL(0xdd72a103,0xa9f8eae7),LL(0x2a073b1f,0xff539491),LL(0x6c35942b,0x0a881a03),LL(0x35498b7c,0x67e4af9a),LL(0x59bde411,0xf903d1e5),LL(0x517835ca,0xf0b93b5b),L_(0x00000064), LL(0x3a244f62,0x079d614c),LL(0x550a47c5,0x1c8515d3),LL(0x1f9595ac,0x1557c55d),LL(0xf301c894,0xb5548c2e),LL(0xecc6608b,0x6ed92475),LL(0xf17244f1,0x9b9d35aa),LL(0x9b6083ca,0x82abcca4),LL(0x902eead4,0x45a99fbc),L_(0x000001a2),
+ LL(0x73c00a9e,0xc92a2f72),LL(0xb4d59736,0x46a97747),LL(0xec9ee773,0x92e9e427),LL(0x54eed174,0xe62769e0),LL(0xb25c6252,0x26eca3d7),LL(0xb5598a2e,0x72728c2b),LL(0x73ee8036,0x6cefdf35),LL(0x4ee8ce4c,0x700d3d8f),L_(0x000001d7), LL(0x35089629,0x2ffb5bc1),LL(0xb8175b8e,0xd9c451df),LL(0xbdb5cc88,0x9445c144),LL(0x846b2eaf,0x92957da0),LL(0x5ff2e582,0x2da50816),LL(0xe7cc1a15,0x4dc70abf),LL(0xe4999b07,0x24220cc0),LL(0x1b3556b4,0xb4413c1d),L_(0x000000e6),
+ LL(0x8929ee7c,0xb5ee8957),LL(0x45878f54,0x112fbfa1),LL(0x1879f721,0xe9f0dfae),LL(0xb007f421,0xf113817d),LL(0xeb000fbc,0x35d8e979),LL(0x206151d8,0x0bf9caf2),LL(0x258ab3b7,0x6e8e8e3a),LL(0x92a042db,0x7a4dc496),L_(0x000000da), LL(0x28821f85,0x3d64ea94),LL(0x7360c36c,0xbf2b13c7),LL(0xfb77c37c,0x73884c74),LL(0x65a78a55,0x5d8600a0),LL(0x888762bf,0x77475414),LL(0xc8ba0daf,0x975e6be1),LL(0x59f8b668,0x14cf6707),LL(0x185c7c67,0xfef650be),L_(0x00000023),
+ LL(0xa52fd88f,0x14dc97d9),LL(0xa3e0a482,0xe962fe1d),LL(0x44364f6d,0x19480b73),LL(0x9ffa10f7,0x28fc88ac),LL(0x7993eaa2,0x8a5db808),LL(0xd4bb9db5,0x4464dfad),LL(0x9088a081,0x903605db),LL(0x86f98ca4,0x87bd4fc7),L_(0x000001cc), LL(0x6477a8aa,0xba5ec771),LL(0xec2c3e51,0x3078a6cd),LL(0x1ad83e79,0x66717c17),LL(0xad871d3e,0x8530527c),LL(0x0e3f9442,0x92315ca1),LL(0x49c67cb7,0x2fc5cd79),LL(0x4eb1ba39,0x256788a6),LL(0x10b0e6f6,0xb9cd18a5),L_(0x0000008b),
+ LL(0xe7fab2a1,0xd61fb046),LL(0x90213473,0x4f9db0e1),LL(0xcbb6e9b8,0x36fcff78),LL(0x6aa8fb8a,0x7cd5e9d1),LL(0x337a00c4,0x2c2601e9),LL(0xfe8445d7,0xbbab713e),LL(0x0681fd15,0x0b2dd233),LL(0x2151cff9,0x00ab444b),L_(0x00000049), LL(0x0ca8289c,0x06de9a88),LL(0xcb8ede52,0x209abe3b),LL(0xe1369e32,0xb711e224),LL(0x53136516,0x533569db),LL(0x59d96525,0x5419656e),LL(0xf2d68025,0x326eee21),LL(0xd59bb004,0x073cca71),LL(0x1cbb722c,0xaa784f93),L_(0x00000066),
+},
+/* digit=10 base_pwr=2^50 */
+{
+ LL(0x3b1d2404,0x51931359),LL(0x672b4b0a,0x14acc3b3),LL(0x78ea42e6,0x22fe0a9a),LL(0xe72784cd,0xc20faf43),LL(0x8f9c3ea6,0x5e49f303),LL(0x4c50987c,0x12d1fb91),LL(0x0c76e9b9,0x96a89b90),LL(0x74dc2b7b,0x238b29a0),L_(0x000000de), LL(0x7031f728,0xca68ea37),LL(0x06adb168,0x5ecbae96),LL(0xe58dde88,0x4d422e92),LL(0xeba17742,0xa609937c),LL(0x1451998a,0x8f30fc81),LL(0x9eba807b,0xa724c9f9),LL(0x200db6e7,0x651c126e),LL(0xc9db2dc7,0xb58e38f0),L_(0x0000009c),
+ LL(0x81dfb8c7,0x71e8870b),LL(0x8ea654a6,0xa23dd690),LL(0xc3eb3660,0x673dbdf6),LL(0xa5ddaf70,0x9bbf5d38),LL(0x1e7af5c1,0x0fe1371d),LL(0xcc1eff61,0x1572e30b),LL(0x1308bdd3,0x20ce33cf),LL(0xc60db70b,0x6ab6b3ed),L_(0x00000003), LL(0xd4f22a67,0xae357b86),LL(0x3ce6e16b,0x94e06b89),LL(0xa3849b8d,0xb6058ad8),LL(0xacee1675,0x6add0f99),LL(0x39df12ed,0x43cd380c),LL(0x5c645ff1,0x0481e233),LL(0x94a0f618,0xc84b4bf9),LL(0x805a52a4,0x49a710f4),L_(0x00000098),
+ LL(0x577d0472,0x99d73698),LL(0x68ebe9cf,0x7fcd4216),LL(0xc625e525,0x4922e8d6),LL(0xe579cc68,0xe272485c),LL(0x58eef2df,0x1aedb9d5),LL(0x6bba0e47,0xf69dbcc2),LL(0x6afac0cf,0xd8f85c14),LL(0x4dfdd56a,0xc7e717e4),L_(0x000000f2), LL(0xe505ba10,0x7d4e9483),LL(0x056cb0ab,0x8a2580c9),LL(0xee676f9d,0x031109c0),LL(0x0e2ecd89,0x784c6d24),LL(0xedf27261,0xeac131cc),LL(0xdb6b9edd,0x9428ee22),LL(0xf59f93aa,0x90347b1c),LL(0xd59691aa,0xcb3849d1),L_(0x0000014c),
+ LL(0x6fba378b,0xc42ea299),LL(0x33ae1a32,0xd0ddacf9),LL(0xb43b79b9,0x30561bd9),LL(0x0ad2636c,0x12241370),LL(0xd830def9,0x85a779a0),LL(0xda5f6561,0x28b8580f),LL(0x7e785d86,0x8bafa8c6),LL(0x48ce8b18,0xc75df63d),L_(0x000000d2), LL(0xd7e01b7a,0x5a90afd2),LL(0xc72b304c,0x1b4b2e57),LL(0x40d7dec2,0xe0f45d07),LL(0x3eb94cfd,0xaabbfa71),LL(0xae1b3f10,0x37fa8b4f),LL(0xb080d24d,0x6f6447d2),LL(0x142abdb3,0x20453501),LL(0xfd470df7,0x76e433f8),L_(0x0000007e),
+ LL(0xb1a06043,0x1f809e00),LL(0x9eb8b4e3,0x91e1d4a1),LL(0xa399e369,0x9b1aa8fe),LL(0xf15f9651,0x80a83b4c),LL(0xea343c7b,0x1c2fb2b2),LL(0xc40680cb,0x4d003567),LL(0xe7a338fc,0x65bc46fe),LL(0x4519127e,0x3a269638),L_(0x00000030), LL(0x000ab675,0x8811cc38),LL(0xcd6861c0,0xd2e2abb7),LL(0xccb0e7ea,0xce5461a0),LL(0x8c05450d,0x28a458ea),LL(0xeff9ba00,0x51ce8e58),LL(0x3e543072,0x41ebfad1),LL(0xa43fc5d6,0x2acf8a4f),LL(0xc0d63fae,0xd16efc25),L_(0x00000094),
+ LL(0x33854823,0x0c31be44),LL(0x25c21bb4,0x171af22e),LL(0x91e02b25,0xa0756859),LL(0x87db4292,0xd07cf03c),LL(0xd52aff6a,0xf2199b54),LL(0x476b6c0b,0x4c50edf5),LL(0x1bd465b7,0xdeb36507),LL(0x9e6301c1,0x957f58a4),L_(0x00000154), LL(0x8e331516,0xf73b742f),LL(0x5e9d3550,0x6b92e894),LL(0x419be8da,0xd785e55e),LL(0x95d412eb,0x6018e5bc),LL(0xadbd35ab,0x079447ae),LL(0x5f3359bd,0x21b9bd0a),LL(0xc4db3315,0x5774802e),LL(0x4978d805,0x18a2368a),L_(0x00000167),
+ LL(0x6256586d,0xd53479d6),LL(0x5c26f234,0x2d429971),LL(0x107f7e92,0x8c689924),LL(0x334d8841,0x2a5fa3eb),LL(0xe5ebe430,0xc519e325),LL(0xe8291ba7,0xf2242ce5),LL(0x8a0c19be,0x20419cdc),LL(0x804a91ee,0x70dcad32),L_(0x0000017f), LL(0x96b0c9d5,0x78a46e2e),LL(0x18b297a6,0x21fc2dc8),LL(0x3ba036e4,0x30517e2f),LL(0x7a021835,0x49f89605),LL(0x19710681,0x84156ac1),LL(0xd61e5109,0x05c42243),LL(0x31ade9f9,0x7b661ab8),LL(0x83c25735,0x22eb398b),L_(0x000001df),
+ LL(0x682dd914,0xad081cbd),LL(0x1433b543,0x88d8cd2c),LL(0x94641d24,0x2da0394f),LL(0xd8e36e70,0x48288ca4),LL(0x461fe782,0xa112c8a6),LL(0x6f063613,0xb8624a48),LL(0x77efb66b,0x511d90ff),LL(0x016e8d41,0xce809694),L_(0x000001a1), LL(0x1fc39355,0x36feced9),LL(0x3ecdac71,0x921f42e8),LL(0xee8e2857,0xe82b293d),LL(0x2c3ef9bb,0x182b25ab),LL(0xac32f4bd,0x297ad819),LL(0x74b598de,0xdd15916b),LL(0xd5e666a5,0x51456a24),LL(0x447be0b1,0x4dc25c5c),L_(0x00000179),
+ LL(0xf9b2eade,0xb1762839),LL(0xba507049,0xed038901),LL(0xdcef710b,0x4b349ec8),LL(0x2489f866,0x37b4ec4e),LL(0x991460d8,0x94e1cecc),LL(0xbf2a63d2,0x33d105a8),LL(0xc7e7415f,0xbf883b5c),LL(0x268241cd,0x2f565fda),L_(0x00000135), LL(0x38741429,0x8bf3904a),LL(0x8e823f54,0x0c2d77f6),LL(0x06de5eb9,0x2c00d580),LL(0x89b51b4d,0x41ce4b94),LL(0x794caf3e,0x177cd9b2),LL(0x7c62716f,0xfe0ae88a),LL(0xb7e50074,0x4d023907),LL(0x49a489fb,0x545f8faa),L_(0x000000b9),
+ LL(0xbcdfb42e,0x05813dea),LL(0x62545e9a,0xc84039c9),LL(0x70606ec0,0xcdf6907b),LL(0xec7e8e9b,0x2e4e87c0),LL(0x9d6e053f,0xffa08764),LL(0x22a2e351,0xe5b305f1),LL(0x95345fe3,0x65c90711),LL(0x4f24c950,0x139d472c),L_(0x00000144), LL(0xa58aa810,0x9eeab46c),LL(0xac8b67e8,0x267bcc83),LL(0x702c21e5,0x0dac9b29),LL(0xce390fe4,0x60429071),LL(0x6ef71376,0x4a80e0d7),LL(0x47100322,0x0ef6a473),LL(0xdc625a85,0x759024e7),LL(0xea01db5d,0x1e4722a2),L_(0x000000a2),
+ LL(0x4965f4fd,0x5678bfca),LL(0xb048b1b3,0x5bacba68),LL(0xf518ba8c,0x1626088b),LL(0x7054f024,0xa686c886),LL(0x933a9118,0xbb623954),LL(0x1c3c471e,0xc4da98f0),LL(0xf1b8c9b1,0xa0619dd5),LL(0xaeebf226,0x24b28dc5),L_(0x00000108), LL(0xad3fede9,0x47814012),LL(0x49c3a34f,0x1cf06d59),LL(0xfcdcc300,0x6d4a798d),LL(0xe86df54b,0xa1a4dd57),LL(0x1534b80c,0xaf606d64),LL(0xbdfde769,0xde1cbaa0),LL(0x649c3a2a,0xbf6c9950),LL(0x763574e1,0xaaf6f737),L_(0x00000139),
+ LL(0xc23c5aa2,0xf687c377),LL(0xca314119,0x3eacfd33),LL(0x2512d094,0x9c0e1850),LL(0xe55f9fd6,0xc3c6ea7e),LL(0xc20685b7,0x66291556),LL(0x4868b07c,0xb5895337),LL(0xf9f339d7,0x9238a109),LL(0x75d6855b,0xac6af37f),L_(0x00000091), LL(0xf49812cf,0x6eb5d5b2),LL(0xe7603bff,0xf7552855),LL(0x8f73b087,0xc19b7320),LL(0xe8f5c0ad,0x55df5442),LL(0xb6aeabd3,0x3a4b8876),LL(0x8dc2b22b,0xf8bca737),LL(0x26f89265,0x3dbb040c),LL(0xfb6645f2,0xb09ab1bb),L_(0x00000138),
+ LL(0xe9c4fede,0x9e2dc755),LL(0xea8b03a8,0x5618c490),LL(0xd5d01455,0x01a7a348),LL(0x9622ab8a,0xa6b5c4df),LL(0x9adea853,0x303519de),LL(0xa9b99058,0xb3d0934b),LL(0x0fbd9ea2,0x2cdee030),LL(0xe856d6fd,0xa351d2a2),L_(0x0000008b), LL(0x6ac4ec77,0xea40ff5a),LL(0x4859e663,0x906f2d7a),LL(0x71904b77,0x411180a4),LL(0xbd7ebd35,0xe50b9460),LL(0x0ec190c2,0x2e7f4d73),LL(0x4c9e4aac,0x76a98ae4),LL(0x4323017a,0x7f0e29c1),LL(0x22ea8f39,0x31c71758),L_(0x000001e3),
+ LL(0x0402f8c8,0xcf98bee6),LL(0x54f3df55,0x672d0a69),LL(0xe9759866,0x1addc9d4),LL(0x9c17b622,0x6c819f7f),LL(0xc42650ec,0x6b1209c4),LL(0x6a1aa1b9,0x2b341fef),LL(0xdbcf91bf,0xc99d2b99),LL(0xed76cdf2,0x27467cd2),L_(0x000000ee), LL(0x6ea222ca,0x64754f19),LL(0xc40615cf,0xb8f1e46f),LL(0x9a8d5587,0x540f1fa5),LL(0x804f7dd7,0x21752096),LL(0x2c95388c,0x9444e15c),LL(0x133319bb,0xb1d5a817),LL(0x29552f4e,0x79fc1cba),LL(0x93730e70,0xcae8a131),L_(0x0000011a),
+ LL(0x2b9c7277,0x88863b50),LL(0xbfdb676e,0xb9545954),LL(0xfcfc0194,0xe74bedd7),LL(0x888694d2,0xe59a14c4),LL(0x236680d1,0x4cd674c0),LL(0xacdf13c1,0x52151e94),LL(0xcdbecfcb,0x6a28bc34),LL(0x641d77e2,0x6293af48),L_(0x000000e3), LL(0xa8fee6f0,0x2e8f361b),LL(0x67004141,0x39634681),LL(0x5db1f02f,0xf975c602),LL(0xe645bd3a,0x8b39a53a),LL(0xfafccb60,0xa58e37f9),LL(0x33ab2637,0xcf611fd4),LL(0x8b8cc6bb,0xe7f89e7f),LL(0x28eb10f6,0x5f527820),L_(0x000001d1),
+ LL(0x8fcc2459,0x9411ca0d),LL(0x92267e14,0xb385c8ea),LL(0xbbfcc2ab,0xbfd56d29),LL(0x34b29656,0x5f2180a7),LL(0x06f72807,0x6dc34000),LL(0x02310437,0x854af754),LL(0x1bae73e6,0xbc753242),LL(0x06a8d2dd,0x11770a34),L_(0x000001d7), LL(0xb8d63658,0x14476594),LL(0xeb8cb497,0x6ba99aed),LL(0xc86324ad,0xc49863ca),LL(0x8a316428,0x2e5cfc3d),LL(0xcb62d82a,0x79adc3e0),LL(0x9e5f3fda,0xcaddeff7),LL(0xb4f990b6,0xae15a98e),LL(0xb9b0e410,0xedf394c7),L_(0x0000000a),
+},
+/* digit=11 base_pwr=2^55 */
+{
+ LL(0xf2938b13,0x20c391c2),LL(0x96d1c5f4,0xeaef76b3),LL(0x6bb17f5e,0x7feb16a1),LL(0x3f16a57b,0xcc801552),LL(0x4aadf126,0xcded6e6d),LL(0xe23393c9,0x6848f602),LL(0x2c8dbcb3,0x49f3a9ae),LL(0xf811e23c,0xc0c1ebfa),L_(0x00000130), LL(0xd5da561b,0xaf1b88cd),LL(0xb4c22029,0xaa7f22fc),LL(0x9624d6d5,0xbb120735),LL(0x416db935,0xa8308449),LL(0x85fd3219,0xc467f9f1),LL(0xb4d3e00f,0xa69d57d8),LL(0x187052a8,0x0528c91e),LL(0xb79e6638,0x2a603bc9),L_(0x000001a4),
+ LL(0x474fe094,0xca26efe1),LL(0xa3ad38a0,0xf5cd529d),LL(0xec34abea,0x94808b1e),LL(0x27c847ac,0x87ade961),LL(0xfa6df215,0x6a43fa8c),LL(0xbcfdb5ad,0x947fbb39),LL(0xdd4d0c9f,0xbca687c5),LL(0xe8772a4e,0x7d79e215),L_(0x00000122), LL(0x81cb032e,0xbf926e1c),LL(0xb04fbc5a,0xb9c12ffd),LL(0x34707ba5,0x4ee8c89b),LL(0x81aa347c,0x367a152d),LL(0x4cd56572,0x74511a3a),LL(0xa6642939,0xd0e3b8f1),LL(0x60ea13e9,0xee14ab42),LL(0x81a19a28,0xea76ba4c),L_(0x0000015d),
+ LL(0x04a0af27,0x6b0c75c4),LL(0x23a4b0aa,0xdb181c23),LL(0xdc940ab7,0x7b70983d),LL(0x328a76b8,0xd5b473a0),LL(0xadcb9bcd,0x3863dc05),LL(0x646b4949,0xe5090fd0),LL(0x0b996e3d,0xd0261360),LL(0x7c332b20,0xcc6b2f86),L_(0x000001c7), LL(0x3ac008c8,0x28cd5819),LL(0xf08cb2c4,0xfbdf661a),LL(0x9b1c2455,0x2be7d7be),LL(0x38fbe0c1,0xbd91e037),LL(0x84e69e29,0x1cdba496),LL(0xc6f94abf,0xa8445728),LL(0x8e9508e3,0x4a144f07),LL(0x8ee0e340,0xc5b72f6a),L_(0x00000066),
+ LL(0xfe2f1a3a,0xaff1e1b3),LL(0x87421ab9,0xbbfcc6da),LL(0xa3305ebd,0x4b75a8e1),LL(0x8f4cb778,0x4410056f),LL(0xb5abdc6a,0x4ff65612),LL(0xd83f32f5,0x21c44b1c),LL(0xb989d251,0x80a7bb1f),LL(0x5214abed,0x8f200e11),L_(0x000001ba), LL(0xd63a07ff,0xf4fb8525),LL(0xf5f23c02,0xaa8e02a4),LL(0x405911d9,0x45abb8b1),LL(0x7a6dae03,0x4834d14e),LL(0x4621957b,0xeb31fdc5),LL(0x7cbf9b75,0x26ee5dca),LL(0xee84304e,0x37349cc1),LL(0xcc6a2c7d,0x5a34c3af),L_(0x000001c8),
+ LL(0x3c425b85,0x9f122c9e),LL(0x71cfc92d,0x9c6ec42c),LL(0xb86c84b7,0xc8d12bf6),LL(0x1c821b85,0xe8432cc5),LL(0x197e0f04,0x4258bc34),LL(0xc4f03c70,0x60ae518c),LL(0x811512ff,0xf050c9b8),LL(0xe8038335,0x0b215595),L_(0x000000f0), LL(0x9423e29c,0x423ac4f7),LL(0xb15c3155,0x2fd13662),LL(0x7684c454,0x5cf8078d),LL(0x1a7bfb14,0x2b928e98),LL(0x1d05b843,0x3bbf2a85),LL(0xeeb1e658,0x356da90c),LL(0x179bc7a9,0x11d26c87),LL(0xf524843e,0xf4159e0d),L_(0x000000ec),
+ LL(0xc58a5d93,0x08cefac8),LL(0xb1885068,0xe8422939),LL(0x5985dd6e,0xab14cf0e),LL(0xcda94a64,0xc27af983),LL(0xd127851a,0xf24f6eaf),LL(0xbab20f8f,0xda3b25d8),LL(0xa549d9c6,0xed810bd4),LL(0x5bf18f37,0xf630e4c9),L_(0x00000055), LL(0x51ad76d0,0xae18594e),LL(0x52697460,0xf8de9d89),LL(0xaec56660,0x294777cd),LL(0xe3a93a39,0xf7dc98fd),LL(0x63fcc0bd,0xc0c53dc3),LL(0x5d2c2708,0x55da9198),LL(0x3692d050,0xebcde249),LL(0xcdc4d312,0x8d0017f5),L_(0x000000c1),
+ LL(0x045c6797,0x1d9471ec),LL(0x737ba42a,0xd3401c6a),LL(0x33fd5fca,0x3c2758a5),LL(0xb016b83f,0x79b1c693),LL(0x3409d0d4,0x5f80d853),LL(0x4f2a7005,0x4d1634ee),LL(0x799e106c,0x1e92ef70),LL(0x632dcd5e,0x86232632),L_(0x00000087), LL(0x06622996,0x1acab1e2),LL(0x92c31a31,0x91455009),LL(0x740223dd,0x15a695ed),LL(0xa95f341b,0xe601b98b),LL(0x17db74b3,0x19ccbb77),LL(0xd916a466,0x44573d27),LL(0xc31a7a19,0x093c0363),LL(0x1bb20e06,0x6715c5f0),L_(0x000001e7),
+ LL(0x5f8496f0,0xa1a3f86e),LL(0x2df7ec8e,0xf1f8f7f3),LL(0xd8551991,0xb16ec397),LL(0xbc80f4ee,0xebe5be1a),LL(0xa1e6cbf5,0xaf8233b8),LL(0x5c403702,0x41483767),LL(0xbf97ecb0,0x2899a5cc),LL(0x58655568,0x0720d399),L_(0x00000028), LL(0xdc27af93,0x88312054),LL(0xd550df72,0xf87e274d),LL(0x193eb1e2,0xa715c43f),LL(0x97773656,0xcb67dce2),LL(0x8a585c6e,0x0aacb5db),LL(0x6332fcd1,0x4f16d92a),LL(0xdeebccba,0x2b8001ac),LL(0x8936c8da,0x7b627657),L_(0x00000181),
+ LL(0x24e7c452,0x8d63a794),LL(0x35fd304e,0xdd225fc9),LL(0xa6aae952,0xc40c9b7f),LL(0xd5054f16,0x42316d8c),LL(0xf663b3dc,0xb3d7abe3),LL(0x13c94097,0x7aa82bbf),LL(0x78263190,0x2a622ce8),LL(0x819c0b14,0x2b1dba5c),L_(0x0000001a), LL(0x3c259ac8,0xe69bb850),LL(0xdf7bd8ef,0x985f2ed6),LL(0xc76c2599,0x44f156c5),LL(0x46e2c0c0,0x7cfc49ae),LL(0xf5fb07c3,0x6f59a7a0),LL(0x2f48e451,0x1b89eefd),LL(0x88119cbb,0x1c41ec61),LL(0xa18666db,0x53014a3d),L_(0x000001f0),
+ LL(0x4e03d590,0x792d6d08),LL(0x4d84ecf1,0xe0110c24),LL(0xc93fa7f1,0xc72b1bb4),LL(0x908f695c,0x1730f1b2),LL(0x8d0bc692,0xdb0b36b3),LL(0xe4bf469c,0xa1db29c0),LL(0x1d41428d,0x7a577f2c),LL(0x2cd1253d,0x23b65522),L_(0x0000006a), LL(0x7ebe31ef,0xa4ba5fbd),LL(0x9808ec8a,0xa5383520),LL(0x49718327,0x2c210a5f),LL(0xdc5bb249,0xef53e1db),LL(0x7e38e02e,0xc9d3c171),LL(0x7b41e983,0x3a07d487),LL(0x2d8aedea,0x6c0e3ba1),LL(0xa17e058b,0x22c8be6d),L_(0x000001d0),
+ LL(0x51500886,0x6a5713b6),LL(0xac6235d1,0x19855a0f),LL(0x32d1869e,0x093a8212),LL(0x8afdb213,0x89861196),LL(0x3402ba32,0xb3676c48),LL(0x5e54b89e,0x53597329),LL(0xbdde3064,0x94cdc873),LL(0xc3d273b6,0xfd911ed5),L_(0x000001f1), LL(0x65cf5cfb,0x0d98f860),LL(0xf6cf3683,0xa681e586),LL(0x6f5c1e3f,0xc6905825),LL(0x7d626d06,0x571b75e4),LL(0x00a44322,0xf9fe1aa4),LL(0x34ece73d,0x3975b815),LL(0x38add31a,0xfa3db092),LL(0x499ecb33,0x2ce86fab),L_(0x000001bf),
+ LL(0x8aeb123d,0xf5870ab9),LL(0xa353002c,0xa12da044),LL(0x6150f34f,0x0086b83e),LL(0x69e6eea2,0xa2cdf131),LL(0x5e80e0a0,0x528616b2),LL(0x2d13e0cc,0x4a67c598),LL(0x9702e01a,0x83d6e661),LL(0x15b60ef1,0x6f9172f8),L_(0x0000001f), LL(0x6386476a,0x7b2b5776),LL(0xe6acc547,0x055811a0),LL(0xba422b24,0xa9873020),LL(0x8c990991,0x310acf2c),LL(0x96459d45,0x78701ea7),LL(0x917c30ec,0xd1688c83),LL(0xdb51be44,0xb42ce9e9),LL(0x0b514c3b,0x0b03fd87),L_(0x0000008d),
+ LL(0xb09c0812,0xbcc82868),LL(0x69816459,0x580f7a11),LL(0x9b94ac07,0x11b4de1d),LL(0x120451de,0x8f21a7aa),LL(0xc048b454,0x0f6b490e),LL(0xca8d647e,0x5d0f4e1d),LL(0xf1f7c090,0x3e12d889),LL(0x1ad27c80,0x5b341256),L_(0x000000e5), LL(0x5e7c3d96,0x35f1970a),LL(0x4366eed0,0x1134e984),LL(0x55c0352d,0x7ea259fe),LL(0xfad7d83b,0xda4dcbce),LL(0xdd5f6008,0xb2924c78),LL(0x01b25214,0xac404086),LL(0xf325f997,0x2b613948),LL(0xf37e21a0,0x26e31be0),L_(0x000000b4),
+ LL(0x40c9bb67,0x017edbd6),LL(0xf483d72a,0xb08491c6),LL(0x58a225c5,0x568a7e71),LL(0x7fde8697,0x821bf73d),LL(0xef4bc022,0xec765e3a),LL(0x8d1daf2f,0xb59a1d2e),LL(0x72d486e7,0x1edfc037),LL(0x2a595f95,0xf1683f88),L_(0x000001ff), LL(0x4c4cc13e,0x55fc5381),LL(0x96f30cc5,0xc6ce2141),LL(0x76a3af64,0x339f5668),LL(0x5449bfff,0xe438adb5),LL(0xf3c48dff,0x1aa59ae8),LL(0xce59b544,0xc0fd6c57),LL(0xb7bdc7b7,0x8e51d10e),LL(0x973b8e1d,0x6427d578),L_(0x0000016a),
+ LL(0xf61dae1f,0xe76cf424),LL(0x4eac44ab,0x559e7a5a),LL(0x0ddf44f2,0xc58d75d8),LL(0xfb0d499a,0xab62039f),LL(0x6cf6c677,0xd4e76825),LL(0x2e427953,0xa955fdca),LL(0xe1d73f88,0x049f7f5d),LL(0x89dc4a2e,0xd5493485),L_(0x0000015a), LL(0xadae9a0f,0xa5dc86bb),LL(0x2a75769b,0x606d9e57),LL(0x550fb22b,0x260bcabb),LL(0x7bccdd84,0x2e3ee7a3),LL(0xc4b6b979,0x03bd7f7d),LL(0xfc3349bd,0x122b5333),LL(0x95f84290,0x4bdf7095),LL(0x3057b4f5,0x6af3cf31),L_(0x00000022),
+ LL(0x64c8b352,0x1d055192),LL(0xf272a08c,0x343f766f),LL(0x142d545c,0xb8bd86e9),LL(0x860ef117,0x60c69c66),LL(0xb6de931c,0x1b54e53c),LL(0x9924f2f5,0x878c0c9b),LL(0x0b949095,0xfba7e2a3),LL(0x6916f5f1,0x7da79c3a),L_(0x00000181), LL(0xbd559979,0xe06ad6ba),LL(0xd551de11,0x3b3cbbe6),LL(0x6c45d4c3,0xcc4aa553),LL(0xe3c9e3df,0x1bb5c238),LL(0x05a1e382,0x8dfc012d),LL(0x84d8d463,0x3b856506),LL(0x05b7e241,0xcdcfd8e8),LL(0x27718949,0xc1a85e66),L_(0x000000ef),
+},
+/* digit=12 base_pwr=2^60 */
+{
+ LL(0x09d8e58c,0x0af6a9bd),LL(0xdca0a6cc,0xfe5f904b),LL(0xd9e6d336,0xd87d0339),LL(0x3b8c9d8b,0x4d463bab),LL(0xfb629c3f,0xc203e46d),LL(0x4ea62ed4,0x998a0ef3),LL(0x64035458,0x62783285),LL(0x7769592c,0x3c56ebb3),L_(0x0000001b), LL(0xb96cc870,0x259a17aa),LL(0xd51ce441,0x8666df8e),LL(0xc62b1c65,0x437c7966),LL(0x74db6999,0x0fecb364),LL(0x7c60998f,0x1f725b1f),LL(0x71fdafc2,0x5b56396c),LL(0xa547fb5a,0x9d888686),LL(0x0f566ae7,0x130033ff),L_(0x000000f4),
+ LL(0x41a4fd11,0x12a6c73f),LL(0x66164319,0xfe4c8bf4),LL(0x9c6ffbd2,0x42f313ec),LL(0x2869e4fd,0xf8b100ba),LL(0xbae712b9,0x0e18229b),LL(0x61a1f1da,0xffe55501),LL(0x032c80f2,0x3bfaa0e0),LL(0x48f0b1d5,0xb83c7607),L_(0x0000015f), LL(0x3cf7a1fa,0xa0ed3335),LL(0x8b3c031f,0xc141575b),LL(0x53c30e33,0xfa62217c),LL(0xf9f945a8,0x8b667de4),LL(0x889399aa,0x7c4952fb),LL(0xb711abc7,0xabedb6e3),LL(0x59e7e12f,0x5a1b2cb9),LL(0x1857ebfe,0x4206e243),L_(0x00000134),
+ LL(0x301de7d2,0xa95f9c5a),LL(0x0d937115,0x2ee0eb80),LL(0x4b1412c8,0xdf5a5904),LL(0xe6f39cf3,0xcd50327e),LL(0x9a796b16,0x0841dfd1),LL(0xc493ac5c,0x19d15d79),LL(0x7275eb23,0x4b9d4479),LL(0x1a3b6feb,0xe1eb10df),L_(0x00000142), LL(0x6d17f389,0x7551bac5),LL(0x7a907c78,0x232dc783),LL(0x82e7d67e,0x5acaf222),LL(0x5ebc3c22,0xe17100c9),LL(0x62250256,0x3198b234),LL(0x4beb3ba2,0x16986b8a),LL(0x492d3035,0x973e4135),LL(0xfcc0dd28,0x2e1155d6),L_(0x0000011b),
+ LL(0x4df6981f,0x1f14d7bc),LL(0xe951da15,0x3d397c45),LL(0x3964143f,0x24be6549),LL(0x2e556c9c,0xe1293e25),LL(0x3aed330a,0x4bfda40e),LL(0xdf82159a,0x3b13e72c),LL(0x514f7b17,0xa5b859ff),LL(0xe20684bf,0x90812f67),L_(0x000001ce), LL(0xe9a0c258,0xbca9abf7),LL(0x3b0b3a0f,0x72194a82),LL(0x11d27090,0x17f5564f),LL(0x9bbb7a7f,0x87f0af99),LL(0x96c01479,0x69d62017),LL(0x45cce25a,0x0c43d35c),LL(0x26584337,0xcbff6e89),LL(0x19a55401,0xb503e2ea),L_(0x000000ea),
+ LL(0xb5cd512f,0xaecaabc4),LL(0xdeccde50,0x9ffdf34c),LL(0x395d2404,0x25068e1b),LL(0x40559189,0x93fb9ea4),LL(0xd141ad3f,0x2a60ba95),LL(0xc42f76f0,0x414a5981),LL(0x946bf800,0x138c47b5),LL(0x38435023,0xf314147e),L_(0x0000013c), LL(0x9ae19e3e,0xe38bdcc6),LL(0x3cebd917,0x0966bac7),LL(0xc3533788,0x2718c3e8),LL(0x33ee6ede,0x10236ae8),LL(0x4f5b88fd,0x44797bb1),LL(0x485e76bd,0xb2b31296),LL(0x68194c12,0xe45112ba),LL(0x0cb75dc1,0x8574000b),L_(0x000001d8),
+ LL(0xeea24bcd,0x8f37d315),LL(0xf77a65b3,0x37731160),LL(0xde279622,0x6f06ae65),LL(0x87ebd334,0x25b38b15),LL(0x2a1d2c7a,0xa55c6b9f),LL(0xb1687394,0x0ccf2f34),LL(0x4f27c66a,0xecf3de75),LL(0xa9866c84,0xa4a0f4aa),L_(0x0000014d), LL(0x8dffeb86,0x0366dd8b),LL(0xbfeaeff0,0xfe941121),LL(0xa80b5c3b,0xc3fed2fa),LL(0x18a5b6a4,0x23dfdf47),LL(0x2ef007c6,0xdb0791d2),LL(0xcec61c6b,0x6d79949c),LL(0xe328d9cc,0x0d03e696),LL(0xaa14a153,0xfdb36710),L_(0x00000145),
+ LL(0x1a8d3cd0,0x736dcfa6),LL(0x77e26493,0x6af49ff9),LL(0x089ee4ac,0x1720bd71),LL(0x2f3b86d6,0x48d2c5df),LL(0xbcc66a78,0xd78e07af),LL(0x1f230a9e,0x077a7ceb),LL(0xd2f61bf5,0xfbf99e70),LL(0x92770c3f,0x7ae5f084),L_(0x00000148), LL(0x64c29961,0xa6ee44c4),LL(0x990f4f03,0x4aacbd8f),LL(0x45377427,0x0ef447b6),LL(0x55b5c873,0xe02e661f),LL(0x11e65ae5,0x99f13f10),LL(0xfe17d3ed,0x393cf4c8),LL(0xdbeb35dd,0x23277110),LL(0x65a7d1cd,0x444802cd),L_(0x000001fb),
+ LL(0xf621fd74,0xea71a842),LL(0x4c057a1d,0xfc8fb859),LL(0xe1689c80,0xadc9a8e1),LL(0x09c22f52,0xc47b8163),LL(0x0a960c99,0x90c495f0),LL(0x0a0f356d,0x88242e20),LL(0x87494b79,0xb7f9ca6a),LL(0x6fdcd587,0xd76d2c39),L_(0x000001c4), LL(0xd6ecf158,0x1e35970d),LL(0xaee47a26,0x8df13449),LL(0xadfd394c,0x67553f2c),LL(0x71cdfbec,0xa43c6154),LL(0xf09db2ac,0x4606556e),LL(0xf2e04011,0x12eca225),LL(0x9dfb28da,0x87a4c839),LL(0x28812bc5,0x8cba8984),L_(0x000001ab),
+ LL(0x49041a38,0xcb554ab1),LL(0x3446834e,0x21810284),LL(0x2ab359a6,0xf95fa59b),LL(0xf33f9ef0,0x16db657d),LL(0x0f8d940a,0x38fe2897),LL(0x39b668bf,0xdeba7f4c),LL(0xc6452278,0x7471cf19),LL(0xb96dd1e3,0x732f77c2),L_(0x0000011b), LL(0xfa410fb4,0x745c3f1b),LL(0xbca782f9,0x8bd5ef13),LL(0xc4e21488,0x8211733f),LL(0x8f6c1b78,0x50b780cb),LL(0x4b628b50,0x1a1a0206),LL(0x78e4de6a,0x44975c37),LL(0xf9f51865,0x6ef7e616),LL(0xbadf032d,0x3882a9ad),L_(0x00000084),
+ LL(0xe4d0aa5a,0xe84ad756),LL(0xf2f7ceab,0x6545847a),LL(0xfb04aded,0xdd4cb1ba),LL(0x87083ecc,0xf4c8bbb0),LL(0x452249b7,0x6531b732),LL(0x868536ed,0x6968e15d),LL(0x1d0209ca,0xf0285aff),LL(0xfaefc194,0xbed23705),L_(0x000000bd), LL(0x6489b527,0x3ea47ce4),LL(0x69374c35,0x2a6d8757),LL(0xdc6375ee,0xc6f768ea),LL(0xaeba5bab,0x327c743e),LL(0xda6790e0,0x9a01ae4a),LL(0x1a9de4f9,0x3ae6cb85),LL(0x9ac5b7b3,0x6d32a174),LL(0xf134b615,0xdf38a0f3),L_(0x000001ec),
+ LL(0x7d9c19cd,0x688d2325),LL(0x79db6c85,0x5359ff24),LL(0x764f954a,0xc7801c4a),LL(0xfa78e8b8,0x098ede82),LL(0xb52cd1ab,0xd34f03a8),LL(0x66adb2da,0xcfcfe244),LL(0xfc69d130,0xb5e52304),LL(0xf88483bc,0xab73db68),L_(0x000001c7), LL(0x228f1338,0x077d01af),LL(0x7eb9fb07,0x8abf2d7a),LL(0xcb62a0d5,0x37a4ecbb),LL(0x1a28e347,0x06b68356),LL(0x35c05ae1,0xadaac01c),LL(0x2f3d8c6e,0x712aa1f3),LL(0x9ee5907c,0x69606236),LL(0xc9bdbb2c,0x7b2e6894),L_(0x00000011),
+ LL(0x0c5ccb9d,0x09d420b2),LL(0xccc993bc,0xa3ad7d2a),LL(0xd8b3ee97,0x7986ac14),LL(0x59fa9e76,0x95dc5774),LL(0x9477b42b,0xfbe8e9d7),LL(0x89d7ab26,0x79b03712),LL(0x017b7f94,0x77f9bdea),LL(0xbd8dcef1,0x7a238609),L_(0x000001fe), LL(0x1b9ffcc9,0xaee002b6),LL(0xcdfc127c,0x23640ec5),LL(0xad2abcbc,0xc6dc5bd5),LL(0x05982646,0x20400061),LL(0x3c1c6b9f,0x6ee16a76),LL(0xc943d1fd,0xd619a75d),LL(0xd16a85f5,0xa278715e),LL(0xd8747be6,0x34ec8668),L_(0x000001c0),
+ LL(0xdaf270b9,0xcec9be5b),LL(0x6f5e16ec,0xfd62380c),LL(0x192223b1,0x27bda6fd),LL(0xe1e75d7c,0x0df8a788),LL(0xd01bccf4,0xbeed1a6b),LL(0x6611a8ed,0x01402436),LL(0x17838dc7,0x7f189fd3),LL(0x615a507f,0x760bd862),L_(0x00000152), LL(0x090f0135,0x791dac6d),LL(0x2bb5aa65,0x0457b859),LL(0xece0f798,0x1a8af3a8),LL(0xde75b69f,0x6625db63),LL(0xcf064060,0xeeda55fc),LL(0x0d8f8c69,0x05536430),LL(0x27c6a431,0xb1dc58b1),LL(0x56c1ac3a,0x0c1a1dab),L_(0x000000ae),
+ LL(0x18e8414b,0xfb73e1e4),LL(0x0f973c1b,0x6977f355),LL(0xca40d04d,0x2797e4c7),LL(0x01c089b0,0x1b05804b),LL(0x0064b701,0x7b76fc1d),LL(0x9677da0f,0xb0b47105),LL(0xd02ba9e2,0x4fb9b758),LL(0x6b2435ea,0x2fd704c2),L_(0x000001a6), LL(0x2578e31f,0xdc19942f),LL(0x4734e848,0x366f685b),LL(0x6b9e935f,0xb3827f30),LL(0x81e91d77,0x4cce7910),LL(0x36ada690,0xcb031a95),LL(0x227eb763,0x6ac3a0f0),LL(0x527fc0d3,0x7b60ac80),LL(0x404eb0f3,0x2c62b4f1),L_(0x000000c9),
+ LL(0xfa5ed043,0x95cf6b06),LL(0x69fd4f1d,0xbdef736a),LL(0x9044b8ce,0xd7e44ee1),LL(0x546a5d1c,0xe3ac270c),LL(0xbe0ace78,0xe59e1538),LL(0x27b93218,0xe51fc4ac),LL(0xf26796fb,0x71f9328b),LL(0x9137cac1,0x07a55147),L_(0x00000057), LL(0xedbb99a1,0x9ce1532c),LL(0x37d59c98,0x2c0e5b9e),LL(0x62f632e6,0x55146f87),LL(0x29fd2249,0x402150dd),LL(0x12ea0f69,0xf442153e),LL(0xfa397b38,0x9b5cefd9),LL(0xc5ad174d,0x8cae5294),LL(0xb46b9f16,0xcd8b0a60),L_(0x000001a7),
+ LL(0x4276a1bd,0x1e614695),LL(0x71344edf,0x2b4a50c1),LL(0xb3013081,0x4896c770),LL(0x2cf314a1,0x96a68659),LL(0x90053fe7,0xd79226d8),LL(0x5847ac79,0x3ada869a),LL(0xf60993a8,0x7d156a5c),LL(0x67e4b5fe,0x7850cdf6),L_(0x000000dd), LL(0x5fb3dea4,0xf35bcbb3),LL(0x4e2d6021,0x9877f0a3),LL(0x90be9398,0x4d6435bb),LL(0x86130340,0xe5919257),LL(0x2710c007,0xcc99d199),LL(0x87d3586c,0xc1451c79),LL(0xe8681c58,0xfa896da8),LL(0x6659a487,0xb1a9e543),L_(0x000001a8),
+},
+/* digit=13 base_pwr=2^65 */
+{
+ LL(0x73f3ddc5,0xfa295332),LL(0x0b259ba7,0x94f8c958),LL(0xa4092fea,0xbe9d56f6),LL(0x622efd38,0x0f2ba425),LL(0xa4d25a72,0x57c0adb2),LL(0x2498a9ea,0x11f11875),LL(0x893bbb4d,0x195ec41d),LL(0x2f56b02f,0x2ad72c4b),L_(0x000001ca), LL(0x1ab7060a,0x0fa4013f),LL(0x521f983a,0xebae7f17),LL(0x5292b2f1,0xdebce289),LL(0xd6d75002,0xb6cd203a),LL(0x93bfe503,0x3c3592c9),LL(0xa40b351b,0x180f5400),LL(0x9b6bafed,0x291283ae),LL(0xd4d6a9f0,0x036cf95d),L_(0x00000163),
+ LL(0x5db76801,0xa8cfa5a9),LL(0x33878665,0xa5401cc3),LL(0x809b2a4b,0x6cdc3f0e),LL(0x90d9594f,0x9bbfac67),LL(0xd551d6e9,0xfd836074),LL(0xe874e847,0x13f89d9a),LL(0x264b3b0b,0x7a6ec5fa),LL(0x0a3ac51f,0x6dd250c6),L_(0x0000001d), LL(0xa7747bde,0xd1e14aba),LL(0x7c3196ca,0x1495ef12),LL(0x78a62924,0x0cbcf8af),LL(0x1f4ded5d,0x83d56ec3),LL(0xfa54b15b,0xcc6ef029),LL(0x6f0a12c6,0xae62cc51),LL(0xce830e11,0x964fd2d0),LL(0x88747fe9,0x56076a32),L_(0x00000067),
+ LL(0x8f89c374,0xb73d3d92),LL(0xc668cfa4,0xda69c4d9),LL(0x97ee2907,0xbf4c3402),LL(0xbf5fb743,0x4034c59c),LL(0xd60ae9cd,0x99bc4b73),LL(0xda82be72,0xda1f7664),LL(0xe3800a84,0xfb007b67),LL(0xb7700f12,0xb546161e),L_(0x00000082), LL(0xd0f66b94,0x4be150bb),LL(0xfc5d0def,0x660c9122),LL(0x1ba0f43d,0x3a5b4550),LL(0x7224e926,0x33c24e5b),LL(0xba92b4ef,0xd249e1b7),LL(0x2b1856c8,0xb2c9aa15),LL(0x5fe68108,0x6e540179),LL(0x2fe766ae,0xa379f58c),L_(0x00000103),
+ LL(0x32f3278c,0x4d5341f2),LL(0xdff5ad0b,0xbb141c66),LL(0x6270a82e,0x7912e413),LL(0xfc62897d,0x6b16ad87),LL(0x348f2e6b,0x0fe7c18f),LL(0xae57af6d,0x2f22a03b),LL(0x6d2d6ab0,0xefa7a28a),LL(0xd717c3e7,0x73423958),L_(0x000001c6), LL(0xe49ed5e2,0x0b4f0f2c),LL(0x8c6c9219,0xa884b55b),LL(0xaff1be7f,0xde74b331),LL(0x8882c375,0x7a676c7d),LL(0x57c355f3,0x71190b6b),LL(0x180dbbfa,0x599b9c95),LL(0xd7dc77b1,0x8f766481),LL(0x227eba11,0x840229ee),L_(0x000000aa),
+ LL(0xa6fa0735,0x5d79f380),LL(0xaa1f8835,0xe2b5d59c),LL(0xf1a96e2b,0x281ece14),LL(0x146a87f9,0xb65f19cf),LL(0x24f845c5,0x2f123e45),LL(0x9418bddf,0x90bcee98),LL(0xb6ea99d9,0x64b9ae2d),LL(0xd147e8b2,0xda89ba61),L_(0x0000018f), LL(0x36b11956,0x53c9380f),LL(0x31e35563,0x7d832bdb),LL(0x7117919e,0x5906fec2),LL(0xbdd97ce8,0x069087de),LL(0x015486f6,0x866bf3e5),LL(0x909fd1d8,0x1d61be88),LL(0x770d7f9e,0xa28b013b),LL(0xe7653682,0xddec12fa),L_(0x00000060),
+ LL(0x37b31659,0x38819383),LL(0x0ad9906f,0x9f83225e),LL(0x089577d6,0x8e97694b),LL(0x264428ce,0x0c33baa6),LL(0x1bf2f80c,0x0823ef0c),LL(0xbf31819a,0x2e4750ee),LL(0x66c7b596,0xd160d5df),LL(0x886455a6,0x575835ea),L_(0x00000070), LL(0x2fd22a9f,0x3c424c86),LL(0x240ffedb,0xd1be1d89),LL(0x3c874c88,0xed147fb3),LL(0xccd38c51,0xbbd7bef5),LL(0x10af1392,0x101c8dcb),LL(0xd85a000f,0x018793c4),LL(0x0b435263,0x24305a2a),LL(0x989d12cc,0x9c061ca0),L_(0x0000013e),
+ LL(0xef0eb1ed,0x9a069590),LL(0x8dfc3414,0x1912aeb6),LL(0x0b37df44,0x1e30b3df),LL(0xcbe1989a,0xaf9f97dc),LL(0x415de022,0x4e406185),LL(0x01cb0277,0x2eb58373),LL(0xbb545160,0x0ab0a19c),LL(0x1e53639f,0xeecdb49f),L_(0x00000169), LL(0xcd8e8ac0,0x2a5d2526),LL(0x8e8397e0,0xa679b16d),LL(0x44c0a296,0x7dcafbf3),LL(0xee3f4022,0x668a1c15),LL(0x2ca74425,0xea786663),LL(0x4906d981,0xda4fa2cc),LL(0x0bbbb1fb,0x21224a70),LL(0x8859a117,0x8ec6a6f4),L_(0x000001ec),
+ LL(0x3de6fe08,0xf1507b4b),LL(0x4574b533,0xb56c3906),LL(0x76eaa707,0xa9532376),LL(0x16e5e98a,0x611c9b67),LL(0x12d9a934,0x9eb6a261),LL(0x8430b478,0x3fab6e06),LL(0x50fd9610,0xd215cdde),LL(0x1d509b62,0xc4da786d),L_(0x000000b7), LL(0x6e4be0a7,0x752a0af8),LL(0x3ebf635e,0x680f5838),LL(0x9175f3f7,0x9f1a0d87),LL(0x861b999d,0x04cce1e2),LL(0x75ef231f,0xe86e6afd),LL(0xaf7240e6,0x04734476),LL(0xe887f56c,0x2837e095),LL(0xc194ba35,0x9e3dc524),L_(0x00000146),
+ LL(0xcb011cc2,0x9a9802d3),LL(0x4d7d0f39,0x0345d8d7),LL(0x5e5fc037,0x6923910c),LL(0x0187070a,0x5e15ce92),LL(0x3e13ac42,0x456e81c2),LL(0xcc3c7cbf,0xfc527716),LL(0xcd65b4f8,0x5fd7c9e9),LL(0x305c5c1a,0x4af9f3b6),L_(0x000000a4), LL(0x3a78773a,0x1b64c99c),LL(0xc01b599b,0x38f68420),LL(0x53fbc68b,0x1b40d8c5),LL(0x91c4f402,0xe87107e9),LL(0x0e78fd77,0x96fc64fc),LL(0xf13016cf,0x438fbd69),LL(0x59324677,0xa8e5ff95),LL(0x50792eee,0xb6a73a20),L_(0x0000015c),
+ LL(0xb5b9e0e4,0xb1979059),LL(0xaa4d1038,0xf13725c9),LL(0x5751fd0c,0x22f3e709),LL(0xe1b98f3c,0x131dbcec),LL(0x8e66976f,0x64116cc1),LL(0x2dc36526,0xf955db38),LL(0x6f94eedc,0x6bee8490),LL(0x2dc08c31,0x65ce87a2),L_(0x000000c0), LL(0x96bd706c,0xf8a59cff),LL(0x9035a740,0x328c1388),LL(0x61a4c1b8,0x1625b5b4),LL(0x8b1931b4,0xf35b9bbd),LL(0x075bce63,0xfb1707dd),LL(0x7a601744,0x232aecf6),LL(0x50241612,0xa974c9fd),LL(0xf1cae8d5,0x7f4ba9ea),L_(0x00000036),
+ LL(0xbe01288f,0xe7c06e65),LL(0xa5756aa5,0xd57f322c),LL(0xc48c9811,0xd934c78f),LL(0xf0128bf0,0x15f53184),LL(0xd880ad31,0xadaedd19),LL(0x967dfa08,0x374ad4e4),LL(0x94c0e608,0x389863cb),LL(0xcecf2255,0xe582d71f),L_(0x000000ed), LL(0x45e5581f,0x5b089de0),LL(0xef23aed0,0x89f1eb4b),LL(0xb93d3851,0x8967136f),LL(0x4daacc4f,0x2482bd87),LL(0xd7b99516,0x8a382f79),LL(0x404615c9,0x9daadb4f),LL(0x114144be,0xd38bfc82),LL(0x173ad4ab,0x7f91ad71),L_(0x00000042),
+ LL(0x4b16b686,0xa28a3c93),LL(0x299c2c3f,0xf2024c1b),LL(0x63be4df6,0xcbefbff9),LL(0x39510e86,0xe4d80ac6),LL(0xf1d2f2e9,0x8653ba64),LL(0x0165880a,0xd4fac73e),LL(0x73ce1252,0x67da578f),LL(0xeb225590,0xc1817050),L_(0x000001bb), LL(0x235f9feb,0xdc671b44),LL(0xa93c7bda,0x82c05dfc),LL(0xcb77f18a,0xaea605e9),LL(0x1df6368b,0x295e78ce),LL(0x67c3474a,0x93547410),LL(0x18ce6948,0x7dc8108a),LL(0x7c67eccb,0x8d3a8c61),LL(0x67a75d98,0xbd7b3b73),L_(0x0000002e),
+ LL(0x4238f2fc,0xaca4c347),LL(0x9fc92c8d,0x994543ca),LL(0xc6ad228f,0xb218a1c0),LL(0xc58614eb,0x527974b7),LL(0x6ca62054,0x85ffca1f),LL(0xc2129ab9,0xc6c14b3f),LL(0x019b6e5f,0x2ae678d2),LL(0x1e22f90d,0x5b3ee46c),L_(0x00000046), LL(0x8e533ac3,0xd3c4dd26),LL(0x4e855850,0x74af7741),LL(0xf226ab4a,0xe0d7e588),LL(0x332581f0,0xe826c3d6),LL(0x4284a728,0xcdf777fd),LL(0x6bfcaba8,0x5a83f0b7),LL(0x6ddf35c7,0x2fbd194d),LL(0x212fa0d3,0x072b793f),L_(0x00000049),
+ LL(0x0ef3997d,0x9d02c3bc),LL(0xb7ec87d2,0xe0887e3d),LL(0xb3caff01,0x4d1f3674),LL(0x567cdbdc,0x39e61184),LL(0x3d19e2c3,0xbe0de4f9),LL(0x0c3139a2,0x500e0978),LL(0x7ba6031f,0x6f3470b9),LL(0xf8e9a69a,0x65297bad),L_(0x00000159), LL(0xb53b49bc,0xc7bd9625),LL(0x69eb8288,0xe4ec65aa),LL(0x281d3a84,0x2c8f25ab),LL(0x27426301,0x97e61a91),LL(0x3672bc0b,0x95476b11),LL(0xbfd7d2dd,0xbff37ddc),LL(0x918c4eae,0x82eea309),LL(0xbd19084d,0x26d27fb7),L_(0x000000af),
+ LL(0x97ab40fc,0xe6cbd721),LL(0x4a4ba674,0xc27ec19d),LL(0xf1234a47,0x16a6532d),LL(0x3cf8bf88,0xe2dbe535),LL(0xbc4dc6be,0x948616ba),LL(0x46216f90,0x76d1a242),LL(0x02af6244,0xd5de4770),LL(0xd85e1029,0x7fda32cb),L_(0x000001f1), LL(0xa684ba28,0x34f944fd),LL(0x944544cd,0x0193b124),LL(0x72b4685a,0xe7601697),LL(0x6ec14591,0x9572360e),LL(0x2184e096,0xffc7295c),LL(0x9127a0f3,0x844306ef),LL(0x818c91ad,0xf603be79),LL(0x81b486bc,0xc1bd26da),L_(0x0000014f),
+ LL(0x4a982652,0x3c726e7d),LL(0x7d1e874b,0xa513da39),LL(0x8c78c755,0x92677915),LL(0xe62fef13,0xe9e24f3a),LL(0x3d1cf9e1,0xd96cf621),LL(0xf503d4fc,0x0e1204b1),LL(0xf07e39bb,0x71958180),LL(0x7a406c60,0x3b7b9a61),L_(0x0000006d), LL(0x35ac9c86,0xcdb43a8c),LL(0xf37f3857,0xed377a92),LL(0x8ae49b6b,0x0827d789),LL(0xbd50e338,0xdeff6865),LL(0xfdb287e2,0xe758e466),LL(0xa0c560a0,0x54321f3b),LL(0xb418a264,0xd44767fd),LL(0xfaaa26f5,0xcc7b7f8b),L_(0x00000136),
+},
+/* digit=14 base_pwr=2^70 */
+{
+ LL(0xf16a4fbf,0x580dde02),LL(0x814d149b,0xeaa3b1ca),LL(0x3cc8c599,0x43a45440),LL(0xc98d833d,0xdba29de3),LL(0x6e31f2af,0xab2ff205),LL(0xf81e95cb,0xb530ab3b),LL(0x49419f19,0x8a6e1bb6),LL(0xd0585b64,0x1dfbba1e),L_(0x000001f1), LL(0x6bc60cfa,0x2b473469),LL(0xc0250d4a,0xb9f4e199),LL(0xd4759758,0x326d4e2a),LL(0xc32f68bc,0xa78113ab),LL(0x840b01ce,0xcd248f92),LL(0xbd87644a,0xa8d8d61e),LL(0xe9a32d38,0x58a69c2a),LL(0x6a0c706b,0xf4b942e1),L_(0x00000161),
+ LL(0xb0a85bf9,0x538c7fcc),LL(0xff198eec,0x4ec043bd),LL(0x29ee8af8,0x125b846f),LL(0xd01572ea,0x280cfc9e),LL(0x4ba80325,0x3f73f265),LL(0x57e3b7be,0x6bcaffbf),LL(0xf83701a2,0x1a2d3724),LL(0x19d20a25,0x410f80b3),L_(0x000001ec), LL(0xdc0e5194,0x3b961197),LL(0xc136f93b,0xc26463d8),LL(0x000ba8d6,0x8d99824e),LL(0x0e084f84,0xcfbb42b2),LL(0x81fef33f,0x138715f7),LL(0x48ed1078,0xca7dbdd0),LL(0x42869724,0x3c66b900),LL(0xcfde2c20,0x89fab2c4),L_(0x00000104),
+ LL(0xf7cac6a0,0xaf4c0100),LL(0xca7c1c9b,0xd05a1cfa),LL(0x096b7d5f,0x5e939f07),LL(0xc34c35b1,0x11a408f8),LL(0xef94d03f,0x9c1a3053),LL(0xa610576b,0x89fbfdb7),LL(0xce4bec40,0xabf93595),LL(0x66023f5e,0xc5d43f87),L_(0x000000aa), LL(0x2f2e5545,0xa58413e1),LL(0xcbfb3671,0x1874038a),LL(0xd3ca207c,0xb2e8a04a),LL(0xccca2442,0x3073c925),LL(0x3c9baa99,0x554b9664),LL(0x6d9e1787,0x70e99ee9),LL(0x874df9a7,0x312bf341),LL(0x1b8e89dd,0xfdf17994),L_(0x000001a7),
+ LL(0x7aa46ca1,0x5838bb0c),LL(0xad2e37a1,0x5a28cd2c),LL(0x54d33ad6,0xd4f1caa9),LL(0x44b04b20,0x80e4c9d2),LL(0x8c65ceb1,0x370a13f5),LL(0xecff016c,0xee758816),LL(0x6ad260ae,0x95c36fe1),LL(0xbbdbb7b5,0x4d06dfe8),L_(0x00000094), LL(0x78399219,0xf5c325d6),LL(0x955c2a22,0x79a376a5),LL(0x16640925,0xf8e9390b),LL(0x36b3aac4,0x2a8dbf22),LL(0x034f2b72,0x77b02d94),LL(0xd5de86b9,0x729cfcd8),LL(0xa8bc9f80,0xbe296bcf),LL(0x1dbcbc03,0xec1469f1),L_(0x00000164),
+ LL(0x6a57e8a6,0x4141a618),LL(0xa7081b57,0x51abc1ef),LL(0x738c30ac,0xb0cb69e4),LL(0x731cd9ef,0x9b0b0c3b),LL(0xf0dc5cc9,0x40e54a92),LL(0xfba2bbb5,0x0dee7871),LL(0x5ee7b5d3,0x540e5eaf),LL(0xad1a2eba,0x7c44af5d),L_(0x000001da), LL(0x235257d1,0x451af808),LL(0x1bf41212,0xacac98b3),LL(0xd6076452,0xed40fc8f),LL(0x868d93c4,0xb7246c52),LL(0xab7c14c6,0x36bab138),LL(0x789fa296,0x330e1a06),LL(0x88e8110a,0x5dbf4ce1),LL(0xff782421,0x9cabebe8),L_(0x0000018f),
+ LL(0x3aa4041a,0xbf3ef154),LL(0x0cb92f46,0x47026a02),LL(0xe21fd797,0x1dec53c2),LL(0x0b5a2b41,0xcfbf686e),LL(0xdb7c6dc9,0xd6d5c0b4),LL(0xb4a8866b,0xf8283374),LL(0x14d9e7f9,0x4dd48282),LL(0xffba2822,0xf9de17db),L_(0x00000094), LL(0x19ce594f,0x1814c604),LL(0xbe3bf885,0x12bae7dc),LL(0xdf04c3eb,0xe8ee1061),LL(0xc658c3bb,0x8d34f043),LL(0x47642843,0x2916bbb3),LL(0xedee7c23,0x70f93acd),LL(0xc93b4f5c,0x187bf7ea),LL(0x75348b4d,0xffda6e9d),L_(0x000000eb),
+ LL(0x9c49db1a,0xc855134e),LL(0xdd4ae89b,0x30b7a1ad),LL(0xd9dc0b8c,0xbee0416e),LL(0x67e1dcbc,0x66147ae2),LL(0x7907e5e7,0xb9dea373),LL(0x537d932f,0xf4450461),LL(0x8d5aa671,0x7b0644e6),LL(0x33269776,0x835848af),L_(0x00000089), LL(0xfbbaf49b,0xfdca2fb9),LL(0x400c0893,0xe36e56e3),LL(0x095f6119,0xaaeab6ef),LL(0x07fda371,0xfdbbf61e),LL(0x51034096,0x65d823d3),LL(0xc5284f49,0xcec7f701),LL(0x00cca32d,0x443cce6e),LL(0x13b673ca,0x7c7c1332),L_(0x00000150),
+ LL(0xaa83f580,0x5f48e2fc),LL(0xfafcc610,0x2c5d9495),LL(0xd34073fc,0x321d1a08),LL(0x30442510,0x3427742e),LL(0x8068ffd8,0x2ec5f97b),LL(0xa7faa8a5,0xac14530d),LL(0x5d010e52,0xf277a140),LL(0x3edf5701,0xcdd53228),L_(0x000000ea), LL(0xb172daf2,0xf8f566cb),LL(0x51771845,0xa7b0e50c),LL(0x66aafeee,0x81cf4ee6),LL(0x8fd52580,0x1bc2c6ec),LL(0x232a19c7,0x6790d250),LL(0xd4c06ab2,0xdc4411be),LL(0xacd06e0b,0xe0fd2a20),LL(0x19734273,0xc9fb738a),L_(0x000001c1),
+ LL(0x4d908e20,0x2c36a49c),LL(0x346bc599,0xb17c0c24),LL(0x4349ec6d,0x1994a52e),LL(0xc574a60f,0x479b18ee),LL(0x2cf1156f,0x00b04364),LL(0x587d6a8b,0xe20999e4),LL(0xb840bbc5,0xdfbaad24),LL(0x1056fcbe,0xb84e8539),L_(0x00000015), LL(0x182e14f7,0x34b3807b),LL(0xc83300dc,0xcbae472d),LL(0xff64a1e1,0x60ef1e86),LL(0x1368c7ee,0xfa9cecf9),LL(0x1a548595,0x12c62bf5),LL(0xbab6253e,0xc9541d0a),LL(0x2d9ef7be,0x1e1f27f7),LL(0x956cff19,0xba2813eb),L_(0x000000af),
+ LL(0x7ab859d4,0xdb558004),LL(0xce8d95f8,0x9dc5e59e),LL(0xf1893cb5,0xa7cb9fd4),LL(0x77041349,0x53461897),LL(0xb8f3b00e,0x4b8c1719),LL(0x3acc8d5e,0xe436769f),LL(0x2b51a3ea,0x15adc570),LL(0x5fa4c1f5,0x93a4046f),L_(0x00000081), LL(0x605a315b,0xc6ca2c5f),LL(0x8e92a20f,0xe70ae728),LL(0x9e74b9b9,0x6d7cbd1a),LL(0x8837144f,0x797825f3),LL(0xa10a4e2b,0xd3f2260a),LL(0xbce98f37,0x3d85debd),LL(0x39cb6f79,0xa763a30e),LL(0xb1f85a09,0x15a4a3f3),L_(0x000001b8),
+ LL(0xb955d85a,0x4df25f56),LL(0xf82561fb,0x9e75f649),LL(0x8c808470,0xd7751a0f),LL(0x0c1dcee3,0x4322644e),LL(0xf53e90ce,0xd68db21e),LL(0x8f8d9278,0x72d07c10),LL(0x94db3061,0x821b176c),LL(0x2c56677c,0x51fa088e),L_(0x000001b6), LL(0xa05bed3e,0xbd496ef4),LL(0x2f3203c7,0x702f0af9),LL(0xf4ee87af,0xdeead7f4),LL(0x1e240ba2,0x6ba4a666),LL(0x45c6b9bc,0x5b558a22),LL(0x69826d07,0x82f16b78),LL(0x1d474e7f,0x1b099f67),LL(0x6f9ab8f0,0x79936b07),L_(0x000000d3),
+ LL(0xab96e691,0xdcb6ef22),LL(0x8cd18dc5,0x4111e26b),LL(0x563a07bc,0x3482455e),LL(0x0e2f7391,0xcb5ec4ad),LL(0x21483bed,0xc0caacaf),LL(0xa5a48441,0xc9e80f16),LL(0xbffbf280,0x90242b85),LL(0x91f37a76,0xd9544186),L_(0x000000ee), LL(0x1428479a,0xa766d6e3),LL(0xfc4b8794,0x38293f47),LL(0xa81360ec,0x31e9f867),LL(0xbe34d77d,0xdb92af31),LL(0x882df842,0xcd799976),LL(0xd34a906c,0xabb505dd),LL(0x961ddfb3,0xa3a37b0b),LL(0x4fbbb326,0xf7af85a7),L_(0x000001d4),
+ LL(0x1e66664b,0xbb0940d9),LL(0x3d70435a,0xff491b63),LL(0x1eb2a685,0x22d3c808),LL(0xa380de6e,0x17e44c8f),LL(0xd9df636d,0x2a35379f),LL(0xa903bf9f,0x0f809249),LL(0x387b8a0a,0xabe12175),LL(0x44dbe0cd,0xfd759d00),L_(0x00000123), LL(0x80918078,0x98196ddd),LL(0x019c1122,0x84c5a37e),LL(0x254adbe9,0x3981a4ac),LL(0xbfc928a2,0x62436eb9),LL(0x7ad29c64,0xc99f2914),LL(0x2cc9ceca,0x2f0c2529),LL(0x2d8109c3,0xbda5dcc9),LL(0xe65ae3c9,0x27c8461f),L_(0x0000014c),
+ LL(0xd774b2bc,0x7f2f4a50),LL(0xdb205fa6,0x977d6dff),LL(0xb6a346a4,0x39b1aa2b),LL(0xc02f5c26,0x6d520bed),LL(0x7e9b3df6,0x9fe2d1ad),LL(0x8060eb41,0xffe8b3d8),LL(0x8de43158,0x6b78c0bc),LL(0xe900b6ef,0xba5607f9),L_(0x00000027), LL(0x1979ffd7,0x656a0930),LL(0xe37eeb37,0xf82e5547),LL(0x817b9a2b,0xebe57826),LL(0x966c6b06,0xd17239c5),LL(0x0d566764,0xb6e7e211),LL(0xb736c18d,0x67f60fe4),LL(0x7f6de467,0x91c330d3),LL(0xdf003076,0x6fe1ff1d),L_(0x00000038),
+ LL(0xd1c84dca,0xa38e4c83),LL(0xee75b3b5,0x42633219),LL(0x96b76b44,0xa702e22d),LL(0xce624bec,0x45df636e),LL(0x087dc34c,0x00b8ab39),LL(0x7c3b41a0,0xa4c92149),LL(0xbe1f412c,0xc186c0a7),LL(0xa0e6b72f,0x6f9b9c73),L_(0x0000015c), LL(0x5b6e29ff,0x6d958194),LL(0xfceeca76,0xc25f90a1),LL(0xd246f978,0xf7a79529),LL(0x5bdce3f4,0x202fdba0),LL(0x4516ada4,0x9ccb5769),LL(0x22fea769,0x35cd1aca),LL(0x9d5e791d,0x72d93ad7),LL(0x89481217,0xd00224e0),L_(0x000001d6),
+ LL(0x4b1bfc3c,0x0b6d183b),LL(0xcdd1f50d,0x88770143),LL(0x721cf9d0,0xd247118a),LL(0x5a8338fa,0xfa498ee5),LL(0x33ff454e,0xa8d98087),LL(0x2107a954,0x4eaefaa7),LL(0x39298606,0xc385af5a),LL(0x3e0c503b,0xfc7e0cec),L_(0x0000015c), LL(0x3ea50970,0xa2f6c113),LL(0xbf161ebf,0x48b5f685),LL(0xbb087e9c,0x58eb481e),LL(0x3b7987c9,0xa465a54c),LL(0x6e92e01e,0xa8194344),LL(0x1e66d88b,0xb0c7a894),LL(0x40dc6c71,0x690cafad),LL(0x057f59a3,0xf02679ac),L_(0x00000130),
+},
+/* digit=15 base_pwr=2^75 */
+{
+ LL(0x9682d5c5,0x3a007995),LL(0x19e3233b,0xcd545767),LL(0xc78c2194,0xc744ff86),LL(0x789e51d3,0xafacd6dd),LL(0x7a5cd253,0x398cb1ba),LL(0x18b56085,0x273c4fb9),LL(0xff1bce38,0x0ba240c9),LL(0xbca7efa9,0x3bb2e372),L_(0x000001a7), LL(0x353d398f,0x563a114b),LL(0xf4adbd1d,0x90284d2d),LL(0xe9ad940e,0xe3af63ef),LL(0x61ffca7f,0x96feaa4e),LL(0xba0669de,0xdbf94ff4),LL(0xd7b8471a,0x696c5279),LL(0x1dda976e,0x0a229117),LL(0x1566b880,0xba44b588),L_(0x0000015f),
+ LL(0x317311c8,0x29b896b5),LL(0x025efc3b,0x60e34ccb),LL(0xbcd9f85c,0xae29c1d9),LL(0x1e85f821,0x3dcc6356),LL(0x27219e29,0x3f95824c),LL(0x9e01039f,0xd3a9843c),LL(0x8ef0f79f,0xbba44b84),LL(0x9cddb5a3,0xf0a7f537),L_(0x00000011), LL(0x97dedd3c,0xd40be315),LL(0x0d73669d,0x0706daaa),LL(0x90c605d6,0x262a826a),LL(0x2e67d62f,0x90997b0e),LL(0x5ac29c5e,0xa4dc7322),LL(0x9728fe4c,0x46c28be3),LL(0x8656b7a7,0xcf46a3d3),LL(0x318bd5a3,0x0c58ac70),L_(0x0000000a),
+ LL(0xc8e39791,0xd012d32d),LL(0xb1701460,0x36257f7f),LL(0x712c0989,0xbc1511ff),LL(0x948635e7,0x929c254b),LL(0x950b6b9e,0x88fae008),LL(0xc1ebc649,0xb35e21c2),LL(0x69de590b,0x0c8fd948),LL(0xc534704d,0x03df94d1),L_(0x0000009f), LL(0x7d20c84c,0x417e1367),LL(0xbe538962,0xbaa7a81a),LL(0x6d9ba3b4,0x085df8a2),LL(0x72446606,0xc1a4f077),LL(0x313aa0fe,0x443486a7),LL(0x310facd1,0x4bb29bc8),LL(0xe7424659,0x70dbb24c),LL(0x7a208944,0x2ddd11bb),L_(0x0000016b),
+ LL(0xe96cd1b5,0x5370e2b4),LL(0xa39d68ac,0x0b26e23e),LL(0xf98a9904,0xbe557ba1),LL(0xcef362a9,0x202765cc),LL(0xa7731e3c,0xa726d7b5),LL(0xcd815e2b,0x1c25faf8),LL(0xa6579cd9,0xdafb2e8b),LL(0xc5ec8fb3,0x648049fa),L_(0x000000f4), LL(0x452046ec,0xa04b6251),LL(0x96110b89,0xd1ddccb2),LL(0x551f88c9,0x0f26d015),LL(0x9b8bbb0b,0xb5bd39d3),LL(0x9d52ffc2,0x2dc18ef7),LL(0xab6d006e,0x142fb527),LL(0x804f61d0,0x391511fa),LL(0x9dbe5992,0xa3e717ea),L_(0x00000015),
+ LL(0xc1cd48d7,0x9289c640),LL(0x6b7a800c,0xc76b2795),LL(0x581d42f0,0x8ca1e81a),LL(0x4472a2fa,0xbf4b6019),LL(0x6715dfdd,0xb304a936),LL(0xf9366e36,0x391be48c),LL(0x81f74b90,0x6151e36b),LL(0xd32b6b20,0xc48b79a5),L_(0x000000a9), LL(0x366ec558,0x831e89ed),LL(0xfa6f04fa,0x5ebcfa5b),LL(0xec4ecc3d,0x6b2117a0),LL(0x7b376a81,0x90bf1080),LL(0xba3f0166,0x0993a607),LL(0xaf14e2f1,0x8cf72c90),LL(0xef21c633,0xd173a6d3),LL(0x187451c2,0x13ec5f08),L_(0x00000011),
+ LL(0xc5533330,0x0f29eadd),LL(0x246b16c2,0x9b833212),LL(0x9da31a63,0x297cf150),LL(0x4995a63d,0x90a2a3a8),LL(0x26054531,0x22ca8af6),LL(0x0cdf918d,0x62531849),LL(0xa5ed4b64,0x7ca9de65),LL(0xfa4fec38,0x72b35acf),L_(0x0000010b), LL(0x23d78ecb,0xf96d539b),LL(0x221e3646,0x256f3a4b),LL(0xb6bf83af,0xc408a90f),LL(0x7abd62f0,0xaefff14a),LL(0x4069cdfd,0xae41ce0c),LL(0x29824953,0xb47d1cba),LL(0xa382ab7e,0x9eb440b7),LL(0x957f6459,0x4c148b60),L_(0x0000014a),
+ LL(0x6b05018a,0x1086c5f8),LL(0x26130fe0,0x7b4b2e70),LL(0x68d46ff5,0x0c407c0a),LL(0x3b8c39a0,0x88577dcf),LL(0x6dc35106,0x5dafbff6),LL(0x66c847b2,0x2d675f1f),LL(0x17ebe229,0x834c9c2b),LL(0x7dd924e2,0xd5b6edf6),L_(0x0000008b), LL(0x62687b75,0xf96321d7),LL(0x6f67acfa,0x9437a2b2),LL(0xf66029f2,0xe7b46c71),LL(0x329167d4,0xb24e796b),LL(0xcf0f34c3,0x9d6e95b5),LL(0x4f9e7abb,0xcb817cb5),LL(0xb5258968,0xe5382677),LL(0xb89d3951,0xb2e2fb7f),L_(0x00000008),
+ LL(0x85caa712,0xe65a160c),LL(0x79edff6b,0x1ae3af0e),LL(0x7704970c,0x8b957c42),LL(0xb8aa395f,0x5f0f181e),LL(0xbdf3d6c8,0xe7d8f529),LL(0x4e626c58,0xd83fd353),LL(0x770dabfa,0xe5ada98c),LL(0xac3e65d7,0x6430730b),L_(0x00000167), LL(0x73fcec9a,0x09d0476d),LL(0x4dcf97c3,0xab9b5d71),LL(0xa56a3252,0x9648c08c),LL(0xff297fc7,0x897ba609),LL(0xff84306b,0x4c446a06),LL(0xddb64374,0xbc202d01),LL(0x97ee1218,0xf9b0f80f),LL(0xf048db33,0xb5f54bb8),L_(0x000001e8),
+ LL(0xcc962077,0xa010dba8),LL(0xa2fb38a6,0x31feab78),LL(0x36899fbf,0xacceb7c2),LL(0x5bdd898c,0x14de8e04),LL(0xe42d5076,0x459ea861),LL(0xe51c21c6,0xfbda1b0c),LL(0xdc95445c,0xa7d4e38e),LL(0x7947f71f,0xadcd66a5),L_(0x00000160), LL(0xcc6a9c26,0xdcdf5f99),LL(0xf1467b2f,0x2de2bfcc),LL(0x9c1ae772,0xd43f04fe),LL(0x41471183,0x043333f6),LL(0xc9a3cf00,0xf1a6e8cb),LL(0x7cc8a0c7,0xa8c3f924),LL(0x74a1cf04,0x828052df),LL(0x8be5596b,0x50a45820),L_(0x0000000f),
+ LL(0xfbb80d1a,0xe9851bfc),LL(0x51c40077,0xbfe0982b),LL(0x87cd565d,0xd372a1cb),LL(0xccd954bd,0xbbff7b4d),LL(0x294b36f6,0x8237c51d),LL(0x4ce0f879,0x261403d6),LL(0x569d6e3c,0xb79e0e60),LL(0xeba6224f,0xc33dd3b5),L_(0x000000d7), LL(0x5a9cfa17,0xaaf054ad),LL(0x5f93dace,0x160bbbee),LL(0x8aa260aa,0xa9f4b722),LL(0xb1b5025d,0x817d1e67),LL(0x81308a04,0xfe002797),LL(0x4afd2f00,0x680cc208),LL(0x154f68e6,0xd4b7eccc),LL(0x4cc6b0f1,0xb8976118),L_(0x000001e2),
+ LL(0xc8be5e5b,0x7283e8a9),LL(0x8ab94a45,0x0bb733f0),LL(0x642a6645,0x41a534e8),LL(0x57ae42c1,0xd4abc981),LL(0x8be6ea3e,0x7e62f50a),LL(0xb3f01b7e,0x98a38cc8),LL(0x8865f98b,0x7862605c),LL(0xf1a738cf,0xde02b3ce),L_(0x0000000e), LL(0xbe15c345,0xbb74e488),LL(0xc6aa6ad4,0xf6d314f3),LL(0x1691860c,0x97214287),LL(0x625fd28f,0xab878ce4),LL(0xd6ea61fb,0x8ebed709),LL(0x5a22486f,0x6db8fc6f),LL(0x0b71449e,0x46c06119),LL(0x0e8cd622,0xe44026c8),L_(0x000001c7),
+ LL(0x2b9ea684,0xab7fbeff),LL(0x954c6cef,0x7291b35c),LL(0x062277d6,0x7553137c),LL(0xaf482063,0xb75730d8),LL(0x710c68e8,0xb68d2250),LL(0xbae3e7c1,0xff637a2f),LL(0x6b643e1a,0x1ef002bf),LL(0xdcdc4699,0x38ab4582),L_(0x0000016e), LL(0x0f3758df,0x92bea0d8),LL(0x899ee626,0x4d7631d6),LL(0xcdd2a79a,0x2ee3aea9),LL(0x8162f50f,0x1476eea0),LL(0xc4d433fb,0x27c81475),LL(0xe8214237,0xdc969d9f),LL(0x56c76934,0x6d918c87),LL(0x7533eb08,0x56d2a891),L_(0x00000030),
+ LL(0xadf83954,0x1b47da4b),LL(0x8a8331e9,0x49ed1362),LL(0x59fa2b27,0x418a7189),LL(0xe8454c56,0xf46859d8),LL(0xb777077d,0xdf895326),LL(0xa1ecfc76,0x7c0bff3a),LL(0xa0d40120,0x4dc72f6f),LL(0x863ee5b0,0x6d7d35d2),L_(0x000001db), LL(0xbc4e28c1,0x51536aa9),LL(0x797cc189,0x992a786b),LL(0x424d6c36,0x0bb1db2f),LL(0x7b4a72f0,0x99596f48),LL(0xd38d470a,0x7d9d8119),LL(0xed3220cb,0x7fe52443),LL(0xd0f7efd8,0xf334c76a),LL(0x5b52a8c0,0x289cf254),L_(0x00000182),
+ LL(0x496fb553,0x50ef0de9),LL(0x06fa762c,0xf226f768),LL(0x770bcaf6,0x47cff6b0),LL(0xec1a0d3e,0xb780ef8c),LL(0x49872a4e,0x434df874),LL(0x82a505c8,0xfc298963),LL(0x6b56a94d,0xc037f2d4),LL(0x1721c7a5,0xef98ff94),L_(0x00000059), LL(0x5289072e,0xce001c93),LL(0x229e4010,0xb7710f4a),LL(0xb1be023a,0x4f780b68),LL(0x37373fb4,0x44ddc611),LL(0xb6129029,0xeba09ab8),LL(0x3d4bb157,0x52d1be00),LL(0x7557730f,0x5d184bff),LL(0x79506c27,0xabea8b49),L_(0x00000057),
+ LL(0x59ac2268,0x475e54a3),LL(0xe76ea216,0x641b111e),LL(0xe7b2f367,0x11e8b8cf),LL(0xaa1845af,0x3e44ec0e),LL(0x634d35d6,0xd9e05b86),LL(0x9fef6a5e,0xa66acc79),LL(0x6151a902,0xc7fadad6),LL(0x95ee0cab,0x4f71151e),L_(0x000000c7), LL(0xa387fffe,0xc47ffd5b),LL(0xd5a7577a,0xa66a5bd1),LL(0x1bbdd68c,0x1a4070bb),LL(0xafa4a6f8,0xb0f9b28c),LL(0x67075086,0x966afc2e),LL(0x63512dbd,0xed5912ae),LL(0x8f26597d,0xd092a281),LL(0xa415f451,0xc2ef31e4),L_(0x0000003e),
+ LL(0xfadaa485,0x4e004498),LL(0xbea3c389,0xaa39f9d0),LL(0xa8f46458,0x0b3654a0),LL(0xf830008b,0x4cd7392b),LL(0xa46a22ca,0xb12eb97a),LL(0x80e1d7af,0xd888b9cb),LL(0xf74c8adc,0xbb6e179c),LL(0x73b51d04,0x968eb224),L_(0x00000150), LL(0xd8317561,0x51f96d03),LL(0x9de9e100,0xfade3749),LL(0xecddcd4f,0xfc72771e),LL(0x7aa9dbdf,0x5e1bb964),LL(0xdc24156b,0xbaddb508),LL(0x0de78eea,0x6facddf4),LL(0xb1c48894,0x4a964d6a),LL(0x49c82382,0x6f258c87),L_(0x000001b1),
+},
+/* digit=16 base_pwr=2^80 */
+{
+ LL(0x53fa611d,0x32cc508d),LL(0xcd408945,0x60b1057f),LL(0xf3eb54e9,0x77d231ff),LL(0xbd6ea408,0xe5110313),LL(0xb9ee8343,0x85209f6e),LL(0x64924e77,0xe7fa5897),LL(0x32e258b2,0x618a6eb3),LL(0x11e2e038,0x96067c35),L_(0x000000af), LL(0x15c8ff41,0x0f221560),LL(0xef974e44,0xa1b7a3a0),LL(0x8ea1f931,0x72932b48),LL(0x720e4174,0xbb75d745),LL(0x1bf9c803,0x996758e5),LL(0x7f0b3909,0x8d83f97c),LL(0x39d56a48,0x1fac932b),LL(0x55fe1ded,0xaaf43ccf),L_(0x00000199),
+ LL(0x4f73774f,0x6ffb7834),LL(0xad3e7387,0xd3158a49),LL(0x8771e37a,0xb98ec469),LL(0x6f103f2c,0x1bd53110),LL(0xf8325af3,0xa434959f),LL(0xe47f875b,0xa10264ee),LL(0xcf224bc0,0x9ccf2f61),LL(0x337d33a1,0x86ce6031),L_(0x00000121), LL(0x28697730,0x6706e91f),LL(0x9179c5ea,0x79ba3023),LL(0x9aa4ed38,0x7e239f26),LL(0xaa83eb97,0xef091443),LL(0x82853a90,0x336fc4d2),LL(0x2b260d34,0x56b3a0bb),LL(0x119fbd07,0xe0f16198),LL(0x3453a3a6,0xa2af0802),L_(0x00000016),
+ LL(0xd1fcc92a,0x8000185b),LL(0x02ebe1f2,0x3ebcda00),LL(0x30d3e5f2,0x75cccaba),LL(0x8ea9d40f,0x108edd48),LL(0x152a6563,0x6028024e),LL(0x732e422c,0x17618296),LL(0x142e6cc1,0x9dea7266),LL(0x5d4e4488,0xb05325e9),L_(0x000000d1), LL(0x40638703,0xf3270a2e),LL(0xc29b5dca,0xbad984d9),LL(0xd2f759d7,0xad7bc046),LL(0x347ff7c2,0xa4e4f59d),LL(0xc16d4c0f,0x0a06be29),LL(0x872d14ff,0x2390bb31),LL(0xb7a5b6ec,0x66be2ce2),LL(0x408ae4cc,0x6b9b1fe0),L_(0x00000100),
+ LL(0x2cfafd04,0x9cc4cee5),LL(0xa99628d5,0x4764e916),LL(0x4417813a,0x9a05da16),LL(0xe423f0c4,0x2babb644),LL(0x24dca899,0xd179a66e),LL(0x894f6883,0xc157cbef),LL(0xed7756c7,0x44c30131),LL(0xcdff08e1,0x78b0a3e9),L_(0x000000ac), LL(0x3963ba6c,0x43dabd75),LL(0xbe7ba3ec,0x93626426),LL(0xd17b8f8b,0xbfcd2a78),LL(0x486d7ac0,0xaeda53c9),LL(0xfc3c49c2,0xbc99eeae),LL(0x49fb4a9c,0x12ab3d09),LL(0xdb075628,0xc0f863b5),LL(0x3d5da4c6,0x8ec31fe4),L_(0x000001e0),
+ LL(0xf45825d6,0x098d00b0),LL(0x4acb7a91,0xf4f8175f),LL(0xfe317cf8,0xf8155d16),LL(0x2bc9a77c,0xac3ddeef),LL(0x17520bd7,0x0aeae3c4),LL(0x44ee6fbc,0x1aaae6ff),LL(0xd8c23852,0xf47bc828),LL(0x553f42c9,0xc09b26d0),L_(0x0000012f), LL(0x6897ed6a,0x9a32ac7c),LL(0xc1e669bb,0xc8aca498),LL(0x697322f4,0x43042d46),LL(0x334625a5,0xdf16aa69),LL(0x67bda03c,0xab4b67c2),LL(0x205d341f,0x83a55d6f),LL(0x05daa2bd,0xcdfd94e0),LL(0x9ac9573f,0x1cb76afe),L_(0x000000e8),
+ LL(0xe51930fc,0xf074fced),LL(0x97863b91,0xc43281c9),LL(0x92d449a3,0x7a68c2d7),LL(0x063c9119,0x3b2de0b3),LL(0x55e1666a,0xf3e7d825),LL(0xf70b4227,0x6aacf427),LL(0x6c04e18d,0xc2b9b616),LL(0xaa4c82c2,0x376fa210),L_(0x0000015a), LL(0x3a29f55c,0x27de0f4a),LL(0x63844f17,0x70941232),LL(0xfd0bec77,0x3b5f4e85),LL(0x68fe79f4,0x5cbc9a57),LL(0x826a7303,0x65bb2328),LL(0xda7d2209,0x40788a77),LL(0x6978fe42,0x14c7cf99),LL(0xc2ae1a05,0x77943ce3),L_(0x0000005e),
+ LL(0x94afc854,0xdb0d1b45),LL(0x25e9937f,0x14c566a9),LL(0xd1cf3988,0xcd250848),LL(0xcc300694,0xbfd82b6c),LL(0x135bc75f,0xa47db4ae),LL(0x8639e63f,0x2295c1f1),LL(0x30a5e5b3,0x61f91b27),LL(0x2841bb1c,0x1335383b),L_(0x00000145), LL(0xf2dca32f,0xe1df27e3),LL(0x0fb695c7,0x721a9ee4),LL(0xc8c313d1,0x267e9801),LL(0xb288bc93,0x9aafbe12),LL(0x80d7a36a,0x5e34c2b1),LL(0x5e8b79ae,0x22efe6b6),LL(0x7da7f03b,0x552e9134),LL(0xee94e563,0xab16538c),L_(0x0000014a),
+ LL(0x9e50fadd,0x336db42e),LL(0x49f7546b,0xf6900421),LL(0x57093c06,0x8e00d7d3),LL(0x8d2dbce8,0xd9ede742),LL(0xd004dc4a,0x01940521),LL(0x0d3be2ce,0xdc4ae497),LL(0x1bb5cf60,0x0a6ccb03),LL(0x803df567,0xdf04605d),L_(0x00000164), LL(0xc7d8a77c,0xa05f0fb0),LL(0x1f8ad28a,0x39d0a695),LL(0xe5b908dd,0xd67e92ff),LL(0x4165f76f,0xf281077f),LL(0xc8d52980,0xc9ee2db2),LL(0x9ff0b841,0xe792e9a0),LL(0x9a5850f2,0xd74d1fff),LL(0xdbe9887c,0x468c4978),L_(0x000001aa),
+ LL(0x1bc8e2f6,0x17cfe85b),LL(0x645a5369,0x96452c88),LL(0xfe80ed90,0xd777343c),LL(0x53d07352,0x57827fb3),LL(0xa6c3e43b,0x80b39b9b),LL(0x2a8365b0,0xaf5a3de0),LL(0xac5e9239,0x181d4337),LL(0xea4d87d6,0x51fe7247),L_(0x000000e4), LL(0xfcc2be5a,0x0dfb5a0c),LL(0x7a7e75fb,0x15428231),LL(0x5c94ba5c,0xdf444166),LL(0xc521d0ff,0x0f639c5d),LL(0x74de2e37,0xdc1e397f),LL(0xc9356e9e,0x93e3e959),LL(0x0c9e3464,0x39201886),LL(0x6a78ad71,0x2c0f3246),L_(0x00000013),
+ LL(0x41b934a0,0x9207f1ee),LL(0xc358b92f,0xcc5ec219),LL(0x085c3194,0x8df4ef1a),LL(0x71e157f1,0xb527e0ab),LL(0xdd0a2a0d,0xae481b48),LL(0x0e0efe51,0x27b717b7),LL(0x5828b573,0xc2a98225),LL(0x3d2c0ff1,0x099e23ff),L_(0x0000017e), LL(0x7c722916,0xf9a97523),LL(0x11db2059,0x5fbc6f68),LL(0x162229b6,0x08c87928),LL(0xc7000da2,0xa03b55dc),LL(0x3f37b2b0,0x03e27759),LL(0x2abf57b8,0x6d3e3a66),LL(0x3d925762,0xa5335174),LL(0xec43569d,0xb9e4cda0),L_(0x000000a8),
+ LL(0x0c0bf0ca,0x991bdfe4),LL(0x46da618a,0x0642fbf7),LL(0x2827ab9a,0xcb3c80d7),LL(0xa4c02a4a,0x24ffe39b),LL(0xdd1a385c,0x81fb1f95),LL(0x4fe48911,0x7ed78cb0),LL(0x42514e36,0x12838990),LL(0x2822adf0,0xcd6245c9),L_(0x000001af), LL(0xc2dbb25f,0x682326f4),LL(0xeadeab18,0xa6714b92),LL(0x8194d4d8,0xec34ca02),LL(0xaf1a5a6c,0x18aa0b61),LL(0x21f3603a,0xd56cb67c),LL(0x9e65c6ef,0x64df4053),LL(0x9af9ff17,0x6e1b769a),LL(0x333abb94,0xd74c3bd6),L_(0x00000157),
+ LL(0xe34d8e25,0x6b395c0b),LL(0xb5b87b52,0x48432467),LL(0x7efdcd9b,0x9d4e858e),LL(0x7c0c8922,0x30d29dcc),LL(0xd7b3a015,0xe0639cac),LL(0x02eb2112,0xa2a88900),LL(0x99cb32dd,0x5ee2bf55),LL(0xe98b88fa,0xa3323b39),L_(0x000000b7), LL(0x51e66e87,0xe5c08a49),LL(0x2cf028a4,0xf8ca8809),LL(0x62209ac3,0xfaac3cb2),LL(0x91bff5ca,0x2cd5c8b2),LL(0x2f2a80df,0x2244abea),LL(0xd2c4cfb9,0x1181848d),LL(0x345b1ca4,0xc35b7b60),LL(0x3093dc03,0x815a0c2b),L_(0x00000134),
+ LL(0x4da0913f,0x3f060a04),LL(0xc9440b7b,0xf892eb31),LL(0x8c0aafa8,0xc25c561f),LL(0xebcb8c35,0x12770520),LL(0xe63e94d2,0x6d5c16b3),LL(0x1c828d52,0x9bde42a4),LL(0xcafff93a,0x2b7abe51),LL(0xc4851b92,0xa9fcd2b9),L_(0x00000000), LL(0x573073fe,0x24e44af4),LL(0xebda81a0,0xa695bf6c),LL(0xdee85d40,0x76c43176),LL(0xf9ff0671,0x8106e3cf),LL(0x7e8060f0,0x4ce1b2a1),LL(0xa7e23360,0x81d1ed8c),LL(0xbfa62d39,0x47f7b51a),LL(0x4292ca9e,0x9139a437),L_(0x000001ba),
+ LL(0xfabf78b3,0xa65d9111),LL(0xb4e47850,0x4221510a),LL(0x7528def6,0xeca10d8d),LL(0x12fd7625,0x4560fa05),LL(0x7883ec3b,0x5c64949f),LL(0x2a961e63,0x4df0271f),LL(0x4eacd5e7,0x9af4d45b),LL(0x62f25ceb,0x9ab3bb2a),L_(0x000001e5), LL(0x198ddde1,0x92cdd0ea),LL(0x6860d474,0xae51b5ad),LL(0xc69002e2,0xccd9fe59),LL(0xe138bd08,0x00304cd8),LL(0x9ec62f95,0x329feb5b),LL(0x0928d5e4,0x8a27990e),LL(0x6d9656bc,0x0f0e6792),LL(0xb7989c9a,0x3f1c862c),L_(0x0000010e),
+ LL(0x9c0279ea,0xa5a66086),LL(0xf622c1ac,0x7ccf9bc1),LL(0x3beaf465,0xa68726c3),LL(0x900cd78d,0x2a903911),LL(0x2be1c512,0x8832203c),LL(0xa8466703,0xbf042dcb),LL(0x1301ba91,0xa8235209),LL(0xfc06ed9e,0xe1aef50a),L_(0x000000d5), LL(0xf153a82e,0x47a0b87c),LL(0x55a0038d,0x9826631d),LL(0x6ef49646,0xe8d54ad8),LL(0x53644562,0xa200feff),LL(0x773835a0,0x5c4408b1),LL(0xb6c0a0e2,0x3199aac7),LL(0x2d23ae2f,0x4f2c5a36),LL(0xdfbd8171,0xccacb296),L_(0x000000c8),
+ LL(0x568d9b42,0xcf45bc39),LL(0xbca99c74,0x16aa0dee),LL(0xae132b38,0xb713a9d8),LL(0xf8d3fb57,0x139b0131),LL(0xc38156e4,0xc42164bb),LL(0x3293d5ff,0x74da5a53),LL(0x28a54d0e,0x970fceff),LL(0x56246758,0x3ef8fd2b),L_(0x000001cb), LL(0xb3941bc5,0xa0e59886),LL(0xe1a4b217,0xaa3f69ad),LL(0x23117719,0xb7b4e45e),LL(0x118c88c1,0xf1294233),LL(0xd7dfa5c3,0xf1ed8c9d),LL(0xfa2104f8,0x22213ffa),LL(0x89ed7138,0x3ea0a97e),LL(0x2cd0f857,0xf09db9f8),L_(0x00000081),
+},
+/* digit=17 base_pwr=2^85 */
+{
+ LL(0xb1d8c85f,0x7d77d542),LL(0x6c76648a,0xa16759eb),LL(0xae9936fc,0xd9556eeb),LL(0x239c8db3,0x1fc23af7),LL(0x3df02c8f,0xd956a664),LL(0xfec894e1,0x2a0d5264),LL(0xaaa92f80,0x14a90b90),LL(0x93d756f0,0x53d197ff),L_(0x00000007), LL(0xf62d4dfe,0x06dc80b7),LL(0x026f8974,0xdd1ea5de),LL(0xbf46ad6a,0x1c416858),LL(0x8f0f1c5d,0x6b3d82ce),LL(0xf587ce4d,0xa459159d),LL(0x3b92c19a,0xb6baca47),LL(0xda5bec10,0x600af3c6),LL(0x40e0b4be,0xc81e2b9b),L_(0x000000f6),
+ LL(0x66942d96,0x7d27dadf),LL(0x34d4f088,0x4ff582d9),LL(0x24ab4a3b,0x151ee4b7),LL(0x58c8094d,0xdf116aee),LL(0x1ceee559,0x6c8ad814),LL(0xf6cc0cd1,0x3d13c277),LL(0x9d41dd2c,0x75e0cd1b),LL(0xf318d63c,0xbb0767f3),L_(0x00000006), LL(0x9ef6b69f,0x1f3f3f36),LL(0x8f1170f9,0x44906780),LL(0x6338ef63,0x7495e6b8),LL(0x66dcb459,0x3f524ab7),LL(0x7ec63428,0xfd773112),LL(0x86373e0a,0x549575be),LL(0xd2af0e3a,0x9dfc2be8),LL(0x6314c681,0xffa7af5c),L_(0x0000017a),
+ LL(0x894f83b3,0xb01c752e),LL(0x2db47294,0x8755f110),LL(0xefd03152,0x233b9d7e),LL(0x00f8e7a5,0x69c62c75),LL(0x1ee3b5dc,0x551f4471),LL(0xa5e280f0,0xc7dd9d94),LL(0x11042cd8,0x0c2167eb),LL(0xaf8b1437,0x7f4636e4),L_(0x00000180), LL(0xd4828172,0x77598691),LL(0x12f599a0,0xcf61cb84),LL(0x0459d6b4,0x6f27cc0b),LL(0x126405e2,0xbc7fdaf5),LL(0x4a3026dd,0x0cdbba7c),LL(0x658e4a3b,0x25d0b262),LL(0xf2e795bb,0xeec95e90),LL(0xc8766509,0x52259c52),L_(0x000001a4),
+ LL(0x3b0becbc,0x35410967),LL(0x88f9eb94,0x20da6297),LL(0xae5dfb3d,0x527623e5),LL(0x17557d88,0xc844e99c),LL(0xb4031115,0xb6a57ec3),LL(0x4aff5aa0,0xbe7d0b59),LL(0xea2e84ad,0x1e84a37c),LL(0x947fcbaf,0x048c2935),L_(0x000000e3), LL(0xe275de5d,0x93f58bed),LL(0x503171b0,0x7aaa2b21),LL(0x7b8e1c73,0x6261f263),LL(0x620dfceb,0x1e8e8701),LL(0xdb241dd2,0xce453d37),LL(0x74e79c85,0x7db88257),LL(0x6f92bc71,0x5a2566e6),LL(0x6fb9d9ff,0x4ae0bd7b),L_(0x000001fd),
+ LL(0x8f215ed1,0xed12288f),LL(0xe57e6348,0x585fa9eb),LL(0xa7abfcec,0xb1b5c7dc),LL(0x12939a1c,0x76c09203),LL(0x48eb6b41,0xc4cc679c),LL(0x2a08cff6,0x4778574b),LL(0x8519401e,0xa530fac0),LL(0x93672b0d,0xe3ed0e37),L_(0x000001c5), LL(0xd47e0778,0xb789e1a5),LL(0x479a986c,0x85a2af38),LL(0x47001e80,0x5a9c69c9),LL(0x623b25fe,0x05944f83),LL(0xecb76557,0x1f6667a7),LL(0x0cb584d5,0xc3bb24b7),LL(0xdaf97923,0x7f09e6d8),LL(0x00ac1be5,0x6d082075),L_(0x000000db),
+ LL(0x8445a8cc,0xcbbf6efa),LL(0xd82adf79,0x6f9a1c1d),LL(0x1d21df42,0x47e0a609),LL(0x1902bf5b,0x6c507d72),LL(0xd92481e1,0x732e3603),LL(0x4e995e7f,0x0a9f3c6f),LL(0x57c9de5d,0x171e968b),LL(0xace10341,0x27d7d96d),L_(0x00000173), LL(0x415a7d4e,0x093b8c99),LL(0x68806375,0x999003af),LL(0x0227279e,0x62158e85),LL(0xd41629b8,0x3479df9d),LL(0xa2d25c33,0x3570b3aa),LL(0x61de636e,0x4eb04a19),LL(0x71b3bbeb,0x0ce04d19),LL(0x4c30f9b9,0x15492470),L_(0x000000b3),
+ LL(0x820638ac,0xcc212f6f),LL(0xf1e3cf43,0x2c575c09),LL(0xdd247286,0x0980e757),LL(0x812b4ec0,0x19cba5ed),LL(0x883e3e28,0x4641e487),LL(0x0bb816e7,0x6c96b70b),LL(0x461f03f5,0x26aaf764),LL(0x918835cd,0xe1cfcddb),L_(0x000001a8), LL(0x2da8f566,0xb11711e0),LL(0x3f7282c1,0xed552895),LL(0x44826000,0x25594479),LL(0x065389a8,0x70867768),LL(0x96f127c7,0x52ffb2b6),LL(0xaa1f5abe,0x0831bd74),LL(0x9739a178,0xf0a510a0),LL(0x6154e726,0x36902e78),L_(0x00000177),
+ LL(0xf7a9efa0,0x42cd0f9e),LL(0x7bbdb010,0xa3fbb175),LL(0x1996a380,0xf39db731),LL(0xbb69e651,0xf3f08146),LL(0xec6679cd,0x8679b0b6),LL(0x60847478,0x90d1ae26),LL(0x883e5a59,0xa5e209ed),LL(0xba61924f,0x3c755c0b),L_(0x000001de), LL(0xebae92ff,0x847c1f82),LL(0x8ace9c6a,0xa1434ccf),LL(0x857d9026,0xad864d4c),LL(0x0ee5b0b7,0xf613e221),LL(0x86a35718,0x91165b2c),LL(0x55984d67,0x080d19fb),LL(0x15401901,0x3389eccf),LL(0xd99a0e8b,0x8b509b98),L_(0x00000060),
+ LL(0xfa05d78b,0x7c660e1a),LL(0xfd68d650,0x85aa25df),LL(0xe307472b,0x3713d00e),LL(0x3afed55d,0xc091f93d),LL(0xecc3137e,0xa9f9d1a2),LL(0xa3d44f8a,0x32a1cdec),LL(0x4344089c,0xc8d64b46),LL(0xe3575142,0x11bd5244),L_(0x00000102), LL(0xfd1a1cdc,0xe4cb9635),LL(0x8fa8648f,0x3dc52f80),LL(0xdf8e13dd,0x058fc1b8),LL(0xc1ab282d,0x3abf2a6c),LL(0xf290d505,0xfb0841a1),LL(0xea29f4f4,0x3d94894a),LL(0xb691fb1a,0xf7a1cc29),LL(0x0da25d00,0xfc4326f1),L_(0x0000018c),
+ LL(0x9155b117,0x1b3c8c62),LL(0x1ffd1435,0x58c3116e),LL(0x54a96e6c,0x90a8d92e),LL(0x623a9ece,0x891efe6b),LL(0x66715556,0xe72489c2),LL(0xd3bfc0b3,0x5b00b58c),LL(0x8cf3d04d,0x06c601e4),LL(0x71f460fb,0x26e3ef6c),L_(0x000001d1), LL(0xe91afddb,0x626e2af2),LL(0xa51ff90c,0xec49ef66),LL(0xd3f82493,0x704277da),LL(0x9f0e6e8a,0xca17ce54),LL(0x80cb9b26,0x62bbba3d),LL(0x39fb568b,0x7ff82aae),LL(0x978a0c13,0x9cbfd867),LL(0x6bd90fa9,0x07be1717),L_(0x00000151),
+ LL(0xc31dd728,0xd809dd1b),LL(0x12107a4a,0xc16d6592),LL(0xdc70467d,0xf8d5c83c),LL(0x273b2243,0x596e052c),LL(0xeab68bd9,0x8aaa0dde),LL(0x11cdb329,0x39baf3e4),LL(0x65459e78,0x004f292b),LL(0xc654b1e0,0x4da9e734),L_(0x0000014a), LL(0x58fc53ab,0x1ee009d1),LL(0x45bc8ab1,0x24563a0d),LL(0xde252f6e,0x04322137),LL(0xd1d577ae,0x29c5297d),LL(0x554880c2,0xf29e1a9e),LL(0xfc0d4b7e,0xa08f14c2),LL(0xe648399e,0xfd1007c8),LL(0x23bed899,0x2a7303ca),L_(0x00000010),
+ LL(0xa4c512fb,0x2e60230d),LL(0x883ed27b,0xf8aee1ce),LL(0x57a9715e,0x9d84b9da),LL(0xa58cae2e,0x59971acb),LL(0x62ef042b,0x5b1190ec),LL(0xa8c70cf9,0x1ecd90c6),LL(0x1e5cf5d1,0x0a20a7a4),LL(0x3aec3e16,0x7baf5a6c),L_(0x0000006e), LL(0xc8d347ac,0xf18a3f41),LL(0x0debc30a,0xc54674cb),LL(0x2dbc3b83,0xc265a6e5),LL(0xa8033fd7,0xf450415c),LL(0x2a50f527,0x6adf277c),LL(0x81475ec6,0xff0d3a36),LL(0x5f2c676b,0xdffe6c53),LL(0x0c1f159c,0xf5ad7f78),L_(0x00000106),
+ LL(0x4f0af995,0x00058fc2),LL(0x8bb729ca,0x48246fa7),LL(0xff563f60,0xb23219d5),LL(0x8c64a3a5,0xf34e49ac),LL(0xe82036c1,0x9d2397f6),LL(0xe392c964,0x58216601),LL(0xbeda885c,0x3d7f9573),LL(0xe289f5e8,0xb1917dc6),L_(0x00000169), LL(0x30057807,0x6d9791a6),LL(0x37eb92d1,0x066237a9),LL(0x7995f34e,0x764ae778),LL(0x8d994f01,0xde5ca0e3),LL(0xaff07e24,0x199bd467),LL(0x544454f0,0x4bf2e809),LL(0x603eb80f,0xe5054850),LL(0xc95e16ef,0xa4a6c672),L_(0x000001a9),
+ LL(0x8c50d780,0xc8db0700),LL(0x32a1b788,0x45d0d169),LL(0xc842373b,0x87531f66),LL(0x674b4407,0xdbe71b0e),LL(0x8189664d,0x42dd8323),LL(0x7cdb6aec,0x8df2c5a6),LL(0x86c397bc,0x86388fa4),LL(0x110db0bc,0xf6d18eb8),L_(0x00000086), LL(0x5a491f30,0x23e50391),LL(0xa2dcf957,0x6ae2419f),LL(0x1c7362d5,0xac9caab7),LL(0xd238a731,0xbef3c44d),LL(0x28f6d7ae,0x5c3ea7d4),LL(0xdacef1fe,0xd654307e),LL(0xb31d909e,0x01625227),LL(0x6d2db310,0xb2421d90),L_(0x000000f9),
+ LL(0xb66d61ea,0x4083d41b),LL(0xf3bbcb07,0xe8c0bfc8),LL(0x91274928,0x9c0b763c),LL(0xc81b7765,0xbe1076e4),LL(0xbf368625,0x9568943e),LL(0x8c2112ae,0xb0cd4c71),LL(0xf70e5fb5,0x8fe2ec7e),LL(0x76a5c64b,0x867a5527),L_(0x000000b5), LL(0xd3886d7d,0x3faf5b44),LL(0x41c29ed5,0x50ffd8e6),LL(0xcb155068,0xa9b2855c),LL(0x28ae527b,0x9d8e8d01),LL(0x2a092960,0x5cbf1edf),LL(0x66ffe099,0xb212b2a8),LL(0xd340e610,0xfc0600f9),LL(0xa2f5aba0,0xb08ba7b8),L_(0x0000005b),
+ LL(0x604c6624,0x0ca526cf),LL(0xa9ed0f7a,0x125b33af),LL(0x1dd685ac,0x516f5290),LL(0x17e7ff8f,0x927c416e),LL(0x720475ad,0x0fc77cc9),LL(0x67e1e919,0x3aec0717),LL(0x6652fcb3,0xcb2653df),LL(0xd80f0d48,0x8bf16720),L_(0x0000006c), LL(0x0590fcd7,0x08404c44),LL(0x7f43e4e4,0x9c42e337),LL(0xdefb2272,0xc3b37e10),LL(0xdaf241ae,0xc795c866),LL(0x0a07c892,0xbf4d3079),LL(0xb2425f5f,0xa5db075b),LL(0xb7cb5830,0x0875f161),LL(0x93c95089,0x91cad664),L_(0x00000065),
+},
+/* digit=18 base_pwr=2^90 */
+{
+ LL(0x7dddacd3,0xc3797559),LL(0x266f6975,0x22dfb9d9),LL(0x599f544c,0xdb081480),LL(0x839c2be6,0xeb8ec462),LL(0xb5cdf12a,0xd9d49cd3),LL(0xa917fb29,0x96146a8b),LL(0x233b216f,0xd936c0b8),LL(0xf0abf1a9,0x8c8a45a2),L_(0x00000187), LL(0x0356029a,0x0f5dd64a),LL(0xd1625aef,0x056528c2),LL(0x5ff56fc7,0x9b293d67),LL(0xa5c323cb,0x02b295cc),LL(0x4d697cbd,0xbc712910),LL(0xe4eb4b02,0xc1e4d83f),LL(0xa4e9327c,0x9c23cdd4),LL(0x5af46cdc,0x94640699),L_(0x0000013f),
+ LL(0xc9de104f,0x6147414f),LL(0xaed9435d,0xbd16db82),LL(0x62ff16a9,0x3b07e71a),LL(0x52dcaf4a,0xf9456ee7),LL(0xea0d3e3f,0x1d78dd65),LL(0x64901fef,0x31145bf8),LL(0xbc9f4225,0x366fd367),LL(0x81cb13ee,0x290083f4),L_(0x000001e6), LL(0x6e77ebe4,0x5232088e),LL(0xc5e887c8,0xcc7b3f38),LL(0xf005e149,0xe1bede78),LL(0xe8c89874,0x2dfeaf32),LL(0xcb4e28c7,0x3cb0a4d9),LL(0xda48c711,0xaf7daba5),LL(0x1fe289a0,0x0d3633ab),LL(0xbd5d0dc0,0xc0b05c86),L_(0x00000001),
+ LL(0xd5e4e9c6,0x85849a1c),LL(0x74861653,0xe1eb1a35),LL(0xaf98abe0,0x53b40a6e),LL(0xf083ec36,0x74acbc0b),LL(0x0b5a921d,0x28a65b06),LL(0x5764e30a,0x5588eb5e),LL(0x62277d5e,0xc8da671e),LL(0x39cae462,0x53bbf492),L_(0x000000a9), LL(0x0635b866,0xa6baa014),LL(0xd98a134c,0x31e23fcb),LL(0xdbe32368,0xa8c7a352),LL(0xef82abaa,0xa98ba793),LL(0xcbb55844,0x1a07e161),LL(0xaf3169a7,0x4991ee4a),LL(0x5cfbe290,0x0c980dd6),LL(0x56a21524,0x1c07cd7d),L_(0x000000cd),
+ LL(0x06de0083,0x07567a7a),LL(0x045155d8,0x351697cf),LL(0xce8bb246,0xcba64633),LL(0xdd5c2900,0x24297174),LL(0xe7f044c7,0x0c3a3851),LL(0x48c830bf,0xd35ff595),LL(0x817a26f0,0x7d923f53),LL(0xd93d8b02,0x2b3dd7ca),L_(0x0000002c), LL(0x924bf9f6,0xcc94cbf6),LL(0x986d299b,0xdf6f5c09),LL(0xf89ccb5a,0x5aee26f4),LL(0x18699f82,0xc1b545bb),LL(0x6595e656,0xb0d22aa5),LL(0xa3953fae,0x6abcba5e),LL(0xa9580b4b,0xd4e240d3),LL(0xef465246,0x13b6fdf7),L_(0x00000186),
+ LL(0x69351015,0xbd979035),LL(0xf355f70f,0xc5a87f52),LL(0x1b7365b1,0x18c500a7),LL(0x2dd3210c,0xf547e418),LL(0xc57a734c,0x391d8bfc),LL(0x928abb19,0x5ec8dcf1),LL(0x3e6991b5,0x7de9b3d1),LL(0x9e25eac7,0x6ebd2b96),L_(0x00000022), LL(0x77d1be34,0x7d70fd72),LL(0xae0eb8d2,0xf2114ba3),LL(0xb57b0ed4,0xe573b783),LL(0xc65906cc,0x0b2b3d21),LL(0xfac74740,0x9dbb25b7),LL(0x6157bc5c,0x6859f85a),LL(0x21a21340,0x0df614a7),LL(0xbfacee18,0xe4709b5a),L_(0x000001b2),
+ LL(0x96a37abe,0x15b4091f),LL(0x31ad054c,0xdccd6f0a),LL(0x57e2c372,0x27698a20),LL(0x9a3a4ffe,0xcc03de8d),LL(0xc754fb8f,0xcd17cdf6),LL(0xa956ebe7,0x7cb9ef2e),LL(0x9d18d38c,0x190daaea),LL(0xdc66f2ca,0x7d783383),L_(0x00000030), LL(0xcbc69492,0x727ea062),LL(0xfefa898f,0x773b6e5f),LL(0xfbea71e8,0x7460be92),LL(0xc9254b56,0x318caed7),LL(0xc982d8e5,0x7f1a16b2),LL(0x9a4da06d,0x38233ae7),LL(0xe149d876,0x3b8c2af7),LL(0x70fc3c7a,0xec4a5565),L_(0x00000154),
+ LL(0x73053e0b,0x5f08f3c6),LL(0xd02192ba,0x05cbe08a),LL(0xbb7b43e6,0x4a339a92),LL(0x2b4034e6,0x1c6eea28),LL(0x0145dd56,0xb3481662),LL(0x819f74ea,0x5fdab086),LL(0x2d08d669,0x401f4d8b),LL(0x87d855a8,0x71a3977d),L_(0x0000007c), LL(0xf6c94b12,0x787e1654),LL(0x7f231760,0x1dcce655),LL(0x2908ba05,0x10acadce),LL(0xe5a3ffa8,0x60f31016),LL(0xe1211553,0x34c2a1c2),LL(0xfe1b8dad,0xa81d35d3),LL(0xe7230bfc,0x37a78d41),LL(0xcfeaf774,0x6e60ae9c),L_(0x000001f5),
+ LL(0x725af512,0x898a64cd),LL(0xda668233,0xc8516d6d),LL(0x1f40d7d1,0x5fb1f564),LL(0xd5a115e0,0x7906c2d8),LL(0x496ac4ad,0x6f4efe00),LL(0x3643f707,0x6c892d97),LL(0x414f5838,0xe34b14c4),LL(0x7c2d83c2,0xc00d08bc),L_(0x00000037), LL(0x6bebe71b,0xca445165),LL(0x219e2e5b,0xcbf3a3f2),LL(0x118227ea,0xf1a84019),LL(0x6017e2ce,0x58a5f9de),LL(0x1922122d,0xf1ecfa6e),LL(0x98696eb0,0xd3df6fb1),LL(0x54826be2,0x8fefc088),LL(0x02dea006,0x77c29791),L_(0x0000014e),
+ LL(0x368b75f9,0xe65ce508),LL(0xa5fec659,0x0b177612),LL(0xdd1bcbef,0xfc84b3bf),LL(0xe4569388,0x984ce0ec),LL(0x163caf98,0x9cc1f201),LL(0x3fa88dda,0x39bac4dd),LL(0x6c254803,0x70562e22),LL(0x75a93dd1,0x2cbfcecc),L_(0x00000095), LL(0xfd7cf39c,0x0ce600b2),LL(0xe3dc17db,0x5b060f2c),LL(0x5399ddf1,0xd74988f6),LL(0x83e38dff,0x2b96b9f4),LL(0x87e221d8,0x2c298bc9),LL(0x0753b765,0xd6bd45f4),LL(0x27e5b1a1,0x18ca1da9),LL(0x41853811,0x7849f1e1),L_(0x000001bd),
+ LL(0x90c22eba,0x226b8a15),LL(0xdb333954,0x4e3975a7),LL(0xaa52c0ba,0x74176c01),LL(0x1fd9d014,0xa1a2b6b0),LL(0xf61b81e1,0x28415db7),LL(0xd3614b3a,0xa0f6000e),LL(0x9e00e5a5,0x5cf34986),LL(0x9efe446d,0x0b69d383),L_(0x0000001b), LL(0x245ecf44,0x2d0c1e46),LL(0x1f77c4cb,0x553d358a),LL(0xe9f129ca,0x071ebad1),LL(0x088b2769,0x8eb8c2d8),LL(0xf3219a51,0x877b3a25),LL(0x17c5431a,0x9c4b8adf),LL(0xeac2ff93,0xffc69d68),LL(0x23d158f5,0x2e0840d4),L_(0x000001fa),
+ LL(0xb9d98a1d,0x6d2a4e6a),LL(0xb45f9376,0x6e78c290),LL(0xbff42b2f,0x5fb9af74),LL(0x2af23d44,0xaebdf547),LL(0x7deaa238,0x93a6597a),LL(0x25df5576,0x5dcbd040),LL(0x6f6b456f,0xa9249467),LL(0xb63da0b0,0x7f719d63),L_(0x000000c8), LL(0x15e8e55f,0xda677478),LL(0xcb218f05,0xb119afe4),LL(0x3e0b4052,0x816ad70e),LL(0x342ea279,0x14498c92),LL(0x7acbb776,0xc4e09c12),LL(0xbf8e66de,0x0f290835),LL(0x3edfdd90,0x8ca19f41),LL(0x794255ee,0xa1bde671),L_(0x000001cb),
+ LL(0x5a5b22a9,0x4848eb20),LL(0x80f21ad1,0xde0fb7d6),LL(0x8e50bcbd,0x4c1119fd),LL(0x83d6f607,0xf9f2e435),LL(0xd9961c79,0x765361f1),LL(0x625f26bb,0x008a463e),LL(0x2b47c8db,0x87cd134f),LL(0x328c3977,0x36eea7ef),L_(0x0000009b), LL(0x3894ce29,0x3d664722),LL(0xdfe036fb,0x206e887a),LL(0x67daf1eb,0x72f017c4),LL(0xf7db19b3,0xad33a99e),LL(0x06ea7ba8,0xf55c0da8),LL(0x14bd637e,0x9b12c024),LL(0x59864973,0xd282f3bb),LL(0x55feed3d,0xce69b372),L_(0x000001ec),
+ LL(0x79ad5e39,0xdf10c34e),LL(0xb43675e3,0xb8ad4110),LL(0x19590538,0x801f28aa),LL(0x239ed388,0xc602d7b2),LL(0x3a5a6ad4,0xbdc9fad5),LL(0x62b5ae49,0x135d222c),LL(0x5042d74a,0xc3f94c1d),LL(0x28ba3dd9,0xe0a1ec48),L_(0x00000110), LL(0x6cd1e311,0xceb5a088),LL(0x77f171c2,0x8f737348),LL(0x31242fc1,0xdbca643a),LL(0xe44bcbd8,0xcd573afd),LL(0xbad62d6a,0xc4c9f268),LL(0x5d49ae75,0x98fad2cf),LL(0x9b8f817e,0xd8431494),LL(0x96bb2753,0xc49e4432),L_(0x000001a8),
+ LL(0x87036cde,0xa4f9f22d),LL(0x2ccfc8e8,0x4cd46e2b),LL(0xa48136e4,0xa95491dd),LL(0x8818327f,0x6393487e),LL(0x7a069a28,0x98ab19e5),LL(0x5c879344,0x02491e0c),LL(0x82e60002,0x2abf1999),LL(0xc0e10b00,0x82724899),L_(0x000001ed), LL(0x9fd75e21,0x4897df79),LL(0x688c2193,0x43479e7f),LL(0xc705deaf,0x5b79a04e),LL(0x068f9205,0xb2c04a79),LL(0x3a42239d,0x0245715d),LL(0xa99eca86,0x55284faa),LL(0x9f983742,0x07d9bbaa),LL(0x5fe3bb74,0x5a19431d),L_(0x0000014c),
+ LL(0x0f3f56ca,0x99e63ac2),LL(0xac6175c0,0xcb3bdf62),LL(0x0d4bf222,0xd9e5f622),LL(0x83e1cd77,0x4ca3e4a6),LL(0xde0dce61,0xf80cd49b),LL(0xeac1e293,0xf190c10e),LL(0x901aa7ce,0x30eda1d3),LL(0x25f2f0a6,0xa509dab1),L_(0x00000199), LL(0xe9fb14f7,0x0ab974ef),LL(0x9b6b41ad,0xcc8fc9d8),LL(0x20269236,0x5472afda),LL(0x81034020,0xb7eb7c83),LL(0x26dba78a,0x7c59479d),LL(0x81e829eb,0xb0ba6216),LL(0x1549f5f2,0x843a5c45),LL(0x18302134,0xa2709e3b),L_(0x0000014c),
+ LL(0xc1370929,0xbde5f81a),LL(0x8f81e9a3,0x7f4da051),LL(0x9720014a,0xa02bf073),LL(0x9ff1f457,0xe074553e),LL(0x3a46ea6b,0x64351eaa),LL(0x7e32f0dd,0xd22b22b2),LL(0xb488462f,0xcafc2c23),LL(0x566dddda,0xfb75908f),L_(0x0000015b), LL(0xb5b9a118,0xe8987332),LL(0xfe94dfd9,0x4f63b44f),LL(0xf9b91bc6,0x0dbd772b),LL(0xecb77f43,0xd580392a),LL(0x2fb67ddf,0x1ddc69fb),LL(0x2fdb69c9,0x9ea2314d),LL(0x754b9b9f,0xe624f23e),LL(0xf3f2e9c2,0xc6e677e1),L_(0x000000a3),
+},
+/* digit=19 base_pwr=2^95 */
+{
+ LL(0xb1001608,0x14f438f4),LL(0xd13ff0c3,0xb8e45f22),LL(0xd55796ec,0x3dd2e2bb),LL(0xf830ab87,0x9eb71d33),LL(0x14a36478,0x83167e0b),LL(0x46513aa4,0x793502c2),LL(0x03e86d3a,0xb0fe98cb),LL(0x4eb2db2b,0x0404a0ec),L_(0x000000d7), LL(0xc6b60bcc,0x8f4384c5),LL(0x0cd19a5c,0xc19b3257),LL(0x1c33b468,0x9210942f),LL(0x29ccbac3,0x36048a2a),LL(0xd4ffa97d,0x4f69ef5f),LL(0xcd6b0a67,0x82d0ece5),LL(0x13229739,0x4bce1b8b),LL(0x491493bd,0x4d6596bf),L_(0x0000003d),
+ LL(0x13acae0c,0x560db5e8),LL(0x1117f6d4,0x8e19b583),LL(0x1106059c,0xe8232c57),LL(0xc78f908c,0xd0f09782),LL(0x4a24aa92,0x8bd0fcb6),LL(0xd766becf,0xf59977e3),LL(0x155f53d2,0xfa9a727f),LL(0x49389ae2,0xff877e92),L_(0x00000120), LL(0xd2d44588,0x9985d510),LL(0x3b4e5204,0xe4788dc7),LL(0xaa68342b,0x8a0ca8e6),LL(0x7b14f89c,0x66874892),LL(0xf19eb3e8,0xe17375dd),LL(0x5e5f8b7c,0x652a41d1),LL(0x2912af54,0xa86a7275),LL(0x5ab9a777,0xbaf706d8),L_(0x0000003b),
+ LL(0x0d6ee2a7,0x8ca944bc),LL(0x4852fbcb,0xbefff557),LL(0x0369a497,0x3e3736fb),LL(0xe2bb7551,0xd21615dc),LL(0xe6d3b727,0xe319eb4c),LL(0xe8de5f7d,0x48fe4856),LL(0x592a3396,0x7516380a),LL(0x80dc9aef,0x51f52af0),L_(0x00000151), LL(0x7aa71f54,0x98c6421f),LL(0x38523c52,0xec51f4f2),LL(0xf58cc95f,0xbc6c8082),LL(0x36ef370c,0x7bc605a3),LL(0x8ac270e3,0x83d78da4),LL(0x0412498a,0x6de54abd),LL(0x66b38131,0xdb62d8c6),LL(0xe06d3c3f,0xf5e45a86),L_(0x00000129),
+ LL(0x42a7b358,0x4517d395),LL(0x53d2cbb1,0x5b733d69),LL(0x44a3ef5b,0x472126ff),LL(0xee076565,0xa4a1334d),LL(0xb26c37b2,0x12573d17),LL(0xb5b29517,0x129c2c7a),LL(0xd328148c,0xa2c72b08),LL(0x08907f5a,0x1d10e103),L_(0x0000018b), LL(0x154b57d1,0x5e159666),LL(0x9359d888,0x4827d5dd),LL(0x0281b6f1,0xa475f3a4),LL(0x6b19bc4b,0x2eef4469),LL(0xdc6dfbc3,0x782b50db),LL(0x9ef4383e,0x0583236a),LL(0xd7320845,0x7767db3f),LL(0x0dd190b0,0x3c0278a0),L_(0x00000115),
+ LL(0xc54f57bf,0xb03b1675),LL(0x97e68374,0x1c499646),LL(0xae2f3284,0x74508785),LL(0x0255084b,0xf1921ad5),LL(0x6ea40714,0x2aabd8cb),LL(0x516433de,0xd1c8abdf),LL(0x5d2d8ded,0x8f5d7b6f),LL(0x421e5a19,0x2d6ae9c5),L_(0x0000007b), LL(0x99149c91,0xd9a89463),LL(0x4310dcf0,0x0122d1b0),LL(0xd2489f91,0x4e7b58d3),LL(0x655fdd5d,0x40c4379c),LL(0xc7862d42,0x6da55b4a),LL(0x975cc64c,0x1e1d3862),LL(0x84484f68,0x301cfa3f),LL(0x2a16eb0a,0x20ebbbdb),L_(0x000000e4),
+ LL(0x5456251b,0xc0ba905f),LL(0x5b3d8d39,0x62a268ee),LL(0xea2a0a44,0x094457cb),LL(0x80f032f3,0xab36ceff),LL(0x8790739b,0x21b0fdf3),LL(0x40209bce,0x38249dc8),LL(0xf0c1c8e0,0x213ecb4d),LL(0x70c51d81,0x2b025e0d),L_(0x0000003c), LL(0x4b899f83,0x493bb32c),LL(0x798bfbf2,0xf622fccb),LL(0x28838277,0xc2594827),LL(0x5cbe5b67,0x2c07c4dd),LL(0x2c4c703c,0x1c19526a),LL(0xdcd0df4c,0xed390177),LL(0x57a743a1,0x3a4c5274),LL(0xac32bea6,0x1c302e78),L_(0x0000015d),
+ LL(0x0eb650df,0x18bc0976),LL(0xa3094433,0x7cfa690a),LL(0xca509300,0x660a165b),LL(0x9645aafc,0xdcef6d7c),LL(0xd90c6f35,0x07a41bbc),LL(0xad0dd448,0x702e476c),LL(0x5c881f7f,0x2185a821),LL(0x9c91260c,0x0622b914),L_(0x00000063), LL(0xcb1b5333,0xfe64e60a),LL(0x59c3b83d,0x192bd9cf),LL(0x5bdb24df,0x69659379),LL(0xa9cbc111,0x437b31e8),LL(0x2954601b,0xb7b5589c),LL(0x13c392f3,0x97064b9e),LL(0xf1845fb5,0x8d803336),LL(0x7ea9c980,0xea2d2221),L_(0x000001ca),
+ LL(0x828ff0ba,0x23fc5003),LL(0xa9841f43,0x62407436),LL(0xc6f35f8a,0xfc260a1f),LL(0xf5e9286e,0xe74c4b2d),LL(0x504bfafb,0x7cb3568b),LL(0x3548e504,0x1af9dbcf),LL(0xd92aaad7,0x85e423c5),LL(0x2d182410,0x94d1d884),L_(0x000000f8), LL(0xf29b75d7,0x9975b2a3),LL(0x55f78348,0x0939eec5),LL(0x92b31a41,0x23255263),LL(0x4a1b7bc2,0x65a25c26),LL(0x283464db,0x08fc1aed),LL(0xecd1a9b7,0xea335c70),LL(0x90a7a2a0,0x9f14ffdd),LL(0x7fd21f2e,0x9566dadd),L_(0x000001b4),
+ LL(0x553ea74d,0x578b8f88),LL(0x2bbf7009,0x8c4ed5a7),LL(0x30e7b9aa,0x30aeacb4),LL(0xe07a93f1,0x58d02f17),LL(0xbcf5fa42,0x7c6f83ed),LL(0x228f3e47,0x91d5ba0c),LL(0x815eef51,0xe37c3b79),LL(0x0528cf82,0x507b5dce),L_(0x000001f2), LL(0x9a97a830,0x5a682d56),LL(0x14eac39b,0x72ce45fa),LL(0x90b36bc5,0x5f62d8bb),LL(0xadbc91ec,0x9d5e2385),LL(0xfae2e6dd,0xef20a2d0),LL(0x380bdc5e,0x9c9037ea),LL(0x2d48d188,0xdd58b76d),LL(0x6a4ce00a,0xb6e3d5d7),L_(0x00000090),
+ LL(0x545376f5,0xfffa5757),LL(0x64cbfd55,0x1f1c3ae1),LL(0x8a854545,0xd0be9705),LL(0x7272e007,0x2a8f4c49),LL(0x254138ed,0xc97ed736),LL(0x15e864c7,0x83df5162),LL(0xb624fc1b,0xf4114fdb),LL(0xcc0313aa,0x8c7f0423),L_(0x0000007a), LL(0xc8d276d9,0xa4ed76ab),LL(0x3e74f599,0x8b381bfe),LL(0x25d1f92d,0x9e406956),LL(0x06a5a359,0x869bdf5e),LL(0x5afaf671,0xaec86f62),LL(0xbbcc12cd,0x0dd1d724),LL(0xda751689,0x21630603),LL(0x409b6925,0x1f15a18b),L_(0x00000054),
+ LL(0xcba2ca51,0xc7b9233c),LL(0xff6a30c8,0x6ecefcff),LL(0xf3d40688,0xfad25722),LL(0xc51d4aa6,0xf9c6f8fa),LL(0x3fae03f2,0xc7864470),LL(0x5ca7328e,0x4201ca64),LL(0x4b3ff739,0x08cad454),LL(0xb2721cee,0x43bf4523),L_(0x000001d1), LL(0x2952e7ef,0xaf0e573e),LL(0x2a8f8fba,0x3f5e67f8),LL(0xae4ce46a,0x616a72e1),LL(0x906994c7,0x3a7f4aec),LL(0x055b94c2,0x8bb69b90),LL(0x67e39f74,0x4eead34a),LL(0x7a7cada3,0xf92b70d7),LL(0x9b22abe2,0xca616691),L_(0x00000092),
+ LL(0x32e5d612,0xd5e1c4e6),LL(0x7ad659b7,0xe2f2a298),LL(0x3f7f338d,0xaaeb06f1),LL(0x6d9b55a5,0xa60e84f2),LL(0x30c6f8b9,0x9d105631),LL(0xd017d58e,0xfa41e760),LL(0x9e20b973,0xb2f4acf3),LL(0x840eaafd,0xec9c6ab5),L_(0x00000101), LL(0xa5a6302a,0x22f4549b),LL(0xb140b897,0xc2510a98),LL(0x3e099225,0x9117bbe6),LL(0x18af31b1,0xba7147bd),LL(0x68bb5c46,0xf0f540e3),LL(0x29d33114,0x1c9aeacf),LL(0xe59588a0,0xeb2d0e67),LL(0x29ef0e25,0x4bb1b8d0),L_(0x0000018e),
+ LL(0x3f8475bf,0xfaf6783d),LL(0xd0223b63,0x4dcebc43),LL(0x6472ecb7,0x6ff8245b),LL(0x1d3fdb09,0x3439a621),LL(0xa67bac9a,0xd009a2d7),LL(0x94c65387,0xf330caae),LL(0x19a02e17,0xa6f7e5f9),LL(0xb2396a55,0x5fef60ca),L_(0x00000067), LL(0x92275ac6,0xefd6a160),LL(0xefa0d1c9,0xbd7c0837),LL(0x2ede1f4e,0xfcadb9c0),LL(0xf4756366,0x47882726),LL(0xcd42f3e5,0x5c040ce2),LL(0xa61b16f9,0xdb84713f),LL(0xc4ef07e5,0xe43320a0),LL(0xecb2b8ce,0xac70be15),L_(0x00000090),
+ LL(0xb5440b5f,0x0457915c),LL(0x89a3e1eb,0xe08cc88e),LL(0xed12c670,0x89133ab9),LL(0x1faeab1d,0x15d9bc0c),LL(0x3c4250f6,0x881504d6),LL(0x084c8e8f,0x3ead62cd),LL(0xaf76dbe5,0x49cfac6a),LL(0x85bf1dcc,0x007ea0b8),L_(0x000001c7), LL(0xfc505153,0x47472352),LL(0x123835c7,0x80692fa2),LL(0x67bab29e,0x8379c2a8),LL(0xc2ecca00,0x9065aafb),LL(0x32da9779,0xda605d2e),LL(0x421bbbfb,0x12432283),LL(0xbdc2e115,0x9c126b9d),LL(0x437a9d89,0x7ce3f8d6),L_(0x00000146),
+ LL(0xa8e68c25,0x5b6dacf5),LL(0x7ae17558,0x1b0157e6),LL(0x314ffaf0,0x03819c6a),LL(0x9d2d7013,0x0e14b9b1),LL(0xc8c2b439,0x91c83635),LL(0x9f636f0b,0x98fed93b),LL(0xe579e47a,0x23b6808c),LL(0xaeb0f547,0x8d044288),L_(0x00000166), LL(0x8b1f49d3,0x891f32da),LL(0xf965270d,0x655e3634),LL(0xe11f64ad,0xacfd673c),LL(0x1b496453,0x68fb4507),LL(0xdf15820b,0x64f7f419),LL(0xd816e8bb,0xfdaf2edc),LL(0x0858d605,0xd9f619c9),LL(0xbbe07451,0xb9e75198),L_(0x00000002),
+ LL(0x4a1ee705,0xe000c97f),LL(0x5fa6cdb3,0x595ed0a5),LL(0xfd5fcd60,0xa02a23c6),LL(0x76e522bd,0x61844a1d),LL(0xbaf8c003,0x0c6c179e),LL(0xd0a47af4,0x6aa1a6cc),LL(0x71e2a115,0x4eb00620),LL(0x2ca1b0fc,0xc1c5314a),L_(0x000001b4), LL(0x6702b16a,0xcdc04837),LL(0x5b4e8123,0x242a32ef),LL(0xa7d67834,0xccb0fead),LL(0xc2a3bc3a,0xe65ed32f),LL(0xe7119407,0xab8b44e6),LL(0xaeb1712a,0x5a5977e9),LL(0x39ce4f89,0x708cfeb0),LL(0xa19d43ed,0x4957cd1c),L_(0x00000025),
+},
+/* digit=20 base_pwr=2^100 */
+{
+ LL(0x2f03e91a,0xc29a3fb6),LL(0xcfe3b9a1,0xca033fc3),LL(0x8c5a528b,0xb4bc3e3f),LL(0x23396cd7,0x4bd134e2),LL(0x39c3eb8c,0x565224c7),LL(0x25548c0a,0xf01471ec),LL(0xb0fb17f6,0x5fc65797),LL(0x18aee101,0xc4d69b6d),L_(0x00000048), LL(0x8f600f91,0x0074be70),LL(0xa14b550a,0x52425042),LL(0xf8e6b95a,0x3f438c42),LL(0x0174e981,0x81004aa1),LL(0x34ae4351,0x510cd9a8),LL(0xb1b67e29,0x8cdf2105),LL(0x41438bad,0x8ec5ba91),LL(0xc64d1130,0x00e8c08d),L_(0x00000143),
+ LL(0x1480c24d,0xb2625d11),LL(0xdcf3505f,0x9962934c),LL(0xc306874b,0x981e8fcd),LL(0x02704410,0x2bd0a650),LL(0x249eb349,0x6a534a84),LL(0x6b6bb40b,0x0c32e132),LL(0xbe5d2914,0xcb2ca52e),LL(0x029956b2,0x77c72251),L_(0x0000018c), LL(0x7c5c4dde,0xfe2b4e07),LL(0x6314442e,0x4431d884),LL(0x66618e79,0xcd3eeea2),LL(0x6a5a933f,0x64415965),LL(0xbda24f06,0x522dc52f),LL(0x82f45dda,0xd412542f),LL(0x0e5075c9,0xff34a66e),LL(0x9a2aba0f,0x512c4a1d),L_(0x00000169),
+ LL(0x9f6aa554,0xa3dc5b94),LL(0x9872016b,0x2889ccb7),LL(0x1df5e18d,0xe0129254),LL(0xdbcaebf5,0x4cd20b4c),LL(0x63d6c33a,0x1f301089),LL(0xc46a1dad,0x755fc0db),LL(0x2c0e39b6,0x6ef9e694),LL(0xac07fa12,0xd500d36f),L_(0x00000005), LL(0xd19e5fb5,0xf90b5e7b),LL(0x65e8dbbf,0xeb8ecb37),LL(0xe491cc2d,0xd314c068),LL(0xd31ab995,0xe810513a),LL(0xcca181b4,0x9b50dc0f),LL(0x0c1e0526,0x89302958),LL(0xb6453c85,0xde5a7d26),LL(0x3c9a98b2,0x6f7a7718),L_(0x00000138),
+ LL(0x542368a9,0xd7d861fc),LL(0x7b3c184c,0x5c425a73),LL(0x14a6e3b9,0x85d4a651),LL(0x532f514e,0xb665bb45),LL(0x8b87e598,0xa66a39b0),LL(0xdbcbbabb,0xa46208db),LL(0xa64b561f,0x9520864b),LL(0x05569250,0xde8b31e2),L_(0x00000081), LL(0x4473c211,0xdd1bb6a7),LL(0xe76a8c5d,0xc0f66932),LL(0xc6ee633c,0xc546bb80),LL(0x911f68d0,0x828f4e0c),LL(0xc213a206,0xeb2a4276),LL(0x04a16b2c,0xcbe98cb2),LL(0x38c09aa1,0xbcc1671d),LL(0xa6f3ebee,0x7a684ba9),L_(0x0000012c),
+ LL(0x89cd7620,0x2ca34639),LL(0x14b160b2,0xe3cc4351),LL(0x57f2d520,0x8707011b),LL(0x1d30ff78,0xb1a346a6),LL(0xd69eda68,0xa84618b8),LL(0x4008115f,0x06f520c0),LL(0xfeeecaa8,0x6a14e30d),LL(0xcc7e0843,0x68bc839c),L_(0x0000005f), LL(0xc998f3f5,0xb3ae58e3),LL(0xd35d5af6,0xf29bb951),LL(0x38625415,0x552cd755),LL(0xb49fd087,0x87ef7e8a),LL(0xde9ebd20,0x76b067b5),LL(0x110309c1,0x1ece1e74),LL(0xb224505a,0x91a5a2d7),LL(0x03ba9629,0x79263dad),L_(0x00000188),
+ LL(0x89fcda69,0xa71b7e01),LL(0x5ba885f2,0x915b6877),LL(0xb98305b9,0x53769a90),LL(0x10c19b27,0x8d87ac0d),LL(0x8f7acf63,0x583c77c1),LL(0x64d02af2,0x6e04d239),LL(0xe5be9202,0x8f85294d),LL(0x3a5a3099,0xbb22f880),L_(0x000000d2), LL(0x9876e935,0x150daae0),LL(0xf1b9b104,0x500967b9),LL(0xe48eb13c,0xec3e5c4d),LL(0x895cf9cc,0xb6158629),LL(0x7d90f3f7,0x8aa201ea),LL(0xc0cda29f,0x0c9a6e88),LL(0x4c0d7015,0x97d1c62f),LL(0x56ee70bc,0x4fd0f68d),L_(0x0000018e),
+ LL(0x44d6c8a7,0x413edbb8),LL(0x792ccd3b,0x1564f76a),LL(0x72527a7c,0x2778d6f2),LL(0x45b55b68,0x67ba3cee),LL(0x6e138f21,0x5d96d43a),LL(0x38c932f1,0x63638065),LL(0x4892afee,0x6ed7c45d),LL(0xb82b82f0,0x287b4614),L_(0x000001ee), LL(0xc1bb9d4e,0xb0953f4f),LL(0x5150d18c,0x107a5e99),LL(0x67e23c2e,0x71a733f6),LL(0x2e8bfba0,0xca46066c),LL(0x1d6c6108,0x8cfb4987),LL(0x39bb5a64,0x48164ece),LL(0x0cf34f51,0x336996f4),LL(0xe99b9250,0xd6e08146),L_(0x00000069),
+ LL(0x921a752c,0x4008e517),LL(0x7a6c13d1,0xc5d69ab8),LL(0xc4597b07,0xc66db12e),LL(0xdbd74a68,0xca40dec9),LL(0x4579d719,0x5a617fff),LL(0x13172539,0xe3835876),LL(0x09e3b946,0x2478942d),LL(0x42d20c85,0x82ecbef7),L_(0x00000079), LL(0xda1602b7,0x5f589886),LL(0xc9ae2bbd,0x8ba22c3f),LL(0x2126ee97,0xe212b5ab),LL(0xff875595,0x389b739e),LL(0x9d6707a2,0x263595af),LL(0x87d12dd7,0x92670f97),LL(0xb014c330,0x00678803),LL(0x692f506a,0x060764da),L_(0x00000167),
+ LL(0x6fa9c3c0,0xa7daee3e),LL(0x99e57328,0x3e8ff84f),LL(0x8d930fda,0x140c8ff0),LL(0x29def859,0x514bf396),LL(0x6dc6556a,0x917c0e6f),LL(0x1b3aa174,0x2fd52f94),LL(0xbc6b4711,0xec0486f8),LL(0x10164218,0xfc4d6fdb),L_(0x00000087), LL(0x20fc6faa,0x143ce621),LL(0xb9fa1174,0xb63c7e44),LL(0x5ae8a4f3,0xa5424b58),LL(0x8d2b2e47,0x1058f848),LL(0xc653cf99,0x5d72c078),LL(0x9ab7f092,0x5a469db8),LL(0x0eb39c94,0xb34488b0),LL(0xd4f2904e,0xff8c9e4f),L_(0x0000001b),
+ LL(0x4cffe2f1,0x5b0f1fb8),LL(0x0aa30019,0xcd7cdff0),LL(0xb19b5360,0x2a32083a),LL(0x1a886b29,0x6fd83895),LL(0x3e954ca3,0xfc9e4bd7),LL(0xf6dfbbe3,0xd49474b0),LL(0xbe5e429b,0x6cfc9bf8),LL(0xb282ba89,0xd4f6b8c7),L_(0x000000b0), LL(0x5a179753,0xf0239d41),LL(0x54cf1a20,0xf833aa3b),LL(0xbe4f75ce,0x667c55f3),LL(0x210d085a,0xf20673c4),LL(0x90bc983c,0xe6d37945),LL(0x2b933ece,0x7400e31b),LL(0xa73815a0,0x0016f173),LL(0x2d12b0bb,0x04943106),L_(0x000000cc),
+ LL(0x258975c7,0xf8f8e68e),LL(0x93b485b5,0xbbae7e17),LL(0x21f99dd4,0xd3ee3730),LL(0x8f41688d,0x869cee4c),LL(0xa7149163,0x7ffdc064),LL(0x1dd2e6f5,0x3e9c9ee6),LL(0x3e5343f8,0x1bea26ce),LL(0xd599de2a,0xc95e92f5),L_(0x00000021), LL(0xce2962a0,0xc38ccf06),LL(0x17914783,0x5b85620d),LL(0x3066f430,0x8a55dcb5),LL(0x73026026,0x8691669e),LL(0xe37b2f3d,0x6c8abb34),LL(0xb0b3d5e7,0xe607781f),LL(0x1d40a38b,0xbd4e966b),LL(0xa4bb9c3f,0xfa1cc8e1),L_(0x00000053),
+ LL(0x2fc2f08c,0x61cb5b4c),LL(0xa0ed42bb,0xb44afbfd),LL(0x8be8a8dd,0x0621480b),LL(0xe9c3bbe4,0x3bbd013b),LL(0x3dad214a,0xf63413c0),LL(0xf44a0f7a,0xfedcc70e),LL(0xababaa32,0x0bd6ea84),LL(0xd282fada,0x556a1b66),L_(0x00000155), LL(0x4628c72c,0x2eb9a417),LL(0xd244439d,0xe9ea5bcc),LL(0x6a6b06e0,0xc7910063),LL(0x95bae48e,0x065bc250),LL(0x8f84ff6a,0x70b64554),LL(0x1fab9066,0xe0a46dab),LL(0xe07a85ee,0x8bdd86f2),LL(0x832625e0,0x012550fd),L_(0x0000006d),
+ LL(0x972aea5c,0xafed2f9f),LL(0x24dc0f96,0xe142d2cd),LL(0xa6689657,0xea2d5cc5),LL(0xae481b79,0xd0bdf4f2),LL(0x8a560bee,0x85db3226),LL(0xa5d11f99,0xfd86b657),LL(0x77ab3c4c,0x9ecb073c),LL(0x1fa5f6fb,0x59db760e),L_(0x000000e3), LL(0x246cd3c8,0x09f0d045),LL(0x3533500a,0x2990659d),LL(0x4eb8eebc,0xe68fe462),LL(0x60e87a33,0x48e37752),LL(0xcd62216e,0x703956e1),LL(0x0dcfead1,0x3a09a4d6),LL(0x491340a6,0x49d2c6bb),LL(0x0b013428,0x50df11ed),L_(0x0000013c),
+ LL(0x46d493a7,0xd8099e2f),LL(0x2aad5a31,0x5920a298),LL(0xb4992465,0x07aa2d85),LL(0x6aeecdc9,0xe712f629),LL(0x2a16e6d8,0x8639dfb4),LL(0x36815fc1,0x2a477d95),LL(0x0b2f5359,0x7c3ca55a),LL(0x896f9530,0x05522116),L_(0x000000ad), LL(0x41d24f09,0x208b956c),LL(0x65da1fcf,0x1c1f9a0d),LL(0x1534c8eb,0x772539f2),LL(0xb39694db,0xbc2cb67e),LL(0xf14a06ea,0xf6e48c27),LL(0x4aa51441,0xe7141d18),LL(0xbd52c5e3,0x7983136e),LL(0x77a0099a,0xd7f96b63),L_(0x000000a5),
+ LL(0xfe4e08d0,0x0a99ca48),LL(0xd8a3e48d,0xb1ee6ff6),LL(0xa6f4001b,0x2ec4e0b2),LL(0x04f03a29,0xe977781e),LL(0x0605bcbc,0x0f8d3aa3),LL(0xa1ff6ad7,0x052c4409),LL(0x13eedc9a,0x211fe699),LL(0x4cc42df8,0xd70f26db),L_(0x00000057), LL(0x9eae5eec,0x00258026),LL(0x08667174,0x7f49a77b),LL(0xa5dfdb47,0x0446d9f9),LL(0x6b646fc8,0x24ebc0c9),LL(0xb269fd06,0x244a494a),LL(0xd5fd906c,0x9c16866d),LL(0x27e6983d,0x545f39fb),LL(0x798c184b,0x5fdefa1a),L_(0x0000019b),
+ LL(0xb90f9d0d,0x1e365108),LL(0x765f67fb,0x1aae9f80),LL(0xb1b38d14,0x7a9407e4),LL(0xc8424d69,0x9693e7cc),LL(0x91d93e3f,0xba50e7d2),LL(0x385c13c5,0xd94ecd34),LL(0x6fcf73c9,0x80eb0bb6),LL(0x0d598f4a,0x1c4d4c29),L_(0x00000172), LL(0xbbeb3c79,0x3b0fb9a3),LL(0x326d546e,0x4c6d27ba),LL(0xa848cf09,0x09d2dc18),LL(0x46c0e416,0x6f0069ca),LL(0x9231b926,0x1c4aef79),LL(0xbdbead08,0x9d4dabac),LL(0x272ba195,0x8e216ceb),LL(0xcc49b720,0x83cc03ec),L_(0x000000ba),
+},
+/* digit=21 base_pwr=2^105 */
+{
+ LL(0xb5250d8d,0xd64c0998),LL(0x7c43b599,0x85a2ec86),LL(0x4c9f6ac7,0x59f29f0d),LL(0xfaa4ec8b,0xf16ae8c0),LL(0x2017604d,0xab8d8f78),LL(0xbb59089d,0x2772bc38),LL(0x38403982,0x6e88e817),LL(0xf3d1571c,0x7d4e8e0c),L_(0x0000007b), LL(0xea0f9192,0x477bc572),LL(0x39b5eb10,0x8d22a645),LL(0x77d71bc8,0xd769223e),LL(0x9734dc62,0xfe2b562c),LL(0x41cdb0ad,0x3173fab2),LL(0x70ddf3ff,0x997d6033),LL(0x70dbbbbd,0x6d59561f),LL(0x998a88a5,0x64aafc32),L_(0x000000be),
+ LL(0xdeb9f4b8,0x449a64c8),LL(0x674c0fe9,0x81603532),LL(0x01e88fe6,0x595c6e13),LL(0x913b8697,0xf6f513d4),LL(0x3b6d478c,0x88c1e320),LL(0xb2857351,0x90cfb68d),LL(0xdfb9fd43,0x6c4bb93b),LL(0xcc660149,0x3f388af7),L_(0x00000063), LL(0x23175237,0x9a5258fb),LL(0xacae0a8b,0xb741a40d),LL(0xba0560ab,0x795d005e),LL(0x3978bc6a,0xcaa47999),LL(0x1c0b2496,0x1ff04fef),LL(0x6ddcefe7,0x47c3b092),LL(0xf281ff39,0xcc93f3d8),LL(0x23027cc7,0x773c9a3f),L_(0x00000078),
+ LL(0x01d1f8d5,0x21f6a156),LL(0xc4591dc9,0xf7c15406),LL(0xb36c8aaa,0x3b0d0813),LL(0x287834fd,0x44ef9e76),LL(0x94a18ce5,0x52fb6092),LL(0xbd019877,0xb24d08d9),LL(0xd4816092,0x39d2d32c),LL(0x188b097d,0x5b9f00f2),L_(0x0000013a), LL(0x0979e9da,0xccda9d6f),LL(0x41dad104,0x637d2807),LL(0x4ee619b7,0x0f5a9cc8),LL(0x4f3d7156,0x97bb554b),LL(0x367054b8,0xe890a210),LL(0x3f1f61c3,0x0784aff6),LL(0xb92963c2,0xc9acc43c),LL(0x309317af,0xdadb0d3e),L_(0x000001c1),
+ LL(0xd52ab832,0x6d5e67b8),LL(0x049665d8,0x19993eb2),LL(0xb56e1ced,0x7a62ba87),LL(0xdfb9c1fc,0x6fc5cf75),LL(0x4712b627,0x554f5dad),LL(0xe0548bd1,0xecba89fb),LL(0x1ee24125,0xfa18f5ad),LL(0x7e176a53,0x8796b526),L_(0x000000e1), LL(0x7a9eb450,0xada0f1a1),LL(0xe4e5f968,0x89107584),LL(0x8e12a3e0,0xd6a2ba69),LL(0x1ee9c73c,0xe23b2a1f),LL(0x43a76e02,0x428e9adc),LL(0xe3d7526f,0xf09d62c6),LL(0x0557ab8a,0x37cd537d),LL(0x2758b1d3,0xe54434b8),L_(0x00000000),
+ LL(0x2fd63eb2,0x2d008a6b),LL(0xd28295a8,0x6d2db388),LL(0x2d6dd882,0x7d1d9977),LL(0x1f0a2196,0xa51d2cc4),LL(0x5e445be3,0x52abdb6b),LL(0x3146aac1,0x1f1b1ee1),LL(0xfac49408,0x92df369d),LL(0x84b1d832,0xf67ffdf5),L_(0x000000da), LL(0x35058c28,0xba8a7d18),LL(0xfa0e70ac,0xf53c34b6),LL(0x3063c19b,0x4954b990),LL(0xcac557d4,0x2d1447f0),LL(0xc89953df,0xc7aef4e6),LL(0x66df6476,0xcb978dd6),LL(0xc6d8f86c,0xf9c4098f),LL(0x024e891d,0x25468ae2),L_(0x000000aa),
+ LL(0xcf9cd67b,0x9893947c),LL(0xe7519a11,0xc44aa926),LL(0x9787209d,0xf096efcd),LL(0x743501fd,0xce9a1706),LL(0x1f7551cc,0x684716f6),LL(0x8dae5405,0x149e678c),LL(0x4cc025ce,0xa47c9f5e),LL(0xb9f91415,0x9acbec1a),L_(0x00000058), LL(0xb6fa6da8,0x1acf3849),LL(0x7e3ea9f8,0x0e3c4dae),LL(0x4d104dc4,0xadaff9d7),LL(0x5ec06e69,0x2c84d798),LL(0x553ccd90,0x93c28668),LL(0x32f13211,0x585b3068),LL(0x2907a89a,0xcdceca12),LL(0xb9c0d594,0x128fec44),L_(0x0000015d),
+ LL(0x7592747c,0x1698ff12),LL(0x50452a3f,0x34e63149),LL(0x70c02b2e,0xa04d3b54),LL(0x3afdb0b0,0x61ed2692),LL(0x91c5ad02,0xd6e4e6a2),LL(0x602aa43c,0x134189db),LL(0x4a9101c1,0xf2cd081d),LL(0x4ee8352b,0xf7a72eda),L_(0x00000199), LL(0xb3ee6207,0x04ba1ce3),LL(0xf4179875,0xa4294fcb),LL(0xe4a0b700,0x05833496),LL(0xb77b6e65,0x8229a64f),LL(0x204eabae,0xe9137cfc),LL(0x4ba1e0a9,0x66c9fb36),LL(0x5ece8d91,0xabbbb589),LL(0x725a0003,0x62522294),L_(0x000001a3),
+ LL(0xabc70424,0xfe36c3a6),LL(0x11953f80,0xd15f704a),LL(0x0b4cc57c,0x3d3a8bb5),LL(0x347df44d,0xb5099398),LL(0x3789e215,0xd81f3a55),LL(0x5f2bce30,0x853ed011),LL(0x0b7f91f0,0x20d53ac9),LL(0x8d7ec293,0x63e7bfbe),L_(0x0000005b), LL(0x232c6da4,0x56cdcd80),LL(0xc636cf5e,0x21241d8f),LL(0x6e4c3d96,0x6812f9d5),LL(0x81fb84a8,0x7741d3de),LL(0xb50a7928,0xbab3d77e),LL(0x7cc80386,0x8f374862),LL(0x1901afee,0xbf5ceb2a),LL(0xdd95591f,0xed0c8140),L_(0x0000000a),
+ LL(0xbfe596a3,0xf412c36c),LL(0x0ee07a01,0x426518b8),LL(0x54499ba5,0x89e701b7),LL(0x380c3953,0xf3f8a9a9),LL(0xd8749088,0x809a3666),LL(0xc559f6c7,0xe768213d),LL(0x64aff50b,0xaad0b2e7),LL(0x0535ff88,0x68771b34),L_(0x000000cd), LL(0xa5e475dc,0x7ec42d0f),LL(0x4a3e7bea,0xf9c7931c),LL(0xe0127a41,0xe2d8d114),LL(0x88a09cfa,0xc08a0d23),LL(0xa27150fc,0x052224fb),LL(0x1880e3c3,0xc80a285d),LL(0xc9c2bfb6,0xd52dcb46),LL(0xfd0b235d,0xfb31d609),L_(0x000000df),
+ LL(0x43934d7a,0x058ee09e),LL(0xf551f7ab,0xd68828a3),LL(0x85ee0c11,0x6925306d),LL(0x45a463ec,0x9d6c7188),LL(0xf851554d,0x962b1441),LL(0x66783d33,0x32aca09e),LL(0x856ca966,0x9146adcd),LL(0x5f7a7608,0xfe631a24),L_(0x0000011f), LL(0xe52c21b8,0x28d6e11e),LL(0x0d442988,0xc65a878d),LL(0x0f8c7ce6,0x332a94e8),LL(0xf933213e,0x0a2bf942),LL(0x055f0bf3,0x0e64c7cf),LL(0x371deac5,0x34d3b9fd),LL(0x384367de,0x6f42cc1a),LL(0x15ed6027,0x8f2a65d1),L_(0x00000198),
+ LL(0xe7f29199,0x1243edd3),LL(0x7356cd93,0xc68eb0e6),LL(0xfc213d5b,0xa963c442),LL(0xd8a42be8,0x426acfcc),LL(0x4e52c125,0x3019a35c),LL(0xcccbb098,0xcbc21858),LL(0xd433019c,0x687acf0a),LL(0x47525d0f,0xce5e2216),L_(0x0000002f), LL(0x4634f680,0x88d6b26d),LL(0x6dad247f,0xa7f32d3f),LL(0x70a43312,0x340a2808),LL(0xe2da73d8,0xed020b20),LL(0x477f5bf7,0x752a7c57),LL(0x84e84209,0xaf283680),LL(0xdce8d8d1,0xf2a576b8),LL(0x4e1b6410,0x6cfe6e79),L_(0x00000095),
+ LL(0x24f5d0cd,0xf28c9f4c),LL(0xd2aab695,0x7916e1ca),LL(0x8e97f41e,0xe9e93d40),LL(0x40703872,0xd7c8afdf),LL(0x78640530,0x8fe1f1c7),LL(0xfb5cc433,0x2060da94),LL(0x7302096f,0x953a5bfe),LL(0x62d3763e,0x4947fc61),L_(0x00000033), LL(0xc1869802,0x92108fd5),LL(0x8477b34f,0xe9b6b7e8),LL(0x31f306a1,0x306db354),LL(0xd16d3be6,0xdf966d91),LL(0x0deb9d15,0x62b5d760),LL(0x613eaff2,0x22a569a2),LL(0xae4f8efb,0x0eeb67c4),LL(0x9bca80a4,0xac4e55dc),L_(0x0000015e),
+ LL(0x0805ca08,0xe7b9391b),LL(0xb559bea1,0xd94e135b),LL(0xbbc93e2a,0xca27f88b),LL(0xda4f9fae,0x9fac28c9),LL(0xe1b8ef16,0x5f1ec2d6),LL(0xfd385151,0x49bb68ca),LL(0xfb07a8a5,0x55e48d66),LL(0x146bc523,0xe1490dad),L_(0x000001ce), LL(0xc95026ef,0xd3c160fa),LL(0xec69a98d,0xf736bcb4),LL(0xb1767df2,0x0bfa04f5),LL(0x48e96045,0x87d98ff0),LL(0x977f6553,0x6992858f),LL(0x17332805,0x22fe39cc),LL(0xe8ffd592,0xc326d64f),LL(0x6551c98c,0x12a83f56),L_(0x00000129),
+ LL(0xfb1fe590,0xdef70c89),LL(0x5d8bd28a,0xb3dcf1dc),LL(0xe969cb6b,0x157c6b46),LL(0x846f656e,0x30bef44a),LL(0x3e3ab4ad,0x14cc18c8),LL(0x63d1dbea,0x10262f96),LL(0xfe27704f,0xa567503f),LL(0x1ff786bf,0xff184f96),L_(0x000001d0), LL(0xa08df1ab,0x92281a63),LL(0x41b9f732,0x4f7c669f),LL(0x4f4c7a3a,0xd9aab809),LL(0x6fecf938,0xece45010),LL(0xbed97dd7,0x20855b33),LL(0x41c58421,0xda8500b4),LL(0x6bc3ec2e,0xf0a33322),LL(0xa1fd8aed,0xe01eb188),L_(0x000001d3),
+ LL(0xc846a806,0x1799b47a),LL(0x205f8a25,0x5c7dce04),LL(0x6bc7753c,0x918feeda),LL(0xb0bd3460,0xba66aed0),LL(0xfae70886,0x5d2bdd64),LL(0x37b93501,0xa85e194e),LL(0x12025c5a,0x44f97270),LL(0xb54faac3,0x98c400c5),L_(0x00000094), LL(0x3c93f521,0xabe22aa5),LL(0x3c01512e,0x99aa80de),LL(0xca5be145,0x312f55d9),LL(0x8dbfded4,0x1ca51916),LL(0x3f318a7b,0xa0b3f9fb),LL(0x42abfb1f,0x2303713b),LL(0x195a32bb,0xb6968fd2),LL(0x069ca809,0x52819c4b),L_(0x0000018b),
+ LL(0x7efc38cc,0x662fcdd0),LL(0xd8b1dbd1,0x66c06c9a),LL(0xaf6b6e15,0x28998a9b),LL(0xca45c4ad,0x2d2005db),LL(0xfcd947b1,0x609acb17),LL(0x6bf7b35f,0x25ebaf2e),LL(0xb8a8aba3,0x599df520),LL(0xe4302e3f,0x2bf9b973),L_(0x0000000d), LL(0x2a3c0c12,0x25aebd11),LL(0x8868630c,0xa5529c40),LL(0xaf7c4f6b,0xf5657b1a),LL(0xc0fd49e0,0x3fa70b84),LL(0x4d86ecda,0x39f53004),LL(0xc59dce6d,0x39513f7e),LL(0xbdaf7343,0x822c2924),LL(0xce22dd61,0xacb0786e),L_(0x00000066),
+},
+/* digit=22 base_pwr=2^110 */
+{
+ LL(0xf20e8c4b,0x55dedb27),LL(0x5a0fc338,0x03e8af53),LL(0x788ccd88,0xe10cabd0),LL(0xa1f1f7d6,0x5f889d7f),LL(0x0487ee35,0xa583e303),LL(0x1885d800,0x2fc9f3dd),LL(0x09ae9a4a,0x2887b5bf),LL(0xa554fc30,0xd91181d3),L_(0x00000078), LL(0xcdca6316,0x53b146d6),LL(0x52f280d5,0xdfaac466),LL(0xe0b73d63,0x0d77869d),LL(0xa8a399cd,0xba5ffe6a),LL(0x5c61b757,0xaffc1da6),LL(0x71cf6c9e,0x34d27387),LL(0x20ae1248,0xf184b956),LL(0x7f6504de,0x1c974cb4),L_(0x00000176),
+ LL(0xc1efab45,0x659b9b53),LL(0xd37156ff,0xf8338bab),LL(0xa115d2c7,0x9d1175b5),LL(0xa927371c,0x53c22d6a),LL(0xe5b07da3,0xb79ee37b),LL(0x3585421c,0x8ac92029),LL(0xbe2b0a93,0xd489e47a),LL(0x363622f3,0xccd5811b),L_(0x000000c9), LL(0xf506ac3d,0x41cb54f0),LL(0xbf83fb74,0x527b4fee),LL(0x7d9fa2d5,0x6d4a3597),LL(0xf8ab4037,0xe4619c87),LL(0xd590e945,0xab913b27),LL(0xe8861075,0x389b1da0),LL(0xd8fb707f,0xe0beb49d),LL(0x35140b6f,0x392dd172),L_(0x000001f7),
+ LL(0xe7bedc7f,0xbf4176d0),LL(0xfe15067e,0x0120bf23),LL(0xc1d45172,0x0cb82143),LL(0xfbe2cf59,0xb0e80076),LL(0xd69fd57c,0xbd9b2caa),LL(0x78503bca,0x99823d72),LL(0x2730e435,0x31cc7be0),LL(0x4b145b24,0x10f8d6e3),L_(0x000000a2), LL(0xad5f8d1e,0x4fc47dab),LL(0x7a72c91b,0x564e5846),LL(0x5530b4bc,0x1837936f),LL(0x9913d2c3,0xdf60105f),LL(0x5f1a5851,0x839ef0be),LL(0x3d6d7b8d,0x05890a65),LL(0x48845fee,0x57eb20fa),LL(0xcc1288ca,0xf7b7e05b),L_(0x000000ac),
+ LL(0xdf12457e,0x7082a01c),LL(0x50e34426,0x91616bf5),LL(0x27cfd7b1,0x426bd9ae),LL(0xc299bf54,0x5f468d0e),LL(0x0487ca37,0x695e6354),LL(0xb93aa7dc,0x9322f558),LL(0x8f48edec,0x818f0592),LL(0x957ee742,0xaca5b088),L_(0x00000123), LL(0x85008e45,0x11189720),LL(0x45a01307,0x348cb9e4),LL(0x5bf246e5,0xf5c183c6),LL(0x3fd8ccf1,0xe9a40aeb),LL(0x0fbda6f2,0x087abdef),LL(0xdaf09cee,0x90c450f5),LL(0xe33344ee,0x3abe1073),LL(0xa3404424,0x02a065d1),L_(0x0000018f),
+ LL(0x9dc26b1a,0x5faa9290),LL(0xbd275c4d,0x69ab8c9c),LL(0xebf0d548,0x7a6bc4a9),LL(0xe5ed16cd,0x31faf28e),LL(0x3e681735,0xcf90331c),LL(0xc624be8b,0xfb66de1c),LL(0x42603696,0x2a65b006),LL(0xc07466ec,0x9d7f9688),L_(0x000000f3), LL(0xd25f7e3b,0x44e0d6d8),LL(0x3db25f9e,0xe7ca860d),LL(0xa581c150,0x1c6481b3),LL(0x49e5b0b8,0x62060736),LL(0x82bc7eb1,0x54daac9c),LL(0x376c43d1,0x68353454),LL(0xfb293af5,0x2dde1795),LL(0x7e2ec37f,0xed4ef8f0),L_(0x0000019b),
+ LL(0x9a308462,0x4adfcff9),LL(0x2b928ce2,0xb2e63ba3),LL(0xd02f461c,0x73336d0f),LL(0x04fd6cc5,0x48e88a3a),LL(0xc377597d,0x56c730e8),LL(0x5ac92cdd,0xaf7486b7),LL(0x0317d853,0xe151b910),LL(0x0978da40,0x86c35051),L_(0x0000000e), LL(0xe9b441de,0xb333edf0),LL(0x1ff77a8a,0xd24f0df5),LL(0xed7f23b9,0xdfae6385),LL(0xaa4f024f,0x2a1af93e),LL(0x2ffef5f6,0x6f45d8a5),LL(0x9aa11e63,0x853bb088),LL(0x2271f40e,0x8ed5445f),LL(0x3ccb38c1,0x24afc179),L_(0x00000027),
+ LL(0x6a440850,0x57906522),LL(0x85f7ceb0,0xce569864),LL(0x059b3177,0x45f8df95),LL(0x60efada7,0x2ee7a947),LL(0x87aafc1c,0xdce2c588),LL(0x17fd804d,0xdcf2f1ac),LL(0x10e82f62,0x4b1309c3),LL(0xe852efd4,0x0ef30c42),L_(0x0000012f), LL(0x62278fee,0x95ed2fc9),LL(0x55cd2f37,0x5d0e9c83),LL(0x107085fd,0x479d2ac2),LL(0x85ff5e6a,0x7bd3eb35),LL(0xd6ed74ec,0xc8a77d96),LL(0x366d8e34,0x3be40939),LL(0xf0ec3c90,0x11212f04),LL(0xc317d540,0x5743bb20),L_(0x00000152),
+ LL(0x8145236d,0xffb66d41),LL(0x6ea70c3f,0xc5491789),LL(0xcb17d54f,0x1eaf6e4d),LL(0x7c642a64,0xb15be10c),LL(0x99328296,0x611efe5f),LL(0x30829e9c,0x3cdec049),LL(0x5f18e861,0x1a7c38da),LL(0xab7985a5,0x3536d908),L_(0x0000018f), LL(0x47f989e7,0x8ece50b4),LL(0x5435f6e4,0x13d04672),LL(0x60505d74,0x07efc4e5),LL(0x8a551fa9,0xcc601ad2),LL(0x8fed3391,0x9eeaf4b1),LL(0x4338a854,0x72c52e1a),LL(0x61868d33,0xce70bb6b),LL(0x9c3a511b,0x5c8d75eb),L_(0x0000001f),
+ LL(0x8d15261e,0x69ee64f3),LL(0x508ada39,0xdd8c7134),LL(0xda598cbd,0x36c545ec),LL(0x05133eca,0x0c3f5caf),LL(0x2df79eab,0x71cd5c2a),LL(0x920bc258,0xfa67ae73),LL(0x1fd1e4a4,0x2ed2d89b),LL(0x48726f90,0xd5a8956c),L_(0x000001ab), LL(0x02aa7b62,0x6f23ba5d),LL(0xb20e4dfc,0x4bab12af),LL(0x5fcc6747,0x0006c88a),LL(0xaa6ea9a8,0xe8e4646f),LL(0x9db86f5a,0x8f1f8a76),LL(0xec7745fa,0x455291dc),LL(0xe15a4259,0x155de9ad),LL(0x6c3a6e93,0xf9fdf6e0),L_(0x000000df),
+ LL(0xab1b0548,0x3dc752ef),LL(0x14921ae6,0xdad5624e),LL(0xf829dec8,0x1d1460ab),LL(0x5833de5b,0x9c1ff203),LL(0xd5ded33e,0xfac09cf2),LL(0xbb7c2ad4,0x82d6f980),LL(0xf32dbe91,0xad650ca0),LL(0x82ca75ed,0x6c58e180),L_(0x00000033), LL(0x00ff7cd0,0xea9d2225),LL(0xd3ca85cc,0x434cfef1),LL(0x3bb6dff7,0xce357f60),LL(0x56328ba9,0x0e4a179e),LL(0x4a4804e3,0xe56b9eac),LL(0x254a5b01,0x72a81cd7),LL(0x8b35d349,0xe054875e),LL(0xc8c87ac4,0xe8c11607),L_(0x00000015),
+ LL(0xc31fc004,0x1c6cc43f),LL(0x6f96d167,0x794436fa),LL(0x586761cb,0xd20a52b3),LL(0x3ae24479,0xc24cf7e8),LL(0x5d299550,0x7aabd2b7),LL(0x9cea4b13,0x09feb305),LL(0xd75ffb4e,0x5b6a28d7),LL(0x5d3cd9c7,0x4d85737b),L_(0x00000063), LL(0x1e01bfde,0x743b9f5d),LL(0xe042f5f5,0xe03225a4),LL(0xc7dc3d4b,0xdfce41ae),LL(0x51cdf46c,0xd3c05da2),LL(0x69bf3a35,0xc18cbac7),LL(0xc0889d43,0x51fc0084),LL(0xf694d481,0xbfa4cfd4),LL(0x05438a3a,0xcb44f4a9),L_(0x000001cc),
+ LL(0x3e7e05df,0x22d68d2a),LL(0x6f65a633,0xd77949bf),LL(0x368db479,0x738f46ed),LL(0xe52e22f5,0x7212d465),LL(0x4758d194,0x8bb783e2),LL(0xd677a59c,0x1b239d33),LL(0x60904604,0x9c2f2775),LL(0x8df6497a,0x9be5339a),L_(0x0000007a), LL(0x08475032,0xb5804d78),LL(0xbd5cd190,0xbfbebfb6),LL(0xd58769b6,0x66d25685),LL(0xf9ea5b23,0x206ac283),LL(0x09d14a84,0x845e93a9),LL(0xe03b612f,0xc6807818),LL(0x061fa312,0xeb980705),LL(0x6b501efd,0xfa3670b6),L_(0x0000003c),
+ LL(0x6257d98f,0x509702e1),LL(0xaf686102,0xc4201f85),LL(0x800e44cf,0x7e6e7641),LL(0x35e4ed58,0xa3fd838b),LL(0x5af78edd,0x728e86da),LL(0x0effaedc,0x6fd05e38),LL(0xfd668fa4,0x4ebcbbb8),LL(0xe45dbf60,0x21bf82d8),L_(0x0000016c), LL(0x8050d329,0xf066dcdf),LL(0x1ca3b2b7,0x73890298),LL(0x96fc550c,0xcc4f19d8),LL(0xfc004a6a,0xc9fae54f),LL(0xcdd730f4,0xa5e22c5e),LL(0x2754c10a,0xb60dac89),LL(0x49c473e4,0xd5465b8b),LL(0x30fa2831,0x14688f19),L_(0x00000175),
+ LL(0x4fd6e5bc,0x8f88f135),LL(0x7034290c,0x2f4cd77e),LL(0x61556d3d,0xe5aea948),LL(0xee182466,0xf7fd60b4),LL(0xfaab2132,0x2107919a),LL(0xb164b7c6,0x4909986e),LL(0xb4de2fa4,0xe1076a94),LL(0x331fc36a,0x8fd3234a),L_(0x000000d4), LL(0xee34ec46,0x07524382),LL(0x3f9109b1,0xec9a0d40),LL(0x11cb9eb3,0x7e1084f2),LL(0x1e06d740,0x00717031),LL(0x2928ea89,0x4bde88cb),LL(0xd69d113b,0x20f91a03),LL(0x2ff2dbf3,0x7a3884fc),LL(0xdf24441f,0x198806cf),L_(0x0000012a),
+ LL(0xf9b6b90b,0x076f7438),LL(0x1544e142,0x15274247),LL(0x022e14c5,0x96077c3c),LL(0x30862489,0x789e3935),LL(0x50c53e4e,0x1141fcf3),LL(0x3047c405,0x2cd7f2a5),LL(0x57a60daf,0x9bc52e3e),LL(0xcd0ce692,0x21830d42),L_(0x000001a9), LL(0x37349784,0x77ac72bb),LL(0x403e48dc,0xad70038c),LL(0xc084214e,0x170491ff),LL(0xf7b0b5fe,0xd8cf2d1c),LL(0x4af0ed5d,0xd8301c30),LL(0x00208a5b,0x33f56a54),LL(0x18e018d4,0xfa224eea),LL(0xef56c21e,0xaa9262c2),L_(0x0000002d),
+ LL(0x0c9bed5e,0x328296f3),LL(0x4bb11c1f,0x6050199a),LL(0x15b40849,0x53a7ca7c),LL(0x81bc50ce,0x0a2c1da2),LL(0x682873f5,0x52c0e34f),LL(0x44102170,0x9c5ef21f),LL(0x9f354fbc,0x0bba954e),LL(0x6cd7990a,0x02432a32),L_(0x000000a4), LL(0x976d76d3,0x2be6dddd),LL(0xe55cac7b,0x8a3b8a57),LL(0xda37392c,0xec1dc93e),LL(0x2e3fecd4,0xcf4f78c9),LL(0xfedf3f09,0x1ff689fe),LL(0x03374052,0x092dabd5),LL(0xdf4087ca,0xb9e4e110),LL(0x9d02763e,0xf3f329b7),L_(0x00000089),
+},
+/* digit=23 base_pwr=2^115 */
+{
+ LL(0x016c8d9b,0xbd54382d),LL(0x826f7b17,0x32c36ec7),LL(0xdce64f28,0x22a16680),LL(0xab2193ae,0xaf6a85c2),LL(0x52cc0a0a,0x2f202702),LL(0xcc1335b3,0x2afbf317),LL(0x3743776e,0x0deb4740),LL(0xf9a19900,0x61591f25),L_(0x000000bc), LL(0x2800729e,0x1d84eebf),LL(0xb06a4eb6,0x8bb72608),LL(0xb23e7396,0x2e886104),LL(0x992a3ae8,0x7c8605d2),LL(0x418a91d2,0xe33bec6e),LL(0x5f2b49e6,0xa9d829d4),LL(0xd1f4a3f4,0xeb2f044b),LL(0x28bc4cea,0xb1ef09fa),L_(0x00000063),
+ LL(0x611f97e2,0x04826845),LL(0x6b1ee54a,0x9240015b),LL(0x608b1dc0,0x25698b8a),LL(0xa1390509,0xb5e532ad),LL(0xdf4acb31,0x30c41c46),LL(0x16e05bee,0x07d190c1),LL(0x642c1273,0xb566eca9),LL(0x1b365a48,0x5c3cffa2),L_(0x0000006d), LL(0x9754189b,0x21b8836b),LL(0xa0057686,0x520f579e),LL(0x7bf51510,0xa43d38cb),LL(0x0a4bbc0c,0xfe21891a),LL(0x687446c9,0x1242b093),LL(0x8feab881,0xcacb6d61),LL(0x7a921f31,0xcf611aa4),LL(0xc5cb09d3,0xfef9a8ef),L_(0x000001d8),
+ LL(0x304ccf54,0x4375da6c),LL(0x13287748,0x4fda63b3),LL(0xfa3518ec,0xbc16ce7a),LL(0x996ffb04,0xf3ffb5fd),LL(0xf0a2d30e,0x6da8bb6d),LL(0xa23e83a8,0x08e806aa),LL(0x0642e4da,0x0286c1dc),LL(0x84837dcb,0x8196eb23),L_(0x000001ac), LL(0x584182dd,0x1c8d1ec4),LL(0x9c108506,0x77ca438c),LL(0xdc8649fb,0xdbfc198f),LL(0xaf929bb8,0xa5fbf701),LL(0x60078f43,0xe25fdf9d),LL(0x3f03bcb4,0xca36812b),LL(0x53c1eaae,0xb394d3a9),LL(0x1f8445ff,0x78a7b4ab),L_(0x000001eb),
+ LL(0xf50749b9,0x6d42c81a),LL(0x40e01936,0x7487e815),LL(0xd6072e7b,0x32da913c),LL(0xe7b4156c,0xf1e87478),LL(0xb217423d,0x4880f5cc),LL(0xca344dd5,0x90182347),LL(0x15da2c26,0x87d2337d),LL(0x8d993e28,0x604cc23f),L_(0x00000179), LL(0xc2ec9c0a,0xf9778d40),LL(0xc9dd1808,0x4345027e),LL(0xdcd7b63f,0x198a63ab),LL(0x03bcf65f,0xa7a4c388),LL(0x1130c2d3,0xb476f99f),LL(0xc1ea5019,0x991ad6b9),LL(0x4f67377e,0xa9f5ad13),LL(0xd99047df,0x80641e2f),L_(0x000001dc),
+ LL(0xdc84c719,0x2a4af296),LL(0xf45a67c1,0x963ea378),LL(0x3fc32889,0xe19e2266),LL(0x2477017e,0x3e1c3af5),LL(0x1bbfecd7,0x9c6aea32),LL(0x03afdf5f,0xdd92f5ef),LL(0xd2ffd177,0xcff66e71),LL(0x22d56579,0xca369a53),L_(0x00000122), LL(0x5689a8bb,0x3ecebaa8),LL(0x87cbd3db,0xfef4d6ca),LL(0x92b7d8a0,0xf81b8c47),LL(0x4e50ecbb,0xdd6768bf),LL(0x916361ed,0xf3c09bf3),LL(0x6b31d1bf,0x54e2879b),LL(0x17c7f544,0x44b470e7),LL(0xb6fa811a,0x32df7372),L_(0x000001e9),
+ LL(0xfa7af75f,0x83de0d9d),LL(0x7ea57102,0x4652ceba),LL(0xdd543523,0xb8a36856),LL(0xb586f821,0x19e00261),LL(0x6ce309c3,0x1ed079e5),LL(0xe0f75ac3,0x51ff1099),LL(0x2442020d,0x0c077aee),LL(0x248b83fa,0xc85e1f87),L_(0x0000006f), LL(0x8445d10a,0xaf872b79),LL(0x311d3108,0x2ca2a32b),LL(0x5040c97d,0x4fa4c2f0),LL(0x7615703d,0x80d5eb27),LL(0x36c8c169,0xb5f074a5),LL(0x95daa1e3,0xbda91813),LL(0x672dad89,0x395bd4fb),LL(0xf61f3d94,0xc4a2c81e),L_(0x000000b4),
+ LL(0xa1b80edf,0x04e91ed9),LL(0x861a2094,0x2bca8d77),LL(0xca4ca01a,0x03590793),LL(0xf16fc210,0xc8ad1877),LL(0x48a85346,0x89666be4),LL(0xf0fc0cfc,0x6adba857),LL(0xcd27d0e4,0xdc6000be),LL(0x66de6f3c,0x410cd2f9),L_(0x000001a3), LL(0x97174f70,0x27a30017),LL(0x3566e721,0x523a0305),LL(0x793773f0,0x1ee9afff),LL(0x7fd66850,0xdbc711c7),LL(0x047ae5ad,0x3acae945),LL(0x203bb8df,0xb932a42c),LL(0xfe2439ff,0xd51dba9f),LL(0xe4630688,0x268de595),L_(0x00000036),
+ LL(0x56ff8468,0xcb924e78),LL(0xf61f664c,0x2e404ee4),LL(0x5ac67cb0,0x6b002de5),LL(0x87550da7,0x537e3c3c),LL(0xb6b43fc4,0xcc36c052),LL(0xb2d5ce01,0x0c5bb204),LL(0x8e7f6d0e,0xf930fde8),LL(0x09c188bb,0x056f87d9),L_(0x00000168), LL(0x68bd3a01,0xbd1106b6),LL(0xe76203aa,0x0182e8dc),LL(0x02fff311,0x1307d3fa),LL(0x96bf7d1e,0x71013392),LL(0x6ed2ca34,0x24a22e45),LL(0x1b668eed,0xe4102d01),LL(0x79cf95e5,0x681d10cb),LL(0x6c6693b0,0xf94e08ac),L_(0x00000155),
+ LL(0xec2c327b,0x4ea63be4),LL(0x7d917da9,0x5de2c336),LL(0xadecf30f,0x0955c66b),LL(0x81dabb28,0x6e473865),LL(0x19491209,0x1d9702d7),LL(0xa1f53ee2,0xa4bef482),LL(0x26877597,0x0315b12f),LL(0x18b70eae,0xbca15f03),L_(0x00000095), LL(0x28dc543a,0xe0496daa),LL(0x1afe44da,0x518d4571),LL(0x824106af,0xf72d3376),LL(0xa6b1f64c,0x1149d145),LL(0xbe64f34b,0x8c71ca30),LL(0xd7b0b0f7,0x3acfa7a5),LL(0x58a3ea6e,0xcc0bc394),LL(0x5e42d97e,0xe6ba0355),L_(0x0000009f),
+ LL(0xb9413a50,0xcc323242),LL(0x25b57cdb,0x0afacd89),LL(0x4d31e696,0x075e88b1),LL(0x80ecc1c8,0x4d853d58),LL(0xe213393a,0x5c2d17b4),LL(0x1d02b340,0x29f6c35a),LL(0x7f4eb22a,0x763f945f),LL(0x991b6570,0x38d9e916),L_(0x0000008a), LL(0x8faf74b7,0x919e262a),LL(0xcdb707d0,0x7b3ccd89),LL(0xc28362e2,0xe31adec3),LL(0xd970a8d2,0x2e5340b0),LL(0x11f1ff4f,0xb76d44ac),LL(0x42bd388a,0x528cddee),LL(0x2165e718,0x7cb055f5),LL(0xa8c2384a,0xd81cae87),L_(0x0000003b),
+ LL(0xca0a6c60,0x95c8885f),LL(0x504d777f,0x6a9d125d),LL(0x327807d9,0xd624f272),LL(0x0e53c679,0x95ea222f),LL(0xe1387ac7,0xb1597752),LL(0x656acd9a,0x352cac8c),LL(0x6190d15d,0x61bf8856),LL(0x01af7e20,0xc719ce43),L_(0x0000007b), LL(0x3f4af185,0x83f36452),LL(0xfdd73cd6,0x314de5cf),LL(0x46e7aa4c,0x50ce899f),LL(0x7424d707,0x38e875fc),LL(0x3221445c,0x9f3a7a99),LL(0x974ba6c9,0xe06eb667),LL(0xcc871495,0xffe48ed2),LL(0xda22c28b,0x34965180),L_(0x000001bd),
+ LL(0x067ec5b4,0x8ee0ef29),LL(0xfb175926,0x1c82db3e),LL(0x93d33d24,0xb912da50),LL(0xbb15ebc6,0xcea7d557),LL(0x53132904,0x2a95c0c2),LL(0x1728bce5,0xd703338d),LL(0x3e934774,0x9ff62322),LL(0xa4bdaa17,0x5a25267e),L_(0x000001c0), LL(0x490cbf77,0x4db3f1bf),LL(0x49cf21d2,0xa18c0ec0),LL(0x1567c730,0xf359d391),LL(0x8f78c3e0,0xa1bf7eca),LL(0x9f9aa64e,0x4252d4d8),LL(0x5b2ffd6d,0x3cf77a2e),LL(0x70d5197d,0x420f1fde),LL(0xc4ac046e,0xfbaabfd6),L_(0x00000182),
+ LL(0x114c23ed,0x6f164190),LL(0xacca9818,0xdc3afb13),LL(0x75acc7ba,0xf8e7944e),LL(0xaec6267e,0x266c89d3),LL(0xc0d5983e,0x7a35b6ea),LL(0xc7025ed3,0xcc6f8ba4),LL(0xb3a78dfe,0xe18e7845),LL(0x43ed79a0,0xd3e423c7),L_(0x0000001e), LL(0xf7626a80,0x7ad878cd),LL(0xf2ddd3e7,0x7ad2ccc8),LL(0xdd3af93f,0xe988a2b1),LL(0xc20e3266,0xf31777a1),LL(0xc508e478,0x5f61decf),LL(0x6ca64937,0x38c983d0),LL(0x63f7f656,0xffbb003b),LL(0xff837029,0x32104839),L_(0x00000105),
+ LL(0xbf81b286,0x0f23d833),LL(0x787960d2,0x1a82d064),LL(0x1e23da2c,0xf31fd1ab),LL(0x632fca0d,0x67beaa32),LL(0x48f5480d,0xb9e45d26),LL(0xbb162f9b,0xd434d563),LL(0x10e02089,0xa10eef01),LL(0x647082d3,0xb7735d1d),L_(0x000000b7), LL(0x701e6ecf,0x40d95b89),LL(0xe61d29d9,0x68b4d3bb),LL(0x1c7d5b4e,0xd78df4bc),LL(0xbd612a5a,0xd83302ca),LL(0x80982747,0x511140b2),LL(0x754f6279,0x16e7211a),LL(0x1d43610e,0xf0dec954),LL(0x3999e665,0xbaca9f0f),L_(0x000000e6),
+ LL(0x61d2f78d,0x38877144),LL(0x1ee1b012,0xed46bb99),LL(0xf5e943b8,0x376d8b60),LL(0x1bc6b4d7,0x4b6cb863),LL(0x7dc297da,0x216481d0),LL(0x123486d4,0xc754e76d),LL(0xb1c0a1e8,0xdbcf937b),LL(0xadf930fc,0xdaf06ef4),L_(0x0000013b), LL(0x843220dc,0x03210a22),LL(0x979dbfb5,0xd444dbbf),LL(0xd232212a,0xef6c2520),LL(0x35e7b199,0xee0108b0),LL(0x21bd8267,0xe6dba29f),LL(0xc9483241,0x8b0b6ada),LL(0x304a26d8,0xebc36edd),LL(0x88b58b4d,0x0b4cd577),L_(0x0000009d),
+ LL(0xb2d92526,0xee657257),LL(0x208861aa,0x5d4bf915),LL(0x8adfc02b,0x8b2a8792),LL(0x51bf7839,0xd1929e39),LL(0x6ac2d82c,0x51878fc6),LL(0x2453f26a,0x67c6a197),LL(0x0ebd963c,0x29e6f9cc),LL(0xab6feb88,0x6a8aecc7),L_(0x00000098), LL(0x8df74f15,0x9f30636d),LL(0xe6a5beb0,0x5f6af11d),LL(0x247b3767,0xa04301fc),LL(0x7893d122,0x577167d7),LL(0x4d974f3f,0xea69addd),LL(0x983fc60d,0xd35bf8be),LL(0x627055a8,0x95c80a83),LL(0x51c83aaf,0xa21f06b1),L_(0x0000009a),
+},
+/* digit=24 base_pwr=2^120 */
+{
+ LL(0x664d27c9,0x1dc1e136),LL(0x3cf04eac,0x1c4f5e85),LL(0x599f9890,0xcbc44867),LL(0x34ff0e3e,0x5a12a7f8),LL(0x851c12ee,0xf066c152),LL(0x7ca61be6,0x73832df9),LL(0x7153da2c,0x14acdbe2),LL(0xb73e882e,0x87567338),L_(0x0000010b), LL(0xde5b00ae,0xd1fe8148),LL(0x05fd56d3,0x49ee53a4),LL(0xe986a7db,0x11101981),LL(0x695cf7bc,0x750760e2),LL(0xb6aca2a9,0x4815cb90),LL(0x9f5ace2a,0xc3dc9f29),LL(0x6b06b61b,0x3b28698d),LL(0x6b2e5c22,0x5687880a),L_(0x0000000b),
+ LL(0xe5d59cd4,0x1af552c0),LL(0xaaadcddf,0x160c329a),LL(0xf071e91a,0x77f33e93),LL(0xf9cbbaf7,0x6e836178),LL(0x74f3bc69,0x430ecc6d),LL(0x349ec647,0x9e682571),LL(0xbbec63ff,0x3f624e0d),LL(0x64eff8b4,0x0d19e23a),L_(0x00000000), LL(0x84cb54f8,0xce60d534),LL(0x3eff3832,0xe89d00d8),LL(0x12f600da,0xf8745dbd),LL(0x3eb89d2d,0x48217cd8),LL(0xe79b868a,0xc5ce0f8a),LL(0xc2c4ae44,0x0fe94021),LL(0xa980ca2b,0x5ab9482e),LL(0xf0414674,0xcffa33fc),L_(0x000001c2),
+ LL(0xfd99bf9e,0xb176fd51),LL(0xa2b01fa7,0xbebf27e3),LL(0x1a17875c,0xca98073a),LL(0x1a08df20,0x73873253),LL(0xcea9581c,0xdc360b05),LL(0xbad316bf,0xb8a68986),LL(0x9591db5f,0x6941db20),LL(0x838ce851,0x0df495ad),L_(0x000000d5), LL(0xa5b29337,0xb5d46b24),LL(0xf0d09b27,0xf2b04a4a),LL(0xe34ef392,0xc4e0cb50),LL(0x9c028d0c,0xbe127061),LL(0x60b8995b,0x202d9276),LL(0xa9beaf92,0x3a61c444),LL(0x686effea,0x7cc238c3),LL(0xce321e42,0x09075147),L_(0x000001e6),
+ LL(0x4c62b53e,0x16e9dd16),LL(0x8a3599a2,0x05317187),LL(0x0821091d,0x24ef2697),LL(0x6ed2cda3,0x4950f2f1),LL(0xeaefd2e9,0xc815b553),LL(0x9f00612d,0x47c1f801),LL(0x930eacc5,0xfd1730a1),LL(0x136fc4a1,0x8252d52d),L_(0x000001b8), LL(0x6c4bee68,0x6b77522a),LL(0x2deb3842,0xaea9f6b1),LL(0xca869197,0x3823d16a),LL(0x187c4319,0xf12c9d38),LL(0xd5cc9828,0xe31f43da),LL(0x436529c3,0x0781728a),LL(0x63d40c6f,0xbfbb0978),LL(0x94da1798,0x7a196933),L_(0x000001e1),
+ LL(0x820f8b6c,0x95a20633),LL(0x4ce60573,0x98b05888),LL(0xb9e9ac42,0x9f28e7bc),LL(0x770f80c7,0xabb15751),LL(0xd0147212,0xcce75763),LL(0x67296f82,0x8034afbe),LL(0xa2950d9f,0x11791412),LL(0x9731ca6f,0x87c616f9),L_(0x000000bb), LL(0x004bd5df,0xc7f27dc8),LL(0x5fa5d017,0x95bcc4fc),LL(0x9fdb4deb,0x39917e40),LL(0x30051c1e,0xbefa777d),LL(0x3f36dfcf,0x26ebd51f),LL(0xd9696a85,0x16cc089e),LL(0x58a6c0bc,0x6723f03c),LL(0x3193efb5,0xe4f7a675),L_(0x00000177),
+ LL(0x63cd0fae,0x0082edbf),LL(0x7ff0d41a,0x1522ffb6),LL(0x76aa53cf,0x453dcda7),LL(0x3ac99dda,0x634bcd8a),LL(0xca31a6bf,0xdf09af12),LL(0xda6aee65,0xb96045d3),LL(0xb2e1c131,0x6f3c7e70),LL(0x72188816,0xcb58f8b9),L_(0x00000121), LL(0x1dcdf91d,0x51f3e032),LL(0xd4da7b11,0xcafbe9a8),LL(0xe3a95788,0x39c010af),LL(0x8c87071e,0x05cb3faf),LL(0xafcfc04b,0x08a702fb),LL(0x42c775b7,0x5b3b6187),LL(0x8aab53d6,0xb84f9386),LL(0x8bb27ffb,0x08491b70),L_(0x00000075),
+ LL(0x4b15dd19,0x2f20328d),LL(0xb581eaa6,0xd269e274),LL(0x8fb2a285,0x604b1779),LL(0x5b26ea89,0x3aa53ad7),LL(0xd5119e93,0x9fa62691),LL(0x3e002a94,0x8ba167e0),LL(0x62921501,0x195dffb0),LL(0xe4ae2796,0xdc1f93ea),L_(0x00000082), LL(0x1f7743f2,0x980977c6),LL(0x654950f7,0x422ba8f7),LL(0x9f0fcf77,0xb7dc1d4c),LL(0x6b970562,0x0b2f7617),LL(0x2de6068f,0x894ad6c1),LL(0xd3457950,0xe569d53d),LL(0xfc63f78f,0x14981ae1),LL(0xf2a90b52,0x902dadf9),L_(0x000001ab),
+ LL(0xd7474a9e,0x5406fc86),LL(0xc759885f,0x5bd2a491),LL(0x2d4cddc5,0xc35aa122),LL(0xb5461045,0x2154985e),LL(0x188b457a,0xff0dcbe4),LL(0x235148df,0xd70c6a7e),LL(0xa2535a30,0x7d8e9016),LL(0x6be2be33,0x99a19ee9),L_(0x000000f8), LL(0x747030fd,0xa1dc1860),LL(0x519771ba,0xea4c9a1d),LL(0xe6bf7f8d,0xc44825c6),LL(0xfd4b88d5,0x48270d80),LL(0x619d7b16,0xcd7c088d),LL(0x50ac4887,0xcc2ce67f),LL(0xd1ac72f9,0xaafa6b89),LL(0xafdce091,0xb9365de8),L_(0x000000c9),
+ LL(0xb743d17c,0x7862482b),LL(0x264a6de7,0xcc327c76),LL(0xf0e8036a,0xdd64bd2f),LL(0x58aff74c,0xd63e620b),LL(0x0d34c089,0x792f3b2b),LL(0x3cffd08d,0xb8e40e30),LL(0x2466d774,0x5be025a8),LL(0x83e235d8,0xe9d3cf63),L_(0x000000e7), LL(0xb1498ace,0x93020cb2),LL(0xfef8d504,0x75b3c700),LL(0xa8404df1,0x1f7b3ca4),LL(0x25cfc4f3,0x3dca1055),LL(0x21fc5f18,0x73402205),LL(0x096d5dd9,0xf8afba2b),LL(0xe13c530e,0x23634751),LL(0x7b6b3f2e,0xca1be461),L_(0x00000076),
+ LL(0x544eb7eb,0x662154b2),LL(0xf439d6d1,0xc1e155ac),LL(0x0ae5f642,0xa2dd72ce),LL(0x55e79db1,0x71c8da23),LL(0x7905f65a,0x29ffbd0d),LL(0x21383ef6,0x39515d47),LL(0x28c8f708,0x739d692e),LL(0x67130a0a,0xe8283125),L_(0x00000098), LL(0x8eb8a388,0xe6e2797b),LL(0x7f499c43,0x57f047a7),LL(0x8571cbc2,0xe0447784),LL(0x8f068f3b,0x85efc6b1),LL(0x9497bb27,0x4b52e9d2),LL(0x5f954c9e,0x896bc179),LL(0x299e982a,0xfe335eac),LL(0x2fe557d1,0x15ed5037),L_(0x000000c8),
+ LL(0xc3bc83c7,0x45022f8e),LL(0xe4a9bc90,0xcb58c8df),LL(0xd48d6951,0xf9950f95),LL(0x3a67fa88,0xcfc52411),LL(0x8aad81c0,0xea907dba),LL(0x193feef4,0xbcf6e329),LL(0x847c4744,0x51539dcb),LL(0xbfaf49f8,0xe1705ff1),L_(0x00000189), LL(0xe91285a5,0x7e920920),LL(0x93070144,0xf4a966bf),LL(0xebc39792,0x26b6e21a),LL(0x5380b22b,0xe6fd22df),LL(0xf5ce884f,0x866ea333),LL(0xbbd94169,0x3e0f11de),LL(0x3a3c3087,0x2fd9dd8d),LL(0xefe676ed,0x227a4771),L_(0x00000016),
+ LL(0x429e8a22,0xe1817fcc),LL(0x7ff2aece,0xe4758b83),LL(0x15a3e785,0x768947ca),LL(0x54660e77,0x2c352eca),LL(0x1486538c,0xaac39b78),LL(0x86e8fec5,0xaa608004),LL(0x414e550f,0x32acb85c),LL(0xa6493364,0x2fd7f2f3),L_(0x00000099), LL(0x2b5bf57f,0x92784c4d),LL(0xcdd72f6c,0x18258546),LL(0x7a0d4685,0xabc0f043),LL(0xa00c87a4,0xfab6104e),LL(0xd492feca,0x0edfb4e6),LL(0xd10ae319,0xa0ad3d18),LL(0x74331002,0xb3e27cea),LL(0x1c928b0f,0x43d33a89),L_(0x000001cb),
+ LL(0x4af6b119,0x7f32173f),LL(0x5c89c248,0x82306719),LL(0xa569342d,0x5318cae6),LL(0xaf11c888,0xb3871b59),LL(0x43ea3a04,0xccb1894e),LL(0x7d6e369f,0x584ca2b8),LL(0x4a0018e5,0x01476d73),LL(0xc7bd79b4,0x6328258d),L_(0x0000017f), LL(0xfc19d3b7,0x607af994),LL(0x27381ef0,0x686aee98),LL(0x28efc122,0xe773f07b),LL(0x1e1202b4,0xb162dfca),LL(0xd4141270,0xfcd08076),LL(0xdb1eed20,0xd4dbdbd9),LL(0xec8f2a2a,0x31a47c86),LL(0x153d8ef2,0x74c6410f),L_(0x00000122),
+ LL(0x726b7b76,0x0b272d33),LL(0xb7894299,0x2ade0047),LL(0x7215a462,0x8525f896),LL(0xe97dd7d4,0x8faa7fcd),LL(0xf320c207,0x2aaff4f3),LL(0xce32f0aa,0xf98216e5),LL(0xe5a62be1,0x4be7ec71),LL(0x057e6071,0xe8262bc9),L_(0x000000c9), LL(0x43441bd4,0xe0348118),LL(0x1e1c1702,0x67b5b771),LL(0x61dc410d,0x540bfa59),LL(0x52daedcf,0x722428bd),LL(0xa96118aa,0xced4360f),LL(0xaa07a68e,0xd1ae09f8),LL(0x4870992b,0x98c1f34f),LL(0xf97358de,0xea267e80),L_(0x000001e0),
+ LL(0x7daaa5fc,0xb75d5e00),LL(0xba7367a8,0xcb6a4c5d),LL(0x698ec043,0xc4a8a172),LL(0x58a0e780,0x1c52f090),LL(0x45a0c118,0x7ba85810),LL(0x41f652a4,0x261486ed),LL(0x14a0dead,0xe61b0bd4),LL(0x4a38be55,0x881f7207),L_(0x0000004d), LL(0x46fc26a5,0xb678cf5d),LL(0x8cf0f2b1,0x1c805e0f),LL(0x50bc855f,0x4c9f70d9),LL(0xab5b49a8,0x82a11ee6),LL(0xbf5c0c4e,0xecca8fd8),LL(0x30c1e91a,0x40104321),LL(0x3bccd5ea,0xf20e8305),LL(0x7cc38a3b,0xa89c9d80),L_(0x00000144),
+ LL(0x18b1bd58,0x6dc98840),LL(0x33535047,0xa105e17e),LL(0xf240ea34,0x0ca7c1ed),LL(0xe0a7225c,0x60ee9bcd),LL(0x8d5abc2e,0xd1b7a04f),LL(0xed201196,0x421fd636),LL(0xee08dcde,0x3a41da5f),LL(0x4d648f1c,0x37a2b18a),L_(0x0000014b), LL(0xd13216ae,0xe2574ca3),LL(0x8f4aa46c,0x42b5000c),LL(0x5e6cb8b1,0x2cc007b3),LL(0xd18aeecc,0x139d4602),LL(0xfad62b8b,0x4857b6e6),LL(0x0b803515,0xaaf5703a),LL(0x7dfe5be4,0x5b88d9b4),LL(0xc7e255f1,0xb42f23b0),L_(0x000000ee),
+},
+/* digit=25 base_pwr=2^125 */
+{
+ LL(0x035c3bef,0x9827bf41),LL(0xd6c228d6,0x53bd6003),LL(0xac8482db,0xedd6d84e),LL(0x199f6c6c,0x554b59c1),LL(0xc80a2555,0xbb3dd0d5),LL(0x9a255d70,0xb61698fd),LL(0x8ce8ece5,0x01602388),LL(0x0910e4ff,0x21f2b5b4),L_(0x0000008b), LL(0x3956f121,0xba9be6e9),LL(0xe014bad7,0xd6c8e28b),LL(0x7941a6f1,0x983d3be4),LL(0x93e374aa,0xb03efe8a),LL(0x7787501a,0x2ecc1517),LL(0x3863f010,0x8ce1a07f),LL(0x2339ade0,0xb1181652),LL(0x142e138f,0xed660839),L_(0x0000017d),
+ LL(0x542c405f,0xb7c246de),LL(0xbed2f33b,0xc7b5006a),LL(0xd46decde,0x50c509c6),LL(0x83eafeed,0x09502cf6),LL(0x6c8d2171,0x6fa7b091),LL(0xe284eb82,0x6ef3971c),LL(0x5478a9a0,0x7e812b4b),LL(0xbedbb05d,0xbdf3afd0),L_(0x000001a9), LL(0x519aab50,0x17c0e4a6),LL(0xde9fb976,0x510f0d79),LL(0x2d46f889,0x5085caf9),LL(0x57625cb7,0x63379f4c),LL(0x7679eef9,0x202dc487),LL(0x61e8da06,0xd95a7481),LL(0x933c7094,0x6f198e77),LL(0x7e527ab9,0x3cef9bb6),L_(0x000000a2),
+ LL(0x1843b506,0x587ef556),LL(0xadb4b17e,0xe6db7725),LL(0x223554b9,0x298840a9),LL(0x8ea40d6a,0xb9987d3e),LL(0x088f1989,0x8c544359),LL(0x98c4e679,0x26877124),LL(0xd4955574,0xaeb47579),LL(0x42531911,0xedd6bd8c),L_(0x00000025), LL(0x84ee90bd,0x17da2be3),LL(0x578452ef,0xf3506ed1),LL(0x26ec7e64,0x400c530b),LL(0x0a9d93fd,0x42c14bcb),LL(0xeec28064,0xdbc44330),LL(0x21d894ab,0x1784b7a3),LL(0x83284ca2,0xbd2fe673),LL(0xbdaabf2c,0x333a314b),L_(0x0000000b),
+ LL(0x003a62b3,0x6110cba8),LL(0x3dead375,0x261b1296),LL(0x24e572ee,0x4f710c53),LL(0xa4d924c1,0x3234879d),LL(0x2bb72d3a,0xf0242c6b),LL(0x5319d73b,0x56b72596),LL(0x5d438ac3,0x9c1467ec),LL(0xe4eb1ea6,0x40556d55),L_(0x000000ea), LL(0xbfbdc6bd,0x113bb0cf),LL(0xf755482f,0x1fdd8292),LL(0xb750229b,0x36eb56b3),LL(0x8756dd9d,0xd65055f0),LL(0xad24bc9f,0x305fbea1),LL(0x29626eb1,0xfcecb5ba),LL(0xc9855409,0xf6273264),LL(0x81000d0a,0x9d561b22),L_(0x00000124),
+ LL(0x714f53f7,0xd531bd0b),LL(0x1f33fdc4,0x1e83cdaa),LL(0x527f8e3e,0x867d160e),LL(0xf198e03e,0x1f8e836d),LL(0x319f12f2,0xe5494da5),LL(0x312ddaeb,0x8aa887f2),LL(0x0cacf5c7,0xab111707),LL(0x0ac8def9,0xbe88c645),L_(0x000000aa), LL(0x65f59d0b,0xaae9a35d),LL(0xecaceba5,0x4a0a292e),LL(0xbb26ecc4,0x686acc28),LL(0x1e45b0f2,0x2a87d12e),LL(0x3a62004b,0x0c521e1f),LL(0x1147391e,0x2c697526),LL(0x4d3ecffc,0x940dd92a),LL(0x45f78060,0x3a2ded9e),L_(0x000001cc),
+ LL(0x33a3e9dc,0xf734ebf4),LL(0x6012408c,0x62256296),LL(0xf1399678,0x6234e097),LL(0x152b073d,0xd0a76b3e),LL(0xbf3c9a35,0x1dc1794f),LL(0xca7a4461,0x0ba3b03d),LL(0xc31edda4,0x3859cdff),LL(0x8b3288b3,0xf848ef1a),L_(0x000001b9), LL(0x178320aa,0x8f1d82f1),LL(0x25e150c8,0x41cecb20),LL(0x4d109c13,0xc9d21d04),LL(0x7441f09e,0x7778b13b),LL(0xe84ff4c4,0xa32c0c4b),LL(0xc5ccc687,0x309d686e),LL(0x4ddb0a19,0x9203c78d),LL(0xba0868c4,0x53181ea2),L_(0x000000d0),
+ LL(0x65fb7f46,0xe3ff2a58),LL(0x31973b19,0x2a26ad18),LL(0x67b2d91a,0x5fcc6c2f),LL(0xe2db81e3,0x0637d795),LL(0x74742bd8,0x1ed4fcac),LL(0x26659e88,0x30b9bfbf),LL(0x232b6d3c,0xae535c11),LL(0x97bb1796,0x32eef414),L_(0x0000004f), LL(0x356e33eb,0x4a8e4230),LL(0xc9a735e1,0x8c58bcc2),LL(0xa2ae4a3b,0x1cf20755),LL(0xcba626bb,0x30e29d2d),LL(0xc537d49e,0xa170a87e),LL(0x2ce7cb6e,0x6a6c16d0),LL(0x5f03a6b1,0xa45e1673),LL(0xe7f13685,0x5d8c9454),L_(0x00000148),
+ LL(0xda756c31,0xaf97f8c2),LL(0x16b51e78,0xbb4d7657),LL(0x4d4e4ac9,0x12ece85a),LL(0x2a2be63f,0x2c2556ca),LL(0x191c3b7f,0x12341b0c),LL(0x6c15ecee,0xdf666379),LL(0x2e302dd7,0xce9cb829),LL(0x76d162a4,0xa7f8ba92),L_(0x000001df), LL(0x587aa554,0xd8403973),LL(0x56dae839,0xd9d38a99),LL(0xd9da7dcb,0xb69b8acf),LL(0xd93d0fff,0x4e0adb2a),LL(0xf74f0454,0xbb2ad644),LL(0xb5de013b,0xd489e7d5),LL(0x944ef674,0xa2d2bd3f),LL(0x0ae01d0e,0xdd32d1ec),L_(0x000000ae),
+ LL(0x1e606163,0xe4705f69),LL(0xcf1b879b,0xacfbcaf7),LL(0x1be6ac8d,0x7318370c),LL(0xdc61b734,0x68c96561),LL(0x0073d96f,0xb94c34d8),LL(0xc1901cf0,0xf081cf45),LL(0xe5c4c386,0xf0fb0845),LL(0xcbb72560,0x26daccc8),L_(0x00000139), LL(0x76c20a0d,0x649de0ae),LL(0x12fe8c98,0x69621218),LL(0xdfb8607d,0x8791c2b5),LL(0xe9d74f1a,0x3844e43f),LL(0x58b63a6e,0xa8d06c72),LL(0x30e1aac8,0xb6d9b103),LL(0xc4264540,0x3d6167d2),LL(0x08191333,0x68c04430),L_(0x00000167),
+ LL(0xc3017b9d,0x1aa56828),LL(0x0367e359,0x3cdae245),LL(0xb804f8f2,0x72553e1f),LL(0x67c4cfca,0xb65b5da8),LL(0xd9a5c285,0x9a1f0411),LL(0x613cad66,0xba23bbe1),LL(0xf8b4e4e2,0x1cef34cc),LL(0x8c65734b,0x932e9f3f),L_(0x0000015b), LL(0x97a55485,0x0351d0a0),LL(0x59bb05ec,0x31868efa),LL(0x8bafab58,0x0873b1c0),LL(0xec7f2fe3,0x3643b183),LL(0xc1a9b522,0x8e06d826),LL(0x5a21bdcb,0x8e78107b),LL(0xd0770856,0xf66af571),LL(0xb9c9076a,0xc46c020c),L_(0x00000162),
+ LL(0xce1c46ca,0x5dc8f4b8),LL(0xa33c20bc,0x7ec83bd7),LL(0xd911b15d,0xd15a6121),LL(0x4a74a6f1,0x7ded1664),LL(0x38816e97,0x011743f8),LL(0x3193fcc0,0x2ce300dc),LL(0xda43c181,0x4a353b8c),LL(0x15a04d1c,0xc667d3b1),L_(0x00000185), LL(0x7f19da91,0x0bdf93dd),LL(0xe0cceb86,0x0ead0ff6),LL(0x54678a08,0x869bbb72),LL(0xb18f6184,0x7bd575cd),LL(0x64b65577,0xa032d6e4),LL(0x7c7dc54a,0x322afc12),LL(0x30a518c1,0xb73e6fec),LL(0x94b0be46,0xfb67de43),L_(0x0000016d),
+ LL(0xe164535f,0x0f962f35),LL(0x9c6f091e,0x29586d09),LL(0xc7324d43,0xf0870634),LL(0xfc9e4d8f,0xa54095ca),LL(0xb869d9b8,0x750af3db),LL(0x6d2001cc,0x1a6baecc),LL(0x24533332,0x4d43331a),LL(0x73cd1354,0xe8c54106),L_(0x00000197), LL(0xadd82371,0x24bca00e),LL(0xe99a79ea,0xbfa3857b),LL(0x6523d1b7,0xf152a797),LL(0x74d5c2b9,0x7c8d0d7e),LL(0xca070e93,0x0c8c05da),LL(0x90e17c3e,0x6e856e17),LL(0xc09e9cee,0x45014958),LL(0x157a95c9,0x8be88b6b),L_(0x0000001d),
+ LL(0x25cac8a2,0xcdd92148),LL(0x641d359f,0x2502c5ea),LL(0x6f35d51a,0x3893c7d7),LL(0x20bf4812,0x2ac899fa),LL(0xea66bfcf,0x3dd9d780),LL(0x6686f753,0x5853eeec),LL(0x471826dd,0x3f6607f4),LL(0x63551e77,0xab0845ea),L_(0x0000017e), LL(0xa629b455,0xc75e008e),LL(0x1eb5093e,0xf1fc3d61),LL(0x48e575c1,0x02888aae),LL(0x04ab23f0,0xe87f1ead),LL(0xae16fee2,0xb7f7d076),LL(0x3eebdb5c,0x94d4a8d3),LL(0x1d42f789,0x32f711dd),LL(0xb65c5dfe,0xffe8ae2e),L_(0x0000012c),
+ LL(0x532fb033,0xc71e34a7),LL(0x960dca9f,0xb04fd5f9),LL(0xf94be13b,0xcb350c8c),LL(0xad91afd4,0x507fe2c4),LL(0x64d4307d,0x965e3503),LL(0x5c7ae781,0x150451f8),LL(0x6bf2a6c3,0x730da87b),LL(0x2d1774ae,0x075f7ca9),L_(0x00000198), LL(0x065c4c40,0x7d9d82a2),LL(0xdf7b7ba4,0x9f994c7a),LL(0x02b12659,0xbc50a3bf),LL(0x9dfdd3b8,0x383c8539),LL(0xfd8d4292,0x17ae38e3),LL(0xf28f2f03,0x882096f8),LL(0x5cc24a79,0x4e0ef573),LL(0xf15428a2,0x57f145e4),L_(0x000000e7),
+ LL(0x73fadf09,0x457824fc),LL(0x185ab84d,0x1253397d),LL(0x8d154628,0x387df8c9),LL(0x6bebdcd0,0x9150bff8),LL(0x556713ef,0xe0119e69),LL(0x47194289,0xea336304),LL(0xaea5316a,0xfcab6f8a),LL(0x32095630,0x9256e44a),L_(0x0000017f), LL(0x78b228b3,0x91535ac7),LL(0x1d1ebf3f,0x100cda53),LL(0x2af14479,0xebfd994d),LL(0x0287bad1,0x075babf0),LL(0x868eb0f1,0x4f27433f),LL(0x59c4864e,0xb3ca6bbe),LL(0x042e0b78,0x36fc642d),LL(0xc718e121,0x457b51e4),L_(0x0000008a),
+ LL(0xa6b3bf80,0x8e3c3743),LL(0x2cea274d,0x79b2083b),LL(0xf6accb4a,0xf7eff159),LL(0x1a2ac9cf,0xbd1a458b),LL(0xc30597c5,0xdaf5afd8),LL(0x67ad0a34,0xad0ce95f),LL(0xfcb5f547,0xf492633f),LL(0xd42c927e,0xd70d201b),L_(0x00000118), LL(0x14dfd7c4,0x7325271d),LL(0x511be774,0x532d9f83),LL(0xe33f2540,0x0e1e6624),LL(0x6202d9c5,0xf8f4394e),LL(0x9c8fa1b9,0xf8528991),LL(0x2359d3b9,0xd88ed641),LL(0x4c00c9ea,0x054c125a),LL(0xbd626daa,0xe0db1f33),L_(0x00000053),
+},
+/* digit=26 base_pwr=2^130 */
+{
+ LL(0x658f6179,0xd73be466),LL(0x565e43ad,0x8ce3b9fd),LL(0x4a046e43,0xef2d69e6),LL(0xb337e9ed,0x7f11d4e7),LL(0xb4d2646c,0x09fce23d),LL(0x9cfe36cf,0xf8577ee6),LL(0xd497797f,0x1e1b23f9),LL(0xba0fa9f7,0x813fdfce),L_(0x000000d2), LL(0x4f0db76d,0xbc5801d3),LL(0xba1d6ad8,0xfa8c88b9),LL(0x38f8437e,0x58d2c493),LL(0xdf5755dc,0xa5d4147a),LL(0x9f31388e,0x2454e0d1),LL(0xd880f0ef,0xed7c5174),LL(0xf4ab4400,0x2972f596),LL(0x422f97c0,0xfd1f05bd),L_(0x000001b7),
+ LL(0xefc5f8ca,0xe5308733),LL(0xcdb37e83,0x48081b75),LL(0x60b5bfda,0x38365296),LL(0x9f69f061,0x88a8974b),LL(0x5fb9ec96,0x75444cc0),LL(0xf252002f,0x899c5a67),LL(0x664675a1,0x11db7cc9),LL(0xc6b6d7be,0xe5e85617),L_(0x00000149), LL(0x4ec0d894,0x650536e0),LL(0x7897a846,0x57bdeceb),LL(0xb8acad39,0x39f416b8),LL(0xbb4ba894,0xde12e814),LL(0x45c679cf,0xfa77e0ef),LL(0xbfcd091b,0xae92f35b),LL(0xf3ea6cc5,0xff4f9db9),LL(0x15f66583,0x67f0fed3),L_(0x000001a8),
+ LL(0x589109fb,0x647774c8),LL(0xd728f100,0x8216c030),LL(0x7565d29a,0x38976a5d),LL(0x0e8d40b2,0xdebd4cac),LL(0xe6c701d8,0x3dc8c008),LL(0x71a01dd8,0x54f5f816),LL(0x85aadb00,0xe571a7d2),LL(0x66dfeb71,0x0d64dc32),L_(0x000001ff), LL(0xdb3c541c,0x8476568e),LL(0x70c9c24c,0x81e7d6f2),LL(0xdfa45074,0x8ce07818),LL(0xc75e724b,0x17be95c5),LL(0xf85a8c49,0x56216aaf),LL(0x71eb7f6d,0xf60fc3e9),LL(0x4afdaffe,0xb5697356),LL(0x598d1d44,0x2dfe785a),L_(0x00000074),
+ LL(0x649ccede,0x70487d30),LL(0xa5efc98a,0x56482796),LL(0x86f3d005,0x81ed5742),LL(0x41ac177d,0x693c9188),LL(0x41f63ff3,0x544078e1),LL(0xcb0cceba,0xf396ad9c),LL(0xcd9ca803,0x1f2f8905),LL(0xb9a3b9f8,0x4318691b),L_(0x0000005b), LL(0x5e41a528,0xf876e309),LL(0xb6fd45a8,0xf87881ff),LL(0xa8a0715e,0xb8d73d7d),LL(0x074192a0,0xca88981c),LL(0xdc66d086,0x00f41a80),LL(0x8f279d46,0x34882bbb),LL(0xb5564038,0x10c7a90c),LL(0x5552b11c,0xf89b04d8),L_(0x00000053),
+ LL(0xa21b2d84,0x3f7dbd38),LL(0xce9c88b4,0xf194c13b),LL(0xdc04befb,0xdd6c7f32),LL(0xd71b8746,0xc7a2d3eb),LL(0xb71fb09e,0x497484b9),LL(0x73e11c5b,0x1fc70d7c),LL(0x9831a6ee,0x15940a74),LL(0xc9a49067,0xe36e9b20),L_(0x00000185), LL(0xa93d18eb,0x54606829),LL(0x7dd8cbe9,0x0d9bdc27),LL(0xc774aae0,0x36955f4f),LL(0xcfe0f91f,0x72271ae4),LL(0x1d88d914,0xc0f2a388),LL(0xe1f3ebda,0x63cec6da),LL(0xf2b86354,0xe4a5ad95),LL(0xed0252cb,0xedde22e8),L_(0x000001c3),
+ LL(0xa6a3dd08,0x840ba74d),LL(0xab9733bd,0x35000794),LL(0xc171b7dd,0x7a0a699e),LL(0x370bb4fe,0xed68a491),LL(0xfb486be6,0xf15b9567),LL(0x86467e73,0x5a72e34b),LL(0x007fbbba,0x4fc2fd9c),LL(0x07f9990e,0xf83d0453),L_(0x00000009), LL(0xc9c8d9c1,0x3ed4cc4e),LL(0xd0aa85e5,0xfa4eda85),LL(0xcc6de111,0xab8aa3e2),LL(0xd8d585dc,0x43bc8ccf),LL(0x69adf3a0,0x9f03e827),LL(0x2ce58643,0x4e3d11d6),LL(0xf05e13fa,0x2820b6d0),LL(0x7af921ff,0x94e1a5fd),L_(0x000001f3),
+ LL(0x3e1d6ea7,0x8c47f3dc),LL(0xfd8a756c,0xca9eb3fd),LL(0x31799e67,0x5933facf),LL(0x70399eb0,0xe0504d9d),LL(0xdc761184,0x469e7106),LL(0x8ef17d6d,0xcd5f283f),LL(0xb55ec3df,0xdaa7f2c8),LL(0x7711b93f,0xa9a6a6b5),L_(0x0000000a), LL(0x63eb36f0,0xc75a128f),LL(0x9a94b1bb,0xa3a9b3b6),LL(0x99889957,0xd56e141d),LL(0xc45c74e4,0x969c754a),LL(0x455c4484,0xf069f686),LL(0x7584cae6,0xbd579d45),LL(0x441fc298,0x29bfd918),LL(0xea727ee8,0xb0624772),L_(0x00000027),
+ LL(0x88792dc3,0x7b2e1e8d),LL(0x3ae58142,0x2e71222e),LL(0x90f869db,0x9d393376),LL(0xb1ce0668,0x2d537bfd),LL(0x1a9bff70,0x47346bbf),LL(0x4aeeb846,0x8a0e90f5),LL(0x73c9dd46,0x54e3afa2),LL(0xb6c871a6,0x5945d8c3),L_(0x00000146), LL(0xf4a5960f,0x100e770a),LL(0xac70e87a,0x1c87dbe4),LL(0x797d6d91,0x961a5c5e),LL(0xc5b533fb,0x548c0001),LL(0xb560cfb8,0xa9d47191),LL(0xa65c8463,0x37d39eec),LL(0xcad37d21,0x716bab4e),LL(0x7b0514ad,0x89ad5bc2),L_(0x00000187),
+ LL(0x5ac51d4a,0x7c1ff897),LL(0x4bd5aa83,0x73534a22),LL(0xb8d76f5e,0x26abe76b),LL(0x8f3282b7,0x76978114),LL(0x14a5cb17,0x1bff40a3),LL(0xb7375a3c,0xb7209f08),LL(0x91b36a89,0xb4553b1e),LL(0xcebaa86d,0x73824616),L_(0x000001bd), LL(0xc027549b,0xbcb95506),LL(0x36ce8449,0x45813245),LL(0x0d1e1b38,0xd6d0eea3),LL(0x7fd0d6a4,0x14a3ad4b),LL(0x14bcb34d,0x4fc99703),LL(0xf4772d1d,0xe5d8c8d7),LL(0x1d59825b,0x6cc8f63c),LL(0x8d26276f,0xba00b77b),L_(0x000000fb),
+ LL(0xc8a3d5f2,0x06031f54),LL(0x960c67a1,0x32f38594),LL(0x09357fe4,0x3b745f59),LL(0x2a14d637,0x8fa90857),LL(0x653eeaba,0x65744c6c),LL(0xfa37b71c,0xf85872c8),LL(0x3238cb4d,0x9700049f),LL(0xbb9a7dcb,0x4c8ed8c4),L_(0x0000001a), LL(0xed276d40,0x49db6e5a),LL(0x58e268fc,0x4b45feb2),LL(0x84cf99d5,0x2045f9c6),LL(0x80f4779c,0xf44869f9),LL(0xa220c8fc,0x058ad702),LL(0x7e09b470,0x948098cc),LL(0x5bc02559,0x495b8c3f),LL(0x33da20c4,0x197459a3),L_(0x000000f6),
+ LL(0x6a04a321,0xd2a33c4e),LL(0xb8c0a18c,0x4edc42cb),LL(0x42d862b6,0xd775f940),LL(0x1e91d30a,0x6703500a),LL(0xba0ea3ff,0xa7531dda),LL(0x2773ec8b,0x39b7bed4),LL(0x2d04e32b,0xb4d1689d),LL(0x9117e556,0xd20ddefd),L_(0x0000019e), LL(0x3a4ba55b,0xa10a2f30),LL(0x55b7005a,0x2bae1e82),LL(0x53323c22,0x2ff6304e),LL(0x397190c6,0xd9f087fd),LL(0xa7a8b69d,0xb68e3037),LL(0x12602cd7,0x25d350ef),LL(0x22bf670f,0x86cdc0d1),LL(0x8a47dde9,0x8ee7e2f2),L_(0x0000009b),
+ LL(0x693bf308,0xc6dbc583),LL(0xd24b6766,0xd31b0ef8),LL(0x95890706,0xe3a35296),LL(0xc90c51cc,0xb8ed7618),LL(0x7cff3a80,0x4973ebf1),LL(0xd473b1c4,0x3a129c68),LL(0x098525e4,0x5036c9f1),LL(0xc374031f,0x3955ea92),L_(0x000001d3), LL(0x4ce3a370,0xf46f1c31),LL(0x64ddf24c,0x9e1fda40),LL(0x70db5256,0x5ea2c55e),LL(0xf8940530,0xf14297ac),LL(0x034f59d5,0xa46ea96e),LL(0x42888331,0x7dc4622a),LL(0x102ad134,0xe007741a),LL(0xfe88a514,0x1db8ec7c),L_(0x00000046),
+ LL(0x6b484938,0x514ddbd3),LL(0x40394ddf,0xc9c65dd0),LL(0x539c2910,0x679067ad),LL(0x449575b2,0x3e4b50f3),LL(0x3cba3f07,0x3ae8deca),LL(0xdb855b46,0xde55385b),LL(0x16ac2f4b,0xcf4ed383),LL(0x1d879d47,0x1e8113f4),L_(0x00000036), LL(0xdc02e925,0xce4c202b),LL(0x3d4593d6,0x973ac87d),LL(0xf0b4acfe,0x01434726),LL(0x6764442d,0xfe9274d4),LL(0x6b582005,0xe308fe9e),LL(0xf520a500,0xaae35487),LL(0x99c31e18,0xcdca5ee1),LL(0x1d99ed71,0x0f6491b7),L_(0x00000198),
+ LL(0xb383837e,0x46f862a6),LL(0x65cb077c,0x631e9559),LL(0x9b939d55,0x25138071),LL(0xf40d4552,0x952fcfe6),LL(0xb308097f,0x0a6a5375),LL(0x2e65e8e6,0x3e9edb80),LL(0x1310ce7e,0x9008e712),LL(0x36b60d2d,0xef767e69),L_(0x0000009a), LL(0x40188cf2,0xfa1dc587),LL(0x32ad8729,0x4064ce9d),LL(0xe1763571,0x56c0be29),LL(0x7963b458,0xde3b2135),LL(0x95d575d7,0x66e40952),LL(0xa842ef1e,0x444bd560),LL(0x5e446834,0x9e4dbf26),LL(0xf024c8aa,0xf4d25cc1),L_(0x000000bb),
+ LL(0x24d33325,0x31f1b543),LL(0x5b8d2482,0x0ec252b0),LL(0x19b88e25,0x0818329c),LL(0xcd8bbb1b,0xdb10a837),LL(0x02e4893e,0x81192510),LL(0x84cd1c11,0xbe980656),LL(0x6c489430,0x0f675008),LL(0x346cc643,0x57e72ed9),L_(0x00000152), LL(0x09725c08,0x8c9e3525),LL(0xc2a2b6e2,0x50c3fc67),LL(0xaf377b60,0x018ff455),LL(0xd7f347bb,0xcd5a7fd3),LL(0x820f28df,0x7a766a20),LL(0xbaa35047,0x2e3e3c08),LL(0xea0d932e,0x620422f9),LL(0x561b15cb,0x78d9ad76),L_(0x000000ff),
+ LL(0x8cf07187,0x0f23847d),LL(0xcb2c301d,0x46a3121c),LL(0x24b1883c,0x64fb5faa),LL(0x43263cce,0xc10bc090),LL(0x731fce3c,0xe510506a),LL(0x134986c0,0xd2899a05),LL(0xaa30a907,0xd8592433),LL(0x6671f165,0xa5074a40),L_(0x000000ea), LL(0xf3b369eb,0x39b1d8c9),LL(0x4f03f7bd,0xed9a2887),LL(0x4a870054,0xbd121753),LL(0x510756ad,0x9a0d0a37),LL(0x85faa51a,0x35296053),LL(0xdf5c089f,0x15a5c2ed),LL(0x130a237e,0xbd316fba),LL(0x3774ff2c,0x2c9d3ce1),L_(0x000001ee),
+},
+/* digit=27 base_pwr=2^135 */
+{
+ LL(0x10f99602,0x45c384b6),LL(0x2d4100e2,0x7187b9e4),LL(0xc5264e57,0x2477a817),LL(0xcb20ec20,0xc146fbb4),LL(0xa5dd079d,0x6c49fc51),LL(0xb66b540f,0xa207dd34),LL(0x18cb3114,0xfc85f364),LL(0x79042a4a,0xa886f4d4),L_(0x00000192), LL(0x9d642bee,0x3c62b595),LL(0x7df28ef3,0x09a83c10),LL(0xc98bc18d,0x61720266),LL(0xe8b908cb,0xbfa40c64),LL(0x3266ed34,0xc5f7d00d),LL(0x785d5c5a,0xed6e6699),LL(0x0fda50cd,0x0528d637),LL(0x9fa7129a,0x226a0134),L_(0x000001f6),
+ LL(0x020b6b5c,0x854a83b5),LL(0xa6b72500,0x82b8a64e),LL(0xf5cc5dee,0xa44f4310),LL(0x82f7e307,0xa979f999),LL(0x26038361,0x36271c95),LL(0x9d4a6e7e,0x2c2e87bd),LL(0x83121a68,0x801461a1),LL(0xdda0c42c,0xc46dd1bb),L_(0x000001ef), LL(0xc8adce87,0xf5ff9d53),LL(0xac7e6d6f,0xba6044cb),LL(0x8a2a18c9,0x4e0b1c61),LL(0x47645723,0x538c1881),LL(0xff1d071b,0x0d20849f),LL(0x3d943038,0x033ae333),LL(0xd1326f05,0xe89c6421),LL(0x504a49c4,0x0c637164),L_(0x00000064),
+ LL(0x161f0a4b,0xc4db51e8),LL(0x0ee6ce1d,0x76a9fbe6),LL(0x471be04f,0xaee80fe4),LL(0x63fea5d4,0x13ed56ca),LL(0xbb7b1989,0xff53dd5a),LL(0xbdd30335,0x5aa48cba),LL(0x8830cbd1,0xced46a92),LL(0x6ec07f47,0x4d0d3e16),L_(0x00000103), LL(0xbf5f1b1f,0x85d83aa8),LL(0x030c528b,0x3981ba7e),LL(0xf6347818,0x51c072a5),LL(0x8851b9e3,0x6bc6f46b),LL(0x908af12a,0xab612e82),LL(0x11ae86d1,0x194bfdad),LL(0x855184ce,0x3ed70ec9),LL(0xbc5ba81b,0x36a51b16),L_(0x00000121),
+ LL(0x7e0c514f,0x89a7c665),LL(0x4ba50604,0xf92c410e),LL(0x03183bca,0x325bb838),LL(0xde751063,0x4a227afa),LL(0x61ce2f62,0x8d611fad),LL(0xe1c057fe,0x63741f27),LL(0x26a80815,0xcc3f4944),LL(0xdc51e188,0x1fb19202),L_(0x00000060), LL(0x35ecd6ea,0x23f5c4ba),LL(0x8b90f284,0xeac00c83),LL(0xecc8f9f7,0xc63ca5b1),LL(0xabd4ae3b,0x61f4eb49),LL(0x5868250a,0xde5e94c7),LL(0x8aa62e59,0x2e205082),LL(0xa27ce17d,0x4d94b7ec),LL(0x3cf7dcd2,0x84ff72ff),L_(0x000000ed),
+ LL(0x85eddbf9,0xd6250a4d),LL(0xc4c48937,0xb7e17582),LL(0x30cd4a1c,0x663cb672),LL(0x4ecce3f6,0x51a07652),LL(0xe3e24952,0x971076ab),LL(0xb2837d4a,0xcfa04494),LL(0xae48378d,0x2f234848),LL(0x35aa4670,0x5204cd94),L_(0x000000c1), LL(0xc684c134,0xce99c049),LL(0x189c18e6,0x1251a582),LL(0xe65b23d2,0x1ea8f76e),LL(0x50f4154e,0xde65bbaa),LL(0x55d8a624,0xd1acdeb6),LL(0x9745647b,0xdbc7b696),LL(0xa1a36741,0xc3af97df),LL(0x0e06b475,0xcec9f674),L_(0x00000035),
+ LL(0x13fe9d4a,0x9edae224),LL(0xc93ceb2c,0xc40b8881),LL(0x376b68f1,0x493ec443),LL(0x2fe4d107,0x2613f055),LL(0x2adbc0de,0xc264177a),LL(0x6850f4d4,0x999b4445),LL(0x024b1759,0xb5528e8c),LL(0xa532c490,0xfe9cb25f),L_(0x000000e4), LL(0x7dabddfd,0xea2401de),LL(0x29f2c840,0xae4f0565),LL(0x6004e218,0x9745c833),LL(0x45a26d7d,0x1aa8e8c7),LL(0x2e1e3abc,0xf254366c),LL(0xd176c592,0x5dba9a65),LL(0x75f2ce2f,0xcb70eda5),LL(0xef390121,0xdf3bd7c9),L_(0x000000d4),
+ LL(0x92a0df5e,0xf2fb4c5a),LL(0x612c5e22,0x90ec0ad8),LL(0x19eef2ca,0xf648d0a0),LL(0xb08c2818,0x56957806),LL(0xc6fa4d71,0xe858889f),LL(0xd381edae,0x0d311c34),LL(0x51c58427,0xc7d13fa9),LL(0x223f6153,0xe7ffd714),L_(0x00000046), LL(0x3ef9a256,0xa9aa9baf),LL(0xd185738b,0xa46d0a8f),LL(0xb3308a45,0x74e9630a),LL(0x50e76c6b,0xa8af0eb5),LL(0xe6d664ef,0xb4263c27),LL(0xd6ff5afe,0x0d5ab8af),LL(0xa29e25ea,0x35f45527),LL(0x9641d328,0x8c614ae7),L_(0x000000e6),
+ LL(0x338228bd,0xe352f406),LL(0x44f05c5b,0x36069000),LL(0x3a7061d3,0xe7fd3e15),LL(0xd82371f2,0xb123a32e),LL(0xc0c29bdd,0x1a15e8ee),LL(0x0938b2d1,0x9bba46b8),LL(0xa2ae38c1,0x66a69b9b),LL(0x470c4e74,0xe7a0607a),L_(0x000001a8), LL(0x4d513c26,0x04e250e3),LL(0x0d3d6116,0x99aa8990),LL(0x2850e69a,0xe87aacf0),LL(0x0f5ea018,0xa9b70f5d),LL(0xe629958e,0xc9dfec50),LL(0x67ad0ad8,0xa19fef72),LL(0xfbbc4dd8,0x4e913349),LL(0x44ef73af,0x36506a6e),L_(0x00000106),
+ LL(0x4259e2ef,0x4fc61403),LL(0xbe686c91,0x3b319ce9),LL(0xcaf2c252,0x48b002e1),LL(0xd7142b37,0xfd368034),LL(0x4805818a,0x24a14bab),LL(0xfef62905,0x0f3cee8f),LL(0x8e05459e,0xdd641c3a),LL(0xf8a79ba8,0xda069476),L_(0x00000043), LL(0x796a282e,0x39168c60),LL(0x3f0a7260,0x3e3e3f10),LL(0xefe9a0b6,0x98f31f24),LL(0x029755ad,0x68a3bd55),LL(0x56d48cfc,0x08db9e00),LL(0x180b09d6,0xf41fc496),LL(0x43518b4d,0x0a026b4c),LL(0x53fa9a78,0x49c51679),L_(0x00000006),
+ LL(0xa0eb14a2,0x04533f2b),LL(0xc6b20735,0xf37cab9f),LL(0x59889c71,0x2957243a),LL(0xee6d3e3b,0xcd4ef031),LL(0xc82e2f33,0xbe1fa792),LL(0x9431aaa2,0xd5df936a),LL(0x5897dee2,0x69038db7),LL(0x3c5c1a27,0x49337ba9),L_(0x000000c1), LL(0x9595fa29,0xdaff077c),LL(0x92632965,0xd489db4e),LL(0x73090129,0x940397cb),LL(0x3ab24c2f,0x08747c46),LL(0xa7844d0f,0x4063f57e),LL(0xde4ab15b,0xdfb6a687),LL(0x7bdc8db9,0xc4b7272d),LL(0x670393c5,0xcc129fac),L_(0x000000b3),
+ LL(0xcad13624,0xd3620658),LL(0xd490ca01,0x480b6735),LL(0xf6b97c19,0x5a38261b),LL(0xeb8077db,0x3a0d7cfc),LL(0x6cb95b1f,0xd822b66c),LL(0x027f3439,0x204c12b4),LL(0x5b1121d8,0xd1662f63),LL(0x50df8b79,0x5a06b5c4),L_(0x00000003), LL(0x20c440aa,0xdd45df26),LL(0x7d35a477,0xdf45caba),LL(0x37ca8bf1,0xb9d5153b),LL(0xa163bc4d,0x2a09a7c7),LL(0x79721ae6,0xf16f3745),LL(0x4901566b,0x8b7edc54),LL(0xda6d915a,0x2073fe4c),LL(0x59c5233d,0x0e719f5b),L_(0x0000017c),
+ LL(0x986f86b0,0x34d85352),LL(0xb5e1a9d1,0x04b6fb3b),LL(0x96ed674c,0xc5869197),LL(0x2201eaeb,0xc13b24f0),LL(0x43fe141e,0xd5acb880),LL(0x77717702,0xb4c36b2f),LL(0xf913c28e,0xbd9e8fe1),LL(0xbb8bc0cb,0x871dc376),L_(0x00000014), LL(0x2919d227,0xb3b18239),LL(0x9062a004,0x0d96f561),LL(0x84b9c0aa,0xd38134a4),LL(0x384e6a14,0x62e9b9dd),LL(0x434945b9,0x0d2a3f87),LL(0x26111d5b,0x0558e17c),LL(0xca088afb,0x7e83601c),LL(0x5f4109b6,0xf3372d86),L_(0x000000be),
+ LL(0x0f6c0054,0x2e8b93c7),LL(0x08562f0b,0xbd858543),LL(0x4642e58a,0xf3108a95),LL(0xe72a8e55,0xc3b6dcd3),LL(0x48efed30,0xbf3f1b76),LL(0xeef47f99,0xbe7c393d),LL(0x7808a959,0xb13004f3),LL(0xab865ef6,0x937fdeea),L_(0x0000015c), LL(0x22a644cb,0xde622870),LL(0x5b036454,0x1435996c),LL(0x253cdb02,0xc939a75b),LL(0x00181ca2,0x497b4076),LL(0xc885fd30,0x89ffccfd),LL(0x5be5d64a,0xd221db4b),LL(0xf3ff67a9,0x7c1814ff),LL(0xe534c2d3,0xdff1b3c3),L_(0x000000de),
+ LL(0x6b17ac7f,0xc9c5a035),LL(0x6fb80668,0xd3037f61),LL(0xf7001431,0x61783bd7),LL(0x7eb67860,0xa8db044a),LL(0x687c5be2,0xbd63e80e),LL(0x72619e19,0x79bd6dba),LL(0x3f54433d,0xd3da5abb),LL(0x53179eab,0xbeded885),L_(0x000001ce), LL(0xd2236048,0x8c1156c4),LL(0x0e48c339,0x6a8706fa),LL(0xd70c895f,0xdef1e5d8),LL(0x74e0aa32,0x628036e7),LL(0xb31a93a3,0xa6fa3b42),LL(0xe7bb3f2a,0x91ab3f15),LL(0xd667e0a4,0x1d5276ef),LL(0x172f04b6,0xac2e330e),L_(0x000001fd),
+ LL(0x5905e1da,0xcaeed330),LL(0x3479c8d8,0x774a0f8d),LL(0x2da43aae,0x89fab1e0),LL(0x5a52588d,0x22017d07),LL(0xf2088700,0x3344f84f),LL(0xf666f8bc,0xcded1b00),LL(0x98c10e11,0x385b1f15),LL(0x4a35267e,0x4cb957d9),L_(0x000001db), LL(0xa8120217,0xb7f4f85a),LL(0x70aae220,0x50f81138),LL(0xd0547dcc,0x320d34eb),LL(0xaa86f5d7,0x4627a90c),LL(0x313d3af2,0x0d86c9fe),LL(0x9d1708c0,0x93baaabc),LL(0x4bb0c611,0x5e3713af),LL(0x8c78d7cf,0x23abcabf),L_(0x00000180),
+ LL(0x1c368201,0x8d760d23),LL(0x2a50426c,0x2fd748bd),LL(0xd4451d72,0x84a5084a),LL(0x7d518774,0x395bd1ac),LL(0x41ad7719,0x5dc03d65),LL(0x54b40eaa,0xf42c68a2),LL(0xc699a962,0x481b2b4d),LL(0x78f2ecdd,0xd9badbf1),L_(0x00000145), LL(0x35684fe0,0x6890c940),LL(0x7a9849bb,0xe8615e51),LL(0x5822be91,0xe3c3e516),LL(0x9ed67ca7,0x5ebee67a),LL(0x5438f44c,0xbf03236f),LL(0xf9e45ec0,0x29c5029e),LL(0x412d0011,0x4fd4f4e3),LL(0x09bad0b6,0x5f591e3c),L_(0x000000e1),
+},
+/* digit=28 base_pwr=2^140 */
+{
+ LL(0xdd9afd40,0x6867ca62),LL(0xb2e8cc83,0x2abfd678),LL(0xd7d6c96a,0xbb6c702c),LL(0xb7b75f62,0x8eb9ab34),LL(0x2a8eb698,0x67b38227),LL(0xee1d1728,0xbff15e40),LL(0x6f600751,0x4ec3001b),LL(0x30ff996b,0x7fb8efdf),L_(0x0000015d), LL(0x29a2746d,0xfc62d76a),LL(0x1c80dd81,0x4a2f2f09),LL(0xc1a9825d,0x4ae9b61a),LL(0xb05a4fb5,0x71a812fc),LL(0xa7baf2db,0x8bb96eaa),LL(0xcc434e4e,0x53c2dfd9),LL(0x8fce5672,0xceeb8e7b),LL(0xd6b948ee,0xc787b7e9),L_(0x000000ba),
+ LL(0x87a8f7ef,0x44566d20),LL(0x816dab3c,0xa555ef8d),LL(0x68ad0a5e,0x93fa3eae),LL(0xb45ab760,0xad51a41f),LL(0x14a732bc,0x3c784a11),LL(0xcd96f357,0x7e912d99),LL(0x7808bc95,0x547dff3f),LL(0xd022a461,0xd3f93d98),L_(0x0000009d), LL(0x3bed20dc,0xdcf5792b),LL(0x9e50e443,0x1c5d0319),LL(0xab35921f,0xce7e3777),LL(0x61acb763,0xc69a2c80),LL(0xd5a1f19e,0xd4921d8b),LL(0x86d49b86,0x3effd3f1),LL(0xd287849a,0x969ee2c3),LL(0x2319a1d3,0x7987e8d9),L_(0x0000017e),
+ LL(0x4a3f3c42,0x66e6b355),LL(0x48d7c646,0x494cec8b),LL(0x4319bb26,0x3c15f132),LL(0xa4923bd5,0xb25b7340),LL(0xe36296a4,0xd2c82187),LL(0x62a70b23,0x3a2676cb),LL(0x3ce0a44b,0x15ada951),LL(0x93e13762,0xcdd5bfa0),L_(0x000000bd), LL(0xc34a522a,0xe16f0577),LL(0xeb1d23f2,0x563bc2d6),LL(0x74b1ae5a,0x22ce417d),LL(0xf0676c19,0x8b56e586),LL(0x64665c8d,0xd3d21118),LL(0x4a9d1f08,0xb5b57a1f),LL(0x9ad18a2e,0x121b1440),LL(0x31f16f69,0xd3dba51f),L_(0x0000015a),
+ LL(0x6c14c349,0x14a0990f),LL(0x1571f4bd,0x8a12a2ae),LL(0xa7e98142,0x64ea4bd5),LL(0xf548a570,0xc2f56d89),LL(0x3a99f05e,0x24fcfb51),LL(0xb029c28b,0x468881de),LL(0x16eb364a,0x54a22d8c),LL(0x9df6df67,0x8e7ba7c2),L_(0x0000019a), LL(0x0875f9db,0x6d585b84),LL(0x8b87eab6,0xf8f2e668),LL(0x61b8a4ae,0x1b210ab1),LL(0xcd5968d0,0x38c32d9f),LL(0x9469f27a,0x2170203f),LL(0x7e65bf26,0xdf5327ba),LL(0x268e8f3d,0x0d743f23),LL(0xbbd5d6a5,0x6866dcf3),L_(0x000000f7),
+ LL(0x9ee406f6,0xfe75ceb3),LL(0xc2dbf93c,0x7d044fdd),LL(0x05aa3d0f,0x3459ab15),LL(0x1e4c0404,0xbea051fd),LL(0xeeca2cbf,0xa5c86723),LL(0x428637a5,0x81d9dd90),LL(0xd3aca9d5,0xf6461276),LL(0x78277709,0x5fdc5888),L_(0x0000019e), LL(0xee7c5a7b,0x105fdead),LL(0xb799ae3c,0xc919db59),LL(0x5e3595ac,0x2aa1f7f7),LL(0x4e9b6f6b,0x519dab32),LL(0x1054eecc,0xd70aa0c8),LL(0xdab1fa02,0x45046840),LL(0xe8162c46,0x382d8fac),LL(0x3f7fc117,0xc63a2e34),L_(0x0000019c),
+ LL(0xca65cbda,0x40f45643),LL(0x5e42072e,0xb22b4730),LL(0x6980bc47,0x0c0959ae),LL(0xd0091f48,0x17382117),LL(0xe76ce6df,0x6fb6755f),LL(0x083b1371,0x8e338195),LL(0x3ce92877,0x57844465),LL(0x22eadd23,0x88650fd1),L_(0x000001f2), LL(0x66b7e9c4,0xb832d4f9),LL(0x40795011,0x2f5eb6ec),LL(0x56106a16,0x439d72fa),LL(0x7a360472,0x9a695980),LL(0x77c4b5ed,0xbd3315f1),LL(0xcd83808f,0xc773b196),LL(0x21f3f41d,0xdcca40dc),LL(0x42518607,0xd975bf10),L_(0x00000120),
+ LL(0xa0b7f265,0x7643d0a4),LL(0xca61488d,0xc9a4ec9b),LL(0x78d40864,0x08ac32aa),LL(0xd1f91912,0xe2c33dbb),LL(0x4ce17265,0xa6b041d8),LL(0xc73e5e84,0x130222f6),LL(0xcaf07f55,0xbc20bdd0),LL(0x2fe0bc76,0x482195b2),L_(0x00000043), LL(0x45c6a126,0x37f04c87),LL(0xbdd6ee14,0x601822b2),LL(0xb9431fd2,0xf10879b1),LL(0xebee54b7,0xb8d5c027),LL(0x530c61a6,0x52358509),LL(0x3b953e07,0xc05d71ee),LL(0xd055e247,0xfc120f31),LL(0x51f78c21,0xb71a77f5),L_(0x00000040),
+ LL(0xdd01fc40,0xdcca1655),LL(0xfcdcd83f,0x6f13723c),LL(0x6fe01dad,0x48fc724e),LL(0x10ea92f4,0xe9506b35),LL(0xbacd3171,0x32c50316),LL(0x5b9c3826,0xb525812e),LL(0xb06a2041,0x6095bd35),LL(0x29d1e51d,0x8c9f2aff),L_(0x0000018f), LL(0x9f6b1c54,0xf5e8440d),LL(0x5815a76f,0x4652dd8f),LL(0x0ba6e7eb,0xa2d772d1),LL(0x67d0cfa7,0x2c2c10a3),LL(0x9134fbe1,0xe122408a),LL(0x4d3fc999,0x98396be7),LL(0xf158ed72,0xf1736447),LL(0x2e445a86,0x3589b3e7),L_(0x00000010),
+ LL(0x1acdbb17,0xaa39db8a),LL(0xcd1bfa5a,0x3f690830),LL(0xf20580fd,0x47516625),LL(0xc02a443b,0x72df9c02),LL(0x37c50805,0x1f658c86),LL(0x70ba4df8,0xb9b7c15e),LL(0x7863af7e,0x4f048a5e),LL(0xac437359,0x985ed711),L_(0x000000f5), LL(0xe24f4c27,0x31deb67a),LL(0xf7ff8403,0x277a75a7),LL(0x9efc9dd1,0x9e038122),LL(0x72ab76fd,0x380f72e2),LL(0xa5bd7ec4,0x55ee2df7),LL(0xe6e012fa,0x8dba5f73),LL(0x3daacbbb,0x7d57b1b9),LL(0x706e065a,0x2a1528ff),L_(0x00000115),
+ LL(0xac6b647c,0x15c609d6),LL(0xe5366bdb,0xba4c8f5f),LL(0xab004e8e,0xa55c2b8f),LL(0xbe220e5c,0x9b0a693e),LL(0x328cf3bb,0xf0a01098),LL(0x93659056,0xba4d555d),LL(0xa9299fb7,0x705141f5),LL(0xac2b6ea4,0x44c2570f),L_(0x0000008d), LL(0xcb330456,0x4159e7f0),LL(0xda0acb04,0xd0b0f9e2),LL(0x72227853,0x9c81b6a3),LL(0xfca5d947,0xe37b62d0),LL(0x89f8e6a5,0xa2b087c1),LL(0x397e6f2d,0x79ab8dd4),LL(0x0c2f8337,0xe811e1ad),LL(0xaed2062f,0x41fc3c1b),L_(0x0000006e),
+ LL(0xbb22cb43,0x62da0bcd),LL(0x66e8ec0f,0xa2436a22),LL(0xb2614d9b,0xc4f2fabe),LL(0xd37ba7ca,0x91730356),LL(0xd6947b5c,0x74afd26f),LL(0xf62dae98,0x24fc84c9),LL(0xa5d82a0e,0x01183e91),LL(0x6d7bad82,0x9ae00850),L_(0x00000098), LL(0x11153170,0xf94e5ea9),LL(0x6a5a8c8b,0x370f5efd),LL(0x4a208fd5,0x0abfbfb6),LL(0xd3eba761,0xb4577a64),LL(0xaea020f7,0x9d9fbff8),LL(0xee185b5a,0x7590eb6e),LL(0xde37c8c6,0x110f6564),LL(0x087e5b3d,0xf182e709),L_(0x00000074),
+ LL(0x6e7e0a27,0x35933656),LL(0x11881664,0x57d6289e),LL(0xb5dfe85d,0xb19a5774),LL(0x03f55586,0x84a3823a),LL(0x83e66aba,0x819d0f7f),LL(0xe6540e46,0x8229f91b),LL(0xf8e60b64,0x0ebba171),LL(0x3cb7174c,0x13a992ea),L_(0x00000132), LL(0x367ca9d0,0x66b10914),LL(0xaf137af3,0x22188a39),LL(0xa99be2ef,0xc9e8bf06),LL(0x9f80153c,0xb82d6f97),LL(0xb70bb797,0x713e0f8f),LL(0x08001bac,0x2900ebf9),LL(0xc349df5c,0x2dc5150c),LL(0xcda05b0f,0x705ef690),L_(0x0000013e),
+ LL(0x1c93b8d6,0x2275d0c6),LL(0x43c2cbe5,0xb77f7c23),LL(0x426913e3,0xa4d09bcb),LL(0x193a8beb,0x1c330bb2),LL(0x9694aec2,0xf90a1043),LL(0x466c8910,0x47794b4c),LL(0x013120f4,0x92db08ad),LL(0x27504b4e,0xfd2c4ee7),L_(0x0000008c), LL(0xed071468,0x3983eaf2),LL(0x1520fd40,0x43f9f523),LL(0x10ab4804,0xbbc7abbe),LL(0x4c94f219,0xb3da18c6),LL(0x0653b434,0x34410d29),LL(0xa49aa62c,0x475b1588),LL(0x3fb54eff,0x1efe3b74),LL(0xe35ee322,0xb5457582),L_(0x000001fe),
+ LL(0xc7c8837b,0xdfafafb9),LL(0xd5ac6ec8,0x3e035e11),LL(0xf1bfe6e7,0x0cdfda44),LL(0x99f86b4b,0xd82854c9),LL(0x51eb2ba8,0xe9378d3c),LL(0xfc70edec,0x0488564d),LL(0x78099daa,0x4df1eac2),LL(0x106d93e9,0xfcd2965d),L_(0x00000092), LL(0x7ad3cd26,0xeb73c32f),LL(0x65c6a4f0,0x12e6dfd1),LL(0x613a95bd,0xc4753f02),LL(0x64c8ae6d,0x6ee36689),LL(0x82594975,0x85faeab2),LL(0xff936e47,0xfd968563),LL(0x16aa8dfb,0xfae37039),LL(0x6a6051eb,0x090bfcd6),L_(0x00000077),
+ LL(0x75c314c8,0x1283d38d),LL(0xab80a4e1,0xab4695b9),LL(0xb05894a6,0x37378243),LL(0x7f2984bd,0x1227f75f),LL(0xdf654236,0xe2ef58d5),LL(0x290dd3fb,0xdf64907f),LL(0x38ba14af,0xf1d428ec),LL(0x0c38bf2f,0xc2c54bbc),L_(0x00000078), LL(0xb37cd388,0x07837c73),LL(0x31dfd968,0xda6621ef),LL(0x28b820a5,0xe6fe2937),LL(0xb934b778,0x2622aba5),LL(0xe627cb53,0xdff94dc8),LL(0xa81ea0cd,0x560bd971),LL(0x9c8b6e45,0x2209f943),LL(0xdbaad845,0x6e9d457d),L_(0x000001fc),
+ LL(0x64a50e99,0x8402ef56),LL(0xe6626b55,0x5c34e569),LL(0xbb9dc4c8,0x009d6dab),LL(0x6746cac4,0xcf68656c),LL(0x3336b947,0xfe65ab97),LL(0xe266a898,0x0371ecf3),LL(0x5830a2ee,0x1d57e75b),LL(0xc9710982,0x3e097669),L_(0x00000064), LL(0xfec81877,0x78e2ad77),LL(0xddfb754e,0x284311de),LL(0x4aaa3d53,0xac9d56ca),LL(0xfe5f5938,0x19e9ec29),LL(0x24185a04,0xe89e92d3),LL(0x746f628d,0xfd0968c4),LL(0x6959a461,0x2cc1b198),LL(0x7f39e175,0x5c4efa86),L_(0x00000168),
+},
+/* digit=29 base_pwr=2^145 */
+{
+ LL(0xd3daa6ec,0x15578941),LL(0x1a86314a,0x6a7421e8),LL(0xe2ec4906,0xe975bc97),LL(0xa7485f37,0xd59fd20a),LL(0xe5e712ab,0x5b001318),LL(0x951133a1,0x1259bdca),LL(0x057f57ee,0xcbd3b2c6),LL(0x33dad04a,0xef3153ef),L_(0x000001e7), LL(0x8c6263d5,0x2ed37d50),LL(0xa4e81e7b,0xf8f36d87),LL(0x5a01a3ef,0x0288c3e4),LL(0x8b372673,0x846f5208),LL(0xa991189b,0x6f560651),LL(0x71db52e5,0x431caeef),LL(0x58e36c06,0xa3f98d5e),LL(0xd8d03f83,0x020099b8),L_(0x000000dc),
+ LL(0xd73f8b8c,0x52ab1b79),LL(0x7e2040bd,0x95a122c6),LL(0x89ab0660,0xf1cb78af),LL(0x01a20058,0xc77cb751),LL(0x31375e35,0x5e133615),LL(0xea159ba6,0x524c75ea),LL(0x7ecbfca3,0xab8ae0fa),LL(0x5719d039,0x623ac91c),L_(0x0000019c), LL(0x49d36dfe,0x6b1430a2),LL(0x8450eb5d,0xc47b9efe),LL(0xafb92b30,0xa9991147),LL(0xf6824bee,0xe1752c3f),LL(0x2b160b39,0x7fd6a625),LL(0x6256f4b4,0x574646e7),LL(0x076f7bff,0xe5bbdfa9),LL(0xcc3f350c,0x4642b5db),L_(0x000001a8),
+ LL(0x7f151743,0xfa21d74b),LL(0x37719209,0x8cfe5b17),LL(0x00c8bba2,0x1c2878b2),LL(0xa620523f,0x170331c9),LL(0xa5843ac0,0x8cd83b50),LL(0x0381135b,0xb047131d),LL(0xa643b75e,0xd2ab54c3),LL(0xc5ef1464,0x62ed0e42),L_(0x000001f3), LL(0xad15614e,0x91bb20fb),LL(0x78f86132,0x7805c40a),LL(0x895f7e0d,0xa2a8624a),LL(0x3ce4b54c,0x6579a871),LL(0x1b0cde0e,0xd626e2cc),LL(0x6377df41,0x045193c6),LL(0xcd6454de,0x1c3ca349),LL(0x4909db1f,0xb047b0a1),L_(0x00000191),
+ LL(0xb6bf0f8a,0xf432b93e),LL(0x4a6f35d7,0x611248d4),LL(0x62f74f5a,0xff45509d),LL(0xef98d968,0xf78b11dc),LL(0x540d2d90,0x8e0fdb4e),LL(0xf1948691,0xf839178d),LL(0x775c9c48,0x1546952b),LL(0x2da4516e,0xb05a9a42),L_(0x00000148), LL(0xe7052400,0x5a0e6542),LL(0x5c40801a,0xc9bfcea8),LL(0x8cf4381f,0xecff5ed1),LL(0x04226551,0xe3765708),LL(0x3addaf06,0xbf10bb39),LL(0xe6d6327d,0xa7a94c0b),LL(0xde98dcbd,0xc9cc265a),LL(0x9445d1d2,0x39198006),L_(0x000001d2),
+ LL(0x8785f128,0x6fd53bcb),LL(0x11b88070,0x89212039),LL(0x0fd4310b,0x7c570d88),LL(0xfb34d160,0xe29cc2db),LL(0x8d8b6c1d,0x98ac6419),LL(0x633a2387,0x48918f6b),LL(0x3767a8fb,0xc7f5fff0),LL(0x1de5bf8a,0x517008cf),L_(0x00000167), LL(0x1a4a980d,0xc8a802dc),LL(0x31a9aa05,0x3f45d1a4),LL(0x955dbbaa,0x019bc5a3),LL(0xf987ec6f,0x7819e65f),LL(0xa521ab1b,0x6a8b4966),LL(0x9db12d33,0x1c418ebe),LL(0x5c25c25e,0xd371d986),LL(0x05758d98,0xcdb745fe),L_(0x000001d1),
+ LL(0x24e96217,0x82dda7a2),LL(0x8cb7272f,0x285a44b5),LL(0xd0fa019c,0x772202b8),LL(0x256b2dc1,0xf7a1827e),LL(0x70cc578d,0xf561fd03),LL(0xf01369b8,0x4b48b6ea),LL(0xb34eeab3,0xf869dc36),LL(0xf55466de,0x10fbfa49),L_(0x000000d5), LL(0x9e31568f,0xa79b35c8),LL(0x72243fd6,0x48942459),LL(0x6f4d4b6f,0xbe3c7cfe),LL(0x4b050256,0x273326f3),LL(0xccad925d,0xcfe66f8b),LL(0x63feb094,0xd430d816),LL(0xe74dd574,0xf5ea27b5),LL(0x45e6d69a,0xe57442d8),L_(0x0000006a),
+ LL(0x8867f7e0,0x91a18dca),LL(0x52fb15ad,0x64cc9794),LL(0x889fc872,0x76b7b4b5),LL(0x516a4447,0x7f78f44e),LL(0xe0dc9367,0x03435817),LL(0x6c0ef141,0x3e179290),LL(0xdcc3815b,0xa243fcb3),LL(0x57d2c5d1,0x33e3e4cd),L_(0x000001bf), LL(0x8a5e2af7,0x373d3db8),LL(0x567532fe,0xa4edcdd2),LL(0xe2cdd2ad,0x313da102),LL(0x7dc4c171,0x9b6477b7),LL(0x10610301,0xd6614ed9),LL(0xe5dbb13f,0x093e9d03),LL(0xc78d8181,0x34692c91),LL(0xd1998555,0xfad9c4a4),L_(0x0000013f),
+ LL(0xdf7c0d81,0x22136d3a),LL(0x5150ed1e,0xf12f4a61),LL(0x48b602d1,0x58c86ca8),LL(0x8f3a438f,0x2ad94dbc),LL(0xfd28616c,0xa1741520),LL(0xfc8f344f,0x97e96926),LL(0xa2867b76,0x3f74f49a),LL(0xc963769f,0x9eafe4ec),L_(0x00000138), LL(0x880c04c5,0x8d3271ab),LL(0xeb904c8b,0x361247ec),LL(0xcf0e8b6b,0x9dc846a9),LL(0xf58b8dfe,0x1bd5a3dc),LL(0x46766ec7,0xabb872ef),LL(0x7028f76a,0x5976ea25),LL(0x7d56cad7,0xa7a4c1e3),LL(0x50e6e410,0xd9ef6dff),L_(0x000000a4),
+ LL(0xee967d04,0x54ca4d62),LL(0xa4adf367,0x2f1d9120),LL(0x9de3bdf9,0xa199c49a),LL(0x911112e9,0x918e1ab3),LL(0x51c4e324,0x1ab9377d),LL(0xdecbb2fc,0x089f9423),LL(0xfbdc7272,0x61643ec7),LL(0x297b6a31,0x8eafbdcf),L_(0x00000099), LL(0x380cfd3e,0xb9b29381),LL(0x9618730d,0x5c79e6e7),LL(0x984e3379,0x9a017cdf),LL(0x6a46a60e,0xb44ef6fe),LL(0x6fd9e713,0x8cf5836b),LL(0x2e3b6ebb,0x29b6614b),LL(0x741582d0,0xa7c94b36),LL(0xb93abf5a,0xc0822faa),L_(0x000001a6),
+ LL(0x7dad6b6f,0x6d40ef9f),LL(0x75d98fac,0x52ee8497),LL(0x4f994b00,0xb0754aa8),LL(0xae60032c,0x19b6eb82),LL(0xb89fa32d,0x3aea1e12),LL(0xd3d62cba,0xa47b84ef),LL(0x7b3e3f24,0x3738323f),LL(0xa1811a10,0xa83238ea),L_(0x00000101), LL(0x5a4fc143,0xe600e837),LL(0x2ba5692b,0x25fadbb6),LL(0x8c4ff4f6,0xad437e54),LL(0xfa9d42cd,0x14c8f3b0),LL(0x79e73eb8,0xa0355c3e),LL(0xee8fbd21,0xefee74e8),LL(0xb4ebba9f,0x0e987b86),LL(0x0e79123c,0xa0018bb1),L_(0x00000009),
+ LL(0xd08fa2ed,0x68def816),LL(0x3f12ff36,0x4b57900c),LL(0x7fffe102,0xd2939213),LL(0x70f61f2a,0x4ecb6d5f),LL(0x351a0540,0xca3d4a8e),LL(0x51a7737d,0x887af4be),LL(0xbc6bf04e,0xfca084af),LL(0xafb6ef2e,0x80de41d0),L_(0x0000010a), LL(0x9d26a31d,0xa72b2fa9),LL(0x9b7182ad,0xa970074e),LL(0x18bf55a2,0x056574a9),LL(0xb8d1ebac,0xeba9a5ac),LL(0x4bbdf7b3,0xd324a4b9),LL(0x20cc2ce0,0x56572fe4),LL(0x1a2b2538,0xf24f0245),LL(0xef07dd5e,0x5ab8b3cb),L_(0x000001cb),
+ LL(0x120fa71d,0x41cdedbf),LL(0xcbb3dcf6,0x8c3fb216),LL(0x19500d09,0xe213167c),LL(0xe814428b,0xac93cb34),LL(0x1a28a2b6,0x861cf475),LL(0xbc74e6e7,0xcc2d45ad),LL(0x0f8c1d18,0xbd9bdb71),LL(0x6d7baa7c,0x43067701),L_(0x0000017d), LL(0x41e3705a,0x8a8c2d8f),LL(0xc8929c33,0xc43c1d40),LL(0x819f1cba,0xdda7d3c4),LL(0x598c12f3,0xe612ee48),LL(0xaa092a4b,0x97324657),LL(0xd55e9103,0x1b8a4a06),LL(0xd7a8f2d0,0x010537d8),LL(0xf7a0ab83,0x9ae31bf0),L_(0x0000002d),
+ LL(0xb8878e45,0xf56f7c26),LL(0xac1feb24,0x4df5d838),LL(0x15563b3a,0x1ca4e8a0),LL(0xbf968a88,0x62060557),LL(0x3ca8c519,0x46507367),LL(0x743fec64,0x374e7834),LL(0xd6eda8e3,0xe0db390d),LL(0x64260f14,0x96c53e95),L_(0x0000010a), LL(0x929af276,0xb4ebbd85),LL(0x2786a497,0x2343b68c),LL(0xbc5660f7,0x3871cff1),LL(0xa03e99a5,0x32a3116c),LL(0x91a2e2b2,0x39a66a33),LL(0xf1e21170,0xb4a691a2),LL(0x0b59581c,0x760bf647),LL(0xbf35d6e4,0xccdb4699),L_(0x0000001b),
+ LL(0x3d62a61e,0x8ea4e81f),LL(0x6f0c46da,0x6349f724),LL(0xa1f6221f,0x3d1cb710),LL(0x801a6d7d,0x9a8daaa8),LL(0xdff7216c,0xaabb78f1),LL(0x0d054787,0x6a1b8dee),LL(0x9342cf54,0x7426ffaf),LL(0x8839548a,0x7e189575),L_(0x00000021), LL(0xbcb9c78b,0x645473ec),LL(0xf45138ac,0xcb977455),LL(0x51f3e82d,0x23de028c),LL(0xcb2096e6,0x1236013a),LL(0xd60fa53f,0x790031f5),LL(0x590da1dc,0x41383462),LL(0xd75ce15d,0xaac7003b),LL(0x5c3cf3c2,0xe97d1507),L_(0x00000100),
+ LL(0x37acbeda,0x552d3a3e),LL(0xf4eca93b,0xae1c95c5),LL(0xdc45bd28,0x0c12e32d),LL(0x5dd7eb7c,0x50ac538b),LL(0x692eb87e,0xc65147a8),LL(0xa055973b,0x8ff87281),LL(0x23507ab9,0x63636873),LL(0x1c85fb4c,0x794d2027),L_(0x0000017e), LL(0x8016a521,0xfe67d871),LL(0x0c89c0f4,0x7e7fa083),LL(0x3b0ba9a3,0x25bac099),LL(0x1416b2e6,0xcbc2cc9b),LL(0xbbcf2943,0xc5a1f7b3),LL(0x354fa11e,0xb195e363),LL(0x61adb945,0xcce31308),LL(0xfde526a9,0x5e8055b0),L_(0x000000f0),
+ LL(0x68b19904,0x7e3f21a0),LL(0x83926d83,0x58ff928b),LL(0x46424f50,0x50a21088),LL(0x656540b1,0xd69839e2),LL(0x2172157b,0xc836bb43),LL(0x34535e3b,0x1f818f5d),LL(0x61ec6b27,0xf4cd40aa),LL(0x8714bd57,0xfdb8302a),L_(0x000001c8), LL(0x553a3a34,0x0a6b22f2),LL(0x8b7033af,0xdbf4f3b5),LL(0x213a07cd,0xd71e271e),LL(0xfa9434d1,0xc069f3af),LL(0xd5d23e3a,0xc4ccd448),LL(0xe785990c,0xdd215a3d),LL(0x500536e9,0x43168909),LL(0xe45a1f48,0x9f92d8e2),L_(0x000000d3),
+},
+/* digit=30 base_pwr=2^150 */
+{
+ LL(0x0d6ad654,0xf661dbbf),LL(0x43121ba6,0x2325e379),LL(0x176edfca,0xf0cef68c),LL(0xa3861e28,0x617ac6ed),LL(0xa77e7f84,0x57535e8c),LL(0xd31f498d,0xf36e23d1),LL(0x546d78b2,0x2c3f8810),LL(0xcfc7d55e,0x156a1cb9),L_(0x00000091), LL(0xf8c0b462,0x974ce76b),LL(0x894a4c0a,0xc178af73),LL(0xe4d65f8f,0x5d4f42d7),LL(0xf71cb940,0xf73dac29),LL(0x1d35c689,0x32814192),LL(0xe3cb66f4,0x753255de),LL(0xaf9effca,0xa9814253),LL(0xd34e3d9e,0x22e23b71),L_(0x00000020),
+ LL(0x61e9684a,0xaa0bda51),LL(0x62c59939,0x9d4f255c),LL(0x1e39fae8,0x74c49bbe),LL(0x09372aef,0x180fc9e6),LL(0xde724860,0x163da12a),LL(0xfa823f50,0xa72a28de),LL(0x965a30e8,0x3c600eca),LL(0x905cf108,0x9f8b9687),L_(0x000000af), LL(0xd936a7a3,0x26afd7d7),LL(0x13810cfd,0x986aa03b),LL(0x37d1ddbf,0xeede05c2),LL(0x2715d035,0xb7ae0b88),LL(0x95ef9e71,0x08124878),LL(0xe5042346,0x9f87f170),LL(0x3054f163,0xebc09360),LL(0xce2e674e,0x593b42f2),L_(0x00000054),
+ LL(0x123b05cf,0x673811ec),LL(0x60b858de,0xeb464fae),LL(0x677b9369,0xd5f16b47),LL(0x26383f92,0xc119870e),LL(0x3f8c6fe9,0x5da1cbb2),LL(0xf7124d37,0xf6c7c1d8),LL(0xdb2b9c75,0x96be948d),LL(0x93746dbd,0x9988eb57),L_(0x000000c6), LL(0xd9a7bbb0,0x03e8f45c),LL(0x3d8c21e4,0x9b0b40cd),LL(0xc1186513,0xb44deee2),LL(0xf970a928,0x2d95e66b),LL(0xa6ac8009,0x8387cee5),LL(0xbddad6f7,0xfec87180),LL(0x0d3ded17,0x2404e11c),LL(0x41ea3e64,0x725101e4),L_(0x000001e0),
+ LL(0xcbc282c9,0xc6a2f3a1),LL(0xa09feeb1,0x180b5e19),LL(0xc54628c6,0xe8c61be2),LL(0x773cefba,0x054eeedc),LL(0x90648d31,0x0005e411),LL(0x36489351,0x44b74925),LL(0x54e90646,0x573a22ca),LL(0xd626639e,0xa6074dac),L_(0x000001b5), LL(0xcb4398c6,0x9e2e1f28),LL(0x11161ac9,0x4f328fba),LL(0xaaf012b0,0xb74a91c1),LL(0xadb60a6c,0x0cf3c48d),LL(0x1b818269,0xf7c4e07d),LL(0x9eb0dacb,0x2e6fbed1),LL(0xaba09048,0x9ea1ef81),LL(0xaab8c6fb,0x4b567809),L_(0x0000016d),
+ LL(0x492f635a,0xdee1b8d1),LL(0xeadd7be3,0x42ed487b),LL(0xcb4bb355,0x508d338c),LL(0x1d927c01,0x671a9478),LL(0xd1e3ea8e,0x6482584e),LL(0x83bdc72c,0xb63d17da),LL(0xe52363b8,0x49266941),LL(0x4b78813a,0xcb9e3414),L_(0x000001cf), LL(0xfef1ce8d,0x1f691526),LL(0xb7f97367,0x8a234b55),LL(0xb87b73bd,0x107f953d),LL(0x2944bffc,0x7c0ce6fb),LL(0x6166fb64,0xe784fca9),LL(0x0a71a69e,0x864d9dbf),LL(0xa770d1de,0x1d767a82),LL(0x641a01bc,0xcb0ce972),L_(0x0000019b),
+ LL(0xab3cbf9f,0xc878d60b),LL(0xeb346a1c,0x6b8a06cb),LL(0x38f8292a,0x28e10a9b),LL(0xa02441ad,0x110ae3e5),LL(0x374d8f2e,0x9df680d7),LL(0x622d31b8,0x0be1994b),LL(0x98b8d29a,0x35da2573),LL(0xcf273b8e,0x5a38591a),L_(0x00000099), LL(0x9b98c33f,0x49364b7a),LL(0xd85cd33a,0x18db5402),LL(0x71a1b4e6,0x7ccbb0bd),LL(0xda26853d,0xc76e0476),LL(0x1360631f,0x888e44f3),LL(0xf6b0ad63,0x2c3af0f8),LL(0xbec71f59,0xdbf01e8d),LL(0x723b0fd6,0x92661703),L_(0x0000000b),
+ LL(0x1651d7c1,0x28ddccde),LL(0x38aeac57,0x4e993e85),LL(0x0db5dd87,0x38abc090),LL(0xb465add4,0x0c1739c3),LL(0x43d0e74a,0x70bd3e21),LL(0x0b277d58,0xac3af0a3),LL(0x7b2c5422,0x770a41ce),LL(0x08580ab5,0x9864e070),L_(0x00000019), LL(0x9dfe51ae,0xe88e2a8f),LL(0x6783af82,0x37cfc10e),LL(0x6261464c,0x8e8c7510),LL(0xcc9c836e,0x503598b9),LL(0x560d6425,0xcf7c6100),LL(0x4d90b834,0xa8db43b7),LL(0x2444a629,0xd2cb3f5e),LL(0xcabe2a81,0x64aa2ef3),L_(0x00000068),
+ LL(0xb8ee9ddd,0x8b6de757),LL(0xa9eb572b,0xe5a924f4),LL(0x650813f9,0x4cddfbbc),LL(0x0f808102,0x750529ae),LL(0x8dbdc23e,0xfc407a67),LL(0x3db36c6d,0x549e5c64),LL(0xadee9ab1,0x55d46bd9),LL(0xacadd1f8,0xf68182d8),L_(0x000000ed), LL(0xeef3f12f,0x66e2fb66),LL(0x24a72828,0xe75f104b),LL(0x50b3c877,0xe38bb301),LL(0x2f8590fa,0xb7b5535d),LL(0xf87c6208,0xe1b50eae),LL(0x41ba355d,0x3f0d0c45),LL(0x8bfe9602,0xdc159699),LL(0x3cdcf2ea,0xab8c033f),L_(0x00000141),
+ LL(0x7513c344,0x29dba96e),LL(0xc3f8209e,0xb1d945a2),LL(0x08e3fd6a,0x6511a3da),LL(0x9263ef8c,0x2562d483),LL(0xd579038d,0xc4c88945),LL(0x5094d203,0x75e4003b),LL(0x54ec1258,0xbe6102b0),LL(0xe7874a8c,0x8d34a4cc),L_(0x00000039), LL(0x777964b9,0x018d87b3),LL(0x19a05999,0xaacd7c73),LL(0xd3cb884f,0xe794b313),LL(0x5a8d6b1c,0x598893b1),LL(0x47ab4f51,0x7e862cb6),LL(0xcd145d37,0x58ebff95),LL(0xa0ddf0aa,0xcb716afe),LL(0xa0791796,0xc7f724f2),L_(0x0000009e),
+ LL(0x69c35453,0x5cadd4b7),LL(0x080a8ec1,0xb97d34b1),LL(0x7709d928,0x24150cc5),LL(0xfda92711,0x9f76ea4a),LL(0xa5dd93a6,0x4e4f7b83),LL(0x826a2138,0xb1f097c8),LL(0xdb8dc9be,0x877e5a70),LL(0xf1a434cb,0xdd51585b),L_(0x00000174), LL(0xdd348044,0x7f07e424),LL(0x166eed95,0x061bf4f5),LL(0x469e3126,0x06b67307),LL(0xacfcc07d,0x87971f8e),LL(0x96d964d3,0xe5aebd3f),LL(0xa4d18cb2,0x5d286291),LL(0x3fbd829f,0x7560bbae),LL(0x277863a6,0x6e83e561),L_(0x000001b3),
+ LL(0x4a51a459,0x6a2ec0c8),LL(0x6902a948,0x82ea938a),LL(0x1db5acbd,0x9ed742a7),LL(0x26e981b2,0x64d1ad56),LL(0x075f4b10,0x30adf93f),LL(0xfd5008eb,0xdc51091f),LL(0x7f4f1467,0x907912b5),LL(0x0fb17ba1,0x567270fd),L_(0x0000014f), LL(0xf60b44cf,0xbf940606),LL(0x18337830,0xabbf9925),LL(0x7019fd78,0xbb5e1175),LL(0xc937b351,0x1359c463),LL(0xd19eff42,0xfe68dfe8),LL(0xa8892734,0xed1005b7),LL(0x7cc639ba,0x780e1feb),LL(0xb6ff755e,0x1f0082fa),L_(0x000000da),
+ LL(0x35763b77,0x191bfbe8),LL(0x87367459,0x58859da0),LL(0xd000c521,0x4373d9cc),LL(0x560dbafd,0xfeee235e),LL(0x8d303a3e,0x1fe980f9),LL(0x2a6082ad,0xb5244f01),LL(0x567ed43e,0x8306748e),LL(0xa7eddca6,0x4e531e38),L_(0x00000195), LL(0x65ee7784,0x100101b4),LL(0x4e959563,0x7ab1df8f),LL(0xbcb6c605,0x0218cd6f),LL(0x3a152b14,0x217b7b09),LL(0x9b32670a,0x7924c99c),LL(0x8550cfd6,0xf9af0b38),LL(0xda396f8c,0x27557bfe),LL(0x01351543,0xf74a0d9f),L_(0x0000018c),
+ LL(0xadf39ad8,0xafc3d641),LL(0x7e899074,0xeac59b4a),LL(0xab6f7e5f,0x9036a3e5),LL(0xd5685de7,0x32b71856),LL(0x6c3ebc40,0xbe82a80b),LL(0x46fa8ac4,0x8d567d33),LL(0x8f1ba3f5,0xe3d61024),LL(0x9622947c,0x175ff060),L_(0x0000006d), LL(0xbeeb648d,0x79460a8f),LL(0x28338621,0xa409e48e),LL(0x6cee22e8,0x04f98fee),LL(0x448a258d,0xb3e86ccf),LL(0xedd8a07d,0x94212741),LL(0xe7c10493,0x0eae65b6),LL(0x72b816f3,0x3c05e156),LL(0xaf3b8cf2,0xbeed59dd),L_(0x00000111),
+ LL(0x01f1e3a2,0x09ba81aa),LL(0x3d989afa,0xf91b3d7c),LL(0x24d1650d,0xff5c31f0),LL(0xdd5b9bae,0x20976038),LL(0xf21ca860,0x119240c2),LL(0xcea2f4f0,0x317b48b0),LL(0x894a28c8,0x18cdb521),LL(0x70a13f92,0x613d3aff),L_(0x00000022), LL(0xc0c32ed0,0xe8dd6883),LL(0x18e6d135,0xeb2f0e32),LL(0x2b49078e,0xf0a3dbd6),LL(0x80094f8b,0xad97e7ba),LL(0x7ec56e28,0x9e31d818),LL(0x1a28c019,0x2e151983),LL(0x924258ad,0x40e237bd),LL(0x4e48eb49,0x7b03fcb6),L_(0x0000013c),
+ LL(0x07f62c3d,0x023dd329),LL(0x3dc56c97,0x2622fb40),LL(0x2ec06f52,0xca023e51),LL(0x70809db6,0x4a297188),LL(0x1e390795,0x4a3bacea),LL(0xc30dbed7,0x0824bcd6),LL(0x3a9a9a8c,0x3e051eda),LL(0x98211435,0xbf2fd10b),L_(0x00000065), LL(0x532b9691,0x6a685349),LL(0x272a03cd,0xecc543f9),LL(0x54d18fe3,0xdf8cb8ba),LL(0x9b7c5d19,0x5f3f336d),LL(0x9e4ff288,0x5e647a61),LL(0x2dc0aea7,0xbdca4466),LL(0x24b8d191,0x33cd397e),LL(0x4bd62cf4,0xf66b542f),L_(0x00000030),
+ LL(0xdea01906,0x6acd9335),LL(0xcbf85583,0x52fb515f),LL(0x7808f963,0x374fc6d2),LL(0x5865c5cb,0xebbbb50f),LL(0xa4d0c81e,0x47f3a5b9),LL(0x29ed702e,0x97b4bc63),LL(0x64f0fada,0xf73be9b2),LL(0xe65e3bbc,0x42f9f14d),L_(0x000001d4), LL(0xd6414f5f,0x4729cdbc),LL(0x47ce590b,0xf363cdb2),LL(0x5be836dd,0x6a8da968),LL(0x5fd32e4b,0x49bdb981),LL(0x076e41c0,0x8d8f7528),LL(0x097db4cb,0x7fc1d50b),LL(0xf829470b,0x75b1cc67),LL(0xd2b6caef,0xd55324b1),L_(0x000000d3),
+},
+/* digit=31 base_pwr=2^155 */
+{
+ LL(0xcb47b0cc,0xf69ff50f),LL(0xfc1e2456,0x02b84001),LL(0x1c124be7,0xa6c9b545),LL(0x2857f671,0x07337c72),LL(0xb0a89f0e,0x7d3661d0),LL(0xaf022308,0x61f17db2),LL(0xd9b173b2,0xd0457b51),LL(0xf8c65404,0xefc1cd30),L_(0x0000006e), LL(0xfbb3972b,0xfffafb34),LL(0xc5bd6770,0xfc7a7db4),LL(0x0de59815,0x342e8ca8),LL(0x843b5602,0x0e1c9e4f),LL(0x3bfe9122,0x8b0b7c5b),LL(0xa1e2826c,0xe442b313),LL(0x88ce465c,0xf2ef9e99),LL(0x77217ce5,0xa10ff590),L_(0x00000082),
+ LL(0x3361b6ed,0x9441390c),LL(0x054f8022,0x7143ab58),LL(0x9b74e159,0x8a901ba0),LL(0x116652a4,0x9b4f3635),LL(0x0afb314b,0x45e2ee30),LL(0xd4622886,0x4d2f79f7),LL(0xb66e6167,0x298ff3c1),LL(0x2505aad2,0x27d64009),L_(0x000001d3), LL(0x43f093dc,0x0eb20dd5),LL(0x4b51c2ba,0x74c9cdac),LL(0xbf1d3648,0x10d4063e),LL(0x6b726013,0xc8c6fbaa),LL(0xf8b94ac6,0x6ce6639f),LL(0x91f488ec,0xf454066c),LL(0x24c600b8,0xf37706e5),LL(0x1cff656e,0x434286c2),L_(0x000000a0),
+ LL(0x6256aa55,0x35d5b009),LL(0x7857cb4d,0x2bf04d1e),LL(0xc85eb560,0xaf5c9697),LL(0x3e426a2c,0x140d9785),LL(0xe234a765,0xfae3a667),LL(0x6a198191,0x6a2fce6c),LL(0x3a779c8f,0x217e7e57),LL(0xb35dd0c7,0xb20040f7),L_(0x000000e8), LL(0x919a22a2,0x36df1d99),LL(0x46ee68e7,0x884f54d7),LL(0x2f9e3760,0x70670755),LL(0x1a8bd746,0xd3fc19b5),LL(0xc34c78ba,0xaf9a102e),LL(0x9b57be0c,0xfe21514a),LL(0x9e7c2e6d,0xde90d865),LL(0xd44207f4,0x19f36d3f),L_(0x000000a7),
+ LL(0xb1fd44f9,0xd877e284),LL(0x37f60445,0xca4191dc),LL(0x69f0b4df,0x358c7759),LL(0x12aaa285,0x72cf55e1),LL(0x7f71ae31,0x0ffea4f4),LL(0xfc352eb3,0x5b8d412a),LL(0xc7ffc3d9,0xabdbf74b),LL(0x239ccbac,0xd4b6acd1),L_(0x0000010d), LL(0x26f819d4,0xa6870d63),LL(0xd1598751,0xc6b0d1f9),LL(0xc925f0b6,0xa890fd44),LL(0x106c309b,0xcedd20fe),LL(0xc46673f1,0x2408588d),LL(0xebfbcf6f,0xb54153cb),LL(0xa52fed53,0x7b4aaced),LL(0x672bbf3f,0x84a22a21),L_(0x000000d4),
+ LL(0xe193ed1c,0x2197649c),LL(0xa6098bec,0x132b7114),LL(0xe879a5ea,0xbf33520a),LL(0x5ec11946,0xf7eb2f05),LL(0x76724ae5,0x8b00135e),LL(0xa281ab75,0xe322da16),LL(0x75ecccf9,0xf00478b6),LL(0x5f741662,0x77d420d9),L_(0x000000cf), LL(0x4fbd26f8,0x8deebf19),LL(0x38cf892d,0xdd1ae54e),LL(0x4a486822,0x8e9572bf),LL(0x15d5deb4,0x83965350),LL(0xa31f170a,0x098efd39),LL(0x225bfe44,0x3effcffa),LL(0xd17f63bf,0xf8e3659d),LL(0x72dce9ce,0x561fceba),L_(0x000001b0),
+ LL(0x6b2523f7,0xaed633fc),LL(0x573eaf11,0xc05113c8),LL(0x5f254d2b,0x283764aa),LL(0xee71c7fd,0x70135776),LL(0x88759ff7,0x33df5ba9),LL(0x84205188,0xd52265da),LL(0x809c0705,0x912507fb),LL(0x641067f4,0x28d91a94),L_(0x000001b6), LL(0x33e3aace,0xc5e6e2ac),LL(0x0000ebfa,0xa6c0565c),LL(0xced796bd,0x6c90c0d4),LL(0x100a3283,0xee187fc8),LL(0x82bcb3d2,0x8d7848e9),LL(0x290e6b62,0x4a59be08),LL(0x5ab586db,0xb9a00808),LL(0xf4b07e2f,0x210d8de2),L_(0x00000156),
+ LL(0xe2fa8bdb,0x224b3264),LL(0x7213c7fe,0x43204c94),LL(0x13a1a9d8,0xf7f1cdee),LL(0x68201c17,0xd60991d9),LL(0xbe9464cd,0x4334ef4d),LL(0x715fe2ea,0x590e3478),LL(0x7284a69e,0xe07f24de),LL(0x7c088851,0x5ce9bed5),L_(0x0000002c), LL(0x36040931,0x3aeb8798),LL(0x222d178c,0xa01cdb6d),LL(0xe0c1815b,0x29424615),LL(0xec65cc42,0xfd885c8b),LL(0xfd5df228,0xd9564da3),LL(0x9775d121,0xb060eb3c),LL(0xdc43087b,0xbf975586),LL(0x0c723af3,0x941c0856),L_(0x000000ab),
+ LL(0xfd05258f,0xbf0ac7a2),LL(0x744e57f4,0x8834334c),LL(0x2edb448a,0x4c1f9523),LL(0xc8e4d56a,0x85d4cde6),LL(0x0bd23e3b,0x83063d71),LL(0x45b52f37,0x14ca833d),LL(0x2012d08a,0xff85aaed),LL(0x02ccbe55,0x9fa9b95c),L_(0x00000091), LL(0x646e2555,0x04999b76),LL(0xf355b09a,0x9309a1f5),LL(0x00d64b66,0xb2bd55ad),LL(0x57889605,0x6b121bac),LL(0x20d91b65,0xed693b72),LL(0x1faab888,0x344453ea),LL(0x45d07a30,0x75e36d67),LL(0xf7e7a52e,0x86433618),L_(0x00000079),
+ LL(0x0a388dcc,0x9079f10e),LL(0x7efb5f88,0x2c050909),LL(0x1cc662d3,0x7e0de0a5),LL(0x5ee0da97,0xb01a8aa9),LL(0x4922eaaa,0xbf868cba),LL(0x64bbc9e2,0xba2129b9),LL(0x0afac1c6,0x38f86242),LL(0xc8be3270,0x7520a9f0),L_(0x00000139), LL(0x304a400c,0x0cf7a18c),LL(0x5d48ee16,0xc85d4499),LL(0x04528b19,0x2452bab5),LL(0x65b2b9c3,0xbcfb2531),LL(0xd43a545f,0xc03362e0),LL(0x07cc670e,0x5d9aafa1),LL(0x58f98004,0xd816f41a),LL(0x324a8340,0x352c0783),L_(0x000001c3),
+ LL(0xef15b603,0x4b2484fc),LL(0xfc2dc91c,0x3b5be485),LL(0xd7e9f840,0x42217cb5),LL(0x8585ec85,0x3deede9d),LL(0xa1f0053f,0x48c56ddd),LL(0x845902ce,0xb2e99028),LL(0xdbb111fe,0x8f6659bc),LL(0xf1537c2b,0x89960f5b),L_(0x0000015d), LL(0x9799e891,0x88a9e85b),LL(0x39c6986f,0x69af11de),LL(0x0fa555ee,0x0c555b9d),LL(0x411f3b27,0x62266b30),LL(0x0b0e864c,0x784a1194),LL(0x112da824,0xb7ec5b26),LL(0xc56950bf,0x8a57ba0f),LL(0x3866d81f,0x72e0aa00),L_(0x000001b7),
+ LL(0x74fcfd7a,0xf2f274e7),LL(0x9f7aad66,0xd84871e2),LL(0x040c2554,0x2a4885e0),LL(0x8ddb8ec0,0xbfd317bb),LL(0x2a407fab,0xaa27b70d),LL(0x17f03cf3,0x1bed7718),LL(0x8c3de6bc,0x34f5d378),LL(0x0e550353,0xfef609bb),L_(0x0000014a), LL(0x0902c90e,0xc5275edd),LL(0xd325a149,0x33824d71),LL(0x14d92534,0xba4131f2),LL(0xf74f4dc1,0x81fdb0c7),LL(0xd354ab8c,0xc33be6cd),LL(0x96e68610,0x7d362d2c),LL(0x967ca304,0xad3a9c9c),LL(0x90a06f8b,0xaf6da5b3),L_(0x0000007a),
+ LL(0xddf9e139,0xc1710f55),LL(0x67ff0e8d,0x7ef6718f),LL(0x601481b6,0xb39b462d),LL(0x57d09ffa,0xad90ba10),LL(0xf83bbbb5,0x918d94f2),LL(0xed4c7a16,0x2bee8d2e),LL(0x9ddb61a1,0xdadd0291),LL(0xde96ab74,0x2e5753e9),L_(0x00000190), LL(0x7de034dc,0xa3926dcd),LL(0x5af3e375,0x827a6eab),LL(0xeb250dce,0x08623cdc),LL(0x52408bd1,0x9a7d0e9c),LL(0x236fdad4,0xf66e3019),LL(0x55ed033a,0x55cf40ab),LL(0x67077bc7,0x33b49be6),LL(0x3d6972e6,0x34396ea4),L_(0x00000153),
+ LL(0x8bb989ec,0xa4c22061),LL(0x30374f9c,0x83feabc1),LL(0x5043f74b,0xf24a71b6),LL(0x0f58d08b,0x5ac8cda0),LL(0xe7084b9c,0x20120c5a),LL(0xc241d2a2,0xa700c2dd),LL(0x246b4a2f,0xe50e9154),LL(0xe1b127ec,0x240be13a),L_(0x000000aa), LL(0xbc8ef89e,0x0178da07),LL(0x4ac8c26e,0xa3abe616),LL(0xeaa2008e,0x58d98d73),LL(0x16a0bdbf,0xf5f03b56),LL(0x0dd5224a,0xafd2d956),LL(0x656cc265,0xe30a653c),LL(0x896d53dd,0xc8ac8028),LL(0x8038e832,0xe07a2ee0),L_(0x0000005a),
+ LL(0x20009e51,0xf7671c0c),LL(0xdb94fffe,0x0361d956),LL(0xbca8fdc3,0x860aa7a6),LL(0xff4ebfa5,0xca2b724b),LL(0xd506fbfe,0xe572f34f),LL(0x2e88a7d1,0x430c48ff),LL(0x74822e19,0xeb20b178),LL(0x623c0129,0x07cc6f01),L_(0x000001db), LL(0xa60b4906,0xe9244f5d),LL(0x8954a885,0x2bf3bfbd),LL(0xf3969954,0xa7e331fd),LL(0x80dc93a6,0x16b29c51),LL(0xe85d8098,0xfad960c8),LL(0x7931b35d,0x74ab3a3a),LL(0x2e570f29,0xf4422349),LL(0x54904daa,0x5e1f7007),L_(0x000000f2),
+ LL(0xa473f03a,0x11b4e5eb),LL(0x5620232e,0x8a138aa8),LL(0x46f706eb,0xa03d24cf),LL(0x6e11ca59,0x7337f5d0),LL(0xad37149e,0xfa3336f2),LL(0xb68bf40b,0xcb9ee77e),LL(0xa7c9f76e,0x8719bf3b),LL(0xf9bd4330,0x45e4e081),L_(0x00000196), LL(0xabe87083,0x4d1bc133),LL(0x8d32cc0d,0x1bd3eff3),LL(0xa11a2038,0xde1eb1a9),LL(0xa2e7f299,0xb382b9cb),LL(0xac50dfdc,0x62fa8c40),LL(0xe2272381,0xa696bb54),LL(0xf025e3e7,0x68bf08ed),LL(0x608f07d7,0x91eb5365),L_(0x0000002b),
+ LL(0xae8ee138,0xea56e1b7),LL(0x5f8128c4,0x028409b6),LL(0xe5e0d92d,0x8ed0e1c4),LL(0xf3b74f68,0xc55f66d6),LL(0x35d3f9f9,0xdeb2ab80),LL(0x3bde4296,0xa7cb6b64),LL(0x25e29f7e,0x9b9d057f),LL(0x087f5f23,0x17e3fac2),L_(0x000001af), LL(0x23c7d215,0xd463cbb3),LL(0xd926fd3e,0x014b12b6),LL(0xab9ee679,0x3a1bcb9a),LL(0x1f47e609,0x17170593),LL(0xf44f73dc,0x3b0a4387),LL(0xd2a12e51,0x3ce5c7cd),LL(0x473ec3b7,0x7f341e3a),LL(0x6aef1796,0x09a474c8),L_(0x00000038),
+},
+/* digit=32 base_pwr=2^160 */
+{
+ LL(0x1f0b504d,0xc2dc9808),LL(0x7f1bc655,0xb688a237),LL(0x67de245f,0xd7a61e34),LL(0x30b260cd,0x9aaf28a3),LL(0x9aeae5d8,0xd4e07803),LL(0x53d349d8,0xd7aea422),LL(0x38cabcfe,0x3728bd24),LL(0x25a9960f,0x58af5683),L_(0x000000f6), LL(0x17d640b6,0x816e52ab),LL(0x1bc21ee4,0x31a5819d),LL(0x26613d4c,0x2a5969b3),LL(0x1a8c1407,0xabfa75ee),LL(0xd357015b,0x7c563bc4),LL(0xd2086ecb,0xa4a80425),LL(0x9b8fafb1,0xc2661a2c),LL(0x547ef737,0xe7afb2d6),L_(0x00000020),
+ LL(0x9838a5e0,0x65726f32),LL(0xb7a9942b,0xa33e2204),LL(0x4a26b80f,0xbbf82a56),LL(0x73c6f40a,0x970dfcc9),LL(0xf9548526,0xf1c38e96),LL(0xd2bbae55,0x2ecb19ab),LL(0x1edd71d6,0x6d97496c),LL(0x2e20adf2,0x17e1cf32),L_(0x000000d9), LL(0xc3991164,0x76aaf44a),LL(0xb67e29ba,0x1031c67b),LL(0x3d1213c2,0xe37fdfde),LL(0xb4f3b345,0xb46f2bbe),LL(0xef5d5bda,0x53442227),LL(0xbdace910,0x75a65c11),LL(0x0e12dac1,0x99010c36),LL(0x58cdb1cf,0x06f25026),L_(0x00000071),
+ LL(0x49a4961a,0xee441882),LL(0xdeb1c61c,0xf8ff5eb8),LL(0x6080b71c,0x7b2ccc29),LL(0x214b75b5,0xffb3c6aa),LL(0xe80f53b9,0x90a50e70),LL(0xfeb156be,0x0211fd2f),LL(0xa94620e8,0x15422e55),LL(0x085db41e,0x20305265),L_(0x0000015d), LL(0xe6193074,0x139e1933),LL(0x50841313,0x976e986b),LL(0xb6d55898,0x36a0866b),LL(0xa443f795,0xe06bc0b2),LL(0x63ba00b8,0x734e5428),LL(0xdd7a73a3,0x213440e4),LL(0xb2efa382,0xb0905af8),LL(0xe95312ec,0xb084f884),L_(0x000000ef),
+ LL(0xc6e6f324,0x3f172c5e),LL(0xd8ddaafa,0xeb6e8784),LL(0x785f2ae4,0xf77d65ef),LL(0x4e5db162,0xdec5c58d),LL(0x2375c785,0x4a30bffa),LL(0xc92e0f7f,0x0c920bb7),LL(0x294b17a0,0x26f93d72),LL(0x0a9107e0,0xce9dc095),L_(0x00000111), LL(0x66f1f498,0x2b841c67),LL(0x72452329,0xb0490079),LL(0x0e7ddb4c,0x55646515),LL(0xc3ad47f9,0x4b2a0877),LL(0xd8708db4,0xa4c3de4b),LL(0xb4a9131f,0x938e9d24),LL(0x85e650ae,0x80176c45),LL(0x60bb2e49,0x0248559a),L_(0x00000182),
+ LL(0x9a9281b2,0x28cef71c),LL(0x2e3e2609,0x5311578b),LL(0xb15a4e84,0x66031c77),LL(0xc30c76cc,0xf2c06ffc),LL(0xc352a0e2,0xea471db8),LL(0x9a687b94,0x2e1e184b),LL(0xb1979864,0x08e1a1c9),LL(0x7d1d84cf,0xa36c823a),L_(0x00000062), LL(0x1fedfb4a,0x47b77555),LL(0x1b0d298e,0xe7833c92),LL(0x071e1319,0xe5e5ae43),LL(0xbf6e6f4c,0x48ff7cbd),LL(0x44726013,0xec042f31),LL(0x861a992a,0x820461f1),LL(0x0e5f80d4,0x5b728532),LL(0x588846b7,0x4edf14c0),L_(0x000001ef),
+ LL(0x9277436f,0x0f51608c),LL(0x41c6cf4e,0x15b1b366),LL(0x263e7b75,0x6eb6d459),LL(0x041a5063,0x53679a56),LL(0x6ef1d0df,0x9b4abcaa),LL(0xb47a0301,0xae975077),LL(0xd2d427ef,0x62f30c49),LL(0x5a3dfa91,0xc801e565),L_(0x0000018b), LL(0xac347e0b,0x68202783),LL(0x26d59f48,0x4e17501a),LL(0x3895e666,0x202e3866),LL(0xaa8031f4,0xd2af7613),LL(0x8ddf2869,0xa21cc1e5),LL(0xe13d84ff,0x5da3159e),LL(0x8f6eb59a,0xb87bbc9c),LL(0xdc5df9b7,0xb8b6006c),L_(0x00000171),
+ LL(0x86ea29f3,0x3e6aa5bb),LL(0x9e7a21c0,0xee3c40e2),LL(0x9e430844,0x91ca8307),LL(0x420584b0,0xfb05a033),LL(0x5dc3546a,0x515d7ef6),LL(0xdfae44d0,0x8e97acb0),LL(0xad35608c,0x1c181a0b),LL(0x85a78e5d,0xd8ba90d8),L_(0x000001ca), LL(0x26e7f38c,0x4b1cba50),LL(0x3d89eff9,0x1828d959),LL(0xb8883419,0x9cd1acbe),LL(0xe7788137,0xd9c16250),LL(0xf51b1fc4,0x2f4d66db),LL(0xbf985d68,0xe78a703c),LL(0x98e4fae0,0x8125e5c9),LL(0x9fe12466,0x7096d179),L_(0x0000015c),
+ LL(0xe90f79af,0x96c267db),LL(0x2de8af3a,0xd7a0da68),LL(0xfc2373c7,0x5ae71058),LL(0x00846c04,0xb05a94e6),LL(0x87910867,0x49ec9a78),LL(0x0df20f65,0xaecf973f),LL(0xd4a6c168,0x30604ed3),LL(0x0b50f6bc,0x2722d421),L_(0x00000134), LL(0x8348ffda,0x3c89badc),LL(0x32767a9d,0x76ac95ea),LL(0xdc1a4baa,0x3eced60d),LL(0x114219cd,0x2d3cddf3),LL(0x557cfa7d,0x4c14e1ea),LL(0xd40b6e23,0x77a3c466),LL(0x24ae1830,0x9bfca752),LL(0x8ee59e15,0x0d62fa0c),L_(0x000000c3),
+ LL(0xd968b8f1,0x98c15e86),LL(0xdbdbd0e0,0x13fe0c31),LL(0x3f1495d3,0x611ba4e9),LL(0xcaa1f174,0xd93815b9),LL(0xec434016,0x3bdec28e),LL(0xb9edffc7,0x7d039312),LL(0x995ffc03,0x340b94bb),LL(0xf4d0bdad,0xd62628f0),L_(0x00000155), LL(0xe589b818,0x874bb93e),LL(0xd381244e,0xb9a019ce),LL(0x2710057d,0xa746e7f7),LL(0x5f04bc77,0xc973f2cc),LL(0x16b90cee,0x45b7cdcc),LL(0x3bf24131,0xf860483e),LL(0xa97598d3,0xd873a041),LL(0x5da07fc7,0x13ee03df),L_(0x0000007d),
+ LL(0x4b42de59,0x04785e61),LL(0x6896551c,0xc769142d),LL(0x1f7de113,0xdc5c38a3),LL(0x6f6444e4,0x619b0fe5),LL(0x442a0f4e,0xc1f930e3),LL(0x0e3d13dc,0xc2166fc3),LL(0x16566439,0x1264bd78),LL(0x043b1c6c,0x55bd407b),L_(0x0000011d), LL(0xdab614fa,0x51809e05),LL(0x37cc449e,0xcbcd15b1),LL(0xc268f122,0xde98d3eb),LL(0xd1094f76,0x2f691855),LL(0x38e9385f,0x940e99ca),LL(0xebc0ca85,0x7a41361e),LL(0x633585a2,0xe77d0dba),LL(0xf4c9fedd,0xffae9098),L_(0x0000015e),
+ LL(0xaabe6909,0xa2f1a549),LL(0xf13eb703,0xc846b81d),LL(0xcf6235f8,0xba752969),LL(0x28bf7176,0xa83689cf),LL(0x4f491b5c,0xac203f35),LL(0xa5c72127,0x17a19c66),LL(0xc5180b7d,0xe3fefda7),LL(0x2a895472,0xbc0194d4),L_(0x000000ca), LL(0x23d607c3,0x854caa47),LL(0x822cdfe0,0x7cac3eb5),LL(0x3c7db833,0x13d80239),LL(0x03909920,0xd8e93f09),LL(0xde83b6de,0xb075d1a2),LL(0x53e966c9,0x372a1d5e),LL(0x5b917dec,0x60dd5294),LL(0x8284dac3,0xff014a15),L_(0x0000013e),
+ LL(0x9489dc63,0x73b6bc0c),LL(0xf1bfa63a,0x10296f8e),LL(0xabe3e152,0x9dd0aaa4),LL(0xd3d4285b,0x0c15dad8),LL(0x5f828ba3,0x3be85ac5),LL(0x343ddcee,0x2204e02a),LL(0x532735c7,0x7ba86652),LL(0x2a530b1b,0x262994c6),L_(0x000001c1), LL(0xe1b6b90a,0x391a6b29),LL(0x05dfaa4f,0x6b8878ef),LL(0x3e5666ae,0xb1b8a9fa),LL(0xa4a12d5f,0x9ace0b8d),LL(0xc27561ea,0x7b4c8164),LL(0xef8504c5,0xd8cc29d3),LL(0x16570313,0x483fc408),LL(0x3b7b5ec3,0x2f18c762),L_(0x00000183),
+ LL(0xa9c74e4c,0xb6ecbf65),LL(0x8116e2fc,0x5e8f5e16),LL(0x59e26819,0x5609fad9),LL(0x8fafa607,0x02dca647),LL(0x7fb0c319,0x1e28746a),LL(0x62d45955,0x6e8dafba),LL(0x53e7625a,0x83169dc2),LL(0xe60b1042,0xebf6fde7),L_(0x00000127), LL(0x801f0ca0,0x7b2d8bde),LL(0x5592a1b4,0x1e6bd0f2),LL(0xcdd5271e,0x566eb6fd),LL(0x7f5033b8,0x4ca0b581),LL(0xd99ab0fb,0xb6096f1e),LL(0x3953fc59,0xcf65a6f4),LL(0x1d2ec4b4,0x1920c542),LL(0xd24e43ac,0xbc37795d),L_(0x000000bf),
+ LL(0x5e44325f,0x154c2ad3),LL(0x9ab5e4b3,0xa83af5c6),LL(0xaf86c5e5,0x17feec16),LL(0xa5cec56c,0x98ec6557),LL(0x84e83213,0x0f7fdcf1),LL(0x4c26d215,0xffda8a76),LL(0x453ea210,0x9ecd3b2e),LL(0x5f3f4d74,0x45856be9),L_(0x000001e9), LL(0x634817f2,0xa68371b9),LL(0x1b7d95b0,0xe827845c),LL(0xee539828,0x8d12cb9b),LL(0xe4618579,0x7d751e1d),LL(0x49a508f4,0xf62e7726),LL(0x71d8ff6b,0x1aa5f1f4),LL(0x1b002961,0xb185989f),LL(0xc7af8411,0x436bb002),L_(0x00000174),
+ LL(0x8c5980e4,0x83b10389),LL(0x5487e28e,0x6c59c4b1),LL(0xdbe03ec9,0x5812b87f),LL(0x800f9a8d,0xa69e4288),LL(0x0042610f,0xa98baf31),LL(0xa41914ae,0x04c78aca),LL(0xad52d4dd,0x200e6b24),LL(0xe64f0db1,0xef061a8b),L_(0x000001f3), LL(0x93332071,0x9064a4d4),LL(0xf05bb7bd,0xdb0e1035),LL(0x95a8d7b1,0xbed0afed),LL(0x5aa18c8f,0x1db27276),LL(0xbed5ae9a,0x21d6647d),LL(0x87ff9181,0xd1b9171c),LL(0x25ddbbf6,0x6afd3974),LL(0x58651838,0xd5394b3e),L_(0x000001ca),
+ LL(0xd9ab3528,0x97acef3f),LL(0xdda16fb0,0x1fbdca04),LL(0xe90de335,0xff197a3e),LL(0x7011f9ba,0x10909fc0),LL(0xbf835536,0xa3d538e2),LL(0xd3c214c4,0xd1adfbd9),LL(0x4b2db047,0xa7800e16),LL(0xe30b9e3f,0x3ba0bb0c),L_(0x00000103), LL(0xf015a843,0x3ccb2552),LL(0xb20301de,0xc8c0dcda),LL(0xaf7c3af2,0x06c79c8a),LL(0x7eefe996,0x38fb5284),LL(0x7cb586d6,0x59bf5673),LL(0xec4f260f,0x36f200b1),LL(0x62ff887d,0x39132913),LL(0xe5ed3b69,0xc40f0d7a),L_(0x000000e3),
+},
+/* digit=33 base_pwr=2^165 */
+{
+ LL(0x5648dadf,0x9d8a516e),LL(0x02a3fb8a,0x5fedd472),LL(0xecb3edff,0x7fb9838f),LL(0x762220d1,0x8b9ac40f),LL(0x23ad98dc,0x59a8311e),LL(0xfb615d6c,0x86c784ed),LL(0xe6c85dc4,0xee5f8f84),LL(0x6bbf81a7,0x58d5bb86),L_(0x000000cc), LL(0x76fcfa36,0xa1d41ef1),LL(0x007acce1,0x20e9778f),LL(0xd8b8126b,0x438944de),LL(0x437a71b3,0x4e76c73c),LL(0x9a1b4b13,0x14a56abd),LL(0xb7385f9b,0x29b4de8d),LL(0x3115d582,0x91b40784),LL(0x15347258,0xba8c32f8),L_(0x00000055),
+ LL(0xd1af8588,0x99943818),LL(0x2684f683,0x9d27b5d4),LL(0x68a5f913,0xa3ed9c84),LL(0x9f9d03a1,0xe699de7f),LL(0xe3117424,0x6ddd7e41),LL(0x967769d8,0xf6fd89cc),LL(0x0e9e00b5,0x4a6926ea),LL(0x3d7b6393,0x5b068a8b),L_(0x0000011c), LL(0xa86aa414,0x297d21cf),LL(0x9a2aecb4,0xcf147f52),LL(0x251f8677,0xd2a35774),LL(0xf0bbad3b,0xbedc57bb),LL(0xfe5b3790,0xaa31f1db),LL(0xb3cb7422,0x01bb1e75),LL(0x476bcd99,0xb31cdbf6),LL(0x8c278bd8,0x6fb17125),L_(0x0000002a),
+ LL(0xc3ec92dd,0x19f12734),LL(0x3d48fbed,0xf69ad2bb),LL(0x49bdd26f,0x985b989b),LL(0x61bfbf26,0x451c21eb),LL(0x35f12cad,0xf237a30e),LL(0x680a082d,0x2751a3b3),LL(0x88ebe4c9,0xc7316941),LL(0x0887a8fb,0xa8bdfe94),L_(0x00000103), LL(0xe0d58839,0x356f89f4),LL(0xde19c8b9,0xeab9cd80),LL(0x77afef27,0xf941390d),LL(0x16f538f8,0x8c79f62a),LL(0x9a2c1a2b,0x84a907ee),LL(0xb7aa5d96,0x9877951e),LL(0xfe7d75aa,0x59fbafe1),LL(0xc17b983b,0xb437db42),L_(0x000000ba),
+ LL(0x577ceafe,0x3a57f7ec),LL(0x4ce56b58,0x1306d958),LL(0xce15377e,0x1e23a49b),LL(0xbad5b26b,0x2d98c317),LL(0xae8b11f4,0xdc523283),LL(0xf50073f0,0xe7af81dd),LL(0xab516099,0x519277c4),LL(0x6a29299e,0x8cb7cfdd),L_(0x0000000d), LL(0x4a1c8223,0xad29a85f),LL(0x9213cb42,0x37030b7e),LL(0x364e5e4a,0xf8a54d03),LL(0x771a3941,0xb7d507ec),LL(0xd6f8ad50,0xddb1def4),LL(0xbd493bf4,0xc65eeab3),LL(0x716822a9,0x7e2f6019),LL(0x1d5d463b,0x062fa75d),L_(0x00000128),
+ LL(0x635f0819,0x6ebc6aeb),LL(0x755f610d,0x7e269fb2),LL(0xbc7a68af,0x9a7e6748),LL(0x576c91d2,0xaa653529),LL(0x8b42e1e9,0xe03c250b),LL(0x9e921ac8,0xf313cd04),LL(0x500a0736,0x48b57315),LL(0xfbe580a3,0xd15496dd),L_(0x00000070), LL(0xa35133c9,0xe43286f3),LL(0x42537712,0xfad38cc2),LL(0x5ba8dd4a,0xe8e53c49),LL(0x940cf7d8,0x88cb201e),LL(0xe105c906,0x0310db91),LL(0x14eb5137,0xbdf5c752),LL(0x04b87caa,0x73be9996),LL(0x32ce177d,0x545383f4),L_(0x00000129),
+ LL(0x43d9b9e5,0x181fa26f),LL(0xe91dfab4,0x8f94d28e),LL(0x500e4763,0x031df707),LL(0x2cdd284c,0xfc76fd9e),LL(0xb532df91,0xdbbb6032),LL(0x95140af2,0x0796b18c),LL(0x1a08045a,0xf970af5c),LL(0xb920694c,0x325b81c7),L_(0x000001e7), LL(0xbe6d4fc7,0x6128ccb5),LL(0x68880de0,0x2e3ad7bc),LL(0xb9bdf74f,0x769e9e60),LL(0x43ac2084,0x0eb7035f),LL(0x71aa1b0a,0x443fc7a8),LL(0x9b9cb064,0x8d6eb3bc),LL(0xcda0b792,0x35030dfe),LL(0xcc362ccd,0x29fff962),L_(0x00000029),
+ LL(0x4b4a6810,0x01f40601),LL(0x78cfd6f2,0x993f944b),LL(0x042c6de6,0xe197b472),LL(0x7bbfb051,0xe877f763),LL(0xa554df58,0x82d5094c),LL(0x5d801ed2,0xd75061e2),LL(0x89c183e2,0x060481cf),LL(0xe8a754c6,0x43706037),L_(0x000000ef), LL(0x5f0ea03b,0xc842ce7d),LL(0x1ecea7b9,0x0c3c295e),LL(0xd56a995a,0x2352f8cc),LL(0x2d519fed,0x7a9172aa),LL(0x95d8bcc3,0x546f4f90),LL(0x6b8cea31,0xaeee4bb3),LL(0x3f188de2,0xb3d9fe63),LL(0x63e62bb8,0x9f32b579),L_(0x000000c1),
+ LL(0xad0e3d68,0xa42ee214),LL(0xde6a66c4,0x6c6c7d51),LL(0xc1ce9444,0xd2eee21b),LL(0xeaac0d5d,0x8f8f4a8d),LL(0x5914a3e8,0x755296fd),LL(0x6c394520,0xe647dd87),LL(0x3798ebb4,0x696a7a68),LL(0xc9fd6484,0x66ec9d8e),L_(0x000001d8), LL(0x20495f98,0xf4ca34e1),LL(0x01e46446,0x0fc27507),LL(0x4431e6d9,0x0b310d40),LL(0x9766b761,0xe5199614),LL(0x04e26686,0xae7e80f7),LL(0x4f7efe74,0x9829aa76),LL(0xd9535c6d,0x5702e183),LL(0x755a23c2,0x457bd92a),L_(0x000000a0),
+ LL(0x92e45342,0xf84e8b92),LL(0xa379a575,0xfe2e00bb),LL(0xf17caafe,0xf713e2fe),LL(0xfca28897,0x56bf2a80),LL(0x484598f6,0x6ed19617),LL(0xda495469,0x3fe63788),LL(0x9a48ed8c,0x32c6923d),LL(0xea4ef749,0xdd905e15),L_(0x0000016d), LL(0x948913ad,0xa7aa5cfa),LL(0xcd183286,0xb2b44bda),LL(0xf345a8f6,0xb4add52f),LL(0xfc8c57af,0x001d629f),LL(0x9943972a,0x1f5f64d0),LL(0xee2dc970,0xc7523ceb),LL(0x078e50ed,0xa1b8fb92),LL(0x98c1c85f,0x69d2866f),L_(0x000001f9),
+ LL(0xc2e67acb,0x225d5458),LL(0xae1049c6,0x1f4012ec),LL(0xe45c8c16,0x89c61650),LL(0xe63f6f74,0x97d5ef6b),LL(0x13c990c2,0x7718d93d),LL(0x3b2af534,0x388b9ecf),LL(0xb4a19bd4,0x53cfc179),LL(0xc67cc8de,0xea4e62f5),L_(0x0000003e), LL(0xa71fbd0c,0xd67d72c3),LL(0xa67e3213,0xb4e77b7d),LL(0x2c9d3a3a,0x77d06f89),LL(0x5e517015,0x66b06c1c),LL(0x79e0be47,0x25f78836),LL(0xacaba839,0xf6cdc997),LL(0x60da7988,0x18ee069c),LL(0x75dac3e5,0x028ed009),L_(0x0000015d),
+ LL(0xac3a25eb,0x77706fdb),LL(0xce2d42d6,0x121b5db1),LL(0xbfb3bb0d,0xc38da042),LL(0xcc50a951,0x690091d1),LL(0xe0527354,0xad28eb90),LL(0x6d30c1cf,0x4621b3fa),LL(0x72f783b8,0xecc35c39),LL(0x05168f18,0x7e7054f1),L_(0x0000015d), LL(0x1e8042a4,0x437313ab),LL(0xe9455bf8,0xe4a7314e),LL(0x131fad1a,0xb8e1f53e),LL(0xd17720a7,0xbbc2ae3a),LL(0x41e60518,0xde92e4d6),LL(0x53833db7,0xd91c6976),LL(0xa3c1ec67,0x002fce6d),LL(0x353e4fb8,0xf35678d9),L_(0x000000f1),
+ LL(0x23d51660,0xe8b6d7a1),LL(0xfb16d9c1,0x2d6fbafd),LL(0x4603abda,0xc1c342fe),LL(0xc3174b01,0xf763e29a),LL(0x6ef24fdc,0x081c9b95),LL(0x6ff0c881,0xadc9659b),LL(0xc6c4ce5a,0xb4df1c4c),LL(0x1e8123e9,0x9a4d9154),L_(0x00000087), LL(0x7529564d,0x08513662),LL(0x1126c683,0x7efb0353),LL(0xe6d3af24,0x506609c7),LL(0x31b758c2,0x8f74142c),LL(0x5c5f34e5,0x0a3e4fdd),LL(0x3f4b19a6,0xe42c81b5),LL(0xf8223898,0x57c04ea3),LL(0x21041b37,0x44625a29),L_(0x00000184),
+ LL(0x46eb3995,0xafb45817),LL(0x273a1b81,0xe782c707),LL(0x122cfd64,0xf60341eb),LL(0x55516c45,0x19dc551b),LL(0x646dbbd6,0x33015a2f),LL(0xc8d289cb,0x1e2ea096),LL(0x01dbc5f5,0x04e60127),LL(0xb40b7fdc,0xaa434764),L_(0x0000016e), LL(0xb59acf0d,0x3cf9666a),LL(0x4a435c55,0xd7f50159),LL(0xa122c995,0xfe948450),LL(0x52defdfc,0xb5bd3afb),LL(0x272ef1f4,0x702b6fc2),LL(0x86c9c7cf,0x578c41a5),LL(0xce279630,0xafedf374),LL(0x57fd35a9,0xdd29b0d6),L_(0x000001c5),
+ LL(0xa856b3f9,0x8c313c96),LL(0x81430d8f,0xb3ef9728),LL(0x10f97c7d,0x57ddefb8),LL(0x07066ad1,0xca00506e),LL(0x586f421c,0xdaf65ab2),LL(0x2bf4f170,0x2f754fdd),LL(0xf2415152,0x88f0654f),LL(0x18776438,0x5393b3f2),L_(0x000000ff), LL(0x61d716b0,0x560341d5),LL(0xd6250f20,0xce99e680),LL(0x4c66a708,0xd56bd29f),LL(0x440c3774,0x8b248864),LL(0x9f32acf5,0xad54b8ec),LL(0x99d6dad5,0x45a78e51),LL(0xedbfc6a1,0xa505dcaa),LL(0x28bf41f3,0x8a48ad87),L_(0x0000010a),
+ LL(0x5a6ac292,0x548d3329),LL(0x8505c5bc,0x76050884),LL(0x4dfc2894,0x6b686f2c),LL(0x1e02d4a1,0x9d97a4c0),LL(0x2a447f5a,0x5475b435),LL(0xc828b6cc,0xd2791aa0),LL(0xe6e9d956,0x3b328dfd),LL(0x69ef6cbe,0x988497f9),L_(0x000001b0), LL(0xdf0efa6a,0x628f0906),LL(0x503dd445,0xc52d4b69),LL(0xdd2f1758,0x438796f6),LL(0x16280d32,0xce2abc46),LL(0x2fb22aa7,0xbdfd0070),LL(0xa5833469,0xd5120c6e),LL(0x80d303f0,0x047308c9),LL(0xd719acb8,0x2a731dfc),L_(0x00000036),
+ LL(0x024c2f1a,0xfb9cf085),LL(0xff178cc9,0x717cdc0a),LL(0xcd1f6670,0x8870fa8c),LL(0xc4d58854,0x99c44c6b),LL(0xd627431a,0xd7a4c31e),LL(0x552f232d,0x85daf88c),LL(0x940140f0,0x1d886818),LL(0x9aa8211a,0x16e4c1b0),L_(0x00000012), LL(0xe6c31591,0x4b6cac59),LL(0x3374279c,0xc878a0ba),LL(0x8991eda2,0x84ea0b3f),LL(0x32e3b4cf,0x5e729a39),LL(0xcc5f3102,0xd47222c0),LL(0xb4346c5b,0xc5c9ba94),LL(0x2995032e,0x41a4babe),LL(0x7ddb493f,0x7b6e042b),L_(0x0000004e),
+},
+/* digit=34 base_pwr=2^170 */
+{
+ LL(0x982798bf,0xfe921c0f),LL(0x079475b7,0x410ea1a2),LL(0xea0fd52e,0x77d4bbcb),LL(0x212e44af,0x260a54b0),LL(0xc66a7d1f,0x4269af2e),LL(0x4993bda8,0xd04f3479),LL(0x0b15e358,0x0bdfadc5),LL(0x1c67a4d3,0x2250ea3d),L_(0x00000091), LL(0xe7bebfaa,0x2783de4f),LL(0xfb63579e,0xd5ac84fd),LL(0x1abe0cba,0x4b8a145c),LL(0x84082001,0x5d987c51),LL(0xcfadaba8,0xd9eba9aa),LL(0xf5fccfd5,0x82de291a),LL(0x85e551a9,0x372c4557),LL(0x5e2bcee4,0x9d89842d),L_(0x0000009c),
+ LL(0x088ef390,0xd17b0f39),LL(0x5ae74e03,0xb17b1a43),LL(0xfbdcdaf3,0xe5084910),LL(0x63c90868,0x9102285b),LL(0xd8e63c01,0xd5454d88),LL(0x80d185fe,0x50f99e23),LL(0xf9e19dfe,0xce8d3eba),LL(0x728e09d7,0x51277498),L_(0x00000015), LL(0x031ef4b2,0x777fda1b),LL(0x7188feeb,0xf597fdfd),LL(0x6801e0f6,0x29652f82),LL(0x252e9d17,0x58dec034),LL(0xc6aa0c9d,0x43cc68d0),LL(0x6779b37e,0x9c62a4e7),LL(0x8d509f56,0x0558ca70),LL(0xd90c4133,0x56b5657b),L_(0x00000169),
+ LL(0x88fe9cc9,0x9ea07210),LL(0xa60d5a9b,0xe0116982),LL(0xb1b1d6d6,0x275ea7bc),LL(0x7f932848,0x607da14c),LL(0x3af5ede1,0x931400f1),LL(0x03040c84,0x3c889175),LL(0x6c5973c9,0xe7a0f614),LL(0x293b333f,0x5267024f),L_(0x000001bc), LL(0x034cc6c9,0x81f51a89),LL(0x99b337fa,0xc1ab5f24),LL(0x9bde774a,0x5f059cb6),LL(0x070a9fc0,0xdd8da34f),LL(0x8499182e,0x7e9ea166),LL(0x829389a7,0xaf460691),LL(0x5d843a97,0x6edc8515),LL(0xf45adbcb,0x1fe7439d),L_(0x000000a0),
+ LL(0x56937c27,0x8e9008a5),LL(0x241f1037,0x92193f76),LL(0x4e7ecf00,0xf8905d70),LL(0x28097f48,0x6b4870ad),LL(0x389acac8,0x2f86eb6f),LL(0xc3b9a313,0xfe5a3ffb),LL(0x9c6b9598,0x14fb463a),LL(0x2f429f10,0x40890855),L_(0x00000006), LL(0x41024dec,0x530c94ae),LL(0xd0399afa,0xac70ca6d),LL(0x7da5ef17,0x854eb299),LL(0xe2c80b49,0x4afd62b1),LL(0x77d7cf10,0xf0b13757),LL(0xb8dbecfe,0xdfbd794d),LL(0xf21b1b05,0x47404dbf),LL(0x96f1e68e,0x28abdaf2),L_(0x00000009),
+ LL(0xfb12ce5f,0xe27f7207),LL(0xf97a3f2a,0x787c8ad9),LL(0xd2383086,0x5dd8b1e6),LL(0xfa851816,0x13c110cb),LL(0x0056cac9,0xffc6bc3c),LL(0xca2b8de4,0x9e086187),LL(0xd596553e,0x4495145a),LL(0xa323bbac,0x799ae6f9),L_(0x00000064), LL(0x0aadfb75,0x53c95598),LL(0x813fad43,0x8941d128),LL(0xee24f158,0x81fe1387),LL(0x7ca3f8b2,0xec9a8f90),LL(0xf4bc106e,0x14a7e155),LL(0x9b049dce,0xacb41c88),LL(0xf8e36863,0x1985dcc1),LL(0xc3075358,0xa78ad338),L_(0x00000117),
+ LL(0x2801b8c1,0x764f13da),LL(0x1663cb94,0xef025b32),LL(0xdbea0296,0xc7c10036),LL(0x846d4ce1,0xa4ebe01c),LL(0xdcd331ba,0x36bdd387),LL(0x165ca514,0xbf0ef724),LL(0x1500e9b6,0xf3d31456),LL(0x2e001ed2,0x0726f097),L_(0x00000169), LL(0xc4ef20e6,0x8451ea7f),LL(0x6ab1aeac,0x04486599),LL(0x2c2e44e3,0x2f540159),LL(0x22a4d1df,0x2edd9124),LL(0x1b2aa406,0x2d29f8fe),LL(0x3d860387,0xaed1f58f),LL(0x2d78d5df,0xbde871a5),LL(0x65a5c46d,0x6c0a2f54),L_(0x000001f5),
+ LL(0x41cc93dc,0xbc829d92),LL(0xb48b90b7,0x41e85ef8),LL(0x52345df2,0xdc154eba),LL(0x0472e3d9,0xf8b4b2db),LL(0x59486c6e,0xd8c1f468),LL(0x2a84dd3b,0x1d593d50),LL(0xdf33e197,0x775fa504),LL(0x0cadf964,0xa92cc156),L_(0x0000005b), LL(0xe34e3a5e,0x6a0487ca),LL(0xfc3c5102,0x03084458),LL(0x9fa6a745,0xcfa05014),LL(0x51d7c6b7,0x8f18942a),LL(0x8c314152,0x2258ef9c),LL(0x789bb4fe,0x5dcef195),LL(0x1bcd3685,0x2b822a02),LL(0x4e898c2f,0xbded6e36),L_(0x000000f9),
+ LL(0x8bf4d11d,0xaa163689),LL(0x5ab01bff,0x58bf7fb7),LL(0xba4b1f3e,0x50bc67e3),LL(0xe8b59cab,0xcea4689c),LL(0x0d30cf8a,0xaf1932a3),LL(0xb3d1d8ed,0x92c06e5c),LL(0xfa7949e4,0xb16d8b25),LL(0x6f41db2d,0x10d851b9),L_(0x00000106), LL(0x66676913,0xb154a2b3),LL(0x96d36fe2,0x09d47ca1),LL(0x766e2a61,0xf1863dba),LL(0xa8ef9263,0xe92b5a5b),LL(0xa5da163b,0xcaad9918),LL(0x520c8298,0xf5e79189),LL(0x0a27963a,0x4ab05f91),LL(0x20b8c3b8,0xfd0103c4),L_(0x000001ba),
+ LL(0x342eb328,0xdd063123),LL(0xa94faf37,0x027545cc),LL(0x751ad636,0x5633398c),LL(0xe2af69a4,0xdb3a42f8),LL(0x9980ca80,0x3ef70c7f),LL(0x2f9f4827,0x03c8083d),LL(0x4bd7694f,0x2297619a),LL(0xcba6106f,0xb857e944),L_(0x00000130), LL(0x5e9d95f6,0xed99704a),LL(0x9b54a475,0xd04dd3a0),LL(0x45640d66,0xe5bc76a8),LL(0xb7f7aff6,0xffcfd663),LL(0x7c51db6e,0x1b1b7d77),LL(0x4ab9daa0,0x312b124a),LL(0xd1e4a043,0xa2044f37),LL(0x1147cf83,0xc70b0257),L_(0x00000184),
+ LL(0xf3d71f50,0x240110f2),LL(0x7cc2f02a,0xebf0be7a),LL(0x2ac9b5c2,0x24af14f6),LL(0x9a211862,0x782fa4b4),LL(0x50410353,0xf137e0ec),LL(0x1b26ae96,0x241ccb89),LL(0x2cdf1d3c,0x2b213449),LL(0xac6249df,0x063b93cd),L_(0x00000116), LL(0x1cd6f1cd,0x243cd7a1),LL(0xf821c5c8,0xd3358ef9),LL(0x1dea9bcc,0x06149e77),LL(0x744a2dd7,0x76a25a6f),LL(0x510fe3ad,0x126f991b),LL(0x2bff6928,0x9ff56b6f),LL(0x26743e80,0xb7342a0d),LL(0x75a539a6,0x1e395f1d),L_(0x0000018f),
+ LL(0x6b793a6c,0xc5b17046),LL(0x6c3972f8,0x30453d81),LL(0xa45c6e8c,0xf914e1ed),LL(0x3fd2d983,0x8df9d87a),LL(0x465d7bda,0x0b35e4f5),LL(0x6fe2ce33,0xd6b328dc),LL(0x54ed3799,0xfe08ef94),LL(0x7a45c9eb,0x18e443cd),L_(0x0000001a), LL(0xebd4b819,0x785e8d35),LL(0x203318e2,0x5c35d7f0),LL(0x7b61a2b1,0x652767b2),LL(0x861e2602,0x830e75ba),LL(0x44dc9f10,0x31d6ffa6),LL(0x2ba2cf1f,0x61cf1408),LL(0x6ea5aa79,0x8a5f9d9e),LL(0xc5f5c401,0x983aa3d8),L_(0x0000011d),
+ LL(0x8d73683d,0xaae3e45f),LL(0xebb6d11c,0x08fdeeb8),LL(0x0f274ee5,0x562c576b),LL(0xee620c83,0x10e47bae),LL(0x88c57185,0x279b8105),LL(0x919ff42e,0x927c894a),LL(0x7edf259b,0x23100a00),LL(0x169d16a2,0x2acb9ccb),L_(0x0000005b), LL(0x9179d06d,0xfee8415a),LL(0x94d74f07,0xcacca4b5),LL(0x4fb6e0e5,0x08cc549b),LL(0x08e788b7,0xc62edae5),LL(0xc2847dc0,0x9b9ef886),LL(0x64c8eee6,0x9deee406),LL(0xed24b57a,0xa5474323),LL(0xca2b9d44,0x16f12261),L_(0x0000006f),
+ LL(0x5e48d299,0x7ec4af3a),LL(0x1798ff0a,0x06583190),LL(0xce45de42,0xa85d801e),LL(0x661ec8ee,0xe6f87169),LL(0x12391657,0xa304ed8e),LL(0x70c4e172,0x8bed9dc1),LL(0xd437a386,0xa1738ce7),LL(0xd75a62c8,0xfe484c38),L_(0x00000079), LL(0x374f474b,0x9f0ace8e),LL(0xb886c429,0x274adb1a),LL(0x61800342,0x733bc7ba),LL(0x05688d04,0xe49410a8),LL(0x9d06b25e,0x1965c8e7),LL(0x2b710949,0xad70d74f),LL(0x3d588ffa,0x3d3fbe49),LL(0x7220b560,0xe246db1c),L_(0x00000016),
+ LL(0xff3c0838,0x8d34890c),LL(0x59239eaf,0x15030568),LL(0x6578691d,0xd8dd39f6),LL(0xcb5a2489,0x121c7f85),LL(0xf808f7b5,0x952a8bc8),LL(0x99daec7f,0x84b94629),LL(0xd8fb611d,0xbad11517),LL(0xcd32215c,0x967dfc54),L_(0x000000b7), LL(0xbbc3c9c3,0x4a7b1ca7),LL(0x3e19d6b8,0x4aecc72b),LL(0xc71b44ff,0xa89c3596),LL(0xc6ae9705,0x99c2157d),LL(0x4697a093,0x95d8264e),LL(0xd6e1d1c0,0x6704d656),LL(0x1e3c6190,0xc7b65104),LL(0x91499ef5,0x466ffc24),L_(0x000001d1),
+ LL(0x540a9b74,0x9b81bb10),LL(0x3ae92664,0x35d0ee3c),LL(0xc1f7e1a2,0x20c5e62f),LL(0x8f740935,0xb7936d32),LL(0x451ab7a1,0xc573c20c),LL(0x126bba09,0x3152bb2a),LL(0xa66454b3,0xb17e342e),LL(0x784051fe,0x3681b560),L_(0x00000027), LL(0x8fd9a547,0x8f5b18c5),LL(0xcc09f617,0x6e34c103),LL(0x22747cab,0xf8a96755),LL(0xde36110e,0x4dcfc108),LL(0x67ee6834,0x342676fc),LL(0x8502fdf2,0x5b48ae34),LL(0x3b4a1019,0x85dba2fb),LL(0x75c0d58b,0xda298efd),L_(0x00000088),
+ LL(0x42e6e512,0x335496bc),LL(0xd3205850,0x88067d33),LL(0xcf402bd3,0x0074be0b),LL(0x2913e673,0xe8db4e94),LL(0x62a0cb43,0xcf7beef4),LL(0x8c2ead81,0xf06de58a),LL(0x97eccd5d,0x501f23bb),LL(0x1d5954e3,0xa8b8e4e1),L_(0x000000b4), LL(0x025da1b4,0x1d598c1e),LL(0xbf9648fc,0x9987cb09),LL(0xd224f8ad,0xd88fba1f),LL(0x60665a60,0xd86a1d9f),LL(0xf1e7f754,0x26c4ad1d),LL(0x4acf77f7,0x7713e1da),LL(0x938971a2,0x0f78da10),LL(0x3b7fc94e,0x92811d7d),L_(0x00000039),
+},
+/* digit=35 base_pwr=2^175 */
+{
+ LL(0xbfdb04a0,0x5c665e2b),LL(0x4232c5cb,0x9a24517e),LL(0x26232f5f,0x5981cd79),LL(0x0a27a027,0xe253d4d8),LL(0x783b1d5a,0xd6c00bb7),LL(0x89b5ab0b,0x40ea4c25),LL(0x6c48caf7,0xfc5351cf),LL(0xa482e177,0x2b0e714b),L_(0x000000fd), LL(0x6ac73dd9,0x8552b5ad),LL(0x11881ba7,0xfb2067a3),LL(0x4ccac10c,0x5d449097),LL(0x9013dcbe,0x8873accd),LL(0xb2cf2a8b,0x380d70e5),LL(0x2c281733,0x4631440b),LL(0x7c3b711d,0x3747bc66),LL(0xd6b99662,0x423c70b2),L_(0x00000183),
+ LL(0x89dc8694,0xa8b11d17),LL(0x2eed227f,0x7fd9a16c),LL(0x916842cb,0xe12a5d02),LL(0x6758564c,0xe59ed474),LL(0x4b48f9be,0x8e675f35),LL(0xece126be,0xf7c75d69),LL(0x8ce3aca2,0x00f88d21),LL(0x9a768d60,0x26ea6ff2),L_(0x0000010f), LL(0xe69e2709,0x5d96ef4c),LL(0xa0efb2f0,0xac3a2f2d),LL(0xa99dc276,0x757c443d),LL(0x23ce0342,0x390d2a5e),LL(0x9b674e3b,0x7e7ea78e),LL(0x32e72b98,0xdca485e1),LL(0xb6c21856,0xda17d0d6),LL(0xee5bed8c,0x220788bd),L_(0x00000037),
+ LL(0x221d84fe,0x2333e9ce),LL(0x1a6d9a86,0xaadfe3f4),LL(0x56277e4f,0x389e2b48),LL(0xc71ed641,0x5717d1e3),LL(0x5f0642b9,0x56053a56),LL(0x042b6345,0xafc491b1),LL(0x5ee182db,0x9a47e510),LL(0x6ccadf49,0xf6da1632),L_(0x0000010e), LL(0x3d3d8156,0x05064c02),LL(0x708a5ae7,0xd681e121),LL(0x3b41c0e8,0xcbc4f74a),LL(0xe5968e75,0x47ee9e3e),LL(0x6b8f739b,0xe232789d),LL(0xcd2e53fe,0xd5500a30),LL(0xde9e78f3,0x2cad3174),LL(0x4522aa08,0x295cf494),L_(0x000001f4),
+ LL(0x6ca25a67,0x0e236499),LL(0x8d70cd44,0x61afc7ec),LL(0xd8467c51,0x4c9aa882),LL(0xbc140872,0x62a215cb),LL(0xad6d3cb9,0x6c4986c1),LL(0x912aaf7a,0x83691332),LL(0x6db2702d,0x7d4a1ecd),LL(0x3fa17e01,0xbf2405e9),L_(0x0000012d), LL(0x8090c5e3,0x8a064116),LL(0xe42ae3e6,0x395b06fc),LL(0x39938713,0x5bb1098f),LL(0xca3394a1,0x97734c1b),LL(0xe8c0bedb,0x1edfc62a),LL(0x9b0452cb,0xc661bc2f),LL(0x04c79c90,0xe6253323),LL(0x2a0dada4,0x2e4ae434),L_(0x000000fc),
+ LL(0x5105e93f,0xd1cc1e71),LL(0x144c819c,0x6629502b),LL(0xbd39770d,0x8c2f7831),LL(0xe5075a30,0x4ec45cef),LL(0x641b65dd,0xa56294ef),LL(0xe6aa4eb3,0x75854d3b),LL(0xbdb743c7,0x3fdd169d),LL(0x5176a409,0x181ac2e1),L_(0x0000003a), LL(0x9af21ff0,0x0ec035b9),LL(0x3f057fe2,0xa4b87bdc),LL(0x3feadb94,0xf7f87024),LL(0x5db56992,0x6a6cdc10),LL(0x57cd02da,0xdd69ecb6),LL(0xc54a8f0e,0xe1da3c2e),LL(0x10cf592f,0x8fe5cc2e),LL(0x3b4989f2,0x37d88e4b),L_(0x0000000f),
+ LL(0x156252b6,0xb01bd7fc),LL(0xb25b337f,0xe1e660dd),LL(0xac5d025a,0x6a73c379),LL(0xb69c2605,0xdede6af2),LL(0xb7e81b95,0xa1ae9121),LL(0x6cd030d2,0x5f7f754f),LL(0xb47d1e9a,0xc9b7c0f8),LL(0xe925d238,0xd6fa902c),L_(0x00000132), LL(0x3d941846,0xf95ace42),LL(0x6ab6a655,0x709a356f),LL(0x8fa78d47,0x9d32f258),LL(0xc583f5d3,0xab0a90b8),LL(0x5d68b6be,0x8bc51799),LL(0xcae9d65d,0x4a80ea4a),LL(0xd569fb10,0x2cb3b12f),LL(0x67b09db0,0x4b3e1e5f),L_(0x00000062),
+ LL(0x453b0260,0xf5df84a6),LL(0xcdd9e65f,0xf9cc5322),LL(0x1ae57f11,0x997b8e3d),LL(0x4ec38b17,0x52bddbee),LL(0x99728cf4,0x3daa3db0),LL(0xc592cfa0,0xe99b31ff),LL(0x0d3ad893,0x71adf8f6),LL(0x21a14a01,0x748065a6),L_(0x0000000e), LL(0x85220921,0x313c6b68),LL(0x45073a51,0x4026740f),LL(0xe3c1a79a,0x03ea00aa),LL(0x7f5aaba8,0xae0bdab5),LL(0x1d349675,0x81ecbbfd),LL(0x611cda3e,0x62377d6e),LL(0xc226bbb5,0x4eee5f15),LL(0xf8b5d257,0x8afee162),L_(0x00000002),
+ LL(0x6dca0b60,0x1e93cbca),LL(0x14655922,0x200324a2),LL(0x6c357ebc,0xfbe29569),LL(0x537e73da,0xf1c77b70),LL(0x59d41573,0x12b0a8e9),LL(0xc50a71dc,0xd18455d9),LL(0x7c9b3656,0x7fcbc173),LL(0xd9283b61,0x6acf8093),L_(0x00000097), LL(0x15b4734e,0xfa8b5737),LL(0xf0027024,0x3b38a173),LL(0x386bfccf,0xbbc99c54),LL(0xbdb95480,0x8bfbf241),LL(0xcc88d566,0x8353dffb),LL(0x7968e885,0xaa2a216b),LL(0xe22f661f,0xf0cc373d),LL(0x0c189437,0x5601679c),L_(0x0000001f),
+ LL(0x95c17af7,0xb1e74cee),LL(0x969661a7,0x9719c192),LL(0x390ae167,0x76ffd55a),LL(0xe6fc4921,0x17827dab),LL(0xb57cd8f2,0x4435c383),LL(0x16123417,0x1dcf73d3),LL(0x8d4cffd7,0x0c91ecfd),LL(0xe6e70928,0x8412502a),L_(0x00000171), LL(0x066d3430,0x019a0e1b),LL(0xecf807dc,0xfb488f96),LL(0x6c466766,0xedde1e48),LL(0x756a682c,0x37d6152f),LL(0x2661ee25,0x5b6f467e),LL(0x96e2b2d4,0xb97a8d49),LL(0x1c1589d1,0xbcf05602),LL(0xdf83ce24,0x04b7cee0),L_(0x00000197),
+ LL(0x182c5012,0xfca86967),LL(0x34e40148,0xfa3981f6),LL(0x1c864ffb,0x42879632),LL(0x5079d6d1,0x3e4b6047),LL(0x9eef5744,0x6e1e5a87),LL(0xfd7f7f13,0x38d5d2b8),LL(0x19b63788,0x1c2726dd),LL(0xc17815ed,0xf17abcb4),L_(0x0000002e), LL(0x9895b25d,0x7bb9a599),LL(0x40e55822,0x3d146be1),LL(0x7f28ae92,0x8852f582),LL(0x8cdd00a5,0x60ada16c),LL(0x7def110e,0x8158a85a),LL(0x1d1152d2,0xa55ae5c6),LL(0x4be61bf1,0x0a31606d),LL(0x8fcf413c,0xd625cdfd),L_(0x0000013c),
+ LL(0x16a0ecdc,0x6c3d008c),LL(0xd11d6fc4,0x0786f8b9),LL(0x26066afc,0x6f28cd76),LL(0x6a57afc2,0x9d41e208),LL(0x2ed8fbfb,0x32ce6027),LL(0xda94edc4,0xf08d764b),LL(0x94110774,0xd4093a46),LL(0x8526b334,0x084fdb6f),L_(0x000000a0), LL(0xe6b29d32,0x652dbbe1),LL(0x75164543,0x605ecb71),LL(0x6687cd0a,0x3962a1b6),LL(0xfe7869a3,0x347a147b),LL(0x1cab34bd,0x634a95b8),LL(0xbb85dfab,0xbfeffee8),LL(0x4995b282,0xf245a753),LL(0x69b18723,0x5d6e7794),L_(0x000001a4),
+ LL(0xcce2027d,0x643f2f8c),LL(0xcd45c4a5,0x24a0afd5),LL(0xa6b24112,0x2258c4c8),LL(0xfa87a5ca,0x8f855fed),LL(0x3975cb67,0xc55199f4),LL(0x9edc6298,0x5a48e9a3),LL(0x7312684e,0xf55daba0),LL(0xbfadaeb9,0xc9f5f377),L_(0x00000139), LL(0x382a7ced,0x5a3e0968),LL(0xc70ffd11,0xfcccb869),LL(0xba001f2a,0xfe8068fd),LL(0x124107bd,0x06868f7c),LL(0x28b9fe02,0x3821a909),LL(0x33728dac,0xac94afc5),LL(0x3e9edff0,0x7f67565b),LL(0x0bd10c69,0x250773ba),L_(0x000001ea),
+ LL(0xb6d26941,0x70ff7fb7),LL(0xad0ad081,0x7b1f1709),LL(0x88afd9fd,0x2c52599e),LL(0xa4b49d9d,0x58896d4a),LL(0x6df73899,0x001961cd),LL(0x1c7f535c,0xd4c3ed4d),LL(0x75c903a7,0x4c699591),LL(0xab8339d4,0x939fc682),L_(0x00000026), LL(0xf58af501,0x921bc00d),LL(0xe64a70d3,0x0644b2c5),LL(0xb7245016,0x4fad690f),LL(0x8e863833,0x52268bfe),LL(0xcab84fe2,0xc76f784d),LL(0x75b08768,0xbd5df903),LL(0x97114157,0x49a7a2a6),LL(0x5dbab306,0xb4ae419a),L_(0x00000120),
+ LL(0x8f91400d,0x24275a2c),LL(0xc241f782,0xba60fbb4),LL(0xc4fd93b4,0x616268c1),LL(0x0872941b,0x107f7964),LL(0x25e04f20,0x831b4388),LL(0x7786625f,0xc5f61924),LL(0x8de20083,0x791c6d52),LL(0xb0abde39,0x75c25ecf),L_(0x0000013b), LL(0x7b9d8c31,0xb58e09f4),LL(0x4c6bc5ce,0xb3112937),LL(0x38e27941,0xcee2666e),LL(0xca0e3235,0x8dbee896),LL(0x9b498dea,0x53066000),LL(0x0f289764,0x58ff5f8f),LL(0xfb5ee444,0xa7b5e140),LL(0xf9fb559a,0xac85e138),L_(0x00000072),
+ LL(0xc0135106,0x0d7ebeca),LL(0x20feaf54,0x19cc13ae),LL(0x3c5c75ec,0x38ba79ba),LL(0x78f3f1f0,0xf2dc8803),LL(0x911501c4,0x8fb64807),LL(0x6448cf01,0xa8bff66a),LL(0x206b2cb4,0xce9b312c),LL(0x195342ba,0x219fa1d7),L_(0x000000cd), LL(0xa18154da,0xe91053ed),LL(0x41af0398,0xadc91c1f),LL(0x6166dc26,0x5d9c3eef),LL(0x055887cd,0x90ea6dfd),LL(0x3d270166,0xa4280b95),LL(0x206854af,0x7b358dc6),LL(0xa6ae166a,0x03623eb4),LL(0x34af3892,0xe4258201),L_(0x0000013b),
+ LL(0x93905a5e,0xbb9f0c61),LL(0x99256667,0x3489213e),LL(0x27fdbbfc,0x1218ca33),LL(0x5630d2c7,0x5a83f00e),LL(0xbdc8df91,0x0d628331),LL(0x28ee96b8,0xbfe73e81),LL(0x6a5f7e06,0x2a7cd331),LL(0xdd16364a,0x8cd2a08b),L_(0x00000074), LL(0x51d38008,0x221d90fa),LL(0x814ecb88,0x8b5df20c),LL(0x00fc7920,0x76343a10),LL(0xc99f2520,0x14b68032),LL(0x71413b8a,0x654fe0dc),LL(0x9a173cb4,0xa9acd97c),LL(0x85a386e9,0x14a40bfc),LL(0x87bf160a,0x849e9970),L_(0x00000032),
+},
+/* digit=36 base_pwr=2^180 */
+{
+ LL(0xc2ffbb23,0x77384b0d),LL(0x16c289b4,0xf9601e0c),LL(0x9eabe48c,0x71ddca51),LL(0xb3f199d6,0x3fce7863),LL(0xa3ecba6f,0x2e01be3e),LL(0x67c58c7d,0xfbf4b701),LL(0x4893679a,0x2cb78d1f),LL(0xe019a436,0x15a3d7fe),L_(0x00000015), LL(0x746e7221,0x25f2840f),LL(0x160c51fc,0x516e72ef),LL(0x97156a16,0xd9625db3),LL(0xbf6e8398,0x3f5b2c0e),LL(0x651404d6,0xfc5b6523),LL(0xd10c4d87,0x8eef476d),LL(0xf40ffa31,0xe5d39771),LL(0xe3788025,0x98fa2547),L_(0x000001c2),
+ LL(0x658a6253,0xb2523e81),LL(0x8e050759,0x42659aef),LL(0xb0377d50,0x2b36823c),LL(0x419b9ae7,0xff957169),LL(0xf46fc17e,0x59705ceb),LL(0xb61ce7ad,0x2fffbd18),LL(0xa7135b60,0xfe9192a7),LL(0x96f2e092,0x30a3a8e5),L_(0x0000014d), LL(0xad967512,0x667c895e),LL(0x3da48897,0xeb732652),LL(0x467afe86,0x5b7a7cf8),LL(0x393a5ee2,0xf2568e46),LL(0xb15dd000,0xb79a3304),LL(0x203f1569,0xd91a36bd),LL(0xa5e938c0,0x1a346459),LL(0x521da127,0x88c575bf),L_(0x000000c6),
+ LL(0x633bf04b,0xc8c62a6b),LL(0xeaef0121,0x98cc53c0),LL(0x58d73540,0x925273a9),LL(0xc04448cc,0x73c56bf4),LL(0xc52be46f,0x542b800b),LL(0x39147d47,0x30298d6b),LL(0x44cb5cfe,0xb2312e04),LL(0x9ed4247f,0x4c4d89dd),L_(0x00000105), LL(0x97a9163d,0x460edd6a),LL(0xed4f4d5b,0x9206a582),LL(0xb9ca6130,0x3e18c6dd),LL(0xa3efafa9,0xa68f9bb8),LL(0xb2d783bd,0xb70a52c8),LL(0xc0dda564,0xdbe47728),LL(0x0dc789e7,0xe8a6481c),LL(0xe4119aa3,0x27f421a4),L_(0x000001ed),
+ LL(0x34050818,0xf301ee13),LL(0x055dadf3,0xd3d6ab94),LL(0x8803374b,0xa078817f),LL(0xc730e431,0xe1298465),LL(0xaae8170a,0xba08da98),LL(0x8b779119,0xf12876bc),LL(0x1b8f7410,0xbe46247c),LL(0x67bc98dc,0x18059808),L_(0x00000176), LL(0xab5cae23,0xf59de67d),LL(0xd0125b70,0x1682d3d2),LL(0x8c5ad3a0,0x9c7c1b26),LL(0x62fcf59a,0xa095cf63),LL(0x6482c8ad,0x5b79b1ed),LL(0xc253c84e,0xd6952b3b),LL(0x56917d1d,0xdfad9c37),LL(0x5c8f439f,0xa63232aa),L_(0x00000051),
+ LL(0x75e1f132,0x1f3a0552),LL(0x620ca4b5,0x48133bce),LL(0x765c9fcc,0x710e23a7),LL(0x7a6387e5,0xd9c29479),LL(0xa6621b41,0x9fe4eedd),LL(0x3bf9d9ac,0x5df19f73),LL(0x4cb8a304,0x4f51d70e),LL(0x45d5c96c,0x25c50ad2),L_(0x0000001a), LL(0x87a04f68,0xb3acd866),LL(0x4b6a5c45,0x9f7d19bc),LL(0x3f85a2b0,0x0758494b),LL(0xd50f6942,0x554c9337),LL(0x40c2407e,0x0ccb9c2f),LL(0xc5dfc1a6,0x11e7e482),LL(0x6ad44e8b,0x0fea5311),LL(0xedd080e6,0x9fd549f4),L_(0x00000188),
+ LL(0xef5cdd9d,0x7e7e29c5),LL(0x2b2e558b,0x3e6bc46b),LL(0x4702314f,0x56eeaa30),LL(0x06726fae,0x5ca44a1b),LL(0x2ee6f214,0x0ea8da79),LL(0x829cf968,0x141e7e4c),LL(0x723cb279,0x45b326cd),LL(0xdac514c6,0x5e8e8931),L_(0x0000013d), LL(0x62bd48fc,0x61e5ed08),LL(0x4a34e74e,0x83644940),LL(0xe1d4a984,0x1f65c56b),LL(0x3e5f4500,0x062ee718),LL(0xaa764b8e,0x6a39ef75),LL(0x9012ed64,0xbddef450),LL(0x42837f0e,0xfaa786a7),LL(0xf89ab588,0x474accf0),L_(0x000000d7),
+ LL(0xadd26e0e,0x1ef31aa7),LL(0x70683b34,0x5ed33b5f),LL(0x2190eb5f,0xf3278604),LL(0x8f6e3b2b,0xdb29e400),LL(0xc911a62c,0xd42f0700),LL(0x688f5189,0x7efff5e3),LL(0xc2de5c25,0xe2d46677),LL(0x6189c193,0x5de47c98),L_(0x000000ca), LL(0x0383ccaa,0xa7dddac1),LL(0xcaddccac,0xcf555803),LL(0x0778df17,0x5faf93e7),LL(0xb029278c,0x7cfbb523),LL(0xa7546c0e,0x33ef004b),LL(0xd52d052d,0xc8957290),LL(0x54a34c36,0xcc555faf),LL(0xa3e1b89d,0x77136cbc),L_(0x00000187),
+ LL(0x6c20e825,0x4760b5ef),LL(0x30fe1ead,0xd1479bf4),LL(0x3a480e70,0xba684ec7),LL(0x54c97c0a,0x99909719),LL(0xd306cb54,0xea1c5645),LL(0xcc5c264c,0x3d9ecc85),LL(0x39efac32,0x465cbfa7),LL(0xe63b20c4,0xe9cad749),L_(0x0000014e), LL(0x808827e7,0x13242934),LL(0x860bc182,0x41b298a9),LL(0x7a452bdb,0x51ceda44),LL(0x0786c3f6,0x53ca2965),LL(0x7845a5f1,0x7e0cd8cc),LL(0x5913baf8,0x060bc9cd),LL(0x0312de2e,0x79bfb315),LL(0xf7a14442,0xa16f8265),L_(0x000001f8),
+ LL(0xa3daf9d3,0x350ffc55),LL(0xd2d93315,0xecd8b90d),LL(0x88f5e22f,0x9eccd42a),LL(0xdc1f662e,0xc4f29c7e),LL(0x42b4d8d9,0x4f6798fc),LL(0xe485f1a4,0x46c699bd),LL(0x6c52567f,0xf81e6fde),LL(0xccefcbe0,0xcd5234c4),L_(0x0000015d), LL(0x821ab350,0xc73f9043),LL(0x8ce6bb52,0xbdeaccaa),LL(0x746080b0,0x3424a5b8),LL(0x0eee571d,0x785554a3),LL(0x4bc343de,0x6aadb674),LL(0x44652a58,0x2ff3c998),LL(0x5fd0a875,0x84f6f7fc),LL(0xba89cfbf,0xd08e7a6f),L_(0x00000002),
+ LL(0xacd3ee5f,0x533b8a60),LL(0x3e2d62d2,0xda0545e5),LL(0x476d9e76,0xb53693d1),LL(0x8749ddb7,0x78864741),LL(0x6623b715,0x737a1960),LL(0xb1899ac7,0xf216ba69),LL(0x057f8862,0xb25babc9),LL(0xcb288274,0x927aa4d0),L_(0x00000028), LL(0x000f8d74,0xd9a6f518),LL(0xfa70c9cf,0xfefa0627),LL(0xcdcaaa25,0xceb9750a),LL(0x15a2f18a,0x9cc57e80),LL(0xba45323a,0x0cadb63b),LL(0xe3f19ccd,0xa55c80d9),LL(0x1e511bb0,0x3bb4df11),LL(0x164359dc,0x3e271d06),L_(0x00000100),
+ LL(0xd00dafc7,0xaa6cb262),LL(0xb186d04e,0xe56a357b),LL(0x750898af,0xb3fa3a15),LL(0x4d60c192,0xc07d177e),LL(0x9679fa78,0xf75650e4),LL(0x3ad024b4,0xfc2fc8b2),LL(0x0bddcaf6,0x559b0ced),LL(0x604f3f34,0x995261e0),L_(0x0000009d), LL(0x5bdeacb3,0xfb2e6335),LL(0xc5822803,0x102a3be3),LL(0xc4f23418,0x2683d799),LL(0x446dc4f9,0x87d5a82b),LL(0x82fb7bba,0xba06b349),LL(0x859d405f,0xdacb2e84),LL(0xf7fdeed1,0xa51f1588),LL(0x8b67135b,0xc2217c58),L_(0x000000c7),
+ LL(0xbf16a7c1,0x8ed9d71b),LL(0xf4c69057,0x0ee9b6ca),LL(0xb90a3ad0,0x690215b5),LL(0xe1a72991,0x9dc86f3e),LL(0x4e4042ba,0x076b900e),LL(0x7d9520d4,0xf559233d),LL(0xa6fe5f79,0xd16f05cc),LL(0x6290cb9a,0x2c55a35f),L_(0x00000145), LL(0xa1a2502b,0x02fbcf5d),LL(0xc7fdf1f3,0x78d6c024),LL(0x3c5ac58d,0x180724dc),LL(0xeafba33f,0x0f2d4859),LL(0xa9ec392b,0x9adb7f75),LL(0x10b122b3,0xa1699e54),LL(0x8be6fae5,0xcfb1317b),LL(0x3a96cd81,0x9a5bff09),L_(0x000001c8),
+ LL(0x4c7da590,0xf6d8c638),LL(0xd287d869,0x6aabc1f2),LL(0x26b0f715,0xbdea2e8a),LL(0x8e33c1dc,0x689a9c3d),LL(0x8c56f036,0xa841ff6c),LL(0x527eaefd,0x10032f78),LL(0x0c199e97,0x6215f00a),LL(0xd8293042,0x0262f60a),L_(0x00000139), LL(0x116acfb2,0x0105c4ab),LL(0xa09207d0,0x2a3ccda5),LL(0x7549d228,0x67ad8625),LL(0x0483ecfd,0x12b83a0c),LL(0x0eee9667,0xe653fd39),LL(0x14bf0bf5,0xdd617912),LL(0x5b9e1025,0x58e59489),LL(0xb42fb14a,0x6b6fe3f4),L_(0x000000f0),
+ LL(0x332de310,0x82f2b927),LL(0xfe39c03a,0x595b30e1),LL(0xa1ad263a,0xcc294836),LL(0xe59896e0,0x55678ebc),LL(0xdab6cc2a,0x3b48be12),LL(0xf27aff9b,0x1525c60c),LL(0x72f22657,0xbfa65ac2),LL(0xe179fdb5,0x957d9762),L_(0x000001c4), LL(0xbe080757,0xaabb8ddd),LL(0x2e567a04,0xfc24eb81),LL(0xcd0abafe,0x3ab9ba57),LL(0x7ece5b5f,0x94233802),LL(0xfa49f2c9,0x192ad8a9),LL(0x7c6c9e7b,0xd9733712),LL(0x97c62d5b,0x608ec02f),LL(0x3b573c6e,0x90c6dba5),L_(0x000001a7),
+ LL(0xf559a7d9,0x41a926ac),LL(0xea7b4b5d,0x6a5e3301),LL(0x595fce21,0xee8aa9a4),LL(0x4300c92a,0xeb1b3325),LL(0xfb3d0ddc,0xe7231d36),LL(0xdd2028ea,0x0407b0dc),LL(0xb99d20da,0xf0f51dbb),LL(0xe418d5a9,0x31d74a02),L_(0x00000025), LL(0x6b8d0453,0xf7fd4389),LL(0xbfaf4600,0xe8d861a3),LL(0xf167dda3,0x92cf759f),LL(0xc46df950,0x32d3e4f2),LL(0xb7815d1f,0x91ed2fcf),LL(0x6d421190,0x12864b88),LL(0xf9dfcf39,0x04988ed3),LL(0x74a6a7f4,0x44aba25d),L_(0x00000120),
+ LL(0x924eb552,0x4033bcc8),LL(0xd518ffb7,0x2da2c2e9),LL(0x1ae0cd73,0x9a4290d6),LL(0x357cfbc1,0x784c1f06),LL(0x3ca1aed8,0x3fe20989),LL(0x85a8dedb,0x2f87969a),LL(0xc8eb2e93,0x550ff529),LL(0xfbbcc740,0x54bf85aa),L_(0x000000f5), LL(0xd7f84381,0xd5bc6372),LL(0x557f4f2e,0xc2efbdc0),LL(0x9d0c30f3,0x262ac2fc),LL(0xd5dddabb,0xa05b87d4),LL(0x769d1cf7,0xfc91e745),LL(0x4d0a4907,0xdcd38c99),LL(0x89250072,0xc453a288),LL(0x0dffae1a,0xe7245800),L_(0x000000a8),
+},
+/* digit=37 base_pwr=2^185 */
+{
+ LL(0xbc76a5c9,0x06d9177f),LL(0x5e3cbf74,0x39ed5397),LL(0x2f09def0,0x0caf736f),LL(0xbc534da8,0xfcc790fe),LL(0x46448c8e,0xb0ad47e7),LL(0x36b92fa7,0xc7671ca3),LL(0x90e92c64,0x637080ab),LL(0x52dfd8d6,0x5711517b),L_(0x0000012f), LL(0xf4a15818,0x56a0257f),LL(0x24412386,0x77234bc0),LL(0x364971ed,0x9b2d316f),LL(0x0cc8b1d0,0xdf4ae5e0),LL(0x307856bf,0x1468fa8d),LL(0xe3791c04,0xfc69805b),LL(0xfa589236,0x0c1fe733),LL(0x89a33762,0x37b57609),L_(0x000001e7),
+ LL(0x1a7b432a,0x8a01e6a2),LL(0x71b4886b,0x83120c39),LL(0xdae7cb78,0xf3efe6ce),LL(0xfd659d28,0xe1699713),LL(0x75625028,0x0252af65),LL(0xcd7c4a21,0x81fe2a3a),LL(0x7efc9c5a,0x2fab4ecf),LL(0x8ae2a5f8,0x92444155),L_(0x000001c0), LL(0x93563c95,0x95495dd4),LL(0xdf9b0e72,0xbb0facca),LL(0xab5a8f70,0x01ed29d2),LL(0x6b65b325,0xf439adfe),LL(0x2e9c2436,0x40a6c720),LL(0xbcd403e2,0x97776531),LL(0x4526a2b6,0x90cd1256),LL(0xa61dc2d5,0x170acdcf),L_(0x00000164),
+ LL(0xbcef9f83,0x8be8d883),LL(0x770de7cc,0x95107be3),LL(0x07c65e3e,0x780e3eca),LL(0xcf6ac96f,0x3d615089),LL(0x2549b641,0xf585b5b2),LL(0xacd5da79,0x4c0d8b5f),LL(0x3c8b5c5a,0x970b49ff),LL(0xadd6dfaa,0xc025c0e7),L_(0x0000005c), LL(0x34154da5,0x0b3c64dd),LL(0xc797b7cd,0xbc308343),LL(0x1f367813,0x138ae118),LL(0xe7bfbf3f,0x1f8c6302),LL(0xe3cc546f,0xef35ea2e),LL(0x904ac34e,0x852c3a0b),LL(0x2596f106,0xb1310ec5),LL(0x1e6e533a,0x763b1938),L_(0x000000bf),
+ LL(0xdd556b63,0x29b5e462),LL(0xab5e9c2f,0xc87a1f3a),LL(0x40c3ae00,0x8fdfc7cb),LL(0xf72aade9,0xf671ec86),LL(0xaa376ff2,0x369dd7b2),LL(0x0c4b0748,0x1a9eb6f9),LL(0xe5c39e83,0xb8bdb31a),LL(0xc9ef6929,0x5a4c5224),L_(0x00000112), LL(0x8d10b8d5,0x3d80ab90),LL(0x8a32a994,0x0edbbb7c),LL(0x51b7d4fd,0x9eb83ad0),LL(0xbe08eaa8,0x343de0eb),LL(0xc33cc9fb,0xad3c4d0c),LL(0x24b0953f,0x9c30b151),LL(0x582773fc,0x3a021a47),LL(0x75ab2c19,0xddfb8816),L_(0x00000173),
+ LL(0x334a8fdc,0x8da3d9ef),LL(0x644b8138,0x80531565),LL(0xf0f2d302,0x3bfd457e),LL(0x64c28e98,0x93b685b7),LL(0x24eeda6c,0x2b149454),LL(0x97f74e2b,0x1420398e),LL(0xce3c2017,0x93fa9e0c),LL(0xa9df8bc6,0x0fc6b820),L_(0x000001ae), LL(0x3c5470c1,0x52bf8c38),LL(0x06c9ae45,0x500fd912),LL(0x2fbca6d5,0x5e0fd35b),LL(0xe9e18d3d,0x39985525),LL(0x3bfa858d,0x3a3dab8f),LL(0x0bc682dc,0x51f2882f),LL(0x5632ba53,0xd2912672),LL(0xa5d16cfd,0xefb27960),L_(0x00000061),
+ LL(0xb762a667,0xf235a5ba),LL(0x39db43f4,0xdd5bbd91),LL(0x4d8ac038,0xc1e864b1),LL(0xbb5ec32b,0x9c3d8682),LL(0x0da419a0,0x7fa3e54d),LL(0xbbcc85f7,0x4911605b),LL(0x16bf46df,0x459ed701),LL(0x42b3919e,0x4a6f67ab),L_(0x0000014e), LL(0x89475032,0x761f44af),LL(0x78dc3aaf,0x7ec577f5),LL(0x443c49b1,0xcedfe95e),LL(0x4ca71a23,0x80d161de),LL(0x88a46fa9,0xa3a812c1),LL(0x8060703c,0x5d69c965),LL(0x52f25061,0xebe46263),LL(0xf14ae427,0x2518ad4d),L_(0x0000018a),
+ LL(0xce592fac,0xb29db4b3),LL(0x3eb4e951,0x73934c0c),LL(0xd205a31b,0xcde75602),LL(0xf7d9ceca,0x652846c3),LL(0xa5604560,0xf53ed6dc),LL(0xfcef8ee2,0xa3dda8b0),LL(0x73763d47,0x5dcfc88c),LL(0x3f72bc6b,0x61afbead),L_(0x00000062), LL(0x8b3b90f0,0x706c2fef),LL(0xb896e8ba,0x91189666),LL(0xa5f8d9e7,0x6dc25f9d),LL(0x98f8493f,0x29210ade),LL(0x77e1557d,0xc803167f),LL(0x80aaf764,0x746e916c),LL(0x9a02bf22,0x6f8c70cb),LL(0x692f9669,0xe6efe144),L_(0x000001e7),
+ LL(0x29ca6496,0xd6f014ad),LL(0x10e7e9c3,0x91edf75a),LL(0x042dda6a,0xfbe9047f),LL(0x6df69276,0x497f9141),LL(0xfce4035a,0xab982ab7),LL(0x1e6adadf,0xd973b8b6),LL(0x218a9fd9,0xe2c23f1d),LL(0x9e1c8c04,0x2274d47d),L_(0x000000b1), LL(0x397b98af,0x090ec3de),LL(0x272cecd7,0x6d724d9a),LL(0x50e492db,0xe32d2f19),LL(0x68f82a50,0x6bf40e9c),LL(0x0678afdb,0x4b25727f),LL(0xe6ae7819,0x06b77a36),LL(0xbb096d18,0xeedfa35c),LL(0xf41afd3f,0xc17d9b9f),L_(0x00000057),
+ LL(0x3437e67a,0xaac42698),LL(0x9e517311,0x90d691a0),LL(0xbbe7b23f,0x3efcc598),LL(0xc5b3ba4a,0xf044505e),LL(0x8a70a012,0x818530c1),LL(0xb73eeaec,0xd4496b66),LL(0x25f453bb,0xabda0862),LL(0x6dcb9832,0x76d60bb1),L_(0x00000060), LL(0x3a78a95d,0xa348f0b1),LL(0xdb8646ed,0x1af6f002),LL(0x451f5839,0x3087f4a7),LL(0xa66aaeeb,0x47adc893),LL(0xbec9934e,0x6e6950e9),LL(0xb35294f1,0x31d5e186),LL(0x7bf79296,0x590c3c8b),LL(0xc1942a2c,0x1b804ef3),L_(0x00000051),
+ LL(0x6a948f72,0xd23e1c8a),LL(0x01715db9,0x41d8f90c),LL(0xbbc2c6b8,0x4e56a842),LL(0x83c0fc75,0x986646d8),LL(0x4fe3bcf5,0x5fdbc4e4),LL(0x2ada0ebd,0x0e534106),LL(0x8c28b66c,0xb1f981f9),LL(0x56f04488,0x79a1b1cb),L_(0x00000058), LL(0x544a66a2,0x98d4263b),LL(0xb7ee4dad,0xb8425937),LL(0x9ce9983c,0xaff51ac5),LL(0x798d12f4,0x772fa5da),LL(0xb536f2fe,0x9c00b0c8),LL(0xb35431b3,0xf4789358),LL(0x2ee8e687,0x664cbdfe),LL(0x29120ae4,0xfa9435a4),L_(0x000000dc),
+ LL(0x1cd7048c,0xde30af0b),LL(0x64ca10f1,0x7af2cf68),LL(0xf23265e4,0xcdd4b45d),LL(0x4fc85e40,0x3c687440),LL(0x3ef2a535,0x6a698fc3),LL(0x9efabe8e,0x63e4d298),LL(0x18de82a4,0xb24c2816),LL(0x775b0ff1,0xf09e7eee),L_(0x00000129), LL(0x7c587948,0x1cbca914),LL(0x7dbc5bb9,0xcc9dfa8d),LL(0x432844d1,0xb35c10a9),LL(0xdb4db17a,0xf5e1db87),LL(0xf9910dba,0x86ff1ebc),LL(0xb2c9c01b,0x189bbc27),LL(0xa7d616b4,0x5df3f754),LL(0xe6cc2fbf,0x274e1d3a),L_(0x0000016e),
+ LL(0xac9d5c5c,0xcbf1d173),LL(0xd9410d43,0xb76d4376),LL(0x656599eb,0x900d071f),LL(0x2fb9b595,0x5fbadcc3),LL(0xe781b5f4,0xc0a2440b),LL(0x50f63654,0xbfcd2d0c),LL(0x1e522100,0x2f21286a),LL(0x4f742889,0x482b198e),L_(0x0000008a), LL(0x54f76137,0xd5622874),LL(0x47efa194,0x1f58794f),LL(0xbd93f7de,0xc2129e69),LL(0x5496a993,0x1b271db6),LL(0x8f7ac06b,0x5b18ae06),LL(0x78e56286,0x6111cab0),LL(0xbf1dc2cb,0x641b9597),LL(0x9c602e3b,0x6826b02e),L_(0x000000e4),
+ LL(0x391d1890,0xcc35919a),LL(0x2497cb5e,0x94f52d11),LL(0x4ef3c830,0xdf80522a),LL(0x94fd85cb,0xf72be2d7),LL(0x29671043,0x75499b11),LL(0x540e521b,0x0bd6a835),LL(0x5b01c741,0xc2f40e1e),LL(0x4828498e,0xb6d6e72b),L_(0x000000eb), LL(0x68b34fe4,0x87e9147b),LL(0x4ff41c4c,0x7947091e),LL(0x283731b8,0x31294652),LL(0xf259b874,0x0f36636f),LL(0x8ee00f38,0xfc2118ab),LL(0x8017118b,0x5f13103b),LL(0xc3d2d9af,0xc3feb59d),LL(0xca5c4199,0x39888318),L_(0x00000068),
+ LL(0x6a30f59e,0x5d7424e4),LL(0x59ff2a43,0x6be7810b),LL(0x30694fb4,0x78ec13fc),LL(0x92716d06,0x1d9c5aae),LL(0x8fbb9bb8,0x416a4a81),LL(0x1881c6a4,0x15a0a324),LL(0x489236d7,0x23235b6b),LL(0x685caeab,0xa5c2734b),L_(0x00000066), LL(0xa48020b3,0x383cc04c),LL(0x2d3601e9,0xd66a0119),LL(0xa6e151c6,0x9e61fd22),LL(0x8339ddd5,0x91be32a7),LL(0x235b6f9c,0x7155449c),LL(0x322c55d0,0xa7e5e410),LL(0xbe0a861c,0xce4ac258),LL(0x0323587c,0xd78b88ca),L_(0x00000146),
+ LL(0xadf63e55,0xb1cdbf59),LL(0x59991ed2,0x646f1d97),LL(0xae034cb5,0xcf9f8f62),LL(0xa6cfbf1e,0x9a35acdb),LL(0xb02eab43,0x0993f86d),LL(0x172ffcec,0xc65c756e),LL(0x1b44bc51,0x5ec6620c),LL(0x19230f70,0xc9e7a1a7),L_(0x00000196), LL(0x3da4f4f7,0xf7bed1a1),LL(0x28d9a36c,0x391142c7),LL(0x3d4288e4,0x0485a093),LL(0xf59f8fae,0x0209a097),LL(0x94df4e25,0x5fdf8f3e),LL(0xbc0be074,0xb3140419),LL(0xba7e0344,0x5cbb3260),LL(0x95c0673b,0x536a91bd),L_(0x000001a6),
+ LL(0xb05c5499,0x9f78e57a),LL(0x123d2b21,0xa3cf981a),LL(0xecb0183c,0x1eddfd07),LL(0x6998ed9f,0x8f90e3c6),LL(0x0e05152f,0xfad41bb2),LL(0x7dab5c5e,0x939419c7),LL(0xca783006,0xde605b32),LL(0x98ae5cd1,0x3d6039cc),L_(0x00000193), LL(0x5bb2b74c,0x590ae5b0),LL(0x68c4bf82,0xfdf4f711),LL(0x01a66f3e,0xa65b0015),LL(0x241e1da4,0x0665dbdf),LL(0x4c3387ba,0xf15f360d),LL(0xc88fe301,0x8acf4e85),LL(0x061a8e04,0x9ca9957c),LL(0x51bcc011,0x8585dfcf),L_(0x000001ea),
+},
+/* digit=38 base_pwr=2^190 */
+{
+ LL(0xa59f069c,0x37a0e4fa),LL(0xd96e52e4,0x3aebdd33),LL(0x29f2632f,0x4fd15682),LL(0x2c70c85e,0x4f3be789),LL(0x0a1634de,0xc7d9fb18),LL(0x638b44c2,0x3e6cb175),LL(0xe33499b5,0x0b60dc32),LL(0x2ecdad29,0xcf1fcbab),L_(0x000001d1), LL(0xfb1da9fe,0x5d1854ce),LL(0xb5b7539f,0xb9d47257),LL(0x96df1240,0x561ffc72),LL(0x5e9f9e9a,0x6d945271),LL(0x9f0df30d,0x25aea910),LL(0x1e814b45,0x4c475d52),LL(0x7037d6e7,0x2239acac),LL(0x6b60afbb,0x3a178a1e),L_(0x000001fe),
+ LL(0x7bee904e,0x3a760e88),LL(0x1c8cff61,0x662259f9),LL(0x3af1d337,0x798ee44c),LL(0x04c2f55a,0x7171b763),LL(0x6b42022c,0x451b89de),LL(0xe995dc45,0x0166754c),LL(0x5d7e90f4,0x45f5e9ea),LL(0x1437fe2c,0x5f81a1be),L_(0x00000183), LL(0xafbcd8ec,0x34c04a7d),LL(0x2e0b1aaf,0x62ecd7d2),LL(0xad928156,0x3ef4d947),LL(0xdc8b88ed,0x90778ccc),LL(0xd0a75501,0x1ea32bf7),LL(0x615d6df4,0x370394ed),LL(0x6cdce7de,0xa5a2d856),LL(0x5b5d94b6,0xb1500a75),L_(0x00000069),
+ LL(0x3dbc68d8,0x49071d49),LL(0x08ad1120,0x6075e725),LL(0x64ba748d,0xec7f443e),LL(0xf8b1338b,0xe9769df7),LL(0xe04bfcf3,0x276b48ae),LL(0x8c536f3f,0x51362d75),LL(0x91347181,0x7270c649),LL(0x8771d27e,0xd7277846),L_(0x000000b0), LL(0xbe64e850,0xf80d5fba),LL(0xb1ff417a,0x8984b71a),LL(0x7e8990b5,0x052a6765),LL(0xa10e9e6f,0xa3a8ec04),LL(0x68613043,0xf8edeb0d),LL(0x94eee364,0x38d79bc5),LL(0xb9b0283c,0x1f04d202),LL(0x240928e2,0xef3aafdb),L_(0x000001bb),
+ LL(0xcb0ca3e9,0x7b556d5f),LL(0x0eb6f5de,0xe1fefbb4),LL(0x92b00751,0xadf10d77),LL(0x245d985b,0xa78c0fd8),LL(0x1ec6c5bd,0x197cec62),LL(0x6f653476,0xf59e9de3),LL(0x29578b20,0x48b6a349),LL(0xdd081291,0x858df1e4),L_(0x00000060), LL(0x0140bb6d,0x4a2df7b8),LL(0x72cf54b6,0x702ccf08),LL(0x5ba02c9e,0x4fa2136f),LL(0x4316a469,0x62ca46c9),LL(0x2a601fae,0x6a69d6c7),LL(0xf210ce68,0x3ca9ff0a),LL(0x108647e2,0x7301dc8a),LL(0xbc72d54b,0xc0d011e4),L_(0x0000014f),
+ LL(0xb93b5399,0xaff92b49),LL(0x3a47424a,0x1313f0d7),LL(0xd74e27bd,0xc984d57a),LL(0xa310f0f4,0x7f2762aa),LL(0xf81b869f,0xc1c0028a),LL(0x73626037,0x16619502),LL(0xb6eafd5a,0x02aa41a3),LL(0x7a26f16a,0xee8393c6),L_(0x00000009), LL(0xa03a118c,0xc3e1533a),LL(0x770bf892,0xe55dcb14),LL(0x37abc785,0x49d52ff8),LL(0x88ea32f9,0xca2e3d46),LL(0xf41fb729,0x28df94aa),LL(0xd1d7fe42,0x6b931662),LL(0x453917fd,0xf0e1ad47),LL(0x15504e62,0xac5c9f2e),L_(0x00000008),
+ LL(0x320b74eb,0x1643c1a4),LL(0x253c03de,0x2114e9cd),LL(0xd7e1536e,0x1b41ae52),LL(0xc0d640bc,0xe9135dab),LL(0xb1a92fcb,0x5a9ef7aa),LL(0xf491bd34,0xd3e367c8),LL(0x6cfcfac3,0x6970f4aa),LL(0x28093242,0x12bc2a52),L_(0x0000011c), LL(0x174f8a3c,0x68fd0341),LL(0x14138a14,0x1a1ea358),LL(0xd7ebb375,0x0313c60f),LL(0xb31aaf76,0x7f4e2cd8),LL(0x63d1b78f,0x376b2b87),LL(0xea4746f2,0x9adb2628),LL(0x7159cd2f,0x3fee262c),LL(0x45cb3634,0x258e2340),L_(0x0000007d),
+ LL(0x8e763c10,0x1f614296),LL(0x5dcc4da5,0xa12ada20),LL(0x6dbe5329,0xd7a52ac6),LL(0x2fb42468,0x898121b3),LL(0xe9f5b08e,0x86a37006),LL(0xf5a42f83,0xbe3e6de0),LL(0x271bec98,0xc405b595),LL(0x486c9095,0x9adc363e),L_(0x000001b2), LL(0xc4ad2398,0x3c99889c),LL(0x5b663d6b,0x0c06893d),LL(0xa00328d8,0x8fc3f4f3),LL(0x2578283f,0x3d264389),LL(0x57571710,0x28e44b9a),LL(0xd62bb6bf,0x87dd3c9c),LL(0xd7a2f5d0,0xf55cade8),LL(0xcb792986,0xfa60b3a6),L_(0x000000dc),
+ LL(0x2139ecb6,0x04c2c927),LL(0x8890056b,0xc5944824),LL(0x319a82e4,0x5d37d95b),LL(0x5a8bd6a5,0xd80dfb73),LL(0xa7edec74,0xdb368732),LL(0x60fac47d,0x4f46dbb9),LL(0xb7d14924,0xe4ae15b9),LL(0x255c8153,0xd6f56370),L_(0x000001d7), LL(0x37f59faa,0x8323077c),LL(0xc814ef11,0x2b965e01),LL(0xd2dfe1b5,0xcad600e8),LL(0x2cdd66c5,0xcd44f8d0),LL(0xad1f4964,0xbb170f04),LL(0x6b03da74,0x09f8b95d),LL(0x721ac428,0xc3ee7059),LL(0xab3fd08d,0x69cd062a),L_(0x000001bd),
+ LL(0x23bf9a71,0x02685d92),LL(0xb24b23c8,0xbb2912fa),LL(0x700eb07a,0x547f3fb5),LL(0x51442fab,0xf8090af2),LL(0x91ae8f36,0xd9f38784),LL(0x7db330a6,0x213e5f98),LL(0xc4904ecd,0xd61a36f0),LL(0x18124e05,0xdf7f8676),L_(0x0000003c), LL(0xccdc9361,0x2a682aca),LL(0xa540909b,0x1f256aed),LL(0x28d1d810,0x643a464f),LL(0xc1d65b95,0xc56ce322),LL(0xe242b555,0xf79c9363),LL(0x165401c2,0x90b17574),LL(0xb89e030b,0xd9ba6bec),LL(0xad9d3eed,0x3cf323eb),L_(0x00000191),
+ LL(0xfce984aa,0x68365daf),LL(0x6bf21ffc,0x9e0da99b),LL(0x2a11bae7,0x4b632c36),LL(0xd82e9b91,0x8aba8d4a),LL(0xd3edcc69,0x7bcaa8bf),LL(0x0780abc1,0x4b5bb38e),LL(0xf449e1ff,0xb3a33e0f),LL(0x8bf9427c,0x5f153607),L_(0x00000101), LL(0x2be62f53,0xc25e9667),LL(0xa71cb23b,0xf1192121),LL(0xb5c951ff,0xe5267dca),LL(0xde9bed29,0x45f5f5dc),LL(0x62c0dc77,0x5c58640e),LL(0xb410973e,0xab71fb6e),LL(0x2ca60e2a,0xbd3de2bc),LL(0x91e919a4,0xb16029e8),L_(0x0000002b),
+ LL(0xf6897f93,0x920ffb1b),LL(0x2f766525,0x5063e19e),LL(0x0c6dbf49,0x2d7c8225),LL(0xc1e5d3a2,0x5919b3b0),LL(0xc8eabb36,0x9bd4d72c),LL(0x7daca33a,0xe43be366),LL(0x6a2d3407,0xd8bf85b2),LL(0xcb065c13,0x74ca1514),L_(0x0000012a), LL(0x69fde12b,0x240e3231),LL(0xdfa8142f,0xbfc4ea2d),LL(0xe35ddb6b,0xac61b3dd),LL(0xf38f22ff,0x0b6750d6),LL(0x6e04a783,0x0ae7817b),LL(0x43182e3c,0x5fc3f142),LL(0x70dd88d4,0x8958a84f),LL(0xe8d996f8,0x988beb73),L_(0x00000076),
+ LL(0x45a0ae0a,0x2fb883d8),LL(0xae353f2a,0xb61aaafb),LL(0x473d0ade,0x890f51bd),LL(0xd1b37ae3,0x0f0c4103),LL(0xeca49348,0x0087e22d),LL(0xc669a58f,0x3462ae96),LL(0xd7ec27b9,0x71fe3af0),LL(0x345f63a7,0x5d6f6927),L_(0x00000003), LL(0xb6063a3a,0x2047ce82),LL(0x2d78ca1a,0xbf2a2a03),LL(0xffe80d92,0x8144148d),LL(0x41e35712,0xf4375651),LL(0x70453a65,0x4044794e),LL(0x74d6e72f,0xc3b6ed9d),LL(0xc9dec888,0x03c9efa2),LL(0x01d35b17,0x4a8b5ee1),L_(0x00000156),
+ LL(0x1a111cdf,0xfedb9ea3),LL(0x89f7c11a,0xcc1f90fd),LL(0x930eb52d,0x56a442b3),LL(0xb33c2951,0x6f35d3db),LL(0x189b9ef0,0x5065c93b),LL(0x03375bf3,0xb5e57110),LL(0x9efd6440,0xacf2c750),LL(0xada5967b,0x09a6e279),L_(0x000001b7), LL(0xc686c489,0xdb8bd33e),LL(0x5a1a6302,0x0c057175),LL(0xd07e6a63,0x12ebc219),LL(0xd7415a35,0x5c53acb6),LL(0xffce8b04,0xc61aee58),LL(0xb8a197ba,0x3531c053),LL(0x76809753,0xd0b9df9b),LL(0x5e6fa51d,0xdfc91e09),L_(0x0000004e),
+ LL(0x3c210d2a,0x8909747e),LL(0x7284d674,0x9a35c4f1),LL(0xaebd8339,0x80afa728),LL(0xcd763811,0xe7b55292),LL(0xbfb44242,0x2f4e7b9f),LL(0xa0832cc1,0x4b2452f9),LL(0xeb50e9df,0xfb6f4f77),LL(0x557d53b4,0x081a5219),L_(0x000001ef), LL(0x5652cac0,0xda08f2ab),LL(0x71ddd646,0xdc6cd83b),LL(0x827b9770,0x2342c2c2),LL(0x40af5e14,0x1b228d0c),LL(0xc507fb1d,0x01646580),LL(0x8f89f75f,0x38a92b52),LL(0xe00b0563,0x154282c5),LL(0x27686a53,0x4f688875),L_(0x0000019d),
+ LL(0xce950363,0x5b121bb1),LL(0xfd31a6ee,0x6472e541),LL(0x1922fc41,0xcfaa3052),LL(0xffa68d9b,0x6480d380),LL(0xb9a18b55,0xe83a1c00),LL(0xb0e4740a,0x0caf0d03),LL(0x6f130693,0x4ea7894d),LL(0x36b54495,0x3a9ed5ca),L_(0x0000017e), LL(0x3b1453bb,0x6328956b),LL(0x8cad3c5b,0x903ec0c4),LL(0x38be6a97,0x4788849b),LL(0x6a8af4cc,0xb82169df),LL(0x753b96f7,0xf48e2aee),LL(0xbe19a762,0x3765ed66),LL(0xc53900a8,0x5283437e),LL(0x77012317,0x86b0a458),L_(0x00000027),
+ LL(0xf420ccb1,0xb5408c0e),LL(0x1466bddd,0x7d090375),LL(0x68631831,0x1d77faab),LL(0xfd6f5c35,0xe1c56990),LL(0xed7bc7e6,0x544f54fd),LL(0x65874640,0x9b1f7a03),LL(0xcb87ac9e,0xd060b45a),LL(0x33e1a951,0xd46b22b1),L_(0x000000d4), LL(0x9e1f9ddb,0x7cb30863),LL(0xb9f34068,0xa3dfc88f),LL(0x545e0d0d,0x7b5897e6),LL(0xbbf7c012,0x8cdc1322),LL(0x5bfb3570,0x13ce8bdc),LL(0xe13ad999,0xe1589aef),LL(0xb6cb7333,0x92265f86),LL(0x5f5d1b9d,0x9dfffba1),L_(0x0000005e),
+},
+/* digit=39 base_pwr=2^195 */
+{
+ LL(0x3521aefd,0x60d3d920),LL(0xe5091b5f,0xae3143dd),LL(0xec304735,0xe360b755),LL(0xf78afe69,0x119298c9),LL(0xe3ed2ff3,0x5c6a7738),LL(0x24d64036,0x06b1298a),LL(0x8b486bf0,0x3448a967),LL(0x81e9050b,0x6d50f02b),L_(0x000000c4), LL(0xa1d8699d,0xf1b1ce68),LL(0x59ff13a9,0xfc1bfb85),LL(0x23011f5e,0x1d2b17a5),LL(0xbec4e57b,0xfdcb9ac6),LL(0x53d5a58e,0x109c3a11),LL(0x4b16461a,0xe6c06b2a),LL(0xa5edc709,0xc93e99c5),LL(0x4ed62c80,0x18529aa9),L_(0x00000102),
+ LL(0x5ddb9f3a,0xbce7cc65),LL(0x49c78f7a,0xe90f1135),LL(0x6489c7f6,0x7145775f),LL(0xbe8e5262,0xc353f1ce),LL(0x36a4b927,0xda2f29fc),LL(0x3ef5bace,0x3d4c0acc),LL(0xb8074e6a,0x43a9c64f),LL(0x638d3fd6,0x70fffe4c),L_(0x000000c0), LL(0xf57826f1,0x5efbd2cd),LL(0x9bf19e6e,0xe86655bd),LL(0x7942ab0c,0xe82b0e8c),LL(0xb1c0c790,0x2f2b552c),LL(0x9dab8e1e,0x390a098c),LL(0xa67eba46,0x9b4d9810),LL(0x6a4756fc,0xc97785ec),LL(0x8fe8cb25,0xf5f5b6c1),L_(0x00000015),
+ LL(0x3550c471,0x3e59c5ce),LL(0x3ea8b15a,0xda44d978),LL(0xd1bea64a,0xe489d3d2),LL(0x8d887f59,0xcaf7d8fe),LL(0xf6f90986,0x76e4ba07),LL(0xeeb4dfe6,0x19aece18),LL(0xaf8390c7,0x4b163792),LL(0x8ecf88f9,0xfe44fa1c),L_(0x000001dd), LL(0x787acd3b,0x631704b8),LL(0xceaf9552,0xd06dc6ba),LL(0x319c43cf,0x86d813d4),LL(0xc141f1cb,0x1dcaf56d),LL(0x59594026,0xe9fcecb7),LL(0x7334a724,0xda2f8a7f),LL(0xd2a3a54d,0x40d320ca),LL(0x376b3d8c,0xee9740bc),L_(0x00000190),
+ LL(0x6b067f95,0xf72bf06c),LL(0x3dcbcaa8,0xcedc2a2b),LL(0x559f9fa4,0x707cbdc6),LL(0x65301ff4,0xb59f1a1d),LL(0xfc409d5e,0xbb9620b3),LL(0x6c53a5fe,0x48b591f7),LL(0x766a3eea,0xc3fc458e),LL(0x1913597e,0xb4cf309e),L_(0x0000005e), LL(0xae5ce891,0x8bb24162),LL(0xdda1da6f,0xcd895e57),LL(0x92393366,0x02de8414),LL(0x59ad0cbc,0x65ce8f07),LL(0x893b6573,0xbcfa2564),LL(0x73186b40,0x4fbea748),LL(0xd0156cb0,0x512a03d4),LL(0x0e490f66,0x328165e7),L_(0x0000016b),
+ LL(0xcf63e9fb,0xff9d55c9),LL(0xf62fa8e3,0x4867369d),LL(0xa6218d53,0x3d4df374),LL(0x462df770,0x0e4446f3),LL(0x5002dbe2,0xc6146393),LL(0xee0caf51,0x1bc9af4e),LL(0x615e075e,0x2e28e88d),LL(0x750b8016,0xc58c8ffa),L_(0x000001ff), LL(0x98241c37,0x91860ab2),LL(0x88c92592,0x4340d28a),LL(0xa23735bf,0x72c0db10),LL(0x9e762765,0xb8f03780),LL(0xf1edfe96,0x7d6eee09),LL(0x395f70ab,0x2e30082e),LL(0xa5b4a747,0xa42e66ca),LL(0x42b9fa7f,0x3482cf5e),L_(0x000001bb),
+ LL(0xe7982b9a,0xd1d63dbd),LL(0xe4cd39f5,0x09f98c29),LL(0xaa873723,0x561fec44),LL(0xdc9951ea,0xfd07b42d),LL(0x6c46651a,0x34575586),LL(0x7bf78c6a,0xa447b2e0),LL(0x9284f87c,0x9cdea2ee),LL(0x7235d419,0x677e1753),L_(0x0000009a), LL(0x5010f5fb,0x14229ff9),LL(0xc8f306c8,0xa79e93cb),LL(0x1a7861e7,0x05616521),LL(0x7842d63c,0x95f90f64),LL(0xcf737ed9,0xc0e16cd8),LL(0xff0413e3,0xedcf1408),LL(0xc3a4f30d,0x43a170a9),LL(0x11a0a6b4,0xcc49b5c7),L_(0x000000e0),
+ LL(0xf95a857d,0xd2ecdcea),LL(0xd4a0eaa9,0x7d01a093),LL(0xc04512bd,0x177d0211),LL(0xa88e2872,0xe8ab8a12),LL(0xf6040bce,0xec0d3b20),LL(0xbaded143,0xef133b8e),LL(0xc0271e57,0x57beaa78),LL(0xa57bec42,0x6cf36a58),L_(0x00000018), LL(0x6a0ef1d6,0x2b962ada),LL(0x54a163f7,0xdc75f9c2),LL(0x9214028b,0xf894f882),LL(0x29ad8172,0x454f24fe),LL(0x0197a015,0xb080990f),LL(0x1b117443,0x1d17b86f),LL(0x15991c9a,0x66059551),LL(0x66f5d53f,0x4e2d70c8),L_(0x000001c7),
+ LL(0x74d834c4,0x6bac308c),LL(0xd825f740,0x34b0da8d),LL(0x0fbb496f,0xde870fb5),LL(0x365075e1,0x7841bcf2),LL(0xd3c98322,0x3b8e05ff),LL(0xc39c86d8,0x74cbe33d),LL(0xf0fd6d0e,0x8904ae19),LL(0x6ed62a5a,0x2b1e2805),L_(0x000000c3), LL(0x1b67c792,0x97d2a267),LL(0x4c1cde55,0x05031449),LL(0xc0326e91,0x50606033),LL(0x423b1ee1,0xf18317b0),LL(0x398c9c61,0x5cc474ed),LL(0x96a97237,0x7eb4df47),LL(0x96b52ef0,0x1372ae46),LL(0xb1ed9607,0xabf9d1fe),L_(0x000001ff),
+ LL(0xfbbc04b2,0x31528630),LL(0xd54e33b3,0x4ada5d83),LL(0x74c3835a,0x9759009e),LL(0xdb44c86f,0x44543433),LL(0xb0ab6930,0x244966ca),LL(0x9d760ccb,0xc7b02622),LL(0x48a60f21,0xe78f542a),LL(0xb0eae43b,0x57db1786),L_(0x0000002e), LL(0x41c0d91e,0xabc5cfbf),LL(0x88276635,0x5fba9138),LL(0xcf1d1a57,0x568aba80),LL(0x955f0fe2,0x9cc142b7),LL(0x00c55c57,0x897ffd8e),LL(0x15579a99,0xb910a1ec),LL(0x58a539a3,0x68c6e345),LL(0xa76c02ea,0x37272cb2),L_(0x0000015b),
+ LL(0x8f19059c,0x9045b8e2),LL(0x054435bd,0xe377c286),LL(0x12ddcca1,0xd747b1a8),LL(0x3eb9f510,0x775c0ea6),LL(0x4fcce9d3,0x5865c783),LL(0xd37d19f7,0x2eb67bba),LL(0xbbc7cb40,0x53271117),LL(0xd5530a0f,0x600a1a8b),L_(0x00000108), LL(0x02132c61,0xddabbe5e),LL(0xb10fe3c6,0x3587db17),LL(0x11b65599,0x1c163208),LL(0xad78aa4f,0xe7539751),LL(0x51c18792,0xc229bfb7),LL(0x5719f77d,0xf84f03ce),LL(0xdd5c3eed,0xbb9c60b9),LL(0xc4b8c257,0xe60da1b9),L_(0x00000145),
+ LL(0xf591a021,0xe70fa9ae),LL(0x80aea17a,0x3cc6237a),LL(0xa1a05142,0xbfbb8572),LL(0x82ef4062,0x1a092a36),LL(0x584063eb,0x083d9b48),LL(0x0ca19b36,0xd64fde39),LL(0x92047044,0x84e4f4c7),LL(0x3a0049a4,0x025a777c),L_(0x000000e3), LL(0x1e4d1a64,0xa8f92448),LL(0x1e5063b2,0xfb85d333),LL(0x72d2c93b,0x0f374579),LL(0x6c2c1440,0x599d4bd1),LL(0xf99fc78f,0xf8d879ab),LL(0x7157a6f4,0x24350117),LL(0x6511ce35,0xf5039be6),LL(0x3e9cc395,0xa82c44a2),L_(0x00000156),
+ LL(0x35779ea3,0xe6e7d409),LL(0x83ea2a70,0x4c9ba2b5),LL(0x137328e5,0xd4654390),LL(0xb93501ec,0xd733683a),LL(0x118e98e5,0x89f374dd),LL(0x00d407bd,0x5295b907),LL(0x13b0afb6,0x57db6bfc),LL(0x6b480958,0x95fc47c6),L_(0x00000108), LL(0x42737627,0xaa37df30),LL(0x84543a49,0x5c127536),LL(0xaf148309,0xbf08a1c2),LL(0xcb7176db,0xbab267dc),LL(0xa7bbd2fb,0xabd6efdf),LL(0x8aeeb27e,0xe86eabfc),LL(0xc902ad03,0x4e44e718),LL(0xf09e682a,0x064991f1),L_(0x000001e0),
+ LL(0x22921213,0xc501c914),LL(0xa64386af,0x86838cd0),LL(0x4dd63878,0xe353d214),LL(0x2b6e52eb,0x298c7007),LL(0xb94c5abb,0x4bbcef96),LL(0x3cdd0d98,0xfb73d97d),LL(0xe31b50a6,0xd4d6c5d5),LL(0x63019a2f,0xaac04770),L_(0x0000008c), LL(0xd0908913,0x1496527b),LL(0x959a4aac,0xe7cd0ef4),LL(0x5fb6b5e8,0xcf4b2051),LL(0x77e30f99,0x1b0c7952),LL(0x70b054fe,0x38ba1d97),LL(0x5de49575,0x947a5a05),LL(0x8fe1e2d6,0x4246cd4c),LL(0x3254f07e,0x238ade18),L_(0x00000133),
+ LL(0x4d8e1514,0x99aed77f),LL(0xf6fa1112,0x9c04ed64),LL(0xd4feb2e7,0x7a120999),LL(0x5d57b4f9,0x70550af6),LL(0xd07357d3,0x41340660),LL(0xe4afb7c6,0x05ac084c),LL(0x0826e572,0xae197ca4),LL(0x3ea7fc0b,0x8f07d680),L_(0x00000023), LL(0xcb353a2f,0xaf454a02),LL(0xb5cdf6d6,0xb32bd0de),LL(0xf3bb89c8,0x1bd8c3f6),LL(0x5deb355a,0x3db355ab),LL(0x2f043ae6,0xd5c6b398),LL(0x0e90987d,0xabe8910f),LL(0x380521ad,0x4bf6a241),LL(0x3dfa044a,0xfb752ed2),L_(0x000001d8),
+ LL(0xd3c55232,0xaad132cf),LL(0x696e2831,0x49f240e0),LL(0x0d4e57f0,0x3025b776),LL(0xf18f53bc,0x0b5878b5),LL(0x56b2575b,0x576025b0),LL(0x452417b5,0x51986dad),LL(0xa57a7837,0x5444a7c0),LL(0x9f4452b9,0x9f945ebb),L_(0x00000132), LL(0x83e66b0c,0xca0455ee),LL(0xd553d885,0x83b12fcc),LL(0xd68fe49a,0x3da8d9a1),LL(0xb71fad5d,0xa984d589),LL(0x1f435980,0x5db787bb),LL(0x659a3f24,0xa908e510),LL(0xdd95c91e,0xbe7d501b),LL(0x4a9245db,0xdaa920fc),L_(0x000000d3),
+ LL(0x70b49262,0x58fdd1be),LL(0x26f6dba6,0x1bc799a8),LL(0xcb4e9512,0xf00f6eae),LL(0x56df676a,0xe75a521d),LL(0x29d333ce,0x4eca7d77),LL(0x27fb68ac,0x206d2e50),LL(0xa49aec5f,0xaa272aa4),LL(0x1b6a988f,0x341efc69),L_(0x0000007f), LL(0x8415461c,0xe6df0f07),LL(0x3afd9193,0x782686ca),LL(0xe7785c7d,0x3c2a9148),LL(0x4c330f1e,0xa49f1fa5),LL(0x82ded4aa,0xde962297),LL(0xb845da08,0x79a993b6),LL(0x0729c991,0xf8fef022),LL(0xad904b0d,0xe6016c6a),L_(0x000001ce),
+},
+/* digit=40 base_pwr=2^200 */
+{
+ LL(0x0cbfbe4b,0x938c22f8),LL(0x943a3471,0x837e8130),LL(0xe2773aac,0x4a3c4f46),LL(0xf24010c6,0x2b750229),LL(0x138446be,0x007131ff),LL(0x731813b9,0xc2c90ce7),LL(0xe94672d6,0xdd149a00),LL(0x69dcb075,0x7531381b),L_(0x000000d0), LL(0xe8e6de08,0xb6b38c7b),LL(0x39ced7c6,0xb63d5a97),LL(0xa61fbc4f,0x8f6b6bae),LL(0x075fe4d1,0x6ae1dbab),LL(0xc1ebedbd,0x12c3dbf8),LL(0x6dce109a,0xc087b051),LL(0x4a2962c4,0xa1e1733e),LL(0xf40db685,0x9f800e79),L_(0x000001ad),
+ LL(0x8bb9ff0e,0x663feea7),LL(0x4fde5cbe,0xdd02746e),LL(0x3f440437,0x33232942),LL(0x8cb2a089,0x21f2f603),LL(0x50b4f0e4,0xa8d7b95a),LL(0x18c0b0f4,0x35a473ae),LL(0xc9451cc0,0x8955b22b),LL(0x9c5154ba,0x9d1fd085),L_(0x00000134), LL(0xc1a8bcfe,0xaff04652),LL(0xe19db868,0x961dcb73),LL(0xeea574f2,0xf8c3e1f9),LL(0xf4327664,0x9b512b73),LL(0xb683e483,0xb02a0ec5),LL(0x0fb615a0,0x7991b38a),LL(0xb1e55bb8,0x3f719551),LL(0x19309417,0x0ba8f164),L_(0x0000013c),
+ LL(0x63247bdc,0x20ed0fcb),LL(0xe26950f9,0xa5916c61),LL(0x8ac76960,0x2ae5b02a),LL(0x17149cfc,0xda5eb1a5),LL(0x5c8f4a8c,0x9118595b),LL(0x0004518e,0x9e0cc88e),LL(0x9dcbce69,0xb0b05838),LL(0x5edca7cd,0x8f7a0d45),L_(0x00000167), LL(0xd452c748,0x773e3080),LL(0xd9ebc5ab,0x32f8567c),LL(0x92748ad1,0x2f890896),LL(0xd6e0eb81,0x83d0c649),LL(0xdc173290,0xed13cd26),LL(0x6815ffda,0x775e539d),LL(0x727168b4,0x09166ff7),LL(0xbfad2565,0x7a36c1d3),L_(0x00000174),
+ LL(0xa559258c,0x46e6e936),LL(0xf2627126,0x96d6c787),LL(0x7ee8f552,0x6540e78b),LL(0x53eb4432,0x2fb88504),LL(0x073a9cef,0x0e4739b6),LL(0x9bbfb39a,0x5b6532c1),LL(0xbec805ba,0x4331c495),LL(0xedb74df4,0x002e8ec8),L_(0x000001d3), LL(0x48685b39,0xcbd7ba6c),LL(0x4bae18ce,0x3a66d73d),LL(0xa9e818b4,0x5a439da7),LL(0x422e109d,0xe2bd60c3),LL(0x71574884,0x482785ad),LL(0xf6bd330b,0x8c0c9a5b),LL(0x6c8383da,0x0007cc56),LL(0x2a9a00bf,0xa489783e),L_(0x00000056),
+ LL(0x7a2ccd93,0x9d4a8e40),LL(0xd221fba2,0xd46ad86a),LL(0xfddda1e9,0x14fcb5bf),LL(0xf9686431,0x60db0e24),LL(0xb0468c5a,0xa659be98),LL(0x5c91bca8,0xcabd0c78),LL(0x1e072204,0xd9453dfb),LL(0x50ebbe04,0x8aef77cf),L_(0x00000168), LL(0x9b426c53,0xb8b62e34),LL(0x7872d194,0x43334446),LL(0xddbd4e1c,0xaad0f260),LL(0x42324117,0x7d8cfb9c),LL(0xbd6c92ea,0x883e18f4),LL(0x68768225,0x72898dd5),LL(0x59ac483a,0x25923bd3),LL(0xffec7082,0x48de2e57),L_(0x00000021),
+ LL(0x8796d389,0xf64d07f7),LL(0x07a33d42,0x4d434a03),LL(0x8948a2a4,0x03ccc6f0),LL(0xbb8f90db,0x6ff7592e),LL(0x69af4969,0x87ff2ae9),LL(0xec7fca3c,0x687414fc),LL(0xd6cec6f5,0xb3255410),LL(0x9a9ae9c6,0x961c9823),L_(0x000001ea), LL(0x1f7e4e99,0x4284bbf9),LL(0x472d0237,0x86ea89ac),LL(0xd63ca5a6,0x6cd552ac),LL(0xe6161434,0x2fb24ab8),LL(0xdc07d107,0x880d3677),LL(0xd1833f7c,0xd225c8c0),LL(0x17c50635,0x2bf84ae7),LL(0xc1f8a219,0x2e83c678),L_(0x0000007f),
+ LL(0xc0d1be3d,0xbf7ea965),LL(0xe0762dd1,0x7e003dff),LL(0xd60aa791,0x62c54da8),LL(0xfa92fc72,0x21eaa7ed),LL(0xff6dc244,0x62c86ea7),LL(0x29f82d5e,0x68214737),LL(0x535c6df4,0xb69bc00d),LL(0x494bda6b,0xf34e2601),L_(0x00000133), LL(0x3563dbad,0x1096ecec),LL(0x12da1692,0xcc5db4fd),LL(0x2f945903,0xc4f95586),LL(0x15014cb4,0xf70f6fbb),LL(0x3d80e47a,0x0a6967e2),LL(0xadb489f2,0x65a13ebe),LL(0xa0094906,0xa28958e6),LL(0x9fafaa96,0xda82221f),L_(0x00000031),
+ LL(0xf4cc713b,0xbab5dfd8),LL(0x59f2c453,0xe3fa69de),LL(0x0c9b2cc1,0xb6318b0b),LL(0x56b33c17,0x2d5d399a),LL(0x6dc3c1e9,0xf08f8a6f),LL(0x9e28633f,0x51ffb7f3),LL(0xf1fbcd43,0x77388eef),LL(0x9d013e8c,0x953e5ebf),L_(0x0000006a), LL(0x19a3879a,0xbdbfd2f4),LL(0x95e5a481,0x017a31d1),LL(0x1ef3e1ae,0xb5b37267),LL(0x8988b706,0x748e8ba9),LL(0x3916983f,0x0e9de7d3),LL(0x6e3e3c93,0xe7e37cde),LL(0xee4ca324,0xae3cdd99),LL(0x2fb6a772,0x5fda48d8),L_(0x00000023),
+ LL(0xb1b36ee9,0xa88f1006),LL(0x32101e9d,0xec995155),LL(0xbc724136,0x50786c7c),LL(0x718458f0,0x942d96ed),LL(0xd4b44c20,0xa25702b9),LL(0xf245f9d1,0x060c2adf),LL(0xb57e7b0b,0xb9d35bf5),LL(0x7ec560d8,0x06f41b22),L_(0x00000056), LL(0x330450ba,0xe70f3385),LL(0xbb3cf7d0,0xaf72af3d),LL(0xf5c80879,0x24797994),LL(0xcff4c536,0x60ff916d),LL(0x9be0e09a,0xab9b1069),LL(0x069c4c8f,0x4df20300),LL(0x1f6d9a1c,0xe23cffcc),LL(0xe8dd8a18,0xf91c6b69),L_(0x000001c4),
+ LL(0xd0d2f55b,0x95fbe896),LL(0x77feee72,0x5cc61767),LL(0x8880fcfd,0x37faec22),LL(0x520b4347,0xb528d647),LL(0x08c7efa3,0xd89b3eae),LL(0x7f34be1f,0x0837f588),LL(0x08e5ae1a,0x1bd21d07),LL(0xdd6b478f,0x2fe84dcc),L_(0x0000011c), LL(0x39fd2b7b,0x834a2481),LL(0xe505f7b4,0x2410091c),LL(0x6e308dff,0xc904e585),LL(0x881cb270,0x8e50edd4),LL(0xb510da38,0x1a9f6193),LL(0xdd2ee182,0x09d449a4),LL(0x27fbd7e1,0x8ae922fd),LL(0x099fa1c5,0xd2acc7bd),L_(0x00000151),
+ LL(0x54d97245,0x0a20a859),LL(0x0116816e,0x589d2f96),LL(0x148078e7,0xaaa24c2b),LL(0x28f3d3c2,0x171935f6),LL(0x48826cdd,0x84d3a584),LL(0x4e4018a0,0x3aa25c41),LL(0x20c105fb,0xfbf31507),LL(0x27ff55a5,0x109df084),L_(0x00000126), LL(0xebf39f9e,0x7739d21b),LL(0xd2b7193f,0xacf34cf4),LL(0x3d27ea07,0xab2591de),LL(0x55176728,0x3ceb2fdd),LL(0x2cd960ff,0x716fc560),LL(0xb6983fee,0x90fd8f68),LL(0xb59a98f6,0xe1bb13d6),LL(0x476cf07b,0x119c8087),L_(0x00000019),
+ LL(0xbdb26400,0x09bcac55),LL(0xcc9f7ef1,0xf3382f38),LL(0x8ea6fbed,0x08f8a371),LL(0x93651490,0x97354cca),LL(0xa5d779cd,0xd6ff00ea),LL(0x17e28bc6,0xcb936676),LL(0xf2c7be3b,0x4d0cca52),LL(0xe6fcf731,0xfe1b3242),L_(0x000001b7), LL(0x195399b2,0x998790dc),LL(0x13a64152,0x616ab4fc),LL(0x4787beee,0x0f38f16c),LL(0x8c14e216,0x13dc0561),LL(0x5144326b,0xab46b249),LL(0x49417c95,0x0e55d9c5),LL(0x87bf06de,0x4c1e541e),LL(0xc0681d93,0x2c9b452b),L_(0x000000e9),
+ LL(0x5003f6a6,0x8a76574f),LL(0x406e1518,0xe6346b0d),LL(0xb53c0598,0xbdfc6afa),LL(0x9ca435a5,0x50f31dc3),LL(0x9cc07001,0x1695c15e),LL(0x1fd27db3,0x80905ca0),LL(0x1aadf518,0xad7428a8),LL(0x926949ce,0xff033643),L_(0x0000007c), LL(0x248272b0,0x44dec074),LL(0x2345ae4a,0xe0173b35),LL(0x3909da4f,0x56f4144f),LL(0xe4ed2bfd,0x95f4401f),LL(0x198f03a8,0x1227b3e8),LL(0x49d6d509,0x249ec281),LL(0xe4d920ef,0xc12324e5),LL(0x0d321781,0x00c158a5),L_(0x00000106),
+ LL(0x62d3fa5e,0xe0633553),LL(0x3677eb41,0xa7b03785),LL(0x9c729924,0x166ddf87),LL(0xac9990ff,0x9eba58ed),LL(0x2f6b0f44,0x29db9988),LL(0x2b93f534,0x7f4a4f14),LL(0x92b08207,0x695177a9),LL(0xc1d4f27c,0x1d65e607),L_(0x000001bf), LL(0x7f241b64,0x1902ce34),LL(0xc2625795,0x99c8b2c8),LL(0xb763d2c5,0x4d39eb77),LL(0xa75ff101,0xd8865e52),LL(0x2e31245d,0x51ed16bc),LL(0xfc608d17,0xd782bd3f),LL(0x441d7032,0x8f51fc25),LL(0x47fab287,0xe871d582),L_(0x0000006e),
+ LL(0xd66fc4f8,0xec4b364a),LL(0xfbb65219,0xd42017be),LL(0x359e7f30,0x3fc15863),LL(0x5c218315,0xb1a3700b),LL(0xf2cbaf1a,0x040dad16),LL(0xb6cd3ff6,0xbf23d44a),LL(0xd045f02a,0x83befb28),LL(0x4160599e,0x467f747b),L_(0x0000001d), LL(0xe7de34cd,0xc40b618b),LL(0xf743241b,0x64d1d40f),LL(0x576ba83f,0x5ece3029),LL(0x4dc64148,0x47769772),LL(0x6d3057fb,0xd175fe83),LL(0x0884e64d,0x33875e4e),LL(0x859df923,0x481b7714),LL(0x655fbae2,0xdef5f5e2),L_(0x00000044),
+ LL(0x1c7765f1,0x7dce56e1),LL(0xcfdef637,0x3df3dfe4),LL(0x35b39936,0xa715e9e9),LL(0xffaca630,0x1011f820),LL(0x33f64da2,0x222d3bc6),LL(0xc5987552,0x523adab0),LL(0xc95736a8,0x787c715d),LL(0x058fef5b,0x66393c63),L_(0x0000012a), LL(0x97f6f489,0x5434ecf8),LL(0x891f4ace,0x7708ad40),LL(0x51c5f6bf,0xfe89ee25),LL(0xc377ca62,0xe6011a07),LL(0xd24cd2ea,0xd028c949),LL(0xc094a1a4,0xcf84ab99),LL(0x1fed19d9,0x036f7f03),LL(0x0551c154,0x37b50c32),L_(0x000001d4),
+},
+/* digit=41 base_pwr=2^205 */
+{
+ LL(0xf5fef4c6,0x8936aa0b),LL(0xb069d26c,0xd3718b4b),LL(0x2e3dd1d0,0xeaaab400),LL(0x26ebf3da,0x315a34c4),LL(0x04c67676,0x1eb5f386),LL(0x97e2eb1b,0xbc318051),LL(0x7226db1a,0xf5e17eb3),LL(0x109ad73d,0x97d098f5),L_(0x00000137), LL(0x82acea04,0x5982cf08),LL(0x48806f5a,0x5f09406b),LL(0xabd27505,0x4db94328),LL(0xb3c49a50,0x38e43c40),LL(0x08d386ec,0x582b99e6),LL(0x3b07fe47,0x9089cf44),LL(0x7186cac2,0xac474a1b),LL(0x22d982cf,0x7b0368d4),L_(0x000001aa),
+ LL(0x51b31a96,0xba6cb60e),LL(0xf6d82cb3,0x989499c2),LL(0xf86e04fd,0xcb66fb0c),LL(0x35487bb6,0x7e6257cf),LL(0xdbe642cb,0x7caa5a38),LL(0x0132dd97,0xcf0c7ff7),LL(0x9fe7cec8,0x8b24a15a),LL(0x54f2a9f9,0x52eb7ce9),L_(0x00000075), LL(0x42f8ae5a,0x47aec9e8),LL(0x766fc554,0xced0e96d),LL(0x99065768,0x493166bd),LL(0x2b9adad9,0x28be045e),LL(0x222a08c3,0xae70d305),LL(0x4f554727,0x61d8ec1d),LL(0xfed1873d,0x41e23d82),LL(0x9f1c46d5,0xf348b3f1),L_(0x0000002e),
+ LL(0x482e6f9e,0x82d58220),LL(0x488e8bdb,0xaabd7c77),LL(0xba1084c7,0x67c7272c),LL(0xca6ae765,0xab82a151),LL(0x1ca84a79,0xa826c75c),LL(0x06316ad0,0xf3c64348),LL(0x0dd7f329,0xde3d6a04),LL(0x3f33bd2d,0x689c3e45),L_(0x00000043), LL(0xe98af372,0x8c61be6e),LL(0xb8361cc4,0x624c3291),LL(0xb8a7b622,0x4c3e4e24),LL(0x3c10547d,0x37a21d5f),LL(0xfa09bfc9,0x407a153f),LL(0x54fa325a,0x5c7fa63d),LL(0x8d13bea7,0xfb7c45a4),LL(0x2fe1e55b,0x1a8b8531),L_(0x0000015a),
+ LL(0xa0b12ed6,0x0246d25c),LL(0xaf11f361,0x0ca563e7),LL(0xd246f5c0,0x3dbda22c),LL(0xc1f5f271,0x1517fe92),LL(0x5b82f357,0xae558aff),LL(0xc7e4811a,0xfe93852e),LL(0x0a7d7a0c,0x80c69efa),LL(0x5a9a571e,0xcf0c8dc8),L_(0x0000015e), LL(0x62ea61b3,0xfa629e03),LL(0x70463933,0x97e91195),LL(0x4d8bdb29,0x1670ff63),LL(0x3758d16c,0xac0e352c),LL(0xc3148942,0xebf5c218),LL(0x789d4077,0x68df9269),LL(0xedd91114,0xc949bb1e),LL(0x1c9e59bd,0xa97ced00),L_(0x00000094),
+ LL(0xab334809,0xa992abd6),LL(0xe820b690,0x598bc6c2),LL(0x5618c97b,0xdba62f4c),LL(0x4cfa34df,0x13d15fa5),LL(0xe73cd8e4,0xf2867cb6),LL(0x0a135ff7,0xc48f860e),LL(0x8e8f76ce,0xfdd988f5),LL(0x3ad07476,0xcb3a07b0),L_(0x0000009d), LL(0x9756e016,0x59630aad),LL(0xf07162de,0x6a1c1e29),LL(0x47eefc5f,0xd695eb4b),LL(0x69323852,0xf81fbfef),LL(0xeb840ba2,0xe9a13161),LL(0x99e6fb6f,0x82ed26e9),LL(0x0282e82e,0xe498cc70),LL(0x4b2c80ab,0x6264860e),L_(0x00000002),
+ LL(0xc9751c23,0x9f6dc20b),LL(0x5c25edfa,0x51ff9b10),LL(0x2267d84b,0x77cd497c),LL(0xecebc8bb,0xd41da61c),LL(0x2e90633d,0x0c2e11a1),LL(0x61552b8c,0xe7151d1b),LL(0xfb4a699d,0xa5898fdf),LL(0x74297e23,0x1a45323e),L_(0x000000f7), LL(0xcf0213ad,0xfe2e5183),LL(0xf83ccca0,0x0905c1e0),LL(0xc44aa9ba,0x0b1cf7ee),LL(0xfedaabc5,0xc2ab4a81),LL(0x7f856296,0xb2c2c3b9),LL(0x7c377576,0x110f594f),LL(0x248077d8,0x0920b595),LL(0x7dcc7073,0xa5e1a393),L_(0x000001a3),
+ LL(0x5b8dd11b,0x003d8cbe),LL(0xf2309e12,0x1dd14f55),LL(0x6aafea42,0xd6b6d08d),LL(0x9f501238,0xd63623cd),LL(0xe37ddae1,0x079b78ad),LL(0xc658ecac,0x62a7d933),LL(0xffca3243,0xf37ff209),LL(0xefd095aa,0x8e2c83df),L_(0x000000dd), LL(0x08483b62,0x5e0a6e24),LL(0x2d2f9a76,0x1a69b899),LL(0xe6914b5b,0xf621c0e1),LL(0x8472fe93,0xdd02cec9),LL(0x92c73abd,0x8f7b6745),LL(0x3d6f438d,0xeceedfc7),LL(0x290f69f2,0x98f33394),LL(0x0ed2ebb0,0x2536905b),L_(0x00000123),
+ LL(0x63653aa4,0x5e0e658f),LL(0xa4e263b1,0xb787e362),LL(0xf1a72f5c,0xade21c8a),LL(0x3468dd85,0x51d6c477),LL(0xd69f8f93,0x4ea4254f),LL(0xae15e0af,0xdb86c982),LL(0xdd836935,0x98d3a2d5),LL(0xdc232783,0x5ffb0769),L_(0x0000002c), LL(0xd27779d1,0x4c2ae6ec),LL(0x043db3d9,0x09230456),LL(0x73642e7c,0x6f9dd795),LL(0x2a8692df,0x2cd98576),LL(0xa83e7242,0x16ac0a49),LL(0xa2e9e20f,0xd3fe59cf),LL(0xd0093708,0x10a46920),LL(0x10c84d0b,0xa5bda12a),L_(0x0000015f),
+ LL(0xedf1bf7e,0x8efb0b81),LL(0x586ad55f,0x8d830110),LL(0xef747d77,0xb3bf603e),LL(0x0f99e447,0xb48e1874),LL(0x9da3060c,0x389d594d),LL(0x10ea78c4,0xc7644272),LL(0xd0f0eafb,0xaf1ebb75),LL(0x7afab007,0xcc569782),L_(0x00000154), LL(0x0ef592de,0xebfccb68),LL(0xf0400a4a,0x474a550e),LL(0x9ca24b23,0xbf9aef56),LL(0x5613d5ac,0xab9d9c2b),LL(0xb8267455,0xbf868bc0),LL(0xdb52868c,0x909956ec),LL(0x50005f46,0x49928d00),LL(0xac611000,0x904632ee),L_(0x00000162),
+ LL(0x8607bdea,0xe148f242),LL(0x2dd2babc,0xa0bb05f4),LL(0xd775106b,0xbff23d31),LL(0xf2919560,0xe97c018c),LL(0x44a63043,0x4871d249),LL(0x87f10683,0x189ec6a3),LL(0x0d74d0f1,0x257dbb86),LL(0xd0bbd041,0xcc6bf0e5),L_(0x000001b9), LL(0x94b22c9b,0xad1a6c62),LL(0x9dacf60b,0xde935e97),LL(0x77ba8de8,0x73dfb2df),LL(0xeb7f0da2,0x64121541),LL(0x18d0ee67,0x024e0b69),LL(0x7b37359f,0x84be521c),LL(0xea621f3f,0xcd285848),LL(0xf996c437,0x6391d449),L_(0x00000030),
+ LL(0xf3eb9640,0x6d04608b),LL(0x807ec468,0x80a83900),LL(0xb77f8649,0x5eb64b76),LL(0x07caea9c,0xc62e7f72),LL(0x0ec672b0,0x465c546e),LL(0x378afe4c,0x4b627b99),LL(0xcc8adc18,0x929649b3),LL(0x8be7d42e,0x967ccf92),L_(0x00000057), LL(0x7aaa87b5,0xa6efca22),LL(0x4f172127,0xf3a643dc),LL(0x9bf5975f,0x4fe72fa7),LL(0x90cb1c95,0x4c4df518),LL(0xba142ada,0x799862f3),LL(0xca2d035c,0x68d4ff7c),LL(0x98b9e83b,0x7d49b932),LL(0x13c2887b,0x21991bff),L_(0x00000051),
+ LL(0xecf8f1af,0x881d7401),LL(0x5a044cc4,0xe24e7a25),LL(0x768d2e23,0xfaed9fe1),LL(0x8f7705f4,0x383ba961),LL(0xd4a1b2c2,0x435ea5ef),LL(0xa2b9797e,0x3b37f12c),LL(0xe7f7c215,0xb091bf0d),LL(0xf2391054,0xb7ba542b),L_(0x0000004c), LL(0x7896f156,0x701310b7),LL(0x9eb25738,0x04099f3f),LL(0x6dcb2223,0x7798cb36),LL(0x4d56786a,0x95c47f22),LL(0x919da3c8,0xdaeee06f),LL(0xb6abb8e6,0xa660ceaa),LL(0xa641a64e,0xa1891535),LL(0xc989455e,0x627a7ec8),L_(0x0000019f),
+ LL(0x8abf9f25,0x834e7f6b),LL(0xa4f8a8ed,0x8d0ab54c),LL(0x7e835385,0x86915b58),LL(0x726730be,0xba996ac1),LL(0xe84c9776,0x0ac27d99),LL(0x59603bec,0xbcd0e3fb),LL(0xc7989ede,0x1f1942c9),LL(0xf303b7a8,0x9f4547f6),L_(0x000000e4), LL(0x681044e0,0x53ff8c21),LL(0x01ac096d,0xdb4b7aa1),LL(0x69d169b0,0x9723cdd3),LL(0x802b82f6,0x2051bc9d),LL(0x256afff2,0x3d4a1ea2),LL(0x321bcf00,0x7da3a724),LL(0x26d669c5,0x4ccffc5e),LL(0x72d30cad,0x212847aa),L_(0x000000bc),
+ LL(0x8217dbfd,0x7dca0317),LL(0xad5ed722,0xe8f1e786),LL(0x8f7b7ae7,0x30b8f677),LL(0x9bd08de3,0x03bfd2ff),LL(0x1955b540,0x599706c8),LL(0xfa5ccf69,0x66c7232f),LL(0xa98d3152,0xa531f734),LL(0x35d69728,0xa518ffd1),L_(0x000001dd), LL(0x28dfd590,0xc9f5e869),LL(0x5ce90640,0x7f70dba5),LL(0x4d6b1828,0xa187b391),LL(0x636739ff,0xc3f757a7),LL(0x6788a6b6,0xca8804a7),LL(0xc2a0400e,0x6dfa8acb),LL(0x499f91eb,0x8bd0499a),LL(0x28af9210,0x45056091),L_(0x000001ea),
+ LL(0xdd2aeb14,0x35af5ce4),LL(0x33f86de1,0x24f47c0f),LL(0x237c0920,0x0133d426),LL(0x76b14d92,0xdebe095d),LL(0x989c257d,0x7569cd5b),LL(0x8d5f30b4,0xeebd5dcb),LL(0x7daee4b5,0x381f623b),LL(0x5a27d2f9,0xc7fab47d),L_(0x000000c0), LL(0xb30042d8,0x87c8f748),LL(0x04d7a15d,0x0ac1e9b0),LL(0x96216dea,0xb1634ac6),LL(0x3c5fec65,0xf61cf904),LL(0xab711a92,0x3d592940),LL(0x9bf5392f,0x2eefb59a),LL(0x96b616e2,0x6a36ed7e),LL(0x5c5c3417,0xb15b4b78),L_(0x0000008c),
+ LL(0xfb9aeab3,0x109924ed),LL(0x46d2968a,0x9147a28a),LL(0xfe84ed7a,0x49744c91),LL(0x88e478aa,0xfd889651),LL(0x65a34f30,0x8dc8d99e),LL(0x21fd955c,0x740206f2),LL(0x7ea7cd99,0xdedce892),LL(0xd4f83ab9,0xa7c26d23),L_(0x000000e8), LL(0x2c8cb8bc,0x91728e18),LL(0x0fa5f320,0x3ad9d78b),LL(0x760a4e2a,0x65aca369),LL(0x6812b50f,0x46ee027e),LL(0xdb993f3d,0xe5a7e2b8),LL(0x2acac076,0x60290375),LL(0xa179054a,0xddbfa0d3),LL(0xf87bff0f,0xee0dfeef),L_(0x000000fe),
+},
+/* digit=42 base_pwr=2^210 */
+{
+ LL(0xbd161967,0xbda60a63),LL(0x090aae19,0xcb3f577f),LL(0xe7638c32,0xf59abf93),LL(0x34b2a6dd,0x35486136),LL(0x3c50db1d,0x91b5e651),LL(0x49476ec8,0xf4bbb5bd),LL(0x83b636d2,0x3dd95f7a),LL(0xd5071e3a,0x77c02f69),L_(0x000000f9), LL(0x9531d83c,0xc6860379),LL(0x9c9ad3cf,0x35f1eec4),LL(0x4e50cb96,0x26b39588),LL(0xd703ca9d,0x3bd6a0e5),LL(0x3fe9036f,0x08ef03a9),LL(0x605b0ecc,0x070faad2),LL(0x6abd3a9b,0xf3494eab),LL(0x7fa81977,0x164f95f6),L_(0x00000031),
+ LL(0x676b493c,0x57205d81),LL(0xe8f546e2,0x442871cf),LL(0x87afe8b6,0xd5e346c5),LL(0x748676ba,0xa964afa3),LL(0xca39baf4,0xe1422f71),LL(0x0e9e0a58,0xd62c328b),LL(0xd31cca18,0x07714d71),LL(0x75787f65,0x810168e3),L_(0x000001ad), LL(0xa1440c8d,0xb730f78a),LL(0x509d6354,0xec14ff7e),LL(0xbeae80e0,0x9793053f),LL(0x019f7cc0,0xb6b1fd1b),LL(0xe4fca025,0x44558d48),LL(0x7ed4a037,0x86992aae),LL(0x0e2db1c4,0xf0333757),LL(0x557f4b02,0x30117649),L_(0x000000f4),
+ LL(0x194c0cc8,0x23e0df8d),LL(0x58c8cbc9,0x1732c3e0),LL(0x3466783b,0xf47836e0),LL(0x4713b9a8,0x79e1d15c),LL(0xa517b03d,0xefa174a4),LL(0x63c15938,0x49e8d766),LL(0xea4a3245,0xd01d6313),LL(0xbc5db16f,0x83758c05),L_(0x00000196), LL(0x7797400c,0xbf271b78),LL(0x3af2e11a,0x60042746),LL(0xa3ab648d,0x79d1c019),LL(0x5000aba1,0x253b9712),LL(0xd9239c9e,0x0e930854),LL(0x85a1b532,0xab5ac676),LL(0xe00c287d,0x57eaaede),LL(0xe2d767a0,0x43b264bf),L_(0x00000180),
+ LL(0x2d438c77,0xd715e37a),LL(0x436c808c,0x8615d6bb),LL(0x78232591,0x58c6e6b2),LL(0xca6d68ce,0xa40e8f75),LL(0xc4c37875,0xc01da381),LL(0xbe962879,0x58a155d9),LL(0x5dd3d4cf,0x847d5de7),LL(0xee99fd85,0x8f7f76b4),L_(0x00000015), LL(0x4cec18db,0xd4c9f66a),LL(0x5302a76b,0x647086e4),LL(0x1b679cdf,0x93b84a7e),LL(0xd412c242,0x92243bc4),LL(0x519ccba0,0xd5c3c375),LL(0x585371f2,0x8ba3d06b),LL(0x90f4c0f2,0x1daa7685),LL(0xf573b409,0x6342e78b),L_(0x0000013c),
+ LL(0x0b8749aa,0xf1f9c0d3),LL(0xf2f4b2d5,0xbf3b998b),LL(0x6f543cfb,0x0d744317),LL(0x25e2b138,0xda23008b),LL(0xc81ea703,0xa6df5808),LL(0x322e0c8c,0xdabad20e),LL(0x654aa6ef,0x3a6c3719),LL(0x64c8d439,0xf75f2e54),L_(0x00000167), LL(0x90408e7d,0x50778fd6),LL(0xbd5f5197,0xcbe15e1b),LL(0x16df4a37,0x36cef226),LL(0xb2ae2273,0xfaaea71f),LL(0xb8561402,0x40dd546c),LL(0xed28c500,0xa3b837f1),LL(0xe3cde0fb,0x7315fb7b),LL(0x893aced1,0x828da346),L_(0x0000010b),
+ LL(0x9ff41dd8,0x136ca413),LL(0x7447323e,0xc3f1d660),LL(0xfd177667,0x0d79142a),LL(0xeab4ffc2,0x1d798fb8),LL(0x8d6c7790,0x65d4f135),LL(0x6db0f7cc,0x3bd9feb2),LL(0xeb9db217,0xf714d78c),LL(0x48ba0ac8,0xa3ca23a0),L_(0x000000ce), LL(0xb4e50378,0xe69b95fe),LL(0x3047872d,0x2f7264f0),LL(0x968482d0,0xedcd1afb),LL(0x4afd067b,0x21685d4f),LL(0xd2b0a788,0x8c222e50),LL(0xee57ad29,0x86dde86a),LL(0xb70520ec,0xb933bc16),LL(0x0ddb5005,0x16594b1c),L_(0x0000019c),
+ LL(0x2b0b1b51,0xbbca315f),LL(0x5bb1b6c3,0x0036d456),LL(0x7469a0dc,0xd48baaad),LL(0x017a26b6,0x27d8ab41),LL(0x02fa6e32,0x15045224),LL(0x0c7090d4,0xdb62af96),LL(0x85ab46be,0x89adad56),LL(0x45b4363b,0x449f71e2),L_(0x00000079), LL(0x96000d89,0xf8377adc),LL(0x4bc2c5ac,0xa5878a73),LL(0x58a681e7,0x18006b8a),LL(0x8426f06f,0xacb84fbb),LL(0xf862f722,0x32b8466b),LL(0x041f4d43,0xe59c6ec4),LL(0xac4fc1fd,0xda852fdc),LL(0xa52e3ee8,0xf6e11234),L_(0x00000176),
+ LL(0x9fca3c39,0x9ddcb7fa),LL(0x44679a2a,0x8069c471),LL(0x3be369b3,0x0de84dbc),LL(0x82ca8262,0xd5e1f28d),LL(0x89e87798,0xa205de89),LL(0x84051f10,0x5c22abac),LL(0xc26a5b9c,0x99bba5fa),LL(0xdd74ecbb,0x359fa6c2),L_(0x00000053), LL(0x82c210ab,0x2e2ac09a),LL(0x2ac08c57,0x71535b42),LL(0xc5c720e0,0xa7bd1c3d),LL(0x18f95966,0x0a4b0c9e),LL(0x49a62e3a,0x2faa6c64),LL(0x4f85595c,0x529cbdd4),LL(0x7bb9f75f,0x93955cf4),LL(0x50f46a64,0xdefa5af6),L_(0x00000022),
+ LL(0x1a200a95,0xedc6f59f),LL(0xa294c7f6,0xa2e1643a),LL(0x5eabc120,0x41a385d8),LL(0x0ff38f95,0x6b429a90),LL(0xa608b840,0x5f0ae2e2),LL(0xf1d02f3b,0x9b8946a7),LL(0x2525fc8f,0xc76a7386),LL(0x49cc1359,0xca2a7f4d),L_(0x0000010a), LL(0x8186c176,0xbe8aed8e),LL(0x60d4bdb6,0x86d41413),LL(0x937209e4,0x3c716d10),LL(0xf538d0a6,0xa096c4bf),LL(0xd3c035a2,0x04283ffd),LL(0xb280d9ae,0x4964e73c),LL(0x3893b1c0,0x75d67682),LL(0xc2768753,0x005e5f85),L_(0x00000022),
+ LL(0x364ca3fa,0x8d283446),LL(0x498b2996,0x86abf4d3),LL(0xfde09c12,0x2dfa3c50),LL(0x0e695616,0x29f9b0d2),LL(0xb697398e,0x48792e33),LL(0x568f5e3a,0x7493cab0),LL(0x6ee081c2,0x657411b7),LL(0xb996a914,0x6bba20f2),L_(0x000001c4), LL(0x21ec8a20,0xcc21ceb0),LL(0xf3a30195,0x04798bbc),LL(0x8327746a,0xa982d5b1),LL(0x2b585e77,0xd3a733ef),LL(0x8fc21ff1,0x683b1710),LL(0xf43ba5ab,0xca115f83),LL(0xeb98616c,0xa31d56f2),LL(0x89236402,0x2fd3f97b),L_(0x000001e5),
+ LL(0xfdd8cece,0x71daa8fc),LL(0xcd75aec1,0x1ba03e2e),LL(0x3c07bc51,0x57185304),LL(0xca3e327c,0xb1122c0c),LL(0xfb82f00a,0x4ab98ef9),LL(0x143ac664,0xed517312),LL(0xb67dba09,0x3be9088b),LL(0xf6425b41,0x9abf3748),L_(0x000001ad), LL(0xa0f7c32b,0x58516a7c),LL(0x937668fa,0x1a5b0042),LL(0xee40f983,0x70389a31),LL(0x7bddb2f1,0xc5b229d2),LL(0x5e0553f6,0x5a0d088b),LL(0xeae9e1a5,0xf99b1b9a),LL(0xcda92dcb,0x5ef8199d),LL(0x7e285536,0x50942301),L_(0x000000fb),
+ LL(0xe8acd015,0x276df335),LL(0x996f91a7,0xbba5b9b6),LL(0x8be8a5f6,0xa13311be),LL(0x1f26ef24,0xfe2a95d5),LL(0xee11bab7,0x684a38b4),LL(0x3233a4f7,0x2ff2caf9),LL(0x3771e476,0x50176c17),LL(0x5e24adb0,0x7e6a96ea),L_(0x0000009e), LL(0xcee15413,0xd1540fbe),LL(0x9f444fde,0xc5cef3f3),LL(0x6ce01534,0x25f5b460),LL(0x1d8a8861,0x37e2199b),LL(0xa77157b4,0xea994fb5),LL(0x599e6b65,0xa91dfcae),LL(0x599cf24d,0x48964c92),LL(0x5d9f0d72,0x171d2191),L_(0x000001ac),
+ LL(0xb07ac833,0xc7cc5161),LL(0x5e82226c,0x71009ee1),LL(0x4bc92633,0xa4a6f458),LL(0x4b11e8ce,0x27cf64fc),LL(0xa35c3f83,0x247f343b),LL(0x08c548d2,0x5b9231c1),LL(0x8238f13a,0x98e33dc3),LL(0xb0046a52,0x4e6220c7),L_(0x0000010d), LL(0x2464e468,0x60df1456),LL(0xc43a8ffe,0xb03d69e6),LL(0xf8867110,0x760c6b46),LL(0x1cbd5f52,0xbfe67f56),LL(0xee1342df,0xf514ecfe),LL(0x7fa3d377,0xeacf358c),LL(0xb7abe871,0xf91db13e),LL(0xf63ff9a1,0xfd2c6720),L_(0x00000118),
+ LL(0xbcc7e27c,0xfcd4da3a),LL(0x01aa7fce,0x5590f28d),LL(0x891c86bc,0x3fde019f),LL(0xc74e219a,0x47bfd522),LL(0x17dfc33e,0xcd902b91),LL(0x1e1f0327,0x19b7adb8),LL(0x46fb1987,0x4aa71b67),LL(0x7c133f73,0xc87d00cc),L_(0x0000009a), LL(0x24c3c4f4,0x15897652),LL(0x484cb85c,0x6d5a49dd),LL(0x08cbe8b3,0x0398f1d3),LL(0xc2570a5f,0xcf0588fd),LL(0x75aff023,0x9a086ca6),LL(0x7d708565,0xf0ab637b),LL(0x478e9220,0x4da37998),LL(0x79f64eda,0x9f09ba72),L_(0x00000129),
+ LL(0xf12325c2,0x3cf6f674),LL(0x4d0bf9f0,0xe45ebcfb),LL(0xf49cc75a,0xf02c0b22),LL(0x198a7df8,0xce88b254),LL(0x798e3ccc,0x452bc12b),LL(0xcb1f3272,0xf7e1eeab),LL(0x204a39c3,0x03001038),LL(0xbf6a035b,0x8bb9d05a),L_(0x00000106), LL(0xbee3c686,0x519b1e12),LL(0xff47d24d,0xecef22c6),LL(0x1e6f218f,0xb9743d3d),LL(0x7fe5e0b0,0x0de37bec),LL(0xb84cd289,0x2f608290),LL(0x640acc09,0x0325466e),LL(0xf1f489de,0x523a4381),LL(0x5a2fd923,0x78483089),L_(0x0000012b),
+ LL(0x55dde0b9,0x51ca4b89),LL(0x0c9b5cc2,0xcb500f85),LL(0xb99572d6,0xb82356c8),LL(0x9eef8952,0x575ebe20),LL(0x607df288,0x389253a4),LL(0xa421a6b3,0xd513ff9b),LL(0x99f0eb4d,0xc84b56b7),LL(0x253ed789,0xe6a5c4d4),L_(0x00000093), LL(0x0f18530f,0x98ff217c),LL(0x6930ae01,0x8abc5898),LL(0x12fd1e77,0x94fad4d8),LL(0xf2ff5095,0x6733dcce),LL(0xf10fab65,0x36afad83),LL(0x17d75c59,0xd99578f7),LL(0x8a1a313c,0x16027411),LL(0x0bcd7387,0x46078ec4),L_(0x00000154),
+},
+/* digit=43 base_pwr=2^215 */
+{
+ LL(0xcb23bf8a,0x011cfb71),LL(0x25479ac0,0x785ff67b),LL(0x2f48bcdb,0xc454fd25),LL(0xf62da267,0x4e460f65),LL(0xac759a15,0xe6fa21e0),LL(0xdb56d239,0xfa07770b),LL(0xb91d7cce,0xfe275a8d),LL(0x68f07f46,0xa1529273),L_(0x00000127), LL(0x74d64a14,0xd7969a0d),LL(0x36f066b2,0xd81a759c),LL(0x3a664061,0x929c3e1c),LL(0x5ba8c41d,0x033ad63b),LL(0xfdb5a8a4,0xf387b665),LL(0x2b433c84,0x1e742e2c),LL(0x4f2d4d93,0xb030d2de),LL(0x8d631141,0xe3845c24),L_(0x0000006d),
+ LL(0x020c1dd2,0x650c039d),LL(0xab7b6907,0xb4f64d44),LL(0x26b42700,0x0576d051),LL(0x2c72c1e2,0x70d2ad71),LL(0x4322ae9e,0x315f4631),LL(0x89904b57,0xef02dfb1),LL(0x24905a45,0x8a7b4701),LL(0xde26cce6,0x5f0db2ca),L_(0x000000ac), LL(0x55247780,0x3a42cd20),LL(0x6fcfeb99,0xee9920d8),LL(0x1cc7f2d2,0x46bdb299),LL(0xb71c2095,0x1516a6ea),LL(0x99e62c53,0x95f1492f),LL(0x197ae770,0xe95c2cf5),LL(0x013e12e8,0x2aad7be2),LL(0x60b78cb7,0x0e70b967),L_(0x00000032),
+ LL(0x5d9cf3d8,0x7b152b81),LL(0x2adc31d1,0x1cf4d989),LL(0xf817919d,0xea745ea9),LL(0x86caaaf3,0x035cfaca),LL(0xbd62e874,0x533bc33d),LL(0xb1acfb8f,0x2cc2ce8d),LL(0xb212b5b7,0x5b9ba7f0),LL(0x350192b7,0xce04c178),L_(0x000001a3), LL(0xdb4255a9,0x88563e49),LL(0xaa946b95,0xe4c90142),LL(0x0e515aee,0x5062c2f0),LL(0x99e87538,0xcd39192d),LL(0x52eb943e,0x0c893238),LL(0x0201b73c,0xfbac7e1c),LL(0x1ab36a78,0xc6d833b4),LL(0x58d01a7c,0xe359c01f),L_(0x00000008),
+ LL(0x97851e87,0x7511fae2),LL(0x9afd1135,0x428434f6),LL(0xab322fa2,0xcbe5e3de),LL(0xd89f361e,0xc1b08880),LL(0xc1fbd2b7,0x6a50aa80),LL(0x9e40537e,0x7fdf104d),LL(0xd4f51df5,0xe707164e),LL(0xb78a6cfb,0xd887e3d0),L_(0x00000136), LL(0x9a5983b8,0x96365e7f),LL(0x129d87d9,0x64aad3c6),LL(0x2952186a,0xf8224d3c),LL(0x45209284,0xc689c1d4),LL(0x2c194d7b,0x03f44aec),LL(0x0e7c6b2d,0xf18a57e0),LL(0xe28c9eb3,0xfac4981d),LL(0x4b8b7de6,0x55215906),L_(0x00000009),
+ LL(0x7754239c,0x3a3a13a5),LL(0xbeace249,0xc22b9755),LL(0xd063181b,0x27e6ebf5),LL(0x80b61753,0x0eb1c7f3),LL(0x8b95d0ba,0x791e9667),LL(0x5d4d0f0f,0x5f5189e4),LL(0xdd28c3e4,0x9162d716),LL(0x2eca4da1,0x40913d2a),L_(0x000001de), LL(0x21d602fa,0x85fea8d0),LL(0x3c004f10,0xa6620dad),LL(0xb3680a4e,0x31990981),LL(0x8a6964de,0x3b4c2f57),LL(0xd1986197,0x3b4fdf64),LL(0x5bc5cf00,0xea0f7010),LL(0xbf1dee68,0x0d263581),LL(0x3edd2000,0x8ba6db98),L_(0x00000012),
+ LL(0xc5f1e841,0x79147285),LL(0xbe273f4c,0x71c0654b),LL(0xec66bd4d,0xdd0505e9),LL(0xed4771b4,0x4c891619),LL(0x316ff12d,0x821a0542),LL(0x0c65ede4,0xa23cffae),LL(0xb678c0c5,0xbf05e02d),LL(0x32bbf48a,0x91ff4f9e),L_(0x00000126), LL(0xf495f39d,0x944ec586),LL(0x5c351b2d,0x00e74766),LL(0x3939c0c8,0xfe310474),LL(0xb780a9b2,0x5e63ba55),LL(0x11cfcec0,0xc11119c9),LL(0x322972c9,0x0c8e0043),LL(0x35f5ba3b,0xa0946bc2),LL(0x222b78da,0x622257dc),L_(0x00000082),
+ LL(0xba9d4a6b,0x2b9dae76),LL(0xe9b24e64,0x1b491ac4),LL(0x9716bae3,0x162c28a6),LL(0x192c7196,0x00752a8a),LL(0x10883cfa,0xf0af2cfc),LL(0x77a5388d,0x5f1ffb0c),LL(0xebf78534,0x49abf2a7),LL(0xe9343bc9,0x54bcef89),L_(0x00000090), LL(0xd39aabbd,0xa864f2a7),LL(0x1bdde3a5,0x0362ffa7),LL(0x45782cba,0x113c94f8),LL(0xb94efa60,0xb5969326),LL(0xd2b826b0,0x92ab6bc9),LL(0x228e2d7d,0x1f6dc09e),LL(0xe5f07f40,0x3371efd7),LL(0x87e6028d,0x90fcb8fa),L_(0x000001be),
+ LL(0x3b22c3be,0xcf53147b),LL(0x97a83e73,0x0fba4048),LL(0xd11d0f51,0xfcf9128e),LL(0x6dfde4ab,0x095c92d5),LL(0xbcfa2a47,0xff3cd334),LL(0xa5b6f4d4,0xa2490038),LL(0x5df73169,0x663bcbc9),LL(0x41aba80e,0xa47769e8),L_(0x00000064), LL(0x62c4cf6f,0x2104365a),LL(0xa582938f,0xc439a531),LL(0x43321e6d,0xf7387146),LL(0xee861253,0x52424fe3),LL(0x13590283,0x0a676302),LL(0xe71ab2ae,0xa837702f),LL(0xf460396c,0xf7bce515),LL(0x01882e04,0xd9362399),L_(0x00000193),
+ LL(0x1e3dd431,0x9bd2b2b9),LL(0xc33456a5,0x6dcdccc4),LL(0x97a89ed3,0x865bca41),LL(0xbdb83821,0xf50a59bc),LL(0x46a8f43a,0x47c10299),LL(0xbaa69204,0x03139274),LL(0x1da8242a,0xa899da5a),LL(0x49b0bcc8,0x2caf68d5),L_(0x000000a8), LL(0xb2c24e74,0x4dc88c23),LL(0xc1c2ff36,0x896e10e9),LL(0x10c6c1db,0x7a488fa2),LL(0x58161012,0x6b4ceefa),LL(0x5188acf7,0xea1e2f11),LL(0x72073c50,0xefaa1151),LL(0xe696e16a,0xd65f38a5),LL(0xe4dea3d4,0x6710e2d4),L_(0x00000011),
+ LL(0x84a8ceca,0x6cdc17de),LL(0x2c374c6c,0xe3454080),LL(0xbd6a5b20,0x337b0f58),LL(0x40246c40,0x31d7aff9),LL(0x49292d34,0x01dba6a8),LL(0x37486a26,0x41a0f90b),LL(0x12d61cbe,0x782067dc),LL(0x3033f828,0xebc39fcd),L_(0x00000086), LL(0x93cb68aa,0x026818da),LL(0xf42673be,0xf2e2739e),LL(0x40e906d3,0xd8ecf6f0),LL(0x37b0e1f1,0x5c024d38),LL(0x6708c065,0x3417cf59),LL(0xc5788208,0x17020946),LL(0x8942a103,0x7086a405),LL(0x279752bc,0xbd8d65b0),L_(0x00000074),
+ LL(0xd8f6e509,0x9abc3d40),LL(0xf756f14e,0x748874bf),LL(0xf9192ae1,0x50f7dc14),LL(0xfb847314,0x424a6e96),LL(0xd7141cc9,0xe0539e22),LL(0xefedb9cd,0x7f5ec1a8),LL(0x7abbcc13,0xe6446e18),LL(0x0050521f,0x3706445a),L_(0x000001d0), LL(0x4ed46ff1,0x2f62e709),LL(0xa5e744f0,0x8279d454),LL(0x8aad355f,0x03801f2d),LL(0x88a334e7,0x30342602),LL(0x34cb8228,0xed180e75),LL(0x6d4243df,0x5bbbe349),LL(0xd0752a72,0x0977e643),LL(0xd5658e43,0xf968b621),L_(0x000000a7),
+ LL(0x2137affe,0x3757bccc),LL(0xce9d3ef4,0xb10a83cd),LL(0x021aa7d7,0x804bf03e),LL(0x79a14071,0x09822fa4),LL(0x1adecf50,0xec4d2fe9),LL(0x8fc3b061,0x479fbad1),LL(0xffe82ea4,0xb70c5762),LL(0x25b0bed7,0x8a667da4),L_(0x0000015c), LL(0x574750b9,0xd836c22b),LL(0x9beeade4,0xd28e01a7),LL(0xd7c41634,0x124715f6),LL(0x83d30d7e,0x8e33c4f9),LL(0x2ee2bdb2,0x5442a068),LL(0xa18cfc1f,0x68390a48),LL(0xa6cb1637,0x44abd789),LL(0xa8ecc588,0xbd6682cb),L_(0x00000183),
+ LL(0xe26454b3,0xd8199c9b),LL(0x86b3c132,0x77f229f5),LL(0x1a49a2e0,0x6f74d75e),LL(0x15ed7662,0x8dd2368b),LL(0x7d799783,0x313152ab),LL(0xa636aa73,0x925319e7),LL(0x2947bd12,0xacf4c559),LL(0xb2b023d8,0x0322c16a),L_(0x000001d9), LL(0x6d2236bf,0x8a09b0a3),LL(0xb1025eae,0x8ae5f654),LL(0xf817133f,0x081d6d59),LL(0xea1aa5d9,0xe9090ae2),LL(0xe61c2d54,0x0784905d),LL(0xf542221b,0x5789e25c),LL(0xa9b09c19,0x1b8dadc2),LL(0x7d4f5221,0xabe01efb),L_(0x000000be),
+ LL(0xa224339b,0x8fc36944),LL(0x1a86a356,0x88a55222),LL(0xa9332303,0xfc1f186c),LL(0xf8c2ca0c,0x1f24d4d5),LL(0xa82a6905,0x753ac024),LL(0xb6761f2a,0x8a0fe4e0),LL(0xb4a03fa9,0xd1d20586),LL(0xcb862d5f,0x2bcb9949),L_(0x00000092), LL(0x50da47cc,0xa285574f),LL(0xb1192295,0x23eb5f8c),LL(0x2436f1d4,0x3f4febd2),LL(0x842f6ae2,0x0f1f266f),LL(0x8091b264,0xee94d349),LL(0xf4561f25,0x6f4a16f1),LL(0x6e303b52,0x80ed7ffc),LL(0x08bbc14e,0x6f957c19),L_(0x000001ac),
+ LL(0x34993096,0x73d10fa8),LL(0x1b164c81,0xc855b452),LL(0xdd4617a8,0x9be0c270),LL(0x94a57ba1,0xb28b6ed5),LL(0xc1383246,0xc74bc4a3),LL(0x17910967,0x2a2a0e34),LL(0x8aab9202,0x93b8d150),LL(0x122babf8,0x1dffa251),L_(0x00000073), LL(0xc68b787b,0x5fd7acd3),LL(0x906979fc,0xf242bd9e),LL(0xc7fe62d6,0x59507727),LL(0xa94a1beb,0x966af710),LL(0xe7344f5a,0xd397803f),LL(0x5b835cef,0xcd196fb1),LL(0x1ca9e8ac,0xe701eb7e),LL(0x09bdf0a9,0x521354ea),L_(0x000001c2),
+ LL(0xd206da83,0xc389a398),LL(0x92326c61,0xc80b1e6a),LL(0x0b658149,0x23067f4a),LL(0xd5cf4f64,0xc96735ae),LL(0x1cf4dd22,0x43cb53c3),LL(0x4b478ba1,0xb353c721),LL(0x3b1bbb1e,0x46f2e84d),LL(0x7b5aa79b,0x4a4fa3d6),L_(0x000001d4), LL(0xcf711e2d,0x5ad31f07),LL(0x5402e45d,0x19f0b31e),LL(0x55650578,0x214cdf81),LL(0x3fd50ebe,0x3efd8e06),LL(0xd808dee6,0x0c82d63a),LL(0x39ccec30,0x39dfd0ee),LL(0x5249be7d,0xb6c788e8),LL(0xebe9271a,0x7ffa3cad),L_(0x00000072),
+},
+/* digit=44 base_pwr=2^220 */
+{
+ LL(0xe3ee97b9,0xfd61361b),LL(0xf3125658,0xd69b66e1),LL(0x96b636a1,0x0c7ac9e9),LL(0xe69b9e47,0xf9bb3617),LL(0x1b1e895b,0x12050a8c),LL(0xfa5a11a5,0xa2492213),LL(0xc2919aff,0x08d55c3b),LL(0xc4be1b10,0x6dcf2c08),L_(0x00000192), LL(0xa93efc6a,0xb4fb57fd),LL(0x6ce4aac2,0x6292f827),LL(0x9277cab1,0xc90518a9),LL(0x144e677d,0x0432d015),LL(0xea4408ab,0x35d9214e),LL(0x49b20eb2,0x2560b8a6),LL(0x48a45d8a,0x37dd269b),LL(0xcecf7d1d,0x71a47616),L_(0x0000009d),
+ LL(0x189072b9,0xa734d86d),LL(0x475ac257,0x324330b9),LL(0x3a9d12f1,0xcecaa5dc),LL(0x048adf08,0x33641cc3),LL(0xbfcc4fdc,0xe40352a6),LL(0x76f01bad,0x6e93dac8),LL(0x5bd7dfb0,0xc0e1ca53),LL(0xb21d4494,0xb51965b8),L_(0x00000019), LL(0xe7f6998f,0x46f90e9b),LL(0x76cb857a,0x1b517407),LL(0x31907caf,0x38843e17),LL(0x37770400,0xb3c14ab5),LL(0xb47cfe14,0x58c99d12),LL(0xd18daa18,0xd4551590),LL(0x84db2817,0xc4d8f7ef),LL(0x5a8544bb,0x752b595c),L_(0x000000e1),
+ LL(0x3382876f,0xa8718c9c),LL(0xd016412e,0x3d459798),LL(0xc7059eeb,0x07afd251),LL(0x7f6e9107,0x6ae603f5),LL(0x7c29b336,0x1f1d424b),LL(0x1f08b6d1,0x06f8f459),LL(0xfa0b1884,0x6dfa46f4),LL(0x22a09ce4,0x1ee6193a),L_(0x0000013e), LL(0xcfd96283,0x59ef37aa),LL(0xbc282a7b,0x0490844a),LL(0x16eca5fb,0xfa414af6),LL(0xdd42a4a0,0x748c915e),LL(0x6f1ab810,0xa3d4af5a),LL(0x31ef86bb,0xe768aff3),LL(0xd8ffc35c,0xb6c4e536),LL(0x6e278d36,0x8f61ddd5),L_(0x00000023),
+ LL(0x1fe994f7,0x108204ec),LL(0x1febacf8,0x0a0c3a40),LL(0xa1fbe66e,0x2570b727),LL(0x343654b7,0x5299d8ae),LL(0x83e0647b,0x158b323a),LL(0x3d86ee0d,0x758534d1),LL(0xe946224b,0xcb77d0eb),LL(0xe9a38321,0xb845ec39),L_(0x000000a9), LL(0xcd07b3e0,0x4421327c),LL(0x13edfc50,0x0c4b9b9c),LL(0xefee69b8,0xce07a452),LL(0x110b9736,0x2779de28),LL(0x810433de,0x19cb506b),LL(0x1468d237,0xd2930983),LL(0xb54615ee,0x895d360f),LL(0xa6a72f30,0x2a939f9f),L_(0x00000082),
+ LL(0xbad2c784,0x613613a0),LL(0x41479bab,0x64b3ba28),LL(0xae853dfe,0xd7d5f8f3),LL(0xeddc5d69,0x3c023c98),LL(0xc2af1c91,0x5e51c064),LL(0x3e811beb,0x3e28caf2),LL(0x297f73a1,0xb2c63f7a),LL(0xe92c2db1,0x272783c6),L_(0x00000069), LL(0xc2b0e8b8,0x4d9e33e7),LL(0x2930859a,0xf96d2a6e),LL(0x21c82319,0x234b3a37),LL(0x99962855,0xe1e952c7),LL(0x834c3fcf,0xa9fff526),LL(0x2d66290a,0xc1aa8293),LL(0xd0618b6f,0x65d795be),LL(0xd8f51b17,0x7ad3a784),L_(0x000000fa),
+ LL(0x345605ef,0x6fb99ec5),LL(0x5b03ab3b,0xdf673d70),LL(0xd514df02,0x97926d51),LL(0x68bd9794,0x7f3cad99),LL(0xa7bbd732,0x807b8edf),LL(0x1dee6527,0x9072fc5c),LL(0x6db8f170,0x8a088d03),LL(0xfad430f3,0xf3373c9b),L_(0x0000019d), LL(0x6523f7ac,0x562932b2),LL(0x98ce826d,0x15d43a46),LL(0xd64992b9,0x0e1471fe),LL(0x12cf137e,0x11a1c256),LL(0x19907c68,0x97e5e746),LL(0x5dcff6a5,0xb4d10f45),LL(0xfe503afc,0x2daf8e96),LL(0xbfaf4738,0x51a1e9e2),L_(0x0000005e),
+ LL(0x52c7ebf5,0x57c899ed),LL(0x309ddc9f,0x000b8805),LL(0xf9ec0561,0x61be65ad),LL(0xdb755990,0xc6ac2e8b),LL(0xf8f392c7,0xc546a9f7),LL(0x709f90fb,0xaa4eb38f),LL(0xb81ee256,0xe3bb73d5),LL(0x920cd9ff,0xe54f7913),L_(0x000000d1), LL(0xecfeb4fd,0x6fe432ea),LL(0x7d99d437,0x42314efd),LL(0xecbf2570,0x0d11bf19),LL(0x1a26524d,0xc070e881),LL(0x80db7170,0x69bb46ac),LL(0xed697625,0x6e7f5dec),LL(0xf5d4f199,0x35c855b1),LL(0x63c6d1bc,0xcfaf131b),L_(0x0000017f),
+ LL(0xdff5e6d9,0x4c7faf89),LL(0xe289504c,0x7c67c701),LL(0xc21c143d,0x51104808),LL(0x429b8b10,0x8547ea3f),LL(0x643f8b1a,0x442d1597),LL(0x8e30463a,0x1322c20d),LL(0x9700b9ca,0x12313e31),LL(0x53c7c741,0x429e582d),L_(0x0000001d), LL(0xc25e3208,0xa6df174d),LL(0xf30a9c65,0x734a8421),LL(0xcca7bd70,0x12f441c1),LL(0x42e970e9,0xda35c856),LL(0x990f29b0,0x7fbc6108),LL(0x201a5ca8,0x006704f9),LL(0xb4ba5b8a,0xd79c4200),LL(0x5332f15d,0xaa2c5720),L_(0x000001dc),
+ LL(0x0f472f30,0xa1d7fa9f),LL(0x366d01e5,0x0b24e344),LL(0x05318d76,0x9ed7c092),LL(0xd4cb6907,0xdf8af7fc),LL(0xe97d11bc,0xcad57852),LL(0x4e593cff,0x966648ef),LL(0xeb5229ac,0x0513e9bd),LL(0xc0b6887d,0xc4457c4d),L_(0x00000129), LL(0x1a11be6c,0xe56e3c4a),LL(0x33909c43,0x6b6ecd98),LL(0xab630f3e,0x58c96e3b),LL(0x604359ea,0xa6fb1a48),LL(0x4c23bc41,0x01509a8e),LL(0x735b6fd3,0x55538a0d),LL(0xc1e6f88e,0xca10627f),LL(0x43b7d098,0x7a0bef75),L_(0x000001ab),
+ LL(0x009970af,0x382d4ce3),LL(0xd57fa9f7,0x39f2057e),LL(0x5a8fe9d0,0x819adb6c),LL(0xf4dd28c4,0x26c97625),LL(0xa0db7a3e,0x6c864ae6),LL(0x8bee872f,0xfd35c90d),LL(0x42a5de0c,0xf6b8c643),LL(0xa0d68766,0x613a35a1),L_(0x00000002), LL(0xcdee18cd,0x7201d2d4),LL(0xeb515a90,0xb3006a97),LL(0x293640a4,0xdf1363d1),LL(0x4e898435,0xc4282ef1),LL(0xf5eec35c,0xf5395189),LL(0xf9d8e87e,0xecf465a2),LL(0x621a8997,0x2d4680db),LL(0xfe197810,0xf2c35d16),L_(0x00000113),
+ LL(0xbfba8722,0x35c78619),LL(0x976fd128,0x4fea3432),LL(0x9d455cba,0x94c9bc3b),LL(0xb7bb73c4,0x0a3d4425),LL(0x90c2ec3a,0xc1f93e1c),LL(0xa95d87c6,0xe60757b3),LL(0x60d5d399,0xd3d27995),LL(0xce2c84d1,0x81c8808b),L_(0x00000126), LL(0xecc27275,0x32b7091e),LL(0x76361e05,0xe202d497),LL(0x074baca9,0xd7df203d),LL(0x18d9c96d,0x60965442),LL(0x6777a2e9,0xcf542875),LL(0xcea9162e,0xd6cf9057),LL(0x0e08540f,0x118843d2),LL(0x12ce0e32,0x64680618),L_(0x000000bb),
+ LL(0x4dba9d58,0x3de4c30b),LL(0x1640f2bb,0xe1cd2dab),LL(0x67a49e8e,0x68415129),LL(0xce1a4189,0x5f6655b9),LL(0xf8e55d14,0x58251e9d),LL(0x2a896a11,0x2990bcd1),LL(0x5ee2f029,0xc1b51e11),LL(0xe59128b6,0x7f1b211c),L_(0x000001e4), LL(0xedda1e14,0x0e4c3270),LL(0x75ae7bca,0x0ff0470f),LL(0xe26fb687,0xdde851ff),LL(0x6353acb2,0x661a72f5),LL(0xa014b448,0x6da88895),LL(0x20ab0fca,0x41dc7a9c),LL(0x90420ccc,0x97a7f272),LL(0xf726e07e,0x23c2dfa2),L_(0x000000ae),
+ LL(0x9697fa66,0x19987e83),LL(0xc4bea825,0xb4d6f37a),LL(0x86bba8ac,0x1e145dc1),LL(0xa3d3860d,0x9d377493),LL(0x538d1baa,0x9ce67c55),LL(0x507bf776,0x0148462a),LL(0x563563c0,0xc2891330),LL(0xba0e7843,0xc76b64b0),L_(0x000000b3), LL(0xac531f86,0xca889e53),LL(0x632d2ce5,0xe7e3d3fe),LL(0xeabe8bf3,0xb7126e82),LL(0xcc6bda06,0xf58c6361),LL(0x69480574,0x6a99c0d0),LL(0x660e6906,0xd1fdf14a),LL(0x465778f0,0xddbb43b6),LL(0xb843d29c,0x575fd92f),L_(0x000001cd),
+ LL(0x311db7b4,0x2cd4fd82),LL(0x0e9a73c7,0x52c71a96),LL(0x4d3a4557,0x067ccd35),LL(0x3e412b8b,0x7bd77ec2),LL(0x951e31d9,0x4100bac7),LL(0x2ac6482b,0xccccb053),LL(0x6361906b,0x79655211),LL(0x269a7fe0,0x756f8ab0),L_(0x000000fb), LL(0xad9f10f9,0x8ce6630b),LL(0xcbecac0c,0x4a29a7b7),LL(0xf7ba2d3b,0x47e9ba07),LL(0x2e6c073a,0x5aa6a94b),LL(0x73cf6f20,0xa8a42977),LL(0x50805433,0xf9945386),LL(0x74ac62ed,0xc8f04c45),LL(0x14e4baea,0xe37de45f),L_(0x000001c5),
+ LL(0x860bbc4f,0x73f77d7e),LL(0x6ff96082,0x58430006),LL(0x328b95a9,0x82931188),LL(0x968102c5,0xbb40cb55),LL(0x6514614a,0x370bf205),LL(0xe5de48d5,0xb3d94790),LL(0x73c104b4,0xa5683b4f),LL(0xfb96fb1a,0x36a9677e),L_(0x00000050), LL(0x0c67ecca,0x32bfd837),LL(0x4594f7a0,0x3fb584bb),LL(0x9be3e3c1,0xc86bb1e7),LL(0xef4aecee,0xfa93fc70),LL(0x9de5dfe2,0xbfd3b8de),LL(0xe7670296,0xe1fa5638),LL(0x228cc6d9,0xd230d44e),LL(0xf7797644,0x82d4c20c),L_(0x0000002c),
+ LL(0xef42daff,0xe19f88e8),LL(0x828b99d9,0xc2beefa3),LL(0x51fa512e,0xd33e3c3c),LL(0xbe14d684,0x34a6c37a),LL(0x5b5936ae,0x89d4bea5),LL(0x2802583c,0xd938e649),LL(0x98da605b,0x1f045420),LL(0x55288cfc,0x659c47e4),L_(0x000000d0), LL(0x046a68ec,0xb9ddaea5),LL(0x22472a49,0x0aefe3e4),LL(0xc2da9569,0x6e21cee3),LL(0x0c7dcef3,0xb14f0abf),LL(0x98c3c9ea,0xb64941e1),LL(0x4819eee0,0x433cfcf6),LL(0xbfe77fa8,0x2f7686dd),LL(0x03c3b28a,0xdbfd2334),L_(0x000001c3),
+},
+/* digit=45 base_pwr=2^225 */
+{
+ LL(0x522fbbd1,0xc3b7107c),LL(0xe8887082,0xd218cc42),LL(0xcd304c29,0x7a96d44b),LL(0xf1c4d847,0xee7f483f),LL(0x530d4bec,0xc951d19c),LL(0x4d6bf1fd,0x71d2d68d),LL(0xe03d009b,0x4d3bd1df),LL(0xc4553769,0xdb4cb1a2),L_(0x000001c3), LL(0xfa15f331,0x5e86f0e3),LL(0xcaf5fb4c,0x715c3388),LL(0xb2f14ba7,0x81191db4),LL(0x38426103,0xf68a08e3),LL(0xb75d25e0,0xd342059c),LL(0x92f767fc,0x4dec2bd2),LL(0x7a696b41,0x16057d6a),LL(0x8adfb670,0x99c277b1),L_(0x00000159),
+ LL(0x733860ad,0xd6f16b10),LL(0x088e20bf,0xb30d007e),LL(0x859fdd39,0xd4c40b6e),LL(0xc9196072,0x0a59d2a4),LL(0x3c4f607d,0xaf5b531a),LL(0x5c546c30,0xfdc40588),LL(0xdc1d5df2,0x2971b1ad),LL(0xfb26f4df,0x7cb15104),L_(0x000001b6), LL(0xd17eec91,0x9ff74646),LL(0xe3bee8f3,0x96143e3d),LL(0x560fc63e,0x2e0395d9),LL(0xfd9d7aab,0x099cc808),LL(0x422f153f,0x4e3c3dca),LL(0xefabb0d7,0xed2c2c61),LL(0xd736943a,0x78f87c18),LL(0x96d74e41,0xb76afadf),L_(0x000001d1),
+ LL(0x6c4ef83b,0x204ae17c),LL(0xab5b4b2b,0x780e0409),LL(0xc4c863d0,0xf73d00d9),LL(0xd243a003,0xd17b97ed),LL(0xca6e6ef7,0xd335ec2e),LL(0x3f246d97,0xd6c07def),LL(0x0e2518ce,0xb8b0595f),LL(0xfdf728fd,0xc1ccb10b),L_(0x000000dc), LL(0xd02f5048,0x869f012d),LL(0x0a767d8e,0xbe6fa9d5),LL(0x1bbb0510,0xdeeebbfe),LL(0x8f4cdab7,0x8332cdf9),LL(0x75d651f0,0x54687821),LL(0xdd0fc83f,0xa428610a),LL(0x965277af,0x38635dc4),LL(0x9dff5c34,0x0961df5b),L_(0x000001fc),
+ LL(0xeb6cb2dd,0xe4290556),LL(0xea12a072,0x762385fe),LL(0xd082bac9,0x1be16424),LL(0x8697c433,0xf06c7a59),LL(0xa812dd21,0x7de72b68),LL(0x02f90069,0xa2e56525),LL(0x9acaec02,0xa89c7efd),LL(0x4f9120c4,0xdf713a32),L_(0x0000001b), LL(0x1027a34d,0x3367220e),LL(0xc9641453,0x9b048cab),LL(0x29a9fac9,0x0e9e757a),LL(0xcb21c285,0xde9cc170),LL(0xbef96957,0x7d017c03),LL(0x0f3534a3,0xa9c18cbf),LL(0x5a627fd6,0xed78ac58),LL(0xb9c29da8,0xef092aca),L_(0x000000e4),
+ LL(0x27ba92a3,0x1cb1ec3d),LL(0x669f05f8,0x03d201d9),LL(0x6bb4d70b,0x898f998e),LL(0x96c9a0f0,0xe22c0440),LL(0xfa56577c,0x7b9dee1b),LL(0x00502b66,0x47777bc8),LL(0x483cf935,0xffb71b74),LL(0x0b52d0b2,0x39112d39),L_(0x000000a7), LL(0x6e9174c3,0x75c45aee),LL(0x6b3c757b,0xf1bef81e),LL(0x7e3d1f7a,0x21a74b7e),LL(0x2bfe9dfd,0xb0da2bc4),LL(0x90c8361c,0x0c5783ca),LL(0xf50913fe,0x5dd47036),LL(0x34045f12,0xd0f87837),LL(0x89dc259f,0x560578ab),L_(0x000001bd),
+ LL(0xdd7b63bd,0x1a521d30),LL(0x8270aad1,0xd7dd0f9e),LL(0x5bd17ae9,0x2341942e),LL(0xc840cb6d,0xdc090118),LL(0x1c49ccd4,0x60e02fa4),LL(0x28d04bf0,0x3570b020),LL(0x1dc79e5a,0xbd1e244b),LL(0x5f5e1042,0xeebf73ef),L_(0x00000024), LL(0xa728463d,0x9d82fe22),LL(0xf2a4d116,0xfbb0437b),LL(0x538ffa89,0xac67b2fd),LL(0x70b0e36d,0xcd72f925),LL(0x3b843326,0x26042e6e),LL(0xd58ef907,0xa54711c2),LL(0x40c00366,0xa62c4885),LL(0x33e0a1f1,0x758c2c5e),L_(0x000001ec),
+ LL(0x49abc1ac,0xf11f835f),LL(0xd4f6e5fa,0x4a99daab),LL(0xbfa7d98f,0x3f46a163),LL(0xe712c72d,0x869f8036),LL(0x194ee078,0x1283d5ab),LL(0xe9c40094,0xf4b53cf8),LL(0x8eccbfb3,0x865de4fb),LL(0x27d82426,0xc4399d77),L_(0x0000011a), LL(0xc3188564,0xa59eaa03),LL(0xb1a23e95,0x99d72c23),LL(0x48055f02,0xf5f1e1c0),LL(0x04a35336,0x448cee4d),LL(0xcb7b9a8c,0x5862f10a),LL(0xb9974831,0x93b3f7d9),LL(0x93c6f79e,0xb09c629c),LL(0x2a3760fa,0x5d47957f),L_(0x00000001),
+ LL(0x1bb374f7,0xf060edf1),LL(0x83a0baf3,0x26de7078),LL(0xeb8cb2a3,0xf5a8d631),LL(0xcfa95554,0x6ba14fb5),LL(0x9d950c23,0xc53769e2),LL(0xc3b6e6d4,0x857d43ea),LL(0x00e396b6,0x28cc2c64),LL(0x79b3b40a,0x42ca52de),L_(0x00000101), LL(0x744d95ae,0x4e536d43),LL(0xbb696fec,0x60fe980d),LL(0x86879c73,0x6a564e15),LL(0x6796d473,0x62e7ce9d),LL(0xee75c812,0xd4cced89),LL(0xdd4f732c,0xa3a75fe2),LL(0x4a4d97d2,0x62def6c0),LL(0xfce046cc,0x0bfe781a),L_(0x00000059),
+ LL(0x46604a6b,0xecebff30),LL(0x5ddecacd,0x66805c77),LL(0xc732fa10,0x62e2a037),LL(0x9f8318aa,0xf535306d),LL(0xcb188ede,0xf3ae9b72),LL(0xd4215242,0x76515ea4),LL(0x19ee9251,0x04b30ff0),LL(0xfdb4add0,0xc2006bc5),L_(0x000001f3), LL(0x3b010d29,0x08f431a5),LL(0x9a41c273,0x4ef9856a),LL(0x29336f92,0x89a37aaf),LL(0xb4f719c9,0xb6ae5b4c),LL(0xcb8b83d7,0x0b93351c),LL(0x579d32e9,0x95ac6c1d),LL(0xed14de1a,0xc9a3144d),LL(0x59d39bac,0x4809d3c0),L_(0x00000192),
+ LL(0xb4a2a13e,0x46b4f926),LL(0x31967f76,0xedbec7a4),LL(0x9540a500,0x7d4cba0a),LL(0x3664934a,0x44eee05e),LL(0xacaf15ab,0x7e273dff),LL(0x0d40978b,0xb55d54b7),LL(0x7a7b2c2d,0xb2400231),LL(0xcc267a21,0x31dec63e),L_(0x00000134), LL(0x05754bc0,0x9ea998cb),LL(0x5e543e59,0x22a0befc),LL(0x0dee7b14,0x1aa7e66e),LL(0x052bb589,0x51c3c220),LL(0xe7133b54,0x64b84789),LL(0x86fee1bb,0xacd3a9a6),LL(0x6d321f88,0xf3dee610),LL(0x17435c7d,0x64e0790f),L_(0x00000193),
+ LL(0xfde9e64e,0x824c77d2),LL(0x1d5087de,0x3c424cb9),LL(0xce8e9c97,0xb3b1c7ef),LL(0x65ef8961,0x36bdf7df),LL(0x936db078,0xe1a9152e),LL(0x9ff36717,0xbde711fb),LL(0x1b59074d,0xc2a17a75),LL(0x9070200e,0xa0657ad1),L_(0x0000006b), LL(0xc32bca7d,0xf471b9b4),LL(0x63dca49d,0x23fe450a),LL(0x7aa88a47,0x569744e7),LL(0xbac5c025,0x557519ba),LL(0xc31b16cd,0x90672c5b),LL(0x7609de28,0xeb879e6d),LL(0x06a4f8d7,0xa50f3b9e),LL(0x45a7792d,0x5ef4893d),L_(0x00000138),
+ LL(0xa91734a3,0xa8c609cd),LL(0x3fc0a251,0xe916d838),LL(0x09bae516,0xdc8442b3),LL(0x70eda9b4,0xdbbd2829),LL(0xe66c09a8,0x44077102),LL(0x46f0d061,0x0c8b9a97),LL(0xe7c4e4e6,0x96dd9b50),LL(0xd93b4696,0xf2abcbd4),L_(0x00000050), LL(0x1b9aac0c,0xdcc67ed7),LL(0x34c98a81,0x1a864f2a),LL(0xd79eca11,0x46960243),LL(0xaf4ad720,0x02db8ea4),LL(0xe8d429d1,0xd9dae172),LL(0x9cac2c01,0xf704ba3a),LL(0x052267c9,0x0ee381b0),LL(0x768c8223,0xf95050b5),L_(0x0000019f),
+ LL(0x12097ddc,0xdbee340c),LL(0x7596d517,0x7a4d90d8),LL(0xe88332d5,0x27312835),LL(0xadc174b8,0xbf7deda3),LL(0x9fa8589b,0x30a04404),LL(0x50ccb83e,0x9ea9cbf7),LL(0xb73afec5,0x8a699ab5),LL(0x0382ff44,0x682b0e1c),L_(0x000001a1), LL(0xd2f8a7c3,0xa48bc771),LL(0x219fed54,0x20bed549),LL(0xd7a8f53a,0x9f897a30),LL(0xccad31ab,0xf4ab61be),LL(0xe4253812,0xd02eb63b),LL(0x02c0bd98,0xf369795f),LL(0x940fa395,0x6661d80d),LL(0x4fc30a92,0xdb54dfb5),L_(0x00000052),
+ LL(0xa8b475dc,0x7f4fad25),LL(0x917eadce,0x33c5c41f),LL(0xfac932b3,0x8175e0ba),LL(0x0c6ce437,0xd6df4caa),LL(0x628f6bd2,0xd8cef71f),LL(0xbbd0808b,0x1bf4e3d8),LL(0x82a3b927,0xf2573f56),LL(0x18b7f7d3,0x20a5d5d4),L_(0x0000013b), LL(0x23ee963f,0x6296df1a),LL(0x511300a6,0x48f698fe),LL(0x0a451118,0xe69d9b6b),LL(0xbda90f27,0x6b99560f),LL(0x00ad6b22,0x576639a4),LL(0x70498a28,0xe3fb0685),LL(0x766cc9eb,0x910ed9d6),LL(0xa13d4e5f,0x45079f4a),L_(0x0000016f),
+ LL(0xfcc87b80,0xb3a0df18),LL(0xcdee46b0,0x0f7b0b8f),LL(0x0dee6d65,0xdc8df7a6),LL(0xca19127a,0x6d034f50),LL(0xd6d74c77,0xcd8b7301),LL(0xd01a93fc,0x7b8e12a8),LL(0x77799926,0xc0b3bdfe),LL(0x157d532e,0x5444b9cf),L_(0x000000d1), LL(0xe1636c3d,0x2776ac60),LL(0xbab425f8,0x947e525b),LL(0x66085567,0x6d095956),LL(0xbcb7adb8,0x4d3075ac),LL(0x99a0d6ce,0xc684b9ba),LL(0x0e134c5c,0x4c65fec0),LL(0x30477674,0x5db48af9),LL(0xf3744581,0xfcc9963e),L_(0x0000004c),
+ LL(0x3d53729d,0xb51e39da),LL(0x258dcf68,0x1c50cc68),LL(0xb1289a02,0x54112229),LL(0x48928ef6,0xc73b83c7),LL(0xf0df33f4,0x6a0ebdbd),LL(0x5f166393,0x09883324),LL(0xbdfac3bf,0x21bceec6),LL(0x871bcc9c,0x64a15de9),L_(0x000001cb), LL(0xcba002c5,0x7efb2f27),LL(0xce8d66f9,0x6a48e2f0),LL(0xc4f49e10,0x0d05177f),LL(0x04e720d6,0x9e354273),LL(0x746f841b,0xe08c355b),LL(0x7b7b7cd5,0x81226157),LL(0x586eb9a8,0x38ce3838),LL(0x8c03b21c,0x02872c5a),L_(0x000000ec),
+},
+/* digit=46 base_pwr=2^230 */
+{
+ LL(0x7f032bde,0x8a4b6723),LL(0xa08c6852,0x79a5b3fd),LL(0xc7195714,0xd8054fed),LL(0x7c611c75,0x503c3580),LL(0xe88e5dbf,0xb37b9ea9),LL(0x2b4c4521,0x75f1c942),LL(0x950eb17e,0x79508472),LL(0x238eca42,0x845c91f9),L_(0x0000000f), LL(0xa8c10103,0xa0c1e80e),LL(0x978ae396,0x14b242e1),LL(0x2c0d00f9,0xb47bf7bf),LL(0xe944e43f,0xb416e50a),LL(0x906c3634,0xe7c8d114),LL(0x347f03a3,0x65b00ad0),LL(0xa6eba251,0x53a14e26),LL(0xf521e9dc,0x11eb83f4),L_(0x00000169),
+ LL(0x9d3bde43,0xcf0b0ab2),LL(0x1ea0d8e5,0x30d499c7),LL(0x4b6204df,0x8f748b9e),LL(0xc4dd3f54,0xba95c754),LL(0xc443876e,0xd7ad6cc9),LL(0x08e10896,0x544e9e2d),LL(0xa9428b4a,0x1a2d3e1e),LL(0xb6fe7189,0x05c7660e),L_(0x000000b9), LL(0x41251790,0xb366e641),LL(0x77106f8f,0x42b36e28),LL(0x2d9d82f5,0x63743c2e),LL(0xaf2b4eca,0xc887146a),LL(0xb28d08cf,0x4ed669e0),LL(0xc7391371,0xda28c885),LL(0x14ee1f56,0x84424da9),LL(0x42d4479d,0x33646227),L_(0x0000015e),
+ LL(0x23998889,0x12e89265),LL(0x1eeb47d8,0xcbb7e582),LL(0x5b702942,0x0f041cf4),LL(0x64d44f59,0x50d39295),LL(0x5d20f47c,0x0a8b51ba),LL(0x15a076aa,0x79ae768a),LL(0xa2141ba3,0xcf638bb5),LL(0xe3c47d36,0x582394d5),L_(0x0000019a), LL(0x1e394199,0xde6f722f),LL(0x7bcb9faa,0xc544456b),LL(0x7edbbe33,0xc58f127c),LL(0x178e1289,0xcd6856a6),LL(0x29c72942,0x7d0ce889),LL(0xdca59772,0x951589f5),LL(0x6908ef3f,0x4f00ce63),LL(0x110a84b5,0xc1a89443),L_(0x00000018),
+ LL(0xedea6906,0x1fbd25b5),LL(0xc3abc5bd,0xa3138347),LL(0x78a11d29,0xf2283223),LL(0xadac6d62,0x4af4ece3),LL(0x72b0dc7b,0xf1c75e43),LL(0xa7308e28,0x99139560),LL(0x0ea7127d,0x9cb3c31d),LL(0xee0172da,0xc69386a7),L_(0x00000036), LL(0xcae0b566,0x293be2a2),LL(0x82933139,0xaf8d3077),LL(0x41cdee07,0x4118b415),LL(0xd6d0895f,0xb3a9502a),LL(0x242767b9,0x404e1d44),LL(0x3924f383,0xe7a91a84),LL(0x3c5c40dc,0x0f30db5a),LL(0x2d443e9e,0x38df60b6),L_(0x00000053),
+ LL(0x06beb164,0x57eacd01),LL(0x8b237781,0x47bc0a58),LL(0x21bf6b08,0x72f947bb),LL(0x5c6b0c6d,0x0c58bea7),LL(0xc78326d2,0x8a6feb8c),LL(0xf3157ca1,0xe147ad97),LL(0x4be255e4,0xa6917b35),LL(0x7006cd50,0x1ceacc56),L_(0x000000eb), LL(0xce77913f,0xc4957a8d),LL(0x5e969282,0x3e3eb59d),LL(0x1216fdc0,0x2f2b0b06),LL(0x51a13162,0x5b88e211),LL(0xff4a6d02,0x6b68e6ae),LL(0xc7c80a3f,0xa7fca940),LL(0x2128145a,0x3a205f85),LL(0x459b75e6,0x48874b7e),L_(0x00000189),
+ LL(0xb951af1f,0xf1c2d135),LL(0x363e7de4,0xede249f0),LL(0x2374169d,0x92b91c52),LL(0x34ca05e7,0x42f9c460),LL(0xe96d13d2,0xb8dc141b),LL(0x9c04a0eb,0x11349888),LL(0x86f45f6f,0xa3c9d21f),LL(0x34d9dd7d,0x6359abc3),L_(0x000000ae), LL(0xd4c46ca9,0x906d8bdb),LL(0x82617ad1,0x5f4fb81e),LL(0xd70d26c6,0x68367c91),LL(0xe835f648,0x4d712331),LL(0x5dda13b7,0x06ca4385),LL(0x97f662ae,0xcbeb485a),LL(0x211b18b3,0xfe5f6ad4),LL(0x178f31f1,0xbfc76ef2),L_(0x000001e4),
+ LL(0x1da9f06e,0xab40e045),LL(0xcdbdf2d4,0xbc7f59a3),LL(0x25655817,0x7d6adfae),LL(0x5b05af23,0x3b9e8819),LL(0x1f7f265d,0x4d41011d),LL(0xa02a10b1,0xc4403b75),LL(0x4598d47a,0x21678b80),LL(0x72bcfd2d,0x0a91ddc2),L_(0x0000001a), LL(0x8f87df0f,0x5f9a8c36),LL(0x38d6c310,0x22226823),LL(0x4b065228,0xdf4b4ac7),LL(0x99e6867b,0x1562f4fb),LL(0xc9c2e12f,0xe5bf9e6b),LL(0xef6dd2fe,0xa02f573e),LL(0x99a366b2,0xf15b202c),LL(0x46de40b9,0x8fa6fe0d),L_(0x00000076),
+ LL(0x070b39a4,0x95d88264),LL(0x5a265bdb,0x771ed60f),LL(0x717063ef,0x0dd813de),LL(0xd974ca00,0x4d348196),LL(0x9d26915a,0x3def1612),LL(0xfcdfb352,0x1ecabcbb),LL(0x7290d698,0x44e08c75),LL(0x5c0c5d24,0x65a063c6),L_(0x0000011c), LL(0xc9b7cd37,0x751941d0),LL(0xa5845e0e,0x90c04cc0),LL(0xc51c09cc,0xf11f3a2b),LL(0x536ce8af,0x3944ca09),LL(0xd614a230,0xe5cb9d10),LL(0x4cf73a00,0x11f36267),LL(0x39b52629,0xe681d436),LL(0x27379f49,0x7634bb09),L_(0x000000a0),
+ LL(0x83402336,0x3b3162c4),LL(0xf5ba50b2,0x27a53ca3),LL(0x5b2f88a0,0x4d9f7313),LL(0xff015375,0x4100d075),LL(0xefc66c49,0xaa939a6b),LL(0x25334ce7,0x4d836d2e),LL(0x0ff09c49,0x9aa3f59b),LL(0xce13f150,0x6bd297a9),L_(0x000001e2), LL(0x138230ce,0x3c8984bd),LL(0x8be1ce28,0x7a30734a),LL(0x83fbedb8,0x56e66999),LL(0xc37e9e22,0xeb69a4db),LL(0x8b3de542,0x15192947),LL(0x4a7280d3,0x67515315),LL(0x5c05b359,0x0b9a8604),LL(0x5ec92a80,0x973deb80),L_(0x00000068),
+ LL(0xa6ca6db6,0x1256d99a),LL(0xa13ac401,0x9e017800),LL(0xed3810cb,0x84b7702c),LL(0xb6d9eff1,0xcdc98f94),LL(0xf4a42e06,0xa3cf6c58),LL(0x658f00c3,0x17b79fe0),LL(0x4db4bd0a,0xc0cd6ebd),LL(0x79f4a662,0xb6716eec),L_(0x00000069), LL(0x3c927a1c,0x6f9c5845),LL(0x5d9256ec,0x540f768a),LL(0xe910b5c3,0x4e7e7b8d),LL(0x3c907d51,0xf387c3d5),LL(0xeecfe723,0x213d5d27),LL(0xd78500a0,0xaa244815),LL(0xb117a5b8,0x7049f488),LL(0xfb72f9ed,0x3651c83c),L_(0x000000bb),
+ LL(0x33e7dea5,0xed918816),LL(0x14555dbb,0x178d8d22),LL(0x4a72d14b,0x1ebffe3d),LL(0xa3a172eb,0x476c82fd),LL(0x4c45f724,0x700c837a),LL(0xd80825d0,0x16888e37),LL(0x104ac32f,0xfaf93105),LL(0xed3ecf8b,0x503fb78e),L_(0x000001b3), LL(0x030d3211,0x3c014136),LL(0x4a1d6c14,0x3ae0a56f),LL(0xa38d42d7,0x765e846a),LL(0xdc241d4a,0x087fcd52),LL(0x0a7a4e2e,0xf088c4c3),LL(0x81043b53,0x0b74dc81),LL(0x030c4d6d,0xf465c63a),LL(0xb63f1e30,0xa7aa0a71),L_(0x0000018f),
+ LL(0x77408152,0xe2aea3b4),LL(0x22e76e20,0x6eca1ede),LL(0x7e03afde,0x08d1c44e),LL(0x4edf70d6,0x88d58544),LL(0xd8ec390b,0x474d298c),LL(0xc4c3f675,0x9ce21146),LL(0x3274110e,0xb12ae7e7),LL(0xce9cf1f4,0x67e9f4b4),L_(0x000000fa), LL(0x8bf7948c,0x102ef931),LL(0x3efdaff6,0x7a8b94cb),LL(0x59bd3104,0x4b8b1235),LL(0x25afad7c,0x24884827),LL(0xdd939da0,0x43b462ba),LL(0x45cb99ab,0x6a4b9f89),LL(0x0f6b65c6,0xbddb4b1c),LL(0x39e97dd0,0x5a1f7976),L_(0x000001d7),
+ LL(0x4ee368e9,0xcf01fbe1),LL(0xc5bd929e,0x47c26018),LL(0x2bbeb492,0x050e6a5c),LL(0x04741b6f,0x0f665d42),LL(0x4c0e1ab0,0x15137e0c),LL(0x3ee524ae,0x88980ffb),LL(0x86e225d0,0xa5de3190),LL(0xde9d18c0,0xe6bcf986),L_(0x000000db), LL(0xe5ef1407,0xc1e09545),LL(0xa8ab4958,0x7b416dfc),LL(0x05e9411d,0xb5a5de50),LL(0x916238cc,0x7da6c853),LL(0x0e933ce2,0xcff26d33),LL(0x7fab03f6,0xc2410d1b),LL(0x70a12092,0x130ded07),LL(0xa7ff89e1,0xf34872a0),L_(0x000000ea),
+ LL(0x7391f663,0x6107960e),LL(0x08dca3fc,0x9f978b8d),LL(0x2367f8bf,0x41ab4ac8),LL(0xbfb304bc,0xc14127da),LL(0xb2161643,0x89ee83de),LL(0x91433f74,0x76ad8bee),LL(0x3abcb595,0xa74d6d8b),LL(0xa8b1935f,0x314e698a),L_(0x0000001e), LL(0xee0dcf96,0xbd5f1508),LL(0x1fda31cb,0x4401991d),LL(0x67b33d1f,0x5dcaee66),LL(0x80ef50d3,0x58f1d026),LL(0xc6160acf,0x00a13e57),LL(0x3be539f3,0x88dd96e9),LL(0xa5a0a5ae,0x97419f0c),LL(0xcf6a8f10,0x44b2ca4c),L_(0x00000018),
+ LL(0x02cd85a8,0x5c77a891),LL(0x745da1cc,0xa4b913df),LL(0xa1006271,0xec1779e4),LL(0xb3fe3fca,0xcceebf8a),LL(0x7b0d3f86,0x82fd16d4),LL(0xeb20fdbf,0x4e29270b),LL(0x450edccc,0xa783c064),LL(0x2c637dd3,0x7337d5ce),L_(0x000000ee), LL(0x94d66859,0x819b276f),LL(0x71e05cf6,0x45bd1439),LL(0x748c488f,0x280a8add),LL(0xbb099ca8,0xe8e6e69d),LL(0x19429d88,0x4f4c80b6),LL(0x2d2698e8,0x0e4ab44b),LL(0x1eb3fc49,0xcd46fe76),LL(0x02d1a2ca,0x15543eb8),L_(0x00000116),
+ LL(0xa9d0f944,0x700ec0ac),LL(0x13ee9845,0xe55b42fb),LL(0xe5ad047b,0x45bc6993),LL(0xe8f73a08,0xee41f2ae),LL(0x1ac680ff,0xd3c83204),LL(0x740b12fc,0x5e36bb4a),LL(0x21ebc164,0x35a45c95),LL(0xb8dfcc77,0x92b0fbda),L_(0x000000ef), LL(0xe45e0eb2,0xb5805ed4),LL(0x829d754d,0x6c810584),LL(0x36cc488a,0xc9632468),LL(0x39f60f1e,0xf2ebc30d),LL(0x390502c0,0xde960758),LL(0x6d1feec9,0x63adf462),LL(0xf944bca3,0xdeea2824),LL(0x9c375dbf,0xa887d095),L_(0x0000010b),
+},
+/* digit=47 base_pwr=2^235 */
+{
+ LL(0xe3366deb,0x2fcf8b0a),LL(0x07415442,0xe5dadc06),LL(0x07a17d21,0xc237ee85),LL(0x83c01e78,0x08f5fd21),LL(0xada49ad1,0x998eec2d),LL(0x3e35f765,0x5a121c30),LL(0x1f207544,0xf5fdddb9),LL(0x537426d8,0x1dd7a92c),L_(0x000000af), LL(0xf6589369,0x9ac31da2),LL(0x22850494,0xd3189e72),LL(0x7646877e,0xe04fe426),LL(0xee0cbac9,0xf8802494),LL(0xd9fdf793,0xa975ea85),LL(0x0c9c6045,0x18cf38fb),LL(0x02b88cb1,0xa12c8778),LL(0x9757e39e,0x8e571e06),L_(0x00000054),
+ LL(0xd9933844,0xd91f89ee),LL(0xd77e7f7e,0x2cf0f860),LL(0xe9a24986,0x705ade19),LL(0xa4b26963,0x0f929eaf),LL(0xf6f18b5d,0x1a12f7ee),LL(0x0ff1861d,0x4ef59d59),LL(0x6b67d295,0x18bcbd0d),LL(0x70540dd4,0x83b51e51),L_(0x0000016e), LL(0x6f33ef54,0x0b0a67de),LL(0x090cb0d5,0x89c8fd0f),LL(0xb8b3eeba,0x289c0d96),LL(0xa8a26dc5,0xe6dd7431),LL(0xafde18e0,0xf0a660c8),LL(0x2cc76374,0x397bcfa0),LL(0x7654494d,0xd958a15b),LL(0x24476b8f,0x53a314e3),L_(0x0000017d),
+ LL(0x9d90faa8,0x74ca8553),LL(0x099db6d0,0x79fa68c5),LL(0x4c5dd75b,0x75880817),LL(0xccf37a0a,0x92dc167c),LL(0xf900a103,0xc92d1684),LL(0x8386aa09,0xfba8f79b),LL(0x53d25b65,0xb1822202),LL(0x183fbc1b,0xfccc5a8e),L_(0x000000ce), LL(0xa07c1dfc,0xf2f85858),LL(0x4925f513,0x1b5dd268),LL(0x3efe01ed,0x65fdd3e5),LL(0x47d317de,0x4621cca2),LL(0xdf49fdd8,0x60e7bc31),LL(0x66f9ab90,0xe320caa6),LL(0x2ca76c6f,0x41361bf3),LL(0x602d539d,0x267e9ebe),L_(0x000000f0),
+ LL(0x3938d7d9,0x925d2d91),LL(0xd471ad5a,0xe6ad36d9),LL(0x18a88bdc,0x599734aa),LL(0xb20b90be,0xaa6c0fb7),LL(0x33c88799,0xceda14b2),LL(0x7dad41f1,0x3bb924ee),LL(0xb7c643d1,0xa63db6fc),LL(0xcfe7d84e,0x46de4666),L_(0x000001a8), LL(0x81e8c45b,0xebe6128e),LL(0x4a9235f4,0x780d1146),LL(0x2db34ea2,0xb3ecdbc0),LL(0x31fad3e8,0xcdbe1207),LL(0x7ab5ebf8,0xdf431809),LL(0xbf1d4990,0x0f8e79eb),LL(0xe93c1583,0xfba03ee7),LL(0xefc40a1c,0xf76de664),L_(0x0000008d),
+ LL(0xb488c3a9,0xa3f4bcf5),LL(0xf02dfbba,0xf379ed8d),LL(0x7857a0d6,0x6c580cb5),LL(0x7b4a59a6,0x6d6738fc),LL(0x1654de01,0x7c102c44),LL(0x8d6ededc,0xb8a37f11),LL(0xe92baa08,0x6ecce15f),LL(0x1b1b1c96,0xf542a7b0),L_(0x000000af), LL(0x8b1ba942,0xcf9be3be),LL(0x02fd3092,0x22a60f7a),LL(0xd4c8209a,0xdeeb8950),LL(0x8636e6d7,0x29511c76),LL(0x09037c4f,0x419f1652),LL(0x4196d645,0x935dc02e),LL(0xeaef1b05,0xcec8a6ec),LL(0x2f5c9bf8,0xb432cd40),L_(0x000001bc),
+ LL(0x458a4ebb,0x7f267eeb),LL(0x2a1279f1,0xf11c0e49),LL(0xc76f729a,0x92b8f2a3),LL(0x5437339e,0xe00c8ca3),LL(0x41f96b14,0x1dbcc016),LL(0x449dde57,0x5fa3755e),LL(0x0a0df11e,0x42dc646a),LL(0x5d317707,0x3610d1c6),L_(0x000000f5), LL(0x553c4383,0x76e5b808),LL(0xc99fe831,0x61f75499),LL(0x19eef1a0,0xd4c21a60),LL(0xcc67deb8,0x192fdd7e),LL(0xec37ce33,0x13250ef2),LL(0xf6ed9344,0xac4baff8),LL(0x8d1e9777,0x0d67d5c5),LL(0x7183407f,0xd1b52871),L_(0x0000019f),
+ LL(0x078b4225,0x64430a84),LL(0x5637bc1f,0xc9bb1131),LL(0x102f522c,0x38d318b3),LL(0xb1dfff39,0x0967edf8),LL(0xc54708cf,0xff7bf052),LL(0xb7dea363,0x5d9deef1),LL(0x44846b8a,0x5e3fdc0e),LL(0x2ccf785a,0xdf1138dc),L_(0x0000010a), LL(0xe715aa67,0x3b1beaf4),LL(0x5076af3c,0xac3bbbf4),LL(0xdda27ca5,0xdc76f92a),LL(0x7c5f4d64,0x67fb8aff),LL(0x98258450,0xfa7eea13),LL(0x183f4c0d,0xc38dcddf),LL(0xc7ca9f82,0x0789054d),LL(0xa0ad28e2,0xf484ac51),L_(0x00000118),
+ LL(0xb9c90b3e,0x0d9d6152),LL(0x28f43810,0x4ecd5aff),LL(0x0a2146e6,0x7e0c0df1),LL(0x0d19ad5b,0x6775181b),LL(0x151d7c3f,0x43c7a1b8),LL(0x38a3ef9f,0x2dd235c3),LL(0x1fdd8171,0x1f2597ee),LL(0x4734726a,0x083971de),L_(0x000000b3), LL(0x0d9bef58,0xfac04120),LL(0x85ff590d,0x952b767c),LL(0x8b72aaea,0x843ae9c1),LL(0x004265e7,0x307d7542),LL(0x395a8932,0xc2dea503),LL(0xc7f73a8f,0x3399e1ee),LL(0xb86c7eb5,0x2926b2c4),LL(0x0d21cf86,0x47a4f082),L_(0x00000193),
+ LL(0x41c76045,0x685e8e4b),LL(0xd88c27c3,0x0240c0b1),LL(0xeaa149a2,0x79b4d2d7),LL(0x18bd3d71,0x368319a1),LL(0xdb5d6ca6,0x44a8c42f),LL(0x587ba79d,0x77c41337),LL(0xdb57f6f2,0xea1f7c4f),LL(0x8ae39899,0x77750728),L_(0x00000085), LL(0xc0c436b8,0x22355d19),LL(0xa2946cf3,0x598a6616),LL(0x4d6a2c7a,0x4bb8cec6),LL(0xfe918a85,0x94e93f01),LL(0x833d8970,0x64d5ba4a),LL(0xa972b798,0x05a95b5c),LL(0x636ab756,0xca11412a),LL(0x2b50cab7,0xeca1dc55),L_(0x00000097),
+ LL(0x4cd7297b,0xcb4f7b38),LL(0x1a4787e2,0xea069acc),LL(0xa5590739,0xa99d3f7a),LL(0x601be73f,0xcf6cca23),LL(0xaa83e6e7,0x3960cc53),LL(0x5920b117,0x20e0b86b),LL(0xa7ac9dbe,0x6b3ef99f),LL(0xf468bb6f,0x60ac6c56),L_(0x00000040), LL(0x9f97eeb6,0xdc626c18),LL(0xb7dd82a1,0x008f892e),LL(0x142f8425,0x705cbf37),LL(0x01a4b241,0x4c8483d1),LL(0x275951c0,0x82075cfd),LL(0xa7dae45a,0xa9d9f282),LL(0x63c98e81,0x30bf2902),LL(0xefc331b1,0xc5f55add),L_(0x00000095),
+ LL(0x0bea3751,0x4a6e860f),LL(0xaa1272c0,0x85afdbd7),LL(0x53123c17,0x796e466f),LL(0x327374bf,0x19701fb1),LL(0x8c2b076b,0x755659d8),LL(0x8fee24c8,0xc6001497),LL(0x45d95463,0x144b9a21),LL(0x98a62be8,0x9e1d51ac),L_(0x000000e1), LL(0xfa89441a,0xff126e8b),LL(0x87dd796d,0x5e933815),LL(0xad6f752f,0x0f756584),LL(0xa0d6329c,0xc8afd335),LL(0xef95a2f8,0xa429ff1c),LL(0xe9d51af6,0x06c04336),LL(0xbb9ac481,0x0e389129),LL(0x80d2d2dd,0xb75b239e),L_(0x000000d2),
+ LL(0x36e3c242,0x04ac9a1c),LL(0x9fb461cd,0x2abd08e0),LL(0x7bca251b,0xfa6e8384),LL(0xf5d98ad8,0x7e953f04),LL(0xca3dcc08,0xfd9f6c57),LL(0x679c5992,0xfac8f179),LL(0xc9cf93cd,0x0e29622c),LL(0x050d1a32,0x703c650a),L_(0x00000180), LL(0xd397fdc1,0xc1188e58),LL(0x60a160b5,0x6d729218),LL(0xbe9a3f42,0x311911d3),LL(0x864f8747,0x8a79eb1a),LL(0xe2ff5eb7,0x66b881de),LL(0xef83107b,0x8784fc87),LL(0xd139997a,0xd894e5ee),LL(0x9a80e84f,0x1a2f4197),L_(0x000001aa),
+ LL(0x82c0cc02,0x6619c168),LL(0xbefe84df,0x7fe74db9),LL(0x7efd2da4,0xc983adbf),LL(0x0bbc28a9,0x6535bd9b),LL(0x169b3680,0xcb39ad32),LL(0xd2112121,0x3f60a9f2),LL(0xa91386ce,0x3a1b138f),LL(0xb1ef230d,0x36ea6d68),L_(0x0000003e), LL(0x9f4b61ea,0x1ef3660b),LL(0x58bee126,0x3a1e13eb),LL(0x84fe2098,0x1044e049),LL(0xd3d31ea9,0x6e975e84),LL(0xbdc58274,0xcbeca3ca),LL(0x4c27aa9f,0xe9036bd4),LL(0xcc717651,0x982f94af),LL(0x20d99920,0x0268a0da),L_(0x000000be),
+ LL(0x60bd53c9,0x8e317075),LL(0x01712fc5,0x00607c95),LL(0x10e30ced,0x77b023a2),LL(0x53b465e6,0x620a31c6),LL(0xb10af467,0xa8ea62e5),LL(0x48d08ca5,0x31ddd990),LL(0x65af8778,0x5be8899d),LL(0x2b29f5ab,0x21d38a08),L_(0x00000083), LL(0x78c6e380,0xd56bb423),LL(0xba4bc4d5,0x28b7afb8),LL(0xa4ef2e4b,0xc314822c),LL(0xae9b41f7,0x882d9a51),LL(0xf2b327a2,0x1e6c2280),LL(0x7ce965ab,0xa49d1969),LL(0x5708dae4,0xea346d97),LL(0xcff1175e,0x572d2fbc),L_(0x000000e9),
+ LL(0x6ad30fb7,0x971c75d0),LL(0x3dd39efc,0x11aab543),LL(0xe47dc537,0xf6290b96),LL(0x38ce4cde,0xe7a164cd),LL(0xd9dcb339,0xebee41ba),LL(0xbc0e8d41,0x18ca0dd5),LL(0xd2a8a073,0x92054e4f),LL(0x366d13cf,0x188fdcbb),L_(0x000001e4), LL(0xa68c541a,0x587afc9e),LL(0xf03b4067,0x4ac1fdd7),LL(0x43baf1b7,0x900c0863),LL(0x35bd9902,0xe71367f8),LL(0x3f6d6815,0xfd613341),LL(0xc12cdb6c,0xa8569f79),LL(0x6e58f3c3,0xd9ca8493),LL(0xd420b011,0x6d1ebe67),L_(0x00000179),
+ LL(0x98392473,0xbd7d4bad),LL(0x4af0bab5,0xade61274),LL(0xcd1e04b0,0xe21c3a53),LL(0x4ec80a7f,0x4b987124),LL(0x28f48386,0x23f6fd14),LL(0x63b180bf,0xe2b4889d),LL(0xacf748b0,0x2996dea6),LL(0xf3a06107,0x7cdec9d5),L_(0x00000060), LL(0x242fc0a6,0xc2a9858e),LL(0x2d38ce4f,0xc709b1fa),LL(0x87521e69,0xf5996fd9),LL(0x4d05bae8,0x131ac99f),LL(0xc3bad75e,0x62578fe3),LL(0xc9d13920,0x3ada2279),LL(0xb6fbac90,0x696da364),LL(0x6c292885,0xd02ce135),L_(0x000001db),
+},
+/* digit=48 base_pwr=2^240 */
+{
+ LL(0xee1b4c29,0x3d1074e0),LL(0xff10eeb7,0xe087c1a0),LL(0xc77549f2,0x5e2e0837),LL(0x74d6808a,0x48c7156c),LL(0x11f82ce9,0xbc13bf7c),LL(0x72ee287e,0x06f6a514),LL(0x28c4e6f9,0x165038cb),LL(0x320fef0b,0xb6f1c9d9),L_(0x000000d8), LL(0x2cf5a19d,0x57d310ce),LL(0xadd6b6df,0xcd825c08),LL(0xdcd4cb28,0x48bebf85),LL(0x644e1cbe,0xf1d5aa6a),LL(0xbebbd351,0x908ba85c),LL(0x4d8a2aa1,0x518b1bc8),LL(0x343d2d77,0x29b988ed),LL(0x7ea90982,0x940fc8d0),L_(0x0000009f),
+ LL(0x73a5d8ba,0x8f96ebc1),LL(0x54a67c95,0x984cd0ed),LL(0xef67809a,0x8dd8453d),LL(0xde0abb72,0x4fe5f363),LL(0x4b73609f,0x8e4fc461),LL(0xaab1b83c,0xb989fee4),LL(0x06d2158c,0xfe56f7d6),LL(0x52096597,0x70734a0c),L_(0x00000172), LL(0xa18dccda,0x094ef503),LL(0x32b2f44d,0xebd6d9b7),LL(0x2c29898d,0xe0ef3ff7),LL(0xe5d5ffd4,0x30b99ae2),LL(0xe1c94a38,0x2dd5fca5),LL(0x15b084de,0x6d08e970),LL(0xe94504be,0x90fe0fe0),LL(0xdb79eaed,0xafa2897d),L_(0x0000011e),
+ LL(0xee4255c9,0x45dd470c),LL(0x907208e4,0x551b38ea),LL(0x1157ba3e,0x1b72b693),LL(0xcf9f94c5,0x83c616c9),LL(0xaf1c59b1,0x2fe84fca),LL(0x7ed67f1d,0xf1bd77c9),LL(0x1d1e1a09,0x51550daa),LL(0xbac2f477,0x58d345e7),L_(0x0000018d), LL(0x854d3f83,0xa5d95b5f),LL(0xa404c99b,0x29f414da),LL(0x5a1bac7d,0x81c9d673),LL(0x56fda469,0x2c1bc499),LL(0x66bdcd65,0xfe505f2a),LL(0x9783eab5,0x92378106),LL(0x6f9996ab,0xa7330e63),LL(0xa6238170,0xfa70e33d),L_(0x00000070),
+ LL(0x386cf1e1,0xfee86a58),LL(0xf15be04b,0x32b87572),LL(0xe35f663e,0x94b48632),LL(0x165f5c52,0x62fb4267),LL(0x7d3b9413,0x407dadeb),LL(0x189d86c3,0x5689012e),LL(0x63e5f780,0x61c7907d),LL(0xa2b7e335,0xc0dc085f),L_(0x000001c0), LL(0xb4f6916e,0xa9cbe4f2),LL(0x0cfb081d,0x5ac2d2f3),LL(0x11fe0a52,0x32662679),LL(0x8fcbbd46,0x3e344c2d),LL(0xb1ff4122,0xa0a08757),LL(0xa48229e9,0x6f7101c0),LL(0x56b8c92c,0x4af0e804),LL(0xbb9a086c,0xc21360d8),L_(0x00000174),
+ LL(0x64d30caf,0x5a00ce71),LL(0xb34ef3a4,0xac5c1fed),LL(0x800620f8,0xba6237c0),LL(0x97dc7c79,0xff56f449),LL(0x5563d588,0xe8ab9474),LL(0xb2b00a9a,0xb8d1df21),LL(0x6a286295,0x4cf9b378),LL(0x00426dbb,0x30b70043),L_(0x000000c8), LL(0xf792db10,0x1fa97f98),LL(0x5a4e4b25,0xd3a62f9d),LL(0x61b4d385,0xad987701),LL(0xb90b4cda,0x41727a73),LL(0x84f90823,0xec4abf7e),LL(0xd814c4a3,0xed3df0de),LL(0xc453671b,0x0c8945f2),LL(0xdda88869,0x94087855),L_(0x0000019a),
+ LL(0x7fb07527,0x0ce5f28e),LL(0x705e5e78,0x3af745ca),LL(0x93ca952d,0x7351cb28),LL(0xfedeccdc,0xc12e9837),LL(0x7e7bfbbf,0xd14b9356),LL(0x47999f34,0xc6295462),LL(0x3f729887,0x5692b0da),LL(0xc96edd28,0x812e383c),L_(0x000001c9), LL(0xd72f1105,0xef1bc941),LL(0x70199860,0x493b99ba),LL(0x2d090c33,0x279e0c37),LL(0xbe1503ff,0x3fbe286b),LL(0x80f6465c,0x06d81c3e),LL(0x0a9257bf,0x2a448d3a),LL(0x402ee72a,0x6a5669fe),LL(0xe592b91c,0x5315497c),L_(0x000000d9),
+ LL(0xc0b3f5e5,0x93b397c9),LL(0x3318572b,0xa3327857),LL(0x0e667f17,0x7af5bff7),LL(0x2e60b913,0xfb65a96b),LL(0x9e25ef17,0x9188dfee),LL(0xdd117ab2,0x830a2c9e),LL(0x5472d03d,0x063aa4e1),LL(0xd8512ca1,0x9593f42b),L_(0x000000df), LL(0x5ba796ee,0xa143be47),LL(0xbbccf7b7,0x40a8123d),LL(0x80d4a4b1,0x8562ea6a),LL(0xe8424774,0x53e144c7),LL(0xa39d882f,0x49ac8b6f),LL(0xb451fe15,0xffe4b1ea),LL(0xc4538f34,0x0527aede),LL(0x1076cc29,0xbcd8efdc),L_(0x00000183),
+ LL(0xcdaef57e,0x670c5c5b),LL(0x046d9801,0xf7b5e720),LL(0x0601ff33,0xa07084cc),LL(0x900e6b0a,0x791af83b),LL(0xd2391e07,0x2dd856fd),LL(0x0430654d,0x63408d88),LL(0x82606889,0xc176e8bf),LL(0x2fa4b443,0x18c663e6),L_(0x0000004e), LL(0x41a598d0,0x48d8ae04),LL(0x950e8cec,0x11b8065c),LL(0x1316d53d,0x3a5ccc8c),LL(0xfeecd686,0xed41a668),LL(0xbb41648c,0xf76ba771),LL(0x9a4bb4b6,0xa9b2b49a),LL(0x370974d5,0xf9f130ae),LL(0x200485de,0x4c25f49d),L_(0x000001b8),
+ LL(0x92cea4ef,0x24ffe291),LL(0x23a38bed,0x41132058),LL(0x4bf85483,0xba359818),LL(0xbdd23ab5,0x3571fdd9),LL(0xd8f1fbf5,0x740422c0),LL(0x46b3d29b,0xdeca158b),LL(0xf7c74726,0x69a6765b),LL(0xe058b8b2,0x3a247a5b),L_(0x000001e5), LL(0x4e26d5da,0x49bfcbe2),LL(0x37b93476,0x3090fa48),LL(0x219565ef,0x30eb0e12),LL(0x996b7d11,0xe2ef23ae),LL(0x935017a2,0xfedd570a),LL(0x59810960,0x510b5963),LL(0xf4feef53,0x4eeb57ef),LL(0xa6aed7bc,0x500fc7dc),L_(0x00000023),
+ LL(0xd3c23c96,0x502210f9),LL(0x2f6be4ac,0x36ffcfaf),LL(0x97a1a521,0x874cac2d),LL(0xd4b6d8f6,0x4e03da3a),LL(0xebd4b9c9,0x058f53fa),LL(0x05bdde0c,0x54da0035),LL(0xea492dfd,0xf1d437ba),LL(0x083ae453,0x837cc36f),L_(0x00000173), LL(0x653383a8,0x7ab16b91),LL(0x08283456,0xe627feae),LL(0x5b031ea9,0x5ab7febf),LL(0xbc9c1a1e,0xdf744ce8),LL(0x0a851efb,0x944a28d0),LL(0x92d1258a,0xa2c52c0a),LL(0x8db3d01a,0x3272efed),LL(0xc3e55528,0xdd38ae95),L_(0x00000092),
+ LL(0x20da6312,0x6c8b9288),LL(0x201a8b72,0x55d5044c),LL(0xcd7dd04a,0x5fefdd8a),LL(0xf135da4f,0x326e5c4a),LL(0x93ab679e,0x0ebd3dab),LL(0x9e1c63de,0x3da9430d),LL(0xb6139a96,0x1c3e1a0b),LL(0x0bbe99d7,0x31ad9e61),L_(0x000000a5), LL(0xd0083331,0xd69aa80c),LL(0x312fa8a7,0x10699493),LL(0xb830105a,0x432ef74c),LL(0x427ed742,0x21457fc6),LL(0x32a8f306,0xed7ee077),LL(0xde91b340,0x7b2b2143),LL(0x97655415,0x2c36d1f0),LL(0x3e70f7df,0x8cb68be3),L_(0x00000162),
+ LL(0xb5a77e18,0x1c2c5d0a),LL(0xbdac0199,0xf48304d4),LL(0x58ea0344,0x7badcb3c),LL(0x61cc3620,0x7fa76693),LL(0xee100174,0xcbbd3041),LL(0xb845bb4b,0x2ab9fe8e),LL(0xbc927037,0x7e87d3ef),LL(0x7c6a4dcf,0x87fd392a),L_(0x0000011a), LL(0xd9fd8527,0xf99d4987),LL(0x3518a503,0x093c711b),LL(0x5ed52438,0x8de87657),LL(0x1283fea5,0xa57d89d4),LL(0x1d760642,0x37377224),LL(0xbf397e80,0x0c073eb0),LL(0x2d948da0,0x19066ff6),LL(0x02fb3665,0x6f15cfd1),L_(0x00000090),
+ LL(0x33168ab8,0x0703434d),LL(0x36c93ab6,0x08a36b13),LL(0x54182f0b,0x6018b27b),LL(0x1eb09d80,0x52b2eff5),LL(0x5cab8c14,0x54baf54d),LL(0x09c5f439,0x9128c26e),LL(0xa0c91a3e,0x3c462ce0),LL(0xc8a5d523,0x0dcb5998),L_(0x000000bd), LL(0x2a3d44a3,0x168afb3c),LL(0x28b7e59a,0x51e02e1e),LL(0x7db3beb7,0x95d9b53f),LL(0xd954033d,0x4280b408),LL(0xfca4117d,0xd87fffcb),LL(0xa8a2c41d,0xedfe3235),LL(0xa4e146b0,0xc9ab6206),LL(0x23f56e8a,0x6cc8df44),L_(0x000000c5),
+ LL(0x4d499b60,0xe30728ab),LL(0xeda148e9,0x09a1b090),LL(0xb3c8e802,0x4fed9972),LL(0x6feab8c2,0xbd0bf024),LL(0x684e8ba5,0xb6e56fc0),LL(0xc679d0b7,0x3a2827e6),LL(0x05aad3cf,0x9605e502),LL(0x154eec73,0xc7d72f2b),L_(0x000001e2), LL(0x4a30f9e9,0x04181bc3),LL(0x17c5f246,0x0c346607),LL(0xf9d4abe6,0x9d5267c4),LL(0x53390747,0x76bf72c0),LL(0xe2e74911,0xd4ea29a3),LL(0x25cb2342,0x5c9021dd),LL(0x7e8d6c56,0xac452ce1),LL(0x1fd1d0fd,0x7f5955ad),L_(0x000001df),
+ LL(0xd68445e9,0x7a984abf),LL(0x46f086dc,0xd299e678),LL(0x3ae95a65,0xb7f240f5),LL(0xadf74e6d,0xdd46db9e),LL(0xc95ae291,0x3dae88ec),LL(0xbc688dc9,0x4474ebcc),LL(0xe0bd1aae,0x3a30df47),LL(0xd32d0317,0x222e18e3),L_(0x00000054), LL(0x13d89ccf,0xda1caa7c),LL(0x3b9e4f98,0x584fa9c3),LL(0xe3bb36fe,0xa33fbb40),LL(0xece5a0db,0x990ebace),LL(0x2d1efc59,0x1c0c2167),LL(0x0ea367aa,0x18eb3285),LL(0xaa6c72bd,0x4a9d7d68),LL(0x69e3bcf6,0xcd396faf),L_(0x0000018f),
+ LL(0xdfb404ce,0x20f43bc2),LL(0x14169ebb,0x776ec8b3),LL(0x4d9ce016,0x40cc814f),LL(0x64db6f3c,0xde6701fd),LL(0xbc27b375,0x1be16687),LL(0x41b2641f,0xaaf1c8ca),LL(0x5c7ebdd8,0x667e429e),LL(0x9221918a,0x84d2d4cd),L_(0x00000193), LL(0x8bc8b351,0x65966739),LL(0x502a6f1f,0xe772626c),LL(0x612fc65a,0xd1717c45),LL(0x06b47588,0xcd0bd273),LL(0xfd9dbcb0,0xf7b68702),LL(0x5beaed3a,0x60d2a43a),LL(0xd9e3bfb5,0x618c6158),LL(0xeec14b9b,0x1dad1537),L_(0x00000042),
+},
+/* digit=49 base_pwr=2^245 */
+{
+ LL(0xbf8b6eac,0x7b9e7889),LL(0xe957ebe2,0x3ae1f292),LL(0x2bd715ca,0x6ae08fea),LL(0x3b2ea475,0xcab67aaf),LL(0xf247c9f5,0xd47caa37),LL(0x53af0925,0x409f1b89),LL(0x57e7bd1f,0x4ee5b8e5),LL(0x0b979eb1,0x0e289030),L_(0x000000bb), LL(0x1ea9467a,0x1d78d6b7),LL(0x3dfcb1d0,0x595db0c6),LL(0x8e6aaf05,0x9217ec90),LL(0x45106ff4,0xab12df36),LL(0x8489adb8,0xc4207aff),LL(0x257b835b,0xabbbb85d),LL(0x706e08a1,0x71ad10a3),LL(0x6d2a5b7d,0xe224792f),L_(0x0000016a),
+ LL(0x50fd71f2,0x8295b8b6),LL(0x65b39aaa,0x0690f149),LL(0x1270c951,0x763e6fce),LL(0xbafb3a9f,0x3f839143),LL(0x0dc990be,0x3866c189),LL(0xa0d6a0e7,0x087b74c8),LL(0xb520d476,0xd8910a14),LL(0xbd81006e,0x16e6fb91),L_(0x0000012b), LL(0x63f73546,0x9757756a),LL(0xbe4b13d0,0xc54fba1e),LL(0x3f1884ce,0x4519ff97),LL(0x68950392,0xfb9e4f42),LL(0x2d309b59,0xf2ce5e20),LL(0x004b85f0,0x35d898e0),LL(0x05c20b17,0xd4f54e0b),LL(0x34add1fb,0x178e2a7f),L_(0x000001cb),
+ LL(0x2d50f2ad,0x9fa52c89),LL(0x8fc48ea8,0x6a680dfd),LL(0x4b09bae8,0x78d67917),LL(0x7cea1e12,0x0f37ae3b),LL(0x8383d337,0x9f51107a),LL(0x157913dc,0xbbd05c8e),LL(0xc347e479,0xe7f7f024),LL(0xc27dfb63,0xa32c2410),L_(0x000000c4), LL(0x275b47a6,0xa0c5983d),LL(0xbc8a42a9,0x31f03f3e),LL(0xdb0533ac,0x07b4440f),LL(0x1b5cb9b7,0x522041e9),LL(0x18816d64,0xa0763672),LL(0x78c44489,0xa7d823be),LL(0x0289668f,0xa033e066),LL(0x14b7bda9,0x1bf9880e),L_(0x00000004),
+ LL(0xb8d3d78f,0x992b024d),LL(0xcc47fd44,0x301e6aa5),LL(0x4ca3c2ae,0xa239d460),LL(0xb59f6635,0x72a93968),LL(0x93da741e,0x6f3e7cb4),LL(0xe451c847,0x958457a0),LL(0x0539a4ae,0x0ccc6f49),LL(0x70df123a,0x4b36ee4a),L_(0x0000013e), LL(0xaec0226e,0xa5bf5964),LL(0xd54e934e,0xa4f9d8d0),LL(0x838881f3,0x5759057f),LL(0xd231904c,0xf74d21e3),LL(0x65fa2854,0x09110e09),LL(0x3e3fbb9d,0x73f82547),LL(0x66595687,0xc3213d46),LL(0x4ee05953,0xc6c9fbf7),L_(0x000001e0),
+ LL(0x978a2d88,0xf19f1768),LL(0xfbd4f466,0xccc78e3b),LL(0x4ab17eab,0xe0f582bd),LL(0x42edf70d,0x32c21454),LL(0xe1c56694,0x7f57c601),LL(0x01c830d3,0xe9eae160),LL(0xe56900b5,0xca26d56c),LL(0x36688674,0xb2fb4c7c),L_(0x0000007e), LL(0x369579ff,0x53c6182e),LL(0x47ff90cc,0xaaf18b16),LL(0x8fc84257,0x96b0582e),LL(0x9e3a6661,0x4532767f),LL(0x0d14fb71,0x29d6ef11),LL(0xdc2f950b,0x54eb6cc6),LL(0x85acbd0a,0x525b30dd),LL(0x5c05fb17,0x67dd5268),L_(0x00000175),
+ LL(0x66c24804,0xaabdb0b2),LL(0x1475f80e,0x6b7bb07c),LL(0xd90a1e1c,0x92ecf09d),LL(0xc193105d,0x5feeb4d3),LL(0x322cd2b8,0xd3b68b08),LL(0xb3acd3e0,0xb0ed276b),LL(0x50511672,0x512d83e9),LL(0x5830b5d3,0xda968b0a),L_(0x000001db), LL(0x1320700b,0xa9aed6cf),LL(0xadb30375,0xb42997c1),LL(0xc6687e52,0x1d88f275),LL(0x5c1d5e8e,0x5d9e895e),LL(0xdbf775d5,0x1f149b28),LL(0xc29aed12,0xe2724e7a),LL(0x220a70ba,0x7e781bbf),LL(0xcf9cd146,0xfb0950fc),L_(0x00000166),
+ LL(0x8275d24f,0x26492a48),LL(0x8f120fe7,0xb833386c),LL(0xbca86762,0x7d77fbcb),LL(0x2f67d175,0x5165ed7e),LL(0xf29932da,0x40520604),LL(0x607db461,0x88627d90),LL(0x74dd9734,0x9d6e8589),LL(0xff8795e0,0x0898a1bd),L_(0x00000157), LL(0xa3d097c4,0xf0c19be8),LL(0x3e449e91,0xc086fd4a),LL(0xce081f35,0x60f6bfc7),LL(0x6b980172,0xf116eb17),LL(0x438fccb9,0xb036eed0),LL(0x3b9d80a6,0x355bcf69),LL(0x17f28db4,0x1d897ded),LL(0x5b488d87,0xb2564e1a),L_(0x000000be),
+ LL(0x823eac8a,0x6223dd4a),LL(0x84db5faf,0x0b0f5e29),LL(0xd39d495d,0x0a14e52d),LL(0x723841ce,0x365ed8de),LL(0xb4ef0fcb,0xdbcb1fe9),LL(0x3aa7d5d2,0xb19047ee),LL(0x2d33c7e0,0xe2978f53),LL(0x2ad3b9dd,0x9dbc97d1),L_(0x00000132), LL(0x6c00ac28,0x02d16555),LL(0xb3172c7a,0x8804b57f),LL(0xbeeb32c4,0xad774958),LL(0x59e99dad,0x34b2bc96),LL(0x90ab3c79,0x33fd281f),LL(0xe477effe,0xfaa713ab),LL(0x78b329a3,0xf3df2353),LL(0xac36cbb9,0x62e824d0),L_(0x00000145),
+ LL(0x54e642eb,0xd8f323fb),LL(0x81a85944,0x3dd3e0be),LL(0x51a21fab,0xd871d4d4),LL(0xb561f31e,0xb4ce4cde),LL(0x4449b15f,0xce67b526),LL(0x64493f22,0x82ddd4ad),LL(0x546ec9b8,0x0adc07a9),LL(0x4dba63e9,0x82628c7e),L_(0x00000128), LL(0xe1f0172a,0x5e900de4),LL(0x358c4d59,0x8391c4fa),LL(0xd7be91ac,0x82f89ceb),LL(0xac49480b,0x0dcd6532),LL(0x48237726,0xd2dee6e8),LL(0xaeda17a0,0x13850532),LL(0x2d6729ba,0x201426a9),LL(0xf52c6ebc,0x188c6ec6),L_(0x000000ae),
+ LL(0xc2fccc93,0x9b37123b),LL(0x274b93dc,0x0d11cfe3),LL(0x01caef2f,0xbe8ef001),LL(0xef0d218a,0x2810cd03),LL(0xace6e761,0x5c17a13d),LL(0x65a61b64,0xcfaaba81),LL(0x669bf078,0xd429ba49),LL(0xd9a6abec,0x0f71e96f),L_(0x0000016c), LL(0xee363303,0x592f7894),LL(0xe42d0a9c,0xfcc98aed),LL(0x3730d520,0xbb02c8f7),LL(0xe10a8edd,0x4886062f),LL(0x57fa6238,0xdab28f83),LL(0x308d0fc8,0x13c4d161),LL(0x8db6b346,0xf5b7f11e),LL(0x70d7617e,0xd7fc6e4f),L_(0x000000b4),
+ LL(0x0e9d00ce,0xe3c773fc),LL(0x30cb34f5,0x854f6660),LL(0xd3093680,0x5abdfb30),LL(0x7939c865,0x3d739567),LL(0xa46ffe9f,0x3a7253f9),LL(0x8fd8f096,0x151f1baa),LL(0xa1443d09,0x9a29f4f0),LL(0xb2ed7af8,0x0ad8104e),L_(0x000001fe), LL(0x58f41327,0x76fc8041),LL(0x0868fcae,0xf81d0998),LL(0xdba2642e,0x7f6f6367),LL(0x57d4f243,0x6a189847),LL(0x92fa4eaf,0xc022a76b),LL(0x4e736ea2,0xdd251f4b),LL(0x06ebdd88,0x39b7f55b),LL(0xb9f83aec,0xf34e682b),L_(0x00000021),
+ LL(0xfb89a61a,0xba33a960),LL(0x502d83da,0x377dd454),LL(0x04a7d732,0x60c9b2c8),LL(0xfa223630,0xe06fc03b),LL(0x7e497e85,0x145bb405),LL(0x456567db,0x39898314),LL(0x2d3a76ad,0xeb33a535),LL(0xd36b4686,0xebbad130),L_(0x00000079), LL(0x519e8255,0x8a5778a7),LL(0x10340c30,0xf7b160b7),LL(0x1f4c9e0a,0x729201ef),LL(0x09fe7ed4,0xe28d29ca),LL(0x57eb2d3f,0x3e4bfbfc),LL(0xfe99fffb,0xe7397e68),LL(0x62215a66,0x18c1dc25),LL(0x16278a5c,0x1045ab03),L_(0x000000ca),
+ LL(0xd14c0d2f,0xb45b8788),LL(0xc3b9c902,0xe8e7e9b5),LL(0xe1deb5a2,0x6f0ccb02),LL(0xcc118df4,0x931e8bf3),LL(0x44d4d935,0x8d49c80c),LL(0xae880f5f,0x294917c6),LL(0xdaf4ba46,0xf7ee5bdb),LL(0xe09285b3,0x11c3f0c5),L_(0x000000fe), LL(0xff95a4d2,0x6f1e6d94),LL(0x150c77e6,0xc23026fa),LL(0x8e7cd3f5,0x567d2494),LL(0xfba4ae31,0x380b42d3),LL(0x7135a34e,0xdf2c5139),LL(0xf390e611,0xfd3ff544),LL(0x1f3b21ae,0x4254bcbc),LL(0x67fca024,0x68f4c9e3),L_(0x0000003b),
+ LL(0x1f4a16c0,0x68ed5662),LL(0x0fa1e08c,0x31f2c30a),LL(0xb65f32e1,0x2d06bb12),LL(0xfec7dae7,0x95c78209),LL(0xb2e0fbb5,0x7d228e9d),LL(0x84a73eeb,0x0a7cd176),LL(0x4968f085,0xb3a9c57a),LL(0xf1034b1b,0x12dc73c6),L_(0x0000001d), LL(0xc3858dc2,0xd74b5636),LL(0x90895a11,0x8864d82d),LL(0x8f322a4c,0x1db6f8b1),LL(0xef6cb619,0xdc8f7532),LL(0x95fe8c47,0x6bb6ba07),LL(0xb376849e,0x6839da29),LL(0x55ee699f,0x9e4c3d09),LL(0x013177ca,0x06ac03b0),L_(0x00000198),
+ LL(0x1730ff3d,0x68b8e4b1),LL(0x556e1c75,0xb2cfde0a),LL(0xbf8d1b12,0x77dcfbef),LL(0xbfb5199d,0x8803a28c),LL(0xb3b33660,0x9ab9ee66),LL(0xffcfec92,0x75479f96),LL(0x66780a53,0x9e3f38c0),LL(0xe21a1107,0x8d2c8147),L_(0x000001a1), LL(0xec7cd093,0xf14b8da9),LL(0xf175c60b,0xc9c58bd9),LL(0x94928d32,0xf4158167),LL(0xa1977e7b,0x3720a8c9),LL(0x50e84c76,0xb29acf00),LL(0xa73b8ebd,0xdf12fc49),LL(0x8d8a4296,0xf75a8ea8),LL(0x1abde921,0xaa9b61ff),L_(0x000001a6),
+ LL(0xeb196620,0xd278de5a),LL(0x458b071b,0x5b584d1f),LL(0x0313ed9b,0x5f476cd6),LL(0xc54ce5fe,0x007678c1),LL(0x6d145a77,0xe258964a),LL(0x0c62f8fe,0xfa68420c),LL(0x595f7056,0x63621f28),LL(0x2d891192,0x5d8cf9f8),L_(0x0000019c), LL(0xe6cb7a7c,0x130243d2),LL(0x8d5a87bb,0xbcf908d7),LL(0xc4e517b3,0xd0ef67bc),LL(0xba70f65d,0x30e5dd35),LL(0x41af2fd9,0xaeb9fb07),LL(0x448314ee,0xf71f75eb),LL(0x3702fdd3,0xbac48350),LL(0x1d2c0a91,0x1ebd11ec),L_(0x000000e9),
+},
+/* digit=50 base_pwr=2^250 */
+{
+ LL(0x8057734b,0xf4bf04df),LL(0x31cb2cfc,0x0c3adb10),LL(0x13e25b6e,0x3dd2ab40),LL(0xff8fa4cf,0x758e2edf),LL(0xfeffd307,0xf31ad907),LL(0x4baf111b,0xeba1b456),LL(0x3c4f6a12,0x13a81607),LL(0x94fad755,0xe7fc43bd),L_(0x0000014d), LL(0x593810b9,0xb8d44eee),LL(0x369ffff5,0x5334df1e),LL(0x64f19da6,0x5c2b9ceb),LL(0x01321d0f,0xc5ca3390),LL(0x02b87e91,0x45689acf),LL(0x3a49c8b5,0x049dbf7c),LL(0x93f7ed7c,0x8d277840),LL(0x73a0a1d5,0x726f20ba),L_(0x000001d7),
+ LL(0x57fe6e74,0xe3d95d4b),LL(0xe45eed99,0x8fe19237),LL(0xddc0cb97,0x7eb46e14),LL(0x4df73f68,0x57bdaf6e),LL(0x8670ac6f,0x847741a1),LL(0xa46fbe2b,0x02454925),LL(0x82f9632d,0xc15a10d2),LL(0xaf2e144f,0xc55aed10),L_(0x00000015), LL(0x59c9bac7,0xc44dce06),LL(0xa506cebb,0x03aaab25),LL(0x48b6559b,0x933863a2),LL(0xc348048a,0xd37a9de4),LL(0x26cd5e20,0xc20f4402),LL(0xee95db69,0xff1c74e9),LL(0x2f425e1e,0xd820bb88),LL(0x1933a6f8,0x6f95cad2),L_(0x000000f0),
+ LL(0x909d4b32,0x6d40379a),LL(0x87db0c0b,0x3e1edc80),LL(0x4c5fed50,0x8c80df24),LL(0x0d788315,0x5caf06ac),LL(0x12556a93,0x95b47183),LL(0x76d86da1,0xc5714cff),LL(0xcec43480,0xc2f30fbd),LL(0x4e4b2ab3,0xc0cb91c6),L_(0x000001b8), LL(0x122dfa3e,0xcbc11bf0),LL(0x75b252f6,0x87c8dce3),LL(0x501537b7,0x84253d3b),LL(0x6a40795c,0xa38fd372),LL(0xb45a08cc,0x22234e1d),LL(0x09918d4e,0x76319208),LL(0xea70d97b,0x3ef6521d),LL(0x0bdcb67c,0xae2d874b),L_(0x0000018d),
+ LL(0x61d5097c,0x8fe4e5c5),LL(0x4aedde8b,0xc0d36b58),LL(0xaba27830,0xc0f869dc),LL(0x32bc7d59,0x14a35cbc),LL(0x22d71ab7,0x04bed4bc),LL(0x00680d9e,0xdf25061f),LL(0x3bf0836a,0xb3d768c3),LL(0x3b0d7fed,0x616b984e),L_(0x0000015c), LL(0x16b36592,0x3c8c5d5c),LL(0xbd923c28,0x9a32e9b2),LL(0xfbaf0321,0xf0d8e95a),LL(0xed15bdb0,0xd3039b5f),LL(0xd8942727,0xcc59ce26),LL(0xa1dec9a4,0xf0b3676f),LL(0x21992696,0xb8c7cfb1),LL(0x27260c98,0xc1c97929),L_(0x00000141),
+ LL(0x06497092,0x97538cbd),LL(0xee612332,0xd25447d7),LL(0xa1040800,0x9c9bdc12),LL(0x06fb815b,0x191fed4b),LL(0xae49fbdb,0xd9407747),LL(0x3d19e592,0x9715df76),LL(0x4613ac78,0x1e9e20a7),LL(0x6c932530,0xe2bfff7a),L_(0x000000fd), LL(0xe1fd9066,0x6bfd0423),LL(0x13390bb3,0xb87dda88),LL(0x40017ffb,0x979fe6b8),LL(0x635bb57d,0xb6fc9a61),LL(0x8ce87e55,0x535b6b63),LL(0xea1ec56c,0xf567cddc),LL(0x06b927fc,0x72c516ee),LL(0x6fb0868c,0x2ebdac5a),L_(0x000001ff),
+ LL(0x0de7eaeb,0x76e19265),LL(0x53bc630e,0x506faf0e),LL(0x88127211,0x64c166ff),LL(0xad3fc9e2,0x6308dc18),LL(0xb271bc9b,0xec631a3e),LL(0x23be699b,0x2e23525b),LL(0xbfded0b1,0x2391574a),LL(0x69f0d2b6,0xa8ede972),L_(0x0000007b), LL(0x5c84ab62,0x194cc299),LL(0xf244f4b2,0x911e4585),LL(0x7871cfc3,0x52af7b51),LL(0x331dbf96,0xd41147d5),LL(0x7a399291,0x48e46193),LL(0xb0e20d54,0xd985a24f),LL(0x98e92da0,0x7266525c),LL(0xe9b74352,0xe84bc9e9),L_(0x00000043),
+ LL(0x7a9ef311,0xe9d37b18),LL(0x456032b1,0x30dc5e77),LL(0xd6168724,0x47f55c35),LL(0x18a17037,0x154ea414),LL(0x86d54c7d,0xe14c43c8),LL(0x8d092542,0x78f9b9e8),LL(0x986d7498,0x98519065),LL(0xcc71fd0e,0x4d22c2b8),L_(0x00000060), LL(0x41eec301,0x91d1b267),LL(0x4de89064,0x601dee13),LL(0x91ac8ed6,0xd375837e),LL(0x8587c0dc,0xa03d56de),LL(0xd2c2524e,0xa4331dd9),LL(0xf36ec517,0x0f8bb8e6),LL(0xb100599c,0x0dc65f7a),LL(0x8ada0049,0xa298259e),L_(0x000000f3),
+ LL(0xc52854f8,0x1b2f821d),LL(0x01e839c8,0xcb7e709f),LL(0xf9520b0a,0xc4857ab9),LL(0x3a85ef6e,0x09f9eda6),LL(0x51f47572,0x96daca66),LL(0x6e717337,0xccecd697),LL(0x40b37bfa,0x29f4ce02),LL(0xcbb44372,0x0fe8a0ff),L_(0x00000191), LL(0x2adce4eb,0xa3781970),LL(0xcf2ed75e,0xf948f559),LL(0x524a7d80,0x3e1fceef),LL(0x058a1573,0x25fd5510),LL(0x5865318e,0x14c29ed3),LL(0xcb7d9fa1,0xcaa64e51),LL(0xf171b487,0x25580546),LL(0x006163b8,0xde740000),L_(0x00000086),
+ LL(0x09489108,0x87d0f1ad),LL(0x4cf7363c,0xd4fe9fd3),LL(0x9bd13abd,0x4b7d7e77),LL(0x66face9e,0x42746d44),LL(0x0edf9d57,0xd5f51826),LL(0x888b45bf,0x37b7e3fa),LL(0xde49e8c9,0x0262004d),LL(0x8fd87627,0xdc4da423),L_(0x0000008a), LL(0x5a095bda,0xce31cec6),LL(0x2990a670,0x1be9607f),LL(0xf2081d18,0x8855d0c8),LL(0x11fb1c34,0xc4c2574d),LL(0xf1b8ff1c,0x3e444ec2),LL(0x4404e3fc,0x2db84189),LL(0xb7726488,0x0dd78e74),LL(0x7de996b1,0x7da11b57),L_(0x0000001c),
+ LL(0xedc7667f,0x6a5bd2b7),LL(0x343d29b0,0xd33329b0),LL(0x82fbc88b,0xd3fc973d),LL(0xe1e7bcdd,0x111c0001),LL(0x1c56ee4a,0x0cb45e7f),LL(0x65818c84,0xaccf98e4),LL(0x69029f68,0x6bbf8831),LL(0x53ac7e98,0xe2fa2c45),L_(0x00000060), LL(0x05a0028e,0xb7950225),LL(0x0e5094fb,0xf11a656a),LL(0x3eed5459,0xd3afccdd),LL(0xe6e4111f,0xc0d31cdb),LL(0x822775ae,0xfb39d140),LL(0x04034f9a,0x5954dd7b),LL(0x8adace51,0xc58c7b83),LL(0xeef24d4c,0xe9d767e5),L_(0x0000004d),
+ LL(0x0d2c0dba,0x7f21ed73),LL(0xfb8a9c16,0x300cbdfb),LL(0x12e137b8,0x22e8279d),LL(0xefc00fd0,0x173a4228),LL(0xe30fee24,0xaf4fb8a2),LL(0xaa67fa02,0x6171abf8),LL(0xda82a49d,0x418d47f2),LL(0x3ea61949,0x572fdfa4),L_(0x00000170), LL(0x96484020,0xbfe14768),LL(0xceb46b56,0x36fbf6b3),LL(0x2855bf4d,0xd4e1ce80),LL(0xeeceaddf,0x5130ec7d),LL(0xeb1ca189,0x57123316),LL(0xabed8057,0xb7e8b4c8),LL(0xcb8de9f3,0xa878fb40),LL(0x81b143a5,0x2fa96496),L_(0x0000008b),
+ LL(0xff728615,0x22b150de),LL(0x9a87c082,0xad76f636),LL(0x222ff210,0xf2177234),LL(0x874b4d66,0xfb6d673f),LL(0x7a63aa6f,0x559b847a),LL(0x1fb601b8,0x7f528818),LL(0x1d5a56e1,0x2dceae56),LL(0x159cad3b,0x64799ea5),L_(0x00000170), LL(0x78fbf962,0xc6717776),LL(0xfb840953,0xe6943ee3),LL(0x6c82ee1f,0x45986586),LL(0xa8804763,0xb2c01a1d),LL(0xd2e62027,0x81dd9ed1),LL(0x7ac9ecf9,0xa86a93b5),LL(0xea3ed52c,0xab42d43a),LL(0x9783c732,0x4badd572),L_(0x00000127),
+ LL(0x251ac5fc,0x4e7db852),LL(0x1ee36133,0x5d2ce89b),LL(0x7925fde7,0x344442cb),LL(0x7be13983,0x933fd989),LL(0xf818aa84,0x868cf674),LL(0xcf763eff,0x970119fa),LL(0x1161eea1,0x91b1cf2b),LL(0xf803b198,0x47f45bbc),L_(0x000001d3), LL(0xb92b375d,0x2871ba24),LL(0x03c6e820,0x946bbdda),LL(0x1e7f5b10,0x6d786c0b),LL(0x901e63e0,0xf905444d),LL(0x61291f2a,0xa07d991d),LL(0x26f8514d,0x5dd4a768),LL(0x8caa8bed,0xba23453d),LL(0x625c627a,0x55ae73dc),L_(0x00000114),
+ LL(0xb896a822,0x7616ee6c),LL(0x76716c8f,0x9e16dd77),LL(0xd9dc6964,0x424e43ef),LL(0x4f1ab6f7,0x3307372b),LL(0x853acdd0,0xb131b10b),LL(0xd0481561,0x6c779030),LL(0x8833d896,0xb43c81fb),LL(0xf49c69e7,0x013b71e6),L_(0x000000d9), LL(0x89994c4d,0xf6938c6c),LL(0xcb8f8364,0x7d7772d3),LL(0xb55fa4df,0x5c5bb6fc),LL(0xe309036f,0x87518233),LL(0x00458dd9,0x5ae0cb46),LL(0xab6a628e,0x80a93940),LL(0xd00141d6,0xe42dc460),LL(0xe62c337f,0xf594561c),L_(0x000001d5),
+ LL(0x89aca927,0xe8ff16d6),LL(0xd0f00eb5,0x060c9ece),LL(0x76dc2763,0x8d24bcf1),LL(0xe04a4e63,0x8049d5a2),LL(0x1f378724,0xad86dce1),LL(0xee568d6b,0xbd4ecf75),LL(0x064ed8ea,0x23b4afb4),LL(0x3066bb9b,0xe8ba5019),L_(0x00000062), LL(0xb55d56a1,0x16a5e07c),LL(0x0317cfe4,0xb05c4eb0),LL(0xe263fd3a,0x87619f5b),LL(0xe43b9d32,0x04548fa9),LL(0x5fe60636,0x1e3bb4ee),LL(0x177080d6,0x80dd88dd),LL(0x6b920ffa,0x50a4adb9),LL(0x6cf839eb,0x579a402c),L_(0x00000026),
+ LL(0xc3463c36,0xd3860f86),LL(0x51b92975,0xd751ffa4),LL(0xe9c89ace,0x0fff3b8f),LL(0x22e82df0,0x44ceed1d),LL(0x9ef4bd4d,0x322e7d38),LL(0xec43e5b6,0x5dafe91d),LL(0x3ac6cd72,0x385f22e0),LL(0xc23c7139,0xecc87ca1),L_(0x000001ee), LL(0x21e0fc81,0xd6515802),LL(0xfbf97dbf,0x72372941),LL(0x689ac9e8,0x4611974e),LL(0xce7740f8,0xe04ba0c6),LL(0x7a8f9746,0x7419caa0),LL(0x05b0cdaf,0x30755659),LL(0xcd257003,0x5af7e403),LL(0x8e3b2c01,0x7d54b47d),L_(0x00000128),
+},
+/* digit=51 base_pwr=2^255 */
+{
+ LL(0xe0e5a47f,0x06aeb844),LL(0x171b7252,0x2f67f278),LL(0x3ef95a8f,0x411d7c3d),LL(0x1341fdfb,0xbc9db5d5),LL(0x9c831f2c,0x64cd3d49),LL(0x5fa0db40,0xb8bb90a7),LL(0x2c8d72cf,0x050fdef7),LL(0x9770a986,0x584d26e8),L_(0x0000012a), LL(0xd8cc5f72,0x8a357b6c),LL(0x75fe114c,0xe1fc26b3),LL(0xaa2296d0,0xe2fe623c),LL(0xe037cba1,0xca73315c),LL(0x36843eb8,0xb7e86db2),LL(0xb5b70ddf,0x4b155e04),LL(0x20198f9d,0x06921394),LL(0x51535cfa,0xaa06d437),L_(0x000001a2),
+ LL(0x3bc9f5b9,0x89cc4566),LL(0x68f57feb,0xa2543b28),LL(0x4bd3cbd6,0x0bf63c0e),LL(0x66da5e56,0x648f4a56),LL(0xb7d9cc0e,0x7591427c),LL(0xab848b1a,0xe85c5977),LL(0xf4656829,0x4025667a),LL(0xcdae8f7a,0xab876527),L_(0x000001b4), LL(0x40ffbcdc,0x204ed818),LL(0x30db96c4,0x1b3e5e48),LL(0x26c352dd,0x497308c9),LL(0x54703369,0x3370174e),LL(0xa9534502,0x7c6d8497),LL(0xae86058c,0xae7aecbf),LL(0xa32e4cdc,0x67daf0b8),LL(0x3a4e9eb5,0xaf8dd7df),L_(0x0000005e),
+ LL(0x715a5a95,0x5b9e36c3),LL(0xe50c2a6e,0x316c41f6),LL(0x6af25999,0xe48ac795),LL(0x813a1e7e,0x65d44dd3),LL(0x7fc2f7f1,0x4d3b130b),LL(0x08cc4038,0x7c00e333),LL(0x4484ccd4,0x8e7636fc),LL(0xf9a80322,0x1688e5f3),L_(0x0000008f), LL(0x05247531,0x0987f80d),LL(0x2cd48e4d,0x9fe4562b),LL(0xaa48e7e6,0xf168a311),LL(0x7fdc1a14,0xdf4018fc),LL(0xc463e403,0x6c8979b5),LL(0xd6d0bb4b,0x62cddf39),LL(0xdf09f24f,0x9b318fce),LL(0xca7e6578,0xcab54343),L_(0x0000018d),
+ LL(0xe7511a46,0xd7deae24),LL(0xcb23734e,0x23939762),LL(0x66bcd84d,0x989a46bd),LL(0x85ec037c,0x65439883),LL(0xcc808ec0,0xa3f08c8a),LL(0x680dc66c,0xa76800e7),LL(0x4c3c5332,0xcc98ee9e),LL(0x8663204a,0xa0ef46de),L_(0x000001b0), LL(0x7fff2898,0x05b4a4e2),LL(0xb14e22b3,0x930a37ee),LL(0xe9d3141e,0x35f5cd09),LL(0x3364f154,0xf55ccf3f),LL(0x55f31352,0xf6c93770),LL(0x0c74549e,0x4bf80f61),LL(0x8d0207da,0xb1c2b15c),LL(0xafb6ee97,0x0992fd2c),L_(0x00000092),
+ LL(0xa33e3956,0xea69c80c),LL(0xc95caa93,0xdeca4025),LL(0x95bc2026,0xc8c86ea9),LL(0xe3161b91,0x73fc72d8),LL(0x46b441b7,0x033e25a4),LL(0x6b7c1805,0x2d4e9335),LL(0x5a4b1a06,0xd30b7dc3),LL(0x992637db,0xdaac9a90),L_(0x000001d5), LL(0x67f8c589,0x4f4c9063),LL(0xc14619bd,0xfbc662e7),LL(0x3c65896e,0x8176a953),LL(0x1c5790f3,0x4f51c6bd),LL(0x0ef460cd,0xc6fa754c),LL(0xee3cd226,0x5e872735),LL(0x05291b65,0x79e3b5c0),LL(0x734e1b22,0xfa256432),L_(0x00000194),
+ LL(0x5d2ebb4f,0x0643f252),LL(0xedb2cca1,0x00e32811),LL(0xc996f279,0x6f6af92c),LL(0xbf992edb,0xbdef8275),LL(0x3384462d,0xa4dd3d26),LL(0x818a7ff9,0x8e214401),LL(0x60e7694d,0xa7aec62d),LL(0x9d54e87f,0x8bdd2244),L_(0x00000198), LL(0xe4e67752,0xfb63c9fb),LL(0x7e7ff11a,0x7eec026d),LL(0xc6b3e18f,0xe08b80f1),LL(0x84b5c983,0x5d6b5a4c),LL(0x4b0fd4b7,0x85f99e3a),LL(0xfc4904ce,0x7afd5a7c),LL(0xc336a99a,0xba1e62f6),LL(0x24e4a736,0xbe20ba29),L_(0x00000195),
+ LL(0x8229817c,0xbb592469),LL(0x29ecccb0,0x89ef0925),LL(0xce6e29e1,0xf98f60f1),LL(0x36216c3c,0x0848c8bd),LL(0x63a73874,0x085409b9),LL(0xd4abc07d,0x2319eb0d),LL(0x0e39c02a,0x6bda97a9),LL(0x393de5dc,0x0140ddd0),L_(0x00000115), LL(0x6a8c37e9,0xa2f22a24),LL(0x54381101,0x423788d2),LL(0xb694bdb7,0xc151a89e),LL(0xd0ef2b67,0xb01ee242),LL(0x01c2b082,0xc07af292),LL(0x10fd1158,0x3639401a),LL(0x8e3f86e2,0x1ed8f101),LL(0xcf21ea60,0x83b3b62f),L_(0x000001fb),
+ LL(0x10fc7810,0x718c92f0),LL(0x3423f6e8,0xdae8d246),LL(0x5f129e35,0xaeff7db0),LL(0xdbad59f4,0x963932f5),LL(0x3cf82c0c,0xf5e468db),LL(0x6b7d10e1,0x10e6e23c),LL(0x6e085959,0xc76fb1b0),LL(0x538880e8,0xe8c12594),L_(0x00000134), LL(0xd87b6710,0x89506649),LL(0x272ea4f0,0x9dd1a14c),LL(0xaa274066,0xa6cc0d62),LL(0x191622f8,0x92244f6f),LL(0xd28338e3,0xc3dcbd9d),LL(0xa8dd7166,0xa39c0c61),LL(0x4930a90c,0xb979b8ce),LL(0x6cd41296,0xaa5c88b7),L_(0x00000037),
+ LL(0xe9bd2031,0x8ef889ab),LL(0x6a8258a9,0x87f34cfa),LL(0x6e977272,0x538468d6),LL(0x198bf996,0xe9cb2903),LL(0xea7ac40d,0x389f9bff),LL(0x50fd922d,0x88f4717c),LL(0xcb0c2bca,0xb57f0298),LL(0x5d670088,0x812c3767),L_(0x000000fa), LL(0xadbacbad,0xd95da33d),LL(0x89860058,0x74f4e9a6),LL(0x9df658db,0x46a06ddb),LL(0x8faf5c15,0x36b96ffe),LL(0xe9bbc867,0x1a07dce2),LL(0x19a59e1c,0x9536a09f),LL(0x1683c160,0x7fabb0f1),LL(0x183d2bdd,0x06b7a416),L_(0x000001d0),
+ LL(0x31cd955a,0x5451d16f),LL(0x720fff5e,0xeacd93fd),LL(0x6c62e42c,0x6f74fc83),LL(0xff9b7285,0x8a51db93),LL(0x7b6bb42b,0x66ca983e),LL(0x8fd893a3,0x08eee06f),LL(0x491c6c89,0xe1230942),LL(0x638e9f64,0x4984e580),L_(0x00000176), LL(0x979f347c,0x0bad9aba),LL(0x7b9d835c,0x84846555),LL(0x89b78779,0xc6bb325d),LL(0x88fce8c3,0x0fb571c3),LL(0x237c5f2e,0x27185f17),LL(0x37bcf483,0x53b0ac57),LL(0xf037df6f,0x34a972e5),LL(0x73b6f7ae,0xf685c7b2),L_(0x00000021),
+ LL(0x0e793769,0xfab07625),LL(0x52bebe14,0xd1fbd06a),LL(0x7d25c686,0xe5149dc2),LL(0x20b2f012,0x6707c1b6),LL(0xe4fdb06a,0x5cf7e0a4),LL(0x124b0592,0xdadcb97c),LL(0x9ef54e16,0x97f26141),LL(0x6b91bf50,0x689c475b),L_(0x00000165), LL(0x22cd2270,0x31ac5e9e),LL(0x95772aee,0xf333125d),LL(0xfb3bbb8c,0x906a459b),LL(0xda033a3e,0xd9a3800f),LL(0x7aebdf94,0xea08c76a),LL(0x4600cde7,0xecd96496),LL(0x1b4f8404,0xb9fdf8c7),LL(0x58389c23,0xd186fc48),L_(0x00000137),
+ LL(0xc0dd4ad7,0xace5575b),LL(0xabf66053,0x6dc5328e),LL(0x54861cbd,0xea9fdaff),LL(0x8555b123,0x0ecf823c),LL(0x09e411c0,0xa5d8934d),LL(0x0ae97a01,0x170ceb09),LL(0x91dabc9c,0x73c40a75),LL(0xd8f751f2,0x52861011),L_(0x0000010f), LL(0x3075cd88,0x352bc9a3),LL(0x79de4fde,0xf0130bb7),LL(0x2eb1b199,0x3c4457b6),LL(0xa95e2900,0xf04878d3),LL(0xc1a9dc9f,0xe04ebfee),LL(0x097a6545,0xf5aa7d0d),LL(0x673c7b41,0x3c5c4ce8),LL(0xa67894e6,0x385d1700),L_(0x0000005b),
+ LL(0xf3612ddf,0x16680fb2),LL(0x370df675,0xbeb0847a),LL(0xbefb427d,0xbbe54c19),LL(0x9a4770e1,0x44a1916f),LL(0x7f5945d3,0xc14ef507),LL(0x731b2da3,0x17aa92af),LL(0x07208217,0xf69f649d),LL(0xa27c5c7b,0xabd89463),L_(0x000001f1), LL(0x6897edfe,0xe551752e),LL(0x9733c080,0x98e86236),LL(0xc5bfef7f,0x936a2ebe),LL(0xcc36a721,0x25c227b9),LL(0x11dd6248,0xf8d96ae8),LL(0x83440604,0x3b2dca5f),LL(0xc74d7e75,0x3d8a998d),LL(0x3c210303,0xdcf4cf75),L_(0x0000019c),
+ LL(0xcbdeae01,0xe646d7ef),LL(0x2f349cfb,0xfd187fbb),LL(0x22f14a9c,0x7fb5a2ff),LL(0x781ef46f,0x084df701),LL(0xada115d8,0xab2e7da6),LL(0x37b36285,0x21432735),LL(0x779e5cbe,0x42159b5d),LL(0x987b1bb3,0x182d17ef),L_(0x00000121), LL(0x95d5c1bd,0x0c974b93),LL(0x3e904667,0x4f31ca20),LL(0xc9fa51be,0xed87df23),LL(0x5530167f,0x7ab1aee3),LL(0x34d6716d,0x16c8a7b3),LL(0xb3f82160,0xf3eb37b8),LL(0x77ee013d,0x13ff1326),LL(0xa57a3a10,0xd7d1a2e9),L_(0x0000007e),
+ LL(0x57c07bef,0xfafe3733),LL(0xb917d893,0x17024a0a),LL(0xfd27b406,0x89eda4ec),LL(0xcd3182c3,0x4e2244fc),LL(0xcec915fc,0x083e32ec),LL(0xbc2fe85f,0x26668631),LL(0x3458ec27,0x23dec845),LL(0x2e647e96,0x35986103),L_(0x000001e3), LL(0x26887044,0x9c1dd0c7),LL(0xc0f6c814,0xdb6594dc),LL(0x59eee455,0x2db7ed2b),LL(0xc7b946f5,0xc94ac2ca),LL(0x45521872,0x1f918bfa),LL(0xe23366a4,0x3439b349),LL(0x50d8220c,0x347cd4a8),LL(0xc2e30ec6,0x9274e0c9),L_(0x0000009c),
+ LL(0x28064668,0x18b3fd00),LL(0x605cfac8,0x11efdfd4),LL(0x85d2f0b8,0x5bb41efb),LL(0xee216714,0x3c03cac7),LL(0xade36a6e,0x485c4b2d),LL(0xcd3725a1,0x50bc220d),LL(0x2cf525a5,0xb11c84f3),LL(0xe314db66,0x664e47ac),L_(0x00000013), LL(0xe7d464c1,0xa7a48858),LL(0x6f7bbfd1,0x7d04c227),LL(0xe24ada56,0xadced466),LL(0x03a6a941,0x70addbb1),LL(0xf14e02c2,0xc761ca82),LL(0x94b62798,0x03264d07),LL(0xa0bec3f9,0x966e8d47),LL(0xe6caf618,0x1f211c02),L_(0x0000001a),
+},
+/* digit=52 base_pwr=2^260 */
+{
+ LL(0xb5b4bc19,0x26c24408),LL(0x1e48c2aa,0x2fb6cd86),LL(0x8746f93b,0x515690c4),LL(0x71e5f018,0x76a3c1b7),LL(0x99fbb28d,0x993035c8),LL(0xc338e004,0xa3d8d18a),LL(0xb4e7f02f,0x804c0351),LL(0x09fabf9b,0x3e6175e3),L_(0x000000f8), LL(0x485a0549,0xf6830680),LL(0xc1a8a622,0x50d94962),LL(0xf94a3f34,0x0a44d62d),LL(0x8057a83e,0x05319e21),LL(0xd2bed201,0x3a4a1ebd),LL(0x3d6076c1,0x7368f486),LL(0x4672ca13,0xef4b1a43),LL(0xf96135e4,0x6692537f),L_(0x0000000b),
+ LL(0x08fe30e3,0xb81b7a5e),LL(0xb048815a,0x11e1229e),LL(0x2e0a161f,0xecb84207),LL(0xf8e1801b,0x5b394a58),LL(0x890edfad,0x37512807),LL(0xb3e4e477,0x5d81f675),LL(0xc9984105,0x1050ce18),LL(0xf43ed35c,0x17bd56ac),L_(0x000000c2), LL(0x5a1e0055,0xcf0d6c8c),LL(0xaf53db5d,0x6ee72ddb),LL(0xc6ab4e4f,0x32c8481a),LL(0x1b4e6860,0x5c545af6),LL(0x0e7c0e41,0xc3595ad6),LL(0x261ffe75,0xbf47f59b),LL(0xf66fa7cf,0xfa1aaf6c),LL(0x212e7097,0x86b7977f),L_(0x00000083),
+ LL(0x619e46fa,0x4b0029a7),LL(0xf5c33307,0x1eec5f29),LL(0x9e45f3bb,0xf8396133),LL(0x17635aad,0x25d3e2a3),LL(0xbdaba508,0xc34ef799),LL(0x574f4d09,0x78d47f38),LL(0x085e8086,0x3db03879),LL(0x1c4a5748,0x65ae9f6d),L_(0x00000144), LL(0xcaebc4bf,0xb52fb74f),LL(0xb901e46e,0x1868eef4),LL(0x68ec4a86,0x7bab1199),LL(0x9f2f51a0,0x8f19df10),LL(0x6a75a074,0x2d75da4f),LL(0x61385965,0x59f7f255),LL(0x60c80677,0x6b7b569e),LL(0x40b66382,0x0533f4d4),L_(0x00000145),
+ LL(0x4c4911e4,0x3b8e6670),LL(0xd20de07d,0x7aafab5a),LL(0xdab27e9b,0x3fb66eb5),LL(0x5ac52dbe,0x7ce85634),LL(0xdf84c8cf,0x9025496c),LL(0x95b8e1e2,0x776182f0),LL(0x8e6db4cd,0x21aaa54e),LL(0x3bb0faa3,0xe73fef00),L_(0x0000008a), LL(0x4fac454d,0x16d643fd),LL(0x70e138d6,0x5612fc48),LL(0x69ca59b8,0x0889a9e6),LL(0xfb3a26a0,0x93e3dad6),LL(0x43df1bc0,0xe6ce66bb),LL(0xae036271,0xfcd4244d),LL(0x05182a82,0x958ca2ac),LL(0x102559d8,0x26838c85),L_(0x00000075),
+ LL(0xcc2f3836,0x0184b954),LL(0x6cd88b38,0xdcf3ba77),LL(0x70c99422,0x86f66f43),LL(0xbc4bd450,0x7b81c0e8),LL(0x93575c5f,0x704cad24),LL(0x4091825d,0x4b9f70ce),LL(0xf1ff4bbf,0xac2a0a24),LL(0xb5d28bd9,0xe5ebf7a3),L_(0x00000023), LL(0xbdf9c155,0xeb270e7e),LL(0xeb783548,0xfd0b1050),LL(0x81562bc5,0x96b8a59a),LL(0xedb5f688,0xbc130375),LL(0x8ab1fc73,0xa1c5bd93),LL(0x89b28fea,0x7f18c19c),LL(0x8d6e4b1c,0xe98a494f),LL(0x409f7384,0x55131bf6),L_(0x0000003f),
+ LL(0xd9331dcc,0x25a27923),LL(0xffb6351b,0xc9bc2f04),LL(0x7f29f1e1,0x91e80528),LL(0x37069b7d,0x8a56cb26),LL(0xff75d6d4,0x7d9a9a20),LL(0x3f52dd39,0x52270b39),LL(0x703dee3c,0x67288a63),LL(0x13f9c1c2,0x49651d47),L_(0x00000038), LL(0x3c2dd2e1,0x1cd56c85),LL(0xbc1a8d52,0x46598a93),LL(0x87351736,0x4685de4b),LL(0x418967ee,0xf35701ef),LL(0x6dbbce4c,0x380b116b),LL(0xc5acf7cf,0x35416b03),LL(0xe839b424,0x8d1a9cff),LL(0x15841fbd,0xe1730d1f),L_(0x000001a6),
+ LL(0x9958b964,0xc0fdbea9),LL(0xf76bf65a,0xf573be01),LL(0x0c6778ad,0xffd85a6f),LL(0x927d0f51,0xfe98c72d),LL(0x1738874a,0x187e8ec8),LL(0x032ae57d,0x00c6d76d),LL(0xdf95e888,0xdee55d14),LL(0x0dec4042,0xcd5760c3),L_(0x000000e8), LL(0x4c10f002,0x14eac108),LL(0x7bdb463a,0xcbf771c3),LL(0x76281603,0xd48543b5),LL(0xfc634037,0xb965ac3e),LL(0x6e5426f3,0x49a7be5b),LL(0x87fba366,0x2e203d0f),LL(0xddb5ca9f,0xabbc3174),LL(0x55052649,0x2eb60836),L_(0x000000b7),
+ LL(0x1438294a,0x5c1bc4f6),LL(0x64a43b5d,0x1c634029),LL(0x5d7c2617,0x93c0fb82),LL(0x1b7967cc,0x96145dca),LL(0xd068364b,0x3b5c4ddf),LL(0xec5bd3c7,0xd5007f0e),LL(0x2d7bf8f0,0x771d6fd8),LL(0x215b93c7,0xf222990f),L_(0x00000075), LL(0x47223677,0x1d26e01b),LL(0x340c9a0a,0x04b5b926),LL(0x7edb2bec,0x0417ca25),LL(0xefd5d17d,0xb41c7280),LL(0x70df3372,0x93c942f6),LL(0xfbfcef99,0x7e3d7910),LL(0x37ef3a57,0x39005c54),LL(0x8c4d4c90,0xdb0ceb3a),L_(0x000000dd),
+ LL(0x7626a28b,0x65b80a9e),LL(0xb3de9aec,0x47955751),LL(0xebd70107,0xb9795325),LL(0x326b6e2a,0xb7ebfc01),LL(0xb10f9b62,0x6ec48711),LL(0x145049a1,0xb7dced78),LL(0xd8c85f83,0x6736770f),LL(0xf3878209,0x41fd70b3),L_(0x000001ea), LL(0xc5d35978,0x1245bc60),LL(0x228424d3,0x6d611151),LL(0xee80416f,0x92f6a019),LL(0x18ef86e2,0x2e88fbc7),LL(0x9f5d9f5c,0xb51a1205),LL(0x3ee14394,0xd989aea0),LL(0xe73a0ff8,0x81623fdf),LL(0x10ed321a,0x3d71a6e8),L_(0x000001dd),
+ LL(0xe8302688,0x98f6bd7a),LL(0xef684d8d,0xaac1e35c),LL(0x1c71e036,0x19611929),LL(0x9428ed8d,0x24f7251a),LL(0xf90f6e8a,0xcd34ddd1),LL(0x9742ae40,0xf7d22290),LL(0x9b5b15a7,0x5d805418),LL(0x91f1f6ec,0xe50e28f5),L_(0x000001c6), LL(0xd9e75a63,0x2c60d848),LL(0x5ad92240,0xf18911d8),LL(0xcfb4c90b,0x3c5b71d6),LL(0x1a2c26ff,0x5d53d732),LL(0x9fada03e,0x8bfbe9ec),LL(0xd69c81a8,0x443458b3),LL(0xce7f11ce,0xca59b490),LL(0x2489ddd2,0xdaf9ecde),L_(0x0000011d),
+ LL(0x75cf30c3,0xd052454d),LL(0x6844d9d2,0x667d1be2),LL(0xec3032ef,0xefd476cd),LL(0x67f7c660,0x47628345),LL(0x80c64c50,0x57751538),LL(0xbb8da5d7,0xb8ef3bee),LL(0xb395bca7,0x3bc2ad45),LL(0xc2e7e012,0x610d67aa),L_(0x000001ca), LL(0x2180bc90,0x3dc2b1ef),LL(0xf5d2b364,0x4ee3fb91),LL(0x38966853,0xe0446916),LL(0xc5fb0623,0x2a6bfc98),LL(0x6bce11c9,0x65c6b297),LL(0xeb6233b0,0xce8c355a),LL(0x6ac473c3,0xd97c1dd8),LL(0x56091541,0x0514bb6d),L_(0x00000023),
+ LL(0xb9480e26,0x92033f14),LL(0x17a6ef25,0x89a53d65),LL(0xaa5a50af,0xd872b73d),LL(0xa475ab82,0x53f65ce3),LL(0xe34acbbd,0x1d33affd),LL(0x33a80ee5,0xe7690066),LL(0x969e21f0,0xcc415a0a),LL(0xca2e0920,0xb0325f4a),L_(0x00000150), LL(0xa1f546f1,0x0f43e61e),LL(0x40fc3a90,0xa48abf41),LL(0x601d8bcd,0xe374c532),LL(0x786a5e70,0x7446fbbf),LL(0x484d4fec,0x0ec5b3b2),LL(0xdc5db3b9,0xeeb6c43c),LL(0xe60cf40d,0xca2ac048),LL(0x1ff63739,0x4475d66f),L_(0x000001b9),
+ LL(0x21d05128,0x9adfc451),LL(0xe4847519,0x294337f9),LL(0xbe446976,0x4e7dac1b),LL(0xf00a5441,0x94ab8aec),LL(0xc582caec,0x5ac9bb3b),LL(0xeacdc76b,0x3fe0e66a),LL(0x6e00689b,0x246c86c1),LL(0x6c266a0e,0xbf0ade72),L_(0x0000015c), LL(0xe7ec8261,0x70658a73),LL(0xff30554a,0xc9871f1a),LL(0x4b2448f2,0x8dd50a2b),LL(0x87a01756,0x3ea8f62c),LL(0xb6b9a2ea,0x7311e04c),LL(0x0d165122,0xfc6c9f2d),LL(0xb7efc2eb,0x07406007),LL(0x92c33ebb,0xbd8e5282),L_(0x0000001b),
+ LL(0xd9c24f49,0xe495d18f),LL(0x9b0f5222,0xac5ca929),LL(0x126086f0,0xf4d4507f),LL(0x41908fc8,0x3355d26d),LL(0x65791c82,0x31183a9c),LL(0xf00a9e80,0x018f0189),LL(0x644ffd95,0xe447af71),LL(0xbffa0975,0x7424f93b),L_(0x00000145), LL(0xfa695a18,0x0d6949a4),LL(0x78519510,0xb79c2b5f),LL(0xa59828a5,0x9ae92003),LL(0x6c54e38e,0xfb93be38),LL(0x67bd521a,0x4c71aeb4),LL(0x04b0340d,0xa3451e4d),LL(0xcd2e92f4,0xa9a77ad0),LL(0xfe218b65,0x656db073),L_(0x0000000f),
+ LL(0x30e20be8,0xa3b27cf0),LL(0x160f039b,0x82ec5f83),LL(0xcff71736,0xba9364b6),LL(0xebc485a6,0xddbcec8c),LL(0xdc80329f,0x3bda1715),LL(0xcc71e664,0x46fc4c3b),LL(0x592819ef,0xd1da3eb7),LL(0x2cb62fe8,0xb29cfca6),L_(0x00000055), LL(0x566fd9f2,0x8c802541),LL(0xfc158c58,0xe84b30eb),LL(0xf6625ae1,0xd137d022),LL(0x441de79b,0x42e42c6f),LL(0x7d99126c,0xf2ec0ec8),LL(0xfbbd41bb,0xb8f928d4),LL(0x2851ec63,0xf3ff5c1d),LL(0x5e5a9ca7,0xd3429e7d),L_(0x000000f5),
+ LL(0x4a3ce076,0x56a3a063),LL(0x8d143249,0x627718f3),LL(0x2232fc35,0x5a0479ef),LL(0x6a6d389e,0x82744b80),LL(0xf4d435b8,0xb0bd687a),LL(0x2792b960,0x4cecd317),LL(0xf792e60e,0x063be911),LL(0xb09dcb17,0x02f6ffb4),L_(0x00000059), LL(0x215ba3da,0xb04fbf6f),LL(0xe7c66f8f,0x07b90918),LL(0x95b38bbb,0x01c5b207),LL(0xc67022d2,0x4fdf3937),LL(0xee01b834,0xe5a11142),LL(0xc7b97506,0x11b8cb5f),LL(0x2ae40433,0x2450b7bc),LL(0xe3e1937f,0xa26a70cf),L_(0x0000005f),
+},
+/* digit=53 base_pwr=2^265 */
+{
+ LL(0x6bfa5396,0xf2fdc439),LL(0x7edbcb88,0xdb91292b),LL(0x19d35421,0xd5dee79a),LL(0xa420a538,0x035e9ea2),LL(0x9cf14f3b,0xe21709fe),LL(0x49703f94,0x690ca5b7),LL(0x495b47e8,0x4deb7af2),LL(0xcc2ef057,0xb09d6324),L_(0x000001d4), LL(0x9fe6e0b5,0x7ff7df3b),LL(0x25c764e6,0x1593ef9e),LL(0xb9153d85,0xef6d9489),LL(0x117822d7,0x238e5449),LL(0x1e34e4c9,0xbbd3333b),LL(0x58cc8198,0x416c6cfb),LL(0x7b487650,0xa8085b4b),LL(0xb3068c07,0x5e20cc8e),L_(0x0000017b),
+ LL(0x4bef6871,0xf98b837d),LL(0xe15922b2,0x62c29919),LL(0xc8afde9c,0x95a1a3c5),LL(0xffe9534c,0x604b1043),LL(0xfa2f638f,0x27a01a13),LL(0x04cd8a8d,0x2660393b),LL(0xe26fd0c2,0x72545d96),LL(0xcf0808a0,0x1dd10699),L_(0x00000187), LL(0x4ea56b71,0x037dfe3a),LL(0xc38223ef,0xd36e2094),LL(0xe8b66c87,0xe28405ae),LL(0xe3e2766e,0xa065b535),LL(0xed4b87f0,0x084a317d),LL(0x3f53ac0b,0x0ca5866d),LL(0xa0ee5586,0x82b21bd7),LL(0x1fa70803,0xff1d58cf),L_(0x000000f3),
+ LL(0xa39a68fa,0x905b2c93),LL(0xef13c9b6,0xd34ff12d),LL(0xa5eaf60e,0x46115d13),LL(0xad4eed45,0xc0704820),LL(0x0761b0ac,0xf0c499c6),LL(0x5dd51e45,0x4abd13af),LL(0xa978e552,0xb1ec09b7),LL(0xa79f811d,0x0dab7d3a),L_(0x00000190), LL(0x490481e8,0xa75f21e6),LL(0xea3d3b19,0x0364a9c0),LL(0x68df5edf,0x5e1d6b4a),LL(0xb44c93c9,0x33e2dcc0),LL(0x07832283,0xea8fc7be),LL(0x37cb9512,0xe9e13504),LL(0xc965c20f,0x887068c5),LL(0x62d3176a,0xe870a541),L_(0x00000004),
+ LL(0xc2984a5a,0xf1dd3a67),LL(0x7824703a,0xb39c772c),LL(0xbf0c69c5,0x46f942bc),LL(0x31d0901a,0x9e0174be),LL(0xd38bdff8,0xab6326f7),LL(0x91bfcc1e,0x8787eadb),LL(0x541868bb,0xa0385662),LL(0x6ba48a8b,0x6d878761),L_(0x00000060), LL(0xd5f8e883,0x69e290f5),LL(0x1d33d545,0x1ba52eb4),LL(0x662b634f,0x9dfd1d1b),LL(0x876fc504,0xbe51c909),LL(0x93e42059,0xcb7406ba),LL(0x49355b9d,0x2651475a),LL(0x8963ea18,0xbcf76704),LL(0x08985cee,0xaa85c805),L_(0x0000002e),
+ LL(0x2c70c50c,0x6c2616bb),LL(0xeb31ab0e,0x01e38aad),LL(0xbcd43f2e,0xda068909),LL(0x7f990c18,0x9fb2c072),LL(0xa82ff220,0x757bff88),LL(0x81327a89,0x28c2afd8),LL(0x1d3a1126,0x0c2079b4),LL(0x95685773,0xa957db38),L_(0x000000bb), LL(0x4a7cdb09,0x45f5c72a),LL(0x53fe6703,0x42ce353e),LL(0xbe22096d,0x4a3251c0),LL(0x601d33ed,0xaaaf17c5),LL(0xfe2c8cbc,0x3d4b4185),LL(0x242a9581,0xb32328dc),LL(0xbc79d78a,0x03bf4442),LL(0xa103c8f5,0x64e28853),L_(0x0000010c),
+ LL(0x1346edbb,0xb447a9f7),LL(0x2f9482b0,0x31ede472),LL(0xc7c55120,0x00d8bc4d),LL(0x627457bc,0x5c471ca7),LL(0x4a9f36d6,0x14a28cac),LL(0x436c70c1,0x38a173b4),LL(0x011c4897,0x96f4df0f),LL(0xdde3c9d7,0x587a661d),L_(0x00000193), LL(0x711723c4,0x143023ce),LL(0xbe0156de,0x68012aa1),LL(0xeabfa04c,0x3ed6803f),LL(0x204765fc,0x762dc13e),LL(0x2e5fcd9a,0x5b5cd65c),LL(0x04a542e1,0xd6b6a2d7),LL(0x3dcadeb8,0x57f74a74),LL(0x0da1060f,0xe953f87b),L_(0x00000148),
+ LL(0xfb1dd3f1,0x326c0546),LL(0x63e8f854,0x35eb9eac),LL(0x39f46433,0xf4944efa),LL(0xc8688704,0x91ff1606),LL(0xfeaa7186,0x99316708),LL(0xa92605cc,0x3fbb0f25),LL(0x2252affe,0xa90598c4),LL(0xcbb64aaa,0xb34934f1),L_(0x00000044), LL(0x58a7e6fc,0x763915ed),LL(0xc814b6b0,0xe697e570),LL(0x69866f7d,0x63fc73af),LL(0xb1f0f7a2,0xb634f283),LL(0x17533e2f,0x423d910b),LL(0xe17bdbad,0xfbcd888f),LL(0x778dac12,0x4c46f8f4),LL(0xfb0bef09,0x72d4d626),L_(0x0000017f),
+ LL(0x1eb22917,0x13b5648e),LL(0x34c2f6e4,0x202b7ba7),LL(0x8535398b,0xebd7f177),LL(0x7eea8b23,0xd3b0fc5e),LL(0xc7a0f19f,0xa3df55dd),LL(0x577641e2,0xcb9f261d),LL(0xf496646e,0x112454e8),LL(0xdaf2be9c,0xc23da6a9),L_(0x00000002), LL(0x2fed679f,0xe59d35c5),LL(0x1efd66d8,0x1b401767),LL(0x904f29b9,0x084f27ae),LL(0x129c352b,0x23e88566),LL(0xa3263601,0xd229faae),LL(0xc04620cf,0xc91c87f4),LL(0x535f695e,0x27c58545),LL(0x3cfc2a21,0xc94873fa),L_(0x000001a1),
+ LL(0xde0ea503,0xb13cb473),LL(0x88b9f2da,0x2dda613b),LL(0x3a43eba4,0xedbf11f5),LL(0x9cddb3f6,0xdf7a9b8a),LL(0x1e00c8ae,0x7e0c7ceb),LL(0x84c5eb6c,0x03d1dbf7),LL(0xc6747572,0x80122fe1),LL(0x5d6814d2,0x639c5254),L_(0x00000002), LL(0xde3b211d,0xec1fdac5),LL(0xa4651a82,0x690ed4f8),LL(0x4ef3c551,0xe2f0cf8b),LL(0x20e94507,0x61b6144a),LL(0xeb258124,0x11bde361),LL(0x51d9d605,0x541da730),LL(0x397e8ce6,0x06c00c29),LL(0xb4a5d672,0x43c098bc),L_(0x00000086),
+ LL(0x344f5276,0xf6656606),LL(0x82cb8136,0xd96edef6),LL(0x84c50ccd,0x9f0978ff),LL(0x37e0a146,0x17bb0d3a),LL(0xbf780900,0xb2dca4ae),LL(0x1d528632,0xb6bd3e16),LL(0x1bee4b87,0x8c609327),LL(0x16432d3a,0x4aa7829a),L_(0x000000d7), LL(0x09d85506,0x3f9c377c),LL(0x5046622f,0xa18dda52),LL(0xd98abc09,0x722fdd39),LL(0x23fb42b0,0xa78f3825),LL(0xf2a75675,0x13487db2),LL(0x33200560,0x244aa1c4),LL(0xc0bf37b5,0x86de25a6),LL(0x57b73e86,0x079d95dd),L_(0x000000bc),
+ LL(0x0ca7835c,0x17341b4f),LL(0x1e7f52de,0x52ebce6c),LL(0x882af4b0,0x673d8b9f),LL(0xbbd95fb1,0xd64ea8ef),LL(0x28e628db,0x7889079e),LL(0x54b7908d,0x26e0abe9),LL(0x3df2e6e8,0xc20813db),LL(0xfde7f3a9,0x978bffe2),L_(0x00000098), LL(0x280276f0,0xead10e9e),LL(0xad34ad6f,0x1076d303),LL(0x8df8f495,0x8819ee4a),LL(0xc0d57db8,0x70fb03b5),LL(0xb14472ea,0xbc0a100a),LL(0x18cc104f,0x7fbf87ac),LL(0x45839e8e,0x64d66536),LL(0x58fe7198,0x5bfbac43),L_(0x00000156),
+ LL(0x13d8a69c,0x1836614b),LL(0xcb97f199,0xc897ce78),LL(0x6d967571,0x940b810e),LL(0xd145156b,0x850c5939),LL(0x4b73e9e6,0x04a9944a),LL(0x6e833bad,0x2f7df8e9),LL(0x2cd53823,0x3b222e7b),LL(0xf7a26c91,0x1034f78b),L_(0x00000054), LL(0x40490586,0xfe320dfb),LL(0x5c8c95a5,0xcb9240ce),LL(0xfffec63d,0xc515192c),LL(0x000718b0,0x4259ce4f),LL(0xdbfc0155,0x6f7a6ff2),LL(0xb1ff6013,0x312bdeae),LL(0x4cc245a6,0x79a65a6f),LL(0x29aa5006,0xd3b4632f),L_(0x000001b1),
+ LL(0xba9ed328,0x356fabd3),LL(0x9eb2fa3e,0x32e2213b),LL(0x296648f1,0x5464f17a),LL(0xa0bf8f36,0xf19ca8ef),LL(0x4c8a5c7a,0x876e29a8),LL(0xa58d7e8a,0xd8f86aee),LL(0x0ec00506,0x04f4e1a3),LL(0x05b4072d,0x1462f8a1),L_(0x000000c1), LL(0x5e326e7e,0x564895eb),LL(0x5b19fee9,0x8c62d05b),LL(0x7809d8ab,0x0cb573dc),LL(0x4ad42bc1,0x1884e984),LL(0x9b3e8a9c,0x6b2d6773),LL(0x2d81f0f3,0x072385dc),LL(0x2f91b4d1,0xca372aa3),LL(0xe4038277,0xd16c3a45),L_(0x000000fa),
+ LL(0x5060d8be,0x9757a335),LL(0x1143084a,0x38952f06),LL(0xa4710659,0x025fc38c),LL(0x1698caaa,0xcf127f48),LL(0x7f55805b,0x39cb3c58),LL(0x621feb96,0x58068b85),LL(0x3a91b62b,0xa4e48dd8),LL(0xa7ba8220,0xbd22ff75),L_(0x0000005b), LL(0xfc09c649,0x05196c43),LL(0x142e4222,0xaa56e765),LL(0xeee6393d,0x8f13ec6c),LL(0xa88f8eb7,0x536554a7),LL(0x6720e144,0x66972f38),LL(0xadb6408b,0x9d95e37f),LL(0x67ab92ba,0xe96c2792),LL(0xa2d1345c,0x3fb8e9b5),L_(0x000001a7),
+ LL(0x945df86e,0x61c11852),LL(0xf484baad,0x1e71dab0),LL(0xad2e9168,0xe0ea71a3),LL(0x6e1a90b0,0x2b244009),LL(0xfb37ada7,0x0bd3281f),LL(0x38140203,0x1599d34d),LL(0xf278746c,0x3790a7db),LL(0x17f577dc,0x483a5cb9),L_(0x00000049), LL(0x22a84857,0x8f5c56dd),LL(0x6ec17c1a,0x767ebf21),LL(0xf0a141c4,0xf1091ff1),LL(0x051b5811,0x3ac1c024),LL(0x396942d9,0x692ece19),LL(0x5725cecf,0xf1e6de73),LL(0x75b56339,0x2f629ac2),LL(0x45030754,0x6207c855),L_(0x0000005d),
+ LL(0x8f44cc57,0xd14b028b),LL(0x8c73e470,0x684d5fa1),LL(0x46af781c,0xeb44feae),LL(0x3e3aadf0,0x4610320e),LL(0xfd9c5960,0xd8fffa44),LL(0x70d9d9d3,0xebbc9082),LL(0x8a6283f3,0xfcec5348),LL(0xdd60d649,0x44a603fa),L_(0x0000001d), LL(0x3023df31,0xce740ae3),LL(0x5f6a91eb,0x2000b013),LL(0x3780772b,0xe7ea71ec),LL(0x0e54747a,0x6f03b13d),LL(0xfc299d7f,0xd6603e33),LL(0xb6e9df68,0x86040d28),LL(0x2043747f,0x3aeee37a),LL(0xe4608968,0x9926fb8d),L_(0x0000004e),
+},
+/* digit=54 base_pwr=2^270 */
+{
+ LL(0x70b9e18f,0xabb9ad39),LL(0x6af8e430,0x523480bf),LL(0xf59d55e6,0x4bc56b8b),LL(0xc072bd61,0x3df0a6ec),LL(0x25c98f18,0xbee1786d),LL(0xbcc84059,0xf26f3fea),LL(0xb20a09a6,0x79a2dfb7),LL(0x93d600ce,0xcf2e6f03),L_(0x00000139), LL(0x3507cb80,0x9b72a39f),LL(0x2b1470af,0x4804a704),LL(0x7da313b0,0xe67c9622),LL(0xc290e590,0xbec90ccc),LL(0x796f29ca,0xf5e76e6a),LL(0xcadb620b,0x8ec01637),LL(0x15b03af3,0x4087520d),LL(0xd8dcf763,0x6c0ca6b7),L_(0x00000190),
+ LL(0xc34630d4,0x4f37e57a),LL(0xc030f2d5,0x649effc2),LL(0xb84aa880,0x3ad19d77),LL(0x1cab55a1,0x91bd296d),LL(0x8c081620,0xc8f7f0b2),LL(0x0c469726,0xb847d758),LL(0x1840b8cf,0xc59a8b12),LL(0xc8fd3c1c,0x0e2778fd),L_(0x000000b9), LL(0x2f98900f,0x446cc1f4),LL(0x3bf2f826,0x4fc8626c),LL(0x8d5f8bb7,0x7df08423),LL(0x3a877c74,0x41c77ea1),LL(0x471d935d,0x5556d8fe),LL(0xe98cde5b,0x279a8287),LL(0x068f4d40,0xe400538c),LL(0xdb305a88,0xc091d74b),L_(0x00000077),
+ LL(0xe7143fd6,0x766c809c),LL(0xdd78e4e1,0x81bcdd43),LL(0xa933555b,0xac8729aa),LL(0xb8964c85,0x4f18e8ec),LL(0x87096359,0x580f05ae),LL(0xffab1de5,0xe800a6a9),LL(0x797b2184,0xb6212cc3),LL(0xea98c5ce,0xc923afe4),L_(0x000000f1), LL(0x9f968c46,0x66353c22),LL(0xfe0b78e5,0x0345fac6),LL(0x27358467,0x180e49dd),LL(0x1ccff0c2,0x92bcdaf0),LL(0xea3ef331,0xf7e4fb3d),LL(0x99b89e87,0x092ef793),LL(0x9bdcca2a,0x1418dec5),LL(0xf9f9dccb,0x314595b4),L_(0x00000067),
+ LL(0x12cf8643,0x6e190a6f),LL(0xeee766f8,0x360709e0),LL(0x5b775cd5,0xd4566a98),LL(0xe4057c69,0x45df1e07),LL(0xc0672257,0x947733f9),LL(0x1b1c2a5a,0x4bcd6e2b),LL(0xc80987a2,0xe7293fbf),LL(0x89f4061a,0x11f7042b),L_(0x000001d7), LL(0x41e791cb,0xc53c1b03),LL(0xdaedd9c1,0xc48bf537),LL(0x495a12d7,0x2c8c9765),LL(0xe7c2d4a3,0x662fe9df),LL(0xfaed525a,0x27c6bad9),LL(0x5c4df70a,0x24dd660c),LL(0xba7fb076,0x21abac8b),LL(0x4a91b1d6,0xb618ce5d),L_(0x00000171),
+ LL(0x3e132643,0x7875f26a),LL(0x3212d16b,0x3953e4c1),LL(0x80a99a23,0x42f909d9),LL(0x457c9b9d,0x68f18c26),LL(0x62cfee59,0x0b1b0fbd),LL(0xd6e74f93,0x99d73ca6),LL(0x898ff611,0xecc60074),LL(0x0a0cf8cf,0x0e4b48e0),L_(0x00000082), LL(0xd0fa33dc,0xd086fac9),LL(0x30dd79af,0xe0e34e51),LL(0x0cb837fd,0x052d2441),LL(0xaefa0933,0xbdea4988),LL(0x44aec8de,0xdfac83ea),LL(0x46cb2469,0xfad769d2),LL(0x7cb77050,0x18dd28c7),LL(0x8001a60c,0x8fe3d888),L_(0x00000122),
+ LL(0xbc9cb5db,0x5b24df92),LL(0x2affa8b5,0x207215e0),LL(0x3c816de9,0x199ff528),LL(0xe11ab159,0xfcc61eda),LL(0xc8d67190,0x661fbf7d),LL(0xdda50129,0x76defd37),LL(0xd466e3a4,0xf14fb3e4),LL(0xc11ac280,0x7620efce),L_(0x000000d8), LL(0xd730b74c,0xb257b1f0),LL(0x4204720c,0xa9d04719),LL(0x620bab0b,0xcf599cb7),LL(0x4b89783a,0x4c38e784),LL(0x96aa7914,0xa4374ec1),LL(0xa42b74a4,0x1d57fa44),LL(0x5d9da37f,0x9e98081b),LL(0x907073d1,0xd1274d9a),L_(0x00000007),
+ LL(0xcbfb13a3,0x3e1d7c3a),LL(0xde4b8ce4,0x0940b9c2),LL(0x3515847d,0x594f371d),LL(0xc37d20b4,0x0d44e03d),LL(0x4b2281a5,0xa133895a),LL(0x03246afc,0x69dc40a2),LL(0x1243d0ed,0x6acc7d98),LL(0xc664eb78,0xa9ddc8a1),L_(0x00000041), LL(0xfe1862dd,0x1a66ad76),LL(0x3359c96c,0xebb34cc8),LL(0xe69f9794,0xd1662749),LL(0xf9f1455f,0xb162a274),LL(0x40fc34f6,0x9d860e20),LL(0x4fb62774,0xa70d36c2),LL(0x6f971a18,0x990d79fe),LL(0x19225101,0xdd30d9b3),L_(0x00000102),
+ LL(0x0a7a3999,0x51c91503),LL(0x673999f7,0xfe14668b),LL(0x08c22b2a,0xfc300d5b),LL(0xecabf6a5,0xe178c0bc),LL(0x020b90b3,0x79d38258),LL(0x81c171fe,0xa2f11763),LL(0x86f32623,0xf3a66cde),LL(0x6ff64b9b,0x5668f5ac),L_(0x000000c5), LL(0x6e735d95,0xac181251),LL(0x3ea58c5d,0xde279aea),LL(0x356a5f10,0x7e9f7153),LL(0xd08295b0,0x86ce9eb4),LL(0xf7c783f5,0x4daab1a3),LL(0x030b2d7c,0x603300a0),LL(0x2198f316,0xd0c0475c),LL(0xba184aa9,0xa6fe88ca),L_(0x00000111),
+ LL(0xdf1983b7,0xade6d9e8),LL(0xaf408fd2,0xfdbd3baf),LL(0xf2f9bf1e,0x437c785f),LL(0x502fb232,0xeb964445),LL(0xeaf5771f,0xb08bd2ce),LL(0x4c23d40b,0x71ed9783),LL(0xa9fbdb0a,0xf481a53f),LL(0x3a79f04f,0x8241d897),L_(0x0000006c), LL(0x2c38aa60,0xdbc73cb0),LL(0x6c1463d2,0x900c1c58),LL(0x38e9d58f,0x9115aabb),LL(0xc0a95554,0xd544f068),LL(0xb7066734,0x00d18a77),LL(0x10cc9da3,0x482d67a5),LL(0xf9d64b4f,0xfe8b6e80),LL(0xff8c0ceb,0xa32070d7),L_(0x000001c3),
+ LL(0x8777fa77,0x1fdd6bf9),LL(0xbe1106f7,0xc44a87ae),LL(0x43749975,0x3d0c3b77),LL(0xb45ea397,0xf0fbd03e),LL(0xd44cf903,0xb4c5c47c),LL(0xaa4a5ca8,0x38153aea),LL(0x2980014f,0x58f964fd),LL(0x7baccd46,0x2458a3d8),L_(0x00000059), LL(0x9360b528,0x9c8ef0d9),LL(0x8ec22b8f,0x99582fc5),LL(0x2b8aa8c6,0xd629663b),LL(0xcebbdb32,0x2ff405c2),LL(0xbd666f05,0x8989d659),LL(0x6c986174,0x2eb13e6b),LL(0x7fa4c2f5,0x5660e9a9),LL(0x30206c27,0xcd2e9b5f),L_(0x0000017c),
+ LL(0x970525d5,0x1b2c97bc),LL(0x3e8c6c5f,0x97ea6bef),LL(0xe6975580,0x1fa05de0),LL(0x45dcf226,0x28ce5e22),LL(0x6b3296e1,0xbc5ea09c),LL(0x355e867e,0x171e0d4c),LL(0x93a02b45,0xef953fca),LL(0x72562a6a,0x283e85d5),L_(0x00000050), LL(0x8028e2f9,0x00384cef),LL(0xc61925fd,0xb15e2b9b),LL(0x98c42ea4,0xe51f203e),LL(0xa9da7eaf,0x80b7c7d8),LL(0x00d05b8b,0xd0e8cb9d),LL(0x5b984aa6,0xe2223126),LL(0x97eb783a,0xcbd154b4),LL(0x60eeeb46,0x77d65106),L_(0x00000025),
+ LL(0x0193b1f2,0xecba5c8d),LL(0x4c52e9d2,0x1a2c0764),LL(0x084d971b,0x04071452),LL(0x5b00ba29,0x420810c9),LL(0xe37ace16,0x8726c12e),LL(0xfb3b3465,0x76e95cdb),LL(0xddb8f121,0x5a782ea1),LL(0xe1266546,0x9e91fb9e),L_(0x00000198), LL(0x5245f9b1,0xde0c16d5),LL(0xb01d1b1a,0xcdfa5a5a),LL(0x186cc016,0x907f643d),LL(0x951f20c1,0x19ce2692),LL(0x499758b8,0xa1e463db),LL(0xae173a15,0x1a60551b),LL(0x9960164a,0xa7db4dec),LL(0x5c5b509d,0xd9cec887),L_(0x00000054),
+ LL(0x21eaa3b3,0x16cce787),LL(0xd4a2fc01,0xa425fa18),LL(0xf155769e,0xaf00539b),LL(0x60eb1b90,0x688fdaf6),LL(0xfa6d7481,0xf34ab7ee),LL(0x4f289d5b,0x07dbb72e),LL(0x1e391abd,0xbc2da7ee),LL(0x95c48dba,0x566bd167),L_(0x0000003d), LL(0x43c9b589,0x9ce2304f),LL(0xd19a287e,0x13ab6992),LL(0x4405fdb4,0x96fa0864),LL(0x4139a060,0x41a760d2),LL(0xbccd999e,0x5ba64bc7),LL(0xb10009b9,0xd8deab9a),LL(0x984258d2,0x79776c54),LL(0x221ad688,0x10e8fea6),L_(0x0000004d),
+ LL(0xbd1cacd0,0x5b9e9b6c),LL(0x0d488b76,0x718de1b3),LL(0x479d6241,0xc5e08581),LL(0x835e01af,0x2980a85e),LL(0x5861c30b,0xb6dbc1d7),LL(0xa410ea56,0x2db982c5),LL(0xe2d1be8c,0x9bd416d2),LL(0x8b2c0849,0xff9c097a),L_(0x0000007c), LL(0x5bd1e957,0xbf3507bb),LL(0x84f97fa2,0x638f765c),LL(0xc3635cb6,0xddc089f6),LL(0xadab3335,0x03a11712),LL(0x45c1fc02,0x6d411e20),LL(0x92e35990,0x10bb8db9),LL(0x9c8fd9b8,0xa138660a),LL(0x9289131a,0x37f6b49c),L_(0x0000004c),
+ LL(0x5bc20fd8,0xa1146df7),LL(0xfdfcfffc,0x81511cf3),LL(0x23bc0f93,0x2b2a7c87),LL(0xdc82a234,0x03b40d7d),LL(0xa08a7dd1,0x710d66e6),LL(0x21695339,0xb2de413b),LL(0x70d88f9e,0xa639823f),LL(0x35b8b90e,0x023e9ff4),L_(0x00000110), LL(0x0c573ac4,0x67b34d07),LL(0x68b9df98,0xae385a70),LL(0x9e1b7b1b,0x69f1b285),LL(0xf3ca9831,0xacc09537),LL(0xd4b56b4f,0x9d566211),LL(0x5fe60450,0x8cabfe34),LL(0xfe548cc5,0xb714db58),LL(0x6edccbce,0x1b3de9cb),L_(0x000000f9),
+ LL(0xc323d062,0x3fb44e11),LL(0xd6d98611,0xf902dfd5),LL(0x894e506c,0xfd0b1d00),LL(0x85a52247,0x782247b1),LL(0xee7a96a2,0x73bd1827),LL(0x817a81ab,0xb5a675cc),LL(0x58e21da1,0x96f3b0ad),LL(0xba6b1f8c,0x0b4feab1),L_(0x000001eb), LL(0x2721b756,0x94e1e70f),LL(0xa2caaa6a,0xe4a5a160),LL(0xc595ff3d,0x4e2aab67),LL(0xc4ca75c8,0x55f145b7),LL(0x7731bee5,0xfc6003a4),LL(0xe7fe03b5,0x0bfb8f07),LL(0xc95ac06b,0x062bb217),LL(0x970ec8f9,0xa73aafef),L_(0x00000158),
+},
+/* digit=55 base_pwr=2^275 */
+{
+ LL(0x0e2b9a13,0x10edee70),LL(0x5fd3e47e,0x3597fca0),LL(0x77535436,0xd14d9e5f),LL(0x3e8b8ab9,0x09ae6cb6),LL(0x74096598,0xc8a4dd84),LL(0x9f1a5c96,0xcb6edd24),LL(0xd2f79af0,0x61d2b7a4),LL(0x0e166e53,0xfe3d22a6),L_(0x00000092), LL(0x995a329a,0xf72fa6f8),LL(0x96d7a363,0x488ad6e3),LL(0xd92f57cc,0x8510a286),LL(0xf0a9d195,0xb888aa8b),LL(0x317136c0,0xf42decec),LL(0xdf9fc71b,0xb6cc8b9b),LL(0xc0298d41,0x49e5d99a),LL(0x109ecbb2,0x314b57f8),L_(0x000000db),
+ LL(0x68b73573,0xb2d708c6),LL(0xce839038,0xce28ed96),LL(0x20e1ea62,0x8763eab5),LL(0xed2713c5,0xc4523fd6),LL(0x71027fe2,0x7eae1cb2),LL(0x9c4b8cf6,0x24a95e4f),LL(0x601ad020,0x07164949),LL(0xdd7d73ac,0x37442ffc),L_(0x00000043), LL(0x3ec84bf8,0xb77851b2),LL(0xdb8574d7,0xb645bbee),LL(0x286ebfe9,0x0c8710d8),LL(0x766e45ce,0xa79aecb4),LL(0xc2d31256,0xbf379f83),LL(0x340ea164,0x164bbbc5),LL(0xf851521a,0x1ac3081d),LL(0x7e9d5d5e,0xb205779b),L_(0x00000081),
+ LL(0xd2e1d746,0xde9114db),LL(0xe63af665,0x818c463b),LL(0x6295501a,0x35a127bf),LL(0xdce47ef1,0x007d2c0c),LL(0xcdab36d7,0xccb851cf),LL(0xfdd117a8,0xf238753e),LL(0x0f305c31,0x8e2817b4),LL(0x7fa2c0d7,0xf487e902),L_(0x00000153), LL(0x1fcbcf0a,0x170a9d8a),LL(0xfdab89fd,0xd0296988),LL(0xf7158579,0x9d9469d7),LL(0xe8a6f604,0x10415652),LL(0x2b54a37b,0xcc4eb51c),LL(0x0c719573,0xae48f5a3),LL(0xa83c1dff,0x30b12c01),LL(0x72dbb726,0x57308088),L_(0x00000172),
+ LL(0xc489ffe4,0x313e4b56),LL(0x08231734,0x6717f045),LL(0x479ae527,0xe3d436d8),LL(0xd02cb05c,0xf2257834),LL(0x00a63fdd,0xa7cf8043),LL(0x55acde6a,0x457f48d5),LL(0x3233d0de,0xde5db66b),LL(0x81aa55b4,0x0379d9ac),L_(0x000000a6), LL(0x067058f6,0x13e90717),LL(0xc47bead6,0xf2111132),LL(0x90e8a449,0xb92dfa6c),LL(0x2861c278,0x0e5052e4),LL(0xbb21a8a2,0xdd62ef7f),LL(0xda29cea2,0x06ce5d03),LL(0xb1054057,0x321921a2),LL(0x2bdda27b,0xa8070a21),L_(0x00000113),
+ LL(0x00c74bbc,0xb57fe1e1),LL(0x13d1fd3d,0xaf39e976),LL(0x9d300d5d,0x3c4bd73d),LL(0x394a792d,0x22ea164b),LL(0xdb8ad2a0,0x94ca8b71),LL(0x46b5c44e,0x29573de6),LL(0x4faada81,0xa68e6f0b),LL(0x9bb3e293,0x2829705e),L_(0x000001a5), LL(0xff57d0ed,0x562f24c2),LL(0x10d7ee7c,0xebc4c9ff),LL(0x1bfc2a5b,0x9e849995),LL(0x9ab67877,0x29bf2cd5),LL(0xebbab48f,0x1c14b040),LL(0xc34becb0,0x0f56d5be),LL(0xa06f84dd,0x74ea8bd3),LL(0x16998590,0x240441e5),L_(0x000000b5),
+ LL(0x5c45926a,0x99d23cf5),LL(0x8778f5f2,0xc8b025b9),LL(0x1705a5c8,0x3919b71b),LL(0x0d5b88f4,0xcb92372e),LL(0x60fa371f,0x943296e1),LL(0x0a89cc71,0x5fe1a497),LL(0x34a3ae69,0x5dec2f93),LL(0x1251e4b9,0x275a5942),L_(0x000000d6), LL(0xd859c11c,0xff47e08d),LL(0xaa12f1b2,0xad152f2f),LL(0xffb55ea0,0x2d49016e),LL(0x9565927a,0xe898a743),LL(0x6cdbde63,0x47e768ee),LL(0x9201bbe7,0x0a069ce7),LL(0x64e8832a,0x4d3af5cb),LL(0x22cff077,0x58cc25a5),L_(0x0000001d),
+ LL(0xdae36c68,0xb0b126b6),LL(0xaeabb8d7,0xc38359f0),LL(0x58505b26,0xb9091af1),LL(0xe930c10c,0x1baa2a57),LL(0x4ceb63b6,0xf34a1cb3),LL(0x2ce30eb5,0xe695563a),LL(0xb46502e9,0xbc4a4498),LL(0x3de11285,0x7d46bb82),L_(0x00000037), LL(0x31c841ea,0xd0a4132d),LL(0x4b0d3d99,0x19c65f2c),LL(0xbdec1fb8,0xe96bad16),LL(0xf98a7a22,0xfc740b98),LL(0x4ac9e432,0x327482c4),LL(0x19b02fa9,0xee365754),LL(0x2b71db69,0x8c4b6fcb),LL(0x3b059127,0x1ff3d7d8),L_(0x00000109),
+ LL(0xb46fd007,0x5b27f0e1),LL(0xc1b9a1af,0xc491a3f1),LL(0x3c2c754f,0x5cbaab1f),LL(0x2a77d316,0x0310665c),LL(0x760e6436,0xda6d64bd),LL(0xabfa1968,0xfb5f4ce1),LL(0x2b0e1701,0xb466c4ed),LL(0x7ed3c4d7,0x2ebf2125),L_(0x00000191), LL(0x2ef47a92,0x50f6e44d),LL(0xddd0d096,0x8ca37cde),LL(0xacd3234c,0xb7244def),LL(0xd39cba5f,0xacca56c2),LL(0x42e4fef3,0x04d3ff0e),LL(0xd03959e1,0xe6513498),LL(0x101ed923,0x40deadab),LL(0x3a0842e2,0x40cf65c5),L_(0x00000071),
+ LL(0x6ea80244,0x24abeced),LL(0x8027d5fa,0x54bd40b9),LL(0x6c207959,0xaeb9dac1),LL(0xd464b86a,0x419d1ea2),LL(0x6820d398,0x5e25c94d),LL(0x7cb4e131,0x65e1ca01),LL(0x407cd9e9,0xe5ede0b5),LL(0x9cc6a7e8,0xccfcd5ef),L_(0x0000012e), LL(0x8a46a1bf,0x38ae86f8),LL(0x198931f5,0xff746c8b),LL(0xd54d7f12,0x309a79bf),LL(0x1246b150,0x42f00081),LL(0x77449920,0xc47ea560),LL(0x3c1ca128,0x7f0d691e),LL(0x4a7cd82a,0x389f0267),LL(0x3325d3c5,0xd3d69318),L_(0x000000e6),
+ LL(0xa3cca92f,0xdc420de7),LL(0x40b5d961,0x0c56a78c),LL(0x0669c065,0x20ea2fcd),LL(0xd7d6512b,0x0cfdc1ce),LL(0x793f28c8,0x12dc4c42),LL(0x2a2c66b6,0x65ef14af),LL(0x8712d0f4,0x498de283),LL(0xaba3e10f,0xd43378b1),L_(0x000000ef), LL(0xaf2de227,0x29182339),LL(0x2743e625,0x75c8a0f5),LL(0x7cb967f9,0x3b942e5d),LL(0xa6fa495f,0x2c93c4c7),LL(0xaf911e44,0xe5ea4e81),LL(0x61393032,0x453b1c33),LL(0x6ad975cf,0xbd844374),LL(0x598fb85f,0x19bef583),L_(0x0000009f),
+ LL(0x9b9466a8,0xca0bf18d),LL(0xa3d7dbe9,0x4163c3c8),LL(0xfea7d95a,0xc8c760db),LL(0xbedeb961,0xbe4aaf54),LL(0x6366da72,0x184e2e0f),LL(0x4b391d6f,0xc176d3d7),LL(0xda402a6d,0x58e13d8b),LL(0x35c88b87,0x9e868f1c),L_(0x000001ed), LL(0x9fd8fa1b,0x060d87ba),LL(0x2fb088fa,0x7bb887ef),LL(0xd9fecef3,0x5f6918e8),LL(0xd8d0ab29,0x584e5e50),LL(0xa68549e0,0x1a0e8dad),LL(0xccee2619,0x6b94fb63),LL(0x2fe6d355,0x41620a75),LL(0x2f9f5687,0x3bbe2240),L_(0x00000024),
+ LL(0xa7583732,0x7b1c8a03),LL(0x5d3c5d98,0x9b0532ff),LL(0x8d28755f,0xa6811aec),LL(0x526696c9,0x1a05c762),LL(0x85c6fe67,0x9b509178),LL(0xb1cd9732,0x9ce1e435),LL(0xd6424b12,0xd25c0017),LL(0x7dfb69b5,0x8fd3449e),L_(0x000001bf), LL(0x45aa0fc3,0xdb3b3b47),LL(0x4f13caa8,0x8c65da30),LL(0xc42581d3,0xf1637449),LL(0x31ba26e3,0x086fb178),LL(0x1f20a375,0xe70bccf5),LL(0x794f66bb,0x8fb9ec67),LL(0x8759114e,0xba15c3e0),LL(0xbae55fef,0x6274e840),L_(0x000000b0),
+ LL(0x4b17f564,0x9940c688),LL(0xd17c3809,0x1ad4bb7a),LL(0x02bbb8e4,0x62901ee1),LL(0xdef212fe,0xf758e2a0),LL(0x902e165b,0x41df4c90),LL(0x813c93c1,0x2d980715),LL(0xdfe446b0,0x16925c07),LL(0x26180355,0x6a7e91aa),L_(0x000001e3), LL(0x97ef4ef8,0xa45e236d),LL(0xf8e5447a,0x116cff34),LL(0xe8d1be37,0x05f97032),LL(0xb0f21f66,0x2f2c027f),LL(0xa11df664,0xa89a55e5),LL(0x02fec70b,0x0cbe911b),LL(0x281dbb5c,0xf7515075),LL(0xff0a3fb5,0x5eb63dce),L_(0x0000017e),
+ LL(0x5eee65be,0xa91392a8),LL(0xbdba8a73,0x3162337e),LL(0x57c70feb,0xfe6064d0),LL(0x1cbf9841,0xb8ea5857),LL(0x0f9265ab,0x8f4d78e1),LL(0x4ea34ee6,0x86c61019),LL(0xe932bccc,0xa4d88afe),LL(0x9518b05b,0x1b666c9e),L_(0x0000007f), LL(0x59e8fd1b,0xf8bfc49e),LL(0x05208c75,0x9df54ae4),LL(0xd373c5a9,0x79933e71),LL(0x5b8a9772,0x64aa0b3f),LL(0xa96b6ada,0x636d2c0d),LL(0x5227ca04,0xc4142eed),LL(0x6e0ffb64,0x11d0f26b),LL(0x03baa051,0x6cce8a32),L_(0x00000049),
+ LL(0xf1fc721e,0x1b22c75f),LL(0xf889ab10,0x198462a9),LL(0xdc726c9f,0x4488dc01),LL(0x03497dbf,0x6173d9f9),LL(0x44668664,0xa2ec1a91),LL(0x97d57504,0xc515fce6),LL(0xe38e8b7b,0xc94145f8),LL(0x9a57e3c8,0x7f491462),L_(0x000001f6), LL(0xe3b58019,0xfab74bc2),LL(0x21aa76a0,0x5cde4de2),LL(0xcabcd328,0x58febacf),LL(0xfc5df376,0x164a8b43),LL(0x53cf2abb,0xd59cb6ca),LL(0x4bdbc3e7,0x5fa72448),LL(0x61888f39,0xec291663),LL(0xa63d2680,0x8efa4a04),L_(0x00000137),
+ LL(0x3aef952e,0xbfc44034),LL(0xda15115c,0x7be6519e),LL(0x4c0ca17c,0x1e404697),LL(0xd39b899e,0xd56cb968),LL(0xafaffc6b,0x977f25af),LL(0x0c48baa8,0x33c5e846),LL(0xb8ddcae7,0x8db3dd6c),LL(0xea4e7b4d,0x30c42ef0),L_(0x00000147), LL(0x6e0e9969,0x3bded433),LL(0x1c36485b,0x60a85776),LL(0x3a9ef9b4,0xc163b2e2),LL(0x9caea119,0x699c32d3),LL(0x6fbf2af8,0xc9afc21d),LL(0xb2f30acb,0x5cd46105),LL(0x2782e179,0xc5de1ebd),LL(0x94bd0296,0x40db331e),L_(0x000001f5),
+},
+/* digit=56 base_pwr=2^280 */
+{
+ LL(0xd75c1b45,0xb3566c4d),LL(0x70856265,0xffa63a05),LL(0xcbace31a,0x64645336),LL(0xd792b4ed,0xe49945b2),LL(0xcdc41c6d,0x4ffedb2c),LL(0xfc3fec1e,0xfb381239),LL(0x6c094341,0xb5868f95),LL(0xa828185b,0xf680572d),L_(0x000000da), LL(0xa2d876a6,0xbfe0585a),LL(0x480f8f0f,0x30bd3b95),LL(0x5be334d5,0xc2d3c86e),LL(0xd762f278,0x676d6c82),LL(0x1488b56b,0x539dec8e),LL(0x756194ec,0xc0fc3e4b),LL(0x4e5ad8a2,0xe01cce49),LL(0x1e1d4129,0x9cb7e94c),L_(0x00000045),
+ LL(0x1314c572,0x2ee172f7),LL(0x76d70712,0xcc86b737),LL(0x07937b43,0xc42e1bf4),LL(0x0a15775a,0xe0abab13),LL(0x8a6f4155,0x8a4930e5),LL(0x7af5f75c,0xe4d25a23),LL(0xf7ffdb8e,0x47745ba4),LL(0x1c8fe7af,0xda1f09c1),L_(0x00000067), LL(0xb90a6b8d,0x58ab833a),LL(0xbed40193,0x74f45669),LL(0x07b7fe4d,0x00a5516c),LL(0x8fed834f,0x35a36d31),LL(0x46f3d5f0,0xcf8a31bb),LL(0x46e1df3b,0x86c99729),LL(0xef24a7e8,0x383ab5e1),LL(0x3285864c,0x85a50c0d),L_(0x0000005b),
+ LL(0xd82688c4,0x82d65b66),LL(0x2c2925e3,0xc79d0387),LL(0x80fde81a,0xa2432027),LL(0xbc3a2b38,0xa34422b6),LL(0x24a6595f,0xb948d55e),LL(0x7ed8f149,0xfac14efa),LL(0x1011867c,0xe578bbe7),LL(0x01bd1e94,0xefa02765),L_(0x00000003), LL(0x88ed0039,0xc9f7389f),LL(0x4f58dfa2,0xd3bff99b),LL(0x27af2024,0xe0ca7fb1),LL(0xa09a0ca5,0x782dbf7b),LL(0x01098d83,0x19fa5d61),LL(0xabdbaa4b,0xddb85231),LL(0xc03b0d70,0xbb859499),LL(0x26cba60c,0x8d596ce3),L_(0x000001ba),
+ LL(0x11830fd3,0x8aec0422),LL(0xb67d56f7,0x85f0af78),LL(0xd0dd5f00,0xd1879493),LL(0xede77ef6,0xd412929c),LL(0x6254c309,0x2f8f47fc),LL(0x6cfbb6a1,0x4af63813),LL(0x0a561c30,0x70283e09),LL(0xb1640127,0xc77dd363),L_(0x000000e8), LL(0x1689c1a7,0x65973023),LL(0x29101040,0x7036678a),LL(0x6adb22ec,0x5919dc9a),LL(0xb9607eaa,0xff75ea6b),LL(0x2f103f0e,0xa1b15402),LL(0xc4300dcf,0xfdcf2e9d),LL(0x3ebbf1ab,0x1be47bf2),LL(0x3bc7610a,0xe48e43b2),L_(0x000000e8),
+ LL(0x079ff207,0xb1366222),LL(0xc255282f,0xcf45bdd6),LL(0xe5f65eaf,0x15c02959),LL(0x0d59b305,0xd5074c2f),LL(0x69d34def,0xf460bf31),LL(0x98c4daf0,0xcd4dd881),LL(0x2d35aae9,0xa3e2b924),LL(0xcd6f8fb3,0x7ee19179),L_(0x0000005b), LL(0xbdd26b48,0x3015c0c8),LL(0x24998853,0x9b18e9fc),LL(0xc27ee4ed,0x01ee8c44),LL(0x961e30d9,0x38c4d057),LL(0x4e4722a4,0x27a847d7),LL(0xbd34c3ce,0xfc175e9e),LL(0x9ec1f371,0x28ad6264),LL(0x9962cfa6,0x8cb8ba21),L_(0x00000025),
+ LL(0x61746f87,0x48414eef),LL(0x4b16d635,0x466a22f4),LL(0x91c53690,0xb9b4826e),LL(0xdfa700b4,0xba41d6fd),LL(0xa9d1c269,0x3f48b184),LL(0x9a1ae562,0x1d66af1a),LL(0x88445e2f,0x16e76216),LL(0x5528a0ef,0xa509e874),L_(0x000000a0), LL(0xf9d1f30e,0x4d16c4eb),LL(0x405c88d6,0xcb159002),LL(0x21995ea2,0x9206340d),LL(0xc1b476f5,0xbdb47138),LL(0x73c4a87f,0xf1fc51a6),LL(0xd81d7d81,0x68d2c132),LL(0x3035e2c5,0xc2e86c33),LL(0xdd1981e0,0x25fcaa15),L_(0x0000009f),
+ LL(0xa5dfb812,0x4ab2a49c),LL(0x70aadb7c,0x983438d3),LL(0x9f4ebf13,0xd25c9ac8),LL(0xd8d4d610,0x9c7f0f75),LL(0xca14e0b4,0xdcfed5c3),LL(0x4d6f7590,0x36f5cd7f),LL(0xd93cbfaa,0x65cb3d17),LL(0x1ddce79a,0xbd97f101),L_(0x000000b4), LL(0x87dd6cdb,0x8b012070),LL(0x77a85a51,0x279a4494),LL(0x7671964d,0xff88af2c),LL(0xf271d11a,0xdbb6c2c5),LL(0x82395ca1,0x85ba326b),LL(0x98f43101,0x0cb73c28),LL(0x63dc513c,0x6b203054),LL(0x4469f278,0xc5c18db9),L_(0x0000001f),
+ LL(0x36061c1a,0x3d80adc6),LL(0x4e403a26,0xab320624),LL(0xad04e1de,0xdcbb6130),LL(0x2a259720,0x6e850532),LL(0x231b1ad6,0xa60fb3f5),LL(0xcd79b6e2,0x663d49e1),LL(0x179c366e,0x01277eb6),LL(0xe6c6ea0d,0x883c4ffd),L_(0x00000073), LL(0xca5210dd,0x7e40167f),LL(0xaec71f68,0x9a231d95),LL(0x1c63bde5,0x4af79a44),LL(0xdec74dfa,0xfd79e68d),LL(0xa1952760,0x0b613ae2),LL(0x08e61ca7,0x9e73036b),LL(0xe30d2b54,0xd922e0f3),LL(0x6d8fb383,0x28c14621),L_(0x000000a0),
+ LL(0x6da7d675,0x1137f8e6),LL(0x66cf0839,0x9b11d642),LL(0xa909855d,0xc2008fb3),LL(0xcfac98d0,0x7141e8cb),LL(0xf021a4df,0xf143c405),LL(0xab358375,0x67bc2904),LL(0x17ae0177,0xcc509637),LL(0x3e96013d,0xa1e7d9dc),L_(0x00000049), LL(0xefccd8ff,0x957910b6),LL(0x497bb1a3,0x0139fb02),LL(0xbd519647,0xb1e83186),LL(0x3a05bf5b,0x19b27ed1),LL(0xcae014aa,0x82e975ee),LL(0x2c7c3285,0x88e9df86),LL(0x55efa48e,0xeb606052),LL(0x325f6177,0xa47eec1a),L_(0x00000161),
+ LL(0x6a4317c6,0x3a878798),LL(0xb073983a,0xb57577f3),LL(0x911ef229,0x88b3000a),LL(0xb6a2c941,0xfe60609c),LL(0x2014f532,0x505cb96c),LL(0x56c1e07d,0x4b65f80c),LL(0xacfa88b0,0x6d867481),LL(0xe4164f16,0x5599d374),L_(0x00000151), LL(0x92b10575,0x0c1e1e98),LL(0xfcb0b84f,0x19e6efb8),LL(0xb9207b90,0x51572182),LL(0xa8d8dbea,0x3bef29fc),LL(0x48664299,0xf1204f85),LL(0x601bc4d3,0x0e9a0fd0),LL(0x04ed7b5b,0x79ce5a54),LL(0x2efbde9a,0xa61da12c),L_(0x000001bd),
+ LL(0x452d878f,0x50fecf46),LL(0x92f8cb5b,0x920174e1),LL(0xf0d81ba1,0x1067e00e),LL(0xdf0090d3,0x0f944d92),LL(0x7cf84daa,0x29760c45),LL(0xe2fe5c35,0xdcd64aa5),LL(0x0fc3d3ab,0x926c41d9),LL(0xd093a0e6,0xf508ca71),L_(0x0000017a), LL(0x1dd9cd99,0x2ec2b366),LL(0x41b5fe84,0x68d89f52),LL(0x6a8252ee,0x7f37105c),LL(0x12bfbd7a,0x28e7afdd),LL(0xa8c8a6ce,0xc9ac312b),LL(0x64f59820,0xfc0802de),LL(0x91abcca1,0xdd3daa77),LL(0x3663e8e4,0xcba87568),L_(0x00000067),
+ LL(0x98711310,0x167f86e9),LL(0x77ecbc5f,0xb273c517),LL(0x1e1c4580,0x7b0cac28),LL(0x7d9e9af5,0x8231d2eb),LL(0x6aedfd99,0xaaffb728),LL(0xf1c98f12,0xe925ce44),LL(0x74f1520c,0xc049eb63),LL(0x494b788d,0xd9d95935),L_(0x0000009f), LL(0xc317b32d,0xccc2d2a6),LL(0x0b127e1a,0x3b751841),LL(0xcd70c11d,0x64418006),LL(0x1b4ae955,0xbadb0a24),LL(0x604cb635,0x9f330b20),LL(0xcfd3da79,0x73a90953),LL(0xef2d17df,0x1b20635f),LL(0x4743671d,0xd4c67374),L_(0x000001ab),
+ LL(0x12cdd2a6,0x9ec2635a),LL(0xbc72074c,0x1fe4598a),LL(0x2c820e92,0xe36ea0ca),LL(0x2497dd7b,0x4a8623f2),LL(0xe23eb8d9,0x60085b98),LL(0x40f9b504,0x1c20ee53),LL(0x201ec927,0x00761ac1),LL(0xd442c9fb,0x4f448cc8),L_(0x00000026), LL(0x820146fb,0x6e43f9a4),LL(0xccd45383,0xdd223c39),LL(0xe5a9e554,0xb7183f2b),LL(0xbabb5193,0xcaf50569),LL(0xd8970128,0x1fd8dbce),LL(0xa8d54145,0x334b381f),LL(0x13a9b729,0x728ba78e),LL(0x437dd328,0xd0616bed),L_(0x000000a9),
+ LL(0x5533acf3,0xaa17f0bc),LL(0xd2eb9fb6,0xcdb03b75),LL(0x6da41301,0xff96e100),LL(0xd003b0fd,0x0f341e2c),LL(0xeffd7580,0x00a92b40),LL(0xb4e94e73,0x2f420bab),LL(0x7e020897,0x3a5a980e),LL(0x0e9d7689,0x44d12101),L_(0x00000198), LL(0x4d880aed,0x2631776c),LL(0xf32bcc90,0x4363aa54),LL(0x81eb128d,0x290c3760),LL(0xc99f8366,0x24d51de3),LL(0xa9c8e087,0x2212897d),LL(0x63ef80d8,0xe1731f84),LL(0x4ba53d2d,0x71a09c6c),LL(0xf3c92c58,0x1de91d0d),L_(0x000001ba),
+ LL(0x1f13ee5a,0x007f0db0),LL(0xfc29c9c2,0xc5a04df7),LL(0x7ce23069,0x889ac9f2),LL(0xabf8339c,0x48b685ae),LL(0x57639632,0x3111646e),LL(0xf8b9f075,0x94f37131),LL(0xb2897670,0xf80a60f0),LL(0x834d23a7,0xeca2d9a7),L_(0x00000028), LL(0x3b936a84,0xc94b1130),LL(0x12c12cdf,0x7f1285c7),LL(0x53433711,0xa3fdb413),LL(0x6c9aab37,0xd50e87db),LL(0xc28229bf,0x6e31c080),LL(0x9878eb5e,0x647c7885),LL(0x6255df90,0x3c367034),LL(0x64a27e7b,0x359e7554),L_(0x0000010f),
+ LL(0x90855e35,0xc3090e22),LL(0x856faf70,0xcf9c3c63),LL(0xa537fff7,0xd0317a7a),LL(0x61c02007,0xdc853b32),LL(0x61687510,0x36ccdf2c),LL(0xd6f188d5,0x26fd385c),LL(0x2955fa1d,0xf2d7d6ea),LL(0x3087bdae,0x3173148e),L_(0x0000010f), LL(0x54216ede,0xd784c9a2),LL(0xc0770de6,0x4bf8c47c),LL(0x35e4c8fa,0xaece660d),LL(0x8910f637,0xedb7b99e),LL(0x5ced4fad,0xa82ce72b),LL(0x0fa07446,0x15701d4d),LL(0x94600c85,0x4152f301),LL(0xf34ffcea,0xf31c15ed),L_(0x00000096),
+},
+/* digit=57 base_pwr=2^285 */
+{
+ LL(0x31bdcc84,0x3f5b1c78),LL(0x7bafc7d2,0xbe5d1d02),LL(0x50c19efd,0x3cdce225),LL(0x5357a753,0x3af279d2),LL(0x14412057,0x76015a5e),LL(0x57141209,0xc91c803b),LL(0xb203384a,0x12ba72de),LL(0x2bedd680,0x825c3d8d),L_(0x0000011d), LL(0x39f8385e,0x6423553a),LL(0xeaf27fe1,0xef9335b8),LL(0xc4539fb7,0xfa5830e5),LL(0x66badc9f,0x0a5e5034),LL(0x1dcbb895,0xd3a2a96a),LL(0xa62dca0d,0x8a881a89),LL(0xd5f98db4,0x06e0a311),LL(0xe2554b95,0x69efeec8),L_(0x000001cd),
+ LL(0x8352945a,0xb00f4f23),LL(0xd445a023,0xdd54cf07),LL(0x551441ad,0xe62fb5bf),LL(0x33408f85,0xd275f3aa),LL(0x1f4e87ff,0x701eb4ed),LL(0xb08c2f8d,0xcbec0af1),LL(0x3b5987fa,0xf0bc3119),LL(0x37542336,0x219a8c12),L_(0x00000187), LL(0xae724bcb,0x5d52f04d),LL(0x1a68b0a5,0xd5fa5e22),LL(0x5bdff6f9,0xda24e831),LL(0x9487e3f2,0x8b43c649),LL(0x8cc54962,0xca393f54),LL(0x934d621c,0x52e8acee),LL(0x0ce12d1b,0xf0e6025e),LL(0xcb0b93c4,0x16663ffd),L_(0x00000171),
+ LL(0xb7086292,0x5de71627),LL(0xf54385d8,0x8b05712b),LL(0x7bb4ab47,0xcc6b5489),LL(0x5a9a3b2c,0x7fa6f6a0),LL(0x3bfef8f6,0x773cd523),LL(0xf505a80c,0x5c9cc4c4),LL(0xa3fe8c18,0xf37ae336),LL(0x6259e110,0xb440dc7a),L_(0x0000014c), LL(0xc7b0e1ec,0x1e50c98b),LL(0x4b379333,0x4a8aa5a0),LL(0x3b8d3103,0xc900df01),LL(0xc99c95da,0x52027ee1),LL(0xb891a1fd,0x4b5be3ae),LL(0xb6857422,0x5ba842f3),LL(0xe00bb37d,0x3f36375a),LL(0x13a7f31f,0x04743a28),L_(0x000000c3),
+ LL(0x37e819c9,0x69c14cb5),LL(0xb3bf6b75,0xa0bac5f2),LL(0xcc275187,0x6c2d559b),LL(0x0eb925ef,0xa5453338),LL(0xd0382a25,0x119f0d6c),LL(0xbbf74a02,0xaf681433),LL(0xbd994d4c,0x53999a9b),LL(0x8d27772c,0x249226a3),L_(0x000001af), LL(0xb493127b,0x796a46b5),LL(0x887c8f77,0xabbf7bee),LL(0x45dd063e,0xa0a8e117),LL(0xea429199,0x8d22e28a),LL(0x7e69a991,0xb0ecebe7),LL(0xb0ed2dea,0x0edf7cec),LL(0x37aa98d2,0x0e528886),LL(0x0ca19479,0x73078fbd),L_(0x0000000c),
+ LL(0xca9fd702,0x1809c965),LL(0x4cbc62e0,0x5c062be1),LL(0xeaea9560,0x1162dcba),LL(0x07340ec9,0xcf90fad2),LL(0x6f6f4573,0x8b6c2347),LL(0x41df3d0b,0x4bc4f7c5),LL(0x6aba94c9,0x9ce77c5e),LL(0x25055fe2,0xb9dd3d1f),L_(0x00000193), LL(0xedcc2ca4,0x6e430120),LL(0x31a5bf9b,0x31ef29c8),LL(0x4ea14b33,0x1451c355),LL(0x3d7a4759,0x515170ed),LL(0xc3011219,0x21413d55),LL(0xb375db75,0xacf6ce68),LL(0x846f6627,0x2facb2b3),LL(0xdee7b99f,0x3ead4f94),L_(0x0000004f),
+ LL(0xcc95dfa0,0x4f0117ae),LL(0xd22f1814,0xe3424149),LL(0xad5ce6fa,0x58b2d2e6),LL(0x70e2e877,0x5de9d268),LL(0x6eb2a9a7,0x6da54502),LL(0xddee04cc,0x3079a618),LL(0xaa37f095,0xef9c41ec),LL(0x0ab072b7,0x4f475d8e),L_(0x00000182), LL(0xb095050c,0x139a7b97),LL(0x482e5296,0x56474127),LL(0xc87e2a1d,0x0fe9253d),LL(0x4757efac,0xbdc55bb0),LL(0xaa65a406,0xfb5b47e5),LL(0xfa5b9027,0xd99ad5b0),LL(0x1f6adf92,0x3a4363de),LL(0x6339348e,0x6d9cf0af),L_(0x000001fa),
+ LL(0x3a106eb8,0x926c08a5),LL(0x58be047c,0x00018285),LL(0x4ede436f,0xb7c0f8da),LL(0x267d40d4,0x754e0583),LL(0xf821bcca,0x29b55f1c),LL(0x356838ff,0xef10fd05),LL(0xd3bb98d7,0xbf4cd160),LL(0xcf20597a,0xfe3d8718),L_(0x00000039), LL(0xd50f20a2,0xbe1a541a),LL(0x2ab231ad,0x833de73e),LL(0x3217ac39,0xde117a87),LL(0xe86047c6,0xa460f6e7),LL(0xbf61ad63,0x3e4086cc),LL(0x10646884,0xeedbe45c),LL(0x97bd568e,0x9c11e90d),LL(0x23655180,0xb96c7748),L_(0x000000ca),
+ LL(0xa8697eda,0x469af391),LL(0x5bb73205,0x3f5f97fe),LL(0x80d05ad0,0x73b1a3ca),LL(0x00af9b79,0xb52add98),LL(0xcc82c533,0x93cc487c),LL(0x0da2ae06,0xe46cf71a),LL(0x060c7047,0xaeb64abc),LL(0x3aa21503,0x0075b1d3),L_(0x000000ed), LL(0x12985515,0x29a2bed9),LL(0x9a79f6b1,0xda4630c4),LL(0x22374a19,0x62f001a1),LL(0x90a13059,0xa3cc4dcc),LL(0x026cefa3,0xb188b4cc),LL(0x0fbb1d3f,0xad092ff3),LL(0x36e3761c,0x6354b93c),LL(0xf3dbdbdc,0xb73317cf),L_(0x0000012a),
+ LL(0xda4d56d5,0x478cc5ff),LL(0x39f6b453,0x4e6379ca),LL(0x063068cd,0xe4f74a40),LL(0xdb751bed,0x94052b38),LL(0xb0c9cab3,0x8ee4c1e6),LL(0xf5c6aa29,0x3ca0dbb3),LL(0x4a2497c4,0x79c6ee9a),LL(0x9ea63ecb,0x00e2354a),L_(0x00000188), LL(0xe4a480ce,0x3a6196f9),LL(0x62b157a8,0xfa37ba58),LL(0x59648d99,0xe7f1758b),LL(0x1b51e49d,0x2e82eb6d),LL(0xbcb59206,0xc0686a28),LL(0x337d156a,0x6197f5d2),LL(0x69bbd81d,0x9b64ab0e),LL(0x45283587,0x8e4d1a8a),L_(0x000001e8),
+ LL(0x8fd25f3f,0xed1f56a5),LL(0xe00396a8,0xc29bf98d),LL(0x671ac7e0,0x61a8021c),LL(0xa76a8082,0x40244556),LL(0x85eaf05e,0xd4493c4b),LL(0xacc79ffa,0xf3dd2e24),LL(0xa065de83,0xc2899229),LL(0x616b4043,0x26ec1649),L_(0x0000015b), LL(0x8dee69e1,0x177b6d5f),LL(0x5bdfa715,0xbb1b8e86),LL(0x1c8a38c6,0x673dccd1),LL(0xb8eb3119,0x26507bdf),LL(0x5e9ab066,0x52444c41),LL(0x63e06aca,0xc41d72f8),LL(0x6233cfed,0xf0a4cf0f),LL(0xa4204c93,0x2e510168),L_(0x0000002c),
+ LL(0x02f56d78,0xb9ae2c20),LL(0xa8e73672,0x60eb4910),LL(0x76d9acc7,0xef341ec9),LL(0xf8c3ff90,0x71631b58),LL(0xc5d46ddd,0xf784f3a3),LL(0xaca2efa5,0x9fd6ccc9),LL(0xb432ab0f,0xe0c19b00),LL(0xe9336780,0x8e4851bc),L_(0x00000077), LL(0x763901d3,0xeb8a4214),LL(0x1ec45488,0xab894d10),LL(0xb3592330,0xfe84be74),LL(0xea5cac9d,0xd6ce52df),LL(0xd6fc5829,0x52b83766),LL(0xada3c1ed,0x6e5007f8),LL(0x07f9020f,0x9dc77e51),LL(0xf5261fb1,0x3d52bde6),L_(0x00000176),
+ LL(0x61e0b43b,0x9c19cb9b),LL(0xa33466a1,0x59900a19),LL(0x2eeef601,0xd1a35b61),LL(0x70079dee,0x043f6bdc),LL(0xcd5ea5fd,0xc0119db9),LL(0x3a3b272f,0x5b2eb1b8),LL(0xe45f974f,0xba8b6e51),LL(0x5f770445,0xd0419f04),L_(0x000001b4), LL(0x8f1c3e6a,0x4b8a6a2f),LL(0x21c82a7e,0x356eb5d6),LL(0x1f805802,0xc510787f),LL(0xb2d54598,0x678fa9fa),LL(0x14375d0b,0x27fba413),LL(0x6ed82aca,0xce44cfc3),LL(0xbe259313,0x826f662b),LL(0xdd1eec94,0xc3f7e810),L_(0x0000010e),
+ LL(0x451f3fda,0xafd7f180),LL(0x784a36b9,0xa71f98dd),LL(0x55359374,0xb80637d2),LL(0xeb356304,0x319eb954),LL(0xe36b826f,0x6caacbc8),LL(0x5436ed41,0xc8f9a6b4),LL(0x1ad27bfc,0x05822de6),LL(0x66b9e6c5,0x6448fc9c),L_(0x00000061), LL(0x1be571ae,0xd306ac81),LL(0x92fe9fac,0xdda81241),LL(0x90144259,0x08d31ec6),LL(0x70a69700,0x59532bbb),LL(0x548a4797,0x25db5e1c),LL(0xfe84a6c9,0xdb376141),LL(0xd82e648e,0xaf5e43aa),LL(0xd86080c6,0xa3c129c0),L_(0x00000047),
+ LL(0x16e20146,0x2343be89),LL(0xd0ffaccb,0x1cb1ffd2),LL(0x3a03a0c7,0x899f4ff5),LL(0x6266f542,0x5f5c983d),LL(0xbcc25c41,0xcccfd128),LL(0xdfd7dc3b,0x971841bb),LL(0xb315e6d3,0xab458be6),LL(0xf423c907,0x18de71ba),L_(0x000000e5), LL(0xe2e17f1c,0x8643db82),LL(0xdf24bfc8,0xae140a96),LL(0x7d249f93,0xcc1b0809),LL(0x4a944e10,0xbb9f2bb4),LL(0x2cf2ab30,0x2a9df9a6),LL(0x3e7a3348,0x8877de2f),LL(0xc1bae4c1,0x6e777963),LL(0x95df6e0c,0x12289ec3),L_(0x00000076),
+ LL(0x1a1f2092,0x84f63e6e),LL(0xb92016c3,0x9065995b),LL(0xcfc7edd3,0x7e853e34),LL(0xe921ec35,0xe5b9d192),LL(0x48df779c,0x22c1257c),LL(0x2377e36c,0xc67f15b2),LL(0x2dd7559c,0x56741ee4),LL(0x8133583f,0x266292d1),L_(0x00000077), LL(0x28b3ff2a,0xcd5b0dfd),LL(0xd6ec8a55,0x0e18cbd7),LL(0xa02b3661,0xd0b4c82b),LL(0x54051775,0x2328d0e9),LL(0xa2bff3fb,0xbab00086),LL(0x8724078f,0xf6183452),LL(0xe2d3f99f,0x1d9f7aa2),LL(0x3419a97e,0x6878b1f4),L_(0x00000013),
+ LL(0x5635e4e9,0x6c03f366),LL(0x7fd85da2,0xd5f694e1),LL(0x52fd006e,0x2f043a61),LL(0x51032d25,0x8bc9cc74),LL(0x9348d55c,0x6f5370ca),LL(0x56333c4c,0x3610540b),LL(0xc9a5ca53,0x716d25cb),LL(0x39d8071b,0x7337f70a),L_(0x00000036), LL(0x387c11b0,0x97db6fc5),LL(0x3251b143,0xdb755cfd),LL(0xd84aa2bf,0x0cc3e62a),LL(0x9e9e3810,0x6071f1f8),LL(0xe47fb104,0x3e7012d9),LL(0x97ec5c7c,0xf6c7e6ad),LL(0x98bc4de4,0xa4e7cef6),LL(0x240c6a07,0xa03a3a12),L_(0x00000198),
+},
+/* digit=58 base_pwr=2^290 */
+{
+ LL(0xdddd94b7,0x7663b161),LL(0xc93f0cc5,0x071af3d7),LL(0x22d6ac11,0xb9149bdc),LL(0xe6312d84,0xe44e4632),LL(0xc50d4c88,0xc448cc8e),LL(0x6c85277a,0xbfe4f89a),LL(0x128700ea,0xa38e5f2e),LL(0xb742928e,0x3e261880),L_(0x00000029), LL(0xc113b689,0xfa51028c),LL(0x9b6a14e2,0x09549191),LL(0x82dfd5da,0xe13022a3),LL(0x233ca662,0x96fafc24),LL(0x505fe429,0xa18dea4f),LL(0x96182166,0x15ea5a2d),LL(0x199ba558,0x22a4ac80),LL(0x33772326,0xb13c3b81),L_(0x00000111),
+ LL(0x46be575a,0x215bf15f),LL(0x61cb09c8,0xe5912a10),LL(0xae2de789,0xd84851c6),LL(0xd74ceccc,0xb95ccd21),LL(0x6a285101,0xd32dddf2),LL(0x0122d3f6,0xdb554921),LL(0x02c5d952,0x96a4aa1f),LL(0xb24be997,0x8cde88aa),L_(0x00000007), LL(0x0855f9f8,0x2cd753b8),LL(0x88aff9b9,0xcc49d782),LL(0xf7cdce61,0xdac4e445),LL(0xfad48cc3,0x0ac2a937),LL(0x956fdfcb,0x98c5bdda),LL(0x81841ce2,0x9f12bb3e),LL(0x170e6c81,0xcab58ad5),LL(0x30efd73e,0x76a3a481),L_(0x000000f4),
+ LL(0x17b9123c,0x361c2c61),LL(0xb9e4b6ab,0x810de58e),LL(0x3d0db7a6,0xe085a8d1),LL(0x45a31ec7,0xa7bb9df2),LL(0x35378c99,0xd8933f30),LL(0x186da525,0x1033d24d),LL(0xddb7a3b3,0x8af19819),LL(0xb5c9012c,0x57d17203),L_(0x000000c1), LL(0xe7a75fd6,0xce3ccda4),LL(0x41697bbe,0x5c6d7a27),LL(0xb8be57fb,0x1fba9fbf),LL(0xc562ecca,0x9a3fed12),LL(0x1bcd8090,0xf597a3fc),LL(0x74a6954d,0xce4e5ded),LL(0xb4910fbc,0xa5ed9cf8),LL(0x79902452,0x9c77346d),L_(0x00000177),
+ LL(0xc67a3c57,0x3a4f332d),LL(0x3d82a438,0x56af6321),LL(0x0fc06213,0xca05acfd),LL(0x8864ca32,0xe80103ea),LL(0xc2e9c7c1,0x99dd0ff4),LL(0x4c64b758,0xc9889d76),LL(0x80c128a8,0x881a1256),LL(0x77fdb7cd,0xf09f58ad),L_(0x000000c5), LL(0xcda86d61,0xc6ecd4f9),LL(0x41a633a8,0xecb1fc4c),LL(0x847c2f58,0x92dae51a),LL(0xa7d7b295,0x268f50e3),LL(0x3b5eef6e,0x3a27de2a),LL(0x0d7a599e,0x14916d54),LL(0xd01f9b57,0x204fbca0),LL(0x675e52e5,0xeb48615c),L_(0x000001d9),
+ LL(0x76250214,0x0a639042),LL(0x0fd5737f,0x31d2eb63),LL(0x801bd86d,0x85ffa7ea),LL(0x1011c35d,0x8d043e51),LL(0x1ef5b87b,0xcb405068),LL(0xec30dbd9,0xc20daf68),LL(0xe48310c1,0xcee24a41),LL(0xa65b8aca,0x119d1da9),L_(0x0000008e), LL(0x58c134d6,0x716e9def),LL(0x8b2825b1,0x5d82926b),LL(0xb4cd0082,0xe1a8a7c8),LL(0x6474e309,0x12620e3a),LL(0xb0da6f90,0x2d673d4a),LL(0x574adf3d,0x628b88b6),LL(0xb210b971,0x9d1b96a3),LL(0x6b2d573e,0xedcd56fc),L_(0x00000081),
+ LL(0x9d453d01,0xe07f6e9e),LL(0x0f0b6a27,0xa4a6f307),LL(0xddeaaa37,0x9c430a1d),LL(0xeacad6b5,0x9620fd47),LL(0x9a8128c0,0xf279790d),LL(0x3bf5952b,0xfb97ad6f),LL(0xe0561485,0x0fe7692a),LL(0x482c591f,0xe268f3cb),L_(0x0000017f), LL(0x0807b886,0xdb21bfbb),LL(0xde3dc674,0xdbf154f3),LL(0xf4401caa,0x32e63083),LL(0x462197d4,0xb9452cf6),LL(0x46240ddd,0x10344368),LL(0x1c6dbfe6,0xa986f17f),LL(0x94ccbb69,0x4632a20c),LL(0x3f6277d7,0x33029382),L_(0x00000197),
+ LL(0x0b3dd856,0x2b718a28),LL(0xd8752e23,0x65e87e31),LL(0xa158249b,0x88c3f123),LL(0xff7b1118,0xd9121432),LL(0xbe4461fe,0xa0850e4f),LL(0x9ef5bc2d,0x6350e71c),LL(0xf28780a7,0xc6dabd80),LL(0xfc8f574b,0xc3c266b1),L_(0x00000143), LL(0x007b740b,0x13bf6ff9),LL(0x7db218bc,0x9d000699),LL(0x0dec75e5,0x7cf7628c),LL(0xb95f2df4,0x2fa7aacc),LL(0xe8ff9a7d,0x96555722),LL(0x1076129b,0xa11a1984),LL(0x57afac1e,0xfd1e9ec4),LL(0x16d64a31,0x008b70a7),L_(0x00000032),
+ LL(0x67420c4b,0xb0d9eaa8),LL(0xf5caa2dd,0xddc322f7),LL(0xc31038c0,0x08fb4b57),LL(0xa651596a,0xd9ca6980),LL(0xab32e2a6,0xc95c78a8),LL(0xe5808eea,0x5a32ba78),LL(0xf5f9923d,0x3bbece34),LL(0x26ad1c8d,0x8f8b8459),L_(0x00000109), LL(0xbeef787c,0x16843645),LL(0x8875d753,0xa90e9fa2),LL(0xe13608c5,0xaf90c364),LL(0x57e5556e,0xcc40e058),LL(0x9e332dda,0x9c5012b5),LL(0x2b76768f,0x8a76230b),LL(0x2932d53c,0x573bdff3),LL(0x14999fbd,0xeee93001),L_(0x00000040),
+ LL(0x9092892f,0x1a3f60e5),LL(0x7e88fc70,0x29625c0d),LL(0x396b1851,0x610e5833),LL(0x947ef062,0xd8dd1f5d),LL(0x47f1a571,0xa0f65294),LL(0x7850d950,0x49f087e9),LL(0x22c8e733,0x18807434),LL(0xce5508b2,0xd0fc8fca),L_(0x000000a0), LL(0xc40adf60,0xc3d1360f),LL(0x69072d8a,0x8b9d1e81),LL(0x8cba6305,0x01ed34a6),LL(0x7a1a3844,0xbc37f296),LL(0x20c61572,0xd409e84e),LL(0xd54640e7,0xeb6c948c),LL(0xc9243fc3,0xc754fba2),LL(0xb39c9166,0xc28f4f28),L_(0x00000182),
+ LL(0xfb5d6f5a,0x32c7f33f),LL(0xa0e6751c,0x47474b7e),LL(0x7f265069,0xe1e4a2ce),LL(0x0460d889,0xeab5839d),LL(0xb51b9a7f,0xe7cad388),LL(0xa5032a25,0x46ee855a),LL(0x6621ee7b,0x16fbfccf),LL(0x5a6f1501,0x73af1329),L_(0x00000175), LL(0x070dcac9,0x694e09ae),LL(0x0646542a,0xaceb179f),LL(0x27a867a4,0xeb30df16),LL(0x14cf3975,0xf9d85fe3),LL(0xa18e96b2,0x37e6f97d),LL(0x7781a0f2,0xb09bd1ce),LL(0xa8de0b13,0x278a1089),LL(0xc3a91cf5,0x02296583),L_(0x000001f9),
+ LL(0xbdb5de67,0xeca2c791),LL(0x86fe1661,0xd1c18fea),LL(0x4aedcbc7,0x3f879f46),LL(0x0545d544,0x4cb96993),LL(0x95120a10,0x595026f4),LL(0x1d335198,0xc959c824),LL(0xa814ec2a,0x8fbede3e),LL(0x0e062b6d,0x3832b5b2),L_(0x00000086), LL(0x78dc0113,0xfad2bbc3),LL(0xcf89249c,0xf01f3803),LL(0x63266c42,0xb86898e0),LL(0x685db0a5,0x3becca8e),LL(0x7e4eaa63,0x3ec31fe1),LL(0x90fcf86c,0x394a64f7),LL(0x967f0628,0xc6f81bcd),LL(0x635c81b7,0xec462896),L_(0x00000158),
+ LL(0x3f6901a6,0x67236236),LL(0x67484461,0xdb36fbe6),LL(0x5f5c47c0,0x9fb54024),LL(0x71f2fbb3,0x44525a78),LL(0xbedf63e3,0xe71375bd),LL(0x9f085fb8,0x47d50bd8),LL(0x1c59b6e6,0x2f2ea430),LL(0x578031fa,0x58012b66),L_(0x0000019b), LL(0x48eca8dc,0x473015fd),LL(0xfde2151d,0x9616e82c),LL(0xe4d908c9,0xd4ec3b2f),LL(0x04a04977,0x13df9ad2),LL(0x3ee923f5,0x2b66641e),LL(0x175bb5d9,0x0fcd9df2),LL(0xcdb5c3c9,0xfac57254),LL(0x7fde8809,0xc6981a62),L_(0x00000185),
+ LL(0x89022a23,0xb19296e9),LL(0x9d659d99,0x6d5aa5b9),LL(0x489a28d9,0x5422e69c),LL(0x5cf35829,0x06993c4a),LL(0xed0dce41,0x4bccea69),LL(0x21d11ff6,0xa2e82c7c),LL(0x44f73388,0xda3168f8),LL(0xf6117d7c,0xdff018c7),L_(0x0000007f), LL(0xc2227980,0xeb022661),LL(0xe965ba34,0xfeff852b),LL(0x1a68518b,0xbe9a9ee4),LL(0x53aa84d0,0x31f46a2c),LL(0x112327ea,0x6855b874),LL(0x06311411,0x43d26e75),LL(0x7348f329,0x65628948),LL(0x0582ac08,0xe3244339),L_(0x0000001a),
+ LL(0xdb77778a,0x5a842868),LL(0x12b97327,0xd4a2fefb),LL(0x8f7a410f,0x84c0e584),LL(0x98e19862,0x3fbe93da),LL(0xe566e4f8,0xe44a9540),LL(0xec1d03a0,0xa377131e),LL(0x1b99313e,0x27336d2c),LL(0xc15f4f38,0x8c27d958),L_(0x0000009e), LL(0x7c38c847,0xe75811d3),LL(0xc54aa0e8,0xe1cbcf6b),LL(0xc195aaf4,0x5596682f),LL(0xe98a5845,0xe0cf229c),LL(0x70256db2,0x5a921b26),LL(0x10d830e7,0x37fc26fd),LL(0xe3def649,0x16a810c8),LL(0xdb834a77,0x613433c1),L_(0x00000034),
+ LL(0xd8bd0a2c,0x7624b24b),LL(0x7db58054,0xabebbd07),LL(0x20618f15,0x3a5e2752),LL(0x72097df2,0x4f72e3fd),LL(0xf79b4cba,0x6f03686a),LL(0x3cfd9643,0x2d89778e),LL(0x683c4a14,0xeade01a4),LL(0x7cca2771,0x533fd14a),L_(0x00000168), LL(0x182d4838,0x5f84ba35),LL(0xb97b68e1,0x4e0b9bd1),LL(0x6e47fe3d,0xcdba9cfa),LL(0x3026f026,0x6e415889),LL(0x057de03a,0x7c12c31f),LL(0xa54231cf,0xcdfae481),LL(0x68a6cb37,0x3908080c),LL(0x259ee9d4,0xa3c797b1),L_(0x0000009c),
+ LL(0x25864119,0x021a0d91),LL(0xd49fbe57,0xde5b21b0),LL(0xbb57b277,0x7291e7e7),LL(0x1e6a4b2d,0x16da29ce),LL(0x4426f88c,0x68f8b71f),LL(0x6a6ebaff,0x9995fbf7),LL(0xab510adb,0x6ec18d2c),LL(0x8d4b996a,0x3ce11f1f),L_(0x000001bc), LL(0x1321f3ca,0x8e04c405),LL(0x34703d79,0x6b0a33af),LL(0xdd55e68b,0xb14161e8),LL(0x4737f09c,0x57558d9c),LL(0x90c00b53,0x9d9a485a),LL(0x508e73fc,0xbb09dac2),LL(0xd252e5f5,0x4ba2132e),LL(0x33b1efcb,0xc58bf239),L_(0x00000193),
+},
+/* digit=59 base_pwr=2^295 */
+{
+ LL(0xaba36d21,0x5b781a84),LL(0x584291d5,0x6ea73ad7),LL(0x992c0a26,0x20e9954c),LL(0x169e02af,0x4d73d175),LL(0x2718e0ca,0xe1612ee1),LL(0xed50926d,0xc638cf1d),LL(0xc1060d91,0xb5998df8),LL(0x4b7dc332,0x4eb7dc88),L_(0x00000062), LL(0xaadf4bca,0xd78eae21),LL(0xa9f4bf2c,0x372725c2),LL(0x86c74c6b,0xb5b5158f),LL(0x736a4de4,0xba4800d6),LL(0x451f4693,0x5138590e),LL(0xd2239cb9,0x6f5d263e),LL(0x45bdc4c5,0xc0f8acf5),LL(0xd06676d4,0x8bbd0743),L_(0x00000003),
+ LL(0x04c169d8,0x714fe80d),LL(0x2da244cb,0x06f04145),LL(0xcda8b722,0x84ee9fa6),LL(0xc3d58870,0x0e111da7),LL(0x1c267392,0x53bb35ef),LL(0x906e57c4,0x6a858e61),LL(0x3eebaa20,0xf4582387),LL(0x20dd3b5b,0xcf71c4a7),L_(0x0000015d), LL(0x81e2955e,0x91605cdd),LL(0xe98756fb,0xcda7aac0),LL(0xf0286c4c,0xb4372718),LL(0xa4017819,0xdae0a5d8),LL(0x21935131,0x0720f8cb),LL(0x261dafa4,0x40e03217),LL(0x6fb18c8c,0x34851940),LL(0xcd3c7d48,0xe02770ca),L_(0x00000146),
+ LL(0x3aea03d8,0x826415dc),LL(0xaee30325,0xe70ecca1),LL(0x8395cad3,0x053fd2fe),LL(0x148ed662,0x3520779d),LL(0xad7a6345,0xc9cad78e),LL(0x02a99616,0xb2b3d15b),LL(0xa5bc3102,0x9cfe5a4d),LL(0x4cc19d74,0x59fc0a6f),L_(0x00000106), LL(0x3f02d2b6,0x3a1ba1c9),LL(0x487fa3ac,0xb4dfc9f7),LL(0xe0d152d8,0xf699a6f5),LL(0x8f345525,0x20633fdf),LL(0x76ba6839,0xca7d8a08),LL(0x2bd4f59f,0x88585003),LL(0x05078df0,0xcface355),LL(0x01da05b9,0xfd2eb0a9),L_(0x000000a7),
+ LL(0x5676f0c9,0x52b16ebe),LL(0xf47e5b46,0xe6ae36e7),LL(0x71c81701,0xe3a4cc33),LL(0x1ae7f8d6,0xb29431c3),LL(0xaeb29c67,0xb869125f),LL(0xe16be2af,0x052cfd62),LL(0x934ce6d0,0x10638824),LL(0xe1cd7490,0x2b021800),L_(0x000000e6), LL(0x23a9de59,0x53a39e35),LL(0x21f34b32,0xaa3b5761),LL(0xd9c36b4a,0x2e0442ed),LL(0x419b2399,0xd2725144),LL(0x4d374723,0x0ced8d6e),LL(0x6d58a708,0x1b1f1118),LL(0x0cd63ed1,0xd7a4d0b5),LL(0xf4c6faa6,0x9c897561),L_(0x00000055),
+ LL(0xca7de8bc,0x0cb3fdd3),LL(0x8e8db5d1,0xaee5321b),LL(0x87aea4fe,0x3857736e),LL(0x16711165,0x0c1ddf85),LL(0x0fefea55,0x5866facc),LL(0xf4b819a9,0x33eac999),LL(0xde7464eb,0x2a31e0a7),LL(0x4f70e413,0x152ce312),L_(0x0000015a), LL(0xab29e0e3,0xbf9b85c5),LL(0xba27db9c,0x153c54c7),LL(0x65beb177,0x0c1db955),LL(0x38a15bc3,0x12ad15c1),LL(0x1bbf7edd,0x99f39d44),LL(0x0cddc300,0x017014dd),LL(0x7ea43a2c,0x2d23d878),LL(0xbec5a12d,0x5eda0b7d),L_(0x00000155),
+ LL(0x64653256,0x06657d80),LL(0xd29c3627,0x8365a95f),LL(0xe70b9e02,0x084d6b18),LL(0xc68fa40d,0x80bbbcfe),LL(0xae56df9d,0x8a06728a),LL(0xb6253373,0xbd4a361e),LL(0xc77e1c92,0xd3c11b1d),LL(0xa94fbeef,0xa52dffaf),L_(0x000000fb), LL(0x00a47f4f,0xf19acb1f),LL(0xe668d3f2,0x23cbf024),LL(0x095d2d5d,0x7f105b84),LL(0x89f76b69,0x5b550d74),LL(0xe73345da,0xbc9d3a15),LL(0xd2b26a8f,0xd6a293e0),LL(0xe4494adf,0xe0387451),LL(0x818e6417,0xb0518331),L_(0x000001b0),
+ LL(0x9bcbace6,0x4d2a42df),LL(0x808fa6d8,0x68651170),LL(0x445f0d4b,0xec0d410c),LL(0xc6980698,0x1ad2d890),LL(0x005f7ee7,0xbcda7089),LL(0xa7d283e2,0xf5b48062),LL(0xcee64fee,0x0051a180),LL(0x73e72ad4,0x848f7b7c),L_(0x000001be), LL(0xfa1706be,0x690a81c3),LL(0x3ce8b5c2,0xac33d774),LL(0x15e254f0,0xa423baea),LL(0x948fbc87,0x2fe89ca2),LL(0x80cdde65,0x9a165eb6),LL(0xb1b05690,0x1c84102d),LL(0xc135f5d4,0x73f34a94),LL(0xc61329b0,0x8ced1268),L_(0x00000189),
+ LL(0xee3f1678,0x9713685f),LL(0x93a123f3,0x6ef5a591),LL(0xf28bae61,0x67b33050),LL(0xda7d2c65,0xae5b6596),LL(0x59fc9e4d,0x0481adbd),LL(0x18dde4a4,0x2fe92c16),LL(0xf2a19468,0x5adc0431),LL(0xeac05bc1,0xdb30fcce),L_(0x0000013e), LL(0x900c6eaf,0xee47d7a2),LL(0x4cf35b8d,0xc425ee95),LL(0x74908606,0xcdac359e),LL(0x22c94a88,0xef2c8586),LL(0x10d20bfb,0x8d0f7458),LL(0x1ca77f65,0x426741d7),LL(0x82f59f1e,0x640314c7),LL(0x294af36c,0xec0709c8),L_(0x00000035),
+ LL(0xcbc694b2,0x1e52ac8f),LL(0x0894401e,0x36abe923),LL(0x9f482e3b,0x81ce378a),LL(0x32d1efaf,0xae954687),LL(0x62ff86e1,0xd9afd8e0),LL(0x085da5ec,0x5871a105),LL(0xd026254f,0xe7a32717),LL(0x83b4a648,0x40288d2e),L_(0x0000004b), LL(0x3c782f28,0xb0b6dc10),LL(0xa8898440,0x699ececa),LL(0xe53262d1,0xdf9ba3e4),LL(0xdb180197,0xa82e89ff),LL(0x786042aa,0x97af8b17),LL(0x663faa6b,0x00b45e0a),LL(0xf346c12e,0x03c76f2d),LL(0xe8ec3f00,0xbda1be57),L_(0x000001a3),
+ LL(0xf094c184,0x55c5c739),LL(0xfcd89a8d,0xc0dcdb75),LL(0x71a4d047,0xd498ccfb),LL(0x8baef9a3,0x669e7edb),LL(0x20d8ae8f,0x98d6b13c),LL(0xd16a48c7,0x3f4ca564),LL(0x50d24170,0x509f9dc2),LL(0x8c680ef9,0xb2c17a38),L_(0x00000170), LL(0x942861e3,0x23778808),LL(0xe8d8d33c,0x9dd269ab),LL(0x9bd2fb18,0x1e8769b1),LL(0x62b11258,0x657bacd6),LL(0x8521c19d,0x584fbcaa),LL(0x46adc05d,0xe93891c5),LL(0x68fad3f4,0x8617aebc),LL(0x0857bce7,0xe39a4226),L_(0x00000101),
+ LL(0xfc938e83,0x17cc51bf),LL(0x6d70f113,0x546beb5c),LL(0xc94a2150,0x62ee8e73),LL(0x3d11d590,0x255999c7),LL(0x8c21f26b,0x42e22a6e),LL(0x3732f418,0xb9e01e7a),LL(0x910608f5,0xea10cdc0),LL(0xef7f9669,0xf54f17b3),L_(0x000000b5), LL(0x83ab9767,0xe994f9cf),LL(0x5a87a958,0xe54c87e2),LL(0x6e7d0b5e,0xa8cc0493),LL(0xb0873928,0x837b814a),LL(0x92c0806c,0x1e804d39),LL(0x8cb9df2c,0x1d8a5f76),LL(0x2377456b,0x33c3155b),LL(0xe6d63e09,0x55cb5f9c),L_(0x0000011e),
+ LL(0x4f8eb1a8,0xcfd79f62),LL(0xc5d103b9,0x295548e9),LL(0x71b65a58,0xb8462f3d),LL(0x40934991,0x1453c2b2),LL(0x41c087b5,0x1cf62fb3),LL(0x37eea50d,0x02ab6cdb),LL(0x7ada571b,0x1b49b692),LL(0xda9e677d,0xb52dc4d6),L_(0x00000004), LL(0xb839d5a9,0x2e42f171),LL(0xb6cceda3,0xdbcc6765),LL(0x09960889,0x2e336d9f),LL(0xe5440e8e,0x34cefd7d),LL(0xb410a81f,0xd8bc6b5a),LL(0x91782d60,0x46d80cbb),LL(0x95e22f30,0xc99291ea),LL(0x9e775cf7,0xca473be0),L_(0x00000082),
+ LL(0xcc9e1b6f,0x06ac0186),LL(0xbd98b833,0xdc7e7944),LL(0xae0a1564,0x0b94fb31),LL(0x8b85aba8,0xfd0db6b7),LL(0x3fa21f5d,0xbb92a7c4),LL(0x7133a3ce,0xfc2b2cf0),LL(0xd39f3731,0xb63fc2cb),LL(0x376e5f1f,0x4d89e9a6),L_(0x000000ce), LL(0x194cc828,0xe98c5f25),LL(0x2178e890,0x51c9207d),LL(0x1be32aa0,0x8d2cb6c8),LL(0x629881ee,0xdb210410),LL(0xe3099a6e,0xfd24a488),LL(0x62aff70d,0x6e705a1e),LL(0xb843d997,0x41319b69),LL(0x8bfa95c3,0xd9b9376a),L_(0x0000010b),
+ LL(0xa3e1ec65,0xc2b6a03b),LL(0xfefa851e,0x0a7bf6b7),LL(0x3a92f668,0xbf4905c0),LL(0xe8a75dea,0xff483a6a),LL(0x78467396,0xdc163b2b),LL(0x8999b6fb,0x8968be09),LL(0xc4a53538,0x419a12c9),LL(0x40b8e919,0xd87c8896),L_(0x0000010b), LL(0x81b9e47c,0x68f69e36),LL(0x5971b3c8,0x53ea08fc),LL(0xbd601db4,0x0ff01a96),LL(0xa72aee96,0x347158b6),LL(0xef1dc3a0,0xc8994151),LL(0xb70d9ea4,0x39937de4),LL(0xa2906842,0x73a17885),LL(0x1ae4276c,0x34f8bee7),L_(0x000000a8),
+ LL(0xfe5a5236,0x7fdb683d),LL(0x5075fbb5,0x35997d35),LL(0x4f7513bc,0xb65dda5b),LL(0xcca089f1,0x0e8d30ed),LL(0xf394427e,0x66ecf608),LL(0x7394ebe5,0x80d0cb61),LL(0x2babf408,0x9903b671),LL(0xb8208316,0xe416cdcf),L_(0x000000b6), LL(0xf1d8de96,0x26090ace),LL(0x026550ab,0xf1bd714b),LL(0xceedda36,0xd83c3071),LL(0x6a6fe427,0x5704c9b9),LL(0x9e328311,0xa3fbc241),LL(0xfceb37ff,0xf54b88ee),LL(0x2f82304a,0xb6315a8d),LL(0x77a230c7,0xeda8682e),L_(0x00000177),
+ LL(0x70a0b8b3,0x5759366b),LL(0xabadb724,0x75b84d60),LL(0x87caf5b9,0x983f793d),LL(0x1cecc3f1,0x94d8de54),LL(0xd8885c2e,0xf90b687c),LL(0xd952f2ac,0xd5046b6c),LL(0x16cc05b6,0x266e5bb0),LL(0x52f97cdb,0x5959c784),L_(0x000001c9), LL(0xefd1f634,0x931e70e0),LL(0xc8989bfc,0x36663528),LL(0xc244410e,0xf14f2667),LL(0xbca645d5,0xf8059cc8),LL(0x1c94e08c,0x1d2134f7),LL(0x1d1a84e9,0x3489ba7b),LL(0x21c35b98,0xdddbab1e),LL(0xa303bfc5,0x86156a8f),L_(0x00000198),
+},
+/* digit=60 base_pwr=2^300 */
+{
+ LL(0x6b1a72ba,0xec83fd79),LL(0x9640b910,0x5166dc54),LL(0x1f3c076c,0x553ff932),LL(0x6d2b7e4e,0x7e2f7e67),LL(0x097c11e9,0xaa2cdad5),LL(0xc5cedff5,0x397f4bc0),LL(0x57d09eef,0x8d95f667),LL(0xe7743495,0xe32eada9),L_(0x000000ee), LL(0x3f068368,0xe641f85b),LL(0xa0e3496c,0xa6b773ab),LL(0x7931548e,0x3aecbf5b),LL(0x2ef14927,0x58c42c5d),LL(0x1528b818,0xfddc70d9),LL(0x1c157c1e,0x0a328d34),LL(0x690e10df,0x0760fd8a),LL(0xa364f5d3,0x4ec3b44e),L_(0x000000d1),
+ LL(0x572bb6c8,0xb187f011),LL(0x26f1e48d,0xb62010d1),LL(0x0d05c4b7,0xe0fbe5e8),LL(0x3f0a2ba1,0x24d802f1),LL(0x189e9602,0xde0b8698),LL(0xc0b8af43,0x28591b4b),LL(0x706b742b,0x36bf7aec),LL(0x63d91963,0xec0d2fd3),L_(0x0000007f), LL(0xe7179b1f,0x440b0b6c),LL(0xe982e3e2,0xd99d67cd),LL(0xd814a6fa,0x7edfbb4d),LL(0x4ac7d349,0x46c6afc8),LL(0x63bbd77a,0x84cd907a),LL(0x18bcc3d6,0xf098909a),LL(0x756b5193,0xd6e0581d),LL(0x02f37ab5,0x06adf4d1),L_(0x000001fb),
+ LL(0xf4b1ce28,0xe90415e4),LL(0x6bd8544c,0xc664d2f1),LL(0x3e7600d6,0x01912f05),LL(0x1e8d9aa4,0x3e0c268e),LL(0x43dcdadd,0x2f140134),LL(0xbf936e21,0x252cf59c),LL(0xb8aaec39,0x00b8cef4),LL(0x7ed652c2,0xc64c11e4),L_(0x000000aa), LL(0x7a2dfe0a,0xa7c08e2e),LL(0x59176893,0xafe8a484),LL(0xc7c5a8f0,0x6f043d0d),LL(0xe33e999b,0xb3c3cfd6),LL(0x2a496c00,0xcb4fbc5e),LL(0xe2690de5,0x1dfaf5ee),LL(0x3d2db451,0x743e9277),LL(0x8bfecdd2,0xade6a194),L_(0x000000f4),
+ LL(0xcadf2116,0x8d039609),LL(0x488fdf25,0x1e037339),LL(0x0e39945a,0x4d16fa60),LL(0xf539a844,0x54408c23),LL(0xf7f8ccc4,0xbef729fb),LL(0x69b8abc6,0x76661fe3),LL(0x3dbd87a4,0xa8903415),LL(0x790f6266,0xc7b4bcd2),L_(0x000001e3), LL(0xec9aa47b,0xa406e205),LL(0xce1af477,0x72e7763c),LL(0xf7fcf645,0x43d00999),LL(0x1f7c9317,0x02adccdc),LL(0x8b87a139,0x541be26f),LL(0x9ffcb96f,0xbb590677),LL(0xc0636264,0xc0db1d61),LL(0x19484331,0x5585c8ae),L_(0x0000016e),
+ LL(0x77cc15c1,0xe85899b3),LL(0x5fff92e2,0xb4a44f31),LL(0xa8cf599e,0xca1a3e87),LL(0x17a2e4cf,0x205f34e2),LL(0xe4f28f3f,0xe9eb1362),LL(0x4aa7c205,0x6ace61c8),LL(0xfa76515b,0x7e550586),LL(0xec83aca3,0x35e870f8),L_(0x00000104), LL(0xd113de7a,0x2e02203e),LL(0x318327d4,0x004d9655),LL(0x5d903904,0x7cd1d2f1),LL(0x9d294adb,0xca1242c8),LL(0x3b5bb4eb,0x4af2a142),LL(0x93818e82,0x15e366f3),LL(0x9a304441,0xd6a53de7),LL(0x49183b2c,0xfd324d82),L_(0x0000007b),
+ LL(0xdb2cf29c,0x4d1ee196),LL(0xa1d04903,0xe53d6718),LL(0xacaf386a,0x6605e4e6),LL(0xcc306d74,0x458e136f),LL(0x77dc40c4,0xab7a1ac6),LL(0xbb331955,0xd47f6ee4),LL(0xb95c386e,0x43841037),LL(0x526640fb,0x00a37bb7),L_(0x00000010), LL(0x8f1bcdb4,0x8b8cc55b),LL(0x71d84cd7,0xe7e03251),LL(0x1b8eb12e,0x64c45f59),LL(0x2d7bd8c5,0xc2283df1),LL(0xb03bfc76,0x28a36461),LL(0xafd6fc81,0xa0580c8c),LL(0xe72b6275,0x511c376a),LL(0xce438282,0x0ca3213f),L_(0x00000078),
+ LL(0x353cadbb,0x1e2c0f6f),LL(0x17179cb8,0x0810156c),LL(0xaf140db0,0x63cd1fa8),LL(0x2171bb5e,0x729533d8),LL(0x544c77b0,0xf6676827),LL(0x0143af56,0x599efe1b),LL(0x5a759df2,0x3accffd4),LL(0x55962b59,0xc61321e5),L_(0x000001a3), LL(0xa5358dc7,0x66e58a6a),LL(0xbb4d42d5,0xe0cfd739),LL(0xe6ef3760,0x0620ef46),LL(0x6804fb37,0x253e0f9e),LL(0xf4e9cdc2,0xcb5c8c64),LL(0xec6f6658,0xa80d08da),LL(0x04153037,0xcc959be5),LL(0x3d215b47,0x7aaaa865),L_(0x0000004e),
+ LL(0x166381e4,0xf52bc233),LL(0x9700029a,0x2a837019),LL(0x3201dddf,0xd02e2c74),LL(0xd8885cda,0xaea6cd36),LL(0x7e35126d,0xbc3f784e),LL(0xfa40cea6,0x5130e882),LL(0xeec16a3a,0xace2f121),LL(0x13c43706,0xf3c3a16a),L_(0x000001cc), LL(0x9e7a6c25,0xc964823f),LL(0xe8e4729a,0xeed8d7ba),LL(0x3fe54edf,0xcfba42bd),LL(0xec6a4e7b,0xe917bf88),LL(0x06be2039,0x604163c6),LL(0x17d5a63a,0x6bdf09b0),LL(0x276869bd,0xf021410c),LL(0x4b94144f,0xf038cdd9),L_(0x00000013),
+ LL(0xf09a7d9b,0xeb8a6d24),LL(0x724db1ba,0x545ff43f),LL(0x850f42b2,0xfcaf8079),LL(0x5c1fdccc,0xde18c209),LL(0x57404da7,0x83097de7),LL(0x267842f8,0x8706015d),LL(0xab9a893d,0xe62c08dd),LL(0xe2b0c7a0,0x736bf358),L_(0x00000142), LL(0x254c1866,0x535f7766),LL(0x4779dd4d,0x10a98c32),LL(0xc095243e,0x0e7bc245),LL(0x3cd82df8,0x5fac69de),LL(0x59efca16,0xa2f0af19),LL(0x692e1ddd,0x40c91226),LL(0x9b21f9d2,0xa682e04c),LL(0xa51cafc2,0x831c0e79),L_(0x00000049),
+ LL(0x6101ea3e,0x94e4798e),LL(0x00af5508,0x9afdccb8),LL(0x987426d2,0x0f5f64d2),LL(0x4aaeb57e,0x76899b88),LL(0x9a8859b4,0xcf38ab59),LL(0x31a64817,0x8dc36916),LL(0x9b757c1f,0x28b27539),LL(0xfb6a189c,0xc63802b8),L_(0x000001ba), LL(0x997a98e3,0x225f33e4),LL(0x9d6bb39a,0x880025e5),LL(0xffb62ebd,0xb7d05691),LL(0x6aacd544,0x3e434b4f),LL(0xba8454f9,0x4bc06244),LL(0xbe5d3fe0,0x941bd419),LL(0x6732d1a1,0x6794ada7),LL(0x6efab77e,0x1058a767),L_(0x0000008b),
+ LL(0x7d41eaad,0xe58d6aac),LL(0x5f7430b9,0xb9ab109f),LL(0xedf696b8,0x252205ff),LL(0x65163bdb,0xb3a47496),LL(0xfd8eca02,0x915f0458),LL(0x6d6b0ec4,0xb0096e8b),LL(0xddddf89f,0x874c9e5e),LL(0xab9c669c,0x156cfc6b),L_(0x0000019a), LL(0x80d21354,0x8c6752e9),LL(0xc103803a,0x0196650f),LL(0x653fb161,0xe597cf0d),LL(0xa211c0cf,0x66902c1d),LL(0x126bc8cd,0xff4436dc),LL(0x502c8df4,0xcf0ef89e),LL(0x30d9c137,0xadabc266),LL(0x509eb349,0xcbdaa030),L_(0x000000ae),
+ LL(0x80ee5e16,0x9d067e75),LL(0x0846b23b,0xb348d35d),LL(0x6044d60f,0x4e0c74fc),LL(0x4437fb47,0x2124f846),LL(0xc898c89a,0x30abdb7d),LL(0xa1ecdf1d,0x496e747c),LL(0x09be44bd,0x9381d368),LL(0x6a34a28e,0x2cd1e7c2),L_(0x0000002c), LL(0x21c47e8f,0xece95ae5),LL(0x705df30c,0x08cdb28f),LL(0x8f6f90ca,0x15b2caca),LL(0xdb9f29f0,0xf8e2597f),LL(0x537c5e8b,0x91e195ad),LL(0xa54bf828,0x1ef3bc47),LL(0x5f5b1233,0x6c98e99d),LL(0x096c5cfe,0x0acf39b3),L_(0x00000155),
+ LL(0xe7e060d2,0x5e49ea9e),LL(0x8278d27c,0x1462a5cf),LL(0xb6b188b1,0xd1c3e723),LL(0x7adfe4be,0x9f4ab12b),LL(0x4f74656e,0x86f9e399),LL(0x15f9fd6f,0x647aabe4),LL(0x356f176c,0xdc05df56),LL(0x037f39e8,0x6f8c9681),L_(0x000000ab), LL(0x7fabb630,0xfd586565),LL(0x4f9b62dd,0x9a07decc),LL(0x07d1665c,0xb14d451c),LL(0xb6af032b,0x2d75e1e7),LL(0x7c7044cc,0xac2df8ec),LL(0xcac8a69f,0x0906e20d),LL(0x20c70582,0xa4167466),LL(0x1ca47052,0x6fe2b8c1),L_(0x0000002e),
+ LL(0xc222cb55,0xfb8bf3d9),LL(0xcaac45d1,0x39bf904a),LL(0x4d2bf532,0xa7f1203e),LL(0xa3246448,0x9ecdf560),LL(0x6d3940b2,0xa6d3b3a3),LL(0x89bdcf57,0x40dcc76f),LL(0xdcc95c73,0x9fa5791b),LL(0xa442ea24,0xc94b40b3),L_(0x000000fd), LL(0xbfbd8ae2,0x8473e7d8),LL(0xbc97c4e6,0xe17e4cb3),LL(0x8daa65ee,0x1d315fc6),LL(0x20c6ff94,0xeaec9cae),LL(0x74f3ffd6,0x1b61c251),LL(0x015f6f88,0x6a1cf873),LL(0xee694708,0xd187e0b9),LL(0x37da53ba,0x332ba61a),L_(0x000000b9),
+ LL(0x44bad1e8,0x409292b4),LL(0x27a8575f,0x23606aaf),LL(0xeb1afe84,0x6df6bd82),LL(0x546ebac4,0xd77cd802),LL(0xd19a6a0e,0x9ac38a98),LL(0x701bcf92,0xae1c0504),LL(0xd6247bc1,0x90bada7a),LL(0x7a406e08,0xcc3c49ab),L_(0x000001ac), LL(0x1a859f6a,0x5dcf7e44),LL(0x5f7352bf,0x2b674d19),LL(0x0ee31d4e,0x35a3e68d),LL(0x92916c56,0x5e153a5d),LL(0x1bbba324,0xa3d55e06),LL(0x27d3691c,0x74f6e553),LL(0xa9153a98,0x2c8a7473),LL(0x6e737b68,0x545acbac),L_(0x00000114),
+ LL(0x741a9412,0x892f8bd1),LL(0x31776371,0x6c0b1d4f),LL(0x60a2c8b1,0x9a688a19),LL(0xa0d12ea4,0x56eef3ec),LL(0x4746c345,0x90c83381),LL(0x842db71e,0x3fdb8d8b),LL(0x1bf4ae9e,0xbc576b9b),LL(0x9e0ee706,0x85a8de64),L_(0x0000014e), LL(0x9f19edfc,0x3c32799b),LL(0x25980592,0xc4760975),LL(0x76f95241,0xd6c8d637),LL(0xdd3d3b18,0x677dee0d),LL(0xe5bceafa,0x12ad9334),LL(0x7ca46478,0x3990ceb2),LL(0x94d56dac,0x39d6e555),LL(0x8e338deb,0x7a9d83d7),L_(0x0000016c),
+},
+/* digit=61 base_pwr=2^305 */
+{
+ LL(0x14b21476,0x52d7b490),LL(0x4215e0ae,0x3a781f13),LL(0x84df8cb3,0xaf858985),LL(0xc3ab10bf,0x449e13a9),LL(0xea1a4d65,0xb859368b),LL(0x2c8134df,0xb51fd78c),LL(0xa7d94439,0x4b1e6f5b),LL(0x003f1c75,0x4cf5d47b),L_(0x00000146), LL(0x3cdb3bab,0x6dc28640),LL(0xd6597a8e,0xe3d2ac15),LL(0xe5e853fb,0x8bd192da),LL(0xf804c989,0x76032d13),LL(0xdb66ee3c,0x738d5e8b),LL(0x349bcb16,0xe16c7ea1),LL(0xe4001679,0xd22ec201),LL(0x82f1f584,0xd9f317a9),L_(0x000001b7),
+ LL(0x92fe026b,0xec0a67f0),LL(0x2efbca10,0x3767ee14),LL(0xcc433a34,0x68131944),LL(0x370f6b9e,0x36fcc884),LL(0xb4d1b5e8,0x85328231),LL(0x85b956e6,0x3e4b895d),LL(0x17afd7ce,0x23cd96a1),LL(0xfc28a48e,0x6cbf1cc4),L_(0x00000175), LL(0x8d0ddeea,0x5cc45bb9),LL(0x4201b856,0xbec2c277),LL(0xb4f52020,0xcd76ab62),LL(0x3aabda65,0x2fb221ac),LL(0xd348e9ae,0xb7ba962f),LL(0x81d5e875,0xacdde7c3),LL(0x8ae119ed,0x7186eb96),LL(0xd5b495d5,0xdf795bd0),L_(0x0000016f),
+ LL(0xa9d725f4,0xabe42367),LL(0x83477d80,0xae655393),LL(0x9bf84781,0xf1389d3f),LL(0x50d527ea,0x02ffac63),LL(0x30005241,0x5a3b0583),LL(0x332af83e,0x30a51cf3),LL(0xd633aac0,0x7e87b5f6),LL(0x6133508c,0x54cf5544),L_(0x0000014e), LL(0xddfa61bb,0x79f352eb),LL(0x3d5e304a,0xc8a8525e),LL(0x673478be,0xcd082890),LL(0x65272acf,0x6528a7ef),LL(0x07746b44,0x6120a7a6),LL(0xaa126f2d,0xed8dc8aa),LL(0x0714c411,0x242ecc1e),LL(0x09219322,0x4dd29b99),L_(0x0000016f),
+ LL(0x2f54f5ef,0x9d1e3e79),LL(0x6e1c349e,0x7cb862d6),LL(0x411c782a,0x774f6f73),LL(0xf914b067,0xd88b7029),LL(0xbe145ff3,0x68ac9342),LL(0x0730a2fc,0x77dcfba1),LL(0x7ace014c,0xe34f0621),LL(0x876ebecf,0xb7a85b90),L_(0x00000104), LL(0xd99da4a6,0x2be45d39),LL(0x2af68cfe,0xeda14612),LL(0xbeab553a,0xc8cf47bb),LL(0x185338ec,0x9f26575d),LL(0xbcf5707a,0x2dafc93e),LL(0x9b4f2615,0x85006b56),LL(0x1c517096,0x58e4408a),LL(0x2759575a,0xa451b6b3),L_(0x00000143),
+ LL(0x03077a78,0x64081168),LL(0x9fca1732,0x9e2e68b9),LL(0xc2ec6027,0xbd01c53b),LL(0xcf8e3aa9,0x3c299cf0),LL(0xc31ff566,0x69a934da),LL(0x3a869b7d,0xee4c3bf3),LL(0x17fb711a,0xe353eab9),LL(0xb5b7fc05,0xd300c851),L_(0x000001da), LL(0xb6667f8d,0x7326c782),LL(0xf868e4b0,0x7616e981),LL(0x9cbec832,0x0d0b19fb),LL(0x0355a1b8,0x7504ef78),LL(0x9b3d9f50,0x75e429da),LL(0x0924def0,0x130ecd97),LL(0x07187605,0x844d6f96),LL(0x7c14ae9f,0x8921d3a7),L_(0x0000001b),
+ LL(0x6ef420ae,0x9415e0cc),LL(0xdd321662,0x7be013aa),LL(0xad261af9,0x46c47707),LL(0xedc263d9,0xabc20130),LL(0x2f265a39,0xe142f5b7),LL(0xcfeec142,0x90dba064),LL(0xa08536a7,0x488a0175),LL(0x6d419631,0xcf748207),L_(0x0000003f), LL(0x59c2a2ed,0x6def509f),LL(0x7ce6774c,0x4af30ccf),LL(0x09bc7469,0x3bf7cbb3),LL(0x12464f68,0x648dc8e6),LL(0x93c3b96f,0xb39085a1),LL(0x1000d207,0xe4a3e7cf),LL(0xcb93a762,0x39e62f3d),LL(0x08cde0be,0xd6284f5b),L_(0x00000092),
+ LL(0xcef51b82,0x4fd9fb1f),LL(0x0a484ffb,0x4a91b446),LL(0x5c5120d6,0xcfe786b3),LL(0x521a227a,0x1f347861),LL(0xb4d52b1b,0x005afae4),LL(0x28a0b22b,0xaed64316),LL(0x96565ad0,0xcf8e1f9b),LL(0x3bd3818c,0xd717a7fd),L_(0x000001d7), LL(0xf05313af,0x17132d83),LL(0x4d75e2a9,0xf9bc8f55),LL(0xbaf9947b,0x91f937e7),LL(0xcb9bb75f,0x232e92ab),LL(0x4c1c8f93,0x92cbf962),LL(0x90cd09cd,0xf2dcee1e),LL(0x07dbfe55,0xb89e680d),LL(0xc41cd340,0x51007568),L_(0x000001b3),
+ LL(0x652aa77d,0xb831eea8),LL(0x9b33eda2,0xdd1ac75a),LL(0xccb42fd2,0xe55769fc),LL(0xa865ab8f,0x2ea2c9e4),LL(0xc60208ee,0x28effb93),LL(0x321dff3f,0x2d6b1522),LL(0x5124fb78,0x6e29dc3e),LL(0x4cf961e9,0x2f39193c),L_(0x0000006d), LL(0xe3174790,0x035e63b7),LL(0x67da851f,0x7e9f39d6),LL(0x7183aa79,0xe886c75f),LL(0x4aa59f9f,0x6d9e6857),LL(0x706045d9,0x2ee25277),LL(0xb18ceb8f,0xe4bcaa94),LL(0x5bc3971a,0x57fc8f0d),LL(0x7b7b6081,0xdd642848),L_(0x00000150),
+ LL(0xff257250,0x44c8a327),LL(0x1f4b8713,0xa7ee221a),LL(0x5258be1d,0xe41af48e),LL(0xa737a8cd,0x83aeee1c),LL(0x3f320ac3,0xbb3a2bdf),LL(0x8abc18a8,0x2bfe7f09),LL(0x9da43962,0x5ab55046),LL(0x1318b08d,0xc7f6a7c8),L_(0x000000c2), LL(0xe5844c3c,0x072464c5),LL(0xe109557b,0x52cb5223),LL(0x2e18e586,0xbb44cf23),LL(0x58cf033e,0x8273746f),LL(0x9cb3f3f2,0x15027b4d),LL(0x0badc23f,0x03dd0534),LL(0xebde0563,0x94ef00b2),LL(0xf31a2a6f,0x88f86782),L_(0x000001e2),
+ LL(0x56b13d17,0x5644a483),LL(0x012e151c,0xec46d8f5),LL(0xcb60c92d,0x61f8e693),LL(0xf704143e,0x53579b44),LL(0x06b44ecd,0x98807645),LL(0xdda8c89f,0x17c64951),LL(0xfaab400d,0x2e39e25a),LL(0x16b86130,0xfef9c912),L_(0x0000004f), LL(0x25210623,0xd2367ca5),LL(0xf18ebddc,0xbcf685ba),LL(0x59f6d4cf,0xe159807e),LL(0x8c3c8195,0x2bb8d624),LL(0x02e20259,0x3ad24a15),LL(0x5eef3266,0xe9a952f5),LL(0xc8d0e08e,0x37d37845),LL(0x4cf4addb,0x778df76b),L_(0x0000002e),
+ LL(0x7a1441af,0x55047df4),LL(0xa605ea07,0x579060a2),LL(0x728d81cf,0x3b8900fa),LL(0x1ccc1e61,0xf49f8c7a),LL(0xd633ce10,0x4957105f),LL(0xe467c698,0xc3e2024e),LL(0xa14d0dd3,0xe7cc2be3),LL(0xc90176ba,0x00090c73),L_(0x000000f8), LL(0xf9360056,0x39d8bbe5),LL(0x229fde87,0x1982808c),LL(0x9d5d0ade,0xb83a93a2),LL(0x56715396,0x4130f493),LL(0xf5d0d1b5,0xc39ee248),LL(0xcbf57700,0x0662cf56),LL(0xf41ee620,0x121da851),LL(0x2397e72c,0x1ab413bf),L_(0x0000017e),
+ LL(0xdd8cd85b,0xbdd73dc1),LL(0x1f7a793b,0x7252dfce),LL(0xb3c777ad,0x1ad25f35),LL(0xd306f90f,0x314c1227),LL(0x4538596b,0x28e31145),LL(0x15f73822,0x1808f8a9),LL(0x5e4847ef,0x6eb8175d),LL(0x9d57409f,0x2ae642ae),L_(0x0000011d), LL(0x6debc205,0x3f28e667),LL(0xa45a1d7d,0x84954816),LL(0xe5f147ca,0xccfb8bd1),LL(0xcd78f915,0x9a693642),LL(0xb02b310f,0xb6cb5362),LL(0x1f01047b,0x7529c74d),LL(0x81d1fb13,0xdf4ae21d),LL(0x80b9dd94,0x6a1afeec),L_(0x000001bc),
+ LL(0x7bfa4703,0xc0abf15f),LL(0x81d957db,0x65ae7f67),LL(0xe0fe8725,0x40e4566b),LL(0x7c42febe,0x6340b7ff),LL(0xcf060fa6,0xea1d2782),LL(0x9a689bd9,0xb66eed98),LL(0xc45b992d,0x8f5646a0),LL(0x969dc412,0xd272048a),L_(0x000000d2), LL(0xc0243059,0x50900d7f),LL(0x701c6e38,0xaad1803d),LL(0x92065d64,0xf9668fa4),LL(0x361ef75c,0xfcc216b4),LL(0x962eb248,0x575be56a),LL(0x89b9828a,0xfde9ba30),LL(0x202a575f,0xc435f2ce),LL(0xba3890aa,0xf83734f6),L_(0x0000019a),
+ LL(0xdd8bb48a,0x3ede16d4),LL(0xa59cdc00,0xd0de9f29),LL(0x9f3b7991,0xda7b6269),LL(0x832ec0d2,0xf2e16e2b),LL(0xa8e7c828,0xd0c41727),LL(0x7f0878f9,0xc4546447),LL(0x7356692c,0xc4af90b2),LL(0x5fbe130e,0xaa2e9ec4),L_(0x00000190), LL(0xa8a02409,0x0074a183),LL(0x16d0ccbe,0x351544e0),LL(0xf7b675ff,0xf37d43c1),LL(0x87055e7e,0xc371f0a0),LL(0x3e668989,0xefcfca1d),LL(0x8323227b,0x36507d20),LL(0x38f76084,0x25498782),LL(0x75a23d95,0xacb8cb75),L_(0x00000154),
+ LL(0x1d79b659,0x20886bbb),LL(0x9a6dec74,0x296f5cd9),LL(0xfd24a18e,0x6092fe28),LL(0xbb4a7907,0xdeab539d),LL(0x869a8ccb,0x67f524d1),LL(0x61521c17,0xbbe3aaa1),LL(0x5f79a2c2,0x8be17e72),LL(0x7d8ce0cb,0x647da5af),L_(0x000000d8), LL(0xd52aec82,0x0f2ab363),LL(0x6d93da70,0xdfde9d3e),LL(0xa76d10f8,0xe72ce040),LL(0x17308d11,0x075467a8),LL(0xed2aabb3,0x9aa69a1d),LL(0xc10f78d3,0x4caac399),LL(0x13d4d378,0x7e54c473),LL(0xda4d8f8d,0x911cb804),L_(0x000001b0),
+ LL(0x9aa77765,0x253f45b8),LL(0x2af99e2d,0x112b491f),LL(0x76414d1e,0x4a8e2b12),LL(0x1c380001,0xa17691a7),LL(0xb0f6f9ff,0x4bd4233a),LL(0xcf4e764a,0xccb8bd49),LL(0x012735f0,0xc7fc0714),LL(0xf6037d3d,0x3da811dd),L_(0x000000e0), LL(0x60d3228c,0xf24a8fb9),LL(0xb39e1a42,0xa3c4048e),LL(0x07ea05b5,0xd581bb93),LL(0xfa0b7bd9,0xeeb6ce36),LL(0x8b7b8d8f,0xa0329bb2),LL(0xfcc8cab6,0x5c44e608),LL(0x04c03b08,0x3f2c4c95),LL(0x51593cce,0xb2ef5a3d),L_(0x0000013b),
+},
+/* digit=62 base_pwr=2^310 */
+{
+ LL(0x2fe5424a,0x052a5d7a),LL(0xbd77fdcc,0x91e67c5a),LL(0x7ae80845,0x30c17511),LL(0x4fb64810,0x92e55b53),LL(0x6c21b31f,0x96bd1eba),LL(0x4d056aef,0x3bd89651),LL(0xf597cfd9,0x39ce9f5d),LL(0x10c4de29,0x6737cbaf),L_(0x000000ef), LL(0xf5b4aa6e,0x726ccf17),LL(0xa070d7b2,0xef8a249b),LL(0x33084cb0,0xfece71d7),LL(0xdbf18fa7,0xf11b328d),LL(0x8e7f8fe7,0xdb8c5b89),LL(0xc5842d33,0x38ef699b),LL(0x44b71419,0x619477d9),LL(0xcd39a13d,0x28db36f5),L_(0x00000152),
+ LL(0x95d239ec,0xae5a71e3),LL(0x160db974,0xb267126a),LL(0x4df55ba5,0xf2bfd214),LL(0xcf291fe0,0xe4215d39),LL(0x3dc0a627,0x8849498b),LL(0xfec311ed,0x5b220c7d),LL(0x9fbb5099,0xa3d83cc2),LL(0xc55f9ca4,0x32f62dd6),L_(0x00000053), LL(0x69ec48f2,0xe73278db),LL(0xcaebf5d4,0x38b01c56),LL(0xe4ab979b,0x7e210f66),LL(0xfe305e1e,0x00e35bf7),LL(0xbbd247e8,0xf41625bd),LL(0x64eabbca,0xb3c01407),LL(0xe49d3fb6,0xc31a840a),LL(0x6ebed09d,0x6c67185e),L_(0x0000004a),
+ LL(0xc455f76d,0xeea3bb5d),LL(0xa7efe273,0x382ccbad),LL(0x1d1fd154,0x321aecf3),LL(0xba4c80f8,0x3a3eb329),LL(0x44874ee5,0xfc744e55),LL(0xc89ec973,0xd83775b1),LL(0x9ac52665,0x7c8cecd7),LL(0xe149472e,0xffa02e1a),L_(0x00000119), LL(0x10c59504,0x4863bc6f),LL(0x5e342dcd,0x30b568ee),LL(0xba377da7,0x61a3cd5a),LL(0xdb7394c9,0x7e13d011),LL(0x655ca62a,0x531b03ef),LL(0x687df8b5,0xa07d97a8),LL(0xc1cc63e0,0xc3579f84),LL(0x4f51c0a2,0x1f68d107),L_(0x00000159),
+ LL(0xcedb78e8,0x73976185),LL(0x5ac29ab9,0x1049200d),LL(0x5376ef50,0xb7cabe96),LL(0xb29fcfde,0x2ebeaa6e),LL(0x849702e8,0x9856863e),LL(0xd5820c1d,0xadb32b7d),LL(0x0b85b8b6,0xcb2a1da8),LL(0x4ecc2beb,0x911240a2),L_(0x000001cb), LL(0x6471f428,0x8e9339d6),LL(0x65738f28,0xc9389868),LL(0xec9ab31a,0xb78b477c),LL(0xb756dfc0,0x2531d4c9),LL(0x2bea7bd2,0xa957b1f7),LL(0x19668750,0xb7acf908),LL(0x23544082,0xfa97aa90),LL(0xd310dd35,0x7c9376d4),L_(0x00000065),
+ LL(0x03c1f949,0xe690991e),LL(0xb53d0f3e,0x7a8ed401),LL(0xe7688a48,0xc975d343),LL(0x0a163c7f,0xbbe320a1),LL(0x3c38f3b4,0x637ba641),LL(0x0cc94ae6,0x2fa7a438),LL(0xf036a2cd,0x85cf8f8c),LL(0xdd8d3d2d,0xf3dec45f),L_(0x000001f7), LL(0x0257d9f6,0x0fc0fe23),LL(0xf9f35894,0x22cf1f3c),LL(0x5367a382,0x0a85bdb7),LL(0xa486155c,0x43d0dc60),LL(0xa045fb49,0x28e031ef),LL(0x239e6d10,0xbc646dab),LL(0xf3c58cd8,0x37a252ad),LL(0xa190c29a,0x729ace13),L_(0x000001de),
+ LL(0xaa492173,0x2c2d00f5),LL(0x309124ad,0x92f17a73),LL(0x90896f6d,0xd107aa3f),LL(0x6655b0bf,0x28ed385a),LL(0x4393b8b0,0x64efc785),LL(0xa72dcb01,0xdc6d4959),LL(0xedcf6e0d,0xad09fb16),LL(0xa138cb63,0x5a264a29),L_(0x00000038), LL(0x11888849,0x23fa857e),LL(0xa4afca8f,0x362d992a),LL(0x4718e360,0xe0e7ef99),LL(0x51da204d,0x0a263a3e),LL(0x76d92100,0xc54159bd),LL(0xb90bd792,0x6992a7d6),LL(0x2d4d5792,0x34429060),LL(0xea9796c5,0x2d91640d),L_(0x00000104),
+ LL(0xd8036123,0x69a4e57c),LL(0xd8256cea,0x1bf79944),LL(0x4d134e77,0x4e8b215e),LL(0x63a4641d,0x83621b34),LL(0x8da5f102,0x530939c0),LL(0x9d6baa6f,0x78356025),LL(0x0a919eb7,0x9cebfe30),LL(0x523c04c9,0xba70fc3b),L_(0x00000060), LL(0x8a6eb39c,0xb404acda),LL(0xbeff381e,0xf36c4399),LL(0xc6bfdda5,0x193ff430),LL(0xddaf4961,0x43e642a9),LL(0x86bb6b08,0x4ebe4623),LL(0xd3326377,0x8dc4af24),LL(0x33ce6709,0xb168c749),LL(0x3757e6ab,0x451bf0a9),L_(0x000000f7),
+ LL(0xe12c9a10,0x95d393a7),LL(0x15af1e76,0x09f6c873),LL(0x5dad48c9,0x168b010a),LL(0x03c65a7e,0xd86fdc56),LL(0x73f51c26,0x88f52d53),LL(0x697c8b7d,0xbc64a497),LL(0x670982de,0xaf7a0676),LL(0x809f942a,0xb15cc57a),L_(0x000000be), LL(0xfd456a48,0x71728397),LL(0xf5563ef9,0x305f3c8f),LL(0x4e73a2dd,0xa80ae4a1),LL(0x828cc516,0x2258160b),LL(0xe74db735,0x108533e6),LL(0x14ad6801,0x3b320283),LL(0x541598a0,0x763ab107),LL(0x56c3d815,0xf632644f),L_(0x00000089),
+ LL(0x633a1213,0x3fb5de8b),LL(0x8bc4deb0,0x8d93c4e8),LL(0x1e8e7ab9,0x3dd24d9d),LL(0x201baf56,0xcada68d7),LL(0x0a384ece,0x503d4f19),LL(0x5dcc59f7,0x6763d7ad),LL(0x7849c18f,0xc66f3753),LL(0x6951161c,0xfc052118),L_(0x00000104), LL(0x0fd16654,0x90fd23ab),LL(0xfbb20d46,0xd8a0eeac),LL(0xd979406d,0x508b0789),LL(0xeb2d48ad,0x8cad1e65),LL(0x2f16458c,0x7615ee48),LL(0x8941144f,0x2d4a611a),LL(0x57baf847,0x706729a1),LL(0x04864e43,0x13b7d8ff),L_(0x000001c9),
+ LL(0x49e14cac,0x6b13d691),LL(0x15c5966e,0x5adf4806),LL(0xe79886a9,0xb44e7b28),LL(0xc0149ae3,0x14ea5297),LL(0x3f2176d8,0xd637170e),LL(0x3d5f7f20,0xfd66e46a),LL(0x5f76d12c,0x998ccf72),LL(0x8fbfc2d6,0xc2738301),L_(0x0000007b), LL(0x790af7d8,0x48202d24),LL(0x5d1ab080,0x22169c9a),LL(0xf44f3ef3,0x4f9cc0b4),LL(0x5a6ea1fc,0xd8a38b0c),LL(0x1e3f8f7c,0xfc2a4b0f),LL(0x2f6b7ea1,0x85236ace),LL(0x7c4797d9,0x507ad976),LL(0x30db4704,0x70b62118),L_(0x000000d0),
+ LL(0x27eeb11a,0xa8e006d6),LL(0xa8350ceb,0x0b5d40f6),LL(0xd0476f3e,0x7d6beb64),LL(0x8a7277db,0x9a1052c1),LL(0xb78ba330,0x6fb67a25),LL(0xa921f295,0x937d5f7f),LL(0x58e2fb78,0xb3c5ee8b),LL(0x224a8a6c,0x3ba51856),L_(0x00000158), LL(0x10433f3b,0x472c8eee),LL(0x46bd4fc5,0xd6bbe5d7),LL(0xbccb9c2d,0x8704f8a7),LL(0xd4145962,0xf0c09b77),LL(0xe9ce9fc8,0xe24e89e3),LL(0x091189c9,0x34dfd23c),LL(0xa0008822,0xddeaf170),LL(0x43b08954,0xe569f253),L_(0x000000b2),
+ LL(0x20ee092e,0x21969535),LL(0xd200f675,0x1aa95306),LL(0x8a20dfb4,0x450070d5),LL(0xe56ecbdc,0xa73c2aa2),LL(0x93697944,0x8cf15e09),LL(0x2bf1cc5f,0xb81e3982),LL(0xa98dee98,0x39d2614b),LL(0x4249763f,0x88bf80d0),L_(0x000001ce), LL(0x4194f3d6,0xea90be49),LL(0xeb5f7526,0x9d76e09e),LL(0x42892f62,0x665e7661),LL(0xdd2de6b9,0xdb45bef0),LL(0xe66edde4,0x0f0c29ed),LL(0xd947a3fe,0x39bccdcb),LL(0xdc0bb667,0x97600929),LL(0xeeaa185f,0xf355b62f),L_(0x00000198),
+ LL(0x05622c5d,0xc2d3d21b),LL(0xbe07feb4,0x9e1d3138),LL(0x90b99ecf,0x358fe997),LL(0x2ec0a3d5,0x95008edf),LL(0x7f72a6c8,0xc6e6cc84),LL(0x2b8ec523,0x351d40b6),LL(0x10aa3646,0x30961dc3),LL(0xdff38b1a,0x6d776cf7),L_(0x00000047), LL(0xafa6b1f7,0xfce248cf),LL(0xad217997,0xe663a7a1),LL(0x423b10cc,0x8d65dc51),LL(0x0215b195,0x0f10bc35),LL(0x0f4e07a2,0x23278029),LL(0x19d23499,0x304b98d9),LL(0x6127a2da,0x9fb0c81f),LL(0xed0c0943,0xcd486835),L_(0x000000c4),
+ LL(0xaf631c28,0xd0ac0ecd),LL(0xbaefab89,0x0a9db571),LL(0xe4775843,0x6c283a9c),LL(0xfebcf91f,0xd37751b1),LL(0xe02d1251,0x4c69aef4),LL(0x93ca62f3,0x756b2ab1),LL(0x017751a3,0x9921e7da),LL(0xf0df5f26,0x31fbf868),L_(0x00000112), LL(0x1547e61c,0xc24912f9),LL(0x6ce422f4,0xe5bc3bbe),LL(0x0c518f2e,0x00e5a237),LL(0x51ed5f7e,0xb6da428f),LL(0x1a77cbdb,0x248c6951),LL(0x086ad3a0,0xfd285428),LL(0x00d65807,0x460a5bc1),LL(0xc6265db2,0x728547e4),L_(0x000001fe),
+ LL(0x378f0a8d,0xcdbb56b7),LL(0xea484f2e,0xebecf09a),LL(0xbe1705e2,0xdc0d7050),LL(0xe83a83b6,0x5c8fdff7),LL(0x1cd41a57,0x58f038ee),LL(0x975aeb28,0x858f75ce),LL(0xddbb66ee,0x7455106f),LL(0x7e1bcafd,0x54e1961f),L_(0x00000128), LL(0xd2d34020,0xc329e633),LL(0x32cfb8ca,0x596dc91e),LL(0xe8fb4aa3,0x19c60dcd),LL(0x0c27fe63,0x9c2411d9),LL(0x49228e82,0xf4420f99),LL(0x5075f5a2,0x38a95326),LL(0xadb26b0e,0x7345059b),LL(0x67709e35,0x428212fb),L_(0x00000139),
+ LL(0xd8fc8db1,0x3a95d178),LL(0xb909e614,0x1860388a),LL(0x89b7600c,0x942112c1),LL(0xa080f4aa,0x5a1967f7),LL(0x5057c08b,0x13543a0e),LL(0xf9ac78fd,0x1598cafb),LL(0x9408a20a,0xfa7974b4),LL(0x8fb58bcd,0x17ad4e19),L_(0x00000162), LL(0xd603cb6a,0x57138c5b),LL(0xf8960264,0x185f172a),LL(0xea9d78b2,0x8652917b),LL(0x62148231,0x9b757159),LL(0xb7470a8b,0x4f2c7ae3),LL(0x532d7747,0xc96fd10f),LL(0x6b40b8bf,0x77081dbd),LL(0xa54da232,0x2cd44f13),L_(0x00000119),
+},
+/* digit=63 base_pwr=2^315 */
+{
+ LL(0x44140a9f,0xc1b5f874),LL(0x37761e89,0xc768e709),LL(0x052402d8,0xa7063fcc),LL(0x437e0d8f,0x5032ca28),LL(0xd7049706,0xe0560b81),LL(0xfcc5af72,0xdac1a63b),LL(0xabb68cfd,0xe89f3917),LL(0x257b3b85,0x80d7454a),L_(0x00000038), LL(0xbc9cca5e,0x001d4cbe),LL(0xe9651818,0x66b1014f),LL(0x64d65a97,0x511b3639),LL(0xd56646ec,0x26e7c4e0),LL(0xdfae8dcc,0xa94ae11a),LL(0x86e8d406,0x6e9a1a68),LL(0x47bbf4ad,0x3004a685),LL(0x13e8901b,0x5981c480),L_(0x0000008d),
+ LL(0xb7f0034c,0xc63223ff),LL(0xeed01f7e,0xb10c656e),LL(0xa95759d3,0xc8ceacdd),LL(0x5f68fe9f,0xb6ab8ec3),LL(0x50e97936,0x28c0b215),LL(0xe4ccc3b9,0x92be8e1d),LL(0xfc6be17e,0x20828c77),LL(0xb81bdb63,0x13352a78),L_(0x000001d2), LL(0xcfa9e131,0x3d9b3c1e),LL(0x0b5daa42,0x94567b3a),LL(0x6bf95aa5,0xa3d149d4),LL(0x8d0fbfb5,0x4e997958),LL(0x5e636b3d,0xc1e08ca4),LL(0x8fa3b11b,0x73645c35),LL(0x552e11b1,0x931ab993),LL(0x0db67bc8,0xce614c5f),L_(0x000000d3),
+ LL(0x78c98029,0xf005a100),LL(0x9be2e7f2,0x06f26644),LL(0x47f29a13,0x7b580ed9),LL(0x3f3b60f9,0x22198889),LL(0x7e6ec70b,0x9f87a7be),LL(0xfc2d715c,0xb2ebc47c),LL(0xfc003ea3,0xfa7b2218),LL(0x79438acf,0xbfd9d6c5),L_(0x000001c2), LL(0xd7ce55f5,0xdac555ca),LL(0x80f3c546,0xe5a4dad1),LL(0xa25a6ba7,0x2d4bd9fe),LL(0xa68cfbbf,0x35faf13a),LL(0x4e3df8bd,0xcfc847de),LL(0x8434c00b,0x4dfdf245),LL(0x40669463,0x6e619d42),LL(0x5f688c19,0x13d3a517),L_(0x0000004b),
+ LL(0x44f3544b,0x3aed7148),LL(0xbb901084,0x6321bcc4),LL(0x996ac002,0x53c74ad5),LL(0xcb634535,0x741982c7),LL(0xdc48a041,0x1196d8fe),LL(0x44c9f092,0xfabc20d2),LL(0x0a8fce97,0x32828d27),LL(0x62a6d447,0xcab0c775),L_(0x0000000b), LL(0x43969d2b,0x3a61da39),LL(0x4b749d7b,0xfb5b6d67),LL(0x9df6dae1,0xec275083),LL(0x4fd05c30,0x7da1a928),LL(0xb7bd6dae,0xec82a28e),LL(0x66cd19ba,0xa08ca71d),LL(0xd599b2c6,0x6c312c52),LL(0x5bfaa154,0x6795e306),L_(0x000001f0),
+ LL(0xd73110d9,0xe9c779ff),LL(0x99bf4200,0x2e4558d4),LL(0xb9ba6e9a,0x636dc521),LL(0x836fe297,0xa1c7e0bd),LL(0x461d465e,0xa229d229),LL(0x287fba32,0xe43c8f80),LL(0x5fa34491,0x76cbe0ad),LL(0x0e6b8f16,0x7a25d2a9),L_(0x000001d0), LL(0xdc2e36c7,0xd420ce9f),LL(0x59654147,0x2c11cbe4),LL(0x582dde44,0x73168c78),LL(0xcfbe66e7,0x5f455763),LL(0x55778942,0xd782c483),LL(0x9b69f069,0xff95fe3e),LL(0xaa1addcb,0x00a4bd0b),LL(0x47541c1d,0x8ad93857),L_(0x0000012a),
+ LL(0x8aa7d8c0,0x0afff918),LL(0x80ad064a,0x89af5deb),LL(0x7114ab96,0x4dbde778),LL(0x099fad0b,0xfd29cd3c),LL(0x525d6055,0xbd379d42),LL(0x4df50e85,0xdfc116d0),LL(0x3602e006,0x374d96b5),LL(0x2ee6c63f,0x6509a7f3),L_(0x000000f2), LL(0x6aa97902,0xee822c17),LL(0xfc039cb1,0x6c2fdf58),LL(0x5872cad5,0xea665324),LL(0x3b9e8ae0,0xaf2e64bf),LL(0xb8314c4d,0xa8f96bb4),LL(0x63c57f41,0x3df990e0),LL(0x5149d306,0x1d5f9b0d),LL(0x08ba6128,0x3d6cc9c6),L_(0x000000ba),
+ LL(0x5b4bef3c,0x84b34c8d),LL(0x0908a3fa,0x06e343a5),LL(0x8e41dac7,0xca844102),LL(0x83411f49,0x0712aa99),LL(0xd4bcaa5f,0xf85d2ba8),LL(0x0278367b,0xbdc302b7),LL(0x5016082b,0x54ed82be),LL(0xfea00712,0x1e47617b),L_(0x000001a6), LL(0xbea2cdee,0x5025ca72),LL(0xa8a5db48,0xd3c98c1a),LL(0xeb113cc6,0x259b9a28),LL(0x1b35c6d2,0x49923a55),LL(0x266d75d3,0x644a3ecc),LL(0x9590fb6b,0x221e1f1d),LL(0xa7f663c5,0x9c9bd811),LL(0x30cacfb5,0x8f25a4f3),L_(0x000001ad),
+ LL(0xda490054,0x5c5d4a76),LL(0x224e9112,0x74621c3b),LL(0x62ab184a,0x17406495),LL(0xedfb682a,0xc3f7c8cd),LL(0x16ae2053,0xd8e38d44),LL(0xdf044060,0x39ed9c28),LL(0x86143e57,0xf327b97f),LL(0x8b95f9f7,0x53853147),L_(0x00000072), LL(0x81550101,0x43b98e46),LL(0x05661b39,0xc1bcc1fc),LL(0x9ee23198,0x64ff1647),LL(0x115744fc,0x0f20d871),LL(0xcdf5ac56,0x92c9feea),LL(0x63cba9c3,0xa72f70b2),LL(0xadbac8fd,0x365c71db),LL(0x171aad35,0x9d51687d),L_(0x000000f9),
+ LL(0x7cba337f,0x7242ca8b),LL(0x45faaf9a,0xc08d85f8),LL(0x550ef4dc,0xb82ff28e),LL(0x814b8cba,0xbbe121da),LL(0x1eb4cd63,0x081656e6),LL(0x82eece40,0xf4405b11),LL(0xe9889d6a,0xf6c9d001),LL(0xbc4f3c1e,0xe85dc906),L_(0x0000001b), LL(0xd4907a17,0xbcfa56fc),LL(0xb8894301,0xa60a71ba),LL(0xc8290de3,0x5b4cf893),LL(0xfa8203e9,0xa8602943),LL(0xb0d9fec8,0x6b75b5c6),LL(0xacaeb1bd,0x40f20d5b),LL(0x228fdb83,0xe7477d37),LL(0x967812d8,0x3271b8d9),L_(0x000001d0),
+ LL(0x9302acf0,0x69acd4ec),LL(0x76812a69,0xd47ef468),LL(0x62f921ab,0xc8ee3434),LL(0xb7930834,0xc08c033b),LL(0x369c3e87,0xee51d0a2),LL(0xd98cac8f,0xc675c1fb),LL(0xa309b704,0x3fcbb3c6),LL(0x69a173a4,0x32c49495),L_(0x00000094), LL(0x2ef36de7,0x2b5e781f),LL(0x79bd3a70,0x68837e34),LL(0xd74e86eb,0x22881aa5),LL(0xecb38496,0x91b89a84),LL(0xdd2964ba,0x7caeee87),LL(0xb0230b75,0x83a10f40),LL(0x7853cadc,0x465657ae),LL(0xe45f5ad1,0x100e5033),L_(0x00000075),
+ LL(0x5443e17b,0x27034a2f),LL(0xae458db9,0xe02cc805),LL(0x361c4604,0xc6c6e812),LL(0xf53dab3f,0xe1de7819),LL(0xa93944c6,0x77575b10),LL(0x7d127be6,0x4580ec67),LL(0x18920ad0,0x6451a6a6),LL(0x595f7341,0xe3b018ad),L_(0x0000002f), LL(0x7a6f7a6b,0x73fafabe),LL(0xacea82d0,0xb8e018e3),LL(0xb66d3c1a,0xf0a068d2),LL(0xa0a76281,0x2960ab23),LL(0xd3310f1e,0x1ade815c),LL(0x5df5a459,0x4830c68e),LL(0x9bc40618,0x506f8ded),LL(0xa5b32181,0xb64aea9e),L_(0x00000055),
+ LL(0x11651e46,0xd2e44f39),LL(0x7f22b492,0xf166288f),LL(0x72f850db,0x45a14853),LL(0x6743ab2a,0x480b82ee),LL(0x235a84e1,0xbca609c8),LL(0x422668b9,0x2f4e85d8),LL(0x5d6f0bf0,0x792321da),LL(0x61afb880,0x2c095f02),L_(0x000000b8), LL(0x25cea9cf,0xe6bc2f57),LL(0x43f99381,0x4a832e1f),LL(0xe6089c84,0x51ad7011),LL(0x65600aa9,0x2a695207),LL(0x11447728,0xa07e689c),LL(0x7bb9a4c6,0xcd7b0e53),LL(0xdf06eaf0,0x78952329),LL(0x777c474d,0x10d2b00b),L_(0x00000107),
+ LL(0x42f9d45d,0x20322841),LL(0x736265c0,0x91a20b69),LL(0x7c956777,0x530024a3),LL(0xbcd4358f,0x2cfdf5c4),LL(0xe32fe9e3,0x69c3c240),LL(0x7dd472b9,0x16947a8a),LL(0xeeaaeb78,0x03c5cf25),LL(0x9aa3433d,0x521f3b6b),L_(0x00000018), LL(0x96f4132f,0x88ddc3b1),LL(0x00a93570,0xc5b29c7d),LL(0x5d8a1581,0xb3793bd2),LL(0x1877f26e,0x4435f13a),LL(0x4fc7c6c4,0x5b6c76af),LL(0xb032ee18,0x5465338c),LL(0xd7e32969,0x5e8d0f72),LL(0x82259fe6,0x38f0d401),L_(0x00000082),
+ LL(0xaebae92a,0x8093c8e0),LL(0x248ef981,0x84b971a4),LL(0x5353d713,0x8ab8dd10),LL(0xf3f56422,0x9e95615c),LL(0x163427ee,0x1dbed91f),LL(0x7cd8d83e,0xa05bff8c),LL(0x2a117b26,0x9094b7c0),LL(0x28d65130,0x8d73f3a7),L_(0x000001fa), LL(0x3fc6c29b,0xfb45cf4f),LL(0x5dd01b3b,0xa983b69a),LL(0xe3b24278,0xdda15e64),LL(0x0beba6e8,0xeabdafeb),LL(0xce3cbe7c,0xe28dd1f4),LL(0x03c3a01e,0x315483c0),LL(0x286b68f0,0x44cc13c4),LL(0x653661bd,0xa5a2b18a),L_(0x000000d7),
+ LL(0x837c224d,0xf83ea93b),LL(0xc7a428c9,0x308d0ccb),LL(0xdeef06fc,0xe456dad3),LL(0xd27b9dce,0x04dd575c),LL(0x8c1bbcfc,0x1c63319a),LL(0x479f6f73,0xed4daaeb),LL(0x7cb52d7f,0x9fe5930e),LL(0xd171cdbc,0xcd65b54d),L_(0x00000100), LL(0xf9b94ca6,0xbb8079a0),LL(0x2ea98b08,0xda724133),LL(0x24b7505e,0xedf1d97e),LL(0x5aed5e6f,0x283c1e51),LL(0xc39ad307,0xf64812a4),LL(0x76820a6c,0x13b5c88a),LL(0xb32f91ce,0xb8954a33),LL(0x211cbd9c,0x31a311e0),L_(0x000000ae),
+ LL(0xf859a830,0x3ef4f2d2),LL(0xcf466ff0,0x47044584),LL(0x78dc82b8,0xb52d320e),LL(0x8b5110dc,0xdfe140d7),LL(0xe07b117a,0x0b45fd46),LL(0x39af6581,0xbda19439),LL(0x26b6d5c5,0x8309f53f),LL(0x8091095a,0xaad23c7d),L_(0x000000d4), LL(0xa9e7ca16,0x90dd82bc),LL(0x1ee78b60,0x839c5155),LL(0x453fc776,0x2966b875),LL(0x6bf1d026,0x9e2a2996),LL(0x825d3c72,0x48c49cfc),LL(0x1345ab1d,0xad600996),LL(0x7e6049f3,0xf1b39850),LL(0x0b007da4,0x2c8f36cb),L_(0x00000038),
+},
+/* digit=64 base_pwr=2^320 */
+{
+ LL(0x90646dde,0xeba284c6),LL(0xdcd5cc91,0x292fa3ee),LL(0xea471fd6,0x5841cc32),LL(0x9fb23a12,0x35810a74),LL(0x4e18eb2e,0xd6133648),LL(0x5228a2bf,0x52cab6f6),LL(0x07542e74,0x40c74692),LL(0x62526cd9,0x36b9b329),L_(0x00000129), LL(0x063ef2a7,0x17573e4f),LL(0xca996c2a,0xc3d42418),LL(0x33e1f9c1,0x970fbd47),LL(0x246b3cbf,0x8c0b1561),LL(0xf0853508,0x16e93234),LL(0x8ff90188,0x74d99d7f),LL(0xaa556f85,0xd3b1d290),LL(0xdda5d989,0xab78218e),L_(0x000000d0),
+ LL(0x57077d65,0x87233d65),LL(0x32cea9ff,0xb1454f2b),LL(0x6963e65d,0xd5f2627e),LL(0xd15b05b7,0x68cad15b),LL(0xf2c9215a,0xf9679cfe),LL(0x982da4ec,0xdd21cc1f),LL(0x73910763,0x3925aff6),LL(0xce110fdc,0xad0858b1),L_(0x0000003c), LL(0xdb7b5667,0x160c51bf),LL(0x88f58f75,0x9e39ee8b),LL(0x713a7cf3,0x5af813ed),LL(0x8ac4ac36,0xa788e43e),LL(0xe789c040,0xc10b5e01),LL(0x3d0cb49e,0x26fdddf3),LL(0x3f2d9bd7,0x504e525a),LL(0x776e3c30,0xa456acdf),L_(0x00000051),
+ LL(0xa6499d4a,0x23707d7d),LL(0x4b6d85bc,0x2372ec00),LL(0x4b483dd7,0x838f63c9),LL(0x869b15c9,0x40b6584e),LL(0x291644dd,0x05bb5ad6),LL(0x693ec1c9,0xc10969be),LL(0xb5c6018d,0xb81150c7),LL(0x04c9c113,0xbd460de8),L_(0x0000000b), LL(0xb81757db,0x5ad558a1),LL(0xa356589b,0xf88e046d),LL(0xf093ea9c,0xede9de0f),LL(0x39acd54e,0x19ec3f88),LL(0xfcbf451f,0x44ec243f),LL(0xf8b02c0e,0x981fd0d1),LL(0x42d2cc07,0xf4701bca),LL(0x3f363b43,0x30f2e9e4),L_(0x000001f9),
+ LL(0xd9f5845f,0x006b0772),LL(0xa8c7c3d7,0x1ba3ff28),LL(0xc1d96b23,0xc17a4f5f),LL(0xda50f432,0xca88f653),LL(0xfce5ef14,0x31ac5da9),LL(0xd10257bb,0x18d3105d),LL(0x06b910de,0x4f950082),LL(0x8ed121d6,0x748b9a29),L_(0x00000083), LL(0x0ad3e4ad,0xfedc9456),LL(0xcda193af,0x30addb34),LL(0xf39dff50,0xa3a58a0d),LL(0x586d72c1,0xd7c02e84),LL(0x7190f71a,0xb6dddddd),LL(0xd7f7815a,0x93fd431d),LL(0xb059af28,0xdb90a301),LL(0x626d66eb,0xb55b2545),L_(0x000000c5),
+ LL(0x55a2cc5b,0x02a70327),LL(0x60173b4c,0x700e187b),LL(0x853a0c8b,0xebfa5d41),LL(0xa74d3fcb,0x6636a248),LL(0x7f152910,0xcd439df1),LL(0x433bf866,0x3d361a48),LL(0xd52b92a9,0x96508fce),LL(0xcdde5dbf,0x08fb48db),L_(0x0000004c), LL(0x57d607dc,0x41e6d707),LL(0xa287bad7,0xc1d0199a),LL(0xaca83d8b,0x3248272c),LL(0xdeea6deb,0x81490886),LL(0xd5830e62,0x803b3e7e),LL(0x0b551501,0x329bb8f5),LL(0xe61ae410,0x1b1ec67e),LL(0x2add209b,0x9d8f057d),L_(0x000001f7),
+ LL(0x4aeeb4f7,0x159240ac),LL(0x701cba0d,0xbe49e9de),LL(0x1e2030d5,0xa8d80ea6),LL(0x891f5b9f,0x389aa0a7),LL(0x281d5c9e,0xbf08f46a),LL(0x42c2a6a9,0x30133d89),LL(0xcae5c626,0x26d80fbd),LL(0x976ed6f2,0xd7445273),L_(0x0000007c), LL(0xebe5a160,0x4b64112e),LL(0x1ba10f05,0x3c715556),LL(0x076de398,0x051c721c),LL(0x1b6338a0,0xed93ec2b),LL(0x0b18e617,0xe40d08e3),LL(0x2546a805,0x39d986d0),LL(0x289546bf,0x87fe36cb),LL(0xcb29a40d,0x28ca6d96),L_(0x00000038),
+ LL(0xf08b61b9,0xb8888aaa),LL(0xeb89b8a3,0x504b24ba),LL(0x13c31ce0,0x1577d88f),LL(0x1d308489,0x01541da0),LL(0xc31edb15,0xfbe18906),LL(0xcb88a0c0,0xb123cf8a),LL(0xe0a54814,0xce17eb8d),LL(0x12d30b10,0x5435ad11),L_(0x000001c6), LL(0xd6e0b2ed,0x7a3c3081),LL(0x198cbd6e,0x18481bd1),LL(0x9feff602,0x8a4e33b7),LL(0x4dc9559a,0x242155d3),LL(0x49b265ae,0x0458dbdb),LL(0x66003375,0x19c33688),LL(0x53753ede,0xac09e0c8),LL(0x0eb6969a,0x25b27567),L_(0x00000052),
+ LL(0x13db9105,0xfd4c030e),LL(0x4bb182d8,0x45ba7b8e),LL(0x24d5733c,0x9bbae322),LL(0x857e0992,0xe18395c5),LL(0x7a4b7ec5,0xbbeb3431),LL(0x9d2ffacf,0x70996597),LL(0x0dac7ff4,0x634b33c0),LL(0xd22ac181,0x5a113dab),L_(0x00000132), LL(0x4a184515,0x1af6d0b4),LL(0x4b60b5e3,0x60067ebd),LL(0x7c6c236a,0xccf47b3d),LL(0x199b1be8,0x1dbd1cc7),LL(0xe888eba2,0xb4932466),LL(0x034c21f8,0x19ff1dee),LL(0xf9da1696,0xe040c95f),LL(0xee7e95c7,0x9dbe56ef),L_(0x0000015a),
+ LL(0xf23e08f9,0x33a41f31),LL(0xb89596d6,0xde8f6d08),LL(0x36e37e25,0x09152867),LL(0x911d84ea,0x4f3476b2),LL(0xba9def4c,0x44e0d519),LL(0x12065979,0xdfef8c30),LL(0x91c87d28,0xa45cf33c),LL(0x6b8dd103,0x5a48975d),L_(0x000001b7), LL(0x3141bb8f,0xe73885a7),LL(0x36da50e9,0xdc731cf5),LL(0xb97f8cf8,0x67bb07a8),LL(0x922b0be5,0xfb414a3b),LL(0xe9cbd504,0xd391785e),LL(0x2631b899,0x9eb65672),LL(0x50f31f7b,0x4ee45215),LL(0x0d4d0798,0x23e25b24),L_(0x00000039),
+ LL(0x24f12ded,0x6178bac5),LL(0x9eabc3c5,0xbfa39955),LL(0x503d57c5,0xda006222),LL(0x8e465ace,0xe390a3d7),LL(0x363ca671,0x7ca51f49),LL(0xe0376d27,0xab1c9afc),LL(0x325dbeb1,0xf303951f),LL(0x2ac46079,0x4fcc04e4),L_(0x000000b1), LL(0xa05b906b,0x1e1f126b),LL(0x7a1f14f0,0x0b9e64fc),LL(0x49fb5176,0x394e56b2),LL(0xc1fff51a,0x0b50d33b),LL(0xf135bc4a,0x41e4f563),LL(0xf07911e8,0x0008c3a8),LL(0xfd1855b2,0xd0455066),LL(0xb1f8cdf1,0x3e4e10b9),L_(0x0000006c),
+ LL(0x03ffd8c0,0x47688773),LL(0x75ef0188,0x81134439),LL(0x6a21abe0,0x3ff532d6),LL(0x9e0177ad,0x3c27f56d),LL(0xe284df24,0xd99892e8),LL(0xfcaf2cd5,0x668c2ac2),LL(0x72c31d05,0x450ea985),LL(0x617df772,0xd1386608),L_(0x000001fb), LL(0xa7faa0ca,0xa81bbd89),LL(0xb7cb40e7,0x6545e4d7),LL(0x4e799290,0x48c0ef0c),LL(0x129414b6,0xf9bc6b77),LL(0x75cac719,0xcf3cf61a),LL(0x7090a084,0x5de671da),LL(0x573167fe,0x53c2428e),LL(0x9be66bcd,0x581cfd76),L_(0x00000105),
+ LL(0x9912480b,0x868b1c0c),LL(0x6fc274a1,0x83263833),LL(0x7470faca,0x28bbd5e9),LL(0x10a9a5ed,0x92bc266f),LL(0x1a2df530,0xc1420bb6),LL(0x26088825,0x6de27806),LL(0xb843fbcd,0x96eddc77),LL(0xfaacb0c0,0xe58f23ff),L_(0x000000a2), LL(0x265f30c8,0x304fead2),LL(0x46f8b4da,0xcdc2767a),LL(0x030d0ccb,0x4ecb91a4),LL(0xa6cdee79,0x546f1657),LL(0x2f10c656,0xa2c85665),LL(0xdaca38a8,0xb2b32405),LL(0xa84dd381,0x29386bb0),LL(0x4d4926a6,0x3ed722f3),L_(0x000000e5),
+ LL(0x6732b4e2,0xb158c617),LL(0x70c2bdde,0x1e929730),LL(0x03b67c3d,0x83aa10cb),LL(0x207b6554,0xf8bd1f2f),LL(0x65897412,0x52c6a1bf),LL(0xd2b9e2bf,0x4072e449),LL(0x4573028a,0x51728cdb),LL(0x08f548f4,0xa5fb2b4e),L_(0x000000cb), LL(0x7e81850d,0xc30af1b8),LL(0xf64d0544,0x91fac057),LL(0xe6a44ca8,0x97b402f5),LL(0xf3758797,0x7a48f50b),LL(0x9ec9c59e,0xa20d052f),LL(0x7e0c3edb,0x50d02201),LL(0xba6cf070,0xc4603d10),LL(0x0fd79a40,0x04379719),L_(0x00000047),
+ LL(0xaa79abd0,0x33d05c0c),LL(0xf4e66422,0x28d54dca),LL(0x3f1a0e0a,0x1b90591f),LL(0x8319bf69,0x50c92b63),LL(0x45f8cdc5,0x2b172382),LL(0xc8908923,0xce47651d),LL(0x282da333,0xe6f22c70),LL(0x6dc02842,0x73a13e20),L_(0x00000052), LL(0x2709e7a5,0x9bb811ca),LL(0x2aa27cb4,0xff020d4c),LL(0x8f138cd3,0x181a1cec),LL(0x35013750,0x47863f93),LL(0x37481122,0xe6028031),LL(0x18f58c65,0xf01c48b5),LL(0x565f6657,0x9f20924b),LL(0xa7b0ed3f,0x643987ef),L_(0x000000eb),
+ LL(0x25a6701b,0x151f4865),LL(0x1b42c497,0xf30bdc50),LL(0x055325f0,0x144e0aa2),LL(0xf8e98fe1,0xa165a395),LL(0x2e0f9b5a,0x25afa523),LL(0x3ceadf0d,0x70ed634b),LL(0x55dbb9b8,0x1b25f855),LL(0xe2ddb61f,0x8a54708c),L_(0x00000000), LL(0xd7b55067,0x74847fca),LL(0xf91dd3a7,0x92445716),LL(0xe74dda4f,0xfe51e6c5),LL(0xd2ebe9fa,0xe3bfd67c),LL(0xec65184e,0x51f3767f),LL(0xc26dcf5e,0x6092d164),LL(0x7562e715,0x48053ca5),LL(0xc341746a,0xfe264b56),L_(0x000000c8),
+ LL(0x1486b225,0x688f0816),LL(0x55ab4efe,0x012b1be7),LL(0x48d9609c,0xdb068e78),LL(0x0fb98843,0x958488ad),LL(0xff5eda2d,0x83f6d23c),LL(0x3ec7372a,0xb176c41d),LL(0x5d185ec0,0x925e4903),LL(0x476314a5,0xe4ff9579),L_(0x0000003d), LL(0xc1b43aa4,0xd529cc94),LL(0xd2ad417d,0x2dfe7d43),LL(0x360ab4fa,0x52cc454d),LL(0xfb2e9eb5,0xa4732c24),LL(0xcf82a235,0x68d1e843),LL(0x67bb7a40,0xbca2ab8e),LL(0x91877eaf,0x99566cd1),LL(0x62574ab0,0x22f9872f),L_(0x000001f9),
+},
+/* digit=65 base_pwr=2^325 */
+{
+ LL(0x8bbe4fe2,0x2d85f820),LL(0x287db7bb,0x702fbecc),LL(0xe568667e,0xa157f36d),LL(0xf4ecbeb7,0x484f3352),LL(0x941bbfbf,0x558da014),LL(0x3d5fe38d,0x7b22586c),LL(0x8a8ef1b3,0x7a9e7fea),LL(0xba594962,0x0c422ebe),L_(0x00000074), LL(0xe63724c0,0x34c2ec0f),LL(0xeb882690,0x8c7ffbe0),LL(0x16f607ed,0x0a729f09),LL(0x9cab235b,0xfb783d21),LL(0xe85a3bb2,0x7a1f91a0),LL(0xaf1659ef,0x067ef36e),LL(0x3c3d4be9,0x2b43e992),LL(0x3b5e5bd9,0xe81391aa),L_(0x000001e3),
+ LL(0x6902a59d,0x58cf4fb6),LL(0x2d970cf0,0x6108b652),LL(0x8db98564,0x1c524ec7),LL(0xc375bd09,0x8ded01ba),LL(0xeaf41a1c,0xca7571d5),LL(0x1513bf75,0x83433ae4),LL(0x831a58ce,0xb1cbad60),LL(0xd4b5c1d0,0x7e3558b4),L_(0x00000012), LL(0x2423577d,0x5fc5bcaa),LL(0xcd90416c,0x1fd11e95),LL(0xf9cd3e85,0x77429d71),LL(0x4b143cec,0x818263e7),LL(0xb694e333,0x7b0bed2a),LL(0x078fef20,0x900d9d3b),LL(0x22c62d90,0xb2dcc393),LL(0xf713057f,0xee2cd8c7),L_(0x0000010a),
+ LL(0x62e274a4,0xc6a3697b),LL(0x36666b6c,0x771114f0),LL(0x4615de0a,0x4656bc00),LL(0x27ed1a54,0xfe1b0ffd),LL(0x7a367a4c,0xa7b011fe),LL(0x9395287b,0x1539028f),LL(0xe474d2cd,0x67ab6630),LL(0x50df81c9,0xd416f7d8),L_(0x00000009), LL(0x15224116,0xcd4ff017),LL(0x14e9eb99,0x68ce9cb6),LL(0xefe50131,0x878690dc),LL(0xf0500068,0xa58b25b4),LL(0xfe708a3e,0x1697bfbe),LL(0x4cbc1887,0x109e6148),LL(0xd61b572d,0xea6e538f),LL(0xcd507a67,0x8cf0642b),L_(0x00000010),
+ LL(0x44c4f316,0x254f2817),LL(0x74f04275,0xe534cfb9),LL(0x22ee390d,0xf368e25e),LL(0xbc4caed9,0x0d3f5a1e),LL(0xd7010447,0x26bb7427),LL(0x91f02404,0x7f0d8308),LL(0x993cd5f3,0x4ebe5786),LL(0x1ba9d89f,0x2549a02c),L_(0x0000007b), LL(0xef3c1601,0x575527d2),LL(0x33afd2d8,0x6240eaa7),LL(0x200435a3,0x0df72a8e),LL(0x104dbed5,0xe9f3dcc7),LL(0x1f5c3464,0x98404140),LL(0x791b398c,0x1581b281),LL(0xd77cd49e,0xa203aa2a),LL(0x2329530c,0x70040738),L_(0x0000004a),
+ LL(0x4c2c9776,0x8715b292),LL(0x5fca8e16,0x0659f3f5),LL(0x904a8960,0x7cdfccac),LL(0xd46df8f8,0xe8078ecb),LL(0xae2184c0,0xc1352930),LL(0x904b839e,0xf3fd8786),LL(0x36602186,0xc3ec21de),LL(0x2a20030f,0xe08de817),L_(0x00000046), LL(0x36bb6226,0xd7e4cb2f),LL(0x812cd124,0x5ac9609a),LL(0x83d9653b,0x690acbe2),LL(0xf981cac9,0xc894c3a8),LL(0xd274538e,0x286285d9),LL(0xc202f8f4,0x24269d02),LL(0x51bb2579,0xe768b7b8),LL(0x121f910a,0x8baea845),L_(0x00000158),
+ LL(0x41280631,0xf6a81b1e),LL(0xcf66e145,0x2a3bda3a),LL(0xa88833db,0x44164a42),LL(0x4e0df1ec,0x754bd187),LL(0x89a6c53a,0xff8dc770),LL(0x961d8b4b,0xa3761531),LL(0x87d46b93,0x31b05601),LL(0xf7105b06,0x4ef74177),L_(0x00000156), LL(0x5c72ab48,0xbc131ab6),LL(0x4688d4bb,0x6977d5eb),LL(0x82e94cb0,0x8706473c),LL(0xb785ac18,0x7362c724),LL(0xae704972,0x3b45de5c),LL(0x2e6bdb68,0x2c67f7d5),LL(0x99b0063e,0xa06ed86c),LL(0x4969a5c7,0xc4bf63b2),L_(0x000001fa),
+ LL(0x181e12e7,0x32f70f29),LL(0x4140b7bb,0xbcda177c),LL(0x0fdc8422,0xad59d7db),LL(0xd2a3a29c,0x9c1893f4),LL(0x8f80936a,0xe60fd330),LL(0xa903804b,0x6b3cc7d2),LL(0x0e38278b,0xfcb7a0c8),LL(0x31deb3a4,0xb47a9458),L_(0x000001ff), LL(0x2d8fb441,0xc70a541d),LL(0xcbbeaa75,0x6f004b75),LL(0xd7f127d6,0x1d4ef334),LL(0x15636fa0,0x758ac159),LL(0xa2548921,0xb047a7de),LL(0x60705693,0x128b4b7e),LL(0xa5696c87,0xf499a64e),LL(0xa206ac49,0xf272bcca),L_(0x000001bd),
+ LL(0xe83f7b24,0x7a4b896d),LL(0xb2e00072,0x47a68dd1),LL(0xd43d9655,0x1ce79a50),LL(0x6abc1f1e,0xec87252c),LL(0xe7160fe5,0xb60d6a5a),LL(0xdcf45caa,0xd235985f),LL(0x1b3180d9,0xf8982569),LL(0xdc646ab8,0x446d6798),L_(0x000001f0), LL(0x8387586a,0x6eec719b),LL(0x5f9db663,0xcc9431de),LL(0x38f4a187,0xef383b03),LL(0x3dbac366,0x2fa36674),LL(0xcc0b0d02,0x5760fac1),LL(0x67948b1b,0xe8d42650),LL(0x93934495,0x4f889216),LL(0xd3c64b8f,0x1cd8ec2e),L_(0x00000128),
+ LL(0x354d871a,0x107d6bfc),LL(0x5816dc43,0xb8b5b662),LL(0x1fe1463b,0x973f88f0),LL(0x4370119d,0xc84691e3),LL(0x153d37fa,0xd0059b51),LL(0x9a4e583e,0xe99b060f),LL(0x24c8671a,0x8d5b7c8c),LL(0xfdf410b1,0x0db2233f),L_(0x0000002f), LL(0x3e3f1b42,0x08c95cdd),LL(0x07dbde25,0xf5273466),LL(0xf0969049,0x76e98baa),LL(0x8cba001d,0xae173b76),LL(0xcde8bcc2,0xf10bd659),LL(0x09ae5065,0xc7bec674),LL(0x5cecdf22,0x4bdaed4b),LL(0x41bc9eb9,0xc459b9e5),L_(0x00000146),
+ LL(0x6121d2de,0xd08a3672),LL(0xbcb161c1,0x52ff0a6b),LL(0x0593dede,0x4b01e845),LL(0xb5c016b2,0x421052e7),LL(0x65c310a3,0x6c1dd249),LL(0xf97c5a2d,0x5a4e53fc),LL(0xe551417d,0x0e004126),LL(0xbf9b31fa,0xc101bc8b),L_(0x00000125), LL(0xf17fd0e4,0x2811e723),LL(0xeaad08c2,0xcc586f7d),LL(0xc771ce2f,0x8c0556ea),LL(0xef8166e5,0x32556e9b),LL(0x2d11bd0c,0x11e66977),LL(0xfe7d92c3,0x646a8dfa),LL(0x58b69181,0x8a624576),LL(0x5de6bd35,0xdeb3cceb),L_(0x00000027),
+ LL(0x81d3dab7,0x88f96f05),LL(0xc1d3ecbd,0x3593555a),LL(0x3073315c,0xb56c336e),LL(0xaec91693,0x5eea4cf3),LL(0x2eade86a,0x90e05846),LL(0xe134f505,0x9189d76c),LL(0x8d429f7e,0x0feade8a),LL(0xf0013b30,0xe083daf3),L_(0x00000097), LL(0xec2945ab,0x817e33d7),LL(0x9c2537c7,0xa44bf13f),LL(0x9a6a317a,0xda31eee4),LL(0x35ae34c0,0xa0379d97),LL(0xd66b27c5,0x76a48571),LL(0x1ae6d028,0x5d83028d),LL(0xbb8dadac,0x1e4ebd89),LL(0x8aaff54e,0x67e3f97d),L_(0x00000083),
+ LL(0x0bc690f6,0x9a7f8ba8),LL(0x2992a59b,0xa9efff68),LL(0x1a328627,0x3c1d097f),LL(0x555f21eb,0xf75afbb3),LL(0x48ff742c,0x4bf1016a),LL(0xa10b236e,0x5c770a94),LL(0xff3e57b4,0x5915a516),LL(0xc042020f,0x9df7440a),L_(0x00000186), LL(0x18a6102c,0xecaea7dc),LL(0xbf14c4c4,0xd0035f1c),LL(0x8343dde4,0x19dfc08d),LL(0x3a483722,0x5b130cf1),LL(0xc107a176,0x30fc7b7f),LL(0x6717617b,0xf8cab932),LL(0x626ffb5f,0x59269de8),LL(0x74af7c16,0xbf37b9d1),L_(0x0000000d),
+ LL(0x81146610,0xd31224fc),LL(0xe9393683,0x52cacad0),LL(0xd4fad3f5,0xd36819ae),LL(0x14ee7de5,0xb8c9f302),LL(0xdb882d76,0x103a3f52),LL(0xb3362378,0x1728ce43),LL(0x0f7553db,0x29c76302),LL(0x56ba2d84,0xc2f44114),L_(0x0000009f), LL(0x8ea45de7,0x3c639715),LL(0xd8b8276f,0xacdd7488),LL(0xac8ea8c0,0x912aac3a),LL(0x8de7940b,0x3dabab2d),LL(0xd5bb2c71,0xbc3f4a45),LL(0xbcc2e33c,0x2bf9f840),LL(0x9d0edeba,0x4b00c80e),LL(0xcbe852a6,0xbe4c368d),L_(0x00000191),
+ LL(0xc0428b2a,0xc2974837),LL(0x06284fef,0xe24d882e),LL(0x7041703c,0x6f37e52f),LL(0x5e1e37fd,0x7853375d),LL(0x145a0690,0xcc75898e),LL(0x270c5225,0x61f33577),LL(0x82c5658c,0x777ab969),LL(0x47024eca,0x315f136f),L_(0x00000012), LL(0x6ae06c18,0x8c1cda05),LL(0xb7db1fe6,0xedf31bed),LL(0x7f07ba36,0x8079b5f2),LL(0xcdbc2d84,0x22d262c8),LL(0x4bb1ece6,0xb457935a),LL(0x79793249,0x8614cc62),LL(0xe89f8430,0x258e4fa5),LL(0x836da5fd,0x759ca7b4),L_(0x00000009),
+ LL(0x8d1df13f,0xfa6cf668),LL(0xce181709,0x4b169dbb),LL(0x5bee0010,0x618d280d),LL(0x28a88cdb,0xa9c8042e),LL(0xd8239424,0x8ce15b95),LL(0xcfce331d,0xda740deb),LL(0x6f83c378,0x3c616a52),LL(0xfc05f1b1,0xda236e18),L_(0x0000013b), LL(0xc1e90721,0x8647ebee),LL(0x64ec0125,0x0db33259),LL(0x91422332,0xf49a7d94),LL(0xa2819732,0xcccef356),LL(0x9b90c693,0x87f18954),LL(0x805deff2,0x22aa64c0),LL(0x294b5e96,0x352be09c),LL(0xa610a1bc,0x8368526f),L_(0x0000017e),
+ LL(0x1fdc38a3,0x8a8479d8),LL(0x893e0d1c,0x045ea96a),LL(0x972cecee,0x37445b26),LL(0xb250ed0b,0x1c0a16a9),LL(0x08e477bf,0x7509c768),LL(0xc826b683,0xb74870c4),LL(0x008a3f9f,0x4d580408),LL(0x4b88d0f7,0x18d474fc),L_(0x0000003d), LL(0x2178ecd9,0x2fa143fb),LL(0x726dcabd,0x36d39ee2),LL(0xe017d3cb,0xd8d9e011),LL(0x43bd77e2,0x332c8650),LL(0xc8965069,0x3231a13f),LL(0xf7a775c4,0x1e3de078),LL(0xe93c91cf,0xe0f7c892),LL(0x50d48604,0x27097492),L_(0x0000011d),
+},
+/* digit=66 base_pwr=2^330 */
+{
+ LL(0x3a3e42bf,0x9e603471),LL(0xfb50e447,0x2536308c),LL(0xf617634a,0x9549272f),LL(0x302ba17f,0x3e264556),LL(0x0f6ed916,0xddb056ef),LL(0xc67d2e92,0xf04b9449),LL(0x7bf608be,0xe0fd2d62),LL(0x5ba41494,0xfaa0f9ad),L_(0x000000ca), LL(0x08a03740,0xac0394a9),LL(0x9ed3e6c1,0x9017e273),LL(0x2bf950e4,0x441c9b0d),LL(0x9856ca69,0x717b7978),LL(0x3315b53c,0x66f1bf12),LL(0xc5bce131,0xdc85d5ff),LL(0xf7b0dacb,0x32365700),LL(0xf85306a7,0x22ce0f19),L_(0x000000fc),
+ LL(0x9bda8667,0x4ae474b2),LL(0x3a2640ed,0x3684de2b),LL(0x21f91da9,0x424bab62),LL(0x9955df67,0x50d60209),LL(0x5193b4b5,0x196c99d5),LL(0x8e9f2748,0x7e7f3c74),LL(0x31e6b3fe,0x257248f6),LL(0x73f47f4e,0x56db9ba3),L_(0x0000018f), LL(0xbc4dd12f,0x48bc357e),LL(0x3556892c,0xfa4353a3),LL(0xb72124cf,0x6ea40bee),LL(0x1dbe3505,0xb37aa3c7),LL(0x2e951ca1,0xaddc96c7),LL(0x71de6fca,0x58ae291c),LL(0xf88244eb,0x96fd42af),LL(0x7e89a7bf,0x1c5d8ae9),L_(0x000000b4),
+ LL(0x263c0965,0x5894fe38),LL(0xa61f78f7,0x1b7d597b),LL(0x4cc9003f,0x94b8d7ad),LL(0x0c50139b,0x899c26b5),LL(0xd4d5af57,0x5801efbb),LL(0x7d0705ee,0xc45f009b),LL(0x345f5d52,0xc52fa5f2),LL(0xda142009,0x8d175fe7),L_(0x00000018), LL(0xbfaa39a3,0x3b59142d),LL(0xc3639f82,0x8ec202a8),LL(0x87394d85,0xb2496e6e),LL(0xa4035f4b,0x7b3e291d),LL(0xcab52bdd,0xda4a9abd),LL(0x41430674,0x23a5aab4),LL(0x7c18c413,0x57ee045c),LL(0xe39c61ef,0x6008e4d9),L_(0x00000190),
+ LL(0x1fc12350,0xc78ac751),LL(0x51e9a589,0x6a5f85af),LL(0xc09d63e5,0x8ce24a89),LL(0x9b655b51,0x5441652a),LL(0x9b445da7,0xf4ffab48),LL(0x9523b0e9,0x23e77128),LL(0x90aaf7cb,0x99234af2),LL(0xb5c9bc78,0xa65dc198),L_(0x000001dd), LL(0xbd5a6f7c,0xfaeeacca),LL(0x00e72c44,0xa2bbbd59),LL(0x47a63782,0xf531aecb),LL(0x67c393bb,0xc7dda450),LL(0x31630b09,0xe719fa6f),LL(0xc95e46b2,0xf849f3a0),LL(0xdeaf5d70,0x68299654),LL(0x827dd5d4,0x286bc1f0),L_(0x0000016c),
+ LL(0x70c9336e,0x9eae7cc9),LL(0x62e9226e,0x3410c389),LL(0x2f9c24f5,0x71f68cfe),LL(0x090966e9,0xa4f25f7a),LL(0xbb4733af,0x45a0c4d6),LL(0x6303208f,0x0dc0c0a0),LL(0xc45e9f18,0x9a589e6d),LL(0x5c94f082,0xb9c34b5b),L_(0x0000011d), LL(0x0284760d,0x9fc32695),LL(0xaccb375d,0x15ea0e6d),LL(0x5d3b353b,0xc2dc172e),LL(0xdcb147d5,0x96265816),LL(0x7b5ea6b9,0x7188496d),LL(0x6c199f62,0x067983d5),LL(0x8be2b6ee,0x804ab5f0),LL(0xb8433a5a,0xfb9701f7),L_(0x0000017f),
+ LL(0x9106f208,0xf346db2e),LL(0x75d8b8a7,0x6d441b3f),LL(0x33c9dd4c,0x49bf3101),LL(0x43c1a96f,0x586195d3),LL(0xc64bca08,0x797aa157),LL(0x35872dbe,0xf8494dd7),LL(0x155f257f,0x370900d2),LL(0x42b380b7,0x2ec6eba8),L_(0x0000006f), LL(0x1c0aaf14,0xd54c0210),LL(0x9ba3b710,0xdf76d347),LL(0x79738efe,0x168b7e7a),LL(0x59395338,0x5be21cb3),LL(0x786b578f,0x6c93997c),LL(0xb42b9419,0xda95deb9),LL(0x1b5aa55d,0x1941c038),LL(0x6282d548,0xdc8f9a51),L_(0x0000014b),
+ LL(0x8b6edce5,0xc54fa3d4),LL(0xc9331956,0x37673a44),LL(0x95ef7146,0x8699a77e),LL(0x35d322ef,0xe5aa4366),LL(0xb0a5fb37,0x1c2f8160),LL(0xdaf11474,0x6c679654),LL(0x4ae2c0a4,0x25f5bd9f),LL(0x0cd1a20c,0x2812f915),L_(0x000001b7), LL(0xead818f2,0x6ba35704),LL(0xddf43f70,0x66ebac5d),LL(0xbd74a353,0x5836be03),LL(0x8be404aa,0x606cb997),LL(0xa72b6949,0xe5570eb3),LL(0xe6f5f53a,0x1550fdd3),LL(0xd841cc12,0x83299eb2),LL(0xcf113a07,0x76117e23),L_(0x0000014d),
+ LL(0x8ca6af16,0x0412d583),LL(0xe9241a8a,0xac6aa964),LL(0x24077ab2,0xe1536c1d),LL(0xad189da3,0xdf56af4a),LL(0xfbfb6e01,0x46ef9e57),LL(0x8ca8e624,0x7c9eb17f),LL(0xcbcb351a,0xf3eda4f9),LL(0x0985fb54,0x69708739),L_(0x00000029), LL(0x2e5fdd15,0x4656d8d3),LL(0x4d7980be,0x8d7ed681),LL(0x65dbc6a6,0xe9b6528d),LL(0x433cebeb,0x9dfcc27d),LL(0x25c88d26,0x273aec82),LL(0x43f7caaf,0x8662d906),LL(0x1c78327e,0xe4a09eb4),LL(0x04763fda,0xad9bd2f6),L_(0x0000010e),
+ LL(0x4dc5df22,0x56bd282f),LL(0xc5002426,0x8905b0bd),LL(0xc776fda9,0x5fecb366),LL(0x691702ab,0x8c3c6d77),LL(0x3eafba03,0x7b9bb860),LL(0xa5a38b66,0x288652df),LL(0x9d4dccfc,0x8b876824),LL(0xf937bd4d,0xedcfeccb),L_(0x000001b7), LL(0x6481cd26,0x4223e6a4),LL(0xffdb1d9f,0x44384141),LL(0x4395593e,0x68a0f97c),LL(0x4b9f43be,0xa0157cb8),LL(0x99290f7c,0xcccef6ba),LL(0xef0777fc,0x4349cd23),LL(0xc43d71c0,0x17318622),LL(0xa3bb9fb0,0x5a9a1343),L_(0x0000009d),
+ LL(0xf567f47a,0xd92ddb9e),LL(0x22ba5c1f,0x65cc6bf6),LL(0xa333c9c6,0xb76d024f),LL(0x521f0218,0x51355f8c),LL(0xb277d241,0x061005e2),LL(0x36014e7f,0x322c2c56),LL(0x52d2dee0,0x8916c0e7),LL(0xf40b1b75,0x0e73d5bd),L_(0x00000126), LL(0xc2ed535a,0x2bc1b23d),LL(0x34905a27,0x31577092),LL(0xac41b5aa,0xf6758a71),LL(0x0e95917e,0xeccda7b1),LL(0x35f458d2,0x52d35c5f),LL(0x61af1ed0,0x42e21d1f),LL(0x99ea1f96,0x1b6c4f11),LL(0x1c9ff42a,0x5a729a64),L_(0x00000031),
+ LL(0x5f04894e,0xa860137a),LL(0x2bb38059,0x7d4fcbe1),LL(0xaebc7ba3,0x3de80141),LL(0xabc6d3af,0x0ce79f66),LL(0xecaf11f9,0x9743b455),LL(0x23367c7f,0xcf9fcf33),LL(0x458f9b06,0xaf18324a),LL(0x1dd894da,0xc4c95fe7),L_(0x0000010b), LL(0xd8ec1140,0xe5b4edaf),LL(0xff94f2f7,0xdb54a58e),LL(0xc8f912e0,0x655ce3bf),LL(0xdffa0710,0xb0757830),LL(0x0f2d4402,0xb963f905),LL(0x95d5e868,0x098d24ba),LL(0xcdbb826b,0xba591cbd),LL(0xb02b1feb,0x6a8df836),L_(0x000001ce),
+ LL(0xc29bd6ff,0x108f42a8),LL(0x9cf21db6,0xddcfd187),LL(0x555cfe2b,0xaf269c11),LL(0xe7b4d452,0xc4011856),LL(0x3cb7c3fc,0xfe6e4559),LL(0x415957c0,0x8996b215),LL(0x3b983b2c,0xbe5cf31d),LL(0x0312f953,0x78abc3a0),L_(0x00000170), LL(0x39b80aba,0xd52c0d6b),LL(0x847e724e,0x42bcb7b2),LL(0xcfdfc839,0x2ddac314),LL(0x2aac1c0a,0xa690e67e),LL(0x60736a1d,0xe310507c),LL(0x15f2f407,0xa30b8b85),LL(0x03447dd4,0xf3ddc7c2),LL(0x87208fe5,0x482e1135),L_(0x00000070),
+ LL(0x93eecb93,0x4b696b0d),LL(0x98400d78,0x671aa2b1),LL(0x05e6f78c,0x19c7b31c),LL(0x2f26896d,0x537e98fd),LL(0xc925cf6a,0x31498b2c),LL(0xe43ae0bb,0x5b628896),LL(0x2cc9c889,0xf81936b3),LL(0xd5a79df1,0xaa558d67),L_(0x000000a6), LL(0xc651825a,0x947e26f1),LL(0xd8102ba2,0xcba2e206),LL(0xf57819ca,0xe1b53333),LL(0xb14e41e4,0x89b722a1),LL(0xa87036c9,0x43d9c2e8),LL(0x8c5e594a,0x8a9f09ad),LL(0xfc198885,0x96afae31),LL(0xd164a447,0xf6ad8705),L_(0x00000015),
+ LL(0x4517c109,0x51de1f32),LL(0xfe892ec2,0xde0ad941),LL(0xa5e0c485,0x252b5759),LL(0x04504e2c,0xe069dceb),LL(0xceea659d,0x80061659),LL(0xb3fe1e63,0xee236d87),LL(0x846da87b,0xf97ae613),LL(0xa90f8433,0xe7abcaf3),L_(0x000001d9), LL(0x89e00052,0x583a7dc4),LL(0x6598f335,0x8097f299),LL(0x89f7734d,0xff15633b),LL(0x8aebbf6c,0xb01c7b6a),LL(0xb5108c62,0xc7f93ae2),LL(0xf807ee31,0xf990d4e3),LL(0x34992a71,0x9962859e),LL(0x282fca85,0x8047dde1),L_(0x00000172),
+ LL(0x5435ca99,0x5945bc53),LL(0xcf237d07,0xe31f2468),LL(0x1ef4bb2f,0x641e2901),LL(0x2c562b14,0x06773e1d),LL(0x2ff0373c,0xca66e36e),LL(0xc519e2a9,0x716d0497),LL(0xbfb75cdb,0x9a1fa9e2),LL(0x0dddfb32,0x1e517999),L_(0x00000085), LL(0x85c6aefd,0x9daa8f05),LL(0xe87b5c36,0xba374fa1),LL(0xcd0b7e7d,0xf9ec22c4),LL(0xd20b7cb2,0xdd4d581d),LL(0x516610e0,0x74ddb0da),LL(0x126aa3e2,0x4e09fb27),LL(0x35d95ce7,0x0c242711),LL(0x40d02e9e,0x926ede13),L_(0x0000004d),
+ LL(0xb5538d3b,0xb7d7682e),LL(0xd8734ac8,0xd322358b),LL(0x75fcdec6,0x56d9d86e),LL(0xe72ffc35,0x6c363b61),LL(0xd1066f3a,0x3d03c2ea),LL(0x7095dbd7,0xcd1674fd),LL(0xb42f9972,0xacc3e682),LL(0x9370acc2,0x80c71149),L_(0x000000fd), LL(0x89c235f7,0x5a49c095),LL(0xe1070948,0xd0d2a294),LL(0xe55bcaed,0xa073e38c),LL(0xd2884da3,0x25346561),LL(0x95d34747,0xbed8195e),LL(0x990b2c19,0xefe701ec),LL(0x17664aec,0x4c59ce88),LL(0xcb5f1246,0xa23cc1c6),L_(0x00000185),
+},
+/* digit=67 base_pwr=2^335 */
+{
+ LL(0xf7ab9a02,0x72a8d985),LL(0x39a70c2f,0xea7d5b7d),LL(0xf6f8acab,0x73f642dc),LL(0xdeb95d02,0x8a54bc56),LL(0x3f3cc37d,0x5a63f188),LL(0x1ef1bba0,0x8c074b83),LL(0xe112f14c,0x17f937a8),LL(0x29897379,0x4d335ca2),L_(0x00000087), LL(0x70af11f6,0x998374f7),LL(0x8ee96d7e,0x7d432cad),LL(0xbff9e11a,0xe6665366),LL(0xf6d56384,0x9b692423),LL(0xfc7e344a,0xf75f044e),LL(0xee1b3ddd,0xa827ee60),LL(0x9cd00df7,0xb2612c93),LL(0x3d529eb5,0xc4ffa6a1),L_(0x000000d7),
+ LL(0xa6774f15,0x39c16671),LL(0x3753ce58,0x7356faf0),LL(0x54c5f8c0,0x1165a356),LL(0xf5c1afc7,0xd6adf86c),LL(0x903b89f9,0xba6b4966),LL(0xbff86c3f,0xb1519f4e),LL(0xa87b0151,0xbe4f95b4),LL(0x85efd27b,0x0513d263),L_(0x00000104), LL(0xfa5d90d2,0xd4622a63),LL(0x2aca99c7,0xa6efd8d9),LL(0x1d6acf3a,0x7e55d6dd),LL(0x95a1b738,0xdb119c22),LL(0xd9703d10,0xd11a67da),LL(0x427c0f52,0xe412eedb),LL(0xe055192f,0x174c7a31),LL(0x404a5758,0xfd4b1dde),L_(0x0000015c),
+ LL(0x86c17046,0xc51693d1),LL(0x57ada379,0x7b463243),LL(0x9dea1156,0x65ad7ad1),LL(0x3431ffb8,0x22995c21),LL(0xbfb6e47d,0xa47b2e96),LL(0xecc87ed5,0xb5d8ce10),LL(0xab93da78,0xe414756b),LL(0x0b5319cc,0x327dee6e),L_(0x00000168), LL(0x0d0b7234,0x68a2cd80),LL(0xd1a1a9cc,0x62b72c52),LL(0x2c285a2a,0x23638d39),LL(0x1736a146,0x90e668b9),LL(0x99d14c12,0xe73e0b34),LL(0x0861672c,0x88955dcb),LL(0x7dc3cdab,0x06284ae9),LL(0x4fad41f5,0xfe7ca883),L_(0x000000d7),
+ LL(0x7fe98530,0x370d119f),LL(0x9990254b,0x764d3fe4),LL(0x8a86cb40,0x39be0e2c),LL(0x4b9820af,0x458321b0),LL(0x29475227,0x2c2ba583),LL(0xa07a5c7f,0x52e9ae89),LL(0xfa6d5206,0xbdc0eee8),LL(0x435604c9,0x6f2e4842),L_(0x000000c0), LL(0x2bfa81c0,0x1714a30a),LL(0x66400030,0xa3f37cbd),LL(0xab87a938,0xf3132874),LL(0xecbe1c91,0x7e9d7ac6),LL(0x1734fae5,0x7e33fb88),LL(0x600765b0,0xedfc073b),LL(0x428cbfb5,0x85e9a209),LL(0xbd290285,0x77ef7692),L_(0x000001e0),
+ LL(0xa928bd97,0xec2103fa),LL(0xa28d165e,0x31bc9c0a),LL(0x9e3c2272,0x1db480d5),LL(0xeefa29bf,0x5fe970c7),LL(0x0625c44f,0xa6473b7b),LL(0xd9e52858,0x66b89d6b),LL(0xea4cd7c9,0xc3e3b579),LL(0x3b6547a2,0xa8bdce16),L_(0x0000004e), LL(0x4065d81f,0x66f8ad71),LL(0x8a1901b7,0x08802270),LL(0x0ceae5cf,0x853e6e60),LL(0x63ae6ec1,0xd89e54bb),LL(0x1f365d84,0x9e03d94f),LL(0x49df44dd,0xddc9e1b3),LL(0xf70096c2,0xba5865a7),LL(0x6cc7a69e,0x01800fb8),L_(0x000001ad),
+ LL(0xd6f6ffe5,0x91cf34a0),LL(0xc22b2802,0xfd975370),LL(0xe87a26b1,0x662b3666),LL(0x46d8088a,0xa7466010),LL(0x0988f2ee,0xd8edbdfb),LL(0x1f7fc1eb,0xf4b2f213),LL(0x266b6d41,0x00896949),LL(0xc83c1c02,0x7c849de8),L_(0x000001e2), LL(0xf3a594e4,0x90bcda37),LL(0x480ec74a,0xdde9d726),LL(0x26216e2d,0xbef16495),LL(0xa5c64b02,0xfba3c749),LL(0xc3f630aa,0xea872930),LL(0x8695df3b,0xb21d654a),LL(0xb5372491,0xa2f3f6fc),LL(0xe917f3b3,0x13fe01cf),L_(0x00000146),
+ LL(0xd606cedc,0x12faa2d3),LL(0x93a86247,0x67da197c),LL(0xd4612a0b,0xfd72cd4e),LL(0x145bbdec,0x8483b822),LL(0xb4dba8a8,0xf56d58c6),LL(0x81ec1ed7,0x708f26ec),LL(0x631a5032,0xf4782ede),LL(0xb4b04fc8,0x34a251ec),L_(0x0000008d), LL(0xd85c10f7,0x1b8eedbc),LL(0xadbb93b8,0x1b68a64f),LL(0x2308b6f8,0xc37e6bd6),LL(0x392cec36,0x7b419db4),LL(0x0aee0e63,0x1777f3d5),LL(0xff167cd9,0x706d5278),LL(0xede81ea9,0x2ecab8c0),LL(0x63b7e96c,0xb7b3cb43),L_(0x0000005a),
+ LL(0x7b39090f,0xec8937b4),LL(0xbb7112fd,0x3ed5a415),LL(0x66e9e19d,0x01eab0fa),LL(0xbbe65978,0x740c409b),LL(0xba92675e,0xa050b19b),LL(0x3e8b56da,0xe6eedf2c),LL(0x2fbcf099,0xa55e0691),LL(0x80195262,0xf2c7d1e9),L_(0x000000e2), LL(0x013e53cc,0xeec1384c),LL(0x51ffea5b,0xeaca6749),LL(0xd0ad477d,0x45756473),LL(0x1fd4ee32,0x80864216),LL(0xa3069430,0x850c8b97),LL(0x405f653b,0x9de4340f),LL(0x5a543cae,0x347d550d),LL(0xa331ca24,0x75f4312e),L_(0x0000012a),
+ LL(0xf7fa7404,0x6f04ee1f),LL(0x5987ecf0,0xe39114e7),LL(0x8c92a999,0x734b40d0),LL(0x3eb0ff94,0x35b97b9a),LL(0xf3a7b34c,0xd5b35118),LL(0xd35276ae,0xfa36fe0d),LL(0x9e933110,0x3c37067d),LL(0xbe64ccaa,0x9629f86f),L_(0x00000157), LL(0x1cfc72eb,0x2f066fb6),LL(0x69fb1dea,0xd4e489f4),LL(0x65ba5821,0x3abd59aa),LL(0xf0068abc,0xf152d51c),LL(0xfa26b25b,0x4c7900c0),LL(0x929fd963,0x22beebe6),LL(0xd19508e6,0x6c8e147f),LL(0x84fd88ff,0x8a8eae8c),L_(0x00000146),
+ LL(0x746ef6f8,0x58c8162c),LL(0x15dbf9ea,0x7dd87f67),LL(0x5523d821,0x2bc5b0b4),LL(0x8780b2c5,0xb8903ecd),LL(0xf92e785d,0x54296f75),LL(0x6397e404,0xcce33c6e),LL(0x84bad1cc,0xd3c5f54e),LL(0x95b82162,0x33f935ae),L_(0x00000093), LL(0x3e26a2e6,0xf54ff1c3),LL(0xb4ec10e1,0xc2886785),LL(0xa1634274,0xe5822d49),LL(0xbfab5d5e,0xbe9122e0),LL(0x955a062f,0xf03c2cc2),LL(0x579ad9b7,0xf2e5e08e),LL(0xdd6ee255,0x1b65e701),LL(0x934f08f7,0xcd7d23cb),L_(0x0000009d),
+ LL(0xaddd73ec,0xaeacb5da),LL(0x9e604f26,0xf00003d7),LL(0xb32a37b8,0x5e05fada),LL(0x771ab3ac,0x03aa3a60),LL(0xe17eba9f,0x31442064),LL(0x7239319d,0x021c13e4),LL(0xa35b4712,0x3f7e400f),LL(0xc6e5283a,0x5888abe0),L_(0x00000110), LL(0x45cb211a,0x0081a506),LL(0x59fee06e,0x6e2f4f1a),LL(0x372aea8b,0x11014792),LL(0x2416f852,0x35841e3f),LL(0x71de69f4,0x710be3f1),LL(0xfa1b9018,0xd8151855),LL(0x92a94717,0x52addc4d),LL(0xff148def,0xea65eaa7),L_(0x0000003b),
+ LL(0xd85c3892,0x01927819),LL(0xd986cf50,0xab17488d),LL(0xeb6ebddd,0x8628281f),LL(0x92fa1e38,0x4511bc03),LL(0xe1691b01,0x0b79c2a5),LL(0xb842f844,0x8805d866),LL(0x343c71a4,0xd5d795d0),LL(0x042ac5c5,0xedd85588),L_(0x000000aa), LL(0x875f110a,0xfa896067),LL(0x0d43dab8,0xd6f1580b),LL(0x9a3104ec,0x840b3b59),LL(0x76717c31,0x41201091),LL(0x2243eb78,0x88de871b),LL(0xe2323a38,0x53ac3f7b),LL(0x764799c3,0xdaf476ff),LL(0x999d244e,0xc595b87c),L_(0x00000113),
+ LL(0x7b2cee87,0x8985e912),LL(0x3a4ec3d9,0x639aa554),LL(0x9515b9e8,0x2b90b395),LL(0xe330201b,0x5d9f9a07),LL(0x95f372a0,0x83696835),LL(0x0d679c0c,0x8c8132ef),LL(0xbc4509be,0x5efb5013),LL(0x1a4c14f9,0x7a8442ff),L_(0x0000016b), LL(0x27796676,0x1d220323),LL(0x607be429,0x7b931a60),LL(0x3b156b2a,0x38e10514),LL(0x36aabd76,0x8ff10073),LL(0x384c71ad,0x3603a7b3),LL(0x1c1f643f,0xe305de49),LL(0x08714206,0x63b53241),LL(0x57add901,0xfba33a9a),L_(0x00000151),
+ LL(0xe6fdb7c1,0x03800832),LL(0xceb77120,0xc3398df2),LL(0x625cbf7e,0x4c74b442),LL(0xdf67b9eb,0x424f2515),LL(0x6b977890,0x2abc1051),LL(0x2462b490,0x7c8f5df8),LL(0x6d60d980,0x1bb838ca),LL(0xff606aee,0x1e7a2ff1),L_(0x0000010e), LL(0x8ce853f5,0x238fce9b),LL(0x49a4c209,0x73f7bb70),LL(0xae2b39f7,0xcfbf4b1e),LL(0x53e2f55b,0x7309ae96),LL(0x026775b0,0xfcf869d6),LL(0x1b0e83da,0x72ed99fe),LL(0x02f8a21d,0xe81bf7a2),LL(0xd737619d,0x2bf238b7),L_(0x0000017b),
+ LL(0xd12397f2,0x38b832fc),LL(0xb158ca8a,0xb03ae8bb),LL(0x7420634b,0xac8efa9e),LL(0xaa8dadd3,0x259a7c31),LL(0x525d1488,0xf727fdfe),LL(0x8b687898,0x48ffe9fc),LL(0xfbbb696d,0xb00d2cb4),LL(0xf4a8353d,0x9be76892),L_(0x000000b6), LL(0x99e21f84,0xf73fea91),LL(0x0e2a8788,0xfce9c9d4),LL(0x18c2b050,0x3412a938),LL(0x1844f4f0,0xc14eff85),LL(0x4ad5ef54,0x0ad47ee3),LL(0x01446b7d,0x4c160f3e),LL(0xc22336c4,0xc43f42cf),LL(0x64f51a4f,0x34833c47),L_(0x00000155),
+ LL(0x54298a18,0x7f8ca9dd),LL(0x308270c4,0x433780e1),LL(0x2be3ff97,0xb186cdf8),LL(0xeb6471b0,0x747ce696),LL(0x05f60ab1,0x815fe310),LL(0x5a457da8,0x6bb9ac1b),LL(0x4901af0f,0x925bd14f),LL(0x652f972c,0xacd8b58a),L_(0x00000186), LL(0x72184c64,0x3e0f3553),LL(0xf7ba0c69,0x6dbda5e1),LL(0x5b11db3d,0xe46fae1c),LL(0xf1f51b89,0x7c0b46b0),LL(0xa48d5ec9,0x1cc037ca),LL(0xbdcc7599,0xe5f40355),LL(0x28784dc0,0xd1a3fa4f),LL(0x0b837ead,0xb5a1926d),L_(0x000001ee),
+},
+/* digit=68 base_pwr=2^340 */
+{
+ LL(0x97e26dd0,0xde847fc3),LL(0x2cc0ff17,0x8ee8bde0),LL(0x63e6fe38,0x774123d0),LL(0x97b1e73a,0xf8cb9f55),LL(0xee20c8da,0x8b938535),LL(0xa8b1bfac,0x3df10d7d),LL(0xe2a81936,0xe7d42738),LL(0x9979861a,0xaf0a6779),L_(0x0000003e), LL(0xde00c8a6,0xbb611141),LL(0xaefc5b58,0x9b3d91d2),LL(0x33633ce2,0x0d5e3306),LL(0x2544bfef,0x8956c10a),LL(0xbeaa2dd7,0xcfa84101),LL(0x8ba22402,0x96a5f958),LL(0x0df8f462,0x34ace12e),LL(0xc6c70187,0xe0e00d25),L_(0x000000a8),
+ LL(0x28cda662,0x8cc26d9a),LL(0x4788e280,0xddb52ac3),LL(0xa2e3c895,0x305bc55d),LL(0x6e792cc3,0xee807637),LL(0x5f9d9986,0x0da2d9cb),LL(0xaea185a3,0x56f8f0d8),LL(0x8ef462b9,0x096bebd6),LL(0x300f61c2,0x7be11b59),L_(0x0000004e), LL(0x15fdd133,0x9dea58bb),LL(0x2585fb77,0x8271cd5b),LL(0xd75c3d97,0x5ac1a4b5),LL(0x4eee827a,0x6fe4d480),LL(0x0147df6c,0x7f66c09f),LL(0x3f6a4c21,0x92c3b320),LL(0x1eeb9502,0x17768418),LL(0xebda3f44,0x12f688be),L_(0x00000117),
+ LL(0x8027c8dd,0xea4586de),LL(0xdc25b073,0xf24773b7),LL(0x49b36fcc,0x8466e794),LL(0x3cc03245,0x36f85404),LL(0x02d71d6f,0x251e24c9),LL(0x1a81ea4c,0x9e39ec68),LL(0x0e710d11,0x0e27e696),LL(0x44dfa8e5,0x6885ae0f),L_(0x000001c9), LL(0xe3e54e0a,0x7872cc7e),LL(0xb8224b0f,0xb5696e54),LL(0xe5d4bd3d,0x64ead37d),LL(0xcbad27cc,0x5b2f36d2),LL(0xa45e529b,0x521210e2),LL(0x788fbf74,0xe1bd2c8d),LL(0x40c5440b,0x2b990184),LL(0xbc157b39,0xeeecc510),L_(0x0000005d),
+ LL(0x1941c1e9,0x241f3444),LL(0xaf242ed2,0x73f71786),LL(0x82ffb7bd,0xee8f684b),LL(0x0b940040,0x0e0a7766),LL(0x3cb9180b,0x05509077),LL(0x41ff934d,0xd7e63b43),LL(0xfe154397,0x597b1f2e),LL(0x73566086,0x115dad8d),L_(0x0000018e), LL(0xe97eed76,0xa0320279),LL(0x44ad3c59,0x95d0b92b),LL(0x9546c02d,0x17644016),LL(0x0cf317d6,0xb1278de8),LL(0x0cc035b3,0xa150eec2),LL(0xa454911c,0x40f34047),LL(0xb15350f1,0x64a854ce),LL(0x24297dd6,0x45fd389a),L_(0x00000015),
+ LL(0x2f4ddeb6,0x1b54c6d4),LL(0xd46442b3,0xc94971a5),LL(0x8eb97dd3,0x9e3e1ff6),LL(0xe2df3525,0x058db0b2),LL(0xe0b69449,0x46968077),LL(0x4ea6ec9f,0xba76456e),LL(0x8457796a,0x77183369),LL(0x255412cc,0xb4e4306f),L_(0x0000005e), LL(0xf2060dc0,0xcef4a91b),LL(0x57dadc33,0xb934de9a),LL(0x51f56ade,0x2e8fe341),LL(0x49ab29d2,0x85723b5e),LL(0xfabf520f,0x1ee66b41),LL(0xbffe6761,0x0a605253),LL(0x50202f55,0x9e49468c),LL(0xef6d250b,0x956ea13f),L_(0x000001a2),
+ LL(0xea2b5246,0xe30dc097),LL(0xb5323240,0x3dd49c5e),LL(0x082d33c5,0x17c692b6),LL(0x12bc5d69,0x7e9d695a),LL(0x02c7fd33,0xb78372d6),LL(0x85e92117,0xefa0ef29),LL(0xceacebcb,0x9b4e8e18),LL(0x3d68cc3e,0xe3e50ee1),L_(0x000001b3), LL(0x0d2f5e36,0x5f980bec),LL(0x9b062f58,0x03edaeaa),LL(0x83ee3b51,0x4f1f8028),LL(0xe4a60553,0xd292d29e),LL(0xf95f8dad,0x7f9ba28d),LL(0xfb5785f5,0x54b8d134),LL(0x0fe162fe,0x2bd8287f),LL(0x2247f090,0x769ce1a1),L_(0x000001e3),
+ LL(0x8c32c911,0x416e3d53),LL(0x74341e71,0xa2b4eeb7),LL(0x9e6b225b,0xff742236),LL(0xd3c824dc,0x5e3b9c67),LL(0xd547224d,0xc6e4276d),LL(0xcc105d46,0x8a001d2d),LL(0x92da4b3a,0x3b252483),LL(0x67e2f395,0xcbb5174b),L_(0x000000fe), LL(0x508826b7,0x2308d720),LL(0x4e2e8071,0x9562db9b),LL(0x1bf6b116,0xb14e6841),LL(0x45f6d2ac,0xbfd32572),LL(0x8cdf458c,0xe189ac1c),LL(0x3f894fd3,0xb5d6ee49),LL(0xa59cbf0a,0x672a0c8f),LL(0xd8476d8e,0xfbb78753),L_(0x000000d9),
+ LL(0x1cd9788c,0x4e39334c),LL(0x0560e3e7,0xc62b58ab),LL(0xfa2ff6e2,0x25b0cfee),LL(0xe3dacd7d,0x56f469ae),LL(0x6476d0c4,0xaa862fad),LL(0x0d8d2340,0x468a688f),LL(0x648a9494,0x9d4d2feb),LL(0xe9f4ed20,0x3e7c5890),L_(0x000000a9), LL(0x3f607213,0x12cdd07e),LL(0x60784376,0x8d6d1246),LL(0xea183586,0x85400753),LL(0x5c35ba6a,0xf252808d),LL(0x57ba4df7,0x07b45d68),LL(0x048ddde7,0x8c60d683),LL(0x759393e3,0x919b183c),LL(0x760c630e,0x90171725),L_(0x00000120),
+ LL(0xe24eabd7,0xc6d9113b),LL(0xdfe5709e,0x1b269289),LL(0x74793368,0x0c1477a3),LL(0x3c2fbb12,0x544d389c),LL(0xbce04baa,0x4fcb6058),LL(0x52137546,0x62503bea),LL(0x306eaabe,0xb0495976),LL(0x49afd268,0xa62777c0),L_(0x00000171), LL(0xd8dbfcd4,0x5a2c2301),LL(0x122ed53b,0x23b67f05),LL(0x68235f24,0x0b4f5601),LL(0x850a3bcc,0xfc63cfca),LL(0xfb6987d1,0x7f3a86aa),LL(0xeb70f694,0x726395f3),LL(0xe2648fe0,0xfc883eec),LL(0x04f6906b,0x551243f7),L_(0x000001a2),
+ LL(0x1ea7b394,0x1329d8d9),LL(0x09b5385e,0xe206cc29),LL(0x8ad6ff5e,0xaa658f94),LL(0x8f946f98,0x428d98ec),LL(0x2b10de6d,0x3ec6baf6),LL(0x7efb3f61,0x21982753),LL(0x47b7f15b,0x578e65b3),LL(0x63e00597,0x5b3f1a2b),L_(0x0000010b), LL(0xc87fe251,0xec6244fb),LL(0xb103454a,0xbf7ff50a),LL(0xc09eeea3,0x5b8194a6),LL(0x117b25e8,0xb8d95b3b),LL(0x4719134d,0x98e3eda5),LL(0xfb408475,0x184c4131),LL(0xaae4a703,0x433cd4bd),LL(0xee1c89f5,0xec3f5308),L_(0x0000005f),
+ LL(0x15497e40,0x0a7c8b60),LL(0x2ac3e5be,0x35df434c),LL(0x73674292,0x218ab0b7),LL(0x377ea177,0x971e7bf8),LL(0x979969d0,0xa6fc69b3),LL(0xf051da86,0x0f199014),LL(0x50a5af5c,0x0bd76f2a),LL(0x68112265,0x6ef71ee6),L_(0x000001c9), LL(0xb6a11a9c,0x2c92d1d2),LL(0xa2718b70,0x8bc153fa),LL(0xefc700c8,0x7d63139e),LL(0x11bfab90,0x63a1a94a),LL(0x1c81d0a8,0x0af04b86),LL(0x5010811a,0x65f6b2d4),LL(0xd230f7b9,0x346b9acb),LL(0x92db7ff2,0x791ad571),L_(0x000001f4),
+ LL(0x731fb0e3,0x0bfa96fe),LL(0x4b219ff8,0xe186bb8d),LL(0x34f0b2a5,0x4bbcffce),LL(0x74e4771d,0x4fa8ab52),LL(0xa8af538f,0x0bd9aa17),LL(0x55b8ec20,0x24b82cd8),LL(0x55a1e2c4,0xf54b7fae),LL(0x34a02ce9,0x011a367d),L_(0x00000056), LL(0x49d91d2b,0xb4418223),LL(0xf5b325cc,0x48062883),LL(0xae0ea746,0x3f6511a6),LL(0xa6b89032,0x057c30cb),LL(0xe93a6d10,0x00156e39),LL(0x0c08d7cc,0x7ef1eeb2),LL(0x713dea1e,0xeb905073),LL(0x1c6abbcd,0x4e60ee01),L_(0x0000019c),
+ LL(0x0253f26d,0x1db48f4d),LL(0x239e10c2,0x3cbc9af9),LL(0xde4c09f2,0xabdb2bfd),LL(0xed72b749,0xf64b181a),LL(0x928d6d6b,0xc85d2a91),LL(0x9af06cb2,0x32a985b4),LL(0x67685c7b,0x4cf68328),LL(0x607e3b33,0x96bdc7c4),L_(0x00000164), LL(0x47c82fba,0xc31b32d2),LL(0xd33b72d3,0xf9f3e673),LL(0xd3e9eee6,0x42fb631c),LL(0x43164033,0x6eedae95),LL(0xaab1e76b,0x986360ea),LL(0x9e6c1afa,0x30e60546),LL(0xffd16939,0x06fbdf1b),LL(0x989aed4f,0x7870903a),L_(0x00000135),
+ LL(0x02ec16f2,0x1065b996),LL(0x62ecea90,0x92968f64),LL(0x48a2356f,0xe74f9d69),LL(0xc38162fc,0x799bc2e4),LL(0x109958a5,0xc2cf37fd),LL(0xc511c5bf,0xb810f3aa),LL(0xba774e2d,0x04423cab),LL(0x7df651dd,0xfa41efc5),L_(0x000000be), LL(0xc60869cc,0x843bf3e9),LL(0xca2ddefb,0x07001aa8),LL(0x2325dc6b,0xfb77a925),LL(0x19ebdc37,0x984cbf76),LL(0x991269aa,0x0ea96690),LL(0x5a99df72,0xf5a76c72),LL(0x261ea01a,0x11ed492c),LL(0xec2261aa,0x511c25de),L_(0x000000dd),
+ LL(0x2208733f,0x79d76ece),LL(0xdf3265ef,0xdd97cbec),LL(0x1201ac02,0x82ed80a6),LL(0x3e075507,0x2e6d2b22),LL(0x16c3d5bb,0x9b31411b),LL(0x89a53e5c,0x4570ab97),LL(0x5d2d34d3,0x76b65f73),LL(0xd36a94bd,0x3b4c1384),L_(0x00000038), LL(0x7939931b,0x91c17d4a),LL(0x850a6308,0x5b75be0c),LL(0xa8eb3e41,0xc4b1a960),LL(0x5176e7e2,0xef74a564),LL(0xf493e8d5,0xd77a5683),LL(0x2824a377,0xdc2b6e93),LL(0x3d90456b,0xf50c072e),LL(0xfe49afc1,0x3768ae59),L_(0x0000003a),
+ LL(0x0b81885e,0xc160ead5),LL(0xf73cb6f0,0xe2cd2bce),LL(0x53fb7eb3,0x9bb7bc05),LL(0xb6b62b31,0x8a471706),LL(0xdaf298a3,0x846c6b42),LL(0x9d404cf9,0x085e05e5),LL(0x8fac2e73,0xc53893b4),LL(0xa8ff0af6,0xe3d8eea7),L_(0x000001e9), LL(0xcd5b055a,0xe934470a),LL(0xc1af94ed,0x89b3f0c4),LL(0x4fba6b38,0x9af80496),LL(0x3e423ee4,0xd89fd53a),LL(0x793fadf0,0x353cc302),LL(0xcd463b61,0x51fbb36d),LL(0x782e102e,0xd6d1c6c3),LL(0xbbc63732,0xc97f604b),L_(0x0000019d),
+},
+/* digit=69 base_pwr=2^345 */
+{
+ LL(0x4a7e1773,0x5fdb3148),LL(0x0a1bc3a0,0xbda07174),LL(0xc265e95e,0x43b1d3c4),LL(0xedc546d6,0x611b9709),LL(0x807b04c2,0xe15784fc),LL(0x473ceec4,0x58afe5bd),LL(0xc97fb33e,0x7b94dc53),LL(0x39d6d532,0x914fc6dc),L_(0x0000002a), LL(0xd880ddb6,0x67cbcf73),LL(0xdf80627a,0x67d3e029),LL(0x91ccf95a,0xfd91b52d),LL(0xa53ec7ae,0xa855273c),LL(0x1131573a,0x07213a95),LL(0x49db550c,0xfa5fb98a),LL(0x470643af,0x0fa67f5b),LL(0x6bf0628a,0xf906186e),L_(0x0000012c),
+ LL(0xe3e2f37e,0x7f1be067),LL(0x7f152d2c,0x8659f773),LL(0x242f8dec,0x8df47d63),LL(0xcbac7d95,0x91c63b0a),LL(0xf620881b,0x8c2c6ad3),LL(0xda54c002,0x701999ad),LL(0x3012f693,0x99516f6a),LL(0x3c14f4c4,0x68d44cb7),L_(0x000001a0), LL(0x8d1b414e,0x1d209ec5),LL(0x76dcc740,0x51dc58e8),LL(0x93231067,0x4e14fe98),LL(0x5a4f75f2,0x88f5086e),LL(0x4ccd6aac,0xf294dbdb),LL(0xedf86543,0x30e3be99),LL(0x767f48ab,0x22dcd0b3),LL(0xd87667c6,0xd6615681),L_(0x0000017f),
+ LL(0xb6dcc9cf,0x0d5b110b),LL(0x1e6c13e6,0xa0842e9d),LL(0x58585159,0x443356f4),LL(0x265b46fe,0x3b25c086),LL(0x87729185,0x0ebbff20),LL(0xc71c4d1d,0x79c2136e),LL(0x3ebeca5e,0x3a96ed20),LL(0x32a0af3b,0x012e330a),L_(0x00000193), LL(0xdacd4b61,0x7d17ed67),LL(0xde583a56,0xe5703cea),LL(0x316840b4,0x03d396ce),LL(0x0cfc4143,0x6970ea48),LL(0xb1974ced,0xa63761b9),LL(0x3de4383d,0xe400788f),LL(0xd07d6726,0xa545993a),LL(0xa33056bd,0xd3fe822e),L_(0x00000185),
+ LL(0x04e40c0b,0x2f073480),LL(0xf78fb060,0xb2604448),LL(0xc2ac8aeb,0x277ca03f),LL(0x27864b78,0x2c6f473d),LL(0xeb1664eb,0x7cb793a9),LL(0x58eee9a3,0x9c2ce2b3),LL(0x94f18cbc,0xc87a3dc1),LL(0x2df6078b,0x0e93cd11),L_(0x00000022), LL(0x96d6d2f1,0x3fd1ed5d),LL(0xbe10752f,0x0c38fb72),LL(0xd1e47666,0x9b093c35),LL(0x73ab1d6d,0xd898dff7),LL(0x00e4cf26,0xc4b445df),LL(0x422c1136,0x9ee0d1ce),LL(0xb6e821b5,0xe82511ed),LL(0x1ade6252,0x81c804e4),L_(0x000000f4),
+ LL(0xd903ff9c,0x47ebbcfa),LL(0x75ed251a,0xc45b660c),LL(0xef50c145,0x733af648),LL(0x00ba4ec8,0x5119e848),LL(0xb32a226b,0x3e048abf),LL(0x1f648014,0x7a1eccf1),LL(0xfab712cd,0x2badbf53),LL(0x1ebfb8b6,0xca11e7be),L_(0x000000dd), LL(0xa034de60,0x789ae7e1),LL(0x42374e6e,0xa641227e),LL(0xb2f0016d,0xa82cadf5),LL(0x8ca0d43e,0x552e57fb),LL(0x5a71e67c,0xa8bcdb55),LL(0xc3a4e9f5,0x6e0e2bb2),LL(0x124b38d4,0xc1f40c89),LL(0x60b28fe4,0xabb2620f),L_(0x000001f8),
+ LL(0x54c77c89,0xfaecca00),LL(0x028ae659,0x3a3c5350),LL(0x656b887c,0x5b3bb83d),LL(0x0c6fbb7d,0xc2d4fb00),LL(0x8f5877ba,0xea3d0289),LL(0x01e01a3d,0x943983b2),LL(0xdcb878b4,0x382b3bfc),LL(0x7e566dbe,0xe238f00d),L_(0x0000010d), LL(0x312dd2eb,0xcf1a3019),LL(0x6043d5c3,0x3f970442),LL(0xd72b4978,0x47e77b41),LL(0x51765a88,0xd9f49bc6),LL(0xc2232c0f,0xf1592cf2),LL(0xba6cd5b1,0x7bdf89de),LL(0x33024471,0xa56dd8d4),LL(0x4e3c8e30,0x6718468d),L_(0x000001f6),
+ LL(0xb8ab0296,0x1c158b81),LL(0x3cf9ac17,0xe81b84be),LL(0xb9565ca7,0xcf197d97),LL(0x30adec74,0x0f74f924),LL(0xbbec4f93,0xc6810de9),LL(0xdd1aa6b4,0x68e13e67),LL(0x31b1e868,0x3b5ec800),LL(0xb287ff46,0x970d17f9),L_(0x00000148), LL(0x4e217778,0xfc348975),LL(0x3990d639,0x2c996afc),LL(0xbf8e72bb,0xc43038ef),LL(0xf3f9e817,0x673d9367),LL(0xb8d625be,0x33a4c44f),LL(0xb72553a3,0x6135473a),LL(0x7365b95f,0x91b434c7),LL(0x70995374,0x2e7887e0),L_(0x00000182),
+ LL(0xf2b44edf,0xf8d7989a),LL(0x1b1a9086,0xb30f16f9),LL(0x2b4d5672,0x919c3dae),LL(0x64f72009,0x3b6ec0a9),LL(0x64ce5600,0xc12b7f4f),LL(0xe0f0d4fb,0x144476bf),LL(0x3eb40f82,0x0332a8a4),LL(0x80cbb448,0xf3755660),L_(0x0000013f), LL(0x5e5d7124,0xe518caf3),LL(0xa53d6591,0xe170d9ab),LL(0x4f1b1b50,0x3e56ed3e),LL(0x7c4f9eca,0x8dfe4cc6),LL(0xfa0dd028,0xa59c7726),LL(0x0a01f234,0x6c8fa066),LL(0x704007db,0x8366767a),LL(0x4570b32e,0x94810fb8),L_(0x00000169),
+ LL(0xa5e76230,0xce3ac7a6),LL(0x5ab23199,0x54772e62),LL(0xd7eb0723,0x8caedc24),LL(0x76dd866b,0xa41bb763),LL(0xba5b9e92,0xe6d92de4),LL(0x28e72bc3,0xce269dcb),LL(0x2b7dc535,0x7e64fab4),LL(0xe7cccbfd,0x02a03896),L_(0x000001c3), LL(0x278c892b,0x3dc101fd),LL(0x079c3e36,0x2332d512),LL(0xf51726ad,0xdbc6dd2c),LL(0x81e5e3b6,0xbd26d73b),LL(0xb2e70917,0x24b0b54b),LL(0x23cdf2f9,0x0353dd40),LL(0x5e2acffb,0x2e871e61),LL(0x07f5e7c3,0x5b299ee3),L_(0x000001c5),
+ LL(0x66643187,0x3ec2ad9c),LL(0x115859c9,0x1f8e247e),LL(0x17b4d84b,0x2585ef39),LL(0x657d1198,0xa3f20465),LL(0x3619c497,0x6901431a),LL(0xe9a26e53,0xa5276fd0),LL(0x496e3f3c,0x1f276a6e),LL(0x348de17d,0xf8c3af85),L_(0x000001ca), LL(0x2d6d1037,0xb1e10393),LL(0x7b5ce8d7,0x6deb4f48),LL(0xc7dc292e,0xc43c502b),LL(0x6b03f2ee,0xb1a1182c),LL(0x39273259,0x7622b369),LL(0x4498e583,0xfe7d43c5),LL(0xa50df54f,0x61447fad),LL(0xc4339095,0x3a9a1f2a),L_(0x000000b7),
+ LL(0xcefa0f75,0x4af9a66e),LL(0x310c7a00,0x8db46828),LL(0x9223ef88,0x2cf042cc),LL(0x6fa5a04f,0x7c559200),LL(0x6daaab2b,0x91afc691),LL(0x98a36fb2,0x00b03676),LL(0x188b128b,0x51264914),LL(0xb9803ddb,0x75459c1a),L_(0x00000062), LL(0xbedae6b1,0xe3aaa000),LL(0x7a690ecd,0xceb2c1c6),LL(0x8880b402,0x45703d2c),LL(0xc0613e4c,0x8b8c9eb5),LL(0xc5db208f,0x4c846b8c),LL(0xa9987715,0x6bd91493),LL(0x42b48717,0x9a26dd34),LL(0x3e788715,0xd9b2c58c),L_(0x0000011e),
+ LL(0x2a0a9afe,0x361ab1b5),LL(0xccf7e9f1,0x24eb3b91),LL(0x5a00b663,0x3a047d69),LL(0x70c649d7,0xff025b44),LL(0xbfc42749,0xf2772669),LL(0xfa1fa0b0,0x1d856fe2),LL(0x59b50aeb,0xdd9c5baa),LL(0x07db1f1d,0x63853e29),L_(0x000001cc), LL(0xa8c851af,0x924ac747),LL(0xaa197f48,0x269fd103),LL(0x40db5d37,0x4cdd9698),LL(0x1838b760,0x491094a5),LL(0xfe6931b4,0x6e498775),LL(0xf5d608e3,0x0107968f),LL(0x1ebcbfad,0x4aa5111c),LL(0x9da743a4,0xcba06022),L_(0x000001c8),
+ LL(0x92933f27,0x47445d4b),LL(0x06b03d8a,0x4a0fee6b),LL(0x3277857c,0x1fa95d1d),LL(0x87c700bf,0x48c9ebf0),LL(0x2a50e2b3,0x43aa2c31),LL(0x9a26e1ce,0xfdbdd0e9),LL(0x52ca3b19,0xfcedcc05),LL(0x2999c847,0xbff002c4),L_(0x00000000), LL(0x3f6f21d0,0x64d4906f),LL(0x556e52bc,0x42f805ae),LL(0x90f2f1b6,0xda19f3db),LL(0xd869ad98,0x21709755),LL(0xf5bb8103,0x573f3fb7),LL(0x593f7e34,0x2bac9d40),LL(0x02d84c5f,0xa4e8ad8e),LL(0xea53406e,0x80797c51),L_(0x000001d4),
+ LL(0x1cc4de54,0x02db6ff9),LL(0x9a077100,0x442b39ab),LL(0xa4a99831,0x658c33f0),LL(0xd154641a,0x6b185008),LL(0xbb725f43,0x1c42ee9d),LL(0xc802ceb4,0xd4f04052),LL(0xde1c27e0,0xaa13dd25),LL(0x5e0fdafb,0x59845ec9),L_(0x0000003c), LL(0x0ff8a42e,0xd7b6958f),LL(0xc632359e,0x00693302),LL(0xd897df30,0x3a9976fe),LL(0x07f17ce0,0xb3320f5d),LL(0x0634d694,0x9281633f),LL(0xf481d736,0xa1f17a34),LL(0xc568493c,0x7973f20c),LL(0xc81657ab,0xe331f1c3),L_(0x0000010e),
+ LL(0x4294bb48,0x02479c06),LL(0xf0c74cf8,0x82afef4d),LL(0x3fe27e63,0xc6ed0fe5),LL(0x2473be19,0x88c3bb5a),LL(0xf0f01c24,0x8b895708),LL(0xff99c560,0xda940b97),LL(0x19fe223c,0x3a3e9972),LL(0xfce2e466,0x48aaf92b),L_(0x0000002b), LL(0x2fe2dabd,0x1f0040f3),LL(0xc569b506,0x6e592ad0),LL(0xa59e0b36,0xe1a1ad5f),LL(0x506ba908,0xdd28fbcb),LL(0x35a90e9a,0x5dfd21f8),LL(0xae82baef,0x5c23fd74),LL(0x03b13133,0xe27cfbd6),LL(0xa41bf476,0x7af7e895),L_(0x00000028),
+ LL(0x7b4c0b5b,0xdf92a189),LL(0x7fe35612,0x9f97d902),LL(0xa5105c7f,0xba021326),LL(0x9c521853,0xd2cadb21),LL(0x9b3ed45d,0xb3ab9d25),LL(0xddadc1eb,0x7b4a857f),LL(0xaddab060,0xbbc92a34),LL(0x7dff916f,0xee7e6c52),L_(0x00000121), LL(0xc6f5958e,0xa3ba1dab),LL(0x7b0e564a,0x27f6c008),LL(0xb9c963dd,0x3c030970),LL(0x76828eca,0x3cd7a457),LL(0x0834d3c2,0x417b833d),LL(0xf44c50d5,0xf0d8be25),LL(0x153d4a6b,0xa49590ea),LL(0x47e9c71d,0xf3a30dc2),L_(0x00000143),
+},
+/* digit=70 base_pwr=2^350 */
+{
+ LL(0x5891669d,0x995d0979),LL(0xe0c6b8f7,0xbaad255c),LL(0xcdfa7a67,0x2a84102f),LL(0x2ed9a546,0x5fff322b),LL(0x238b4cca,0x316895f0),LL(0x27a1fc8f,0x4369e1fc),LL(0x399300db,0x708ed717),LL(0x5f16f718,0x931503fe),L_(0x000000a4), LL(0x1ff0c6b2,0xa040da9e),LL(0xf9967269,0x8694422a),LL(0x5871908b,0x8350fa73),LL(0x61c801c8,0x80cd1b5d),LL(0x26cc63f6,0xaf0b4158),LL(0x3474f5f7,0x1e938b36),LL(0x7800e540,0x2f20f7f2),LL(0x56230526,0xd27bb44c),L_(0x000001e6),
+ LL(0x7e54e734,0x474f3cfa),LL(0x7075c330,0xb3ee576a),LL(0xb446bdd4,0x1b7efe90),LL(0xa143371a,0x826a3c98),LL(0x45fcf113,0xa412cdba),LL(0x4b5601ca,0x614348a4),LL(0x06ebe3f7,0x9f111b62),LL(0xd750e443,0x1f6bb4a9),L_(0x00000045), LL(0x5f2d48b9,0x63c0d59b),LL(0xcb29ae28,0xe216b29b),LL(0x3a9a3c78,0x2465c5b5),LL(0x9567856c,0x36d155fd),LL(0xdfbfe047,0xa1ce6b07),LL(0xc3a4fa43,0xf19b8361),LL(0x0e9f03c0,0xb21f548d),LL(0x9de803f9,0x85460ccb),L_(0x000000f8),
+ LL(0x1358b22f,0x28dc3d9e),LL(0xb1947d50,0x707f8201),LL(0xa08b9636,0x1277e4a9),LL(0x253ea9d3,0x38720146),LL(0x7e71d50f,0x62240fd9),LL(0x79e96c95,0x99a338fd),LL(0x14656a4b,0x3386ac0d),LL(0xaed2f11c,0x56e7d58c),L_(0x0000008f), LL(0xa0e5c79e,0xd77da8a6),LL(0xb38b4a7f,0xdb95d39e),LL(0xb6a3eb09,0xc15d78b6),LL(0x97f12510,0xc3aba47d),LL(0x56c5ceaa,0x1799be9b),LL(0x71c67e7c,0x8203dc96),LL(0xc27e5165,0xaf4cd822),LL(0x0bd2ed9a,0xb4f47f2a),L_(0x000000a9),
+ LL(0xbed671f0,0xd26b287c),LL(0x978130d6,0xd433a71c),LL(0x7aadd881,0xb4ad7bb1),LL(0x52e4f45f,0xb1940d6b),LL(0x722e2bd7,0x72d44569),LL(0xf91dc84e,0x6d3fde70),LL(0xd4254643,0xbd1bc41e),LL(0xb847e41a,0x544a7be2),L_(0x0000010f), LL(0x325818a6,0xe2e82545),LL(0x3d8e5d2b,0x1c9863cf),LL(0x5f30317d,0x98fb8ec2),LL(0x81f15ce0,0x8947db85),LL(0xf3e6c315,0x055d8793),LL(0x43a7feb5,0x8417f508),LL(0xac153d3d,0x248bbc38),LL(0x664329e7,0xfcfbcb03),L_(0x0000012f),
+ LL(0x8dd55839,0x0ffb3aeb),LL(0xf0f73b2b,0xb5b42e5a),LL(0xfb4aa83f,0x6fe3f768),LL(0x166957fb,0x1777755a),LL(0x9be2e29b,0xb21920be),LL(0xd39b15af,0x9d78ee52),LL(0x5cfe70fd,0x4ed3196b),LL(0x55c6cafd,0x34efaf79),L_(0x00000009), LL(0x60602ec9,0x9f0e1288),LL(0xc5b10817,0xef0c0487),LL(0x2d0a8114,0xd48fc96d),LL(0x7cfa2d81,0x641e3931),LL(0x6424b3ef,0xe6f897a1),LL(0x3828d18c,0xf36345b8),LL(0x162c7445,0xa9afd810),LL(0x86dd67b2,0x34f52c33),L_(0x0000011e),
+ LL(0x71f0b29b,0xbf4033d7),LL(0x282d7d2f,0x4816fc56),LL(0xbba4acf6,0x0d36fbc1),LL(0xed8c95f6,0xc3d935ee),LL(0xf5c04db6,0x0f8e468f),LL(0xf1e487eb,0xe95fc738),LL(0x07ce9d5f,0xd25bbce8),LL(0x3ea06aeb,0xd6e4d92f),L_(0x00000016), LL(0x8ee0b487,0xd1ebfa2e),LL(0x8c6285b5,0xff9b06cd),LL(0x7f8da651,0x19efacac),LL(0xfb702fe7,0xf38839db),LL(0xfd2c9b61,0xb8c0cb9c),LL(0x674adc03,0xd42ebdf8),LL(0x326b91f3,0x8993821a),LL(0x0fbb4e81,0xbc7b32f8),L_(0x0000012a),
+ LL(0x79b5c2f2,0x2fd676b6),LL(0x892e4204,0x41e60d2e),LL(0xdf88f03d,0x05344e65),LL(0x322deae7,0xabc0c748),LL(0xf3bee9da,0x7dbffa8f),LL(0xe2cbe049,0xf2922597),LL(0xb0e73ee1,0xa1ab5a4f),LL(0xd18b70e5,0xf7b0232d),L_(0x00000143), LL(0xbad81855,0x7a93eb9f),LL(0x998f9412,0x6520852d),LL(0x9fffa5de,0xa83ca014),LL(0x9492e738,0x29961bc9),LL(0x38356eab,0xbaa587e6),LL(0x9aad6aa8,0x5bde3fd3),LL(0x15f7c437,0xc663a8aa),LL(0x2b85ba68,0x922641a9),L_(0x00000017),
+ LL(0x872c802b,0x90b91e88),LL(0x9329a6f3,0x5e0fd985),LL(0x332091e8,0xc7233994),LL(0x069d0a1f,0x7172741e),LL(0x953488c0,0x1870fafc),LL(0x3b040fb9,0xbb2fd807),LL(0x9e841e1b,0x16872728),LL(0x48f58216,0xa72dc0f5),L_(0x000001bf), LL(0x4695d527,0x4ec2f404),LL(0xc898f3ae,0x893dfe9f),LL(0xd6d16346,0xcfc2a2d6),LL(0xdcfcc356,0x9780e14a),LL(0x52a0f58f,0xe40c34a9),LL(0x1f74017f,0x9637bf1f),LL(0xe85cc7e4,0x7db8273a),LL(0xf7240054,0xd4e119d7),L_(0x000000af),
+ LL(0xf3b66cc1,0x8bec2bfe),LL(0xe147d2d0,0x0f381def),LL(0x63d396f3,0xd719925a),LL(0xa70c4ee8,0x48335ffe),LL(0x70cbdf17,0xba86e989),LL(0x70acf1a0,0xa8e07900),LL(0x3fdcbfe3,0xf724a710),LL(0xd0dd93f1,0xcce8d0db),L_(0x000000dc), LL(0x2a8a4b44,0x312db409),LL(0xe842388e,0x51c17662),LL(0x5cfc4c86,0x2819cf9f),LL(0x3d2f2e78,0xcb5f9278),LL(0xc84b5c07,0x6807319b),LL(0x91966c94,0xd459389d),LL(0xf68df64d,0x22ed9565),LL(0x30d2c264,0x2d12cd4a),L_(0x0000015c),
+ LL(0x5d109ca1,0xa8198a4a),LL(0x7fd3cc79,0xcf8b16bd),LL(0x973e67ac,0x27c827e8),LL(0xc9207496,0x6d1709a1),LL(0x9157f587,0xc23a1cd6),LL(0xbedd9d1c,0x8b1088ef),LL(0xb005d24b,0xc08bed38),LL(0x6477a806,0x0681e2ab),L_(0x000001da), LL(0x34165bef,0x2de2bdb8),LL(0xe996e18b,0xf9e30d5c),LL(0x2c137e56,0x5c521393),LL(0x6041c771,0x8cdc666b),LL(0x4ee56b76,0x2695a1d6),LL(0x518a5638,0x41e2f039),LL(0xdb59944d,0xaf0a4010),LL(0x5b0e9f3f,0x829ed1fe),L_(0x0000001f),
+ LL(0xe83fbb80,0x3b382180),LL(0x93922bbc,0x1503eb8a),LL(0xd83a3aec,0x4f056b98),LL(0x0f661abc,0x1dc0c0de),LL(0x20cd5ab5,0x25a3a29e),LL(0x9409a1df,0x2ec3d724),LL(0x2311b333,0x9cff8f0d),LL(0xd299c4b1,0x30ec4ca0),L_(0x00000084), LL(0x05faf0db,0x674d075d),LL(0x79f5e3c1,0x3e4d547c),LL(0xaceff143,0xa985c66e),LL(0xceb1d3f0,0xc8735e90),LL(0x46311b8a,0xecdbba45),LL(0xd47b3dd0,0x8237affa),LL(0xc21e6384,0x6b4f82bd),LL(0x851d53b8,0xff59ca4e),L_(0x0000000e),
+ LL(0xfe08a2e5,0x29a5355a),LL(0xa2f29baf,0x3e11c687),LL(0x653058a2,0xab5abb63),LL(0x533110b2,0xead1d1b9),LL(0x254324e4,0x65d1b7b6),LL(0x9ad5a861,0xd1007405),LL(0x0712ab62,0x6f88f2a9),LL(0x78e9d501,0xefd62c6b),L_(0x000000fe), LL(0xe0d173ba,0x62d2d42c),LL(0x8d15289e,0x5d68b919),LL(0x4baf7b53,0x4a9af773),LL(0xbfd8566e,0x2c278158),LL(0x0f0f5b40,0xa603f631),LL(0x366d639e,0xed79331a),LL(0x457655be,0x5b5f4bc7),LL(0x744b4617,0x6ced0122),L_(0x0000008f),
+ LL(0x94abf4c2,0x0a6157b9),LL(0x62225ddd,0x63f4338a),LL(0x3ff075f1,0x19a505d3),LL(0xa170cf14,0xdfa6bdb1),LL(0x35bb45bd,0x3014f03b),LL(0x01eadcfb,0xdf884f38),LL(0xed9ce5a3,0xeb67d796),LL(0xbe4fe92b,0x01a5f419),L_(0x00000011), LL(0x1ff93f99,0x7ddc4629),LL(0x8bd2744c,0x40075673),LL(0xa1d1f6a9,0x6ac9b5bb),LL(0xbff10759,0x7709ddbb),LL(0xd617233f,0x04b71ff3),LL(0x91a5fcd2,0x45458de2),LL(0x699b54de,0x5147375c),LL(0x4e0307cc,0x2fe5917c),L_(0x000001bc),
+ LL(0xfc7b0e16,0x4252a836),LL(0xfbc6e97a,0xbffdbb20),LL(0xee422c57,0x5769cb47),LL(0x501f912b,0x3924d571),LL(0xae0c25a9,0x239c3442),LL(0x7ed84b21,0xd601103f),LL(0x74478136,0xebe1703d),LL(0xc5087e65,0x67b021e4),L_(0x00000156), LL(0xf2a22ea9,0x8ce094d8),LL(0xaa167fe1,0x70c73af6),LL(0x79b93fdc,0x0e41e095),LL(0x3eab3290,0x4d79fd87),LL(0xb7162ca3,0x66141590),LL(0x583d1391,0xe0bd38e8),LL(0xa393b806,0x169f55ab),LL(0x4bdc04a4,0xd1df6260),L_(0x00000012),
+ LL(0x7e5ec530,0x6ef19cc6),LL(0x8fb90054,0x349f0b5e),LL(0x7a588763,0xd381418c),LL(0xe35ce1af,0xec0fd49b),LL(0xecb4e203,0x7786513b),LL(0xa276ad19,0xfe701187),LL(0x99f4ee10,0x47d026fa),LL(0x58423dc0,0xa22bbaf1),L_(0x00000065), LL(0x5096d030,0x9aa1efcf),LL(0x5af392c9,0x8ba7989e),LL(0x7c5174d3,0xd1616f2e),LL(0xd20d0632,0xa5636d7c),LL(0xd761cf0d,0xce718261),LL(0x701e7d69,0x08d4d0bc),LL(0x66e92aa8,0x819aee8a),LL(0x0d6fcd90,0xc96d5138),L_(0x0000018d),
+ LL(0xb706d0d4,0x81b20efd),LL(0x117c40b0,0xec008c40),LL(0x0a6d9c2a,0x693270e3),LL(0x6114d3e0,0x4266a5ea),LL(0x44a6af67,0x81ebf621),LL(0xee3917e3,0x7fca3d45),LL(0xc35ff5d6,0xa3526048),LL(0x0f6e79db,0x7e7bfed4),L_(0x0000001a), LL(0xc6923808,0x0c06eb8d),LL(0x3343c5a2,0x3418cfe3),LL(0x3e67d0a5,0x15eb001a),LL(0x7e48959e,0x0ead5e7c),LL(0x0962e6ac,0x32e4162f),LL(0x3e28513c,0xfb8117bb),LL(0x317568fa,0x3a2e3034),LL(0x0c912ceb,0x55938174),L_(0x00000102),
+},
+/* digit=71 base_pwr=2^355 */
+{
+ LL(0x4b2fef73,0xfec70f6d),LL(0x92ef06ac,0xc38aac0c),LL(0x790f3344,0x53c30edf),LL(0x1b40fed7,0xfc800650),LL(0xf6da803d,0xfdf722f2),LL(0x284a42e2,0x5cecc340),LL(0xa0f15400,0xb36ac652),LL(0xef82f0df,0xd1506b21),L_(0x000001be), LL(0x59060616,0x84d76b78),LL(0xa1c3d7b8,0xc6050edc),LL(0x307e9a89,0x1519baa6),LL(0x8c7e0ccc,0x3495eff8),LL(0x22e91666,0xea17475b),LL(0x69639f1c,0x8c53c39e),LL(0x1f0e827f,0xede8121b),LL(0xeb066355,0x91249281),L_(0x0000015b),
+ LL(0x5a372292,0x3accccf3),LL(0x16751720,0xa2ac7465),LL(0x1bf938ea,0x83a983dd),LL(0xb73d73d6,0x598a6f1d),LL(0x630b4f7f,0x6235f9ed),LL(0xdb784cb5,0x52bdf332),LL(0xb330540f,0x221e5e83),LL(0xc25843b0,0x09499b4e),L_(0x0000004a), LL(0xb0a1b02a,0x010fb3ca),LL(0x8b6e52dc,0x60a24896),LL(0x22c046dc,0xae1e187a),LL(0x482695be,0x006acf49),LL(0x35934bd3,0xb960f105),LL(0x1e1d0143,0x4cfddf01),LL(0x5de371d8,0x56c439e8),LL(0x64828414,0x582ff3b5),L_(0x00000185),
+ LL(0x4315ba36,0x3578ec4a),LL(0x83ac7330,0x74417a7c),LL(0xb971e045,0xbee09246),LL(0xc391f3f4,0xb2cfe806),LL(0xf8fb9526,0xe574f401),LL(0x2d57d573,0x9ef64156),LL(0xf2047705,0x2e13ebeb),LL(0xe2e05adf,0x97b783be),L_(0x00000025), LL(0x81cc47cb,0xac801f25),LL(0xbb184270,0x1d0026d9),LL(0x772cb73c,0xc5ae7636),LL(0xf37dccd7,0x5106f975),LL(0x276aad31,0x2b41e6c0),LL(0x0c355836,0x7d420351),LL(0x169e0a27,0x25cdd7da),LL(0xe67ef6ec,0xdd1ddbf0),L_(0x000000fe),
+ LL(0xfbf17fb3,0xbce94ac6),LL(0x89803b61,0xe8afe442),LL(0x2e798f31,0x9a42f37b),LL(0x9475e43d,0x77aef7a7),LL(0xa8f685f3,0x203a6947),LL(0x969c3b8c,0xdf0dc1b4),LL(0x9c542cdb,0xc76bc8fb),LL(0xff501682,0x2a768660),L_(0x00000097), LL(0x5f3009bb,0xc8f9daec),LL(0xc4a46652,0x89b1c325),LL(0xb09499ac,0x721c0cae),LL(0x5e63ccd5,0xda46e344),LL(0xaca0b998,0x32db691c),LL(0x793a1fc7,0x049e845a),LL(0xd927f614,0x7aea310a),LL(0x80024bf0,0x5359be8b),L_(0x00000124),
+ LL(0x7a3137a8,0x57afd605),LL(0xb3d701e7,0x608eeeaf),LL(0xa1e2923b,0x3a52d1fe),LL(0xb5ba2517,0xf6c570be),LL(0x6f830092,0xa2b946db),LL(0x63e9fd66,0x2b96de58),LL(0xd1292d2e,0x89c80a56),LL(0xf418bcf0,0x02901646),L_(0x00000025), LL(0xbb16a820,0x9f28725f),LL(0xb36ad666,0x73de9bb2),LL(0x25e09cb1,0xf102152a),LL(0x3474fc24,0xb0389a9f),LL(0x9e0b3083,0x245ecf47),LL(0xefc86ff8,0xedc1e824),LL(0xd024fd72,0x022e7528),LL(0x0e37477f,0xa7fdb14f),L_(0x00000191),
+ LL(0x6cc9e802,0x130db159),LL(0x31d0f49f,0xbd9c79a2),LL(0xf1d499d6,0x7ea9b7cf),LL(0x367757ac,0x05a4d545),LL(0x0a42a453,0x1f2c8548),LL(0xd461a5b5,0xb8ed29ef),LL(0xe691c9e6,0xa549541f),LL(0x6490ea1c,0x09c0153e),L_(0x0000018f), LL(0x3f9a0edf,0x7f525f59),LL(0xc140a1f6,0xa98aaedb),LL(0xf5bef166,0x750be5c2),LL(0xd457a559,0x8cba58b2),LL(0xc5d96cfb,0x514d93d0),LL(0x70bfa2f9,0xb86d7234),LL(0xf6b79058,0xa8a78584),LL(0x18d58f11,0x2b2d0ad4),L_(0x000001e3),
+ LL(0x55bea4be,0x147202dd),LL(0x3c8a33ae,0xd39c4b9d),LL(0x1d455649,0x3f56141d),LL(0xc0ac51ab,0xa5a57669),LL(0xfc529732,0x1ee307ea),LL(0x1861bed9,0x5f1e4bec),LL(0xc7a796b8,0x5b0d925f),LL(0x06f456f4,0x2257c76d),L_(0x00000117), LL(0xfe075b8e,0x4360118e),LL(0x218cb0cb,0xaa1c1dca),LL(0xf6db0e7a,0x2be1c968),LL(0x5a3744ed,0x46bb2acc),LL(0xaf262fce,0x7e16d340),LL(0xaec37ad7,0xe6df41bd),LL(0x1060715f,0xee38cd22),LL(0x87b94898,0x34109b20),L_(0x000000a2),
+ LL(0xa0d42ca1,0xb416f6d1),LL(0xc2c062af,0x3dacb0a7),LL(0x1630676c,0xd74ee6b3),LL(0x95fc297a,0x8f736e49),LL(0x48a7a2d1,0xd64edc25),LL(0x6b5d5f53,0x83303159),LL(0x0e945b2c,0xdfaa52c4),LL(0xb0587c06,0x462a8f05),L_(0x0000017c), LL(0x4f0d870e,0x2fcd636b),LL(0x0835ddc0,0x86482b2b),LL(0xd2333470,0xc7f1c7b2),LL(0xb32bf92b,0xd5f30c92),LL(0x49153950,0x9ce136c0),LL(0x29288cec,0x4ac8254d),LL(0x34eb3849,0x0b3117ac),LL(0x14ba2a1b,0x3a85376a),L_(0x00000047),
+ LL(0x9b2fca5a,0xb3ec3510),LL(0xc014692a,0x988a8cb2),LL(0x70309a41,0xb83a1155),LL(0x92367194,0x22c65f09),LL(0x558d49bd,0x17ac8e14),LL(0xd539b194,0x281a7ecc),LL(0xa19213fa,0xc69fe80b),LL(0x1ef427d6,0x744a4f4d),L_(0x000001db), LL(0x64c7d0d7,0xf07169a2),LL(0x4ff0070e,0xe17c5e0d),LL(0x42362609,0xd97efa2b),LL(0xab4374f3,0x59d17f1f),LL(0xc3027acb,0x8cb9e348),LL(0xc305c872,0x320eb648),LL(0x861bfbe3,0xf68b129b),LL(0x2a98fbd9,0xc35aa741),L_(0x0000004d),
+ LL(0x9b675376,0xba2a6162),LL(0xfef26d3a,0xaf22bedc),LL(0x4bac42f2,0x32bd0514),LL(0xaf54da8b,0x474d59e6),LL(0x846ca3be,0xac190f17),LL(0x7e7c79bf,0xaea0f3e1),LL(0x13543ecb,0x0ff996ba),LL(0xabe74acd,0xe27a5f5a),L_(0x000000bd), LL(0xfeccff02,0xa8ccc73f),LL(0x1e746179,0x62af882b),LL(0xb19b717d,0x4e0895be),LL(0xb255045a,0x8f194a8b),LL(0x0b37366b,0x089f1cd5),LL(0x7b3da3e1,0x68b1f2a5),LL(0x91e4f674,0x9c4602f6),LL(0x698976ca,0x3ed98ad9),L_(0x000001e5),
+ LL(0x2100e990,0xfe476990),LL(0x532b6850,0x345630b7),LL(0x7ff00f29,0xecbc85e6),LL(0x9c3d2e4c,0x5f322ba8),LL(0x6869142c,0x9e246c23),LL(0xf5d1ef76,0x0affd2a0),LL(0x2e6d871e,0xb40893c1),LL(0x66c72704,0x1665fed8),L_(0x000001d9), LL(0x91fa7d18,0x06507414),LL(0x9d9489fd,0xa1379411),LL(0x7d5c53f0,0x7e6d3de2),LL(0x097595be,0xc486fb28),LL(0x85e5a09c,0xa9fd8f9e),LL(0x2996fa66,0xd71e16d0),LL(0x040664e3,0x7c75e965),LL(0x14b60428,0x9d686380),L_(0x00000032),
+ LL(0x23ecdd94,0x86f79bf5),LL(0xbf36d744,0xbf45f97e),LL(0x0fe48147,0x6235b3ae),LL(0xd40868d4,0xa9b13d93),LL(0x45fa9173,0x34e9264c),LL(0xb5705f4c,0xd0d58c79),LL(0xfd4b166f,0xaf4ff870),LL(0x7aaca2ed,0xb68a488f),L_(0x00000155), LL(0x9951fb26,0xf5f3e0b1),LL(0x747dd972,0xf6fc0c26),LL(0x92d84bc8,0x088102b5),LL(0x201255f7,0x84970893),LL(0x7f6288c9,0x6a679170),LL(0x9309b54e,0xd5327276),LL(0x389f4da5,0xc48b5de6),LL(0x8fc1eb23,0xac794b85),L_(0x0000011b),
+ LL(0xd3fa1c16,0xb408df01),LL(0x66056a5d,0x5f945157),LL(0xc30a058e,0xf0071848),LL(0xb615e360,0xe6a8d838),LL(0x132d49ae,0x1bb7f3ca),LL(0x092ee873,0x398ab7d7),LL(0xbf83bd98,0xba362639),LL(0x73208c1b,0x49dd5ba3),L_(0x000000cd), LL(0x081c78e2,0x0d07ce4b),LL(0x724cd057,0xf7baff54),LL(0x31245cf8,0xff518822),LL(0xff5f1211,0xea1813a7),LL(0x89f90332,0xfa74413f),LL(0x9e68455b,0x9e49a7a6),LL(0x182fad31,0x30e8a2ef),LL(0x233ce0d5,0xbd55ab52),L_(0x00000199),
+ LL(0xd2d5a87a,0x28e2d8df),LL(0x708c9183,0x1dbe8e5a),LL(0x9b9fb00f,0xa3695cb8),LL(0xaeafe9c7,0x9205b4ca),LL(0xd6ec0b74,0x756f204b),LL(0xa9e0254c,0xd51d1a73),LL(0x152441cf,0x0ca91564),LL(0x370d2b8b,0xe3cdd9e9),L_(0x000000de), LL(0x4dec1468,0x9dab1375),LL(0x5322d78e,0x78b8ab5d),LL(0x0adbfc55,0xa2b97f9c),LL(0xd5d0ce27,0x9cd573f2),LL(0xe94e39b4,0x06ee23d2),LL(0x213bd15a,0x708d61ea),LL(0x561b9d34,0x6271f59e),LL(0x41fb576c,0x9ae94507),L_(0x00000166),
+ LL(0x312474f6,0x6669c984),LL(0x46ae7251,0x8c23b4d3),LL(0x3738a807,0xad75f8b4),LL(0x3ef8e3cc,0xc8e8bbf5),LL(0x029e586a,0xa7111c4e),LL(0xa4d1beb9,0x238f36b4),LL(0xc4da1680,0xbe34bad6),LL(0x9409b124,0x6ab824c2),L_(0x00000002), LL(0x3b1b0723,0x0666df3f),LL(0xa0015f27,0xd7f90fcc),LL(0x3e7eb3a2,0xcd91c4ca),LL(0xa8bd0fd8,0x56907857),LL(0xc0b60059,0x3559db95),LL(0xc6ed4fe7,0x0c8beff5),LL(0x2ba51007,0x5bc2116c),LL(0x409f6b4e,0xa6198a28),L_(0x000000d8),
+ LL(0x6c54f37b,0x231a6637),LL(0xb888102e,0xaecdfa06),LL(0x430b0efa,0xd888793c),LL(0xb123b1e3,0x8beed2db),LL(0x8887df4f,0x3ea5e72a),LL(0x2425e985,0xccc7d4aa),LL(0xd98e93f3,0xe9181719),LL(0x07cba97f,0x8ea6eef3),L_(0x000000b0), LL(0xf51c3444,0x5719b171),LL(0x5d9f40be,0xe16ecd5e),LL(0xfea96313,0xfe1e359f),LL(0xd9f1461e,0xde9904f3),LL(0x38f6d943,0x881bb7a0),LL(0x2c5787d5,0xa74eed55),LL(0x67fc2cd9,0x7ccb483a),LL(0x2c643f37,0x7070b576),L_(0x000001db),
+},
+/* digit=72 base_pwr=2^360 */
+{
+ LL(0xb53942b1,0xca188556),LL(0xbd7c7672,0x20ced736),LL(0xa4667058,0xb83d6897),LL(0xe3f39ba4,0x174ecbf7),LL(0x34188faf,0x203dc58b),LL(0xdb5dba0b,0x5206b453),LL(0xf54df32d,0x52fcf51e),LL(0x08d08e3c,0x2f551f34),L_(0x00000173), LL(0x92603b2e,0x6b937ade),LL(0x7f7f5dfd,0x632c9b6a),LL(0x3151876b,0x3ee4a789),LL(0x7a59040d,0x41b009fd),LL(0xdfc2d274,0x68b427fe),LL(0x1c0ceded,0x07d57f92),LL(0x220fc8f2,0x83c79a42),LL(0x7b0f6753,0x410a2e83),L_(0x0000016f),
+ LL(0x2ff9c0f0,0x01fb8b79),LL(0x82addc43,0xfdb0062d),LL(0xb9cdf1d9,0xb1cf25ad),LL(0xb5a42255,0xaaea42eb),LL(0x1990669d,0x1dffd105),LL(0x88f20764,0x613001d6),LL(0xda7769bd,0xa275aa11),LL(0xe04ea507,0xea612e43),L_(0x00000073), LL(0x24386fbb,0x21f18b4b),LL(0x268a5e08,0xa7554f72),LL(0xad126436,0x714fe1c3),LL(0x5b5ba02f,0xb7c7cde4),LL(0xf2da3519,0xfc576f09),LL(0x4fb328e0,0x185faef3),LL(0xa0386e0f,0x2adc73d1),LL(0xc97a6bb3,0xda21be9a),L_(0x00000133),
+ LL(0xd542b802,0x6a23d540),LL(0x500040b2,0xf87554cc),LL(0xe6a09fa7,0x548aea96),LL(0x0cf27fbb,0xfa1d8c06),LL(0x1a618765,0x1943cfee),LL(0xe6a8c7ea,0x20bf61bc),LL(0x99730b0b,0x744528dd),LL(0x42eac170,0xd049742c),L_(0x00000023), LL(0x6da345a9,0x1e2bba63),LL(0xe601cd80,0xcbeefa62),LL(0xc9e240a6,0x8106469f),LL(0xda8103af,0xc7109e54),LL(0xdcc44907,0xdb9a3ec3),LL(0xe44b6df8,0xe34b7788),LL(0x0e67c93e,0x4a58495d),LL(0x63e8347b,0x23b5096e),L_(0x00000172),
+ LL(0x5b970b5a,0xbf417e03),LL(0xb60364c1,0xdda37ca1),LL(0xea847f52,0x28527f5c),LL(0x98d517fb,0xa1e399f7),LL(0xff102f07,0xc452c79f),LL(0x87dfab3c,0xc5aa688a),LL(0x490b0295,0x0dbc6056),LL(0x3dd17acd,0xb4f6972c),L_(0x000001ac), LL(0x90426354,0x23fa3555),LL(0x3a903ffa,0x262814e3),LL(0xc46f6e35,0x1cec4214),LL(0x7267bc6b,0xca2e1dc8),LL(0x20b7474b,0xeb500457),LL(0xf394811d,0x4304c697),LL(0xa5001f3d,0x0f7a5e2b),LL(0x4c9ea7fd,0xead3d012),L_(0x0000010d),
+ LL(0xd19de00c,0xb7e47c23),LL(0xd475bc3c,0xff4599af),LL(0x1acc6490,0x39b1950f),LL(0xee09f5dc,0xd14540f1),LL(0xe51c9564,0xf1b75050),LL(0xbebd088f,0x17895647),LL(0x240dba4c,0x097400cf),LL(0x559b95e8,0x5d4b8420),L_(0x0000005b), LL(0xd06fbfb7,0x85986a76),LL(0xc2ffb653,0xa478ed7f),LL(0x18e264c5,0x4841d184),LL(0x17a5a278,0x21d9e8a0),LL(0x297fe2fe,0x1bf52154),LL(0x072d6d91,0x88327dad),LL(0xae77c8ea,0x02d1fcbe),LL(0x13786b6a,0x25554500),L_(0x00000068),
+ LL(0x9f48a0af,0x17de731f),LL(0x7753cff6,0x972b7a35),LL(0x73655403,0x28d73a10),LL(0x0c70484d,0x46d46c14),LL(0x516a9dc8,0x455b7ef1),LL(0x0b552594,0xb8161489),LL(0xf418ade1,0x64a91645),LL(0x76a465f2,0x7693e9a1),L_(0x000000d3), LL(0xdcbca2f5,0xe5e5c3bf),LL(0xdc135bc4,0xca946121),LL(0x3d39b5c7,0x55877498),LL(0x318be468,0x9fb5d801),LL(0xe5cb6287,0x3afd92b1),LL(0xcd7f8034,0x34ed24ae),LL(0xa3835c84,0x6aa7d954),LL(0xd325764c,0x41780668),L_(0x00000002),
+ LL(0xf2280c1c,0x34c0928c),LL(0x37933b17,0x74a56f2c),LL(0x6bae2a29,0xb1d26ac8),LL(0x6bd1e8bd,0x84c336cb),LL(0xcdaa1b9c,0xaca41014),LL(0x7838c44f,0xe2ce24b8),LL(0x525239ca,0x515f204f),LL(0x8bcb0507,0xdbd0e0a5),L_(0x00000193), LL(0xc3926ced,0x631411bd),LL(0x3e15aa53,0x8672c87f),LL(0xade47bf6,0x93da50d5),LL(0x148028e4,0x0048f8cd),LL(0x03c75612,0xb5ecfaeb),LL(0x7b7867aa,0xafcde134),LL(0xa0208953,0xe2411e3b),LL(0x24be9b23,0x848d40b4),L_(0x0000002e),
+ LL(0x8d4ad28a,0x16583ec0),LL(0x7b7ba7d9,0x2bbb4768),LL(0x2b3f0b4e,0xe0e4b3fb),LL(0x9172caac,0xe6fb63a6),LL(0x22aab4b0,0xa00520c8),LL(0x7930e37a,0x4dcbf41f),LL(0x6bfa91da,0xf521a694),LL(0xb88bd604,0xa707c1f0),L_(0x0000000f), LL(0x0d23952f,0xd8520b88),LL(0x22333018,0xa6bc2bb8),LL(0xaa6a00bc,0x011553af),LL(0x5def3469,0x0ed5fc0a),LL(0xbcfec7c2,0xdee0e8c5),LL(0x2f464224,0x8adb476e),LL(0xd844542e,0xd3c1bdb2),LL(0xa709924f,0xac98d161),L_(0x0000012f),
+ LL(0x715ddc65,0x5054b047),LL(0xa4a3faff,0xd966b478),LL(0x3d33573c,0x1081c0ed),LL(0x928c644f,0x0d2ce409),LL(0xb6d01835,0x9e6a2193),LL(0x52176b02,0xa876fcb1),LL(0xa48ba61b,0x717040ec),LL(0xa24784a2,0x063597d5),L_(0x0000008d), LL(0x2c7389fc,0x24d496ff),LL(0xb9c0170d,0xf08c120b),LL(0xee06f00f,0x24a5f375),LL(0x9e3d247d,0x21f556fe),LL(0x23ca02e0,0x9baf2fa5),LL(0xc33aa42b,0x87dfcff1),LL(0x165eef36,0xf9dd5e4c),LL(0x54afa097,0xfe4014f0),L_(0x0000009f),
+ LL(0x52348ca8,0x690b2052),LL(0x836e06e2,0x3509fc01),LL(0x7b24d732,0xc3a11a6f),LL(0xf970953d,0xb1e661c4),LL(0x19774ec5,0x1a995696),LL(0xa05e5145,0x777347df),LL(0x1c3c2550,0x77882ae3),LL(0x5a7928a8,0x77fbd07d),L_(0x00000185), LL(0x09fd7d9d,0x41e2d40c),LL(0x16368545,0x29dc25b0),LL(0xfa97fb70,0xb7b7f0ff),LL(0xdec5a377,0x2c841e96),LL(0x205a5df4,0x01390c3a),LL(0xe68d053a,0xa1116c1b),LL(0x83274721,0x62015852),LL(0xe92e4364,0x6a3178e8),L_(0x00000016),
+ LL(0x84a707a5,0xf2f16fe9),LL(0x75049d40,0x2503f2a9),LL(0x67afd1db,0xe86bcd13),LL(0x1004d640,0x5322f07a),LL(0xf5a688a9,0xb4accb02),LL(0x5af14887,0xe07764b0),LL(0xd65fb0f3,0x03224e24),LL(0x5db913de,0xb8433f0c),L_(0x00000011), LL(0x1ac50b18,0xf3884513),LL(0xe8ba41a9,0xaded3528),LL(0x8ea44980,0x1a82f302),LL(0x31375544,0x0614f686),LL(0x4f3dc64f,0x8ad34274),LL(0x7f906c7a,0xc479a89a),LL(0xe50987f1,0x17709633),LL(0xaa307609,0x33922a61),L_(0x0000009d),
+ LL(0xbf75fd24,0x7b97be7b),LL(0xd004b0c4,0xd609efba),LL(0x341b0b8f,0x20475d65),LL(0x373000c9,0x00101859),LL(0x5bcb5ae6,0x518d7514),LL(0xfb3c86f2,0xf5d314f2),LL(0x2c8aceec,0x2307be1e),LL(0x778a0fa6,0x5d168daa),L_(0x0000011d), LL(0xd7b35cc7,0xa440b9a3),LL(0xa70ba700,0xa47a36dd),LL(0xef6fc566,0x17be0829),LL(0x8e295843,0x63809dc9),LL(0xa317bc2f,0x1a787c34),LL(0xbce26a9e,0x943ad796),LL(0xc651a487,0xe010f911),LL(0x636a6efc,0xcd31e255),L_(0x00000188),
+ LL(0xe2c5ac41,0xed5ce1f5),LL(0x8d6c9e3b,0x8f008e9a),LL(0x2a13d48e,0xa44f1754),LL(0x32cde8f7,0xaa90e24c),LL(0x8660b8f9,0x3052b86b),LL(0xd73a03c1,0x79244ef9),LL(0xe4f8a628,0xc2475432),LL(0x35d52164,0x9c11d0d4),L_(0x00000059), LL(0x3d8335f4,0xb6ab40a4),LL(0x3d6aa080,0x9ca82551),LL(0x92a4dc90,0x8044f304),LL(0x5989211e,0x4878d275),LL(0xc33afe23,0x50bb5ea4),LL(0x2b031b41,0x889e9545),LL(0x4a4f6a74,0xdcce463e),LL(0x6a9c23ca,0x260ab0c8),L_(0x0000007c),
+ LL(0xe02b88ed,0x2372213b),LL(0x84ab40ec,0xdaad8de9),LL(0xcb476943,0x2dbf8cf6),LL(0x9149cbb6,0x72626b77),LL(0x4935f2cb,0xae5d765c),LL(0x79eb7a36,0x65f4be84),LL(0x44c54fc0,0x2049ba34),LL(0xcbfa4bf0,0x9c904608),L_(0x00000083), LL(0x3dbc5a64,0xa5d29aec),LL(0x3010853b,0xdf573f6e),LL(0xcdc13fa1,0x9737e298),LL(0x24add1ef,0xa7f64bf7),LL(0x2431c698,0xb2b280e2),LL(0xbdff9a1e,0x93c22a36),LL(0xd70876a8,0x0c7227cd),LL(0xaf483376,0x04873b2d),L_(0x0000009e),
+ LL(0x86436bf8,0xecb1f89d),LL(0x21b6a936,0xf18c9695),LL(0x805badb2,0x45242b9a),LL(0x2c7430dc,0x7856a265),LL(0x5aacc16c,0x281a24a8),LL(0xbe56330d,0xd8f8608d),LL(0x50d0b225,0x62852160),LL(0x4403a1c3,0x7038362e),L_(0x00000075), LL(0x2d9d6d70,0x7dc02e97),LL(0x816727a7,0xca536177),LL(0xc5451dd1,0x304d66d8),LL(0xb89ef533,0x360da6a3),LL(0xe6b58c96,0x3f234bec),LL(0xc18619f4,0xb4bfa580),LL(0x891d516d,0x40c1bed3),LL(0x04f1453b,0x7060a227),L_(0x000001e8),
+ LL(0x367407cb,0x30c9a655),LL(0xcf48b04d,0xb68ea01a),LL(0x04344830,0x174d6fa7),LL(0x1ac58a53,0x9044eeb3),LL(0x0524d6f5,0xf87d51a6),LL(0xfb882d4d,0xaa0ba344),LL(0x1ed41d08,0xa85fb93d),LL(0x6086b6ae,0x7fa57f48),L_(0x000001f2), LL(0xb7febd79,0x596f6fa7),LL(0x2aae9562,0x04813ef9),LL(0xabc183c4,0xded30d2a),LL(0x6a011be4,0x20b7ae96),LL(0x88e77be2,0xbc3e6cfc),LL(0x77d5e0ca,0xac06a92b),LL(0xd7f99c6d,0xc76c3023),LL(0xa80a6be4,0x1d55150d),L_(0x0000012d),
+},
+/* digit=73 base_pwr=2^365 */
+{
+ LL(0x300cf42b,0xea0d37f0),LL(0xd1a1ebfa,0xb07ea564),LL(0xbce4cf04,0x4677d784),LL(0x74184f2b,0x14a4f867),LL(0x3b8741db,0x00b95ce9),LL(0x35b5960b,0xfae4a317),LL(0xd2c80a76,0x23107ec3),LL(0x0522c4d1,0x8678a9d7),L_(0x000000cd), LL(0xaec13d90,0x304b58dc),LL(0x88c3d5f2,0x45f5267d),LL(0xf847248f,0x28ef4e85),LL(0xc0f3da26,0x7945a7b9),LL(0xea2c17e3,0x8a2da387),LL(0xe84de988,0x211a8e98),LL(0x8290c88f,0x75574343),LL(0x6b4ce366,0xca4612f5),L_(0x00000040),
+ LL(0x7975b736,0x6c7a73bd),LL(0x1e3ef4b5,0x104fc4ba),LL(0x835871e0,0x4759b57a),LL(0x9b4ed462,0xd3c95d4d),LL(0x648a71ee,0x829d8353),LL(0xece81ad2,0xb2a56bed),LL(0x452c12f2,0xb67ec3e1),LL(0x35ab19b8,0x3f8f88bf),L_(0x000000cd), LL(0x5c7f0b66,0x76062e0d),LL(0x4abff696,0x6641cdd3),LL(0x9b89962a,0x0add12e1),LL(0x9f42be1c,0xa078191a),LL(0x72d9da14,0x7c488cf9),LL(0x607f65fc,0xa7e790e9),LL(0x5cdadd7d,0x83b3584d),LL(0x381ca37f,0x3c6df02d),L_(0x000001d4),
+ LL(0xded49058,0x3a1e6367),LL(0xfd8b4117,0xcdcf0fd6),LL(0x0c717ef3,0xb3300d01),LL(0x07e608fd,0x527d7c8e),LL(0xe69c0a0d,0xd39cd9ec),LL(0x11bdaf48,0xa5576772),LL(0x5d520c7f,0x92f3c61b),LL(0x1fbf8426,0x814bffe3),L_(0x00000055), LL(0xa0e0f49e,0x3dc94502),LL(0x8193bb95,0xb1a23052),LL(0xd7bdda5a,0x19650b25),LL(0x4c67c4a2,0x78abb7ba),LL(0xb9dbe10f,0x3eb157bd),LL(0xb3d0ff94,0x1a32ace6),LL(0x8180c4dc,0x9e9b36a4),LL(0xeb0124b6,0xfee72796),L_(0x000001a7),
+ LL(0x7bd3b0c9,0xedaed08c),LL(0x46195fa3,0xbcb9e4e5),LL(0xc31c13ef,0xb2cc8a6a),LL(0x483f2eae,0x912ca200),LL(0x5ee60fa1,0xff0ff27a),LL(0x9e9c56cf,0xdac70a7b),LL(0x4977503c,0xbda5a3e4),LL(0xa564deab,0xfe3a9fcb),L_(0x0000018e), LL(0x784eeb75,0x7e821113),LL(0x560a5e57,0x4ec38a12),LL(0xae4b9aaf,0x8358d926),LL(0x1cb5c9a3,0x7b69c24b),LL(0x0e546449,0xc0748541),LL(0x660a2d50,0xa4c426fb),LL(0x87263ee5,0xc286e0b9),LL(0xf7b3ba20,0x4bed6c50),L_(0x000000e5),
+ LL(0x1f5a397a,0x9263865c),LL(0x4434e163,0xf3a80e48),LL(0x9ca69373,0x9608a668),LL(0xc4b09404,0xb3964738),LL(0xbe4c6ca8,0xe169bce3),LL(0x7c62a7e9,0x4efa6e4a),LL(0xb46b0f85,0xe2e5aeb2),LL(0xe0111694,0x6babf49a),L_(0x000001f5), LL(0xbb845644,0x2589af29),LL(0x286fb826,0xc48651eb),LL(0x97cf3fde,0x6f9d0884),LL(0x78bdc9d0,0x16ca5665),LL(0x7e3d1e7d,0x5a2f1773),LL(0xc2f14e0d,0x5e7f3258),LL(0x6606eb12,0x77a28311),LL(0x67442ff0,0xc80cdb6d),L_(0x0000010b),
+ LL(0x009d2841,0x6f4c68a5),LL(0xfaab85ab,0x18a863e0),LL(0x8722f321,0x96627616),LL(0xe3cfe440,0x1b986ba1),LL(0xc819b534,0x03e0ab51),LL(0x7155ab76,0x9cf682fc),LL(0xc9e37547,0x4f4f98e5),LL(0x137f31be,0x3cda736a),L_(0x00000140), LL(0x7723495a,0x91d6868c),LL(0x2e86f052,0x70f48703),LL(0x14f3d533,0x6c353990),LL(0x099af7f9,0x0b2a6c71),LL(0x3d4612fb,0x9b98b62b),LL(0x406a6c59,0xe6249353),LL(0x3b1b8dd5,0xc92d7a1b),LL(0x1f751af1,0xf81ef140),L_(0x000000e0),
+ LL(0x3770cf24,0x2c9d1106),LL(0xdc34aa30,0xa7bfe1cd),LL(0x28ee1801,0xd18bd43a),LL(0x6d6e3e49,0x52b35eba),LL(0x25fc7059,0x7bfa8888),LL(0xe767a889,0x487fe05c),LL(0xbcac8ca5,0x09996d23),LL(0x52fe2328,0xe81bfb43),L_(0x0000010d), LL(0x0fdc93f1,0x121f3bab),LL(0xa0be654b,0xd4307448),LL(0x230e8622,0xa9492744),LL(0xcf01fc0b,0xe7b1abae),LL(0xcc98dab2,0x4d9cffdc),LL(0xf6504381,0xe9697cb5),LL(0x506e8f37,0xc3dfae33),LL(0xc253ed02,0x141d1dda),L_(0x0000011d),
+ LL(0xbe8f2ee3,0xd4e2418e),LL(0x60bac026,0xe3153f45),LL(0x08c6a85e,0x8e05a0fb),LL(0xabec7d7d,0x5867d053),LL(0xca6918d3,0x1ebaaa06),LL(0x7d8627f0,0x6ea92220),LL(0xdfe74b9c,0x27dc332f),LL(0x54478deb,0x33ddba7b),L_(0x000000b6), LL(0xda8ae443,0x2feb3b84),LL(0xd254321c,0xbd92cdce),LL(0xae0be12c,0x91edd7e2),LL(0x65ab5fae,0xacef4485),LL(0x607c22ad,0xe3f288c1),LL(0x01e22b70,0xa3baea8d),LL(0xe3598c73,0xc24e3c94),LL(0xf89cd9f6,0x595791d3),L_(0x000001a5),
+ LL(0x9ea2f400,0xa048c822),LL(0xbacfe4cd,0xc1680ce0),LL(0xd2bf80ae,0x4efcb3dd),LL(0x3024028c,0x029e5c0d),LL(0x63d006d1,0x5acb256c),LL(0x1d3229cd,0xee644462),LL(0x6e4f2a9d,0x4aa18f75),LL(0xd4fdba43,0x437e2a93),L_(0x000000b4), LL(0xffc70ce4,0x7de729a4),LL(0xcdd3e499,0xf4a84a14),LL(0x9fba5f0d,0x87d56bc9),LL(0xa92225d1,0x637de402),LL(0xa9f81afe,0x142558b2),LL(0x2061f42e,0xd09b2789),LL(0x1e15d846,0x8753411a),LL(0xf0c0c378,0x83c3fa31),L_(0x0000012c),
+ LL(0x2af88f08,0xda11421c),LL(0x8eaf7d82,0x6c3eef0e),LL(0x9224cdcb,0xd8359bd5),LL(0x34b2e501,0x734d08d8),LL(0xd9f7f27c,0x60136559),LL(0xa91fd047,0x7da1c7f8),LL(0xcb1bc103,0xf3f7e7c7),LL(0x65c241e1,0x7555ce39),L_(0x000000f9), LL(0x324c47c2,0x6b91fc57),LL(0x5484eacb,0x8a825cda),LL(0x888b470b,0xf0a2ebdb),LL(0x81202cfc,0x3ac37a5b),LL(0x05c01038,0xfe8f11c9),LL(0x5bf196e7,0x76123e92),LL(0x19cd94ed,0x353febf7),LL(0x9c972db2,0x65d70280),L_(0x0000019d),
+ LL(0xf016362a,0x217d03c5),LL(0x56db67a5,0xf3d76a7f),LL(0x992b8bdf,0x4fb50dfa),LL(0xf9702a82,0x5593b5d5),LL(0x9088a3ea,0x0ef00d4d),LL(0xbf26b47f,0xeb497149),LL(0x0793417a,0x58262023),LL(0x465f75db,0x4abc908a),L_(0x0000009e), LL(0xfa362b63,0x1667b32f),LL(0x4ef57c25,0x0a4bdcb0),LL(0x6e8c095e,0x696391d7),LL(0xabbc605b,0x1dd44220),LL(0xc3e47f6e,0x38adb47e),LL(0x8f35f645,0xd3c084d2),LL(0xf253b25e,0xfaa3b241),LL(0x0b53ca2e,0x2e3d4cbe),L_(0x00000189),
+ LL(0x3b140c85,0xf26ba24d),LL(0x0d68d639,0xbc6bcbf3),LL(0x76bdcf5c,0xd445a425),LL(0x4ce8f583,0x036223e7),LL(0x12c0333e,0x6b6c4cf4),LL(0x411cd547,0xfa6d4a89),LL(0x6d3fb3c8,0x7e41166b),LL(0x906f6895,0xd5a83001),L_(0x0000006a), LL(0x04968a38,0x33fa874d),LL(0xdb9b9bf4,0x6efa8bd8),LL(0xc1467c44,0x78067572),LL(0x41957d49,0x68a286e7),LL(0x4563827a,0x3562fe94),LL(0xd87962e4,0x5b2ba1f2),LL(0xbce9e3b5,0xeb40dfc9),LL(0xedcbc4f7,0x6ddd5a2c),L_(0x0000004c),
+ LL(0xc41935fa,0x70bab965),LL(0x738ba18f,0x90ebea6a),LL(0x3526ec84,0x544312d2),LL(0x606e765e,0x4f7ce18b),LL(0xe015cac8,0x0b6de72b),LL(0xea01d5b4,0x2ff4bd72),LL(0x0c7eba91,0x90d594c1),LL(0x8a32c97a,0x881a1a5b),L_(0x000001cb), LL(0x2511b170,0x8272c1c5),LL(0x72a5ff2c,0x0ff0a2ad),LL(0x4bb6c7a4,0x640ae3bc),LL(0x87804672,0x00da0040),LL(0x94aaf22e,0x2ebbcebb),LL(0xd8f3e9bf,0x8646dab7),LL(0x40c90d99,0xd08b3434),LL(0x8f9d970b,0xd1f0de73),L_(0x000001e3),
+ LL(0x7fee2d24,0x893123ae),LL(0xc8b47342,0xedaef283),LL(0xde3df2dd,0x303757c2),LL(0xc96f2592,0x089845fe),LL(0xa0d3f290,0x18b0b508),LL(0x4bf7b214,0x93c88975),LL(0x3cd67758,0xed218a4a),LL(0x81a61b63,0xfa78dcc6),L_(0x000001e5), LL(0xb7b5abd8,0x90ce8d10),LL(0x6c24429c,0xe40a36fc),LL(0xc3ad8e81,0x6178bcf5),LL(0x16d9b177,0x488d2cf8),LL(0xc063b1e0,0x57f41dcf),LL(0x1cbca7c3,0x200bb41d),LL(0xec7a80d6,0xd6366c22),LL(0x84ceffb4,0x66439f2f),L_(0x00000092),
+ LL(0x487aacbc,0x869f06cd),LL(0x97f9882a,0xaa57537b),LL(0xe3b1c07d,0x917cf4ff),LL(0xf6d1aa12,0x2683a59f),LL(0x73bca1f9,0x613d785e),LL(0x496708d8,0x66ede999),LL(0xf45fff24,0x4e9727c1),LL(0xf71c4572,0x39995099),L_(0x000000fb), LL(0xf3181f1f,0x60222373),LL(0xf249fc50,0xdb62572f),LL(0x95b4f7eb,0x4efd7ca7),LL(0xb4994b20,0x0762c1c5),LL(0x99292d14,0x4d4c1985),LL(0x140a608e,0x7f0ba7f9),LL(0x489023fc,0x77e472d8),LL(0xac039583,0xca8aeb86),L_(0x00000176),
+ LL(0x3a9026ef,0xa1cd049d),LL(0x859af0b3,0x32b70dbe),LL(0xd9aa6b96,0x83656cba),LL(0xa5229dc4,0x02bc7ba1),LL(0x574b487d,0xffc68a06),LL(0x9518ff35,0xad36470a),LL(0xaf20c720,0xcf8b908a),LL(0xee3bb49e,0xf8b9d88a),L_(0x00000166), LL(0xaca41ffd,0xc04ae92a),LL(0xff799aa5,0x352ca9e2),LL(0x48de6d0a,0xeb0f3051),LL(0xe2b8f5f2,0xa98f1062),LL(0xdfe726fe,0xc285eca4),LL(0x22419400,0x527244d3),LL(0x441ba1f9,0x3ec0c841),LL(0x9ac0f611,0xf7b09376),L_(0x00000167),
+},
+/* digit=74 base_pwr=2^370 */
+{
+ LL(0xde7c70ef,0xce2d58e6),LL(0x4fd2b399,0xe56a0a18),LL(0xd46ffafd,0x43a772e3),LL(0x61832664,0x5e99ec73),LL(0x5a652a9e,0x068acc97),LL(0xda22ced1,0x829eb99d),LL(0x17534159,0xc94c616f),LL(0xf6ab0176,0xa334609d),L_(0x000001bd), LL(0xac6018e9,0xf0e586eb),LL(0x03144a03,0xdf49ef2f),LL(0x70d82d13,0xf054795a),LL(0x3d4fad35,0xca4e83c9),LL(0x7178dcbf,0xdccd2e81),LL(0x06f96d5d,0x059906d9),LL(0x99860a4c,0xb0cc8989),LL(0x0b7c4473,0xc7a2422f),L_(0x000000a9),
+ LL(0x7dbd2185,0x990d40ea),LL(0xfd292d5f,0xfe2aa0bf),LL(0x0b3c033e,0x350ffa07),LL(0x7093caf5,0xcba18d05),LL(0x8e77aa62,0x5de1ef34),LL(0x8dcafce9,0x8d305062),LL(0x54c13b97,0xa2184206),LL(0x024b7581,0xc1eed7a3),L_(0x000000eb), LL(0xff7787c9,0xd2467c3c),LL(0x5919f6e7,0x6f3a2cc6),LL(0xe4ef4ee6,0xd95dc335),LL(0x8b15339d,0x53862418),LL(0xc47f7183,0xdc9f6ee9),LL(0x0164075a,0x8fc3c2d0),LL(0xfb8c9b9b,0x82f15ec0),LL(0x2cab4250,0x6da80b24),L_(0x00000170),
+ LL(0x470b4573,0xce799013),LL(0x9e5e77aa,0xdc0e8efd),LL(0x74901979,0x87335bd4),LL(0x8d25ae87,0x7663b155),LL(0x30b14eb3,0x42427def),LL(0x9f7acb63,0x504e9e47),LL(0x8f787f03,0xb68c9ee0),LL(0x9fb2d8ed,0x3fafed1d),L_(0x00000087), LL(0xded73ba3,0x84c837fd),LL(0x1b05f526,0x361ad6ff),LL(0xa178f8a8,0xba6a96b6),LL(0x0afa0765,0xf1a53f48),LL(0xee02b40e,0x455203e1),LL(0x280a052e,0xa80a8929),LL(0xcc11be29,0x6815682d),LL(0x4811eb83,0xd7ede303),L_(0x000000c4),
+ LL(0xaaf54dad,0x33981c54),LL(0xcebb5e69,0x32546345),LL(0x544b1b16,0x84cafbc6),LL(0x7981b01f,0x5cddc181),LL(0xaa139311,0x1378ad86),LL(0x68cbb494,0x7e2675fe),LL(0x588ce3ac,0x7f2694e9),LL(0xab708d62,0xeda381dd),L_(0x0000009d), LL(0xe3c020fa,0x31d5f56f),LL(0x1a13df6f,0xcdb4564c),LL(0x02f2a54c,0x586ae362),LL(0x19118f47,0xdb9ebb1f),LL(0x7fa3e3f6,0x0b71b651),LL(0x82c695b0,0x82ecf8c2),LL(0x58306aa8,0xc8a72bb7),LL(0x24bb71fa,0x1671f4f9),L_(0x00000135),
+ LL(0x1f561cbc,0xccfdb09e),LL(0x9138999d,0xfc40b806),LL(0x190da0c1,0x248d01f8),LL(0x660fe973,0x04db0124),LL(0xd2a3e26a,0xae1441c8),LL(0x3b5b69d9,0x542d784a),LL(0xe47e9fb1,0xc8706904),LL(0x07fd3e18,0x7b0252dc),L_(0x00000097), LL(0x8560fa2e,0x9bf565f8),LL(0x7a07a372,0xb2a08e69),LL(0x88b9b9fe,0x23737883),LL(0x4af5f0ac,0x3ee2589f),LL(0x4d74831e,0x0c99ecfe),LL(0xe461011a,0xccb75730),LL(0x5f6ac945,0x44dfe861),LL(0xde67a0c4,0x0a4190dc),L_(0x00000007),
+ LL(0x3171ae42,0x8eb6ed93),LL(0x8217bc59,0x480c8b3d),LL(0xf9f73e7b,0xed85e1cf),LL(0xa742114e,0xff0dd45c),LL(0x5d90782b,0x6499236f),LL(0xa8a56eb6,0x81a46542),LL(0xc0a1d718,0xb645bf88),LL(0x5ad3645d,0xda5b3451),L_(0x000000b5), LL(0xf266cd0a,0x8177efc2),LL(0x91a87849,0xd64e2a8c),LL(0xb25866c7,0x7fcea597),LL(0x7ba86329,0xf0a84157),LL(0x4ae784c7,0x6d45e6a0),LL(0xe8a4e8e8,0xbad02a45),LL(0x2b8a78de,0xcb445d9a),LL(0x1a096a8f,0x1c606af7),L_(0x0000006c),
+ LL(0xeb0a1bdc,0x9ad71dbf),LL(0x013860f9,0xefc2f3af),LL(0x0bf5cd2e,0xcc51df06),LL(0x366cecf5,0x8b6d4774),LL(0xff5f3234,0xb320cd40),LL(0xa48903e0,0x331e170d),LL(0xf463c308,0x7b602dac),LL(0x3d097dcb,0xca3b41f6),L_(0x00000081), LL(0xa54e089e,0x1f06f98d),LL(0x9812b78b,0x0835cbf9),LL(0xa1b46e69,0x96985a6e),LL(0xc756e3cb,0x8c83dd55),LL(0xe0033ed2,0xc71730ab),LL(0x7a46dc00,0x333b6de9),LL(0xe8045912,0x8f656577),LL(0x4a453d9c,0x385fe0c5),L_(0x000000a9),
+ LL(0x0691a0c5,0xcb831835),LL(0x9d0103c9,0x47a18b26),LL(0xbca486ca,0x2d151fe9),LL(0x8a31af06,0xc2bcd6c3),LL(0x4c38dae7,0x6a2dd494),LL(0xd0cab5f5,0x0e8dd5e2),LL(0xaaffb6b8,0xf1aa0451),LL(0xd1b4ab87,0xd7ec926b),L_(0x000001aa), LL(0x0b242143,0x61149962),LL(0xd2761793,0x4dbe67f0),LL(0x5f42f5e1,0xbdaa4d19),LL(0x9aea3745,0x2770c1ff),LL(0x336a10b0,0x730746fe),LL(0x965986ef,0x500d5a19),LL(0x98b61ae7,0x2c56a5b5),LL(0xfbc2b7c9,0xf20ece26),L_(0x000001c0),
+ LL(0xcdc9325a,0x47a76498),LL(0xc197a42e,0xa29d1821),LL(0x8a2704b7,0x54a27b18),LL(0x6d7a65e1,0x382392a3),LL(0x6e25e555,0x583ca3d8),LL(0xba1298fb,0x92305de9),LL(0x8762634a,0xc416a724),LL(0xe3560751,0x52b73064),L_(0x00000044), LL(0x9052c067,0xd4b7caca),LL(0x4fc9c7a4,0x0d61d52c),LL(0x88ca3d7d,0x39c96801),LL(0x9d85c914,0x072c2d52),LL(0xeae1af66,0xdc7e4834),LL(0x4567d964,0xcf69cc8b),LL(0x225a1435,0xec05edf7),LL(0xcf0fd41b,0x16674dc5),L_(0x000001ec),
+ LL(0xea4af642,0xc929fb7d),LL(0x666eee50,0xa82ad2d3),LL(0x943d9f3f,0xe959c5db),LL(0x01361c6c,0x413dcd10),LL(0x810dc990,0xba8e95a8),LL(0x111bfce1,0x144ccf37),LL(0x37942ccc,0xbba23cc8),LL(0x6250c86e,0x64797a98),L_(0x00000124), LL(0xe58dd600,0xa61fd6b9),LL(0x324caf26,0x208fb38d),LL(0x802296a3,0x923005fe),LL(0x1cab4d64,0x545d2ffc),LL(0x7edf08f3,0xfd85bdf3),LL(0xbbb0b3e1,0x9feb12a7),LL(0xab0ed8c1,0xeb4e517d),LL(0x45179c50,0x5c75791e),L_(0x00000194),
+ LL(0xe472b5a7,0xebddb001),LL(0x809051bf,0x932eff69),LL(0xb46ff016,0x5ce81f11),LL(0xb49261d6,0x39183971),LL(0x75ef3047,0x65753518),LL(0xefad1e5a,0x7887db59),LL(0x147b2e1c,0x6c93b47e),LL(0x239259f0,0xb5f34e30),L_(0x000001c3), LL(0xd6dbc9aa,0x905217df),LL(0x861e1dc6,0x9fada5a7),LL(0x3986b470,0xf9e88cd0),LL(0xcaab1d92,0x839c290b),LL(0x02e99a54,0x39b3ffa9),LL(0x910523a5,0x655e6f7c),LL(0x42d47f30,0xb367bd8a),LL(0x1e0a7f1b,0xe25d7561),L_(0x000001b2),
+ LL(0x72ded5be,0x4987e69d),LL(0xd0493c78,0xba0a5cbe),LL(0x59557a83,0x75bbdb17),LL(0xf2acabc4,0x65e4a623),LL(0x8bf3c53d,0xd71fb7df),LL(0xc8eb2466,0x7545f576),LL(0xc6d8140f,0x620a0123),LL(0x9f02bd4e,0x67837a46),L_(0x000000b9), LL(0x16cfc43b,0x8b871f92),LL(0xc2538248,0x4b3a3a4d),LL(0xef93af7d,0xdbf730c3),LL(0xbfd3ed77,0xf764526e),LL(0x07f935a6,0xcb6152b4),LL(0x1c016476,0x2bf32571),LL(0xdee3ad5a,0x88aaec73),LL(0xfb09ed56,0x5a614fc9),L_(0x000001cb),
+ LL(0xb19e9875,0x7c127a9f),LL(0x26712a11,0x642533c6),LL(0xf98c4d57,0xc60c2ae3),LL(0x65b1d46e,0x444527b6),LL(0x71dbb3f8,0xe33842c0),LL(0x4381ace7,0x9e839852),LL(0x6a3b078e,0x2c3ba212),LL(0x4de7e214,0xed5d5463),L_(0x00000071), LL(0xde560bf6,0x2312ab46),LL(0x8e3acd07,0x631b2001),LL(0xb498759a,0xcc66ba39),LL(0x22f04bfe,0xd634fae4),LL(0x0f57a006,0x6fb05b0c),LL(0xd36ff867,0x74e2535a),LL(0x85b24cf7,0xe1ec7865),LL(0x1a8674c2,0x8caeb36c),L_(0x000000ae),
+ LL(0xb79af8c7,0x41ce000d),LL(0xbbc4d762,0x3f8e4f4a),LL(0x850dfa23,0x315d2f3b),LL(0xc39228da,0x146ba937),LL(0xe938195d,0x05ba80b7),LL(0xa6946ca0,0x5996d5e9),LL(0x8582cc92,0x20830fe7),LL(0x9fbffd5e,0x49bd8864),L_(0x0000013a), LL(0x84fe2ca4,0x52a9ca5f),LL(0x342678f8,0x0fde0f1b),LL(0x03e8057f,0xb03f731a),LL(0x68041b2c,0xc1b65ef3),LL(0x5e348390,0x812a39aa),LL(0x6058d643,0x85301a5f),LL(0xf291dfe0,0x3f43fec2),LL(0x4f9f3872,0x0ea19231),L_(0x000001c4),
+ LL(0x5896d88c,0x2071dbfe),LL(0x4b89bb6a,0x243135cc),LL(0x0ff935bd,0x7a1a0770),LL(0xe0c7a9ac,0x227a5593),LL(0x6dd5bad8,0x3493e1c5),LL(0x8ba3715d,0x35c53b09),LL(0xc6b271ea,0x744d2bd3),LL(0x2e9feb1a,0x214dd692),L_(0x000001cb), LL(0x59ccbf72,0xeec6e175),LL(0x1f9d847f,0x63ead5ad),LL(0x5419e32c,0xd6156a57),LL(0xe233586a,0xe66a5622),LL(0x39029648,0x4092e8b6),LL(0xbf26b933,0x1e5f719a),LL(0xcd5ad746,0x4f5fc4b9),LL(0xf552f21c,0xd86c96b0),L_(0x00000191),
+ LL(0xb57fb012,0x9ad2983e),LL(0x090fc8d4,0x3313e6f8),LL(0x55cd8ed4,0x8651d168),LL(0x6a906312,0x55315e35),LL(0x591a919d,0x83731bdb),LL(0x5172884d,0x209c90f3),LL(0xe2ac6b9b,0xfbd125cc),LL(0x92e9decc,0x7d19839d),L_(0x000000c6), LL(0x081749ac,0xed7835fb),LL(0x29318405,0x7858c38c),LL(0xc88969fe,0x39c13839),LL(0x9e3d9e6b,0x193b8588),LL(0xa0e5421a,0xe0167b73),LL(0xc6ebad78,0x3cbbe3a6),LL(0xea506121,0xa8cbcf0f),LL(0x20f99af7,0xdbdf82d3),L_(0x00000134),
+},
+/* digit=75 base_pwr=2^375 */
+{
+ LL(0xbc40ed79,0xa97c0378),LL(0x851811ca,0x042ad325),LL(0x0425fd5a,0xae223e37),LL(0x93b83181,0xf721e5a1),LL(0x90e949dc,0x0e3457f0),LL(0x3df6a852,0xb654bab8),LL(0x5f22447c,0x720ad354),LL(0xec0dfbcc,0x64eddb51),L_(0x00000100), LL(0xa4ebf78a,0xa97e2d48),LL(0x5a22dda9,0xa660386d),LL(0x4ad7ed63,0xf4eac86c),LL(0x0e9bdfd6,0xa0b3cfe9),LL(0xf3d0576e,0xb9746e43),LL(0x38598ede,0x5a4f247c),LL(0x6c63f53c,0x9110d7d6),LL(0x937de7ce,0xedc5628f),L_(0x00000180),
+ LL(0x39240f69,0x07ceb75a),LL(0x22d17ed3,0x1d003cd4),LL(0x816d46db,0xacb6fef8),LL(0xb000a452,0x9bbe93ac),LL(0xa33425cb,0x8e7044e1),LL(0xd94105ed,0xbf04fc32),LL(0x7b448d72,0x8a8006d7),LL(0x77527b27,0xce1c27af),L_(0x000001f3), LL(0x04fea417,0xede21a04),LL(0xbea8a562,0xfe905ba2),LL(0x7dcaa390,0x8bd01814),LL(0x8c2e3be5,0xad37906a),LL(0x4bd6ba24,0xe4147c93),LL(0xab35993e,0x54b18700),LL(0xeb32c196,0xc4b62833),LL(0xfde9fb6d,0xefce4982),L_(0x000001ff),
+ LL(0xac68f4e5,0x326389a5),LL(0x8c87ee07,0xc8d06b64),LL(0xf1eb33ca,0x9f6c9bde),LL(0x905394b5,0xe7cff087),LL(0x9daef572,0x15defa0d),LL(0xdcb4d146,0x48372dac),LL(0x9d9bc2a2,0x558be40e),LL(0x918fbab0,0x093092b7),L_(0x00000105), LL(0x420c8419,0x80e77a4e),LL(0x1e399561,0x7faf6193),LL(0xe636d3ab,0xe0b54eab),LL(0x0991ea6a,0x12db09ef),LL(0xe300cb6a,0x2c4871c5),LL(0x5b2c3ec2,0x74b476ca),LL(0x01ab0f81,0x571997b2),LL(0xe7647206,0x7f0593e9),L_(0x00000120),
+ LL(0x9d919a09,0xcb8ddce8),LL(0x53953842,0xc94eac86),LL(0x510be22e,0x18af52b2),LL(0x5204fc68,0x6cd384c6),LL(0xb08bd4d3,0x40918e38),LL(0xbbca8f66,0xc2ac8cd3),LL(0x9b3d5866,0x2e4fdaef),LL(0xbd15b5a2,0xcebfa696),L_(0x0000008f), LL(0xf5dbeff0,0x8986becf),LL(0xa9f4f0a0,0xb5bde2b0),LL(0x2781857a,0xf623a384),LL(0xf48f7d34,0x2fc32d5d),LL(0x5aed2eab,0x3357b29a),LL(0x85d8000c,0xd7a02a4f),LL(0x47c091a8,0x83e2289a),LL(0x748c8758,0x78f3991d),L_(0x0000004c),
+ LL(0xa0a58e79,0xe09895cd),LL(0x8dc487b8,0x1ee06c73),LL(0x4cd52925,0x3615a586),LL(0xb40cf5e8,0x67c6302f),LL(0xe2444c40,0xad0f9fd1),LL(0xf79a9138,0x21560ea8),LL(0x53b1f139,0xdfcbf2e3),LL(0x42f5c15e,0x937e18f2),L_(0x000000d1), LL(0xb23bfb76,0x2b5822b9),LL(0x4289e6fd,0xcce11b47),LL(0x6b3fbfe6,0xfc6c35ad),LL(0x42db4435,0xf40269b9),LL(0xd9e6571d,0x052ecbf9),LL(0x43b34e97,0x85c17cbf),LL(0xc1ac2947,0x2cf45704),LL(0xb8e4df72,0xccda58a9),L_(0x00000190),
+ LL(0x70c63945,0x736929bd),LL(0x2018c224,0x183d085f),LL(0x4be72094,0xb8504d5a),LL(0xa1b86c43,0xb6f18e21),LL(0x4ff46986,0x6ad297dd),LL(0x8a9142ac,0xaf090f36),LL(0x09fe86be,0x3b6921ae),LL(0x3c8c552b,0x953006e9),L_(0x000001ce), LL(0x0006309b,0xaf72ac6e),LL(0x80956c6b,0xfa741157),LL(0xc4c2c5f7,0x5e9870c9),LL(0x7ec1eba5,0xf57cfca1),LL(0xc10b4b60,0xa6e490cc),LL(0xb0618cc6,0x39e98a9d),LL(0x31fe5f00,0xf0f53611),LL(0xb1970dbc,0xa442baa6),L_(0x00000100),
+ LL(0xa7015016,0x90a308db),LL(0x61cca596,0xcbaa218f),LL(0x6743511c,0x6574da13),LL(0x71c34c1b,0x50cf99a2),LL(0x570b3140,0x8ae9a0ed),LL(0x8fffc78b,0x816fb1cc),LL(0xe8d131b4,0x052abb5d),LL(0x64b0d1f3,0xe564075c),L_(0x0000006f), LL(0x20ebfdef,0x5fb1b653),LL(0x57fab65e,0x72bc2ab8),LL(0xcd37e51f,0x6c8bb1d5),LL(0x57d81547,0x75b37fd5),LL(0x572bd385,0x1441e8d8),LL(0x0eb239d2,0xd5a6c392),LL(0x7cc7ae14,0x16b857f6),LL(0x7141c32a,0x931901c6),L_(0x0000016f),
+ LL(0x981eb231,0xe53ec842),LL(0x16678799,0xeb3f78fb),LL(0xdb8c26f2,0x1091298b),LL(0xe09307e4,0x265d3b22),LL(0x79682bc2,0xf829161a),LL(0x8a62536f,0xdea99410),LL(0x002fb6de,0x3d369ec2),LL(0xca79fdbc,0xf58b2f20),L_(0x000000ba), LL(0xa6987577,0xf756d9fe),LL(0x61419646,0x9934641a),LL(0x308b017c,0x5de627fc),LL(0xbea2b76a,0x23ee7d29),LL(0xba8603cb,0x6ab47900),LL(0x85c79476,0x004b96bb),LL(0xf41684cc,0x94d547ed),LL(0x8b7656ed,0x2003142b),L_(0x00000030),
+ LL(0xacf59bef,0x8759d864),LL(0xfb67c7fb,0x0407a03f),LL(0xfb9982ce,0x020231ea),LL(0x55103874,0x9d3dc0fe),LL(0x9a32c3ea,0xc54c5166),LL(0x8e76b967,0x7422e59f),LL(0x538d7969,0x1567215f),LL(0xc1772e51,0x1bee3ac0),L_(0x00000159), LL(0xbc5e3fec,0x44e31ef8),LL(0xeef4a1e2,0xf4d1de52),LL(0x78709a3f,0x144880f0),LL(0x90e1bf50,0xc5a2e2e7),LL(0x6576ad05,0x963afdb1),LL(0x858a5053,0xfb62a6ae),LL(0x720e44be,0xf7d3d903),LL(0x85ea2a35,0x1ce3e300),L_(0x000000b2),
+ LL(0x22a69bc6,0xc85cdf02),LL(0xe346fabb,0x2b0945e1),LL(0xe07629de,0x76a1e2b5),LL(0x45e5724f,0x43bc885c),LL(0x6f8c506b,0xbd1f5350),LL(0xc4a247ae,0x9759458e),LL(0xe8c49a8e,0xad9f81fe),LL(0xef961f24,0x0789ce81),L_(0x00000078), LL(0x536c8acc,0xbdac3a5a),LL(0x0d120ebb,0x2f38cfe3),LL(0x29a29c91,0x470f8673),LL(0xa93d27e5,0x85f54b6a),LL(0x347ce7f7,0x869bc2c6),LL(0x681c6e83,0x240291c1),LL(0x5f895132,0xd778a681),LL(0x9354c132,0x35657182),L_(0x00000113),
+ LL(0x600c6b7d,0xdc0c7615),LL(0xd08ada52,0xf64fa06b),LL(0x6fe343d4,0x0f9f191b),LL(0x269d74ba,0x2b582fb8),LL(0x3e1302f6,0x4f3fa209),LL(0x3dd58666,0xbaec4e8c),LL(0x2346df80,0x2addc663),LL(0x961745b5,0x6358e5f3),L_(0x000001c0), LL(0xd43fe3d8,0xbca3dd73),LL(0x0f473bff,0x97d4d8fb),LL(0xcbcc7f23,0x592d62f3),LL(0x8c21a728,0x2d18d7d2),LL(0x08669251,0x5acddad3),LL(0x10138815,0x5eb1d5da),LL(0xaf710391,0xf88b7078),LL(0x200a8738,0x9614df01),L_(0x00000078),
+ LL(0x3d24acd4,0x39f8e71a),LL(0xf8ccaa40,0x89f9fde7),LL(0x4a565eb3,0x3a88c7c8),LL(0x2241445b,0xb88e20b6),LL(0x0479b1b1,0xe22d8db0),LL(0x96695cdc,0x02fe3690),LL(0x48a70132,0xaba6a66d),LL(0xafe3713b,0x5be868e0),L_(0x000001b6), LL(0x6375d71e,0xc518718a),LL(0x3e38b8c6,0x00a613fe),LL(0xee16d3bd,0x8bab2dac),LL(0x5f51a73a,0xecd0dde7),LL(0x5d598b1d,0xf9a19d5d),LL(0xcc2ed8e1,0x74ed2f5d),LL(0xb66c7686,0x1a036457),LL(0x45717b78,0xeb14d9fd),L_(0x000000d5),
+ LL(0x8eeb7cce,0x42bb5d7b),LL(0x69ebb0a9,0xf6f6e0b1),LL(0x24c217db,0x751a1bfd),LL(0xd4eab425,0x1570cf87),LL(0x46afeada,0x55c17749),LL(0x84f69779,0x72264346),LL(0x0e0b6e91,0x43f9c928),LL(0x2a080641,0x5face2cd),L_(0x000000e6), LL(0x24d003a4,0xb97b52aa),LL(0xb84b4c35,0x079d267b),LL(0xea1ade5e,0xfd3d3470),LL(0x64da3bef,0x603b5d99),LL(0x4e2ca35b,0xc90c1bef),LL(0x267ee929,0xa4dcd6fa),LL(0x2e371559,0xeadf09d2),LL(0xdc90620c,0x7ae7bd5e),L_(0x00000131),
+ LL(0xa33f00cd,0xe19a4c40),LL(0x3bef2c63,0x57c68d2d),LL(0x922215ae,0x03e85348),LL(0xb54763ee,0x7a4a0d2c),LL(0x4381fb33,0x747d2320),LL(0x3d971222,0xc828be44),LL(0xd96627f6,0x6d1199b7),LL(0xabfb6b5f,0x3d2170b3),L_(0x00000043), LL(0x971bb69f,0xbb1d3366),LL(0x8c946a2e,0xa111d7a3),LL(0xb29fb103,0x75997def),LL(0xa9647d36,0x82824e10),LL(0xa45fdefd,0xf29d6d05),LL(0xa9b94f37,0xe35c500f),LL(0x317e08c1,0x4c601022),LL(0x2a6ed921,0xa2afcd4a),L_(0x000000e0),
+ LL(0x6053b527,0x14a651b3),LL(0x6443bb77,0xc4e092bf),LL(0x3d523243,0xb725b204),LL(0x563f7657,0xf0d19ab6),LL(0x6dd80a2f,0x0c09a035),LL(0xa3a7805c,0x72bfb218),LL(0x767659a8,0x5001304f),LL(0x06ad0ad0,0xae6cf2cf),L_(0x00000048), LL(0x12dbf627,0x73b1275f),LL(0x58294610,0xf2619fd4),LL(0x12455781,0xc2991198),LL(0x822a98ac,0xc52b1be7),LL(0x6f92e55b,0x85c5dde4),LL(0x6f912a88,0x71070200),LL(0xc6ff80dc,0xed86ff4f),LL(0x5fb4c0fb,0xf6cd415c),L_(0x000001eb),
+ LL(0x2ce62ff7,0xe13291f0),LL(0xa731176a,0xc2f095b8),LL(0x53e5b4c8,0x22d8f01b),LL(0x9b8d5a23,0xf09c9053),LL(0x6cfad192,0xac4c2264),LL(0x016016f3,0xc2d48df5),LL(0x500c56f4,0xbed57312),LL(0x206618c9,0x249d3807),L_(0x00000152), LL(0x64b93c61,0xa752bb21),LL(0xa854f0db,0xad82109b),LL(0x2bd9fbff,0x39d0e928),LL(0xe612cee3,0x5cfc63fe),LL(0x3aca9e51,0x18541bf3),LL(0x0fd5f823,0x1df11f0f),LL(0xdccc44f5,0xe5d7f0f8),LL(0xc8e26d92,0xdc204c43),L_(0x00000134),
+},
+/* digit=76 base_pwr=2^380 */
+{
+ LL(0x4cea698e,0x90df775a),LL(0xa877dfb5,0x0e8c657f),LL(0xf628f95d,0xc58775b2),LL(0x1f94b622,0x55966c52),LL(0xd94ba3e7,0x2b826bca),LL(0x536e1836,0x1429585e),LL(0x6a8bf64e,0xab9cff45),LL(0xfdc0d065,0x7ad254f1),L_(0x0000006b), LL(0x3e6824f3,0x10be2241),LL(0xa869cd60,0xb5cc49f5),LL(0x399cde94,0x029dfb84),LL(0x53bc96f6,0xc7d08220),LL(0xf3d33d68,0xb6cb5f4b),LL(0xd70bd72f,0x81e790ba),LL(0x5f85b782,0xd6b87ddc),LL(0xd6fbd3aa,0x9bddab2f),L_(0x0000007e),
+ LL(0x658551e0,0xcff0963f),LL(0x1215b91a,0x7ce3e2ea),LL(0x276c4b8c,0xae4d76fd),LL(0x27c2c599,0xcf3a3b9f),LL(0x985a8106,0x706667b3),LL(0x3dd5545f,0xe5bf95ab),LL(0x9ae8ea63,0x5a494d9e),LL(0xac8eb301,0x36df8e2a),L_(0x0000014b), LL(0xf96eb433,0x241e0605),LL(0xec384ae0,0x19fc3d54),LL(0xbfb3e2ee,0xce0a2d7c),LL(0xa5ac041b,0x7e0aa0d1),LL(0x22b978b5,0xcf6adf10),LL(0x50508726,0x13804525),LL(0x77d6d81e,0x02fbac9b),LL(0x34536c98,0x6666d2c2),L_(0x000001d1),
+ LL(0xc31ca580,0x0fd75964),LL(0x2c167fba,0x79fb34e2),LL(0x68658968,0x3d2ac14b),LL(0x6bb85f11,0xf9265032),LL(0xe567c4fc,0x09815c6a),LL(0x30478f2d,0xb2da7033),LL(0x2d4e045b,0x7450186c),LL(0xeb491702,0x3d6ff5bb),L_(0x000001cb), LL(0xd6230d65,0xa96aee5e),LL(0x7fa7f974,0x54b866f5),LL(0xd445b199,0x7edd540d),LL(0xda3cc41b,0x6672b9ea),LL(0x3c302e2f,0xf5adb45c),LL(0x5ea3de1b,0x201f8535),LL(0x70efd3fa,0x9bc11d2a),LL(0x3d2e2804,0x4d97e055),L_(0x0000009e),
+ LL(0xe0b71938,0xdb5aaa83),LL(0x020dd38c,0xf16c4ef4),LL(0x0a2db89c,0xa5cd426b),LL(0x43e8b727,0xf5617c8e),LL(0x23ddc0ba,0xb43d6e58),LL(0x259e17f2,0xc826180e),LL(0x06737413,0x55f63ef5),LL(0x434e7412,0x23e6163c),L_(0x00000096), LL(0x0c64c884,0x9695e5ae),LL(0x47505a19,0x6e1e36e5),LL(0x74ec16e2,0x43d8b0e2),LL(0x4831814a,0x037ed439),LL(0x5b1a104c,0x375672e8),LL(0x5bc4b456,0x9fdc64a0),LL(0xf4e8604b,0xdb5b0994),LL(0xa1d8d54c,0x035e5850),L_(0x000000d7),
+ LL(0xc1e1dd97,0x6b6358ca),LL(0xae97ec9d,0xf89cd326),LL(0x96931bf3,0x0db33ff8),LL(0x1728a8a2,0x5df6988b),LL(0x8b413bf1,0xc9cd5efc),LL(0x7876052f,0x980dbb18),LL(0x662d8014,0x7d44d414),LL(0x56d9235f,0xf0c89214),L_(0x000000df), LL(0x6a6bdb67,0x7d2553d4),LL(0xd43349dd,0xc275fa25),LL(0x98c5095d,0x7e9d6a23),LL(0x5dae8169,0x48607095),LL(0x004d6221,0x0de66e5e),LL(0x88753853,0x407e61fc),LL(0x0cbeddeb,0xb1e576ab),LL(0x85968acb,0x6df65046),L_(0x000000e3),
+ LL(0xdf2834dc,0x1d1376b4),LL(0x2c927fc0,0xf4b1b912),LL(0xcb3e3200,0xd6a633a1),LL(0x54477db8,0x4c991410),LL(0xbf0c1c32,0xa9a4d4dd),LL(0xda008df0,0x30c04f89),LL(0xf68e5507,0x1a10f51d),LL(0x5ce5c51e,0x41031547),L_(0x000000da), LL(0x15811373,0xdec76b03),LL(0x4ca12b9b,0x53a8bf3f),LL(0x4e3a3297,0x6ef86a89),LL(0xc5a499c8,0x38a372fc),LL(0x97d666c8,0x6ec44e4a),LL(0x41b99123,0x95600ea2),LL(0x650c8dbf,0x4eb71cc1),LL(0x4c7627fd,0x54f79c84),L_(0x00000186),
+ LL(0xc38fca05,0x69ce7225),LL(0xf1a6e969,0x77785cf6),LL(0x9cc6268e,0xc7d8303c),LL(0x2b8308ef,0x6b0e5276),LL(0xcba9dc8a,0xa4bf9968),LL(0x416fd26f,0x8c4cdb7c),LL(0xe7d932fa,0xde7df0b0),LL(0x472063b5,0xd8e36d94),L_(0x0000001b), LL(0xd88f945e,0x852f11b9),LL(0x528d0c6d,0xe34ebb6a),LL(0x0491c222,0x572cf3b4),LL(0x3235246f,0x6a507a97),LL(0x5419c482,0x151b4954),LL(0xa45d1468,0x1e9ff246),LL(0x555cac59,0x74cf9098),LL(0x3f67c66c,0x4d10852a),L_(0x00000081),
+ LL(0x109aae5c,0x4d4d6495),LL(0x86a81e7f,0x54df2c4b),LL(0x4316eb10,0x19b90005),LL(0x41b6877c,0x63ac12d9),LL(0xdbe38379,0x7bdc46a9),LL(0xe68280f8,0x04afbefb),LL(0x1d97d1dc,0x64f8fe97),LL(0xfdaabbcc,0x3ef9d7ec),L_(0x00000054), LL(0x1998e321,0x4256ebb2),LL(0x5f744a3f,0x462bbab0),LL(0xc6587a4d,0x8de305cc),LL(0xf7cc14a1,0xd2c0e8c5),LL(0x1c2fa456,0xd7f552fd),LL(0x93096db0,0xdf5d165b),LL(0xeef9e935,0x0a7d4ef3),LL(0x8313440e,0x2ecbc3b6),L_(0x0000000c),
+ LL(0x86173dd6,0x4ec080d5),LL(0xc4429668,0x00e4c47a),LL(0x0c5790c3,0x2bb3e90a),LL(0x76060854,0xb06d2fa8),LL(0x51871594,0xb8a8220c),LL(0x35fa01c4,0x96cfa275),LL(0x351722c6,0xd2b5aea0),LL(0xcac00f2f,0x9a7e1203),L_(0x00000023), LL(0x30706067,0xa79d695c),LL(0xe8bbd2be,0xc13d4a47),LL(0xdd17ddc3,0x3a2ef1d7),LL(0x835e7fe3,0x3a0d7223),LL(0xdaab1fae,0xeadcb841),LL(0x2baa3375,0x25d48c28),LL(0x3675311d,0x1cfce1d1),LL(0x8cca0828,0x6d648baa),L_(0x0000001e),
+ LL(0xeb6ee1f4,0x39772678),LL(0x4730fdee,0x4814bf38),LL(0x7da6e5cf,0x717ace32),LL(0x2440a79c,0x1fa530fc),LL(0xee76a431,0xf0840ed5),LL(0x64a9d867,0x9b3e52c9),LL(0x01e024e8,0x388a3167),LL(0xbc5a3de8,0xb45ab215),L_(0x00000127), LL(0xff0e20a7,0xdb989f10),LL(0xb0c72279,0x88321c3c),LL(0x461d5212,0xe2e0c887),LL(0x22583d6f,0x0422ef3c),LL(0x5319c021,0xf26dbc88),LL(0x3aba5f48,0x62bbe876),LL(0x7e742165,0x411f00ae),LL(0xd32aa7f6,0x6608e197),L_(0x000000e2),
+ LL(0xe82a5867,0xb2aed406),LL(0x5c51d66d,0xe49e1c0a),LL(0x341d6090,0xeca16754),LL(0x50aaa76d,0x3d4ae66e),LL(0x23dd6ea7,0xc264093c),LL(0xb964aff3,0x124124d1),LL(0x6a903309,0x320f2ccc),LL(0x040a80c9,0xa2fc450d),L_(0x000000f1), LL(0x442fcd61,0x660ce624),LL(0x876d5eb7,0xb113de73),LL(0xd6a08a24,0x8fdedfa3),LL(0x7e981617,0xccca4ec9),LL(0xbf6d63e9,0x1cbf7303),LL(0xd5b865e9,0x06258e51),LL(0x8b4e0432,0xae5f01e7),LL(0xed7485d8,0x1fb3ec8e),L_(0x0000007f),
+ LL(0x9cc6138d,0xcd3a614c),LL(0xaac40dbd,0x933beab8),LL(0x23a3080d,0x4ca0b1cd),LL(0x3c101e4c,0x2d0376e4),LL(0xcb246c76,0x8ef2560e),LL(0x3a96d882,0x54be7604),LL(0x792be430,0x4ed7cfd6),LL(0xe67d1eea,0x924a5689),L_(0x0000002c), LL(0x64c2420d,0x63647d6b),LL(0x9642188f,0x514cab56),LL(0xbcdfd904,0x529ea4a2),LL(0x876c6668,0xcbd5305d),LL(0xfa8c20c0,0x58b69ea6),LL(0x1ac42596,0xf62b1c30),LL(0x80232775,0xee3d0824),LL(0xc5b975d6,0xc483c2ea),L_(0x000000b2),
+ LL(0xd2eb9667,0x8bc6d688),LL(0x6c7bd269,0x7652c729),LL(0xc96e37bd,0x405791df),LL(0x410e2904,0x5ab8090e),LL(0xf9bde0c1,0x1a7b424c),LL(0x37d8159f,0x26876e27),LL(0x6e7212ab,0x5e21bc5d),LL(0x2ff3af58,0xa29dba58),L_(0x000000a6), LL(0xb27af4fd,0x7dd665a0),LL(0xe048ab97,0x19984a71),LL(0x17b7a849,0x8f61b833),LL(0x9bdf5b57,0xeb63a0f7),LL(0x32adf9dd,0x8eaf0eb1),LL(0xe30814ac,0x799c8225),LL(0x35be0b92,0xa082ff80),LL(0x7e52495d,0x196f3154),L_(0x00000054),
+ LL(0xe45aefc6,0x3b3fccf2),LL(0xf8b435c7,0x7f599023),LL(0x4b07f56c,0xc6614964),LL(0x1f9e8dd5,0x7bfaa97f),LL(0x57a41fcb,0x056d5124),LL(0x69dc4c19,0x33956d10),LL(0x2e70770f,0xac607019),LL(0x17397aa9,0xbda3b4ee),L_(0x00000082), LL(0x8bf00dd1,0x11800cef),LL(0x9f451540,0x5de0b39d),LL(0x9cd9ec18,0xf09ca421),LL(0x7bff70d3,0x3fc8f958),LL(0x6af7560e,0x348716d4),LL(0x2601495a,0x4ed53bb1),LL(0x39eaa8c2,0x97052bec),LL(0x87acae02,0xb4363c7a),L_(0x00000069),
+ LL(0xfcf4623b,0x010e4074),LL(0x23ceb817,0x68de1fa6),LL(0xb6c3610b,0x79b5037c),LL(0x794616e3,0x38ca34e7),LL(0x6964c6c9,0x64ba9eb2),LL(0x9d828a84,0x713e3f60),LL(0xc6cafea4,0x69bdca04),LL(0x0035da7c,0xc53921ac),L_(0x00000170), LL(0x66f97d4d,0xbe97815a),LL(0x678d3502,0x09bb25d5),LL(0x417b9931,0xadbec401),LL(0xa021e930,0xef1be11c),LL(0xb53777ab,0xfb3f04c1),LL(0x2e6bc85d,0xab9fbf13),LL(0x22a4d27b,0xb988012f),LL(0xddee5ad9,0xfda8aea8),L_(0x0000007a),
+ LL(0x3ed86b54,0xc43ac524),LL(0x9805e79d,0x95a2175f),LL(0x2bee2dfe,0x6125c31c),LL(0x2b6284b0,0x10319508),LL(0x2264eba0,0x8cedfa4a),LL(0x25bc143e,0x3199afa3),LL(0xe3ae2485,0x63067c6a),LL(0xebebe969,0x54a7cecd),L_(0x0000016c), LL(0x9434e363,0x6de3a522),LL(0x3a1a5044,0xf721555f),LL(0x644f2db4,0x6dc38924),LL(0xb72ad43f,0x39beb126),LL(0xe7dd7722,0xd840de05),LL(0xd6caacd0,0xc67a2862),LL(0xce6fa639,0xba53021b),LL(0x71087602,0xec9b5982),L_(0x00000079),
+},
+/* digit=77 base_pwr=2^385 */
+{
+ LL(0xb9a7e9fc,0xb75ed4da),LL(0x7aaab2f5,0x1ee37679),LL(0x30159305,0x0b02f44a),LL(0x021962a3,0xd622cf13),LL(0x55a3eea1,0x9a7dfa05),LL(0x4fcd685c,0x7a2a6aca),LL(0xd2e75077,0xbd4c914a),LL(0x1e6aa905,0xeec52d7b),L_(0x000000ff), LL(0x3f6fa1e0,0xfa95204a),LL(0x539f85e4,0x36eeec34),LL(0xe8ddc16e,0x74599d1c),LL(0x50244a9e,0xb343c6c5),LL(0x714c017a,0xb07951ae),LL(0x4503f92d,0x44d15c8c),LL(0x830499e5,0x94680ff6),LL(0xe7188a7b,0xd6c4809f),L_(0x00000147),
+ LL(0x9a2546bd,0x1bf14718),LL(0xf89fcfd4,0xc079070b),LL(0xa403ed89,0xa107b324),LL(0x18c3f861,0x4dade6e3),LL(0x665e9f9b,0x332b6327),LL(0xb408e3b3,0xf62f16ec),LL(0x11ee2181,0x67bbd1bc),LL(0xd0ba5904,0x4b5440b9),L_(0x0000000f), LL(0xde86660f,0x9cb1aa7a),LL(0x8a32a33d,0xedb96d1a),LL(0x9ae722d5,0x0654bd1b),LL(0x1664c777,0x03d0e5a5),LL(0x6a4a631d,0xfb01ee81),LL(0x3d1d9344,0xc7691584),LL(0x1e1821b3,0xbe2d285c),LL(0xafc22520,0xe0834d6f),L_(0x000001e7),
+ LL(0x256a6798,0x08d12f4d),LL(0xf2407064,0xd7255fb6),LL(0x1c6799f2,0xad7d86d9),LL(0x8c32b1c7,0x259fb289),LL(0x172083c6,0xcdc9f2eb),LL(0xc85a5a26,0xdca9f61e),LL(0x303eee79,0x82cff2b2),LL(0x283cc245,0xaea38a1c),L_(0x00000018), LL(0xac3447b7,0xf7fee514),LL(0xb0b385f6,0x0a48204d),LL(0x785b0f88,0xaff858dd),LL(0xae66256a,0x24f69e65),LL(0x92f5e352,0xe99c8d90),LL(0xb2e1ccee,0x40cfa4d5),LL(0x5201f6ee,0xfefbb836),LL(0xbcabc908,0x61f21689),L_(0x00000144),
+ LL(0x5183d337,0xd756d8ef),LL(0xaef07505,0xdd4c26d4),LL(0xfd1d5c09,0xb43bb4e7),LL(0x53c26645,0x6a817eb2),LL(0xf92f5487,0x6209c32a),LL(0x3e205a08,0xb9b883a6),LL(0x802502f8,0xa6f9cb8d),LL(0x2169b5a7,0x87089ec1),L_(0x0000008d), LL(0x5c3f78b6,0x4cc2981d),LL(0xc0b6dcff,0x39135fd7),LL(0xe2051e1d,0x0f800ca1),LL(0x76456f99,0xae12c766),LL(0x987a86bb,0xdfc5fcbf),LL(0xcbf344cf,0xa853db02),LL(0x65a4f55e,0x24b115f9),LL(0xf4d8cf4b,0x28cffa2b),L_(0x000001db),
+ LL(0x8518ed22,0x9698f500),LL(0x46e1cf5e,0xa37c3c3b),LL(0xb10d9d35,0xb6d8d81a),LL(0x6814e15a,0x65739419),LL(0x9282b5ea,0xf890c6b6),LL(0x80d764c7,0x7d309653),LL(0xda043f0c,0xd070b1e7),LL(0xc9e15f63,0xb143ef10),L_(0x00000056), LL(0xc6e28862,0x47fd9b69),LL(0x525c5453,0xc9876e94),LL(0xe52b9bcb,0x3078ffdd),LL(0xab8f2cfa,0x7e1a8a45),LL(0x338e4367,0x3382f009),LL(0x5b0092de,0x06454df0),LL(0xdb5d1cbb,0xbbf3f2d3),LL(0x17b40f75,0xb1b7961b),L_(0x000000b1),
+ LL(0x3c3b17c4,0x7aa9d1e5),LL(0x71e12980,0x69777935),LL(0xdfdae6a9,0x2f45dffd),LL(0xf2900457,0xabe3441f),LL(0x6471580e,0x5aece4d0),LL(0xd983618d,0x85cd6571),LL(0xf5a1d861,0xc2bd978c),LL(0x955894c4,0x81cae98a),L_(0x0000017f), LL(0x4b6d344e,0x3176598c),LL(0x4b7790dd,0xc91def7d),LL(0xb21152ba,0x279d992a),LL(0xd92aafdd,0x7dab9fb5),LL(0x59dd70d0,0x7039956b),LL(0x14d13b0f,0x7cfe20de),LL(0x7bd5d4c8,0x45b10bc2),LL(0x59724543,0x906a5d0d),L_(0x000000cd),
+ LL(0x2093c6ef,0x80b9235f),LL(0x380affbc,0x0b4024a8),LL(0xcd02b098,0xc98a3c0b),LL(0x36545f0a,0xe62cf7ea),LL(0x3b089c99,0xdade8fc7),LL(0xf9b4c955,0xf404f355),LL(0x7650e822,0xae64ac11),LL(0xcc0fb628,0x593a1b6a),L_(0x000001df), LL(0x4231a24f,0xa51f1936),LL(0x091d5493,0xeabe8135),LL(0x5285ec41,0x6bc185fe),LL(0x9a7df8de,0x25f54dac),LL(0xc1b5836c,0x4e5fc638),LL(0xde102ff5,0x81a60442),LL(0x56a67f9d,0xaeaff6ca),LL(0x7cc5f40e,0xdaecfbdc),L_(0x000001d0),
+ LL(0x01bbcb15,0xcd4c9f1b),LL(0x64ba5d43,0x262898c5),LL(0xb6d345ac,0x0f11b91d),LL(0xf8015622,0xfa53c395),LL(0xeb32e3dc,0x4e8f0647),LL(0x125c49a2,0x537471de),LL(0x5c783701,0x7a9741e3),LL(0x00bc6a87,0x1c5d3aa6),L_(0x0000003e), LL(0x5cbf2fb6,0x18eae31d),LL(0x1336f732,0x7555dff2),LL(0x63097ec4,0x8f16a8d5),LL(0x928e41ac,0xc063790a),LL(0x72cf7210,0x2842e2a8),LL(0xbed4668e,0xe7f0d214),LL(0x7b5aab91,0xbd94783e),LL(0x472089cb,0x55df6f3c),L_(0x00000177),
+ LL(0x5f960853,0x6ba36bea),LL(0xd6462023,0x51b0110e),LL(0x0299f400,0x5ad94e5d),LL(0x1c56f2f6,0xd8d6e619),LL(0x0b4ea27d,0xe73e18fa),LL(0xdcfdac26,0x61a026ce),LL(0x27dab320,0x4ebfdadb),LL(0xb6af0729,0xe9561c2a),L_(0x000000e9), LL(0xc786fe34,0x1418a240),LL(0x7a5020b9,0x2b5125f4),LL(0x7dac2ce9,0x6985bdc7),LL(0x7a36a07a,0x6d385362),LL(0xc0a58550,0x940163b2),LL(0xd28cbf38,0xfb9a9d22),LL(0x8eddbcd2,0x1cfcdeb4),LL(0xad40ff84,0x41da1441),L_(0x000001a8),
+ LL(0xf50794a5,0xf1ab6a88),LL(0x32d8d898,0xb4c956c4),LL(0xbd9881d2,0xbc516c73),LL(0x5116a36c,0x91e840e1),LL(0xff4abf28,0x14bf8bab),LL(0x2bc617a5,0xb012c75f),LL(0xba5d811c,0xf333effb),LL(0x37bcddc4,0x771a4567),L_(0x000001ff), LL(0x4a68eb29,0xa48d6dfa),LL(0xf2542b71,0x495f434b),LL(0xe3f39bde,0x9f969883),LL(0x179f2c63,0xa68cdccf),LL(0x44e28315,0x7408c1bf),LL(0xeb7b9849,0xf6615345),LL(0x823ede15,0xdf405d5f),LL(0x17f01e94,0x0efd64e2),L_(0x00000156),
+ LL(0xb7d5223a,0x6794bc7e),LL(0xfa3914f9,0x044623b2),LL(0x3e94e3f2,0xc7e42b96),LL(0x85cc2a9d,0xe0fbde7f),LL(0x2e0e1f42,0xde5ec740),LL(0x0a1b4e4e,0x99d96c6e),LL(0xa3d7e876,0x9b31d8b9),LL(0xcce96a38,0x4fd9fc85),L_(0x000001dc), LL(0x05826168,0x5b7a322f),LL(0x4317247b,0x01f0266b),LL(0xfd3d2a1d,0xa9fbb760),LL(0x75fc993e,0x60905a87),LL(0x51ce6740,0x3c6c984d),LL(0x16580d6e,0xe79ccbef),LL(0x585522ad,0x57fa547e),LL(0x42f80ccf,0x8ad71acb),L_(0x00000188),
+ LL(0xb6d705e0,0xb16ee0ab),LL(0x28366fe7,0x0365fed1),LL(0xc78aeb84,0xf329889f),LL(0xee74063c,0x16267a5a),LL(0x9c5a9197,0x040a619f),LL(0xc54b40cc,0x16e7345f),LL(0x9d5f609d,0x957fc0b1),LL(0xaf8fbbc8,0xb1cb4d02),L_(0x00000117), LL(0x099b7338,0xd023f32f),LL(0x1deda80b,0xacb49a95),LL(0x4c11c95e,0x00e1f672),LL(0xde8db891,0x19ee52cc),LL(0x27a5b5d8,0x6176a0d3),LL(0xd6752e2d,0xdfccd883),LL(0xe819161e,0xe1282202),LL(0xe71376c0,0xb92fddf6),L_(0x00000047),
+ LL(0xf4c8ed53,0xfecc3203),LL(0x7168d714,0x1726e41f),LL(0xea5d7e70,0x69dd518d),LL(0xe7aec797,0x2cfd3a6e),LL(0x9ab3823a,0xb90a5bea),LL(0x43831c4a,0xdbb35cc6),LL(0xd5853b0b,0x95c10ae1),LL(0x55834ab5,0xd668a3cb),L_(0x000000d5), LL(0xaa33d813,0xc0f7662f),LL(0x98346aa6,0x173a0008),LL(0xabe91f50,0x0508c118),LL(0x97cdd826,0x7255d2e1),LL(0x01d1e340,0xeb07ccd4),LL(0xf2f7ac53,0xc6829327),LL(0x966981ba,0x0fb3f4fa),LL(0x1ee6ae0f,0xea212110),L_(0x00000091),
+ LL(0xb4ca9aa1,0x3c713d51),LL(0x946494a7,0x1e6130d8),LL(0xbd5ab69c,0x6cbf341e),LL(0xcf57622a,0x94d1578b),LL(0xc7327897,0xb1db7d17),LL(0x2874559e,0xf5607998),LL(0xd15eab48,0x18199bc9),LL(0xfe1d9b44,0xd0aedc11),L_(0x00000056), LL(0x931fafb3,0x50c646ed),LL(0xb75609c0,0x9721b326),LL(0x4a7a787a,0xed16025f),LL(0xbf8835a3,0x78dc9b8f),LL(0xee0c8b9a,0xf388850b),LL(0x5a1458a1,0xc5cee39e),LL(0xb7bfeb06,0xecfd0e49),LL(0x8795b039,0x70bdfc80),L_(0x00000111),
+ LL(0xaa736cd0,0xa3c85c78),LL(0xbd49ba23,0xe512fde9),LL(0xdb860d3f,0xbf99d4e9),LL(0x3cb574a7,0xbc4c4fcb),LL(0x9af33dfa,0x88710836),LL(0xfd7ca4de,0x4b83fe29),LL(0xa2306095,0x03d40abe),LL(0x5f9ae75f,0x5e83ab1a),L_(0x0000007e), LL(0x64e02741,0x97d0048f),LL(0xf861736c,0xde0ffdb3),LL(0x5e0c4806,0x335dce14),LL(0x76e125cd,0xcc1ff27f),LL(0x16822cb3,0x8414749b),LL(0x44ae46e0,0x68085d31),LL(0xe89d0a2c,0x9c734630),LL(0x569b26c1,0x2d89e8f0),L_(0x0000004b),
+ LL(0x0c5ceff9,0x1dc45be8),LL(0xf3a736f8,0xb7b948b5),LL(0xf684853d,0xa1d8a120),LL(0x7de7af37,0xe3760299),LL(0xadb401c1,0xa1ba866c),LL(0x24e3e6ca,0xcd94496a),LL(0xc3eae9d6,0x06f82a82),LL(0x4a74e14e,0x069d9983),L_(0x00000143), LL(0x25e3e5c6,0x2a60baf5),LL(0x3855bae4,0xfbb6aadc),LL(0x20017824,0x950ab7cd),LL(0x9dfd2439,0x96b97104),LL(0x65cd1e13,0x4925d16b),LL(0xf2ec4dd1,0xd82c0815),LL(0x9059e2e1,0x3ba03a79),LL(0x2f723163,0xf35a3c60),L_(0x00000017),
+},
+/* digit=78 base_pwr=2^390 */
+{
+ LL(0xaa6fc06d,0x05eac10d),LL(0x1d0d93fa,0x3fb80a45),LL(0x30dbe366,0x69a67246),LL(0x1373df55,0x3a7b7740),LL(0x3b688d58,0x9a1bf576),LL(0x6f4ce0d1,0xc2030797),LL(0x72348a80,0xd874e749),LL(0x24296b9d,0x26fc8724),L_(0x000000d7), LL(0xacca6490,0xa4626a33),LL(0x0b206a34,0x661fc19c),LL(0x597e1cfe,0x1f98c11b),LL(0x010915e6,0x00c41adb),LL(0xbdcb2d64,0xfed21859),LL(0x07de82c2,0xeffa2475),LL(0xba1295da,0x73a4f297),LL(0x570842d6,0x1fc083b4),L_(0x00000172),
+ LL(0x3f4e6262,0x05474c79),LL(0xf27eccc5,0x9bbd81b9),LL(0x4061bf3c,0x1385eed6),LL(0xe5477666,0x2d5cbcfe),LL(0xa0f415ca,0xab0a8618),LL(0x18675f88,0x47e7c454),LL(0x0d5df7ae,0x75324e3e),LL(0xe2f88082,0xe818ccf0),L_(0x000001bf), LL(0xacbfbda3,0xc2d8f452),LL(0xef224de6,0x9ce12031),LL(0x70dcb7f7,0xd958660b),LL(0xc4597b18,0x4dfd1c89),LL(0xda0fa522,0x2d69ce10),LL(0x989afa82,0x46e81b65),LL(0x4e1b3fa1,0xdcac5039),LL(0x832ae217,0x7d3eef41),L_(0x00000032),
+ LL(0x95a0d4c5,0x5daa1b89),LL(0x542982e7,0x98f2622c),LL(0x5b7e32c5,0xa09068bf),LL(0x6931e543,0xeb5500e2),LL(0x9089e794,0x2a396afe),LL(0xe5f72142,0x68403342),LL(0xf625b926,0x14e9fc8c),LL(0x6171d647,0xe3e5f19c),L_(0x0000006f), LL(0x3951af89,0x9dfea1fb),LL(0xaf413d88,0x0a1d61f5),LL(0xb4928484,0xc08e23bd),LL(0xe1c147cc,0x3ba7bae4),LL(0x0b6e0358,0x7c12896b),LL(0xa84a4aed,0x0195f08d),LL(0x7bcd8649,0xeba99c7c),LL(0x799d1ac2,0x0193b278),L_(0x0000008c),
+ LL(0xd9c64878,0x91f424e1),LL(0xb2d18470,0x482b31fa),LL(0xc18abe11,0x4548d244),LL(0xc9e02a20,0x901117bf),LL(0xb1dc1cd2,0x286c34a4),LL(0x8ee98a6d,0x04c325a4),LL(0xb76b3ae6,0xdb518aec),LL(0x981c8298,0xb7194b24),L_(0x0000008f), LL(0x6a5cca1c,0xfd055d97),LL(0xc7061a3b,0x8a107a2c),LL(0x5a667bf8,0xaf0a63ac),LL(0x21028dc3,0x3e8641fb),LL(0xa80d9487,0xd40a558d),LL(0x63f8d8c7,0x3accfc09),LL(0xccc46547,0xfbd53079),LL(0xe85ce362,0x15006f15),L_(0x0000001d),
+ LL(0xb205016d,0x913326ba),LL(0xe7e20db3,0xe0e58c40),LL(0x4dd3a381,0x4f08867b),LL(0x8c0db229,0x1f57cf8e),LL(0x862604e5,0x9951f866),LL(0x588c2473,0xdd04385b),LL(0x2a4f4278,0x13235969),LL(0x334e1277,0xe14a7afb),L_(0x0000007c), LL(0x3623f8c9,0xce866486),LL(0x4c0e101a,0xfa8ba6d4),LL(0x8dee1016,0x1cd14dc2),LL(0x5e8be2aa,0xcc56a3c9),LL(0x5bdaa677,0x26fe9020),LL(0x787cbbf4,0x6059a9eb),LL(0xf27c2ccd,0x52b29d1e),LL(0x431ad6f9,0xe9273bbd),L_(0x000001d1),
+ LL(0x9927e056,0x531296c8),LL(0xa4ea86fa,0xe8dd3548),LL(0x107a45cd,0xd8b7e446),LL(0x1bfd985a,0x280a4e8e),LL(0x4fc2dc66,0x4b39f03c),LL(0x86dfa832,0xc44021ef),LL(0x55d3ccb1,0x210fe263),LL(0x65b0f1db,0x68364a82),L_(0x000000b2), LL(0x6b668b89,0x2aec7e7e),LL(0x7906edd3,0x941505c5),LL(0x5f4fddad,0x657d2929),LL(0x320073ac,0xefaffd81),LL(0x7ab9edd6,0xeb40eb69),LL(0x23d38d94,0xc8df60f9),LL(0x1840540c,0xbfea59c1),LL(0x3958b571,0x2f7620df),L_(0x000000e7),
+ LL(0x47515b25,0xa8d54597),LL(0x3ace77d1,0x23823b9e),LL(0xb05ab9ad,0x7d6803d7),LL(0x36f8db67,0x8ed91e87),LL(0x8fbc69ec,0xe0042a07),LL(0x6a246110,0x5131b89e),LL(0xf857a2db,0x4c1861d6),LL(0x311746a3,0x84c00e5b),L_(0x000000b3), LL(0x28bacfad,0x95ff285c),LL(0xdd895ec5,0x9a709b4c),LL(0xadcb32cb,0x148a78f6),LL(0x7c40e4b0,0xf62708ee),LL(0xd37d48a3,0x68232a30),LL(0x382492cc,0x79b622f3),LL(0x92d657a0,0x09992500),LL(0x6a420a8f,0x501d8de9),L_(0x00000062),
+ LL(0xc3287fc0,0xc122141c),LL(0x66149a76,0xc602d382),LL(0xfdcc4f6e,0x16b23844),LL(0xea0673e3,0x7ff0591c),LL(0x53082d2f,0x82264497),LL(0xafeaf6b5,0xca528c9c),LL(0x01a84f6b,0xe2403638),LL(0x43738672,0x54c4174c),L_(0x000000fb), LL(0xab8f5585,0x4205f340),LL(0x0b6de62a,0xa84853c5),LL(0xc67ea2a5,0x92e0d583),LL(0x296584f2,0x6bb7a441),LL(0xa9f0cd97,0xce6eb31f),LL(0xd0d33dfa,0x850b5886),LL(0xca9b5dbb,0xe75a3fb5),LL(0x143bbd95,0xfc35ee42),L_(0x000000a9),
+ LL(0x34b49dba,0xfe747fdd),LL(0x0c47e2c5,0xf9ae16bd),LL(0xa07b48d2,0x01c347f0),LL(0x2cf4c727,0x747fa6ef),LL(0x850ead03,0xff312b98),LL(0x8726545d,0x5218270e),LL(0xa6f367cc,0x7680a110),LL(0x37efad3c,0xe34b12a3),L_(0x000001a8), LL(0x5db6b25b,0xe1fe8e14),LL(0x5767922c,0xe0242975),LL(0x20a012f1,0xba21fc56),LL(0x49ff848f,0xbd4ab80a),LL(0xde1b4b0f,0x24104f37),LL(0x314917b2,0x221548c9),LL(0xde9c2909,0x6f74cf12),LL(0x75ca1868,0x44d62839),L_(0x000001c2),
+ LL(0x719fc99a,0x3109d76a),LL(0x044307f0,0x7372da8e),LL(0x9ba083bb,0xd35f32f6),LL(0xd25b7e53,0x0a6c99ed),LL(0x30794ede,0x1523c414),LL(0xed97a2a7,0x7dbb6798),LL(0x6d897d7a,0xb996ba83),LL(0x3c0356d5,0xad5ef539),L_(0x00000049), LL(0xf8000ae0,0x37a40ab6),LL(0xfbb2d425,0x468766c5),LL(0xd03d4766,0xe6a77a37),LL(0x09eb18e1,0x9d7f1644),LL(0xbdb7ff41,0xeeb2f1b2),LL(0xc98d5a19,0x8377c08e),LL(0xda52ef67,0x1078c0d1),LL(0xbd2d3d66,0x9181c3b8),L_(0x000000fd),
+ LL(0x2445d3d3,0x4f7f8d77),LL(0x663aa882,0x9e806c61),LL(0xcd6d9ab0,0x434a485b),LL(0x575aafa5,0x0477ae83),LL(0x1fb377fe,0x7b98c782),LL(0x4ac83912,0xe2f16d17),LL(0xd098d31f,0xeaff3b56),LL(0xfba7077f,0x13382e53),L_(0x000000cb), LL(0x128eb20a,0x4aad91ac),LL(0xce1a9e84,0xc8fc10e4),LL(0xb01bef42,0x6afd2473),LL(0xb1a03e1c,0x507c30ff),LL(0x3760275a,0x162b2e12),LL(0xabb38d7f,0x558877e8),LL(0x88916de2,0x9f519917),LL(0x2fdccf2d,0xf70b4695),L_(0x00000020),
+ LL(0xf946f824,0x4848296d),LL(0xe0f71789,0xf3835d1a),LL(0x9fea01e8,0xaf761a04),LL(0xc7d32c83,0x1060dc76),LL(0x6c5ff4c8,0xc3751915),LL(0xec6a8a45,0x6f1dbd4a),LL(0xdf6166cd,0xa64bcecc),LL(0xa942edd4,0x53c4d352),L_(0x00000073), LL(0x0fac6740,0x957c5d10),LL(0xe757c12a,0x60819db9),LL(0x5aae5302,0xfbc64c70),LL(0x72a99d6e,0xb00bbd49),LL(0x3bf68d69,0xf0b755c1),LL(0x125fdc71,0x4502c9bf),LL(0xe7e83089,0x7e20c9f2),LL(0xaefe0993,0x5fa7bc0d),L_(0x0000002b),
+ LL(0x1c0e7e3e,0x596ae14c),LL(0xc255b673,0x1bb0ac11),LL(0x19c21f40,0x04f2091c),LL(0x1838e69c,0x3e9cb56d),LL(0x51439522,0xc1cecfc9),LL(0x52a9b2f6,0xc564467e),LL(0x3576c345,0xeb0fdcd3),LL(0xd04ad0d7,0x3c3aa2c6),L_(0x000001ef), LL(0xba0860cf,0x54b2e727),LL(0x044d2e1b,0x8701d001),LL(0x794b02f7,0xd8153787),LL(0x4f463b8e,0xa0dfa5ea),LL(0x253e324d,0x8fc87618),LL(0x19c78239,0x6165c650),LL(0x97b77e54,0x134c2cb2),LL(0x5e23fc18,0x5ade1fce),L_(0x0000012a),
+ LL(0x17c9180d,0xaad903e8),LL(0xb407a7f0,0xa64c2d6e),LL(0xc577e3d9,0xd68527c3),LL(0x398177a5,0xdf38bff9),LL(0xde6b9d9e,0x746c3309),LL(0x1d7385a5,0x98512661),LL(0x3b8d9701,0xe82c0d22),LL(0xe2b7edd9,0x16ce165c),L_(0x000000e2), LL(0x4980d6c2,0x491b562d),LL(0xd2049870,0x1de2def6),LL(0xcf01bb60,0xaff2152d),LL(0x20717620,0x5764198c),LL(0x503a4861,0x9702cec2),LL(0xce53ec1b,0x886169de),LL(0xe97c752c,0x8d58887b),LL(0xeb1ce735,0xe1b8ee6d),L_(0x000001ca),
+ LL(0x2c437027,0x6213a0d1),LL(0x1d410b7b,0xba1aa221),LL(0xa8aa0a76,0xbd669af8),LL(0x06a3140b,0x196f88e0),LL(0xdc333cc8,0x1c9aa099),LL(0x60557f79,0xe1ff46ae),LL(0xa7b7da68,0xd7626d62),LL(0x2a5a72d1,0xffb47531),L_(0x000000d1), LL(0x1a06575e,0x72d98927),LL(0x8e521d9d,0x6acd3ed1),LL(0x855c8e97,0x47c48377),LL(0x42413164,0x89182c42),LL(0xae6a473b,0x59d11d10),LL(0x730eb702,0xd4abd611),LL(0x71fd7c4f,0x4d329537),LL(0xe8493373,0x5e745909),L_(0x00000143),
+ LL(0x3b653b69,0x4c6f3e4a),LL(0x688f6e0a,0x2a9b6d1a),LL(0x9e0c6a62,0xfebdd4b3),LL(0x7fb92759,0xe14d66ca),LL(0x3d698e7d,0x0a2edb8e),LL(0x08ea4d11,0x10b21ab8),LL(0x0f855706,0xf8405b08),LL(0x104c29e8,0xadf7ff63),L_(0x0000007d), LL(0x2f741dbb,0x4757c2f5),LL(0xe671ed88,0xb38018e2),LL(0xd5288875,0x629331d9),LL(0x279d96a8,0x7e602196),LL(0x559eca5a,0x81f2dc09),LL(0xf274c146,0x96818fe5),LL(0x483d0424,0x1c8246f6),LL(0x76f5286b,0x44ba1052),L_(0x00000179),
+},
+/* digit=79 base_pwr=2^395 */
+{
+ LL(0x0f7e89bf,0x42d44166),LL(0x0a8f4b54,0x924764d2),LL(0xf7bf31e5,0x26e4af60),LL(0x7be28350,0x9fc53bdf),LL(0x08056835,0xa12726ea),LL(0x726e147e,0xd5e175b1),LL(0xca2a0207,0x833e5911),LL(0x4d322cae,0x6cba51a1),L_(0x00000093), LL(0x4e7b937f,0xdaa1d653),LL(0xe0948dd2,0xca2b565c),LL(0x2f88e2ac,0x94ccb3a4),LL(0x85d91e6c,0xd8fe4775),LL(0xb59cebc7,0x0807f46d),LL(0xf4237821,0xfc9eb940),LL(0x402ecff0,0xd173f94e),LL(0xbf7bc598,0xaf975145),L_(0x00000116),
+ LL(0x75e9fe79,0x15942a4c),LL(0x3dad29e1,0x350dec67),LL(0xe6be55a2,0xca3c399f),LL(0x71245659,0x87e22652),LL(0x8f51c63c,0x1bd4c445),LL(0x758ae1a1,0x319b57db),LL(0x547db810,0x7d5c89dc),LL(0x62c8ba84,0x959a5bbe),L_(0x00000039), LL(0x3876f024,0x8c3d490f),LL(0x482b690e,0x50d48521),LL(0x83aada08,0x82c13331),LL(0x45c4a535,0xae5a3425),LL(0x31c1467b,0x51c50d6f),LL(0x2d093b81,0x84a7d97c),LL(0x82d6fbdb,0xdb41ffbe),LL(0x4953468e,0xae0e9fad),L_(0x000001e6),
+ LL(0xd4f44715,0xc26f9e1d),LL(0xb8562be5,0x71fd7b5e),LL(0x039f5b0d,0xe3196121),LL(0x073e4db0,0x902cc367),LL(0x22f8b999,0x604d9b78),LL(0xc1cfc4a4,0x52f26ece),LL(0x88d45487,0xa175f394),LL(0x9f16c268,0x9fe9a65c),L_(0x000000ea), LL(0x3d6adc59,0x54ed1ed1),LL(0x4d516f86,0xb3a46011),LL(0xa9ca3304,0x8c5e216d),LL(0x2030c9a9,0x86a5904f),LL(0xc0c4c573,0x9467bf24),LL(0xb4a6fdae,0xa652162c),LL(0xd3472536,0xb6166589),LL(0x31361b4b,0xfa3bddac),L_(0x000001b7),
+ LL(0x6c223a73,0xaa60773f),LL(0xe8255739,0x58459ee1),LL(0x672547b1,0x3f4e65fb),LL(0x0030639d,0x5059b89e),LL(0xc29a4f63,0x3ffb7b9a),LL(0x267e1823,0x6854cad3),LL(0x7f7d6bbb,0x79c3b99a),LL(0x20d91b6e,0xbec22c47),L_(0x0000005e), LL(0x6be80718,0xd72fbb0f),LL(0x307d9b73,0x7f8c46dc),LL(0xc6fa2f52,0xfbf3d06f),LL(0xd62e537c,0xd7888122),LL(0x4ebd3818,0x11ea61a8),LL(0x479a6f83,0xeafa5532),LL(0xa4bf3325,0xc7a31554),LL(0x5a717809,0x9520a809),L_(0x00000039),
+ LL(0x320654ac,0x4f775892),LL(0xb974b129,0x5ce12c3e),LL(0xe8064395,0x2e69ed62),LL(0x31e3ae39,0x9c220c3b),LL(0xd59ea4b1,0xb79732ea),LL(0x6f45918a,0x6600e529),LL(0x08681af2,0x4ed3f5dd),LL(0x507438a2,0xac5ccefd),L_(0x0000006e), LL(0xf3fc209f,0x5b14db7c),LL(0x2484d059,0x411826aa),LL(0x6005d933,0xca8c9d7f),LL(0x15dd0c44,0x1900212d),LL(0x96825f72,0xa3ea7e14),LL(0x921c8c87,0x20d2b6f4),LL(0xfdd63f04,0xbe8c25ac),LL(0x9f6a6126,0xa2592316),L_(0x00000128),
+ LL(0x8f2ae670,0x27b80789),LL(0x4f60fc89,0xc97bbd7e),LL(0xbd2ecac1,0x5b008578),LL(0xaaf75b36,0x3b54d53e),LL(0x6540b6f5,0xce5a0ab8),LL(0xac54c1d9,0x52d909c6),LL(0x67e6b65d,0x6607ea02),LL(0x7ea06112,0x0a94e0f9),L_(0x0000011c), LL(0x077ac647,0x7fdd52c7),LL(0x49bb24e9,0xfc9b8e68),LL(0xe60101c7,0xdcbe3ce9),LL(0xc2ae52f0,0x3c779930),LL(0x85f01602,0xa50df581),LL(0x4a7c2cfe,0x8c89a686),LL(0x52f720dc,0xe2d3b3fd),LL(0x566aecf1,0x1ac6cabd),L_(0x000001e5),
+ LL(0x9e01d468,0x1a616c59),LL(0x8c145c49,0x1dbffc3d),LL(0x2990c86d,0x842bad94),LL(0x7914907c,0xb0b65826),LL(0x8753b549,0x09f19586),LL(0x29d809d0,0x3f813f8e),LL(0x3e155797,0x293bf471),LL(0x87d08f2b,0xc41c49e5),L_(0x000000a9), LL(0x8769b86f,0xd9473ed1),LL(0x7fc8f692,0x7012e2ef),LL(0x5014f2ae,0xe7047394),LL(0x086b300a,0xb63d8e90),LL(0xe77f5c2e,0xf739fb33),LL(0x700eca1b,0x22cfcea2),LL(0x8bf8652d,0x4bb3d357),LL(0xe61f7839,0xba0c3888),L_(0x00000189),
+ LL(0x1f417baa,0xe42f4734),LL(0xbb740324,0x9909bcd8),LL(0xe45bfed8,0xe9550616),LL(0x77889a7f,0x861f9828),LL(0x446a53b7,0xc8946a71),LL(0xfbe6cdbf,0x72916502),LL(0x70373dcf,0x59c8ba5f),LL(0x1ab59a0e,0x07606ee3),L_(0x000000ed), LL(0x7cf7e716,0xfa3f237a),LL(0xb5ddd50e,0x0f211f61),LL(0x56f3a63a,0x8319e664),LL(0x3124dae6,0xe5acc6a3),LL(0xf2c7d090,0x5d6c5fe3),LL(0x5cc8df62,0xa0165f43),LL(0x20f4229f,0x5adf8ff4),LL(0x2e9c92c9,0xd951affc),L_(0x00000003),
+ LL(0x28c3778e,0x85b95034),LL(0xdf5cb44e,0xffda53ce),LL(0x976139f3,0x126f8dfa),LL(0xe003499a,0x25a0d493),LL(0xb521d994,0x43bb5822),LL(0x4978624a,0x1b4bdd9b),LL(0xf19f8465,0xb8e6e89b),LL(0x51953414,0x3b559f26),L_(0x00000070), LL(0xb01bfe66,0x67904448),LL(0x23ee72a6,0x7f3ba24c),LL(0xefa5df96,0x4a910e6e),LL(0x2d36ae87,0xbee250f2),LL(0xa3310ea5,0xbebd708e),LL(0x5db14894,0x94f849b9),LL(0x7b2cb1b7,0x830487c0),LL(0xd8532e27,0x72d6bdee),L_(0x000001cc),
+ LL(0x1a632371,0x098e856f),LL(0xcfb4864e,0x2a48dc38),LL(0xa9b6c8ef,0x070c9954),LL(0xc3e565ee,0x47d25c31),LL(0xeec5d7b2,0xdd383653),LL(0x5ac0ce45,0x1f5f3381),LL(0xd40035f3,0x486c7281),LL(0xb516fd77,0x5bbe546e),L_(0x00000014), LL(0x9535f589,0x0df8a00f),LL(0x3f432f2f,0x740ff679),LL(0xa22b5ed0,0xff907935),LL(0x3d446e71,0xd013a668),LL(0xeeee1f6e,0x16c4dc5f),LL(0x37116783,0x8ed6e49d),LL(0x07fabe84,0xd710493c),LL(0x29dbccd8,0x9263e99e),L_(0x00000193),
+ LL(0x1f79b2df,0x906df6cd),LL(0x835e52c6,0x8a2f7445),LL(0x66d4156a,0xb891e801),LL(0xaa5c0324,0x852e9f5b),LL(0xd3f81a7a,0xce23b51a),LL(0xcdc49377,0xe9c8bbe9),LL(0x7da33db2,0xd5ae561f),LL(0x90aafd3d,0x2f82d67e),L_(0x00000046), LL(0x0d755e30,0xd53059fe),LL(0x43cd9246,0xca05f22d),LL(0x0c50a7ad,0x23745904),LL(0x612405ce,0x1e2b644e),LL(0x1783439c,0xbb5598f4),LL(0x8299ab36,0xfdba24f0),LL(0x36c6a428,0x085bc781),LL(0x42e84aa9,0xe954acbf),L_(0x00000123),
+ LL(0xb7caf2a5,0xeb9123d0),LL(0x9813e058,0x170c410c),LL(0xb14ecd8d,0x43a445ef),LL(0x12caafb5,0xb13251ba),LL(0x692c7666,0x6a58ee44),LL(0x93734f73,0x1ecf9f41),LL(0x0ff39b6d,0x582e2c3a),LL(0xdd49d16c,0xbc874e11),L_(0x00000054), LL(0x2f1debe5,0x9986c142),LL(0xbe161bed,0xadb85be6),LL(0x94c11992,0x974392b1),LL(0x4727d02a,0x1355dd0b),LL(0x9ef84fdc,0x001779ff),LL(0xdbbcd1c3,0x09218dc1),LL(0x615360f7,0xce2bff57),LL(0xa1cd90ce,0x5b2b4772),L_(0x00000008),
+ LL(0x3b91b808,0x797035ff),LL(0x63db3368,0x2ea4d5db),LL(0xd58aac93,0x5c1f4e24),LL(0xf46d30bc,0x87b8b188),LL(0xfe246192,0x177c783a),LL(0x2b7ec253,0x7157d89d),LL(0x93dd18f3,0x609635a4),LL(0xebb06e2d,0x9bb84085),L_(0x00000182), LL(0x7977b4f8,0x5291bba2),LL(0x68aae159,0xd5d8d4a8),LL(0xc3c56f74,0x8f01b0f8),LL(0xd20ce087,0x0018bf4f),LL(0xcf62fd4a,0x58c66e12),LL(0xe583beb9,0xcba992f3),LL(0x7c22cd07,0x82ea861b),LL(0xffb459bf,0x757b22f8),L_(0x0000010c),
+ LL(0xc9b1cbb9,0xf9bac8ff),LL(0xbeb1c7a5,0x70f6e41f),LL(0x32bb744d,0x1f50a7aa),LL(0x2a66377a,0x611c61b4),LL(0x324a6008,0x1ce936f3),LL(0xc3dc201c,0xc5bca084),LL(0xb70db700,0x47988c82),LL(0xfef0caf3,0x2dfe3675),L_(0x0000005e), LL(0xe9f94248,0x76fee427),LL(0x165d8d1c,0x937f269a),LL(0xdc1fbe1e,0xdfee35cc),LL(0x745db180,0x5475d4c9),LL(0xefc6cdb5,0xb36d0a2f),LL(0x26ccd4e8,0xf7ab4767),LL(0x3783e580,0x31ff3c1f),LL(0xce5d079b,0xed18ab19),L_(0x0000009c),
+ LL(0x0e0b8581,0x231ac4a1),LL(0x0790eab4,0xec50bbe6),LL(0xde5da610,0xc5c0bffc),LL(0xc2382715,0xd201e1fa),LL(0xaac50e22,0x27c0dbe5),LL(0xd06ae9b5,0x8715ddc4),LL(0x77f1683f,0x592ddcce),LL(0x410624c0,0xffb7a12c),L_(0x00000167), LL(0x73c64862,0xf76139b5),LL(0xf8b9348f,0x29844cbe),LL(0x30deae53,0x941fdd94),LL(0x5f88797a,0xa3612765),LL(0xbbb4a54a,0x8e2ccc8e),LL(0x4a469e09,0x47a174f2),LL(0xe17602e5,0xc6f2b50b),LL(0x5edc6700,0x887e7ea0),L_(0x000000bb),
+ LL(0xffa11839,0x350806a0),LL(0x8c8ad937,0xbc207b36),LL(0x45322006,0xf3feb2a7),LL(0x29b356ce,0x9772041b),LL(0x4db4360d,0x71532653),LL(0xffd40033,0x62b4c3a4),LL(0x525bb0cb,0xef8cba94),LL(0xb23dfc1a,0x5f95e7e7),L_(0x0000003c), LL(0xaafe7a77,0x3a9f0d5f),LL(0x05623688,0xe7ca479f),LL(0xe0f2e02f,0x821e669e),LL(0xd9320a75,0x3208dc12),LL(0x2a90f1fc,0xac95bd4d),LL(0xb836d5d0,0x0f15127a),LL(0xa56f1f5b,0x35a8c806),LL(0x4b53533b,0xb5d6ee48),L_(0x0000001d),
+},
+/* digit=80 base_pwr=2^400 */
+{
+ LL(0x321cc486,0xb1b291af),LL(0x63480c29,0x6afae0d2),LL(0xec906027,0xd90afac7),LL(0x067489d0,0x62d3da37),LL(0xe31b78ec,0xd88f38b3),LL(0xff5fafe7,0x3dfa7f35),LL(0x88536101,0x7a6237d7),LL(0x80270f89,0x42a2eac9),L_(0x0000002a), LL(0x69198d03,0x95b6527c),LL(0x38b21960,0xab3e28c0),LL(0x56c8573a,0x49dbf002),LL(0xb06c2993,0x016fc238),LL(0xc550c59c,0x7c26c63d),LL(0x22cb4395,0xd6c87128),LL(0x4a5765b7,0x42f34ea4),LL(0x360be87f,0x9436ed50),L_(0x0000001a),
+ LL(0x92004107,0xcf6c0f3c),LL(0x23b6d0c7,0x01323c15),LL(0xb2a524b7,0x445c4f05),LL(0xfb280e1d,0xb721bd24),LL(0x43a450cf,0x34d74f50),LL(0x459a3690,0x9ed3c3ca),LL(0xf8a99776,0x9bd35cd1),LL(0xaf456934,0xa1b94559),L_(0x000001a7), LL(0xda50d868,0xc7479e9f),LL(0x93e5dd5a,0xfdaf1391),LL(0xfcfc382f,0x727251e2),LL(0x4776e937,0x9f976e0e),LL(0xfaf93681,0x7e0dea37),LL(0x18ec38c9,0x45662b32),LL(0x0308bb26,0xd581e3f2),LL(0x1a441534,0xc275dc07),L_(0x00000046),
+ LL(0xe20ed2c8,0x9bcb5968),LL(0x702c5bb8,0xdfb47a52),LL(0x33f897ad,0xe16c51a7),LL(0x078f030c,0x5e8bc092),LL(0xb9a4c194,0xa0a224a9),LL(0x0d2a2dbe,0x244c74fb),LL(0x00b01506,0xef3b3eda),LL(0xf4403180,0x44f09c72),L_(0x000000d5), LL(0xc261b7e8,0x4a7f0289),LL(0x3c0211ff,0x88323d80),LL(0x1ffe93b1,0x81a127a4),LL(0x7deb5031,0x0bd65111),LL(0x65ffd296,0xff238b15),LL(0x80cef133,0x643d7062),LL(0xddb33d18,0x93ccc6e4),LL(0xc957a463,0x1fcc4678),L_(0x0000011d),
+ LL(0x7eb6c9cf,0x1ccb1806),LL(0xe0e23232,0x5eae4904),LL(0xc2c362eb,0xda675b34),LL(0x2c14f20a,0x13d2fa91),LL(0x60f4ae95,0x6c8c7ff9),LL(0x78df2064,0x6790ea32),LL(0xb702cc14,0x7608da34),LL(0xe2b87bb5,0xadae0fb9),L_(0x0000011f), LL(0x0ca7a84d,0xa26a843b),LL(0xc89f77d5,0x5a368ffa),LL(0x265d14c3,0x957c89a9),LL(0xbd1486e7,0x514b7e05),LL(0xa9030ef9,0x537cf3d5),LL(0xb9ea3998,0x4fb32008),LL(0x0c45cfba,0x61ff9565),LL(0x078d5a15,0x1cc6a564),L_(0x000001c0),
+ LL(0xa9ac7ecf,0x665bb52e),LL(0xf7ce0ec3,0x69d2fe28),LL(0x4c059fd5,0x76b354dc),LL(0x1290e892,0x674b639e),LL(0x6d828313,0x951c9220),LL(0xd6285250,0xee815fd8),LL(0x3a0ba16e,0x8ee38518),LL(0x5323ff40,0x6678fced),L_(0x00000073), LL(0xba67d240,0x73a8b28d),LL(0xba84ecb6,0xbd048216),LL(0x34998afb,0xfb264967),LL(0xfcd4e06c,0xc024c958),LL(0xd668c764,0x9c3e07fd),LL(0xee500455,0x0ea9e902),LL(0x7be48424,0xdf78504c),LL(0xb185d1cb,0xc315ffe9),L_(0x0000001f),
+ LL(0xd554604f,0xdb3f67e6),LL(0xdbdf25d6,0x23503a7e),LL(0x4a86faf8,0x58cbd82a),LL(0x727561d4,0x50ad1fb2),LL(0x0994b8fd,0x1d57e2f0),LL(0x1b2b4725,0x15736a57),LL(0x5dcba3cd,0x4df58192),LL(0xec335163,0xf716e579),L_(0x00000190), LL(0xfd15e62f,0x3615c741),LL(0xe4509eb4,0xef754782),LL(0xbb1dede8,0x7a793f6d),LL(0xa02e32d8,0x27d972fe),LL(0x00b65ecb,0xd0af4ace),LL(0x80ede0c9,0x96816659),LL(0x6c809dcb,0x979a653f),LL(0x943f6f1f,0x0638c8e6),L_(0x000001a7),
+ LL(0x69a82f95,0xc3695735),LL(0x79907894,0x6a94274c),LL(0x923a4f54,0xa698895f),LL(0x6213c148,0x57afe3d1),LL(0x14eca3c3,0x40597be1),LL(0x57638ac1,0x23258bde),LL(0xb1f30c4d,0xb9d09cea),LL(0xe2c1e648,0x544e3974),L_(0x0000015b), LL(0x2d296b84,0x28a45f39),LL(0x0111ad40,0xbe28f874),LL(0xc3e262fd,0x830a9ee4),LL(0xe3cc3453,0x0fdaa4f4),LL(0x044defae,0xcdb8b9c8),LL(0x06665f64,0x4a06827b),LL(0xb0bfa5e9,0x926f3364),LL(0xaf288ab3,0xd9d3c3ec),L_(0x0000015c),
+ LL(0xf210670e,0x5eb181f2),LL(0x047db30c,0xbb73f9ac),LL(0xf0b9977a,0xc5355db3),LL(0xa26685fe,0xa356655d),LL(0x48c1a2cb,0x950bb7fd),LL(0xc2c2dc45,0xe766094a),LL(0x437ff8a8,0x80146ca2),LL(0x0b26425d,0x5b7aafe5),L_(0x00000121), LL(0x7260e44b,0x1c8a54b7),LL(0x683c3c46,0xee244200),LL(0x806c758f,0xb90af5d8),LL(0x71dee02f,0x67ac6f65),LL(0x53aeab51,0x0f1dfed2),LL(0x762d7338,0x59bf51fc),LL(0x059d5565,0x1432973f),LL(0xa9143049,0xbf133e93),L_(0x0000017e),
+ LL(0x355d9c01,0xa86b08e9),LL(0x4f81ab77,0x4d06707c),LL(0x8f1bf925,0xaaec66fa),LL(0x4de91bfe,0x49683907),LL(0xb9d75b89,0xac105bac),LL(0x91f21593,0x6506b77d),LL(0xab4390d7,0x7287e5ee),LL(0x7487ed45,0x6c88b2c6),L_(0x000001c1), LL(0xd0ceccec,0x11c071b8),LL(0x97c81ddb,0x1bbbfe37),LL(0xd3ad9501,0x7a1b3885),LL(0x68eaad09,0x7027528c),LL(0xf0a64aef,0xcf860284),LL(0x3c25fb62,0x37b3f120),LL(0x5ae492f1,0xd454de89),LL(0x61c7d5ed,0x02ac32db),L_(0x000001a3),
+ LL(0x3afa7fde,0x245c4af0),LL(0x97406073,0x02c143ac),LL(0xda94e70d,0x1c3ce7f2),LL(0x639942c8,0x9cde176b),LL(0x7bd79b38,0x0883b19a),LL(0xac9d2c91,0xb4709f2a),LL(0x4423fc39,0x794a6aaa),LL(0x89d178db,0x2e0aecc8),L_(0x000000c4), LL(0xd62ec51a,0xb872cf73),LL(0xd957093e,0x85b4776d),LL(0x2acbd72e,0x0656f9a4),LL(0xd468fb6e,0xe2017205),LL(0xc79f3d11,0xe6a367a5),LL(0x012b1362,0x73088cac),LL(0x370e3947,0xb86f1933),LL(0x3bdf96c5,0xe8162ca6),L_(0x000000dd),
+ LL(0x432ab140,0x9b09e656),LL(0xeb6d1849,0x81aa411a),LL(0xaae86725,0xd8ee02c2),LL(0x3008becf,0x574081d1),LL(0x53cb17df,0x37bd5637),LL(0xe3afcfbe,0x116f90cd),LL(0xe91cbaad,0x9a6da94d),LL(0x023933b7,0xbabdb470),L_(0x0000008f), LL(0x7351bde3,0xf3d722e1),LL(0xef4074df,0x2345ac8e),LL(0x1492cda0,0xe92886d5),LL(0x0fa0e7ed,0x31537a63),LL(0x0778badc,0xa8b49a51),LL(0x2034669c,0x85153992),LL(0xace88cb9,0xfd679e52),LL(0x4c6fbbf5,0x48dc5511),L_(0x00000167),
+ LL(0xe07de72e,0xe7ef2e60),LL(0xcd7037d9,0x52aa0cf6),LL(0x7dc7381f,0x24da2a63),LL(0xc3562613,0x43cb3857),LL(0xfa06da1c,0x5a1b2f21),LL(0xc7806190,0xec8d6d1e),LL(0xf2d57ff1,0x5a0e8065),LL(0x3e9088a1,0xc30f4ccc),L_(0x0000005d), LL(0x5dde7f70,0x5912141f),LL(0x1bc58b8c,0x19ee91c4),LL(0xbf2996d5,0x41d465ca),LL(0xb39d820d,0x281052af),LL(0x890d83a9,0xa8cb9903),LL(0x32dbf7a5,0xbfad3855),LL(0x309c32fb,0x81d1982b),LL(0x44dec521,0xe04b5e8d),L_(0x000000cb),
+ LL(0xb2b331bb,0xf141f663),LL(0x6c39f9cb,0x458b556c),LL(0xea205dcc,0xb6c66d04),LL(0x96d440e6,0xa0f1a8e6),LL(0xd4e4d37e,0x3d5c97ee),LL(0xd69c9913,0x92914c77),LL(0x12d04cdd,0xb8bb2a33),LL(0xa42c1185,0x2dee2451),L_(0x00000084), LL(0x8f1a5bb3,0xe8feb727),LL(0xf2ee4afa,0xb371de96),LL(0x0f971611,0x605c486d),LL(0x50e27936,0x313e3113),LL(0xdf801ab6,0x7cfe0fbb),LL(0xfbec3f73,0x50864708),LL(0x55057cd2,0x3b426634),LL(0xa56700f5,0xe23875b8),L_(0x000000de),
+ LL(0xf2c197f3,0x923016ac),LL(0x17eaa1a0,0x28e3f935),LL(0x128b1c02,0xa23b14eb),LL(0x9183c2c0,0x504289c9),LL(0x5ea313d0,0xb5fd0ea2),LL(0x135c854c,0x03f5e8df),LL(0x491bfca7,0xd9abdd7a),LL(0x8b6af733,0x29d5f4e7),L_(0x0000014e), LL(0x535e0af4,0x50113295),LL(0xb89fd770,0x861c50a9),LL(0x6fd08a16,0x1b7e4c60),LL(0xb1a9800a,0xadc9902a),LL(0xbed31f30,0xa5b9d65d),LL(0xc9a0a6d4,0x75c10264),LL(0xe1743115,0xc317e935),LL(0x8c13233d,0xc0c350f5),L_(0x000000d2),
+ LL(0xbd31c0b0,0xfdaa94e2),LL(0x4ea46af8,0x2200fec9),LL(0x3139256c,0x4f2fd88a),LL(0xb9b83d67,0xe894a212),LL(0x5e6f7bed,0x449c5bc8),LL(0xbeebbe0e,0x1e599f77),LL(0x74fc58a0,0x7f4a9123),LL(0x6073c6cf,0x1a08d5bf),L_(0x00000113), LL(0x2d5f04f1,0xacb45b52),LL(0x06826375,0xbd9c13b3),LL(0xf41e6cac,0xc5b15016),LL(0x79237672,0x2f2bfd3b),LL(0xa99e108a,0x1681dcfd),LL(0x22fd3033,0x224f0276),LL(0xc24a2525,0x05e14660),LL(0xf9a0ff9c,0x09f9360e),L_(0x000001fb),
+ LL(0x442343fb,0x1e2ff226),LL(0x33f17650,0x597f6cd8),LL(0x95759918,0x5f1a7fb7),LL(0xb518de41,0x316d41dc),LL(0x966644e4,0x829d89c6),LL(0x7775eaca,0xed7a513d),LL(0x9d45da4e,0xdd14ef8a),LL(0x232852aa,0xc016fff6),L_(0x0000002e), LL(0x7b230dd6,0x0791f95c),LL(0x2cc46d0d,0xd4641a73),LL(0x04775f23,0xb9dcdfdd),LL(0xc9bd9d15,0x727ace99),LL(0xaec6f67a,0xa77fe3e5),LL(0xeac1ee2f,0x75b923be),LL(0x8f21d632,0x55852cf0),LL(0xb6658853,0xbe6d4550),L_(0x000000e1),
+},
+/* digit=81 base_pwr=2^405 */
+{
+ LL(0x51c61dc7,0x2c6e3212),LL(0x0a1fff24,0x4b5a6256),LL(0xa45d5589,0xbc1ece0d),LL(0x852bc8f1,0x655945af),LL(0xf4152e99,0xf81d51a6),LL(0x4573b7d9,0x15c74818),LL(0x69e42e80,0x69dba53f),LL(0x55b2c206,0x96245123),L_(0x0000009f), LL(0x553b866e,0x11c96019),LL(0x8a5146d0,0xc8d9fabe),LL(0x6c8e83c7,0x3fede45c),LL(0x3d5d33f9,0xb87d2fad),LL(0xe1fe306f,0x67a48456),LL(0xf030c243,0x2aa7e6e9),LL(0xb8f59e2c,0x8097392a),LL(0x7ae2ecee,0xdbed7e8f),L_(0x000000e7),
+ LL(0x1e3892c1,0x8efeaf2d),LL(0x8c7ed96e,0xf3e2fab6),LL(0x3cb959b9,0xfe65989c),LL(0x4cec2e34,0xb397dfd2),LL(0x2a821089,0x95a4f7a7),LL(0x194fcfc2,0xcd183d4d),LL(0x009eac36,0xc2005f34),LL(0x384df54a,0xc4355ce3),L_(0x0000017a), LL(0x52880022,0x6218f15a),LL(0xab158f0c,0xc9db684a),LL(0x919d3c1c,0x22157c5c),LL(0x733c654f,0xa5d7e7c5),LL(0x1bb67f61,0x6dc89cd4),LL(0x0cac1f78,0xf6e74669),LL(0x2b55f183,0xb445fa4f),LL(0x9df41e4c,0x69c4dd42),L_(0x000001a9),
+ LL(0xcf794718,0xd8d9bdcb),LL(0x3dd4ca53,0x1306c74d),LL(0x1af7d8d5,0x3e680d58),LL(0x9c6b82f0,0x884ca0be),LL(0x0aacdba7,0x5c62e372),LL(0xd633f595,0x1c4cad9a),LL(0xc84d067a,0x54e3c550),LL(0x4fe24eee,0xbe3f67b5),L_(0x0000019d), LL(0xc026b9ed,0xb999b839),LL(0xd75cb7b6,0xa5275bc7),LL(0x5e6b4aa8,0xfaa9f40a),LL(0xe6b156cd,0x1992d1c2),LL(0x16e51f4a,0x0b180928),LL(0x00c94afd,0x6b3427a9),LL(0x0f9d0fb1,0x09eefa51),LL(0x098f98b4,0xd3cae463),L_(0x000000ae),
+ LL(0xd17fe65d,0x881adc31),LL(0xbb3a93b6,0x8ce1cba5),LL(0xb603dd9e,0x4f5b70c1),LL(0xaed8b0cf,0x5f958dd3),LL(0x5eae2517,0xb70f44e1),LL(0xa5b942f5,0xc526177a),LL(0x02efb949,0xc8dd1153),LL(0x132ba3a2,0xf9288a95),L_(0x00000189), LL(0xede20db4,0xc45972eb),LL(0xbc841aed,0x7853d5b1),LL(0x933a99b8,0x6e1536aa),LL(0x85259727,0x238abf3c),LL(0x05488fa0,0x8485ab11),LL(0x1debe07d,0x6d6f6d52),LL(0xf1ad18f1,0x54637f92),LL(0xdfd3c55a,0xa2b58773),L_(0x00000004),
+ LL(0xed1c0bc7,0x66d98564),LL(0x72366f09,0x9a3f0f97),LL(0x00008259,0xb1a9b87a),LL(0x33f3b0e5,0xe8074b36),LL(0xd83471a9,0x68f935c3),LL(0x59dc097c,0x5ab59d2f),LL(0x049d3329,0xae3c2a44),LL(0x523ad362,0xd39de2e5),L_(0x000000b0), LL(0x55bdbbc5,0x10a229a9),LL(0xad11b358,0xdcf6cbc9),LL(0x8a7d993d,0x2d5c5b91),LL(0x31b67dc1,0xd2d684f6),LL(0x5dd81c8d,0x29c17938),LL(0xec292f8a,0x2fb94c2a),LL(0xe9c267eb,0x67c899b3),LL(0x31e831bd,0xd72dd6a7),L_(0x00000058),
+ LL(0x310d60d9,0x37a99dda),LL(0xabc73772,0xb8a9bdaf),LL(0x18907ad9,0xac790211),LL(0xd35c8ab3,0x56550490),LL(0x483d71b5,0x9c473d52),LL(0xaed32863,0x796ddfe4),LL(0xc175ce1c,0x39329661),LL(0xf0af8692,0x3411279a),L_(0x000001f3), LL(0x085548fc,0x2f981ba2),LL(0xe7ed779e,0x25706bd9),LL(0x385062b4,0x8826d6b1),LL(0x50749b03,0x8f92597e),LL(0x4d1f3b1e,0xcc7ec8dc),LL(0x5ffacc7e,0xc4c11580),LL(0x903de537,0x82ed5c34),LL(0x92e3ccb2,0x829a6dc1),L_(0x00000197),
+ LL(0xc22b2da3,0x8a8271c3),LL(0x46e669a1,0x9bedd70e),LL(0x6dbeb99e,0xe5038aaf),LL(0xc8d58c8e,0xe202e790),LL(0x312f9e8d,0x5eb0a99d),LL(0x2b3b3990,0x6e033ac6),LL(0x8ddb53b5,0xdd9938af),LL(0xcad94c88,0x8fee9f14),L_(0x00000103), LL(0xe8c634af,0x2d18c7f7),LL(0xf6c9ab51,0xddec3950),LL(0xd2e14fab,0x8eb24aaa),LL(0x85f6d87b,0xbff04dfa),LL(0x7d46acbb,0x458d7c7a),LL(0x949d94f0,0x5596e98b),LL(0x60ee6372,0x37137ad5),LL(0x20231d27,0xe0d4f3a2),L_(0x0000006d),
+ LL(0x95b0fc9d,0x1f851427),LL(0x75a8973a,0xf65e532b),LL(0x125d27c2,0xb7e6ca7e),LL(0x680245ef,0xd37a1c1d),LL(0xc0ac3fa3,0xc8ed8871),LL(0x73ed1f61,0x25a3f922),LL(0x1c0619b1,0xbaaf99bf),LL(0x2fc151e1,0xb9c92ca1),L_(0x0000015f), LL(0x02c28006,0x4cd45f13),LL(0x46eca65c,0x2f16b28a),LL(0x181d940c,0xdae561c3),LL(0xdef08156,0xdb51b5db),LL(0x5aff9fff,0xd7d0f3f0),LL(0x56731470,0x9f642167),LL(0x3e4323b0,0xc5c736fd),LL(0xc2c256f1,0xaf757eba),L_(0x00000046),
+ LL(0xe3fa203a,0xfc825ff9),LL(0xa28756a7,0x6fc9ac38),LL(0xf07539fe,0x19a8908a),LL(0x89d74956,0xc69dedbb),LL(0x934712d9,0x2aaee4e8),LL(0xbbd47741,0x1053c866),LL(0xda8058c4,0x00b68d70),LL(0xc019bbaf,0xb1236281),L_(0x000000ad), LL(0x7020f123,0xad679598),LL(0xffe5c58c,0x5fe8d191),LL(0xfb4d9415,0x46edaa9c),LL(0x44747329,0xdd0f1cc6),LL(0x34e406e5,0x79f7cddc),LL(0x40ad1213,0xab39e94c),LL(0x470ac094,0x885cb3a4),LL(0x12891647,0x3224c564),L_(0x00000150),
+ LL(0x5baed419,0x17473053),LL(0x116c3934,0x97765c7e),LL(0x74d1a056,0xf7e7734d),LL(0x2fb92919,0x22455583),LL(0x880ac302,0xc6198a57),LL(0xc983ea10,0x32d7f501),LL(0x3adab6b9,0xa4c1c306),LL(0x3997a013,0x14822e84),L_(0x000001b6), LL(0x1a3dfcbb,0xf8efc5c2),LL(0x2e766181,0xda380c24),LL(0x158c4baa,0x4d96447c),LL(0x6acaba32,0xe953e90e),LL(0x4ed2e3bf,0x86ffae71),LL(0x452c6d1b,0x3af83523),LL(0x49a52fe9,0x41a86c00),LL(0xec5b4f72,0x9c65d29c),L_(0x0000011d),
+ LL(0x3e3efd7e,0x15231af9),LL(0x83eb4905,0x29b6e8f6),LL(0x35420b50,0x76561721),LL(0xd8dddbf9,0x83f7c4f4),LL(0x776812d9,0x460a8666),LL(0xd3c1656b,0x6901dcbc),LL(0x22e1e397,0xd9c17a67),LL(0xd83adc99,0x7a32d3cd),L_(0x000000d0), LL(0xe72700dc,0x66102687),LL(0x8578e51e,0x957c6151),LL(0x9a86b387,0xb2bd85fe),LL(0x553c599b,0x21884750),LL(0xb8b8c27a,0x920c65b6),LL(0xf81924dd,0x6f14a6d0),LL(0x28619568,0x18db08c4),LL(0xab2d8a3f,0x11b85385),L_(0x0000015a),
+ LL(0x880a5659,0x5aa706e4),LL(0x0e7a9fe5,0x2110fcf2),LL(0xa8b2d6f6,0x67bdfcf9),LL(0xeaac5dca,0x0435935d),LL(0x39631926,0x399fbc31),LL(0x60795bd1,0x34625175),LL(0x0f561153,0xced09fb3),LL(0xe23ff49c,0xf1b45cd7),L_(0x00000126), LL(0xb5ed6363,0x4ec88551),LL(0xd20c517f,0x3c8be0dc),LL(0x221ae5ee,0xd895d43a),LL(0x6705afa1,0x00fa5270),LL(0xb373ab4d,0x75678bdf),LL(0x64e2886b,0x47650c25),LL(0x7e0e12f4,0xab5c87d2),LL(0x0c9aec40,0x15ef4537),L_(0x000000e3),
+ LL(0xfd1186f9,0x69bd1ae9),LL(0xe2ef5aee,0x0585cc2f),LL(0x1e6188c6,0xa3c01465),LL(0x301c46a3,0x1cc1ea41),LL(0xf7f76048,0x16944109),LL(0xedd90482,0xdc473809),LL(0x3da1ef77,0xf7267c80),LL(0xfefdbcd3,0xfd92f40f),L_(0x00000037), LL(0xbd7e42e8,0x365d3aae),LL(0x5f29db47,0x93437f82),LL(0xd2267583,0xf4a57394),LL(0xe0388ea5,0xb28bca60),LL(0x5cea0f68,0xbf640edf),LL(0xc68dbd2f,0x8db4f9b6),LL(0x24be537f,0x9d943d05),LL(0x7704cfe6,0x4a1f249a),L_(0x0000003e),
+ LL(0xca968ae2,0x15eb727b),LL(0x79b64a1c,0x82dd22e4),LL(0x51a73cb4,0xa1e0df42),LL(0x5140d8ce,0xf6d38530),LL(0xe8523991,0xbf2d199e),LL(0x578593ff,0xaabd945b),LL(0xcfef51c1,0x789ae01d),LL(0x9c35735e,0x685cad78),L_(0x0000015a), LL(0xa7f90d48,0x9ac2d994),LL(0x5bf21520,0x5119208b),LL(0x3671fecc,0x477379bf),LL(0xcfbe3b2b,0xdc4fe9f8),LL(0x98a8aee0,0x6e915903),LL(0xa7edc740,0xc4cb91a1),LL(0x71211193,0x1e307364),LL(0x96026ba1,0x814b8b56),L_(0x000000b1),
+ LL(0x6b636a3e,0xdfef19d0),LL(0x30a583d8,0x8521445c),LL(0x192a3c38,0x8651795c),LL(0xe24d5be6,0x6cfd9cef),LL(0x273daff4,0x78499d8a),LL(0xbe3d67fc,0xf4d9c05a),LL(0xfff37ca4,0x9d03588e),LL(0xbe977f9e,0x2b3a2963),L_(0x00000043), LL(0x5504ebb6,0x6c46a157),LL(0x146210b3,0x092ba668),LL(0x00fc64e7,0xcfe9730b),LL(0xc41f8e66,0xc11dab42),LL(0x79417f9d,0xff89645e),LL(0xddf57c66,0xd0e35f15),LL(0x98273f3c,0x49f211d9),LL(0xea35684c,0x1b8dcf07),L_(0x000000a4),
+ LL(0xa5cf0865,0x9d8b99d3),LL(0x7dad9f18,0x96f2ea6f),LL(0x96139562,0xf5d410b4),LL(0x86c29eba,0xc6b1f46d),LL(0x2dbba6d4,0xb1709ad9),LL(0x9de07504,0xeea80cc0),LL(0xc7c9ec95,0x47d01eb6),LL(0x99076486,0x19b1d6cd),L_(0x00000139), LL(0xe61ba7e9,0x0a5f9f34),LL(0x53cc24a0,0x5e367eff),LL(0x672781ea,0x275cfce0),LL(0xedc5266f,0x92d98139),LL(0x0d9e2099,0xc2c0efd5),LL(0xf3d9cb26,0x687bde18),LL(0x647d23fe,0xd97b9ccb),LL(0x0c54a71a,0x258eaff2),L_(0x0000007a),
+},
+/* digit=82 base_pwr=2^410 */
+{
+ LL(0x99ea3941,0x30cbad8f),LL(0xfa23022a,0x0f3c6cf3),LL(0x9f3a186b,0x33420e3c),LL(0xdc6e922b,0xbffbbdb1),LL(0xeac227c1,0x7aa59cde),LL(0x43d5b878,0xe3673dd9),LL(0x513a5be5,0xae77a5b5),LL(0xbc4c0fef,0x8e4c10fc),L_(0x00000151), LL(0x28229a86,0x2a245057),LL(0x020fe0ed,0x5e8e914b),LL(0x39e8625b,0xdbd2dbf4),LL(0x3dfac893,0x5bf5b95c),LL(0xc2cfde2a,0x29c6d879),LL(0xca30a315,0x05a9a75f),LL(0x3ac05ce9,0x894b84cf),LL(0xb5445553,0xeb87696c),L_(0x000001c2),
+ LL(0x6bc3c710,0xf9b134fd),LL(0x05a92256,0x23245303),LL(0x7ccfce0b,0x6d8cb621),LL(0xd61ca36a,0x6d0ef54f),LL(0x210c1e23,0x1a182b1b),LL(0x8ae4f253,0xb1f2e2c4),LL(0xa16671b7,0xd29f38da),LL(0xae1cf556,0x3fa6c8ea),L_(0x000001c8), LL(0x7396e499,0xb9a18df6),LL(0xa098406d,0xd588a978),LL(0xd15a5ed3,0x781ea818),LL(0x5e68786d,0xad06fce1),LL(0xf98680c4,0x66d7a550),LL(0x981589bd,0xd3ff4140),LL(0x7ff83976,0x6ffe6dff),LL(0x9c88eabc,0x47479f18),L_(0x00000116),
+ LL(0x71975c6a,0xdb783254),LL(0xe1b91784,0xcc2bd843),LL(0x7a80b2cc,0xda0b8166),LL(0xaa3b4ff9,0xaff9f442),LL(0x88dcdac5,0x38067551),LL(0x47d782df,0xba990049),LL(0x82a02e17,0x02eb92a1),LL(0x61467fcd,0x29ea45e3),L_(0x0000017b), LL(0x7050f019,0x15b7f2b2),LL(0x3170353b,0x4a58e306),LL(0x4a6890e8,0x0dcaea11),LL(0x2ee85176,0x198b5c45),LL(0x79793d5c,0x9872dd7c),LL(0x5ad3ba16,0x2940cc17),LL(0xacaf46a5,0x9d812262),LL(0xb1cff849,0xee571706),L_(0x0000000f),
+ LL(0x78fb5075,0xeb0d7e33),LL(0xb0731c42,0x657bac9b),LL(0x5dc372a3,0xd967282a),LL(0xa9374ab3,0xf9ac8856),LL(0xbdf21057,0x3b740967),LL(0xfec8274b,0x56933024),LL(0x5596459a,0x94a16871),LL(0xc8d21c17,0xef7bcfc7),L_(0x00000098), LL(0xb0a89f08,0xf9af7b9a),LL(0xbfd8b660,0x7b728a24),LL(0x9cb13ed9,0xee5e0227),LL(0xa450fd15,0xbd3b7d28),LL(0x972ff1fe,0xf367bf5b),LL(0x08f71ea2,0xaa4191b6),LL(0x496276ed,0x52d016bf),LL(0xc4a6a4c1,0x52e7dadd),L_(0x000000bf),
+ LL(0x78e99bd7,0x1afab699),LL(0x049e7f00,0x88380090),LL(0xb4090ebe,0xfc780e00),LL(0x9088eeb6,0x294d8c96),LL(0x7d582ac2,0x4027746c),LL(0x5e897916,0xc4fa7517),LL(0x24defc92,0xb30f7062),LL(0x7efacebb,0xe29a1ed9),L_(0x000000b6), LL(0xf3cced8f,0x856dc4c3),LL(0xee3e4e0d,0x6b56aa33),LL(0x971e660f,0xb6b834b0),LL(0xabff8d16,0x4f4e4f36),LL(0x791ab99f,0x1407b72f),LL(0x49828107,0x81293d19),LL(0xdc829510,0x1f2a3c51),LL(0x359122da,0x3bfa8d54),L_(0x000001db),
+ LL(0x6ad994ce,0xdf15ca96),LL(0x121949d5,0x705e6cb5),LL(0x15f3e1fa,0x844205ea),LL(0xda2168d9,0xb4128cbd),LL(0x793edfff,0x751feb1f),LL(0x332f4e92,0x4c804349),LL(0x4429da30,0x26bc232c),LL(0x8cea38b7,0x753baf61),L_(0x0000013c), LL(0xe7083ee5,0x88e43827),LL(0xb46e7eb4,0x41b7f39b),LL(0xc6fd29ba,0x98261154),LL(0x4974c56e,0x502ce35f),LL(0x0efcc622,0xad5a1de8),LL(0xfd41558a,0xa51d36ff),LL(0x1a681fdd,0xf2ea91c6),LL(0xaa082cc2,0xf7b13d69),L_(0x000000ed),
+ LL(0x0c38ee14,0xa66a52a8),LL(0x208e5e12,0x9cf1d09b),LL(0xa19a455d,0x4d39c2fb),LL(0xbd4d9e44,0x0adaf826),LL(0xd068570e,0xfd187cbc),LL(0x93225311,0x2398aca7),LL(0x490180a0,0x2dcbb906),LL(0xcee10c1a,0x40723e9c),L_(0x000001fc), LL(0x26d6a477,0x0caf9248),LL(0x7f7fda0a,0x722d1676),LL(0xbe8a621f,0x96407066),LL(0xe524661e,0x3a360a23),LL(0xaa8ac484,0x22dc1578),LL(0x9532f3a1,0x70f20b2b),LL(0x936a98d0,0x4e640ba5),LL(0x10c24716,0xc78e13ef),L_(0x000001ab),
+ LL(0xc4c781ab,0x8ced176d),LL(0x49979e6d,0x1d8f2f21),LL(0xb3c390a7,0xd1cc9018),LL(0xff49ec42,0x805d407d),LL(0x56592d13,0xb92c79f6),LL(0x69b4fae8,0x7816250a),LL(0xea40b75d,0x9c23c189),LL(0x98e49fbb,0x012080c6),L_(0x00000030), LL(0xf3d27ef2,0xde297ec2),LL(0x394adc76,0x39d2e9b4),LL(0x084a2dca,0xa4a3c98c),LL(0xff54162f,0x4df52d9f),LL(0x847a48de,0xa6af6c27),LL(0x9a4d9dcc,0x128a4972),LL(0x96ed3609,0x8323c41b),LL(0x0a200116,0x81fed229),L_(0x0000011e),
+ LL(0xa657dd9b,0x20d87189),LL(0x08f2635f,0x6ccede28),LL(0x6b5f8018,0xc2a0e842),LL(0x1a1eaa9e,0x09c6bbfb),LL(0x590c83ae,0xba912027),LL(0xb05367b2,0x98c59c39),LL(0x363d5716,0xc607367d),LL(0x2738b72f,0x76fa4bf8),L_(0x00000080), LL(0x7042e613,0x04011fd9),LL(0x6b33299c,0x42860e67),LL(0xfb00a1e0,0x95c30a5c),LL(0xc7ee4546,0xc597748e),LL(0xbb5a242e,0x3ed03861),LL(0xf0e0361f,0x87708c93),LL(0x2149d193,0x7590a638),LL(0x483134f1,0xc66e8a9d),L_(0x00000176),
+ LL(0xd5f27f39,0x3813f012),LL(0x5ffac9a4,0xc0d4789d),LL(0x3e79348e,0x955e2b14),LL(0xdb2d28b7,0xe25f9f8b),LL(0xc1656e1c,0x6715563b),LL(0xec42f2f4,0x79f7e28f),LL(0x2aead585,0x106b8506),LL(0x201ba118,0x7f8c385c),L_(0x00000033), LL(0x4d129b93,0x0507ebcf),LL(0xa8ba08d5,0x035af551),LL(0x5db82217,0xe87f61ae),LL(0x97aaf3ee,0xeaf13d4a),LL(0x5f02aeda,0x0476d73b),LL(0x05c9a1af,0x8d9103dd),LL(0xbbd0da23,0x4b324ed6),LL(0x4516539b,0x0edd4904),L_(0x000001b2),
+ LL(0x7ae64cdd,0xfad3e533),LL(0x9fbd42a4,0x2540903f),LL(0xd7649f2b,0xd8fbba0e),LL(0xc6189edd,0x6a06d4e6),LL(0x1ecce6bf,0xcbba2a3b),LL(0x5c61ec36,0xdb49be34),LL(0x447d3062,0xe4b0ad6c),LL(0x49fc7fee,0x1394cdb0),L_(0x0000018e), LL(0x1b4e3c31,0x1172029d),LL(0x30a8e021,0xbd509669),LL(0x6f8f7c76,0x34a06ccf),LL(0x28f39de2,0x1f805a36),LL(0x5b84e8ae,0x95bcde27),LL(0xa9d053ba,0xd196b2b5),LL(0x4777e8cb,0xbc21fa82),LL(0x1bd75421,0x58e2b8c6),L_(0x00000120),
+ LL(0xf6fda5e4,0x7a23ceea),LL(0x51aba8d2,0x241c7fb7),LL(0x58878762,0x60069d96),LL(0x51c9d281,0x30ade2dd),LL(0x9b631718,0x91c3eb50),LL(0xf909879a,0xca8dcb86),LL(0xee7eb48a,0x9244bc3d),LL(0x3828bf79,0x2a064705),L_(0x00000120), LL(0x2843df98,0xa015f7fc),LL(0x3ba48f85,0x2b6a12f5),LL(0x95ae129c,0x444e10a6),LL(0x8aeddb2a,0xecfba54d),LL(0x0e8bdf6a,0xc7c39b4f),LL(0x0a72c4d1,0x73b3e601),LL(0x5cdfd0f3,0x99b50a0d),LL(0x5168c9e0,0xbed1929d),L_(0x000001c8),
+ LL(0xac116c7f,0xa9be603a),LL(0xd22b9ef5,0xc53e7872),LL(0x9558bd84,0x154e0475),LL(0x65401d38,0xbb71dcda),LL(0xf42190a1,0x79891c59),LL(0xcce4f8f7,0x3876a596),LL(0x5ec40734,0x91d0b32b),LL(0xef02bcea,0xe2d3dc41),L_(0x00000083), LL(0x290b052f,0x48a15725),LL(0x7ac11538,0xde31cc2a),LL(0x59724de2,0x949e5fc7),LL(0x1c37f0ed,0xc39190ad),LL(0xc058927a,0xb63be947),LL(0x6bda54d7,0x1d0ceb2d),LL(0xcff0cf31,0xac38d621),LL(0x23f872f5,0x04b46672),L_(0x00000119),
+ LL(0xf8c3ff8b,0x13238feb),LL(0x8c998602,0xca47bfa7),LL(0xebe29b0a,0xe22527b3),LL(0x7f9eebf4,0x127b07f2),LL(0xa6e2939d,0xca0c1812),LL(0x6469e55a,0x65afd9e7),LL(0x46a7771a,0xf84da7e1),LL(0xbd0864a1,0xb5dbfbc9),L_(0x000000c0), LL(0x89796136,0xb3a29f77),LL(0xbf5bf543,0xb2d15c04),LL(0xd9bcacc1,0xb632b37f),LL(0x5041f46d,0x9bed186f),LL(0xb690ffbb,0x4873f91b),LL(0xeebd39f1,0xff2ad723),LL(0x79a50cae,0xd0c46d7f),LL(0x6b3bea02,0x4a5b4d01),L_(0x000000c1),
+ LL(0x59fc0874,0x0bb28261),LL(0xe9314bb7,0xa04bdd40),LL(0xaab60946,0xe0b7c3f9),LL(0x20cc2e25,0x1e792761),LL(0x60fd58e5,0x7823f278),LL(0x561086d3,0xfa3bf02e),LL(0x7b6170af,0x0390ab9e),LL(0x4a18459c,0x0c346fa4),L_(0x00000089), LL(0x1b1fad83,0xb623e6eb),LL(0xe73d3d7e,0x43490dbf),LL(0xc1f1a1fd,0x49e9e831),LL(0x0a18b7b1,0xe619f992),LL(0x0c6e526d,0xdb9252a1),LL(0x954cd738,0x6a826c49),LL(0x41105a8b,0xddcbb9cf),LL(0xe9217743,0x750efcbf),L_(0x00000193),
+ LL(0x83ba5b5f,0x90c2c466),LL(0x57128a20,0x1345257c),LL(0xdbf610a8,0xd16c4a33),LL(0xbff009fd,0x8f1d5b65),LL(0xb49af8c7,0xf560ad02),LL(0x0eb8499d,0xfb45ea45),LL(0xa52dc630,0x7e352023),LL(0x8ada8ac5,0x2fd6cb3d),L_(0x000001b7), LL(0x9d102023,0x8f6d7783),LL(0x4a52a42a,0x3f44af1f),LL(0x4175b2fd,0x05fe7f14),LL(0x079ac149,0x1757d0c0),LL(0x475fac70,0x88ae6d1c),LL(0x7bfd9387,0x33f3d56b),LL(0xb7dbf13b,0xcacad131),LL(0xebd1df20,0x8aef62c8),L_(0x00000009),
+},
+/* digit=83 base_pwr=2^415 */
+{
+ LL(0xa0c45001,0x96fd03e2),LL(0xf3f782f7,0x0bf4ad5c),LL(0x3ffeae62,0x8514f603),LL(0xe39ca015,0x5633e085),LL(0xa88f4e54,0x94884fbe),LL(0x85fc77f2,0xf605882a),LL(0x2678c646,0xa505f9b1),LL(0x799ba323,0x23217b43),L_(0x00000092), LL(0xf4170bf2,0x032e8744),LL(0x29194f6c,0x6cab181a),LL(0xa932a791,0xf60ec063),LL(0xb94fb0f9,0x217a0ff0),LL(0x8f066aff,0xd03ea56b),LL(0x56ee8b26,0xc1ffed4a),LL(0xefbf8ce2,0xed130515),LL(0x922eb114,0x74474339),L_(0x0000003d),
+ LL(0xd1837634,0x88affb50),LL(0x5fc7f37a,0x170a0c1c),LL(0xa1f73a2f,0x83474ff9),LL(0xea811929,0x4738ed4f),LL(0xdd78686b,0x24d293dc),LL(0x16188a23,0x36670cd9),LL(0xc585fd52,0xa2e54dbb),LL(0xd3b67188,0x10b37344),L_(0x000000ed), LL(0x6336003d,0xb4548b08),LL(0xfbe0b348,0xad120991),LL(0xef3cdca5,0x034c9a59),LL(0xd16cfcd2,0x56699960),LL(0x10f2524f,0xf6df1f5f),LL(0x4733c5f1,0x98a50032),LL(0x757f84ed,0x2ce4fa9a),LL(0x032f7eec,0xd296f3ba),L_(0x000000e3),
+ LL(0x5b81d69e,0x4c96fb7e),LL(0x71db44c9,0x7ac3b1c1),LL(0xe9e2107d,0x6305a422),LL(0xa60259b2,0xc0b70492),LL(0x17e1f71b,0x3dedfaf7),LL(0x57f8d178,0x15a8c62d),LL(0x7a704e50,0x81a4724b),LL(0x3b26accf,0xdf992c3c),L_(0x000000a0), LL(0xe21a6ddc,0xe35cce3f),LL(0xc9cc0ded,0xc51c6e93),LL(0x00949cad,0xba4d9081),LL(0x8de8b3c3,0x274926f6),LL(0x839aef68,0xf13d3b8a),LL(0x40a2e3c7,0x90113a91),LL(0xef4e7433,0x1f472807),LL(0x8320657c,0xd4accc1a),L_(0x000001d6),
+ LL(0xb32007cb,0xc34e9382),LL(0xcd77eae7,0xad7f0d81),LL(0x13604a2d,0xd0e3fde5),LL(0x70443d13,0x6cb59871),LL(0xc5f3e64c,0x7a8441d1),LL(0xadfd909c,0x00532361),LL(0xefba7861,0x0eb9abb4),LL(0x05155907,0xee4fe6fb),L_(0x00000108), LL(0xa4f6cc8a,0x7579200c),LL(0x128ad5ec,0x49006579),LL(0xc2659737,0x8cf2fa39),LL(0xc9df0a7f,0xdb548c37),LL(0x648b652d,0x3da31069),LL(0x075eeef1,0x34916a7e),LL(0x04d0e409,0xea6b7825),LL(0x08fd613b,0xba92eb2c),L_(0x0000015b),
+ LL(0x3dfeb0af,0x47521ca4),LL(0xc24e86b5,0x555d9a6b),LL(0x572924ea,0x878c09b9),LL(0x379539ca,0xb6b82a15),LL(0x8666f974,0x72ba5827),LL(0x2d9ff656,0xb17ece57),LL(0xc68cfdb5,0xfe917da6),LL(0x22f34e2a,0x08992968),L_(0x00000021), LL(0x174d7bcd,0xf77f07dd),LL(0xba763f11,0xf3886c72),LL(0x11e3d2aa,0xa4c6b62d),LL(0x550a0527,0xe4eac1e4),LL(0x6a7880c8,0x9b86f1e0),LL(0x00ea68f4,0x87cc2f01),LL(0x55e1d3f3,0xa6daef73),LL(0xa5a26f0f,0x2061095b),L_(0x000000d8),
+ LL(0x4a4107d1,0x8b5ab4da),LL(0xbf85411a,0x7b991f0d),LL(0xa933992a,0xce47a748),LL(0xc820accd,0x662f2eb8),LL(0x12508cc5,0x964b5fdd),LL(0xadddfe6b,0x1358db73),LL(0xf97a44a3,0xfefeacaa),LL(0xf544c5dd,0x3a084f6f),L_(0x00000140), LL(0xec21428a,0xa4ad406f),LL(0x54cddbeb,0xec844e89),LL(0x92a7fe19,0xa4c49f5f),LL(0x30484bff,0x8eb76b96),LL(0xf75a70ec,0x414948f0),LL(0xc139503c,0x7606dff2),LL(0x2fdf031b,0xead62083),LL(0xc5fa11a5,0xf7a1eba7),L_(0x0000007e),
+ LL(0xe0553aec,0x7ec431d8),LL(0x2ebaaf47,0x3c1a318b),LL(0xd9561acd,0x57cb3287),LL(0xf1f803a4,0x97882cee),LL(0x97ac71c6,0x08071010),LL(0xf26f5efd,0x60ed1a2f),LL(0xe4333f2a,0x76efc905),LL(0xc5d26fd2,0x4101ca9f),L_(0x0000013c), LL(0x3f266f96,0x75779876),LL(0xf709921a,0x294a8042),LL(0x5ab89053,0x0dc515ed),LL(0x5f21558b,0xd5146f68),LL(0x1cdf8e37,0x8dcdaaee),LL(0xe4930f54,0xacb8f4a6),LL(0x58634cb4,0x507294c8),LL(0x20ac12b8,0x38b15ebe),L_(0x000000ba),
+ LL(0xbdb35346,0x6973a3da),LL(0x5d8f611c,0x3f4e86dd),LL(0x799bf33f,0x749fb625),LL(0x4a326f63,0x667bd358),LL(0xa8161392,0x060fa9fe),LL(0xa3a8de55,0xc4af999e),LL(0xdd75d71a,0x18b1e644),LL(0xc8783194,0xe995c857),L_(0x00000067), LL(0x52eb541b,0x32c7afa5),LL(0x22bb4a07,0x08c59a72),LL(0xc7e0e1a6,0xe1132506),LL(0x1fa09057,0x5c6a1998),LL(0x6b7bf39c,0x41920509),LL(0x8ab7490c,0x462ba7d3),LL(0x9e016ba7,0xdc3595d9),LL(0x1207f474,0x6a3d8c9f),L_(0x00000063),
+ LL(0xb27c0a7b,0x2b8fd9cd),LL(0x606dd096,0xaea5acbf),LL(0x3ef0fe25,0x4859d96e),LL(0x078a8287,0xf923a972),LL(0x0d66d4df,0x660fec36),LL(0xb27b9ec1,0x102d1cc4),LL(0x1d991f63,0x730fac93),LL(0x0c8cdfad,0x601a8644),L_(0x0000005b), LL(0xb0aea91e,0x55d58869),LL(0x0d313b90,0xde263f83),LL(0x11dbdf4c,0xcde2808c),LL(0x824b53bf,0x6aad6afb),LL(0x94547c69,0x864c21db),LL(0x6771d459,0x65c1681d),LL(0x7f15bc35,0x95681ca9),LL(0xeac68bf9,0x78f00d83),L_(0x000000db),
+ LL(0xf35f241d,0x2f058d88),LL(0xb2e8d253,0xaca02a59),LL(0x15502597,0xbd7d1caf),LL(0xa0dfb1e8,0x680e361d),LL(0x9355f155,0x2ed31cfd),LL(0xb0064d2b,0x308047c0),LL(0xf348830f,0xbffaf7d4),LL(0x7bb7440f,0x553b98e1),L_(0x0000005a), LL(0xb6375708,0x9f0f6eac),LL(0x25881bc3,0xa7105d49),LL(0xd655e7e9,0x033db883),LL(0xdc82f09a,0x7d5a4975),LL(0xa17847e9,0x4036e619),LL(0xe9b20930,0x048479d0),LL(0x34fdadf8,0xe6c7daa4),LL(0x19412216,0x152f330b),L_(0x000000eb),
+ LL(0x6fe66f8e,0xc41a7939),LL(0xcb26a326,0x78d31411),LL(0xa365755c,0xd3a391dc),LL(0xe18d1f8e,0x25f34512),LL(0x72a34b02,0x345c60dd),LL(0xd3613f12,0xe2be6e2f),LL(0xee2aebd8,0x116aa632),LL(0x92435b38,0xa7cff2c3),L_(0x000000c9), LL(0x3f4fa083,0x342a1414),LL(0x9da3251e,0x650f3cbb),LL(0x1c4cfe7a,0x93ddee66),LL(0x90734ecc,0x1551811f),LL(0x6d901fe7,0xcc1cef07),LL(0x0c7d5cd4,0x3cf5fe87),LL(0xf0de3068,0x628a5bd8),LL(0x56e883b0,0x077d4d10),L_(0x00000195),
+ LL(0x8e2db279,0x2d362cca),LL(0xfb4260cc,0x99614b58),LL(0xe2d527b8,0x67cb8aa3),LL(0x08c1f0b4,0xef71b82f),LL(0xc4649ad1,0x4dc68072),LL(0x11a9313c,0x1ac298aa),LL(0x65002fbe,0x9f237961),LL(0xe90bf539,0x537dfdd6),L_(0x0000004b), LL(0xade2b535,0xfcf6c830),LL(0xf2e76469,0x4ed4174a),LL(0x51f1bc5f,0x3a450f7e),LL(0x83c0406c,0xb53708a6),LL(0xaa7dce02,0x2428a6e3),LL(0x44b377b6,0xf1abc0df),LL(0x9c1a58f5,0x0f02c35e),LL(0x27c5458b,0xea8718da),L_(0x00000116),
+ LL(0xedc91665,0x1709bab6),LL(0xd1568e14,0x5208725a),LL(0x11bb7351,0x3937bb45),LL(0xe6e5c9ed,0x51ec95b9),LL(0xcf7661c1,0x2e23be41),LL(0x6ad385c7,0x743b0e8c),LL(0xe91385d0,0xdfe84bbc),LL(0x6fd97535,0xdce16477),L_(0x000000c9), LL(0xdbe30fec,0xef8587b7),LL(0x0e47600f,0x8f375855),LL(0x6859ef6b,0x529ee446),LL(0xc03de2c7,0x84c625e6),LL(0x6f7cbb53,0x3af54a02),LL(0x29eb9d15,0x37cbf19d),LL(0x750b2d9f,0x2dc61071),LL(0x28f78635,0x6b20c9d0),L_(0x000001cc),
+ LL(0xc05c59ca,0x78134d37),LL(0x3d575868,0x09f53723),LL(0x6cf5af74,0xfc4fd018),LL(0x39a8ae6d,0xb54df4cc),LL(0xb1d402e8,0x25f3046d),LL(0xeece717b,0x98af312a),LL(0xa13a0c5d,0x5f96c47d),LL(0x7f73d630,0xc80a3e3a),L_(0x00000187), LL(0x516f5d07,0x7f27d5a2),LL(0x38bbf8fa,0xc4360f93),LL(0x2109c7d0,0xe57b26a1),LL(0xeea6004b,0x32aad5ae),LL(0xf9dededa,0x341aa5da),LL(0x6abc8307,0xfdd6b0a1),LL(0x88080bda,0x4cecd6e0),LL(0x1d4fa881,0x24b2b7fe),L_(0x0000015f),
+ LL(0x923ad134,0x9a724982),LL(0x5ec2d29e,0xa69853d7),LL(0xd1a7ff3b,0x4e7a173c),LL(0xffeab3d8,0x9f30735d),LL(0xdf72352a,0x92186213),LL(0x469f7a55,0x2d184184),LL(0x15c208a0,0x29514acf),LL(0xa37b763a,0x91393991),L_(0x0000015b), LL(0xfb958196,0xa16bd801),LL(0xf0588b07,0xc8dafbba),LL(0xda133516,0x3aebd875),LL(0xf622ae4f,0x34fb368f),LL(0x4f336c4d,0x0b5d9d6e),LL(0xc6eb3519,0xa586248a),LL(0x6d28f06f,0x6daf558c),LL(0x2f3e52a1,0xfb60040b),L_(0x000000b3),
+ LL(0xd74494af,0x05cc19d6),LL(0x6d31ebaa,0x2f30e929),LL(0x3edd43b0,0xc72cbbb4),LL(0x827c79aa,0x7829df3e),LL(0x4e4cf8d5,0x98bb6262),LL(0xffe745fb,0xad894f05),LL(0x50b350aa,0xb566ef19),LL(0xf2ea5e2d,0x37f6dcf4),L_(0x0000001e), LL(0xe7f3c59f,0xfa34202e),LL(0xd748da48,0x68fd9ed5),LL(0xe1cf505b,0xc7778cb3),LL(0x3af31b86,0xdadb4507),LL(0xfe717fdb,0xb4b6e80b),LL(0x13036b30,0x2c3f1ee4),LL(0x482b138b,0x4fc01593),LL(0x71e1ed1e,0xd788bd27),L_(0x00000084),
+},
+/* digit=84 base_pwr=2^420 */
+{
+ LL(0x836ce2cd,0x7d9afb73),LL(0x1c085462,0x2eb9d35d),LL(0xacf6649f,0x38a8a9ec),LL(0x095acf4c,0x78be52c0),LL(0xf7d7ea21,0x48f6e06d),LL(0x115ce7bb,0xbedc8285),LL(0x7f232680,0xe51e8f4b),LL(0xd24103a6,0x09aa0bc0),L_(0x000000aa), LL(0x39f42b13,0xe11c4bc5),LL(0xf757159c,0xbc8d09f1),LL(0x0e9e10c0,0xe3621884),LL(0x60d7345b,0x822e5e0a),LL(0xddc802d1,0x6ae792ac),LL(0xf49763d7,0x868a6be0),LL(0xff0f1717,0x7cae1bcd),LL(0x69443786,0x8bfe19f2),L_(0x0000010e),
+ LL(0xb02326b4,0xe01b8994),LL(0xe496416a,0xa213f31c),LL(0xdc0825ce,0x0281aa93),LL(0xe4450bdf,0x236853f9),LL(0xc8c09e59,0x841e294d),LL(0x595c72a5,0x1e14b03a),LL(0x2bc6e538,0x46b3008c),LL(0xef20b035,0xa57d1874),L_(0x000000ec), LL(0xe5948afb,0x5951a61c),LL(0xd36a1693,0x5b84b925),LL(0x1712f765,0xc1e05016),LL(0xa422f3fd,0xa758020b),LL(0xb022819a,0xb6927405),LL(0xfced2aa8,0x13a79822),LL(0x9ae63d93,0x87cbebb1),LL(0xcdd9c078,0x13e45feb),L_(0x0000005e),
+ LL(0xe4998422,0xc434f1f7),LL(0x878049fe,0xf0c9ca48),LL(0x692a3fe1,0x277fbbb0),LL(0x7ad48261,0x263dc0fe),LL(0xc6fec032,0x7e09052a),LL(0x04d38aeb,0x37fd6838),LL(0x6c55fb12,0x53925e9d),LL(0x63bce4b4,0xc33e2d82),L_(0x0000016a), LL(0xc6d3730d,0x70a764c5),LL(0x705b2adb,0xb9f1bed9),LL(0x3bab4631,0xb4850149),LL(0x37a14535,0x2385e829),LL(0xcd9ea79c,0x07aa5ebd),LL(0x17e5b5eb,0xd3216565),LL(0x8fb6885f,0xc6b2bd87),LL(0xce87f791,0xd44bfcfc),L_(0x000001ca),
+ LL(0xda995024,0xd4a7c1bb),LL(0xad86ee95,0xf741fd13),LL(0x1edd6ede,0x85b8fada),LL(0x08912214,0xb65b3c0a),LL(0x30092262,0x3583aac0),LL(0x6716727e,0x817eec2e),LL(0xd6729d8a,0x33bfe296),LL(0xa92ad342,0x779921dc),L_(0x00000006), LL(0x0bc37c31,0xc1373f0b),LL(0x5632a2bf,0x2c2b1683),LL(0xa8cd4f47,0xa4cedeb1),LL(0x32a4b6c9,0x180690c1),LL(0xfa510c76,0x1eca05f9),LL(0x51eb02c4,0x2e0f4e05),LL(0x63213fc5,0xb6165cde),LL(0xd91b429b,0x1fdd188c),L_(0x000000bc),
+ LL(0x58d599bc,0x52629f76),LL(0x87d39d0d,0x07dbdb1e),LL(0xcaaa9976,0xeb7d6dd2),LL(0x02ffcf23,0x7e0cd30a),LL(0x78d51085,0x83ecd227),LL(0x961e1f15,0x54655c5e),LL(0x8aa70a14,0xf96ec7c6),LL(0x62c8fb1f,0x64d2f55e),L_(0x000001b4), LL(0x0ac79416,0xb6e904d2),LL(0x0bec2602,0xef59ae4f),LL(0x80f6effa,0x330793e6),LL(0x54960688,0x2442ae08),LL(0xff5a5fdb,0xc5e3d773),LL(0xc6ac0199,0xcacfcecb),LL(0x2fa7a795,0xc57e52d1),LL(0xdfd6f9bf,0x2e4eaeaf),L_(0x000000e3),
+ LL(0xba2a7d7d,0xefeeeccb),LL(0xd77ed0ff,0x9db74ad1),LL(0x5e752d76,0x0b6200a7),LL(0xfc315b24,0x7b48ab8c),LL(0x38ef4859,0x6f975045),LL(0x980da41b,0x09695a2e),LL(0x0010c201,0x0d2b23ac),LL(0x7b7fe53f,0xfe8b4888),L_(0x0000001e), LL(0x8dd021c4,0xc97b952e),LL(0x6b8cb163,0x16bdd26e),LL(0xd62feeed,0x6129cfd5),LL(0x9be7e3db,0xcfa4489e),LL(0xd804ec9d,0x8f551707),LL(0xadb1fbcf,0x055312a2),LL(0x05be2283,0x7d87937c),LL(0x33c9f74b,0xe5edd3be),L_(0x000000d7),
+ LL(0x46a8f7e5,0x854b2f45),LL(0x223a8078,0x954aed2a),LL(0x155358a6,0x30349ae5),LL(0xae186e4b,0x982c7a2a),LL(0x15564aa5,0x26ca4f64),LL(0xbb73fd2e,0x3fca013a),LL(0x2d10cb06,0x3b01aea9),LL(0x33610496,0xd0f1f68f),L_(0x000001bc), LL(0xf43f1a25,0x7f69aedb),LL(0x1ef2c9b4,0x7e6d3ebe),LL(0x3246ee72,0x1a5a6120),LL(0xfc23f5bd,0x7e829b05),LL(0x02380698,0xfb70444c),LL(0xe903fa23,0xb14cf0d6),LL(0xaba52743,0x7e9872db),LL(0x4a9994d9,0xcbf74f83),L_(0x00000052),
+ LL(0x0feb8ccb,0x077ea324),LL(0xae770944,0x13db8792),LL(0x1201418e,0xbc07e7f8),LL(0x7f43920c,0xd56c9383),LL(0xa87da3ae,0xf13ae3d2),LL(0xddc44f1d,0x220944b8),LL(0x9328fcaa,0xe3819646),LL(0xeeb928d8,0x3e55f26b),L_(0x00000131), LL(0x1bd80088,0x42ec4f45),LL(0xfe195b7e,0x8b6807bd),LL(0xe12b70e6,0x2b99f5fa),LL(0x7ea15922,0x4e065912),LL(0x9b50760c,0x2efe8690),LL(0xb9b66711,0x16a38c58),LL(0x7b7026cf,0x0ea01a94),LL(0x80737374,0x39639895),L_(0x00000015),
+ LL(0x5664a574,0x514bdbc0),LL(0xb7081a5f,0xfa8d102a),LL(0x8b95f28e,0xbeeb8bec),LL(0x89435618,0x71f4af84),LL(0xdf609827,0xb479c91f),LL(0x14f1207b,0xcb1fbb1b),LL(0xde646157,0xf9e5fc99),LL(0x7b096333,0x34873e5f),L_(0x0000012f), LL(0x7966170e,0xd78f796f),LL(0x3fa5ab5e,0xa3fca0b1),LL(0xacf76276,0x8003771d),LL(0x1726ca8d,0xe6d96044),LL(0x3e43296d,0x93fa9826),LL(0x42531228,0x527acf14),LL(0x60a72222,0x7a97cba9),LL(0x3d7c6f6c,0x1948eafd),L_(0x0000012b),
+ LL(0x5463af9c,0x4e12b5af),LL(0x08d068df,0x886cf2ad),LL(0x79260e0d,0x52a61dfd),LL(0x3e9745ee,0x3f586c5d),LL(0xe1f15978,0x566b3b18),LL(0x87842ee1,0x9ad3de40),LL(0xa8f52a76,0xfa06fa9e),LL(0x391add0b,0x9e84e7b8),L_(0x00000042), LL(0x95c6c5aa,0xbb6677c3),LL(0xa05bc623,0x52d3e69c),LL(0xb274df3e,0x974dd07a),LL(0x630e22a1,0x5e6204a2),LL(0xb9a3958d,0x1b227ffa),LL(0xd0e0f634,0x8fc075d7),LL(0x37062afb,0xbe7fbf5c),LL(0x34adc02d,0x77906471),L_(0x0000012f),
+ LL(0xa73219ef,0x6c9a6028),LL(0x259579a0,0x6f5bb2d1),LL(0x0285a43e,0x154ac0bc),LL(0x167a3f99,0x36795c46),LL(0x728f737d,0xb73fd19e),LL(0x4d08d004,0xa6cc0016),LL(0x85ddb728,0xe72a83f5),LL(0x2e0d295e,0xbfbd9eeb),L_(0x000000f5), LL(0x30d1ecb0,0x90f9c914),LL(0x0eb6be44,0xaf866e12),LL(0xfe01cd22,0x5fd8a835),LL(0x7bf70c61,0x7f0a7679),LL(0x38813f80,0xc8998bdd),LL(0x3833317e,0xb796096b),LL(0xfec3ea9b,0x95f4e76d),LL(0xdad9de4b,0x341f07a8),L_(0x000000d0),
+ LL(0x9808d4ec,0xd3c33742),LL(0x200fc40a,0xb0a42399),LL(0x130ccf0d,0xcba30b44),LL(0x5e03c03f,0x8e5dcd29),LL(0x6cdd189a,0x1e3d9c12),LL(0x5a30516d,0x81b3e6ac),LL(0x6b10cabc,0xcc86cceb),LL(0x69bda2cd,0xc43e19c0),L_(0x0000003a), LL(0x616887a8,0xdc567bde),LL(0xe0559109,0x6575e24d),LL(0xe2ac30ae,0x67aa07b7),LL(0x2b6c5e32,0xdaf439f7),LL(0x407ff042,0x2ed76986),LL(0x0a686f32,0x1581e9c9),LL(0x5cacfb27,0x18e37622),LL(0xc3e3f9bf,0x387fd7f7),L_(0x000001ce),
+ LL(0x11961504,0xcd152b7e),LL(0xe1bfaadb,0x9f66edb2),LL(0x2faec2d9,0x65371362),LL(0xe758a385,0x03888c8c),LL(0x70736030,0x84bd514a),LL(0xf31e004a,0x391a903e),LL(0x246ee862,0x36e788ca),LL(0x4e1e02aa,0xf4e00df9),L_(0x00000137), LL(0x6c1152dc,0x13ba50a4),LL(0x4eff7c1a,0x941609eb),LL(0x6d04b057,0x4cf29ce1),LL(0x414be663,0xc8df1ba5),LL(0x12291ebf,0xaa401069),LL(0xeb298db0,0x8ded5bfb),LL(0x893e7d57,0x549bd728),LL(0x01b7b4f4,0xac5af1f1),L_(0x00000045),
+ LL(0x757b26d3,0x5f6b726e),LL(0xb153c049,0x1a260428),LL(0x30c06c83,0x9ce7c010),LL(0x5b4fc0ff,0x894ae091),LL(0x5657bc21,0x0aae49b6),LL(0x571a85ef,0x79cfa3cb),LL(0x65689c51,0x2187e975),LL(0xe76412d7,0x992bb278),L_(0x00000189), LL(0x11fe345d,0x0cf8c519),LL(0xaa2b60ae,0x9b1824f2),LL(0xc0f1fe55,0x9db0e06e),LL(0xd91bb72b,0xa610996c),LL(0x58e02f73,0xf2c3a8c2),LL(0x28d213dc,0xeae1bfc7),LL(0x13f362dc,0x943517da),LL(0xf7bdbaa1,0x496789e0),L_(0x00000049),
+ LL(0xb7668d30,0x6c383c56),LL(0x23ca0c67,0x0e7599c4),LL(0x99283769,0xfeb47aad),LL(0xe99af616,0xaf666d85),LL(0xf45b2fa8,0x9231d83a),LL(0x7c7b482a,0x98e9e83d),LL(0x8568ac48,0x1e56ad0b),LL(0xb6b0ac15,0x724bffe2),L_(0x00000169), LL(0x5217d4f7,0xb11260bb),LL(0x877aec8d,0xc03ce819),LL(0x4e72375a,0xccf9f47b),LL(0x54033f3a,0xac8daf52),LL(0x19b599aa,0xdea12842),LL(0x175a56a0,0x7ec2c31e),LL(0x8b550edc,0x1acab966),LL(0xf427902c,0xb52abab5),L_(0x00000147),
+ LL(0x70bcb2f8,0x52546c7f),LL(0x20270840,0x3c3eb721),LL(0x13f0d6d8,0x142e7b62),LL(0x019eaca7,0xf973a763),LL(0x025efc29,0x8be00c2a),LL(0x6f6199ab,0x03943eca),LL(0xb5618bcc,0xfbfb9ab2),LL(0x5fb02749,0x0ae9ab79),L_(0x0000013c), LL(0x3c3d712e,0x50f295b9),LL(0xab6d0e9f,0x083d8bf1),LL(0xbf53d7cb,0x07076abe),LL(0xf29d744e,0x51a53561),LL(0x5c2fc15a,0x7d647b91),LL(0x253f8428,0x51a29ead),LL(0x91bd9d62,0x006b7bce),LL(0xe106dd74,0xc770e4ef),L_(0x00000092),
+},
+/* digit=85 base_pwr=2^425 */
+{
+ LL(0x4d5c812f,0x412703ae),LL(0xe95afaa3,0xeb61e427),LL(0x271961d1,0x509a4412),LL(0xcf60fb71,0xef04644e),LL(0xd64abf7b,0xf44d4556),LL(0xfd03e651,0x9b052a7b),LL(0x4add4bdd,0xbb2156b9),LL(0x2a438d74,0x6c6c1657),L_(0x000001a3), LL(0x6be29111,0x0eae16f9),LL(0xafa2d73a,0x44951d52),LL(0x5bc81a5a,0x324d90b4),LL(0x8490fc89,0xcab36337),LL(0x7db83818,0xdcb411d8),LL(0xd6cb710a,0x80af21f7),LL(0xad265214,0xf370ca06),LL(0x3194a666,0xd8bc966e),L_(0x00000175),
+ LL(0xed0cc632,0xbbdc15d0),LL(0x35b540e1,0x979e91ce),LL(0x973de7aa,0x745fa684),LL(0x84d5e965,0x999e957c),LL(0x2675f78a,0x671ead70),LL(0xec63eb2b,0x9f4e2bee),LL(0x2262a934,0xa151a2d6),LL(0x885b027f,0x5a633743),L_(0x000001b4), LL(0xcbfe121a,0x63ade9fd),LL(0x64a13f40,0x23957199),LL(0xea6e576b,0x21e1e294),LL(0x1a39fa20,0x3e8e8d0c),LL(0xeb1db8f9,0x2627a8aa),LL(0xa239f73f,0x4ba11c83),LL(0xdc2704f3,0xe1591a19),LL(0x6d53062b,0x75cd2132),L_(0x000000c9),
+ LL(0x2f5961b0,0x615287cf),LL(0x9beb6f84,0x5201fcef),LL(0xa7eaedc7,0xabd8969f),LL(0x485d39df,0x52116284),LL(0x9a298f42,0xc2945b41),LL(0xb98d985b,0x02540f03),LL(0xbe292f99,0xfb5c8297),LL(0x927d1f59,0x379bfc25),L_(0x0000002d), LL(0x2527211f,0xbd1179af),LL(0x24128932,0x49c7ff27),LL(0x920719e9,0x1ce441c4),LL(0x7bdf184c,0xd4d77a7c),LL(0xd00ec091,0x286d6826),LL(0x3901be8d,0x8de5125b),LL(0x6d7da5fd,0x7b71c09c),LL(0x0a84f058,0xd13d8a20),L_(0x000000cb),
+ LL(0xfe1ac328,0x4047691d),LL(0xb25141cf,0x9109a95b),LL(0xcb8b02c5,0x46b0d286),LL(0x43ceb570,0xb7de8163),LL(0x45b33ca8,0xd109a4f7),LL(0xe4de2617,0xfe1ebf34),LL(0x50869270,0x1ca61709),LL(0xd0a3a1b0,0x38634a9a),L_(0x0000012e), LL(0x9fbe1e8e,0x38f07910),LL(0xce15260c,0xc1bab71b),LL(0x59aca1ef,0x5da68584),LL(0x8166c7ad,0x0bec54d9),LL(0x8f461203,0x49a9c32e),LL(0xd88a5170,0xefea1154),LL(0xbe8180a7,0xec5ede1e),LL(0xad08abc6,0xe0d26459),L_(0x0000017d),
+ LL(0x40dfaf92,0x75d35af0),LL(0xc6d5609c,0x78abf2cc),LL(0xe0503dac,0x06b14f6b),LL(0x2edd7321,0x1d8b929f),LL(0xf2198c61,0xae13548d),LL(0x510cab55,0x7dda7de6),LL(0xd681dc83,0x9c5b80c7),LL(0xf75528c0,0x3789ecc5),L_(0x00000012), LL(0xf941d11e,0x96096d94),LL(0x43aa0894,0xc108e7c3),LL(0x6b10f225,0x662c2a13),LL(0x6a846090,0xfd5f03e1),LL(0x2ef6dd38,0x6481ee80),LL(0x5be580e2,0x5fdbc53d),LL(0xa958cf09,0x11a46f11),LL(0xc02fca90,0x664e67d4),L_(0x00000194),
+ LL(0x9ae3c944,0x2e504292),LL(0xd30defda,0x0fa7d618),LL(0xea344a1b,0x8b5c684d),LL(0x88f031e8,0xc536e574),LL(0x4b824800,0x3cbde674),LL(0xad6b63cc,0x56514289),LL(0x9617ab5d,0x85b3cf5e),LL(0x7dc3ec36,0x7fc09058),L_(0x000001b6), LL(0x555deeda,0x846008dd),LL(0x6898fae8,0x9e7f0e84),LL(0xd8281d5a,0x10825f5c),LL(0x2d75ee2c,0x12dbdb85),LL(0x7c0aafd5,0x9070014b),LL(0xbf482380,0x9ee025e3),LL(0x0fc3aa99,0x63b81901),LL(0x508f2832,0x84535f01),L_(0x000000f2),
+ LL(0xc010cf33,0x9b68b1b0),LL(0xc08c3333,0xc47488c1),LL(0xab449170,0xb2a5ff61),LL(0xcf64ef35,0xb9e5f70f),LL(0x7b502c46,0x417cfca7),LL(0x88cbf950,0x1cf7bedc),LL(0xd4ad741c,0xf0d8aab2),LL(0xbcf1b6ad,0xf5a48560),L_(0x000000fe), LL(0xf9b68aec,0x502beb84),LL(0x2cc6cdcb,0x584dda42),LL(0x094da6af,0x129f5a40),LL(0xd42b7286,0x1002d93c),LL(0x5c173674,0x725b278c),LL(0xefa77633,0xd75f98ff),LL(0x791931d8,0x21527308),LL(0x512e096c,0x53d3565e),L_(0x000000de),
+ LL(0x140932ce,0x00019394),LL(0x62bec3a2,0xa2c579a3),LL(0x5ab884c7,0xa06cf4c6),LL(0x083cab2b,0xe7eda004),LL(0xf5f6cd3e,0xa107bb12),LL(0xe8649e92,0x492e8a0a),LL(0x5a344683,0x91fc3fba),LL(0x8dcfb242,0x94cfd171),L_(0x00000038), LL(0x1d1f30f0,0x03751b1b),LL(0xce223739,0xc2f1043f),LL(0x23da45da,0xf9307b4a),LL(0x3110105d,0x2b6d1b2c),LL(0xb39e6a89,0x2f645131),LL(0xd8e317be,0x90466331),LL(0xb2f395de,0xf1e436a0),LL(0x1cd56345,0x547fe748),L_(0x000001b0),
+ LL(0x6d41f81e,0x9c18c216),LL(0xfd251565,0x18071963),LL(0xf23633a9,0x005c3056),LL(0x1e0819de,0x46ebbb94),LL(0xb549b1c1,0xb17a6d7d),LL(0x92577078,0x991b825e),LL(0x8f6ca39e,0x98671ca8),LL(0x90ccdc4b,0x393fb1b5),L_(0x00000102), LL(0xcb6f46fe,0x3e2fd629),LL(0x150480ec,0x0aca508b),LL(0xcbfc5f51,0x0864f022),LL(0x14650672,0x3b3979b5),LL(0xbff63c37,0xb97ea4a4),LL(0x3b1cb3cc,0x3ef296ec),LL(0xcb4a6db9,0xff3bd186),LL(0xbd5b637b,0xedab5309),L_(0x00000052),
+ LL(0x7249f522,0xba62ee82),LL(0xd77204b3,0x77e6a3df),LL(0x710f93b4,0x02f4ab22),LL(0xcbb03368,0x5e0ecd43),LL(0xb189c2ee,0xc2847328),LL(0x9bdf60eb,0x0ebd36bf),LL(0xb67d93ed,0x0c17c388),LL(0x70c2279c,0xe8fdeaec),L_(0x000000d6), LL(0x8f80aff8,0x48b19e4c),LL(0xc3191f20,0x04206c4e),LL(0x8bdfd660,0x9a16a00f),LL(0xac2112af,0x61997c61),LL(0x8ab3667b,0x7b84c760),LL(0x06bdff10,0xf4e1645e),LL(0x607df1e8,0x352d17a0),LL(0xa63979fb,0x83c7eb22),L_(0x0000016b),
+ LL(0x223ba032,0xe2ef6187),LL(0xe76e649d,0x50e4618d),LL(0x6b987f60,0xc357d1ec),LL(0xad4f8231,0xd4a60be3),LL(0xb315fdb0,0x2eced057),LL(0xa9fb56ad,0x19319996),LL(0xa2da27cf,0x2f11dee2),LL(0x916ddbdc,0x7e40b2e7),L_(0x00000059), LL(0xd93389b7,0xb7a77c12),LL(0xb4cf9881,0x7da427fd),LL(0xcc7a5c06,0x80b0089c),LL(0xdef4d8fc,0x93e7089d),LL(0xe325b955,0x16ead4d1),LL(0xb039b2a1,0x5dfcb305),LL(0x1820d74b,0xe64404b5),LL(0xd5916176,0x6e3b8d75),L_(0x000001ef),
+ LL(0xf55f7a6b,0xe5919bbd),LL(0xff1cd958,0xef53a31b),LL(0xf4f94077,0x95740f28),LL(0xd731ab60,0xae2285d4),LL(0xa1ecbb47,0x8c0691df),LL(0x258e27d0,0x3a34371a),LL(0x6fcf67a4,0xe81db787),LL(0x31ad117e,0xcd7a8c18),L_(0x00000101), LL(0xc8eb7eab,0x1c27e10f),LL(0x7aa7d331,0x36d353fb),LL(0x484bc381,0x5feb0814),LL(0x14c00e62,0x5a897087),LL(0x4174c50b,0x73330526),LL(0xa9a0af61,0x7d611726),LL(0x60873261,0xca260561),LL(0xe43e2bb4,0x9e169695),L_(0x000001ef),
+ LL(0xb03b9785,0xb1e778d1),LL(0xe387f978,0x9b9aee5d),LL(0xd76337e3,0x92cf14d1),LL(0xe5ccf490,0x72921fc6),LL(0x5b43aefb,0x65d3e5c1),LL(0x795ec0f9,0x3904e5d3),LL(0xa4928380,0xa5751b73),LL(0xdfd26a4c,0x351de543),L_(0x00000098), LL(0x34b9f259,0x30b62509),LL(0x2b0ddc19,0xf6f4cca7),LL(0xe118ecd8,0xed5b6edf),LL(0x0c9d677b,0x4f5d7b07),LL(0x34b851c9,0x67daaa19),LL(0xade6f3a0,0xf4cef90c),LL(0x4e977f04,0xddf591d7),LL(0xa5a8e05f,0x51707198),L_(0x00000040),
+ LL(0x3afab893,0x8fe855a9),LL(0x6f37b397,0xfc53c756),LL(0x11e9e126,0x0be45fa0),LL(0x72b050d7,0x0064ab05),LL(0xfc69a454,0x2c4f8ec5),LL(0xe8ca3f9e,0xfd23251a),LL(0x3713bf5d,0xfbba4b98),LL(0xf9f17348,0x022b3ded),L_(0x00000105), LL(0xdf4c7717,0x496ec6da),LL(0x02b42501,0x3666ead7),LL(0xc5995675,0x03f0c9c9),LL(0xfafe4fc1,0x92c23f3c),LL(0x6e5dcc14,0x49d6013c),LL(0xa80274fd,0x6faecdf5),LL(0x3b89a119,0x6951f782),LL(0x04ebafd5,0xe5c75fdf),L_(0x00000059),
+ LL(0x2477dccc,0x4c63dd71),LL(0xecaaf994,0xdb563551),LL(0xfa0452c4,0x034243a2),LL(0x35dd1a49,0xc1e98b35),LL(0x67ebb1d1,0xd64a14c8),LL(0x65aa32b2,0xa40fe3b8),LL(0xf36b9b35,0x74b94620),LL(0xde048775,0x9c4f81d6),L_(0x000001ff), LL(0x2154a1a5,0x317a309b),LL(0x27e42884,0xea18f52e),LL(0xab7b0d80,0x6a303cb3),LL(0xd883eedd,0x6960a553),LL(0x5fa720c0,0x4a30771c),LL(0xaf1c642d,0x8c3afce3),LL(0x0aea4951,0x5b832460),LL(0x8daa7e14,0x3626a795),L_(0x00000086),
+ LL(0x084325f9,0x5078f4b7),LL(0xf8bc0fa4,0xf5948727),LL(0x1eb36b7b,0xea0106cf),LL(0xc704268c,0xc80e06d4),LL(0x300186e8,0x5c216323),LL(0x6e94d507,0x72ccb301),LL(0x882e86c3,0x053b8cfd),LL(0x3148a28a,0xd1710019),L_(0x00000143), LL(0x64ae003b,0x24c02876),LL(0x6d8c63b2,0xc0738276),LL(0xb8220989,0xd418521b),LL(0xa59b967c,0x52d761e7),LL(0x601efc41,0x0fa019e4),LL(0x41cb4d7c,0x9d52f11b),LL(0xcac0131d,0xe27a162d),LL(0xaac991e4,0x975ffa76),L_(0x00000189),
+},
+/* digit=86 base_pwr=2^430 */
+{
+ LL(0x0347ad37,0x53760212),LL(0xe9ad4077,0x52251dd3),LL(0x2f89c76c,0x5957d5e2),LL(0xb5844aaf,0x57c28051),LL(0x630bd361,0x369eb597),LL(0xacac6af3,0x5611a387),LL(0xaad0ef87,0xde2edc32),LL(0x0bccba64,0x731d170b),L_(0x000001f1), LL(0x5f219574,0xc2557f66),LL(0x48e1ee52,0x5f44f645),LL(0x0cf95561,0x64b6036a),LL(0x1e52bf2c,0x89213e75),LL(0x34bd858d,0x15aa570d),LL(0xbf1cb2e7,0xcc205ae3),LL(0xf29e703a,0xfb1911e3),LL(0x98a34a47,0x78616fc4),L_(0x00000095),
+ LL(0x7ca50557,0x301fc12e),LL(0x91d6adbf,0xdc42e25e),LL(0x587a0d31,0xcecd10d8),LL(0xf88cc8a9,0x8d1b41cc),LL(0x90bd959d,0x33b3f964),LL(0x999c5a51,0x47bee028),LL(0xc3a08825,0xb39f5f74),LL(0xd4fc3438,0x5af39ed4),L_(0x000001a7), LL(0x1f9ad9d9,0xbf02b54c),LL(0x0a29ee5f,0x4f0d6dbd),LL(0x57045bbc,0xe6fde293),LL(0xc7d0fce2,0x040027df),LL(0xcda45a33,0x23be51ff),LL(0x9841c14d,0x6d045486),LL(0x56ff1e33,0xfdc85221),LL(0x5ea634d9,0x619b696b),L_(0x000001ae),
+ LL(0x3ea82d4d,0xa104ae49),LL(0x5ed4f918,0x7f6fea1f),LL(0xfb0d6721,0xb83838c1),LL(0x99caa790,0xd116daa3),LL(0xc2f1d19e,0xe68d0873),LL(0x105c2468,0x247798a8),LL(0x672f66e0,0x740bca2a),LL(0xe789f0d7,0x86c229b4),L_(0x0000014c), LL(0xc9d1c796,0xd8e83bf0),LL(0x77be9153,0xaa767cd0),LL(0x71074af9,0xb3e46e21),LL(0x17f8ca53,0x7796d98d),LL(0x215b3c92,0xd098831f),LL(0x362429bd,0x0b75e1e5),LL(0x75d41b1b,0xc1e2cba3),LL(0x0101e963,0xbf3622fb),L_(0x000000fe),
+ LL(0xc6beb7ff,0xb9019f2f),LL(0x646b70de,0x2e533666),LL(0x90a5717d,0xd38f5274),LL(0x7916810f,0x3bb33bad),LL(0xfd952623,0x59b6b88e),LL(0x5dad71c0,0xfe6ed574),LL(0xca300788,0x21a98ac4),LL(0x6ded4a6a,0xeeff5891),L_(0x00000010), LL(0x03a67cf9,0x48da52e8),LL(0x98c1a5fc,0x1901e7d3),LL(0x42b185c0,0xcb2700b0),LL(0xaca4eda6,0xeec867cd),LL(0x0a19ae4e,0x7dcb7e93),LL(0x88471dcc,0x17e010a2),LL(0x198ed175,0xbb36f683),LL(0xbb4e8756,0xf915ed36),L_(0x0000007d),
+ LL(0x899986a2,0x56948883),LL(0xfd191432,0x519679d8),LL(0xcdcf1fa3,0x35711035),LL(0x87a0e867,0x663b1a45),LL(0x6c52192e,0xd46a0d9f),LL(0xd90e9a02,0x01cece65),LL(0x0dbf88f7,0x5032d5f7),LL(0xd5855448,0xc3ecbbe3),L_(0x00000083), LL(0x7299fb8b,0xda71595b),LL(0x4bb4a8ce,0x6609b74e),LL(0x23abfae6,0x76172b1d),LL(0xc43ff5b4,0xc2d69d21),LL(0x275e500d,0xf9af38b2),LL(0x8ab54bd9,0xe6a2d266),LL(0x983f2f3c,0xb11e43bc),LL(0x0d27f996,0x3ef88279),L_(0x00000141),
+ LL(0x235721d1,0x9058183f),LL(0xdd40e348,0x8259229c),LL(0x5e67db56,0x8582282f),LL(0xa5fd9ed5,0xea641a1b),LL(0x1a634c9e,0x6d89c3eb),LL(0x44359789,0x3d617332),LL(0xb7458f8e,0x974b6efb),LL(0xb6863988,0xd2857c41),L_(0x0000018e), LL(0x70c629ba,0xd0bd1dc8),LL(0x08757c7c,0x4edda34c),LL(0x5a31fc77,0xfa2bc7b5),LL(0xf6b159cc,0x36e4a532),LL(0x904f6b01,0x603edf4b),LL(0x96a6ebff,0xb699fdb4),LL(0xad76014c,0x888c04c9),LL(0x52da1b11,0x9675ab25),L_(0x00000151),
+ LL(0xee308f65,0x76cc2e7a),LL(0x23209d8a,0x39ac3634),LL(0x493f6e5e,0x2a49b5d9),LL(0xaac1e790,0x83449f3c),LL(0x85d5aef7,0x919c353b),LL(0x45144182,0x9673a9fe),LL(0xc1d4f2ca,0x9f1f328f),LL(0x8f5eeda5,0xf2216169),L_(0x00000042), LL(0x8673cd02,0x3f509f9a),LL(0x96feece0,0x85e87ba8),LL(0xe9be0b9b,0x186dcdb0),LL(0x7207011b,0x590eaaa1),LL(0x60f3a8d4,0x3aeb9b3f),LL(0xac89f276,0xd21f7163),LL(0xfd4e5813,0x05998e42),LL(0x80b7e4e3,0x38cd8e87),L_(0x00000006),
+ LL(0x2bd11682,0xc09d95ae),LL(0xd6f73873,0x7cafdfb9),LL(0x27b3bc9e,0x1f14d40f),LL(0x6fc05fa8,0x4eebf4e6),LL(0x4e6b76ed,0x7bb6036a),LL(0x736cb738,0x58e19e3f),LL(0x2277b08a,0xa4986beb),LL(0xbb55c0d7,0x8f830ada),L_(0x000000d1), LL(0x82356bcd,0xb25e59f9),LL(0x9a3ae563,0x18997059),LL(0xd06e16bf,0x7505891e),LL(0x3d688dac,0x76b3eb97),LL(0x10cb084c,0xc6498b2d),LL(0x2d6e8e95,0xafa574af),LL(0x503f71b8,0xc16133ca),LL(0x9966999b,0x6f3443fa),L_(0x000001d7),
+ LL(0xdbea5491,0xa62c57f7),LL(0x797a0980,0x03e966f7),LL(0x3a33197c,0x5565e857),LL(0x31df23bc,0x1feaa7a8),LL(0x240894a7,0xec48825c),LL(0x8f886413,0x9a2b6b14),LL(0x98c1f268,0x041a9538),LL(0x89254981,0x46c27078),L_(0x000001a7), LL(0x6917dfc0,0x3f850405),LL(0x16453f02,0x5e4fd155),LL(0xb6a3db9b,0xcd6306e4),LL(0xc259c564,0x89b34c35),LL(0x1cbd8b5f,0x7420eabc),LL(0x22f6885a,0xfe106029),LL(0x2bf9ec49,0xaef5fd1c),LL(0x73da5ef8,0x01c0496b),L_(0x000000d0),
+ LL(0x6be83fa9,0xccf43b6c),LL(0x2b2fd87d,0xb29b9f9b),LL(0x42c15930,0x75dead34),LL(0x8a992ae9,0x93d238f6),LL(0x835b46d8,0x537768fc),LL(0x59b7cdac,0x97a9b4f9),LL(0x8690f7d0,0xe523d489),LL(0xddd3b40f,0x2dcb85bf),L_(0x00000107), LL(0x29e746ab,0x2a6612ff),LL(0xa015a7b6,0xc599e46f),LL(0x72d01eaf,0x9b23b6a1),LL(0xc21d7f10,0xdff644dc),LL(0xac717daa,0x215cc0c4),LL(0x31113eff,0x29fa625d),LL(0x2da218c6,0x3ddc80ac),LL(0x8399eca4,0x5d17f283),L_(0x00000143),
+ LL(0x0f0161a0,0xfd958a4c),LL(0x656636ff,0x022fd87f),LL(0x77efdadd,0x3a9ac51c),LL(0x96597b30,0x2fbf14ce),LL(0x01364596,0x7d940bec),LL(0x1f7b85dc,0xbde90f3c),LL(0x3116d774,0x40e30d60),LL(0x9289d920,0x52c8b93a),L_(0x000001a8), LL(0x3eba46a9,0x2ebd850f),LL(0xa0eaa3d4,0x590d1f54),LL(0xbe22470c,0x53e4e7c3),LL(0xf88fc1e8,0xd8883aaa),LL(0x7782a946,0xe78d366f),LL(0x567fbeed,0xf47e81a5),LL(0xadd3d4f0,0xb2aaddfe),LL(0x29a661cf,0xa342a4e6),L_(0x00000027),
+ LL(0xfdf300d6,0x8c9cc5a1),LL(0xe5aa101a,0x329070ed),LL(0x53342a7d,0x852398fa),LL(0x007bb4fe,0x673ceb9c),LL(0xa9431236,0x3c9247b3),LL(0x1cb68268,0x115b1ee5),LL(0x5c07f2ef,0x3f6486b7),LL(0x7183b014,0x1585ec37),L_(0x00000110), LL(0xd84cedcc,0x0680da54),LL(0x9a2e8c00,0xe41a7e56),LL(0xe94c0472,0xb7c713ec),LL(0xf2aa41c1,0x742d18cc),LL(0x3e3162e5,0xedf3c376),LL(0x77417a84,0x57916b99),LL(0x165b44c7,0x246f2e2f),LL(0x1c45d988,0x8287828d),L_(0x0000015c),
+ LL(0x1ca07749,0xab8f038d),LL(0x27f0c816,0xc4edbd37),LL(0xc8522ec7,0x2f8f0b54),LL(0xe399477b,0x074481dc),LL(0x0fb69890,0xa0499848),LL(0xa5280b6b,0x88cb4213),LL(0x3dff5cd9,0x41c11365),LL(0xe549bd1e,0xea8a3c58),L_(0x000000fa), LL(0x19cc70e2,0x2b200b5c),LL(0x2ec791da,0xb1772087),LL(0xb33233b1,0x9df4451f),LL(0xaa1032a0,0xbaa72f9e),LL(0x645358e3,0xc7982461),LL(0x88b9794b,0xecd3c965),LL(0xcecd6313,0xa2d9359f),LL(0xf7b6ca2d,0x7f382df2),L_(0x000001ce),
+ LL(0xcb2fcc0b,0x02037c91),LL(0x41a52ada,0x82ddca3f),LL(0x1b403720,0x4b6a1108),LL(0x6acc9873,0x6d306779),LL(0x495190be,0x80fb3f34),LL(0x13ec341a,0x0307762f),LL(0x2ea03fd7,0x422a6d1a),LL(0xfacb4f11,0x014521e4),L_(0x000000f6), LL(0x869fd036,0x0ac6d565),LL(0xb343a25b,0xdead79aa),LL(0xf7c846e5,0x54b1471e),LL(0xccc5d545,0xf9ccfd6a),LL(0x31f5ccd5,0x43e993a3),LL(0x8fc6e767,0x07c79ed2),LL(0xd716a9ab,0x4894cc48),LL(0xae33e7f3,0xd6c5646c),L_(0x0000004f),
+ LL(0x7a287c20,0x37b15d9b),LL(0xc16b5265,0x43945dbd),LL(0x7a53a14b,0x994df966),LL(0xd272ba24,0xfbfe62a0),LL(0x80e0b451,0xb488717c),LL(0x7153f565,0x22303a33),LL(0x6397afa8,0xc85bf638),LL(0x0216bd4f,0x096b646c),L_(0x00000189), LL(0xf17f6fdf,0xf00721ec),LL(0x500e6e18,0xab5ca93b),LL(0xea2d8a0d,0x06a3b0f0),LL(0x44feaba9,0xf766ff9a),LL(0xea82aa95,0x05be709f),LL(0x0829c7c9,0x36a07ae0),LL(0xa1cfe409,0xc83c032c),LL(0x780ac746,0xde7f9ef0),L_(0x000001db),
+ LL(0xfdb1c069,0x18f9c015),LL(0x25767d44,0x49d6199f),LL(0x77c536b7,0xb54e847b),LL(0x1af54bfd,0x7979776c),LL(0x0b838623,0x51eefa22),LL(0xdf9bb4a7,0x028f18ac),LL(0xce45beb5,0x7dd86218),LL(0xb930f98a,0x3f055e3a),L_(0x00000102), LL(0x2c7f6a23,0x1df321b7),LL(0xeeb57c14,0x53902659),LL(0x0b2255cf,0xf2a776fd),LL(0x4cc9dbec,0x453cf8ab),LL(0x63e94ee6,0xf2d56478),LL(0x93a4007a,0x027149fe),LL(0x9cf116d0,0xa6376053),LL(0x17dc8184,0xe7465f73),L_(0x0000001d),
+},
+/* digit=87 base_pwr=2^435 */
+{
+ LL(0x4e8c16e6,0x6ea55f73),LL(0xf042fa2f,0xab1d226e),LL(0xb24c1848,0x6862a1dd),LL(0x413acbe8,0x1f4168e7),LL(0x91408365,0x9d596e07),LL(0x23961d18,0x01b379ca),LL(0x6d536797,0x05ec7b7e),LL(0x13cf35fa,0xd7f6b707),L_(0x00000120), LL(0x4c707b18,0xbc18785b),LL(0x76095f2d,0xa0054386),LL(0xe28a0370,0x50c89610),LL(0xfeeaf09e,0x144bba0b),LL(0x455cf10f,0x34cf6dd7),LL(0xf509d978,0xf94fe722),LL(0x05c279e5,0x8092debb),LL(0xe71244fe,0xb314f061),L_(0x00000153),
+ LL(0xbfafe94c,0x7f803868),LL(0xeb771971,0x05b4c2dd),LL(0x911e1ad0,0x0df34f87),LL(0x57076f1e,0x9958d5da),LL(0x6f49ecb2,0x55d1ebf6),LL(0x2ca7b49e,0xfcb4f571),LL(0xb2ff1b32,0x42a971c5),LL(0x49f97d3d,0x838bb327),L_(0x00000004), LL(0x789eb651,0xa52e7908),LL(0x86529c3b,0x7ddd9af7),LL(0xe7159473,0x6dd64d51),LL(0x8305400f,0x922bf016),LL(0x21ca4239,0x1db4bbaa),LL(0x8c94ee85,0xafda935d),LL(0x80623440,0x0a576c9c),LL(0xd9110efc,0xd79f58dc),L_(0x00000196),
+ LL(0x4946a27b,0xe1a7c929),LL(0xeff94575,0x7f265399),LL(0x076c7864,0xdf2046cc),LL(0xfe889ff0,0xe23267f8),LL(0x4b83615e,0x171f661f),LL(0x32637340,0xc3fd3e6c),LL(0x946ccba9,0xafb9463a),LL(0x9deb55e5,0xbdcb574f),L_(0x00000142), LL(0x21b6bfa5,0xd84d6148),LL(0x6362d37c,0xe1724e4e),LL(0x80e307d8,0x2dee8134),LL(0xd661095b,0x596062c6),LL(0xbc1b3be1,0x5779751a),LL(0x36f36543,0xd0be963f),LL(0x7fee02b0,0x75c65486),LL(0xb82030d1,0x72d27424),L_(0x00000046),
+ LL(0x9df95f7d,0xaeb38ccc),LL(0x49ee6062,0xc1411d18),LL(0x164333de,0xa4a4727a),LL(0x566e81b4,0x74b241dc),LL(0x290aa59c,0x85069fb7),LL(0x2865cb6d,0x28389d32),LL(0xcbd64839,0xce3c8f7e),LL(0x8c909864,0xfef248d2),L_(0x000000c9), LL(0x126259dc,0x4261d435),LL(0xb96bec85,0x62a6f5a6),LL(0x1f509bbc,0xb43f9c90),LL(0xc53ddbc8,0x94118466),LL(0x9ad3885e,0x22a38677),LL(0xd109dd2e,0x60b6db58),LL(0xeef4f2af,0xadf1adca),LL(0xd5bc0cd7,0x0fb47811),L_(0x00000022),
+ LL(0x04e04d29,0x456d2584),LL(0xca189af8,0x85bb0ebb),LL(0xf9e4ffa5,0x3e647534),LL(0x1136b7ab,0x0e1d213d),LL(0x91ac330c,0x6aa7c7de),LL(0x4345ad0a,0xf0255a49),LL(0xa156a357,0xe3967bfd),LL(0x2bdb3ace,0x8dff208b),L_(0x000001d8), LL(0xa955f611,0xad93b86d),LL(0xff9685e0,0x990e1837),LL(0xd599bc9a,0xa491c185),LL(0x320375e6,0x59cacf47),LL(0x427b05e7,0x03c76cd9),LL(0x9565d0db,0x073ece2e),LL(0x72f50d14,0x2045534c),LL(0x31281552,0xa43a812b),L_(0x00000114),
+ LL(0xb2b9d580,0x49f1b4d9),LL(0xd4601e45,0xd37e9635),LL(0x5712ad28,0x2c3143dd),LL(0xaf7e19b4,0xc6366f04),LL(0xaa565afd,0xc4b34637),LL(0xc12b452b,0xdd135b2a),LL(0x77fe7f5b,0xfeea8b42),LL(0x9ec6ff31,0x5cdaec8e),L_(0x000000c4), LL(0x8366af15,0x3f781317),LL(0x664c221b,0x652c3e83),LL(0xafac4ecd,0x6da93d03),LL(0xcfa7c466,0x2ceac0d6),LL(0x039d2b65,0xcb1a4cf4),LL(0xa6eb1946,0xa2285c58),LL(0x422c9b53,0x1b4d8367),LL(0xcc7349ed,0x4c55a379),L_(0x000000fa),
+ LL(0xa9e31a4b,0x85b7a89c),LL(0x1ea7ad0b,0x9f47c4ab),LL(0xe5150449,0x85cda5f6),LL(0xb891dfa1,0xe69386b4),LL(0xd89edbbe,0xf4ac48bb),LL(0x1b2a00ae,0x3c163ff2),LL(0x37bb423a,0x73d0c87f),LL(0x393a234b,0xe80b0fdc),L_(0x000001ac), LL(0x833e5248,0xc52fc82f),LL(0xa9154aa9,0xe56ec070),LL(0xb5b87f0b,0xb996ced1),LL(0x2c118a27,0xbb7f2dff),LL(0x3e0161d2,0x9ee991cd),LL(0x45e9acd1,0xb300f7d4),LL(0xfb934e98,0x20f357aa),LL(0x370589a8,0xfe8af1f8),L_(0x000001b4),
+ LL(0xac4010e5,0xb59ee173),LL(0x42f467a4,0x41b66fb9),LL(0x5770a301,0x02513df6),LL(0xf1d41988,0x7e0148f2),LL(0xf54abf2c,0xd9a1b6c6),LL(0xbb47b51b,0xfba956f2),LL(0xf5846505,0xb02618f4),LL(0x502a3ddc,0x69ec8c64),L_(0x0000007b), LL(0x3aa9231a,0x194b6953),LL(0x04316d8f,0x8f7bcb08),LL(0x006107c5,0x9f43afd0),LL(0x32f310f2,0xa15ea5dc),LL(0xe2b91ae7,0x3849a363),LL(0x2b4966c6,0x6a457445),LL(0x1d63455b,0xb8835c17),LL(0xcd39b535,0x1ae86f54),L_(0x00000109),
+ LL(0xdcd0412f,0x413915c5),LL(0xd3aa0f40,0x553e50ff),LL(0xc139c1fd,0x408079ac),LL(0xcaeedf51,0x5702513c),LL(0xf43dc271,0x1c08e5b0),LL(0xf5e1208e,0x48d91655),LL(0x813375b3,0x91b427b6),LL(0x0fa6be8b,0x833896b7),L_(0x000000d0), LL(0xbf42c4ce,0x7c3676f3),LL(0xac9ff585,0x853930b5),LL(0x94c9266b,0xc6b73b6c),LL(0xbc211c89,0x277b6c8b),LL(0x2fc248c5,0x93fd3dec),LL(0xcefb839e,0x4a5c85d3),LL(0x10bf217b,0x2a276f95),LL(0x3a708326,0xc15a4206),L_(0x00000147),
+ LL(0x614daa59,0x7bde1ec8),LL(0x34c4db4a,0xa70a6f08),LL(0x48a29f6b,0x587d1015),LL(0x49dbe231,0x998c9a20),LL(0x8aceafbb,0xe5eedcf8),LL(0xe6b738f7,0xcab08878),LL(0x9b693ecf,0xb374ede1),LL(0x008dd1dd,0x7a6cd94f),L_(0x000001be), LL(0x16a2f123,0x83bd130c),LL(0xc20757ed,0x17bff343),LL(0x228e06b2,0x1bef19ad),LL(0xc51046a9,0x0e88da5c),LL(0x011b5840,0x70a9f961),LL(0x49ae6f04,0xc6f83f90),LL(0x9d079a03,0x912f072e),LL(0x9a401435,0x0b78fe3f),L_(0x00000149),
+ LL(0x81fae141,0x20b6a171),LL(0xc0eec582,0x531fdbd5),LL(0x7a0400cc,0xe2cd895a),LL(0x9c308aa1,0xf0bb2d5a),LL(0x08b021d8,0xde68db65),LL(0xad0f2bcd,0xac747060),LL(0x3fd807ea,0xfe64802d),LL(0x8b4648ee,0x38d8773a),L_(0x00000176), LL(0xc5e737e0,0xcb637daf),LL(0x16605703,0xdffc80b5),LL(0x4845eee4,0xd28e60ca),LL(0x57f98d2e,0xdfda4fa3),LL(0xac95f77a,0x0d0b9220),LL(0x05da7201,0x60ec2cb7),LL(0x9a49b6df,0x201396c1),LL(0x611b2a93,0xb535c0ce),L_(0x0000000f),
+ LL(0xf4245fc8,0x1481fdff),LL(0x68c14a66,0x84edc501),LL(0x764d4d2b,0xbe356501),LL(0x736aaa60,0xe6771588),LL(0x0c40e330,0x5714d50c),LL(0x7b8fe887,0xfbdf2915),LL(0x9215aac4,0x549e25da),LL(0x58b4091b,0x442d2b00),L_(0x000001ad), LL(0xc5841383,0x88ee6a91),LL(0x934568ba,0x307efd84),LL(0x10dd1585,0xcb644b24),LL(0x3219b046,0x2bd376e1),LL(0xef0c68dc,0xdcecc49b),LL(0x56c2d2d1,0xc907f765),LL(0x810f8810,0x052b3ddd),LL(0x1ba20da5,0xc3448a3c),L_(0x0000019e),
+ LL(0x099d2210,0xb0648b7e),LL(0x193cb76d,0xf7fec768),LL(0xb90f6558,0x86126ace),LL(0x237a7fc7,0x749a6fe8),LL(0x83ab837e,0xb5c3035a),LL(0x3e9ae2d9,0x8de4bf68),LL(0x9c620970,0x0b3fa791),LL(0x8ef69888,0xc5e8388c),L_(0x0000005f), LL(0x8f4a5084,0x892086c5),LL(0xc04ac82e,0xfb491292),LL(0xc0d38a50,0x52d706d1),LL(0x42c8a5e7,0x582ce44e),LL(0xc9853494,0x96312a80),LL(0x04da6643,0x74ef5508),LL(0xbbc8dc30,0x9a8e3322),LL(0xfa669919,0xa1f29644),L_(0x000000d5),
+ LL(0xf4dadcf3,0x0e084366),LL(0x5cc0a55e,0x7ef0187f),LL(0xa139c3fe,0x49d53f7b),LL(0x5423f2e7,0xd809a727),LL(0x5a94a4ff,0xe2e74f9e),LL(0x541f08d0,0x22541929),LL(0x14dd0793,0x49159841),LL(0xdbf53ad1,0x408f5bb7),L_(0x0000018a), LL(0xdde4d64f,0x1db74ade),LL(0x46e28711,0x3b22deeb),LL(0x1ad3605f,0x8863541b),LL(0x1fe070fc,0xfdd530f5),LL(0x4af47e93,0x7f3d69c0),LL(0xd93cb647,0x6d16f551),LL(0xbc684cde,0x50cd6852),LL(0xb5154a9f,0x16ac0cc2),L_(0x0000009f),
+ LL(0x78202e6d,0xec5c2c31),LL(0xc90def9a,0xe4b46e4f),LL(0x67d0d316,0x8901b941),LL(0x2bb65bec,0xc96e5167),LL(0xf836eba2,0x096ab2fb),LL(0x996167b5,0x2719f2e6),LL(0xdde8e72c,0x12437287),LL(0x62d48d9a,0xf4ef64e5),L_(0x00000188), LL(0x8698b358,0x91da5b6b),LL(0xa56f46e1,0xc13b6841),LL(0x97107435,0xfbe3e2a6),LL(0xa446c520,0x759315a1),LL(0x0c5bba8d,0x861aec20),LL(0x852f2659,0x775fa0ec),LL(0xfbe06684,0xa91ab0fa),LL(0x03bd8b0d,0x3006d391),L_(0x00000023),
+ LL(0xcf090898,0x1b6190bc),LL(0xa4a386bf,0x17c47de2),LL(0x95703cbb,0x3bf84891),LL(0x3f013d22,0x12474267),LL(0x6fdb827a,0x0290f2b8),LL(0x50e9b7e1,0x79a8f44e),LL(0xcc658260,0x89a9228e),LL(0xab4d12b5,0x83a119d1),L_(0x000001b6), LL(0x93cc6375,0x2d25950f),LL(0x6b02229a,0x38c46b7a),LL(0xfb0617d5,0x6bc581dc),LL(0x0ce1dd7b,0x6b522d59),LL(0xd0dcdf5b,0x9133e3f5),LL(0x5cce47e7,0xd71f5bdf),LL(0x21b8ecd0,0x17d9aefe),LL(0x7aac21b7,0x7b609025),L_(0x00000188),
+},
+/* digit=88 base_pwr=2^440 */
+{
+ LL(0x35d8a1ec,0xf89fcba2),LL(0x59a63f98,0x86d07ca3),LL(0xf60025c0,0x590915cb),LL(0x68c18d4e,0x15cc7c3b),LL(0x85575ec9,0x09334801),LL(0xe8d10d82,0x4789511a),LL(0x82704b90,0xdb2e76c0),LL(0xf6a4e997,0xf5824d99),L_(0x000000c3), LL(0x8f32dc9f,0x6953628d),LL(0xa7575550,0x8504400e),LL(0x8537e141,0x609d8295),LL(0xc7b7f7a0,0x5da70118),LL(0xc50379c5,0x79ad1223),LL(0xc936f6ea,0xbde48629),LL(0x4f7f839c,0x1ba01725),LL(0xdff8def6,0x1bef09eb),L_(0x0000015c),
+ LL(0x5fe3f41c,0xe82eeedc),LL(0x330d665a,0x0753a4f9),LL(0x3f5e64a3,0x9e477096),LL(0xef9e92f3,0x07f9d297),LL(0x388062aa,0xc48c3ddf),LL(0x60ab0df5,0x55e6e61e),LL(0x5a47567e,0x9872a6f9),LL(0x3a66d012,0x425f368c),L_(0x00000153), LL(0xf66ffa47,0x03b7cc7b),LL(0xb2825eba,0xba3cef16),LL(0x90e67535,0x4aec5704),LL(0xcc34aef1,0x511ac67b),LL(0xd95c0e01,0x51002739),LL(0x0f4f3657,0x45e92922),LL(0x465557ab,0x1baabf91),LL(0x0e9abecf,0x8337c976),L_(0x000001e9),
+ LL(0xd2b325ae,0xa1025751),LL(0x6a01039d,0x28499cde),LL(0x5ba84622,0x47232500),LL(0x4da34907,0x523417ab),LL(0x54b07c1a,0xd3451baf),LL(0x3fa7e4ff,0x7ce5516f),LL(0x2fbff214,0xfc522cc4),LL(0xa33f1b0a,0x95c7010c),L_(0x000000b3), LL(0x5af51c66,0x665ed5f5),LL(0x980e5684,0xd596415b),LL(0xa5a1b30b,0x8834a37b),LL(0xfeebb04e,0xcf282494),LL(0xb29d17be,0x340dc6ce),LL(0x8d5399a5,0xa50f4a86),LL(0x76012bce,0x83faa312),LL(0x4bc769aa,0x6550a065),L_(0x0000018e),
+ LL(0xf4dbc144,0xec66fa0e),LL(0x134a53f7,0xa7b2871d),LL(0x1ee39cda,0x83070c04),LL(0x9749b3f1,0x6da77991),LL(0x867841c7,0xe916f1eb),LL(0x21e5438a,0xe409b274),LL(0x1b0e12d8,0x3842a6e5),LL(0xde5e08b8,0x74b9e008),L_(0x00000143), LL(0x63a63405,0xfea4cba7),LL(0x08e07acd,0x06789133),LL(0xdb2143a9,0x815c887a),LL(0x85ffe6dd,0xa9d2043c),LL(0xa68d05e2,0xd3ceab79),LL(0x93674d33,0x7a8a9863),LL(0x12ee73ca,0xd54b7afd),LL(0x6403b9bb,0x2eead112),L_(0x00000170),
+ LL(0x57f80d54,0xfa0b987f),LL(0x67c06145,0xfd55dd43),LL(0x34438e79,0xe8ca9c52),LL(0xfad0f9f8,0x810f12c2),LL(0xa97a7136,0xb3ec5af1),LL(0x3d0eabab,0xb7b58561),LL(0xecb3da01,0x8aadf26a),LL(0xbb015079,0x9cce9cad),L_(0x00000002), LL(0x43839606,0x265a72e5),LL(0xd025e951,0x90e3ddec),LL(0x5b2c9143,0x4955e972),LL(0x05386478,0xdae63ed0),LL(0x60c28f8c,0x4aa5ded8),LL(0x0fb99e77,0xb74c1dd8),LL(0x0f07854b,0x2caae0f2),LL(0x6691581c,0x069f6ba7),L_(0x00000148),
+ LL(0x6126647d,0xf5f13583),LL(0x8b738df6,0xe91f4420),LL(0x786c7341,0x1ae2188a),LL(0xda384ed9,0x08e3293b),LL(0x19b1a00b,0x9e09af31),LL(0x65267666,0x322f3662),LL(0xd07b9f37,0x764ea40f),LL(0x11ae129d,0xc16a911b),L_(0x00000185), LL(0x95ad18bc,0x59021aec),LL(0xeb3197c7,0x4daed80e),LL(0xdfd4a433,0x606234ad),LL(0xab3ff78d,0xf98a1d73),LL(0x9f90a43f,0x2c9cac66),LL(0x99bed176,0x5e8063cf),LL(0x8f03fcd4,0x50672a22),LL(0xfdb17bf7,0x027e080b),L_(0x00000079),
+ LL(0xfcf8e230,0x236a647c),LL(0x5dafe047,0x30081d74),LL(0xc3212b4d,0x0f548f13),LL(0x51f94578,0xd885e14f),LL(0x941059a0,0x06ed3092),LL(0x189c478f,0x5042651e),LL(0x7a26e8c7,0xf36b6ee0),LL(0x09a14b52,0x32dfdec0),L_(0x000001a0), LL(0x79eb582d,0xbe8ca673),LL(0x527f0a50,0x4c6beb6f),LL(0xadaba76e,0xfc7fd1fd),LL(0x9909b987,0x47c90091),LL(0x992155a0,0x06d6f45b),LL(0x2da697e0,0x740de37e),LL(0x1a38bcd1,0xce3867f1),LL(0x509b93e8,0x503be8b2),L_(0x00000160),
+ LL(0x1ab9de21,0xe8c16ca7),LL(0x4d3bbd16,0x519f4d4b),LL(0x53785c45,0x6454947e),LL(0x1aafab77,0xd9b9416f),LL(0x6883b419,0xb337e34e),LL(0x0208ba8a,0x7e584157),LL(0xab67774a,0x5a84d18c),LL(0x108ac516,0x77b69d31),L_(0x000001a9), LL(0x652943fd,0x91e5bcfd),LL(0xcd5e892a,0x5aa27743),LL(0x502744c8,0xa0414bf5),LL(0xe26bb91b,0xbc4ef773),LL(0x8bcd45f8,0x8f9e301b),LL(0x3589038c,0x30d42898),LL(0x9a5f5e5a,0xa609f771),LL(0xaf5c6671,0xade09eb4),L_(0x0000003a),
+ LL(0x284eb84a,0x775485ec),LL(0xf826fcc0,0xa66e99e3),LL(0xfac7759b,0x6006cfb6),LL(0x13b284ca,0x1fbb2a30),LL(0x53d194ad,0x2c2b6910),LL(0xf54ebb36,0xa49dd337),LL(0x46a6edea,0x8fc79498),LL(0x0d6aff86,0x842dc894),L_(0x000000f6), LL(0x954ada11,0x34121245),LL(0xb4cfd050,0xafb75e83),LL(0xaf8c43b1,0x77a38e5e),LL(0x4ff38619,0xe7485f16),LL(0xfa745e75,0x7e4f2466),LL(0xcdc30bb6,0x009d4a36),LL(0x9994c740,0x25e09cb4),LL(0x66ca76f4,0xf59131dd),L_(0x0000019e),
+ LL(0x7773c26b,0x6edaa49d),LL(0x0aa308ea,0x7669b865),LL(0x72c7a072,0xf06e514b),LL(0xa7ddba09,0xca616052),LL(0x126487b0,0xd64c8323),LL(0x713cc701,0xb7fd1abe),LL(0x84ce35d3,0x7bfbc16b),LL(0xba894fdd,0xba61b8c2),L_(0x0000009f), LL(0x27a3cc9b,0x18d74478),LL(0xa66248c8,0x62b773bd),LL(0x3c1ca3e3,0xde584f76),LL(0x5c3541fa,0x475ec797),LL(0xe7fdfe89,0xd692c26f),LL(0xe8463461,0xe888fcbd),LL(0x682f9099,0x1a8aba10),LL(0x0ae8eea4,0x2cc79e0c),L_(0x000000cc),
+ LL(0x2edafeba,0x901772ff),LL(0x6d000499,0x481b7323),LL(0xb7a27eb4,0x69fc5685),LL(0x4a7abcd1,0x47ec07ac),LL(0xcde4a9ac,0x56f5f84a),LL(0x45545bfb,0x6ef7da38),LL(0x33e7eca8,0x2edec324),LL(0xd8a46ddf,0xd29093de),L_(0x00000155), LL(0x94de9831,0x163bac52),LL(0xbeecc923,0x637f0966),LL(0x0af4893a,0x1759af91),LL(0x1d38f097,0xe0aea79f),LL(0xf9d81651,0x8ae541b7),LL(0x510d4c3c,0x32bd0e43),LL(0xd73faaea,0x6891a73c),LL(0x3864a690,0x6feafb02),L_(0x00000019),
+ LL(0xeacf95da,0xa0c16a35),LL(0xb6681c57,0x415f0571),LL(0xb2c83a60,0xcfe1f331),LL(0x4b9088d9,0x1279d3aa),LL(0x2ab5f2f1,0x29c29c20),LL(0xd47ee149,0x16735420),LL(0xfbb44304,0xb8379216),LL(0x23034403,0x20a6f133),L_(0x000000aa), LL(0xc23990b9,0xe0a94e50),LL(0x38217da2,0x2ba297d2),LL(0x18816b2c,0xe566aa72),LL(0xca63550f,0x1c7b21ca),LL(0xdfe51644,0x10c887fa),LL(0xef849ed8,0x4faeda58),LL(0xb92e8367,0x03636294),LL(0x2414c0ef,0x8476a050),L_(0x000001ab),
+ LL(0xfd6f68b0,0x93412483),LL(0x9f53d923,0x4403bdcc),LL(0xe30fa97e,0x6c9d0aa5),LL(0x1601e86b,0x9c1a2ec2),LL(0x19610105,0x431d5f14),LL(0x6cc0662b,0xb7bbdb4e),LL(0x84ed40f8,0x266aca0a),LL(0x1b8a27f1,0x198bae2a),L_(0x00000036), LL(0x95509e62,0x33afa5e4),LL(0x023ed8a6,0x8523afba),LL(0x036adaa0,0x83cbabb2),LL(0xf5cebadd,0xac3f99aa),LL(0x20899c44,0xca5f46cf),LL(0x0e94933a,0x7a04e2c1),LL(0x9a3fee46,0xb0015196),LL(0x367a01a4,0x1715a693),L_(0x0000001d),
+ LL(0xb429b2e7,0xc2d951af),LL(0xd89fbf0d,0x4488a068),LL(0x172ac7ad,0x7772ecaa),LL(0x0409a3f1,0xf7780ac8),LL(0x6d541e69,0x6ffa0a05),LL(0x4e8fccac,0x7509c471),LL(0xeff8ec93,0x018bbf89),LL(0x101b9048,0x2b2d5626),L_(0x00000102), LL(0x4bb1ca6a,0xbd338134),LL(0xda4a1896,0xaeb1aa9a),LL(0xdfd1cb54,0xc0b310a4),LL(0xeea1a455,0xbed91e2c),LL(0xaae7927d,0xd3502cea),LL(0xdfdf4808,0xd31ee1ce),LL(0xecc68f6a,0x893f08dc),LL(0x9350fda5,0x2a6f281d),L_(0x00000114),
+ LL(0xb4f8335f,0xd5d022dc),LL(0x6e654db2,0xe4aaf49d),LL(0xaa763047,0x24820282),LL(0xfe8aa2dd,0xef229292),LL(0xb7ff78ba,0x0170b38f),LL(0xe0a88558,0x0aca63f0),LL(0x66a526d3,0x97a4873e),LL(0xc069b5d3,0x28c88b56),L_(0x000001f1), LL(0xb3873204,0xa3de237d),LL(0xb57187d4,0x20e27844),LL(0x59762170,0xf8485db5),LL(0xf8fe71f6,0x47186213),LL(0xccceb1f1,0x3ddfa68a),LL(0xe9e1e35a,0x3805a749),LL(0x048090bc,0xeea89d03),LL(0xd04309c8,0x451591c1),L_(0x000001d8),
+ LL(0xe0dbf609,0x2e8fa162),LL(0x86c08a44,0xb15f83f4),LL(0xd94f9cd2,0x50bb6a89),LL(0x7bbf2a23,0x606cc572),LL(0x74b1325b,0xb03f198a),LL(0x73b79d3a,0xcf731a6f),LL(0xc95046a9,0x298efd11),LL(0x095ed71e,0xd622bb24),L_(0x00000074), LL(0xb59eae12,0x08c383b3),LL(0xb2f19275,0xe14dee81),LL(0x0d888be6,0xce4b12e8),LL(0x213fb612,0x78248f53),LL(0x43092c13,0x4330dbca),LL(0xe40c52b2,0x952b9ef5),LL(0x9d869889,0x31f1126e),LL(0xfbc05f41,0xfd03ae1d),L_(0x00000103),
+},
+/* digit=89 base_pwr=2^445 */
+{
+ LL(0xbdfd1e31,0x6e868b8b),LL(0x244e266c,0x05a4369e),LL(0x7c7bf40b,0xe296776b),LL(0xaed3b7e1,0x2cfd9c18),LL(0xddbc31e2,0x1ea90d63),LL(0x98abb7bc,0xe50b9291),LL(0x791f36a5,0xc2f87e55),LL(0xfe737c71,0x75c6d8e7),L_(0x0000004f), LL(0xd596ad7c,0xd54c9eb7),LL(0xa0fb486a,0x91d1e1e1),LL(0xd820f02c,0x9160a67f),LL(0xe5d16017,0xf1163f25),LL(0x8b61c557,0xfcbc9a92),LL(0x84ed79f2,0x6a33df9b),LL(0x54ba6955,0xc8febe18),LL(0x43c5cb8a,0xec5a3443),L_(0x000001a7),
+ LL(0xef36f15e,0xa725a8ec),LL(0x5828c615,0xf603a049),LL(0xac113424,0x87a77e81),LL(0x34642c16,0x761c2762),LL(0x9d0db298,0x29b1a474),LL(0x8ac3391f,0x143a9782),LL(0x050c5b69,0x5ae00925),LL(0xc578b0a2,0x144730ed),L_(0x0000016c), LL(0x4e6437c4,0x3bbfa384),LL(0x606aeb93,0x6e3daf55),LL(0x97e41356,0x4263527e),LL(0x4ac1c1ae,0x3a037893),LL(0x8c336382,0xb2143f58),LL(0x2bb7d997,0x69412726),LL(0x2419935b,0x9cb555c8),LL(0x724eeef9,0x2ef7f7cb),L_(0x000001b8),
+ LL(0x463c9476,0xf81335ca),LL(0xd6526151,0x999ff056),LL(0x3c494f0f,0x0a7433ca),LL(0x41b82dc1,0x7fa3bcdc),LL(0x9af11e06,0xec803bb3),LL(0x0ac7bb35,0x457b31fc),LL(0xb5e185aa,0xed555915),LL(0x586ab2cb,0x33044819),L_(0x00000097), LL(0x2112108d,0xbfc07b3b),LL(0xae813666,0x4f0a957b),LL(0x8eee1f42,0x82cf0958),LL(0xc3321225,0x4daeb7bd),LL(0x458ec031,0xe4de4e23),LL(0xd0f97884,0xfc50a768),LL(0x1655c201,0xb424f36a),LL(0x14f1a537,0x0cdff481),L_(0x0000006c),
+ LL(0xf3b637b5,0x22f8cb24),LL(0xf131c203,0x0c2b076a),LL(0x815ccfff,0xf056364e),LL(0xdbdfbdbf,0xc8028853),LL(0x41ab5760,0x8af0ee08),LL(0xca93ac08,0x3094da56),LL(0x30135092,0x5054010d),LL(0x74228a25,0x8e7dde67),L_(0x00000005), LL(0x5c512c3d,0x8a5176aa),LL(0x3779fd86,0xbe16420d),LL(0x7658fb3d,0x41f45c5c),LL(0x110cf130,0x49dea64d),LL(0x19e0e350,0x73f6746e),LL(0x87ca4575,0xfe7da390),LL(0x108ab4e2,0x874c5458),LL(0xe39cce4e,0x1d64965c),L_(0x00000179),
+ LL(0xb7099c8e,0xfa76cb01),LL(0x80465e82,0x38560d7e),LL(0xf4fd03ea,0xa649c8ff),LL(0x150b3815,0x72398c4a),LL(0xc0e6baed,0x1ba3da88),LL(0xfa79ad8b,0x6f43120b),LL(0x8353fc42,0xbd32e2fe),LL(0x7dbd7876,0x148c548b),L_(0x000001d9), LL(0xea549c25,0x18cf351b),LL(0x9ca7db2a,0x80485f13),LL(0x16240b9e,0xdfdb85c4),LL(0xc2dc15ee,0xbb4121d8),LL(0xcce3d597,0x0e963371),LL(0xafb37db7,0x7c69e287),LL(0xed3b5fd8,0x6c8d52b6),LL(0x608eaea5,0x053f2384),L_(0x00000165),
+ LL(0x625fe0c4,0xbbf62c47),LL(0x1eac543b,0x11eca801),LL(0x4e45d301,0x682f5663),LL(0x054cb071,0xe9473698),LL(0xf1ad1950,0x860a714e),LL(0xa8a339c8,0x96d39034),LL(0xe04ab8cd,0xde22b09f),LL(0x2a845e02,0xdfec2116),L_(0x000001e6), LL(0xaad333d8,0xeaca7b49),LL(0x3e7c928e,0xb0fcae9a),LL(0xca8b3e2f,0xc41fdaef),LL(0x9529863b,0xe1843977),LL(0xd56a624a,0xee7e83a7),LL(0x3438606a,0x81db821d),LL(0x06cdb198,0x3aa0eeb4),LL(0x9b12775b,0xe0d60750),L_(0x000001da),
+ LL(0xb1f4b70e,0xbe8e1de1),LL(0x9b0a79d8,0xc345fcdd),LL(0x77d93da0,0xb2f5a213),LL(0x7028f9ce,0x800fcc19),LL(0x1306f2ff,0x469efe59),LL(0x4cd68bf6,0xc5ffe046),LL(0x62b03f93,0x53010575),LL(0x5af4940d,0x46961f0f),L_(0x00000171), LL(0x354ba888,0xad6952b3),LL(0x9045b751,0x43f410dc),LL(0x217ebd7d,0x0d11a22c),LL(0x6ddeefda,0x6d1775a7),LL(0x43965993,0x055c0203),LL(0xe7060f57,0x3548b71e),LL(0xa89da1f0,0x805eb428),LL(0x6f8231a6,0xf7b78a97),L_(0x000000f7),
+ LL(0xb3368550,0xcf1f7c72),LL(0xe247b483,0x97b6bf76),LL(0x202781dc,0xc0f81747),LL(0x8b65bb58,0x92efba88),LL(0x9611a60c,0xd9612af5),LL(0xaf54a57c,0x20d7ccbe),LL(0xf8689ba5,0x6d3cbf9e),LL(0x0591cc36,0xdc1abfe9),L_(0x00000056), LL(0xcd538940,0xd4a04bec),LL(0x1e600b02,0x2a15021b),LL(0x6c3ebe8f,0x9586be60),LL(0xb8507cfe,0xf4028af5),LL(0x54dda762,0x4d392e89),LL(0x519d3758,0xbde8dadc),LL(0x58c3813e,0x81db641b),LL(0x91557ce6,0x23fa3b99),L_(0x00000063),
+ LL(0x3b03dea1,0x51bb00fd),LL(0x32b04d9e,0x8aefebe4),LL(0x22b78b18,0x8698b63c),LL(0x7da3c01d,0xa71b8bc0),LL(0x8d71ee46,0x27b7a39c),LL(0xb0583313,0xbd156109),LL(0x49d2846e,0x931258ab),LL(0x86e6af4e,0x3ca87258),L_(0x000000b6), LL(0x429e4df7,0x79f7c689),LL(0x39041060,0x6229b813),LL(0x9028538d,0x3a4aa59f),LL(0x517bfaf7,0x2d1cb542),LL(0x71d33bc2,0x882030de),LL(0x9ba76285,0x91ba5fcd),LL(0x25f86ca8,0x9ae0fc6d),LL(0x47f08f0a,0x3948678f),L_(0x00000089),
+ LL(0x22c29c44,0xcd9eb593),LL(0x18cd9b8b,0xac677eb2),LL(0x0d8705ef,0x6b203fcc),LL(0x934fa783,0x39fcfd85),LL(0x571b28eb,0x58bd6d8e),LL(0xd8f1d221,0x215fad4b),LL(0x3e44e705,0x827adc24),LL(0x5ff00393,0x1ec35c0f),L_(0x000001ac), LL(0xc588165d,0x14fc0a02),LL(0x5fce2e10,0x71f9384c),LL(0xf0f2ac5b,0x90d699f4),LL(0x7b00891b,0x43b6bcdf),LL(0xe8c4a652,0x7bc04d87),LL(0x0ac9f698,0x2ab126b5),LL(0x3eb3d860,0x849b38d0),LL(0x426d6e94,0xb6985535),L_(0x000000cf),
+ LL(0xe89608fa,0x0725d65d),LL(0x1183558e,0xb6a14f9d),LL(0x44070253,0x20d9075f),LL(0x6c243902,0x486b1799),LL(0x6c1a9d8a,0xf5efa075),LL(0x8ae5a14e,0x4ea72292),LL(0x2d7b9c93,0x0ca5c12a),LL(0x992cae02,0x91e3345c),L_(0x0000005b), LL(0x306b8949,0xc89bcdf7),LL(0xd10410ec,0x89966bf7),LL(0xcf680bd5,0x6ee731b3),LL(0xa0c3db72,0xe37f14f5),LL(0x2aa5a376,0xf554bdb7),LL(0x23be47dd,0xef1712c3),LL(0x96ab9b1d,0x1c7594e0),LL(0x9ed66d28,0x032ce687),L_(0x0000003d),
+ LL(0xc8516fe7,0x9e3351dd),LL(0x68d68f89,0x9fb7334d),LL(0x40ebf359,0xc5209aaa),LL(0x120177c0,0xe5d00b75),LL(0x2f0e6bbb,0xbf188e69),LL(0x110d2427,0x8e2e5213),LL(0xd6344a1b,0xdcf577cf),LL(0xa7331f94,0x3c553feb),L_(0x0000013c), LL(0x64f458fb,0x795a2fa2),LL(0x524f4a9f,0x6609f22b),LL(0x6b23609b,0x2c95b3f8),LL(0x0500bc47,0x8df999a3),LL(0x042c79e9,0x9db59925),LL(0x12a07a8b,0x55be1532),LL(0x07f62419,0x33c89540),LL(0x8df78722,0xfe671ad7),L_(0x00000141),
+ LL(0xe38c8109,0x18059a16),LL(0x52e9bed4,0x717c36f7),LL(0x49d5e825,0xb56dd6dd),LL(0x7783b6cd,0x667fac4c),LL(0xcf53b558,0x116a1985),LL(0x7c15cf14,0x9913c6ee),LL(0xe08410c5,0x6728a2a4),LL(0x9d771edb,0x331fb13d),L_(0x000000be), LL(0x34b06991,0x394ecd2b),LL(0x8da76d72,0x341e75ff),LL(0xf52f78d6,0x29ea6d71),LL(0x46d211ab,0xaf402bfc),LL(0x386ae83b,0x7e9586dd),LL(0x909f5bf1,0x11c7f555),LL(0x1b8a537f,0x427868fe),LL(0xcf05f9d7,0x32daf130),L_(0x00000055),
+ LL(0xc5d1aadd,0x4ef2bfbd),LL(0x360e62a2,0xc1081697),LL(0xa6a207aa,0x28d01fdb),LL(0x18abc7ac,0x204fc30b),LL(0xbcff0be1,0xe5cdb570),LL(0x48ef40e1,0x1f0b1c2e),LL(0xeb79790f,0x63136e14),LL(0x3d4fe961,0xb9d45c94),L_(0x00000140), LL(0x79d14142,0xa61088da),LL(0x8938b0fa,0xb39c86bd),LL(0xc33f1d7c,0xa2380177),LL(0x530d6911,0xaab3667d),LL(0x7b52bed9,0xd815d83b),LL(0x5c596749,0x44b95fe0),LL(0x5148c157,0x202c91ff),LL(0x406b7485,0x8bf24d49),L_(0x00000006),
+ LL(0xf808d1d3,0xd37bc919),LL(0xe29da36d,0x00b56fef),LL(0x7458f713,0x8621718f),LL(0x286883b4,0x448b7c11),LL(0x363d4ba5,0x6114fd6e),LL(0x04011c7c,0x0d4b7500),LL(0xe765f7ee,0x491c6545),LL(0xc2b827eb,0xd01f3320),L_(0x000001f5), LL(0x464d4102,0x6902bd96),LL(0xda599389,0xe2b47365),LL(0xfe7e3528,0xe9079def),LL(0x3aa4556e,0xc96d3bc8),LL(0x610e35fb,0xb585febd),LL(0xa0b2ea82,0x70988a63),LL(0x60d1db4d,0xd27f19aa),LL(0x6eee4c02,0x248d0f40),L_(0x00000073),
+ LL(0xa17e11d6,0xba327209),LL(0x4da0ba85,0xfac1ed29),LL(0x2e3b7145,0x48cf218d),LL(0x5cbfef12,0xde112f17),LL(0x76f3e234,0x194a8f16),LL(0x65787086,0xde1af9c2),LL(0x18958d56,0x495c76a5),LL(0xdd3dbcba,0xa5e9c9c9),L_(0x000000bf), LL(0xf9f1e953,0xb1fcebaf),LL(0x30a1b712,0x73d82709),LL(0x8296f1f2,0xfa6e1f41),LL(0x5ef71edd,0x7dd19081),LL(0xc4a2f8af,0x2f6fda9b),LL(0x85b1234b,0x541a4825),LL(0x23556036,0x79e6b22e),LL(0x911ac1cc,0x88ea71f9),L_(0x00000199),
+},
+/* digit=90 base_pwr=2^450 */
+{
+ LL(0xd86efa4b,0xa22cc5d8),LL(0x8ee779a0,0x5dd5d86c),LL(0xfd215954,0xfd5e2c81),LL(0xab1c7262,0x75f13cf7),LL(0x4f36ad82,0xe759a0b7),LL(0x8c3ddc91,0xd2223c0c),LL(0x10948a51,0x9b2c7f7d),LL(0x977160cf,0x285822b5),L_(0x0000000f), LL(0x92851c33,0x1a1e9623),LL(0xd7c127ef,0x7e5e2b50),LL(0xd984c528,0x3999dfdf),LL(0xaad5ce7d,0xd1373907),LL(0x5c84726f,0x97f8f082),LL(0x5ebbc32d,0x68dcb5c5),LL(0xbd51b3a0,0xa1b4f592),LL(0x36935287,0xf3eb9dca),L_(0x000000c8),
+ LL(0x56f967bd,0x95c0c51d),LL(0xdbb76844,0x7bb768dd),LL(0x35dbc45f,0xeda49098),LL(0x39df9e6d,0x3639006a),LL(0x47f77ee7,0xd878e5a2),LL(0xd141b2c8,0x2c8ccd83),LL(0x04a47e33,0x2d4027f8),LL(0x2c9dc7a0,0x9934bb00),L_(0x0000011b), LL(0x8efe0042,0x8d777a83),LL(0xd9919c1d,0x0f685368),LL(0x9dd72165,0x892863f1),LL(0x2a92b1de,0x8f2b25a3),LL(0x90ff3dd7,0x12a43206),LL(0xaf7bb8bc,0xe03505a4),LL(0xd763efcf,0xcf4f256c),LL(0x53701c70,0xef267753),L_(0x00000043),
+ LL(0xf628351d,0xecb197aa),LL(0x593ffafe,0xdd6e37e8),LL(0x40fd5b94,0x41331e2a),LL(0x298fef4f,0x60fb849c),LL(0xfd38fb42,0x7e149e93),LL(0xe83fe7b3,0x22e02e59),LL(0x5d08e682,0x58b84ec3),LL(0xcaa4bfd0,0x7f8e6b6a),L_(0x00000004), LL(0xc3c8a59d,0x89faa591),LL(0x3bdb5b23,0x6e000f52),LL(0xa824fd00,0x630a4795),LL(0xcbf7e717,0x4e000837),LL(0xc37102e6,0x5656508a),LL(0x40d36c3a,0xe0b06b84),LL(0x0a694f94,0xd89beeae),LL(0x647088c8,0x682c3563),L_(0x000001d9),
+ LL(0xd4220577,0x49e0800c),LL(0xd1b7504d,0x59ebe077),LL(0x04fd80e1,0x714afb4f),LL(0x90ea18a8,0x28810d8b),LL(0xf02c3cde,0x719cff83),LL(0x19367a86,0x8786eb9e),LL(0x952bac43,0xecceb4e9),LL(0x460e0748,0x55aefa66),L_(0x000001aa), LL(0x1f2623e4,0x7aaa315b),LL(0x44f96e09,0x7a5db2b5),LL(0x5dae237e,0xa9362519),LL(0x163873d0,0x69799223),LL(0x4d0fbf55,0xc1a58ea8),LL(0xd3bb728a,0x661ed43f),LL(0x100cfe43,0xf1cd21af),LL(0xa24f55c6,0x25dcbe9f),L_(0x00000118),
+ LL(0x33be448b,0x5ef36acd),LL(0xd5225f3c,0x5770b7a0),LL(0x90f00a62,0xebdaa1b7),LL(0xc0ab750b,0x1bcb88b8),LL(0x4d9be029,0x06bbf584),LL(0x9dfcba75,0x606f29fe),LL(0x74e426d7,0xd113e261),LL(0x2931cda9,0x0453e382),L_(0x00000056), LL(0x2b727cee,0xba1e3830),LL(0x95a907f6,0x1922ca15),LL(0x760c0c2f,0x24719cf1),LL(0x383ccd2c,0x11f794fe),LL(0xa0495e03,0xaf40e690),LL(0x3eba817e,0x1fab7cdd),LL(0xa83e8359,0x9846062a),LL(0x737b3c03,0x52241afa),L_(0x0000005b),
+ LL(0x747efd45,0x2d0ad5b6),LL(0x49587f7b,0x321154b0),LL(0x12ada5b1,0xdc3aa007),LL(0x0fe792e5,0xf996b5f9),LL(0x0e4944ed,0x8197e83f),LL(0x06340a72,0x6a72b742),LL(0xb3002f8a,0xbc8a8319),LL(0x173328b5,0x81f8ab11),L_(0x00000139), LL(0x964808f4,0x2774c6fa),LL(0xbe5f49f5,0x674e04ad),LL(0x8fbf7faa,0xe6de1313),LL(0x5724658c,0x38fee508),LL(0x6a0cb3e6,0xeb3e2c17),LL(0x24438695,0xe7eaef00),LL(0x43ac8a73,0x4dc94b9f),LL(0xd190f6ea,0x422b705b),L_(0x000001cd),
+ LL(0x1bd57124,0xd43e3b34),LL(0x02b39b5b,0xd46524f2),LL(0xabfa1c64,0xa4dd7015),LL(0x8ec6eade,0xfac38f67),LL(0x78cba481,0x1123582f),LL(0x61a4550d,0x1caa4894),LL(0x42f7ada2,0x83747c68),LL(0x17f7f74c,0xffb17df5),L_(0x00000130), LL(0x02e47bb1,0xeb2b93af),LL(0x7f0ef78c,0xcf301d2b),LL(0x8e9f267c,0x8e246b2f),LL(0xb4a2acd2,0x2035c962),LL(0x50846229,0x97e899e6),LL(0xe23609a5,0xfbcb2b53),LL(0x1483eb63,0xfc3f203e),LL(0x4d6ddbe6,0x2861a320),L_(0x00000039),
+ LL(0x5858d75c,0x41fc794a),LL(0xffcd84d6,0xf5985a4a),LL(0x5082ece4,0xcf3bb3f4),LL(0x850b4853,0xb1d8af65),LL(0x670d980b,0x6953dc3e),LL(0xf579458a,0x7963424e),LL(0xac2f2e4a,0x540b6858),LL(0x920d771e,0x1f5fed22),L_(0x000001be), LL(0xc4864af0,0x731be223),LL(0x662c4dc5,0x1419cfbb),LL(0xa5701752,0xd65099ca),LL(0xfbcc0240,0x3af88f3b),LL(0x1643acb1,0xfbc4861e),LL(0x67405bcd,0x35f067ed),LL(0x9351f1c8,0xcb8018ed),LL(0xeed0e188,0xd276f971),L_(0x000001f8),
+ LL(0x7974a311,0x8cc00e47),LL(0xd167d662,0x311413fa),LL(0xb1947f2a,0x68fd100f),LL(0xc373b68f,0xd96895d1),LL(0x259f8c2b,0xb6277660),LL(0x495d6470,0x6dd59691),LL(0x9eee1f91,0x8e4a7fc7),LL(0x1b01dab7,0xf1319245),L_(0x0000009c), LL(0x2efe3e85,0x3751b5a9),LL(0xb3dd751f,0x352c6ed0),LL(0x36c470b2,0xbb64e49d),LL(0x58925906,0x5b0b62a0),LL(0x9089d01b,0xe64e7de4),LL(0xf631915c,0xcd161d83),LL(0xfa1f87e7,0x44c46466),LL(0xcced2cc6,0xec7eb165),L_(0x00000125),
+ LL(0xda580a2f,0x0360b595),LL(0xc1265889,0x3fa41625),LL(0x9e6d3563,0xa19100cb),LL(0x10accaeb,0xaec86fbb),LL(0x7b3f3d8a,0x80771b15),LL(0xdb2ccbe9,0x803f9c49),LL(0x07a460fa,0xf34e5b14),LL(0x4b602490,0x6a99a6e6),L_(0x0000005d), LL(0x47562df1,0x308acd32),LL(0x65b0ad8e,0x3dceea03),LL(0x13ece697,0xe1bef19b),LL(0x0643badc,0x4cbdd893),LL(0x470bd8ab,0xafc33073),LL(0x39f6bceb,0x17b3cfed),LL(0xf3aad086,0x198868e1),LL(0x0e329726,0x9f6251f8),L_(0x00000016),
+ LL(0x2910e070,0x2c636d48),LL(0xd1bce1b0,0x51f92c94),LL(0x1ad3a1e4,0x88368755),LL(0x9be2c281,0xd8124a18),LL(0xe3a680f7,0x9e5bc7e6),LL(0x5e952f4f,0x2fefbd16),LL(0x5cef9135,0x19b6c616),LL(0x5576fffd,0xbf997c16),L_(0x000001f9), LL(0x7be439b2,0x01681747),LL(0xdbf38f7d,0x00a3bfc8),LL(0x549f1e54,0x39cded9a),LL(0x23fdd541,0x8b94ded9),LL(0x89eeca5b,0xfd084a5a),LL(0x5123eaa5,0x834be49d),LL(0xae42403e,0x02444c83),LL(0x25abfb57,0xbcb65841),L_(0x00000091),
+ LL(0x9621f3da,0x606a9e44),LL(0x91ee418d,0xd2dd052e),LL(0x7e5ea0e7,0x92e787f3),LL(0x69d6f73c,0x4508ea48),LL(0xfe248ecc,0xa2d461ac),LL(0x529ffcc1,0x22dcbd24),LL(0xf90dc5dc,0xa3364562),LL(0x542f8abb,0xd254e4f9),L_(0x0000016c), LL(0xc0262fa6,0x990aa036),LL(0xc4f4234a,0xb59ee2ed),LL(0x1031cef9,0xd5d4b081),LL(0x984145d5,0xdf2c037b),LL(0xc7b07787,0x2a2d6af2),LL(0x31d56853,0x6d5e6ff4),LL(0x309a7c9b,0xbb40c66e),LL(0xda6a3ee9,0xaf9db41c),L_(0x00000081),
+ LL(0x959a8be0,0x2ab124d1),LL(0xf806ef78,0x2f7a4e31),LL(0x0cea295c,0x32a4553d),LL(0x8a3bdbfd,0x19971283),LL(0x3b9e4766,0x8810a423),LL(0xcdcf9f57,0x8e85dc85),LL(0x020a6262,0x129bd8b1),LL(0xbc50d2d2,0x9a64395d),L_(0x00000068), LL(0x5b27b0a7,0xde8938c9),LL(0x2bd0d178,0xb0b45608),LL(0xde7e99ed,0x36896362),LL(0x3851afd1,0xe2cc94c2),LL(0xdfbefd8a,0x14aa57ae),LL(0x3c1abef1,0xd8652bb1),LL(0x0cc39736,0xaf001e99),LL(0x72b91536,0x9fdf9a10),L_(0x00000157),
+ LL(0x29021dc7,0x4403c833),LL(0x48e45088,0x26afc7d8),LL(0x41225474,0xa4629460),LL(0xcc7a0cd5,0xff951c59),LL(0xaba7cf1f,0x0d1f3526),LL(0xaf07c8ca,0x18426df5),LL(0x2746f85b,0x42d2e91b),LL(0xfabc76e4,0x58debcd4),L_(0x0000017d), LL(0x888a4dcd,0xa9da44e7),LL(0xeb092c08,0x1d496006),LL(0x0b68b024,0x67bb5005),LL(0xbf7c5c64,0x0562f97c),LL(0xca481cfe,0xb0ce28f4),LL(0xc88ad0f0,0x5bcd7411),LL(0x79f82640,0xcfb08fb0),LL(0x9dac9879,0x22beef72),L_(0x00000060),
+ LL(0x4092ef3c,0x055ab7d2),LL(0xb9344cd4,0xcbb171f1),LL(0xf24efa25,0x63c2684d),LL(0x4f8a3dbe,0xf0b702dd),LL(0xda3c37c4,0xa46de3f5),LL(0x17afe9a8,0xdeacde9a),LL(0x55f90e6b,0xb3ba7f88),LL(0x4d24b1d2,0xa174d6f6),L_(0x000000cc), LL(0x8d8e436b,0xbb7dee1a),LL(0xa172733c,0x562c1d69),LL(0x4325a01b,0x851c2792),LL(0x2307ef6a,0x99968ef0),LL(0x69918f4f,0xb12cbce1),LL(0xcd378fb1,0x9c21abf8),LL(0x48639036,0xe801ee02),LL(0x8268fb51,0x7205404d),L_(0x000000a5),
+ LL(0x7a194c8a,0x3a0f6f06),LL(0x7ad7abcf,0x531ca66d),LL(0x41cf832b,0x4ac4965a),LL(0x0f9f470a,0xe00766a0),LL(0xa92657cb,0xb432af80),LL(0xac40c892,0xa94b8968),LL(0xbd44eded,0x4be8b74c),LL(0x2a8d4620,0x98f760bd),L_(0x000001dd), LL(0x2479db10,0x2a7f464f),LL(0xdb3e7dcb,0x00b58c0f),LL(0x1a96b289,0x3c1d7ee5),LL(0x7a30a299,0xbf0ce935),LL(0xb49f5f57,0xf1f5d39e),LL(0x8f0c1970,0xac9cfb8b),LL(0x0718d4fa,0xe1c25a36),LL(0x66ec4ed9,0xb0d7504b),L_(0x0000004b),
+},
+/* digit=91 base_pwr=2^455 */
+{
+ LL(0x9db6d8d2,0x72de604b),LL(0xda62b655,0xfb7d9262),LL(0x9db8d0d3,0x8e9c2aa3),LL(0x9b867b7f,0xf2912d3c),LL(0x1a5ad674,0x279e6d83),LL(0xc6935b1c,0x82236f3c),LL(0x9a75e08b,0xfcf8f6f0),LL(0x1baaa28c,0x5ff40727),L_(0x000000f7), LL(0x120a90c1,0xab24706c),LL(0x991d9aa4,0x2ed85b4f),LL(0x767e0695,0x0793e3c1),LL(0xf7d06ffc,0x6115d975),LL(0x1316443d,0x9c57472c),LL(0x0b8651df,0x8b972443),LL(0xda1a64f2,0xf1bbd8db),LL(0x0c6db846,0x62aea165),L_(0x000000f5),
+ LL(0x6eab9379,0xd5d810c8),LL(0xe6eb51bd,0xe42198e6),LL(0x9bc2e3a0,0xc4b3dc48),LL(0xeda7e391,0x6ed77fe5),LL(0xcd0e3d73,0xc5e60972),LL(0x05f70f41,0x26a51aaa),LL(0xb07669f4,0x9830a47d),LL(0x34591483,0x45b98cf4),L_(0x00000090), LL(0x69325242,0xdc9d9c57),LL(0xf4c3b8bd,0x95086409),LL(0xd467dc92,0x3e6cf0fa),LL(0xfbebdef2,0x9684c1e0),LL(0x1daa3a72,0x8c3a2301),LL(0xf40ca0da,0x850f8c4e),LL(0x4dda12c0,0x990ccbe3),LL(0x8f2c5e51,0xc2f0adaf),L_(0x00000094),
+ LL(0x45c80cae,0x248df475),LL(0xb7ac228f,0x869c271f),LL(0xc18f18ee,0x46d75c07),LL(0xb3a5cead,0xa1a299f1),LL(0xf8c96489,0x7ba98e94),LL(0x805d6dbc,0x1a1d6b09),LL(0x485c463f,0x5bca1865),LL(0xfae82626,0x54594fd7),L_(0x000000b1), LL(0x88e41bdb,0x13e4d735),LL(0xb2ef61b8,0x5d0af04c),LL(0x3f79b3f0,0xe86965cf),LL(0x8df70be4,0x6a326017),LL(0x93f5bd3a,0x59b253c0),LL(0xcbf1399d,0xa14a5e9e),LL(0x5112a46b,0x98f7dd60),LL(0x84b48e76,0x9c0c1a6e),L_(0x0000005f),
+ LL(0x390065e7,0xf887b36a),LL(0xa9bb0064,0x651f2c93),LL(0x4572329d,0xd988aed3),LL(0x6f510e01,0x48541e9e),LL(0xabc023be,0x90ac10a8),LL(0xa8621efc,0xf943b700),LL(0xeb208400,0x768bb3b3),LL(0x64d85b1c,0x634af0db),L_(0x00000142), LL(0x250b4be1,0xa7e0a10a),LL(0x4e42e593,0xacaa8063),LL(0xadef0026,0x6f2f96cb),LL(0x955002da,0xca66aa2e),LL(0x57271d8d,0x15a69e81),LL(0x66dc7629,0xcf29f326),LL(0x378977dd,0x07d6619c),LL(0xe10e5eaa,0x48e47a94),L_(0x000000a5),
+ LL(0x9612b84f,0x60476dab),LL(0xd5ce8836,0x1ca95649),LL(0xd950d005,0xf0b56f1d),LL(0xe5ff1bc5,0x06d36f22),LL(0x6e683386,0xe2bbd6a0),LL(0x249d13ac,0x69fc343c),LL(0x15998eb3,0x47a41e75),LL(0xf1860545,0xc5dfbed2),L_(0x00000169), LL(0x972e1e1b,0xc1e80885),LL(0x5129b884,0xf74074e8),LL(0x9d124cde,0xb7fa9540),LL(0x9c58531f,0x291d5e4a),LL(0xaf4422a4,0xb30d5ded),LL(0x4cd8b631,0x30a12b16),LL(0x4d0ff100,0xb2d9901c),LL(0x450557f4,0x1b1ee29b),L_(0x00000026),
+ LL(0x85c6eadf,0x6dcd5109),LL(0xc399a187,0x5c966d1c),LL(0xfc77243f,0x4abf82c9),LL(0x3aec3b2c,0xfaf22c71),LL(0x4988df1e,0xaa22e170),LL(0x8f28a287,0x7d192a2d),LL(0xf724ea96,0x6179ade0),LL(0x8ced48e7,0x18acdc5b),L_(0x000001f3), LL(0xc8ad685c,0x0c63196a),LL(0x8e70052b,0xa08be270),LL(0xd8ff45f4,0xe9bd37fa),LL(0x46164862,0xcc39748e),LL(0x3cc067ef,0x7dcfa284),LL(0x68836731,0xc4586ae8),LL(0x8aabfd38,0x85ecef5b),LL(0x815642ea,0xaf78e84b),L_(0x00000073),
+ LL(0xbecd1954,0x55d6e970),LL(0xf86e2eca,0xa3c6d699),LL(0x35fd609b,0x277a6dcb),LL(0x8e0371bf,0x73c53bc0),LL(0x69861b02,0x747c9b1f),LL(0x121dd3fe,0xf6c83ab7),LL(0x1a4b5c05,0xa41b4b4b),LL(0x103beb00,0x6b773426),L_(0x0000002a), LL(0x2273e127,0x590624d3),LL(0x968b4935,0xdc61d6e8),LL(0x57ff9d1f,0xc882f647),LL(0x3774a13e,0xd8068210),LL(0xc8094f39,0x52df5a78),LL(0x9ce26b44,0xd80b9309),LL(0x06b76a9e,0x51126d68),LL(0x26a298cf,0x20129462),L_(0x0000002a),
+ LL(0x4a23b337,0x00b763fd),LL(0xe905f611,0x31c9604c),LL(0xad5b3ffa,0x059b27d0),LL(0xe85817bf,0x957d997f),LL(0xc9cea64f,0xa8adabfc),LL(0xbf24cb58,0x74dd2fa1),LL(0xfe218a31,0x08cb0dea),LL(0xcfee69ca,0x310fed00),L_(0x000001df), LL(0xb0001602,0xd66e131e),LL(0x18c779a4,0x47a1fa4d),LL(0x13180dd7,0x23f27ad3),LL(0x3169340c,0xdf4a2f35),LL(0xa8c2be04,0xaec77b35),LL(0x3a1f8aa1,0x2eed7fb2),LL(0xe69edc27,0x6110abc9),LL(0xa5d58ddb,0xe7590226),L_(0x0000002a),
+ LL(0xc035887a,0x2331223f),LL(0xe2c10ac8,0xb1509b5c),LL(0xf8262756,0x8c8a002b),LL(0x4f5e4c0e,0xccc65314),LL(0xaa63ef65,0x5d26b24c),LL(0x91432899,0xaef2d2ee),LL(0xace0562c,0x284cbe21),LL(0xdd5ba0e2,0x4e06f44f),L_(0x00000176), LL(0x604bd262,0x9becc83c),LL(0xb164c12c,0xc02c461a),LL(0x811e7743,0x621b38ad),LL(0x8fde0227,0x61151b61),LL(0x1eee0c18,0x90989162),LL(0xa3e85682,0x6d28169b),LL(0x478f9519,0xd980aa5d),LL(0x35d9dbcd,0xf940dd13),L_(0x00000120),
+ LL(0xe818a77b,0xf6f3cc8a),LL(0xede150db,0x71295f54),LL(0xc2f06bc3,0x173c2266),LL(0xbd26ab2d,0xda0b8b46),LL(0x958aad7f,0x470909e3),LL(0xbeb03518,0x0c135242),LL(0x6b5aad80,0xe6b782b0),LL(0xf43a70dc,0x1ebe42a4),L_(0x00000176), LL(0x0792877e,0xe9ee87f4),LL(0x5c7acfe8,0xcb05380b),LL(0x7c5775ef,0x2d540e71),LL(0x4507bf0a,0x839d644d),LL(0xc6b81a8c,0xbd1ff451),LL(0xa45f8834,0xc6531b7e),LL(0x06bfc9c3,0xf1a607c3),LL(0xfacabe92,0x152a3731),L_(0x00000013),
+ LL(0x42b39a61,0x972ed0b4),LL(0x6043f03e,0x2b923d0d),LL(0xef133e76,0x91d9dd18),LL(0xbb6feffc,0x25386141),LL(0x9f4c0085,0x7c52d849),LL(0x279b119e,0x1a74529c),LL(0xfbddc6be,0x3bb14fa6),LL(0x0fc37390,0x5b0469e7),L_(0x00000130), LL(0x2eb5ef21,0xc18b1c46),LL(0x93ed9948,0xc3e5b7a6),LL(0xef0ebe97,0x98b816ed),LL(0x5877dfeb,0x369d99d9),LL(0x3e4311e4,0x2bf65ec4),LL(0x311d0134,0x8c99e5b8),LL(0xc89dbf6c,0x0a9bf18b),LL(0x0c03cf95,0x67a8c9b6),L_(0x00000134),
+ LL(0x05361f9f,0x4dad1ff8),LL(0x536327ce,0x2d1bf3b3),LL(0x5b0b6267,0x47367af0),LL(0xf13ddf38,0x8798d158),LL(0xa948f127,0x84fbc252),LL(0x3d0fe92b,0x978e6fc0),LL(0x0138676b,0xef9334ec),LL(0x96ea4ba8,0xb13cf224),L_(0x00000198), LL(0x7d693fd2,0xa8ac5c62),LL(0x19d6d21f,0xb670515f),LL(0xb4a2fb70,0x28de441a),LL(0x4762c399,0x0fd9e912),LL(0x3371fcdb,0x896888c1),LL(0x85fb68ee,0xd0e213f1),LL(0x2d86c189,0xcea1f849),LL(0x151cf6fa,0x49b94eff),L_(0x000001b9),
+ LL(0x1baf476f,0xab2c72b8),LL(0x009b461a,0x349ca815),LL(0x64f4891c,0x07d9a898),LL(0x0c2c3617,0xe9f189a3),LL(0x6792792c,0x226e9a21),LL(0xf620343c,0xc9fabe1a),LL(0x72bb7a93,0xda748299),LL(0x321acb19,0x1b2afe12),L_(0x00000023), LL(0x72c1891c,0x938118e1),LL(0xbfadb006,0xb72a44a8),LL(0x9204c26a,0x32e10cf5),LL(0xbf6c9c27,0xd43d80b7),LL(0xbe5c3cec,0x0afdab99),LL(0x915d7960,0x1a5a24d1),LL(0x933f89c3,0xfe011c0b),LL(0x93e4d990,0xfd09b45f),L_(0x00000123),
+ LL(0x8c930d5e,0x5c3e8550),LL(0x67c79888,0xf4f27501),LL(0x18ef2850,0x0d7f6b01),LL(0xf40547f0,0x9cb15ed2),LL(0x89d6f189,0x1bc417a9),LL(0x5c937894,0x22180816),LL(0xb0e0c28f,0x72ddfe6b),LL(0x95839d95,0xb0b70e2e),L_(0x0000016a), LL(0x5a755fcb,0x0092c31b),LL(0x3261be8d,0x81547562),LL(0x2ed776ec,0x2bc72da3),LL(0x7afed7b9,0x943fbdb4),LL(0x7b5a5d6d,0x896c4516),LL(0x44f20815,0x23f06fef),LL(0x5bd5c28e,0x8f4f6c6d),LL(0xaeda432e,0x355da25e),L_(0x000001b3),
+ LL(0x69860706,0xfa6c2c0b),LL(0x097c5794,0x8878edbb),LL(0xc8776355,0xf986d296),LL(0xb4dc28da,0xcb68b5fd),LL(0x7d364b0a,0xf5c63307),LL(0xa8df5161,0xe81fb7b4),LL(0x5837723e,0x9cfefa9e),LL(0x681c02e5,0xf9182f1b),L_(0x000001f5), LL(0x9e5af2e3,0x43741dfd),LL(0xeeeaf6e7,0x0f7f7db0),LL(0x912e6cbd,0x1b17b840),LL(0xfbc2bc3c,0xff0906cb),LL(0xaed2e1f9,0x79085d0d),LL(0x413a3a6e,0x3e5f9190),LL(0xf10a18b2,0x5e4a7967),LL(0xbe3ecf44,0xb4e7b709),L_(0x000000ae),
+ LL(0x8c349a09,0x9f76c8ab),LL(0x693d1574,0x254fd850),LL(0xd18a6991,0x4944e4ef),LL(0xf78f60f5,0xbc73879c),LL(0x125696fe,0x04c63e00),LL(0x8e1e2dbe,0x88e142f6),LL(0x688fd93a,0xbbe7321b),LL(0xd6f1e83a,0xa7b2fa13),L_(0x000001aa), LL(0xa9d97c57,0xcbcaa293),LL(0x19ff3b97,0xb39ad595),LL(0xcedb5893,0x7e59369f),LL(0x47364ed0,0x15852af3),LL(0x7c32e933,0x4d5a40d4),LL(0x82768fe3,0x06533865),LL(0x53f8e4c6,0xf43bf2b4),LL(0x8b4a96dc,0x2542e182),L_(0x00000033),
+},
+/* digit=92 base_pwr=2^460 */
+{
+ LL(0xe3fec0f9,0x0611a7aa),LL(0x83626ec8,0x91b56818),LL(0xaebe5044,0xecc113fd),LL(0x3fc31dd2,0x68171e0f),LL(0x5fdadf10,0x4d2fbb6b),LL(0xe94a492b,0x06c20ee0),LL(0x0723f06e,0xe2fed2d9),LL(0x8316b906,0x2f32d5d0),L_(0x0000013b), LL(0xf27e685a,0x63731c43),LL(0x2924bed0,0xf8996c91),LL(0x58df5bd8,0x04d16a64),LL(0xb4780e3a,0x3ff6f14c),LL(0x5aed0330,0xcf56c817),LL(0xb62e0f3e,0xf8163011),LL(0xee8bd1d8,0x5c28fa8e),LL(0x9fa055be,0x5edb8d9c),L_(0x00000163),
+ LL(0x9d6a36d0,0x0deb4c2e),LL(0x0e66e6ba,0xb2451f1c),LL(0x058a747c,0x20962d66),LL(0x0214b10a,0xda104e82),LL(0xe594cae1,0xb4693d32),LL(0xf837609c,0x059d3bb7),LL(0x53eda7c5,0x1dd16cae),LL(0x3eb60275,0xc67ede2a),L_(0x0000007a), LL(0xc49b1452,0xc838202c),LL(0x35c208ae,0xb2fb2035),LL(0x56079145,0x55be9713),LL(0x95c814d4,0xfd8f0bb3),LL(0xc09f6782,0xcc755426),LL(0x8edafadb,0x4ecf0b74),LL(0xeaf4bc3a,0x553943ed),LL(0xa2bff049,0xe542c407),L_(0x0000017e),
+ LL(0x76e77cb5,0x0d581933),LL(0xc0bba438,0x9ddc3e72),LL(0xbc54c3a8,0x1bbc6d0f),LL(0xf2cdd63a,0x1518f660),LL(0xaf2f62bf,0x27e5bf5f),LL(0xbfe7727a,0x7b164682),LL(0xa33defeb,0x40ec257d),LL(0x6132b5ef,0x902b2e89),L_(0x0000000e), LL(0x87524e3b,0xe3ab4683),LL(0x69a88271,0x8299824e),LL(0x4545479e,0x373761e0),LL(0x397121a7,0xe3b1f753),LL(0x0aaebe93,0xd463acb4),LL(0x1af707da,0x1d6dcb72),LL(0x14e15233,0x48e5280c),LL(0x91655530,0xaaad009d),L_(0x00000012),
+ LL(0x964e28ff,0x9792b39f),LL(0xcfd79768,0xc556dfa7),LL(0xf279c07e,0xd7670e8c),LL(0xdad1cf40,0x5e04abde),LL(0x90b1377b,0x46fcc199),LL(0xf5067ad9,0x6a088572),LL(0x28101c96,0x2ad58aca),LL(0x43b5e33c,0xe333e24c),L_(0x000000b0), LL(0x475ac89b,0x54f0361a),LL(0xf79463ef,0xc22ce2dc),LL(0xdd053538,0x4e6817ca),LL(0x2bc1013b,0x4b01a6e1),LL(0x844a6eb4,0xad109d85),LL(0xbfdaef54,0x4481b985),LL(0x6830be54,0x297f121f),LL(0x8bfd8dd0,0x6d0b67a6),L_(0x000001cb),
+ LL(0xe23b3385,0x45ba65ed),LL(0x45dcbcdc,0xdd83e268),LL(0x0a0b1cdd,0x63968b4f),LL(0x35e092ea,0x71e6e72d),LL(0x3f1ddc4b,0xa46c5ed0),LL(0x5a166bbf,0xb7c76efc),LL(0x0de0b5f6,0xc1387b79),LL(0xb6445136,0x8923450a),L_(0x000001a7), LL(0x4005e747,0x99a85019),LL(0x0cae44ea,0x1e4af9c0),LL(0xe5e17b63,0x51c0dae8),LL(0xee91c80d,0x0c3cbe08),LL(0xa4093612,0xa23c8041),LL(0x3446b0ed,0xf215ada7),LL(0x43d14026,0x7813fb66),LL(0xb26fbac3,0x0031b68b),L_(0x000001c7),
+ LL(0x1660b409,0xe275ab90),LL(0x45ee7e0e,0x399f21e6),LL(0x37b06a37,0xe9bd12b1),LL(0x96080496,0xa5d50d58),LL(0x05ba3f26,0x7c1e3f37),LL(0x1d4a0081,0x4d39274a),LL(0x2d00866a,0x0317c40d),LL(0x64f146bf,0x2ec71ea0),L_(0x0000004e), LL(0x5c7f5630,0x933c199f),LL(0x4f78f168,0x3fb1362e),LL(0xa194ad2a,0x5259655c),LL(0x5f408022,0x5898f9da),LL(0xd8a6c1bc,0x7553edff),LL(0x2793c479,0xe26de20b),LL(0x1ea73083,0x533d9374),LL(0xb2a2971a,0x4fd22035),L_(0x000000e5),
+ LL(0x9a275851,0xf8f9d4de),LL(0xdebb5987,0xe3156400),LL(0xd526ec09,0xe0023f66),LL(0x5578bd03,0xd7d715cc),LL(0x3099f2ae,0x858cc9c0),LL(0x4417ca0c,0x2ea5506b),LL(0x23b4df57,0x7420ffbd),LL(0xe0c5dc14,0x99652bdf),L_(0x00000128), LL(0xf8e9148e,0x0d31987c),LL(0x9461ad7d,0xe6bbab25),LL(0xc859a4a7,0x3d2a289c),LL(0x08730e2b,0xbe629139),LL(0xcf6e14e9,0xc3904cf1),LL(0xdab045a7,0xacb2cca9),LL(0x2a43de3e,0xfa439f68),LL(0xd4d82c3a,0xd187ae70),L_(0x000001ec),
+ LL(0x78085816,0x5587b449),LL(0xe293d334,0x6f8ad12b),LL(0x4ce4906c,0x8d521bfa),LL(0xb26a6693,0xa914bdb3),LL(0x9dc3e746,0x3ae5f6e9),LL(0xb0881c2e,0xac2559db),LL(0x9191a1b5,0x72e53430),LL(0xa6c6a97a,0x07226ad4),L_(0x000001dd), LL(0x234483b3,0x3a39e249),LL(0x419af206,0xc72bc669),LL(0x42122752,0x9a44c7a3),LL(0xc28aa7e1,0x188ac573),LL(0x14ec6b11,0x09a3360e),LL(0xc8624588,0x3af7bc0b),LL(0x41e19299,0x42bd4817),LL(0xa8d8d757,0x8768555b),L_(0x000000cd),
+ LL(0x5b9a4085,0xe3a45fe5),LL(0x95591624,0xaebe1b9d),LL(0xa30f27ef,0xcc5daccf),LL(0xf894bab2,0x753b9ddd),LL(0x456446cc,0xa2185cca),LL(0xfed1e127,0x12d28159),LL(0x0339e65d,0x698c68d1),LL(0x1a9ca283,0xe9c06f97),L_(0x00000087), LL(0xb7266ccb,0xfa3c3bf1),LL(0x0574a504,0x1f37ca7f),LL(0xdbe81703,0xebc6693f),LL(0x6a068b27,0x9068b291),LL(0x03b786c6,0x3dcacbac),LL(0x74d197dc,0x5766087c),LL(0x8dd304a2,0x60b034d5),LL(0x45cead24,0x0eb18561),L_(0x0000010a),
+ LL(0x6e27781a,0x247df0f3),LL(0x5379241e,0xe00bbfb5),LL(0xad8e1bf2,0x4971d453),LL(0xffdae98c,0x4dac08bb),LL(0x43c392ba,0x1094f61d),LL(0x34435f45,0x25c82ce3),LL(0xc0379951,0x86ddd573),LL(0xbe3f91c8,0xa4a47405),L_(0x0000017c), LL(0x16746966,0xd140309f),LL(0x7d5ffd2b,0xb5c6fd08),LL(0xf1092ec1,0x3fef2aa9),LL(0xb1d3ec33,0x5486d81c),LL(0x414b5e87,0x09d0d988),LL(0x7faa17ff,0xd5d8f9a4),LL(0xed9cefef,0xa9baa755),LL(0xcec21b69,0xb4d04c7c),L_(0x000000b0),
+ LL(0x446d0af9,0x705db89c),LL(0x84f6bfda,0xac8dec0a),LL(0x7e47ba03,0x11601ccd),LL(0xa270c8be,0x5c7ebbe6),LL(0x6d1474f3,0xf62ef9fc),LL(0xe04a6269,0xfb77f59b),LL(0x9e393c86,0x150112d3),LL(0x5df9c04c,0x64d1ef7d),L_(0x0000006b), LL(0x430bfacf,0x4c8472a1),LL(0xfafe59da,0x41ca0a2b),LL(0x2ad99761,0x1e89c29e),LL(0x4b041df1,0xfe4fe5b6),LL(0x8b8ac33a,0xd36ab4d9),LL(0xf8473963,0x53e1a21e),LL(0x75363c3b,0x21c36ab1),LL(0xe0592363,0xe35ac3a5),L_(0x00000121),
+ LL(0x432d1107,0xee1e4fba),LL(0x2e463b38,0xafc972de),LL(0x1010af35,0xbe876d0d),LL(0x49188274,0x060ac231),LL(0xac345fe8,0xb568289e),LL(0xe6dec43c,0x9e9a1cec),LL(0xc8cf61bd,0xa7d9e863),LL(0x4480624e,0x84470564),L_(0x0000010f), LL(0x0aeb84ba,0x7730874b),LL(0xb07f3f33,0x5d9261b6),LL(0x122fcc85,0xe27f8557),LL(0x06820d8c,0x073c1847),LL(0x82e3f6be,0x3976550d),LL(0x0e6c3609,0x9a68ea2f),LL(0xf48dbeee,0x99ffba71),LL(0xcc24a469,0x3d0bdb6c),L_(0x00000168),
+ LL(0x910a6eae,0x01e0bacb),LL(0xfaf69acc,0xde8618ba),LL(0xc2f50b6a,0x14a7dc8c),LL(0x255c91c8,0x2f3c4d3d),LL(0x3e41e3ed,0xb39008da),LL(0x3885fe89,0xe57622e4),LL(0x0199693a,0x4d2436d5),LL(0x8a6ba080,0xdafeb6e6),L_(0x00000023), LL(0x5f1b83a0,0x2580e973),LL(0x8519d427,0xa920070b),LL(0x0b67d6f2,0x90fc96fb),LL(0x14566ecc,0x25c7716a),LL(0x30c1cfb5,0xb8dd507a),LL(0xd8b7f726,0xa175dc05),LL(0x24a60ede,0x99f15332),LL(0x78236bba,0x7ca4a569),L_(0x0000015f),
+ LL(0x4901b9ef,0x1e3479cf),LL(0xdd8491ad,0xd79c5592),LL(0xcd2995f5,0x8ece5732),LL(0x7f9162e1,0x7f928933),LL(0xff64a3a5,0xdd90d4ea),LL(0x82a7e6d8,0xd296e0f0),LL(0x8dc81d30,0xf317ef62),LL(0xa5bbd68c,0xc3c72a97),L_(0x000000bd), LL(0x43a9d0a2,0x8de59597),LL(0xbad8e310,0xe46b5cc5),LL(0xae543536,0x3be10fe7),LL(0xb038a518,0x22e5dfa8),LL(0x98fc1a73,0xda531be8),LL(0x4395fad8,0xa64d7d12),LL(0x81e9b112,0x5b7b8eee),LL(0x6b371c5e,0xf97cc8db),L_(0x00000072),
+ LL(0xac5fef79,0xeddf9eed),LL(0xac48ddad,0x3fafda2a),LL(0xb0386572,0xe2cfe37f),LL(0x4a95ae1d,0x2a2d6f2e),LL(0xf0b70c4d,0x5539faa3),LL(0x1e2738ed,0x855ae2b7),LL(0x680d7df5,0x5fa4d703),LL(0x047f7d72,0x981799eb),L_(0x000001a0), LL(0xc9f2a2dc,0xefb32d4e),LL(0x14e1364c,0x0008de76),LL(0x2af04490,0x56298a56),LL(0xa488b32b,0xe10ef61b),LL(0x7c93d9c0,0x74302f60),LL(0xe50aeca3,0x40b43584),LL(0x7cf8baf8,0xb9ab8a52),LL(0x29e97768,0xf0c44bc5),L_(0x000000b0),
+ LL(0x266fcb30,0xc7ebaeb9),LL(0x9166afc8,0x8df096c4),LL(0xb1a4fb9f,0x9ef63e0b),LL(0x0a63a275,0xd0e62d1d),LL(0xa13c16de,0xf215cb79),LL(0x82d5b46e,0x45439424),LL(0x5cf39033,0xc9b239aa),LL(0x4a39ce21,0xfcf03ed3),L_(0x000000a2), LL(0xdf517f0c,0xd8466a8a),LL(0x523be0b6,0x493a7775),LL(0x74759167,0x4894bb12),LL(0x5e2284c6,0x864e9ca2),LL(0xd07d26e2,0x08b7f98f),LL(0x6d662061,0x8e1e3fdb),LL(0xf64b5a66,0xa0ba6cae),LL(0xedd31c44,0xdac14a11),L_(0x00000091),
+},
+/* digit=93 base_pwr=2^465 */
+{
+ LL(0x5b2f805e,0xd37e005c),LL(0x6d99c24d,0x9fa0210b),LL(0x813da140,0xd53cbcd5),LL(0x9488bf13,0xb6d8655f),LL(0x5b2d055b,0xb21f224e),LL(0x3ba305b4,0x059a77dd),LL(0x5337f568,0x783aa9f0),LL(0xb88b4b1e,0xe8c56442),L_(0x0000016c), LL(0x71f23b13,0x9b7e0acb),LL(0xe0e90fde,0xda1867f2),LL(0x336f8ff1,0x14e3d072),LL(0x8e647516,0x87e51c7e),LL(0x1ca72a31,0x27ef1710),LL(0x61c42d89,0x641d8a97),LL(0xbb69cc0c,0x6138250e),LL(0xc12903e9,0xd2873a54),L_(0x000000b8),
+ LL(0x06415e13,0x0523f47f),LL(0x1fe7219c,0x11a49ec5),LL(0xbd8a88f4,0x6713e8b2),LL(0xd3f30897,0xe0f84892),LL(0x410c616e,0x4957e9fa),LL(0x60b01558,0xfce0903d),LL(0x41fc07f1,0x82117eff),LL(0x3ffa3ce1,0xb039b569),L_(0x00000054), LL(0x9c0d6884,0x04f700d5),LL(0x693fd9aa,0xa0743bcc),LL(0xb8b0e7fe,0x81c35812),LL(0xfcb182c1,0x64896cc8),LL(0x9f019f88,0x8c77cf49),LL(0xa6594c50,0x2c4110bb),LL(0x88406e14,0x0fcaee7e),LL(0xb8b45fd5,0x4dc1ba3e),L_(0x00000189),
+ LL(0x7eef0c8d,0x07c446c4),LL(0x0878421c,0xf275544a),LL(0x8722c55c,0x424a48fb),LL(0x028ec763,0xf6b5b3b9),LL(0xca8f7bf4,0xf78d4fe3),LL(0x77d82e20,0x04e23f42),LL(0xbc6300a7,0xf5f71bbf),LL(0x3aa908b8,0x0bc8e8a5),L_(0x00000109), LL(0x49fc8da7,0xd0dcad65),LL(0x35d31de3,0xe5fbc4e6),LL(0x9ac9c9da,0x525deba7),LL(0x0b85d812,0x465a1ffb),LL(0x08542228,0xc039c002),LL(0x1962a343,0x60c9d143),LL(0x729577d4,0x0fe4b631),LL(0x05befcdb,0x25528067),L_(0x00000198),
+ LL(0xe896c288,0xbc7bb607),LL(0x894887a4,0x14230e0a),LL(0x6eb1e976,0xe2c653f8),LL(0xe9303e71,0xdded494b),LL(0x9fc0dd96,0x98ac95d0),LL(0x63fba061,0x738abea5),LL(0xf3c1624d,0x4a0ea988),LL(0x389df64d,0xc6ae1823),L_(0x000001d5), LL(0x0454516f,0x7feeeb90),LL(0x7d7a8b0a,0xde36c637),LL(0xa9c345a7,0x611067e9),LL(0x0a9100d5,0x6bcdcedd),LL(0xf6c68c80,0x92b5dec6),LL(0x8d7d4a34,0xad3651f3),LL(0x2d5061b9,0xf739c0f2),LL(0xd15c9ea7,0x34e6cedb),L_(0x000000e7),
+ LL(0xcc5b33ab,0x5ef9ab41),LL(0xda8a106f,0x3b8cfab2),LL(0xb72948ff,0x3a4d0cd5),LL(0xf95a1457,0x5f6b94ff),LL(0xa636c12b,0x4c711bcc),LL(0x1e6c9e9f,0xffdba7aa),LL(0xe7eacce4,0xfce23073),LL(0x8fbc9275,0x5935eb69),L_(0x00000059), LL(0x00d4e588,0x05d931ae),LL(0x918b9aff,0x1f8a1b79),LL(0x844b544c,0xaa1709c8),LL(0x7e08066d,0x5258c624),LL(0xb640f1c6,0x176bbba4),LL(0xa22bddd0,0xc24ede16),LL(0xd090e0e9,0x4685aca4),LL(0xd8b8736b,0x64e8e6dc),L_(0x000000f2),
+ LL(0xd9d5f173,0x35476aba),LL(0x78928ff0,0xd948696e),LL(0x989109f6,0x5f254f30),LL(0x44ed9a63,0xd3543664),LL(0xa497e106,0xec63e4f7),LL(0x54a3d56c,0x4cb1418d),LL(0xbfbcd507,0x2a5c778f),LL(0x548f00b1,0x3ba6c12a),L_(0x00000150), LL(0xeeb4939d,0x4db14381),LL(0xc2817a38,0x86547af0),LL(0xb6947c7e,0x6d9e6104),LL(0x70ddd5de,0x2c369c27),LL(0x2f6e17ee,0x04550b40),LL(0x2c52689a,0xb0ead30b),LL(0x3892ae0d,0x99d74e20),LL(0x145321b6,0xd38ac454),L_(0x00000068),
+ LL(0x3ffb08c5,0x9a014b31),LL(0x2b898264,0x9e8130d3),LL(0x12fa12a6,0x014372da),LL(0x94999852,0x86eb5c63),LL(0x2a214084,0xdfb3f74b),LL(0x889d0eaf,0x9c182b54),LL(0x4f4c24a5,0x023efe1f),LL(0x0c3bbe75,0x3089629d),L_(0x0000012f), LL(0x76a8709a,0xdbfd5856),LL(0x138e9e46,0x49f8b60f),LL(0x8855a365,0x00624aa1),LL(0x358ac67f,0xff0d2d03),LL(0xd4f8c970,0xb9b15a4c),LL(0x244d4dda,0x60864d2f),LL(0x7db18004,0x1d1483da),LL(0xd00cd704,0xfbce4196),L_(0x000000b0),
+ LL(0x3cb5aab3,0x0feb0501),LL(0xca55bd42,0x8695f9af),LL(0x9c3c71fd,0xcc6e5ed1),LL(0x3d500caf,0x8edc89ca),LL(0x4e21b872,0x77647185),LL(0x0ff872ac,0xee45201f),LL(0xe23036d8,0xc8bee8b3),LL(0x5f2c13f7,0xa1d51a1e),L_(0x00000107), LL(0xbf685327,0x8022b011),LL(0x529ed8e2,0x2b6ff0cf),LL(0xb8a477a5,0x3b6e8238),LL(0xcf5cd2f6,0x291c55c9),LL(0x42ab247c,0x3f4796ab),LL(0x9f93937b,0x5dbfc098),LL(0xca7b47aa,0x7620e79b),LL(0x296f0a6b,0xdd4ea007),L_(0x00000158),
+ LL(0x26121c08,0xf01a2f06),LL(0x96bedf48,0x7e8f7f41),LL(0xd452fc32,0xcfab9384),LL(0xf1693df4,0x57e90144),LL(0xde828634,0xf5773fb8),LL(0xf8ca5704,0x123913d5),LL(0x2119d8cb,0x7eb6dfc1),LL(0xfdf9f63e,0x3c675fe5),L_(0x0000000b), LL(0x63fe6950,0x1f4969fc),LL(0x18608a42,0x92fc7ae8),LL(0x270c4cd5,0xf9035119),LL(0xd6e64853,0xc4832b26),LL(0x6b21d3fa,0xa4c2c4c7),LL(0x726b2dcb,0x725c739d),LL(0xb649408c,0xcaaec71e),LL(0xa0b38b9c,0x5b557fb0),L_(0x0000017b),
+ LL(0x2d41c6fd,0xffa160b7),LL(0x6ed5bb92,0xd76d4830),LL(0x174db5f3,0x56439bbf),LL(0x9cf210a6,0xcf76e11e),LL(0x0a183944,0xb1458e01),LL(0xa3ae6e4a,0x034db573),LL(0xc26a236a,0xe322c7d5),LL(0x3184159a,0xef56cb0f),L_(0x000000f3), LL(0x0a135217,0x83bf41c6),LL(0xc9df776e,0x9cd9b688),LL(0x5709e999,0xec730800),LL(0x9d5ce348,0x9c9f3378),LL(0xa53d30c8,0xdcaf4c9c),LL(0x09b66b9c,0xb8aeaba1),LL(0xc4d0530f,0xea0f22f3),LL(0x73581f25,0xc1d28f6a),L_(0x0000015a),
+ LL(0xcf778121,0x47e984e8),LL(0x20c4ae50,0xd1b90de4),LL(0xc94af252,0xdf5adf83),LL(0x41b573a2,0xb6b25c5d),LL(0x003e17b9,0x47e2aa64),LL(0x600d2bda,0xf75489f9),LL(0x595799ce,0x1b49400e),LL(0x7a9784ae,0xba0298f7),L_(0x0000009f), LL(0x3c7f600f,0xc18830c9),LL(0xc0e76415,0xb7a4b3e7),LL(0x46646194,0x210e39ff),LL(0x46e16ac1,0x94dd48b0),LL(0xe09df941,0x5657d728),LL(0x75b23925,0x987d7dae),LL(0xf5484304,0xb8bad70f),LL(0xee4753cb,0xc44a0313),L_(0x0000005e),
+ LL(0x8d604911,0x301bb718),LL(0x3ba3b59e,0x7ed618c3),LL(0x2225703f,0xe6e7b1ec),LL(0x3d9b8d85,0x2ddd2443),LL(0x526b020e,0xbbb89c6b),LL(0xf99d3527,0x9694dbcf),LL(0x1bef732e,0x34415736),LL(0x42d5d4d5,0x5cdafabf),L_(0x00000140), LL(0xd173ef6b,0x3da6214f),LL(0x2ffdc730,0x3a1a49d4),LL(0xc640e584,0x9755bbcb),LL(0xd90466dd,0x6a1bb6be),LL(0xcc97293e,0xd094e422),LL(0x23c9d622,0xf2ec9cc4),LL(0xcc616321,0xafe8382a),LL(0xc1a93af5,0x26522de8),L_(0x0000004e),
+ LL(0xdcb7addb,0x73e6acc5),LL(0x9117f654,0xea525fd4),LL(0xd6399efb,0x5316271b),LL(0xbf78249c,0xe30685a3),LL(0x7737d7b2,0xb95bf177),LL(0x4cfca353,0x138bd305),LL(0xa3671bc7,0x088b1877),LL(0x110ae487,0x1ff3771d),L_(0x000000fd), LL(0x0a4086e7,0xaf501744),LL(0x732576c6,0x4a538a56),LL(0xdfe16416,0xf3e1aa2e),LL(0xfe886ca1,0x95495af6),LL(0xfad421b0,0x2e5633e8),LL(0x14deea0f,0x87a33bf0),LL(0x59e08514,0x7333d917),LL(0x92bad09b,0x773222e4),L_(0x000001d4),
+ LL(0xd9f416e2,0x3565ca51),LL(0x0fd12235,0x5d3c8d16),LL(0xdc033287,0x948d4bd6),LL(0xd175dce3,0x9d5a6616),LL(0xd08718eb,0x4afce525),LL(0xd0bbb22a,0x9107b243),LL(0x93527f91,0x45382cdd),LL(0x6c46b7fb,0x8d893d42),L_(0x0000018d), LL(0xf7906107,0xbddfc4e9),LL(0x1d8f3a25,0x1c16029a),LL(0x51ce74f6,0x0f857730),LL(0x72d22f72,0x9d6f7b83),LL(0xa805ac0c,0xf970cb65),LL(0x6193a324,0xef9afdbc),LL(0x579b13d8,0x29a49024),LL(0x2ea3de42,0x4d4f92d1),L_(0x00000167),
+ LL(0x68b78453,0x3687601b),LL(0x61173b64,0x19ad59c7),LL(0x5cdaa0ac,0x37e94d1c),LL(0xb01a110c,0x46a8a192),LL(0xb73fb28d,0x89ea578e),LL(0x32a829b7,0xc1c111ef),LL(0x73a214d8,0x1c8ded15),LL(0x1cfef495,0xbf036574),L_(0x000001dd), LL(0x79e6c9f4,0xde40c899),LL(0x451757da,0x9bdf62c8),LL(0xde505c58,0xf590c16c),LL(0x0833d1ea,0x4f878ef4),LL(0xc9e82fbb,0x8ef0ccb2),LL(0x87ab08dc,0x1d1f4efd),LL(0x115ad9da,0x4e21d1ff),LL(0xd549cc87,0x88e6e9e7),L_(0x000001dd),
+ LL(0xc9cea1d4,0x424f87aa),LL(0xffc3ba23,0x162b1fab),LL(0xa3b2b167,0xb86c7978),LL(0x83e73da5,0x9b5f991d),LL(0x8d484c76,0x2cb3d908),LL(0xe085b439,0x28064542),LL(0xeba2ea8f,0x2b91d2b4),LL(0xcdc46cb8,0xe83321f8),L_(0x000000c0), LL(0x9d31426b,0xfd97601a),LL(0x4a0c50df,0x305e99ef),LL(0xfc4b8056,0xa29f6e86),LL(0xf5b0c1c8,0xbe1babed),LL(0x558d2cd4,0x75e98d4d),LL(0xd17d7bc8,0x45e57fd7),LL(0x9a0a33b7,0xc3cf9b60),LL(0x2d8c2a2b,0x5277b76d),L_(0x00000023),
+},
+/* digit=94 base_pwr=2^470 */
+{
+ LL(0x62b479f7,0x3e614e7a),LL(0x1806f150,0x0773591b),LL(0xc937295d,0xb432690c),LL(0x6d3468f3,0x7af2bc37),LL(0xc765b502,0xf1568b1f),LL(0x4508081c,0x4f2d04c8),LL(0x3b08d2fa,0x0d438419),LL(0xfdaa2353,0xd4118eb0),L_(0x000000dd), LL(0xa74bf7e0,0x7395d916),LL(0x879c30fb,0x732a652f),LL(0x33e906c3,0xd707078b),LL(0xeb09ecd6,0x4fe7914f),LL(0x76e24476,0xf1644295),LL(0x1ef70830,0x90ff7060),LL(0x8d1a94c2,0x8e38b393),LL(0x347e067e,0x7b7a7e79),L_(0x0000004d),
+ LL(0xb1fc1341,0x7e61fdc0),LL(0xe59da03f,0x98bd359f),LL(0x51831e76,0xf982fb68),LL(0x4079f81d,0x64253ce4),LL(0xffbd0a1c,0x684a0c0f),LL(0x24ab0837,0x0fa3fd27),LL(0xaefd7b90,0x8cd54b9a),LL(0x4f017be0,0x39893203),L_(0x00000159), LL(0x71b358dd,0x5f8bfed5),LL(0xbd73f12c,0xbd9b46e5),LL(0x7574722c,0x672fc532),LL(0x95b789de,0x9d4c5de7),LL(0x313e84cf,0x48e00647),LL(0x002f1934,0xdda401e2),LL(0x649a15d6,0x96114ef7),LL(0x37a4f04c,0x4a9dc085),L_(0x000000c3),
+ LL(0xf21720e5,0x8f0a82c0),LL(0x87ae4c3b,0x74f004b6),LL(0x384b1146,0xce02e119),LL(0xd665e4e4,0x1859c7a2),LL(0xe5dbd5ec,0xadfa269c),LL(0xa30b0013,0x74ac1d2b),LL(0xb4b5ebac,0xbc73c88d),LL(0xacdb48e2,0x872a2a2e),L_(0x00000061), LL(0x8570d85d,0x1044c064),LL(0x1021647f,0x3c4c4561),LL(0x05bc197e,0x8aef2b50),LL(0xdd7066b6,0x53c751b1),LL(0x10e7a8e7,0x3b7ee577),LL(0x2667f737,0xee8825eb),LL(0xd2baf066,0x2e6cd49a),LL(0xfaed0dee,0x4bbbae5e),L_(0x000000c0),
+ LL(0xea72f88d,0x755e5ed4),LL(0x7eafbd5d,0x22817dc2),LL(0x8274c8f2,0x6ed11c56),LL(0xa0be4b95,0xc506cd96),LL(0xfca3c62a,0x6c56121c),LL(0x160f6437,0x94e1e3c5),LL(0xcd969d97,0x2a1b9ac1),LL(0x6a2818ba,0x5d12cb94),L_(0x000001bd), LL(0x838f81f8,0x67065269),LL(0x6eaf2423,0x2f4afa25),LL(0x74390891,0x2342e954),LL(0xec048d33,0x5565f855),LL(0x3a8816f7,0x8e4ec59a),LL(0x55b015d4,0x6a715052),LL(0xbf898ef0,0x385313b6),LL(0x8baf90ae,0x415dc868),L_(0x000001d5),
+ LL(0xb57c6620,0x117822b3),LL(0x37c2f26e,0x4762f6de),LL(0x9377e35f,0xfb62c99f),LL(0x3c9faf6d,0xa5fec0c5),LL(0xe6f2602d,0x6a84d794),LL(0x1e2e5844,0x2e9c376a),LL(0x2b97dfd3,0xcdd28547),LL(0x24977fdb,0x3efe1f48),L_(0x00000189), LL(0x28c17d00,0xd2462621),LL(0x19582902,0x6e455352),LL(0x638d59c6,0xc3bea880),LL(0xd74f8133,0x1df686ac),LL(0xae8224be,0xdefcc095),LL(0x467de606,0xc63376c6),LL(0x1bbcfb09,0x644acbfc),LL(0xe6c4cc04,0xce83b441),L_(0x00000126),
+ LL(0x02da505b,0x27486dd1),LL(0x6bd544fa,0xc8ec4c55),LL(0xc9e28c7b,0xa7531516),LL(0x22d696c9,0xfbb565f5),LL(0x5bc69de8,0xf4a6f6f5),LL(0x3c4607fb,0x2183944a),LL(0xfbf34142,0xc088d4ca),LL(0x6a6a25a0,0xebf86497),L_(0x000000be), LL(0x17ac892f,0x08805ee9),LL(0xe10f4906,0xb9740059),LL(0x2a74e9d7,0x72ae3ee2),LL(0x2294188b,0x0359108b),LL(0xffa569a8,0x5438b3ae),LL(0xf5a918ef,0x5b1543c1),LL(0xbe32cd1e,0x857bce3b),LL(0xf67721ef,0xcb0f4756),L_(0x00000137),
+ LL(0x5bd5d895,0x7f863db9),LL(0xb81bcc90,0xc94e7e86),LL(0x24d3e88a,0x59ad89c4),LL(0xf5ed10e7,0xce7d1f0e),LL(0x1bd7de70,0x6932d3ed),LL(0xf1561272,0x12569b60),LL(0x393d97a6,0xf0741124),LL(0xa46a9516,0xc9b5b179),L_(0x00000130), LL(0xe867277a,0xda1e1906),LL(0x6ff9aa73,0x64a918f8),LL(0x1673d460,0xf233bf04),LL(0xe548f086,0x4ac69dac),LL(0xb984ce8a,0x12e45aea),LL(0x294fb6e3,0x5a19d674),LL(0xd8993346,0x00bc5dd3),LL(0x0c254d86,0x90107b13),L_(0x00000014),
+ LL(0xdf6f2ba1,0xec115486),LL(0xb08c738e,0x93e59803),LL(0x23024435,0x4f00e934),LL(0xbdbe60eb,0x7c91438e),LL(0x23e859e5,0x580e89c5),LL(0xba0053e0,0xb329d75c),LL(0xd11317c9,0x3d389550),LL(0xd235e570,0x5aac6426),L_(0x00000184), LL(0xfa06b949,0x42349105),LL(0x21c69e6c,0x9a81de9b),LL(0xf70eb151,0x2990539b),LL(0xafc827ae,0xfe9bf0bb),LL(0xee9dd548,0xb8dbb3c1),LL(0x8c4d4274,0xf3be2a90),LL(0xb7224476,0x6e6842bc),LL(0x8428346b,0x39da0c73),L_(0x000001ad),
+ LL(0xaf5db393,0xdaa88388),LL(0xe569ed69,0x7f0f1377),LL(0x60762027,0x2fe1fac0),LL(0xa5dd03fe,0x91b1f27a),LL(0xb60b2ae5,0xc4161046),LL(0x0c72417b,0xf9d8850d),LL(0x16e6bfc4,0xa63fb7e8),LL(0x1c03a1ed,0x8baa08f0),L_(0x0000017d), LL(0xaf898d56,0xba237ffd),LL(0x7b0680d7,0x0d439e05),LL(0x64dd0307,0x5d17a507),LL(0xded7a46c,0xaa6f686f),LL(0x46bc0763,0x302e95a9),LL(0x16dd6fb8,0x32a15017),LL(0xd01bdd13,0x4b4868e4),LL(0xe250803d,0x1558017b),L_(0x00000168),
+ LL(0xc67a04f1,0x275e8267),LL(0xb1b59985,0x6c0a68a7),LL(0x44944a18,0x537ca1e2),LL(0xd9ed65ad,0x30e1107c),LL(0x1eddede3,0x802fb267),LL(0xeaf5fb68,0x27195ee0),LL(0xd0137c18,0x11b69677),LL(0x331a8cb2,0xab2ade03),L_(0x00000147), LL(0x872e7d11,0x0449d382),LL(0x0033feb4,0x9c7c44c6),LL(0xb2576dae,0x83e4fe6e),LL(0xde49f678,0x8e0a0c88),LL(0x049a1944,0x873f101a),LL(0x2f0dcfaf,0x0c6ecf9c),LL(0xf4b7cbf4,0xb8b0d918),LL(0x5cf46641,0xd2760eea),L_(0x00000082),
+ LL(0xdb4a36c2,0x8ae1b4af),LL(0x5fa3cb57,0xd120dbcb),LL(0x79a8d192,0xec8bbea1),LL(0x8ab00e0a,0x0fa43f9b),LL(0x8da0324e,0x320ae51d),LL(0x53f9b52f,0xd7d8355e),LL(0x28f25abd,0x800a5d6c),LL(0xce8c317a,0x8116a102),L_(0x00000024), LL(0x539d001d,0x5e187817),LL(0xdc1f3bba,0x3d0941a2),LL(0x42b1a905,0xa2a2cc7f),LL(0x7392c3e9,0xc8a2218b),LL(0xf81e4937,0x50e22321),LL(0xec9f9e7e,0x650f7010),LL(0x905ed136,0xce7ae424),LL(0x143d78dd,0xf4b39b10),L_(0x000000de),
+ LL(0xfa007b15,0xeaa9a342),LL(0x15bb7a90,0x26771654),LL(0xdcc6aa0c,0xc720264a),LL(0x986a1f0b,0xe93f7bc1),LL(0xa182f9b5,0x1bf6b3fc),LL(0x5c22f84c,0x14eb9a7b),LL(0x7bdec7ad,0x42c3b078),LL(0x108902c9,0xd7973e78),L_(0x00000069), LL(0x4676602b,0x20230ff4),LL(0x64b88212,0x8928dd30),LL(0xd730a522,0xc0f54e1a),LL(0x528ea087,0xbe8035de),LL(0x2188b80a,0x1d9e98d6),LL(0x12fe3f39,0xc4b4d85f),LL(0x5d1c13b3,0x0436d0a9),LL(0x02c9a494,0xcc5f2436),L_(0x000001d2),
+ LL(0xbce8d401,0xfa9544c4),LL(0x3a3c6860,0xc43438df),LL(0x7ba2b50e,0x8cfb61b2),LL(0x160b337f,0x177729b0),LL(0xccab10b1,0x69458502),LL(0xb9a0ff5a,0x78449ba9),LL(0x67ca5074,0xa879a311),LL(0x73b77e61,0x91f5cf0f),L_(0x00000119), LL(0xa663023b,0xe9dd38a6),LL(0x7f1ab441,0xdb97e39f),LL(0x8836c427,0x0e31501d),LL(0x26be55f8,0x88c80de0),LL(0xf094f5db,0x161288e2),LL(0x239cdfc2,0xb27ca6c4),LL(0x6d31f6e4,0xbff28243),LL(0x6db05886,0xadc659a4),L_(0x000000f4),
+ LL(0x46bc5619,0xbc76d262),LL(0x3a81dc1b,0x1f94ed62),LL(0xb5ab7c11,0xcb89fed9),LL(0x7bd8c4df,0xf48a8846),LL(0xc61ecacd,0xe68265b3),LL(0x88e6ef63,0xfbdfdb92),LL(0x8bd95324,0x94692afd),LL(0xb7f81080,0x8b73dbb0),L_(0x000001a3), LL(0x42f27046,0xed59ec62),LL(0xe2c2f288,0x6fafd323),LL(0x11cda8bd,0x6af36bba),LL(0x324f4f07,0x06098acb),LL(0x091a65fb,0x74b50485),LL(0xf28dae6c,0x93e109e7),LL(0x1a6b91b6,0x648a962a),LL(0xba4a27c8,0x4dfe3efb),L_(0x000000ac),
+ LL(0x3b488e90,0xf43286a4),LL(0x56196c6d,0x6ba6cc59),LL(0xec8e64cd,0x7bd6708a),LL(0x98aaa1d7,0xb45c7cd9),LL(0xb5bcc0ce,0xce3eb2eb),LL(0x2653d9af,0x5b7387d0),LL(0xf3afdf31,0xe27833cf),LL(0x17806f1f,0x3ec743c7),L_(0x00000144), LL(0x5e969a67,0x96863b2d),LL(0xf200831e,0x1d6c065f),LL(0x1613e78e,0xa1366e05),LL(0xee600a0a,0xc0223e24),LL(0x06065867,0xe94c7976),LL(0x81ff94bd,0xf203aa4b),LL(0xf9511ac2,0xb7c19e3c),LL(0xd9eef849,0x75211256),L_(0x00000153),
+ LL(0x708d61a9,0x5cc484e2),LL(0x446b62d8,0x1d84ce14),LL(0x9c0fff45,0x08f1ae70),LL(0xe53a49ca,0x71899e1a),LL(0x9917f93d,0x3709a90d),LL(0x12fbb050,0x045ef39b),LL(0x38af72a2,0x0b8cc9a0),LL(0xf0817cd9,0x52b4ed83),L_(0x000000f3), LL(0xae023ef9,0xa7a71d48),LL(0x44e50d53,0x67e7ad87),LL(0x192ec226,0x37867d3b),LL(0xce32e194,0x24825f0c),LL(0xfce90271,0x5aa41f07),LL(0x4b826212,0xc9cefc67),LL(0x1f602e03,0xc071ae6d),LL(0xf9f93cc0,0xe4c52cae),L_(0x000001fa),
+},
+/* digit=95 base_pwr=2^475 */
+{
+ LL(0x58773b9a,0xebcc18c3),LL(0xf6385f12,0x8caf536b),LL(0x8a0c24ba,0xd83891ca),LL(0x08b3093c,0xb8c37621),LL(0xb26a0ef5,0xb41e3399),LL(0xca8c426d,0x0263fadf),LL(0x173bf676,0xd40bf584),LL(0xd8a6677a,0xa4760acd),L_(0x000000ec), LL(0x4207fa10,0xfbc42b8b),LL(0x5a60d34e,0x678686dc),LL(0xa367e08d,0x3e942c85),LL(0x2dd8cead,0x9d289bdc),LL(0xa6d1bb40,0xa4b034c3),LL(0x04955940,0x4e438893),LL(0x0034f368,0xddeee0c8),LL(0x63808a7c,0x8f3d9aa2),L_(0x00000114),
+ LL(0xd3e1babb,0x3ddf4a3f),LL(0x7d84daca,0x17e3e628),LL(0xd7eaf570,0x4870b354),LL(0x9fed1a4e,0x26a3e3ca),LL(0x5710e04c,0x0ce1ea5e),LL(0x17a2ff92,0xee67709e),LL(0xf8a3bc06,0xc019a660),LL(0xdb788ab8,0x3d909c0f),L_(0x000000f4), LL(0xebda5c3a,0x51c0c61e),LL(0xc130704b,0x5d086395),LL(0x762ffbcb,0xf6639983),LL(0x337f660b,0x46d9fb03),LL(0x8fa37c16,0x865cf06a),LL(0x3f14b6d2,0xe7365f2e),LL(0x8227d360,0xc5c3e588),LL(0xb6a48fcd,0x8c2eaf07),L_(0x0000019e),
+ LL(0x3e7b660c,0x226084ff),LL(0xaf5d90f5,0xe8626b6c),LL(0xa900e635,0x22c0e157),LL(0x22e31c96,0x1a4ad1af),LL(0x9e88afb5,0x3aadc5f1),LL(0xff5f6050,0xb11e90fa),LL(0xc0677ea3,0xf77875e2),LL(0xaed6a977,0x841145e6),L_(0x000001e8), LL(0x587f301e,0x6bb84d1a),LL(0xbfc80743,0xf386ce67),LL(0xb28c1dbb,0x43c48ae6),LL(0x88b71460,0xf88870e8),LL(0x4e3895ad,0x71c30d54),LL(0xcdbb1a28,0xa8e29d09),LL(0x71499052,0x6fbd1362),LL(0x3608395e,0x9cdda95f),L_(0x000000b2),
+ LL(0xf2dc50d1,0xb01ce2b5),LL(0x9f8c4d01,0xf417d7e3),LL(0x78d34284,0xcbf04214),LL(0xf59d157a,0xc4238071),LL(0xf8a594c0,0x7b0a1e05),LL(0xbaf85cdc,0xc9cfd81b),LL(0x1d1329e8,0xc9be4f2d),LL(0x3168fc55,0x5c20884e),L_(0x0000009b), LL(0x9cb47277,0x6e9fd410),LL(0x96d54227,0x16c1621d),LL(0xd61e57db,0x8656adf3),LL(0x2da52da5,0xd546ecce),LL(0x2098e089,0xb41508ee),LL(0x7499c874,0x9cf31199),LL(0xf525839d,0x96548966),LL(0xa0de08e5,0x1cdd85c0),L_(0x00000051),
+ LL(0x7be106c4,0xb8ede8af),LL(0xa3de8360,0xfdee27bf),LL(0x4341bdb3,0x376db3df),LL(0x851382eb,0x309206d9),LL(0x6325d433,0xff416946),LL(0x8994d6c3,0x0e775cfd),LL(0xfe50149c,0xee627cff),LL(0xee7b578d,0xcd01235e),L_(0x0000005b), LL(0xc03a13e9,0x5a46c19a),LL(0xeec8d37d,0xab92e082),LL(0xa6ae3bae,0x2deb57b4),LL(0xe3c4d075,0xce5d2ec0),LL(0x962e7d64,0xbd42e96f),LL(0xc56b57d5,0x513d5228),LL(0x68f2747e,0x7ec6010d),LL(0x1f92f153,0x8ad259fb),L_(0x000000ca),
+ LL(0x0c4d9937,0x1fdb1361),LL(0x018344e5,0x016f0192),LL(0xcb8a7e81,0x1ca2c27e),LL(0xc36425ff,0xa8df5318),LL(0x56d5d247,0x84872bcd),LL(0xa2e0d261,0x4866d142),LL(0x83feb22e,0x0999b14a),LL(0xab13dac7,0x07863be6),L_(0x000000d0), LL(0xd62b467d,0xce023bbb),LL(0xf8f48d21,0x35940e6e),LL(0xea9c5f9c,0x2bd76e0a),LL(0xa1f9af53,0x8ff97911),LL(0x750c500f,0xdefcff41),LL(0x3985ad13,0x9c027cfa),LL(0x36812ef9,0x34694b31),LL(0x5d319ee5,0x9722dca8),L_(0x0000019d),
+ LL(0xa6ef59c2,0xa78cdc7b),LL(0x67114f96,0x1a506e84),LL(0x909080ed,0xe3ccc90c),LL(0xe770488f,0xe93a6e81),LL(0x0b332add,0x6e681e90),LL(0x494adeb9,0x13abbb36),LL(0x580a5070,0xbf271178),LL(0xa19a151b,0xebb4d25d),L_(0x000000ae), LL(0x8202ce50,0x2353100e),LL(0x4b162883,0xf7cdd45e),LL(0x57659fda,0x4f79c844),LL(0x95b94da4,0x3ca165b0),LL(0xa6d4f4d9,0x3565f5c9),LL(0xc13d6186,0x288f561b),LL(0x81efd295,0x51b5a1dd),LL(0x0dee47df,0x0f774131),L_(0x0000005e),
+ LL(0xac4c9233,0x8240d25b),LL(0x6132b9fa,0x74ec9502),LL(0xddc2ef3e,0xa9db4e16),LL(0x29d151b0,0x5ad95c14),LL(0x9bb57bff,0x08144cde),LL(0xf2a19e48,0xef980c02),LL(0x655b0b6a,0x1f2df6c5),LL(0x2138725b,0x346457ed),L_(0x00000072), LL(0xe12bd180,0x8e3077ff),LL(0x2804b9bb,0x8db75e68),LL(0xb8a3a732,0x0cb1bbec),LL(0xb587b6f5,0x823e8549),LL(0xe705757a,0xdd7be7a7),LL(0xb60b8617,0x23677103),LL(0x131d7bc3,0x128ac224),LL(0x03713f91,0xadb3b9bf),L_(0x000000de),
+ LL(0x1a0be84b,0x625c8b6a),LL(0x8fc09173,0x14eb1426),LL(0xbb0b06c4,0xd925dd0a),LL(0x28f4f79f,0x5a160baf),LL(0x6a240ffc,0x4f7c033a),LL(0xcb7f6751,0x98adaaee),LL(0xc349dd94,0x192aa587),LL(0xee546461,0x189c51b1),L_(0x00000007), LL(0xeb23ea03,0x46d637ca),LL(0xaa3d1efa,0x01cfe315),LL(0xf7d6f7f9,0x4164c61b),LL(0x64b9530e,0x1a339a05),LL(0xce33c2f5,0xc30d67f4),LL(0xbcb863c9,0x79f8f963),LL(0x2bb9ff68,0x0799af64),LL(0xcfca4893,0xe7b1b3d8),L_(0x000000c3),
+ LL(0x58e4f6cf,0xa5b46eea),LL(0x00cef9c4,0x0381ae85),LL(0xe36179b5,0x317e7dbb),LL(0xac6498cb,0x2d824ab9),LL(0x328707df,0x6aa97d96),LL(0x80e79f5f,0xc19368fd),LL(0xe03799c5,0x109d20be),LL(0xa4688d4b,0x5dfd91a5),L_(0x000001ae), LL(0x49aaa1b4,0xfce4aa86),LL(0x8a4a894f,0x5f3c5caf),LL(0xf0a6af85,0x0a082826),LL(0x869fa6ef,0x4cf46392),LL(0x5a750056,0x1d906025),LL(0xb437590a,0x5afd7688),LL(0xfa2a2142,0x5b91f195),LL(0x46dd69d6,0x53028951),L_(0x00000004),
+ LL(0x0870d771,0x110cffe0),LL(0x4f03a88a,0xb44dbaac),LL(0x68ebc98c,0x849e6d09),LL(0x9e197499,0x126aa5d3),LL(0x374e4b92,0x9e50c62e),LL(0x9406118f,0xf4a6d99b),LL(0x4e25c845,0xc9df6238),LL(0xb15d2756,0xa10c0e52),L_(0x000001fe), LL(0x347cab66,0x816212f7),LL(0x43351049,0x52076e7a),LL(0x90d0771e,0xac804061),LL(0x50393b27,0x509ba99e),LL(0xb81254b5,0x6fa16ea2),LL(0xbe5e2613,0x1a907d04),LL(0xf4aab035,0x2ee00b2d),LL(0x00a0f275,0xab599862),L_(0x0000009e),
+ LL(0xecfc0941,0xfb9a872a),LL(0xde3af050,0xbec0fc8c),LL(0xebe6b500,0xe7c4ef2e),LL(0x28e4d4b7,0xb38a6c42),LL(0x82362d94,0xc4f9fb0e),LL(0x4e229d20,0xa3690dbf),LL(0xa6e45bdf,0x730c74e3),LL(0xa7b1c90f,0xf2fc481f),L_(0x00000106), LL(0xb887a36f,0xe5e496c4),LL(0xe46148f8,0x16f8ae6a),LL(0x4268188f,0x60936452),LL(0xdcecf1b3,0x828f2ec9),LL(0xeec097ea,0x8a581be5),LL(0x3e062b3a,0x85430a09),LL(0x4da12b49,0x562092de),LL(0xcbb50541,0x33c27b17),L_(0x000000ae),
+ LL(0xfb667016,0x4148520a),LL(0xb05dd749,0x6530988c),LL(0x4882c146,0x38e93ea7),LL(0xf98af47a,0x6360b046),LL(0x75158008,0x670a2092),LL(0xa8d210f6,0xcea39485),LL(0x590b4493,0xd54fb04e),LL(0xe30eec4b,0xea6ce05c),L_(0x000000fe), LL(0xc43f1354,0x095bed5a),LL(0xc9bc887c,0x40c45485),LL(0x2639073e,0x060df364),LL(0x9ad162fc,0x0ed461e0),LL(0xd17260de,0x48f9f001),LL(0xcef6cf88,0x5e44883d),LL(0xc42e028e,0x78ade819),LL(0x7ee983d2,0x24ef3daf),L_(0x00000059),
+ LL(0xad0684c9,0xfbbed4ff),LL(0x64e57bff,0x825f2bb2),LL(0x9eb6b035,0xfd8b6643),LL(0x3c213466,0x9c353790),LL(0x7313deab,0x9b0366be),LL(0x2121723c,0xac2996ae),LL(0x953e87c3,0xbd382785),LL(0xf9b6974b,0x3a30236c),L_(0x000001e4), LL(0xffdea7ff,0x5f3b2707),LL(0x68809f79,0xca4a12da),LL(0x374c5228,0x32cc5a86),LL(0x15cef9a1,0xae5f8c0d),LL(0x72616f2b,0xe61ce206),LL(0x75c41da6,0xde33abed),LL(0xa5fc5af7,0x50659126),LL(0x5776a4d1,0x4c16e788),L_(0x000000d4),
+ LL(0x59994686,0x017dab60),LL(0xe869faef,0x1a3d2819),LL(0xa91c965c,0x95cacbcd),LL(0x1c63a302,0x28898d33),LL(0x91791e04,0xe5b4e674),LL(0x2669fe66,0x4ee8bdb3),LL(0x55d62682,0x333ebff9),LL(0x2111714d,0x88832299),L_(0x000001e4), LL(0x1080f065,0x4df0c3cb),LL(0x7975bc08,0xa4a0f0d9),LL(0x6243d2cd,0xf978a250),LL(0x447d6ec4,0xca8ffce0),LL(0x3c8e28e1,0xa6bda9ff),LL(0x45d5e419,0x3acf30c2),LL(0x7bf52151,0x2b66a867),LL(0x21d9061e,0xbba7056e),L_(0x00000013),
+ LL(0x8e534a08,0x8f349801),LL(0x029f064c,0x07be931b),LL(0xb893aedc,0x14f71f6a),LL(0x242b0eea,0xe179067b),LL(0x8af895ee,0x99f6bf52),LL(0x5e852a27,0x1d5c2098),LL(0x94bc1969,0x296ab7db),LL(0x7605deba,0x31b9475f),L_(0x000000b2), LL(0xf8d3bc51,0xf8c45d63),LL(0x0d9145a0,0xb3a1daab),LL(0xbc0cd8bb,0x614875d3),LL(0x4f51299d,0xad650d62),LL(0x7baf748b,0xdb91d840),LL(0x83b9d385,0xf5cc54a3),LL(0x840ae765,0xbe2653a6),LL(0xab5a54bd,0x5728a0ed),L_(0x00000086),
+},
+/* digit=96 base_pwr=2^480 */
+{
+ LL(0x4732d33f,0x2be41906),LL(0x9f1fdd6e,0x9ab150fb),LL(0xb458dd16,0xf3f55fa5),LL(0xb1bb79de,0xd9b88ebf),LL(0xc1d98e1f,0x7b8b17a8),LL(0x7f6beb8b,0x6c86e6b3),LL(0xbc72340b,0x7bb70edd),LL(0xdc7c19d3,0x67a99418),L_(0x00000168), LL(0x22c0fb38,0x56a4a09f),LL(0x9cb6bc12,0x8ded9bb1),LL(0x77d8b51c,0x9f35ca45),LL(0xeb257480,0xf1168ba7),LL(0x770b52be,0x12cdae11),LL(0xed4f42bd,0xde9dff68),LL(0xd326b225,0x5631a8c3),LL(0x1d37f144,0xb14a3c37),L_(0x0000012c),
+ LL(0x0603f033,0x66b0b95f),LL(0xf969adad,0x57813fa7),LL(0x1acf7746,0x220707f6),LL(0x712a2615,0x71d4cd53),LL(0x2fd4ef2f,0x1f82a44a),LL(0xd9e26293,0x0681773f),LL(0xf763ad20,0xe31fd702),LL(0xa99b206f,0xc3a8767f),L_(0x00000165), LL(0x84569e51,0x41a7f8ce),LL(0x21c3dd47,0xcc9159a8),LL(0xe90e3290,0x06b623fa),LL(0x9e8cf993,0x531760ae),LL(0x2874afd7,0xc9e7cf28),LL(0xe6527ae8,0x293d6e1a),LL(0xf99eef73,0x03d3d878),LL(0x9237109e,0xe1efdba8),L_(0x0000016e),
+ LL(0xd074ce95,0xcc51928e),LL(0x2af7a58d,0xfb374b29),LL(0x5ec5d4bd,0xd01fb1db),LL(0x6d8cdd85,0x62636565),LL(0x641e476e,0x674fc478),LL(0xe28d244d,0xb39d16a5),LL(0xdbaa94dd,0x5fd5183a),LL(0x6b7fdde9,0xea66d862),L_(0x00000147), LL(0x62ab02a5,0x574c9d49),LL(0x88f7fd2b,0x31232213),LL(0x6c23d660,0xb2ca0c2c),LL(0xce3a1a6a,0x664a406b),LL(0x2ca19917,0x8f549744),LL(0x6f2fc149,0xab32866b),LL(0x41cbc3b0,0x7a277aea),LL(0x25557ca3,0x16026538),L_(0x000000f0),
+ LL(0x2a8dfc22,0x4fdb7562),LL(0x9be9e5c7,0x29bd5547),LL(0x548d39ec,0x29c79da4),LL(0xf3f7942d,0xc4bc1f5d),LL(0x948e1f79,0x34a7cecb),LL(0xb63229ed,0x76898793),LL(0x39c1a7d6,0xbe3b3419),LL(0x9157ad78,0x2801351b),L_(0x0000012f), LL(0xfece8891,0x59cbeae6),LL(0x85ddee3b,0x8140db30),LL(0xeeab1d34,0x41a033c2),LL(0xb676bba9,0x85703aaf),LL(0x23a9d8b6,0x35046b64),LL(0xb832a7c8,0x9e2475da),LL(0x5b8c259b,0xb51f8631),LL(0xdb18a6bb,0x53eb5dc8),L_(0x000001a2),
+ LL(0x85cafbb2,0x23cca37a),LL(0x57f26e36,0xc4d2ab36),LL(0x787ec793,0x520b9137),LL(0x436337f7,0xbcfb7906),LL(0x2caa7a0d,0x418cfaf2),LL(0x5a502d75,0x0ba14462),LL(0x066c6a13,0x1d083e40),LL(0xd21212f5,0xb9541e99),L_(0x000000eb), LL(0xe2ab22a5,0xa39384f4),LL(0x07cf7953,0xbdfbaff7),LL(0xaa5f9b05,0x1b083e95),LL(0x782626e8,0xfb350599),LL(0x06f421de,0xe92399d2),LL(0x415729d3,0x04ad8bd9),LL(0xcf103879,0x9370ad78),LL(0x766e0bc1,0xf2c002a0),L_(0x00000148),
+ LL(0xd8adb3ed,0xd6b8bb85),LL(0x9a142f9b,0x979dc67b),LL(0xfc51be0f,0xf84e32d8),LL(0xf9ccb118,0xf5b6ca36),LL(0x5e79aba7,0x3a900f56),LL(0xfcfd2df6,0x15163143),LL(0x22db9b75,0x5f85f9f1),LL(0xd886015e,0xe7c48af6),L_(0x000001f0), LL(0xd0dec7fa,0x5dcbc466),LL(0xc13f4daf,0x043aefcf),LL(0x613ac2b0,0x60909041),LL(0x9567d2ec,0xf4b79cb6),LL(0x57b5e5ef,0x8e04188e),LL(0x9dd05dcf,0x759c45aa),LL(0xcd8106c6,0xc6c633a7),LL(0x694b84b0,0xe7963345),L_(0x0000001e),
+ LL(0x68b4a3f3,0xfe8ed21f),LL(0xf39b982a,0xdf9459e0),LL(0xef033664,0x1245ad2f),LL(0x4c26109c,0x6578f9c3),LL(0x7b73834d,0x28e9fc09),LL(0x21a085c7,0x84bd7b31),LL(0x65666df5,0xd5585963),LL(0x9d7af58e,0xfd1e18ec),L_(0x000001e9), LL(0xaf6bc16e,0xe717df29),LL(0xf468848d,0x7c888dbb),LL(0xd747cd3b,0x51097e9d),LL(0xe70801a0,0x8bb9b824),LL(0x172bbff6,0xc27a8a5f),LL(0xf45d5351,0x402074f9),LL(0x0ba6fcc2,0xd7e5a578),LL(0xc1d4e050,0xcb9d2f1c),L_(0x000000eb),
+ LL(0x3b9d7737,0xf2b990fe),LL(0x1096bf3d,0x3b2d5eb8),LL(0xeb580e65,0xa2ad7396),LL(0xca4cfd31,0xcddd150b),LL(0x4cdae865,0x5cde916b),LL(0x6ffe74e3,0x1b6f19b5),LL(0x1e7dc0b2,0x333016e2),LL(0xc799d8bf,0x46cec318),L_(0x000000b1), LL(0xab36d519,0x9830acdb),LL(0xdd1e911c,0x1a0df89d),LL(0x891db580,0x646bbddd),LL(0xe25f1a5d,0xc4d27510),LL(0x10d55b0a,0x144af2f9),LL(0x5bcea08e,0x50da24a7),LL(0x7ae5f37d,0x9ad211e3),LL(0x73d37273,0xd9d5c417),L_(0x000000a2),
+ LL(0x2bd93615,0x785d4516),LL(0xd201173c,0x5cbe43f9),LL(0x6f813c93,0xfc65024c),LL(0x5174f5db,0xcbde45cf),LL(0x98aed5fb,0x29d4641e),LL(0xe15ff504,0xb6befd4a),LL(0x92a16838,0x3fb27455),LL(0x7017d508,0xa78ba07c),L_(0x000001cc), LL(0x3aef4cab,0xad9a35f0),LL(0x16e47d7b,0xbfe092d3),LL(0x75d728c5,0xd99290d8),LL(0x8ba65183,0xae8ed203),LL(0x9af2b287,0xe9db0d4e),LL(0x433a1079,0xe6c8ae7a),LL(0x21dd82ce,0x5486b431),LL(0xfbc30bb9,0x7775c8a8),L_(0x00000150),
+ LL(0x623589c4,0x92135986),LL(0xaae951c6,0x9a74fa72),LL(0x3dfd82d1,0x4bc31a1f),LL(0x060156b1,0x9ab6f26a),LL(0x8b245f24,0xa98e8084),LL(0x317596e1,0xc80c4dc3),LL(0x11d5e680,0xe262106e),LL(0xbee2a8d6,0x60234555),L_(0x000001ea), LL(0x90ed18c1,0x8b82b6cd),LL(0xa80d5059,0xb2182943),LL(0xa584e869,0xa8841e7d),LL(0x7e59ceee,0x74e1e538),LL(0x201d2b08,0x6d2519ec),LL(0x76d5cc62,0x41a115fc),LL(0xdedbfb6e,0xa6f152e5),LL(0x5c18feb7,0xd80d529e),L_(0x000000b3),
+ LL(0xecd211cd,0x3682bcf5),LL(0xe91e53c5,0x6ca16c30),LL(0x3355812c,0x6b8e8ce2),LL(0x18e076f5,0x77cbae05),LL(0x45a2864e,0xae50657d),LL(0x29b224b8,0x5b740476),LL(0x1853045f,0x9cd59d4a),LL(0x4fef40e2,0x6e774f0e),L_(0x00000092), LL(0x338e4f9d,0x0f66fd40),LL(0x87e39c23,0xd4b5406a),LL(0xb9d5824a,0x309845c7),LL(0x4567fe70,0x40e6539b),LL(0xc9f3a53e,0x4965ee0b),LL(0x0d799507,0x06d618a8),LL(0x28bea4e0,0x01fa0a00),LL(0x8b356252,0xb43cd562),L_(0x00000162),
+ LL(0xd82f0bd0,0x198a02d5),LL(0xcf78de3a,0xa89bcfff),LL(0x6931d65b,0x98eb3ac0),LL(0x204cbef2,0x796db40b),LL(0xdbd652c6,0x82883eda),LL(0x8c7c0479,0x6355b755),LL(0x3ccc26fb,0xb1589be6),LL(0xdcd445ae,0x8ce9a7eb),L_(0x00000063), LL(0x3ed1177d,0x34daeef1),LL(0x92e7ebd6,0x33e4d5b6),LL(0x252f990a,0x7af9fecc),LL(0xa16a7b3d,0x19533f3a),LL(0x07d26ab6,0xf0584373),LL(0xa41a7a2a,0xc7584589),LL(0x32ddecef,0xf36c6f17),LL(0xf2956cde,0xe47377e9),L_(0x000001ef),
+ LL(0xc14a919e,0x68fb10a1),LL(0xe2e1dbf7,0x1bce1a5b),LL(0x23f22cb2,0x865d95ed),LL(0x3d7b8ca9,0x9350d70c),LL(0x0559d55e,0xf39cff5a),LL(0x634be668,0x1f6fcd80),LL(0xbb740491,0x31d2120d),LL(0x7202a974,0x2efc5e17),L_(0x000001d7), LL(0x7fe1fd4a,0x6ff361af),LL(0xbd828851,0x26eff873),LL(0x96db8923,0x8d394d9b),LL(0x6a1cb060,0x3ebd8f2b),LL(0x2c56b043,0x71b88fe8),LL(0x91925e0f,0x39b0cfe1),LL(0xea28e59d,0xcb53dd25),LL(0x933a3cad,0x8fbf4361),L_(0x00000112),
+ LL(0x08433d22,0x13e495fa),LL(0x7698266f,0x51931514),LL(0xd385a184,0x7057cc40),LL(0x7fd1998f,0x8ffed935),LL(0x5d2e260a,0x55f9858d),LL(0x34fdc952,0x353e16aa),LL(0x3d6d1e16,0xd91adeda),LL(0x9e8895ec,0xa78987af),L_(0x00000106), LL(0x77ff974c,0x62e40103),LL(0x869a5ca3,0xc9ddcb20),LL(0x777bb6c1,0x0f3e3498),LL(0x4f97ec1c,0x18133992),LL(0xa7ddecae,0x1c9b2738),LL(0x280ea610,0xae01d593),LL(0xc9770c84,0x30145dcf),LL(0x7c4ed00d,0xa2a8b818),L_(0x00000107),
+ LL(0x9aa418d2,0xd4f005b4),LL(0x56eacf75,0xf05cca8e),LL(0x8a05a713,0x2382e841),LL(0x3f19077a,0x3c0079f4),LL(0xef823326,0x07e9f310),LL(0x71d13043,0x6311fb89),LL(0x0c6d6593,0x63ca3188),LL(0x0c592a1b,0xfce1253d),L_(0x00000042), LL(0x36fe1597,0x9089e935),LL(0x994e32d5,0xdc455b1d),LL(0x643872ac,0x914013f8),LL(0xac2eba70,0x35f0c433),LL(0x5a85e638,0x59b2430e),LL(0xa786ce7a,0x5225b772),LL(0x920543ca,0x51228731),LL(0x1e47ebe9,0xc56f0daf),L_(0x0000018f),
+ LL(0x3660052e,0x31ce7476),LL(0xe409da17,0x5b328da3),LL(0x098b5f71,0x607382a2),LL(0x51c3538d,0xc3ee7b06),LL(0xabf1dd7b,0x96d5eed9),LL(0xe8c0d16d,0x1a4ceb18),LL(0x3fe464dc,0x6b9f8f1e),LL(0x0c30d6fa,0x359d987d),L_(0x000000fa), LL(0x10803ed6,0x2947d098),LL(0xb97b5789,0x05d737b5),LL(0xcc27fc50,0x2087e2c1),LL(0x62d40feb,0xdd0d9606),LL(0xf37345b7,0x225ee555),LL(0x7f3858a7,0x9ae8d7c1),LL(0x0cf2ae73,0xdcf4e1aa),LL(0xee00ee77,0x649e41ec),L_(0x00000012),
+},
+/* digit=97 base_pwr=2^485 */
+{
+ LL(0xd619b611,0x808de672),LL(0x8326922a,0x156260ea),LL(0x1a0841b0,0x63e3e317),LL(0xacb0f8a9,0x806aeb44),LL(0x33483737,0xad9d8a14),LL(0x761a3419,0xbffd26bd),LL(0x2e7a343f,0x6d361b6d),LL(0x4d86e32c,0xf433219c),L_(0x0000003e), LL(0x22d4f25e,0x1f25620f),LL(0xd5c03d38,0x3a87f67d),LL(0x80f73464,0xe876505e),LL(0xe4906c5e,0x491baac4),LL(0x178a012b,0x93e07deb),LL(0x0f735b86,0xd75fad06),LL(0x76ce5dd8,0xc97cb185),LL(0xf5dd4cd9,0x634bbb55),L_(0x000000bc),
+ LL(0x4a6d5dde,0x37703361),LL(0xc5f2fac1,0x4dee5fdd),LL(0xe014aa4b,0x2218fde8),LL(0xa684a9b7,0x0e229612),LL(0x1d9b66c1,0x7cb5b99f),LL(0x1796c130,0x71c7eff0),LL(0xc0871522,0x27930b1e),LL(0xd19f171d,0x3091f21a),L_(0x000001d5), LL(0x4172f540,0xa74c873e),LL(0xbd512368,0xbc31a6ec),LL(0xd3ea21d4,0x62eff689),LL(0xbd43a95f,0x73a33474),LL(0x1413507c,0xf88fa97a),LL(0xb01846ef,0x8f06b4d3),LL(0xfbac8f6a,0xdc2a3015),LL(0x159ddd58,0x7b911f1a),L_(0x0000001f),
+ LL(0x5f77e97a,0x2fe873b0),LL(0x5ebf3c8d,0x32fe371d),LL(0x5b9ca7cc,0xc245b054),LL(0x2658798c,0xeaf83f8b),LL(0xf09afde6,0x761d87bd),LL(0x29e1b970,0xa4fd48a5),LL(0x1501c97b,0x5ab0a100),LL(0x1dca9665,0x0ec7beee),L_(0x0000002f), LL(0xc7a92892,0x28296b82),LL(0x171dfdb2,0x171bb70c),LL(0x1dac3a3a,0xad9a13af),LL(0xe21b7ea6,0x1fe361dd),LL(0x2f8b8125,0xccea9acd),LL(0xe8df3c1e,0xa4b48480),LL(0x8a5f495c,0xb8ecc783),LL(0x07fd225c,0xbc6bffc7),L_(0x00000054),
+ LL(0xb807b638,0x84cef36a),LL(0xcdf4c999,0x5f8d7040),LL(0xc211953a,0xfaefc5ed),LL(0x563ab4c0,0xa17066a1),LL(0x0c339a5c,0xafb2c094),LL(0x517a5667,0xb135b1e8),LL(0x3d2a94a0,0x4526e2ec),LL(0xd9185e4d,0x3c05d493),L_(0x000001b5), LL(0x676f8435,0x2fc5ced3),LL(0xff470fab,0x21ddb195),LL(0xed29f4a2,0x2d94f5fe),LL(0x69f0868b,0xaf8fcc50),LL(0x8631be3c,0x3dcfc141),LL(0x43a07062,0x1c9d9989),LL(0xbafa5f73,0x1cc4a069),LL(0xe1c5c56c,0xf502e626),L_(0x00000082),
+ LL(0xeb28400f,0xaaec0dfb),LL(0xb5f2559e,0x37f92069),LL(0xf82c9e25,0xde3d65ad),LL(0xca0987ef,0x52dba2b0),LL(0x110760de,0x6f1e9d7b),LL(0xec3c5a7a,0xb68a52e5),LL(0xe6b61974,0x47ef0970),LL(0xa12dbde7,0x952831ff),L_(0x000000e3), LL(0x193e5166,0x2a4c3695),LL(0x2be66d3f,0x90213a6f),LL(0xb1043636,0xecffb364),LL(0x0ea64838,0xaf651989),LL(0x059f3995,0xd04bda10),LL(0x8aa19045,0xfff61b8d),LL(0x76712e84,0xb77b5575),LL(0x6970c5d5,0xfb11370a),L_(0x0000011e),
+ LL(0x472b3293,0xe37454a0),LL(0x644b36eb,0x2bc89a6d),LL(0xe5b95fef,0x705a9c84),LL(0xc8e9527d,0x6ad037b8),LL(0xc306c56f,0xa3d9152e),LL(0x99bdd442,0x3acd8434),LL(0xd2e50d9f,0xfb35013e),LL(0x10c1418e,0xa1aaf42a),L_(0x000001ea), LL(0xd3620e3c,0x301c9fea),LL(0xa12968d1,0xf9c8c259),LL(0x796a5743,0x1c0237b8),LL(0x92290293,0x56baf809),LL(0xb04d2746,0x81ca3b50),LL(0x93109cb5,0xd70a42b1),LL(0x1ffad7c2,0x829c0f93),LL(0x90fb8081,0x00473bdc),L_(0x00000185),
+ LL(0xec7bc5fd,0x78a1fc22),LL(0x1e0d9fae,0xfe3efcad),LL(0x7975003b,0x1a1d9870),LL(0x5a8555e6,0x08399c40),LL(0x13808c98,0x1f10285e),LL(0xf7ae407f,0x6b16e9b6),LL(0x95f47114,0x5ef970a5),LL(0x42ba4017,0x58f89d1a),L_(0x000000be), LL(0x09085b73,0xb52c0fec),LL(0x68533122,0xc427c0ed),LL(0xd8c2fad9,0xbd46322d),LL(0x870ca81f,0xccd1cd67),LL(0xab6ba984,0x5510a68c),LL(0x6f619ce9,0x2516fdb1),LL(0xd13d0213,0x89ce2a78),LL(0xd4ddba71,0x33ef2f0f),L_(0x000000d6),
+ LL(0x2d019ecd,0xd29edf28),LL(0x8e335e18,0xe046e99e),LL(0x4ace8ce0,0x72c0503a),LL(0x42f01d0f,0x9c6d09e2),LL(0xfcb4567e,0x3998b6c2),LL(0x0686ceb1,0x91430be4),LL(0xb8fca6af,0x2236ef5d),LL(0x01c77e85,0x718e1a29),L_(0x000001a3), LL(0xab427d9a,0xab5ae430),LL(0xa843a1b6,0x025f63d8),LL(0xc9500fb6,0xd803e788),LL(0xfb7b9cb8,0xea023d9b),LL(0xcdad70fc,0x803f3ec5),LL(0xa7e50d4c,0x9c07188d),LL(0x9eb540fd,0x822ee2af),LL(0x0d14ab57,0xaff12ba0),L_(0x00000174),
+ LL(0x0f113d06,0x8230400e),LL(0xed3531cf,0x20fd0e05),LL(0x442851e2,0xd6869a7e),LL(0x1568acb2,0xae871699),LL(0xd7c29d8f,0xad380219),LL(0x512e57e5,0x17e73a2a),LL(0x0239d8b5,0xff1100de),LL(0xa4cc3700,0x3960bc57),L_(0x000000b5), LL(0xd0f458fc,0xec6e136b),LL(0x7a2013e5,0xb3934a8d),LL(0xdeac099e,0x7585325a),LL(0xc5fcf6e8,0xa4aae387),LL(0x73e275f5,0xe0a1bb17),LL(0xc599d358,0x78aeadce),LL(0x5e5ee001,0xf20a237c),LL(0xbc670ce3,0xc755c2ed),L_(0x00000056),
+ LL(0x980d56e7,0x9e1ae8f1),LL(0xb8a1be4d,0xec417dcf),LL(0xa0d53ddd,0x13c7c494),LL(0x565a5779,0xe8460798),LL(0x4157d87f,0x865e6ed9),LL(0x5fcc1adb,0x43eb5613),LL(0xff942117,0xf8951241),LL(0x65dffe8f,0xbc9c1cd1),L_(0x00000069), LL(0xb27b24a4,0x9c6c39b5),LL(0xdc72853e,0x60f36e47),LL(0x8941b5fe,0x036e5482),LL(0xd9f274e7,0x2bbb4450),LL(0xd2f8bf2a,0x900ba078),LL(0x48bef6a0,0x9a34b9c0),LL(0x548c40a6,0xa419ecbd),LL(0x3d7bc93f,0x5929867e),L_(0x000000b9),
+ LL(0xe3977001,0x2d5481cb),LL(0x900dd0cf,0x94bad4ae),LL(0x06d3c0a0,0xbee25614),LL(0x2d0029ba,0x4f1ce8bf),LL(0x7ae14d24,0x12c5aff4),LL(0xcb8bd567,0xd5130b01),LL(0xa1cb296e,0x13ab0e47),LL(0x287ae4a9,0x1c30c115),L_(0x000001e6), LL(0xdf0986d0,0x91cfcc0a),LL(0x9e6287d6,0xf8cffb98),LL(0x0a5d81d7,0x6e40495f),LL(0xfe24065c,0x4ac91688),LL(0x6ef91697,0x0bce1292),LL(0xfa7c3394,0x082d9558),LL(0x334da954,0x0d5bbff2),LL(0x41fa885a,0x6904d684),L_(0x0000009c),
+ LL(0x88636e5f,0x30ed1da7),LL(0x34a6a52a,0x610afcab),LL(0x9193baed,0x00ab78dc),LL(0x40598146,0x40d27bbd),LL(0xfc2510b3,0xdf263e04),LL(0x2c222200,0x4f8a34f4),LL(0xe2fa7ec8,0x7ecddf41),LL(0xf5c8a69f,0xb69fa963),L_(0x00000065), LL(0xdd29b7e1,0xde38eab5),LL(0x1dc06ecf,0xbce53abf),LL(0x287aff4f,0x123a0ff7),LL(0x865d5801,0x9bc53dd9),LL(0x7f2760b0,0xf4d19de7),LL(0x2617ed79,0x59b16830),LL(0xfb36b9bb,0x86d6b37c),LL(0xc68164d5,0x3ce542b7),L_(0x000001d5),
+ LL(0x83343459,0x785c9888),LL(0xd5898c8f,0x0f97f6b8),LL(0xa5e5e010,0x25a6849d),LL(0xdb272a5b,0x5b826b6b),LL(0xf1d7d775,0x8319ab20),LL(0x81fab2fc,0x051b545f),LL(0x13836d82,0xf3f0508b),LL(0x79a2e73a,0xc87d4ab2),L_(0x00000089), LL(0xe7797e18,0x9d6fea08),LL(0x0b7f377d,0x285c3784),LL(0x13a96505,0x5e5f0355),LL(0x80e5351a,0x92ff2d7f),LL(0xa4907b9b,0xf478e9fa),LL(0xec7c1179,0xd90b6dba),LL(0xd2c36f50,0xbe1d562a),LL(0x797351a1,0xf65a7374),L_(0x000001a1),
+ LL(0x6dcfe3ad,0x8caa24b9),LL(0xdad4ac58,0xe55e016b),LL(0x42a35993,0x04d4925f),LL(0xf4d85232,0x8c2cb262),LL(0x654bec90,0x44564228),LL(0xd9274933,0x58349da0),LL(0x55dc684a,0xb18184ce),LL(0xe08bebb4,0xe4015bbc),L_(0x0000006e), LL(0xa2f8db31,0xcea81cd2),LL(0xb89f906a,0x5a1b62b0),LL(0xc0a88adc,0x46897bd0),LL(0x3422a9ae,0x6bfb70df),LL(0x0d20f649,0x113b8338),LL(0x197424dc,0xf43ab4e9),LL(0x11c7f33e,0xc17b56d7),LL(0x3e3697c4,0xf0f21e9a),L_(0x00000141),
+ LL(0x0bbb8295,0xb3c8d4e4),LL(0x3221af32,0x786f9cb5),LL(0xef78da7b,0x6228aab0),LL(0x460bf9aa,0x4fd179a4),LL(0xf900af46,0x2bd49daa),LL(0x42fb7206,0xcadd2655),LL(0xfa16e111,0x992a0506),LL(0x4726c9f4,0xbd04e990),L_(0x000001c5), LL(0x8281f418,0xc3ac19be),LL(0xeed5408d,0xfa218d10),LL(0x2bf29af8,0x2a7befd5),LL(0x3b0d28b4,0xeabb7643),LL(0x28d2a823,0xfa48a66e),LL(0x34709b21,0x92c650bc),LL(0xdf1a83ea,0x261706b5),LL(0xa9a5f258,0xbeb0a33b),L_(0x00000019),
+ LL(0xe0952a3f,0xd53c20db),LL(0xb6013f7f,0x09d4a480),LL(0x447348d1,0xcb6a7da1),LL(0xd8bfe6fe,0x64e8c529),LL(0xa6067265,0x9034045f),LL(0xa8df68fa,0xff3f3ee2),LL(0x1796dbc7,0xdedc2792),LL(0xe9a130fe,0x4c3f368a),L_(0x000001e2), LL(0x9eed66d4,0x792961eb),LL(0xed55f272,0x9b014919),LL(0x0068193a,0x44cb0bf8),LL(0x32ef3174,0xe22227ee),LL(0x4cb4a896,0x147c8b85),LL(0xc6a73b28,0x2ed1bf6d),LL(0x6804296e,0x77be001d),LL(0x223e6f8a,0x89b143ab),L_(0x0000004c),
+},
+/* digit=98 base_pwr=2^490 */
+{
+ LL(0x8ea1f1fa,0xec0e9921),LL(0x21044500,0xcba88ccf),LL(0x0c873630,0x6fd4e4b8),LL(0x45764f80,0x056645dd),LL(0x4551a9a7,0x72ed8739),LL(0x025ba6b1,0xa9a78987),LL(0xdd01b45f,0x1f9f1355),LL(0xd2ccea3a,0x807cbab8),L_(0x00000192), LL(0xe24e1198,0x4c6c96e8),LL(0x1a51e813,0x57065d92),LL(0x2ab97599,0xa89e1baa),LL(0xabc4035c,0x057c2aaf),LL(0x1a6716df,0x9c0890aa),LL(0xf802387d,0xc7786bd3),LL(0xa39383e5,0x1f627056),LL(0x00601e4e,0xf2265779),L_(0x00000096),
+ LL(0x1b109b21,0xd4e8955d),LL(0xe1d0f381,0x45a79e1d),LL(0x6407a6cf,0xe689a76d),LL(0x407f2393,0xd92aed2a),LL(0xac261bd3,0x95547cc6),LL(0x9e62fcac,0x49835e0b),LL(0x1e291077,0xdde8f908),LL(0x7b3d6780,0xc4cab77f),L_(0x000001c5), LL(0xf3dc82cd,0xbde052d3),LL(0xaa1aeecd,0x958c939c),LL(0x24153092,0xca5c0f7b),LL(0x5c0c11b7,0xc9284796),LL(0x3698d827,0xd732af64),LL(0x351c0ba1,0xa3ee0367),LL(0x1b1bf491,0xec2302cf),LL(0xafdf3514,0x4436d640),L_(0x0000014c),
+ LL(0x1e921eea,0xe09f3da3),LL(0xb7ed8d41,0x97fc0836),LL(0x33451dcc,0x1b62ac0b),LL(0x4bb0f328,0xc7985f30),LL(0x76f68d69,0x7e5bf130),LL(0xa8fcc12a,0x87f28f61),LL(0x0c13fc90,0x097e8f18),LL(0x9299a913,0xec6104d5),L_(0x00000150), LL(0xa95b34c6,0xf8ef488b),LL(0x2c0a7e4f,0x94b33bee),LL(0x5db54ad3,0x4a72bd81),LL(0x0abb0c63,0x57fa905b),LL(0xa7b05810,0x98b0da0b),LL(0xc18c2e82,0xa6507965),LL(0xd53207a1,0xba323d2e),LL(0x1a96c29e,0xe70d8f52),L_(0x000001e6),
+ LL(0x7179d881,0xc54265bd),LL(0x14b97128,0xe0b08320),LL(0xfd3dafdf,0xb3fd6699),LL(0xb8bb1956,0x416a87bb),LL(0x038f8691,0x01dd4344),LL(0x88826c84,0x7456566c),LL(0x07a8a4b7,0xb2fca59f),LL(0x037671e1,0x797dc52a),L_(0x00000000), LL(0xe8d7f705,0x5d7843bb),LL(0xee9b4c46,0xfa39c4f9),LL(0x303b1652,0xc4a55ae2),LL(0xc15ae7c4,0x3ccdcb67),LL(0xda8ac526,0x7a17fd06),LL(0x8d1d1e92,0x685ac10d),LL(0x5bfc6232,0x048bbb8e),LL(0x233162cd,0xc2cffebb),L_(0x00000111),
+ LL(0x789c58d4,0x20c13569),LL(0x9b91ab1e,0x14810705),LL(0x032808d4,0x6428e5a7),LL(0xdd56117a,0xb86a6737),LL(0x9ed920a9,0x32ca9ded),LL(0x46d45de0,0x0898b533),LL(0xaef720c0,0xc4b5cbd6),LL(0xe8b625d5,0xd262cadb),L_(0x00000025), LL(0x69824bf0,0xbe07a63a),LL(0xae8c0455,0xc0c992ba),LL(0x56ade4e3,0xd8c4dd74),LL(0xaddf367e,0x1fb487a3),LL(0x10d03d26,0x978961e7),LL(0xced02543,0xb1fb8d4a),LL(0xd9cb94bb,0x4067c3be),LL(0xfd0c7063,0x1e63aa4d),L_(0x0000003e),
+ LL(0xc18c25f0,0x43a818af),LL(0x8e882098,0xa14d3397),LL(0x2df8f9ff,0xfba08f0f),LL(0xc3139e9a,0xd6f4162c),LL(0xd35b42ed,0xddc9743c),LL(0xa29eeda8,0xeaef65fa),LL(0x1d1cf761,0xc4cffc87),LL(0xf5204083,0x9c04512b),L_(0x000000af), LL(0x76c92be0,0xcce1fc0e),LL(0x4ca92fa2,0x0756de13),LL(0x7ef7ab66,0x6b218d95),LL(0xa4befba4,0xec5df862),LL(0x028018d1,0xb0fb4797),LL(0x0fba684f,0xbb1872b1),LL(0x035fcdb9,0x727d62c3),LL(0xa85f1754,0x52c190b4),L_(0x000001a0),
+ LL(0x62904b65,0x8c02d54a),LL(0xa33c5b35,0x9d3a0d5a),LL(0xda74fd32,0xcf0e2fac),LL(0xdf27160e,0xa9cf0042),LL(0xce44dc1f,0xf9b4e2f6),LL(0x8815ba75,0x71f7406a),LL(0x5d29fed7,0xba78d604),LL(0x1b44fac2,0xa544aa8d),L_(0x000001da), LL(0x44983ea1,0x4f2a1a98),LL(0xb052a60b,0x2ee09590),LL(0xfd68dd3b,0xf82abd62),LL(0x4cd7b68f,0x3747e4a5),LL(0xa7a82c3e,0x6580fff5),LL(0xfc1c77a5,0x878185a1),LL(0x29848ebd,0x3507cf8f),LL(0xe376e805,0x3d153708),L_(0x000000fa),
+ LL(0xec3c1780,0xd12cb202),LL(0xde81ad92,0x7dfd0285),LL(0xb71b7749,0x0c150a03),LL(0xf597a8a1,0xe99f4ad3),LL(0xaef51dbb,0x1f4533b0),LL(0x838ed493,0xbcf13b27),LL(0xffc95a8e,0x5623ddf8),LL(0x2b2cefcf,0x37c16683),L_(0x00000107), LL(0xda2ff7e4,0x8ce740d8),LL(0xf3d3ab04,0xd03ed624),LL(0x376415ce,0x76391c7d),LL(0x22ffbe56,0x671ffe7b),LL(0xcc5f4981,0x90390438),LL(0xae289dd4,0xef0984a5),LL(0xf9a1f5bb,0x41c66528),LL(0x3eb05c49,0xef77ff07),L_(0x0000003a),
+ LL(0x75a1acd6,0xdc003b87),LL(0x913da2c9,0x7357222f),LL(0xb56a4216,0x44f79a9a),LL(0x435f9dd6,0x6316da1e),LL(0x76bee0c1,0x44a0a348),LL(0x528570a1,0x1fc2528a),LL(0x9e402d88,0xadaf6615),LL(0x23fd690f,0x1b05eafc),L_(0x00000050), LL(0x66a31ca1,0x22ceb0f5),LL(0x9817f70b,0xb1910295),LL(0x586cc9da,0xfd424885),LL(0x92631348,0x902c218d),LL(0x2d6b4b6b,0x3b06ab9d),LL(0xf6ce2b8d,0xc2ef9db4),LL(0x5440a618,0x86f795ee),LL(0xe7115329,0x241af150),L_(0x0000019d),
+ LL(0x9e7167f7,0xb84d399a),LL(0x5d1b603b,0x6e75095d),LL(0x3ebd519c,0x0c38a4d8),LL(0x5a2e8ab6,0x703ee9c9),LL(0xbe621b2f,0x46425097),LL(0xeda0425f,0x3bda2722),LL(0x7eaff2bd,0xc82eaa59),LL(0xddb8e21a,0x9f181562),L_(0x0000011b), LL(0xa357af4a,0x319323ed),LL(0xf55ade52,0x1195febd),LL(0x72cc0544,0xa5494291),LL(0x34dc9234,0xaa005164),LL(0x2b24e83a,0x2e6ec50c),LL(0x61a67644,0x300b585a),LL(0x2a2cce42,0x251bf8fe),LL(0xc53eb03f,0xa53e93a0),L_(0x0000007c),
+ LL(0x7d64ddd7,0xbd450c1b),LL(0xb6233906,0xf8cf8ce0),LL(0x2f163b01,0x37f9bc73),LL(0x121c5a4d,0x74a3b3e9),LL(0x84c581f0,0xd2aa3a2e),LL(0xa16b9ae6,0x7a258259),LL(0x5182e300,0x6d279587),LL(0x3b163221,0x9054a8d4),L_(0x00000100), LL(0xa5941c9e,0x650238b5),LL(0xbdfac6cd,0xbc313548),LL(0x60bb5887,0x98e5a28f),LL(0x3b8aace3,0xb0c9ed3d),LL(0x1f5ded63,0x943fdf61),LL(0x3ad1b6fe,0x292fee9d),LL(0x3bea9f61,0x765fb8a8),LL(0xb3aff102,0x1c05be97),L_(0x0000005e),
+ LL(0xc6900b62,0xdf604a9b),LL(0xe5f51ce9,0xad97f878),LL(0xb763f98c,0x89d3ab54),LL(0x6fef5a13,0x3d0efdef),LL(0xdf2543ab,0x39be5cf0),LL(0x51869676,0xd8322a0d),LL(0x34850193,0x90477611),LL(0xe0860abf,0xf04b3d8d),L_(0x000000b4), LL(0xa5518941,0x65e57c44),LL(0xa66238e0,0x78a12a3f),LL(0xd140af78,0x55dcc858),LL(0x65fde14d,0xc7b391cc),LL(0x4d882561,0x2d7dbf32),LL(0xaa74e78f,0x03f85d09),LL(0xed166a45,0x7ad860c8),LL(0xe6da0c2a,0x8d8fe387),L_(0x00000004),
+ LL(0xb38db64f,0x06980a45),LL(0xdae5a808,0xcd56237c),LL(0xdb2a4bfb,0x1628aed0),LL(0x029fee0a,0x5baf2e6b),LL(0xcfe94b4b,0xbaa05917),LL(0x186a18d2,0x6fb7aa6f),LL(0x3e611766,0x97f81882),LL(0x759b437f,0x25dc9d58),L_(0x000000c3), LL(0x4bf0133d,0x16ed73fe),LL(0x1dbc5e5f,0xae04984f),LL(0xb2380921,0x00f6d531),LL(0x941b93a0,0x9956e547),LL(0xafda37c5,0xbcd796ef),LL(0xeb23c73c,0xd18e7739),LL(0xec321455,0x9f3b6f4a),LL(0xc9846e98,0x7c09f2f9),L_(0x0000010b),
+ LL(0xe0076809,0x447d7aeb),LL(0x4ec21998,0x691aa304),LL(0x062e1539,0xd6b055f4),LL(0x350b4c67,0x310e0e47),LL(0xeee31b24,0xe16697e6),LL(0x24a9c93a,0xc742c710),LL(0x50e8a296,0x5f791c6d),LL(0x511ff4a6,0x4536286d),L_(0x00000179), LL(0xc52ae1e0,0x36a695b3),LL(0x301dfa2f,0x07145edb),LL(0x89ff6d58,0xb1a2232a),LL(0xd04785f8,0x27854372),LL(0x37e21f65,0x82b68a6c),LL(0x56a575ee,0xb3063755),LL(0x45ea52c0,0x0e5cba73),LL(0x1f5a3458,0xb3b90431),L_(0x00000131),
+ LL(0xc80f270b,0x05a677e3),LL(0x7473a30c,0x5a28a98f),LL(0x8039064e,0x69a1890c),LL(0x559f0687,0xdf1716eb),LL(0x5a68dd8c,0x216c64b2),LL(0x665fa083,0x89b49b44),LL(0x27c0f780,0x952e61c5),LL(0x5e57e0f3,0xc9f22b25),L_(0x0000015f), LL(0x96d8f8cb,0x9de5f532),LL(0xa33b1f2d,0x6ef509f5),LL(0xd526630e,0x80ca2834),LL(0x2e72073f,0x551bac6e),LL(0x8bdc5409,0xa93f6103),LL(0x74c46ebb,0x78de2a49),LL(0xe616b99b,0xbd4c9f5c),LL(0x5a4f27fb,0x9a70865d),L_(0x000001c4),
+ LL(0x7162a8e4,0x66505ddc),LL(0x5ed0deab,0x89dc51fb),LL(0x5e972cc6,0xb69dc78b),LL(0x0c6e495f,0x3f182669),LL(0x96d605ca,0x85f61868),LL(0xf6678928,0xedfbfd32),LL(0x863f96f8,0xdece22e8),LL(0x64e644e5,0xf857a4d5),L_(0x000001b7), LL(0xeebfc5de,0x55691ddb),LL(0x1566a700,0x7fa43590),LL(0xe1f4e606,0x796a672c),LL(0x30886e62,0xe5ee14cf),LL(0x40aacab4,0x9b327c1a),LL(0x3294bd68,0x2c002fed),LL(0x103e5699,0xf8494f59),LL(0x9eb1323d,0x51fec2bb),L_(0x0000017b),
+},
+/* digit=99 base_pwr=2^495 */
+{
+ LL(0xaea3c081,0xcb769c73),LL(0xa9593240,0xb057cdf9),LL(0x4e8217f3,0x220054ab),LL(0x34dceca2,0x5ba1c2a7),LL(0x22b719c9,0x16500d13),LL(0x1b436038,0x0ba1ec57),LL(0xf76e87cb,0x59db2c76),LL(0x77c59385,0xbe033b58),L_(0x00000197), LL(0xeb075ca6,0xddb6a77f),LL(0xc6a6cde3,0x8f578d9c),LL(0xe4987253,0xeaf37819),LL(0xa10e469f,0xdc9c48cd),LL(0x0f98832d,0x51a6e545),LL(0xbf05ea5f,0x195d2d31),LL(0x75cd216a,0x89987c43),LL(0xd18007e6,0x358f3e07),L_(0x000000bc),
+ LL(0xf2770c43,0xd66a73f6),LL(0x68ca281c,0xa08670f9),LL(0x827efca6,0x180e8f32),LL(0xeac3a96b,0x9979b757),LL(0xbff7df80,0x2d9223bf),LL(0x166015fc,0x30d747dd),LL(0x5475a887,0x9ea9d126),LL(0xfbce1622,0x23756de3),L_(0x0000016d), LL(0xee27c6e9,0xa8ed537b),LL(0xe46c7c15,0x6d7df943),LL(0x4b3f8765,0x335be530),LL(0xdb8a9213,0xcb0ee208),LL(0xb61ee376,0xa4f5fc16),LL(0x4ee85495,0x2d47c111),LL(0x53ced62c,0x453ad352),LL(0xaf641c92,0xe1a21d73),L_(0x000001e4),
+ LL(0x45292063,0x515c16f0),LL(0xa0b8ef31,0x11c31db7),LL(0x6aca4236,0xa62abc90),LL(0xc862474f,0x94eec3da),LL(0x600cabaf,0x3cb82e64),LL(0xec07e4a3,0x3c98aa82),LL(0xef67e3ea,0x548e4dc2),LL(0x3817b7a5,0x6160dfbe),L_(0x000001b0), LL(0xd5114978,0x212ed3d8),LL(0xa341dfe1,0x71cd3579),LL(0x96070d42,0x9ade2ce0),LL(0x0d16c811,0x6ffd05f0),LL(0x1f2ea906,0x4add5623),LL(0x9034240f,0x871a6489),LL(0x92dc3317,0xd71bf3b7),LL(0xd6ec77d9,0x3faf4d88),L_(0x0000010a),
+ LL(0xc9de102a,0xab483ff2),LL(0x0cb9492b,0x1910717f),LL(0x1999673c,0x5ba40ad7),LL(0x61f5c7a7,0xec8c1ec8),LL(0x7a954022,0x87870445),LL(0xab6d023c,0x607c1194),LL(0xdaf5008c,0x53612330),LL(0x4ad39492,0x5bf20a93),L_(0x000001ab), LL(0x1b16277b,0xab8ed330),LL(0x045574d7,0xf38e3b31),LL(0xed11cb44,0xab10bb4e),LL(0xa511af67,0x33cee10c),LL(0x9fe7c1d0,0x1549874c),LL(0x6999489f,0xa85b392d),LL(0xfcfe4a15,0x3684decf),LL(0xb3b006a1,0xbaefda3e),L_(0x000001b8),
+ LL(0x8b50487e,0x3d2bc261),LL(0x1ee7f1c9,0xd8d2c223),LL(0x25894a88,0x1159870b),LL(0x106d0fe5,0xac7070a4),LL(0x37cd1eb7,0x45edd566),LL(0xfcc105e8,0x0d87aaf2),LL(0xbbc54886,0x650d534b),LL(0x4c68c1c6,0xf8b73f4b),L_(0x00000118), LL(0xdb0789c6,0x1c67e752),LL(0x9fdf5e33,0xda66e59f),LL(0x1506a29f,0x04eb7efc),LL(0x566aa91a,0xaf0c681f),LL(0x41ad74ab,0xcd6fd019),LL(0xa0e6609f,0x90d32f02),LL(0xf9f03394,0xc3f5d1da),LL(0xbd5dbcf1,0xa63c99d2),L_(0x0000015c),
+ LL(0xe7306a80,0x94e82cbf),LL(0x52832eb4,0x61b4102e),LL(0xb381c8b4,0x7f0afbca),LL(0xf1ba6e87,0x8482ae88),LL(0xc8cc076b,0xd709eb28),LL(0x5fc8e5ce,0x0c640cd4),LL(0x1363d1cf,0x6be8f78b),LL(0x4993a63d,0x7a8e7f6a),L_(0x00000140), LL(0x088bf641,0x1bfd703c),LL(0xb3415df0,0x8b57f708),LL(0xf82eeb2c,0x407aa69d),LL(0xa723ed35,0x9767c6b4),LL(0x4dbc3f44,0x52e1a818),LL(0xdffc3e96,0xad89d25e),LL(0xe8855e29,0x89f2e493),LL(0xb2c695a8,0xae2a995a),L_(0x0000005d),
+ LL(0x32b63b4e,0x7948d6db),LL(0x1bf35a68,0x6953ece3),LL(0x2e4f6945,0x5f0ffde7),LL(0x8e48e233,0x45b68e1d),LL(0x805943a8,0x7c03271d),LL(0x83acacfb,0x136c96e1),LL(0x20b340c8,0xb32c48cc),LL(0xbf7ec9c0,0x9a5cdcd3),L_(0x0000013c), LL(0x14fd95e6,0xeda9d905),LL(0x02288f5d,0x6d5bb5e0),LL(0xe250809d,0x26841f8e),LL(0x3ede31ca,0x5b8a74f6),LL(0x941707b2,0xcd744281),LL(0xf31b5a51,0xcb81c384),LL(0xa2b751ad,0x1c7d45f0),LL(0x98cd14ff,0x0b61414f),L_(0x000000eb),
+ LL(0x3dacf223,0x49c300d6),LL(0x149cc932,0x984e1f84),LL(0x4f71e87a,0xa635f884),LL(0x2ebebead,0xc51f4894),LL(0x8d815dca,0xb76c6b87),LL(0x60dede95,0xc3f25874),LL(0x83c91cf8,0x53753878),LL(0x6d13e9be,0x4ce987a5),L_(0x0000016d), LL(0x1675f42e,0x22fb2015),LL(0x4bf1c2d6,0x8bc4abf5),LL(0x22da7f9e,0xe7b83f3a),LL(0xe42051b0,0xeda536a6),LL(0x9d89d573,0x3ce8431a),LL(0x64d23c5a,0x3eec2b7a),LL(0x07a6be7b,0xb5fb43a0),LL(0x5b672919,0x4a7d1800),L_(0x00000045),
+ LL(0x98c6c900,0x54bf1abe),LL(0x835f5200,0x88be0ac1),LL(0x80a69454,0x37a520fe),LL(0x1ae181ec,0xfbf51fae),LL(0x1dbbcb25,0xe0a144d5),LL(0x7481d4f7,0xbb7cdca1),LL(0x89f680f7,0x0d5abe7d),LL(0xb4b624a0,0x391425d4),L_(0x000000f3), LL(0xe424aa1c,0xb4188e07),LL(0xbfd1f50f,0x6575b3b7),LL(0xa43201e2,0xbba2a525),LL(0xe0fef193,0xc9408771),LL(0x2d5a89d3,0x5fad41dc),LL(0x95a6705b,0x7d9dc257),LL(0x9020f8bb,0x290e4eb8),LL(0xfbd17a63,0xbb41e71c),L_(0x000000d2),
+ LL(0x29e97a00,0x929f484a),LL(0x0aa411ba,0x72a995e9),LL(0x16fc135a,0xc8dd8a3a),LL(0x2226cfa3,0xefeed6df),LL(0xebb1a266,0xbe66eb40),LL(0xd15ad7b0,0x9e390f8a),LL(0x0c3a1992,0x4d13a05e),LL(0xd151e340,0xcf393bac),L_(0x00000175), LL(0x4d898149,0x956cdbeb),LL(0x4f6ce102,0x1a20db88),LL(0x3138d132,0x4bd065b9),LL(0x3956528c,0x082878ee),LL(0x1ab3833d,0xc2946565),LL(0x49e6b0dc,0xe955cb4e),LL(0x10248d30,0x1ae9cc37),LL(0x9e6e01a5,0x5567eab8),L_(0x000000fc),
+ LL(0x17fc3dfc,0x263e83bd),LL(0x531fddd1,0x56ab0f10),LL(0x11105bea,0xe11b8ec7),LL(0x98797be3,0x1992abc2),LL(0xec87b621,0x2f8db083),LL(0x8d258c0b,0xb3d171f4),LL(0xac2ced2a,0xd1cb21ab),LL(0x7bcca55e,0x47bc4dad),L_(0x0000000d), LL(0xe7fc240a,0xf1f3098d),LL(0xb97a56f7,0x30359457),LL(0x13b63e78,0x5c0291e4),LL(0x0560b59b,0xfd66b1ed),LL(0xffcd1e35,0xab62195d),LL(0xa68ddbd9,0x5e1a88f2),LL(0xc8f7a10f,0x5805f677),LL(0xc770a044,0x145b476e),L_(0x00000166),
+ LL(0x072f54a0,0xfec59218),LL(0xbad5f014,0x29cb3195),LL(0xdeabd554,0xfb9c1406),LL(0x8cab2ab5,0xf39524ff),LL(0x1480bd6c,0x6fbb57c0),LL(0xc932f537,0x34f118cb),LL(0x9e4e5da0,0x6eb8d83c),LL(0xa6fb16c3,0xc80fc4ea),L_(0x00000048), LL(0x1e1cfe69,0xbe668aa1),LL(0x614afa98,0x9a412d4f),LL(0x4cadab47,0xb94d7822),LL(0x933864b0,0x51053a74),LL(0x424e5f26,0x3dd43fe6),LL(0x600bdaac,0xf8a04f2c),LL(0xc0b432cc,0x4257110e),LL(0x2f4d8257,0x58edc3e1),L_(0x0000004e),
+ LL(0x2d89ca71,0x42ad308f),LL(0x07b9420d,0xf2ff228d),LL(0xf800adda,0x959a36a9),LL(0xa755b758,0xe791f71f),LL(0x06570844,0xc9aeec3a),LL(0x2525c1b6,0xf99b3c09),LL(0xfae920c4,0x93e1e24e),LL(0x54cdd224,0x4a6949cb),L_(0x00000108), LL(0xbd54c1b3,0xc1192578),LL(0xf0af3d86,0x042c14ae),LL(0x035da967,0x54675869),LL(0x65aba6d1,0x00ddf870),LL(0xfb6525b8,0xcb3618ed),LL(0xa58a9ef1,0xa2776a71),LL(0xd7373181,0x9adaa84e),LL(0x5acac693,0x7c38e845),L_(0x00000017),
+ LL(0x2f298451,0x17d5163c),LL(0xb8856ff7,0xc5c08271),LL(0xa79d0557,0x32810d21),LL(0x16514840,0xa6e95174),LL(0xce8f06a5,0x393b8782),LL(0xf14b15d0,0xdf3da6f7),LL(0xa398eeac,0xc040c1ac),LL(0xd2eb31c7,0xe9ed34f4),L_(0x000001ac), LL(0xcc4ff509,0x6386bac2),LL(0x294f7bd0,0xf986d8d5),LL(0xec0b7a55,0x55592285),LL(0x96568681,0x15833824),LL(0x307162e2,0x03366d9a),LL(0x196efa15,0x78331de9),LL(0x6afbb75f,0xce11aa87),LL(0x4246ce65,0xa207e319),L_(0x000000f7),
+ LL(0xe290f3f8,0xdf95cccc),LL(0x2c3a928b,0x954c7e07),LL(0xb87fc4e2,0xc556dd0f),LL(0x5dde9996,0xa10a09f2),LL(0x017edf41,0x126b8ebf),LL(0x11739253,0xe86b6fe5),LL(0x1f9be2dd,0x7b89b849),LL(0x4acd9273,0x572a4b24),L_(0x00000018), LL(0x695c6282,0xe035ed7d),LL(0x8545db72,0x1c4fb913),LL(0x52bc38af,0xe8b8d046),LL(0x500cd8de,0xd8bd36cf),LL(0xc86ac9e5,0x7fd4ed73),LL(0x82941dac,0x968c57f8),LL(0xcd1842b9,0x806ab108),LL(0x4885bf1c,0x7821dec4),L_(0x0000014e),
+ LL(0x7d0fa54f,0xf8d6129f),LL(0xbddf5a7c,0xb2f43150),LL(0xb4988625,0x3c2f3809),LL(0x1299bbfb,0xb080f7b3),LL(0x84ed45f5,0x20ab0abb),LL(0x824f7bed,0x533e510d),LL(0xd6447243,0xb64fbbb6),LL(0x67c576b7,0xcaa9ee82),L_(0x00000016), LL(0xea0b07fd,0x4253a269),LL(0xf68fe622,0x4572de06),LL(0xa777b687,0xcf599bf5),LL(0xa16d5f86,0x2a811045),LL(0x94a33dfe,0x08732642),LL(0xac970a0c,0xd6867a04),LL(0xeb2b7d05,0x0e51a57c),LL(0xad29a28a,0xbf79a38e),L_(0x000001ac),
+},
+/* digit=100 base_pwr=2^500 */
+{
+ LL(0x6dc2f627,0x103efe86),LL(0xcb9e407c,0xaaa13853),LL(0x0e6c71ed,0x1b70a2af),LL(0x5ae18f75,0xcf7e3e82),LL(0x1ec11bb0,0x45c36a5a),LL(0x56ab4b56,0xa4e5487f),LL(0x86df052e,0x3868ef9a),LL(0xc7d75031,0xee422740),L_(0x00000060), LL(0xd47edd5d,0xb7ee652b),LL(0xfaa97f40,0xa3dd7397),LL(0x294d2d1b,0x453daecf),LL(0xe65344d3,0x24bd3f56),LL(0x1c9985d3,0xc78c6f61),LL(0x2675985e,0x8ad7e24f),LL(0x8b4060d3,0x6c928213),LL(0xffdfb749,0x27a6ad57),L_(0x000001e6),
+ LL(0xe5a166a7,0x589be6a7),LL(0x313031bd,0x84289d06),LL(0x704962d9,0x522512df),LL(0x4932ec5b,0x6a669eef),LL(0x4db07538,0xcfe74767),LL(0xabd7aebb,0xe7944dba),LL(0xd27fb22c,0x458ef814),LL(0x6ae70494,0xc9680563),L_(0x000001ad), LL(0x11b3ff8e,0x6c5b60c5),LL(0x915adb1e,0x108c6584),LL(0xf8937e8e,0x64ea3a9f),LL(0xab88406d,0x61d268f9),LL(0xd6126f44,0xae3ff279),LL(0xed1f3032,0x22a5d3b3),LL(0x3a1b63af,0x2fd7a532),LL(0x90caf928,0xf7a42a75),L_(0x00000199),
+ LL(0x014a6bc9,0x9fdfb005),LL(0x179f05f7,0x91c70d36),LL(0x1f0a00c5,0x1bdb8aa0),LL(0x13b09f86,0x1877e4cc),LL(0xab098b85,0x804921bd),LL(0x47ca3471,0xb874265f),LL(0x78a5d59c,0xeb734d84),LL(0xbb8aac74,0xa87e5bc7),L_(0x000000f6), LL(0x082ec4f4,0x635dd559),LL(0x340b409a,0x4cff9fd3),LL(0xe395e617,0x83237476),LL(0x0e435fdf,0x995df5d9),LL(0xacf9026e,0x0535beb0),LL(0xf60fe3f2,0xc3baddc2),LL(0x21d68a60,0x5d079f08),LL(0x8b800543,0xf7a20c38),L_(0x0000004e),
+ LL(0x4902c85a,0x061ce962),LL(0xee54d7fc,0xe676ddac),LL(0x8e982883,0xfc5997cf),LL(0xe8ccea68,0x4f3d06f1),LL(0x42831bb9,0x57b80d82),LL(0x625c3604,0x7389ec2e),LL(0x5466a1d8,0x13ff25b1),LL(0xf9c50093,0xfb5d45d1),L_(0x0000005e), LL(0xf2463011,0xab4e32c6),LL(0x08ec78b5,0x24014646),LL(0x53a9c0b3,0xd5ffb795),LL(0x5594ddea,0xf933bdcc),LL(0xdc110f8b,0xd5249289),LL(0x5d52f652,0xcb4147d2),LL(0x95ab06c0,0x968adb2d),LL(0xa1bbff17,0x4039be6f),L_(0x00000066),
+ LL(0xee64527d,0x186c159d),LL(0x6c1da851,0x87f87d48),LL(0x2ffecac8,0x326e8ac4),LL(0x70a401c5,0x68a082d2),LL(0x0bd703fe,0xbb17b4ec),LL(0x9fe82427,0xd5029b1a),LL(0xf75c6b25,0x8859df58),LL(0xfaac56e2,0x0f97f9bf),L_(0x000001c7), LL(0xe4e3e216,0xaf73b932),LL(0xe721dc13,0x98f115f8),LL(0x825bde14,0x102f60c7),LL(0xf0780fd3,0x92e5a9e9),LL(0x9fcac3f2,0x96a4edbc),LL(0x51ae4427,0x123f8f26),LL(0x622ca1bb,0x3d2d6a72),LL(0x4fa4ca10,0x77d0f199),L_(0x000000a5),
+ LL(0x10e1302b,0x33e577af),LL(0xbf557eaa,0x98005156),LL(0xca7cba0f,0xe3d41486),LL(0x73d1e9d6,0x3a30b9f9),LL(0xaa3443ad,0x99856b55),LL(0x81921940,0x0ca4724f),LL(0x250cf13f,0xba1696b8),LL(0x9b6f0f69,0xba1deb1e),L_(0x0000003b), LL(0x72f9435a,0xa037cb66),LL(0x7437eb08,0xfaf55d7e),LL(0x579149c6,0x43f7c61c),LL(0x921e4c69,0xeba03e36),LL(0xc342ab26,0x0a3ade34),LL(0x86264eb6,0xcf120523),LL(0xffc57653,0x914e6e20),LL(0x5770eec7,0x2d678456),L_(0x00000091),
+ LL(0x072e1bd0,0x3106fc3e),LL(0x9739a62b,0xd166966e),LL(0x6ea97e6a,0xbc843284),LL(0x0fb2aa2b,0x1768bc4f),LL(0xbd1f5f87,0x0a51f2d1),LL(0x8890f99b,0x5f53245a),LL(0x6a0000aa,0x38e0dc0b),LL(0x49547c15,0x3dbece21),L_(0x000001c3), LL(0x7b97c512,0xeab56de1),LL(0xcb15a8e3,0x8e0ff0fc),LL(0xc00352a7,0x0dae3bf3),LL(0x716e7d48,0x273cee30),LL(0x83dde892,0x00962a42),LL(0xe18ae53b,0xcb2ce674),LL(0xb8c78835,0x12176412),LL(0xc6faee27,0x94e0f5e7),L_(0x00000062),
+ LL(0x2d854d6e,0x78569761),LL(0x266d871a,0xe7df9590),LL(0x015aa94b,0x4e8bbf72),LL(0x150482ac,0x12880439),LL(0xaa4b2f7c,0x53495f23),LL(0x5ef777bb,0x04a67481),LL(0x38a798c0,0xc7aadc88),LL(0x308a425c,0x2ccb5f57),L_(0x00000043), LL(0x640f2881,0xb506af85),LL(0x718ebc6c,0xdd21e3a6),LL(0x2c50bba9,0x56098fde),LL(0x7b6e3c4d,0xa8a72185),LL(0x02f4d7a4,0x9218f9c4),LL(0x55530e5d,0xa541a6f2),LL(0xbf7b3c63,0x97421bb0),LL(0x04f0181b,0xe7a08f28),L_(0x0000003d),
+ LL(0x611c41b4,0xb7a89c2a),LL(0x59bf73de,0x701684bf),LL(0x59572fc8,0x8134fb14),LL(0x116042d5,0xc2db37ef),LL(0x49c61bec,0xf05c9753),LL(0x0b65e976,0xbbefa454),LL(0x3b1cd2a7,0x2cb97f65),LL(0x790f0086,0xc011e095),L_(0x000000d8), LL(0x7cfb4920,0x170eba17),LL(0xc6e8d2e1,0x609e9ebc),LL(0xe69224f6,0xa74251dc),LL(0x88ae4a2d,0xf5331e8f),LL(0xf73bb04a,0xfb6fb779),LL(0xf42091f4,0x7aa76758),LL(0x23ea8c88,0xf921d2fe),LL(0xb43fc164,0xb83f6c60),L_(0x0000014b),
+ LL(0xae89583e,0xb2f332da),LL(0x1235350c,0x3fc1272d),LL(0x28803380,0xcc94724d),LL(0x52679e63,0xa1b6d063),LL(0x5f59afa4,0x8fd15f1d),LL(0x1998f9ec,0x67514283),LL(0x856a5843,0x0b1f071f),LL(0x44e35d97,0xa4396ed8),L_(0x00000024), LL(0x1fa181f4,0x209d5128),LL(0x36d77579,0x3d71f02d),LL(0x6903b9cc,0x242255da),LL(0x255e80b9,0x0d577ece),LL(0x8c99ca99,0xcce7a8ce),LL(0x6e67b351,0x8274de19),LL(0xb1789c3b,0xd9d46d98),LL(0xb68f17a4,0xbe658d62),L_(0x00000190),
+ LL(0xb5bb0a17,0xb2d11384),LL(0xc0e43052,0x18ea1e36),LL(0x6499f986,0x67f0543f),LL(0x6c81b7cb,0xfe7f0035),LL(0x0049686c,0xc866a608),LL(0xd1d9672f,0xad63f7a9),LL(0x402ddc59,0x0430d4e2),LL(0x90a63a4e,0x212afc89),L_(0x0000011f), LL(0xd4b7e0dd,0xa5a4f004),LL(0xb4669198,0xe3c06d85),LL(0x9dbced32,0xd46b4406),LL(0x6dc0df8d,0x13bbdb5b),LL(0x26fe23c2,0x9e72fe86),LL(0xf3f82db4,0x9908a610),LL(0x21de6fb9,0xacd7a7dc),LL(0x84215e98,0x8d6e691f),L_(0x0000016f),
+ LL(0x5bb0cb53,0x6a2a68fa),LL(0x1a45088f,0x097c3677),LL(0x93e569b4,0xf6248b6e),LL(0x76442347,0xf5aa90b0),LL(0x7db67859,0x47468b1b),LL(0x0335b7c8,0xc14d722e),LL(0xbdb192bb,0xa89357c4),LL(0x6091e296,0xabbee708),L_(0x000001a6), LL(0x25d75afe,0xb79d5c35),LL(0xfa81b0bd,0xb8c1d912),LL(0x9c98ad08,0x6f43a564),LL(0x487e8e86,0xb8305a15),LL(0x68d70b11,0x4f253374),LL(0xda0a3387,0xc3ee2674),LL(0x12970085,0x7d1dcff2),LL(0xabf94fcc,0x3abb8f41),L_(0x000000ca),
+ LL(0x791890ca,0x43ae6f56),LL(0x2ecfea4f,0xbfbd972d),LL(0x1717ff60,0x50d6adf6),LL(0x54f2d354,0x6c6e24d6),LL(0x2e42a5a9,0x8ef967c8),LL(0x2c029c93,0xef490e17),LL(0x74b0a604,0x3a515366),LL(0x835d8fbf,0x878ca8ab),L_(0x000000f9), LL(0x25b70439,0xb19f5e63),LL(0x0a7f849d,0xe7343af4),LL(0xa13e0960,0x93d2a93e),LL(0xd7e39973,0x58e4acec),LL(0x89b42cb1,0xb14fea72),LL(0x128188b6,0xaf37faab),LL(0xfe8c3b50,0x51d9f7ee),LL(0x2b121d0a,0x5997d399),L_(0x000001a5),
+ LL(0x40c610da,0x70a88d95),LL(0x0ae00340,0x2c6b6f8f),LL(0x941fb569,0xd4a8a83d),LL(0xfd77e569,0xfe3e5239),LL(0x2906296c,0x5d2269e6),LL(0x779ada15,0x65afaeca),LL(0x46fce296,0x41d7fedd),LL(0x0ceb36d9,0x39bc7e8f),L_(0x00000013), LL(0x385b4015,0x5ebed878),LL(0x04b873d1,0xb3e0c338),LL(0x061d2bb8,0xd36ffa7e),LL(0x596e92bc,0xbde7e857),LL(0x58c9a5ab,0x78a8b297),LL(0x34780b9b,0x6bd40718),LL(0xac60511a,0x2d3c02e9),LL(0x83e6ac72,0x6d092687),L_(0x00000112),
+ LL(0xa33a65c3,0xfd72e9bb),LL(0x99783135,0x67ff52e3),LL(0x8dc913fd,0xab427847),LL(0x8986e4a7,0x5377b12a),LL(0x8a8d9fc8,0x57fef8f8),LL(0xb61bed13,0xf189dc79),LL(0xd4bb14a1,0x2e6d28f7),LL(0xcd3d6f13,0xf00e6579),L_(0x000001a6), LL(0xf42d044e,0x14efe417),LL(0x9fb6caaf,0xabbb19b6),LL(0x951205f5,0x787b1023),LL(0x440fd20f,0x4968e195),LL(0x6d5f6164,0x33cbed34),LL(0xa2722dcb,0xf576c320),LL(0xbddf2d94,0xb80ba0c8),LL(0x414feeda,0xeb25ced6),L_(0x00000008),
+ LL(0x9ee2c247,0xaa61ebad),LL(0x6aced3dd,0xe5fe2dd4),LL(0x0bd3e3fd,0xfe14f9f4),LL(0x09520569,0xd818d1a2),LL(0xb4968b88,0x82f0bdc9),LL(0x0b8b7732,0x6520e3de),LL(0xfe9e8edc,0x272ff767),LL(0xbc017cf0,0x0f65dc99),L_(0x000000da), LL(0x3dc034f9,0x0a9b50b0),LL(0x4ea634ab,0xe6308ff0),LL(0x7b191db6,0xee04399a),LL(0xddea9de7,0xda7bdea8),LL(0x492d45e6,0xb54c55ae),LL(0x39e666b7,0xf573f4e9),LL(0x0c925a51,0x0292c159),LL(0x71f91622,0x80fc7f50),L_(0x000000d3),
+},
+/* digit=101 base_pwr=2^505 */
+{
+ LL(0xb83d191c,0x53639a92),LL(0x1ce7b1b4,0x1474fb3a),LL(0x0d260e43,0xaefab808),LL(0xc4e32954,0xfaf9e670),LL(0xb5bae76d,0xde42d0d7),LL(0x9eb4687f,0x5f45bfa8),LL(0x7d89b1ca,0xba638bbc),LL(0xc0ecce4f,0x1de873fc),L_(0x000000a2), LL(0x9165fd5a,0x36c9c2b4),LL(0x318f9f96,0x2cb815fb),LL(0x6f676d6c,0x7560919e),LL(0x41cc633a,0xe2d47525),LL(0x9a79e211,0xe199c599),LL(0xfbee081e,0x265f515d),LL(0x3107dec5,0xd0ea4e25),LL(0x6f2bdc9e,0x5a539ab3),L_(0x0000001c),
+ LL(0x2d570179,0x6ffa11c2),LL(0x1bfc6586,0x1f882706),LL(0xe25c9a78,0xeb5d1a25),LL(0x12852d54,0xe5fcb1fe),LL(0x4f331734,0xd8c5dfb7),LL(0xe48b7e54,0xcfadcca2),LL(0xe9b41639,0x193402d5),LL(0xb8e1f8c2,0xc49e8f71),L_(0x00000148), LL(0x943f50d3,0x4e33ca43),LL(0xe98a1f64,0xa7cb416c),LL(0xbd595ac8,0xe328cd45),LL(0xf8fd4eb1,0xec3fd8cb),LL(0xf768cfe8,0x9eb626b0),LL(0x476b1bbc,0x069d1524),LL(0x8d0ffe31,0x220edd8d),LL(0x2925aa89,0x60b37558),L_(0x00000036),
+ LL(0xf4f778c1,0xe83c1031),LL(0xc5cc621c,0x434bc9bb),LL(0xac957c67,0x27bcbc47),LL(0x430a3686,0xace0a905),LL(0xed2cb5ad,0x38aa0831),LL(0x0f4f5d32,0x1fa3c11d),LL(0xc48e91c9,0xedbfb351),LL(0x98229765,0xdf2591e4),L_(0x0000012b), LL(0x72bcfd0f,0xe38e4555),LL(0xa53bea9a,0x97db1ecb),LL(0x196518c9,0x58970b56),LL(0x6895c332,0xc6b46d1e),LL(0x0fe772a3,0x18e44ad3),LL(0x48216056,0xaf1a5dd6),LL(0x86d1933f,0x18ae6deb),LL(0xdf5a53d7,0x4345a6ba),L_(0x0000004e),
+ LL(0x7fbc903f,0x0deafce5),LL(0xa11885f4,0xf942172b),LL(0xd640aa98,0x17ce6b52),LL(0xdc1bfcf8,0x9d8e40bc),LL(0x14a7d638,0x3c804e7d),LL(0x80e95516,0x63048fa8),LL(0x4af7c92b,0x15381b03),LL(0x88fd6851,0x73ec6a96),L_(0x000001af), LL(0xf3848b20,0xf4f85d1a),LL(0x6ba36666,0xf47de871),LL(0xfbfc6c17,0xf9474540),LL(0x70e03b35,0x72b1ddc6),LL(0xad63874b,0x7f48bdd3),LL(0xd249ea68,0x6a15d7cf),LL(0xc1614192,0xe9d101f9),LL(0xacd8d963,0x1b9b1c2f),L_(0x00000077),
+ LL(0xb30a7c89,0xc3b944a7),LL(0x8b0aff56,0x97b94164),LL(0xacb2b2a3,0xfade0d57),LL(0xe22c59c3,0x72ad3ddf),LL(0xd8b6f7d4,0x4a332f59),LL(0xe436d0e5,0xb28ca267),LL(0xa69516f2,0xc620d57f),LL(0xdd5b988f,0xb3a24be6),L_(0x00000126), LL(0x0e17b40b,0x7dc7da50),LL(0xf918114f,0xa2d07106),LL(0xb35f8ba3,0xfe3e2734),LL(0x583e00bb,0x27f4b785),LL(0x5b427e96,0xb8110ec6),LL(0x6198344d,0x2666790f),LL(0xc2f9267c,0x9a6bed52),LL(0x15a1c587,0x05e6612c),L_(0x00000067),
+ LL(0xa3837d8a,0xeddc635b),LL(0xb97227a6,0xf72fcd23),LL(0xcc5023cf,0x16ff8449),LL(0x4d184e1b,0xa6e3cc25),LL(0xb6176789,0x14e442c7),LL(0x200d2b68,0x147e4e2b),LL(0x9903da3b,0xa26bbf3b),LL(0x6b6aeb08,0x849b5dc2),L_(0x0000005d), LL(0x8b8b5947,0xbb6ef597),LL(0x250dac2d,0xac7eb4e4),LL(0x0cadff32,0xfb97f1fe),LL(0x1e4bc394,0x2549b2e2),LL(0xa4d9b459,0xc81df54d),LL(0xedb4d3d9,0x885b7f7b),LL(0xa8c245eb,0xc2642e0e),LL(0xfd485de4,0xbbbd9d24),L_(0x000000f9),
+ LL(0x41537261,0x82620992),LL(0x9bdd489e,0xf9ff35e3),LL(0xe0746b33,0xfea9ab53),LL(0xc4e354c0,0x5438eb93),LL(0x660ea2e7,0xe43d99e6),LL(0x15697bab,0xcb7634f2),LL(0xacd2ac86,0xcf1f1144),LL(0xd531df3b,0x2d6020c4),L_(0x0000005c), LL(0xba8f9454,0x5eadffbf),LL(0x79147d9d,0x6799957b),LL(0xf22818e2,0xfc746f29),LL(0x7b9b1ddc,0x87c40fbc),LL(0x5518ebb6,0x12ffe947),LL(0x9a81391e,0x997b0c31),LL(0x3a724bee,0x02662680),LL(0xe08a5f24,0x1ebe1250),L_(0x00000065),
+ LL(0x5f304612,0x3b6bccc6),LL(0x4b51d15f,0x4d9896e4),LL(0x61b0ed08,0xdf4f3be0),LL(0xcedf84c9,0x6ed8e29b),LL(0xf45bde62,0xaa49395c),LL(0x128499be,0x812a1bfb),LL(0x30e7b9a9,0x442e44bd),LL(0xe50016d9,0x251b4710),L_(0x00000177), LL(0xfaa5f8e4,0xb4c58ea8),LL(0x8972e1af,0x6a3b7639),LL(0x2d603c3a,0x64b41953),LL(0xad6090f4,0x1c1cc6d5),LL(0x644bda3e,0x79fc4551),LL(0xe003b3c6,0xc4fe3bf0),LL(0x879a2d4d,0x9f3993d4),LL(0xd0249205,0x90933a0b),L_(0x00000094),
+ LL(0xb1b095cf,0xbaa0eb60),LL(0x64977e8a,0xed1a5135),LL(0xdb1eee40,0x7fe9e6fc),LL(0xef595c17,0xbc2a7a81),LL(0x4d74eea7,0xafbb2385),LL(0x34f92af2,0xffa66ed1),LL(0x9f246323,0x91252082),LL(0xd49955a9,0xa2901a50),L_(0x00000001), LL(0xa661dce3,0x19a6a510),LL(0xae624c6c,0xf34dd865),LL(0xbf77202a,0x6cbac9c8),LL(0x0d692aaf,0x2471eb03),LL(0xae2ff6e2,0x4e8b52f6),LL(0xfc37aa01,0x96b6740a),LL(0x5ca85277,0x4fc2258e),LL(0x1a66c773,0xd7c07ad3),L_(0x00000122),
+ LL(0x8dbc9582,0x3efb63d7),LL(0xb52733b4,0xadb5f371),LL(0xa39008b4,0xbebb4df3),LL(0xb7dee0b6,0x6cbc3a0b),LL(0x889767ea,0x0970ea6b),LL(0xfb4bece2,0x7f67b6be),LL(0x890b0f75,0xe72afc5e),LL(0x8395198d,0x6c13b8e8),L_(0x000001e1), LL(0xd3420042,0xcd597e49),LL(0x85730a39,0xd16d451d),LL(0xbb9ddfb7,0xc5ad35f5),LL(0x46f1005a,0x04cccc76),LL(0xfc9aa038,0x199ada1e),LL(0x03f6f34d,0x48f0a0bd),LL(0x200aa943,0x2532adab),LL(0x83389203,0xa871ac66),L_(0x00000098),
+ LL(0xac1a4aa6,0xd09b5635),LL(0xc63c436d,0x1bf51ded),LL(0x36468adf,0x71acd515),LL(0x98fc5e09,0xf48ba93b),LL(0xed9c3a1c,0x0c6b0d79),LL(0x01b9c574,0x24610fb1),LL(0xb968199b,0xe209e9f6),LL(0xbbce4f03,0xeee7632a),L_(0x00000095), LL(0x2b338eea,0x7c32158c),LL(0xce330212,0xeb40d5de),LL(0x1694cc96,0x981c6977),LL(0xddf4fc29,0x9ea41d2c),LL(0x89f8c78d,0x86af7d31),LL(0xd67b4c4c,0xf2c9d3cf),LL(0xad9e3351,0x16fcf6af),LL(0x702ac15c,0x16ccd30f),L_(0x000000b0),
+ LL(0xef338e43,0x31986e71),LL(0xafcb621c,0xe99b97d2),LL(0x3f65ee43,0x0c39ca80),LL(0x14bf4d0a,0x4ebb930d),LL(0x840ff2ab,0x894804fb),LL(0x76798c37,0x89a1b227),LL(0x3aa6a099,0x34d5a9a4),LL(0x6f4a66e9,0xdd3ebcad),L_(0x0000005a), LL(0xda731fcf,0x63a60589),LL(0x9cc5953b,0x6c38743c),LL(0x85a6854a,0x08e7cd4c),LL(0xf39a75be,0x936c5fc4),LL(0xfc799df1,0x93f15bcf),LL(0x739e6699,0x4c317bf9),LL(0x2e5c38de,0x6db73251),LL(0x427a1224,0xa307eb83),L_(0x00000136),
+ LL(0xaa579162,0xdc077b67),LL(0xa1669c8a,0x49cbb3e1),LL(0xd5e45b94,0x26a91035),LL(0xe7362c4d,0x3ddf32d0),LL(0x643b77a9,0x27b4f14e),LL(0xaa5ac709,0x1246b2b6),LL(0xfed505b3,0xce87322e),LL(0x6473f9c6,0xffc4c045),L_(0x00000121), LL(0xf98bfb3d,0x4300e539),LL(0x1c3ea4fc,0x79dff91b),LL(0xe9151768,0xe8106a01),LL(0xced48484,0xd2bbaae2),LL(0xb0b62aaa,0xec766cbf),LL(0x4fd3762d,0x3740af93),LL(0x1969f618,0xeff16696),LL(0x481e8d46,0x08f70c0b),L_(0x00000191),
+ LL(0xf8786a71,0xe6e4ffd4),LL(0xd4cc0359,0xdeb8f8ef),LL(0x6a7bc267,0xb0f6a0db),LL(0xceec7c5d,0xbe8f401f),LL(0x328be59a,0x0120834c),LL(0xea6a0206,0x5b979c4e),LL(0xc2f2cb42,0x6693b49a),LL(0xc70270e4,0xcb7ea005),L_(0x0000003e), LL(0x4229943e,0xd93cd84b),LL(0x59acbb8f,0x771ac6f4),LL(0x37d3f220,0x5f43f61d),LL(0xe983e186,0xe1ef31c8),LL(0x66433715,0xe567c88b),LL(0x4ca008fa,0x4f949b3b),LL(0x164fa949,0x7f0981e7),LL(0x55a6f6fe,0x85c2f160),L_(0x00000030),
+ LL(0x7091f78d,0x0fe60315),LL(0x778f4301,0x3d35c1e7),LL(0x42ff27b9,0x4e622807),LL(0x9ba721f4,0x9122d492),LL(0xc966361a,0x0b7b9eb9),LL(0x824265f0,0xd71fbe97),LL(0x90d81101,0xf6012c22),LL(0x3aa81035,0x77c80e09),L_(0x000000c0), LL(0x23dea1b1,0xc562080c),LL(0x0edd3c7c,0xd4bfec34),LL(0x6ac1e8f3,0x8628425d),LL(0x3dfaff6a,0x6eeb0125),LL(0x2bd725ab,0xf2cb02f5),LL(0xeb0228d9,0x63e15d94),LL(0x41589407,0xaa99cd36),LL(0x94061e78,0xf8ab88d8),L_(0x00000109),
+ LL(0x21abe88e,0xb83d39ba),LL(0xfe497366,0x1a08bb8d),LL(0x3fb2e32d,0x68fadea4),LL(0x90040dcc,0xc78d9e5b),LL(0x6201359b,0x8999242f),LL(0x4ca94e09,0x83f1e38d),LL(0x3e9a9377,0xf5e42def),LL(0xc5c271ed,0xd3d42e09),L_(0x000000da), LL(0xb7e48974,0x7f14caf1),LL(0x52b71020,0x42fb2920),LL(0x840b578b,0x4e0acb78),LL(0x9f5c859d,0xbd1059c6),LL(0xf5ce1fef,0xdfc0d187),LL(0xd99b98e1,0xb702018d),LL(0xd9d695b6,0x7056ff1f),LL(0x1187f703,0x73121d9b),L_(0x0000000b),
+},
+/* digit=102 base_pwr=2^510 */
+{
+ LL(0x7a6e63bf,0x89622bfd),LL(0x12bebe9c,0xcafd2ca2),LL(0x487abee2,0xd290457b),LL(0xc04143f4,0x05d13bf4),LL(0x716aab7d,0x067f0ae3),LL(0x7740d413,0x5925a309),LL(0xebe6d02d,0x14370b8d),LL(0xe8ef2c27,0xfae20be9),L_(0x000001cf), LL(0x7eac0b8f,0x8d09dc72),LL(0xb463618a,0x49d83802),LL(0xe00f8249,0x50666aae),LL(0xd5a21e88,0x54be3730),LL(0x258522a3,0xa6ce164b),LL(0xbf3fd223,0xfefa386c),LL(0xb7ba5ba4,0x479bc6a0),LL(0x378ecff5,0xece410bb),L_(0x000000c6),
+ LL(0x97fc3142,0xb8ebdae4),LL(0xfcc42342,0x0addd068),LL(0x2e8a76fa,0x1ba58a99),LL(0x972d98aa,0x585d2056),LL(0x5a290a6f,0x51a66712),LL(0xa47990be,0xab19e664),LL(0xe44696be,0x2f64d1c3),LL(0x490ab4a2,0x0b8ce484),L_(0x0000014a), LL(0x88951457,0x0acf9a53),LL(0x3b3fd199,0xdaaafe7e),LL(0x1c1f1592,0x3015bdb3),LL(0xadb01684,0xb2dbb2d0),LL(0x670d1295,0x3f77ef5d),LL(0xb3f98aca,0x51408bf1),LL(0xb5280fd3,0x0b5ee9d3),LL(0x3a7a5866,0xe5879122),L_(0x00000186),
+ LL(0x43cd6b28,0x2aa4eb8b),LL(0x719fd8c6,0x2ae67788),LL(0xd8b75613,0xd4b10cdf),LL(0x691c837c,0x7871303d),LL(0x169b2b0b,0x0d01af02),LL(0x6b821f74,0x33573229),LL(0x82eb3840,0x782b872c),LL(0xef815609,0x64bda6ba),L_(0x000000a9), LL(0x4db2512d,0x654fa37e),LL(0x9665a8db,0x761f0aa2),LL(0xe37a4531,0x4eac5b19),LL(0x586ef6d9,0x886dc010),LL(0x014c7183,0x075d0e7c),LL(0x55263f06,0x8a38c3bb),LL(0x5b8b13c3,0xf18380c5),LL(0xcefec3fb,0xb50c9c44),L_(0x000000ec),
+ LL(0x5b59b03b,0x5131c51f),LL(0x65ab5849,0xd5115c76),LL(0x8739b754,0x840523eb),LL(0xb96b253e,0x8a1f77e3),LL(0x765d9707,0x8742a046),LL(0x7e942e5b,0x1539823d),LL(0x0b3194bd,0x560b9978),LL(0xb52679bf,0xbda6ff32),L_(0x0000001a), LL(0xe66dad83,0x92820e93),LL(0x881e08a8,0x208f9f2c),LL(0x7e5fd839,0x4e86968c),LL(0x305d2580,0x76aeb554),LL(0xb44037fc,0x24c686c9),LL(0xb80d02e0,0x20e62e51),LL(0x5774d5a6,0x653df90e),LL(0xf0000eae,0xc9b31961),L_(0x0000012a),
+ LL(0xe873ab5d,0x0eaaf4f9),LL(0xfbc7cc75,0x23c2ade5),LL(0xd4d5bade,0x734024b7),LL(0xaca16532,0xb04a1289),LL(0x748144eb,0x599436fa),LL(0x2dc69353,0x292c7b3d),LL(0xe403f7a9,0xb831d302),LL(0xb390c4b2,0xefcb4c53),L_(0x0000003e), LL(0xbd287a5b,0xe0c0eb7f),LL(0xf6a7b102,0x411f77a6),LL(0xc71476dc,0xae920f7c),LL(0x2edbab42,0x28d62eb0),LL(0x3c6b13bc,0xc5296531),LL(0x35b583ce,0xfb32a342),LL(0x66e0af0c,0x23a5daad),LL(0xa449b545,0xa7558c28),L_(0x00000033),
+ LL(0x52d4b721,0x6383559c),LL(0x52741d3a,0x6d33fc8c),LL(0x98c5775c,0x595adc9e),LL(0xdeefc5ad,0xc4827819),LL(0x94326f99,0x384312e5),LL(0xc9b59642,0xfb777603),LL(0x6642d1f6,0xfebd7a7d),LL(0x04e71c64,0xd51e2c8e),L_(0x00000072), LL(0xf9aa2f14,0xfe188e45),LL(0xc6c9a2ae,0xcfd37d07),LL(0x870985c6,0xb64a1b0a),LL(0xf54e2700,0xd57c3e8a),LL(0x97a88233,0x4ccc22c2),LL(0xe7db1ecd,0xfff2895e),LL(0xb9be3600,0x2a410545),LL(0x8934c5cb,0x71986e7a),L_(0x0000016c),
+ LL(0x9dfa6b98,0x8664ea8c),LL(0xb006fef1,0x18fac77e),LL(0x2d10f805,0x144d6d0c),LL(0xcefe66ce,0x7ca13881),LL(0x6bc51a22,0x93e1d2aa),LL(0xfe6fc406,0xdde6594a),LL(0xcfe90933,0x92333bca),LL(0x2f2f839c,0xf1434e7e),L_(0x000000b9), LL(0x2169be2f,0x84887df0),LL(0xbd49b873,0xf75f870f),LL(0x4f7c90e8,0xe89d9ed4),LL(0xf464a50f,0x9a76a69e),LL(0x3d9a6cbe,0x0a745d9f),LL(0x0f9b1034,0x87bec297),LL(0x5fe8ae9e,0x7f1ab569),LL(0xad783c5d,0xea58b4b0),L_(0x00000074),
+ LL(0x0917b4f6,0x9ff8d786),LL(0x35735942,0x05d76bb3),LL(0x995f4b0a,0x58d0fe01),LL(0xe40e0f1c,0x21dccd2e),LL(0x3af9c629,0x40ab0ca3),LL(0x074069c3,0xa30b637c),LL(0x098a102f,0x44888bc2),LL(0xde377018,0xb2e96e33),L_(0x0000016c), LL(0xa96d1903,0x0f70d506),LL(0xe57ed3ba,0xe59c4f2c),LL(0x2492cf26,0x5879a0eb),LL(0x3d130599,0x75760ae9),LL(0x4103b206,0x89f9d0d0),LL(0xa2b74089,0x4b0ad618),LL(0x723e7b44,0xab5c813e),LL(0xebb80451,0x305a1f27),L_(0x00000016),
+ LL(0xd00287bc,0xd06cea6e),LL(0x063477df,0x7ad6ed83),LL(0xdfc2e4d9,0x7d58a8ed),LL(0x1a10d461,0x9fae700f),LL(0x9ad7943b,0x37aee0fa),LL(0x575deb90,0xef0a0865),LL(0x926de4b2,0x3a26c380),LL(0xc5d7be4b,0x910a980d),L_(0x000001a4), LL(0x66fcdff6,0xdc85a306),LL(0x8a336a7f,0x078dd7d7),LL(0x3626cc20,0x5cdeb063),LL(0xc2b171da,0x273ae54e),LL(0xab82b41f,0x10b49e9f),LL(0x9d867301,0xca9e1b59),LL(0xe2e4e776,0x7eb0c998),LL(0x2437d70b,0x3320fabf),L_(0x0000006b),
+ LL(0xa0ce92cd,0x7b0fa120),LL(0xb86bacca,0xfbcd14e3),LL(0xa097b60e,0xd21921a2),LL(0x57795942,0x96c19ceb),LL(0x8537f555,0x2145d8ff),LL(0xe5e61d05,0xc2c7c89b),LL(0xbe0f1c2c,0xb88cf04d),LL(0x77a2f17b,0x47c65308),L_(0x000001d7), LL(0xc686be37,0x9b1b0b2e),LL(0x3ba530cb,0xac5182ed),LL(0xea3a3af8,0xfa4f9dd8),LL(0x03a0d517,0x7b2d9856),LL(0x2bd4dfe1,0x6d8ccb18),LL(0xa68f896d,0xc8c4d1ec),LL(0xa1acec0c,0x0fdaed1a),LL(0xdc43340b,0x1a6552ac),L_(0x000000d7),
+ LL(0xa74443d6,0x1cfe1d00),LL(0x35fc4f26,0x06e2cd4f),LL(0x7dce43d2,0xfe4a6fd7),LL(0x8884f4ad,0x8bc475be),LL(0x9fb2b07e,0x9fe1c66d),LL(0xde1173c5,0xa0cf5d6a),LL(0x6059a297,0x4938219f),LL(0x49237fdb,0x01e57227),L_(0x0000003d), LL(0x5f7cc32e,0x35f11932),LL(0x63db0e8e,0x431b9b60),LL(0x0b8d8078,0xdb56a2b7),LL(0xa040057a,0x856dd526),LL(0x87409cca,0x3d5f500d),LL(0xb482e56d,0xd9cd1b6f),LL(0xbf890467,0x815814ee),LL(0xafa8c19c,0x2dd2fd09),L_(0x0000015f),
+ LL(0x0680f460,0x4ab480b6),LL(0x71a65ccb,0x061e197a),LL(0x2360920f,0xb306dab3),LL(0x9d9428ae,0xee526750),LL(0xcbaf9d5a,0xf58e47b1),LL(0xd9a6f7e9,0x696a3350),LL(0x5af36c30,0x1f66ddb3),LL(0xeaff438c,0xd4937e17),L_(0x00000119), LL(0x7821be61,0xac9df61e),LL(0x22655044,0x106e2b83),LL(0x1ae7bb1e,0x343bc8e6),LL(0x99139508,0xbc1e06e0),LL(0x166453a2,0x966bd6b8),LL(0x3756d0eb,0xb4bb44e2),LL(0x3795c5a1,0x625fe170),LL(0xb7605deb,0x426f42f1),L_(0x00000048),
+ LL(0xa4866558,0x06cfe4f0),LL(0x868d9076,0x47442b11),LL(0xec69d70f,0x7bd07599),LL(0x5e554262,0x4c93a1e5),LL(0x9ba31acc,0x5fa3f8f0),LL(0x5118c586,0xed99e567),LL(0x9ed35f7d,0x9e3fd347),LL(0xce15a315,0x0a315f79),L_(0x000001ce), LL(0x3173a0a9,0x86dda811),LL(0xb40d1386,0xb2f0ff2d),LL(0x0d2ec043,0xc03a536d),LL(0x01fe94d1,0x753c381c),LL(0x6d3c523b,0x468beaaf),LL(0xeb47f9a1,0x5d8bebfe),LL(0xeaf18315,0xb071abcd),LL(0x1a924dbc,0x3c1a4715),L_(0x00000080),
+ LL(0x68ec9abe,0xcce52519),LL(0xd9a705a8,0xef1ab816),LL(0xb6139e2f,0x4fdd8131),LL(0xdab1fe19,0xf7fb9e55),LL(0x94460d6e,0xeb0d1405),LL(0x6a211783,0x6ba4226e),LL(0x8b3a8c56,0xf2eeb428),LL(0xf7e95eb9,0x0b4ffc60),L_(0x000001aa), LL(0xfb4dfe97,0xe66a7792),LL(0x7209db94,0xdb0eb453),LL(0x0352a746,0x3c883ac1),LL(0xdd4b846f,0xb4107c7d),LL(0xe960d5ec,0xf20e2f77),LL(0x61292f8f,0x8b9e3ba1),LL(0x85963097,0x1218ba8c),LL(0xbba1103f,0x61201057),L_(0x000001d3),
+ LL(0x86acebee,0x08fb83e5),LL(0x0419bb93,0xc48ce791),LL(0x7a851af1,0xd3ade5e1),LL(0xedcfe59c,0xbf3e625d),LL(0xd7763ab7,0xd2c5aaf2),LL(0x625d14ad,0xb7b3d23e),LL(0xbf8e7638,0x7079ecb0),LL(0xc7d9e9b0,0x9c8fcf47),L_(0x00000001), LL(0x8c2d591a,0x074d6a10),LL(0xceed2d69,0x1a1995f3),LL(0x61d18bb0,0xf02767e3),LL(0x33398884,0x68db2be1),LL(0xbdeb7872,0x3e3fa104),LL(0x82f62909,0x2e4ab79a),LL(0x55582545,0x67badda6),LL(0xa7bb473e,0x26c76ce9),L_(0x00000000),
+ LL(0x8b6d8d82,0xc0ebb49b),LL(0x76edd0b2,0x7ef78c95),LL(0x089746d8,0x86ff89a1),LL(0x30dee546,0x51992a8e),LL(0x8362adcd,0xafcb70ff),LL(0x883f2631,0xa55108d8),LL(0xa13e25b5,0x93138472),LL(0x1fd32baa,0x64387fbe),L_(0x00000097), LL(0xd0f2fcd5,0xe8652373),LL(0xe1299928,0xce8fd7e9),LL(0x16c54d21,0x938b0123),LL(0xad0e62d7,0x4d602bac),LL(0xf9df41ce,0xc55138cb),LL(0x25dfe098,0xbc01e0e6),LL(0xbf9a6851,0x2bdbc63d),LL(0xa70b0da1,0x8b07ceba),L_(0x000000ec),
+},
+/* digit=103 base_pwr=2^515 */
+{
+ LL(0x9de2eac9,0xaca511d0),LL(0x698e16fa,0xcb4d0031),LL(0x2e96a74c,0x7b609854),LL(0x679b8501,0x87d91373),LL(0x6f39c358,0xa39fd4a5),LL(0x3aea2bb2,0xc7eef60f),LL(0x4e8edd3f,0xd4812888),LL(0x89e1d001,0x2f4d1fa9),L_(0x00000173), LL(0x855b7b6b,0x0a629c27),LL(0xd6fdccbf,0x6bc14652),LL(0x5f32800f,0xd29c1358),LL(0x69e7f62a,0xf3a9fdce),LL(0x9418d0db,0xdaa9f4b6),LL(0xf492796f,0x525ae5fe),LL(0x32f4a27a,0xd91d1353),LL(0xcc1a7293,0xdc6b1bb1),L_(0x000000fa),
+ LL(0x4b410aaa,0xe776fe9e),LL(0xe46e8257,0xc90ea2e2),LL(0x285dece1,0x02e70a0d),LL(0xd2e4f07e,0x9e22652f),LL(0x7fb0667d,0x5325ca4b),LL(0xe36daaa9,0x04df1305),LL(0xeebe9d3d,0xfcd0755f),LL(0x570e3be0,0x4f74e603),L_(0x000001f7), LL(0xf1587145,0xb8a7ff33),LL(0x37b93b28,0x02791127),LL(0xa408dc4f,0x219fcf52),LL(0x7589c78d,0xbf0f03e3),LL(0x0bb10f8f,0x8d6cdb0c),LL(0xd517b4d7,0x99047428),LL(0x37e06b1f,0xa69f3aed),LL(0x98f8786b,0x8624d396),L_(0x00000150),
+ LL(0xf569dc20,0xa4ea5b5a),LL(0x734ae209,0x90fc2a73),LL(0x5823b56b,0x7673ea6e),LL(0x7dbb26e5,0xd6657bcd),LL(0xd1742aca,0xc34cd032),LL(0xe888df76,0x8065b09e),LL(0xa8dad269,0xc00f61b1),LL(0x3a07c5aa,0xd150d657),L_(0x00000038), LL(0x13c019ca,0xd0a14535),LL(0x608fa78a,0xfb7e5603),LL(0x1e082856,0x643ad480),LL(0x7bf543a7,0xf5b0db8f),LL(0xfadd24cd,0x7206f2c4),LL(0x1806c9ff,0x3a60a387),LL(0x0a68bae7,0x1164c0d4),LL(0x51de4b72,0xb512a4da),L_(0x00000076),
+ LL(0xfead3406,0x77314e66),LL(0xc35e0de9,0x4220d9f5),LL(0x86281b42,0x69b8f421),LL(0xe5f95c9d,0x5fd90a74),LL(0x9a89c707,0x8c09fc49),LL(0xe12f3480,0xa6764b64),LL(0x8c161166,0x886f3c36),LL(0x55f40cf1,0x68ad8aaa),L_(0x00000049), LL(0x36790bc9,0xf91f4bec),LL(0x489002d4,0xe8177d77),LL(0x1759ca38,0xe14e5a1f),LL(0xab2e759a,0x9005868d),LL(0xa02b4128,0xaa1dff8c),LL(0x2b9cd06e,0x12d6a4d8),LL(0x578741ea,0x641aef64),LL(0x1a343e8d,0xc6a85c8b),L_(0x000000d4),
+ LL(0x6d2e1752,0x4fe44c0c),LL(0x7a97ea09,0xec2c9500),LL(0x455f3253,0xa4bedbb4),LL(0x902e1815,0x27a1df89),LL(0xfb3e392c,0x120f8330),LL(0x583ac267,0x9a9698e2),LL(0xe8c87240,0x675c3030),LL(0x32adecb4,0x4f7fb620),L_(0x000000c6), LL(0x402fa549,0x56a1c202),LL(0xb86d1cd8,0xdab68ef9),LL(0xed63845f,0x1723eef9),LL(0x480f0cda,0x7a1853f8),LL(0xb146da6a,0x7337ff75),LL(0x4dd1db53,0xd3685d26),LL(0x41863100,0x9ea6ba31),LL(0xef5caeec,0xa06b6815),L_(0x000000e2),
+ LL(0x9a0b3f1b,0xfa7c3363),LL(0xf791b828,0x5836e010),LL(0x69b98b78,0xba2d3b6c),LL(0x504f9367,0xcea4290d),LL(0x5860835e,0xf3dd0621),LL(0x22ac6245,0x208bde66),LL(0xd8153e71,0xd2a1a552),LL(0xcd91cd77,0xc7df7c52),L_(0x000001eb), LL(0x68ac84ed,0x0bfe4e12),LL(0xfdf620f3,0xe9aa6d05),LL(0x78c9c26d,0x7d0e875e),LL(0x581fef3a,0x45acf57d),LL(0x4f2f3f1f,0x89769d1b),LL(0xb516d4fb,0x7161f8a2),LL(0xa50e2afa,0xa831731c),LL(0xa569ea98,0x69e2a679),L_(0x00000040),
+ LL(0x3662a23a,0xafc78e61),LL(0x4dc242cf,0xb32ad972),LL(0xbb40309f,0x790edca8),LL(0x89505a9a,0x3c060f5d),LL(0x112ba1c3,0x52485cd5),LL(0xc5bdc888,0x9feed1cd),LL(0x68110e28,0x49202782),LL(0x49d8d8e4,0x7cea44e5),L_(0x00000130), LL(0xf027ab8a,0x33e94828),LL(0x54f9b84f,0xdd82a038),LL(0xf69e1a64,0x9e8e50f3),LL(0xf1691b4d,0x13fe2932),LL(0x5ffe5329,0x032ff352),LL(0x51f4070a,0x9dcce305),LL(0xc3145c5b,0x62f1400d),LL(0xd89cb5eb,0xbef8bde9),L_(0x00000117),
+ LL(0xb69b37b8,0x37573b5a),LL(0x464e098a,0x2eac199e),LL(0x4b6ae9bd,0x41109e44),LL(0x96c7e839,0x638c7109),LL(0x99e6beb3,0xa5b03740),LL(0x0943a1c3,0x8490e0cd),LL(0xfab6ecb1,0x4e71bae8),LL(0xb69f0eb1,0x29f06246),L_(0x00000112), LL(0x5b8fa8ca,0x536e2d86),LL(0xa2a3d8ca,0xf4f50e4b),LL(0x4c428120,0xcb6eaa4c),LL(0xb4203e5b,0x69871129),LL(0x6da13d6c,0x218bdacf),LL(0x4f621f85,0x52046a31),LL(0x1ea900e8,0x3a13fa03),LL(0xc7d28019,0x167b70a8),L_(0x00000037),
+ LL(0x0575434b,0x2bdb447a),LL(0xae8792f8,0x63aef018),LL(0xae6cf0fd,0x3291cfc7),LL(0xe0ee5c02,0x3ae122af),LL(0x5bd690e7,0xff276537),LL(0xbc3516ac,0xf83b9879),LL(0xa4255fcc,0x05236d5e),LL(0x4ca14e35,0xaf60c6b5),L_(0x0000010d), LL(0x7d6c65fb,0xc17c08e7),LL(0x737de42a,0xac0df2a7),LL(0x520e48ce,0xaceb43b8),LL(0x2f791d6a,0x57fe87f0),LL(0x662b9dfe,0xc51cfa7c),LL(0x884ed1f4,0x75a9efdd),LL(0xb5ee76b0,0x3f9fe081),LL(0x61e43ed8,0xb9598115),L_(0x000001b1),
+ LL(0xaa029d13,0x82e47d41),LL(0x1c1e4e8c,0xf692383c),LL(0x819d110b,0x0caaa47b),LL(0xcb280e34,0xf6e315e8),LL(0x49f5a7e4,0x68659604),LL(0x6db3e3bf,0xc18d2a73),LL(0xb38233a8,0xab54c2d8),LL(0x216ab95c,0x670af6e7),L_(0x000001b4), LL(0x5df2f21c,0xf79cd8d1),LL(0x95f873cc,0x8946ec9e),LL(0xd4ae259b,0x352c8cec),LL(0x6383026a,0x4b6773b4),LL(0x574f14c8,0x7327edc3),LL(0x43f9e116,0xfc2d9802),LL(0x58a2e8d3,0x26360b9c),LL(0x2ae789b4,0xeac487c7),L_(0x0000004b),
+ LL(0x38176573,0xcfa66e36),LL(0xe576c7d6,0x40446421),LL(0x5a9fe083,0xa7e0a9d1),LL(0x43da69bc,0xcd5cfda4),LL(0xaca35d4c,0xdb98b2d8),LL(0xcc88e119,0x238da31d),LL(0xe775938e,0xd74d2fe0),LL(0x0e845777,0xee458b07),L_(0x00000086), LL(0xe869d146,0xfc21befe),LL(0x6f8ded71,0xf57aacc7),LL(0xa1f5602a,0x8a4a8706),LL(0xdf77dad6,0xe88d5556),LL(0xf0fb8eab,0x38891e24),LL(0x3a9313c2,0xd33f4e50),LL(0x4e334d02,0x267f4849),LL(0x45dbbeac,0x7b8b078d),L_(0x0000001d),
+ LL(0xa128f198,0x77a504d7),LL(0x706161d0,0x0d717bec),LL(0x8d3f449e,0xcd6aa437),LL(0x4c327553,0xbfa09758),LL(0xecfed023,0x131032e9),LL(0x4abfe666,0x2301de73),LL(0x972524c6,0xd67cd7b5),LL(0x1b68a20a,0xd8e4bd98),L_(0x000001d7), LL(0x75c85608,0xa0dd411d),LL(0x136bd0f9,0x8521a20a),LL(0xe9c06f6a,0x34117a07),LL(0xb1417701,0x625cc2c0),LL(0x534fecc6,0xe6f01c93),LL(0x698e9742,0xcea5bcd3),LL(0x43a9724a,0x54b554d5),LL(0x77820ced,0x7954cbcc),L_(0x0000005a),
+ LL(0x07759296,0xef4a4c48),LL(0x67e62639,0xef609727),LL(0x91ba0b01,0xc40bb739),LL(0x7f62ccbc,0xb7eda85e),LL(0xb14485bc,0x2a55f22b),LL(0xeab4bc94,0x091f3fde),LL(0xb13e2d7b,0x72b44ddf),LL(0xa6958062,0xd4d990ab),L_(0x000000af), LL(0x579003db,0x14ea0dda),LL(0xc0e83ba2,0x10cf6ee9),LL(0xc9f677ef,0x8e3eae8b),LL(0x1862146e,0xcfe0b037),LL(0xa6cdb8a8,0x6d8e5bd3),LL(0xf50d8419,0xdd3f0ea7),LL(0xf42ab2a9,0x8a6b5e3c),LL(0x12f65451,0xe62ff71b),L_(0x00000097),
+ LL(0xd1a8afb2,0x0460a7ae),LL(0x6526a7b4,0x80ab037a),LL(0xf752335e,0xf14c43bd),LL(0xd11a8f65,0x9b989eab),LL(0x23fa924f,0x0976a80f),LL(0xf16dad87,0x4e440171),LL(0x3baaac45,0xb9635c0d),LL(0xf0f34704,0x0e1ca863),L_(0x0000011b), LL(0x47c957ab,0x40fcc076),LL(0x420a4e5f,0x24cf57e8),LL(0xcec847e3,0x1f189869),LL(0xb20db2fe,0x27f88dee),LL(0x48712498,0x423c17a4),LL(0x284e6344,0xfe029568),LL(0x10b9bfa3,0xd426c180),LL(0x07626ee2,0x96cbf2d8),L_(0x000000c4),
+ LL(0xfdd27a3f,0x8a898f02),LL(0x37d5f07a,0x9e4691c0),LL(0xdc3f3126,0xb1ce0f65),LL(0x81c10b29,0x73e7fd11),LL(0xc595f2a8,0x5a3fd848),LL(0x47d0e340,0x439d759b),LL(0xbc668622,0x87538694),LL(0x461b9eba,0x3484697e),L_(0x0000013b), LL(0xbd5a6c1c,0x3d20296f),LL(0xf99ebce4,0x59fd2232),LL(0x51ac1eec,0x2fb986d6),LL(0xe71f9d4a,0xa5d1433c),LL(0xa289f5b9,0x4ece5225),LL(0xd51b9288,0x6ec5e037),LL(0xcce86717,0xb823e469),LL(0xac199283,0x45b78f23),L_(0x000000aa),
+ LL(0x16cc257b,0xbfa48e10),LL(0x08472093,0xc8ac9e7a),LL(0xb7492e4e,0x471d73ed),LL(0x53d1bd1c,0x243428ce),LL(0x40adeca7,0xb7d49d17),LL(0xd60077c0,0x7a95c66d),LL(0x737593cb,0xf237e1e5),LL(0x6a7c6f6e,0xa7929ff0),L_(0x00000060), LL(0x6c3da59f,0x894bcc2e),LL(0x7b3c416f,0xa493d3e8),LL(0x21231992,0x4c0a5993),LL(0xf376d082,0x0d5c6c61),LL(0x9e1550e6,0x2a3430f2),LL(0xf1d1beb9,0x11f95e81),LL(0x7b6bc5ab,0xa78bae02),LL(0x17858c60,0xbdd9ea90),L_(0x00000195),
+},
+/* digit=104 base_pwr=2^520 */
+{
+ LL(0xc0a103c0,0x0b8b69f6),LL(0xb96747cd,0x3f30c14c),LL(0x9e707ed2,0x029690c8),LL(0xd1292336,0x884265ce),LL(0x55cfec2b,0xc87e6275),LL(0xa097ab7d,0xa5558f62),LL(0xf635118e,0x23dda1ad),LL(0x5770b69e,0x1b70ffff),L_(0x0000011d), LL(0xe9851576,0x4f2606bc),LL(0x8c9c6bbd,0xccb92cf3),LL(0x58d1b308,0x2ce6913c),LL(0xbbdfb6fe,0x1967bfef),LL(0xe5cb515b,0x453132fc),LL(0x2527584e,0xc389b2f2),LL(0x2a1591df,0x0460d618),LL(0x602d5761,0x7498b0d1),L_(0x000001c5),
+ LL(0x59381757,0xb38cffee),LL(0xa135a61f,0x8ac17028),LL(0x2c9fe1a1,0x30418249),LL(0x3ecb968e,0x4c958b81),LL(0x6f834a0b,0x523285e8),LL(0x54df836f,0x29e4b05e),LL(0xf77b5fb2,0xe864d898),LL(0x48371505,0xcce3c32e),L_(0x000001b3), LL(0xce8bcd8c,0xc4a0e5e3),LL(0xfb74fd48,0x18996dc2),LL(0x875aaa20,0x5e9f86f5),LL(0x5eb82718,0x6642422b),LL(0x87431019,0xd6d6f0dd),LL(0x9d7e7982,0xcb46f571),LL(0x346044e6,0xa348c675),LL(0xdc02d250,0x517508af),L_(0x000001ec),
+ LL(0xa7a865fb,0x18145140),LL(0xded9f8c1,0xba498095),LL(0x40df2b19,0x3834dace),LL(0xa0c7dec0,0x3687e664),LL(0xfeee9a9e,0x09d971f2),LL(0xa032ee72,0x07148796),LL(0xa0b2cc31,0xb65bcec3),LL(0x46067d48,0xd8c2af65),L_(0x000001f5), LL(0xb094864d,0xd715c856),LL(0x79c821c5,0xbebe04f7),LL(0x62cf6310,0x3844c220),LL(0x89986c83,0x2644f899),LL(0x43935732,0xf80ac439),LL(0xfd741ec2,0x299a9f2d),LL(0x3022b589,0xbcf4790c),LL(0xf5663af1,0x767587f6),L_(0x00000046),
+ LL(0x67f89299,0xf1cdfa06),LL(0xda7b7826,0x97fea55e),LL(0xdd938459,0xc39699cc),LL(0x17d73f54,0x5971fbd4),LL(0x9f08e1d8,0x3631f804),LL(0x65a870ee,0x51a73b8e),LL(0xa3cdc8e3,0x54f69b2a),LL(0x85999014,0x59cbe0fe),L_(0x000000d6), LL(0x9c778792,0x085bfaeb),LL(0x17f6a7aa,0xe07f9788),LL(0x1e5f6c61,0xb271762a),LL(0xcc6a5dff,0x5d3e3cd3),LL(0x895eb0df,0x6eadd52e),LL(0x2cd665b4,0x92523b34),LL(0x93078c5b,0x2ebcff33),LL(0x48620212,0x777dd50c),L_(0x000001f4),
+ LL(0x57bfa90e,0xfe3fcdbd),LL(0x118dee98,0xcfc4ad1b),LL(0x0a524cec,0x6d1ffa5c),LL(0xe0d7420c,0x919d859d),LL(0x44af5553,0xf81fb745),LL(0x0981d6de,0xa17a7c3f),LL(0x6680c297,0xe0cc4fe7),LL(0xf6d22135,0xde36e57a),L_(0x00000115), LL(0xd78b0a1b,0x0b8ae03f),LL(0xac0c4195,0xc2638c06),LL(0xc994e2c7,0x4523ebb6),LL(0x49b75a94,0xdb72a765),LL(0x73310e2b,0x57a73d05),LL(0x8ce6d6b8,0x1e23ae4c),LL(0x4309eb9e,0x842f06ae),LL(0xf98aedc0,0xedf71264),L_(0x000000ed),
+ LL(0x7f81bbbd,0xbe47c62f),LL(0xd4c38f8c,0x49173568),LL(0x085a52c0,0x7d057b19),LL(0x612151d8,0x2de5c929),LL(0x8a4ea946,0xc4036de1),LL(0x0a8300dd,0x5a6e290b),LL(0x195518bc,0x894ed83e),LL(0x35e21097,0xd8dd898c),L_(0x00000074), LL(0x9a47676d,0xd0eee2e2),LL(0xc0b89ddf,0x8a7bf325),LL(0x0c5c995a,0xa5131a24),LL(0x9573e514,0xe5998b6e),LL(0x93979878,0x7ba59336),LL(0x7906f3c8,0xff513215),LL(0x093cead5,0xb76588a1),LL(0x243bc2e1,0x5abc03c8),L_(0x00000005),
+ LL(0x1074b7de,0x07c9d208),LL(0x234d2231,0x524b8b4b),LL(0xc6fe7d17,0x469a9182),LL(0x688b3e26,0x35461f18),LL(0xb0f49d1d,0x78f9ef1e),LL(0x4bb2130a,0xe72b7216),LL(0x9240661e,0xec1e4e46),LL(0x294674d4,0x95346b15),L_(0x000001f1), LL(0x2beae096,0xa594d4cd),LL(0xf533e3fe,0xdb75a21c),LL(0x99051c26,0xea1a808b),LL(0x9c10237a,0x230cfcd1),LL(0xe6396566,0x90aedfcf),LL(0x18cdd934,0x8c399655),LL(0x446502d8,0x0de6be10),LL(0x4a6de065,0x7b3640aa),L_(0x00000048),
+ LL(0x4f3b2020,0xf6315f2c),LL(0xf2e07c55,0x62ee6844),LL(0x9040fc8f,0xaf168881),LL(0xaec6bb02,0xa1922677),LL(0x968e4dee,0x53b90132),LL(0x92b21f9e,0x2b9cb75f),LL(0x4ae4c1d6,0x65408d1b),LL(0xd20f3732,0x70be8f94),L_(0x0000013d), LL(0xb2d1ac5c,0x05c00995),LL(0x4e16ae2b,0xf20b5acf),LL(0xd04ee882,0x1f8c5834),LL(0x35db5e06,0xc9dbfe41),LL(0x3a42f540,0x3f7b55b6),LL(0x500e266e,0x52ce3b47),LL(0xda6911e6,0x0c53d0a4),LL(0xee43c4db,0x6052a6d7),L_(0x00000194),
+ LL(0xfdcd47d9,0xf7f0245d),LL(0xc1b6e80d,0xd2bf51a5),LL(0x9077fd5b,0x4a61b710),LL(0x97dc422c,0x3089abb3),LL(0x2c00b155,0x893fa316),LL(0x40add702,0xb9d804ac),LL(0xc77985f1,0xdfaaf13d),LL(0x4150d1b3,0xaf9d85b4),L_(0x0000016c), LL(0x24cad038,0x92589d47),LL(0xd0dfdf3a,0x06f77875),LL(0x6b4012d5,0xfe067b9f),LL(0x4426c933,0x2ed7298d),LL(0x5353c502,0x67948217),LL(0x156d92c1,0xf0f675fa),LL(0xee2b368d,0xba020dd5),LL(0x3367f41b,0xd5aae0ea),L_(0x00000182),
+ LL(0xf394cccf,0x75917fbb),LL(0x1b52b513,0x87569974),LL(0xbeb1242f,0x4a568f34),LL(0xb03e5543,0x86a66b14),LL(0xc094f1b5,0x93edd5ae),LL(0x7da45bde,0x2fb2c47a),LL(0x960491e1,0x678ce19f),LL(0x890efc78,0xf4853187),L_(0x00000031), LL(0x7699808a,0x4363742f),LL(0xd3a570ac,0x1812091b),LL(0x4961aaea,0xd32e88d4),LL(0x97dd4a2f,0x1b33e755),LL(0xb3987552,0x79ed95a8),LL(0x669664b0,0x0837ce5b),LL(0x3584f341,0x3f9a0cc0),LL(0x116266b7,0x64a902cc),L_(0x000000e0),
+ LL(0x68c78f5b,0x0660e9a1),LL(0xb0698be3,0x5c045493),LL(0xc1ca94da,0x82b986b9),LL(0x4e8d0287,0xfafe7c0e),LL(0x02cfcf45,0x9235965c),LL(0xcf187fb8,0x316bebe3),LL(0x3fb90363,0xc42b951d),LL(0xc6248aec,0x26710295),L_(0x00000078), LL(0x5d4d89fa,0xc24f0956),LL(0xa11f38e2,0x398a2047),LL(0x9a0accc0,0x9e479268),LL(0x8ccafb17,0x468f61d6),LL(0x0c01f836,0x52f96c75),LL(0xeb043b98,0xacc6ee07),LL(0xa59405be,0xc63baaf6),LL(0xeddd33c9,0xba136442),L_(0x00000009),
+ LL(0x6e231385,0xc33b7b64),LL(0x1eb1f532,0x3bd3bca3),LL(0x3a7aee90,0x0882ad60),LL(0xad95f2eb,0xddaf31c3),LL(0x4c9d8e29,0x59c130df),LL(0xbdd1470a,0x7ac309bd),LL(0xe3bf394f,0xaafb8369),LL(0xedba4812,0x7f598209),L_(0x000000e8), LL(0x8bea28c8,0xb5d505d9),LL(0x81e772f9,0xfa065dfd),LL(0x15db5d5b,0x7e590809),LL(0x141e8679,0xc4ffd236),LL(0xf14602ff,0xbf521149),LL(0xcfd2b215,0xc500a7a4),LL(0xc04e3706,0xe4c06db1),LL(0x3e28ec80,0x93d40cbc),L_(0x00000009),
+ LL(0xb6cf9729,0x530c705b),LL(0x1a470405,0xe8292e38),LL(0x85b81d18,0xc5fdb2b2),LL(0x484b843b,0xa859e4fe),LL(0xeeae06f4,0x4e3895d5),LL(0x0a67c915,0xe6119b5b),LL(0xed968aa0,0x9264e00f),LL(0x66ed4c20,0xbf1d85ad),L_(0x00000091), LL(0x8c186038,0xd8a9d836),LL(0xee5d4b51,0xcf0b68ca),LL(0x89ad96c1,0xbcd75bca),LL(0xae1fa341,0x667fbe53),LL(0xa297bd27,0xe40caf5f),LL(0xd6165d4f,0x329b45f8),LL(0x62d6bced,0xc11413bc),LL(0xd1c11022,0x7e0d7384),L_(0x000000b1),
+ LL(0x422577fe,0xa39b851e),LL(0xa0188e61,0xf5e55bb8),LL(0xe96325dc,0x8cd5c092),LL(0x9087223b,0xe2c1a18b),LL(0xca56bfcd,0x548d8395),LL(0x4ae67f8d,0xaa6db861),LL(0x8f44b4e9,0x218ba5b9),LL(0x317abb0e,0x04386052),L_(0x000000d2), LL(0x27c1441a,0x91b2e14e),LL(0x6ac7c848,0x5377e2b3),LL(0xd40844b6,0x9d93badb),LL(0xe505b8cb,0x4d7f3493),LL(0x615a64c9,0x20a05d5d),LL(0x90a5eb78,0xa4cb086a),LL(0xed4783ac,0x36415b6c),LL(0xf10f3d20,0x56659094),L_(0x00000179),
+ LL(0x8da0847c,0x0eeb045d),LL(0xac240867,0x98145c00),LL(0xe7ce6952,0xb5d0c780),LL(0x315dd662,0x189fc413),LL(0x41646f48,0x4392d048),LL(0xc963ad1a,0x1e77199f),LL(0xebc649ee,0x83e1f918),LL(0xcd6ca624,0x13b6a99b),L_(0x00000169), LL(0xa873cec3,0x2108af54),LL(0x0b55c26f,0x3989bd71),LL(0xe0f27726,0x1e5e0053),LL(0x5c7e0958,0xa8452157),LL(0xf8e7b504,0xb64d38bf),LL(0xf180ac5c,0x8c8c65f5),LL(0x32a84a9b,0x8f00c232),LL(0x898ca7ed,0x1a1639de),L_(0x00000096),
+ LL(0x5f1724ec,0x6746f213),LL(0xe1073527,0xa966b0a8),LL(0x3ad14203,0x5bc4272f),LL(0x39620db2,0xbcd33a93),LL(0xe5eae695,0x26bac2fb),LL(0x0e4497dc,0xb7d647bd),LL(0x3a195407,0x7f7ed906),LL(0x899ce3f6,0xadd76129),L_(0x000000f3), LL(0xd7a2bdd5,0x333eb7cb),LL(0x51de1b18,0x8e185580),LL(0xa269b8e8,0x486cd055),LL(0x3555823a,0x6689b4be),LL(0xaa52baba,0xcd8d6ffd),LL(0xd072a45c,0x9cba9f57),LL(0xba53f86f,0x74a8d5fb),LL(0x16481f57,0x10747d58),L_(0x00000010),
+}
+};
+#else
+const __ALIGN64 P521_POINT_AFFINE ec_p521r1_precomputed[105][16] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0xb331a163,0x18e172de),LL(0x4dfcbf3f,0xe0c2b521),LL(0x6f19a459,0x93d17fd4),LL(0x947f0ee0,0x3bf7f3ac),LL(0xdd50a5af,0xb035a69e),LL(0x90fc1457,0x9c829fda),LL(0x214e3240,0xb311cada),LL(0xe6cf1f65,0x5b820274),L_(0x00000103), LL(0x28460e4a,0x3b4fe8b3),LL(0x20445f4a,0x43513961),LL(0xb09a9e38,0x809fd683),LL(0x2062a85c,0x4caf7a13),LL(0x164bf739,0x8b939f33),LL(0x340bd7de,0x24abcda2),LL(0xeccc7aa2,0xda163e8d),LL(0x022e452f,0x3c4d1de0),L_(0x000000b5),
+ LL(0x1e90cf08,0x99dd36bc),LL(0xb3fa1f1c,0xb26b07ec),LL(0xa0e797d1,0x1d1ae2d7),LL(0x83d50825,0x6d377aaa),LL(0x4bd9d902,0x82ebb4df),LL(0x1a96372a,0xcd8e6603),LL(0x3a3a0193,0x40a46141),LL(0x3417e594,0x1213bf3f),L_(0x000000c8), LL(0x813d2ee3,0x6b30fa0d),LL(0x7b8df1ab,0x4af6e07a),LL(0x7a757e5f,0xd4cd1924),LL(0xb5c9c9bf,0xef4f928f),LL(0xddd9f1bb,0x4c836216),LL(0xa05590d1,0x3e26d4bb),LL(0x5ae35a88,0x777769f8),LL(0x8053f9f6,0xfc36d933),L_(0x00000063),
+ LL(0xbee9cf4d,0x976f1bd6),LL(0x02d2c8ce,0x43161975),LL(0x0dd75a48,0x8b5acff1),LL(0x028ed35e,0x251d2419),LL(0xe8d69f8b,0x0896bd46),LL(0x5cf2d6bd,0x2d891ecd),LL(0x3cda9537,0x325acaca),LL(0xaeec8eb5,0x21ef148c),L_(0x00000092), LL(0x72cfa6c0,0x50f74360),LL(0x212fac46,0xde49d2c8),LL(0x867882e4,0x68ef61e3),LL(0xd816ad67,0x67c6e2ba),LL(0x761716ea,0x8fd1aae7),LL(0x8be97c55,0xd4154e81),LL(0x7978aabf,0x63655c0a),LL(0xeccbcfc3,0xbefd316e),L_(0x000001dc),
+ LL(0x798d6d77,0x09438c81),LL(0xf17de43a,0x2d8472d2),LL(0x3350ea81,0x4f83c578),LL(0xa8745c47,0x257f1e83),LL(0x56432cf1,0xaaa0e9e7),LL(0x7e0362ea,0x8e2ff9cd),LL(0x66e30e44,0xa43e4838),LL(0x61aa5a41,0x57156102),L_(0x000001b2), LL(0x86a0825b,0xfe1a3726),LL(0xecf10fa3,0x78234ce8),LL(0xf75dbfd7,0xa854adc2),LL(0xa029127b,0xf2a5d1c2),LL(0xf93cf941,0xf178cc83),LL(0x0dad731f,0x7b737197),LL(0xdb2a90d7,0xc7585a55),LL(0x5b39f00b,0x13093ce9),L_(0x000001c2),
+ LL(0x3c194afc,0x4b764798),LL(0x9c6ad5a8,0xf36c498b),LL(0xd194ebf0,0x5789bf3c),LL(0x11b8897f,0x36af180a),LL(0x721c1e06,0x5c78bbd6),LL(0x926781ed,0x7eda9f86),LL(0x5fbd2cb7,0xc8e02758),LL(0x639ede19,0x9493d219),L_(0x000001e2), LL(0x65d6f9bb,0xf46f5848),LL(0xfc0b9e61,0x92b9aa7b),LL(0xbce8f803,0x108e7aff),LL(0xba188aa0,0xe4839679),LL(0x43ddb44b,0xe4d01a38),LL(0x28f6ec0b,0x47439700),LL(0x488e6c7f,0x88a54089),LL(0x764515b9,0xeeb300eb),L_(0x0000018d),
+ LL(0x5cfb915a,0xf6fbc903),LL(0x5711b98d,0xab2bf9c0),LL(0x4617b374,0x11ca98df),LL(0xca70393d,0x0b0a9fb9),LL(0xa92fde65,0x56f25580),LL(0x79cc0a83,0x4bbfeb8e),LL(0xcab11e98,0x7ca24068),LL(0xa9977f9a,0x66dac90c),L_(0x000000eb), LL(0x8bf78095,0xbc2c6a27),LL(0x6f0f5666,0x5aae506d),LL(0x101ee3dc,0x26f13a79),LL(0x4efcb64c,0x872b3246),LL(0x4b655b96,0x93100d45),LL(0x47392054,0xb9ed2d40),LL(0x889555dd,0x82a371d8),LL(0x35716e93,0x866327ac),L_(0x000000d6),
+ LL(0x6a15b574,0xc4140b76),LL(0xcd00e756,0xa87ee130),LL(0xe237ca9f,0x986e71dd),LL(0x6c64d36f,0x855fe34c),LL(0x2ec61846,0x617b88a6),LL(0x14780c69,0x747aa419),LL(0x062f9170,0xed05839d),LL(0xa3775b2f,0xceadbfb1),L_(0x000000ec), LL(0x8d8f4b46,0xe4829292),LL(0x3dae35c5,0x952eef7e),LL(0x2fcf3b38,0xa2c8e70d),LL(0x15ca91d1,0x49e6f64f),LL(0x2ab5e879,0xc51365ef),LL(0x6eb8edec,0x68141278),LL(0x3c5ae2c1,0xbd1ceb42),LL(0x8868ec18,0xcdd55150),L_(0x000001be),
+ LL(0x340208b1,0x2a553c67),LL(0x02c37cf5,0xdad37a02),LL(0x0d5ab144,0x0de46bcf),LL(0xf845acc6,0xdc2bcfa4),LL(0xc7adff52,0x82fc1314),LL(0x0545c51d,0xc54d801f),LL(0x2dea714e,0xcb580871),LL(0x31541a41,0xdb180fb9),L_(0x00000007), LL(0x0e58cc64,0x788f8bc0),LL(0xa9c56b21,0xa004a389),LL(0x34cf9dd4,0xf832e2bc),LL(0x5ff85d06,0x552c88da),LL(0x78c4f4e0,0x30833bd4),LL(0xada841ef,0xf4f16038),LL(0xcd227c76,0xb73c429d),LL(0x10247ed5,0xaaa17e24),L_(0x0000008e),
+ LL(0x03d614e2,0x3cb3e5f1),LL(0x330fa2b1,0x5ec2e694),LL(0xc7a7a85d,0x6fb92d18),LL(0x1af9e2ab,0x9cb09a6d),LL(0x32ba14f0,0xa2dc635b),LL(0x4c962558,0x0dcc43a3),LL(0x44769a2a,0x8ab8ab6a),LL(0x13517adf,0xacf0f10c),L_(0x000000f1), LL(0x270a8b98,0x435cd695),LL(0x9a1d5075,0x74944407),LL(0x3eb9b615,0x67a55fec),LL(0x4207fab7,0xbab02bd6),LL(0x3706b4f2,0x131eeda2),LL(0xdb6412dd,0x2a770e75),LL(0xc7184453,0xbd13d749),LL(0xcf85aaaa,0x4d4576f9),L_(0x000000c6),
+ LL(0x90643ae3,0xd0279799),LL(0xcd43ff84,0x8f8d4740),LL(0xf9be1720,0xd4c21049),LL(0x94ced526,0xbc7e6131),LL(0x885163e0,0x588d6d44),LL(0xe1a54923,0xcd604d63),LL(0x66c80ec3,0xdb390f62),LL(0x0efe7f3d,0x5ed30f94),L_(0x00000191), LL(0xacfad765,0x4c09af63),LL(0x0b94aa5e,0x1cb9cfd5),LL(0xf7f9b44b,0xb1ee2bf5),LL(0x5da9b7b0,0xea26cc32),LL(0x695fa9a4,0xc53177b1),LL(0x05d4bfeb,0x0a2128d9),LL(0xb0617759,0xd86515d3),LL(0x4edd7559,0x248b0a5d),L_(0x0000015c),
+ LL(0xcd229d61,0x16ed066d),LL(0x81766070,0x27d264d4),LL(0x4280ae01,0x75f18c88),LL(0x0de8cd8d,0x999331ed),LL(0x2979ede2,0x2a794c8b),LL(0x4aa1f796,0xf6be0bc2),LL(0xe7f6aee3,0xab9da18a),LL(0xaa378d1c,0x2cfef6ff),L_(0x00000009), LL(0x0425becc,0xc9672464),LL(0xaeac43a7,0x71fa40cd),LL(0x9b6e5640,0x8c8a54a9),LL(0x559c4919,0x8745a152),LL(0x158de454,0xea705cdc),LL(0x49f6974a,0x31085e82),LL(0x149d6eab,0x3b82a7d9),LL(0xc24e8654,0xe5dd1094),L_(0x0000001f),
+ LL(0xc6703677,0xb8dfc216),LL(0x58bdf34a,0xae298494),LL(0x009bba63,0x4d30749c),LL(0x98a3bff7,0xbe1fdc0d),LL(0xd3227485,0xd2cb3b89),LL(0xdb083e7b,0xabcac22b),LL(0x0f40c3a0,0xba4e3fef),LL(0x2ef27d74,0x49fc110e),L_(0x00000076), LL(0xf850122d,0xd1940d8b),LL(0x363cf3d8,0x91127ad7),LL(0x184425d3,0x7ca8dcdb),LL(0xdb660853,0x21ec37e6),LL(0x4beb68c4,0x5fb50be0),LL(0xd22f2025,0xd5b8a4a6),LL(0x23b1ff32,0x81d34165),LL(0x7f1e70e8,0x352493e0),L_(0x000000ca),
+ LL(0xd39f8fa6,0x46997de6),LL(0xfc0c43c2,0x80559c77),LL(0x74a5f61d,0xf3cd5c47),LL(0xb51aa852,0x84701e4c),LL(0x3099622c,0x5f57adc3),LL(0x1c2776e9,0x66f0da61),LL(0x0d49fb9b,0x95a49243),LL(0xce6bc32e,0xc261cb56),L_(0x0000007c), LL(0xe4c23b96,0xfd811538),LL(0xfb948d00,0x57c88bf4),LL(0xe1b0ccf5,0x9a8e5fdd),LL(0x1f936fee,0xac1c5e3b),LL(0x9560deae,0xd72e0f10),LL(0xe34e3d33,0x1c36aa10),LL(0x04676a85,0x6d51f6ad),LL(0xd48d0c93,0xb6bc0ff6),L_(0x00000075),
+ LL(0xba61d6f1,0x16e9a196),LL(0xae964f34,0x5c0977df),LL(0x5533b3fb,0x25bde3a2),LL(0x16bcef9f,0x645c4b91),LL(0xccba7e03,0xd5f0598c),LL(0x17ea7d85,0x0a4a08b5),LL(0x68cac5a0,0x7d57c26f),LL(0xd4f0dc66,0x2a8d8db2),L_(0x000001ee), LL(0xa5172924,0xc293806a),LL(0x5f20b34f,0xa9d43e42),LL(0x06adb487,0xf8e899ee),LL(0x2608f44d,0xd8da79ac),LL(0xb1683bc0,0x4dc36bf6),LL(0x350423e7,0x15c728c1),LL(0xfdc23809,0x5dd5da5e),LL(0xe96b3148,0xbaed65ad),L_(0x0000011a),
+ LL(0xaa9adab6,0x9bde5c6d),LL(0x5ef4d7f1,0x4c0f1fc9),LL(0x8ecdc6cb,0x8e47e019),LL(0xff3c3ade,0x13ede807),LL(0x08dc8e67,0x996f8947),LL(0x296b4bda,0x185a0504),LL(0x07dc7de6,0xe2a36a18),LL(0xf820aac7,0x5e5c9232),L_(0x0000004d), LL(0x32ed1a36,0x4050a3aa),LL(0xecab1a1a,0x6622355e),LL(0xc9237ec8,0x11964b64),LL(0x4010a471,0x644ca385),LL(0x6abf4831,0x34cba42f),LL(0x5d25b108,0x54dd6906),LL(0xb1ef824b,0x9199f6df),LL(0xb53e7326,0x8ab89c8e),L_(0x00000113),
+ LL(0x17f45f44,0x47c0d420),LL(0x299d3628,0x4003ee6e),LL(0x6f86dfae,0xd3cc2b18),LL(0x5072cb2e,0xc430e500),LL(0x294a1ff8,0x69058c45),LL(0x9eeb197c,0x30c97e9f),LL(0x859543fb,0x13563a1d),LL(0x2eed4bed,0x544e4568),L_(0x0000006c), LL(0x5f1e8dcd,0x7c4de39d),LL(0x99a97139,0x69468c31),LL(0x294f1802,0xd64eccc4),LL(0xd505983a,0x9cc6daa3),LL(0x60e0c170,0x64a5b5c1),LL(0x8763e518,0x61dc006a),LL(0xb9099af2,0xc69e9f34),LL(0x0fe38a58,0x2c16bb80),L_(0x0000001e),
+},
+/* digit=1 base_pwr=2^5 */
+{
+ LL(0x4f59ae8d,0x5c3b72b5),LL(0xc123c8ad,0xae6b62e3),LL(0xca4e7ba3,0xeb5d2e8f),LL(0x7633eb4d,0xaee39acb),LL(0xeb750251,0x77dcf2f5),LL(0x1c6dd3f6,0x32a70340),LL(0x9a1f1f0b,0x7ca5d0ad),LL(0x4a21b83d,0x69051d23),L_(0x000000cb), LL(0x5511dec3,0x4c8a50ab),LL(0x1b4ae54d,0xb2d5cb0b),LL(0x6fe6cc64,0xe3f5079b),LL(0x5cdba6f0,0xdc0c66eb),LL(0xbef10266,0xe32e16eb),LL(0xb3e0ef80,0x5faff80c),LL(0x347fbdec,0xaff9f041),LL(0x088b1af3,0x68ca055c),L_(0x000001fa),
+ LL(0xa16ae6a8,0xc671907b),LL(0xa0da9ee1,0x014d027e),LL(0x0efad55c,0x0b01f380),LL(0xb9d3e016,0xe2f7ed1b),LL(0x938df5e9,0xe67c4396),LL(0xd65b0a5c,0xd40c305d),LL(0x533f5edd,0x01c97f61),LL(0x68a79ebe,0xe7088976),L_(0x000000be), LL(0xad9d235c,0x2c52fc6f),LL(0xea2d78b8,0xedd0329e),LL(0x21e0e0d2,0xf1d7cac0),LL(0x887a53dc,0xd0a846a5),LL(0xc5d60b2d,0x1b4f43d5),LL(0x0e8631dd,0x4597d8ee),LL(0x36cdd8e6,0xbe2bdcac),LL(0xb9d50810,0xc2474902),L_(0x00000075),
+ LL(0x571ccaa7,0xcc45066e),LL(0x3f9b1980,0x05f6f02b),LL(0x6757639e,0xe84f381f),LL(0x4e03775c,0x5ef348d1),LL(0x4770c353,0x3845ff7f),LL(0x5fb50c57,0xedbd5036),LL(0x5b16a317,0xe0ae9613),LL(0xbda8a1ca,0xab626b1c),L_(0x000000f2), LL(0x2efb5af8,0xce499e42),LL(0xdea5dcca,0xf85f9a34),LL(0x8fc76f8d,0x07899ffe),LL(0x0f62f621,0xbdb94b70),LL(0x648a20af,0xfe99ecf5),LL(0x436c353f,0xd5421253),LL(0x3fcac929,0xe3d53ffd),LL(0xa9413337,0xdbd78092),L_(0x00000158),
+ LL(0xf05f3504,0x72b9b7d4),LL(0xdabb5813,0x90711a09),LL(0xa79713f3,0x40b52fc0),LL(0xbea8efb8,0xb43b138e),LL(0xcba724a4,0x7bae703e),LL(0x96698925,0x5de16b6e),LL(0xd41e4b4c,0x80a9811f),LL(0xc1b18e03,0xf93f1c0f),L_(0x0000012c), LL(0x989bdb97,0x0964efd8),LL(0x725e184a,0x049a3954),LL(0x09871a1a,0x92325673),LL(0x462734e1,0x586e4cd6),LL(0x54d24ffa,0xe1d8d7ce),LL(0xb30da7d5,0x69f3efbc),LL(0x416e700f,0xef7de3d3),LL(0xe729987f,0x8354141e),L_(0x000000fa),
+ LL(0x08a54bd7,0x32ffe09a),LL(0x456c0723,0xd6fc852f),LL(0x40d62750,0x2ffa7f72),LL(0x4aeb61e4,0xe7b77ac3),LL(0x502b124f,0xfe47dfb6),LL(0x4dd6a90a,0x06cd1ac4),LL(0xa6600862,0x47e8bdf2),LL(0x9f7f4801,0x3d29e3f1),L_(0x0000009f), LL(0x0fde861b,0xc7487c32),LL(0x94ff60ca,0x23970cbd),LL(0x72b3e644,0x6984aedb),LL(0xcc2f8476,0x43e3b1aa),LL(0x4e288fca,0xd6b84507),LL(0x5c070a30,0xcde70c2f),LL(0x806889c8,0x9397e29b),LL(0x4c71559f,0x35a4b1e0),L_(0x0000000b),
+ LL(0x85707b44,0xfaa21460),LL(0xdf0df8fc,0x6496b635),LL(0xa66cdf1c,0x72a3871c),LL(0x9e220e51,0x55171f57),LL(0x76519fbf,0x2bc7ff1e),LL(0x1fe67c09,0x4f8bd386),LL(0x55ed0240,0xc5765e29),LL(0x1c77281d,0x27bc3df5),L_(0x00000160), LL(0x9e78f5c3,0x38d57586),LL(0x6a14b857,0xa24ce77d),LL(0x956a40cd,0x6eeb21f0),LL(0x384b0097,0x30d4fd92),LL(0x3f99bf29,0xce9aade0),LL(0x0b162be5,0xc168443c),LL(0x056730f0,0x8b3af3cd),LL(0x86e7a481,0x043e9d2a),L_(0x0000010a),
+ LL(0xd9b7e5ae,0xd2292194),LL(0xc11a98a6,0x0b648125),LL(0x59e37b44,0xaf635b08),LL(0x25aea6af,0x19039f0b),LL(0xd7528475,0xd304853b),LL(0x17b80f08,0x08f86bd4),LL(0x16cad388,0x4ba43b52),LL(0xd0f1e285,0x084ad45e),L_(0x000000b9), LL(0x7719f6ae,0x0e419d0c),LL(0x808c65ad,0x5ed42353),LL(0x2e40948b,0xc831c79b),LL(0x95dfdfbe,0x1f8615c2),LL(0x19810fc6,0xd5083188),LL(0xc73c4dd3,0x9df9fc10),LL(0xb9ee4c0f,0xb094cd65),LL(0x75870f78,0x4c55caa4),L_(0x0000009c),
+ LL(0x56757d02,0xc834df00),LL(0xc0d9c745,0xe5caf285),LL(0x91f23599,0x620faea3),LL(0x2d4e48a9,0xb7461523),LL(0x99bdc7a7,0xf47934e5),LL(0xd4dc2fd4,0x4f65ada3),LL(0x4c81e39c,0x3c079897),LL(0x64a2c57e,0x815ad610),L_(0x00000107), LL(0x3fa38d40,0x22a435ef),LL(0xc247d609,0xa826a53b),LL(0x3d8a1866,0xcede94d3),LL(0x75ac695c,0x2b9c71de),LL(0x8bcb2e7b,0xd52b9aa7),LL(0x1a8316e1,0x40f2da2b),LL(0xe2a07695,0x49881db4),LL(0x7e4c0ddd,0x39a09e21),L_(0x000001d5),
+ LL(0x7118ea7a,0xe663ce23),LL(0xd6a550c8,0x67612dfd),LL(0x45b8de7d,0xd0a752b6),LL(0x1b9bd789,0x60ad3301),LL(0x023b6c29,0xcc26ecce),LL(0xa078b41a,0x61239a1a),LL(0xee942cd7,0x6922505f),LL(0x5e08263e,0xe76fdb87),L_(0x00000029), LL(0x1108fef0,0xe9adb593),LL(0xe4610492,0x509096b8),LL(0x26279733,0x4c917c92),LL(0xc7a80802,0x7516cc5c),LL(0x8edbea9c,0x131d3769),LL(0x1db92a9d,0xe32f86b9),LL(0xc3bfb615,0x16237fcf),LL(0xdaad00e7,0xe0767305),L_(0x000001c0),
+ LL(0x726d1da3,0xd0f5eba7),LL(0x5afe82c9,0x00a2bafd),LL(0xa7f8f99a,0x8c282afe),LL(0x5344cf5a,0xa7ab3e18),LL(0xb4f699ab,0x2626fca8),LL(0x345363ae,0xc44f5f11),LL(0x9cac1c3a,0xa135f6b3),LL(0x2cc9c6d3,0x3b77c483),L_(0x000001e8), LL(0x90784ad0,0x4491c85e),LL(0xc87a8f35,0x23793bcb),LL(0x9606baed,0xcd6ee91d),LL(0xaa42a14a,0x54d429b3),LL(0x40a29e37,0x89ff244a),LL(0xd4a2c066,0x0bb505cb),LL(0xdc545060,0xfc93a903),LL(0xad7e26a4,0xc3b67c6e),L_(0x000001fe),
+ LL(0x8ceb07a2,0x96bcc3d3),LL(0x99d9281c,0x3db83972),LL(0x3ff2e9a3,0x16268498),LL(0x00d03fc3,0xf0d72767),LL(0x974db3bc,0x52e2c15d),LL(0xcfc51b17,0xe4156324),LL(0x10aa8cfe,0x989f0141),LL(0x8e68c302,0x9e3bb348),L_(0x00000058), LL(0xb1ff4858,0x798b01e9),LL(0xb7bcaeeb,0xb107b933),LL(0x0bdcd04d,0x5499a0b1),LL(0x26fd1d2e,0xacddcbd8),LL(0x56837ddc,0xa9081a22),LL(0x3bdf1491,0x05c3276e),LL(0xc07890c9,0x91891ac9),LL(0xa184d413,0x925157ab),L_(0x00000171),
+ LL(0x8bff7233,0x91b8350b),LL(0xf62b4383,0xb265f67b),LL(0xc46f7226,0x21d7036a),LL(0xef90907e,0x8034aa28),LL(0xdabc0434,0xd005b709),LL(0xb12cb388,0x06bb608b),LL(0xe65c7159,0xeb7b8a18),LL(0x11e0f987,0x7aab899b),L_(0x000001f6), LL(0x8d53586a,0x0ab2f2c0),LL(0xe3db9e6a,0x80aa8220),LL(0xb7b44599,0x2bea87eb),LL(0xa54e5ad3,0x6c5ac479),LL(0x93b927af,0x83fb3fac),LL(0x62a4775c,0x9c4bd501),LL(0x657b8d9a,0x88136dc2),LL(0x31811cf2,0x2b887e73),L_(0x00000185),
+ LL(0x4d4e2e15,0xa3ad1cf1),LL(0xf792f378,0x7aef7449),LL(0x4d833ce0,0x5394ba78),LL(0x06fcfedb,0xf33fd365),LL(0x76965949,0x9c4ccb42),LL(0x4e9fbd73,0x61aaa0a9),LL(0x9fa1995c,0x3ba114e8),LL(0x462ee846,0x7540468d),L_(0x000000cf), LL(0x0442839b,0x46e8546b),LL(0x4cfa345f,0x0d411f16),LL(0xc1e9119e,0xf8d99149),LL(0x0deb6f34,0xb98975e2),LL(0x6508c235,0x6e32684a),LL(0x741c5884,0x99583d46),LL(0xacaecb2f,0xd61998e0),LL(0xdc28ccee,0x1ef321fc),L_(0x000001db),
+ LL(0x22a3dc2c,0xbc8dbffe),LL(0xf713e616,0xbe6a57a2),LL(0xbe89cc5f,0x5dfb0ead),LL(0xb5bd5287,0x5dba909b),LL(0xff87fb08,0x124b1f29),LL(0xd39afe41,0x8ad8951f),LL(0x0e13a626,0x2f09f744),LL(0x4826695e,0x44419020),L_(0x00000036), LL(0x89f11d49,0xd8b689b1),LL(0x42cf8f40,0x8f4bb929),LL(0x1093f58a,0x41b6334a),LL(0x5f1b0229,0xcbfc9d3f),LL(0xfa09f9c8,0x4f838812),LL(0x4ae0b40b,0x114194e2),LL(0x6d9844d6,0x69722fe6),LL(0x15e4c6d7,0xb8f4264f),L_(0x000001cf),
+ LL(0x2f86d0f6,0xf27fea27),LL(0xb102e317,0xf76070d1),LL(0xb05afc5b,0x1c9d3a3b),LL(0x5dd0f5d9,0x00e4d9fc),LL(0xee4d6689,0x65f0f1c6),LL(0x2a86ba85,0xde562216),LL(0x3e6bfc0d,0xdbfc35a2),LL(0x9af0f242,0x5ad61eda),L_(0x00000142), LL(0x941bae5d,0x2b9df6f5),LL(0x5be1e379,0x818b63c5),LL(0x35a1da29,0x7c374ecf),LL(0x81936096,0x91cdc4c0),LL(0x32597a76,0x72e4e5df),LL(0x3e8a2fa3,0x5b7351e8),LL(0x916e7f8d,0x19372aca),LL(0xabd62e9d,0xe3d4016a),L_(0x0000015c),
+ LL(0xc98396a0,0x1d4dea3f),LL(0x2852471e,0xf1b1b604),LL(0x9e270a42,0xbff87527),LL(0xe46c1327,0xfe022231),LL(0xfc05c823,0xe4c1b07e),LL(0xa4581988,0x46e86dbf),LL(0xc3803e03,0xf3ea14d7),LL(0x8c2f4163,0x3536b269),L_(0x00000094), LL(0x474df73f,0x3f77cba0),LL(0x82f0ebae,0x9fac52f4),LL(0xeabe2a5c,0x4d046303),LL(0x5a86c777,0xd8716f60),LL(0x16157561,0x76cfe4cf),LL(0x564b6dae,0xf10528e0),LL(0x9113bb26,0x878d8ad6),LL(0x933ccc8b,0xc9676c2f),L_(0x00000038),
+},
+/* digit=2 base_pwr=2^10 */
+{
+ LL(0x7c6312ff,0xb394c36d),LL(0xd8c526b5,0xae9f8123),LL(0x6b7fb3e1,0x7287a461),LL(0x2d9f22f9,0xd21b31a9),LL(0x895d4a0f,0xd7cbfded),LL(0x81ff2d23,0x5c105748),LL(0xe830bd0b,0x4fe2bd04),LL(0x9dfeb777,0xdf56afd6),L_(0x000001fe), LL(0x83b243fc,0x7e7441cd),LL(0xa23e166b,0x5c91b009),LL(0x85f70865,0x122f85c7),LL(0x22e7768c,0x6db40321),LL(0x2fb75185,0xd6df94b8),LL(0x80b31836,0x98df3edc),LL(0xeea7ce80,0x05298e9a),LL(0x048ecb96,0x1e0476e6),L_(0x000001ed),
+ LL(0x8ec6fc14,0x292021e4),LL(0xa9680402,0x9500ecd0),LL(0xed719b16,0x41202339),LL(0xb81e8a19,0xb85440eb),LL(0xd40e8e4d,0x3f6a53c2),LL(0x84a12a31,0x2796c5c6),LL(0x497c0088,0x91636765),LL(0x751837b7,0x8b09820c),L_(0x0000014e), LL(0xd4740897,0xfeb6c7cf),LL(0x05fd0f39,0x66755043),LL(0x24da0165,0x915708d7),LL(0xcde5846c,0xc7bb1c3f),LL(0x0cbcc847,0x5d5c58a4),LL(0xd0093587,0x531dd999),LL(0x178ab52f,0x88ff3f98),LL(0x4485d318,0x35266a7c),L_(0x00000171),
+ LL(0x7f523b68,0x91acdac6),LL(0xe5501216,0x656f99d2),LL(0x9d6ec374,0xe158465f),LL(0xf67a8845,0x15ed0b99),LL(0x0ea75aec,0x01226fd6),LL(0xc000f5ba,0x0a951866),LL(0x2eb378e5,0x185feb1f),LL(0x746f4b9e,0xd7b2048c),L_(0x00000097), LL(0xae887bf0,0xc9deb828),LL(0x2d928546,0x4d8afcb8),LL(0x7759681c,0x47a77426),LL(0x1f2422bc,0x9941fb7f),LL(0xc9c44935,0x3b4f41a6),LL(0x50ea43ef,0x708dbefd),LL(0x5c9f2544,0xcef3425f),LL(0x8d085b3a,0x17fe443d),L_(0x00000114),
+ LL(0x4dbc092f,0xa2f27fd6),LL(0xfff03850,0x2ad51407),LL(0x2ffc14aa,0xc4b80840),LL(0xbe516b67,0x4499107f),LL(0x0f027098,0x715688b4),LL(0x5e2c9af3,0xbddce779),LL(0x26ec8f7d,0xcc8a5dc6),LL(0xcc9e1305,0x6a9d132a),L_(0x000001c4), LL(0xcd14a595,0xce664e13),LL(0x678ff921,0xb7485d5a),LL(0xed6fe685,0xdd61d65f),LL(0x2b7d0453,0xa066d915),LL(0x81e48dc7,0x0c3395f0),LL(0xc1cb1256,0x6053e587),LL(0x630f2cdd,0xc776afca),LL(0xf0d70553,0x61da1814),L_(0x000000dc),
+ LL(0x71ac09f5,0xd012b2e5),LL(0x9190907b,0xc03bb972),LL(0xab45bb80,0x8ed0d272),LL(0x3b41e8eb,0xaa3449d8),LL(0xd2d64ef1,0x4e6b21d4),LL(0x9f7e0342,0x9eb72363),LL(0xb6336622,0x69f35a65),LL(0x9114adb9,0x24fc697e),L_(0x000001f5), LL(0x18b88dd7,0x489c82e7),LL(0x1d050011,0x5e1bdb72),LL(0x80ac7d35,0x3a785f6c),LL(0x6bb1ceb8,0x4d0595c0),LL(0x47ba8e65,0xf29ab5dc),LL(0xfba4c7c5,0x768427d3),LL(0xf250f0c9,0x38fed5ff),LL(0x60390918,0x655b698f),L_(0x000000eb),
+ LL(0xd8129c74,0x33a20918),LL(0x56ec57a8,0x44da27b8),LL(0xfe03052c,0x5c69a6e2),LL(0xb8645b34,0x61e0489c),LL(0xedf7eb89,0x0d9cee51),LL(0xb459ccf4,0x4bbdc11a),LL(0x2e3c7f1a,0x22591a2d),LL(0xab74c4c7,0xa982d5f8),L_(0x00000083), LL(0xffdc8f5b,0x9755e96d),LL(0x00d903b0,0x73fc3336),LL(0xa3ed2567,0xa44f5c0a),LL(0x78da9c2e,0x130585a8),LL(0x5d2a5778,0xf488bddc),LL(0x203a9db6,0x0d642fb8),LL(0x49bb8671,0x86aadd4d),LL(0xc216425a,0x20f6b6a8),L_(0x0000012f),
+ LL(0x106b0907,0x6c59b6a4),LL(0x77bee1fa,0x082792c1),LL(0x39609b3e,0x4e300675),LL(0x9586b280,0x41820c34),LL(0xf4b318a9,0x568da4bf),LL(0x504b9f0d,0x18b54e1d),LL(0x7cd449b1,0xea63bc73),LL(0x35d4426b,0x9a0a15d7),L_(0x0000001e), LL(0x0b6fffaa,0x5b9ffa5e),LL(0xc584b1b6,0xb1ee386e),LL(0x00bfc921,0x2e48b6f0),LL(0xc1a25580,0x90b9e7af),LL(0x232ccaec,0x60d7386e),LL(0xbcde0a94,0x27832dfe),LL(0x20ca19ad,0xa34dad1d),LL(0x2a628682,0xad3601ca),L_(0x00000146),
+ LL(0x61a19c36,0x5540d3da),LL(0xde90b954,0xfed5fc9d),LL(0x08cbe546,0x6579be89),LL(0x931292ec,0x31c8bf2b),LL(0xde0b2215,0x64709233),LL(0xf0e33dcf,0xa91e2913),LL(0x99299206,0x933880d8),LL(0xab37b024,0x63ef0d07),L_(0x0000010d), LL(0x6eb1d587,0x5f29f3ee),LL(0x6f46862b,0x13755e24),LL(0xe2652ae3,0x952c2e51),LL(0xba6a65e2,0x013b9446),LL(0x3fd1b792,0x5e7bffb4),LL(0x96a14917,0x66af7dd8),LL(0x68a41011,0x553d0d5f),LL(0x4ff29cf9,0x381be3a3),L_(0x00000010),
+ LL(0x1d7e25bf,0x707d2643),LL(0xb62058b6,0x3eddf1f7),LL(0xcf147bf5,0x09f87dab),LL(0x11a1e31b,0x9b643ba2),LL(0x4287faad,0x31ecf4ec),LL(0xfdf5220a,0xa4f09336),LL(0x8916b869,0xd2c73095),LL(0xe07b7112,0xe676b1a5),L_(0x00000038), LL(0xea00c98e,0x31798ea9),LL(0xee9f1bb9,0xa0db3168),LL(0x33aa5ab3,0x5107a1fa),LL(0xbb110cf5,0xccdd22ec),LL(0xedd17aae,0x8bb0cd07),LL(0x610d689f,0xcf178778),LL(0xcca4e56f,0x95d696e3),LL(0xaef30431,0x5f284888),L_(0x0000008d),
+ LL(0x7352fa9e,0x4590e4bc),LL(0x951e01ab,0x42b51fb7),LL(0x3643ff6f,0x1a3be50c),LL(0xdad9a3a4,0x5c6479b6),LL(0xb0a91741,0x5f9d3ca9),LL(0x841c9d52,0xbed2f70d),LL(0xdc8331dc,0x3fce8436),LL(0x0a312707,0xf8c4ccb2),L_(0x000001e6), LL(0x4d9d7ef9,0xaec9953a),LL(0x62242fd1,0x04665dd7),LL(0x49b9eb5e,0x7d7f1a35),LL(0x6a03ee74,0xcabc639f),LL(0x22cc5c02,0xf26d2603),LL(0xbb312bf5,0x05ee7955),LL(0x10cf1634,0x00c226f0),LL(0x3baa95d6,0x49ecb4bc),L_(0x00000144),
+ LL(0x968950c6,0xa826a58f),LL(0xe858945d,0x3a7fc7e7),LL(0xd63d6714,0x63d3c677),LL(0xc319d1ba,0x349e7bde),LL(0xb4155a1d,0x03a4c66e),LL(0x3ddc0044,0x77aa278e),LL(0xccce8941,0xd867d113),LL(0x4e46021e,0x06424305),L_(0x000000ad), LL(0x6dd54385,0xd8308ab7),LL(0x2e1458d6,0x0d0a4aaf),LL(0x924e3bd4,0x309fb2fb),LL(0x2f7cd47f,0x5161e4da),LL(0xbc75672b,0x27fa09f8),LL(0x0e420bf8,0x6bf78336),LL(0x83d1b09e,0x3c3d3117),LL(0x89323d7e,0x585a4d97),L_(0x00000059),
+ LL(0xe8b9e5f2,0x9e4c557e),LL(0xa63316be,0xc510883d),LL(0xfba63955,0x58616eed),LL(0x5eba66cb,0x1f901bb5),LL(0x7d93dd07,0xe4c33f46),LL(0xd7520d11,0x9c2288bd),LL(0x3c9b7282,0xa3f22d4f),LL(0xf979cce9,0xbc4f2416),L_(0x000001cb), LL(0x69f91fa6,0x1780ab39),LL(0x9f2b3904,0x1e17f9e9),LL(0x0408a22e,0xf102825a),LL(0xe814b39a,0x4077db13),LL(0x717c70c1,0x116e8d04),LL(0x1642fd91,0x5157bba1),LL(0x072760c2,0x223d53fd),LL(0xf596860d,0x68119130),L_(0x000000d6),
+ LL(0xd03914a2,0x1f8fa1cb),LL(0xbc0f726e,0xc55472bc),LL(0x9dcf7393,0xcc596835),LL(0x86ab65ea,0x0c9b7622),LL(0x90362f16,0x8c0ca08c),LL(0xe8de2a3c,0xec48a671),LL(0xbde41568,0x0286ac32),LL(0xd27da64f,0xdc224c38),L_(0x00000016), LL(0xf6c82cd6,0x53a87083),LL(0x3e753ee6,0xab548bed),LL(0x07afab6b,0xc34ddb60),LL(0xc0dc2ddc,0x378f8e85),LL(0x399c4261,0x5087e698),LL(0x6f7e49f2,0x07f39938),LL(0x6345ae4d,0xc730c9c6),LL(0xb6c2765f,0xfb522df3),L_(0x0000014d),
+ LL(0xe4292c6d,0xf4cf1a41),LL(0xfb9a8b65,0xf774c321),LL(0x5046d341,0x7b28d6b2),LL(0xfe598075,0xb06becbe),LL(0xc3187f95,0xd220a206),LL(0xc278703d,0x54ba06d2),LL(0xb514e8c6,0xda1d824d),LL(0xc959300e,0xc32680df),L_(0x000000c4), LL(0x7fbd13f4,0xec877f9e),LL(0xd0e494f0,0x209c6b0a),LL(0x529b0f0c,0xc6b1073b),LL(0x50fb2f00,0xd17f2e67),LL(0x80cd82a4,0x62378ddb),LL(0x9f57c57d,0x0162b312),LL(0xc234e4cb,0x8483d5e6),LL(0x501d8ec9,0x5438453f),L_(0x00000176),
+ LL(0x0d037502,0xd53d7a18),LL(0x424ed14d,0xd13f986d),LL(0x29de6753,0x3e4dbff0),LL(0x6d33dc1f,0xf6b77dc2),LL(0x87ad5722,0xbf6050c2),LL(0xaea8f254,0x83742064),LL(0xb17406b4,0x7d90e061),LL(0x13b29245,0x6d00e002),L_(0x00000097), LL(0x7f20e8bb,0x5bf160f5),LL(0x8562b323,0x1d2d2e90),LL(0x4b31d400,0xea7b242c),LL(0x4a1acb5c,0x229d7510),LL(0xc93f9b92,0x3eba408b),LL(0xb068a0e7,0xb0525ab0),LL(0xb376d6b0,0xd96dff43),LL(0xf1b03f82,0x78a56db4),L_(0x00000168),
+ LL(0x77ddddf5,0x631d2365),LL(0xc4b6db39,0x5fc5e812),LL(0xd1cccab0,0xc38ec807),LL(0x8729f1a1,0x1629e92c),LL(0xc999e406,0x6b4c00d1),LL(0x781d88f5,0x3cac8f29),LL(0xcce3380c,0x16b02141),LL(0xc7e0e0cc,0xcb8c9920),L_(0x000001a3), LL(0x76234580,0xd02da7d0),LL(0xe2d27b0a,0xcc82cf5a),LL(0x3adad7f2,0x2c08a15c),LL(0x7009305d,0x55fa7b4d),LL(0xde9e632a,0x0b55b693),LL(0x2a821156,0xb565732e),LL(0x3788cf98,0x89f0adb6),LL(0x2d1f6054,0x0705738e),L_(0x000001b1),
+},
+/* digit=3 base_pwr=2^15 */
+{
+ LL(0xb0c6a7b6,0x23a29c73),LL(0x9c3eafc7,0x392643c3),LL(0xf81be3c4,0x88c0b213),LL(0xec734fa3,0x33b98ae3),LL(0x9b26d37a,0x23074268),LL(0x687a332e,0x28354ec1),LL(0x6935b64e,0xf60d4b7e),LL(0x9d55aecf,0x437bcba7),L_(0x000000b6), LL(0xd6073362,0x8bcd336b),LL(0x5b5f67fb,0xb6c7a784),LL(0x5633e845,0xdf601730),LL(0xa907be72,0x2814a576),LL(0xfe65734d,0xc7084b86),LL(0x0758f113,0xd7bad9f2),LL(0x5030c22c,0x3ef6af2a),LL(0x7ff1cabc,0x15f43164),L_(0x00000122),
+ LL(0x6184cce9,0xac65525f),LL(0x5051a406,0xc9acc4f2),LL(0x651c4a44,0xb637bdd2),LL(0x571fa6bd,0x2ae9ce59),LL(0x4cf1489d,0xf56bdf32),LL(0x61b0a821,0xe5fa827f),LL(0x9dcea620,0x4b46a244),LL(0x7027c9ed,0x6e4d3c94),L_(0x000001d6), LL(0x0495f1c5,0x27a410cd),LL(0xee6432c2,0xbc9ba135),LL(0x73536858,0x53142570),LL(0x7e39c350,0xd0616e0b),LL(0x316eeb65,0xa694a069),LL(0x55bbe949,0x9aba0dc4),LL(0x1f9d7b76,0x32d36d72),LL(0x1dcb7a1d,0x9a8a0a04),L_(0x0000001a),
+ LL(0x0fce6d79,0x49c3fb55),LL(0x3a2f9da5,0x3a8e9a7e),LL(0x44e158ff,0xd771a67e),LL(0x7de21bd3,0xa6180b0e),LL(0x5cf6b900,0x349f9cad),LL(0x53ff2b3f,0x783786f1),LL(0xe350b1ce,0xec23cb86),LL(0x58690faa,0xbca103ef),L_(0x0000009a), LL(0xe8902691,0x4d7ea0cd),LL(0xdfaca68b,0x13648702),LL(0x595a974f,0x5bd316f2),LL(0xbf226a22,0xbb11b239),LL(0xeaee978b,0x2ab1e433),LL(0xc7607b51,0x870c9a0f),LL(0x43795a95,0xe00a29c5),LL(0x53d7cad7,0xd68ee860),L_(0x00000013),
+ LL(0x9b30d330,0x8312448f),LL(0x499ca6a8,0x27c12fd1),LL(0xaf5a132e,0xc3fb765e),LL(0x01b2d2a5,0x07951a8d),LL(0xce3517c8,0x97c68ed6),LL(0xe67d936a,0x8cdd161c),LL(0xad5eb28f,0x795d9876),LL(0x6496ac4a,0x2bca3997),L_(0x000001f8), LL(0x7fd91252,0x6e4dff62),LL(0xe44601e6,0xa96a9194),LL(0x84a673b1,0xf81ccae8),LL(0x06054966,0x2eba8c5d),LL(0x53226945,0x77e70b53),LL(0x17deba76,0x98891e5c),LL(0x2fe55a92,0xccf9a70e),LL(0x8b39032d,0xcf81d4d4),L_(0x0000009b),
+ LL(0x2c87d9f4,0xce45ab56),LL(0x0de1dc21,0xa16d3789),LL(0x72ace7c2,0xe08192c8),LL(0xe7012d3c,0x4840d465),LL(0x2d9fcc09,0xd2d9e7c8),LL(0xb83abe6f,0x4dc89aa4),LL(0x57f505dd,0x58ef6f90),LL(0xc12ca416,0x3b0f2ce4),L_(0x00000096), LL(0x9e8dd733,0x4f047388),LL(0x1231cdd3,0x536cd1c8),LL(0x45523810,0xd1e5a85f),LL(0x4bcff7cb,0x3fceb99e),LL(0x86ad3d2f,0x00ae1467),LL(0xddf93ca7,0xab6574df),LL(0x4160edd9,0x611238b6),LL(0x0bbbbc9e,0xc6a872eb),L_(0x00000014),
+ LL(0x4b9dc9a7,0x4e86b3f7),LL(0xd56a4df5,0xb7fc672c),LL(0xc91daa4c,0x047ac313),LL(0xd8b04fac,0x71df8b53),LL(0xd047ffb7,0x48cf7c44),LL(0xe196a8ad,0xbf663542),LL(0xea4fed68,0x45aa68b0),LL(0xdbd49e0b,0x9fea1483),L_(0x0000005e), LL(0xd77d603e,0x33664de2),LL(0x5ef7dee2,0x994f9685),LL(0xc8ab10b1,0x5e3c5bf8),LL(0xf5ab3d23,0xff2ae5c2),LL(0xdbff37af,0x9d0fd0f4),LL(0x50db50de,0xa6d91d52),LL(0xe2c950fc,0xa742da0b),LL(0x0ec3836f,0x3cb961c7),L_(0x00000071),
+ LL(0xea3797f2,0x00f8c37d),LL(0x0b3e1166,0xce0936fa),LL(0xb532c55c,0x204a444f),LL(0xeef2ac73,0xa6b09c79),LL(0x31515d9e,0xac9e3e09),LL(0xdd05ab36,0xe9cef435),LL(0x319eb710,0xfa2d9fd3),LL(0x1d7ac545,0x6af2d4bc),L_(0x00000199), LL(0x595b4001,0x2f76c04a),LL(0x0f70018c,0x74e5849f),LL(0xa9c62272,0xb2abd908),LL(0xaecd915f,0x5ffbaabb),LL(0x9fa73bfe,0x111c8c5f),LL(0x35b0554e,0x77c9c2a7),LL(0xcc8177e6,0xe83b44a5),LL(0x3bc6ae04,0x18cd6dec),L_(0x000000b1),
+ LL(0x229b222a,0xb1bb114a),LL(0xff59f733,0x887f6c13),LL(0x2679cded,0xbbad5dfb),LL(0xd35dec8b,0xea94d41f),LL(0x90930770,0xd4f0a601),LL(0x2ad07da8,0x2142901c),LL(0x48f142ed,0x692aaa86),LL(0x252e4559,0x82af1f42),L_(0x000000a7), LL(0x9b4f335e,0x78c42f0d),LL(0xc2716105,0xfda89975),LL(0x2c49b195,0x35776137),LL(0x3ac76051,0x4de0d058),LL(0xfcd0c4d5,0x47ffa549),LL(0xe11bc35f,0x31f21817),LL(0x3f57a567,0x46ac2b10),LL(0xcde0cd71,0xa72a1284),L_(0x0000008e),
+ LL(0xaecaf4a5,0xcd468ef8),LL(0x60b977fb,0xbcb8a438),LL(0x3938f4bc,0xcfcf5c2b),LL(0x2c7337c9,0x7bb844f3),LL(0x23c47750,0xdea5e248),LL(0xf126971b,0x47ee8dea),LL(0x6f1d664c,0xd5392932),LL(0x3efa21b6,0x9886378b),L_(0x00000075), LL(0x5940abfb,0x28ef7f36),LL(0x3e9bee76,0x8f415722),LL(0x360759cd,0x11a30e1c),LL(0x3c8733e8,0x78196a73),LL(0xc43394c7,0xf3a60c7e),LL(0xac3864e9,0x776e1d00),LL(0x0c19158c,0x2e4681b7),LL(0x517321cc,0x2a4a5040),L_(0x0000007c),
+ LL(0x69bb2a3b,0x59d22ba1),LL(0x18bc1523,0xee4d727c),LL(0xbabfd9ca,0x4c8338aa),LL(0xe3550512,0xa9cc3cca),LL(0xe599b6e8,0x15386807),LL(0xc5ab3c64,0x3919da2f),LL(0xd2ee43d4,0x801a4c6f),LL(0x38ead934,0x40a087be),L_(0x00000197), LL(0x8b8c66b5,0x7834d44e),LL(0x74807217,0x690ef307),LL(0x926feb1c,0x54c7151d),LL(0xbe2f1f34,0x456bd03f),LL(0xc48ce8e6,0x04a6964d),LL(0xafec270c,0xe8febbc7),LL(0x483b3a5f,0xd30f159a),LL(0x96cb139a,0x52fa9aca),L_(0x000000c9),
+ LL(0x0e87f867,0xf99ad667),LL(0x75faf57c,0x011dcb9c),LL(0x6c05cb53,0x4f1f75a2),LL(0x3556cade,0x2dea9ad0),LL(0x3f87760d,0xb590f7b4),LL(0xe73b9512,0xc497a74f),LL(0x5a5a684b,0x8d18f07d),LL(0x8e2fa89c,0xbe126a50),L_(0x000000ef), LL(0xc3adce30,0x12408706),LL(0x4d73c59c,0xcce1c5bc),LL(0x2ddcd22c,0x381eb1ab),LL(0x0b77c42b,0x43827dd9),LL(0xaee2e20f,0x0ecadad8),LL(0x4d7ed6ba,0x141b0bef),LL(0x69fa3aa0,0x9ae275eb),LL(0x3d138706,0x2d98b314),L_(0x0000016a),
+ LL(0x7fc0e976,0x65d7b1d3),LL(0xc8c06baa,0x608a4b87),LL(0x2e527b8c,0xa2d8c259),LL(0xcc19bb3a,0xb09308aa),LL(0x4ce5b0ad,0x2458761d),LL(0x7a6ee0f4,0xd73d4f70),LL(0xd791c442,0x0d3867f8),LL(0x3ba7a1a6,0x14027c94),L_(0x0000007b), LL(0x0e7ffca3,0x467af3d9),LL(0x60c44d23,0x9427b9fa),LL(0xe4a16358,0xaff54ce0),LL(0x55e4129a,0x275c2816),LL(0xcbefd5ea,0x7c03c7fc),LL(0xb7160ce2,0xc97ca421),LL(0x84bb35f0,0xea69ee6f),LL(0x35e0436e,0x360ec7ec),L_(0x000001ca),
+ LL(0xf585af17,0xbac45c7f),LL(0xf7251745,0xd6aa93a1),LL(0x8a56414c,0x8fa35248),LL(0xf6e64410,0x1720b12e),LL(0x81f59ca8,0x6cb0f80a),LL(0x232a9916,0x205cfe62),LL(0x872efe0b,0xdcba9616),LL(0xa3d26e5c,0x2c5a0421),L_(0x000001fc), LL(0x06a36051,0x478ec567),LL(0x7d42157a,0xa110b6a7),LL(0x0c863ff6,0xb1e77441),LL(0xa6979407,0x7c13c78a),LL(0x6a0ad3b6,0x08c47fd0),LL(0x34e0edd0,0xcd2ed5cb),LL(0x8df0c73d,0x41a8e1a2),LL(0x73883967,0x85e0312e),L_(0x00000135),
+ LL(0x7d33b8c9,0xa6572311),LL(0x3fceee3a,0x1482e2ca),LL(0x52560262,0x6d96dfdb),LL(0xa105a9eb,0xbdc41e36),LL(0x8c0fd8b7,0xa2f2edd5),LL(0xb271c58b,0x050043d8),LL(0x4a51907c,0xa79966a3),LL(0x0fa52e13,0x60842aee),L_(0x00000128), LL(0xdac2d706,0x62accbe2),LL(0x0b78e0d4,0x8397028d),LL(0x2c9d107f,0x711b525e),LL(0xfedd5666,0x0c96203d),LL(0x88395725,0x2be09463),LL(0xf9856d0f,0x6dd96c8f),LL(0x9c7a6702,0x4398fe82),LL(0xfc430b6d,0xbf922dac),L_(0x000000da),
+ LL(0xaa02764f,0x7d06225f),LL(0x36596aaf,0x23dab345),LL(0x0047b230,0x1f940005),LL(0x1c2f1ccf,0xb4fb0f0c),LL(0x82a82a8c,0x589309ef),LL(0xc66190cb,0x19fbd0a3),LL(0x839f41c1,0x0fe2846b),LL(0xcc1c9536,0xeb188d9c),L_(0x00000082), LL(0x729f81c7,0x27782d0b),LL(0x55359881,0x76e1016b),LL(0xcaad48a7,0x26d82543),LL(0xc89767f1,0xcf1f4470),LL(0xd4acb529,0xe5b4bfed),LL(0x7b75fd29,0xae8ee068),LL(0xc3d34db9,0x3b3ffbcb),LL(0x9c535467,0xf84d77d7),L_(0x00000122),
+ LL(0x9faba8ba,0x5f421abd),LL(0xe82276fc,0x94ac402c),LL(0x91f2efc8,0x7d55bead),LL(0x8241f32e,0xcc1090d2),LL(0xe8bce170,0x19f59df3),LL(0xe27350cb,0x4ac35c2d),LL(0x3e6cfc43,0xd13cf90c),LL(0x84bc2847,0xe00912a7),L_(0x000001c7), LL(0xfd3f87f7,0x2713cbe9),LL(0x4fd8d338,0x34163c33),LL(0x46cada61,0x7214cbe3),LL(0x6aa94a54,0x30a042dd),LL(0xf7b92358,0xe120acf2),LL(0x09be500b,0x30c3e8d0),LL(0x51dc7f0d,0x6f225e27),LL(0xb7edd06e,0xe3546714),L_(0x000000a9),
+},
+/* digit=4 base_pwr=2^20 */
+{
+ LL(0x20c1256f,0x2fd11810),LL(0x5aa78701,0xc4a46931),LL(0xea26a86c,0x056b1163),LL(0xbe00b905,0xa0ac68e4),LL(0x52f1dad4,0xc19c5769),LL(0xc6fde2d8,0xbbc11dae),LL(0x6293f810,0x3a3baf9c),LL(0x5056fba0,0xfa278d37),L_(0x000001c8), LL(0x5973f08b,0x4cc716b5),LL(0x8efce6c1,0xb5b613b1),LL(0x64d3ad94,0x248f005d),LL(0xba83b800,0xa375eb34),LL(0xc9ee4cf2,0x413af2a4),LL(0x68a27d29,0x25ea8722),LL(0x8d12fde5,0xc9c082bd),LL(0x2d233189,0x935ee6fa),L_(0x0000017f),
+ LL(0x85f1bef2,0xa73fb5cd),LL(0x111a8c9c,0x1a80d76a),LL(0x8d3b7461,0x2e325f88),LL(0x7765b87f,0xc8ad9e3f),LL(0x92e36012,0x2c7cf6c4),LL(0xbf5a9dc4,0x7d5db366),LL(0x6228a81d,0x915359f9),LL(0x725123cd,0x62477772),L_(0x00000183), LL(0x8b6c7a0e,0xa38cc5da),LL(0xee14f97f,0xb43bb38e),LL(0x770c4afd,0xaa0f15c0),LL(0x138850f3,0x3953b993),LL(0x2658cf7e,0xb70f0779),LL(0x1d447c8b,0xd78fd38c),LL(0x681177a0,0x8e23ebe4),LL(0x704ca751,0xf974bc9d),L_(0x00000059),
+ LL(0xba8fa7e4,0x4e9fda74),LL(0x334944db,0x404855f4),LL(0x65201753,0x31df130f),LL(0x19a9846d,0x661cb9d7),LL(0xbc651ab9,0xc04c2995),LL(0x91c2b653,0x1b2c3fb5),LL(0x1b65fb33,0xc90b91d2),LL(0x9233b624,0xf53a7c1f),L_(0x000000a4), LL(0xfceac108,0x86d9cc5a),LL(0x4cdd0a2e,0x0e2ec8f9),LL(0x309b7d38,0xf2c40675),LL(0x0d2223f6,0xc1e34e32),LL(0xa3be480d,0xb364f62b),LL(0xec527b72,0x3595753d),LL(0xf6639f06,0x4e283d90),LL(0x67ed0c35,0x3f3d71d5),L_(0x0000000c),
+ LL(0x5667e2e3,0x2b33e937),LL(0x711cfb9d,0x5cc9c7d0),LL(0xedf0adb9,0xc5aaa7c2),LL(0x610b704f,0x770150b6),LL(0x1107368e,0xf9af2a47),LL(0x06e6cc4e,0xfe1e566d),LL(0x814dd0ca,0x7ca67146),LL(0x6c67f663,0xf0648fd3),L_(0x000001a8), LL(0xecb744b3,0xd960d19d),LL(0xc0bcfa2a,0x99ff41db),LL(0x933b28a6,0xb97977ca),LL(0x951faf63,0xca3752a7),LL(0x15168f23,0x01e0f16b),LL(0x4ea397d9,0x05f55f96),LL(0x3b374a51,0x813c0d40),LL(0xe408ed3a,0x4d48dd43),L_(0x00000079),
+ LL(0x937586c5,0x83c230d0),LL(0x61062265,0x9c8f1eaf),LL(0x10419f67,0x2c698769),LL(0x8d67dbad,0x4407836e),LL(0x4c3c184d,0x99fd2f81),LL(0x52a37538,0x7825fefa),LL(0x45a721e3,0xfff07585),LL(0xa4b823d5,0xabf0c498),L_(0x00000014), LL(0x96e376eb,0x6a23fbe4),LL(0x5f76504d,0xb69ec350),LL(0x545afc26,0xfb28fe6b),LL(0x87ed2073,0xaf95f20e),LL(0xa6145047,0x4d27cd1b),LL(0xc4cc53f8,0xa35d865d),LL(0x9ee96b7f,0xb07b711a),LL(0x430aefde,0xda4b08ec),L_(0x000001a9),
+ LL(0xc7354ba1,0x9fdb88ca),LL(0xdc64a8c7,0x9f85e2ef),LL(0x7f3a69d0,0x5631012d),LL(0xd2bed232,0xfd4d1f17),LL(0x04dfd89c,0xe64d46be),LL(0xd5598288,0x9f8bf20f),LL(0x1f269d18,0xc11d0864),LL(0x333e29ff,0x28d5f9fc),L_(0x000000d2), LL(0x9cc7dab1,0xbbef8e94),LL(0x5c714223,0x7f10fed7),LL(0xbb61d266,0x09c647b0),LL(0xe823dbf3,0xf58db2b8),LL(0x4601c5a1,0x3a71fa3e),LL(0x344f9c02,0x0b5cbdd6),LL(0x77b11f1a,0xf8df6a65),LL(0x6eb12db5,0x640b327e),L_(0x00000170),
+ LL(0x0db94e9f,0x9c4cc346),LL(0x646b9dff,0x339e03c0),LL(0x7ae26f18,0x64dca76c),LL(0x2ba1712f,0x2c804061),LL(0x16950e5f,0xb5bf0fae),LL(0x13d1569e,0x185858b6),LL(0x5b35ba86,0x6880b124),LL(0x3c937406,0xc9854d9a),L_(0x00000058), LL(0xee5f1c44,0x96f83044),LL(0x10924610,0xe69176fe),LL(0x5cfb2614,0x324a7887),LL(0x825516a8,0xfbad9007),LL(0xc065d69c,0x3d71727b),LL(0x06621f87,0x85c81c53),LL(0xe21856f1,0x3ac1471a),LL(0x68582e4e,0x92c8d47e),L_(0x000001c3),
+ LL(0x9ace1c67,0x5469124c),LL(0x24f3ddfa,0xccd6db20),LL(0xaadd52b4,0x74a2fc6f),LL(0x24af0765,0x17b27151),LL(0xb5105915,0x118a106b),LL(0x7e240081,0xcffda2d6),LL(0xc6925ec7,0x88b3b39f),LL(0x37b374e2,0x1e0f8120),L_(0x0000016d), LL(0xefd91b81,0x3a683e17),LL(0xa72b7c41,0x952a60ed),LL(0x0495c130,0x9c4b61d8),LL(0xbf06a574,0x872c4bf6),LL(0x0c7cbd39,0xe01cb7ce),LL(0x989f1a82,0x726d7547),LL(0x44906b41,0x52742de9),LL(0x2e02ff37,0x3d8a309f),L_(0x000000a8),
+ LL(0x8dd4b66d,0x73240fb0),LL(0xb6e39bb1,0x1303b771),LL(0x195468c6,0x7bd7b8e4),LL(0x9c3d4d09,0xa8684e6d),LL(0x724f9017,0x31c9bec6),LL(0x2fd691e3,0x727ff44a),LL(0x5f3d4db7,0x89060924),LL(0x984ffa88,0xbadb47b0),L_(0x000001dd), LL(0x0c1bfdeb,0x6d85f7e8),LL(0x4b0cbc59,0xccccc632),LL(0xe1faf1ce,0xc7a0620b),LL(0xf6e95c18,0x0aa71a3a),LL(0x8fa50a9c,0x49a07249),LL(0x8cf3e64b,0xaed36f6a),LL(0x94bd6377,0xa4cf33ed),LL(0xeb0073d7,0x331d113f),L_(0x0000019f),
+ LL(0x87c3614b,0x53d1d5ef),LL(0xaa78183f,0x8ea4ef11),LL(0x5c12de26,0x84a5c0b0),LL(0x3315c75e,0x4f1d31e4),LL(0x0d7a1bdb,0x97ef83ed),LL(0x8d2ce325,0x91dd29d3),LL(0x3340be93,0x184b8ada),LL(0x0f8f6087,0x8ea5afc1),L_(0x0000015b), LL(0x8ce9dccb,0x96d5b0b9),LL(0x641d29f6,0xb48f1d66),LL(0x50813cfd,0x8881842c),LL(0x7ff13a32,0x3fa7e856),LL(0x78eaa08d,0x7984e336),LL(0xfbc798ef,0x67c2e064),LL(0xb3fc5a0a,0x23e92b2d),LL(0xe38a9115,0x5b238a08),L_(0x0000013f),
+ LL(0x3691b2b4,0x9b215aee),LL(0x5cf3f209,0xa1d61cff),LL(0x4a0f639e,0x2783ba69),LL(0x62cddd5b,0x1490682d),LL(0x5648b7c2,0x074ffd3c),LL(0xeb8c7a90,0x0e9bddbd),LL(0xf3751b7e,0xbce879c7),LL(0xa3bfa1d5,0xb7fba2d9),L_(0x0000016c), LL(0x20a30aeb,0xe42922b6),LL(0x3498a06c,0xa129b145),LL(0x26cc79e5,0x9d307ed3),LL(0x1c156f64,0x2baf6215),LL(0x14f481b2,0x9b79cac0),LL(0x2eb38c02,0xc564e629),LL(0xde0cf55a,0x24a1582a),LL(0xad5a0f7d,0x0a21a7d5),L_(0x0000011a),
+ LL(0xa68ccc39,0x6997bdf9),LL(0x05de1b77,0x553e670c),LL(0xee7e6f6d,0xadae5917),LL(0x199db8cd,0xecf2088a),LL(0xc33572de,0xa41c0fa0),LL(0x7b432d00,0x1dc922e3),LL(0xc58b8529,0xb5615888),LL(0xb9f1df40,0x310ba77e),L_(0x000001d5), LL(0xe11804a4,0x9626517b),LL(0xb50d5ff0,0x34399d8f),LL(0xeb302429,0x18d0e9c5),LL(0x47c13487,0x18ec316e),LL(0x851d2afc,0x1b701f2c),LL(0x167d9f22,0x883a9116),LL(0xa8f932f6,0xc3a9d8fd),LL(0x0da0e796,0xa92d4102),L_(0x00000116),
+ LL(0x029cd0ab,0x5d899070),LL(0xb5278a7b,0xe7ecc032),LL(0xabde08a8,0x9fa79438),LL(0xd3d2c019,0x80363047),LL(0x66ae4725,0x141bc210),LL(0xeab542c4,0xdf1d8696),LL(0xd1c060a0,0x3908c1f0),LL(0xfa788627,0x34d35bd3),L_(0x000001a3), LL(0x677d387d,0x76fb5476),LL(0x05f7c0d8,0x3a298203),LL(0x2097dc46,0xe5119f75),LL(0x1f8bd7b9,0x5996aa0e),LL(0x61982b25,0x92c77df7),LL(0x119a9371,0xac8b008e),LL(0x7f9b0675,0x346bbe9d),LL(0x8f2407d2,0xffdfc237),L_(0x00000063),
+ LL(0xab5b8457,0x52f7bee1),LL(0xbc2db536,0x07aae0d0),LL(0x58623dce,0xa3e03da9),LL(0xf444f5c3,0xe7b9b75d),LL(0xdb04bbba,0x8fa837de),LL(0xb065c230,0xed346416),LL(0x51909adb,0x16d6222a),LL(0x3c084209,0x7ace49f1),L_(0x000000d1), LL(0xdf2f5e19,0xbbb390fd),LL(0x38ba1ac8,0xc03099bd),LL(0xa1e828bc,0x6f1d5124),LL(0xb83c59a2,0xfd863005),LL(0xc17a0d0d,0x97857c15),LL(0x2d92fc6c,0xd53a6942),LL(0xb70e5498,0x36d4d6e3),LL(0x368524fa,0x19450987),L_(0x000001c5),
+ LL(0xc5143f3d,0xcda50c31),LL(0x34bd47c0,0x5f0ed71c),LL(0x1dee87b7,0x24882cc9),LL(0x7e3bbffb,0xd1c7d1fb),LL(0x1e403329,0x92474fcc),LL(0x53d4ee41,0xbcade2fb),LL(0xbd25257b,0x48035309),LL(0x1ff4afd1,0xa15dc4f3),L_(0x00000163), LL(0xf76b6465,0x54f67634),LL(0x6c3176f4,0x76970368),LL(0x7bbaa2a0,0xe3ebf308),LL(0xc5082d82,0x65ccfb3f),LL(0xec84bb5f,0xf3b5795a),LL(0x4999273e,0xa51dd238),LL(0x7a764cec,0xe6317658),LL(0xd0cd1c12,0xc77140d5),L_(0x0000006b),
+ LL(0x440872f1,0x28a369cd),LL(0xf5dafa9c,0x07ce63b6),LL(0xc12c54cd,0x4f79c12d),LL(0x0a67eec8,0xee7a34a0),LL(0xdbc7a4ed,0xff4e7f63),LL(0x40f7ea82,0x50ab4929),LL(0xdc3353f9,0xcd953027),LL(0x1b37a3c6,0x4f307be2),L_(0x00000197), LL(0x4c5f758a,0x416ce18f),LL(0xa1adfbab,0xb9e45e70),LL(0xa53a6ae6,0xf8e38074),LL(0x19bbc5ea,0x639d3359),LL(0x66580a40,0x3c3446f8),LL(0xabe333f8,0xf20b5de7),LL(0x703c0639,0xd4a42c48),LL(0x59dbbfad,0xfadceed6),L_(0x0000016e),
+},
+/* digit=5 base_pwr=2^25 */
+{
+ LL(0xd025b49c,0xa66a4107),LL(0x4a0b9d5c,0x09a27870),LL(0x383562d7,0xb8b27e26),LL(0x8bfb3e1f,0xcd156bc2),LL(0x06132452,0x49ca82ac),LL(0x92d3d9a2,0xa22d3a0e),LL(0xd34655b5,0xa2b19aaf),LL(0x36ff20de,0xa0e8848d),L_(0x0000018f), LL(0x86f6b302,0x1143727c),LL(0x8192a853,0xc5c00385),LL(0x52b2fd4b,0xdaf1da93),LL(0x5e79d62b,0xde7c27d2),LL(0x23c74903,0x18fc4730),LL(0xd6b3ad47,0x3e48286e),LL(0xe1fb2466,0xde5e2dbe),LL(0x558feb16,0x6b4b7857),L_(0x000000b0),
+ LL(0xf33aa997,0x399f83a0),LL(0xac6eebd0,0xf152344e),LL(0x1e36ba58,0xb233cc5d),LL(0xbcb7b01b,0xb95ccb58),LL(0x0e6e01c3,0xbd70b347),LL(0x28b73f3c,0x471f1429),LL(0x192a8fa5,0x72f33fe8),LL(0x51b82a42,0xe6f5e677),L_(0x000001ef), LL(0x91ea1f80,0x29d67e20),LL(0x9219d0e0,0x355df0fe),LL(0x86128187,0xb88069ec),LL(0x196ceb57,0xc5d6f3e9),LL(0xcb831fc0,0x61a90e72),LL(0x76ccb185,0x875cf514),LL(0x775daca6,0x5e9d0fdc),LL(0xf11fb0d6,0x37c46556),L_(0x00000034),
+ LL(0x4f6f0528,0x8365a540),LL(0xd607f5f7,0xa6130da7),LL(0x85d457a1,0x282ce8f3),LL(0x7a71db8c,0xf22e8e12),LL(0x675b1780,0x1ed981d1),LL(0x54455f27,0x879b7161),LL(0xd4c8d2d0,0xe53f2395),LL(0xfbb885ea,0x533bd02f),L_(0x0000018d), LL(0xdd4e8a69,0xc1a29f03),LL(0xd15d6f60,0x620f1843),LL(0x51aa6497,0xb9253703),LL(0x3bdc3d85,0xb15aa83f),LL(0xd5713630,0x38bafd76),LL(0x46f5b250,0xa324c450),LL(0xc7ef0e3a,0x428ff854),LL(0x3074cd9a,0x61029f87),L_(0x00000130),
+ LL(0xdb38150e,0x98edde21),LL(0x02c3ed54,0x10e8c4a8),LL(0x92441512,0x5d3d5708),LL(0xf9b009f9,0x785d69a6),LL(0xac80e954,0xa197859e),LL(0x166d8dbf,0x9a954ad6),LL(0x5cac81cf,0xd5536054),LL(0x01aaa83b,0xd431342d),L_(0x000001b4), LL(0x578a0342,0x2cf62469),LL(0xb8dd8820,0x8c4987d0),LL(0xc2b48e0f,0x3b1becfe),LL(0xd5c621a6,0xa90343a0),LL(0xf668f2b6,0xfe098700),LL(0x9c088bd4,0xbd8fa882),LL(0x3f0936a8,0x67794851),LL(0xae92e720,0xc5748733),L_(0x00000186),
+ LL(0x45dfbf2f,0x3cd0f06a),LL(0x39d3c154,0xf941b6e2),LL(0x350febe9,0x2d076edd),LL(0x4d560b52,0x55928e0b),LL(0x2b184b05,0x9f1196dc),LL(0x85b25794,0x6b4f0570),LL(0x942eaf69,0xe7c1e0be),LL(0xd7c08589,0x63f1f217),L_(0x0000012d), LL(0x7bc564b2,0x3dbde8c2),LL(0x8d95012a,0xeff3d407),LL(0xa7b28d48,0x08aae60c),LL(0x1b0df773,0xe7d844e8),LL(0xf5cd9389,0xe907a4ac),LL(0x0fa28183,0x6e40930b),LL(0x381dd63b,0x20fcef80),LL(0xa89662a0,0x5312183a),L_(0x000001c7),
+ LL(0x33be7ac9,0xf700265a),LL(0xf01390c9,0x82de52e5),LL(0x6ffa798e,0xd0dd94ce),LL(0xd994953e,0x2a40701e),LL(0xdc206da1,0xf9937624),LL(0x9641d8d6,0x68b09fde),LL(0xfb08d3aa,0x515609bd),LL(0xc7a5c685,0x916b2107),L_(0x0000017a), LL(0x34c11eaf,0x007f99c6),LL(0x3e931cb9,0xfb91b432),LL(0x97268272,0xb16a5f9f),LL(0x14f51fca,0x22fdf379),LL(0x448325ce,0xa5ef4116),LL(0x36a8c292,0xb6fe6cbe),LL(0xee4ed4ed,0xd30012d0),LL(0x5ebc5cb5,0x50b1fe61),L_(0x00000103),
+ LL(0x6edf3f2a,0xc68eb226),LL(0x00200346,0x880aea4d),LL(0x8d31f029,0x006895c8),LL(0xf085775e,0x89fcfc5e),LL(0xd25cf0d0,0xb2a191ee),LL(0x4508a2eb,0xc9428552),LL(0x90ca4e90,0x22abade9),LL(0x985e1eac,0x8ec6b7a8),L_(0x00000092), LL(0x31e5ce6f,0x96705235),LL(0xdb11d250,0xee984de1),LL(0xfa51e382,0x06a31aa7),LL(0x47482dcf,0xb9587e74),LL(0x988048ce,0x51593c99),LL(0xca987f12,0x6fe30df1),LL(0xffd978f6,0xfa604f59),LL(0x8e6925df,0xbebed832),L_(0x00000121),
+ LL(0x24f8517a,0x039e54c1),LL(0x2549eb0e,0x1ec83d52),LL(0xeb02627a,0x18a8ead8),LL(0x95771e96,0x497c2cef),LL(0xd4f3a6b4,0x1c4917c7),LL(0x080b55a4,0xe8babd80),LL(0x90585b7b,0x6c548c79),LL(0xdabe54a0,0x2dcbdc64),L_(0x00000099), LL(0x2b269bac,0xdf9b98b0),LL(0xc4ed8c6b,0x0247e075),LL(0xd8e1a299,0xbc830716),LL(0x019c94ed,0x3458f33a),LL(0x9c1665fb,0xcd4d82fa),LL(0xff63e700,0x2326e507),LL(0x41c9bbfa,0x5b452b83),LL(0xc9214a3f,0x1a7050df),L_(0x0000012f),
+ LL(0x3a39f3de,0x6207af25),LL(0x48efebf2,0xe105123f),LL(0xc14c4d56,0xe2f0d038),LL(0xe91d26ba,0x4b6de581),LL(0x4ec88307,0x8f223417),LL(0x0cd6e3f2,0x6ecd94a5),LL(0x986d1a76,0x75765814),LL(0x6e247362,0x2e292aa2),L_(0x00000047), LL(0x8b83a718,0x6e918a1b),LL(0xc07b54ba,0x67b07959),LL(0x22adb8dc,0x96a7a38b),LL(0x2810db83,0xd80ec3cd),LL(0x512687fb,0x3b7485fc),LL(0x6a994329,0x746aec5a),LL(0xd193ecb8,0x6e8d782e),LL(0x72720264,0xf4c3b7e3),L_(0x00000160),
+ LL(0x18efe68e,0x7f9ec076),LL(0xd1c7c3de,0x2cb36021),LL(0x39cd1c50,0x4584b14d),LL(0x997b5332,0x4275cf71),LL(0x8ac5db4a,0x47f829e4),LL(0x0bc80acc,0x41dd84b4),LL(0x93021863,0x498e9e29),LL(0x6c2be4f1,0x514dc4f7),L_(0x000001aa), LL(0xa59f6acf,0x50030fe6),LL(0xbe6f68fb,0x21480f26),LL(0x217fd94a,0x7a75421a),LL(0xfc5b6dc5,0x7f8cd384),LL(0x19e9f3af,0x674a2419),LL(0xd009b54a,0x454fa1ef),LL(0x6bd82b7f,0xf5bea7db),LL(0x31688d56,0x02858efb),L_(0x00000076),
+ LL(0x24d7621f,0x92168834),LL(0x1fc413da,0x47855bbd),LL(0x13a9e461,0x17199daf),LL(0x4e3536bc,0x42c2a13c),LL(0x2b4a64a6,0xa8670cf2),LL(0x38d86ada,0x6c221d69),LL(0x68ee0d8d,0x91def21c),LL(0xa5126dec,0x99a859f3),L_(0x000000bd), LL(0x03f14fd3,0x378bafe9),LL(0xef0ab60c,0x11be6eda),LL(0xe18440ad,0x59ce941a),LL(0xead8d861,0x59cf0928),LL(0xd51985bf,0x608dbb83),LL(0x54f87d88,0xb568f14f),LL(0x15b84493,0xb574903f),LL(0xbc432c12,0x90bc4e6d),L_(0x0000010e),
+ LL(0x79d38b74,0x7eaa6aae),LL(0xf84e0117,0xdb942db5),LL(0x77a0b212,0xd22fb9bf),LL(0xc56ffa35,0x3c3e0310),LL(0xdf48ef3e,0x9f901558),LL(0x372e6e7b,0xa69d9dbe),LL(0x0da5fd74,0xeaa231af),LL(0x1a06775c,0xc9f04db6),L_(0x000001cf), LL(0xd09d3577,0x7802613d),LL(0x61b4d69e,0x19ba2ee8),LL(0xa78fefe1,0x46a7d09b),LL(0x7be0e7b7,0xedbd7a6a),LL(0xed289bee,0x894b4148),LL(0x613e6a64,0x4ced52a0),LL(0xf2a487de,0x58c856b6),LL(0x802d7250,0xe3475832),L_(0x0000000e),
+ LL(0xd1a6df86,0x365ca885),LL(0xca64af53,0xfb62f8cc),LL(0xbd654db8,0x7be4b7f7),LL(0x029300b0,0x8e5d1bd5),LL(0xc892e13f,0x2c67f87f),LL(0xcc4777a4,0x8b3a46c0),LL(0xba6516c2,0x7400b2a4),LL(0x6cbe8178,0xce032c3d),L_(0x000001ff), LL(0x24153eca,0x540f05b7),LL(0x19221aa5,0x97f95061),LL(0x09e289a2,0xbba5984c),LL(0xf2867a5f,0xa0f6739b),LL(0x0f075e42,0xa0718647),LL(0xab768457,0xa0b31eb8),LL(0xae89b1c6,0xf7e66ea8),LL(0x127d85c9,0xabebbadf),L_(0x00000087),
+ LL(0x6d5a6301,0x8cd94792),LL(0x3dd861e6,0x97b8baf4),LL(0xfe513cef,0x04f520d2),LL(0x71773dad,0x05832bb5),LL(0xe9f256e1,0x644c2754),LL(0x40df1966,0x700981f0),LL(0x9215b453,0x5dacb6f1),LL(0xc1eb3c97,0xc9b5d3dd),L_(0x00000093), LL(0xbd504fe7,0x365fddbf),LL(0x8fd2242a,0xc2c35f7a),LL(0x4bda285f,0xc1adbae0),LL(0xe964cfd7,0x9f4dbf4e),LL(0x29f5bb5b,0xebe1db2e),LL(0xaab3521e,0xeb26c679),LL(0x17b1e0d2,0x460499ac),LL(0x5a9383dc,0x366f4a0a),L_(0x000001a5),
+ LL(0x13ec332c,0xb2a67fff),LL(0xb50e03f5,0x50971210),LL(0xfca3bc03,0xa67e12aa),LL(0x4ad52b09,0xbb90dbda),LL(0xff71aa12,0x0edb116e),LL(0x6d43afd2,0x0827d59a),LL(0x97de7056,0x29d216bb),LL(0x7a131b7f,0xe3451b60),L_(0x0000017c), LL(0xb922ac22,0xfa7cdb03),LL(0xf832d6ed,0x58c5a459),LL(0xd373c013,0x7af850a7),LL(0xec4706eb,0x2c0a7082),LL(0x67642828,0x10a909d7),LL(0xae5e13c9,0xab317113),LL(0x5697d646,0x62e5e289),LL(0x83fffcd8,0xb1590922),L_(0x000000d9),
+ LL(0x331109fa,0x16fb0987),LL(0x7dc5b06e,0xf23db224),LL(0x62c76a0d,0x3f2f53ef),LL(0xf6843163,0x41397218),LL(0x63cbe6a9,0x6d05ffc2),LL(0xb14a253b,0x7ed103a8),LL(0x8ee0b454,0xf389d693),LL(0x3310d7c6,0x9221bf4f),L_(0x000001e6), LL(0xe3ae5ea5,0xeba63d9e),LL(0x281cc803,0xff5d7d44),LL(0x5a289454,0xfa26da52),LL(0x8b5bf3e7,0x8b9a0868),LL(0xf6c91ab8,0x565a2877),LL(0x10a39907,0x737c0212),LL(0x1223d6a1,0xe131db55),LL(0x19f277aa,0x3e1fc414),L_(0x000001cc),
+},
+/* digit=6 base_pwr=2^30 */
+{
+ LL(0x205e28d0,0x97a1a0b2),LL(0x662c120e,0x6679b5d8),LL(0xd256806d,0x56f0da8b),LL(0x5177882d,0xb3a0c292),LL(0x1fd447d9,0x15eb4fc8),LL(0xd44b077e,0xf15d98b7),LL(0x44ac5bb0,0x2721ac99),LL(0x38b1a539,0x90bc5964),L_(0x000000ee), LL(0x2615ec8d,0x7c193099),LL(0x6014ef39,0xde0771a4),LL(0x7929bb3e,0x2d975e02),LL(0xcd3fad00,0xd387bd9d),LL(0x38c634c3,0x4ebf2479),LL(0x08079c3f,0x2c2da2b5),LL(0xe2b2209a,0xd2e85151),LL(0xbb80ad2e,0x2c3845f4),L_(0x00000166),
+ LL(0x8f90c95c,0xb8f686b4),LL(0x17d91844,0xa7467794),LL(0xb498e1e2,0x354bd2f6),LL(0xdf2e61e9,0xaea1ed2a),LL(0xb0db08d1,0xf347f08d),LL(0x02cba497,0x78713784),LL(0x5de0850c,0x51753c73),LL(0xed5b7079,0x1738e1f9),L_(0x0000007a), LL(0xd4d045e4,0x91e83186),LL(0xd4180245,0x2f07b1ad),LL(0x059bab68,0x1d467074),LL(0x2b0f371c,0xb0e391ea),LL(0x80e5f219,0xf22e68c2),LL(0xb058f844,0x79b7f960),LL(0x6ca98996,0xd1250203),LL(0x1f63acdb,0x0336e28a),L_(0x000000bf),
+ LL(0x6f5a9e54,0xbda97f65),LL(0xaf7af291,0x3726d93c),LL(0x49f05287,0x2f95260a),LL(0x41ba40c2,0x77d547dd),LL(0x957f51b5,0x05f74755),LL(0x8ef3d171,0xabb35056),LL(0x131fa675,0x73e0ad7e),LL(0xf2cdf14a,0xc6b88e0e),L_(0x00000119), LL(0xe74e4c04,0x5dd32692),LL(0x56454c03,0xbec75c70),LL(0xcf373902,0xf969fbf4),LL(0xcc237598,0xc6be1f8c),LL(0x25a52045,0x1317acb0),LL(0xbd2ef98d,0x4c09bec9),LL(0x87e896e1,0xa4033c40),LL(0x16b064d0,0x35a420c5),L_(0x00000082),
+ LL(0x2223b656,0xf580463d),LL(0x7a55f8bf,0xbd3d896f),LL(0x19d6f3c8,0xdc1bc358),LL(0xf8dfdd32,0xa2786cfc),LL(0x57477a57,0xae5589b6),LL(0x9f47a3b0,0x06de5eae),LL(0x93f21788,0x2c782fcd),LL(0xd9479ee3,0x96eb796d),L_(0x00000135), LL(0x0929435c,0x52a35de2),LL(0x5b11dd83,0x4ce809af),LL(0x080ab8c3,0xe25a76cf),LL(0x50478b1c,0x216bfb22),LL(0x103b3ff7,0xd87f4762),LL(0x99b34133,0x41327480),LL(0x95f627aa,0xa729b689),LL(0x62b3cf30,0xd78ba6fb),L_(0x0000017d),
+ LL(0x721c2b47,0x251bc403),LL(0xb04b42b0,0x43b1fedb),LL(0x73ae072d,0xe91e26a3),LL(0x0d23d9bf,0xbe237693),LL(0x40c88f4f,0x3424beb1),LL(0x6a55a156,0xa0854744),LL(0x26b2b7ac,0xd61d14b6),LL(0x4ee7f1ff,0x2b8c920f),L_(0x0000005f), LL(0xa08faeb0,0x9b46600b),LL(0xfac400c9,0x541f8756),LL(0xfa469aa7,0x961867a9),LL(0x9f699a76,0xaf3ea90e),LL(0x6fa24828,0x87c1ec18),LL(0xb4eae9ea,0x13538c6c),LL(0xd16f2fd6,0x3f2706c2),LL(0x1ba2b83f,0x49f12b47),L_(0x0000001b),
+ LL(0xbdd4d4a0,0x305ae6fd),LL(0x1d7bb497,0xfd52a449),LL(0x143fec43,0xf6e16ac4),LL(0xebf21b11,0x8a70f179),LL(0xdc6c0238,0xb6be355d),LL(0xd156ead0,0x45178899),LL(0x91cfd7f1,0xdeb4b443),LL(0x63af6554,0x56edae1a),L_(0x000000f2), LL(0xc755678e,0x78e21693),LL(0x747e0d46,0x04110693),LL(0x8c5bb7f8,0x878fdb74),LL(0xb933a4bb,0x90576198),LL(0x4a53f37a,0xb6123d17),LL(0x9e11e3a2,0x6fc61c48),LL(0xf4f2778d,0x0bd5422a),LL(0x78936064,0x0834022a),L_(0x00000075),
+ LL(0x1cdfc255,0x0e89d4d5),LL(0x620f831a,0x353a0af0),LL(0xb276e069,0x687747f6),LL(0x848dd0c6,0xf27dfd62),LL(0x0bb6c7d1,0x05846ed2),LL(0x561ca5d7,0x17ec1af8),LL(0x39a2756b,0x4280d8ec),LL(0xf4bc9db5,0x3c387c2c),L_(0x00000111), LL(0x827b9727,0x96e34ce9),LL(0x3fe216b6,0x79c77aa0),LL(0x6720f347,0xfad412f9),LL(0x695ff127,0x74dee9fa),LL(0x5f1b0845,0xe65f23d5),LL(0xbfbfe9e6,0x3e545ad7),LL(0xe1c9f0ed,0x92d8678d),LL(0x9914fd4c,0x34192088),L_(0x000001ca),
+ LL(0x479267d4,0x0396f4d9),LL(0x88692b5b,0xb1e5f7f0),LL(0xfd9437e3,0x9509c3c1),LL(0xb9b9b7fa,0x15a75e6c),LL(0xba37b6c1,0x5b42f650),LL(0xdbbc62d0,0x5b3cf510),LL(0x6d5fe62d,0xc6a49bf0),LL(0x824e6593,0x21168049),L_(0x0000007a), LL(0xcc7f70f3,0xeb94fc53),LL(0x6a2b34a3,0x82c0e60f),LL(0xea4bc9d4,0x8f42888a),LL(0x7ab9ed31,0xc0fe3ed3),LL(0x1a505ae0,0xe94fad3b),LL(0x545382c9,0xfa0f3128),LL(0x9ae4fb8e,0x44bd4be6),LL(0xa516fe88,0x3f6a7003),L_(0x000000d6),
+ LL(0x5455aac0,0x2a8889b3),LL(0xc9b0d66d,0x1c5bf83e),LL(0x736f64af,0xeb5d7b9e),LL(0xb0411171,0xfd19cd82),LL(0x22d46926,0xdc65529f),LL(0x1a902efa,0x2603fa26),LL(0xa829e75c,0x4e40cf1f),LL(0x25ea27fc,0xe0d4e87d),L_(0x00000161), LL(0x4b68fce9,0xe6bccc3f),LL(0x83ed8b75,0x047d0099),LL(0x864c3567,0x85060d1b),LL(0x1ddc1dd9,0x3ee4ae76),LL(0x974e9669,0x389206d2),LL(0x6126092a,0x91ac46ae),LL(0xe4c7cd87,0x450710f2),LL(0x9e581f06,0xc5c30640),L_(0x000000ae),
+ LL(0x291b3bd9,0x42264245),LL(0x08f40ce6,0x9254ae8e),LL(0x244beb5d,0x6f14d800),LL(0x0b345a89,0xe0141c82),LL(0xb5b0de4a,0xf52d10c3),LL(0x2ca8fb1f,0xebf183aa),LL(0xdb884d75,0x8611998a),LL(0xd2bb9afb,0xce37079a),L_(0x00000152), LL(0xa6d267bb,0xe6bc257b),LL(0xf0568557,0x2160d875),LL(0x6b9e2dd7,0xb1fad31a),LL(0x9c709714,0xed3d24a8),LL(0xf7d05de5,0x61431dc5),LL(0xdc526178,0x0501b15f),LL(0xe40e89ee,0xb2aa5088),LL(0xf3025f1d,0x365bc9f8),L_(0x000001e3),
+ LL(0x859759f0,0xb249eb45),LL(0xff4d25bf,0xb8020268),LL(0xd9737355,0x9d4a831f),LL(0x84343cef,0xba7e139e),LL(0x5bb5557e,0xb24bfdbf),LL(0x3ab8fb19,0x31a1b161),LL(0x3fa57146,0x4ec60d24),LL(0x01fac245,0xf4776d25),L_(0x000000f7), LL(0x3e8c0bac,0x5b116d34),LL(0x0f307133,0x62db28ba),LL(0x9a0533b5,0x0939b6eb),LL(0xacf1cf00,0x89d1c401),LL(0x693e7c92,0x4b14c89d),LL(0x0945b630,0x4ed7b53a),LL(0x4b162dc1,0x79a7fa4b),LL(0x3e6b7dc4,0xbe6da5c0),L_(0x0000009b),
+ LL(0xb35e8088,0x24bb4a7a),LL(0x9e47ec6e,0x968fd370),LL(0xe7d95582,0x474d55e3),LL(0x783f2538,0x9d35c0f8),LL(0x83b454e1,0x4578fbe5),LL(0x114b724c,0x98f51326),LL(0x97ee546b,0xf190d99b),LL(0x801229b8,0x3b184691),L_(0x000000b2), LL(0x7ee4a0a2,0x8b19b4b6),LL(0xd4f5faa0,0xc220cb11),LL(0x6ad0862b,0xce1c7d42),LL(0xd7a63508,0x3236a72d),LL(0xeaae4777,0x36cda4ac),LL(0xbe3fcce9,0x808ba7a0),LL(0x972c3840,0x79c14a5b),LL(0xcda4655c,0x0cecb887),L_(0x00000155),
+ LL(0xf72e10a1,0x23f718f8),LL(0x07515abf,0x820e2eb6),LL(0xc81af50b,0xea92c2b4),LL(0x06af11fd,0x71048468),LL(0x755ab069,0x6ada8b6e),LL(0x5f2e0402,0xe7b549c5),LL(0xa45c27e8,0x13b56922),LL(0x1760f8ae,0x07a6f401),L_(0x00000085), LL(0xacb0965f,0xc6437d60),LL(0x30e79f87,0x93a0e68a),LL(0xcb0f4dcf,0x3613f9b0),LL(0x02e2383c,0x32355c62),LL(0x3ec75821,0x4a835dde),LL(0x4891bfda,0xa38a3a87),LL(0xd0206185,0x9de0b9b9),LL(0xa9cedb8c,0x54d8a9f4),L_(0x0000018f),
+ LL(0x8b5ddb45,0xdc46fb16),LL(0x8166a790,0x41a5e4a7),LL(0xc854c900,0x342b51ba),LL(0xeb4a908e,0x116e0741),LL(0xb76499d7,0xc1551311),LL(0x6cc7399a,0xccaf37b4),LL(0xf2094cc8,0x9c29f265),LL(0xc4a1fb65,0xcca404c7),L_(0x0000005f), LL(0xa4cf272a,0xcfc8b9dd),LL(0x9fd1f1c4,0xb8e8cb4f),LL(0x8ddfade3,0xfd72dadc),LL(0xf084903f,0x764ba410),LL(0x9094e8a7,0xf43466f6),LL(0xb9869fee,0x1564c4ac),LL(0x82a6cc83,0x7742c943),LL(0x89c1b557,0x2b44656c),L_(0x0000001a),
+ LL(0x7e25b95d,0x08c1d55c),LL(0x50011066,0x2de90a9b),LL(0x63db375d,0x46d6ba3b),LL(0x2d3fa9bd,0x9ae8aa53),LL(0x9fb12874,0xabf67a35),LL(0xd1f1f45f,0x05d8099d),LL(0xdc479fc0,0xdf2cdfde),LL(0x779d8b52,0xe51f87a9),L_(0x000000da), LL(0x8f62ac2a,0x4ab94029),LL(0x56a0908f,0xbb03c1b4),LL(0x9ce0943b,0x6319d2ed),LL(0xe2d743f7,0x910c2363),LL(0x871683b7,0x78ddf2fb),LL(0x43f08ff4,0xb7c5e230),LL(0x2ebe58e7,0x1c175b19),LL(0xc02e1520,0x9f7bb585),L_(0x0000013c),
+ LL(0xec7786aa,0x70017bcc),LL(0x26576a40,0x926b1ae0),LL(0x5e810d17,0x6c002685),LL(0xdef24d30,0xd826c439),LL(0x78ac55c7,0xe40f66cc),LL(0xfbf9b521,0xe26697c9),LL(0x01aaaf8a,0x46a75caf),LL(0xd094aec3,0x12da82a9),L_(0x00000072), LL(0x99a161f4,0xcc3c7e5f),LL(0x88977e72,0xfefa749b),LL(0xd6e24cf4,0x56863737),LL(0x4607a910,0x4dcfe4ed),LL(0x01768685,0xac7bc09c),LL(0x9ec211ac,0xc731394d),LL(0xac76909c,0xd59e4dd8),LL(0x246fb612,0x6cf6ebc7),L_(0x00000183),
+},
+/* digit=7 base_pwr=2^35 */
+{
+ LL(0x5592f380,0x0dd54d04),LL(0x44d05f6f,0x298fe241),LL(0xe2d191b2,0xad46274a),LL(0x9113fc1e,0xcc54c590),LL(0x0dea702c,0x763ea8c1),LL(0x74f208c5,0x35441e72),LL(0x578c5736,0x3706b2f2),LL(0x81343695,0x93b46c3b),L_(0x00000063), LL(0x88ada464,0x4c2605a5),LL(0xd5464606,0x004bbf31),LL(0xca04e18d,0x03210805),LL(0x998cccf9,0x89627867),LL(0x48398a6f,0x8d2faed1),LL(0xca85dacf,0xde01ea7e),LL(0x92784742,0x0feb7d82),LL(0x9fe5859b,0xb9f9aeb8),L_(0x00000150),
+ LL(0x05a73aaf,0xe5e08d95),LL(0x18e919ab,0x9fd8bcd3),LL(0x5b386f06,0xd6891589),LL(0x0b5abd07,0x07bc244a),LL(0x339901b0,0xc3693691),LL(0x684cff05,0x179dcef7),LL(0xe69b7993,0xb0125196),LL(0x23db7308,0x03553a28),L_(0x000000be), LL(0xf88e8361,0x0c66e267),LL(0x2f9f93bf,0x6d375b82),LL(0x09656c0d,0x6d5dc021),LL(0x0c1fc16b,0xba81db53),LL(0x86bf6541,0xb4caf94b),LL(0x1a6d443c,0x87f59d3c),LL(0x0e10fe1a,0xb72afcd6),LL(0x8d7e1995,0x1a0c6a08),L_(0x000000da),
+ LL(0x3c2640b0,0xef7a7df4),LL(0xf6850378,0x2a55c175),LL(0xed04fb24,0x8b6f667a),LL(0xa7e743ff,0x93061f72),LL(0xdf46d114,0xdaa59d80),LL(0x9d4ed766,0x49c1e1f8),LL(0x4b991a82,0x2fe74922),LL(0x2e41804d,0xe9a27b22),L_(0x00000196), LL(0xf37b7a2c,0x140444d6),LL(0x8f14ff32,0xf54bdbb6),LL(0x34a9f316,0xde42c24e),LL(0x9515de8e,0x96a88eec),LL(0xf1959aa3,0xdcd09006),LL(0x30671815,0x058c4643),LL(0xb6c6d2af,0x65dac0ec),LL(0xd1a5f578,0xc7fbdbf4),L_(0x00000150),
+ LL(0x0a5b8daa,0xd4667616),LL(0x8dcdbdbe,0x16e7a7e7),LL(0x1b0f5e9c,0x9178e1fc),LL(0x3cb9503e,0xf2294c93),LL(0xe6f78b36,0x420442aa),LL(0xfb2d6ec3,0x01e17c7f),LL(0x7d30fddc,0x9c7293b8),LL(0x36bed473,0xa2fcf928),L_(0x000000a0), LL(0x4975943e,0x84cf37b8),LL(0xab2857b7,0x645eaa02),LL(0xe12a0d65,0x3d30b0ac),LL(0x267c93aa,0x30be3eff),LL(0x6fa69542,0x903aa7ed),LL(0x2cdb01e1,0x311ae0c8),LL(0xc5056d4c,0x275f0bd3),LL(0x94d54a98,0x7fa09220),L_(0x0000005d),
+ LL(0x8c942dd7,0x62d7fcf1),LL(0xc893077d,0x643ea78e),LL(0xda471b28,0x4e9d9fdb),LL(0xfb673df7,0xe64cf76a),LL(0x51536a0a,0xfccba343),LL(0x5fc020fd,0x279bce99),LL(0xdee7d155,0xb7f5fd72),LL(0x68c90549,0xdc14172d),L_(0x00000119), LL(0x4ecec5bb,0xe6b0baf4),LL(0x6a4bc82c,0x18f9ed0f),LL(0x93eb1856,0xdc69912e),LL(0x6f327c7d,0x2be0e2b3),LL(0x52fbc6f3,0xe7e8bfdb),LL(0x24b3acf0,0xd81de1d4),LL(0x62a84326,0xe49b2810),LL(0xc3912b42,0x55d57336),L_(0x000001ab),
+ LL(0x551c0660,0x2fe061f4),LL(0x91d40c3d,0xa2b6dd70),LL(0x7cc4883d,0xbd2bf743),LL(0x58011dda,0xaee852f2),LL(0x71bdaba7,0x39f463ce),LL(0xbd7c195b,0xfb33b881),LL(0xede085fe,0xbf7d695a),LL(0xf8fa2471,0xe577b380),L_(0x00000149), LL(0xc96eeab9,0x8a6f5a6d),LL(0x07f71f13,0xb29f154f),LL(0x242d7a9e,0xb707d1c7),LL(0xf3c7f1af,0x44aee842),LL(0x0af2896b,0x01f56999),LL(0xc5c5b556,0x1e36ed07),LL(0xcca26786,0x245430fa),LL(0xa78eb214,0xaa96816e),L_(0x00000106),
+ LL(0x0f4d9fba,0xa4eddc14),LL(0x9ebcb886,0x420f1510),LL(0x3c114b65,0x4e6c23f6),LL(0xba3fc70d,0x5f6bd766),LL(0x718ac792,0x532bdc38),LL(0x5c2b8f46,0x03efcc7f),LL(0x72c3a472,0x5c2b9a45),LL(0x9dc110c9,0xba2fb9f4),L_(0x00000147), LL(0x1a6af2f7,0xb5c3ea1c),LL(0x8052b6c2,0xab27ec8a),LL(0xa3cff07f,0x4c92575d),LL(0x00fa9778,0x4b43265d),LL(0xff1e188a,0x6c53a129),LL(0xedc9e95e,0xfcb7ddb8),LL(0xfb7de911,0xc1dd8dd6),LL(0x6e53bbb5,0xd488fa72),L_(0x000000b1),
+ LL(0x7daeaaab,0x6eaee317),LL(0x6e35398b,0xf5c1267a),LL(0xd01bbbbb,0xa2b92ae2),LL(0x3af1a4f4,0x5cdfa4bf),LL(0x5532088e,0x638a58f5),LL(0x2a0ec8ee,0xbce5e7aa),LL(0x79c3f50b,0x46a16448),LL(0x378387c2,0x1c40f25e),L_(0x000001cd), LL(0x6769ee88,0x8ec2984b),LL(0x62fea90f,0x1f9e47bd),LL(0xe7522665,0x3d9f9867),LL(0x916cb049,0x5be2cccb),LL(0x1106987f,0x71156e1c),LL(0x7bad869c,0x011576bd),LL(0x945007a5,0x38b76a6e),LL(0xc18de41f,0xd11c30ae),L_(0x00000109),
+ LL(0x6ee5a7d6,0x2831843a),LL(0x58bef9ba,0xe4f07223),LL(0xd00147a3,0xe1c40e6b),LL(0xd10e53e0,0xe7025e87),LL(0x5d5f797a,0xf0dd838b),LL(0xe3b65b5f,0x16931c80),LL(0xd1ff0eb8,0x42704c55),LL(0xffc29bf2,0x999442d4),L_(0x00000150), LL(0x279cdc4f,0xed03963d),LL(0x51c15682,0x4a0c613e),LL(0xc3d504ac,0x6ef1db42),LL(0xba61ce4e,0xf8742eaf),LL(0x2e74a6d4,0x3efa3cf5),LL(0xd53943f5,0x201c12e1),LL(0x253da54a,0xa468664c),LL(0xa35c5fd4,0x6014ba12),L_(0x000001c6),
+ LL(0x687c5994,0x7a229d23),LL(0x8aa53c89,0x118e3e78),LL(0x080e973b,0x15c794e3),LL(0x5a91046f,0x30c0f281),LL(0x5ac04ed5,0xfe35eb92),LL(0x0c5478a4,0xfe18e707),LL(0x7d9c57a1,0x4bf409ce),LL(0xfcd17edd,0xdecf58aa),L_(0x00000138), LL(0x3d2850fe,0x23469475),LL(0x2c45c37e,0xc528ec7d),LL(0xf346792a,0xa36bdd41),LL(0xca964be2,0x11d67932),LL(0x3fef3e79,0xc72673a0),LL(0xf0bc0101,0x53d6358e),LL(0xb9caaba6,0x2bf874e2),LL(0xbbcc3188,0xe8aaf45e),L_(0x00000102),
+ LL(0xf22d90c1,0x24df4deb),LL(0x449aa491,0x37a9290e),LL(0xd1657f10,0xc6bbdf04),LL(0x4ba3ee4b,0x4075fc0e),LL(0xe3e07500,0xf134a6c8),LL(0x7661f086,0x2b3b9213),LL(0xfd4c08de,0x6f51f169),LL(0xcae8fa7f,0x275a9f04),L_(0x000000b3), LL(0x9303da25,0x1e8df3c5),LL(0x6a92d1ac,0xb326f2a6),LL(0xafc6ed8c,0x46ef258d),LL(0xe7d3b364,0x53fe6ba5),LL(0x7b2d91d1,0x669d23c2),LL(0x150f6968,0xc05b6015),LL(0x230a0105,0x376b2356),LL(0x3df6108a,0xea51c972),L_(0x00000165),
+ LL(0x5490baa5,0x148d7d84),LL(0xae379993,0xd948464c),LL(0xac4f8ace,0xddaf46fe),LL(0x68d1b7c8,0x6c39b672),LL(0x10d4770e,0x5967ac57),LL(0x30a2c195,0x2098b748),LL(0x19047735,0x858d17fe),LL(0xe5071ced,0x709c0191),L_(0x0000000a), LL(0x44b4f003,0x2a7e4193),LL(0x767f8087,0x1262c90a),LL(0x91770fa4,0x25315a97),LL(0x4bc5606e,0x696dd31a),LL(0x6a665041,0x7ec13746),LL(0xbd01da6d,0xac07c562),LL(0x59de1e2c,0x4bc4a92e),LL(0x8f7d2999,0xcaa3e706),L_(0x0000016a),
+ LL(0x37e7ccad,0x0f93acce),LL(0x909c5616,0x3802c7e4),LL(0x50e428ab,0x3b424aa7),LL(0xdee4af73,0xc7e0291d),LL(0x5bbec3a0,0x3889c563),LL(0x7854dc66,0xe5ea7c0c),LL(0x7701185f,0x9cdf7704),LL(0x0b88a64a,0x5a2a21ad),L_(0x000000be), LL(0xe5481dba,0xc168583c),LL(0xbb4cbf39,0xec84a971),LL(0x16e6876e,0xdde2891b),LL(0x4940610a,0x9e03560a),LL(0x5406bed1,0x992e1390),LL(0x475b7757,0xc2108310),LL(0x7cc85b3f,0xffbf072b),LL(0x82170451,0x18e357eb),L_(0x000000d8),
+ LL(0x9d172698,0x0dde3c4b),LL(0xb8a86057,0x4dad7e2a),LL(0x376d08bb,0x709cc4fe),LL(0x2d396e50,0xb38f91df),LL(0x78138716,0x6a45d957),LL(0x7a064e9a,0xeda47781),LL(0xf79bf83f,0x037062a4),LL(0x2aff8e01,0xb537eca1),L_(0x00000160), LL(0x49748577,0xa23c2d1e),LL(0xdb9b468c,0x79fc968b),LL(0x9d5d5807,0xb4f35908),LL(0xae7478af,0x7ffb5a37),LL(0x6f6ac1a1,0x0ad6d095),LL(0x35d076fb,0xcc73da49),LL(0x4e896c83,0xf0b38ddd),LL(0xcd942654,0x1d47691f),L_(0x0000017a),
+ LL(0xf362300f,0x940a7fee),LL(0x0c8996fe,0xff7970e2),LL(0x434f05d2,0x3ed8edff),LL(0xc3ed10ba,0x5ebc5312),LL(0xdee87d6d,0xa445169b),LL(0x12a8674e,0xc4cceb87),LL(0xd8da7725,0x51c6dc7d),LL(0xea8956f4,0x656977af),L_(0x0000019f), LL(0x7d3585a5,0xa5517351),LL(0x13fe8bb4,0x74f18cb5),LL(0xe68912ee,0x7950c8df),LL(0x1512d84f,0x2fbcbaca),LL(0x7df13019,0x0de4c1a1),LL(0xe29f312a,0xabb943b7),LL(0x656e2b95,0x7ae2e506),LL(0xfc56ddff,0xb10146ab),L_(0x00000105),
+ LL(0xccd06bf8,0xa717a0ac),LL(0x6ceb8a0c,0xb428946c),LL(0x2bd2594e,0x5c199265),LL(0x80688236,0x3a824141),LL(0x74f2f352,0xb634a60c),LL(0x83ce2e27,0xf4680f2b),LL(0x33426806,0x485e159f),LL(0x18c76ca1,0x28f63537),L_(0x0000011d), LL(0x1f63dec4,0xd74bb74e),LL(0x6f95ccb7,0x4a5f0944),LL(0xc75d0662,0xd36f4555),LL(0xd6e7583f,0x23cc2b28),LL(0x783fa303,0x2c0c49bb),LL(0x4f771001,0x907cd3d6),LL(0xac90f899,0xe2c79e69),LL(0x2cb352bd,0x93baf6c1),L_(0x000001c1),
+},
+/* digit=8 base_pwr=2^40 */
+{
+ LL(0x93bc2a7f,0x46f49f7a),LL(0xcc0b41a2,0x91072db7),LL(0xd30ac7ec,0x53711f97),LL(0x9de685e7,0xef0acc16),LL(0xb8a2ae9a,0x6bded4c6),LL(0x4497e3c4,0x04789cdc),LL(0xb2b2ea26,0xfea082fe),LL(0xe890cba4,0xb570178f),L_(0x000001c0), LL(0x66edbc5c,0xa472aca4),LL(0x5ad15298,0xa8066050),LL(0x1b16ca97,0x38b0c1cc),LL(0xa2937bbf,0x4d56c3dd),LL(0x72545fac,0x7e35494b),LL(0x4b5790f0,0x903e9ca7),LL(0xb0c8bc40,0xc4b43111),LL(0x5923f9e9,0xed048546),L_(0x000000a0),
+ LL(0xc18b52bf,0x6410d489),LL(0x28530a4d,0xae318bb5),LL(0x3f7d7028,0xb534b71f),LL(0x0b21b686,0x1f599597),LL(0xf01ea275,0x663379dd),LL(0x800a1322,0x77c11915),LL(0x6db4beae,0xe3261c47),LL(0xe89c22a1,0x7fe9cae8),L_(0x0000016e), LL(0xfce16965,0xd6426762),LL(0x2e53d9af,0x532ec13f),LL(0x1e801ed5,0xe9efe413),LL(0x6963e2f9,0x8aecc3c8),LL(0x5f46e509,0xb47801a3),LL(0xc3d8faa2,0x3b6f3406),LL(0x349f37b4,0xadb57971),LL(0x49ef39f4,0x63bf47d7),L_(0x0000014f),
+ LL(0xf9dcaceb,0x5a73dec3),LL(0xd887946c,0x0e0ffb30),LL(0xe7e62831,0x84126935),LL(0xe074c83b,0x158a7df5),LL(0x18b04291,0x08eaada2),LL(0xfa20f72a,0x40d05438),LL(0x9aa8c4aa,0x8405e6ac),LL(0xb7559284,0xd94b0b92),L_(0x00000024), LL(0x7981326c,0xf1a037a8),LL(0x13ab2cdb,0x9887e290),LL(0x98bd3d86,0xfecffd65),LL(0x3c803a95,0x2fd8393b),LL(0x3e4c5072,0x129b699c),LL(0x5e3c4e70,0xfa72cdd6),LL(0x65f24da0,0x6c0ccbba),LL(0x5325682f,0xd21b5897),L_(0x000000e9),
+ LL(0x728d8231,0xeede07ff),LL(0x52ba3f46,0xc57dc8bc),LL(0xbbd28782,0x49d96a93),LL(0x9e0a7a0e,0x49576560),LL(0xe9fbe4aa,0x79dbfb8a),LL(0xcccb4c5f,0xe1789960),LL(0xd25ebfd5,0x09b74da3),LL(0x56df642b,0x37317c2e),L_(0x000001a4), LL(0xd17057a2,0xa759ce4d),LL(0xab9d226b,0x57744ef0),LL(0xb7115a63,0xdddc9ee2),LL(0xd77f24c2,0xdfee8900),LL(0x2142ea1a,0xa9d5346a),LL(0x6d500f3f,0xa84ecd7e),LL(0x7a1527e7,0xae35caeb),LL(0x10e6262d,0x07461c81),L_(0x0000017d),
+ LL(0xcd457989,0xbd6196a6),LL(0xdd85ca16,0x6f76c2cb),LL(0xcfd847e9,0xaa25840d),LL(0x8ea001b3,0x444e27ec),LL(0xa898be24,0x8a0c53dd),LL(0xb3e4397d,0xfa5f98a5),LL(0x64ea9863,0xbe8e1973),LL(0x922c6bbf,0x4f87cbbd),L_(0x0000015d), LL(0x0664b7db,0x54735a19),LL(0x990568c9,0x7371d65a),LL(0x52b4c902,0x600bdaf0),LL(0xc2cc9668,0x4697299e),LL(0xbadac668,0xeb4949cf),LL(0x33272f7c,0xeda14ca0),LL(0x3989fbe1,0xd9927092),LL(0x0f1714c9,0x09c6f2a8),L_(0x000000a1),
+ LL(0x00da9fad,0x39d9c06e),LL(0x69b9bebe,0x7878b1c2),LL(0x50e16aa4,0xa0545c03),LL(0x04f7fb31,0x5d57a4d6),LL(0xd233dc43,0x629977c5),LL(0x87e54a59,0xaa747e53),LL(0x0cca577c,0x80698068),LL(0x3aa24734,0xa5c6ac7f),L_(0x000001a5), LL(0xf46ecf72,0x87d84398),LL(0x5b5e3ea0,0xf8e3dbad),LL(0xc29bdf29,0xc86793b7),LL(0x8b4ad4a2,0x337e0dd4),LL(0x34cf9d25,0xc858ea72),LL(0xb282be01,0xe90a676b),LL(0x7590c7bf,0x7d306f50),LL(0x155053c4,0x2ef83915),L_(0x000001fe),
+ LL(0xfa311b42,0xa08e6727),LL(0x609fc56f,0x6285b2f7),LL(0x07ce1a3e,0xe94807c3),LL(0xc9c1df6d,0x19a317d8),LL(0xd70b9796,0x052a3379),LL(0x870efdde,0xaa7d20b3),LL(0x8f7406db,0xbb6e443d),LL(0x511beafe,0x2e19a355),L_(0x00000177), LL(0xd62e82c9,0x9d51e499),LL(0x9995a224,0x615ca9d8),LL(0xd99162d9,0xab897ac7),LL(0x51034000,0x24f35e95),LL(0xb70ca9d9,0x853be7df),LL(0xff11b526,0x38dc8c8a),LL(0x463b8a66,0x3331fb01),LL(0xb55e7404,0x69bac4e7),L_(0x0000000c),
+ LL(0x508d4f13,0xdd3ccf18),LL(0xf25524c5,0xd8ab1776),LL(0xe0bf0c9e,0x017a54a5),LL(0x1226e24a,0xb9626be8),LL(0xb0e5b1ec,0x8b7b3bc5),LL(0xf24c6acb,0x14da0130),LL(0x46736054,0x7db2f1d9),LL(0x73af8b9c,0x690b53ae),L_(0x00000140), LL(0xb11a4baf,0xf7b99ef6),LL(0x1e9bb68c,0xb7054990),LL(0xa5ca0071,0xe57cc5d4),LL(0x55009f7b,0x501abab5),LL(0x08dbaab6,0x2d17b21b),LL(0xcde35c58,0x9921c7ba),LL(0x9991c48d,0x3f13fb4b),LL(0xc6f664c9,0xc04b4d72),L_(0x00000100),
+ LL(0xaf8f0fbd,0x3fffd972),LL(0x513637b7,0xa381ede6),LL(0x3a907a7b,0xef4d7386),LL(0xdec53a87,0xfaf3ac39),LL(0x6072c595,0x7077416d),LL(0x25742340,0x8d4d4598),LL(0x0272fbab,0xc3dce550),LL(0x44d3c246,0xe453c93a),L_(0x000000c7), LL(0x8a45d7f7,0xf5989e00),LL(0xa25dc323,0x31cb7128),LL(0xd19e79bc,0x87f0b5cb),LL(0xf782a69b,0x62e18e62),LL(0x4a3bc664,0xacc62f0f),LL(0x8a21efa3,0x855aaaab),LL(0x5dc442d8,0x895a7f3a),LL(0x7fccf9f6,0xd3bb417f),L_(0x0000012b),
+ LL(0xf6a194a7,0x21638407),LL(0x8d081ace,0xe465a985),LL(0x1e6d4f3f,0x596aa1dd),LL(0x800bb059,0xf63247cf),LL(0x88ecdd17,0xd80d0066),LL(0xd6196a9e,0x359a8606),LL(0x6d1c0b4e,0xf12ac0e0),LL(0x1f003c05,0x0a4696e8),L_(0x000000d9), LL(0xe591e392,0x88389649),LL(0x09f83a93,0x2b4134e0),LL(0x9d2fd6ac,0x3ada50c0),LL(0xd488e638,0xa2f5e7c7),LL(0x6ae6d5dd,0xece41bdd),LL(0x626ed9b1,0x83fc37eb),LL(0x0ec94ba6,0x390a5c6f),LL(0xd316539d,0x016da834),L_(0x000001fa),
+ LL(0xf8cf81f2,0xdd03c701),LL(0xce67a0a5,0x957637c9),LL(0x4af6b68e,0x49c7193a),LL(0x2b716eb7,0xa9f1106e),LL(0x04a50d86,0x5cdc8e58),LL(0x29fe3e8a,0x404173b6),LL(0x2217e337,0x8d0fe7b4),LL(0x41f85927,0x04f5e2ee),L_(0x00000085), LL(0xf0033298,0x7982223c),LL(0xeed36f1b,0xc078a101),LL(0xc8a52b8f,0x54b52769),LL(0xfd843c12,0x0c71b06d),LL(0xdaa31445,0xd139607d),LL(0x996c457f,0x3373eded),LL(0x0d6abc25,0x616b57db),LL(0x27a4f9a0,0x2f577a05),L_(0x000000d9),
+ LL(0x24d46da3,0xc28ba5d6),LL(0x84ca0be2,0x69aff480),LL(0xb7d623cf,0xeee1ba2a),LL(0xc4a065a8,0xe236787f),LL(0xd893b3f3,0xaa351426),LL(0x2106fcf4,0xc4d98be5),LL(0xf2dfc4d7,0x534e82e2),LL(0x4f43180c,0xc094b8bf),L_(0x00000037), LL(0xea92fe7d,0x3cd0971d),LL(0xb9b4d4bf,0x5fa502b8),LL(0x56e42bc0,0x2f95fd57),LL(0x9a55a6ac,0xefd75261),LL(0x9c01cac4,0xc54d4200),LL(0x8b9c411f,0x9a2d86c0),LL(0x84f22245,0x0123f4e9),LL(0x924fe183,0xc4d22790),L_(0x00000014),
+ LL(0x5adfc431,0xed2fd11e),LL(0x1a785308,0xb3ad4ad2),LL(0x534b1813,0x19e08445),LL(0x77328159,0x557af465),LL(0xcd28509e,0x114e6813),LL(0x908aacef,0xdd6f9e0a),LL(0xea30d82c,0x5aec37e4),LL(0x56efd94a,0xaae09d84),L_(0x000000b3), LL(0x9a808c1f,0x8215d192),LL(0x00e65251,0x2e216a64),LL(0x8be89e79,0xa21b58aa),LL(0x1bae586d,0xde6dc431),LL(0x6074af45,0xd9ffe269),LL(0x144f7409,0x7968f9ca),LL(0x4c70bef4,0x057ee0b0),LL(0x464dfc55,0x96645958),L_(0x00000139),
+ LL(0xda8f0d55,0xbc3cfc53),LL(0xf7a0b6a9,0xc3851a8d),LL(0xd221e3bc,0x3b6631e9),LL(0x73e218ec,0xd802d5a9),LL(0xbb393674,0x357ad609),LL(0x17e839e5,0x26a2911a),LL(0xfd4ff33d,0xa9163042),LL(0x40c85178,0xaab7ae88),L_(0x00000084), LL(0xebbb0dce,0x628d1685),LL(0xc4b138ed,0xad6058b9),LL(0x1ab4e65c,0xd77f3507),LL(0xa315e387,0x01e25773),LL(0xc1c7fc22,0x5f337f59),LL(0x9dd402d9,0xc4922f4d),LL(0x8947a84e,0x52e76d6f),LL(0x83ef2457,0xdca5e48b),L_(0x000001a4),
+ LL(0x67dd4533,0xed953e34),LL(0x0ffa9336,0x4fc44042),LL(0xb44d3a69,0x0c1288b1),LL(0x7f745c6a,0x0c5f14a6),LL(0x345f8ac2,0x765ee067),LL(0xcfed50e8,0x659b1874),LL(0x5ef0443b,0x26abda6a),LL(0x894afeee,0x4aa8ff63),L_(0x000001af), LL(0xabe2ed4e,0x46dcead8),LL(0x196272e0,0x64053114),LL(0x13a8b18e,0xbcb0e703),LL(0xf9b6c7a1,0xaecaa246),LL(0xb17e245a,0xd0c5c4d7),LL(0xce6786b6,0x01f4866b),LL(0x12c94128,0xea713e45),LL(0x75975359,0x68aeda04),L_(0x000000de),
+ LL(0xb900e09c,0xf45b409f),LL(0x7837bf97,0xff4a0108),LL(0x2bcafcbc,0x6b8d204b),LL(0x0da165ec,0x8423a60a),LL(0xb1171697,0xf8295351),LL(0x3eb1f2f7,0x1f58e2d1),LL(0x2b669228,0xbbed8459),LL(0x5f9819ae,0xe7cb925f),L_(0x0000002b), LL(0x7b7ea077,0x53ee2ff7),LL(0x5b359b96,0x98e8334b),LL(0x87baabe1,0x85a52104),LL(0x95a5886c,0xc237881a),LL(0x809649f4,0x7f95c6f6),LL(0xd3395612,0xed6c6419),LL(0x657d29fa,0xa5be49aa),LL(0x7ae0b376,0xd04f1da6),L_(0x000001ac),
+},
+/* digit=9 base_pwr=2^45 */
+{
+ LL(0x45fb32ba,0x8a721e35),LL(0x5c4674f0,0x584020b4),LL(0x84a774fc,0xadafd3a2),LL(0x477afffe,0x266e1004),LL(0xd6a2c4ec,0x326c6652),LL(0x428066dc,0x0b3a65b9),LL(0x4c7d5c77,0xe355b810),LL(0x4b6af237,0x7bce6d8c),L_(0x00000197), LL(0x1c0b97b7,0xde135822),LL(0xcc7ac435,0x876cab38),LL(0x8f30b09e,0xec654cdc),LL(0xcb3a4f5a,0x26a9da0c),LL(0xb2ac30ca,0x8e2a6fa3),LL(0x77ee1103,0x545c20a5),LL(0xf50fb144,0x97bff8e2),LL(0x58359a6d,0x39ffa931),L_(0x00000194),
+ LL(0xb2c8ba9c,0xddf8d1b9),LL(0x7f24e874,0x27291ffd),LL(0x563287c7,0xd028bd9d),LL(0xd01bdb48,0x3b0c1265),LL(0x71b99b97,0x618319b9),LL(0xf686050d,0x8420d531),LL(0xc411c3a3,0xaed7c201),LL(0x468eb84c,0x13a48d97),L_(0x0000019f), LL(0xf6eb2fc0,0x1dab9da1),LL(0xc275b73e,0x49847c3a),LL(0x54d322f9,0xf0578805),LL(0xdd0cd2b7,0x4958eafe),LL(0x185bb3e7,0xd9061a48),LL(0x5c6dfcd8,0xf9ac370d),LL(0xa0217866,0xf54cb188),LL(0xa132c3b5,0xec13457a),L_(0x000000b7),
+ LL(0xf197825d,0x1340276a),LL(0x4bbcc96d,0xd82fe632),LL(0xcad6233b,0xc290475e),LL(0x0cd8d04a,0x738cce9a),LL(0x8e8e067d,0xaa038ad0),LL(0xd83e4317,0xa7ce55aa),LL(0xd5e91f49,0x856a1887),LL(0x5efeae92,0x16577a13),L_(0x0000013c), LL(0x9bfa0b6a,0x3d153ead),LL(0xef7bc585,0xca7f6fb4),LL(0x0b798e2a,0xf8abfbb3),LL(0x53595cf1,0x79182066),LL(0x1774e7d1,0x862d3928),LL(0x8b4548df,0xdb1e4086),LL(0x6e38fc52,0x72153b33),LL(0xe2e4b80e,0xb610b52c),L_(0x00000006),
+ LL(0xf5595043,0xe1b752f3),LL(0x1b9318d9,0xf6e2b364),LL(0x5c02bb70,0x38d64e0f),LL(0x9d8f2870,0x07542416),LL(0xa62f3a1b,0x3b8c6755),LL(0xd59701bf,0x2b642127),LL(0x20fbe8ba,0xfac17f0c),LL(0x3410177d,0x46466526),L_(0x000001b8), LL(0x2b08cc56,0x70680750),LL(0xe532cef6,0x7a1e8980),LL(0x29a4a8b8,0x3b679637),LL(0xcb3a4f19,0x0043db7c),LL(0x92e07ae8,0x346fea83),LL(0x0da35be0,0xef33f7a0),LL(0xcb41f4e9,0x271ea778),LL(0xbb760e77,0xcbdf796e),L_(0x00000018),
+ LL(0x120e5ac8,0xcad14e90),LL(0xd45b7941,0x130b3936),LL(0x78bbd634,0x3839fe90),LL(0x8f94ae22,0xfb2c2b29),LL(0xbd4d9761,0xb2caaa91),LL(0xf6e513d3,0x37bd3dff),LL(0xa0f24baa,0x9dd2846a),LL(0x1d27a8db,0x025f7ece),L_(0x000001d1), LL(0xd4e2cdab,0x8296eec9),LL(0xee13214a,0xce1e6780),LL(0x6fed4902,0x8ec28ea6),LL(0x28576525,0xa9bf0652),LL(0x0afbfe7d,0x0c66edcd),LL(0x9e743eb7,0xc8ec4a8a),LL(0x64589360,0x09bf2d23),LL(0x7a6453a2,0x48ef097a),L_(0x000000c5),
+ LL(0x4d44bd26,0x5e7c9a8b),LL(0xfa441738,0x3f4fd525),LL(0x8cdf278d,0x5b1fa4df),LL(0x60600772,0xb7e79779),LL(0x15388443,0x6b7719f4),LL(0xd7a3aeca,0x17dd158d),LL(0x02441c0d,0x3d070ec1),LL(0xd5eb5d02,0x8264d6c9),L_(0x00000123), LL(0x0ab898cb,0x01117e64),LL(0xee325365,0x6f680374),LL(0xbc1ae420,0xdaebee10),LL(0x98a23bbf,0xfec8e51b),LL(0xb59efdf3,0xbbf08b12),LL(0xa18137ff,0x1532459f),LL(0x04b7fdbe,0x60238519),LL(0x37b3447b,0x4a54c60e),L_(0x00000108),
+ LL(0x6b53a82a,0xad2c8749),LL(0x5a5a47d3,0x75f76d03),LL(0x60558c44,0x6ecf38ff),LL(0x957fd8a0,0x7695311e),LL(0xcd47da64,0x215ee9fe),LL(0x35b22e22,0x4796f4b7),LL(0x949a56db,0xf62c912e),LL(0x74debc0c,0x62bb4591),L_(0x00000058), LL(0x9bd8df8c,0x203b317a),LL(0x637e055c,0x03c45bfe),LL(0x90fbadef,0x1132b50f),LL(0xaf36e7bf,0x20a98c58),LL(0x4f36088b,0xdebbd429),LL(0xcbb98ba8,0x391e4230),LL(0x3091f3e1,0xb3356938),LL(0xd86355bd,0xb1556872),L_(0x000000ab),
+ LL(0xf79ba658,0xb48e1df3),LL(0x3eb15b18,0x5fc03a10),LL(0x3bed592a,0x3591ad26),LL(0x127b78a3,0x07e9d80a),LL(0xc0337c7b,0x349dd74f),LL(0x364ed2a0,0xb1a807c5),LL(0x588d4203,0xecd92cca),LL(0x772a1716,0xf28c1d9e),L_(0x00000183), LL(0xf6fc1df3,0x42d25980),LL(0x8922f157,0x36f0fdb0),LL(0xa583206a,0x8cc1fe47),LL(0xc73f8816,0x1d279801),LL(0xe1b77767,0x7ac8979c),LL(0x3dba6831,0xa98b4836),LL(0x60d40152,0xc7f36b74),LL(0xc3d46c62,0xde52bda1),L_(0x000001ec),
+ LL(0xed4a0395,0x99b5cc1c),LL(0x4cddc23e,0x1d30267a),LL(0x16bee440,0xcd4130db),LL(0x553abd41,0x6652be0e),LL(0x6e659595,0x22061ff2),LL(0xf0c20235,0x72c720f6),LL(0x077f6daf,0x8079b1de),LL(0x1ad9ac77,0x52a9e551),L_(0x00000074), LL(0x6701fea0,0xdd8e0cb1),LL(0x5849b249,0xf395a61b),LL(0xb92466c3,0xc2b702c7),LL(0x77432a31,0xbd7899d3),LL(0x28b4ebc6,0x307f0a10),LL(0x0b06f919,0x5c8246fb),LL(0x7154af20,0x8f032be2),LL(0xc88de5c5,0xd4f96409),L_(0x00000076),
+ LL(0x344eafa5,0x0a16f77b),LL(0x724f29ca,0xdbafe962),LL(0x94bbb419,0x30985479),LL(0x2b2c87d2,0x3775b2ba),LL(0xe0e3814b,0xbd366c77),LL(0x1130e80c,0x7b644025),LL(0xf10ea539,0xe1da2161),LL(0xf66677b2,0xcab81415),L_(0x00000060), LL(0x11454e50,0xd8ab26fa),LL(0x45948446,0x2a4b8bd4),LL(0x35518731,0x34c59cba),LL(0xcc005baf,0xbd4d3f49),LL(0x06c483a0,0xa3e5d238),LL(0xd77da187,0xc4657e79),LL(0xa31fff1d,0x33918629),LL(0x0e898785,0xce7defc6),L_(0x00000010),
+ LL(0xd39844b5,0xc0ae95fc),LL(0x0cd04d32,0x608fd1bf),LL(0x2b33bcf9,0x8e195302),LL(0x3567e13c,0xb9784d4d),LL(0x6f12914d,0xf39a6a6c),LL(0xf4d361ba,0xcf170781),LL(0x366e62a5,0x70b10e90),LL(0xa3bce706,0x4f54bbdc),L_(0x00000091), LL(0x65a7fa0b,0xdf710618),LL(0x93abe742,0x7805a257),LL(0x738295fd,0x76e1d4b4),LL(0xcb5b0f15,0xc121708d),LL(0x716ee171,0x14725b57),LL(0xd2227241,0x2e484d37),LL(0x34400369,0xef0bb7f5),LL(0xebdf59e5,0xe564b505),L_(0x00000082),
+ LL(0xf35d7da4,0x0ee635c0),LL(0x6c91936e,0xdd72a103),LL(0xa9f8eae7,0x2a073b1f),LL(0xff539491,0x6c35942b),LL(0x0a881a03,0x35498b7c),LL(0x67e4af9a,0x59bde411),LL(0xf903d1e5,0x517835ca),LL(0xf0b93b5b,0xf4238664),L_(0x000001ed), LL(0x079d614c,0x550a47c5),LL(0x1c8515d3,0x1f9595ac),LL(0x1557c55d,0xf301c894),LL(0xb5548c2e,0xecc6608b),LL(0x6ed92475,0xf17244f1),LL(0x9b9d35aa,0x9b6083ca),LL(0x82abcca4,0x902eead4),LL(0x45a99fbc,0x489ec5a2),L_(0x00000074),
+ LL(0xc92a2f72,0xb4d59736),LL(0x46a97747,0xec9ee773),LL(0x92e9e427,0x54eed174),LL(0xe62769e0,0xb25c6252),LL(0x26eca3d7,0xb5598a2e),LL(0x72728c2b,0x73ee8036),LL(0x6cefdf35,0x4ee8ce4c),LL(0x700d3d8f,0x80153dd7),L_(0x000000e7), LL(0x2ffb5bc1,0xb8175b8e),LL(0xd9c451df,0xbdb5cc88),LL(0x9445c144,0x846b2eaf),LL(0x92957da0,0x5ff2e582),LL(0x2da50816,0xe7cc1a15),LL(0x4dc70abf,0xe4999b07),LL(0x24220cc0,0x1b3556b4),LL(0xb4413c1d,0x112c52e6),L_(0x0000006a),
+ LL(0xb5ee8957,0x45878f54),LL(0x112fbfa1,0x1879f721),LL(0xe9f0dfae,0xb007f421),LL(0xf113817d,0xeb000fbc),LL(0x35d8e979,0x206151d8),LL(0x0bf9caf2,0x258ab3b7),LL(0x6e8e8e3a,0x92a042db),LL(0x7a4dc496,0x53dcf8da),L_(0x00000112), LL(0x3d64ea94,0x7360c36c),LL(0xbf2b13c7,0xfb77c37c),LL(0x73884c74,0x65a78a55),LL(0x5d8600a0,0x888762bf),LL(0x77475414,0xc8ba0daf),LL(0x975e6be1,0x59f8b668),LL(0x14cf6707,0x185c7c67),LL(0xfef650be,0x043f0a23),L_(0x00000051),
+ LL(0x14dc97d9,0xa3e0a482),LL(0xe962fe1d,0x44364f6d),LL(0x19480b73,0x9ffa10f7),LL(0x28fc88ac,0x7993eaa2),LL(0x8a5db808,0xd4bb9db5),LL(0x4464dfad,0x9088a081),LL(0x903605db,0x86f98ca4),LL(0x87bd4fc7,0x5fb11fcc),L_(0x0000014a), LL(0xba5ec771,0xec2c3e51),LL(0x3078a6cd,0x1ad83e79),LL(0x66717c17,0xad871d3e),LL(0x8530527c,0x0e3f9442),LL(0x92315ca1,0x49c67cb7),LL(0x2fc5cd79,0x4eb1ba39),LL(0x256788a6,0x10b0e6f6),LL(0xb9cd18a5,0xef51548b),L_(0x000000c8),
+ LL(0xd61fb046,0x90213473),LL(0x4f9db0e1,0xcbb6e9b8),LL(0x36fcff78,0x6aa8fb8a),LL(0x7cd5e9d1,0x337a00c4),LL(0x2c2601e9,0xfe8445d7),LL(0xbbab713e,0x0681fd15),LL(0x0b2dd233,0x2151cff9),LL(0x00ab444b,0xf5654249),L_(0x000001cf), LL(0x06de9a88,0xcb8ede52),LL(0x209abe3b,0xe1369e32),LL(0xb711e224,0x53136516),LL(0x533569db,0x59d96525),LL(0x5419656e,0xf2d68025),LL(0x326eee21,0xd59bb004),LL(0x073cca71,0x1cbb722c),LL(0xaa784f93,0x50513866),L_(0x00000019),
+},
+/* digit=10 base_pwr=2^50 */
+{
+ LL(0x51931359,0x672b4b0a),LL(0x14acc3b3,0x78ea42e6),LL(0x22fe0a9a,0xe72784cd),LL(0xc20faf43,0x8f9c3ea6),LL(0x5e49f303,0x4c50987c),LL(0x12d1fb91,0x0c76e9b9),LL(0x96a89b90,0x74dc2b7b),LL(0x238b29a0,0x3a4808de),L_(0x00000076), LL(0xca68ea37,0x06adb168),LL(0x5ecbae96,0xe58dde88),LL(0x4d422e92,0xeba17742),LL(0xa609937c,0x1451998a),LL(0x8f30fc81,0x9eba807b),LL(0xa724c9f9,0x200db6e7),LL(0x651c126e,0xc9db2dc7),LL(0xb58e38f0,0x63ee509c),L_(0x000000e0),
+ LL(0x71e8870b,0x8ea654a6),LL(0xa23dd690,0xc3eb3660),LL(0x673dbdf6,0xa5ddaf70),LL(0x9bbf5d38,0x1e7af5c1),LL(0x0fe1371d,0xcc1eff61),LL(0x1572e30b,0x1308bdd3),LL(0x20ce33cf,0xc60db70b),LL(0x6ab6b3ed,0xbf718e03),L_(0x00000103), LL(0xae357b86,0x3ce6e16b),LL(0x94e06b89,0xa3849b8d),LL(0xb6058ad8,0xacee1675),LL(0x6add0f99,0x39df12ed),LL(0x43cd380c,0x5c645ff1),LL(0x0481e233,0x94a0f618),LL(0xc84b4bf9,0x805a52a4),LL(0x49a710f4,0xe454ce98),L_(0x000001a9),
+ LL(0x99d73698,0x68ebe9cf),LL(0x7fcd4216,0xc625e525),LL(0x4922e8d6,0xe579cc68),LL(0xe272485c,0x58eef2df),LL(0x1aedb9d5,0x6bba0e47),LL(0xf69dbcc2,0x6afac0cf),LL(0xd8f85c14,0x4dfdd56a),LL(0xc7e717e4,0xfa08e4f2),L_(0x000000ae), LL(0x7d4e9483,0x056cb0ab),LL(0x8a2580c9,0xee676f9d),LL(0x031109c0,0x0e2ecd89),LL(0x784c6d24,0xedf27261),LL(0xeac131cc,0xdb6b9edd),LL(0x9428ee22,0xf59f93aa),LL(0x90347b1c,0xd59691aa),LL(0xcb3849d1,0x0b74214c),L_(0x000001ca),
+ LL(0xc42ea299,0x33ae1a32),LL(0xd0ddacf9,0xb43b79b9),LL(0x30561bd9,0x0ad2636c),LL(0x12241370,0xd830def9),LL(0x85a779a0,0xda5f6561),LL(0x28b8580f,0x7e785d86),LL(0x8bafa8c6,0x48ce8b18),LL(0xc75df63d,0x746f16d2),L_(0x000000df), LL(0x5a90afd2,0xc72b304c),LL(0x1b4b2e57,0x40d7dec2),LL(0xe0f45d07,0x3eb94cfd),LL(0xaabbfa71,0xae1b3f10),LL(0x37fa8b4f,0xb080d24d),LL(0x6f6447d2,0x142abdb3),LL(0x20453501,0xfd470df7),LL(0x76e433f8,0xc036f47e),L_(0x000001af),
+ LL(0x1f809e00,0x9eb8b4e3),LL(0x91e1d4a1,0xa399e369),LL(0x9b1aa8fe,0xf15f9651),LL(0x80a83b4c,0xea343c7b),LL(0x1c2fb2b2,0xc40680cb),LL(0x4d003567,0xe7a338fc),LL(0x65bc46fe,0x4519127e),LL(0x3a269638,0x40c08630),L_(0x00000163), LL(0x8811cc38,0xcd6861c0),LL(0xd2e2abb7,0xccb0e7ea),LL(0xce5461a0,0x8c05450d),LL(0x28a458ea,0xeff9ba00),LL(0x51ce8e58,0x3e543072),LL(0x41ebfad1,0xa43fc5d6),LL(0x2acf8a4f,0xc0d63fae),LL(0xd16efc25,0x156cea94),L_(0x00000000),
+ LL(0x0c31be44,0x25c21bb4),LL(0x171af22e,0x91e02b25),LL(0xa0756859,0x87db4292),LL(0xd07cf03c,0xd52aff6a),LL(0xf2199b54,0x476b6c0b),LL(0x4c50edf5,0x1bd465b7),LL(0xdeb36507,0x9e6301c1),LL(0x957f58a4,0x0a904754),L_(0x00000067), LL(0xf73b742f,0x5e9d3550),LL(0x6b92e894,0x419be8da),LL(0xd785e55e,0x95d412eb),LL(0x6018e5bc,0xadbd35ab),LL(0x079447ae,0x5f3359bd),LL(0x21b9bd0a,0xc4db3315),LL(0x5774802e,0x4978d805),LL(0x18a2368a,0x662a2d67),L_(0x0000011c),
+ LL(0xd53479d6,0x5c26f234),LL(0x2d429971,0x107f7e92),LL(0x8c689924,0x334d8841),LL(0x2a5fa3eb,0xe5ebe430),LL(0xc519e325,0xe8291ba7),LL(0xf2242ce5,0x8a0c19be),LL(0x20419cdc,0x804a91ee),LL(0x70dcad32,0xacb0db7f),L_(0x000000c4), LL(0x78a46e2e,0x18b297a6),LL(0x21fc2dc8,0x3ba036e4),LL(0x30517e2f,0x7a021835),LL(0x49f89605,0x19710681),LL(0x84156ac1,0xd61e5109),LL(0x05c42243,0x31ade9f9),LL(0x7b661ab8,0x83c25735),LL(0x22eb398b,0x6193abdf),L_(0x0000012d),
+ LL(0xad081cbd,0x1433b543),LL(0x88d8cd2c,0x94641d24),LL(0x2da0394f,0xd8e36e70),LL(0x48288ca4,0x461fe782),LL(0xa112c8a6,0x6f063613),LL(0xb8624a48,0x77efb66b),LL(0x511d90ff,0x016e8d41),LL(0xce809694,0x5bb229a1),L_(0x000000d0), LL(0x36feced9,0x3ecdac71),LL(0x921f42e8,0xee8e2857),LL(0xe82b293d,0x2c3ef9bb),LL(0x182b25ab,0xac32f4bd),LL(0x297ad819,0x74b598de),LL(0xdd15916b,0xd5e666a5),LL(0x51456a24,0x447be0b1),LL(0x4dc25c5c,0x8726ab79),L_(0x0000003f),
+ LL(0xb1762839,0xba507049),LL(0xed038901,0xdcef710b),LL(0x4b349ec8,0x2489f866),LL(0x37b4ec4e,0x991460d8),LL(0x94e1cecc,0xbf2a63d2),LL(0x33d105a8,0xc7e7415f),LL(0xbf883b5c,0x268241cd),LL(0x2f565fda,0x65d5bd35),L_(0x000001f3), LL(0x8bf3904a,0x8e823f54),LL(0x0c2d77f6,0x06de5eb9),LL(0x2c00d580,0x89b51b4d),LL(0x41ce4b94,0x794caf3e),LL(0x177cd9b2,0x7c62716f),LL(0xfe0ae88a,0xb7e50074),LL(0x4d023907,0x49a489fb),LL(0x545f8faa,0xe82852b9),L_(0x00000070),
+ LL(0x05813dea,0x62545e9a),LL(0xc84039c9,0x70606ec0),LL(0xcdf6907b,0xec7e8e9b),LL(0x2e4e87c0,0x9d6e053f),LL(0xffa08764,0x22a2e351),LL(0xe5b305f1,0x95345fe3),LL(0x65c90711,0x4f24c950),LL(0x139d472c,0xbf685d44),L_(0x00000179), LL(0x9eeab46c,0xac8b67e8),LL(0x267bcc83,0x702c21e5),LL(0x0dac9b29,0xce390fe4),LL(0x60429071,0x6ef71376),LL(0x4a80e0d7,0x47100322),LL(0x0ef6a473,0xdc625a85),LL(0x759024e7,0xea01db5d),LL(0x1e4722a2,0x155020a2),L_(0x0000014b),
+ LL(0x5678bfca,0xb048b1b3),LL(0x5bacba68,0xf518ba8c),LL(0x1626088b,0x7054f024),LL(0xa686c886,0x933a9118),LL(0xbb623954,0x1c3c471e),LL(0xc4da98f0,0xf1b8c9b1),LL(0xa0619dd5,0xaeebf226),LL(0x24b28dc5,0xcbe9fb08),L_(0x00000092), LL(0x47814012,0x49c3a34f),LL(0x1cf06d59,0xfcdcc300),LL(0x6d4a798d,0xe86df54b),LL(0xa1a4dd57,0x1534b80c),LL(0xaf606d64,0xbdfde769),LL(0xde1cbaa0,0x649c3a2a),LL(0xbf6c9950,0x763574e1),LL(0xaaf6f737,0x7fdbd339),L_(0x0000015a),
+ LL(0xf687c377,0xca314119),LL(0x3eacfd33,0x2512d094),LL(0x9c0e1850,0xe55f9fd6),LL(0xc3c6ea7e,0xc20685b7),LL(0x66291556,0x4868b07c),LL(0xb5895337,0xf9f339d7),LL(0x9238a109,0x75d6855b),LL(0xac6af37f,0x78b54491),L_(0x00000184), LL(0x6eb5d5b2,0xe7603bff),LL(0xf7552855,0x8f73b087),LL(0xc19b7320,0xe8f5c0ad),LL(0x55df5442,0xb6aeabd3),LL(0x3a4b8876,0x8dc2b22b),LL(0xf8bca737,0x26f89265),LL(0x3dbb040c,0xfb6645f2),LL(0xb09ab1bb,0x30259f38),L_(0x000001e9),
+ LL(0x9e2dc755,0xea8b03a8),LL(0x5618c490,0xd5d01455),LL(0x01a7a348,0x9622ab8a),LL(0xa6b5c4df,0x9adea853),LL(0x303519de,0xa9b99058),LL(0xb3d0934b,0x0fbd9ea2),LL(0x2cdee030,0xe856d6fd),LL(0xa351d2a2,0x89fdbc8b),L_(0x000001d3), LL(0xea40ff5a,0x4859e663),LL(0x906f2d7a,0x71904b77),LL(0x411180a4,0xbd7ebd35),LL(0xe50b9460,0x0ec190c2),LL(0x2e7f4d73,0x4c9e4aac),LL(0x76a98ae4,0x4323017a),LL(0x7f0e29c1,0x22ea8f39),LL(0x31c71758,0x89d8efe3),L_(0x000000d5),
+ LL(0xcf98bee6,0x54f3df55),LL(0x672d0a69,0xe9759866),LL(0x1addc9d4,0x9c17b622),LL(0x6c819f7f,0xc42650ec),LL(0x6b1209c4,0x6a1aa1b9),LL(0x2b341fef,0xdbcf91bf),LL(0xc99d2b99,0xed76cdf2),LL(0x27467cd2,0x05f190ee),L_(0x00000008), LL(0x64754f19,0xc40615cf),LL(0xb8f1e46f,0x9a8d5587),LL(0x540f1fa5,0x804f7dd7),LL(0x21752096,0x2c95388c),LL(0x9444e15c,0x133319bb),LL(0xb1d5a817,0x29552f4e),LL(0x79fc1cba,0x93730e70),LL(0xcae8a131,0x4445951a),L_(0x000000dd),
+ LL(0x88863b50,0xbfdb676e),LL(0xb9545954,0xfcfc0194),LL(0xe74bedd7,0x888694d2),LL(0xe59a14c4,0x236680d1),LL(0x4cd674c0,0xacdf13c1),LL(0x52151e94,0xcdbecfcb),LL(0x6a28bc34,0x641d77e2),LL(0x6293af48,0x38e4eee3),L_(0x00000057), LL(0x2e8f361b,0x67004141),LL(0x39634681,0x5db1f02f),LL(0xf975c602,0xe645bd3a),LL(0x8b39a53a,0xfafccb60),LL(0xa58e37f9,0x33ab2637),LL(0xcf611fd4,0x8b8cc6bb),LL(0xe7f89e7f,0x28eb10f6),LL(0x5f527820,0xfdcde1d1),L_(0x00000151),
+ LL(0x9411ca0d,0x92267e14),LL(0xb385c8ea,0xbbfcc2ab),LL(0xbfd56d29,0x34b29656),LL(0x5f2180a7,0x06f72807),LL(0x6dc34000,0x02310437),LL(0x854af754,0x1bae73e6),LL(0xbc753242,0x06a8d2dd),LL(0x11770a34,0x9848b3d7),L_(0x0000011f), LL(0x14476594,0xeb8cb497),LL(0x6ba99aed,0xc86324ad),LL(0xc49863ca,0x8a316428),LL(0x2e5cfc3d,0xcb62d82a),LL(0x79adc3e0,0x9e5f3fda),LL(0xcaddeff7,0xb4f990b6),LL(0xae15a98e,0xb9b0e410),LL(0xedf394c7,0xac6cb00a),L_(0x00000171),
+},
+/* digit=11 base_pwr=2^55 */
+{
+ LL(0x20c391c2,0x96d1c5f4),LL(0xeaef76b3,0x6bb17f5e),LL(0x7feb16a1,0x3f16a57b),LL(0xcc801552,0x4aadf126),LL(0xcded6e6d,0xe23393c9),LL(0x6848f602,0x2c8dbcb3),LL(0x49f3a9ae,0xf811e23c),LL(0xc0c1ebfa,0x27162730),L_(0x000001e5), LL(0xaf1b88cd,0xb4c22029),LL(0xaa7f22fc,0x9624d6d5),LL(0xbb120735,0x416db935),LL(0xa8308449,0x85fd3219),LL(0xc467f9f1,0xb4d3e00f),LL(0xa69d57d8,0x187052a8),LL(0x0528c91e,0xb79e6638),LL(0x2a603bc9,0xb4ac37a4),L_(0x000001ab),
+ LL(0xca26efe1,0xa3ad38a0),LL(0xf5cd529d,0xec34abea),LL(0x94808b1e,0x27c847ac),LL(0x87ade961,0xfa6df215),LL(0x6a43fa8c,0xbcfdb5ad),LL(0x947fbb39,0xdd4d0c9f),LL(0xbca687c5,0xe8772a4e),LL(0x7d79e215,0x9fc12922),L_(0x0000008e), LL(0xbf926e1c,0xb04fbc5a),LL(0xb9c12ffd,0x34707ba5),LL(0x4ee8c89b,0x81aa347c),LL(0x367a152d,0x4cd56572),LL(0x74511a3a,0xa6642939),LL(0xd0e3b8f1,0x60ea13e9),LL(0xee14ab42,0x81a19a28),LL(0xea76ba4c,0x96065d5d),L_(0x00000103),
+ LL(0x6b0c75c4,0x23a4b0aa),LL(0xdb181c23,0xdc940ab7),LL(0x7b70983d,0x328a76b8),LL(0xd5b473a0,0xadcb9bcd),LL(0x3863dc05,0x646b4949),LL(0xe5090fd0,0x0b996e3d),LL(0xd0261360,0x7c332b20),LL(0xcc6b2f86,0x415e4fc7),L_(0x00000009), LL(0x28cd5819,0xf08cb2c4),LL(0xfbdf661a,0x9b1c2455),LL(0x2be7d7be,0x38fbe0c1),LL(0xbd91e037,0x84e69e29),LL(0x1cdba496,0xc6f94abf),LL(0xa8445728,0x8e9508e3),LL(0x4a144f07,0x8ee0e340),LL(0xc5b72f6a,0x80119066),L_(0x00000075),
+ LL(0xaff1e1b3,0x87421ab9),LL(0xbbfcc6da,0xa3305ebd),LL(0x4b75a8e1,0x8f4cb778),LL(0x4410056f,0xb5abdc6a),LL(0x4ff65612,0xd83f32f5),LL(0x21c44b1c,0xb989d251),LL(0x80a7bb1f,0x5214abed),LL(0x8f200e11,0x5e3475ba),L_(0x000001fc), LL(0xf4fb8525,0xf5f23c02),LL(0xaa8e02a4,0x405911d9),LL(0x45abb8b1,0x7a6dae03),LL(0x4834d14e,0x4621957b),LL(0xeb31fdc5,0x7cbf9b75),LL(0x26ee5dca,0xee84304e),LL(0x37349cc1,0xcc6a2c7d),LL(0x5a34c3af,0x740fffc8),L_(0x000001ac),
+ LL(0x9f122c9e,0x71cfc92d),LL(0x9c6ec42c,0xb86c84b7),LL(0xc8d12bf6,0x1c821b85),LL(0xe8432cc5,0x197e0f04),LL(0x4258bc34,0xc4f03c70),LL(0x60ae518c,0x811512ff),LL(0xf050c9b8,0xe8038335),LL(0x0b215595,0x84b70af0),L_(0x00000078), LL(0x423ac4f7,0xb15c3155),LL(0x2fd13662,0x7684c454),LL(0x5cf8078d,0x1a7bfb14),LL(0x2b928e98,0x1d05b843),LL(0x3bbf2a85,0xeeb1e658),LL(0x356da90c,0x179bc7a9),LL(0x11d26c87,0xf524843e),LL(0xf4159e0d,0x47c538ec),L_(0x00000128),
+ LL(0x08cefac8,0xb1885068),LL(0xe8422939,0x5985dd6e),LL(0xab14cf0e,0xcda94a64),LL(0xc27af983,0xd127851a),LL(0xf24f6eaf,0xbab20f8f),LL(0xda3b25d8,0xa549d9c6),LL(0xed810bd4,0x5bf18f37),LL(0xf630e4c9,0x14bb2655),L_(0x0000018b), LL(0xae18594e,0x52697460),LL(0xf8de9d89,0xaec56660),LL(0x294777cd,0xe3a93a39),LL(0xf7dc98fd,0x63fcc0bd),LL(0xc0c53dc3,0x5d2c2708),LL(0x55da9198,0x3692d050),LL(0xebcde249,0xcdc4d312),LL(0x8d0017f5,0x5aeda0c1),L_(0x000000a3),
+ LL(0x1d9471ec,0x737ba42a),LL(0xd3401c6a,0x33fd5fca),LL(0x3c2758a5,0xb016b83f),LL(0x79b1c693,0x3409d0d4),LL(0x5f80d853,0x4f2a7005),LL(0x4d1634ee,0x799e106c),LL(0x1e92ef70,0x632dcd5e),LL(0x86232632,0xb8cf2e87),L_(0x00000008), LL(0x1acab1e2,0x92c31a31),LL(0x91455009,0x740223dd),LL(0x15a695ed,0xa95f341b),LL(0xe601b98b,0x17db74b3),LL(0x19ccbb77,0xd916a466),LL(0x44573d27,0xc31a7a19),LL(0x093c0363,0x1bb20e06),LL(0x6715c5f0,0xc4532de7),L_(0x0000000c),
+ LL(0xa1a3f86e,0x2df7ec8e),LL(0xf1f8f7f3,0xd8551991),LL(0xb16ec397,0xbc80f4ee),LL(0xebe5be1a,0xa1e6cbf5),LL(0xaf8233b8,0x5c403702),LL(0x41483767,0xbf97ecb0),LL(0x2899a5cc,0x58655568),LL(0x0720d399,0x092de028),L_(0x000000bf), LL(0x88312054,0xd550df72),LL(0xf87e274d,0x193eb1e2),LL(0xa715c43f,0x97773656),LL(0xcb67dce2,0x8a585c6e),LL(0x0aacb5db,0x6332fcd1),LL(0x4f16d92a,0xdeebccba),LL(0x2b8001ac,0x8936c8da),LL(0x7b627657,0x4f5f2781),L_(0x000001b8),
+ LL(0x8d63a794,0x35fd304e),LL(0xdd225fc9,0xa6aae952),LL(0xc40c9b7f,0xd5054f16),LL(0x42316d8c,0xf663b3dc),LL(0xb3d7abe3,0x13c94097),LL(0x7aa82bbf,0x78263190),LL(0x2a622ce8,0x819c0b14),LL(0x2b1dba5c,0xcf88a41a),L_(0x00000049), LL(0xe69bb850,0xdf7bd8ef),LL(0x985f2ed6,0xc76c2599),LL(0x44f156c5,0x46e2c0c0),LL(0x7cfc49ae,0xf5fb07c3),LL(0x6f59a7a0,0x2f48e451),LL(0x1b89eefd,0x88119cbb),LL(0x1c41ec61,0xa18666db),LL(0x53014a3d,0x4b3591f0),L_(0x00000078),
+ LL(0x792d6d08,0x4d84ecf1),LL(0xe0110c24,0xc93fa7f1),LL(0xc72b1bb4,0x908f695c),LL(0x1730f1b2,0x8d0bc692),LL(0xdb0b36b3,0xe4bf469c),LL(0xa1db29c0,0x1d41428d),LL(0x7a577f2c,0x2cd1253d),LL(0x23b65522,0x07ab206a),L_(0x0000009c), LL(0xa4ba5fbd,0x9808ec8a),LL(0xa5383520,0x49718327),LL(0x2c210a5f,0xdc5bb249),LL(0xef53e1db,0x7e38e02e),LL(0xc9d3c171,0x7b41e983),LL(0x3a07d487,0x2d8aedea),LL(0x6c0e3ba1,0xa17e058b),LL(0x22c8be6d,0x7c63dfd0),L_(0x000000fd),
+ LL(0x6a5713b6,0xac6235d1),LL(0x19855a0f,0x32d1869e),LL(0x093a8212,0x8afdb213),LL(0x89861196,0x3402ba32),LL(0xb3676c48,0x5e54b89e),LL(0x53597329,0xbdde3064),LL(0x94cdc873,0xc3d273b6),LL(0xfd911ed5,0xa0110df1),L_(0x000000a2), LL(0x0d98f860,0xf6cf3683),LL(0xa681e586,0x6f5c1e3f),LL(0xc6905825,0x7d626d06),LL(0x571b75e4,0x00a44322),LL(0xf9fe1aa4,0x34ece73d),LL(0x3975b815,0x38add31a),LL(0xfa3db092,0x499ecb33),LL(0x2ce86fab,0x9eb9f7bf),L_(0x000000cb),
+ LL(0xf5870ab9,0xa353002c),LL(0xa12da044,0x6150f34f),LL(0x0086b83e,0x69e6eea2),LL(0xa2cdf131,0x5e80e0a0),LL(0x528616b2,0x2d13e0cc),LL(0x4a67c598,0x9702e01a),LL(0x83d6e661,0x15b60ef1),LL(0x6f9172f8,0xd6247a1f),L_(0x00000115), LL(0x7b2b5776,0xe6acc547),LL(0x055811a0,0xba422b24),LL(0xa9873020,0x8c990991),LL(0x310acf2c,0x96459d45),LL(0x78701ea7,0x917c30ec),LL(0xd1688c83,0xdb51be44),LL(0xb42ce9e9,0x0b514c3b),LL(0x0b03fd87,0x0c8ed48d),L_(0x000000c7),
+ LL(0xbcc82868,0x69816459),LL(0x580f7a11,0x9b94ac07),LL(0x11b4de1d,0x120451de),LL(0x8f21a7aa,0xc048b454),LL(0x0f6b490e,0xca8d647e),LL(0x5d0f4e1d,0xf1f7c090),LL(0x3e12d889,0x1ad27c80),LL(0x5b341256,0x381024e5),L_(0x00000161), LL(0x35f1970a,0x4366eed0),LL(0x1134e984,0x55c0352d),LL(0x7ea259fe,0xfad7d83b),LL(0xda4dcbce,0xdd5f6008),LL(0xb2924c78,0x01b25214),LL(0xac404086,0xf325f997),LL(0x2b613948,0xf37e21a0),LL(0x26e31be0,0xf87b2cb4),L_(0x000000bc),
+ LL(0x017edbd6,0xf483d72a),LL(0xb08491c6,0x58a225c5),LL(0x568a7e71,0x7fde8697),LL(0x821bf73d,0xef4bc022),LL(0xec765e3a,0x8d1daf2f),LL(0xb59a1d2e,0x72d486e7),LL(0x1edfc037,0x2a595f95),LL(0xf1683f88,0x9376cfff),L_(0x00000081), LL(0x55fc5381,0x96f30cc5),LL(0xc6ce2141,0x76a3af64),LL(0x339f5668,0x5449bfff),LL(0xe438adb5,0xf3c48dff),LL(0x1aa59ae8,0xce59b544),LL(0xc0fd6c57,0xb7bdc7b7),LL(0x8e51d10e,0x973b8e1d),LL(0x6427d578,0x99827d6a),L_(0x00000098),
+ LL(0xe76cf424,0x4eac44ab),LL(0x559e7a5a,0x0ddf44f2),LL(0xc58d75d8,0xfb0d499a),LL(0xab62039f,0x6cf6c677),LL(0xd4e76825,0x2e427953),LL(0xa955fdca,0xe1d73f88),LL(0x049f7f5d,0x89dc4a2e),LL(0xd5493485,0x3b5c3f5a),L_(0x000001ec), LL(0xa5dc86bb,0x2a75769b),LL(0x606d9e57,0x550fb22b),LL(0x260bcabb,0x7bccdd84),LL(0x2e3ee7a3,0xc4b6b979),LL(0x03bd7f7d,0xfc3349bd),LL(0x122b5333,0x95f84290),LL(0x4bdf7095,0x3057b4f5),LL(0x6af3cf31,0x5d341e22),L_(0x0000015b),
+ LL(0x1d055192,0xf272a08c),LL(0x343f766f,0x142d545c),LL(0xb8bd86e9,0x860ef117),LL(0x60c69c66,0xb6de931c),LL(0x1b54e53c,0x9924f2f5),LL(0x878c0c9b,0x0b949095),LL(0xfba7e2a3,0x6916f5f1),LL(0x7da79c3a,0x9166a581),L_(0x000000c9), LL(0xe06ad6ba,0xd551de11),LL(0x3b3cbbe6,0x6c45d4c3),LL(0xcc4aa553,0xe3c9e3df),LL(0x1bb5c238,0x05a1e382),LL(0x8dfc012d,0x84d8d463),LL(0x3b856506,0x05b7e241),LL(0xcdcfd8e8,0x27718949),LL(0xc1a85e66,0xab32f2ef),L_(0x0000017a),
+},
+/* digit=12 base_pwr=2^60 */
+{
+ LL(0x0af6a9bd,0xdca0a6cc),LL(0xfe5f904b,0xd9e6d336),LL(0xd87d0339,0x3b8c9d8b),LL(0x4d463bab,0xfb629c3f),LL(0xc203e46d,0x4ea62ed4),LL(0x998a0ef3,0x64035458),LL(0x62783285,0x7769592c),LL(0x3c56ebb3,0xb1cb181b),L_(0x00000013), LL(0x259a17aa,0xd51ce441),LL(0x8666df8e,0xc62b1c65),LL(0x437c7966,0x74db6999),LL(0x0fecb364,0x7c60998f),LL(0x1f725b1f,0x71fdafc2),LL(0x5b56396c,0xa547fb5a),LL(0x9d888686,0x0f566ae7),LL(0x130033ff,0xd990e0f4),L_(0x00000172),
+ LL(0x12a6c73f,0x66164319),LL(0xfe4c8bf4,0x9c6ffbd2),LL(0x42f313ec,0x2869e4fd),LL(0xf8b100ba,0xbae712b9),LL(0x0e18229b,0x61a1f1da),LL(0xffe55501,0x032c80f2),LL(0x3bfaa0e0,0x48f0b1d5),LL(0xb83c7607,0x49fa235f),L_(0x00000083), LL(0xa0ed3335,0x8b3c031f),LL(0xc141575b,0x53c30e33),LL(0xfa62217c,0xf9f945a8),LL(0x8b667de4,0x889399aa),LL(0x7c4952fb,0xb711abc7),LL(0xabedb6e3,0x59e7e12f),LL(0x5a1b2cb9,0x1857ebfe),LL(0x4206e243,0xef43f534),L_(0x00000079),
+ LL(0xa95f9c5a,0x0d937115),LL(0x2ee0eb80,0x4b1412c8),LL(0xdf5a5904,0xe6f39cf3),LL(0xcd50327e,0x9a796b16),LL(0x0841dfd1,0xc493ac5c),LL(0x19d15d79,0x7275eb23),LL(0x4b9d4479,0x1a3b6feb),LL(0xe1eb10df,0x3bcfa542),L_(0x00000060), LL(0x7551bac5,0x7a907c78),LL(0x232dc783,0x82e7d67e),LL(0x5acaf222,0x5ebc3c22),LL(0xe17100c9,0x62250256),LL(0x3198b234,0x4beb3ba2),LL(0x16986b8a,0x492d3035),LL(0x973e4135,0xfcc0dd28),LL(0x2e1155d6,0x2fe7131b),L_(0x000000da),
+ LL(0x1f14d7bc,0xe951da15),LL(0x3d397c45,0x3964143f),LL(0x24be6549,0x2e556c9c),LL(0xe1293e25,0x3aed330a),LL(0x4bfda40e,0xdf82159a),LL(0x3b13e72c,0x514f7b17),LL(0xa5b859ff,0xe20684bf),LL(0x90812f67,0xed303fce),L_(0x0000009b), LL(0xbca9abf7,0x3b0b3a0f),LL(0x72194a82,0x11d27090),LL(0x17f5564f,0x9bbb7a7f),LL(0x87f0af99,0x96c01479),LL(0x69d62017,0x45cce25a),LL(0x0c43d35c,0x26584337),LL(0xcbff6e89,0x19a55401),LL(0xb503e2ea,0x4184b0ea),L_(0x000001d3),
+ LL(0xaecaabc4,0xdeccde50),LL(0x9ffdf34c,0x395d2404),LL(0x25068e1b,0x40559189),LL(0x93fb9ea4,0xd141ad3f),LL(0x2a60ba95,0xc42f76f0),LL(0x414a5981,0x946bf800),LL(0x138c47b5,0x38435023),LL(0xf314147e,0x9aa25f3c),L_(0x0000016b), LL(0xe38bdcc6,0x3cebd917),LL(0x0966bac7,0xc3533788),LL(0x2718c3e8,0x33ee6ede),LL(0x10236ae8,0x4f5b88fd),LL(0x44797bb1,0x485e76bd),LL(0xb2b31296,0x68194c12),LL(0xe45112ba,0x0cb75dc1),LL(0x8574000b,0xc33c7dd8),L_(0x00000135),
+ LL(0x8f37d315,0xf77a65b3),LL(0x37731160,0xde279622),LL(0x6f06ae65,0x87ebd334),LL(0x25b38b15,0x2a1d2c7a),LL(0xa55c6b9f,0xb1687394),LL(0x0ccf2f34,0x4f27c66a),LL(0xecf3de75,0xa9866c84),LL(0xa4a0f4aa,0x44979b4d),L_(0x000001dd), LL(0x0366dd8b,0xbfeaeff0),LL(0xfe941121,0xa80b5c3b),LL(0xc3fed2fa,0x18a5b6a4),LL(0x23dfdf47,0x2ef007c6),LL(0xdb0791d2,0xcec61c6b),LL(0x6d79949c,0xe328d9cc),LL(0x0d03e696,0xaa14a153),LL(0xfdb36710,0xffd70d45),L_(0x0000011b),
+ LL(0x736dcfa6,0x77e26493),LL(0x6af49ff9,0x089ee4ac),LL(0x1720bd71,0x2f3b86d6),LL(0x48d2c5df,0xbcc66a78),LL(0xd78e07af,0x1f230a9e),LL(0x077a7ceb,0xd2f61bf5),LL(0xfbf99e70,0x92770c3f),LL(0x7ae5f084,0x1a79a148),L_(0x00000035), LL(0xa6ee44c4,0x990f4f03),LL(0x4aacbd8f,0x45377427),LL(0x0ef447b6,0x55b5c873),LL(0xe02e661f,0x11e65ae5),LL(0x99f13f10,0xfe17d3ed),LL(0x393cf4c8,0xdbeb35dd),LL(0x23277110,0x65a7d1cd),LL(0x444802cd,0x8532c3fb),L_(0x000000c9),
+ LL(0xea71a842,0x4c057a1d),LL(0xfc8fb859,0xe1689c80),LL(0xadc9a8e1,0x09c22f52),LL(0xc47b8163,0x0a960c99),LL(0x90c495f0,0x0a0f356d),LL(0x88242e20,0x87494b79),LL(0xb7f9ca6a,0x6fdcd587),LL(0xd76d2c39,0x43fae9c4),L_(0x000001ec), LL(0x1e35970d,0xaee47a26),LL(0x8df13449,0xadfd394c),LL(0x67553f2c,0x71cdfbec),LL(0xa43c6154,0xf09db2ac),LL(0x4606556e,0xf2e04011),LL(0x12eca225,0x9dfb28da),LL(0x87a4c839,0x28812bc5),LL(0x8cba8984,0xd9e2b1ab),L_(0x000001ad),
+ LL(0xcb554ab1,0x3446834e),LL(0x21810284,0x2ab359a6),LL(0xf95fa59b,0xf33f9ef0),LL(0x16db657d,0x0f8d940a),LL(0x38fe2897,0x39b668bf),LL(0xdeba7f4c,0xc6452278),LL(0x7471cf19,0xb96dd1e3),LL(0x732f77c2,0x0834711b),L_(0x00000092), LL(0x745c3f1b,0xbca782f9),LL(0x8bd5ef13,0xc4e21488),LL(0x8211733f,0x8f6c1b78),LL(0x50b780cb,0x4b628b50),LL(0x1a1a0206,0x78e4de6a),LL(0x44975c37,0xf9f51865),LL(0x6ef7e616,0xbadf032d),LL(0x3882a9ad,0x821f6884),L_(0x000001f4),
+ LL(0xe84ad756,0xf2f7ceab),LL(0x6545847a,0xfb04aded),LL(0xdd4cb1ba,0x87083ecc),LL(0xf4c8bbb0,0x452249b7),LL(0x6531b732,0x868536ed),LL(0x6968e15d,0x1d0209ca),LL(0xf0285aff,0xfaefc194),LL(0xbed23705,0xa154b4bd),L_(0x000001c9), LL(0x3ea47ce4,0x69374c35),LL(0x2a6d8757,0xdc6375ee),LL(0xc6f768ea,0xaeba5bab),LL(0x327c743e,0xda6790e0),LL(0x9a01ae4a,0x1a9de4f9),LL(0x3ae6cb85,0x9ac5b7b3),LL(0x6d32a174,0xf134b615),LL(0xdf38a0f3,0x136a4fec),L_(0x000000c9),
+ LL(0x688d2325,0x79db6c85),LL(0x5359ff24,0x764f954a),LL(0xc7801c4a,0xfa78e8b8),LL(0x098ede82,0xb52cd1ab),LL(0xd34f03a8,0x66adb2da),LL(0xcfcfe244,0xfc69d130),LL(0xb5e52304,0xf88483bc),LL(0xab73db68,0x38339bc7),L_(0x000000fb), LL(0x077d01af,0x7eb9fb07),LL(0x8abf2d7a,0xcb62a0d5),LL(0x37a4ecbb,0x1a28e347),LL(0x06b68356,0x35c05ae1),LL(0xadaac01c,0x2f3d8c6e),LL(0x712aa1f3,0x9ee5907c),LL(0x69606236,0xc9bdbb2c),LL(0x7b2e6894,0x1e267011),L_(0x00000045),
+ LL(0x09d420b2,0xccc993bc),LL(0xa3ad7d2a,0xd8b3ee97),LL(0x7986ac14,0x59fa9e76),LL(0x95dc5774,0x9477b42b),LL(0xfbe8e9d7,0x89d7ab26),LL(0x79b03712,0x017b7f94),LL(0x77f9bdea,0xbd8dcef1),LL(0x7a238609,0xb9973bfe),L_(0x00000018), LL(0xaee002b6,0xcdfc127c),LL(0x23640ec5,0xad2abcbc),LL(0xc6dc5bd5,0x05982646),LL(0x20400061,0x3c1c6b9f),LL(0x6ee16a76,0xc943d1fd),LL(0xd619a75d,0xd16a85f5),LL(0xa278715e,0xd8747be6),LL(0x34ec8668,0x3ff993c0),L_(0x00000037),
+ LL(0xcec9be5b,0x6f5e16ec),LL(0xfd62380c,0x192223b1),LL(0x27bda6fd,0xe1e75d7c),LL(0x0df8a788,0xd01bccf4),LL(0xbeed1a6b,0x6611a8ed),LL(0x01402436,0x17838dc7),LL(0x7f189fd3,0x615a507f),LL(0x760bd862,0xe4e17352),L_(0x000001b5), LL(0x791dac6d,0x2bb5aa65),LL(0x0457b859,0xece0f798),LL(0x1a8af3a8,0xde75b69f),LL(0x6625db63,0xcf064060),LL(0xeeda55fc,0x0d8f8c69),LL(0x05536430,0x27c6a431),LL(0xb1dc58b1,0x56c1ac3a),LL(0x0c1a1dab,0x1e026aae),L_(0x00000012),
+ LL(0xfb73e1e4,0x0f973c1b),LL(0x6977f355,0xca40d04d),LL(0x2797e4c7,0x01c089b0),LL(0x1b05804b,0x0064b701),LL(0x7b76fc1d,0x9677da0f),LL(0xb0b47105,0xd02ba9e2),LL(0x4fb9b758,0x6b2435ea),LL(0x2fd704c2,0xd08297a6),L_(0x00000031), LL(0xdc19942f,0x4734e848),LL(0x366f685b,0x6b9e935f),LL(0xb3827f30,0x81e91d77),LL(0x4cce7910,0x36ada690),LL(0xcb031a95,0x227eb763),LL(0x6ac3a0f0,0x527fc0d3),LL(0x7b60ac80,0x404eb0f3),LL(0x2c62b4f1,0xf1c63ec9),L_(0x0000004a),
+ LL(0x95cf6b06,0x69fd4f1d),LL(0xbdef736a,0x9044b8ce),LL(0xd7e44ee1,0x546a5d1c),LL(0xe3ac270c,0xbe0ace78),LL(0xe59e1538,0x27b93218),LL(0xe51fc4ac,0xf26796fb),LL(0x71f9328b,0x9137cac1),LL(0x07a55147,0xbda08657),L_(0x000001f4), LL(0x9ce1532c,0x37d59c98),LL(0x2c0e5b9e,0x62f632e6),LL(0x55146f87,0x29fd2249),LL(0x402150dd,0x12ea0f69),LL(0xf442153e,0xfa397b38),LL(0x9b5cefd9,0xc5ad174d),LL(0x8cae5294,0xb46b9f16),LL(0xcd8b0a60,0x773343a7),L_(0x000001db),
+ LL(0x1e614695,0x71344edf),LL(0x2b4a50c1,0xb3013081),LL(0x4896c770,0x2cf314a1),LL(0x96a68659,0x90053fe7),LL(0xd79226d8,0x5847ac79),LL(0x3ada869a,0xf60993a8),LL(0x7d156a5c,0x67e4b5fe),LL(0x7850cdf6,0xed437add),L_(0x00000084), LL(0xf35bcbb3,0x4e2d6021),LL(0x9877f0a3,0x90be9398),LL(0x4d6435bb,0x86130340),LL(0xe5919257,0x2710c007),LL(0xcc99d199,0x87d3586c),LL(0xc1451c79,0xe8681c58),LL(0xfa896da8,0x6659a487),LL(0xb1a9e543,0x67bd49a8),L_(0x000000bf),
+},
+/* digit=13 base_pwr=2^65 */
+{
+ LL(0xfa295332,0x0b259ba7),LL(0x94f8c958,0xa4092fea),LL(0xbe9d56f6,0x622efd38),LL(0x0f2ba425,0xa4d25a72),LL(0x57c0adb2,0x2498a9ea),LL(0x11f11875,0x893bbb4d),LL(0x195ec41d,0x2f56b02f),LL(0x2ad72c4b,0xe7bb8bca),L_(0x000000e7), LL(0x0fa4013f,0x521f983a),LL(0xebae7f17,0x5292b2f1),LL(0xdebce289,0xd6d75002),LL(0xb6cd203a,0x93bfe503),LL(0x3c3592c9,0xa40b351b),LL(0x180f5400,0x9b6bafed),LL(0x291283ae,0xd4d6a9f0),LL(0x036cf95d,0x6e0c1563),L_(0x00000035),
+ LL(0xa8cfa5a9,0x33878665),LL(0xa5401cc3,0x809b2a4b),LL(0x6cdc3f0e,0x90d9594f),LL(0x9bbfac67,0xd551d6e9),LL(0xfd836074,0xe874e847),LL(0x13f89d9a,0x264b3b0b),LL(0x7a6ec5fa,0x0a3ac51f),LL(0x6dd250c6,0x6ed0021d),L_(0x000000bb), LL(0xd1e14aba,0x7c3196ca),LL(0x1495ef12,0x78a62924),LL(0x0cbcf8af,0x1f4ded5d),LL(0x83d56ec3,0xfa54b15b),LL(0xcc6ef029,0x6f0a12c6),LL(0xae62cc51,0xce830e11),LL(0x964fd2d0,0x88747fe9),LL(0x56076a32,0xe8f7bc67),L_(0x0000014e),
+ LL(0xb73d3d92,0xc668cfa4),LL(0xda69c4d9,0x97ee2907),LL(0xbf4c3402,0xbf5fb743),LL(0x4034c59c,0xd60ae9cd),LL(0x99bc4b73,0xda82be72),LL(0xda1f7664,0xe3800a84),LL(0xfb007b67,0xb7700f12),LL(0xb546161e,0x1386e882),L_(0x0000011f), LL(0x4be150bb,0xfc5d0def),LL(0x660c9122,0x1ba0f43d),LL(0x3a5b4550,0x7224e926),LL(0x33c24e5b,0xba92b4ef),LL(0xd249e1b7,0x2b1856c8),LL(0xb2c9aa15,0x5fe68108),LL(0x6e540179,0x2fe766ae),LL(0xa379f58c,0xecd72903),L_(0x000001a1),
+ LL(0x4d5341f2,0xdff5ad0b),LL(0xbb141c66,0x6270a82e),LL(0x7912e413,0xfc62897d),LL(0x6b16ad87,0x348f2e6b),LL(0x0fe7c18f,0xae57af6d),LL(0x2f22a03b,0x6d2d6ab0),LL(0xefa7a28a,0xd717c3e7),LL(0x73423958,0xe64f19c6),L_(0x00000065), LL(0x0b4f0f2c,0x8c6c9219),LL(0xa884b55b,0xaff1be7f),LL(0xde74b331,0x8882c375),LL(0x7a676c7d,0x57c355f3),LL(0x71190b6b,0x180dbbfa),LL(0x599b9c95,0xd7dc77b1),LL(0x8f766481,0x227eba11),LL(0x840229ee,0x3dabc4aa),L_(0x000001c9),
+ LL(0x5d79f380,0xaa1f8835),LL(0xe2b5d59c,0xf1a96e2b),LL(0x281ece14,0x146a87f9),LL(0xb65f19cf,0x24f845c5),LL(0x2f123e45,0x9418bddf),LL(0x90bcee98,0xb6ea99d9),LL(0x64b9ae2d,0xd147e8b2),LL(0xda89ba61,0xf40e6b8f),L_(0x0000014d), LL(0x53c9380f,0x31e35563),LL(0x7d832bdb,0x7117919e),LL(0x5906fec2,0xbdd97ce8),LL(0x069087de,0x015486f6),LL(0x866bf3e5,0x909fd1d8),LL(0x1d61be88,0x770d7f9e),LL(0xa28b013b,0xe7653682),LL(0xddec12fa,0x6232ac60),L_(0x0000006d),
+ LL(0x38819383,0x0ad9906f),LL(0x9f83225e,0x089577d6),LL(0x8e97694b,0x264428ce),LL(0x0c33baa6,0x1bf2f80c),LL(0x0823ef0c,0xbf31819a),LL(0x2e4750ee,0x66c7b596),LL(0xd160d5df,0x886455a6),LL(0x575835ea,0x662cb270),L_(0x0000006f), LL(0x3c424c86,0x240ffedb),LL(0xd1be1d89,0x3c874c88),LL(0xed147fb3,0xccd38c51),LL(0xbbd7bef5,0x10af1392),LL(0x101c8dcb,0xd85a000f),LL(0x018793c4,0x0b435263),LL(0x24305a2a,0x989d12cc),LL(0x9c061ca0,0xa4553f3e),L_(0x0000005f),
+ LL(0x9a069590,0x8dfc3414),LL(0x1912aeb6,0x0b37df44),LL(0x1e30b3df,0xcbe1989a),LL(0xaf9f97dc,0x415de022),LL(0x4e406185,0x01cb0277),LL(0x2eb58373,0xbb545160),LL(0x0ab0a19c,0x1e53639f),LL(0xeecdb49f,0x1d63db69),L_(0x000001de), LL(0x2a5d2526,0x8e8397e0),LL(0xa679b16d,0x44c0a296),LL(0x7dcafbf3,0xee3f4022),LL(0x668a1c15,0x2ca74425),LL(0xea786663,0x4906d981),LL(0xda4fa2cc,0x0bbbb1fb),LL(0x21224a70,0x8859a117),LL(0x8ec6a6f4,0x1d1581ec),L_(0x0000019b),
+ LL(0xf1507b4b,0x4574b533),LL(0xb56c3906,0x76eaa707),LL(0xa9532376,0x16e5e98a),LL(0x611c9b67,0x12d9a934),LL(0x9eb6a261,0x8430b478),LL(0x3fab6e06,0x50fd9610),LL(0xd215cdde,0x1d509b62),LL(0xc4da786d,0xcdfc10b7),L_(0x0000007b), LL(0x752a0af8,0x3ebf635e),LL(0x680f5838,0x9175f3f7),LL(0x9f1a0d87,0x861b999d),LL(0x04cce1e2,0x75ef231f),LL(0xe86e6afd,0xaf7240e6),LL(0x04734476,0xe887f56c),LL(0x2837e095,0xc194ba35),LL(0x9e3dc524,0x97c14f46),L_(0x000000dc),
+ LL(0x9a9802d3,0x4d7d0f39),LL(0x0345d8d7,0x5e5fc037),LL(0x6923910c,0x0187070a),LL(0x5e15ce92,0x3e13ac42),LL(0x456e81c2,0xcc3c7cbf),LL(0xfc527716,0xcd65b4f8),LL(0x5fd7c9e9,0x305c5c1a),LL(0x4af9f3b6,0x023984a4),L_(0x00000196), LL(0x1b64c99c,0xc01b599b),LL(0x38f68420,0x53fbc68b),LL(0x1b40d8c5,0x91c4f402),LL(0xe87107e9,0x0e78fd77),LL(0x96fc64fc,0xf13016cf),LL(0x438fbd69,0x59324677),LL(0xa8e5ff95,0x50792eee),LL(0xb6a73a20,0xf0ee755c),L_(0x00000074),
+ LL(0xb1979059,0xaa4d1038),LL(0xf13725c9,0x5751fd0c),LL(0x22f3e709,0xe1b98f3c),LL(0x131dbcec,0x8e66976f),LL(0x64116cc1,0x2dc36526),LL(0xf955db38,0x6f94eedc),LL(0x6bee8490,0x2dc08c31),LL(0x65ce87a2,0x73c1c8c0),L_(0x0000016b), LL(0xf8a59cff,0x9035a740),LL(0x328c1388,0x61a4c1b8),LL(0x1625b5b4,0x8b1931b4),LL(0xf35b9bbd,0x075bce63),LL(0xfb1707dd,0x7a601744),LL(0x232aecf6,0x50241612),LL(0xa974c9fd,0xf1cae8d5),LL(0x7f4ba9ea,0x7ae0d836),L_(0x0000012d),
+ LL(0xe7c06e65,0xa5756aa5),LL(0xd57f322c,0xc48c9811),LL(0xd934c78f,0xf0128bf0),LL(0x15f53184,0xd880ad31),LL(0xadaedd19,0x967dfa08),LL(0x374ad4e4,0x94c0e608),LL(0x389863cb,0xcecf2255),LL(0xe582d71f,0x02511eed),L_(0x0000017c), LL(0x5b089de0,0xef23aed0),LL(0x89f1eb4b,0xb93d3851),LL(0x8967136f,0x4daacc4f),LL(0x2482bd87,0xd7b99516),LL(0x8a382f79,0x404615c9),LL(0x9daadb4f,0x114144be),LL(0xd38bfc82,0x173ad4ab),LL(0x7f91ad71,0xcab03e42),L_(0x0000008b),
+ LL(0xa28a3c93,0x299c2c3f),LL(0xf2024c1b,0x63be4df6),LL(0xcbefbff9,0x39510e86),LL(0xe4d80ac6,0xf1d2f2e9),LL(0x8653ba64,0x0165880a),LL(0xd4fac73e,0x73ce1252),LL(0x67da578f,0xeb225590),LL(0xc1817050,0x2d6d0dbb),L_(0x00000096), LL(0xdc671b44,0xa93c7bda),LL(0x82c05dfc,0xcb77f18a),LL(0xaea605e9,0x1df6368b),LL(0x295e78ce,0x67c3474a),LL(0x93547410,0x18ce6948),LL(0x7dc8108a,0x7c67eccb),LL(0x8d3a8c61,0x67a75d98),LL(0xbd7b3b73,0xbf3fd62e),L_(0x00000046),
+ LL(0xaca4c347,0x9fc92c8d),LL(0x994543ca,0xc6ad228f),LL(0xb218a1c0,0xc58614eb),LL(0x527974b7,0x6ca62054),LL(0x85ffca1f,0xc2129ab9),LL(0xc6c14b3f,0x019b6e5f),LL(0x2ae678d2,0x1e22f90d),LL(0x5b3ee46c,0x71e5f846),L_(0x00000084), LL(0xd3c4dd26,0x4e855850),LL(0x74af7741,0xf226ab4a),LL(0xe0d7e588,0x332581f0),LL(0xe826c3d6,0x4284a728),LL(0xcdf777fd,0x6bfcaba8),LL(0x5a83f0b7,0x6ddf35c7),LL(0x2fbd194d,0x212fa0d3),LL(0x072b793f,0xa6758649),L_(0x0000011c),
+ LL(0x9d02c3bc,0xb7ec87d2),LL(0xe0887e3d,0xb3caff01),LL(0x4d1f3674,0x567cdbdc),LL(0x39e61184,0x3d19e2c3),LL(0xbe0de4f9,0x0c3139a2),LL(0x500e0978,0x7ba6031f),LL(0x6f3470b9,0xf8e9a69a),LL(0x65297bad,0xe732fb59),L_(0x0000001d), LL(0xc7bd9625,0x69eb8288),LL(0xe4ec65aa,0x281d3a84),LL(0x2c8f25ab,0x27426301),LL(0x97e61a91,0x3672bc0b),LL(0x95476b11,0xbfd7d2dd),LL(0xbff37ddc,0x918c4eae),LL(0x82eea309,0xbd19084d),LL(0x26d27fb7,0x769378af),L_(0x0000016a),
+ LL(0xe6cbd721,0x4a4ba674),LL(0xc27ec19d,0xf1234a47),LL(0x16a6532d,0x3cf8bf88),LL(0xe2dbe535,0xbc4dc6be),LL(0x948616ba,0x46216f90),LL(0x76d1a242,0x02af6244),LL(0xd5de4770,0xd85e1029),LL(0x7fda32cb,0x5681f9f1),L_(0x0000012f), LL(0x34f944fd,0x944544cd),LL(0x0193b124,0x72b4685a),LL(0xe7601697,0x6ec14591),LL(0x9572360e,0x2184e096),LL(0xffc7295c,0x9127a0f3),LL(0x844306ef,0x818c91ad),LL(0xf603be79,0x81b486bc),LL(0xc1bd26da,0x0974514f),L_(0x0000014d),
+ LL(0x3c726e7d,0x7d1e874b),LL(0xa513da39,0x8c78c755),LL(0x92677915,0xe62fef13),LL(0xe9e24f3a,0x3d1cf9e1),LL(0xd96cf621,0xf503d4fc),LL(0x0e1204b1,0xf07e39bb),LL(0x71958180,0x7a406c60),LL(0x3b7b9a61,0x304ca46d),L_(0x00000095), LL(0xcdb43a8c,0xf37f3857),LL(0xed377a92,0x8ae49b6b),LL(0x0827d789,0xbd50e338),LL(0xdeff6865,0xfdb287e2),LL(0xe758e466,0xa0c560a0),LL(0x54321f3b,0xb418a264),LL(0xd44767fd,0xfaaa26f5),LL(0xcc7b7f8b,0x59390d36),L_(0x0000006b),
+},
+/* digit=14 base_pwr=2^70 */
+{
+ LL(0x580dde02,0x814d149b),LL(0xeaa3b1ca,0x3cc8c599),LL(0x43a45440,0xc98d833d),LL(0xdba29de3,0x6e31f2af),LL(0xab2ff205,0xf81e95cb),LL(0xb530ab3b,0x49419f19),LL(0x8a6e1bb6,0xd0585b64),LL(0x1dfbba1e,0xd49f7ff1),L_(0x000001e2), LL(0x2b473469,0xc0250d4a),LL(0xb9f4e199,0xd4759758),LL(0x326d4e2a,0xc32f68bc),LL(0xa78113ab,0x840b01ce),LL(0xcd248f92,0xbd87644a),LL(0xa8d8d61e,0xe9a32d38),LL(0x58a69c2a,0x6a0c706b),LL(0xf4b942e1,0x8c19f561),L_(0x000000d7),
+ LL(0x538c7fcc,0xff198eec),LL(0x4ec043bd,0x29ee8af8),LL(0x125b846f,0xd01572ea),LL(0x280cfc9e,0x4ba80325),LL(0x3f73f265,0x57e3b7be),LL(0x6bcaffbf,0xf83701a2),LL(0x1a2d3724,0x19d20a25),LL(0x410f80b3,0x50b7f3ec),L_(0x00000161), LL(0x3b961197,0xc136f93b),LL(0xc26463d8,0x000ba8d6),LL(0x8d99824e,0x0e084f84),LL(0xcfbb42b2,0x81fef33f),LL(0x138715f7,0x48ed1078),LL(0xca7dbdd0,0x42869724),LL(0x3c66b900,0xcfde2c20),LL(0x89fab2c4,0x1ca32904),L_(0x000001b8),
+ LL(0xaf4c0100,0xca7c1c9b),LL(0xd05a1cfa,0x096b7d5f),LL(0x5e939f07,0xc34c35b1),LL(0x11a408f8,0xef94d03f),LL(0x9c1a3053,0xa610576b),LL(0x89fbfdb7,0xce4bec40),LL(0xabf93595,0x66023f5e),LL(0xc5d43f87,0x958d40aa),L_(0x000001ef), LL(0xa58413e1,0xcbfb3671),LL(0x1874038a,0xd3ca207c),LL(0xb2e8a04a,0xccca2442),LL(0x3073c925,0x3c9baa99),LL(0x554b9664,0x6d9e1787),LL(0x70e99ee9,0x874df9a7),LL(0x312bf341,0x1b8e89dd),LL(0xfdf17994,0x5caa8ba7),L_(0x0000005e),
+ LL(0x5838bb0c,0xad2e37a1),LL(0x5a28cd2c,0x54d33ad6),LL(0xd4f1caa9,0x44b04b20),LL(0x80e4c9d2,0x8c65ceb1),LL(0x370a13f5,0xecff016c),LL(0xee758816,0x6ad260ae),LL(0x95c36fe1,0xbbdbb7b5),LL(0x4d06dfe8,0x48d94294),L_(0x000000f5), LL(0xf5c325d6,0x955c2a22),LL(0x79a376a5,0x16640925),LL(0xf8e9390b,0x36b3aac4),LL(0x2a8dbf22,0x034f2b72),LL(0x77b02d94,0xd5de86b9),LL(0x729cfcd8,0xa8bc9f80),LL(0xbe296bcf,0x1dbcbc03),LL(0xec1469f1,0x73243364),L_(0x000000f0),
+ LL(0x4141a618,0xa7081b57),LL(0x51abc1ef,0x738c30ac),LL(0xb0cb69e4,0x731cd9ef),LL(0x9b0b0c3b,0xf0dc5cc9),LL(0x40e54a92,0xfba2bbb5),LL(0x0dee7871,0x5ee7b5d3),LL(0x540e5eaf,0xad1a2eba),LL(0x7c44af5d,0xafd14dda),L_(0x000000d4), LL(0x451af808,0x1bf41212),LL(0xacac98b3,0xd6076452),LL(0xed40fc8f,0x868d93c4),LL(0xb7246c52,0xab7c14c6),LL(0x36bab138,0x789fa296),LL(0x330e1a06,0x88e8110a),LL(0x5dbf4ce1,0xff782421),LL(0x9cabebe8,0xa4afa38f),L_(0x00000046),
+ LL(0xbf3ef154,0x0cb92f46),LL(0x47026a02,0xe21fd797),LL(0x1dec53c2,0x0b5a2b41),LL(0xcfbf686e,0xdb7c6dc9),LL(0xd6d5c0b4,0xb4a8866b),LL(0xf8283374,0x14d9e7f9),LL(0x4dd48282,0xffba2822),LL(0xf9de17db,0x48083494),L_(0x00000075), LL(0x1814c604,0xbe3bf885),LL(0x12bae7dc,0xdf04c3eb),LL(0xe8ee1061,0xc658c3bb),LL(0x8d34f043,0x47642843),LL(0x2916bbb3,0xedee7c23),LL(0x70f93acd,0xc93b4f5c),LL(0x187bf7ea,0x75348b4d),LL(0xffda6e9d,0x9cb29eeb),L_(0x00000033),
+ LL(0xc855134e,0xdd4ae89b),LL(0x30b7a1ad,0xd9dc0b8c),LL(0xbee0416e,0x67e1dcbc),LL(0x66147ae2,0x7907e5e7),LL(0xb9dea373,0x537d932f),LL(0xf4450461,0x8d5aa671),LL(0x7b0644e6,0x33269776),LL(0x835848af,0x93b63489),L_(0x00000138), LL(0xfdca2fb9,0x400c0893),LL(0xe36e56e3,0x095f6119),LL(0xaaeab6ef,0x07fda371),LL(0xfdbbf61e,0x51034096),LL(0x65d823d3,0xc5284f49),LL(0xcec7f701,0x00cca32d),LL(0x443cce6e,0x13b673ca),LL(0x7c7c1332,0x75e93750),L_(0x000001f7),
+ LL(0x5f48e2fc,0xfafcc610),LL(0x2c5d9495,0xd34073fc),LL(0x321d1a08,0x30442510),LL(0x3427742e,0x8068ffd8),LL(0x2ec5f97b,0xa7faa8a5),LL(0xac14530d,0x5d010e52),LL(0xf277a140,0x3edf5701),LL(0xcdd53228,0x07eb00ea),L_(0x00000155), LL(0xf8f566cb,0x51771845),LL(0xa7b0e50c,0x66aafeee),LL(0x81cf4ee6,0x8fd52580),LL(0x1bc2c6ec,0x232a19c7),LL(0x6790d250,0xd4c06ab2),LL(0xdc4411be,0xacd06e0b),LL(0xe0fd2a20,0x19734273),LL(0xc9fb738a,0xe5b5e5c1),L_(0x00000162),
+ LL(0x2c36a49c,0x346bc599),LL(0xb17c0c24,0x4349ec6d),LL(0x1994a52e,0xc574a60f),LL(0x479b18ee,0x2cf1156f),LL(0x00b04364,0x587d6a8b),LL(0xe20999e4,0xb840bbc5),LL(0xdfbaad24,0x1056fcbe),LL(0xb84e8539,0x211c4015),L_(0x0000009b), LL(0x34b3807b,0xc83300dc),LL(0xcbae472d,0xff64a1e1),LL(0x60ef1e86,0x1368c7ee),LL(0xfa9cecf9,0x1a548595),LL(0x12c62bf5,0xbab6253e),LL(0xc9541d0a,0x2d9ef7be),LL(0x1e1f27f7,0x956cff19),LL(0xba2813eb,0x5c29eeaf),L_(0x00000030),
+ LL(0xdb558004,0xce8d95f8),LL(0x9dc5e59e,0xf1893cb5),LL(0xa7cb9fd4,0x77041349),LL(0x53461897,0xb8f3b00e),LL(0x4b8c1719,0x3acc8d5e),LL(0xe436769f,0x2b51a3ea),LL(0x15adc570,0x5fa4c1f5),LL(0x93a4046f,0x70b3a881),L_(0x000000f5), LL(0xc6ca2c5f,0x8e92a20f),LL(0xe70ae728,0x9e74b9b9),LL(0x6d7cbd1a,0x8837144f),LL(0x797825f3,0xa10a4e2b),LL(0xd3f2260a,0xbce98f37),LL(0x3d85debd,0x39cb6f79),LL(0xa763a30e,0xb1f85a09),LL(0x15a4a3f3,0xb462b7b8),L_(0x000000c0),
+ LL(0x4df25f56,0xf82561fb),LL(0x9e75f649,0x8c808470),LL(0xd7751a0f,0x0c1dcee3),LL(0x4322644e,0xf53e90ce),LL(0xd68db21e,0x8f8d9278),LL(0x72d07c10,0x94db3061),LL(0x821b176c,0x2c56677c),LL(0x51fa088e,0xabb0b5b6),L_(0x00000172), LL(0xbd496ef4,0x2f3203c7),LL(0x702f0af9,0xf4ee87af),LL(0xdeead7f4,0x1e240ba2),LL(0x6ba4a666,0x45c6b9bc),LL(0x5b558a22,0x69826d07),LL(0x82f16b78,0x1d474e7f),LL(0x1b099f67,0x6f9ab8f0),LL(0x79936b07,0xb7da7cd3),L_(0x00000140),
+ LL(0xdcb6ef22,0x8cd18dc5),LL(0x4111e26b,0x563a07bc),LL(0x3482455e,0x0e2f7391),LL(0xcb5ec4ad,0x21483bed),LL(0xc0caacaf,0xa5a48441),LL(0xc9e80f16,0xbffbf280),LL(0x90242b85,0x91f37a76),LL(0xd9544186,0x2dcd22ee),L_(0x00000157), LL(0xa766d6e3,0xfc4b8794),LL(0x38293f47,0xa81360ec),LL(0x31e9f867,0xbe34d77d),LL(0xdb92af31,0x882df842),LL(0xcd799976,0xd34a906c),LL(0xabb505dd,0x961ddfb3),LL(0xa3a37b0b,0x4fbbb326),LL(0xf7af85a7,0x508f35d4),L_(0x00000028),
+ LL(0xbb0940d9,0x3d70435a),LL(0xff491b63,0x1eb2a685),LL(0x22d3c808,0xa380de6e),LL(0x17e44c8f,0xd9df636d),LL(0x2a35379f,0xa903bf9f),LL(0x0f809249,0x387b8a0a),LL(0xabe12175,0x44dbe0cd),LL(0xfd759d00,0xcccc9723),L_(0x0000003c), LL(0x98196ddd,0x019c1122),LL(0x84c5a37e,0x254adbe9),LL(0x3981a4ac,0xbfc928a2),LL(0x62436eb9,0x7ad29c64),LL(0xc99f2914,0x2cc9ceca),LL(0x2f0c2529,0x2d8109c3),LL(0xbda5dcc9,0xe65ae3c9),LL(0x27c8461f,0x2300f14c),L_(0x00000101),
+ LL(0x7f2f4a50,0xdb205fa6),LL(0x977d6dff,0xb6a346a4),LL(0x39b1aa2b,0xc02f5c26),LL(0x6d520bed,0x7e9b3df6),LL(0x9fe2d1ad,0x8060eb41),LL(0xffe8b3d8,0x8de43158),LL(0x6b78c0bc,0xe900b6ef),LL(0xba5607f9,0xe9657827),L_(0x000001ae), LL(0x656a0930,0xe37eeb37),LL(0xf82e5547,0x817b9a2b),LL(0xebe57826,0x966c6b06),LL(0xd17239c5,0x0d566764),LL(0xb6e7e211,0xb736c18d),LL(0x67f60fe4,0x7f6de467),LL(0x91c330d3,0xdf003076),LL(0x6fe1ff1d,0xf3ffae38),L_(0x00000032),
+ LL(0xa38e4c83,0xee75b3b5),LL(0x42633219,0x96b76b44),LL(0xa702e22d,0xce624bec),LL(0x45df636e,0x087dc34c),LL(0x00b8ab39,0x7c3b41a0),LL(0xa4c92149,0xbe1f412c),LL(0xc186c0a7,0xa0e6b72f),LL(0x6f9b9c73,0x909b955c),L_(0x000001a3), LL(0x6d958194,0xfceeca76),LL(0xc25f90a1,0xd246f978),LL(0xf7a79529,0x5bdce3f4),LL(0x202fdba0,0x4516ada4),LL(0x9ccb5769,0x22fea769),LL(0x35cd1aca,0x9d5e791d),LL(0x72d93ad7,0x89481217),LL(0xd00224e0,0xdc53ffd6),L_(0x000000b6),
+ LL(0x0b6d183b,0xcdd1f50d),LL(0x88770143,0x721cf9d0),LL(0xd247118a,0x5a8338fa),LL(0xfa498ee5,0x33ff454e),LL(0xa8d98087,0x2107a954),LL(0x4eaefaa7,0x39298606),LL(0xc385af5a,0x3e0c503b),LL(0xfc7e0cec,0x37f8795c),L_(0x00000096), LL(0xa2f6c113,0xbf161ebf),LL(0x48b5f685,0xbb087e9c),LL(0x58eb481e,0x3b7987c9),LL(0xa465a54c,0x6e92e01e),LL(0xa8194344,0x1e66d88b),LL(0xb0c7a894,0x40dc6c71),LL(0x690cafad,0x057f59a3),LL(0xf02679ac,0x4a12e130),L_(0x0000007d),
+},
+/* digit=15 base_pwr=2^75 */
+{
+ LL(0x3a007995,0x19e3233b),LL(0xcd545767,0xc78c2194),LL(0xc744ff86,0x789e51d3),LL(0xafacd6dd,0x7a5cd253),LL(0x398cb1ba,0x18b56085),LL(0x273c4fb9,0xff1bce38),LL(0x0ba240c9,0xbca7efa9),LL(0x3bb2e372,0x05ab8ba7),L_(0x0000012d), LL(0x563a114b,0xf4adbd1d),LL(0x90284d2d,0xe9ad940e),LL(0xe3af63ef,0x61ffca7f),LL(0x96feaa4e,0xba0669de),LL(0xdbf94ff4,0xd7b8471a),LL(0x696c5279,0x1dda976e),LL(0x0a229117,0x1566b880),LL(0xba44b588,0x7a731f5f),L_(0x0000006a),
+ LL(0x29b896b5,0x025efc3b),LL(0x60e34ccb,0xbcd9f85c),LL(0xae29c1d9,0x1e85f821),LL(0x3dcc6356,0x27219e29),LL(0x3f95824c,0x9e01039f),LL(0xd3a9843c,0x8ef0f79f),LL(0xbba44b84,0x9cddb5a3),LL(0xf0a7f537,0xe6239011),L_(0x00000062), LL(0xd40be315,0x0d73669d),LL(0x0706daaa,0x90c605d6),LL(0x262a826a,0x2e67d62f),LL(0x90997b0e,0x5ac29c5e),LL(0xa4dc7322,0x9728fe4c),LL(0x46c28be3,0x8656b7a7),LL(0xcf46a3d3,0x318bd5a3),LL(0x0c58ac70,0xbdba780a),L_(0x0000012f),
+ LL(0xd012d32d,0xb1701460),LL(0x36257f7f,0x712c0989),LL(0xbc1511ff,0x948635e7),LL(0x929c254b,0x950b6b9e),LL(0x88fae008,0xc1ebc649),LL(0xb35e21c2,0x69de590b),LL(0x0c8fd948,0xc534704d),LL(0x03df94d1,0xc72f229f),L_(0x00000191), LL(0x417e1367,0xbe538962),LL(0xbaa7a81a,0x6d9ba3b4),LL(0x085df8a2,0x72446606),LL(0xc1a4f077,0x313aa0fe),LL(0x443486a7,0x310facd1),LL(0x4bb29bc8,0xe7424659),LL(0x70dbb24c,0x7a208944),LL(0x2ddd11bb,0x4190996b),L_(0x000000fa),
+ LL(0x5370e2b4,0xa39d68ac),LL(0x0b26e23e,0xf98a9904),LL(0xbe557ba1,0xcef362a9),LL(0x202765cc,0xa7731e3c),LL(0xa726d7b5,0xcd815e2b),LL(0x1c25faf8,0xa6579cd9),LL(0xdafb2e8b,0xc5ec8fb3),LL(0x648049fa,0xd9a36af4),L_(0x000001d2), LL(0xa04b6251,0x96110b89),LL(0xd1ddccb2,0x551f88c9),LL(0x0f26d015,0x9b8bbb0b),LL(0xb5bd39d3,0x9d52ffc2),LL(0x2dc18ef7,0xab6d006e),LL(0x142fb527,0x804f61d0),LL(0x391511fa,0x9dbe5992),LL(0xa3e717ea,0x408dd815),L_(0x0000008a),
+ LL(0x9289c640,0x6b7a800c),LL(0xc76b2795,0x581d42f0),LL(0x8ca1e81a,0x4472a2fa),LL(0xbf4b6019,0x6715dfdd),LL(0xb304a936,0xf9366e36),LL(0x391be48c,0x81f74b90),LL(0x6151e36b,0xd32b6b20),LL(0xc48b79a5,0x9a91aea9),L_(0x00000183), LL(0x831e89ed,0xfa6f04fa),LL(0x5ebcfa5b,0xec4ecc3d),LL(0x6b2117a0,0x7b376a81),LL(0x90bf1080,0xba3f0166),LL(0x0993a607,0xaf14e2f1),LL(0x8cf72c90,0xef21c633),LL(0xd173a6d3,0x187451c2),LL(0x13ec5f08,0xdd8ab011),L_(0x0000006c),
+ LL(0x0f29eadd,0x246b16c2),LL(0x9b833212,0x9da31a63),LL(0x297cf150,0x4995a63d),LL(0x90a2a3a8,0x26054531),LL(0x22ca8af6,0x0cdf918d),LL(0x62531849,0xa5ed4b64),LL(0x7ca9de65,0xfa4fec38),LL(0x72b35acf,0xa666610b),L_(0x0000018a), LL(0xf96d539b,0x221e3646),LL(0x256f3a4b,0xb6bf83af),LL(0xc408a90f,0x7abd62f0),LL(0xaefff14a,0x4069cdfd),LL(0xae41ce0c,0x29824953),LL(0xb47d1cba,0xa382ab7e),LL(0x9eb440b7,0x957f6459),LL(0x4c148b60,0xaf1d974a),L_(0x00000047),
+ LL(0x1086c5f8,0x26130fe0),LL(0x7b4b2e70,0x68d46ff5),LL(0x0c407c0a,0x3b8c39a0),LL(0x88577dcf,0x6dc35106),LL(0x5dafbff6,0x66c847b2),LL(0x2d675f1f,0x17ebe229),LL(0x834c9c2b,0x7dd924e2),LL(0xd5b6edf6,0x0a03148b),L_(0x000000d6), LL(0xf96321d7,0x6f67acfa),LL(0x9437a2b2,0xf66029f2),LL(0xe7b46c71,0x329167d4),LL(0xb24e796b,0xcf0f34c3),LL(0x9d6e95b5,0x4f9e7abb),LL(0xcb817cb5,0xb5258968),LL(0xe5382677,0xb89d3951),LL(0xb2e2fb7f,0xd0f6ea08),L_(0x000000c4),
+ LL(0xe65a160c,0x79edff6b),LL(0x1ae3af0e,0x7704970c),LL(0x8b957c42,0xb8aa395f),LL(0x5f0f181e,0xbdf3d6c8),LL(0xe7d8f529,0x4e626c58),LL(0xd83fd353,0x770dabfa),LL(0xe5ada98c,0xac3e65d7),LL(0x6430730b,0x954e2567),L_(0x0000010b), LL(0x09d0476d,0x4dcf97c3),LL(0xab9b5d71,0xa56a3252),LL(0x9648c08c,0xff297fc7),LL(0x897ba609,0xff84306b),LL(0x4c446a06,0xddb64374),LL(0xbc202d01,0x97ee1218),LL(0xf9b0f80f,0xf048db33),LL(0xb5f54bb8,0xf9d935e8),L_(0x000000e7),
+ LL(0xa010dba8,0xa2fb38a6),LL(0x31feab78,0x36899fbf),LL(0xacceb7c2,0x5bdd898c),LL(0x14de8e04,0xe42d5076),LL(0x459ea861,0xe51c21c6),LL(0xfbda1b0c,0xdc95445c),LL(0xa7d4e38e,0x7947f71f),LL(0xadcd66a5,0x2c40ef60),L_(0x00000199), LL(0xdcdf5f99,0xf1467b2f),LL(0x2de2bfcc,0x9c1ae772),LL(0xd43f04fe,0x41471183),LL(0x043333f6,0xc9a3cf00),LL(0xf1a6e8cb,0x7cc8a0c7),LL(0xa8c3f924,0x74a1cf04),LL(0x828052df,0x8be5596b),LL(0x50a45820,0xd5384c0f),L_(0x00000198),
+ LL(0xe9851bfc,0x51c40077),LL(0xbfe0982b,0x87cd565d),LL(0xd372a1cb,0xccd954bd),LL(0xbbff7b4d,0x294b36f6),LL(0x8237c51d,0x4ce0f879),LL(0x261403d6,0x569d6e3c),LL(0xb79e0e60,0xeba6224f),LL(0xc33dd3b5,0x701a34d7),L_(0x000001f7), LL(0xaaf054ad,0x5f93dace),LL(0x160bbbee,0x8aa260aa),LL(0xa9f4b722,0xb1b5025d),LL(0x817d1e67,0x81308a04),LL(0xfe002797,0x4afd2f00),LL(0x680cc208,0x154f68e6),LL(0xd4b7eccc,0x4cc6b0f1),LL(0xb8976118,0x39f42fe2),L_(0x000000b5),
+ LL(0x7283e8a9,0x8ab94a45),LL(0x0bb733f0,0x642a6645),LL(0x41a534e8,0x57ae42c1),LL(0xd4abc981,0x8be6ea3e),LL(0x7e62f50a,0xb3f01b7e),LL(0x98a38cc8,0x8865f98b),LL(0x7862605c,0xf1a738cf),LL(0xde02b3ce,0x7cbcb60e),L_(0x00000191), LL(0xbb74e488,0xc6aa6ad4),LL(0xf6d314f3,0x1691860c),LL(0x97214287,0x625fd28f),LL(0xab878ce4,0xd6ea61fb),LL(0x8ebed709,0x5a22486f),LL(0x6db8fc6f,0x0b71449e),LL(0x46c06119,0x0e8cd622),LL(0xe44026c8,0x2b868bc7),L_(0x0000017c),
+ LL(0xab7fbeff,0x954c6cef),LL(0x7291b35c,0x062277d6),LL(0x7553137c,0xaf482063),LL(0xb75730d8,0x710c68e8),LL(0xb68d2250,0xbae3e7c1),LL(0xff637a2f,0x6b643e1a),LL(0x1ef002bf,0xdcdc4699),LL(0x38ab4582,0x3d4d096e),L_(0x00000057), LL(0x92bea0d8,0x899ee626),LL(0x4d7631d6,0xcdd2a79a),LL(0x2ee3aea9,0x8162f50f),LL(0x1476eea0,0xc4d433fb),LL(0x27c81475,0xe8214237),LL(0xdc969d9f,0x56c76934),LL(0x6d918c87,0x7533eb08),LL(0x56d2a891,0x6eb1be30),L_(0x0000001e),
+ LL(0x1b47da4b,0x8a8331e9),LL(0x49ed1362,0x59fa2b27),LL(0x418a7189,0xe8454c56),LL(0xf46859d8,0xb777077d),LL(0xdf895326,0xa1ecfc76),LL(0x7c0bff3a,0xa0d40120),LL(0x4dc72f6f,0x863ee5b0),LL(0x6d7d35d2,0xf072a9db),L_(0x0000015b), LL(0x51536aa9,0x797cc189),LL(0x992a786b,0x424d6c36),LL(0x0bb1db2f,0x7b4a72f0),LL(0x99596f48,0xd38d470a),LL(0x7d9d8119,0xed3220cb),LL(0x7fe52443,0xd0f7efd8),LL(0xf334c76a,0x5b52a8c0),LL(0x289cf254,0x9c518382),L_(0x00000178),
+ LL(0x50ef0de9,0x06fa762c),LL(0xf226f768,0x770bcaf6),LL(0x47cff6b0,0xec1a0d3e),LL(0xb780ef8c,0x49872a4e),LL(0x434df874,0x82a505c8),LL(0xfc298963,0x6b56a94d),LL(0xc037f2d4,0x1721c7a5),LL(0xef98ff94,0xdf6aa659),L_(0x00000092), LL(0xce001c93,0x229e4010),LL(0xb7710f4a,0xb1be023a),LL(0x4f780b68,0x37373fb4),LL(0x44ddc611,0xb6129029),LL(0xeba09ab8,0x3d4bb157),LL(0x52d1be00,0x7557730f),LL(0x5d184bff,0x79506c27),LL(0xabea8b49,0x120e5c57),L_(0x000000a5),
+ LL(0x475e54a3,0xe76ea216),LL(0x641b111e,0xe7b2f367),LL(0x11e8b8cf,0xaa1845af),LL(0x3e44ec0e,0x634d35d6),LL(0xd9e05b86,0x9fef6a5e),LL(0xa66acc79,0x6151a902),LL(0xc7fadad6,0x95ee0cab),LL(0x4f71151e,0x5844d0c7),L_(0x000000b3), LL(0xc47ffd5b,0xd5a7577a),LL(0xa66a5bd1,0x1bbdd68c),LL(0x1a4070bb,0xafa4a6f8),LL(0xb0f9b28c,0x67075086),LL(0x966afc2e,0x63512dbd),LL(0xed5912ae,0x8f26597d),LL(0xd092a281,0xa415f451),LL(0xc2ef31e4,0x0ffffc3e),L_(0x00000147),
+ LL(0x4e004498,0xbea3c389),LL(0xaa39f9d0,0xa8f46458),LL(0x0b3654a0,0xf830008b),LL(0x4cd7392b,0xa46a22ca),LL(0xb12eb97a,0x80e1d7af),LL(0xd888b9cb,0xf74c8adc),LL(0xbb6e179c,0x73b51d04),LL(0x968eb224,0xb5490b50),L_(0x000001f5), LL(0x51f96d03,0x9de9e100),LL(0xfade3749,0xecddcd4f),LL(0xfc72771e,0x7aa9dbdf),LL(0x5e1bb964,0xdc24156b),LL(0xbaddb508,0x0de78eea),LL(0x6facddf4,0xb1c48894),LL(0x4a964d6a,0x49c82382),LL(0x6f258c87,0x62eac3b1),L_(0x000001b0),
+},
+/* digit=16 base_pwr=2^80 */
+{
+ LL(0x32cc508d,0xcd408945),LL(0x60b1057f,0xf3eb54e9),LL(0x77d231ff,0xbd6ea408),LL(0xe5110313,0xb9ee8343),LL(0x85209f6e,0x64924e77),LL(0xe7fa5897,0x32e258b2),LL(0x618a6eb3,0x11e2e038),LL(0x96067c35,0xf4c23aaf),L_(0x000000a7), LL(0x0f221560,0xef974e44),LL(0xa1b7a3a0,0x8ea1f931),LL(0x72932b48,0x720e4174),LL(0xbb75d745,0x1bf9c803),LL(0x996758e5,0x7f0b3909),LL(0x8d83f97c,0x39d56a48),LL(0x1fac932b,0x55fe1ded),LL(0xaaf43ccf,0x91fe8399),L_(0x0000002b),
+ LL(0x6ffb7834,0xad3e7387),LL(0xd3158a49,0x8771e37a),LL(0xb98ec469,0x6f103f2c),LL(0x1bd53110,0xf8325af3),LL(0xa434959f,0xe47f875b),LL(0xa10264ee,0xcf224bc0),LL(0x9ccf2f61,0x337d33a1),LL(0x86ce6031,0xe6ee9f21),L_(0x0000009e), LL(0x6706e91f,0x9179c5ea),LL(0x79ba3023,0x9aa4ed38),LL(0x7e239f26,0xaa83eb97),LL(0xef091443,0x82853a90),LL(0x336fc4d2,0x2b260d34),LL(0x56b3a0bb,0x119fbd07),LL(0xe0f16198,0x3453a3a6),LL(0xa2af0802,0xd2ee6016),L_(0x00000050),
+ LL(0x8000185b,0x02ebe1f2),LL(0x3ebcda00,0x30d3e5f2),LL(0x75cccaba,0x8ea9d40f),LL(0x108edd48,0x152a6563),LL(0x6028024e,0x732e422c),LL(0x17618296,0x142e6cc1),LL(0x9dea7266,0x5d4e4488),LL(0xb05325e9,0xf99254d1),L_(0x000001a3), LL(0xf3270a2e,0xc29b5dca),LL(0xbad984d9,0xd2f759d7),LL(0xad7bc046,0x347ff7c2),LL(0xa4e4f59d,0xc16d4c0f),LL(0x0a06be29,0x872d14ff),LL(0x2390bb31,0xb7a5b6ec),LL(0x66be2ce2,0x408ae4cc),LL(0x6b9b1fe0,0xc70e0700),L_(0x00000080),
+ LL(0x9cc4cee5,0xa99628d5),LL(0x4764e916,0x4417813a),LL(0x9a05da16,0xe423f0c4),LL(0x2babb644,0x24dca899),LL(0xd179a66e,0x894f6883),LL(0xc157cbef,0xed7756c7),LL(0x44c30131,0xcdff08e1),LL(0x78b0a3e9,0xf5fa08ac),L_(0x00000059), LL(0x43dabd75,0xbe7ba3ec),LL(0x93626426,0xd17b8f8b),LL(0xbfcd2a78,0x486d7ac0),LL(0xaeda53c9,0xfc3c49c2),LL(0xbc99eeae,0x49fb4a9c),LL(0x12ab3d09,0xdb075628),LL(0xc0f863b5,0x3d5da4c6),LL(0x8ec31fe4,0xc774d9e0),L_(0x00000072),
+ LL(0x098d00b0,0x4acb7a91),LL(0xf4f8175f,0xfe317cf8),LL(0xf8155d16,0x2bc9a77c),LL(0xac3ddeef,0x17520bd7),LL(0x0aeae3c4,0x44ee6fbc),LL(0x1aaae6ff,0xd8c23852),LL(0xf47bc828,0x553f42c9),LL(0xc09b26d0,0xb04bad2f),L_(0x000001e8), LL(0x9a32ac7c,0xc1e669bb),LL(0xc8aca498,0x697322f4),LL(0x43042d46,0x334625a5),LL(0xdf16aa69,0x67bda03c),LL(0xab4b67c2,0x205d341f),LL(0x83a55d6f,0x05daa2bd),LL(0xcdfd94e0,0x9ac9573f),LL(0x1cb76afe,0x2fdad4e8),L_(0x000000d1),
+ LL(0xf074fced,0x97863b91),LL(0xc43281c9,0x92d449a3),LL(0x7a68c2d7,0x063c9119),LL(0x3b2de0b3,0x55e1666a),LL(0xf3e7d825,0xf70b4227),LL(0x6aacf427,0x6c04e18d),LL(0xc2b9b616,0xaa4c82c2),LL(0x376fa210,0x3261f95a),L_(0x000001ca), LL(0x27de0f4a,0x63844f17),LL(0x70941232,0xfd0bec77),LL(0x3b5f4e85,0x68fe79f4),LL(0x5cbc9a57,0x826a7303),LL(0x65bb2328,0xda7d2209),LL(0x40788a77,0x6978fe42),LL(0x14c7cf99,0xc2ae1a05),LL(0x77943ce3,0x53eab85e),L_(0x00000074),
+ LL(0xdb0d1b45,0x25e9937f),LL(0x14c566a9,0xd1cf3988),LL(0xcd250848,0xcc300694),LL(0xbfd82b6c,0x135bc75f),LL(0xa47db4ae,0x8639e63f),LL(0x2295c1f1,0x30a5e5b3),LL(0x61f91b27,0x2841bb1c),LL(0x1335383b,0x5f90a945),L_(0x00000129), LL(0xe1df27e3,0x0fb695c7),LL(0x721a9ee4,0xc8c313d1),LL(0x267e9801,0xb288bc93),LL(0x9aafbe12,0x80d7a36a),LL(0x5e34c2b1,0x5e8b79ae),LL(0x22efe6b6,0x7da7f03b),LL(0x552e9134,0xee94e563),LL(0xab16538c,0xb9465f4a),L_(0x000001e5),
+ LL(0x336db42e,0x49f7546b),LL(0xf6900421,0x57093c06),LL(0x8e00d7d3,0x8d2dbce8),LL(0xd9ede742,0xd004dc4a),LL(0x01940521,0x0d3be2ce),LL(0xdc4ae497,0x1bb5cf60),LL(0x0a6ccb03,0x803df567),LL(0xdf04605d,0xa1f5bb64),L_(0x0000013c), LL(0xa05f0fb0,0x1f8ad28a),LL(0x39d0a695,0xe5b908dd),LL(0xd67e92ff,0x4165f76f),LL(0xf281077f,0xc8d52980),LL(0xc9ee2db2,0x9ff0b841),LL(0xe792e9a0,0x9a5850f2),LL(0xd74d1fff,0xdbe9887c),LL(0x468c4978,0xb14ef9aa),L_(0x0000018f),
+ LL(0x17cfe85b,0x645a5369),LL(0x96452c88,0xfe80ed90),LL(0xd777343c,0x53d07352),LL(0x57827fb3,0xa6c3e43b),LL(0x80b39b9b,0x2a8365b0),LL(0xaf5a3de0,0xac5e9239),LL(0x181d4337,0xea4d87d6),LL(0x51fe7247,0x91c5ece4),L_(0x00000037), LL(0x0dfb5a0c,0x7a7e75fb),LL(0x15428231,0x5c94ba5c),LL(0xdf444166,0xc521d0ff),LL(0x0f639c5d,0x74de2e37),LL(0xdc1e397f,0xc9356e9e),LL(0x93e3e959,0x0c9e3464),LL(0x39201886,0x6a78ad71),LL(0x2c0f3246,0x857cb413),L_(0x000001f9),
+ LL(0x9207f1ee,0xc358b92f),LL(0xcc5ec219,0x085c3194),LL(0x8df4ef1a,0x71e157f1),LL(0xb527e0ab,0xdd0a2a0d),LL(0xae481b48,0x0e0efe51),LL(0x27b717b7,0x5828b573),LL(0xc2a98225,0x3d2c0ff1),LL(0x099e23ff,0x7269417e),L_(0x00000083), LL(0xf9a97523,0x11db2059),LL(0x5fbc6f68,0x162229b6),LL(0x08c87928,0xc7000da2),LL(0xa03b55dc,0x3f37b2b0),LL(0x03e27759,0x2abf57b8),LL(0x6d3e3a66,0x3d925762),LL(0xa5335174,0xec43569d),LL(0xb9e4cda0,0xe4522ca8),L_(0x000000f8),
+ LL(0x991bdfe4,0x46da618a),LL(0x0642fbf7,0x2827ab9a),LL(0xcb3c80d7,0xa4c02a4a),LL(0x24ffe39b,0xdd1a385c),LL(0x81fb1f95,0x4fe48911),LL(0x7ed78cb0,0x42514e36),LL(0x12838990,0x2822adf0),LL(0xcd6245c9,0x17e195af),L_(0x00000018), LL(0x682326f4,0xeadeab18),LL(0xa6714b92,0x8194d4d8),LL(0xec34ca02,0xaf1a5a6c),LL(0x18aa0b61,0x21f3603a),LL(0xd56cb67c,0x9e65c6ef),LL(0x64df4053,0x9af9ff17),LL(0x6e1b769a,0x333abb94),LL(0xd74c3bd6,0xb764bf57),L_(0x00000185),
+ LL(0x6b395c0b,0xb5b87b52),LL(0x48432467,0x7efdcd9b),LL(0x9d4e858e,0x7c0c8922),LL(0x30d29dcc,0xd7b3a015),LL(0xe0639cac,0x02eb2112),LL(0xa2a88900,0x99cb32dd),LL(0x5ee2bf55,0xe98b88fa),LL(0xa3323b39,0x9b1c4ab7),L_(0x000001c6), LL(0xe5c08a49,0x2cf028a4),LL(0xf8ca8809,0x62209ac3),LL(0xfaac3cb2,0x91bff5ca),LL(0x2cd5c8b2,0x2f2a80df),LL(0x2244abea,0xd2c4cfb9),LL(0x1181848d,0x345b1ca4),LL(0xc35b7b60,0x3093dc03),LL(0x815a0c2b,0xccdd0f34),L_(0x000000a3),
+ LL(0x3f060a04,0xc9440b7b),LL(0xf892eb31,0x8c0aafa8),LL(0xc25c561f,0xebcb8c35),LL(0x12770520,0xe63e94d2),LL(0x6d5c16b3,0x1c828d52),LL(0x9bde42a4,0xcafff93a),LL(0x2b7abe51,0xc4851b92),LL(0xa9fcd2b9,0x41227e00),L_(0x0000009b), LL(0x24e44af4,0xebda81a0),LL(0xa695bf6c,0xdee85d40),LL(0x76c43176,0xf9ff0671),LL(0x8106e3cf,0x7e8060f0),LL(0x4ce1b2a1,0xa7e23360),LL(0x81d1ed8c,0xbfa62d39),LL(0x47f7b51a,0x4292ca9e),LL(0x9139a437,0x60e7fdba),L_(0x000000ae),
+ LL(0xa65d9111,0xb4e47850),LL(0x4221510a,0x7528def6),LL(0xeca10d8d,0x12fd7625),LL(0x4560fa05,0x7883ec3b),LL(0x5c64949f,0x2a961e63),LL(0x4df0271f,0x4eacd5e7),LL(0x9af4d45b,0x62f25ceb),LL(0x9ab3bb2a,0x7ef167e5),L_(0x000001f5), LL(0x92cdd0ea,0x6860d474),LL(0xae51b5ad,0xc69002e2),LL(0xccd9fe59,0xe138bd08),LL(0x00304cd8,0x9ec62f95),LL(0x329feb5b,0x0928d5e4),LL(0x8a27990e,0x6d9656bc),LL(0x0f0e6792,0xb7989c9a),LL(0x3f1c862c,0x1bbbc30e),L_(0x00000033),
+ LL(0xa5a66086,0xf622c1ac),LL(0x7ccf9bc1,0x3beaf465),LL(0xa68726c3,0x900cd78d),LL(0x2a903911,0x2be1c512),LL(0x8832203c,0xa8466703),LL(0xbf042dcb,0x1301ba91),LL(0xa8235209,0xfc06ed9e),LL(0xe1aef50a,0x04f3d4d5),L_(0x00000138), LL(0x47a0b87c,0x55a0038d),LL(0x9826631d,0x6ef49646),LL(0xe8d54ad8,0x53644562),LL(0xa200feff,0x773835a0),LL(0x5c4408b1,0xb6c0a0e2),LL(0x3199aac7,0x2d23ae2f),LL(0x4f2c5a36,0xdfbd8171),LL(0xccacb296,0xa7505cc8),L_(0x000001e2),
+ LL(0xcf45bc39,0xbca99c74),LL(0x16aa0dee,0xae132b38),LL(0xb713a9d8,0xf8d3fb57),LL(0x139b0131,0xc38156e4),LL(0xc42164bb,0x3293d5ff),LL(0x74da5a53,0x28a54d0e),LL(0x970fceff,0x56246758),LL(0x3ef8fd2b,0x1b3685cb),L_(0x000000ad), LL(0xa0e59886,0xe1a4b217),LL(0xaa3f69ad,0x23117719),LL(0xb7b4e45e,0x118c88c1),LL(0xf1294233,0xd7dfa5c3),LL(0xf1ed8c9d,0xfa2104f8),LL(0x22213ffa,0x89ed7138),LL(0x3ea0a97e,0x2cd0f857),LL(0xf09db9f8,0x28378a81),L_(0x00000167),
+},
+/* digit=17 base_pwr=2^85 */
+{
+ LL(0x7d77d542,0x6c76648a),LL(0xa16759eb,0xae9936fc),LL(0xd9556eeb,0x239c8db3),LL(0x1fc23af7,0x3df02c8f),LL(0xd956a664,0xfec894e1),LL(0x2a0d5264,0xaaa92f80),LL(0x14a90b90,0x93d756f0),LL(0x53d197ff,0xb190be07),L_(0x00000163), LL(0x06dc80b7,0x026f8974),LL(0xdd1ea5de,0xbf46ad6a),LL(0x1c416858,0x8f0f1c5d),LL(0x6b3d82ce,0xf587ce4d),LL(0xa459159d,0x3b92c19a),LL(0xb6baca47,0xda5bec10),LL(0x600af3c6,0x40e0b4be),LL(0xc81e2b9b,0x5a9bfcf6),L_(0x000001ec),
+ LL(0x7d27dadf,0x34d4f088),LL(0x4ff582d9,0x24ab4a3b),LL(0x151ee4b7,0x58c8094d),LL(0xdf116aee,0x1ceee559),LL(0x6c8ad814,0xf6cc0cd1),LL(0x3d13c277,0x9d41dd2c),LL(0x75e0cd1b,0xf318d63c),LL(0xbb0767f3,0x285b2c06),L_(0x000000cd), LL(0x1f3f3f36,0x8f1170f9),LL(0x44906780,0x6338ef63),LL(0x7495e6b8,0x66dcb459),LL(0x3f524ab7,0x7ec63428),LL(0xfd773112,0x86373e0a),LL(0x549575be,0xd2af0e3a),LL(0x9dfc2be8,0x6314c681),LL(0xffa7af5c,0xed6d3f7a),L_(0x0000013d),
+ LL(0xb01c752e,0x2db47294),LL(0x8755f110,0xefd03152),LL(0x233b9d7e,0x00f8e7a5),LL(0x69c62c75,0x1ee3b5dc),LL(0x551f4471,0xa5e280f0),LL(0xc7dd9d94,0x11042cd8),LL(0x0c2167eb,0xaf8b1437),LL(0x7f4636e4,0x9f076780),L_(0x00000112), LL(0x77598691,0x12f599a0),LL(0xcf61cb84,0x0459d6b4),LL(0x6f27cc0b,0x126405e2),LL(0xbc7fdaf5,0x4a3026dd),LL(0x0cdbba7c,0x658e4a3b),LL(0x25d0b262,0xf2e795bb),LL(0xeec95e90,0xc8766509),LL(0x52259c52,0x0502e5a4),L_(0x000001a9),
+ LL(0x35410967,0x88f9eb94),LL(0x20da6297,0xae5dfb3d),LL(0x527623e5,0x17557d88),LL(0xc844e99c,0xb4031115),LL(0xb6a57ec3,0x4aff5aa0),LL(0xbe7d0b59,0xea2e84ad),LL(0x1e84a37c,0x947fcbaf),LL(0x048c2935,0x17d978e3),L_(0x00000076), LL(0x93f58bed,0x503171b0),LL(0x7aaa2b21,0x7b8e1c73),LL(0x6261f263,0x620dfceb),LL(0x1e8e8701,0xdb241dd2),LL(0xce453d37,0x74e79c85),LL(0x7db88257,0x6f92bc71),LL(0x5a2566e6,0x6fb9d9ff),LL(0x4ae0bd7b,0xebbcbbfd),L_(0x000001c4),
+ LL(0xed12288f,0xe57e6348),LL(0x585fa9eb,0xa7abfcec),LL(0xb1b5c7dc,0x12939a1c),LL(0x76c09203,0x48eb6b41),LL(0xc4cc679c,0x2a08cff6),LL(0x4778574b,0x8519401e),LL(0xa530fac0,0x93672b0d),LL(0xe3ed0e37,0x42bda3c5),L_(0x0000011e), LL(0xb789e1a5,0x479a986c),LL(0x85a2af38,0x47001e80),LL(0x5a9c69c9,0x623b25fe),LL(0x05944f83,0xecb76557),LL(0x1f6667a7,0x0cb584d5),LL(0xc3bb24b7,0xdaf97923),LL(0x7f09e6d8,0x00ac1be5),LL(0x6d082075,0xfc0ef0db),L_(0x000001a8),
+ LL(0xcbbf6efa,0xd82adf79),LL(0x6f9a1c1d,0x1d21df42),LL(0x47e0a609,0x1902bf5b),LL(0x6c507d72,0xd92481e1),LL(0x732e3603,0x4e995e7f),LL(0x0a9f3c6f,0x57c9de5d),LL(0x171e968b,0xace10341),LL(0x27d7d96d,0x8b519973),L_(0x00000108), LL(0x093b8c99,0x68806375),LL(0x999003af,0x0227279e),LL(0x62158e85,0xd41629b8),LL(0x3479df9d,0xa2d25c33),LL(0x3570b3aa,0x61de636e),LL(0x4eb04a19,0x71b3bbeb),LL(0x0ce04d19,0x4c30f9b9),LL(0x15492470,0xb4fa9cb3),L_(0x00000082),
+ LL(0xcc212f6f,0xf1e3cf43),LL(0x2c575c09,0xdd247286),LL(0x0980e757,0x812b4ec0),LL(0x19cba5ed,0x883e3e28),LL(0x4641e487,0x0bb816e7),LL(0x6c96b70b,0x461f03f5),LL(0x26aaf764,0x918835cd),LL(0xe1cfcddb,0x0c7159a8),L_(0x00000104), LL(0xb11711e0,0x3f7282c1),LL(0xed552895,0x44826000),LL(0x25594479,0x065389a8),LL(0x70867768,0x96f127c7),LL(0x52ffb2b6,0xaa1f5abe),LL(0x0831bd74,0x9739a178),LL(0xf0a510a0,0x6154e726),LL(0x36902e78,0x51eacd77),L_(0x0000005b),
+ LL(0x42cd0f9e,0x7bbdb010),LL(0xa3fbb175,0x1996a380),LL(0xf39db731,0xbb69e651),LL(0xf3f08146,0xec6679cd),LL(0x8679b0b6,0x60847478),LL(0x90d1ae26,0x883e5a59),LL(0xa5e209ed,0xba61924f),LL(0x3c755c0b,0x53df41de),L_(0x000001ef), LL(0x847c1f82,0x8ace9c6a),LL(0xa1434ccf,0x857d9026),LL(0xad864d4c,0x0ee5b0b7),LL(0xf613e221,0x86a35718),LL(0x91165b2c,0x55984d67),LL(0x080d19fb,0x15401901),LL(0x3389eccf,0xd99a0e8b),LL(0x8b509b98,0x5d25fe60),L_(0x000001d7),
+ LL(0x7c660e1a,0xfd68d650),LL(0x85aa25df,0xe307472b),LL(0x3713d00e,0x3afed55d),LL(0xc091f93d,0xecc3137e),LL(0xa9f9d1a2,0xa3d44f8a),LL(0x32a1cdec,0x4344089c),LL(0xc8d64b46,0xe3575142),LL(0x11bd5244,0x0baf1702),L_(0x000001f4), LL(0xe4cb9635,0x8fa8648f),LL(0x3dc52f80,0xdf8e13dd),LL(0x058fc1b8,0xc1ab282d),LL(0x3abf2a6c,0xf290d505),LL(0xfb0841a1,0xea29f4f4),LL(0x3d94894a,0xb691fb1a),LL(0xf7a1cc29,0x0da25d00),LL(0xfc4326f1,0x3439b98c),L_(0x000001fa),
+ LL(0x1b3c8c62,0x1ffd1435),LL(0x58c3116e,0x54a96e6c),LL(0x90a8d92e,0x623a9ece),LL(0x891efe6b,0x66715556),LL(0xe72489c2,0xd3bfc0b3),LL(0x5b00b58c,0x8cf3d04d),LL(0x06c601e4,0x71f460fb),LL(0x26e3ef6c,0xab622fd1),L_(0x00000122), LL(0x626e2af2,0xa51ff90c),LL(0xec49ef66,0xd3f82493),LL(0x704277da,0x9f0e6e8a),LL(0xca17ce54,0x80cb9b26),LL(0x62bbba3d,0x39fb568b),LL(0x7ff82aae,0x978a0c13),LL(0x9cbfd867,0x6bd90fa9),LL(0x07be1717,0x35fbb751),L_(0x000001d2),
+ LL(0xd809dd1b,0x12107a4a),LL(0xc16d6592,0xdc70467d),LL(0xf8d5c83c,0x273b2243),LL(0x596e052c,0xeab68bd9),LL(0x8aaa0dde,0x11cdb329),LL(0x39baf3e4,0x65459e78),LL(0x004f292b,0xc654b1e0),LL(0x4da9e734,0x3bae514a),L_(0x00000186), LL(0x1ee009d1,0x45bc8ab1),LL(0x24563a0d,0xde252f6e),LL(0x04322137,0xd1d577ae),LL(0x29c5297d,0x554880c2),LL(0xf29e1a9e,0xfc0d4b7e),LL(0xa08f14c2,0xe648399e),LL(0xfd1007c8,0x23bed899),LL(0x2a7303ca,0xf8a75610),L_(0x000000b1),
+ LL(0x2e60230d,0x883ed27b),LL(0xf8aee1ce,0x57a9715e),LL(0x9d84b9da,0xa58cae2e),LL(0x59971acb,0x62ef042b),LL(0x5b1190ec,0xa8c70cf9),LL(0x1ecd90c6,0x1e5cf5d1),LL(0x0a20a7a4,0x3aec3e16),LL(0x7baf5a6c,0x8a25f66e),L_(0x00000149), LL(0xf18a3f41,0x0debc30a),LL(0xc54674cb,0x2dbc3b83),LL(0xc265a6e5,0xa8033fd7),LL(0xf450415c,0x2a50f527),LL(0x6adf277c,0x81475ec6),LL(0xff0d3a36,0x5f2c676b),LL(0xdffe6c53,0x0c1f159c),LL(0xf5ad7f78,0xa68f5906),L_(0x00000191),
+ LL(0x00058fc2,0x8bb729ca),LL(0x48246fa7,0xff563f60),LL(0xb23219d5,0x8c64a3a5),LL(0xf34e49ac,0xe82036c1),LL(0x9d2397f6,0xe392c964),LL(0x58216601,0xbeda885c),LL(0x3d7f9573,0xe289f5e8),LL(0xb1917dc6,0x15f32b69),L_(0x0000009e), LL(0x6d9791a6,0x37eb92d1),LL(0x066237a9,0x7995f34e),LL(0x764ae778,0x8d994f01),LL(0xde5ca0e3,0xaff07e24),LL(0x199bd467,0x544454f0),LL(0x4bf2e809,0x603eb80f),LL(0xe5054850,0xc95e16ef),LL(0xa4a6c672,0x0af00fa9),L_(0x00000060),
+ LL(0xc8db0700,0x32a1b788),LL(0x45d0d169,0xc842373b),LL(0x87531f66,0x674b4407),LL(0xdbe71b0e,0x8189664d),LL(0x42dd8323,0x7cdb6aec),LL(0x8df2c5a6,0x86c397bc),LL(0x86388fa4,0x110db0bc),LL(0xf6d18eb8,0xa1af0086),L_(0x00000118), LL(0x23e50391,0xa2dcf957),LL(0x6ae2419f,0x1c7362d5),LL(0xac9caab7,0xd238a731),LL(0xbef3c44d,0x28f6d7ae),LL(0x5c3ea7d4,0xdacef1fe),LL(0xd654307e,0xb31d909e),LL(0x01625227,0x6d2db310),LL(0xb2421d90,0x923e60f9),L_(0x000000b4),
+ LL(0x4083d41b,0xf3bbcb07),LL(0xe8c0bfc8,0x91274928),LL(0x9c0b763c,0xc81b7765),LL(0xbe1076e4,0xbf368625),LL(0x9568943e,0x8c2112ae),LL(0xb0cd4c71,0xf70e5fb5),LL(0x8fe2ec7e,0x76a5c64b),LL(0x867a5527,0xdac3d4b5),L_(0x0000016c), LL(0x3faf5b44,0x41c29ed5),LL(0x50ffd8e6,0xcb155068),LL(0xa9b2855c,0x28ae527b),LL(0x9d8e8d01,0x2a092960),LL(0x5cbf1edf,0x66ffe099),LL(0xb212b2a8,0xd340e610),LL(0xfc0600f9,0xa2f5aba0),LL(0xb08ba7b8,0x10dafa5b),L_(0x000001a7),
+ LL(0x0ca526cf,0xa9ed0f7a),LL(0x125b33af,0x1dd685ac),LL(0x516f5290,0x17e7ff8f),LL(0x927c416e,0x720475ad),LL(0x0fc77cc9,0x67e1e919),LL(0x3aec0717,0x6652fcb3),LL(0xcb2653df,0xd80f0d48),LL(0x8bf16720,0x98cc486c),L_(0x000000c0), LL(0x08404c44,0x7f43e4e4),LL(0x9c42e337,0xdefb2272),LL(0xc3b37e10,0xdaf241ae),LL(0xc795c866,0x0a07c892),LL(0xbf4d3079,0xb2425f5f),LL(0xa5db075b,0xb7cb5830),LL(0x0875f161,0x93c95089),LL(0x91cad664,0x21f9ae65),L_(0x0000000b),
+},
+/* digit=18 base_pwr=2^90 */
+{
+ LL(0xc3797559,0x266f6975),LL(0x22dfb9d9,0x599f544c),LL(0xdb081480,0x839c2be6),LL(0xeb8ec462,0xb5cdf12a),LL(0xd9d49cd3,0xa917fb29),LL(0x96146a8b,0x233b216f),LL(0xd936c0b8,0xf0abf1a9),LL(0x8c8a45a2,0xbb59a787),L_(0x000000fb), LL(0x0f5dd64a,0xd1625aef),LL(0x056528c2,0x5ff56fc7),LL(0x9b293d67,0xa5c323cb),LL(0x02b295cc,0x4d697cbd),LL(0xbc712910,0xe4eb4b02),LL(0xc1e4d83f,0xa4e9327c),LL(0x9c23cdd4,0x5af46cdc),LL(0x94640699,0xac05353f),L_(0x00000006),
+ LL(0x6147414f,0xaed9435d),LL(0xbd16db82,0x62ff16a9),LL(0x3b07e71a,0x52dcaf4a),LL(0xf9456ee7,0xea0d3e3f),LL(0x1d78dd65,0x64901fef),LL(0x31145bf8,0xbc9f4225),LL(0x366fd367,0x81cb13ee),LL(0x290083f4,0xbc209fe6),L_(0x00000193), LL(0x5232088e,0xc5e887c8),LL(0xcc7b3f38,0xf005e149),LL(0xe1bede78,0xe8c89874),LL(0x2dfeaf32,0xcb4e28c7),LL(0x3cb0a4d9,0xda48c711),LL(0xaf7daba5,0x1fe289a0),LL(0x0d3633ab,0xbd5d0dc0),LL(0xc0b05c86,0xefd7c801),L_(0x000000dc),
+ LL(0x85849a1c,0x74861653),LL(0xe1eb1a35,0xaf98abe0),LL(0x53b40a6e,0xf083ec36),LL(0x74acbc0b,0x0b5a921d),LL(0x28a65b06,0x5764e30a),LL(0x5588eb5e,0x62277d5e),LL(0xc8da671e,0x39cae462),LL(0x53bbf492,0xc9d38ca9),L_(0x000001ab), LL(0xa6baa014,0xd98a134c),LL(0x31e23fcb,0xdbe32368),LL(0xa8c7a352,0xef82abaa),LL(0xa98ba793,0xcbb55844),LL(0x1a07e161,0xaf3169a7),LL(0x4991ee4a,0x5cfbe290),LL(0x0c980dd6,0x56a21524),LL(0x1c07cd7d,0x6b70cccd),L_(0x0000000c),
+ LL(0x07567a7a,0x045155d8),LL(0x351697cf,0xce8bb246),LL(0xcba64633,0xdd5c2900),LL(0x24297174,0xe7f044c7),LL(0x0c3a3851,0x48c830bf),LL(0xd35ff595,0x817a26f0),LL(0x7d923f53,0xd93d8b02),LL(0x2b3dd7ca,0xbc01062c),L_(0x0000000d), LL(0xcc94cbf6,0x986d299b),LL(0xdf6f5c09,0xf89ccb5a),LL(0x5aee26f4,0x18699f82),LL(0xc1b545bb,0x6595e656),LL(0xb0d22aa5,0xa3953fae),LL(0x6abcba5e,0xa9580b4b),LL(0xd4e240d3,0xef465246),LL(0x13b6fdf7,0x97f3ed86),L_(0x00000124),
+ LL(0xbd979035,0xf355f70f),LL(0xc5a87f52,0x1b7365b1),LL(0x18c500a7,0x2dd3210c),LL(0xf547e418,0xc57a734c),LL(0x391d8bfc,0x928abb19),LL(0x5ec8dcf1,0x3e6991b5),LL(0x7de9b3d1,0x9e25eac7),LL(0x6ebd2b96,0x6a202a22),L_(0x000000d2), LL(0x7d70fd72,0xae0eb8d2),LL(0xf2114ba3,0xb57b0ed4),LL(0xe573b783,0xc65906cc),LL(0x0b2b3d21,0xfac74740),LL(0x9dbb25b7,0x6157bc5c),LL(0x6859f85a,0x21a21340),LL(0x0df614a7,0xbfacee18),LL(0xe4709b5a,0xa37c69b2),L_(0x000000ef),
+ LL(0x15b4091f,0x31ad054c),LL(0xdccd6f0a,0x57e2c372),LL(0x27698a20,0x9a3a4ffe),LL(0xcc03de8d,0xc754fb8f),LL(0xcd17cdf6,0xa956ebe7),LL(0x7cb9ef2e,0x9d18d38c),LL(0x190daaea,0xdc66f2ca),LL(0x7d783383,0x46f57c30),L_(0x0000012d), LL(0x727ea062,0xfefa898f),LL(0x773b6e5f,0xfbea71e8),LL(0x7460be92,0xc9254b56),LL(0x318caed7,0xc982d8e5),LL(0x7f1a16b2,0x9a4da06d),LL(0x38233ae7,0xe149d876),LL(0x3b8c2af7,0x70fc3c7a),LL(0xec4a5565,0x8d292554),L_(0x00000197),
+ LL(0x5f08f3c6,0xd02192ba),LL(0x05cbe08a,0xbb7b43e6),LL(0x4a339a92,0x2b4034e6),LL(0x1c6eea28,0x0145dd56),LL(0xb3481662,0x819f74ea),LL(0x5fdab086,0x2d08d669),LL(0x401f4d8b,0x87d855a8),LL(0x71a3977d,0x0a7c167c),L_(0x000000e6), LL(0x787e1654,0x7f231760),LL(0x1dcce655,0x2908ba05),LL(0x10acadce,0xe5a3ffa8),LL(0x60f31016,0xe1211553),LL(0x34c2a1c2,0xfe1b8dad),LL(0xa81d35d3,0xe7230bfc),LL(0x37a78d41,0xcfeaf774),LL(0x6e60ae9c,0x929625f5),L_(0x000001ed),
+ LL(0x898a64cd,0xda668233),LL(0xc8516d6d,0x1f40d7d1),LL(0x5fb1f564,0xd5a115e0),LL(0x7906c2d8,0x496ac4ad),LL(0x6f4efe00,0x3643f707),LL(0x6c892d97,0x414f5838),LL(0xe34b14c4,0x7c2d83c2),LL(0xc00d08bc,0xb5ea2437),L_(0x000000e4), LL(0xca445165,0x219e2e5b),LL(0xcbf3a3f2,0x118227ea),LL(0xf1a84019,0x6017e2ce),LL(0x58a5f9de,0x1922122d),LL(0xf1ecfa6e,0x98696eb0),LL(0xd3df6fb1,0x54826be2),LL(0x8fefc088,0x02dea006),LL(0x77c29791,0xd7ce374e),L_(0x000000d7),
+ LL(0xe65ce508,0xa5fec659),LL(0x0b177612,0xdd1bcbef),LL(0xfc84b3bf,0xe4569388),LL(0x984ce0ec,0x163caf98),LL(0x9cc1f201,0x3fa88dda),LL(0x39bac4dd,0x6c254803),LL(0x70562e22,0x75a93dd1),LL(0x2cbfcecc,0x16ebf295),L_(0x0000006d), LL(0x0ce600b2,0xe3dc17db),LL(0x5b060f2c,0x5399ddf1),LL(0xd74988f6,0x83e38dff),LL(0x2b96b9f4,0x87e221d8),LL(0x2c298bc9,0x0753b765),LL(0xd6bd45f4,0x27e5b1a1),LL(0x18ca1da9,0x41853811),LL(0x7849f1e1,0xf9e739bd),L_(0x000001fa),
+ LL(0x226b8a15,0xdb333954),LL(0x4e3975a7,0xaa52c0ba),LL(0x74176c01,0x1fd9d014),LL(0xa1a2b6b0,0xf61b81e1),LL(0x28415db7,0xd3614b3a),LL(0xa0f6000e,0x9e00e5a5),LL(0x5cf34986,0x9efe446d),LL(0x0b69d383,0x845d741b),L_(0x00000121), LL(0x2d0c1e46,0x1f77c4cb),LL(0x553d358a,0xe9f129ca),LL(0x071ebad1,0x088b2769),LL(0x8eb8c2d8,0xf3219a51),LL(0x877b3a25,0x17c5431a),LL(0x9c4b8adf,0xeac2ff93),LL(0xffc69d68,0x23d158f5),LL(0x2e0840d4,0xbd9e89fa),L_(0x00000048),
+ LL(0x6d2a4e6a,0xb45f9376),LL(0x6e78c290,0xbff42b2f),LL(0x5fb9af74,0x2af23d44),LL(0xaebdf547,0x7deaa238),LL(0x93a6597a,0x25df5576),LL(0x5dcbd040,0x6f6b456f),LL(0xa9249467,0xb63da0b0),LL(0x7f719d63,0xb3143ac8),L_(0x00000173), LL(0xda677478,0xcb218f05),LL(0xb119afe4,0x3e0b4052),LL(0x816ad70e,0x342ea279),LL(0x14498c92,0x7acbb776),LL(0xc4e09c12,0xbf8e66de),LL(0x0f290835,0x3edfdd90),LL(0x8ca19f41,0x794255ee),LL(0xa1bde671,0xd1cabfcb),L_(0x0000002b),
+ LL(0x4848eb20,0x80f21ad1),LL(0xde0fb7d6,0x8e50bcbd),LL(0x4c1119fd,0x83d6f607),LL(0xf9f2e435,0xd9961c79),LL(0x765361f1,0x625f26bb),LL(0x008a463e,0x2b47c8db),LL(0x87cd134f,0x328c3977),LL(0x36eea7ef,0xb645529b),L_(0x000000b4), LL(0x3d664722,0xdfe036fb),LL(0x206e887a,0x67daf1eb),LL(0x72f017c4,0xf7db19b3),LL(0xad33a99e,0x06ea7ba8),LL(0xf55c0da8,0x14bd637e),LL(0x9b12c024,0x59864973),LL(0xd282f3bb,0x55feed3d),LL(0xce69b372,0x299c53ec),L_(0x00000071),
+ LL(0xdf10c34e,0xb43675e3),LL(0xb8ad4110,0x19590538),LL(0x801f28aa,0x239ed388),LL(0xc602d7b2,0x3a5a6ad4),LL(0xbdc9fad5,0x62b5ae49),LL(0x135d222c,0x5042d74a),LL(0xc3f94c1d,0x28ba3dd9),LL(0xe0a1ec48,0x5abc7310),L_(0x000000f3), LL(0xceb5a088,0x77f171c2),LL(0x8f737348,0x31242fc1),LL(0xdbca643a,0xe44bcbd8),LL(0xcd573afd,0xbad62d6a),LL(0xc4c9f268,0x5d49ae75),LL(0x98fad2cf,0x9b8f817e),LL(0xd8431494,0x96bb2753),LL(0xc49e4432,0xa3c623a8),L_(0x000000d9),
+ LL(0xa4f9f22d,0x2ccfc8e8),LL(0x4cd46e2b,0xa48136e4),LL(0xa95491dd,0x8818327f),LL(0x6393487e,0x7a069a28),LL(0x98ab19e5,0x5c879344),LL(0x02491e0c,0x82e60002),LL(0x2abf1999,0xc0e10b00),LL(0x82724899,0x06d9bded),L_(0x0000010e), LL(0x4897df79,0x688c2193),LL(0x43479e7f,0xc705deaf),LL(0x5b79a04e,0x068f9205),LL(0xb2c04a79,0x3a42239d),LL(0x0245715d,0xa99eca86),LL(0x55284faa,0x9f983742),LL(0x07d9bbaa,0x5fe3bb74),LL(0x5a19431d,0xaebc434c),L_(0x0000013f),
+ LL(0x99e63ac2,0xac6175c0),LL(0xcb3bdf62,0x0d4bf222),LL(0xd9e5f622,0x83e1cd77),LL(0x4ca3e4a6,0xde0dce61),LL(0xf80cd49b,0xeac1e293),LL(0xf190c10e,0x901aa7ce),LL(0x30eda1d3,0x25f2f0a6),LL(0xa509dab1,0x7ead9599),L_(0x0000001e), LL(0x0ab974ef,0x9b6b41ad),LL(0xcc8fc9d8,0x20269236),LL(0x5472afda,0x81034020),LL(0xb7eb7c83,0x26dba78a),LL(0x7c59479d,0x81e829eb),LL(0xb0ba6216,0x1549f5f2),LL(0x843a5c45,0x18302134),LL(0xa2709e3b,0xf629ef4c),L_(0x000001d3),
+ LL(0xbde5f81a,0x8f81e9a3),LL(0x7f4da051,0x9720014a),LL(0xa02bf073,0x9ff1f457),LL(0xe074553e,0x3a46ea6b),LL(0x64351eaa,0x7e32f0dd),LL(0xd22b22b2,0xb488462f),LL(0xcafc2c23,0x566dddda),LL(0xfb75908f,0x6e12535b),L_(0x00000182), LL(0xe8987332,0xfe94dfd9),LL(0x4f63b44f,0xf9b91bc6),LL(0x0dbd772b,0xecb77f43),LL(0xd580392a,0x2fb67ddf),LL(0x1ddc69fb,0x2fdb69c9),LL(0x9ea2314d,0x754b9b9f),LL(0xe624f23e,0xf3f2e9c2),LL(0xc6e677e1,0x734230a3),L_(0x0000016b),
+},
+/* digit=19 base_pwr=2^95 */
+{
+ LL(0x14f438f4,0xd13ff0c3),LL(0xb8e45f22,0xd55796ec),LL(0x3dd2e2bb,0xf830ab87),LL(0x9eb71d33,0x14a36478),LL(0x83167e0b,0x46513aa4),LL(0x793502c2,0x03e86d3a),LL(0xb0fe98cb,0x4eb2db2b),LL(0x0404a0ec,0x002c10d7),L_(0x00000162), LL(0x8f4384c5,0x0cd19a5c),LL(0xc19b3257,0x1c33b468),LL(0x9210942f,0x29ccbac3),LL(0x36048a2a,0xd4ffa97d),LL(0x4f69ef5f,0xcd6b0a67),LL(0x82d0ece5,0x13229739),LL(0x4bce1b8b,0x491493bd),LL(0x4d6596bf,0x6c17983d),L_(0x0000018d),
+ LL(0x560db5e8,0x1117f6d4),LL(0x8e19b583,0x1106059c),LL(0xe8232c57,0xc78f908c),LL(0xd0f09782,0x4a24aa92),LL(0x8bd0fcb6,0xd766becf),LL(0xf59977e3,0x155f53d2),LL(0xfa9a727f,0x49389ae2),LL(0xff877e92,0x595c1920),L_(0x00000027), LL(0x9985d510,0x3b4e5204),LL(0xe4788dc7,0xaa68342b),LL(0x8a0ca8e6,0x7b14f89c),LL(0x66874892,0xf19eb3e8),LL(0xe17375dd,0x5e5f8b7c),LL(0x652a41d1,0x2912af54),LL(0xa86a7275,0x5ab9a777),LL(0xbaf706d8,0xa88b103b),L_(0x000001a5),
+ LL(0x8ca944bc,0x4852fbcb),LL(0xbefff557,0x0369a497),LL(0x3e3736fb,0xe2bb7551),LL(0xd21615dc,0xe6d3b727),LL(0xe319eb4c,0xe8de5f7d),LL(0x48fe4856,0x592a3396),LL(0x7516380a,0x80dc9aef),LL(0x51f52af0,0xddc54f51),L_(0x0000001a), LL(0x98c6421f,0x38523c52),LL(0xec51f4f2,0xf58cc95f),LL(0xbc6c8082,0x36ef370c),LL(0x7bc605a3,0x8ac270e3),LL(0x83d78da4,0x0412498a),LL(0x6de54abd,0x66b38131),LL(0xdb62d8c6,0xe06d3c3f),LL(0xf5e45a86,0x4e3ea929),L_(0x000000f5),
+ LL(0x4517d395,0x53d2cbb1),LL(0x5b733d69,0x44a3ef5b),LL(0x472126ff,0xee076565),LL(0xa4a1334d,0xb26c37b2),LL(0x12573d17,0xb5b29517),LL(0x129c2c7a,0xd328148c),LL(0xa2c72b08,0x08907f5a),LL(0x1d10e103,0x4f66b18b),L_(0x00000085), LL(0x5e159666,0x9359d888),LL(0x4827d5dd,0x0281b6f1),LL(0xa475f3a4,0x6b19bc4b),LL(0x2eef4469,0xdc6dfbc3),LL(0x782b50db,0x9ef4383e),LL(0x0583236a,0xd7320845),LL(0x7767db3f,0x0dd190b0),LL(0x3c0278a0,0x96afa315),L_(0x0000002a),
+ LL(0xb03b1675,0x97e68374),LL(0x1c499646,0xae2f3284),LL(0x74508785,0x0255084b),LL(0xf1921ad5,0x6ea40714),LL(0x2aabd8cb,0x516433de),LL(0xd1c8abdf,0x5d2d8ded),LL(0x8f5d7b6f,0x421e5a19),LL(0x2d6ae9c5,0x9eaf7e7b),L_(0x0000018a), LL(0xd9a89463,0x4310dcf0),LL(0x0122d1b0,0xd2489f91),LL(0x4e7b58d3,0x655fdd5d),LL(0x40c4379c,0xc7862d42),LL(0x6da55b4a,0x975cc64c),LL(0x1e1d3862,0x84484f68),LL(0x301cfa3f,0x2a16eb0a),LL(0x20ebbbdb,0x293922e4),L_(0x00000132),
+ LL(0xc0ba905f,0x5b3d8d39),LL(0x62a268ee,0xea2a0a44),LL(0x094457cb,0x80f032f3),LL(0xab36ceff,0x8790739b),LL(0x21b0fdf3,0x40209bce),LL(0x38249dc8,0xf0c1c8e0),LL(0x213ecb4d,0x70c51d81),LL(0x2b025e0d,0xac4a363c),L_(0x000000a8), LL(0x493bb32c,0x798bfbf2),LL(0xf622fccb,0x28838277),LL(0xc2594827,0x5cbe5b67),LL(0x2c07c4dd,0x2c4c703c),LL(0x1c19526a,0xdcd0df4c),LL(0xed390177,0x57a743a1),LL(0x3a4c5274,0xac32bea6),LL(0x1c302e78,0x133f075d),L_(0x00000097),
+ LL(0x18bc0976,0xa3094433),LL(0x7cfa690a,0xca509300),LL(0x660a165b,0x9645aafc),LL(0xdcef6d7c,0xd90c6f35),LL(0x07a41bbc,0xad0dd448),LL(0x702e476c,0x5c881f7f),LL(0x2185a821,0x9c91260c),LL(0x0622b914,0x6ca1be63),L_(0x0000001d), LL(0xfe64e60a,0x59c3b83d),LL(0x192bd9cf,0x5bdb24df),LL(0x69659379,0xa9cbc111),LL(0x437b31e8,0x2954601b),LL(0xb7b5589c,0x13c392f3),LL(0x97064b9e,0xf1845fb5),LL(0x8d803336,0x7ea9c980),LL(0xea2d2221,0x36a667ca),L_(0x00000196),
+ LL(0x23fc5003,0xa9841f43),LL(0x62407436,0xc6f35f8a),LL(0xfc260a1f,0xf5e9286e),LL(0xe74c4b2d,0x504bfafb),LL(0x7cb3568b,0x3548e504),LL(0x1af9dbcf,0xd92aaad7),LL(0x85e423c5,0x2d182410),LL(0x94d1d884,0x1fe174f8),L_(0x00000105), LL(0x9975b2a3,0x55f78348),LL(0x0939eec5,0x92b31a41),LL(0x23255263,0x4a1b7bc2),LL(0x65a25c26,0x283464db),LL(0x08fc1aed,0xecd1a9b7),LL(0xea335c70,0x90a7a2a0),LL(0x9f14ffdd,0x7fd21f2e),LL(0x9566dadd,0x36ebafb4),L_(0x000001e5),
+ LL(0x578b8f88,0x2bbf7009),LL(0x8c4ed5a7,0x30e7b9aa),LL(0x30aeacb4,0xe07a93f1),LL(0x58d02f17,0xbcf5fa42),LL(0x7c6f83ed,0x228f3e47),LL(0x91d5ba0c,0x815eef51),LL(0xe37c3b79,0x0528cf82),LL(0x507b5dce,0x7d4e9bf2),L_(0x000000aa), LL(0x5a682d56,0x14eac39b),LL(0x72ce45fa,0x90b36bc5),LL(0x5f62d8bb,0xadbc91ec),LL(0x9d5e2385,0xfae2e6dd),LL(0xef20a2d0,0x380bdc5e),LL(0x9c9037ea,0x2d48d188),LL(0xdd58b76d,0x6a4ce00a),LL(0xb6e3d5d7,0x2f506090),L_(0x00000135),
+ LL(0xfffa5757,0x64cbfd55),LL(0x1f1c3ae1,0x8a854545),LL(0xd0be9705,0x7272e007),LL(0x2a8f4c49,0x254138ed),LL(0xc97ed736,0x15e864c7),LL(0x83df5162,0xb624fc1b),LL(0xf4114fdb,0xcc0313aa),LL(0x8c7f0423,0xa6edea7a),L_(0x000000a8), LL(0xa4ed76ab,0x3e74f599),LL(0x8b381bfe,0x25d1f92d),LL(0x9e406956,0x06a5a359),LL(0x869bdf5e,0x5afaf671),LL(0xaec86f62,0xbbcc12cd),LL(0x0dd1d724,0xda751689),LL(0x21630603,0x409b6925),LL(0x1f15a18b,0xa4edb254),L_(0x00000191),
+ LL(0xc7b9233c,0xff6a30c8),LL(0x6ecefcff,0xf3d40688),LL(0xfad25722,0xc51d4aa6),LL(0xf9c6f8fa,0x3fae03f2),LL(0xc7864470,0x5ca7328e),LL(0x4201ca64,0x4b3ff739),LL(0x08cad454,0xb2721cee),LL(0x43bf4523,0x4594a3d1),L_(0x00000197), LL(0xaf0e573e,0x2a8f8fba),LL(0x3f5e67f8,0xae4ce46a),LL(0x616a72e1,0x906994c7),LL(0x3a7f4aec,0x055b94c2),LL(0x8bb69b90,0x67e39f74),LL(0x4eead34a,0x7a7cada3),LL(0xf92b70d7,0x9b22abe2),LL(0xca616691,0xa5cfde92),L_(0x00000052),
+ LL(0xd5e1c4e6,0x7ad659b7),LL(0xe2f2a298,0x3f7f338d),LL(0xaaeb06f1,0x6d9b55a5),LL(0xa60e84f2,0x30c6f8b9),LL(0x9d105631,0xd017d58e),LL(0xfa41e760,0x9e20b973),LL(0xb2f4acf3,0x840eaafd),LL(0xec9c6ab5,0xcbac2501),L_(0x00000065), LL(0x22f4549b,0xb140b897),LL(0xc2510a98,0x3e099225),LL(0x9117bbe6,0x18af31b1),LL(0xba7147bd,0x68bb5c46),LL(0xf0f540e3,0x29d33114),LL(0x1c9aeacf,0xe59588a0),LL(0xeb2d0e67,0x29ef0e25),LL(0x4bb1b8d0,0x4c60558e),L_(0x0000014b),
+ LL(0xfaf6783d,0xd0223b63),LL(0x4dcebc43,0x6472ecb7),LL(0x6ff8245b,0x1d3fdb09),LL(0x3439a621,0xa67bac9a),LL(0xd009a2d7,0x94c65387),LL(0xf330caae,0x19a02e17),LL(0xa6f7e5f9,0xb2396a55),LL(0x5fef60ca,0x08eb7e67),L_(0x0000007f), LL(0xefd6a160,0xefa0d1c9),LL(0xbd7c0837,0x2ede1f4e),LL(0xfcadb9c0,0xf4756366),LL(0x47882726,0xcd42f3e5),LL(0x5c040ce2,0xa61b16f9),LL(0xdb84713f,0xc4ef07e5),LL(0xe43320a0,0xecb2b8ce),LL(0xac70be15,0x4eb58c90),L_(0x00000124),
+ LL(0x0457915c,0x89a3e1eb),LL(0xe08cc88e,0xed12c670),LL(0x89133ab9,0x1faeab1d),LL(0x15d9bc0c,0x3c4250f6),LL(0x881504d6,0x084c8e8f),LL(0x3ead62cd,0xaf76dbe5),LL(0x49cfac6a,0x85bf1dcc),LL(0x007ea0b8,0x8816bfc7),L_(0x0000016a), LL(0x47472352,0x123835c7),LL(0x80692fa2,0x67bab29e),LL(0x8379c2a8,0xc2ecca00),LL(0x9065aafb,0x32da9779),LL(0xda605d2e,0x421bbbfb),LL(0x12432283,0xbdc2e115),LL(0x9c126b9d,0x437a9d89),LL(0x7ce3f8d6,0xa0a2a746),L_(0x000001f8),
+ LL(0x5b6dacf5,0x7ae17558),LL(0x1b0157e6,0x314ffaf0),LL(0x03819c6a,0x9d2d7013),LL(0x0e14b9b1,0xc8c2b439),LL(0x91c83635,0x9f636f0b),LL(0x98fed93b,0xe579e47a),LL(0x23b6808c,0xaeb0f547),LL(0x8d044288,0xcd184b66),L_(0x00000151), LL(0x891f32da,0xf965270d),LL(0x655e3634,0xe11f64ad),LL(0xacfd673c,0x1b496453),LL(0x68fb4507,0xdf15820b),LL(0x64f7f419,0xd816e8bb),LL(0xfdaf2edc,0x0858d605),LL(0xd9f619c9,0xbbe07451),LL(0xb9e75198,0x3e93a602),L_(0x00000116),
+ LL(0xe000c97f,0x5fa6cdb3),LL(0x595ed0a5,0xfd5fcd60),LL(0xa02a23c6,0x76e522bd),LL(0x61844a1d,0xbaf8c003),LL(0x0c6c179e,0xd0a47af4),LL(0x6aa1a6cc,0x71e2a115),LL(0x4eb00620,0x2ca1b0fc),LL(0xc1c5314a,0x3dce0bb4),L_(0x00000094), LL(0xcdc04837,0x5b4e8123),LL(0x242a32ef,0xa7d67834),LL(0xccb0fead,0xc2a3bc3a),LL(0xe65ed32f,0xe7119407),LL(0xab8b44e6,0xaeb1712a),LL(0x5a5977e9,0x39ce4f89),LL(0x708cfeb0,0xa19d43ed),LL(0x4957cd1c,0x0562d425),L_(0x000000ce),
+},
+/* digit=20 base_pwr=2^100 */
+{
+ LL(0xc29a3fb6,0xcfe3b9a1),LL(0xca033fc3,0x8c5a528b),LL(0xb4bc3e3f,0x23396cd7),LL(0x4bd134e2,0x39c3eb8c),LL(0x565224c7,0x25548c0a),LL(0xf01471ec,0xb0fb17f6),LL(0x5fc65797,0x18aee101),LL(0xc4d69b6d,0x07d23448),L_(0x0000005e), LL(0x0074be70,0xa14b550a),LL(0x52425042,0xf8e6b95a),LL(0x3f438c42,0x0174e981),LL(0x81004aa1,0x34ae4351),LL(0x510cd9a8,0xb1b67e29),LL(0x8cdf2105,0x41438bad),LL(0x8ec5ba91,0xc64d1130),LL(0x00e8c08d,0xc01f2343),L_(0x0000011e),
+ LL(0xb2625d11,0xdcf3505f),LL(0x9962934c,0xc306874b),LL(0x981e8fcd,0x02704410),LL(0x2bd0a650,0x249eb349),LL(0x6a534a84,0x6b6bb40b),LL(0x0c32e132,0xbe5d2914),LL(0xcb2ca52e,0x029956b2),LL(0x77c72251,0x01849b8c),L_(0x00000029), LL(0xfe2b4e07,0x6314442e),LL(0x4431d884,0x66618e79),LL(0xcd3eeea2,0x6a5a933f),LL(0x64415965,0xbda24f06),LL(0x522dc52f,0x82f45dda),LL(0xd412542f,0x0e5075c9),LL(0xff34a66e,0x9a2aba0f),LL(0x512c4a1d,0xb89bbd69),L_(0x000000f8),
+ LL(0xa3dc5b94,0x9872016b),LL(0x2889ccb7,0x1df5e18d),LL(0xe0129254,0xdbcaebf5),LL(0x4cd20b4c,0x63d6c33a),LL(0x1f301089,0xc46a1dad),LL(0x755fc0db,0x2c0e39b6),LL(0x6ef9e694,0xac07fa12),LL(0xd500d36f,0xd54aa805),L_(0x0000013e), LL(0xf90b5e7b,0x65e8dbbf),LL(0xeb8ecb37,0xe491cc2d),LL(0xd314c068,0xd31ab995),LL(0xe810513a,0xcca181b4),LL(0x9b50dc0f,0x0c1e0526),LL(0x89302958,0xb6453c85),LL(0xde5a7d26,0x3c9a98b2),LL(0x6f7a7718,0x3cbf6b38),L_(0x000001a3),
+ LL(0xd7d861fc,0x7b3c184c),LL(0x5c425a73,0x14a6e3b9),LL(0x85d4a651,0x532f514e),LL(0xb665bb45,0x8b87e598),LL(0xa66a39b0,0xdbcbbabb),LL(0xa46208db,0xa64b561f),LL(0x9520864b,0x05569250),LL(0xde8b31e2,0x46d15281),L_(0x000000a8), LL(0xdd1bb6a7,0xe76a8c5d),LL(0xc0f66932,0xc6ee633c),LL(0xc546bb80,0x911f68d0),LL(0x828f4e0c,0xc213a206),LL(0xeb2a4276,0x04a16b2c),LL(0xcbe98cb2,0x38c09aa1),LL(0xbcc1671d,0xa6f3ebee),LL(0x7a684ba9,0xe784232c),L_(0x00000088),
+ LL(0x2ca34639,0x14b160b2),LL(0xe3cc4351,0x57f2d520),LL(0x8707011b,0x1d30ff78),LL(0xb1a346a6,0xd69eda68),LL(0xa84618b8,0x4008115f),LL(0x06f520c0,0xfeeecaa8),LL(0x6a14e30d,0xcc7e0843),LL(0x68bc839c,0x9aec405f),L_(0x00000113), LL(0xb3ae58e3,0xd35d5af6),LL(0xf29bb951,0x38625415),LL(0x552cd755,0xb49fd087),LL(0x87ef7e8a,0xde9ebd20),LL(0x76b067b5,0x110309c1),LL(0x1ece1e74,0xb224505a),LL(0x91a5a2d7,0x03ba9629),LL(0x79263dad,0x31e7eb88),L_(0x00000193),
+ LL(0xa71b7e01,0x5ba885f2),LL(0x915b6877,0xb98305b9),LL(0x53769a90,0x10c19b27),LL(0x8d87ac0d,0x8f7acf63),LL(0x583c77c1,0x64d02af2),LL(0x6e04d239,0xe5be9202),LL(0x8f85294d,0x3a5a3099),LL(0xbb22f880,0xf9b4d2d2),L_(0x00000113), LL(0x150daae0,0xf1b9b104),LL(0x500967b9,0xe48eb13c),LL(0xec3e5c4d,0x895cf9cc),LL(0xb6158629,0x7d90f3f7),LL(0x8aa201ea,0xc0cda29f),LL(0x0c9a6e88,0x4c0d7015),LL(0x97d1c62f,0x56ee70bc),LL(0x4fd0f68d,0xedd26b8e),L_(0x00000130),
+ LL(0x413edbb8,0x792ccd3b),LL(0x1564f76a,0x72527a7c),LL(0x2778d6f2,0x45b55b68),LL(0x67ba3cee,0x6e138f21),LL(0x5d96d43a,0x38c932f1),LL(0x63638065,0x4892afee),LL(0x6ed7c45d,0xb82b82f0),LL(0x287b4614,0xad914fee),L_(0x00000089), LL(0xb0953f4f,0x5150d18c),LL(0x107a5e99,0x67e23c2e),LL(0x71a733f6,0x2e8bfba0),LL(0xca46066c,0x1d6c6108),LL(0x8cfb4987,0x39bb5a64),LL(0x48164ece,0x0cf34f51),LL(0x336996f4,0xe99b9250),LL(0xd6e08146,0x773a9c69),L_(0x00000183),
+ LL(0x4008e517,0x7a6c13d1),LL(0xc5d69ab8,0xc4597b07),LL(0xc66db12e,0xdbd74a68),LL(0xca40dec9,0x4579d719),LL(0x5a617fff,0x13172539),LL(0xe3835876,0x09e3b946),LL(0x2478942d,0x42d20c85),LL(0x82ecbef7,0x34ea5879),L_(0x00000124), LL(0x5f589886,0xc9ae2bbd),LL(0x8ba22c3f,0x2126ee97),LL(0xe212b5ab,0xff875595),LL(0x389b739e,0x9d6707a2),LL(0x263595af,0x87d12dd7),LL(0x92670f97,0xb014c330),LL(0x00678803,0x692f506a),LL(0x060764da,0x2c056f67),L_(0x000001b4),
+ LL(0xa7daee3e,0x99e57328),LL(0x3e8ff84f,0x8d930fda),LL(0x140c8ff0,0x29def859),LL(0x514bf396,0x6dc6556a),LL(0x917c0e6f,0x1b3aa174),LL(0x2fd52f94,0xbc6b4711),LL(0xec0486f8,0x10164218),LL(0xfc4d6fdb,0x53878087),L_(0x000000df), LL(0x143ce621,0xb9fa1174),LL(0xb63c7e44,0x5ae8a4f3),LL(0xa5424b58,0x8d2b2e47),LL(0x1058f848,0xc653cf99),LL(0x5d72c078,0x9ab7f092),LL(0x5a469db8,0x0eb39c94),LL(0xb34488b0,0xd4f2904e),LL(0xff8c9e4f,0xf8df541b),L_(0x00000041),
+ LL(0x5b0f1fb8,0x0aa30019),LL(0xcd7cdff0,0xb19b5360),LL(0x2a32083a,0x1a886b29),LL(0x6fd83895,0x3e954ca3),LL(0xfc9e4bd7,0xf6dfbbe3),LL(0xd49474b0,0xbe5e429b),LL(0x6cfc9bf8,0xb282ba89),LL(0xd4f6b8c7,0xffc5e2b0),L_(0x00000099), LL(0xf0239d41,0x54cf1a20),LL(0xf833aa3b,0xbe4f75ce),LL(0x667c55f3,0x210d085a),LL(0xf20673c4,0x90bc983c),LL(0xe6d37945,0x2b933ece),LL(0x7400e31b,0xa73815a0),LL(0x0016f173,0x2d12b0bb),LL(0x04943106,0x2f2ea6cc),L_(0x000000b4),
+ LL(0xf8f8e68e,0x93b485b5),LL(0xbbae7e17,0x21f99dd4),LL(0xd3ee3730,0x8f41688d),LL(0x869cee4c,0xa7149163),LL(0x7ffdc064,0x1dd2e6f5),LL(0x3e9c9ee6,0x3e5343f8),LL(0x1bea26ce,0xd599de2a),LL(0xc95e92f5,0x12eb8e21),L_(0x0000004b), LL(0xc38ccf06,0x17914783),LL(0x5b85620d,0x3066f430),LL(0x8a55dcb5,0x73026026),LL(0x8691669e,0xe37b2f3d),LL(0x6c8abb34,0xb0b3d5e7),LL(0xe607781f,0x1d40a38b),LL(0xbd4e966b,0xa4bb9c3f),LL(0xfa1cc8e1,0x52c54053),L_(0x0000019c),
+ LL(0x61cb5b4c,0xa0ed42bb),LL(0xb44afbfd,0x8be8a8dd),LL(0x0621480b,0xe9c3bbe4),LL(0x3bbd013b,0x3dad214a),LL(0xf63413c0,0xf44a0f7a),LL(0xfedcc70e,0xababaa32),LL(0x0bd6ea84,0xd282fada),LL(0x556a1b66,0x85e11955),L_(0x0000005f), LL(0x2eb9a417,0xd244439d),LL(0xe9ea5bcc,0x6a6b06e0),LL(0xc7910063,0x95bae48e),LL(0x065bc250,0x8f84ff6a),LL(0x70b64554,0x1fab9066),LL(0xe0a46dab,0xe07a85ee),LL(0x8bdd86f2,0x832625e0),LL(0x012550fd,0x518e586d),L_(0x0000008c),
+ LL(0xafed2f9f,0x24dc0f96),LL(0xe142d2cd,0xa6689657),LL(0xea2d5cc5,0xae481b79),LL(0xd0bdf4f2,0x8a560bee),LL(0x85db3226,0xa5d11f99),LL(0xfd86b657,0x77ab3c4c),LL(0x9ecb073c,0x1fa5f6fb),LL(0x59db760e,0x55d4b8e3),L_(0x0000012e), LL(0x09f0d045,0x3533500a),LL(0x2990659d,0x4eb8eebc),LL(0xe68fe462,0x60e87a33),LL(0x48e37752,0xcd62216e),LL(0x703956e1,0x0dcfead1),LL(0x3a09a4d6,0x491340a6),LL(0x49d2c6bb,0x0b013428),LL(0x50df11ed,0xd9a7913c),L_(0x00000048),
+ LL(0xd8099e2f,0x2aad5a31),LL(0x5920a298,0xb4992465),LL(0x07aa2d85,0x6aeecdc9),LL(0xe712f629,0x2a16e6d8),LL(0x8639dfb4,0x36815fc1),LL(0x2a477d95,0x0b2f5359),LL(0x7c3ca55a,0x896f9530),LL(0x05522116,0xa9274ead),L_(0x0000008d), LL(0x208b956c,0x65da1fcf),LL(0x1c1f9a0d,0x1534c8eb),LL(0x772539f2,0xb39694db),LL(0xbc2cb67e,0xf14a06ea),LL(0xf6e48c27,0x4aa51441),LL(0xe7141d18,0xbd52c5e3),LL(0x7983136e,0x77a0099a),LL(0xd7f96b63,0xa49e12a5),L_(0x00000083),
+ LL(0x0a99ca48,0xd8a3e48d),LL(0xb1ee6ff6,0xa6f4001b),LL(0x2ec4e0b2,0x04f03a29),LL(0xe977781e,0x0605bcbc),LL(0x0f8d3aa3,0xa1ff6ad7),LL(0x052c4409,0x13eedc9a),LL(0x211fe699,0x4cc42df8),LL(0xd70f26db,0x9c11a057),L_(0x000001fc), LL(0x00258026,0x08667174),LL(0x7f49a77b,0xa5dfdb47),LL(0x0446d9f9,0x6b646fc8),LL(0x24ebc0c9,0xb269fd06),LL(0x244a494a,0xd5fd906c),LL(0x9c16866d,0x27e6983d),LL(0x545f39fb,0x798c184b),LL(0x5fdefa1a,0x5cbdd99b),L_(0x0000013d),
+ LL(0x1e365108,0x765f67fb),LL(0x1aae9f80,0xb1b38d14),LL(0x7a9407e4,0xc8424d69),LL(0x9693e7cc,0x91d93e3f),LL(0xba50e7d2,0x385c13c5),LL(0xd94ecd34,0x6fcf73c9),LL(0x80eb0bb6,0x0d598f4a),LL(0x1c4d4c29,0x1f3a1b72),L_(0x00000172), LL(0x3b0fb9a3,0x326d546e),LL(0x4c6d27ba,0xa848cf09),LL(0x09d2dc18,0x46c0e416),LL(0x6f0069ca,0x9231b926),LL(0x1c4aef79,0xbdbead08),LL(0x9d4dabac,0x272ba195),LL(0x8e216ceb,0xcc49b720),LL(0x83cc03ec,0xd678f2ba),L_(0x00000177),
+},
+/* digit=21 base_pwr=2^105 */
+{
+ LL(0xd64c0998,0x7c43b599),LL(0x85a2ec86,0x4c9f6ac7),LL(0x59f29f0d,0xfaa4ec8b),LL(0xf16ae8c0,0x2017604d),LL(0xab8d8f78,0xbb59089d),LL(0x2772bc38,0x38403982),LL(0x6e88e817,0xf3d1571c),LL(0x7d4e8e0c,0x4a1b1a7b),L_(0x0000016a), LL(0x477bc572,0x39b5eb10),LL(0x8d22a645,0x77d71bc8),LL(0xd769223e,0x9734dc62),LL(0xfe2b562c,0x41cdb0ad),LL(0x3173fab2,0x70ddf3ff),LL(0x997d6033,0x70dbbbbd),LL(0x6d59561f,0x998a88a5),LL(0x64aafc32,0x1f2324be),L_(0x000001d4),
+ LL(0x449a64c8,0x674c0fe9),LL(0x81603532,0x01e88fe6),LL(0x595c6e13,0x913b8697),LL(0xf6f513d4,0x3b6d478c),LL(0x88c1e320,0xb2857351),LL(0x90cfb68d,0xdfb9fd43),LL(0x6c4bb93b,0xcc660149),LL(0x3f388af7,0x73e97063),L_(0x000001bd), LL(0x9a5258fb,0xacae0a8b),LL(0xb741a40d,0xba0560ab),LL(0x795d005e,0x3978bc6a),LL(0xcaa47999,0x1c0b2496),LL(0x1ff04fef,0x6ddcefe7),LL(0x47c3b092,0xf281ff39),LL(0xcc93f3d8,0x23027cc7),LL(0x773c9a3f,0x2ea46e78),L_(0x00000046),
+ LL(0x21f6a156,0xc4591dc9),LL(0xf7c15406,0xb36c8aaa),LL(0x3b0d0813,0x287834fd),LL(0x44ef9e76,0x94a18ce5),LL(0x52fb6092,0xbd019877),LL(0xb24d08d9,0xd4816092),LL(0x39d2d32c,0x188b097d),LL(0x5b9f00f2,0xa3f1ab3a),L_(0x00000003), LL(0xccda9d6f,0x41dad104),LL(0x637d2807,0x4ee619b7),LL(0x0f5a9cc8,0x4f3d7156),LL(0x97bb554b,0x367054b8),LL(0xe890a210,0x3f1f61c3),LL(0x0784aff6,0xb92963c2),LL(0xc9acc43c,0x309317af),LL(0xdadb0d3e,0xf3d3b5c1),L_(0x00000012),
+ LL(0x6d5e67b8,0x049665d8),LL(0x19993eb2,0xb56e1ced),LL(0x7a62ba87,0xdfb9c1fc),LL(0x6fc5cf75,0x4712b627),LL(0x554f5dad,0xe0548bd1),LL(0xecba89fb,0x1ee24125),LL(0xfa18f5ad,0x7e176a53),LL(0x8796b526,0x557064e1),L_(0x000001aa), LL(0xada0f1a1,0xe4e5f968),LL(0x89107584,0x8e12a3e0),LL(0xd6a2ba69,0x1ee9c73c),LL(0xe23b2a1f,0x43a76e02),LL(0x428e9adc,0xe3d7526f),LL(0xf09d62c6,0x0557ab8a),LL(0x37cd537d,0x2758b1d3),LL(0xe54434b8,0x3d68a000),L_(0x000000f5),
+ LL(0x2d008a6b,0xd28295a8),LL(0x6d2db388,0x2d6dd882),LL(0x7d1d9977,0x1f0a2196),LL(0xa51d2cc4,0x5e445be3),LL(0x52abdb6b,0x3146aac1),LL(0x1f1b1ee1,0xfac49408),LL(0x92df369d,0x84b1d832),LL(0xf67ffdf5,0xac7d64da),L_(0x0000005f), LL(0xba8a7d18,0xfa0e70ac),LL(0xf53c34b6,0x3063c19b),LL(0x4954b990,0xcac557d4),LL(0x2d1447f0,0xc89953df),LL(0xc7aef4e6,0x66df6476),LL(0xcb978dd6,0xc6d8f86c),LL(0xf9c4098f,0x024e891d),LL(0x25468ae2,0x0b1850aa),L_(0x0000006a),
+ LL(0x9893947c,0xe7519a11),LL(0xc44aa926,0x9787209d),LL(0xf096efcd,0x743501fd),LL(0xce9a1706,0x1f7551cc),LL(0x684716f6,0x8dae5405),LL(0x149e678c,0x4cc025ce),LL(0xa47c9f5e,0xb9f91415),LL(0x9acbec1a,0x39acf658),L_(0x0000019f), LL(0x1acf3849,0x7e3ea9f8),LL(0x0e3c4dae,0x4d104dc4),LL(0xadaff9d7,0x5ec06e69),LL(0x2c84d798,0x553ccd90),LL(0x93c28668,0x32f13211),LL(0x585b3068,0x2907a89a),LL(0xcdceca12,0xb9c0d594),LL(0x128fec44,0xf4db515d),L_(0x0000016d),
+ LL(0x1698ff12,0x50452a3f),LL(0x34e63149,0x70c02b2e),LL(0xa04d3b54,0x3afdb0b0),LL(0x61ed2692,0x91c5ad02),LL(0xd6e4e6a2,0x602aa43c),LL(0x134189db,0x4a9101c1),LL(0xf2cd081d,0x4ee8352b),LL(0xf7a72eda,0x24e8f999),L_(0x000000eb), LL(0x04ba1ce3,0xf4179875),LL(0xa4294fcb,0xe4a0b700),LL(0x05833496,0xb77b6e65),LL(0x8229a64f,0x204eabae),LL(0xe9137cfc,0x4ba1e0a9),LL(0x66c9fb36,0x5ece8d91),LL(0xabbbb589,0x725a0003),LL(0x62522294,0xdcc40fa3),L_(0x00000167),
+ LL(0xfe36c3a6,0x11953f80),LL(0xd15f704a,0x0b4cc57c),LL(0x3d3a8bb5,0x347df44d),LL(0xb5099398,0x3789e215),LL(0xd81f3a55,0x5f2bce30),LL(0x853ed011,0x0b7f91f0),LL(0x20d53ac9,0x8d7ec293),LL(0x63e7bfbe,0x8e08485b),L_(0x00000157), LL(0x56cdcd80,0xc636cf5e),LL(0x21241d8f,0x6e4c3d96),LL(0x6812f9d5,0x81fb84a8),LL(0x7741d3de,0xb50a7928),LL(0xbab3d77e,0x7cc80386),LL(0x8f374862,0x1901afee),LL(0xbf5ceb2a,0xdd95591f),LL(0xed0c8140,0x58db480a),L_(0x00000046),
+ LL(0xf412c36c,0x0ee07a01),LL(0x426518b8,0x54499ba5),LL(0x89e701b7,0x380c3953),LL(0xf3f8a9a9,0xd8749088),LL(0x809a3666,0xc559f6c7),LL(0xe768213d,0x64aff50b),LL(0xaad0b2e7,0x0535ff88),LL(0x68771b34,0xcb2d46cd),L_(0x0000017f), LL(0x7ec42d0f,0x4a3e7bea),LL(0xf9c7931c,0xe0127a41),LL(0xe2d8d114,0x88a09cfa),LL(0xc08a0d23,0xa27150fc),LL(0x052224fb,0x1880e3c3),LL(0xc80a285d,0xc9c2bfb6),LL(0xd52dcb46,0xfd0b235d),LL(0xfb31d609,0xc8ebb8df),L_(0x0000014b),
+ LL(0x058ee09e,0xf551f7ab),LL(0xd68828a3,0x85ee0c11),LL(0x6925306d,0x45a463ec),LL(0x9d6c7188,0xf851554d),LL(0x962b1441,0x66783d33),LL(0x32aca09e,0x856ca966),LL(0x9146adcd,0x5f7a7608),LL(0xfe631a24,0x269af51f),L_(0x00000087), LL(0x28d6e11e,0x0d442988),LL(0xc65a878d,0x0f8c7ce6),LL(0x332a94e8,0xf933213e),LL(0x0a2bf942,0x055f0bf3),LL(0x0e64c7cf,0x371deac5),LL(0x34d3b9fd,0x384367de),LL(0x6f42cc1a,0x15ed6027),LL(0x8f2a65d1,0x58437198),L_(0x000001ca),
+ LL(0x1243edd3,0x7356cd93),LL(0xc68eb0e6,0xfc213d5b),LL(0xa963c442,0xd8a42be8),LL(0x426acfcc,0x4e52c125),LL(0x3019a35c,0xcccbb098),LL(0xcbc21858,0xd433019c),LL(0x687acf0a,0x47525d0f),LL(0xce5e2216,0xe523322f),L_(0x000001cf), LL(0x88d6b26d,0x6dad247f),LL(0xa7f32d3f,0x70a43312),LL(0x340a2808,0xe2da73d8),LL(0xed020b20,0x477f5bf7),LL(0x752a7c57,0x84e84209),LL(0xaf283680,0xdce8d8d1),LL(0xf2a576b8,0x4e1b6410),LL(0x6cfe6e79,0x69ed0095),L_(0x0000008c),
+ LL(0xf28c9f4c,0xd2aab695),LL(0x7916e1ca,0x8e97f41e),LL(0xe9e93d40,0x40703872),LL(0xd7c8afdf,0x78640530),LL(0x8fe1f1c7,0xfb5cc433),LL(0x2060da94,0x7302096f),LL(0x953a5bfe,0x62d3763e),LL(0x4947fc61,0xeba19a33),L_(0x00000049), LL(0x92108fd5,0x8477b34f),LL(0xe9b6b7e8,0x31f306a1),LL(0x306db354,0xd16d3be6),LL(0xdf966d91,0x0deb9d15),LL(0x62b5d760,0x613eaff2),LL(0x22a569a2,0xae4f8efb),LL(0x0eeb67c4,0x9bca80a4),LL(0xac4e55dc,0x0d30055e),L_(0x00000183),
+ LL(0xe7b9391b,0xb559bea1),LL(0xd94e135b,0xbbc93e2a),LL(0xca27f88b,0xda4f9fae),LL(0x9fac28c9,0xe1b8ef16),LL(0x5f1ec2d6,0xfd385151),LL(0x49bb68ca,0xfb07a8a5),LL(0x55e48d66,0x146bc523),LL(0xe1490dad,0x0b9411ce),L_(0x00000010), LL(0xd3c160fa,0xec69a98d),LL(0xf736bcb4,0xb1767df2),LL(0x0bfa04f5,0x48e96045),LL(0x87d98ff0,0x977f6553),LL(0x6992858f,0x17332805),LL(0x22fe39cc,0xe8ffd592),LL(0xc326d64f,0x6551c98c),LL(0x12a83f56,0xa04ddf29),L_(0x00000192),
+ LL(0xdef70c89,0x5d8bd28a),LL(0xb3dcf1dc,0xe969cb6b),LL(0x157c6b46,0x846f656e),LL(0x30bef44a,0x3e3ab4ad),LL(0x14cc18c8,0x63d1dbea),LL(0x10262f96,0xfe27704f),LL(0xa567503f,0x1ff786bf),LL(0xff184f96,0x3fcb21d0),L_(0x000001f6), LL(0x92281a63,0x41b9f732),LL(0x4f7c669f,0x4f4c7a3a),LL(0xd9aab809,0x6fecf938),LL(0xece45010,0xbed97dd7),LL(0x20855b33,0x41c58421),LL(0xda8500b4,0x6bc3ec2e),LL(0xf0a33322,0xa1fd8aed),LL(0xe01eb188,0x1be357d3),L_(0x00000141),
+ LL(0x1799b47a,0x205f8a25),LL(0x5c7dce04,0x6bc7753c),LL(0x918feeda,0xb0bd3460),LL(0xba66aed0,0xfae70886),LL(0x5d2bdd64,0x37b93501),LL(0xa85e194e,0x12025c5a),LL(0x44f97270,0xb54faac3),LL(0x98c400c5,0x8d500c94),L_(0x00000190), LL(0xabe22aa5,0x3c01512e),LL(0x99aa80de,0xca5be145),LL(0x312f55d9,0x8dbfded4),LL(0x1ca51916,0x3f318a7b),LL(0xa0b3f9fb,0x42abfb1f),LL(0x2303713b,0x195a32bb),LL(0xb6968fd2,0x069ca809),LL(0x52819c4b,0x27ea438b),L_(0x00000079),
+ LL(0x662fcdd0,0xd8b1dbd1),LL(0x66c06c9a,0xaf6b6e15),LL(0x28998a9b,0xca45c4ad),LL(0x2d2005db,0xfcd947b1),LL(0x609acb17,0x6bf7b35f),LL(0x25ebaf2e,0xb8a8aba3),LL(0x599df520,0xe4302e3f),LL(0x2bf9b973,0xf871980d),L_(0x000000fd), LL(0x25aebd11,0x8868630c),LL(0xa5529c40,0xaf7c4f6b),LL(0xf5657b1a,0xc0fd49e0),LL(0x3fa70b84,0x4d86ecda),LL(0x39f53004,0xc59dce6d),LL(0x39513f7e,0xbdaf7343),LL(0x822c2924,0xce22dd61),LL(0xacb0786e,0x78182466),L_(0x00000054),
+},
+/* digit=22 base_pwr=2^110 */
+{
+ LL(0x55dedb27,0x5a0fc338),LL(0x03e8af53,0x788ccd88),LL(0xe10cabd0,0xa1f1f7d6),LL(0x5f889d7f,0x0487ee35),LL(0xa583e303,0x1885d800),LL(0x2fc9f3dd,0x09ae9a4a),LL(0x2887b5bf,0xa554fc30),LL(0xd91181d3,0x1d189678),L_(0x000001e4), LL(0x53b146d6,0x52f280d5),LL(0xdfaac466,0xe0b73d63),LL(0x0d77869d,0xa8a399cd),LL(0xba5ffe6a,0x5c61b757),LL(0xaffc1da6,0x71cf6c9e),LL(0x34d27387,0x20ae1248),LL(0xf184b956,0x7f6504de),LL(0x1c974cb4,0x94c62d76),L_(0x0000019b),
+ LL(0x659b9b53,0xd37156ff),LL(0xf8338bab,0xa115d2c7),LL(0x9d1175b5,0xa927371c),LL(0x53c22d6a,0xe5b07da3),LL(0xb79ee37b,0x3585421c),LL(0x8ac92029,0xbe2b0a93),LL(0xd489e47a,0x363622f3),LL(0xccd5811b,0xdf568ac9),L_(0x00000183), LL(0x41cb54f0,0xbf83fb74),LL(0x527b4fee,0x7d9fa2d5),LL(0x6d4a3597,0xf8ab4037),LL(0xe4619c87,0xd590e945),LL(0xab913b27,0xe8861075),LL(0x389b1da0,0xd8fb707f),LL(0xe0beb49d,0x35140b6f),LL(0x392dd172,0x0d587bf7),L_(0x000001ea),
+ LL(0xbf4176d0,0xfe15067e),LL(0x0120bf23,0xc1d45172),LL(0x0cb82143,0xfbe2cf59),LL(0xb0e80076,0xd69fd57c),LL(0xbd9b2caa,0x78503bca),LL(0x99823d72,0x2730e435),LL(0x31cc7be0,0x4b145b24),LL(0x10f8d6e3,0x7db8fea2),L_(0x000001cf), LL(0x4fc47dab,0x7a72c91b),LL(0x564e5846,0x5530b4bc),LL(0x1837936f,0x9913d2c3),LL(0xdf60105f,0x5f1a5851),LL(0x839ef0be,0x3d6d7b8d),LL(0x05890a65,0x48845fee),LL(0x57eb20fa,0xcc1288ca),LL(0xf7b7e05b,0xbf1a3cac),L_(0x0000015a),
+ LL(0x7082a01c,0x50e34426),LL(0x91616bf5,0x27cfd7b1),LL(0x426bd9ae,0xc299bf54),LL(0x5f468d0e,0x0487ca37),LL(0x695e6354,0xb93aa7dc),LL(0x9322f558,0x8f48edec),LL(0x818f0592,0x957ee742),LL(0xaca5b088,0x248afd23),L_(0x000001be), LL(0x11189720,0x45a01307),LL(0x348cb9e4,0x5bf246e5),LL(0xf5c183c6,0x3fd8ccf1),LL(0xe9a40aeb,0x0fbda6f2),LL(0x087abdef,0xdaf09cee),LL(0x90c450f5,0xe33344ee),LL(0x3abe1073,0xa3404424),LL(0x02a065d1,0x011c8b8f),L_(0x0000010a),
+ LL(0x5faa9290,0xbd275c4d),LL(0x69ab8c9c,0xebf0d548),LL(0x7a6bc4a9,0xe5ed16cd),LL(0x31faf28e,0x3e681735),LL(0xcf90331c,0xc624be8b),LL(0xfb66de1c,0x42603696),LL(0x2a65b006,0xc07466ec),LL(0x9d7f9688,0x84d634f3),L_(0x0000013b), LL(0x44e0d6d8,0x3db25f9e),LL(0xe7ca860d,0xa581c150),LL(0x1c6481b3,0x49e5b0b8),LL(0x62060736,0x82bc7eb1),LL(0x54daac9c,0x376c43d1),LL(0x68353454,0xfb293af5),LL(0x2dde1795,0x7e2ec37f),LL(0xed4ef8f0,0xbefc779b),L_(0x000001a4),
+ LL(0x4adfcff9,0x2b928ce2),LL(0xb2e63ba3,0xd02f461c),LL(0x73336d0f,0x04fd6cc5),LL(0x48e88a3a,0xc377597d),LL(0x56c730e8,0x5ac92cdd),LL(0xaf7486b7,0x0317d853),LL(0xe151b910,0x0978da40),LL(0x86c35051,0x6108c40e),L_(0x00000134), LL(0xb333edf0,0x1ff77a8a),LL(0xd24f0df5,0xed7f23b9),LL(0xdfae6385,0xaa4f024f),LL(0x2a1af93e,0x2ffef5f6),LL(0x6f45d8a5,0x9aa11e63),LL(0x853bb088,0x2271f40e),LL(0x8ed5445f,0x3ccb38c1),LL(0x24afc179,0x6883bc27),L_(0x000001d3),
+ LL(0x57906522,0x85f7ceb0),LL(0xce569864,0x059b3177),LL(0x45f8df95,0x60efada7),LL(0x2ee7a947,0x87aafc1c),LL(0xdce2c588,0x17fd804d),LL(0xdcf2f1ac,0x10e82f62),LL(0x4b1309c3,0xe852efd4),LL(0x0ef30c42,0x8810a12f),L_(0x000000d4), LL(0x95ed2fc9,0x55cd2f37),LL(0x5d0e9c83,0x107085fd),LL(0x479d2ac2,0x85ff5e6a),LL(0x7bd3eb35,0xd6ed74ec),LL(0xc8a77d96,0x366d8e34),LL(0x3be40939,0xf0ec3c90),LL(0x11212f04,0xc317d540),LL(0x5743bb20,0x4f1fdd52),L_(0x000000c4),
+ LL(0xffb66d41,0x6ea70c3f),LL(0xc5491789,0xcb17d54f),LL(0x1eaf6e4d,0x7c642a64),LL(0xb15be10c,0x99328296),LL(0x611efe5f,0x30829e9c),LL(0x3cdec049,0x5f18e861),LL(0x1a7c38da,0xab7985a5),LL(0x3536d908,0x8a46db8f),L_(0x00000102), LL(0x8ece50b4,0x5435f6e4),LL(0x13d04672,0x60505d74),LL(0x07efc4e5,0x8a551fa9),LL(0xcc601ad2,0x8fed3391),LL(0x9eeaf4b1,0x4338a854),LL(0x72c52e1a,0x61868d33),LL(0xce70bb6b,0x9c3a511b),LL(0x5c8d75eb,0xf313ce1f),L_(0x0000008f),
+ LL(0x69ee64f3,0x508ada39),LL(0xdd8c7134,0xda598cbd),LL(0x36c545ec,0x05133eca),LL(0x0c3f5caf,0x2df79eab),LL(0x71cd5c2a,0x920bc258),LL(0xfa67ae73,0x1fd1e4a4),LL(0x2ed2d89b,0x48726f90),LL(0xd5a8956c,0x2a4c3dab),L_(0x0000011a), LL(0x6f23ba5d,0xb20e4dfc),LL(0x4bab12af,0x5fcc6747),LL(0x0006c88a,0xaa6ea9a8),LL(0xe8e4646f,0x9db86f5a),LL(0x8f1f8a76,0xec7745fa),LL(0x455291dc,0xe15a4259),LL(0x155de9ad,0x6c3a6e93),LL(0xf9fdf6e0,0x54f6c4df),L_(0x00000005),
+ LL(0x3dc752ef,0x14921ae6),LL(0xdad5624e,0xf829dec8),LL(0x1d1460ab,0x5833de5b),LL(0x9c1ff203,0xd5ded33e),LL(0xfac09cf2,0xbb7c2ad4),LL(0x82d6f980,0xf32dbe91),LL(0xad650ca0,0x82ca75ed),LL(0x6c58e180,0x360a9033),L_(0x00000156), LL(0xea9d2225,0xd3ca85cc),LL(0x434cfef1,0x3bb6dff7),LL(0xce357f60,0x56328ba9),LL(0x0e4a179e,0x4a4804e3),LL(0xe56b9eac,0x254a5b01),LL(0x72a81cd7,0x8b35d349),LL(0xe054875e,0xc8c87ac4),LL(0xe8c11607,0xfef9a015),L_(0x00000001),
+ LL(0x1c6cc43f,0x6f96d167),LL(0x794436fa,0x586761cb),LL(0xd20a52b3,0x3ae24479),LL(0xc24cf7e8,0x5d299550),LL(0x7aabd2b7,0x9cea4b13),LL(0x09feb305,0xd75ffb4e),LL(0x5b6a28d7,0x5d3cd9c7),LL(0x4d85737b,0x3f800863),L_(0x00000186), LL(0x743b9f5d,0xe042f5f5),LL(0xe03225a4,0xc7dc3d4b),LL(0xdfce41ae,0x51cdf46c),LL(0xd3c05da2,0x69bf3a35),LL(0xc18cbac7,0xc0889d43),LL(0x51fc0084,0xf694d481),LL(0xbfa4cfd4,0x05438a3a),LL(0xcb44f4a9,0x037fbdcc),L_(0x0000003c),
+ LL(0x22d68d2a,0x6f65a633),LL(0xd77949bf,0x368db479),LL(0x738f46ed,0xe52e22f5),LL(0x7212d465,0x4758d194),LL(0x8bb783e2,0xd677a59c),LL(0x1b239d33,0x60904604),LL(0x9c2f2775,0x8df6497a),LL(0x9be5339a,0xfc0bbe7a),L_(0x0000007c), LL(0xb5804d78,0xbd5cd190),LL(0xbfbebfb6,0xd58769b6),LL(0x66d25685,0xf9ea5b23),LL(0x206ac283,0x09d14a84),LL(0x845e93a9,0xe03b612f),LL(0xc6807818,0x061fa312),LL(0xeb980705,0x6b501efd),LL(0xfa3670b6,0x8ea0643c),L_(0x00000010),
+ LL(0x509702e1,0xaf686102),LL(0xc4201f85,0x800e44cf),LL(0x7e6e7641,0x35e4ed58),LL(0xa3fd838b,0x5af78edd),LL(0x728e86da,0x0effaedc),LL(0x6fd05e38,0xfd668fa4),LL(0x4ebcbbb8,0xe45dbf60),LL(0x21bf82d8,0xafb31f6c),L_(0x000000c4), LL(0xf066dcdf,0x1ca3b2b7),LL(0x73890298,0x96fc550c),LL(0xcc4f19d8,0xfc004a6a),LL(0xc9fae54f,0xcdd730f4),LL(0xa5e22c5e,0x2754c10a),LL(0xb60dac89,0x49c473e4),LL(0xd5465b8b,0x30fa2831),LL(0x14688f19,0xa1a65375),L_(0x00000100),
+ LL(0x8f88f135,0x7034290c),LL(0x2f4cd77e,0x61556d3d),LL(0xe5aea948,0xee182466),LL(0xf7fd60b4,0xfaab2132),LL(0x2107919a,0xb164b7c6),LL(0x4909986e,0xb4de2fa4),LL(0xe1076a94,0x331fc36a),LL(0x8fd3234a,0xadcb78d4),L_(0x0000009f), LL(0x07524382,0x3f9109b1),LL(0xec9a0d40,0x11cb9eb3),LL(0x7e1084f2,0x1e06d740),LL(0x00717031,0x2928ea89),LL(0x4bde88cb,0xd69d113b),LL(0x20f91a03,0x2ff2dbf3),LL(0x7a3884fc,0xdf24441f),LL(0x198806cf,0x69d88d2a),L_(0x000001dc),
+ LL(0x076f7438,0x1544e142),LL(0x15274247,0x022e14c5),LL(0x96077c3c,0x30862489),LL(0x789e3935,0x50c53e4e),LL(0x1141fcf3,0x3047c405),LL(0x2cd7f2a5,0x57a60daf),LL(0x9bc52e3e,0xcd0ce692),LL(0x21830d42,0x6d7217a9),L_(0x000001f3), LL(0x77ac72bb,0x403e48dc),LL(0xad70038c,0xc084214e),LL(0x170491ff,0xf7b0b5fe),LL(0xd8cf2d1c,0x4af0ed5d),LL(0xd8301c30,0x00208a5b),LL(0x33f56a54,0x18e018d4),LL(0xfa224eea,0xef56c21e),LL(0xaa9262c2,0x692f082d),L_(0x0000006e),
+ LL(0x328296f3,0x4bb11c1f),LL(0x6050199a,0x15b40849),LL(0x53a7ca7c,0x81bc50ce),LL(0x0a2c1da2,0x682873f5),LL(0x52c0e34f,0x44102170),LL(0x9c5ef21f,0x9f354fbc),LL(0x0bba954e,0x6cd7990a),LL(0x02432a32,0x37dabca4),L_(0x00000019), LL(0x2be6dddd,0xe55cac7b),LL(0x8a3b8a57,0xda37392c),LL(0xec1dc93e,0x2e3fecd4),LL(0xcf4f78c9,0xfedf3f09),LL(0x1ff689fe,0x03374052),LL(0x092dabd5,0xdf4087ca),LL(0xb9e4e110,0x9d02763e),LL(0xf3f329b7,0xdaeda689),L_(0x0000012e),
+},
+/* digit=23 base_pwr=2^115 */
+{
+ LL(0xbd54382d,0x826f7b17),LL(0x32c36ec7,0xdce64f28),LL(0x22a16680,0xab2193ae),LL(0xaf6a85c2,0x52cc0a0a),LL(0x2f202702,0xcc1335b3),LL(0x2afbf317,0x3743776e),LL(0x0deb4740,0xf9a19900),LL(0x61591f25,0xd91b36bc),L_(0x00000002), LL(0x1d84eebf,0xb06a4eb6),LL(0x8bb72608,0xb23e7396),LL(0x2e886104,0x992a3ae8),LL(0x7c8605d2,0x418a91d2),LL(0xe33bec6e,0x5f2b49e6),LL(0xa9d829d4,0xd1f4a3f4),LL(0xeb2f044b,0x28bc4cea),LL(0xb1ef09fa,0x00e53c63),L_(0x00000050),
+ LL(0x04826845,0x6b1ee54a),LL(0x9240015b,0x608b1dc0),LL(0x25698b8a,0xa1390509),LL(0xb5e532ad,0xdf4acb31),LL(0x30c41c46,0x16e05bee),LL(0x07d190c1,0x642c1273),LL(0xb566eca9,0x1b365a48),LL(0x5c3cffa2,0x3f2fc46d),L_(0x000000c2), LL(0x21b8836b,0xa0057686),LL(0x520f579e,0x7bf51510),LL(0xa43d38cb,0x0a4bbc0c),LL(0xfe21891a,0x687446c9),LL(0x1242b093,0x8feab881),LL(0xcacb6d61,0x7a921f31),LL(0xcf611aa4,0xc5cb09d3),LL(0xfef9a8ef,0xa83137d8),L_(0x0000012e),
+ LL(0x4375da6c,0x13287748),LL(0x4fda63b3,0xfa3518ec),LL(0xbc16ce7a,0x996ffb04),LL(0xf3ffb5fd,0xf0a2d30e),LL(0x6da8bb6d,0xa23e83a8),LL(0x08e806aa,0x0642e4da),LL(0x0286c1dc,0x84837dcb),LL(0x8196eb23,0x999ea9ac),L_(0x00000060), LL(0x1c8d1ec4,0x9c108506),LL(0x77ca438c,0xdc8649fb),LL(0xdbfc198f,0xaf929bb8),LL(0xa5fbf701,0x60078f43),LL(0xe25fdf9d,0x3f03bcb4),LL(0xca36812b,0x53c1eaae),LL(0xb394d3a9,0x1f8445ff),LL(0x78a7b4ab,0x8305bbeb),L_(0x000000b0),
+ LL(0x6d42c81a,0x40e01936),LL(0x7487e815,0xd6072e7b),LL(0x32da913c,0xe7b4156c),LL(0xf1e87478,0xb217423d),LL(0x4880f5cc,0xca344dd5),LL(0x90182347,0x15da2c26),LL(0x87d2337d,0x8d993e28),LL(0x604cc23f,0x0e937379),L_(0x000001ea), LL(0xf9778d40,0xc9dd1808),LL(0x4345027e,0xdcd7b63f),LL(0x198a63ab,0x03bcf65f),LL(0xa7a4c388,0x1130c2d3),LL(0xb476f99f,0xc1ea5019),LL(0x991ad6b9,0x4f67377e),LL(0xa9f5ad13,0xd99047df),LL(0x80641e2f,0xd93815dc),L_(0x00000185),
+ LL(0x2a4af296,0xf45a67c1),LL(0x963ea378,0x3fc32889),LL(0xe19e2266,0x2477017e),LL(0x3e1c3af5,0x1bbfecd7),LL(0x9c6aea32,0x03afdf5f),LL(0xdd92f5ef,0xd2ffd177),LL(0xcff66e71,0x22d56579),LL(0xca369a53,0x098e3322),L_(0x000001b9), LL(0x3ecebaa8,0x87cbd3db),LL(0xfef4d6ca,0x92b7d8a0),LL(0xf81b8c47,0x4e50ecbb),LL(0xdd6768bf,0x916361ed),LL(0xf3c09bf3,0x6b31d1bf),LL(0x54e2879b,0x17c7f544),LL(0x44b470e7,0xb6fa811a),LL(0x32df7372,0x135177e9),L_(0x000000ad),
+ LL(0x83de0d9d,0x7ea57102),LL(0x4652ceba,0xdd543523),LL(0xb8a36856,0xb586f821),LL(0x19e00261,0x6ce309c3),LL(0x1ed079e5,0xe0f75ac3),LL(0x51ff1099,0x2442020d),LL(0x0c077aee,0x248b83fa),LL(0xc85e1f87,0xf5eebe6f),L_(0x000001f4), LL(0xaf872b79,0x311d3108),LL(0x2ca2a32b,0x5040c97d),LL(0x4fa4c2f0,0x7615703d),LL(0x80d5eb27,0x36c8c169),LL(0xb5f074a5,0x95daa1e3),LL(0xbda91813,0x672dad89),LL(0x395bd4fb,0xf61f3d94),LL(0xc4a2c81e,0x8ba214b4),L_(0x00000108),
+ LL(0x04e91ed9,0x861a2094),LL(0x2bca8d77,0xca4ca01a),LL(0x03590793,0xf16fc210),LL(0xc8ad1877,0x48a85346),LL(0x89666be4,0xf0fc0cfc),LL(0x6adba857,0xcd27d0e4),LL(0xdc6000be,0x66de6f3c),LL(0x410cd2f9,0x701dbfa3),L_(0x00000143), LL(0x27a30017,0x3566e721),LL(0x523a0305,0x793773f0),LL(0x1ee9afff,0x7fd66850),LL(0xdbc711c7,0x047ae5ad),LL(0x3acae945,0x203bb8df),LL(0xb932a42c,0xfe2439ff),LL(0xd51dba9f,0xe4630688),LL(0x268de595,0x2e9ee036),L_(0x0000012e),
+ LL(0xcb924e78,0xf61f664c),LL(0x2e404ee4,0x5ac67cb0),LL(0x6b002de5,0x87550da7),LL(0x537e3c3c,0xb6b43fc4),LL(0xcc36c052,0xb2d5ce01),LL(0x0c5bb204,0x8e7f6d0e),LL(0xf930fde8,0x09c188bb),LL(0x056f87d9,0xff08d168),L_(0x000000ad), LL(0xbd1106b6,0xe76203aa),LL(0x0182e8dc,0x02fff311),LL(0x1307d3fa,0x96bf7d1e),LL(0x71013392,0x6ed2ca34),LL(0x24a22e45,0x1b668eed),LL(0xe4102d01,0x79cf95e5),LL(0x681d10cb,0x6c6693b0),LL(0xf94e08ac,0x7a740355),L_(0x000000d1),
+ LL(0x4ea63be4,0x7d917da9),LL(0x5de2c336,0xadecf30f),LL(0x0955c66b,0x81dabb28),LL(0x6e473865,0x19491209),LL(0x1d9702d7,0xa1f53ee2),LL(0xa4bef482,0x26877597),LL(0x0315b12f,0x18b70eae),LL(0xbca15f03,0x5864f695),L_(0x000001d8), LL(0xe0496daa,0x1afe44da),LL(0x518d4571,0x824106af),LL(0xf72d3376,0xa6b1f64c),LL(0x1149d145,0xbe64f34b),LL(0x8c71ca30,0xd7b0b0f7),LL(0x3acfa7a5,0x58a3ea6e),LL(0xcc0bc394,0x5e42d97e),LL(0xe6ba0355,0xb8a8749f),L_(0x00000051),
+ LL(0xcc323242,0x25b57cdb),LL(0x0afacd89,0x4d31e696),LL(0x075e88b1,0x80ecc1c8),LL(0x4d853d58,0xe213393a),LL(0x5c2d17b4,0x1d02b340),LL(0x29f6c35a,0x7f4eb22a),LL(0x763f945f,0x991b6570),LL(0x38d9e916,0x8274a08a),L_(0x00000172), LL(0x919e262a,0xcdb707d0),LL(0x7b3ccd89,0xc28362e2),LL(0xe31adec3,0xd970a8d2),LL(0x2e5340b0,0x11f1ff4f),LL(0xb76d44ac,0x42bd388a),LL(0x528cddee,0x2165e718),LL(0x7cb055f5,0xa8c2384a),LL(0xd81cae87,0x5ee96e3b),L_(0x0000011f),
+ LL(0x95c8885f,0x504d777f),LL(0x6a9d125d,0x327807d9),LL(0xd624f272,0x0e53c679),LL(0x95ea222f,0xe1387ac7),LL(0xb1597752,0x656acd9a),LL(0x352cac8c,0x6190d15d),LL(0x61bf8856,0x01af7e20),LL(0xc719ce43,0x14d8c07b),L_(0x00000194), LL(0x83f36452,0xfdd73cd6),LL(0x314de5cf,0x46e7aa4c),LL(0x50ce899f,0x7424d707),LL(0x38e875fc,0x3221445c),LL(0x9f3a7a99,0x974ba6c9),LL(0xe06eb667,0xcc871495),LL(0xffe48ed2,0xda22c28b),LL(0x34965180,0x95e30bbd),L_(0x0000007e),
+ LL(0x8ee0ef29,0xfb175926),LL(0x1c82db3e,0x93d33d24),LL(0xb912da50,0xbb15ebc6),LL(0xcea7d557,0x53132904),LL(0x2a95c0c2,0x1728bce5),LL(0xd703338d,0x3e934774),LL(0x9ff62322,0xa4bdaa17),LL(0x5a25267e,0xfd8b69c0),L_(0x0000000c), LL(0x4db3f1bf,0x49cf21d2),LL(0xa18c0ec0,0x1567c730),LL(0xf359d391,0x8f78c3e0),LL(0xa1bf7eca,0x9f9aa64e),LL(0x4252d4d8,0x5b2ffd6d),LL(0x3cf77a2e,0x70d5197d),LL(0x420f1fde,0xc4ac046e),LL(0xfbaabfd6,0x197eef82),L_(0x00000092),
+ LL(0x6f164190,0xacca9818),LL(0xdc3afb13,0x75acc7ba),LL(0xf8e7944e,0xaec6267e),LL(0x266c89d3,0xc0d5983e),LL(0x7a35b6ea,0xc7025ed3),LL(0xcc6f8ba4,0xb3a78dfe),LL(0xe18e7845,0x43ed79a0),LL(0xd3e423c7,0x9847da1e),L_(0x00000022), LL(0x7ad878cd,0xf2ddd3e7),LL(0x7ad2ccc8,0xdd3af93f),LL(0xe988a2b1,0xc20e3266),LL(0xf31777a1,0xc508e478),LL(0x5f61decf,0x6ca64937),LL(0x38c983d0,0x63f7f656),LL(0xffbb003b,0xff837029),LL(0x32104839,0xc4d50105),L_(0x000001ee),
+ LL(0x0f23d833,0x787960d2),LL(0x1a82d064,0x1e23da2c),LL(0xf31fd1ab,0x632fca0d),LL(0x67beaa32,0x48f5480d),LL(0xb9e45d26,0xbb162f9b),LL(0xd434d563,0x10e02089),LL(0xa10eef01,0x647082d3),LL(0xb7735d1d,0x03650cb7),L_(0x0000017f), LL(0x40d95b89,0xe61d29d9),LL(0x68b4d3bb,0x1c7d5b4e),LL(0xd78df4bc,0xbd612a5a),LL(0xd83302ca,0x80982747),LL(0x511140b2,0x754f6279),LL(0x16e7211a,0x1d43610e),LL(0xf0dec954,0x3999e665),LL(0xbaca9f0f,0x3cdd9ee6),L_(0x000000e0),
+ LL(0x38877144,0x1ee1b012),LL(0xed46bb99,0xf5e943b8),LL(0x376d8b60,0x1bc6b4d7),LL(0x4b6cb863,0x7dc297da),LL(0x216481d0,0x123486d4),LL(0xc754e76d,0xb1c0a1e8),LL(0xdbcf937b,0xadf930fc),LL(0xdaf06ef4,0xa5ef1b3b),L_(0x000000c3), LL(0x03210a22,0x979dbfb5),LL(0xd444dbbf,0xd232212a),LL(0xef6c2520,0x35e7b199),LL(0xee0108b0,0x21bd8267),LL(0xe6dba29f,0xc9483241),LL(0x8b0b6ada,0x304a26d8),LL(0xebc36edd,0x88b58b4d),LL(0x0b4cd577,0x6441b89d),L_(0x00000108),
+ LL(0xee657257,0x208861aa),LL(0x5d4bf915,0x8adfc02b),LL(0x8b2a8792,0x51bf7839),LL(0xd1929e39,0x6ac2d82c),LL(0x51878fc6,0x2453f26a),LL(0x67c6a197,0x0ebd963c),LL(0x29e6f9cc,0xab6feb88),LL(0x6a8aecc7,0xb24a4c98),L_(0x00000165), LL(0x9f30636d,0xe6a5beb0),LL(0x5f6af11d,0x247b3767),LL(0xa04301fc,0x7893d122),LL(0x577167d7,0x4d974f3f),LL(0xea69addd,0x983fc60d),LL(0xd35bf8be,0x627055a8),LL(0x95c80a83,0x51c83aaf),LL(0xa21f06b1,0xee9e2a9a),L_(0x0000011b),
+},
+/* digit=24 base_pwr=2^120 */
+{
+ LL(0x1dc1e136,0x3cf04eac),LL(0x1c4f5e85,0x599f9890),LL(0xcbc44867,0x34ff0e3e),LL(0x5a12a7f8,0x851c12ee),LL(0xf066c152,0x7ca61be6),LL(0x73832df9,0x7153da2c),LL(0x14acdbe2,0xb73e882e),LL(0x87567338,0x9a4f930b),L_(0x000000cc), LL(0xd1fe8148,0x05fd56d3),LL(0x49ee53a4,0xe986a7db),LL(0x11101981,0x695cf7bc),LL(0x750760e2,0xb6aca2a9),LL(0x4815cb90,0x9f5ace2a),LL(0xc3dc9f29,0x6b06b61b),LL(0x3b28698d,0x6b2e5c22),LL(0x5687880a,0xb6015c0b),L_(0x000001bc),
+ LL(0x1af552c0,0xaaadcddf),LL(0x160c329a,0xf071e91a),LL(0x77f33e93,0xf9cbbaf7),LL(0x6e836178,0x74f3bc69),LL(0x430ecc6d,0x349ec647),LL(0x9e682571,0xbbec63ff),LL(0x3f624e0d,0x64eff8b4),LL(0x0d19e23a,0xab39a800),L_(0x000001cb), LL(0xce60d534,0x3eff3832),LL(0xe89d00d8,0x12f600da),LL(0xf8745dbd,0x3eb89d2d),LL(0x48217cd8,0xe79b868a),LL(0xc5ce0f8a,0xc2c4ae44),LL(0x0fe94021,0xa980ca2b),LL(0x5ab9482e,0xf0414674),LL(0xcffa33fc,0x96a9f1c2),L_(0x00000109),
+ LL(0xb176fd51,0xa2b01fa7),LL(0xbebf27e3,0x1a17875c),LL(0xca98073a,0x1a08df20),LL(0x73873253,0xcea9581c),LL(0xdc360b05,0xbad316bf),LL(0xb8a68986,0x9591db5f),LL(0x6941db20,0x838ce851),LL(0x0df495ad,0x337f3cd5),L_(0x000001fb), LL(0xb5d46b24,0xf0d09b27),LL(0xf2b04a4a,0xe34ef392),LL(0xc4e0cb50,0x9c028d0c),LL(0xbe127061,0x60b8995b),LL(0x202d9276,0xa9beaf92),LL(0x3a61c444,0x686effea),LL(0x7cc238c3,0xce321e42),LL(0x09075147,0x65266fe6),L_(0x0000014b),
+ LL(0x16e9dd16,0x8a3599a2),LL(0x05317187,0x0821091d),LL(0x24ef2697,0x6ed2cda3),LL(0x4950f2f1,0xeaefd2e9),LL(0xc815b553,0x9f00612d),LL(0x47c1f801,0x930eacc5),LL(0xfd1730a1,0x136fc4a1),LL(0x8252d52d,0xc56a7db8),L_(0x00000098), LL(0x6b77522a,0x2deb3842),LL(0xaea9f6b1,0xca869197),LL(0x3823d16a,0x187c4319),LL(0xf12c9d38,0xd5cc9828),LL(0xe31f43da,0x436529c3),LL(0x0781728a,0x63d40c6f),LL(0xbfbb0978,0x94da1798),LL(0x7a196933,0x97dcd1e1),L_(0x000000d8),
+ LL(0x95a20633,0x4ce60573),LL(0x98b05888,0xb9e9ac42),LL(0x9f28e7bc,0x770f80c7),LL(0xabb15751,0xd0147212),LL(0xcce75763,0x67296f82),LL(0x8034afbe,0xa2950d9f),LL(0x11791412,0x9731ca6f),LL(0x87c616f9,0x1f16d8bb),L_(0x00000104), LL(0xc7f27dc8,0x5fa5d017),LL(0x95bcc4fc,0x9fdb4deb),LL(0x39917e40,0x30051c1e),LL(0xbefa777d,0x3f36dfcf),LL(0x26ebd51f,0xd9696a85),LL(0x16cc089e,0x58a6c0bc),LL(0x6723f03c,0x3193efb5),LL(0xe4f7a675,0x97abbf77),L_(0x00000000),
+ LL(0x0082edbf,0x7ff0d41a),LL(0x1522ffb6,0x76aa53cf),LL(0x453dcda7,0x3ac99dda),LL(0x634bcd8a,0xca31a6bf),LL(0xdf09af12,0xda6aee65),LL(0xb96045d3,0xb2e1c131),LL(0x6f3c7e70,0x72188816),LL(0xcb58f8b9,0x9a1f5d21),L_(0x000000c7), LL(0x51f3e032,0xd4da7b11),LL(0xcafbe9a8,0xe3a95788),LL(0x39c010af,0x8c87071e),LL(0x05cb3faf,0xafcfc04b),LL(0x08a702fb,0x42c775b7),LL(0x5b3b6187,0x8aab53d6),LL(0xb84f9386,0x8bb27ffb),LL(0x08491b70,0x9bf23a75),L_(0x0000003b),
+ LL(0x2f20328d,0xb581eaa6),LL(0xd269e274,0x8fb2a285),LL(0x604b1779,0x5b26ea89),LL(0x3aa53ad7,0xd5119e93),LL(0x9fa62691,0x3e002a94),LL(0x8ba167e0,0x62921501),LL(0x195dffb0,0xe4ae2796),LL(0xdc1f93ea,0x2bba3282),L_(0x00000096), LL(0x980977c6,0x654950f7),LL(0x422ba8f7,0x9f0fcf77),LL(0xb7dc1d4c,0x6b970562),LL(0x0b2f7617,0x2de6068f),LL(0x894ad6c1,0xd3457950),LL(0xe569d53d,0xfc63f78f),LL(0x14981ae1,0xf2a90b52),LL(0x902dadf9,0xee87e5ab),L_(0x0000003e),
+ LL(0x5406fc86,0xc759885f),LL(0x5bd2a491,0x2d4cddc5),LL(0xc35aa122,0xb5461045),LL(0x2154985e,0x188b457a),LL(0xff0dcbe4,0x235148df),LL(0xd70c6a7e,0xa2535a30),LL(0x7d8e9016,0x6be2be33),LL(0x99a19ee9,0x8e953cf8),L_(0x000001ae), LL(0xa1dc1860,0x519771ba),LL(0xea4c9a1d,0xe6bf7f8d),LL(0xc44825c6,0xfd4b88d5),LL(0x48270d80,0x619d7b16),LL(0xcd7c088d,0x50ac4887),LL(0xcc2ce67f,0xd1ac72f9),LL(0xaafa6b89,0xafdce091),LL(0xb9365de8,0xe061fac9),L_(0x000000e8),
+ LL(0x7862482b,0x264a6de7),LL(0xcc327c76,0xf0e8036a),LL(0xdd64bd2f,0x58aff74c),LL(0xd63e620b,0x0d34c089),LL(0x792f3b2b,0x3cffd08d),LL(0xb8e40e30,0x2466d774),LL(0x5be025a8,0x83e235d8),LL(0xe9d3cf63,0x87a2f8e7),L_(0x0000016e), LL(0x93020cb2,0xfef8d504),LL(0x75b3c700,0xa8404df1),LL(0x1f7b3ca4,0x25cfc4f3),LL(0x3dca1055,0x21fc5f18),LL(0x73402205,0x096d5dd9),LL(0xf8afba2b,0xe13c530e),LL(0x23634751,0x7b6b3f2e),LL(0xca1be461,0x93159c76),L_(0x00000162),
+ LL(0x662154b2,0xf439d6d1),LL(0xc1e155ac,0x0ae5f642),LL(0xa2dd72ce,0x55e79db1),LL(0x71c8da23,0x7905f65a),LL(0x29ffbd0d,0x21383ef6),LL(0x39515d47,0x28c8f708),LL(0x739d692e,0x67130a0a),LL(0xe8283125,0x9d6fd698),L_(0x000000a8), LL(0xe6e2797b,0x7f499c43),LL(0x57f047a7,0x8571cbc2),LL(0xe0447784,0x8f068f3b),LL(0x85efc6b1,0x9497bb27),LL(0x4b52e9d2,0x5f954c9e),LL(0x896bc179,0x299e982a),LL(0xfe335eac,0x2fe557d1),LL(0x15ed5037,0x714710c8),L_(0x0000011d),
+ LL(0x45022f8e,0xe4a9bc90),LL(0xcb58c8df,0xd48d6951),LL(0xf9950f95,0x3a67fa88),LL(0xcfc52411,0x8aad81c0),LL(0xea907dba,0x193feef4),LL(0xbcf6e329,0x847c4744),LL(0x51539dcb,0xbfaf49f8),LL(0xe1705ff1,0x79078f89),L_(0x00000187), LL(0x7e920920,0x93070144),LL(0xf4a966bf,0xebc39792),LL(0x26b6e21a,0x5380b22b),LL(0xe6fd22df,0xf5ce884f),LL(0x866ea333,0xbbd94169),LL(0x3e0f11de,0x3a3c3087),LL(0x2fd9dd8d,0xefe676ed),LL(0x227a4771,0x250b4a16),L_(0x000001d2),
+ LL(0xe1817fcc,0x7ff2aece),LL(0xe4758b83,0x15a3e785),LL(0x768947ca,0x54660e77),LL(0x2c352eca,0x1486538c),LL(0xaac39b78,0x86e8fec5),LL(0xaa608004,0x414e550f),LL(0x32acb85c,0xa6493364),LL(0x2fd7f2f3,0x3d144499),L_(0x00000085), LL(0x92784c4d,0xcdd72f6c),LL(0x18258546,0x7a0d4685),LL(0xabc0f043,0xa00c87a4),LL(0xfab6104e,0xd492feca),LL(0x0edfb4e6,0xd10ae319),LL(0xa0ad3d18,0x74331002),LL(0xb3e27cea,0x1c928b0f),LL(0x43d33a89,0xb7eaffcb),L_(0x00000056),
+ LL(0x7f32173f,0x5c89c248),LL(0x82306719,0xa569342d),LL(0x5318cae6,0xaf11c888),LL(0xb3871b59,0x43ea3a04),LL(0xccb1894e,0x7d6e369f),LL(0x584ca2b8,0x4a0018e5),LL(0x01476d73,0xc7bd79b4),LL(0x6328258d,0xed62337f),L_(0x00000095), LL(0x607af994,0x27381ef0),LL(0x686aee98,0x28efc122),LL(0xe773f07b,0x1e1202b4),LL(0xb162dfca,0xd4141270),LL(0xfcd08076,0xdb1eed20),LL(0xd4dbdbd9,0xec8f2a2a),LL(0x31a47c86,0x153d8ef2),LL(0x74c6410f,0x33a76f22),L_(0x000001f8),
+ LL(0x0b272d33,0xb7894299),LL(0x2ade0047,0x7215a462),LL(0x8525f896,0xe97dd7d4),LL(0x8faa7fcd,0xf320c207),LL(0x2aaff4f3,0xce32f0aa),LL(0xf98216e5,0xe5a62be1),LL(0x4be7ec71,0x057e6071),LL(0xe8262bc9,0xd6f6ecc9),L_(0x000000e4), LL(0xe0348118,0x1e1c1702),LL(0x67b5b771,0x61dc410d),LL(0x540bfa59,0x52daedcf),LL(0x722428bd,0xa96118aa),LL(0xced4360f,0xaa07a68e),LL(0xd1ae09f8,0x4870992b),LL(0x98c1f34f,0xf97358de),LL(0xea267e80,0x8837a9e0),L_(0x00000086),
+ LL(0xb75d5e00,0xba7367a8),LL(0xcb6a4c5d,0x698ec043),LL(0xc4a8a172,0x58a0e780),LL(0x1c52f090,0x45a0c118),LL(0x7ba85810,0x41f652a4),LL(0x261486ed,0x14a0dead),LL(0xe61b0bd4,0x4a38be55),LL(0x881f7207,0x554bf84d),L_(0x000000fb), LL(0xb678cf5d,0x8cf0f2b1),LL(0x1c805e0f,0x50bc855f),LL(0x4c9f70d9,0xab5b49a8),LL(0x82a11ee6,0xbf5c0c4e),LL(0xecca8fd8,0x30c1e91a),LL(0x40104321,0x3bccd5ea),LL(0xf20e8305,0x7cc38a3b),LL(0xa89c9d80,0xf84d4b44),L_(0x0000008d),
+ LL(0x6dc98840,0x33535047),LL(0xa105e17e,0xf240ea34),LL(0x0ca7c1ed,0xe0a7225c),LL(0x60ee9bcd,0x8d5abc2e),LL(0xd1b7a04f,0xed201196),LL(0x421fd636,0xee08dcde),LL(0x3a41da5f,0x4d648f1c),LL(0x37a2b18a,0x637ab14b),L_(0x00000031), LL(0xe2574ca3,0x8f4aa46c),LL(0x42b5000c,0x5e6cb8b1),LL(0x2cc007b3,0xd18aeecc),LL(0x139d4602,0xfad62b8b),LL(0x4857b6e6,0x0b803515),LL(0xaaf5703a,0x7dfe5be4),LL(0x5b88d9b4,0xc7e255f1),LL(0xb42f23b0,0x642d5cee),L_(0x000001a2),
+},
+/* digit=25 base_pwr=2^125 */
+{
+ LL(0x9827bf41,0xd6c228d6),LL(0x53bd6003,0xac8482db),LL(0xedd6d84e,0x199f6c6c),LL(0x554b59c1,0xc80a2555),LL(0xbb3dd0d5,0x9a255d70),LL(0xb61698fd,0x8ce8ece5),LL(0x01602388,0x0910e4ff),LL(0x21f2b5b4,0xb877de8b),L_(0x00000006), LL(0xba9be6e9,0xe014bad7),LL(0xd6c8e28b,0x7941a6f1),LL(0x983d3be4,0x93e374aa),LL(0xb03efe8a,0x7787501a),LL(0x2ecc1517,0x3863f010),LL(0x8ce1a07f,0x2339ade0),LL(0xb1181652,0x142e138f),LL(0xed660839,0xade2437d),L_(0x00000072),
+ LL(0xb7c246de,0xbed2f33b),LL(0xc7b5006a,0xd46decde),LL(0x50c509c6,0x83eafeed),LL(0x09502cf6,0x6c8d2171),LL(0x6fa7b091,0xe284eb82),LL(0x6ef3971c,0x5478a9a0),LL(0x7e812b4b,0xbedbb05d),LL(0xbdf3afd0,0x5880bfa9),L_(0x000000a8), LL(0x17c0e4a6,0xde9fb976),LL(0x510f0d79,0x2d46f889),LL(0x5085caf9,0x57625cb7),LL(0x63379f4c,0x7679eef9),LL(0x202dc487,0x61e8da06),LL(0xd95a7481,0x933c7094),LL(0x6f198e77,0x7e527ab9),LL(0x3cef9bb6,0x3556a0a2),L_(0x000000a3),
+ LL(0x587ef556,0xadb4b17e),LL(0xe6db7725,0x223554b9),LL(0x298840a9,0x8ea40d6a),LL(0xb9987d3e,0x088f1989),LL(0x8c544359,0x98c4e679),LL(0x26877124,0xd4955574),LL(0xaeb47579,0x42531911),LL(0xedd6bd8c,0x876a0c25),L_(0x00000030), LL(0x17da2be3,0x578452ef),LL(0xf3506ed1,0x26ec7e64),LL(0x400c530b,0x0a9d93fd),LL(0x42c14bcb,0xeec28064),LL(0xdbc44330,0x21d894ab),LL(0x1784b7a3,0x83284ca2),LL(0xbd2fe673,0xbdaabf2c),LL(0x333a314b,0xdd217a0b),L_(0x00000109),
+ LL(0x6110cba8,0x3dead375),LL(0x261b1296,0x24e572ee),LL(0x4f710c53,0xa4d924c1),LL(0x3234879d,0x2bb72d3a),LL(0xf0242c6b,0x5319d73b),LL(0x56b72596,0x5d438ac3),LL(0x9c1467ec,0xe4eb1ea6),LL(0x40556d55,0x74c566ea),L_(0x00000000), LL(0x113bb0cf,0xf755482f),LL(0x1fdd8292,0xb750229b),LL(0x36eb56b3,0x8756dd9d),LL(0xd65055f0,0xad24bc9f),LL(0x305fbea1,0x29626eb1),LL(0xfcecb5ba,0xc9855409),LL(0xf6273264,0x81000d0a),LL(0x9d561b22,0x7b8d7b24),L_(0x0000017f),
+ LL(0xd531bd0b,0x1f33fdc4),LL(0x1e83cdaa,0x527f8e3e),LL(0x867d160e,0xf198e03e),LL(0x1f8e836d,0x319f12f2),LL(0xe5494da5,0x312ddaeb),LL(0x8aa887f2,0x0cacf5c7),LL(0xab111707,0x0ac8def9),LL(0xbe88c645,0x9ea7eeaa),L_(0x000000e2), LL(0xaae9a35d,0xecaceba5),LL(0x4a0a292e,0xbb26ecc4),LL(0x686acc28,0x1e45b0f2),LL(0x2a87d12e,0x3a62004b),LL(0x0c521e1f,0x1147391e),LL(0x2c697526,0x4d3ecffc),LL(0x940dd92a,0x45f78060),LL(0x3a2ded9e,0xeb3a17cc),L_(0x000000cb),
+ LL(0xf734ebf4,0x6012408c),LL(0x62256296,0xf1399678),LL(0x6234e097,0x152b073d),LL(0xd0a76b3e,0xbf3c9a35),LL(0x1dc1794f,0xca7a4461),LL(0x0ba3b03d,0xc31edda4),LL(0x3859cdff,0x8b3288b3),LL(0xf848ef1a,0x47d3b9b9),L_(0x00000067), LL(0x8f1d82f1,0x25e150c8),LL(0x41cecb20,0x4d109c13),LL(0xc9d21d04,0x7441f09e),LL(0x7778b13b,0xe84ff4c4),LL(0xa32c0c4b,0xc5ccc687),LL(0x309d686e,0x4ddb0a19),LL(0x9203c78d,0xba0868c4),LL(0x53181ea2,0x064154d0),L_(0x0000002f),
+ LL(0xe3ff2a58,0x31973b19),LL(0x2a26ad18,0x67b2d91a),LL(0x5fcc6c2f,0xe2db81e3),LL(0x0637d795,0x74742bd8),LL(0x1ed4fcac,0x26659e88),LL(0x30b9bfbf,0x232b6d3c),LL(0xae535c11,0x97bb1796),LL(0x32eef414,0xf6fe8c4f),L_(0x000000cb), LL(0x4a8e4230,0xc9a735e1),LL(0x8c58bcc2,0xa2ae4a3b),LL(0x1cf20755,0xcba626bb),LL(0x30e29d2d,0xc537d49e),LL(0xa170a87e,0x2ce7cb6e),LL(0x6a6c16d0,0x5f03a6b1),LL(0xa45e1673,0xe7f13685),LL(0x5d8c9454,0xdc67d748),L_(0x0000006a),
+ LL(0xaf97f8c2,0x16b51e78),LL(0xbb4d7657,0x4d4e4ac9),LL(0x12ece85a,0x2a2be63f),LL(0x2c2556ca,0x191c3b7f),LL(0x12341b0c,0x6c15ecee),LL(0xdf666379,0x2e302dd7),LL(0xce9cb829,0x76d162a4),LL(0xa7f8ba92,0xead863df),L_(0x000001b4), LL(0xd8403973,0x56dae839),LL(0xd9d38a99,0xd9da7dcb),LL(0xb69b8acf,0xd93d0fff),LL(0x4e0adb2a,0xf74f0454),LL(0xbb2ad644,0xb5de013b),LL(0xd489e7d5,0x944ef674),LL(0xa2d2bd3f,0x0ae01d0e),LL(0xdd32d1ec,0xf54aa8ae),L_(0x000000b0),
+ LL(0xe4705f69,0xcf1b879b),LL(0xacfbcaf7,0x1be6ac8d),LL(0x7318370c,0xdc61b734),LL(0x68c96561,0x0073d96f),LL(0xb94c34d8,0xc1901cf0),LL(0xf081cf45,0xe5c4c386),LL(0xf0fb0845,0xcbb72560),LL(0x26daccc8,0xc0c2c739),L_(0x0000003c), LL(0x649de0ae,0x12fe8c98),LL(0x69621218,0xdfb8607d),LL(0x8791c2b5,0xe9d74f1a),LL(0x3844e43f,0x58b63a6e),LL(0xa8d06c72,0x30e1aac8),LL(0xb6d9b103,0xc4264540),LL(0x3d6167d2,0x08191333),LL(0x68c04430,0x84141b67),L_(0x000000ed),
+ LL(0x1aa56828,0x0367e359),LL(0x3cdae245,0xb804f8f2),LL(0x72553e1f,0x67c4cfca),LL(0xb65b5da8,0xd9a5c285),LL(0x9a1f0411,0x613cad66),LL(0xba23bbe1,0xf8b4e4e2),LL(0x1cef34cc,0x8c65734b),LL(0x932e9f3f,0x02f73b5b),L_(0x00000186), LL(0x0351d0a0,0x59bb05ec),LL(0x31868efa,0x8bafab58),LL(0x0873b1c0,0xec7f2fe3),LL(0x3643b183,0xc1a9b522),LL(0x8e06d826,0x5a21bdcb),LL(0x8e78107b,0xd0770856),LL(0xf66af571,0xb9c9076a),LL(0xc46c020c,0x4aa90b62),L_(0x0000012f),
+ LL(0x5dc8f4b8,0xa33c20bc),LL(0x7ec83bd7,0xd911b15d),LL(0xd15a6121,0x4a74a6f1),LL(0x7ded1664,0x38816e97),LL(0x011743f8,0x3193fcc0),LL(0x2ce300dc,0xda43c181),LL(0x4a353b8c,0x15a04d1c),LL(0xc667d3b1,0x388d9585),L_(0x0000019c), LL(0x0bdf93dd,0xe0cceb86),LL(0x0ead0ff6,0x54678a08),LL(0x869bbb72,0xb18f6184),LL(0x7bd575cd,0x64b65577),LL(0xa032d6e4,0x7c7dc54a),LL(0x322afc12,0x30a518c1),LL(0xb73e6fec,0x94b0be46),LL(0xfb67de43,0x33b5236d),L_(0x000000fe),
+ LL(0x0f962f35,0x9c6f091e),LL(0x29586d09,0xc7324d43),LL(0xf0870634,0xfc9e4d8f),LL(0xa54095ca,0xb869d9b8),LL(0x750af3db,0x6d2001cc),LL(0x1a6baecc,0x24533332),LL(0x4d43331a,0x73cd1354),LL(0xe8c54106,0xc8a6bf97),L_(0x000001c2), LL(0x24bca00e,0xe99a79ea),LL(0xbfa3857b,0x6523d1b7),LL(0xf152a797,0x74d5c2b9),LL(0x7c8d0d7e,0xca070e93),LL(0x0c8c05da,0x90e17c3e),LL(0x6e856e17,0xc09e9cee),LL(0x45014958,0x157a95c9),LL(0x8be88b6b,0xb046e21d),L_(0x0000015b),
+ LL(0xcdd92148,0x641d359f),LL(0x2502c5ea,0x6f35d51a),LL(0x3893c7d7,0x20bf4812),LL(0x2ac899fa,0xea66bfcf),LL(0x3dd9d780,0x6686f753),LL(0x5853eeec,0x471826dd),LL(0x3f6607f4,0x63551e77),LL(0xab0845ea,0x9591457e),L_(0x0000004b), LL(0xc75e008e,0x1eb5093e),LL(0xf1fc3d61,0x48e575c1),LL(0x02888aae,0x04ab23f0),LL(0xe87f1ead,0xae16fee2),LL(0xb7f7d076,0x3eebdb5c),LL(0x94d4a8d3,0x1d42f789),LL(0x32f711dd,0xb65c5dfe),LL(0xffe8ae2e,0x5368ab2c),L_(0x0000014c),
+ LL(0xc71e34a7,0x960dca9f),LL(0xb04fd5f9,0xf94be13b),LL(0xcb350c8c,0xad91afd4),LL(0x507fe2c4,0x64d4307d),LL(0x965e3503,0x5c7ae781),LL(0x150451f8,0x6bf2a6c3),LL(0x730da87b,0x2d1774ae),LL(0x075f7ca9,0x5f606798),L_(0x000000a6), LL(0x7d9d82a2,0xdf7b7ba4),LL(0x9f994c7a,0x02b12659),LL(0xbc50a3bf,0x9dfdd3b8),LL(0x383c8539,0xfd8d4292),LL(0x17ae38e3,0xf28f2f03),LL(0x882096f8,0x5cc24a79),LL(0x4e0ef573,0xf15428a2),LL(0x57f145e4,0xb89880e7),L_(0x0000000c),
+ LL(0x457824fc,0x185ab84d),LL(0x1253397d,0x8d154628),LL(0x387df8c9,0x6bebdcd0),LL(0x9150bff8,0x556713ef),LL(0xe0119e69,0x47194289),LL(0xea336304,0xaea5316a),LL(0xfcab6f8a,0x32095630),LL(0x9256e44a,0xf5be137f),L_(0x000000e7), LL(0x91535ac7,0x1d1ebf3f),LL(0x100cda53,0x2af14479),LL(0xebfd994d,0x0287bad1),LL(0x075babf0,0x868eb0f1),LL(0x4f27433f,0x59c4864e),LL(0xb3ca6bbe,0x042e0b78),LL(0x36fc642d,0xc718e121),LL(0x457b51e4,0x6451668a),L_(0x000000f1),
+ LL(0x8e3c3743,0x2cea274d),LL(0x79b2083b,0xf6accb4a),LL(0xf7eff159,0x1a2ac9cf),LL(0xbd1a458b,0xc30597c5),LL(0xdaf5afd8,0x67ad0a34),LL(0xad0ce95f,0xfcb5f547),LL(0xf492633f,0xd42c927e),LL(0xd70d201b,0x677f0118),L_(0x0000014d), LL(0x7325271d,0x511be774),LL(0x532d9f83,0xe33f2540),LL(0x0e1e6624,0x6202d9c5),LL(0xf8f4394e,0x9c8fa1b9),LL(0xf8528991,0x2359d3b9),LL(0xd88ed641,0x4c00c9ea),LL(0x054c125a,0xbd626daa),LL(0xe0db1f33,0xbfaf8853),L_(0x00000029),
+},
+/* digit=26 base_pwr=2^130 */
+{
+ LL(0xd73be466,0x565e43ad),LL(0x8ce3b9fd,0x4a046e43),LL(0xef2d69e6,0xb337e9ed),LL(0x7f11d4e7,0xb4d2646c),LL(0x09fce23d,0x9cfe36cf),LL(0xf8577ee6,0xd497797f),LL(0x1e1b23f9,0xba0fa9f7),LL(0x813fdfce,0x1ec2f2d2),L_(0x000000cb), LL(0xbc5801d3,0xba1d6ad8),LL(0xfa8c88b9,0x38f8437e),LL(0x58d2c493,0xdf5755dc),LL(0xa5d4147a,0x9f31388e),LL(0x2454e0d1,0xd880f0ef),LL(0xed7c5174,0xf4ab4400),LL(0x2972f596,0x422f97c0),LL(0xfd1f05bd,0x1b6edbb7),L_(0x0000009e),
+ LL(0xe5308733,0xcdb37e83),LL(0x48081b75,0x60b5bfda),LL(0x38365296,0x9f69f061),LL(0x88a8974b,0x5fb9ec96),LL(0x75444cc0,0xf252002f),LL(0x899c5a67,0x664675a1),LL(0x11db7cc9,0xc6b6d7be),LL(0xe5e85617,0x8bf19549),L_(0x000001df), LL(0x650536e0,0x7897a846),LL(0x57bdeceb,0xb8acad39),LL(0x39f416b8,0xbb4ba894),LL(0xde12e814,0x45c679cf),LL(0xfa77e0ef,0xbfcd091b),LL(0xae92f35b,0xf3ea6cc5),LL(0xff4f9db9,0x15f66583),LL(0x67f0fed3,0x81b129a8),L_(0x0000009d),
+ LL(0x647774c8,0xd728f100),LL(0x8216c030,0x7565d29a),LL(0x38976a5d,0x0e8d40b2),LL(0xdebd4cac,0xe6c701d8),LL(0x3dc8c008,0x71a01dd8),LL(0x54f5f816,0x85aadb00),LL(0xe571a7d2,0x66dfeb71),LL(0x0d64dc32,0x2213f7ff),L_(0x000000b1), LL(0x8476568e,0x70c9c24c),LL(0x81e7d6f2,0xdfa45074),LL(0x8ce07818,0xc75e724b),LL(0x17be95c5,0xf85a8c49),LL(0x56216aaf,0x71eb7f6d),LL(0xf60fc3e9,0x4afdaffe),LL(0xb5697356,0x598d1d44),LL(0x2dfe785a,0x78a83874),L_(0x000001b6),
+ LL(0x70487d30,0xa5efc98a),LL(0x56482796,0x86f3d005),LL(0x81ed5742,0x41ac177d),LL(0x693c9188,0x41f63ff3),LL(0x544078e1,0xcb0cceba),LL(0xf396ad9c,0xcd9ca803),LL(0x1f2f8905,0xb9a3b9f8),LL(0x4318691b,0x399dbc5b),L_(0x000000c9), LL(0xf876e309,0xb6fd45a8),LL(0xf87881ff,0xa8a0715e),LL(0xb8d73d7d,0x074192a0),LL(0xca88981c,0xdc66d086),LL(0x00f41a80,0x8f279d46),LL(0x34882bbb,0xb5564038),LL(0x10c7a90c,0x5552b11c),LL(0xf89b04d8,0x834a5053),L_(0x000000bc),
+ LL(0x3f7dbd38,0xce9c88b4),LL(0xf194c13b,0xdc04befb),LL(0xdd6c7f32,0xd71b8746),LL(0xc7a2d3eb,0xb71fb09e),LL(0x497484b9,0x73e11c5b),LL(0x1fc70d7c,0x9831a6ee),LL(0x15940a74,0xc9a49067),LL(0xe36e9b20,0x365b0985),L_(0x00000144), LL(0x54606829,0x7dd8cbe9),LL(0x0d9bdc27,0xc774aae0),LL(0x36955f4f,0xcfe0f91f),LL(0x72271ae4,0x1d88d914),LL(0xc0f2a388,0xe1f3ebda),LL(0x63cec6da,0xf2b86354),LL(0xe4a5ad95,0xed0252cb),LL(0xedde22e8,0x7a31d7c3),L_(0x00000152),
+ LL(0x840ba74d,0xab9733bd),LL(0x35000794,0xc171b7dd),LL(0x7a0a699e,0x370bb4fe),LL(0xed68a491,0xfb486be6),LL(0xf15b9567,0x86467e73),LL(0x5a72e34b,0x007fbbba),LL(0x4fc2fd9c,0x07f9990e),LL(0xf83d0453,0x47ba1009),L_(0x0000014d), LL(0x3ed4cc4e,0xd0aa85e5),LL(0xfa4eda85,0xcc6de111),LL(0xab8aa3e2,0xd8d585dc),LL(0x43bc8ccf,0x69adf3a0),LL(0x9f03e827,0x2ce58643),LL(0x4e3d11d6,0xf05e13fa),LL(0x2820b6d0,0x7af921ff),LL(0x94e1a5fd,0x91b383f3),L_(0x00000193),
+ LL(0x8c47f3dc,0xfd8a756c),LL(0xca9eb3fd,0x31799e67),LL(0x5933facf,0x70399eb0),LL(0xe0504d9d,0xdc761184),LL(0x469e7106,0x8ef17d6d),LL(0xcd5f283f,0xb55ec3df),LL(0xdaa7f2c8,0x7711b93f),LL(0xa9a6a6b5,0x3add4e0a),L_(0x0000007c), LL(0xc75a128f,0x9a94b1bb),LL(0xa3a9b3b6,0x99889957),LL(0xd56e141d,0xc45c74e4),LL(0x969c754a,0x455c4484),LL(0xf069f686,0x7584cae6),LL(0xbd579d45,0x441fc298),LL(0x29bfd918,0xea727ee8),LL(0xb0624772,0xd66de027),L_(0x000000c7),
+ LL(0x7b2e1e8d,0x3ae58142),LL(0x2e71222e,0x90f869db),LL(0x9d393376,0xb1ce0668),LL(0x2d537bfd,0x1a9bff70),LL(0x47346bbf,0x4aeeb846),LL(0x8a0e90f5,0x73c9dd46),LL(0x54e3afa2,0xb6c871a6),LL(0x5945d8c3,0xf25b8746),L_(0x00000110), LL(0x100e770a,0xac70e87a),LL(0x1c87dbe4,0x797d6d91),LL(0x961a5c5e,0xc5b533fb),LL(0x548c0001,0xb560cfb8),LL(0xa9d47191,0xa65c8463),LL(0x37d39eec,0xcad37d21),LL(0x716bab4e,0x7b0514ad),LL(0x89ad5bc2,0x4b2c1f87),L_(0x000001e9),
+ LL(0x7c1ff897,0x4bd5aa83),LL(0x73534a22,0xb8d76f5e),LL(0x26abe76b,0x8f3282b7),LL(0x76978114,0x14a5cb17),LL(0x1bff40a3,0xb7375a3c),LL(0xb7209f08,0x91b36a89),LL(0xb4553b1e,0xcebaa86d),LL(0x73824616,0x8a3a95bd),L_(0x000000b5), LL(0xbcb95506,0x36ce8449),LL(0x45813245,0x0d1e1b38),LL(0xd6d0eea3,0x7fd0d6a4),LL(0x14a3ad4b,0x14bcb34d),LL(0x4fc99703,0xf4772d1d),LL(0xe5d8c8d7,0x1d59825b),LL(0x6cc8f63c,0x8d26276f),LL(0xba00b77b,0x4ea936fb),L_(0x00000180),
+ LL(0x06031f54,0x960c67a1),LL(0x32f38594,0x09357fe4),LL(0x3b745f59,0x2a14d637),LL(0x8fa90857,0x653eeaba),LL(0x65744c6c,0xfa37b71c),LL(0xf85872c8,0x3238cb4d),LL(0x9700049f,0xbb9a7dcb),LL(0x4c8ed8c4,0x47abe41a),L_(0x00000191), LL(0x49db6e5a,0x58e268fc),LL(0x4b45feb2,0x84cf99d5),LL(0x2045f9c6,0x80f4779c),LL(0xf44869f9,0xa220c8fc),LL(0x058ad702,0x7e09b470),LL(0x948098cc,0x5bc02559),LL(0x495b8c3f,0x33da20c4),LL(0x197459a3,0x4eda80f6),L_(0x000001da),
+ LL(0xd2a33c4e,0xb8c0a18c),LL(0x4edc42cb,0x42d862b6),LL(0xd775f940,0x1e91d30a),LL(0x6703500a,0xba0ea3ff),LL(0xa7531dda,0x2773ec8b),LL(0x39b7bed4,0x2d04e32b),LL(0xb4d1689d,0x9117e556),LL(0xd20ddefd,0x0946439e),L_(0x000000d4), LL(0xa10a2f30,0x55b7005a),LL(0x2bae1e82,0x53323c22),LL(0x2ff6304e,0x397190c6),LL(0xd9f087fd,0xa7a8b69d),LL(0xb68e3037,0x12602cd7),LL(0x25d350ef,0x22bf670f),LL(0x86cdc0d1,0x8a47dde9),LL(0x8ee7e2f2,0x974ab69b),L_(0x00000074),
+ LL(0xc6dbc583,0xd24b6766),LL(0xd31b0ef8,0x95890706),LL(0xe3a35296,0xc90c51cc),LL(0xb8ed7618,0x7cff3a80),LL(0x4973ebf1,0xd473b1c4),LL(0x3a129c68,0x098525e4),LL(0x5036c9f1,0xc374031f),LL(0x3955ea92,0x77e611d3),L_(0x000000d2), LL(0xf46f1c31,0x64ddf24c),LL(0x9e1fda40,0x70db5256),LL(0x5ea2c55e,0xf8940530),LL(0xf14297ac,0x034f59d5),LL(0xa46ea96e,0x42888331),LL(0x7dc4622a,0x102ad134),LL(0xe007741a,0xfe88a514),LL(0x1db8ec7c,0xc746e046),L_(0x00000099),
+ LL(0x514ddbd3,0x40394ddf),LL(0xc9c65dd0,0x539c2910),LL(0x679067ad,0x449575b2),LL(0x3e4b50f3,0x3cba3f07),LL(0x3ae8deca,0xdb855b46),LL(0xde55385b,0x16ac2f4b),LL(0xcf4ed383,0x1d879d47),LL(0x1e8113f4,0x90927036),L_(0x000000d6), LL(0xce4c202b,0x3d4593d6),LL(0x973ac87d,0xf0b4acfe),LL(0x01434726,0x6764442d),LL(0xfe9274d4,0x6b582005),LL(0xe308fe9e,0xf520a500),LL(0xaae35487,0x99c31e18),LL(0xcdca5ee1,0x1d99ed71),LL(0x0f6491b7,0x05d24b98),L_(0x000001b8),
+ LL(0x46f862a6,0x65cb077c),LL(0x631e9559,0x9b939d55),LL(0x25138071,0xf40d4552),LL(0x952fcfe6,0xb308097f),LL(0x0a6a5375,0x2e65e8e6),LL(0x3e9edb80,0x1310ce7e),LL(0x9008e712,0x36b60d2d),LL(0xef767e69,0x0706fc9a),L_(0x00000167), LL(0xfa1dc587,0x32ad8729),LL(0x4064ce9d,0xe1763571),LL(0x56c0be29,0x7963b458),LL(0xde3b2135,0x95d575d7),LL(0x66e40952,0xa842ef1e),LL(0x444bd560,0x5e446834),LL(0x9e4dbf26,0xf024c8aa),LL(0xf4d25cc1,0x3119e4bb),L_(0x00000080),
+ LL(0x31f1b543,0x5b8d2482),LL(0x0ec252b0,0x19b88e25),LL(0x0818329c,0xcd8bbb1b),LL(0xdb10a837,0x02e4893e),LL(0x81192510,0x84cd1c11),LL(0xbe980656,0x6c489430),LL(0x0f675008,0x346cc643),LL(0x57e72ed9,0xa6664b52),L_(0x00000049), LL(0x8c9e3525,0xc2a2b6e2),LL(0x50c3fc67,0xaf377b60),LL(0x018ff455,0xd7f347bb),LL(0xcd5a7fd3,0x820f28df),LL(0x7a766a20,0xbaa35047),LL(0x2e3e3c08,0xea0d932e),LL(0x620422f9,0x561b15cb),LL(0x78d9ad76,0xe4b810ff),L_(0x00000012),
+ LL(0x0f23847d,0xcb2c301d),LL(0x46a3121c,0x24b1883c),LL(0x64fb5faa,0x43263cce),LL(0xc10bc090,0x731fce3c),LL(0xe510506a,0x134986c0),LL(0xd2899a05,0xaa30a907),LL(0xd8592433,0x6671f165),LL(0xa5074a40,0xe0e30eea),L_(0x00000119), LL(0x39b1d8c9,0x4f03f7bd),LL(0xed9a2887,0x4a870054),LL(0xbd121753,0x510756ad),LL(0x9a0d0a37,0x85faa51a),LL(0x35296053,0xdf5c089f),LL(0x15a5c2ed,0x130a237e),LL(0xbd316fba,0x3774ff2c),LL(0x2c9d3ce1,0x66d3d7ee),L_(0x000001e7),
+},
+/* digit=27 base_pwr=2^135 */
+{
+ LL(0x45c384b6,0x2d4100e2),LL(0x7187b9e4,0xc5264e57),LL(0x2477a817,0xcb20ec20),LL(0xc146fbb4,0xa5dd079d),LL(0x6c49fc51,0xb66b540f),LL(0xa207dd34,0x18cb3114),LL(0xfc85f364,0x79042a4a),LL(0xa886f4d4,0xf32c0592),L_(0x00000021), LL(0x3c62b595,0x7df28ef3),LL(0x09a83c10,0xc98bc18d),LL(0x61720266,0xe8b908cb),LL(0xbfa40c64,0x3266ed34),LL(0xc5f7d00d,0x785d5c5a),LL(0xed6e6699,0x0fda50cd),LL(0x0528d637,0x9fa7129a),LL(0x226a0134,0xc857ddf6),L_(0x0000013a),
+ LL(0x854a83b5,0xa6b72500),LL(0x82b8a64e,0xf5cc5dee),LL(0xa44f4310,0x82f7e307),LL(0xa979f999,0x26038361),LL(0x36271c95,0x9d4a6e7e),LL(0x2c2e87bd,0x83121a68),LL(0x801461a1,0xdda0c42c),LL(0xc46dd1bb,0x16d6b9ef),L_(0x00000004), LL(0xf5ff9d53,0xac7e6d6f),LL(0xba6044cb,0x8a2a18c9),LL(0x4e0b1c61,0x47645723),LL(0x538c1881,0xff1d071b),LL(0x0d20849f,0x3d943038),LL(0x033ae333,0xd1326f05),LL(0xe89c6421,0x504a49c4),LL(0x0c637164,0x5b9d0e64),L_(0x00000191),
+ LL(0xc4db51e8,0x0ee6ce1d),LL(0x76a9fbe6,0x471be04f),LL(0xaee80fe4,0x63fea5d4),LL(0x13ed56ca,0xbb7b1989),LL(0xff53dd5a,0xbdd30335),LL(0x5aa48cba,0x8830cbd1),LL(0xced46a92,0x6ec07f47),LL(0x4d0d3e16,0x3e149703),L_(0x0000002c), LL(0x85d83aa8,0x030c528b),LL(0x3981ba7e,0xf6347818),LL(0x51c072a5,0x8851b9e3),LL(0x6bc6f46b,0x908af12a),LL(0xab612e82,0x11ae86d1),LL(0x194bfdad,0x855184ce),LL(0x3ed70ec9,0xbc5ba81b),LL(0x36a51b16,0xbe363f21),L_(0x0000017e),
+ LL(0x89a7c665,0x4ba50604),LL(0xf92c410e,0x03183bca),LL(0x325bb838,0xde751063),LL(0x4a227afa,0x61ce2f62),LL(0x8d611fad,0xe1c057fe),LL(0x63741f27,0x26a80815),LL(0xcc3f4944,0xdc51e188),LL(0x1fb19202,0x18a29e60),L_(0x000000fc), LL(0x23f5c4ba,0x8b90f284),LL(0xeac00c83,0xecc8f9f7),LL(0xc63ca5b1,0xabd4ae3b),LL(0x61f4eb49,0x5868250a),LL(0xde5e94c7,0x8aa62e59),LL(0x2e205082,0xa27ce17d),LL(0x4d94b7ec,0x3cf7dcd2),LL(0x84ff72ff,0xd9add4ed),L_(0x0000006b),
+ LL(0xd6250a4d,0xc4c48937),LL(0xb7e17582,0x30cd4a1c),LL(0x663cb672,0x4ecce3f6),LL(0x51a07652,0xe3e24952),LL(0x971076ab,0xb2837d4a),LL(0xcfa04494,0xae48378d),LL(0x2f234848,0x35aa4670),LL(0x5204cd94,0xdbb7f2c1),L_(0x0000010b), LL(0xce99c049,0x189c18e6),LL(0x1251a582,0xe65b23d2),LL(0x1ea8f76e,0x50f4154e),LL(0xde65bbaa,0x55d8a624),LL(0xd1acdeb6,0x9745647b),LL(0xdbc7b696,0xa1a36741),LL(0xc3af97df,0x0e06b475),LL(0xcec9f674,0x09826835),L_(0x0000018d),
+ LL(0x9edae224,0xc93ceb2c),LL(0xc40b8881,0x376b68f1),LL(0x493ec443,0x2fe4d107),LL(0x2613f055,0x2adbc0de),LL(0xc264177a,0x6850f4d4),LL(0x999b4445,0x024b1759),LL(0xb5528e8c,0xa532c490),LL(0xfe9cb25f,0xfd3a94e4),L_(0x00000027), LL(0xea2401de,0x29f2c840),LL(0xae4f0565,0x6004e218),LL(0x9745c833,0x45a26d7d),LL(0x1aa8e8c7,0x2e1e3abc),LL(0xf254366c,0xd176c592),LL(0x5dba9a65,0x75f2ce2f),LL(0xcb70eda5,0xef390121),LL(0xdf3bd7c9,0x57bbfad4),L_(0x000000fb),
+ LL(0xf2fb4c5a,0x612c5e22),LL(0x90ec0ad8,0x19eef2ca),LL(0xf648d0a0,0xb08c2818),LL(0x56957806,0xc6fa4d71),LL(0xe858889f,0xd381edae),LL(0x0d311c34,0x51c58427),LL(0xc7d13fa9,0x223f6153),LL(0xe7ffd714,0x41bebc46),L_(0x00000125), LL(0xa9aa9baf,0xd185738b),LL(0xa46d0a8f,0xb3308a45),LL(0x74e9630a,0x50e76c6b),LL(0xa8af0eb5,0xe6d664ef),LL(0xb4263c27,0xd6ff5afe),LL(0x0d5ab8af,0xa29e25ea),LL(0x35f45527,0x9641d328),LL(0x8c614ae7,0xf344ace6),L_(0x0000007d),
+ LL(0xe352f406,0x44f05c5b),LL(0x36069000,0x3a7061d3),LL(0xe7fd3e15,0xd82371f2),LL(0xb123a32e,0xc0c29bdd),LL(0x1a15e8ee,0x0938b2d1),LL(0x9bba46b8,0xa2ae38c1),LL(0x66a69b9b,0x470c4e74),LL(0xe7a0607a,0x04517ba8),L_(0x00000067), LL(0x04e250e3,0x0d3d6116),LL(0x99aa8990,0x2850e69a),LL(0xe87aacf0,0x0f5ea018),LL(0xa9b70f5d,0xe629958e),LL(0xc9dfec50,0x67ad0ad8),LL(0xa19fef72,0xfbbc4dd8),LL(0x4e913349,0x44ef73af),LL(0x36506a6e,0xa2784d06),L_(0x0000009a),
+ LL(0x4fc61403,0xbe686c91),LL(0x3b319ce9,0xcaf2c252),LL(0x48b002e1,0xd7142b37),LL(0xfd368034,0x4805818a),LL(0x24a14bab,0xfef62905),LL(0x0f3cee8f,0x8e05459e),LL(0xdd641c3a,0xf8a79ba8),LL(0xda069476,0xb3c5de43),L_(0x00000084), LL(0x39168c60,0x3f0a7260),LL(0x3e3e3f10,0xefe9a0b6),LL(0x98f31f24,0x029755ad),LL(0x68a3bd55,0x56d48cfc),LL(0x08db9e00,0x180b09d6),LL(0xf41fc496,0x43518b4d),LL(0x0a026b4c,0x53fa9a78),LL(0x49c51679,0xd4505c06),L_(0x000000f2),
+ LL(0x04533f2b,0xc6b20735),LL(0xf37cab9f,0x59889c71),LL(0x2957243a,0xee6d3e3b),LL(0xcd4ef031,0xc82e2f33),LL(0xbe1fa792,0x9431aaa2),LL(0xd5df936a,0x5897dee2),LL(0x69038db7,0x3c5c1a27),LL(0x49337ba9,0xd62944c1),L_(0x00000141), LL(0xdaff077c,0x92632965),LL(0xd489db4e,0x73090129),LL(0x940397cb,0x3ab24c2f),LL(0x08747c46,0xa7844d0f),LL(0x4063f57e,0xde4ab15b),LL(0xdfb6a687,0x7bdc8db9),LL(0xc4b7272d,0x670393c5),LL(0xcc129fac,0x2bf452b3),L_(0x0000012b),
+ LL(0xd3620658,0xd490ca01),LL(0x480b6735,0xf6b97c19),LL(0x5a38261b,0xeb8077db),LL(0x3a0d7cfc,0x6cb95b1f),LL(0xd822b66c,0x027f3439),LL(0x204c12b4,0x5b1121d8),LL(0xd1662f63,0x50df8b79),LL(0x5a06b5c4,0xa26c4803),L_(0x00000195), LL(0xdd45df26,0x7d35a477),LL(0xdf45caba,0x37ca8bf1),LL(0xb9d5153b,0xa163bc4d),LL(0x2a09a7c7,0x79721ae6),LL(0xf16f3745,0x4901566b),LL(0x8b7edc54,0xda6d915a),LL(0x2073fe4c,0x59c5233d),LL(0x0e719f5b,0x8881557c),L_(0x00000041),
+ LL(0x34d85352,0xb5e1a9d1),LL(0x04b6fb3b,0x96ed674c),LL(0xc5869197,0x2201eaeb),LL(0xc13b24f0,0x43fe141e),LL(0xd5acb880,0x77717702),LL(0xb4c36b2f,0xf913c28e),LL(0xbd9e8fe1,0xbb8bc0cb),LL(0x871dc376,0xdf0d6014),L_(0x00000130), LL(0xb3b18239,0x9062a004),LL(0x0d96f561,0x84b9c0aa),LL(0xd38134a4,0x384e6a14),LL(0x62e9b9dd,0x434945b9),LL(0x0d2a3f87,0x26111d5b),LL(0x0558e17c,0xca088afb),LL(0x7e83601c,0x5f4109b6),LL(0xf3372d86,0x33a44ebe),L_(0x00000052),
+ LL(0x2e8b93c7,0x08562f0b),LL(0xbd858543,0x4642e58a),LL(0xf3108a95,0xe72a8e55),LL(0xc3b6dcd3,0x48efed30),LL(0xbf3f1b76,0xeef47f99),LL(0xbe7c393d,0x7808a959),LL(0xb13004f3,0xab865ef6),LL(0x937fdeea,0xd800a95c),L_(0x0000001e), LL(0xde622870,0x5b036454),LL(0x1435996c,0x253cdb02),LL(0xc939a75b,0x00181ca2),LL(0x497b4076,0xc885fd30),LL(0x89ffccfd,0x5be5d64a),LL(0xd221db4b,0xf3ff67a9),LL(0x7c1814ff,0xe534c2d3),LL(0xdff1b3c3,0x4c8996de),L_(0x00000045),
+ LL(0xc9c5a035,0x6fb80668),LL(0xd3037f61,0xf7001431),LL(0x61783bd7,0x7eb67860),LL(0xa8db044a,0x687c5be2),LL(0xbd63e80e,0x72619e19),LL(0x79bd6dba,0x3f54433d),LL(0xd3da5abb,0x53179eab),LL(0xbeded885,0x2f58ffce),L_(0x000000d6), LL(0x8c1156c4,0x0e48c339),LL(0x6a8706fa,0xd70c895f),LL(0xdef1e5d8,0x74e0aa32),LL(0x628036e7,0xb31a93a3),LL(0xa6fa3b42,0xe7bb3f2a),LL(0x91ab3f15,0xd667e0a4),LL(0x1d5276ef,0x172f04b6),LL(0xac2e330e,0x46c091fd),L_(0x000001a4),
+ LL(0xcaeed330,0x3479c8d8),LL(0x774a0f8d,0x2da43aae),LL(0x89fab1e0,0x5a52588d),LL(0x22017d07,0xf2088700),LL(0x3344f84f,0xf666f8bc),LL(0xcded1b00,0x98c10e11),LL(0x385b1f15,0x4a35267e),LL(0x4cb957d9,0x0bc3b5db),L_(0x000000b2), LL(0xb7f4f85a,0x70aae220),LL(0x50f81138,0xd0547dcc),LL(0x320d34eb,0xaa86f5d7),LL(0x4627a90c,0x313d3af2),LL(0x0d86c9fe,0x9d1708c0),LL(0x93baaabc,0x4bb0c611),LL(0x5e3713af,0x8c78d7cf),LL(0x23abcabf,0x24042f80),L_(0x00000150),
+ LL(0x8d760d23,0x2a50426c),LL(0x2fd748bd,0xd4451d72),LL(0x84a5084a,0x7d518774),LL(0x395bd1ac,0x41ad7719),LL(0x5dc03d65,0x54b40eaa),LL(0xf42c68a2,0xc699a962),LL(0x481b2b4d,0x78f2ecdd),LL(0xd9badbf1,0x6d040345),L_(0x00000038), LL(0x6890c940,0x7a9849bb),LL(0xe8615e51,0x5822be91),LL(0xe3c3e516,0x9ed67ca7),LL(0x5ebee67a,0x5438f44c),LL(0xbf03236f,0xf9e45ec0),LL(0x29c5029e,0x412d0011),LL(0x4fd4f4e3,0x09bad0b6),LL(0x5f591e3c,0xd09fc0e1),L_(0x0000006a),
+},
+/* digit=28 base_pwr=2^140 */
+{
+ LL(0x6867ca62,0xb2e8cc83),LL(0x2abfd678,0xd7d6c96a),LL(0xbb6c702c,0xb7b75f62),LL(0x8eb9ab34,0x2a8eb698),LL(0x67b38227,0xee1d1728),LL(0xbff15e40,0x6f600751),LL(0x4ec3001b,0x30ff996b),LL(0x7fb8efdf,0x35fa815d),L_(0x000001bb), LL(0xfc62d76a,0x1c80dd81),LL(0x4a2f2f09,0xc1a9825d),LL(0x4ae9b61a,0xb05a4fb5),LL(0x71a812fc,0xa7baf2db),LL(0x8bb96eaa,0xcc434e4e),LL(0x53c2dfd9,0x8fce5672),LL(0xceeb8e7b,0xd6b948ee),LL(0xc787b7e9,0x44e8daba),L_(0x00000053),
+ LL(0x44566d20,0x816dab3c),LL(0xa555ef8d,0x68ad0a5e),LL(0x93fa3eae,0xb45ab760),LL(0xad51a41f,0x14a732bc),LL(0x3c784a11,0xcd96f357),LL(0x7e912d99,0x7808bc95),LL(0x547dff3f,0xd022a461),LL(0xd3f93d98,0x51efde9d),L_(0x0000010f), LL(0xdcf5792b,0x9e50e443),LL(0x1c5d0319,0xab35921f),LL(0xce7e3777,0x61acb763),LL(0xc69a2c80,0xd5a1f19e),LL(0xd4921d8b,0x86d49b86),LL(0x3effd3f1,0xd287849a),LL(0x969ee2c3,0x2319a1d3),LL(0x7987e8d9,0xda41b97e),L_(0x00000077),
+ LL(0x66e6b355,0x48d7c646),LL(0x494cec8b,0x4319bb26),LL(0x3c15f132,0xa4923bd5),LL(0xb25b7340,0xe36296a4),LL(0xd2c82187,0x62a70b23),LL(0x3a2676cb,0x3ce0a44b),LL(0x15ada951,0x93e13762),LL(0xcdd5bfa0,0x7e7884bd),L_(0x00000094), LL(0xe16f0577,0xeb1d23f2),LL(0x563bc2d6,0x74b1ae5a),LL(0x22ce417d,0xf0676c19),LL(0x8b56e586,0x64665c8d),LL(0xd3d21118,0x4a9d1f08),LL(0xb5b57a1f,0x9ad18a2e),LL(0x121b1440,0x31f16f69),LL(0xd3dba51f,0x94a4555a),L_(0x00000186),
+ LL(0x14a0990f,0x1571f4bd),LL(0x8a12a2ae,0xa7e98142),LL(0x64ea4bd5,0xf548a570),LL(0xc2f56d89,0x3a99f05e),LL(0x24fcfb51,0xb029c28b),LL(0x468881de,0x16eb364a),LL(0x54a22d8c,0x9df6df67),LL(0x8e7ba7c2,0x2986939a),L_(0x000000d8), LL(0x6d585b84,0x8b87eab6),LL(0xf8f2e668,0x61b8a4ae),LL(0x1b210ab1,0xcd5968d0),LL(0x38c32d9f,0x9469f27a),LL(0x2170203f,0x7e65bf26),LL(0xdf5327ba,0x268e8f3d),LL(0x0d743f23,0xbbd5d6a5),LL(0x6866dcf3,0xebf3b6f7),L_(0x00000010),
+ LL(0xfe75ceb3,0xc2dbf93c),LL(0x7d044fdd,0x05aa3d0f),LL(0x3459ab15,0x1e4c0404),LL(0xbea051fd,0xeeca2cbf),LL(0xa5c86723,0x428637a5),LL(0x81d9dd90,0xd3aca9d5),LL(0xf6461276,0x78277709),LL(0x5fdc5888,0xc80ded9e),L_(0x0000013d), LL(0x105fdead,0xb799ae3c),LL(0xc919db59,0x5e3595ac),LL(0x2aa1f7f7,0x4e9b6f6b),LL(0x519dab32,0x1054eecc),LL(0xd70aa0c8,0xdab1fa02),LL(0x45046840,0xe8162c46),LL(0x382d8fac,0x3f7fc117),LL(0xc63a2e34,0xf8b4f79c),L_(0x000001dc),
+ LL(0x40f45643,0x5e42072e),LL(0xb22b4730,0x6980bc47),LL(0x0c0959ae,0xd0091f48),LL(0x17382117,0xe76ce6df),LL(0x6fb6755f,0x083b1371),LL(0x8e338195,0x3ce92877),LL(0x57844465,0x22eadd23),LL(0x88650fd1,0xcb97b5f2),L_(0x00000194), LL(0xb832d4f9,0x40795011),LL(0x2f5eb6ec,0x56106a16),LL(0x439d72fa,0x7a360472),LL(0x9a695980,0x77c4b5ed),LL(0xbd3315f1,0xcd83808f),LL(0xc773b196,0x21f3f41d),LL(0xdcca40dc,0x42518607),LL(0xd975bf10,0x6fd38920),L_(0x000000cd),
+ LL(0x7643d0a4,0xca61488d),LL(0xc9a4ec9b,0x78d40864),LL(0x08ac32aa,0xd1f91912),LL(0xe2c33dbb,0x4ce17265),LL(0xa6b041d8,0xc73e5e84),LL(0x130222f6,0xcaf07f55),LL(0xbc20bdd0,0x2fe0bc76),LL(0x482195b2,0x6fe4ca43),L_(0x00000141), LL(0x37f04c87,0xbdd6ee14),LL(0x601822b2,0xb9431fd2),LL(0xf10879b1,0xebee54b7),LL(0xb8d5c027,0x530c61a6),LL(0x52358509,0x3b953e07),LL(0xc05d71ee,0xd055e247),LL(0xfc120f31,0x51f78c21),LL(0xb71a77f5,0x8d424c40),L_(0x0000008b),
+ LL(0xdcca1655,0xfcdcd83f),LL(0x6f13723c,0x6fe01dad),LL(0x48fc724e,0x10ea92f4),LL(0xe9506b35,0xbacd3171),LL(0x32c50316,0x5b9c3826),LL(0xb525812e,0xb06a2041),LL(0x6095bd35,0x29d1e51d),LL(0x8c9f2aff,0x03f8818f),L_(0x000001ba), LL(0xf5e8440d,0x5815a76f),LL(0x4652dd8f,0x0ba6e7eb),LL(0xa2d772d1,0x67d0cfa7),LL(0x2c2c10a3,0x9134fbe1),LL(0xe122408a,0x4d3fc999),LL(0x98396be7,0xf158ed72),LL(0xf1736447,0x2e445a86),LL(0x3589b3e7,0xd638a810),L_(0x0000013e),
+ LL(0xaa39db8a,0xcd1bfa5a),LL(0x3f690830,0xf20580fd),LL(0x47516625,0xc02a443b),LL(0x72df9c02,0x37c50805),LL(0x1f658c86,0x70ba4df8),LL(0xb9b7c15e,0x7863af7e),LL(0x4f048a5e,0xac437359),LL(0x985ed711,0x9b762ef5),L_(0x00000035), LL(0x31deb67a,0xf7ff8403),LL(0x277a75a7,0x9efc9dd1),LL(0x9e038122,0x72ab76fd),LL(0x380f72e2,0xa5bd7ec4),LL(0x55ee2df7,0xe6e012fa),LL(0x8dba5f73,0x3daacbbb),LL(0x7d57b1b9,0x706e065a),LL(0x2a1528ff,0x9e984f15),L_(0x000001c4),
+ LL(0x15c609d6,0xe5366bdb),LL(0xba4c8f5f,0xab004e8e),LL(0xa55c2b8f,0xbe220e5c),LL(0x9b0a693e,0x328cf3bb),LL(0xf0a01098,0x93659056),LL(0xba4d555d,0xa9299fb7),LL(0x705141f5,0xac2b6ea4),LL(0x44c2570f,0xd6c8f88d),L_(0x00000158), LL(0x4159e7f0,0xda0acb04),LL(0xd0b0f9e2,0x72227853),LL(0x9c81b6a3,0xfca5d947),LL(0xe37b62d0,0x89f8e6a5),LL(0xa2b087c1,0x397e6f2d),LL(0x79ab8dd4,0x0c2f8337),LL(0xe811e1ad,0xaed2062f),LL(0x41fc3c1b,0x6608ac6e),L_(0x00000196),
+ LL(0x62da0bcd,0x66e8ec0f),LL(0xa2436a22,0xb2614d9b),LL(0xc4f2fabe,0xd37ba7ca),LL(0x91730356,0xd6947b5c),LL(0x74afd26f,0xf62dae98),LL(0x24fc84c9,0xa5d82a0e),LL(0x01183e91,0x6d7bad82),LL(0x9ae00850,0x45968698),L_(0x00000176), LL(0xf94e5ea9,0x6a5a8c8b),LL(0x370f5efd,0x4a208fd5),LL(0x0abfbfb6,0xd3eba761),LL(0xb4577a64,0xaea020f7),LL(0x9d9fbff8,0xee185b5a),LL(0x7590eb6e,0xde37c8c6),LL(0x110f6564,0x087e5b3d),LL(0xf182e709,0x2a62e074),L_(0x00000022),
+ LL(0x35933656,0x11881664),LL(0x57d6289e,0xb5dfe85d),LL(0xb19a5774,0x03f55586),LL(0x84a3823a,0x83e66aba),LL(0x819d0f7f,0xe6540e46),LL(0x8229f91b,0xf8e60b64),LL(0x0ebba171,0x3cb7174c),LL(0x13a992ea,0xfc144f32),L_(0x000000dc), LL(0x66b10914,0xaf137af3),LL(0x22188a39,0xa99be2ef),LL(0xc9e8bf06,0x9f80153c),LL(0xb82d6f97,0xb70bb797),LL(0x713e0f8f,0x08001bac),LL(0x2900ebf9,0xc349df5c),LL(0x2dc5150c,0xcda05b0f),LL(0x705ef690,0xf953a13e),L_(0x0000006c),
+ LL(0x2275d0c6,0x43c2cbe5),LL(0xb77f7c23,0x426913e3),LL(0xa4d09bcb,0x193a8beb),LL(0x1c330bb2,0x9694aec2),LL(0xf90a1043,0x466c8910),LL(0x47794b4c,0x013120f4),LL(0x92db08ad,0x27504b4e),LL(0xfd2c4ee7,0x2771ac8c),L_(0x00000039), LL(0x3983eaf2,0x1520fd40),LL(0x43f9f523,0x10ab4804),LL(0xbbc7abbe,0x4c94f219),LL(0xb3da18c6,0x0653b434),LL(0x34410d29,0xa49aa62c),LL(0x475b1588,0x3fb54eff),LL(0x1efe3b74,0xe35ee322),LL(0xb5457582,0x0e28d1fe),L_(0x000001da),
+ LL(0xdfafafb9,0xd5ac6ec8),LL(0x3e035e11,0xf1bfe6e7),LL(0x0cdfda44,0x99f86b4b),LL(0xd82854c9,0x51eb2ba8),LL(0xe9378d3c,0xfc70edec),LL(0x0488564d,0x78099daa),LL(0x4df1eac2,0x106d93e9),LL(0xfcd2965d,0x9106f692),L_(0x0000018f), LL(0xeb73c32f,0x65c6a4f0),LL(0x12e6dfd1,0x613a95bd),LL(0xc4753f02,0x64c8ae6d),LL(0x6ee36689,0x82594975),LL(0x85faeab2,0xff936e47),LL(0xfd968563,0x16aa8dfb),LL(0xfae37039,0x6a6051eb),LL(0x090bfcd6,0xa79a4c77),L_(0x000000f5),
+ LL(0x1283d38d,0xab80a4e1),LL(0xab4695b9,0xb05894a6),LL(0x37378243,0x7f2984bd),LL(0x1227f75f,0xdf654236),LL(0xe2ef58d5,0x290dd3fb),LL(0xdf64907f,0x38ba14af),LL(0xf1d428ec,0x0c38bf2f),LL(0xc2c54bbc,0x86299078),L_(0x000000eb), LL(0x07837c73,0x31dfd968),LL(0xda6621ef,0x28b820a5),LL(0xe6fe2937,0xb934b778),LL(0x2622aba5,0xe627cb53),LL(0xdff94dc8,0xa81ea0cd),LL(0x560bd971,0x9c8b6e45),LL(0x2209f943,0xdbaad845),LL(0x6e9d457d,0xf9a711fc),L_(0x00000166),
+ LL(0x8402ef56,0xe6626b55),LL(0x5c34e569,0xbb9dc4c8),LL(0x009d6dab,0x6746cac4),LL(0xcf68656c,0x3336b947),LL(0xfe65ab97,0xe266a898),LL(0x0371ecf3,0x5830a2ee),LL(0x1d57e75b,0xc9710982),LL(0x3e097669,0x4a1d3264),L_(0x000000c9), LL(0x78e2ad77,0xddfb754e),LL(0x284311de,0x4aaa3d53),LL(0xac9d56ca,0xfe5f5938),LL(0x19e9ec29,0x24185a04),LL(0xe89e92d3,0x746f628d),LL(0xfd0968c4,0x6959a461),LL(0x2cc1b198,0x7f39e175),LL(0x5c4efa86,0x9030ef68),L_(0x000001fd),
+},
+/* digit=29 base_pwr=2^145 */
+{
+ LL(0x15578941,0x1a86314a),LL(0x6a7421e8,0xe2ec4906),LL(0xe975bc97,0xa7485f37),LL(0xd59fd20a,0xe5e712ab),LL(0x5b001318,0x951133a1),LL(0x1259bdca,0x057f57ee),LL(0xcbd3b2c6,0x33dad04a),LL(0xef3153ef,0xb54dd9e7),L_(0x000001a7), LL(0x2ed37d50,0xa4e81e7b),LL(0xf8f36d87,0x5a01a3ef),LL(0x0288c3e4,0x8b372673),LL(0x846f5208,0xa991189b),LL(0x6f560651,0x71db52e5),LL(0x431caeef,0x58e36c06),LL(0xa3f98d5e,0xd8d03f83),LL(0x020099b8,0xc4c7aadc),L_(0x00000118),
+ LL(0x52ab1b79,0x7e2040bd),LL(0x95a122c6,0x89ab0660),LL(0xf1cb78af,0x01a20058),LL(0xc77cb751,0x31375e35),LL(0x5e133615,0xea159ba6),LL(0x524c75ea,0x7ecbfca3),LL(0xab8ae0fa,0x5719d039),LL(0x623ac91c,0x7f17199c),L_(0x000001ae), LL(0x6b1430a2,0x8450eb5d),LL(0xc47b9efe,0xafb92b30),LL(0xa9991147,0xf6824bee),LL(0xe1752c3f,0x2b160b39),LL(0x7fd6a625,0x6256f4b4),LL(0x574646e7,0x076f7bff),LL(0xe5bbdfa9,0xcc3f350c),LL(0x4642b5db,0xa6dbfda8),L_(0x00000093),
+ LL(0xfa21d74b,0x37719209),LL(0x8cfe5b17,0x00c8bba2),LL(0x1c2878b2,0xa620523f),LL(0x170331c9,0xa5843ac0),LL(0x8cd83b50,0x0381135b),LL(0xb047131d,0xa643b75e),LL(0xd2ab54c3,0xc5ef1464),LL(0x62ed0e42,0x2a2e87f3),L_(0x000000fe), LL(0x91bb20fb,0x78f86132),LL(0x7805c40a,0x895f7e0d),LL(0xa2a8624a,0x3ce4b54c),LL(0x6579a871,0x1b0cde0e),LL(0xd626e2cc,0x6377df41),LL(0x045193c6,0xcd6454de),LL(0x1c3ca349,0x4909db1f),LL(0xb047b0a1,0x2ac29d91),L_(0x0000015a),
+ LL(0xf432b93e,0x4a6f35d7),LL(0x611248d4,0x62f74f5a),LL(0xff45509d,0xef98d968),LL(0xf78b11dc,0x540d2d90),LL(0x8e0fdb4e,0xf1948691),LL(0xf839178d,0x775c9c48),LL(0x1546952b,0x2da4516e),LL(0xb05a9a42,0x7e1f1548),L_(0x0000016d), LL(0x5a0e6542,0x5c40801a),LL(0xc9bfcea8,0x8cf4381f),LL(0xecff5ed1,0x04226551),LL(0xe3765708,0x3addaf06),LL(0xbf10bb39,0xe6d6327d),LL(0xa7a94c0b,0xde98dcbd),LL(0xc9cc265a,0x9445d1d2),LL(0x39198006,0x0a4801d2),L_(0x000001ce),
+ LL(0x6fd53bcb,0x11b88070),LL(0x89212039,0x0fd4310b),LL(0x7c570d88,0xfb34d160),LL(0xe29cc2db,0x8d8b6c1d),LL(0x98ac6419,0x633a2387),LL(0x48918f6b,0x3767a8fb),LL(0xc7f5fff0,0x1de5bf8a),LL(0x517008cf,0x0be25167),L_(0x0000010f), LL(0xc8a802dc,0x31a9aa05),LL(0x3f45d1a4,0x955dbbaa),LL(0x019bc5a3,0xf987ec6f),LL(0x7819e65f,0xa521ab1b),LL(0x6a8b4966,0x9db12d33),LL(0x1c418ebe,0x5c25c25e),LL(0xd371d986,0x05758d98),LL(0xcdb745fe,0x95301bd1),L_(0x00000034),
+ LL(0x82dda7a2,0x8cb7272f),LL(0x285a44b5,0xd0fa019c),LL(0x772202b8,0x256b2dc1),LL(0xf7a1827e,0x70cc578d),LL(0xf561fd03,0xf01369b8),LL(0x4b48b6ea,0xb34eeab3),LL(0xf869dc36,0xf55466de),LL(0x10fbfa49,0xd2c42ed5),L_(0x00000049), LL(0xa79b35c8,0x72243fd6),LL(0x48942459,0x6f4d4b6f),LL(0xbe3c7cfe,0x4b050256),LL(0x273326f3,0xccad925d),LL(0xcfe66f8b,0x63feb094),LL(0xd430d816,0xe74dd574),LL(0xf5ea27b5,0x45e6d69a),LL(0xe57442d8,0x62ad1e6a),L_(0x0000013c),
+ LL(0x91a18dca,0x52fb15ad),LL(0x64cc9794,0x889fc872),LL(0x76b7b4b5,0x516a4447),LL(0x7f78f44e,0xe0dc9367),LL(0x03435817,0x6c0ef141),LL(0x3e179290,0xdcc3815b),LL(0xa243fcb3,0x57d2c5d1),LL(0x33e3e4cd,0xcfefc1bf),L_(0x00000110), LL(0x373d3db8,0x567532fe),LL(0xa4edcdd2,0xe2cdd2ad),LL(0x313da102,0x7dc4c171),LL(0x9b6477b7,0x10610301),LL(0xd6614ed9,0xe5dbb13f),LL(0x093e9d03,0xc78d8181),LL(0x34692c91,0xd1998555),LL(0xfad9c4a4,0xbc55ef3f),L_(0x00000114),
+ LL(0x22136d3a,0x5150ed1e),LL(0xf12f4a61,0x48b602d1),LL(0x58c86ca8,0x8f3a438f),LL(0x2ad94dbc,0xfd28616c),LL(0xa1741520,0xfc8f344f),LL(0x97e96926,0xa2867b76),LL(0x3f74f49a,0xc963769f),LL(0x9eafe4ec,0xf81b0338),L_(0x000001be), LL(0x8d3271ab,0xeb904c8b),LL(0x361247ec,0xcf0e8b6b),LL(0x9dc846a9,0xf58b8dfe),LL(0x1bd5a3dc,0x46766ec7),LL(0xabb872ef,0x7028f76a),LL(0x5976ea25,0x7d56cad7),LL(0xa7a4c1e3,0x50e6e410),LL(0xd9ef6dff,0x18098aa4),L_(0x00000110),
+ LL(0x54ca4d62,0xa4adf367),LL(0x2f1d9120,0x9de3bdf9),LL(0xa199c49a,0x911112e9),LL(0x918e1ab3,0x51c4e324),LL(0x1ab9377d,0xdecbb2fc),LL(0x089f9423,0xfbdc7272),LL(0x61643ec7,0x297b6a31),LL(0x8eafbdcf,0x2cfa0899),L_(0x000001dd), LL(0xb9b29381,0x9618730d),LL(0x5c79e6e7,0x984e3379),LL(0x9a017cdf,0x6a46a60e),LL(0xb44ef6fe,0x6fd9e713),LL(0x8cf5836b,0x2e3b6ebb),LL(0x29b6614b,0x741582d0),LL(0xa7c94b36,0xb93abf5a),LL(0xc0822faa,0x19fa7da6),L_(0x00000070),
+ LL(0x6d40ef9f,0x75d98fac),LL(0x52ee8497,0x4f994b00),LL(0xb0754aa8,0xae60032c),LL(0x19b6eb82,0xb89fa32d),LL(0x3aea1e12,0xd3d62cba),LL(0xa47b84ef,0x7b3e3f24),LL(0x3738323f,0xa1811a10),LL(0xa83238ea,0x5ad6df01),L_(0x000000fb), LL(0xe600e837,0x2ba5692b),LL(0x25fadbb6,0x8c4ff4f6),LL(0xad437e54,0xfa9d42cd),LL(0x14c8f3b0,0x79e73eb8),LL(0xa0355c3e,0xee8fbd21),LL(0xefee74e8,0xb4ebba9f),LL(0x0e987b86,0x0e79123c),LL(0xa0018bb1,0x9f828609),L_(0x000000b4),
+ LL(0x68def816,0x3f12ff36),LL(0x4b57900c,0x7fffe102),LL(0xd2939213,0x70f61f2a),LL(0x4ecb6d5f,0x351a0540),LL(0xca3d4a8e,0x51a7737d),LL(0x887af4be,0xbc6bf04e),LL(0xfca084af,0xafb6ef2e),LL(0x80de41d0,0x1f45db0a),L_(0x000001a1), LL(0xa72b2fa9,0x9b7182ad),LL(0xa970074e,0x18bf55a2),LL(0x056574a9,0xb8d1ebac),LL(0xeba9a5ac,0x4bbdf7b3),LL(0xd324a4b9,0x20cc2ce0),LL(0x56572fe4,0x1a2b2538),LL(0xf24f0245,0xef07dd5e),LL(0x5ab8b3cb,0x4d463bcb),L_(0x0000013a),
+ LL(0x41cdedbf,0xcbb3dcf6),LL(0x8c3fb216,0x19500d09),LL(0xe213167c,0xe814428b),LL(0xac93cb34,0x1a28a2b6),LL(0x861cf475,0xbc74e6e7),LL(0xcc2d45ad,0x0f8c1d18),LL(0xbd9bdb71,0x6d7baa7c),LL(0x43067701,0x1f4e3b7d),L_(0x00000024), LL(0x8a8c2d8f,0xc8929c33),LL(0xc43c1d40,0x819f1cba),LL(0xdda7d3c4,0x598c12f3),LL(0xe612ee48,0xaa092a4b),LL(0x97324657,0xd55e9103),LL(0x1b8a4a06,0xd7a8f2d0),LL(0x010537d8,0xf7a0ab83),LL(0x9ae31bf0,0xc6e0b42d),L_(0x00000083),
+ LL(0xf56f7c26,0xac1feb24),LL(0x4df5d838,0x15563b3a),LL(0x1ca4e8a0,0xbf968a88),LL(0x62060557,0x3ca8c519),LL(0x46507367,0x743fec64),LL(0x374e7834,0xd6eda8e3),LL(0xe0db390d,0x64260f14),LL(0x96c53e95,0x0f1c8b0a),L_(0x00000171), LL(0xb4ebbd85,0x2786a497),LL(0x2343b68c,0xbc5660f7),LL(0x3871cff1,0xa03e99a5),LL(0x32a3116c,0x91a2e2b2),LL(0x39a66a33,0xf1e21170),LL(0xb4a691a2,0x0b59581c),LL(0x760bf647,0xbf35d6e4),LL(0xccdb4699,0x35e4ec1b),L_(0x00000125),
+ LL(0x8ea4e81f,0x6f0c46da),LL(0x6349f724,0xa1f6221f),LL(0x3d1cb710,0x801a6d7d),LL(0x9a8daaa8,0xdff7216c),LL(0xaabb78f1,0x0d054787),LL(0x6a1b8dee,0x9342cf54),LL(0x7426ffaf,0x8839548a),LL(0x7e189575,0xc54c3c21),L_(0x0000007a), LL(0x645473ec,0xf45138ac),LL(0xcb977455,0x51f3e82d),LL(0x23de028c,0xcb2096e6),LL(0x1236013a,0xd60fa53f),LL(0x790031f5,0x590da1dc),LL(0x41383462,0xd75ce15d),LL(0xaac7003b,0x5c3cf3c2),LL(0xe97d1507,0x738f1700),L_(0x00000179),
+ LL(0x552d3a3e,0xf4eca93b),LL(0xae1c95c5,0xdc45bd28),LL(0x0c12e32d,0x5dd7eb7c),LL(0x50ac538b,0x692eb87e),LL(0xc65147a8,0xa055973b),LL(0x8ff87281,0x23507ab9),LL(0x63636873,0x1c85fb4c),LL(0x794d2027,0x597db57e),L_(0x0000006f), LL(0xfe67d871,0x0c89c0f4),LL(0x7e7fa083,0x3b0ba9a3),LL(0x25bac099,0x1416b2e6),LL(0xcbc2cc9b,0xbbcf2943),LL(0xc5a1f7b3,0x354fa11e),LL(0xb195e363,0x61adb945),LL(0xcce31308,0xfde526a9),LL(0x5e8055b0,0x2d4a42f0),L_(0x00000100),
+ LL(0x7e3f21a0,0x83926d83),LL(0x58ff928b,0x46424f50),LL(0x50a21088,0x656540b1),LL(0xd69839e2,0x2172157b),LL(0xc836bb43,0x34535e3b),LL(0x1f818f5d,0x61ec6b27),LL(0xf4cd40aa,0x8714bd57),LL(0xfdb8302a,0x633209c8),L_(0x000000d1), LL(0x0a6b22f2,0x8b7033af),LL(0xdbf4f3b5,0x213a07cd),LL(0xd71e271e,0xfa9434d1),LL(0xc069f3af,0xd5d23e3a),LL(0xc4ccd448,0xe785990c),LL(0xdd215a3d,0x500536e9),LL(0x43168909,0xe45a1f48),LL(0x9f92d8e2,0x747468d3),L_(0x000000aa),
+},
+/* digit=30 base_pwr=2^150 */
+{
+ LL(0xf661dbbf,0x43121ba6),LL(0x2325e379,0x176edfca),LL(0xf0cef68c,0xa3861e28),LL(0x617ac6ed,0xa77e7f84),LL(0x57535e8c,0xd31f498d),LL(0xf36e23d1,0x546d78b2),LL(0x2c3f8810,0xcfc7d55e),LL(0x156a1cb9,0xd5aca891),L_(0x0000001a), LL(0x974ce76b,0x894a4c0a),LL(0xc178af73,0xe4d65f8f),LL(0x5d4f42d7,0xf71cb940),LL(0xf73dac29,0x1d35c689),LL(0x32814192,0xe3cb66f4),LL(0x753255de,0xaf9effca),LL(0xa9814253,0xd34e3d9e),LL(0x22e23b71,0x8168c420),L_(0x000001f1),
+ LL(0xaa0bda51,0x62c59939),LL(0x9d4f255c,0x1e39fae8),LL(0x74c49bbe,0x09372aef),LL(0x180fc9e6,0xde724860),LL(0x163da12a,0xfa823f50),LL(0xa72a28de,0x965a30e8),LL(0x3c600eca,0x905cf108),LL(0x9f8b9687,0xd2d094af),L_(0x000000c3), LL(0x26afd7d7,0x13810cfd),LL(0x986aa03b,0x37d1ddbf),LL(0xeede05c2,0x2715d035),LL(0xb7ae0b88,0x95ef9e71),LL(0x08124878,0xe5042346),LL(0x9f87f170,0x3054f163),LL(0xebc09360,0xce2e674e),LL(0x593b42f2,0x6d4f4654),L_(0x000001b2),
+ LL(0x673811ec,0x60b858de),LL(0xeb464fae,0x677b9369),LL(0xd5f16b47,0x26383f92),LL(0xc119870e,0x3f8c6fe9),LL(0x5da1cbb2,0xf7124d37),LL(0xf6c7c1d8,0xdb2b9c75),LL(0x96be948d,0x93746dbd),LL(0x9988eb57,0x760b9ec6),L_(0x00000024), LL(0x03e8f45c,0x3d8c21e4),LL(0x9b0b40cd,0xc1186513),LL(0xb44deee2,0xf970a928),LL(0x2d95e66b,0xa6ac8009),LL(0x8387cee5,0xbddad6f7),LL(0xfec87180,0x0d3ded17),LL(0x2404e11c,0x41ea3e64),LL(0x725101e4,0x4f7761e0),L_(0x000001b3),
+ LL(0xc6a2f3a1,0xa09feeb1),LL(0x180b5e19,0xc54628c6),LL(0xe8c61be2,0x773cefba),LL(0x054eeedc,0x90648d31),LL(0x0005e411,0x36489351),LL(0x44b74925,0x54e90646),LL(0x573a22ca,0xd626639e),LL(0xa6074dac,0x850593b5),L_(0x00000197), LL(0x9e2e1f28,0x11161ac9),LL(0x4f328fba,0xaaf012b0),LL(0xb74a91c1,0xadb60a6c),LL(0x0cf3c48d,0x1b818269),LL(0xf7c4e07d,0x9eb0dacb),LL(0x2e6fbed1,0xaba09048),LL(0x9ea1ef81,0xaab8c6fb),LL(0x4b567809,0x87318d6d),L_(0x00000196),
+ LL(0xdee1b8d1,0xeadd7be3),LL(0x42ed487b,0xcb4bb355),LL(0x508d338c,0x1d927c01),LL(0x671a9478,0xd1e3ea8e),LL(0x6482584e,0x83bdc72c),LL(0xb63d17da,0xe52363b8),LL(0x49266941,0x4b78813a),LL(0xcb9e3414,0x5ec6b5cf),L_(0x00000092), LL(0x1f691526,0xb7f97367),LL(0x8a234b55,0xb87b73bd),LL(0x107f953d,0x2944bffc),LL(0x7c0ce6fb,0x6166fb64),LL(0xe784fca9,0x0a71a69e),LL(0x864d9dbf,0xa770d1de),LL(0x1d767a82,0x641a01bc),LL(0xcb0ce972,0xe39d1b9b),L_(0x000001fd),
+ LL(0xc878d60b,0xeb346a1c),LL(0x6b8a06cb,0x38f8292a),LL(0x28e10a9b,0xa02441ad),LL(0x110ae3e5,0x374d8f2e),LL(0x9df680d7,0x622d31b8),LL(0x0be1994b,0x98b8d29a),LL(0x35da2573,0xcf273b8e),LL(0x5a38591a,0x797f3e99),L_(0x00000156), LL(0x49364b7a,0xd85cd33a),LL(0x18db5402,0x71a1b4e6),LL(0x7ccbb0bd,0xda26853d),LL(0xc76e0476,0x1360631f),LL(0x888e44f3,0xf6b0ad63),LL(0x2c3af0f8,0xbec71f59),LL(0xdbf01e8d,0x723b0fd6),LL(0x92661703,0x31867e0b),L_(0x00000137),
+ LL(0x28ddccde,0x38aeac57),LL(0x4e993e85,0x0db5dd87),LL(0x38abc090,0xb465add4),LL(0x0c1739c3,0x43d0e74a),LL(0x70bd3e21,0x0b277d58),LL(0xac3af0a3,0x7b2c5422),LL(0x770a41ce,0x08580ab5),LL(0x9864e070,0xa3af8219),L_(0x0000002c), LL(0xe88e2a8f,0x6783af82),LL(0x37cfc10e,0x6261464c),LL(0x8e8c7510,0xcc9c836e),LL(0x503598b9,0x560d6425),LL(0xcf7c6100,0x4d90b834),LL(0xa8db43b7,0x2444a629),LL(0xd2cb3f5e,0xcabe2a81),LL(0x64aa2ef3,0xfca35c68),L_(0x0000013b),
+ LL(0x8b6de757,0xa9eb572b),LL(0xe5a924f4,0x650813f9),LL(0x4cddfbbc,0x0f808102),LL(0x750529ae,0x8dbdc23e),LL(0xfc407a67,0x3db36c6d),LL(0x549e5c64,0xadee9ab1),LL(0x55d46bd9,0xacadd1f8),LL(0xf68182d8,0xdd3bbaed),L_(0x00000171), LL(0x66e2fb66,0x24a72828),LL(0xe75f104b,0x50b3c877),LL(0xe38bb301,0x2f8590fa),LL(0xb7b5535d,0xf87c6208),LL(0xe1b50eae,0x41ba355d),LL(0x3f0d0c45,0x8bfe9602),LL(0xdc159699,0x3cdcf2ea),LL(0xab8c033f,0xe7e25f41),L_(0x000001dd),
+ LL(0x29dba96e,0xc3f8209e),LL(0xb1d945a2,0x08e3fd6a),LL(0x6511a3da,0x9263ef8c),LL(0x2562d483,0xd579038d),LL(0xc4c88945,0x5094d203),LL(0x75e4003b,0x54ec1258),LL(0xbe6102b0,0xe7874a8c),LL(0x8d34a4cc,0x27868839),L_(0x000000ea), LL(0x018d87b3,0x19a05999),LL(0xaacd7c73,0xd3cb884f),LL(0xe794b313,0x5a8d6b1c),LL(0x598893b1,0x47ab4f51),LL(0x7e862cb6,0xcd145d37),LL(0x58ebff95,0xa0ddf0aa),LL(0xcb716afe,0xa0791796),LL(0xc7f724f2,0xf2c9729e),L_(0x000000ee),
+ LL(0x5cadd4b7,0x080a8ec1),LL(0xb97d34b1,0x7709d928),LL(0x24150cc5,0xfda92711),LL(0x9f76ea4a,0xa5dd93a6),LL(0x4e4f7b83,0x826a2138),LL(0xb1f097c8,0xdb8dc9be),LL(0x877e5a70,0xf1a434cb),LL(0xdd51585b,0x86a8a774),L_(0x000000d3), LL(0x7f07e424,0x166eed95),LL(0x061bf4f5,0x469e3126),LL(0x06b67307,0xacfcc07d),LL(0x87971f8e,0x96d964d3),LL(0xe5aebd3f,0xa4d18cb2),LL(0x5d286291,0x3fbd829f),LL(0x7560bbae,0x277863a6),LL(0x6e83e561,0x690089b3),L_(0x000001ba),
+ LL(0x6a2ec0c8,0x6902a948),LL(0x82ea938a,0x1db5acbd),LL(0x9ed742a7,0x26e981b2),LL(0x64d1ad56,0x075f4b10),LL(0x30adf93f,0xfd5008eb),LL(0xdc51091f,0x7f4f1467),LL(0x907912b5,0x0fb17ba1),LL(0x567270fd,0xa348b34f),L_(0x00000094), LL(0xbf940606,0x18337830),LL(0xabbf9925,0x7019fd78),LL(0xbb5e1175,0xc937b351),LL(0x1359c463,0xd19eff42),LL(0xfe68dfe8,0xa8892734),LL(0xed1005b7,0x7cc639ba),LL(0x780e1feb,0xb6ff755e),LL(0x1f0082fa,0x16899eda),L_(0x000001ec),
+ LL(0x191bfbe8,0x87367459),LL(0x58859da0,0xd000c521),LL(0x4373d9cc,0x560dbafd),LL(0xfeee235e,0x8d303a3e),LL(0x1fe980f9,0x2a6082ad),LL(0xb5244f01,0x567ed43e),LL(0x8306748e,0xa7eddca6),LL(0x4e531e38,0xec76ef95),L_(0x0000006a), LL(0x100101b4,0x4e959563),LL(0x7ab1df8f,0xbcb6c605),LL(0x0218cd6f,0x3a152b14),LL(0x217b7b09,0x9b32670a),LL(0x7924c99c,0x8550cfd6),LL(0xf9af0b38,0xda396f8c),LL(0x27557bfe,0x01351543),LL(0xf74a0d9f,0xdcef098c),L_(0x000000cb),
+ LL(0xafc3d641,0x7e899074),LL(0xeac59b4a,0xab6f7e5f),LL(0x9036a3e5,0xd5685de7),LL(0x32b71856,0x6c3ebc40),LL(0xbe82a80b,0x46fa8ac4),LL(0x8d567d33,0x8f1ba3f5),LL(0xe3d61024,0x9622947c),LL(0x175ff060,0xe735b06d),L_(0x0000015b), LL(0x79460a8f,0x28338621),LL(0xa409e48e,0x6cee22e8),LL(0x04f98fee,0x448a258d),LL(0xb3e86ccf,0xedd8a07d),LL(0x94212741,0xe7c10493),LL(0x0eae65b6,0x72b816f3),LL(0x3c05e156,0xaf3b8cf2),LL(0xbeed59dd,0xd6c91b11),L_(0x0000017d),
+ LL(0x09ba81aa,0x3d989afa),LL(0xf91b3d7c,0x24d1650d),LL(0xff5c31f0,0xdd5b9bae),LL(0x20976038,0xf21ca860),LL(0x119240c2,0xcea2f4f0),LL(0x317b48b0,0x894a28c8),LL(0x18cdb521,0x70a13f92),LL(0x613d3aff,0xe3c74422),L_(0x00000003), LL(0xe8dd6883,0x18e6d135),LL(0xeb2f0e32,0x2b49078e),LL(0xf0a3dbd6,0x80094f8b),LL(0xad97e7ba,0x7ec56e28),LL(0x9e31d818,0x1a28c019),LL(0x2e151983,0x924258ad),LL(0x40e237bd,0x4e48eb49),LL(0x7b03fcb6,0x865da13c),L_(0x00000181),
+ LL(0x023dd329,0x3dc56c97),LL(0x2622fb40,0x2ec06f52),LL(0xca023e51,0x70809db6),LL(0x4a297188,0x1e390795),LL(0x4a3bacea,0xc30dbed7),LL(0x0824bcd6,0x3a9a9a8c),LL(0x3e051eda,0x98211435),LL(0xbf2fd10b,0xec587a65),L_(0x0000000f), LL(0x6a685349,0x272a03cd),LL(0xecc543f9,0x54d18fe3),LL(0xdf8cb8ba,0x9b7c5d19),LL(0x5f3f336d,0x9e4ff288),LL(0x5e647a61,0x2dc0aea7),LL(0xbdca4466,0x24b8d191),LL(0x33cd397e,0x4bd62cf4),LL(0xf66b542f,0x572d2230),L_(0x000000a6),
+ LL(0x6acd9335,0xcbf85583),LL(0x52fb515f,0x7808f963),LL(0x374fc6d2,0x5865c5cb),LL(0xebbbb50f,0xa4d0c81e),LL(0x47f3a5b9,0x29ed702e),LL(0x97b4bc63,0x64f0fada),LL(0xf73be9b2,0xe65e3bbc),LL(0x42f9f14d,0x40320dd4),L_(0x000001bd), LL(0x4729cdbc,0x47ce590b),LL(0xf363cdb2,0x5be836dd),LL(0x6a8da968,0x5fd32e4b),LL(0x49bdb981,0x076e41c0),LL(0x8d8f7528,0x097db4cb),LL(0x7fc1d50b,0xf829470b),LL(0x75b1cc67,0xd2b6caef),LL(0xd55324b1,0x829ebed3),L_(0x000001ac),
+},
+/* digit=31 base_pwr=2^155 */
+{
+ LL(0xf69ff50f,0xfc1e2456),LL(0x02b84001,0x1c124be7),LL(0xa6c9b545,0x2857f671),LL(0x07337c72,0xb0a89f0e),LL(0x7d3661d0,0xaf022308),LL(0x61f17db2,0xd9b173b2),LL(0xd0457b51,0xf8c65404),LL(0xefc1cd30,0x8f61986e),L_(0x00000196), LL(0xfffafb34,0xc5bd6770),LL(0xfc7a7db4,0x0de59815),LL(0x342e8ca8,0x843b5602),LL(0x0e1c9e4f,0x3bfe9122),LL(0x8b0b7c5b,0xa1e2826c),LL(0xe442b313,0x88ce465c),LL(0xf2ef9e99,0x77217ce5),LL(0xa10ff590,0x672e5682),L_(0x000001f7),
+ LL(0x9441390c,0x054f8022),LL(0x7143ab58,0x9b74e159),LL(0x8a901ba0,0x116652a4),LL(0x9b4f3635,0x0afb314b),LL(0x45e2ee30,0xd4622886),LL(0x4d2f79f7,0xb66e6167),LL(0x298ff3c1,0x2505aad2),LL(0x27d64009,0xc36ddbd3),L_(0x00000066), LL(0x0eb20dd5,0x4b51c2ba),LL(0x74c9cdac,0xbf1d3648),LL(0x10d4063e,0x6b726013),LL(0xc8c6fbaa,0xf8b94ac6),LL(0x6ce6639f,0x91f488ec),LL(0xf454066c,0x24c600b8),LL(0xf37706e5,0x1cff656e),LL(0x434286c2,0xe127b8a0),L_(0x00000087),
+ LL(0x35d5b009,0x7857cb4d),LL(0x2bf04d1e,0xc85eb560),LL(0xaf5c9697,0x3e426a2c),LL(0x140d9785,0xe234a765),LL(0xfae3a667,0x6a198191),LL(0x6a2fce6c,0x3a779c8f),LL(0x217e7e57,0xb35dd0c7),LL(0xb20040f7,0xad54aae8),L_(0x000000c4), LL(0x36df1d99,0x46ee68e7),LL(0x884f54d7,0x2f9e3760),LL(0x70670755,0x1a8bd746),LL(0xd3fc19b5,0xc34c78ba),LL(0xaf9a102e,0x9b57be0c),LL(0xfe21514a,0x9e7c2e6d),LL(0xde90d865,0xd44207f4),LL(0x19f36d3f,0x344544a7),L_(0x00000123),
+ LL(0xd877e284,0x37f60445),LL(0xca4191dc,0x69f0b4df),LL(0x358c7759,0x12aaa285),LL(0x72cf55e1,0x7f71ae31),LL(0x0ffea4f4,0xfc352eb3),LL(0x5b8d412a,0xc7ffc3d9),LL(0xabdbf74b,0x239ccbac),LL(0xd4b6acd1,0xfa89f30d),L_(0x00000163), LL(0xa6870d63,0xd1598751),LL(0xc6b0d1f9,0xc925f0b6),LL(0xa890fd44,0x106c309b),LL(0xcedd20fe,0xc46673f1),LL(0x2408588d,0xebfbcf6f),LL(0xb54153cb,0xa52fed53),LL(0x7b4aaced,0x672bbf3f),LL(0x84a22a21,0xf033a8d4),L_(0x0000004d),
+ LL(0x2197649c,0xa6098bec),LL(0x132b7114,0xe879a5ea),LL(0xbf33520a,0x5ec11946),LL(0xf7eb2f05,0x76724ae5),LL(0x8b00135e,0xa281ab75),LL(0xe322da16,0x75ecccf9),LL(0xf00478b6,0x5f741662),LL(0x77d420d9,0x27da38cf),L_(0x000001c3), LL(0x8deebf19,0x38cf892d),LL(0xdd1ae54e,0x4a486822),LL(0x8e9572bf,0x15d5deb4),LL(0x83965350,0xa31f170a),LL(0x098efd39,0x225bfe44),LL(0x3effcffa,0xd17f63bf),LL(0xf8e3659d,0x72dce9ce),LL(0x561fceba,0x7a4df1b0),L_(0x0000009f),
+ LL(0xaed633fc,0x573eaf11),LL(0xc05113c8,0x5f254d2b),LL(0x283764aa,0xee71c7fd),LL(0x70135776,0x88759ff7),LL(0x33df5ba9,0x84205188),LL(0xd52265da,0x809c0705),LL(0x912507fb,0x641067f4),LL(0x28d91a94,0x4a47efb6),L_(0x000000d6), LL(0xc5e6e2ac,0x0000ebfa),LL(0xa6c0565c,0xced796bd),LL(0x6c90c0d4,0x100a3283),LL(0xee187fc8,0x82bcb3d2),LL(0x8d7848e9,0x290e6b62),LL(0x4a59be08,0x5ab586db),LL(0xb9a00808,0xf4b07e2f),LL(0x210d8de2,0xc7559d56),L_(0x00000067),
+ LL(0x224b3264,0x7213c7fe),LL(0x43204c94,0x13a1a9d8),LL(0xf7f1cdee,0x68201c17),LL(0xd60991d9,0xbe9464cd),LL(0x4334ef4d,0x715fe2ea),LL(0x590e3478,0x7284a69e),LL(0xe07f24de,0x7c088851),LL(0x5ce9bed5,0xf517b62c),L_(0x000001c5), LL(0x3aeb8798,0x222d178c),LL(0xa01cdb6d,0xe0c1815b),LL(0x29424615,0xec65cc42),LL(0xfd885c8b,0xfd5df228),LL(0xd9564da3,0x9775d121),LL(0xb060eb3c,0xdc43087b),LL(0xbf975586,0x0c723af3),LL(0x941c0856,0x081262ab),L_(0x0000006c),
+ LL(0xbf0ac7a2,0x744e57f4),LL(0x8834334c,0x2edb448a),LL(0x4c1f9523,0xc8e4d56a),LL(0x85d4cde6,0x0bd23e3b),LL(0x83063d71,0x45b52f37),LL(0x14ca833d,0x2012d08a),LL(0xff85aaed,0x02ccbe55),LL(0x9fa9b95c,0x0a4b1e91),L_(0x000001fa), LL(0x04999b76,0xf355b09a),LL(0x9309a1f5,0x00d64b66),LL(0xb2bd55ad,0x57889605),LL(0x6b121bac,0x20d91b65),LL(0xed693b72,0x1faab888),LL(0x344453ea,0x45d07a30),LL(0x75e36d67,0xf7e7a52e),LL(0x86433618,0xdc4aaa79),L_(0x000000c8),
+ LL(0x9079f10e,0x7efb5f88),LL(0x2c050909,0x1cc662d3),LL(0x7e0de0a5,0x5ee0da97),LL(0xb01a8aa9,0x4922eaaa),LL(0xbf868cba,0x64bbc9e2),LL(0xba2129b9,0x0afac1c6),LL(0x38f86242,0xc8be3270),LL(0x7520a9f0,0x711b9939),L_(0x00000014), LL(0x0cf7a18c,0x5d48ee16),LL(0xc85d4499,0x04528b19),LL(0x2452bab5,0x65b2b9c3),LL(0xbcfb2531,0xd43a545f),LL(0xc03362e0,0x07cc670e),LL(0x5d9aafa1,0x58f98004),LL(0xd816f41a,0x324a8340),LL(0x352c0783,0x948019c3),L_(0x00000060),
+ LL(0x4b2484fc,0xfc2dc91c),LL(0x3b5be485,0xd7e9f840),LL(0x42217cb5,0x8585ec85),LL(0x3deede9d,0xa1f0053f),LL(0x48c56ddd,0x845902ce),LL(0xb2e99028,0xdbb111fe),LL(0x8f6659bc,0xf1537c2b),LL(0x89960f5b,0x2b6c075d),L_(0x000001de), LL(0x88a9e85b,0x39c6986f),LL(0x69af11de,0x0fa555ee),LL(0x0c555b9d,0x411f3b27),LL(0x62266b30,0x0b0e864c),LL(0x784a1194,0x112da824),LL(0xb7ec5b26,0xc56950bf),LL(0x8a57ba0f,0x3866d81f),LL(0x72e0aa00,0x33d123b7),L_(0x0000012f),
+ LL(0xf2f274e7,0x9f7aad66),LL(0xd84871e2,0x040c2554),LL(0x2a4885e0,0x8ddb8ec0),LL(0xbfd317bb,0x2a407fab),LL(0xaa27b70d,0x17f03cf3),LL(0x1bed7718,0x8c3de6bc),LL(0x34f5d378,0x0e550353),LL(0xfef609bb,0xf9faf54a),L_(0x000000e9), LL(0xc5275edd,0xd325a149),LL(0x33824d71,0x14d92534),LL(0xba4131f2,0xf74f4dc1),LL(0x81fdb0c7,0xd354ab8c),LL(0xc33be6cd,0x96e68610),LL(0x7d362d2c,0x967ca304),LL(0xad3a9c9c,0x90a06f8b),LL(0xaf6da5b3,0x05921c7a),L_(0x00000012),
+ LL(0xc1710f55,0x67ff0e8d),LL(0x7ef6718f,0x601481b6),LL(0xb39b462d,0x57d09ffa),LL(0xad90ba10,0xf83bbbb5),LL(0x918d94f2,0xed4c7a16),LL(0x2bee8d2e,0x9ddb61a1),LL(0xdadd0291,0xde96ab74),LL(0x2e5753e9,0xf3c27390),L_(0x000001bb), LL(0xa3926dcd,0x5af3e375),LL(0x827a6eab,0xeb250dce),LL(0x08623cdc,0x52408bd1),LL(0x9a7d0e9c,0x236fdad4),LL(0xf66e3019,0x55ed033a),LL(0x55cf40ab,0x67077bc7),LL(0x33b49be6,0x3d6972e6),LL(0x34396ea4,0xc069b953),L_(0x000000fb),
+ LL(0xa4c22061,0x30374f9c),LL(0x83feabc1,0x5043f74b),LL(0xf24a71b6,0x0f58d08b),LL(0x5ac8cda0,0xe7084b9c),LL(0x20120c5a,0xc241d2a2),LL(0xa700c2dd,0x246b4a2f),LL(0xe50e9154,0xe1b127ec),LL(0x240be13a,0x7313d8aa),L_(0x00000117), LL(0x0178da07,0x4ac8c26e),LL(0xa3abe616,0xeaa2008e),LL(0x58d98d73,0x16a0bdbf),LL(0xf5f03b56,0x0dd5224a),LL(0xafd2d956,0x656cc265),LL(0xe30a653c,0x896d53dd),LL(0xc8ac8028,0x8038e832),LL(0xe07a2ee0,0x1df13c5a),L_(0x00000179),
+ LL(0xf7671c0c,0xdb94fffe),LL(0x0361d956,0xbca8fdc3),LL(0x860aa7a6,0xff4ebfa5),LL(0xca2b724b,0xd506fbfe),LL(0xe572f34f,0x2e88a7d1),LL(0x430c48ff,0x74822e19),LL(0xeb20b178,0x623c0129),LL(0x07cc6f01,0x013ca3db),L_(0x00000040), LL(0xe9244f5d,0x8954a885),LL(0x2bf3bfbd,0xf3969954),LL(0xa7e331fd,0x80dc93a6),LL(0x16b29c51,0xe85d8098),LL(0xfad960c8,0x7931b35d),LL(0x74ab3a3a,0x2e570f29),LL(0xf4422349,0x54904daa),LL(0x5e1f7007,0x16920cf2),L_(0x0000014c),
+ LL(0x11b4e5eb,0x5620232e),LL(0x8a138aa8,0x46f706eb),LL(0xa03d24cf,0x6e11ca59),LL(0x7337f5d0,0xad37149e),LL(0xfa3336f2,0xb68bf40b),LL(0xcb9ee77e,0xa7c9f76e),LL(0x8719bf3b,0xf9bd4330),LL(0x45e4e081,0xe7e07596),L_(0x00000148), LL(0x4d1bc133,0x8d32cc0d),LL(0x1bd3eff3,0xa11a2038),LL(0xde1eb1a9,0xa2e7f299),LL(0xb382b9cb,0xac50dfdc),LL(0x62fa8c40,0xe2272381),LL(0xa696bb54,0xf025e3e7),LL(0x68bf08ed,0x608f07d7),LL(0x91eb5365,0xd0e1062b),L_(0x00000157),
+ LL(0xea56e1b7,0x5f8128c4),LL(0x028409b6,0xe5e0d92d),LL(0x8ed0e1c4,0xf3b74f68),LL(0xc55f66d6,0x35d3f9f9),LL(0xdeb2ab80,0x3bde4296),LL(0xa7cb6b64,0x25e29f7e),LL(0x9b9d057f,0x087f5f23),LL(0x17e3fac2,0x1dc271af),L_(0x0000015d), LL(0xd463cbb3,0xd926fd3e),LL(0x014b12b6,0xab9ee679),LL(0x3a1bcb9a,0x1f47e609),LL(0x17170593,0xf44f73dc),LL(0x3b0a4387,0xd2a12e51),LL(0x3ce5c7cd,0x473ec3b7),LL(0x7f341e3a,0x6aef1796),LL(0x09a474c8,0x8fa42a38),L_(0x00000047),
+},
+/* digit=32 base_pwr=2^160 */
+{
+ LL(0xc2dc9808,0x7f1bc655),LL(0xb688a237,0x67de245f),LL(0xd7a61e34,0x30b260cd),LL(0x9aaf28a3,0x9aeae5d8),LL(0xd4e07803,0x53d349d8),LL(0xd7aea422,0x38cabcfe),LL(0x3728bd24,0x25a9960f),LL(0x58af5683,0x16a09af6),L_(0x0000003e), LL(0x816e52ab,0x1bc21ee4),LL(0x31a5819d,0x26613d4c),LL(0x2a5969b3,0x1a8c1407),LL(0xabfa75ee,0xd357015b),LL(0x7c563bc4,0xd2086ecb),LL(0xa4a80425,0x9b8fafb1),LL(0xc2661a2c,0x547ef737),LL(0xe7afb2d6,0xac816c20),L_(0x0000002f),
+ LL(0x65726f32,0xb7a9942b),LL(0xa33e2204,0x4a26b80f),LL(0xbbf82a56,0x73c6f40a),LL(0x970dfcc9,0xf9548526),LL(0xf1c38e96,0xd2bbae55),LL(0x2ecb19ab,0x1edd71d6),LL(0x6d97496c,0x2e20adf2),LL(0x17e1cf32,0x714bc0d9),L_(0x00000130), LL(0x76aaf44a,0xb67e29ba),LL(0x1031c67b,0x3d1213c2),LL(0xe37fdfde,0xb4f3b345),LL(0xb46f2bbe,0xef5d5bda),LL(0x53442227,0xbdace910),LL(0x75a65c11,0x0e12dac1),LL(0x99010c36,0x58cdb1cf),LL(0x06f25026,0x3222c871),L_(0x00000187),
+ LL(0xee441882,0xdeb1c61c),LL(0xf8ff5eb8,0x6080b71c),LL(0x7b2ccc29,0x214b75b5),LL(0xffb3c6aa,0xe80f53b9),LL(0x90a50e70,0xfeb156be),LL(0x0211fd2f,0xa94620e8),LL(0x15422e55,0x085db41e),LL(0x20305265,0x492c355d),L_(0x00000093), LL(0x139e1933,0x50841313),LL(0x976e986b,0xb6d55898),LL(0x36a0866b,0xa443f795),LL(0xe06bc0b2,0x63ba00b8),LL(0x734e5428,0xdd7a73a3),LL(0x213440e4,0xb2efa382),LL(0xb0905af8,0xe95312ec),LL(0xb084f884,0x3260e8ef),L_(0x000001cc),
+ LL(0x3f172c5e,0xd8ddaafa),LL(0xeb6e8784,0x785f2ae4),LL(0xf77d65ef,0x4e5db162),LL(0xdec5c58d,0x2375c785),LL(0x4a30bffa,0xc92e0f7f),LL(0x0c920bb7,0x294b17a0),LL(0x26f93d72,0x0a9107e0),LL(0xce9dc095,0xcde64911),L_(0x0000018d), LL(0x2b841c67,0x72452329),LL(0xb0490079,0x0e7ddb4c),LL(0x55646515,0xc3ad47f9),LL(0x4b2a0877,0xd8708db4),LL(0xa4c3de4b,0xb4a9131f),LL(0x938e9d24,0x85e650ae),LL(0x80176c45,0x60bb2e49),LL(0x0248559a,0xe3e93182),L_(0x000000cd),
+ LL(0x28cef71c,0x2e3e2609),LL(0x5311578b,0xb15a4e84),LL(0x66031c77,0xc30c76cc),LL(0xf2c06ffc,0xc352a0e2),LL(0xea471db8,0x9a687b94),LL(0x2e1e184b,0xb1979864),LL(0x08e1a1c9,0x7d1d84cf),LL(0xa36c823a,0x25036462),L_(0x00000135), LL(0x47b77555,0x1b0d298e),LL(0xe7833c92,0x071e1319),LL(0xe5e5ae43,0xbf6e6f4c),LL(0x48ff7cbd,0x44726013),LL(0xec042f31,0x861a992a),LL(0x820461f1,0x0e5f80d4),LL(0x5b728532,0x588846b7),LL(0x4edf14c0,0xdbf695ef),L_(0x0000003f),
+ LL(0x0f51608c,0x41c6cf4e),LL(0x15b1b366,0x263e7b75),LL(0x6eb6d459,0x041a5063),LL(0x53679a56,0x6ef1d0df),LL(0x9b4abcaa,0xb47a0301),LL(0xae975077,0xd2d427ef),LL(0x62f30c49,0x5a3dfa91),LL(0xc801e565,0xee86df8b),L_(0x00000124), LL(0x68202783,0x26d59f48),LL(0x4e17501a,0x3895e666),LL(0x202e3866,0xaa8031f4),LL(0xd2af7613,0x8ddf2869),LL(0xa21cc1e5,0xe13d84ff),LL(0x5da3159e,0x8f6eb59a),LL(0xb87bbc9c,0xdc5df9b7),LL(0xb8b6006c,0x68fc1771),L_(0x00000158),
+ LL(0x3e6aa5bb,0x9e7a21c0),LL(0xee3c40e2,0x9e430844),LL(0x91ca8307,0x420584b0),LL(0xfb05a033,0x5dc3546a),LL(0x515d7ef6,0xdfae44d0),LL(0x8e97acb0,0xad35608c),LL(0x1c181a0b,0x85a78e5d),LL(0xd8ba90d8,0xd453e7ca),L_(0x0000010d), LL(0x4b1cba50,0x3d89eff9),LL(0x1828d959,0xb8883419),LL(0x9cd1acbe,0xe7788137),LL(0xd9c16250,0xf51b1fc4),LL(0x2f4d66db,0xbf985d68),LL(0xe78a703c,0x98e4fae0),LL(0x8125e5c9,0x9fe12466),LL(0x7096d179,0xcfe7195c),L_(0x0000004d),
+ LL(0x96c267db,0x2de8af3a),LL(0xd7a0da68,0xfc2373c7),LL(0x5ae71058,0x00846c04),LL(0xb05a94e6,0x87910867),LL(0x49ec9a78,0x0df20f65),LL(0xaecf973f,0xd4a6c168),LL(0x30604ed3,0x0b50f6bc),LL(0x2722d421,0x1ef35f34),L_(0x000001d2), LL(0x3c89badc,0x32767a9d),LL(0x76ac95ea,0xdc1a4baa),LL(0x3eced60d,0x114219cd),LL(0x2d3cddf3,0x557cfa7d),LL(0x4c14e1ea,0xd40b6e23),LL(0x77a3c466,0x24ae1830),LL(0x9bfca752,0x8ee59e15),LL(0x0d62fa0c,0x91ffb4c3),L_(0x00000106),
+ LL(0x98c15e86,0xdbdbd0e0),LL(0x13fe0c31,0x3f1495d3),LL(0x611ba4e9,0xcaa1f174),LL(0xd93815b9,0xec434016),LL(0x3bdec28e,0xb9edffc7),LL(0x7d039312,0x995ffc03),LL(0x340b94bb,0xf4d0bdad),LL(0xd62628f0,0xd171e355),L_(0x000001b2), LL(0x874bb93e,0xd381244e),LL(0xb9a019ce,0x2710057d),LL(0xa746e7f7,0x5f04bc77),LL(0xc973f2cc,0x16b90cee),LL(0x45b7cdcc,0x3bf24131),LL(0xf860483e,0xa97598d3),LL(0xd873a041,0x5da07fc7),LL(0x13ee03df,0x1370307d),L_(0x000001cb),
+ LL(0x04785e61,0x6896551c),LL(0xc769142d,0x1f7de113),LL(0xdc5c38a3,0x6f6444e4),LL(0x619b0fe5,0x442a0f4e),LL(0xc1f930e3,0x0e3d13dc),LL(0xc2166fc3,0x16566439),LL(0x1264bd78,0x043b1c6c),LL(0x55bd407b,0x85bcb31d),L_(0x00000096), LL(0x51809e05,0x37cc449e),LL(0xcbcd15b1,0xc268f122),LL(0xde98d3eb,0xd1094f76),LL(0x2f691855,0x38e9385f),LL(0x940e99ca,0xebc0ca85),LL(0x7a41361e,0x633585a2),LL(0xe77d0dba,0xf4c9fedd),LL(0xffae9098,0x6c29f55e),L_(0x000001b5),
+ LL(0xa2f1a549,0xf13eb703),LL(0xc846b81d,0xcf6235f8),LL(0xba752969,0x28bf7176),LL(0xa83689cf,0x4f491b5c),LL(0xac203f35,0xa5c72127),LL(0x17a19c66,0xc5180b7d),LL(0xe3fefda7,0x2a895472),LL(0xbc0194d4,0x7cd212ca),L_(0x00000155), LL(0x854caa47,0x822cdfe0),LL(0x7cac3eb5,0x3c7db833),LL(0x13d80239,0x03909920),LL(0xd8e93f09,0xde83b6de),LL(0xb075d1a2,0x53e966c9),LL(0x372a1d5e,0x5b917dec),LL(0x60dd5294,0x8284dac3),LL(0xff014a15,0xac0f873e),L_(0x00000047),
+ LL(0x73b6bc0c,0xf1bfa63a),LL(0x10296f8e,0xabe3e152),LL(0x9dd0aaa4,0xd3d4285b),LL(0x0c15dad8,0x5f828ba3),LL(0x3be85ac5,0x343ddcee),LL(0x2204e02a,0x532735c7),LL(0x7ba86652,0x2a530b1b),LL(0x262994c6,0x13b8c7c1),L_(0x00000129), LL(0x391a6b29,0x05dfaa4f),LL(0x6b8878ef,0x3e5666ae),LL(0xb1b8a9fa,0xa4a12d5f),LL(0x9ace0b8d,0xc27561ea),LL(0x7b4c8164,0xef8504c5),LL(0xd8cc29d3,0x16570313),LL(0x483fc408,0x3b7b5ec3),LL(0x2f18c762,0x6d721583),L_(0x000001c3),
+ LL(0xb6ecbf65,0x8116e2fc),LL(0x5e8f5e16,0x59e26819),LL(0x5609fad9,0x8fafa607),LL(0x02dca647,0x7fb0c319),LL(0x1e28746a,0x62d45955),LL(0x6e8dafba,0x53e7625a),LL(0x83169dc2,0xe60b1042),LL(0xebf6fde7,0x8e9c9927),L_(0x00000153), LL(0x7b2d8bde,0x5592a1b4),LL(0x1e6bd0f2,0xcdd5271e),LL(0x566eb6fd,0x7f5033b8),LL(0x4ca0b581,0xd99ab0fb),LL(0xb6096f1e,0x3953fc59),LL(0xcf65a6f4,0x1d2ec4b4),LL(0x1920c542,0xd24e43ac),LL(0xbc37795d,0x3e1940bf),L_(0x00000100),
+ LL(0x154c2ad3,0x9ab5e4b3),LL(0xa83af5c6,0xaf86c5e5),LL(0x17feec16,0xa5cec56c),LL(0x98ec6557,0x84e83213),LL(0x0f7fdcf1,0x4c26d215),LL(0xffda8a76,0x453ea210),LL(0x9ecd3b2e,0x5f3f4d74),LL(0x45856be9,0x8864bfe9),L_(0x000000bc), LL(0xa68371b9,0x1b7d95b0),LL(0xe827845c,0xee539828),LL(0x8d12cb9b,0xe4618579),LL(0x7d751e1d,0x49a508f4),LL(0xf62e7726,0x71d8ff6b),LL(0x1aa5f1f4,0x1b002961),LL(0xb185989f,0xc7af8411),LL(0x436bb002,0x902fe574),L_(0x000000c6),
+ LL(0x83b10389,0x5487e28e),LL(0x6c59c4b1,0xdbe03ec9),LL(0x5812b87f,0x800f9a8d),LL(0xa69e4288,0x0042610f),LL(0xa98baf31,0xa41914ae),LL(0x04c78aca,0xad52d4dd),LL(0x200e6b24,0xe64f0db1),LL(0xef061a8b,0xb301c9f3),L_(0x00000118), LL(0x9064a4d4,0xf05bb7bd),LL(0xdb0e1035,0x95a8d7b1),LL(0xbed0afed,0x5aa18c8f),LL(0x1db27276,0xbed5ae9a),LL(0x21d6647d,0x87ff9181),LL(0xd1b9171c,0x25ddbbf6),LL(0x6afd3974,0x58651838),LL(0xd5394b3e,0x6640e3ca),L_(0x00000126),
+ LL(0x97acef3f,0xdda16fb0),LL(0x1fbdca04,0xe90de335),LL(0xff197a3e,0x7011f9ba),LL(0x10909fc0,0xbf835536),LL(0xa3d538e2,0xd3c214c4),LL(0xd1adfbd9,0x4b2db047),LL(0xa7800e16,0xe30b9e3f),LL(0x3ba0bb0c,0x566a5103),L_(0x000001b3), LL(0x3ccb2552,0xb20301de),LL(0xc8c0dcda,0xaf7c3af2),LL(0x06c79c8a,0x7eefe996),LL(0x38fb5284,0x7cb586d6),LL(0x59bf5673,0xec4f260f),LL(0x36f200b1,0x62ff887d),LL(0x39132913,0xe5ed3b69),LL(0xc40f0d7a,0x2b5086e3),L_(0x000001e0),
+},
+/* digit=33 base_pwr=2^165 */
+{
+ LL(0x9d8a516e,0x02a3fb8a),LL(0x5fedd472,0xecb3edff),LL(0x7fb9838f,0x762220d1),LL(0x8b9ac40f,0x23ad98dc),LL(0x59a8311e,0xfb615d6c),LL(0x86c784ed,0xe6c85dc4),LL(0xee5f8f84,0x6bbf81a7),LL(0x58d5bb86,0x91b5becc),L_(0x000000ac), LL(0xa1d41ef1,0x007acce1),LL(0x20e9778f,0xd8b8126b),LL(0x438944de,0x437a71b3),LL(0x4e76c73c,0x9a1b4b13),LL(0x14a56abd,0xb7385f9b),LL(0x29b4de8d,0x3115d582),LL(0x91b40784,0x15347258),LL(0xba8c32f8,0xf9f46c55),L_(0x000000ed),
+ LL(0x99943818,0x2684f683),LL(0x9d27b5d4,0x68a5f913),LL(0xa3ed9c84,0x9f9d03a1),LL(0xe699de7f,0xe3117424),LL(0x6ddd7e41,0x967769d8),LL(0xf6fd89cc,0x0e9e00b5),LL(0x4a6926ea,0x3d7b6393),LL(0x5b068a8b,0x5f0b111c),L_(0x000001a3), LL(0x297d21cf,0x9a2aecb4),LL(0xcf147f52,0x251f8677),LL(0xd2a35774,0xf0bbad3b),LL(0xbedc57bb,0xfe5b3790),LL(0xaa31f1db,0xb3cb7422),LL(0x01bb1e75,0x476bcd99),LL(0xb31cdbf6,0x8c278bd8),LL(0x6fb17125,0xd548282a),L_(0x00000150),
+ LL(0x19f12734,0x3d48fbed),LL(0xf69ad2bb,0x49bdd26f),LL(0x985b989b,0x61bfbf26),LL(0x451c21eb,0x35f12cad),LL(0xf237a30e,0x680a082d),LL(0x2751a3b3,0x88ebe4c9),LL(0xc7316941,0x0887a8fb),LL(0xa8bdfe94,0xd925bb03),L_(0x00000187), LL(0x356f89f4,0xde19c8b9),LL(0xeab9cd80,0x77afef27),LL(0xf941390d,0x16f538f8),LL(0x8c79f62a,0x9a2c1a2b),LL(0x84a907ee,0xb7aa5d96),LL(0x9877951e,0xfe7d75aa),LL(0x59fbafe1,0xc17b983b),LL(0xb437db42,0xab1072ba),L_(0x000001c1),
+ LL(0x3a57f7ec,0x4ce56b58),LL(0x1306d958,0xce15377e),LL(0x1e23a49b,0xbad5b26b),LL(0x2d98c317,0xae8b11f4),LL(0xdc523283,0xf50073f0),LL(0xe7af81dd,0xab516099),LL(0x519277c4,0x6a29299e),LL(0x8cb7cfdd,0xf9d5fc0d),L_(0x000000ae), LL(0xad29a85f,0x9213cb42),LL(0x37030b7e,0x364e5e4a),LL(0xf8a54d03,0x771a3941),LL(0xb7d507ec,0xd6f8ad50),LL(0xddb1def4,0xbd493bf4),LL(0xc65eeab3,0x716822a9),LL(0x7e2f6019,0x1d5d463b),LL(0x062fa75d,0x39044728),L_(0x00000094),
+ LL(0x6ebc6aeb,0x755f610d),LL(0x7e269fb2,0xbc7a68af),LL(0x9a7e6748,0x576c91d2),LL(0xaa653529,0x8b42e1e9),LL(0xe03c250b,0x9e921ac8),LL(0xf313cd04,0x500a0736),LL(0x48b57315,0xfbe580a3),LL(0xd15496dd,0xbe103270),L_(0x000000c6), LL(0xe43286f3,0x42537712),LL(0xfad38cc2,0x5ba8dd4a),LL(0xe8e53c49,0x940cf7d8),LL(0x88cb201e,0xe105c906),LL(0x0310db91,0x14eb5137),LL(0xbdf5c752,0x04b87caa),LL(0x73be9996,0x32ce177d),LL(0x545383f4,0xa2679329),L_(0x00000146),
+ LL(0x181fa26f,0xe91dfab4),LL(0x8f94d28e,0x500e4763),LL(0x031df707,0x2cdd284c),LL(0xfc76fd9e,0xb532df91),LL(0xdbbb6032,0x95140af2),LL(0x0796b18c,0x1a08045a),LL(0xf970af5c,0xb920694c),LL(0x325b81c7,0xb373cbe7),L_(0x00000087), LL(0x6128ccb5,0x68880de0),LL(0x2e3ad7bc,0xb9bdf74f),LL(0x769e9e60,0x43ac2084),LL(0x0eb7035f,0x71aa1b0a),LL(0x443fc7a8,0x9b9cb064),LL(0x8d6eb3bc,0xcda0b792),LL(0x35030dfe,0xcc362ccd),LL(0x29fff962,0xda9f8e29),L_(0x0000017c),
+ LL(0x01f40601,0x78cfd6f2),LL(0x993f944b,0x042c6de6),LL(0xe197b472,0x7bbfb051),LL(0xe877f763,0xa554df58),LL(0x82d5094c,0x5d801ed2),LL(0xd75061e2,0x89c183e2),LL(0x060481cf,0xe8a754c6),LL(0x43706037,0x94d020ef),L_(0x00000096), LL(0xc842ce7d,0x1ecea7b9),LL(0x0c3c295e,0xd56a995a),LL(0x2352f8cc,0x2d519fed),LL(0x7a9172aa,0x95d8bcc3),LL(0x546f4f90,0x6b8cea31),LL(0xaeee4bb3,0x3f188de2),LL(0xb3d9fe63,0x63e62bb8),LL(0x9f32b579,0x1d4076c1),L_(0x000000be),
+ LL(0xa42ee214,0xde6a66c4),LL(0x6c6c7d51,0xc1ce9444),LL(0xd2eee21b,0xeaac0d5d),LL(0x8f8f4a8d,0x5914a3e8),LL(0x755296fd,0x6c394520),LL(0xe647dd87,0x3798ebb4),LL(0x696a7a68,0xc9fd6484),LL(0x66ec9d8e,0x1c7ad1d8),L_(0x0000015a), LL(0xf4ca34e1,0x01e46446),LL(0x0fc27507,0x4431e6d9),LL(0x0b310d40,0x9766b761),LL(0xe5199614,0x04e26686),LL(0xae7e80f7,0x4f7efe74),LL(0x9829aa76,0xd9535c6d),LL(0x5702e183,0x755a23c2),LL(0x457bd92a,0x92bf30a0),L_(0x00000040),
+ LL(0xf84e8b92,0xa379a575),LL(0xfe2e00bb,0xf17caafe),LL(0xf713e2fe,0xfca28897),LL(0x56bf2a80,0x484598f6),LL(0x6ed19617,0xda495469),LL(0x3fe63788,0x9a48ed8c),LL(0x32c6923d,0xea4ef749),LL(0xdd905e15,0xc8a6856d),L_(0x00000125), LL(0xa7aa5cfa,0xcd183286),LL(0xb2b44bda,0xf345a8f6),LL(0xb4add52f,0xfc8c57af),LL(0x001d629f,0x9943972a),LL(0x1f5f64d0,0xee2dc970),LL(0xc7523ceb,0x078e50ed),LL(0xa1b8fb92,0x98c1c85f),LL(0x69d2866f,0x12275bf9),L_(0x00000129),
+ LL(0x225d5458,0xae1049c6),LL(0x1f4012ec,0xe45c8c16),LL(0x89c61650,0xe63f6f74),LL(0x97d5ef6b,0x13c990c2),LL(0x7718d93d,0x3b2af534),LL(0x388b9ecf,0xb4a19bd4),LL(0x53cfc179,0xc67cc8de),LL(0xea4e62f5,0xccf5963e),L_(0x00000185), LL(0xd67d72c3,0xa67e3213),LL(0xb4e77b7d,0x2c9d3a3a),LL(0x77d06f89,0x5e517015),LL(0x66b06c1c,0x79e0be47),LL(0x25f78836,0xacaba839),LL(0xf6cdc997,0x60da7988),LL(0x18ee069c,0x75dac3e5),LL(0x028ed009,0x3f7a195d),L_(0x0000014e),
+ LL(0x77706fdb,0xce2d42d6),LL(0x121b5db1,0xbfb3bb0d),LL(0xc38da042,0xcc50a951),LL(0x690091d1,0xe0527354),LL(0xad28eb90,0x6d30c1cf),LL(0x4621b3fa,0x72f783b8),LL(0xecc35c39,0x05168f18),LL(0x7e7054f1,0x744bd75d),L_(0x00000158), LL(0x437313ab,0xe9455bf8),LL(0xe4a7314e,0x131fad1a),LL(0xb8e1f53e,0xd17720a7),LL(0xbbc2ae3a,0x41e60518),LL(0xde92e4d6,0x53833db7),LL(0xd91c6976,0xa3c1ec67),LL(0x002fce6d,0x353e4fb8),LL(0xf35678d9,0x008548f1),L_(0x0000003d),
+ LL(0xe8b6d7a1,0xfb16d9c1),LL(0x2d6fbafd,0x4603abda),LL(0xc1c342fe,0xc3174b01),LL(0xf763e29a,0x6ef24fdc),LL(0x081c9b95,0x6ff0c881),LL(0xadc9659b,0xc6c4ce5a),LL(0xb4df1c4c,0x1e8123e9),LL(0x9a4d9154,0xaa2cc087),L_(0x00000047), LL(0x08513662,0x1126c683),LL(0x7efb0353,0xe6d3af24),LL(0x506609c7,0x31b758c2),LL(0x8f74142c,0x5c5f34e5),LL(0x0a3e4fdd,0x3f4b19a6),LL(0xe42c81b5,0xf8223898),LL(0x57c04ea3,0x21041b37),LL(0x44625a29,0x52ac9b84),L_(0x000000ea),
+ LL(0xafb45817,0x273a1b81),LL(0xe782c707,0x122cfd64),LL(0xf60341eb,0x55516c45),LL(0x19dc551b,0x646dbbd6),LL(0x33015a2f,0xc8d289cb),LL(0x1e2ea096,0x01dbc5f5),LL(0x04e60127,0xb40b7fdc),LL(0xaa434764,0xd6732b6e),L_(0x0000008d), LL(0x3cf9666a,0x4a435c55),LL(0xd7f50159,0xa122c995),LL(0xfe948450,0x52defdfc),LL(0xb5bd3afb,0x272ef1f4),LL(0x702b6fc2,0x86c9c7cf),LL(0x578c41a5,0xce279630),LL(0xafedf374,0x57fd35a9),LL(0xdd29b0d6,0x359e1bc5),L_(0x0000016b),
+ LL(0x8c313c96,0x81430d8f),LL(0xb3ef9728,0x10f97c7d),LL(0x57ddefb8,0x07066ad1),LL(0xca00506e,0x586f421c),LL(0xdaf65ab2,0x2bf4f170),LL(0x2f754fdd,0xf2415152),LL(0x88f0654f,0x18776438),LL(0x5393b3f2,0xad67f2ff),L_(0x00000150), LL(0x560341d5,0xd6250f20),LL(0xce99e680,0x4c66a708),LL(0xd56bd29f,0x440c3774),LL(0x8b248864,0x9f32acf5),LL(0xad54b8ec,0x99d6dad5),LL(0x45a78e51,0xedbfc6a1),LL(0xa505dcaa,0x28bf41f3),LL(0x8a48ad87,0xae2d610a),L_(0x000000c3),
+ LL(0x548d3329,0x8505c5bc),LL(0x76050884,0x4dfc2894),LL(0x6b686f2c,0x1e02d4a1),LL(0x9d97a4c0,0x2a447f5a),LL(0x5475b435,0xc828b6cc),LL(0xd2791aa0,0xe6e9d956),LL(0x3b328dfd,0x69ef6cbe),LL(0x988497f9,0xd58525b0),L_(0x000000b4), LL(0x628f0906,0x503dd445),LL(0xc52d4b69,0xdd2f1758),LL(0x438796f6,0x16280d32),LL(0xce2abc46,0x2fb22aa7),LL(0xbdfd0070,0xa5833469),LL(0xd5120c6e,0x80d303f0),LL(0x047308c9,0xd719acb8),LL(0x2a731dfc,0x1df4d436),L_(0x000001be),
+ LL(0xfb9cf085,0xff178cc9),LL(0x717cdc0a,0xcd1f6670),LL(0x8870fa8c,0xc4d58854),LL(0x99c44c6b,0xd627431a),LL(0xd7a4c31e,0x552f232d),LL(0x85daf88c,0x940140f0),LL(0x1d886818,0x9aa8211a),LL(0x16e4c1b0,0x985e3412),L_(0x00000004), LL(0x4b6cac59,0x3374279c),LL(0xc878a0ba,0x8991eda2),LL(0x84ea0b3f,0x32e3b4cf),LL(0x5e729a39,0xcc5f3102),LL(0xd47222c0,0xb4346c5b),LL(0xc5c9ba94,0x2995032e),LL(0x41a4babe,0x7ddb493f),LL(0x7b6e042b,0x862b224e),L_(0x000001cd),
+},
+/* digit=34 base_pwr=2^170 */
+{
+ LL(0xfe921c0f,0x079475b7),LL(0x410ea1a2,0xea0fd52e),LL(0x77d4bbcb,0x212e44af),LL(0x260a54b0,0xc66a7d1f),LL(0x4269af2e,0x4993bda8),LL(0xd04f3479,0x0b15e358),LL(0x0bdfadc5,0x1c67a4d3),LL(0x2250ea3d,0x4f317e91),L_(0x00000130), LL(0x2783de4f,0xfb63579e),LL(0xd5ac84fd,0x1abe0cba),LL(0x4b8a145c,0x84082001),LL(0x5d987c51,0xcfadaba8),LL(0xd9eba9aa,0xf5fccfd5),LL(0x82de291a,0x85e551a9),LL(0x372c4557,0x5e2bcee4),LL(0x9d89842d,0x7d7f549c),L_(0x000001cf),
+ LL(0xd17b0f39,0x5ae74e03),LL(0xb17b1a43,0xfbdcdaf3),LL(0xe5084910,0x63c90868),LL(0x9102285b,0xd8e63c01),LL(0xd5454d88,0x80d185fe),LL(0x50f99e23,0xf9e19dfe),LL(0xce8d3eba,0x728e09d7),LL(0x51277498,0x1de72015),L_(0x00000011), LL(0x777fda1b,0x7188feeb),LL(0xf597fdfd,0x6801e0f6),LL(0x29652f82,0x252e9d17),LL(0x58dec034,0xc6aa0c9d),LL(0x43cc68d0,0x6779b37e),LL(0x9c62a4e7,0x8d509f56),LL(0x0558ca70,0xd90c4133),LL(0x56b5657b,0x3de96569),L_(0x00000006),
+ LL(0x9ea07210,0xa60d5a9b),LL(0xe0116982,0xb1b1d6d6),LL(0x275ea7bc,0x7f932848),LL(0x607da14c,0x3af5ede1),LL(0x931400f1,0x03040c84),LL(0x3c889175,0x6c5973c9),LL(0xe7a0f614,0x293b333f),LL(0x5267024f,0xfd3993bc),L_(0x00000111), LL(0x81f51a89,0x99b337fa),LL(0xc1ab5f24,0x9bde774a),LL(0x5f059cb6,0x070a9fc0),LL(0xdd8da34f,0x8499182e),LL(0x7e9ea166,0x829389a7),LL(0xaf460691,0x5d843a97),LL(0x6edc8515,0xf45adbcb),LL(0x1fe7439d,0x998d92a0),L_(0x00000006),
+ LL(0x8e9008a5,0x241f1037),LL(0x92193f76,0x4e7ecf00),LL(0xf8905d70,0x28097f48),LL(0x6b4870ad,0x389acac8),LL(0x2f86eb6f,0xc3b9a313),LL(0xfe5a3ffb,0x9c6b9598),LL(0x14fb463a,0x2f429f10),LL(0x40890855,0x26f84e06),L_(0x000000ad), LL(0x530c94ae,0xd0399afa),LL(0xac70ca6d,0x7da5ef17),LL(0x854eb299,0xe2c80b49),LL(0x4afd62b1,0x77d7cf10),LL(0xf0b13757,0xb8dbecfe),LL(0xdfbd794d,0xf21b1b05),LL(0x47404dbf,0x96f1e68e),LL(0x28abdaf2,0x049bd809),L_(0x00000082),
+ LL(0xe27f7207,0xf97a3f2a),LL(0x787c8ad9,0xd2383086),LL(0x5dd8b1e6,0xfa851816),LL(0x13c110cb,0x0056cac9),LL(0xffc6bc3c,0xca2b8de4),LL(0x9e086187,0xd596553e),LL(0x4495145a,0xa323bbac),LL(0x799ae6f9,0x259cbe64),L_(0x000001f6), LL(0x53c95598,0x813fad43),LL(0x8941d128,0xee24f158),LL(0x81fe1387,0x7ca3f8b2),LL(0xec9a8f90,0xf4bc106e),LL(0x14a7e155,0x9b049dce),LL(0xacb41c88,0xf8e36863),LL(0x1985dcc1,0xc3075358),LL(0xa78ad338,0x5bf6eb17),L_(0x00000015),
+ LL(0x764f13da,0x1663cb94),LL(0xef025b32,0xdbea0296),LL(0xc7c10036,0x846d4ce1),LL(0xa4ebe01c,0xdcd331ba),LL(0x36bdd387,0x165ca514),LL(0xbf0ef724,0x1500e9b6),LL(0xf3d31456,0x2e001ed2),LL(0x0726f097,0x03718369),L_(0x00000050), LL(0x8451ea7f,0x6ab1aeac),LL(0x04486599,0x2c2e44e3),LL(0x2f540159,0x22a4d1df),LL(0x2edd9124,0x1b2aa406),LL(0x2d29f8fe,0x3d860387),LL(0xaed1f58f,0x2d78d5df),LL(0xbde871a5,0x65a5c46d),LL(0x6c0a2f54,0xde41cdf5),L_(0x00000189),
+ LL(0xbc829d92,0xb48b90b7),LL(0x41e85ef8,0x52345df2),LL(0xdc154eba,0x0472e3d9),LL(0xf8b4b2db,0x59486c6e),LL(0xd8c1f468,0x2a84dd3b),LL(0x1d593d50,0xdf33e197),LL(0x775fa504,0x0cadf964),LL(0xa92cc156,0x9927b85b),L_(0x00000083), LL(0x6a0487ca,0xfc3c5102),LL(0x03084458,0x9fa6a745),LL(0xcfa05014,0x51d7c6b7),LL(0x8f18942a,0x8c314152),LL(0x2258ef9c,0x789bb4fe),LL(0x5dcef195,0x1bcd3685),LL(0x2b822a02,0x4e898c2f),LL(0xbded6e36,0x9c74bcf9),L_(0x000001c6),
+ LL(0xaa163689,0x5ab01bff),LL(0x58bf7fb7,0xba4b1f3e),LL(0x50bc67e3,0xe8b59cab),LL(0xcea4689c,0x0d30cf8a),LL(0xaf1932a3,0xb3d1d8ed),LL(0x92c06e5c,0xfa7949e4),LL(0xb16d8b25,0x6f41db2d),LL(0x10d851b9,0xe9a23b06),L_(0x00000117), LL(0xb154a2b3,0x96d36fe2),LL(0x09d47ca1,0x766e2a61),LL(0xf1863dba,0xa8ef9263),LL(0xe92b5a5b,0xa5da163b),LL(0xcaad9918,0x520c8298),LL(0xf5e79189,0x0a27963a),LL(0x4ab05f91,0x20b8c3b8),LL(0xfd0103c4,0xced227ba),L_(0x000000cc),
+ LL(0xdd063123,0xa94faf37),LL(0x027545cc,0x751ad636),LL(0x5633398c,0xe2af69a4),LL(0xdb3a42f8,0x9980ca80),LL(0x3ef70c7f,0x2f9f4827),LL(0x03c8083d,0x4bd7694f),LL(0x2297619a,0xcba6106f),LL(0xb857e944,0x5d665130),L_(0x00000068), LL(0xed99704a,0x9b54a475),LL(0xd04dd3a0,0x45640d66),LL(0xe5bc76a8,0xb7f7aff6),LL(0xffcfd663,0x7c51db6e),LL(0x1b1b7d77,0x4ab9daa0),LL(0x312b124a,0xd1e4a043),LL(0xa2044f37,0x1147cf83),LL(0xc70b0257,0x3b2bed84),L_(0x000000bd),
+ LL(0x240110f2,0x7cc2f02a),LL(0xebf0be7a,0x2ac9b5c2),LL(0x24af14f6,0x9a211862),LL(0x782fa4b4,0x50410353),LL(0xf137e0ec,0x1b26ae96),LL(0x241ccb89,0x2cdf1d3c),LL(0x2b213449,0xac6249df),LL(0x063b93cd,0xae3ea116),L_(0x000001e7), LL(0x243cd7a1,0xf821c5c8),LL(0xd3358ef9,0x1dea9bcc),LL(0x06149e77,0x744a2dd7),LL(0x76a25a6f,0x510fe3ad),LL(0x126f991b,0x2bff6928),LL(0x9ff56b6f,0x26743e80),LL(0xb7342a0d,0x75a539a6),LL(0x1e395f1d,0xade39b8f),L_(0x00000039),
+ LL(0xc5b17046,0x6c3972f8),LL(0x30453d81,0xa45c6e8c),LL(0xf914e1ed,0x3fd2d983),LL(0x8df9d87a,0x465d7bda),LL(0x0b35e4f5,0x6fe2ce33),LL(0xd6b328dc,0x54ed3799),LL(0xfe08ef94,0x7a45c9eb),LL(0x18e443cd,0xf274d81a),L_(0x000000d6), LL(0x785e8d35,0x203318e2),LL(0x5c35d7f0,0x7b61a2b1),LL(0x652767b2,0x861e2602),LL(0x830e75ba,0x44dc9f10),LL(0x31d6ffa6,0x2ba2cf1f),LL(0x61cf1408,0x6ea5aa79),LL(0x8a5f9d9e,0xc5f5c401),LL(0x983aa3d8,0xa970331d),L_(0x000001d7),
+ LL(0xaae3e45f,0xebb6d11c),LL(0x08fdeeb8,0x0f274ee5),LL(0x562c576b,0xee620c83),LL(0x10e47bae,0x88c57185),LL(0x279b8105,0x919ff42e),LL(0x927c894a,0x7edf259b),LL(0x23100a00,0x169d16a2),LL(0x2acb9ccb,0xe6d07a5b),L_(0x0000011a), LL(0xfee8415a,0x94d74f07),LL(0xcacca4b5,0x4fb6e0e5),LL(0x08cc549b,0x08e788b7),LL(0xc62edae5,0xc2847dc0),LL(0x9b9ef886,0x64c8eee6),LL(0x9deee406,0xed24b57a),LL(0xa5474323,0xca2b9d44),LL(0x16f12261,0xf3a0da6f),L_(0x00000122),
+ LL(0x7ec4af3a,0x1798ff0a),LL(0x06583190,0xce45de42),LL(0xa85d801e,0x661ec8ee),LL(0xe6f87169,0x12391657),LL(0xa304ed8e,0x70c4e172),LL(0x8bed9dc1,0xd437a386),LL(0xa1738ce7,0xd75a62c8),LL(0xfe484c38,0x91a53279),L_(0x000000bc), LL(0x9f0ace8e,0xb886c429),LL(0x274adb1a,0x61800342),LL(0x733bc7ba,0x05688d04),LL(0xe49410a8,0x9d06b25e),LL(0x1965c8e7,0x2b710949),LL(0xad70d74f,0x3d588ffa),LL(0x3d3fbe49,0x7220b560),LL(0xe246db1c,0x9e8e9616),L_(0x0000006e),
+ LL(0x8d34890c,0x59239eaf),LL(0x15030568,0x6578691d),LL(0xd8dd39f6,0xcb5a2489),LL(0x121c7f85,0xf808f7b5),LL(0x952a8bc8,0x99daec7f),LL(0x84b94629,0xd8fb611d),LL(0xbad11517,0xcd32215c),LL(0x967dfc54,0x781070b7),L_(0x000001fe), LL(0x4a7b1ca7,0x3e19d6b8),LL(0x4aecc72b,0xc71b44ff),LL(0xa89c3596,0xc6ae9705),LL(0x99c2157d,0x4697a093),LL(0x95d8264e,0xd6e1d1c0),LL(0x6704d656,0x1e3c6190),LL(0xc7b65104,0x91499ef5),LL(0x466ffc24,0x879387d1),L_(0x00000177),
+ LL(0x9b81bb10,0x3ae92664),LL(0x35d0ee3c,0xc1f7e1a2),LL(0x20c5e62f,0x8f740935),LL(0xb7936d32,0x451ab7a1),LL(0xc573c20c,0x126bba09),LL(0x3152bb2a,0xa66454b3),LL(0xb17e342e,0x784051fe),LL(0x3681b560,0x1536e827),L_(0x000000a8), LL(0x8f5b18c5,0xcc09f617),LL(0x6e34c103,0x22747cab),LL(0xf8a96755,0xde36110e),LL(0x4dcfc108,0x67ee6834),LL(0x342676fc,0x8502fdf2),LL(0x5b48ae34,0x3b4a1019),LL(0x85dba2fb,0x75c0d58b),LL(0xda298efd,0xb34a8e88),L_(0x0000011f),
+ LL(0x335496bc,0xd3205850),LL(0x88067d33,0xcf402bd3),LL(0x0074be0b,0x2913e673),LL(0xe8db4e94,0x62a0cb43),LL(0xcf7beef4,0x8c2ead81),LL(0xf06de58a,0x97eccd5d),LL(0x501f23bb,0x1d5954e3),LL(0xa8b8e4e1,0xcdca24b4),L_(0x00000085), LL(0x1d598c1e,0xbf9648fc),LL(0x9987cb09,0xd224f8ad),LL(0xd88fba1f,0x60665a60),LL(0xd86a1d9f,0xf1e7f754),LL(0x26c4ad1d,0x4acf77f7),LL(0x7713e1da,0x938971a2),LL(0x0f78da10,0x3b7fc94e),LL(0x92811d7d,0xbb436839),L_(0x00000004),
+},
+/* digit=35 base_pwr=2^175 */
+{
+ LL(0x5c665e2b,0x4232c5cb),LL(0x9a24517e,0x26232f5f),LL(0x5981cd79,0x0a27a027),LL(0xe253d4d8,0x783b1d5a),LL(0xd6c00bb7,0x89b5ab0b),LL(0x40ea4c25,0x6c48caf7),LL(0xfc5351cf,0xa482e177),LL(0x2b0e714b,0xb60940fd),L_(0x0000017f), LL(0x8552b5ad,0x11881ba7),LL(0xfb2067a3,0x4ccac10c),LL(0x5d449097,0x9013dcbe),LL(0x8873accd,0xb2cf2a8b),LL(0x380d70e5,0x2c281733),LL(0x4631440b,0x7c3b711d),LL(0x3747bc66,0xd6b99662),LL(0x423c70b2,0x8e7bb383),L_(0x000000d5),
+ LL(0xa8b11d17,0x2eed227f),LL(0x7fd9a16c,0x916842cb),LL(0xe12a5d02,0x6758564c),LL(0xe59ed474,0x4b48f9be),LL(0x8e675f35,0xece126be),LL(0xf7c75d69,0x8ce3aca2),LL(0x00f88d21,0x9a768d60),LL(0x26ea6ff2,0xb90d290f),L_(0x00000113), LL(0x5d96ef4c,0xa0efb2f0),LL(0xac3a2f2d,0xa99dc276),LL(0x757c443d,0x23ce0342),LL(0x390d2a5e,0x9b674e3b),LL(0x7e7ea78e,0x32e72b98),LL(0xdca485e1,0xb6c21856),LL(0xda17d0d6,0xee5bed8c),LL(0x220788bd,0x3c4e1237),L_(0x000001cd),
+ LL(0x2333e9ce,0x1a6d9a86),LL(0xaadfe3f4,0x56277e4f),LL(0x389e2b48,0xc71ed641),LL(0x5717d1e3,0x5f0642b9),LL(0x56053a56,0x042b6345),LL(0xafc491b1,0x5ee182db),LL(0x9a47e510,0x6ccadf49),LL(0xf6da1632,0x3b09fd0e),L_(0x00000044), LL(0x05064c02,0x708a5ae7),LL(0xd681e121,0x3b41c0e8),LL(0xcbc4f74a,0xe5968e75),LL(0x47ee9e3e,0x6b8f739b),LL(0xe232789d,0xcd2e53fe),LL(0xd5500a30,0xde9e78f3),LL(0x2cad3174,0x4522aa08),LL(0x295cf494,0x7b02adf4),L_(0x0000007a),
+ LL(0x0e236499,0x8d70cd44),LL(0x61afc7ec,0xd8467c51),LL(0x4c9aa882,0xbc140872),LL(0x62a215cb,0xad6d3cb9),LL(0x6c4986c1,0x912aaf7a),LL(0x83691332,0x6db2702d),LL(0x7d4a1ecd,0x3fa17e01),LL(0xbf2405e9,0x44b4cf2d),L_(0x000000d9), LL(0x8a064116,0xe42ae3e6),LL(0x395b06fc,0x39938713),LL(0x5bb1098f,0xca3394a1),LL(0x97734c1b,0xe8c0bedb),LL(0x1edfc62a,0x9b0452cb),LL(0xc661bc2f,0x04c79c90),LL(0xe6253323,0x2a0dada4),LL(0x2e4ae434,0x218bc6fc),L_(0x00000101),
+ LL(0xd1cc1e71,0x144c819c),LL(0x6629502b,0xbd39770d),LL(0x8c2f7831,0xe5075a30),LL(0x4ec45cef,0x641b65dd),LL(0xa56294ef,0xe6aa4eb3),LL(0x75854d3b,0xbdb743c7),LL(0x3fdd169d,0x5176a409),LL(0x181ac2e1,0x0bd27e3a),L_(0x000000a2), LL(0x0ec035b9,0x3f057fe2),LL(0xa4b87bdc,0x3feadb94),LL(0xf7f87024,0x5db56992),LL(0x6a6cdc10,0x57cd02da),LL(0xdd69ecb6,0xc54a8f0e),LL(0xe1da3c2e,0x10cf592f),LL(0x8fe5cc2e,0x3b4989f2),LL(0x37d88e4b,0xe43fe00f),L_(0x00000135),
+ LL(0xb01bd7fc,0xb25b337f),LL(0xe1e660dd,0xac5d025a),LL(0x6a73c379,0xb69c2605),LL(0xdede6af2,0xb7e81b95),LL(0xa1ae9121,0x6cd030d2),LL(0x5f7f754f,0xb47d1e9a),LL(0xc9b7c0f8,0xe925d238),LL(0xd6fa902c,0xc4a56d32),L_(0x0000002a), LL(0xf95ace42,0x6ab6a655),LL(0x709a356f,0x8fa78d47),LL(0x9d32f258,0xc583f5d3),LL(0xab0a90b8,0x5d68b6be),LL(0x8bc51799,0xcae9d65d),LL(0x4a80ea4a,0xd569fb10),LL(0x2cb3b12f,0x67b09db0),LL(0x4b3e1e5f,0x28308c62),L_(0x0000007b),
+ LL(0xf5df84a6,0xcdd9e65f),LL(0xf9cc5322,0x1ae57f11),LL(0x997b8e3d,0x4ec38b17),LL(0x52bddbee,0x99728cf4),LL(0x3daa3db0,0xc592cfa0),LL(0xe99b31ff,0x0d3ad893),LL(0x71adf8f6,0x21a14a01),LL(0x748065a6,0x7604c00e),L_(0x0000008a), LL(0x313c6b68,0x45073a51),LL(0x4026740f,0xe3c1a79a),LL(0x03ea00aa,0x7f5aaba8),LL(0xae0bdab5,0x1d349675),LL(0x81ecbbfd,0x611cda3e),LL(0x62377d6e,0xc226bbb5),LL(0x4eee5f15,0xf8b5d257),LL(0x8afee162,0x44124202),L_(0x0000010a),
+ LL(0x1e93cbca,0x14655922),LL(0x200324a2,0x6c357ebc),LL(0xfbe29569,0x537e73da),LL(0xf1c77b70,0x59d41573),LL(0x12b0a8e9,0xc50a71dc),LL(0xd18455d9,0x7c9b3656),LL(0x7fcbc173,0xd9283b61),LL(0x6acf8093,0x9416c097),L_(0x000000db), LL(0xfa8b5737,0xf0027024),LL(0x3b38a173,0x386bfccf),LL(0xbbc99c54,0xbdb95480),LL(0x8bfbf241,0xcc88d566),LL(0x8353dffb,0x7968e885),LL(0xaa2a216b,0xe22f661f),LL(0xf0cc373d,0x0c189437),LL(0x5601679c,0x68e69c1f),L_(0x0000002b),
+ LL(0xb1e74cee,0x969661a7),LL(0x9719c192,0x390ae167),LL(0x76ffd55a,0xe6fc4921),LL(0x17827dab,0xb57cd8f2),LL(0x4435c383,0x16123417),LL(0x1dcf73d3,0x8d4cffd7),LL(0x0c91ecfd,0xe6e70928),LL(0x8412502a,0x82f5ef71),L_(0x0000012b), LL(0x019a0e1b,0xecf807dc),LL(0xfb488f96,0x6c466766),LL(0xedde1e48,0x756a682c),LL(0x37d6152f,0x2661ee25),LL(0x5b6f467e,0x96e2b2d4),LL(0xb97a8d49,0x1c1589d1),LL(0xbcf05602,0xdf83ce24),LL(0x04b7cee0,0xda686197),L_(0x0000000c),
+ LL(0xfca86967,0x34e40148),LL(0xfa3981f6,0x1c864ffb),LL(0x42879632,0x5079d6d1),LL(0x3e4b6047,0x9eef5744),LL(0x6e1e5a87,0xfd7f7f13),LL(0x38d5d2b8,0x19b63788),LL(0x1c2726dd,0xc17815ed),LL(0xf17abcb4,0x58a0242e),L_(0x00000030), LL(0x7bb9a599,0x40e55822),LL(0x3d146be1,0x7f28ae92),LL(0x8852f582,0x8cdd00a5),LL(0x60ada16c,0x7def110e),LL(0x8158a85a,0x1d1152d2),LL(0xa55ae5c6,0x4be61bf1),LL(0x0a31606d,0x8fcf413c),LL(0xd625cdfd,0x2b64bb3c),L_(0x00000131),
+ LL(0x6c3d008c,0xd11d6fc4),LL(0x0786f8b9,0x26066afc),LL(0x6f28cd76,0x6a57afc2),LL(0x9d41e208,0x2ed8fbfb),LL(0x32ce6027,0xda94edc4),LL(0xf08d764b,0x94110774),LL(0xd4093a46,0x8526b334),LL(0x084fdb6f,0x41d9b8a0),L_(0x0000002d), LL(0x652dbbe1,0x75164543),LL(0x605ecb71,0x6687cd0a),LL(0x3962a1b6,0xfe7869a3),LL(0x347a147b,0x1cab34bd),LL(0x634a95b8,0xbb85dfab),LL(0xbfeffee8,0x4995b282),LL(0xf245a753,0x69b18723),LL(0x5d6e7794,0x653a65a4),L_(0x000001cd),
+ LL(0x643f2f8c,0xcd45c4a5),LL(0x24a0afd5,0xa6b24112),LL(0x2258c4c8,0xfa87a5ca),LL(0x8f855fed,0x3975cb67),LL(0xc55199f4,0x9edc6298),LL(0x5a48e9a3,0x7312684e),LL(0xf55daba0,0xbfadaeb9),LL(0xc9f5f377,0xc404fb39),L_(0x00000199), LL(0x5a3e0968,0xc70ffd11),LL(0xfcccb869,0xba001f2a),LL(0xfe8068fd,0x124107bd),LL(0x06868f7c,0x28b9fe02),LL(0x3821a909,0x33728dac),LL(0xac94afc5,0x3e9edff0),LL(0x7f67565b,0x0bd10c69),LL(0x250773ba,0x54f9dbea),L_(0x00000070),
+ LL(0x70ff7fb7,0xad0ad081),LL(0x7b1f1709,0x88afd9fd),LL(0x2c52599e,0xa4b49d9d),LL(0x58896d4a,0x6df73899),LL(0x001961cd,0x1c7f535c),LL(0xd4c3ed4d,0x75c903a7),LL(0x4c699591,0xab8339d4),LL(0x939fc682,0xa4d28226),L_(0x0000016d), LL(0x921bc00d,0xe64a70d3),LL(0x0644b2c5,0xb7245016),LL(0x4fad690f,0x8e863833),LL(0x52268bfe,0xcab84fe2),LL(0xc76f784d,0x75b08768),LL(0xbd5df903,0x97114157),LL(0x49a7a2a6,0x5dbab306),LL(0xb4ae419a,0x15ea0320),L_(0x000001eb),
+ LL(0x24275a2c,0xc241f782),LL(0xba60fbb4,0xc4fd93b4),LL(0x616268c1,0x0872941b),LL(0x107f7964,0x25e04f20),LL(0x831b4388,0x7786625f),LL(0xc5f61924,0x8de20083),LL(0x791c6d52,0xb0abde39),LL(0x75c25ecf,0x22801b3b),L_(0x0000011f), LL(0xb58e09f4,0x4c6bc5ce),LL(0xb3112937,0x38e27941),LL(0xcee2666e,0xca0e3235),LL(0x8dbee896,0x9b498dea),LL(0x53066000,0x0f289764),LL(0x58ff5f8f,0xfb5ee444),LL(0xa7b5e140,0xf9fb559a),LL(0xac85e138,0x3b186272),L_(0x000000f7),
+ LL(0x0d7ebeca,0x20feaf54),LL(0x19cc13ae,0x3c5c75ec),LL(0x38ba79ba,0x78f3f1f0),LL(0xf2dc8803,0x911501c4),LL(0x8fb64807,0x6448cf01),LL(0xa8bff66a,0x206b2cb4),LL(0xce9b312c,0x195342ba),LL(0x219fa1d7,0x26a20ccd),L_(0x00000180), LL(0xe91053ed,0x41af0398),LL(0xadc91c1f,0x6166dc26),LL(0x5d9c3eef,0x055887cd),LL(0x90ea6dfd,0x3d270166),LL(0xa4280b95,0x206854af),LL(0x7b358dc6,0xa6ae166a),LL(0x03623eb4,0x34af3892),LL(0xe4258201,0x02a9b53b),L_(0x00000143),
+ LL(0xbb9f0c61,0x99256667),LL(0x3489213e,0x27fdbbfc),LL(0x1218ca33,0x5630d2c7),LL(0x5a83f00e,0xbdc8df91),LL(0x0d628331,0x28ee96b8),LL(0xbfe73e81,0x6a5f7e06),LL(0x2a7cd331,0xdd16364a),LL(0x8cd2a08b,0x20b4bc74),L_(0x00000127), LL(0x221d90fa,0x814ecb88),LL(0x8b5df20c,0x00fc7920),LL(0x76343a10,0xc99f2520),LL(0x14b68032,0x71413b8a),LL(0x654fe0dc,0x9a173cb4),LL(0xa9acd97c,0x85a386e9),LL(0x14a40bfc,0x87bf160a),LL(0x849e9970,0xa7001032),L_(0x000000a3),
+},
+/* digit=36 base_pwr=2^180 */
+{
+ LL(0x77384b0d,0x16c289b4),LL(0xf9601e0c,0x9eabe48c),LL(0x71ddca51,0xb3f199d6),LL(0x3fce7863,0xa3ecba6f),LL(0x2e01be3e,0x67c58c7d),LL(0xfbf4b701,0x4893679a),LL(0x2cb78d1f,0xe019a436),LL(0x15a3d7fe,0xff764615),L_(0x00000185), LL(0x25f2840f,0x160c51fc),LL(0x516e72ef,0x97156a16),LL(0xd9625db3,0xbf6e8398),LL(0x3f5b2c0e,0x651404d6),LL(0xfc5b6523,0xd10c4d87),LL(0x8eef476d,0xf40ffa31),LL(0xe5d39771,0xe3788025),LL(0x98fa2547,0xdce443c2),L_(0x000000e8),
+ LL(0xb2523e81,0x8e050759),LL(0x42659aef,0xb0377d50),LL(0x2b36823c,0x419b9ae7),LL(0xff957169,0xf46fc17e),LL(0x59705ceb,0xb61ce7ad),LL(0x2fffbd18,0xa7135b60),LL(0xfe9192a7,0x96f2e092),LL(0x30a3a8e5,0x14c4a74d),L_(0x000000cb), LL(0x667c895e,0x3da48897),LL(0xeb732652,0x467afe86),LL(0x5b7a7cf8,0x393a5ee2),LL(0xf2568e46,0xb15dd000),LL(0xb79a3304,0x203f1569),LL(0xd91a36bd,0xa5e938c0),LL(0x1a346459,0x521da127),LL(0x88c575bf,0x2cea24c6),L_(0x0000015b),
+ LL(0xc8c62a6b,0xeaef0121),LL(0x98cc53c0,0x58d73540),LL(0x925273a9,0xc04448cc),LL(0x73c56bf4,0xc52be46f),LL(0x542b800b,0x39147d47),LL(0x30298d6b,0x44cb5cfe),LL(0xb2312e04,0x9ed4247f),LL(0x4c4d89dd,0x77e09705),L_(0x000000c6), LL(0x460edd6a,0xed4f4d5b),LL(0x9206a582,0xb9ca6130),LL(0x3e18c6dd,0xa3efafa9),LL(0xa68f9bb8,0xb2d783bd),LL(0xb70a52c8,0xc0dda564),LL(0xdbe47728,0x0dc789e7),LL(0xe8a6481c,0xe4119aa3),LL(0x27f421a4,0x522c7bed),L_(0x0000012f),
+ LL(0xf301ee13,0x055dadf3),LL(0xd3d6ab94,0x8803374b),LL(0xa078817f,0xc730e431),LL(0xe1298465,0xaae8170a),LL(0xba08da98,0x8b779119),LL(0xf12876bc,0x1b8f7410),LL(0xbe46247c,0x67bc98dc),LL(0x18059808,0x0a103176),L_(0x00000068), LL(0xf59de67d,0xd0125b70),LL(0x1682d3d2,0x8c5ad3a0),LL(0x9c7c1b26,0x62fcf59a),LL(0xa095cf63,0x6482c8ad),LL(0x5b79b1ed,0xc253c84e),LL(0xd6952b3b,0x56917d1d),LL(0xdfad9c37,0x5c8f439f),LL(0xa63232aa,0xb95c4651),L_(0x00000156),
+ LL(0x1f3a0552,0x620ca4b5),LL(0x48133bce,0x765c9fcc),LL(0x710e23a7,0x7a6387e5),LL(0xd9c29479,0xa6621b41),LL(0x9fe4eedd,0x3bf9d9ac),LL(0x5df19f73,0x4cb8a304),LL(0x4f51d70e,0x45d5c96c),LL(0x25c50ad2,0xc3e2641a),L_(0x000000eb), LL(0xb3acd866,0x4b6a5c45),LL(0x9f7d19bc,0x3f85a2b0),LL(0x0758494b,0xd50f6942),LL(0x554c9337,0x40c2407e),LL(0x0ccb9c2f,0xc5dfc1a6),LL(0x11e7e482,0x6ad44e8b),LL(0x0fea5311,0xedd080e6),LL(0x9fd549f4,0x409ed188),L_(0x0000010f),
+ LL(0x7e7e29c5,0x2b2e558b),LL(0x3e6bc46b,0x4702314f),LL(0x56eeaa30,0x06726fae),LL(0x5ca44a1b,0x2ee6f214),LL(0x0ea8da79,0x829cf968),LL(0x141e7e4c,0x723cb279),LL(0x45b326cd,0xdac514c6),LL(0x5e8e8931,0xb9bb3b3d),L_(0x000001de), LL(0x61e5ed08,0x4a34e74e),LL(0x83644940,0xe1d4a984),LL(0x1f65c56b,0x3e5f4500),LL(0x062ee718,0xaa764b8e),LL(0x6a39ef75,0x9012ed64),LL(0xbddef450,0x42837f0e),LL(0xfaa786a7,0xf89ab588),LL(0x474accf0,0x7a91f8d7),L_(0x000000c5),
+ LL(0x1ef31aa7,0x70683b34),LL(0x5ed33b5f,0x2190eb5f),LL(0xf3278604,0x8f6e3b2b),LL(0xdb29e400,0xc911a62c),LL(0xd42f0700,0x688f5189),LL(0x7efff5e3,0xc2de5c25),LL(0xe2d46677,0x6189c193),LL(0x5de47c98,0xa4dc1cca),L_(0x0000015b), LL(0xa7dddac1,0xcaddccac),LL(0xcf555803,0x0778df17),LL(0x5faf93e7,0xb029278c),LL(0x7cfbb523,0xa7546c0e),LL(0x33ef004b,0xd52d052d),LL(0xc8957290,0x54a34c36),LL(0xcc555faf,0xa3e1b89d),LL(0x77136cbc,0x07995587),L_(0x00000007),
+ LL(0x4760b5ef,0x30fe1ead),LL(0xd1479bf4,0x3a480e70),LL(0xba684ec7,0x54c97c0a),LL(0x99909719,0xd306cb54),LL(0xea1c5645,0xcc5c264c),LL(0x3d9ecc85,0x39efac32),LL(0x465cbfa7,0xe63b20c4),LL(0xe9cad749,0x41d04b4e),L_(0x000000d8), LL(0x13242934,0x860bc182),LL(0x41b298a9,0x7a452bdb),LL(0x51ceda44,0x0786c3f6),LL(0x53ca2965,0x7845a5f1),LL(0x7e0cd8cc,0x5913baf8),LL(0x060bc9cd,0x0312de2e),LL(0x79bfb315,0xf7a14442),LL(0xa16f8265,0x104fcff8),L_(0x00000101),
+ LL(0x350ffc55,0xd2d93315),LL(0xecd8b90d,0x88f5e22f),LL(0x9eccd42a,0xdc1f662e),LL(0xc4f29c7e,0x42b4d8d9),LL(0x4f6798fc,0xe485f1a4),LL(0x46c699bd,0x6c52567f),LL(0xf81e6fde,0xccefcbe0),LL(0xcd5234c4,0xb5f3a75d),L_(0x00000147), LL(0xc73f9043,0x8ce6bb52),LL(0xbdeaccaa,0x746080b0),LL(0x3424a5b8,0x0eee571d),LL(0x785554a3,0x4bc343de),LL(0x6aadb674,0x44652a58),LL(0x2ff3c998,0x5fd0a875),LL(0x84f6f7fc,0xba89cfbf),LL(0xd08e7a6f,0x3566a002),L_(0x00000104),
+ LL(0x533b8a60,0x3e2d62d2),LL(0xda0545e5,0x476d9e76),LL(0xb53693d1,0x8749ddb7),LL(0x78864741,0x6623b715),LL(0x737a1960,0xb1899ac7),LL(0xf216ba69,0x057f8862),LL(0xb25babc9,0xcb288274),LL(0x927aa4d0,0xa7dcbe28),L_(0x00000159), LL(0xd9a6f518,0xfa70c9cf),LL(0xfefa0627,0xcdcaaa25),LL(0xceb9750a,0x15a2f18a),LL(0x9cc57e80,0xba45323a),LL(0x0cadb63b,0xe3f19ccd),LL(0xa55c80d9,0x1e511bb0),LL(0x3bb4df11,0x164359dc),LL(0x3e271d06,0x1f1ae900),L_(0x00000000),
+ LL(0xaa6cb262,0xb186d04e),LL(0xe56a357b,0x750898af),LL(0xb3fa3a15,0x4d60c192),LL(0xc07d177e,0x9679fa78),LL(0xf75650e4,0x3ad024b4),LL(0xfc2fc8b2,0x0bddcaf6),LL(0x559b0ced,0x604f3f34),LL(0x995261e0,0x1b5f8e9d),L_(0x000001a0), LL(0xfb2e6335,0xc5822803),LL(0x102a3be3,0xc4f23418),LL(0x2683d799,0x446dc4f9),LL(0x87d5a82b,0x82fb7bba),LL(0xba06b349,0x859d405f),LL(0xdacb2e84,0xf7fdeed1),LL(0xa51f1588,0x8b67135b),LL(0xc2217c58,0xbd5966c7),L_(0x000000b7),
+ LL(0x8ed9d71b,0xf4c69057),LL(0x0ee9b6ca,0xb90a3ad0),LL(0x690215b5,0xe1a72991),LL(0x9dc86f3e,0x4e4042ba),LL(0x076b900e,0x7d9520d4),LL(0xf559233d,0xa6fe5f79),LL(0xd16f05cc,0x6290cb9a),LL(0x2c55a35f,0x2d4f8345),L_(0x0000017e), LL(0x02fbcf5d,0xc7fdf1f3),LL(0x78d6c024,0x3c5ac58d),LL(0x180724dc,0xeafba33f),LL(0x0f2d4859,0xa9ec392b),LL(0x9adb7f75,0x10b122b3),LL(0xa1699e54,0x8be6fae5),LL(0xcfb1317b,0x3a96cd81),LL(0x9a5bff09,0x44a057c8),L_(0x00000143),
+ LL(0xf6d8c638,0xd287d869),LL(0x6aabc1f2,0x26b0f715),LL(0xbdea2e8a,0x8e33c1dc),LL(0x689a9c3d,0x8c56f036),LL(0xa841ff6c,0x527eaefd),LL(0x10032f78,0x0c199e97),LL(0x6215f00a,0xd8293042),LL(0x0262f60a,0xfb4b2139),L_(0x00000098), LL(0x0105c4ab,0xa09207d0),LL(0x2a3ccda5,0x7549d228),LL(0x67ad8625,0x0483ecfd),LL(0x12b83a0c,0x0eee9667),LL(0xe653fd39,0x14bf0bf5),LL(0xdd617912,0x5b9e1025),LL(0x58e59489,0xb42fb14a),LL(0x6b6fe3f4,0xd59f64f0),L_(0x00000022),
+ LL(0x82f2b927,0xfe39c03a),LL(0x595b30e1,0xa1ad263a),LL(0xcc294836,0xe59896e0),LL(0x55678ebc,0xdab6cc2a),LL(0x3b48be12,0xf27aff9b),LL(0x1525c60c,0x72f22657),LL(0xbfa65ac2,0xe179fdb5),LL(0x957d9762,0x5bc621c4),L_(0x00000066), LL(0xaabb8ddd,0x2e567a04),LL(0xfc24eb81,0xcd0abafe),LL(0x3ab9ba57,0x7ece5b5f),LL(0x94233802,0xfa49f2c9),LL(0x192ad8a9,0x7c6c9e7b),LL(0xd9733712,0x97c62d5b),LL(0x608ec02f,0x3b573c6e),LL(0x90c6dba5,0x100eafa7),L_(0x0000017c),
+ LL(0x41a926ac,0xea7b4b5d),LL(0x6a5e3301,0x595fce21),LL(0xee8aa9a4,0x4300c92a),LL(0xeb1b3325,0xfb3d0ddc),LL(0xe7231d36,0xdd2028ea),LL(0x0407b0dc,0xb99d20da),LL(0xf0f51dbb,0xe418d5a9),LL(0x31d74a02,0xb34fb225),L_(0x000001ea), LL(0xf7fd4389,0xbfaf4600),LL(0xe8d861a3,0xf167dda3),LL(0x92cf759f,0xc46df950),LL(0x32d3e4f2,0xb7815d1f),LL(0x91ed2fcf,0x6d421190),LL(0x12864b88,0xf9dfcf39),LL(0x04988ed3,0x74a6a7f4),LL(0x44aba25d,0x1a08a720),L_(0x000000d7),
+ LL(0x4033bcc8,0xd518ffb7),LL(0x2da2c2e9,0x1ae0cd73),LL(0x9a4290d6,0x357cfbc1),LL(0x784c1f06,0x3ca1aed8),LL(0x3fe20989,0x85a8dedb),LL(0x2f87969a,0xc8eb2e93),LL(0x550ff529,0xfbbcc740),LL(0x54bf85aa,0x9d6aa4f5),L_(0x00000124), LL(0xd5bc6372,0x557f4f2e),LL(0xc2efbdc0,0x9d0c30f3),LL(0x262ac2fc,0xd5dddabb),LL(0xa05b87d4,0x769d1cf7),LL(0xfc91e745,0x4d0a4907),LL(0xdcd38c99,0x89250072),LL(0xc453a288,0x0dffae1a),LL(0xe7245800,0xf08702a8),L_(0x000001af),
+},
+/* digit=37 base_pwr=2^185 */
+{
+ LL(0x06d9177f,0x5e3cbf74),LL(0x39ed5397,0x2f09def0),LL(0x0caf736f,0xbc534da8),LL(0xfcc790fe,0x46448c8e),LL(0xb0ad47e7,0x36b92fa7),LL(0xc7671ca3,0x90e92c64),LL(0x637080ab,0x52dfd8d6),LL(0x5711517b,0xed4b932f),L_(0x00000178), LL(0x56a0257f,0x24412386),LL(0x77234bc0,0x364971ed),LL(0x9b2d316f,0x0cc8b1d0),LL(0xdf4ae5e0,0x307856bf),LL(0x1468fa8d,0xe3791c04),LL(0xfc69805b,0xfa589236),LL(0x0c1fe733,0x89a33762),LL(0x37b57609,0x42b031e7),L_(0x000001e9),
+ LL(0x8a01e6a2,0x71b4886b),LL(0x83120c39,0xdae7cb78),LL(0xf3efe6ce,0xfd659d28),LL(0xe1699713,0x75625028),LL(0x0252af65,0xcd7c4a21),LL(0x81fe2a3a,0x7efc9c5a),LL(0x2fab4ecf,0x8ae2a5f8),LL(0x92444155,0xf68655c0),L_(0x00000034), LL(0x95495dd4,0xdf9b0e72),LL(0xbb0facca,0xab5a8f70),LL(0x01ed29d2,0x6b65b325),LL(0xf439adfe,0x2e9c2436),LL(0x40a6c720,0xbcd403e2),LL(0x97776531,0x4526a2b6),LL(0x90cd1256,0xa61dc2d5),LL(0x170acdcf,0xac792b64),L_(0x00000126),
+ LL(0x8be8d883,0x770de7cc),LL(0x95107be3,0x07c65e3e),LL(0x780e3eca,0xcf6ac96f),LL(0x3d615089,0x2549b641),LL(0xf585b5b2,0xacd5da79),LL(0x4c0d8b5f,0x3c8b5c5a),LL(0x970b49ff,0xadd6dfaa),LL(0xc025c0e7,0xdf3f065c),L_(0x00000179), LL(0x0b3c64dd,0xc797b7cd),LL(0xbc308343,0x1f367813),LL(0x138ae118,0xe7bfbf3f),LL(0x1f8c6302,0xe3cc546f),LL(0xef35ea2e,0x904ac34e),LL(0x852c3a0b,0x2596f106),LL(0xb1310ec5,0x1e6e533a),LL(0x763b1938,0x2a9b4abf),L_(0x00000068),
+ LL(0x29b5e462,0xab5e9c2f),LL(0xc87a1f3a,0x40c3ae00),LL(0x8fdfc7cb,0xf72aade9),LL(0xf671ec86,0xaa376ff2),LL(0x369dd7b2,0x0c4b0748),LL(0x1a9eb6f9,0xe5c39e83),LL(0xb8bdb31a,0xc9ef6929),LL(0x5a4c5224,0xaad6c712),L_(0x000001ba), LL(0x3d80ab90,0x8a32a994),LL(0x0edbbb7c,0x51b7d4fd),LL(0x9eb83ad0,0xbe08eaa8),LL(0x343de0eb,0xc33cc9fb),LL(0xad3c4d0c,0x24b0953f),LL(0x9c30b151,0x582773fc),LL(0x3a021a47,0x75ab2c19),LL(0xddfb8816,0x2171ab73),L_(0x0000011a),
+ LL(0x8da3d9ef,0x644b8138),LL(0x80531565,0xf0f2d302),LL(0x3bfd457e,0x64c28e98),LL(0x93b685b7,0x24eeda6c),LL(0x2b149454,0x97f74e2b),LL(0x1420398e,0xce3c2017),LL(0x93fa9e0c,0xa9df8bc6),LL(0x0fc6b820,0x951fb9ae),L_(0x00000066), LL(0x52bf8c38,0x06c9ae45),LL(0x500fd912,0x2fbca6d5),LL(0x5e0fd35b,0xe9e18d3d),LL(0x39985525,0x3bfa858d),LL(0x3a3dab8f,0x0bc682dc),LL(0x51f2882f,0x5632ba53),LL(0xd2912672,0xa5d16cfd),LL(0xefb27960,0xa8e18261),L_(0x00000078),
+ LL(0xf235a5ba,0x39db43f4),LL(0xdd5bbd91,0x4d8ac038),LL(0xc1e864b1,0xbb5ec32b),LL(0x9c3d8682,0x0da419a0),LL(0x7fa3e54d,0xbbcc85f7),LL(0x4911605b,0x16bf46df),LL(0x459ed701,0x42b3919e),LL(0x4a6f67ab,0xc54ccf4e),L_(0x0000016e), LL(0x761f44af,0x78dc3aaf),LL(0x7ec577f5,0x443c49b1),LL(0xcedfe95e,0x4ca71a23),LL(0x80d161de,0x88a46fa9),LL(0xa3a812c1,0x8060703c),LL(0x5d69c965,0x52f25061),LL(0xebe46263,0xf14ae427),LL(0x2518ad4d,0x8ea0658a),L_(0x00000112),
+ LL(0xb29db4b3,0x3eb4e951),LL(0x73934c0c,0xd205a31b),LL(0xcde75602,0xf7d9ceca),LL(0x652846c3,0xa5604560),LL(0xf53ed6dc,0xfcef8ee2),LL(0xa3dda8b0,0x73763d47),LL(0x5dcfc88c,0x3f72bc6b),LL(0x61afbead,0xb25f5862),L_(0x0000019c), LL(0x706c2fef,0xb896e8ba),LL(0x91189666,0xa5f8d9e7),LL(0x6dc25f9d,0x98f8493f),LL(0x29210ade,0x77e1557d),LL(0xc803167f,0x80aaf764),LL(0x746e916c,0x9a02bf22),LL(0x6f8c70cb,0x692f9669),LL(0xe6efe144,0x7721e1e7),L_(0x00000116),
+ LL(0xd6f014ad,0x10e7e9c3),LL(0x91edf75a,0x042dda6a),LL(0xfbe9047f,0x6df69276),LL(0x497f9141,0xfce4035a),LL(0xab982ab7,0x1e6adadf),LL(0xd973b8b6,0x218a9fd9),LL(0xe2c23f1d,0x9e1c8c04),LL(0x2274d47d,0x94c92cb1),L_(0x00000053), LL(0x090ec3de,0x272cecd7),LL(0x6d724d9a,0x50e492db),LL(0xe32d2f19,0x68f82a50),LL(0x6bf40e9c,0x0678afdb),LL(0x4b25727f,0xe6ae7819),LL(0x06b77a36,0xbb096d18),LL(0xeedfa35c,0xf41afd3f),LL(0xc17d9b9f,0xf7315e57),L_(0x00000072),
+ LL(0xaac42698,0x9e517311),LL(0x90d691a0,0xbbe7b23f),LL(0x3efcc598,0xc5b3ba4a),LL(0xf044505e,0x8a70a012),LL(0x818530c1,0xb73eeaec),LL(0xd4496b66,0x25f453bb),LL(0xabda0862,0x6dcb9832),LL(0x76d60bb1,0x6fccf460),L_(0x00000068), LL(0xa348f0b1,0xdb8646ed),LL(0x1af6f002,0x451f5839),LL(0x3087f4a7,0xa66aaeeb),LL(0x47adc893,0xbec9934e),LL(0x6e6950e9,0xb35294f1),LL(0x31d5e186,0x7bf79296),LL(0x590c3c8b,0xc1942a2c),LL(0x1b804ef3,0xf152ba51),L_(0x00000074),
+ LL(0xd23e1c8a,0x01715db9),LL(0x41d8f90c,0xbbc2c6b8),LL(0x4e56a842,0x83c0fc75),LL(0x986646d8,0x4fe3bcf5),LL(0x5fdbc4e4,0x2ada0ebd),LL(0x0e534106,0x8c28b66c),LL(0xb1f981f9,0x56f04488),LL(0x79a1b1cb,0x291ee458),L_(0x000000d5), LL(0x98d4263b,0xb7ee4dad),LL(0xb8425937,0x9ce9983c),LL(0xaff51ac5,0x798d12f4),LL(0x772fa5da,0xb536f2fe),LL(0x9c00b0c8,0xb35431b3),LL(0xf4789358,0x2ee8e687),LL(0x664cbdfe,0x29120ae4),LL(0xfa9435a4,0x94cd44dc),L_(0x000000a8),
+ LL(0xde30af0b,0x64ca10f1),LL(0x7af2cf68,0xf23265e4),LL(0xcdd4b45d,0x4fc85e40),LL(0x3c687440,0x3ef2a535),LL(0x6a698fc3,0x9efabe8e),LL(0x63e4d298,0x18de82a4),LL(0xb24c2816,0x775b0ff1),LL(0xf09e7eee,0xae091929),L_(0x00000039), LL(0x1cbca914,0x7dbc5bb9),LL(0xcc9dfa8d,0x432844d1),LL(0xb35c10a9,0xdb4db17a),LL(0xf5e1db87,0xf9910dba),LL(0x86ff1ebc,0xb2c9c01b),LL(0x189bbc27,0xa7d616b4),LL(0x5df3f754,0xe6cc2fbf),LL(0x274e1d3a,0xb0f2916e),L_(0x000000f8),
+ LL(0xcbf1d173,0xd9410d43),LL(0xb76d4376,0x656599eb),LL(0x900d071f,0x2fb9b595),LL(0x5fbadcc3,0xe781b5f4),LL(0xc0a2440b,0x50f63654),LL(0xbfcd2d0c,0x1e522100),LL(0x2f21286a,0x4f742889),LL(0x482b198e,0x3ab8b88a),L_(0x00000159), LL(0xd5622874,0x47efa194),LL(0x1f58794f,0xbd93f7de),LL(0xc2129e69,0x5496a993),LL(0x1b271db6,0x8f7ac06b),LL(0x5b18ae06,0x78e56286),LL(0x6111cab0,0xbf1dc2cb),LL(0x641b9597,0x9c602e3b),LL(0x6826b02e,0xeec26ee4),L_(0x000000a9),
+ LL(0xcc35919a,0x2497cb5e),LL(0x94f52d11,0x4ef3c830),LL(0xdf80522a,0x94fd85cb),LL(0xf72be2d7,0x29671043),LL(0x75499b11,0x540e521b),LL(0x0bd6a835,0x5b01c741),LL(0xc2f40e1e,0x4828498e),LL(0xb6d6e72b,0x3a3120eb),L_(0x00000072), LL(0x87e9147b,0x4ff41c4c),LL(0x7947091e,0x283731b8),LL(0x31294652,0xf259b874),LL(0x0f36636f,0x8ee00f38),LL(0xfc2118ab,0x8017118b),LL(0x5f13103b,0xc3d2d9af),LL(0xc3feb59d,0xca5c4199),LL(0x39888318,0x669fc868),L_(0x000000d1),
+ LL(0x5d7424e4,0x59ff2a43),LL(0x6be7810b,0x30694fb4),LL(0x78ec13fc,0x92716d06),LL(0x1d9c5aae,0x8fbb9bb8),LL(0x416a4a81,0x1881c6a4),LL(0x15a0a324,0x489236d7),LL(0x23235b6b,0x685caeab),LL(0xa5c2734b,0x61eb3c66),L_(0x000000d4), LL(0x383cc04c,0x2d3601e9),LL(0xd66a0119,0xa6e151c6),LL(0x9e61fd22,0x8339ddd5),LL(0x91be32a7,0x235b6f9c),LL(0x7155449c,0x322c55d0),LL(0xa7e5e410,0xbe0a861c),LL(0xce4ac258,0x0323587c),LL(0xd78b88ca,0x00416746),L_(0x00000149),
+ LL(0xb1cdbf59,0x59991ed2),LL(0x646f1d97,0xae034cb5),LL(0xcf9f8f62,0xa6cfbf1e),LL(0x9a35acdb,0xb02eab43),LL(0x0993f86d,0x172ffcec),LL(0xc65c756e,0x1b44bc51),LL(0x5ec6620c,0x19230f70),LL(0xc9e7a1a7,0xec7cab96),L_(0x0000015b), LL(0xf7bed1a1,0x28d9a36c),LL(0x391142c7,0x3d4288e4),LL(0x0485a093,0xf59f8fae),LL(0x0209a097,0x94df4e25),LL(0x5fdf8f3e,0xbc0be074),LL(0xb3140419,0xba7e0344),LL(0x5cbb3260,0x95c0673b),LL(0x536a91bd,0x49e9efa6),L_(0x0000007b),
+ LL(0x9f78e57a,0x123d2b21),LL(0xa3cf981a,0xecb0183c),LL(0x1eddfd07,0x6998ed9f),LL(0x8f90e3c6,0x0e05152f),LL(0xfad41bb2,0x7dab5c5e),LL(0x939419c7,0xca783006),LL(0xde605b32,0x98ae5cd1),LL(0x3d6039cc,0xb8a93393),L_(0x00000160), LL(0x590ae5b0,0x68c4bf82),LL(0xfdf4f711,0x01a66f3e),LL(0xa65b0015,0x241e1da4),LL(0x0665dbdf,0x4c3387ba),LL(0xf15f360d,0xc88fe301),LL(0x8acf4e85,0x061a8e04),LL(0x9ca9957c,0x51bcc011),LL(0x8585dfcf,0x656e99ea),L_(0x000000b7),
+},
+/* digit=38 base_pwr=2^190 */
+{
+ LL(0x37a0e4fa,0xd96e52e4),LL(0x3aebdd33,0x29f2632f),LL(0x4fd15682,0x2c70c85e),LL(0x4f3be789,0x0a1634de),LL(0xc7d9fb18,0x638b44c2),LL(0x3e6cb175,0xe33499b5),LL(0x0b60dc32,0x2ecdad29),LL(0xcf1fcbab,0x3e0d39d1),L_(0x0000014b), LL(0x5d1854ce,0xb5b7539f),LL(0xb9d47257,0x96df1240),LL(0x561ffc72,0x5e9f9e9a),LL(0x6d945271,0x9f0df30d),LL(0x25aea910,0x1e814b45),LL(0x4c475d52,0x7037d6e7),LL(0x2239acac,0x6b60afbb),LL(0x3a178a1e,0x3b53fdfe),L_(0x000001f6),
+ LL(0x3a760e88,0x1c8cff61),LL(0x662259f9,0x3af1d337),LL(0x798ee44c,0x04c2f55a),LL(0x7171b763,0x6b42022c),LL(0x451b89de,0xe995dc45),LL(0x0166754c,0x5d7e90f4),LL(0x45f5e9ea,0x1437fe2c),LL(0x5f81a1be,0xdd209d83),L_(0x000000f7), LL(0x34c04a7d,0x2e0b1aaf),LL(0x62ecd7d2,0xad928156),LL(0x3ef4d947,0xdc8b88ed),LL(0x90778ccc,0xd0a75501),LL(0x1ea32bf7,0x615d6df4),LL(0x370394ed,0x6cdce7de),LL(0xa5a2d856,0x5b5d94b6),LL(0xb1500a75,0x79b1d869),L_(0x0000015f),
+ LL(0x49071d49,0x08ad1120),LL(0x6075e725,0x64ba748d),LL(0xec7f443e,0xf8b1338b),LL(0xe9769df7,0xe04bfcf3),LL(0x276b48ae,0x8c536f3f),LL(0x51362d75,0x91347181),LL(0x7270c649,0x8771d27e),LL(0xd7277846,0x78d1b0b0),L_(0x0000007b), LL(0xf80d5fba,0xb1ff417a),LL(0x8984b71a,0x7e8990b5),LL(0x052a6765,0xa10e9e6f),LL(0xa3a8ec04,0x68613043),LL(0xf8edeb0d,0x94eee364),LL(0x38d79bc5,0xb9b0283c),LL(0x1f04d202,0x240928e2),LL(0xef3aafdb,0xc9d0a1bb),L_(0x0000017c),
+ LL(0x7b556d5f,0x0eb6f5de),LL(0xe1fefbb4,0x92b00751),LL(0xadf10d77,0x245d985b),LL(0xa78c0fd8,0x1ec6c5bd),LL(0x197cec62,0x6f653476),LL(0xf59e9de3,0x29578b20),LL(0x48b6a349,0xdd081291),LL(0x858df1e4,0x1947d260),L_(0x00000196), LL(0x4a2df7b8,0x72cf54b6),LL(0x702ccf08,0x5ba02c9e),LL(0x4fa2136f,0x4316a469),LL(0x62ca46c9,0x2a601fae),LL(0x6a69d6c7,0xf210ce68),LL(0x3ca9ff0a,0x108647e2),LL(0x7301dc8a,0xbc72d54b),LL(0xc0d011e4,0x8176db4f),L_(0x00000002),
+ LL(0xaff92b49,0x3a47424a),LL(0x1313f0d7,0xd74e27bd),LL(0xc984d57a,0xa310f0f4),LL(0x7f2762aa,0xf81b869f),LL(0xc1c0028a,0x73626037),LL(0x16619502,0xb6eafd5a),LL(0x02aa41a3,0x7a26f16a),LL(0xee8393c6,0x76a73209),L_(0x00000172), LL(0xc3e1533a,0x770bf892),LL(0xe55dcb14,0x37abc785),LL(0x49d52ff8,0x88ea32f9),LL(0xca2e3d46,0xf41fb729),LL(0x28df94aa,0xd1d7fe42),LL(0x6b931662,0x453917fd),LL(0xf0e1ad47,0x15504e62),LL(0xac5c9f2e,0x74231808),L_(0x00000140),
+ LL(0x1643c1a4,0x253c03de),LL(0x2114e9cd,0xd7e1536e),LL(0x1b41ae52,0xc0d640bc),LL(0xe9135dab,0xb1a92fcb),LL(0x5a9ef7aa,0xf491bd34),LL(0xd3e367c8,0x6cfcfac3),LL(0x6970f4aa,0x28093242),LL(0x12bc2a52,0x16e9d71c),L_(0x00000064), LL(0x68fd0341,0x14138a14),LL(0x1a1ea358,0xd7ebb375),LL(0x0313c60f,0xb31aaf76),LL(0x7f4e2cd8,0x63d1b78f),LL(0x376b2b87,0xea4746f2),LL(0x9adb2628,0x7159cd2f),LL(0x3fee262c,0x45cb3634),LL(0x258e2340,0x9f14787d),L_(0x0000002e),
+ LL(0x1f614296,0x5dcc4da5),LL(0xa12ada20,0x6dbe5329),LL(0xd7a52ac6,0x2fb42468),LL(0x898121b3,0xe9f5b08e),LL(0x86a37006,0xf5a42f83),LL(0xbe3e6de0,0x271bec98),LL(0xc405b595,0x486c9095),LL(0x9adc363e,0xec7821b2),L_(0x0000011c), LL(0x3c99889c,0x5b663d6b),LL(0x0c06893d,0xa00328d8),LL(0x8fc3f4f3,0x2578283f),LL(0x3d264389,0x57571710),LL(0x28e44b9a,0xd62bb6bf),LL(0x87dd3c9c,0xd7a2f5d0),LL(0xf55cade8,0xcb792986),LL(0xfa60b3a6,0x5a4730dc),L_(0x00000189),
+ LL(0x04c2c927,0x8890056b),LL(0xc5944824,0x319a82e4),LL(0x5d37d95b,0x5a8bd6a5),LL(0xd80dfb73,0xa7edec74),LL(0xdb368732,0x60fac47d),LL(0x4f46dbb9,0xb7d14924),LL(0xe4ae15b9,0x255c8153),LL(0xd6f56370,0x73d96dd7),L_(0x00000042), LL(0x8323077c,0xc814ef11),LL(0x2b965e01,0xd2dfe1b5),LL(0xcad600e8,0x2cdd66c5),LL(0xcd44f8d0,0xad1f4964),LL(0xbb170f04,0x6b03da74),LL(0x09f8b95d,0x721ac428),LL(0xc3ee7059,0xab3fd08d),LL(0x69cd062a,0xeb3f55bd),L_(0x0000006f),
+ LL(0x02685d92,0xb24b23c8),LL(0xbb2912fa,0x700eb07a),LL(0x547f3fb5,0x51442fab),LL(0xf8090af2,0x91ae8f36),LL(0xd9f38784,0x7db330a6),LL(0x213e5f98,0xc4904ecd),LL(0xd61a36f0,0x18124e05),LL(0xdf7f8676,0x7f34e23c),L_(0x00000047), LL(0x2a682aca,0xa540909b),LL(0x1f256aed,0x28d1d810),LL(0x643a464f,0xc1d65b95),LL(0xc56ce322,0xe242b555),LL(0xf79c9363,0x165401c2),LL(0x90b17574,0xb89e030b),LL(0xd9ba6bec,0xad9d3eed),LL(0x3cf323eb,0xb926c391),L_(0x00000199),
+ LL(0x68365daf,0x6bf21ffc),LL(0x9e0da99b,0x2a11bae7),LL(0x4b632c36,0xd82e9b91),LL(0x8aba8d4a,0xd3edcc69),LL(0x7bcaa8bf,0x0780abc1),LL(0x4b5bb38e,0xf449e1ff),LL(0xb3a33e0f,0x8bf9427c),LL(0x5f153607,0xd3095501),L_(0x000001f9), LL(0xc25e9667,0xa71cb23b),LL(0xf1192121,0xb5c951ff),LL(0xe5267dca,0xde9bed29),LL(0x45f5f5dc,0x62c0dc77),LL(0x5c58640e,0xb410973e),LL(0xab71fb6e,0x2ca60e2a),LL(0xbd3de2bc,0x91e919a4),LL(0xb16029e8,0xcc5ea62b),L_(0x00000057),
+ LL(0x920ffb1b,0x2f766525),LL(0x5063e19e,0x0c6dbf49),LL(0x2d7c8225,0xc1e5d3a2),LL(0x5919b3b0,0xc8eabb36),LL(0x9bd4d72c,0x7daca33a),LL(0xe43be366,0x6a2d3407),LL(0xd8bf85b2,0xcb065c13),LL(0x74ca1514,0x12ff272a),L_(0x000001ed), LL(0x240e3231,0xdfa8142f),LL(0xbfc4ea2d,0xe35ddb6b),LL(0xac61b3dd,0xf38f22ff),LL(0x0b6750d6,0x6e04a783),LL(0x0ae7817b,0x43182e3c),LL(0x5fc3f142,0x70dd88d4),LL(0x8958a84f,0xe8d996f8),LL(0x988beb73,0xfbc25676),L_(0x000000d3),
+ LL(0x2fb883d8,0xae353f2a),LL(0xb61aaafb,0x473d0ade),LL(0x890f51bd,0xd1b37ae3),LL(0x0f0c4103,0xeca49348),LL(0x0087e22d,0xc669a58f),LL(0x3462ae96,0xd7ec27b9),LL(0x71fe3af0,0x345f63a7),LL(0x5d6f6927,0x415c1403),L_(0x0000008b), LL(0x2047ce82,0x2d78ca1a),LL(0xbf2a2a03,0xffe80d92),LL(0x8144148d,0x41e35712),LL(0xf4375651,0x70453a65),LL(0x4044794e,0x74d6e72f),LL(0xc3b6ed9d,0xc9dec888),LL(0x03c9efa2,0x01d35b17),LL(0x4a8b5ee1,0x0c747556),L_(0x0000016c),
+ LL(0xfedb9ea3,0x89f7c11a),LL(0xcc1f90fd,0x930eb52d),LL(0x56a442b3,0xb33c2951),LL(0x6f35d3db,0x189b9ef0),LL(0x5065c93b,0x03375bf3),LL(0xb5e57110,0x9efd6440),LL(0xacf2c750,0xada5967b),LL(0x09a6e279,0x2239bfb7),L_(0x00000034), LL(0xdb8bd33e,0x5a1a6302),LL(0x0c057175,0xd07e6a63),LL(0x12ebc219,0xd7415a35),LL(0x5c53acb6,0xffce8b04),LL(0xc61aee58,0xb8a197ba),LL(0x3531c053,0x76809753),LL(0xd0b9df9b,0x5e6fa51d),LL(0xdfc91e09,0x0d89124e),L_(0x0000018d),
+ LL(0x8909747e,0x7284d674),LL(0x9a35c4f1,0xaebd8339),LL(0x80afa728,0xcd763811),LL(0xe7b55292,0xbfb44242),LL(0x2f4e7b9f,0xa0832cc1),LL(0x4b2452f9,0xeb50e9df),LL(0xfb6f4f77,0x557d53b4),LL(0x081a5219,0x421a55ef),L_(0x00000078), LL(0xda08f2ab,0x71ddd646),LL(0xdc6cd83b,0x827b9770),LL(0x2342c2c2,0x40af5e14),LL(0x1b228d0c,0xc507fb1d),LL(0x01646580,0x8f89f75f),LL(0x38a92b52,0xe00b0563),LL(0x154282c5,0x27686a53),LL(0x4f688875,0xa595819d),L_(0x000000ac),
+ LL(0x5b121bb1,0xfd31a6ee),LL(0x6472e541,0x1922fc41),LL(0xcfaa3052,0xffa68d9b),LL(0x6480d380,0xb9a18b55),LL(0xe83a1c00,0xb0e4740a),LL(0x0caf0d03,0x6f130693),LL(0x4ea7894d,0x36b54495),LL(0x3a9ed5ca,0x2a06c77e),L_(0x0000019d), LL(0x6328956b,0x8cad3c5b),LL(0x903ec0c4,0x38be6a97),LL(0x4788849b,0x6a8af4cc),LL(0xb82169df,0x753b96f7),LL(0xf48e2aee,0xbe19a762),LL(0x3765ed66,0xc53900a8),LL(0x5283437e,0x77012317),LL(0x86b0a458,0x28a77627),L_(0x00000076),
+ LL(0xb5408c0e,0x1466bddd),LL(0x7d090375,0x68631831),LL(0x1d77faab,0xfd6f5c35),LL(0xe1c56990,0xed7bc7e6),LL(0x544f54fd,0x65874640),LL(0x9b1f7a03,0xcb87ac9e),LL(0xd060b45a,0x33e1a951),LL(0xd46b22b1,0x419962d4),L_(0x000001e8), LL(0x7cb30863,0xb9f34068),LL(0xa3dfc88f,0x545e0d0d),LL(0x7b5897e6,0xbbf7c012),LL(0x8cdc1322,0x5bfb3570),LL(0x13ce8bdc,0xe13ad999),LL(0xe1589aef,0xb6cb7333),LL(0x92265f86,0x5f5d1b9d),LL(0x9dfffba1,0x3f3bb65e),L_(0x0000013c),
+},
+/* digit=39 base_pwr=2^195 */
+{
+ LL(0x60d3d920,0xe5091b5f),LL(0xae3143dd,0xec304735),LL(0xe360b755,0xf78afe69),LL(0x119298c9,0xe3ed2ff3),LL(0x5c6a7738,0x24d64036),LL(0x06b1298a,0x8b486bf0),LL(0x3448a967,0x81e9050b),LL(0x6d50f02b,0x435dfac4),L_(0x0000006a), LL(0xf1b1ce68,0x59ff13a9),LL(0xfc1bfb85,0x23011f5e),LL(0x1d2b17a5,0xbec4e57b),LL(0xfdcb9ac6,0x53d5a58e),LL(0x109c3a11,0x4b16461a),LL(0xe6c06b2a,0xa5edc709),LL(0xc93e99c5,0x4ed62c80),LL(0x18529aa9,0xb0d33b02),L_(0x00000143),
+ LL(0xbce7cc65,0x49c78f7a),LL(0xe90f1135,0x6489c7f6),LL(0x7145775f,0xbe8e5262),LL(0xc353f1ce,0x36a4b927),LL(0xda2f29fc,0x3ef5bace),LL(0x3d4c0acc,0xb8074e6a),LL(0x43a9c64f,0x638d3fd6),LL(0x70fffe4c,0xb73e74c0),L_(0x000000bb), LL(0x5efbd2cd,0x9bf19e6e),LL(0xe86655bd,0x7942ab0c),LL(0xe82b0e8c,0xb1c0c790),LL(0x2f2b552c,0x9dab8e1e),LL(0x390a098c,0xa67eba46),LL(0x9b4d9810,0x6a4756fc),LL(0xc97785ec,0x8fe8cb25),LL(0xf5f5b6c1,0xf04de215),L_(0x000001ea),
+ LL(0x3e59c5ce,0x3ea8b15a),LL(0xda44d978,0xd1bea64a),LL(0xe489d3d2,0x8d887f59),LL(0xcaf7d8fe,0xf6f90986),LL(0x76e4ba07,0xeeb4dfe6),LL(0x19aece18,0xaf8390c7),LL(0x4b163792,0x8ecf88f9),LL(0xfe44fa1c,0xa188e3dd),L_(0x0000006a), LL(0x631704b8,0xceaf9552),LL(0xd06dc6ba,0x319c43cf),LL(0x86d813d4,0xc141f1cb),LL(0x1dcaf56d,0x59594026),LL(0xe9fcecb7,0x7334a724),LL(0xda2f8a7f,0xd2a3a54d),LL(0x40d320ca,0x376b3d8c),LL(0xee9740bc,0xf59a7790),L_(0x000000f0),
+ LL(0xf72bf06c,0x3dcbcaa8),LL(0xcedc2a2b,0x559f9fa4),LL(0x707cbdc6,0x65301ff4),LL(0xb59f1a1d,0xfc409d5e),LL(0xbb9620b3,0x6c53a5fe),LL(0x48b591f7,0x766a3eea),LL(0xc3fc458e,0x1913597e),LL(0xb4cf309e,0x0cff2a5e),L_(0x000000d6), LL(0x8bb24162,0xdda1da6f),LL(0xcd895e57,0x92393366),LL(0x02de8414,0x59ad0cbc),LL(0x65ce8f07,0x893b6573),LL(0xbcfa2564,0x73186b40),LL(0x4fbea748,0xd0156cb0),LL(0x512a03d4,0x0e490f66),LL(0x328165e7,0xb9d1236b),L_(0x0000015c),
+ LL(0xff9d55c9,0xf62fa8e3),LL(0x4867369d,0xa6218d53),LL(0x3d4df374,0x462df770),LL(0x0e4446f3,0x5002dbe2),LL(0xc6146393,0xee0caf51),LL(0x1bc9af4e,0x615e075e),LL(0x2e28e88d,0x750b8016),LL(0xc58c8ffa,0xc7d3f7ff),L_(0x0000019e), LL(0x91860ab2,0x88c92592),LL(0x4340d28a,0xa23735bf),LL(0x72c0db10,0x9e762765),LL(0xb8f03780,0xf1edfe96),LL(0x7d6eee09,0x395f70ab),LL(0x2e30082e,0xa5b4a747),LL(0xa42e66ca,0x42b9fa7f),LL(0x3482cf5e,0x48386fbb),L_(0x00000130),
+ LL(0xd1d63dbd,0xe4cd39f5),LL(0x09f98c29,0xaa873723),LL(0x561fec44,0xdc9951ea),LL(0xfd07b42d,0x6c46651a),LL(0x34575586,0x7bf78c6a),LL(0xa447b2e0,0x9284f87c),LL(0x9cdea2ee,0x7235d419),LL(0x677e1753,0x3057349a),L_(0x000001cf), LL(0x14229ff9,0xc8f306c8),LL(0xa79e93cb,0x1a7861e7),LL(0x05616521,0x7842d63c),LL(0x95f90f64,0xcf737ed9),LL(0xc0e16cd8,0xff0413e3),LL(0xedcf1408,0xc3a4f30d),LL(0x43a170a9,0x11a0a6b4),LL(0xcc49b5c7,0x21ebf6e0),L_(0x000000a0),
+ LL(0xd2ecdcea,0xd4a0eaa9),LL(0x7d01a093,0xc04512bd),LL(0x177d0211,0xa88e2872),LL(0xe8ab8a12,0xf6040bce),LL(0xec0d3b20,0xbaded143),LL(0xef133b8e,0xc0271e57),LL(0x57beaa78,0xa57bec42),LL(0x6cf36a58,0xb50afa18),L_(0x000001f2), LL(0x2b962ada,0x54a163f7),LL(0xdc75f9c2,0x9214028b),LL(0xf894f882,0x29ad8172),LL(0x454f24fe,0x0197a015),LL(0xb080990f,0x1b117443),LL(0x1d17b86f,0x15991c9a),LL(0x66059551,0x66f5d53f),LL(0x4e2d70c8,0x1de3adc7),L_(0x000000d4),
+ LL(0x6bac308c,0xd825f740),LL(0x34b0da8d,0x0fbb496f),LL(0xde870fb5,0x365075e1),LL(0x7841bcf2,0xd3c98322),LL(0x3b8e05ff,0xc39c86d8),LL(0x74cbe33d,0xf0fd6d0e),LL(0x8904ae19,0x6ed62a5a),LL(0x2b1e2805,0xb06988c3),L_(0x000000e9), LL(0x97d2a267,0x4c1cde55),LL(0x05031449,0xc0326e91),LL(0x50606033,0x423b1ee1),LL(0xf18317b0,0x398c9c61),LL(0x5cc474ed,0x96a97237),LL(0x7eb4df47,0x96b52ef0),LL(0x1372ae46,0xb1ed9607),LL(0xabf9d1fe,0xcf8f25ff),L_(0x00000036),
+ LL(0x31528630,0xd54e33b3),LL(0x4ada5d83,0x74c3835a),LL(0x9759009e,0xdb44c86f),LL(0x44543433,0xb0ab6930),LL(0x244966ca,0x9d760ccb),LL(0xc7b02622,0x48a60f21),LL(0xe78f542a,0xb0eae43b),LL(0x57db1786,0x7809642e),L_(0x000001f7), LL(0xabc5cfbf,0x88276635),LL(0x5fba9138,0xcf1d1a57),LL(0x568aba80,0x955f0fe2),LL(0x9cc142b7,0x00c55c57),LL(0x897ffd8e,0x15579a99),LL(0xb910a1ec,0x58a539a3),LL(0x68c6e345,0xa76c02ea),LL(0x37272cb2,0x81b23d5b),L_(0x00000083),
+ LL(0x9045b8e2,0x054435bd),LL(0xe377c286,0x12ddcca1),LL(0xd747b1a8,0x3eb9f510),LL(0x775c0ea6,0x4fcce9d3),LL(0x5865c783,0xd37d19f7),LL(0x2eb67bba,0xbbc7cb40),LL(0x53271117,0xd5530a0f),LL(0x600a1a8b,0x320b3908),L_(0x0000011e), LL(0xddabbe5e,0xb10fe3c6),LL(0x3587db17,0x11b65599),LL(0x1c163208,0xad78aa4f),LL(0xe7539751,0x51c18792),LL(0xc229bfb7,0x5719f77d),LL(0xf84f03ce,0xdd5c3eed),LL(0xbb9c60b9,0xc4b8c257),LL(0xe60da1b9,0x2658c345),L_(0x00000004),
+ LL(0xe70fa9ae,0x80aea17a),LL(0x3cc6237a,0xa1a05142),LL(0xbfbb8572,0x82ef4062),LL(0x1a092a36,0x584063eb),LL(0x083d9b48,0x0ca19b36),LL(0xd64fde39,0x92047044),LL(0x84e4f4c7,0x3a0049a4),LL(0x025a777c,0x234042e3),L_(0x000001eb), LL(0xa8f92448,0x1e5063b2),LL(0xfb85d333,0x72d2c93b),LL(0x0f374579,0x6c2c1440),LL(0x599d4bd1,0xf99fc78f),LL(0xf8d879ab,0x7157a6f4),LL(0x24350117,0x6511ce35),LL(0xf5039be6,0x3e9cc395),LL(0xa82c44a2,0x9a34c956),L_(0x0000003c),
+ LL(0xe6e7d409,0x83ea2a70),LL(0x4c9ba2b5,0x137328e5),LL(0xd4654390,0xb93501ec),LL(0xd733683a,0x118e98e5),LL(0x89f374dd,0x00d407bd),LL(0x5295b907,0x13b0afb6),LL(0x57db6bfc,0x6b480958),LL(0x95fc47c6,0xef3d4708),L_(0x0000006a), LL(0xaa37df30,0x84543a49),LL(0x5c127536,0xaf148309),LL(0xbf08a1c2,0xcb7176db),LL(0xbab267dc,0xa7bbd2fb),LL(0xabd6efdf,0x8aeeb27e),LL(0xe86eabfc,0xc902ad03),LL(0x4e44e718,0xf09e682a),LL(0x064991f1,0xe6ec4fe0),L_(0x00000084),
+ LL(0xc501c914,0xa64386af),LL(0x86838cd0,0x4dd63878),LL(0xe353d214,0x2b6e52eb),LL(0x298c7007,0xb94c5abb),LL(0x4bbcef96,0x3cdd0d98),LL(0xfb73d97d,0xe31b50a6),LL(0xd4d6c5d5,0x63019a2f),LL(0xaac04770,0x2424268c),L_(0x00000045), LL(0x1496527b,0x959a4aac),LL(0xe7cd0ef4,0x5fb6b5e8),LL(0xcf4b2051,0x77e30f99),LL(0x1b0c7952,0x70b054fe),LL(0x38ba1d97,0x5de49575),LL(0x947a5a05,0x8fe1e2d6),LL(0x4246cd4c,0x3254f07e),LL(0x238ade18,0x21122733),L_(0x000001a1),
+ LL(0x99aed77f,0xf6fa1112),LL(0x9c04ed64,0xd4feb2e7),LL(0x7a120999,0x5d57b4f9),LL(0x70550af6,0xd07357d3),LL(0x41340660,0xe4afb7c6),LL(0x05ac084c,0x0826e572),LL(0xae197ca4,0x3ea7fc0b),LL(0x8f07d680,0x1c2a2823),L_(0x0000009b), LL(0xaf454a02,0xb5cdf6d6),LL(0xb32bd0de,0xf3bb89c8),LL(0x1bd8c3f6,0x5deb355a),LL(0x3db355ab,0x2f043ae6),LL(0xd5c6b398,0x0e90987d),LL(0xabe8910f,0x380521ad),LL(0x4bf6a241,0x3dfa044a),LL(0xfb752ed2,0x6a745fd8),L_(0x00000196),
+ LL(0xaad132cf,0x696e2831),LL(0x49f240e0,0x0d4e57f0),LL(0x3025b776,0xf18f53bc),LL(0x0b5878b5,0x56b2575b),LL(0x576025b0,0x452417b5),LL(0x51986dad,0xa57a7837),LL(0x5444a7c0,0x9f4452b9),LL(0x9f945ebb,0x8aa46532),L_(0x000001a7), LL(0xca0455ee,0xd553d885),LL(0x83b12fcc,0xd68fe49a),LL(0x3da8d9a1,0xb71fad5d),LL(0xa984d589,0x1f435980),LL(0x5db787bb,0x659a3f24),LL(0xa908e510,0xdd95c91e),LL(0xbe7d501b,0x4a9245db),LL(0xdaa920fc,0xccd618d3),L_(0x00000107),
+ LL(0x58fdd1be,0x26f6dba6),LL(0x1bc799a8,0xcb4e9512),LL(0xf00f6eae,0x56df676a),LL(0xe75a521d,0x29d333ce),LL(0x4eca7d77,0x27fb68ac),LL(0x206d2e50,0xa49aec5f),LL(0xaa272aa4,0x1b6a988f),LL(0x341efc69,0x6924c47f),L_(0x000000e1), LL(0xe6df0f07,0x3afd9193),LL(0x782686ca,0xe7785c7d),LL(0x3c2a9148,0x4c330f1e),LL(0xa49f1fa5,0x82ded4aa),LL(0xde962297,0xb845da08),LL(0x79a993b6,0x0729c991),LL(0xf8fef022,0xad904b0d),LL(0xe6016c6a,0x2a8c39ce),L_(0x00000108),
+},
+/* digit=40 base_pwr=2^200 */
+{
+ LL(0x938c22f8,0x943a3471),LL(0x837e8130,0xe2773aac),LL(0x4a3c4f46,0xf24010c6),LL(0x2b750229,0x138446be),LL(0x007131ff,0x731813b9),LL(0xc2c90ce7,0xe94672d6),LL(0xdd149a00,0x69dcb075),LL(0x7531381b,0x7f7c96d0),L_(0x00000019), LL(0xb6b38c7b,0x39ced7c6),LL(0xb63d5a97,0xa61fbc4f),LL(0x8f6b6bae,0x075fe4d1),LL(0x6ae1dbab,0xc1ebedbd),LL(0x12c3dbf8,0x6dce109a),LL(0xc087b051,0x4a2962c4),LL(0xa1e1733e,0xf40db685),LL(0x9f800e79,0xcdbc11ad),L_(0x000001d1),
+ LL(0x663feea7,0x4fde5cbe),LL(0xdd02746e,0x3f440437),LL(0x33232942,0x8cb2a089),LL(0x21f2f603,0x50b4f0e4),LL(0xa8d7b95a,0x18c0b0f4),LL(0x35a473ae,0xc9451cc0),LL(0x8955b22b,0x9c5154ba),LL(0x9d1fd085,0x73fe1d34),L_(0x00000117), LL(0xaff04652,0xe19db868),LL(0x961dcb73,0xeea574f2),LL(0xf8c3e1f9,0xf4327664),LL(0x9b512b73,0xb683e483),LL(0xb02a0ec5,0x0fb615a0),LL(0x7991b38a,0xb1e55bb8),LL(0x3f719551,0x19309417),LL(0x0ba8f164,0x5179fd3c),L_(0x00000183),
+ LL(0x20ed0fcb,0xe26950f9),LL(0xa5916c61,0x8ac76960),LL(0x2ae5b02a,0x17149cfc),LL(0xda5eb1a5,0x5c8f4a8c),LL(0x9118595b,0x0004518e),LL(0x9e0cc88e,0x9dcbce69),LL(0xb0b05838,0x5edca7cd),LL(0x8f7a0d45,0x48f7b967),L_(0x000000c6), LL(0x773e3080,0xd9ebc5ab),LL(0x32f8567c,0x92748ad1),LL(0x2f890896,0xd6e0eb81),LL(0x83d0c649,0xdc173290),LL(0xed13cd26,0x6815ffda),LL(0x775e539d,0x727168b4),LL(0x09166ff7,0xbfad2565),LL(0x7a36c1d3,0xa58e9174),L_(0x000001a8),
+ LL(0x46e6e936,0xf2627126),LL(0x96d6c787,0x7ee8f552),LL(0x6540e78b,0x53eb4432),LL(0x2fb88504,0x073a9cef),LL(0x0e4739b6,0x9bbfb39a),LL(0x5b6532c1,0xbec805ba),LL(0x4331c495,0xedb74df4),LL(0x002e8ec8,0xb24b19d3),L_(0x0000014a), LL(0xcbd7ba6c,0x4bae18ce),LL(0x3a66d73d,0xa9e818b4),LL(0x5a439da7,0x422e109d),LL(0xe2bd60c3,0x71574884),LL(0x482785ad,0xf6bd330b),LL(0x8c0c9a5b,0x6c8383da),LL(0x0007cc56,0x2a9a00bf),LL(0xa489783e,0xd0b67256),L_(0x00000090),
+ LL(0x9d4a8e40,0xd221fba2),LL(0xd46ad86a,0xfddda1e9),LL(0x14fcb5bf,0xf9686431),LL(0x60db0e24,0xb0468c5a),LL(0xa659be98,0x5c91bca8),LL(0xcabd0c78,0x1e072204),LL(0xd9453dfb,0x50ebbe04),LL(0x8aef77cf,0x599b2768),L_(0x000000f4), LL(0xb8b62e34,0x7872d194),LL(0x43334446,0xddbd4e1c),LL(0xaad0f260,0x42324117),LL(0x7d8cfb9c,0xbd6c92ea),LL(0x883e18f4,0x68768225),LL(0x72898dd5,0x59ac483a),LL(0x25923bd3,0xffec7082),LL(0x48de2e57,0x84d8a621),L_(0x00000136),
+ LL(0xf64d07f7,0x07a33d42),LL(0x4d434a03,0x8948a2a4),LL(0x03ccc6f0,0xbb8f90db),LL(0x6ff7592e,0x69af4969),LL(0x87ff2ae9,0xec7fca3c),LL(0x687414fc,0xd6cec6f5),LL(0xb3255410,0x9a9ae9c6),LL(0x961c9823,0x2da713ea),L_(0x0000010f), LL(0x4284bbf9,0x472d0237),LL(0x86ea89ac,0xd63ca5a6),LL(0x6cd552ac,0xe6161434),LL(0x2fb24ab8,0xdc07d107),LL(0x880d3677,0xd1833f7c),LL(0xd225c8c0,0x17c50635),LL(0x2bf84ae7,0xc1f8a219),LL(0x2e83c678,0xfc9d327f),L_(0x0000003e),
+ LL(0xbf7ea965,0xe0762dd1),LL(0x7e003dff,0xd60aa791),LL(0x62c54da8,0xfa92fc72),LL(0x21eaa7ed,0xff6dc244),LL(0x62c86ea7,0x29f82d5e),LL(0x68214737,0x535c6df4),LL(0xb69bc00d,0x494bda6b),LL(0xf34e2601,0xa37c7b33),L_(0x00000181), LL(0x1096ecec,0x12da1692),LL(0xcc5db4fd,0x2f945903),LL(0xc4f95586,0x15014cb4),LL(0xf70f6fbb,0x3d80e47a),LL(0x0a6967e2,0xadb489f2),LL(0x65a13ebe,0xa0094906),LL(0xa28958e6,0x9fafaa96),LL(0xda82221f,0xc7b75a31),L_(0x0000006a),
+ LL(0xbab5dfd8,0x59f2c453),LL(0xe3fa69de,0x0c9b2cc1),LL(0xb6318b0b,0x56b33c17),LL(0x2d5d399a,0x6dc3c1e9),LL(0xf08f8a6f,0x9e28633f),LL(0x51ffb7f3,0xf1fbcd43),LL(0x77388eef,0x9d013e8c),LL(0x953e5ebf,0x98e2766a),L_(0x000001e9), LL(0xbdbfd2f4,0x95e5a481),LL(0x017a31d1,0x1ef3e1ae),LL(0xb5b37267,0x8988b706),LL(0x748e8ba9,0x3916983f),LL(0x0e9de7d3,0x6e3e3c93),LL(0xe7e37cde,0xee4ca324),LL(0xae3cdd99,0x2fb6a772),LL(0x5fda48d8,0x470f3423),L_(0x00000033),
+ LL(0xa88f1006,0x32101e9d),LL(0xec995155,0xbc724136),LL(0x50786c7c,0x718458f0),LL(0x942d96ed,0xd4b44c20),LL(0xa25702b9,0xf245f9d1),LL(0x060c2adf,0xb57e7b0b),LL(0xb9d35bf5,0x7ec560d8),LL(0x06f41b22,0x66ddd256),L_(0x00000163), LL(0xe70f3385,0xbb3cf7d0),LL(0xaf72af3d,0xf5c80879),LL(0x24797994,0xcff4c536),LL(0x60ff916d,0x9be0e09a),LL(0xab9b1069,0x069c4c8f),LL(0x4df20300,0x1f6d9a1c),LL(0xe23cffcc,0xe8dd8a18),LL(0xf91c6b69,0x08a175c4),L_(0x00000066),
+ LL(0x95fbe896,0x77feee72),LL(0x5cc61767,0x8880fcfd),LL(0x37faec22,0x520b4347),LL(0xb528d647,0x08c7efa3),LL(0xd89b3eae,0x7f34be1f),LL(0x0837f588,0x08e5ae1a),LL(0x1bd21d07,0xdd6b478f),LL(0x2fe84dcc,0xa5eab71c),L_(0x000001a1), LL(0x834a2481,0xe505f7b4),LL(0x2410091c,0x6e308dff),LL(0xc904e585,0x881cb270),LL(0x8e50edd4,0xb510da38),LL(0x1a9f6193,0xdd2ee182),LL(0x09d449a4,0x27fbd7e1),LL(0x8ae922fd,0x099fa1c5),LL(0xd2acc7bd,0xfa56f751),L_(0x00000073),
+ LL(0x0a20a859,0x0116816e),LL(0x589d2f96,0x148078e7),LL(0xaaa24c2b,0x28f3d3c2),LL(0x171935f6,0x48826cdd),LL(0x84d3a584,0x4e4018a0),LL(0x3aa25c41,0x20c105fb),LL(0xfbf31507,0x27ff55a5),LL(0x109df084,0xb2e48b26),L_(0x000000a9), LL(0x7739d21b,0xd2b7193f),LL(0xacf34cf4,0x3d27ea07),LL(0xab2591de,0x55176728),LL(0x3ceb2fdd,0x2cd960ff),LL(0x716fc560,0xb6983fee),LL(0x90fd8f68,0xb59a98f6),LL(0xe1bb13d6,0x476cf07b),LL(0x119c8087,0xe73f3c19),L_(0x000001d7),
+ LL(0x09bcac55,0xcc9f7ef1),LL(0xf3382f38,0x8ea6fbed),LL(0x08f8a371,0x93651490),LL(0x97354cca,0xa5d779cd),LL(0xd6ff00ea,0x17e28bc6),LL(0xcb936676,0xf2c7be3b),LL(0x4d0cca52,0xe6fcf731),LL(0xfe1b3242,0x64c801b7),L_(0x0000017b), LL(0x998790dc,0x13a64152),LL(0x616ab4fc,0x4787beee),LL(0x0f38f16c,0x8c14e216),LL(0x13dc0561,0x5144326b),LL(0xab46b249,0x49417c95),LL(0x0e55d9c5,0x87bf06de),LL(0x4c1e541e,0xc0681d93),LL(0x2c9b452b,0xa73364e9),L_(0x00000032),
+ LL(0x8a76574f,0x406e1518),LL(0xe6346b0d,0xb53c0598),LL(0xbdfc6afa,0x9ca435a5),LL(0x50f31dc3,0x9cc07001),LL(0x1695c15e,0x1fd27db3),LL(0x80905ca0,0x1aadf518),LL(0xad7428a8,0x926949ce),LL(0xff033643,0x07ed4c7c),L_(0x000000a0), LL(0x44dec074,0x2345ae4a),LL(0xe0173b35,0x3909da4f),LL(0x56f4144f,0xe4ed2bfd),LL(0x95f4401f,0x198f03a8),LL(0x1227b3e8,0x49d6d509),LL(0x249ec281,0xe4d920ef),LL(0xc12324e5,0x0d321781),LL(0x00c158a5,0x04e56106),L_(0x00000049),
+ LL(0xe0633553,0x3677eb41),LL(0xa7b03785,0x9c729924),LL(0x166ddf87,0xac9990ff),LL(0x9eba58ed,0x2f6b0f44),LL(0x29db9988,0x2b93f534),LL(0x7f4a4f14,0x92b08207),LL(0x695177a9,0xc1d4f27c),LL(0x1d65e607,0xa7f4bdbf),L_(0x000000c5), LL(0x1902ce34,0xc2625795),LL(0x99c8b2c8,0xb763d2c5),LL(0x4d39eb77,0xa75ff101),LL(0xd8865e52,0x2e31245d),LL(0x51ed16bc,0xfc608d17),LL(0xd782bd3f,0x441d7032),LL(0x8f51fc25,0x47fab287),LL(0xe871d582,0x4836c86e),L_(0x000000fe),
+ LL(0xec4b364a,0xfbb65219),LL(0xd42017be,0x359e7f30),LL(0x3fc15863,0x5c218315),LL(0xb1a3700b,0xf2cbaf1a),LL(0x040dad16,0xb6cd3ff6),LL(0xbf23d44a,0xd045f02a),LL(0x83befb28,0x4160599e),LL(0x467f747b,0xdf89f01d),L_(0x000001ac), LL(0xc40b618b,0xf743241b),LL(0x64d1d40f,0x576ba83f),LL(0x5ece3029,0x4dc64148),LL(0x47769772,0x6d3057fb),LL(0xd175fe83,0x0884e64d),LL(0x33875e4e,0x859df923),LL(0x481b7714,0x655fbae2),LL(0xdef5f5e2,0xbc699a44),L_(0x000001cf),
+ LL(0x7dce56e1,0xcfdef637),LL(0x3df3dfe4,0x35b39936),LL(0xa715e9e9,0xffaca630),LL(0x1011f820,0x33f64da2),LL(0x222d3bc6,0xc5987552),LL(0x523adab0,0xc95736a8),LL(0x787c715d,0x058fef5b),LL(0x66393c63,0xeecbe32a),L_(0x00000038), LL(0x5434ecf8,0x891f4ace),LL(0x7708ad40,0x51c5f6bf),LL(0xfe89ee25,0xc377ca62),LL(0xe6011a07,0xd24cd2ea),LL(0xd028c949,0xc094a1a4),LL(0xcf84ab99,0x1fed19d9),LL(0x036f7f03,0x0551c154),LL(0x37b50c32,0xede913d4),L_(0x0000012f),
+},
+/* digit=41 base_pwr=2^205 */
+{
+ LL(0x8936aa0b,0xb069d26c),LL(0xd3718b4b,0x2e3dd1d0),LL(0xeaaab400,0x26ebf3da),LL(0x315a34c4,0x04c67676),LL(0x1eb5f386,0x97e2eb1b),LL(0xbc318051,0x7226db1a),LL(0xf5e17eb3,0x109ad73d),LL(0x97d098f5,0xfde98d37),L_(0x000001eb), LL(0x5982cf08,0x48806f5a),LL(0x5f09406b,0xabd27505),LL(0x4db94328,0xb3c49a50),LL(0x38e43c40,0x08d386ec),LL(0x582b99e6,0x3b07fe47),LL(0x9089cf44,0x7186cac2),LL(0xac474a1b,0x22d982cf),LL(0x7b0368d4,0x59d409aa),L_(0x00000105),
+ LL(0xba6cb60e,0xf6d82cb3),LL(0x989499c2,0xf86e04fd),LL(0xcb66fb0c,0x35487bb6),LL(0x7e6257cf,0xdbe642cb),LL(0x7caa5a38,0x0132dd97),LL(0xcf0c7ff7,0x9fe7cec8),LL(0x8b24a15a,0x54f2a9f9),LL(0x52eb7ce9,0x66352c75),L_(0x000000a3), LL(0x47aec9e8,0x766fc554),LL(0xced0e96d,0x99065768),LL(0x493166bd,0x2b9adad9),LL(0x28be045e,0x222a08c3),LL(0xae70d305,0x4f554727),LL(0x61d8ec1d,0xfed1873d),LL(0x41e23d82,0x9f1c46d5),LL(0xf348b3f1,0xf15cb42e),L_(0x00000085),
+ LL(0x82d58220,0x488e8bdb),LL(0xaabd7c77,0xba1084c7),LL(0x67c7272c,0xca6ae765),LL(0xab82a151,0x1ca84a79),LL(0xa826c75c,0x06316ad0),LL(0xf3c64348,0x0dd7f329),LL(0xde3d6a04,0x3f33bd2d),LL(0x689c3e45,0x5cdf3c43),L_(0x00000090), LL(0x8c61be6e,0xb8361cc4),LL(0x624c3291,0xb8a7b622),LL(0x4c3e4e24,0x3c10547d),LL(0x37a21d5f,0xfa09bfc9),LL(0x407a153f,0x54fa325a),LL(0x5c7fa63d,0x8d13bea7),LL(0xfb7c45a4,0x2fe1e55b),LL(0x1a8b8531,0x15e6e55a),L_(0x000001d3),
+ LL(0x0246d25c,0xaf11f361),LL(0x0ca563e7,0xd246f5c0),LL(0x3dbda22c,0xc1f5f271),LL(0x1517fe92,0x5b82f357),LL(0xae558aff,0xc7e4811a),LL(0xfe93852e,0x0a7d7a0c),LL(0x80c69efa,0x5a9a571e),LL(0xcf0c8dc8,0x625dad5e),L_(0x00000141), LL(0xfa629e03,0x70463933),LL(0x97e91195,0x4d8bdb29),LL(0x1670ff63,0x3758d16c),LL(0xac0e352c,0xc3148942),LL(0xebf5c218,0x789d4077),LL(0x68df9269,0xedd91114),LL(0xc949bb1e,0x1c9e59bd),LL(0xa97ced00,0xd4c36694),L_(0x000000c5),
+ LL(0xa992abd6,0xe820b690),LL(0x598bc6c2,0x5618c97b),LL(0xdba62f4c,0x4cfa34df),LL(0x13d15fa5,0xe73cd8e4),LL(0xf2867cb6,0x0a135ff7),LL(0xc48f860e,0x8e8f76ce),LL(0xfdd988f5,0x3ad07476),LL(0xcb3a07b0,0x6690129d),L_(0x00000156), LL(0x59630aad,0xf07162de),LL(0x6a1c1e29,0x47eefc5f),LL(0xd695eb4b,0x69323852),LL(0xf81fbfef,0xeb840ba2),LL(0xe9a13161,0x99e6fb6f),LL(0x82ed26e9,0x0282e82e),LL(0xe498cc70,0x4b2c80ab),LL(0x6264860e,0xadc02c02),L_(0x0000012e),
+ LL(0x9f6dc20b,0x5c25edfa),LL(0x51ff9b10,0x2267d84b),LL(0x77cd497c,0xecebc8bb),LL(0xd41da61c,0x2e90633d),LL(0x0c2e11a1,0x61552b8c),LL(0xe7151d1b,0xfb4a699d),LL(0xa5898fdf,0x74297e23),LL(0x1a45323e,0xea3846f7),L_(0x00000192), LL(0xfe2e5183,0xf83ccca0),LL(0x0905c1e0,0xc44aa9ba),LL(0x0b1cf7ee,0xfedaabc5),LL(0xc2ab4a81,0x7f856296),LL(0xb2c2c3b9,0x7c377576),LL(0x110f594f,0x248077d8),LL(0x0920b595,0x7dcc7073),LL(0xa5e1a393,0x04275ba3),L_(0x0000019e),
+ LL(0x003d8cbe,0xf2309e12),LL(0x1dd14f55,0x6aafea42),LL(0xd6b6d08d,0x9f501238),LL(0xd63623cd,0xe37ddae1),LL(0x079b78ad,0xc658ecac),LL(0x62a7d933,0xffca3243),LL(0xf37ff209,0xefd095aa),LL(0x8e2c83df,0x1ba236dd),L_(0x000000b7), LL(0x5e0a6e24,0x2d2f9a76),LL(0x1a69b899,0xe6914b5b),LL(0xf621c0e1,0x8472fe93),LL(0xdd02cec9,0x92c73abd),LL(0x8f7b6745,0x3d6f438d),LL(0xeceedfc7,0x290f69f2),LL(0x98f33394,0x0ed2ebb0),LL(0x2536905b,0x9076c523),L_(0x00000010),
+ LL(0x5e0e658f,0xa4e263b1),LL(0xb787e362,0xf1a72f5c),LL(0xade21c8a,0x3468dd85),LL(0x51d6c477,0xd69f8f93),LL(0x4ea4254f,0xae15e0af),LL(0xdb86c982,0xdd836935),LL(0x98d3a2d5,0xdc232783),LL(0x5ffb0769,0xca75482c),L_(0x000000c6), LL(0x4c2ae6ec,0x043db3d9),LL(0x09230456,0x73642e7c),LL(0x6f9dd795,0x2a8692df),LL(0x2cd98576,0xa83e7242),LL(0x16ac0a49,0xa2e9e20f),LL(0xd3fe59cf,0xd0093708),LL(0x10a46920,0x10c84d0b),LL(0xa5bda12a,0xeef3a35f),L_(0x000001a4),
+ LL(0x8efb0b81,0x586ad55f),LL(0x8d830110,0xef747d77),LL(0xb3bf603e,0x0f99e447),LL(0xb48e1874,0x9da3060c),LL(0x389d594d,0x10ea78c4),LL(0xc7644272,0xd0f0eafb),LL(0xaf1ebb75,0x7afab007),LL(0xcc569782,0xe37efd54),L_(0x000001db), LL(0xebfccb68,0xf0400a4a),LL(0x474a550e,0x9ca24b23),LL(0xbf9aef56,0x5613d5ac),LL(0xab9d9c2b,0xb8267455),LL(0xbf868bc0,0xdb52868c),LL(0x909956ec,0x50005f46),LL(0x49928d00,0xac611000),LL(0x904632ee,0xeb25bd62),L_(0x0000001d),
+ LL(0xe148f242,0x2dd2babc),LL(0xa0bb05f4,0xd775106b),LL(0xbff23d31,0xf2919560),LL(0xe97c018c,0x44a63043),LL(0x4871d249,0x87f10683),LL(0x189ec6a3,0x0d74d0f1),LL(0x257dbb86,0xd0bbd041),LL(0xcc6bf0e5,0x0f7bd5b9),L_(0x0000010c), LL(0xad1a6c62,0x9dacf60b),LL(0xde935e97,0x77ba8de8),LL(0x73dfb2df,0xeb7f0da2),LL(0x64121541,0x18d0ee67),LL(0x024e0b69,0x7b37359f),LL(0x84be521c,0xea621f3f),LL(0xcd285848,0xf996c437),LL(0x6391d449,0x64593630),L_(0x00000129),
+ LL(0x6d04608b,0x807ec468),LL(0x80a83900,0xb77f8649),LL(0x5eb64b76,0x07caea9c),LL(0xc62e7f72,0x0ec672b0),LL(0x465c546e,0x378afe4c),LL(0x4b627b99,0xcc8adc18),LL(0x929649b3,0x8be7d42e),LL(0x967ccf92,0xd72c8057),L_(0x000001e7), LL(0xa6efca22,0x4f172127),LL(0xf3a643dc,0x9bf5975f),LL(0x4fe72fa7,0x90cb1c95),LL(0x4c4df518,0xba142ada),LL(0x799862f3,0xca2d035c),LL(0x68d4ff7c,0x98b9e83b),LL(0x7d49b932,0x13c2887b),LL(0x21991bff,0x550f6a51),L_(0x000000f5),
+ LL(0x881d7401,0x5a044cc4),LL(0xe24e7a25,0x768d2e23),LL(0xfaed9fe1,0x8f7705f4),LL(0x383ba961,0xd4a1b2c2),LL(0x435ea5ef,0xa2b9797e),LL(0x3b37f12c,0xe7f7c215),LL(0xb091bf0d,0xf2391054),LL(0xb7ba542b,0xf1e35e4c),L_(0x000001d9), LL(0x701310b7,0x9eb25738),LL(0x04099f3f,0x6dcb2223),LL(0x7798cb36,0x4d56786a),LL(0x95c47f22,0x919da3c8),LL(0xdaeee06f,0xb6abb8e6),LL(0xa660ceaa,0xa641a64e),LL(0xa1891535,0xc989455e),LL(0x627a7ec8,0x2de2ad9f),L_(0x000000f1),
+ LL(0x834e7f6b,0xa4f8a8ed),LL(0x8d0ab54c,0x7e835385),LL(0x86915b58,0x726730be),LL(0xba996ac1,0xe84c9776),LL(0x0ac27d99,0x59603bec),LL(0xbcd0e3fb,0xc7989ede),LL(0x1f1942c9,0xf303b7a8),LL(0x9f4547f6,0x7f3e4ae4),L_(0x00000115), LL(0x53ff8c21,0x01ac096d),LL(0xdb4b7aa1,0x69d169b0),LL(0x9723cdd3,0x802b82f6),LL(0x2051bc9d,0x256afff2),LL(0x3d4a1ea2,0x321bcf00),LL(0x7da3a724,0x26d669c5),LL(0x4ccffc5e,0x72d30cad),LL(0x212847aa,0x2089c0bc),L_(0x000000d0),
+ LL(0x7dca0317,0xad5ed722),LL(0xe8f1e786,0x8f7b7ae7),LL(0x30b8f677,0x9bd08de3),LL(0x03bfd2ff,0x1955b540),LL(0x599706c8,0xfa5ccf69),LL(0x66c7232f,0xa98d3152),LL(0xa531f734,0x35d69728),LL(0xa518ffd1,0x2fb7fbdd),L_(0x00000104), LL(0xc9f5e869,0x5ce90640),LL(0x7f70dba5,0x4d6b1828),LL(0xa187b391,0x636739ff),LL(0xc3f757a7,0x6788a6b6),LL(0xca8804a7,0xc2a0400e),LL(0x6dfa8acb,0x499f91eb),LL(0x8bd0499a,0x28af9210),LL(0x45056091,0xbfab21ea),L_(0x00000051),
+ LL(0x35af5ce4,0x33f86de1),LL(0x24f47c0f,0x237c0920),LL(0x0133d426,0x76b14d92),LL(0xdebe095d,0x989c257d),LL(0x7569cd5b,0x8d5f30b4),LL(0xeebd5dcb,0x7daee4b5),LL(0x381f623b,0x5a27d2f9),LL(0xc7fab47d,0x55d628c0),L_(0x000001ba), LL(0x87c8f748,0x04d7a15d),LL(0x0ac1e9b0,0x96216dea),LL(0xb1634ac6,0x3c5fec65),LL(0xf61cf904,0xab711a92),LL(0x3d592940,0x9bf5392f),LL(0x2eefb59a,0x96b616e2),LL(0x6a36ed7e,0x5c5c3417),LL(0xb15b4b78,0x0085b08c),L_(0x00000166),
+ LL(0x109924ed,0x46d2968a),LL(0x9147a28a,0xfe84ed7a),LL(0x49744c91,0x88e478aa),LL(0xfd889651,0x65a34f30),LL(0x8dc8d99e,0x21fd955c),LL(0x740206f2,0x7ea7cd99),LL(0xdedce892,0xd4f83ab9),LL(0xa7c26d23,0x35d566e8),L_(0x000001f7), LL(0x91728e18,0x0fa5f320),LL(0x3ad9d78b,0x760a4e2a),LL(0x65aca369,0x6812b50f),LL(0x46ee027e,0xdb993f3d),LL(0xe5a7e2b8,0x2acac076),LL(0x60290375,0xa179054a),LL(0xddbfa0d3,0xf87bff0f),LL(0xee0dfeef,0x197178fe),L_(0x00000059),
+},
+/* digit=42 base_pwr=2^210 */
+{
+ LL(0xbda60a63,0x090aae19),LL(0xcb3f577f,0xe7638c32),LL(0xf59abf93,0x34b2a6dd),LL(0x35486136,0x3c50db1d),LL(0x91b5e651,0x49476ec8),LL(0xf4bbb5bd,0x83b636d2),LL(0x3dd95f7a,0xd5071e3a),LL(0x77c02f69,0x2c32cef9),L_(0x0000017a), LL(0xc6860379,0x9c9ad3cf),LL(0x35f1eec4,0x4e50cb96),LL(0x26b39588,0xd703ca9d),LL(0x3bd6a0e5,0x3fe9036f),LL(0x08ef03a9,0x605b0ecc),LL(0x070faad2,0x6abd3a9b),LL(0xf3494eab,0x7fa81977),LL(0x164f95f6,0x63b07831),L_(0x0000012a),
+ LL(0x57205d81,0xe8f546e2),LL(0x442871cf,0x87afe8b6),LL(0xd5e346c5,0x748676ba),LL(0xa964afa3,0xca39baf4),LL(0xe1422f71,0x0e9e0a58),LL(0xd62c328b,0xd31cca18),LL(0x07714d71,0x75787f65),LL(0x810168e3,0xd69279ad),L_(0x000000ce), LL(0xb730f78a,0x509d6354),LL(0xec14ff7e,0xbeae80e0),LL(0x9793053f,0x019f7cc0),LL(0xb6b1fd1b,0xe4fca025),LL(0x44558d48,0x7ed4a037),LL(0x86992aae,0x0e2db1c4),LL(0xf0333757,0x557f4b02),LL(0x30117649,0x88191af4),L_(0x00000142),
+ LL(0x23e0df8d,0x58c8cbc9),LL(0x1732c3e0,0x3466783b),LL(0xf47836e0,0x4713b9a8),LL(0x79e1d15c,0xa517b03d),LL(0xefa174a4,0x63c15938),LL(0x49e8d766,0xea4a3245),LL(0xd01d6313,0xbc5db16f),LL(0x83758c05,0x98199196),L_(0x00000032), LL(0xbf271b78,0x3af2e11a),LL(0x60042746,0xa3ab648d),LL(0x79d1c019,0x5000aba1),LL(0x253b9712,0xd9239c9e),LL(0x0e930854,0x85a1b532),LL(0xab5ac676,0xe00c287d),LL(0x57eaaede,0xe2d767a0),LL(0x43b264bf,0x2e801980),L_(0x000000ef),
+ LL(0xd715e37a,0x436c808c),LL(0x8615d6bb,0x78232591),LL(0x58c6e6b2,0xca6d68ce),LL(0xa40e8f75,0xc4c37875),LL(0xc01da381,0xbe962879),LL(0x58a155d9,0x5dd3d4cf),LL(0x847d5de7,0xee99fd85),LL(0x8f7f76b4,0x8718ee15),L_(0x0000005a), LL(0xd4c9f66a,0x5302a76b),LL(0x647086e4,0x1b679cdf),LL(0x93b84a7e,0xd412c242),LL(0x92243bc4,0x519ccba0),LL(0xd5c3c375,0x585371f2),LL(0x8ba3d06b,0x90f4c0f2),LL(0x1daa7685,0xf573b409),LL(0x6342e78b,0xd831b73c),L_(0x00000099),
+ LL(0xf1f9c0d3,0xf2f4b2d5),LL(0xbf3b998b,0x6f543cfb),LL(0x0d744317,0x25e2b138),LL(0xda23008b,0xc81ea703),LL(0xa6df5808,0x322e0c8c),LL(0xdabad20e,0x654aa6ef),LL(0x3a6c3719,0x64c8d439),LL(0xf75f2e54,0x0e935567),L_(0x00000017), LL(0x50778fd6,0xbd5f5197),LL(0xcbe15e1b,0x16df4a37),LL(0x36cef226,0xb2ae2273),LL(0xfaaea71f,0xb8561402),LL(0x40dd546c,0xed28c500),LL(0xa3b837f1,0xe3cde0fb),LL(0x7315fb7b,0x893aced1),LL(0x828da346,0x811cfb0b),L_(0x00000120),
+ LL(0x136ca413,0x7447323e),LL(0xc3f1d660,0xfd177667),LL(0x0d79142a,0xeab4ffc2),LL(0x1d798fb8,0x8d6c7790),LL(0x65d4f135,0x6db0f7cc),LL(0x3bd9feb2,0xeb9db217),LL(0xf714d78c,0x48ba0ac8),LL(0xa3ca23a0,0xe83bb0ce),L_(0x0000013f), LL(0xe69b95fe,0x3047872d),LL(0x2f7264f0,0x968482d0),LL(0xedcd1afb,0x4afd067b),LL(0x21685d4f,0xd2b0a788),LL(0x8c222e50,0xee57ad29),LL(0x86dde86a,0xb70520ec),LL(0xb933bc16,0x0ddb5005),LL(0x16594b1c,0xca06f19c),L_(0x00000169),
+ LL(0xbbca315f,0x5bb1b6c3),LL(0x0036d456,0x7469a0dc),LL(0xd48baaad,0x017a26b6),LL(0x27d8ab41,0x02fa6e32),LL(0x15045224,0x0c7090d4),LL(0xdb62af96,0x85ab46be),LL(0x89adad56,0x45b4363b),LL(0x449f71e2,0x1636a279),L_(0x00000056), LL(0xf8377adc,0x4bc2c5ac),LL(0xa5878a73,0x58a681e7),LL(0x18006b8a,0x8426f06f),LL(0xacb84fbb,0xf862f722),LL(0x32b8466b,0x041f4d43),LL(0xe59c6ec4,0xac4fc1fd),LL(0xda852fdc,0xa52e3ee8),LL(0xf6e11234,0x001b1376),L_(0x0000012c),
+ LL(0x9ddcb7fa,0x44679a2a),LL(0x8069c471,0x3be369b3),LL(0x0de84dbc,0x82ca8262),LL(0xd5e1f28d,0x89e87798),LL(0xa205de89,0x84051f10),LL(0x5c22abac,0xc26a5b9c),LL(0x99bba5fa,0xdd74ecbb),LL(0x359fa6c2,0x94787253),L_(0x0000013f), LL(0x2e2ac09a,0x2ac08c57),LL(0x71535b42,0xc5c720e0),LL(0xa7bd1c3d,0x18f95966),LL(0x0a4b0c9e,0x49a62e3a),LL(0x2faa6c64,0x4f85595c),LL(0x529cbdd4,0x7bb9f75f),LL(0x93955cf4,0x50f46a64),LL(0xdefa5af6,0x84215622),L_(0x00000105),
+ LL(0xedc6f59f,0xa294c7f6),LL(0xa2e1643a,0x5eabc120),LL(0x41a385d8,0x0ff38f95),LL(0x6b429a90,0xa608b840),LL(0x5f0ae2e2,0xf1d02f3b),LL(0x9b8946a7,0x2525fc8f),LL(0xc76a7386,0x49cc1359),LL(0xca2a7f4d,0x40152b0a),L_(0x00000034), LL(0xbe8aed8e,0x60d4bdb6),LL(0x86d41413,0x937209e4),LL(0x3c716d10,0xf538d0a6),LL(0xa096c4bf,0xd3c035a2),LL(0x04283ffd,0xb280d9ae),LL(0x4964e73c,0x3893b1c0),LL(0x75d67682,0xc2768753),LL(0x005e5f85,0x0d82ec22),L_(0x00000103),
+ LL(0x8d283446,0x498b2996),LL(0x86abf4d3,0xfde09c12),LL(0x2dfa3c50,0x0e695616),LL(0x29f9b0d2,0xb697398e),LL(0x48792e33,0x568f5e3a),LL(0x7493cab0,0x6ee081c2),LL(0x657411b7,0xb996a914),LL(0x6bba20f2,0x9947f5c4),L_(0x0000006c), LL(0xcc21ceb0,0xf3a30195),LL(0x04798bbc,0x8327746a),LL(0xa982d5b1,0x2b585e77),LL(0xd3a733ef,0x8fc21ff1),LL(0x683b1710,0xf43ba5ab),LL(0xca115f83,0xeb98616c),LL(0xa31d56f2,0x89236402),LL(0x2fd3f97b,0xd91441e5),L_(0x00000043),
+ LL(0x71daa8fc,0xcd75aec1),LL(0x1ba03e2e,0x3c07bc51),LL(0x57185304,0xca3e327c),LL(0xb1122c0c,0xfb82f00a),LL(0x4ab98ef9,0x143ac664),LL(0xed517312,0xb67dba09),LL(0x3be9088b,0xf6425b41),LL(0x9abf3748,0xb19d9dad),L_(0x000001fb), LL(0x58516a7c,0x937668fa),LL(0x1a5b0042,0xee40f983),LL(0x70389a31,0x7bddb2f1),LL(0xc5b229d2,0x5e0553f6),LL(0x5a0d088b,0xeae9e1a5),LL(0xf99b1b9a,0xcda92dcb),LL(0x5ef8199d,0x7e285536),LL(0x50942301,0xef8656fb),L_(0x00000141),
+ LL(0x276df335,0x996f91a7),LL(0xbba5b9b6,0x8be8a5f6),LL(0xa13311be,0x1f26ef24),LL(0xfe2a95d5,0xee11bab7),LL(0x684a38b4,0x3233a4f7),LL(0x2ff2caf9,0x3771e476),LL(0x50176c17,0x5e24adb0),LL(0x7e6a96ea,0x59a02a9e),L_(0x000001d1), LL(0xd1540fbe,0x9f444fde),LL(0xc5cef3f3,0x6ce01534),LL(0x25f5b460,0x1d8a8861),LL(0x37e2199b,0xa77157b4),LL(0xea994fb5,0x599e6b65),LL(0xa91dfcae,0x599cf24d),LL(0x48964c92,0x5d9f0d72),LL(0x171d2191,0xc2a827ac),L_(0x0000019d),
+ LL(0xc7cc5161,0x5e82226c),LL(0x71009ee1,0x4bc92633),LL(0xa4a6f458,0x4b11e8ce),LL(0x27cf64fc,0xa35c3f83),LL(0x247f343b,0x08c548d2),LL(0x5b9231c1,0x8238f13a),LL(0x98e33dc3,0xb0046a52),LL(0x4e6220c7,0xf590670d),L_(0x00000160), LL(0x60df1456,0xc43a8ffe),LL(0xb03d69e6,0xf8867110),LL(0x760c6b46,0x1cbd5f52),LL(0xbfe67f56,0xee1342df),LL(0xf514ecfe,0x7fa3d377),LL(0xeacf358c,0xb7abe871),LL(0xf91db13e,0xf63ff9a1),LL(0xfd2c6720,0xc9c8d118),L_(0x00000048),
+ LL(0xfcd4da3a,0x01aa7fce),LL(0x5590f28d,0x891c86bc),LL(0x3fde019f,0xc74e219a),LL(0x47bfd522,0x17dfc33e),LL(0xcd902b91,0x1e1f0327),LL(0x19b7adb8,0x46fb1987),LL(0x4aa71b67,0x7c133f73),LL(0xc87d00cc,0x8fc4f89a),L_(0x00000179), LL(0x15897652,0x484cb85c),LL(0x6d5a49dd,0x08cbe8b3),LL(0x0398f1d3,0xc2570a5f),LL(0xcf0588fd,0x75aff023),LL(0x9a086ca6,0x7d708565),LL(0xf0ab637b,0x478e9220),LL(0x4da37998,0x79f64eda),LL(0x9f09ba72,0x8789e929),L_(0x00000049),
+ LL(0x3cf6f674,0x4d0bf9f0),LL(0xe45ebcfb,0xf49cc75a),LL(0xf02c0b22,0x198a7df8),LL(0xce88b254,0x798e3ccc),LL(0x452bc12b,0xcb1f3272),LL(0xf7e1eeab,0x204a39c3),LL(0x03001038,0xbf6a035b),LL(0x8bb9d05a,0x464b8506),L_(0x000001e2), LL(0x519b1e12,0xff47d24d),LL(0xecef22c6,0x1e6f218f),LL(0xb9743d3d,0x7fe5e0b0),LL(0x0de37bec,0xb84cd289),LL(0x2f608290,0x640acc09),LL(0x0325466e,0xf1f489de),LL(0x523a4381,0x5a2fd923),LL(0x78483089,0xc78d0d2b),L_(0x0000017d),
+ LL(0x51ca4b89,0x0c9b5cc2),LL(0xcb500f85,0xb99572d6),LL(0xb82356c8,0x9eef8952),LL(0x575ebe20,0x607df288),LL(0x389253a4,0xa421a6b3),LL(0xd513ff9b,0x99f0eb4d),LL(0xc84b56b7,0x253ed789),LL(0xe6a5c4d4,0xbbc17293),L_(0x000000ab), LL(0x98ff217c,0x6930ae01),LL(0x8abc5898,0x12fd1e77),LL(0x94fad4d8,0xf2ff5095),LL(0x6733dcce,0xf10fab65),LL(0x36afad83,0x17d75c59),LL(0xd99578f7,0x8a1a313c),LL(0x16027411,0x0bcd7387),LL(0x46078ec4,0x30a61f54),L_(0x0000001e),
+},
+/* digit=43 base_pwr=2^215 */
+{
+ LL(0x011cfb71,0x25479ac0),LL(0x785ff67b,0x2f48bcdb),LL(0xc454fd25,0xf62da267),LL(0x4e460f65,0xac759a15),LL(0xe6fa21e0,0xdb56d239),LL(0xfa07770b,0xb91d7cce),LL(0xfe275a8d,0x68f07f46),LL(0xa1529273,0x477f1527),L_(0x00000196), LL(0xd7969a0d,0x36f066b2),LL(0xd81a759c,0x3a664061),LL(0x929c3e1c,0x5ba8c41d),LL(0x033ad63b,0xfdb5a8a4),LL(0xf387b665,0x2b433c84),LL(0x1e742e2c,0x4f2d4d93),LL(0xb030d2de,0x8d631141),LL(0xe3845c24,0xac94286d),L_(0x000000e9),
+ LL(0x650c039d,0xab7b6907),LL(0xb4f64d44,0x26b42700),LL(0x0576d051,0x2c72c1e2),LL(0x70d2ad71,0x4322ae9e),LL(0x315f4631,0x89904b57),LL(0xef02dfb1,0x24905a45),LL(0x8a7b4701,0xde26cce6),LL(0x5f0db2ca,0x183ba4ac),L_(0x00000004), LL(0x3a42cd20,0x6fcfeb99),LL(0xee9920d8,0x1cc7f2d2),LL(0x46bdb299,0xb71c2095),LL(0x1516a6ea,0x99e62c53),LL(0x95f1492f,0x197ae770),LL(0xe95c2cf5,0x013e12e8),LL(0x2aad7be2,0x60b78cb7),LL(0x0e70b967,0x48ef0032),L_(0x000000aa),
+ LL(0x7b152b81,0x2adc31d1),LL(0x1cf4d989,0xf817919d),LL(0xea745ea9,0x86caaaf3),LL(0x035cfaca,0xbd62e874),LL(0x533bc33d,0xb1acfb8f),LL(0x2cc2ce8d,0xb212b5b7),LL(0x5b9ba7f0,0x350192b7),LL(0xce04c178,0x39e7b1a3),L_(0x000000bb), LL(0x88563e49,0xaa946b95),LL(0xe4c90142,0x0e515aee),LL(0x5062c2f0,0x99e87538),LL(0xcd39192d,0x52eb943e),LL(0x0c893238,0x0201b73c),LL(0xfbac7e1c,0x1ab36a78),LL(0xc6d833b4,0x58d01a7c),LL(0xe359c01f,0x84ab5208),L_(0x000001b6),
+ LL(0x7511fae2,0x9afd1135),LL(0x428434f6,0xab322fa2),LL(0xcbe5e3de,0xd89f361e),LL(0xc1b08880,0xc1fbd2b7),LL(0x6a50aa80,0x9e40537e),LL(0x7fdf104d,0xd4f51df5),LL(0xe707164e,0xb78a6cfb),LL(0xd887e3d0,0x0a3d0f36),L_(0x0000012f), LL(0x96365e7f,0x129d87d9),LL(0x64aad3c6,0x2952186a),LL(0xf8224d3c,0x45209284),LL(0xc689c1d4,0x2c194d7b),LL(0x03f44aec,0x0e7c6b2d),LL(0xf18a57e0,0xe28c9eb3),LL(0xfac4981d,0x4b8b7de6),LL(0x55215906,0xb3077009),L_(0x00000134),
+ LL(0x3a3a13a5,0xbeace249),LL(0xc22b9755,0xd063181b),LL(0x27e6ebf5,0x80b61753),LL(0x0eb1c7f3,0x8b95d0ba),LL(0x791e9667,0x5d4d0f0f),LL(0x5f5189e4,0xdd28c3e4),LL(0x9162d716,0x2eca4da1),LL(0x40913d2a,0xa84739de),L_(0x000000ee), LL(0x85fea8d0,0x3c004f10),LL(0xa6620dad,0xb3680a4e),LL(0x31990981,0x8a6964de),LL(0x3b4c2f57,0xd1986197),LL(0x3b4fdf64,0x5bc5cf00),LL(0xea0f7010,0xbf1dee68),LL(0x0d263581,0x3edd2000),LL(0x8ba6db98,0xac05f412),L_(0x00000043),
+ LL(0x79147285,0xbe273f4c),LL(0x71c0654b,0xec66bd4d),LL(0xdd0505e9,0xed4771b4),LL(0x4c891619,0x316ff12d),LL(0x821a0542,0x0c65ede4),LL(0xa23cffae,0xb678c0c5),LL(0xbf05e02d,0x32bbf48a),LL(0x91ff4f9e,0xe3d08326),L_(0x0000018b), LL(0x944ec586,0x5c351b2d),LL(0x00e74766,0x3939c0c8),LL(0xfe310474,0xb780a9b2),LL(0x5e63ba55,0x11cfcec0),LL(0xc11119c9,0x322972c9),LL(0x0c8e0043,0x35f5ba3b),LL(0xa0946bc2,0x222b78da),LL(0x622257dc,0x2be73a82),L_(0x000001e9),
+ LL(0x2b9dae76,0xe9b24e64),LL(0x1b491ac4,0x9716bae3),LL(0x162c28a6,0x192c7196),LL(0x00752a8a,0x10883cfa),LL(0xf0af2cfc,0x77a5388d),LL(0x5f1ffb0c,0xebf78534),LL(0x49abf2a7,0xe9343bc9),LL(0x54bcef89,0x3a94d690),L_(0x00000175), LL(0xa864f2a7,0x1bdde3a5),LL(0x0362ffa7,0x45782cba),LL(0x113c94f8,0xb94efa60),LL(0xb5969326,0xd2b826b0),LL(0x92ab6bc9,0x228e2d7d),LL(0x1f6dc09e,0xe5f07f40),LL(0x3371efd7,0x87e6028d),LL(0x90fcb8fa,0x35577bbe),L_(0x000001a7),
+ LL(0xcf53147b,0x97a83e73),LL(0x0fba4048,0xd11d0f51),LL(0xfcf9128e,0x6dfde4ab),LL(0x095c92d5,0xbcfa2a47),LL(0xff3cd334,0xa5b6f4d4),LL(0xa2490038,0x5df73169),LL(0x663bcbc9,0x41aba80e),LL(0xa47769e8,0x45877c64),L_(0x00000076), LL(0x2104365a,0xa582938f),LL(0xc439a531,0x43321e6d),LL(0xf7387146,0xee861253),LL(0x52424fe3,0x13590283),LL(0x0a676302,0xe71ab2ae),LL(0xa837702f,0xf460396c),LL(0xf7bce515,0x01882e04),LL(0xd9362399,0x899edf93),L_(0x000000c5),
+ LL(0x9bd2b2b9,0xc33456a5),LL(0x6dcdccc4,0x97a89ed3),LL(0x865bca41,0xbdb83821),LL(0xf50a59bc,0x46a8f43a),LL(0x47c10299,0xbaa69204),LL(0x03139274,0x1da8242a),LL(0xa899da5a,0x49b0bcc8),LL(0x2caf68d5,0x7ba862a8),L_(0x0000003c), LL(0x4dc88c23,0xc1c2ff36),LL(0x896e10e9,0x10c6c1db),LL(0x7a488fa2,0x58161012),LL(0x6b4ceefa,0x5188acf7),LL(0xea1e2f11,0x72073c50),LL(0xefaa1151,0xe696e16a),LL(0xd65f38a5,0xe4dea3d4),LL(0x6710e2d4,0x849ce811),L_(0x00000165),
+ LL(0x6cdc17de,0x2c374c6c),LL(0xe3454080,0xbd6a5b20),LL(0x337b0f58,0x40246c40),LL(0x31d7aff9,0x49292d34),LL(0x01dba6a8,0x37486a26),LL(0x41a0f90b,0x12d61cbe),LL(0x782067dc,0x3033f828),LL(0xebc39fcd,0x519d9486),L_(0x00000109), LL(0x026818da,0xf42673be),LL(0xf2e2739e,0x40e906d3),LL(0xd8ecf6f0,0x37b0e1f1),LL(0x5c024d38,0x6708c065),LL(0x3417cf59,0xc5788208),LL(0x17020946,0x8942a103),LL(0x7086a405,0x279752bc),LL(0xbd8d65b0,0x96d15474),L_(0x00000127),
+ LL(0x9abc3d40,0xf756f14e),LL(0x748874bf,0xf9192ae1),LL(0x50f7dc14,0xfb847314),LL(0x424a6e96,0xd7141cc9),LL(0xe0539e22,0xefedb9cd),LL(0x7f5ec1a8,0x7abbcc13),LL(0xe6446e18,0x0050521f),LL(0x3706445a,0xedca13d0),L_(0x000001b1), LL(0x2f62e709,0xa5e744f0),LL(0x8279d454,0x8aad355f),LL(0x03801f2d,0x88a334e7),LL(0x30342602,0x34cb8228),LL(0xed180e75,0x6d4243df),LL(0x5bbbe349,0xd0752a72),LL(0x0977e643,0xd5658e43),LL(0xf968b621,0xa8dfe2a7),L_(0x0000009d),
+ LL(0x3757bccc,0xce9d3ef4),LL(0xb10a83cd,0x021aa7d7),LL(0x804bf03e,0x79a14071),LL(0x09822fa4,0x1adecf50),LL(0xec4d2fe9,0x8fc3b061),LL(0x479fbad1,0xffe82ea4),LL(0xb70c5762,0x25b0bed7),LL(0x8a667da4,0x6f5ffd5c),L_(0x00000042), LL(0xd836c22b,0x9beeade4),LL(0xd28e01a7,0xd7c41634),LL(0x124715f6,0x83d30d7e),LL(0x8e33c4f9,0x2ee2bdb2),LL(0x5442a068,0xa18cfc1f),LL(0x68390a48,0xa6cb1637),LL(0x44abd789,0xa8ecc588),LL(0xbd6682cb,0x8ea17383),L_(0x000000ae),
+ LL(0xd8199c9b,0x86b3c132),LL(0x77f229f5,0x1a49a2e0),LL(0x6f74d75e,0x15ed7662),LL(0x8dd2368b,0x7d799783),LL(0x313152ab,0xa636aa73),LL(0x925319e7,0x2947bd12),LL(0xacf4c559,0xb2b023d8),LL(0x0322c16a,0xc8a967d9),L_(0x000001c4), LL(0x8a09b0a3,0xb1025eae),LL(0x8ae5f654,0xf817133f),LL(0x081d6d59,0xea1aa5d9),LL(0xe9090ae2,0xe61c2d54),LL(0x0784905d,0xf542221b),LL(0x5789e25c,0xa9b09c19),LL(0x1b8dadc2,0x7d4f5221),LL(0xabe01efb,0x446d7ebe),L_(0x000000da),
+ LL(0x8fc36944,0x1a86a356),LL(0x88a55222,0xa9332303),LL(0xfc1f186c,0xf8c2ca0c),LL(0x1f24d4d5,0xa82a6905),LL(0x753ac024,0xb6761f2a),LL(0x8a0fe4e0,0xb4a03fa9),LL(0xd1d20586,0xcb862d5f),LL(0x2bcb9949,0x48673692),L_(0x00000144), LL(0xa285574f,0xb1192295),LL(0x23eb5f8c,0x2436f1d4),LL(0x3f4febd2,0x842f6ae2),LL(0x0f1f266f,0x8091b264),LL(0xee94d349,0xf4561f25),LL(0x6f4a16f1,0x6e303b52),LL(0x80ed7ffc,0x08bbc14e),LL(0x6f957c19,0xb48f99ac),L_(0x000000a1),
+ LL(0x73d10fa8,0x1b164c81),LL(0xc855b452,0xdd4617a8),LL(0x9be0c270,0x94a57ba1),LL(0xb28b6ed5,0xc1383246),LL(0xc74bc4a3,0x17910967),LL(0x2a2a0e34,0x8aab9202),LL(0x93b8d150,0x122babf8),LL(0x1dffa251,0x32612c73),L_(0x00000069), LL(0x5fd7acd3,0x906979fc),LL(0xf242bd9e,0xc7fe62d6),LL(0x59507727,0xa94a1beb),LL(0x966af710,0xe7344f5a),LL(0xd397803f,0x5b835cef),LL(0xcd196fb1,0x1ca9e8ac),LL(0xe701eb7e,0x09bdf0a9),LL(0x521354ea,0x16f0f7c2),L_(0x0000018d),
+ LL(0xc389a398,0x92326c61),LL(0xc80b1e6a,0x0b658149),LL(0x23067f4a,0xd5cf4f64),LL(0xc96735ae,0x1cf4dd22),LL(0x43cb53c3,0x4b478ba1),LL(0xb353c721,0x3b1bbb1e),LL(0x46f2e84d,0x7b5aa79b),LL(0x4a4fa3d6,0x0db507d4),L_(0x000001a4), LL(0x5ad31f07,0x5402e45d),LL(0x19f0b31e,0x55650578),LL(0x214cdf81,0x3fd50ebe),LL(0x3efd8e06,0xd808dee6),LL(0x0c82d63a,0x39ccec30),LL(0x39dfd0ee,0x5249be7d),LL(0xb6c788e8,0xebe9271a),LL(0x7ffa3cad,0xe23c5a72),L_(0x0000019e),
+},
+/* digit=44 base_pwr=2^220 */
+{
+ LL(0xfd61361b,0xf3125658),LL(0xd69b66e1,0x96b636a1),LL(0x0c7ac9e9,0xe69b9e47),LL(0xf9bb3617,0x1b1e895b),LL(0x12050a8c,0xfa5a11a5),LL(0xa2492213,0xc2919aff),LL(0x08d55c3b,0xc4be1b10),LL(0x6dcf2c08,0xdd2f7392),L_(0x000001c7), LL(0xb4fb57fd,0x6ce4aac2),LL(0x6292f827,0x9277cab1),LL(0xc90518a9,0x144e677d),LL(0x0432d015,0xea4408ab),LL(0x35d9214e,0x49b20eb2),LL(0x2560b8a6,0x48a45d8a),LL(0x37dd269b,0xcecf7d1d),LL(0x71a47616,0x7df8d49d),L_(0x00000152),
+ LL(0xa734d86d,0x475ac257),LL(0x324330b9,0x3a9d12f1),LL(0xcecaa5dc,0x048adf08),LL(0x33641cc3,0xbfcc4fdc),LL(0xe40352a6,0x76f01bad),LL(0x6e93dac8,0x5bd7dfb0),LL(0xc0e1ca53,0xb21d4494),LL(0xb51965b8,0x20e57219),L_(0x00000031), LL(0x46f90e9b,0x76cb857a),LL(0x1b517407,0x31907caf),LL(0x38843e17,0x37770400),LL(0xb3c14ab5,0xb47cfe14),LL(0x58c99d12,0xd18daa18),LL(0xd4551590,0x84db2817),LL(0xc4d8f7ef,0x5a8544bb),LL(0x752b595c,0xed331ee1),L_(0x000001cf),
+ LL(0xa8718c9c,0xd016412e),LL(0x3d459798,0xc7059eeb),LL(0x07afd251,0x7f6e9107),LL(0x6ae603f5,0x7c29b336),LL(0x1f1d424b,0x1f08b6d1),LL(0x06f8f459,0xfa0b1884),LL(0x6dfa46f4,0x22a09ce4),LL(0x1ee6193a,0x050edf3e),L_(0x00000067), LL(0x59ef37aa,0xbc282a7b),LL(0x0490844a,0x16eca5fb),LL(0xfa414af6,0xdd42a4a0),LL(0x748c915e,0x6f1ab810),LL(0xa3d4af5a,0x31ef86bb),LL(0xe768aff3,0xd8ffc35c),LL(0xb6c4e536,0x6e278d36),LL(0x8f61ddd5,0xb2c50623),L_(0x0000019f),
+ LL(0x108204ec,0x1febacf8),LL(0x0a0c3a40,0xa1fbe66e),LL(0x2570b727,0x343654b7),LL(0x5299d8ae,0x83e0647b),LL(0x158b323a,0x3d86ee0d),LL(0x758534d1,0xe946224b),LL(0xcb77d0eb,0xe9a38321),LL(0xb845ec39,0xd329eea9),L_(0x0000003f), LL(0x4421327c,0x13edfc50),LL(0x0c4b9b9c,0xefee69b8),LL(0xce07a452,0x110b9736),LL(0x2779de28,0x810433de),LL(0x19cb506b,0x1468d237),LL(0xd2930983,0xb54615ee),LL(0x895d360f,0xa6a72f30),LL(0x2a939f9f,0x0f67c082),L_(0x0000019a),
+ LL(0x613613a0,0x41479bab),LL(0x64b3ba28,0xae853dfe),LL(0xd7d5f8f3,0xeddc5d69),LL(0x3c023c98,0xc2af1c91),LL(0x5e51c064,0x3e811beb),LL(0x3e28caf2,0x297f73a1),LL(0xb2c63f7a,0xe92c2db1),LL(0x272783c6,0xa58f0869),L_(0x00000175), LL(0x4d9e33e7,0x2930859a),LL(0xf96d2a6e,0x21c82319),LL(0x234b3a37,0x99962855),LL(0xe1e952c7,0x834c3fcf),LL(0xa9fff526,0x2d66290a),LL(0xc1aa8293,0xd0618b6f),LL(0x65d795be,0xd8f51b17),LL(0x7ad3a784,0x61d170fa),L_(0x00000185),
+ LL(0x6fb99ec5,0x5b03ab3b),LL(0xdf673d70,0xd514df02),LL(0x97926d51,0x68bd9794),LL(0x7f3cad99,0xa7bbd732),LL(0x807b8edf,0x1dee6527),LL(0x9072fc5c,0x6db8f170),LL(0x8a088d03,0xfad430f3),LL(0xf3373c9b,0xac0bdf9d),L_(0x00000068), LL(0x562932b2,0x98ce826d),LL(0x15d43a46,0xd64992b9),LL(0x0e1471fe,0x12cf137e),LL(0x11a1c256,0x19907c68),LL(0x97e5e746,0x5dcff6a5),LL(0xb4d10f45,0xfe503afc),LL(0x2daf8e96,0xbfaf4738),LL(0x51a1e9e2,0x47ef585e),L_(0x000000ca),
+ LL(0x57c899ed,0x309ddc9f),LL(0x000b8805,0xf9ec0561),LL(0x61be65ad,0xdb755990),LL(0xc6ac2e8b,0xf8f392c7),LL(0xc546a9f7,0x709f90fb),LL(0xaa4eb38f,0xb81ee256),LL(0xe3bb73d5,0x920cd9ff),LL(0xe54f7913,0x8fd7ead1),L_(0x000000a5), LL(0x6fe432ea,0x7d99d437),LL(0x42314efd,0xecbf2570),LL(0x0d11bf19,0x1a26524d),LL(0xc070e881,0x80db7170),LL(0x69bb46ac,0xed697625),LL(0x6e7f5dec,0xf5d4f199),LL(0x35c855b1,0x63c6d1bc),LL(0xcfaf131b,0xfd69fb7f),L_(0x000001d9),
+ LL(0x4c7faf89,0xe289504c),LL(0x7c67c701,0xc21c143d),LL(0x51104808,0x429b8b10),LL(0x8547ea3f,0x643f8b1a),LL(0x442d1597,0x8e30463a),LL(0x1322c20d,0x9700b9ca),LL(0x12313e31,0x53c7c741),LL(0x429e582d,0xebcdb21d),L_(0x000001bf), LL(0xa6df174d,0xf30a9c65),LL(0x734a8421,0xcca7bd70),LL(0x12f441c1,0x42e970e9),LL(0xda35c856,0x990f29b0),LL(0x7fbc6108,0x201a5ca8),LL(0x006704f9,0xb4ba5b8a),LL(0xd79c4200,0x5332f15d),LL(0xaa2c5720,0xbc6411dc),L_(0x00000184),
+ LL(0xa1d7fa9f,0x366d01e5),LL(0x0b24e344,0x05318d76),LL(0x9ed7c092,0xd4cb6907),LL(0xdf8af7fc,0xe97d11bc),LL(0xcad57852,0x4e593cff),LL(0x966648ef,0xeb5229ac),LL(0x0513e9bd,0xc0b6887d),LL(0xc4457c4d,0x8e5e6129),L_(0x0000001e), LL(0xe56e3c4a,0x33909c43),LL(0x6b6ecd98,0xab630f3e),LL(0x58c96e3b,0x604359ea),LL(0xa6fb1a48,0x4c23bc41),LL(0x01509a8e,0x735b6fd3),LL(0x55538a0d,0xc1e6f88e),LL(0xca10627f,0x43b7d098),LL(0x7a0bef75,0x237cd9ab),L_(0x00000034),
+ LL(0x382d4ce3,0xd57fa9f7),LL(0x39f2057e,0x5a8fe9d0),LL(0x819adb6c,0xf4dd28c4),LL(0x26c97625,0xa0db7a3e),LL(0x6c864ae6,0x8bee872f),LL(0xfd35c90d,0x42a5de0c),LL(0xf6b8c643,0xa0d68766),LL(0x613a35a1,0x32e15e02),L_(0x00000001), LL(0x7201d2d4,0xeb515a90),LL(0xb3006a97,0x293640a4),LL(0xdf1363d1,0x4e898435),LL(0xc4282ef1,0xf5eec35c),LL(0xf5395189,0xf9d8e87e),LL(0xecf465a2,0x621a8997),LL(0x2d4680db,0xfe197810),LL(0xf2c35d16,0xdc319b13),L_(0x0000019b),
+ LL(0x35c78619,0x976fd128),LL(0x4fea3432,0x9d455cba),LL(0x94c9bc3b,0xb7bb73c4),LL(0x0a3d4425,0x90c2ec3a),LL(0xc1f93e1c,0xa95d87c6),LL(0xe60757b3,0x60d5d399),LL(0xd3d27995,0xce2c84d1),LL(0x81c8808b,0x750e4526),L_(0x0000017f), LL(0x32b7091e,0x76361e05),LL(0xe202d497,0x074baca9),LL(0xd7df203d,0x18d9c96d),LL(0x60965442,0x6777a2e9),LL(0xcf542875,0xcea9162e),LL(0xd6cf9057,0x0e08540f),LL(0x118843d2,0x12ce0e32),LL(0x64680618,0x84e4eabb),L_(0x000001d9),
+ LL(0x3de4c30b,0x1640f2bb),LL(0xe1cd2dab,0x67a49e8e),LL(0x68415129,0xce1a4189),LL(0x5f6655b9,0xf8e55d14),LL(0x58251e9d,0x2a896a11),LL(0x2990bcd1,0x5ee2f029),LL(0xc1b51e11,0xe59128b6),LL(0x7f1b211c,0x753ab1e4),L_(0x0000009b), LL(0x0e4c3270,0x75ae7bca),LL(0x0ff0470f,0xe26fb687),LL(0xdde851ff,0x6353acb2),LL(0x661a72f5,0xa014b448),LL(0x6da88895,0x20ab0fca),LL(0x41dc7a9c,0x90420ccc),LL(0x97a7f272,0xf726e07e),LL(0x23c2dfa2,0xb43c28ae),L_(0x000001db),
+ LL(0x19987e83,0xc4bea825),LL(0xb4d6f37a,0x86bba8ac),LL(0x1e145dc1,0xa3d3860d),LL(0x9d377493,0x538d1baa),LL(0x9ce67c55,0x507bf776),LL(0x0148462a,0x563563c0),LL(0xc2891330,0xba0e7843),LL(0xc76b64b0,0x2ff4ccb3),L_(0x0000012d), LL(0xca889e53,0x632d2ce5),LL(0xe7e3d3fe,0xeabe8bf3),LL(0xb7126e82,0xcc6bda06),LL(0xf58c6361,0x69480574),LL(0x6a99c0d0,0x660e6906),LL(0xd1fdf14a,0x465778f0),LL(0xddbb43b6,0xb843d29c),LL(0x575fd92f,0xa63f0dcd),L_(0x00000158),
+ LL(0x2cd4fd82,0x0e9a73c7),LL(0x52c71a96,0x4d3a4557),LL(0x067ccd35,0x3e412b8b),LL(0x7bd77ec2,0x951e31d9),LL(0x4100bac7,0x2ac6482b),LL(0xccccb053,0x6361906b),LL(0x79655211,0x269a7fe0),LL(0x756f8ab0,0x3b6f68fb),L_(0x00000062), LL(0x8ce6630b,0xcbecac0c),LL(0x4a29a7b7,0xf7ba2d3b),LL(0x47e9ba07,0x2e6c073a),LL(0x5aa6a94b,0x73cf6f20),LL(0xa8a42977,0x50805433),LL(0xf9945386,0x74ac62ed),LL(0xc8f04c45,0x14e4baea),LL(0xe37de45f,0x3e21f3c5),L_(0x0000015b),
+ LL(0x73f77d7e,0x6ff96082),LL(0x58430006,0x328b95a9),LL(0x82931188,0x968102c5),LL(0xbb40cb55,0x6514614a),LL(0x370bf205,0xe5de48d5),LL(0xb3d94790,0x73c104b4),LL(0xa5683b4f,0xfb96fb1a),LL(0x36a9677e,0x17789e50),L_(0x0000010c), LL(0x32bfd837,0x4594f7a0),LL(0x3fb584bb,0x9be3e3c1),LL(0xc86bb1e7,0xef4aecee),LL(0xfa93fc70,0x9de5dfe2),LL(0xbfd3b8de,0xe7670296),LL(0xe1fa5638,0x228cc6d9),LL(0xd230d44e,0xf7797644),LL(0x82d4c20c,0xcfd9942c),L_(0x00000018),
+ LL(0xe19f88e8,0x828b99d9),LL(0xc2beefa3,0x51fa512e),LL(0xd33e3c3c,0xbe14d684),LL(0x34a6c37a,0x5b5936ae),LL(0x89d4bea5,0x2802583c),LL(0xd938e649,0x98da605b),LL(0x1f045420,0x55288cfc),LL(0x659c47e4,0x85b5fed0),L_(0x000001de), LL(0xb9ddaea5,0x22472a49),LL(0x0aefe3e4,0xc2da9569),LL(0x6e21cee3,0x0c7dcef3),LL(0xb14f0abf,0x98c3c9ea),LL(0xb64941e1,0x4819eee0),LL(0x433cfcf6,0xbfe77fa8),LL(0x2f7686dd,0x03c3b28a),LL(0xdbfd2334,0xd4d1d9c3),L_(0x00000008),
+},
+/* digit=45 base_pwr=2^225 */
+{
+ LL(0xc3b7107c,0xe8887082),LL(0xd218cc42,0xcd304c29),LL(0x7a96d44b,0xf1c4d847),LL(0xee7f483f,0x530d4bec),LL(0xc951d19c,0x4d6bf1fd),LL(0x71d2d68d,0xe03d009b),LL(0x4d3bd1df,0xc4553769),LL(0xdb4cb1a2,0x5f77a3c3),L_(0x000000a4), LL(0x5e86f0e3,0xcaf5fb4c),LL(0x715c3388,0xb2f14ba7),LL(0x81191db4,0x38426103),LL(0xf68a08e3,0xb75d25e0),LL(0xd342059c,0x92f767fc),LL(0x4dec2bd2,0x7a696b41),LL(0x16057d6a,0x8adfb670),LL(0x99c277b1,0x2be66359),L_(0x000001f4),
+ LL(0xd6f16b10,0x088e20bf),LL(0xb30d007e,0x859fdd39),LL(0xd4c40b6e,0xc9196072),LL(0x0a59d2a4,0x3c4f607d),LL(0xaf5b531a,0x5c546c30),LL(0xfdc40588,0xdc1d5df2),LL(0x2971b1ad,0xfb26f4df),LL(0x7cb15104,0x70c15bb6),L_(0x000000e6), LL(0x9ff74646,0xe3bee8f3),LL(0x96143e3d,0x560fc63e),LL(0x2e0395d9,0xfd9d7aab),LL(0x099cc808,0x422f153f),LL(0x4e3c3dca,0xefabb0d7),LL(0xed2c2c61,0xd736943a),LL(0x78f87c18,0x96d74e41),LL(0xb76afadf,0xfdd923d1),L_(0x000001a2),
+ LL(0x204ae17c,0xab5b4b2b),LL(0x780e0409,0xc4c863d0),LL(0xf73d00d9,0xd243a003),LL(0xd17b97ed,0xca6e6ef7),LL(0xd335ec2e,0x3f246d97),LL(0xd6c07def,0x0e2518ce),LL(0xb8b0595f,0xfdf728fd),LL(0xc1ccb10b,0x9df076dc),L_(0x000000d8), LL(0x869f012d,0x0a767d8e),LL(0xbe6fa9d5,0x1bbb0510),LL(0xdeeebbfe,0x8f4cdab7),LL(0x8332cdf9,0x75d651f0),LL(0x54687821,0xdd0fc83f),LL(0xa428610a,0x965277af),LL(0x38635dc4,0x9dff5c34),LL(0x0961df5b,0x5ea091fc),L_(0x000001a0),
+ LL(0xe4290556,0xea12a072),LL(0x762385fe,0xd082bac9),LL(0x1be16424,0x8697c433),LL(0xf06c7a59,0xa812dd21),LL(0x7de72b68,0x02f90069),LL(0xa2e56525,0x9acaec02),LL(0xa89c7efd,0x4f9120c4),LL(0xdf713a32,0xd965ba1b),L_(0x000001d6), LL(0x3367220e,0xc9641453),LL(0x9b048cab,0x29a9fac9),LL(0x0e9e757a,0xcb21c285),LL(0xde9cc170,0xbef96957),LL(0x7d017c03,0x0f3534a3),LL(0xa9c18cbf,0x5a627fd6),LL(0xed78ac58,0xb9c29da8),LL(0xef092aca,0x4f469ae4),L_(0x00000020),
+ LL(0x1cb1ec3d,0x669f05f8),LL(0x03d201d9,0x6bb4d70b),LL(0x898f998e,0x96c9a0f0),LL(0xe22c0440,0xfa56577c),LL(0x7b9dee1b,0x00502b66),LL(0x47777bc8,0x483cf935),LL(0xffb71b74,0x0b52d0b2),LL(0x39112d39,0x752546a7),L_(0x0000004f), LL(0x75c45aee,0x6b3c757b),LL(0xf1bef81e,0x7e3d1f7a),LL(0x21a74b7e,0x2bfe9dfd),LL(0xb0da2bc4,0x90c8361c),LL(0x0c5783ca,0xf50913fe),LL(0x5dd47036,0x34045f12),LL(0xd0f87837,0x89dc259f),LL(0x560578ab,0x22e987bd),L_(0x000000dd),
+ LL(0x1a521d30,0x8270aad1),LL(0xd7dd0f9e,0x5bd17ae9),LL(0x2341942e,0xc840cb6d),LL(0xdc090118,0x1c49ccd4),LL(0x60e02fa4,0x28d04bf0),LL(0x3570b020,0x1dc79e5a),LL(0xbd1e244b,0x5f5e1042),LL(0xeebf73ef,0xf6c77a24),L_(0x000001ba), LL(0x9d82fe22,0xf2a4d116),LL(0xfbb0437b,0x538ffa89),LL(0xac67b2fd,0x70b0e36d),LL(0xcd72f925,0x3b843326),LL(0x26042e6e,0xd58ef907),LL(0xa54711c2,0x40c00366),LL(0xa62c4885,0x33e0a1f1),LL(0x758c2c5e,0x508c7bec),L_(0x0000014e),
+ LL(0xf11f835f,0xd4f6e5fa),LL(0x4a99daab,0xbfa7d98f),LL(0x3f46a163,0xe712c72d),LL(0x869f8036,0x194ee078),LL(0x1283d5ab,0xe9c40094),LL(0xf4b53cf8,0x8eccbfb3),LL(0x865de4fb,0x27d82426),LL(0xc4399d77,0x5783591a),L_(0x00000093), LL(0xa59eaa03,0xb1a23e95),LL(0x99d72c23,0x48055f02),LL(0xf5f1e1c0,0x04a35336),LL(0x448cee4d,0xcb7b9a8c),LL(0x5862f10a,0xb9974831),LL(0x93b3f7d9,0x93c6f79e),LL(0xb09c629c,0x2a3760fa),LL(0x5d47957f,0x310ac801),L_(0x00000186),
+ LL(0xf060edf1,0x83a0baf3),LL(0x26de7078,0xeb8cb2a3),LL(0xf5a8d631,0xcfa95554),LL(0x6ba14fb5,0x9d950c23),LL(0xc53769e2,0xc3b6e6d4),LL(0x857d43ea,0x00e396b6),LL(0x28cc2c64,0x79b3b40a),LL(0x42ca52de,0x66e9ef01),L_(0x00000037), LL(0x4e536d43,0xbb696fec),LL(0x60fe980d,0x86879c73),LL(0x6a564e15,0x6796d473),LL(0x62e7ce9d,0xee75c812),LL(0xd4cced89,0xdd4f732c),LL(0xa3a75fe2,0x4a4d97d2),LL(0x62def6c0,0xfce046cc),LL(0x0bfe781a,0x9b2b5c59),L_(0x000000e8),
+ LL(0xecebff30,0x5ddecacd),LL(0x66805c77,0xc732fa10),LL(0x62e2a037,0x9f8318aa),LL(0xf535306d,0xcb188ede),LL(0xf3ae9b72,0xd4215242),LL(0x76515ea4,0x19ee9251),LL(0x04b30ff0,0xfdb4add0),LL(0xc2006bc5,0xc094d7f3),L_(0x0000008c), LL(0x08f431a5,0x9a41c273),LL(0x4ef9856a,0x29336f92),LL(0x89a37aaf,0xb4f719c9),LL(0xb6ae5b4c,0xcb8b83d7),LL(0x0b93351c,0x579d32e9),LL(0x95ac6c1d,0xed14de1a),LL(0xc9a3144d,0x59d39bac),LL(0x4809d3c0,0x021a5392),L_(0x00000076),
+ LL(0x46b4f926,0x31967f76),LL(0xedbec7a4,0x9540a500),LL(0x7d4cba0a,0x3664934a),LL(0x44eee05e,0xacaf15ab),LL(0x7e273dff,0x0d40978b),LL(0xb55d54b7,0x7a7b2c2d),LL(0xb2400231,0xcc267a21),LL(0x31dec63e,0x45427d34),L_(0x00000169), LL(0x9ea998cb,0x5e543e59),LL(0x22a0befc,0x0dee7b14),LL(0x1aa7e66e,0x052bb589),LL(0x51c3c220,0xe7133b54),LL(0x64b84789,0x86fee1bb),LL(0xacd3a9a6,0x6d321f88),LL(0xf3dee610,0x17435c7d),LL(0x64e0790f,0xea978193),L_(0x0000000a),
+ LL(0x824c77d2,0x1d5087de),LL(0x3c424cb9,0xce8e9c97),LL(0xb3b1c7ef,0x65ef8961),LL(0x36bdf7df,0x936db078),LL(0xe1a9152e,0x9ff36717),LL(0xbde711fb,0x1b59074d),LL(0xc2a17a75,0x9070200e),LL(0xa0657ad1,0xd3cc9c6b),L_(0x000001fb), LL(0xf471b9b4,0x63dca49d),LL(0x23fe450a,0x7aa88a47),LL(0x569744e7,0xbac5c025),LL(0x557519ba,0xc31b16cd),LL(0x90672c5b,0x7609de28),LL(0xeb879e6d,0x06a4f8d7),LL(0xa50f3b9e,0x45a7792d),LL(0x5ef4893d,0x5794fb38),L_(0x00000186),
+ LL(0xa8c609cd,0x3fc0a251),LL(0xe916d838,0x09bae516),LL(0xdc8442b3,0x70eda9b4),LL(0xdbbd2829,0xe66c09a8),LL(0x44077102,0x46f0d061),LL(0x0c8b9a97,0xe7c4e4e6),LL(0x96dd9b50,0xd93b4696),LL(0xf2abcbd4,0x2e694650),L_(0x00000152), LL(0xdcc67ed7,0x34c98a81),LL(0x1a864f2a,0xd79eca11),LL(0x46960243,0xaf4ad720),LL(0x02db8ea4,0xe8d429d1),LL(0xd9dae172,0x9cac2c01),LL(0xf704ba3a,0x052267c9),LL(0x0ee381b0,0x768c8223),LL(0xf95050b5,0x3558199f),L_(0x00000037),
+ LL(0xdbee340c,0x7596d517),LL(0x7a4d90d8,0xe88332d5),LL(0x27312835,0xadc174b8),LL(0xbf7deda3,0x9fa8589b),LL(0x30a04404,0x50ccb83e),LL(0x9ea9cbf7,0xb73afec5),LL(0x8a699ab5,0x0382ff44),LL(0x682b0e1c,0x12fbb9a1),L_(0x00000024), LL(0xa48bc771,0x219fed54),LL(0x20bed549,0xd7a8f53a),LL(0x9f897a30,0xccad31ab),LL(0xf4ab61be,0xe4253812),LL(0xd02eb63b,0x02c0bd98),LL(0xf369795f,0x940fa395),LL(0x6661d80d,0x4fc30a92),LL(0xdb54dfb5,0xf14f8652),L_(0x000001a5),
+ LL(0x7f4fad25,0x917eadce),LL(0x33c5c41f,0xfac932b3),LL(0x8175e0ba,0x0c6ce437),LL(0xd6df4caa,0x628f6bd2),LL(0xd8cef71f,0xbbd0808b),LL(0x1bf4e3d8,0x82a3b927),LL(0xf2573f56,0x18b7f7d3),LL(0x20a5d5d4,0x68ebb93b),L_(0x00000151), LL(0x6296df1a,0x511300a6),LL(0x48f698fe,0x0a451118),LL(0xe69d9b6b,0xbda90f27),LL(0x6b99560f,0x00ad6b22),LL(0x576639a4,0x70498a28),LL(0xe3fb0685,0x766cc9eb),LL(0x910ed9d6,0xa13d4e5f),LL(0x45079f4a,0xdd2c7f6f),L_(0x00000047),
+ LL(0xb3a0df18,0xcdee46b0),LL(0x0f7b0b8f,0x0dee6d65),LL(0xdc8df7a6,0xca19127a),LL(0x6d034f50,0xd6d74c77),LL(0xcd8b7301,0xd01a93fc),LL(0x7b8e12a8,0x77799926),LL(0xc0b3bdfe,0x157d532e),LL(0x5444b9cf,0x90f700d1),L_(0x000001f9), LL(0x2776ac60,0xbab425f8),LL(0x947e525b,0x66085567),LL(0x6d095956,0xbcb7adb8),LL(0x4d3075ac,0x99a0d6ce),LL(0xc684b9ba,0x0e134c5c),LL(0x4c65fec0,0x30477674),LL(0x5db48af9,0xf3744581),LL(0xfcc9963e,0xc6d87a4c),L_(0x000001c2),
+ LL(0xb51e39da,0x258dcf68),LL(0x1c50cc68,0xb1289a02),LL(0x54112229,0x48928ef6),LL(0xc73b83c7,0xf0df33f4),LL(0x6a0ebdbd,0x5f166393),LL(0x09883324,0xbdfac3bf),LL(0x21bceec6,0x871bcc9c),LL(0x64a15de9,0xa6e53bcb),L_(0x0000007a), LL(0x7efb2f27,0xce8d66f9),LL(0x6a48e2f0,0xc4f49e10),LL(0x0d05177f,0x04e720d6),LL(0x9e354273,0x746f841b),LL(0xe08c355b,0x7b7b7cd5),LL(0x81226157,0x586eb9a8),LL(0x38ce3838,0x8c03b21c),LL(0x02872c5a,0x40058aec),L_(0x00000197),
+},
+/* digit=46 base_pwr=2^230 */
+{
+ LL(0x8a4b6723,0xa08c6852),LL(0x79a5b3fd,0xc7195714),LL(0xd8054fed,0x7c611c75),LL(0x503c3580,0xe88e5dbf),LL(0xb37b9ea9,0x2b4c4521),LL(0x75f1c942,0x950eb17e),LL(0x79508472,0x238eca42),LL(0x845c91f9,0x0657bc0f),L_(0x000000fe), LL(0xa0c1e80e,0x978ae396),LL(0x14b242e1,0x2c0d00f9),LL(0xb47bf7bf,0xe944e43f),LL(0xb416e50a,0x906c3634),LL(0xe7c8d114,0x347f03a3),LL(0x65b00ad0,0xa6eba251),LL(0x53a14e26,0xf521e9dc),LL(0x11eb83f4,0x82020769),L_(0x00000151),
+ LL(0xcf0b0ab2,0x1ea0d8e5),LL(0x30d499c7,0x4b6204df),LL(0x8f748b9e,0xc4dd3f54),LL(0xba95c754,0xc443876e),LL(0xd7ad6cc9,0x08e10896),LL(0x544e9e2d,0xa9428b4a),LL(0x1a2d3e1e,0xb6fe7189),LL(0x05c7660e,0x77bc86b9),L_(0x0000013a), LL(0xb366e641,0x77106f8f),LL(0x42b36e28,0x2d9d82f5),LL(0x63743c2e,0xaf2b4eca),LL(0xc887146a,0xb28d08cf),LL(0x4ed669e0,0xc7391371),LL(0xda28c885,0x14ee1f56),LL(0x84424da9,0x42d4479d),LL(0x33646227,0x4a2f215e),L_(0x00000082),
+ LL(0x12e89265,0x1eeb47d8),LL(0xcbb7e582,0x5b702942),LL(0x0f041cf4,0x64d44f59),LL(0x50d39295,0x5d20f47c),LL(0x0a8b51ba,0x15a076aa),LL(0x79ae768a,0xa2141ba3),LL(0xcf638bb5,0xe3c47d36),LL(0x582394d5,0x3311139a),L_(0x00000047), LL(0xde6f722f,0x7bcb9faa),LL(0xc544456b,0x7edbbe33),LL(0xc58f127c,0x178e1289),LL(0xcd6856a6,0x29c72942),LL(0x7d0ce889,0xdca59772),LL(0x951589f5,0x6908ef3f),LL(0x4f00ce63,0x110a84b5),LL(0xc1a89443,0x72833218),L_(0x0000003c),
+ LL(0x1fbd25b5,0xc3abc5bd),LL(0xa3138347,0x78a11d29),LL(0xf2283223,0xadac6d62),LL(0x4af4ece3,0x72b0dc7b),LL(0xf1c75e43,0xa7308e28),LL(0x99139560,0x0ea7127d),LL(0x9cb3c31d,0xee0172da),LL(0xc69386a7,0xd4d20c36),L_(0x000001db), LL(0x293be2a2,0x82933139),LL(0xaf8d3077,0x41cdee07),LL(0x4118b415,0xd6d0895f),LL(0xb3a9502a,0x242767b9),LL(0x404e1d44,0x3924f383),LL(0xe7a91a84,0x3c5c40dc),LL(0x0f30db5a,0x2d443e9e),LL(0x38df60b6,0xc16acc53),L_(0x00000195),
+ LL(0x57eacd01,0x8b237781),LL(0x47bc0a58,0x21bf6b08),LL(0x72f947bb,0x5c6b0c6d),LL(0x0c58bea7,0xc78326d2),LL(0x8a6feb8c,0xf3157ca1),LL(0xe147ad97,0x4be255e4),LL(0xa6917b35,0x7006cd50),LL(0x1ceacc56,0x7d62c8eb),L_(0x0000000d), LL(0xc4957a8d,0x5e969282),LL(0x3e3eb59d,0x1216fdc0),LL(0x2f2b0b06,0x51a13162),LL(0x5b88e211,0xff4a6d02),LL(0x6b68e6ae,0xc7c80a3f),LL(0xa7fca940,0x2128145a),LL(0x3a205f85,0x459b75e6),LL(0x48874b7e,0xef227f89),L_(0x0000019c),
+ LL(0xf1c2d135,0x363e7de4),LL(0xede249f0,0x2374169d),LL(0x92b91c52,0x34ca05e7),LL(0x42f9c460,0xe96d13d2),LL(0xb8dc141b,0x9c04a0eb),LL(0x11349888,0x86f45f6f),LL(0xa3c9d21f,0x34d9dd7d),LL(0x6359abc3,0xa35e3eae),L_(0x00000172), LL(0x906d8bdb,0x82617ad1),LL(0x5f4fb81e,0xd70d26c6),LL(0x68367c91,0xe835f648),LL(0x4d712331,0x5dda13b7),LL(0x06ca4385,0x97f662ae),LL(0xcbeb485a,0x211b18b3),LL(0xfe5f6ad4,0x178f31f1),LL(0xbfc76ef2,0x88d953e4),L_(0x000001a9),
+ LL(0xab40e045,0xcdbdf2d4),LL(0xbc7f59a3,0x25655817),LL(0x7d6adfae,0x5b05af23),LL(0x3b9e8819,0x1f7f265d),LL(0x4d41011d,0xa02a10b1),LL(0xc4403b75,0x4598d47a),LL(0x21678b80,0x72bcfd2d),LL(0x0a91ddc2,0x53e0dc1a),L_(0x0000003b), LL(0x5f9a8c36,0x38d6c310),LL(0x22226823,0x4b065228),LL(0xdf4b4ac7,0x99e6867b),LL(0x1562f4fb,0xc9c2e12f),LL(0xe5bf9e6b,0xef6dd2fe),LL(0xa02f573e,0x99a366b2),LL(0xf15b202c,0x46de40b9),LL(0x8fa6fe0d,0x0fbe1e76),L_(0x0000011f),
+ LL(0x95d88264,0x5a265bdb),LL(0x771ed60f,0x717063ef),LL(0x0dd813de,0xd974ca00),LL(0x4d348196,0x9d26915a),LL(0x3def1612,0xfcdfb352),LL(0x1ecabcbb,0x7290d698),LL(0x44e08c75,0x5c0c5d24),LL(0x65a063c6,0x1673491c),L_(0x0000000e), LL(0x751941d0,0xa5845e0e),LL(0x90c04cc0,0xc51c09cc),LL(0xf11f3a2b,0x536ce8af),LL(0x3944ca09,0xd614a230),LL(0xe5cb9d10,0x4cf73a00),LL(0x11f36267,0x39b52629),LL(0xe681d436,0x27379f49),LL(0x7634bb09,0x6f9a6ea0),L_(0x00000193),
+ LL(0x3b3162c4,0xf5ba50b2),LL(0x27a53ca3,0x5b2f88a0),LL(0x4d9f7313,0xff015375),LL(0x4100d075,0xefc66c49),LL(0xaa939a6b,0x25334ce7),LL(0x4d836d2e,0x0ff09c49),LL(0x9aa3f59b,0xce13f150),LL(0x6bd297a9,0x80466de2),L_(0x00000106), LL(0x3c8984bd,0x8be1ce28),LL(0x7a30734a,0x83fbedb8),LL(0x56e66999,0xc37e9e22),LL(0xeb69a4db,0x8b3de542),LL(0x15192947,0x4a7280d3),LL(0x67515315,0x5c05b359),LL(0x0b9a8604,0x5ec92a80),LL(0x973deb80,0x04619c68),L_(0x00000027),
+ LL(0x1256d99a,0xa13ac401),LL(0x9e017800,0xed3810cb),LL(0x84b7702c,0xb6d9eff1),LL(0xcdc98f94,0xf4a42e06),LL(0xa3cf6c58,0x658f00c3),LL(0x17b79fe0,0x4db4bd0a),LL(0xc0cd6ebd,0x79f4a662),LL(0xb6716eec,0x94db6c69),L_(0x0000014d), LL(0x6f9c5845,0x5d9256ec),LL(0x540f768a,0xe910b5c3),LL(0x4e7e7b8d,0x3c907d51),LL(0xf387c3d5,0xeecfe723),LL(0x213d5d27,0xd78500a0),LL(0xaa244815,0xb117a5b8),LL(0x7049f488,0xfb72f9ed),LL(0x3651c83c,0x24f438bb),L_(0x00000079),
+ LL(0xed918816,0x14555dbb),LL(0x178d8d22,0x4a72d14b),LL(0x1ebffe3d,0xa3a172eb),LL(0x476c82fd,0x4c45f724),LL(0x700c837a,0xd80825d0),LL(0x16888e37,0x104ac32f),LL(0xfaf93105,0xed3ecf8b),LL(0x503fb78e,0xcfbd4bb3),L_(0x00000067), LL(0x3c014136,0x4a1d6c14),LL(0x3ae0a56f,0xa38d42d7),LL(0x765e846a,0xdc241d4a),LL(0x087fcd52,0x0a7a4e2e),LL(0xf088c4c3,0x81043b53),LL(0x0b74dc81,0x030c4d6d),LL(0xf465c63a,0xb63f1e30),LL(0xa7aa0a71,0x1a64238f),L_(0x00000006),
+ LL(0xe2aea3b4,0x22e76e20),LL(0x6eca1ede,0x7e03afde),LL(0x08d1c44e,0x4edf70d6),LL(0x88d58544,0xd8ec390b),LL(0x474d298c,0xc4c3f675),LL(0x9ce21146,0x3274110e),LL(0xb12ae7e7,0xce9cf1f4),LL(0x67e9f4b4,0x8102a4fa),L_(0x000000ee), LL(0x102ef931,0x3efdaff6),LL(0x7a8b94cb,0x59bd3104),LL(0x4b8b1235,0x25afad7c),LL(0x24884827,0xdd939da0),LL(0x43b462ba,0x45cb99ab),LL(0x6a4b9f89,0x0f6b65c6),LL(0xbddb4b1c,0x39e97dd0),LL(0x5a1f7976,0xef2919d7),L_(0x00000117),
+ LL(0xcf01fbe1,0xc5bd929e),LL(0x47c26018,0x2bbeb492),LL(0x050e6a5c,0x04741b6f),LL(0x0f665d42,0x4c0e1ab0),LL(0x15137e0c,0x3ee524ae),LL(0x88980ffb,0x86e225d0),LL(0xa5de3190,0xde9d18c0),LL(0xe6bcf986,0xc6d1d2db),L_(0x0000009d), LL(0xc1e09545,0xa8ab4958),LL(0x7b416dfc,0x05e9411d),LL(0xb5a5de50,0x916238cc),LL(0x7da6c853,0x0e933ce2),LL(0xcff26d33,0x7fab03f6),LL(0xc2410d1b,0x70a12092),LL(0x130ded07,0xa7ff89e1),LL(0xf34872a0,0xde280eea),L_(0x000001cb),
+ LL(0x6107960e,0x08dca3fc),LL(0x9f978b8d,0x2367f8bf),LL(0x41ab4ac8,0xbfb304bc),LL(0xc14127da,0xb2161643),LL(0x89ee83de,0x91433f74),LL(0x76ad8bee,0x3abcb595),LL(0xa74d6d8b,0xa8b1935f),LL(0x314e698a,0x23ecc61e),L_(0x000000e7), LL(0xbd5f1508,0x1fda31cb),LL(0x4401991d,0x67b33d1f),LL(0x5dcaee66,0x80ef50d3),LL(0x58f1d026,0xc6160acf),LL(0x00a13e57,0x3be539f3),LL(0x88dd96e9,0xa5a0a5ae),LL(0x97419f0c,0xcf6a8f10),LL(0x44b2ca4c,0x1b9f2c18),L_(0x000001dc),
+ LL(0x5c77a891,0x745da1cc),LL(0xa4b913df,0xa1006271),LL(0xec1779e4,0xb3fe3fca),LL(0xcceebf8a,0x7b0d3f86),LL(0x82fd16d4,0xeb20fdbf),LL(0x4e29270b,0x450edccc),LL(0xa783c064,0x2c637dd3),LL(0x7337d5ce,0x9b0b50ee),L_(0x00000005), LL(0x819b276f,0x71e05cf6),LL(0x45bd1439,0x748c488f),LL(0x280a8add,0xbb099ca8),LL(0xe8e6e69d,0x19429d88),LL(0x4f4c80b6,0x2d2698e8),LL(0x0e4ab44b,0x1eb3fc49),LL(0xcd46fe76,0x02d1a2ca),LL(0x15543eb8,0xacd0b316),L_(0x00000129),
+ LL(0x700ec0ac,0x13ee9845),LL(0xe55b42fb,0xe5ad047b),LL(0x45bc6993,0xe8f73a08),LL(0xee41f2ae,0x1ac680ff),LL(0xd3c83204,0x740b12fc),LL(0x5e36bb4a,0x21ebc164),LL(0x35a45c95,0xb8dfcc77),LL(0x92b0fbda,0xa1f288ef),L_(0x00000153), LL(0xb5805ed4,0x829d754d),LL(0x6c810584,0x36cc488a),LL(0xc9632468,0x39f60f1e),LL(0xf2ebc30d,0x390502c0),LL(0xde960758,0x6d1feec9),LL(0x63adf462,0xf944bca3),LL(0xdeea2824,0x9c375dbf),LL(0xa887d095,0xbc1d650b),L_(0x000001c8),
+},
+/* digit=47 base_pwr=2^235 */
+{
+ LL(0x2fcf8b0a,0x07415442),LL(0xe5dadc06,0x07a17d21),LL(0xc237ee85,0x83c01e78),LL(0x08f5fd21,0xada49ad1),LL(0x998eec2d,0x3e35f765),LL(0x5a121c30,0x1f207544),LL(0xf5fdddb9,0x537426d8),LL(0x1dd7a92c,0x6cdbd6af),L_(0x000001c6), LL(0x9ac31da2,0x22850494),LL(0xd3189e72,0x7646877e),LL(0xe04fe426,0xee0cbac9),LL(0xf8802494,0xd9fdf793),LL(0xa975ea85,0x0c9c6045),LL(0x18cf38fb,0x02b88cb1),LL(0xa12c8778,0x9757e39e),LL(0x8e571e06,0xb126d254),L_(0x000001ec),
+ LL(0xd91f89ee,0xd77e7f7e),LL(0x2cf0f860,0xe9a24986),LL(0x705ade19,0xa4b26963),LL(0x0f929eaf,0xf6f18b5d),LL(0x1a12f7ee,0x0ff1861d),LL(0x4ef59d59,0x6b67d295),LL(0x18bcbd0d,0x70540dd4),LL(0x83b51e51,0x2670896e),L_(0x000001b3), LL(0x0b0a67de,0x090cb0d5),LL(0x89c8fd0f,0xb8b3eeba),LL(0x289c0d96,0xa8a26dc5),LL(0xe6dd7431,0xafde18e0),LL(0xf0a660c8,0x2cc76374),LL(0x397bcfa0,0x7654494d),LL(0xd958a15b,0x24476b8f),LL(0x53a314e3,0x67dea97d),L_(0x000000de),
+ LL(0x74ca8553,0x099db6d0),LL(0x79fa68c5,0x4c5dd75b),LL(0x75880817,0xccf37a0a),LL(0x92dc167c,0xf900a103),LL(0xc92d1684,0x8386aa09),LL(0xfba8f79b,0x53d25b65),LL(0xb1822202,0x183fbc1b),LL(0xfccc5a8e,0x21f550ce),L_(0x0000013b), LL(0xf2f85858,0x4925f513),LL(0x1b5dd268,0x3efe01ed),LL(0x65fdd3e5,0x47d317de),LL(0x4621cca2,0xdf49fdd8),LL(0x60e7bc31,0x66f9ab90),LL(0xe320caa6,0x2ca76c6f),LL(0x41361bf3,0x602d539d),LL(0x267e9ebe,0xf83bf8f0),L_(0x00000140),
+ LL(0x925d2d91,0xd471ad5a),LL(0xe6ad36d9,0x18a88bdc),LL(0x599734aa,0xb20b90be),LL(0xaa6c0fb7,0x33c88799),LL(0xceda14b2,0x7dad41f1),LL(0x3bb924ee,0xb7c643d1),LL(0xa63db6fc,0xcfe7d84e),LL(0x46de4666,0x71afb3a8),L_(0x00000072), LL(0xebe6128e,0x4a9235f4),LL(0x780d1146,0x2db34ea2),LL(0xb3ecdbc0,0x31fad3e8),LL(0xcdbe1207,0x7ab5ebf8),LL(0xdf431809,0xbf1d4990),LL(0x0f8e79eb,0xe93c1583),LL(0xfba03ee7,0xefc40a1c),LL(0xf76de664,0xd188b68d),L_(0x00000103),
+ LL(0xa3f4bcf5,0xf02dfbba),LL(0xf379ed8d,0x7857a0d6),LL(0x6c580cb5,0x7b4a59a6),LL(0x6d6738fc,0x1654de01),LL(0x7c102c44,0x8d6ededc),LL(0xb8a37f11,0xe92baa08),LL(0x6ecce15f,0x1b1b1c96),LL(0xf542a7b0,0x118752af),L_(0x00000169), LL(0xcf9be3be,0x02fd3092),LL(0x22a60f7a,0xd4c8209a),LL(0xdeeb8950,0x8636e6d7),LL(0x29511c76,0x09037c4f),LL(0x419f1652,0x4196d645),LL(0x935dc02e,0xeaef1b05),LL(0xcec8a6ec,0x2f5c9bf8),LL(0xb432cd40,0x375285bc),L_(0x00000116),
+ LL(0x7f267eeb,0x2a1279f1),LL(0xf11c0e49,0xc76f729a),LL(0x92b8f2a3,0x5437339e),LL(0xe00c8ca3,0x41f96b14),LL(0x1dbcc016,0x449dde57),LL(0x5fa3755e,0x0a0df11e),LL(0x42dc646a,0x5d317707),LL(0x3610d1c6,0x149d76f5),L_(0x0000008b), LL(0x76e5b808,0xc99fe831),LL(0x61f75499,0x19eef1a0),LL(0xd4c21a60,0xcc67deb8),LL(0x192fdd7e,0xec37ce33),LL(0x13250ef2,0xf6ed9344),LL(0xac4baff8,0x8d1e9777),LL(0x0d67d5c5,0x7183407f),LL(0xd1b52871,0x7887079f),L_(0x000000aa),
+ LL(0x64430a84,0x5637bc1f),LL(0xc9bb1131,0x102f522c),LL(0x38d318b3,0xb1dfff39),LL(0x0967edf8,0xc54708cf),LL(0xff7bf052,0xb7dea363),LL(0x5d9deef1,0x44846b8a),LL(0x5e3fdc0e,0x2ccf785a),LL(0xdf1138dc,0x16844b0a),L_(0x0000000f), LL(0x3b1beaf4,0x5076af3c),LL(0xac3bbbf4,0xdda27ca5),LL(0xdc76f92a,0x7c5f4d64),LL(0x67fb8aff,0x98258450),LL(0xfa7eea13,0x183f4c0d),LL(0xc38dcddf,0xc7ca9f82),LL(0x0789054d,0xa0ad28e2),LL(0xf484ac51,0x2b54cf18),L_(0x000001ce),
+ LL(0x0d9d6152,0x28f43810),LL(0x4ecd5aff,0x0a2146e6),LL(0x7e0c0df1,0x0d19ad5b),LL(0x6775181b,0x151d7c3f),LL(0x43c7a1b8,0x38a3ef9f),LL(0x2dd235c3,0x1fdd8171),LL(0x1f2597ee,0x4734726a),LL(0x083971de,0x92167cb3),L_(0x00000173), LL(0xfac04120,0x85ff590d),LL(0x952b767c,0x8b72aaea),LL(0x843ae9c1,0x004265e7),LL(0x307d7542,0x395a8932),LL(0xc2dea503,0xc7f73a8f),LL(0x3399e1ee,0xb86c7eb5),LL(0x2926b2c4,0x0d21cf86),LL(0x47a4f082,0x37deb193),L_(0x0000001b),
+ LL(0x685e8e4b,0xd88c27c3),LL(0x0240c0b1,0xeaa149a2),LL(0x79b4d2d7,0x18bd3d71),LL(0x368319a1,0xdb5d6ca6),LL(0x44a8c42f,0x587ba79d),LL(0x77c41337,0xdb57f6f2),LL(0xea1f7c4f,0x8ae39899),LL(0x77750728,0x8ec08a85),L_(0x00000083), LL(0x22355d19,0xa2946cf3),LL(0x598a6616,0x4d6a2c7a),LL(0x4bb8cec6,0xfe918a85),LL(0x94e93f01,0x833d8970),LL(0x64d5ba4a,0xa972b798),LL(0x05a95b5c,0x636ab756),LL(0xca11412a,0x2b50cab7),LL(0xeca1dc55,0x886d7097),L_(0x00000181),
+ LL(0xcb4f7b38,0x1a4787e2),LL(0xea069acc,0xa5590739),LL(0xa99d3f7a,0x601be73f),LL(0xcf6cca23,0xaa83e6e7),LL(0x3960cc53,0x5920b117),LL(0x20e0b86b,0xa7ac9dbe),LL(0x6b3ef99f,0xf468bb6f),LL(0x60ac6c56,0xae52f640),L_(0x00000099), LL(0xdc626c18,0xb7dd82a1),LL(0x008f892e,0x142f8425),LL(0x705cbf37,0x01a4b241),LL(0x4c8483d1,0x275951c0),LL(0x82075cfd,0xa7dae45a),LL(0xa9d9f282,0x63c98e81),LL(0x30bf2902,0xefc331b1),LL(0xc5f55add,0x2fdd6c95),L_(0x0000013f),
+ LL(0x4a6e860f,0xaa1272c0),LL(0x85afdbd7,0x53123c17),LL(0x796e466f,0x327374bf),LL(0x19701fb1,0x8c2b076b),LL(0x755659d8,0x8fee24c8),LL(0xc6001497,0x45d95463),LL(0x144b9a21,0x98a62be8),LL(0x9e1d51ac,0xd46ea2e1),L_(0x00000017), LL(0xff126e8b,0x87dd796d),LL(0x5e933815,0xad6f752f),LL(0x0f756584,0xa0d6329c),LL(0xc8afd335,0xef95a2f8),LL(0xa429ff1c,0xe9d51af6),LL(0x06c04336,0xbb9ac481),LL(0x0e389129,0x80d2d2dd),LL(0xb75b239e,0x128834d2),L_(0x000001f5),
+ LL(0x04ac9a1c,0x9fb461cd),LL(0x2abd08e0,0x7bca251b),LL(0xfa6e8384,0xf5d98ad8),LL(0x7e953f04,0xca3dcc08),LL(0xfd9f6c57,0x679c5992),LL(0xfac8f179,0xc9cf93cd),LL(0x0e29622c,0x050d1a32),LL(0x703c650a,0xc7848580),L_(0x0000006d), LL(0xc1188e58,0x60a160b5),LL(0x6d729218,0xbe9a3f42),LL(0x311911d3,0x864f8747),LL(0x8a79eb1a,0xe2ff5eb7),LL(0x66b881de,0xef83107b),LL(0x8784fc87,0xd139997a),LL(0xd894e5ee,0x9a80e84f),LL(0x1a2f4197,0x2ffb83aa),L_(0x000001a7),
+ LL(0x6619c168,0xbefe84df),LL(0x7fe74db9,0x7efd2da4),LL(0xc983adbf,0x0bbc28a9),LL(0x6535bd9b,0x169b3680),LL(0xcb39ad32,0xd2112121),LL(0x3f60a9f2,0xa91386ce),LL(0x3a1b138f,0xb1ef230d),LL(0x36ea6d68,0x8198043e),L_(0x00000105), LL(0x1ef3660b,0x58bee126),LL(0x3a1e13eb,0x84fe2098),LL(0x1044e049,0xd3d31ea9),LL(0x6e975e84,0xbdc58274),LL(0xcbeca3ca,0x4c27aa9f),LL(0xe9036bd4,0xcc717651),LL(0x982f94af,0x20d99920),LL(0x0268a0da,0x96c3d4be),L_(0x0000013e),
+ LL(0x8e317075,0x01712fc5),LL(0x00607c95,0x10e30ced),LL(0x77b023a2,0x53b465e6),LL(0x620a31c6,0xb10af467),LL(0xa8ea62e5,0x48d08ca5),LL(0x31ddd990,0x65af8778),LL(0x5be8899d,0x2b29f5ab),LL(0x21d38a08,0x7aa79283),L_(0x000000c1), LL(0xd56bb423,0xba4bc4d5),LL(0x28b7afb8,0xa4ef2e4b),LL(0xc314822c,0xae9b41f7),LL(0x882d9a51,0xf2b327a2),LL(0x1e6c2280,0x7ce965ab),LL(0xa49d1969,0x5708dae4),LL(0xea346d97,0xcff1175e),LL(0x572d2fbc,0x8dc700e9),L_(0x000000f1),
+ LL(0x971c75d0,0x3dd39efc),LL(0x11aab543,0xe47dc537),LL(0xf6290b96,0x38ce4cde),LL(0xe7a164cd,0xd9dcb339),LL(0xebee41ba,0xbc0e8d41),LL(0x18ca0dd5,0xd2a8a073),LL(0x92054e4f,0x366d13cf),LL(0x188fdcbb,0xa61f6fe4),L_(0x000000d5), LL(0x587afc9e,0xf03b4067),LL(0x4ac1fdd7,0x43baf1b7),LL(0x900c0863,0x35bd9902),LL(0xe71367f8,0x3f6d6815),LL(0xfd613341,0xc12cdb6c),LL(0xa8569f79,0x6e58f3c3),LL(0xd9ca8493,0xd420b011),LL(0x6d1ebe67,0x18a83579),L_(0x0000014d),
+ LL(0xbd7d4bad,0x4af0bab5),LL(0xade61274,0xcd1e04b0),LL(0xe21c3a53,0x4ec80a7f),LL(0x4b987124,0x28f48386),LL(0x23f6fd14,0x63b180bf),LL(0xe2b4889d,0xacf748b0),LL(0x2996dea6,0xf3a06107),LL(0x7cdec9d5,0x7248e660),L_(0x00000130), LL(0xc2a9858e,0x2d38ce4f),LL(0xc709b1fa,0x87521e69),LL(0xf5996fd9,0x4d05bae8),LL(0x131ac99f,0xc3bad75e),LL(0x62578fe3,0xc9d13920),LL(0x3ada2279,0xb6fbac90),LL(0x696da364,0x6c292885),LL(0xd02ce135,0x5f814ddb),L_(0x00000048),
+},
+/* digit=48 base_pwr=2^240 */
+{
+ LL(0x3d1074e0,0xff10eeb7),LL(0xe087c1a0,0xc77549f2),LL(0x5e2e0837,0x74d6808a),LL(0x48c7156c,0x11f82ce9),LL(0xbc13bf7c,0x72ee287e),LL(0x06f6a514,0x28c4e6f9),LL(0x165038cb,0x320fef0b),LL(0xb6f1c9d9,0x369852d8),L_(0x000001dc), LL(0x57d310ce,0xadd6b6df),LL(0xcd825c08,0xdcd4cb28),LL(0x48bebf85,0x644e1cbe),LL(0xf1d5aa6a,0xbebbd351),LL(0x908ba85c,0x4d8a2aa1),LL(0x518b1bc8,0x343d2d77),LL(0x29b988ed,0x7ea90982),LL(0x940fc8d0,0xeb433a9f),L_(0x00000059),
+ LL(0x8f96ebc1,0x54a67c95),LL(0x984cd0ed,0xef67809a),LL(0x8dd8453d,0xde0abb72),LL(0x4fe5f363,0x4b73609f),LL(0x8e4fc461,0xaab1b83c),LL(0xb989fee4,0x06d2158c),LL(0xfe56f7d6,0x52096597),LL(0x70734a0c,0x4bb17572),L_(0x000000e7), LL(0x094ef503,0x32b2f44d),LL(0xebd6d9b7,0x2c29898d),LL(0xe0ef3ff7,0xe5d5ffd4),LL(0x30b99ae2,0xe1c94a38),LL(0x2dd5fca5,0x15b084de),LL(0x6d08e970,0xe94504be),LL(0x90fe0fe0,0xdb79eaed),LL(0xafa2897d,0x1b99b51e),L_(0x00000143),
+ LL(0x45dd470c,0x907208e4),LL(0x551b38ea,0x1157ba3e),LL(0x1b72b693,0xcf9f94c5),LL(0x83c616c9,0xaf1c59b1),LL(0x2fe84fca,0x7ed67f1d),LL(0xf1bd77c9,0x1d1e1a09),LL(0x51550daa,0xbac2f477),LL(0x58d345e7,0x84ab938d),L_(0x000001dc), LL(0xa5d95b5f,0xa404c99b),LL(0x29f414da,0x5a1bac7d),LL(0x81c9d673,0x56fda469),LL(0x2c1bc499,0x66bdcd65),LL(0xfe505f2a,0x9783eab5),LL(0x92378106,0x6f9996ab),LL(0xa7330e63,0xa6238170),LL(0xfa70e33d,0x9a7f0670),L_(0x0000010a),
+ LL(0xfee86a58,0xf15be04b),LL(0x32b87572,0xe35f663e),LL(0x94b48632,0x165f5c52),LL(0x62fb4267,0x7d3b9413),LL(0x407dadeb,0x189d86c3),LL(0x5689012e,0x63e5f780),LL(0x61c7907d,0xa2b7e335),LL(0xc0dc085f,0xd9e3c3c0),L_(0x00000070), LL(0xa9cbe4f2,0x0cfb081d),LL(0x5ac2d2f3,0x11fe0a52),LL(0x32662679,0x8fcbbd46),LL(0x3e344c2d,0xb1ff4122),LL(0xa0a08757,0xa48229e9),LL(0x6f7101c0,0x56b8c92c),LL(0x4af0e804,0xbb9a086c),LL(0xc21360d8,0xed22dd74),L_(0x00000169),
+ LL(0x5a00ce71,0xb34ef3a4),LL(0xac5c1fed,0x800620f8),LL(0xba6237c0,0x97dc7c79),LL(0xff56f449,0x5563d588),LL(0xe8ab9474,0xb2b00a9a),LL(0xb8d1df21,0x6a286295),LL(0x4cf9b378,0x00426dbb),LL(0x30b70043,0xa6195ec8),L_(0x000000c9), LL(0x1fa97f98,0x5a4e4b25),LL(0xd3a62f9d,0x61b4d385),LL(0xad987701,0xb90b4cda),LL(0x41727a73,0x84f90823),LL(0xec4abf7e,0xd814c4a3),LL(0xed3df0de,0xc453671b),LL(0x0c8945f2,0xdda88869),LL(0x94087855,0x25b6219a),L_(0x000001ef),
+ LL(0x0ce5f28e,0x705e5e78),LL(0x3af745ca,0x93ca952d),LL(0x7351cb28,0xfedeccdc),LL(0xc12e9837,0x7e7bfbbf),LL(0xd14b9356,0x47999f34),LL(0xc6295462,0x3f729887),LL(0x5692b0da,0xc96edd28),LL(0x812e383c,0x60ea4fc9),L_(0x000000ff), LL(0xef1bc941,0x70199860),LL(0x493b99ba,0x2d090c33),LL(0x279e0c37,0xbe1503ff),LL(0x3fbe286b,0x80f6465c),LL(0x06d81c3e,0x0a9257bf),LL(0x2a448d3a,0x402ee72a),LL(0x6a5669fe,0xe592b91c),LL(0x5315497c,0x5e220ad9),L_(0x000001ae),
+ LL(0x93b397c9,0x3318572b),LL(0xa3327857,0x0e667f17),LL(0x7af5bff7,0x2e60b913),LL(0xfb65a96b,0x9e25ef17),LL(0x9188dfee,0xdd117ab2),LL(0x830a2c9e,0x5472d03d),LL(0x063aa4e1,0xd8512ca1),LL(0x9593f42b,0x67ebcadf),L_(0x00000181), LL(0xa143be47,0xbbccf7b7),LL(0x40a8123d,0x80d4a4b1),LL(0x8562ea6a,0xe8424774),LL(0x53e144c7,0xa39d882f),LL(0x49ac8b6f,0xb451fe15),LL(0xffe4b1ea,0xc4538f34),LL(0x0527aede,0x1076cc29),LL(0xbcd8efdc,0x4f2ddd83),L_(0x000000b7),
+ LL(0x670c5c5b,0x046d9801),LL(0xf7b5e720,0x0601ff33),LL(0xa07084cc,0x900e6b0a),LL(0x791af83b,0xd2391e07),LL(0x2dd856fd,0x0430654d),LL(0x63408d88,0x82606889),LL(0xc176e8bf,0x2fa4b443),LL(0x18c663e6,0x5deafc4e),L_(0x0000019b), LL(0x48d8ae04,0x950e8cec),LL(0x11b8065c,0x1316d53d),LL(0x3a5ccc8c,0xfeecd686),LL(0xed41a668,0xbb41648c),LL(0xf76ba771,0x9a4bb4b6),LL(0xa9b2b49a,0x370974d5),LL(0xf9f130ae,0x200485de),LL(0x4c25f49d,0x4b31a1b8),L_(0x00000083),
+ LL(0x24ffe291,0x23a38bed),LL(0x41132058,0x4bf85483),LL(0xba359818,0xbdd23ab5),LL(0x3571fdd9,0xd8f1fbf5),LL(0x740422c0,0x46b3d29b),LL(0xdeca158b,0xf7c74726),LL(0x69a6765b,0xe058b8b2),LL(0x3a247a5b,0x9d49dfe5),L_(0x00000125), LL(0x49bfcbe2,0x37b93476),LL(0x3090fa48,0x219565ef),LL(0x30eb0e12,0x996b7d11),LL(0xe2ef23ae,0x935017a2),LL(0xfedd570a,0x59810960),LL(0x510b5963,0xf4feef53),LL(0x4eeb57ef,0xa6aed7bc),LL(0x500fc7dc,0x4dabb423),L_(0x0000009c),
+ LL(0x502210f9,0x2f6be4ac),LL(0x36ffcfaf,0x97a1a521),LL(0x874cac2d,0xd4b6d8f6),LL(0x4e03da3a,0xebd4b9c9),LL(0x058f53fa,0x05bdde0c),LL(0x54da0035,0xea492dfd),LL(0xf1d437ba,0x083ae453),LL(0x837cc36f,0x84792d73),L_(0x000001a7), LL(0x7ab16b91,0x08283456),LL(0xe627feae,0x5b031ea9),LL(0x5ab7febf,0xbc9c1a1e),LL(0xdf744ce8,0x0a851efb),LL(0x944a28d0,0x92d1258a),LL(0xa2c52c0a,0x8db3d01a),LL(0x3272efed,0xc3e55528),LL(0xdd38ae95,0x67075092),L_(0x000000ca),
+ LL(0x6c8b9288,0x201a8b72),LL(0x55d5044c,0xcd7dd04a),LL(0x5fefdd8a,0xf135da4f),LL(0x326e5c4a,0x93ab679e),LL(0x0ebd3dab,0x9e1c63de),LL(0x3da9430d,0xb6139a96),LL(0x1c3e1a0b,0x0bbe99d7),LL(0x31ad9e61,0xb4c624a5),L_(0x00000041), LL(0xd69aa80c,0x312fa8a7),LL(0x10699493,0xb830105a),LL(0x432ef74c,0x427ed742),LL(0x21457fc6,0x32a8f306),LL(0xed7ee077,0xde91b340),LL(0x7b2b2143,0x97655415),LL(0x2c36d1f0,0x3e70f7df),LL(0x8cb68be3,0x10666362),L_(0x000001a0),
+ LL(0x1c2c5d0a,0xbdac0199),LL(0xf48304d4,0x58ea0344),LL(0x7badcb3c,0x61cc3620),LL(0x7fa76693,0xee100174),LL(0xcbbd3041,0xb845bb4b),LL(0x2ab9fe8e,0xbc927037),LL(0x7e87d3ef,0x7c6a4dcf),LL(0x87fd392a,0x4efc311a),L_(0x0000016b), LL(0xf99d4987,0x3518a503),LL(0x093c711b,0x5ed52438),LL(0x8de87657,0x1283fea5),LL(0xa57d89d4,0x1d760642),LL(0x37377224,0xbf397e80),LL(0x0c073eb0,0x2d948da0),LL(0x19066ff6,0x02fb3665),LL(0x6f15cfd1,0xfb0a4e90),L_(0x000001b3),
+ LL(0x0703434d,0x36c93ab6),LL(0x08a36b13,0x54182f0b),LL(0x6018b27b,0x1eb09d80),LL(0x52b2eff5,0x5cab8c14),LL(0x54baf54d,0x09c5f439),LL(0x9128c26e,0xa0c91a3e),LL(0x3c462ce0,0xc8a5d523),LL(0x0dcb5998,0x2d1570bd),L_(0x00000066), LL(0x168afb3c,0x28b7e59a),LL(0x51e02e1e,0x7db3beb7),LL(0x95d9b53f,0xd954033d),LL(0x4280b408,0xfca4117d),LL(0xd87fffcb,0xa8a2c41d),LL(0xedfe3235,0xa4e146b0),LL(0xc9ab6206,0x23f56e8a),LL(0x6cc8df44,0x7a8946c5),L_(0x00000054),
+ LL(0xe30728ab,0xeda148e9),LL(0x09a1b090,0xb3c8e802),LL(0x4fed9972,0x6feab8c2),LL(0xbd0bf024,0x684e8ba5),LL(0xb6e56fc0,0xc679d0b7),LL(0x3a2827e6,0x05aad3cf),LL(0x9605e502,0x154eec73),LL(0xc7d72f2b,0x9336c1e2),L_(0x0000009a), LL(0x04181bc3,0x17c5f246),LL(0x0c346607,0xf9d4abe6),LL(0x9d5267c4,0x53390747),LL(0x76bf72c0,0xe2e74911),LL(0xd4ea29a3,0x25cb2342),LL(0x5c9021dd,0x7e8d6c56),LL(0xac452ce1,0x1fd1d0fd),LL(0x7f5955ad,0x61f3d3df),L_(0x00000094),
+ LL(0x7a984abf,0x46f086dc),LL(0xd299e678,0x3ae95a65),LL(0xb7f240f5,0xadf74e6d),LL(0xdd46db9e,0xc95ae291),LL(0x3dae88ec,0xbc688dc9),LL(0x4474ebcc,0xe0bd1aae),LL(0x3a30df47,0xd32d0317),LL(0x222e18e3,0x088bd254),L_(0x000001ad), LL(0xda1caa7c,0x3b9e4f98),LL(0x584fa9c3,0xe3bb36fe),LL(0xa33fbb40,0xece5a0db),LL(0x990ebace,0x2d1efc59),LL(0x1c0c2167,0x0ea367aa),LL(0x18eb3285,0xaa6c72bd),LL(0x4a9d7d68,0x69e3bcf6),LL(0xcd396faf,0xb1399f8f),L_(0x00000027),
+ LL(0x20f43bc2,0x14169ebb),LL(0x776ec8b3,0x4d9ce016),LL(0x40cc814f,0x64db6f3c),LL(0xde6701fd,0xbc27b375),LL(0x1be16687,0x41b2641f),LL(0xaaf1c8ca,0x5c7ebdd8),LL(0x667e429e,0x9221918a),LL(0x84d2d4cd,0x68099d93),L_(0x000001bf), LL(0x65966739,0x502a6f1f),LL(0xe772626c,0x612fc65a),LL(0xd1717c45,0x06b47588),LL(0xcd0bd273,0xfd9dbcb0),LL(0xf7b68702,0x5beaed3a),LL(0x60d2a43a,0xd9e3bfb5),LL(0x618c6158,0xeec14b9b),LL(0x1dad1537,0x9166a242),L_(0x00000117),
+},
+/* digit=49 base_pwr=2^245 */
+{
+ LL(0x7b9e7889,0xe957ebe2),LL(0x3ae1f292,0x2bd715ca),LL(0x6ae08fea,0x3b2ea475),LL(0xcab67aaf,0xf247c9f5),LL(0xd47caa37,0x53af0925),LL(0x409f1b89,0x57e7bd1f),LL(0x4ee5b8e5,0x0b979eb1),LL(0x0e289030,0x16dd58bb),L_(0x0000017f), LL(0x1d78d6b7,0x3dfcb1d0),LL(0x595db0c6,0x8e6aaf05),LL(0x9217ec90,0x45106ff4),LL(0xab12df36,0x8489adb8),LL(0xc4207aff,0x257b835b),LL(0xabbbb85d,0x706e08a1),LL(0x71ad10a3,0x6d2a5b7d),LL(0xe224792f,0x528cf56a),L_(0x0000003d),
+ LL(0x8295b8b6,0x65b39aaa),LL(0x0690f149,0x1270c951),LL(0x763e6fce,0xbafb3a9f),LL(0x3f839143,0x0dc990be),LL(0x3866c189,0xa0d6a0e7),LL(0x087b74c8,0xb520d476),LL(0xd8910a14,0xbd81006e),LL(0x16e6fb91,0xfae3e52b),L_(0x000000a1), LL(0x9757756a,0xbe4b13d0),LL(0xc54fba1e,0x3f1884ce),LL(0x4519ff97,0x68950392),LL(0xfb9e4f42,0x2d309b59),LL(0xf2ce5e20,0x004b85f0),LL(0x35d898e0,0x05c20b17),LL(0xd4f54e0b,0x34add1fb),LL(0x178e2a7f,0xee6a8dcb),L_(0x000000c7),
+ LL(0x9fa52c89,0x8fc48ea8),LL(0x6a680dfd,0x4b09bae8),LL(0x78d67917,0x7cea1e12),LL(0x0f37ae3b,0x8383d337),LL(0x9f51107a,0x157913dc),LL(0xbbd05c8e,0xc347e479),LL(0xe7f7f024,0xc27dfb63),LL(0xa32c2410,0xa1e55ac4),L_(0x0000005a), LL(0xa0c5983d,0xbc8a42a9),LL(0x31f03f3e,0xdb0533ac),LL(0x07b4440f,0x1b5cb9b7),LL(0x522041e9,0x18816d64),LL(0xa0763672,0x78c44489),LL(0xa7d823be,0x0289668f),LL(0xa033e066,0x14b7bda9),LL(0x1bf9880e,0xb68f4c04),L_(0x0000004e),
+ LL(0x992b024d,0xcc47fd44),LL(0x301e6aa5,0x4ca3c2ae),LL(0xa239d460,0xb59f6635),LL(0x72a93968,0x93da741e),LL(0x6f3e7cb4,0xe451c847),LL(0x958457a0,0x0539a4ae),LL(0x0ccc6f49,0x70df123a),LL(0x4b36ee4a,0xa7af1f3e),L_(0x00000171), LL(0xa5bf5964,0xd54e934e),LL(0xa4f9d8d0,0x838881f3),LL(0x5759057f,0xd231904c),LL(0xf74d21e3,0x65fa2854),LL(0x09110e09,0x3e3fbb9d),LL(0x73f82547,0x66595687),LL(0xc3213d46,0x4ee05953),LL(0xc6c9fbf7,0x8044dde0),L_(0x0000015d),
+ LL(0xf19f1768,0xfbd4f466),LL(0xccc78e3b,0x4ab17eab),LL(0xe0f582bd,0x42edf70d),LL(0x32c21454,0xe1c56694),LL(0x7f57c601,0x01c830d3),LL(0xe9eae160,0xe56900b5),LL(0xca26d56c,0x36688674),LL(0xb2fb4c7c,0x145b107e),L_(0x0000012f), LL(0x53c6182e,0x47ff90cc),LL(0xaaf18b16,0x8fc84257),LL(0x96b0582e,0x9e3a6661),LL(0x4532767f,0x0d14fb71),LL(0x29d6ef11,0xdc2f950b),LL(0x54eb6cc6,0x85acbd0a),LL(0x525b30dd,0x5c05fb17),LL(0x67dd5268,0x2af3ff75),L_(0x0000006d),
+ LL(0xaabdb0b2,0x1475f80e),LL(0x6b7bb07c,0xd90a1e1c),LL(0x92ecf09d,0xc193105d),LL(0x5feeb4d3,0x322cd2b8),LL(0xd3b68b08,0xb3acd3e0),LL(0xb0ed276b,0x50511672),LL(0x512d83e9,0x5830b5d3),LL(0xda968b0a,0x849009db),L_(0x000000cd), LL(0xa9aed6cf,0xadb30375),LL(0xb42997c1,0xc6687e52),LL(0x1d88f275,0x5c1d5e8e),LL(0x5d9e895e,0xdbf775d5),LL(0x1f149b28,0xc29aed12),LL(0xe2724e7a,0x220a70ba),LL(0x7e781bbf,0xcf9cd146),LL(0xfb0950fc,0x40e01766),L_(0x00000026),
+ LL(0x26492a48,0x8f120fe7),LL(0xb833386c,0xbca86762),LL(0x7d77fbcb,0x2f67d175),LL(0x5165ed7e,0xf29932da),LL(0x40520604,0x607db461),LL(0x88627d90,0x74dd9734),LL(0x9d6e8589,0xff8795e0),LL(0x0898a1bd,0xeba49f57),L_(0x00000104), LL(0xf0c19be8,0x3e449e91),LL(0xc086fd4a,0xce081f35),LL(0x60f6bfc7,0x6b980172),LL(0xf116eb17,0x438fccb9),LL(0xb036eed0,0x3b9d80a6),LL(0x355bcf69,0x17f28db4),LL(0x1d897ded,0x5b488d87),LL(0xb2564e1a,0xa12f88be),L_(0x00000147),
+ LL(0x6223dd4a,0x84db5faf),LL(0x0b0f5e29,0xd39d495d),LL(0x0a14e52d,0x723841ce),LL(0x365ed8de,0xb4ef0fcb),LL(0xdbcb1fe9,0x3aa7d5d2),LL(0xb19047ee,0x2d33c7e0),LL(0xe2978f53,0x2ad3b9dd),LL(0x9dbc97d1,0x7d591532),L_(0x00000104), LL(0x02d16555,0xb3172c7a),LL(0x8804b57f,0xbeeb32c4),LL(0xad774958,0x59e99dad),LL(0x34b2bc96,0x90ab3c79),LL(0x33fd281f,0xe477effe),LL(0xfaa713ab,0x78b329a3),LL(0xf3df2353,0xac36cbb9),LL(0x62e824d0,0x01585145),L_(0x000000d8),
+ LL(0xd8f323fb,0x81a85944),LL(0x3dd3e0be,0x51a21fab),LL(0xd871d4d4,0xb561f31e),LL(0xb4ce4cde,0x4449b15f),LL(0xce67b526,0x64493f22),LL(0x82ddd4ad,0x546ec9b8),LL(0x0adc07a9,0x4dba63e9),LL(0x82628c7e,0xcc85d728),L_(0x000000a9), LL(0x5e900de4,0x358c4d59),LL(0x8391c4fa,0xd7be91ac),LL(0x82f89ceb,0xac49480b),LL(0x0dcd6532,0x48237726),LL(0xd2dee6e8,0xaeda17a0),LL(0x13850532,0x2d6729ba),LL(0x201426a9,0xf52c6ebc),LL(0x188c6ec6,0xe02e54ae),L_(0x000001c3),
+ LL(0x9b37123b,0x274b93dc),LL(0x0d11cfe3,0x01caef2f),LL(0xbe8ef001,0xef0d218a),LL(0x2810cd03,0xace6e761),LL(0x5c17a13d,0x65a61b64),LL(0xcfaaba81,0x669bf078),LL(0xd429ba49,0xd9a6abec),LL(0x0f71e96f,0xf999276c),L_(0x00000185), LL(0x592f7894,0xe42d0a9c),LL(0xfcc98aed,0x3730d520),LL(0xbb02c8f7,0xe10a8edd),LL(0x4886062f,0x57fa6238),LL(0xdab28f83,0x308d0fc8),LL(0x13c4d161,0x8db6b346),LL(0xf5b7f11e,0x70d7617e),LL(0xd7fc6e4f,0x6c6606b4),L_(0x000001dc),
+ LL(0xe3c773fc,0x30cb34f5),LL(0x854f6660,0xd3093680),LL(0x5abdfb30,0x7939c865),LL(0x3d739567,0xa46ffe9f),LL(0x3a7253f9,0x8fd8f096),LL(0x151f1baa,0xa1443d09),LL(0x9a29f4f0,0xb2ed7af8),LL(0x0ad8104e,0x3a019dfe),L_(0x0000001d), LL(0x76fc8041,0x0868fcae),LL(0xf81d0998,0xdba2642e),LL(0x7f6f6367,0x57d4f243),LL(0x6a189847,0x92fa4eaf),LL(0xc022a76b,0x4e736ea2),LL(0xdd251f4b,0x06ebdd88),LL(0x39b7f55b,0xb9f83aec),LL(0xf34e682b,0xe8264e21),L_(0x000000b1),
+ LL(0xba33a960,0x502d83da),LL(0x377dd454,0x04a7d732),LL(0x60c9b2c8,0xfa223630),LL(0xe06fc03b,0x7e497e85),LL(0x145bb405,0x456567db),LL(0x39898314,0x2d3a76ad),LL(0xeb33a535,0xd36b4686),LL(0xebbad130,0x134c3479),L_(0x000001f7), LL(0x8a5778a7,0x10340c30),LL(0xf7b160b7,0x1f4c9e0a),LL(0x729201ef,0x09fe7ed4),LL(0xe28d29ca,0x57eb2d3f),LL(0x3e4bfbfc,0xfe99fffb),LL(0xe7397e68,0x62215a66),LL(0x18c1dc25,0x16278a5c),LL(0x1045ab03,0x3d04aaca),L_(0x000000a3),
+ LL(0xb45b8788,0xc3b9c902),LL(0xe8e7e9b5,0xe1deb5a2),LL(0x6f0ccb02,0xcc118df4),LL(0x931e8bf3,0x44d4d935),LL(0x8d49c80c,0xae880f5f),LL(0x294917c6,0xdaf4ba46),LL(0xf7ee5bdb,0xe09285b3),LL(0x11c3f0c5,0x981a5efe),L_(0x000001a2), LL(0x6f1e6d94,0x150c77e6),LL(0xc23026fa,0x8e7cd3f5),LL(0x567d2494,0xfba4ae31),LL(0x380b42d3,0x7135a34e),LL(0xdf2c5139,0xf390e611),LL(0xfd3ff544,0x1f3b21ae),LL(0x4254bcbc,0x67fca024),LL(0x68f4c9e3,0x2b49a43b),L_(0x000001ff),
+ LL(0x68ed5662,0x0fa1e08c),LL(0x31f2c30a,0xb65f32e1),LL(0x2d06bb12,0xfec7dae7),LL(0x95c78209,0xb2e0fbb5),LL(0x7d228e9d,0x84a73eeb),LL(0x0a7cd176,0x4968f085),LL(0xb3a9c57a,0xf1034b1b),LL(0x12dc73c6,0x942d801d),L_(0x0000003e), LL(0xd74b5636,0x90895a11),LL(0x8864d82d,0x8f322a4c),LL(0x1db6f8b1,0xef6cb619),LL(0xdc8f7532,0x95fe8c47),LL(0x6bb6ba07,0xb376849e),LL(0x6839da29,0x55ee699f),LL(0x9e4c3d09,0x013177ca),LL(0x06ac03b0,0x0b1b8598),L_(0x00000187),
+ LL(0x68b8e4b1,0x556e1c75),LL(0xb2cfde0a,0xbf8d1b12),LL(0x77dcfbef,0xbfb5199d),LL(0x8803a28c,0xb3b33660),LL(0x9ab9ee66,0xffcfec92),LL(0x75479f96,0x66780a53),LL(0x9e3f38c0,0xe21a1107),LL(0x8d2c8147,0x61fe7ba1),L_(0x0000002e), LL(0xf14b8da9,0xf175c60b),LL(0xc9c58bd9,0x94928d32),LL(0xf4158167,0xa1977e7b),LL(0x3720a8c9,0x50e84c76),LL(0xb29acf00,0xa73b8ebd),LL(0xdf12fc49,0x8d8a4296),LL(0xf75a8ea8,0x1abde921),LL(0xaa9b61ff,0xf9a127a6),L_(0x000001d8),
+ LL(0xd278de5a,0x458b071b),LL(0x5b584d1f,0x0313ed9b),LL(0x5f476cd6,0xc54ce5fe),LL(0x007678c1,0x6d145a77),LL(0xe258964a,0x0c62f8fe),LL(0xfa68420c,0x595f7056),LL(0x63621f28,0x2d891192),LL(0x5d8cf9f8,0x32cc419c),L_(0x000001d6), LL(0x130243d2,0x8d5a87bb),LL(0xbcf908d7,0xc4e517b3),LL(0xd0ef67bc,0xba70f65d),LL(0x30e5dd35,0x41af2fd9),LL(0xaeb9fb07,0x448314ee),LL(0xf71f75eb,0x3702fdd3),LL(0xbac48350,0x1d2c0a91),LL(0x1ebd11ec,0x96f4f8e9),L_(0x000001cd),
+},
+/* digit=50 base_pwr=2^250 */
+{
+ LL(0xf4bf04df,0x31cb2cfc),LL(0x0c3adb10,0x13e25b6e),LL(0x3dd2ab40,0xff8fa4cf),LL(0x758e2edf,0xfeffd307),LL(0xf31ad907,0x4baf111b),LL(0xeba1b456,0x3c4f6a12),LL(0x13a81607,0x94fad755),LL(0xe7fc43bd,0xaee6974d),L_(0x00000100), LL(0xb8d44eee,0x369ffff5),LL(0x5334df1e,0x64f19da6),LL(0x5c2b9ceb,0x01321d0f),LL(0xc5ca3390,0x02b87e91),LL(0x45689acf,0x3a49c8b5),LL(0x049dbf7c,0x93f7ed7c),LL(0x8d277840,0x73a0a1d5),LL(0x726f20ba,0x702173d7),L_(0x000000b2),
+ LL(0xe3d95d4b,0xe45eed99),LL(0x8fe19237,0xddc0cb97),LL(0x7eb46e14,0x4df73f68),LL(0x57bdaf6e,0x8670ac6f),LL(0x847741a1,0xa46fbe2b),LL(0x02454925,0x82f9632d),LL(0xc15a10d2,0xaf2e144f),LL(0xc55aed10,0xfcdce815),L_(0x000000af), LL(0xc44dce06,0xa506cebb),LL(0x03aaab25,0x48b6559b),LL(0x933863a2,0xc348048a),LL(0xd37a9de4,0x26cd5e20),LL(0xc20f4402,0xee95db69),LL(0xff1c74e9,0x2f425e1e),LL(0xd820bb88,0x1933a6f8),LL(0x6f95cad2,0x93758ef0),L_(0x000000b3),
+ LL(0x6d40379a,0x87db0c0b),LL(0x3e1edc80,0x4c5fed50),LL(0x8c80df24,0x0d788315),LL(0x5caf06ac,0x12556a93),LL(0x95b47183,0x76d86da1),LL(0xc5714cff,0xcec43480),LL(0xc2f30fbd,0x4e4b2ab3),LL(0xc0cb91c6,0x3a9665b8),L_(0x00000121), LL(0xcbc11bf0,0x75b252f6),LL(0x87c8dce3,0x501537b7),LL(0x84253d3b,0x6a40795c),LL(0xa38fd372,0xb45a08cc),LL(0x22234e1d,0x09918d4e),LL(0x76319208,0xea70d97b),LL(0x3ef6521d,0x0bdcb67c),LL(0xae2d874b,0x5bf47d8d),L_(0x00000024),
+ LL(0x8fe4e5c5,0x4aedde8b),LL(0xc0d36b58,0xaba27830),LL(0xc0f869dc,0x32bc7d59),LL(0x14a35cbc,0x22d71ab7),LL(0x04bed4bc,0x00680d9e),LL(0xdf25061f,0x3bf0836a),LL(0xb3d768c3,0x3b0d7fed),LL(0x616b984e,0xaa12f95c),L_(0x000000c3), LL(0x3c8c5d5c,0xbd923c28),LL(0x9a32e9b2,0xfbaf0321),LL(0xf0d8e95a,0xed15bdb0),LL(0xd3039b5f,0xd8942727),LL(0xcc59ce26,0xa1dec9a4),LL(0xf0b3676f,0x21992696),LL(0xb8c7cfb1,0x27260c98),LL(0xc1c97929,0x66cb2541),L_(0x0000002d),
+ LL(0x97538cbd,0xee612332),LL(0xd25447d7,0xa1040800),LL(0x9c9bdc12,0x06fb815b),LL(0x191fed4b,0xae49fbdb),LL(0xd9407747,0x3d19e592),LL(0x9715df76,0x4613ac78),LL(0x1e9e20a7,0x6c932530),LL(0xe2bfff7a,0x92e124fd),L_(0x0000000c), LL(0x6bfd0423,0x13390bb3),LL(0xb87dda88,0x40017ffb),LL(0x979fe6b8,0x635bb57d),LL(0xb6fc9a61,0x8ce87e55),LL(0x535b6b63,0xea1ec56c),LL(0xf567cddc,0x06b927fc),LL(0x72c516ee,0x6fb0868c),LL(0x2ebdac5a,0xfb20cdff),L_(0x000001c3),
+ LL(0x76e19265,0x53bc630e),LL(0x506faf0e,0x88127211),LL(0x64c166ff,0xad3fc9e2),LL(0x6308dc18,0xb271bc9b),LL(0xec631a3e,0x23be699b),LL(0x2e23525b,0xbfded0b1),LL(0x2391574a,0x69f0d2b6),LL(0xa8ede972,0xcfd5d67b),L_(0x0000001b), LL(0x194cc299,0xf244f4b2),LL(0x911e4585,0x7871cfc3),LL(0x52af7b51,0x331dbf96),LL(0xd41147d5,0x7a399291),LL(0x48e46193,0xb0e20d54),LL(0xd985a24f,0x98e92da0),LL(0x7266525c,0xe9b74352),LL(0xe84bc9e9,0x0956c443),L_(0x000000b9),
+ LL(0xe9d37b18,0x456032b1),LL(0x30dc5e77,0xd6168724),LL(0x47f55c35,0x18a17037),LL(0x154ea414,0x86d54c7d),LL(0xe14c43c8,0x8d092542),LL(0x78f9b9e8,0x986d7498),LL(0x98519065,0xcc71fd0e),LL(0x4d22c2b8,0x3de62260),L_(0x000000f5), LL(0x91d1b267,0x4de89064),LL(0x601dee13,0x91ac8ed6),LL(0xd375837e,0x8587c0dc),LL(0xa03d56de,0xd2c2524e),LL(0xa4331dd9,0xf36ec517),LL(0x0f8bb8e6,0xb100599c),LL(0x0dc65f7a,0x8ada0049),LL(0xa298259e,0xdd8602f3),L_(0x00000083),
+ LL(0x1b2f821d,0x01e839c8),LL(0xcb7e709f,0xf9520b0a),LL(0xc4857ab9,0x3a85ef6e),LL(0x09f9eda6,0x51f47572),LL(0x96daca66,0x6e717337),LL(0xccecd697,0x40b37bfa),LL(0x29f4ce02,0xcbb44372),LL(0x0fe8a0ff,0x50a9f191),L_(0x0000018a), LL(0xa3781970,0xcf2ed75e),LL(0xf948f559,0x524a7d80),LL(0x3e1fceef,0x058a1573),LL(0x25fd5510,0x5865318e),LL(0x14c29ed3,0xcb7d9fa1),LL(0xcaa64e51,0xf171b487),LL(0x25580546,0x006163b8),LL(0xde740000,0xb9c9d686),L_(0x00000055),
+ LL(0x87d0f1ad,0x4cf7363c),LL(0xd4fe9fd3,0x9bd13abd),LL(0x4b7d7e77,0x66face9e),LL(0x42746d44,0x0edf9d57),LL(0xd5f51826,0x888b45bf),LL(0x37b7e3fa,0xde49e8c9),LL(0x0262004d,0x8fd87627),LL(0xdc4da423,0x9122108a),L_(0x00000012), LL(0xce31cec6,0x2990a670),LL(0x1be9607f,0xf2081d18),LL(0x8855d0c8,0x11fb1c34),LL(0xc4c2574d,0xf1b8ff1c),LL(0x3e444ec2,0x4404e3fc),LL(0x2db84189,0xb7726488),LL(0x0dd78e74,0x7de996b1),LL(0x7da11b57,0x12b7b41c),L_(0x000000b4),
+ LL(0x6a5bd2b7,0x343d29b0),LL(0xd33329b0,0x82fbc88b),LL(0xd3fc973d,0xe1e7bcdd),LL(0x111c0001,0x1c56ee4a),LL(0x0cb45e7f,0x65818c84),LL(0xaccf98e4,0x69029f68),LL(0x6bbf8831,0x53ac7e98),LL(0xe2fa2c45,0x8eccfe60),L_(0x000001db), LL(0xb7950225,0x0e5094fb),LL(0xf11a656a,0x3eed5459),LL(0xd3afccdd,0xe6e4111f),LL(0xc0d31cdb,0x822775ae),LL(0xfb39d140,0x04034f9a),LL(0x5954dd7b,0x8adace51),LL(0xc58c7b83,0xeef24d4c),LL(0xe9d767e5,0x40051c4d),L_(0x0000000b),
+ LL(0x7f21ed73,0xfb8a9c16),LL(0x300cbdfb,0x12e137b8),LL(0x22e8279d,0xefc00fd0),LL(0x173a4228,0xe30fee24),LL(0xaf4fb8a2,0xaa67fa02),LL(0x6171abf8,0xda82a49d),LL(0x418d47f2,0x3ea61949),LL(0x572fdfa4,0x581b7570),L_(0x0000001a), LL(0xbfe14768,0xceb46b56),LL(0x36fbf6b3,0x2855bf4d),LL(0xd4e1ce80,0xeeceaddf),LL(0x5130ec7d,0xeb1ca189),LL(0x57123316,0xabed8057),LL(0xb7e8b4c8,0xcb8de9f3),LL(0xa878fb40,0x81b143a5),LL(0x2fa96496,0x9080408b),L_(0x0000012c),
+ LL(0x22b150de,0x9a87c082),LL(0xad76f636,0x222ff210),LL(0xf2177234,0x874b4d66),LL(0xfb6d673f,0x7a63aa6f),LL(0x559b847a,0x1fb601b8),LL(0x7f528818,0x1d5a56e1),LL(0x2dceae56,0x159cad3b),LL(0x64799ea5,0xe50c2b70),L_(0x000001fe), LL(0xc6717776,0xfb840953),LL(0xe6943ee3,0x6c82ee1f),LL(0x45986586,0xa8804763),LL(0xb2c01a1d,0xd2e62027),LL(0x81dd9ed1,0x7ac9ecf9),LL(0xa86a93b5,0xea3ed52c),LL(0xab42d43a,0x9783c732),LL(0x4badd572,0xf7f2c527),L_(0x000000f1),
+ LL(0x4e7db852,0x1ee36133),LL(0x5d2ce89b,0x7925fde7),LL(0x344442cb,0x7be13983),LL(0x933fd989,0xf818aa84),LL(0x868cf674,0xcf763eff),LL(0x970119fa,0x1161eea1),LL(0x91b1cf2b,0xf803b198),LL(0x47f45bbc,0x358bf9d3),L_(0x0000004a), LL(0x2871ba24,0x03c6e820),LL(0x946bbdda,0x1e7f5b10),LL(0x6d786c0b,0x901e63e0),LL(0xf905444d,0x61291f2a),LL(0xa07d991d,0x26f8514d),LL(0x5dd4a768,0x8caa8bed),LL(0xba23453d,0x625c627a),LL(0x55ae73dc,0x566ebb14),L_(0x00000172),
+ LL(0x7616ee6c,0x76716c8f),LL(0x9e16dd77,0xd9dc6964),LL(0x424e43ef,0x4f1ab6f7),LL(0x3307372b,0x853acdd0),LL(0xb131b10b,0xd0481561),LL(0x6c779030,0x8833d896),LL(0xb43c81fb,0xf49c69e7),LL(0x013b71e6,0x2d5044d9),L_(0x00000171), LL(0xf6938c6c,0xcb8f8364),LL(0x7d7772d3,0xb55fa4df),LL(0x5c5bb6fc,0xe309036f),LL(0x87518233,0x00458dd9),LL(0x5ae0cb46,0xab6a628e),LL(0x80a93940,0xd00141d6),LL(0xe42dc460,0xe62c337f),LL(0xf594561c,0x32989bd5),L_(0x00000113),
+ LL(0xe8ff16d6,0xd0f00eb5),LL(0x060c9ece,0x76dc2763),LL(0x8d24bcf1,0xe04a4e63),LL(0x8049d5a2,0x1f378724),LL(0xad86dce1,0xee568d6b),LL(0xbd4ecf75,0x064ed8ea),LL(0x23b4afb4,0x3066bb9b),LL(0xe8ba5019,0x59524e62),L_(0x00000113), LL(0x16a5e07c,0x0317cfe4),LL(0xb05c4eb0,0xe263fd3a),LL(0x87619f5b,0xe43b9d32),LL(0x04548fa9,0x5fe60636),LL(0x1e3bb4ee,0x177080d6),LL(0x80dd88dd,0x6b920ffa),LL(0x50a4adb9,0x6cf839eb),LL(0x579a402c,0xbaad4226),L_(0x0000016a),
+ LL(0xd3860f86,0x51b92975),LL(0xd751ffa4,0xe9c89ace),LL(0x0fff3b8f,0x22e82df0),LL(0x44ceed1d,0x9ef4bd4d),LL(0x322e7d38,0xec43e5b6),LL(0x5dafe91d,0x3ac6cd72),LL(0x385f22e0,0xc23c7139),LL(0xecc87ca1,0x8c786dee),L_(0x00000186), LL(0xd6515802,0xfbf97dbf),LL(0x72372941,0x689ac9e8),LL(0x4611974e,0xce7740f8),LL(0xe04ba0c6,0x7a8f9746),LL(0x7419caa0,0x05b0cdaf),LL(0x30755659,0xcd257003),LL(0x5af7e403,0x8e3b2c01),LL(0x7d54b47d,0xc1f90328),L_(0x00000043),
+},
+/* digit=51 base_pwr=2^255 */
+{
+ LL(0x06aeb844,0x171b7252),LL(0x2f67f278,0x3ef95a8f),LL(0x411d7c3d,0x1341fdfb),LL(0xbc9db5d5,0x9c831f2c),LL(0x64cd3d49,0x5fa0db40),LL(0xb8bb90a7,0x2c8d72cf),LL(0x050fdef7,0x9770a986),LL(0x584d26e8,0xcb48ff2a),L_(0x000001c1), LL(0x8a357b6c,0x75fe114c),LL(0xe1fc26b3,0xaa2296d0),LL(0xe2fe623c,0xe037cba1),LL(0xca73315c,0x36843eb8),LL(0xb7e86db2,0xb5b70ddf),LL(0x4b155e04,0x20198f9d),LL(0x06921394,0x51535cfa),LL(0xaa06d437,0x98bee5a2),L_(0x000001b1),
+ LL(0x89cc4566,0x68f57feb),LL(0xa2543b28,0x4bd3cbd6),LL(0x0bf63c0e,0x66da5e56),LL(0x648f4a56,0xb7d9cc0e),LL(0x7591427c,0xab848b1a),LL(0xe85c5977,0xf4656829),LL(0x4025667a,0xcdae8f7a),LL(0xab876527,0x93eb73b4),L_(0x00000077), LL(0x204ed818,0x30db96c4),LL(0x1b3e5e48,0x26c352dd),LL(0x497308c9,0x54703369),LL(0x3370174e,0xa9534502),LL(0x7c6d8497,0xae86058c),LL(0xae7aecbf,0xa32e4cdc),LL(0x67daf0b8,0x3a4e9eb5),LL(0xaf8dd7df,0xff79b85e),L_(0x00000081),
+ LL(0x5b9e36c3,0xe50c2a6e),LL(0x316c41f6,0x6af25999),LL(0xe48ac795,0x813a1e7e),LL(0x65d44dd3,0x7fc2f7f1),LL(0x4d3b130b,0x08cc4038),LL(0x7c00e333,0x4484ccd4),LL(0x8e7636fc,0xf9a80322),LL(0x1688e5f3,0xb4b52a8f),L_(0x000000e2), LL(0x0987f80d,0x2cd48e4d),LL(0x9fe4562b,0xaa48e7e6),LL(0xf168a311,0x7fdc1a14),LL(0xdf4018fc,0xc463e403),LL(0x6c8979b5,0xd6d0bb4b),LL(0x62cddf39,0xdf09f24f),LL(0x9b318fce,0xca7e6578),LL(0xcab54343,0x48ea638d),L_(0x0000000a),
+ LL(0xd7deae24,0xcb23734e),LL(0x23939762,0x66bcd84d),LL(0x989a46bd,0x85ec037c),LL(0x65439883,0xcc808ec0),LL(0xa3f08c8a,0x680dc66c),LL(0xa76800e7,0x4c3c5332),LL(0xcc98ee9e,0x8663204a),LL(0xa0ef46de,0xa2348db0),L_(0x000001ce), LL(0x05b4a4e2,0xb14e22b3),LL(0x930a37ee,0xe9d3141e),LL(0x35f5cd09,0x3364f154),LL(0xf55ccf3f,0x55f31352),LL(0xf6c93770,0x0c74549e),LL(0x4bf80f61,0x8d0207da),LL(0xb1c2b15c,0xafb6ee97),LL(0x0992fd2c,0xfe513092),L_(0x000000ff),
+ LL(0xea69c80c,0xc95caa93),LL(0xdeca4025,0x95bc2026),LL(0xc8c86ea9,0xe3161b91),LL(0x73fc72d8,0x46b441b7),LL(0x033e25a4,0x6b7c1805),LL(0x2d4e9335,0x5a4b1a06),LL(0xd30b7dc3,0x992637db),LL(0xdaac9a90,0x7c72add5),L_(0x00000146), LL(0x4f4c9063,0xc14619bd),LL(0xfbc662e7,0x3c65896e),LL(0x8176a953,0x1c5790f3),LL(0x4f51c6bd,0x0ef460cd),LL(0xc6fa754c,0xee3cd226),LL(0x5e872735,0x05291b65),LL(0x79e3b5c0,0x734e1b22),LL(0xfa256432,0xf18b1394),L_(0x000000cf),
+ LL(0x0643f252,0xedb2cca1),LL(0x00e32811,0xc996f279),LL(0x6f6af92c,0xbf992edb),LL(0xbdef8275,0x3384462d),LL(0xa4dd3d26,0x818a7ff9),LL(0x8e214401,0x60e7694d),LL(0xa7aec62d,0x9d54e87f),LL(0x8bdd2244,0x5d769f98),L_(0x000000ba), LL(0xfb63c9fb,0x7e7ff11a),LL(0x7eec026d,0xc6b3e18f),LL(0xe08b80f1,0x84b5c983),LL(0x5d6b5a4c,0x4b0fd4b7),LL(0x85f99e3a,0xfc4904ce),LL(0x7afd5a7c,0xc336a99a),LL(0xba1e62f6,0x24e4a736),LL(0xbe20ba29,0xcceea595),L_(0x000001c9),
+ LL(0xbb592469,0x29ecccb0),LL(0x89ef0925,0xce6e29e1),LL(0xf98f60f1,0x36216c3c),LL(0x0848c8bd,0x63a73874),LL(0x085409b9,0xd4abc07d),LL(0x2319eb0d,0x0e39c02a),LL(0x6bda97a9,0x393de5dc),LL(0x0140ddd0,0x5302f915),L_(0x00000104), LL(0xa2f22a24,0x54381101),LL(0x423788d2,0xb694bdb7),LL(0xc151a89e,0xd0ef2b67),LL(0xb01ee242,0x01c2b082),LL(0xc07af292,0x10fd1158),LL(0x3639401a,0x8e3f86e2),LL(0x1ed8f101,0xcf21ea60),LL(0x83b3b62f,0x186fd3fb),L_(0x000000d5),
+ LL(0x718c92f0,0x3423f6e8),LL(0xdae8d246,0x5f129e35),LL(0xaeff7db0,0xdbad59f4),LL(0x963932f5,0x3cf82c0c),LL(0xf5e468db,0x6b7d10e1),LL(0x10e6e23c,0x6e085959),LL(0xc76fb1b0,0x538880e8),LL(0xe8c12594,0xf8f02134),L_(0x00000021), LL(0x89506649,0x272ea4f0),LL(0x9dd1a14c,0xaa274066),LL(0xa6cc0d62,0x191622f8),LL(0x92244f6f,0xd28338e3),LL(0xc3dcbd9d,0xa8dd7166),LL(0xa39c0c61,0x4930a90c),LL(0xb979b8ce,0x6cd41296),LL(0xaa5c88b7,0xf6ce2037),L_(0x000001b0),
+ LL(0x8ef889ab,0x6a8258a9),LL(0x87f34cfa,0x6e977272),LL(0x538468d6,0x198bf996),LL(0xe9cb2903,0xea7ac40d),LL(0x389f9bff,0x50fd922d),LL(0x88f4717c,0xcb0c2bca),LL(0xb57f0298,0x5d670088),LL(0x812c3767,0x7a4062fa),L_(0x000001d3), LL(0xd95da33d,0x89860058),LL(0x74f4e9a6,0x9df658db),LL(0x46a06ddb,0x8faf5c15),LL(0x36b96ffe,0xe9bbc867),LL(0x1a07dce2,0x19a59e1c),LL(0x9536a09f,0x1683c160),LL(0x7fabb0f1,0x183d2bdd),LL(0x06b7a416,0x75975bd0),L_(0x0000015b),
+ LL(0x5451d16f,0x720fff5e),LL(0xeacd93fd,0x6c62e42c),LL(0x6f74fc83,0xff9b7285),LL(0x8a51db93,0x7b6bb42b),LL(0x66ca983e,0x8fd893a3),LL(0x08eee06f,0x491c6c89),LL(0xe1230942,0x638e9f64),LL(0x4984e580,0x9b2ab576),L_(0x00000063), LL(0x0bad9aba,0x7b9d835c),LL(0x84846555,0x89b78779),LL(0xc6bb325d,0x88fce8c3),LL(0x0fb571c3,0x237c5f2e),LL(0x27185f17,0x37bcf483),LL(0x53b0ac57,0xf037df6f),LL(0x34a972e5,0x73b6f7ae),LL(0xf685c7b2,0x3e68f821),L_(0x0000012f),
+ LL(0xfab07625,0x52bebe14),LL(0xd1fbd06a,0x7d25c686),LL(0xe5149dc2,0x20b2f012),LL(0x6707c1b6,0xe4fdb06a),LL(0x5cf7e0a4,0x124b0592),LL(0xdadcb97c,0x9ef54e16),LL(0x97f26141,0x6b91bf50),LL(0x689c475b,0xf26ed365),L_(0x0000001c), LL(0x31ac5e9e,0x95772aee),LL(0xf333125d,0xfb3bbb8c),LL(0x906a459b,0xda033a3e),LL(0xd9a3800f,0x7aebdf94),LL(0xea08c76a,0x4600cde7),LL(0xecd96496,0x1b4f8404),LL(0xb9fdf8c7,0x58389c23),LL(0xd186fc48,0x9a44e137),L_(0x00000045),
+ LL(0xace5575b,0xabf66053),LL(0x6dc5328e,0x54861cbd),LL(0xea9fdaff,0x8555b123),LL(0x0ecf823c,0x09e411c0),LL(0xa5d8934d,0x0ae97a01),LL(0x170ceb09,0x91dabc9c),LL(0x73c40a75,0xd8f751f2),LL(0x52861011,0xba95af0f),L_(0x00000181), LL(0x352bc9a3,0x79de4fde),LL(0xf0130bb7,0x2eb1b199),LL(0x3c4457b6,0xa95e2900),LL(0xf04878d3,0xc1a9dc9f),LL(0xe04ebfee,0x097a6545),LL(0xf5aa7d0d,0x673c7b41),LL(0x3c5c4ce8,0xa67894e6),LL(0x385d1700,0xeb9b105b),L_(0x00000060),
+ LL(0x16680fb2,0x370df675),LL(0xbeb0847a,0xbefb427d),LL(0xbbe54c19,0x9a4770e1),LL(0x44a1916f,0x7f5945d3),LL(0xc14ef507,0x731b2da3),LL(0x17aa92af,0x07208217),LL(0xf69f649d,0xa27c5c7b),LL(0xabd89463,0xc25bbff1),L_(0x000001e6), LL(0xe551752e,0x9733c080),LL(0x98e86236,0xc5bfef7f),LL(0x936a2ebe,0xcc36a721),LL(0x25c227b9,0x11dd6248),LL(0xf8d96ae8,0x83440604),LL(0x3b2dca5f,0xc74d7e75),LL(0x3d8a998d,0x3c210303),LL(0xdcf4cf75,0x2fdbfd9c),L_(0x000000d1),
+ LL(0xe646d7ef,0x2f349cfb),LL(0xfd187fbb,0x22f14a9c),LL(0x7fb5a2ff,0x781ef46f),LL(0x084df701,0xada115d8),LL(0xab2e7da6,0x37b36285),LL(0x21432735,0x779e5cbe),LL(0x42159b5d,0x987b1bb3),LL(0x182d17ef,0xbd5c0321),L_(0x00000197), LL(0x0c974b93,0x3e904667),LL(0x4f31ca20,0xc9fa51be),LL(0xed87df23,0x5530167f),LL(0x7ab1aee3,0x34d6716d),LL(0x16c8a7b3,0xb3f82160),LL(0xf3eb37b8,0x77ee013d),LL(0x13ff1326,0xa57a3a10),LL(0xd7d1a2e9,0xab837a7e),L_(0x0000012b),
+ LL(0xfafe3733,0xb917d893),LL(0x17024a0a,0xfd27b406),LL(0x89eda4ec,0xcd3182c3),LL(0x4e2244fc,0xcec915fc),LL(0x083e32ec,0xbc2fe85f),LL(0x26668631,0x3458ec27),LL(0x23dec845,0x2e647e96),LL(0x35986103,0x80f7dfe3),L_(0x000000af), LL(0x9c1dd0c7,0xc0f6c814),LL(0xdb6594dc,0x59eee455),LL(0x2db7ed2b,0xc7b946f5),LL(0xc94ac2ca,0x45521872),LL(0x1f918bfa,0xe23366a4),LL(0x3439b349,0x50d8220c),LL(0x347cd4a8,0xc2e30ec6),LL(0x9274e0c9,0x10e0889c),L_(0x0000004d),
+ LL(0x18b3fd00,0x605cfac8),LL(0x11efdfd4,0x85d2f0b8),LL(0x5bb41efb,0xee216714),LL(0x3c03cac7,0xade36a6e),LL(0x485c4b2d,0xcd3725a1),LL(0x50bc220d,0x2cf525a5),LL(0xb11c84f3,0xe314db66),LL(0x664e47ac,0x0c8cd013),L_(0x00000050), LL(0xa7a48858,0x6f7bbfd1),LL(0x7d04c227,0xe24ada56),LL(0xadced466,0x03a6a941),LL(0x70addbb1,0xf14e02c2),LL(0xc761ca82,0x94b62798),LL(0x03264d07,0xa0bec3f9),LL(0x966e8d47,0xe6caf618),LL(0x1f211c02,0xa8c9821a),L_(0x000001cf),
+},
+/* digit=52 base_pwr=2^260 */
+{
+ LL(0x26c24408,0x1e48c2aa),LL(0x2fb6cd86,0x8746f93b),LL(0x515690c4,0x71e5f018),LL(0x76a3c1b7,0x99fbb28d),LL(0x993035c8,0xc338e004),LL(0xa3d8d18a,0xb4e7f02f),LL(0x804c0351,0x09fabf9b),LL(0x3e6175e3,0x697832f8),L_(0x0000016b), LL(0xf6830680,0xc1a8a622),LL(0x50d94962,0xf94a3f34),LL(0x0a44d62d,0x8057a83e),LL(0x05319e21,0xd2bed201),LL(0x3a4a1ebd,0x3d6076c1),LL(0x7368f486,0x4672ca13),LL(0xef4b1a43,0xf96135e4),LL(0x6692537f,0xb40a920b),L_(0x00000090),
+ LL(0xb81b7a5e,0xb048815a),LL(0x11e1229e,0x2e0a161f),LL(0xecb84207,0xf8e1801b),LL(0x5b394a58,0x890edfad),LL(0x37512807,0xb3e4e477),LL(0x5d81f675,0xc9984105),LL(0x1050ce18,0xf43ed35c),LL(0x17bd56ac,0xfc61c6c2),L_(0x00000011), LL(0xcf0d6c8c,0xaf53db5d),LL(0x6ee72ddb,0xc6ab4e4f),LL(0x32c8481a,0x1b4e6860),LL(0x5c545af6,0x0e7c0e41),LL(0xc3595ad6,0x261ffe75),LL(0xbf47f59b,0xf66fa7cf),LL(0xfa1aaf6c,0x212e7097),LL(0x86b7977f,0x3c00aa83),L_(0x000000b4),
+ LL(0x4b0029a7,0xf5c33307),LL(0x1eec5f29,0x9e45f3bb),LL(0xf8396133,0x17635aad),LL(0x25d3e2a3,0xbdaba508),LL(0xc34ef799,0x574f4d09),LL(0x78d47f38,0x085e8086),LL(0x3db03879,0x1c4a5748),LL(0x65ae9f6d,0x3c8df544),L_(0x000000c3), LL(0xb52fb74f,0xb901e46e),LL(0x1868eef4,0x68ec4a86),LL(0x7bab1199,0x9f2f51a0),LL(0x8f19df10,0x6a75a074),LL(0x2d75da4f,0x61385965),LL(0x59f7f255,0x60c80677),LL(0x6b7b569e,0x40b66382),LL(0x0533f4d4,0xd7897f45),L_(0x00000195),
+ LL(0x3b8e6670,0xd20de07d),LL(0x7aafab5a,0xdab27e9b),LL(0x3fb66eb5,0x5ac52dbe),LL(0x7ce85634,0xdf84c8cf),LL(0x9025496c,0x95b8e1e2),LL(0x776182f0,0x8e6db4cd),LL(0x21aaa54e,0x3bb0faa3),LL(0xe73fef00,0x9223c88a),L_(0x00000098), LL(0x16d643fd,0x70e138d6),LL(0x5612fc48,0x69ca59b8),LL(0x0889a9e6,0xfb3a26a0),LL(0x93e3dad6,0x43df1bc0),LL(0xe6ce66bb,0xae036271),LL(0xfcd4244d,0x05182a82),LL(0x958ca2ac,0x102559d8),LL(0x26838c85,0x588a9a75),L_(0x0000009f),
+ LL(0x0184b954,0x6cd88b38),LL(0xdcf3ba77,0x70c99422),LL(0x86f66f43,0xbc4bd450),LL(0x7b81c0e8,0x93575c5f),LL(0x704cad24,0x4091825d),LL(0x4b9f70ce,0xf1ff4bbf),LL(0xac2a0a24,0xb5d28bd9),LL(0xe5ebf7a3,0x5e706c23),L_(0x00000198), LL(0xeb270e7e,0xeb783548),LL(0xfd0b1050,0x81562bc5),LL(0x96b8a59a,0xedb5f688),LL(0xbc130375,0x8ab1fc73),LL(0xa1c5bd93,0x89b28fea),LL(0x7f18c19c,0x8d6e4b1c),LL(0xe98a494f,0x409f7384),LL(0x55131bf6,0xf382aa3f),L_(0x0000017b),
+ LL(0x25a27923,0xffb6351b),LL(0xc9bc2f04,0x7f29f1e1),LL(0x91e80528,0x37069b7d),LL(0x8a56cb26,0xff75d6d4),LL(0x7d9a9a20,0x3f52dd39),LL(0x52270b39,0x703dee3c),LL(0x67288a63,0x13f9c1c2),LL(0x49651d47,0x663b9838),L_(0x000001b2), LL(0x1cd56c85,0xbc1a8d52),LL(0x46598a93,0x87351736),LL(0x4685de4b,0x418967ee),LL(0xf35701ef,0x6dbbce4c),LL(0x380b116b,0xc5acf7cf),LL(0x35416b03,0xe839b424),LL(0x8d1a9cff,0x15841fbd),LL(0xe1730d1f,0x5ba5c3a6),L_(0x00000078),
+ LL(0xc0fdbea9,0xf76bf65a),LL(0xf573be01,0x0c6778ad),LL(0xffd85a6f,0x927d0f51),LL(0xfe98c72d,0x1738874a),LL(0x187e8ec8,0x032ae57d),LL(0x00c6d76d,0xdf95e888),LL(0xdee55d14,0x0dec4042),LL(0xcd5760c3,0xb172c8e8),L_(0x00000132), LL(0x14eac108,0x7bdb463a),LL(0xcbf771c3,0x76281603),LL(0xd48543b5,0xfc634037),LL(0xb965ac3e,0x6e5426f3),LL(0x49a7be5b,0x87fba366),LL(0x2e203d0f,0xddb5ca9f),LL(0xabbc3174,0x55052649),LL(0x2eb60836,0x21e004b7),L_(0x00000098),
+ LL(0x5c1bc4f6,0x64a43b5d),LL(0x1c634029,0x5d7c2617),LL(0x93c0fb82,0x1b7967cc),LL(0x96145dca,0xd068364b),LL(0x3b5c4ddf,0xec5bd3c7),LL(0xd5007f0e,0x2d7bf8f0),LL(0x771d6fd8,0x215b93c7),LL(0xf222990f,0x70529475),L_(0x00000028), LL(0x1d26e01b,0x340c9a0a),LL(0x04b5b926,0x7edb2bec),LL(0x0417ca25,0xefd5d17d),LL(0xb41c7280,0x70df3372),LL(0x93c942f6,0xfbfcef99),LL(0x7e3d7910,0x37ef3a57),LL(0x39005c54,0x8c4d4c90),LL(0xdb0ceb3a,0x446ceedd),L_(0x0000008e),
+ LL(0x65b80a9e,0xb3de9aec),LL(0x47955751,0xebd70107),LL(0xb9795325,0x326b6e2a),LL(0xb7ebfc01,0xb10f9b62),LL(0x6ec48711,0x145049a1),LL(0xb7dced78,0xd8c85f83),LL(0x6736770f,0xf3878209),LL(0x41fd70b3,0x4d4517ea),L_(0x000000ec), LL(0x1245bc60,0x228424d3),LL(0x6d611151,0xee80416f),LL(0x92f6a019,0x18ef86e2),LL(0x2e88fbc7,0x9f5d9f5c),LL(0xb51a1205,0x3ee14394),LL(0xd989aea0,0xe73a0ff8),LL(0x81623fdf,0x10ed321a),LL(0x3d71a6e8,0xa6b2f1dd),L_(0x0000018b),
+ LL(0x98f6bd7a,0xef684d8d),LL(0xaac1e35c,0x1c71e036),LL(0x19611929,0x9428ed8d),LL(0x24f7251a,0xf90f6e8a),LL(0xcd34ddd1,0x9742ae40),LL(0xf7d22290,0x9b5b15a7),LL(0x5d805418,0x91f1f6ec),LL(0xe50e28f5,0x604d11c6),L_(0x000001d0), LL(0x2c60d848,0x5ad92240),LL(0xf18911d8,0xcfb4c90b),LL(0x3c5b71d6,0x1a2c26ff),LL(0x5d53d732,0x9fada03e),LL(0x8bfbe9ec,0xd69c81a8),LL(0x443458b3,0xce7f11ce),LL(0xca59b490,0x2489ddd2),LL(0xdaf9ecde,0xceb4c71d),L_(0x000001b3),
+ LL(0xd052454d,0x6844d9d2),LL(0x667d1be2,0xec3032ef),LL(0xefd476cd,0x67f7c660),LL(0x47628345,0x80c64c50),LL(0x57751538,0xbb8da5d7),LL(0xb8ef3bee,0xb395bca7),LL(0x3bc2ad45,0xc2e7e012),LL(0x610d67aa,0x9e6187ca),L_(0x000000eb), LL(0x3dc2b1ef,0xf5d2b364),LL(0x4ee3fb91,0x38966853),LL(0xe0446916,0xc5fb0623),LL(0x2a6bfc98,0x6bce11c9),LL(0x65c6b297,0xeb6233b0),LL(0xce8c355a,0x6ac473c3),LL(0xd97c1dd8,0x56091541),LL(0x0514bb6d,0x01792023),L_(0x00000043),
+ LL(0x92033f14,0x17a6ef25),LL(0x89a53d65,0xaa5a50af),LL(0xd872b73d,0xa475ab82),LL(0x53f65ce3,0xe34acbbd),LL(0x1d33affd,0x33a80ee5),LL(0xe7690066,0x969e21f0),LL(0xcc415a0a,0xca2e0920),LL(0xb0325f4a,0x901c4d50),L_(0x00000172), LL(0x0f43e61e,0x40fc3a90),LL(0xa48abf41,0x601d8bcd),LL(0xe374c532,0x786a5e70),LL(0x7446fbbf,0x484d4fec),LL(0x0ec5b3b2,0xdc5db3b9),LL(0xeeb6c43c,0xe60cf40d),LL(0xca2ac048,0x1ff63739),LL(0x4475d66f,0xea8de3b9),L_(0x00000143),
+ LL(0x9adfc451,0xe4847519),LL(0x294337f9,0xbe446976),LL(0x4e7dac1b,0xf00a5441),LL(0x94ab8aec,0xc582caec),LL(0x5ac9bb3b,0xeacdc76b),LL(0x3fe0e66a,0x6e00689b),LL(0x246c86c1,0x6c266a0e),LL(0xbf0ade72,0xa0a2515c),L_(0x00000043), LL(0x70658a73,0xff30554a),LL(0xc9871f1a,0x4b2448f2),LL(0x8dd50a2b,0x87a01756),LL(0x3ea8f62c,0xb6b9a2ea),LL(0x7311e04c,0x0d165122),LL(0xfc6c9f2d,0xb7efc2eb),LL(0x07406007,0x92c33ebb),LL(0xbd8e5282,0xd904c21b),L_(0x000001cf),
+ LL(0xe495d18f,0x9b0f5222),LL(0xac5ca929,0x126086f0),LL(0xf4d4507f,0x41908fc8),LL(0x3355d26d,0x65791c82),LL(0x31183a9c,0xf00a9e80),LL(0x018f0189,0x644ffd95),LL(0xe447af71,0xbffa0975),LL(0x7424f93b,0x849e9345),L_(0x000001b3), LL(0x0d6949a4,0x78519510),LL(0xb79c2b5f,0xa59828a5),LL(0x9ae92003,0x6c54e38e),LL(0xfb93be38,0x67bd521a),LL(0x4c71aeb4,0x04b0340d),LL(0xa3451e4d,0xcd2e92f4),LL(0xa9a77ad0,0xfe218b65),LL(0x656db073,0xd2b4300f),L_(0x000001f4),
+ LL(0xa3b27cf0,0x160f039b),LL(0x82ec5f83,0xcff71736),LL(0xba9364b6,0xebc485a6),LL(0xddbcec8c,0xdc80329f),LL(0x3bda1715,0xcc71e664),LL(0x46fc4c3b,0x592819ef),LL(0xd1da3eb7,0x2cb62fe8),LL(0xb29cfca6,0xc417d055),L_(0x00000061), LL(0x8c802541,0xfc158c58),LL(0xe84b30eb,0xf6625ae1),LL(0xd137d022,0x441de79b),LL(0x42e42c6f,0x7d99126c),LL(0xf2ec0ec8,0xfbbd41bb),LL(0xb8f928d4,0x2851ec63),LL(0xf3ff5c1d,0x5e5a9ca7),LL(0xd3429e7d,0xdfb3e4f5),L_(0x000000ac),
+ LL(0x56a3a063,0x8d143249),LL(0x627718f3,0x2232fc35),LL(0x5a0479ef,0x6a6d389e),LL(0x82744b80,0xf4d435b8),LL(0xb0bd687a,0x2792b960),LL(0x4cecd317,0xf792e60e),LL(0x063be911,0xb09dcb17),LL(0x02f6ffb4,0x79c0ec59),L_(0x00000094), LL(0xb04fbf6f,0xe7c66f8f),LL(0x07b90918,0x95b38bbb),LL(0x01c5b207,0xc67022d2),LL(0x4fdf3937,0xee01b834),LL(0xe5a11142,0xc7b97506),LL(0x11b8cb5f,0x2ae40433),LL(0x2450b7bc,0xe3e1937f),LL(0xa26a70cf,0xb747b45f),L_(0x00000042),
+},
+/* digit=53 base_pwr=2^265 */
+{
+ LL(0xf2fdc439,0x7edbcb88),LL(0xdb91292b,0x19d35421),LL(0xd5dee79a,0xa420a538),LL(0x035e9ea2,0x9cf14f3b),LL(0xe21709fe,0x49703f94),LL(0x690ca5b7,0x495b47e8),LL(0x4deb7af2,0xcc2ef057),LL(0xb09d6324,0xf4a72dd4),L_(0x000000d7), LL(0x7ff7df3b,0x25c764e6),LL(0x1593ef9e,0xb9153d85),LL(0xef6d9489,0x117822d7),LL(0x238e5449,0x1e34e4c9),LL(0xbbd3333b,0x58cc8198),LL(0x416c6cfb,0x7b487650),LL(0xa8085b4b,0xb3068c07),LL(0x5e20cc8e,0xcdc16b7b),L_(0x0000013f),
+ LL(0xf98b837d,0xe15922b2),LL(0x62c29919,0xc8afde9c),LL(0x95a1a3c5,0xffe9534c),LL(0x604b1043,0xfa2f638f),LL(0x27a01a13,0x04cd8a8d),LL(0x2660393b,0xe26fd0c2),LL(0x72545d96,0xcf0808a0),LL(0x1dd10699,0xded0e387),L_(0x00000097), LL(0x037dfe3a,0xc38223ef),LL(0xd36e2094,0xe8b66c87),LL(0xe28405ae,0xe3e2766e),LL(0xa065b535,0xed4b87f0),LL(0x084a317d,0x3f53ac0b),LL(0x0ca5866d,0xa0ee5586),LL(0x82b21bd7,0x1fa70803),LL(0xff1d58cf,0x4ad6e2f3),L_(0x0000009d),
+ LL(0x905b2c93,0xef13c9b6),LL(0xd34ff12d,0xa5eaf60e),LL(0x46115d13,0xad4eed45),LL(0xc0704820,0x0761b0ac),LL(0xf0c499c6,0x5dd51e45),LL(0x4abd13af,0xa978e552),LL(0xb1ec09b7,0xa79f811d),LL(0x0dab7d3a,0x34d1f590),L_(0x00000147), LL(0xa75f21e6,0xea3d3b19),LL(0x0364a9c0,0x68df5edf),LL(0x5e1d6b4a,0xb44c93c9),LL(0x33e2dcc0,0x07832283),LL(0xea8fc7be,0x37cb9512),LL(0xe9e13504,0xc965c20f),LL(0x887068c5,0x62d3176a),LL(0xe870a541,0x0903d004),L_(0x00000092),
+ LL(0xf1dd3a67,0x7824703a),LL(0xb39c772c,0xbf0c69c5),LL(0x46f942bc,0x31d0901a),LL(0x9e0174be,0xd38bdff8),LL(0xab6326f7,0x91bfcc1e),LL(0x8787eadb,0x541868bb),LL(0xa0385662,0x6ba48a8b),LL(0x6d878761,0x3094b460),L_(0x00000185), LL(0x69e290f5,0x1d33d545),LL(0x1ba52eb4,0x662b634f),LL(0x9dfd1d1b,0x876fc504),LL(0xbe51c909,0x93e42059),LL(0xcb7406ba,0x49355b9d),LL(0x2651475a,0x8963ea18),LL(0xbcf76704,0x08985cee),LL(0xaa85c805,0xf1d1062e),L_(0x000001ab),
+ LL(0x6c2616bb,0xeb31ab0e),LL(0x01e38aad,0xbcd43f2e),LL(0xda068909,0x7f990c18),LL(0x9fb2c072,0xa82ff220),LL(0x757bff88,0x81327a89),LL(0x28c2afd8,0x1d3a1126),LL(0x0c2079b4,0x95685773),LL(0xa957db38,0xe18a18bb),L_(0x00000058), LL(0x45f5c72a,0x53fe6703),LL(0x42ce353e,0xbe22096d),LL(0x4a3251c0,0x601d33ed),LL(0xaaaf17c5,0xfe2c8cbc),LL(0x3d4b4185,0x242a9581),LL(0xb32328dc,0xbc79d78a),LL(0x03bf4442,0xa103c8f5),LL(0x64e28853,0xf9b6130c),L_(0x00000094),
+ LL(0xb447a9f7,0x2f9482b0),LL(0x31ede472,0xc7c55120),LL(0x00d8bc4d,0x627457bc),LL(0x5c471ca7,0x4a9f36d6),LL(0x14a28cac,0x436c70c1),LL(0x38a173b4,0x011c4897),LL(0x96f4df0f,0xdde3c9d7),LL(0x587a661d,0x8ddb7793),L_(0x00000026), LL(0x143023ce,0xbe0156de),LL(0x68012aa1,0xeabfa04c),LL(0x3ed6803f,0x204765fc),LL(0x762dc13e,0x2e5fcd9a),LL(0x5b5cd65c,0x04a542e1),LL(0xd6b6a2d7,0x3dcadeb8),LL(0x57f74a74,0x0da1060f),LL(0xe953f87b,0x2e478948),L_(0x000000e2),
+ LL(0x326c0546,0x63e8f854),LL(0x35eb9eac,0x39f46433),LL(0xf4944efa,0xc8688704),LL(0x91ff1606,0xfeaa7186),LL(0x99316708,0xa92605cc),LL(0x3fbb0f25,0x2252affe),LL(0xa90598c4,0xcbb64aaa),LL(0xb34934f1,0x3ba7e244),L_(0x000001f6), LL(0x763915ed,0xc814b6b0),LL(0xe697e570,0x69866f7d),LL(0x63fc73af,0xb1f0f7a2),LL(0xb634f283,0x17533e2f),LL(0x423d910b,0xe17bdbad),LL(0xfbcd888f,0x778dac12),LL(0x4c46f8f4,0xfb0bef09),LL(0x72d4d626,0x4fcdf97f),L_(0x000000b1),
+ LL(0x13b5648e,0x34c2f6e4),LL(0x202b7ba7,0x8535398b),LL(0xebd7f177,0x7eea8b23),LL(0xd3b0fc5e,0xc7a0f19f),LL(0xa3df55dd,0x577641e2),LL(0xcb9f261d,0xf496646e),LL(0x112454e8,0xdaf2be9c),LL(0xc23da6a9,0x64522e02),L_(0x0000003d), LL(0xe59d35c5,0x1efd66d8),LL(0x1b401767,0x904f29b9),LL(0x084f27ae,0x129c352b),LL(0x23e88566,0xa3263601),LL(0xd229faae,0xc04620cf),LL(0xc91c87f4,0x535f695e),LL(0x27c58545,0x3cfc2a21),LL(0xc94873fa,0xdacf3fa1),L_(0x0000005f),
+ LL(0xb13cb473,0x88b9f2da),LL(0x2dda613b,0x3a43eba4),LL(0xedbf11f5,0x9cddb3f6),LL(0xdf7a9b8a,0x1e00c8ae),LL(0x7e0c7ceb,0x84c5eb6c),LL(0x03d1dbf7,0xc6747572),LL(0x80122fe1,0x5d6814d2),LL(0x639c5254,0x1d4a0602),L_(0x000001bc), LL(0xec1fdac5,0xa4651a82),LL(0x690ed4f8,0x4ef3c551),LL(0xe2f0cf8b,0x20e94507),LL(0x61b6144a,0xeb258124),LL(0x11bde361,0x51d9d605),LL(0x541da730,0x397e8ce6),LL(0x06c00c29,0xb4a5d672),LL(0x43c098bc,0x76423a86),L_(0x000001bc),
+ LL(0xf6656606,0x82cb8136),LL(0xd96edef6,0x84c50ccd),LL(0x9f0978ff,0x37e0a146),LL(0x17bb0d3a,0xbf780900),LL(0xb2dca4ae,0x1d528632),LL(0xb6bd3e16,0x1bee4b87),LL(0x8c609327,0x16432d3a),LL(0x4aa7829a,0x9ea4ecd7),L_(0x00000068), LL(0x3f9c377c,0x5046622f),LL(0xa18dda52,0xd98abc09),LL(0x722fdd39,0x23fb42b0),LL(0xa78f3825,0xf2a75675),LL(0x13487db2,0x33200560),LL(0x244aa1c4,0xc0bf37b5),LL(0x86de25a6,0x57b73e86),LL(0x079d95dd,0xb0aa0cbc),L_(0x00000013),
+ LL(0x17341b4f,0x1e7f52de),LL(0x52ebce6c,0x882af4b0),LL(0x673d8b9f,0xbbd95fb1),LL(0xd64ea8ef,0x28e628db),LL(0x7889079e,0x54b7908d),LL(0x26e0abe9,0x3df2e6e8),LL(0xc20813db,0xfde7f3a9),LL(0x978bffe2,0x4f06b898),L_(0x00000019), LL(0xead10e9e,0xad34ad6f),LL(0x1076d303,0x8df8f495),LL(0x8819ee4a,0xc0d57db8),LL(0x70fb03b5,0xb14472ea),LL(0xbc0a100a,0x18cc104f),LL(0x7fbf87ac,0x45839e8e),LL(0x64d66536,0x58fe7198),LL(0x5bfbac43,0x04ede156),L_(0x00000050),
+ LL(0x1836614b,0xcb97f199),LL(0xc897ce78,0x6d967571),LL(0x940b810e,0xd145156b),LL(0x850c5939,0x4b73e9e6),LL(0x04a9944a,0x6e833bad),LL(0x2f7df8e9,0x2cd53823),LL(0x3b222e7b,0xf7a26c91),LL(0x1034f78b,0xb14d3854),L_(0x00000027), LL(0xfe320dfb,0x5c8c95a5),LL(0xcb9240ce,0xfffec63d),LL(0xc515192c,0x000718b0),LL(0x4259ce4f,0xdbfc0155),LL(0x6f7a6ff2,0xb1ff6013),LL(0x312bdeae,0x4cc245a6),LL(0x79a65a6f,0x29aa5006),LL(0xd3b4632f,0x920b0db1),L_(0x00000080),
+ LL(0x356fabd3,0x9eb2fa3e),LL(0x32e2213b,0x296648f1),LL(0x5464f17a,0xa0bf8f36),LL(0xf19ca8ef,0x4c8a5c7a),LL(0x876e29a8,0xa58d7e8a),LL(0xd8f86aee,0x0ec00506),LL(0x04f4e1a3,0x05b4072d),LL(0x1462f8a1,0x3da650c1),L_(0x00000175), LL(0x564895eb,0x5b19fee9),LL(0x8c62d05b,0x7809d8ab),LL(0x0cb573dc,0x4ad42bc1),LL(0x1884e984,0x9b3e8a9c),LL(0x6b2d6773,0x2d81f0f3),LL(0x072385dc,0x2f91b4d1),LL(0xca372aa3,0xe4038277),LL(0xd16c3a45,0x64dcfcfa),L_(0x000000bc),
+ LL(0x9757a335,0x1143084a),LL(0x38952f06,0xa4710659),LL(0x025fc38c,0x1698caaa),LL(0xcf127f48,0x7f55805b),LL(0x39cb3c58,0x621feb96),LL(0x58068b85,0x3a91b62b),LL(0xa4e48dd8,0xa7ba8220),LL(0xbd22ff75,0xc1b17c5b),L_(0x000000a0), LL(0x05196c43,0x142e4222),LL(0xaa56e765,0xeee6393d),LL(0x8f13ec6c,0xa88f8eb7),LL(0x536554a7,0x6720e144),LL(0x66972f38,0xadb6408b),LL(0x9d95e37f,0x67ab92ba),LL(0xe96c2792,0xa2d1345c),LL(0x3fb8e9b5,0x138c93a7),L_(0x000001f8),
+ LL(0x61c11852,0xf484baad),LL(0x1e71dab0,0xad2e9168),LL(0xe0ea71a3,0x6e1a90b0),LL(0x2b244009,0xfb37ada7),LL(0x0bd3281f,0x38140203),LL(0x1599d34d,0xf278746c),LL(0x3790a7db,0x17f577dc),LL(0x483a5cb9,0xbbf0dc49),L_(0x00000128), LL(0x8f5c56dd,0x6ec17c1a),LL(0x767ebf21,0xf0a141c4),LL(0xf1091ff1,0x051b5811),LL(0x3ac1c024,0x396942d9),LL(0x692ece19,0x5725cecf),LL(0xf1e6de73,0x75b56339),LL(0x2f629ac2,0x45030754),LL(0x6207c855,0x5090ae5d),L_(0x00000045),
+ LL(0xd14b028b,0x8c73e470),LL(0x684d5fa1,0x46af781c),LL(0xeb44feae,0x3e3aadf0),LL(0x4610320e,0xfd9c5960),LL(0xd8fffa44,0x70d9d9d3),LL(0xebbc9082,0x8a6283f3),LL(0xfcec5348,0xdd60d649),LL(0x44a603fa,0x8998ae1d),L_(0x0000011e), LL(0xce740ae3,0x5f6a91eb),LL(0x2000b013,0x3780772b),LL(0xe7ea71ec,0x0e54747a),LL(0x6f03b13d,0xfc299d7f),LL(0xd6603e33,0xb6e9df68),LL(0x86040d28,0x2043747f),LL(0x3aeee37a,0xe4608968),LL(0x9926fb8d,0x47be624e),L_(0x00000060),
+},
+/* digit=54 base_pwr=2^270 */
+{
+ LL(0xabb9ad39,0x6af8e430),LL(0x523480bf,0xf59d55e6),LL(0x4bc56b8b,0xc072bd61),LL(0x3df0a6ec,0x25c98f18),LL(0xbee1786d,0xbcc84059),LL(0xf26f3fea,0xb20a09a6),LL(0x79a2dfb7,0x93d600ce),LL(0xcf2e6f03,0x73c31f39),L_(0x000000e1), LL(0x9b72a39f,0x2b1470af),LL(0x4804a704,0x7da313b0),LL(0xe67c9622,0xc290e590),LL(0xbec90ccc,0x796f29ca),LL(0xf5e76e6a,0xcadb620b),LL(0x8ec01637,0x15b03af3),LL(0x4087520d,0xd8dcf763),LL(0x6c0ca6b7,0x0f970190),L_(0x0000006a),
+ LL(0x4f37e57a,0xc030f2d5),LL(0x649effc2,0xb84aa880),LL(0x3ad19d77,0x1cab55a1),LL(0x91bd296d,0x8c081620),LL(0xc8f7f0b2,0x0c469726),LL(0xb847d758,0x1840b8cf),LL(0xc59a8b12,0xc8fd3c1c),LL(0x0e2778fd,0x8c61a8b9),L_(0x00000186), LL(0x446cc1f4,0x3bf2f826),LL(0x4fc8626c,0x8d5f8bb7),LL(0x7df08423,0x3a877c74),LL(0x41c77ea1,0x471d935d),LL(0x5556d8fe,0xe98cde5b),LL(0x279a8287,0x068f4d40),LL(0xe400538c,0xdb305a88),LL(0xc091d74b,0x31201e77),L_(0x0000005f),
+ LL(0x766c809c,0xdd78e4e1),LL(0x81bcdd43,0xa933555b),LL(0xac8729aa,0xb8964c85),LL(0x4f18e8ec,0x87096359),LL(0x580f05ae,0xffab1de5),LL(0xe800a6a9,0x797b2184),LL(0xb6212cc3,0xea98c5ce),LL(0xc923afe4,0x287facf1),L_(0x000001ce), LL(0x66353c22,0xfe0b78e5),LL(0x0345fac6,0x27358467),LL(0x180e49dd,0x1ccff0c2),LL(0x92bcdaf0,0xea3ef331),LL(0xf7e4fb3d,0x99b89e87),LL(0x092ef793,0x9bdcca2a),LL(0x1418dec5,0xf9f9dccb),LL(0x314595b4,0x2d188c67),L_(0x0000013f),
+ LL(0x6e190a6f,0xeee766f8),LL(0x360709e0,0x5b775cd5),LL(0xd4566a98,0xe4057c69),LL(0x45df1e07,0xc0672257),LL(0x947733f9,0x1b1c2a5a),LL(0x4bcd6e2b,0xc80987a2),LL(0xe7293fbf,0x89f4061a),LL(0x11f7042b,0x9f0c87d7),L_(0x00000025), LL(0xc53c1b03,0xdaedd9c1),LL(0xc48bf537,0x495a12d7),LL(0x2c8c9765,0xe7c2d4a3),LL(0x662fe9df,0xfaed525a),LL(0x27c6bad9,0x5c4df70a),LL(0x24dd660c,0xba7fb076),LL(0x21abac8b,0x4a91b1d6),LL(0xb618ce5d,0xcf239771),L_(0x00000083),
+ LL(0x7875f26a,0x3212d16b),LL(0x3953e4c1,0x80a99a23),LL(0x42f909d9,0x457c9b9d),LL(0x68f18c26,0x62cfee59),LL(0x0b1b0fbd,0xd6e74f93),LL(0x99d73ca6,0x898ff611),LL(0xecc60074,0x0a0cf8cf),LL(0x0e4b48e0,0x264c8682),L_(0x0000007c), LL(0xd086fac9,0x30dd79af),LL(0xe0e34e51,0x0cb837fd),LL(0x052d2441,0xaefa0933),LL(0xbdea4988,0x44aec8de),LL(0xdfac83ea,0x46cb2469),LL(0xfad769d2,0x7cb77050),LL(0x18dd28c7,0x8001a60c),LL(0x8fe3d888,0xf467b922),L_(0x000001a1),
+ LL(0x5b24df92,0x2affa8b5),LL(0x207215e0,0x3c816de9),LL(0x199ff528,0xe11ab159),LL(0xfcc61eda,0xc8d67190),LL(0x661fbf7d,0xdda50129),LL(0x76defd37,0xd466e3a4),LL(0xf14fb3e4,0xc11ac280),LL(0x7620efce,0x396bb6d8),L_(0x00000179), LL(0xb257b1f0,0x4204720c),LL(0xa9d04719,0x620bab0b),LL(0xcf599cb7,0x4b89783a),LL(0x4c38e784,0x96aa7914),LL(0xa4374ec1,0xa42b74a4),LL(0x1d57fa44,0x5d9da37f),LL(0x9e98081b,0x907073d1),LL(0xd1274d9a,0x616e9807),L_(0x000001ae),
+ LL(0x3e1d7c3a,0xde4b8ce4),LL(0x0940b9c2,0x3515847d),LL(0x594f371d,0xc37d20b4),LL(0x0d44e03d,0x4b2281a5),LL(0xa133895a,0x03246afc),LL(0x69dc40a2,0x1243d0ed),LL(0x6acc7d98,0xc664eb78),LL(0xa9ddc8a1,0xf6274641),L_(0x00000197), LL(0x1a66ad76,0x3359c96c),LL(0xebb34cc8,0xe69f9794),LL(0xd1662749,0xf9f1455f),LL(0xb162a274,0x40fc34f6),LL(0x9d860e20,0x4fb62774),LL(0xa70d36c2,0x6f971a18),LL(0x990d79fe,0x19225101),LL(0xdd30d9b3,0x30c5bb02),L_(0x000001fc),
+ LL(0x51c91503,0x673999f7),LL(0xfe14668b,0x08c22b2a),LL(0xfc300d5b,0xecabf6a5),LL(0xe178c0bc,0x020b90b3),LL(0x79d38258,0x81c171fe),LL(0xa2f11763,0x86f32623),LL(0xf3a66cde,0x6ff64b9b),LL(0x5668f5ac,0xf47332c5),L_(0x00000014), LL(0xac181251,0x3ea58c5d),LL(0xde279aea,0x356a5f10),LL(0x7e9f7153,0xd08295b0),LL(0x86ce9eb4,0xf7c783f5),LL(0x4daab1a3,0x030b2d7c),LL(0x603300a0,0x2198f316),LL(0xd0c0475c,0xba184aa9),LL(0xa6fe88ca,0xe6bb2b11),L_(0x000000dc),
+ LL(0xade6d9e8,0xaf408fd2),LL(0xfdbd3baf,0xf2f9bf1e),LL(0x437c785f,0x502fb232),LL(0xeb964445,0xeaf5771f),LL(0xb08bd2ce,0x4c23d40b),LL(0x71ed9783,0xa9fbdb0a),LL(0xf481a53f,0x3a79f04f),LL(0x8241d897,0x33076e6c),L_(0x000001be), LL(0xdbc73cb0,0x6c1463d2),LL(0x900c1c58,0x38e9d58f),LL(0x9115aabb,0xc0a95554),LL(0xd544f068,0xb7066734),LL(0x00d18a77,0x10cc9da3),LL(0x482d67a5,0xf9d64b4f),LL(0xfe8b6e80,0xff8c0ceb),LL(0xa32070d7,0x7154c1c3),L_(0x00000058),
+ LL(0x1fdd6bf9,0xbe1106f7),LL(0xc44a87ae,0x43749975),LL(0x3d0c3b77,0xb45ea397),LL(0xf0fbd03e,0xd44cf903),LL(0xb4c5c47c,0xaa4a5ca8),LL(0x38153aea,0x2980014f),LL(0x58f964fd,0x7baccd46),LL(0x2458a3d8,0xeff4ee59),L_(0x0000010e), LL(0x9c8ef0d9,0x8ec22b8f),LL(0x99582fc5,0x2b8aa8c6),LL(0xd629663b,0xcebbdb32),LL(0x2ff405c2,0xbd666f05),LL(0x8989d659,0x6c986174),LL(0x2eb13e6b,0x7fa4c2f5),LL(0x5660e9a9,0x30206c27),LL(0xcd2e9b5f,0xc16a517c),L_(0x00000126),
+ LL(0x1b2c97bc,0x3e8c6c5f),LL(0x97ea6bef,0xe6975580),LL(0x1fa05de0,0x45dcf226),LL(0x28ce5e22,0x6b3296e1),LL(0xbc5ea09c,0x355e867e),LL(0x171e0d4c,0x93a02b45),LL(0xef953fca,0x72562a6a),LL(0x283e85d5,0x0a4baa50),L_(0x0000012e), LL(0x00384cef,0xc61925fd),LL(0xb15e2b9b,0x98c42ea4),LL(0xe51f203e,0xa9da7eaf),LL(0x80b7c7d8,0x00d05b8b),LL(0xd0e8cb9d,0x5b984aa6),LL(0xe2223126,0x97eb783a),LL(0xcbd154b4,0x60eeeb46),LL(0x77d65106,0x51c5f225),L_(0x00000100),
+ LL(0xecba5c8d,0x4c52e9d2),LL(0x1a2c0764,0x084d971b),LL(0x04071452,0x5b00ba29),LL(0x420810c9,0xe37ace16),LL(0x8726c12e,0xfb3b3465),LL(0x76e95cdb,0xddb8f121),LL(0x5a782ea1,0xe1266546),LL(0x9e91fb9e,0x2763e598),L_(0x00000003), LL(0xde0c16d5,0xb01d1b1a),LL(0xcdfa5a5a,0x186cc016),LL(0x907f643d,0x951f20c1),LL(0x19ce2692,0x499758b8),LL(0xa1e463db,0xae173a15),LL(0x1a60551b,0x9960164a),LL(0xa7db4dec,0x5c5b509d),LL(0xd9cec887,0x8bf36254),L_(0x000000a4),
+ LL(0x16cce787,0xd4a2fc01),LL(0xa425fa18,0xf155769e),LL(0xaf00539b,0x60eb1b90),LL(0x688fdaf6,0xfa6d7481),LL(0xf34ab7ee,0x4f289d5b),LL(0x07dbb72e,0x1e391abd),LL(0xbc2da7ee,0x95c48dba),LL(0x566bd167,0xd547663d),L_(0x00000043), LL(0x9ce2304f,0xd19a287e),LL(0x13ab6992,0x4405fdb4),LL(0x96fa0864,0x4139a060),LL(0x41a760d2,0xbccd999e),LL(0x5ba64bc7,0xb10009b9),LL(0xd8deab9a,0x984258d2),LL(0x79776c54,0x221ad688),LL(0x10e8fea6,0x936b124d),L_(0x00000087),
+ LL(0x5b9e9b6c,0x0d488b76),LL(0x718de1b3,0x479d6241),LL(0xc5e08581,0x835e01af),LL(0x2980a85e,0x5861c30b),LL(0xb6dbc1d7,0xa410ea56),LL(0x2db982c5,0xe2d1be8c),LL(0x9bd416d2,0x8b2c0849),LL(0xff9c097a,0x3959a07c),L_(0x0000017a), LL(0xbf3507bb,0x84f97fa2),LL(0x638f765c,0xc3635cb6),LL(0xddc089f6,0xadab3335),LL(0x03a11712,0x45c1fc02),LL(0x6d411e20,0x92e35990),LL(0x10bb8db9,0x9c8fd9b8),LL(0xa138660a,0x9289131a),LL(0x37f6b49c,0xa3d2ae4c),L_(0x000000b7),
+ LL(0xa1146df7,0xfdfcfffc),LL(0x81511cf3,0x23bc0f93),LL(0x2b2a7c87,0xdc82a234),LL(0x03b40d7d,0xa08a7dd1),LL(0x710d66e6,0x21695339),LL(0xb2de413b,0x70d88f9e),LL(0xa639823f,0x35b8b90e),LL(0x023e9ff4,0x841fb110),L_(0x000000b7), LL(0x67b34d07,0x68b9df98),LL(0xae385a70,0x9e1b7b1b),LL(0x69f1b285,0xf3ca9831),LL(0xacc09537,0xd4b56b4f),LL(0x9d566211,0x5fe60450),LL(0x8cabfe34,0xfe548cc5),LL(0xb714db58,0x6edccbce),LL(0x1b3de9cb,0xae7588f9),L_(0x00000018),
+ LL(0x3fb44e11,0xd6d98611),LL(0xf902dfd5,0x894e506c),LL(0xfd0b1d00,0x85a52247),LL(0x782247b1,0xee7a96a2),LL(0x73bd1827,0x817a81ab),LL(0xb5a675cc,0x58e21da1),LL(0x96f3b0ad,0xba6b1f8c),LL(0x0b4feab1,0x47a0c5eb),L_(0x00000186), LL(0x94e1e70f,0xa2caaa6a),LL(0xe4a5a160,0xc595ff3d),LL(0x4e2aab67,0xc4ca75c8),LL(0x55f145b7,0x7731bee5),LL(0xfc6003a4,0xe7fe03b5),LL(0x0bfb8f07,0xc95ac06b),LL(0x062bb217,0x970ec8f9),LL(0xa73aafef,0x436ead58),L_(0x0000004e),
+},
+/* digit=55 base_pwr=2^275 */
+{
+ LL(0x10edee70,0x5fd3e47e),LL(0x3597fca0,0x77535436),LL(0xd14d9e5f,0x3e8b8ab9),LL(0x09ae6cb6,0x74096598),LL(0xc8a4dd84,0x9f1a5c96),LL(0xcb6edd24,0xd2f79af0),LL(0x61d2b7a4,0x0e166e53),LL(0xfe3d22a6,0x57342692),L_(0x0000001c), LL(0xf72fa6f8,0x96d7a363),LL(0x488ad6e3,0xd92f57cc),LL(0x8510a286,0xf0a9d195),LL(0xb888aa8b,0x317136c0),LL(0xf42decec,0xdf9fc71b),LL(0xb6cc8b9b,0xc0298d41),LL(0x49e5d99a,0x109ecbb2),LL(0x314b57f8,0xb46534db),L_(0x00000132),
+ LL(0xb2d708c6,0xce839038),LL(0xce28ed96,0x20e1ea62),LL(0x8763eab5,0xed2713c5),LL(0xc4523fd6,0x71027fe2),LL(0x7eae1cb2,0x9c4b8cf6),LL(0x24a95e4f,0x601ad020),LL(0x07164949,0xdd7d73ac),LL(0x37442ffc,0x6e6ae643),L_(0x000000d1), LL(0xb77851b2,0xdb8574d7),LL(0xb645bbee,0x286ebfe9),LL(0x0c8710d8,0x766e45ce),LL(0xa79aecb4,0xc2d31256),LL(0xbf379f83,0x340ea164),LL(0x164bbbc5,0xf851521a),LL(0x1ac3081d,0x7e9d5d5e),LL(0xb205779b,0x9097f081),L_(0x0000007d),
+ LL(0xde9114db,0xe63af665),LL(0x818c463b,0x6295501a),LL(0x35a127bf,0xdce47ef1),LL(0x007d2c0c,0xcdab36d7),LL(0xccb851cf,0xfdd117a8),LL(0xf238753e,0x0f305c31),LL(0x8e2817b4,0x7fa2c0d7),LL(0xf487e902,0xc3ae8d53),L_(0x000001a5), LL(0x170a9d8a,0xfdab89fd),LL(0xd0296988,0xf7158579),LL(0x9d9469d7,0xe8a6f604),LL(0x10415652,0x2b54a37b),LL(0xcc4eb51c,0x0c719573),LL(0xae48f5a3,0xa83c1dff),LL(0x30b12c01,0x72dbb726),LL(0x57308088,0x979e1572),L_(0x0000003f),
+ LL(0x313e4b56,0x08231734),LL(0x6717f045,0x479ae527),LL(0xe3d436d8,0xd02cb05c),LL(0xf2257834,0x00a63fdd),LL(0xa7cf8043,0x55acde6a),LL(0x457f48d5,0x3233d0de),LL(0xde5db66b,0x81aa55b4),LL(0x0379d9ac,0x13ffc8a6),L_(0x00000189), LL(0x13e90717,0xc47bead6),LL(0xf2111132,0x90e8a449),LL(0xb92dfa6c,0x2861c278),LL(0x0e5052e4,0xbb21a8a2),LL(0xdd62ef7f,0xda29cea2),LL(0x06ce5d03,0xb1054057),LL(0x321921a2,0x2bdda27b),LL(0xa8070a21,0xe0b1ed13),L_(0x0000000c),
+ LL(0xb57fe1e1,0x13d1fd3d),LL(0xaf39e976,0x9d300d5d),LL(0x3c4bd73d,0x394a792d),LL(0x22ea164b,0xdb8ad2a0),LL(0x94ca8b71,0x46b5c44e),LL(0x29573de6,0x4faada81),LL(0xa68e6f0b,0x9bb3e293),LL(0x2829705e,0x8e9779a5),L_(0x00000001), LL(0x562f24c2,0x10d7ee7c),LL(0xebc4c9ff,0x1bfc2a5b),LL(0x9e849995,0x9ab67877),LL(0x29bf2cd5,0xebbab48f),LL(0x1c14b040,0xc34becb0),LL(0x0f56d5be,0xa06f84dd),LL(0x74ea8bd3,0x16998590),LL(0x240441e5,0xafa1dab5),L_(0x000001fe),
+ LL(0x99d23cf5,0x8778f5f2),LL(0xc8b025b9,0x1705a5c8),LL(0x3919b71b,0x0d5b88f4),LL(0xcb92372e,0x60fa371f),LL(0x943296e1,0x0a89cc71),LL(0x5fe1a497,0x34a3ae69),LL(0x5dec2f93,0x1251e4b9),LL(0x275a5942,0x8b24d4d6),L_(0x000000b8), LL(0xff47e08d,0xaa12f1b2),LL(0xad152f2f,0xffb55ea0),LL(0x2d49016e,0x9565927a),LL(0xe898a743,0x6cdbde63),LL(0x47e768ee,0x9201bbe7),LL(0x0a069ce7,0x64e8832a),LL(0x4d3af5cb,0x22cff077),LL(0x58cc25a5,0xb382381d),L_(0x000001b0),
+ LL(0xb0b126b6,0xaeabb8d7),LL(0xc38359f0,0x58505b26),LL(0xb9091af1,0xe930c10c),LL(0x1baa2a57,0x4ceb63b6),LL(0xf34a1cb3,0x2ce30eb5),LL(0xe695563a,0xb46502e9),LL(0xbc4a4498,0x3de11285),LL(0x7d46bb82,0xc6d8d037),L_(0x000001b5), LL(0xd0a4132d,0x4b0d3d99),LL(0x19c65f2c,0xbdec1fb8),LL(0xe96bad16,0xf98a7a22),LL(0xfc740b98,0x4ac9e432),LL(0x327482c4,0x19b02fa9),LL(0xee365754,0x2b71db69),LL(0x8c4b6fcb,0x3b059127),LL(0x1ff3d7d8,0x9083d509),L_(0x00000063),
+ LL(0x5b27f0e1,0xc1b9a1af),LL(0xc491a3f1,0x3c2c754f),LL(0x5cbaab1f,0x2a77d316),LL(0x0310665c,0x760e6436),LL(0xda6d64bd,0xabfa1968),LL(0xfb5f4ce1,0x2b0e1701),LL(0xb466c4ed,0x7ed3c4d7),LL(0x2ebf2125,0xdfa00f91),L_(0x00000168), LL(0x50f6e44d,0xddd0d096),LL(0x8ca37cde,0xacd3234c),LL(0xb7244def,0xd39cba5f),LL(0xacca56c2,0x42e4fef3),LL(0x04d3ff0e,0xd03959e1),LL(0xe6513498,0x101ed923),LL(0x40deadab,0x3a0842e2),LL(0x40cf65c5,0xe8f52471),L_(0x0000005d),
+ LL(0x24abeced,0x8027d5fa),LL(0x54bd40b9,0x6c207959),LL(0xaeb9dac1,0xd464b86a),LL(0x419d1ea2,0x6820d398),LL(0x5e25c94d,0x7cb4e131),LL(0x65e1ca01,0x407cd9e9),LL(0xe5ede0b5,0x9cc6a7e8),LL(0xccfcd5ef,0x5004892e),L_(0x000000dd), LL(0x38ae86f8,0x198931f5),LL(0xff746c8b,0xd54d7f12),LL(0x309a79bf,0x1246b150),LL(0x42f00081,0x77449920),LL(0xc47ea560,0x3c1ca128),LL(0x7f0d691e,0x4a7cd82a),LL(0x389f0267,0x3325d3c5),LL(0xd3d69318,0x8d437ee6),L_(0x00000114),
+ LL(0xdc420de7,0x40b5d961),LL(0x0c56a78c,0x0669c065),LL(0x20ea2fcd,0xd7d6512b),LL(0x0cfdc1ce,0x793f28c8),LL(0x12dc4c42,0x2a2c66b6),LL(0x65ef14af,0x8712d0f4),LL(0x498de283,0xaba3e10f),LL(0xd43378b1,0x99525eef),L_(0x00000147), LL(0x29182339,0x2743e625),LL(0x75c8a0f5,0x7cb967f9),LL(0x3b942e5d,0xa6fa495f),LL(0x2c93c4c7,0xaf911e44),LL(0xe5ea4e81,0x61393032),LL(0x453b1c33,0x6ad975cf),LL(0xbd844374,0x598fb85f),LL(0x19bef583,0x5bc44e9f),L_(0x0000015e),
+ LL(0xca0bf18d,0xa3d7dbe9),LL(0x4163c3c8,0xfea7d95a),LL(0xc8c760db,0xbedeb961),LL(0xbe4aaf54,0x6366da72),LL(0x184e2e0f,0x4b391d6f),LL(0xc176d3d7,0xda402a6d),LL(0x58e13d8b,0x35c88b87),LL(0x9e868f1c,0x28cd51ed),L_(0x00000137), LL(0x060d87ba,0x2fb088fa),LL(0x7bb887ef,0xd9fecef3),LL(0x5f6918e8,0xd8d0ab29),LL(0x584e5e50,0xa68549e0),LL(0x1a0e8dad,0xccee2619),LL(0x6b94fb63,0x2fe6d355),LL(0x41620a75,0x2f9f5687),LL(0x3bbe2240,0xb1f43624),L_(0x0000013f),
+ LL(0x7b1c8a03,0x5d3c5d98),LL(0x9b0532ff,0x8d28755f),LL(0xa6811aec,0x526696c9),LL(0x1a05c762,0x85c6fe67),LL(0x9b509178,0xb1cd9732),LL(0x9ce1e435,0xd6424b12),LL(0xd25c0017,0x7dfb69b5),LL(0x8fd3449e,0xb06e65bf),L_(0x0000014e), LL(0xdb3b3b47,0x4f13caa8),LL(0x8c65da30,0xc42581d3),LL(0xf1637449,0x31ba26e3),LL(0x086fb178,0x1f20a375),LL(0xe70bccf5,0x794f66bb),LL(0x8fb9ec67,0x8759114e),LL(0xba15c3e0,0xbae55fef),LL(0x6274e840,0x541f86b0),L_(0x0000008b),
+ LL(0x9940c688,0xd17c3809),LL(0x1ad4bb7a,0x02bbb8e4),LL(0x62901ee1,0xdef212fe),LL(0xf758e2a0,0x902e165b),LL(0x41df4c90,0x813c93c1),LL(0x2d980715,0xdfe446b0),LL(0x16925c07,0x26180355),LL(0x6a7e91aa,0x2feac9e3),L_(0x00000096), LL(0xa45e236d,0xf8e5447a),LL(0x116cff34,0xe8d1be37),LL(0x05f97032,0xb0f21f66),LL(0x2f2c027f,0xa11df664),LL(0xa89a55e5,0x02fec70b),LL(0x0cbe911b,0x281dbb5c),LL(0xf7515075,0xff0a3fb5),LL(0x5eb63dce,0xde9df17e),L_(0x0000012f),
+ LL(0xa91392a8,0xbdba8a73),LL(0x3162337e,0x57c70feb),LL(0xfe6064d0,0x1cbf9841),LL(0xb8ea5857,0x0f9265ab),LL(0x8f4d78e1,0x4ea34ee6),LL(0x86c61019,0xe932bccc),LL(0xa4d88afe,0x9518b05b),LL(0x1b666c9e,0xdccb7c7f),L_(0x000000bd), LL(0xf8bfc49e,0x05208c75),LL(0x9df54ae4,0xd373c5a9),LL(0x79933e71,0x5b8a9772),LL(0x64aa0b3f,0xa96b6ada),LL(0x636d2c0d,0x5227ca04),LL(0xc4142eed,0x6e0ffb64),LL(0x11d0f26b,0x03baa051),LL(0x6cce8a32,0xd1fa3649),L_(0x000000b3),
+ LL(0x1b22c75f,0xf889ab10),LL(0x198462a9,0xdc726c9f),LL(0x4488dc01,0x03497dbf),LL(0x6173d9f9,0x44668664),LL(0xa2ec1a91,0x97d57504),LL(0xc515fce6,0xe38e8b7b),LL(0xc94145f8,0x9a57e3c8),LL(0x7f491462,0xf8e43df6),L_(0x000001e3), LL(0xfab74bc2,0x21aa76a0),LL(0x5cde4de2,0xcabcd328),LL(0x58febacf,0xfc5df376),LL(0x164a8b43,0x53cf2abb),LL(0xd59cb6ca,0x4bdbc3e7),LL(0x5fa72448,0x61888f39),LL(0xec291663,0xa63d2680),LL(0x8efa4a04,0x6b003337),L_(0x000001c7),
+ LL(0xbfc44034,0xda15115c),LL(0x7be6519e,0x4c0ca17c),LL(0x1e404697,0xd39b899e),LL(0xd56cb968,0xafaffc6b),LL(0x977f25af,0x0c48baa8),LL(0x33c5e846,0xb8ddcae7),LL(0x8db3dd6c,0xea4e7b4d),LL(0x30c42ef0,0xdf2a5d47),L_(0x00000075), LL(0x3bded433,0x1c36485b),LL(0x60a85776,0x3a9ef9b4),LL(0xc163b2e2,0x9caea119),LL(0x699c32d3,0x6fbf2af8),LL(0xc9afc21d,0xb2f30acb),LL(0x5cd46105,0x2782e179),LL(0xc5de1ebd,0x94bd0296),LL(0x40db331e,0x1d32d3f5),L_(0x000000dc),
+},
+/* digit=56 base_pwr=2^280 */
+{
+ LL(0xb3566c4d,0x70856265),LL(0xffa63a05,0xcbace31a),LL(0x64645336,0xd792b4ed),LL(0xe49945b2,0xcdc41c6d),LL(0x4ffedb2c,0xfc3fec1e),LL(0xfb381239,0x6c094341),LL(0xb5868f95,0xa828185b),LL(0xf680572d,0xb8368ada),L_(0x000001ae), LL(0xbfe0585a,0x480f8f0f),LL(0x30bd3b95,0x5be334d5),LL(0xc2d3c86e,0xd762f278),LL(0x676d6c82,0x1488b56b),LL(0x539dec8e,0x756194ec),LL(0xc0fc3e4b,0x4e5ad8a2),LL(0xe01cce49,0x1e1d4129),LL(0x9cb7e94c,0xb0ed4c45),L_(0x00000145),
+ LL(0x2ee172f7,0x76d70712),LL(0xcc86b737,0x07937b43),LL(0xc42e1bf4,0x0a15775a),LL(0xe0abab13,0x8a6f4155),LL(0x8a4930e5,0x7af5f75c),LL(0xe4d25a23,0xf7ffdb8e),LL(0x47745ba4,0x1c8fe7af),LL(0xda1f09c1,0x298ae467),L_(0x00000026), LL(0x58ab833a,0xbed40193),LL(0x74f45669,0x07b7fe4d),LL(0x00a5516c,0x8fed834f),LL(0x35a36d31,0x46f3d5f0),LL(0xcf8a31bb,0x46e1df3b),LL(0x86c99729,0xef24a7e8),LL(0x383ab5e1,0x3285864c),LL(0x85a50c0d,0x14d71a5b),L_(0x00000172),
+ LL(0x82d65b66,0x2c2925e3),LL(0xc79d0387,0x80fde81a),LL(0xa2432027,0xbc3a2b38),LL(0xa34422b6,0x24a6595f),LL(0xb948d55e,0x7ed8f149),LL(0xfac14efa,0x1011867c),LL(0xe578bbe7,0x01bd1e94),LL(0xefa02765,0x4d118803),L_(0x000001b0), LL(0xc9f7389f,0x4f58dfa2),LL(0xd3bff99b,0x27af2024),LL(0xe0ca7fb1,0xa09a0ca5),LL(0x782dbf7b,0x01098d83),LL(0x19fa5d61,0xabdbaa4b),LL(0xddb85231,0xc03b0d70),LL(0xbb859499,0x26cba60c),LL(0x8d596ce3,0xda0073ba),L_(0x00000111),
+ LL(0x8aec0422,0xb67d56f7),LL(0x85f0af78,0xd0dd5f00),LL(0xd1879493,0xede77ef6),LL(0xd412929c,0x6254c309),LL(0x2f8f47fc,0x6cfbb6a1),LL(0x4af63813,0x0a561c30),LL(0x70283e09,0xb1640127),LL(0xc77dd363,0x061fa6e8),L_(0x00000023), LL(0x65973023,0x29101040),LL(0x7036678a,0x6adb22ec),LL(0x5919dc9a,0xb9607eaa),LL(0xff75ea6b,0x2f103f0e),LL(0xa1b15402,0xc4300dcf),LL(0xfdcf2e9d,0x3ebbf1ab),LL(0x1be47bf2,0x3bc7610a),LL(0xe48e43b2,0x13834ee8),L_(0x0000002d),
+ LL(0xb1366222,0xc255282f),LL(0xcf45bdd6,0xe5f65eaf),LL(0x15c02959,0x0d59b305),LL(0xd5074c2f,0x69d34def),LL(0xf460bf31,0x98c4daf0),LL(0xcd4dd881,0x2d35aae9),LL(0xa3e2b924,0xcd6f8fb3),LL(0x7ee19179,0x3fe40e5b),L_(0x0000000f), LL(0x3015c0c8,0x24998853),LL(0x9b18e9fc,0xc27ee4ed),LL(0x01ee8c44,0x961e30d9),LL(0x38c4d057,0x4e4722a4),LL(0x27a847d7,0xbd34c3ce),LL(0xfc175e9e,0x9ec1f371),LL(0x28ad6264,0x9962cfa6),LL(0x8cb8ba21,0xa4d69025),L_(0x0000017b),
+ LL(0x48414eef,0x4b16d635),LL(0x466a22f4,0x91c53690),LL(0xb9b4826e,0xdfa700b4),LL(0xba41d6fd,0xa9d1c269),LL(0x3f48b184,0x9a1ae562),LL(0x1d66af1a,0x88445e2f),LL(0x16e76216,0x5528a0ef),LL(0xa509e874,0xe8df0ea0),L_(0x000000c2), LL(0x4d16c4eb,0x405c88d6),LL(0xcb159002,0x21995ea2),LL(0x9206340d,0xc1b476f5),LL(0xbdb47138,0x73c4a87f),LL(0xf1fc51a6,0xd81d7d81),LL(0x68d2c132,0x3035e2c5),LL(0xc2e86c33,0xdd1981e0),LL(0x25fcaa15,0xa3e61c9f),L_(0x000001f3),
+ LL(0x4ab2a49c,0x70aadb7c),LL(0x983438d3,0x9f4ebf13),LL(0xd25c9ac8,0xd8d4d610),LL(0x9c7f0f75,0xca14e0b4),LL(0xdcfed5c3,0x4d6f7590),LL(0x36f5cd7f,0xd93cbfaa),LL(0x65cb3d17,0x1ddce79a),LL(0xbd97f101,0xbf7024b4),L_(0x0000014b), LL(0x8b012070,0x77a85a51),LL(0x279a4494,0x7671964d),LL(0xff88af2c,0xf271d11a),LL(0xdbb6c2c5,0x82395ca1),LL(0x85ba326b,0x98f43101),LL(0x0cb73c28,0x63dc513c),LL(0x6b203054,0x4469f278),LL(0xc5c18db9,0xbad9b61f),L_(0x0000010f),
+ LL(0x3d80adc6,0x4e403a26),LL(0xab320624,0xad04e1de),LL(0xdcbb6130,0x2a259720),LL(0x6e850532,0x231b1ad6),LL(0xa60fb3f5,0xcd79b6e2),LL(0x663d49e1,0x179c366e),LL(0x01277eb6,0xe6c6ea0d),LL(0x883c4ffd,0x0c383473),L_(0x0000006c), LL(0x7e40167f,0xaec71f68),LL(0x9a231d95,0x1c63bde5),LL(0x4af79a44,0xdec74dfa),LL(0xfd79e68d,0xa1952760),LL(0x0b613ae2,0x08e61ca7),LL(0x9e73036b,0xe30d2b54),LL(0xd922e0f3,0x6d8fb383),LL(0x28c14621,0xa421baa0),L_(0x00000194),
+ LL(0x1137f8e6,0x66cf0839),LL(0x9b11d642,0xa909855d),LL(0xc2008fb3,0xcfac98d0),LL(0x7141e8cb,0xf021a4df),LL(0xf143c405,0xab358375),LL(0x67bc2904,0x17ae0177),LL(0xcc509637,0x3e96013d),LL(0xa1e7d9dc,0x4facea49),L_(0x000000db), LL(0x957910b6,0x497bb1a3),LL(0x0139fb02,0xbd519647),LL(0xb1e83186,0x3a05bf5b),LL(0x19b27ed1,0xcae014aa),LL(0x82e975ee,0x2c7c3285),LL(0x88e9df86,0x55efa48e),LL(0xeb606052,0x325f6177),LL(0xa47eec1a,0x99b1ff61),L_(0x000001df),
+ LL(0x3a878798,0xb073983a),LL(0xb57577f3,0x911ef229),LL(0x88b3000a,0xb6a2c941),LL(0xfe60609c,0x2014f532),LL(0x505cb96c,0x56c1e07d),LL(0x4b65f80c,0xacfa88b0),LL(0x6d867481,0xe4164f16),LL(0x5599d374,0x862f8d51),L_(0x000000d4), LL(0x0c1e1e98,0xfcb0b84f),LL(0x19e6efb8,0xb9207b90),LL(0x51572182,0xa8d8dbea),LL(0x3bef29fc,0x48664299),LL(0xf1204f85,0x601bc4d3),LL(0x0e9a0fd0,0x04ed7b5b),LL(0x79ce5a54,0x2efbde9a),LL(0xa61da12c,0x620aebbd),L_(0x00000125),
+ LL(0x50fecf46,0x92f8cb5b),LL(0x920174e1,0xf0d81ba1),LL(0x1067e00e,0xdf0090d3),LL(0x0f944d92,0x7cf84daa),LL(0x29760c45,0xe2fe5c35),LL(0xdcd64aa5,0x0fc3d3ab),LL(0x926c41d9,0xd093a0e6),LL(0xf508ca71,0x5b0f1f7a),L_(0x0000008a), LL(0x2ec2b366,0x41b5fe84),LL(0x68d89f52,0x6a8252ee),LL(0x7f37105c,0x12bfbd7a),LL(0x28e7afdd,0xa8c8a6ce),LL(0xc9ac312b,0x64f59820),LL(0xfc0802de,0x91abcca1),LL(0xdd3daa77,0x3663e8e4),LL(0xcba87568,0xb39b3267),L_(0x0000003b),
+ LL(0x167f86e9,0x77ecbc5f),LL(0xb273c517,0x1e1c4580),LL(0x7b0cac28,0x7d9e9af5),LL(0x8231d2eb,0x6aedfd99),LL(0xaaffb728,0xf1c98f12),LL(0xe925ce44,0x74f1520c),LL(0xc049eb63,0x494b788d),LL(0xd9d95935,0xe226209f),L_(0x00000130), LL(0xccc2d2a6,0x0b127e1a),LL(0x3b751841,0xcd70c11d),LL(0x64418006,0x1b4ae955),LL(0xbadb0a24,0x604cb635),LL(0x9f330b20,0xcfd3da79),LL(0x73a90953,0xef2d17df),LL(0x1b20635f,0x4743671d),LL(0xd4c67374,0x2f665bab),L_(0x00000186),
+ LL(0x9ec2635a,0xbc72074c),LL(0x1fe4598a,0x2c820e92),LL(0xe36ea0ca,0x2497dd7b),LL(0x4a8623f2,0xe23eb8d9),LL(0x60085b98,0x40f9b504),LL(0x1c20ee53,0x201ec927),LL(0x00761ac1,0xd442c9fb),LL(0x4f448cc8,0x9ba54c26),L_(0x00000025), LL(0x6e43f9a4,0xccd45383),LL(0xdd223c39,0xe5a9e554),LL(0xb7183f2b,0xbabb5193),LL(0xcaf50569,0xd8970128),LL(0x1fd8dbce,0xa8d54145),LL(0x334b381f,0x13a9b729),LL(0x728ba78e,0x437dd328),LL(0xd0616bed,0x028df6a9),L_(0x00000104),
+ LL(0xaa17f0bc,0xd2eb9fb6),LL(0xcdb03b75,0x6da41301),LL(0xff96e100,0xd003b0fd),LL(0x0f341e2c,0xeffd7580),LL(0x00a92b40,0xb4e94e73),LL(0x2f420bab,0x7e020897),LL(0x3a5a980e,0x0e9d7689),LL(0x44d12101,0x6759e798),L_(0x000000aa), LL(0x2631776c,0xf32bcc90),LL(0x4363aa54,0x81eb128d),LL(0x290c3760,0xc99f8366),LL(0x24d51de3,0xa9c8e087),LL(0x2212897d,0x63ef80d8),LL(0xe1731f84,0x4ba53d2d),LL(0x71a09c6c,0xf3c92c58),LL(0x1de91d0d,0x1015dbba),L_(0x0000009b),
+ LL(0x007f0db0,0xfc29c9c2),LL(0xc5a04df7,0x7ce23069),LL(0x889ac9f2,0xabf8339c),LL(0x48b685ae,0x57639632),LL(0x3111646e,0xf8b9f075),LL(0x94f37131,0xb2897670),LL(0xf80a60f0,0x834d23a7),LL(0xeca2d9a7,0x27dcb428),L_(0x0000003e), LL(0xc94b1130,0x12c12cdf),LL(0x7f1285c7,0x53433711),LL(0xa3fdb413,0x6c9aab37),LL(0xd50e87db,0xc28229bf),LL(0x6e31c080,0x9878eb5e),LL(0x647c7885,0x6255df90),LL(0x3c367034,0x64a27e7b),LL(0x359e7554,0x26d5090f),L_(0x00000077),
+ LL(0xc3090e22,0x856faf70),LL(0xcf9c3c63,0xa537fff7),LL(0xd0317a7a,0x61c02007),LL(0xdc853b32,0x61687510),LL(0x36ccdf2c,0xd6f188d5),LL(0x26fd385c,0x2955fa1d),LL(0xf2d7d6ea,0x3087bdae),LL(0x3173148e,0x0abc6b0f),L_(0x00000121), LL(0xd784c9a2,0xc0770de6),LL(0x4bf8c47c,0x35e4c8fa),LL(0xaece660d,0x8910f637),LL(0xedb7b99e,0x5ced4fad),LL(0xa82ce72b,0x0fa07446),LL(0x15701d4d,0x94600c85),LL(0x4152f301,0xf34ffcea),LL(0xf31c15ed,0x42ddbc96),L_(0x000000a8),
+},
+/* digit=57 base_pwr=2^285 */
+{
+ LL(0x3f5b1c78,0x7bafc7d2),LL(0xbe5d1d02,0x50c19efd),LL(0x3cdce225,0x5357a753),LL(0x3af279d2,0x14412057),LL(0x76015a5e,0x57141209),LL(0xc91c803b,0xb203384a),LL(0x12ba72de,0x2bedd680),LL(0x825c3d8d,0x7b99091d),L_(0x00000063), LL(0x6423553a,0xeaf27fe1),LL(0xef9335b8,0xc4539fb7),LL(0xfa5830e5,0x66badc9f),LL(0x0a5e5034,0x1dcbb895),LL(0xd3a2a96a,0xa62dca0d),LL(0x8a881a89,0xd5f98db4),LL(0x06e0a311,0xe2554b95),LL(0x69efeec8,0xf070bdcd),L_(0x00000073),
+ LL(0xb00f4f23,0xd445a023),LL(0xdd54cf07,0x551441ad),LL(0xe62fb5bf,0x33408f85),LL(0xd275f3aa,0x1f4e87ff),LL(0x701eb4ed,0xb08c2f8d),LL(0xcbec0af1,0x3b5987fa),LL(0xf0bc3119,0x37542336),LL(0x219a8c12,0xa528b587),L_(0x00000106), LL(0x5d52f04d,0x1a68b0a5),LL(0xd5fa5e22,0x5bdff6f9),LL(0xda24e831,0x9487e3f2),LL(0x8b43c649,0x8cc54962),LL(0xca393f54,0x934d621c),LL(0x52e8acee,0x0ce12d1b),LL(0xf0e6025e,0xcb0b93c4),LL(0x16663ffd,0xe4979771),L_(0x0000015c),
+ LL(0x5de71627,0xf54385d8),LL(0x8b05712b,0x7bb4ab47),LL(0xcc6b5489,0x5a9a3b2c),LL(0x7fa6f6a0,0x3bfef8f6),LL(0x773cd523,0xf505a80c),LL(0x5c9cc4c4,0xa3fe8c18),LL(0xf37ae336,0x6259e110),LL(0xb440dc7a,0x10c5254c),L_(0x0000016e), LL(0x1e50c98b,0x4b379333),LL(0x4a8aa5a0,0x3b8d3103),LL(0xc900df01,0xc99c95da),LL(0x52027ee1,0xb891a1fd),LL(0x4b5be3ae,0xb6857422),LL(0x5ba842f3,0xe00bb37d),LL(0x3f36375a,0x13a7f31f),LL(0x04743a28,0x61c3d8c3),L_(0x0000018f),
+ LL(0x69c14cb5,0xb3bf6b75),LL(0xa0bac5f2,0xcc275187),LL(0x6c2d559b,0x0eb925ef),LL(0xa5453338,0xd0382a25),LL(0x119f0d6c,0xbbf74a02),LL(0xaf681433,0xbd994d4c),LL(0x53999a9b,0x8d27772c),LL(0x249226a3,0xd03393af),L_(0x0000006f), LL(0x796a46b5,0x887c8f77),LL(0xabbf7bee,0x45dd063e),LL(0xa0a8e117,0xea429199),LL(0x8d22e28a,0x7e69a991),LL(0xb0ecebe7,0xb0ed2dea),LL(0x0edf7cec,0x37aa98d2),LL(0x0e528886,0x0ca19479),LL(0x73078fbd,0x2624f60c),L_(0x00000169),
+ LL(0x1809c965,0x4cbc62e0),LL(0x5c062be1,0xeaea9560),LL(0x1162dcba,0x07340ec9),LL(0xcf90fad2,0x6f6f4573),LL(0x8b6c2347,0x41df3d0b),LL(0x4bc4f7c5,0x6aba94c9),LL(0x9ce77c5e,0x25055fe2),LL(0xb9dd3d1f,0x3fae0593),L_(0x00000195), LL(0x6e430120,0x31a5bf9b),LL(0x31ef29c8,0x4ea14b33),LL(0x1451c355,0x3d7a4759),LL(0x515170ed,0xc3011219),LL(0x21413d55,0xb375db75),LL(0xacf6ce68,0x846f6627),LL(0x2facb2b3,0xdee7b99f),LL(0x3ead4f94,0x9859484f),L_(0x000001db),
+ LL(0x4f0117ae,0xd22f1814),LL(0xe3424149,0xad5ce6fa),LL(0x58b2d2e6,0x70e2e877),LL(0x5de9d268,0x6eb2a9a7),LL(0x6da54502,0xddee04cc),LL(0x3079a618,0xaa37f095),LL(0xef9c41ec,0x0ab072b7),LL(0x4f475d8e,0x2bbf4182),L_(0x00000199), LL(0x139a7b97,0x482e5296),LL(0x56474127,0xc87e2a1d),LL(0x0fe9253d,0x4757efac),LL(0xbdc55bb0,0xaa65a406),LL(0xfb5b47e5,0xfa5b9027),LL(0xd99ad5b0,0x1f6adf92),LL(0x3a4363de,0x6339348e),LL(0x6d9cf0af,0x2a0a19fa),L_(0x00000161),
+ LL(0x926c08a5,0x58be047c),LL(0x00018285,0x4ede436f),LL(0xb7c0f8da,0x267d40d4),LL(0x754e0583,0xf821bcca),LL(0x29b55f1c,0x356838ff),LL(0xef10fd05,0xd3bb98d7),LL(0xbf4cd160,0xcf20597a),LL(0xfe3d8718,0x20dd7039),L_(0x00000074), LL(0xbe1a541a,0x2ab231ad),LL(0x833de73e,0x3217ac39),LL(0xde117a87,0xe86047c6),LL(0xa460f6e7,0xbf61ad63),LL(0x3e4086cc,0x10646884),LL(0xeedbe45c,0x97bd568e),LL(0x9c11e90d,0x23655180),LL(0xb96c7748,0x1e4144ca),L_(0x000001aa),
+ LL(0x469af391,0x5bb73205),LL(0x3f5f97fe,0x80d05ad0),LL(0x73b1a3ca,0x00af9b79),LL(0xb52add98,0xcc82c533),LL(0x93cc487c,0x0da2ae06),LL(0xe46cf71a,0x060c7047),LL(0xaeb64abc,0x3aa21503),LL(0x0075b1d3,0xd2fdb4ed),L_(0x00000150), LL(0x29a2bed9,0x9a79f6b1),LL(0xda4630c4,0x22374a19),LL(0x62f001a1,0x90a13059),LL(0xa3cc4dcc,0x026cefa3),LL(0xb188b4cc,0x0fbb1d3f),LL(0xad092ff3,0x36e3761c),LL(0x6354b93c,0xf3dbdbdc),LL(0xb73317cf,0x30aa2b2a),L_(0x00000025),
+ LL(0x478cc5ff,0x39f6b453),LL(0x4e6379ca,0x063068cd),LL(0xe4f74a40,0xdb751bed),LL(0x94052b38,0xb0c9cab3),LL(0x8ee4c1e6,0xf5c6aa29),LL(0x3ca0dbb3,0x4a2497c4),LL(0x79c6ee9a,0x9ea63ecb),LL(0x00e2354a,0x9aadab88),L_(0x000001b4), LL(0x3a6196f9,0x62b157a8),LL(0xfa37ba58,0x59648d99),LL(0xe7f1758b,0x1b51e49d),LL(0x2e82eb6d,0xbcb59206),LL(0xc0686a28,0x337d156a),LL(0x6197f5d2,0x69bbd81d),LL(0x9b64ab0e,0x45283587),LL(0x8e4d1a8a,0x49019de8),L_(0x000001c9),
+ LL(0xed1f56a5,0xe00396a8),LL(0xc29bf98d,0x671ac7e0),LL(0x61a8021c,0xa76a8082),LL(0x40244556,0x85eaf05e),LL(0xd4493c4b,0xacc79ffa),LL(0xf3dd2e24,0xa065de83),LL(0xc2899229,0x616b4043),LL(0x26ec1649,0xa4be7f5b),L_(0x0000011f), LL(0x177b6d5f,0x5bdfa715),LL(0xbb1b8e86,0x1c8a38c6),LL(0x673dccd1,0xb8eb3119),LL(0x26507bdf,0x5e9ab066),LL(0x52444c41,0x63e06aca),LL(0xc41d72f8,0x6233cfed),LL(0xf0a4cf0f,0xa4204c93),LL(0x2e510168,0xdcd3c22c),L_(0x0000011b),
+ LL(0xb9ae2c20,0xa8e73672),LL(0x60eb4910,0x76d9acc7),LL(0xef341ec9,0xf8c3ff90),LL(0x71631b58,0xc5d46ddd),LL(0xf784f3a3,0xaca2efa5),LL(0x9fd6ccc9,0xb432ab0f),LL(0xe0c19b00,0xe9336780),LL(0x8e4851bc,0xeadaf077),L_(0x00000005), LL(0xeb8a4214,0x1ec45488),LL(0xab894d10,0xb3592330),LL(0xfe84be74,0xea5cac9d),LL(0xd6ce52df,0xd6fc5829),LL(0x52b83766,0xada3c1ed),LL(0x6e5007f8,0x07f9020f),LL(0x9dc77e51,0xf5261fb1),LL(0x3d52bde6,0x7203a776),L_(0x000000ec),
+ LL(0x9c19cb9b,0xa33466a1),LL(0x59900a19,0x2eeef601),LL(0xd1a35b61,0x70079dee),LL(0x043f6bdc,0xcd5ea5fd),LL(0xc0119db9,0x3a3b272f),LL(0x5b2eb1b8,0xe45f974f),LL(0xba8b6e51,0x5f770445),LL(0xd0419f04,0xc16877b4),L_(0x000000c3), LL(0x4b8a6a2f,0x21c82a7e),LL(0x356eb5d6,0x1f805802),LL(0xc510787f,0xb2d54598),LL(0x678fa9fa,0x14375d0b),LL(0x27fba413,0x6ed82aca),LL(0xce44cfc3,0xbe259313),LL(0x826f662b,0xdd1eec94),LL(0xc3f7e810,0x387cd50e),L_(0x0000011e),
+ LL(0xafd7f180,0x784a36b9),LL(0xa71f98dd,0x55359374),LL(0xb80637d2,0xeb356304),LL(0x319eb954,0xe36b826f),LL(0x6caacbc8,0x5436ed41),LL(0xc8f9a6b4,0x1ad27bfc),LL(0x05822de6,0x66b9e6c5),LL(0x6448fc9c,0x3e7fb461),L_(0x0000008a), LL(0xd306ac81,0x92fe9fac),LL(0xdda81241,0x90144259),LL(0x08d31ec6,0x70a69700),LL(0x59532bbb,0x548a4797),LL(0x25db5e1c,0xfe84a6c9),LL(0xdb376141,0xd82e648e),LL(0xaf5e43aa,0xd86080c6),LL(0xa3c129c0,0xcae35c47),L_(0x00000037),
+ LL(0x2343be89,0xd0ffaccb),LL(0x1cb1ffd2,0x3a03a0c7),LL(0x899f4ff5,0x6266f542),LL(0x5f5c983d,0xbcc25c41),LL(0xcccfd128,0xdfd7dc3b),LL(0x971841bb,0xb315e6d3),LL(0xab458be6,0xf423c907),LL(0x18de71ba,0xc4028ce5),L_(0x0000002d), LL(0x8643db82,0xdf24bfc8),LL(0xae140a96,0x7d249f93),LL(0xcc1b0809,0x4a944e10),LL(0xbb9f2bb4,0x2cf2ab30),LL(0x2a9df9a6,0x3e7a3348),LL(0x8877de2f,0xc1bae4c1),LL(0x6e777963,0x95df6e0c),LL(0x12289ec3,0xc2fe3876),L_(0x000001c5),
+ LL(0x84f63e6e,0xb92016c3),LL(0x9065995b,0xcfc7edd3),LL(0x7e853e34,0xe921ec35),LL(0xe5b9d192,0x48df779c),LL(0x22c1257c,0x2377e36c),LL(0xc67f15b2,0x2dd7559c),LL(0x56741ee4,0x8133583f),LL(0x266292d1,0x3e412477),L_(0x00000034), LL(0xcd5b0dfd,0xd6ec8a55),LL(0x0e18cbd7,0xa02b3661),LL(0xd0b4c82b,0x54051775),LL(0x2328d0e9,0xa2bff3fb),LL(0xbab00086,0x8724078f),LL(0xf6183452,0xe2d3f99f),LL(0x1d9f7aa2,0x3419a97e),LL(0x6878b1f4,0x67fe5413),L_(0x00000051),
+ LL(0x6c03f366,0x7fd85da2),LL(0xd5f694e1,0x52fd006e),LL(0x2f043a61,0x51032d25),LL(0x8bc9cc74,0x9348d55c),LL(0x6f5370ca,0x56333c4c),LL(0x3610540b,0xc9a5ca53),LL(0x716d25cb,0x39d8071b),LL(0x7337f70a,0x6bc9d236),L_(0x000000ac), LL(0x97db6fc5,0x3251b143),LL(0xdb755cfd,0xd84aa2bf),LL(0x0cc3e62a,0x9e9e3810),LL(0x6071f1f8,0xe47fb104),LL(0x3e7012d9,0x97ec5c7c),LL(0xf6c7e6ad,0x98bc4de4),LL(0xa4e7cef6,0x240c6a07),LL(0xa03a3a12,0xf8236198),L_(0x00000070),
+},
+/* digit=58 base_pwr=2^290 */
+{
+ LL(0x7663b161,0xc93f0cc5),LL(0x071af3d7,0x22d6ac11),LL(0xb9149bdc,0xe6312d84),LL(0xe44e4632,0xc50d4c88),LL(0xc448cc8e,0x6c85277a),LL(0xbfe4f89a,0x128700ea),LL(0xa38e5f2e,0xb742928e),LL(0x3e261880,0xbb296e29),L_(0x000001bb), LL(0xfa51028c,0x9b6a14e2),LL(0x09549191,0x82dfd5da),LL(0xe13022a3,0x233ca662),LL(0x96fafc24,0x505fe429),LL(0xa18dea4f,0x96182166),LL(0x15ea5a2d,0x199ba558),LL(0x22a4ac80,0x33772326),LL(0xb13c3b81,0x276d1311),L_(0x00000182),
+ LL(0x215bf15f,0x61cb09c8),LL(0xe5912a10,0xae2de789),LL(0xd84851c6,0xd74ceccc),LL(0xb95ccd21,0x6a285101),LL(0xd32dddf2,0x0122d3f6),LL(0xdb554921,0x02c5d952),LL(0x96a4aa1f,0xb24be997),LL(0x8cde88aa,0x7caeb407),L_(0x0000008d), LL(0x2cd753b8,0x88aff9b9),LL(0xcc49d782,0xf7cdce61),LL(0xdac4e445,0xfad48cc3),LL(0x0ac2a937,0x956fdfcb),LL(0x98c5bdda,0x81841ce2),LL(0x9f12bb3e,0x170e6c81),LL(0xcab58ad5,0x30efd73e),LL(0x76a3a481,0xabf3f0f4),L_(0x00000010),
+ LL(0x361c2c61,0xb9e4b6ab),LL(0x810de58e,0x3d0db7a6),LL(0xe085a8d1,0x45a31ec7),LL(0xa7bb9df2,0x35378c99),LL(0xd8933f30,0x186da525),LL(0x1033d24d,0xddb7a3b3),LL(0x8af19819,0xb5c9012c),LL(0x57d17203,0x722478c1),L_(0x0000002f), LL(0xce3ccda4,0x41697bbe),LL(0x5c6d7a27,0xb8be57fb),LL(0x1fba9fbf,0xc562ecca),LL(0x9a3fed12,0x1bcd8090),LL(0xf597a3fc,0x74a6954d),LL(0xce4e5ded,0xb4910fbc),LL(0xa5ed9cf8,0x79902452),LL(0x9c77346d,0x4ebfad77),L_(0x000001cf),
+ LL(0x3a4f332d,0x3d82a438),LL(0x56af6321,0x0fc06213),LL(0xca05acfd,0x8864ca32),LL(0xe80103ea,0xc2e9c7c1),LL(0x99dd0ff4,0x4c64b758),LL(0xc9889d76,0x80c128a8),LL(0x881a1256,0x77fdb7cd),LL(0xf09f58ad,0xf478aec5),L_(0x0000018c), LL(0xc6ecd4f9,0x41a633a8),LL(0xecb1fc4c,0x847c2f58),LL(0x92dae51a,0xa7d7b295),LL(0x268f50e3,0x3b5eef6e),LL(0x3a27de2a,0x0d7a599e),LL(0x14916d54,0xd01f9b57),LL(0x204fbca0,0x675e52e5),LL(0xeb48615c,0x50dac3d9),L_(0x0000019b),
+ LL(0x0a639042,0x0fd5737f),LL(0x31d2eb63,0x801bd86d),LL(0x85ffa7ea,0x1011c35d),LL(0x8d043e51,0x1ef5b87b),LL(0xcb405068,0xec30dbd9),LL(0xc20daf68,0xe48310c1),LL(0xcee24a41,0xa65b8aca),LL(0x119d1da9,0x4a04288e),L_(0x000000ec), LL(0x716e9def,0x8b2825b1),LL(0x5d82926b,0xb4cd0082),LL(0xe1a8a7c8,0x6474e309),LL(0x12620e3a,0xb0da6f90),LL(0x2d673d4a,0x574adf3d),LL(0x628b88b6,0xb210b971),LL(0x9d1b96a3,0x6b2d573e),LL(0xedcd56fc,0x8269ac81),L_(0x000000b1),
+ LL(0xe07f6e9e,0x0f0b6a27),LL(0xa4a6f307,0xddeaaa37),LL(0x9c430a1d,0xeacad6b5),LL(0x9620fd47,0x9a8128c0),LL(0xf279790d,0x3bf5952b),LL(0xfb97ad6f,0xe0561485),LL(0x0fe7692a,0x482c591f),LL(0xe268f3cb,0x8a7a037f),L_(0x0000013a), LL(0xdb21bfbb,0xde3dc674),LL(0xdbf154f3,0xf4401caa),LL(0x32e63083,0x462197d4),LL(0xb9452cf6,0x46240ddd),LL(0x10344368,0x1c6dbfe6),LL(0xa986f17f,0x94ccbb69),LL(0x4632a20c,0x3f6277d7),LL(0x33029382,0x0f710d97),L_(0x00000010),
+ LL(0x2b718a28,0xd8752e23),LL(0x65e87e31,0xa158249b),LL(0x88c3f123,0xff7b1118),LL(0xd9121432,0xbe4461fe),LL(0xa0850e4f,0x9ef5bc2d),LL(0x6350e71c,0xf28780a7),LL(0xc6dabd80,0xfc8f574b),LL(0xc3c266b1,0x7bb0ad43),L_(0x00000016), LL(0x13bf6ff9,0x7db218bc),LL(0x9d000699,0x0dec75e5),LL(0x7cf7628c,0xb95f2df4),LL(0x2fa7aacc,0xe8ff9a7d),LL(0x96555722,0x1076129b),LL(0xa11a1984,0x57afac1e),LL(0xfd1e9ec4,0x16d64a31),LL(0x008b70a7,0xf6e81632),L_(0x00000000),
+ LL(0xb0d9eaa8,0xf5caa2dd),LL(0xddc322f7,0xc31038c0),LL(0x08fb4b57,0xa651596a),LL(0xd9ca6980,0xab32e2a6),LL(0xc95c78a8,0xe5808eea),LL(0x5a32ba78,0xf5f9923d),LL(0x3bbece34,0x26ad1c8d),LL(0x8f8b8459,0x84189709),L_(0x000000ce), LL(0x16843645,0x8875d753),LL(0xa90e9fa2,0xe13608c5),LL(0xaf90c364,0x57e5556e),LL(0xcc40e058,0x9e332dda),LL(0x9c5012b5,0x2b76768f),LL(0x8a76230b,0x2932d53c),LL(0x573bdff3,0x14999fbd),LL(0xeee93001,0xdef0f840),L_(0x0000017d),
+ LL(0x1a3f60e5,0x7e88fc70),LL(0x29625c0d,0x396b1851),LL(0x610e5833,0x947ef062),LL(0xd8dd1f5d,0x47f1a571),LL(0xa0f65294,0x7850d950),LL(0x49f087e9,0x22c8e733),LL(0x18807434,0xce5508b2),LL(0xd0fc8fca,0x25125ea0),L_(0x00000121), LL(0xc3d1360f,0x69072d8a),LL(0x8b9d1e81,0x8cba6305),LL(0x01ed34a6,0x7a1a3844),LL(0xbc37f296,0x20c61572),LL(0xd409e84e,0xd54640e7),LL(0xeb6c948c,0xc9243fc3),LL(0xc754fba2,0xb39c9166),LL(0xc28f4f28,0x15bec182),L_(0x00000188),
+ LL(0x32c7f33f,0xa0e6751c),LL(0x47474b7e,0x7f265069),LL(0xe1e4a2ce,0x0460d889),LL(0xeab5839d,0xb51b9a7f),LL(0xe7cad388,0xa5032a25),LL(0x46ee855a,0x6621ee7b),LL(0x16fbfccf,0x5a6f1501),LL(0x73af1329,0xbadeb575),L_(0x000001f6), LL(0x694e09ae,0x0646542a),LL(0xaceb179f,0x27a867a4),LL(0xeb30df16,0x14cf3975),LL(0xf9d85fe3,0xa18e96b2),LL(0x37e6f97d,0x7781a0f2),LL(0xb09bd1ce,0xa8de0b13),LL(0x278a1089,0xc3a91cf5),LL(0x02296583,0x1b9593f9),L_(0x0000000e),
+ LL(0xeca2c791,0x86fe1661),LL(0xd1c18fea,0x4aedcbc7),LL(0x3f879f46,0x0545d544),LL(0x4cb96993,0x95120a10),LL(0x595026f4,0x1d335198),LL(0xc959c824,0xa814ec2a),LL(0x8fbede3e,0x0e062b6d),LL(0x3832b5b2,0x6bbcce86),L_(0x0000017b), LL(0xfad2bbc3,0xcf89249c),LL(0xf01f3803,0x63266c42),LL(0xb86898e0,0x685db0a5),LL(0x3becca8e,0x7e4eaa63),LL(0x3ec31fe1,0x90fcf86c),LL(0x394a64f7,0x967f0628),LL(0xc6f81bcd,0x635c81b7),LL(0xec462896,0xb8022758),L_(0x000000f1),
+ LL(0x67236236,0x67484461),LL(0xdb36fbe6,0x5f5c47c0),LL(0x9fb54024,0x71f2fbb3),LL(0x44525a78,0xbedf63e3),LL(0xe71375bd,0x9f085fb8),LL(0x47d50bd8,0x1c59b6e6),LL(0x2f2ea430,0x578031fa),LL(0x58012b66,0xd2034d9b),L_(0x0000007e), LL(0x473015fd,0xfde2151d),LL(0x9616e82c,0xe4d908c9),LL(0xd4ec3b2f,0x04a04977),LL(0x13df9ad2,0x3ee923f5),LL(0x2b66641e,0x175bb5d9),LL(0x0fcd9df2,0xcdb5c3c9),LL(0xfac57254,0x7fde8809),LL(0xc6981a62,0xd951b985),L_(0x00000091),
+ LL(0xb19296e9,0x9d659d99),LL(0x6d5aa5b9,0x489a28d9),LL(0x5422e69c,0x5cf35829),LL(0x06993c4a,0xed0dce41),LL(0x4bccea69,0x21d11ff6),LL(0xa2e82c7c,0x44f73388),LL(0xda3168f8,0xf6117d7c),LL(0xdff018c7,0x0454467f),L_(0x00000112), LL(0xeb022661,0xe965ba34),LL(0xfeff852b,0x1a68518b),LL(0xbe9a9ee4,0x53aa84d0),LL(0x31f46a2c,0x112327ea),LL(0x6855b874,0x06311411),LL(0x43d26e75,0x7348f329),LL(0x65628948,0x0582ac08),LL(0xe3244339,0x44f3001a),L_(0x00000184),
+ LL(0x5a842868,0x12b97327),LL(0xd4a2fefb,0x8f7a410f),LL(0x84c0e584,0x98e19862),LL(0x3fbe93da,0xe566e4f8),LL(0xe44a9540,0xec1d03a0),LL(0xa377131e,0x1b99313e),LL(0x27336d2c,0xc15f4f38),LL(0x8c27d958,0xeeef149e),L_(0x000001b6), LL(0xe75811d3,0xc54aa0e8),LL(0xe1cbcf6b,0xc195aaf4),LL(0x5596682f,0xe98a5845),LL(0xe0cf229c,0x70256db2),LL(0x5a921b26,0x10d830e7),LL(0x37fc26fd,0xe3def649),LL(0x16a810c8,0xdb834a77),LL(0x613433c1,0x71908e34),L_(0x000000f8),
+ LL(0x7624b24b,0x7db58054),LL(0xabebbd07,0x20618f15),LL(0x3a5e2752,0x72097df2),LL(0x4f72e3fd,0xf79b4cba),LL(0x6f03686a,0x3cfd9643),LL(0x2d89778e,0x683c4a14),LL(0xeade01a4,0x7cca2771),LL(0x533fd14a,0x7a145968),L_(0x000001b1), LL(0x5f84ba35,0xb97b68e1),LL(0x4e0b9bd1,0x6e47fe3d),LL(0xcdba9cfa,0x3026f026),LL(0x6e415889,0x057de03a),LL(0x7c12c31f,0xa54231cf),LL(0xcdfae481,0x68a6cb37),LL(0x3908080c,0x259ee9d4),LL(0xa3c797b1,0x5a90709c),L_(0x00000030),
+ LL(0x021a0d91,0xd49fbe57),LL(0xde5b21b0,0xbb57b277),LL(0x7291e7e7,0x1e6a4b2d),LL(0x16da29ce,0x4426f88c),LL(0x68f8b71f,0x6a6ebaff),LL(0x9995fbf7,0xab510adb),LL(0x6ec18d2c,0x8d4b996a),LL(0x3ce11f1f,0x0c8233bc),L_(0x0000004b), LL(0x8e04c405,0x34703d79),LL(0x6b0a33af,0xdd55e68b),LL(0xb14161e8,0x4737f09c),LL(0x57558d9c,0x90c00b53),LL(0x9d9a485a,0x508e73fc),LL(0xbb09dac2,0xd252e5f5),LL(0x4ba2132e,0x33b1efcb),LL(0xc58bf239,0x43e79593),L_(0x00000026),
+},
+/* digit=59 base_pwr=2^295 */
+{
+ LL(0x5b781a84,0x584291d5),LL(0x6ea73ad7,0x992c0a26),LL(0x20e9954c,0x169e02af),LL(0x4d73d175,0x2718e0ca),LL(0xe1612ee1,0xed50926d),LL(0xc638cf1d,0xc1060d91),LL(0xb5998df8,0x4b7dc332),LL(0x4eb7dc88,0x46da4262),L_(0x00000157), LL(0xd78eae21,0xa9f4bf2c),LL(0x372725c2,0x86c74c6b),LL(0xb5b5158f,0x736a4de4),LL(0xba4800d6,0x451f4693),LL(0x5138590e,0xd2239cb9),LL(0x6f5d263e,0x45bdc4c5),LL(0xc0f8acf5,0xd06676d4),LL(0x8bbd0743,0xbe979403),L_(0x00000155),
+ LL(0x714fe80d,0x2da244cb),LL(0x06f04145,0xcda8b722),LL(0x84ee9fa6,0xc3d58870),LL(0x0e111da7,0x1c267392),LL(0x53bb35ef,0x906e57c4),LL(0x6a858e61,0x3eebaa20),LL(0xf4582387,0x20dd3b5b),LL(0xcf71c4a7,0x82d3b15d),L_(0x00000009), LL(0x91605cdd,0xe98756fb),LL(0xcda7aac0,0xf0286c4c),LL(0xb4372718,0xa4017819),LL(0xdae0a5d8,0x21935131),LL(0x0720f8cb,0x261dafa4),LL(0x40e03217,0x6fb18c8c),LL(0x34851940,0xcd3c7d48),LL(0xe02770ca,0xc52abd46),L_(0x00000103),
+ LL(0x826415dc,0xaee30325),LL(0xe70ecca1,0x8395cad3),LL(0x053fd2fe,0x148ed662),LL(0x3520779d,0xad7a6345),LL(0xc9cad78e,0x02a99616),LL(0xb2b3d15b,0xa5bc3102),LL(0x9cfe5a4d,0x4cc19d74),LL(0x59fc0a6f,0xd407b106),L_(0x00000075), LL(0x3a1ba1c9,0x487fa3ac),LL(0xb4dfc9f7,0xe0d152d8),LL(0xf699a6f5,0x8f345525),LL(0x20633fdf,0x76ba6839),LL(0xca7d8a08,0x2bd4f59f),LL(0x88585003,0x05078df0),LL(0xcface355,0x01da05b9),LL(0xfd2eb0a9,0x05a56ca7),L_(0x0000007e),
+ LL(0x52b16ebe,0xf47e5b46),LL(0xe6ae36e7,0x71c81701),LL(0xe3a4cc33,0x1ae7f8d6),LL(0xb29431c3,0xaeb29c67),LL(0xb869125f,0xe16be2af),LL(0x052cfd62,0x934ce6d0),LL(0x10638824,0xe1cd7490),LL(0x2b021800,0xede192e6),L_(0x000000ac), LL(0x53a39e35,0x21f34b32),LL(0xaa3b5761,0xd9c36b4a),LL(0x2e0442ed,0x419b2399),LL(0xd2725144,0x4d374723),LL(0x0ced8d6e,0x6d58a708),LL(0x1b1f1118,0x0cd63ed1),LL(0xd7a4d0b5,0xf4c6faa6),LL(0x9c897561,0x53bcb255),L_(0x00000047),
+ LL(0x0cb3fdd3,0x8e8db5d1),LL(0xaee5321b,0x87aea4fe),LL(0x3857736e,0x16711165),LL(0x0c1ddf85,0x0fefea55),LL(0x5866facc,0xf4b819a9),LL(0x33eac999,0xde7464eb),LL(0x2a31e0a7,0x4f70e413),LL(0x152ce312,0xfbd1795a),L_(0x00000194), LL(0xbf9b85c5,0xba27db9c),LL(0x153c54c7,0x65beb177),LL(0x0c1db955,0x38a15bc3),LL(0x12ad15c1,0x1bbf7edd),LL(0x99f39d44,0x0cddc300),LL(0x017014dd,0x7ea43a2c),LL(0x2d23d878,0xbec5a12d),LL(0x5eda0b7d,0x53c1c755),L_(0x00000156),
+ LL(0x06657d80,0xd29c3627),LL(0x8365a95f,0xe70b9e02),LL(0x084d6b18,0xc68fa40d),LL(0x80bbbcfe,0xae56df9d),LL(0x8a06728a,0xb6253373),LL(0xbd4a361e,0xc77e1c92),LL(0xd3c11b1d,0xa94fbeef),LL(0xa52dffaf,0xca64acfb),L_(0x000000c8), LL(0xf19acb1f,0xe668d3f2),LL(0x23cbf024,0x095d2d5d),LL(0x7f105b84,0x89f76b69),LL(0x5b550d74,0xe73345da),LL(0xbc9d3a15,0xd2b26a8f),LL(0xd6a293e0,0xe4494adf),LL(0xe0387451,0x818e6417),LL(0xb0518331,0x48fe9fb0),L_(0x00000001),
+ LL(0x4d2a42df,0x808fa6d8),LL(0x68651170,0x445f0d4b),LL(0xec0d410c,0xc6980698),LL(0x1ad2d890,0x005f7ee7),LL(0xbcda7089,0xa7d283e2),LL(0xf5b48062,0xcee64fee),LL(0x0051a180,0x73e72ad4),LL(0x848f7b7c,0x9759cdbe),L_(0x00000137), LL(0x690a81c3,0x3ce8b5c2),LL(0xac33d774,0x15e254f0),LL(0xa423baea,0x948fbc87),LL(0x2fe89ca2,0x80cdde65),LL(0x9a165eb6,0xb1b05690),LL(0x1c84102d,0xc135f5d4),LL(0x73f34a94,0xc61329b0),LL(0x8ced1268,0x2e0d7d89),L_(0x000001f4),
+ LL(0x9713685f,0x93a123f3),LL(0x6ef5a591,0xf28bae61),LL(0x67b33050,0xda7d2c65),LL(0xae5b6596,0x59fc9e4d),LL(0x0481adbd,0x18dde4a4),LL(0x2fe92c16,0xf2a19468),LL(0x5adc0431,0xeac05bc1),LL(0xdb30fcce,0x7e2cf13e),L_(0x000001dc), LL(0xee47d7a2,0x4cf35b8d),LL(0xc425ee95,0x74908606),LL(0xcdac359e,0x22c94a88),LL(0xef2c8586,0x10d20bfb),LL(0x8d0f7458,0x1ca77f65),LL(0x426741d7,0x82f59f1e),LL(0x640314c7,0x294af36c),LL(0xec0709c8,0x18dd5e35),L_(0x00000120),
+ LL(0x1e52ac8f,0x0894401e),LL(0x36abe923,0x9f482e3b),LL(0x81ce378a,0x32d1efaf),LL(0xae954687,0x62ff86e1),LL(0xd9afd8e0,0x085da5ec),LL(0x5871a105,0xd026254f),LL(0xe7a32717,0x83b4a648),LL(0x40288d2e,0x8d29644b),L_(0x00000197), LL(0xb0b6dc10,0xa8898440),LL(0x699ececa,0xe53262d1),LL(0xdf9ba3e4,0xdb180197),LL(0xa82e89ff,0x786042aa),LL(0x97af8b17,0x663faa6b),LL(0x00b45e0a,0xf346c12e),LL(0x03c76f2d,0xe8ec3f00),LL(0xbda1be57,0xf05e51a3),L_(0x00000078),
+ LL(0x55c5c739,0xfcd89a8d),LL(0xc0dcdb75,0x71a4d047),LL(0xd498ccfb,0x8baef9a3),LL(0x669e7edb,0x20d8ae8f),LL(0x98d6b13c,0xd16a48c7),LL(0x3f4ca564,0x50d24170),LL(0x509f9dc2,0x8c680ef9),LL(0xb2c17a38,0x29830970),L_(0x000001e1), LL(0x23778808,0xe8d8d33c),LL(0x9dd269ab,0x9bd2fb18),LL(0x1e8769b1,0x62b11258),LL(0x657bacd6,0x8521c19d),LL(0x584fbcaa,0x46adc05d),LL(0xe93891c5,0x68fad3f4),LL(0x8617aebc,0x0857bce7),LL(0xe39a4226,0x50c3c701),L_(0x00000128),
+ LL(0x17cc51bf,0x6d70f113),LL(0x546beb5c,0xc94a2150),LL(0x62ee8e73,0x3d11d590),LL(0x255999c7,0x8c21f26b),LL(0x42e22a6e,0x3732f418),LL(0xb9e01e7a,0x910608f5),LL(0xea10cdc0,0xef7f9669),LL(0xf54f17b3,0x271d06b5),L_(0x000001f9), LL(0xe994f9cf,0x5a87a958),LL(0xe54c87e2,0x6e7d0b5e),LL(0xa8cc0493,0xb0873928),LL(0x837b814a,0x92c0806c),LL(0x1e804d39,0x8cb9df2c),LL(0x1d8a5f76,0x2377456b),LL(0x33c3155b,0xe6d63e09),LL(0x55cb5f9c,0x572ecf1e),L_(0x00000107),
+ LL(0xcfd79f62,0xc5d103b9),LL(0x295548e9,0x71b65a58),LL(0xb8462f3d,0x40934991),LL(0x1453c2b2,0x41c087b5),LL(0x1cf62fb3,0x37eea50d),LL(0x02ab6cdb,0x7ada571b),LL(0x1b49b692,0xda9e677d),LL(0xb52dc4d6,0x1d635004),L_(0x0000009f), LL(0x2e42f171,0xb6cceda3),LL(0xdbcc6765,0x09960889),LL(0x2e336d9f,0xe5440e8e),LL(0x34cefd7d,0xb410a81f),LL(0xd8bc6b5a,0x91782d60),LL(0x46d80cbb,0x95e22f30),LL(0xc99291ea,0x9e775cf7),LL(0xca473be0,0x73ab5282),L_(0x00000170),
+ LL(0x06ac0186,0xbd98b833),LL(0xdc7e7944,0xae0a1564),LL(0x0b94fb31,0x8b85aba8),LL(0xfd0db6b7,0x3fa21f5d),LL(0xbb92a7c4,0x7133a3ce),LL(0xfc2b2cf0,0xd39f3731),LL(0xb63fc2cb,0x376e5f1f),LL(0x4d89e9a6,0x3c36dece),L_(0x00000199), LL(0xe98c5f25,0x2178e890),LL(0x51c9207d,0x1be32aa0),LL(0x8d2cb6c8,0x629881ee),LL(0xdb210410,0xe3099a6e),LL(0xfd24a488,0x62aff70d),LL(0x6e705a1e,0xb843d997),LL(0x41319b69,0x8bfa95c3),LL(0xd9b9376a,0x9990510b),L_(0x00000032),
+ LL(0xc2b6a03b,0xfefa851e),LL(0x0a7bf6b7,0x3a92f668),LL(0xbf4905c0,0xe8a75dea),LL(0xff483a6a,0x78467396),LL(0xdc163b2b,0x8999b6fb),LL(0x8968be09,0xc4a53538),LL(0x419a12c9,0x40b8e919),LL(0xd87c8896,0xc3d8cb0b),L_(0x00000147), LL(0x68f69e36,0x5971b3c8),LL(0x53ea08fc,0xbd601db4),LL(0x0ff01a96,0xa72aee96),LL(0x347158b6,0xef1dc3a0),LL(0xc8994151,0xb70d9ea4),LL(0x39937de4,0xa2906842),LL(0x73a17885,0x1ae4276c),LL(0x34f8bee7,0x73c8f8a8),L_(0x00000103),
+ LL(0x7fdb683d,0x5075fbb5),LL(0x35997d35,0x4f7513bc),LL(0xb65dda5b,0xcca089f1),LL(0x0e8d30ed,0xf394427e),LL(0x66ecf608,0x7394ebe5),LL(0x80d0cb61,0x2babf408),LL(0x9903b671,0xb8208316),LL(0xe416cdcf,0xb4a46cb6),L_(0x000001fc), LL(0x26090ace,0x026550ab),LL(0xf1bd714b,0xceedda36),LL(0xd83c3071,0x6a6fe427),LL(0x5704c9b9,0x9e328311),LL(0xa3fbc241,0xfceb37ff),LL(0xf54b88ee,0x2f82304a),LL(0xb6315a8d,0x77a230c7),LL(0xeda8682e,0xb1bd2d77),L_(0x000001e3),
+ LL(0x5759366b,0xabadb724),LL(0x75b84d60,0x87caf5b9),LL(0x983f793d,0x1cecc3f1),LL(0x94d8de54,0xd8885c2e),LL(0xf90b687c,0xd952f2ac),LL(0xd5046b6c,0x16cc05b6),LL(0x266e5bb0,0x52f97cdb),LL(0x5959c784,0x417167c9),L_(0x000000e1), LL(0x931e70e0,0xc8989bfc),LL(0x36663528,0xc244410e),LL(0xf14f2667,0xbca645d5),LL(0xf8059cc8,0x1c94e08c),LL(0x1d2134f7,0x1d1a84e9),LL(0x3489ba7b,0x21c35b98),LL(0xdddbab1e,0xa303bfc5),LL(0x86156a8f,0xa3ec6998),L_(0x000001df),
+},
+/* digit=60 base_pwr=2^300 */
+{
+ LL(0xec83fd79,0x9640b910),LL(0x5166dc54,0x1f3c076c),LL(0x553ff932,0x6d2b7e4e),LL(0x7e2f7e67,0x097c11e9),LL(0xaa2cdad5,0xc5cedff5),LL(0x397f4bc0,0x57d09eef),LL(0x8d95f667,0xe7743495),LL(0xe32eada9,0x34e574ee),L_(0x000000d6), LL(0xe641f85b,0xa0e3496c),LL(0xa6b773ab,0x7931548e),LL(0x3aecbf5b,0x2ef14927),LL(0x58c42c5d,0x1528b818),LL(0xfddc70d9,0x1c157c1e),LL(0x0a328d34,0x690e10df),LL(0x0760fd8a,0xa364f5d3),LL(0x4ec3b44e,0x0d06d0d1),L_(0x0000007e),
+ LL(0xb187f011,0x26f1e48d),LL(0xb62010d1,0x0d05c4b7),LL(0xe0fbe5e8,0x3f0a2ba1),LL(0x24d802f1,0x189e9602),LL(0xde0b8698,0xc0b8af43),LL(0x28591b4b,0x706b742b),LL(0x36bf7aec,0x63d91963),LL(0xec0d2fd3,0x576d907f),L_(0x000000ae), LL(0x440b0b6c,0xe982e3e2),LL(0xd99d67cd,0xd814a6fa),LL(0x7edfbb4d,0x4ac7d349),LL(0x46c6afc8,0x63bbd77a),LL(0x84cd907a,0x18bcc3d6),LL(0xf098909a,0x756b5193),LL(0xd6e0581d,0x02f37ab5),LL(0x06adf4d1,0x2f363ffb),L_(0x000001ce),
+ LL(0xe90415e4,0x6bd8544c),LL(0xc664d2f1,0x3e7600d6),LL(0x01912f05,0x1e8d9aa4),LL(0x3e0c268e,0x43dcdadd),LL(0x2f140134,0xbf936e21),LL(0x252cf59c,0xb8aaec39),LL(0x00b8cef4,0x7ed652c2),LL(0xc64c11e4,0x639c50aa),L_(0x000001e9), LL(0xa7c08e2e,0x59176893),LL(0xafe8a484,0xc7c5a8f0),LL(0x6f043d0d,0xe33e999b),LL(0xb3c3cfd6,0x2a496c00),LL(0xcb4fbc5e,0xe2690de5),LL(0x1dfaf5ee,0x3d2db451),LL(0x743e9277,0x8bfecdd2),LL(0xade6a194,0x5bfc14f4),L_(0x000000f4),
+ LL(0x8d039609,0x488fdf25),LL(0x1e037339,0x0e39945a),LL(0x4d16fa60,0xf539a844),LL(0x54408c23,0xf7f8ccc4),LL(0xbef729fb,0x69b8abc6),LL(0x76661fe3,0x3dbd87a4),LL(0xa8903415,0x790f6266),LL(0xc7b4bcd2,0xbe422de3),L_(0x00000195), LL(0xa406e205,0xce1af477),LL(0x72e7763c,0xf7fcf645),LL(0x43d00999,0x1f7c9317),LL(0x02adccdc,0x8b87a139),LL(0x541be26f,0x9ffcb96f),LL(0xbb590677,0xc0636264),LL(0xc0db1d61,0x19484331),LL(0x5585c8ae,0x3548f76e),L_(0x000001d9),
+ LL(0xe85899b3,0x5fff92e2),LL(0xb4a44f31,0xa8cf599e),LL(0xca1a3e87,0x17a2e4cf),LL(0x205f34e2,0xe4f28f3f),LL(0xe9eb1362,0x4aa7c205),LL(0x6ace61c8,0xfa76515b),LL(0x7e550586,0xec83aca3),LL(0x35e870f8,0x982b8304),L_(0x000000ef), LL(0x2e02203e,0x318327d4),LL(0x004d9655,0x5d903904),LL(0x7cd1d2f1,0x9d294adb),LL(0xca1242c8,0x3b5bb4eb),LL(0x4af2a142,0x93818e82),LL(0x15e366f3,0x9a304441),LL(0xd6a53de7,0x49183b2c),LL(0xfd324d82,0x27bcf47b),L_(0x000001a2),
+ LL(0x4d1ee196,0xa1d04903),LL(0xe53d6718,0xacaf386a),LL(0x6605e4e6,0xcc306d74),LL(0x458e136f,0x77dc40c4),LL(0xab7a1ac6,0xbb331955),LL(0xd47f6ee4,0xb95c386e),LL(0x43841037,0x526640fb),LL(0x00a37bb7,0x59e53810),L_(0x000001b6), LL(0x8b8cc55b,0x71d84cd7),LL(0xe7e03251,0x1b8eb12e),LL(0x64c45f59,0x2d7bd8c5),LL(0xc2283df1,0xb03bfc76),LL(0x28a36461,0xafd6fc81),LL(0xa0580c8c,0xe72b6275),LL(0x511c376a,0xce438282),LL(0x0ca3213f,0x379b6878),L_(0x0000011e),
+ LL(0x1e2c0f6f,0x17179cb8),LL(0x0810156c,0xaf140db0),LL(0x63cd1fa8,0x2171bb5e),LL(0x729533d8,0x544c77b0),LL(0xf6676827,0x0143af56),LL(0x599efe1b,0x5a759df2),LL(0x3accffd4,0x55962b59),LL(0xc61321e5,0x795b77a3),L_(0x0000006a), LL(0x66e58a6a,0xbb4d42d5),LL(0xe0cfd739,0xe6ef3760),LL(0x0620ef46,0x6804fb37),LL(0x253e0f9e,0xf4e9cdc2),LL(0xcb5c8c64,0xec6f6658),LL(0xa80d08da,0x04153037),LL(0xcc959be5,0x3d215b47),LL(0x7aaaa865,0x6b1b8e4e),L_(0x0000014a),
+ LL(0xf52bc233,0x9700029a),LL(0x2a837019,0x3201dddf),LL(0xd02e2c74,0xd8885cda),LL(0xaea6cd36,0x7e35126d),LL(0xbc3f784e,0xfa40cea6),LL(0x5130e882,0xeec16a3a),LL(0xace2f121,0x13c43706),LL(0xf3c3a16a,0xc703c9cc),L_(0x0000002c), LL(0xc964823f,0xe8e4729a),LL(0xeed8d7ba,0x3fe54edf),LL(0xcfba42bd,0xec6a4e7b),LL(0xe917bf88,0x06be2039),LL(0x604163c6,0x17d5a63a),LL(0x6bdf09b0,0x276869bd),LL(0xf021410c,0x4b94144f),LL(0xf038cdd9,0xf4d84a13),L_(0x0000013c),
+ LL(0xeb8a6d24,0x724db1ba),LL(0x545ff43f,0x850f42b2),LL(0xfcaf8079,0x5c1fdccc),LL(0xde18c209,0x57404da7),LL(0x83097de7,0x267842f8),LL(0x8706015d,0xab9a893d),LL(0xe62c08dd,0xe2b0c7a0),LL(0x736bf358,0x34fb3742),L_(0x000001e1), LL(0x535f7766,0x4779dd4d),LL(0x10a98c32,0xc095243e),LL(0x0e7bc245,0x3cd82df8),LL(0x5fac69de,0x59efca16),LL(0xa2f0af19,0x692e1ddd),LL(0x40c91226,0x9b21f9d2),LL(0xa682e04c,0xa51cafc2),LL(0x831c0e79,0x9830cc49),L_(0x0000004a),
+ LL(0x94e4798e,0x00af5508),LL(0x9afdccb8,0x987426d2),LL(0x0f5f64d2,0x4aaeb57e),LL(0x76899b88,0x9a8859b4),LL(0xcf38ab59,0x31a64817),LL(0x8dc36916,0x9b757c1f),LL(0x28b27539,0xfb6a189c),LL(0xc63802b8,0x03d47dba),L_(0x000000c2), LL(0x225f33e4,0x9d6bb39a),LL(0x880025e5,0xffb62ebd),LL(0xb7d05691,0x6aacd544),LL(0x3e434b4f,0xba8454f9),LL(0x4bc06244,0xbe5d3fe0),LL(0x941bd419,0x6732d1a1),LL(0x6794ada7,0x6efab77e),LL(0x1058a767,0xf531c68b),L_(0x00000132),
+ LL(0xe58d6aac,0x5f7430b9),LL(0xb9ab109f,0xedf696b8),LL(0x252205ff,0x65163bdb),LL(0xb3a47496,0xfd8eca02),LL(0x915f0458,0x6d6b0ec4),LL(0xb0096e8b,0xddddf89f),LL(0x874c9e5e,0xab9c669c),LL(0x156cfc6b,0x83d55b9a),L_(0x000000fa), LL(0x8c6752e9,0xc103803a),LL(0x0196650f,0x653fb161),LL(0xe597cf0d,0xa211c0cf),LL(0x66902c1d,0x126bc8cd),LL(0xff4436dc,0x502c8df4),LL(0xcf0ef89e,0x30d9c137),LL(0xadabc266,0x509eb349),LL(0xcbdaa030,0xa426a8ae),L_(0x00000101),
+ LL(0x9d067e75,0x0846b23b),LL(0xb348d35d,0x6044d60f),LL(0x4e0c74fc,0x4437fb47),LL(0x2124f846,0xc898c89a),LL(0x30abdb7d,0xa1ecdf1d),LL(0x496e747c,0x09be44bd),LL(0x9381d368,0x6a34a28e),LL(0x2cd1e7c2,0xdcbc2c2c),L_(0x00000101), LL(0xece95ae5,0x705df30c),LL(0x08cdb28f,0x8f6f90ca),LL(0x15b2caca,0xdb9f29f0),LL(0xf8e2597f,0x537c5e8b),LL(0x91e195ad,0xa54bf828),LL(0x1ef3bc47,0x5f5b1233),LL(0x6c98e99d,0x096c5cfe),LL(0x0acf39b3,0x88fd1f55),L_(0x00000043),
+ LL(0x5e49ea9e,0x8278d27c),LL(0x1462a5cf,0xb6b188b1),LL(0xd1c3e723,0x7adfe4be),LL(0x9f4ab12b,0x4f74656e),LL(0x86f9e399,0x15f9fd6f),LL(0x647aabe4,0x356f176c),LL(0xdc05df56,0x037f39e8),LL(0x6f8c9681,0xc0c1a4ab),L_(0x000001cf), LL(0xfd586565,0x4f9b62dd),LL(0x9a07decc,0x07d1665c),LL(0xb14d451c,0xb6af032b),LL(0x2d75e1e7,0x7c7044cc),LL(0xac2df8ec,0xcac8a69f),LL(0x0906e20d,0x20c70582),LL(0xa4167466,0x1ca47052),LL(0x6fe2b8c1,0x576c602e),L_(0x000000ff),
+ LL(0xfb8bf3d9,0xcaac45d1),LL(0x39bf904a,0x4d2bf532),LL(0xa7f1203e,0xa3246448),LL(0x9ecdf560,0x6d3940b2),LL(0xa6d3b3a3,0x89bdcf57),LL(0x40dcc76f,0xdcc95c73),LL(0x9fa5791b,0xa442ea24),LL(0xc94b40b3,0x4596aafd),L_(0x00000184), LL(0x8473e7d8,0xbc97c4e6),LL(0xe17e4cb3,0x8daa65ee),LL(0x1d315fc6,0x20c6ff94),LL(0xeaec9cae,0x74f3ffd6),LL(0x1b61c251,0x015f6f88),LL(0x6a1cf873,0xee694708),LL(0xd187e0b9,0x37da53ba),LL(0x332ba61a,0x7b15c4b9),L_(0x0000017f),
+ LL(0x409292b4,0x27a8575f),LL(0x23606aaf,0xeb1afe84),LL(0x6df6bd82,0x546ebac4),LL(0xd77cd802,0xd19a6a0e),LL(0x9ac38a98,0x701bcf92),LL(0xae1c0504,0xd6247bc1),LL(0x90bada7a,0x7a406e08),LL(0xcc3c49ab,0x75a3d1ac),L_(0x00000089), LL(0x5dcf7e44,0x5f7352bf),LL(0x2b674d19,0x0ee31d4e),LL(0x35a3e68d,0x92916c56),LL(0x5e153a5d,0x1bbba324),LL(0xa3d55e06,0x27d3691c),LL(0x74f6e553,0xa9153a98),LL(0x2c8a7473,0x6e737b68),LL(0x545acbac,0x0b3ed514),L_(0x00000035),
+ LL(0x892f8bd1,0x31776371),LL(0x6c0b1d4f,0x60a2c8b1),LL(0x9a688a19,0xa0d12ea4),LL(0x56eef3ec,0x4746c345),LL(0x90c83381,0x842db71e),LL(0x3fdb8d8b,0x1bf4ae9e),LL(0xbc576b9b,0x9e0ee706),LL(0x85a8de64,0x3528254e),L_(0x000000e8), LL(0x3c32799b,0x25980592),LL(0xc4760975,0x76f95241),LL(0xd6c8d637,0xdd3d3b18),LL(0x677dee0d,0xe5bceafa),LL(0x12ad9334,0x7ca46478),LL(0x3990ceb2,0x94d56dac),LL(0x39d6e555,0x8e338deb),LL(0x7a9d83d7,0x33dbf96c),L_(0x0000013e),
+},
+/* digit=61 base_pwr=2^305 */
+{
+ LL(0x52d7b490,0x4215e0ae),LL(0x3a781f13,0x84df8cb3),LL(0xaf858985,0xc3ab10bf),LL(0x449e13a9,0xea1a4d65),LL(0xb859368b,0x2c8134df),LL(0xb51fd78c,0xa7d94439),LL(0x4b1e6f5b,0x003f1c75),LL(0x4cf5d47b,0x6428ed46),L_(0x00000029), LL(0x6dc28640,0xd6597a8e),LL(0xe3d2ac15,0xe5e853fb),LL(0x8bd192da,0xf804c989),LL(0x76032d13,0xdb66ee3c),LL(0x738d5e8b,0x349bcb16),LL(0xe16c7ea1,0xe4001679),LL(0xd22ec201,0x82f1f584),LL(0xd9f317a9,0xb67757b7),L_(0x00000079),
+ LL(0xec0a67f0,0x2efbca10),LL(0x3767ee14,0xcc433a34),LL(0x68131944,0x370f6b9e),LL(0x36fcc884,0xb4d1b5e8),LL(0x85328231,0x85b956e6),LL(0x3e4b895d,0x17afd7ce),LL(0x23cd96a1,0xfc28a48e),LL(0x6cbf1cc4,0xfc04d775),L_(0x00000125), LL(0x5cc45bb9,0x4201b856),LL(0xbec2c277,0xb4f52020),LL(0xcd76ab62,0x3aabda65),LL(0x2fb221ac,0xd348e9ae),LL(0xb7ba962f,0x81d5e875),LL(0xacdde7c3,0x8ae119ed),LL(0x7186eb96,0xd5b495d5),LL(0xdf795bd0,0x1bbdd56f),L_(0x0000011a),
+ LL(0xabe42367,0x83477d80),LL(0xae655393,0x9bf84781),LL(0xf1389d3f,0x50d527ea),LL(0x02ffac63,0x30005241),LL(0x5a3b0583,0x332af83e),LL(0x30a51cf3,0xd633aac0),LL(0x7e87b5f6,0x6133508c),LL(0x54cf5544,0xae4be94e),L_(0x00000153), LL(0x79f352eb,0x3d5e304a),LL(0xc8a8525e,0x673478be),LL(0xcd082890,0x65272acf),LL(0x6528a7ef,0x07746b44),LL(0x6120a7a6,0xaa126f2d),LL(0xed8dc8aa,0x0714c411),LL(0x242ecc1e,0x09219322),LL(0x4dd29b99,0xf4c3776f),L_(0x000001bb),
+ LL(0x9d1e3e79,0x6e1c349e),LL(0x7cb862d6,0x411c782a),LL(0x774f6f73,0xf914b067),LL(0xd88b7029,0xbe145ff3),LL(0x68ac9342,0x0730a2fc),LL(0x77dcfba1,0x7ace014c),LL(0xe34f0621,0x876ebecf),LL(0xb7a85b90,0xa9ebdf04),L_(0x0000005e), LL(0x2be45d39,0x2af68cfe),LL(0xeda14612,0xbeab553a),LL(0xc8cf47bb,0x185338ec),LL(0x9f26575d,0xbcf5707a),LL(0x2dafc93e,0x9b4f2615),LL(0x85006b56,0x1c517096),LL(0x58e4408a,0x2759575a),LL(0xa451b6b3,0x3b494d43),L_(0x000001b3),
+ LL(0x64081168,0x9fca1732),LL(0x9e2e68b9,0xc2ec6027),LL(0xbd01c53b,0xcf8e3aa9),LL(0x3c299cf0,0xc31ff566),LL(0x69a934da,0x3a869b7d),LL(0xee4c3bf3,0x17fb711a),LL(0xe353eab9,0xb5b7fc05),LL(0xd300c851,0x0ef4f1da),L_(0x00000006), LL(0x7326c782,0xf868e4b0),LL(0x7616e981,0x9cbec832),LL(0x0d0b19fb,0x0355a1b8),LL(0x7504ef78,0x9b3d9f50),LL(0x75e429da,0x0924def0),LL(0x130ecd97,0x07187605),LL(0x844d6f96,0x7c14ae9f),LL(0x8921d3a7,0xccff1a1b),L_(0x0000016c),
+ LL(0x9415e0cc,0xdd321662),LL(0x7be013aa,0xad261af9),LL(0x46c47707,0xedc263d9),LL(0xabc20130,0x2f265a39),LL(0xe142f5b7,0xcfeec142),LL(0x90dba064,0xa08536a7),LL(0x488a0175,0x6d419631),LL(0xcf748207,0xe8415c3f),L_(0x000000dd), LL(0x6def509f,0x7ce6774c),LL(0x4af30ccf,0x09bc7469),LL(0x3bf7cbb3,0x12464f68),LL(0x648dc8e6,0x93c3b96f),LL(0xb39085a1,0x1000d207),LL(0xe4a3e7cf,0xcb93a762),LL(0x39e62f3d,0x08cde0be),LL(0xd6284f5b,0x8545da92),L_(0x000000b3),
+ LL(0x4fd9fb1f,0x0a484ffb),LL(0x4a91b446,0x5c5120d6),LL(0xcfe786b3,0x521a227a),LL(0x1f347861,0xb4d52b1b),LL(0x005afae4,0x28a0b22b),LL(0xaed64316,0x96565ad0),LL(0xcf8e1f9b,0x3bd3818c),LL(0xd717a7fd,0xea3705d7),L_(0x0000019d), LL(0x17132d83,0x4d75e2a9),LL(0xf9bc8f55,0xbaf9947b),LL(0x91f937e7,0xcb9bb75f),LL(0x232e92ab,0x4c1c8f93),LL(0x92cbf962,0x90cd09cd),LL(0xf2dcee1e,0x07dbfe55),LL(0xb89e680d,0xc41cd340),LL(0x51007568,0xa6275fb3),L_(0x000001e0),
+ LL(0xb831eea8,0x9b33eda2),LL(0xdd1ac75a,0xccb42fd2),LL(0xe55769fc,0xa865ab8f),LL(0x2ea2c9e4,0xc60208ee),LL(0x28effb93,0x321dff3f),LL(0x2d6b1522,0x5124fb78),LL(0x6e29dc3e,0x4cf961e9),LL(0x2f39193c,0x554efa6d),L_(0x000000ca), LL(0x035e63b7,0x67da851f),LL(0x7e9f39d6,0x7183aa79),LL(0xe886c75f,0x4aa59f9f),LL(0x6d9e6857,0x706045d9),LL(0x2ee25277,0xb18ceb8f),LL(0xe4bcaa94,0x5bc3971a),LL(0x57fc8f0d,0x7b7b6081),LL(0xdd642848,0x2e8f2150),L_(0x000001c6),
+ LL(0x44c8a327,0x1f4b8713),LL(0xa7ee221a,0x5258be1d),LL(0xe41af48e,0xa737a8cd),LL(0x83aeee1c,0x3f320ac3),LL(0xbb3a2bdf,0x8abc18a8),LL(0x2bfe7f09,0x9da43962),LL(0x5ab55046,0x1318b08d),LL(0xc7f6a7c8,0x4ae4a0c2),L_(0x000001fe), LL(0x072464c5,0xe109557b),LL(0x52cb5223,0x2e18e586),LL(0xbb44cf23,0x58cf033e),LL(0x8273746f,0x9cb3f3f2),LL(0x15027b4d,0x0badc23f),LL(0x03dd0534,0xebde0563),LL(0x94ef00b2,0xf31a2a6f),LL(0x88f86782,0x089879e2),L_(0x000001cb),
+ LL(0x5644a483,0x012e151c),LL(0xec46d8f5,0xcb60c92d),LL(0x61f8e693,0xf704143e),LL(0x53579b44,0x06b44ecd),LL(0x98807645,0xdda8c89f),LL(0x17c64951,0xfaab400d),LL(0x2e39e25a,0x16b86130),LL(0xfef9c912,0x627a2e4f),L_(0x000000ad), LL(0xd2367ca5,0xf18ebddc),LL(0xbcf685ba,0x59f6d4cf),LL(0xe159807e,0x8c3c8195),LL(0x2bb8d624,0x02e20259),LL(0x3ad24a15,0x5eef3266),LL(0xe9a952f5,0xc8d0e08e),LL(0x37d37845,0x4cf4addb),LL(0x778df76b,0x420c462e),L_(0x0000004a),
+ LL(0x55047df4,0xa605ea07),LL(0x579060a2,0x728d81cf),LL(0x3b8900fa,0x1ccc1e61),LL(0xf49f8c7a,0xd633ce10),LL(0x4957105f,0xe467c698),LL(0xc3e2024e,0xa14d0dd3),LL(0xe7cc2be3,0xc90176ba),LL(0x00090c73,0x28835ef8),L_(0x000000f4), LL(0x39d8bbe5,0x229fde87),LL(0x1982808c,0x9d5d0ade),LL(0xb83a93a2,0x56715396),LL(0x4130f493,0xf5d0d1b5),LL(0xc39ee248,0xcbf57700),LL(0x0662cf56,0xf41ee620),LL(0x121da851,0x2397e72c),LL(0x1ab413bf,0x6c00ad7e),L_(0x000001f2),
+ LL(0xbdd73dc1,0x1f7a793b),LL(0x7252dfce,0xb3c777ad),LL(0x1ad25f35,0xd306f90f),LL(0x314c1227,0x4538596b),LL(0x28e31145,0x15f73822),LL(0x1808f8a9,0x5e4847ef),LL(0x6eb8175d,0x9d57409f),LL(0x2ae642ae,0x19b0b71d),L_(0x000001bb), LL(0x3f28e667,0xa45a1d7d),LL(0x84954816,0xe5f147ca),LL(0xccfb8bd1,0xcd78f915),LL(0x9a693642,0xb02b310f),LL(0xb6cb5362,0x1f01047b),LL(0x7529c74d,0x81d1fb13),LL(0xdf4ae21d,0x80b9dd94),LL(0x6a1afeec,0xd7840bbc),L_(0x000000db),
+ LL(0xc0abf15f,0x81d957db),LL(0x65ae7f67,0xe0fe8725),LL(0x40e4566b,0x7c42febe),LL(0x6340b7ff,0xcf060fa6),LL(0xea1d2782,0x9a689bd9),LL(0xb66eed98,0xc45b992d),LL(0x8f5646a0,0x969dc412),LL(0xd272048a,0xf48e06d2),L_(0x000000f7), LL(0x50900d7f,0x701c6e38),LL(0xaad1803d,0x92065d64),LL(0xf9668fa4,0x361ef75c),LL(0xfcc216b4,0x962eb248),LL(0x575be56a,0x89b9828a),LL(0xfde9ba30,0x202a575f),LL(0xc435f2ce,0xba3890aa),LL(0xf83734f6,0x4860b39a),L_(0x00000180),
+ LL(0x3ede16d4,0xa59cdc00),LL(0xd0de9f29,0x9f3b7991),LL(0xda7b6269,0x832ec0d2),LL(0xf2e16e2b,0xa8e7c828),LL(0xd0c41727,0x7f0878f9),LL(0xc4546447,0x7356692c),LL(0xc4af90b2,0x5fbe130e),LL(0xaa2e9ec4,0x17691590),L_(0x000001bb), LL(0x0074a183,0x16d0ccbe),LL(0x351544e0,0xf7b675ff),LL(0xf37d43c1,0x87055e7e),LL(0xc371f0a0,0x3e668989),LL(0xefcfca1d,0x8323227b),LL(0x36507d20,0x38f76084),LL(0x25498782,0x75a23d95),LL(0xacb8cb75,0x40481354),L_(0x00000151),
+ LL(0x20886bbb,0x9a6dec74),LL(0x296f5cd9,0xfd24a18e),LL(0x6092fe28,0xbb4a7907),LL(0xdeab539d,0x869a8ccb),LL(0x67f524d1,0x61521c17),LL(0xbbe3aaa1,0x5f79a2c2),LL(0x8be17e72,0x7d8ce0cb),LL(0x647da5af,0xf36cb2d8),L_(0x0000003a), LL(0x0f2ab363,0x6d93da70),LL(0xdfde9d3e,0xa76d10f8),LL(0xe72ce040,0x17308d11),LL(0x075467a8,0xed2aabb3),LL(0x9aa69a1d,0xc10f78d3),LL(0x4caac399,0x13d4d378),LL(0x7e54c473,0xda4d8f8d),LL(0x911cb804,0x55d905b0),L_(0x000001aa),
+ LL(0x253f45b8,0x2af99e2d),LL(0x112b491f,0x76414d1e),LL(0x4a8e2b12,0x1c380001),LL(0xa17691a7,0xb0f6f9ff),LL(0x4bd4233a,0xcf4e764a),LL(0xccb8bd49,0x012735f0),LL(0xc7fc0714,0xf6037d3d),LL(0x3da811dd,0x4eeecae0),L_(0x00000135), LL(0xf24a8fb9,0xb39e1a42),LL(0xa3c4048e,0x07ea05b5),LL(0xd581bb93,0xfa0b7bd9),LL(0xeeb6ce36,0x8b7b8d8f),LL(0xa0329bb2,0xfcc8cab6),LL(0x5c44e608,0x04c03b08),LL(0x3f2c4c95,0x51593cce),LL(0xb2ef5a3d,0xa645193b),L_(0x000000c1),
+},
+/* digit=62 base_pwr=2^310 */
+{
+ LL(0x052a5d7a,0xbd77fdcc),LL(0x91e67c5a,0x7ae80845),LL(0x30c17511,0x4fb64810),LL(0x92e55b53,0x6c21b31f),LL(0x96bd1eba,0x4d056aef),LL(0x3bd89651,0xf597cfd9),LL(0x39ce9f5d,0x10c4de29),LL(0x6737cbaf,0xca8494ef),L_(0x0000005f), LL(0x726ccf17,0xa070d7b2),LL(0xef8a249b,0x33084cb0),LL(0xfece71d7,0xdbf18fa7),LL(0xf11b328d,0x8e7f8fe7),LL(0xdb8c5b89,0xc5842d33),LL(0x38ef699b,0x44b71419),LL(0x619477d9,0xcd39a13d),LL(0x28db36f5,0x6954dd52),L_(0x000001eb),
+ LL(0xae5a71e3,0x160db974),LL(0xb267126a,0x4df55ba5),LL(0xf2bfd214,0xcf291fe0),LL(0xe4215d39,0x3dc0a627),LL(0x8849498b,0xfec311ed),LL(0x5b220c7d,0x9fbb5099),LL(0xa3d83cc2,0xc55f9ca4),LL(0x32f62dd6,0xa473d853),L_(0x0000012b), LL(0xe73278db,0xcaebf5d4),LL(0x38b01c56,0xe4ab979b),LL(0x7e210f66,0xfe305e1e),LL(0x00e35bf7,0xbbd247e8),LL(0xf41625bd,0x64eabbca),LL(0xb3c01407,0xe49d3fb6),LL(0xc31a840a,0x6ebed09d),LL(0x6c67185e,0xd891e44a),L_(0x000000d3),
+ LL(0xeea3bb5d,0xa7efe273),LL(0x382ccbad,0x1d1fd154),LL(0x321aecf3,0xba4c80f8),LL(0x3a3eb329,0x44874ee5),LL(0xfc744e55,0xc89ec973),LL(0xd83775b1,0x9ac52665),LL(0x7c8cecd7,0xe149472e),LL(0xffa02e1a,0xabeedb19),L_(0x00000188), LL(0x4863bc6f,0x5e342dcd),LL(0x30b568ee,0xba377da7),LL(0x61a3cd5a,0xdb7394c9),LL(0x7e13d011,0x655ca62a),LL(0x531b03ef,0x687df8b5),LL(0xa07d97a8,0xc1cc63e0),LL(0xc3579f84,0x4f51c0a2),LL(0x1f68d107,0x8b2a0959),L_(0x00000021),
+ LL(0x73976185,0x5ac29ab9),LL(0x1049200d,0x5376ef50),LL(0xb7cabe96,0xb29fcfde),LL(0x2ebeaa6e,0x849702e8),LL(0x9856863e,0xd5820c1d),LL(0xadb32b7d,0x0b85b8b6),LL(0xcb2a1da8,0x4ecc2beb),LL(0x911240a2,0xb6f1d1cb),L_(0x0000019d), LL(0x8e9339d6,0x65738f28),LL(0xc9389868,0xec9ab31a),LL(0xb78b477c,0xb756dfc0),LL(0x2531d4c9,0x2bea7bd2),LL(0xa957b1f7,0x19668750),LL(0xb7acf908,0x23544082),LL(0xfa97aa90,0xd310dd35),LL(0x7c9376d4,0xe3e85065),L_(0x000000c8),
+ LL(0xe690991e,0xb53d0f3e),LL(0x7a8ed401,0xe7688a48),LL(0xc975d343,0x0a163c7f),LL(0xbbe320a1,0x3c38f3b4),LL(0x637ba641,0x0cc94ae6),LL(0x2fa7a438,0xf036a2cd),LL(0x85cf8f8c,0xdd8d3d2d),LL(0xf3dec45f,0x83f293f7),L_(0x00000007), LL(0x0fc0fe23,0xf9f35894),LL(0x22cf1f3c,0x5367a382),LL(0x0a85bdb7,0xa486155c),LL(0x43d0dc60,0xa045fb49),LL(0x28e031ef,0x239e6d10),LL(0xbc646dab,0xf3c58cd8),LL(0x37a252ad,0xa190c29a),LL(0x729ace13,0xafb3edde),L_(0x00000004),
+ LL(0x2c2d00f5,0x309124ad),LL(0x92f17a73,0x90896f6d),LL(0xd107aa3f,0x6655b0bf),LL(0x28ed385a,0x4393b8b0),LL(0x64efc785,0xa72dcb01),LL(0xdc6d4959,0xedcf6e0d),LL(0xad09fb16,0xa138cb63),LL(0x5a264a29,0x9242e638),L_(0x00000154), LL(0x23fa857e,0xa4afca8f),LL(0x362d992a,0x4718e360),LL(0xe0e7ef99,0x51da204d),LL(0x0a263a3e,0x76d92100),LL(0xc54159bd,0xb90bd792),LL(0x6992a7d6,0x2d4d5792),LL(0x34429060,0xea9796c5),LL(0x2d91640d,0x11109304),L_(0x00000023),
+ LL(0x69a4e57c,0xd8256cea),LL(0x1bf79944,0x4d134e77),LL(0x4e8b215e,0x63a4641d),LL(0x83621b34,0x8da5f102),LL(0x530939c0,0x9d6baa6f),LL(0x78356025,0x0a919eb7),LL(0x9cebfe30,0x523c04c9),LL(0xba70fc3b,0x06c24660),L_(0x000001b0), LL(0xb404acda,0xbeff381e),LL(0xf36c4399,0xc6bfdda5),LL(0x193ff430,0xddaf4961),LL(0x43e642a9,0x86bb6b08),LL(0x4ebe4623,0xd3326377),LL(0x8dc4af24,0x33ce6709),LL(0xb168c749,0x3757e6ab),LL(0x451bf0a9,0xdd6738f7),L_(0x00000114),
+ LL(0x95d393a7,0x15af1e76),LL(0x09f6c873,0x5dad48c9),LL(0x168b010a,0x03c65a7e),LL(0xd86fdc56,0x73f51c26),LL(0x88f52d53,0x697c8b7d),LL(0xbc64a497,0x670982de),LL(0xaf7a0676,0x809f942a),LL(0xb15cc57a,0x593420be),L_(0x000001c2), LL(0x71728397,0xf5563ef9),LL(0x305f3c8f,0x4e73a2dd),LL(0xa80ae4a1,0x828cc516),LL(0x2258160b,0xe74db735),LL(0x108533e6,0x14ad6801),LL(0x3b320283,0x541598a0),LL(0x763ab107,0x56c3d815),LL(0xf632644f,0x8ad49089),L_(0x000001fa),
+ LL(0x3fb5de8b,0x8bc4deb0),LL(0x8d93c4e8,0x1e8e7ab9),LL(0x3dd24d9d,0x201baf56),LL(0xcada68d7,0x0a384ece),LL(0x503d4f19,0x5dcc59f7),LL(0x6763d7ad,0x7849c18f),LL(0xc66f3753,0x6951161c),LL(0xfc052118,0x74242704),L_(0x000000c6), LL(0x90fd23ab,0xfbb20d46),LL(0xd8a0eeac,0xd979406d),LL(0x508b0789,0xeb2d48ad),LL(0x8cad1e65,0x2f16458c),LL(0x7615ee48,0x8941144f),LL(0x2d4a611a,0x57baf847),LL(0x706729a1,0x04864e43),LL(0x13b7d8ff,0xa2cca9c9),L_(0x0000001f),
+ LL(0x6b13d691,0x15c5966e),LL(0x5adf4806,0xe79886a9),LL(0xb44e7b28,0xc0149ae3),LL(0x14ea5297,0x3f2176d8),LL(0xd637170e,0x3d5f7f20),LL(0xfd66e46a,0x5f76d12c),LL(0x998ccf72,0x8fbfc2d6),LL(0xc2738301,0xc299587b),L_(0x00000093), LL(0x48202d24,0x5d1ab080),LL(0x22169c9a,0xf44f3ef3),LL(0x4f9cc0b4,0x5a6ea1fc),LL(0xd8a38b0c,0x1e3f8f7c),LL(0xfc2a4b0f,0x2f6b7ea1),LL(0x85236ace,0x7c4797d9),LL(0x507ad976,0x30db4704),LL(0x70b62118,0x15efb0d0),L_(0x000000f2),
+ LL(0xa8e006d6,0xa8350ceb),LL(0x0b5d40f6,0xd0476f3e),LL(0x7d6beb64,0x8a7277db),LL(0x9a1052c1,0xb78ba330),LL(0x6fb67a25,0xa921f295),LL(0x937d5f7f,0x58e2fb78),LL(0xb3c5ee8b,0x224a8a6c),LL(0x3ba51856,0xdd623558),L_(0x0000004f), LL(0x472c8eee,0x46bd4fc5),LL(0xd6bbe5d7,0xbccb9c2d),LL(0x8704f8a7,0xd4145962),LL(0xf0c09b77,0xe9ce9fc8),LL(0xe24e89e3,0x091189c9),LL(0x34dfd23c,0xa0008822),LL(0xddeaf170,0x43b08954),LL(0xe569f253,0x867e76b2),L_(0x00000020),
+ LL(0x21969535,0xd200f675),LL(0x1aa95306,0x8a20dfb4),LL(0x450070d5,0xe56ecbdc),LL(0xa73c2aa2,0x93697944),LL(0x8cf15e09,0x2bf1cc5f),LL(0xb81e3982,0xa98dee98),LL(0x39d2614b,0x4249763f),LL(0x88bf80d0,0xdc125dce),L_(0x00000041), LL(0xea90be49,0xeb5f7526),LL(0x9d76e09e,0x42892f62),LL(0x665e7661,0xdd2de6b9),LL(0xdb45bef0,0xe66edde4),LL(0x0f0c29ed,0xd947a3fe),LL(0x39bccdcb,0xdc0bb667),LL(0x97600929,0xeeaa185f),LL(0xf355b62f,0x29e7ad98),L_(0x00000083),
+ LL(0xc2d3d21b,0xbe07feb4),LL(0x9e1d3138,0x90b99ecf),LL(0x358fe997,0x2ec0a3d5),LL(0x95008edf,0x7f72a6c8),LL(0xc6e6cc84,0x2b8ec523),LL(0x351d40b6,0x10aa3646),LL(0x30961dc3,0xdff38b1a),LL(0x6d776cf7,0xc458ba47),L_(0x0000000a), LL(0xfce248cf,0xad217997),LL(0xe663a7a1,0x423b10cc),LL(0x8d65dc51,0x0215b195),LL(0x0f10bc35,0x0f4e07a2),LL(0x23278029,0x19d23499),LL(0x304b98d9,0x6127a2da),LL(0x9fb0c81f,0xed0c0943),LL(0xcd486835,0x4d63eec4),L_(0x0000015f),
+ LL(0xd0ac0ecd,0xbaefab89),LL(0x0a9db571,0xe4775843),LL(0x6c283a9c,0xfebcf91f),LL(0xd37751b1,0xe02d1251),LL(0x4c69aef4,0x93ca62f3),LL(0x756b2ab1,0x017751a3),LL(0x9921e7da,0xf0df5f26),LL(0x31fbf868,0xc6385112),L_(0x0000015e), LL(0xc24912f9,0x6ce422f4),LL(0xe5bc3bbe,0x0c518f2e),LL(0x00e5a237,0x51ed5f7e),LL(0xb6da428f,0x1a77cbdb),LL(0x248c6951,0x086ad3a0),LL(0xfd285428,0x00d65807),LL(0x460a5bc1,0xc6265db2),LL(0x728547e4,0x8fcc39fe),L_(0x0000002a),
+ LL(0xcdbb56b7,0xea484f2e),LL(0xebecf09a,0xbe1705e2),LL(0xdc0d7050,0xe83a83b6),LL(0x5c8fdff7,0x1cd41a57),LL(0x58f038ee,0x975aeb28),LL(0x858f75ce,0xddbb66ee),LL(0x7455106f,0x7e1bcafd),LL(0x54e1961f,0x1e151b28),L_(0x0000006f), LL(0xc329e633,0x32cfb8ca),LL(0x596dc91e,0xe8fb4aa3),LL(0x19c60dcd,0x0c27fe63),LL(0x9c2411d9,0x49228e82),LL(0xf4420f99,0x5075f5a2),LL(0x38a95326,0xadb26b0e),LL(0x7345059b,0x67709e35),LL(0x428212fb,0xa6804139),L_(0x000001a5),
+ LL(0x3a95d178,0xb909e614),LL(0x1860388a,0x89b7600c),LL(0x942112c1,0xa080f4aa),LL(0x5a1967f7,0x5057c08b),LL(0x13543a0e,0xf9ac78fd),LL(0x1598cafb,0x9408a20a),LL(0xfa7974b4,0x8fb58bcd),LL(0x17ad4e19,0xf91b6362),L_(0x000001b1), LL(0x57138c5b,0xf8960264),LL(0x185f172a,0xea9d78b2),LL(0x8652917b,0x62148231),LL(0x9b757159,0xb7470a8b),LL(0x4f2c7ae3,0x532d7747),LL(0xc96fd10f,0x6b40b8bf),LL(0x77081dbd,0xa54da232),LL(0x2cd44f13,0x0796d519),L_(0x000001ac),
+},
+/* digit=63 base_pwr=2^315 */
+{
+ LL(0xc1b5f874,0x37761e89),LL(0xc768e709,0x052402d8),LL(0xa7063fcc,0x437e0d8f),LL(0x5032ca28,0xd7049706),LL(0xe0560b81,0xfcc5af72),LL(0xdac1a63b,0xabb68cfd),LL(0xe89f3917,0x257b3b85),LL(0x80d7454a,0x28153e38),L_(0x00000088), LL(0x001d4cbe,0xe9651818),LL(0x66b1014f,0x64d65a97),LL(0x511b3639,0xd56646ec),LL(0x26e7c4e0,0xdfae8dcc),LL(0xa94ae11a,0x86e8d406),LL(0x6e9a1a68,0x47bbf4ad),LL(0x3004a685,0x13e8901b),LL(0x5981c480,0x3994bc8d),L_(0x00000179),
+ LL(0xc63223ff,0xeed01f7e),LL(0xb10c656e,0xa95759d3),LL(0xc8ceacdd,0x5f68fe9f),LL(0xb6ab8ec3,0x50e97936),LL(0x28c0b215,0xe4ccc3b9),LL(0x92be8e1d,0xfc6be17e),LL(0x20828c77,0xb81bdb63),LL(0x13352a78,0xe00699d2),L_(0x0000016f), LL(0x3d9b3c1e,0x0b5daa42),LL(0x94567b3a,0x6bf95aa5),LL(0xa3d149d4,0x8d0fbfb5),LL(0x4e997958,0x5e636b3d),LL(0xc1e08ca4,0x8fa3b11b),LL(0x73645c35,0x552e11b1),LL(0x931ab993,0x0db67bc8),LL(0xce614c5f,0x53c262d3),L_(0x0000019f),
+ LL(0xf005a100,0x9be2e7f2),LL(0x06f26644,0x47f29a13),LL(0x7b580ed9,0x3f3b60f9),LL(0x22198889,0x7e6ec70b),LL(0x9f87a7be,0xfc2d715c),LL(0xb2ebc47c,0xfc003ea3),LL(0xfa7b2218,0x79438acf),LL(0xbfd9d6c5,0x930053c2),L_(0x000000f1), LL(0xdac555ca,0x80f3c546),LL(0xe5a4dad1,0xa25a6ba7),LL(0x2d4bd9fe,0xa68cfbbf),LL(0x35faf13a,0x4e3df8bd),LL(0xcfc847de,0x8434c00b),LL(0x4dfdf245,0x40669463),LL(0x6e619d42,0x5f688c19),LL(0x13d3a517,0x9cabea4b),L_(0x000001af),
+ LL(0x3aed7148,0xbb901084),LL(0x6321bcc4,0x996ac002),LL(0x53c74ad5,0xcb634535),LL(0x741982c7,0xdc48a041),LL(0x1196d8fe,0x44c9f092),LL(0xfabc20d2,0x0a8fce97),LL(0x32828d27,0x62a6d447),LL(0xcab0c775,0xe6a8960b),L_(0x00000089), LL(0x3a61da39,0x4b749d7b),LL(0xfb5b6d67,0x9df6dae1),LL(0xec275083,0x4fd05c30),LL(0x7da1a928,0xb7bd6dae),LL(0xec82a28e,0x66cd19ba),LL(0xa08ca71d,0xd599b2c6),LL(0x6c312c52,0x5bfaa154),LL(0x6795e306,0x2d3a57f0),L_(0x00000087),
+ LL(0xe9c779ff,0x99bf4200),LL(0x2e4558d4,0xb9ba6e9a),LL(0x636dc521,0x836fe297),LL(0xa1c7e0bd,0x461d465e),LL(0xa229d229,0x287fba32),LL(0xe43c8f80,0x5fa34491),LL(0x76cbe0ad,0x0e6b8f16),LL(0x7a25d2a9,0x6221b3d0),L_(0x000001ae), LL(0xd420ce9f,0x59654147),LL(0x2c11cbe4,0x582dde44),LL(0x73168c78,0xcfbe66e7),LL(0x5f455763,0x55778942),LL(0xd782c483,0x9b69f069),LL(0xff95fe3e,0xaa1addcb),LL(0x00a4bd0b,0x47541c1d),LL(0x8ad93857,0x5c6d8f2a),L_(0x000001b8),
+ LL(0x0afff918,0x80ad064a),LL(0x89af5deb,0x7114ab96),LL(0x4dbde778,0x099fad0b),LL(0xfd29cd3c,0x525d6055),LL(0xbd379d42,0x4df50e85),LL(0xdfc116d0,0x3602e006),LL(0x374d96b5,0x2ee6c63f),LL(0x6509a7f3,0x4fb180f2),L_(0x00000115), LL(0xee822c17,0xfc039cb1),LL(0x6c2fdf58,0x5872cad5),LL(0xea665324,0x3b9e8ae0),LL(0xaf2e64bf,0xb8314c4d),LL(0xa8f96bb4,0x63c57f41),LL(0x3df990e0,0x5149d306),LL(0x1d5f9b0d,0x08ba6128),LL(0x3d6cc9c6,0x52f204ba),L_(0x000000d5),
+ LL(0x84b34c8d,0x0908a3fa),LL(0x06e343a5,0x8e41dac7),LL(0xca844102,0x83411f49),LL(0x0712aa99,0xd4bcaa5f),LL(0xf85d2ba8,0x0278367b),LL(0xbdc302b7,0x5016082b),LL(0x54ed82be,0xfea00712),LL(0x1e47617b,0x97de79a6),L_(0x000000b6), LL(0x5025ca72,0xa8a5db48),LL(0xd3c98c1a,0xeb113cc6),LL(0x259b9a28,0x1b35c6d2),LL(0x49923a55,0x266d75d3),LL(0x644a3ecc,0x9590fb6b),LL(0x221e1f1d,0xa7f663c5),LL(0x9c9bd811,0x30cacfb5),LL(0x8f25a4f3,0x459bddad),L_(0x0000017d),
+ LL(0x5c5d4a76,0x224e9112),LL(0x74621c3b,0x62ab184a),LL(0x17406495,0xedfb682a),LL(0xc3f7c8cd,0x16ae2053),LL(0xd8e38d44,0xdf044060),LL(0x39ed9c28,0x86143e57),LL(0xf327b97f,0x8b95f9f7),LL(0x53853147,0x9200a872),L_(0x000001b4), LL(0x43b98e46,0x05661b39),LL(0xc1bcc1fc,0x9ee23198),LL(0x64ff1647,0x115744fc),LL(0x0f20d871,0xcdf5ac56),LL(0x92c9feea,0x63cba9c3),LL(0xa72f70b2,0xadbac8fd),LL(0x365c71db,0x171aad35),LL(0x9d51687d,0xaa0202f9),L_(0x00000102),
+ LL(0x7242ca8b,0x45faaf9a),LL(0xc08d85f8,0x550ef4dc),LL(0xb82ff28e,0x814b8cba),LL(0xbbe121da,0x1eb4cd63),LL(0x081656e6,0x82eece40),LL(0xf4405b11,0xe9889d6a),LL(0xf6c9d001,0xbc4f3c1e),LL(0xe85dc906,0x7466fe1b),L_(0x000000f9), LL(0xbcfa56fc,0xb8894301),LL(0xa60a71ba,0xc8290de3),LL(0x5b4cf893,0xfa8203e9),LL(0xa8602943,0xb0d9fec8),LL(0x6b75b5c6,0xacaeb1bd),LL(0x40f20d5b,0x228fdb83),LL(0xe7477d37,0x967812d8),LL(0x3271b8d9,0x20f42fd0),L_(0x000001a9),
+ LL(0x69acd4ec,0x76812a69),LL(0xd47ef468,0x62f921ab),LL(0xc8ee3434,0xb7930834),LL(0xc08c033b,0x369c3e87),LL(0xee51d0a2,0xd98cac8f),LL(0xc675c1fb,0xa309b704),LL(0x3fcbb3c6,0x69a173a4),LL(0x32c49495,0x0559e094),L_(0x00000126), LL(0x2b5e781f,0x79bd3a70),LL(0x68837e34,0xd74e86eb),LL(0x22881aa5,0xecb38496),LL(0x91b89a84,0xdd2964ba),LL(0x7caeee87,0xb0230b75),LL(0x83a10f40,0x7853cadc),LL(0x465657ae,0xe45f5ad1),LL(0x100e5033,0xe6dbce75),L_(0x0000005d),
+ LL(0x27034a2f,0xae458db9),LL(0xe02cc805,0x361c4604),LL(0xc6c6e812,0xf53dab3f),LL(0xe1de7819,0xa93944c6),LL(0x77575b10,0x7d127be6),LL(0x4580ec67,0x18920ad0),LL(0x6451a6a6,0x595f7341),LL(0xe3b018ad,0x87c2f62f),L_(0x000000a8), LL(0x73fafabe,0xacea82d0),LL(0xb8e018e3,0xb66d3c1a),LL(0xf0a068d2,0xa0a76281),LL(0x2960ab23,0xd3310f1e),LL(0x1ade815c,0x5df5a459),LL(0x4830c68e,0x9bc40618),LL(0x506f8ded,0xa5b32181),LL(0xb64aea9e,0xdef4d655),L_(0x000000f4),
+ LL(0xd2e44f39,0x7f22b492),LL(0xf166288f,0x72f850db),LL(0x45a14853,0x6743ab2a),LL(0x480b82ee,0x235a84e1),LL(0xbca609c8,0x422668b9),LL(0x2f4e85d8,0x5d6f0bf0),LL(0x792321da,0x61afb880),LL(0x2c095f02,0xca3c8cb8),L_(0x00000022), LL(0xe6bc2f57,0x43f99381),LL(0x4a832e1f,0xe6089c84),LL(0x51ad7011,0x65600aa9),LL(0x2a695207,0x11447728),LL(0xa07e689c,0x7bb9a4c6),LL(0xcd7b0e53,0xdf06eaf0),LL(0x78952329,0x777c474d),LL(0x10d2b00b,0x9d539f07),L_(0x0000004b),
+ LL(0x20322841,0x736265c0),LL(0x91a20b69,0x7c956777),LL(0x530024a3,0xbcd4358f),LL(0x2cfdf5c4,0xe32fe9e3),LL(0x69c3c240,0x7dd472b9),LL(0x16947a8a,0xeeaaeb78),LL(0x03c5cf25,0x9aa3433d),LL(0x521f3b6b,0xf3a8ba18),L_(0x00000085), LL(0x88ddc3b1,0x00a93570),LL(0xc5b29c7d,0x5d8a1581),LL(0xb3793bd2,0x1877f26e),LL(0x4435f13a,0x4fc7c6c4),LL(0x5b6c76af,0xb032ee18),LL(0x5465338c,0xd7e32969),LL(0x5e8d0f72,0x82259fe6),LL(0x38f0d401,0xe8265e82),L_(0x0000012d),
+ LL(0x8093c8e0,0x248ef981),LL(0x84b971a4,0x5353d713),LL(0x8ab8dd10,0xf3f56422),LL(0x9e95615c,0x163427ee),LL(0x1dbed91f,0x7cd8d83e),LL(0xa05bff8c,0x2a117b26),LL(0x9094b7c0,0x28d65130),LL(0x8d73f3a7,0x75d255fa),L_(0x0000015d), LL(0xfb45cf4f,0x5dd01b3b),LL(0xa983b69a,0xe3b24278),LL(0xdda15e64,0x0beba6e8),LL(0xeabdafeb,0xce3cbe7c),LL(0xe28dd1f4,0x03c3a01e),LL(0x315483c0,0x286b68f0),LL(0x44cc13c4,0x653661bd),LL(0xa5a2b18a,0x8d8536d7),L_(0x0000007f),
+ LL(0xf83ea93b,0xc7a428c9),LL(0x308d0ccb,0xdeef06fc),LL(0xe456dad3,0xd27b9dce),LL(0x04dd575c,0x8c1bbcfc),LL(0x1c63319a,0x479f6f73),LL(0xed4daaeb,0x7cb52d7f),LL(0x9fe5930e,0xd171cdbc),LL(0xcd65b54d,0xf8449b00),L_(0x00000106), LL(0xbb8079a0,0x2ea98b08),LL(0xda724133,0x24b7505e),LL(0xedf1d97e,0x5aed5e6f),LL(0x283c1e51,0xc39ad307),LL(0xf64812a4,0x76820a6c),LL(0x13b5c88a,0xb32f91ce),LL(0xb8954a33,0x211cbd9c),LL(0x31a311e0,0x72994cae),L_(0x000001f3),
+ LL(0x3ef4f2d2,0xcf466ff0),LL(0x47044584,0x78dc82b8),LL(0xb52d320e,0x8b5110dc),LL(0xdfe140d7,0xe07b117a),LL(0x0b45fd46,0x39af6581),LL(0xbda19439,0x26b6d5c5),LL(0x8309f53f,0x8091095a),LL(0xaad23c7d,0xb35060d4),L_(0x000001f0), LL(0x90dd82bc,0x1ee78b60),LL(0x839c5155,0x453fc776),LL(0x2966b875,0x6bf1d026),LL(0x9e2a2996,0x825d3c72),LL(0x48c49cfc,0x1345ab1d),LL(0xad600996,0x7e6049f3),LL(0xf1b39850,0x0b007da4),LL(0x2c8f36cb,0xcf942c38),L_(0x00000153),
+},
+/* digit=64 base_pwr=2^320 */
+{
+ LL(0xeba284c6,0xdcd5cc91),LL(0x292fa3ee,0xea471fd6),LL(0x5841cc32,0x9fb23a12),LL(0x35810a74,0x4e18eb2e),LL(0xd6133648,0x5228a2bf),LL(0x52cab6f6,0x07542e74),LL(0x40c74692,0x62526cd9),LL(0x36b9b329,0xc8dbbd29),L_(0x00000120), LL(0x17573e4f,0xca996c2a),LL(0xc3d42418,0x33e1f9c1),LL(0x970fbd47,0x246b3cbf),LL(0x8c0b1561,0xf0853508),LL(0x16e93234,0x8ff90188),LL(0x74d99d7f,0xaa556f85),LL(0xd3b1d290,0xdda5d989),LL(0xab78218e,0x7de54ed0),L_(0x0000000c),
+ LL(0x87233d65,0x32cea9ff),LL(0xb1454f2b,0x6963e65d),LL(0xd5f2627e,0xd15b05b7),LL(0x68cad15b,0xf2c9215a),LL(0xf9679cfe,0x982da4ec),LL(0xdd21cc1f,0x73910763),LL(0x3925aff6,0xce110fdc),LL(0xad0858b1,0x0efaca3c),L_(0x000000ae), LL(0x160c51bf,0x88f58f75),LL(0x9e39ee8b,0x713a7cf3),LL(0x5af813ed,0x8ac4ac36),LL(0xa788e43e,0xe789c040),LL(0xc10b5e01,0x3d0cb49e),LL(0x26fdddf3,0x3f2d9bd7),LL(0x504e525a,0x776e3c30),LL(0xa456acdf,0xf6acce51),L_(0x000001b6),
+ LL(0x23707d7d,0x4b6d85bc),LL(0x2372ec00,0x4b483dd7),LL(0x838f63c9,0x869b15c9),LL(0x40b6584e,0x291644dd),LL(0x05bb5ad6,0x693ec1c9),LL(0xc10969be,0xb5c6018d),LL(0xb81150c7,0x04c9c113),LL(0xbd460de8,0x933a940b),L_(0x0000014c), LL(0x5ad558a1,0xa356589b),LL(0xf88e046d,0xf093ea9c),LL(0xede9de0f,0x39acd54e),LL(0x19ec3f88,0xfcbf451f),LL(0x44ec243f,0xf8b02c0e),LL(0x981fd0d1,0x42d2cc07),LL(0xf4701bca,0x3f363b43),LL(0x30f2e9e4,0x2eafb7f9),L_(0x00000170),
+ LL(0x006b0772,0xa8c7c3d7),LL(0x1ba3ff28,0xc1d96b23),LL(0xc17a4f5f,0xda50f432),LL(0xca88f653,0xfce5ef14),LL(0x31ac5da9,0xd10257bb),LL(0x18d3105d,0x06b910de),LL(0x4f950082,0x8ed121d6),LL(0x748b9a29,0xeb08be83),L_(0x000001b3), LL(0xfedc9456,0xcda193af),LL(0x30addb34,0xf39dff50),LL(0xa3a58a0d,0x586d72c1),LL(0xd7c02e84,0x7190f71a),LL(0xb6dddddd,0xd7f7815a),LL(0x93fd431d,0xb059af28),LL(0xdb90a301,0x626d66eb),LL(0xb55b2545,0xa7c95ac5),L_(0x00000015),
+ LL(0x02a70327,0x60173b4c),LL(0x700e187b,0x853a0c8b),LL(0xebfa5d41,0xa74d3fcb),LL(0x6636a248,0x7f152910),LL(0xcd439df1,0x433bf866),LL(0x3d361a48,0xd52b92a9),LL(0x96508fce,0xcdde5dbf),LL(0x08fb48db,0x4598b64c),L_(0x000000ab), LL(0x41e6d707,0xa287bad7),LL(0xc1d0199a,0xaca83d8b),LL(0x3248272c,0xdeea6deb),LL(0x81490886,0xd5830e62),LL(0x803b3e7e,0x0b551501),LL(0x329bb8f5,0xe61ae410),LL(0x1b1ec67e,0x2add209b),LL(0x9d8f057d,0xac0fb9f7),L_(0x000000af),
+ LL(0x159240ac,0x701cba0d),LL(0xbe49e9de,0x1e2030d5),LL(0xa8d80ea6,0x891f5b9f),LL(0x389aa0a7,0x281d5c9e),LL(0xbf08f46a,0x42c2a6a9),LL(0x30133d89,0xcae5c626),LL(0x26d80fbd,0x976ed6f2),LL(0xd7445273,0xdd69ee7c),L_(0x00000095), LL(0x4b64112e,0x1ba10f05),LL(0x3c715556,0x076de398),LL(0x051c721c,0x1b6338a0),LL(0xed93ec2b,0x0b18e617),LL(0xe40d08e3,0x2546a805),LL(0x39d986d0,0x289546bf),LL(0x87fe36cb,0xcb29a40d),LL(0x28ca6d96,0xcb42c038),L_(0x000001d7),
+ LL(0xb8888aaa,0xeb89b8a3),LL(0x504b24ba,0x13c31ce0),LL(0x1577d88f,0x1d308489),LL(0x01541da0,0xc31edb15),LL(0xfbe18906,0xcb88a0c0),LL(0xb123cf8a,0xe0a54814),LL(0xce17eb8d,0x12d30b10),LL(0x5435ad11,0x16c373c6),L_(0x000001e1), LL(0x7a3c3081,0x198cbd6e),LL(0x18481bd1,0x9feff602),LL(0x8a4e33b7,0x4dc9559a),LL(0x242155d3,0x49b265ae),LL(0x0458dbdb,0x66003375),LL(0x19c33688,0x53753ede),LL(0xac09e0c8,0x0eb6969a),LL(0x25b27567,0xc165da52),L_(0x000001ad),
+ LL(0xfd4c030e,0x4bb182d8),LL(0x45ba7b8e,0x24d5733c),LL(0x9bbae322,0x857e0992),LL(0xe18395c5,0x7a4b7ec5),LL(0xbbeb3431,0x9d2ffacf),LL(0x70996597,0x0dac7ff4),LL(0x634b33c0,0xd22ac181),LL(0x5a113dab,0xb7220b32),L_(0x00000027), LL(0x1af6d0b4,0x4b60b5e3),LL(0x60067ebd,0x7c6c236a),LL(0xccf47b3d,0x199b1be8),LL(0x1dbd1cc7,0xe888eba2),LL(0xb4932466,0x034c21f8),LL(0x19ff1dee,0xf9da1696),LL(0xe040c95f,0xee7e95c7),LL(0x9dbe56ef,0x308a2b5a),L_(0x00000094),
+ LL(0x33a41f31,0xb89596d6),LL(0xde8f6d08,0x36e37e25),LL(0x09152867,0x911d84ea),LL(0x4f3476b2,0xba9def4c),LL(0x44e0d519,0x12065979),LL(0xdfef8c30,0x91c87d28),LL(0xa45cf33c,0x6b8dd103),LL(0x5a48975d,0x7c11f3b7),L_(0x000001e4), LL(0xe73885a7,0x36da50e9),LL(0xdc731cf5,0xb97f8cf8),LL(0x67bb07a8,0x922b0be5),LL(0xfb414a3b,0xe9cbd504),LL(0xd391785e,0x2631b899),LL(0x9eb65672,0x50f31f7b),LL(0x4ee45215,0x0d4d0798),LL(0x23e25b24,0x83771e39),L_(0x00000062),
+ LL(0x6178bac5,0x9eabc3c5),LL(0xbfa39955,0x503d57c5),LL(0xda006222,0x8e465ace),LL(0xe390a3d7,0x363ca671),LL(0x7ca51f49,0xe0376d27),LL(0xab1c9afc,0x325dbeb1),LL(0xf303951f,0x2ac46079),LL(0x4fcc04e4,0xe25bdab1),L_(0x00000049), LL(0x1e1f126b,0x7a1f14f0),LL(0x0b9e64fc,0x49fb5176),LL(0x394e56b2,0xc1fff51a),LL(0x0b50d33b,0xf135bc4a),LL(0x41e4f563,0xf07911e8),LL(0x0008c3a8,0xfd1855b2),LL(0xd0455066,0xb1f8cdf1),LL(0x3e4e10b9,0xb720d66c),L_(0x00000140),
+ LL(0x47688773,0x75ef0188),LL(0x81134439,0x6a21abe0),LL(0x3ff532d6,0x9e0177ad),LL(0x3c27f56d,0xe284df24),LL(0xd99892e8,0xfcaf2cd5),LL(0x668c2ac2,0x72c31d05),LL(0x450ea985,0x617df772),LL(0xd1386608,0xffb181fb),L_(0x00000007), LL(0xa81bbd89,0xb7cb40e7),LL(0x6545e4d7,0x4e799290),LL(0x48c0ef0c,0x129414b6),LL(0xf9bc6b77,0x75cac719),LL(0xcf3cf61a,0x7090a084),LL(0x5de671da,0x573167fe),LL(0x53c2428e,0x9be66bcd),LL(0x581cfd76,0xf5419505),L_(0x0000014f),
+ LL(0x868b1c0c,0x6fc274a1),LL(0x83263833,0x7470faca),LL(0x28bbd5e9,0x10a9a5ed),LL(0x92bc266f,0x1a2df530),LL(0xc1420bb6,0x26088825),LL(0x6de27806,0xb843fbcd),LL(0x96eddc77,0xfaacb0c0),LL(0xe58f23ff,0x249016a2),L_(0x00000132), LL(0x304fead2,0x46f8b4da),LL(0xcdc2767a,0x030d0ccb),LL(0x4ecb91a4,0xa6cdee79),LL(0x546f1657,0x2f10c656),LL(0xa2c85665,0xdaca38a8),LL(0xb2b32405,0xa84dd381),LL(0x29386bb0,0x4d4926a6),LL(0x3ed722f3,0xbe6190e5),L_(0x0000004c),
+ LL(0xb158c617,0x70c2bdde),LL(0x1e929730,0x03b67c3d),LL(0x83aa10cb,0x207b6554),LL(0xf8bd1f2f,0x65897412),LL(0x52c6a1bf,0xd2b9e2bf),LL(0x4072e449,0x4573028a),LL(0x51728cdb,0x08f548f4),LL(0xa5fb2b4e,0x6569c4cb),L_(0x000000ce), LL(0xc30af1b8,0xf64d0544),LL(0x91fac057,0xe6a44ca8),LL(0x97b402f5,0xf3758797),LL(0x7a48f50b,0x9ec9c59e),LL(0xa20d052f,0x7e0c3edb),LL(0x50d02201,0xba6cf070),LL(0xc4603d10,0x0fd79a40),LL(0x04379719,0x030a1a47),L_(0x000000fd),
+ LL(0x33d05c0c,0xf4e66422),LL(0x28d54dca,0x3f1a0e0a),LL(0x1b90591f,0x8319bf69),LL(0x50c92b63,0x45f8cdc5),LL(0x2b172382,0xc8908923),LL(0xce47651d,0x282da333),LL(0xe6f22c70,0x6dc02842),LL(0x73a13e20,0xf357a052),L_(0x00000154), LL(0x9bb811ca,0x2aa27cb4),LL(0xff020d4c,0x8f138cd3),LL(0x181a1cec,0x35013750),LL(0x47863f93,0x37481122),LL(0xe6028031,0x18f58c65),LL(0xf01c48b5,0x565f6657),LL(0x9f20924b,0xa7b0ed3f),LL(0x643987ef,0x13cf4aeb),L_(0x0000004e),
+ LL(0x151f4865,0x1b42c497),LL(0xf30bdc50,0x055325f0),LL(0x144e0aa2,0xf8e98fe1),LL(0xa165a395,0x2e0f9b5a),LL(0x25afa523,0x3ceadf0d),LL(0x70ed634b,0x55dbb9b8),LL(0x1b25f855,0xe2ddb61f),LL(0x8a54708c,0x4ce03600),L_(0x0000004b), LL(0x74847fca,0xf91dd3a7),LL(0x92445716,0xe74dda4f),LL(0xfe51e6c5,0xd2ebe9fa),LL(0xe3bfd67c,0xec65184e),LL(0x51f3767f,0xc26dcf5e),LL(0x6092d164,0x7562e715),LL(0x48053ca5,0xc341746a),LL(0xfe264b56,0x6aa0cec8),L_(0x000001af),
+ LL(0x688f0816,0x55ab4efe),LL(0x012b1be7,0x48d9609c),LL(0xdb068e78,0x0fb98843),LL(0x958488ad,0xff5eda2d),LL(0x83f6d23c,0x3ec7372a),LL(0xb176c41d,0x5d185ec0),LL(0x925e4903,0x476314a5),LL(0xe4ff9579,0x0d644a3d),L_(0x00000029), LL(0xd529cc94,0xd2ad417d),LL(0x2dfe7d43,0x360ab4fa),LL(0x52cc454d,0xfb2e9eb5),LL(0xa4732c24,0xcf82a235),LL(0x68d1e843,0x67bb7a40),LL(0xbca2ab8e,0x91877eaf),LL(0x99566cd1,0x62574ab0),LL(0x22f9872f,0x687549f9),L_(0x00000183),
+},
+/* digit=65 base_pwr=2^325 */
+{
+ LL(0x2d85f820,0x287db7bb),LL(0x702fbecc,0xe568667e),LL(0xa157f36d,0xf4ecbeb7),LL(0x484f3352,0x941bbfbf),LL(0x558da014,0x3d5fe38d),LL(0x7b22586c,0x8a8ef1b3),LL(0x7a9e7fea,0xba594962),LL(0x0c422ebe,0x7c9fc474),L_(0x00000117), LL(0x34c2ec0f,0xeb882690),LL(0x8c7ffbe0,0x16f607ed),LL(0x0a729f09,0x9cab235b),LL(0xfb783d21,0xe85a3bb2),LL(0x7a1f91a0,0xaf1659ef),LL(0x067ef36e,0x3c3d4be9),LL(0x2b43e992,0x3b5e5bd9),LL(0xe81391aa,0x6e4981e3),L_(0x000001cc),
+ LL(0x58cf4fb6,0x2d970cf0),LL(0x6108b652,0x8db98564),LL(0x1c524ec7,0xc375bd09),LL(0x8ded01ba,0xeaf41a1c),LL(0xca7571d5,0x1513bf75),LL(0x83433ae4,0x831a58ce),LL(0xb1cbad60,0xd4b5c1d0),LL(0x7e3558b4,0x054b3a12),L_(0x000000d2), LL(0x5fc5bcaa,0xcd90416c),LL(0x1fd11e95,0xf9cd3e85),LL(0x77429d71,0x4b143cec),LL(0x818263e7,0xb694e333),LL(0x7b0bed2a,0x078fef20),LL(0x900d9d3b,0x22c62d90),LL(0xb2dcc393,0xf713057f),LL(0xee2cd8c7,0x46aefb0a),L_(0x00000048),
+ LL(0xc6a3697b,0x36666b6c),LL(0x771114f0,0x4615de0a),LL(0x4656bc00,0x27ed1a54),LL(0xfe1b0ffd,0x7a367a4c),LL(0xa7b011fe,0x9395287b),LL(0x1539028f,0xe474d2cd),LL(0x67ab6630,0x50df81c9),LL(0xd416f7d8,0xc4e94809),L_(0x000000c5), LL(0xcd4ff017,0x14e9eb99),LL(0x68ce9cb6,0xefe50131),LL(0x878690dc,0xf0500068),LL(0xa58b25b4,0xfe708a3e),LL(0x1697bfbe,0x4cbc1887),LL(0x109e6148,0xd61b572d),LL(0xea6e538f,0xcd507a67),LL(0x8cf0642b,0x44822c10),L_(0x0000002a),
+ LL(0x254f2817,0x74f04275),LL(0xe534cfb9,0x22ee390d),LL(0xf368e25e,0xbc4caed9),LL(0x0d3f5a1e,0xd7010447),LL(0x26bb7427,0x91f02404),LL(0x7f0d8308,0x993cd5f3),LL(0x4ebe5786,0x1ba9d89f),LL(0x2549a02c,0x89e62c7b),L_(0x00000089), LL(0x575527d2,0x33afd2d8),LL(0x6240eaa7,0x200435a3),LL(0x0df72a8e,0x104dbed5),LL(0xe9f3dcc7,0x1f5c3464),LL(0x98404140,0x791b398c),LL(0x1581b281,0xd77cd49e),LL(0xa203aa2a,0x2329530c),LL(0x70040738,0x782c024a),L_(0x000001de),
+ LL(0x8715b292,0x5fca8e16),LL(0x0659f3f5,0x904a8960),LL(0x7cdfccac,0xd46df8f8),LL(0xe8078ecb,0xae2184c0),LL(0xc1352930,0x904b839e),LL(0xf3fd8786,0x36602186),LL(0xc3ec21de,0x2a20030f),LL(0xe08de817,0x592eec46),L_(0x00000098), LL(0xd7e4cb2f,0x812cd124),LL(0x5ac9609a,0x83d9653b),LL(0x690acbe2,0xf981cac9),LL(0xc894c3a8,0xd274538e),LL(0x286285d9,0xc202f8f4),LL(0x24269d02,0x51bb2579),LL(0xe768b7b8,0x121f910a),LL(0x8baea845,0x76c44d58),L_(0x0000006d),
+ LL(0xf6a81b1e,0xcf66e145),LL(0x2a3bda3a,0xa88833db),LL(0x44164a42,0x4e0df1ec),LL(0x754bd187,0x89a6c53a),LL(0xff8dc770,0x961d8b4b),LL(0xa3761531,0x87d46b93),LL(0x31b05601,0xf7105b06),LL(0x4ef74177,0x500c6356),L_(0x00000082), LL(0xbc131ab6,0x4688d4bb),LL(0x6977d5eb,0x82e94cb0),LL(0x8706473c,0xb785ac18),LL(0x7362c724,0xae704972),LL(0x3b45de5c,0x2e6bdb68),LL(0x2c67f7d5,0x99b0063e),LL(0xa06ed86c,0x4969a5c7),LL(0xc4bf63b2,0xe55691fa),L_(0x000000b8),
+ LL(0x32f70f29,0x4140b7bb),LL(0xbcda177c,0x0fdc8422),LL(0xad59d7db,0xd2a3a29c),LL(0x9c1893f4,0x8f80936a),LL(0xe60fd330,0xa903804b),LL(0x6b3cc7d2,0x0e38278b),LL(0xfcb7a0c8,0x31deb3a4),LL(0xb47a9458,0x3c25cfff),L_(0x00000030), LL(0xc70a541d,0xcbbeaa75),LL(0x6f004b75,0xd7f127d6),LL(0x1d4ef334,0x15636fa0),LL(0x758ac159,0xa2548921),LL(0xb047a7de,0x60705693),LL(0x128b4b7e,0xa5696c87),LL(0xf499a64e,0xa206ac49),LL(0xf272bcca,0x1f6883bd),L_(0x0000005b),
+ LL(0x7a4b896d,0xb2e00072),LL(0x47a68dd1,0xd43d9655),LL(0x1ce79a50,0x6abc1f1e),LL(0xec87252c,0xe7160fe5),LL(0xb60d6a5a,0xdcf45caa),LL(0xd235985f,0x1b3180d9),LL(0xf8982569,0xdc646ab8),LL(0x446d6798,0x7ef649f0),L_(0x000001d0), LL(0x6eec719b,0x5f9db663),LL(0xcc9431de,0x38f4a187),LL(0xef383b03,0x3dbac366),LL(0x2fa36674,0xcc0b0d02),LL(0x5760fac1,0x67948b1b),LL(0xe8d42650,0x93934495),LL(0x4f889216,0xd3c64b8f),LL(0x1cd8ec2e,0x0eb0d528),L_(0x00000107),
+ LL(0x107d6bfc,0x5816dc43),LL(0xb8b5b662,0x1fe1463b),LL(0x973f88f0,0x4370119d),LL(0xc84691e3,0x153d37fa),LL(0xd0059b51,0x9a4e583e),LL(0xe99b060f,0x24c8671a),LL(0x8d5b7c8c,0xfdf410b1),LL(0x0db2233f,0x9b0e342f),L_(0x0000006a), LL(0x08c95cdd,0x07dbde25),LL(0xf5273466,0xf0969049),LL(0x76e98baa,0x8cba001d),LL(0xae173b76,0xcde8bcc2),LL(0xf10bd659,0x09ae5065),LL(0xc7bec674,0x5cecdf22),LL(0x4bdaed4b,0x41bc9eb9),LL(0xc459b9e5,0x7e368546),L_(0x0000007c),
+ LL(0xd08a3672,0xbcb161c1),LL(0x52ff0a6b,0x0593dede),LL(0x4b01e845,0xb5c016b2),LL(0x421052e7,0x65c310a3),LL(0x6c1dd249,0xf97c5a2d),LL(0x5a4e53fc,0xe551417d),LL(0x0e004126,0xbf9b31fa),LL(0xc101bc8b,0x43a5bd25),L_(0x000000c2), LL(0x2811e723,0xeaad08c2),LL(0xcc586f7d,0xc771ce2f),LL(0x8c0556ea,0xef8166e5),LL(0x32556e9b,0x2d11bd0c),LL(0x11e66977,0xfe7d92c3),LL(0x646a8dfa,0x58b69181),LL(0x8a624576,0x5de6bd35),LL(0xdeb3cceb,0xffa1c827),L_(0x000001e2),
+ LL(0x88f96f05,0xc1d3ecbd),LL(0x3593555a,0x3073315c),LL(0xb56c336e,0xaec91693),LL(0x5eea4cf3,0x2eade86a),LL(0x90e05846,0xe134f505),LL(0x9189d76c,0x8d429f7e),LL(0x0feade8a,0xf0013b30),LL(0xe083daf3,0xa7b56e97),L_(0x00000103), LL(0x817e33d7,0x9c2537c7),LL(0xa44bf13f,0x9a6a317a),LL(0xda31eee4,0x35ae34c0),LL(0xa0379d97,0xd66b27c5),LL(0x76a48571,0x1ae6d028),LL(0x5d83028d,0xbb8dadac),LL(0x1e4ebd89,0x8aaff54e),LL(0x67e3f97d,0x528b5683),L_(0x000001d8),
+ LL(0x9a7f8ba8,0x2992a59b),LL(0xa9efff68,0x1a328627),LL(0x3c1d097f,0x555f21eb),LL(0xf75afbb3,0x48ff742c),LL(0x4bf1016a,0xa10b236e),LL(0x5c770a94,0xff3e57b4),LL(0x5915a516,0xc042020f),LL(0x9df7440a,0x8d21ed86),L_(0x00000017), LL(0xecaea7dc,0xbf14c4c4),LL(0xd0035f1c,0x8343dde4),LL(0x19dfc08d,0x3a483722),LL(0x5b130cf1,0xc107a176),LL(0x30fc7b7f,0x6717617b),LL(0xf8cab932,0x626ffb5f),LL(0x59269de8,0x74af7c16),LL(0xbf37b9d1,0x4c20580d),L_(0x00000031),
+ LL(0xd31224fc,0xe9393683),LL(0x52cacad0,0xd4fad3f5),LL(0xd36819ae,0x14ee7de5),LL(0xb8c9f302,0xdb882d76),LL(0x103a3f52,0xb3362378),LL(0x1728ce43,0x0f7553db),LL(0x29c76302,0x56ba2d84),LL(0xc2f44114,0x28cc209f),L_(0x00000102), LL(0x3c639715,0xd8b8276f),LL(0xacdd7488,0xac8ea8c0),LL(0x912aac3a,0x8de7940b),LL(0x3dabab2d,0xd5bb2c71),LL(0xbc3f4a45,0xbcc2e33c),LL(0x2bf9f840,0x9d0edeba),LL(0x4b00c80e,0xcbe852a6),LL(0xbe4c368d,0x48bbcf91),L_(0x0000011d),
+ LL(0xc2974837,0x06284fef),LL(0xe24d882e,0x7041703c),LL(0x6f37e52f,0x5e1e37fd),LL(0x7853375d,0x145a0690),LL(0xcc75898e,0x270c5225),LL(0x61f33577,0x82c5658c),LL(0x777ab969,0x47024eca),LL(0x315f136f,0x85165412),L_(0x00000180), LL(0x8c1cda05,0xb7db1fe6),LL(0xedf31bed,0x7f07ba36),LL(0x8079b5f2,0xcdbc2d84),LL(0x22d262c8,0x4bb1ece6),LL(0xb457935a,0x79793249),LL(0x8614cc62,0xe89f8430),LL(0x258e4fa5,0x836da5fd),LL(0x759ca7b4,0xc0d83009),L_(0x000000d5),
+ LL(0xfa6cf668,0xce181709),LL(0x4b169dbb,0x5bee0010),LL(0x618d280d,0x28a88cdb),LL(0xa9c8042e,0xd8239424),LL(0x8ce15b95,0xcfce331d),LL(0xda740deb,0x6f83c378),LL(0x3c616a52,0xfc05f1b1),LL(0xda236e18,0x3be27f3b),L_(0x0000011a), LL(0x8647ebee,0x64ec0125),LL(0x0db33259,0x91422332),LL(0xf49a7d94,0xa2819732),LL(0xcccef356,0x9b90c693),LL(0x87f18954,0x805deff2),LL(0x22aa64c0,0x294b5e96),LL(0x352be09c,0xa610a1bc),LL(0x8368526f,0xd20e437e),L_(0x00000183),
+ LL(0x8a8479d8,0x893e0d1c),LL(0x045ea96a,0x972cecee),LL(0x37445b26,0xb250ed0b),LL(0x1c0a16a9,0x08e477bf),LL(0x7509c768,0xc826b683),LL(0xb74870c4,0x008a3f9f),LL(0x4d580408,0x4b88d0f7),LL(0x18d474fc,0xb871463d),L_(0x0000003f), LL(0x2fa143fb,0x726dcabd),LL(0x36d39ee2,0xe017d3cb),LL(0xd8d9e011,0x43bd77e2),LL(0x332c8650,0xc8965069),LL(0x3231a13f,0xf7a775c4),LL(0x1e3de078,0xe93c91cf),LL(0xe0f7c892,0x50d48604),LL(0x27097492,0xf1d9b31d),L_(0x00000042),
+},
+/* digit=66 base_pwr=2^330 */
+{
+ LL(0x9e603471,0xfb50e447),LL(0x2536308c,0xf617634a),LL(0x9549272f,0x302ba17f),LL(0x3e264556,0x0f6ed916),LL(0xddb056ef,0xc67d2e92),LL(0xf04b9449,0x7bf608be),LL(0xe0fd2d62,0x5ba41494),LL(0xfaa0f9ad,0x7c857eca),L_(0x00000074), LL(0xac0394a9,0x9ed3e6c1),LL(0x9017e273,0x2bf950e4),LL(0x441c9b0d,0x9856ca69),LL(0x717b7978,0x3315b53c),LL(0x66f1bf12,0xc5bce131),LL(0xdc85d5ff,0xf7b0dacb),LL(0x32365700,0xf85306a7),LL(0x22ce0f19,0x406e80fc),L_(0x00000011),
+ LL(0x4ae474b2,0x3a2640ed),LL(0x3684de2b,0x21f91da9),LL(0x424bab62,0x9955df67),LL(0x50d60209,0x5193b4b5),LL(0x196c99d5,0x8e9f2748),LL(0x7e7f3c74,0x31e6b3fe),LL(0x257248f6,0x73f47f4e),LL(0x56db9ba3,0xb50ccf8f),L_(0x00000137), LL(0x48bc357e,0x3556892c),LL(0xfa4353a3,0xb72124cf),LL(0x6ea40bee,0x1dbe3505),LL(0xb37aa3c7,0x2e951ca1),LL(0xaddc96c7,0x71de6fca),LL(0x58ae291c,0xf88244eb),LL(0x96fd42af,0x7e89a7bf),LL(0x1c5d8ae9,0x9ba25eb4),L_(0x00000178),
+ LL(0x5894fe38,0xa61f78f7),LL(0x1b7d597b,0x4cc9003f),LL(0x94b8d7ad,0x0c50139b),LL(0x899c26b5,0xd4d5af57),LL(0x5801efbb,0x7d0705ee),LL(0xc45f009b,0x345f5d52),LL(0xc52fa5f2,0xda142009),LL(0x8d175fe7,0x7812ca18),L_(0x0000004c), LL(0x3b59142d,0xc3639f82),LL(0x8ec202a8,0x87394d85),LL(0xb2496e6e,0xa4035f4b),LL(0x7b3e291d,0xcab52bdd),LL(0xda4a9abd,0x41430674),LL(0x23a5aab4,0x7c18c413),LL(0x57ee045c,0xe39c61ef),LL(0x6008e4d9,0x54734790),L_(0x0000017f),
+ LL(0xc78ac751,0x51e9a589),LL(0x6a5f85af,0xc09d63e5),LL(0x8ce24a89,0x9b655b51),LL(0x5441652a,0x9b445da7),LL(0xf4ffab48,0x9523b0e9),LL(0x23e77128,0x90aaf7cb),LL(0x99234af2,0xb5c9bc78),LL(0xa65dc198,0x8246a1dd),L_(0x0000003f), LL(0xfaeeacca,0x00e72c44),LL(0xa2bbbd59,0x47a63782),LL(0xf531aecb,0x67c393bb),LL(0xc7dda450,0x31630b09),LL(0xe719fa6f,0xc95e46b2),LL(0xf849f3a0,0xdeaf5d70),LL(0x68299654,0x827dd5d4),LL(0x286bc1f0,0xb4def96c),L_(0x0000017a),
+ LL(0x9eae7cc9,0x62e9226e),LL(0x3410c389,0x2f9c24f5),LL(0x71f68cfe,0x090966e9),LL(0xa4f25f7a,0xbb4733af),LL(0x45a0c4d6,0x6303208f),LL(0x0dc0c0a0,0xc45e9f18),LL(0x9a589e6d,0x5c94f082),LL(0xb9c34b5b,0x9266dd1d),L_(0x000000e1), LL(0x9fc32695,0xaccb375d),LL(0x15ea0e6d,0x5d3b353b),LL(0xc2dc172e,0xdcb147d5),LL(0x96265816,0x7b5ea6b9),LL(0x7188496d,0x6c199f62),LL(0x067983d5,0x8be2b6ee),LL(0x804ab5f0,0xb8433a5a),LL(0xfb9701f7,0x08ec1b7f),L_(0x00000005),
+ LL(0xf346db2e,0x75d8b8a7),LL(0x6d441b3f,0x33c9dd4c),LL(0x49bf3101,0x43c1a96f),LL(0x586195d3,0xc64bca08),LL(0x797aa157,0x35872dbe),LL(0xf8494dd7,0x155f257f),LL(0x370900d2,0x42b380b7),LL(0x2ec6eba8,0x0de4106f),L_(0x00000122), LL(0xd54c0210,0x9ba3b710),LL(0xdf76d347,0x79738efe),LL(0x168b7e7a,0x59395338),LL(0x5be21cb3,0x786b578f),LL(0x6c93997c,0xb42b9419),LL(0xda95deb9,0x1b5aa55d),LL(0x1941c038,0x6282d548),LL(0xdc8f9a51,0x155e294b),L_(0x00000038),
+ LL(0xc54fa3d4,0xc9331956),LL(0x37673a44,0x95ef7146),LL(0x8699a77e,0x35d322ef),LL(0xe5aa4366,0xb0a5fb37),LL(0x1c2f8160,0xdaf11474),LL(0x6c679654,0x4ae2c0a4),LL(0x25f5bd9f,0x0cd1a20c),LL(0x2812f915,0xddb9cbb7),L_(0x00000116), LL(0x6ba35704,0xddf43f70),LL(0x66ebac5d,0xbd74a353),LL(0x5836be03,0x8be404aa),LL(0x606cb997,0xa72b6949),LL(0xe5570eb3,0xe6f5f53a),LL(0x1550fdd3,0xd841cc12),LL(0x83299eb2,0xcf113a07),LL(0x76117e23,0xb031e54d),L_(0x000001d5),
+ LL(0x0412d583,0xe9241a8a),LL(0xac6aa964,0x24077ab2),LL(0xe1536c1d,0xad189da3),LL(0xdf56af4a,0xfbfb6e01),LL(0x46ef9e57,0x8ca8e624),LL(0x7c9eb17f,0xcbcb351a),LL(0xf3eda4f9,0x0985fb54),LL(0x69708739,0x4d5e2c29),L_(0x00000119), LL(0x4656d8d3,0x4d7980be),LL(0x8d7ed681,0x65dbc6a6),LL(0xe9b6528d,0x433cebeb),LL(0x9dfcc27d,0x25c88d26),LL(0x273aec82,0x43f7caaf),LL(0x8662d906,0x1c78327e),LL(0xe4a09eb4,0x04763fda),LL(0xad9bd2f6,0xbfba2b0e),L_(0x0000005c),
+ LL(0x56bd282f,0xc5002426),LL(0x8905b0bd,0xc776fda9),LL(0x5fecb366,0x691702ab),LL(0x8c3c6d77,0x3eafba03),LL(0x7b9bb860,0xa5a38b66),LL(0x288652df,0x9d4dccfc),LL(0x8b876824,0xf937bd4d),LL(0xedcfeccb,0x8bbe45b7),L_(0x0000009b), LL(0x4223e6a4,0xffdb1d9f),LL(0x44384141,0x4395593e),LL(0x68a0f97c,0x4b9f43be),LL(0xa0157cb8,0x99290f7c),LL(0xcccef6ba,0xef0777fc),LL(0x4349cd23,0xc43d71c0),LL(0x17318622,0xa3bb9fb0),LL(0x5a9a1343,0x039a4c9d),L_(0x000000c9),
+ LL(0xd92ddb9e,0x22ba5c1f),LL(0x65cc6bf6,0xa333c9c6),LL(0xb76d024f,0x521f0218),LL(0x51355f8c,0xb277d241),LL(0x061005e2,0x36014e7f),LL(0x322c2c56,0x52d2dee0),LL(0x8916c0e7,0xf40b1b75),LL(0x0e73d5bd,0xcfe8f526),L_(0x000001ea), LL(0x2bc1b23d,0x34905a27),LL(0x31577092,0xac41b5aa),LL(0xf6758a71,0x0e95917e),LL(0xeccda7b1,0x35f458d2),LL(0x52d35c5f,0x61af1ed0),LL(0x42e21d1f,0x99ea1f96),LL(0x1b6c4f11,0x1c9ff42a),LL(0x5a729a64,0xdaa6b431),L_(0x00000185),
+ LL(0xa860137a,0x2bb38059),LL(0x7d4fcbe1,0xaebc7ba3),LL(0x3de80141,0xabc6d3af),LL(0x0ce79f66,0xecaf11f9),LL(0x9743b455,0x23367c7f),LL(0xcf9fcf33,0x458f9b06),LL(0xaf18324a,0x1dd894da),LL(0xc4c95fe7,0x09129d0b),L_(0x000000be), LL(0xe5b4edaf,0xff94f2f7),LL(0xdb54a58e,0xc8f912e0),LL(0x655ce3bf,0xdffa0710),LL(0xb0757830,0x0f2d4402),LL(0xb963f905,0x95d5e868),LL(0x098d24ba,0xcdbb826b),LL(0xba591cbd,0xb02b1feb),LL(0x6a8df836,0xd82281ce),L_(0x000001b1),
+ LL(0x108f42a8,0x9cf21db6),LL(0xddcfd187,0x555cfe2b),LL(0xaf269c11,0xe7b4d452),LL(0xc4011856,0x3cb7c3fc),LL(0xfe6e4559,0x415957c0),LL(0x8996b215,0x3b983b2c),LL(0xbe5cf31d,0x0312f953),LL(0x78abc3a0,0x37adff70),L_(0x00000185), LL(0xd52c0d6b,0x847e724e),LL(0x42bcb7b2,0xcfdfc839),LL(0x2ddac314,0x2aac1c0a),LL(0xa690e67e,0x60736a1d),LL(0xe310507c,0x15f2f407),LL(0xa30b8b85,0x03447dd4),LL(0xf3ddc7c2,0x87208fe5),LL(0x482e1135,0x70157470),L_(0x00000073),
+ LL(0x4b696b0d,0x98400d78),LL(0x671aa2b1,0x05e6f78c),LL(0x19c7b31c,0x2f26896d),LL(0x537e98fd,0xc925cf6a),LL(0x31498b2c,0xe43ae0bb),LL(0x5b628896,0x2cc9c889),LL(0xf81936b3,0xd5a79df1),LL(0xaa558d67,0xdd9726a6),L_(0x00000127), LL(0x947e26f1,0xd8102ba2),LL(0xcba2e206,0xf57819ca),LL(0xe1b53333,0xb14e41e4),LL(0x89b722a1,0xa87036c9),LL(0x43d9c2e8,0x8c5e594a),LL(0x8a9f09ad,0xfc198885),LL(0x96afae31,0xd164a447),LL(0xf6ad8705,0xa304b415),L_(0x0000018c),
+ LL(0x51de1f32,0xfe892ec2),LL(0xde0ad941,0xa5e0c485),LL(0x252b5759,0x04504e2c),LL(0xe069dceb,0xceea659d),LL(0x80061659,0xb3fe1e63),LL(0xee236d87,0x846da87b),LL(0xf97ae613,0xa90f8433),LL(0xe7abcaf3,0x2f8213d9),L_(0x0000008a), LL(0x583a7dc4,0x6598f335),LL(0x8097f299,0x89f7734d),LL(0xff15633b,0x8aebbf6c),LL(0xb01c7b6a,0xb5108c62),LL(0xc7f93ae2,0xf807ee31),LL(0xf990d4e3,0x34992a71),LL(0x9962859e,0x282fca85),LL(0x8047dde1,0xc000a572),L_(0x00000113),
+ LL(0x5945bc53,0xcf237d07),LL(0xe31f2468,0x1ef4bb2f),LL(0x641e2901,0x2c562b14),LL(0x06773e1d,0x2ff0373c),LL(0xca66e36e,0xc519e2a9),LL(0x716d0497,0xbfb75cdb),LL(0x9a1fa9e2,0x0dddfb32),LL(0x1e517999,0x6b953285),L_(0x000000a8), LL(0x9daa8f05,0xe87b5c36),LL(0xba374fa1,0xcd0b7e7d),LL(0xf9ec22c4,0xd20b7cb2),LL(0xdd4d581d,0x516610e0),LL(0x74ddb0da,0x126aa3e2),LL(0x4e09fb27,0x35d95ce7),LL(0x0c242711,0x40d02e9e),LL(0x926ede13,0x8d5dfa4d),L_(0x0000010b),
+ LL(0xb7d7682e,0xd8734ac8),LL(0xd322358b,0x75fcdec6),LL(0x56d9d86e,0xe72ffc35),LL(0x6c363b61,0xd1066f3a),LL(0x3d03c2ea,0x7095dbd7),LL(0xcd1674fd,0xb42f9972),LL(0xacc3e682,0x9370acc2),LL(0x80c71149,0xa71a76fd),L_(0x0000016a), LL(0x5a49c095,0xe1070948),LL(0xd0d2a294,0xe55bcaed),LL(0xa073e38c,0xd2884da3),LL(0x25346561,0x95d34747),LL(0xbed8195e,0x990b2c19),LL(0xefe701ec,0x17664aec),LL(0x4c59ce88,0xcb5f1246),LL(0xa23cc1c6,0x846bef85),L_(0x00000113),
+},
+/* digit=67 base_pwr=2^335 */
+{
+ LL(0x72a8d985,0x39a70c2f),LL(0xea7d5b7d,0xf6f8acab),LL(0x73f642dc,0xdeb95d02),LL(0x8a54bc56,0x3f3cc37d),LL(0x5a63f188,0x1ef1bba0),LL(0x8c074b83,0xe112f14c),LL(0x17f937a8,0x29897379),LL(0x4d335ca2,0x57340487),L_(0x000001ef), LL(0x998374f7,0x8ee96d7e),LL(0x7d432cad,0xbff9e11a),LL(0xe6665366,0xf6d56384),LL(0x9b692423,0xfc7e344a),LL(0xf75f044e,0xee1b3ddd),LL(0xa827ee60,0x9cd00df7),LL(0xb2612c93,0x3d529eb5),LL(0xc4ffa6a1,0x5e23ecd7),L_(0x000000e1),
+ LL(0x39c16671,0x3753ce58),LL(0x7356faf0,0x54c5f8c0),LL(0x1165a356,0xf5c1afc7),LL(0xd6adf86c,0x903b89f9),LL(0xba6b4966,0xbff86c3f),LL(0xb1519f4e,0xa87b0151),LL(0xbe4f95b4,0x85efd27b),LL(0x0513d263,0xee9e2b04),L_(0x0000014c), LL(0xd4622a63,0x2aca99c7),LL(0xa6efd8d9,0x1d6acf3a),LL(0x7e55d6dd,0x95a1b738),LL(0xdb119c22,0xd9703d10),LL(0xd11a67da,0x427c0f52),LL(0xe412eedb,0xe055192f),LL(0x174c7a31,0x404a5758),LL(0xfd4b1dde,0xbb21a55c),L_(0x000001f4),
+ LL(0xc51693d1,0x57ada379),LL(0x7b463243,0x9dea1156),LL(0x65ad7ad1,0x3431ffb8),LL(0x22995c21,0xbfb6e47d),LL(0xa47b2e96,0xecc87ed5),LL(0xb5d8ce10,0xab93da78),LL(0xe414756b,0x0b5319cc),LL(0x327dee6e,0x82e08d68),L_(0x0000010d), LL(0x68a2cd80,0xd1a1a9cc),LL(0x62b72c52,0x2c285a2a),LL(0x23638d39,0x1736a146),LL(0x90e668b9,0x99d14c12),LL(0xe73e0b34,0x0861672c),LL(0x88955dcb,0x7dc3cdab),LL(0x06284ae9,0x4fad41f5),LL(0xfe7ca883,0x16e468d7),L_(0x0000001a),
+ LL(0x370d119f,0x9990254b),LL(0x764d3fe4,0x8a86cb40),LL(0x39be0e2c,0x4b9820af),LL(0x458321b0,0x29475227),LL(0x2c2ba583,0xa07a5c7f),LL(0x52e9ae89,0xfa6d5206),LL(0xbdc0eee8,0x435604c9),LL(0x6f2e4842,0xd30a60c0),L_(0x000000ff), LL(0x1714a30a,0x66400030),LL(0xa3f37cbd,0xab87a938),LL(0xf3132874,0xecbe1c91),LL(0x7e9d7ac6,0x1734fae5),LL(0x7e33fb88,0x600765b0),LL(0xedfc073b,0x428cbfb5),LL(0x85e9a209,0xbd290285),LL(0x77ef7692,0xf50381e0),L_(0x00000057),
+ LL(0xec2103fa,0xa28d165e),LL(0x31bc9c0a,0x9e3c2272),LL(0x1db480d5,0xeefa29bf),LL(0x5fe970c7,0x0625c44f),LL(0xa6473b7b,0xd9e52858),LL(0x66b89d6b,0xea4cd7c9),LL(0xc3e3b579,0x3b6547a2),LL(0xa8bdce16,0x517b2e4e),L_(0x00000152), LL(0x66f8ad71,0x8a1901b7),LL(0x08802270,0x0ceae5cf),LL(0x853e6e60,0x63ae6ec1),LL(0xd89e54bb,0x1f365d84),LL(0x9e03d94f,0x49df44dd),LL(0xddc9e1b3,0xf70096c2),LL(0xba5865a7,0x6cc7a69e),LL(0x01800fb8,0xcbb03fad),L_(0x00000080),
+ LL(0x91cf34a0,0xc22b2802),LL(0xfd975370,0xe87a26b1),LL(0x662b3666,0x46d8088a),LL(0xa7466010,0x0988f2ee),LL(0xd8edbdfb,0x1f7fc1eb),LL(0xf4b2f213,0x266b6d41),LL(0x00896949,0xc83c1c02),LL(0x7c849de8,0xedffcbe2),L_(0x000001ad), LL(0x90bcda37,0x480ec74a),LL(0xdde9d726,0x26216e2d),LL(0xbef16495,0xa5c64b02),LL(0xfba3c749,0xc3f630aa),LL(0xea872930,0x8695df3b),LL(0xb21d654a,0xb5372491),LL(0xa2f3f6fc,0xe917f3b3),LL(0x13fe01cf,0x4b29c946),L_(0x000001e7),
+ LL(0x12faa2d3,0x93a86247),LL(0x67da197c,0xd4612a0b),LL(0xfd72cd4e,0x145bbdec),LL(0x8483b822,0xb4dba8a8),LL(0xf56d58c6,0x81ec1ed7),LL(0x708f26ec,0x631a5032),LL(0xf4782ede,0xb4b04fc8),LL(0x34a251ec,0x0d9db88d),L_(0x000001ac), LL(0x1b8eedbc,0xadbb93b8),LL(0x1b68a64f,0x2308b6f8),LL(0xc37e6bd6,0x392cec36),LL(0x7b419db4,0x0aee0e63),LL(0x1777f3d5,0xff167cd9),LL(0x706d5278,0xede81ea9),LL(0x2ecab8c0,0x63b7e96c),LL(0xb7b3cb43,0xb821ee5a),L_(0x000001b0),
+ LL(0xec8937b4,0xbb7112fd),LL(0x3ed5a415,0x66e9e19d),LL(0x01eab0fa,0xbbe65978),LL(0x740c409b,0xba92675e),LL(0xa050b19b,0x3e8b56da),LL(0xe6eedf2c,0x2fbcf099),LL(0xa55e0691,0x80195262),LL(0xf2c7d1e9,0x72121ee2),L_(0x000000f6), LL(0xeec1384c,0x51ffea5b),LL(0xeaca6749,0xd0ad477d),LL(0x45756473,0x1fd4ee32),LL(0x80864216,0xa3069430),LL(0x850c8b97,0x405f653b),LL(0x9de4340f,0x5a543cae),LL(0x347d550d,0xa331ca24),LL(0x75f4312e,0x7ca7992a),L_(0x00000002),
+ LL(0x6f04ee1f,0x5987ecf0),LL(0xe39114e7,0x8c92a999),LL(0x734b40d0,0x3eb0ff94),LL(0x35b97b9a,0xf3a7b34c),LL(0xd5b35118,0xd35276ae),LL(0xfa36fe0d,0x9e933110),LL(0x3c37067d,0xbe64ccaa),LL(0x9629f86f,0xf4e80957),L_(0x000001ef), LL(0x2f066fb6,0x69fb1dea),LL(0xd4e489f4,0x65ba5821),LL(0x3abd59aa,0xf0068abc),LL(0xf152d51c,0xfa26b25b),LL(0x4c7900c0,0x929fd963),LL(0x22beebe6,0xd19508e6),LL(0x6c8e147f,0x84fd88ff),LL(0x8a8eae8c,0xf8e5d746),L_(0x00000039),
+ LL(0x58c8162c,0x15dbf9ea),LL(0x7dd87f67,0x5523d821),LL(0x2bc5b0b4,0x8780b2c5),LL(0xb8903ecd,0xf92e785d),LL(0x54296f75,0x6397e404),LL(0xcce33c6e,0x84bad1cc),LL(0xd3c5f54e,0x95b82162),LL(0x33f935ae,0xddedf093),L_(0x000000e8), LL(0xf54ff1c3,0xb4ec10e1),LL(0xc2886785,0xa1634274),LL(0xe5822d49,0xbfab5d5e),LL(0xbe9122e0,0x955a062f),LL(0xf03c2cc2,0x579ad9b7),LL(0xf2e5e08e,0xdd6ee255),LL(0x1b65e701,0x934f08f7),LL(0xcd7d23cb,0x4d45cc9d),L_(0x0000007c),
+ LL(0xaeacb5da,0x9e604f26),LL(0xf00003d7,0xb32a37b8),LL(0x5e05fada,0x771ab3ac),LL(0x03aa3a60,0xe17eba9f),LL(0x31442064,0x7239319d),LL(0x021c13e4,0xa35b4712),LL(0x3f7e400f,0xc6e5283a),LL(0x5888abe0,0xbae7d910),L_(0x0000015b), LL(0x0081a506,0x59fee06e),LL(0x6e2f4f1a,0x372aea8b),LL(0x11014792,0x2416f852),LL(0x35841e3f,0x71de69f4),LL(0x710be3f1,0xfa1b9018),LL(0xd8151855,0x92a94717),LL(0x52addc4d,0xff148def),LL(0xea65eaa7,0x9642343b),L_(0x0000008b),
+ LL(0x01927819,0xd986cf50),LL(0xab17488d,0xeb6ebddd),LL(0x8628281f,0x92fa1e38),LL(0x4511bc03,0xe1691b01),LL(0x0b79c2a5,0xb842f844),LL(0x8805d866,0x343c71a4),LL(0xd5d795d0,0x042ac5c5),LL(0xedd85588,0xb87124aa),L_(0x000001b0), LL(0xfa896067,0x0d43dab8),LL(0xd6f1580b,0x9a3104ec),LL(0x840b3b59,0x76717c31),LL(0x41201091,0x2243eb78),LL(0x88de871b,0xe2323a38),LL(0x53ac3f7b,0x764799c3),LL(0xdaf476ff,0x999d244e),LL(0xc595b87c,0xbe221513),L_(0x0000010e),
+ LL(0x8985e912,0x3a4ec3d9),LL(0x639aa554,0x9515b9e8),LL(0x2b90b395,0xe330201b),LL(0x5d9f9a07,0x95f372a0),LL(0x83696835,0x0d679c0c),LL(0x8c8132ef,0xbc4509be),LL(0x5efb5013,0x1a4c14f9),LL(0x7a8442ff,0x59dd0f6b),L_(0x000000f6), LL(0x1d220323,0x607be429),LL(0x7b931a60,0x3b156b2a),LL(0x38e10514,0x36aabd76),LL(0x8ff10073,0x384c71ad),LL(0x3603a7b3,0x1c1f643f),LL(0xe305de49,0x08714206),LL(0x63b53241,0x57add901),LL(0xfba33a9a,0xf2cced51),L_(0x0000004e),
+ LL(0x03800832,0xceb77120),LL(0xc3398df2,0x625cbf7e),LL(0x4c74b442,0xdf67b9eb),LL(0x424f2515,0x6b977890),LL(0x2abc1051,0x2462b490),LL(0x7c8f5df8,0x6d60d980),LL(0x1bb838ca,0xff606aee),LL(0x1e7a2ff1,0xfb6f830e),L_(0x000001cd), LL(0x238fce9b,0x49a4c209),LL(0x73f7bb70,0xae2b39f7),LL(0xcfbf4b1e,0x53e2f55b),LL(0x7309ae96,0x026775b0),LL(0xfcf869d6,0x1b0e83da),LL(0x72ed99fe,0x02f8a21d),LL(0xe81bf7a2,0xd737619d),LL(0x2bf238b7,0xd0a7eb7b),L_(0x00000119),
+ LL(0x38b832fc,0xb158ca8a),LL(0xb03ae8bb,0x7420634b),LL(0xac8efa9e,0xaa8dadd3),LL(0x259a7c31,0x525d1488),LL(0xf727fdfe,0x8b687898),LL(0x48ffe9fc,0xfbbb696d),LL(0xb00d2cb4,0xf4a8353d),LL(0x9be76892,0x472fe4b6),L_(0x000001a2), LL(0xf73fea91,0x0e2a8788),LL(0xfce9c9d4,0x18c2b050),LL(0x3412a938,0x1844f4f0),LL(0xc14eff85,0x4ad5ef54),LL(0x0ad47ee3,0x01446b7d),LL(0x4c160f3e,0xc22336c4),LL(0xc43f42cf,0x64f51a4f),LL(0x34833c47,0xc43f0955),L_(0x00000133),
+ LL(0x7f8ca9dd,0x308270c4),LL(0x433780e1,0x2be3ff97),LL(0xb186cdf8,0xeb6471b0),LL(0x747ce696,0x05f60ab1),LL(0x815fe310,0x5a457da8),LL(0x6bb9ac1b,0x4901af0f),LL(0x925bd14f,0x652f972c),LL(0xacd8b58a,0x53143186),L_(0x000000a8), LL(0x3e0f3553,0xf7ba0c69),LL(0x6dbda5e1,0x5b11db3d),LL(0xe46fae1c,0xf1f51b89),LL(0x7c0b46b0,0xa48d5ec9),LL(0x1cc037ca,0xbdcc7599),LL(0xe5f40355,0x28784dc0),LL(0xd1a3fa4f,0x0b837ead),LL(0xb5a1926d,0x3098c9ee),L_(0x000000e4),
+},
+/* digit=68 base_pwr=2^340 */
+{
+ LL(0xde847fc3,0x2cc0ff17),LL(0x8ee8bde0,0x63e6fe38),LL(0x774123d0,0x97b1e73a),LL(0xf8cb9f55,0xee20c8da),LL(0x8b938535,0xa8b1bfac),LL(0x3df10d7d,0xe2a81936),LL(0xe7d42738,0x9979861a),LL(0xaf0a6779,0xc4dba03e),L_(0x0000012f), LL(0xbb611141,0xaefc5b58),LL(0x9b3d91d2,0x33633ce2),LL(0x0d5e3306,0x2544bfef),LL(0x8956c10a,0xbeaa2dd7),LL(0xcfa84101,0x8ba22402),LL(0x96a5f958,0x0df8f462),LL(0x34ace12e,0xc6c70187),LL(0xe0e00d25,0x01914ca8),L_(0x000001bc),
+ LL(0x8cc26d9a,0x4788e280),LL(0xddb52ac3,0xa2e3c895),LL(0x305bc55d,0x6e792cc3),LL(0xee807637,0x5f9d9986),LL(0x0da2d9cb,0xaea185a3),LL(0x56f8f0d8,0x8ef462b9),LL(0x096bebd6,0x300f61c2),LL(0x7be11b59,0x9b4cc44e),L_(0x00000051), LL(0x9dea58bb,0x2585fb77),LL(0x8271cd5b,0xd75c3d97),LL(0x5ac1a4b5,0x4eee827a),LL(0x6fe4d480,0x0147df6c),LL(0x7f66c09f,0x3f6a4c21),LL(0x92c3b320,0x1eeb9502),LL(0x17768418,0xebda3f44),LL(0x12f688be,0xfba26717),L_(0x0000002b),
+ LL(0xea4586de,0xdc25b073),LL(0xf24773b7,0x49b36fcc),LL(0x8466e794,0x3cc03245),LL(0x36f85404,0x02d71d6f),LL(0x251e24c9,0x1a81ea4c),LL(0x9e39ec68,0x0e710d11),LL(0x0e27e696,0x44dfa8e5),LL(0x6885ae0f,0x4f91bbc9),L_(0x00000100), LL(0x7872cc7e,0xb8224b0f),LL(0xb5696e54,0xe5d4bd3d),LL(0x64ead37d,0xcbad27cc),LL(0x5b2f36d2,0xa45e529b),LL(0x521210e2,0x788fbf74),LL(0xe1bd2c8d,0x40c5440b),LL(0x2b990184,0xbc157b39),LL(0xeeecc510,0xca9c145d),L_(0x000001c7),
+ LL(0x241f3444,0xaf242ed2),LL(0x73f71786,0x82ffb7bd),LL(0xee8f684b,0x0b940040),LL(0x0e0a7766,0x3cb9180b),LL(0x05509077,0x41ff934d),LL(0xd7e63b43,0xfe154397),LL(0x597b1f2e,0x73566086),LL(0x115dad8d,0x8383d38e),L_(0x00000032), LL(0xa0320279,0x44ad3c59),LL(0x95d0b92b,0x9546c02d),LL(0x17644016,0x0cf317d6),LL(0xb1278de8,0x0cc035b3),LL(0xa150eec2,0xa454911c),LL(0x40f34047,0xb15350f1),LL(0x64a854ce,0x24297dd6),LL(0x45fd389a,0xfddaec15),L_(0x000001d2),
+ LL(0x1b54c6d4,0xd46442b3),LL(0xc94971a5,0x8eb97dd3),LL(0x9e3e1ff6,0xe2df3525),LL(0x058db0b2,0xe0b69449),LL(0x46968077,0x4ea6ec9f),LL(0xba76456e,0x8457796a),LL(0x77183369,0x255412cc),LL(0xb4e4306f,0x9bbd6c5e),L_(0x0000005e), LL(0xcef4a91b,0x57dadc33),LL(0xb934de9a,0x51f56ade),LL(0x2e8fe341,0x49ab29d2),LL(0x85723b5e,0xfabf520f),LL(0x1ee66b41,0xbffe6761),LL(0x0a605253,0x50202f55),LL(0x9e49468c,0xef6d250b),LL(0x956ea13f,0x0c1b81a2),L_(0x000001e4),
+ LL(0xe30dc097,0xb5323240),LL(0x3dd49c5e,0x082d33c5),LL(0x17c692b6,0x12bc5d69),LL(0x7e9d695a,0x02c7fd33),LL(0xb78372d6,0x85e92117),LL(0xefa0ef29,0xceacebcb),LL(0x9b4e8e18,0x3d68cc3e),LL(0xe3e50ee1,0x56a48db3),L_(0x000001d4), LL(0x5f980bec,0x9b062f58),LL(0x03edaeaa,0x83ee3b51),LL(0x4f1f8028,0xe4a60553),LL(0xd292d29e,0xf95f8dad),LL(0x7f9ba28d,0xfb5785f5),LL(0x54b8d134,0x0fe162fe),LL(0x2bd8287f,0x2247f090),LL(0x769ce1a1,0x5ebc6de3),L_(0x0000001a),
+ LL(0x416e3d53,0x74341e71),LL(0xa2b4eeb7,0x9e6b225b),LL(0xff742236,0xd3c824dc),LL(0x5e3b9c67,0xd547224d),LL(0xc6e4276d,0xcc105d46),LL(0x8a001d2d,0x92da4b3a),LL(0x3b252483,0x67e2f395),LL(0xcbb5174b,0x659222fe),L_(0x00000118), LL(0x2308d720,0x4e2e8071),LL(0x9562db9b,0x1bf6b116),LL(0xb14e6841,0x45f6d2ac),LL(0xbfd32572,0x8cdf458c),LL(0xe189ac1c,0x3f894fd3),LL(0xb5d6ee49,0xa59cbf0a),LL(0x672a0c8f,0xd8476d8e),LL(0xfbb78753,0x104d6ed9),L_(0x000000a1),
+ LL(0x4e39334c,0x0560e3e7),LL(0xc62b58ab,0xfa2ff6e2),LL(0x25b0cfee,0xe3dacd7d),LL(0x56f469ae,0x6476d0c4),LL(0xaa862fad,0x0d8d2340),LL(0x468a688f,0x648a9494),LL(0x9d4d2feb,0xe9f4ed20),LL(0x3e7c5890,0xb2f118a9),L_(0x00000039), LL(0x12cdd07e,0x60784376),LL(0x8d6d1246,0xea183586),LL(0x85400753,0x5c35ba6a),LL(0xf252808d,0x57ba4df7),LL(0x07b45d68,0x048ddde7),LL(0x8c60d683,0x759393e3),LL(0x919b183c,0x760c630e),LL(0x90171725,0xc0e42720),L_(0x0000007e),
+ LL(0xc6d9113b,0xdfe5709e),LL(0x1b269289,0x74793368),LL(0x0c1477a3,0x3c2fbb12),LL(0x544d389c,0xbce04baa),LL(0x4fcb6058,0x52137546),LL(0x62503bea,0x306eaabe),LL(0xb0495976,0x49afd268),LL(0xa62777c0,0x9d57af71),L_(0x000001c4), LL(0x5a2c2301,0x122ed53b),LL(0x23b67f05,0x68235f24),LL(0x0b4f5601,0x850a3bcc),LL(0xfc63cfca,0xfb6987d1),LL(0x7f3a86aa,0xeb70f694),LL(0x726395f3,0xe2648fe0),LL(0xfc883eec,0x04f6906b),LL(0x551243f7,0xb7f9a9a2),L_(0x000001b1),
+ LL(0x1329d8d9,0x09b5385e),LL(0xe206cc29,0x8ad6ff5e),LL(0xaa658f94,0x8f946f98),LL(0x428d98ec,0x2b10de6d),LL(0x3ec6baf6,0x7efb3f61),LL(0x21982753,0x47b7f15b),LL(0x578e65b3,0x63e00597),LL(0x5b3f1a2b,0x4f67290b),L_(0x0000003d), LL(0xec6244fb,0xb103454a),LL(0xbf7ff50a,0xc09eeea3),LL(0x5b8194a6,0x117b25e8),LL(0xb8d95b3b,0x4719134d),LL(0x98e3eda5,0xfb408475),LL(0x184c4131,0xaae4a703),LL(0x433cd4bd,0xee1c89f5),LL(0xec3f5308,0xffc4a25f),L_(0x00000190),
+ LL(0x0a7c8b60,0x2ac3e5be),LL(0x35df434c,0x73674292),LL(0x218ab0b7,0x377ea177),LL(0x971e7bf8,0x979969d0),LL(0xa6fc69b3,0xf051da86),LL(0x0f199014,0x50a5af5c),LL(0x0bd76f2a,0x68112265),LL(0x6ef71ee6,0x92fc81c9),L_(0x0000002a), LL(0x2c92d1d2,0xa2718b70),LL(0x8bc153fa,0xefc700c8),LL(0x7d63139e,0x11bfab90),LL(0x63a1a94a,0x1c81d0a8),LL(0x0af04b86,0x5010811a),LL(0x65f6b2d4,0xd230f7b9),LL(0x346b9acb,0x92db7ff2),LL(0x791ad571,0x423539f4),L_(0x0000016d),
+ LL(0x0bfa96fe,0x4b219ff8),LL(0xe186bb8d,0x34f0b2a5),LL(0x4bbcffce,0x74e4771d),LL(0x4fa8ab52,0xa8af538f),LL(0x0bd9aa17,0x55b8ec20),LL(0x24b82cd8,0x55a1e2c4),LL(0xf54b7fae,0x34a02ce9),LL(0x011a367d,0x3f61c656),L_(0x000000e6), LL(0xb4418223,0xf5b325cc),LL(0x48062883,0xae0ea746),LL(0x3f6511a6,0xa6b89032),LL(0x057c30cb,0xe93a6d10),LL(0x00156e39,0x0c08d7cc),LL(0x7ef1eeb2,0x713dea1e),LL(0xeb905073,0x1c6abbcd),LL(0x4e60ee01,0xb23a579c),L_(0x00000093),
+ LL(0x1db48f4d,0x239e10c2),LL(0x3cbc9af9,0xde4c09f2),LL(0xabdb2bfd,0xed72b749),LL(0xf64b181a,0x928d6d6b),LL(0xc85d2a91,0x9af06cb2),LL(0x32a985b4,0x67685c7b),LL(0x4cf68328,0x607e3b33),LL(0x96bdc7c4,0xa7e4db64),L_(0x00000004), LL(0xc31b32d2,0xd33b72d3),LL(0xf9f3e673,0xd3e9eee6),LL(0x42fb631c,0x43164033),LL(0x6eedae95,0xaab1e76b),LL(0x986360ea,0x9e6c1afa),LL(0x30e60546,0xffd16939),LL(0x06fbdf1b,0x989aed4f),LL(0x7870903a,0x905f7535),L_(0x0000008f),
+ LL(0x1065b996,0x62ecea90),LL(0x92968f64,0x48a2356f),LL(0xe74f9d69,0xc38162fc),LL(0x799bc2e4,0x109958a5),LL(0xc2cf37fd,0xc511c5bf),LL(0xb810f3aa,0xba774e2d),LL(0x04423cab,0x7df651dd),LL(0xfa41efc5,0xd82de4be),L_(0x00000005), LL(0x843bf3e9,0xca2ddefb),LL(0x07001aa8,0x2325dc6b),LL(0xfb77a925,0x19ebdc37),LL(0x984cbf76,0x991269aa),LL(0x0ea96690,0x5a99df72),LL(0xf5a76c72,0x261ea01a),LL(0x11ed492c,0xec2261aa),LL(0x511c25de,0x10d398dd),L_(0x0000018c),
+ LL(0x79d76ece,0xdf3265ef),LL(0xdd97cbec,0x1201ac02),LL(0x82ed80a6,0x3e075507),LL(0x2e6d2b22,0x16c3d5bb),LL(0x9b31411b,0x89a53e5c),LL(0x4570ab97,0x5d2d34d3),LL(0x76b65f73,0xd36a94bd),LL(0x3b4c1384,0x10e67e38),L_(0x00000044), LL(0x91c17d4a,0x850a6308),LL(0x5b75be0c,0xa8eb3e41),LL(0xc4b1a960,0x5176e7e2),LL(0xef74a564,0xf493e8d5),LL(0xd77a5683,0x2824a377),LL(0xdc2b6e93,0x3d90456b),LL(0xf50c072e,0xfe49afc1),LL(0x3768ae59,0x7326363a),L_(0x000000f2),
+ LL(0xc160ead5,0xf73cb6f0),LL(0xe2cd2bce,0x53fb7eb3),LL(0x9bb7bc05,0xb6b62b31),LL(0x8a471706,0xdaf298a3),LL(0x846c6b42,0x9d404cf9),LL(0x085e05e5,0x8fac2e73),LL(0xc53893b4,0xa8ff0af6),LL(0xe3d8eea7,0x0310bde9),L_(0x00000017), LL(0xe934470a,0xc1af94ed),LL(0x89b3f0c4,0x4fba6b38),LL(0x9af80496,0x3e423ee4),LL(0xd89fd53a,0x793fadf0),LL(0x353cc302,0xcd463b61),LL(0x51fbb36d,0x782e102e),LL(0xd6d1c6c3,0xbbc63732),LL(0xc97f604b,0xb60ab59d),L_(0x0000019a),
+},
+/* digit=69 base_pwr=2^345 */
+{
+ LL(0x5fdb3148,0x0a1bc3a0),LL(0xbda07174,0xc265e95e),LL(0x43b1d3c4,0xedc546d6),LL(0x611b9709,0x807b04c2),LL(0xe15784fc,0x473ceec4),LL(0x58afe5bd,0xc97fb33e),LL(0x7b94dc53,0x39d6d532),LL(0x914fc6dc,0xfc2ee62a),L_(0x00000094), LL(0x67cbcf73,0xdf80627a),LL(0x67d3e029,0x91ccf95a),LL(0xfd91b52d,0xa53ec7ae),LL(0xa855273c,0x1131573a),LL(0x07213a95,0x49db550c),LL(0xfa5fb98a,0x470643af),LL(0x0fa67f5b,0x6bf0628a),LL(0xf906186e,0x01bb6d2c),L_(0x000001b1),
+ LL(0x7f1be067,0x7f152d2c),LL(0x8659f773,0x242f8dec),LL(0x8df47d63,0xcbac7d95),LL(0x91c63b0a,0xf620881b),LL(0x8c2c6ad3,0xda54c002),LL(0x701999ad,0x3012f693),LL(0x99516f6a,0x3c14f4c4),LL(0x68d44cb7,0xc5e6fda0),L_(0x000001c7), LL(0x1d209ec5,0x76dcc740),LL(0x51dc58e8,0x93231067),LL(0x4e14fe98,0x5a4f75f2),LL(0x88f5086e,0x4ccd6aac),LL(0xf294dbdb,0xedf86543),LL(0x30e3be99,0x767f48ab),LL(0x22dcd0b3,0xd87667c6),LL(0xd6615681,0x36829d7f),L_(0x0000011a),
+ LL(0x0d5b110b,0x1e6c13e6),LL(0xa0842e9d,0x58585159),LL(0x443356f4,0x265b46fe),LL(0x3b25c086,0x87729185),LL(0x0ebbff20,0xc71c4d1d),LL(0x79c2136e,0x3ebeca5e),LL(0x3a96ed20,0x32a0af3b),LL(0x012e330a,0xb9939f93),L_(0x0000016d), LL(0x7d17ed67,0xde583a56),LL(0xe5703cea,0x316840b4),LL(0x03d396ce,0x0cfc4143),LL(0x6970ea48,0xb1974ced),LL(0xa63761b9,0x3de4383d),LL(0xe400788f,0xd07d6726),LL(0xa545993a,0xa33056bd),LL(0xd3fe822e,0x9a96c385),L_(0x000001b5),
+ LL(0x2f073480,0xf78fb060),LL(0xb2604448,0xc2ac8aeb),LL(0x277ca03f,0x27864b78),LL(0x2c6f473d,0xeb1664eb),LL(0x7cb793a9,0x58eee9a3),LL(0x9c2ce2b3,0x94f18cbc),LL(0xc87a3dc1,0x2df6078b),LL(0x0e93cd11,0xc8181622),L_(0x00000009), LL(0x3fd1ed5d,0xbe10752f),LL(0x0c38fb72,0xd1e47666),LL(0x9b093c35,0x73ab1d6d),LL(0xd898dff7,0x00e4cf26),LL(0xc4b445df,0x422c1136),LL(0x9ee0d1ce,0xb6e821b5),LL(0xe82511ed,0x1ade6252),LL(0x81c804e4,0xada5e2f4),L_(0x0000012d),
+ LL(0x47ebbcfa,0x75ed251a),LL(0xc45b660c,0xef50c145),LL(0x733af648,0x00ba4ec8),LL(0x5119e848,0xb32a226b),LL(0x3e048abf,0x1f648014),LL(0x7a1eccf1,0xfab712cd),LL(0x2badbf53,0x1ebfb8b6),LL(0xca11e7be,0x07ff38dd),L_(0x000001b2), LL(0x789ae7e1,0x42374e6e),LL(0xa641227e,0xb2f0016d),LL(0xa82cadf5,0x8ca0d43e),LL(0x552e57fb,0x5a71e67c),LL(0xa8bcdb55,0xc3a4e9f5),LL(0x6e0e2bb2,0x124b38d4),LL(0xc1f40c89,0x60b28fe4),LL(0xabb2620f,0x69bcc1f8),L_(0x00000140),
+ LL(0xfaecca00,0x028ae659),LL(0x3a3c5350,0x656b887c),LL(0x5b3bb83d,0x0c6fbb7d),LL(0xc2d4fb00,0x8f5877ba),LL(0xea3d0289,0x01e01a3d),LL(0x943983b2,0xdcb878b4),LL(0x382b3bfc,0x7e566dbe),LL(0xe238f00d,0x8ef9130d),L_(0x000000a9), LL(0xcf1a3019,0x6043d5c3),LL(0x3f970442,0xd72b4978),LL(0x47e77b41,0x51765a88),LL(0xd9f49bc6,0xc2232c0f),LL(0xf1592cf2,0xba6cd5b1),LL(0x7bdf89de,0x33024471),LL(0xa56dd8d4,0x4e3c8e30),LL(0x6718468d,0x5ba5d7f6),L_(0x00000062),
+ LL(0x1c158b81,0x3cf9ac17),LL(0xe81b84be,0xb9565ca7),LL(0xcf197d97,0x30adec74),LL(0x0f74f924,0xbbec4f93),LL(0xc6810de9,0xdd1aa6b4),LL(0x68e13e67,0x31b1e868),LL(0x3b5ec800,0xb287ff46),LL(0x970d17f9,0x56052d48),L_(0x00000171), LL(0xfc348975,0x3990d639),LL(0x2c996afc,0xbf8e72bb),LL(0xc43038ef,0xf3f9e817),LL(0x673d9367,0xb8d625be),LL(0x33a4c44f,0xb72553a3),LL(0x6135473a,0x7365b95f),LL(0x91b434c7,0x70995374),LL(0x2e7887e0,0x42eef182),L_(0x0000009c),
+ LL(0xf8d7989a,0x1b1a9086),LL(0xb30f16f9,0x2b4d5672),LL(0x919c3dae,0x64f72009),LL(0x3b6ec0a9,0x64ce5600),LL(0xc12b7f4f,0xe0f0d4fb),LL(0x144476bf,0x3eb40f82),LL(0x0332a8a4,0x80cbb448),LL(0xf3755660,0x689dbf3f),L_(0x000001e5), LL(0xe518caf3,0xa53d6591),LL(0xe170d9ab,0x4f1b1b50),LL(0x3e56ed3e,0x7c4f9eca),LL(0x8dfe4cc6,0xfa0dd028),LL(0xa59c7726,0x0a01f234),LL(0x6c8fa066,0x704007db),LL(0x8366767a,0x4570b32e),LL(0x94810fb8,0xbae24969),L_(0x000000bc),
+ LL(0xce3ac7a6,0x5ab23199),LL(0x54772e62,0xd7eb0723),LL(0x8caedc24,0x76dd866b),LL(0xa41bb763,0xba5b9e92),LL(0xe6d92de4,0x28e72bc3),LL(0xce269dcb,0x2b7dc535),LL(0x7e64fab4,0xe7cccbfd),LL(0x02a03896,0xcec461c3),L_(0x0000014b), LL(0x3dc101fd,0x079c3e36),LL(0x2332d512,0xf51726ad),LL(0xdbc6dd2c,0x81e5e3b6),LL(0xbd26d73b,0xb2e70917),LL(0x24b0b54b,0x23cdf2f9),LL(0x0353dd40,0x5e2acffb),LL(0x2e871e61,0x07f5e7c3),LL(0x5b299ee3,0x191257c5),L_(0x0000004f),
+ LL(0x3ec2ad9c,0x115859c9),LL(0x1f8e247e,0x17b4d84b),LL(0x2585ef39,0x657d1198),LL(0xa3f20465,0x3619c497),LL(0x6901431a,0xe9a26e53),LL(0xa5276fd0,0x496e3f3c),LL(0x1f276a6e,0x348de17d),LL(0xf8c3af85,0xc8630fca),L_(0x000000cc), LL(0xb1e10393,0x7b5ce8d7),LL(0x6deb4f48,0xc7dc292e),LL(0xc43c502b,0x6b03f2ee),LL(0xb1a1182c,0x39273259),LL(0x7622b369,0x4498e583),LL(0xfe7d43c5,0xa50df54f),LL(0x61447fad,0xc4339095),LL(0x3a9a1f2a,0xda206eb7),L_(0x0000005a),
+ LL(0x4af9a66e,0x310c7a00),LL(0x8db46828,0x9223ef88),LL(0x2cf042cc,0x6fa5a04f),LL(0x7c559200,0x6daaab2b),LL(0x91afc691,0x98a36fb2),LL(0x00b03676,0x188b128b),LL(0x51264914,0xb9803ddb),LL(0x75459c1a,0xf41eea62),L_(0x0000019d), LL(0xe3aaa000,0x7a690ecd),LL(0xceb2c1c6,0x8880b402),LL(0x45703d2c,0xc0613e4c),LL(0x8b8c9eb5,0xc5db208f),LL(0x4c846b8c,0xa9987715),LL(0x6bd91493,0x42b48717),LL(0x9a26dd34,0x3e788715),LL(0xd9b2c58c,0xb5cd631e),L_(0x0000017d),
+ LL(0x361ab1b5,0xccf7e9f1),LL(0x24eb3b91,0x5a00b663),LL(0x3a047d69,0x70c649d7),LL(0xff025b44,0xbfc42749),LL(0xf2772669,0xfa1fa0b0),LL(0x1d856fe2,0x59b50aeb),LL(0xdd9c5baa,0x07db1f1d),LL(0x63853e29,0x1535fdcc),L_(0x00000054), LL(0x924ac747,0xaa197f48),LL(0x269fd103,0x40db5d37),LL(0x4cdd9698,0x1838b760),LL(0x491094a5,0xfe6931b4),LL(0x6e498775,0xf5d608e3),LL(0x0107968f,0x1ebcbfad),LL(0x4aa5111c,0x9da743a4),LL(0xcba06022,0x90a35fc8),L_(0x00000151),
+ LL(0x47445d4b,0x06b03d8a),LL(0x4a0fee6b,0x3277857c),LL(0x1fa95d1d,0x87c700bf),LL(0x48c9ebf0,0x2a50e2b3),LL(0x43aa2c31,0x9a26e1ce),LL(0xfdbdd0e9,0x52ca3b19),LL(0xfcedcc05,0x2999c847),LL(0xbff002c4,0x267e4e00),L_(0x00000125), LL(0x64d4906f,0x556e52bc),LL(0x42f805ae,0x90f2f1b6),LL(0xda19f3db,0xd869ad98),LL(0x21709755,0xf5bb8103),LL(0x573f3fb7,0x593f7e34),LL(0x2bac9d40,0x02d84c5f),LL(0xa4e8ad8e,0xea53406e),LL(0x80797c51,0xde43a1d4),L_(0x0000007e),
+ LL(0x02db6ff9,0x9a077100),LL(0x442b39ab,0xa4a99831),LL(0x658c33f0,0xd154641a),LL(0x6b185008,0xbb725f43),LL(0x1c42ee9d,0xc802ceb4),LL(0xd4f04052,0xde1c27e0),LL(0xaa13dd25,0x5e0fdafb),LL(0x59845ec9,0x89bca83c),L_(0x00000039), LL(0xd7b6958f,0xc632359e),LL(0x00693302,0xd897df30),LL(0x3a9976fe,0x07f17ce0),LL(0xb3320f5d,0x0634d694),LL(0x9281633f,0xf481d736),LL(0xa1f17a34,0xc568493c),LL(0x7973f20c,0xc81657ab),LL(0xe331f1c3,0xf1485d0e),L_(0x0000001f),
+ LL(0x02479c06,0xf0c74cf8),LL(0x82afef4d,0x3fe27e63),LL(0xc6ed0fe5,0x2473be19),LL(0x88c3bb5a,0xf0f01c24),LL(0x8b895708,0xff99c560),LL(0xda940b97,0x19fe223c),LL(0x3a3e9972,0xfce2e466),LL(0x48aaf92b,0x2976902b),L_(0x00000085), LL(0x1f0040f3,0xc569b506),LL(0x6e592ad0,0xa59e0b36),LL(0xe1a1ad5f,0x506ba908),LL(0xdd28fbcb,0x35a90e9a),LL(0x5dfd21f8,0xae82baef),LL(0x5c23fd74,0x03b13133),LL(0xe27cfbd6,0xa41bf476),LL(0x7af7e895,0xc5b57a28),L_(0x0000005f),
+ LL(0xdf92a189,0x7fe35612),LL(0x9f97d902,0xa5105c7f),LL(0xba021326,0x9c521853),LL(0xd2cadb21,0x9b3ed45d),LL(0xb3ab9d25,0xddadc1eb),LL(0x7b4a857f,0xaddab060),LL(0xbbc92a34,0x7dff916f),LL(0xee7e6c52,0x9816b721),L_(0x000000f6), LL(0xa3ba1dab,0x7b0e564a),LL(0x27f6c008,0xb9c963dd),LL(0x3c030970,0x76828eca),LL(0x3cd7a457,0x0834d3c2),LL(0x417b833d,0xf44c50d5),LL(0xf0d8be25,0x153d4a6b),LL(0xa49590ea,0x47e9c71d),LL(0xf3a30dc2,0xeb2b1d43),L_(0x0000018d),
+},
+/* digit=70 base_pwr=2^350 */
+{
+ LL(0x995d0979,0xe0c6b8f7),LL(0xbaad255c,0xcdfa7a67),LL(0x2a84102f,0x2ed9a546),LL(0x5fff322b,0x238b4cca),LL(0x316895f0,0x27a1fc8f),LL(0x4369e1fc,0x399300db),LL(0x708ed717,0x5f16f718),LL(0x931503fe,0x22cd3aa4),L_(0x000000b1), LL(0xa040da9e,0xf9967269),LL(0x8694422a,0x5871908b),LL(0x8350fa73,0x61c801c8),LL(0x80cd1b5d,0x26cc63f6),LL(0xaf0b4158,0x3474f5f7),LL(0x1e938b36,0x7800e540),LL(0x2f20f7f2,0x56230526),LL(0xd27bb44c,0xe18d65e6),L_(0x0000003f),
+ LL(0x474f3cfa,0x7075c330),LL(0xb3ee576a,0xb446bdd4),LL(0x1b7efe90,0xa143371a),LL(0x826a3c98,0x45fcf113),LL(0xa412cdba,0x4b5601ca),LL(0x614348a4,0x06ebe3f7),LL(0x9f111b62,0xd750e443),LL(0x1f6bb4a9,0xa9ce6845),L_(0x000000fc), LL(0x63c0d59b,0xcb29ae28),LL(0xe216b29b,0x3a9a3c78),LL(0x2465c5b5,0x9567856c),LL(0x36d155fd,0xdfbfe047),LL(0xa1ce6b07,0xc3a4fa43),LL(0xf19b8361,0x0e9f03c0),LL(0xb21f548d,0x9de803f9),LL(0x85460ccb,0x5a9172f8),L_(0x000000be),
+ LL(0x28dc3d9e,0xb1947d50),LL(0x707f8201,0xa08b9636),LL(0x1277e4a9,0x253ea9d3),LL(0x38720146,0x7e71d50f),LL(0x62240fd9,0x79e96c95),LL(0x99a338fd,0x14656a4b),LL(0x3386ac0d,0xaed2f11c),LL(0x56e7d58c,0xb1645e8f),L_(0x00000026), LL(0xd77da8a6,0xb38b4a7f),LL(0xdb95d39e,0xb6a3eb09),LL(0xc15d78b6,0x97f12510),LL(0xc3aba47d,0x56c5ceaa),LL(0x1799be9b,0x71c67e7c),LL(0x8203dc96,0xc27e5165),LL(0xaf4cd822,0x0bd2ed9a),LL(0xb4f47f2a,0xcb8f3ca9),L_(0x00000141),
+ LL(0xd26b287c,0x978130d6),LL(0xd433a71c,0x7aadd881),LL(0xb4ad7bb1,0x52e4f45f),LL(0xb1940d6b,0x722e2bd7),LL(0x72d44569,0xf91dc84e),LL(0x6d3fde70,0xd4254643),LL(0xbd1bc41e,0xb847e41a),LL(0x544a7be2,0xace3e10f),L_(0x0000017d), LL(0xe2e82545,0x3d8e5d2b),LL(0x1c9863cf,0x5f30317d),LL(0x98fb8ec2,0x81f15ce0),LL(0x8947db85,0xf3e6c315),LL(0x055d8793,0x43a7feb5),LL(0x8417f508,0xac153d3d),LL(0x248bbc38,0x664329e7),LL(0xfcfbcb03,0xb0314d2f),L_(0x00000064),
+ LL(0x0ffb3aeb,0xf0f73b2b),LL(0xb5b42e5a,0xfb4aa83f),LL(0x6fe3f768,0x166957fb),LL(0x1777755a,0x9be2e29b),LL(0xb21920be,0xd39b15af),LL(0x9d78ee52,0x5cfe70fd),LL(0x4ed3196b,0x55c6cafd),LL(0x34efaf79,0xaab07209),L_(0x0000011b), LL(0x9f0e1288,0xc5b10817),LL(0xef0c0487,0x2d0a8114),LL(0xd48fc96d,0x7cfa2d81),LL(0x641e3931,0x6424b3ef),LL(0xe6f897a1,0x3828d18c),LL(0xf36345b8,0x162c7445),LL(0xa9afd810,0x86dd67b2),LL(0x34f52c33,0xc05d931e),L_(0x000000c0),
+ LL(0xbf4033d7,0x282d7d2f),LL(0x4816fc56,0xbba4acf6),LL(0x0d36fbc1,0xed8c95f6),LL(0xc3d935ee,0xf5c04db6),LL(0x0f8e468f,0xf1e487eb),LL(0xe95fc738,0x07ce9d5f),LL(0xd25bbce8,0x3ea06aeb),LL(0xd6e4d92f,0xe1653616),L_(0x000000e3), LL(0xd1ebfa2e,0x8c6285b5),LL(0xff9b06cd,0x7f8da651),LL(0x19efacac,0xfb702fe7),LL(0xf38839db,0xfd2c9b61),LL(0xb8c0cb9c,0x674adc03),LL(0xd42ebdf8,0x326b91f3),LL(0x8993821a,0x0fbb4e81),LL(0xbc7b32f8,0xc1690f2a),L_(0x0000011d),
+ LL(0x2fd676b6,0x892e4204),LL(0x41e60d2e,0xdf88f03d),LL(0x05344e65,0x322deae7),LL(0xabc0c748,0xf3bee9da),LL(0x7dbffa8f,0xe2cbe049),LL(0xf2922597,0xb0e73ee1),LL(0xa1ab5a4f,0xd18b70e5),LL(0xf7b0232d,0x6b85e543),L_(0x000000f3), LL(0x7a93eb9f,0x998f9412),LL(0x6520852d,0x9fffa5de),LL(0xa83ca014,0x9492e738),LL(0x29961bc9,0x38356eab),LL(0xbaa587e6,0x9aad6aa8),LL(0x5bde3fd3,0x15f7c437),LL(0xc663a8aa,0x2b85ba68),LL(0x922641a9,0xb030aa17),L_(0x00000175),
+ LL(0x90b91e88,0x9329a6f3),LL(0x5e0fd985,0x332091e8),LL(0xc7233994,0x069d0a1f),LL(0x7172741e,0x953488c0),LL(0x1870fafc,0x3b040fb9),LL(0xbb2fd807,0x9e841e1b),LL(0x16872728,0x48f58216),LL(0xa72dc0f5,0x590057bf),L_(0x0000010e), LL(0x4ec2f404,0xc898f3ae),LL(0x893dfe9f,0xd6d16346),LL(0xcfc2a2d6,0xdcfcc356),LL(0x9780e14a,0x52a0f58f),LL(0xe40c34a9,0x1f74017f),LL(0x9637bf1f,0xe85cc7e4),LL(0x7db8273a,0xf7240054),LL(0xd4e119d7,0x2baa4eaf),L_(0x0000008d),
+ LL(0x8bec2bfe,0xe147d2d0),LL(0x0f381def,0x63d396f3),LL(0xd719925a,0xa70c4ee8),LL(0x48335ffe,0x70cbdf17),LL(0xba86e989,0x70acf1a0),LL(0xa8e07900,0x3fdcbfe3),LL(0xf724a710,0xd0dd93f1),LL(0xcce8d0db,0x6cd982dc),L_(0x000001e7), LL(0x312db409,0xe842388e),LL(0x51c17662,0x5cfc4c86),LL(0x2819cf9f,0x3d2f2e78),LL(0xcb5f9278,0xc84b5c07),LL(0x6807319b,0x91966c94),LL(0xd459389d,0xf68df64d),LL(0x22ed9565,0x30d2c264),LL(0x2d12cd4a,0x1496895c),L_(0x00000055),
+ LL(0xa8198a4a,0x7fd3cc79),LL(0xcf8b16bd,0x973e67ac),LL(0x27c827e8,0xc9207496),LL(0x6d1709a1,0x9157f587),LL(0xc23a1cd6,0xbedd9d1c),LL(0x8b1088ef,0xb005d24b),LL(0xc08bed38,0x6477a806),LL(0x0681e2ab,0x213943da),L_(0x000000ba), LL(0x2de2bdb8,0xe996e18b),LL(0xf9e30d5c,0x2c137e56),LL(0x5c521393,0x6041c771),LL(0x8cdc666b,0x4ee56b76),LL(0x2695a1d6,0x518a5638),LL(0x41e2f039,0xdb59944d),LL(0xaf0a4010,0x5b0e9f3f),LL(0x829ed1fe,0x2cb7de1f),L_(0x00000068),
+ LL(0x3b382180,0x93922bbc),LL(0x1503eb8a,0xd83a3aec),LL(0x4f056b98,0x0f661abc),LL(0x1dc0c0de,0x20cd5ab5),LL(0x25a3a29e,0x9409a1df),LL(0x2ec3d724,0x2311b333),LL(0x9cff8f0d,0xd299c4b1),LL(0x30ec4ca0,0x7f770084),L_(0x000001d0), LL(0x674d075d,0x79f5e3c1),LL(0x3e4d547c,0xaceff143),LL(0xa985c66e,0xceb1d3f0),LL(0xc8735e90,0x46311b8a),LL(0xecdbba45,0xd47b3dd0),LL(0x8237affa,0xc21e6384),LL(0x6b4f82bd,0x851d53b8),LL(0xff59ca4e,0xf5e1b60e),L_(0x0000000b),
+ LL(0x29a5355a,0xa2f29baf),LL(0x3e11c687,0x653058a2),LL(0xab5abb63,0x533110b2),LL(0xead1d1b9,0x254324e4),LL(0x65d1b7b6,0x9ad5a861),LL(0xd1007405,0x0712ab62),LL(0x6f88f2a9,0x78e9d501),LL(0xefd62c6b,0x1145cafe),L_(0x000001fc), LL(0x62d2d42c,0x8d15289e),LL(0x5d68b919,0x4baf7b53),LL(0x4a9af773,0xbfd8566e),LL(0x2c278158,0x0f0f5b40),LL(0xa603f631,0x366d639e),LL(0xed79331a,0x457655be),LL(0x5b5f4bc7,0x744b4617),LL(0x6ced0122,0xa2e7748f),L_(0x000001c1),
+ LL(0x0a6157b9,0x62225ddd),LL(0x63f4338a,0x3ff075f1),LL(0x19a505d3,0xa170cf14),LL(0xdfa6bdb1,0x35bb45bd),LL(0x3014f03b,0x01eadcfb),LL(0xdf884f38,0xed9ce5a3),LL(0xeb67d796,0xbe4fe92b),LL(0x01a5f419,0x57e98411),L_(0x00000129), LL(0x7ddc4629,0x8bd2744c),LL(0x40075673,0xa1d1f6a9),LL(0x6ac9b5bb,0xbff10759),LL(0x7709ddbb,0xd617233f),LL(0x04b71ff3,0x91a5fcd2),LL(0x45458de2,0x699b54de),LL(0x5147375c,0x4e0307cc),LL(0x2fe5917c,0xf27f33bc),L_(0x0000003f),
+ LL(0x4252a836,0xfbc6e97a),LL(0xbffdbb20,0xee422c57),LL(0x5769cb47,0x501f912b),LL(0x3924d571,0xae0c25a9),LL(0x239c3442,0x7ed84b21),LL(0xd601103f,0x74478136),LL(0xebe1703d,0xc5087e65),LL(0x67b021e4,0xf61c2d56),L_(0x000001f8), LL(0x8ce094d8,0xaa167fe1),LL(0x70c73af6,0x79b93fdc),LL(0x0e41e095,0x3eab3290),LL(0x4d79fd87,0xb7162ca3),LL(0x66141590,0x583d1391),LL(0xe0bd38e8,0xa393b806),LL(0x169f55ab,0x4bdc04a4),LL(0xd1df6260,0x445d5212),L_(0x000001e5),
+ LL(0x6ef19cc6,0x8fb90054),LL(0x349f0b5e,0x7a588763),LL(0xd381418c,0xe35ce1af),LL(0xec0fd49b,0xecb4e203),LL(0x7786513b,0xa276ad19),LL(0xfe701187,0x99f4ee10),LL(0x47d026fa,0x58423dc0),LL(0xa22bbaf1,0xbd8a6065),L_(0x000000fc), LL(0x9aa1efcf,0x5af392c9),LL(0x8ba7989e,0x7c5174d3),LL(0xd1616f2e,0xd20d0632),LL(0xa5636d7c,0xd761cf0d),LL(0xce718261,0x701e7d69),LL(0x08d4d0bc,0x66e92aa8),LL(0x819aee8a,0x0d6fcd90),LL(0xc96d5138,0x2da0618d),L_(0x000000a1),
+ LL(0x81b20efd,0x117c40b0),LL(0xec008c40,0x0a6d9c2a),LL(0x693270e3,0x6114d3e0),LL(0x4266a5ea,0x44a6af67),LL(0x81ebf621,0xee3917e3),LL(0x7fca3d45,0xc35ff5d6),LL(0xa3526048,0x0f6e79db),LL(0x7e7bfed4,0x0da1a81a),L_(0x0000016e), LL(0x0c06eb8d,0x3343c5a2),LL(0x3418cfe3,0x3e67d0a5),LL(0x15eb001a,0x7e48959e),LL(0x0ead5e7c,0x0962e6ac),LL(0x32e4162f,0x3e28513c),LL(0xfb8117bb,0x317568fa),LL(0x3a2e3034,0x0c912ceb),LL(0x55938174,0x24701102),L_(0x0000018d),
+},
+/* digit=71 base_pwr=2^355 */
+{
+ LL(0xfec70f6d,0x92ef06ac),LL(0xc38aac0c,0x790f3344),LL(0x53c30edf,0x1b40fed7),LL(0xfc800650,0xf6da803d),LL(0xfdf722f2,0x284a42e2),LL(0x5cecc340,0xa0f15400),LL(0xb36ac652,0xef82f0df),LL(0xd1506b21,0x5fdee7be),L_(0x00000096), LL(0x84d76b78,0xa1c3d7b8),LL(0xc6050edc,0x307e9a89),LL(0x1519baa6,0x8c7e0ccc),LL(0x3495eff8,0x22e91666),LL(0xea17475b,0x69639f1c),LL(0x8c53c39e,0x1f0e827f),LL(0xede8121b,0xeb066355),LL(0x91249281,0x0c0c2d5b),L_(0x000000b2),
+ LL(0x3accccf3,0x16751720),LL(0xa2ac7465,0x1bf938ea),LL(0x83a983dd,0xb73d73d6),LL(0x598a6f1d,0x630b4f7f),LL(0x6235f9ed,0xdb784cb5),LL(0x52bdf332,0xb330540f),LL(0x221e5e83,0xc25843b0),LL(0x09499b4e,0x6e45244a),L_(0x000000b4), LL(0x010fb3ca,0x8b6e52dc),LL(0x60a24896,0x22c046dc),LL(0xae1e187a,0x482695be),LL(0x006acf49,0x35934bd3),LL(0xb960f105,0x1e1d0143),LL(0x4cfddf01,0x5de371d8),LL(0x56c439e8,0x64828414),LL(0x582ff3b5,0x43605585),L_(0x00000161),
+ LL(0x3578ec4a,0x83ac7330),LL(0x74417a7c,0xb971e045),LL(0xbee09246,0xc391f3f4),LL(0xb2cfe806,0xf8fb9526),LL(0xe574f401,0x2d57d573),LL(0x9ef64156,0xf2047705),LL(0x2e13ebeb,0xe2e05adf),LL(0x97b783be,0x2b746c25),L_(0x00000086), LL(0xac801f25,0xbb184270),LL(0x1d0026d9,0x772cb73c),LL(0xc5ae7636,0xf37dccd7),LL(0x5106f975,0x276aad31),LL(0x2b41e6c0,0x0c355836),LL(0x7d420351,0x169e0a27),LL(0x25cdd7da,0xe67ef6ec),LL(0xdd1ddbf0,0x988f96fe),L_(0x00000103),
+ LL(0xbce94ac6,0x89803b61),LL(0xe8afe442,0x2e798f31),LL(0x9a42f37b,0x9475e43d),LL(0x77aef7a7,0xa8f685f3),LL(0x203a6947,0x969c3b8c),LL(0xdf0dc1b4,0x9c542cdb),LL(0xc76bc8fb,0xff501682),LL(0x2a768660,0xe2ff6697),L_(0x000001f7), LL(0xc8f9daec,0xc4a46652),LL(0x89b1c325,0xb09499ac),LL(0x721c0cae,0x5e63ccd5),LL(0xda46e344,0xaca0b998),LL(0x32db691c,0x793a1fc7),LL(0x049e845a,0xd927f614),LL(0x7aea310a,0x80024bf0),LL(0x5359be8b,0x60137724),L_(0x000000be),
+ LL(0x57afd605,0xb3d701e7),LL(0x608eeeaf,0xa1e2923b),LL(0x3a52d1fe,0xb5ba2517),LL(0xf6c570be,0x6f830092),LL(0xa2b946db,0x63e9fd66),LL(0x2b96de58,0xd1292d2e),LL(0x89c80a56,0xf418bcf0),LL(0x02901646,0x626f5025),L_(0x000000f4), LL(0x9f28725f,0xb36ad666),LL(0x73de9bb2,0x25e09cb1),LL(0xf102152a,0x3474fc24),LL(0xb0389a9f,0x9e0b3083),LL(0x245ecf47,0xefc86ff8),LL(0xedc1e824,0xd024fd72),LL(0x022e7528,0x0e37477f),LL(0xa7fdb14f,0x2d504191),L_(0x00000176),
+ LL(0x130db159,0x31d0f49f),LL(0xbd9c79a2,0xf1d499d6),LL(0x7ea9b7cf,0x367757ac),LL(0x05a4d545,0x0a42a453),LL(0x1f2c8548,0xd461a5b5),LL(0xb8ed29ef,0xe691c9e6),LL(0xa549541f,0x6490ea1c),LL(0x09c0153e,0x93d0058f),L_(0x000000d9), LL(0x7f525f59,0xc140a1f6),LL(0xa98aaedb,0xf5bef166),LL(0x750be5c2,0xd457a559),LL(0x8cba58b2,0xc5d96cfb),LL(0x514d93d0,0x70bfa2f9),LL(0xb86d7234,0xf6b79058),LL(0xa8a78584,0x18d58f11),LL(0x2b2d0ad4,0x341dbfe3),L_(0x0000007f),
+ LL(0x147202dd,0x3c8a33ae),LL(0xd39c4b9d,0x1d455649),LL(0x3f56141d,0xc0ac51ab),LL(0xa5a57669,0xfc529732),LL(0x1ee307ea,0x1861bed9),LL(0x5f1e4bec,0xc7a796b8),LL(0x5b0d925f,0x06f456f4),LL(0x2257c76d,0x7d497d17),L_(0x000000ab), LL(0x4360118e,0x218cb0cb),LL(0xaa1c1dca,0xf6db0e7a),LL(0x2be1c968,0x5a3744ed),LL(0x46bb2acc,0xaf262fce),LL(0x7e16d340,0xaec37ad7),LL(0xe6df41bd,0x1060715f),LL(0xee38cd22,0x87b94898),LL(0x34109b20,0x0eb71ca2),L_(0x000001fc),
+ LL(0xb416f6d1,0xc2c062af),LL(0x3dacb0a7,0x1630676c),LL(0xd74ee6b3,0x95fc297a),LL(0x8f736e49,0x48a7a2d1),LL(0xd64edc25,0x6b5d5f53),LL(0x83303159,0x0e945b2c),LL(0xdfaa52c4,0xb0587c06),LL(0x462a8f05,0xa859437c),L_(0x00000141), LL(0x2fcd636b,0x0835ddc0),LL(0x86482b2b,0xd2333470),LL(0xc7f1c7b2,0xb32bf92b),LL(0xd5f30c92,0x49153950),LL(0x9ce136c0,0x29288cec),LL(0x4ac8254d,0x34eb3849),LL(0x0b3117ac,0x14ba2a1b),LL(0x3a85376a,0x1b0e1c47),L_(0x0000009e),
+ LL(0xb3ec3510,0xc014692a),LL(0x988a8cb2,0x70309a41),LL(0xb83a1155,0x92367194),LL(0x22c65f09,0x558d49bd),LL(0x17ac8e14,0xd539b194),LL(0x281a7ecc,0xa19213fa),LL(0xc69fe80b,0x1ef427d6),LL(0x744a4f4d,0x5f94b5db),L_(0x00000136), LL(0xf07169a2,0x4ff0070e),LL(0xe17c5e0d,0x42362609),LL(0xd97efa2b,0xab4374f3),LL(0x59d17f1f,0xc3027acb),LL(0x8cb9e348,0xc305c872),LL(0x320eb648,0x861bfbe3),LL(0xf68b129b,0x2a98fbd9),LL(0xc35aa741,0x8fa1ae4d),L_(0x000000c9),
+ LL(0xba2a6162,0xfef26d3a),LL(0xaf22bedc,0x4bac42f2),LL(0x32bd0514,0xaf54da8b),LL(0x474d59e6,0x846ca3be),LL(0xac190f17,0x7e7c79bf),LL(0xaea0f3e1,0x13543ecb),LL(0x0ff996ba,0xabe74acd),LL(0xe27a5f5a,0xcea6ecbd),L_(0x00000136), LL(0xa8ccc73f,0x1e746179),LL(0x62af882b,0xb19b717d),LL(0x4e0895be,0xb255045a),LL(0x8f194a8b,0x0b37366b),LL(0x089f1cd5,0x7b3da3e1),LL(0x68b1f2a5,0x91e4f674),LL(0x9c4602f6,0x698976ca),LL(0x3ed98ad9,0x99fe05e5),L_(0x000001fd),
+ LL(0xfe476990,0x532b6850),LL(0x345630b7,0x7ff00f29),LL(0xecbc85e6,0x9c3d2e4c),LL(0x5f322ba8,0x6869142c),LL(0x9e246c23,0xf5d1ef76),LL(0x0affd2a0,0x2e6d871e),LL(0xb40893c1,0x66c72704),LL(0x1665fed8,0x01d321d9),L_(0x00000042), LL(0x06507414,0x9d9489fd),LL(0xa1379411,0x7d5c53f0),LL(0x7e6d3de2,0x097595be),LL(0xc486fb28,0x85e5a09c),LL(0xa9fd8f9e,0x2996fa66),LL(0xd71e16d0,0x040664e3),LL(0x7c75e965,0x14b60428),LL(0x9d686380,0xf4fa3032),L_(0x00000123),
+ LL(0x86f79bf5,0xbf36d744),LL(0xbf45f97e,0x0fe48147),LL(0x6235b3ae,0xd40868d4),LL(0xa9b13d93,0x45fa9173),LL(0x34e9264c,0xb5705f4c),LL(0xd0d58c79,0xfd4b166f),LL(0xaf4ff870,0x7aaca2ed),LL(0xb68a488f,0xd9bb2955),L_(0x00000047), LL(0xf5f3e0b1,0x747dd972),LL(0xf6fc0c26,0x92d84bc8),LL(0x088102b5,0x201255f7),LL(0x84970893,0x7f6288c9),LL(0x6a679170,0x9309b54e),LL(0xd5327276,0x389f4da5),LL(0xc48b5de6,0x8fc1eb23),LL(0xac794b85,0xa3f64d1b),L_(0x00000132),
+ LL(0xb408df01,0x66056a5d),LL(0x5f945157,0xc30a058e),LL(0xf0071848,0xb615e360),LL(0xe6a8d838,0x132d49ae),LL(0x1bb7f3ca,0x092ee873),LL(0x398ab7d7,0xbf83bd98),LL(0xba362639,0x73208c1b),LL(0x49dd5ba3,0xf4382ccd),L_(0x000001a7), LL(0x0d07ce4b,0x724cd057),LL(0xf7baff54,0x31245cf8),LL(0xff518822,0xff5f1211),LL(0xea1813a7,0x89f90332),LL(0xfa74413f,0x9e68455b),LL(0x9e49a7a6,0x182fad31),LL(0x30e8a2ef,0x233ce0d5),LL(0xbd55ab52,0x38f1c599),L_(0x00000010),
+ LL(0x28e2d8df,0x708c9183),LL(0x1dbe8e5a,0x9b9fb00f),LL(0xa3695cb8,0xaeafe9c7),LL(0x9205b4ca,0xd6ec0b74),LL(0x756f204b,0xa9e0254c),LL(0xd51d1a73,0x152441cf),LL(0x0ca91564,0x370d2b8b),LL(0xe3cdd9e9,0xab50f4de),L_(0x000001a5), LL(0x9dab1375,0x5322d78e),LL(0x78b8ab5d,0x0adbfc55),LL(0xa2b97f9c,0xd5d0ce27),LL(0x9cd573f2,0xe94e39b4),LL(0x06ee23d2,0x213bd15a),LL(0x708d61ea,0x561b9d34),LL(0x6271f59e,0x41fb576c),LL(0x9ae94507,0xd828d166),L_(0x0000009b),
+ LL(0x6669c984,0x46ae7251),LL(0x8c23b4d3,0x3738a807),LL(0xad75f8b4,0x3ef8e3cc),LL(0xc8e8bbf5,0x029e586a),LL(0xa7111c4e,0xa4d1beb9),LL(0x238f36b4,0xc4da1680),LL(0xbe34bad6,0x9409b124),LL(0x6ab824c2,0x48e9ec02),L_(0x00000062), LL(0x0666df3f,0xa0015f27),LL(0xd7f90fcc,0x3e7eb3a2),LL(0xcd91c4ca,0xa8bd0fd8),LL(0x56907857,0xc0b60059),LL(0x3559db95,0xc6ed4fe7),LL(0x0c8beff5,0x2ba51007),LL(0x5bc2116c,0x409f6b4e),LL(0xa6198a28,0x360e46d8),L_(0x00000076),
+ LL(0x231a6637,0xb888102e),LL(0xaecdfa06,0x430b0efa),LL(0xd888793c,0xb123b1e3),LL(0x8beed2db,0x8887df4f),LL(0x3ea5e72a,0x2425e985),LL(0xccc7d4aa,0xd98e93f3),LL(0xe9181719,0x07cba97f),LL(0x8ea6eef3,0xa9e6f6b0),L_(0x000000d8), LL(0x5719b171,0x5d9f40be),LL(0xe16ecd5e,0xfea96313),LL(0xfe1e359f,0xd9f1461e),LL(0xde9904f3,0x38f6d943),LL(0x881bb7a0,0x2c5787d5),LL(0xa74eed55,0x67fc2cd9),LL(0x7ccb483a,0x2c643f37),LL(0x7070b576,0x386889db),L_(0x000001ea),
+},
+/* digit=72 base_pwr=2^360 */
+{
+ LL(0xca188556,0xbd7c7672),LL(0x20ced736,0xa4667058),LL(0xb83d6897,0xe3f39ba4),LL(0x174ecbf7,0x34188faf),LL(0x203dc58b,0xdb5dba0b),LL(0x5206b453,0xf54df32d),LL(0x52fcf51e,0x08d08e3c),LL(0x2f551f34,0x72856373),L_(0x0000016a), LL(0x6b937ade,0x7f7f5dfd),LL(0x632c9b6a,0x3151876b),LL(0x3ee4a789,0x7a59040d),LL(0x41b009fd,0xdfc2d274),LL(0x68b427fe,0x1c0ceded),LL(0x07d57f92,0x220fc8f2),LL(0x83c79a42,0x7b0f6753),LL(0x410a2e83,0xc0765d6f),L_(0x00000124),
+ LL(0x01fb8b79,0x82addc43),LL(0xfdb0062d,0xb9cdf1d9),LL(0xb1cf25ad,0xb5a42255),LL(0xaaea42eb,0x1990669d),LL(0x1dffd105,0x88f20764),LL(0x613001d6,0xda7769bd),LL(0xa275aa11,0xe04ea507),LL(0xea612e43,0xf381e073),L_(0x0000005f), LL(0x21f18b4b,0x268a5e08),LL(0xa7554f72,0xad126436),LL(0x714fe1c3,0x5b5ba02f),LL(0xb7c7cde4,0xf2da3519),LL(0xfc576f09,0x4fb328e0),LL(0x185faef3,0xa0386e0f),LL(0x2adc73d1,0xc97a6bb3),LL(0xda21be9a,0x70df7733),L_(0x00000048),
+ LL(0x6a23d540,0x500040b2),LL(0xf87554cc,0xe6a09fa7),LL(0x548aea96,0x0cf27fbb),LL(0xfa1d8c06,0x1a618765),LL(0x1943cfee,0xe6a8c7ea),LL(0x20bf61bc,0x99730b0b),LL(0x744528dd,0x42eac170),LL(0xd049742c,0x85700423),L_(0x000001aa), LL(0x1e2bba63,0xe601cd80),LL(0xcbeefa62,0xc9e240a6),LL(0x8106469f,0xda8103af),LL(0xc7109e54,0xdcc44907),LL(0xdb9a3ec3,0xe44b6df8),LL(0xe34b7788,0x0e67c93e),LL(0x4a58495d,0x63e8347b),LL(0x23b5096e,0x468b5372),L_(0x000000db),
+ LL(0xbf417e03,0xb60364c1),LL(0xdda37ca1,0xea847f52),LL(0x28527f5c,0x98d517fb),LL(0xa1e399f7,0xff102f07),LL(0xc452c79f,0x87dfab3c),LL(0xc5aa688a,0x490b0295),LL(0x0dbc6056,0x3dd17acd),LL(0xb4f6972c,0x2e16b5ac),L_(0x000000b7), LL(0x23fa3555,0x3a903ffa),LL(0x262814e3,0xc46f6e35),LL(0x1cec4214,0x7267bc6b),LL(0xca2e1dc8,0x20b7474b),LL(0xeb500457,0xf394811d),LL(0x4304c697,0xa5001f3d),LL(0x0f7a5e2b,0x4c9ea7fd),LL(0xead3d012,0x84c6a90d),L_(0x00000120),
+ LL(0xb7e47c23,0xd475bc3c),LL(0xff4599af,0x1acc6490),LL(0x39b1950f,0xee09f5dc),LL(0xd14540f1,0xe51c9564),LL(0xf1b75050,0xbebd088f),LL(0x17895647,0x240dba4c),LL(0x097400cf,0x559b95e8),LL(0x5d4b8420,0x3bc0185b),L_(0x000001a3), LL(0x85986a76,0xc2ffb653),LL(0xa478ed7f,0x18e264c5),LL(0x4841d184,0x17a5a278),LL(0x21d9e8a0,0x297fe2fe),LL(0x1bf52154,0x072d6d91),LL(0x88327dad,0xae77c8ea),LL(0x02d1fcbe,0x13786b6a),LL(0x25554500,0xdf7f6e68),L_(0x000001a0),
+ LL(0x17de731f,0x7753cff6),LL(0x972b7a35,0x73655403),LL(0x28d73a10,0x0c70484d),LL(0x46d46c14,0x516a9dc8),LL(0x455b7ef1,0x0b552594),LL(0xb8161489,0xf418ade1),LL(0x64a91645,0x76a465f2),LL(0x7693e9a1,0x91415ed3),L_(0x0000013e), LL(0xe5e5c3bf,0xdc135bc4),LL(0xca946121,0x3d39b5c7),LL(0x55877498,0x318be468),LL(0x9fb5d801,0xe5cb6287),LL(0x3afd92b1,0xcd7f8034),LL(0x34ed24ae,0xa3835c84),LL(0x6aa7d954,0xd325764c),LL(0x41780668,0x7945ea02),L_(0x000001b9),
+ LL(0x34c0928c,0x37933b17),LL(0x74a56f2c,0x6bae2a29),LL(0xb1d26ac8,0x6bd1e8bd),LL(0x84c336cb,0xcdaa1b9c),LL(0xaca41014,0x7838c44f),LL(0xe2ce24b8,0x525239ca),LL(0x515f204f,0x8bcb0507),LL(0xdbd0e0a5,0x50183993),L_(0x000001e4), LL(0x631411bd,0x3e15aa53),LL(0x8672c87f,0xade47bf6),LL(0x93da50d5,0x148028e4),LL(0x0048f8cd,0x03c75612),LL(0xb5ecfaeb,0x7b7867aa),LL(0xafcde134,0xa0208953),LL(0xe2411e3b,0x24be9b23),LL(0x848d40b4,0x24d9da2e),L_(0x00000187),
+ LL(0x16583ec0,0x7b7ba7d9),LL(0x2bbb4768,0x2b3f0b4e),LL(0xe0e4b3fb,0x9172caac),LL(0xe6fb63a6,0x22aab4b0),LL(0xa00520c8,0x7930e37a),LL(0x4dcbf41f,0x6bfa91da),LL(0xf521a694,0xb88bd604),LL(0xa707c1f0,0x95a5140f),L_(0x0000011a), LL(0xd8520b88,0x22333018),LL(0xa6bc2bb8,0xaa6a00bc),LL(0x011553af,0x5def3469),LL(0x0ed5fc0a,0xbcfec7c2),LL(0xdee0e8c5,0x2f464224),LL(0x8adb476e,0xd844542e),LL(0xd3c1bdb2,0xa709924f),LL(0xac98d161,0x472a5f2f),L_(0x0000001a),
+ LL(0x5054b047,0xa4a3faff),LL(0xd966b478,0x3d33573c),LL(0x1081c0ed,0x928c644f),LL(0x0d2ce409,0xb6d01835),LL(0x9e6a2193,0x52176b02),LL(0xa876fcb1,0xa48ba61b),LL(0x717040ec,0xa24784a2),LL(0x063597d5,0xbbb8ca8d),L_(0x000000e2), LL(0x24d496ff,0xb9c0170d),LL(0xf08c120b,0xee06f00f),LL(0x24a5f375,0x9e3d247d),LL(0x21f556fe,0x23ca02e0),LL(0x9baf2fa5,0xc33aa42b),LL(0x87dfcff1,0x165eef36),LL(0xf9dd5e4c,0x54afa097),LL(0xfe4014f0,0xe713f89f),L_(0x00000058),
+ LL(0x690b2052,0x836e06e2),LL(0x3509fc01,0x7b24d732),LL(0xc3a11a6f,0xf970953d),LL(0xb1e661c4,0x19774ec5),LL(0x1a995696,0xa05e5145),LL(0x777347df,0x1c3c2550),LL(0x77882ae3,0x5a7928a8),LL(0x77fbd07d,0x69195185),L_(0x000000a4), LL(0x41e2d40c,0x16368545),LL(0x29dc25b0,0xfa97fb70),LL(0xb7b7f0ff,0xdec5a377),LL(0x2c841e96,0x205a5df4),LL(0x01390c3a,0xe68d053a),LL(0xa1116c1b,0x83274721),LL(0x62015852,0xe92e4364),LL(0x6a3178e8,0xfafb3a16),L_(0x00000013),
+ LL(0xf2f16fe9,0x75049d40),LL(0x2503f2a9,0x67afd1db),LL(0xe86bcd13,0x1004d640),LL(0x5322f07a,0xf5a688a9),LL(0xb4accb02,0x5af14887),LL(0xe07764b0,0xd65fb0f3),LL(0x03224e24,0x5db913de),LL(0xb8433f0c,0x4e0f4a11),L_(0x00000109), LL(0xf3884513,0xe8ba41a9),LL(0xaded3528,0x8ea44980),LL(0x1a82f302,0x31375544),LL(0x0614f686,0x4f3dc64f),LL(0x8ad34274,0x7f906c7a),LL(0xc479a89a,0xe50987f1),LL(0x17709633,0xaa307609),LL(0x33922a61,0x8a16309d),L_(0x00000035),
+ LL(0x7b97be7b,0xd004b0c4),LL(0xd609efba,0x341b0b8f),LL(0x20475d65,0x373000c9),LL(0x00101859,0x5bcb5ae6),LL(0x518d7514,0xfb3c86f2),LL(0xf5d314f2,0x2c8aceec),LL(0x2307be1e,0x778a0fa6),LL(0x5d168daa,0xebfa491d),L_(0x0000017e), LL(0xa440b9a3,0xa70ba700),LL(0xa47a36dd,0xef6fc566),LL(0x17be0829,0x8e295843),LL(0x63809dc9,0xa317bc2f),LL(0x1a787c34,0xbce26a9e),LL(0x943ad796,0xc651a487),LL(0xe010f911,0x636a6efc),LL(0xcd31e255,0x66b98f88),L_(0x000001af),
+ LL(0xed5ce1f5,0x8d6c9e3b),LL(0x8f008e9a,0x2a13d48e),LL(0xa44f1754,0x32cde8f7),LL(0xaa90e24c,0x8660b8f9),LL(0x3052b86b,0xd73a03c1),LL(0x79244ef9,0xe4f8a628),LL(0xc2475432,0x35d52164),LL(0x9c11d0d4,0x8b588259),L_(0x000001c5), LL(0xb6ab40a4,0x3d6aa080),LL(0x9ca82551,0x92a4dc90),LL(0x8044f304,0x5989211e),LL(0x4878d275,0xc33afe23),LL(0x50bb5ea4,0x2b031b41),LL(0x889e9545,0x4a4f6a74),LL(0xdcce463e,0x6a9c23ca),LL(0x260ab0c8,0x066be87c),L_(0x0000007b),
+ LL(0x2372213b,0x84ab40ec),LL(0xdaad8de9,0xcb476943),LL(0x2dbf8cf6,0x9149cbb6),LL(0x72626b77,0x4935f2cb),LL(0xae5d765c,0x79eb7a36),LL(0x65f4be84,0x44c54fc0),LL(0x2049ba34,0xcbfa4bf0),LL(0x9c904608,0x5711da83),L_(0x000001c0), LL(0xa5d29aec,0x3010853b),LL(0xdf573f6e,0xcdc13fa1),LL(0x9737e298,0x24add1ef),LL(0xa7f64bf7,0x2431c698),LL(0xb2b280e2,0xbdff9a1e),LL(0x93c22a36,0xd70876a8),LL(0x0c7227cd,0xaf483376),LL(0x04873b2d,0x78b4c89e),L_(0x0000007b),
+ LL(0xecb1f89d,0x21b6a936),LL(0xf18c9695,0x805badb2),LL(0x45242b9a,0x2c7430dc),LL(0x7856a265,0x5aacc16c),LL(0x281a24a8,0xbe56330d),LL(0xd8f8608d,0x50d0b225),LL(0x62852160,0x4403a1c3),LL(0x7038362e,0x86d7f075),L_(0x0000010c), LL(0x7dc02e97,0x816727a7),LL(0xca536177,0xc5451dd1),LL(0x304d66d8,0xb89ef533),LL(0x360da6a3,0xe6b58c96),LL(0x3f234bec,0xc18619f4),LL(0xb4bfa580,0x891d516d),LL(0x40c1bed3,0x04f1453b),LL(0x7060a227,0x3adae1e8),L_(0x0000005b),
+ LL(0x30c9a655,0xcf48b04d),LL(0xb68ea01a,0x04344830),LL(0x174d6fa7,0x1ac58a53),LL(0x9044eeb3,0x0524d6f5),LL(0xf87d51a6,0xfb882d4d),LL(0xaa0ba344,0x1ed41d08),LL(0xa85fb93d,0x6086b6ae),LL(0x7fa57f48,0xe80f97f2),L_(0x0000006c), LL(0x596f6fa7,0x2aae9562),LL(0x04813ef9,0xabc183c4),LL(0xded30d2a,0x6a011be4),LL(0x20b7ae96,0x88e77be2),LL(0xbc3e6cfc,0x77d5e0ca),LL(0xac06a92b,0xd7f99c6d),LL(0xc76c3023,0xa80a6be4),LL(0x1d55150d,0xfd7af32d),L_(0x0000016f),
+},
+/* digit=73 base_pwr=2^365 */
+{
+ LL(0xea0d37f0,0xd1a1ebfa),LL(0xb07ea564,0xbce4cf04),LL(0x4677d784,0x74184f2b),LL(0x14a4f867,0x3b8741db),LL(0x00b95ce9,0x35b5960b),LL(0xfae4a317,0xd2c80a76),LL(0x23107ec3,0x0522c4d1),LL(0x8678a9d7,0x19e856cd),L_(0x00000060), LL(0x304b58dc,0x88c3d5f2),LL(0x45f5267d,0xf847248f),LL(0x28ef4e85,0xc0f3da26),LL(0x7945a7b9,0xea2c17e3),LL(0x8a2da387,0xe84de988),LL(0x211a8e98,0x8290c88f),LL(0x75574343,0x6b4ce366),LL(0xca4612f5,0x827b2040),L_(0x0000015d),
+ LL(0x6c7a73bd,0x1e3ef4b5),LL(0x104fc4ba,0x835871e0),LL(0x4759b57a,0x9b4ed462),LL(0xd3c95d4d,0x648a71ee),LL(0x829d8353,0xece81ad2),LL(0xb2a56bed,0x452c12f2),LL(0xb67ec3e1,0x35ab19b8),LL(0x3f8f88bf,0xeb6e6ccd),L_(0x000000f2), LL(0x76062e0d,0x4abff696),LL(0x6641cdd3,0x9b89962a),LL(0x0add12e1,0x9f42be1c),LL(0xa078191a,0x72d9da14),LL(0x7c488cf9,0x607f65fc),LL(0xa7e790e9,0x5cdadd7d),LL(0x83b3584d,0x381ca37f),LL(0x3c6df02d,0xfe16cdd4),L_(0x000000b8),
+ LL(0x3a1e6367,0xfd8b4117),LL(0xcdcf0fd6,0x0c717ef3),LL(0xb3300d01,0x07e608fd),LL(0x527d7c8e,0xe69c0a0d),LL(0xd39cd9ec,0x11bdaf48),LL(0xa5576772,0x5d520c7f),LL(0x92f3c61b,0x1fbf8426),LL(0x814bffe3,0xa920b055),L_(0x000001bd), LL(0x3dc94502,0x8193bb95),LL(0xb1a23052,0xd7bdda5a),LL(0x19650b25,0x4c67c4a2),LL(0x78abb7ba,0xb9dbe10f),LL(0x3eb157bd,0xb3d0ff94),LL(0x1a32ace6,0x8180c4dc),LL(0x9e9b36a4,0xeb0124b6),LL(0xfee72796,0xc1e93da7),L_(0x00000141),
+ LL(0xedaed08c,0x46195fa3),LL(0xbcb9e4e5,0xc31c13ef),LL(0xb2cc8a6a,0x483f2eae),LL(0x912ca200,0x5ee60fa1),LL(0xff0ff27a,0x9e9c56cf),LL(0xdac70a7b,0x4977503c),LL(0xbda5a3e4,0xa564deab),LL(0xfe3a9fcb,0xa761938e),L_(0x000000f7), LL(0x7e821113,0x560a5e57),LL(0x4ec38a12,0xae4b9aaf),LL(0x8358d926,0x1cb5c9a3),LL(0x7b69c24b,0x0e546449),LL(0xc0748541,0x660a2d50),LL(0xa4c426fb,0x87263ee5),LL(0xc286e0b9,0xf7b3ba20),LL(0x4bed6c50,0x9dd6eae5),L_(0x000000f0),
+ LL(0x9263865c,0x4434e163),LL(0xf3a80e48,0x9ca69373),LL(0x9608a668,0xc4b09404),LL(0xb3964738,0xbe4c6ca8),LL(0xe169bce3,0x7c62a7e9),LL(0x4efa6e4a,0xb46b0f85),LL(0xe2e5aeb2,0xe0111694),LL(0x6babf49a,0xb472f5f5),L_(0x0000003e), LL(0x2589af29,0x286fb826),LL(0xc48651eb,0x97cf3fde),LL(0x6f9d0884,0x78bdc9d0),LL(0x16ca5665,0x7e3d1e7d),LL(0x5a2f1773,0xc2f14e0d),LL(0x5e7f3258,0x6606eb12),LL(0x77a28311,0x67442ff0),LL(0xc80cdb6d,0x08ac890b),L_(0x00000177),
+ LL(0x6f4c68a5,0xfaab85ab),LL(0x18a863e0,0x8722f321),LL(0x96627616,0xe3cfe440),LL(0x1b986ba1,0xc819b534),LL(0x03e0ab51,0x7155ab76),LL(0x9cf682fc,0xc9e37547),LL(0x4f4f98e5,0x137f31be),LL(0x3cda736a,0x3a508340),L_(0x00000001), LL(0x91d6868c,0x2e86f052),LL(0x70f48703,0x14f3d533),LL(0x6c353990,0x099af7f9),LL(0x0b2a6c71,0x3d4612fb),LL(0x9b98b62b,0x406a6c59),LL(0xe6249353,0x3b1b8dd5),LL(0xc92d7a1b,0x1f751af1),LL(0xf81ef140,0x4692b4e0),L_(0x000000ee),
+ LL(0x2c9d1106,0xdc34aa30),LL(0xa7bfe1cd,0x28ee1801),LL(0xd18bd43a,0x6d6e3e49),LL(0x52b35eba,0x25fc7059),LL(0x7bfa8888,0xe767a889),LL(0x487fe05c,0xbcac8ca5),LL(0x09996d23,0x52fe2328),LL(0xe81bfb43,0xe19e490d),L_(0x0000006e), LL(0x121f3bab,0xa0be654b),LL(0xd4307448,0x230e8622),LL(0xa9492744,0xcf01fc0b),LL(0xe7b1abae,0xcc98dab2),LL(0x4d9cffdc,0xf6504381),LL(0xe9697cb5,0x506e8f37),LL(0xc3dfae33,0xc253ed02),LL(0x141d1dda,0xb927e31d),L_(0x0000001f),
+ LL(0xd4e2418e,0x60bac026),LL(0xe3153f45,0x08c6a85e),LL(0x8e05a0fb,0xabec7d7d),LL(0x5867d053,0xca6918d3),LL(0x1ebaaa06,0x7d8627f0),LL(0x6ea92220,0xdfe74b9c),LL(0x27dc332f,0x54478deb),LL(0x33ddba7b,0x1e5dc6b6),L_(0x0000017d), LL(0x2feb3b84,0xd254321c),LL(0xbd92cdce,0xae0be12c),LL(0x91edd7e2,0x65ab5fae),LL(0xacef4485,0x607c22ad),LL(0xe3f288c1,0x01e22b70),LL(0xa3baea8d,0xe3598c73),LL(0xc24e3c94,0xf89cd9f6),LL(0x595791d3,0x15c887a5),L_(0x000001b5),
+ LL(0xa048c822,0xbacfe4cd),LL(0xc1680ce0,0xd2bf80ae),LL(0x4efcb3dd,0x3024028c),LL(0x029e5c0d,0x63d006d1),LL(0x5acb256c,0x1d3229cd),LL(0xee644462,0x6e4f2a9d),LL(0x4aa18f75,0xd4fdba43),LL(0x437e2a93,0x45e800b4),L_(0x0000013d), LL(0x7de729a4,0xcdd3e499),LL(0xf4a84a14,0x9fba5f0d),LL(0x87d56bc9,0xa92225d1),LL(0x637de402,0xa9f81afe),LL(0x142558b2,0x2061f42e),LL(0xd09b2789,0x1e15d846),LL(0x8753411a,0xf0c0c378),LL(0x83c3fa31,0x8e19c92c),L_(0x000001ff),
+ LL(0xda11421c,0x8eaf7d82),LL(0x6c3eef0e,0x9224cdcb),LL(0xd8359bd5,0x34b2e501),LL(0x734d08d8,0xd9f7f27c),LL(0x60136559,0xa91fd047),LL(0x7da1c7f8,0xcb1bc103),LL(0xf3f7e7c7,0x65c241e1),LL(0x7555ce39,0xf11e10f9),L_(0x00000055), LL(0x6b91fc57,0x5484eacb),LL(0x8a825cda,0x888b470b),LL(0xf0a2ebdb,0x81202cfc),LL(0x3ac37a5b,0x05c01038),LL(0xfe8f11c9,0x5bf196e7),LL(0x76123e92,0x19cd94ed),LL(0x353febf7,0x9c972db2),LL(0x65d70280,0x988f859d),L_(0x00000064),
+ LL(0x217d03c5,0x56db67a5),LL(0xf3d76a7f,0x992b8bdf),LL(0x4fb50dfa,0xf9702a82),LL(0x5593b5d5,0x9088a3ea),LL(0x0ef00d4d,0xbf26b47f),LL(0xeb497149,0x0793417a),LL(0x58262023,0x465f75db),LL(0x4abc908a,0x2c6c549e),L_(0x000001e0), LL(0x1667b32f,0x4ef57c25),LL(0x0a4bdcb0,0x6e8c095e),LL(0x696391d7,0xabbc605b),LL(0x1dd44220,0xc3e47f6e),LL(0x38adb47e,0x8f35f645),LL(0xd3c084d2,0xf253b25e),LL(0xfaa3b241,0x0b53ca2e),LL(0x2e3d4cbe,0x6c56c789),L_(0x000001f4),
+ LL(0xf26ba24d,0x0d68d639),LL(0xbc6bcbf3,0x76bdcf5c),LL(0xd445a425,0x4ce8f583),LL(0x036223e7,0x12c0333e),LL(0x6b6c4cf4,0x411cd547),LL(0xfa6d4a89,0x6d3fb3c8),LL(0x7e41166b,0x906f6895),LL(0xd5a83001,0x28190a6a),L_(0x00000076), LL(0x33fa874d,0xdb9b9bf4),LL(0x6efa8bd8,0xc1467c44),LL(0x78067572,0x41957d49),LL(0x68a286e7,0x4563827a),LL(0x3562fe94,0xd87962e4),LL(0x5b2ba1f2,0xbce9e3b5),LL(0xeb40dfc9,0xedcbc4f7),LL(0x6ddd5a2c,0x2d14704c),L_(0x00000009),
+ LL(0x70bab965,0x738ba18f),LL(0x90ebea6a,0x3526ec84),LL(0x544312d2,0x606e765e),LL(0x4f7ce18b,0xe015cac8),LL(0x0b6de72b,0xea01d5b4),LL(0x2ff4bd72,0x0c7eba91),LL(0x90d594c1,0x8a32c97a),LL(0x881a1a5b,0x326bf5cb),L_(0x00000188), LL(0x8272c1c5,0x72a5ff2c),LL(0x0ff0a2ad,0x4bb6c7a4),LL(0x640ae3bc,0x87804672),LL(0x00da0040,0x94aaf22e),LL(0x2ebbcebb,0xd8f3e9bf),LL(0x8646dab7,0x40c90d99),LL(0xd08b3434,0x8f9d970b),LL(0xd1f0de73,0x2362e1e3),L_(0x0000004a),
+ LL(0x893123ae,0xc8b47342),LL(0xedaef283,0xde3df2dd),LL(0x303757c2,0xc96f2592),LL(0x089845fe,0xa0d3f290),LL(0x18b0b508,0x4bf7b214),LL(0x93c88975,0x3cd67758),LL(0xed218a4a,0x81a61b63),LL(0xfa78dcc6,0xdc5a49e5),L_(0x000000ff), LL(0x90ce8d10,0x6c24429c),LL(0xe40a36fc,0xc3ad8e81),LL(0x6178bcf5,0x16d9b177),LL(0x488d2cf8,0xc063b1e0),LL(0x57f41dcf,0x1cbca7c3),LL(0x200bb41d,0xec7a80d6),LL(0xd6366c22,0x84ceffb4),LL(0x66439f2f,0x6b57b092),L_(0x0000016f),
+ LL(0x869f06cd,0x97f9882a),LL(0xaa57537b,0xe3b1c07d),LL(0x917cf4ff,0xf6d1aa12),LL(0x2683a59f,0x73bca1f9),LL(0x613d785e,0x496708d8),LL(0x66ede999,0xf45fff24),LL(0x4e9727c1,0xf71c4572),LL(0x39995099,0xf55978fb),L_(0x00000090), LL(0x60222373,0xf249fc50),LL(0xdb62572f,0x95b4f7eb),LL(0x4efd7ca7,0xb4994b20),LL(0x0762c1c5,0x99292d14),LL(0x4d4c1985,0x140a608e),LL(0x7f0ba7f9,0x489023fc),LL(0x77e472d8,0xac039583),LL(0xca8aeb86,0x303e3f76),L_(0x000001e6),
+ LL(0xa1cd049d,0x859af0b3),LL(0x32b70dbe,0xd9aa6b96),LL(0x83656cba,0xa5229dc4),LL(0x02bc7ba1,0x574b487d),LL(0xffc68a06,0x9518ff35),LL(0xad36470a,0xaf20c720),LL(0xcf8b908a,0xee3bb49e),LL(0xf8b9d88a,0x204ddf66),L_(0x00000075), LL(0xc04ae92a,0xff799aa5),LL(0x352ca9e2,0x48de6d0a),LL(0xeb0f3051,0xe2b8f5f2),LL(0xa98f1062,0xdfe726fe),LL(0xc285eca4,0x22419400),LL(0x527244d3,0x441ba1f9),LL(0x3ec0c841,0x9ac0f611),LL(0xf7b09376,0x483ffb67),L_(0x00000159),
+},
+/* digit=74 base_pwr=2^370 */
+{
+ LL(0xce2d58e6,0x4fd2b399),LL(0xe56a0a18,0xd46ffafd),LL(0x43a772e3,0x61832664),LL(0x5e99ec73,0x5a652a9e),LL(0x068acc97,0xda22ced1),LL(0x829eb99d,0x17534159),LL(0xc94c616f,0xf6ab0176),LL(0xa334609d,0xf8e1dfbd),L_(0x000001bc), LL(0xf0e586eb,0x03144a03),LL(0xdf49ef2f,0x70d82d13),LL(0xf054795a,0x3d4fad35),LL(0xca4e83c9,0x7178dcbf),LL(0xdccd2e81,0x06f96d5d),LL(0x059906d9,0x99860a4c),LL(0xb0cc8989,0x0b7c4473),LL(0xc7a2422f,0xc031d2a9),L_(0x00000158),
+ LL(0x990d40ea,0xfd292d5f),LL(0xfe2aa0bf,0x0b3c033e),LL(0x350ffa07,0x7093caf5),LL(0xcba18d05,0x8e77aa62),LL(0x5de1ef34,0x8dcafce9),LL(0x8d305062,0x54c13b97),LL(0xa2184206,0x024b7581),LL(0xc1eed7a3,0x7a430aeb),L_(0x000000fb), LL(0xd2467c3c,0x5919f6e7),LL(0x6f3a2cc6,0xe4ef4ee6),LL(0xd95dc335,0x8b15339d),LL(0x53862418,0xc47f7183),LL(0xdc9f6ee9,0x0164075a),LL(0x8fc3c2d0,0xfb8c9b9b),LL(0x82f15ec0,0x2cab4250),LL(0x6da80b24,0xef0f9370),L_(0x000001fe),
+ LL(0xce799013,0x9e5e77aa),LL(0xdc0e8efd,0x74901979),LL(0x87335bd4,0x8d25ae87),LL(0x7663b155,0x30b14eb3),LL(0x42427def,0x9f7acb63),LL(0x504e9e47,0x8f787f03),LL(0xb68c9ee0,0x9fb2d8ed),LL(0x3fafed1d,0x168ae687),L_(0x0000008e), LL(0x84c837fd,0x1b05f526),LL(0x361ad6ff,0xa178f8a8),LL(0xba6a96b6,0x0afa0765),LL(0xf1a53f48,0xee02b40e),LL(0x455203e1,0x280a052e),LL(0xa80a8929,0xcc11be29),LL(0x6815682d,0x4811eb83),LL(0xd7ede303,0xae7746c4),L_(0x000001bd),
+ LL(0x33981c54,0xcebb5e69),LL(0x32546345,0x544b1b16),LL(0x84cafbc6,0x7981b01f),LL(0x5cddc181,0xaa139311),LL(0x1378ad86,0x68cbb494),LL(0x7e2675fe,0x588ce3ac),LL(0x7f2694e9,0xab708d62),LL(0xeda381dd,0xea9b5a9d),L_(0x00000155), LL(0x31d5f56f,0x1a13df6f),LL(0xcdb4564c,0x02f2a54c),LL(0x586ae362,0x19118f47),LL(0xdb9ebb1f,0x7fa3e3f6),LL(0x0b71b651,0x82c695b0),LL(0x82ecf8c2,0x58306aa8),LL(0xc8a72bb7,0x24bb71fa),LL(0x1671f4f9,0x8041f535),L_(0x000001c7),
+ LL(0xccfdb09e,0x9138999d),LL(0xfc40b806,0x190da0c1),LL(0x248d01f8,0x660fe973),LL(0x04db0124,0xd2a3e26a),LL(0xae1441c8,0x3b5b69d9),LL(0x542d784a,0xe47e9fb1),LL(0xc8706904,0x07fd3e18),LL(0x7b0252dc,0xac397897),L_(0x0000003e), LL(0x9bf565f8,0x7a07a372),LL(0xb2a08e69,0x88b9b9fe),LL(0x23737883,0x4af5f0ac),LL(0x3ee2589f,0x4d74831e),LL(0x0c99ecfe,0xe461011a),LL(0xccb75730,0x5f6ac945),LL(0x44dfe861,0xde67a0c4),LL(0x0a4190dc,0xc1f45c07),L_(0x0000010a),
+ LL(0x8eb6ed93,0x8217bc59),LL(0x480c8b3d,0xf9f73e7b),LL(0xed85e1cf,0xa742114e),LL(0xff0dd45c,0x5d90782b),LL(0x6499236f,0xa8a56eb6),LL(0x81a46542,0xc0a1d718),LL(0xb645bf88,0x5ad3645d),LL(0xda5b3451,0xe35c84b5),L_(0x00000062), LL(0x8177efc2,0x91a87849),LL(0xd64e2a8c,0xb25866c7),LL(0x7fcea597,0x7ba86329),LL(0xf0a84157,0x4ae784c7),LL(0x6d45e6a0,0xe8a4e8e8),LL(0xbad02a45,0x2b8a78de),LL(0xcb445d9a,0x1a096a8f),LL(0x1c606af7,0xcd9a146c),L_(0x000001e4),
+ LL(0x9ad71dbf,0x013860f9),LL(0xefc2f3af,0x0bf5cd2e),LL(0xcc51df06,0x366cecf5),LL(0x8b6d4774,0xff5f3234),LL(0xb320cd40,0xa48903e0),LL(0x331e170d,0xf463c308),LL(0x7b602dac,0x3d097dcb),LL(0xca3b41f6,0x1437b881),L_(0x000001d6), LL(0x1f06f98d,0x9812b78b),LL(0x0835cbf9,0xa1b46e69),LL(0x96985a6e,0xc756e3cb),LL(0x8c83dd55,0xe0033ed2),LL(0xc71730ab,0x7a46dc00),LL(0x333b6de9,0xe8045912),LL(0x8f656577,0x4a453d9c),LL(0x385fe0c5,0x9c113ca9),L_(0x0000014a),
+ LL(0xcb831835,0x9d0103c9),LL(0x47a18b26,0xbca486ca),LL(0x2d151fe9,0x8a31af06),LL(0xc2bcd6c3,0x4c38dae7),LL(0x6a2dd494,0xd0cab5f5),LL(0x0e8dd5e2,0xaaffb6b8),LL(0xf1aa0451,0xd1b4ab87),LL(0xd7ec926b,0x23418baa),L_(0x0000000d), LL(0x61149962,0xd2761793),LL(0x4dbe67f0,0x5f42f5e1),LL(0xbdaa4d19,0x9aea3745),LL(0x2770c1ff,0x336a10b0),LL(0x730746fe,0x965986ef),LL(0x500d5a19,0x98b61ae7),LL(0x2c56a5b5,0xfbc2b7c9),LL(0xf20ece26,0x484287c0),L_(0x00000016),
+ LL(0x47a76498,0xc197a42e),LL(0xa29d1821,0x8a2704b7),LL(0x54a27b18,0x6d7a65e1),LL(0x382392a3,0x6e25e555),LL(0x583ca3d8,0xba1298fb),LL(0x92305de9,0x8762634a),LL(0xc416a724,0xe3560751),LL(0x52b73064,0x9264b444),L_(0x0000019b), LL(0xd4b7caca,0x4fc9c7a4),LL(0x0d61d52c,0x88ca3d7d),LL(0x39c96801,0x9d85c914),LL(0x072c2d52,0xeae1af66),LL(0xdc7e4834,0x4567d964),LL(0xcf69cc8b,0x225a1435),LL(0xec05edf7,0xcf0fd41b),LL(0x16674dc5,0xa580cfec),L_(0x00000120),
+ LL(0xc929fb7d,0x666eee50),LL(0xa82ad2d3,0x943d9f3f),LL(0xe959c5db,0x01361c6c),LL(0x413dcd10,0x810dc990),LL(0xba8e95a8,0x111bfce1),LL(0x144ccf37,0x37942ccc),LL(0xbba23cc8,0x6250c86e),LL(0x64797a98,0x95ec8524),L_(0x000001d4), LL(0xa61fd6b9,0x324caf26),LL(0x208fb38d,0x802296a3),LL(0x923005fe,0x1cab4d64),LL(0x545d2ffc,0x7edf08f3),LL(0xfd85bdf3,0xbbb0b3e1),LL(0x9feb12a7,0xab0ed8c1),LL(0xeb4e517d,0x45179c50),LL(0x5c75791e,0x1bac0194),L_(0x000001cb),
+ LL(0xebddb001,0x809051bf),LL(0x932eff69,0xb46ff016),LL(0x5ce81f11,0xb49261d6),LL(0x39183971,0x75ef3047),LL(0x65753518,0xefad1e5a),LL(0x7887db59,0x147b2e1c),LL(0x6c93b47e,0x239259f0),LL(0xb5f34e30,0xe56b4fc3),L_(0x000001c8), LL(0x905217df,0x861e1dc6),LL(0x9fada5a7,0x3986b470),LL(0xf9e88cd0,0xcaab1d92),LL(0x839c290b,0x02e99a54),LL(0x39b3ffa9,0x910523a5),LL(0x655e6f7c,0x42d47f30),LL(0xb367bd8a,0x1e0a7f1b),LL(0xe25d7561,0xb79355b2),L_(0x000001ad),
+ LL(0x4987e69d,0xd0493c78),LL(0xba0a5cbe,0x59557a83),LL(0x75bbdb17,0xf2acabc4),LL(0x65e4a623,0x8bf3c53d),LL(0xd71fb7df,0xc8eb2466),LL(0x7545f576,0xc6d8140f),LL(0x620a0123,0x9f02bd4e),LL(0x67837a46,0xbdab7cb9),L_(0x000000e5), LL(0x8b871f92,0xc2538248),LL(0x4b3a3a4d,0xef93af7d),LL(0xdbf730c3,0xbfd3ed77),LL(0xf764526e,0x07f935a6),LL(0xcb6152b4,0x1c016476),LL(0x2bf32571,0xdee3ad5a),LL(0x88aaec73,0xfb09ed56),LL(0x5a614fc9,0x9f8877cb),L_(0x0000002d),
+ LL(0x7c127a9f,0x26712a11),LL(0x642533c6,0xf98c4d57),LL(0xc60c2ae3,0x65b1d46e),LL(0x444527b6,0x71dbb3f8),LL(0xe33842c0,0x4381ace7),LL(0x9e839852,0x6a3b078e),LL(0x2c3ba212,0x4de7e214),LL(0xed5d5463,0x3d30ea71),L_(0x00000163), LL(0x2312ab46,0x8e3acd07),LL(0x631b2001,0xb498759a),LL(0xcc66ba39,0x22f04bfe),LL(0xd634fae4,0x0f57a006),LL(0x6fb05b0c,0xd36ff867),LL(0x74e2535a,0x85b24cf7),LL(0xe1ec7865,0x1a8674c2),LL(0x8caeb36c,0xac17ecae),L_(0x000001bc),
+ LL(0x41ce000d,0xbbc4d762),LL(0x3f8e4f4a,0x850dfa23),LL(0x315d2f3b,0xc39228da),LL(0x146ba937,0xe938195d),LL(0x05ba80b7,0xa6946ca0),LL(0x5996d5e9,0x8582cc92),LL(0x20830fe7,0x9fbffd5e),LL(0x49bd8864,0x35f18f3a),L_(0x0000016f), LL(0x52a9ca5f,0x342678f8),LL(0x0fde0f1b,0x03e8057f),LL(0xb03f731a,0x68041b2c),LL(0xc1b65ef3,0x5e348390),LL(0x812a39aa,0x6058d643),LL(0x85301a5f,0xf291dfe0),LL(0x3f43fec2,0x4f9f3872),LL(0x0ea19231,0xfc5949c4),L_(0x00000109),
+ LL(0x2071dbfe,0x4b89bb6a),LL(0x243135cc,0x0ff935bd),LL(0x7a1a0770,0xe0c7a9ac),LL(0x227a5593,0x6dd5bad8),LL(0x3493e1c5,0x8ba3715d),LL(0x35c53b09,0xc6b271ea),LL(0x744d2bd3,0x2e9feb1a),LL(0x214dd692,0x2db119cb),L_(0x000000b1), LL(0xeec6e175,0x1f9d847f),LL(0x63ead5ad,0x5419e32c),LL(0xd6156a57,0xe233586a),LL(0xe66a5622,0x39029648),LL(0x4092e8b6,0xbf26b933),LL(0x1e5f719a,0xcd5ad746),LL(0x4f5fc4b9,0xf552f21c),LL(0xd86c96b0,0x997ee591),L_(0x000000b3),
+ LL(0x9ad2983e,0x090fc8d4),LL(0x3313e6f8,0x55cd8ed4),LL(0x8651d168,0x6a906312),LL(0x55315e35,0x591a919d),LL(0x83731bdb,0x5172884d),LL(0x209c90f3,0xe2ac6b9b),LL(0xfbd125cc,0x92e9decc),LL(0x7d19839d,0xff6024c6),L_(0x0000016a), LL(0xed7835fb,0x29318405),LL(0x7858c38c,0xc88969fe),LL(0x39c13839,0x9e3d9e6b),LL(0x193b8588,0xa0e5421a),LL(0xe0167b73,0xc6ebad78),LL(0x3cbbe3a6,0xea506121),LL(0xa8cbcf0f,0x20f99af7),LL(0xdbdf82d3,0x2e935934),L_(0x00000010),
+},
+/* digit=75 base_pwr=2^375 */
+{
+ LL(0xa97c0378,0x851811ca),LL(0x042ad325,0x0425fd5a),LL(0xae223e37,0x93b83181),LL(0xf721e5a1,0x90e949dc),LL(0x0e3457f0,0x3df6a852),LL(0xb654bab8,0x5f22447c),LL(0x720ad354,0xec0dfbcc),LL(0x64eddb51,0x81daf300),L_(0x00000178), LL(0xa97e2d48,0x5a22dda9),LL(0xa660386d,0x4ad7ed63),LL(0xf4eac86c,0x0e9bdfd6),LL(0xa0b3cfe9,0xf3d0576e),LL(0xb9746e43,0x38598ede),LL(0x5a4f247c,0x6c63f53c),LL(0x9110d7d6,0x937de7ce),LL(0xedc5628f,0xd7ef1580),L_(0x00000149),
+ LL(0x07ceb75a,0x22d17ed3),LL(0x1d003cd4,0x816d46db),LL(0xacb6fef8,0xb000a452),LL(0x9bbe93ac,0xa33425cb),LL(0x8e7044e1,0xd94105ed),LL(0xbf04fc32,0x7b448d72),LL(0x8a8006d7,0x77527b27),LL(0xce1c27af,0x481ed3f3),L_(0x00000072), LL(0xede21a04,0xbea8a562),LL(0xfe905ba2,0x7dcaa390),LL(0x8bd01814,0x8c2e3be5),LL(0xad37906a,0x4bd6ba24),LL(0xe4147c93,0xab35993e),LL(0x54b18700,0xeb32c196),LL(0xc4b62833,0xfde9fb6d),LL(0xefce4982,0xfd482fff),L_(0x00000009),
+ LL(0x326389a5,0x8c87ee07),LL(0xc8d06b64,0xf1eb33ca),LL(0x9f6c9bde,0x905394b5),LL(0xe7cff087,0x9daef572),LL(0x15defa0d,0xdcb4d146),LL(0x48372dac,0x9d9bc2a2),LL(0x558be40e,0x918fbab0),LL(0x093092b7,0xd1e9cb05),L_(0x00000158), LL(0x80e77a4e,0x1e399561),LL(0x7faf6193,0xe636d3ab),LL(0xe0b54eab,0x0991ea6a),LL(0x12db09ef,0xe300cb6a),LL(0x2c4871c5,0x5b2c3ec2),LL(0x74b476ca,0x01ab0f81),LL(0x571997b2,0xe7647206),LL(0x7f0593e9,0x19083320),L_(0x00000084),
+ LL(0xcb8ddce8,0x53953842),LL(0xc94eac86,0x510be22e),LL(0x18af52b2,0x5204fc68),LL(0x6cd384c6,0xb08bd4d3),LL(0x40918e38,0xbbca8f66),LL(0xc2ac8cd3,0x9b3d5866),LL(0x2e4fdaef,0xbd15b5a2),LL(0xcebfa696,0x2334128f),L_(0x0000013b), LL(0x8986becf,0xa9f4f0a0),LL(0xb5bde2b0,0x2781857a),LL(0xf623a384,0xf48f7d34),LL(0x2fc32d5d,0x5aed2eab),LL(0x3357b29a,0x85d8000c),LL(0xd7a02a4f,0x47c091a8),LL(0x83e2289a,0x748c8758),LL(0x78f3991d,0xb7dfe04c),L_(0x000001eb),
+ LL(0xe09895cd,0x8dc487b8),LL(0x1ee06c73,0x4cd52925),LL(0x3615a586,0xb40cf5e8),LL(0x67c6302f,0xe2444c40),LL(0xad0f9fd1,0xf79a9138),LL(0x21560ea8,0x53b1f139),LL(0xdfcbf2e3,0x42f5c15e),LL(0x937e18f2,0x4b1cf2d1),L_(0x00000141), LL(0x2b5822b9,0x4289e6fd),LL(0xcce11b47,0x6b3fbfe6),LL(0xfc6c35ad,0x42db4435),LL(0xf40269b9,0xd9e6571d),LL(0x052ecbf9,0x43b34e97),LL(0x85c17cbf,0xc1ac2947),LL(0x2cf45704,0xb8e4df72),LL(0xccda58a9,0x77f6ed90),L_(0x00000164),
+ LL(0x736929bd,0x2018c224),LL(0x183d085f,0x4be72094),LL(0xb8504d5a,0xa1b86c43),LL(0xb6f18e21,0x4ff46986),LL(0x6ad297dd,0x8a9142ac),LL(0xaf090f36,0x09fe86be),LL(0x3b6921ae,0x3c8c552b),LL(0x953006e9,0x8c728bce),L_(0x000000e1), LL(0xaf72ac6e,0x80956c6b),LL(0xfa741157,0xc4c2c5f7),LL(0x5e9870c9,0x7ec1eba5),LL(0xf57cfca1,0xc10b4b60),LL(0xa6e490cc,0xb0618cc6),LL(0x39e98a9d,0x31fe5f00),LL(0xf0f53611,0xb1970dbc),LL(0xa442baa6,0x0c613700),L_(0x00000000),
+ LL(0x90a308db,0x61cca596),LL(0xcbaa218f,0x6743511c),LL(0x6574da13,0x71c34c1b),LL(0x50cf99a2,0x570b3140),LL(0x8ae9a0ed,0x8fffc78b),LL(0x816fb1cc,0xe8d131b4),LL(0x052abb5d,0x64b0d1f3),LL(0xe564075c,0x02a02c6f),L_(0x0000014e), LL(0x5fb1b653,0x57fab65e),LL(0x72bc2ab8,0xcd37e51f),LL(0x6c8bb1d5,0x57d81547),LL(0x75b37fd5,0x572bd385),LL(0x1441e8d8,0x0eb239d2),LL(0xd5a6c392,0x7cc7ae14),LL(0x16b857f6,0x7141c32a),LL(0x931901c6,0xd7fbdf6f),L_(0x00000041),
+ LL(0xe53ec842,0x16678799),LL(0xeb3f78fb,0xdb8c26f2),LL(0x1091298b,0xe09307e4),LL(0x265d3b22,0x79682bc2),LL(0xf829161a,0x8a62536f),LL(0xdea99410,0x002fb6de),LL(0x3d369ec2,0xca79fdbc),LL(0xf58b2f20,0x3d6462ba),L_(0x00000130), LL(0xf756d9fe,0x61419646),LL(0x9934641a,0x308b017c),LL(0x5de627fc,0xbea2b76a),LL(0x23ee7d29,0xba8603cb),LL(0x6ab47900,0x85c79476),LL(0x004b96bb,0xf41684cc),LL(0x94d547ed,0x8b7656ed),LL(0x2003142b,0x30eaee30),L_(0x0000014d),
+ LL(0x8759d864,0xfb67c7fb),LL(0x0407a03f,0xfb9982ce),LL(0x020231ea,0x55103874),LL(0x9d3dc0fe,0x9a32c3ea),LL(0xc54c5166,0x8e76b967),LL(0x7422e59f,0x538d7969),LL(0x1567215f,0xc1772e51),LL(0x1bee3ac0,0xeb37df59),L_(0x00000159), LL(0x44e31ef8,0xeef4a1e2),LL(0xf4d1de52,0x78709a3f),LL(0x144880f0,0x90e1bf50),LL(0xc5a2e2e7,0x6576ad05),LL(0x963afdb1,0x858a5053),LL(0xfb62a6ae,0x720e44be),LL(0xf7d3d903,0x85ea2a35),LL(0x1ce3e300,0xbc7fd8b2),L_(0x00000178),
+ LL(0xc85cdf02,0xe346fabb),LL(0x2b0945e1,0xe07629de),LL(0x76a1e2b5,0x45e5724f),LL(0x43bc885c,0x6f8c506b),LL(0xbd1f5350,0xc4a247ae),LL(0x9759458e,0xe8c49a8e),LL(0xad9f81fe,0xef961f24),LL(0x0789ce81,0x4d378c78),L_(0x00000045), LL(0xbdac3a5a,0x0d120ebb),LL(0x2f38cfe3,0x29a29c91),LL(0x470f8673,0xa93d27e5),LL(0x85f54b6a,0x347ce7f7),LL(0x869bc2c6,0x681c6e83),LL(0x240291c1,0x5f895132),LL(0xd778a681,0x9354c132),LL(0x35657182,0xd9159913),L_(0x000000a6),
+ LL(0xdc0c7615,0xd08ada52),LL(0xf64fa06b,0x6fe343d4),LL(0x0f9f191b,0x269d74ba),LL(0x2b582fb8,0x3e1302f6),LL(0x4f3fa209,0x3dd58666),LL(0xbaec4e8c,0x2346df80),LL(0x2addc663,0x961745b5),LL(0x6358e5f3,0x18d6fbc0),L_(0x000000c0), LL(0xbca3dd73,0x0f473bff),LL(0x97d4d8fb,0xcbcc7f23),LL(0x592d62f3,0x8c21a728),LL(0x2d18d7d2,0x08669251),LL(0x5acddad3,0x10138815),LL(0x5eb1d5da,0xaf710391),LL(0xf88b7078,0x200a8738),LL(0x9614df01,0x7fc7b078),L_(0x000001a8),
+ LL(0x39f8e71a,0xf8ccaa40),LL(0x89f9fde7,0x4a565eb3),LL(0x3a88c7c8,0x2241445b),LL(0xb88e20b6,0x0479b1b1),LL(0xe22d8db0,0x96695cdc),LL(0x02fe3690,0x48a70132),LL(0xaba6a66d,0xafe3713b),LL(0x5be868e0,0x4959a9b6),L_(0x0000007a), LL(0xc518718a,0x3e38b8c6),LL(0x00a613fe,0xee16d3bd),LL(0x8bab2dac,0x5f51a73a),LL(0xecd0dde7,0x5d598b1d),LL(0xf9a19d5d,0xcc2ed8e1),LL(0x74ed2f5d,0xb66c7686),LL(0x1a036457,0x45717b78),LL(0xeb14d9fd,0xebae3cd5),L_(0x000000c6),
+ LL(0x42bb5d7b,0x69ebb0a9),LL(0xf6f6e0b1,0x24c217db),LL(0x751a1bfd,0xd4eab425),LL(0x1570cf87,0x46afeada),LL(0x55c17749,0x84f69779),LL(0x72264346,0x0e0b6e91),LL(0x43f9c928,0x2a080641),LL(0x5face2cd,0xd6f99ce6),L_(0x0000011d), LL(0xb97b52aa,0xb84b4c35),LL(0x079d267b,0xea1ade5e),LL(0xfd3d3470,0x64da3bef),LL(0x603b5d99,0x4e2ca35b),LL(0xc90c1bef,0x267ee929),LL(0xa4dcd6fa,0x2e371559),LL(0xeadf09d2,0xdc90620c),LL(0x7ae7bd5e,0xa0074931),L_(0x00000049),
+ LL(0xe19a4c40,0x3bef2c63),LL(0x57c68d2d,0x922215ae),LL(0x03e85348,0xb54763ee),LL(0x7a4a0d2c,0x4381fb33),LL(0x747d2320,0x3d971222),LL(0xc828be44,0xd96627f6),LL(0x6d1199b7,0xabfb6b5f),LL(0x3d2170b3,0x7e019a43),L_(0x00000146), LL(0xbb1d3366,0x8c946a2e),LL(0xa111d7a3,0xb29fb103),LL(0x75997def,0xa9647d36),LL(0x82824e10,0xa45fdefd),LL(0xf29d6d05,0xa9b94f37),LL(0xe35c500f,0x317e08c1),LL(0x4c601022,0x2a6ed921),LL(0xa2afcd4a,0x376d3ee0),L_(0x0000012e),
+ LL(0x14a651b3,0x6443bb77),LL(0xc4e092bf,0x3d523243),LL(0xb725b204,0x563f7657),LL(0xf0d19ab6,0x6dd80a2f),LL(0x0c09a035,0xa3a7805c),LL(0x72bfb218,0x767659a8),LL(0x5001304f,0x06ad0ad0),LL(0xae6cf2cf,0xa76a4e48),L_(0x000000c0), LL(0x73b1275f,0x58294610),LL(0xf2619fd4,0x12455781),LL(0xc2991198,0x822a98ac),LL(0xc52b1be7,0x6f92e55b),LL(0x85c5dde4,0x6f912a88),LL(0x71070200,0xc6ff80dc),LL(0xed86ff4f,0x5fb4c0fb),LL(0xf6cd415c,0xb7ec4feb),L_(0x00000025),
+ LL(0xe13291f0,0xa731176a),LL(0xc2f095b8,0x53e5b4c8),LL(0x22d8f01b,0x9b8d5a23),LL(0xf09c9053,0x6cfad192),LL(0xac4c2264,0x016016f3),LL(0xc2d48df5,0x500c56f4),LL(0xbed57312,0x206618c9),LL(0x249d3807,0xcc5fef52),L_(0x00000059), LL(0xa752bb21,0xa854f0db),LL(0xad82109b,0x2bd9fbff),LL(0x39d0e928,0xe612cee3),LL(0x5cfc63fe,0x3aca9e51),LL(0x18541bf3,0x0fd5f823),LL(0x1df11f0f,0xdccc44f5),LL(0xe5d7f0f8,0xc8e26d92),LL(0xdc204c43,0x7278c334),L_(0x000000c9),
+},
+/* digit=76 base_pwr=2^380 */
+{
+ LL(0x90df775a,0xa877dfb5),LL(0x0e8c657f,0xf628f95d),LL(0xc58775b2,0x1f94b622),LL(0x55966c52,0xd94ba3e7),LL(0x2b826bca,0x536e1836),LL(0x1429585e,0x6a8bf64e),LL(0xab9cff45,0xfdc0d065),LL(0x7ad254f1,0xd4d31c6b),L_(0x00000099), LL(0x10be2241,0xa869cd60),LL(0xb5cc49f5,0x399cde94),LL(0x029dfb84,0x53bc96f6),LL(0xc7d08220,0xf3d33d68),LL(0xb6cb5f4b,0xd70bd72f),LL(0x81e790ba,0x5f85b782),LL(0xd6b87ddc,0xd6fbd3aa),LL(0x9bddab2f,0xd049e67e),L_(0x0000007c),
+ LL(0xcff0963f,0x1215b91a),LL(0x7ce3e2ea,0x276c4b8c),LL(0xae4d76fd,0x27c2c599),LL(0xcf3a3b9f,0x985a8106),LL(0x706667b3,0x3dd5545f),LL(0xe5bf95ab,0x9ae8ea63),LL(0x5a494d9e,0xac8eb301),LL(0x36df8e2a,0x0aa3c14b),L_(0x000000cb), LL(0x241e0605,0xec384ae0),LL(0x19fc3d54,0xbfb3e2ee),LL(0xce0a2d7c,0xa5ac041b),LL(0x7e0aa0d1,0x22b978b5),LL(0xcf6adf10,0x50508726),LL(0x13804525,0x77d6d81e),LL(0x02fbac9b,0x34536c98),LL(0x6666d2c2,0xdd6867d1),L_(0x000001f2),
+ LL(0x0fd75964,0x2c167fba),LL(0x79fb34e2,0x68658968),LL(0x3d2ac14b,0x6bb85f11),LL(0xf9265032,0xe567c4fc),LL(0x09815c6a,0x30478f2d),LL(0xb2da7033,0x2d4e045b),LL(0x7450186c,0xeb491702),LL(0x3d6ff5bb,0x394b01cb),L_(0x00000186), LL(0xa96aee5e,0x7fa7f974),LL(0x54b866f5,0xd445b199),LL(0x7edd540d,0xda3cc41b),LL(0x6672b9ea,0x3c302e2f),LL(0xf5adb45c,0x5ea3de1b),LL(0x201f8535,0x70efd3fa),LL(0x9bc11d2a,0x3d2e2804),LL(0x4d97e055,0x461aca9e),L_(0x000001ac),
+ LL(0xdb5aaa83,0x020dd38c),LL(0xf16c4ef4,0x0a2db89c),LL(0xa5cd426b,0x43e8b727),LL(0xf5617c8e,0x23ddc0ba),LL(0xb43d6e58,0x259e17f2),LL(0xc826180e,0x06737413),LL(0x55f63ef5,0x434e7412),LL(0x23e6163c,0x6e327096),L_(0x000001c1), LL(0x9695e5ae,0x47505a19),LL(0x6e1e36e5,0x74ec16e2),LL(0x43d8b0e2,0x4831814a),LL(0x037ed439,0x5b1a104c),LL(0x375672e8,0x5bc4b456),LL(0x9fdc64a0,0xf4e8604b),LL(0xdb5b0994,0xa1d8d54c),LL(0x035e5850,0xc99108d7),L_(0x00000018),
+ LL(0x6b6358ca,0xae97ec9d),LL(0xf89cd326,0x96931bf3),LL(0x0db33ff8,0x1728a8a2),LL(0x5df6988b,0x8b413bf1),LL(0xc9cd5efc,0x7876052f),LL(0x980dbb18,0x662d8014),LL(0x7d44d414,0x56d9235f),LL(0xf0c89214,0xc3bb2edf),L_(0x00000183), LL(0x7d2553d4,0xd43349dd),LL(0xc275fa25,0x98c5095d),LL(0x7e9d6a23,0x5dae8169),LL(0x48607095,0x004d6221),LL(0x0de66e5e,0x88753853),LL(0x407e61fc,0x0cbeddeb),LL(0xb1e576ab,0x85968acb),LL(0x6df65046,0xd7b6cee3),L_(0x000000d4),
+ LL(0x1d1376b4,0x2c927fc0),LL(0xf4b1b912,0xcb3e3200),LL(0xd6a633a1,0x54477db8),LL(0x4c991410,0xbf0c1c32),LL(0xa9a4d4dd,0xda008df0),LL(0x30c04f89,0xf68e5507),LL(0x1a10f51d,0x5ce5c51e),LL(0x41031547,0x5069b8da),L_(0x000001be), LL(0xdec76b03,0x4ca12b9b),LL(0x53a8bf3f,0x4e3a3297),LL(0x6ef86a89,0xc5a499c8),LL(0x38a372fc,0x97d666c8),LL(0x6ec44e4a,0x41b99123),LL(0x95600ea2,0x650c8dbf),LL(0x4eb71cc1,0x4c7627fd),LL(0x54f79c84,0x0226e786),L_(0x0000002b),
+ LL(0x69ce7225,0xf1a6e969),LL(0x77785cf6,0x9cc6268e),LL(0xc7d8303c,0x2b8308ef),LL(0x6b0e5276,0xcba9dc8a),LL(0xa4bf9968,0x416fd26f),LL(0x8c4cdb7c,0xe7d932fa),LL(0xde7df0b0,0x472063b5),LL(0xd8e36d94,0x1f940a1b),L_(0x00000187), LL(0x852f11b9,0x528d0c6d),LL(0xe34ebb6a,0x0491c222),LL(0x572cf3b4,0x3235246f),LL(0x6a507a97,0x5419c482),LL(0x151b4954,0xa45d1468),LL(0x1e9ff246,0x555cac59),LL(0x74cf9098,0x3f67c66c),LL(0x4d10852a,0x1f28bc81),L_(0x000001b1),
+ LL(0x4d4d6495,0x86a81e7f),LL(0x54df2c4b,0x4316eb10),LL(0x19b90005,0x41b6877c),LL(0x63ac12d9,0xdbe38379),LL(0x7bdc46a9,0xe68280f8),LL(0x04afbefb,0x1d97d1dc),LL(0x64f8fe97,0xfdaabbcc),LL(0x3ef9d7ec,0x355cb854),L_(0x00000021), LL(0x4256ebb2,0x5f744a3f),LL(0x462bbab0,0xc6587a4d),LL(0x8de305cc,0xf7cc14a1),LL(0xd2c0e8c5,0x1c2fa456),LL(0xd7f552fd,0x93096db0),LL(0xdf5d165b,0xeef9e935),LL(0x0a7d4ef3,0x8313440e),LL(0x2ecbc3b6,0x31c6420c),L_(0x00000033),
+ LL(0x4ec080d5,0xc4429668),LL(0x00e4c47a,0x0c5790c3),LL(0x2bb3e90a,0x76060854),LL(0xb06d2fa8,0x51871594),LL(0xb8a8220c,0x35fa01c4),LL(0x96cfa275,0x351722c6),LL(0xd2b5aea0,0xcac00f2f),LL(0x9a7e1203,0x2e7bac23),L_(0x0000010c), LL(0xa79d695c,0xe8bbd2be),LL(0xc13d4a47,0xdd17ddc3),LL(0x3a2ef1d7,0x835e7fe3),LL(0x3a0d7223,0xdaab1fae),LL(0xeadcb841,0x2baa3375),LL(0x25d48c28,0x3675311d),LL(0x1cfce1d1,0x8cca0828),LL(0x6d648baa,0xe0c0ce1e),L_(0x00000060),
+ LL(0x39772678,0x4730fdee),LL(0x4814bf38,0x7da6e5cf),LL(0x717ace32,0x2440a79c),LL(0x1fa530fc,0xee76a431),LL(0xf0840ed5,0x64a9d867),LL(0x9b3e52c9,0x01e024e8),LL(0x388a3167,0xbc5a3de8),LL(0xb45ab215,0xddc3e927),L_(0x000001d6), LL(0xdb989f10,0xb0c72279),LL(0x88321c3c,0x461d5212),LL(0xe2e0c887,0x22583d6f),LL(0x0422ef3c,0x5319c021),LL(0xf26dbc88,0x3aba5f48),LL(0x62bbe876,0x7e742165),LL(0x411f00ae,0xd32aa7f6),LL(0x6608e197,0x1c414ee2),L_(0x000001fe),
+ LL(0xb2aed406,0x5c51d66d),LL(0xe49e1c0a,0x341d6090),LL(0xeca16754,0x50aaa76d),LL(0x3d4ae66e,0x23dd6ea7),LL(0xc264093c,0xb964aff3),LL(0x124124d1,0x6a903309),LL(0x320f2ccc,0x040a80c9),LL(0xa2fc450d,0x54b0cef1),L_(0x000001d0), LL(0x660ce624,0x876d5eb7),LL(0xb113de73,0xd6a08a24),LL(0x8fdedfa3,0x7e981617),LL(0xccca4ec9,0xbf6d63e9),LL(0x1cbf7303,0xd5b865e9),LL(0x06258e51,0x8b4e0432),LL(0xae5f01e7,0xed7485d8),LL(0x1fb3ec8e,0x5f9ac27f),L_(0x00000088),
+ LL(0xcd3a614c,0xaac40dbd),LL(0x933beab8,0x23a3080d),LL(0x4ca0b1cd,0x3c101e4c),LL(0x2d0376e4,0xcb246c76),LL(0x8ef2560e,0x3a96d882),LL(0x54be7604,0x792be430),LL(0x4ed7cfd6,0xe67d1eea),LL(0x924a5689,0x8c271a2c),L_(0x00000139), LL(0x63647d6b,0x9642188f),LL(0x514cab56,0xbcdfd904),LL(0x529ea4a2,0x876c6668),LL(0xcbd5305d,0xfa8c20c0),LL(0x58b69ea6,0x1ac42596),LL(0xf62b1c30,0x80232775),LL(0xee3d0824,0xc5b975d6),LL(0xc483c2ea,0x84841ab2),L_(0x000000c9),
+ LL(0x8bc6d688,0x6c7bd269),LL(0x7652c729,0xc96e37bd),LL(0x405791df,0x410e2904),LL(0x5ab8090e,0xf9bde0c1),LL(0x1a7b424c,0x37d8159f),LL(0x26876e27,0x6e7212ab),LL(0x5e21bc5d,0x2ff3af58),LL(0xa29dba58,0xd72ccea6),L_(0x000001a5), LL(0x7dd665a0,0xe048ab97),LL(0x19984a71,0x17b7a849),LL(0x8f61b833,0x9bdf5b57),LL(0xeb63a0f7,0x32adf9dd),LL(0x8eaf0eb1,0xe30814ac),LL(0x799c8225,0x35be0b92),LL(0xa082ff80,0x7e52495d),LL(0x196f3154,0xf5e9fa54),L_(0x00000164),
+ LL(0x3b3fccf2,0xf8b435c7),LL(0x7f599023,0x4b07f56c),LL(0xc6614964,0x1f9e8dd5),LL(0x7bfaa97f,0x57a41fcb),LL(0x056d5124,0x69dc4c19),LL(0x33956d10,0x2e70770f),LL(0xac607019,0x17397aa9),LL(0xbda3b4ee,0xb5df8c82),L_(0x000001c8), LL(0x11800cef,0x9f451540),LL(0x5de0b39d,0x9cd9ec18),LL(0xf09ca421,0x7bff70d3),LL(0x3fc8f958,0x6af7560e),LL(0x348716d4,0x2601495a),LL(0x4ed53bb1,0x39eaa8c2),LL(0x97052bec,0x87acae02),LL(0xb4363c7a,0xe01ba269),L_(0x00000117),
+ LL(0x010e4074,0x23ceb817),LL(0x68de1fa6,0xb6c3610b),LL(0x79b5037c,0x794616e3),LL(0x38ca34e7,0x6964c6c9),LL(0x64ba9eb2,0x9d828a84),LL(0x713e3f60,0xc6cafea4),LL(0x69bdca04,0x0035da7c),LL(0xc53921ac,0xe8c47770),L_(0x000001f9), LL(0xbe97815a,0x678d3502),LL(0x09bb25d5,0x417b9931),LL(0xadbec401,0xa021e930),LL(0xef1be11c,0xb53777ab),LL(0xfb3f04c1,0x2e6bc85d),LL(0xab9fbf13,0x22a4d27b),LL(0xb988012f,0xddee5ad9),LL(0xfda8aea8,0xf2fa9a7a),L_(0x000000cd),
+ LL(0xc43ac524,0x9805e79d),LL(0x95a2175f,0x2bee2dfe),LL(0x6125c31c,0x2b6284b0),LL(0x10319508,0x2264eba0),LL(0x8cedfa4a,0x25bc143e),LL(0x3199afa3,0xe3ae2485),LL(0x63067c6a,0xebebe969),LL(0x54a7cecd,0xb0d6a96c),L_(0x0000007d), LL(0x6de3a522,0x3a1a5044),LL(0xf721555f,0x644f2db4),LL(0x6dc38924,0xb72ad43f),LL(0x39beb126,0xe7dd7722),LL(0xd840de05,0xd6caacd0),LL(0xc67a2862,0xce6fa639),LL(0xba53021b,0x71087602),LL(0xec9b5982,0x69c6c679),L_(0x00000128),
+},
+/* digit=77 base_pwr=2^385 */
+{
+ LL(0xb75ed4da,0x7aaab2f5),LL(0x1ee37679,0x30159305),LL(0x0b02f44a,0x021962a3),LL(0xd622cf13,0x55a3eea1),LL(0x9a7dfa05,0x4fcd685c),LL(0x7a2a6aca,0xd2e75077),LL(0xbd4c914a,0x1e6aa905),LL(0xeec52d7b,0x4fd3f8ff),L_(0x00000173), LL(0xfa95204a,0x539f85e4),LL(0x36eeec34,0xe8ddc16e),LL(0x74599d1c,0x50244a9e),LL(0xb343c6c5,0x714c017a),LL(0xb07951ae,0x4503f92d),LL(0x44d15c8c,0x830499e5),LL(0x94680ff6,0xe7188a7b),LL(0xd6c4809f,0xdf43c147),L_(0x0000007e),
+ LL(0x1bf14718,0xf89fcfd4),LL(0xc079070b,0xa403ed89),LL(0xa107b324,0x18c3f861),LL(0x4dade6e3,0x665e9f9b),LL(0x332b6327,0xb408e3b3),LL(0xf62f16ec,0x11ee2181),LL(0x67bbd1bc,0xd0ba5904),LL(0x4b5440b9,0x4a8d7a0f),L_(0x00000134), LL(0x9cb1aa7a,0x8a32a33d),LL(0xedb96d1a,0x9ae722d5),LL(0x0654bd1b,0x1664c777),LL(0x03d0e5a5,0x6a4a631d),LL(0xfb01ee81,0x3d1d9344),LL(0xc7691584,0x1e1821b3),LL(0xbe2d285c,0xafc22520),LL(0xe0834d6f,0x0ccc1fe7),L_(0x000001bd),
+ LL(0x08d12f4d,0xf2407064),LL(0xd7255fb6,0x1c6799f2),LL(0xad7d86d9,0x8c32b1c7),LL(0x259fb289,0x172083c6),LL(0xcdc9f2eb,0xc85a5a26),LL(0xdca9f61e,0x303eee79),LL(0x82cff2b2,0x283cc245),LL(0xaea38a1c,0xd4cf3018),L_(0x0000004a), LL(0xf7fee514,0xb0b385f6),LL(0x0a48204d,0x785b0f88),LL(0xaff858dd,0xae66256a),LL(0x24f69e65,0x92f5e352),LL(0xe99c8d90,0xb2e1ccee),LL(0x40cfa4d5,0x5201f6ee),LL(0xfefbb836,0xbcabc908),LL(0x61f21689,0x688f6f44),L_(0x00000158),
+ LL(0xd756d8ef,0xaef07505),LL(0xdd4c26d4,0xfd1d5c09),LL(0xb43bb4e7,0x53c26645),LL(0x6a817eb2,0xf92f5487),LL(0x6209c32a,0x3e205a08),LL(0xb9b883a6,0x802502f8),LL(0xa6f9cb8d,0x2169b5a7),LL(0x87089ec1,0x07a66e8d),L_(0x000000a3), LL(0x4cc2981d,0xc0b6dcff),LL(0x39135fd7,0xe2051e1d),LL(0x0f800ca1,0x76456f99),LL(0xae12c766,0x987a86bb),LL(0xdfc5fcbf,0xcbf344cf),LL(0xa853db02,0x65a4f55e),LL(0x24b115f9,0xf4d8cf4b),LL(0x28cffa2b,0x7ef16ddb),L_(0x000000b8),
+ LL(0x9698f500,0x46e1cf5e),LL(0xa37c3c3b,0xb10d9d35),LL(0xb6d8d81a,0x6814e15a),LL(0x65739419,0x9282b5ea),LL(0xf890c6b6,0x80d764c7),LL(0x7d309653,0xda043f0c),LL(0xd070b1e7,0xc9e15f63),LL(0xb143ef10,0x31da4456),L_(0x0000010a), LL(0x47fd9b69,0x525c5453),LL(0xc9876e94,0xe52b9bcb),LL(0x3078ffdd,0xab8f2cfa),LL(0x7e1a8a45,0x338e4367),LL(0x3382f009,0x5b0092de),LL(0x06454df0,0xdb5d1cbb),LL(0xbbf3f2d3,0x17b40f75),LL(0xb1b7961b,0xc510c4b1),L_(0x0000018d),
+ LL(0x7aa9d1e5,0x71e12980),LL(0x69777935,0xdfdae6a9),LL(0x2f45dffd,0xf2900457),LL(0xabe3441f,0x6471580e),LL(0x5aece4d0,0xd983618d),LL(0x85cd6571,0xf5a1d861),LL(0xc2bd978c,0x955894c4),LL(0x81cae98a,0x762f897f),L_(0x00000078), LL(0x3176598c,0x4b7790dd),LL(0xc91def7d,0xb21152ba),LL(0x279d992a,0xd92aafdd),LL(0x7dab9fb5,0x59dd70d0),LL(0x7039956b,0x14d13b0f),LL(0x7cfe20de,0x7bd5d4c8),LL(0x45b10bc2,0x59724543),LL(0x906a5d0d,0xda689ccd),L_(0x00000096),
+ LL(0x80b9235f,0x380affbc),LL(0x0b4024a8,0xcd02b098),LL(0xc98a3c0b,0x36545f0a),LL(0xe62cf7ea,0x3b089c99),LL(0xdade8fc7,0xf9b4c955),LL(0xf404f355,0x7650e822),LL(0xae64ac11,0xcc0fb628),LL(0x593a1b6a,0x278ddfdf),L_(0x00000041), LL(0xa51f1936,0x091d5493),LL(0xeabe8135,0x5285ec41),LL(0x6bc185fe,0x9a7df8de),LL(0x25f54dac,0xc1b5836c),LL(0x4e5fc638,0xde102ff5),LL(0x81a60442,0x56a67f9d),LL(0xaeaff6ca,0x7cc5f40e),LL(0xdaecfbdc,0x63449fd0),L_(0x00000084),
+ LL(0xcd4c9f1b,0x64ba5d43),LL(0x262898c5,0xb6d345ac),LL(0x0f11b91d,0xf8015622),LL(0xfa53c395,0xeb32e3dc),LL(0x4e8f0647,0x125c49a2),LL(0x537471de,0x5c783701),LL(0x7a9741e3,0x00bc6a87),LL(0x1c5d3aa6,0x77962a3e),L_(0x00000003), LL(0x18eae31d,0x1336f732),LL(0x7555dff2,0x63097ec4),LL(0x8f16a8d5,0x928e41ac),LL(0xc063790a,0x72cf7210),LL(0x2842e2a8,0xbed4668e),LL(0xe7f0d214,0x7b5aab91),LL(0xbd94783e,0x472089cb),LL(0x55df6f3c,0x7e5f6d77),L_(0x000000b9),
+ LL(0x6ba36bea,0xd6462023),LL(0x51b0110e,0x0299f400),LL(0x5ad94e5d,0x1c56f2f6),LL(0xd8d6e619,0x0b4ea27d),LL(0xe73e18fa,0xdcfdac26),LL(0x61a026ce,0x27dab320),LL(0x4ebfdadb,0xb6af0729),LL(0xe9561c2a,0x2c10a6e9),L_(0x000000bf), LL(0x1418a240,0x7a5020b9),LL(0x2b5125f4,0x7dac2ce9),LL(0x6985bdc7,0x7a36a07a),LL(0x6d385362,0xc0a58550),LL(0x940163b2,0xd28cbf38),LL(0xfb9a9d22,0x8eddbcd2),LL(0x1cfcdeb4,0xad40ff84),LL(0x41da1441,0x0dfc69a8),L_(0x0000018f),
+ LL(0xf1ab6a88,0x32d8d898),LL(0xb4c956c4,0xbd9881d2),LL(0xbc516c73,0x5116a36c),LL(0x91e840e1,0xff4abf28),LL(0x14bf8bab,0x2bc617a5),LL(0xb012c75f,0xba5d811c),LL(0xf333effb,0x37bcddc4),LL(0x771a4567,0x0f294bff),L_(0x000001ea), LL(0xa48d6dfa,0xf2542b71),LL(0x495f434b,0xe3f39bde),LL(0x9f969883,0x179f2c63),LL(0xa68cdccf,0x44e28315),LL(0x7408c1bf,0xeb7b9849),LL(0xf6615345,0x823ede15),LL(0xdf405d5f,0x17f01e94),LL(0x0efd64e2,0xd1d65356),L_(0x00000094),
+ LL(0x6794bc7e,0xfa3914f9),LL(0x044623b2,0x3e94e3f2),LL(0xc7e42b96,0x85cc2a9d),LL(0xe0fbde7f,0x2e0e1f42),LL(0xde5ec740,0x0a1b4e4e),LL(0x99d96c6e,0xa3d7e876),LL(0x9b31d8b9,0xcce96a38),LL(0x4fd9fc85,0xaa4475dc),L_(0x0000016f), LL(0x5b7a322f,0x4317247b),LL(0x01f0266b,0xfd3d2a1d),LL(0xa9fbb760,0x75fc993e),LL(0x60905a87,0x51ce6740),LL(0x3c6c984d,0x16580d6e),LL(0xe79ccbef,0x585522ad),LL(0x57fa547e,0x42f80ccf),LL(0x8ad71acb,0x04c2d188),L_(0x0000000b),
+ LL(0xb16ee0ab,0x28366fe7),LL(0x0365fed1,0xc78aeb84),LL(0xf329889f,0xee74063c),LL(0x16267a5a,0x9c5a9197),LL(0x040a619f,0xc54b40cc),LL(0x16e7345f,0x9d5f609d),LL(0x957fc0b1,0xaf8fbbc8),LL(0xb1cb4d02,0xae0bc117),L_(0x0000016d), LL(0xd023f32f,0x1deda80b),LL(0xacb49a95,0x4c11c95e),LL(0x00e1f672,0xde8db891),LL(0x19ee52cc,0x27a5b5d8),LL(0x6176a0d3,0xd6752e2d),LL(0xdfccd883,0xe819161e),LL(0xe1282202,0xe71376c0),LL(0xb92fddf6,0x36e67047),L_(0x00000013),
+ LL(0xfecc3203,0x7168d714),LL(0x1726e41f,0xea5d7e70),LL(0x69dd518d,0xe7aec797),LL(0x2cfd3a6e,0x9ab3823a),LL(0xb90a5bea,0x43831c4a),LL(0xdbb35cc6,0xd5853b0b),LL(0x95c10ae1,0x55834ab5),LL(0xd668a3cb,0x91daa6d5),L_(0x000001e9), LL(0xc0f7662f,0x98346aa6),LL(0x173a0008,0xabe91f50),LL(0x0508c118,0x97cdd826),LL(0x7255d2e1,0x01d1e340),LL(0xeb07ccd4,0xf2f7ac53),LL(0xc6829327,0x966981ba),LL(0x0fb3f4fa,0x1ee6ae0f),LL(0xea212110,0x67b02691),L_(0x00000154),
+ LL(0x3c713d51,0x946494a7),LL(0x1e6130d8,0xbd5ab69c),LL(0x6cbf341e,0xcf57622a),LL(0x94d1578b,0xc7327897),LL(0xb1db7d17,0x2874559e),LL(0xf5607998,0xd15eab48),LL(0x18199bc9,0xfe1d9b44),LL(0xd0aedc11,0x95354256),L_(0x00000169), LL(0x50c646ed,0xb75609c0),LL(0x9721b326,0x4a7a787a),LL(0xed16025f,0xbf8835a3),LL(0x78dc9b8f,0xee0c8b9a),LL(0xf388850b,0x5a1458a1),LL(0xc5cee39e,0xb7bfeb06),LL(0xecfd0e49,0x8795b039),LL(0x70bdfc80,0x3f5f6711),L_(0x00000126),
+ LL(0xa3c85c78,0xbd49ba23),LL(0xe512fde9,0xdb860d3f),LL(0xbf99d4e9,0x3cb574a7),LL(0xbc4c4fcb,0x9af33dfa),LL(0x88710836,0xfd7ca4de),LL(0x4b83fe29,0xa2306095),LL(0x03d40abe,0x5f9ae75f),LL(0x5e83ab1a,0xe6d9a07e),L_(0x00000154), LL(0x97d0048f,0xf861736c),LL(0xde0ffdb3,0x5e0c4806),LL(0x335dce14,0x76e125cd),LL(0xcc1ff27f,0x16822cb3),LL(0x8414749b,0x44ae46e0),LL(0x68085d31,0xe89d0a2c),LL(0x9c734630,0x569b26c1),LL(0x2d89e8f0,0xc04e824b),L_(0x000000c9),
+ LL(0x1dc45be8,0xf3a736f8),LL(0xb7b948b5,0xf684853d),LL(0xa1d8a120,0x7de7af37),LL(0xe3760299,0xadb401c1),LL(0xa1ba866c,0x24e3e6ca),LL(0xcd94496a,0xc3eae9d6),LL(0x06f82a82,0x4a74e14e),LL(0x069d9983,0xb9dff343),L_(0x00000018), LL(0x2a60baf5,0x3855bae4),LL(0xfbb6aadc,0x20017824),LL(0x950ab7cd,0x9dfd2439),LL(0x96b97104,0x65cd1e13),LL(0x4925d16b,0xf2ec4dd1),LL(0xd82c0815,0x9059e2e1),LL(0x3ba03a79,0x2f723163),LL(0xf35a3c60,0xc7cb8c17),L_(0x0000004b),
+},
+/* digit=78 base_pwr=2^390 */
+{
+ LL(0x05eac10d,0x1d0d93fa),LL(0x3fb80a45,0x30dbe366),LL(0x69a67246,0x1373df55),LL(0x3a7b7740,0x3b688d58),LL(0x9a1bf576,0x6f4ce0d1),LL(0xc2030797,0x72348a80),LL(0xd874e749,0x24296b9d),LL(0x26fc8724,0xdf80dad7),L_(0x00000154), LL(0xa4626a33,0x0b206a34),LL(0x661fc19c,0x597e1cfe),LL(0x1f98c11b,0x010915e6),LL(0x00c41adb,0xbdcb2d64),LL(0xfed21859,0x07de82c2),LL(0xeffa2475,0xba1295da),LL(0x73a4f297,0x570842d6),LL(0x1fc083b4,0x94c92172),L_(0x00000159),
+ LL(0x05474c79,0xf27eccc5),LL(0x9bbd81b9,0x4061bf3c),LL(0x1385eed6,0xe5477666),LL(0x2d5cbcfe,0xa0f415ca),LL(0xab0a8618,0x18675f88),LL(0x47e7c454,0x0d5df7ae),LL(0x75324e3e,0xe2f88082),LL(0xe818ccf0,0x9cc4c5bf),L_(0x0000007e), LL(0xc2d8f452,0xef224de6),LL(0x9ce12031,0x70dcb7f7),LL(0xd958660b,0xc4597b18),LL(0x4dfd1c89,0xda0fa522),LL(0x2d69ce10,0x989afa82),LL(0x46e81b65,0x4e1b3fa1),LL(0xdcac5039,0x832ae217),LL(0x7d3eef41,0x7f7b4632),L_(0x00000159),
+ LL(0x5daa1b89,0x542982e7),LL(0x98f2622c,0x5b7e32c5),LL(0xa09068bf,0x6931e543),LL(0xeb5500e2,0x9089e794),LL(0x2a396afe,0xe5f72142),LL(0x68403342,0xf625b926),LL(0x14e9fc8c,0x6171d647),LL(0xe3e5f19c,0x41a98a6f),L_(0x0000012b), LL(0x9dfea1fb,0xaf413d88),LL(0x0a1d61f5,0xb4928484),LL(0xc08e23bd,0xe1c147cc),LL(0x3ba7bae4,0x0b6e0358),LL(0x7c12896b,0xa84a4aed),LL(0x0195f08d,0x7bcd8649),LL(0xeba99c7c,0x799d1ac2),LL(0x0193b278,0xa35f128c),L_(0x00000072),
+ LL(0x91f424e1,0xb2d18470),LL(0x482b31fa,0xc18abe11),LL(0x4548d244,0xc9e02a20),LL(0x901117bf,0xb1dc1cd2),LL(0x286c34a4,0x8ee98a6d),LL(0x04c325a4,0xb76b3ae6),LL(0xdb518aec,0x981c8298),LL(0xb7194b24,0x8c90f08f),L_(0x000001b3), LL(0xfd055d97,0xc7061a3b),LL(0x8a107a2c,0x5a667bf8),LL(0xaf0a63ac,0x21028dc3),LL(0x3e8641fb,0xa80d9487),LL(0xd40a558d,0x63f8d8c7),LL(0x3accfc09,0xccc46547),LL(0xfbd53079,0xe85ce362),LL(0x15006f15,0xb994381d),L_(0x000000d4),
+ LL(0x913326ba,0xe7e20db3),LL(0xe0e58c40,0x4dd3a381),LL(0x4f08867b,0x8c0db229),LL(0x1f57cf8e,0x862604e5),LL(0x9951f866,0x588c2473),LL(0xdd04385b,0x2a4f4278),LL(0x13235969,0x334e1277),LL(0xe14a7afb,0x0a02da7c),L_(0x00000164), LL(0xce866486,0x4c0e101a),LL(0xfa8ba6d4,0x8dee1016),LL(0x1cd14dc2,0x5e8be2aa),LL(0xcc56a3c9,0x5bdaa677),LL(0x26fe9020,0x787cbbf4),LL(0x6059a9eb,0xf27c2ccd),LL(0x52b29d1e,0x431ad6f9),LL(0xe9273bbd,0x47f193d1),L_(0x0000006c),
+ LL(0x531296c8,0xa4ea86fa),LL(0xe8dd3548,0x107a45cd),LL(0xd8b7e446,0x1bfd985a),LL(0x280a4e8e,0x4fc2dc66),LL(0x4b39f03c,0x86dfa832),LL(0xc44021ef,0x55d3ccb1),LL(0x210fe263,0x65b0f1db),LL(0x68364a82,0x4fc0acb2),L_(0x00000132), LL(0x2aec7e7e,0x7906edd3),LL(0x941505c5,0x5f4fddad),LL(0x657d2929,0x320073ac),LL(0xefaffd81,0x7ab9edd6),LL(0xeb40eb69,0x23d38d94),LL(0xc8df60f9,0x1840540c),LL(0xbfea59c1,0x3958b571),LL(0x2f7620df,0xcd1712e7),L_(0x000000d6),
+ LL(0xa8d54597,0x3ace77d1),LL(0x23823b9e,0xb05ab9ad),LL(0x7d6803d7,0x36f8db67),LL(0x8ed91e87,0x8fbc69ec),LL(0xe0042a07,0x6a246110),LL(0x5131b89e,0xf857a2db),LL(0x4c1861d6,0x311746a3),LL(0x84c00e5b,0xa2b64ab3),L_(0x0000008e), LL(0x95ff285c,0xdd895ec5),LL(0x9a709b4c,0xadcb32cb),LL(0x148a78f6,0x7c40e4b0),LL(0xf62708ee,0xd37d48a3),LL(0x68232a30,0x382492cc),LL(0x79b622f3,0x92d657a0),LL(0x09992500,0x6a420a8f),LL(0x501d8de9,0x759f5a62),L_(0x00000051),
+ LL(0xc122141c,0x66149a76),LL(0xc602d382,0xfdcc4f6e),LL(0x16b23844,0xea0673e3),LL(0x7ff0591c,0x53082d2f),LL(0x82264497,0xafeaf6b5),LL(0xca528c9c,0x01a84f6b),LL(0xe2403638,0x43738672),LL(0x54c4174c,0x50ff80fb),L_(0x00000186), LL(0x4205f340,0x0b6de62a),LL(0xa84853c5,0xc67ea2a5),LL(0x92e0d583,0x296584f2),LL(0x6bb7a441,0xa9f0cd97),LL(0xce6eb31f,0xd0d33dfa),LL(0x850b5886,0xca9b5dbb),LL(0xe75a3fb5,0x143bbd95),LL(0xfc35ee42,0x1eab0aa9),L_(0x00000157),
+ LL(0xfe747fdd,0x0c47e2c5),LL(0xf9ae16bd,0xa07b48d2),LL(0x01c347f0,0x2cf4c727),LL(0x747fa6ef,0x850ead03),LL(0xff312b98,0x8726545d),LL(0x5218270e,0xa6f367cc),LL(0x7680a110,0x37efad3c),LL(0xe34b12a3,0x693b75a8),L_(0x00000069), LL(0xe1fe8e14,0x5767922c),LL(0xe0242975,0x20a012f1),LL(0xba21fc56,0x49ff848f),LL(0xbd4ab80a,0xde1b4b0f),LL(0x24104f37,0x314917b2),LL(0x221548c9,0xde9c2909),LL(0x6f74cf12,0x75ca1868),LL(0x44d62839,0x6d64b7c2),L_(0x000000bb),
+ LL(0x3109d76a,0x044307f0),LL(0x7372da8e,0x9ba083bb),LL(0xd35f32f6,0xd25b7e53),LL(0x0a6c99ed,0x30794ede),LL(0x1523c414,0xed97a2a7),LL(0x7dbb6798,0x6d897d7a),LL(0xb996ba83,0x3c0356d5),LL(0xad5ef539,0x3f933449),L_(0x000000e3), LL(0x37a40ab6,0xfbb2d425),LL(0x468766c5,0xd03d4766),LL(0xe6a77a37,0x09eb18e1),LL(0x9d7f1644,0xbdb7ff41),LL(0xeeb2f1b2,0xc98d5a19),LL(0x8377c08e,0xda52ef67),LL(0x1078c0d1,0xbd2d3d66),LL(0x9181c3b8,0x0015c0fd),L_(0x000001f0),
+ LL(0x4f7f8d77,0x663aa882),LL(0x9e806c61,0xcd6d9ab0),LL(0x434a485b,0x575aafa5),LL(0x0477ae83,0x1fb377fe),LL(0x7b98c782,0x4ac83912),LL(0xe2f16d17,0xd098d31f),LL(0xeaff3b56,0xfba7077f),LL(0x13382e53,0x8ba7a6cb),L_(0x00000048), LL(0x4aad91ac,0xce1a9e84),LL(0xc8fc10e4,0xb01bef42),LL(0x6afd2473,0xb1a03e1c),LL(0x507c30ff,0x3760275a),LL(0x162b2e12,0xabb38d7f),LL(0x558877e8,0x88916de2),LL(0x9f519917,0x2fdccf2d),LL(0xf70b4695,0x1d641420),L_(0x00000025),
+ LL(0x4848296d,0xe0f71789),LL(0xf3835d1a,0x9fea01e8),LL(0xaf761a04,0xc7d32c83),LL(0x1060dc76,0x6c5ff4c8),LL(0xc3751915,0xec6a8a45),LL(0x6f1dbd4a,0xdf6166cd),LL(0xa64bcecc,0xa942edd4),LL(0x53c4d352,0x8df04873),L_(0x000001f2), LL(0x957c5d10,0xe757c12a),LL(0x60819db9,0x5aae5302),LL(0xfbc64c70,0x72a99d6e),LL(0xb00bbd49,0x3bf68d69),LL(0xf0b755c1,0x125fdc71),LL(0x4502c9bf,0xe7e83089),LL(0x7e20c9f2,0xaefe0993),LL(0x5fa7bc0d,0x58ce802b),L_(0x0000001f),
+ LL(0x596ae14c,0xc255b673),LL(0x1bb0ac11,0x19c21f40),LL(0x04f2091c,0x1838e69c),LL(0x3e9cb56d,0x51439522),LL(0xc1cecfc9,0x52a9b2f6),LL(0xc564467e,0x3576c345),LL(0xeb0fdcd3,0xd04ad0d7),LL(0x3c3aa2c6,0x1cfc7def),L_(0x00000038), LL(0x54b2e727,0x044d2e1b),LL(0x8701d001,0x794b02f7),LL(0xd8153787,0x4f463b8e),LL(0xa0dfa5ea,0x253e324d),LL(0x8fc87618,0x19c78239),LL(0x6165c650,0x97b77e54),LL(0x134c2cb2,0x5e23fc18),LL(0x5ade1fce,0x10c19f2a),L_(0x00000174),
+ LL(0xaad903e8,0xb407a7f0),LL(0xa64c2d6e,0xc577e3d9),LL(0xd68527c3,0x398177a5),LL(0xdf38bff9,0xde6b9d9e),LL(0x746c3309,0x1d7385a5),LL(0x98512661,0x3b8d9701),LL(0xe82c0d22,0xe2b7edd9),LL(0x16ce165c,0x92301ae2),L_(0x0000002f), LL(0x491b562d,0xd2049870),LL(0x1de2def6,0xcf01bb60),LL(0xaff2152d,0x20717620),LL(0x5764198c,0x503a4861),LL(0x9702cec2,0xce53ec1b),LL(0x886169de,0xe97c752c),LL(0x8d58887b,0xeb1ce735),LL(0xe1b8ee6d,0x01ad85ca),L_(0x00000093),
+ LL(0x6213a0d1,0x1d410b7b),LL(0xba1aa221,0xa8aa0a76),LL(0xbd669af8,0x06a3140b),LL(0x196f88e0,0xdc333cc8),LL(0x1c9aa099,0x60557f79),LL(0xe1ff46ae,0xa7b7da68),LL(0xd7626d62,0x2a5a72d1),LL(0xffb47531,0x86e04ed1),L_(0x00000058), LL(0x72d98927,0x8e521d9d),LL(0x6acd3ed1,0x855c8e97),LL(0x47c48377,0x42413164),LL(0x89182c42,0xae6a473b),LL(0x59d11d10,0x730eb702),LL(0xd4abd611,0x71fd7c4f),LL(0x4d329537,0xe8493373),LL(0x5e745909,0x0caebd43),L_(0x00000034),
+ LL(0x4c6f3e4a,0x688f6e0a),LL(0x2a9b6d1a,0x9e0c6a62),LL(0xfebdd4b3,0x7fb92759),LL(0xe14d66ca,0x3d698e7d),LL(0x0a2edb8e,0x08ea4d11),LL(0x10b21ab8,0x0f855706),LL(0xf8405b08,0x104c29e8),LL(0xadf7ff63,0xca76d27d),L_(0x00000076), LL(0x4757c2f5,0xe671ed88),LL(0xb38018e2,0xd5288875),LL(0x629331d9,0x279d96a8),LL(0x7e602196,0x559eca5a),LL(0x81f2dc09,0xf274c146),LL(0x96818fe5,0x483d0424),LL(0x1c8246f6,0x76f5286b),LL(0x44ba1052,0xe83b7779),L_(0x0000005e),
+},
+/* digit=79 base_pwr=2^395 */
+{
+ LL(0x42d44166,0x0a8f4b54),LL(0x924764d2,0xf7bf31e5),LL(0x26e4af60,0x7be28350),LL(0x9fc53bdf,0x08056835),LL(0xa12726ea,0x726e147e),LL(0xd5e175b1,0xca2a0207),LL(0x833e5911,0x4d322cae),LL(0x6cba51a1,0xfd137e93),L_(0x0000001e), LL(0xdaa1d653,0xe0948dd2),LL(0xca2b565c,0x2f88e2ac),LL(0x94ccb3a4,0x85d91e6c),LL(0xd8fe4775,0xb59cebc7),LL(0x0807f46d,0xf4237821),LL(0xfc9eb940,0x402ecff0),LL(0xd173f94e,0xbf7bc598),LL(0xaf975145,0xf726ff16),L_(0x0000009c),
+ LL(0x15942a4c,0x3dad29e1),LL(0x350dec67,0xe6be55a2),LL(0xca3c399f,0x71245659),LL(0x87e22652,0x8f51c63c),LL(0x1bd4c445,0x758ae1a1),LL(0x319b57db,0x547db810),LL(0x7d5c89dc,0x62c8ba84),LL(0x959a5bbe,0xd3fcf239),L_(0x000000eb), LL(0x8c3d490f,0x482b690e),LL(0x50d48521,0x83aada08),LL(0x82c13331,0x45c4a535),LL(0xae5a3425,0x31c1467b),LL(0x51c50d6f,0x2d093b81),LL(0x84a7d97c,0x82d6fbdb),LL(0xdb41ffbe,0x4953468e),LL(0xae0e9fad,0xede049e6),L_(0x00000070),
+ LL(0xc26f9e1d,0xb8562be5),LL(0x71fd7b5e,0x039f5b0d),LL(0xe3196121,0x073e4db0),LL(0x902cc367,0x22f8b999),LL(0x604d9b78,0xc1cfc4a4),LL(0x52f26ece,0x88d45487),LL(0xa175f394,0x9f16c268),LL(0x9fe9a65c,0xe88e2aea),L_(0x000001a9), LL(0x54ed1ed1,0x4d516f86),LL(0xb3a46011,0xa9ca3304),LL(0x8c5e216d,0x2030c9a9),LL(0x86a5904f,0xc0c4c573),LL(0x9467bf24,0xb4a6fdae),LL(0xa652162c,0xd3472536),LL(0xb6166589,0x31361b4b),LL(0xfa3bddac,0xd5b8b3b7),L_(0x0000007a),
+ LL(0xaa60773f,0xe8255739),LL(0x58459ee1,0x672547b1),LL(0x3f4e65fb,0x0030639d),LL(0x5059b89e,0xc29a4f63),LL(0x3ffb7b9a,0x267e1823),LL(0x6854cad3,0x7f7d6bbb),LL(0x79c3b99a,0x20d91b6e),LL(0xbec22c47,0x4474e65e),L_(0x000000d8), LL(0xd72fbb0f,0x307d9b73),LL(0x7f8c46dc,0xc6fa2f52),LL(0xfbf3d06f,0xd62e537c),LL(0xd7888122,0x4ebd3818),LL(0x11ea61a8,0x479a6f83),LL(0xeafa5532,0xa4bf3325),LL(0xc7a31554,0x5a717809),LL(0x9520a809,0xd00e3039),L_(0x000000d7),
+ LL(0x4f775892,0xb974b129),LL(0x5ce12c3e,0xe8064395),LL(0x2e69ed62,0x31e3ae39),LL(0x9c220c3b,0xd59ea4b1),LL(0xb79732ea,0x6f45918a),LL(0x6600e529,0x08681af2),LL(0x4ed3f5dd,0x507438a2),LL(0xac5ccefd,0x0ca9586e),L_(0x00000064), LL(0x5b14db7c,0x2484d059),LL(0x411826aa,0x6005d933),LL(0xca8c9d7f,0x15dd0c44),LL(0x1900212d,0x96825f72),LL(0xa3ea7e14,0x921c8c87),LL(0x20d2b6f4,0xfdd63f04),LL(0xbe8c25ac,0x9f6a6126),LL(0xa2592316,0xf8413f28),L_(0x000001e7),
+ LL(0x27b80789,0x4f60fc89),LL(0xc97bbd7e,0xbd2ecac1),LL(0x5b008578,0xaaf75b36),LL(0x3b54d53e,0x6540b6f5),LL(0xce5a0ab8,0xac54c1d9),LL(0x52d909c6,0x67e6b65d),LL(0x6607ea02,0x7ea06112),LL(0x0a94e0f9,0x55cce11c),L_(0x0000011e), LL(0x7fdd52c7,0x49bb24e9),LL(0xfc9b8e68,0xe60101c7),LL(0xdcbe3ce9,0xc2ae52f0),LL(0x3c779930,0x85f01602),LL(0xa50df581,0x4a7c2cfe),LL(0x8c89a686,0x52f720dc),LL(0xe2d3b3fd,0x566aecf1),LL(0x1ac6cabd,0xf58c8fe5),L_(0x0000000e),
+ LL(0x1a616c59,0x8c145c49),LL(0x1dbffc3d,0x2990c86d),LL(0x842bad94,0x7914907c),LL(0xb0b65826,0x8753b549),LL(0x09f19586,0x29d809d0),LL(0x3f813f8e,0x3e155797),LL(0x293bf471,0x87d08f2b),LL(0xc41c49e5,0x03a8d0a9),L_(0x0000013c), LL(0xd9473ed1,0x7fc8f692),LL(0x7012e2ef,0x5014f2ae),LL(0xe7047394,0x086b300a),LL(0xb63d8e90,0xe77f5c2e),LL(0xf739fb33,0x700eca1b),LL(0x22cfcea2,0x8bf8652d),LL(0x4bb3d357,0xe61f7839),LL(0xba0c3888,0xd370df89),L_(0x0000010e),
+ LL(0xe42f4734,0xbb740324),LL(0x9909bcd8,0xe45bfed8),LL(0xe9550616,0x77889a7f),LL(0x861f9828,0x446a53b7),LL(0xc8946a71,0xfbe6cdbf),LL(0x72916502,0x70373dcf),LL(0x59c8ba5f,0x1ab59a0e),LL(0x07606ee3,0x82f754ed),L_(0x0000003e), LL(0xfa3f237a,0xb5ddd50e),LL(0x0f211f61,0x56f3a63a),LL(0x8319e664,0x3124dae6),LL(0xe5acc6a3,0xf2c7d090),LL(0x5d6c5fe3,0x5cc8df62),LL(0xa0165f43,0x20f4229f),LL(0x5adf8ff4,0x2e9c92c9),LL(0xd951affc,0xefce2c03),L_(0x000000f9),
+ LL(0x85b95034,0xdf5cb44e),LL(0xffda53ce,0x976139f3),LL(0x126f8dfa,0xe003499a),LL(0x25a0d493,0xb521d994),LL(0x43bb5822,0x4978624a),LL(0x1b4bdd9b,0xf19f8465),LL(0xb8e6e89b,0x51953414),LL(0x3b559f26,0x86ef1c70),L_(0x00000051), LL(0x67904448,0x23ee72a6),LL(0x7f3ba24c,0xefa5df96),LL(0x4a910e6e,0x2d36ae87),LL(0xbee250f2,0xa3310ea5),LL(0xbebd708e,0x5db14894),LL(0x94f849b9,0x7b2cb1b7),LL(0x830487c0,0xd8532e27),LL(0x72d6bdee,0x37fccdcc),L_(0x00000160),
+ LL(0x098e856f,0xcfb4864e),LL(0x2a48dc38,0xa9b6c8ef),LL(0x070c9954,0xc3e565ee),LL(0x47d25c31,0xeec5d7b2),LL(0xdd383653,0x5ac0ce45),LL(0x1f5f3381,0xd40035f3),LL(0x486c7281,0xb516fd77),LL(0x5bbe546e,0xc646e214),L_(0x00000034), LL(0x0df8a00f,0x3f432f2f),LL(0x740ff679,0xa22b5ed0),LL(0xff907935,0x3d446e71),LL(0xd013a668,0xeeee1f6e),LL(0x16c4dc5f,0x37116783),LL(0x8ed6e49d,0x07fabe84),LL(0xd710493c,0x29dbccd8),LL(0x9263e99e,0x6beb1393),L_(0x0000012a),
+ LL(0x906df6cd,0x835e52c6),LL(0x8a2f7445,0x66d4156a),LL(0xb891e801,0xaa5c0324),LL(0x852e9f5b,0xd3f81a7a),LL(0xce23b51a,0xcdc49377),LL(0xe9c8bbe9,0x7da33db2),LL(0xd5ae561f,0x90aafd3d),LL(0x2f82d67e,0xf365be46),L_(0x0000003e), LL(0xd53059fe,0x43cd9246),LL(0xca05f22d,0x0c50a7ad),LL(0x23745904,0x612405ce),LL(0x1e2b644e,0x1783439c),LL(0xbb5598f4,0x8299ab36),LL(0xfdba24f0,0x36c6a428),LL(0x085bc781,0x42e84aa9),LL(0xe954acbf,0xeabc6123),L_(0x0000001a),
+ LL(0xeb9123d0,0x9813e058),LL(0x170c410c,0xb14ecd8d),LL(0x43a445ef,0x12caafb5),LL(0xb13251ba,0x692c7666),LL(0x6a58ee44,0x93734f73),LL(0x1ecf9f41,0x0ff39b6d),LL(0x582e2c3a,0xdd49d16c),LL(0xbc874e11,0x95e54a54),L_(0x0000016f), LL(0x9986c142,0xbe161bed),LL(0xadb85be6,0x94c11992),LL(0x974392b1,0x4727d02a),LL(0x1355dd0b,0x9ef84fdc),LL(0x001779ff,0xdbbcd1c3),LL(0x09218dc1,0x615360f7),LL(0xce2bff57,0xa1cd90ce),LL(0x5b2b4772,0x3bd7ca08),L_(0x0000005e),
+ LL(0x797035ff,0x63db3368),LL(0x2ea4d5db,0xd58aac93),LL(0x5c1f4e24,0xf46d30bc),LL(0x87b8b188,0xfe246192),LL(0x177c783a,0x2b7ec253),LL(0x7157d89d,0x93dd18f3),LL(0x609635a4,0xebb06e2d),LL(0x9bb84085,0x23701182),L_(0x00000077), LL(0x5291bba2,0x68aae159),LL(0xd5d8d4a8,0xc3c56f74),LL(0x8f01b0f8,0xd20ce087),LL(0x0018bf4f,0xcf62fd4a),LL(0x58c66e12,0xe583beb9),LL(0xcba992f3,0x7c22cd07),LL(0x82ea861b,0xffb459bf),LL(0x757b22f8,0xef69f10c),L_(0x000000f2),
+ LL(0xf9bac8ff,0xbeb1c7a5),LL(0x70f6e41f,0x32bb744d),LL(0x1f50a7aa,0x2a66377a),LL(0x611c61b4,0x324a6008),LL(0x1ce936f3,0xc3dc201c),LL(0xc5bca084,0xb70db700),LL(0x47988c82,0xfef0caf3),LL(0x2dfe3675,0x6397725e),L_(0x00000193), LL(0x76fee427,0x165d8d1c),LL(0x937f269a,0xdc1fbe1e),LL(0xdfee35cc,0x745db180),LL(0x5475d4c9,0xefc6cdb5),LL(0xb36d0a2f,0x26ccd4e8),LL(0xf7ab4767,0x3783e580),LL(0x31ff3c1f,0xce5d079b),LL(0xed18ab19,0xf284909c),L_(0x000001d3),
+ LL(0x231ac4a1,0x0790eab4),LL(0xec50bbe6,0xde5da610),LL(0xc5c0bffc,0xc2382715),LL(0xd201e1fa,0xaac50e22),LL(0x27c0dbe5,0xd06ae9b5),LL(0x8715ddc4,0x77f1683f),LL(0x592ddcce,0x410624c0),LL(0xffb7a12c,0x170b0367),L_(0x0000001c), LL(0xf76139b5,0xf8b9348f),LL(0x29844cbe,0x30deae53),LL(0x941fdd94,0x5f88797a),LL(0xa3612765,0xbbb4a54a),LL(0x8e2ccc8e,0x4a469e09),LL(0x47a174f2,0xe17602e5),LL(0xc6f2b50b,0x5edc6700),LL(0x887e7ea0,0x8c90c4bb),L_(0x000000e7),
+ LL(0x350806a0,0x8c8ad937),LL(0xbc207b36,0x45322006),LL(0xf3feb2a7,0x29b356ce),LL(0x9772041b,0x4db4360d),LL(0x71532653,0xffd40033),LL(0x62b4c3a4,0x525bb0cb),LL(0xef8cba94,0xb23dfc1a),LL(0x5f95e7e7,0x4230723c),L_(0x000001ff), LL(0x3a9f0d5f,0x05623688),LL(0xe7ca479f,0xe0f2e02f),LL(0x821e669e,0xd9320a75),LL(0x3208dc12,0x2a90f1fc),LL(0xac95bd4d,0xb836d5d0),LL(0x0f15127a,0xa56f1f5b),LL(0x35a8c806,0x4b53533b),LL(0xb5d6ee48,0xfcf4ee1d),L_(0x00000155),
+},
+/* digit=80 base_pwr=2^400 */
+{
+ LL(0xb1b291af,0x63480c29),LL(0x6afae0d2,0xec906027),LL(0xd90afac7,0x067489d0),LL(0x62d3da37,0xe31b78ec),LL(0xd88f38b3,0xff5fafe7),LL(0x3dfa7f35,0x88536101),LL(0x7a6237d7,0x80270f89),LL(0x42a2eac9,0x39890c2a),L_(0x00000064), LL(0x95b6527c,0x38b21960),LL(0xab3e28c0,0x56c8573a),LL(0x49dbf002,0xb06c2993),LL(0x016fc238,0xc550c59c),LL(0x7c26c63d,0x22cb4395),LL(0xd6c87128,0x4a5765b7),LL(0x42f34ea4,0x360be87f),LL(0x9436ed50,0x331a061a),L_(0x000000d2),
+ LL(0xcf6c0f3c,0x23b6d0c7),LL(0x01323c15,0xb2a524b7),LL(0x445c4f05,0xfb280e1d),LL(0xb721bd24,0x43a450cf),LL(0x34d74f50,0x459a3690),LL(0x9ed3c3ca,0xf8a99776),LL(0x9bd35cd1,0xaf456934),LL(0xa1b94559,0x00820fa7),L_(0x00000124), LL(0xc7479e9f,0x93e5dd5a),LL(0xfdaf1391,0xfcfc382f),LL(0x727251e2,0x4776e937),LL(0x9f976e0e,0xfaf93681),LL(0x7e0dea37,0x18ec38c9),LL(0x45662b32,0x0308bb26),LL(0xd581e3f2,0x1a441534),LL(0xc275dc07,0xa1b0d046),L_(0x000001b4),
+ LL(0x9bcb5968,0x702c5bb8),LL(0xdfb47a52,0x33f897ad),LL(0xe16c51a7,0x078f030c),LL(0x5e8bc092,0xb9a4c194),LL(0xa0a224a9,0x0d2a2dbe),LL(0x244c74fb,0x00b01506),LL(0xef3b3eda,0xf4403180),LL(0x44f09c72,0x1da590d5),L_(0x000001c4), LL(0x4a7f0289,0x3c0211ff),LL(0x88323d80,0x1ffe93b1),LL(0x81a127a4,0x7deb5031),LL(0x0bd65111,0x65ffd296),LL(0xff238b15,0x80cef133),LL(0x643d7062,0xddb33d18),LL(0x93ccc6e4,0xc957a463),LL(0x1fcc4678,0xc36fd11d),L_(0x00000184),
+ LL(0x1ccb1806,0xe0e23232),LL(0x5eae4904,0xc2c362eb),LL(0xda675b34,0x2c14f20a),LL(0x13d2fa91,0x60f4ae95),LL(0x6c8c7ff9,0x78df2064),LL(0x6790ea32,0xb702cc14),LL(0x7608da34,0xe2b87bb5),LL(0xadae0fb9,0x6d939f1f),L_(0x000000fd), LL(0xa26a843b,0xc89f77d5),LL(0x5a368ffa,0x265d14c3),LL(0x957c89a9,0xbd1486e7),LL(0x514b7e05,0xa9030ef9),LL(0x537cf3d5,0xb9ea3998),LL(0x4fb32008,0x0c45cfba),LL(0x61ff9565,0x078d5a15),LL(0x1cc6a564,0x4f509bc0),L_(0x00000019),
+ LL(0x665bb52e,0xf7ce0ec3),LL(0x69d2fe28,0x4c059fd5),LL(0x76b354dc,0x1290e892),LL(0x674b639e,0x6d828313),LL(0x951c9220,0xd6285250),LL(0xee815fd8,0x3a0ba16e),LL(0x8ee38518,0x5323ff40),LL(0x6678fced,0x58fd9e73),L_(0x00000153), LL(0x73a8b28d,0xba84ecb6),LL(0xbd048216,0x34998afb),LL(0xfb264967,0xfcd4e06c),LL(0xc024c958,0xd668c764),LL(0x9c3e07fd,0xee500455),LL(0x0ea9e902,0x7be48424),LL(0xdf78504c,0xb185d1cb),LL(0xc315ffe9,0xcfa4801f),L_(0x00000174),
+ LL(0xdb3f67e6,0xdbdf25d6),LL(0x23503a7e,0x4a86faf8),LL(0x58cbd82a,0x727561d4),LL(0x50ad1fb2,0x0994b8fd),LL(0x1d57e2f0,0x1b2b4725),LL(0x15736a57,0x5dcba3cd),LL(0x4df58192,0xec335163),LL(0xf716e579,0xa8c09f90),L_(0x000001aa), LL(0x3615c741,0xe4509eb4),LL(0xef754782,0xbb1dede8),LL(0x7a793f6d,0xa02e32d8),LL(0x27d972fe,0x00b65ecb),LL(0xd0af4ace,0x80ede0c9),LL(0x96816659,0x6c809dcb),LL(0x979a653f,0x943f6f1f),LL(0x0638c8e6,0x2bcc5fa7),L_(0x000001fa),
+ LL(0xc3695735,0x79907894),LL(0x6a94274c,0x923a4f54),LL(0xa698895f,0x6213c148),LL(0x57afe3d1,0x14eca3c3),LL(0x40597be1,0x57638ac1),LL(0x23258bde,0xb1f30c4d),LL(0xb9d09cea,0xe2c1e648),LL(0x544e3974,0x505f2b5b),L_(0x000000d3), LL(0x28a45f39,0x0111ad40),LL(0xbe28f874,0xc3e262fd),LL(0x830a9ee4,0xe3cc3453),LL(0x0fdaa4f4,0x044defae),LL(0xcdb8b9c8,0x06665f64),LL(0x4a06827b,0xb0bfa5e9),LL(0x926f3364,0xaf288ab3),LL(0xd9d3c3ec,0x52d7095c),L_(0x0000005a),
+ LL(0x5eb181f2,0x047db30c),LL(0xbb73f9ac,0xf0b9977a),LL(0xc5355db3,0xa26685fe),LL(0xa356655d,0x48c1a2cb),LL(0x950bb7fd,0xc2c2dc45),LL(0xe766094a,0x437ff8a8),LL(0x80146ca2,0x0b26425d),LL(0x5b7aafe5,0x20ce1d21),L_(0x000001e4), LL(0x1c8a54b7,0x683c3c46),LL(0xee244200,0x806c758f),LL(0xb90af5d8,0x71dee02f),LL(0x67ac6f65,0x53aeab51),LL(0x0f1dfed2,0x762d7338),LL(0x59bf51fc,0x059d5565),LL(0x1432973f,0xa9143049),LL(0xbf133e93,0xc1c8977e),L_(0x000000e4),
+ LL(0xa86b08e9,0x4f81ab77),LL(0x4d06707c,0x8f1bf925),LL(0xaaec66fa,0x4de91bfe),LL(0x49683907,0xb9d75b89),LL(0xac105bac,0x91f21593),LL(0x6506b77d,0xab4390d7),LL(0x7287e5ee,0x7487ed45),LL(0x6c88b2c6,0xbb3803c1),L_(0x0000006a), LL(0x11c071b8,0x97c81ddb),LL(0x1bbbfe37,0xd3ad9501),LL(0x7a1b3885,0x68eaad09),LL(0x7027528c,0xf0a64aef),LL(0xcf860284,0x3c25fb62),LL(0x37b3f120,0x5ae492f1),LL(0xd454de89,0x61c7d5ed),LL(0x02ac32db,0x9d99d9a3),L_(0x000001a1),
+ LL(0x245c4af0,0x97406073),LL(0x02c143ac,0xda94e70d),LL(0x1c3ce7f2,0x639942c8),LL(0x9cde176b,0x7bd79b38),LL(0x0883b19a,0xac9d2c91),LL(0xb4709f2a,0x4423fc39),LL(0x794a6aaa,0x89d178db),LL(0x2e0aecc8,0xf4ffbcc4),L_(0x00000075), LL(0xb872cf73,0xd957093e),LL(0x85b4776d,0x2acbd72e),LL(0x0656f9a4,0xd468fb6e),LL(0xe2017205,0xc79f3d11),LL(0xe6a367a5,0x012b1362),LL(0x73088cac,0x370e3947),LL(0xb86f1933,0x3bdf96c5),LL(0xe8162ca6,0x5d8a34dd),L_(0x000001ac),
+ LL(0x9b09e656,0xeb6d1849),LL(0x81aa411a,0xaae86725),LL(0xd8ee02c2,0x3008becf),LL(0x574081d1,0x53cb17df),LL(0x37bd5637,0xe3afcfbe),LL(0x116f90cd,0xe91cbaad),LL(0x9a6da94d,0x023933b7),LL(0xbabdb470,0x5562808f),L_(0x00000086), LL(0xf3d722e1,0xef4074df),LL(0x2345ac8e,0x1492cda0),LL(0xe92886d5,0x0fa0e7ed),LL(0x31537a63,0x0778badc),LL(0xa8b49a51,0x2034669c),LL(0x85153992,0xace88cb9),LL(0xfd679e52,0x4c6fbbf5),LL(0x48dc5511,0xa37bc767),L_(0x000000e6),
+ LL(0xe7ef2e60,0xcd7037d9),LL(0x52aa0cf6,0x7dc7381f),LL(0x24da2a63,0xc3562613),LL(0x43cb3857,0xfa06da1c),LL(0x5a1b2f21,0xc7806190),LL(0xec8d6d1e,0xf2d57ff1),LL(0x5a0e8065,0x3e9088a1),LL(0xc30f4ccc,0xfbce5c5d),L_(0x000001c0), LL(0x5912141f,0x1bc58b8c),LL(0x19ee91c4,0xbf2996d5),LL(0x41d465ca,0xb39d820d),LL(0x281052af,0x890d83a9),LL(0xa8cb9903,0x32dbf7a5),LL(0xbfad3855,0x309c32fb),LL(0x81d1982b,0x44dec521),LL(0xe04b5e8d,0xbcfee0cb),L_(0x000000bb),
+ LL(0xf141f663,0x6c39f9cb),LL(0x458b556c,0xea205dcc),LL(0xb6c66d04,0x96d440e6),LL(0xa0f1a8e6,0xd4e4d37e),LL(0x3d5c97ee,0xd69c9913),LL(0x92914c77,0x12d04cdd),LL(0xb8bb2a33,0xa42c1185),LL(0x2dee2451,0x66637684),L_(0x00000165), LL(0xe8feb727,0xf2ee4afa),LL(0xb371de96,0x0f971611),LL(0x605c486d,0x50e27936),LL(0x313e3113,0xdf801ab6),LL(0x7cfe0fbb,0xfbec3f73),LL(0x50864708,0x55057cd2),LL(0x3b426634,0xa56700f5),LL(0xe23875b8,0x34b766de),L_(0x0000011e),
+ LL(0x923016ac,0x17eaa1a0),LL(0x28e3f935,0x128b1c02),LL(0xa23b14eb,0x9183c2c0),LL(0x504289c9,0x5ea313d0),LL(0xb5fd0ea2,0x135c854c),LL(0x03f5e8df,0x491bfca7),LL(0xd9abdd7a,0x8b6af733),LL(0x29d5f4e7,0x832fe74e),L_(0x000001e5), LL(0x50113295,0xb89fd770),LL(0x861c50a9,0x6fd08a16),LL(0x1b7e4c60,0xb1a9800a),LL(0xadc9902a,0xbed31f30),LL(0xa5b9d65d,0xc9a0a6d4),LL(0x75c10264,0xe1743115),LL(0xc317e935,0x8c13233d),LL(0xc0c350f5,0xbc15e8d2),L_(0x000000a6),
+ LL(0xfdaa94e2,0x4ea46af8),LL(0x2200fec9,0x3139256c),LL(0x4f2fd88a,0xb9b83d67),LL(0xe894a212,0x5e6f7bed),LL(0x449c5bc8,0xbeebbe0e),LL(0x1e599f77,0x74fc58a0),LL(0x7f4a9123,0x6073c6cf),LL(0x1a08d5bf,0x63816113),L_(0x0000017a), LL(0xacb45b52,0x06826375),LL(0xbd9c13b3,0xf41e6cac),LL(0xc5b15016,0x79237672),LL(0x2f2bfd3b,0xa99e108a),LL(0x1681dcfd,0x22fd3033),LL(0x224f0276,0xc24a2525),LL(0x05e14660,0xf9a0ff9c),LL(0x09f9360e,0xbe09e3fb),L_(0x0000005a),
+ LL(0x1e2ff226,0x33f17650),LL(0x597f6cd8,0x95759918),LL(0x5f1a7fb7,0xb518de41),LL(0x316d41dc,0x966644e4),LL(0x829d89c6,0x7775eaca),LL(0xed7a513d,0x9d45da4e),LL(0xdd14ef8a,0x232852aa),LL(0xc016fff6,0x4687f62e),L_(0x00000088), LL(0x0791f95c,0x2cc46d0d),LL(0xd4641a73,0x04775f23),LL(0xb9dcdfdd,0xc9bd9d15),LL(0x727ace99,0xaec6f67a),LL(0xa77fe3e5,0xeac1ee2f),LL(0x75b923be,0x8f21d632),LL(0x55852cf0,0xb6658853),LL(0xbe6d4550,0x461bace1),L_(0x000000f6),
+},
+/* digit=81 base_pwr=2^405 */
+{
+ LL(0x2c6e3212,0x0a1fff24),LL(0x4b5a6256,0xa45d5589),LL(0xbc1ece0d,0x852bc8f1),LL(0x655945af,0xf4152e99),LL(0xf81d51a6,0x4573b7d9),LL(0x15c74818,0x69e42e80),LL(0x69dba53f,0x55b2c206),LL(0x96245123,0x8c3b8e9f),L_(0x000000a3), LL(0x11c96019,0x8a5146d0),LL(0xc8d9fabe,0x6c8e83c7),LL(0x3fede45c,0x3d5d33f9),LL(0xb87d2fad,0xe1fe306f),LL(0x67a48456,0xf030c243),LL(0x2aa7e6e9,0xb8f59e2c),LL(0x8097392a,0x7ae2ecee),LL(0xdbed7e8f,0x770cdce7),L_(0x000000aa),
+ LL(0x8efeaf2d,0x8c7ed96e),LL(0xf3e2fab6,0x3cb959b9),LL(0xfe65989c,0x4cec2e34),LL(0xb397dfd2,0x2a821089),LL(0x95a4f7a7,0x194fcfc2),LL(0xcd183d4d,0x009eac36),LL(0xc2005f34,0x384df54a),LL(0xc4355ce3,0x7125837a),L_(0x0000003c), LL(0x6218f15a,0xab158f0c),LL(0xc9db684a,0x919d3c1c),LL(0x22157c5c,0x733c654f),LL(0xa5d7e7c5,0x1bb67f61),LL(0x6dc89cd4,0x0cac1f78),LL(0xf6e74669,0x2b55f183),LL(0xb445fa4f,0x9df41e4c),LL(0x69c4dd42,0x100045a9),L_(0x000000a5),
+ LL(0xd8d9bdcb,0x3dd4ca53),LL(0x1306c74d,0x1af7d8d5),LL(0x3e680d58,0x9c6b82f0),LL(0x884ca0be,0x0aacdba7),LL(0x5c62e372,0xd633f595),LL(0x1c4cad9a,0xc84d067a),LL(0x54e3c550,0x4fe24eee),LL(0xbe3f67b5,0xf28e319d),L_(0x0000019e), LL(0xb999b839,0xd75cb7b6),LL(0xa5275bc7,0x5e6b4aa8),LL(0xfaa9f40a,0xe6b156cd),LL(0x1992d1c2,0x16e51f4a),LL(0x0b180928,0x00c94afd),LL(0x6b3427a9,0x0f9d0fb1),LL(0x09eefa51,0x098f98b4),LL(0xd3cae463,0x4d73daae),L_(0x00000180),
+ LL(0x881adc31,0xbb3a93b6),LL(0x8ce1cba5,0xb603dd9e),LL(0x4f5b70c1,0xaed8b0cf),LL(0x5f958dd3,0x5eae2517),LL(0xb70f44e1,0xa5b942f5),LL(0xc526177a,0x02efb949),LL(0xc8dd1153,0x132ba3a2),LL(0xf9288a95,0xffccbb89),L_(0x000001a2), LL(0xc45972eb,0xbc841aed),LL(0x7853d5b1,0x933a99b8),LL(0x6e1536aa,0x85259727),LL(0x238abf3c,0x05488fa0),LL(0x8485ab11,0x1debe07d),LL(0x6d6f6d52,0xf1ad18f1),LL(0x54637f92,0xdfd3c55a),LL(0xa2b58773,0xc41b6804),L_(0x000001db),
+ LL(0x66d98564,0x72366f09),LL(0x9a3f0f97,0x00008259),LL(0xb1a9b87a,0x33f3b0e5),LL(0xe8074b36,0xd83471a9),LL(0x68f935c3,0x59dc097c),LL(0x5ab59d2f,0x049d3329),LL(0xae3c2a44,0x523ad362),LL(0xd39de2e5,0x38178eb0),L_(0x000001da), LL(0x10a229a9,0xad11b358),LL(0xdcf6cbc9,0x8a7d993d),LL(0x2d5c5b91,0x31b67dc1),LL(0xd2d684f6,0x5dd81c8d),LL(0x29c17938,0xec292f8a),LL(0x2fb94c2a,0xe9c267eb),LL(0x67c899b3,0x31e831bd),LL(0xd72dd6a7,0x7b778a58),L_(0x000000ab),
+ LL(0x37a99dda,0xabc73772),LL(0xb8a9bdaf,0x18907ad9),LL(0xac790211,0xd35c8ab3),LL(0x56550490,0x483d71b5),LL(0x9c473d52,0xaed32863),LL(0x796ddfe4,0xc175ce1c),LL(0x39329661,0xf0af8692),LL(0x3411279a,0x1ac1b3f3),L_(0x00000062), LL(0x2f981ba2,0xe7ed779e),LL(0x25706bd9,0x385062b4),LL(0x8826d6b1,0x50749b03),LL(0x8f92597e,0x4d1f3b1e),LL(0xcc7ec8dc,0x5ffacc7e),LL(0xc4c11580,0x903de537),LL(0x82ed5c34,0x92e3ccb2),LL(0x829a6dc1,0xaa91f997),L_(0x00000010),
+ LL(0x8a8271c3,0x46e669a1),LL(0x9bedd70e,0x6dbeb99e),LL(0xe5038aaf,0xc8d58c8e),LL(0xe202e790,0x312f9e8d),LL(0x5eb0a99d,0x2b3b3990),LL(0x6e033ac6,0x8ddb53b5),LL(0xdd9938af,0xcad94c88),LL(0x8fee9f14,0x565b4703),L_(0x00000184), LL(0x2d18c7f7,0xf6c9ab51),LL(0xddec3950,0xd2e14fab),LL(0x8eb24aaa,0x85f6d87b),LL(0xbff04dfa,0x7d46acbb),LL(0x458d7c7a,0x949d94f0),LL(0x5596e98b,0x60ee6372),LL(0x37137ad5,0x20231d27),LL(0xe0d4f3a2,0x8c695e6d),L_(0x000001d1),
+ LL(0x1f851427,0x75a8973a),LL(0xf65e532b,0x125d27c2),LL(0xb7e6ca7e,0x680245ef),LL(0xd37a1c1d,0xc0ac3fa3),LL(0xc8ed8871,0x73ed1f61),LL(0x25a3f922,0x1c0619b1),LL(0xbaaf99bf,0x2fc151e1),LL(0xb9c92ca1,0x61f93b5f),L_(0x0000012b), LL(0x4cd45f13,0x46eca65c),LL(0x2f16b28a,0x181d940c),LL(0xdae561c3,0xdef08156),LL(0xdb51b5db,0x5aff9fff),LL(0xd7d0f3f0,0x56731470),LL(0x9f642167,0x3e4323b0),LL(0xc5c736fd,0xc2c256f1),LL(0xaf757eba,0x85000c46),L_(0x00000005),
+ LL(0xfc825ff9,0xa28756a7),LL(0x6fc9ac38,0xf07539fe),LL(0x19a8908a,0x89d74956),LL(0xc69dedbb,0x934712d9),LL(0x2aaee4e8,0xbbd47741),LL(0x1053c866,0xda8058c4),LL(0x00b68d70,0xc019bbaf),LL(0xb1236281,0xf44074ad),L_(0x000001c7), LL(0xad679598,0xffe5c58c),LL(0x5fe8d191,0xfb4d9415),LL(0x46edaa9c,0x44747329),LL(0xdd0f1cc6,0x34e406e5),LL(0x79f7cddc,0x40ad1213),LL(0xab39e94c,0x470ac094),LL(0x885cb3a4,0x12891647),LL(0x3224c564,0x41e24750),L_(0x000000e0),
+ LL(0x17473053,0x116c3934),LL(0x97765c7e,0x74d1a056),LL(0xf7e7734d,0x2fb92919),LL(0x22455583,0x880ac302),LL(0xc6198a57,0xc983ea10),LL(0x32d7f501,0x3adab6b9),LL(0xa4c1c306,0x3997a013),LL(0x14822e84,0x5da833b6),L_(0x000000b7), LL(0xf8efc5c2,0x2e766181),LL(0xda380c24,0x158c4baa),LL(0x4d96447c,0x6acaba32),LL(0xe953e90e,0x4ed2e3bf),LL(0x86ffae71,0x452c6d1b),LL(0x3af83523,0x49a52fe9),LL(0x41a86c00,0xec5b4f72),LL(0x9c65d29c,0x7bf9771d),L_(0x00000034),
+ LL(0x15231af9,0x83eb4905),LL(0x29b6e8f6,0x35420b50),LL(0x76561721,0xd8dddbf9),LL(0x83f7c4f4,0x776812d9),LL(0x460a8666,0xd3c1656b),LL(0x6901dcbc,0x22e1e397),LL(0xd9c17a67,0xd83adc99),LL(0x7a32d3cd,0x7dfafcd0),L_(0x0000007c), LL(0x66102687,0x8578e51e),LL(0x957c6151,0x9a86b387),LL(0xb2bd85fe,0x553c599b),LL(0x21884750,0xb8b8c27a),LL(0x920c65b6,0xf81924dd),LL(0x6f14a6d0,0x28619568),LL(0x18db08c4,0xab2d8a3f),LL(0x11b85385,0x4e01b95a),L_(0x000001ce),
+ LL(0x5aa706e4,0x0e7a9fe5),LL(0x2110fcf2,0xa8b2d6f6),LL(0x67bdfcf9,0xeaac5dca),LL(0x0435935d,0x39631926),LL(0x399fbc31,0x60795bd1),LL(0x34625175,0x0f561153),LL(0xced09fb3,0xe23ff49c),LL(0xf1b45cd7,0x14acb326),L_(0x00000110), LL(0x4ec88551,0xd20c517f),LL(0x3c8be0dc,0x221ae5ee),LL(0xd895d43a,0x6705afa1),LL(0x00fa5270,0xb373ab4d),LL(0x75678bdf,0x64e2886b),LL(0x47650c25,0x7e0e12f4),LL(0xab5c87d2,0x0c9aec40),LL(0x15ef4537,0xdac6c6e3),L_(0x0000016b),
+ LL(0x69bd1ae9,0xe2ef5aee),LL(0x0585cc2f,0x1e6188c6),LL(0xa3c01465,0x301c46a3),LL(0x1cc1ea41,0xf7f76048),LL(0x16944109,0xedd90482),LL(0xdc473809,0x3da1ef77),LL(0xf7267c80,0xfefdbcd3),LL(0xfd92f40f,0x230df237),L_(0x000001fa), LL(0x365d3aae,0x5f29db47),LL(0x93437f82,0xd2267583),LL(0xf4a57394,0xe0388ea5),LL(0xb28bca60,0x5cea0f68),LL(0xbf640edf,0xc68dbd2f),LL(0x8db4f9b6,0x24be537f),LL(0x9d943d05,0x7704cfe6),LL(0x4a1f249a,0xfc85d03e),L_(0x0000017a),
+ LL(0x15eb727b,0x79b64a1c),LL(0x82dd22e4,0x51a73cb4),LL(0xa1e0df42,0x5140d8ce),LL(0xf6d38530,0xe8523991),LL(0xbf2d199e,0x578593ff),LL(0xaabd945b,0xcfef51c1),LL(0x789ae01d,0x9c35735e),LL(0x685cad78,0x2d15c55a),L_(0x00000195), LL(0x9ac2d994,0x5bf21520),LL(0x5119208b,0x3671fecc),LL(0x477379bf,0xcfbe3b2b),LL(0xdc4fe9f8,0x98a8aee0),LL(0x6e915903,0xa7edc740),LL(0xc4cb91a1,0x71211193),LL(0x1e307364,0x96026ba1),LL(0x814b8b56,0xf21a90b1),L_(0x0000014f),
+ LL(0xdfef19d0,0x30a583d8),LL(0x8521445c,0x192a3c38),LL(0x8651795c,0xe24d5be6),LL(0x6cfd9cef,0x273daff4),LL(0x78499d8a,0xbe3d67fc),LL(0xf4d9c05a,0xfff37ca4),LL(0x9d03588e,0xbe977f9e),LL(0x2b3a2963,0xc6d47c43),L_(0x000000d6), LL(0x6c46a157,0x146210b3),LL(0x092ba668,0x00fc64e7),LL(0xcfe9730b,0xc41f8e66),LL(0xc11dab42,0x79417f9d),LL(0xff89645e,0xddf57c66),LL(0xd0e35f15,0x98273f3c),LL(0x49f211d9,0xea35684c),LL(0x1b8dcf07,0x09d76ca4),L_(0x000000aa),
+ LL(0x9d8b99d3,0x7dad9f18),LL(0x96f2ea6f,0x96139562),LL(0xf5d410b4,0x86c29eba),LL(0xc6b1f46d,0x2dbba6d4),LL(0xb1709ad9,0x9de07504),LL(0xeea80cc0,0xc7c9ec95),LL(0x47d01eb6,0x99076486),LL(0x19b1d6cd,0x9e10cb39),L_(0x0000014b), LL(0x0a5f9f34,0x53cc24a0),LL(0x5e367eff,0x672781ea),LL(0x275cfce0,0xedc5266f),LL(0x92d98139,0x0d9e2099),LL(0xc2c0efd5,0xf3d9cb26),LL(0x687bde18,0x647d23fe),LL(0xd97b9ccb,0x0c54a71a),LL(0x258eaff2,0x374fd27a),L_(0x000001cc),
+},
+/* digit=82 base_pwr=2^410 */
+{
+ LL(0x30cbad8f,0xfa23022a),LL(0x0f3c6cf3,0x9f3a186b),LL(0x33420e3c,0xdc6e922b),LL(0xbffbbdb1,0xeac227c1),LL(0x7aa59cde,0x43d5b878),LL(0xe3673dd9,0x513a5be5),LL(0xae77a5b5,0xbc4c0fef),LL(0x8e4c10fc,0xd4728351),L_(0x00000133), LL(0x2a245057,0x020fe0ed),LL(0x5e8e914b,0x39e8625b),LL(0xdbd2dbf4,0x3dfac893),LL(0x5bf5b95c,0xc2cfde2a),LL(0x29c6d879,0xca30a315),LL(0x05a9a75f,0x3ac05ce9),LL(0x894b84cf,0xb5445553),LL(0xeb87696c,0x45350dc2),L_(0x00000050),
+ LL(0xf9b134fd,0x05a92256),LL(0x23245303,0x7ccfce0b),LL(0x6d8cb621,0xd61ca36a),LL(0x6d0ef54f,0x210c1e23),LL(0x1a182b1b,0x8ae4f253),LL(0xb1f2e2c4,0xa16671b7),LL(0xd29f38da,0xae1cf556),LL(0x3fa6c8ea,0x878e21c8),L_(0x000000d7), LL(0xb9a18df6,0xa098406d),LL(0xd588a978,0xd15a5ed3),LL(0x781ea818,0x5e68786d),LL(0xad06fce1,0xf98680c4),LL(0x66d7a550,0x981589bd),LL(0xd3ff4140,0x7ff83976),LL(0x6ffe6dff,0x9c88eabc),LL(0x47479f18,0x2dc93316),L_(0x000000e7),
+ LL(0xdb783254,0xe1b91784),LL(0xcc2bd843,0x7a80b2cc),LL(0xda0b8166,0xaa3b4ff9),LL(0xaff9f442,0x88dcdac5),LL(0x38067551,0x47d782df),LL(0xba990049,0x82a02e17),LL(0x02eb92a1,0x61467fcd),LL(0x29ea45e3,0x2eb8d57b),L_(0x000000e3), LL(0x15b7f2b2,0x3170353b),LL(0x4a58e306,0x4a6890e8),LL(0x0dcaea11,0x2ee85176),LL(0x198b5c45,0x79793d5c),LL(0x9872dd7c,0x5ad3ba16),LL(0x2940cc17,0xacaf46a5),LL(0x9d812262,0xb1cff849),LL(0xee571706,0xa1e0320f),L_(0x000000e0),
+ LL(0xeb0d7e33,0xb0731c42),LL(0x657bac9b,0x5dc372a3),LL(0xd967282a,0xa9374ab3),LL(0xf9ac8856,0xbdf21057),LL(0x3b740967,0xfec8274b),LL(0x56933024,0x5596459a),LL(0x94a16871,0xc8d21c17),LL(0xef7bcfc7,0xf6a0ea98),L_(0x000000f1), LL(0xf9af7b9a,0xbfd8b660),LL(0x7b728a24,0x9cb13ed9),LL(0xee5e0227,0xa450fd15),LL(0xbd3b7d28,0x972ff1fe),LL(0xf367bf5b,0x08f71ea2),LL(0xaa4191b6,0x496276ed),LL(0x52d016bf,0xc4a6a4c1),LL(0x52e7dadd,0x513e10bf),L_(0x00000161),
+ LL(0x1afab699,0x049e7f00),LL(0x88380090,0xb4090ebe),LL(0xfc780e00,0x9088eeb6),LL(0x294d8c96,0x7d582ac2),LL(0x4027746c,0x5e897916),LL(0xc4fa7517,0x24defc92),LL(0xb30f7062,0x7efacebb),LL(0xe29a1ed9,0xd337aeb6),L_(0x000000f1), LL(0x856dc4c3,0xee3e4e0d),LL(0x6b56aa33,0x971e660f),LL(0xb6b834b0,0xabff8d16),LL(0x4f4e4f36,0x791ab99f),LL(0x1407b72f,0x49828107),LL(0x81293d19,0xdc829510),LL(0x1f2a3c51,0x359122da),LL(0x3bfa8d54,0x99db1fdb),L_(0x000001e7),
+ LL(0xdf15ca96,0x121949d5),LL(0x705e6cb5,0x15f3e1fa),LL(0x844205ea,0xda2168d9),LL(0xb4128cbd,0x793edfff),LL(0x751feb1f,0x332f4e92),LL(0x4c804349,0x4429da30),LL(0x26bc232c,0x8cea38b7),LL(0x753baf61,0xb3299d3c),L_(0x000000d5), LL(0x88e43827,0xb46e7eb4),LL(0x41b7f39b,0xc6fd29ba),LL(0x98261154,0x4974c56e),LL(0x502ce35f,0x0efcc622),LL(0xad5a1de8,0xfd41558a),LL(0xa51d36ff,0x1a681fdd),LL(0xf2ea91c6,0xaa082cc2),LL(0xf7b13d69,0x107dcaed),L_(0x000001ce),
+ LL(0xa66a52a8,0x208e5e12),LL(0x9cf1d09b,0xa19a455d),LL(0x4d39c2fb,0xbd4d9e44),LL(0x0adaf826,0xd068570e),LL(0xfd187cbc,0x93225311),LL(0x2398aca7,0x490180a0),LL(0x2dcbb906,0xcee10c1a),LL(0x40723e9c,0x71dc29fc),L_(0x00000018), LL(0x0caf9248,0x7f7fda0a),LL(0x722d1676,0xbe8a621f),LL(0x96407066,0xe524661e),LL(0x3a360a23,0xaa8ac484),LL(0x22dc1578,0x9532f3a1),LL(0x70f20b2b,0x936a98d0),LL(0x4e640ba5,0x10c24716),LL(0xc78e13ef,0xad48efab),L_(0x0000004d),
+ LL(0x8ced176d,0x49979e6d),LL(0x1d8f2f21,0xb3c390a7),LL(0xd1cc9018,0xff49ec42),LL(0x805d407d,0x56592d13),LL(0xb92c79f6,0x69b4fae8),LL(0x7816250a,0xea40b75d),LL(0x9c23c189,0x98e49fbb),LL(0x012080c6,0x8f035630),L_(0x00000189), LL(0xde297ec2,0x394adc76),LL(0x39d2e9b4,0x084a2dca),LL(0xa4a3c98c,0xff54162f),LL(0x4df52d9f,0x847a48de),LL(0xa6af6c27,0x9a4d9dcc),LL(0x128a4972,0x96ed3609),LL(0x8323c41b,0x0a200116),LL(0x81fed229,0xa4fde51e),L_(0x000001e7),
+ LL(0x20d87189,0x08f2635f),LL(0x6ccede28,0x6b5f8018),LL(0xc2a0e842,0x1a1eaa9e),LL(0x09c6bbfb,0x590c83ae),LL(0xba912027,0xb05367b2),LL(0x98c59c39,0x363d5716),LL(0xc607367d,0x2738b72f),LL(0x76fa4bf8,0xafbb3680),L_(0x0000014c), LL(0x04011fd9,0x6b33299c),LL(0x42860e67,0xfb00a1e0),LL(0x95c30a5c,0xc7ee4546),LL(0xc597748e,0xbb5a242e),LL(0x3ed03861,0xf0e0361f),LL(0x87708c93,0x2149d193),LL(0x7590a638,0x483134f1),LL(0xc66e8a9d,0x85cc2776),L_(0x000000e0),
+ LL(0x3813f012,0x5ffac9a4),LL(0xc0d4789d,0x3e79348e),LL(0x955e2b14,0xdb2d28b7),LL(0xe25f9f8b,0xc1656e1c),LL(0x6715563b,0xec42f2f4),LL(0x79f7e28f,0x2aead585),LL(0x106b8506,0x201ba118),LL(0x7f8c385c,0xe4fe7233),L_(0x000001ab), LL(0x0507ebcf,0xa8ba08d5),LL(0x035af551,0x5db82217),LL(0xe87f61ae,0x97aaf3ee),LL(0xeaf13d4a,0x5f02aeda),LL(0x0476d73b,0x05c9a1af),LL(0x8d9103dd,0xbbd0da23),LL(0x4b324ed6,0x4516539b),LL(0x0edd4904,0x253727b2),L_(0x0000009a),
+ LL(0xfad3e533,0x9fbd42a4),LL(0x2540903f,0xd7649f2b),LL(0xd8fbba0e,0xc6189edd),LL(0x6a06d4e6,0x1ecce6bf),LL(0xcbba2a3b,0x5c61ec36),LL(0xdb49be34,0x447d3062),LL(0xe4b0ad6c,0x49fc7fee),LL(0x1394cdb0,0xcc99bb8e),L_(0x000000f5), LL(0x1172029d,0x30a8e021),LL(0xbd509669,0x6f8f7c76),LL(0x34a06ccf,0x28f39de2),LL(0x1f805a36,0x5b84e8ae),LL(0x95bcde27,0xa9d053ba),LL(0xd196b2b5,0x4777e8cb),LL(0xbc21fa82,0x1bd75421),LL(0x58e2b8c6,0x9c786320),L_(0x00000036),
+ LL(0x7a23ceea,0x51aba8d2),LL(0x241c7fb7,0x58878762),LL(0x60069d96,0x51c9d281),LL(0x30ade2dd,0x9b631718),LL(0x91c3eb50,0xf909879a),LL(0xca8dcb86,0xee7eb48a),LL(0x9244bc3d,0x3828bf79),LL(0x2a064705,0xfb4bc920),L_(0x000001ed), LL(0xa015f7fc,0x3ba48f85),LL(0x2b6a12f5,0x95ae129c),LL(0x444e10a6,0x8aeddb2a),LL(0xecfba54d,0x0e8bdf6a),LL(0xc7c39b4f,0x0a72c4d1),LL(0x73b3e601,0x5cdfd0f3),LL(0x99b50a0d,0x5168c9e0),LL(0xbed1929d,0x87bf31c8),L_(0x00000050),
+ LL(0xa9be603a,0xd22b9ef5),LL(0xc53e7872,0x9558bd84),LL(0x154e0475,0x65401d38),LL(0xbb71dcda,0xf42190a1),LL(0x79891c59,0xcce4f8f7),LL(0x3876a596,0x5ec40734),LL(0x91d0b32b,0xef02bcea),LL(0xe2d3dc41,0x22d8fe83),L_(0x00000158), LL(0x48a15725,0x7ac11538),LL(0xde31cc2a,0x59724de2),LL(0x949e5fc7,0x1c37f0ed),LL(0xc39190ad,0xc058927a),LL(0xb63be947,0x6bda54d7),LL(0x1d0ceb2d,0xcff0cf31),LL(0xac38d621,0x23f872f5),LL(0x04b46672,0x160a5f19),L_(0x00000052),
+ LL(0x13238feb,0x8c998602),LL(0xca47bfa7,0xebe29b0a),LL(0xe22527b3,0x7f9eebf4),LL(0x127b07f2,0xa6e2939d),LL(0xca0c1812,0x6469e55a),LL(0x65afd9e7,0x46a7771a),LL(0xf84da7e1,0xbd0864a1),LL(0xb5dbfbc9,0x87ff16c0),L_(0x000001f1), LL(0xb3a29f77,0xbf5bf543),LL(0xb2d15c04,0xd9bcacc1),LL(0xb632b37f,0x5041f46d),LL(0x9bed186f,0xb690ffbb),LL(0x4873f91b,0xeebd39f1),LL(0xff2ad723,0x79a50cae),LL(0xd0c46d7f,0x6b3bea02),LL(0x4a5b4d01,0xf2c26cc1),L_(0x00000112),
+ LL(0x0bb28261,0xe9314bb7),LL(0xa04bdd40,0xaab60946),LL(0xe0b7c3f9,0x20cc2e25),LL(0x1e792761,0x60fd58e5),LL(0x7823f278,0x561086d3),LL(0xfa3bf02e,0x7b6170af),LL(0x0390ab9e,0x4a18459c),LL(0x0c346fa4,0xf810e889),L_(0x000000b3), LL(0xb623e6eb,0xe73d3d7e),LL(0x43490dbf,0xc1f1a1fd),LL(0x49e9e831,0x0a18b7b1),LL(0xe619f992,0x0c6e526d),LL(0xdb9252a1,0x954cd738),LL(0x6a826c49,0x41105a8b),LL(0xddcbb9cf,0xe9217743),LL(0x750efcbf,0x3f5b0793),L_(0x00000036),
+ LL(0x90c2c466,0x57128a20),LL(0x1345257c,0xdbf610a8),LL(0xd16c4a33,0xbff009fd),LL(0x8f1d5b65,0xb49af8c7),LL(0xf560ad02,0x0eb8499d),LL(0xfb45ea45,0xa52dc630),LL(0x7e352023,0x8ada8ac5),LL(0x2fd6cb3d,0x74b6bfb7),L_(0x00000107), LL(0x8f6d7783,0x4a52a42a),LL(0x3f44af1f,0x4175b2fd),LL(0x05fe7f14,0x079ac149),LL(0x1757d0c0,0x475fac70),LL(0x88ae6d1c,0x7bfd9387),LL(0x33f3d56b,0xb7dbf13b),LL(0xcacad131,0xebd1df20),LL(0x8aef62c8,0x20404609),L_(0x0000013a),
+},
+/* digit=83 base_pwr=2^415 */
+{
+ LL(0x96fd03e2,0xf3f782f7),LL(0x0bf4ad5c,0x3ffeae62),LL(0x8514f603,0xe39ca015),LL(0x5633e085,0xa88f4e54),LL(0x94884fbe,0x85fc77f2),LL(0xf605882a,0x2678c646),LL(0xa505f9b1,0x799ba323),LL(0x23217b43,0x88a00292),L_(0x00000141), LL(0x032e8744,0x29194f6c),LL(0x6cab181a,0xa932a791),LL(0xf60ec063,0xb94fb0f9),LL(0x217a0ff0,0x8f066aff),LL(0xd03ea56b,0x56ee8b26),LL(0xc1ffed4a,0xefbf8ce2),LL(0xed130515,0x922eb114),LL(0x74474339,0x2e17e43d),L_(0x000001e8),
+ LL(0x88affb50,0x5fc7f37a),LL(0x170a0c1c,0xa1f73a2f),LL(0x83474ff9,0xea811929),LL(0x4738ed4f,0xdd78686b),LL(0x24d293dc,0x16188a23),LL(0x36670cd9,0xc585fd52),LL(0xa2e54dbb,0xd3b67188),LL(0x10b37344,0x06ec68ed),L_(0x000001a3), LL(0xb4548b08,0xfbe0b348),LL(0xad120991,0xef3cdca5),LL(0x034c9a59,0xd16cfcd2),LL(0x56699960,0x10f2524f),LL(0xf6df1f5f,0x4733c5f1),LL(0x98a50032,0x757f84ed),LL(0x2ce4fa9a,0x032f7eec),LL(0xd296f3ba,0x6c007ae3),L_(0x000000c6),
+ LL(0x4c96fb7e,0x71db44c9),LL(0x7ac3b1c1,0xe9e2107d),LL(0x6305a422,0xa60259b2),LL(0xc0b70492,0x17e1f71b),LL(0x3dedfaf7,0x57f8d178),LL(0x15a8c62d,0x7a704e50),LL(0x81a4724b,0x3b26accf),LL(0xdf992c3c,0x03ad3ca0),L_(0x000000b7), LL(0xe35cce3f,0xc9cc0ded),LL(0xc51c6e93,0x00949cad),LL(0xba4d9081,0x8de8b3c3),LL(0x274926f6,0x839aef68),LL(0xf13d3b8a,0x40a2e3c7),LL(0x90113a91,0xef4e7433),LL(0x1f472807,0x8320657c),LL(0xd4accc1a,0x34dbb9d6),L_(0x000001c4),
+ LL(0xc34e9382,0xcd77eae7),LL(0xad7f0d81,0x13604a2d),LL(0xd0e3fde5,0x70443d13),LL(0x6cb59871,0xc5f3e64c),LL(0x7a8441d1,0xadfd909c),LL(0x00532361,0xefba7861),LL(0x0eb9abb4,0x05155907),LL(0xee4fe6fb,0x400f9708),L_(0x00000166), LL(0x7579200c,0x128ad5ec),LL(0x49006579,0xc2659737),LL(0x8cf2fa39,0xc9df0a7f),LL(0xdb548c37,0x648b652d),LL(0x3da31069,0x075eeef1),LL(0x34916a7e,0x04d0e409),LL(0xea6b7825,0x08fd613b),LL(0xba92eb2c,0xed99155b),L_(0x00000149),
+ LL(0x47521ca4,0xc24e86b5),LL(0x555d9a6b,0x572924ea),LL(0x878c09b9,0x379539ca),LL(0xb6b82a15,0x8666f974),LL(0x72ba5827,0x2d9ff656),LL(0xb17ece57,0xc68cfdb5),LL(0xfe917da6,0x22f34e2a),LL(0x08992968,0xfd615e21),L_(0x0000007b), LL(0xf77f07dd,0xba763f11),LL(0xf3886c72,0x11e3d2aa),LL(0xa4c6b62d,0x550a0527),LL(0xe4eac1e4,0x6a7880c8),LL(0x9b86f1e0,0x00ea68f4),LL(0x87cc2f01,0x55e1d3f3),LL(0xa6daef73,0xa5a26f0f),LL(0x2061095b,0x9af79ad8),L_(0x0000002e),
+ LL(0x8b5ab4da,0xbf85411a),LL(0x7b991f0d,0xa933992a),LL(0xce47a748,0xc820accd),LL(0x662f2eb8,0x12508cc5),LL(0x964b5fdd,0xadddfe6b),LL(0x1358db73,0xf97a44a3),LL(0xfefeacaa,0xf544c5dd),LL(0x3a084f6f,0x820fa340),L_(0x00000094), LL(0xa4ad406f,0x54cddbeb),LL(0xec844e89,0x92a7fe19),LL(0xa4c49f5f,0x30484bff),LL(0x8eb76b96,0xf75a70ec),LL(0x414948f0,0xc139503c),LL(0x7606dff2,0x2fdf031b),LL(0xead62083,0xc5fa11a5),LL(0xf7a1eba7,0x4285147e),L_(0x000001d8),
+ LL(0x7ec431d8,0x2ebaaf47),LL(0x3c1a318b,0xd9561acd),LL(0x57cb3287,0xf1f803a4),LL(0x97882cee,0x97ac71c6),LL(0x08071010,0xf26f5efd),LL(0x60ed1a2f,0xe4333f2a),LL(0x76efc905,0xc5d26fd2),LL(0x4101ca9f,0xaa75d93c),L_(0x000001c0), LL(0x75779876,0xf709921a),LL(0x294a8042,0x5ab89053),LL(0x0dc515ed,0x5f21558b),LL(0xd5146f68,0x1cdf8e37),LL(0x8dcdaaee,0xe4930f54),LL(0xacb8f4a6,0x58634cb4),LL(0x507294c8,0x20ac12b8),LL(0x38b15ebe,0x4cdf2cba),L_(0x0000007e),
+ LL(0x6973a3da,0x5d8f611c),LL(0x3f4e86dd,0x799bf33f),LL(0x749fb625,0x4a326f63),LL(0x667bd358,0xa8161392),LL(0x060fa9fe,0xa3a8de55),LL(0xc4af999e,0xdd75d71a),LL(0x18b1e644,0xc8783194),LL(0xe995c857,0x66a68c67),L_(0x0000017b), LL(0x32c7afa5,0x22bb4a07),LL(0x08c59a72,0xc7e0e1a6),LL(0xe1132506,0x1fa09057),LL(0x5c6a1998,0x6b7bf39c),LL(0x41920509,0x8ab7490c),LL(0x462ba7d3,0x9e016ba7),LL(0xdc3595d9,0x1207f474),LL(0x6a3d8c9f,0xd6a83663),L_(0x000000a5),
+ LL(0x2b8fd9cd,0x606dd096),LL(0xaea5acbf,0x3ef0fe25),LL(0x4859d96e,0x078a8287),LL(0xf923a972,0x0d66d4df),LL(0x660fec36,0xb27b9ec1),LL(0x102d1cc4,0x1d991f63),LL(0x730fac93,0x0c8cdfad),LL(0x601a8644,0xf814f65b),L_(0x00000164), LL(0x55d58869,0x0d313b90),LL(0xde263f83,0x11dbdf4c),LL(0xcde2808c,0x824b53bf),LL(0x6aad6afb,0x94547c69),LL(0x864c21db,0x6771d459),LL(0x65c1681d,0x7f15bc35),LL(0x95681ca9,0xeac68bf9),LL(0x78f00d83,0x5d523cdb),L_(0x00000161),
+ LL(0x2f058d88,0xb2e8d253),LL(0xaca02a59,0x15502597),LL(0xbd7d1caf,0xa0dfb1e8),LL(0x680e361d,0x9355f155),LL(0x2ed31cfd,0xb0064d2b),LL(0x308047c0,0xf348830f),LL(0xbffaf7d4,0x7bb7440f),LL(0x553b98e1,0xbe483a5a),L_(0x000001e6), LL(0x9f0f6eac,0x25881bc3),LL(0xa7105d49,0xd655e7e9),LL(0x033db883,0xdc82f09a),LL(0x7d5a4975,0xa17847e9),LL(0x4036e619,0xe9b20930),LL(0x048479d0,0x34fdadf8),LL(0xe6c7daa4,0x19412216),LL(0x152f330b,0x6eae10eb),L_(0x0000016c),
+ LL(0xc41a7939,0xcb26a326),LL(0x78d31411,0xa365755c),LL(0xd3a391dc,0xe18d1f8e),LL(0x25f34512,0x72a34b02),LL(0x345c60dd,0xd3613f12),LL(0xe2be6e2f,0xee2aebd8),LL(0x116aa632,0x92435b38),LL(0xa7cff2c3,0xccdf1cc9),L_(0x000000df), LL(0x342a1414,0x9da3251e),LL(0x650f3cbb,0x1c4cfe7a),LL(0x93ddee66,0x90734ecc),LL(0x1551811f,0x6d901fe7),LL(0xcc1cef07,0x0c7d5cd4),LL(0x3cf5fe87,0xf0de3068),LL(0x628a5bd8,0x56e883b0),LL(0x077d4d10,0x9f410795),L_(0x0000007e),
+ LL(0x2d362cca,0xfb4260cc),LL(0x99614b58,0xe2d527b8),LL(0x67cb8aa3,0x08c1f0b4),LL(0xef71b82f,0xc4649ad1),LL(0x4dc68072,0x11a9313c),LL(0x1ac298aa,0x65002fbe),LL(0x9f237961,0xe90bf539),LL(0x537dfdd6,0x5b64f24b),L_(0x0000011c), LL(0xfcf6c830,0xf2e76469),LL(0x4ed4174a,0x51f1bc5f),LL(0x3a450f7e,0x83c0406c),LL(0xb53708a6,0xaa7dce02),LL(0x2428a6e3,0x44b377b6),LL(0xf1abc0df,0x9c1a58f5),LL(0x0f02c35e,0x27c5458b),LL(0xea8718da,0xc56a6b16),L_(0x0000015b),
+ LL(0x1709bab6,0xd1568e14),LL(0x5208725a,0x11bb7351),LL(0x3937bb45,0xe6e5c9ed),LL(0x51ec95b9,0xcf7661c1),LL(0x2e23be41,0x6ad385c7),LL(0x743b0e8c,0xe91385d0),LL(0xdfe84bbc,0x6fd97535),LL(0xdce16477,0x922ccac9),L_(0x000001db), LL(0xef8587b7,0x0e47600f),LL(0x8f375855,0x6859ef6b),LL(0x529ee446,0xc03de2c7),LL(0x84c625e6,0x6f7cbb53),LL(0x3af54a02,0x29eb9d15),LL(0x37cbf19d,0x750b2d9f),LL(0x2dc61071,0x28f78635),LL(0x6b20c9d0,0xc61fd9cc),L_(0x000001b7),
+ LL(0x78134d37,0x3d575868),LL(0x09f53723,0x6cf5af74),LL(0xfc4fd018,0x39a8ae6d),LL(0xb54df4cc,0xb1d402e8),LL(0x25f3046d,0xeece717b),LL(0x98af312a,0xa13a0c5d),LL(0x5f96c47d,0x7f73d630),LL(0xc80a3e3a,0xb8b39587),L_(0x00000180), LL(0x7f27d5a2,0x38bbf8fa),LL(0xc4360f93,0x2109c7d0),LL(0xe57b26a1,0xeea6004b),LL(0x32aad5ae,0xf9dededa),LL(0x341aa5da,0x6abc8307),LL(0xfdd6b0a1,0x88080bda),LL(0x4cecd6e0,0x1d4fa881),LL(0x24b2b7fe,0xdeba0f5f),L_(0x000000a2),
+ LL(0x9a724982,0x5ec2d29e),LL(0xa69853d7,0xd1a7ff3b),LL(0x4e7a173c,0xffeab3d8),LL(0x9f30735d,0xdf72352a),LL(0x92186213,0x469f7a55),LL(0x2d184184,0x15c208a0),LL(0x29514acf,0xa37b763a),LL(0x91393991,0x75a2695b),L_(0x00000124), LL(0xa16bd801,0xf0588b07),LL(0xc8dafbba,0xda133516),LL(0x3aebd875,0xf622ae4f),LL(0x34fb368f,0x4f336c4d),LL(0x0b5d9d6e,0xc6eb3519),LL(0xa586248a,0x6d28f06f),LL(0x6daf558c,0x2f3e52a1),LL(0xfb60040b,0x2b032cb3),L_(0x000001f7),
+ LL(0x05cc19d6,0x6d31ebaa),LL(0x2f30e929,0x3edd43b0),LL(0xc72cbbb4,0x827c79aa),LL(0x7829df3e,0x4e4cf8d5),LL(0x98bb6262,0xffe745fb),LL(0xad894f05,0x50b350aa),LL(0xb566ef19,0xf2ea5e2d),LL(0x37f6dcf4,0x89295e1e),L_(0x000001ae), LL(0xfa34202e,0xd748da48),LL(0x68fd9ed5,0xe1cf505b),LL(0xc7778cb3,0x3af31b86),LL(0xdadb4507,0xfe717fdb),LL(0xb4b6e80b,0x13036b30),LL(0x2c3f1ee4,0x482b138b),LL(0x4fc01593,0x71e1ed1e),LL(0xd788bd27,0xe78b3e84),L_(0x000001cf),
+},
+/* digit=84 base_pwr=2^420 */
+{
+ LL(0x7d9afb73,0x1c085462),LL(0x2eb9d35d,0xacf6649f),LL(0x38a8a9ec,0x095acf4c),LL(0x78be52c0,0xf7d7ea21),LL(0x48f6e06d,0x115ce7bb),LL(0xbedc8285,0x7f232680),LL(0xe51e8f4b,0xd24103a6),LL(0x09aa0bc0,0xd9c59aaa),L_(0x00000106), LL(0xe11c4bc5,0xf757159c),LL(0xbc8d09f1,0x0e9e10c0),LL(0xe3621884,0x60d7345b),LL(0x822e5e0a,0xddc802d1),LL(0x6ae792ac,0xf49763d7),LL(0x868a6be0,0xff0f1717),LL(0x7cae1bcd,0x69443786),LL(0x8bfe19f2,0xe856270e),L_(0x00000073),
+ LL(0xe01b8994,0xe496416a),LL(0xa213f31c,0xdc0825ce),LL(0x0281aa93,0xe4450bdf),LL(0x236853f9,0xc8c09e59),LL(0x841e294d,0x595c72a5),LL(0x1e14b03a,0x2bc6e538),LL(0x46b3008c,0xef20b035),LL(0xa57d1874,0x464d68ec),L_(0x00000160), LL(0x5951a61c,0xd36a1693),LL(0x5b84b925,0x1712f765),LL(0xc1e05016,0xa422f3fd),LL(0xa758020b,0xb022819a),LL(0xb6927405,0xfced2aa8),LL(0x13a79822,0x9ae63d93),LL(0x87cbebb1,0xcdd9c078),LL(0x13e45feb,0x2915f65e),L_(0x000001cb),
+ LL(0xc434f1f7,0x878049fe),LL(0xf0c9ca48,0x692a3fe1),LL(0x277fbbb0,0x7ad48261),LL(0x263dc0fe,0xc6fec032),LL(0x7e09052a,0x04d38aeb),LL(0x37fd6838,0x6c55fb12),LL(0x53925e9d,0x63bce4b4),LL(0xc33e2d82,0x3308456a),L_(0x000001c9), LL(0x70a764c5,0x705b2adb),LL(0xb9f1bed9,0x3bab4631),LL(0xb4850149,0x37a14535),LL(0x2385e829,0xcd9ea79c),LL(0x07aa5ebd,0x17e5b5eb),LL(0xd3216565,0x8fb6885f),LL(0xc6b2bd87,0xce87f791),LL(0xd44bfcfc,0xa6e61bca),L_(0x0000018d),
+ LL(0xd4a7c1bb,0xad86ee95),LL(0xf741fd13,0x1edd6ede),LL(0x85b8fada,0x08912214),LL(0xb65b3c0a,0x30092262),LL(0x3583aac0,0x6716727e),LL(0x817eec2e,0xd6729d8a),LL(0x33bfe296,0xa92ad342),LL(0x779921dc,0x32a04806),L_(0x000001b5), LL(0xc1373f0b,0x5632a2bf),LL(0x2c2b1683,0xa8cd4f47),LL(0xa4cedeb1,0x32a4b6c9),LL(0x180690c1,0xfa510c76),LL(0x1eca05f9,0x51eb02c4),LL(0x2e0f4e05,0x63213fc5),LL(0xb6165cde,0xd91b429b),LL(0x1fdd188c,0x86f862bc),L_(0x00000017),
+ LL(0x52629f76,0x87d39d0d),LL(0x07dbdb1e,0xcaaa9976),LL(0xeb7d6dd2,0x02ffcf23),LL(0x7e0cd30a,0x78d51085),LL(0x83ecd227,0x961e1f15),LL(0x54655c5e,0x8aa70a14),LL(0xf96ec7c6,0x62c8fb1f),LL(0x64d2f55e,0xab3379b4),L_(0x000000b1), LL(0xb6e904d2,0x0bec2602),LL(0xef59ae4f,0x80f6effa),LL(0x330793e6,0x54960688),LL(0x2442ae08,0xff5a5fdb),LL(0xc5e3d773,0xc6ac0199),LL(0xcacfcecb,0x2fa7a795),LL(0xc57e52d1,0xdfd6f9bf),LL(0x2e4eaeaf,0x8f282ce3),L_(0x00000015),
+ LL(0xefeeeccb,0xd77ed0ff),LL(0x9db74ad1,0x5e752d76),LL(0x0b6200a7,0xfc315b24),LL(0x7b48ab8c,0x38ef4859),LL(0x6f975045,0x980da41b),LL(0x09695a2e,0x0010c201),LL(0x0d2b23ac,0x7b7fe53f),LL(0xfe8b4888,0x54fafa1e),L_(0x00000174), LL(0xc97b952e,0x6b8cb163),LL(0x16bdd26e,0xd62feeed),LL(0x6129cfd5,0x9be7e3db),LL(0xcfa4489e,0xd804ec9d),LL(0x8f551707,0xadb1fbcf),LL(0x055312a2,0x05be2283),LL(0x7d87937c,0x33c9f74b),LL(0xe5edd3be,0xa04388d7),L_(0x0000011b),
+ LL(0x854b2f45,0x223a8078),LL(0x954aed2a,0x155358a6),LL(0x30349ae5,0xae186e4b),LL(0x982c7a2a,0x15564aa5),LL(0x26ca4f64,0xbb73fd2e),LL(0x3fca013a,0x2d10cb06),LL(0x3b01aea9,0x33610496),LL(0xd0f1f68f,0x51efcbbc),L_(0x0000008d), LL(0x7f69aedb,0x1ef2c9b4),LL(0x7e6d3ebe,0x3246ee72),LL(0x1a5a6120,0xfc23f5bd),LL(0x7e829b05,0x02380698),LL(0xfb70444c,0xe903fa23),LL(0xb14cf0d6,0xaba52743),LL(0x7e9872db,0x4a9994d9),LL(0xcbf74f83,0x7e344a52),L_(0x000001e8),
+ LL(0x077ea324,0xae770944),LL(0x13db8792,0x1201418e),LL(0xbc07e7f8,0x7f43920c),LL(0xd56c9383,0xa87da3ae),LL(0xf13ae3d2,0xddc44f1d),LL(0x220944b8,0x9328fcaa),LL(0xe3819646,0xeeb928d8),LL(0x3e55f26b,0xd7199731),L_(0x0000001f), LL(0x42ec4f45,0xfe195b7e),LL(0x8b6807bd,0xe12b70e6),LL(0x2b99f5fa,0x7ea15922),LL(0x4e065912,0x9b50760c),LL(0x2efe8690,0xb9b66711),LL(0x16a38c58,0x7b7026cf),LL(0x0ea01a94,0x80737374),LL(0x39639895,0xb0011015),L_(0x00000037),
+ LL(0x514bdbc0,0xb7081a5f),LL(0xfa8d102a,0x8b95f28e),LL(0xbeeb8bec,0x89435618),LL(0x71f4af84,0xdf609827),LL(0xb479c91f,0x14f1207b),LL(0xcb1fbb1b,0xde646157),LL(0xf9e5fc99,0x7b096333),LL(0x34873e5f,0xc94ae92f),L_(0x000000ac), LL(0xd78f796f,0x3fa5ab5e),LL(0xa3fca0b1,0xacf76276),LL(0x8003771d,0x1726ca8d),LL(0xe6d96044,0x3e43296d),LL(0x93fa9826,0x42531228),LL(0x527acf14,0x60a72222),LL(0x7a97cba9,0x3d7c6f6c),LL(0x1948eafd,0xcc2e1d2b),L_(0x000000f2),
+ LL(0x4e12b5af,0x08d068df),LL(0x886cf2ad,0x79260e0d),LL(0x52a61dfd,0x3e9745ee),LL(0x3f586c5d,0xe1f15978),LL(0x566b3b18,0x87842ee1),LL(0x9ad3de40,0xa8f52a76),LL(0xfa06fa9e,0x391add0b),LL(0x9e84e7b8,0xc75f3842),L_(0x000000a8), LL(0xbb6677c3,0xa05bc623),LL(0x52d3e69c,0xb274df3e),LL(0x974dd07a,0x630e22a1),LL(0x5e6204a2,0xb9a3958d),LL(0x1b227ffa,0xd0e0f634),LL(0x8fc075d7,0x37062afb),LL(0xbe7fbf5c,0x34adc02d),LL(0x77906471,0x8d8b552f),L_(0x0000012b),
+ LL(0x6c9a6028,0x259579a0),LL(0x6f5bb2d1,0x0285a43e),LL(0x154ac0bc,0x167a3f99),LL(0x36795c46,0x728f737d),LL(0xb73fd19e,0x4d08d004),LL(0xa6cc0016,0x85ddb728),LL(0xe72a83f5,0x2e0d295e),LL(0xbfbd9eeb,0x6433def5),L_(0x0000014e), LL(0x90f9c914,0x0eb6be44),LL(0xaf866e12,0xfe01cd22),LL(0x5fd8a835,0x7bf70c61),LL(0x7f0a7679,0x38813f80),LL(0xc8998bdd,0x3833317e),LL(0xb796096b,0xfec3ea9b),LL(0x95f4e76d,0xdad9de4b),LL(0x341f07a8,0xa3d960d0),L_(0x00000061),
+ LL(0xd3c33742,0x200fc40a),LL(0xb0a42399,0x130ccf0d),LL(0xcba30b44,0x5e03c03f),LL(0x8e5dcd29,0x6cdd189a),LL(0x1e3d9c12,0x5a30516d),LL(0x81b3e6ac,0x6b10cabc),LL(0xcc86cceb,0x69bda2cd),LL(0xc43e19c0,0x11a9d83a),L_(0x00000130), LL(0xdc567bde,0xe0559109),LL(0x6575e24d,0xe2ac30ae),LL(0x67aa07b7,0x2b6c5e32),LL(0xdaf439f7,0x407ff042),LL(0x2ed76986,0x0a686f32),LL(0x1581e9c9,0x5cacfb27),LL(0x18e37622,0xc3e3f9bf),LL(0x387fd7f7,0xd10f51ce),L_(0x000000c2),
+ LL(0xcd152b7e,0xe1bfaadb),LL(0x9f66edb2,0x2faec2d9),LL(0x65371362,0xe758a385),LL(0x03888c8c,0x70736030),LL(0x84bd514a,0xf31e004a),LL(0x391a903e,0x246ee862),LL(0x36e788ca,0x4e1e02aa),LL(0xf4e00df9,0x2c2a0937),L_(0x00000023), LL(0x13ba50a4,0x4eff7c1a),LL(0x941609eb,0x6d04b057),LL(0x4cf29ce1,0x414be663),LL(0xc8df1ba5,0x12291ebf),LL(0xaa401069,0xeb298db0),LL(0x8ded5bfb,0x893e7d57),LL(0x549bd728,0x01b7b4f4),LL(0xac5af1f1,0x22a5b845),L_(0x000000d8),
+ LL(0x5f6b726e,0xb153c049),LL(0x1a260428,0x30c06c83),LL(0x9ce7c010,0x5b4fc0ff),LL(0x894ae091,0x5657bc21),LL(0x0aae49b6,0x571a85ef),LL(0x79cfa3cb,0x65689c51),LL(0x2187e975,0xe76412d7),LL(0x992bb278,0xf64da789),L_(0x000000ea), LL(0x0cf8c519,0xaa2b60ae),LL(0x9b1824f2,0xc0f1fe55),LL(0x9db0e06e,0xd91bb72b),LL(0xa610996c,0x58e02f73),LL(0xf2c3a8c2,0x28d213dc),LL(0xeae1bfc7,0x13f362dc),LL(0x943517da,0xf7bdbaa1),LL(0x496789e0,0xfc68ba49),L_(0x00000023),
+ LL(0x6c383c56,0x23ca0c67),LL(0x0e7599c4,0x99283769),LL(0xfeb47aad,0xe99af616),LL(0xaf666d85,0xf45b2fa8),LL(0x9231d83a,0x7c7b482a),LL(0x98e9e83d,0x8568ac48),LL(0x1e56ad0b,0xb6b0ac15),LL(0x724bffe2,0xcd1a6169),L_(0x0000016e), LL(0xb11260bb,0x877aec8d),LL(0xc03ce819,0x4e72375a),LL(0xccf9f47b,0x54033f3a),LL(0xac8daf52,0x19b599aa),LL(0xdea12842,0x175a56a0),LL(0x7ec2c31e,0x8b550edc),LL(0x1acab966,0xf427902c),LL(0xb52abab5,0x2fa9ef47),L_(0x000000a4),
+ LL(0x52546c7f,0x20270840),LL(0x3c3eb721,0x13f0d6d8),LL(0x142e7b62,0x019eaca7),LL(0xf973a763,0x025efc29),LL(0x8be00c2a,0x6f6199ab),LL(0x03943eca,0xb5618bcc),LL(0xfbfb9ab2,0x5fb02749),LL(0x0ae9ab79,0x7965f13c),L_(0x000000e1), LL(0x50f295b9,0xab6d0e9f),LL(0x083d8bf1,0xbf53d7cb),LL(0x07076abe,0xf29d744e),LL(0x51a53561,0x5c2fc15a),LL(0x7d647b91,0x253f8428),LL(0x51a29ead,0x91bd9d62),LL(0x006b7bce,0xe106dd74),LL(0xc770e4ef,0x7ae25c92),L_(0x00000078),
+},
+/* digit=85 base_pwr=2^425 */
+{
+ LL(0x412703ae,0xe95afaa3),LL(0xeb61e427,0x271961d1),LL(0x509a4412,0xcf60fb71),LL(0xef04644e,0xd64abf7b),LL(0xf44d4556,0xfd03e651),LL(0x9b052a7b,0x4add4bdd),LL(0xbb2156b9,0x2a438d74),LL(0x6c6c1657,0xb9025fa3),L_(0x0000009a), LL(0x0eae16f9,0xafa2d73a),LL(0x44951d52,0x5bc81a5a),LL(0x324d90b4,0x8490fc89),LL(0xcab36337,0x7db83818),LL(0xdcb411d8,0xd6cb710a),LL(0x80af21f7,0xad265214),LL(0xf370ca06,0x3194a666),LL(0xd8bc966e,0xc5222375),L_(0x000000d7),
+ LL(0xbbdc15d0,0x35b540e1),LL(0x979e91ce,0x973de7aa),LL(0x745fa684,0x84d5e965),LL(0x999e957c,0x2675f78a),LL(0x671ead70,0xec63eb2b),LL(0x9f4e2bee,0x2262a934),LL(0xa151a2d6,0x885b027f),LL(0x5a633743,0x198c65b4),L_(0x000001da), LL(0x63ade9fd,0x64a13f40),LL(0x23957199,0xea6e576b),LL(0x21e1e294,0x1a39fa20),LL(0x3e8e8d0c,0xeb1db8f9),LL(0x2627a8aa,0xa239f73f),LL(0x4ba11c83,0xdc2704f3),LL(0xe1591a19,0x6d53062b),LL(0x75cd2132,0xfc2434c9),L_(0x00000197),
+ LL(0x615287cf,0x9beb6f84),LL(0x5201fcef,0xa7eaedc7),LL(0xabd8969f,0x485d39df),LL(0x52116284,0x9a298f42),LL(0xc2945b41,0xb98d985b),LL(0x02540f03,0xbe292f99),LL(0xfb5c8297,0x927d1f59),LL(0x379bfc25,0xb2c3602d),L_(0x0000005e), LL(0xbd1179af,0x24128932),LL(0x49c7ff27,0x920719e9),LL(0x1ce441c4,0x7bdf184c),LL(0xd4d77a7c,0xd00ec091),LL(0x286d6826,0x3901be8d),LL(0x8de5125b,0x6d7da5fd),LL(0x7b71c09c,0x0a84f058),LL(0xd13d8a20,0x4e423ecb),L_(0x0000004a),
+ LL(0x4047691d,0xb25141cf),LL(0x9109a95b,0xcb8b02c5),LL(0x46b0d286,0x43ceb570),LL(0xb7de8163,0x45b33ca8),LL(0xd109a4f7,0xe4de2617),LL(0xfe1ebf34,0x50869270),LL(0x1ca61709,0xd0a3a1b0),LL(0x38634a9a,0x3586512e),L_(0x000001fc), LL(0x38f07910,0xce15260c),LL(0xc1bab71b,0x59aca1ef),LL(0x5da68584,0x8166c7ad),LL(0x0bec54d9,0x8f461203),LL(0x49a9c32e,0xd88a5170),LL(0xefea1154,0xbe8180a7),LL(0xec5ede1e,0xad08abc6),LL(0xe0d26459,0x7c3d1d7d),L_(0x0000013f),
+ LL(0x75d35af0,0xc6d5609c),LL(0x78abf2cc,0xe0503dac),LL(0x06b14f6b,0x2edd7321),LL(0x1d8b929f,0xf2198c61),LL(0xae13548d,0x510cab55),LL(0x7dda7de6,0xd681dc83),LL(0x9c5b80c7,0xf75528c0),LL(0x3789ecc5,0xbf5f2412),L_(0x00000081), LL(0x96096d94,0x43aa0894),LL(0xc108e7c3,0x6b10f225),LL(0x662c2a13,0x6a846090),LL(0xfd5f03e1,0x2ef6dd38),LL(0x6481ee80,0x5be580e2),LL(0x5fdbc53d,0xa958cf09),LL(0x11a46f11,0xc02fca90),LL(0x664e67d4,0x83a23d94),L_(0x000001f2),
+ LL(0x2e504292,0xd30defda),LL(0x0fa7d618,0xea344a1b),LL(0x8b5c684d,0x88f031e8),LL(0xc536e574,0x4b824800),LL(0x3cbde674,0xad6b63cc),LL(0x56514289,0x9617ab5d),LL(0x85b3cf5e,0x7dc3ec36),LL(0x7fc09058,0xc79289b6),L_(0x00000135), LL(0x846008dd,0x6898fae8),LL(0x9e7f0e84,0xd8281d5a),LL(0x10825f5c,0x2d75ee2c),LL(0x12dbdb85,0x7c0aafd5),LL(0x9070014b,0xbf482380),LL(0x9ee025e3,0x0fc3aa99),LL(0x63b81901,0x508f2832),LL(0x84535f01,0xbbddb4f2),L_(0x000000aa),
+ LL(0x9b68b1b0,0xc08c3333),LL(0xc47488c1,0xab449170),LL(0xb2a5ff61,0xcf64ef35),LL(0xb9e5f70f,0x7b502c46),LL(0x417cfca7,0x88cbf950),LL(0x1cf7bedc,0xd4ad741c),LL(0xf0d8aab2,0xbcf1b6ad),LL(0xf5a48560,0x219e66fe),L_(0x00000180), LL(0x502beb84,0x2cc6cdcb),LL(0x584dda42,0x094da6af),LL(0x129f5a40,0xd42b7286),LL(0x1002d93c,0x5c173674),LL(0x725b278c,0xefa77633),LL(0xd75f98ff,0x791931d8),LL(0x21527308,0x512e096c),LL(0x53d3565e,0x6d15d8de),L_(0x000001f3),
+ LL(0x00019394,0x62bec3a2),LL(0xa2c579a3,0x5ab884c7),LL(0xa06cf4c6,0x083cab2b),LL(0xe7eda004,0xf5f6cd3e),LL(0xa107bb12,0xe8649e92),LL(0x492e8a0a,0x5a344683),LL(0x91fc3fba,0x8dcfb242),LL(0x94cfd171,0x12659c38),L_(0x00000028), LL(0x03751b1b,0xce223739),LL(0xc2f1043f,0x23da45da),LL(0xf9307b4a,0x3110105d),LL(0x2b6d1b2c,0xb39e6a89),LL(0x2f645131,0xd8e317be),LL(0x90466331,0xb2f395de),LL(0xf1e436a0,0x1cd56345),LL(0x547fe748,0x3e61e1b0),L_(0x0000003a),
+ LL(0x9c18c216,0xfd251565),LL(0x18071963,0xf23633a9),LL(0x005c3056,0x1e0819de),LL(0x46ebbb94,0xb549b1c1),LL(0xb17a6d7d,0x92577078),LL(0x991b825e,0x8f6ca39e),LL(0x98671ca8,0x90ccdc4b),LL(0x393fb1b5,0x83f03d02),L_(0x000000da), LL(0x3e2fd629,0x150480ec),LL(0x0aca508b,0xcbfc5f51),LL(0x0864f022,0x14650672),LL(0x3b3979b5,0xbff63c37),LL(0xb97ea4a4,0x3b1cb3cc),LL(0x3ef296ec,0xcb4a6db9),LL(0xff3bd186,0xbd5b637b),LL(0xedab5309,0xde8dfc52),L_(0x00000196),
+ LL(0xba62ee82,0xd77204b3),LL(0x77e6a3df,0x710f93b4),LL(0x02f4ab22,0xcbb03368),LL(0x5e0ecd43,0xb189c2ee),LL(0xc2847328,0x9bdf60eb),LL(0x0ebd36bf,0xb67d93ed),LL(0x0c17c388,0x70c2279c),LL(0xe8fdeaec,0x93ea44d6),L_(0x000000e4), LL(0x48b19e4c,0xc3191f20),LL(0x04206c4e,0x8bdfd660),LL(0x9a16a00f,0xac2112af),LL(0x61997c61,0x8ab3667b),LL(0x7b84c760,0x06bdff10),LL(0xf4e1645e,0x607df1e8),LL(0x352d17a0,0xa63979fb),LL(0x83c7eb22,0x015ff16b),L_(0x0000011f),
+ LL(0xe2ef6187,0xe76e649d),LL(0x50e4618d,0x6b987f60),LL(0xc357d1ec,0xad4f8231),LL(0xd4a60be3,0xb315fdb0),LL(0x2eced057,0xa9fb56ad),LL(0x19319996,0xa2da27cf),LL(0x2f11dee2,0x916ddbdc),LL(0x7e40b2e7,0x77406459),L_(0x00000044), LL(0xb7a77c12,0xb4cf9881),LL(0x7da427fd,0xcc7a5c06),LL(0x80b0089c,0xdef4d8fc),LL(0x93e7089d,0xe325b955),LL(0x16ead4d1,0xb039b2a1),LL(0x5dfcb305,0x1820d74b),LL(0xe64404b5,0xd5916176),LL(0x6e3b8d75,0x67136fef),L_(0x000001b2),
+ LL(0xe5919bbd,0xff1cd958),LL(0xef53a31b,0xf4f94077),LL(0x95740f28,0xd731ab60),LL(0xae2285d4,0xa1ecbb47),LL(0x8c0691df,0x258e27d0),LL(0x3a34371a,0x6fcf67a4),LL(0xe81db787,0x31ad117e),LL(0xcd7a8c18,0xbef4d701),L_(0x000001ea), LL(0x1c27e10f,0x7aa7d331),LL(0x36d353fb,0x484bc381),LL(0x5feb0814,0x14c00e62),LL(0x5a897087,0x4174c50b),LL(0x73330526,0xa9a0af61),LL(0x7d611726,0x60873261),LL(0xca260561,0xe43e2bb4),LL(0x9e169695,0xd6fd57ef),L_(0x00000191),
+ LL(0xb1e778d1,0xe387f978),LL(0x9b9aee5d,0xd76337e3),LL(0x92cf14d1,0xe5ccf490),LL(0x72921fc6,0x5b43aefb),LL(0x65d3e5c1,0x795ec0f9),LL(0x3904e5d3,0xa4928380),LL(0xa5751b73,0xdfd26a4c),LL(0x351de543,0x772f0a98),L_(0x00000160), LL(0x30b62509,0x2b0ddc19),LL(0xf6f4cca7,0xe118ecd8),LL(0xed5b6edf,0x0c9d677b),LL(0x4f5d7b07,0x34b851c9),LL(0x67daaa19,0xade6f3a0),LL(0xf4cef90c,0x4e977f04),LL(0xddf591d7,0xa5a8e05f),LL(0x51707198,0x73e4b240),L_(0x00000069),
+ LL(0x8fe855a9,0x6f37b397),LL(0xfc53c756,0x11e9e126),LL(0x0be45fa0,0x72b050d7),LL(0x0064ab05,0xfc69a454),LL(0x2c4f8ec5,0xe8ca3f9e),LL(0xfd23251a,0x3713bf5d),LL(0xfbba4b98,0xf9f17348),LL(0x022b3ded,0xf5712705),L_(0x00000075), LL(0x496ec6da,0x02b42501),LL(0x3666ead7,0xc5995675),LL(0x03f0c9c9,0xfafe4fc1),LL(0x92c23f3c,0x6e5dcc14),LL(0x49d6013c,0xa80274fd),LL(0x6faecdf5,0x3b89a119),LL(0x6951f782,0x04ebafd5),LL(0xe5c75fdf,0x98ee2e59),L_(0x000001be),
+ LL(0x4c63dd71,0xecaaf994),LL(0xdb563551,0xfa0452c4),LL(0x034243a2,0x35dd1a49),LL(0xc1e98b35,0x67ebb1d1),LL(0xd64a14c8,0x65aa32b2),LL(0xa40fe3b8,0xf36b9b35),LL(0x74b94620,0xde048775),LL(0x9c4f81d6,0xefb999ff),L_(0x00000048), LL(0x317a309b,0x27e42884),LL(0xea18f52e,0xab7b0d80),LL(0x6a303cb3,0xd883eedd),LL(0x6960a553,0x5fa720c0),LL(0x4a30771c,0xaf1c642d),LL(0x8c3afce3,0x0aea4951),LL(0x5b832460,0x8daa7e14),LL(0x3626a795,0xa9434a86),L_(0x00000042),
+ LL(0x5078f4b7,0xf8bc0fa4),LL(0xf5948727,0x1eb36b7b),LL(0xea0106cf,0xc704268c),LL(0xc80e06d4,0x300186e8),LL(0x5c216323,0x6e94d507),LL(0x72ccb301,0x882e86c3),LL(0x053b8cfd,0x3148a28a),LL(0xd1710019,0x864bf343),L_(0x00000010), LL(0x24c02876,0x6d8c63b2),LL(0xc0738276,0xb8220989),LL(0xd418521b,0xa59b967c),LL(0x52d761e7,0x601efc41),LL(0x0fa019e4,0x41cb4d7c),LL(0x9d52f11b,0xcac0131d),LL(0xe27a162d,0xaac991e4),LL(0x975ffa76,0x5c007789),L_(0x000000c9),
+},
+/* digit=86 base_pwr=2^430 */
+{
+ LL(0x53760212,0xe9ad4077),LL(0x52251dd3,0x2f89c76c),LL(0x5957d5e2,0xb5844aaf),LL(0x57c28051,0x630bd361),LL(0x369eb597,0xacac6af3),LL(0x5611a387,0xaad0ef87),LL(0xde2edc32,0x0bccba64),LL(0x731d170b,0x8f5a6ff1),L_(0x00000006), LL(0xc2557f66,0x48e1ee52),LL(0x5f44f645,0x0cf95561),LL(0x64b6036a,0x1e52bf2c),LL(0x89213e75,0x34bd858d),LL(0x15aa570d,0xbf1cb2e7),LL(0xcc205ae3,0xf29e703a),LL(0xfb1911e3,0x98a34a47),LL(0x78616fc4,0x432ae895),L_(0x000000be),
+ LL(0x301fc12e,0x91d6adbf),LL(0xdc42e25e,0x587a0d31),LL(0xcecd10d8,0xf88cc8a9),LL(0x8d1b41cc,0x90bd959d),LL(0x33b3f964,0x999c5a51),LL(0x47bee028,0xc3a08825),LL(0xb39f5f74,0xd4fc3438),LL(0x5af39ed4,0x4a0aafa7),L_(0x000000f9), LL(0xbf02b54c,0x0a29ee5f),LL(0x4f0d6dbd,0x57045bbc),LL(0xe6fde293,0xc7d0fce2),LL(0x040027df,0xcda45a33),LL(0x23be51ff,0x9841c14d),LL(0x6d045486,0x56ff1e33),LL(0xfdc85221,0x5ea634d9),LL(0x619b696b,0x35b3b3ae),L_(0x0000003f),
+ LL(0xa104ae49,0x5ed4f918),LL(0x7f6fea1f,0xfb0d6721),LL(0xb83838c1,0x99caa790),LL(0xd116daa3,0xc2f1d19e),LL(0xe68d0873,0x105c2468),LL(0x247798a8,0x672f66e0),LL(0x740bca2a,0xe789f0d7),LL(0x86c229b4,0x505a9b4c),L_(0x0000007d), LL(0xd8e83bf0,0x77be9153),LL(0xaa767cd0,0x71074af9),LL(0xb3e46e21,0x17f8ca53),LL(0x7796d98d,0x215b3c92),LL(0xd098831f,0x362429bd),LL(0x0b75e1e5,0x75d41b1b),LL(0xc1e2cba3,0x0101e963),LL(0xbf3622fb,0xa38f2cfe),L_(0x00000193),
+ LL(0xb9019f2f,0x646b70de),LL(0x2e533666,0x90a5717d),LL(0xd38f5274,0x7916810f),LL(0x3bb33bad,0xfd952623),LL(0x59b6b88e,0x5dad71c0),LL(0xfe6ed574,0xca300788),LL(0x21a98ac4,0x6ded4a6a),LL(0xeeff5891,0x7d6ffe10),L_(0x0000018d), LL(0x48da52e8,0x98c1a5fc),LL(0x1901e7d3,0x42b185c0),LL(0xcb2700b0,0xaca4eda6),LL(0xeec867cd,0x0a19ae4e),LL(0x7dcb7e93,0x88471dcc),LL(0x17e010a2,0x198ed175),LL(0xbb36f683,0xbb4e8756),LL(0xf915ed36,0x4cf9f27d),L_(0x00000007),
+ LL(0x56948883,0xfd191432),LL(0x519679d8,0xcdcf1fa3),LL(0x35711035,0x87a0e867),LL(0x663b1a45,0x6c52192e),LL(0xd46a0d9f,0xd90e9a02),LL(0x01cece65,0x0dbf88f7),LL(0x5032d5f7,0xd5855448),LL(0xc3ecbbe3,0x330d4483),L_(0x00000113), LL(0xda71595b,0x4bb4a8ce),LL(0x6609b74e,0x23abfae6),LL(0x76172b1d,0xc43ff5b4),LL(0xc2d69d21,0x275e500d),LL(0xf9af38b2,0x8ab54bd9),LL(0xe6a2d266,0x983f2f3c),LL(0xb11e43bc,0x0d27f996),LL(0x3ef88279,0x33f71741),L_(0x000000e5),
+ LL(0x9058183f,0xdd40e348),LL(0x8259229c,0x5e67db56),LL(0x8582282f,0xa5fd9ed5),LL(0xea641a1b,0x1a634c9e),LL(0x6d89c3eb,0x44359789),LL(0x3d617332,0xb7458f8e),LL(0x974b6efb,0xb6863988),LL(0xd2857c41,0xae43a38e),L_(0x00000046), LL(0xd0bd1dc8,0x08757c7c),LL(0x4edda34c,0x5a31fc77),LL(0xfa2bc7b5,0xf6b159cc),LL(0x36e4a532,0x904f6b01),LL(0x603edf4b,0x96a6ebff),LL(0xb699fdb4,0xad76014c),LL(0x888c04c9,0x52da1b11),LL(0x9675ab25,0x8c537551),L_(0x000000e1),
+ LL(0x76cc2e7a,0x23209d8a),LL(0x39ac3634,0x493f6e5e),LL(0x2a49b5d9,0xaac1e790),LL(0x83449f3c,0x85d5aef7),LL(0x919c353b,0x45144182),LL(0x9673a9fe,0xc1d4f2ca),LL(0x9f1f328f,0x8f5eeda5),LL(0xf2216169,0x611eca42),L_(0x000001dc), LL(0x3f509f9a,0x96feece0),LL(0x85e87ba8,0xe9be0b9b),LL(0x186dcdb0,0x7207011b),LL(0x590eaaa1,0x60f3a8d4),LL(0x3aeb9b3f,0xac89f276),LL(0xd21f7163,0xfd4e5813),LL(0x05998e42,0x80b7e4e3),LL(0x38cd8e87,0xe79a0406),L_(0x0000010c),
+ LL(0xc09d95ae,0xd6f73873),LL(0x7cafdfb9,0x27b3bc9e),LL(0x1f14d40f,0x6fc05fa8),LL(0x4eebf4e6,0x4e6b76ed),LL(0x7bb6036a,0x736cb738),LL(0x58e19e3f,0x2277b08a),LL(0xa4986beb,0xbb55c0d7),LL(0x8f830ada,0xa22d04d1),L_(0x00000057), LL(0xb25e59f9,0x9a3ae563),LL(0x18997059,0xd06e16bf),LL(0x7505891e,0x3d688dac),LL(0x76b3eb97,0x10cb084c),LL(0xc6498b2d,0x2d6e8e95),LL(0xafa574af,0x503f71b8),LL(0xc16133ca,0x9966999b),LL(0x6f3443fa,0x6ad79bd7),L_(0x00000104),
+ LL(0xa62c57f7,0x797a0980),LL(0x03e966f7,0x3a33197c),LL(0x5565e857,0x31df23bc),LL(0x1feaa7a8,0x240894a7),LL(0xec48825c,0x8f886413),LL(0x9a2b6b14,0x98c1f268),LL(0x041a9538,0x89254981),LL(0x46c27078,0xd4a923a7),L_(0x000001b7), LL(0x3f850405,0x16453f02),LL(0x5e4fd155,0xb6a3db9b),LL(0xcd6306e4,0xc259c564),LL(0x89b34c35,0x1cbd8b5f),LL(0x7420eabc,0x22f6885a),LL(0xfe106029,0x2bf9ec49),LL(0xaef5fd1c,0x73da5ef8),LL(0x01c0496b,0x2fbf80d0),L_(0x000000d2),
+ LL(0xccf43b6c,0x2b2fd87d),LL(0xb29b9f9b,0x42c15930),LL(0x75dead34,0x8a992ae9),LL(0x93d238f6,0x835b46d8),LL(0x537768fc,0x59b7cdac),LL(0x97a9b4f9,0x8690f7d0),LL(0xe523d489,0xddd3b40f),LL(0x2dcb85bf,0xd07f5307),L_(0x000000d7), LL(0x2a6612ff,0xa015a7b6),LL(0xc599e46f,0x72d01eaf),LL(0x9b23b6a1,0xc21d7f10),LL(0xdff644dc,0xac717daa),LL(0x215cc0c4,0x31113eff),LL(0x29fa625d,0x2da218c6),LL(0x3ddc80ac,0x8399eca4),LL(0x5d17f283,0xce8d5743),L_(0x00000053),
+ LL(0xfd958a4c,0x656636ff),LL(0x022fd87f,0x77efdadd),LL(0x3a9ac51c,0x96597b30),LL(0x2fbf14ce,0x01364596),LL(0x7d940bec,0x1f7b85dc),LL(0xbde90f3c,0x3116d774),LL(0x40e30d60,0x9289d920),LL(0x52c8b93a,0x02c341a8),L_(0x0000001e), LL(0x2ebd850f,0xa0eaa3d4),LL(0x590d1f54,0xbe22470c),LL(0x53e4e7c3,0xf88fc1e8),LL(0xd8883aaa,0x7782a946),LL(0xe78d366f,0x567fbeed),LL(0xf47e81a5,0xadd3d4f0),LL(0xb2aaddfe,0x29a661cf),LL(0xa342a4e6,0x748d5227),L_(0x0000007d),
+ LL(0x8c9cc5a1,0xe5aa101a),LL(0x329070ed,0x53342a7d),LL(0x852398fa,0x007bb4fe),LL(0x673ceb9c,0xa9431236),LL(0x3c9247b3,0x1cb68268),LL(0x115b1ee5,0x5c07f2ef),LL(0x3f6486b7,0x7183b014),LL(0x1585ec37,0xe601ad10),L_(0x000001fb), LL(0x0680da54,0x9a2e8c00),LL(0xe41a7e56,0xe94c0472),LL(0xb7c713ec,0xf2aa41c1),LL(0x742d18cc,0x3e3162e5),LL(0xedf3c376,0x77417a84),LL(0x57916b99,0x165b44c7),LL(0x246f2e2f,0x1c45d988),LL(0x8287828d,0x99db995c),L_(0x000001b0),
+ LL(0xab8f038d,0x27f0c816),LL(0xc4edbd37,0xc8522ec7),LL(0x2f8f0b54,0xe399477b),LL(0x074481dc,0x0fb69890),LL(0xa0499848,0xa5280b6b),LL(0x88cb4213,0x3dff5cd9),LL(0x41c11365,0xe549bd1e),LL(0xea8a3c58,0x40ee92fa),L_(0x00000039), LL(0x2b200b5c,0x2ec791da),LL(0xb1772087,0xb33233b1),LL(0x9df4451f,0xaa1032a0),LL(0xbaa72f9e,0x645358e3),LL(0xc7982461,0x88b9794b),LL(0xecd3c965,0xcecd6313),LL(0xa2d9359f,0xf7b6ca2d),LL(0x7f382df2,0x98e1c5ce),L_(0x00000033),
+ LL(0x02037c91,0x41a52ada),LL(0x82ddca3f,0x1b403720),LL(0x4b6a1108,0x6acc9873),LL(0x6d306779,0x495190be),LL(0x80fb3f34,0x13ec341a),LL(0x0307762f,0x2ea03fd7),LL(0x422a6d1a,0xfacb4f11),LL(0x014521e4,0x5f9816f6),L_(0x00000196), LL(0x0ac6d565,0xb343a25b),LL(0xdead79aa,0xf7c846e5),LL(0x54b1471e,0xccc5d545),LL(0xf9ccfd6a,0x31f5ccd5),LL(0x43e993a3,0x8fc6e767),LL(0x07c79ed2,0xd716a9ab),LL(0x4894cc48,0xae33e7f3),LL(0xd6c5646c,0x3fa06c4f),L_(0x0000010d),
+ LL(0x37b15d9b,0xc16b5265),LL(0x43945dbd,0x7a53a14b),LL(0x994df966,0xd272ba24),LL(0xfbfe62a0,0x80e0b451),LL(0xb488717c,0x7153f565),LL(0x22303a33,0x6397afa8),LL(0xc85bf638,0x0216bd4f),LL(0x096b646c,0x50f84189),L_(0x000000f4), LL(0xf00721ec,0x500e6e18),LL(0xab5ca93b,0xea2d8a0d),LL(0x06a3b0f0,0x44feaba9),LL(0xf766ff9a,0xea82aa95),LL(0x05be709f,0x0829c7c9),LL(0x36a07ae0,0xa1cfe409),LL(0xc83c032c,0x780ac746),LL(0xde7f9ef0,0xfedfbfdb),L_(0x000001e2),
+ LL(0x18f9c015,0x25767d44),LL(0x49d6199f,0x77c536b7),LL(0xb54e847b,0x1af54bfd),LL(0x7979776c,0x0b838623),LL(0x51eefa22,0xdf9bb4a7),LL(0x028f18ac,0xce45beb5),LL(0x7dd86218,0xb930f98a),LL(0x3f055e3a,0x6380d302),L_(0x000001fb), LL(0x1df321b7,0xeeb57c14),LL(0x53902659,0x0b2255cf),LL(0xf2a776fd,0x4cc9dbec),LL(0x453cf8ab,0x63e94ee6),LL(0xf2d56478,0x93a4007a),LL(0x027149fe,0x9cf116d0),LL(0xa6376053,0x17dc8184),LL(0xe7465f73,0xfed4461d),L_(0x00000058),
+},
+/* digit=87 base_pwr=2^435 */
+{
+ LL(0x6ea55f73,0xf042fa2f),LL(0xab1d226e,0xb24c1848),LL(0x6862a1dd,0x413acbe8),LL(0x1f4168e7,0x91408365),LL(0x9d596e07,0x23961d18),LL(0x01b379ca,0x6d536797),LL(0x05ec7b7e,0x13cf35fa),LL(0xd7f6b707,0x182dcd20),L_(0x0000009d), LL(0xbc18785b,0x76095f2d),LL(0xa0054386,0xe28a0370),LL(0x50c89610,0xfeeaf09e),LL(0x144bba0b,0x455cf10f),LL(0x34cf6dd7,0xf509d978),LL(0xf94fe722,0x05c279e5),LL(0x8092debb,0xe71244fe),LL(0xb314f061,0xe0f63153),L_(0x00000098),
+ LL(0x7f803868,0xeb771971),LL(0x05b4c2dd,0x911e1ad0),LL(0x0df34f87,0x57076f1e),LL(0x9958d5da,0x6f49ecb2),LL(0x55d1ebf6,0x2ca7b49e),LL(0xfcb4f571,0xb2ff1b32),LL(0x42a971c5,0x49f97d3d),LL(0x838bb327,0x5fd29804),L_(0x0000017f), LL(0xa52e7908,0x86529c3b),LL(0x7ddd9af7,0xe7159473),LL(0x6dd64d51,0x8305400f),LL(0x922bf016,0x21ca4239),LL(0x1db4bbaa,0x8c94ee85),LL(0xafda935d,0x80623440),LL(0x0a576c9c,0xd9110efc),LL(0xd79f58dc,0x3d6ca396),L_(0x000000f1),
+ LL(0xe1a7c929,0xeff94575),LL(0x7f265399,0x076c7864),LL(0xdf2046cc,0xfe889ff0),LL(0xe23267f8,0x4b83615e),LL(0x171f661f,0x32637340),LL(0xc3fd3e6c,0x946ccba9),LL(0xafb9463a,0x9deb55e5),LL(0xbdcb574f,0x8d44f742),L_(0x00000092), LL(0xd84d6148,0x6362d37c),LL(0xe1724e4e,0x80e307d8),LL(0x2dee8134,0xd661095b),LL(0x596062c6,0xbc1b3be1),LL(0x5779751a,0x36f36543),LL(0xd0be963f,0x7fee02b0),LL(0x75c65486,0xb82030d1),LL(0x72d27424,0x6d7f4a46),L_(0x00000043),
+ LL(0xaeb38ccc,0x49ee6062),LL(0xc1411d18,0x164333de),LL(0xa4a4727a,0x566e81b4),LL(0x74b241dc,0x290aa59c),LL(0x85069fb7,0x2865cb6d),LL(0x28389d32,0xcbd64839),LL(0xce3c8f7e,0x8c909864),LL(0xfef248d2,0xf2befac9),L_(0x0000013b), LL(0x4261d435,0xb96bec85),LL(0x62a6f5a6,0x1f509bbc),LL(0xb43f9c90,0xc53ddbc8),LL(0x94118466,0x9ad3885e),LL(0x22a38677,0xd109dd2e),LL(0x60b6db58,0xeef4f2af),LL(0xadf1adca,0xd5bc0cd7),LL(0x0fb47811,0xc4b3b822),L_(0x00000024),
+ LL(0x456d2584,0xca189af8),LL(0x85bb0ebb,0xf9e4ffa5),LL(0x3e647534,0x1136b7ab),LL(0x0e1d213d,0x91ac330c),LL(0x6aa7c7de,0x4345ad0a),LL(0xf0255a49,0xa156a357),LL(0xe3967bfd,0x2bdb3ace),LL(0x8dff208b,0xc09a53d8),L_(0x00000009), LL(0xad93b86d,0xff9685e0),LL(0x990e1837,0xd599bc9a),LL(0xa491c185,0x320375e6),LL(0x59cacf47,0x427b05e7),LL(0x03c76cd9,0x9565d0db),LL(0x073ece2e,0x72f50d14),LL(0x2045534c,0x31281552),LL(0xa43a812b,0xabec2314),L_(0x00000152),
+ LL(0x49f1b4d9,0xd4601e45),LL(0xd37e9635,0x5712ad28),LL(0x2c3143dd,0xaf7e19b4),LL(0xc6366f04,0xaa565afd),LL(0xc4b34637,0xc12b452b),LL(0xdd135b2a,0x77fe7f5b),LL(0xfeea8b42,0x9ec6ff31),LL(0x5cdaec8e,0x73ab00c4),L_(0x00000165), LL(0x3f781317,0x664c221b),LL(0x652c3e83,0xafac4ecd),LL(0x6da93d03,0xcfa7c466),LL(0x2ceac0d6,0x039d2b65),LL(0xcb1a4cf4,0xa6eb1946),LL(0xa2285c58,0x422c9b53),LL(0x1b4d8367,0xcc7349ed),LL(0x4c55a379,0xcd5e2afa),L_(0x00000106),
+ LL(0x85b7a89c,0x1ea7ad0b),LL(0x9f47c4ab,0xe5150449),LL(0x85cda5f6,0xb891dfa1),LL(0xe69386b4,0xd89edbbe),LL(0xf4ac48bb,0x1b2a00ae),LL(0x3c163ff2,0x37bb423a),LL(0x73d0c87f,0x393a234b),LL(0xe80b0fdc,0xc63497ac),L_(0x00000153), LL(0xc52fc82f,0xa9154aa9),LL(0xe56ec070,0xb5b87f0b),LL(0xb996ced1,0x2c118a27),LL(0xbb7f2dff,0x3e0161d2),LL(0x9ee991cd,0x45e9acd1),LL(0xb300f7d4,0xfb934e98),LL(0x20f357aa,0x370589a8),LL(0xfe8af1f8,0x7ca491b4),L_(0x00000106),
+ LL(0xb59ee173,0x42f467a4),LL(0x41b66fb9,0x5770a301),LL(0x02513df6,0xf1d41988),LL(0x7e0148f2,0xf54abf2c),LL(0xd9a1b6c6,0xbb47b51b),LL(0xfba956f2,0xf5846505),LL(0xb02618f4,0x502a3ddc),LL(0x69ec8c64,0x8021ca7b),L_(0x00000158), LL(0x194b6953,0x04316d8f),LL(0x8f7bcb08,0x006107c5),LL(0x9f43afd0,0x32f310f2),LL(0xa15ea5dc,0xe2b91ae7),LL(0x3849a363,0x2b4966c6),LL(0x6a457445,0x1d63455b),LL(0xb8835c17,0xcd39b535),LL(0x1ae86f54,0x52463509),L_(0x00000075),
+ LL(0x413915c5,0xd3aa0f40),LL(0x553e50ff,0xc139c1fd),LL(0x408079ac,0xcaeedf51),LL(0x5702513c,0xf43dc271),LL(0x1c08e5b0,0xf5e1208e),LL(0x48d91655,0x813375b3),LL(0x91b427b6,0x0fa6be8b),LL(0x833896b7,0xa0825ed0),L_(0x000001b9), LL(0x7c3676f3,0xac9ff585),LL(0x853930b5,0x94c9266b),LL(0xc6b73b6c,0xbc211c89),LL(0x277b6c8b,0x2fc248c5),LL(0x93fd3dec,0xcefb839e),LL(0x4a5c85d3,0x10bf217b),LL(0x2a276f95,0x3a708326),LL(0xc15a4206,0x85899d47),L_(0x0000017e),
+ LL(0x7bde1ec8,0x34c4db4a),LL(0xa70a6f08,0x48a29f6b),LL(0x587d1015,0x49dbe231),LL(0x998c9a20,0x8aceafbb),LL(0xe5eedcf8,0xe6b738f7),LL(0xcab08878,0x9b693ecf),LL(0xb374ede1,0x008dd1dd),LL(0x7a6cd94f,0x9b54b3be),L_(0x000000c2), LL(0x83bd130c,0xc20757ed),LL(0x17bff343,0x228e06b2),LL(0x1bef19ad,0xc51046a9),LL(0x0e88da5c,0x011b5840),LL(0x70a9f961,0x49ae6f04),LL(0xc6f83f90,0x9d079a03),LL(0x912f072e,0x9a401435),LL(0x0b78fe3f,0x45e24749),L_(0x0000002d),
+ LL(0x20b6a171,0xc0eec582),LL(0x531fdbd5,0x7a0400cc),LL(0xe2cd895a,0x9c308aa1),LL(0xf0bb2d5a,0x08b021d8),LL(0xde68db65,0xad0f2bcd),LL(0xac747060,0x3fd807ea),LL(0xfe64802d,0x8b4648ee),LL(0x38d8773a,0xf5c28376),L_(0x00000103), LL(0xcb637daf,0x16605703),LL(0xdffc80b5,0x4845eee4),LL(0xd28e60ca,0x57f98d2e),LL(0xdfda4fa3,0xac95f77a),LL(0x0d0b9220,0x05da7201),LL(0x60ec2cb7,0x9a49b6df),LL(0x201396c1,0x611b2a93),LL(0xb535c0ce,0xce6fc00f),L_(0x0000018b),
+ LL(0x1481fdff,0x68c14a66),LL(0x84edc501,0x764d4d2b),LL(0xbe356501,0x736aaa60),LL(0xe6771588,0x0c40e330),LL(0x5714d50c,0x7b8fe887),LL(0xfbdf2915,0x9215aac4),LL(0x549e25da,0x58b4091b),LL(0x442d2b00,0x48bf91ad),L_(0x000001e8), LL(0x88ee6a91,0x934568ba),LL(0x307efd84,0x10dd1585),LL(0xcb644b24,0x3219b046),LL(0x2bd376e1,0xef0c68dc),LL(0xdcecc49b,0x56c2d2d1),LL(0xc907f765,0x810f8810),LL(0x052b3ddd,0x1ba20da5),LL(0xc3448a3c,0x0827079e),L_(0x0000018b),
+ LL(0xb0648b7e,0x193cb76d),LL(0xf7fec768,0xb90f6558),LL(0x86126ace,0x237a7fc7),LL(0x749a6fe8,0x83ab837e),LL(0xb5c3035a,0x3e9ae2d9),LL(0x8de4bf68,0x9c620970),LL(0x0b3fa791,0x8ef69888),LL(0xc5e8388c,0x3a44205f),L_(0x00000013), LL(0x892086c5,0xc04ac82e),LL(0xfb491292,0xc0d38a50),LL(0x52d706d1,0x42c8a5e7),LL(0x582ce44e,0xc9853494),LL(0x96312a80,0x04da6643),LL(0x74ef5508,0xbbc8dc30),LL(0x9a8e3322,0xfa669919),LL(0xa1f29644,0x94a108d5),L_(0x0000011e),
+ LL(0x0e084366,0x5cc0a55e),LL(0x7ef0187f,0xa139c3fe),LL(0x49d53f7b,0x5423f2e7),LL(0xd809a727,0x5a94a4ff),LL(0xe2e74f9e,0x541f08d0),LL(0x22541929,0x14dd0793),LL(0x49159841,0xdbf53ad1),LL(0x408f5bb7,0xb5b9e78a),L_(0x000001e9), LL(0x1db74ade,0x46e28711),LL(0x3b22deeb,0x1ad3605f),LL(0x8863541b,0x1fe070fc),LL(0xfdd530f5,0x4af47e93),LL(0x7f3d69c0,0xd93cb647),LL(0x6d16f551,0xbc684cde),LL(0x50cd6852,0xb5154a9f),LL(0x16ac0cc2,0xc9ac9e9f),L_(0x000001bb),
+ LL(0xec5c2c31,0xc90def9a),LL(0xe4b46e4f,0x67d0d316),LL(0x8901b941,0x2bb65bec),LL(0xc96e5167,0xf836eba2),LL(0x096ab2fb,0x996167b5),LL(0x2719f2e6,0xdde8e72c),LL(0x12437287,0x62d48d9a),LL(0xf4ef64e5,0x405cdb88),L_(0x000000f0), LL(0x91da5b6b,0xa56f46e1),LL(0xc13b6841,0x97107435),LL(0xfbe3e2a6,0xa446c520),LL(0x759315a1,0x0c5bba8d),LL(0x861aec20,0x852f2659),LL(0x775fa0ec,0xfbe06684),LL(0xa91ab0fa,0x03bd8b0d),LL(0x3006d391,0x3166b023),L_(0x0000010d),
+ LL(0x1b6190bc,0xa4a386bf),LL(0x17c47de2,0x95703cbb),LL(0x3bf84891,0x3f013d22),LL(0x12474267,0x6fdb827a),LL(0x0290f2b8,0x50e9b7e1),LL(0x79a8f44e,0xcc658260),LL(0x89a9228e,0xab4d12b5),LL(0x83a119d1,0x121131b6),L_(0x0000019e), LL(0x2d25950f,0x6b02229a),LL(0x38c46b7a,0xfb0617d5),LL(0x6bc581dc,0x0ce1dd7b),LL(0x6b522d59,0xd0dcdf5b),LL(0x9133e3f5,0x5cce47e7),LL(0xd71f5bdf,0x21b8ecd0),LL(0x17d9aefe,0x7aac21b7),LL(0x7b609025,0x98c6eb88),L_(0x00000127),
+},
+/* digit=88 base_pwr=2^440 */
+{
+ LL(0xf89fcba2,0x59a63f98),LL(0x86d07ca3,0xf60025c0),LL(0x590915cb,0x68c18d4e),LL(0x15cc7c3b,0x85575ec9),LL(0x09334801,0xe8d10d82),LL(0x4789511a,0x82704b90),LL(0xdb2e76c0,0xf6a4e997),LL(0xf5824d99,0xb143d8c3),L_(0x0000006b), LL(0x6953628d,0xa7575550),LL(0x8504400e,0x8537e141),LL(0x609d8295,0xc7b7f7a0),LL(0x5da70118,0xc50379c5),LL(0x79ad1223,0xc936f6ea),LL(0xbde48629,0x4f7f839c),LL(0x1ba01725,0xdff8def6),LL(0x1bef09eb,0x65b93f5c),L_(0x0000011e),
+ LL(0xe82eeedc,0x330d665a),LL(0x0753a4f9,0x3f5e64a3),LL(0x9e477096,0xef9e92f3),LL(0x07f9d297,0x388062aa),LL(0xc48c3ddf,0x60ab0df5),LL(0x55e6e61e,0x5a47567e),LL(0x9872a6f9,0x3a66d012),LL(0x425f368c,0xc7e83953),L_(0x000000bf), LL(0x03b7cc7b,0xb2825eba),LL(0xba3cef16,0x90e67535),LL(0x4aec5704,0xcc34aef1),LL(0x511ac67b,0xd95c0e01),LL(0x51002739,0x0f4f3657),LL(0x45e92922,0x465557ab),LL(0x1baabf91,0x0e9abecf),LL(0x8337c976,0xdff48fe9),L_(0x000001ec),
+ LL(0xa1025751,0x6a01039d),LL(0x28499cde,0x5ba84622),LL(0x47232500,0x4da34907),LL(0x523417ab,0x54b07c1a),LL(0xd3451baf,0x3fa7e4ff),LL(0x7ce5516f,0x2fbff214),LL(0xfc522cc4,0xa33f1b0a),LL(0x95c7010c,0x664b5cb3),L_(0x000001a5), LL(0x665ed5f5,0x980e5684),LL(0xd596415b,0xa5a1b30b),LL(0x8834a37b,0xfeebb04e),LL(0xcf282494,0xb29d17be),LL(0x340dc6ce,0x8d5399a5),LL(0xa50f4a86,0x76012bce),LL(0x83faa312,0x4bc769aa),LL(0x6550a065,0xea38cd8e),L_(0x000000b5),
+ LL(0xec66fa0e,0x134a53f7),LL(0xa7b2871d,0x1ee39cda),LL(0x83070c04,0x9749b3f1),LL(0x6da77991,0x867841c7),LL(0xe916f1eb,0x21e5438a),LL(0xe409b274,0x1b0e12d8),LL(0x3842a6e5,0xde5e08b8),LL(0x74b9e008,0xb7828943),L_(0x000001e9), LL(0xfea4cba7,0x08e07acd),LL(0x06789133,0xdb2143a9),LL(0x815c887a,0x85ffe6dd),LL(0xa9d2043c,0xa68d05e2),LL(0xd3ceab79,0x93674d33),LL(0x7a8a9863,0x12ee73ca),LL(0xd54b7afd,0x6403b9bb),LL(0x2eead112,0x4c680b70),L_(0x000000c7),
+ LL(0xfa0b987f,0x67c06145),LL(0xfd55dd43,0x34438e79),LL(0xe8ca9c52,0xfad0f9f8),LL(0x810f12c2,0xa97a7136),LL(0xb3ec5af1,0x3d0eabab),LL(0xb7b58561,0xecb3da01),LL(0x8aadf26a,0xbb015079),LL(0x9cce9cad,0xf01aa802),L_(0x000000af), LL(0x265a72e5,0xd025e951),LL(0x90e3ddec,0x5b2c9143),LL(0x4955e972,0x05386478),LL(0xdae63ed0,0x60c28f8c),LL(0x4aa5ded8,0x0fb99e77),LL(0xb74c1dd8,0x0f07854b),LL(0x2caae0f2,0x6691581c),LL(0x069f6ba7,0x072c0d48),L_(0x00000087),
+ LL(0xf5f13583,0x8b738df6),LL(0xe91f4420,0x786c7341),LL(0x1ae2188a,0xda384ed9),LL(0x08e3293b,0x19b1a00b),LL(0x9e09af31,0x65267666),LL(0x322f3662,0xd07b9f37),LL(0x764ea40f,0x11ae129d),LL(0xc16a911b,0x4cc8fb85),L_(0x000000c2), LL(0x59021aec,0xeb3197c7),LL(0x4daed80e,0xdfd4a433),LL(0x606234ad,0xab3ff78d),LL(0xf98a1d73,0x9f90a43f),LL(0x2c9cac66,0x99bed176),LL(0x5e8063cf,0x8f03fcd4),LL(0x50672a22,0xfdb17bf7),LL(0x027e080b,0x5a317879),L_(0x0000012b),
+ LL(0x236a647c,0x5dafe047),LL(0x30081d74,0xc3212b4d),LL(0x0f548f13,0x51f94578),LL(0xd885e14f,0x941059a0),LL(0x06ed3092,0x189c478f),LL(0x5042651e,0x7a26e8c7),LL(0xf36b6ee0,0x09a14b52),LL(0x32dfdec0,0xf1c461a0),L_(0x000001f9), LL(0xbe8ca673,0x527f0a50),LL(0x4c6beb6f,0xadaba76e),LL(0xfc7fd1fd,0x9909b987),LL(0x47c90091,0x992155a0),LL(0x06d6f45b,0x2da697e0),LL(0x740de37e,0x1a38bcd1),LL(0xce3867f1,0x509b93e8),LL(0x503be8b2,0xd6b05b60),L_(0x000000f3),
+ LL(0xe8c16ca7,0x4d3bbd16),LL(0x519f4d4b,0x53785c45),LL(0x6454947e,0x1aafab77),LL(0xd9b9416f,0x6883b419),LL(0xb337e34e,0x0208ba8a),LL(0x7e584157,0xab67774a),LL(0x5a84d18c,0x108ac516),LL(0x77b69d31,0x73bc43a9),L_(0x00000035), LL(0x91e5bcfd,0xcd5e892a),LL(0x5aa27743,0x502744c8),LL(0xa0414bf5,0xe26bb91b),LL(0xbc4ef773,0x8bcd45f8),LL(0x8f9e301b,0x3589038c),LL(0x30d42898,0x9a5f5e5a),LL(0xa609f771,0xaf5c6671),LL(0xade09eb4,0x5287fa3a),L_(0x000000ca),
+ LL(0x775485ec,0xf826fcc0),LL(0xa66e99e3,0xfac7759b),LL(0x6006cfb6,0x13b284ca),LL(0x1fbb2a30,0x53d194ad),LL(0x2c2b6910,0xf54ebb36),LL(0xa49dd337,0x46a6edea),LL(0x8fc79498,0x0d6aff86),LL(0x842dc894,0x9d7094f6),L_(0x00000050), LL(0x34121245,0xb4cfd050),LL(0xafb75e83,0xaf8c43b1),LL(0x77a38e5e,0x4ff38619),LL(0xe7485f16,0xfa745e75),LL(0x7e4f2466,0xcdc30bb6),LL(0x009d4a36,0x9994c740),LL(0x25e09cb4,0x66ca76f4),LL(0xf59131dd,0x95b4239e),L_(0x0000012a),
+ LL(0x6edaa49d,0x0aa308ea),LL(0x7669b865,0x72c7a072),LL(0xf06e514b,0xa7ddba09),LL(0xca616052,0x126487b0),LL(0xd64c8323,0x713cc701),LL(0xb7fd1abe,0x84ce35d3),LL(0x7bfbc16b,0xba894fdd),LL(0xba61b8c2,0xe784d69f),L_(0x000000ee), LL(0x18d74478,0xa66248c8),LL(0x62b773bd,0x3c1ca3e3),LL(0xde584f76,0x5c3541fa),LL(0x475ec797,0xe7fdfe89),LL(0xd692c26f,0xe8463461),LL(0xe888fcbd,0x682f9099),LL(0x1a8aba10,0x0ae8eea4),LL(0x2cc79e0c,0x479936cc),L_(0x0000004f),
+ LL(0x901772ff,0x6d000499),LL(0x481b7323,0xb7a27eb4),LL(0x69fc5685,0x4a7abcd1),LL(0x47ec07ac,0xcde4a9ac),LL(0x56f5f84a,0x45545bfb),LL(0x6ef7da38,0x33e7eca8),LL(0x2edec324,0xd8a46ddf),LL(0xd29093de,0xb5fd7555),L_(0x0000005d), LL(0x163bac52,0xbeecc923),LL(0x637f0966,0x0af4893a),LL(0x1759af91,0x1d38f097),LL(0xe0aea79f,0xf9d81651),LL(0x8ae541b7,0x510d4c3c),LL(0x32bd0e43,0xd73faaea),LL(0x6891a73c,0x3864a690),LL(0x6feafb02,0xbd306219),L_(0x00000129),
+ LL(0xa0c16a35,0xb6681c57),LL(0x415f0571,0xb2c83a60),LL(0xcfe1f331,0x4b9088d9),LL(0x1279d3aa,0x2ab5f2f1),LL(0x29c29c20,0xd47ee149),LL(0x16735420,0xfbb44304),LL(0xb8379216,0x23034403),LL(0x20a6f133,0x9f2bb4aa),L_(0x000001d5), LL(0xe0a94e50,0x38217da2),LL(0x2ba297d2,0x18816b2c),LL(0xe566aa72,0xca63550f),LL(0x1c7b21ca,0xdfe51644),LL(0x10c887fa,0xef849ed8),LL(0x4faeda58,0xb92e8367),LL(0x03636294,0x2414c0ef),LL(0x8476a050,0x732173ab),L_(0x00000184),
+ LL(0x93412483,0x9f53d923),LL(0x4403bdcc,0xe30fa97e),LL(0x6c9d0aa5,0x1601e86b),LL(0x9c1a2ec2,0x19610105),LL(0x431d5f14,0x6cc0662b),LL(0xb7bbdb4e,0x84ed40f8),LL(0x266aca0a,0x1b8a27f1),LL(0x198bae2a,0xded16036),L_(0x000001fa), LL(0x33afa5e4,0x023ed8a6),LL(0x8523afba,0x036adaa0),LL(0x83cbabb2,0xf5cebadd),LL(0xac3f99aa,0x20899c44),LL(0xca5f46cf,0x0e94933a),LL(0x7a04e2c1,0x9a3fee46),LL(0xb0015196,0x367a01a4),LL(0x1715a693,0xa13cc41d),L_(0x0000012a),
+ LL(0xc2d951af,0xd89fbf0d),LL(0x4488a068,0x172ac7ad),LL(0x7772ecaa,0x0409a3f1),LL(0xf7780ac8,0x6d541e69),LL(0x6ffa0a05,0x4e8fccac),LL(0x7509c471,0xeff8ec93),LL(0x018bbf89,0x101b9048),LL(0x2b2d5626,0x5365cf02),L_(0x00000168), LL(0xbd338134,0xda4a1896),LL(0xaeb1aa9a,0xdfd1cb54),LL(0xc0b310a4,0xeea1a455),LL(0xbed91e2c,0xaae7927d),LL(0xd3502cea,0xdfdf4808),LL(0xd31ee1ce,0xecc68f6a),LL(0x893f08dc,0x9350fda5),LL(0x2a6f281d,0x6394d514),L_(0x00000097),
+ LL(0xd5d022dc,0x6e654db2),LL(0xe4aaf49d,0xaa763047),LL(0x24820282,0xfe8aa2dd),LL(0xef229292,0xb7ff78ba),LL(0x0170b38f,0xe0a88558),LL(0x0aca63f0,0x66a526d3),LL(0x97a4873e,0xc069b5d3),LL(0x28c88b56,0xf066bff1),L_(0x00000169), LL(0xa3de237d,0xb57187d4),LL(0x20e27844,0x59762170),LL(0xf8485db5,0xf8fe71f6),LL(0x47186213,0xccceb1f1),LL(0x3ddfa68a,0xe9e1e35a),LL(0x3805a749,0x048090bc),LL(0xeea89d03,0xd04309c8),LL(0x451591c1,0x0e6409d8),L_(0x00000167),
+ LL(0x2e8fa162,0x86c08a44),LL(0xb15f83f4,0xd94f9cd2),LL(0x50bb6a89,0x7bbf2a23),LL(0x606cc572,0x74b1325b),LL(0xb03f198a,0x73b79d3a),LL(0xcf731a6f,0xc95046a9),LL(0x298efd11,0x095ed71e),LL(0xd622bb24,0xb7ec1274),L_(0x000001c1), LL(0x08c383b3,0xb2f19275),LL(0xe14dee81,0x0d888be6),LL(0xce4b12e8,0x213fb612),LL(0x78248f53,0x43092c13),LL(0x4330dbca,0xe40c52b2),LL(0x952b9ef5,0x9d869889),LL(0x31f1126e,0xfbc05f41),LL(0xfd03ae1d,0x3d5c2503),L_(0x0000016b),
+},
+/* digit=89 base_pwr=2^445 */
+{
+ LL(0x6e868b8b,0x244e266c),LL(0x05a4369e,0x7c7bf40b),LL(0xe296776b,0xaed3b7e1),LL(0x2cfd9c18,0xddbc31e2),LL(0x1ea90d63,0x98abb7bc),LL(0xe50b9291,0x791f36a5),LL(0xc2f87e55,0xfe737c71),LL(0x75c6d8e7,0xfa3c624f),L_(0x0000017b), LL(0xd54c9eb7,0xa0fb486a),LL(0x91d1e1e1,0xd820f02c),LL(0x9160a67f,0xe5d16017),LL(0xf1163f25,0x8b61c557),LL(0xfcbc9a92,0x84ed79f2),LL(0x6a33df9b,0x54ba6955),LL(0xc8febe18,0x43c5cb8a),LL(0xec5a3443,0x2d5af9a7),L_(0x000001ab),
+ LL(0xa725a8ec,0x5828c615),LL(0xf603a049,0xac113424),LL(0x87a77e81,0x34642c16),LL(0x761c2762,0x9d0db298),LL(0x29b1a474,0x8ac3391f),LL(0x143a9782,0x050c5b69),LL(0x5ae00925,0xc578b0a2),LL(0x144730ed,0x6de2bd6c),L_(0x000001de), LL(0x3bbfa384,0x606aeb93),LL(0x6e3daf55,0x97e41356),LL(0x4263527e,0x4ac1c1ae),LL(0x3a037893,0x8c336382),LL(0xb2143f58,0x2bb7d997),LL(0x69412726,0x2419935b),LL(0x9cb555c8,0x724eeef9),LL(0x2ef7f7cb,0xc86f89b8),L_(0x0000009c),
+ LL(0xf81335ca,0xd6526151),LL(0x999ff056,0x3c494f0f),LL(0x0a7433ca,0x41b82dc1),LL(0x7fa3bcdc,0x9af11e06),LL(0xec803bb3,0x0ac7bb35),LL(0x457b31fc,0xb5e185aa),LL(0xed555915,0x586ab2cb),LL(0x33044819,0x7928ec97),L_(0x0000008c), LL(0xbfc07b3b,0xae813666),LL(0x4f0a957b,0x8eee1f42),LL(0x82cf0958,0xc3321225),LL(0x4daeb7bd,0x458ec031),LL(0xe4de4e23,0xd0f97884),LL(0xfc50a768,0x1655c201),LL(0xb424f36a,0x14f1a537),LL(0x0cdff481,0x24211a6c),L_(0x00000042),
+ LL(0x22f8cb24,0xf131c203),LL(0x0c2b076a,0x815ccfff),LL(0xf056364e,0xdbdfbdbf),LL(0xc8028853,0x41ab5760),LL(0x8af0ee08,0xca93ac08),LL(0x3094da56,0x30135092),LL(0x5054010d,0x74228a25),LL(0x8e7dde67,0x6c6f6a05),L_(0x000001e7), LL(0x8a5176aa,0x3779fd86),LL(0xbe16420d,0x7658fb3d),LL(0x41f45c5c,0x110cf130),LL(0x49dea64d,0x19e0e350),LL(0x73f6746e,0x87ca4575),LL(0xfe7da390,0x108ab4e2),LL(0x874c5458,0xe39cce4e),LL(0x1d64965c,0xa2587b79),L_(0x000000b8),
+ LL(0xfa76cb01,0x80465e82),LL(0x38560d7e,0xf4fd03ea),LL(0xa649c8ff,0x150b3815),LL(0x72398c4a,0xc0e6baed),LL(0x1ba3da88,0xfa79ad8b),LL(0x6f43120b,0x8353fc42),LL(0xbd32e2fe,0x7dbd7876),LL(0x148c548b,0x13391dd9),L_(0x0000016e), LL(0x18cf351b,0x9ca7db2a),LL(0x80485f13,0x16240b9e),LL(0xdfdb85c4,0xc2dc15ee),LL(0xbb4121d8,0xcce3d597),LL(0x0e963371,0xafb37db7),LL(0x7c69e287,0xed3b5fd8),LL(0x6c8d52b6,0x608eaea5),LL(0x053f2384,0xa9384b65),L_(0x000001d4),
+ LL(0xbbf62c47,0x1eac543b),LL(0x11eca801,0x4e45d301),LL(0x682f5663,0x054cb071),LL(0xe9473698,0xf1ad1950),LL(0x860a714e,0xa8a339c8),LL(0x96d39034,0xe04ab8cd),LL(0xde22b09f,0x2a845e02),LL(0xdfec2116,0xbfc189e6),L_(0x000000c4), LL(0xeaca7b49,0x3e7c928e),LL(0xb0fcae9a,0xca8b3e2f),LL(0xc41fdaef,0x9529863b),LL(0xe1843977,0xd56a624a),LL(0xee7e83a7,0x3438606a),LL(0x81db821d,0x06cdb198),LL(0x3aa0eeb4,0x9b12775b),LL(0xe0d60750,0xa667b1da),L_(0x00000155),
+ LL(0xbe8e1de1,0x9b0a79d8),LL(0xc345fcdd,0x77d93da0),LL(0xb2f5a213,0x7028f9ce),LL(0x800fcc19,0x1306f2ff),LL(0x469efe59,0x4cd68bf6),LL(0xc5ffe046,0x62b03f93),LL(0x53010575,0x5af4940d),LL(0x46961f0f,0xe96e1d71),L_(0x00000163), LL(0xad6952b3,0x9045b751),LL(0x43f410dc,0x217ebd7d),LL(0x0d11a22c,0x6ddeefda),LL(0x6d1775a7,0x43965993),LL(0x055c0203,0xe7060f57),LL(0x3548b71e,0xa89da1f0),LL(0x805eb428,0x6f8231a6),LL(0xf7b78a97,0x975110f7),L_(0x0000006a),
+ LL(0xcf1f7c72,0xe247b483),LL(0x97b6bf76,0x202781dc),LL(0xc0f81747,0x8b65bb58),LL(0x92efba88,0x9611a60c),LL(0xd9612af5,0xaf54a57c),LL(0x20d7ccbe,0xf8689ba5),LL(0x6d3cbf9e,0x0591cc36),LL(0xdc1abfe9,0x6d0aa056),L_(0x00000166), LL(0xd4a04bec,0x1e600b02),LL(0x2a15021b,0x6c3ebe8f),LL(0x9586be60,0xb8507cfe),LL(0xf4028af5,0x54dda762),LL(0x4d392e89,0x519d3758),LL(0xbde8dadc,0x58c3813e),LL(0x81db641b,0x91557ce6),LL(0x23fa3b99,0xa7128063),L_(0x0000019a),
+ LL(0x51bb00fd,0x32b04d9e),LL(0x8aefebe4,0x22b78b18),LL(0x8698b63c,0x7da3c01d),LL(0xa71b8bc0,0x8d71ee46),LL(0x27b7a39c,0xb0583313),LL(0xbd156109,0x49d2846e),LL(0x931258ab,0x86e6af4e),LL(0x3ca87258,0x07bd42b6),L_(0x00000076), LL(0x79f7c689,0x39041060),LL(0x6229b813,0x9028538d),LL(0x3a4aa59f,0x517bfaf7),LL(0x2d1cb542,0x71d33bc2),LL(0x882030de,0x9ba76285),LL(0x91ba5fcd,0x25f86ca8),LL(0x9ae0fc6d,0x47f08f0a),LL(0x3948678f,0x3c9bee89),L_(0x00000085),
+ LL(0xcd9eb593,0x18cd9b8b),LL(0xac677eb2,0x0d8705ef),LL(0x6b203fcc,0x934fa783),LL(0x39fcfd85,0x571b28eb),LL(0x58bd6d8e,0xd8f1d221),LL(0x215fad4b,0x3e44e705),LL(0x827adc24,0x5ff00393),LL(0x1ec35c0f,0x853889ac),L_(0x00000045), LL(0x14fc0a02,0x5fce2e10),LL(0x71f9384c,0xf0f2ac5b),LL(0x90d699f4,0x7b00891b),LL(0x43b6bcdf,0xe8c4a652),LL(0x7bc04d87,0x0ac9f698),LL(0x2ab126b5,0x3eb3d860),LL(0x849b38d0,0x426d6e94),LL(0xb6985535,0x102cbacf),L_(0x0000018b),
+ LL(0x0725d65d,0x1183558e),LL(0xb6a14f9d,0x44070253),LL(0x20d9075f,0x6c243902),LL(0x486b1799,0x6c1a9d8a),LL(0xf5efa075,0x8ae5a14e),LL(0x4ea72292,0x2d7b9c93),LL(0x0ca5c12a,0x992cae02),LL(0x91e3345c,0x2c11f45b),L_(0x000001d1), LL(0xc89bcdf7,0xd10410ec),LL(0x89966bf7,0xcf680bd5),LL(0x6ee731b3,0xa0c3db72),LL(0xe37f14f5,0x2aa5a376),LL(0xf554bdb7,0x23be47dd),LL(0xef1712c3,0x96ab9b1d),LL(0x1c7594e0,0x9ed66d28),LL(0x032ce687,0xd712923d),L_(0x00000060),
+ LL(0x9e3351dd,0x68d68f89),LL(0x9fb7334d,0x40ebf359),LL(0xc5209aaa,0x120177c0),LL(0xe5d00b75,0x2f0e6bbb),LL(0xbf188e69,0x110d2427),LL(0x8e2e5213,0xd6344a1b),LL(0xdcf577cf,0xa7331f94),LL(0x3c553feb,0xa2dfcf3c),L_(0x00000190), LL(0x795a2fa2,0x524f4a9f),LL(0x6609f22b,0x6b23609b),LL(0x2c95b3f8,0x0500bc47),LL(0x8df999a3,0x042c79e9),LL(0x9db59925,0x12a07a8b),LL(0x55be1532,0x07f62419),LL(0x33c89540,0x8df78722),LL(0xfe671ad7,0xe8b1f741),L_(0x000000c9),
+ LL(0x18059a16,0x52e9bed4),LL(0x717c36f7,0x49d5e825),LL(0xb56dd6dd,0x7783b6cd),LL(0x667fac4c,0xcf53b558),LL(0x116a1985,0x7c15cf14),LL(0x9913c6ee,0xe08410c5),LL(0x6728a2a4,0x9d771edb),LL(0x331fb13d,0x190212be),L_(0x000001c7), LL(0x394ecd2b,0x8da76d72),LL(0x341e75ff,0xf52f78d6),LL(0x29ea6d71,0x46d211ab),LL(0xaf402bfc,0x386ae83b),LL(0x7e9586dd,0x909f5bf1),LL(0x11c7f555,0x1b8a537f),LL(0x427868fe,0xcf05f9d7),LL(0x32daf130,0x60d32255),L_(0x00000069),
+ LL(0x4ef2bfbd,0x360e62a2),LL(0xc1081697,0xa6a207aa),LL(0x28d01fdb,0x18abc7ac),LL(0x204fc30b,0xbcff0be1),LL(0xe5cdb570,0x48ef40e1),LL(0x1f0b1c2e,0xeb79790f),LL(0x63136e14,0x3d4fe961),LL(0xb9d45c94,0xa355bb40),L_(0x0000018b), LL(0xa61088da,0x8938b0fa),LL(0xb39c86bd,0xc33f1d7c),LL(0xa2380177,0x530d6911),LL(0xaab3667d,0x7b52bed9),LL(0xd815d83b,0x5c596749),LL(0x44b95fe0,0x5148c157),LL(0x202c91ff,0x406b7485),LL(0x8bf24d49,0xa2828406),L_(0x000000f3),
+ LL(0xd37bc919,0xe29da36d),LL(0x00b56fef,0x7458f713),LL(0x8621718f,0x286883b4),LL(0x448b7c11,0x363d4ba5),LL(0x6114fd6e,0x04011c7c),LL(0x0d4b7500,0xe765f7ee),LL(0x491c6545,0xc2b827eb),LL(0xd01f3320,0x11a3a7f5),L_(0x000001f0), LL(0x6902bd96,0xda599389),LL(0xe2b47365,0xfe7e3528),LL(0xe9079def,0x3aa4556e),LL(0xc96d3bc8,0x610e35fb),LL(0xb585febd,0xa0b2ea82),LL(0x70988a63,0x60d1db4d),LL(0xd27f19aa,0x6eee4c02),LL(0x248d0f40,0x9a820473),L_(0x0000008c),
+ LL(0xba327209,0x4da0ba85),LL(0xfac1ed29,0x2e3b7145),LL(0x48cf218d,0x5cbfef12),LL(0xde112f17,0x76f3e234),LL(0x194a8f16,0x65787086),LL(0xde1af9c2,0x18958d56),LL(0x495c76a5,0xdd3dbcba),LL(0xa5e9c9c9,0xfc23acbf),L_(0x00000142), LL(0xb1fcebaf,0x30a1b712),LL(0x73d82709,0x8296f1f2),LL(0xfa6e1f41,0x5ef71edd),LL(0x7dd19081,0xc4a2f8af),LL(0x2f6fda9b,0x85b1234b),LL(0x541a4825,0x23556036),LL(0x79e6b22e,0x911ac1cc),LL(0x88ea71f9,0xe3d2a799),L_(0x000001f3),
+},
+/* digit=90 base_pwr=2^450 */
+{
+ LL(0xa22cc5d8,0x8ee779a0),LL(0x5dd5d86c,0xfd215954),LL(0xfd5e2c81,0xab1c7262),LL(0x75f13cf7,0x4f36ad82),LL(0xe759a0b7,0x8c3ddc91),LL(0xd2223c0c,0x10948a51),LL(0x9b2c7f7d,0x977160cf),LL(0x285822b5,0xddf4960f),L_(0x000001b0), LL(0x1a1e9623,0xd7c127ef),LL(0x7e5e2b50,0xd984c528),LL(0x3999dfdf,0xaad5ce7d),LL(0xd1373907,0x5c84726f),LL(0x97f8f082,0x5ebbc32d),LL(0x68dcb5c5,0xbd51b3a0),LL(0xa1b4f592,0x36935287),LL(0xf3eb9dca,0x0a3866c8),L_(0x00000125),
+ LL(0x95c0c51d,0xdbb76844),LL(0x7bb768dd,0x35dbc45f),LL(0xeda49098,0x39df9e6d),LL(0x3639006a,0x47f77ee7),LL(0xd878e5a2,0xd141b2c8),LL(0x2c8ccd83,0x04a47e33),LL(0x2d4027f8,0x2c9dc7a0),LL(0x9934bb00,0xf2cf7b1b),L_(0x000000ad), LL(0x8d777a83,0xd9919c1d),LL(0x0f685368,0x9dd72165),LL(0x892863f1,0x2a92b1de),LL(0x8f2b25a3,0x90ff3dd7),LL(0x12a43206,0xaf7bb8bc),LL(0xe03505a4,0xd763efcf),LL(0xcf4f256c,0x53701c70),LL(0xef267753,0xfc008443),L_(0x0000011d),
+ LL(0xecb197aa,0x593ffafe),LL(0xdd6e37e8,0x40fd5b94),LL(0x41331e2a,0x298fef4f),LL(0x60fb849c,0xfd38fb42),LL(0x7e149e93,0xe83fe7b3),LL(0x22e02e59,0x5d08e682),LL(0x58b84ec3,0xcaa4bfd0),LL(0x7f8e6b6a,0x506a3a04),L_(0x000001ec), LL(0x89faa591,0x3bdb5b23),LL(0x6e000f52,0xa824fd00),LL(0x630a4795,0xcbf7e717),LL(0x4e000837,0xc37102e6),LL(0x5656508a,0x40d36c3a),LL(0xe0b06b84,0x0a694f94),LL(0xd89beeae,0x647088c8),LL(0x682c3563,0x914b3bd9),L_(0x00000187),
+ LL(0x49e0800c,0xd1b7504d),LL(0x59ebe077,0x04fd80e1),LL(0x714afb4f,0x90ea18a8),LL(0x28810d8b,0xf02c3cde),LL(0x719cff83,0x19367a86),LL(0x8786eb9e,0x952bac43),LL(0xecceb4e9,0x460e0748),LL(0x55aefa66,0x440aefaa),L_(0x000001a8), LL(0x7aaa315b,0x44f96e09),LL(0x7a5db2b5,0x5dae237e),LL(0xa9362519,0x163873d0),LL(0x69799223,0x4d0fbf55),LL(0xc1a58ea8,0xd3bb728a),LL(0x661ed43f,0x100cfe43),LL(0xf1cd21af,0xa24f55c6),LL(0x25dcbe9f,0x4c47c918),L_(0x0000003e),
+ LL(0x5ef36acd,0xd5225f3c),LL(0x5770b7a0,0x90f00a62),LL(0xebdaa1b7,0xc0ab750b),LL(0x1bcb88b8,0x4d9be029),LL(0x06bbf584,0x9dfcba75),LL(0x606f29fe,0x74e426d7),LL(0xd113e261,0x2931cda9),LL(0x0453e382,0x7c891656),L_(0x00000067), LL(0xba1e3830,0x95a907f6),LL(0x1922ca15,0x760c0c2f),LL(0x24719cf1,0x383ccd2c),LL(0x11f794fe,0xa0495e03),LL(0xaf40e690,0x3eba817e),LL(0x1fab7cdd,0xa83e8359),LL(0x9846062a,0x737b3c03),LL(0x52241afa,0xe4f9dc5b),L_(0x00000056),
+ LL(0x2d0ad5b6,0x49587f7b),LL(0x321154b0,0x12ada5b1),LL(0xdc3aa007,0x0fe792e5),LL(0xf996b5f9,0x0e4944ed),LL(0x8197e83f,0x06340a72),LL(0x6a72b742,0xb3002f8a),LL(0xbc8a8319,0x173328b5),LL(0x81f8ab11,0xfdfa8b39),L_(0x000000e8), LL(0x2774c6fa,0xbe5f49f5),LL(0x674e04ad,0x8fbf7faa),LL(0xe6de1313,0x5724658c),LL(0x38fee508,0x6a0cb3e6),LL(0xeb3e2c17,0x24438695),LL(0xe7eaef00,0x43ac8a73),LL(0x4dc94b9f,0xd190f6ea),LL(0x422b705b,0x9011e9cd),L_(0x0000012c),
+ LL(0xd43e3b34,0x02b39b5b),LL(0xd46524f2,0xabfa1c64),LL(0xa4dd7015,0x8ec6eade),LL(0xfac38f67,0x78cba481),LL(0x1123582f,0x61a4550d),LL(0x1caa4894,0x42f7ada2),LL(0x83747c68,0x17f7f74c),LL(0xffb17df5,0xaae24930),L_(0x00000037), LL(0xeb2b93af,0x7f0ef78c),LL(0xcf301d2b,0x8e9f267c),LL(0x8e246b2f,0xb4a2acd2),LL(0x2035c962,0x50846229),LL(0x97e899e6,0xe23609a5),LL(0xfbcb2b53,0x1483eb63),LL(0xfc3f203e,0x4d6ddbe6),LL(0x2861a320,0xc8f76239),L_(0x00000005),
+ LL(0x41fc794a,0xffcd84d6),LL(0xf5985a4a,0x5082ece4),LL(0xcf3bb3f4,0x850b4853),LL(0xb1d8af65,0x670d980b),LL(0x6953dc3e,0xf579458a),LL(0x7963424e,0xac2f2e4a),LL(0x540b6858,0x920d771e),LL(0x1f5fed22,0xb1aeb9be),L_(0x000000b0), LL(0x731be223,0x662c4dc5),LL(0x1419cfbb,0xa5701752),LL(0xd65099ca,0xfbcc0240),LL(0x3af88f3b,0x1643acb1),LL(0xfbc4861e,0x67405bcd),LL(0x35f067ed,0x9351f1c8),LL(0xcb8018ed,0xeed0e188),LL(0xd276f971,0x0c95e1f8),L_(0x00000189),
+ LL(0x8cc00e47,0xd167d662),LL(0x311413fa,0xb1947f2a),LL(0x68fd100f,0xc373b68f),LL(0xd96895d1,0x259f8c2b),LL(0xb6277660,0x495d6470),LL(0x6dd59691,0x9eee1f91),LL(0x8e4a7fc7,0x1b01dab7),LL(0xf1319245,0xe946229c),L_(0x000000f2), LL(0x3751b5a9,0xb3dd751f),LL(0x352c6ed0,0x36c470b2),LL(0xbb64e49d,0x58925906),LL(0x5b0b62a0,0x9089d01b),LL(0xe64e7de4,0xf631915c),LL(0xcd161d83,0xfa1f87e7),LL(0x44c46466,0xcced2cc6),LL(0xec7eb165,0xfc7d0b25),L_(0x0000005d),
+ LL(0x0360b595,0xc1265889),LL(0x3fa41625,0x9e6d3563),LL(0xa19100cb,0x10accaeb),LL(0xaec86fbb,0x7b3f3d8a),LL(0x80771b15,0xdb2ccbe9),LL(0x803f9c49,0x07a460fa),LL(0xf34e5b14,0x4b602490),LL(0x6a99a6e6,0xb0145e5d),L_(0x000001b4), LL(0x308acd32,0x65b0ad8e),LL(0x3dceea03,0x13ece697),LL(0xe1bef19b,0x0643badc),LL(0x4cbdd893,0x470bd8ab),LL(0xafc33073,0x39f6bceb),LL(0x17b3cfed,0xf3aad086),LL(0x198868e1,0x0e329726),LL(0x9f6251f8,0xac5be216),L_(0x0000008e),
+ LL(0x2c636d48,0xd1bce1b0),LL(0x51f92c94,0x1ad3a1e4),LL(0x88368755,0x9be2c281),LL(0xd8124a18,0xe3a680f7),LL(0x9e5bc7e6,0x5e952f4f),LL(0x2fefbd16,0x5cef9135),LL(0x19b6c616,0x5576fffd),LL(0xbf997c16,0x21c0e1f9),L_(0x00000052), LL(0x01681747,0xdbf38f7d),LL(0x00a3bfc8,0x549f1e54),LL(0x39cded9a,0x23fdd541),LL(0x8b94ded9,0x89eeca5b),LL(0xfd084a5a,0x5123eaa5),LL(0x834be49d,0xae42403e),LL(0x02444c83,0x25abfb57),LL(0xbcb65841,0xc8736491),L_(0x000000f7),
+ LL(0x606a9e44,0x91ee418d),LL(0xd2dd052e,0x7e5ea0e7),LL(0x92e787f3,0x69d6f73c),LL(0x4508ea48,0xfe248ecc),LL(0xa2d461ac,0x529ffcc1),LL(0x22dcbd24,0xf90dc5dc),LL(0xa3364562,0x542f8abb),LL(0xd254e4f9,0x43e7b56c),L_(0x0000012c), LL(0x990aa036,0xc4f4234a),LL(0xb59ee2ed,0x1031cef9),LL(0xd5d4b081,0x984145d5),LL(0xdf2c037b,0xc7b07787),LL(0x2a2d6af2,0x31d56853),LL(0x6d5e6ff4,0x309a7c9b),LL(0xbb40c66e,0xda6a3ee9),LL(0xaf9db41c,0x4c5f4c81),L_(0x00000180),
+ LL(0x2ab124d1,0xf806ef78),LL(0x2f7a4e31,0x0cea295c),LL(0x32a4553d,0x8a3bdbfd),LL(0x19971283,0x3b9e4766),LL(0x8810a423,0xcdcf9f57),LL(0x8e85dc85,0x020a6262),LL(0x129bd8b1,0xbc50d2d2),LL(0x9a64395d,0x3517c068),L_(0x0000012b), LL(0xde8938c9,0x2bd0d178),LL(0xb0b45608,0xde7e99ed),LL(0x36896362,0x3851afd1),LL(0xe2cc94c2,0xdfbefd8a),LL(0x14aa57ae,0x3c1abef1),LL(0xd8652bb1,0x0cc39736),LL(0xaf001e99,0x72b91536),LL(0x9fdf9a10,0x4f614f57),L_(0x000000b6),
+ LL(0x4403c833,0x48e45088),LL(0x26afc7d8,0x41225474),LL(0xa4629460,0xcc7a0cd5),LL(0xff951c59,0xaba7cf1f),LL(0x0d1f3526,0xaf07c8ca),LL(0x18426df5,0x2746f85b),LL(0x42d2e91b,0xfabc76e4),LL(0x58debcd4,0x043b8f7d),L_(0x00000052), LL(0xa9da44e7,0xeb092c08),LL(0x1d496006,0x0b68b024),LL(0x67bb5005,0xbf7c5c64),LL(0x0562f97c,0xca481cfe),LL(0xb0ce28f4,0xc88ad0f0),LL(0x5bcd7411,0x79f82640),LL(0xcfb08fb0,0x9dac9879),LL(0x22beef72,0x149b9a60),L_(0x00000111),
+ LL(0x055ab7d2,0xb9344cd4),LL(0xcbb171f1,0xf24efa25),LL(0x63c2684d,0x4f8a3dbe),LL(0xf0b702dd,0xda3c37c4),LL(0xa46de3f5,0x17afe9a8),LL(0xdeacde9a,0x55f90e6b),LL(0xb3ba7f88,0x4d24b1d2),LL(0xa174d6f6,0x25de78cc),L_(0x00000081), LL(0xbb7dee1a,0xa172733c),LL(0x562c1d69,0x4325a01b),LL(0x851c2792,0x2307ef6a),LL(0x99968ef0,0x69918f4f),LL(0xb12cbce1,0xcd378fb1),LL(0x9c21abf8,0x48639036),LL(0xe801ee02,0x8268fb51),LL(0x7205404d,0x1c86d6a5),L_(0x0000011b),
+ LL(0x3a0f6f06,0x7ad7abcf),LL(0x531ca66d,0x41cf832b),LL(0x4ac4965a,0x0f9f470a),LL(0xe00766a0,0xa92657cb),LL(0xb432af80,0xac40c892),LL(0xa94b8968,0xbd44eded),LL(0x4be8b74c,0x2a8d4620),LL(0x98f760bd,0x329915dd),L_(0x000000f4), LL(0x2a7f464f,0xdb3e7dcb),LL(0x00b58c0f,0x1a96b289),LL(0x3c1d7ee5,0x7a30a299),LL(0xbf0ce935,0xb49f5f57),LL(0xf1f5d39e,0x8f0c1970),LL(0xac9cfb8b,0x0718d4fa),LL(0xe1c25a36,0x66ec4ed9),LL(0xb0d7504b,0xf3b6204b),L_(0x00000048),
+},
+/* digit=91 base_pwr=2^455 */
+{
+ LL(0x72de604b,0xda62b655),LL(0xfb7d9262,0x9db8d0d3),LL(0x8e9c2aa3,0x9b867b7f),LL(0xf2912d3c,0x1a5ad674),LL(0x279e6d83,0xc6935b1c),LL(0x82236f3c,0x9a75e08b),LL(0xfcf8f6f0,0x1baaa28c),LL(0x5ff40727,0x6db1a4f7),L_(0x0000013b), LL(0xab24706c,0x991d9aa4),LL(0x2ed85b4f,0x767e0695),LL(0x0793e3c1,0xf7d06ffc),LL(0x6115d975,0x1316443d),LL(0x9c57472c,0x0b8651df),LL(0x8b972443,0xda1a64f2),LL(0xf1bbd8db,0x0c6db846),LL(0x62aea165,0x152182f5),L_(0x00000024),
+ LL(0xd5d810c8,0xe6eb51bd),LL(0xe42198e6,0x9bc2e3a0),LL(0xc4b3dc48,0xeda7e391),LL(0x6ed77fe5,0xcd0e3d73),LL(0xc5e60972,0x05f70f41),LL(0x26a51aaa,0xb07669f4),LL(0x9830a47d,0x34591483),LL(0x45b98cf4,0x5726f290),L_(0x000000dd), LL(0xdc9d9c57,0xf4c3b8bd),LL(0x95086409,0xd467dc92),LL(0x3e6cf0fa,0xfbebdef2),LL(0x9684c1e0,0x1daa3a72),LL(0x8c3a2301,0xf40ca0da),LL(0x850f8c4e,0x4dda12c0),LL(0x990ccbe3,0x8f2c5e51),LL(0xc2f0adaf,0x64a48494),L_(0x000000d2),
+ LL(0x248df475,0xb7ac228f),LL(0x869c271f,0xc18f18ee),LL(0x46d75c07,0xb3a5cead),LL(0xa1a299f1,0xf8c96489),LL(0x7ba98e94,0x805d6dbc),LL(0x1a1d6b09,0x485c463f),LL(0x5bca1865,0xfae82626),LL(0x54594fd7,0x90195cb1),L_(0x0000008b), LL(0x13e4d735,0xb2ef61b8),LL(0x5d0af04c,0x3f79b3f0),LL(0xe86965cf,0x8df70be4),LL(0x6a326017,0x93f5bd3a),LL(0x59b253c0,0xcbf1399d),LL(0xa14a5e9e,0x5112a46b),LL(0x98f7dd60,0x84b48e76),LL(0x9c0c1a6e,0xc837b65f),L_(0x00000111),
+ LL(0xf887b36a,0xa9bb0064),LL(0x651f2c93,0x4572329d),LL(0xd988aed3,0x6f510e01),LL(0x48541e9e,0xabc023be),LL(0x90ac10a8,0xa8621efc),LL(0xf943b700,0xeb208400),LL(0x768bb3b3,0x64d85b1c),LL(0x634af0db,0x00cbcf42),L_(0x00000072), LL(0xa7e0a10a,0x4e42e593),LL(0xacaa8063,0xadef0026),LL(0x6f2f96cb,0x955002da),LL(0xca66aa2e,0x57271d8d),LL(0x15a69e81,0x66dc7629),LL(0xcf29f326,0x378977dd),LL(0x07d6619c,0xe10e5eaa),LL(0x48e47a94,0x1697c2a5),L_(0x0000004a),
+ LL(0x60476dab,0xd5ce8836),LL(0x1ca95649,0xd950d005),LL(0xf0b56f1d,0xe5ff1bc5),LL(0x06d36f22,0x6e683386),LL(0xe2bbd6a0,0x249d13ac),LL(0x69fc343c,0x15998eb3),LL(0x47a41e75,0xf1860545),LL(0xc5dfbed2,0x25709f69),L_(0x0000012c), LL(0xc1e80885,0x5129b884),LL(0xf74074e8,0x9d124cde),LL(0xb7fa9540,0x9c58531f),LL(0x291d5e4a,0xaf4422a4),LL(0xb30d5ded,0x4cd8b631),LL(0x30a12b16,0x4d0ff100),LL(0xb2d9901c,0x450557f4),LL(0x1b1ee29b,0x5c3c3626),L_(0x0000012e),
+ LL(0x6dcd5109,0xc399a187),LL(0x5c966d1c,0xfc77243f),LL(0x4abf82c9,0x3aec3b2c),LL(0xfaf22c71,0x4988df1e),LL(0xaa22e170,0x8f28a287),LL(0x7d192a2d,0xf724ea96),LL(0x6179ade0,0x8ced48e7),LL(0x18acdc5b,0x8dd5bff3),L_(0x0000010b), LL(0x0c63196a,0x8e70052b),LL(0xa08be270,0xd8ff45f4),LL(0xe9bd37fa,0x46164862),LL(0xcc39748e,0x3cc067ef),LL(0x7dcfa284,0x68836731),LL(0xc4586ae8,0x8aabfd38),LL(0x85ecef5b,0x815642ea),LL(0xaf78e84b,0x5ad0b873),L_(0x00000191),
+ LL(0x55d6e970,0xf86e2eca),LL(0xa3c6d699,0x35fd609b),LL(0x277a6dcb,0x8e0371bf),LL(0x73c53bc0,0x69861b02),LL(0x747c9b1f,0x121dd3fe),LL(0xf6c83ab7,0x1a4b5c05),LL(0xa41b4b4b,0x103beb00),LL(0x6b773426,0x9a32a82a),L_(0x0000017d), LL(0x590624d3,0x968b4935),LL(0xdc61d6e8,0x57ff9d1f),LL(0xc882f647,0x3774a13e),LL(0xd8068210,0xc8094f39),LL(0x52df5a78,0x9ce26b44),LL(0xd80b9309,0x06b76a9e),LL(0x51126d68,0x26a298cf),LL(0x20129462,0xe7c24e2a),L_(0x00000044),
+ LL(0x00b763fd,0xe905f611),LL(0x31c9604c,0xad5b3ffa),LL(0x059b27d0,0xe85817bf),LL(0x957d997f,0xc9cea64f),LL(0xa8adabfc,0xbf24cb58),LL(0x74dd2fa1,0xfe218a31),LL(0x08cb0dea,0xcfee69ca),LL(0x310fed00,0x47666fdf),L_(0x00000094), LL(0xd66e131e,0x18c779a4),LL(0x47a1fa4d,0x13180dd7),LL(0x23f27ad3,0x3169340c),LL(0xdf4a2f35,0xa8c2be04),LL(0xaec77b35,0x3a1f8aa1),LL(0x2eed7fb2,0xe69edc27),LL(0x6110abc9,0xa5d58ddb),LL(0xe7590226,0x002c042a),L_(0x00000160),
+ LL(0x2331223f,0xe2c10ac8),LL(0xb1509b5c,0xf8262756),LL(0x8c8a002b,0x4f5e4c0e),LL(0xccc65314,0xaa63ef65),LL(0x5d26b24c,0x91432899),LL(0xaef2d2ee,0xace0562c),LL(0x284cbe21,0xdd5ba0e2),LL(0x4e06f44f,0x6b10f576),L_(0x00000180), LL(0x9becc83c,0xb164c12c),LL(0xc02c461a,0x811e7743),LL(0x621b38ad,0x8fde0227),LL(0x61151b61,0x1eee0c18),LL(0x90989162,0xa3e85682),LL(0x6d28169b,0x478f9519),LL(0xd980aa5d,0x35d9dbcd),LL(0xf940dd13,0x97a4c520),L_(0x000000c0),
+ LL(0xf6f3cc8a,0xede150db),LL(0x71295f54,0xc2f06bc3),LL(0x173c2266,0xbd26ab2d),LL(0xda0b8b46,0x958aad7f),LL(0x470909e3,0xbeb03518),LL(0x0c135242,0x6b5aad80),LL(0xe6b782b0,0xf43a70dc),LL(0x1ebe42a4,0x314ef776),L_(0x000001d0), LL(0xe9ee87f4,0x5c7acfe8),LL(0xcb05380b,0x7c5775ef),LL(0x2d540e71,0x4507bf0a),LL(0x839d644d,0xc6b81a8c),LL(0xbd1ff451,0xa45f8834),LL(0xc6531b7e,0x06bfc9c3),LL(0xf1a607c3,0xfacabe92),LL(0x152a3731,0x250efc13),L_(0x0000000f),
+ LL(0x972ed0b4,0x6043f03e),LL(0x2b923d0d,0xef133e76),LL(0x91d9dd18,0xbb6feffc),LL(0x25386141,0x9f4c0085),LL(0x7c52d849,0x279b119e),LL(0x1a74529c,0xfbddc6be),LL(0x3bb14fa6,0x0fc37390),LL(0x5b0469e7,0x6734c330),L_(0x00000085), LL(0xc18b1c46,0x93ed9948),LL(0xc3e5b7a6,0xef0ebe97),LL(0x98b816ed,0x5877dfeb),LL(0x369d99d9,0x3e4311e4),LL(0x2bf65ec4,0x311d0134),LL(0x8c99e5b8,0xc89dbf6c),LL(0x0a9bf18b,0x0c03cf95),LL(0x67a8c9b6,0x6bde4334),L_(0x0000005d),
+ LL(0x4dad1ff8,0x536327ce),LL(0x2d1bf3b3,0x5b0b6267),LL(0x47367af0,0xf13ddf38),LL(0x8798d158,0xa948f127),LL(0x84fbc252,0x3d0fe92b),LL(0x978e6fc0,0x0138676b),LL(0xef9334ec,0x96ea4ba8),LL(0xb13cf224,0x6c3f3f98),L_(0x0000000a), LL(0xa8ac5c62,0x19d6d21f),LL(0xb670515f,0xb4a2fb70),LL(0x28de441a,0x4762c399),LL(0x0fd9e912,0x3371fcdb),LL(0x896888c1,0x85fb68ee),LL(0xd0e213f1,0x2d86c189),LL(0xcea1f849,0x151cf6fa),LL(0x49b94eff,0xd27fa5b9),L_(0x000000fa),
+ LL(0xab2c72b8,0x009b461a),LL(0x349ca815,0x64f4891c),LL(0x07d9a898,0x0c2c3617),LL(0xe9f189a3,0x6792792c),LL(0x226e9a21,0xf620343c),LL(0xc9fabe1a,0x72bb7a93),LL(0xda748299,0x321acb19),LL(0x1b2afe12,0x5e8ede23),L_(0x00000037), LL(0x938118e1,0xbfadb006),LL(0xb72a44a8,0x9204c26a),LL(0x32e10cf5,0xbf6c9c27),LL(0xd43d80b7,0xbe5c3cec),LL(0x0afdab99,0x915d7960),LL(0x1a5a24d1,0x933f89c3),LL(0xfe011c0b,0x93e4d990),LL(0xfd09b45f,0x83123923),L_(0x000000e5),
+ LL(0x5c3e8550,0x67c79888),LL(0xf4f27501,0x18ef2850),LL(0x0d7f6b01,0xf40547f0),LL(0x9cb15ed2,0x89d6f189),LL(0x1bc417a9,0x5c937894),LL(0x22180816,0xb0e0c28f),LL(0x72ddfe6b,0x95839d95),LL(0xb0b70e2e,0x261abd6a),L_(0x00000119), LL(0x0092c31b,0x3261be8d),LL(0x81547562,0x2ed776ec),LL(0x2bc72da3,0x7afed7b9),LL(0x943fbdb4,0x7b5a5d6d),LL(0x896c4516,0x44f20815),LL(0x23f06fef,0x5bd5c28e),LL(0x8f4f6c6d,0xaeda432e),LL(0x355da25e,0xeabf97b3),L_(0x000000b4),
+ LL(0xfa6c2c0b,0x097c5794),LL(0x8878edbb,0xc8776355),LL(0xf986d296,0xb4dc28da),LL(0xcb68b5fd,0x7d364b0a),LL(0xf5c63307,0xa8df5161),LL(0xe81fb7b4,0x5837723e),LL(0x9cfefa9e,0x681c02e5),LL(0xf9182f1b,0x0c0e0df5),L_(0x000000d3), LL(0x43741dfd,0xeeeaf6e7),LL(0x0f7f7db0,0x912e6cbd),LL(0x1b17b840,0xfbc2bc3c),LL(0xff0906cb,0xaed2e1f9),LL(0x79085d0d,0x413a3a6e),LL(0x3e5f9190,0xf10a18b2),LL(0x5e4a7967,0xbe3ecf44),LL(0xb4e7b709,0xb5e5c6ae),L_(0x0000013c),
+ LL(0x9f76c8ab,0x693d1574),LL(0x254fd850,0xd18a6991),LL(0x4944e4ef,0xf78f60f5),LL(0xbc73879c,0x125696fe),LL(0x04c63e00,0x8e1e2dbe),LL(0x88e142f6,0x688fd93a),LL(0xbbe7321b,0xd6f1e83a),LL(0xa7b2fa13,0x693413aa),L_(0x00000118), LL(0xcbcaa293,0x19ff3b97),LL(0xb39ad595,0xcedb5893),LL(0x7e59369f,0x47364ed0),LL(0x15852af3,0x7c32e933),LL(0x4d5a40d4,0x82768fe3),LL(0x06533865,0x53f8e4c6),LL(0xf43bf2b4,0x8b4a96dc),LL(0x2542e182,0xb2f8ae33),L_(0x00000153),
+},
+/* digit=92 base_pwr=2^460 */
+{
+ LL(0x0611a7aa,0x83626ec8),LL(0x91b56818,0xaebe5044),LL(0xecc113fd,0x3fc31dd2),LL(0x68171e0f,0x5fdadf10),LL(0x4d2fbb6b,0xe94a492b),LL(0x06c20ee0,0x0723f06e),LL(0xe2fed2d9,0x8316b906),LL(0x2f32d5d0,0xfd81f33b),L_(0x000001c7), LL(0x63731c43,0x2924bed0),LL(0xf8996c91,0x58df5bd8),LL(0x04d16a64,0xb4780e3a),LL(0x3ff6f14c,0x5aed0330),LL(0xcf56c817,0xb62e0f3e),LL(0xf8163011,0xee8bd1d8),LL(0x5c28fa8e,0x9fa055be),LL(0x5edb8d9c,0xfcd0b563),L_(0x000001e4),
+ LL(0x0deb4c2e,0x0e66e6ba),LL(0xb2451f1c,0x058a747c),LL(0x20962d66,0x0214b10a),LL(0xda104e82,0xe594cae1),LL(0xb4693d32,0xf837609c),LL(0x059d3bb7,0x53eda7c5),LL(0x1dd16cae,0x3eb60275),LL(0xc67ede2a,0xd46da07a),L_(0x0000013a), LL(0xc838202c,0x35c208ae),LL(0xb2fb2035,0x56079145),LL(0x55be9713,0x95c814d4),LL(0xfd8f0bb3,0xc09f6782),LL(0xcc755426,0x8edafadb),LL(0x4ecf0b74,0xeaf4bc3a),LL(0x553943ed,0xa2bff049),LL(0xe542c407,0x3628a57e),L_(0x00000189),
+ LL(0x0d581933,0xc0bba438),LL(0x9ddc3e72,0xbc54c3a8),LL(0x1bbc6d0f,0xf2cdd63a),LL(0x1518f660,0xaf2f62bf),LL(0x27e5bf5f,0xbfe7727a),LL(0x7b164682,0xa33defeb),LL(0x40ec257d,0x6132b5ef),LL(0x902b2e89,0xcef96a0e),L_(0x000000ed), LL(0xe3ab4683,0x69a88271),LL(0x8299824e,0x4545479e),LL(0x373761e0,0x397121a7),LL(0xe3b1f753,0x0aaebe93),LL(0xd463acb4,0x1af707da),LL(0x1d6dcb72,0x14e15233),LL(0x48e5280c,0x91655530),LL(0xaaad009d,0xa49c7612),L_(0x0000010e),
+ LL(0x9792b39f,0xcfd79768),LL(0xc556dfa7,0xf279c07e),LL(0xd7670e8c,0xdad1cf40),LL(0x5e04abde,0x90b1377b),LL(0x46fcc199,0xf5067ad9),LL(0x6a088572,0x28101c96),LL(0x2ad58aca,0x43b5e33c),LL(0xe333e24c,0x9c51feb0),L_(0x0000012c), LL(0x54f0361a,0xf79463ef),LL(0xc22ce2dc,0xdd053538),LL(0x4e6817ca,0x2bc1013b),LL(0x4b01a6e1,0x844a6eb4),LL(0xad109d85,0xbfdaef54),LL(0x4481b985,0x6830be54),LL(0x297f121f,0x8bfd8dd0),LL(0x6d0b67a6,0xb59137cb),L_(0x0000008e),
+ LL(0x45ba65ed,0x45dcbcdc),LL(0xdd83e268,0x0a0b1cdd),LL(0x63968b4f,0x35e092ea),LL(0x71e6e72d,0x3f1ddc4b),LL(0xa46c5ed0,0x5a166bbf),LL(0xb7c76efc,0x0de0b5f6),LL(0xc1387b79,0xb6445136),LL(0x8923450a,0x76670ba7),L_(0x000001c4), LL(0x99a85019,0x0cae44ea),LL(0x1e4af9c0,0xe5e17b63),LL(0x51c0dae8,0xee91c80d),LL(0x0c3cbe08,0xa4093612),LL(0xa23c8041,0x3446b0ed),LL(0xf215ada7,0x43d14026),LL(0x7813fb66,0xb26fbac3),LL(0x0031b68b,0x0bce8fc7),L_(0x00000080),
+ LL(0xe275ab90,0x45ee7e0e),LL(0x399f21e6,0x37b06a37),LL(0xe9bd12b1,0x96080496),LL(0xa5d50d58,0x05ba3f26),LL(0x7c1e3f37,0x1d4a0081),LL(0x4d39274a,0x2d00866a),LL(0x0317c40d,0x64f146bf),LL(0x2ec71ea0,0xc168124e),L_(0x0000002c), LL(0x933c199f,0x4f78f168),LL(0x3fb1362e,0xa194ad2a),LL(0x5259655c,0x5f408022),LL(0x5898f9da,0xd8a6c1bc),LL(0x7553edff,0x2793c479),LL(0xe26de20b,0x1ea73083),LL(0x533d9374,0xb2a2971a),LL(0x4fd22035,0xfeac60e5),L_(0x000000b8),
+ LL(0xf8f9d4de,0xdebb5987),LL(0xe3156400,0xd526ec09),LL(0xe0023f66,0x5578bd03),LL(0xd7d715cc,0x3099f2ae),LL(0x858cc9c0,0x4417ca0c),LL(0x2ea5506b,0x23b4df57),LL(0x7420ffbd,0xe0c5dc14),LL(0x99652bdf,0x4eb0a328),L_(0x00000134), LL(0x0d31987c,0x9461ad7d),LL(0xe6bbab25,0xc859a4a7),LL(0x3d2a289c,0x08730e2b),LL(0xbe629139,0xcf6e14e9),LL(0xc3904cf1,0xdab045a7),LL(0xacb2cca9,0x2a43de3e),LL(0xfa439f68,0xd4d82c3a),LL(0xd187ae70,0xd2291dec),L_(0x000001f1),
+ LL(0x5587b449,0xe293d334),LL(0x6f8ad12b,0x4ce4906c),LL(0x8d521bfa,0xb26a6693),LL(0xa914bdb3,0x9dc3e746),LL(0x3ae5f6e9,0xb0881c2e),LL(0xac2559db,0x9191a1b5),LL(0x72e53430,0xa6c6a97a),LL(0x07226ad4,0x10b02ddd),L_(0x000000f0), LL(0x3a39e249,0x419af206),LL(0xc72bc669,0x42122752),LL(0x9a44c7a3,0xc28aa7e1),LL(0x188ac573,0x14ec6b11),LL(0x09a3360e,0xc8624588),LL(0x3af7bc0b,0x41e19299),LL(0x42bd4817,0xa8d8d757),LL(0x8768555b,0x890766cd),L_(0x00000046),
+ LL(0xe3a45fe5,0x95591624),LL(0xaebe1b9d,0xa30f27ef),LL(0xcc5daccf,0xf894bab2),LL(0x753b9ddd,0x456446cc),LL(0xa2185cca,0xfed1e127),LL(0x12d28159,0x0339e65d),LL(0x698c68d1,0x1a9ca283),LL(0xe9c06f97,0x34810a87),L_(0x000000b7), LL(0xfa3c3bf1,0x0574a504),LL(0x1f37ca7f,0xdbe81703),LL(0xebc6693f,0x6a068b27),LL(0x9068b291,0x03b786c6),LL(0x3dcacbac,0x74d197dc),LL(0x5766087c,0x8dd304a2),LL(0x60b034d5,0x45cead24),LL(0x0eb18561,0x4cd9970a),L_(0x0000016e),
+ LL(0x247df0f3,0x5379241e),LL(0xe00bbfb5,0xad8e1bf2),LL(0x4971d453,0xffdae98c),LL(0x4dac08bb,0x43c392ba),LL(0x1094f61d,0x34435f45),LL(0x25c82ce3,0xc0379951),LL(0x86ddd573,0xbe3f91c8),LL(0xa4a47405,0x4ef0357c),L_(0x000000dc), LL(0xd140309f,0x7d5ffd2b),LL(0xb5c6fd08,0xf1092ec1),LL(0x3fef2aa9,0xb1d3ec33),LL(0x5486d81c,0x414b5e87),LL(0x09d0d988,0x7faa17ff),LL(0xd5d8f9a4,0xed9cefef),LL(0xa9baa755,0xcec21b69),LL(0xb4d04c7c,0xe8d2ccb0),L_(0x0000002c),
+ LL(0x705db89c,0x84f6bfda),LL(0xac8dec0a,0x7e47ba03),LL(0x11601ccd,0xa270c8be),LL(0x5c7ebbe6,0x6d1474f3),LL(0xf62ef9fc,0xe04a6269),LL(0xfb77f59b,0x9e393c86),LL(0x150112d3,0x5df9c04c),LL(0x64d1ef7d,0xda15f26b),L_(0x00000088), LL(0x4c8472a1,0xfafe59da),LL(0x41ca0a2b,0x2ad99761),LL(0x1e89c29e,0x4b041df1),LL(0xfe4fe5b6,0x8b8ac33a),LL(0xd36ab4d9,0xf8473963),LL(0x53e1a21e,0x75363c3b),LL(0x21c36ab1,0xe0592363),LL(0xe35ac3a5,0x17f59f21),L_(0x00000086),
+ LL(0xee1e4fba,0x2e463b38),LL(0xafc972de,0x1010af35),LL(0xbe876d0d,0x49188274),LL(0x060ac231,0xac345fe8),LL(0xb568289e,0xe6dec43c),LL(0x9e9a1cec,0xc8cf61bd),LL(0xa7d9e863,0x4480624e),LL(0x84470564,0x5a220f0f),L_(0x00000086), LL(0x7730874b,0xb07f3f33),LL(0x5d9261b6,0x122fcc85),LL(0xe27f8557,0x06820d8c),LL(0x073c1847,0x82e3f6be),LL(0x3976550d,0x0e6c3609),LL(0x9a68ea2f,0xf48dbeee),LL(0x99ffba71,0xcc24a469),LL(0x3d0bdb6c,0xd7097568),L_(0x00000015),
+ LL(0x01e0bacb,0xfaf69acc),LL(0xde8618ba,0xc2f50b6a),LL(0x14a7dc8c,0x255c91c8),LL(0x2f3c4d3d,0x3e41e3ed),LL(0xb39008da,0x3885fe89),LL(0xe57622e4,0x0199693a),LL(0x4d2436d5,0x8a6ba080),LL(0xdafeb6e6,0x14dd5c23),L_(0x00000122), LL(0x2580e973,0x8519d427),LL(0xa920070b,0x0b67d6f2),LL(0x90fc96fb,0x14566ecc),LL(0x25c7716a,0x30c1cfb5),LL(0xb8dd507a,0xd8b7f726),LL(0xa175dc05,0x24a60ede),LL(0x99f15332,0x78236bba),LL(0x7ca4a569,0x3707415f),L_(0x000000be),
+ LL(0x1e3479cf,0xdd8491ad),LL(0xd79c5592,0xcd2995f5),LL(0x8ece5732,0x7f9162e1),LL(0x7f928933,0xff64a3a5),LL(0xdd90d4ea,0x82a7e6d8),LL(0xd296e0f0,0x8dc81d30),LL(0xf317ef62,0xa5bbd68c),LL(0xc3c72a97,0x0373debd),L_(0x00000092), LL(0x8de59597,0xbad8e310),LL(0xe46b5cc5,0xae543536),LL(0x3be10fe7,0xb038a518),LL(0x22e5dfa8,0x98fc1a73),LL(0xda531be8,0x4395fad8),LL(0xa64d7d12,0x81e9b112),LL(0x5b7b8eee,0x6b371c5e),LL(0xf97cc8db,0x53a14472),L_(0x00000087),
+ LL(0xeddf9eed,0xac48ddad),LL(0x3fafda2a,0xb0386572),LL(0xe2cfe37f,0x4a95ae1d),LL(0x2a2d6f2e,0xf0b70c4d),LL(0x5539faa3,0x1e2738ed),LL(0x855ae2b7,0x680d7df5),LL(0x5fa4d703,0x047f7d72),LL(0x981799eb,0xbfdef3a0),L_(0x00000158), LL(0xefb32d4e,0x14e1364c),LL(0x0008de76,0x2af04490),LL(0x56298a56,0xa488b32b),LL(0xe10ef61b,0x7c93d9c0),LL(0x74302f60,0xe50aeca3),LL(0x40b43584,0x7cf8baf8),LL(0xb9ab8a52,0x29e97768),LL(0xf0c44bc5,0xe545b8b0),L_(0x00000193),
+ LL(0xc7ebaeb9,0x9166afc8),LL(0x8df096c4,0xb1a4fb9f),LL(0x9ef63e0b,0x0a63a275),LL(0xd0e62d1d,0xa13c16de),LL(0xf215cb79,0x82d5b46e),LL(0x45439424,0x5cf39033),LL(0xc9b239aa,0x4a39ce21),LL(0xfcf03ed3,0xdf9660a2),L_(0x0000004c), LL(0xd8466a8a,0x523be0b6),LL(0x493a7775,0x74759167),LL(0x4894bb12,0x5e2284c6),LL(0x864e9ca2,0xd07d26e2),LL(0x08b7f98f,0x6d662061),LL(0x8e1e3fdb,0xf64b5a66),LL(0xa0ba6cae,0xedd31c44),LL(0xdac14a11,0xa2fe1891),L_(0x000001be),
+},
+/* digit=93 base_pwr=2^465 */
+{
+ LL(0xd37e005c,0x6d99c24d),LL(0x9fa0210b,0x813da140),LL(0xd53cbcd5,0x9488bf13),LL(0xb6d8655f,0x5b2d055b),LL(0xb21f224e,0x3ba305b4),LL(0x059a77dd,0x5337f568),LL(0x783aa9f0,0xb88b4b1e),LL(0xe8c56442,0x5f00bd6c),L_(0x000000b6), LL(0x9b7e0acb,0xe0e90fde),LL(0xda1867f2,0x336f8ff1),LL(0x14e3d072,0x8e647516),LL(0x87e51c7e,0x1ca72a31),LL(0x27ef1710,0x61c42d89),LL(0x641d8a97,0xbb69cc0c),LL(0x6138250e,0xc12903e9),LL(0xd2873a54,0xe47626b8),L_(0x000000e3),
+ LL(0x0523f47f,0x1fe7219c),LL(0x11a49ec5,0xbd8a88f4),LL(0x6713e8b2,0xd3f30897),LL(0xe0f84892,0x410c616e),LL(0x4957e9fa,0x60b01558),LL(0xfce0903d,0x41fc07f1),LL(0x82117eff,0x3ffa3ce1),LL(0xb039b569,0x82bc2654),L_(0x0000000c), LL(0x04f700d5,0x693fd9aa),LL(0xa0743bcc,0xb8b0e7fe),LL(0x81c35812,0xfcb182c1),LL(0x64896cc8,0x9f019f88),LL(0x8c77cf49,0xa6594c50),LL(0x2c4110bb,0x88406e14),LL(0x0fcaee7e,0xb8b45fd5),LL(0x4dc1ba3e,0x1ad10989),L_(0x00000138),
+ LL(0x07c446c4,0x0878421c),LL(0xf275544a,0x8722c55c),LL(0x424a48fb,0x028ec763),LL(0xf6b5b3b9,0xca8f7bf4),LL(0xf78d4fe3,0x77d82e20),LL(0x04e23f42,0xbc6300a7),LL(0xf5f71bbf,0x3aa908b8),LL(0x0bc8e8a5,0xde191b09),L_(0x000000fd), LL(0xd0dcad65,0x35d31de3),LL(0xe5fbc4e6,0x9ac9c9da),LL(0x525deba7,0x0b85d812),LL(0x465a1ffb,0x08542228),LL(0xc039c002,0x1962a343),LL(0x60c9d143,0x729577d4),LL(0x0fe4b631,0x05befcdb),LL(0x25528067,0xf91b4f98),L_(0x00000093),
+ LL(0xbc7bb607,0x894887a4),LL(0x14230e0a,0x6eb1e976),LL(0xe2c653f8,0xe9303e71),LL(0xdded494b,0x9fc0dd96),LL(0x98ac95d0,0x63fba061),LL(0x738abea5,0xf3c1624d),LL(0x4a0ea988,0x389df64d),LL(0xc6ae1823,0x2d8511d5),L_(0x000001d1), LL(0x7feeeb90,0x7d7a8b0a),LL(0xde36c637,0xa9c345a7),LL(0x611067e9,0x0a9100d5),LL(0x6bcdcedd,0xf6c68c80),LL(0x92b5dec6,0x8d7d4a34),LL(0xad3651f3,0x2d5061b9),LL(0xf739c0f2,0xd15c9ea7),LL(0x34e6cedb,0xa8a2dee7),L_(0x00000008),
+ LL(0x5ef9ab41,0xda8a106f),LL(0x3b8cfab2,0xb72948ff),LL(0x3a4d0cd5,0xf95a1457),LL(0x5f6b94ff,0xa636c12b),LL(0x4c711bcc,0x1e6c9e9f),LL(0xffdba7aa,0xe7eacce4),LL(0xfce23073,0x8fbc9275),LL(0x5935eb69,0xb6675659),L_(0x00000198), LL(0x05d931ae,0x918b9aff),LL(0x1f8a1b79,0x844b544c),LL(0xaa1709c8,0x7e08066d),LL(0x5258c624,0xb640f1c6),LL(0x176bbba4,0xa22bddd0),LL(0xc24ede16,0xd090e0e9),LL(0x4685aca4,0xd8b8736b),LL(0x64e8e6dc,0xa9cb10f2),L_(0x00000001),
+ LL(0x35476aba,0x78928ff0),LL(0xd948696e,0x989109f6),LL(0x5f254f30,0x44ed9a63),LL(0xd3543664,0xa497e106),LL(0xec63e4f7,0x54a3d56c),LL(0x4cb1418d,0xbfbcd507),LL(0x2a5c778f,0x548f00b1),LL(0x3ba6c12a,0xabe2e750),L_(0x000001b3), LL(0x4db14381,0xc2817a38),LL(0x86547af0,0xb6947c7e),LL(0x6d9e6104,0x70ddd5de),LL(0x2c369c27,0x2f6e17ee),LL(0x04550b40,0x2c52689a),LL(0xb0ead30b,0x3892ae0d),LL(0x99d74e20,0x145321b6),LL(0xd38ac454,0x69273a68),L_(0x000001dd),
+ LL(0x9a014b31,0x2b898264),LL(0x9e8130d3,0x12fa12a6),LL(0x014372da,0x94999852),LL(0x86eb5c63,0x2a214084),LL(0xdfb3f74b,0x889d0eaf),LL(0x9c182b54,0x4f4c24a5),LL(0x023efe1f,0x0c3bbe75),LL(0x3089629d,0xf6118b2f),L_(0x0000007f), LL(0xdbfd5856,0x138e9e46),LL(0x49f8b60f,0x8855a365),LL(0x00624aa1,0x358ac67f),LL(0xff0d2d03,0xd4f8c970),LL(0xb9b15a4c,0x244d4dda),LL(0x60864d2f,0x7db18004),LL(0x1d1483da,0xd00cd704),LL(0xfbce4196,0x50e134b0),L_(0x000000ed),
+ LL(0x0feb0501,0xca55bd42),LL(0x8695f9af,0x9c3c71fd),LL(0xcc6e5ed1,0x3d500caf),LL(0x8edc89ca,0x4e21b872),LL(0x77647185,0x0ff872ac),LL(0xee45201f,0xe23036d8),LL(0xc8bee8b3,0x5f2c13f7),LL(0xa1d51a1e,0x6b556707),L_(0x00000079), LL(0x8022b011,0x529ed8e2),LL(0x2b6ff0cf,0xb8a477a5),LL(0x3b6e8238,0xcf5cd2f6),LL(0x291c55c9,0x42ab247c),LL(0x3f4796ab,0x9f93937b),LL(0x5dbfc098,0xca7b47aa),LL(0x7620e79b,0x296f0a6b),LL(0xdd4ea007,0xd0a64f58),L_(0x0000017e),
+ LL(0xf01a2f06,0x96bedf48),LL(0x7e8f7f41,0xd452fc32),LL(0xcfab9384,0xf1693df4),LL(0x57e90144,0xde828634),LL(0xf5773fb8,0xf8ca5704),LL(0x123913d5,0x2119d8cb),LL(0x7eb6dfc1,0xfdf9f63e),LL(0x3c675fe5,0x2438100b),L_(0x0000004c), LL(0x1f4969fc,0x18608a42),LL(0x92fc7ae8,0x270c4cd5),LL(0xf9035119,0xd6e64853),LL(0xc4832b26,0x6b21d3fa),LL(0xa4c2c4c7,0x726b2dcb),LL(0x725c739d,0xb649408c),LL(0xcaaec71e,0xa0b38b9c),LL(0x5b557fb0,0xfcd2a17b),L_(0x000000c7),
+ LL(0xffa160b7,0x6ed5bb92),LL(0xd76d4830,0x174db5f3),LL(0x56439bbf,0x9cf210a6),LL(0xcf76e11e,0x0a183944),LL(0xb1458e01,0xa3ae6e4a),LL(0x034db573,0xc26a236a),LL(0xe322c7d5,0x3184159a),LL(0xef56cb0f,0x838dfaf3),L_(0x0000005a), LL(0x83bf41c6,0xc9df776e),LL(0x9cd9b688,0x5709e999),LL(0xec730800,0x9d5ce348),LL(0x9c9f3378,0xa53d30c8),LL(0xdcaf4c9c,0x09b66b9c),LL(0xb8aeaba1,0xc4d0530f),LL(0xea0f22f3,0x73581f25),LL(0xc1d28f6a,0x26a42f5a),L_(0x00000014),
+ LL(0x47e984e8,0x20c4ae50),LL(0xd1b90de4,0xc94af252),LL(0xdf5adf83,0x41b573a2),LL(0xb6b25c5d,0x003e17b9),LL(0x47e2aa64,0x600d2bda),LL(0xf75489f9,0x595799ce),LL(0x1b49400e,0x7a9784ae),LL(0xba0298f7,0xef02429f),L_(0x0000019e), LL(0xc18830c9,0xc0e76415),LL(0xb7a4b3e7,0x46646194),LL(0x210e39ff,0x46e16ac1),LL(0x94dd48b0,0xe09df941),LL(0x5657d728,0x75b23925),LL(0x987d7dae,0xf5484304),LL(0xb8bad70f,0xee4753cb),LL(0xc44a0313,0xfec01e5e),L_(0x00000078),
+ LL(0x301bb718,0x3ba3b59e),LL(0x7ed618c3,0x2225703f),LL(0xe6e7b1ec,0x3d9b8d85),LL(0x2ddd2443,0x526b020e),LL(0xbbb89c6b,0xf99d3527),LL(0x9694dbcf,0x1bef732e),LL(0x34415736,0x42d5d4d5),LL(0x5cdafabf,0xc0922340),L_(0x0000011a), LL(0x3da6214f,0x2ffdc730),LL(0x3a1a49d4,0xc640e584),LL(0x9755bbcb,0xd90466dd),LL(0x6a1bb6be,0xcc97293e),LL(0xd094e422,0x23c9d622),LL(0xf2ec9cc4,0xcc616321),LL(0xafe8382a,0xc1a93af5),LL(0x26522de8,0xe7ded64e),L_(0x000001a2),
+ LL(0x73e6acc5,0x9117f654),LL(0xea525fd4,0xd6399efb),LL(0x5316271b,0xbf78249c),LL(0xe30685a3,0x7737d7b2),LL(0xb95bf177,0x4cfca353),LL(0x138bd305,0xa3671bc7),LL(0x088b1877,0x110ae487),LL(0x1ff3771d,0x6f5bb6fd),L_(0x000001b9), LL(0xaf501744,0x732576c6),LL(0x4a538a56,0xdfe16416),LL(0xf3e1aa2e,0xfe886ca1),LL(0x95495af6,0xfad421b0),LL(0x2e5633e8,0x14deea0f),LL(0x87a33bf0,0x59e08514),LL(0x7333d917,0x92bad09b),LL(0x773222e4,0x810dcfd4),L_(0x00000014),
+ LL(0x3565ca51,0x0fd12235),LL(0x5d3c8d16,0xdc033287),LL(0x948d4bd6,0xd175dce3),LL(0x9d5a6616,0xd08718eb),LL(0x4afce525,0xd0bbb22a),LL(0x9107b243,0x93527f91),LL(0x45382cdd,0x6c46b7fb),LL(0x8d893d42,0xe82dc58d),L_(0x000001b3), LL(0xbddfc4e9,0x1d8f3a25),LL(0x1c16029a,0x51ce74f6),LL(0x0f857730,0x72d22f72),LL(0x9d6f7b83,0xa805ac0c),LL(0xf970cb65,0x6193a324),LL(0xef9afdbc,0x579b13d8),LL(0x29a49024,0x2ea3de42),LL(0x4d4f92d1,0x20c20f67),L_(0x000001ef),
+ LL(0x3687601b,0x61173b64),LL(0x19ad59c7,0x5cdaa0ac),LL(0x37e94d1c,0xb01a110c),LL(0x46a8a192,0xb73fb28d),LL(0x89ea578e,0x32a829b7),LL(0xc1c111ef,0x73a214d8),LL(0x1c8ded15,0x1cfef495),LL(0xbf036574,0x6f08a7dd),L_(0x000000d1), LL(0xde40c899,0x451757da),LL(0x9bdf62c8,0xde505c58),LL(0xf590c16c,0x0833d1ea),LL(0x4f878ef4,0xc9e82fbb),LL(0x8ef0ccb2,0x87ab08dc),LL(0x1d1f4efd,0x115ad9da),LL(0x4e21d1ff,0xd549cc87),LL(0x88e6e9e7,0xcd93e9dd),L_(0x000000f3),
+ LL(0x424f87aa,0xffc3ba23),LL(0x162b1fab,0xa3b2b167),LL(0xb86c7978,0x83e73da5),LL(0x9b5f991d,0x8d484c76),LL(0x2cb3d908,0xe085b439),LL(0x28064542,0xeba2ea8f),LL(0x2b91d2b4,0xcdc46cb8),LL(0xe83321f8,0x9d43a8c0),L_(0x00000193), LL(0xfd97601a,0x4a0c50df),LL(0x305e99ef,0xfc4b8056),LL(0xa29f6e86,0xf5b0c1c8),LL(0xbe1babed,0x558d2cd4),LL(0x75e98d4d,0xd17d7bc8),LL(0x45e57fd7,0x9a0a33b7),LL(0xc3cf9b60,0x2d8c2a2b),LL(0x5277b76d,0x6284d623),L_(0x0000013a),
+},
+/* digit=94 base_pwr=2^470 */
+{
+ LL(0x3e614e7a,0x1806f150),LL(0x0773591b,0xc937295d),LL(0xb432690c,0x6d3468f3),LL(0x7af2bc37,0xc765b502),LL(0xf1568b1f,0x4508081c),LL(0x4f2d04c8,0x3b08d2fa),LL(0x0d438419,0xfdaa2353),LL(0xd4118eb0,0x68f3eedd),L_(0x000000c5), LL(0x7395d916,0x879c30fb),LL(0x732a652f,0x33e906c3),LL(0xd707078b,0xeb09ecd6),LL(0x4fe7914f,0x76e24476),LL(0xf1644295,0x1ef70830),LL(0x90ff7060,0x8d1a94c2),LL(0x8e38b393,0x347e067e),LL(0x7b7a7e79,0x97efc04d),L_(0x0000014e),
+ LL(0x7e61fdc0,0xe59da03f),LL(0x98bd359f,0x51831e76),LL(0xf982fb68,0x4079f81d),LL(0x64253ce4,0xffbd0a1c),LL(0x684a0c0f,0x24ab0837),LL(0x0fa3fd27,0xaefd7b90),LL(0x8cd54b9a,0x4f017be0),LL(0x39893203,0xf8268359),L_(0x00000163), LL(0x5f8bfed5,0xbd73f12c),LL(0xbd9b46e5,0x7574722c),LL(0x672fc532,0x95b789de),LL(0x9d4c5de7,0x313e84cf),LL(0x48e00647,0x002f1934),LL(0xdda401e2,0x649a15d6),LL(0x96114ef7,0x37a4f04c),LL(0x4a9dc085,0x66b1bac3),L_(0x000000e3),
+ LL(0x8f0a82c0,0x87ae4c3b),LL(0x74f004b6,0x384b1146),LL(0xce02e119,0xd665e4e4),LL(0x1859c7a2,0xe5dbd5ec),LL(0xadfa269c,0xa30b0013),LL(0x74ac1d2b,0xb4b5ebac),LL(0xbc73c88d,0xacdb48e2),LL(0x872a2a2e,0x2e41ca61),L_(0x000001e4), LL(0x1044c064,0x1021647f),LL(0x3c4c4561,0x05bc197e),LL(0x8aef2b50,0xdd7066b6),LL(0x53c751b1,0x10e7a8e7),LL(0x3b7ee577,0x2667f737),LL(0xee8825eb,0xd2baf066),LL(0x2e6cd49a,0xfaed0dee),LL(0x4bbbae5e,0xe1b0bac0),L_(0x0000010a),
+ LL(0x755e5ed4,0x7eafbd5d),LL(0x22817dc2,0x8274c8f2),LL(0x6ed11c56,0xa0be4b95),LL(0xc506cd96,0xfca3c62a),LL(0x6c56121c,0x160f6437),LL(0x94e1e3c5,0xcd969d97),LL(0x2a1b9ac1,0x6a2818ba),LL(0x5d12cb94,0xe5f11bbd),L_(0x000001d4), LL(0x67065269,0x6eaf2423),LL(0x2f4afa25,0x74390891),LL(0x2342e954,0xec048d33),LL(0x5565f855,0x3a8816f7),LL(0x8e4ec59a,0x55b015d4),LL(0x6a715052,0xbf898ef0),LL(0x385313b6,0x8baf90ae),LL(0x415dc868,0x1f03f1d5),L_(0x00000107),
+ LL(0x117822b3,0x37c2f26e),LL(0x4762f6de,0x9377e35f),LL(0xfb62c99f,0x3c9faf6d),LL(0xa5fec0c5,0xe6f2602d),LL(0x6a84d794,0x1e2e5844),LL(0x2e9c376a,0x2b97dfd3),LL(0xcdd28547,0x24977fdb),LL(0x3efe1f48,0xf8cc4189),L_(0x0000016a), LL(0xd2462621,0x19582902),LL(0x6e455352,0x638d59c6),LL(0xc3bea880,0xd74f8133),LL(0x1df686ac,0xae8224be),LL(0xdefcc095,0x467de606),LL(0xc63376c6,0x1bbcfb09),LL(0x644acbfc,0xe6c4cc04),LL(0xce83b441,0x82fa0126),L_(0x00000051),
+ LL(0x27486dd1,0x6bd544fa),LL(0xc8ec4c55,0xc9e28c7b),LL(0xa7531516,0x22d696c9),LL(0xfbb565f5,0x5bc69de8),LL(0xf4a6f6f5,0x3c4607fb),LL(0x2183944a,0xfbf34142),LL(0xc088d4ca,0x6a6a25a0),LL(0xebf86497,0xb4a0b6be),L_(0x00000005), LL(0x08805ee9,0xe10f4906),LL(0xb9740059,0x2a74e9d7),LL(0x72ae3ee2,0x2294188b),LL(0x0359108b,0xffa569a8),LL(0x5438b3ae,0xf5a918ef),LL(0x5b1543c1,0xbe32cd1e),LL(0x857bce3b,0xf67721ef),LL(0xcb0f4756,0x59125f37),L_(0x0000002f),
+ LL(0x7f863db9,0xb81bcc90),LL(0xc94e7e86,0x24d3e88a),LL(0x59ad89c4,0xf5ed10e7),LL(0xce7d1f0e,0x1bd7de70),LL(0x6932d3ed,0xf1561272),LL(0x12569b60,0x393d97a6),LL(0xf0741124,0xa46a9516),LL(0xc9b5b179,0xabb12b30),L_(0x000000b7), LL(0xda1e1906,0x6ff9aa73),LL(0x64a918f8,0x1673d460),LL(0xf233bf04,0xe548f086),LL(0x4ac69dac,0xb984ce8a),LL(0x12e45aea,0x294fb6e3),LL(0x5a19d674,0xd8993346),LL(0x00bc5dd3,0x0c254d86),LL(0x90107b13,0xce4ef414),L_(0x000001d0),
+ LL(0xec115486,0xb08c738e),LL(0x93e59803,0x23024435),LL(0x4f00e934,0xbdbe60eb),LL(0x7c91438e,0x23e859e5),LL(0x580e89c5,0xba0053e0),LL(0xb329d75c,0xd11317c9),LL(0x3d389550,0xd235e570),LL(0x5aac6426,0xde574384),L_(0x000001be), LL(0x42349105,0x21c69e6c),LL(0x9a81de9b,0xf70eb151),LL(0x2990539b,0xafc827ae),LL(0xfe9bf0bb,0xee9dd548),LL(0xb8dbb3c1,0x8c4d4274),LL(0xf3be2a90,0xb7224476),LL(0x6e6842bc,0x8428346b),LL(0x39da0c73,0x0d7293ad),L_(0x000001f4),
+ LL(0xdaa88388,0xe569ed69),LL(0x7f0f1377,0x60762027),LL(0x2fe1fac0,0xa5dd03fe),LL(0x91b1f27a,0xb60b2ae5),LL(0xc4161046,0x0c72417b),LL(0xf9d8850d,0x16e6bfc4),LL(0xa63fb7e8,0x1c03a1ed),LL(0x8baa08f0,0xbb67277d),L_(0x0000015e), LL(0xba237ffd,0x7b0680d7),LL(0x0d439e05,0x64dd0307),LL(0x5d17a507,0xded7a46c),LL(0xaa6f686f,0x46bc0763),LL(0x302e95a9,0x16dd6fb8),LL(0x32a15017,0xd01bdd13),LL(0x4b4868e4,0xe250803d),LL(0x1558017b,0x131aad68),L_(0x0000015f),
+ LL(0x275e8267,0xb1b59985),LL(0x6c0a68a7,0x44944a18),LL(0x537ca1e2,0xd9ed65ad),LL(0x30e1107c,0x1eddede3),LL(0x802fb267,0xeaf5fb68),LL(0x27195ee0,0xd0137c18),LL(0x11b69677,0x331a8cb2),LL(0xab2ade03,0xf409e347),L_(0x0000018c), LL(0x0449d382,0x0033feb4),LL(0x9c7c44c6,0xb2576dae),LL(0x83e4fe6e,0xde49f678),LL(0x8e0a0c88,0x049a1944),LL(0x873f101a,0x2f0dcfaf),LL(0x0c6ecf9c,0xf4b7cbf4),LL(0xb8b0d918,0x5cf46641),LL(0xd2760eea,0x5cfa2282),L_(0x0000010e),
+ LL(0x8ae1b4af,0x5fa3cb57),LL(0xd120dbcb,0x79a8d192),LL(0xec8bbea1,0x8ab00e0a),LL(0x0fa43f9b,0x8da0324e),LL(0x320ae51d,0x53f9b52f),LL(0xd7d8355e,0x28f25abd),LL(0x800a5d6c,0xce8c317a),LL(0x8116a102,0x946d8424),L_(0x000001b6), LL(0x5e187817,0xdc1f3bba),LL(0x3d0941a2,0x42b1a905),LL(0xa2a2cc7f,0x7392c3e9),LL(0xc8a2218b,0xf81e4937),LL(0x50e22321,0xec9f9e7e),LL(0x650f7010,0x905ed136),LL(0xce7ae424,0x143d78dd),LL(0xf4b39b10,0x3a003ade),L_(0x000000a7),
+ LL(0xeaa9a342,0x15bb7a90),LL(0x26771654,0xdcc6aa0c),LL(0xc720264a,0x986a1f0b),LL(0xe93f7bc1,0xa182f9b5),LL(0x1bf6b3fc,0x5c22f84c),LL(0x14eb9a7b,0x7bdec7ad),LL(0x42c3b078,0x108902c9),LL(0xd7973e78,0x00f62a69),L_(0x000001f4), LL(0x20230ff4,0x64b88212),LL(0x8928dd30,0xd730a522),LL(0xc0f54e1a,0x528ea087),LL(0xbe8035de,0x2188b80a),LL(0x1d9e98d6,0x12fe3f39),LL(0xc4b4d85f,0x5d1c13b3),LL(0x0436d0a9,0x02c9a494),LL(0xcc5f2436,0xecc057d2),L_(0x0000008c),
+ LL(0xfa9544c4,0x3a3c6860),LL(0xc43438df,0x7ba2b50e),LL(0x8cfb61b2,0x160b337f),LL(0x177729b0,0xccab10b1),LL(0x69458502,0xb9a0ff5a),LL(0x78449ba9,0x67ca5074),LL(0xa879a311,0x73b77e61),LL(0x91f5cf0f,0xd1a80319),L_(0x00000179), LL(0xe9dd38a6,0x7f1ab441),LL(0xdb97e39f,0x8836c427),LL(0x0e31501d,0x26be55f8),LL(0x88c80de0,0xf094f5db),LL(0x161288e2,0x239cdfc2),LL(0xb27ca6c4,0x6d31f6e4),LL(0xbff28243,0x6db05886),LL(0xadc659a4,0xc60476f4),L_(0x0000014c),
+ LL(0xbc76d262,0x3a81dc1b),LL(0x1f94ed62,0xb5ab7c11),LL(0xcb89fed9,0x7bd8c4df),LL(0xf48a8846,0xc61ecacd),LL(0xe68265b3,0x88e6ef63),LL(0xfbdfdb92,0x8bd95324),LL(0x94692afd,0xb7f81080),LL(0x8b73dbb0,0x78ac33a3),L_(0x0000008d), LL(0xed59ec62,0xe2c2f288),LL(0x6fafd323,0x11cda8bd),LL(0x6af36bba,0x324f4f07),LL(0x06098acb,0x091a65fb),LL(0x74b50485,0xf28dae6c),LL(0x93e109e7,0x1a6b91b6),LL(0x648a962a,0xba4a27c8),LL(0x4dfe3efb,0xe4e08cac),L_(0x00000085),
+ LL(0xf43286a4,0x56196c6d),LL(0x6ba6cc59,0xec8e64cd),LL(0x7bd6708a,0x98aaa1d7),LL(0xb45c7cd9,0xb5bcc0ce),LL(0xce3eb2eb,0x2653d9af),LL(0x5b7387d0,0xf3afdf31),LL(0xe27833cf,0x17806f1f),LL(0x3ec743c7,0x911d2144),L_(0x00000076), LL(0x96863b2d,0xf200831e),LL(0x1d6c065f,0x1613e78e),LL(0xa1366e05,0xee600a0a),LL(0xc0223e24,0x06065867),LL(0xe94c7976,0x81ff94bd),LL(0xf203aa4b,0xf9511ac2),LL(0xb7c19e3c,0xd9eef849),LL(0x75211256,0x2d34cf53),L_(0x000000bd),
+ LL(0x5cc484e2,0x446b62d8),LL(0x1d84ce14,0x9c0fff45),LL(0x08f1ae70,0xe53a49ca),LL(0x71899e1a,0x9917f93d),LL(0x3709a90d,0x12fbb050),LL(0x045ef39b,0x38af72a2),LL(0x0b8cc9a0,0xf0817cd9),LL(0x52b4ed83,0x1ac352f3),L_(0x000000e1), LL(0xa7a71d48,0x44e50d53),LL(0x67e7ad87,0x192ec226),LL(0x37867d3b,0xce32e194),LL(0x24825f0c,0xfce90271),LL(0x5aa41f07,0x4b826212),LL(0xc9cefc67,0x1f602e03),LL(0xc071ae6d,0xf9f93cc0),LL(0xe4c52cae,0x047df3fa),L_(0x0000015c),
+},
+/* digit=95 base_pwr=2^475 */
+{
+ LL(0xebcc18c3,0xf6385f12),LL(0x8caf536b,0x8a0c24ba),LL(0xd83891ca,0x08b3093c),LL(0xb8c37621,0xb26a0ef5),LL(0xb41e3399,0xca8c426d),LL(0x0263fadf,0x173bf676),LL(0xd40bf584,0xd8a6677a),LL(0xa4760acd,0xee7734ec),L_(0x000000b0), LL(0xfbc42b8b,0x5a60d34e),LL(0x678686dc,0xa367e08d),LL(0x3e942c85,0x2dd8cead),LL(0x9d289bdc,0xa6d1bb40),LL(0xa4b034c3,0x04955940),LL(0x4e438893,0x0034f368),LL(0xddeee0c8,0x63808a7c),LL(0x8f3d9aa2,0x0ff42114),L_(0x00000084),
+ LL(0x3ddf4a3f,0x7d84daca),LL(0x17e3e628,0xd7eaf570),LL(0x4870b354,0x9fed1a4e),LL(0x26a3e3ca,0x5710e04c),LL(0x0ce1ea5e,0x17a2ff92),LL(0xee67709e,0xf8a3bc06),LL(0xc019a660,0xdb788ab8),LL(0x3d909c0f,0xc37576f4),L_(0x000001a7), LL(0x51c0c61e,0xc130704b),LL(0x5d086395,0x762ffbcb),LL(0xf6639983,0x337f660b),LL(0x46d9fb03,0x8fa37c16),LL(0x865cf06a,0x3f14b6d2),LL(0xe7365f2e,0x8227d360),LL(0xc5c3e588,0xb6a48fcd),LL(0x8c2eaf07,0xb4b8759e),L_(0x000001d7),
+ LL(0x226084ff,0xaf5d90f5),LL(0xe8626b6c,0xa900e635),LL(0x22c0e157,0x22e31c96),LL(0x1a4ad1af,0x9e88afb5),LL(0x3aadc5f1,0xff5f6050),LL(0xb11e90fa,0xc0677ea3),LL(0xf77875e2,0xaed6a977),LL(0x841145e6,0xf6cc19e8),L_(0x0000007c), LL(0x6bb84d1a,0xbfc80743),LL(0xf386ce67,0xb28c1dbb),LL(0x43c48ae6,0x88b71460),LL(0xf88870e8,0x4e3895ad),LL(0x71c30d54,0xcdbb1a28),LL(0xa8e29d09,0x71499052),LL(0x6fbd1362,0x3608395e),LL(0x9cdda95f,0xfe603cb2),L_(0x000000b0),
+ LL(0xb01ce2b5,0x9f8c4d01),LL(0xf417d7e3,0x78d34284),LL(0xcbf04214,0xf59d157a),LL(0xc4238071,0xf8a594c0),LL(0x7b0a1e05,0xbaf85cdc),LL(0xc9cfd81b,0x1d1329e8),LL(0xc9be4f2d,0x3168fc55),LL(0x5c20884e,0xb8a1a29b),L_(0x000001e5), LL(0x6e9fd410,0x96d54227),LL(0x16c1621d,0xd61e57db),LL(0x8656adf3,0x2da52da5),LL(0xd546ecce,0x2098e089),LL(0xb41508ee,0x7499c874),LL(0x9cf31199,0xf525839d),LL(0x96548966,0xa0de08e5),LL(0x1cdd85c0,0x68e4ee51),L_(0x00000139),
+ LL(0xb8ede8af,0xa3de8360),LL(0xfdee27bf,0x4341bdb3),LL(0x376db3df,0x851382eb),LL(0x309206d9,0x6325d433),LL(0xff416946,0x8994d6c3),LL(0x0e775cfd,0xfe50149c),LL(0xee627cff,0xee7b578d),LL(0xcd01235e,0xc20d885b),L_(0x000000f7), LL(0x5a46c19a,0xeec8d37d),LL(0xab92e082,0xa6ae3bae),LL(0x2deb57b4,0xe3c4d075),LL(0xce5d2ec0,0x962e7d64),LL(0xbd42e96f,0xc56b57d5),LL(0x513d5228,0x68f2747e),LL(0x7ec6010d,0x1f92f153),LL(0x8ad259fb,0x7427d2ca),L_(0x00000180),
+ LL(0x1fdb1361,0x018344e5),LL(0x016f0192,0xcb8a7e81),LL(0x1ca2c27e,0xc36425ff),LL(0xa8df5318,0x56d5d247),LL(0x84872bcd,0xa2e0d261),LL(0x4866d142,0x83feb22e),LL(0x0999b14a,0xab13dac7),LL(0x07863be6,0x9b326ed0),L_(0x00000018), LL(0xce023bbb,0xf8f48d21),LL(0x35940e6e,0xea9c5f9c),LL(0x2bd76e0a,0xa1f9af53),LL(0x8ff97911,0x750c500f),LL(0xdefcff41,0x3985ad13),LL(0x9c027cfa,0x36812ef9),LL(0x34694b31,0x5d319ee5),LL(0x9722dca8,0x568cfb9d),L_(0x000001ac),
+ LL(0xa78cdc7b,0x67114f96),LL(0x1a506e84,0x909080ed),LL(0xe3ccc90c,0xe770488f),LL(0xe93a6e81,0x0b332add),LL(0x6e681e90,0x494adeb9),LL(0x13abbb36,0x580a5070),LL(0xbf271178,0xa19a151b),LL(0xebb4d25d,0xdeb384ae),L_(0x0000014d), LL(0x2353100e,0x4b162883),LL(0xf7cdd45e,0x57659fda),LL(0x4f79c844,0x95b94da4),LL(0x3ca165b0,0xa6d4f4d9),LL(0x3565f5c9,0xc13d6186),LL(0x288f561b,0x81efd295),LL(0x51b5a1dd,0x0dee47df),LL(0x0f774131,0x059ca05e),L_(0x00000104),
+ LL(0x8240d25b,0x6132b9fa),LL(0x74ec9502,0xddc2ef3e),LL(0xa9db4e16,0x29d151b0),LL(0x5ad95c14,0x9bb57bff),LL(0x08144cde,0xf2a19e48),LL(0xef980c02,0x655b0b6a),LL(0x1f2df6c5,0x2138725b),LL(0x346457ed,0x99246672),L_(0x00000158), LL(0x8e3077ff,0x2804b9bb),LL(0x8db75e68,0xb8a3a732),LL(0x0cb1bbec,0xb587b6f5),LL(0x823e8549,0xe705757a),LL(0xdd7be7a7,0xb60b8617),LL(0x23677103,0x131d7bc3),LL(0x128ac224,0x03713f91),LL(0xadb3b9bf,0x57a300de),L_(0x000001c2),
+ LL(0x625c8b6a,0x8fc09173),LL(0x14eb1426,0xbb0b06c4),LL(0xd925dd0a,0x28f4f79f),LL(0x5a160baf,0x6a240ffc),LL(0x4f7c033a,0xcb7f6751),LL(0x98adaaee,0xc349dd94),LL(0x192aa587,0xee546461),LL(0x189c51b1,0x17d09607),L_(0x00000034), LL(0x46d637ca,0xaa3d1efa),LL(0x01cfe315,0xf7d6f7f9),LL(0x4164c61b,0x64b9530e),LL(0x1a339a05,0xce33c2f5),LL(0xc30d67f4,0xbcb863c9),LL(0x79f8f963,0x2bb9ff68),LL(0x0799af64,0xcfca4893),LL(0xe7b1b3d8,0x47d406c3),L_(0x000001d6),
+ LL(0xa5b46eea,0x00cef9c4),LL(0x0381ae85,0xe36179b5),LL(0x317e7dbb,0xac6498cb),LL(0x2d824ab9,0x328707df),LL(0x6aa97d96,0x80e79f5f),LL(0xc19368fd,0xe03799c5),LL(0x109d20be,0xa4688d4b),LL(0x5dfd91a5,0xc9ed9fae),L_(0x000000b1), LL(0xfce4aa86,0x8a4a894f),LL(0x5f3c5caf,0xf0a6af85),LL(0x0a082826,0x869fa6ef),LL(0x4cf46392,0x5a750056),LL(0x1d906025,0xb437590a),LL(0x5afd7688,0xfa2a2142),LL(0x5b91f195,0x46dd69d6),LL(0x53028951,0x55436804),L_(0x00000093),
+ LL(0x110cffe0,0x4f03a88a),LL(0xb44dbaac,0x68ebc98c),LL(0x849e6d09,0x9e197499),LL(0x126aa5d3,0x374e4b92),LL(0x9e50c62e,0x9406118f),LL(0xf4a6d99b,0x4e25c845),LL(0xc9df6238,0xb15d2756),LL(0xa10c0e52,0xe1aee3fe),L_(0x00000010), LL(0x816212f7,0x43351049),LL(0x52076e7a,0x90d0771e),LL(0xac804061,0x50393b27),LL(0x509ba99e,0xb81254b5),LL(0x6fa16ea2,0xbe5e2613),LL(0x1a907d04,0xf4aab035),LL(0x2ee00b2d,0x00a0f275),LL(0xab599862,0xf956cc9e),L_(0x00000068),
+ LL(0xfb9a872a,0xde3af050),LL(0xbec0fc8c,0xebe6b500),LL(0xe7c4ef2e,0x28e4d4b7),LL(0xb38a6c42,0x82362d94),LL(0xc4f9fb0e,0x4e229d20),LL(0xa3690dbf,0xa6e45bdf),LL(0x730c74e3,0xa7b1c90f),LL(0xf2fc481f,0xf8128306),L_(0x000001d9), LL(0xe5e496c4,0xe46148f8),LL(0x16f8ae6a,0x4268188f),LL(0x60936452,0xdcecf1b3),LL(0x828f2ec9,0xeec097ea),LL(0x8a581be5,0x3e062b3a),LL(0x85430a09,0x4da12b49),LL(0x562092de,0xcbb50541),LL(0x33c27b17,0x0f46deae),L_(0x00000171),
+ LL(0x4148520a,0xb05dd749),LL(0x6530988c,0x4882c146),LL(0x38e93ea7,0xf98af47a),LL(0x6360b046,0x75158008),LL(0x670a2092,0xa8d210f6),LL(0xcea39485,0x590b4493),LL(0xd54fb04e,0xe30eec4b),LL(0xea6ce05c,0xcce02cfe),L_(0x000001f6), LL(0x095bed5a,0xc9bc887c),LL(0x40c45485,0x2639073e),LL(0x060df364,0x9ad162fc),LL(0x0ed461e0,0xd17260de),LL(0x48f9f001,0xcef6cf88),LL(0x5e44883d,0xc42e028e),LL(0x78ade819,0x7ee983d2),LL(0x24ef3daf,0x7e26a859),L_(0x00000188),
+ LL(0xfbbed4ff,0x64e57bff),LL(0x825f2bb2,0x9eb6b035),LL(0xfd8b6643,0x3c213466),LL(0x9c353790,0x7313deab),LL(0x9b0366be,0x2121723c),LL(0xac2996ae,0x953e87c3),LL(0xbd382785,0xf9b6974b),LL(0x3a30236c,0x0d0993e4),L_(0x0000015a), LL(0x5f3b2707,0x68809f79),LL(0xca4a12da,0x374c5228),LL(0x32cc5a86,0x15cef9a1),LL(0xae5f8c0d,0x72616f2b),LL(0xe61ce206,0x75c41da6),LL(0xde33abed,0xa5fc5af7),LL(0x50659126,0x5776a4d1),LL(0x4c16e788,0xbd4ffed4),L_(0x000001ff),
+ LL(0x017dab60,0xe869faef),LL(0x1a3d2819,0xa91c965c),LL(0x95cacbcd,0x1c63a302),LL(0x28898d33,0x91791e04),LL(0xe5b4e674,0x2669fe66),LL(0x4ee8bdb3,0x55d62682),LL(0x333ebff9,0x2111714d),LL(0x88832299,0x328d0de4),L_(0x000000b3), LL(0x4df0c3cb,0x7975bc08),LL(0xa4a0f0d9,0x6243d2cd),LL(0xf978a250,0x447d6ec4),LL(0xca8ffce0,0x3c8e28e1),LL(0xa6bda9ff,0x45d5e419),LL(0x3acf30c2,0x7bf52151),LL(0x2b66a867,0x21d9061e),LL(0xbba7056e,0x01e0ca13),L_(0x00000021),
+ LL(0x8f349801,0x029f064c),LL(0x07be931b,0xb893aedc),LL(0x14f71f6a,0x242b0eea),LL(0xe179067b,0x8af895ee),LL(0x99f6bf52,0x5e852a27),LL(0x1d5c2098,0x94bc1969),LL(0x296ab7db,0x7605deba),LL(0x31b9475f,0xa69410b2),L_(0x0000011c), LL(0xf8c45d63,0x0d9145a0),LL(0xb3a1daab,0xbc0cd8bb),LL(0x614875d3,0x4f51299d),LL(0xad650d62,0x7baf748b),LL(0xdb91d840,0x83b9d385),LL(0xf5cc54a3,0x840ae765),LL(0xbe2653a6,0xab5a54bd),LL(0x5728a0ed,0xa778a286),L_(0x000001f1),
+},
+/* digit=96 base_pwr=2^480 */
+{
+ LL(0x2be41906,0x9f1fdd6e),LL(0x9ab150fb,0xb458dd16),LL(0xf3f55fa5,0xb1bb79de),LL(0xd9b88ebf,0xc1d98e1f),LL(0x7b8b17a8,0x7f6beb8b),LL(0x6c86e6b3,0xbc72340b),LL(0x7bb70edd,0xdc7c19d3),LL(0x67a99418,0x65a67f68),L_(0x0000008e), LL(0x56a4a09f,0x9cb6bc12),LL(0x8ded9bb1,0x77d8b51c),LL(0x9f35ca45,0xeb257480),LL(0xf1168ba7,0x770b52be),LL(0x12cdae11,0xed4f42bd),LL(0xde9dff68,0xd326b225),LL(0x5631a8c3,0x1d37f144),LL(0xb14a3c37,0x81f6712c),L_(0x00000045),
+ LL(0x66b0b95f,0xf969adad),LL(0x57813fa7,0x1acf7746),LL(0x220707f6,0x712a2615),LL(0x71d4cd53,0x2fd4ef2f),LL(0x1f82a44a,0xd9e26293),LL(0x0681773f,0xf763ad20),LL(0xe31fd702,0xa99b206f),LL(0xc3a8767f,0x07e06765),L_(0x0000000c), LL(0x41a7f8ce,0x21c3dd47),LL(0xcc9159a8,0xe90e3290),LL(0x06b623fa,0x9e8cf993),LL(0x531760ae,0x2874afd7),LL(0xc9e7cf28,0xe6527ae8),LL(0x293d6e1a,0xf99eef73),LL(0x03d3d878,0x9237109e),LL(0xe1efdba8,0xad3ca36e),L_(0x00000108),
+ LL(0xcc51928e,0x2af7a58d),LL(0xfb374b29,0x5ec5d4bd),LL(0xd01fb1db,0x6d8cdd85),LL(0x62636565,0x641e476e),LL(0x674fc478,0xe28d244d),LL(0xb39d16a5,0xdbaa94dd),LL(0x5fd5183a,0x6b7fdde9),LL(0xea66d862,0xe99d2b47),L_(0x000001a0), LL(0x574c9d49,0x88f7fd2b),LL(0x31232213,0x6c23d660),LL(0xb2ca0c2c,0xce3a1a6a),LL(0x664a406b,0x2ca19917),LL(0x8f549744,0x6f2fc149),LL(0xab32866b,0x41cbc3b0),LL(0x7a277aea,0x25557ca3),LL(0x16026538,0x56054af0),L_(0x000000c5),
+ LL(0x4fdb7562,0x9be9e5c7),LL(0x29bd5547,0x548d39ec),LL(0x29c79da4,0xf3f7942d),LL(0xc4bc1f5d,0x948e1f79),LL(0x34a7cecb,0xb63229ed),LL(0x76898793,0x39c1a7d6),LL(0xbe3b3419,0x9157ad78),LL(0x2801351b,0x1bf8452f),L_(0x00000055), LL(0x59cbeae6,0x85ddee3b),LL(0x8140db30,0xeeab1d34),LL(0x41a033c2,0xb676bba9),LL(0x85703aaf,0x23a9d8b6),LL(0x35046b64,0xb832a7c8),LL(0x9e2475da,0x5b8c259b),LL(0xb51f8631,0xdb18a6bb),LL(0x53eb5dc8,0x9d1123a2),L_(0x000001fd),
+ LL(0x23cca37a,0x57f26e36),LL(0xc4d2ab36,0x787ec793),LL(0x520b9137,0x436337f7),LL(0xbcfb7906,0x2caa7a0d),LL(0x418cfaf2,0x5a502d75),LL(0x0ba14462,0x066c6a13),LL(0x1d083e40,0xd21212f5),LL(0xb9541e99,0x95f764eb),L_(0x0000010b), LL(0xa39384f4,0x07cf7953),LL(0xbdfbaff7,0xaa5f9b05),LL(0x1b083e95,0x782626e8),LL(0xfb350599,0x06f421de),LL(0xe92399d2,0x415729d3),LL(0x04ad8bd9,0xcf103879),LL(0x9370ad78,0x766e0bc1),LL(0xf2c002a0,0x56454b48),L_(0x000001c5),
+ LL(0xd6b8bb85,0x9a142f9b),LL(0x979dc67b,0xfc51be0f),LL(0xf84e32d8,0xf9ccb118),LL(0xf5b6ca36,0x5e79aba7),LL(0x3a900f56,0xfcfd2df6),LL(0x15163143,0x22db9b75),LL(0x5f85f9f1,0xd886015e),LL(0xe7c48af6,0x5b67dbf0),L_(0x000001b1), LL(0x5dcbc466,0xc13f4daf),LL(0x043aefcf,0x613ac2b0),LL(0x60909041,0x9567d2ec),LL(0xf4b79cb6,0x57b5e5ef),LL(0x8e04188e,0x9dd05dcf),LL(0x759c45aa,0xcd8106c6),LL(0xc6c633a7,0x694b84b0),LL(0xe7963345,0xbd8ff41e),L_(0x000001a1),
+ LL(0xfe8ed21f,0xf39b982a),LL(0xdf9459e0,0xef033664),LL(0x1245ad2f,0x4c26109c),LL(0x6578f9c3,0x7b73834d),LL(0x28e9fc09,0x21a085c7),LL(0x84bd7b31,0x65666df5),LL(0xd5585963,0x9d7af58e),LL(0xfd1e18ec,0x6947e7e9),L_(0x000000d1), LL(0xe717df29,0xf468848d),LL(0x7c888dbb,0xd747cd3b),LL(0x51097e9d,0xe70801a0),LL(0x8bb9b824,0x172bbff6),LL(0xc27a8a5f,0xf45d5351),LL(0x402074f9,0x0ba6fcc2),LL(0xd7e5a578,0xc1d4e050),LL(0xcb9d2f1c,0xd782dceb),L_(0x0000015e),
+ LL(0xf2b990fe,0x1096bf3d),LL(0x3b2d5eb8,0xeb580e65),LL(0xa2ad7396,0xca4cfd31),LL(0xcddd150b,0x4cdae865),LL(0x5cde916b,0x6ffe74e3),LL(0x1b6f19b5,0x1e7dc0b2),LL(0x333016e2,0xc799d8bf),LL(0x46cec318,0x3aee6eb1),L_(0x00000077), LL(0x9830acdb,0xdd1e911c),LL(0x1a0df89d,0x891db580),LL(0x646bbddd,0xe25f1a5d),LL(0xc4d27510,0x10d55b0a),LL(0x144af2f9,0x5bcea08e),LL(0x50da24a7,0x7ae5f37d),LL(0x9ad211e3,0x73d37273),LL(0xd9d5c417,0x6daa32a2),L_(0x00000156),
+ LL(0x785d4516,0xd201173c),LL(0x5cbe43f9,0x6f813c93),LL(0xfc65024c,0x5174f5db),LL(0xcbde45cf,0x98aed5fb),LL(0x29d4641e,0xe15ff504),LL(0xb6befd4a,0x92a16838),LL(0x3fb27455,0x7017d508),LL(0xa78ba07c,0xb26c2bcc),L_(0x00000057), LL(0xad9a35f0,0x16e47d7b),LL(0xbfe092d3,0x75d728c5),LL(0xd99290d8,0x8ba65183),LL(0xae8ed203,0x9af2b287),LL(0xe9db0d4e,0x433a1079),LL(0xe6c8ae7a,0x21dd82ce),LL(0x5486b431,0xfbc30bb9),LL(0x7775c8a8,0xde995750),L_(0x00000075),
+ LL(0x92135986,0xaae951c6),LL(0x9a74fa72,0x3dfd82d1),LL(0x4bc31a1f,0x060156b1),LL(0x9ab6f26a,0x8b245f24),LL(0xa98e8084,0x317596e1),LL(0xc80c4dc3,0x11d5e680),LL(0xe262106e,0xbee2a8d6),LL(0x60234555,0x6b1389ea),L_(0x000000c4), LL(0x8b82b6cd,0xa80d5059),LL(0xb2182943,0xa584e869),LL(0xa8841e7d,0x7e59ceee),LL(0x74e1e538,0x201d2b08),LL(0x6d2519ec,0x76d5cc62),LL(0x41a115fc,0xdedbfb6e),LL(0xa6f152e5,0x5c18feb7),LL(0xd80d529e,0xda3182b3),L_(0x00000121),
+ LL(0x3682bcf5,0xe91e53c5),LL(0x6ca16c30,0x3355812c),LL(0x6b8e8ce2,0x18e076f5),LL(0x77cbae05,0x45a2864e),LL(0xae50657d,0x29b224b8),LL(0x5b740476,0x1853045f),LL(0x9cd59d4a,0x4fef40e2),LL(0x6e774f0e,0xa4239a92),L_(0x000001d9), LL(0x0f66fd40,0x87e39c23),LL(0xd4b5406a,0xb9d5824a),LL(0x309845c7,0x4567fe70),LL(0x40e6539b,0xc9f3a53e),LL(0x4965ee0b,0x0d799507),LL(0x06d618a8,0x28bea4e0),LL(0x01fa0a00,0x8b356252),LL(0xb43cd562,0x1c9f3b62),L_(0x00000067),
+ LL(0x198a02d5,0xcf78de3a),LL(0xa89bcfff,0x6931d65b),LL(0x98eb3ac0,0x204cbef2),LL(0x796db40b,0xdbd652c6),LL(0x82883eda,0x8c7c0479),LL(0x6355b755,0x3ccc26fb),LL(0xb1589be6,0xdcd445ae),LL(0x8ce9a7eb,0x5e17a063),L_(0x000001b0), LL(0x34daeef1,0x92e7ebd6),LL(0x33e4d5b6,0x252f990a),LL(0x7af9fecc,0xa16a7b3d),LL(0x19533f3a,0x07d26ab6),LL(0xf0584373,0xa41a7a2a),LL(0xc7584589,0x32ddecef),LL(0xf36c6f17,0xf2956cde),LL(0xe47377e9,0xa22efbef),L_(0x0000007d),
+ LL(0x68fb10a1,0xe2e1dbf7),LL(0x1bce1a5b,0x23f22cb2),LL(0x865d95ed,0x3d7b8ca9),LL(0x9350d70c,0x0559d55e),LL(0xf39cff5a,0x634be668),LL(0x1f6fcd80,0xbb740491),LL(0x31d2120d,0x7202a974),LL(0x2efc5e17,0x95233dd7),L_(0x00000182), LL(0x6ff361af,0xbd828851),LL(0x26eff873,0x96db8923),LL(0x8d394d9b,0x6a1cb060),LL(0x3ebd8f2b,0x2c56b043),LL(0x71b88fe8,0x91925e0f),LL(0x39b0cfe1,0xea28e59d),LL(0xcb53dd25,0x933a3cad),LL(0x8fbf4361,0xc3fa9512),L_(0x000000ff),
+ LL(0x13e495fa,0x7698266f),LL(0x51931514,0xd385a184),LL(0x7057cc40,0x7fd1998f),LL(0x8ffed935,0x5d2e260a),LL(0x55f9858d,0x34fdc952),LL(0x353e16aa,0x3d6d1e16),LL(0xd91adeda,0x9e8895ec),LL(0xa78987af,0x867a4506),L_(0x00000010), LL(0x62e40103,0x869a5ca3),LL(0xc9ddcb20,0x777bb6c1),LL(0x0f3e3498,0x4f97ec1c),LL(0x18133992,0xa7ddecae),LL(0x1c9b2738,0x280ea610),LL(0xae01d593,0xc9770c84),LL(0x30145dcf,0x7c4ed00d),LL(0xa2a8b818,0xff2e9907),L_(0x000000ef),
+ LL(0xd4f005b4,0x56eacf75),LL(0xf05cca8e,0x8a05a713),LL(0x2382e841,0x3f19077a),LL(0x3c0079f4,0xef823326),LL(0x07e9f310,0x71d13043),LL(0x6311fb89,0x0c6d6593),LL(0x63ca3188,0x0c592a1b),LL(0xfce1253d,0x4831a442),L_(0x00000135), LL(0x9089e935,0x994e32d5),LL(0xdc455b1d,0x643872ac),LL(0x914013f8,0xac2eba70),LL(0x35f0c433,0x5a85e638),LL(0x59b2430e,0xa786ce7a),LL(0x5225b772,0x920543ca),LL(0x51228731,0x1e47ebe9),LL(0xc56f0daf,0xfc2b2f8f),L_(0x0000006d),
+ LL(0x31ce7476,0xe409da17),LL(0x5b328da3,0x098b5f71),LL(0x607382a2,0x51c3538d),LL(0xc3ee7b06,0xabf1dd7b),LL(0x96d5eed9,0xe8c0d16d),LL(0x1a4ceb18,0x3fe464dc),LL(0x6b9f8f1e,0x0c30d6fa),LL(0x359d987d,0xc00a5cfa),L_(0x0000006c), LL(0x2947d098,0xb97b5789),LL(0x05d737b5,0xcc27fc50),LL(0x2087e2c1,0x62d40feb),LL(0xdd0d9606,0xf37345b7),LL(0x225ee555,0x7f3858a7),LL(0x9ae8d7c1,0x0cf2ae73),LL(0xdcf4e1aa,0xee00ee77),LL(0x649e41ec,0x007dac12),L_(0x00000021),
+},
+/* digit=97 base_pwr=2^485 */
+{
+ LL(0x808de672,0x8326922a),LL(0x156260ea,0x1a0841b0),LL(0x63e3e317,0xacb0f8a9),LL(0x806aeb44,0x33483737),LL(0xad9d8a14,0x761a3419),LL(0xbffd26bd,0x2e7a343f),LL(0x6d361b6d,0x4d86e32c),LL(0xf433219c,0x336c223e),L_(0x000001ac), LL(0x1f25620f,0xd5c03d38),LL(0x3a87f67d,0x80f73464),LL(0xe876505e,0xe4906c5e),LL(0x491baac4,0x178a012b),LL(0x93e07deb,0x0f735b86),LL(0xd75fad06,0x76ce5dd8),LL(0xc97cb185,0xf5dd4cd9),LL(0x634bbb55,0xa9e4bcbc),L_(0x00000045),
+ LL(0x37703361,0xc5f2fac1),LL(0x4dee5fdd,0xe014aa4b),LL(0x2218fde8,0xa684a9b7),LL(0x0e229612,0x1d9b66c1),LL(0x7cb5b99f,0x1796c130),LL(0x71c7eff0,0xc0871522),LL(0x27930b1e,0xd19f171d),LL(0x3091f21a,0xdabbbdd5),L_(0x00000094), LL(0xa74c873e,0xbd512368),LL(0xbc31a6ec,0xd3ea21d4),LL(0x62eff689,0xbd43a95f),LL(0x73a33474,0x1413507c),LL(0xf88fa97a,0xb01846ef),LL(0x8f06b4d3,0xfbac8f6a),LL(0xdc2a3015,0x159ddd58),LL(0x7b911f1a,0xe5ea801f),L_(0x00000082),
+ LL(0x2fe873b0,0x5ebf3c8d),LL(0x32fe371d,0x5b9ca7cc),LL(0xc245b054,0x2658798c),LL(0xeaf83f8b,0xf09afde6),LL(0x761d87bd,0x29e1b970),LL(0xa4fd48a5,0x1501c97b),LL(0x5ab0a100,0x1dca9665),LL(0x0ec7beee,0xefd2f42f),L_(0x000000be), LL(0x28296b82,0x171dfdb2),LL(0x171bb70c,0x1dac3a3a),LL(0xad9a13af,0xe21b7ea6),LL(0x1fe361dd,0x2f8b8125),LL(0xccea9acd,0xe8df3c1e),LL(0xa4b48480,0x8a5f495c),LL(0xb8ecc783,0x07fd225c),LL(0xbc6bffc7,0x52512454),L_(0x0000018f),
+ LL(0x84cef36a,0xcdf4c999),LL(0x5f8d7040,0xc211953a),LL(0xfaefc5ed,0x563ab4c0),LL(0xa17066a1,0x0c339a5c),LL(0xafb2c094,0x517a5667),LL(0xb135b1e8,0x3d2a94a0),LL(0x4526e2ec,0xd9185e4d),LL(0x3c05d493,0x0f6c71b5),L_(0x00000170), LL(0x2fc5ced3,0xff470fab),LL(0x21ddb195,0xed29f4a2),LL(0x2d94f5fe,0x69f0868b),LL(0xaf8fcc50,0x8631be3c),LL(0x3dcfc141,0x43a07062),LL(0x1c9d9989,0xbafa5f73),LL(0x1cc4a069,0xe1c5c56c),LL(0xf502e626,0xdf086a82),L_(0x000000ce),
+ LL(0xaaec0dfb,0xb5f2559e),LL(0x37f92069,0xf82c9e25),LL(0xde3d65ad,0xca0987ef),LL(0x52dba2b0,0x110760de),LL(0x6f1e9d7b,0xec3c5a7a),LL(0xb68a52e5,0xe6b61974),LL(0x47ef0970,0xa12dbde7),LL(0x952831ff,0x50801ee3),L_(0x000001d6), LL(0x2a4c3695,0x2be66d3f),LL(0x90213a6f,0xb1043636),LL(0xecffb364,0x0ea64838),LL(0xaf651989,0x059f3995),LL(0xd04bda10,0x8aa19045),LL(0xfff61b8d,0x76712e84),LL(0xb77b5575,0x6970c5d5),LL(0xfb11370a,0x7ca2cd1e),L_(0x00000032),
+ LL(0xe37454a0,0x644b36eb),LL(0x2bc89a6d,0xe5b95fef),LL(0x705a9c84,0xc8e9527d),LL(0x6ad037b8,0xc306c56f),LL(0xa3d9152e,0x99bdd442),LL(0x3acd8434,0xd2e50d9f),LL(0xfb35013e,0x10c1418e),LL(0xa1aaf42a,0x566527ea),L_(0x0000008e), LL(0x301c9fea,0xa12968d1),LL(0xf9c8c259,0x796a5743),LL(0x1c0237b8,0x92290293),LL(0x56baf809,0xb04d2746),LL(0x81ca3b50,0x93109cb5),LL(0xd70a42b1,0x1ffad7c2),LL(0x829c0f93,0x90fb8081),LL(0x00473bdc,0xc41c7985),L_(0x000001a6),
+ LL(0x78a1fc22,0x1e0d9fae),LL(0xfe3efcad,0x7975003b),LL(0x1a1d9870,0x5a8555e6),LL(0x08399c40,0x13808c98),LL(0x1f10285e,0xf7ae407f),LL(0x6b16e9b6,0x95f47114),LL(0x5ef970a5,0x42ba4017),LL(0x58f89d1a,0xf78bfabe),L_(0x000001d8), LL(0xb52c0fec,0x68533122),LL(0xc427c0ed,0xd8c2fad9),LL(0xbd46322d,0x870ca81f),LL(0xccd1cd67,0xab6ba984),LL(0x5510a68c,0x6f619ce9),LL(0x2516fdb1,0xd13d0213),LL(0x89ce2a78,0xd4ddba71),LL(0x33ef2f0f,0x10b6e6d6),L_(0x00000012),
+ LL(0xd29edf28,0x8e335e18),LL(0xe046e99e,0x4ace8ce0),LL(0x72c0503a,0x42f01d0f),LL(0x9c6d09e2,0xfcb4567e),LL(0x3998b6c2,0x0686ceb1),LL(0x91430be4,0xb8fca6af),LL(0x2236ef5d,0x01c77e85),LL(0x718e1a29,0x033d9ba3),L_(0x0000005a), LL(0xab5ae430,0xa843a1b6),LL(0x025f63d8,0xc9500fb6),LL(0xd803e788,0xfb7b9cb8),LL(0xea023d9b,0xcdad70fc),LL(0x803f3ec5,0xa7e50d4c),LL(0x9c07188d,0x9eb540fd),LL(0x822ee2af,0x0d14ab57),LL(0xaff12ba0,0x84fb3574),L_(0x00000156),
+ LL(0x8230400e,0xed3531cf),LL(0x20fd0e05,0x442851e2),LL(0xd6869a7e,0x1568acb2),LL(0xae871699,0xd7c29d8f),LL(0xad380219,0x512e57e5),LL(0x17e73a2a,0x0239d8b5),LL(0xff1100de,0xa4cc3700),LL(0x3960bc57,0x227a0cb5),L_(0x0000001e), LL(0xec6e136b,0x7a2013e5),LL(0xb3934a8d,0xdeac099e),LL(0x7585325a,0xc5fcf6e8),LL(0xa4aae387,0x73e275f5),LL(0xe0a1bb17,0xc599d358),LL(0x78aeadce,0x5e5ee001),LL(0xf20a237c,0xbc670ce3),LL(0xc755c2ed,0xe8b1f856),L_(0x000001a1),
+ LL(0x9e1ae8f1,0xb8a1be4d),LL(0xec417dcf,0xa0d53ddd),LL(0x13c7c494,0x565a5779),LL(0xe8460798,0x4157d87f),LL(0x865e6ed9,0x5fcc1adb),LL(0x43eb5613,0xff942117),LL(0xf8951241,0x65dffe8f),LL(0xbc9c1cd1,0x1aadce69),L_(0x00000130), LL(0x9c6c39b5,0xdc72853e),LL(0x60f36e47,0x8941b5fe),LL(0x036e5482,0xd9f274e7),LL(0x2bbb4450,0xd2f8bf2a),LL(0x900ba078,0x48bef6a0),LL(0x9a34b9c0,0x548c40a6),LL(0xa419ecbd,0x3d7bc93f),LL(0x5929867e,0xf64948b9),L_(0x00000164),
+ LL(0x2d5481cb,0x900dd0cf),LL(0x94bad4ae,0x06d3c0a0),LL(0xbee25614,0x2d0029ba),LL(0x4f1ce8bf,0x7ae14d24),LL(0x12c5aff4,0xcb8bd567),LL(0xd5130b01,0xa1cb296e),LL(0x13ab0e47,0x287ae4a9),LL(0x1c30c115,0x2ee003e6),L_(0x000001c7), LL(0x91cfcc0a,0x9e6287d6),LL(0xf8cffb98,0x0a5d81d7),LL(0x6e40495f,0xfe24065c),LL(0x4ac91688,0x6ef91697),LL(0x0bce1292,0xfa7c3394),LL(0x082d9558,0x334da954),LL(0x0d5bbff2,0x41fa885a),LL(0x6904d684,0x130da09c),L_(0x000001be),
+ LL(0x30ed1da7,0x34a6a52a),LL(0x610afcab,0x9193baed),LL(0x00ab78dc,0x40598146),LL(0x40d27bbd,0xfc2510b3),LL(0xdf263e04,0x2c222200),LL(0x4f8a34f4,0xe2fa7ec8),LL(0x7ecddf41,0xf5c8a69f),LL(0xb69fa963,0xc6dcbe65),L_(0x00000110), LL(0xde38eab5,0x1dc06ecf),LL(0xbce53abf,0x287aff4f),LL(0x123a0ff7,0x865d5801),LL(0x9bc53dd9,0x7f2760b0),LL(0xf4d19de7,0x2617ed79),LL(0x59b16830,0xfb36b9bb),LL(0x86d6b37c,0xc68164d5),LL(0x3ce542b7,0x536fc3d5),L_(0x000001ba),
+ LL(0x785c9888,0xd5898c8f),LL(0x0f97f6b8,0xa5e5e010),LL(0x25a6849d,0xdb272a5b),LL(0x5b826b6b,0xf1d7d775),LL(0x8319ab20,0x81fab2fc),LL(0x051b545f,0x13836d82),LL(0xf3f0508b,0x79a2e73a),LL(0xc87d4ab2,0x6868b289),L_(0x00000106), LL(0x9d6fea08,0x0b7f377d),LL(0x285c3784,0x13a96505),LL(0x5e5f0355,0x80e5351a),LL(0x92ff2d7f,0xa4907b9b),LL(0xf478e9fa,0xec7c1179),LL(0xd90b6dba,0xd2c36f50),LL(0xbe1d562a,0x797351a1),LL(0xf65a7374,0xf2fc31a1),L_(0x000001ce),
+ LL(0x8caa24b9,0xdad4ac58),LL(0xe55e016b,0x42a35993),LL(0x04d4925f,0xf4d85232),LL(0x8c2cb262,0x654bec90),LL(0x44564228,0xd9274933),LL(0x58349da0,0x55dc684a),LL(0xb18184ce,0xe08bebb4),LL(0xe4015bbc,0x9fc75a6e),L_(0x000000db), LL(0xcea81cd2,0xb89f906a),LL(0x5a1b62b0,0xc0a88adc),LL(0x46897bd0,0x3422a9ae),LL(0x6bfb70df,0x0d20f649),LL(0x113b8338,0x197424dc),LL(0xf43ab4e9,0x11c7f33e),LL(0xc17b56d7,0x3e3697c4),LL(0xf0f21e9a,0xf1b66341),L_(0x00000145),
+ LL(0xb3c8d4e4,0x3221af32),LL(0x786f9cb5,0xef78da7b),LL(0x6228aab0,0x460bf9aa),LL(0x4fd179a4,0xf900af46),LL(0x2bd49daa,0x42fb7206),LL(0xcadd2655,0xfa16e111),LL(0x992a0506,0x4726c9f4),LL(0xbd04e990,0x77052bc5),L_(0x00000017), LL(0xc3ac19be,0xeed5408d),LL(0xfa218d10,0x2bf29af8),LL(0x2a7befd5,0x3b0d28b4),LL(0xeabb7643,0x28d2a823),LL(0xfa48a66e,0x34709b21),LL(0x92c650bc,0xdf1a83ea),LL(0x261706b5,0xa9a5f258),LL(0xbeb0a33b,0x03e83019),L_(0x00000105),
+ LL(0xd53c20db,0xb6013f7f),LL(0x09d4a480,0x447348d1),LL(0xcb6a7da1,0xd8bfe6fe),LL(0x64e8c529,0xa6067265),LL(0x9034045f,0xa8df68fa),LL(0xff3f3ee2,0x1796dbc7),LL(0xdedc2792,0xe9a130fe),LL(0x4c3f368a,0x2a547fe2),L_(0x000001c1), LL(0x792961eb,0xed55f272),LL(0x9b014919,0x0068193a),LL(0x44cb0bf8,0x32ef3174),LL(0xe22227ee,0x4cb4a896),LL(0x147c8b85,0xc6a73b28),LL(0x2ed1bf6d,0x6804296e),LL(0x77be001d,0x223e6f8a),LL(0x89b143ab,0xdacda84c),L_(0x0000013d),
+},
+/* digit=98 base_pwr=2^490 */
+{
+ LL(0xec0e9921,0x21044500),LL(0xcba88ccf,0x0c873630),LL(0x6fd4e4b8,0x45764f80),LL(0x056645dd,0x4551a9a7),LL(0x72ed8739,0x025ba6b1),LL(0xa9a78987,0xdd01b45f),LL(0x1f9f1355,0xd2ccea3a),LL(0x807cbab8,0x43e3f592),L_(0x0000011d), LL(0x4c6c96e8,0x1a51e813),LL(0x57065d92,0x2ab97599),LL(0xa89e1baa,0xabc4035c),LL(0x057c2aaf,0x1a6716df),LL(0x9c0890aa,0xf802387d),LL(0xc7786bd3,0xa39383e5),LL(0x1f627056,0x00601e4e),LL(0xf2265779,0x9c233096),L_(0x000001c4),
+ LL(0xd4e8955d,0xe1d0f381),LL(0x45a79e1d,0x6407a6cf),LL(0xe689a76d,0x407f2393),LL(0xd92aed2a,0xac261bd3),LL(0x95547cc6,0x9e62fcac),LL(0x49835e0b,0x1e291077),LL(0xdde8f908,0x7b3d6780),LL(0xc4cab77f,0x213643c5),L_(0x00000036), LL(0xbde052d3,0xaa1aeecd),LL(0x958c939c,0x24153092),LL(0xca5c0f7b,0x5c0c11b7),LL(0xc9284796,0x3698d827),LL(0xd732af64,0x351c0ba1),LL(0xa3ee0367,0x1b1bf491),LL(0xec2302cf,0xafdf3514),LL(0x4436d640,0xb9059b4c),L_(0x000001e7),
+ LL(0xe09f3da3,0xb7ed8d41),LL(0x97fc0836,0x33451dcc),LL(0x1b62ac0b,0x4bb0f328),LL(0xc7985f30,0x76f68d69),LL(0x7e5bf130,0xa8fcc12a),LL(0x87f28f61,0x0c13fc90),LL(0x097e8f18,0x9299a913),LL(0xec6104d5,0x243dd550),L_(0x0000003d), LL(0xf8ef488b,0x2c0a7e4f),LL(0x94b33bee,0x5db54ad3),LL(0x4a72bd81,0x0abb0c63),LL(0x57fa905b,0xa7b05810),LL(0x98b0da0b,0xc18c2e82),LL(0xa6507965,0xd53207a1),LL(0xba323d2e,0x1a96c29e),LL(0xe70d8f52,0xb6698de6),L_(0x00000152),
+ LL(0xc54265bd,0x14b97128),LL(0xe0b08320,0xfd3dafdf),LL(0xb3fd6699,0xb8bb1956),LL(0x416a87bb,0x038f8691),LL(0x01dd4344,0x88826c84),LL(0x7456566c,0x07a8a4b7),LL(0xb2fca59f,0x037671e1),LL(0x797dc52a,0xf3b10200),L_(0x000000e2), LL(0x5d7843bb,0xee9b4c46),LL(0xfa39c4f9,0x303b1652),LL(0xc4a55ae2,0xc15ae7c4),LL(0x3ccdcb67,0xda8ac526),LL(0x7a17fd06,0x8d1d1e92),LL(0x685ac10d,0x5bfc6232),LL(0x048bbb8e,0x233162cd),LL(0xc2cffebb,0xafee0b11),L_(0x000001d1),
+ LL(0x20c13569,0x9b91ab1e),LL(0x14810705,0x032808d4),LL(0x6428e5a7,0xdd56117a),LL(0xb86a6737,0x9ed920a9),LL(0x32ca9ded,0x46d45de0),LL(0x0898b533,0xaef720c0),LL(0xc4b5cbd6,0xe8b625d5),LL(0xd262cadb,0x38b1a825),L_(0x000000f1), LL(0xbe07a63a,0xae8c0455),LL(0xc0c992ba,0x56ade4e3),LL(0xd8c4dd74,0xaddf367e),LL(0x1fb487a3,0x10d03d26),LL(0x978961e7,0xced02543),LL(0xb1fb8d4a,0xd9cb94bb),LL(0x4067c3be,0xfd0c7063),LL(0x1e63aa4d,0x0497e03e),L_(0x000000d3),
+ LL(0x43a818af,0x8e882098),LL(0xa14d3397,0x2df8f9ff),LL(0xfba08f0f,0xc3139e9a),LL(0xd6f4162c,0xd35b42ed),LL(0xddc9743c,0xa29eeda8),LL(0xeaef65fa,0x1d1cf761),LL(0xc4cffc87,0xf5204083),LL(0x9c04512b,0x184be0af),L_(0x00000183), LL(0xcce1fc0e,0x4ca92fa2),LL(0x0756de13,0x7ef7ab66),LL(0x6b218d95,0xa4befba4),LL(0xec5df862,0x028018d1),LL(0xb0fb4797,0x0fba684f),LL(0xbb1872b1,0x035fcdb9),LL(0x727d62c3,0xa85f1754),LL(0x52c190b4,0x9257c1a0),L_(0x000000ed),
+ LL(0x8c02d54a,0xa33c5b35),LL(0x9d3a0d5a,0xda74fd32),LL(0xcf0e2fac,0xdf27160e),LL(0xa9cf0042,0xce44dc1f),LL(0xf9b4e2f6,0x8815ba75),LL(0x71f7406a,0x5d29fed7),LL(0xba78d604,0x1b44fac2),LL(0xa544aa8d,0x2096cbda),L_(0x000000c5), LL(0x4f2a1a98,0xb052a60b),LL(0x2ee09590,0xfd68dd3b),LL(0xf82abd62,0x4cd7b68f),LL(0x3747e4a5,0xa7a82c3e),LL(0x6580fff5,0xfc1c77a5),LL(0x878185a1,0x29848ebd),LL(0x3507cf8f,0xe376e805),LL(0x3d153708,0x307d42fa),L_(0x00000089),
+ LL(0xd12cb202,0xde81ad92),LL(0x7dfd0285,0xb71b7749),LL(0x0c150a03,0xf597a8a1),LL(0xe99f4ad3,0xaef51dbb),LL(0x1f4533b0,0x838ed493),LL(0xbcf13b27,0xffc95a8e),LL(0x5623ddf8,0x2b2cefcf),LL(0x37c16683,0x782f0107),L_(0x000001d8), LL(0x8ce740d8,0xf3d3ab04),LL(0xd03ed624,0x376415ce),LL(0x76391c7d,0x22ffbe56),LL(0x671ffe7b,0xcc5f4981),LL(0x90390438,0xae289dd4),LL(0xef0984a5,0xf9a1f5bb),LL(0x41c66528,0x3eb05c49),LL(0xef77ff07,0x5fefc83a),L_(0x000001b4),
+ LL(0xdc003b87,0x913da2c9),LL(0x7357222f,0xb56a4216),LL(0x44f79a9a,0x435f9dd6),LL(0x6316da1e,0x76bee0c1),LL(0x44a0a348,0x528570a1),LL(0x1fc2528a,0x9e402d88),LL(0xadaf6615,0x23fd690f),LL(0x1b05eafc,0x4359ac50),L_(0x000000eb), LL(0x22ceb0f5,0x9817f70b),LL(0xb1910295,0x586cc9da),LL(0xfd424885,0x92631348),LL(0x902c218d,0x2d6b4b6b),LL(0x3b06ab9d,0xf6ce2b8d),LL(0xc2ef9db4,0x5440a618),LL(0x86f795ee,0xe7115329),LL(0x241af150,0x4639439d),L_(0x000000cd),
+ LL(0xb84d399a,0x5d1b603b),LL(0x6e75095d,0x3ebd519c),LL(0x0c38a4d8,0x5a2e8ab6),LL(0x703ee9c9,0xbe621b2f),LL(0x46425097,0xeda0425f),LL(0x3bda2722,0x7eaff2bd),LL(0xc82eaa59,0xddb8e21a),LL(0x9f181562,0xe2cfef1b),L_(0x0000013c), LL(0x319323ed,0xf55ade52),LL(0x1195febd,0x72cc0544),LL(0xa5494291,0x34dc9234),LL(0xaa005164,0x2b24e83a),LL(0x2e6ec50c,0x61a67644),LL(0x300b585a,0x2a2cce42),LL(0x251bf8fe,0xc53eb03f),LL(0xa53e93a0,0xaf5e947c),L_(0x00000146),
+ LL(0xbd450c1b,0xb6233906),LL(0xf8cf8ce0,0x2f163b01),LL(0x37f9bc73,0x121c5a4d),LL(0x74a3b3e9,0x84c581f0),LL(0xd2aa3a2e,0xa16b9ae6),LL(0x7a258259,0x5182e300),LL(0x6d279587,0x3b163221),LL(0x9054a8d4,0xc9bbaf00),L_(0x000000fa), LL(0x650238b5,0xbdfac6cd),LL(0xbc313548,0x60bb5887),LL(0x98e5a28f,0x3b8aace3),LL(0xb0c9ed3d,0x1f5ded63),LL(0x943fdf61,0x3ad1b6fe),LL(0x292fee9d,0x3bea9f61),LL(0x765fb8a8,0xb3aff102),LL(0x1c05be97,0x28393c5e),L_(0x0000014b),
+ LL(0xdf604a9b,0xe5f51ce9),LL(0xad97f878,0xb763f98c),LL(0x89d3ab54,0x6fef5a13),LL(0x3d0efdef,0xdf2543ab),LL(0x39be5cf0,0x51869676),LL(0xd8322a0d,0x34850193),LL(0x90477611,0xe0860abf),LL(0xf04b3d8d,0x2016c4b4),L_(0x0000018d), LL(0x65e57c44,0xa66238e0),LL(0x78a12a3f,0xd140af78),LL(0x55dcc858,0x65fde14d),LL(0xc7b391cc,0x4d882561),LL(0x2d7dbf32,0xaa74e78f),LL(0x03f85d09,0xed166a45),LL(0x7ad860c8,0xe6da0c2a),LL(0x8d8fe387,0xa3128204),L_(0x0000014a),
+ LL(0x06980a45,0xdae5a808),LL(0xcd56237c,0xdb2a4bfb),LL(0x1628aed0,0x029fee0a),LL(0x5baf2e6b,0xcfe94b4b),LL(0xbaa05917,0x186a18d2),LL(0x6fb7aa6f,0x3e611766),LL(0x97f81882,0x759b437f),LL(0x25dc9d58,0x1b6c9ec3),L_(0x00000167), LL(0x16ed73fe,0x1dbc5e5f),LL(0xae04984f,0xb2380921),LL(0x00f6d531,0x941b93a0),LL(0x9956e547,0xafda37c5),LL(0xbcd796ef,0xeb23c73c),LL(0xd18e7739,0xec321455),LL(0x9f3b6f4a,0xc9846e98),LL(0x7c09f2f9,0xe0267b0b),L_(0x00000097),
+ LL(0x447d7aeb,0x4ec21998),LL(0x691aa304,0x062e1539),LL(0xd6b055f4,0x350b4c67),LL(0x310e0e47,0xeee31b24),LL(0xe16697e6,0x24a9c93a),LL(0xc742c710,0x50e8a296),LL(0x5f791c6d,0x511ff4a6),LL(0x4536286d,0x0ed01379),L_(0x000001c0), LL(0x36a695b3,0x301dfa2f),LL(0x07145edb,0x89ff6d58),LL(0xb1a2232a,0xd04785f8),LL(0x27854372,0x37e21f65),LL(0x82b68a6c,0x56a575ee),LL(0xb3063755,0x45ea52c0),LL(0x0e5cba73,0x1f5a3458),LL(0xb3b90431,0x55c3c131),L_(0x0000018a),
+ LL(0x05a677e3,0x7473a30c),LL(0x5a28a98f,0x8039064e),LL(0x69a1890c,0x559f0687),LL(0xdf1716eb,0x5a68dd8c),LL(0x216c64b2,0x665fa083),LL(0x89b49b44,0x27c0f780),LL(0x952e61c5,0x5e57e0f3),LL(0xc9f22b25,0x1e4e175f),L_(0x00000190), LL(0x9de5f532,0xa33b1f2d),LL(0x6ef509f5,0xd526630e),LL(0x80ca2834,0x2e72073f),LL(0x551bac6e,0x8bdc5409),LL(0xa93f6103,0x74c46ebb),LL(0x78de2a49,0xe616b99b),LL(0xbd4c9f5c,0x5a4f27fb),LL(0x9a70865d,0xb1f197c4),L_(0x0000012d),
+ LL(0x66505ddc,0x5ed0deab),LL(0x89dc51fb,0x5e972cc6),LL(0xb69dc78b,0x0c6e495f),LL(0x3f182669,0x96d605ca),LL(0x85f61868,0xf6678928),LL(0xedfbfd32,0x863f96f8),LL(0xdece22e8,0x64e644e5),LL(0xf857a4d5,0xc551c9b7),L_(0x000000e2), LL(0x55691ddb,0x1566a700),LL(0x7fa43590,0xe1f4e606),LL(0x796a672c,0x30886e62),LL(0xe5ee14cf,0x40aacab4),LL(0x9b327c1a,0x3294bd68),LL(0x2c002fed,0x103e5699),LL(0xf8494f59,0x9eb1323d),LL(0x51fec2bb,0x7f8bbd7b),L_(0x000001dd),
+},
+/* digit=99 base_pwr=2^495 */
+{
+ LL(0xcb769c73,0xa9593240),LL(0xb057cdf9,0x4e8217f3),LL(0x220054ab,0x34dceca2),LL(0x5ba1c2a7,0x22b719c9),LL(0x16500d13,0x1b436038),LL(0x0ba1ec57,0xf76e87cb),LL(0x59db2c76,0x77c59385),LL(0xbe033b58,0x47810397),L_(0x0000015d), LL(0xddb6a77f,0xc6a6cde3),LL(0x8f578d9c,0xe4987253),LL(0xeaf37819,0xa10e469f),LL(0xdc9c48cd,0x0f98832d),LL(0x51a6e545,0xbf05ea5f),LL(0x195d2d31,0x75cd216a),LL(0x89987c43,0xd18007e6),LL(0x358f3e07,0x0eb94cbc),L_(0x000001d6),
+ LL(0xd66a73f6,0x68ca281c),LL(0xa08670f9,0x827efca6),LL(0x180e8f32,0xeac3a96b),LL(0x9979b757,0xbff7df80),LL(0x2d9223bf,0x166015fc),LL(0x30d747dd,0x5475a887),LL(0x9ea9d126,0xfbce1622),LL(0x23756de3,0xee18876d),L_(0x000001e4), LL(0xa8ed537b,0xe46c7c15),LL(0x6d7df943,0x4b3f8765),LL(0x335be530,0xdb8a9213),LL(0xcb0ee208,0xb61ee376),LL(0xa4f5fc16,0x4ee85495),LL(0x2d47c111,0x53ced62c),LL(0x453ad352,0xaf641c92),LL(0xe1a21d73,0x4f8dd3e4),L_(0x000001dc),
+ LL(0x515c16f0,0xa0b8ef31),LL(0x11c31db7,0x6aca4236),LL(0xa62abc90,0xc862474f),LL(0x94eec3da,0x600cabaf),LL(0x3cb82e64,0xec07e4a3),LL(0x3c98aa82,0xef67e3ea),LL(0x548e4dc2,0x3817b7a5),LL(0x6160dfbe,0x5240c7b0),L_(0x0000008a), LL(0x212ed3d8,0xa341dfe1),LL(0x71cd3579,0x96070d42),LL(0x9ade2ce0,0x0d16c811),LL(0x6ffd05f0,0x1f2ea906),LL(0x4add5623,0x9034240f),LL(0x871a6489,0x92dc3317),LL(0xd71bf3b7,0xd6ec77d9),LL(0x3faf4d88,0x2292f10a),L_(0x000001aa),
+ LL(0xab483ff2,0x0cb9492b),LL(0x1910717f,0x1999673c),LL(0x5ba40ad7,0x61f5c7a7),LL(0xec8c1ec8,0x7a954022),LL(0x87870445,0xab6d023c),LL(0x607c1194,0xdaf5008c),LL(0x53612330,0x4ad39492),LL(0x5bf20a93,0xbc2055ab),L_(0x00000193), LL(0xab8ed330,0x045574d7),LL(0xf38e3b31,0xed11cb44),LL(0xab10bb4e,0xa511af67),LL(0x33cee10c,0x9fe7c1d0),LL(0x1549874c,0x6999489f),LL(0xa85b392d,0xfcfe4a15),LL(0x3684decf,0xb3b006a1),LL(0xbaefda3e,0x2c4ef7b8),L_(0x00000036),
+ LL(0x3d2bc261,0x1ee7f1c9),LL(0xd8d2c223,0x25894a88),LL(0x1159870b,0x106d0fe5),LL(0xac7070a4,0x37cd1eb7),LL(0x45edd566,0xfcc105e8),LL(0x0d87aaf2,0xbbc54886),LL(0x650d534b,0x4c68c1c6),LL(0xf8b73f4b,0xa090fd18),L_(0x00000116), LL(0x1c67e752,0x9fdf5e33),LL(0xda66e59f,0x1506a29f),LL(0x04eb7efc,0x566aa91a),LL(0xaf0c681f,0x41ad74ab),LL(0xcd6fd019,0xa0e6609f),LL(0x90d32f02,0xf9f03394),LL(0xc3f5d1da,0xbd5dbcf1),LL(0xa63c99d2,0x0f138d5c),L_(0x000001b6),
+ LL(0x94e82cbf,0x52832eb4),LL(0x61b4102e,0xb381c8b4),LL(0x7f0afbca,0xf1ba6e87),LL(0x8482ae88,0xc8cc076b),LL(0xd709eb28,0x5fc8e5ce),LL(0x0c640cd4,0x1363d1cf),LL(0x6be8f78b,0x4993a63d),LL(0x7a8e7f6a,0x60d50140),L_(0x000001ce), LL(0x1bfd703c,0xb3415df0),LL(0x8b57f708,0xf82eeb2c),LL(0x407aa69d,0xa723ed35),LL(0x9767c6b4,0x4dbc3f44),LL(0x52e1a818,0xdffc3e96),LL(0xad89d25e,0xe8855e29),LL(0x89f2e493,0xb2c695a8),LL(0xae2a995a,0x17ec825d),L_(0x00000011),
+ LL(0x7948d6db,0x1bf35a68),LL(0x6953ece3,0x2e4f6945),LL(0x5f0ffde7,0x8e48e233),LL(0x45b68e1d,0x805943a8),LL(0x7c03271d,0x83acacfb),LL(0x136c96e1,0x20b340c8),LL(0xb32c48cc,0xbf7ec9c0),LL(0x9a5cdcd3,0x6c769d3c),L_(0x00000065), LL(0xeda9d905,0x02288f5d),LL(0x6d5bb5e0,0xe250809d),LL(0x26841f8e,0x3ede31ca),LL(0x5b8a74f6,0x941707b2),LL(0xcd744281,0xf31b5a51),LL(0xcb81c384,0xa2b751ad),LL(0x1c7d45f0,0x98cd14ff),LL(0x0b61414f,0xfb2bcceb),L_(0x00000029),
+ LL(0x49c300d6,0x149cc932),LL(0x984e1f84,0x4f71e87a),LL(0xa635f884,0x2ebebead),LL(0xc51f4894,0x8d815dca),LL(0xb76c6b87,0x60dede95),LL(0xc3f25874,0x83c91cf8),LL(0x53753878,0x6d13e9be),LL(0x4ce987a5,0x59e4476d),L_(0x0000007b), LL(0x22fb2015,0x4bf1c2d6),LL(0x8bc4abf5,0x22da7f9e),LL(0xe7b83f3a,0xe42051b0),LL(0xeda536a6,0x9d89d573),LL(0x3ce8431a,0x64d23c5a),LL(0x3eec2b7a,0x07a6be7b),LL(0xb5fb43a0,0x5b672919),LL(0x4a7d1800,0xebe85c45),L_(0x0000002c),
+ LL(0x54bf1abe,0x835f5200),LL(0x88be0ac1,0x80a69454),LL(0x37a520fe,0x1ae181ec),LL(0xfbf51fae,0x1dbbcb25),LL(0xe0a144d5,0x7481d4f7),LL(0xbb7cdca1,0x89f680f7),LL(0x0d5abe7d,0xb4b624a0),LL(0x391425d4,0x8d9200f3),L_(0x00000131), LL(0xb4188e07,0xbfd1f50f),LL(0x6575b3b7,0xa43201e2),LL(0xbba2a525,0xe0fef193),LL(0xc9408771,0x2d5a89d3),LL(0x5fad41dc,0x95a6705b),LL(0x7d9dc257,0x9020f8bb),LL(0x290e4eb8,0xfbd17a63),LL(0xbb41e71c,0x495438d2),L_(0x000001c8),
+ LL(0x929f484a,0x0aa411ba),LL(0x72a995e9,0x16fc135a),LL(0xc8dd8a3a,0x2226cfa3),LL(0xefeed6df,0xebb1a266),LL(0xbe66eb40,0xd15ad7b0),LL(0x9e390f8a,0x0c3a1992),LL(0x4d13a05e,0xd151e340),LL(0xcf393bac,0xd2f40175),L_(0x00000053), LL(0x956cdbeb,0x4f6ce102),LL(0x1a20db88,0x3138d132),LL(0x4bd065b9,0x3956528c),LL(0x082878ee,0x1ab3833d),LL(0xc2946565,0x49e6b0dc),LL(0xe955cb4e,0x10248d30),LL(0x1ae9cc37,0x9e6e01a5),LL(0x5567eab8,0x130292fc),L_(0x0000009b),
+ LL(0x263e83bd,0x531fddd1),LL(0x56ab0f10,0x11105bea),LL(0xe11b8ec7,0x98797be3),LL(0x1992abc2,0xec87b621),LL(0x2f8db083,0x8d258c0b),LL(0xb3d171f4,0xac2ced2a),LL(0xd1cb21ab,0x7bcca55e),LL(0x47bc4dad,0xf87bf80d),L_(0x0000002f), LL(0xf1f3098d,0xb97a56f7),LL(0x30359457,0x13b63e78),LL(0x5c0291e4,0x0560b59b),LL(0xfd66b1ed,0xffcd1e35),LL(0xab62195d,0xa68ddbd9),LL(0x5e1a88f2,0xc8f7a10f),LL(0x5805f677,0xc770a044),LL(0x145b476e,0xf8481566),L_(0x000001cf),
+ LL(0xfec59218,0xbad5f014),LL(0x29cb3195,0xdeabd554),LL(0xfb9c1406,0x8cab2ab5),LL(0xf39524ff,0x1480bd6c),LL(0x6fbb57c0,0xc932f537),LL(0x34f118cb,0x9e4e5da0),LL(0x6eb8d83c,0xa6fb16c3),LL(0xc80fc4ea,0x5ea94048),L_(0x0000000e), LL(0xbe668aa1,0x614afa98),LL(0x9a412d4f,0x4cadab47),LL(0xb94d7822,0x933864b0),LL(0x51053a74,0x424e5f26),LL(0x3dd43fe6,0x600bdaac),LL(0xf8a04f2c,0xc0b432cc),LL(0x4257110e,0x2f4d8257),LL(0x58edc3e1,0x39fcd24e),L_(0x0000003c),
+ LL(0x42ad308f,0x07b9420d),LL(0xf2ff228d,0xf800adda),LL(0x959a36a9,0xa755b758),LL(0xe791f71f,0x06570844),LL(0xc9aeec3a,0x2525c1b6),LL(0xf99b3c09,0xfae920c4),LL(0x93e1e24e,0x54cdd224),LL(0x4a6949cb,0x1394e308),L_(0x0000005b), LL(0xc1192578,0xf0af3d86),LL(0x042c14ae,0x035da967),LL(0x54675869,0x65aba6d1),LL(0x00ddf870,0xfb6525b8),LL(0xcb3618ed,0xa58a9ef1),LL(0xa2776a71,0xd7373181),LL(0x9adaa84e,0x5acac693),LL(0x7c38e845,0xa9836617),L_(0x0000017a),
+ LL(0x17d5163c,0xb8856ff7),LL(0xc5c08271,0xa79d0557),LL(0x32810d21,0x16514840),LL(0xa6e95174,0xce8f06a5),LL(0x393b8782,0xf14b15d0),LL(0xdf3da6f7,0xa398eeac),LL(0xc040c1ac,0xd2eb31c7),LL(0xe9ed34f4,0x5308a3ac),L_(0x0000005e), LL(0x6386bac2,0x294f7bd0),LL(0xf986d8d5,0xec0b7a55),LL(0x55592285,0x96568681),LL(0x15833824,0x307162e2),LL(0x03366d9a,0x196efa15),LL(0x78331de9,0x6afbb75f),LL(0xce11aa87,0x4246ce65),LL(0xa207e319,0x9fea12f7),L_(0x00000198),
+ LL(0xdf95cccc,0x2c3a928b),LL(0x954c7e07,0xb87fc4e2),LL(0xc556dd0f,0x5dde9996),LL(0xa10a09f2,0x017edf41),LL(0x126b8ebf,0x11739253),LL(0xe86b6fe5,0x1f9be2dd),LL(0x7b89b849,0x4acd9273),LL(0x572a4b24,0x21e7f018),L_(0x000001c5), LL(0xe035ed7d,0x8545db72),LL(0x1c4fb913,0x52bc38af),LL(0xe8b8d046,0x500cd8de),LL(0xd8bd36cf,0xc86ac9e5),LL(0x7fd4ed73,0x82941dac),LL(0x968c57f8,0xcd1842b9),LL(0x806ab108,0x4885bf1c),LL(0x7821dec4,0xb8c5054e),L_(0x000000d2),
+ LL(0xf8d6129f,0xbddf5a7c),LL(0xb2f43150,0xb4988625),LL(0x3c2f3809,0x1299bbfb),LL(0xb080f7b3,0x84ed45f5),LL(0x20ab0abb,0x824f7bed),LL(0x533e510d,0xd6447243),LL(0xb64fbbb6,0x67c576b7),LL(0xcaa9ee82,0x1f4a9e16),L_(0x000000fa), LL(0x4253a269,0xf68fe622),LL(0x4572de06,0xa777b687),LL(0xcf599bf5,0xa16d5f86),LL(0x2a811045,0x94a33dfe),LL(0x08732642,0xac970a0c),LL(0xd6867a04,0xeb2b7d05),LL(0x0e51a57c,0xad29a28a),LL(0xbf79a38e,0x160ffbac),L_(0x000001d4),
+},
+/* digit=100 base_pwr=2^500 */
+{
+ LL(0x103efe86,0xcb9e407c),LL(0xaaa13853,0x0e6c71ed),LL(0x1b70a2af,0x5ae18f75),LL(0xcf7e3e82,0x1ec11bb0),LL(0x45c36a5a,0x56ab4b56),LL(0xa4e5487f,0x86df052e),LL(0x3868ef9a,0xc7d75031),LL(0xee422740,0x85ec4e60),L_(0x000000db), LL(0xb7ee652b,0xfaa97f40),LL(0xa3dd7397,0x294d2d1b),LL(0x453daecf,0xe65344d3),LL(0x24bd3f56,0x1c9985d3),LL(0xc78c6f61,0x2675985e),LL(0x8ad7e24f,0x8b4060d3),LL(0x6c928213,0xffdfb749),LL(0x27a6ad57,0xfdbabbe6),L_(0x000001a8),
+ LL(0x589be6a7,0x313031bd),LL(0x84289d06,0x704962d9),LL(0x522512df,0x4932ec5b),LL(0x6a669eef,0x4db07538),LL(0xcfe74767,0xabd7aebb),LL(0xe7944dba,0xd27fb22c),LL(0x458ef814,0x6ae70494),LL(0xc9680563,0x42cd4fad),L_(0x000001cb), LL(0x6c5b60c5,0x915adb1e),LL(0x108c6584,0xf8937e8e),LL(0x64ea3a9f,0xab88406d),LL(0x61d268f9,0xd6126f44),LL(0xae3ff279,0xed1f3032),LL(0x22a5d3b3,0x3a1b63af),LL(0x2fd7a532,0x90caf928),LL(0xf7a42a75,0x67ff1d99),L_(0x00000023),
+ LL(0x9fdfb005,0x179f05f7),LL(0x91c70d36,0x1f0a00c5),LL(0x1bdb8aa0,0x13b09f86),LL(0x1877e4cc,0xab098b85),LL(0x804921bd,0x47ca3471),LL(0xb874265f,0x78a5d59c),LL(0xeb734d84,0xbb8aac74),LL(0xa87e5bc7,0x94d792f6),L_(0x00000002), LL(0x635dd559,0x340b409a),LL(0x4cff9fd3,0xe395e617),LL(0x83237476,0x0e435fdf),LL(0x995df5d9,0xacf9026e),LL(0x0535beb0,0xf60fe3f2),LL(0xc3baddc2,0x21d68a60),LL(0x5d079f08,0x8b800543),LL(0xf7a20c38,0x5d89e84e),L_(0x00000010),
+ LL(0x061ce962,0xee54d7fc),LL(0xe676ddac,0x8e982883),LL(0xfc5997cf,0xe8ccea68),LL(0x4f3d06f1,0x42831bb9),LL(0x57b80d82,0x625c3604),LL(0x7389ec2e,0x5466a1d8),LL(0x13ff25b1,0xf9c50093),LL(0xfb5d45d1,0x0590b45e),L_(0x00000092), LL(0xab4e32c6,0x08ec78b5),LL(0x24014646,0x53a9c0b3),LL(0xd5ffb795,0x5594ddea),LL(0xf933bdcc,0xdc110f8b),LL(0xd5249289,0x5d52f652),LL(0xcb4147d2,0x95ab06c0),LL(0x968adb2d,0xa1bbff17),LL(0x4039be6f,0x8c602266),L_(0x000001e4),
+ LL(0x186c159d,0x6c1da851),LL(0x87f87d48,0x2ffecac8),LL(0x326e8ac4,0x70a401c5),LL(0x68a082d2,0x0bd703fe),LL(0xbb17b4ec,0x9fe82427),LL(0xd5029b1a,0xf75c6b25),LL(0x8859df58,0xfaac56e2),LL(0x0f97f9bf,0xc8a4fbc7),L_(0x000001dc), LL(0xaf73b932,0xe721dc13),LL(0x98f115f8,0x825bde14),LL(0x102f60c7,0xf0780fd3),LL(0x92e5a9e9,0x9fcac3f2),LL(0x96a4edbc,0x51ae4427),LL(0x123f8f26,0x622ca1bb),LL(0x3d2d6a72,0x4fa4ca10),LL(0x77d0f199,0xc7c42ca5),L_(0x000001c9),
+ LL(0x33e577af,0xbf557eaa),LL(0x98005156,0xca7cba0f),LL(0xe3d41486,0x73d1e9d6),LL(0x3a30b9f9,0xaa3443ad),LL(0x99856b55,0x81921940),LL(0x0ca4724f,0x250cf13f),LL(0xba1696b8,0x9b6f0f69),LL(0xba1deb1e,0xc260563b),L_(0x00000021), LL(0xa037cb66,0x7437eb08),LL(0xfaf55d7e,0x579149c6),LL(0x43f7c61c,0x921e4c69),LL(0xeba03e36,0xc342ab26),LL(0x0a3ade34,0x86264eb6),LL(0xcf120523,0xffc57653),LL(0x914e6e20,0x5770eec7),LL(0x2d678456,0xf286b491),L_(0x000000e5),
+ LL(0x3106fc3e,0x9739a62b),LL(0xd166966e,0x6ea97e6a),LL(0xbc843284,0x0fb2aa2b),LL(0x1768bc4f,0xbd1f5f87),LL(0x0a51f2d1,0x8890f99b),LL(0x5f53245a,0x6a0000aa),LL(0x38e0dc0b,0x49547c15),LL(0x3dbece21,0x5c37a1c3),L_(0x0000000e), LL(0xeab56de1,0xcb15a8e3),LL(0x8e0ff0fc,0xc00352a7),LL(0x0dae3bf3,0x716e7d48),LL(0x273cee30,0x83dde892),LL(0x00962a42,0xe18ae53b),LL(0xcb2ce674,0xb8c78835),LL(0x12176412,0xc6faee27),LL(0x94e0f5e7,0x2f8a2462),L_(0x000000f7),
+ LL(0x78569761,0x266d871a),LL(0xe7df9590,0x015aa94b),LL(0x4e8bbf72,0x150482ac),LL(0x12880439,0xaa4b2f7c),LL(0x53495f23,0x5ef777bb),LL(0x04a67481,0x38a798c0),LL(0xc7aadc88,0x308a425c),LL(0x2ccb5f57,0x0a9adc43),L_(0x0000005b), LL(0xb506af85,0x718ebc6c),LL(0xdd21e3a6,0x2c50bba9),LL(0x56098fde,0x7b6e3c4d),LL(0xa8a72185,0x02f4d7a4),LL(0x9218f9c4,0x55530e5d),LL(0xa541a6f2,0xbf7b3c63),LL(0x97421bb0,0x04f0181b),LL(0xe7a08f28,0x1e51023d),L_(0x000000c8),
+ LL(0xb7a89c2a,0x59bf73de),LL(0x701684bf,0x59572fc8),LL(0x8134fb14,0x116042d5),LL(0xc2db37ef,0x49c61bec),LL(0xf05c9753,0x0b65e976),LL(0xbbefa454,0x3b1cd2a7),LL(0x2cb97f65,0x790f0086),LL(0xc011e095,0x388368d8),L_(0x000000c2), LL(0x170eba17,0xc6e8d2e1),LL(0x609e9ebc,0xe69224f6),LL(0xa74251dc,0x88ae4a2d),LL(0xf5331e8f,0xf73bb04a),LL(0xfb6fb779,0xf42091f4),LL(0x7aa76758,0x23ea8c88),LL(0xf921d2fe,0xb43fc164),LL(0xb83f6c60,0xf692414b),L_(0x000000f9),
+ LL(0xb2f332da,0x1235350c),LL(0x3fc1272d,0x28803380),LL(0xcc94724d,0x52679e63),LL(0xa1b6d063,0x5f59afa4),LL(0x8fd15f1d,0x1998f9ec),LL(0x67514283,0x856a5843),LL(0x0b1f071f,0x44e35d97),LL(0xa4396ed8,0x12b07c24),L_(0x0000015d), LL(0x209d5128,0x36d77579),LL(0x3d71f02d,0x6903b9cc),LL(0x242255da,0x255e80b9),LL(0x0d577ece,0x8c99ca99),LL(0xcce7a8ce,0x6e67b351),LL(0x8274de19,0xb1789c3b),LL(0xd9d46d98,0xb68f17a4),LL(0xbe658d62,0x4303e990),L_(0x0000003f),
+ LL(0xb2d11384,0xc0e43052),LL(0x18ea1e36,0x6499f986),LL(0x67f0543f,0x6c81b7cb),LL(0xfe7f0035,0x0049686c),LL(0xc866a608,0xd1d9672f),LL(0xad63f7a9,0x402ddc59),LL(0x0430d4e2,0x90a63a4e),LL(0x212afc89,0x76142f1f),L_(0x0000016b), LL(0xa5a4f004,0xb4669198),LL(0xe3c06d85,0x9dbced32),LL(0xd46b4406,0x6dc0df8d),LL(0x13bbdb5b,0x26fe23c2),LL(0x9e72fe86,0xf3f82db4),LL(0x9908a610,0x21de6fb9),LL(0xacd7a7dc,0x84215e98),LL(0x8d6e691f,0x6fc1bb6f),L_(0x000001a9),
+ LL(0x6a2a68fa,0x1a45088f),LL(0x097c3677,0x93e569b4),LL(0xf6248b6e,0x76442347),LL(0xf5aa90b0,0x7db67859),LL(0x47468b1b,0x0335b7c8),LL(0xc14d722e,0xbdb192bb),LL(0xa89357c4,0x6091e296),LL(0xabbee708,0x6196a7a6),L_(0x000000b7), LL(0xb79d5c35,0xfa81b0bd),LL(0xb8c1d912,0x9c98ad08),LL(0x6f43a564,0x487e8e86),LL(0xb8305a15,0x68d70b11),LL(0x4f253374,0xda0a3387),LL(0xc3ee2674,0x12970085),LL(0x7d1dcff2,0xabf94fcc),LL(0x3abb8f41,0xaeb5fcca),L_(0x0000004b),
+ LL(0x43ae6f56,0x2ecfea4f),LL(0xbfbd972d,0x1717ff60),LL(0x50d6adf6,0x54f2d354),LL(0x6c6e24d6,0x2e42a5a9),LL(0x8ef967c8,0x2c029c93),LL(0xef490e17,0x74b0a604),LL(0x3a515366,0x835d8fbf),LL(0x878ca8ab,0x312194f9),L_(0x000000f2), LL(0xb19f5e63,0x0a7f849d),LL(0xe7343af4,0xa13e0960),LL(0x93d2a93e,0xd7e39973),LL(0x58e4acec,0x89b42cb1),LL(0xb14fea72,0x128188b6),LL(0xaf37faab,0xfe8c3b50),LL(0x51d9f7ee,0x2b121d0a),LL(0x5997d399,0x6e0873a5),L_(0x0000004b),
+ LL(0x70a88d95,0x0ae00340),LL(0x2c6b6f8f,0x941fb569),LL(0xd4a8a83d,0xfd77e569),LL(0xfe3e5239,0x2906296c),LL(0x5d2269e6,0x779ada15),LL(0x65afaeca,0x46fce296),LL(0x41d7fedd,0x0ceb36d9),LL(0x39bc7e8f,0x8c21b413),L_(0x00000081), LL(0x5ebed878,0x04b873d1),LL(0xb3e0c338,0x061d2bb8),LL(0xd36ffa7e,0x596e92bc),LL(0xbde7e857,0x58c9a5ab),LL(0x78a8b297,0x34780b9b),LL(0x6bd40718,0xac60511a),LL(0x2d3c02e9,0x83e6ac72),LL(0x6d092687,0xb6802b12),L_(0x00000070),
+ LL(0xfd72e9bb,0x99783135),LL(0x67ff52e3,0x8dc913fd),LL(0xab427847,0x8986e4a7),LL(0x5377b12a,0x8a8d9fc8),LL(0x57fef8f8,0xb61bed13),LL(0xf189dc79,0xd4bb14a1),LL(0x2e6d28f7,0xcd3d6f13),LL(0xf00e6579,0x74cb87a6),L_(0x00000146), LL(0x14efe417,0x9fb6caaf),LL(0xabbb19b6,0x951205f5),LL(0x787b1023,0x440fd20f),LL(0x4968e195,0x6d5f6164),LL(0x33cbed34,0xa2722dcb),LL(0xf576c320,0xbddf2d94),LL(0xb80ba0c8,0x414feeda),LL(0xeb25ced6,0x5a089c08),L_(0x000001e8),
+ LL(0xaa61ebad,0x6aced3dd),LL(0xe5fe2dd4,0x0bd3e3fd),LL(0xfe14f9f4,0x09520569),LL(0xd818d1a2,0xb4968b88),LL(0x82f0bdc9,0x0b8b7732),LL(0x6520e3de,0xfe9e8edc),LL(0x272ff767,0xbc017cf0),LL(0x0f65dc99,0xc5848eda),L_(0x0000013d), LL(0x0a9b50b0,0x4ea634ab),LL(0xe6308ff0,0x7b191db6),LL(0xee04399a,0xddea9de7),LL(0xda7bdea8,0x492d45e6),LL(0xb54c55ae,0x39e666b7),LL(0xf573f4e9,0x0c925a51),LL(0x0292c159,0x71f91622),LL(0x80fc7f50,0x8069f2d3),L_(0x0000007b),
+},
+/* digit=101 base_pwr=2^505 */
+{
+ LL(0x53639a92,0x1ce7b1b4),LL(0x1474fb3a,0x0d260e43),LL(0xaefab808,0xc4e32954),LL(0xfaf9e670,0xb5bae76d),LL(0xde42d0d7,0x9eb4687f),LL(0x5f45bfa8,0x7d89b1ca),LL(0xba638bbc,0xc0ecce4f),LL(0x1de873fc,0x7a3238a2),L_(0x00000170), LL(0x36c9c2b4,0x318f9f96),LL(0x2cb815fb,0x6f676d6c),LL(0x7560919e,0x41cc633a),LL(0xe2d47525,0x9a79e211),LL(0xe199c599,0xfbee081e),LL(0x265f515d,0x3107dec5),LL(0xd0ea4e25,0x6f2bdc9e),LL(0x5a539ab3,0xcbfab41c),L_(0x00000122),
+ LL(0x6ffa11c2,0x1bfc6586),LL(0x1f882706,0xe25c9a78),LL(0xeb5d1a25,0x12852d54),LL(0xe5fcb1fe,0x4f331734),LL(0xd8c5dfb7,0xe48b7e54),LL(0xcfadcca2,0xe9b41639),LL(0x193402d5,0xb8e1f8c2),LL(0xc49e8f71,0xae02f348),L_(0x0000005a), LL(0x4e33ca43,0xe98a1f64),LL(0xa7cb416c,0xbd595ac8),LL(0xe328cd45,0xf8fd4eb1),LL(0xec3fd8cb,0xf768cfe8),LL(0x9eb626b0,0x476b1bbc),LL(0x069d1524,0x8d0ffe31),LL(0x220edd8d,0x2925aa89),LL(0x60b37558,0x7ea1a636),L_(0x00000128),
+ LL(0xe83c1031,0xc5cc621c),LL(0x434bc9bb,0xac957c67),LL(0x27bcbc47,0x430a3686),LL(0xace0a905,0xed2cb5ad),LL(0x38aa0831,0x0f4f5d32),LL(0x1fa3c11d,0xc48e91c9),LL(0xedbfb351,0x98229765),LL(0xdf2591e4,0xeef1832b),L_(0x000001e9), LL(0xe38e4555,0xa53bea9a),LL(0x97db1ecb,0x196518c9),LL(0x58970b56,0x6895c332),LL(0xc6b46d1e,0x0fe772a3),LL(0x18e44ad3,0x48216056),LL(0xaf1a5dd6,0x86d1933f),LL(0x18ae6deb,0xdf5a53d7),LL(0x4345a6ba,0x79fa1e4e),L_(0x000000e5),
+ LL(0x0deafce5,0xa11885f4),LL(0xf942172b,0xd640aa98),LL(0x17ce6b52,0xdc1bfcf8),LL(0x9d8e40bc,0x14a7d638),LL(0x3c804e7d,0x80e95516),LL(0x63048fa8,0x4af7c92b),LL(0x15381b03,0x88fd6851),LL(0x73ec6a96,0x79207faf),L_(0x000000ff), LL(0xf4f85d1a,0x6ba36666),LL(0xf47de871,0xfbfc6c17),LL(0xf9474540,0x70e03b35),LL(0x72b1ddc6,0xad63874b),LL(0x7f48bdd3,0xd249ea68),LL(0x6a15d7cf,0xc1614192),LL(0xe9d101f9,0xacd8d963),LL(0x1b9b1c2f,0x09164077),L_(0x000001e7),
+ LL(0xc3b944a7,0x8b0aff56),LL(0x97b94164,0xacb2b2a3),LL(0xfade0d57,0xe22c59c3),LL(0x72ad3ddf,0xd8b6f7d4),LL(0x4a332f59,0xe436d0e5),LL(0xb28ca267,0xa69516f2),LL(0xc620d57f,0xdd5b988f),LL(0xb3a24be6,0x14f91326),L_(0x00000166), LL(0x7dc7da50,0xf918114f),LL(0xa2d07106,0xb35f8ba3),LL(0xfe3e2734,0x583e00bb),LL(0x27f4b785,0x5b427e96),LL(0xb8110ec6,0x6198344d),LL(0x2666790f,0xc2f9267c),LL(0x9a6bed52,0x15a1c587),LL(0x05e6612c,0x2f681667),L_(0x0000001c),
+ LL(0xeddc635b,0xb97227a6),LL(0xf72fcd23,0xcc5023cf),LL(0x16ff8449,0x4d184e1b),LL(0xa6e3cc25,0xb6176789),LL(0x14e442c7,0x200d2b68),LL(0x147e4e2b,0x9903da3b),LL(0xa26bbf3b,0x6b6aeb08),LL(0x849b5dc2,0x06fb145d),L_(0x00000147), LL(0xbb6ef597,0x250dac2d),LL(0xac7eb4e4,0x0cadff32),LL(0xfb97f1fe,0x1e4bc394),LL(0x2549b2e2,0xa4d9b459),LL(0xc81df54d,0xedb4d3d9),LL(0x885b7f7b,0xa8c245eb),LL(0xc2642e0e,0xfd485de4),LL(0xbbbd9d24,0x16b28ef9),L_(0x00000117),
+ LL(0x82620992,0x9bdd489e),LL(0xf9ff35e3,0xe0746b33),LL(0xfea9ab53,0xc4e354c0),LL(0x5438eb93,0x660ea2e7),LL(0xe43d99e6,0x15697bab),LL(0xcb7634f2,0xacd2ac86),LL(0xcf1f1144,0xd531df3b),LL(0x2d6020c4,0xa6e4c25c),L_(0x00000082), LL(0x5eadffbf,0x79147d9d),LL(0x6799957b,0xf22818e2),LL(0xfc746f29,0x7b9b1ddc),LL(0x87c40fbc,0x5518ebb6),LL(0x12ffe947,0x9a81391e),LL(0x997b0c31,0x3a724bee),LL(0x02662680,0xe08a5f24),LL(0x1ebe1250,0x1f28a865),L_(0x00000175),
+ LL(0x3b6bccc6,0x4b51d15f),LL(0x4d9896e4,0x61b0ed08),LL(0xdf4f3be0,0xcedf84c9),LL(0x6ed8e29b,0xf45bde62),LL(0xaa49395c,0x128499be),LL(0x812a1bfb,0x30e7b9a9),LL(0x442e44bd,0xe50016d9),LL(0x251b4710,0x608c2577),L_(0x000000be), LL(0xb4c58ea8,0x8972e1af),LL(0x6a3b7639,0x2d603c3a),LL(0x64b41953,0xad6090f4),LL(0x1c1cc6d5,0x644bda3e),LL(0x79fc4551,0xe003b3c6),LL(0xc4fe3bf0,0x879a2d4d),LL(0x9f3993d4,0xd0249205),LL(0x90933a0b,0x4bf1c894),L_(0x000001f5),
+ LL(0xbaa0eb60,0x64977e8a),LL(0xed1a5135,0xdb1eee40),LL(0x7fe9e6fc,0xef595c17),LL(0xbc2a7a81,0x4d74eea7),LL(0xafbb2385,0x34f92af2),LL(0xffa66ed1,0x9f246323),LL(0x91252082,0xd49955a9),LL(0xa2901a50,0x612b9e01),L_(0x00000163), LL(0x19a6a510,0xae624c6c),LL(0xf34dd865,0xbf77202a),LL(0x6cbac9c8,0x0d692aaf),LL(0x2471eb03,0xae2ff6e2),LL(0x4e8b52f6,0xfc37aa01),LL(0x96b6740a,0x5ca85277),LL(0x4fc2258e,0x1a66c773),LL(0xd7c07ad3,0xc3b9c722),L_(0x0000014c),
+ LL(0x3efb63d7,0xb52733b4),LL(0xadb5f371,0xa39008b4),LL(0xbebb4df3,0xb7dee0b6),LL(0x6cbc3a0b,0x889767ea),LL(0x0970ea6b,0xfb4bece2),LL(0x7f67b6be,0x890b0f75),LL(0xe72afc5e,0x8395198d),LL(0x6c13b8e8,0x792b05e1),L_(0x0000011b), LL(0xcd597e49,0x85730a39),LL(0xd16d451d,0xbb9ddfb7),LL(0xc5ad35f5,0x46f1005a),LL(0x04cccc76,0xfc9aa038),LL(0x199ada1e,0x03f6f34d),LL(0x48f0a0bd,0x200aa943),LL(0x2532adab,0x83389203),LL(0xa871ac66,0x84008498),L_(0x000001a6),
+ LL(0xd09b5635,0xc63c436d),LL(0x1bf51ded,0x36468adf),LL(0x71acd515,0x98fc5e09),LL(0xf48ba93b,0xed9c3a1c),LL(0x0c6b0d79,0x01b9c574),LL(0x24610fb1,0xb968199b),LL(0xe209e9f6,0xbbce4f03),LL(0xeee7632a,0x34954c95),L_(0x00000158), LL(0x7c32158c,0xce330212),LL(0xeb40d5de,0x1694cc96),LL(0x981c6977,0xddf4fc29),LL(0x9ea41d2c,0x89f8c78d),LL(0x86af7d31,0xd67b4c4c),LL(0xf2c9d3cf,0xad9e3351),LL(0x16fcf6af,0x702ac15c),LL(0x16ccd30f,0x671dd4b0),L_(0x00000056),
+ LL(0x31986e71,0xafcb621c),LL(0xe99b97d2,0x3f65ee43),LL(0x0c39ca80,0x14bf4d0a),LL(0x4ebb930d,0x840ff2ab),LL(0x894804fb,0x76798c37),LL(0x89a1b227,0x3aa6a099),LL(0x34d5a9a4,0x6f4a66e9),LL(0xdd3ebcad,0x671c865a),L_(0x000001de), LL(0x63a60589,0x9cc5953b),LL(0x6c38743c,0x85a6854a),LL(0x08e7cd4c,0xf39a75be),LL(0x936c5fc4,0xfc799df1),LL(0x93f15bcf,0x739e6699),LL(0x4c317bf9,0x2e5c38de),LL(0x6db73251,0x427a1224),LL(0xa307eb83,0xe63f9f36),L_(0x000001b4),
+ LL(0xdc077b67,0xa1669c8a),LL(0x49cbb3e1,0xd5e45b94),LL(0x26a91035,0xe7362c4d),LL(0x3ddf32d0,0x643b77a9),LL(0x27b4f14e,0xaa5ac709),LL(0x1246b2b6,0xfed505b3),LL(0xce87322e,0x6473f9c6),LL(0xffc4c045,0xaf22c521),L_(0x00000154), LL(0x4300e539,0x1c3ea4fc),LL(0x79dff91b,0xe9151768),LL(0xe8106a01,0xced48484),LL(0xd2bbaae2,0xb0b62aaa),LL(0xec766cbf,0x4fd3762d),LL(0x3740af93,0x1969f618),LL(0xeff16696,0x481e8d46),LL(0x08f70c0b,0x17f67b91),L_(0x000001f3),
+ LL(0xe6e4ffd4,0xd4cc0359),LL(0xdeb8f8ef,0x6a7bc267),LL(0xb0f6a0db,0xceec7c5d),LL(0xbe8f401f,0x328be59a),LL(0x0120834c,0xea6a0206),LL(0x5b979c4e,0xc2f2cb42),LL(0x6693b49a,0xc70270e4),LL(0xcb7ea005,0xf0d4e23e),L_(0x000001f0), LL(0xd93cd84b,0x59acbb8f),LL(0x771ac6f4,0x37d3f220),LL(0x5f43f61d,0xe983e186),LL(0xe1ef31c8,0x66433715),LL(0xe567c88b,0x4ca008fa),LL(0x4f949b3b,0x164fa949),LL(0x7f0981e7,0x55a6f6fe),LL(0x85c2f160,0x53287c30),L_(0x00000084),
+ LL(0x0fe60315,0x778f4301),LL(0x3d35c1e7,0x42ff27b9),LL(0x4e622807,0x9ba721f4),LL(0x9122d492,0xc966361a),LL(0x0b7b9eb9,0x824265f0),LL(0xd71fbe97,0x90d81101),LL(0xf6012c22,0x3aa81035),LL(0x77c80e09,0x23ef1ac0),L_(0x000000e1), LL(0xc562080c,0x0edd3c7c),LL(0xd4bfec34,0x6ac1e8f3),LL(0x8628425d,0x3dfaff6a),LL(0x6eeb0125,0x2bd725ab),LL(0xf2cb02f5,0xeb0228d9),LL(0x63e15d94,0x41589407),LL(0xaa99cd36,0x94061e78),LL(0xf8ab88d8,0xbd436309),L_(0x00000047),
+ LL(0xb83d39ba,0xfe497366),LL(0x1a08bb8d,0x3fb2e32d),LL(0x68fadea4,0x90040dcc),LL(0xc78d9e5b,0x6201359b),LL(0x8999242f,0x4ca94e09),LL(0x83f1e38d,0x3e9a9377),LL(0xf5e42def,0xc5c271ed),LL(0xd3d42e09,0x57d11cda),L_(0x00000043), LL(0x7f14caf1,0x52b71020),LL(0x42fb2920,0x840b578b),LL(0x4e0acb78,0x9f5c859d),LL(0xbd1059c6,0xf5ce1fef),LL(0xdfc0d187,0xd99b98e1),LL(0xb702018d,0xd9d695b6),LL(0x7056ff1f,0x1187f703),LL(0x73121d9b,0xc912e80b),L_(0x0000016f),
+},
+/* digit=102 base_pwr=2^510 */
+{
+ LL(0x89622bfd,0x12bebe9c),LL(0xcafd2ca2,0x487abee2),LL(0xd290457b,0xc04143f4),LL(0x05d13bf4,0x716aab7d),LL(0x067f0ae3,0x7740d413),LL(0x5925a309,0xebe6d02d),LL(0x14370b8d,0xe8ef2c27),LL(0xfae20be9,0xdcc77fcf),L_(0x000000f4), LL(0x8d09dc72,0xb463618a),LL(0x49d83802,0xe00f8249),LL(0x50666aae,0xd5a21e88),LL(0x54be3730,0x258522a3),LL(0xa6ce164b,0xbf3fd223),LL(0xfefa386c,0xb7ba5ba4),LL(0x479bc6a0,0x378ecff5),LL(0xece410bb,0x58171ec6),L_(0x000000fd),
+ LL(0xb8ebdae4,0xfcc42342),LL(0x0addd068,0x2e8a76fa),LL(0x1ba58a99,0x972d98aa),LL(0x585d2056,0x5a290a6f),LL(0x51a66712,0xa47990be),LL(0xab19e664,0xe44696be),LL(0x2f64d1c3,0x490ab4a2),LL(0x0b8ce484,0xf862854a),L_(0x0000012f), LL(0x0acf9a53,0x3b3fd199),LL(0xdaaafe7e,0x1c1f1592),LL(0x3015bdb3,0xadb01684),LL(0xb2dbb2d0,0x670d1295),LL(0x3f77ef5d,0xb3f98aca),LL(0x51408bf1,0xb5280fd3),LL(0x0b5ee9d3,0x3a7a5866),LL(0xe5879122,0x2a28af86),L_(0x00000111),
+ LL(0x2aa4eb8b,0x719fd8c6),LL(0x2ae67788,0xd8b75613),LL(0xd4b10cdf,0x691c837c),LL(0x7871303d,0x169b2b0b),LL(0x0d01af02,0x6b821f74),LL(0x33573229,0x82eb3840),LL(0x782b872c,0xef815609),LL(0x64bda6ba,0x9ad650a9),L_(0x00000087), LL(0x654fa37e,0x9665a8db),LL(0x761f0aa2,0xe37a4531),LL(0x4eac5b19,0x586ef6d9),LL(0x886dc010,0x014c7183),LL(0x075d0e7c,0x55263f06),LL(0x8a38c3bb,0x5b8b13c3),LL(0xf18380c5,0xcefec3fb),LL(0xb50c9c44,0x64a25aec),L_(0x0000009b),
+ LL(0x5131c51f,0x65ab5849),LL(0xd5115c76,0x8739b754),LL(0x840523eb,0xb96b253e),LL(0x8a1f77e3,0x765d9707),LL(0x8742a046,0x7e942e5b),LL(0x1539823d,0x0b3194bd),LL(0x560b9978,0xb52679bf),LL(0xbda6ff32,0xb360761a),L_(0x000000b6), LL(0x92820e93,0x881e08a8),LL(0x208f9f2c,0x7e5fd839),LL(0x4e86968c,0x305d2580),LL(0x76aeb554,0xb44037fc),LL(0x24c686c9,0xb80d02e0),LL(0x20e62e51,0x5774d5a6),LL(0x653df90e,0xf0000eae),LL(0xc9b31961,0xdb5b072a),L_(0x000001cc),
+ LL(0x0eaaf4f9,0xfbc7cc75),LL(0x23c2ade5,0xd4d5bade),LL(0x734024b7,0xaca16532),LL(0xb04a1289,0x748144eb),LL(0x599436fa,0x2dc69353),LL(0x292c7b3d,0xe403f7a9),LL(0xb831d302,0xb390c4b2),LL(0xefcb4c53,0xe756ba3e),L_(0x000001d0), LL(0xe0c0eb7f,0xf6a7b102),LL(0x411f77a6,0xc71476dc),LL(0xae920f7c,0x2edbab42),LL(0x28d62eb0,0x3c6b13bc),LL(0xc5296531,0x35b583ce),LL(0xfb32a342,0x66e0af0c),LL(0x23a5daad,0xa449b545),LL(0xa7558c28,0x50f4b633),L_(0x0000017a),
+ LL(0x6383559c,0x52741d3a),LL(0x6d33fc8c,0x98c5775c),LL(0x595adc9e,0xdeefc5ad),LL(0xc4827819,0x94326f99),LL(0x384312e5,0xc9b59642),LL(0xfb777603,0x6642d1f6),LL(0xfebd7a7d,0x04e71c64),LL(0xd51e2c8e,0xa96e4272),L_(0x000000a5), LL(0xfe188e45,0xc6c9a2ae),LL(0xcfd37d07,0x870985c6),LL(0xb64a1b0a,0xf54e2700),LL(0xd57c3e8a,0x97a88233),LL(0x4ccc22c2,0xe7db1ecd),LL(0xfff2895e,0xb9be3600),LL(0x2a410545,0x8934c5cb),LL(0x71986e7a,0x545e296c),L_(0x000001f3),
+ LL(0x8664ea8c,0xb006fef1),LL(0x18fac77e,0x2d10f805),LL(0x144d6d0c,0xcefe66ce),LL(0x7ca13881,0x6bc51a22),LL(0x93e1d2aa,0xfe6fc406),LL(0xdde6594a,0xcfe90933),LL(0x92333bca,0x2f2f839c),LL(0xf1434e7e,0xf4d730b9),L_(0x0000013b), LL(0x84887df0,0xbd49b873),LL(0xf75f870f,0x4f7c90e8),LL(0xe89d9ed4,0xf464a50f),LL(0x9a76a69e,0x3d9a6cbe),LL(0x0a745d9f,0x0f9b1034),LL(0x87bec297,0x5fe8ae9e),LL(0x7f1ab569,0xad783c5d),LL(0xea58b4b0,0xd37c5e74),L_(0x00000042),
+ LL(0x9ff8d786,0x35735942),LL(0x05d76bb3,0x995f4b0a),LL(0x58d0fe01,0xe40e0f1c),LL(0x21dccd2e,0x3af9c629),LL(0x40ab0ca3,0x074069c3),LL(0xa30b637c,0x098a102f),LL(0x44888bc2,0xde377018),LL(0xb2e96e33,0x2f69ed6c),L_(0x00000012), LL(0x0f70d506,0xe57ed3ba),LL(0xe59c4f2c,0x2492cf26),LL(0x5879a0eb,0x3d130599),LL(0x75760ae9,0x4103b206),LL(0x89f9d0d0,0xa2b74089),LL(0x4b0ad618,0x723e7b44),LL(0xab5c813e,0xebb80451),LL(0x305a1f27,0xda320616),L_(0x00000152),
+ LL(0xd06cea6e,0x063477df),LL(0x7ad6ed83,0xdfc2e4d9),LL(0x7d58a8ed,0x1a10d461),LL(0x9fae700f,0x9ad7943b),LL(0x37aee0fa,0x575deb90),LL(0xef0a0865,0x926de4b2),LL(0x3a26c380,0xc5d7be4b),LL(0x910a980d,0x050f79a4),L_(0x000001a0), LL(0xdc85a306,0x8a336a7f),LL(0x078dd7d7,0x3626cc20),LL(0x5cdeb063,0xc2b171da),LL(0x273ae54e,0xab82b41f),LL(0x10b49e9f,0x9d867301),LL(0xca9e1b59,0xe2e4e776),LL(0x7eb0c998,0x2437d70b),LL(0x3320fabf,0xf9bfec6b),L_(0x000000cd),
+ LL(0x7b0fa120,0xb86bacca),LL(0xfbcd14e3,0xa097b60e),LL(0xd21921a2,0x57795942),LL(0x96c19ceb,0x8537f555),LL(0x2145d8ff,0xe5e61d05),LL(0xc2c7c89b,0xbe0f1c2c),LL(0xb88cf04d,0x77a2f17b),LL(0x47c65308,0x9d259bd7),L_(0x00000141), LL(0x9b1b0b2e,0x3ba530cb),LL(0xac5182ed,0xea3a3af8),LL(0xfa4f9dd8,0x03a0d517),LL(0x7b2d9856,0x2bd4dfe1),LL(0x6d8ccb18,0xa68f896d),LL(0xc8c4d1ec,0xa1acec0c),LL(0x0fdaed1a,0xdc43340b),LL(0x1a6552ac,0x0d7c6ed7),L_(0x0000018d),
+ LL(0x1cfe1d00,0x35fc4f26),LL(0x06e2cd4f,0x7dce43d2),LL(0xfe4a6fd7,0x8884f4ad),LL(0x8bc475be,0x9fb2b07e),LL(0x9fe1c66d,0xde1173c5),LL(0xa0cf5d6a,0x6059a297),LL(0x4938219f,0x49237fdb),LL(0x01e57227,0x8887ac3d),L_(0x0000014e), LL(0x35f11932,0x63db0e8e),LL(0x431b9b60,0x0b8d8078),LL(0xdb56a2b7,0xa040057a),LL(0x856dd526,0x87409cca),LL(0x3d5f500d,0xb482e56d),LL(0xd9cd1b6f,0xbf890467),LL(0x815814ee,0xafa8c19c),LL(0x2dd2fd09,0xf9865d5f),L_(0x000000be),
+ LL(0x4ab480b6,0x71a65ccb),LL(0x061e197a,0x2360920f),LL(0xb306dab3,0x9d9428ae),LL(0xee526750,0xcbaf9d5a),LL(0xf58e47b1,0xd9a6f7e9),LL(0x696a3350,0x5af36c30),LL(0x1f66ddb3,0xeaff438c),LL(0xd4937e17,0x01e8c119),L_(0x0000000d), LL(0xac9df61e,0x22655044),LL(0x106e2b83,0x1ae7bb1e),LL(0x343bc8e6,0x99139508),LL(0xbc1e06e0,0x166453a2),LL(0x966bd6b8,0x3756d0eb),LL(0xb4bb44e2,0x3795c5a1),LL(0x625fe170,0xb7605deb),LL(0x426f42f1,0x437cc248),L_(0x000000f0),
+ LL(0x06cfe4f0,0x868d9076),LL(0x47442b11,0xec69d70f),LL(0x7bd07599,0x5e554262),LL(0x4c93a1e5,0x9ba31acc),LL(0x5fa3f8f0,0x5118c586),LL(0xed99e567,0x9ed35f7d),LL(0x9e3fd347,0xce15a315),LL(0x0a315f79,0x0ccab1ce),L_(0x00000149), LL(0x86dda811,0xb40d1386),LL(0xb2f0ff2d,0x0d2ec043),LL(0xc03a536d,0x01fe94d1),LL(0x753c381c,0x6d3c523b),LL(0x468beaaf,0xeb47f9a1),LL(0x5d8bebfe,0xeaf18315),LL(0xb071abcd,0x1a924dbc),LL(0x3c1a4715,0xe7415280),L_(0x00000062),
+ LL(0xcce52519,0xd9a705a8),LL(0xef1ab816,0xb6139e2f),LL(0x4fdd8131,0xdab1fe19),LL(0xf7fb9e55,0x94460d6e),LL(0xeb0d1405,0x6a211783),LL(0x6ba4226e,0x8b3a8c56),LL(0xf2eeb428,0xf7e95eb9),LL(0x0b4ffc60,0xd9357daa),L_(0x000000d1), LL(0xe66a7792,0x7209db94),LL(0xdb0eb453,0x0352a746),LL(0x3c883ac1,0xdd4b846f),LL(0xb4107c7d,0xe960d5ec),LL(0xf20e2f77,0x61292f8f),LL(0x8b9e3ba1,0x85963097),LL(0x1218ba8c,0xbba1103f),LL(0x61201057,0x9bfd2fd3),L_(0x000001f6),
+ LL(0x08fb83e5,0x0419bb93),LL(0xc48ce791,0x7a851af1),LL(0xd3ade5e1,0xedcfe59c),LL(0xbf3e625d,0xd7763ab7),LL(0xd2c5aaf2,0x625d14ad),LL(0xb7b3d23e,0xbf8e7638),LL(0x7079ecb0,0xc7d9e9b0),LL(0x9c8fcf47,0x59d7dc01),L_(0x0000010d), LL(0x074d6a10,0xceed2d69),LL(0x1a1995f3,0x61d18bb0),LL(0xf02767e3,0x33398884),LL(0x68db2be1,0xbdeb7872),LL(0x3e3fa104,0x82f62909),LL(0x2e4ab79a,0x55582545),LL(0x67badda6,0xa7bb473e),LL(0x26c76ce9,0x5ab23400),L_(0x00000118),
+ LL(0xc0ebb49b,0x76edd0b2),LL(0x7ef78c95,0x089746d8),LL(0x86ff89a1,0x30dee546),LL(0x51992a8e,0x8362adcd),LL(0xafcb70ff,0x883f2631),LL(0xa55108d8,0xa13e25b5),LL(0x93138472,0x1fd32baa),LL(0x64387fbe,0xdb1b0497),L_(0x00000116), LL(0xe8652373,0xe1299928),LL(0xce8fd7e9,0x16c54d21),LL(0x938b0123,0xad0e62d7),LL(0x4d602bac,0xf9df41ce),LL(0xc55138cb,0x25dfe098),LL(0xbc01e0e6,0xbf9a6851),LL(0x2bdbc63d,0xa70b0da1),LL(0x8b07ceba,0xe5f9aaec),L_(0x000001a1),
+},
+/* digit=103 base_pwr=2^515 */
+{
+ LL(0xaca511d0,0x698e16fa),LL(0xcb4d0031,0x2e96a74c),LL(0x7b609854,0x679b8501),LL(0x87d91373,0x6f39c358),LL(0xa39fd4a5,0x3aea2bb2),LL(0xc7eef60f,0x4e8edd3f),LL(0xd4812888,0x89e1d001),LL(0x2f4d1fa9,0xc5d59373),L_(0x0000013b), LL(0x0a629c27,0xd6fdccbf),LL(0x6bc14652,0x5f32800f),LL(0xd29c1358,0x69e7f62a),LL(0xf3a9fdce,0x9418d0db),LL(0xdaa9f4b6,0xf492796f),LL(0x525ae5fe,0x32f4a27a),LL(0xd91d1353,0xcc1a7293),LL(0xdc6b1bb1,0xb6f6d6fa),L_(0x0000010a),
+ LL(0xe776fe9e,0xe46e8257),LL(0xc90ea2e2,0x285dece1),LL(0x02e70a0d,0xd2e4f07e),LL(0x9e22652f,0x7fb0667d),LL(0x5325ca4b,0xe36daaa9),LL(0x04df1305,0xeebe9d3d),LL(0xfcd0755f,0x570e3be0),LL(0x4f74e603,0x821555f7),L_(0x00000096), LL(0xb8a7ff33,0x37b93b28),LL(0x02791127,0xa408dc4f),LL(0x219fcf52,0x7589c78d),LL(0xbf0f03e3,0x0bb10f8f),LL(0x8d6cdb0c,0xd517b4d7),LL(0x99047428,0x37e06b1f),LL(0xa69f3aed,0x98f8786b),LL(0x8624d396,0xb0e28b50),L_(0x000001e2),
+ LL(0xa4ea5b5a,0x734ae209),LL(0x90fc2a73,0x5823b56b),LL(0x7673ea6e,0x7dbb26e5),LL(0xd6657bcd,0xd1742aca),LL(0xc34cd032,0xe888df76),LL(0x8065b09e,0xa8dad269),LL(0xc00f61b1,0x3a07c5aa),LL(0xd150d657,0xd3b84038),L_(0x000001ea), LL(0xd0a14535,0x608fa78a),LL(0xfb7e5603,0x1e082856),LL(0x643ad480,0x7bf543a7),LL(0xf5b0db8f,0xfadd24cd),LL(0x7206f2c4,0x1806c9ff),LL(0x3a60a387,0x0a68bae7),LL(0x1164c0d4,0x51de4b72),LL(0xb512a4da,0x80339476),L_(0x00000027),
+ LL(0x77314e66,0xc35e0de9),LL(0x4220d9f5,0x86281b42),LL(0x69b8f421,0xe5f95c9d),LL(0x5fd90a74,0x9a89c707),LL(0x8c09fc49,0xe12f3480),LL(0xa6764b64,0x8c161166),LL(0x886f3c36,0x55f40cf1),LL(0x68ad8aaa,0x5a680c49),L_(0x000001fd), LL(0xf91f4bec,0x489002d4),LL(0xe8177d77,0x1759ca38),LL(0xe14e5a1f,0xab2e759a),LL(0x9005868d,0xa02b4128),LL(0xaa1dff8c,0x2b9cd06e),LL(0x12d6a4d8,0x578741ea),LL(0x641aef64,0x1a343e8d),LL(0xc6a85c8b,0xf21792d4),L_(0x0000006c),
+ LL(0x4fe44c0c,0x7a97ea09),LL(0xec2c9500,0x455f3253),LL(0xa4bedbb4,0x902e1815),LL(0x27a1df89,0xfb3e392c),LL(0x120f8330,0x583ac267),LL(0x9a9698e2,0xe8c87240),LL(0x675c3030,0x32adecb4),LL(0x4f7fb620,0x5c2ea4c6),L_(0x000000da), LL(0x56a1c202,0xb86d1cd8),LL(0xdab68ef9,0xed63845f),LL(0x1723eef9,0x480f0cda),LL(0x7a1853f8,0xb146da6a),LL(0x7337ff75,0x4dd1db53),LL(0xd3685d26,0x41863100),LL(0x9ea6ba31,0xef5caeec),LL(0xa06b6815,0x5f4a92e2),L_(0x00000080),
+ LL(0xfa7c3363,0xf791b828),LL(0x5836e010,0x69b98b78),LL(0xba2d3b6c,0x504f9367),LL(0xcea4290d,0x5860835e),LL(0xf3dd0621,0x22ac6245),LL(0x208bde66,0xd8153e71),LL(0xd2a1a552,0xcd91cd77),LL(0xc7df7c52,0x167e37eb),L_(0x00000134), LL(0x0bfe4e12,0xfdf620f3),LL(0xe9aa6d05,0x78c9c26d),LL(0x7d0e875e,0x581fef3a),LL(0x45acf57d,0x4f2f3f1f),LL(0x89769d1b,0xb516d4fb),LL(0x7161f8a2,0xa50e2afa),LL(0xa831731c,0xa569ea98),LL(0x69e2a679,0x5909da40),L_(0x000000d1),
+ LL(0xafc78e61,0x4dc242cf),LL(0xb32ad972,0xbb40309f),LL(0x790edca8,0x89505a9a),LL(0x3c060f5d,0x112ba1c3),LL(0x52485cd5,0xc5bdc888),LL(0x9feed1cd,0x68110e28),LL(0x49202782,0x49d8d8e4),LL(0x7cea44e5,0xc5447530),L_(0x0000006c), LL(0x33e94828,0x54f9b84f),LL(0xdd82a038,0xf69e1a64),LL(0x9e8e50f3,0xf1691b4d),LL(0x13fe2932,0x5ffe5329),LL(0x032ff352,0x51f4070a),LL(0x9dcce305,0xc3145c5b),LL(0x62f1400d,0xd89cb5eb),LL(0xbef8bde9,0x4f571517),L_(0x000001e0),
+ LL(0x37573b5a,0x464e098a),LL(0x2eac199e,0x4b6ae9bd),LL(0x41109e44,0x96c7e839),LL(0x638c7109,0x99e6beb3),LL(0xa5b03740,0x0943a1c3),LL(0x8490e0cd,0xfab6ecb1),LL(0x4e71bae8,0xb69f0eb1),LL(0x29f06246,0x366f7112),L_(0x0000016d), LL(0x536e2d86,0xa2a3d8ca),LL(0xf4f50e4b,0x4c428120),LL(0xcb6eaa4c,0xb4203e5b),LL(0x69871129,0x6da13d6c),LL(0x218bdacf,0x4f621f85),LL(0x52046a31,0x1ea900e8),LL(0x3a13fa03,0xc7d28019),LL(0x167b70a8,0x1f519437),L_(0x000000b7),
+ LL(0x2bdb447a,0xae8792f8),LL(0x63aef018,0xae6cf0fd),LL(0x3291cfc7,0xe0ee5c02),LL(0x3ae122af,0x5bd690e7),LL(0xff276537,0xbc3516ac),LL(0xf83b9879,0xa4255fcc),LL(0x05236d5e,0x4ca14e35),LL(0xaf60c6b5,0xea86970d),L_(0x0000000a), LL(0xc17c08e7,0x737de42a),LL(0xac0df2a7,0x520e48ce),LL(0xaceb43b8,0x2f791d6a),LL(0x57fe87f0,0x662b9dfe),LL(0xc51cfa7c,0x884ed1f4),LL(0x75a9efdd,0xb5ee76b0),LL(0x3f9fe081,0x61e43ed8),LL(0xb9598115,0xd8cbf7b1),L_(0x000000fa),
+ LL(0x82e47d41,0x1c1e4e8c),LL(0xf692383c,0x819d110b),LL(0x0caaa47b,0xcb280e34),LL(0xf6e315e8,0x49f5a7e4),LL(0x68659604,0x6db3e3bf),LL(0xc18d2a73,0xb38233a8),LL(0xab54c2d8,0x216ab95c),LL(0x670af6e7,0x053a27b4),L_(0x00000154), LL(0xf79cd8d1,0x95f873cc),LL(0x8946ec9e,0xd4ae259b),LL(0x352c8cec,0x6383026a),LL(0x4b6773b4,0x574f14c8),LL(0x7327edc3,0x43f9e116),LL(0xfc2d9802,0x58a2e8d3),LL(0x26360b9c,0x2ae789b4),LL(0xeac487c7,0xe5e4384b),L_(0x000000bb),
+ LL(0xcfa66e36,0xe576c7d6),LL(0x40446421,0x5a9fe083),LL(0xa7e0a9d1,0x43da69bc),LL(0xcd5cfda4,0xaca35d4c),LL(0xdb98b2d8,0xcc88e119),LL(0x238da31d,0xe775938e),LL(0xd74d2fe0,0x0e845777),LL(0xee458b07,0x2ecae686),L_(0x00000070), LL(0xfc21befe,0x6f8ded71),LL(0xf57aacc7,0xa1f5602a),LL(0x8a4a8706,0xdf77dad6),LL(0xe88d5556,0xf0fb8eab),LL(0x38891e24,0x3a9313c2),LL(0xd33f4e50,0x4e334d02),LL(0x267f4849,0x45dbbeac),LL(0x7b8b078d,0xd3a28c1d),L_(0x000001d0),
+ LL(0x77a504d7,0x706161d0),LL(0x0d717bec,0x8d3f449e),LL(0xcd6aa437,0x4c327553),LL(0xbfa09758,0xecfed023),LL(0x131032e9,0x4abfe666),LL(0x2301de73,0x972524c6),LL(0xd67cd7b5,0x1b68a20a),LL(0xd8e4bd98,0x51e331d7),L_(0x00000142), LL(0xa0dd411d,0x136bd0f9),LL(0x8521a20a,0xe9c06f6a),LL(0x34117a07,0xb1417701),LL(0x625cc2c0,0x534fecc6),LL(0xe6f01c93,0x698e9742),LL(0xcea5bcd3,0x43a9724a),LL(0x54b554d5,0x77820ced),LL(0x7954cbcc,0x90ac105a),L_(0x000000eb),
+ LL(0xef4a4c48,0x67e62639),LL(0xef609727,0x91ba0b01),LL(0xc40bb739,0x7f62ccbc),LL(0xb7eda85e,0xb14485bc),LL(0x2a55f22b,0xeab4bc94),LL(0x091f3fde,0xb13e2d7b),LL(0x72b44ddf,0xa6958062),LL(0xd4d990ab,0xeb252caf),L_(0x0000000e), LL(0x14ea0dda,0xc0e83ba2),LL(0x10cf6ee9,0xc9f677ef),LL(0x8e3eae8b,0x1862146e),LL(0xcfe0b037,0xa6cdb8a8),LL(0x6d8e5bd3,0xf50d8419),LL(0xdd3f0ea7,0xf42ab2a9),LL(0x8a6b5e3c,0x12f65451),LL(0xe62ff71b,0x2007b697),L_(0x000000af),
+ LL(0x0460a7ae,0x6526a7b4),LL(0x80ab037a,0xf752335e),LL(0xf14c43bd,0xd11a8f65),LL(0x9b989eab,0x23fa924f),LL(0x0976a80f,0xf16dad87),LL(0x4e440171,0x3baaac45),LL(0xb9635c0d,0xf0f34704),LL(0x0e1ca863,0x515f651b),L_(0x000001a3), LL(0x40fcc076,0x420a4e5f),LL(0x24cf57e8,0xcec847e3),LL(0x1f189869,0xb20db2fe),LL(0x27f88dee,0x48712498),LL(0x423c17a4,0x284e6344),LL(0xfe029568,0x10b9bfa3),LL(0xd426c180,0x07626ee2),LL(0x96cbf2d8,0x92af56c4),L_(0x0000008f),
+ LL(0x8a898f02,0x37d5f07a),LL(0x9e4691c0,0xdc3f3126),LL(0xb1ce0f65,0x81c10b29),LL(0x73e7fd11,0xc595f2a8),LL(0x5a3fd848,0x47d0e340),LL(0x439d759b,0xbc668622),LL(0x87538694,0x461b9eba),LL(0x3484697e,0xa4f47f3b),L_(0x000001fb), LL(0x3d20296f,0xf99ebce4),LL(0x59fd2232,0x51ac1eec),LL(0x2fb986d6,0xe71f9d4a),LL(0xa5d1433c,0xa289f5b9),LL(0x4ece5225,0xd51b9288),LL(0x6ec5e037,0xcce86717),LL(0xb823e469,0xac199283),LL(0x45b78f23,0xb4d838aa),L_(0x0000017a),
+ LL(0xbfa48e10,0x08472093),LL(0xc8ac9e7a,0xb7492e4e),LL(0x471d73ed,0x53d1bd1c),LL(0x243428ce,0x40adeca7),LL(0xb7d49d17,0xd60077c0),LL(0x7a95c66d,0x737593cb),LL(0xf237e1e5,0x6a7c6f6e),LL(0xa7929ff0,0x984af660),L_(0x0000002d), LL(0x894bcc2e,0x7b3c416f),LL(0xa493d3e8,0x21231992),LL(0x4c0a5993,0xf376d082),LL(0x0d5c6c61,0x9e1550e6),LL(0x2a3430f2,0xf1d1beb9),LL(0x11f95e81,0x7b6bc5ab),LL(0xa78bae02,0x17858c60),LL(0xbdd9ea90,0x7b4b3f95),L_(0x000000d8),
+},
+/* digit=104 base_pwr=2^520 */
+{
+ LL(0x0b8b69f6,0xb96747cd),LL(0x3f30c14c,0x9e707ed2),LL(0x029690c8,0xd1292336),LL(0x884265ce,0x55cfec2b),LL(0xc87e6275,0xa097ab7d),LL(0xa5558f62,0xf635118e),LL(0x23dda1ad,0x5770b69e),LL(0x1b70ffff,0x4207811d),L_(0x00000181), LL(0x4f2606bc,0x8c9c6bbd),LL(0xccb92cf3,0x58d1b308),LL(0x2ce6913c,0xbbdfb6fe),LL(0x1967bfef,0xe5cb515b),LL(0x453132fc,0x2527584e),LL(0xc389b2f2,0x2a1591df),LL(0x0460d618,0x602d5761),LL(0x7498b0d1,0x0a2aedc5),L_(0x000001d3),
+ LL(0xb38cffee,0xa135a61f),LL(0x8ac17028,0x2c9fe1a1),LL(0x30418249,0x3ecb968e),LL(0x4c958b81,0x6f834a0b),LL(0x523285e8,0x54df836f),LL(0x29e4b05e,0xf77b5fb2),LL(0xe864d898,0x48371505),LL(0xcce3c32e,0x702eafb3),L_(0x000000b2), LL(0xc4a0e5e3,0xfb74fd48),LL(0x18996dc2,0x875aaa20),LL(0x5e9f86f5,0x5eb82718),LL(0x6642422b,0x87431019),LL(0xd6d6f0dd,0x9d7e7982),LL(0xcb46f571,0x346044e6),LL(0xa348c675,0xdc02d250),LL(0x517508af,0x179b19ec),L_(0x0000019d),
+ LL(0x18145140,0xded9f8c1),LL(0xba498095,0x40df2b19),LL(0x3834dace,0xa0c7dec0),LL(0x3687e664,0xfeee9a9e),LL(0x09d971f2,0xa032ee72),LL(0x07148796,0xa0b2cc31),LL(0xb65bcec3,0x46067d48),LL(0xd8c2af65,0x50cbf7f5),L_(0x0000014f), LL(0xd715c856,0x79c821c5),LL(0xbebe04f7,0x62cf6310),LL(0x3844c220,0x89986c83),LL(0x2644f899,0x43935732),LL(0xf80ac439,0xfd741ec2),LL(0x299a9f2d,0x3022b589),LL(0xbcf4790c,0xf5663af1),LL(0x767587f6,0x290c9a46),L_(0x00000161),
+ LL(0xf1cdfa06,0xda7b7826),LL(0x97fea55e,0xdd938459),LL(0xc39699cc,0x17d73f54),LL(0x5971fbd4,0x9f08e1d8),LL(0x3631f804,0x65a870ee),LL(0x51a73b8e,0xa3cdc8e3),LL(0x54f69b2a,0x85999014),LL(0x59cbe0fe,0xf12532d6),L_(0x000000cf), LL(0x085bfaeb,0x17f6a7aa),LL(0xe07f9788,0x1e5f6c61),LL(0xb271762a,0xcc6a5dff),LL(0x5d3e3cd3,0x895eb0df),LL(0x6eadd52e,0x2cd665b4),LL(0x92523b34,0x93078c5b),LL(0x2ebcff33,0x48620212),LL(0x777dd50c,0xef0f25f4),L_(0x00000138),
+ LL(0xfe3fcdbd,0x118dee98),LL(0xcfc4ad1b,0x0a524cec),LL(0x6d1ffa5c,0xe0d7420c),LL(0x919d859d,0x44af5553),LL(0xf81fb745,0x0981d6de),LL(0xa17a7c3f,0x6680c297),LL(0xe0cc4fe7,0xf6d22135),LL(0xde36e57a,0x7f521d15),L_(0x000000af), LL(0x0b8ae03f,0xac0c4195),LL(0xc2638c06,0xc994e2c7),LL(0x4523ebb6,0x49b75a94),LL(0xdb72a765,0x73310e2b),LL(0x57a73d05,0x8ce6d6b8),LL(0x1e23ae4c,0x4309eb9e),LL(0x842f06ae,0xf98aedc0),LL(0xedf71264,0x161436ed),L_(0x000001af),
+ LL(0xbe47c62f,0xd4c38f8c),LL(0x49173568,0x085a52c0),LL(0x7d057b19,0x612151d8),LL(0x2de5c929,0x8a4ea946),LL(0xc4036de1,0x0a8300dd),LL(0x5a6e290b,0x195518bc),LL(0x894ed83e,0x35e21097),LL(0xd8dd898c,0x03777a74),L_(0x000000ff), LL(0xd0eee2e2,0xc0b89ddf),LL(0x8a7bf325,0x0c5c995a),LL(0xa5131a24,0x9573e514),LL(0xe5998b6e,0x93979878),LL(0x7ba59336,0x7906f3c8),LL(0xff513215,0x093cead5),LL(0xb76588a1,0x243bc2e1),LL(0x5abc03c8,0x8eceda05),L_(0x00000134),
+ LL(0x07c9d208,0x234d2231),LL(0x524b8b4b,0xc6fe7d17),LL(0x469a9182,0x688b3e26),LL(0x35461f18,0xb0f49d1d),LL(0x78f9ef1e,0x4bb2130a),LL(0xe72b7216,0x9240661e),LL(0xec1e4e46,0x294674d4),LL(0x95346b15,0xe96fbdf1),L_(0x00000020), LL(0xa594d4cd,0xf533e3fe),LL(0xdb75a21c,0x99051c26),LL(0xea1a808b,0x9c10237a),LL(0x230cfcd1,0xe6396566),LL(0x90aedfcf,0x18cdd934),LL(0x8c399655,0x446502d8),LL(0x0de6be10,0x4a6de065),LL(0x7b3640aa,0xd5c12c48),L_(0x00000057),
+ LL(0xf6315f2c,0xf2e07c55),LL(0x62ee6844,0x9040fc8f),LL(0xaf168881,0xaec6bb02),LL(0xa1922677,0x968e4dee),LL(0x53b90132,0x92b21f9e),LL(0x2b9cb75f,0x4ae4c1d6),LL(0x65408d1b,0xd20f3732),LL(0x70be8f94,0x7640413d),L_(0x0000009e), LL(0x05c00995,0x4e16ae2b),LL(0xf20b5acf,0xd04ee882),LL(0x1f8c5834,0x35db5e06),LL(0xc9dbfe41,0x3a42f540),LL(0x3f7b55b6,0x500e266e),LL(0x52ce3b47,0xda6911e6),LL(0x0c53d0a4,0xee43c4db),LL(0x6052a6d7,0xa358b994),L_(0x00000165),
+ LL(0xf7f0245d,0xc1b6e80d),LL(0xd2bf51a5,0x9077fd5b),LL(0x4a61b710,0x97dc422c),LL(0x3089abb3,0x2c00b155),LL(0x893fa316,0x40add702),LL(0xb9d804ac,0xc77985f1),LL(0xdfaaf13d,0x4150d1b3),LL(0xaf9d85b4,0x9a8fb36c),L_(0x000001fb), LL(0x92589d47,0xd0dfdf3a),LL(0x06f77875,0x6b4012d5),LL(0xfe067b9f,0x4426c933),LL(0x2ed7298d,0x5353c502),LL(0x67948217,0x156d92c1),LL(0xf0f675fa,0xee2b368d),LL(0xba020dd5,0x3367f41b),LL(0xd5aae0ea,0x95a07182),L_(0x00000049),
+ LL(0x75917fbb,0x1b52b513),LL(0x87569974,0xbeb1242f),LL(0x4a568f34,0xb03e5543),LL(0x86a66b14,0xc094f1b5),LL(0x93edd5ae,0x7da45bde),LL(0x2fb2c47a,0x960491e1),LL(0x678ce19f,0x890efc78),LL(0xf4853187,0x29999e31),L_(0x000001e7), LL(0x4363742f,0xd3a570ac),LL(0x1812091b,0x4961aaea),LL(0xd32e88d4,0x97dd4a2f),LL(0x1b33e755,0xb3987552),LL(0x79ed95a8,0x669664b0),LL(0x0837ce5b,0x3584f341),LL(0x3f9a0cc0,0x116266b7),LL(0x64a902cc,0x330114e0),L_(0x000000ed),
+ LL(0x0660e9a1,0xb0698be3),LL(0x5c045493,0xc1ca94da),LL(0x82b986b9,0x4e8d0287),LL(0xfafe7c0e,0x02cfcf45),LL(0x9235965c,0xcf187fb8),LL(0x316bebe3,0x3fb90363),LL(0xc42b951d,0xc6248aec),LL(0x26710295,0x8f1eb678),L_(0x000000d1), LL(0xc24f0956,0xa11f38e2),LL(0x398a2047,0x9a0accc0),LL(0x9e479268,0x8ccafb17),LL(0x468f61d6,0x0c01f836),LL(0x52f96c75,0xeb043b98),LL(0xacc6ee07,0xa59405be),LL(0xc63baaf6,0xeddd33c9),LL(0xba136442,0x9b13f409),L_(0x000000ba),
+ LL(0xc33b7b64,0x1eb1f532),LL(0x3bd3bca3,0x3a7aee90),LL(0x0882ad60,0xad95f2eb),LL(0xddaf31c3,0x4c9d8e29),LL(0x59c130df,0xbdd1470a),LL(0x7ac309bd,0xe3bf394f),LL(0xaafb8369,0xedba4812),LL(0x7f598209,0x46270ae8),L_(0x000000dc), LL(0xb5d505d9,0x81e772f9),LL(0xfa065dfd,0x15db5d5b),LL(0x7e590809,0x141e8679),LL(0xc4ffd236,0xf14602ff),LL(0xbf521149,0xcfd2b215),LL(0xc500a7a4,0xc04e3706),LL(0xe4c06db1,0x3e28ec80),LL(0x93d40cbc,0xd4519009),L_(0x00000117),
+ LL(0x530c705b,0x1a470405),LL(0xe8292e38,0x85b81d18),LL(0xc5fdb2b2,0x484b843b),LL(0xa859e4fe,0xeeae06f4),LL(0x4e3895d5,0x0a67c915),LL(0xe6119b5b,0xed968aa0),LL(0x9264e00f,0x66ed4c20),LL(0xbf1d85ad,0x9f2e5291),L_(0x0000016d), LL(0xd8a9d836,0xee5d4b51),LL(0xcf0b68ca,0x89ad96c1),LL(0xbcd75bca,0xae1fa341),LL(0x667fbe53,0xa297bd27),LL(0xe40caf5f,0xd6165d4f),LL(0x329b45f8,0x62d6bced),LL(0xc11413bc,0xd1c11022),LL(0x7e0d7384,0x30c070b1),L_(0x00000118),
+ LL(0xa39b851e,0xa0188e61),LL(0xf5e55bb8,0xe96325dc),LL(0x8cd5c092,0x9087223b),LL(0xe2c1a18b,0xca56bfcd),LL(0x548d8395,0x4ae67f8d),LL(0xaa6db861,0x8f44b4e9),LL(0x218ba5b9,0x317abb0e),LL(0x04386052,0x4aeffcd2),L_(0x00000084), LL(0x91b2e14e,0x6ac7c848),LL(0x5377e2b3,0xd40844b6),LL(0x9d93badb,0xe505b8cb),LL(0x4d7f3493,0x615a64c9),LL(0x20a05d5d,0x90a5eb78),LL(0xa4cb086a,0xed4783ac),LL(0x36415b6c,0xf10f3d20),LL(0x56659094,0x82883579),L_(0x0000004f),
+ LL(0x0eeb045d,0xac240867),LL(0x98145c00,0xe7ce6952),LL(0xb5d0c780,0x315dd662),LL(0x189fc413,0x41646f48),LL(0x4392d048,0xc963ad1a),LL(0x1e77199f,0xebc649ee),LL(0x83e1f918,0xcd6ca624),LL(0x13b6a99b,0x4108f969),L_(0x0000011b), LL(0x2108af54,0x0b55c26f),LL(0x3989bd71,0xe0f27726),LL(0x1e5e0053,0x5c7e0958),LL(0xa8452157,0xf8e7b504),LL(0xb64d38bf,0xf180ac5c),LL(0x8c8c65f5,0x32a84a9b),LL(0x8f00c232,0x898ca7ed),LL(0x1a1639de,0xe79d8696),L_(0x00000150),
+ LL(0x6746f213,0xe1073527),LL(0xa966b0a8,0x3ad14203),LL(0x5bc4272f,0x39620db2),LL(0xbcd33a93,0xe5eae695),LL(0x26bac2fb,0x0e4497dc),LL(0xb7d647bd,0x3a195407),LL(0x7f7ed906,0x899ce3f6),LL(0xadd76129,0x2e49d8f3),L_(0x000000be), LL(0x333eb7cb,0x51de1b18),LL(0x8e185580,0xa269b8e8),LL(0x486cd055,0x3555823a),LL(0x6689b4be,0xaa52baba),LL(0xcd8d6ffd,0xd072a45c),LL(0x9cba9f57,0xba53f86f),LL(0x74a8d5fb,0x16481f57),LL(0x10747d58,0x457baa10),L_(0x000001af),
+}
+};
+#endif
+
+#endif /* _DISABLE_ECP_521R1_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_nistP521r1_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 5,
+ /* select function */ p521r1_select_ap_w5,
+ /* precomputed data */ (BNU_CHUNK_T*)ec_p521r1_precomputed
+ };
+ return &t;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpprng.h b/ext/ipp/sources/ippcp/src/pcpprng.h
new file mode 100644
index 0000000..52620ad
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpprng.h
@@ -0,0 +1,71 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Internal Definitions and
+// Internal Pseudo Random Generator Function Prototypes
+//
+*/
+
+#if !defined(_CP_PRNG_H)
+#define _CP_PRNG_H
+
+/*
+// Pseudo-random generation context
+*/
+
+#define MAX_XKEY_SIZE 512
+#define DEFAULT_XKEY_SIZE 512 /* must be >=160 || <=512 */
+
+struct _cpPRNG {
+ IppCtxId idCtx; /* PRNG identifier */
+ cpSize seedBits; /* secret seed-key bitsize */
+ BNU_CHUNK_T Q[BITS_BNU_CHUNK(160)]; /* modulus */
+ BNU_CHUNK_T T[BITS_BNU_CHUNK(160)]; /* parameter of SHA_G() funct */
+ BNU_CHUNK_T xAug[BITS_BNU_CHUNK(MAX_XKEY_SIZE)]; /* optional entropy augment */
+ BNU_CHUNK_T xKey[BITS_BNU_CHUNK(MAX_XKEY_SIZE)]; /* secret seed-key */
+};
+
+/* alignment */
+#define PRNG_ALIGNMENT ((int)(sizeof(void*)))
+
+#define RAND_ID(ctx) ((ctx)->idCtx)
+#define RAND_SEEDBITS(ctx) ((ctx)->seedBits)
+#define RAND_Q(ctx) ((ctx)->Q)
+#define RAND_T(ctx) ((ctx)->T)
+#define RAND_XAUGMENT(ctx) ((ctx)->xAug)
+#define RAND_XKEY(ctx) ((ctx)->xKey)
+
+#define RAND_VALID_ID(ctx) (RAND_ID((ctx))==idCtxPRNG)
+
+#define cpPRNGen OWNAPI(cpPRNGen)
+int cpPRNGen(Ipp32u* pBuffer, cpSize bitLen, IppsPRNGState* pCtx);
+
+#define cpPRNGenPattern OWNAPI(cpPRNGenPattern)
+int cpPRNGenPattern(BNU_CHUNK_T* pRand, int bitSize,
+ BNU_CHUNK_T botPattern, BNU_CHUNK_T topPattern,
+ IppBitSupplier rndFunc, void* pRndParam);
+
+#define cpPRNGenRange OWNAPI(cpPRNGenRange)
+int cpPRNGenRange(BNU_CHUNK_T* pRand,
+ const BNU_CHUNK_T* pLo, cpSize loLen,
+ const BNU_CHUNK_T* pHi, cpSize hiLen,
+ IppBitSupplier rndFunc, void* pRndParam);
+
+#endif /* _CP_PRNG_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpprngenca.c b/ext/ipp/sources/ippcp/src/pcpprngenca.c
new file mode 100644
index 0000000..b8ace8a
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpprngenca.c
@@ -0,0 +1,296 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// PRNG Functions
+//
+// Contents:
+// ippsPRNGen()
+// ippsPRNGen_BN()
+//
+//
+*/
+
+#include "owndefs.h"
+
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcphash.h"
+#include "pcpprng.h"
+#include "pcptool.h"
+
+/*
+// G() function based on SHA1
+//
+// Parameters:
+// T 160 bit parameter
+// pHexStr input hex string
+// hexStrLen size of hex string (Ipp8u segnments)
+// xBNU 160 bit BNU result
+//
+// Note 1:
+// must to be hexStrLen <= 64 (512 bits)
+*/
+static
+void SHA1_G(Ipp32u* xBNU, const Ipp32u* T, Ipp8u* pHexStr, int hexStrLen)
+{
+ /* select processing function */
+ cpHashProc updateFunc;
+ #if (_SHA_NI_ENABLING_==_FEATURE_ON_)
+ updateFunc = UpdateSHA1ni;
+ #elif (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ updateFunc = IsFeatureEnabled(SHA_NI_ENABLED)? UpdateSHA1ni : UpdateSHA1;
+ #else
+ updateFunc = UpdateSHA1;
+ #endif
+
+ /* pad HexString zeros */
+ PaddBlock(0, pHexStr+hexStrLen, BITS2WORD8_SIZE(MAX_XKEY_SIZE)-hexStrLen);
+
+ /* reset initial HASH value */
+ xBNU[0] = T[0];
+ xBNU[1] = T[1];
+ xBNU[2] = T[2];
+ xBNU[3] = T[3];
+ xBNU[4] = T[4];
+
+ /* SHA1 */
+ //UpdateSHA1(xBNU, pHexStr, BITS2WORD8_SIZE(MAX_XKEY_SIZE), SHA1_cnt);
+ updateFunc(xBNU, pHexStr, BITS2WORD8_SIZE(MAX_XKEY_SIZE), SHA1_cnt);
+
+ /* swap back */
+ SWAP(xBNU[0],xBNU[4]);
+ SWAP(xBNU[1],xBNU[3]);
+}
+
+/*
+// Returns bitsize of the bitstring has beed added
+*/
+int cpPRNGen(Ipp32u* pRand, cpSize nBits, IppsPRNGState* pRnd)
+{
+ BNU_CHUNK_T Xj [BITS_BNU_CHUNK(MAX_XKEY_SIZE)];
+ BNU_CHUNK_T XVAL[BITS_BNU_CHUNK(MAX_XKEY_SIZE)];
+
+ Ipp8u TXVAL[BITS2WORD8_SIZE(MAX_XKEY_SIZE)];
+
+ /* XKEY length in BNU_CHUNK_T */
+ cpSize xKeyLen = BITS_BNU_CHUNK(RAND_SEEDBITS(pRnd));
+ /* XKEY length in bytes */
+ cpSize xKeySize= BITS2WORD8_SIZE(RAND_SEEDBITS(pRnd));
+ /* XKEY word's mask */
+ BNU_CHUNK_T xKeyMsk = MASK_BNU_CHUNK(RAND_SEEDBITS(pRnd));
+
+ /* number of Ipp32u chunks to be generated */
+ cpSize genlen = BITS2WORD32_SIZE(nBits);
+
+ ZEXPAND_BNU(Xj, 0, BITS_BNU_CHUNK(MAX_XKEY_SIZE));
+ ZEXPAND_BNU(XVAL, 0, BITS_BNU_CHUNK(MAX_XKEY_SIZE));
+
+ while(genlen) {
+ cpSize len;
+
+ /* Step 1: XVAL=(Xkey+Xseed) mod 2^b */
+ BNU_CHUNK_T carry = cpAdd_BNU(XVAL, RAND_XKEY(pRnd), RAND_XAUGMENT(pRnd), xKeyLen);
+ XVAL[xKeyLen-1] &= xKeyMsk;
+
+ /* Step 2: xj=G(t, XVAL) mod Q */
+ cpToOctStr_BNU(TXVAL, xKeySize, XVAL, xKeyLen);
+ SHA1_G((Ipp32u*)Xj, (Ipp32u*)RAND_T(pRnd), TXVAL, xKeySize);
+
+ {
+ cpSize sizeXj = BITS_BNU_CHUNK(160);
+ if(0 <= cpCmp_BNU(Xj, BITS_BNU_CHUNK(IPP_SHA1_DIGEST_BITSIZE), RAND_Q(pRnd),BITS_BNU_CHUNK(IPP_SHA1_DIGEST_BITSIZE)) )
+ sizeXj = cpMod_BNU(Xj, BITS_BNU_CHUNK(IPP_SHA1_DIGEST_BITSIZE), RAND_Q(pRnd), BITS_BNU_CHUNK(IPP_SHA1_DIGEST_BITSIZE));
+ FIX_BNU(Xj, sizeXj);
+ ZEXPAND_BNU(Xj, sizeXj, BITS_BNU_CHUNK(MAX_XKEY_SIZE));
+ }
+
+ /* Step 3: Xkey=(1+Xkey+Xj) mod 2^b */
+ cpInc_BNU(RAND_XKEY(pRnd), RAND_XKEY(pRnd), xKeyLen, 1);
+ carry = cpAdd_BNU(RAND_XKEY(pRnd), RAND_XKEY(pRnd), Xj, xKeyLen);
+ RAND_XKEY(pRnd)[xKeyLen-1] &= xKeyMsk;
+
+ /* fill out result */
+ len = genlen<BITS2WORD32_SIZE(IPP_SHA1_DIGEST_BITSIZE)? genlen : BITS2WORD32_SIZE(IPP_SHA1_DIGEST_BITSIZE);
+ COPY_BNU(pRand, (Ipp32u*)Xj, len);
+
+ pRand += len;
+ genlen -= len;
+ }
+
+ return nBits;
+}
+
+/* generates random string of specified bitSize length
+
+ returns:
+ 1 random bit string generated
+ -1 detected internal error (ippStsNoErr != rndFunc())
+*/
+int cpPRNGenPattern(BNU_CHUNK_T* pRand, int bitSize,
+ BNU_CHUNK_T botPattern, BNU_CHUNK_T topPattern,
+ IppBitSupplier rndFunc, void* pRndParam)
+{
+ BNU_CHUNK_T topMask = MASK_BNU_CHUNK(bitSize);
+ cpSize randLen = BITS_BNU_CHUNK(bitSize);
+
+ IppStatus sts = rndFunc((Ipp32u*)pRand, bitSize, pRndParam);
+ if(ippStsNoErr!=sts) return -1;
+
+ pRand[randLen-1] &= topMask;
+ pRand[0] |= botPattern;
+ pRand[randLen-1] |= topPattern;
+ return 1;
+}
+
+/* generates random string of specified bitSize length
+ within specified ragnge lo < r < Hi
+
+ returns:
+ 0 random bit string not generated
+ 1 random bit string generated
+ -1 detected internal error (ippStsNoErr != rndFunc())
+*/
+int cpPRNGenRange(BNU_CHUNK_T* pRand,
+ const BNU_CHUNK_T* pLo, cpSize loLen,
+ const BNU_CHUNK_T* pHi, cpSize hiLen,
+ IppBitSupplier rndFunc, void* pRndParam)
+{
+ int bitSize = BITSIZE_BNU(pHi,hiLen);
+ BNU_CHUNK_T topMask = MASK_BNU_CHUNK(bitSize);
+
+ #define MAX_COUNT (1000)
+ int n;
+ for(n=0; n<MAX_COUNT; n++) {
+ cpSize randLen;
+ IppStatus sts = rndFunc((Ipp32u*)pRand, bitSize, pRndParam);
+ if(ippStsNoErr!=sts) return -1;
+
+ pRand[hiLen-1] &= topMask;
+ randLen = cpFix_BNU(pRand, hiLen);
+ if((0 < cpCmp_BNU(pRand, randLen, pLo, loLen)) && (0 < cpCmp_BNU(pHi, hiLen, pRand, randLen)))
+ return 1;
+ }
+ #undef MAX_COUNT
+
+ return 0; /* no random matched to (Lo,Hi) */
+}
+
+
+/*F*
+// Name: ippsPRNGen
+//
+// Purpose: Generates a pseudorandom bit sequence of the specified nBits length.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pBuffer
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+//
+// ippStsLengthErr 1 > nBits
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pBuffer pointer to the buffer
+// nBits number of bits be requested
+// pRndCtx pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGen,(Ipp32u* pBuffer, cpSize nBits, void* pRnd))
+{
+ IppsPRNGState* pRndCtx = (IppsPRNGState*)pRnd;
+
+ /* test PRNG context */
+ IPP_BAD_PTR2_RET(pBuffer, pRnd);
+
+ pRndCtx = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRndCtx, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRndCtx), ippStsContextMatchErr);
+
+ /* test sizes */
+ IPP_BADARG_RET(nBits< 1, ippStsLengthErr);
+
+ {
+ cpSize rndSize = BITS2WORD32_SIZE(nBits);
+ Ipp32u rndMask = MAKEMASK32(nBits);
+
+ cpPRNGen(pBuffer, nBits, pRndCtx);
+ pBuffer[rndSize-1] &= rndMask;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsPRNGen_BN
+//
+// Purpose: Generates a pseudorandom big number of the specified nBits length.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pRandBN
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pRandBN->idCtx
+//
+// ippStsLengthErr 1 > nBits
+// nBits > BN_ROOM(pRandBN)
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pRandBN pointer to the BN random
+// nBits number of bits be requested
+// pRndCtx pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGen_BN,(IppsBigNumState* pRandBN, int nBits, void* pRnd))
+{
+ IppsPRNGState* pRndCtx;
+
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRndCtx = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRndCtx), ippStsContextMatchErr);
+
+ /* test random BN */
+ IPP_BAD_PTR1_RET(pRandBN);
+ pRandBN = (IppsBigNumState*)( IPP_ALIGNED_PTR(pRandBN, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pRandBN), ippStsContextMatchErr);
+
+ /* test sizes */
+ IPP_BADARG_RET(nBits< 1, ippStsLengthErr);
+ IPP_BADARG_RET(nBits> BN_ROOM(pRandBN)*BNU_CHUNK_BITS, ippStsLengthErr);
+
+
+ {
+ BNU_CHUNK_T* pRand = BN_NUMBER(pRandBN);
+ cpSize rndSize = BITS_BNU_CHUNK(nBits);
+ BNU_CHUNK_T rndMask = MASK_BNU_CHUNK(nBits);
+
+ cpPRNGen((Ipp32u*)pRand, nBits, pRndCtx);
+ pRand[rndSize-1] &= rndMask;
+
+ FIX_BNU(pRand, rndSize);
+ BN_SIZE(pRandBN) = rndSize;
+ BN_SIGN(pRandBN) = ippBigNumPOS;
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpprnginitca.c b/ext/ipp/sources/ippcp/src/pcpprnginitca.c
new file mode 100644
index 0000000..abf63cc
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpprnginitca.c
@@ -0,0 +1,111 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// PRNG Functions
+//
+// Contents:
+// ippsPRNGGetSize()
+// ippsPRNGInit()
+//
+//
+*/
+
+#include "owndefs.h"
+
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcpprng.h"
+#include "pcphash.h"
+#include "pcptool.h"
+
+
+/*F*
+// Name: ippsPRNGGetSize
+//
+// Purpose: Returns size of PRNG context (bytes).
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pSize
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pSize pointer to the size of internal context
+*F*/
+IPPFUN(IppStatus, ippsPRNGGetSize, (int* pSize))
+{
+ IPP_BAD_PTR1_RET(pSize);
+
+ *pSize = sizeof(IppsPRNGState)
+ +PRNG_ALIGNMENT-1;
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsPRNGInit
+//
+// Purpose: Initializes PRNG context
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+//
+// ippStsLengthErr seedBits < 1
+// seedBits < MAX_XKEY_SIZE
+// seedBits%8 !=0
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// seedBits seed bitsize
+// pRnd pointer to the context to be initialized
+*F*/
+IPPFUN(IppStatus, ippsPRNGInit, (int seedBits, IppsPRNGState* pRnd))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+
+ /* test sizes */
+ IPP_BADARG_RET((1>seedBits) || (seedBits>MAX_XKEY_SIZE) ||(seedBits&7), ippStsLengthErr);
+
+ {
+ int hashIvSize = cpHashIvSize(ippHashAlg_SHA1);
+ const Ipp8u* iv = cpHashIV[ippHashAlg_SHA1];
+
+ /* cleanup context */
+ ZEXPAND_BNU((Ipp8u*)pRnd, 0, (cpSize)(sizeof(IppsPRNGState)));
+
+ RAND_ID(pRnd) = idCtxPRNG;
+ RAND_SEEDBITS(pRnd) = seedBits;
+
+ /* default Q parameter */
+ ((Ipp32u*)RAND_Q(pRnd))[0] = 0xFFFFFFFF;
+ ((Ipp32u*)RAND_Q(pRnd))[1] = 0xFFFFFFFF;
+ ((Ipp32u*)RAND_Q(pRnd))[2] = 0xFFFFFFFF;
+ ((Ipp32u*)RAND_Q(pRnd))[3] = 0xFFFFFFFF;
+ ((Ipp32u*)RAND_Q(pRnd))[4] = 0xFFFFFFFF;
+
+ /* default T parameter */
+ CopyBlock(iv, RAND_T(pRnd), hashIvSize);
+
+ return ippStsNoErr;
+ }
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpprngsetca.c b/ext/ipp/sources/ippcp/src/pcpprngsetca.c
new file mode 100644
index 0000000..9949aaa
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpprngsetca.c
@@ -0,0 +1,239 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// PRNG Functions
+//
+// Contents:
+// ippsPRNGSetModulus()
+// ippsPRNGSetSeed()
+// ippsPRNGSetAugment()
+// ippsPRNGSetH0()
+//
+//
+*/
+
+#include "owndefs.h"
+
+#include "owncp.h"
+#include "pcpbn.h"
+#include "pcpprng.h"
+
+
+/*F*
+// Name: ippsPRNGSetModulus
+//
+// Purpose: Sets 160-bit modulus Q.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pMod
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pMod->idCtx
+//
+// ippStsBadArgErr 160 != bitsize(pMOd)
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pMod pointer to the 160-bit modulus
+// pRnd pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGSetModulus, (const IppsBigNumState* pMod, IppsPRNGState* pRnd))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRnd), ippStsContextMatchErr);
+
+ /* test modulus */
+ IPP_BAD_PTR1_RET(pMod);
+ pMod = (IppsBigNumState*)( IPP_ALIGNED_PTR(pMod, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pMod), ippStsContextMatchErr);
+ IPP_BADARG_RET(160 != BITSIZE_BNU(BN_NUMBER(pMod),BN_SIZE(pMod)), ippStsBadArgErr);
+
+ ZEXPAND_COPY_BNU(RAND_Q(pRnd), (int)(sizeof(RAND_Q(pRnd))/sizeof(BNU_CHUNK_T)), BN_NUMBER(pMod), BN_SIZE(pMod));
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsPRNGSetH0
+//
+// Purpose: Sets 160-bit parameter of G() function.
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pH0
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pH0->idCtx
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pH0 pointer to the parameter used into G() function
+// pRnd pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGSetH0,(const IppsBigNumState* pH0, IppsPRNGState* pRnd))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRnd), ippStsContextMatchErr);
+
+ /* test H0 */
+ IPP_BAD_PTR1_RET(pH0);
+ pH0 = (IppsBigNumState*)( IPP_ALIGNED_PTR(pH0, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pH0), ippStsContextMatchErr);
+
+ {
+ cpSize len = IPP_MIN(5, BN_SIZE(pH0)*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)));
+ ZEXPAND_BNU(RAND_T(pRnd), 0, (int)(sizeof(RAND_T(pRnd))/sizeof(BNU_CHUNK_T)));
+ ZEXPAND_COPY_BNU((Ipp32u*)RAND_T(pRnd), (int)(sizeof(RAND_T(pRnd))/sizeof(Ipp32u)),
+ (Ipp32u*)BN_NUMBER(pH0), len);
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsPRNGSetSeed
+//
+// Purpose: Sets the initial state with the SEED value
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pSeed
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pSeed->idCtx
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pSeed pointer to the SEED
+// pRnd pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGSetSeed, (const IppsBigNumState* pSeed, IppsPRNGState* pRnd))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRnd), ippStsContextMatchErr);
+
+ /* test seed */
+ IPP_BAD_PTR1_RET(pSeed);
+ pSeed = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSeed, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSeed), ippStsContextMatchErr);
+
+ {
+ cpSize argSize = BITS_BNU_CHUNK( RAND_SEEDBITS(pRnd) );
+ BNU_CHUNK_T mask = MASK_BNU_CHUNK(RAND_SEEDBITS(pRnd));
+ cpSize size = IPP_MIN(BN_SIZE(pSeed), argSize);
+
+ ZEXPAND_COPY_BNU(RAND_XKEY(pRnd), (cpSize)(sizeof(RAND_XKEY(pRnd))/sizeof(BNU_CHUNK_T)), BN_NUMBER(pSeed), size);
+ RAND_XKEY(pRnd)[argSize-1] &= mask;
+
+ return ippStsNoErr;
+ }
+}
+
+
+/*F*
+// Name: ippsPRNGSetAugment
+//
+// Purpose: Sets the Entropy Augmentation
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pAug
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pAug->idCtx
+//
+// ippStsLengthErr nBits < 1
+// nBits > MAX_XKEY_SIZE
+// ippStsNoErr no error
+//
+// Parameters:
+// pAug pointer to the entropy eugmentation
+// pRnd pointer to the context
+*F*/
+IPPFUN(IppStatus, ippsPRNGSetAugment, (const IppsBigNumState* pAug, IppsPRNGState* pRnd))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRnd), ippStsContextMatchErr);
+
+ /* test augmentation */
+ IPP_BAD_PTR1_RET(pAug);
+ pAug = (IppsBigNumState*)( IPP_ALIGNED_PTR(pAug, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pAug), ippStsContextMatchErr);
+
+ {
+ cpSize argSize = BITS_BNU_CHUNK( RAND_SEEDBITS(pRnd) );
+ BNU_CHUNK_T mask = MASK_BNU_CHUNK(RAND_SEEDBITS(pRnd));
+ cpSize size = IPP_MIN(BN_SIZE(pAug), argSize);
+
+ ZEXPAND_COPY_BNU(RAND_XAUGMENT(pRnd), (cpSize)(sizeof(RAND_XAUGMENT(pRnd))/sizeof(BNU_CHUNK_T)), BN_NUMBER(pAug), size);
+ RAND_XAUGMENT(pRnd)[argSize-1] &= mask;
+
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsPRNGGetSeed
+//
+// Purpose: Get current SEED value from the state
+//
+// Returns: Reason:
+// ippStsNullPtrErr NULL == pRnd
+// NULL == pSeed
+//
+// ippStsContextMatchErr illegal pRnd->idCtx
+// illegal pSeed->idCtx
+// ippStsOutOfRangeErr lengtrh of the actual SEED > length SEED destination
+//
+// ippStsNoErr no error
+//
+// Parameters:
+// pRnd pointer to the context
+// pSeed pointer to the SEED
+*F*/
+IPPFUN(IppStatus, ippsPRNGGetSeed, (const IppsPRNGState* pRnd, IppsBigNumState* pSeed))
+{
+ /* test PRNG context */
+ IPP_BAD_PTR1_RET(pRnd);
+ pRnd = (IppsPRNGState*)( IPP_ALIGNED_PTR(pRnd, PRNG_ALIGNMENT) );
+ IPP_BADARG_RET(!RAND_VALID_ID(pRnd), ippStsContextMatchErr);
+
+ /* test seed */
+ IPP_BAD_PTR1_RET(pSeed);
+ pSeed = (IppsBigNumState*)( IPP_ALIGNED_PTR(pSeed, BN_ALIGNMENT) );
+ IPP_BADARG_RET(!BN_VALID_ID(pSeed), ippStsContextMatchErr);
+
+ return ippsSet_BN(ippBigNumPOS,
+ BITS2WORD32_SIZE(RAND_SEEDBITS(pRnd)),
+ (Ipp32u*)RAND_XKEY(pRnd),
+ pSeed);
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpsha256ca.c b/ext/ipp/sources/ippcp/src/pcpsha256ca.c
new file mode 100644
index 0000000..3ccb54a
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpsha256ca.c
@@ -0,0 +1,814 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Digesting message according to SHA256
+//
+// Contents:
+// ippsSHA256GetSize()
+// ippsSHA256Init()
+// ippsSHA256Pack()
+// ippsSHA256Unpack()
+// ippsSHA256Duplicate()
+// ippsSHA256Update()
+// ippsSHA256GetTag()
+// ippsSHA256Final()
+// ippsSHA256MessageDigest()
+//
+//
+*/
+
+#include "owndefs.h"
+#include "owncp.h"
+#include "pcphash.h"
+#include "pcphash_rmf.h"
+#include "pcptool.h"
+
+/* SHA-256, SHA-224 constants */
+static const Ipp32u sha256_iv[] = {
+ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
+ 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19};
+static const Ipp32u sha224_iv[] = {
+ 0xC1059ED8, 0x367CD507, 0x3070DD17, 0xF70E5939,
+ 0xFFC00B31, 0x68581511, 0x64F98FA7, 0xBEFA4FA4};
+
+static __ALIGN16 const Ipp32u sha256_cnt[] = {
+ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
+ 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
+ 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
+ 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
+ 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
+ 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
+ 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
+ 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
+ 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
+ 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
+ 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
+ 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
+ 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
+ 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
+ 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
+ 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
+};
+
+
+/* setup init hash value */
+__INLINE void hashInit(Ipp32u* pHash, const Ipp32u* iv)
+{
+ pHash[0] = iv[0];
+ pHash[1] = iv[1];
+ pHash[2] = iv[2];
+ pHash[3] = iv[3];
+ pHash[4] = iv[4];
+ pHash[5] = iv[5];
+ pHash[6] = iv[6];
+ pHash[7] = iv[7];
+}
+static void sha256_hashInit(void* pHash)
+{
+ hashInit((Ipp32u*)pHash, sha256_iv);
+}
+static void sha224_hashInit(void* pHash)
+{
+ hashInit((Ipp32u*)pHash, sha224_iv);
+}
+
+static void sha256_hashUpdate(void* pHash, const Ipp8u* pMsg, int msgLen)
+{
+ UpdateSHA256(pHash, pMsg, msgLen, sha256_cnt);
+}
+#if (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_ || _SHA_NI_ENABLING_==_FEATURE_ON_)
+static void sha256_ni_hashUpdate(void* pHash, const Ipp8u* pMsg, int msgLen)
+{
+ UpdateSHA256ni(pHash, pMsg, msgLen, sha256_cnt);
+}
+#endif
+
+/* convert hash into big endian */
+static void sha256_hashOctString(Ipp8u* pMD, void* pHashVal)
+{
+ /* convert hash into big endian */
+ ((Ipp32u*)pMD)[0] = ENDIANNESS32(((Ipp32u*)pHashVal)[0]);
+ ((Ipp32u*)pMD)[1] = ENDIANNESS32(((Ipp32u*)pHashVal)[1]);
+ ((Ipp32u*)pMD)[2] = ENDIANNESS32(((Ipp32u*)pHashVal)[2]);
+ ((Ipp32u*)pMD)[3] = ENDIANNESS32(((Ipp32u*)pHashVal)[3]);
+ ((Ipp32u*)pMD)[4] = ENDIANNESS32(((Ipp32u*)pHashVal)[4]);
+ ((Ipp32u*)pMD)[5] = ENDIANNESS32(((Ipp32u*)pHashVal)[5]);
+ ((Ipp32u*)pMD)[6] = ENDIANNESS32(((Ipp32u*)pHashVal)[6]);
+ ((Ipp32u*)pMD)[7] = ENDIANNESS32(((Ipp32u*)pHashVal)[7]);
+}
+static void sha224_hashOctString(Ipp8u* pMD, void* pHashVal)
+{
+ /* convert hash into big endian */
+ ((Ipp32u*)pMD)[0] = ENDIANNESS32(((Ipp32u*)pHashVal)[0]);
+ ((Ipp32u*)pMD)[1] = ENDIANNESS32(((Ipp32u*)pHashVal)[1]);
+ ((Ipp32u*)pMD)[2] = ENDIANNESS32(((Ipp32u*)pHashVal)[2]);
+ ((Ipp32u*)pMD)[3] = ENDIANNESS32(((Ipp32u*)pHashVal)[3]);
+ ((Ipp32u*)pMD)[4] = ENDIANNESS32(((Ipp32u*)pHashVal)[4]);
+ ((Ipp32u*)pMD)[5] = ENDIANNESS32(((Ipp32u*)pHashVal)[5]);
+ ((Ipp32u*)pMD)[6] = ENDIANNESS32(((Ipp32u*)pHashVal)[6]);
+}
+
+static void sha256_msgRep(Ipp8u* pDst, Ipp64u lenLo, Ipp64u lenHi)
+{
+ UNREFERENCED_PARAMETER(lenHi);
+ lenLo = ENDIANNESS64(lenLo<<3);
+ ((Ipp64u*)(pDst))[0] = lenLo;
+}
+
+
+/*
+// SHA256 init context
+*/
+static IppStatus GetSizeSHA256(int* pSize)
+{
+ IPP_BAD_PTR1_RET(pSize);
+ *pSize = sizeof(IppsSHA256State) +(SHA256_ALIGNMENT-1);
+ return ippStsNoErr;
+}
+
+static IppStatus InitSHA256(IppsSHA256State* pState, const DigestSHA256 IV)
+{
+ /* test state pointer */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+
+ HASH_CTX_ID(pState) = idCtxSHA256;
+ HASH_LENLO(pState) = 0;
+ HAHS_BUFFIDX(pState) = 0;
+
+ /* setup initial digest */
+ HASH_VALUE(pState)[0] = IV[0];
+ HASH_VALUE(pState)[1] = IV[1];
+ HASH_VALUE(pState)[2] = IV[2];
+ HASH_VALUE(pState)[3] = IV[3];
+ HASH_VALUE(pState)[4] = IV[4];
+ HASH_VALUE(pState)[5] = IV[5];
+ HASH_VALUE(pState)[6] = IV[6];
+ HASH_VALUE(pState)[7] = IV[7];
+
+ return ippStsNoErr;
+}
+
+/*F*
+// Name: ippsSHA256GetSize
+// ippsSHA224GetSize
+//
+// Purpose: Returns size (bytes) of IppsSHA256State state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSize pointer to state size
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256GetSize,(int* pSize))
+{
+ return GetSizeSHA256(pSize);
+}
+IPPFUN(IppStatus, ippsSHA224GetSize,(int* pSize))
+{
+ return GetSizeSHA256(pSize);
+}
+
+
+/*F*
+// Name: ippsSHA256Init
+// ippsSHA224Init
+//
+// Purpose: Init SHA256
+//
+// Returns: Reason:
+// ippStsNullPtrErr pState == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pState pointer to the SHA512 state
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Init,(IppsSHA256State* pState))
+{
+ return InitSHA256(pState, sha256_iv);
+}
+IPPFUN(IppStatus, ippsSHA224Init,(IppsSHA224State* pState))
+{
+ return InitSHA256(pState, sha224_iv);
+}
+
+
+/*F*
+// Name: ippsSHA256Pack
+// ippsSHA224Pack
+//
+// Purpose: Copy initialized context to the buffer.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// pBuffer == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pCtx pointer to the hash state
+// pBuffer pointer to the destination buffer
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Pack,(const IppsSHA256State* pCtx, Ipp8u* pBuffer))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+ pCtx = (IppsSHA256State*)( IPP_ALIGNED_PTR(pCtx, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pCtx), ippStsContextMatchErr);
+
+ CopyBlock(pCtx, pBuffer, sizeof(IppsSHA256State));
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsSHA224Pack,(const IppsSHA224State* pCtx, Ipp8u* pBuffer))
+{
+ return ippsSHA256Pack(pCtx, pBuffer);
+}
+
+
+/*F*
+// Name: ippsSHA256Unpack
+// ippsSHA224Unpack
+//
+// Purpose: Unpack buffer content into the initialized context.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSize == NULL
+// pBuffer == NULL
+// ippStsNoErr no errors
+//
+// Parameters:
+// pBuffer pointer to the input buffer
+// pCtx pointer hash state
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Unpack,(const Ipp8u* pBuffer, IppsSHA256State* pCtx))
+{
+ /* test pointers */
+ IPP_BAD_PTR2_RET(pCtx, pBuffer);
+ pCtx = (IppsSHA256State*)( IPP_ALIGNED_PTR(pCtx, SHA256_ALIGNMENT) );
+
+ CopyBlock(pBuffer, pCtx, sizeof(IppsSHA256State));
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsSHA224Unpack,(const Ipp8u* pBuffer, IppsSHA224State* pCtx))
+{
+ return ippsSHA256Unpack(pBuffer, pCtx);
+}
+
+
+/*F*
+// Name: ippsSHA256Duplicate
+// ippsSHA224Duplicate
+//
+// Purpose: Clone SHA256 state.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSrcState == NULL
+// pDstState == NULL
+// ippStsContextMatchErr pSrcState->idCtx != idCtxSHA256
+// pDstState->idCtx != idCtxSHA256
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrcState pointer to the source SHA256 state
+// pDstState pointer to the target SHA256 state
+//
+// Note:
+// pDstState may to be uninitialized by ippsSHA256Init()
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Duplicate,(const IppsSHA256State* pSrcState, IppsSHA256State* pDstState))
+{
+ /* test state pointers */
+ IPP_BAD_PTR2_RET(pSrcState, pDstState);
+ pSrcState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pSrcState, SHA256_ALIGNMENT) );
+ pDstState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pDstState, SHA256_ALIGNMENT) );
+ /* test states ID */
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pSrcState), ippStsContextMatchErr);
+
+ /* copy state */
+ CopyBlock(pSrcState, pDstState, sizeof(IppsSHA256State));
+
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsSHA224Duplicate,(const IppsSHA224State* pSrcState, IppsSHA224State* pDstState))
+{
+ return ippsSHA256Duplicate(pSrcState, pDstState);
+}
+
+
+/*F*
+// Name: ippsSHA256Update
+// ippsSHA224Update
+//
+// Purpose: Updates intermadiate digest based on input stream.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pSrc == NULL
+// pState == NULL
+// ippStsContextMatchErr pState->idCtx != idCtxSHA256
+// ippStsLengthErr len <0
+// ippStsNoErr no errors
+//
+// Parameters:
+// pSrc pointer to the input stream
+// len input stream length
+// pState pointer to the SHA256 state
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Update,(const Ipp8u* pSrc, int len, IppsSHA256State* pState))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pState), ippStsContextMatchErr);
+
+ /* test input length */
+ IPP_BADARG_RET((len<0), ippStsLengthErr);
+ /* test source pointer */
+ IPP_BADARG_RET((len && !pSrc), ippStsNullPtrErr);
+
+ /*
+ // handle non empty message
+ */
+ if(len) {
+ /* select processing function */
+ #if (_SHA_NI_ENABLING_==_FEATURE_ON_)
+ cpHashProc updateFunc = UpdateSHA256ni;
+ #elif (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ cpHashProc updateFunc = IsFeatureEnabled(SHA_NI_ENABLED)? UpdateSHA256ni : UpdateSHA256;
+ #else
+ cpHashProc updateFunc = UpdateSHA256;
+ #endif
+
+ int procLen;
+
+ int idx = HAHS_BUFFIDX(pState);
+ Ipp8u* pBuffer = HASH_BUFF(pState);
+ Ipp64u lenLo = HASH_LENLO(pState) +len;
+
+ /* if non empty internal buffer filling */
+ if(idx) {
+ /* copy from input stream to the internal buffer as match as possible */
+ procLen = IPP_MIN(len, (MBS_SHA256-idx));
+ CopyBlock(pSrc, pBuffer+idx, procLen);
+
+ /* update message pointer and length */
+ pSrc += procLen;
+ len -= procLen;
+ idx += procLen;
+
+ /* update digest if buffer full */
+ if( MBS_SHA256 == idx) {
+ updateFunc(HASH_VALUE(pState), pBuffer, MBS_SHA256, sha256_cnt);
+ idx = 0;
+ }
+ }
+
+ /* main message part processing */
+ procLen = len & ~(MBS_SHA256-1);
+ if(procLen) {
+ updateFunc(HASH_VALUE(pState), pSrc, procLen, sha256_cnt);
+ pSrc += procLen;
+ len -= procLen;
+ }
+
+ /* store rest of message into the internal buffer */
+ if(len) {
+ CopyBlock(pSrc, pBuffer, len);
+ idx += len;
+ }
+
+ /* update length of processed message */
+ HASH_LENLO(pState) = lenLo;
+ HAHS_BUFFIDX(pState) = idx;
+ }
+
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsSHA224Update,(const Ipp8u* pSrc, int len, IppsSHA224State* pState))
+{
+ return ippsSHA256Update(pSrc, len, pState);
+}
+
+
+static void cpFinalizeSHA256(DigestSHA256 pHash, const Ipp8u* inpBuffer, int inpLen, Ipp64u processedMsgLen)
+{
+ /* select processing function */
+ #if (_SHA_NI_ENABLING_==_FEATURE_ON_)
+ cpHashProc updateFunc = UpdateSHA256ni;
+ #elif (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ cpHashProc updateFunc = IsFeatureEnabled(SHA_NI_ENABLED)? UpdateSHA256ni : UpdateSHA256;
+ #else
+ cpHashProc updateFunc = UpdateSHA256;
+ #endif
+
+ /* local buffer and it length */
+ Ipp8u buffer[MBS_SHA256*2];
+ int bufferLen = inpLen < (MBS_SHA256-(int)MLR_SHA256)? MBS_SHA256 : MBS_SHA256*2;
+
+ /* copy rest of message into internal buffer */
+ CopyBlock(inpBuffer, buffer, inpLen);
+
+ /* padd message */
+ buffer[inpLen++] = 0x80;
+ PaddBlock(0, buffer+inpLen, bufferLen-inpLen-MLR_SHA256);
+
+ /* put processed message length in bits */
+ processedMsgLen = ENDIANNESS64(processedMsgLen<<3);
+ ((Ipp64u*)(buffer+bufferLen))[-1] = processedMsgLen;
+
+ /* copmplete hash computation */
+ updateFunc(pHash, buffer, bufferLen, sha256_cnt);
+}
+
+/*F*
+// Name: ippsSHA256Final
+// ippsSHA224Final
+//
+// Purpose: Stop message digesting and return digest.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pDigest == NULL
+// pState == NULL
+// ippStsContextMatchErr pState->idCtx != idCtxSHA256
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMD address of the output digest
+// pState pointer to the SHA256 state
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256Final,(Ipp8u* pMD, IppsSHA256State* pState))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pState), ippStsContextMatchErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+
+ cpFinalizeSHA256(HASH_VALUE(pState), HASH_BUFF(pState), HAHS_BUFFIDX(pState), HASH_LENLO(pState));
+ /* convert hash into big endian */
+ ((Ipp32u*)pMD)[0] = ENDIANNESS32(HASH_VALUE(pState)[0]);
+ ((Ipp32u*)pMD)[1] = ENDIANNESS32(HASH_VALUE(pState)[1]);
+ ((Ipp32u*)pMD)[2] = ENDIANNESS32(HASH_VALUE(pState)[2]);
+ ((Ipp32u*)pMD)[3] = ENDIANNESS32(HASH_VALUE(pState)[3]);
+ ((Ipp32u*)pMD)[4] = ENDIANNESS32(HASH_VALUE(pState)[4]);
+ ((Ipp32u*)pMD)[5] = ENDIANNESS32(HASH_VALUE(pState)[5]);
+ ((Ipp32u*)pMD)[6] = ENDIANNESS32(HASH_VALUE(pState)[6]);
+ ((Ipp32u*)pMD)[7] = ENDIANNESS32(HASH_VALUE(pState)[7]);
+
+ /* re-init hash value */
+ HAHS_BUFFIDX(pState) = 0;
+ HASH_LENLO(pState) = 0;
+ sha256_hashInit(HASH_VALUE(pState));
+
+ return ippStsNoErr;
+}
+
+IPPFUN(IppStatus, ippsSHA224Final,(Ipp8u* pMD, IppsSHA224State* pState))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pState), ippStsContextMatchErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+
+ cpFinalizeSHA256(HASH_VALUE(pState), HASH_BUFF(pState), HAHS_BUFFIDX(pState), HASH_LENLO(pState));
+ /* convert hash into big endian */
+ ((Ipp32u*)pMD)[0] = ENDIANNESS32(HASH_VALUE(pState)[0]);
+ ((Ipp32u*)pMD)[1] = ENDIANNESS32(HASH_VALUE(pState)[1]);
+ ((Ipp32u*)pMD)[2] = ENDIANNESS32(HASH_VALUE(pState)[2]);
+ ((Ipp32u*)pMD)[3] = ENDIANNESS32(HASH_VALUE(pState)[3]);
+ ((Ipp32u*)pMD)[4] = ENDIANNESS32(HASH_VALUE(pState)[4]);
+ ((Ipp32u*)pMD)[5] = ENDIANNESS32(HASH_VALUE(pState)[5]);
+ ((Ipp32u*)pMD)[6] = ENDIANNESS32(HASH_VALUE(pState)[6]);
+
+ /* re-init hash value */
+ HAHS_BUFFIDX(pState) = 0;
+ HASH_LENLO(pState) = 0;
+ sha224_hashInit(HASH_VALUE(pState));
+
+ return ippStsNoErr;
+}
+
+
+/*F*
+// Name: ippsSHA256GetTag
+// ippsSHA224GetTag
+//
+// Purpose: Compute digest based on current state.
+// Note, that futher digest update is possible
+//
+// Returns: Reason:
+// ippStsNullPtrErr pTag == NULL
+// pState == NULL
+// ippStsContextMatchErr pState->idCtx != idCtxSHA256
+// ippStsLengthErr max_SHA_digestLen < tagLen <1
+// ippStsNoErr no errors
+//
+// Parameters:
+// pTag address of the output digest
+// tagLen length of digest
+// pState pointer to the SHS state
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA256State* pState))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pState), ippStsContextMatchErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pTag);
+ IPP_BADARG_RET((tagLen<1)||(sizeof(DigestSHA256)<tagLen), ippStsLengthErr);
+
+ {
+ DigestSHA256 digest;
+ CopyBlock(HASH_VALUE(pState), digest, sizeof(DigestSHA256));
+ cpFinalizeSHA256(digest, HASH_BUFF(pState), HAHS_BUFFIDX(pState), HASH_LENLO(pState));
+ digest[0] = ENDIANNESS32(digest[0]);
+ digest[1] = ENDIANNESS32(digest[1]);
+ digest[2] = ENDIANNESS32(digest[2]);
+ digest[3] = ENDIANNESS32(digest[3]);
+ digest[4] = ENDIANNESS32(digest[4]);
+ digest[5] = ENDIANNESS32(digest[5]);
+ digest[6] = ENDIANNESS32(digest[6]);
+ digest[7] = ENDIANNESS32(digest[7]);
+ CopyBlock(digest, pTag, tagLen);
+
+ return ippStsNoErr;
+ }
+}
+
+IPPFUN(IppStatus, ippsSHA224GetTag,(Ipp8u* pTag, Ipp32u tagLen, const IppsSHA224State* pState))
+{
+ /* test state pointer and ID */
+ IPP_BAD_PTR1_RET(pState);
+ pState = (IppsSHA256State*)( IPP_ALIGNED_PTR(pState, SHA256_ALIGNMENT) );
+ IPP_BADARG_RET(idCtxSHA256 !=HASH_CTX_ID(pState), ippStsContextMatchErr);
+
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pTag);
+ IPP_BADARG_RET((tagLen<1)||(sizeof(DigestSHA224)<tagLen), ippStsLengthErr);
+
+ {
+ DigestSHA256 digest;
+ CopyBlock(HASH_VALUE(pState), digest, sizeof(DigestSHA256));
+ cpFinalizeSHA256(digest, HASH_BUFF(pState), HAHS_BUFFIDX(pState), HASH_LENLO(pState));
+ digest[0] = ENDIANNESS32(digest[0]);
+ digest[1] = ENDIANNESS32(digest[1]);
+ digest[2] = ENDIANNESS32(digest[2]);
+ digest[3] = ENDIANNESS32(digest[3]);
+ digest[4] = ENDIANNESS32(digest[4]);
+ digest[5] = ENDIANNESS32(digest[5]);
+ digest[6] = ENDIANNESS32(digest[6]);
+ digest[7] = ENDIANNESS32(digest[7]);
+ CopyBlock(digest, pTag, tagLen);
+
+ return ippStsNoErr;
+ }
+}
+
+
+static IppStatus cpSHA256MessageDigest(DigestSHA256 hash, const Ipp8u* pMsg, int msgLen, const DigestSHA256 IV)
+{
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(hash);
+ /* test message length */
+ IPP_BADARG_RET((msgLen<0), ippStsLengthErr);
+ /* test message pointer */
+ IPP_BADARG_RET((msgLen && !pMsg), ippStsNullPtrErr);
+
+ {
+ /* select processing function */
+ #if (_SHA_NI_ENABLING_==_FEATURE_ON_)
+ cpHashProc updateFunc = UpdateSHA256ni;
+ #elif (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_)
+ cpHashProc updateFunc = IsFeatureEnabled(SHA_NI_ENABLED)? UpdateSHA256ni : UpdateSHA256;
+ #else
+ cpHashProc updateFunc = UpdateSHA256;
+ #endif
+
+ /* message length in the multiple MBS and the rest */
+ int msgLenBlks = msgLen & (-MBS_SHA256);
+ int msgLenRest = msgLen - msgLenBlks;
+
+ /* init hash */
+ hash[0] = IV[0];
+ hash[1] = IV[1];
+ hash[2] = IV[2];
+ hash[3] = IV[3];
+ hash[4] = IV[4];
+ hash[5] = IV[5];
+ hash[6] = IV[6];
+ hash[7] = IV[7];
+
+ /* process main part of the message */
+ if(msgLenBlks) {
+ updateFunc(hash, pMsg, msgLenBlks, sha256_cnt);
+ pMsg += msgLenBlks;
+ }
+
+ cpFinalizeSHA256(hash, pMsg, msgLenRest, msgLen);
+ hash[0] = ENDIANNESS32(hash[0]);
+ hash[1] = ENDIANNESS32(hash[1]);
+ hash[2] = ENDIANNESS32(hash[2]);
+ hash[3] = ENDIANNESS32(hash[3]);
+ hash[4] = ENDIANNESS32(hash[4]);
+ hash[5] = ENDIANNESS32(hash[5]);
+ hash[6] = ENDIANNESS32(hash[6]);
+ hash[7] = ENDIANNESS32(hash[7]);
+
+ return ippStsNoErr;
+ }
+}
+
+/*F*
+// Name: ippsSHA256MessageDigest,
+// ippsSHA224MessageDigest
+//
+// Purpose: Digest of the whole message.
+//
+// Returns: Reason:
+// ippStsNullPtrErr pMsg == NULL
+// pDigest == NULL
+// ippStsLengthErr len <0
+// ippStsNoErr no errors
+//
+// Parameters:
+// pMsg pointer to the input message
+// len input message length
+// pMD address of the output digest
+//
+*F*/
+IPPFUN(IppStatus, ippsSHA256MessageDigest,(const Ipp8u* pMsg, int msgLen, Ipp8u* pMD))
+{
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+
+ {
+ DigestSHA256 hash;
+ IppStatus sts = cpSHA256MessageDigest(hash, pMsg, msgLen, sha256_iv);
+ if(ippStsNoErr==sts)
+ CopyBlock(hash, pMD, IPP_SHA256_DIGEST_BITSIZE/BYTESIZE);
+ return sts;
+ }
+}
+
+IPPFUN(IppStatus, ippsSHA224MessageDigest,(const Ipp8u* pMsg, int msgLen, Ipp8u* pMD))
+{
+ /* test digest pointer */
+ IPP_BAD_PTR1_RET(pMD);
+
+ {
+ DigestSHA256 hash;
+ IppStatus sts = cpSHA256MessageDigest(hash, pMsg, msgLen, sha224_iv);
+ if(ippStsNoErr==sts)
+ CopyBlock(hash, pMD, IPP_SHA224_DIGEST_BITSIZE/BYTESIZE);
+ return sts;
+ }
+}
+
+
+/*
+// available SHA256 methods
+*/
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA256, (void) )
+{
+ static IppsHashMethod method = {
+ ippHashAlg_SHA256,
+ IPP_SHA256_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha256_hashInit,
+ sha256_hashUpdate,
+ sha256_hashOctString,
+ sha256_msgRep
+ };
+ return &method;
+}
+
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA256_NI, (void) )
+{
+ #if (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_ || _SHA_NI_ENABLING_==_FEATURE_ON_)
+ static IppsHashMethod method = {
+ ippHashAlg_SHA256,
+ IPP_SHA256_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha256_hashInit,
+ sha256_ni_hashUpdate,
+ sha256_hashOctString,
+ sha256_msgRep
+ };
+ return &method;
+ #else
+ return NULL;
+ #endif
+}
+
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA256_TT, (void) )
+{
+ static IppsHashMethod method = {
+ ippHashAlg_SHA256,
+ IPP_SHA256_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha256_hashInit,
+ sha256_hashUpdate,
+ sha256_hashOctString,
+ sha256_msgRep
+ };
+ #if (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_ || _SHA_NI_ENABLING_==_FEATURE_ON_)
+ if(IsFeatureEnabled(SHA_NI_ENABLED))
+ method.hashUpdate = sha256_ni_hashUpdate;
+ #endif
+ return &method;
+}
+
+/*
+// available SHA224 methods
+*/
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA224, (void) )
+{
+ static IppsHashMethod method = {
+ ippHashAlg_SHA224,
+ IPP_SHA224_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha224_hashInit,
+ sha256_hashUpdate,
+ sha224_hashOctString,
+ sha256_msgRep
+ };
+ return &method;
+}
+
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA224_NI, (void) )
+{
+ #if (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_ || _SHA_NI_ENABLING_==_FEATURE_ON_)
+ static IppsHashMethod method = {
+ ippHashAlg_SHA224,
+ IPP_SHA224_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha224_hashInit,
+ sha256_ni_hashUpdate,
+ sha224_hashOctString,
+ sha256_msgRep
+ };
+ return &method;
+ #else
+ return NULL;
+ #endif
+}
+
+IPPFUN( const IppsHashMethod*, ippsHashMethod_SHA224_TT, (void) )
+{
+ static IppsHashMethod method = {
+ ippHashAlg_SHA224,
+ IPP_SHA224_DIGEST_BITSIZE/8,
+ MBS_SHA256,
+ MLR_SHA256,
+ sha224_hashInit,
+ sha256_hashUpdate,
+ sha224_hashOctString,
+ sha256_msgRep
+ };
+ #if (_SHA_NI_ENABLING_==_FEATURE_TICKTOCK_ || _SHA_NI_ENABLING_==_FEATURE_ON_)
+ if(IsFeatureEnabled(SHA_NI_ENABLED))
+ method.hashUpdate = sha256_ni_hashUpdate;
+ #endif
+ return &method;
+}
diff --git a/ext/ipp/sources/ippcp/src/pcpsm2pprecomca.c b/ext/ipp/sources/ippcp/src/pcpsm2pprecomca.c
new file mode 100644
index 0000000..7556d9e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpsm2pprecomca.c
@@ -0,0 +1,2539 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// EC over Prime Finite Field (SM2 precomputed)
+//
+//
+*/
+#include "owncp.h"
+#include "pcpgfpecstuff.h"
+
+
+#define OPERAND_BITSIZE (256)
+#define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE))
+
+/* SM2 affine point */
+typedef struct{
+ BNU_CHUNK_T X[LEN_P256];
+ BNU_CHUNK_T Y[LEN_P256];
+} SM2_POINT_AFFINE;
+
+extern const __ALIGN64 SM2_POINT_AFFINE precomputed_ec_sm2[37][64];
+
+
+#if defined( _IPP_DATA )
+
+#if !defined(_DISABLE_ECP_SM2_HARDCODED_BP_TBL_)
+/* see ippcp_baseptbl.cpp test for generation details */
+
+const __ALIGN64 SM2_POINT_AFFINE precomputed_ec_sm2[37][64] = {
+/* digit=0 base_pwr=2^0 */
+{
+ LL(0xf418029e,0x61328990),LL(0xdca6c050,0x3e7981ed),LL(0xac24c3c3,0xd6a1ed99),LL(0xe1c13b05,0x91167a5e), LL(0x3c2d0ddd,0xc1354e59),LL(0x8d3295fa,0xc1f5e578),LL(0x6e2a48f8,0x8d4cfb06),LL(0x81d735bd,0x63cd65d4),
+ LL(0xbc3be46a,0x0af037bf),LL(0x2d8fa938,0x83bdc9ba),LL(0x5788cd24,0x5349d94b),LL(0xcaa5736a,0x0d7e9c18), LL(0x69db9ac1,0x6a7e1a1d),LL(0xc4a8e82b,0xccbd8d37),LL(0x9b7157ac,0xc7b14516),LL(0x6c21bdf5,0x947e7465),
+ LL(0xab589e4a,0x1cda54fd),LL(0xdb4f0a0d,0x26765289),LL(0x8ceb4a0a,0x0a265a30),LL(0xfe887c64,0x3019fd6b), LL(0x4b2fc190,0x0a10fbe9),LL(0x87cbce60,0xf40aa52b),LL(0x6dc13c97,0xcc496bfa),LL(0x5bb3fbb4,0x28ad3478),
+ LL(0x98615060,0x393f7c5a),LL(0xe9016209,0x487ea27f),LL(0xa09f9020,0x8a86bcb4),LL(0xc899dbe1,0x50dc8e3a), LL(0xfd619998,0xfc099043),LL(0x7c7383bd,0x1de135ea),LL(0x32cf70ed,0x4d0bd556),LL(0x25bce9e3,0x6ffc31c5),
+ LL(0x6a9c8162,0x9a575633),LL(0x21dfcc53,0x15aa58f2),LL(0x1ef5f4c5,0x7ad354bf),LL(0x63f875b9,0x0f443ef3), LL(0xd3450133,0x2e81d68f),LL(0xe3607d18,0xb30f4bbd),LL(0x362258ef,0xb1826a4c),LL(0x142a6768,0x7b415276),
+ LL(0x0acd72ba,0x136a9c4c),LL(0x5e7ec73c,0xb1274a25),LL(0x5de34db6,0xf15a876e),LL(0x8cba8047,0x85e74ca0), LL(0xb469eb37,0x08454cdd),LL(0xc99754f8,0x8fbf6d1f),LL(0xec30e984,0x1060e7f8),LL(0x4b8c598a,0xb568bc97),
+ LL(0x81f06784,0xaa3531c7),LL(0x07132520,0x0b894193),LL(0xacfe18c5,0x84ee5b69),LL(0xd9fbec28,0xbbf492e0), LL(0xe5f6186d,0x313a35c1),LL(0x757a01b8,0x0e449a2e),LL(0x2bd99baf,0x96c9b992),LL(0x3b84d777,0x2ba05a8f),
+ LL(0x09122670,0xde523a1c),LL(0x22cc810c,0x90be6f2a),LL(0x4387df9e,0x086e6341),LL(0xd9c44134,0x115c2fc0), LL(0x8799302a,0x9334430d),LL(0xe27b7ea4,0x693b3500),LL(0x9a8f3382,0xcbe1136f),LL(0xb5778247,0xe77fd5f2),
+ LL(0x30fbde86,0x98e795c3),LL(0xab21af8f,0x8e5e0495),LL(0xb48669b4,0x3925bf83),LL(0x469522c8,0x77d88740), LL(0x987b04ce,0x8fbf8b5b),LL(0x3aff4428,0x63c563a8),LL(0x53a6e969,0x5dc11165),LL(0x32697f4c,0x822a6c24),
+ LL(0x642cb143,0x6774298a),LL(0x2d110e71,0xecdb60d8),LL(0x1388728e,0xe810b11b),LL(0xd8603a8a,0x2e8237d8), LL(0x50aeeae1,0x673968fc),LL(0x6746a3f4,0x08c65d19),LL(0xd7dd7165,0x7a61a6b5),LL(0xa9b6df3a,0xe31bbfd9),
+ LL(0x3421e115,0x2b252ad0),LL(0xc6affc01,0x7557c8c7),LL(0x8a509267,0xd90c19fd),LL(0xe0d871c8,0x483da168), LL(0xc10729bf,0x72d6f9b3),LL(0x15b7061e,0x5dd84021),LL(0x9f2c587d,0x9bfea2db),LL(0x98641ec2,0x528398a7),
+ LL(0xf3afdd62,0x18a65d8d),LL(0xd6d7e4e4,0x89f38500),LL(0x9d8d4f07,0x65708c6a),LL(0xd0bdc7f4,0xb90ea13c), LL(0x8c3e2b32,0x58985855),LL(0xbcfad3a1,0xfa48d5c5),LL(0x62385ffa,0x5c3544e7),LL(0x7e72aeb7,0xb6bd39ed),
+ LL(0x8000fe4e,0x34e51c6a),LL(0x89c46941,0x7da2bdfd),LL(0xe1bc2b2e,0x667ba91d),LL(0x10a73e5c,0x3c80c9d0), LL(0xc7f5c64d,0x4fadebbe),LL(0x3ea35052,0xaef09eb4),LL(0x26ec55f9,0x167ee11b),LL(0x85189260,0x45fa508a),
+ LL(0x22542fc3,0xa0e9a439),LL(0xddac78dc,0x3f194a6c),LL(0x6f74d053,0xa75ae72d),LL(0x097c6617,0x0f8babeb), LL(0x4303c247,0x1d12bc5c),LL(0xbd1e246c,0xfe0c027a),LL(0xb69b55ad,0xe9ca1a99),LL(0x117cd63a,0xff6cd2b0),
+ LL(0xdde97d4d,0xf3489343),LL(0xbbb2ce1f,0x9c14e38a),LL(0xcfddf221,0x25866911),LL(0x460efef1,0x0df89411), LL(0x73ae8326,0xf713f30e),LL(0xcdd274a1,0xd9be66a8),LL(0x36885947,0xdf915ae2),LL(0x7878b781,0x2c5c1e9e),
+ LL(0x39e8a120,0xf71560c9),LL(0x7273b59a,0x7121d6b8),LL(0x8ef4639d,0x649535ce),LL(0x14cc6d58,0xcd01076e), LL(0x96e74f8a,0x2705729a),LL(0x5533037e,0xb07e3230),LL(0x663c5c62,0x0846dcc1),LL(0x10fc3ac1,0x6a4759c1),
+ LL(0xcfbdfeff,0x3c126193),LL(0x4996d845,0x4a31dd20),LL(0x19f2b658,0x48a76ba0),LL(0x8890a8bc,0xbe330142), LL(0x308aa041,0x287b34e1),LL(0x813adf29,0xcbf5da24),LL(0xcdcdc439,0xcdfc5a58),LL(0x198a6075,0xbda3bda2),
+ LL(0x1497fe38,0x639f92bc),LL(0xd58bd278,0x8ed8eeac),LL(0xb417bfe4,0xcf5d7ce6),LL(0x44400c59,0xf617c54e), LL(0x7d8dc939,0xde635635),LL(0x241baaff,0x2e6a3a75),LL(0xe07e8e97,0x02f324e5),LL(0x70f9fc9d,0xeb715487),
+ LL(0x86712116,0xbefd3380),LL(0x884efe46,0x9b9e9707),LL(0x8c9e513f,0x611a1eec),LL(0x3b6dbcec,0xe2d8e3f5), LL(0x4f8964e4,0x7cedab1c),LL(0xf4e139f8,0xee12d062),LL(0x9a9af4f3,0x8e63c9c0),LL(0x8b907b23,0xe3246dbb),
+ LL(0x71099001,0x70d5bda2),LL(0x15fae7dd,0x3d876d4a),LL(0x7b69c20e,0xaba0500f),LL(0x9834adf2,0xa8e3e094), LL(0x980b21b9,0x69db851b),LL(0x788c2a30,0x274c1de2),LL(0xd47d153d,0x5caa5336),LL(0x57cef318,0xada69877),
+ LL(0xa0551c80,0x83879486),LL(0x658e61be,0x1611dea0),LL(0x1b935068,0x1fe95c82),LL(0x5b229223,0x8f01e019), LL(0x7e93c389,0x23017e05),LL(0x9840dd64,0xce4ac99d),LL(0x1de86399,0xddc9b900),LL(0x88015785,0x6abe5cc3),
+ LL(0xb3c50898,0xc09545a9),LL(0x6c05d902,0xbd443361),LL(0x2c6bcc8c,0xed71f70c),LL(0xbdf8e908,0x8dbc0b88), LL(0x4fcbcd9a,0x56eb5b98),LL(0x08114397,0xafb6fedc),LL(0xb35f7927,0x0500ce5b),LL(0x95efe710,0x7005bcf9),
+ LL(0x2eba7f39,0x125cbed2),LL(0x6c488d44,0xc7c42e76),LL(0x676915c4,0xdb8991f9),LL(0x9183839f,0xdf6ae594), LL(0xc79f8bd1,0x4f69c304),LL(0xaa1662fa,0x638cb070),LL(0xba6f2599,0xc7f68c72),LL(0x1f6edfa9,0x11bb84d9),
+ LL(0xa215fda2,0x9ed156ec),LL(0x20c5ddb6,0x19de7a91),LL(0x0668c65d,0xc1ed949d),LL(0xd0826f6a,0x96683044), LL(0x1adaa8ff,0x1e6325e0),LL(0x07ac392a,0xbc53bc24),LL(0xd9f06e44,0x2c342db5),LL(0x30db8c1a,0x3f529385),
+ LL(0xe7492326,0xc5957d29),LL(0x0663f829,0x3addc3df),LL(0x728cfdc1,0x8faa3169),LL(0x6b975134,0xde53aa7c), LL(0xefddc764,0xf481759b),LL(0x09edaff3,0xd605474b),LL(0x653d48c9,0xc7df1eb9),LL(0xc5040212,0xa71e6854),
+ LL(0xafe945b5,0x136d8342),LL(0xe9d239c7,0x91707e7d),LL(0xfb2e80de,0xeda23dc5),LL(0xff614966,0x892bed73), LL(0x838dc12d,0x2ded2367),LL(0xb002bd9c,0x73fd298c),LL(0x2c4629df,0xc548b426),LL(0x8f7e03b7,0x93605d17),
+ LL(0xd37c24cc,0x32861816),LL(0xe427975a,0x5bb54ee2),LL(0x32f943a9,0x6da013d2),LL(0x9bc202e5,0x0746a77a), LL(0xcd1def5b,0x6db07a84),LL(0x861d9f9b,0x9421fe7f),LL(0x692181fb,0x71767292),LL(0xc9d2441d,0x0560e7e5),
+ LL(0x4d7e922a,0xf1496afd),LL(0xe11fa533,0x67f42a3f),LL(0x977956cd,0x9f903e5b),LL(0x1eb49608,0x37671e24), LL(0x21fb2047,0x967950a0),LL(0x35da3c6b,0x141f96fb),LL(0xd27bba59,0xe07c3c40),LL(0x0e1af754,0xbde5ed1d),
+ LL(0x54f1f257,0xdc64c4b0),LL(0xb01196dc,0xecb033c8),LL(0x8202d5bd,0x54e65f4d),LL(0x2b2fd451,0x63afcc93), LL(0x30640fb7,0x1e929a39),LL(0x5b361718,0xdc91387e),LL(0xf8f0bbe8,0x10aadecb),LL(0x0977e2bb,0x81d8f466),
+ LL(0xbd64cd96,0xdcaa3790),LL(0xcee698d3,0xbc8ac152),LL(0xa1143c45,0xde7192f7),LL(0xf5fb9ea0,0xf7c9d826), LL(0xc9468f50,0x54aea92e),LL(0xcc427ed4,0x340f4459),LL(0x02ad5467,0x3fec5be9),LL(0x2cc6c8b5,0xec780d9c),
+ LL(0xb889c78a,0x7b179a8b),LL(0x0aca32c5,0x069a7ab9),LL(0x591b9a36,0xe4e5215e),LL(0x3bd54630,0x7802fb3e), LL(0x233c6eeb,0x9a479313),LL(0x4e1cbabc,0x18c612ad),LL(0xc0e36f3b,0x28a29273),LL(0x7d3deb26,0xf4e2dfb1),
+ LL(0xadbb3c8b,0xa6c11369),LL(0x4c8ec378,0xd78af40b),LL(0x03f0a982,0xffb3a80d),LL(0xa83be50a,0x550e3e71), LL(0x418ee45b,0x845c0fb2),LL(0x0791b964,0x5297cf43),LL(0xcc47e33b,0x676b638c),LL(0xfecf85b2,0xb1c52fac),
+ LL(0x3dba2c0e,0xf011b5e5),LL(0x026d4f11,0xa6c68448),LL(0xc3f206fb,0x11596db3),LL(0x29414a3c,0xc91c76dc), LL(0xb94ddc7c,0x1839b9d1),LL(0x56ae8610,0xdfb20ce7),LL(0xd8734400,0x3e2b1cd9),LL(0xf01ea540,0x59f9329a),
+ LL(0x2351a2a9,0x7d4c140c),LL(0xbf4c9823,0x575c1e1b),LL(0x31068df9,0x8f11c2ca),LL(0x05e6def0,0xe3c17aa0), LL(0x501c8630,0xe6281c70),LL(0xc88a412e,0xad240917),LL(0x390492d7,0x6f21bfb7),LL(0xc3a3ccb7,0x61ea1385),
+ LL(0x33733cbc,0x60494a83),LL(0x27ed8157,0x8da622a0),LL(0x0471ad90,0x0022b154),LL(0xd3568003,0x3bd0a4c5), LL(0xd932df23,0xdc8e2d03),LL(0x7a1f5159,0x859ed940),LL(0x2a375b0f,0xad670e63),LL(0x9520db97,0x15922fae),
+ LL(0x59eb1a9b,0xfb73d16f),LL(0x8511e541,0x3ee8cc1f),LL(0x1590c321,0x20d72d59),LL(0x3bd075d4,0x62eab566), LL(0xfae123ab,0xac07a7c7),LL(0x1f10af6e,0x83b89abf),LL(0x1da8ac5d,0x469962ec),LL(0x8c58c3b3,0x09761c35),
+ LL(0x7da90fc9,0x2c086d5e),LL(0x5cc27782,0x458e5ffd),LL(0xb9268939,0xc3f48611),LL(0xde4b9110,0x39fed873), LL(0xfda698cc,0x16ef8f78),LL(0xa973bb50,0xb028dc21),LL(0xe29b725b,0x45eb849e),LL(0x14c6eae9,0xd41b5b6d),
+ LL(0xc55d5720,0x5e931b21),LL(0xa0e40b19,0xb628ccb2),LL(0x000651a5,0x42044ffe),LL(0x076544e7,0x2130b4de), LL(0x3677c70f,0x38428594),LL(0xf8945d86,0xfdcdb038),LL(0x4169ae44,0xfb2e3d4c),LL(0x0d13bce2,0xd4695e9b),
+ LL(0x039d646d,0x45191390),LL(0xb12ba339,0x983b7a2e),LL(0x5923e7d6,0xdfd30d3e),LL(0xba9d206a,0xae3590f0), LL(0xb6d5e62a,0x7d58d334),LL(0x7e402b12,0xb15b0544),LL(0x62ae8e01,0xac57e113),LL(0xf473edee,0x4d83804c),
+ LL(0xc81bc828,0x2faa7c4d),LL(0xfb62561f,0xb16ed9d7),LL(0x49c2fa93,0x4c9da270),LL(0xb311d90d,0x3b014c73), LL(0xf5443332,0xd29c5d65),LL(0xeebdb7c2,0xb6457d54),LL(0x4cce9480,0xc6a0bf3a),LL(0x85355854,0xd434a3b0),
+ LL(0x8b2c703c,0x178ca01b),LL(0x0ab71a51,0x605bba53),LL(0x3db948d5,0x2140948e),LL(0x5fb6b8c1,0xc45b2689), LL(0xf17b47bd,0x421f66de),LL(0x2e9b3ee5,0x57627a5a),LL(0x66614339,0xedf3920a),LL(0x4b638a46,0x7ea61903),
+ LL(0x3c030643,0x7203d542),LL(0x5e631461,0x7112bb3d),LL(0x2bc3da9c,0x2604eac7),LL(0x32d2541b,0x2e4964e7), LL(0xe8b6482a,0x940faf46),LL(0x24d27c9e,0x8f772fcb),LL(0xca7c5f88,0x125c34d7),LL(0xd1f47795,0x9903eadb),
+ LL(0xe2147129,0x11aaa417),LL(0xf88a0a30,0x3ccef5c2),LL(0x90283f97,0x78d5207a),LL(0xd25226b6,0xba1261e9), LL(0xd1e7a01c,0xbfc79248),LL(0x941ab2bd,0x373f1cd5),LL(0x19a0668b,0xf0881e21),LL(0x1f77bf0a,0x7b793789),
+ LL(0x63d4523d,0x49c2769b),LL(0xf0399eaf,0xf8df2cba),LL(0x22a2a74d,0x5ae94c69),LL(0xefd1e193,0xd08f8d45), LL(0xc681f376,0x64341fc4),LL(0xec918711,0x3a8e25c8),LL(0x0608f50f,0xdf35304d),LL(0x9a973742,0x9b4c6967),
+ LL(0xbfba043b,0xb5c1f5d3),LL(0xe975f03b,0xaff4f896),LL(0xae2cbb01,0xea1f39bd),LL(0xa62915ff,0x4cc1c4cb), LL(0x89e943b8,0x5eb4afa3),LL(0x154e565a,0x8c4d27e5),LL(0x7f2bced6,0x4e2e5a7e),LL(0x4487f6a3,0x7af408e2),
+ LL(0x97a60de7,0xe5dacbae),LL(0x4401b0ad,0x9774834c),LL(0x8a9113f9,0x7683bb00),LL(0x42b2ba67,0xc6fe7e8b), LL(0x54e760c8,0xc0c0564d),LL(0x118606c2,0xf7b05401),LL(0xec3cd7b9,0x554a9b0f),LL(0x27916a21,0xce75ecfb),
+ LL(0x12118abd,0xf6638997),LL(0x097da3a7,0x2ba6e754),LL(0x0fdf9985,0x1df82085),LL(0x546c864a,0xbf73502a), LL(0xc02d9ce0,0xdfde9323),LL(0xe4dd0e7d,0x580491e2),LL(0xae43b9b4,0xe71522d2),LL(0x6a231a41,0x876e3627),
+ LL(0xb36362ec,0xfa8ff511),LL(0x34085959,0x11c5a9f6),LL(0x9770c62b,0x272b86f2),LL(0x7c7e8827,0xf0626225), LL(0xea1e13eb,0x929168bf),LL(0xce59b0f5,0xdb892971),LL(0x4f826f34,0x6769e31d),LL(0x0a955cec,0xfa1dd934),
+ LL(0xa294d7ea,0x123d9ca2),LL(0x4492569b,0x8699063b),LL(0xa8dd86c3,0x6a50eae9),LL(0x12c06c38,0x3d757d10), LL(0x3e41e556,0x5a92c2c0),LL(0x6330c21a,0xa64595eb),LL(0xe184d925,0x70d8141a),LL(0xa2f10304,0x8543f2ce),
+ LL(0x9eaca504,0x4559b0a2),LL(0x2617bc9b,0xb9843a4b),LL(0x1b641003,0x5b28d4ee),LL(0x4ced538a,0x3e9af8e1), LL(0x7bdf7dc2,0x3790fe89),LL(0xc32549ee,0xc7c74941),LL(0xabcd2f42,0xdcc8295b),LL(0xead078b6,0x48b29a4f),
+ LL(0x2040178e,0x8e8b28e3),LL(0x971725fc,0xceff8f3e),LL(0xfcee2cc1,0x4a97b6fa),LL(0xbac85b56,0x775df6a9), LL(0xd28a21cc,0x32e5cbe6),LL(0xae2b82db,0xe8b86ada),LL(0x86e38e96,0x44dfbb50),LL(0x1afc2d4b,0x45d3fe7d),
+ LL(0xd23f620d,0x838b356e),LL(0x4592fe4b,0x2e8fa8ac),LL(0x3af5b1d8,0x1396e1b3),LL(0xcbf50fb0,0x9c0c2ef3), LL(0x836e93e9,0xd9efb6c9),LL(0x0899163f,0xe6eb5870),LL(0xdca00d1b,0x3a2f6d77),LL(0xb40ba0d6,0x36f55f89),
+ LL(0x32866e57,0xf3b1701f),LL(0x59de0f2e,0xf0768473),LL(0xab57962d,0xe55d7aed),LL(0x2b60cabb,0x45004985), LL(0xd5498888,0x8d539d6e),LL(0xa5e0ff6a,0x176ce1a0),LL(0xdc088c50,0xcb7c15ef),LL(0xc9a9ae2f,0x90393d7a),
+ LL(0xd396bdce,0xd9c1a140),LL(0x6fb2800f,0x4215b78b),LL(0x2f76b0df,0x8939109f),LL(0x2adb40a8,0x0f250897), LL(0x3a86e009,0x4db0007c),LL(0xf968a635,0x6ef0ad95),LL(0x8eaefa78,0x58a82d4b),LL(0x493604a4,0xe8a181cb),
+ LL(0x520d216d,0x36c84e34),LL(0xc666171c,0x2b2ef6b5),LL(0x2ce29d37,0x9469b91f),LL(0xc15f20aa,0x3ecd84e7), LL(0x292edd2c,0xf1090635),LL(0x7c3447f6,0x6d439362),LL(0x3eea3fdf,0x51b9a0a9),LL(0x9e57e450,0x68e0d1f8),
+ LL(0x7380931e,0x25d249d5),LL(0x2011a45b,0x87f03fad),LL(0xefde1ca3,0x89df0324),LL(0x9a9b4330,0x52ae43cd), LL(0xa1867c1b,0xfe48bc64),LL(0x9866920e,0xdd874f66),LL(0xfcf50251,0x6942a7e4),LL(0x9c5f6298,0xf5c10048),
+ LL(0x00973d66,0x305183eb),LL(0x95baf07c,0x1ce66760),LL(0x74822e13,0x74c9d971),LL(0x76b5e6ef,0x2ccd7fbb), LL(0xa3e1ca18,0x51688b49),LL(0xa603f2f1,0x1beb5bbb),LL(0x962534b6,0x09a231d1),LL(0xafa92f75,0x70417ce1),
+ LL(0xe154bc00,0xb86b6d82),LL(0x895483e5,0x5a0b19e8),LL(0xa0ff1e44,0xb15f6c05),LL(0xfdd8615d,0x2938b88a), LL(0x971615c3,0x81800a05),LL(0xc03d2039,0x6be6d56b),LL(0xc476ce64,0xff3e57d2),LL(0x6f583ee8,0x5b509b7b),
+ LL(0x7c1f5d3b,0x1d92c36c),LL(0xe11df757,0x1e60b19b),LL(0xe37e36f6,0x20261501),LL(0x29bc86e3,0xb68a9aaa), LL(0xf61d23ca,0xfba81eaa),LL(0xd5adaa18,0x63440834),LL(0xa5f93bb8,0xa80d76ed),LL(0x5a728480,0x3264283d),
+ LL(0xe4b8c48e,0xd6171111),LL(0xde557cca,0x3ee227a1),LL(0x3cb59841,0x2bebc09a),LL(0x99bf6205,0x2f8047fe), LL(0x4c43845f,0xb78b243e),LL(0x46d3b5e0,0x484ac183),LL(0x0314524d,0xa07be476),LL(0x1ab4c447,0xc0a3aa35),
+ LL(0x9c341f84,0x2f302d58),LL(0x84f130ba,0x264911a7),LL(0x3ee64343,0x30bed408),LL(0x5dc5868a,0xd7d6e92d), LL(0x80adb3fb,0x92074568),LL(0xa133123e,0x005ab33c),LL(0x42e1da50,0x105119fd),LL(0xb7f6b1e8,0x6987117d),
+ LL(0xc2bccb7a,0xa2315af3),LL(0x8672c98a,0x95ddd3ee),LL(0x5f48f607,0xa9032645),LL(0xc5273603,0x76861e62), LL(0x88817217,0x71aaa35f),LL(0x2892afac,0x57e95b6c),LL(0x9e84c791,0xf65e909b),LL(0xaa52f3b1,0x257bcc2d),
+ LL(0x865c665a,0xd5f6110a),LL(0x30c08b4c,0xddc3afe1),LL(0xefec26fc,0x4df3d04a),LL(0xb035af5d,0xf229bddf), LL(0xd191b439,0x364913cf),LL(0x5a7fa8a4,0xf41b8f6d),LL(0x6f6c1219,0x677cc51b),LL(0x148b7f64,0x593afe4a),
+ LL(0x0d038ad4,0x80ffa5ae),LL(0x36256c8f,0xf44d3df3),LL(0xbc978dce,0x0a3077c8),LL(0x745b8317,0xf3d9b4b0), LL(0xb6b1852c,0x8bbf4484),LL(0x0e78ff07,0x0cd02ed4),LL(0x49c24238,0x91cb827e),LL(0xdaa3cb55,0x58adaee5),
+},
+/* digit=1 base_pwr=2^7 */
+{
+ LL(0x033fc12a,0x07e6ce4d),LL(0x4886f316,0xba4f98a1),LL(0xe66f3f11,0xb24b38f3),LL(0x5ea4bde3,0xe3f6205a), LL(0xa77b998f,0x00705387),LL(0x9549f3b1,0x2c9b4457),LL(0x533a61d6,0xdef6625b),LL(0x7e4f781a,0x4eda7e2a),
+ LL(0xfd120134,0xe9730aaa),LL(0xc057309c,0xb22b9089),LL(0x84726ce7,0x98e79565),LL(0xd635a584,0x0e1431a0), LL(0xe834ffa6,0xbd387023),LL(0x036ab1ae,0x64198ddf),LL(0x9124b684,0x46e5ebb1),LL(0x233b3c6d,0xa316fa44),
+ LL(0x84782513,0xec2a9325),LL(0x2903d20b,0xd67c8ab7),LL(0x157f9aee,0x6b65b262),LL(0x69f964a2,0x547be60c), LL(0xee0419db,0x001bf327),LL(0xf20c7005,0x92fa0800),LL(0xcdc1ccda,0x1e11e745),LL(0xe471f822,0xa785ec10),
+ LL(0xa1371aa4,0xbc970210),LL(0x54b5424e,0xaff481a0),LL(0x0e64269b,0xbcdf91fd),LL(0xb02fc7cf,0x18bb37bb), LL(0x6f69d439,0xd99edd79),LL(0x169514b2,0x4e27a58f),LL(0x66e19ae4,0x80eca1ca),LL(0x0788696d,0x0470e965),
+ LL(0x8c9d34f6,0xa6b1992f),LL(0xa5ed969e,0xaf062ffe),LL(0x3a6d7ae2,0xbca2580d),LL(0xc8999158,0xf30cd9e6), LL(0x49d1ab0d,0x93e57897),LL(0x30214280,0xcfa3aa4d),LL(0x0a814831,0x0ca8b4fd),LL(0x0b10097c,0xdad179db),
+ LL(0x3dfdc228,0x63778bfc),LL(0xb9648a36,0xc0bae0ad),LL(0x015a99b5,0xda8cb8ab),LL(0x8366b58a,0xb045cccb), LL(0x4164cebd,0x74ef8ef4),LL(0xc5e00e5f,0x41e71fc8),LL(0x4479468e,0x753cf906),LL(0x332ea72d,0x78b5223f),
+ LL(0xddebafa2,0x8fc3e370),LL(0x351f9f04,0x15ffcce0),LL(0x45b0efdc,0x3fbd5f5c),LL(0x0fe3b460,0xb8216623), LL(0x533c7db6,0xe8322fbd),LL(0x00a243ff,0xf3866d15),LL(0xa0e5aaea,0xf1194ae2),LL(0xb9287b3d,0x3e93eb01),
+ LL(0x5876d6e8,0x528a9e2f),LL(0xd2b622d7,0x93c48f85),LL(0x3e5411d7,0x88d9eac8),LL(0x00a70e91,0xb7e4a6ba), LL(0xf1c43b2e,0xaf18e5ba),LL(0xa2f347de,0x46578c7e),LL(0xf009638f,0x19ca736d),LL(0xbd1acd29,0xa6563f1e),
+ LL(0x2f4126e7,0xdf9bcd3a),LL(0xd62efebd,0xecc22d13),LL(0x10943242,0xd9b29b4b),LL(0x670136f9,0x499ffa74), LL(0x2b889952,0xa2a9ad2c),LL(0xfd132dad,0x945f306e),LL(0x15cebfd7,0xfd05b884),LL(0xc7a5627f,0x653e70af),
+ LL(0x577dae35,0xfefc54b5),LL(0xaac3a655,0x9d2f0546),LL(0xfac31d00,0xb96bd298),LL(0xee69563d,0x3328a51c), LL(0x43195f4e,0x5e19098e),LL(0xa998010b,0x657f4ba5),LL(0x4047ccb6,0x45f29a84),LL(0x6e423da6,0x833a5443),
+ LL(0xca33f42b,0x97e480c6),LL(0x06e52a05,0x20a51033),LL(0x0a9be572,0x85e87255),LL(0xb988b582,0xe8bc857a), LL(0xc183c500,0x782495e8),LL(0xfee0ae2f,0xf33a87fd),LL(0xc64d1dec,0xf069fe20),LL(0xf4b08816,0x0b6dd98a),
+ LL(0x99229a90,0x6e6cf298),LL(0x1d71d532,0xa6840bc8),LL(0x71e3a8b7,0x803e5407),LL(0x6afd9a0e,0xd5611ee4), LL(0xbbbefa73,0xd739ca0e),LL(0xc5ec48b7,0x6082dbab),LL(0xbbdea0ec,0xa0ab10df),LL(0xf1633e03,0xb1b7ebe4),
+ LL(0x7be26441,0xfa752496),LL(0x0ef683e6,0xf52cb1b6),LL(0x39dd611d,0x1c96401f),LL(0x7bb19083,0x09c5a35b), LL(0x00a5d5a1,0xa2f002b8),LL(0xacf4e8ed,0x4e300ddd),LL(0xb4cc58c6,0x0d26b600),LL(0x50062651,0x5a53863a),
+ LL(0xad1cac22,0x62e64475),LL(0xc7e11395,0x2008653e),LL(0xd9479c4a,0xa875ad01),LL(0x804b30d1,0x3e6cf633), LL(0xb6b06e46,0x58b3ef6e),LL(0xf7b8410b,0x74c45dbe),LL(0xc278458d,0x02675759),LL(0xacd30bd1,0xb2ef4956),
+ LL(0x339aae8d,0x1a4a5773),LL(0x0c0fe175,0xa775b952),LL(0x5d5d5ac1,0x7b39ac1b),LL(0x11a511b6,0x3f183d49), LL(0x045ac045,0x9524e286),LL(0x4934c52f,0x0498d296),LL(0x9b636528,0x1fec5474),LL(0xc3e9b84b,0xec6f7a37),
+ LL(0x12ee579d,0x870b12dd),LL(0x06dd62d6,0x2a9a12ab),LL(0x071d7582,0xbcd52599),LL(0xa869c457,0x7a36193a), LL(0xe976ae5b,0xd29e6592),LL(0xadfecd58,0xe82c8712),LL(0xf714686d,0xbc83a440),LL(0x0c21e3ba,0xfe19344a),
+ LL(0xd7a191ae,0x2a32c989),LL(0x4e58caca,0x00a25163),LL(0xe4a11597,0x2c6501b8),LL(0x7f1891e6,0xb3e45d09), LL(0x659fd516,0xb7f532b1),LL(0xa7002930,0x99cf64de),LL(0xf2cd2d4d,0x56357ed4),LL(0x3447951f,0xa94cf5c5),
+ LL(0x76a164be,0x26c7f244),LL(0xa72e974c,0xbd83e20b),LL(0xda31de06,0x64e9c241),LL(0x1cdb203d,0x022bc0f0), LL(0x55c0601f,0x5eec4fcb),LL(0xb168a484,0xa1504f91),LL(0x1243026d,0xb9cf98b1),LL(0xfb3e5a1c,0x6a009deb),
+ LL(0x60657650,0xf1df3752),LL(0xcb1b8d9e,0xa5bbd8f5),LL(0x81b6af13,0x9e0d9447),LL(0x624cb828,0x8572cecf), LL(0xd003617a,0x28319d57),LL(0x996fde09,0x175c4766),LL(0x04878e13,0x168514b2),LL(0xec83a771,0x58a541d7),
+ LL(0x29fb000f,0xafdaad3b),LL(0xc20f56f5,0x1977a8de),LL(0xc5b7ba77,0x450faf6f),LL(0xe5954518,0x93253964), LL(0x644c3385,0x11ee0f31),LL(0xa8a57bad,0x6c24de9d),LL(0x5533a7ba,0xe8ff408c),LL(0xeace56fa,0x660a74d9),
+ LL(0x8cc2a866,0xb4b2543b),LL(0xeffc0cbf,0x69f23f18),LL(0x5308b9b1,0x0db4682a),LL(0x17037e08,0xce7fac53), LL(0x0a885b01,0xf02098c4),LL(0xb2e4eb6e,0xd375c03d),LL(0x70d4b81b,0xb6d4f6c1),LL(0x7ce5f297,0xa2b5e9cd),
+ LL(0xb8a233c3,0x787229cc),LL(0x3419867f,0x44ef5dd8),LL(0x79d3d8dc,0x00316d22),LL(0x90bb1410,0xdcf32003), LL(0x835d2264,0x62ad0125),LL(0x0ed6605c,0x768c8658),LL(0xfc44e760,0xa31abf17),LL(0xbb22e570,0xc91848ac),
+ LL(0xb16c805f,0xad1882f5),LL(0x7ccf9e9a,0xb74cc0ed),LL(0x7b122dd7,0x9635af23),LL(0x5c3cd11b,0x48a20903), LL(0x34c1eb54,0xa24820b6),LL(0x5284dcb3,0x31a3c330),LL(0x069c2ee4,0xd966cf59),LL(0xb3ff9335,0xa74eec6f),
+ LL(0x4620e739,0xf44eeb99),LL(0xf4159a9a,0x7663a596),LL(0xb4b745b1,0x79c54f42),LL(0x59db9482,0xa8d34937), LL(0x579501df,0x35fad92a),LL(0x289d7c2b,0x1d81bbe3),LL(0xddf3d371,0x1d60a274),LL(0x46df1233,0xf08e23e5),
+ LL(0xf3a95f04,0x4bc4c079),LL(0xa8626015,0x0b43e660),LL(0x246ae3ac,0xedb31526),LL(0x41247209,0xa8536eb6), LL(0xfdfacc62,0x6893a7df),LL(0xc557777b,0xf3de226f),LL(0x0d7f4265,0xa68c8d8c),LL(0x15c685e3,0x55a628eb),
+ LL(0x5ecec6ee,0x8cad8f87),LL(0x2a06c242,0x4aefda2d),LL(0x57f00a7d,0x46a21033),LL(0x7ed125cf,0x91910c3a), LL(0x541165d2,0x0b7f0e4a),LL(0x553eeec1,0x15ed1b93),LL(0xd24e020b,0xadf5b4db),LL(0xa7493b8b,0xf05307a3),
+ LL(0x62070042,0x725548dc),LL(0xc274916a,0x74d71526),LL(0x6f098d01,0x3269851e),LL(0xf9ec928c,0xb2e01cb7), LL(0x2b4368cd,0x96c2d922),LL(0xa0ec45d1,0x8eb84b03),LL(0x26e5b3ac,0x733ad068),LL(0x93c5a962,0xced3679e),
+ LL(0xdd6eb876,0x23c6a22d),LL(0xa343dc3b,0xbd98ad9a),LL(0x56054515,0x61933d03),LL(0xe45cd744,0x4a64b769), LL(0x12586de6,0x617a63f3),LL(0x7976e7d1,0x04984a9f),LL(0xcd2a0a6b,0xb00ba446),LL(0x7d059d46,0x5b64e7f5),
+ LL(0x6a4b08e6,0x8801ce04),LL(0xb13bbe9c,0x66f31460),LL(0x4d87114e,0xb174e887),LL(0xf348e94f,0xb2fee192), LL(0x7c822d05,0xfede2283),LL(0x8f82b14a,0x8d50c49c),LL(0x0f5f1b5d,0x21ea4f6e),LL(0xc1818095,0x68627cf0),
+ LL(0x8a7b2458,0xc1c0650c),LL(0x8bbc6aff,0x82ab62bb),LL(0x6ce6989d,0x7b3665d7),LL(0x7579e973,0x2ad7991f), LL(0x7e9e8510,0x701287aa),LL(0x0a18da53,0xb296a038),LL(0x2bf00fdc,0xf8c3af86),LL(0xb220dc06,0x55776951),
+ LL(0x7d7dd541,0x4e6e4b4f),LL(0xfe5c7431,0x812feac7),LL(0x340297b1,0x6bdfa63e),LL(0x98009910,0xecc11e55), LL(0xb25b98c0,0xee4c6165),LL(0x02c5939c,0x8a07b0d2),LL(0x23147c40,0x9b36c176),LL(0xde2eab3a,0x396054a2),
+ LL(0x2c439171,0x1f41010b),LL(0xe8139388,0x3ff85ee6),LL(0x8f077633,0x4ada4c7d),LL(0x824e6023,0x9976011a), LL(0xeaf49f63,0xa2501197),LL(0xd60b0c4c,0xdff2122f),LL(0xbab3df90,0x1a6a3abb),LL(0xb66ffd5f,0x854bbcc6),
+ LL(0x728572c1,0x525964a9),LL(0xfadbd14b,0x8a4923a2),LL(0xcd90b61b,0x03830df9),LL(0x79c2afe9,0xcdb00f4a), LL(0xa6c3f13d,0xff2f84bb),LL(0x5c0de4dd,0xdee45c30),LL(0xfba2e933,0x3e1dd748),LL(0x7c51124c,0xe9dcc690),
+ LL(0x28e11f62,0x725177af),LL(0x8a64fdf5,0xc8e120a1),LL(0xf24fb357,0x82ab73df),LL(0x44724879,0x2d5d1618), LL(0x96c66b86,0x09627e26),LL(0xc81d38c1,0x1d547cae),LL(0xd0f76658,0xbe8991a4),LL(0xcf11a976,0xf1508662),
+ LL(0x3be3e582,0xa5dafebd),LL(0x07399295,0xd9f545ba),LL(0x676f9598,0xd9f564a4),LL(0x9294431e,0xec00bddf), LL(0xc1fdc758,0xc1971113),LL(0x69a001de,0xe32f572f),LL(0xb907f044,0x048d7776),LL(0x5ca10e67,0x4a474e6e),
+ LL(0x3039a4b7,0x6476dd40),LL(0x018ee2b8,0x85de9baa),LL(0xfd7365f2,0x0c945aeb),LL(0x96c7267e,0x2b47dc0d), LL(0x0410de25,0xb12b48a7),LL(0x177242c1,0x3ba7a11a),LL(0x6504ff87,0x44e6cee7),LL(0x9d19f26c,0xb2605ff6),
+ LL(0x50fb1b6b,0xa56bb589),LL(0x71d2fb53,0x98dc1180),LL(0xa1b78e04,0xa4fdc6f8),LL(0x39d9349d,0xbea745b0), LL(0x62d7eb73,0xac474229),LL(0x8b808ac3,0x7b765138),LL(0xd0ca219f,0x882370af),LL(0x9d1c23e8,0x28dcff7b),
+ LL(0x3872f0a9,0xc6dc70eb),LL(0xdfb642b1,0xb2f21248),LL(0x65bbdfc9,0x86838f0f),LL(0x40b28364,0x1d04a8b5), LL(0x1e4d8d58,0xd4fa229d),LL(0xfad0a9cd,0x74ee5e20),LL(0x5a40ec4a,0x25a59aae),LL(0x3727d6cd,0x73be91f3),
+ LL(0xd63f64eb,0x9c31405e),LL(0x91d2f1c1,0x9943c34c),LL(0x4fcdbf34,0x70ad75d7),LL(0xb239e00d,0xa6ce7145), LL(0xcd04b9e9,0x136bceed),LL(0x44ed7f96,0xb9ebeb8d),LL(0x5d136280,0x068b43a5),LL(0x4c559b6b,0x2e1b6624),
+ LL(0x5472d67b,0xe3808e72),LL(0xce74546e,0x73450378),LL(0xea1d58f7,0xc1b1b66e),LL(0xe34c2a7d,0x2b576e4f), LL(0x2f732803,0xc2b1bdf7),LL(0x9f8e48c3,0x37aea390),LL(0x944f1cf3,0x8bbbb61e),LL(0x86c59643,0x5cc7ccaa),
+ LL(0x8d5b000a,0xaf4c18e3),LL(0x2b6d561c,0x23b0edd0),LL(0x0d6cbe27,0x11b67ef0),LL(0xb1b50e9d,0x679d789b), LL(0x372c4015,0xda198336),LL(0x65781ea7,0x5da50baf),LL(0x550201ba,0x00b3a6d4),LL(0xecfffc72,0x988b89f7),
+ LL(0x25948852,0xf2f08a09),LL(0x406d1a34,0x4036bbb7),LL(0x23d2dd87,0x1cd57f08),LL(0x4704dac3,0x11a4387e), LL(0xc5413b59,0xb8091a7a),LL(0x09b5fa71,0xe58940c6),LL(0x6a75397c,0x70fd5154),LL(0x5c59ff75,0xea544375),
+ LL(0xac25bd3a,0x15e5bed3),LL(0x6b17971e,0x1bed3c33),LL(0xbaa96968,0x046fc1cd),LL(0x7090256f,0xda1b010d), LL(0xe6677d20,0xeec55752),LL(0x24c9bb42,0x8eac5d06),LL(0x8f4120e0,0xc2f6270e),LL(0x07748faa,0xd9ae9fff),
+ LL(0xe8f7b7af,0x5a1b2634),LL(0x81b1612d,0x1fcd743d),LL(0x3d420398,0x6b065aa2),LL(0x41e06643,0xe758b9c7), LL(0x7f111b3b,0xe1e52b53),LL(0x83498731,0xb9ee0a5d),LL(0xea8154f4,0x49c19631),LL(0xe1c08746,0x8f5a3479),
+ LL(0x65dd5561,0xe032d7c1),LL(0x442bef09,0x6c3420fe),LL(0xa64eff47,0x1d390561),LL(0x902763bf,0x0d8fbf07), LL(0xa4bc6856,0x0262f26d),LL(0x9f4f2101,0x7c1b59a7),LL(0x51240642,0x663d9b38),LL(0x77ce53cc,0x39a0b4c2),
+ LL(0x61f5e655,0x1c896beb),LL(0x9f4bfd2d,0x75c4c049),LL(0x10111b02,0xb8799a15),LL(0xa4c2fa0e,0xc76f8641), LL(0x185fc036,0xd77ff7fd),LL(0xf5acbd16,0x53212bd6),LL(0x0408cff8,0x4ef7431f),LL(0xfb082c4b,0x45aa9d99),
+ LL(0xf0438565,0x22c1fa8e),LL(0x4cb43ab5,0x8e3a2ee3),LL(0x232081d1,0x457df338),LL(0x482ff47b,0xd1293d9b), LL(0x68106365,0x802a300e),LL(0xe51978c9,0xa8f27aa1),LL(0xa6a6a4d3,0x6ca0edda),LL(0x24c9526a,0x4cab1223),
+ LL(0x56730245,0x26234b2e),LL(0xe1b54be4,0x9a04c15d),LL(0xee89282b,0x153fb6cf),LL(0xd79d81ad,0x5901ca12), LL(0x7c3c5ffd,0xbe6853d8),LL(0x35e1942a,0x16d3efb5),LL(0x3b56bece,0x3491f207),LL(0x5b818cfd,0x0d75e0c1),
+ LL(0x40969df4,0x79a0e319),LL(0x9ae34b31,0x75e4632c),LL(0x68e8df30,0x4a47585c),LL(0x2a495467,0x4a4a40e4), LL(0x2762eae9,0x92b8a6f5),LL(0xc9a3d133,0xa204cd80),LL(0xd1ff23cf,0xa441ecfd),LL(0x4550ee57,0xd06feb58),
+ LL(0xdc032002,0xe14ca6a1),LL(0x05505a36,0x9a780e57),LL(0x08cb2b29,0xad93852e),LL(0x008b00c4,0xa54deaab), LL(0xe1042350,0x8cd2c71a),LL(0xa8915596,0x2014b85d),LL(0x97ddd1dc,0x1228b3e4),LL(0x4a3b3ab7,0xa97282ce),
+ LL(0x0f1559ad,0xd978cd73),LL(0x86b14d3c,0x2e877fa2),LL(0x3660f189,0x01d3dc94),LL(0x0d2b4ddd,0x90ad950d), LL(0x92245e3e,0xa8d26760),LL(0x4964245d,0xfc1bf8d5),LL(0xac3d97eb,0x31206c72),LL(0xa58c64cb,0x39dfd972),
+ LL(0x7efbbd16,0xd631907f),LL(0x174f1fd5,0x4fdc84e2),LL(0x5c277996,0xe81e89b3),LL(0x5f79f1de,0xcb277b4e), LL(0x2ed1962c,0x2eff44b3),LL(0x72883505,0xbe36a640),LL(0x545e69a0,0x14a1fac0),LL(0xd6f658b9,0x76dbbcbd),
+ LL(0x78e2e86d,0x0720c584),LL(0xcaeead35,0x52fccffb),LL(0x587fd1b2,0x06f28c72),LL(0x9e48bf69,0xec36a912), LL(0xdaa3cdbd,0x74874436),LL(0xcdc2f2a3,0xb3f7409f),LL(0x1951c078,0x0e50d7fa),LL(0xee8949f0,0xd97ff34e),
+ LL(0x742d7b1d,0x00db635e),LL(0x29f0d0f9,0x5c0b280e),LL(0xeabf9b35,0xafa7e616),LL(0x2c8a76e8,0x7341e2c7), LL(0x2e96f198,0x9679e34d),LL(0x90ee26ca,0x8c2661c0),LL(0x67a6516e,0x9c6dab35),LL(0x46b4b34f,0x7c8edc4b),
+ LL(0x2afba4fe,0xc502cf2f),LL(0x6776dbf1,0x76847ae0),LL(0xa2c3c83e,0xace02706),LL(0x4601c550,0x0012645f), LL(0xef6189bd,0x1940e14a),LL(0x2cdf5e89,0xba7f615f),LL(0x438a3781,0x698101aa),LL(0xa9e22357,0xf568a45d),
+ LL(0x1f913210,0x83af640e),LL(0x8d505edc,0x529a29fd),LL(0xd6b0c85a,0xdf3d3090),LL(0x6897ea43,0x46e23886), LL(0x416577ae,0x97cca980),LL(0x9aa08fc3,0x1f5a96a8),LL(0x56c05c30,0xcb014b33),LL(0x05ec9be4,0x1944765a),
+ LL(0xddc4371d,0x2d6789cc),LL(0xf3618fc2,0xd768f5a6),LL(0x3da93c1c,0x77065e11),LL(0x0e27b3eb,0x4ea3fbc3), LL(0x11ba30e9,0x7c1bfba0),LL(0x1036ebe6,0xfc6fba67),LL(0xd3231aed,0x0053a30c),LL(0xee3ac524,0x7f0613d9),
+ LL(0x63093df6,0x95ec2fd9),LL(0x7c0eea52,0xfbc63768),LL(0x8b64ea48,0xf767b286),LL(0xf75bc633,0x6959b0ec), LL(0xc9f63154,0x47e34c3b),LL(0xa524bc76,0xd616b19f),LL(0x632ac100,0xefc9bb54),LL(0xb4d96a7d,0xd9abba10),
+ LL(0xfe2ad7e8,0x3b7dd91a),LL(0xb4ebf343,0x29134cd7),LL(0x152864fd,0x49d1c305),LL(0x80efc220,0x3afd83d0), LL(0x3f2f0d27,0x3552517e),LL(0xfda48969,0x0a2b5006),LL(0x3c3e8ec9,0x568863ed),LL(0x891edec9,0xd99d5c62),
+ LL(0xd1c9d6ee,0xb0ddc129),LL(0x57db23b4,0x373dad74),LL(0xb416c7df,0x7c178b0b),LL(0x4f8a7153,0x77431dac), LL(0x41c1367e,0xf5288888),LL(0xb838c91c,0xf1518939),LL(0x541f3281,0x81e17838),LL(0x65b2bde5,0x70030244),
+ LL(0x7350251c,0xdc309424),LL(0x7c811130,0xfac0c6ad),LL(0x6a141269,0x3817aa1a),LL(0xe10b4a6d,0x1aa5a92f), LL(0x34648a96,0x996cca7f),LL(0x4e2a4f52,0x517a25b9),LL(0x38b1547c,0xff95ac42),LL(0xd9b9cd4f,0x01d981b6),
+ LL(0x88d60eba,0xcc34d15e),LL(0xa0ea1a51,0x45851bf4),LL(0x82854ee0,0x5d5f9b30),LL(0x176ea156,0x914be21f), LL(0x2a05c368,0xecac86d1),LL(0x73a666a8,0x255cb9c0),LL(0x78c0eec5,0x5e4799d9),LL(0x8fc05a71,0x40ed8989),
+ LL(0x8ae03edd,0x54888ac2),LL(0xa83b554b,0xef3e9865),LL(0xb7612fe4,0x47b41822),LL(0x8f76cd2e,0xf6e16fd5), LL(0xa977b5dd,0x091c7b12),LL(0x8f99d4aa,0x7051bf6b),LL(0xfed218fe,0x9f737902),LL(0xb752c612,0xd8112477),
+ LL(0x18d13bd3,0xbb45c287),LL(0x23c6dd1a,0xbbf3a894),LL(0x13b9cf87,0xc8171c5e),LL(0x34f5348d,0x2dfc7792), LL(0x985cabd4,0x9b9a662d),LL(0x4d971de0,0x588a6ebc),LL(0x574cba64,0xda9fd894),LL(0x651e6e67,0x7e0f0cca),
+},
+/* digit=2 base_pwr=2^14 */
+{
+ LL(0x4b8bceb8,0x88ca276c),LL(0x752d1106,0x6d4ec101),LL(0xf834dcbf,0x2ad98063),LL(0xdfff19d0,0x4da81d19), LL(0x3a9828ff,0x4ccc7cd2),LL(0x2e64b332,0xf1e389b0),LL(0x7308b81c,0xe2fb6a6c),LL(0x5bcc0ac6,0xc6df66b2),
+ LL(0xe1c58c80,0x5ccb8c75),LL(0x83fcc95a,0x2ba9de04),LL(0xdfccbcf9,0xccdeb0ee),LL(0x70f3d3ad,0x1d667d4f), LL(0x36269820,0xc6aa14a5),LL(0x0fe87940,0x329a308b),LL(0xede5cfb2,0x39869970),LL(0xf601bb2c,0xc33c3068),
+ LL(0xa1a8781b,0x3087444a),LL(0x5cff3cbf,0x6cb5b706),LL(0x83082714,0x7673a8e4),LL(0x0842a792,0xc4bce015), LL(0x53e2a531,0xae71a033),LL(0x8b5315f9,0x147b28f8),LL(0x6c5ab37a,0xcc460133),LL(0x540dde16,0xb1dd088b),
+ LL(0x11c09289,0xec250455),LL(0x164079c9,0x83042ba7),LL(0x6e3879a2,0x4881640c),LL(0x802452ee,0x77c5babc), LL(0x7088f360,0x7a7759a6),LL(0xb74be7e9,0x02da352c),LL(0xe0338289,0x15800cdb),LL(0x501688c6,0xad69f7c9),
+ LL(0x57ae1213,0xb7d35063),LL(0x97024ecd,0xd536753a),LL(0x24938196,0x9d680716),LL(0x44ed6d4e,0xac1bee4c), LL(0x33e95503,0x6dd9c9bf),LL(0x88fc1c3d,0x5ee9f1fd),LL(0x21654473,0x4a701ff4),LL(0xbd2ffe36,0x9a316450),
+ LL(0x103b5fa2,0xe9130a63),LL(0x8eee983b,0xe97f7120),LL(0xe8749cba,0x54b7f85b),LL(0xbb1bca55,0x69976910), LL(0xf4e621d3,0x9ec4034f),LL(0x695e17da,0xaad567ed),LL(0xcedb2ea8,0x7647f054),LL(0x09fc7433,0xf85f944c),
+ LL(0xb95eeddd,0x30af23b3),LL(0x89985f3d,0xfd1d565a),LL(0x4c254738,0xfbb53173),LL(0x171170a4,0xb07ba56a), LL(0x294d55d1,0x5069882c),LL(0x792694c1,0xae0385c4),LL(0x11225dc6,0x0a0c7927),LL(0xe22867c9,0xadcc5f08),
+ LL(0xaee03999,0x164ac67f),LL(0x79ff7f91,0x4de174d3),LL(0x548da6ea,0x063e4943),LL(0xdb7ccdf7,0x5264880b), LL(0x49b992cc,0x4a18f34b),LL(0x14065870,0xe16b6f4d),LL(0x4cdb0e21,0xd32479ac),LL(0x162bc9f8,0xce8151f6),
+ LL(0xe8f78545,0x0f8d9a2f),LL(0x3145b086,0x091643db),LL(0x23a1bcc9,0x5915a582),LL(0x8a280fc7,0x97348efd), LL(0x65eccf5d,0x3f9d6236),LL(0x01ac8146,0xd1a34937),LL(0x8ad0d5c1,0x1b8e5128),LL(0xd581dd11,0x5cbcc9ef),
+ LL(0xed059f1d,0x947ceaff),LL(0x7460a186,0xf5754d03),LL(0x0164ff7b,0x37698fa6),LL(0x35805339,0x630900d2), LL(0xeddd6bbc,0xe467a6be),LL(0x5e36b12e,0xc53bffec),LL(0xf831fc7d,0x06dfd3f9),LL(0xdaef86ac,0xd995fcc4),
+ LL(0x32d5b2e3,0x7d148468),LL(0x6335f566,0x7796b94c),LL(0x6769b8bd,0x693983d6),LL(0xed5244fa,0xff0306aa), LL(0x89b8e801,0x2e90d41a),LL(0x39e732f3,0x1af09d86),LL(0x320ccb1d,0x96d14e1f),LL(0xc05dcece,0xbaf21c6f),
+ LL(0xc216cf37,0x8ae82a1c),LL(0x773828bf,0xac437f45),LL(0x9d51a85b,0x8c12ff18),LL(0x34c16578,0xfeb563be), LL(0xc6706966,0x9d9353b6),LL(0x0cda8733,0xcdc6eb5a),LL(0x3e4953db,0x033c186e),LL(0xb2e37f7c,0x2ba46a66),
+ LL(0xb9f3ee06,0xb32115e2),LL(0xdd6346a9,0x1bc12cec),LL(0x321242fe,0x6b9c2142),LL(0x5c68ea06,0xcf9b9bb3), LL(0x920d49bc,0x7fe554ac),LL(0x37aedebb,0x90b3a9b4),LL(0x7695af86,0xacb181e0),LL(0xfd567fea,0xd1c99c55),
+ LL(0xfccf76eb,0xb7c18083),LL(0xf93113a3,0xc693bdbb),LL(0x66e03205,0x215ff05d),LL(0xf76d2a12,0x4424aaea), LL(0xe7f30891,0xb23f2782),LL(0x062db479,0xad814d5e),LL(0x4aea78c3,0x347ec1d0),LL(0x6a2332f2,0x3d0f0a7e),
+ LL(0x8ad9e323,0x02ecefa6),LL(0x0d45e0c9,0x16c81248),LL(0x2757306c,0xd4b6253d),LL(0x81e42d04,0xe90203a3), LL(0xc13782f0,0xbcef10fb),LL(0x156267d4,0x823efe5d),LL(0xfddb0092,0x18add11a),LL(0xb104561a,0x27068a29),
+ LL(0xda0abf3e,0x7eb7f516),LL(0x61b3381f,0x3c92ac94),LL(0xd3418870,0xbad7320e),LL(0x07dbe066,0xbab7a126), LL(0x2def303f,0xe7ce59be),LL(0x2d1e0c9f,0x0bf1f237),LL(0x38f418dc,0x12c18d1e),LL(0xb85bb676,0x7fcc5e3e),
+ LL(0x1b038ac6,0x0bcf25ad),LL(0xddf1becb,0x35388760),LL(0x8a1ad137,0x5734bf37),LL(0xb7645056,0x92f3a250), LL(0x718a5ace,0x6ed926a4),LL(0xb967f1cf,0x8e63f0a2),LL(0xd835fe33,0x6d9cccc9),LL(0x31f82e18,0xb1b5efee),
+ LL(0x24f2c6b1,0x997aa2a4),LL(0x9e536a91,0xde87114f),LL(0x0f819ec8,0x01938bd2),LL(0xef772a43,0x012e9031), LL(0x77aa9256,0x1578eb4c),LL(0x61a0c8ed,0x052b4088),LL(0x6ab5a380,0x1153a330),LL(0x132f5675,0xa3e7f085),
+ LL(0x909b8a41,0x5e946e00),LL(0x16a3c156,0x55f7d231),LL(0x8ac8f8e3,0xcd952464),LL(0xcd8d67f7,0x7c5184d4), LL(0x39ef93a7,0xb3468964),LL(0x4e9058c8,0xf4aa0b7e),LL(0x4b7c713f,0xa409403e),LL(0x41a83e50,0x9d55e33c),
+ LL(0x7e1754b8,0x9efee704),LL(0xb1c0027b,0x54085471),LL(0x45af4e6d,0xc5e7a6fa),LL(0x30048569,0xb4d3cd58), LL(0xf3ae8e79,0xd2c20014),LL(0x849f3f23,0xd0b6af13),LL(0x17982a8c,0x3a1db915),LL(0xf9ffcf90,0xea3c8099),
+ LL(0x7bada472,0x25d9eb82),LL(0x09afd498,0xff84d98c),LL(0x56ff21f4,0x5e2c1ffe),LL(0x2f2f3a94,0xafd07201), LL(0xcdb673bc,0xb0227fe6),LL(0xfe8d7326,0x58fc0e7e),LL(0x191bfd4d,0xb988d3eb),LL(0x2474d8b6,0x82499093),
+ LL(0x68caff21,0xd1ef53cb),LL(0x5074160a,0x3cff018c),LL(0x98f982fc,0x609a4688),LL(0x562a099e,0xee5caaac), LL(0xf8c6cfd7,0xf650365b),LL(0x9cbc10ee,0x2652aa23),LL(0x6ab86f4e,0x904fd66e),LL(0x2d82f3d8,0x6a25bbc3),
+ LL(0x19c7a275,0xd3e6ecad),LL(0x3604b2dd,0x05ed0451),LL(0x00c71863,0xdd1d87e2),LL(0x8cd23356,0xd9fc8793), LL(0x0036b81f,0x3337f8ba),LL(0xb5300622,0x63b5a762),LL(0xce8800e3,0x4cf696f1),LL(0x07e3cbc3,0x12cb3261),
+ LL(0x0fa12b5b,0x18eac953),LL(0x77d159b5,0x45ccf073),LL(0x6e844a0d,0xa7480444),LL(0xd77d1c18,0x4404e6c6), LL(0xce1af18f,0x003e43a6),LL(0x17fdffcc,0x8a828081),LL(0xcabf3d17,0x91b63c11),LL(0xad26f286,0xa4dedc21),
+ LL(0x1a2b1579,0x6bf62b69),LL(0xceeb29ff,0x3b67b87b),LL(0x40d4b996,0x451ffadb),LL(0x080978f8,0x10c6ae50), LL(0x2c242dc5,0x959d47e2),LL(0x5423e158,0xced9e922),LL(0x8d8a68f1,0x9a212d4c),LL(0x3708393f,0xeff3d644),
+ LL(0xfbaffded,0x43f51810),LL(0x0f6fd7c3,0x3886ccb4),LL(0x13c31946,0xb939247b),LL(0xaa1fd72a,0xbc1ee613), LL(0x631fd790,0x6d40140a),LL(0xd26b3fd9,0x9382e3ba),LL(0xb3af96c3,0xff414370),LL(0xe0ea9ad6,0x38c813cf),
+ LL(0x157594da,0xf8844c3c),LL(0xcac628bd,0x2a7b514f),LL(0xc08c5107,0xc023e4e2),LL(0x3f2722fe,0x6c164496), LL(0xc03a22ad,0x842e1d06),LL(0x37ddae0d,0x5dbc2865),LL(0x0342bc72,0x46dfc88d),LL(0xa4a3c65c,0x873c805c),
+ LL(0x60aa5c14,0xd202853b),LL(0x3850cc05,0x1dc35d34),LL(0x0cabccfd,0x8014357e),LL(0xc5a5225a,0x1aa44ce9), LL(0x3a8444b4,0xa3cef920),LL(0xc95384b1,0xcf3f91b3),LL(0xc9e5da54,0x1d625ba1),LL(0xb1d0f46a,0xbf1fba37),
+ LL(0xfb3f4885,0xdcef4fad),LL(0x3267f912,0xa49debb2),LL(0x1e121cb8,0x6417d37a),LL(0x533e94c9,0xa6d871fc), LL(0x2e4834fb,0x89f80208),LL(0xb353452f,0x27e83f0f),LL(0xe1f8f322,0xaf009f3c),LL(0x89319fd8,0xa5b77a77),
+ LL(0xedf71900,0x0a89e741),LL(0xd514d93f,0xd679b841),LL(0xb0a03702,0x8878577f),LL(0x85a209ae,0xc9607b78), LL(0x59432a28,0xb7bd0616),LL(0xed567145,0x0da060a2),LL(0x1a449f52,0x44e35a7a),LL(0xbbaccc0f,0x9c9a2c82),
+ LL(0xd83701f4,0x83abd436),LL(0x4bb9cbe8,0x56e8bfe8),LL(0xc631cd1e,0x5b545cc8),LL(0x955aca7d,0x6d03426f), LL(0x2f8db817,0x049fc9fa),LL(0xdc59675f,0xfcec1799),LL(0x0455f095,0xa00ed392),LL(0xe5096b18,0x6d7cfa5f),
+ LL(0xe30ae90b,0x2cda5cae),LL(0xcaabea0d,0x2cc34290),LL(0x41e67856,0x564afcd9),LL(0xcf6ef8b7,0x210c7a09), LL(0xf82a591d,0xc316d352),LL(0xab43d2a1,0x5fe8cc4d),LL(0x8b4e9470,0xd8ebce97),LL(0xba321a07,0x26c78f44),
+ LL(0xd75e509c,0xa63f4b34),LL(0xb9a6c63b,0x9122bbc5),LL(0x17942443,0x8bf792a3),LL(0x7f4f70f9,0x95b05d68), LL(0x13b70dc8,0x57d7dee5),LL(0xfc376fdd,0xe84259ed),LL(0xe3e313b4,0xf8c4c4ff),LL(0x13fa8ff1,0xf8e2d3da),
+ LL(0xf8e4eede,0x9692c390),LL(0x0e95a902,0x3b514551),LL(0x7360623e,0x45c1670c),LL(0x6abd2a82,0xf7a74f55), LL(0x24e8e721,0x99b16e7e),LL(0x512f1401,0xae52fa2a),LL(0x3f3a09d5,0x46c60e80),LL(0x0750e968,0xf803d1b3),
+ LL(0x1791644e,0x17840d2f),LL(0x3b7981e6,0x3e32b3db),LL(0xd3dfae10,0x2d0830a5),LL(0x6cc6dd0d,0x1b28d118), LL(0x78368274,0x944a9889),LL(0x55b1bf81,0x310da94a),LL(0x0d739056,0x503061ec),LL(0xb4d73288,0x1947e940),
+ LL(0x0228346f,0x760ee846),LL(0xc5cff077,0x108765b3),LL(0xbeb12160,0x22092b39),LL(0xb63001af,0xa631d553), LL(0x0af3d43a,0x9340cac4),LL(0x60d338a3,0xe6cbfb54),LL(0x7ca3f604,0x2280ff0c),LL(0x3ba738cb,0xaf48f86b),
+ LL(0x47d372ff,0x7435dd78),LL(0xf005c006,0xbf9c7149),LL(0x7a8d0e81,0x624084b9),LL(0x4840496c,0x50b578f3), LL(0xb52a4266,0x414ca2c1),LL(0x5535ef0b,0xa3c30275),LL(0xb50f7f47,0xd4b808c1),LL(0x9a199920,0xe6781ae2),
+ LL(0x27a91ef8,0x50141234),LL(0x5b77d060,0x2f4f5937),LL(0xc2dcb03d,0x1be8269e),LL(0x9f65043f,0xa293017c), LL(0x8caac401,0x1678dfe0),LL(0x968b1716,0x4942d8ce),LL(0xae36e201,0xa9b55fae),LL(0xd5279632,0xcfe4bde3),
+ LL(0x79d637e6,0x6126d744),LL(0xd63b4aad,0x8491f1a8),LL(0x9816b82c,0xdf97b736),LL(0x796408c1,0xafca2c36), LL(0x7a8e8058,0xc17f3f01),LL(0xe74705e2,0xb3335a24),LL(0x46e3e3b0,0xee200023),LL(0x40630e08,0x07bce061),
+ LL(0xee8f9dfc,0x46b42c00),LL(0x9e9b7f58,0x3b8e8509),LL(0xd36e8e89,0x83df4b18),LL(0x15d50555,0x09631af5), LL(0xef1ee3f1,0xb7906b77),LL(0x4bd1e17b,0x8272dc83),LL(0x4903faac,0xf160bfd9),LL(0x0dc71e59,0x7fe9e999),
+ LL(0xe714187d,0x6ee9b790),LL(0x9d5a656f,0x7391ec2a),LL(0xe10b20f0,0xcbb55ec6),LL(0xec3645d6,0xbba3b57b), LL(0xe18322e8,0x9c3265bc),LL(0x93328c91,0xdb49b0f3),LL(0x49c2bbec,0xa911db72),LL(0x6e5bd229,0xf71b4df3),
+ LL(0x7ba27baa,0xdccede33),LL(0x4b712a97,0x1af4476a),LL(0x8a8683ad,0xf0aaabec),LL(0x6fa8e84c,0x138cdac5), LL(0xdc78b1ad,0xd2d50b00),LL(0x696442b9,0x26fc0b72),LL(0x125bf11b,0x12cd5d8b),LL(0xc4f82ca6,0x2a2ce980),
+ LL(0x52e00dd3,0x9921c0a6),LL(0xf1d7e1af,0x98e8707a),LL(0xdf03b040,0xaa7aa8b8),LL(0xdff6bd74,0xb3ba8b23), LL(0x31db8c0b,0x2fd0faab),LL(0x2819b732,0x4697e9bf),LL(0x0425b866,0x2dc3a5d0),LL(0xd97816f1,0x4b9e7899),
+ LL(0x4c756c70,0x1355c412),LL(0x0fa089af,0x2d4c4eee),LL(0x3b8a01b5,0x4d8425a8),LL(0xa3531d3a,0xcc26b8a9), LL(0x7ebd9eea,0x6eebe11b),LL(0x92c0f858,0xd511a797),LL(0xec49a0c8,0xaa863f01),LL(0xa8242995,0x7fb65625),
+ LL(0x3dbc00c3,0x9de9d3f4),LL(0x3f7d61ab,0xb846152f),LL(0xd0d74549,0xc060fdbd),LL(0x7b273702,0xe722aab2), LL(0xd81b6f6e,0x9e54f098),LL(0x9e2fde1f,0x32dbaa5f),LL(0x9ebbc796,0x14cc9995),LL(0x0eb83921,0x4ca6686c),
+ LL(0x10a0c0bd,0x6e65d7c6),LL(0xb3c0f6cd,0x1f6930d7),LL(0x4d783d6f,0xe4e0a933),LL(0x70b20ad4,0xc945ee7f), LL(0x034b0265,0x521bd135),LL(0x0fa9be95,0xeb5d96e0),LL(0x357ef592,0x834c28c2),LL(0xb81df99f,0x08ab5b4c),
+ LL(0xf464825d,0x6be99d80),LL(0x9a0c1293,0x1cc83719),LL(0xe7e43c6a,0x76616803),LL(0x91cc47ac,0x6fa33715), LL(0xdbfc08b9,0xc3fdb99b),LL(0x68e2b249,0x66e1ef2d),LL(0x64a4a438,0xd3d8ef7f),LL(0xa6f25b00,0x775a70fc),
+ LL(0xa0cb5443,0x2444c682),LL(0x4b743ee7,0x264c2662),LL(0xa303eb20,0xd7a1adc4),LL(0xf60a5b98,0x3f14821b), LL(0x1a1d7661,0xa439102d),LL(0x8d8a5a1a,0x47c25a37),LL(0xa34c66a9,0xdf4a48db),LL(0x4c828c73,0xab467364),
+ LL(0x3459cc8b,0xd3caad73),LL(0x181b16c2,0x08eeb442),LL(0x70600d33,0x3444abbb),LL(0xcd0f8e70,0xaa2a39c4), LL(0x24836d70,0x5fc6ae8f),LL(0x47d32fd4,0xc119be84),LL(0x0d6000ce,0x2b3f3771),LL(0xe602337a,0x439893a8),
+ LL(0xc1e8e564,0x4b75ff6e),LL(0xe451cf42,0x6185413c),LL(0x162c3150,0x0276d3b6),LL(0x3aea9c55,0x844539e0), LL(0x42e9d70b,0xfc629ee6),LL(0x0be610c9,0x4eb9b7e6),LL(0x39ca3d92,0x8c53fda1),LL(0x14c2e9e2,0xd2e4cfa6),
+ LL(0xf14b31b2,0x3c1f6895),LL(0xeb951fad,0xad42d951),LL(0xb8f10fc1,0x5b20a169),LL(0x586c61cd,0x284810bd), LL(0xe863d781,0x0c4a89aa),LL(0x9c235d5c,0x2eda4847),LL(0xe6005150,0x8e141950),LL(0x52785efa,0x75716e1b),
+ LL(0x8305624e,0x290ced58),LL(0x06650920,0x398956a8),LL(0xdb5bd5b6,0xd057a47b),LL(0xbe9e119c,0xf2d85299), LL(0x7c5fc039,0x4783095c),LL(0x05363915,0x72f7e7cd),LL(0xdf3e2968,0xe46b90d1),LL(0xaaea2e53,0xaadb3dae),
+ LL(0x0cc4f426,0xf5d37496),LL(0x59d78369,0xa59bffa8),LL(0xf0a46b04,0x7ad4cc11),LL(0xb8e21b9e,0xcbd63351), LL(0x5653ebbf,0x60d255e6),LL(0x4d6b5843,0x3eaa59af),LL(0x9e1df2e2,0x90049d25),LL(0xe56aa105,0x9a185a6d),
+ LL(0x80e3d909,0xbd31c5cf),LL(0xa1f034d1,0x30caad3b),LL(0xd9c7c342,0xaca74fa1),LL(0x9565cf8a,0xac722cfc), LL(0x5b42e582,0x8b172ce6),LL(0x9b0607b2,0x9e99e4e5),LL(0x9446ca45,0x284eb579),LL(0xc57c9feb,0x6c5464ba),
+ LL(0xe511bc3b,0x1437fc95),LL(0x834d0889,0x22d7bc16),LL(0xc5071c43,0x62e545b2),LL(0x8cb4acd6,0x4c644d48), LL(0x68246492,0xd9efbe50),LL(0xcbd8ad0e,0xc9d169e7),LL(0x798ae01f,0xcb7365dc),LL(0x6d0dea3a,0x5783f98f),
+ LL(0xec454423,0x9b4a7e38),LL(0x96ff4c8c,0x27405d08),LL(0x0c462f7c,0x9769f097),LL(0x7dc946aa,0xcbda5412), LL(0xe7dd5146,0xdacb510f),LL(0x30507b37,0x9c9a0d39),LL(0x05ded0ac,0xa605730b),LL(0x6c6c7b5b,0x7e683472),
+ LL(0x7c952984,0xb378d92c),LL(0x72ae34d6,0xec76370d),LL(0xacda665b,0x1fde0bde),LL(0xb931afc1,0xc8f648f4), LL(0xb960f6ce,0x2b55adb2),LL(0x7336a643,0x71b3bdd4),LL(0x73cc39e7,0xf66e77bf),LL(0x2fa3999a,0xf582c5e8),
+ LL(0xaf986d1d,0x30ecd0c7),LL(0x4557dd65,0xa2ae53ed),LL(0x7d618a1d,0x97ebccfb),LL(0x11eed889,0xcbf54149), LL(0xd8f2bdd4,0xdd0ff0e7),LL(0xfa769e74,0x6ac4a9fb),LL(0x93e5abab,0xdfdfc7e9),LL(0xdffc6fcc,0x0c7151c5),
+ LL(0x5cbae56c,0x6d75e962),LL(0x96dccb89,0x77fae152),LL(0x6cc0e535,0x275c4946),LL(0x81781318,0xc4a400a9), LL(0x77ba50e6,0x8b9f872c),LL(0xa138eeb4,0x971b6cb3),LL(0x53f552a7,0xa7e7d1f9),LL(0x8447c730,0x360512ce),
+ LL(0xc5454439,0xf0c73bbb),LL(0xa3a24b5c,0x7f1b9b18),LL(0x51fa7d6b,0xc5bb48dc),LL(0x8b05a553,0xd264d6ec), LL(0xe9371f83,0x123caaf2),LL(0xb149f564,0xdf5da393),LL(0x853b9bab,0x38e02eb6),LL(0x95bf6647,0xc6aab96e),
+ LL(0x3141219b,0x4890be89),LL(0x7883fe8e,0x7afe4c2f),LL(0x59b86241,0xc27bd13c),LL(0xaacebdc9,0x1b9720f5), LL(0xf6b2174c,0xa054e203),LL(0x60f6de8e,0xd4e7b952),LL(0xf4558633,0xcf7b1aea),LL(0xbefa40a6,0x43fc1881),
+ LL(0xe23cef63,0x592164dd),LL(0xf7b4aaf2,0xfe57d6e8),LL(0xe8aef9bc,0x38a5e2c9),LL(0x1ac2b10b,0x576bd78c), LL(0x14309d10,0x2357944c),LL(0xed0ed94a,0x9933d7ed),LL(0x0339f299,0xb8792ea3),LL(0x87fd9bd1,0xcfb44322),
+ LL(0x92966739,0x864f2fd5),LL(0xd3cfd83e,0x7435ecc5),LL(0xec4249f2,0x8516d277),LL(0xfc158b34,0xaa7e1a8a), LL(0xfbe640a1,0xfc0fc22b),LL(0x91121fec,0xf287767f),LL(0x3f590dcb,0x0ce48273),LL(0xf087c249,0x5e994e2f),
+ LL(0x65604726,0x681a38c7),LL(0x247a421e,0x4f8c6ae3),LL(0x1294956e,0x1a51eaa0),LL(0x47c9b324,0x0984b1ef), LL(0x597b7696,0x3749bd0d),LL(0x08e57ee7,0x9d432b78),LL(0x2ba112d2,0x3092afe1),LL(0x16c5a7f5,0x89ccee49),
+},
+/* digit=3 base_pwr=2^21 */
+{
+ LL(0x54089685,0x355e9d7b),LL(0x40818349,0x9f0ec68f),LL(0x3861b80f,0x4cf4d8cd),LL(0xc1f5fa14,0xcce669fd), LL(0x1788f9da,0xea212509),LL(0xf3ccf239,0x32953613),LL(0x50027f3b,0x1048d092),LL(0x4270fbcb,0xe807b39d),
+ LL(0x95e388c3,0x5099dc55),LL(0xea44e3ea,0xd0670ff5),LL(0x61b41f7b,0xd212c993),LL(0xfaf13305,0x4f594af9), LL(0x05c01232,0xbc508bf2),LL(0x39ff08a5,0x76833536),LL(0xb837741a,0xa1cf70bd),LL(0xaaf7bd2a,0xba8e6616),
+ LL(0xdef27938,0xde04c343),LL(0x48cee32a,0x3f15ca91),LL(0x9dd142da,0xcb61573b),LL(0x126dd9bc,0xc094eefd), LL(0x136bb4da,0x5d42f1a5),LL(0xdb2f3449,0x75693952),LL(0x5c16795e,0x98017cd6),LL(0x2afb67db,0x9e401530),
+ LL(0x9b7c6c75,0x6376749f),LL(0xacbca35d,0x680eacdc),LL(0x5e145b32,0xe87fd5b5),LL(0x36b886af,0xeb20d1ba), LL(0x779b12bb,0xca499055),LL(0x0be39fb7,0x6f290ff2),LL(0xf4a128ce,0x33ad6fe0),LL(0x9b31da81,0xf09e2a40),
+ LL(0x12039372,0xb2ed3d70),LL(0x2ff46c13,0xb87e02c4),LL(0xfb27dce2,0x164246c6),LL(0xe6d95811,0xe34ee8f6), LL(0x3ec1fde9,0x66cc601c),LL(0x80ffdd56,0x056b3194),LL(0x9626aa21,0xff009868),LL(0x2d931092,0xc3e4982c),
+ LL(0xc3d42729,0xbc0da9c1),LL(0x720df0a0,0x4905da24),LL(0x45f6eadf,0x0e5e1fa0),LL(0x2aab7523,0xc02033f3), LL(0xedde75e1,0x45ba916f),LL(0x75c68e52,0xf43919bd),LL(0x84892e6a,0x00e7c076),LL(0x70dfeb08,0x259f8488),
+ LL(0xd8a869a0,0x3bfd5f2c),LL(0x574e7d67,0x1df48669),LL(0xe14cfd3b,0x16d6ed5a),LL(0xfcf78465,0x583aac2c), LL(0x67da2ae9,0x67210e6b),LL(0xcfee511d,0x0b024e70),LL(0x13839a4f,0xf27e122c),LL(0xb79dfa97,0xfa5356c9),
+ LL(0xf357999b,0xf0c24783),LL(0x26bfacb3,0x2c21474c),LL(0xd3ddb945,0xe3abed6a),LL(0x6031a5ea,0xbb21b764), LL(0x8afc2a09,0x6db3b68b),LL(0x81306b71,0x1aac2f08),LL(0x852eb6f5,0x882c3371),LL(0xd98e9b6f,0xadfe0c1a),
+ LL(0x7edcb9e5,0x0247ee7b),LL(0x1f29918b,0xe29ec013),LL(0x6099b6ce,0x5d1629e6),LL(0xcb534584,0x68587803), LL(0x8ce551d3,0x6ccfeddb),LL(0xf85123a8,0x7ef98b72),LL(0xf9711dcd,0x19af4771),LL(0xfd80e4dd,0x8f67858b),
+ LL(0x7d607ee3,0xa4c8c016),LL(0x4015a479,0x15db36d7),LL(0x9d28ea30,0x0cb58eee),LL(0xbecb7b4e,0xb3d469b0), LL(0x6f476e2c,0x811081b9),LL(0x59c78fab,0x264da3aa),LL(0x3cd73147,0xd6e5813d),LL(0xe905362c,0xce9e34a4),
+ LL(0xcb3afa55,0xe551ec2e),LL(0x4b05589c,0x2c9bef25),LL(0xbcd083bc,0xd36ddeb7),LL(0xddb54a24,0x1c180b52), LL(0xc0961f32,0xb84220f3),LL(0xfe3ae670,0xa71103fb),LL(0x46902477,0x6a14d319),LL(0x778b8eee,0x516701d2),
+ LL(0x4c3166d5,0x1cdb1025),LL(0x3d6fcb6e,0x3a0ba2c2),LL(0xb3820def,0xa218b4af),LL(0xbfe8a8f8,0xda6de958), LL(0x4ceabdfa,0xc2b3c755),LL(0x8d73edcb,0xd3534691),LL(0x0ce17182,0x453b8e63),LL(0x01654263,0x6507a5b0),
+ LL(0xd5da0e59,0xb2b8e424),LL(0x61ac4c2e,0x7e599c75),LL(0x41aff49a,0xc64cb4c3),LL(0xea3e378e,0x0e231e63), LL(0xe08edace,0x707cc0e3),LL(0x5410779f,0x18918dd2),LL(0x2eef6bb3,0xcdd57690),LL(0xff758569,0x4c54d7d8),
+ LL(0x2c89683c,0x49459204),LL(0x7827e518,0x93596a16),LL(0x2b20c939,0x6198954b),LL(0x8044d3ba,0x6672c94d), LL(0x199b16dd,0x55e95fd3),LL(0x4185999a,0xa8484135),LL(0xfe36e449,0x5e8709c8),LL(0x91401957,0x47470e2e),
+ LL(0x0874afce,0x0058bb09),LL(0x606c3e52,0x19fb1d56),LL(0x710903a0,0xe1208b2a),LL(0xd47dfd1c,0xecabc372), LL(0x5e94818f,0xd9daa7f4),LL(0x5dc99882,0x1302ac8f),LL(0xc44d37be,0x7b4c6b15),LL(0x72d19e0d,0x0bcf6d4c),
+ LL(0x3fd5a1de,0x1e0bf063),LL(0xa75b5b8c,0x5d05e901),LL(0xcb3c617a,0xbbbdb1ab),LL(0x1aef4706,0x44954a8c), LL(0xff6a6e47,0xbc3ceea3),LL(0x0ded1275,0x6140f421),LL(0x4dabe95f,0xbb4b4c04),LL(0x7135e813,0xc55e87da),
+ LL(0xd963dd6b,0x15ad105c),LL(0x666941a3,0x33d18f73),LL(0x5d9253d6,0x860ccabe),LL(0xd16e8b69,0x2af702fd), LL(0x74e525c0,0x7e46aadd),LL(0xaf59f48f,0xd9958a44),LL(0x8e7de482,0xd8ca872f),LL(0xcf7d007d,0xc2270c14),
+ LL(0xa200e574,0x87c6204e),LL(0x7b69e79e,0x0ee014cb),LL(0x82b23226,0x176ff378),LL(0x8dbbb2f3,0x802d829d), LL(0xe0a4dc31,0xb902924f),LL(0x5fe522f2,0x1f1a9ec7),LL(0x4da7c04a,0xbcd95d85),LL(0xb1543c0c,0x3a3a2e63),
+ LL(0xf3271bf8,0x9e70a3ff),LL(0xd2cd68ad,0xd2522d88),LL(0xa6b727b9,0xb777851b),LL(0x63ff5264,0x58953d6f), LL(0xb65c70d2,0x5e111c22),LL(0xd3a5143f,0xaae73c5b),LL(0x85ef5dc0,0x2daa2bfc),LL(0xea13ded3,0x5e7258d2),
+ LL(0x2e3ce423,0x4161127c),LL(0x6b1af415,0x7e35a0a2),LL(0xeed24b7b,0x004483a8),LL(0x9f9d44f1,0x2816180a), LL(0x062829a1,0x214add93),LL(0x225e847c,0x262a0bef),LL(0x5d6c53c4,0x4bb1b1ce),LL(0x91d06e53,0xd02f829a),
+ LL(0x784da27c,0xcdc8ba5c),LL(0x161b5836,0x78a6c0d2),LL(0x8373c6a4,0x6bea92c4),LL(0xa881f59a,0x815f1a30), LL(0x227cb8e2,0x699c8642),LL(0x25a2b9d0,0x515d1e2b),LL(0x1787b3e5,0xcb5f1c6c),LL(0x104dddc6,0xc9a10260),
+ LL(0x0f3811e5,0x18be4f2a),LL(0x71e727d3,0x8c05d3fc),LL(0xfa707140,0xecae3e5f),LL(0xd275b463,0x4bb05b16), LL(0xb02a5ac8,0x74bad373),LL(0x520344ee,0x7232875a),LL(0x65059d8f,0x32cef98c),LL(0x54e1b11d,0x68e0fdb6),
+ LL(0x3f3db43f,0x683424f3),LL(0xabf4a83f,0xf5f0878f),LL(0x4ac2c5c9,0x681350d9),LL(0x47dd3652,0x825e9ecb), LL(0x20713db6,0x420743f0),LL(0xd1b082e5,0x95db7427),LL(0x1affa57d,0xa0e1117f),LL(0xf940f325,0x62c87b5e),
+ LL(0x4e1d5d9a,0x6a65fda8),LL(0x345ccdef,0x0c0fe385),LL(0xd6d72c0a,0x19ff360f),LL(0xfb016131,0x1be1e8d7), LL(0x025b45e1,0xe2f27e91),LL(0x05259bf1,0x25bec266),LL(0xe51cc67e,0xd7b8b4e7),LL(0xab80a20e,0x3a839aa5),
+ LL(0x9f85320d,0x04a9b695),LL(0x98d669f3,0xb939cd83),LL(0xe6948957,0x24464ced),LL(0xa43928e8,0x463de507), LL(0xf8755845,0x4e1844e7),LL(0x5447e61c,0xc9c71091),LL(0x599d4bd7,0x1798f394),LL(0x1e072c64,0x758f7630),
+ LL(0x739b1925,0x83c93728),LL(0xfa8eb048,0x692017d7),LL(0x478d1ee3,0x4a3a2a59),LL(0x022640cd,0xb8e62912), LL(0x8572b8d7,0x4689a4dd),LL(0x8f79da63,0x6281ddfe),LL(0x212a153c,0x788bf9aa),LL(0xb3438da6,0xb67e18f5),
+ LL(0x31cebdb8,0x3fbafc51),LL(0xb042bd47,0x7f8ad590),LL(0xe3055004,0xf5d26c88),LL(0x3d7d6f5c,0x7f23a149), LL(0x8758ccc0,0x2fee5428),LL(0xe1b80dfa,0xb08c91b7),LL(0xea0c0a53,0xf2bcc903),LL(0x04e684ff,0xcdf2eae0),
+ LL(0xe1d9a693,0x354b2c07),LL(0x97a833a8,0x93b1fa2d),LL(0xe9e5f2b1,0x2dcd22c7),LL(0x18aa3163,0xf040a69c), LL(0x76939874,0x4f9a4b29),LL(0x15e24d44,0x58e5947f),LL(0xb0c2ef6f,0x9b47a945),LL(0xf630e92c,0xc4a15b7d),
+ LL(0x7b1d4141,0x8d7a33e7),LL(0x966486bc,0x44dabde9),LL(0xef31dc9d,0x387a6016),LL(0x1462ff61,0x76744b23), LL(0x20cdd726,0x2ad63954),LL(0x0e7803da,0x9cff7e86),LL(0xfd124ed3,0xaf5b8b4a),LL(0x050c1149,0x466dbbbd),
+ LL(0x06b296a3,0x68352636),LL(0x7f3fe1ef,0x0ab40080),LL(0x05bf08f8,0x1fc38951),LL(0x633c457f,0x69b54ae4), LL(0x1a206c53,0x2ad428c6),LL(0x8b09b3f9,0xd6725687),LL(0x0bc619c9,0x552d4d0e),LL(0x3113c689,0x0e88b313),
+ LL(0xe87a91b4,0xb2483b80),LL(0x0c75377b,0xb9f842d7),LL(0x5a78145e,0x50463f38),LL(0x830817a9,0xf2d3810d), LL(0x39cc886a,0x1819261e),LL(0x8415699b,0x697de51d),LL(0x5cab106e,0x688a874e),LL(0xcb8692ec,0xde48f3bb),
+ LL(0x38f4194d,0xffa1de97),LL(0x3b996b63,0x33d2726a),LL(0x0d2053a7,0x787c0ec3),LL(0xeecd5c0c,0x9447e9cb), LL(0x284773c0,0x077f121c),LL(0x815829a1,0x496427e4),LL(0x94def08b,0x4b119786),LL(0x9c15a778,0x9e7b29e6),
+ LL(0xfd4a8a47,0xa4d6d2be),LL(0x4333baef,0x4f000a12),LL(0x642c570b,0xc9049d86),LL(0x25e6aa6a,0x9424e8f9), LL(0xe011cfec,0x84de7fe9),LL(0x1e8c83b0,0xf273f956),LL(0xa47a40a6,0x98960835),LL(0x0a13c27b,0xd91a20f1),
+ LL(0xed703e13,0xaf08b4ef),LL(0xc9994946,0xefcbcf34),LL(0x2d53b069,0x019e6f38),LL(0x9b160894,0x3d62c3c0), LL(0xadfc8f3b,0xac7ad700),LL(0x0042fce6,0x41cc0cc3),LL(0x21cf742c,0x0228ae75),LL(0xf4c9a1a9,0x56a1152a),
+ LL(0xfebd27dc,0x5d8a3321),LL(0x7c525f7f,0x89bce700),LL(0x1c1039ee,0xe8f815a9),LL(0x62e86536,0x9f6db698), LL(0x66fe804d,0x1ea6e7a6),LL(0x261aea16,0x652acc41),LL(0xf9df596b,0xde28e5d8),LL(0x1553a545,0x18f453c1),
+ LL(0x84eeb5c8,0xa224f763),LL(0x835ba87e,0x8ac452f5),LL(0xc5f4c054,0x9b2b5939),LL(0x3ac1cdcc,0xb2577943), LL(0x772c60dc,0x1ba2cd0d),LL(0xd7a9bd1c,0x1fa52c43),LL(0x60444f34,0x2efd4f4a),LL(0x2bdcfc9d,0x7d188c05),
+ LL(0xe1913711,0x49ef6825),LL(0x600d6c46,0xbca95ded),LL(0xaf8d66d3,0x63916baa),LL(0x2dc837a8,0x04981202), LL(0x0d3ae79d,0xb501e517),LL(0xb4edb859,0x99ff7864),LL(0xaf4ec081,0x5099edee),LL(0x964f4052,0x89574889),
+ LL(0x52066d70,0x1690fdb8),LL(0x671f4e7f,0xb403207d),LL(0xd7413111,0x8ebc1d1b),LL(0xb4cfdf14,0x1432d7fe), LL(0x65ad5d0e,0x9277666a),LL(0xa928e194,0xbd5ae578),LL(0xb64962fb,0x2f6c10d5),LL(0x2e794187,0xe3d756c0),
+ LL(0xd3e6349c,0xf04fd82a),LL(0xcc7d39b6,0xde602dba),LL(0x044e7deb,0x0886e20a),LL(0xe9ba917e,0x6e30c75f), LL(0x4a322ede,0x763961fc),LL(0x2324bb92,0x6df4a3cb),LL(0x8f2ac967,0x9fe82323),LL(0x2345372a,0x3c372afe),
+ LL(0x50b66fec,0xbf7e9c55),LL(0x0c065cfa,0x5db7dd71),LL(0x50d459ea,0x3525e310),LL(0x8122941a,0xad7abe5a), LL(0x122d92fa,0xc7aeba80),LL(0xefcc1c24,0x066c3765),LL(0x8ffd71b1,0xa6d767ca),LL(0x9cc16dbc,0x4a75fab5),
+ LL(0xbb58b63d,0x9acf8b89),LL(0x6fc8c090,0x226cdcd3),LL(0xae7fbd0b,0x852965b7),LL(0xb8bfe65f,0x4cadd176), LL(0xcfa2ac11,0x4ccc11d1),LL(0x800319ab,0x8abf7420),LL(0x88bb3ef1,0x24ab82cb),LL(0x524c0ce1,0x4d3db003),
+ LL(0x3a431e8c,0x38483641),LL(0x792848ad,0xfc0c04a0),LL(0xa07701b0,0x2fc52bb8),LL(0xf29c72cb,0xdfdced3d), LL(0x5280c2e0,0x677e3d84),LL(0xe98cbec5,0x2dda1451),LL(0xaec26be2,0xba28b181),LL(0x5ddea39b,0x16694717),
+ LL(0x4b9aa9b0,0x911ec5f0),LL(0x3594ae7d,0x24b9aaa0),LL(0xc3c136a0,0x0ccfa661),LL(0xb7474319,0x5518964d), LL(0x2175c3dc,0xf0b0427b),LL(0x966b7bad,0x08db4cfc),LL(0x5e888ad1,0x6f61428a),LL(0x57b52d37,0xfaa96176),
+ LL(0x10aac879,0xe834013b),LL(0x95a62172,0x73397bb0),LL(0x33a244b2,0x97806839),LL(0xc3bec0d0,0x0ab3806c), LL(0x2a72512d,0x4fc7a859),LL(0x0a4228b9,0x96474939),LL(0x4de4b4a5,0x8e5d79a8),LL(0x05d62667,0x5a60d1b0),
+ LL(0x08d90c20,0xd31be21d),LL(0xcc14dbb1,0x3f7ed5f2),LL(0xd7d431c4,0xdc8f58f9),LL(0x82b5c63f,0x714f6dee), LL(0x76d2de93,0x6b285466),LL(0xc39dd98c,0x3c2f5d8f),LL(0xea3760a2,0x9bba0075),LL(0x2411742e,0x75e0389a),
+ LL(0x7ffdb955,0x87d6715a),LL(0x9efb199d,0x702108fc),LL(0x6c010f8a,0xf11db1f9),LL(0x7eb6871b,0xf52b1e0f), LL(0x97c3ed9e,0xc49c0dc7),LL(0x77220a50,0x18846f95),LL(0x97afddcb,0xdb2273bc),LL(0xcc469f75,0x5b9a16d6),
+ LL(0x3beedaf4,0xee364394),LL(0x528a9239,0x825e01d6),LL(0xffd0f17c,0xb60ba965),LL(0xb888384b,0xc00106b0), LL(0x31751f74,0x6e24322f),LL(0x1821d05a,0xfe4d074c),LL(0xbf072932,0xf2493c73),LL(0x21089f21,0xa797e208),
+ LL(0x2988abcd,0xf1b318af),LL(0x8e7da518,0xf887558f),LL(0x97836b57,0xb8b9939c),LL(0xc0a74cf3,0xf793e3b5), LL(0x37684170,0xe191008a),LL(0x05cb453c,0x7708823b),LL(0x361beb2c,0xec221d40),LL(0xeb1b68f4,0x0e5a6cce),
+ LL(0x9644e937,0x3dc535f0),LL(0xfda6c1b7,0xf506d720),LL(0xf99437bd,0xc78c0e0b),LL(0xcc9e2b09,0xa920b4d3), LL(0xf089b0e0,0x550965fe),LL(0x0109d910,0xf9813492),LL(0x8c9d5d83,0xd2496f20),LL(0x3e3e661f,0x751b6900),
+ LL(0x9e6ac190,0x921edbde),LL(0xf02d0e7a,0x75891359),LL(0x1c4da092,0xdeb0f83b),LL(0x4feb2375,0x7b427915), LL(0x7c3a85c3,0x24637c72),LL(0x3f214ac3,0xbbfabf86),LL(0xae22fbfa,0xe8765740),LL(0x5f14045a,0x3a09fab0),
+ LL(0x8190dd41,0x546d574f),LL(0x48b5a39f,0xdfcf0b73),LL(0x74097b2d,0xf26c69de),LL(0x3a7e3e90,0x37aa27ff), LL(0x83bbe3df,0x0942447b),LL(0x9ab378aa,0xe779fe20),LL(0x91e2264f,0xad18ad23),LL(0xaaabd6d1,0xe1dad926),
+ LL(0x5db5e5c8,0x9de0aa4f),LL(0xdb67e44e,0x45c3d73e),LL(0x5cd83936,0x440862a1),LL(0xffce9a79,0x9f2b9a88), LL(0x76cc6265,0x63299069),LL(0x7a8830f5,0xf596a67f),LL(0x8d1d8284,0x7051c842),LL(0x3e5561fc,0xa00d05a8),
+ LL(0x7a34d5bc,0x15ce42d5),LL(0xb0e37254,0x4d9b3f5f),LL(0x38841ab4,0x26e84094),LL(0x9a8ede27,0xa7afd35d), LL(0x14835fa9,0x4e8bcdb8),LL(0x79493e39,0x85d04ddc),LL(0xdf8f65ae,0xbfa8fa79),LL(0xda6c7c62,0xe31d759a),
+ LL(0x7600aea7,0x76f27e70),LL(0xd4d9acf5,0xbec79f15),LL(0x5eae2ff6,0x0f10bd0f),LL(0x7116a0c4,0x96c9eef1), LL(0x0cb6f595,0x30add2cc),LL(0x943efe90,0x0c70b548),LL(0x0a05f4a8,0x2ce8026f),LL(0xb7c53c00,0xaa3da153),
+ LL(0x8e385a26,0xcc46bf67),LL(0x99bae0f6,0x64bcf06e),LL(0x035dcb4c,0x49480a36),LL(0xe3cbae58,0x2cc1a299), LL(0xb5480cb2,0x849f8633),LL(0x5607d83e,0x1d8fa56d),LL(0xcea9f22b,0xcc3f0eee),LL(0x1a23f3da,0x7d5ece29),
+ LL(0x8ae66f00,0xc6f0a006),LL(0x78d648f0,0x2620157e),LL(0x40d2880f,0xfc717762),LL(0xbe105017,0x2e0e293c), LL(0x854116f4,0xb320f214),LL(0x2d5cd4ec,0x5e4fa700),LL(0xdffc1c55,0x83fa0a23),LL(0xc9a9ca15,0x18fcb8d2),
+ LL(0xd0ac70fe,0x9e9baccd),LL(0x27fe06ce,0x8ba02fb7),LL(0x3868fdd4,0x2708804c),LL(0x9ba83df4,0x355eaf0c), LL(0xbe43993a,0x014089ba),LL(0x469cccd6,0xc8b59eda),LL(0xb893a5a7,0x77c94507),LL(0x8e517fd5,0x0dffd39b),
+ LL(0x13dbeadf,0x71b6edb7),LL(0xfea2d0cb,0x1617b77f),LL(0x48ff989f,0xf7454736),LL(0xb618bfa3,0x27357890), LL(0xa7181331,0xf08c70ac),LL(0xb8bc036d,0x33b6cfe5),LL(0x7163f883,0x75ed10f9),LL(0x47d1cbbd,0x979875fc),
+ LL(0x7ad23938,0x6644b234),LL(0xd82e2bc8,0x0f09e7f1),LL(0x5588a39d,0x1e6c512b),LL(0xce8eae85,0xb44e6694), LL(0xf392a4c7,0x107336e2),LL(0xdbcd7b43,0x2619b284),LL(0xb7f476a5,0x7b7ec516),LL(0x43081af2,0x0de74ef3),
+ LL(0xd8d54faf,0x93d08bc6),LL(0xf2ae6c9f,0x88d343a7),LL(0xbc147c27,0x7cdb9003),LL(0x69248562,0xd740b19d), LL(0x464b3b60,0x7f3c48bb),LL(0xc91d92c1,0xfc4cd7e9),LL(0xd7420ac9,0x8172af80),LL(0xb9a50be9,0x66907b77),
+ LL(0x9ec8e974,0xed99fea1),LL(0x54f39b1c,0x624a8c94),LL(0xce9798d1,0x9c4d608a),LL(0xa4812277,0x81e1652e), LL(0xf58b7db8,0xa2cf7509),LL(0x745e450e,0xef2cd193),LL(0x9d9da493,0x48ee8431),LL(0xb8ce96fd,0x7b471698),
+ LL(0xe7553998,0x14dbaff8),LL(0x822de823,0xb0b14e4a),LL(0x429d7c51,0x11032354),LL(0xd572d20e,0xc1bb3327), LL(0x6a9c189e,0xff473811),LL(0x9c7b3b83,0x7cf2354e),LL(0x7662df92,0x29681ff6),LL(0x51c297d1,0x09296227),
+ LL(0x5e3da635,0x1b800b34),LL(0x745116e4,0xb5fd32d2),LL(0x2565abb0,0xdae17a1f),LL(0x1fec80c2,0x4f39d3d7), LL(0x290c2f4b,0xb4a19cc2),LL(0x0b6e5ae0,0x1a1b049e),LL(0x6a823b6b,0x41be6e92),LL(0x969649ce,0x35648873),
+ LL(0x2a8ed3d7,0xe85f995e),LL(0x2f319e47,0x9dc712e8),LL(0x536d98a2,0xc4402eff),LL(0x37521e35,0xca61e310), LL(0xc3196672,0xfed39621),LL(0xff17e8a7,0x29e7743f),LL(0x412a7c49,0x47eca488),LL(0x33a2a6da,0xf0114513),
+},
+/* digit=4 base_pwr=2^28 */
+{
+ LL(0xe6880b5f,0x5675a12a),LL(0xe2606d25,0x9ba1e92c),LL(0xeb3b2125,0xb012facb),LL(0xc37b0099,0x3c50fdfb), LL(0x9ce223e9,0xc9ce461c),LL(0xeefbd8ac,0xcb90bdd6),LL(0xc631ea8e,0xf657e5a4),LL(0x38a83ff6,0x6584520b),
+ LL(0x635abcf0,0xd959f317),LL(0x99e17618,0xa516a43f),LL(0xce3bd99b,0xed90ccf2),LL(0xa9fb3290,0x2fc6d460), LL(0x0cde4302,0xb61ebe09),LL(0xf908003b,0x5a3b061f),LL(0xf60f5787,0xf51bb736),LL(0x057efc2f,0x1717f6e9),
+ LL(0x1ca260ef,0x565acf93),LL(0xf1811d23,0x7d6e797d),LL(0x783e42c8,0xe63c6920),LL(0x8dcb5158,0xdc9dbce8), LL(0xc8e39022,0x1426dc7a),LL(0x30ebfe47,0xf3037f34),LL(0xf87d6395,0x75aa6845),LL(0x61f53539,0xbf792fd5),
+ LL(0x6ddc3d83,0xa8bf2172),LL(0xd88207bb,0xf68deb6e),LL(0xcd03bd7e,0xa8eae2eb),LL(0x951f59a4,0x64c7f57e), LL(0xa1786d57,0x8badb223),LL(0x71182790,0x2e7fda60),LL(0x9a5a9457,0x9dc90e36),LL(0xf4b07e07,0x6eca838b),
+ LL(0x03264871,0xad2e235b),LL(0xb8b933de,0xb4c56243),LL(0x91354c8e,0xd9c2bdda),LL(0x6a73fc76,0x97d743ff), LL(0xce88013e,0xbed4109d),LL(0xf3b3bf4f,0xa2428275),LL(0x011e761c,0x900d3560),LL(0xe24fd6c2,0x34925d7d),
+ LL(0xa8198235,0x08b966ca),LL(0xed2d764a,0x355d098c),LL(0xa3d63f3a,0xfac27f7c),LL(0xd3edc140,0x3e553f6c), LL(0x11ff4334,0x64d72c7f),LL(0xbc62cb57,0x48735aab),LL(0xeba21082,0xcf064294),LL(0xbb8d96fd,0xc1f9e456),
+ LL(0x293cd945,0x1d24bdbc),LL(0xea254e36,0x76985bcb),LL(0x876fb485,0x3df2cb6a),LL(0xcd1f673d,0x0176969f), LL(0x642133a7,0x8b41cacb),LL(0x373880e2,0x31ea88f8),LL(0xb3b1463f,0xccf1ff85),LL(0xaca74a27,0x88fffa15),
+ LL(0x167cdd1f,0x9a4b9b92),LL(0xf879b894,0xa9118fc0),LL(0xc55479f5,0xf6e73387),LL(0xc626d292,0xfadf82ed), LL(0x56e80e6a,0xa03bb761),LL(0xf27555d1,0x59a783f9),LL(0x3d087e43,0x027d63b6),LL(0x02fdeded,0x29f9ff32),
+ LL(0x371d0ec5,0x88a9173d),LL(0x08c0227a,0x04ac4d0d),LL(0x9c7ec715,0x00213011),LL(0xd9d6b472,0x0d2b7c76), LL(0x5050bdff,0xe678d53a),LL(0x65a5fcd5,0x8f929d57),LL(0x1dc3e712,0x0793920b),LL(0x4b073699,0x9a6a690f),
+ LL(0x758bdc9d,0x329d9a81),LL(0x7d867b66,0xebbaadd9),LL(0xe6025f68,0x0d7e6b19),LL(0xc53dce26,0x50184374), LL(0x3ed13916,0x298cb00f),LL(0xf5d45b26,0x835fe31e),LL(0xf5a7fb7a,0x373a9c49),LL(0x34d3d8a8,0x59ed7e23),
+ LL(0x3baf6fa3,0x1a8dfe33),LL(0xda53714f,0x926ccce7),LL(0x18ef6fe2,0xda4feaed),LL(0xc3ca5cdd,0xeddaf090), LL(0xbfe06d45,0xc39c2046),LL(0x0d7f549f,0x1d9e889e),LL(0x8d537d0a,0x209ace73),LL(0x0e31e1ce,0x6f182c88),
+ LL(0x1b8c82e2,0x865e0761),LL(0xa659f2ab,0xcf11bcb9),LL(0x7c868143,0x1804bbeb),LL(0x453e36eb,0x2fa89a0e), LL(0x2e17bad1,0x42d69d8f),LL(0xdc2ec741,0xe7fcea6f),LL(0x379ceb37,0xe7f19b45),LL(0x49bb35a0,0x84f0bd89),
+ LL(0x5264b33d,0xa8a50678),LL(0xab1c9e26,0x8cfae763),LL(0xff9b931a,0x1e837dc3),LL(0x796ac029,0x76164be8), LL(0x1266db27,0x26a8bb2b),LL(0x54822255,0xfba4ab83),LL(0x38524458,0x7a5adcfd),LL(0x44ee212c,0xa056c882),
+ LL(0x55018577,0xe8db6fee),LL(0x91955960,0xf71256b6),LL(0x10abe8d8,0xeb1c118e),LL(0xd45a8426,0x984efc9f), LL(0x00f2c6ed,0x4e1b323a),LL(0x331baae2,0x1759a7af),LL(0x2e00ba6c,0xf1587189),LL(0xbb385d39,0xbd8a877e),
+ LL(0x57d6c1ae,0x440d1eae),LL(0xa957dc67,0x092abdef),LL(0x74554b3f,0x1065cbc6),LL(0x710566c7,0x67062382), LL(0x6d04ae2b,0xd327679d),LL(0xb0340551,0x11507b00),LL(0xa2f52d80,0x2e571583),LL(0xe8578507,0x673628f4),
+ LL(0x0cf4efe5,0xecb8f92d),LL(0x960e2d22,0x88c47214),LL(0x6059f079,0xca9549ef),LL(0x7016da7c,0xd0a3774a), LL(0x1d001cab,0xd51c95f6),LL(0xa3feeec1,0x2d744def),LL(0x0afedf2b,0xb7c20cc2),LL(0x71d144a5,0xbf16c5f1),
+ LL(0x3dc0d12e,0x00384727),LL(0xb01cc80f,0xaa95f450),LL(0xa6f8e927,0x19be3106),LL(0x0417ba8b,0x6d6e10aa), LL(0x870e3491,0x149f120c),LL(0x026dde94,0x27380b41),LL(0xf29b04e6,0x97d00840),LL(0x4bf9eb19,0x21d5d7e3),
+ LL(0xd5327f05,0xea1daad9),LL(0x9c88c17c,0xf1f45d94),LL(0x3f8ee0ab,0xc5f3dee2),LL(0x75238a56,0x706b777c), LL(0xf834c60b,0xf7aee379),LL(0x13cfe17b,0x5c24dae6),LL(0x8091804b,0x354c82e5),LL(0x102a577b,0x0dec2fdf),
+ LL(0x5253f8fc,0xbf3b7030),LL(0xd913c01c,0xe516fa69),LL(0xa105ba64,0x053afef4),LL(0xc89c1e76,0x91a1f36c), LL(0x7e724e18,0x3375865c),LL(0x29327b2b,0x43132144),LL(0x6f7bb24e,0x9cb2fc3b),LL(0x6319e789,0x20a6a16d),
+ LL(0x642c467a,0x20bfbd77),LL(0x259d50c8,0x3452bb12),LL(0xec7ffab2,0x0d3ba9c7),LL(0x3560e541,0xbbdb5454), LL(0xd63ba04b,0xab1d6e22),LL(0x7d24f015,0xdf6f11d3),LL(0xf3df15fa,0x7c4d61d2),LL(0x40b3288c,0xd5269f79),
+ LL(0x0e7c7b6c,0xf8516b9e),LL(0xc203dac8,0x48750d82),LL(0xa13d3083,0x89845d36),LL(0x280a131a,0xb3db3cfa), LL(0xfbf752e6,0x40045401),LL(0x1432e856,0x0289f97b),LL(0x5fc1aa11,0x41a9f371),LL(0x8d464042,0xe5c1e5a5),
+ LL(0x589b71a7,0xfbee2ea2),LL(0x5de7056c,0xdd6ee5bd),LL(0x8fd6b6de,0xcf8a4541),LL(0xb15e33b1,0xb47831dc), LL(0x2064321e,0x126a2169),LL(0x6e517edd,0xa21d2d22),LL(0x5ba5a30b,0x1f8072be),LL(0xc6a24b7d,0x24cca576),
+ LL(0x5c282027,0x57eab82f),LL(0x557344b3,0x1620f5e6),LL(0x460b3385,0x59e852e0),LL(0xf050816c,0xc906e3db), LL(0x3eb398e8,0xc031f8cf),LL(0x507ac07f,0x9c25b69b),LL(0x9cf7bdbe,0x652baf2b),LL(0x5ad91107,0x06fedc53),
+ LL(0x4c4b12c5,0xa8ca0be2),LL(0x28762d5d,0x633292b6),LL(0x827c0d5e,0xc04983f2),LL(0xc707ef03,0xcb6b867d), LL(0xb9ac1124,0xa7fc0d5b),LL(0xaab7dcaf,0xa5ce085b),LL(0x1cfda998,0xb85e8f1c),LL(0x27822503,0x8208df42),
+ LL(0xa8dd6d76,0xeaa82320),LL(0xad36eb73,0x7b2fb4ae),LL(0x97a7b040,0x24d73191),LL(0x4001e02f,0xc3ff64ae), LL(0x88799d94,0xd5d87157),LL(0x93ceb95a,0x559142d0),LL(0x59c3009a,0x798a453c),LL(0x7d6c83a2,0x546b6fab),
+ LL(0x5c76029a,0xe263b23a),LL(0x4ac62973,0x85630532),LL(0xecb007ac,0x14ee0643),LL(0x7ca60905,0xf9e06297), LL(0x92f1f170,0x21b2fb23),LL(0x46528ab2,0x31c40918),LL(0x3395cfd2,0x43b53242),LL(0x6d14fb40,0x4042138f),
+ LL(0x4464f342,0x80899c8c),LL(0x084be305,0x0f54c993),LL(0xfbf84810,0xfacecac3),LL(0x8ae5244f,0xa6585936), LL(0x9a9f8d4a,0xb467c3c0),LL(0xfd394895,0x3e5f219c),LL(0x9bf85fa8,0x39f0767a),LL(0xd8ee6022,0xd97cc55d),
+ LL(0xc83f86c4,0xc480938f),LL(0xe43bfcc6,0x6479b8ef),LL(0x38cabad7,0x8e6f2e22),LL(0x31f8c6aa,0x48e57fdd), LL(0xcfbbdcac,0x66dd6a77),LL(0x50ece329,0xc7d9950b),LL(0x0747a937,0x2e31f205),LL(0xa07acb8a,0xc0f8a7e2),
+ LL(0x15eaa686,0x578477bd),LL(0xf2f58b50,0xd72fb935),LL(0xd3a64d22,0xe9fdbc6f),LL(0x492dc89f,0xa3e42674), LL(0xa8fb7d24,0x42410ffd),LL(0x52676ed7,0x08a37dfd),LL(0xcb5d6125,0x4607c41b),LL(0x4001fa42,0x7db48af8),
+ LL(0x50cd30f0,0xe2264eb1),LL(0xe215f8d7,0xbb6fe952),LL(0x97e3fe73,0xf3ce2411),LL(0x37f19247,0xe52e2179), LL(0x20c233c1,0x9c7fc8c0),LL(0xb383b101,0x91c7e721),LL(0xa7ac883f,0x1163c472),LL(0x9d3b0f1e,0xbe1c3b3a),
+ LL(0xa3536baf,0x07be716f),LL(0x62e9c19a,0x764d9f4e),LL(0x8eaf19f4,0x15af3499),LL(0x38ea0ace,0x987a7c47), LL(0x4a1f0117,0xb03740b8),LL(0xfe098a9f,0x5cd1164f),LL(0xc9d6fee5,0xaf952cef),LL(0x3c0ad28b,0x4e86dcbb),
+ LL(0x677b7a8f,0x81125450),LL(0xe69273d2,0xba889fce),LL(0x582c5990,0x4a40a859),LL(0xf48934c3,0x836638b3), LL(0xf3596ba6,0xe964e189),LL(0xde8b0754,0x2f417c0e),LL(0xd5f93f1b,0xd883169f),LL(0xd45bb389,0x0318fe4e),
+ LL(0xdb03273e,0xe2c998a1),LL(0x33ec151b,0xc34f544d),LL(0xeb92d963,0xae0456b1),LL(0x9738857f,0xaab61ec4), LL(0xf71d9c39,0x4fb6a34e),LL(0xd816ec44,0xaa9dbd8c),LL(0x5efdf950,0xf6532e37),LL(0x67109c55,0x7151dc44),
+ LL(0x3f4e322c,0xb18b586a),LL(0x3553a18b,0x27b30066),LL(0x1ae4cd85,0xbd31ea24),LL(0xa64de69a,0xe8f88f4a), LL(0x609c13bb,0x8c946a97),LL(0x0eebd9f0,0xbf8cc55a),LL(0x7a8892b9,0x446aa2e4),LL(0x65b98c31,0x660c0a55),
+ LL(0xd3463522,0x568c56fc),LL(0xeb130aa5,0xfa6bf3a6),LL(0x008dc0da,0x16c1568b),LL(0xfed70a87,0x9c4132cc), LL(0xd497fdff,0x3e983d09),LL(0xf0ebe6b0,0xd7a0e542),LL(0x68b542ca,0x193a07e0),LL(0x07c6ab4f,0x4909776b),
+ LL(0x418acd7b,0x55b77ef4),LL(0x47a77d32,0x64ba62d3),LL(0x2d1f562e,0xaec1aa93),LL(0x10dc5999,0x3468725b), LL(0x6ff0d478,0x422851b1),LL(0x8e7dddcc,0x15da8429),LL(0xb8ac5238,0x38567920),LL(0x2e3344d8,0xfd29eb4a),
+ LL(0x4fc636b5,0x7b2af70c),LL(0x879e7640,0x242acfc8),LL(0xb5e25c7b,0x88e89786),LL(0x16ec1bfd,0x85576b1b), LL(0x1891e595,0xb31c8253),LL(0xca5608a5,0x14315dfe),LL(0xb0c14fd9,0xb9d61b76),LL(0x734b6cab,0x5d5ad8a3),
+ LL(0x44aee005,0xc2ea321d),LL(0x147ed658,0xd68abd2c),LL(0x893db877,0x31152d60),LL(0x281487b6,0x4807ac46), LL(0x65da04b5,0x58ebd15e),LL(0xb2f9d1fd,0xf0f74fd4),LL(0x393c7d91,0x3d04aa65),LL(0x8e7e6a2c,0xb46fb59a),
+ LL(0xae1eed5d,0x9236fdf1),LL(0x7810e2be,0x71936f56),LL(0x6d9ff147,0xa1ead7d5),LL(0x149a9b6d,0x32670ed8), LL(0xcb58ea59,0x12772fdd),LL(0x9df52ddb,0xfce260b3),LL(0xccab1e97,0x3221f2fb),LL(0x57762484,0xf8ff7e37),
+ LL(0x855512cf,0xb0a31a1c),LL(0xd71d4c4e,0x293a819e),LL(0xcd6a900f,0xc1ebc896),LL(0x9b9e0a4b,0xc727a646), LL(0x0018f29f,0x06124fc0),LL(0x41b7730c,0x67bd8fed),LL(0xc77be72e,0xeeebf0f0),LL(0x474d747a,0x427fe6fe),
+ LL(0x932ccbf0,0xa7fb9a4f),LL(0x5f3d489f,0xabb9c85e),LL(0xbdf26442,0xe7e4f956),LL(0x38d17422,0xd014848e), LL(0xd3e9bff6,0xae37d855),LL(0xca5aeb09,0x88fbae1d),LL(0xf025feaa,0x1a8a740b),LL(0xb9475ebb,0xc1a67821),
+ LL(0xde2bf8a2,0xb6cb6acc),LL(0x66a0f14e,0x9b2ab1ca),LL(0x83b2ba59,0xcbfbc068),LL(0x68447934,0x336ab62c), LL(0xf19719b8,0xd3a016a9),LL(0x0b5b9d6e,0x819a31bb),LL(0x3e1c6c0b,0x7b24be2b),LL(0x013f6821,0x10834b4a),
+ LL(0x86f21d2c,0xe5e5de27),LL(0xe9e35ad5,0x56b46a2d),LL(0xe2111e59,0xfc4e861d),LL(0x6e37ca63,0x7472ce5e), LL(0x27d2210e,0xafab9a71),LL(0x9ff6245a,0x1644a0a6),LL(0x8dbef51f,0xee498acb),LL(0x2e9604d3,0xd4c70da1),
+ LL(0x6fecb64c,0xde487364),LL(0xd15fb62f,0xa8fda1fd),LL(0x088de028,0x97e2febe),LL(0xecdce095,0x4a769019), LL(0x50a58ddb,0x4cb6a338),LL(0x17028d36,0x08df59d8),LL(0xb51722b7,0xfe3a80ff),LL(0x963c2383,0xa3cc2fe2),
+ LL(0x53cc5341,0x40b2df49),LL(0xa3c4bf2f,0xf3e90d4c),LL(0x20f02731,0x3f25c5ec),LL(0x69065d9a,0xd84f5b5a), LL(0x129921be,0x156d350e),LL(0x1b116922,0xe98787cc),LL(0x39e77b13,0xba5f9b82),LL(0x044449a5,0xee4d79f5),
+ LL(0xdd6d852d,0xb54b7388),LL(0xf9ca5fdf,0xf7554c5c),LL(0x51228a81,0x864d1fbf),LL(0x9a80f90b,0x721e1add), LL(0xad0efa62,0x89d4e297),LL(0x6dba9404,0x4e471a87),LL(0x1c1008b0,0x9a38158b),LL(0x95c47ec2,0x3dfe81a7),
+ LL(0x28603026,0xcb02ce9b),LL(0x3bd357fc,0xfd3207aa),LL(0xf296f5f2,0xb3807bdd),LL(0x23c2ea7e,0x7895918d), LL(0x88feb3ba,0xdc0eb62f),LL(0xbdd75674,0x024dfd84),LL(0x0a1e0496,0xe5bd3828),LL(0x24c8f30c,0xb8b1cd86),
+ LL(0x674d10cf,0xb559e34d),LL(0x9f962ec5,0x6955bb69),LL(0x542af42d,0x8bf1ab6c),LL(0xdfa61256,0x3f2f33fa), LL(0x73d1049e,0x32140195),LL(0xdfd7f39b,0xf5089278),LL(0xb4237be0,0xb42eb51c),LL(0x874d0e57,0xdf747f44),
+ LL(0x77b5d475,0xbe64bb22),LL(0x28308634,0x2c3d5ecb),LL(0xcb999c46,0x936a2987),LL(0xe26489ea,0x5a30ddfa), LL(0xc8eabf9c,0x8bfc782e),LL(0x74c8c6e3,0xb9995bb0),LL(0x391f5c5a,0x4f99c7ac),LL(0x5270c4ad,0x67f4092b),
+ LL(0xe6e8135e,0x6771a29d),LL(0x6c698cec,0x988dfb2b),LL(0x77812aa1,0x7818600f),LL(0xfd98e1c1,0x04393c83), LL(0x864ef146,0xe448232e),LL(0xa465ab71,0x9b70ecf4),LL(0xb13cc704,0x31df0531),LL(0x16e48426,0x401ae0b3),
+ LL(0x7fc514ed,0xa8106630),LL(0xde4b1614,0xda798170),LL(0xc2c684fe,0xde892efc),LL(0x05d64eff,0xd5205bc1), LL(0xe1d59ba5,0x84df4ead),LL(0x89bb2ea7,0x65245ca1),LL(0x64edbf51,0x3de6ca34),LL(0x56bcebf9,0x115296e4),
+ LL(0x7fd52a3d,0x0851631f),LL(0x949ad4be,0x9881db71),LL(0x88caf772,0x4b2337dd),LL(0x33ec7979,0x02da59de), LL(0xafe840df,0x2473c620),LL(0xa92ef1d0,0x2965ebff),LL(0x6fcd9651,0x2452854f),LL(0xbac2ed99,0x97092935),
+ LL(0x08242246,0xf0743ce7),LL(0x6d1a8439,0x76fdd82c),LL(0x61079258,0x3627c890),LL(0x82b21983,0x312f98f1), LL(0xe9173891,0xd87dceec),LL(0xd7a30e32,0xad16cfe0),LL(0xc9c7efaf,0xc404a1a6),LL(0xd6df357e,0x46e34671),
+ LL(0x7a02aa32,0x92fec7c4),LL(0x5a6a7bb9,0x567fef7e),LL(0xa3f97b5d,0x35fd570c),LL(0x4a4b0dfa,0x456bad8c), LL(0xa677f090,0x85a3f42c),LL(0x22a68d53,0x35060bb8),LL(0x53567530,0x1cea9d11),LL(0x8169fbce,0xf2cbc8dd),
+ LL(0x86cde794,0xa3e1d52d),LL(0xb3bdf344,0x72a258cb),LL(0x31b8614d,0x2997cd59),LL(0x8164b632,0x31ce2ea4), LL(0x0eba7545,0xe495e9b7),LL(0xbc4403b5,0xaad69130),LL(0x45760d9b,0x37f6389b),LL(0xb871b17d,0x00f4d58d),
+ LL(0x4aa359d7,0x91973d4d),LL(0xc8dd0582,0x249f510c),LL(0x7608be27,0xef11ac87),LL(0xd940b1c7,0xce116714), LL(0xfef20037,0xf34881f3),LL(0x98203f4e,0x26222472),LL(0xe9363154,0x4c9e98ed),LL(0x03a8158d,0xa806b3a6),
+ LL(0x09d16ce3,0xdd974d66),LL(0x59ae977a,0xe1bcc513),LL(0x218464d6,0x0e6201c7),LL(0x9e35c7af,0x05789811), LL(0x8b33a863,0xb1596f7a),LL(0x42bd8284,0x8fa93aeb),LL(0x46e11559,0xf197c202),LL(0xadd27d86,0x356b9c81),
+ LL(0x1695cb70,0x3c4080fd),LL(0x20f20318,0xc10c28cc),LL(0xce1ffab9,0xe9d7ed93),LL(0x4f9de9bd,0xb23976b3), LL(0x6d61a6f2,0x9b1b81dd),LL(0xf6318874,0x7537d729),LL(0x20cee7ab,0xb75022f4),LL(0xaa430952,0x425fddba),
+ LL(0x1ccfb3fd,0x54c4306d),LL(0x46a30a37,0xf10a54f1),LL(0x74fd4925,0x2d332a29),LL(0x1438feb2,0x8d2fa921), LL(0xfbb41bd2,0x46a9c6b5),LL(0xd30c65fd,0x87e98550),LL(0x66cd9a20,0xfbcb2ca6),LL(0x91719670,0xc176530e),
+ LL(0xcec38056,0xdd4a1a18),LL(0x75544998,0xe6ef1793),LL(0x30583fb6,0xf58f69cf),LL(0xaa76bf2b,0x12197860), LL(0x3bb686fc,0x717813e5),LL(0x0f06c403,0x9beeb1ae),LL(0x2782dc86,0xd83416ee),LL(0xb5500ccc,0x5fc89c01),
+ LL(0x8e110ed3,0x063aee25),LL(0x45963073,0x1a87377c),LL(0x5110634f,0x86944f59),LL(0x0ba76459,0x50659ae1), LL(0xde9eb40d,0xa00e48ff),LL(0xfe5b118c,0x49235afa),LL(0xc425ee38,0x81705008),LL(0x2d5f2f92,0x3c01abc8),
+ LL(0x6fdf148b,0x4a21bc95),LL(0x0b7e6871,0xea5cc30e),LL(0x11713844,0x90b4abb6),LL(0xf2001af9,0x3b7d734f), LL(0x782b2020,0xfc616b89),LL(0xd8b0e02d,0x68b3935c),LL(0x1cbb2de4,0x54cf5b8c),LL(0xa7c0f7ac,0x42b0432a),
+ LL(0xbdffae5e,0xa04e06ef),LL(0xd4b636ee,0x36cac28e),LL(0xc3a98127,0x08a06b2f),LL(0x290c5385,0x1ef0b57b), LL(0x27154c46,0x14e184b8),LL(0x60910b3e,0xa5dd3444),LL(0x3c67a74b,0xd0008ac4),LL(0xefed9fd1,0x2649cba4),
+ LL(0xf0c1bb4f,0x26bc537a),LL(0xd06b90f5,0x37f376ff),LL(0xbe7c89cf,0x4d48d994),LL(0x8d572003,0x511c2158), LL(0x088dda1e,0xc26fbac1),LL(0x7ad4934c,0xc3d55189),LL(0x85dcaf7c,0x5233c176),LL(0xa88b473d,0xec3a8a29),
+},
+/* digit=5 base_pwr=2^35 */
+{
+ LL(0xb1f0c175,0xfd96667a),LL(0x2ab99e7d,0xa256a611),LL(0x05e43f9d,0xff07c1ea),LL(0x7e1c9cd6,0x305700bc), LL(0x2b2887a3,0x3f1e2546),LL(0xc772fd14,0xdd782f49),LL(0x38584057,0x9125f996),LL(0x16a02cf9,0x19fd0396),
+ LL(0x4c58174d,0xa8d62bd3),LL(0xa900551f,0x872251d3),LL(0xf12802c3,0x06f5862d),LL(0xdd925555,0x5d93c48a), LL(0xbd6006f8,0xc39b67d5),LL(0xf96ccc67,0xea6f756b),LL(0x543014db,0x140e853e),LL(0xe9de42c0,0x2bdc5674),
+ LL(0xe01c073d,0x01dfda7b),LL(0xff9e1234,0x07a6bb65),LL(0x622cee4e,0x2a4f7f18),LL(0x50f0a3a7,0xdf4cead8), LL(0x1b8c2903,0x152b3c8e),LL(0x5f2a89b3,0x9e82e999),LL(0x68ce7a3c,0x0e6cfa7e),LL(0x0ca0464c,0xebb34d90),
+ LL(0xeda49f74,0xfa1a58fa),LL(0x0e4545a3,0xddb89957),LL(0xc74c07e4,0xd3576489),LL(0xb59b1008,0x64e4b39e), LL(0xf66b546c,0x3b090340),LL(0xcdeb912f,0x0e0f4013),LL(0x01e55cca,0xbb00b46c),LL(0x99ad0768,0x55b61b34),
+ LL(0xe8bbda5b,0xb06b71fc),LL(0xa24b0a63,0x8de64d84),LL(0xb5d4603f,0xb73dc262),LL(0x1965a916,0x5d5fa964), LL(0x3bc98966,0xb48a4053),LL(0x6f564743,0xaa871863),LL(0xe76a6a3e,0x88b00822),LL(0xb38d9e0d,0x58c9e92e),
+ LL(0xe989963e,0xc0d22337),LL(0xd3778d5a,0x2c4831ce),LL(0xee8c4178,0xd775c6a5),LL(0x9d0c2894,0xe2391654), LL(0x5d0eb314,0xf7d4fe86),LL(0x8b2290d3,0x42801b8f),LL(0xcdcefa78,0x73e9b332),LL(0x3e877fea,0xc0d169d9),
+ LL(0xffee23fa,0x29c8138b),LL(0xfb92e3b8,0xbff98230),LL(0x8fa75007,0x14077ad5),LL(0x88e61b81,0x4d3a6e10), LL(0x3bcf733d,0x218a867d),LL(0x665e37fc,0x20ff6566),LL(0xda5cbf67,0xe39c0581),LL(0x8add8c4c,0x4a6e1d7c),
+ LL(0x734a1327,0xcab02370),LL(0x1951afa8,0xa1df7afc),LL(0x42638b8a,0x581cfbaf),LL(0x2130eaa6,0x39db6d2b), LL(0xda2f91a5,0x4bbc805b),LL(0xe569add8,0x3dcb0a7e),LL(0xd721fa7d,0x724ab65a),LL(0xf88f8008,0xa5152b95),
+ LL(0x281615ba,0x7fe7f1b9),LL(0x41d5aa0c,0x419d1a53),LL(0x9fb0917e,0xafc556dc),LL(0x616ce893,0xab2a69f3), LL(0xc0861e05,0xfb9a6eb1),LL(0x5eb02b8f,0x0b74ae11),LL(0x3b1e44fe,0xccff0ad5),LL(0x88824f53,0x86dfe0e6),
+ LL(0x41177a46,0xedf38dc4),LL(0x7f039a7b,0xd9a955bb),LL(0x4d8ae7c2,0x4f152581),LL(0x4f848819,0x063c9f83), LL(0x841e8783,0x54ea4526),LL(0xaa5f2b32,0xe86a4119),LL(0x19846dcf,0xb7529a3b),LL(0x35689d70,0x91356a07),
+ LL(0x8f049ef8,0xbe66f5db),LL(0xc38dd5ed,0x0f5fd99e),LL(0x1b4ae7a7,0x1896d52b),LL(0x480b1ebb,0xf27c45c6), LL(0x3fede5c1,0xd88cff4c),LL(0xda27560b,0x57d902c9),LL(0x52d57deb,0x84aa7f07),LL(0x08bb6028,0x8da4c7c8),
+ LL(0x8910763e,0x658f4dea),LL(0x076a0f80,0x6e5fcb48),LL(0xab65f9b9,0x6a5447a4),LL(0xa75bb0c5,0xd7d863d4), LL(0xe87e7916,0x806c34a7),LL(0xcd961e88,0x05391559),LL(0x74fe6aeb,0x5def2d88),LL(0xf9226ca1,0x8ac350b2),
+ LL(0x12401813,0xffa8a649),LL(0x5337c55d,0xd6182762),LL(0x3be902e3,0xfce9d7ff),LL(0xea0dd7a5,0xb3b275d1), LL(0x2cb48ac9,0x342620f4),LL(0xa8b38a74,0xc0369384),LL(0xc0695d3a,0x04b0ee6a),LL(0x94c5394d,0x4d025585),
+ LL(0x81443d16,0xff9635d0),LL(0xa6cc364b,0x2342cbfa),LL(0x25bf8438,0x63b0a032),LL(0xa078d298,0x6ccd3ce5), LL(0x91292fd3,0xf93bd108),LL(0x14073286,0xc887a31b),LL(0x9f62cd16,0xeb1275bf),LL(0x61578b46,0x0335bae3),
+ LL(0x53348e4e,0x810d5efd),LL(0x63c74225,0xf9cd822a),LL(0xa426bf44,0x93d2e810),LL(0x019d36b3,0x95a47a97), LL(0xd5d1f840,0x1da421b9),LL(0xd6c46e3c,0xe5b8a55f),LL(0xc9244881,0x2dd3a5e7),LL(0x70c1fd2f,0xd50f9cde),
+ LL(0x614d9ff3,0xbee2aca7),LL(0x358f245a,0xd1f13b2c),LL(0xc46f62ab,0x9e92d83f),LL(0x827d7374,0xc1dd32dd), LL(0xc3e566e7,0x1636d593),LL(0x04ccb02b,0x81c2f4e7),LL(0xcd35b652,0xb57782c6),LL(0x88210d42,0xad88787e),
+ LL(0xfbd7d35a,0x3ad52d72),LL(0x37a2a095,0x4117f502),LL(0xd356b3b6,0xed03d415),LL(0x15ca6087,0x135d5a8c), LL(0xef5dca2a,0xfbaba41f),LL(0xafb4787d,0x660e5cd0),LL(0xa55e9ef0,0xe0e66378),LL(0x69939f56,0xf24513cf),
+ LL(0xab4f6bd9,0x0f38f09c),LL(0x922dcac1,0xec3037b4),LL(0x08a1a51e,0x706b201a),LL(0x8ffff040,0x15911351), LL(0xccf63d87,0x239d7b6a),LL(0x5187f595,0xeca37dc8),LL(0xad5a0ab3,0x04ea79e4),LL(0xe9520e8f,0xcdd81522),
+ LL(0xc35e1020,0x7fe6b6aa),LL(0x140ac884,0x57b63c9e),LL(0x33f19077,0xc45c23fc),LL(0xb71273c5,0x468d2c36), LL(0xfc305ac2,0xeb6839d6),LL(0x0183793a,0xf6e310ff),LL(0x32da639d,0xbca206e4),LL(0x8518e27e,0x8eb5cac1),
+ LL(0x66ed96f9,0xfeed0feb),LL(0xecc3a8dc,0x1632632e),LL(0x1455c8ae,0x90449363),LL(0x0aeada65,0x8d7619d4), LL(0x9f630ee9,0x2f2fa898),LL(0x370db87c,0xd78caf0c),LL(0xc45898cf,0x46fa0fc9),LL(0x2d84244f,0xa509cc3e),
+ LL(0xa5b099aa,0xbdbea4b4),LL(0x7592587b,0x8e8fe284),LL(0x42000897,0x0226d387),LL(0x36db5cd9,0xb6780551), LL(0xca64f047,0xd8fe5eb1),LL(0xb77cf8cb,0x6f21474b),LL(0xee45ae34,0xab8fcae7),LL(0x1f19cd67,0x73eaf9eb),
+ LL(0xee4df6ce,0x5bb96415),LL(0xa3ae4cf3,0xd1e27bcf),LL(0xc7f1868e,0x9bf7ace3),LL(0x82091dca,0xe821aa8b), LL(0xd381b6c4,0xf732e6bc),LL(0xdd01864f,0x5feda346),LL(0xb6387846,0x0933b92c),LL(0xa0028029,0xbf1f1e83),
+ LL(0xa3e38124,0x0848bf8c),LL(0x208fda8f,0xfe295fdf),LL(0x8913a1c4,0x73379239),LL(0x7e78564e,0x59354b24), LL(0x32dcafbc,0x042b7529),LL(0xfa93c5c7,0x752173d3),LL(0x9737135a,0x6ffd4590),LL(0x0f983005,0x249712b0),
+ LL(0x1f25da8b,0xdbba2874),LL(0x097ba4a9,0x14027f11),LL(0x34b8e4a2,0xe429b3c7),LL(0x056b4afc,0xd66a43e3), LL(0x2ac351e6,0x158644ad),LL(0x164bc6cc,0xff4aecd9),LL(0xf6c615ee,0xbb5b0c87),LL(0xd7679b1b,0xc497d8ee),
+ LL(0xf1c6e97a,0xf666c625),LL(0xc73a277f,0xe89f84b2),LL(0x746af4c0,0x2403d513),LL(0xb7101feb,0xe6858fdf), LL(0x84f1dcb7,0x1a42c51b),LL(0x8202bc04,0xc57f12e0),LL(0x754df5ae,0xf8326a93),LL(0x81a46aef,0x3d3daf04),
+ LL(0x01232d03,0x8bb8c276),LL(0xfb371cf1,0xd446c82e),LL(0xefa495f4,0xe5e8b639),LL(0x477e6493,0x51a7b34a), LL(0x824f2b6e,0xffba5466),LL(0xf0eaa6a9,0xcc67ddad),LL(0xfee19b24,0xcf0f8ce1),LL(0x83b3df41,0x34309127),
+ LL(0x9719a6cd,0xc8b13e8c),LL(0x619d5c33,0xb408e505),LL(0xa3158864,0x8c1b831b),LL(0x0b3d02bb,0x506b3c16), LL(0xbf11ff8d,0xf23846bc),LL(0x16e0328a,0xf0f043e8),LL(0x65986a7a,0x30b7b9cd),LL(0x21b660cd,0x0951b102),
+ LL(0x52bf29a5,0x72a26c5f),LL(0xb6534592,0xb513d669),LL(0x578195ea,0xb8ac15ad),LL(0xc0785f88,0xd6ed33ea), LL(0xb9e33946,0x39e23dbf),LL(0xf43e88eb,0xeadb2453),LL(0x2746c34b,0x6d82fefa),LL(0xcc542b54,0xe9172aa0),
+ LL(0xecb50699,0x8af6b819),LL(0x1c1d0af9,0x4af76939),LL(0x99dddb1a,0x5a7dbbbe),LL(0x891ea41d,0x97b0a3aa), LL(0x6e35ea4f,0x32b457e6),LL(0x9d77b900,0xe2a21c2a),LL(0x2ac991cf,0xb18718d6),LL(0x740743cd,0xc4416237),
+ LL(0x6a05ab55,0xcc3f76b6),LL(0x98091425,0x2ab4b29e),LL(0xb6478fc8,0xbf373ad1),LL(0x178b5844,0x8a1a9489), LL(0x09daf4be,0xb5295edf),LL(0x4ed54766,0x07fbb119),LL(0x7d0b9d8f,0x6e44367b),LL(0xedb96a10,0x6dc4d8f6),
+ LL(0x37fc19a3,0x2ba69106),LL(0x0b138296,0x522eba39),LL(0xfda58cf3,0x751544c7),LL(0x0ba33938,0xaba6fe16), LL(0x94dac7d6,0x48e085be),LL(0x19f99faa,0x06c87014),LL(0x1a587f89,0x33b9a8d6),LL(0x3fd8d8fe,0xdae382ca),
+ LL(0x150b0fcd,0xb5b383c6),LL(0xed9b0f4c,0xf948da80),LL(0xccd05413,0xcf075225),LL(0x4f62be64,0x3f31b12c), LL(0x368c17f6,0x23b21fc8),LL(0x400bc690,0x423d5369),LL(0xdeac140e,0x5335dd1e),LL(0x9493ad61,0xe631c249),
+ LL(0x32fe490a,0xc274c695),LL(0x6d8ebd70,0x42bcb4e1),LL(0x65d7a1d0,0x69059e1e),LL(0x29fdd109,0xf36dfe2f), LL(0x0c4e6370,0xacfea1ec),LL(0x7a935ff4,0x97e7f722),LL(0xf8006bbd,0x83e7c7c3),LL(0x78e6792c,0x87a8b84d),
+ LL(0x94d3d60f,0x5cbe4883),LL(0x91cbc054,0x6eba464d),LL(0x021c38fa,0xf9c880d0),LL(0x21af4942,0x6200faf1), LL(0x5f03e261,0xd5b2b12d),LL(0xf3ea3e07,0x1659a0ac),LL(0x836757a8,0x8008f18d),LL(0x75a8f8e0,0xfb2f467b),
+ LL(0x9c9b00cc,0x9a6183c7),LL(0x3bf842b0,0x82ca07e3),LL(0xee1f83d9,0xe7089191),LL(0x2d0cd2da,0xc41ecde4), LL(0x4d1feacd,0x0ce421b0),LL(0x431c53f1,0xe80a1395),LL(0xe6bfccf5,0xae9b2018),LL(0x8b359c3b,0xdf9f86ad),
+ LL(0xb6170a5f,0x9887e28f),LL(0xf3c0c30c,0xf5b85d21),LL(0x632af7a4,0x30861cf8),LL(0xbb4ec123,0x2fb670ad), LL(0x3c425976,0x0668b84c),LL(0x02883af7,0x55c21b4e),LL(0xf8698d29,0x0fad58b5),LL(0x68b671c5,0xef210770),
+ LL(0x23f232b8,0x534d510a),LL(0x49c99708,0xdb66fec1),LL(0x6d54721b,0xf1a6f3e7),LL(0x4480f858,0x8d37ab64), LL(0xb0f7f354,0x7fcfca6c),LL(0x95bfd318,0x58c7ff5f),LL(0x903f9d91,0x3048e9af),LL(0x75357af0,0xe480bc0e),
+ LL(0xa5a1162e,0x4f915e1c),LL(0x37efa40c,0xdd539c21),LL(0x789201c2,0x61a45c53),LL(0xe7890746,0x1bc2333d), LL(0xbbed8f77,0xeed38f50),LL(0x178501a0,0xc1e93732),LL(0xa8fb8623,0xfed5b1d1),LL(0xdc3e1148,0xa3be3e2c),
+ LL(0xa71a390a,0x62fc1633),LL(0x2891c4c3,0x4be2868e),LL(0x2a0c3c23,0x6573fe49),LL(0xde1589d0,0x182d0bd4), LL(0x5a7aa63d,0x17c6a780),LL(0x12543191,0x9d84cfa8),LL(0x950c85c9,0xcdb22db7),LL(0x119010c4,0xd03589e0),
+ LL(0x8220dee8,0xbcd02e8a),LL(0x705632fd,0xbd4d1f2a),LL(0x22f8e30b,0x00119bfd),LL(0x6eb97c32,0x06c6e73e), LL(0x35abff53,0xa26f0a6a),LL(0x8564c37d,0x7d79a89f),LL(0x1b207495,0x0347bb17),LL(0xb5c8253a,0x1baf90e9),
+ LL(0x37affc96,0x01059b5f),LL(0xffee0a60,0xbe76c578),LL(0x75d6b83c,0x45d7291b),LL(0xe0b58129,0x212ff131), LL(0xaa5d46ed,0x4acc5748),LL(0x9193931b,0x9fc557d9),LL(0xda4eba9b,0x17568fcf),LL(0xa0edc975,0x2cf3690c),
+ LL(0x953df6fd,0x0e8b0e7e),LL(0x62036a87,0x38ea7cea),LL(0x655c3685,0x57e01428),LL(0xc39d8a43,0xaedfee73), LL(0x5fb27e0a,0xed7f6598),LL(0x946888e0,0x524c3653),LL(0xe949b72f,0xd84a299b),LL(0xb0c61ea4,0x76c1397a),
+ LL(0x1afe465a,0xfd9f7ed0),LL(0xdbbaf852,0x832c69ad),LL(0x03713338,0xcd888c22),LL(0xe3306617,0x4e1fe026), LL(0x23521b97,0xa87adf86),LL(0xf9fbb2a0,0x673d3625),LL(0x5d8f5b80,0xf29a1413),LL(0xd3526501,0x6e9be0c4),
+ LL(0xe8bfd84d,0x6129f861),LL(0x77e35a47,0x1df491d6),LL(0xa84a82cb,0xefe0e9a9),LL(0x6d949612,0x972bc3bc), LL(0x3a766eca,0x8d7795f5),LL(0x12fcc6d4,0x6119383f),LL(0xc95f0e21,0xa66d9836),LL(0x684e434b,0x77a0aa0a),
+ LL(0x7dd7b05a,0x3d55d256),LL(0x0fed8362,0xda616243),LL(0x383e94fe,0x24bd0fe8),LL(0x6bfd0cd2,0xbc2b7334), LL(0x321f7a70,0xf9497232),LL(0x6a3df54f,0x37a4c2f6),LL(0x4ddc49d6,0x7ba783bf),LL(0x04408c76,0x4d142317),
+ LL(0x38b99f23,0x7502146b),LL(0x21992e8f,0x479ab73c),LL(0xd52c41d3,0xf605370a),LL(0x3a60435f,0x358b746d), LL(0x5bc537b8,0xb2cbab94),LL(0xb99057d3,0x1fd24431),LL(0xb8510f3c,0xff2242a0),LL(0x0733bc53,0x74b4965d),
+ LL(0x86edc9b2,0x30a3a634),LL(0x49c07c7f,0x99c9cf19),LL(0x5b0cd506,0x9d8a50c2),LL(0xbbcb3d65,0x0ed9da5a), LL(0x013f88ec,0x6de1fb5e),LL(0x09086f8c,0xc9356bff),LL(0x2b8825d7,0xa272e1ac),LL(0xf2c5ba33,0x3ad83acb),
+ LL(0x275bce43,0x721ca22c),LL(0xd24f78e8,0xf058b8a7),LL(0xeed46b97,0xd178eb57),LL(0x259fdb5b,0x4ad7d425), LL(0x1b515fe5,0x669ed853),LL(0x76fa1b5e,0x9f14b8e5),LL(0x3da46b02,0xfaba8d0c),LL(0x338f7652,0x759c2c95),
+ LL(0xb5c0ceb3,0x9a369cb0),LL(0x28a2a633,0xc1d2d1ab),LL(0xfcb48cd3,0x676190e3),LL(0xee09c3b1,0x9af97ab3), LL(0xf7e918f5,0x39323719),LL(0xfd3cd554,0xc657cb57),LL(0xa2a02d5c,0x78a33d05),LL(0x64ada03f,0xda3b79df),
+ LL(0x61b3a72a,0x7115ab5c),LL(0x337194fc,0xdd19f34b),LL(0x8f0a14c3,0x0f23bfec),LL(0xa60485d3,0x1fe19eec), LL(0xa463dc9b,0x1ca308c3),LL(0x5e1ae8be,0x83e18dd0),LL(0xd928c0e7,0x849eabdf),LL(0x6bd3e7b3,0x2d131ff5),
+ LL(0x45be4c14,0xc84cd284),LL(0xf8f4c719,0xdee94092),LL(0x3cb73831,0xe8f223ef),LL(0x18c2361e,0x24382f88), LL(0xbe91c8dd,0x205366d0),LL(0x56024b95,0x1e17b50c),LL(0x742cabd3,0x3c3487da),LL(0x8bad494c,0xbe451387),
+ LL(0x18ffaef0,0xfae6c0bf),LL(0x85ed1ede,0x2e7b0ee3),LL(0x125d1488,0x3cebaa05),LL(0x7c8b7fb8,0xcd0de0fe), LL(0x464bc74a,0x59434d54),LL(0xa03fd77b,0x17472da2),LL(0x2c1a9edc,0xab23d042),LL(0xd9cf4b37,0x5390625e),
+ LL(0x0531264e,0x43b85844),LL(0xee7aedca,0x8d71805e),LL(0xfbe643ad,0x4ace3068),LL(0x5f7d46c1,0xc98d1cd2), LL(0xf59b3acd,0xd4888744),LL(0x27288b99,0xcf662d61),LL(0x5bce2649,0xf2704561),LL(0x206ae654,0x33a8f3f9),
+ LL(0x9bce2b39,0xe834843f),LL(0xa90cfc7d,0x8de8e41d),LL(0xd81115b4,0x398800ed),LL(0xff2532da,0x4d33f7c5), LL(0xdcc59e2c,0x5ae37fb2),LL(0x24015306,0xca27b622),LL(0x11e8d6e6,0x51beca89),LL(0xa9693774,0x08c0b7e2),
+ LL(0x72fa713e,0x795e1a21),LL(0x4be58266,0x5ec1c123),LL(0x1be14fc3,0x5d8e87da),LL(0x80283ad5,0x82cefc1e), LL(0xdab7865e,0x820a385b),LL(0xf3daf96c,0x11e32d62),LL(0x5835a989,0xf022ade7),LL(0x00242233,0x2cbc2554),
+ LL(0xe7ce649c,0x653335a0),LL(0x6857eff7,0x8b30baef),LL(0xf3288377,0x7ea7c856),LL(0xe8572f5d,0x1387b347), LL(0xbe10c0cf,0x8a6b0352),LL(0x037c97b9,0x2a74e834),LL(0x197b122e,0xfe10bf59),LL(0x1918aced,0xd1ee174c),
+ LL(0x3958c20d,0x568e5fb9),LL(0x0484a92f,0x1188cbe6),LL(0x4b0d29e3,0x00ec14f4),LL(0x16a2796d,0x2b2e078e), LL(0x20440444,0x48b8cffa),LL(0x661ab68d,0xd4b877a0),LL(0xc4b459fa,0x1f352ab1),LL(0xc53aa54c,0x33accbe6),
+ LL(0x02bb383b,0xce4ff566),LL(0xfd62813d,0xcad561c6),LL(0x01dfc9a8,0x0927c348),LL(0x00fb9a61,0x0dde73fb), LL(0xfce59f34,0xd859809f),LL(0x81872a46,0x225bd9b6),LL(0x0314bb90,0x2642add2),LL(0x0ae61eb8,0x82dc7958),
+ LL(0x22d5b667,0x84c97478),LL(0x6214f46d,0xb2fe94d1),LL(0x12cb20de,0x834740f2),LL(0x8aa69c94,0x336dc7a7), LL(0x939a33e6,0x8ca085a4),LL(0x75a94543,0xd59c9ae9),LL(0x3c47dd07,0x83c97f98),LL(0xe3177231,0x0985f73e),
+ LL(0xebbc623d,0xe556c3fc),LL(0xb1b968fa,0x30a3242f),LL(0xbcd05a51,0x842ce9b0),LL(0x0ad576ce,0x241a35ed), LL(0xbb4a793e,0x49ccaf3c),LL(0x4492a828,0x6e6c7a7b),LL(0xba53eb42,0x72f4f5fc),LL(0x3ea74dab,0x0ca4ba53),
+ LL(0xbbaf9d5f,0xe7b5fb06),LL(0xb02d3b20,0xd49c2e17),LL(0x2d933cc8,0x4d31052a),LL(0x07299aec,0x5346e0b4), LL(0x79aa99ec,0x952a6205),LL(0xecb34e97,0xaab9bc32),LL(0x58ffe9ae,0xd539d7e4),LL(0x9d994472,0x91599393),
+ LL(0xe8822711,0x6b1d4868),LL(0x73d452b8,0x8857e282),LL(0xf08ed046,0xad59adfd),LL(0xc1c47abe,0xdb755d65), LL(0x63275d49,0x2df8520b),LL(0x7f8a3249,0xc3c712ec),LL(0x5215ef57,0x55f2a108),LL(0x3ee2f149,0x955e07a3),
+ LL(0x33f344f4,0x2194ff53),LL(0xbad16820,0xb455b9fe),LL(0x610b4e4c,0xfe69ea78),LL(0x8ab11fe8,0x2957be96), LL(0x2ce14366,0x3efdee3c),LL(0x01eddf9f,0x42043f9f),LL(0x93524f6c,0xfb7998b1),LL(0xdfecf763,0x95ea64c0),
+ LL(0x21afa86f,0xb23d2620),LL(0x86b11457,0xea757f03),LL(0xb0148d30,0x0bc4d2d1),LL(0x88ce4170,0x119b5535), LL(0x0aa9c8f6,0xaab5bb67),LL(0x88e05de2,0xdfc9693c),LL(0xe3f1e9c3,0x6cae7e57),LL(0x6f6c3b9c,0x2b1ceb54),
+},
+/* digit=6 base_pwr=2^42 */
+{
+ LL(0x87636183,0x12e335ca),LL(0x719d1ca3,0x1461a65a),LL(0xb14161d8,0x8150080a),LL(0xc612e112,0x08da4ebf), LL(0xa8498a9a,0xc95dfb6b),LL(0xba0f8dba,0x099cf91d),LL(0x4fb4f497,0x12d2ae14),LL(0x33cb7306,0xfa3a28b0),
+ LL(0x0f01c7ce,0xc89fc5d0),LL(0x7283bdf0,0x6fc45ffd),LL(0x81151923,0x71dece81),LL(0xc433fcc9,0xed1cb14c), LL(0xd3959bcf,0x4279612b),LL(0x35b5732f,0xe163880b),LL(0x71d0a1ca,0x35414ca7),LL(0x2c1e47f3,0xe8b9e651),
+ LL(0xc8df0a74,0x4ff11b0c),LL(0xe095ea9a,0x346ba520),LL(0xcc2bc6c0,0x81dd2268),LL(0xc2701468,0x2fb2e99f), LL(0x98053f0e,0x0d213361),LL(0xf7ae879a,0xe0b8280d),LL(0x952560f7,0xd92b7a75),LL(0x9723b62e,0x8d17dfad),
+ LL(0x08b21362,0x5ce8a78a),LL(0xd9fe0b36,0xf37f5e7f),LL(0x2c87837c,0xdca66c7f),LL(0x0bf2e993,0x92524b94), LL(0x71745788,0xfc0f020c),LL(0x3cbfbf4c,0x6018de46),LL(0xac3de1c8,0xa8446691),LL(0x5de5ae41,0xb194d419),
+ LL(0x2ff27af2,0x1586cdff),LL(0xde26b5ef,0xee628535),LL(0xc682923e,0x58480040),LL(0x5e37da30,0x4dd4596b), LL(0x2f64225f,0x247b9fd7),LL(0x51ca2121,0xdcc6de5f),LL(0x86e7ab9a,0x99fb41ac),LL(0x952b413a,0x54c782a0),
+ LL(0x7298c7d9,0x7641190e),LL(0x716eda14,0x499c35ed),LL(0xbb764e90,0x316134bf),LL(0x884fc34e,0x4d23467e), LL(0xf1d13484,0xfd1208a9),LL(0xcd298a74,0x089d9605),LL(0x73c4346a,0xb398c85a),LL(0xf37f13de,0x50064076),
+ LL(0xa6ebb83d,0xfe10d25a),LL(0xa834b30d,0xc5e3edf8),LL(0x683e09ff,0x546b5d5c),LL(0xc6dc44c6,0x02f96218), LL(0xc0edfc04,0x64528c55),LL(0xb0fc3058,0xb5a44a2c),LL(0xceeff21c,0x9f09b116),LL(0x6b0fbbcd,0x077bcd67),
+ LL(0x9ce76a94,0x29aaa4a8),LL(0xc0725c97,0x847cd081),LL(0x97e16665,0x0c099e90),LL(0x8f7b1fc4,0xe409ffc9), LL(0x690941ed,0xc0575b80),LL(0x92c0ee9d,0x8e25100a),LL(0x9b75837d,0x71662d27),LL(0xe56bb22b,0x6eeb9e97),
+ LL(0x85c6a60b,0xf1d6333f),LL(0x1d7ccfaa,0x982fee9d),LL(0xd4634535,0x1c5e28e7),LL(0x94fec469,0xa76e1d27), LL(0xafe377ec,0x1fe944d6),LL(0x2f68ae6b,0xbd579a25),LL(0xab6b515e,0x10eabb93),LL(0x31b4e4b8,0xa17b5f6c),
+ LL(0xaf72c239,0x05e785fb),LL(0x8af42e92,0x597e2016),LL(0xb32ae6c9,0x663f5a72),LL(0x45541cc6,0x3040ff13), LL(0xdeca6b32,0x6140081f),LL(0xc735001b,0xcdaccaf7),LL(0xdaef0e68,0x62de5066),LL(0xd837df99,0x056e9021),
+ LL(0x16cd1be7,0xba399283),LL(0xcfacf7ad,0x2a486323),LL(0x277777ce,0x00c15730),LL(0xd49a254c,0x5d2f200f), LL(0xdb68078d,0xf38a1f3b),LL(0x33604a36,0x595dea3f),LL(0x904b60b2,0x14749d8c),LL(0x246348ff,0xe70c96d8),
+ LL(0x390e35da,0x04340d52),LL(0x27a9947c,0xc098e3d3),LL(0x9ecc7a3f,0xe6d78198),LL(0x23aa6df6,0x2c39102e), LL(0x300f3cb1,0xb83fed0d),LL(0xdcfbe054,0xc0b1e356),LL(0x20cf45a8,0x3da2224c),LL(0x2f30deda,0x5be55df7),
+ LL(0x2faa9530,0x4d31c29d),LL(0x49d42f79,0x1d5783ae),LL(0xf618b3f3,0xe588c224),LL(0xf8f5b65d,0x7d8a6f90), LL(0x62d09174,0xa802a3d2),LL(0xbddd1cb7,0x4f1a93d9),LL(0x35a5c1dc,0xe08e1d3c),LL(0xf9d2958e,0x856b2323),
+ LL(0x96f00090,0xefd1e3ba),LL(0x3e0d25de,0xd489943f),LL(0x30c8626f,0x082c40ae),LL(0xa4f428e0,0xf6e5b5ef), LL(0x38a7f623,0x660414a3),LL(0x23eefed8,0xcd4e68de),LL(0xfc14e750,0x6dcadc62),LL(0xbeae89b6,0xcb78b3bc),
+ LL(0x1d5e580e,0x445acc56),LL(0xc43abe19,0xbf6547ef),LL(0xc922d50f,0xd160a81b),LL(0xf68eed4e,0x3877c7f8), LL(0xf8a9f64a,0x395745ea),LL(0x603350f6,0x9085b253),LL(0x8b1df366,0x2a4c71f1),LL(0xabe332dc,0x49b9e818),
+ LL(0x528960b1,0xb3e76e66),LL(0xd84aecb3,0x445dc393),LL(0x1612ad64,0x13618436),LL(0x8c831e37,0x3ccbeccc), LL(0x6121383c,0x0fb0bd41),LL(0x80d895a3,0x316164a3),LL(0x233f2f1e,0xc3d34153),LL(0xe0d92225,0x2905906f),
+ LL(0x95456622,0xe12d66e2),LL(0xff554b13,0x10469942),LL(0xf7126c09,0xa894af86),LL(0xf581d3f5,0x448f3267), LL(0xa2b5e758,0xb5512926),LL(0x43fddd90,0x08f02988),LL(0x8ba319e6,0x5f437035),LL(0x865b37e7,0xd254188e),
+ LL(0x8a5cb63a,0x5b281b23),LL(0x6dd136c2,0xa15a2712),LL(0x169beae4,0x00fab229),LL(0xde31b4a1,0x400d3f37), LL(0xf8545cb0,0x275877a4),LL(0x36df0277,0xb396a513),LL(0x838ced07,0xf9896978),LL(0x715cea8d,0x86e68167),
+ LL(0x06a5a96d,0x0eb0f0de),LL(0x1fcf91ae,0x2c7a3672),LL(0x630eca3a,0x287bf614),LL(0xf60c9d2d,0x65347473), LL(0x906efa7f,0xed15a229),LL(0xd549b5b3,0xe7be6381),LL(0x2ce9141b,0x23f32972),LL(0xfcf823f8,0x9618d9a1),
+ LL(0xa3d89e15,0x3d0ef0d3),LL(0x0d07f5eb,0x4d5a30c9),LL(0x73e4887a,0xc359e310),LL(0xdbdec349,0x2f4c6b7e), LL(0xba142643,0xc5a1d3e9),LL(0x11c794b6,0x8f4fd58e),LL(0x1810c63d,0xcad091d1),LL(0xf0bfa76c,0x5b616239),
+ LL(0xa838792a,0xe3433562),LL(0x54148e98,0x4aead02b),LL(0xdb66f216,0x809f2baf),LL(0xeabfe5da,0x09cc90ff), LL(0x63e8edad,0x69eb235a),LL(0xa7f95997,0x64f7acb5),LL(0xfae20f25,0xe999ea18),LL(0x3c4966b3,0xcd7ff208),
+ LL(0x345c8929,0x595e0cc0),LL(0xde5e2498,0xfe43c73c),LL(0x503f216d,0x0cdefc98),LL(0xf98826fb,0x8e4e170d), LL(0xb6c79b1c,0x1492247d),LL(0xef0532aa,0xf8e24b38),LL(0x044bc458,0x9f349d51),LL(0x1002d315,0x2ef04ead),
+ LL(0xda60d581,0xaf322f23),LL(0x0681173f,0x07deaa88),LL(0xa78feca0,0x86b97444),LL(0xc633a54d,0x64d336ea), LL(0x2a426cbf,0x10dd4b1f),LL(0x7af59869,0x08d97c15),LL(0x2d7fe97e,0xb8cc814b),LL(0x3bfb60fe,0x7eacd2e1),
+ LL(0xb790881c,0x967dafb7),LL(0x3663e76c,0x2002b8e4),LL(0xf8e82490,0x3bd28ede),LL(0x4bb2a47a,0x44dd2e81), LL(0xdbc3f2f8,0xde750dfe),LL(0x6e2eec70,0xd9b6e912),LL(0x1e4c4d2f,0xe8400e2f),LL(0x23217be2,0xd3325697),
+ LL(0xd4231a1d,0x030b7e39),LL(0x613d17d8,0x1f72e8b1),LL(0x01857d37,0xcd423512),LL(0x0b4b7926,0x9ecd682c), LL(0x8ec44636,0xfe4ac1c3),LL(0x9aacc091,0x4a030cbf),LL(0x0b133f54,0x12bb252e),LL(0xf970d266,0xbf90ea5d),
+ LL(0xf5484410,0xe00d25f7),LL(0x2a922894,0xb4984eeb),LL(0x8e1e09ce,0x498102fd),LL(0xe1d731bf,0x8f8c9fcb), LL(0x0b4983b7,0xdb897669),LL(0x7b2468f5,0x7a7767f9),LL(0x72f4d5f4,0x1a2f9fe8),LL(0xa6169daa,0x10e95aa9),
+ LL(0x520166e9,0x9487e50f),LL(0xc4ee6a95,0x6f6b115b),LL(0xcf7560f8,0xaf29926f),LL(0x1f989e46,0x20a32458), LL(0xd3bd2473,0x165a2232),LL(0xe9fecdf8,0x93d841ff),LL(0xbf9978c0,0x71d63fa7),LL(0xe7de184b,0x381bcf34),
+ LL(0x347dfaef,0x317c8e40),LL(0x64464bf3,0x795b0f7d),LL(0x1364ec20,0x15dc99d6),LL(0x91600d3f,0xc07fce28), LL(0xc8bebbda,0x9825338b),LL(0xa8547c03,0x5e5e89f6),LL(0x1a040b84,0x3c50032f),LL(0x2b3a533d,0xcea7544f),
+ LL(0x43247e19,0xea26d87d),LL(0xfba8368e,0x7e753390),LL(0x3c7bcfc6,0xb35e75cb),LL(0x7e44aab3,0xf78cb5ce), LL(0xa98d7104,0x4a3534e9),LL(0x6f5852ea,0x2b83ea6c),LL(0x68dced7c,0x11337fff),LL(0xd1a2a294,0xcca0f2c6),
+ LL(0x426bf202,0xb547c662),LL(0x66194a34,0xec50423e),LL(0x78161e84,0x11d34865),LL(0x64f04dec,0x83508c06), LL(0xf7732345,0xd1c72976),LL(0x18e77e0a,0xd624bacd),LL(0xba79bdd9,0x71344b75),LL(0x8d6c1474,0xe4bfe085),
+ LL(0xcc5eb43a,0x505e8fd9),LL(0xdaaf0621,0x612ab1d0),LL(0xe6672368,0xde170783),LL(0x83788673,0xfee7df44), LL(0xd119271d,0x364d6885),LL(0xe1b0cea2,0xdd70bae8),LL(0x5832adba,0xb4b873ad),LL(0x8c683749,0xad3ecc18),
+ LL(0x4d217a2e,0x963d8793),LL(0x1fa4702d,0x099e8c56),LL(0xe6431f1b,0x6d91bc47),LL(0xa5f61399,0x3fd21287), LL(0x682fa08b,0x2fc90bae),LL(0xc1ca371c,0x51699c85),LL(0x831c428f,0x16f29d74),LL(0x9fa2b504,0x0ecefb66),
+ LL(0xa75c5a91,0xd04ac53f),LL(0x3bf0524b,0xcbe62421),LL(0xb8792826,0x91dcb3ce),LL(0x7885092a,0x28a6bf88), LL(0x64c1e218,0x24798e59),LL(0x3fec97dc,0x18e848dc),LL(0x9da457b7,0x935e0f50),LL(0xb8f497a6,0x46b67ab7),
+ LL(0x7651e4ff,0x15a38140),LL(0x4890cd7f,0x6ba6c617),LL(0x5fe253ca,0xa527b8d2),LL(0xff3d603b,0x945277b8), LL(0x75392f01,0x10796155),LL(0x2bd9619d,0xcac8f713),LL(0xdebb8e28,0x71a87eca),LL(0x52ab1792,0xe8e6179e),
+ LL(0xe33705e7,0x4ce3998b),LL(0x48ba56e4,0xf9a0661a),LL(0xd9e4e184,0x47f06b30),LL(0xf9f8f6df,0xda465f75), LL(0xc0ad3e20,0xb05acbbe),LL(0x92bc2c13,0xec8776a4),LL(0x240a908b,0xbb3971b7),LL(0xbbd0cecc,0x80a14367),
+ LL(0x086949bc,0x40911e50),LL(0x4064a19d,0x39b3ab69),LL(0x6b07eaa7,0x538c6d96),LL(0xd3723bde,0x38c05b47), LL(0x080d2a64,0x1e669308),LL(0x2a77601f,0x6b44dbe5),LL(0xe7c6ce9a,0x35579681),LL(0xa16afa75,0xd2950b0e),
+ LL(0xeaf7fafc,0xd228a3ba),LL(0xee878f00,0x9324e71d),LL(0xe413c1ce,0xa853bfc1),LL(0xdcf17d1c,0xfe916368), LL(0x2546154b,0x8611383a),LL(0xe715b375,0xdbdf225d),LL(0x8dbb0651,0x874d70a6),LL(0x9ed56391,0x84e58895),
+ LL(0x3776503c,0xca83d8ad),LL(0x46e82d65,0x2cf38b4e),LL(0xadf3a8d1,0x65af46e6),LL(0x1d31056d,0x4f09a4ab), LL(0xcacc81d5,0xdba27b42),LL(0x5d6e1bdd,0xb6caa0ca),LL(0xf7198b26,0x1086e441),LL(0xac572f9b,0x15dfe6cb),
+ LL(0xd2051dd5,0xd9444337),LL(0x834cd72d,0x6c34b236),LL(0x58df3f28,0x84783216),LL(0x2e921372,0x59b8808e), LL(0x55835302,0x3b268249),LL(0x9f4863f1,0x3299cbe0),LL(0x4c4e213a,0x616e3cdd),LL(0x8c824317,0xa3c84868),
+ LL(0x460ed764,0x884be61c),LL(0xb6041177,0x388df47b),LL(0x60b29b0b,0x27089763),LL(0xe502ba08,0xd66d7d53), LL(0x5acbfaf4,0xadec85ca),LL(0x470c9519,0xfbacf9b7),LL(0xdbcda5b2,0x5d18b7f6),LL(0x0f228ed5,0x7615c036),
+ LL(0xd6000825,0xdfcd8273),LL(0x9d440eb3,0xdacfcf11),LL(0x7738fa46,0xa8257834),LL(0x76281df3,0x7db548af), LL(0x3e0b052c,0x71dd19f6),LL(0xd876613f,0x811feef2),LL(0xf9c3155c,0x7536e854),LL(0x4c8c1220,0x3e594973),
+ LL(0x069b4228,0xf8c5c72d),LL(0x1f2f6b02,0xc077d394),LL(0x76393a52,0x0032dfb9),LL(0x706c3572,0x5e52c880), LL(0xe003750f,0x4a9d6e9d),LL(0x6147cee7,0x3d54814d),LL(0x23b655fa,0x09ed7f77),LL(0xf1988361,0x14fff651),
+ LL(0xfb263d48,0x742f3abd),LL(0x53699a0c,0xedb557dc),LL(0x7ecd0f61,0xc692a474),LL(0x058f0d17,0xdc64f583), LL(0x3227d3ed,0x68a9ce75),LL(0x4601d083,0xfd0b0320),LL(0x9c2cee38,0x7167b330),LL(0x710e350d,0xef658993),
+ LL(0x16910648,0x75a83be1),LL(0x2e7d446c,0x5b32e77d),LL(0xa86ba2de,0x8e0534e5),LL(0xb692aeee,0xc8a92eac), LL(0xf663150f,0x3cf686eb),LL(0x01962baf,0x840eaade),LL(0xa264d877,0x3e06154f),LL(0x24630300,0xbbd04137),
+ LL(0x58631468,0x0b0151bd),LL(0x9f99bbe5,0x570ef82c),LL(0xb30f7b96,0x03565f47),LL(0x98c04b24,0x000628e0), LL(0xd6ccdb2b,0xd34a90ae),LL(0xa99a761c,0x1a584858),LL(0x65e29f1b,0xa640ddca),LL(0x728d3208,0xffb672f9),
+ LL(0x5433abd8,0x550f6392),LL(0x13ff0107,0x4f35e116),LL(0xe731a37b,0xbb2b0fab),LL(0xc83d6e74,0x1e8a5a08), LL(0xc6565e23,0xf617e177),LL(0x76da0795,0x8e370e5a),LL(0x03936a55,0xa5631e02),LL(0xd41293ad,0xe576bee9),
+ LL(0x5381bc98,0xfcfd9bc7),LL(0x000a98ab,0x8a42ddfd),LL(0xb49463c4,0xd6091ca6),LL(0x9754ce07,0xf37f6b9f), LL(0xfa399fda,0xe1543897),LL(0x8810063c,0x7b029ead),LL(0xec5a5b52,0xa98a46bd),LL(0xd50cc504,0xdd162811),
+ LL(0x67a95e56,0x4d725c1d),LL(0x8e17af44,0xc36d6e8b),LL(0x313454c1,0x38ffb699),LL(0x991e4eaa,0x22c3da8c), LL(0x0bb72dc0,0xfa36ee15),LL(0x4fd01d32,0x356bbf74),LL(0x3c7939a3,0x9ff71a30),LL(0x691786e9,0xa0ad2fb5),
+ LL(0x283c34c1,0x7d7f4770),LL(0x2454a31c,0x0148a4f0),LL(0xeab3b646,0xdcbb138a),LL(0xf101223e,0x7834bdb9), LL(0x965baa81,0x49de6cc3),LL(0x15471215,0x5462f15e),LL(0x81d17760,0xd77e7a56),LL(0x53f00de3,0xa08c5ad9),
+ LL(0x397ed010,0x2e6e6686),LL(0x2bef28cb,0xe444a5a9),LL(0x4073cbe4,0x1ab9d616),LL(0x18f0b7dd,0x24c6b9e0), LL(0xc2a93055,0x456482b6),LL(0xefbe8715,0x0f89129f),LL(0x62e5f6f2,0xb50818c3),LL(0x3d63c663,0x1d74a1ca),
+ LL(0xd84bfa55,0x9a9124ee),LL(0x254b3f04,0x6cf81f41),LL(0xa1051109,0x7c9b7c3e),LL(0x640e8df2,0x71c3d6d6), LL(0x62f6af2f,0x56571157),LL(0xe1bc9ae8,0x2ec61a3f),LL(0x2fcc848b,0x20caa2ff),LL(0xdc5c297e,0x71e30dac),
+ LL(0xfbc0740a,0x11901efc),LL(0xb6e35fca,0x4994fc5f),LL(0x177de7dd,0x4dc09eba),LL(0x0494bebf,0xedfdd25c), LL(0x0cbaeb8b,0xc4821ed9),LL(0x66788fbd,0xa9ef7a48),LL(0xd65efbc2,0x5b7a7ca5),LL(0xa9cb1fc6,0xe18feb42),
+ LL(0x56b00ab5,0x2cc74b9c),LL(0xdb4bf3f4,0xf559a140),LL(0xb8a4b54e,0x283136d4),LL(0x37032aa2,0xe969e4f8), LL(0xd85beed3,0x5635fb66),LL(0xa72a54bb,0x32bc4fdd),LL(0x4c386a49,0xc1e5ee2b),LL(0x795a0b08,0x979fd877),
+ LL(0x431f0b8e,0x5acef24d),LL(0xd13cafef,0x9f1c4a80),LL(0x4659f447,0xf19ac70b),LL(0x10f561ae,0x82bab6b6), LL(0xbbc879a7,0x1268e7f3),LL(0x79c37165,0x7e7d7141),LL(0x597e313f,0x491f049d),LL(0xecc98736,0x6ca7e73e),
+ LL(0x80a31eb9,0xd7712aa4),LL(0x2d8b99d7,0xbf7376ca),LL(0x2b8e5f7b,0xc1166cdc),LL(0xf1a48c9b,0x562bf290), LL(0x31c38c75,0xa6e72238),LL(0xb5f42def,0x51a9a100),LL(0xa100b75f,0xa0931d81),LL(0x967830be,0x7022479d),
+ LL(0xc192bc29,0x53eaaa1f),LL(0x4123a9f2,0x09504e7a),LL(0x90671997,0xe897397f),LL(0x4294fda2,0xc56185d2), LL(0x9819b185,0xb531f278),LL(0xe9dda4cc,0x390155ff),LL(0x14d26bf9,0x1258a5d9),LL(0x7e5f13a1,0x47d8f5ae),
+ LL(0xe9591945,0xef9e05e3),LL(0x846441be,0x92d20e07),LL(0x1d897ad1,0x28cc70ef),LL(0x0bac861f,0xee962e74), LL(0xbed368e4,0x9b7a4236),LL(0xe49b9720,0xe65ac22a),LL(0x22c1bd82,0x851f0032),LL(0x1e75ab15,0x771573ec),
+ LL(0x702eb71a,0x2e0a4635),LL(0xee924cd9,0x65167c74),LL(0x10ccabb5,0xe16b3515),LL(0x10ea5907,0x63cf15c4), LL(0x616f5290,0x59dacdc6),LL(0x8e372a43,0x19eb409b),LL(0xe3c36beb,0x5c879337),LL(0x0555fa1e,0x5841e7e2),
+ LL(0xf346ec2d,0xce197347),LL(0x221db43d,0xe14818a8),LL(0xc935c025,0x1bf37115),LL(0xfee14ce0,0xb22bdb03), LL(0xf0e3dfd6,0x893c5efa),LL(0xb1f95e1e,0x8fe9d56c),LL(0x407e4db0,0x6ee580e5),LL(0x9fb33911,0x0292bfc4),
+ LL(0xb2869cac,0x598ce787),LL(0x4798690a,0xd2f77720),LL(0x9cb6015a,0x2689e0f3),LL(0x7127b0e8,0x8831ddeb), LL(0x5c4fd58c,0x44db087b),LL(0xcda33285,0x04a0c68e),LL(0xe1a4c364,0xe55f00d7),LL(0xb6393b21,0xb3a2ea9a),
+ LL(0x5e9d8db9,0x99ef4da3),LL(0x17b484bc,0xa01f11d9),LL(0x1767f6ca,0xc2283fbf),LL(0x9e77f389,0xbb524479), LL(0x10149726,0xc4ea3c66),LL(0x82ec5f64,0x4b71d644),LL(0x642944c7,0x0fe49d52),LL(0x5a17a7bd,0x69fef689),
+ LL(0x8c3dce23,0x2f3588fc),LL(0x68e0c237,0x9d429231),LL(0x86fa61d2,0x63756076),LL(0x729bc192,0x1d89c6b8), LL(0x00d3ffd1,0x85e098d2),LL(0xde6f9109,0x5bf292c2),LL(0x3e7b8f23,0xb20dc994),LL(0x87c6eb54,0xcbe51bad),
+ LL(0x0517b914,0x263fd862),LL(0x225499a7,0x447624ad),LL(0x71f807d9,0xfbb831bb),LL(0x2fe2e021,0x9514fe38), LL(0x52418e9a,0x881e8763),LL(0xf1d9b43b,0x268e4655),LL(0x1f780af9,0xf917044a),LL(0x3d758ba5,0x3727b2d9),
+ LL(0x68755cf3,0x8487eb90),LL(0x7fe12541,0x1887394e),LL(0x46af8ca8,0x2e4c65d4),LL(0xb9e119dc,0x72aae645), LL(0x1ec6ad73,0x958e0094),LL(0x8ce4573e,0x84a7eec4),LL(0xf9254b96,0x3d6d00d4),LL(0x8e421732,0x4ef44f58),
+},
+/* digit=7 base_pwr=2^49 */
+{
+ LL(0x7d3ad2ac,0xf59de0f8),LL(0xc0f92c5c,0xd2670cb1),LL(0xc900b6a5,0x8f05944a),LL(0x8d9668eb,0x11aeed23), LL(0x7c488ea6,0x21b038e4),LL(0x78083d75,0x406ea3f7),LL(0x3bd31fe2,0xd22197b4),LL(0x28a6ef9a,0xdc8f8ccb),
+ LL(0x02887281,0x679a6483),LL(0x7f9de66f,0x13f3d39b),LL(0xf1a7dee2,0x289c3c50),LL(0x40b698b8,0xa510a53c), LL(0x06f799ad,0xc566c3fb),LL(0xb5374650,0xcc95a879),LL(0x61c947b2,0xbd7343c0),LL(0x9543e51b,0xbbbff69d),
+ LL(0xba75aba9,0xb80d38dc),LL(0xd150f881,0xe9b61ac6),LL(0xca7b47c5,0x9f56af52),LL(0x77fb3128,0x040300d9), LL(0xc01fd0c1,0x36877184),LL(0x8b6e134b,0x40112a04),LL(0xccd71653,0x56daed90),LL(0xb74bd62e,0xec553aa6),
+ LL(0x11476dde,0x0398381d),LL(0x1ea0923f,0x4959204d),LL(0x017745bd,0xd67427ad),LL(0x6935e467,0xef022a74), LL(0x24e0380a,0x57e799f5),LL(0xb5f1a730,0x6ee2b64f),LL(0x521771d8,0x9aeaac48),LL(0x0992a13c,0x02c8521c),
+ LL(0x48f6934a,0x25dd9f41),LL(0x3e38e31f,0x8d191988),LL(0x32899837,0x35548844),LL(0xf56b07d6,0xf87c696b), LL(0x73e927b9,0xbc66e7d7),LL(0xbb0bedc5,0x04cdac77),LL(0x0bcd022a,0x1e6f2903),LL(0x22c574b5,0xafa637be),
+ LL(0x55c1759b,0xcdca4b1e),LL(0xa6819d39,0x3d46ee3b),LL(0xb4b0fce9,0xf7497ade),LL(0xdcb613c3,0x54aef506), LL(0x522ff464,0xbc11d721),LL(0x37bd3c51,0xf53f16f2),LL(0x485695b9,0x88f29955),LL(0xdac00fe3,0x428ce742),
+ LL(0xa3520c27,0xd971fbd2),LL(0xe05e1b9d,0x2204fe54),LL(0xf0c15c89,0xb08be507),LL(0x901a15c3,0xfeeda919), LL(0x84b60eb5,0x6576ad3b),LL(0x59e951da,0x40d4b9a1),LL(0x76244608,0xbe96e1b8),LL(0x58ef9f37,0x3af35ec9),
+ LL(0x153adbf7,0xbfe5c43b),LL(0x80351fec,0x07a66edf),LL(0x3b109e60,0x3d804235),LL(0xa832c162,0x4dc97176), LL(0xb1db1e5c,0x03fec75f),LL(0xa15b9900,0x6aa02da6),LL(0x4faa1cff,0x5f9e808f),LL(0xa6412a26,0x90aa28bd),
+ LL(0xe041d453,0x2fb2c15b),LL(0x86c18ef0,0x2b847efa),LL(0x115b7318,0x84f5ee9d),LL(0x71699936,0xd568b080), LL(0x6ea5c852,0x34658ae7),LL(0x126d10ce,0x99f918b3),LL(0x09b9407f,0x75e3d9cc),LL(0x7883f978,0x11c6a0bb),
+ LL(0x876db0fd,0x522a6925),LL(0x7a9a4211,0xc5401ca1),LL(0x6789e755,0x89163b57),LL(0x0fd6f1b8,0xd2b2c99a), LL(0xa7b452dc,0x427eea22),LL(0xef9db65c,0xce8e6682),LL(0xda9c80f7,0xfd835810),LL(0xea916411,0xdb91bfbb),
+ LL(0x798b5051,0x7a5aefad),LL(0x42a0d4cd,0xbd7ebc88),LL(0xbac28520,0x958e327a),LL(0x7d010c77,0xfa8bf6d4), LL(0x579752f4,0x8a7040aa),LL(0xe573d895,0x47974d84),LL(0xfe16f77b,0xfd2a0cdc),LL(0xdbf71fdc,0x0f08f86a),
+ LL(0x2983bd4d,0xb19de6f1),LL(0x1e3a28b3,0xb990931e),LL(0x00cbc4f9,0x43b71b8b),LL(0xf4d75a0e,0x35d1ddd0), LL(0xc653f111,0xc211951d),LL(0x88750928,0xbbc46824),LL(0x174803e3,0x0cf6e752),LL(0x8960d80c,0x81f5e0ac),
+ LL(0x0c52fcf9,0xe03ca085),LL(0x0865ced4,0xa795382e),LL(0xe7117376,0x03bd561c),LL(0x3fd7184a,0x8608dde1), LL(0xa2a98acc,0xfd48fd50),LL(0x11df74b0,0x902fa587),LL(0xfa73b8f1,0x683f101d),LL(0xe7c0efa6,0xc805d31b),
+ LL(0x5b11d6c0,0xe5effb4e),LL(0x01c8374c,0xba30f747),LL(0x0c275aec,0x8733511b),LL(0x97354e36,0xf140b740), LL(0x0341268e,0xb01ded69),LL(0x27eac17b,0x17bc3176),LL(0x8984992c,0x88097703),LL(0x3e05061c,0x37bfafab),
+ LL(0x111d0eb8,0x7eca9f09),LL(0x8f243481,0xda7eb023),LL(0x59b5e491,0xac3cb2d6),LL(0x4f794842,0x56e725b1), LL(0x45b2dff6,0x43245254),LL(0xef10ec78,0xeafe73b9),LL(0x78819dbf,0x0d3cb2bc),LL(0xe784eb22,0xff1cd617),
+ LL(0x9ce0fcd6,0x0dbaf1c9),LL(0x3232a847,0x732ea65e),LL(0x6a75d822,0xdb2ce218),LL(0x3d2273ca,0x88ffd479), LL(0xf2f26b61,0x89092ad2),LL(0x686706ab,0xfb7041bd),LL(0x5e23597c,0xe3d5fa75),LL(0x5995fc84,0xa2035bf8),
+ LL(0x4514b8bd,0x1feecd2c),LL(0x434b9233,0x57cb78b4),LL(0x24215322,0x59bd2ad7),LL(0x1ce8daa0,0x41437de2), LL(0x7147ce80,0x401bbece),LL(0x5abb61e8,0x5e462137),LL(0x5a3790eb,0xbbf21033),LL(0x5134dee3,0x9a791c09),
+ LL(0xcedd2cc1,0xc8ded766),LL(0x6447b925,0xa3e48e9d),LL(0x69efa728,0xc73282a3),LL(0x8d408bec,0x8cb72c30), LL(0x41cf92eb,0xfb4f2797),LL(0x26f2412e,0xef3f42a0),LL(0xa941ab5a,0xdbc0f972),LL(0x98337613,0xc7bd62dd),
+ LL(0x4e45dcbd,0x31892744),LL(0xb51b7f91,0x3b2979cb),LL(0x29b27fec,0x41e002f5),LL(0x4dd51b0f,0x9007ee68), LL(0x6e23d565,0x82f417a3),LL(0x77127820,0x3321f343),LL(0x199b32be,0x8d09d965),LL(0x5bc2017b,0x948429eb),
+ LL(0x124eb248,0x22b639f9),LL(0x125f8c22,0xed097f74),LL(0x5f8bed34,0xdbc02517),LL(0x51aa29c3,0xb93f5b42), LL(0xc7368c44,0x6fedd599),LL(0x2c772a9a,0x99a5a795),LL(0x7a5f156e,0x30b35ba7),LL(0x191c45af,0x9dc50978),
+ LL(0xb5b4c4fe,0xe8d241f5),LL(0xb75f54f8,0xda89eac1),LL(0x9ef86ae5,0xb399dba0),LL(0x51c1b8c6,0x2337bb46), LL(0x4d02f348,0xfe60b0c5),LL(0x0afc6cd0,0x709f1235),LL(0xb40fce18,0x8a0b458b),LL(0xe3929cfa,0xefe143aa),
+ LL(0x0ca6cec0,0xab3a4b0d),LL(0x67246ec3,0xcb235374),LL(0x1ec2538f,0xdf9b0e89),LL(0x80c7b53d,0x3ec2ea13), LL(0xd0ae3146,0x920c55f2),LL(0x43946090,0xd3ac4e1e),LL(0x97ebe7a4,0xeba72583),LL(0x393d401f,0x5031644a),
+ LL(0x9714de1a,0x802c3409),LL(0xde5bacba,0xc62d66d0),LL(0x903b8148,0xb6c2abeb),LL(0x5bffe1c4,0x203531ef), LL(0xe862ead7,0x186266de),LL(0x1a23bebb,0x21e643d5),LL(0x6edda603,0x15c13d11),LL(0xb1bebc77,0x39b4a3a3),
+ LL(0xb9ac4754,0xdb456c1a),LL(0x4d3f305a,0xf497e6e9),LL(0x3fa62dc0,0x84d27e3a),LL(0x2524b94f,0xc18c3569), LL(0xe380f5cb,0x92198954),LL(0x272ea458,0x81d8221c),LL(0x5f328491,0x6fa082f6),LL(0x8e304ccf,0x810ca5af),
+ LL(0x0d76e6d5,0xda9f1c15),LL(0xb7abad72,0x4bd38afc),LL(0x08aa20f5,0x14b5cc26),LL(0x81061318,0x010a1af8), LL(0x03c287c0,0xaf9d7a73),LL(0xbc4d40ab,0x9ba5105a),LL(0xb07937a6,0x99e4b824),LL(0xc869f63c,0x026d294c),
+ LL(0xc910b521,0xaaebde75),LL(0xa7d5dd9c,0xc803ded4),LL(0x62764be2,0xc8b713b0),LL(0x92540cf3,0x5ea9ea2b), LL(0x6930bd0e,0xbaa999c6),LL(0x1f4b254c,0x57052e53),LL(0x2b0b27ee,0xfb9fd699),LL(0x4cc83793,0x86b70932),
+ LL(0xfba59bbe,0x09ab4dd7),LL(0x04f4609e,0x83204fee),LL(0x93934977,0x251cb390),LL(0x647c13e8,0x8add9e8b), LL(0xe7ea7006,0x444815d3),LL(0xbd032c32,0x22333c0a),LL(0x4058b7cb,0xe7728dc8),LL(0xd1bc061f,0xde8eb503),
+ LL(0x493d76c2,0x5d3ece2e),LL(0xd804954a,0xa425f3ae),LL(0xeac95eb8,0x49100271),LL(0x38b4be56,0x94e4dfa0), LL(0x650f9930,0xa855893f),LL(0x50264765,0x1fa0a07d),LL(0x0d1d40be,0x37a3c169),LL(0x2eed2a0d,0xfedb51e4),
+ LL(0x1b3348b4,0xa6e0c2b2),LL(0xc414464e,0x9e361f42),LL(0x176e109a,0x3e14e2ee),LL(0xf4af92fd,0x5f1a6bbe), LL(0x84beb8e5,0xf15d4647),LL(0x97d36132,0xac3f01c1),LL(0x84ca42ae,0x36e669bf),LL(0xd9433ca1,0xf789bdbd),
+ LL(0xf71e84d4,0x384f37f4),LL(0x59d6481a,0x57de9473),LL(0xf5e6fa70,0xa9a81f99),LL(0x6cb57bf3,0x26f0a64f), LL(0x061d38fe,0xc07e1c13),LL(0x4a475732,0x6fae70e9),LL(0x840e595c,0x6cfb6b1d),LL(0x62848351,0xb23cf1f2),
+ LL(0x4fcf8743,0xef6094c7),LL(0x05fab119,0x7dc42218),LL(0x5c220d15,0x3207463f),LL(0x22c4bfb2,0xdf51b3f0), LL(0x1572735b,0x13db445b),LL(0x2f6db574,0xd7662537),LL(0x7796f888,0x692f1e05),LL(0x33f45593,0x9f3d7a5b),
+ LL(0x313de667,0xb5deb892),LL(0x66a478a8,0x75c872d7),LL(0xc4992428,0xb67b5513),LL(0xf70fde09,0xf97e010e), LL(0x60ee268c,0x49b0f053),LL(0xf67cd321,0x981b5141),LL(0x4fbc187c,0xb5a1ac8d),LL(0xc12e6da8,0x162417e2),
+ LL(0x62914938,0x07bb6fff),LL(0x19f44438,0xd385285b),LL(0xa28904dc,0x05a610a1),LL(0x5a29b9f8,0xd80a7099), LL(0xc177af4a,0x72ccb553),LL(0x5e3752f4,0xac0bd91b),LL(0x7ae838a0,0x8e8ae668),LL(0x1fdfe7c3,0xcaa5a46c),
+ LL(0x93d34156,0x2cc2c1a5),LL(0x61fe4572,0x22beffb1),LL(0xfcdc7418,0x66f9f3ce),LL(0x6af66892,0xbaccda41), LL(0x1af43f56,0x775c783d),LL(0x0ae04034,0x1b23b187),LL(0xe99b486b,0x5a9325f4),LL(0x8367ab05,0x36d5bfe9),
+ LL(0xa519d028,0x17d8d2fb),LL(0xbe00e7e0,0x27b6beb2),LL(0x15a3f03a,0x8d51c36c),LL(0x5faac8dd,0xbf90e78b), LL(0xb27ab69f,0x4e8c28e7),LL(0x4a553da4,0x37ecf0c7),LL(0x210fe720,0x3a39682f),LL(0x0b0cdd0c,0x60c62e80),
+ LL(0xa16647cd,0x893aa225),LL(0x64ce0455,0xcffb728e),LL(0xc4f0fe79,0x81891d39),LL(0xf9c39f00,0x1abe3073), LL(0xf961d05c,0x88336c27),LL(0xa5fc96df,0xc9033a88),LL(0x864b39f8,0x0d084405),LL(0x851e95c9,0x866aa904),
+ LL(0x98bae4a8,0x0c36da08),LL(0xb5feb202,0x9f88d799),LL(0x8054e4da,0xcd9aeb4a),LL(0x1e9134cb,0x005206bf), LL(0x17ee6649,0xd5f32bf8),LL(0x60847ad2,0x9431dcd8),LL(0x8a3e4050,0xbe6d62c7),LL(0xedf10d40,0x3ae68f7a),
+ LL(0x4604d71f,0xa95c9ea0),LL(0x415f8028,0x01aa3fea),LL(0x5a41970a,0x3dd55ca5),LL(0x0b5776b4,0x05978ad4), LL(0x787fe20c,0x7c9f5bdd),LL(0x75fdba0b,0x23b9fb7d),LL(0x5fcf3a0f,0xfb1a724d),LL(0x87817071,0xd63b3515),
+ LL(0x44e40138,0xecae282d),LL(0x87605748,0x8732df23),LL(0xd11188cb,0x0ef49da0),LL(0x51146cc0,0xc0478138), LL(0x46621921,0x4ba42323),LL(0x47dfa4eb,0x8836dd44),LL(0x8ec16442,0xdb6a0100),LL(0x9cdd2e87,0xabdd9b81),
+ LL(0x502e26d1,0x205ee262),LL(0x3294e240,0xb961ef9c),LL(0x6da7733d,0x7178f1fb),LL(0x232ecf73,0x989b69fb), LL(0x9a9bccae,0xb7278a35),LL(0x400a01f3,0xb1c81a0b),LL(0xa6b213ba,0x0781855a),LL(0x3429817e,0x8acc1b78),
+ LL(0xfb4e1aae,0x527e3a9f),LL(0x4c0b0f4c,0xc18c1cfd),LL(0x1fa7d9f0,0x0676c365),LL(0x4454cc7c,0x3314509f), LL(0xc7c48245,0xb0f45371),LL(0x695ef470,0x913fe759),LL(0xc8d3e0ad,0xbb676070),LL(0x902e1638,0x0db98fcc),
+ LL(0xfc4dfaa8,0x42874e9c),LL(0x7084b2cb,0xcbf89462),LL(0x8a846ab8,0xd6d46f77),LL(0x14c183b1,0x9e4506ca), LL(0xc53b7631,0xc2d0f9b7),LL(0x294d6c34,0xe47c3d8f),LL(0xc05d3f1c,0x04e3c868),LL(0xa5957fef,0xbacec4f3),
+ LL(0x3b77893e,0x4f4530ba),LL(0x69a18bd9,0x4c234f54),LL(0x5071f5e3,0xb45aadd8),LL(0xd1bd0b86,0x73e4160a), LL(0x1c474f64,0x43fcb30d),LL(0x617d1612,0xedef0769),LL(0x0eec330e,0x92076734),LL(0x5b0a21b5,0xd7767770),
+ LL(0x183e26f4,0x4b7dea31),LL(0xc9fd2e70,0x59d6ff20),LL(0xd5d914f5,0x7bdea00f),LL(0x56376640,0xc736dd0d), LL(0x38ae8300,0x593ae6ef),LL(0xdf0355bf,0xdafe49f1),LL(0x0db4491f,0x094ccd86),LL(0xfe4271ab,0x32295701),
+ LL(0x5db7014e,0x2b7690e4),LL(0xd7766bfb,0x1bbc9c36),LL(0x7d986d0c,0xc52249f0),LL(0x324f20ae,0xc7eec37b), LL(0x0e912329,0xd376afa3),LL(0x04268fa3,0xbc35e949),LL(0x9e91a4ac,0x617bf765),LL(0x1d483ecc,0xb1e932ed),
+ LL(0xac493266,0xd4e31672),LL(0xecdafb85,0x1c779fe2),LL(0x06280499,0xed09eb4a),LL(0xcd4e1f33,0x3dd8d965), LL(0xf34576dc,0x0fb4308d),LL(0x85781a43,0xa8ccbf5e),LL(0xce623a24,0x8dbf488a),LL(0x6118cfd4,0xb0e71d30),
+ LL(0x8cc9d957,0xfc68da68),LL(0x83815670,0x7e5e6b65),LL(0x3f185dfe,0x2c16f5ef),LL(0x98952b33,0x23a4098b), LL(0xd515f551,0x15a80298),LL(0xa7f8f341,0x71a2e7fc),LL(0x8cf4f7b6,0xed42b1b6),LL(0x1504d390,0x02743db2),
+ LL(0x3016e513,0x2bded3a8),LL(0xfb0f7bfb,0xa3c508af),LL(0xaa2be716,0xa6a490de),LL(0xf4485b9f,0x5a04d9e5), LL(0x6ad25b5d,0xd07b99d1),LL(0x65a72cb4,0xa1840109),LL(0x14c45a95,0xc8e2b32d),LL(0xe4f2ecff,0x0fae6e86),
+ LL(0xd94b6fe7,0xd09f454b),LL(0x23006b62,0xa776a633),LL(0xd332b4b9,0x6c700a1c),LL(0xce016225,0x50c3fb34), LL(0x8af71463,0x4b805bc3),LL(0x5f1fb3b7,0x049143e2),LL(0x5a6d1dd3,0xbcaf4b61),LL(0x4733abac,0x02093dd7),
+ LL(0xdf59f061,0x1a23c3f6),LL(0x80c4efb7,0x87a6c141),LL(0xd88e4363,0x47635ae4),LL(0xbf8d2072,0x75e2089f), LL(0xac83803b,0xa2bc1b27),LL(0xe2aafecf,0x8ae61522),LL(0xd0010193,0x4b459205),LL(0x9205f876,0x900f6a31),
+ LL(0xf808f044,0x49cddbc9),LL(0x95094ead,0x94637692),LL(0xb87c9bbf,0x3c9c7c0c),LL(0x4e1844d1,0x1699670a), LL(0xcbcf85c3,0xd8a978f2),LL(0x6a36e1c9,0x83e7b806),LL(0xfaff9c52,0x6f28a73f),LL(0xb71eaa80,0x51341222),
+ LL(0x9328a676,0x195461da),LL(0x21766180,0xefcc93e5),LL(0x771a5485,0xed82c930),LL(0x205a8bff,0x34f15ce0), LL(0xb8b3bfd8,0x88ab72cb),LL(0x8110fe55,0xbb59a5be),LL(0xc7d61a31,0x9ce8a082),LL(0x5b1c63d2,0xfe81d072),
+ LL(0xe9ff8421,0x9fae0be1),LL(0x967e13a6,0x4254f89d),LL(0x35da926f,0x1c094620),LL(0x4a76583d,0x84eda272), LL(0xe0e0ffb8,0xa4033064),LL(0xabc72d0c,0x47951945),LL(0xb72c32e7,0x0af6bb4c),LL(0xda797f9e,0x6c73357b),
+ LL(0x2ac2e99d,0xd7a726c9),LL(0xcd62e7cc,0xf44b4731),LL(0xe6225822,0xf89f8e29),LL(0x8d713d92,0xa44bb9b0), LL(0x9404f6c6,0x3291e8d3),LL(0x37bdb22d,0x50b7a4ff),LL(0x216a0f13,0xe008662e),LL(0xcf382547,0x150fa2d6),
+ LL(0x3138acbc,0xe5e47c55),LL(0x40d7f3db,0x595cf1e2),LL(0x2ee1949d,0x2872392d),LL(0x8a4fb721,0xdbd15bf8), LL(0x183351dc,0x30e78cdc),LL(0x6b294729,0xa39b8efb),LL(0xc7b553e8,0x0df4d23e),LL(0x659d3ffc,0x434f38fa),
+ LL(0x55a0c931,0x1764115e),LL(0xa5c920a4,0x34ea18b9),LL(0xaf903710,0x6a099ddc),LL(0xe49f2c7a,0x4b937dc1), LL(0x430f0a7e,0xacfc4a1a),LL(0x421dbe96,0x8f106a58),LL(0x1811d3fe,0x48ac7026),LL(0xb80f13c5,0x5484226a),
+ LL(0x8da7ca79,0xf692e17b),LL(0x718691b9,0x4827aaa2),LL(0x5c5ea68c,0x881f1c38),LL(0x88bdf643,0x1620f5d6), LL(0x0b9a5add,0xe5703cb2),LL(0xbe925061,0x392e6ea5),LL(0xb0bab0d5,0x2a66ce20),LL(0xf98e8dad,0x83a8e0e5),
+ LL(0xdeec2329,0x53532223),LL(0x346eea96,0x6a740238),LL(0x1dde2a6a,0xa54afbdf),LL(0xf2b5b190,0x0e6ca8c1), LL(0xf3cd4e46,0xcccaa3c6),LL(0x0eb7bb3c,0x168d66bd),LL(0x08d4f4e9,0xf1275144),LL(0x139811fc,0x2ae8c946),
+ LL(0xc870713a,0x4973c726),LL(0xba54b13f,0x298465ee),LL(0x940f224f,0x9f901403),LL(0xb9950a40,0x5cd6a07b), LL(0x069a8484,0x9d4095e6),LL(0xd4f8831f,0xe6bf3181),LL(0x39243da8,0x37ceb29a),LL(0x2693653c,0xb3887f31),
+ LL(0x42c98a56,0x685d2172),LL(0x3969dd9a,0x350fbab8),LL(0xe8ac84ec,0x728edca9),LL(0x59bbb0c4,0xf42beab3), LL(0x27d3c3fd,0x9793e746),LL(0xc732b37e,0xbf6016de),LL(0xdf0f248f,0x3688173a),LL(0x7ed59dfa,0x84fbd040),
+ LL(0xa6731b1b,0x2bad638f),LL(0xb7355979,0x1c7b4b13),LL(0xb8e77093,0xf21550e0),LL(0x53efc63c,0x14d0bc9d), LL(0xd56e1f29,0x119ae9fb),LL(0x4d60bc5a,0x3511309c),LL(0xe3574e43,0xec654f06),LL(0xbef6aea2,0x2d6695df),
+ LL(0x5d6abff7,0x27ece611),LL(0x640c9ab8,0xa706d42d),LL(0x5a6f8fa6,0x7a7252d9),LL(0x349aaf8c,0x32be7195), LL(0xff734e23,0xffb48a3d),LL(0x7d27b99c,0xa9b36c82),LL(0x0ccaedbc,0x85b7a57e),LL(0xc04f2394,0xb93b14fd),
+ LL(0x160700e0,0x3a3a78c5),LL(0x961e4af8,0xbd7ae60a),LL(0xd9472cd7,0xe1deb736),LL(0x3880bbbe,0x276b51b7), LL(0x1aa99bfb,0xcf0c4b9a),LL(0x689d7f58,0xaf949d5f),LL(0x65f33328,0x00878488),LL(0xe7d7b484,0x0f1a178c),
+ LL(0x849e6d32,0xd44550f8),LL(0xfe16485e,0xe7bc29d4),LL(0x2f343924,0x29bbfec6),LL(0x40f2b5ce,0xeeb802f2), LL(0xbbb64f33,0x2b337542),LL(0x9f9bdb3c,0x4c1d3a36),LL(0xc7a1cb88,0x1067cf3b),LL(0x4601fb6e,0x3f12a31d),
+},
+/* digit=8 base_pwr=2^56 */
+{
+ LL(0x1f8a4a91,0xb720a78f),LL(0x753dbe73,0x59e22211),LL(0xadd0991a,0x9f5ad99c),LL(0x7380726f,0x3a0db802), LL(0x7dfb4f1c,0x37f0761c),LL(0x5ac819cd,0x68e7098a),LL(0x37ffe348,0x9683d610),LL(0x2b7b5140,0x5bf205e5),
+ LL(0x61a97262,0x9846b5f6),LL(0x974a82f7,0xedf2cacb),LL(0xaf439654,0x3dfab85f),LL(0xc724ee09,0x43fb0ef9), LL(0x53b0119a,0xd0d5016f),LL(0x5bc8fc81,0x68445363),LL(0x1f65d298,0x6d10b649),LL(0x21a4e64f,0x0f3c88c6),
+ LL(0x7f34c517,0x320372a1),LL(0x2378bc27,0x5602bd16),LL(0x91aae024,0x666a592d),LL(0x317bbdaa,0x716886ab), LL(0xe3045103,0xce55fe68),LL(0x7de1d701,0xf2c4b0b2),LL(0x7d724cb6,0x8da35885),LL(0x9ec47314,0x9aac623c),
+ LL(0xb8529a01,0x824cff46),LL(0x4856b95c,0x6e4d82a2),LL(0xc65af7f7,0x58c6b833),LL(0xae110e53,0x8a6c4125), LL(0x4f083340,0x38207c30),LL(0x176cdb31,0x71aa384b),LL(0x42882de1,0x1ada2941),LL(0xc16a2e4a,0x38b1ad2e),
+ LL(0x142bcb30,0xbdda2720),LL(0xfaf604d1,0x56175263),LL(0xe6796314,0x086189c1),LL(0x5b04dd19,0xdab01c68), LL(0xba8ed3c1,0xce54e4b0),LL(0xe281acfb,0xf616513b),LL(0x5e0a6319,0xaf179629),LL(0x328b587b,0x85e79ac9),
+ LL(0xc9fd7da0,0x11d84588),LL(0x1238d0c4,0xa78682d0),LL(0x829d6475,0x333ddde0),LL(0x69de9e18,0x80c88440), LL(0xc6d8176f,0x5d15f21a),LL(0xa509d470,0xdaff9434),LL(0x8bbbfcd5,0x0191bb0a),LL(0x08fc2688,0xff7732b8),
+ LL(0x5ab3d89e,0x02fe772d),LL(0x9a786c91,0xf1580ec9),LL(0x5a323866,0x8fd83417),LL(0xbadec96f,0x93711d49), LL(0x6b9b4a30,0x2020c34a),LL(0xb8b0de24,0xbf10e000),LL(0x28de3ce5,0x2a5f298d),LL(0xfe1a1c63,0x807a398e),
+ LL(0x73f7c45c,0x9fb640cd),LL(0x0afe059c,0xeb1f87ad),LL(0x52b168d4,0xa3c3979a),LL(0x7b1e403f,0x6eef460c), LL(0x2724bb3f,0x6d943e50),LL(0xf9d922d1,0x53f3f1bb),LL(0xcd538b4a,0x547e7a03),LL(0xd2c4145f,0x37631e20),
+ LL(0xb1f810bf,0xe7e49922),LL(0xf2645825,0xacafdb0f),LL(0x15f35bda,0x0f22216a),LL(0xd85bd0b7,0x6f2b4d95), LL(0xbedc9ecd,0x2f203db8),LL(0xb91e090d,0x26639ff6),LL(0x3486eb84,0x94cd6596),LL(0x42c05747,0x32747db3),
+ LL(0xcebfa9f1,0xcd3e7a52),LL(0xfb2b3007,0x5e792d76),LL(0xb9ecce81,0x9669523d),LL(0x04f191e1,0x9263cc85), LL(0x69655fe1,0x192019c0),LL(0x4d984e59,0x1c5cc5eb),LL(0xdf33f336,0x9ad10ed6),LL(0x41d94897,0x0ca48387),
+ LL(0xf222476c,0xbd1ddf67),LL(0x12d6dc4d,0xb4ad7126),LL(0x93ed702a,0x5c327b18),LL(0xfa70cd9f,0x7e3a27b1), LL(0xc0c4f415,0xdca750bd),LL(0x213a5d61,0x98197c90),LL(0x6f10fcc7,0x9bbd014a),LL(0x2ceed4fb,0xb06061e1),
+ LL(0xa8ad25f9,0xaf6dbbe2),LL(0x7ade697d,0xe70e9f40),LL(0x6eb872d7,0xb829e016),LL(0x1b04173f,0xc330e15c), LL(0x0d4763d8,0xd4868e29),LL(0x4c18c9fb,0x37867f72),LL(0x28019486,0x5fd2f47f),LL(0xb16e9bdd,0xe6bfdf81),
+ LL(0x783e43c5,0xace2a977),LL(0x76eed46a,0xe1791288),LL(0xd1767739,0x3884a5b2),LL(0x427c50a3,0x14eddddb), LL(0x1c9b1fcc,0xbeeed5ac),LL(0x4ecdb47a,0x50b1cb44),LL(0x0dcb78d5,0xcbf69555),LL(0xf2b17a99,0xe60bf9c7),
+ LL(0x9e9ade95,0x0edae6b0),LL(0xcb78b1e1,0xb5c6e13d),LL(0x1c257848,0x32860fba),LL(0xef7f5080,0xfc9aa9f4), LL(0x32aac870,0xccef8508),LL(0xfb5310a0,0x4b237704),LL(0xfeebb972,0x4c3cf970),LL(0x763d5f67,0x5dd3c7a0),
+ LL(0xccbf29c6,0xa656797e),LL(0x5a76a56b,0x6d77f211),LL(0x0e3daff3,0xc627156b),LL(0x7646fb1c,0xa4bd37f5), LL(0xa8cd3e5a,0x5fd7e286),LL(0x2f5fed51,0x3889951a),LL(0xe48c49be,0xf8186fc5),LL(0xc662ee38,0x0d3d308a),
+ LL(0x970e164d,0xb7c9bf06),LL(0xbd3d3087,0xc27a88d8),LL(0xf4e7c899,0x8a37c9cd),LL(0xab411371,0x18494d5a), LL(0xd9d8b29c,0x06532375),LL(0x915a2f74,0xb92dd45c),LL(0x515acb02,0x8a23f6bf),LL(0x435bfa89,0x0e69248c),
+ LL(0x6866c5e4,0x8bf41ec3),LL(0x0999159d,0xf059e652),LL(0xd29d7cd8,0xf906838f),LL(0x3a269735,0xc30100f6), LL(0x6280e70b,0xb7742bc8),LL(0x867b54e1,0x0067d971),LL(0xf544622a,0xafe9032b),LL(0x118a2042,0x6b441e39),
+ LL(0xcdd66b70,0x905c8655),LL(0xc1e2110d,0xe88cce1b),LL(0xee674093,0x8cc23c0c),LL(0xb2ea3fc3,0x55ded4d9), LL(0xb58dfbed,0xdd14502b),LL(0x49f698f8,0x523a4dd9),LL(0x01c83e5a,0xf843a501),LL(0xfe71ee1e,0xf11fd4c1),
+ LL(0x162d7c0b,0xeedd7229),LL(0x4ccad713,0xd42d6a9e),LL(0x2b0c7b93,0xa082fffd),LL(0x2a5016b9,0xee3abd48), LL(0xc117e22b,0x5079c95f),LL(0x814b8666,0x5d4b9169),LL(0x9bf90a6d,0x9e0f5e87),LL(0x744bf7ab,0x4346bd29),
+ LL(0xbfb551b6,0x4d85af0e),LL(0x31f7a958,0xb48e3da8),LL(0x6f5bc50d,0x3b474ce6),LL(0xe7c8dced,0x9fdb47bc), LL(0x53003272,0x2064450e),LL(0x839e69da,0x6bb230f3),LL(0x4d822be5,0xb6941512),LL(0xf11a9dc1,0xb51bc6aa),
+ LL(0xb23047dc,0x866447f8),LL(0xe5f52c2d,0xe02dbd63),LL(0x02770a76,0xe6ea43cb),LL(0x56fa6c25,0x853f5fe3), LL(0x960de6d5,0xfe9615f0),LL(0xf4b1b945,0x37c8b0c8),LL(0x4618629d,0xa6e83805),LL(0x23a2ac61,0x38fb5264),
+ LL(0x01751c20,0x5dfd7005),LL(0xce72773a,0x7e100245),LL(0x0776794a,0xdf09f92a),LL(0x1b730fdc,0xc4a8de81), LL(0xf0c7b031,0x72c302ab),LL(0x1283913b,0xdddff68e),LL(0xe32517b5,0x24889098),LL(0x856a2934,0x2483a0f5),
+ LL(0xa1c3d56d,0xdf6d7dcc),LL(0x09afb797,0x07f9c00b),LL(0x083d9557,0xe90da23d),LL(0xcbc03826,0x80ae6e53), LL(0x7c0e1b23,0x1fd6ff6d),LL(0xb1100226,0x1e90f3c8),LL(0x05a24e23,0xf179e00e),LL(0x946f16bd,0xe5361efe),
+ LL(0x4c662091,0x50f12e4a),LL(0x28608585,0xdad2c7a3),LL(0xf7429473,0x55c66749),LL(0x045ea1b4,0x440b77de), LL(0x91229927,0x9f707b49),LL(0xc6725715,0x3501e29e),LL(0x1225a8e6,0x5626fabb),LL(0x9507e709,0x270a9c2b),
+ LL(0xbdcb9039,0xe0d629da),LL(0x20255b7c,0xb4d7cd22),LL(0x5ed874a6,0x10c8614b),LL(0x4e67d406,0x36891e70), LL(0x1dce66fe,0x020da834),LL(0xabd64dea,0xae69e1e7),LL(0xcc71b37b,0x9cf153a1),LL(0x44771c7e,0xa6e9d024),
+ LL(0x8840fc17,0xb15e31c7),LL(0x349124a4,0x57853112),LL(0xbac542ee,0x78a9d807),LL(0x38fe1188,0xe7b4d812), LL(0xb3a3b801,0x874adc70),LL(0x4694cec2,0x80c0e02a),LL(0xe97805e1,0xd05c8c0e),LL(0x89d8cd40,0x8eaebceb),
+ LL(0x378d055f,0x888c777b),LL(0xb104a132,0x6956795e),LL(0xbe8472d7,0xe4bce719),LL(0x5f51729e,0x23c9f0bf), LL(0x36a3bf3e,0xfe7f7e19),LL(0x20a32d37,0xf8f5d2ca),LL(0x93b8a344,0xf383b467),LL(0x27a6e2c5,0x7eab76f5),
+ LL(0x93b54bc1,0x86c31b0e),LL(0xfc4ecab2,0xb9405ea9),LL(0xa0f6d341,0x09485578),LL(0x4b77e8e7,0x88053bb8), LL(0x29a07ddd,0xcde9b777),LL(0x97649102,0xec8ea63f),LL(0xc516777a,0xf74d082a),LL(0xbacf0dd3,0xf4e26d89),
+ LL(0xd0b3b578,0x6a919da8),LL(0xa0b5f7d8,0x0bcc3b29),LL(0x9e55924b,0xbf4565e5),LL(0x7889dbb6,0x13b36187), LL(0x533981bd,0xad0e59c6),LL(0x0bd0cb7a,0xea941b62),LL(0xa9e7aa7c,0xe5e35e9a),LL(0x088bfd7d,0x27f61727),
+ LL(0x8b3c7fbc,0xda2a5a20),LL(0xba55cb48,0x33cdd403),LL(0x90e7ff36,0xb72b51cf),LL(0x6f215840,0x8cc4b553), LL(0xd2671224,0xf7b80ad9),LL(0x6a45436b,0x560b4387),LL(0xff9e8fae,0xdca90694),LL(0xf97aa84e,0x2e7e9546),
+ LL(0xf37cd717,0x71e9ff45),LL(0x0d73e98f,0x6edf335e),LL(0x9f715170,0xf355690c),LL(0x3f5a82bd,0xf74df40b), LL(0x95e5b105,0x28b6d931),LL(0x2841a54c,0x8827f47c),LL(0x62b4312d,0x159cb943),LL(0x8db37edb,0x277943d7),
+ LL(0x6113a9f8,0x561454fd),LL(0xe70e67e6,0x78ebe733),LL(0x903f2feb,0x8764360b),LL(0x97902f36,0x2ba3b3d8), LL(0x87490b8a,0x28808cef),LL(0xf05f31b3,0xb1175954),LL(0x6c9b4f4d,0xbd5d6005),LL(0xdd254e60,0x12b13fca),
+ LL(0x14959566,0x38d4e812),LL(0x36fe9a6c,0xe253b750),LL(0x809450c1,0x24b2c81a),LL(0x8fec36b1,0x0aa89966), LL(0x053e97e7,0x9a99deb5),LL(0xe31d3a6e,0x5e57321c),LL(0x8dbe78a2,0xcd7a4f33),LL(0x3299e070,0x9f809d4f),
+ LL(0xa26a9eca,0xd6de8cfa),LL(0xa158a735,0x33d5705b),LL(0xc2293743,0x08dd3fcc),LL(0x68bbbaea,0x1f8d0a46), LL(0x61bc4105,0x53ff76f9),LL(0x7c4a8fc9,0x6445e88d),LL(0xc285d0e6,0xfd9a8d04),LL(0xfe62b449,0xf08d0d6b),
+ LL(0xc062810c,0x08c27292),LL(0x6663fa28,0x955629f6),LL(0x9d86fee8,0xbaf96c0e),LL(0x46bb9894,0x1dbc5406), LL(0x93dd45c7,0x8d6b6207),LL(0x3ee989fc,0xaf3baef6),LL(0x59b7b2f7,0xf66cfdb1),LL(0xda16c637,0x287fc2bf),
+ LL(0x2d71f863,0xa44ca8fa),LL(0x84d5dee5,0xa1161962),LL(0x3957b610,0x5a5c8ce3),LL(0x17f50b57,0xdbb32253), LL(0x76056358,0xc6a4eb7d),LL(0xc359d90f,0xff9eb424),LL(0xa88cb38c,0xdf4afe23),LL(0xa696b75d,0x2ae727cb),
+ LL(0xd20a58c8,0x47cc63ef),LL(0xc492ab36,0xd319dc3a),LL(0x36c7f76e,0x887a7d83),LL(0xfcd4cf49,0x65ed5e3e), LL(0xda301d39,0x0e6f2f34),LL(0x38ad4533,0xf2f7c102),LL(0xae834622,0x8a3a003b),LL(0xa060a0d4,0x94084169),
+ LL(0x13c8a1eb,0xb673168b),LL(0x459f8da1,0x80109609),LL(0x5c82007b,0x68003fa1),LL(0x248e0430,0x9f634159), LL(0xfb9b6510,0x188156ab),LL(0xe62844de,0xc35be1cc),LL(0xb0c84d39,0x21e8f908),LL(0xdad3ae53,0xa886d3eb),
+ LL(0x82b0f5fd,0x9e20cd56),LL(0xc465c721,0xc0c12f0b),LL(0x6f913a6e,0xfeeb1051),LL(0xaa32d6fe,0x9e7c76b9), LL(0xb8637b5f,0x820b49a0),LL(0xf4abccf0,0xe9ae172a),LL(0xfb270e67,0xccc050b1),LL(0x2269d1de,0x0b51d7e3),
+ LL(0x678c8d8b,0xca772ec1),LL(0x77ae7c7b,0x74eea3f8),LL(0x1e1bcbd3,0x51550df1),LL(0x3458b249,0xa931c17c), LL(0xf204aed5,0x192c3a45),LL(0xc993c881,0x93abf63d),LL(0x83421891,0xc60aa2cb),LL(0xf6b70284,0x11ce6735),
+ LL(0x69e152e4,0x53e8a3ee),LL(0x0033da23,0x6889ece0),LL(0x7d585418,0xada56904),LL(0xf5e5abb9,0xaf81a877), LL(0xdf515727,0x36e0267d),LL(0x3daad2a9,0xe04b532d),LL(0x1a11ced6,0x290e3ee7),LL(0x65e7a651,0x5be7c429),
+ LL(0x8ef9b498,0xc0662cd3),LL(0x6c4dcbf9,0x0ec5fbf0),LL(0xce4d7e3a,0x26694c70),LL(0xfa52de99,0xc1699a93), LL(0x6dae3e97,0x2e0d394b),LL(0x4c66e572,0xe3af28cf),LL(0xba1e27e4,0x9caf7bf8),LL(0xd5a4bdaa,0xd5c39337),
+ LL(0x9ec8ad6d,0xbb5d9551),LL(0x609fc2e1,0xfb3bc1f1),LL(0x95fe12b5,0x0d95ad2a),LL(0x5341dc74,0xf6fd6e89), LL(0x7537b803,0x1532991e),LL(0xeaf96f9c,0x77772fd3),LL(0xf832749a,0x4ed09840),LL(0x95f19d25,0x69a194ce),
+ LL(0x041cc340,0x5464471a),LL(0x1c442289,0x26f7e550),LL(0xb5ce9706,0x38f2c20e),LL(0x8a44efd3,0xcf73f8f2), LL(0x586e8f77,0x5176eda5),LL(0x63ece447,0x47e33844),LL(0x86b00be2,0x83826e8f),LL(0x539807b7,0x49cffcdb),
+ LL(0x414d3fb1,0x543d1fad),LL(0x38b1ef44,0xd56aac6a),LL(0x96c89050,0x9980bb64),LL(0xb169b8a9,0xc300cb46), LL(0x83413df4,0x5ab01a6b),LL(0xf3c91eda,0x179b8922),LL(0x43cccc06,0x4060b943),LL(0x9458ec1e,0x4f6adeb5),
+ LL(0xe339e40e,0x0a4c6437),LL(0x02aefe83,0x9cb6c532),LL(0x23dce7ea,0xb072d02b),LL(0x59a9032f,0x2cd7b117), LL(0x81dbfaef,0x01220cea),LL(0x0905332d,0xffe0026c),LL(0x0197adff,0x95ec2cb2),LL(0x4c3d0e49,0x853bf6f5),
+ LL(0x25d78f7c,0x04ed54fb),LL(0xbb68cb9f,0x45aae3e1),LL(0xe32d7421,0xf4f1a2c6),LL(0x45a05771,0x646ade65), LL(0x91eab45e,0xab241cfa),LL(0x7b214af0,0xb1cf204c),LL(0x851d311c,0x92dfb3e3),LL(0x144ae0da,0x56479ffb),
+ LL(0x9a7a4ede,0xbf847444),LL(0xf5cfd20f,0xb26b1f15),LL(0x83b33b64,0xf380ed7d),LL(0x3d1998c9,0xa21f9564), LL(0xa720e347,0xd985c7d3),LL(0x8bdf09d5,0x98078974),LL(0xce947692,0xa1f34ce2),LL(0xf419c385,0xf69e6144),
+ LL(0x8c3adcc6,0xe1926526),LL(0x42746263,0x848974fb),LL(0x97791569,0xa731261f),LL(0x065b721b,0xfed39da2), LL(0x836a7e20,0x8369b04c),LL(0x53c19f62,0x5758a761),LL(0x0ebea868,0x45746383),LL(0x3b7d71a8,0x20179927),
+ LL(0x57632243,0xb466ed4f),LL(0x120577c9,0xc8d918cb),LL(0xeda40e9c,0xbab307e5),LL(0xd5f65d1b,0xe6dbc7d4), LL(0x60619e10,0xcae0c649),LL(0x6b0df67c,0xffddf6d1),LL(0xb32ee5d1,0x60488755),LL(0x47164a55,0xcb278aaf),
+ LL(0x0bfb732d,0x354c3392),LL(0x649bc125,0xcd4fc821),LL(0x770ffdb8,0xa8e1253f),LL(0x0ff0c37e,0xf7eec595), LL(0x7149b102,0xe5a65279),LL(0xd0528224,0x1cbbb56b),LL(0xb51c5df4,0x40b1a8d9),LL(0x39e1ca25,0xccb43d26),
+ LL(0xfdcfe8c5,0x48f74dc2),LL(0xfa5b8daf,0x3ccb31b6),LL(0x7de6300f,0x6f8dc5bc),LL(0xf247bc0b,0x2a373fd3), LL(0x17825306,0xefe13539),LL(0xc50c47b4,0xeb253484),LL(0x3c739f02,0x4a7f2af3),LL(0x9a3c6746,0x3a3eb385),
+ LL(0x588978e2,0xa90afa2a),LL(0x8d80894f,0x501fcebf),LL(0x6bf1a4cb,0x1de1d06d),LL(0x6cc42a07,0xb0f4a61d), LL(0x78d406f0,0x975cb8de),LL(0xe3d293e3,0x560b0d7b),LL(0x32e686ca,0x5746227c),LL(0x3fcb0205,0xd12854f5),
+ LL(0x499512e3,0x8c0eaba8),LL(0xade99108,0x8d97c229),LL(0xff2b5782,0xd80da38e),LL(0xaef08107,0xf8c30ba1), LL(0x076b97c3,0x9068d7d0),LL(0xb1b7eba5,0x851d1cb9),LL(0x318e4675,0x02bb728c),LL(0x76ddc683,0x0efe9707),
+ LL(0x6a248b04,0x6985d358),LL(0xf8969ed1,0x75eb6019),LL(0x606a0c64,0xecb66a20),LL(0xfe39b5e5,0xd1252f64), LL(0x2aa222a9,0x93d5d61c),LL(0x1ffff8ec,0x16c0d6f9),LL(0x5dfab0fe,0x0f1f962d),LL(0xcedcccb0,0x88776fe1),
+ LL(0xa32cbff1,0x410333c6),LL(0x093bcbda,0xca13ce28),LL(0x0e479259,0xd97b0684),LL(0xbf505c93,0x8b2b3ad8), LL(0x71761412,0x42092d64),LL(0x918acf33,0x9d0c842d),LL(0xac9ade57,0x904d3add),LL(0xe0d5ef6a,0x025e4177),
+ LL(0x0b33d4ed,0xce406ec0),LL(0x57b5c958,0xf73ac4da),LL(0x6ef70849,0x5f96cb8c),LL(0x77b32d5d,0x702ccc6f), LL(0xcea6885c,0x75bda8d8),LL(0xc0c0432e,0xbfc3e62e),LL(0x54631c9a,0x46db9cc6),LL(0xba1d1550,0x1669075b),
+ LL(0x2d227656,0x5ccc4e34),LL(0x02cb0644,0x0724e41b),LL(0x435601fb,0xc5e2077d),LL(0x68d6aee2,0x356155c5), LL(0xfde58906,0x0ea00013),LL(0x37a9eda4,0x79fa13c3),LL(0x8f51a6a6,0x7d09479d),LL(0x1f979fed,0x86e955b7),
+ LL(0xe39ab804,0x9cb22960),LL(0x03535a39,0x6aeae783),LL(0xb9909be6,0xeb4741de),LL(0x1a5f4139,0xb957c5da), LL(0xedc1819f,0xafdb3e8b),LL(0xe7caa690,0x33545722),LL(0x8bb66ed0,0x0ef33e28),LL(0x70e667b5,0x59073742),
+ LL(0x5c7773b8,0x0390fb3c),LL(0x286a809d,0xb80b4a2f),LL(0xfac46467,0xd17d6103),LL(0x91a48972,0x9a09a0d6), LL(0x39e44585,0xa2124b62),LL(0x174d241a,0x14c8a671),LL(0xada8ba26,0x99abfa37),LL(0xfbb457ae,0x847f3040),
+ LL(0x7529a18c,0x0587aaa4),LL(0x9bb45ee6,0x23b3f724),LL(0x2aa81155,0x4d7f5712),LL(0xa4f16d09,0xa9185804), LL(0x3fc992d1,0xab638141),LL(0x0cad0bb0,0xb6c326fa),LL(0x60f2cb10,0xe21c3625),LL(0x2fac20a9,0x6c7af09e),
+ LL(0xdc6f72ab,0x31e892fa),LL(0x21b81f7b,0x71d5c6a3),LL(0x298a0dd2,0xc3e2d70d),LL(0x13ecdc80,0xbc0c37e2), LL(0xe6496ba4,0xd3191146),LL(0x35115466,0x15f81541),LL(0x07d1937f,0x162be77d),LL(0x7b176367,0x38b4d194),
+ LL(0xb8cafbc9,0x4485966d),LL(0xf44c2a81,0x7cfc0d67),LL(0xe624cefe,0xe9e7ec4d),LL(0x581d4e48,0x4db8bec3), LL(0x7fc8615a,0xe76edf00),LL(0x9a02cdb8,0x1b62c4a5),LL(0x83938a6d,0x8b565749),LL(0x50c86c19,0xd813864e),
+ LL(0x16f55d40,0x7fc071ef),LL(0x9bb45ea5,0x70195438),LL(0xa35543ca,0x83cf09f2),LL(0x20554c19,0x07e91a84), LL(0x62a9d06e,0x51ecd701),LL(0x2044a663,0x00e14c62),LL(0x00423dd9,0xb1317c13),LL(0xa46eab4c,0xf49431bc),
+},
+/* digit=9 base_pwr=2^63 */
+{
+ LL(0xd0614aa1,0x35118434),LL(0xd1418434,0x8bae9779),LL(0xb8c15b89,0xf5641d82),LL(0x416432eb,0x2383af56), LL(0x2c73f990,0xa552d3f0),LL(0xa6bbdc7d,0x8df82e9e),LL(0xd75ec634,0x0f336aa8),LL(0x1603e53f,0xc42e3b2d),
+ LL(0xbad830d2,0x4b33e020),LL(0x590dffb3,0x5c101f9e),LL(0xbc80ecb0,0xcd0e0498),LL(0x52aa293e,0x302787f8), LL(0x220f8fc8,0xbfd64ced),LL(0xbe0ee377,0xcf5cebe0),LL(0x8913b128,0xdc03a038),LL(0xfde23279,0x4b096971),
+ LL(0xd2d638ad,0xb0f8c0de),LL(0x4f299d5f,0x47fc8c77),LL(0x9b68d48e,0xd1720a92),LL(0xa1c6f103,0xf944e708), LL(0xa146889b,0x36e34e04),LL(0xe74a2a28,0xb0aad2d6),LL(0xca52f53c,0xedbb034b),LL(0x87fb2713,0xe987a8e1),
+ LL(0xf727ef3a,0x6c5389af),LL(0x33db88fb,0x95ffeb95),LL(0x9dae0777,0x27cb7042),LL(0x616dbf02,0xd20afe81), LL(0x914bf706,0x0fab8e18),LL(0x0517cd09,0x3b1e66f3),LL(0x12e40644,0x24b46dce),LL(0x08f2d8fa,0x0ff10168),
+ LL(0xea2d8d84,0xe08a10df),LL(0xe97dda79,0xe31f05e7),LL(0x4e9ab132,0xfe95f84a),LL(0x927e216f,0xacd6f7fc), LL(0x83c5a3ea,0x025e27bd),LL(0x50f120fc,0xed010c0d),LL(0xb828101f,0x443b3b8a),LL(0x8cfc0dea,0xd8384819),
+ LL(0x83dc5447,0xe55f34c8),LL(0x04e4e9a0,0xbe76243b),LL(0x819166a2,0x78fb4cbc),LL(0xae37f80a,0x0bdfb703), LL(0xc217cda8,0xf869288e),LL(0x62af4156,0x2662bb71),LL(0x50ae9d30,0xce64f291),LL(0xdc0353c9,0xee0d4440),
+ LL(0xbd25609c,0x3e61a9ea),LL(0xb3839c8b,0x4ccaea93),LL(0xe43736e2,0x721cefa3),LL(0xd0035908,0x229cb244), LL(0x7f10aebb,0x936bc1dc),LL(0xb67332e7,0xc93a1002),LL(0xf98d1132,0xf4b53dd4),LL(0xd5a75030,0x7b99a196),
+ LL(0xca9a9526,0xb13caadd),LL(0x69a303e9,0x701c63fa),LL(0xb0a50f3c,0xb97d667a),LL(0x68e6557f,0x27c03d7c), LL(0xeb105607,0xab24e712),LL(0x8dd86ccb,0x4936aedd),LL(0x0a986d68,0x32196f8a),LL(0x248f5a65,0x0307b826),
+ LL(0xfcadb2ad,0x20e14b4c),LL(0x8c3b8c23,0x4cb4a092),LL(0x1caa9db1,0x50fe3c1a),LL(0x81c0a4e9,0x23cc56e8), LL(0x0867753f,0x5ab09199),LL(0xf9d47c55,0x5a253d19),LL(0x1a9bcc88,0x422b4e03),LL(0x671e4f36,0x4e1ce22b),
+ LL(0xebbe949f,0x588f58b5),LL(0x6982215b,0xb7762296),LL(0xcff863c0,0x3cc83dd6),LL(0x01098f51,0x81ec094d), LL(0xbe0432d0,0x214d69aa),LL(0x6455957d,0xe4e52a9c),LL(0xfadc1eab,0x94743ba8),LL(0x8176316f,0x2c395d97),
+ LL(0xe6bb4d34,0xeab6400c),LL(0xc0d49bf2,0x7364dc55),LL(0xe6959c7e,0xd6fa6e40),LL(0x7eaae61c,0x7960a997), LL(0x94ea77c2,0x918b3c63),LL(0x76866dd1,0x2cf4997f),LL(0xbcbba8ca,0xc4214abf),LL(0x7aa4aab2,0x349a6133),
+ LL(0x99458b24,0xd64bab77),LL(0x2eba3064,0x6fe19e25),LL(0x74068f03,0x9aabd83d),LL(0x6fdf8655,0xaef81218), LL(0x65593fef,0xf506d27b),LL(0xfaa457b2,0x0a1ad85d),LL(0xa303dff4,0x266d0f06),LL(0xabb416e3,0xe8114f4e),
+ LL(0x6aa5a1b8,0xe743f617),LL(0x1b5b2bd6,0xaf84652d),LL(0x092e2c46,0x8b1beab1),LL(0xe2518383,0x7e857549), LL(0xa9383124,0x6be2ece1),LL(0x7fc20081,0x8309442a),LL(0xc3046cab,0x1f00eb8b),LL(0x26f39f8c,0x959f3155),
+ LL(0x8fc2ed93,0xaacfe2d3),LL(0x78f0f858,0x83446645),LL(0xdda35ec4,0x58de6f09),LL(0xf78c69b1,0x891e5ecd), LL(0x91c13d67,0xff4a4ba9),LL(0x487d5575,0x6e78063d),LL(0x8d303a7e,0x226b621e),LL(0xc95987ed,0x5c9bc103),
+ LL(0x5e3be13e,0x28980108),LL(0x414af955,0x5e8c0ac5),LL(0xeaaa71a5,0x0f08e93b),LL(0xce4524f0,0x1bc50407), LL(0x921be66b,0x6a6a2e6a),LL(0xc27da9f2,0x37113baa),LL(0x52e90e29,0xc7b3c636),LL(0xc8558307,0xc075d178),
+ LL(0x88a45b65,0x605f581a),LL(0x68e58c1c,0xcb789200),LL(0xbc5bfe1c,0x14cbed65),LL(0xf02b11d7,0xd1af7dc7), LL(0xcd3a7cc8,0xb8341bc0),LL(0xa01a77b7,0x8e9aefe8),LL(0x5ae2a402,0x8eeafe87),LL(0xc11f3859,0x27a0698f),
+ LL(0xf7af9756,0xc5e49f07),LL(0x9e5b871f,0xffd65bcc),LL(0x423eed7b,0x62a95357),LL(0xb2ec687c,0x93cf64d5), LL(0xbe5da479,0x04b87dd7),LL(0x1a134c0b,0xdcceabd7),LL(0xc5c6925c,0xa4875091),LL(0x8e9c098d,0x3bf947df),
+ LL(0x11d1323b,0xb2617271),LL(0xe4c6046d,0x7769247c),LL(0xcfa6aac3,0xf9c1aaab),LL(0x354492e2,0xf7f13317), LL(0xe91befb6,0x4bd65afd),LL(0xf25b8f8d,0x3e78cd8c),LL(0xe60ff4d9,0x2adf53ed),LL(0x3d288d4c,0x81ec3853),
+ LL(0xee3bf44a,0xda852a71),LL(0xd7b5c6da,0x39b4ef6c),LL(0x44f4e720,0x472e6996),LL(0x9191614b,0xbbd19d38), LL(0x30c0e99d,0xa2bcc2ec),LL(0x57ba0582,0x29318d7b),LL(0xd315963a,0x322faf40),LL(0x0c0619d1,0x49ba5570),
+ LL(0xe5dcd066,0xc28c1f81),LL(0xff9e3493,0x64d1268d),LL(0xbdf8992c,0xab0db38e),LL(0x320cce30,0xe3790c26), LL(0x26e3e4b0,0x59b408a0),LL(0x6ab8504e,0xe9e5fe29),LL(0x83c9eaf3,0x45c827bd),LL(0x89518edb,0xc298e236),
+ LL(0x8d3ab381,0xb79a8b15),LL(0xdb0bb7c0,0x6bb951e8),LL(0xbe4b3353,0x5ebd3854),LL(0x2eb3b0fe,0x107ba27d), LL(0x46786cb4,0x9d01654d),LL(0xcf3a1aa2,0xf46d8352),LL(0xa1662f72,0xa8f669a0),LL(0x68a1d3e1,0xc979209f),
+ LL(0x65471473,0xc64975fa),LL(0xff1f2aad,0x1f8eec02),LL(0x8d0dd401,0x1b520fcc),LL(0x15e14346,0xcd732092), LL(0x8f878a76,0x616478d8),LL(0x7423e0f5,0x3579d49c),LL(0x1b2af15f,0x119f6d6e),LL(0xb08c2c8c,0xbbe33d81),
+ LL(0x8534a355,0x051d99c9),LL(0x458b764b,0xe3f3ddd3),LL(0xbc8c03bd,0xbd7e51aa),LL(0xe8d42e38,0xcd7abf4a), LL(0x3160e63f,0xf0d97428),LL(0x34d13871,0x258bba07),LL(0x3dcb885e,0x4fedb647),LL(0x50f0a645,0x009fca27),
+ LL(0x99775c4e,0x3f06c146),LL(0xf66e7d05,0xb10a4ed3),LL(0x3a3ab903,0x9300e3ca),LL(0xde3c3e1f,0x0a5610e0), LL(0x1af56fb7,0xe2827312),LL(0xd75d9a9c,0x7e2a2365),LL(0xf11f8963,0x9c3bb05a),LL(0x30c80488,0xdf94cac7),
+ LL(0x2d1143f5,0xaff1682f),LL(0xb4d6ed7f,0x5837e83a),LL(0xb4bce662,0xf3e179be),LL(0x8caa5fbb,0xfa8d7862), LL(0x59ea54c1,0xbdde016f),LL(0x3c1ac962,0xc488c829),LL(0x14b46863,0xabe8b367),LL(0x82897d1a,0xbcfde363),
+ LL(0x8c152354,0x87ddf0ec),LL(0x7a953398,0xdec85db7),LL(0x0b57108f,0x927a8b10),LL(0x525f78f2,0xb38b732f), LL(0xeb306d56,0x7e696084),LL(0x50269227,0x9befefef),LL(0xcaddfa11,0xfa86e376),LL(0x404be227,0xd50a08da),
+ LL(0x03bb523c,0xb7408e33),LL(0xc093aaf1,0x6d21aa4a),LL(0xa85d6fcf,0x52aae4c9),LL(0xb726afa9,0xf5d057c9), LL(0xf92ca5b2,0x7979bb5c),LL(0xc4e3e4f3,0x4b1f7936),LL(0x071ec517,0x2c534200),LL(0x67d3f86a,0x47b52ffe),
+ LL(0x84d1c5b2,0x4a0b581d),LL(0x0dfa90cb,0xfc825a4a),LL(0x11c72996,0x2df2ec98),LL(0x7dde922e,0x82077a6e), LL(0x9f28b584,0x89acda10),LL(0xe49fe66f,0x54578eb8),LL(0x4a1c29d7,0x90a5f700),LL(0xb3b44748,0x2de4719c),
+ LL(0x18d85e6b,0x6944fe14),LL(0xde7b904f,0x90bd8208),LL(0xa4597137,0x5811f3b6),LL(0xd4ab5433,0x7ea43767), LL(0xa204a36f,0x7ec39109),LL(0xa30fb76e,0xa43a4a57),LL(0xe090f2be,0x4fd514f8),LL(0xda1c97f8,0x3918138e),
+ LL(0x15145a20,0x2b466ae2),LL(0xfbac86b7,0x28ccb2ce),LL(0x04106b98,0xb891b707),LL(0x29696a08,0xe40a2310), LL(0x636d9e11,0x1210fed0),LL(0x2043caa1,0xdaea218d),LL(0x0aef7dcd,0x10c2ed0f),LL(0xffa5db7b,0x926be98a),
+ LL(0x36abac30,0xe762191c),LL(0x8b75b5cb,0xe21acfaa),LL(0xd180cc32,0x4f5e6b9f),LL(0x55deffdd,0x01358309), LL(0x992a66f3,0x1b1ab943),LL(0xceef1a9c,0x1ebe0246),LL(0x7a01dcb9,0xa24c9e25),LL(0x326505f5,0x3d45c4e3),
+ LL(0xc8544885,0x9b805759),LL(0x7bfcad78,0xbe9b99ca),LL(0x2b8fe78e,0xd1db36e1),LL(0xd5387bcf,0x37255a2d), LL(0xa150ad32,0x044b3a3e),LL(0x6671ae59,0xc65bc2a3),LL(0x1d52384b,0x41ce078e),LL(0x9e72c300,0x3115f1b1),
+ LL(0xd0a358a0,0x487ff9da),LL(0x9c242aec,0x4b20c369),LL(0x1c7b145f,0x7813a44c),LL(0xd6f2d3ee,0x87c6bede), LL(0x47d393b1,0x34d2a89b),LL(0x73f78679,0x1e9f97c6),LL(0x2edce91c,0xcb614fe0),LL(0x7e9a5fa9,0x62b96009),
+ LL(0x58c34b85,0x7eb2aeb5),LL(0xcf5074fc,0xa256a478),LL(0x98c1de9b,0x73f23a56),LL(0x61ce6535,0xeffd490e), LL(0x4a6c15c8,0x2569df2a),LL(0xfffc97a5,0x91e202a0),LL(0x28dc7a57,0xd83c428e),LL(0x9fc8dca8,0x03bc53c7),
+ LL(0x9b60487b,0xed394cfa),LL(0xb483a686,0xa4259f91),LL(0x179a5cca,0x11f51779),LL(0x86c1d1c7,0x00b00ef0), LL(0xf1231aed,0x6e596d2a),LL(0xd80eaa89,0x6c1a702b),LL(0xd23f1d64,0xd28f8c15),LL(0x6d01728f,0x93e85bea),
+ LL(0x1c704922,0xd4288fb5),LL(0x8c1363c5,0xaadd1968),LL(0x52f2cc4e,0x9b5c42d7),LL(0xc298e794,0xf9e4bc96), LL(0xaf0804ac,0xd604f076),LL(0xb3bb2628,0xa441140a),LL(0xd37bf6bd,0x761eabca),LL(0xbe1cf79c,0x7d192922),
+ LL(0x3da7073d,0x2365739e),LL(0x8e2c078f,0xfb7423ea),LL(0x3adfb6f3,0x08f5132e),LL(0x710a26fe,0x470a4205), LL(0x2b6c9b33,0xbe0afeb4),LL(0x3cd813bf,0x94d9edc8),LL(0x440a1699,0xa2c7a7a0),LL(0x4eaf0c10,0xbdc4ea3b),
+ LL(0x52fdc8d3,0x5a5455db),LL(0xb2945868,0x60485f39),LL(0x00af0abe,0x54ce9567),LL(0xe8d15f54,0x17bff77b), LL(0x0e14a7ec,0x0021c531),LL(0xdc9c800a,0x3efdb22d),LL(0x4d947ada,0x9a9e2747),LL(0xb37fc947,0x19417bc4),
+ LL(0x8f02c551,0x71ca8da8),LL(0x074cebc0,0x782d5da4),LL(0xc1a43a2d,0x99094980),LL(0x24890d9b,0xe1b02ff0), LL(0x45d82f7c,0x4eedaddb),LL(0x5061c943,0x7ae170a5),LL(0x4d47c578,0xaf8c7ea0),LL(0xad3a6eae,0xcad17044),
+ LL(0x4f4c9c8b,0x51383e61),LL(0x9182fc81,0x78d17182),LL(0x90d72cb4,0xbed6f0d4),LL(0x7bea62f0,0x98761291), LL(0xef3cd3fc,0x27594570),LL(0x91a8c364,0xf4759534),LL(0x2744eb2d,0xf5c607c5),LL(0xd8d8f337,0x0d6264eb),
+ LL(0xa8701750,0xb54867a6),LL(0x87691191,0x1387e940),LL(0xbd2f75dc,0xc451f178),LL(0xd1da6080,0x31a099d3), LL(0x49f87f03,0x0d0fcf97),LL(0x0af6273d,0x0b7585f8),LL(0x1142265d,0x3619cf2c),LL(0x05c559a4,0xf84d3f96),
+ LL(0xb83f2cb9,0xc3d3c80e),LL(0x8f602141,0xf4ef0b54),LL(0xb9612928,0x3afb343d),LL(0x8db5c907,0x7abe5620), LL(0xcf019b08,0xcd692215),LL(0x9ae12255,0x98d70b38),LL(0x8dfda5f2,0xb459e256),LL(0x8f3f403e,0x066a445e),
+ LL(0x423fbbb6,0x5663e123),LL(0x5424d48f,0xcc55ce36),LL(0x3b6d5467,0x8bca99b9),LL(0x316fc956,0x299ff0ea), LL(0xa0ceb256,0xd973a8d8),LL(0x6d9956b9,0x443ecdb9),LL(0x2f64f912,0x8c16a75d),LL(0xbbf7ab50,0x89e490c2),
+ LL(0xb8dbf031,0x4bd00db0),LL(0x7d2cb92d,0x866e0bbe),LL(0x1dd3db2c,0xad36406e),LL(0xe4e3f194,0x969dc881), LL(0x2a115bc8,0xcb3ac9e4),LL(0xe0a5ab75,0xb45efd5d),LL(0x55377d5c,0x1709c293),LL(0xde6bc25d,0x06d11ba4),
+ LL(0xccf2d10b,0x84a09347),LL(0x08ee5aef,0x571cd4d9),LL(0xa450dd82,0x1379ac02),LL(0xae404542,0x5b7f02f5), LL(0x2a7df4ce,0x17366e7f),LL(0x9830ebec,0x5bb3560c),LL(0x7c254726,0x5c582580),LL(0x70ab7b3d,0xea13f8fd),
+ LL(0x314e2a25,0x868c0f8d),LL(0x0be90b12,0x4b3dad3a),LL(0x32aaffcf,0x09970da4),LL(0x8a6d894d,0xe711e9cf), LL(0x0a80d07a,0x511521af),LL(0x8a2a2851,0xe3814716),LL(0x1de9183e,0xde76d41b),LL(0xaac779e5,0x8a9fc79a),
+ LL(0x26879f8b,0xd7d1f235),LL(0xe37d5f9f,0xcc849c85),LL(0x6b9cd82f,0x26b5488a),LL(0x91099141,0x1b068e8d), LL(0x35ee636f,0x040dc00f),LL(0xd84a9cbb,0xab40f94b),LL(0xdb303776,0x2e4cf65c),LL(0x78e8affb,0x42eaa12e),
+ LL(0x876f8f38,0x7835e4e9),LL(0x090ca6b6,0xcd421d77),LL(0xad0604f7,0x71a1d12d),LL(0x1a22e872,0x51c2d158), LL(0x429e45e9,0xfe7dfcc8),LL(0x48224b6f,0x20028f5c),LL(0x50abf907,0xf7afed37),LL(0xc4ce1a69,0x92183692),
+ LL(0x2d128add,0x0b93365c),LL(0x13200221,0x883f43c3),LL(0x4d309b2d,0x9d3b5a53),LL(0xcf91a023,0x60f0db16), LL(0x5b0e47be,0x20f0ebbd),LL(0x317d8b4b,0xcc20dde8),LL(0x5303dd7c,0xab033b48),LL(0x7a9c1974,0x6703eac7),
+ LL(0x351c8f26,0x92f0b738),LL(0x08569159,0xadd39ac8),LL(0x61098dd5,0x80866e5e),LL(0xcae578f6,0x7d0c1c6f), LL(0x975f59e4,0x13d89cee),LL(0x0092de2c,0x86006ed4),LL(0x819adda4,0xda825b0a),LL(0xde710934,0x74fefb46),
+ LL(0xd3dc8683,0x7c2ec289),LL(0x690e5d08,0x25898cd8),LL(0xbcc67531,0x9bed0f32),LL(0xac762453,0x356ba80c), LL(0x7680da5e,0xd3224c57),LL(0x3399d679,0xaae2597b),LL(0x68df6e74,0xb2a2a1e5),LL(0x2301b373,0x49d23e8c),
+ LL(0x170dd677,0xcb89b484),LL(0x6b3ee110,0x36b1d3d1),LL(0x0d7b51b4,0xe50ada4f),LL(0xfd9afdbc,0xa2f4fb57), LL(0xaa6dd8e8,0xb1b9b81d),LL(0x0be328aa,0x616056a0),LL(0xe12b07c8,0x8f6dd943),LL(0x325abaf6,0x4bb551c6),
+ LL(0x68fbed5f,0xa5460380),LL(0x87ed0d37,0xa65d059f),LL(0x208aa8cc,0xff60beda),LL(0x33d2d65e,0xc91ff11b), LL(0xf65f65d2,0x078c4e5e),LL(0xf347dccf,0xa92ed905),LL(0xf59e3be9,0x261ad25d),LL(0x3b69facc,0x95903d91),
+ LL(0xe789d854,0xcf0a2f94),LL(0x10fbf531,0x9d39cd51),LL(0x6de44e3c,0x980ed5d4),LL(0x78425caa,0xaedbae37), LL(0x7bd278b8,0x35804bc1),LL(0x6a2d7bee,0xf4bee96a),LL(0xa605671c,0xc6c553a6),LL(0x86f010d2,0x182c9238),
+ LL(0x9cd6f37a,0x94343b7a),LL(0x237190a9,0xa71e3853),LL(0xa8a28451,0xfcbebde7),LL(0xd711d2be,0xfa928367), LL(0xc3668951,0xba8fd2ea),LL(0x2d241329,0x00fad1ed),LL(0x5dbdffd1,0x61b82e19),LL(0x5a181dfe,0x0e5e5782),
+ LL(0xc60f1799,0x1c1bf593),LL(0x64ef800f,0x388d6950),LL(0xce927a87,0xf78ef00f),LL(0x6abfff9f,0x2a010419), LL(0xb0b7ffe2,0x13a7b08e),LL(0x6da4cc8f,0x4619da3e),LL(0x7937e0bd,0x8ac19190),LL(0x1af4f84c,0xf97d3fcb),
+ LL(0x8ac425a1,0xaea2abd0),LL(0x4a02e136,0xc619c17d),LL(0x1b2c4acb,0xf09a57d3),LL(0x87b4eb40,0xc6fce6fc), LL(0xb21b02f7,0xa161bb70),LL(0x95bcb925,0x075301fb),LL(0xe1b440ce,0x1d408003),LL(0x606b3142,0xb42a47af),
+ LL(0x1c832c35,0xd4ad09c7),LL(0x0e17fb8f,0x5bebe913),LL(0x8b45b250,0xbf8efbcd),LL(0xe5ca21e4,0xbef3cafe), LL(0x688076f1,0x08a18be7),LL(0x0c3a2648,0xabbb3fc5),LL(0xfb54720e,0xa77086e8),LL(0x19c29e8e,0x84277757),
+ LL(0x5b95b36d,0x551768ca),LL(0xc7df6d3f,0x8850a9b0),LL(0x5008c00a,0xe5a2737f),LL(0xad076e3c,0x9a577c0d), LL(0x2afa6a8a,0xbe7c611c),LL(0x04259dac,0x5dd9142a),LL(0x422bf3d1,0xd14253bb),LL(0x6805c78b,0x8c9dc4c6),
+ LL(0xd430488c,0xb9837258),LL(0x7abc184b,0xf9fc178b),LL(0x0c5e6a11,0x035d3079),LL(0xfbc2182b,0x20cbe540), LL(0x9d76812f,0x849994e2),LL(0xf7a85553,0x166a9279),LL(0x19d70aff,0x15ff0643),LL(0x4bc6a829,0x3c58e0b0),
+ LL(0x84df75ff,0x3809904b),LL(0x67a7c214,0x454c63fd),LL(0x2d873c09,0x79e0ffde),LL(0xcef301bf,0x620a3293), LL(0x237c2bdf,0x8f38c8e8),LL(0x13203c2c,0x61cf96de),LL(0xd0bef848,0xdff401d6),LL(0xee4bcbb6,0x3c8ed7ce),
+ LL(0x07ff8f9a,0x3e128e2d),LL(0xad7e8d5e,0x0653c0b2),LL(0xb1930408,0x7bb30bb5),LL(0x4c158386,0x91d18705), LL(0x80c21fb4,0xc4cf843c),LL(0x8a04133a,0x97a72d75),LL(0x4218755a,0x6b7c49f3),LL(0x68a40f68,0xc1a5a447),
+ LL(0x15ca3037,0x0ab9650e),LL(0xac06feb0,0x16b1fa71),LL(0x0faa3dca,0x50179660),LL(0x1c1aaeae,0x368b2d89), LL(0xb46f0310,0xf6fa652a),LL(0x79fcbc59,0x86a4d627),LL(0x6106a132,0x78169b8e),LL(0x9e387d16,0x40a741eb),
+ LL(0x80eed542,0x14a45174),LL(0x3362ef7f,0xadd64561),LL(0xc5dd0396,0x39228bfc),LL(0xea0c538b,0xe9fdf903), LL(0x74d235de,0x6bfd91ec),LL(0x24aa0a47,0x96ec2378),LL(0xaf8d6168,0xf5699241),LL(0xc548a60b,0x0a7b9be3),
+},
+/* digit=10 base_pwr=2^70 */
+{
+ LL(0x2ade9556,0xe5255c30),LL(0x75ba2e9b,0xe328af1b),LL(0x41ce9e47,0x9d3391ef),LL(0xfb0ffcc9,0xb74cd668), LL(0xe3226acf,0xc67103e4),LL(0xd2959e42,0xa65ad22c),LL(0x99d490fc,0x3aaa8406),LL(0x9ecc6356,0x3e26a1c2),
+ LL(0x4e92defc,0x71c975de),LL(0xd0089883,0x81aeb173),LL(0x2ec09190,0x8a30ce4a),LL(0x69a36d64,0x426e7838), LL(0x309bd2d7,0x5899a0b6),LL(0x3cc1a4af,0x3b1c24af),LL(0x345163b3,0xb2aa8142),LL(0x2c78c86d,0xd2ad9a69),
+ LL(0x8e7a4174,0xde59fe5d),LL(0xab3b0f3d,0xaedff2d2),LL(0x1f053470,0x4688e9e0),LL(0x97c95c7c,0x29ff3fb1), LL(0x85e6a8df,0xffb930cc),LL(0x623b6068,0xaa4d3175),LL(0xf9716623,0x682101dd),LL(0x402db696,0xa3bc9f5f),
+ LL(0xba4e4651,0xf67233c6),LL(0x0714d4ac,0x8cf95660),LL(0x71f1f8da,0xd70decc3),LL(0x7078370e,0xb674732a), LL(0x4ccc773b,0x4270416d),LL(0xde87951e,0xc848ff35),LL(0x493dfb56,0xa61506a8),LL(0x767eb110,0xd8371ea9),
+ LL(0x9e6b1d70,0xb468c382),LL(0x4cd025fb,0x1a901978),LL(0x5e6879e8,0x4bf50c7e),LL(0x71cf7119,0x6b862c0f), LL(0x06240e95,0x6a53ce89),LL(0x04107ff4,0x3ddfaa0a),LL(0x65532b51,0x317093cc),LL(0x0e27b5fc,0xf1e0f859),
+ LL(0xfe4674b4,0x96a97a12),LL(0xf7c97b12,0x2a132ae6),LL(0xa5f5ae91,0x5afcd087),LL(0xd4805ddb,0xfd1d3a32), LL(0xd7b5c8bd,0x0a989dc0),LL(0x4429af19,0x35d186e4),LL(0x42935fba,0x65623ad2),LL(0xe79b867d,0x4e274314),
+ LL(0x08aaba2a,0x47d92016),LL(0xf3f4c812,0x12b62343),LL(0x464f4b4c,0xb35bf043),LL(0xd8e8ba16,0xdc9391c0), LL(0x5d460c0d,0xcc0f8c4a),LL(0xe20fc6ad,0x04ce64bf),LL(0xaa4b7db5,0xd0289df5),LL(0xe5299815,0xe0ea15c5),
+ LL(0xda3adfe0,0xc066ee2f),LL(0x0c964e7d,0xce6a9bdc),LL(0x0c859476,0x04a0115b),LL(0x9c95699c,0xb5e02dc9), LL(0x11377eb9,0xf8301f62),LL(0x172bca2e,0x57b245a2),LL(0x7b47cf1f,0xa7d9b470),LL(0x1774b1c1,0x1b469bab),
+ LL(0xda2dce70,0xbb9ec3e9),LL(0xd29bcdda,0x02d5353e),LL(0xb215233c,0xc193244a),LL(0xd27a4e2a,0xb8d5727f), LL(0xb6c5b114,0x79e56194),LL(0x5ce727f0,0xe2c20e71),LL(0x236cbfea,0xc92f34a5),LL(0x56a02b8f,0xcc47dfd1),
+ LL(0xe983ba13,0x5cdbda39),LL(0x6e96c8b2,0x20f3de57),LL(0x66b76faa,0x2ff05aa7),LL(0xd7f84b47,0xa876bc62), LL(0x0d677d1f,0x962ef8a9),LL(0x801d3001,0xabc7bb1e),LL(0x7d13a23f,0xdb5f0b1a),LL(0x20b819e4,0x2664f3ab),
+ LL(0xdc45375a,0x96be66c5),LL(0x4a6c24e8,0x780ee062),LL(0x013a13ee,0xc6fbfd1a),LL(0x21fc4f9c,0x6ce1496c), LL(0x81f272c5,0x03130c09),LL(0xa26609cd,0x06e59457),LL(0xee5363b4,0xf4c5e564),LL(0x7df0775d,0x1cd19a11),
+ LL(0xdfd6586e,0xcdfcfa67),LL(0x1ba23faa,0x358953e5),LL(0xaeec5d6f,0x0f467275),LL(0x5b0e6b2a,0xb815967a), LL(0x012b89b4,0xb01bf133),LL(0x6839cc04,0xdd924bbc),LL(0x120dfd73,0xa5cd2180),LL(0x19bf8098,0x1abb11ef),
+ LL(0x6a281d1d,0xd56c11ce),LL(0x70daeb19,0xfb01f455),LL(0x8f29fcc1,0xbb442a0d),LL(0xe9b2f829,0x9aa60157), LL(0x90ae8113,0x1f3f6e61),LL(0x6c946c0d,0xc701a185),LL(0x52ba7caa,0xb4b89268),LL(0xb0a5c77f,0xd657c679),
+ LL(0x0dd26330,0x0f14eb11),LL(0x9b036325,0xff622296),LL(0x186e735a,0xaf833fb8),LL(0xc7e710f5,0x7801b02f), LL(0x5c948f43,0xa0bf821f),LL(0x86225c71,0x3be31aea),LL(0xe60b1c88,0xe98f4f7b),LL(0x73c5281b,0x6306588d),
+ LL(0x83c9f829,0xd6178277),LL(0xc06675f1,0x67b20e6c),LL(0xcb2d5b9d,0x8a63fb89),LL(0x038c00fe,0xcb28128c), LL(0x8c7c6c6e,0x070a5141),LL(0x8789c3b7,0xc05e18c3),LL(0xd5c67731,0x09fd03c2),LL(0xf54010ec,0xc59e2abb),
+ LL(0xf1ef2232,0x03977889),LL(0x9c7409a5,0xbe2c82f1),LL(0x32004e03,0x35ac44f9),LL(0x856823a3,0x048bb359), LL(0xec1cf253,0x2e108d6c),LL(0x703eb1d2,0xe98e74d7),LL(0x570ac34d,0xcaf64f60),LL(0x4d7797fa,0xff814e7d),
+ LL(0x70818472,0x93b6abc3),LL(0x888357af,0x0e984be6),LL(0x3fe0c135,0x2a7ca1b0),LL(0x94a82d67,0x0c6c4a11), LL(0xbb83ae74,0x0c90c359),LL(0x328b8af1,0x49b25e5e),LL(0x798ff0a6,0x26a36032),LL(0x1fc28ca3,0xbbf89c99),
+ LL(0xe679eb71,0x4ce174e2),LL(0xd1c183bd,0x17c76176),LL(0x03a69f58,0x4bf67be8),LL(0xc0ee530c,0x937a391c), LL(0x1f7daaff,0x2daa9d90),LL(0xc54f14d0,0xa47e99b2),LL(0xc57feeca,0x6be357e7),LL(0xcfdfd5dd,0x3753fad2),
+ LL(0x48f90174,0x74e1457a),LL(0x9b4734da,0xb8092642),LL(0x5800ea72,0x291e75ba),LL(0xc72c28f7,0x25a21b38), LL(0x505aa4d2,0x2193e0c9),LL(0xada9d3f8,0x2f6829e3),LL(0x92900e29,0x66cd5a1d),LL(0x7414dc1d,0x1360d287),
+ LL(0x0d1b96aa,0x5deeb2eb),LL(0x3e52ccf1,0x25783ce3),LL(0x29d534ef,0xe4e251f4),LL(0x55797dad,0x9fe9693d), LL(0xc6ab9935,0x6a173d69),LL(0x7721ca8e,0x23991318),LL(0xc393eb26,0x38cbcd30),LL(0x71d95a9e,0xe3627ab9),
+ LL(0x7f6fe2d4,0xdf1218be),LL(0xfabd8326,0x850c8598),LL(0xb0f7cf49,0x1214d3d7),LL(0x1805345b,0xeaf60d31), LL(0xbfee2c5f,0xc5caf65b),LL(0x45e23043,0x70127979),LL(0x500fbad2,0xda36e794),LL(0x4156e3a6,0x38fa60b0),
+ LL(0x3cbab88a,0x45934bdd),LL(0x1b19dce4,0x72821e74),LL(0x8661e32d,0x532f706d),LL(0x73a9930e,0x3dbfc225), LL(0x3cbeb0f1,0x72d1cb2a),LL(0xe20f5613,0x795b0696),LL(0x9fc88717,0x6e3469e8),LL(0x483864d2,0xf4bf0531),
+ LL(0xfa19ddd9,0xc92e6a8c),LL(0x3528e628,0x7db7e2ee),LL(0xf321fc88,0x997a00eb),LL(0xacdf205f,0x7605a2c9), LL(0xea9c3ed0,0x9fca58cf),LL(0x56ff0e98,0x833078cb),LL(0x662a1695,0x75159b8f),LL(0x1919f51f,0x186560b7),
+ LL(0x5ef764b4,0xe9b60e57),LL(0xbe73c698,0x61ad29fc),LL(0xdd2be1ee,0x18489017),LL(0x7febda71,0xac95e3b6), LL(0x5ac96092,0xa6985346),LL(0xbfc83566,0x906265c3),LL(0x5972fa4a,0x1692c812),LL(0x00773540,0x4e76f879),
+ LL(0x542b137e,0xba9a6268),LL(0x4c7926e2,0x43a52b90),LL(0xfeae554e,0x28785bf5),LL(0x0ab61576,0xc023b688), LL(0x10933a55,0xb3ec8181),LL(0x6331678e,0x75634459),LL(0x17c50b5d,0xe0dfa141),LL(0xe2151f25,0x4cbe7fda),
+ LL(0xce81fbaf,0x3f3072ac),LL(0x0ff56a32,0xa387bb20),LL(0x99865968,0x2b08a811),LL(0x084cb1f2,0x7279f913), LL(0xdad70f5a,0x78cca6c9),LL(0xff47647d,0x72469f6a),LL(0xe358b597,0x2505c7ff),LL(0x998ff0dc,0x7c5268a8),
+ LL(0x99d5b1c1,0x32d70129),LL(0x24a90c34,0x72727c15),LL(0x715662b1,0x57dad21c),LL(0x132f3294,0x76b4b6ec), LL(0x267d246e,0xd03b46b1),LL(0x29b47516,0xc7c848ec),LL(0x1660af51,0x5eab3dbc),LL(0x04c66383,0x818894c4),
+ LL(0xa7b82f5c,0x26a45c3e),LL(0xea98adfb,0x494694de),LL(0x134b182c,0x44a06ec3),LL(0x75b82b41,0x5570befa), LL(0x129f952e,0x819f6808),LL(0x914f87c4,0xa6fad25f),LL(0x7c7be905,0x831e5668),LL(0xe623a5c2,0x93107f38),
+ LL(0x5e40c5f4,0xa9d88469),LL(0xaa5993c5,0x4314d233),LL(0x9c19bbc5,0x5eab88d0),LL(0xb385d3cd,0x795e1c21), LL(0xce163fbe,0x532a1871),LL(0xb867aea4,0x727cb126),LL(0xf7f30476,0xfc7047eb),LL(0xfcc4fe35,0x18031271),
+ LL(0x884a4c6d,0x4b84fa4a),LL(0x55c830ab,0x82cb9aee),LL(0x0cc927cc,0xd4cfdf04),LL(0xa16bef30,0x787efdde), LL(0x32e3c763,0xd1fb2dd6),LL(0x16737272,0x8739566f),LL(0x03a1055a,0xf9ae4f46),LL(0xf9a7472b,0x199970cd),
+ LL(0x1d33ac50,0xf9893cfb),LL(0x1e5ff4e5,0x74cf7dd4),LL(0xf7165331,0x72ec32e5),LL(0xbb4679cf,0xa082c59a), LL(0x5c75461a,0x3cd0a467),LL(0x40f06206,0xd2872d68),LL(0xb5122795,0x08271eef),LL(0x1475e22b,0x7006d350),
+ LL(0x89e35108,0xf7cd1bcc),LL(0x93f1cbaf,0x924efa43),LL(0xf35b13ac,0xe3716559),LL(0x60370a1d,0xa0a88e87), LL(0x8c286ea3,0x1203be0a),LL(0x6ebd50c7,0x97fc5ab6),LL(0x74284d08,0x2b5b3602),LL(0x694a20e0,0x3055716f),
+ LL(0x193520c0,0x793c8a89),LL(0x655f5ff2,0x356402d0),LL(0x1af5ddd6,0x0cf889ee),LL(0xb3f149b2,0x3eb7eb35), LL(0x68e07e0e,0x5254b57c),LL(0x9c5bbfa7,0xb1971de2),LL(0x0ad81e7e,0xcc85a53a),LL(0xed3cbb10,0xbaaa4d2b),
+ LL(0x8f3a7eec,0xbdf9941c),LL(0xa1f26666,0x6e1b7dab),LL(0x2d79a58f,0xe7a0dfa4),LL(0x1f2b9667,0x25e0ddb5), LL(0x5fd96351,0x4b3b5105),LL(0x8874abd1,0x12325832),LL(0x795d91a5,0x56e90310),LL(0x2c32eec8,0x376a79d2),
+ LL(0xa8a16445,0xd9dd8817),LL(0x0e00fa92,0xd61f6aec),LL(0x17d95f07,0x594a620d),LL(0xf4b15001,0xa1534fda), LL(0x0974f4a3,0xe9402601),LL(0x8f671f13,0x4c3fc130),LL(0xc5f35bfb,0x8eaab35a),LL(0x4626baca,0x13b98472),
+ LL(0xcdee6f8d,0xf48703ad),LL(0x12d39694,0xf1ba0309),LL(0x9fcda52c,0xeb2d4d92),LL(0x5507b401,0x984f5111), LL(0xf6bab9ec,0xe3aa26ae),LL(0x6b2e077d,0x557b5e3f),LL(0x2f9c5f35,0x7185ab4f),LL(0x1680bcbc,0x96f21a33),
+ LL(0x2ddb1173,0x2e7f6e07),LL(0x816ffc8d,0xa704416e),LL(0x52e26265,0x55acfaa3),LL(0x8b758c94,0x9c244253), LL(0x0479936d,0x4012e0a6),LL(0x6d8541d8,0x12749e93),LL(0xce56a2a1,0x374f420d),LL(0xc79da17f,0x6a8e3614),
+ LL(0x157cc9e1,0x3602ad09),LL(0x13603196,0xf3c4a54c),LL(0x8473ae27,0x354fc6ed),LL(0x651b8003,0xb4cf4251), LL(0x3415b5f0,0x456b1b9b),LL(0xc4c71507,0xe078a858),LL(0x9a0a11fb,0xf4210409),LL(0xf930ec45,0x76de42a0),
+ LL(0xcfa869a1,0x82ecd0af),LL(0xdccf2e47,0xa637938a),LL(0xc041648a,0x1d2858f2),LL(0xc0dfacd2,0xcf9abfe8), LL(0xbdddebe1,0x3af77e19),LL(0x180b535f,0x15f6b0bb),LL(0x549d34c1,0x497de678),LL(0x3dba7d6f,0x31495c9e),
+ LL(0x393ab61c,0x47b9368b),LL(0x27441f92,0xdb8ee3a8),LL(0xfb0b0117,0x214a6a5f),LL(0x43759430,0x429e61ad), LL(0x77316c0e,0x78116e88),LL(0xa6a29e98,0x59c82616),LL(0xaaef4619,0xbfed454f),LL(0x35926335,0x673327c4),
+ LL(0x18c616a7,0xaa66d8c5),LL(0x6d28fb98,0xa93946a6),LL(0x133336dd,0x4fc30de5),LL(0x7f0c805e,0x7e000a34), LL(0xcf7eab23,0xa82dcf54),LL(0x8dc24371,0x679e67a8),LL(0x1af582d8,0x26b2dffc),LL(0xd3fe2155,0x4c1d692a),
+ LL(0x2d024923,0x2475b110),LL(0xc303c1e7,0x0cc9245d),LL(0x03667a7a,0x290b7a77),LL(0xd87dbd9c,0x2ab8eb6d), LL(0xc098719e,0x7089e481),LL(0x12c022c8,0x17dd6d74),LL(0x8b7aca14,0x90efa01f),LL(0xf55fbe83,0x8b601fba),
+ LL(0x415aa7a5,0xf800bd76),LL(0x3aa74349,0x015573d3),LL(0xaf5ec789,0xd5143779),LL(0xd76dd2dd,0x32330b4b), LL(0x82331ef1,0xec6caa4d),LL(0x25ad1965,0x92cc8865),LL(0x134370b0,0xf8209a40),LL(0xb883cf95,0x320a37b9),
+ LL(0x5d39731d,0x94237ba2),LL(0x8532a968,0x6359d195),LL(0xf86b8b75,0x8bca94c9),LL(0xde316226,0xdb5c6a9c), LL(0xa2fa0c26,0xdf300c59),LL(0x48af4357,0x6dbf6082),LL(0x06535fc9,0x25066c6c),LL(0xa29b2477,0xba2e774e),
+ LL(0x1931299b,0x5157e93d),LL(0x3a8035a4,0xd6249c10),LL(0x81245740,0xcb18fcf1),LL(0xad5ebe1f,0xb4d84c9d), LL(0x8df0d59d,0x95050bec),LL(0xac2a2e0c,0x190a4860),LL(0xfd1bbb11,0x29029e0f),LL(0xb075b432,0x341f73de),
+ LL(0x74836028,0xa825c3c5),LL(0x8f55343a,0xec4fd74b),LL(0x60a683b3,0x009bcab5),LL(0xcd3adea6,0x29877303), LL(0x684a33ac,0x9f264bf2),LL(0x84b3c379,0xc8bf19e6),LL(0xa1215470,0x8ac35fb8),LL(0x405386d6,0x2919d9da),
+ LL(0x19780b2a,0xb4e4aa30),LL(0x356ddd4e,0x639b8fcb),LL(0x9322c245,0x6ed7b10c),LL(0x57f39c76,0x84ec0bc6), LL(0x879176fb,0x6a1be66c),LL(0xe10e0f77,0x4cab3151),LL(0xe2ae0777,0x01c6321f),LL(0x65e57ff1,0x04d6a04c),
+ LL(0x142596dc,0x8c1725ed),LL(0xb2d413a6,0xd321d49a),LL(0x2b5e8ae7,0x19c25fc3),LL(0xbd3c7dc6,0xfc32cbeb), LL(0x57b98ff5,0xf3ec98b8),LL(0xf75b1a00,0x52e5f1ad),LL(0x8f8ad463,0x16812bb4),LL(0xa274f0c3,0x9d67cb11),
+ LL(0x80064047,0xdec72055),LL(0x4319f87b,0x3f828c01),LL(0xff4d6c4a,0xffcad5c3),LL(0x67a6e030,0xee6659b2), LL(0x0478715f,0x9cb5c729),LL(0x5a1c926e,0xc63fc281),LL(0xdeb11155,0x1b8788ca),LL(0x4f0c00b2,0xbe2eebf1),
+ LL(0xa6af09d1,0x9b72ffd0),LL(0xa9a459f3,0xcbac42bd),LL(0xf560dc93,0x150806c0),LL(0xc57787ee,0x71c636e4), LL(0x2a951b0d,0xe4f3acb8),LL(0x3b18d294,0x510dc771),LL(0xb060e782,0xfbb3fb53),LL(0x0358210e,0x0659cadd),
+ LL(0xecde1629,0x23638245),LL(0xcc09daa5,0xee6e9a65),LL(0xee18f9cf,0xf440bb81),LL(0x955200e0,0x99e4d6e8), LL(0x93e69354,0x34555b58),LL(0xfb29b19b,0xa6080e13),LL(0x5100ab06,0x3bfa4796),LL(0x22eec8fc,0xf5db4b13),
+ LL(0xe5aaa980,0x2c1a229e),LL(0xd29eb83e,0x446cd46b),LL(0x7f5aa015,0xe0c044da),LL(0xa18f23f7,0xa55d5f23), LL(0xb6b70f51,0xd71e58c1),LL(0xb5862c51,0x77c72d10),LL(0xfce94ceb,0x01db731a),LL(0x13a47553,0x877703a8),
+ LL(0x3b75e6d9,0x4878b0b1),LL(0xfe60f98a,0xbe8421f0),LL(0xc69d6820,0x6312821b),LL(0x00d2db20,0x4c019374), LL(0x2a1d8b74,0xb1bd5175),LL(0xef7fdad6,0xa0a24ad2),LL(0x929fc488,0xf29fd27d),LL(0x162a02de,0x8e28b4ed),
+ LL(0xc166afcf,0x434cbdb3),LL(0xbf663e65,0x7b79e808),LL(0xa3c3b159,0xd445f1b0),LL(0xb35b2be9,0xdf9f92b7), LL(0x788a9bbc,0x815b57f3),LL(0xabbba2e0,0x9e03e357),LL(0x91a658d8,0x3fc574d5),LL(0xadf4e250,0x83b35d8a),
+ LL(0xacd1e4f0,0xa0e15175),LL(0x868b4e04,0xeca899a4),LL(0x782b7ee7,0x713b4e9e),LL(0xb7d58c1a,0xed177e1e), LL(0xac8364b2,0x4778df76),LL(0x2e8f7ef7,0x6898fb31),LL(0xa03975b0,0xfccf4c53),LL(0x8597436f,0x0f908d14),
+ LL(0x96671c53,0xbeaf1a16),LL(0x6bc4cbbf,0x9be64329),LL(0x80017bf3,0xc8f66f63),LL(0x8836ff35,0x92d700f2), LL(0x13a4daf1,0x9ddd7a81),LL(0x9b72664b,0xb3c42723),LL(0x81babf43,0x3d96f79a),LL(0x7ce5830d,0xa46c9c0c),
+ LL(0xf5999a71,0x54dfec97),LL(0xe586a578,0xdb5be461),LL(0xcfb4e7ad,0xf9bc3f04),LL(0xb11f07aa,0x6e5448a9), LL(0x70132d5a,0x29ef7791),LL(0x28ba851a,0x4fe486c3),LL(0xb62f7f8a,0x6743fecd),LL(0x44d24d01,0xeb264387),
+ LL(0x72ebb976,0xf93c05bc),LL(0xaaae099e,0xe65b30c0),LL(0xc8427104,0x4194721a),LL(0x3025853e,0x3af3487f), LL(0xdbf48435,0xb33a2893),LL(0x2d79334e,0x2c5ac639),LL(0xb16b05a6,0x8fc199f8),LL(0x7661a77b,0xc145358e),
+ LL(0x1841f719,0x15b580b6),LL(0xd7045528,0x24f5fadb),LL(0x98df2c22,0xe443c257),LL(0xd7eed58b,0x48acf5a7), LL(0xedeb9e4b,0xe24e6571),LL(0x562533fd,0xcd047b81),LL(0xd1566e36,0x618ddd86),LL(0xdba1eced,0x09a77b70),
+ LL(0x6968ddb9,0x0e9de410),LL(0x12985b32,0x10f0f429),LL(0x8ca7d2fa,0xbe21b10f),LL(0xc610ae2b,0x0844d8e8), LL(0xd57107d5,0x58a08694),LL(0xc34441f3,0x45f44bd5),LL(0x79a54186,0xe8b3b3df),LL(0xb8b5f26b,0x6496d668),
+ LL(0x192503be,0xd69cefb8),LL(0x40f928fc,0xb692128d),LL(0xa7ed8c47,0x13b11dfd),LL(0x5a196756,0x90bd279f), LL(0x17ff33eb,0x78f2e8c6),LL(0xaaf6c182,0xa7b233d4),LL(0x76a31f46,0x63d62503),LL(0x1449dc97,0x53143dc3),
+ LL(0x94922922,0x5bb86802),LL(0x89181334,0x2f45a7dc),LL(0x1ec5cce4,0xf7c466d5),LL(0xbb3bd5f3,0x52d15eed), LL(0xe6eacf86,0x150bd5f6),LL(0x0ba66988,0x7fecaf3a),LL(0x11f6f528,0xcdd7fadb),LL(0x55042faf,0x60f64c68),
+ LL(0x961ddf76,0x1615919d),LL(0x53f2f514,0xdba095cb),LL(0x1e6c076c,0xf04960ba),LL(0x4c9f17d5,0xe5276722), LL(0x61c186a9,0x93ff80f9),LL(0x3c58ab92,0xd17378b0),LL(0x769492e8,0xc67f9ae1),LL(0x0c3d023b,0xaccfc868),
+ LL(0x5b99708d,0x7d67a63d),LL(0x4b80189a,0xfb29bef7),LL(0x241c402e,0x3cb7eeaa),LL(0x2c5c2767,0x328cb6de), LL(0x9cec231d,0x0d24a7b4),LL(0x0e2e6a7f,0x725955fc),LL(0xb7f17b13,0xa2040cfa),LL(0xa25c71cf,0x215eff8d),
+},
+/* digit=11 base_pwr=2^77 */
+{
+ LL(0xc0d41a94,0xe4d9cab1),LL(0x9e60f7d4,0xc38b202a),LL(0x9336116c,0x2bbf6b17),LL(0x2e068f13,0x2f9aa877), LL(0xa4bac9fd,0xf8820627),LL(0x8a593cb4,0x2209cb9e),LL(0xc7417931,0xaa78ec63),LL(0x7cfccfbf,0x42d21251),
+ LL(0x3e611940,0x40cee5ae),LL(0x0aa090ec,0x4e2d9ea9),LL(0x1b926e42,0x73d167ef),LL(0x5d5112a3,0x7fff36df), LL(0xcaffa3fb,0x25587745),LL(0xc5a83504,0x224f7f4e),LL(0x3b47bf2a,0x5ceff018),LL(0xecfab5c6,0xed9bfa73),
+ LL(0xd9b429c9,0xf3d570b8),LL(0xc5ad81cb,0x69460116),LL(0x2f6825bd,0x30833a08),LL(0x7c99f36a,0xa297122a), LL(0x05c3abdf,0x6fc9b848),LL(0x5f2e24b2,0xefe95298),LL(0x8915d922,0xf045275a),LL(0x298a9726,0x79146aab),
+ LL(0x4f831d0b,0x0c7d5905),LL(0x2d47d4fe,0xfaaaa26c),LL(0x85042e12,0x5ac28599),LL(0x7796977d,0x7eda370b), LL(0x95c0be63,0x9f0bd71d),LL(0x8e821005,0x7c4601bc),LL(0x4c2ffae9,0xf1ecbc60),LL(0x9b688173,0x7e3efc57),
+ LL(0xf4ea7641,0x868c672b),LL(0xd94243dc,0x4fa90a82),LL(0xf5eab489,0xbd82913e),LL(0xe966b39d,0xceebc159), LL(0x35c51e2b,0x31fe4f5f),LL(0xc79c1725,0x2fea6ab1),LL(0x83afad40,0x5856cd85),LL(0x4ca89b88,0x7f960988),
+ LL(0x1ed8fed0,0x9d237c2d),LL(0x4e0c6f10,0x69b4ec80),LL(0xe4648395,0x11f83283),LL(0x306e152a,0x6f4636a7), LL(0x804539b3,0xf70fd23a),LL(0xb3cdb981,0x4db0903a),LL(0x6691eb18,0xe506ae6f),LL(0x1d8e9d9d,0xaa69c7aa),
+ LL(0x3e4e2088,0x540af950),LL(0x95f04e57,0x8fab01d5),LL(0xa8c51a67,0x51bf909a),LL(0xfd19beb7,0x01299f5e), LL(0xb8f15aeb,0xdf703400),LL(0x2d890394,0x19c70987),LL(0x203d2d99,0xf5fcc675),LL(0xc3d4ddea,0xabbf3f21),
+ LL(0x587feffa,0x8348ca15),LL(0x7d69e4ad,0x585d0740),LL(0x885a0745,0x6fbe5619),LL(0xb10b24dd,0x04ee9eba), LL(0x0f4c12d7,0x5c27075c),LL(0x3c51c605,0xacf4acdc),LL(0xfce336d0,0x782fa52b),LL(0x483621d2,0x6e1d078f),
+ LL(0xd4dc3277,0xa2253bfb),LL(0x4691bc12,0x3a014307),LL(0xebdef616,0x415aa5b2),LL(0x16fe065b,0x1008a44a), LL(0x16dfa94d,0x4004a90a),LL(0x8464785b,0x0e24f541),LL(0x88d30ea8,0xd2715c89),LL(0x1f05a312,0xaf81a9ff),
+ LL(0x3e8d5eef,0x958da470),LL(0xd3c80414,0x09561898),LL(0x8bb74691,0xba6b731c),LL(0x577f2ef9,0x6b7355cd), LL(0xb8a98efa,0xd1f416ed),LL(0x11590271,0xd4a1293a),LL(0x4658e9eb,0x2c4d5934),LL(0xd1f15d39,0x51803651),
+ LL(0x3c95fffe,0x9b9f0c05),LL(0x31acd6ca,0x8f021451),LL(0xf9dba549,0x5fee2961),LL(0x17ea0456,0x05217975), LL(0xd13a6a4a,0xc0591906),LL(0x90daf370,0xa7f5ed02),LL(0xfc4c304d,0x1f8b7158),LL(0x1b7f0246,0x77016c29),
+ LL(0x2ea265d2,0xc27d1847),LL(0x2862781e,0xec0789c6),LL(0x5d86a60e,0x0a79ac1f),LL(0x130670a5,0xe325b563), LL(0x6d33bfee,0xf4794460),LL(0xec25bb10,0x126e703e),LL(0xa7bf902f,0xeae22fd3),LL(0x28eef62e,0x8b2fb282),
+ LL(0x059138b4,0xb68de35b),LL(0xd46e68e3,0xfc44bf56),LL(0xff11f76a,0x71567daa),LL(0x6b17cd2a,0x9110e849), LL(0x69573b93,0x7c4027e3),LL(0x1eb9bf01,0x84ee945a),LL(0x28c26cdb,0xa3fadc6d),LL(0x575dfc1b,0x7037a74d),
+ LL(0x9b2223dd,0x58c96a91),LL(0x51461b94,0x912fc795),LL(0x2df3329a,0xc18ced63),LL(0x88a002d0,0x79d6f75f), LL(0xf44d3d84,0x73d7a089),LL(0x8c058073,0x98c78aa7),LL(0x333ae8ff,0x0ab8b3c7),LL(0xebd4e536,0xf5a8f5ec),
+ LL(0x83a5f52b,0x2c7df9fd),LL(0xcc062097,0x314fc7c3),LL(0xc5a3113c,0x6c3195f8),LL(0x2c25a629,0xf130cef9), LL(0x70c8dd70,0x10c8cc5b),LL(0x01cd40d3,0xecb7a35f),LL(0x6fe21c93,0xfbee538f),LL(0x2ba12ee8,0x57ec1959),
+ LL(0xb2b806a8,0x74387a1b),LL(0xbad5d0f4,0x14efa300),LL(0x23a0e9e4,0xee7e4421),LL(0x3b6abdec,0x504ae428), LL(0x927b1aac,0xb8c06fcb),LL(0x323b71d3,0x55e1c85c),LL(0x48d6dae1,0xf47e180f),LL(0xa84cb0b8,0x6d80dd63),
+ LL(0xd75d7785,0xf8e07d53),LL(0x37614325,0x3edf19b7),LL(0x357946ed,0xf03709b0),LL(0xd12105e7,0x567d8c0d), LL(0xa9383b49,0xecf6abc0),LL(0xcab329a7,0xfe9c760b),LL(0x43928852,0x425e62fa),LL(0x6194b51f,0x27945ae0),
+ LL(0x3ee4f7cd,0x756f0f54),LL(0x26e4c865,0x4337ac7b),LL(0x35b9c3ae,0xf94596c3),LL(0x4d6aa5d2,0x066fd3da), LL(0x43c8d94c,0xce1a5b7e),LL(0x614c0fc2,0xaed496a8),LL(0x2a6d5481,0x355e16f5),LL(0xa09d3afe,0x8f934639),
+ LL(0x2bf2a099,0xd170daef),LL(0xae6ee507,0x3920d87a),LL(0x248158e3,0xbdac1c8e),LL(0x05c54e69,0x99033a9a), LL(0x41872197,0x4513bdf0),LL(0xd3f0f889,0x15634020),LL(0x05d42aa8,0x76c1855a),LL(0xe8ba47cc,0x23079179),
+ LL(0x728429e6,0xf80b787b),LL(0x3dd8c4f8,0x896b6ea5),LL(0xc7d9fe06,0x711eef39),LL(0xebced829,0xfff28d03), LL(0x4ad40c88,0x5d7823b8),LL(0x3b112bd4,0x40a5a166),LL(0x63bce926,0x84230bfa),LL(0xbe17e7cd,0x39d2e6bd),
+ LL(0xef03ee6c,0xa772e242),LL(0xfa009e67,0x888bc969),LL(0x4893e1f0,0x0f06ee83),LL(0x6b89e124,0xf28f0d3c), LL(0x71f5cbc5,0xb3e70ef8),LL(0x6cad191e,0xff0f7e62),LL(0xf028d276,0x990697be),LL(0x4ad8f830,0x144c101c),
+ LL(0x3556d74f,0xbcaafb45),LL(0xeb4c7ea0,0xbc216224),LL(0x234a62c8,0x73ad1043),LL(0x2d95ff46,0xa644eb6a), LL(0x0a3373f8,0xd545b60a),LL(0xd4edaa10,0xf7a0572c),LL(0xa97a85b4,0xa7177049),LL(0x7d3ec769,0x529dbadd),
+ LL(0x7822dd37,0xc45610f6),LL(0x98258666,0xfad07fab),LL(0x87259c1b,0xac27001f),LL(0x1b849745,0xa9bdc6a9), LL(0x04c862b1,0xc7ee7216),LL(0x0012f591,0x32c1541e),LL(0x5a366d79,0x8198aadd),LL(0x68866e1b,0x03cd312e),
+ LL(0x9ec64698,0xa0dbc381),LL(0x1ef36dd2,0x770e4d11),LL(0x8d56bdfd,0x01d17915),LL(0x75eb9947,0xb48153cd), LL(0xfde98390,0xc1d17a54),LL(0x0fe2d6fc,0x0817eaf7),LL(0xa6a704f1,0x44a63591),LL(0x7f554182,0x9423465f),
+ LL(0x13e0574e,0xc7c23cbd),LL(0x439941b6,0x6e06e2cb),LL(0xafa39c79,0xa8aebd2c),LL(0xedede735,0x1b859e2b), LL(0x6b4f5465,0x2f485781),LL(0x624c81e8,0xec3093f0),LL(0xc282644c,0xc1f027c1),LL(0x2b74ab51,0x2f6e990b),
+ LL(0xed2ea3df,0x9a988d1c),LL(0xff39d3df,0xa3f50efd),LL(0xec1d7614,0x418a3627),LL(0x3d4fa3e8,0xafc1520c), LL(0x891a9c69,0x741305af),LL(0x5d6f8296,0xe87064d4),LL(0x12307b05,0x47c9394c),LL(0xc35f0f40,0x6b038acb),
+ LL(0x1ccca008,0xa6e77647),LL(0x9dd71746,0x58e4cfb6),LL(0xc1fe84ae,0xdf649c98),LL(0x90db4388,0x2e308ddc), LL(0xe9362400,0xc2641332),LL(0x42d265e5,0x92dd9842),LL(0x31eb91bd,0xe0e4ed9b),LL(0x145535c5,0x62ec7dd1),
+ LL(0xf810812f,0x1ff29a09),LL(0x15e9b102,0x56b64acb),LL(0x5b353184,0xb5f6d4d4),LL(0x1c593774,0xc3c9292c), LL(0x2c700292,0x16781036),LL(0x3ae2f0c6,0xf0948fc9),LL(0x4da778ea,0x40e353cc),LL(0xa34df03a,0x07febf09),
+ LL(0x9ec397ff,0x349812ae),LL(0x330f02d0,0x7c78812f),LL(0x7d241ea2,0xf956700b),LL(0xebed08be,0x864b1809), LL(0xb9eb1635,0xe4cec3df),LL(0xab49fb60,0x7dd65ad6),LL(0x86788a28,0x06551163),LL(0x11fb4214,0xda8792d5),
+ LL(0xcec09c3e,0x82140df3),LL(0x539db03f,0xcd34ca30),LL(0xe7dd0e09,0xf07cf030),LL(0x56ae3487,0x7b08a242), LL(0xbf5a6549,0x9c0fd607),LL(0xd189d68e,0x0b1fc745),LL(0x9cf52022,0x0d91be74),LL(0x43ff7fc3,0x6013f31f),
+ LL(0xb5654233,0x3bf90bd5),LL(0x202bf534,0xd0a17969),LL(0xc97e02ba,0xff373b8b),LL(0xd31dba07,0x4606de54), LL(0x8114562a,0xb045c50a),LL(0x7b8d8915,0xc123acac),LL(0xb60aa324,0xa8f7cd87),LL(0xabc48200,0x077cab67),
+ LL(0x0d7fff59,0x88a68643),LL(0x67bfe743,0x82b92193),LL(0xc2ce06f9,0x1a8b86cf),LL(0xf9ad6134,0xa38414a0), LL(0x28e2c39f,0x7f102610),LL(0x480856a0,0x34805c20),LL(0x18c3034d,0x1b3f9302),LL(0x574c0c9d,0x1713f457),
+ LL(0x690ce2a5,0xd84fa26f),LL(0xe01a4637,0xd4cfa19f),LL(0xcc6fad47,0x4807fb82),LL(0xf933226a,0xc9d84b48), LL(0x7cd2c9dd,0x9b7c530e),LL(0xf44818e3,0x6436a001),LL(0xdfb00461,0xbae0ceed),LL(0x51c8c8a3,0xed6a7c5f),
+ LL(0x0463ac73,0xa6e7fa54),LL(0xc77b19e5,0xa0deed89),LL(0xff218725,0x4e0a3396),LL(0x2edf2704,0x7cfbbd57), LL(0x4e8608c5,0x8114d0ca),LL(0x38c935b7,0xceae65b9),LL(0x330af8fd,0x052b1407),LL(0x723c422b,0x02e189a1),
+ LL(0x657560c8,0xf1cd6216),LL(0xe5068361,0x099eec2f),LL(0x3de78037,0x68ef58fb),LL(0xf3e399e9,0x83e0d34e), LL(0xf9a17095,0x3a2a14c8),LL(0xaaf9f08a,0xc7a360be),LL(0x30e99527,0x6420155f),LL(0x9f180405,0x8f610960),
+ LL(0x02bc97fe,0x871a832f),LL(0x8dc7f1f2,0xa14b3326),LL(0x87f78ad1,0xc9bd8b41),LL(0x0b59b9c5,0xd378d02a), LL(0x35c0dc14,0x418a32a5),LL(0xf53d85af,0x4c96979d),LL(0x08eb4b26,0xb6f40e97),LL(0xcaa6252f,0xa21349ca),
+ LL(0x5de38e2d,0xb13d8062),LL(0x9b43c5d6,0x54ea3684),LL(0xb1d6521d,0xc0ad58d7),LL(0x22085236,0x182f8823), LL(0x2a08449e,0x9d50cecc),LL(0x17ab0b68,0xeb85e785),LL(0x8d74e26b,0xb8a22ab7),LL(0x77d03987,0x77515524),
+ LL(0x77ad71de,0x117a63f2),LL(0xc94c8c82,0x1cca30d0),LL(0x2f05382d,0xe5fefba9),LL(0x9b4b42f1,0xcc9e8916), LL(0x9fe716c1,0xbe939e13),LL(0x95e38cc2,0xbf2b9c80),LL(0x37adde62,0xf60c4491),LL(0xf4df75a3,0x3eb3338a),
+ LL(0xfe4d84df,0x16398af3),LL(0xfaf3e5f2,0xed752cf8),LL(0xb4cf0e1c,0x746a4339),LL(0x39fb6018,0xb8bd479a), LL(0x57dffed3,0x3a9a045b),LL(0xa5ae3c78,0x2b46ea98),LL(0xde6b0399,0x74b5163f),LL(0x80e511c5,0x069628a0),
+ LL(0x1b96672b,0x19cfc882),LL(0x379d1f57,0x2759c76b),LL(0x2269a514,0xa6cc7a98),LL(0x683b1413,0x1bc2015b), LL(0x1bf4be62,0xc43b1178),LL(0x7bf2b0be,0xd2941975),LL(0xc4591cfd,0x1eac3587),LL(0x0e66d495,0x283169e6),
+ LL(0x052352e1,0xd39bedb7),LL(0xd719cd43,0xb04af7f2),LL(0xe92956d7,0x702143d4),LL(0xa0e5b847,0x53498722), LL(0x574885fb,0xf0e8edc5),LL(0x8b5187c6,0x4d9418ac),LL(0xd2a00019,0x70e99cb3),LL(0xe7f8a61b,0xf0da5be4),
+ LL(0x7dd34fde,0x52704cbe),LL(0x2926bb6a,0x0fb7224a),LL(0xf2b0af92,0x0d58bddd),LL(0x0e9cad36,0x2f986a07), LL(0x80e3a6f9,0xc85549d4),LL(0x322cb14c,0xa013e913),LL(0xf25ac201,0x8a19cf30),LL(0xffb8f2e4,0x130e4ce0),
+ LL(0x0ce56c13,0x21ad2c8c),LL(0xb15f6a2f,0x13ed2106),LL(0x9453ce96,0xa217b5f6),LL(0x64e0bf9c,0x93b1cdc7), LL(0xc4fe8e72,0x753d894d),LL(0xf3a3916a,0x46c6cea3),LL(0x383dd581,0xc1fb78e1),LL(0x17376a3e,0x1b7ba1a9),
+ LL(0x5df66852,0xa1411287),LL(0xa30445d3,0x4e9d333c),LL(0x917568a9,0xb5a26c14),LL(0xe857a6ac,0x885f1857), LL(0x84b1f8cf,0x05fbd3ee),LL(0x1e81e4e1,0x5c1f4097),LL(0x011f30e6,0x43999be4),LL(0xa890719d,0xa8aab3bd),
+ LL(0xc7088eb2,0x49d598ce),LL(0xe341047c,0x7a892468),LL(0x07cb6075,0x8e69b5c4),LL(0x8c37dc04,0x83d066fd), LL(0x6ffff7ac,0x4fcc6d02),LL(0x7edfb968,0x1afaaf74),LL(0x70d529de,0x2972b753),LL(0x08218b2e,0xf65bff0d),
+ LL(0x4182b9fc,0x119b3c4b),LL(0x27b5e101,0xcab66591),LL(0x2ab87a02,0xfff2e939),LL(0xeec5949b,0x1c10c40d), LL(0x30aa1242,0x98366224),LL(0xf225a4e7,0x833e9dee),LL(0x992e8475,0x07f1cfec),LL(0x1ef83a8a,0x377a9d79),
+ LL(0xc6715544,0xaf1d0863),LL(0x1fd71505,0x34dd65c1),LL(0x04fed293,0x74d55c22),LL(0x86d2f3be,0x31b1e50e), LL(0xc09594ac,0x876148b9),LL(0x8900b56e,0x73aace3b),LL(0xa2cf4c37,0x4617258a),LL(0xc6f38a92,0x554e8f16),
+ LL(0xda0723bc,0xd8594800),LL(0xf3c8381d,0x524452df),LL(0x138ca980,0x846dfa02),LL(0xe2d32e56,0xaa77a80c), LL(0x419c86b5,0x27573fbc),LL(0xb70216c3,0xe7486807),LL(0xc72036e6,0x8b7a685a),LL(0x15fae3d8,0xa1764627),
+ LL(0x815f379c,0x0a1f2361),LL(0x01ab64d2,0x9811607e),LL(0xff2c75cd,0x31841038),LL(0x474982aa,0x8751674e), LL(0x52a2523f,0x2f32b55b),LL(0xe85f2025,0x6ff8d2a7),LL(0x707b2dcb,0xd2ec31ee),LL(0x6e277971,0xdac81e59),
+ LL(0x0e78191b,0x5445e3a2),LL(0x8c80db2f,0x134dba0b),LL(0x94002b55,0xe9925a87),LL(0x4293c71d,0xe56fa2be), LL(0xa9d009c2,0x72aca4d2),LL(0x02fb0741,0x0c1219dd),LL(0x208fd227,0x689fbc66),LL(0xe4bb09d8,0x8266f2f7),
+ LL(0x2a61b8bb,0x1a791f9b),LL(0x3eff4f21,0xb29b31b7),LL(0xab7812db,0x2f97803a),LL(0x880ceb4c,0xdbf27bae), LL(0x45e9db5b,0xecb84887),LL(0x5cb7d0ec,0x3dfd84e1),LL(0x77c0b1e0,0xc89f61c2),LL(0xb7656544,0x7ada1d37),
+ LL(0x910a966c,0x0bca9585),LL(0x6f12c20c,0x80385b47),LL(0xa4b30374,0xf63a1605),LL(0x104b4783,0x2f91b24c), LL(0xb3ab423f,0x9210f5b9),LL(0x2fd424a6,0xb9aa656d),LL(0xf7e8d640,0x63c615d5),LL(0xbb59cfec,0xd567ff98),
+ LL(0xf7692947,0x78121697),LL(0xbd9f5ed5,0xb9166739),LL(0xb64b20e2,0x58d9a4f4),LL(0xc9fcc93c,0x291898d9), LL(0xd6c6065a,0xbce6509e),LL(0xb84834a4,0x39af658f),LL(0x94b49185,0x0f919d44),LL(0x5dbe7308,0x3b80fc51),
+ LL(0xe321c228,0xb9fd8ae4),LL(0x360692ba,0x4a46bd2d),LL(0xd05b84b0,0x91d5396e),LL(0xd6b058d0,0x266e89fd), LL(0xb2c42e38,0x6fb142d7),LL(0x994ebc2f,0x93c9fe18),LL(0x104b04a3,0x90e17885),LL(0x654eb6ac,0x6a5fa420),
+ LL(0x3f349b26,0x26c8a9b4),LL(0xb4e528ae,0x39387f7e),LL(0x5eb46726,0xa74bea43),LL(0x9150b043,0x0b3e82dc), LL(0xe2fc799f,0xc69ffac9),LL(0x48921338,0xd0479697),LL(0x0a4e061b,0x91a68264),LL(0x3f410bcc,0x93a6c41e),
+ LL(0x6b1fb104,0xaea8d055),LL(0x31fe146f,0x2ff339a4),LL(0xcf63c413,0x3d7ef85b),LL(0x289a097b,0x1f0f57c5), LL(0x5bda1160,0x82f2f83b),LL(0x6fea66e8,0x433eea4d),LL(0xcae11651,0x1f3fff4f),LL(0x6b1c243b,0xfa71c3fd),
+ LL(0x674832a4,0x59f36add),LL(0x2891e4e6,0x7b6d3802),LL(0x084fa3c6,0x47b313bc),LL(0x6584c9c0,0x90003ac6), LL(0xbc802849,0x9718c2dd),LL(0x2870ca08,0x9a5a2698),LL(0xcf68f352,0xb5cfe625),LL(0x6e6b0caa,0x90d0e2ed),
+ LL(0xba64d50b,0xb30780c3),LL(0x7acb4fca,0x16328345),LL(0x84b258de,0xf64e01fd),LL(0x35dcd2f1,0x2a25873e), LL(0xce4b39da,0x36606813),LL(0xa69a93e3,0x5285c91e),LL(0xdcb501d6,0x4da13aaa),LL(0x52e3dc24,0xb90d0a52),
+ LL(0x60a57d0f,0x6882d15e),LL(0x167612fe,0x52142caf),LL(0x463d39cc,0x532ccfb1),LL(0xe5a969f3,0xcdecde85), LL(0xd1bc4480,0xa89c1d1d),LL(0x83f32199,0x9373f362),LL(0x6d653c44,0x42f3493d),LL(0x6c80e27e,0xa867e4db),
+ LL(0x5cb7623d,0x954fbd83),LL(0x0b83d55c,0xba8b3007),LL(0xe2b23256,0x71946b92),LL(0xfaf95492,0xe0a2a7bf), LL(0x4e0c81ef,0x32ed3d91),LL(0x46f058d6,0xb8c8b14c),LL(0x67221924,0xc76c917f),LL(0x2ddf3cd4,0xd26c1d51),
+ LL(0x4fc9b14a,0x184e1395),LL(0xc1969b8b,0x651a0c29),LL(0xc9d5bf9c,0x05687179),LL(0xebcd85b6,0xb2f18ed1), LL(0xe446f1ef,0x8b662764),LL(0x71699f5a,0x6c0e051e),LL(0x27d93da8,0xf94a1151),LL(0xa05fe7a4,0x751235c6),
+ LL(0x624e9ae2,0x40aaf88f),LL(0xf5f6e5c5,0x6499b3f5),LL(0x98157f61,0x01fb0b8e),LL(0x33827220,0x070438f3), LL(0x50ab0b43,0x7409012f),LL(0x63c50e65,0xdbbba563),LL(0xc0d084ad,0x6b572ca3),LL(0x7b76cd6c,0xf10f6684),
+ LL(0x0c34363b,0x32bcca97),LL(0xb40e8157,0x7a9cef10),LL(0x6eaec234,0x3d5ffc51),LL(0x5f23d481,0x7d7b41a5), LL(0xeecdfe73,0xe5276c22),LL(0x8ac8c30d,0xa9b2725b),LL(0xed0c743b,0xee449588),LL(0x48df73b7,0x6d3b82a3),
+ LL(0x023cb0df,0xcb52edc2),LL(0xd5a24591,0x08773a4d),LL(0xe12a9072,0x0d9a6aaa),LL(0x5bf5586e,0x4261f56f), LL(0x60a08106,0x184b0402),LL(0xb09cfa61,0x1b398053),LL(0xd5dae483,0xdf7f55b1),LL(0x86ef2cde,0x9554210e),
+},
+/* digit=12 base_pwr=2^84 */
+{
+ LL(0x9204db30,0x564d6e85),LL(0x2aa84cdf,0x139bb928),LL(0x88476456,0x9413d7ea),LL(0x5a1ffa66,0x5c554483), LL(0x2ed18080,0x7b863089),LL(0xd14e5daf,0x589aaf20),LL(0x7b5f81ca,0xeee4f96f),LL(0x1bb0b415,0x88d47007),
+ LL(0x55c9bd11,0x1bb400d3),LL(0x06fc2851,0x8402465c),LL(0x65063b3e,0xa81ba22d),LL(0x6e1aa0c6,0xbab2dcbc), LL(0xbe645e25,0xe5f43f1a),LL(0x4df84be1,0x62320533),LL(0x21a2eaf4,0x14ac7080),LL(0x58beb26f,0x3f946464),
+ LL(0x7a82d20f,0x5f2a3e9a),LL(0x191011f2,0x399e015c),LL(0x886ac8e6,0xfbec312a),LL(0xeda47f96,0x0dd5140a), LL(0x26b47318,0x0d4df313),LL(0xe6685ec8,0xe2c9ec78),LL(0xcd8442cd,0x4df119ae),LL(0x7b32a1cf,0xdb1ca955),
+ LL(0x126506cc,0x7e2c5852),LL(0x08b3567d,0xba94aac7),LL(0xc05a3f24,0x6905cdf4),LL(0x3547f8b3,0xbf5f559b), LL(0xaade7a1d,0x9e4b4e62),LL(0x1fda3088,0x56b8b9d6),LL(0x4c43d89f,0xea3eb4c6),LL(0x9c69e047,0xfb7e537c),
+ LL(0xdfe5f6ab,0xc23d9491),LL(0xc1a9c0af,0x42fc362d),LL(0x127d2b35,0x04170b01),LL(0x04116aeb,0x4f0f17bc), LL(0xc9184cf6,0x716c01df),LL(0x895ceae7,0x914dc877),LL(0x390bff2e,0x696b2ae8),LL(0xf88af5db,0xf6ccd628),
+ LL(0x0f88095a,0xdada9bb9),LL(0x919ce305,0x7155c28f),LL(0x6d78b266,0x32a01e47),LL(0xb652c4f8,0x6da94459), LL(0x827ea8ef,0xa31783a6),LL(0xbdb1af2b,0x4d69b7c6),LL(0xaf31dab9,0x2874eb38),LL(0xafd9bace,0xa0ed9910),
+ LL(0x4037f17e,0x7d892e3a),LL(0x5f91a4fa,0x81fa9841),LL(0x961cf02f,0x17c7292d),LL(0x388bcc75,0x35af0c0e), LL(0x127a29b0,0x340bec90),LL(0x3d087445,0x955714a4),LL(0xa587c273,0xfd430880),LL(0xd24dfda2,0x715ecd50),
+ LL(0xaafd6cef,0x4ade066d),LL(0xf8c1decc,0xce59c8de),LL(0x77b96ece,0x3e12a24a),LL(0x44cc710c,0xee7c32fc), LL(0x240e9bb7,0x70700e4f),LL(0x6a63b06e,0x837ada54),LL(0xd19644ee,0xa58ce980),LL(0x27e7451c,0xcaa5d14d),
+ LL(0x387272fc,0x8e78d2ed),LL(0xfd8a0f13,0x9163a377),LL(0x635c55f0,0x858436bd),LL(0x5ba5b0eb,0x0a414f9b), LL(0x7d7383b1,0x2b58373a),LL(0x6030a376,0x5e7b9d36),LL(0x543514ef,0x9c69af86),LL(0x26080ff3,0x044698cc),
+ LL(0xa2e23074,0x76f54954),LL(0x17526081,0x90393264),LL(0xf3b78a50,0x0d095055),LL(0x69d8b26d,0x1f3a3776), LL(0xf5e7c8fb,0x0575e3bb),LL(0xee40b0c5,0xee7dd406),LL(0x55dab556,0xe6522e5d),LL(0xb61cd918,0x2d1b5709),
+ LL(0x01400b8d,0x0ea9278e),LL(0x6464f584,0x9552e745),LL(0x12fc094f,0x67f5645b),LL(0xde303128,0x77c40f3c), LL(0x0e3f3381,0x16d7e9a5),LL(0x59947693,0x017795ab),LL(0x9222eaf5,0xb69b5708),LL(0x1b77f122,0x61b213e0),
+ LL(0xdc8db00e,0xa7cc8bbf),LL(0x3aa7fc1f,0x1c51f5e4),LL(0xb4ac2d0c,0xb85b782e),LL(0x0468e5ea,0x32fde94b), LL(0x7f7ff0a9,0x8ad5b9a2),LL(0x8fdbb3f9,0xcd26f418),LL(0x6ebf89db,0x853bc95d),LL(0xa066b849,0x1da0a323),
+ LL(0x4bce0fa7,0xc4cc7aab),LL(0x6bc940f1,0xd4a05b69),LL(0x392dbd11,0xc77300e6),LL(0x21f70aae,0x0dc2eac6), LL(0x4b2ad7e0,0x9d4b513b),LL(0xa6daee1d,0x19822167),LL(0x69b98eee,0x7d71d202),LL(0x35f3f150,0xdfd435dc),
+ LL(0xddfd45ed,0x66d46ad3),LL(0xe50a2f01,0xf0325189),LL(0x3ec5683d,0xe19b9500),LL(0x91dd97e9,0xc46ab0a2), LL(0xed682c4a,0x74c971d7),LL(0xa14da289,0xafedac2d),LL(0xe39ba740,0xd17838fe),LL(0x053536bc,0xeb497bca),
+ LL(0xde6d4c38,0x551ba4ca),LL(0x4f52298b,0xa67be247),LL(0x9a5b40a8,0x98413188),LL(0xbb0acfb5,0x083a26aa), LL(0x11d16ebb,0x4929ff5e),LL(0xa942ae7e,0x91f08b63),LL(0x876663ec,0xaa428ef3),LL(0x1e97cbb2,0xfaabd309),
+ LL(0xf1edd62f,0xca0ed50c),LL(0xd29f48d9,0xc3c7ae6f),LL(0x8a72ae88,0xff47bf28),LL(0x348c6666,0x584ddfe5), LL(0x36731fdf,0x271137e9),LL(0x88d98bc8,0x714bc7db),LL(0x0da6be30,0xcea912c1),LL(0xbe62d6a5,0x91cb844d),
+ LL(0xec027bfa,0xe16ca42a),LL(0x17603e76,0x0c88f701),LL(0x63d5a31a,0x799418e3),LL(0xebb063f6,0x033bb53b), LL(0x625d3909,0xbcd05461),LL(0x85f23129,0x2d7b7868),LL(0x95090997,0x23b07887),LL(0x18d2c218,0x216c08ae),
+ LL(0xeebdbcf9,0xe1ccb6c1),LL(0xe873842e,0x89ca4552),LL(0x3c2fcdd5,0x4837f137),LL(0x108a8c0a,0x805874e8), LL(0x3d442fa7,0xe7e524f4),LL(0xf8131f8a,0x580d82be),LL(0x93d3d50f,0x6dcb7d27),LL(0xb5b39168,0x51207d3e),
+ LL(0x09110fe9,0x9a3ce117),LL(0x48721d93,0x8f3c6e4f),LL(0x87bdfa61,0x60a62b48),LL(0x7c01d84a,0x086dac65), LL(0x53841493,0x4af7878c),LL(0xb3bd5aa1,0x3b1a8935),LL(0x902e5686,0x65c8445b),LL(0x2e3b1822,0xde16cfa5),
+ LL(0x0a3e3684,0x19879e78),LL(0xee249180,0xec553912),LL(0xf8f4c1ee,0x8eb73fae),LL(0xb81fd20d,0xdee59877), LL(0x20b5ece3,0x2452e63f),LL(0xb632dddb,0x17be9422),LL(0x94311e6d,0x01f89220),LL(0xa332f84f,0x8f0fe052),
+ LL(0x1b9784d5,0x59657aab),LL(0xd8a7f347,0x6f2ce032),LL(0x6b95e6e9,0x84247793),LL(0x4395b044,0x34301cf4), LL(0xf7fb5401,0x98ebfd98),LL(0xfcdb31a4,0x14fd494b),LL(0xf90e0481,0x042f89d8),LL(0x4134ab52,0x6b90a008),
+ LL(0x7fe2ffec,0x8fa22555),LL(0xa778448f,0xc6dc3d32),LL(0x85f45aad,0x4886fedb),LL(0x51704d0c,0x5bdef90e), LL(0xe2d1fdaf,0x46ad596d),LL(0x04126f0d,0x914e0090),LL(0xaef960a6,0x71aaeb18),LL(0xac77472c,0x8f4601e5),
+ LL(0xd8d9768c,0x42e5a186),LL(0x00f6004f,0x8cbf3a6c),LL(0xc1ddebdc,0x9d4bf5ac),LL(0xa9c066fb,0x13354792), LL(0x923fe808,0x72e0b81c),LL(0xc526d6e4,0x1e73b868),LL(0xa81f1e24,0x3f7bedc6),LL(0xe920ba24,0xed1ff363),
+ LL(0x659604c5,0x58234c89),LL(0xce4b0872,0xa6a421ad),LL(0xcc19578f,0x5dc8848a),LL(0x4f28bdfc,0xfcb418d0), LL(0x8d6442f5,0xf2e74820),LL(0x4dcf6378,0x0c481d85),LL(0x4556438b,0x4987d1a6),LL(0x3157c6be,0x76359363),
+ LL(0x1c1dceef,0x29bbf3b7),LL(0x576f1dbd,0x0995c340),LL(0x8fa61304,0x0405db3d),LL(0xcc7d345e,0x63438f3d), LL(0x942120e5,0x688174dd),LL(0xcd70c93c,0xc7dd05bd),LL(0x5e871ae0,0xdc8a32dc),LL(0x6178647a,0x1a7896b9),
+ LL(0x59c437e3,0x1fc3f7a2),LL(0x24235e5e,0x737de2e3),LL(0x7a5eaabd,0x589a56e3),LL(0xcca140f3,0x5a79da8e), LL(0xa12463fa,0x3d8b0d82),LL(0x0875daf5,0x63fc83d8),LL(0xbd9211f7,0x42a30803),LL(0x32d3935f,0x62f6167f),
+ LL(0x6f269922,0x70cd6467),LL(0x96163b47,0xf694ca21),LL(0x5f5ba669,0xf3bafb2d),LL(0xb8ed8333,0xcf7cf341), LL(0x9997edc2,0x34b2022d),LL(0x309c6508,0x57e6f4b5),LL(0x64841008,0xf6fbf864),LL(0xed075d44,0xbc9821f5),
+ LL(0xf37cc6b7,0x78c80f73),LL(0x6ab88fc2,0x41d28626),LL(0x58ca26fc,0x2126981c),LL(0xbe3dbf87,0x7a956c64), LL(0xce0ce9f3,0x2f41e27d),LL(0xf4c98e5b,0x0cb49ae0),LL(0xcace473e,0xba6224a6),LL(0x393e092f,0x25dddbc0),
+ LL(0xa4fb974d,0x747daf46),LL(0xc76dbe2e,0xfb775fe7),LL(0x9670c22e,0xb7b3ad6d),LL(0x10a380bc,0xc6580b23), LL(0x92087c3d,0x4ea226f5),LL(0xb53aa3c7,0xe67c379f),LL(0x991c3c9b,0x4133f831),LL(0x4fa0dd18,0x80f9e5bd),
+ LL(0xc6f80fb4,0x0094e7c6),LL(0x351bebd3,0x16e99ebc),LL(0xaae16a6f,0xc555ed44),LL(0x2f6367eb,0xe9d2846f), LL(0x83d46d0f,0xb34c93d0),LL(0x894fadc6,0xc0cb137a),LL(0xab31f937,0x21e289f8),LL(0x1bc72a35,0xac5e0516),
+ LL(0xf3d4db0d,0x6221871b),LL(0xa039826c,0x72d1fdce),LL(0x668c8022,0x69d9cc8b),LL(0xfee064ff,0x0bf359ce), LL(0xe8d16f19,0xb8e636b7),LL(0x443160ac,0xde88f403),LL(0x032836ee,0x4228177a),LL(0xe9801d86,0xee8fac37),
+ LL(0x4626e343,0x496c9363),LL(0xf4e4c8fa,0xf6999578),LL(0xb8648a06,0xce7306f6),LL(0xae7996e5,0xe2775c8c), LL(0xbf09d221,0x7b47e678),LL(0x515c2ace,0xf5251e1e),LL(0x77b48b41,0x087f9121),LL(0xeb38d74b,0xc40e7725),
+ LL(0xce95134a,0x1d559f4a),LL(0x320c8bc6,0x1048a1bc),LL(0xe3085f1b,0xad2ddaf8),LL(0x0ad35636,0xf1cfc4cb), LL(0x57db1e96,0x2bd8d4fb),LL(0xe1976ab7,0xd1813026),LL(0x15867022,0xa80e501c),LL(0x01f68017,0xecaf1497),
+ LL(0x48ab68b7,0xd82c5e79),LL(0x204d2962,0xa0f117e4),LL(0x7dedbf05,0x99b3bda1),LL(0x52786ecd,0xb872dbff), LL(0x57592d3c,0x56253c32),LL(0x4d570c07,0x495fbb05),LL(0xfaecad3e,0x073c49cb),LL(0xb46bad46,0xec8c1f57),
+ LL(0xce3b07c7,0x13800a76),LL(0x0ffaec55,0x9bbf87d7),LL(0xaf2426c3,0xf69a9ee3),LL(0x2fd70c22,0x2d0c201f), LL(0xc42bb661,0x957e5be1),LL(0x1dc771df,0x3e6ae19d),LL(0xe3cfafa7,0x60af970d),LL(0x5ebd1883,0x721ce869),
+ LL(0xb87d0ede,0xab0a80a5),LL(0x2954a3e3,0x33576f02),LL(0xc413fc00,0xcc2fe8c0),LL(0xeb86a18b,0x5ae762bd), LL(0x3fe6c6dc,0xbc309dde),LL(0xbf0d1eb5,0xb4f9d001),LL(0xd4fa748c,0xf3f3c5b9),LL(0x2ca78fdd,0x78e8867f),
+ LL(0xcdf1624b,0x8f85f872),LL(0xa7db0248,0xfdce003b),LL(0x1ad9866b,0x0ad33ef7),LL(0x296248a4,0x27d12937), LL(0xc99c656a,0x23bf35eb),LL(0x17753ace,0xcfb64da2),LL(0x6fbf7969,0x8bc0e741),LL(0xe719cff9,0x131018ef),
+ LL(0xd1c02b67,0x98f4ef66),LL(0x1f81f578,0xe8aa6cdb),LL(0x159469de,0xa6f97fb3),LL(0xe3906d9e,0xf8e834cd), LL(0x71bbd3d1,0x33ccda6d),LL(0xf952c038,0xeac76a4a),LL(0xe5b53383,0x2891eaa0),LL(0xedcf6de7,0xd629dbdd),
+ LL(0xa3fb0fa1,0x4af093cd),LL(0x0d1ea294,0x130fd057),LL(0xb57747bf,0xb553cb13),LL(0x024e856b,0x107c0f0e), LL(0xbd631fef,0xfd63a2ff),LL(0x12c01222,0x8df62ec2),LL(0xc0af11a9,0xacbce197),LL(0x5c4922b5,0x35fa3e80),
+ LL(0xc3de57ba,0xbc257ccf),LL(0x293ad2df,0xb481ca1c),LL(0x2058e222,0xb123f3bb),LL(0xefe46989,0x219cde82), LL(0xe9a316da,0x58ac87b8),LL(0xd4d25c91,0xa8294237),LL(0x62d14158,0xb54dad88),LL(0xb3da2a84,0x9250885f),
+ LL(0xd54776bd,0xb4e3bedf),LL(0x78043ee5,0x81a4c582),LL(0x4eb87133,0x279a0963),LL(0xf2bfdb52,0x827d333c), LL(0xed71e119,0x3601c6d1),LL(0x0d64df1d,0x3d9b1772),LL(0x3fa3c40e,0x2f5bcc09),LL(0x8e26aef5,0x74b7b30d),
+ LL(0x3d3ac848,0x98fd949b),LL(0x92e259f1,0xd99e99d0),LL(0x8d353c77,0x34404265),LL(0x4d8dfb1f,0xffc05a7d), LL(0x4e9d92c9,0xbaf2f471),LL(0x5ea9cef3,0xf354f8b2),LL(0xb8b2c8a0,0xf2be0fea),LL(0xfbce308f,0xa392d3e3),
+ LL(0x02619258,0x58cd793d),LL(0xfea6eacc,0x16a8c9e7),LL(0xb90f9cb5,0x3fcae1ed),LL(0xd59bc4ce,0x1df76d07), LL(0x8574a3ce,0x39248217),LL(0x03b6e82e,0x9d0df2b7),LL(0x33206733,0x64227c0f),LL(0xb342da7d,0xb909614f),
+ LL(0xb8e15a20,0xe46e977f),LL(0x744eaa18,0xdf2aa89d),LL(0x7ff12f89,0xa40b36b7),LL(0x86b0e7d4,0xbf7ed788), LL(0x9e044a5b,0x35930c5c),LL(0x4ac6b8a0,0x599cfa2b),LL(0xa8f06839,0x68f5f40d),LL(0xe8a1b9d5,0xe838649b),
+ LL(0xdd45feda,0x2e3c91a9),LL(0x58de0625,0x5f73aa38),LL(0x7535cddc,0xcc2b2397),LL(0xca7825fa,0x60e69d0b), LL(0x62424bd7,0x8f1a95c4),LL(0xf6f21e23,0x5e175a13),LL(0x4fa48b20,0x594e5b82),LL(0x9b14fed3,0x2bfed204),
+ LL(0x74484bc3,0x87c925fc),LL(0x5639abc5,0x052b634f),LL(0x290426dc,0x169549b6),LL(0xdaaefd38,0xfe515a22), LL(0xb4d87ccb,0x8a63a39c),LL(0x4034acdc,0x3dec5f62),LL(0x61090db0,0x59969d81),LL(0xf157248d,0xb089b8f7),
+ LL(0x9d59a29f,0x42b0ca54),LL(0x9be7ee82,0x522b3e3e),LL(0xac166a7e,0x894aade2),LL(0x9184ec33,0x57aaf19a), LL(0x5e50711a,0x84406a11),LL(0x1614f8d3,0x0cafd148),LL(0x3f7d19f8,0xc6174fdc),LL(0xff4958be,0xca5bed9a),
+ LL(0xe4fdd396,0x8dc18aaa),LL(0xd371c3f4,0xf6e8a9ee),LL(0xa5dfefde,0xc6b58042),LL(0xfc4f3577,0xccc3bbb6), LL(0xdedfdd55,0x9f583e4a),LL(0xb48c5fb2,0x9ea45133),LL(0x232d61e0,0xca2b3229),LL(0xb0b5cb38,0x642101a8),
+ LL(0xa9ebda1a,0x0cfac5fc),LL(0xd2dc9c7c,0x02398bd6),LL(0x80591234,0xd95511d9),LL(0xe8230901,0x0e5cc99c), LL(0x140eaba1,0x943350f6),LL(0xe0623c93,0x9fe19108),LL(0xd74e189b,0x052bf5d9),LL(0x40cd7173,0x3e341bff),
+ LL(0xcb7d384d,0x89b5b355),LL(0x50b76f18,0xedee32da),LL(0x5804d9df,0x6a9cfb19),LL(0x376fc2d8,0xccf638f8), LL(0xe14de014,0xebdce7a5),LL(0x7f606fa5,0x0135085f),LL(0x69b58c3b,0xf8a3de5f),LL(0x59ca19d1,0xbaa80445),
+ LL(0x0ce7238d,0x3252147d),LL(0xd57bc36f,0xd446960b),LL(0xb275f5ca,0x9b1743ce),LL(0x27629de8,0xda048c48), LL(0xd3bbac67,0x005354db),LL(0x1ba1facc,0x62c392fb),LL(0xa18da892,0xb066bfae),LL(0x367a8320,0xdb090711),
+ LL(0x6f90249a,0xbb7092e2),LL(0xe22da86b,0x6de14155),LL(0xb38d4ad8,0xe16136d3),LL(0xd0fbb940,0x9deaa5c9), LL(0xaacf50e3,0x54a54ba3),LL(0xb9ba4570,0x66e5645a),LL(0x48cb742a,0x77e28d94),LL(0xed98a2c9,0xc795b138),
+ LL(0x1daa17ee,0x899331f6),LL(0x4a77734f,0xac950653),LL(0x71f3e3b6,0xd7f6304f),LL(0x65fc119c,0xe7256955), LL(0xbe527794,0x3e60a04c),LL(0x7c578fb0,0xdaf53be4),LL(0xebc0754b,0xf785a4f8),LL(0xde1b78b4,0x8b21b116),
+ LL(0x62fb1c56,0xfe47e04f),LL(0x229f1017,0x8a92f9e6),LL(0x68b7842c,0x2d73dd23),LL(0xa56dbc4f,0x3b43f7dc), LL(0xd0f3f4ca,0x9435defe),LL(0x500594e3,0xdabfb1ba),LL(0x428f5ead,0x70e929e8),LL(0xbdc7716e,0x44adf585),
+ LL(0x02204867,0x7b7ff077),LL(0x0c78476c,0xf2f306be),LL(0x7e783793,0x48849fd5),LL(0xaf77e3c7,0xc2dc3c7d), LL(0xa980cdf6,0x5eb2b691),LL(0x204e25df,0x7ca7b7a4),LL(0xc5070eab,0x1e7c2f82),LL(0x4eb7cd3b,0x32ca4b36),
+ LL(0xf94ad1ab,0x38ffde8f),LL(0x59921b25,0xb4757ae1),LL(0xb4d2f624,0x856cd3f3),LL(0x1eb40708,0x90593929), LL(0x1193b3e4,0xffc4b89a),LL(0xbd2f804f,0x6afba7a8),LL(0x69dc21ed,0x72aabbaa),LL(0xe7fb6de1,0x5d1da32e),
+ LL(0x98d1e26b,0x56c0f440),LL(0xf7cc7d6c,0x9456a6c3),LL(0x14f2f24d,0x9eb0aebb),LL(0x7dd788a5,0x51d7c699), LL(0x46a22e97,0x053b8098),LL(0x8c025be8,0x27d8ea2a),LL(0x10d5afaa,0xe0bd464a),LL(0xe7cf120c,0x137c452d),
+ LL(0xd091397b,0xd06bd227),LL(0x21bc796f,0x4b307bf3),LL(0x7f5a37b0,0x701eaf3a),LL(0xac7d4718,0x8d5a0f61), LL(0xed8b1a37,0x0cf9eea3),LL(0x2aa9061c,0x10854f10),LL(0xa30eb4e6,0x0aaf430c),LL(0x2a050dfb,0xb74342f5),
+ LL(0x20e1899f,0x2feee9d7),LL(0xf2a1dbfc,0x49464a8e),LL(0x5762d68e,0x4d7cf25e),LL(0x7bf43462,0xe7b6e759), LL(0x79daf6e0,0x71fce284),LL(0x03858705,0x2d3ff71f),LL(0xbc4af4e6,0x07d8d288),LL(0x18f1c7d4,0x6777d197),
+ LL(0x0e85f036,0xb5770041),LL(0x4c8d9768,0xe1bb263e),LL(0xe3917798,0x4fcc1d44),LL(0x07abcde4,0x274d1d90), LL(0xb7a10472,0xc9b8ae9f),LL(0x8d10e8ec,0x6632e3be),LL(0x50f3a172,0xb6876fb0),LL(0xb4cf4867,0x753692d4),
+ LL(0x58e598f7,0xfe3624e6),LL(0x6d81fb40,0x15f90418),LL(0x9bea3649,0xae762f7b),LL(0x161e85cb,0xc48d2262), LL(0xcf5a21f0,0x8e8726a1),LL(0xa1f6653b,0x536c441f),LL(0x67ec5b86,0x0716bad0),LL(0xb2147d1f,0xa423a957),
+ LL(0xdca2e393,0x8eec96c8),LL(0x2843ef12,0x3619e36d),LL(0x2ef695e1,0xdc16fe2d),LL(0xffea8124,0x04ed2cad), LL(0x180ce636,0x5018a0ce),LL(0xdce7b2f8,0xc34b0bbf),LL(0x0c54fc30,0x645a02a9),LL(0xf3f819d9,0x6ee6772b),
+ LL(0x7cecded6,0xe2bbbdcd),LL(0x3f038851,0x9ae4fd55),LL(0xa2f316c7,0xc30664ab),LL(0x63ffb50a,0x3cccf4a1), LL(0xd00fb8f2,0xc37ee6ca),LL(0xad906eb1,0x593db6d5),LL(0x4aa84505,0x8f75b594),LL(0x9e5939f0,0xeff39d82),
+ LL(0xc064f530,0x4b7fab3c),LL(0xde175892,0x731153ae),LL(0x3d4c4e60,0x335e6503),LL(0x776ce13a,0xb0876a8a), LL(0x22241ecd,0xa8a566ee),LL(0x011e861c,0xb7456b3e),LL(0x177dd490,0xa9aff4eb),LL(0xc8f77c40,0x189b1ed9),
+},
+/* digit=13 base_pwr=2^91 */
+{
+ LL(0x2857a1fc,0x624de687),LL(0x2ff8f505,0xbd0a0d9c),LL(0xc381bc9a,0xeecb4fad),LL(0xfa94e41b,0x72386292), LL(0xe75fc753,0x354d3f83),LL(0xa7a5a6bf,0x06afc753),LL(0xb2f568dc,0x1ce792ee),LL(0xbd2f9647,0xc5faaee3),
+ LL(0xf912b74f,0x175fbeb0),LL(0x6e0ceedd,0x45fbe8e1),LL(0xd9233ee7,0xf0e1aa68),LL(0x406a626e,0xe55fc1ce), LL(0xe08712e7,0x20efa1b9),LL(0xbcfd6360,0x5fd108b5),LL(0xeec1edac,0xea431df6),LL(0x940803f1,0xae1c0521),
+ LL(0x15407ffe,0x584a16d0),LL(0x08a82a69,0xa977f702),LL(0x67f8a198,0x52eefecf),LL(0x19f7a7e0,0xec213738), LL(0x35987b9a,0x6795cfef),LL(0x97028480,0xb243403b),LL(0x9c1b9124,0xac24b12b),LL(0xa90f8aeb,0x1f379501),
+ LL(0x64bc0f09,0xa8e97fb6),LL(0xc953cd08,0x0b913991),LL(0x7fc3bf00,0x8385a1b3),LL(0xb09ccd8f,0xb6e74dec), LL(0xec473ea7,0x6e1df026),LL(0x530766bd,0xf2f7fbbe),LL(0x3292052b,0xf18cb47a),LL(0x9114866a,0x7f8d4592),
+ LL(0x8bfa2c22,0xf0a1c565),LL(0x2b326c0e,0xc28518c3),LL(0xec107d66,0xabafc6f0),LL(0x8478907a,0xbc7a6abf), LL(0xa2920288,0x8c1c8f6a),LL(0x930c043e,0x6c87579d),LL(0xb309696d,0x25ee808d),LL(0xb7a71041,0x433bbbda),
+ LL(0xb3086691,0x48d6d957),LL(0x26640916,0x9946a29b),LL(0x43db59a9,0x932ca93c),LL(0xe4fe91ba,0xaa61a0c5), LL(0x815bf003,0x9e22e112),LL(0xc86ba8d3,0xa9ed1b18),LL(0x1069f434,0x1b5d3c14),LL(0x1cc01754,0x3cd2ebd0),
+ LL(0x3350f670,0x5c06b244),LL(0xf6f9c751,0x7557dc9d),LL(0xde66fd97,0xa7ebd3b8),LL(0x2befe6fe,0xc126dbaa), LL(0x396f434a,0x312f4897),LL(0x61a4124d,0xe05cfcd6),LL(0x1525c05e,0xc83b8688),LL(0x11899f64,0x4646dbf2),
+ LL(0x8e419e08,0x2b7507cb),LL(0xaf855eec,0x785328d7),LL(0x7b8683a5,0x875db0c7),LL(0x90a597e9,0x3d1bc968), LL(0x47eeeab4,0x7d4afa10),LL(0xd680ca71,0x2668dd43),LL(0x17365023,0xc3210d1f),LL(0x17fb31cc,0xd5bb2ee4),
+ LL(0x08e9ba09,0xbefb6a4f),LL(0xb0c1b6e1,0xc6beedb8),LL(0x3510ef35,0x59daf057),LL(0xdbbabc65,0x604047cf), LL(0xa06b7340,0xfabc80a8),LL(0xdf765977,0x7433dee7),LL(0xfd807cfb,0x149a2c4a),LL(0x3480a086,0x14e8ad3b),
+ LL(0xb22c5f89,0xb0c3156f),LL(0xbf78675a,0xd10ece4a),LL(0x80b8ad9f,0xe270e317),LL(0xb0c2b420,0xfe7a6210), LL(0x125ef635,0xf091d738),LL(0xc1a6f202,0xf1f277d6),LL(0x3587d9bb,0xe2727e7b),LL(0xb3e2b84b,0x83b209a9),
+ LL(0x7a13effa,0xc9eb445d),LL(0x0d697480,0x89b856f1),LL(0x25c03cb7,0x834bbae2),LL(0xe0b4a7b2,0x0d8adb85), LL(0xc7fbc240,0x7b6884af),LL(0xaa4f9097,0x6b485409),LL(0x290c106f,0x4d0a367f),LL(0x3f0efdfd,0xab87d218),
+ LL(0x50f2b65b,0x15b9bab7),LL(0x5e5d53e4,0xa7403d4b),LL(0x28529212,0x2e23e376),LL(0x6e050767,0x6fe903a2), LL(0x6cf570fb,0x4c5291a1),LL(0x7a30b326,0x4bfb8607),LL(0x27c572a9,0xec4905f8),LL(0x0f381c31,0x72eeb8c9),
+ LL(0x460adca0,0x33346cec),LL(0x7b34756a,0xd4d5bba8),LL(0xeac84add,0x02b2e2d4),LL(0xdc1053b5,0xa129845b), LL(0xdca6f9ce,0x53f067e0),LL(0x3526aba6,0x6e9998ed),LL(0x1c0982da,0xa4aef9e2),LL(0x93f5d96f,0xfe5b606e),
+ LL(0x9c14b699,0x26b8502e),LL(0x0948a291,0xf1bcdca6),LL(0x2aefd415,0x73e43a32),LL(0xd1e2cfb5,0x7f523357), LL(0x97d3fa94,0xa60151c0),LL(0x72129630,0x820c0d58),LL(0x5854acf5,0xb8f2e1ed),LL(0x3c656ac3,0x86d6646c),
+ LL(0xbef1d0da,0x2284a612),LL(0xa8c8faba,0x2e7c5f4e),LL(0x70303ea3,0xfd441ae7),LL(0x5161cf82,0x9613f329), LL(0x2e19531f,0x65a3cc65),LL(0x34281f69,0x177a2775),LL(0x7c82e094,0x0cc692a4),LL(0xb6f377f0,0x9d62a55b),
+ LL(0xf96ec2b8,0xa24cf6ac),LL(0xa961cc16,0xd06747c3),LL(0xbd17f0a2,0x57c7001c),LL(0x34afe2d6,0x5f298db0), LL(0xdf12f671,0x51b01ef2),LL(0x5ce712fe,0xc01c5066),LL(0x92a74776,0xac0f4034),LL(0x08d696bd,0xa3e9934f),
+ LL(0xe7daaff8,0xafb6981a),LL(0x73bdcafc,0x5f8998d9),LL(0xbaf9906c,0x23ec39e1),LL(0xc999c9c0,0x5e248410), LL(0x17dad895,0xd14c7a89),LL(0xcbb3f6b9,0xfde9d01a),LL(0x5f698f1b,0x1d6b26ef),LL(0xf0baff97,0xc6495cd1),
+ LL(0x587674ec,0x5a72dc07),LL(0xdb09cd65,0x100f9ff0),LL(0xb30cf6e6,0xec0fb71f),LL(0x81066143,0xf54cb597), LL(0x633857c4,0x0090e997),LL(0xda92c5d2,0x7326ed15),LL(0x47c56e86,0x794cd8af),LL(0xf89214c9,0xb272112f),
+ LL(0x3445879d,0x37960861),LL(0xf2fcfc55,0xc5e496b0),LL(0x6559e153,0xfe74e95f),LL(0x54a772af,0x1e18b2b5), LL(0x157c157c,0xd146980c),LL(0xa11d77b5,0x31ee3f25),LL(0x5707db6d,0x7762a07d),LL(0xbd2022b8,0x00804bcb),
+ LL(0xd571c59e,0xdf3f4658),LL(0xcf45c1ee,0xc49e7a34),LL(0x43972cff,0xf401ba3d),LL(0xe509c2b6,0x146d989c), LL(0xeb72392f,0x7c68d6c8),LL(0x0658b8e6,0xdd048de5),LL(0x9a0aeb72,0xc9dc61b7),LL(0xb741d644,0x98b080e0),
+ LL(0xb1c5982a,0xa6ec0eed),LL(0x5ebbc26f,0x58d28317),LL(0x33e5b7dc,0xac8f1e1e),LL(0x9d8f9fed,0x31e4f65e), LL(0x904ad76d,0x6c9af383),LL(0x9bdb0517,0xfc38c53c),LL(0x0e69f85e,0x9ae278ee),LL(0xefd9d887,0x18b362b7),
+ LL(0x5bbbd3ac,0x65a5f74b),LL(0x077bfb4f,0x41eb4593),LL(0x83b38100,0xb642934b),LL(0xac1a99bb,0x643ceed7), LL(0xee7cd5f7,0x9c27e66d),LL(0x6ddbaa6b,0x2ccf87d5),LL(0x447b1192,0xd51ca739),LL(0x95f5f142,0x78471053),
+ LL(0x3a650829,0x915f50cd),LL(0x898a6a1c,0xe032bdc5),LL(0x2d15959f,0xde8fb4f1),LL(0xbad56140,0x1fc5fc73), LL(0x8e60c3c3,0xdafbf206),LL(0xe428adb5,0x4963dc95),LL(0xd49584fb,0x1538e081),LL(0xbc0e5fa9,0xb34add66),
+ LL(0xa7f28b2f,0x404ecf12),LL(0x7fa9c435,0x6ddc3ce1),LL(0x61ee755e,0xda887e3f),LL(0x8f71280a,0x4b5da661), LL(0xdc79a4cd,0xee5a86df),LL(0x99be4d36,0xd8514b8a),LL(0xcc82c751,0x674793ea),LL(0x437aedcd,0xf3a2123a),
+ LL(0xfcd6f027,0xf825ff37),LL(0xa681a001,0x60a056d8),LL(0xaa92c135,0x92a39248),LL(0xdcd190a7,0x61884e23), LL(0x24cc911c,0xec0d1420),LL(0x5aa16ad7,0xbdb0baae),LL(0x8a1694d7,0xf12726b5),LL(0xc93673f9,0x8c7cf113),
+ LL(0x7f2edc38,0x02fb6c69),LL(0x2fbe8690,0xcc4d4304),LL(0xe89c80d5,0x405b2491),LL(0x3d938bc1,0xdef46c76), LL(0x2520e3b0,0xd92ec0fa),LL(0x1fe2dfda,0x2501cfa3),LL(0x1d5c8474,0xe7c5753d),LL(0xe6226dcf,0xc059abc0),
+ LL(0x55a9011d,0x2dceefe6),LL(0xbbbbef00,0x8799064a),LL(0x0b49b5ef,0x7fe944c2),LL(0x225b21dc,0x722bbef0), LL(0xd2bb14af,0x84687cbb),LL(0x9b6f6caf,0xfc4ab4f0),LL(0x2c146a52,0xb7b7bb59),LL(0x1dfea10b,0xb90d67f2),
+ LL(0x713e1d30,0xca4ca8c8),LL(0xf8a13db8,0x50cbb994),LL(0xa5b0e3e5,0x2bee12b2),LL(0xe71e19fb,0xa7c5d6d1), LL(0x9e0314cd,0x28442423),LL(0x66cda5c0,0xc95c2746),LL(0x1c5ffd19,0xfe52a79a),LL(0x38a0339f,0xb93875cc),
+ LL(0xb49fb049,0x6a94196c),LL(0xcc12a38d,0xbeb1eb4b),LL(0xf5e8d167,0xbc136771),LL(0xd5f8ae87,0xa91e1232), LL(0x95172460,0xb2e812c7),LL(0xb8f81870,0xc699d376),LL(0xa8900827,0x9e4a3b70),LL(0x506c0b29,0xe0d4b2f4),
+ LL(0x7246fd96,0x13b4d1c7),LL(0x33965581,0x84ea2158),LL(0x2e53c024,0x9b9f071b),LL(0x864a1b78,0xcb005908), LL(0x3f742c2f,0x03daddf5),LL(0xdf595911,0xd29230e5),LL(0xca0406a1,0x3f7d4e6b),LL(0xb1db7e47,0xeb646f66),
+ LL(0x590e3107,0xb896003e),LL(0xf754ac01,0x7a0dc361),LL(0xe63ab0ac,0xe877a6f3),LL(0xdf60d307,0xd43b54f3), LL(0x59cf0add,0x65ef91ba),LL(0x18990eb4,0x35e99393),LL(0x8e46fbf6,0xc186ab16),LL(0x8c1eaa91,0x4c0eb22f),
+ LL(0x1abd31f0,0x4599b894),LL(0x9a1da7d3,0xdb34198d),LL(0xa0f0217d,0xa8b89523),LL(0xe56b884e,0x2014cc43), LL(0x49efd4ee,0x6fb94f88),LL(0x287f4ae0,0xf1b81710),LL(0x99fd2deb,0x89d38a9a),LL(0x72b67a53,0x8179277a),
+ LL(0x1a03755b,0x0ef6ce56),LL(0xfcdb3469,0x8dc768f2),LL(0xa21d959d,0x0be58a91),LL(0x9b103cd0,0xea44861a), LL(0x808b8a46,0x332e86e7),LL(0x8772c3f8,0x9882015c),LL(0x9f4b5d29,0xe6b272fe),LL(0xa29b023b,0x0e183a28),
+ LL(0x2286ebf3,0xf2fab88f),LL(0xfce83e6f,0xb7532ced),LL(0xe0cde4fc,0x17999d7c),LL(0xc1b7668a,0x7230fd85), LL(0xef588309,0x97a57d39),LL(0xf906f6e7,0x7e175f28),LL(0x72b70bfe,0x51f67413),LL(0x2f82218c,0x2132f595),
+ LL(0x9d8727cb,0x9cc0746e),LL(0xbba1ec8e,0xa2af77fb),LL(0x31a67cc9,0xc75aee60),LL(0x57408325,0xaeab9e0f), LL(0xec34bb89,0xf24de697),LL(0x5d958bdf,0x06b90039),LL(0x0603d6cc,0x6f55222e),LL(0x2eb0b239,0x496537b5),
+ LL(0x8be08323,0x083e5889),LL(0xf8dc0a78,0xc573596e),LL(0xe8901eca,0xc3e988fa),LL(0x6e350257,0x7f7b48f6), LL(0xa216e329,0xed820567),LL(0x8ce989c1,0x55f46737),LL(0xeeab9441,0x7f48c5f1),LL(0x86fe0831,0x1d3cac11),
+ LL(0x408a0306,0xe0364bae),LL(0x7a4eb2cb,0xe8d8aba0),LL(0x1fd7d5da,0xe548725e),LL(0xed5ed958,0x8de04491), LL(0x61d73977,0x3e75eba2),LL(0x55420386,0x4f580400),LL(0xd859a690,0x54642fa4),LL(0x296e336e,0x2c905f7e),
+ LL(0x22e260bc,0x4e287e66),LL(0x4a28d5bd,0x71a2ec99),LL(0xa7c5c3e3,0x5528da21),LL(0xa49471e0,0xae9f6856), LL(0x587cd94f,0xdcd8e66b),LL(0x6c7b7db8,0x91afbd79),LL(0x067e3cdd,0xdf2e6625),LL(0xa6375f59,0x15b5a329),
+ LL(0xb6586c5f,0x3b8b3b1d),LL(0xd34f10fb,0xe4d50a77),LL(0x7c3c01f7,0x26cb86f5),LL(0x8c57e6f7,0x36e9d3cc), LL(0x62c6dbae,0xaa8e7ce1),LL(0x60d7fae5,0x7f6b7689),LL(0xc797ee16,0x519a7659),LL(0xb36a6b1b,0xa1c7b30e),
+ LL(0x74dff201,0x8da05ba6),LL(0x40d0a835,0xd2eac07f),LL(0x610a7d6f,0x2701eb31),LL(0xbf893c4f,0x5c17a91e), LL(0x6bc8b161,0x68b92e88),LL(0xf52e6ec0,0xa312fd5b),LL(0x6b7952cf,0xf7daf460),LL(0x18aeb57a,0x847f0cf3),
+ LL(0xb0146708,0x27b178ed),LL(0x54ca2aa5,0x85a23554),LL(0x395a7b16,0x80dd123c),LL(0x0058bfce,0x64a9337b), LL(0xf4addc4a,0xf6ae9380),LL(0x464536f1,0x0f84385a),LL(0x16534f6c,0x41fc2270),LL(0xb8795ec3,0x13d8976f),
+ LL(0x8e12c560,0x2e90b3e4),LL(0x239b2c58,0x242a86ec),LL(0x0768275c,0x6fb42ecc),LL(0xbd96de9e,0xee341cd0), LL(0x84355d11,0xfd1833ac),LL(0x5f55ec6c,0xf062392c),LL(0xfee33fba,0x6ee7b59b),LL(0xabf86e0f,0x8113f0ca),
+ LL(0xcc68033c,0x2285aaaf),LL(0x78430646,0x850b732b),LL(0x2b3fa03d,0x50fa4b61),LL(0x3caf050d,0x4d893ecc), LL(0x988df419,0x454764e6),LL(0xfb61f1a4,0x055d8a4b),LL(0x8475e07a,0x3b7c5f4b),LL(0xa6a228e4,0xf93a198b),
+ LL(0xec8d566a,0xe0a8ce61),LL(0xc55f4bd6,0xe41397d6),LL(0x654bdf55,0x4cc18d48),LL(0x9325ac25,0xe1b49f9e), LL(0x72c68871,0x79840752),LL(0x6d806fe8,0x8930d8b5),LL(0x0bd5f65e,0x11c8b5a8),LL(0xbf37d7a8,0xe931c025),
+ LL(0xae8af083,0x25b17fd9),LL(0xde4215ed,0xd589fd8b),LL(0x4b3f61fd,0x56378f04),LL(0x6bfb4f9a,0xf0f39213), LL(0xe906cc6a,0x6b0f9596),LL(0x096f8296,0x441f13da),LL(0x1e4940e0,0x08f933d4),LL(0x5a53e7ee,0x6c35391c),
+ LL(0x19c3d18e,0x5f41c4d3),LL(0x1d389d95,0xc0804e09),LL(0x18a5a3f2,0x7323a9ab),LL(0x410a6381,0x7b7c2475), LL(0xb02cfe18,0xd362eb9a),LL(0x553b2970,0x79ef3d0a),LL(0x3d2acdab,0x371f7760),LL(0x7f241dfd,0x6cd37890),
+ LL(0xdf4a28e4,0x592a242e),LL(0x1bb45217,0x1e623cdc),LL(0x494074d3,0x5a9633a6),LL(0xd52fbfd8,0x81b74307), LL(0xdec4c5ff,0x98292651),LL(0x3e0f6edf,0xe1b7bc86),LL(0x6bb8fb31,0x3d5fd86a),LL(0x1cf29f19,0xa830e9a2),
+ LL(0xcf69c747,0xfffc5482),LL(0xa83549fd,0x7748a0f4),LL(0xe7ccf4a6,0xba1c8a0d),LL(0xa2ede6b7,0x6cd1399a), LL(0x87bb90d9,0x8fb634e6),LL(0xc59a5304,0xfa8e659b),LL(0xa9122d95,0xcd6bfc75),LL(0xdfa6d75a,0xdb107def),
+ LL(0xcc27760a,0xb0ec4cfc),LL(0xbed3a1a1,0xf24c1e22),LL(0x819bffc7,0x4f8522a1),LL(0xa93d97e1,0x263c7b5b), LL(0xa4b4de49,0xab1d31e0),LL(0xebbfe8f5,0x374e968b),LL(0x51ca0d08,0xe82e9756),LL(0x7df3f2df,0xc05715a2),
+ LL(0x038004ad,0x941f02c5),LL(0xa0fd46d4,0xc136a2a5),LL(0x3d31d26c,0x85db7d24),LL(0xbfefeecc,0x05bba6af), LL(0x5a60aebf,0xf803b539),LL(0x813d0e6d,0x9bb8a479),LL(0x066abdfb,0xb689c813),LL(0x0072e530,0xd93b3f4b),
+ LL(0x987446ad,0x242140a4),LL(0x06a02f0c,0x40b3f709),LL(0xa0fd6018,0x33f9bf20),LL(0xf21abfdc,0x58517c18), LL(0xc1f80f3f,0xa33dc5db),LL(0x7ec91c80,0xbb7dfe27),LL(0x8ca97dd8,0xd2cf9338),LL(0x32e43d44,0x5761f871),
+ LL(0xe513ea90,0x3c8ffb0e),LL(0x79bcdecc,0x91ecda36),LL(0x9b1a5514,0xdad3fdd5),LL(0x640d3af0,0x8fb630f9), LL(0xf9d2e0be,0x82949b09),LL(0xeba23663,0x079ca0ff),LL(0x135238d4,0x51e62c53),LL(0xc446bd67,0xf5fa0c61),
+ LL(0xe8da43d6,0x19dcdd2f),LL(0x95f29b5b,0x46fbf7ea),LL(0x635e8388,0x7f3eaa05),LL(0x5369750b,0x5ef817c3), LL(0xc860c4aa,0x06025893),LL(0x5551c9ef,0xa2f6684d),LL(0xfbc0c667,0xd6af67dc),LL(0xcd2fe44b,0xfd8d7394),
+ LL(0x302a17cc,0x011968ae),LL(0xc3e5a5cb,0x2206ff24),LL(0xa20dbfb7,0x4c7f0df3),LL(0xa395dd6f,0x59566376), LL(0x373ea76b,0x68ff3d9f),LL(0xf6cf8ada,0x2394f93a),LL(0xe7514a94,0x3acc5dba),LL(0x5ddfa11b,0x0340da7a),
+ LL(0x1a05155d,0xc3f03022),LL(0x4f7656c0,0x6cbbdc6b),LL(0x0b0875f5,0x6e30dbdd),LL(0x3471b0d5,0x5e7c2883), LL(0x408b4bc8,0x49cfd71c),LL(0xf01c002b,0xd29a184e),LL(0xff415b0f,0x308be85c),LL(0x01a8fe7d,0x1b4176f0),
+ LL(0x0c33bed3,0xb850acc7),LL(0x23af7af0,0x76aac640),LL(0x21d5853f,0x049187ee),LL(0x6620195c,0x44fbf6e5), LL(0x36158178,0xf0abf14b),LL(0x90e419c2,0x9866ffca),LL(0x9e8523a8,0x7522e277),LL(0x08e90f1d,0x2f2590f3),
+ LL(0x66d3f75b,0xde1c0c52),LL(0x6c299b57,0x47dc9ceb),LL(0x51f7f2b5,0x4ad12847),LL(0x452b07a5,0xeedf9d8d), LL(0x3dad76c6,0x207b0627),LL(0x5d4c0280,0xccbb5201),LL(0xb019ae8d,0x0bdca05b),LL(0xf2da7eb4,0xb5f8d088),
+ LL(0x4626c00c,0x4e79a0be),LL(0x5af82c0f,0xf6fdd64f),LL(0x5f7cba0f,0x7a828224),LL(0xb0765493,0xc2214834), LL(0xabd53ccf,0x5b0d0d1a),LL(0xf4a1b517,0x3b03a22d),LL(0x6ece453e,0xb235c862),LL(0xf66471c7,0xf43ac344),
+ LL(0xa1552fa5,0xeaff93dd),LL(0xcf3ae702,0xef1b40dc),LL(0x9ca613a4,0x35ced3fd),LL(0xa2f33a0d,0x90e350ab), LL(0x002b5738,0x47bb89aa),LL(0x032b8b08,0xafc01bba),LL(0x61588b4b,0x688ae119),LL(0xcf66ef14,0xdb7d820a),
+ LL(0x084910bf,0x83b654db),LL(0x60ea75a1,0xbb581f8b),LL(0x1cdae7c4,0x6917f282),LL(0xa40a07c3,0xb719f931), LL(0x31297b3b,0xf8efb8b9),LL(0x4d6fc5c6,0x74246ded),LL(0xd2c61503,0x5a111754),LL(0x71654764,0xf64d2b88),
+ LL(0x6ad8f168,0x4b452692),LL(0x0cc6fc91,0x907beb21),LL(0xbf13c18b,0xe876d523),LL(0x4cf37ca1,0x4d28e457), LL(0x6d3d1172,0x4c0dc22d),LL(0x5a753137,0x7935a8d2),LL(0xda44d652,0x03484e3d),LL(0xc50025a9,0x05a3d80f),
+ LL(0xff477c6d,0x6d43c503),LL(0x1ccd416a,0x35f4c4cf),LL(0xd5088349,0x7070f471),LL(0x281d30c8,0x678460ca), LL(0xc6defb33,0x8923cd9a),LL(0xe2557cab,0x44930f56),LL(0xad156c4a,0x33b020bb),LL(0xbcaf4805,0xfdab31e3),
+ LL(0x864b5564,0xffe79bec),LL(0x10c60d52,0x0510e352),LL(0x328a652e,0x66203aaf),LL(0x54fea042,0x9d5403bf), LL(0x6e5e5c7c,0xb3fe6743),LL(0xecc66e02,0x6deef667),LL(0x44eacacb,0x199ee152),LL(0xd8803fd9,0x9f49fcd4),
+ LL(0x2d3a6e28,0xdd5fee9e),LL(0x686d8ca3,0x8eed56d4),LL(0x78083491,0x36889a27),LL(0xbef20457,0xea1a6555), LL(0xa501e2a3,0xe7e6b609),LL(0xfb23de2f,0x1ea0ae29),LL(0x632c9a6b,0x5f537d07),LL(0x9a3db961,0x61770d1f),
+},
+/* digit=14 base_pwr=2^98 */
+{
+ LL(0x7497e8a5,0x325c60db),LL(0x8c6949a9,0x05d8eab8),LL(0xc7bd5898,0x3169e466),LL(0x192d8e3f,0xadc06264), LL(0xd55959fe,0x1ff468f4),LL(0x202dba19,0x97b33ee0),LL(0x21cf84bb,0xaa0c3fe2),LL(0x04a8d176,0x48cdc0af),
+ LL(0x9c0d4009,0x53d8c448),LL(0x2e24dbaa,0xd3714617),LL(0x9b62e5f1,0xdd92e730),LL(0x9922cc8a,0x97b344d7), LL(0x0bfe3e8f,0x416b009b),LL(0xf3c82269,0x56873834),LL(0xe6623555,0xf82a980f),LL(0x5ce68e54,0xb027ecaa),
+ LL(0xfe87680d,0x005a4b24),LL(0x4cf6ee32,0xd92532dc),LL(0x4bd3e01f,0xfcd27c8c),LL(0xe1b59ffa,0xda7d9949), LL(0x2735d373,0xe3d5f31f),LL(0x288e71fb,0x7e139ca5),LL(0x93979cb4,0xe474bc80),LL(0xf6fcc665,0x7f4f6017),
+ LL(0xfbd613c3,0xe6982c86),LL(0xc366f17a,0xf4af69d5),LL(0xb85c2343,0x8683eed6),LL(0x24bc2116,0xf5bb244a), LL(0xc9fc77d4,0x997a74bc),LL(0x6f44b54b,0xe202eb91),LL(0xa6997e76,0x77886412),LL(0x02c8837e,0x6996c8fb),
+ LL(0x2c61382c,0x0986df8a),LL(0x667c8ee9,0x90607b92),LL(0x084eacde,0x051fcbf7),LL(0x6e685877,0x84e3dba4), LL(0xe458da50,0x35861a82),LL(0xcf392b51,0xd036823f),LL(0x3dd86e74,0x43181481),LL(0x3741a385,0x8dcfe17d),
+ LL(0x40f56786,0x8e1a77cf),LL(0x6d4b7774,0xc5bca7f6),LL(0xc81ec077,0x86b588a0),LL(0x9206354f,0x88952a01), LL(0x43a8519a,0x5444a989),LL(0x2857b210,0xe29dd68c),LL(0x9a144624,0x36658903),LL(0xe423e899,0x8c4dedb0),
+ LL(0xea886e5c,0x482040c5),LL(0x1cdd50f7,0x42fe5a56),LL(0x453b6e7f,0xf034f132),LL(0xb3c69762,0xba3fa97d), LL(0xcadb598e,0x34262560),LL(0x07afe0a8,0x7ed74b51),LL(0xebe0e8bb,0x2261d849),LL(0x608cea1c,0x23747e55),
+ LL(0x902c343d,0xb2e9371c),LL(0xda4fdba1,0xf57b2de8),LL(0xb67703a1,0x43f9afa4),LL(0xf79fe203,0xeafafb41), LL(0xf649a494,0xfec99dc9),LL(0xfe378232,0x14799ef9),LL(0x7184e31e,0xba3f8114),LL(0xdc0e987f,0x0abbb815),
+ LL(0x6fb5d02c,0x1dc7221f),LL(0x40f1607c,0xa0dfb113),LL(0xdbe8db86,0xd217f238),LL(0xe91f2859,0xc02547eb), LL(0xa98d0875,0x41df6bcb),LL(0x78f6be54,0xf51a8077),LL(0xba66bef5,0x3ebdf28d),LL(0x9175ec20,0xc65c7b38),
+ LL(0x475589d5,0x2302981d),LL(0x199d8ad4,0xbd479708),LL(0x8db46795,0xcb508be9),LL(0x6b224eb4,0xba1e066e), LL(0x1326ab8a,0xae909633),LL(0xf5bbe5e6,0xac989728),LL(0xb1729b41,0x1de663f5),LL(0x00c3d293,0x2018f58c),
+ LL(0x71efe25b,0xe647c0e6),LL(0x6104ebd6,0xaa30f871),LL(0x3c166de6,0x1003eebe),LL(0x1cbc42d3,0x0c308538), LL(0x56cba120,0x98b6c312),LL(0x860d2916,0x9065ae66),LL(0xa7dabb6b,0x2162062b),LL(0x8e011036,0x1422386b),
+ LL(0xe069de1c,0xd2589ad6),LL(0x7ee09300,0x3fe8e67a),LL(0x2f8ae49b,0x5b881860),LL(0x263a6a90,0x186a1482), LL(0x9b35b33a,0xc6079b39),LL(0x53d3411d,0x6c38d789),LL(0x720b2f99,0x743c4462),LL(0x29e14d08,0x4d903dd7),
+ LL(0x7b963913,0x625dfce0),LL(0xcc65e41f,0x60a83daf),LL(0x93e185a2,0x9e88c26c),LL(0x13707ac3,0x6d950e92), LL(0xa0a23dd0,0xbd7df2dc),LL(0xc2116cc8,0x5fad27f2),LL(0xda4430be,0x0703b868),LL(0x83cc41df,0x5ebf0e2f),
+ LL(0xf9e83fc8,0xebb91900),LL(0x6d60bb8a,0xf9539591),LL(0xb604935a,0x3bdd7a8b),LL(0x64e5eec0,0x2cae8c67), LL(0x60aaf21d,0x30cf58bb),LL(0x359f63cc,0x5e0f6f5d),LL(0x0547e03a,0xda245055),LL(0xb9e143ce,0xa83fd8bb),
+ LL(0x1b0215aa,0xa564435a),LL(0x354ba769,0xecffccec),LL(0xbdbbd594,0xd846149a),LL(0x65dd1597,0x9137df36), LL(0xa9f3ac33,0xc4f39f37),LL(0x961d7e8d,0xf594bb74),LL(0x835befbc,0x41fa4b58),LL(0xed79139e,0xa983eae9),
+ LL(0xb4e31aa4,0xd4085efc),LL(0x18b26adf,0xc760aec0),LL(0x76a7400d,0x14c1f78e),LL(0x317fe128,0x87b8aced), LL(0xcbd85bb4,0x4433582e),LL(0x86adc041,0x58f01426),LL(0x8f0d5781,0x3596dd50),LL(0x1a31a82f,0x2e7f3b80),
+ LL(0x2d1ede3e,0xcac7ccc8),LL(0xe89573db,0xc9b9a8f3),LL(0x54b40df9,0xbf744f69),LL(0xa85ecb47,0x88eb2281), LL(0x426ec49d,0x6b115026),LL(0xc8c41110,0xebda4660),LL(0xdf392aae,0x0a4a32ac),LL(0x37cb7080,0x2a28f9b3),
+ LL(0x6bd9414d,0xfed99d1a),LL(0x5715620e,0x15f59c41),LL(0xac431919,0x93edd9fc),LL(0xe1ccc47f,0xed1d43ae), LL(0x556d1ab5,0xafed2acd),LL(0x02e039c0,0x817b967d),LL(0xe02a68bb,0x335d15da),LL(0x67df767c,0x4fa75ea0),
+ LL(0x44833943,0x384704b3),LL(0x4084ef35,0x7809ed3c),LL(0x79c7ff41,0x2abab3c4),LL(0xa833fb73,0x2b7ef5b2), LL(0x4901a4ff,0x12b0335b),LL(0x44d58617,0x3eea607b),LL(0xd7f57746,0x7161b669),LL(0xb1e93442,0xee17e43f),
+ LL(0xd6d7878c,0x95c9bd80),LL(0x34ff7c75,0xe1ef20ee),LL(0xd2ccd599,0x3fab197a),LL(0x952ef4f9,0x9e480593), LL(0x06ea3410,0x69777fd2),LL(0x74fa7dd5,0xb0280454),LL(0xc43bb5fc,0x641b6860),LL(0xecd7b8a8,0x9f359d5b),
+ LL(0x70be68cd,0x4431d4ed),LL(0x08b55f8f,0x712117f4),LL(0x23d0b6ca,0x449e1319),LL(0xfdee5357,0x658323cc), LL(0x62879a95,0xa1ef8114),LL(0x69963eeb,0xc21257e5),LL(0xc5bbee13,0x1016ab74),LL(0x43d81a86,0x99bb310a),
+ LL(0x1d33a15a,0xdef03c44),LL(0x49127148,0x3e78cf18),LL(0x30b0cc00,0xe8d93368),LL(0xbd7ccd85,0xb05458fb), LL(0xdbaa76b0,0x8c2896dd),LL(0x79e4cacb,0x0d826600),LL(0xff730ed0,0x50a45b23),LL(0xeba9030e,0x4a0e079c),
+ LL(0xe3129aa0,0x3ead3fdc),LL(0x48aac890,0xa93b39f3),LL(0xf362465e,0x0fd73860),LL(0xf8df2764,0x69177f2c), LL(0x824ebddf,0x4cd58c50),LL(0x2fcef01d,0x1478981f),LL(0x980524b3,0x511bd380),LL(0x4d23e8e9,0xc95252b1),
+ LL(0x9ce08452,0x7ff12c37),LL(0xa3a87024,0x3dd8dd09),LL(0xb849dcb6,0x61ff0d39),LL(0xfefad6de,0x3f5eab86), LL(0x251523f9,0xb6146886),LL(0x5be2135b,0x45ac1d52),LL(0x41d2c5d4,0x63507995),LL(0xb3064e72,0x7f19f799),
+ LL(0xa2efb9be,0x7280ad9b),LL(0xba9659de,0xbc8fbb60),LL(0x875a8062,0xa4861c12),LL(0x2f2387ca,0x78c920c8), LL(0x03b7da99,0xfe0a6ea7),LL(0x48e3afa3,0x936a44b8),LL(0x89fd127b,0x618a0ecf),LL(0x06f24bc5,0xa35614cd),
+ LL(0x8d49c05f,0x21a1002e),LL(0x2fd7989d,0xceeacfd1),LL(0x8f5f4ea5,0x8c058f4b),LL(0x563e214b,0xf31bd38e), LL(0x245c7585,0xbe47bd98),LL(0x6bc2a404,0x70d1a05c),LL(0xc68257f7,0x830d7f30),LL(0x8136c932,0x1abbbfbb),
+ LL(0x6e03597b,0x6fbc43b7),LL(0x5fca14a2,0xc18fddb6),LL(0xe8f506e2,0xd3c4ca78),LL(0xa47e27de,0x6b8711dd), LL(0x16382b5b,0xc308c189),LL(0xcf96bd7a,0xe9d3145b),LL(0xafb26629,0x5c290ec1),LL(0x209438ff,0xb4eb8130),
+ LL(0xe1118539,0x7335044a),LL(0x5192a007,0xed6d43fc),LL(0xa43a2bd4,0x1a8bf622),LL(0xefa9f3a5,0xefec3fb6), LL(0x6d834bde,0x6d224bbc),LL(0xb0fbc744,0xaaebfcb8),LL(0xc4ea1652,0x383b2bfc),LL(0x751ae816,0x9cd26d90),
+ LL(0xf47f0f9a,0xae614386),LL(0x73c6ecd0,0x99873787),LL(0xe5414fc7,0x0b56c1ad),LL(0xfd40286c,0x9b85e6b5), LL(0xd64687dc,0x7117aacd),LL(0xad8a8c4d,0x85d148e7),LL(0x7962655c,0xf62f8eb5),LL(0x7f0c6a2c,0x8386b37e),
+ LL(0x90c47d7f,0x6b4715a3),LL(0x458a54e4,0x1fc4ced1),LL(0x0ed97b0a,0x01853943),LL(0x5b370e0e,0x58a280be), LL(0x344f3960,0x8d488cb6),LL(0x0741604b,0x9050c599),LL(0x07954771,0x0878fb1b),LL(0xdbb3c82b,0xd927ea8c),
+ LL(0x384f01fa,0x2fe71d59),LL(0x238bb66b,0x66d2b790),LL(0xb8fd803b,0xceaec11f),LL(0x6dd09c0c,0xbb919914), LL(0x2ccb2f67,0xab5992e6),LL(0xcca50326,0x2421878f),LL(0x9ee6dc73,0x363d933d),LL(0x084b1fa3,0xa374ab0b),
+ LL(0x161f6475,0x2d832a29),LL(0xfc8797eb,0x435b8d78),LL(0xd71b609c,0x66bc156d),LL(0xfe0c2004,0xb3dca798), LL(0x02fd92d7,0x445d47bf),LL(0xc8b03083,0x1d1c9798),LL(0x079a7c51,0xca46d98d),LL(0x1afeb89a,0xb93f286c),
+ LL(0xeeb6665d,0x1c174510),LL(0x7479a932,0x65874b6a),LL(0x2335e3b8,0x28d16a85),LL(0xc747eae6,0x5e22bd3b), LL(0x04be16b4,0xa770e0a7),LL(0x40b3ff57,0x9f5f9ca9),LL(0x845ec39f,0x3f39e529),LL(0xebe697ce,0x5d5f4d60),
+ LL(0xbd90d4f4,0xea2a262f),LL(0xfe1b6494,0xa1ce74ac),LL(0xfa0fc472,0x4e419004),LL(0x4e691060,0xdef0e440), LL(0xa9f4baf3,0x57195a3a),LL(0x5e758c53,0xf14e108b),LL(0x920895e0,0x10a34f9d),LL(0xfeb57a63,0xc3f18af9),
+ LL(0xda1bef0d,0x4b1c988c),LL(0x3df6915b,0x8b328cd9),LL(0xf45586d5,0x5ddc5ecc),LL(0x040322fc,0x426468b9), LL(0xbe981558,0xf7f44765),LL(0x1855504a,0x25093991),LL(0xf7d6df43,0x72c51f2e),LL(0x849c99e5,0x858637fb),
+ LL(0x0ee9f78b,0x68b84dfd),LL(0xf2ee390e,0xff42fc9b),LL(0x531e1dcf,0xaca71e10),LL(0x7feaedfa,0x391620e2), LL(0xacf3e5da,0x7b2d6a02),LL(0xd20a16d3,0x261823d2),LL(0xbb00cd30,0xf9afa5d6),LL(0x1084580d,0xba151f4a),
+ LL(0x26a3fcc3,0xb5f4b3a9),LL(0x6729f4da,0x5d84a823),LL(0xfc35f732,0x51540c41),LL(0xa6ae5bf7,0x81b0cb58), LL(0xbd81bd27,0x91c7ae07),LL(0x1d56ff5d,0x0868980e),LL(0x65224df6,0xaef85a31),LL(0x17a69e35,0x112eba3b),
+ LL(0xc3a9d932,0x07c34677),LL(0x8ac45e37,0x3b6b7cce),LL(0x31b6248a,0x5e0e2b6e),LL(0x453d9685,0x14ee5b66), LL(0xbd4d807a,0x4c5e2be7),LL(0xc121fea8,0xc03f37f8),LL(0x8df7b5e7,0xcf34911e),LL(0x5f754191,0x00e7f18e),
+ LL(0x2dcea4aa,0x89a8c9e1),LL(0x50f6db55,0xcc1cc31a),LL(0x9046955f,0x4a6f542c),LL(0xda2485d4,0x85fed580), LL(0x9ac53748,0xa70f62d1),LL(0x655870a7,0xc2fbb850),LL(0x8c859aef,0xaeb2d438),LL(0xcc9ff51e,0xe3cc5ae5),
+ LL(0x0a3ebbfc,0xf8d8c55d),LL(0xed48f61a,0xdcd838d5),LL(0xd4cba7ab,0x032f91ea),LL(0x2f70235e,0xeb0ed88d), LL(0x000ef325,0xd4498170),LL(0x4b923c4a,0xfd34e07f),LL(0xb19b84cb,0xf71c07a9),LL(0xed9690a3,0x000a669c),
+ LL(0xb5705e16,0xf45eb0ef),LL(0x7d9ce007,0x8cfd6a62),LL(0xd9e52885,0x76ba9a5f),LL(0x8aa9ffd6,0x13f72881), LL(0x85528e4a,0x0a11e8dd),LL(0xcee8d663,0x58f1993d),LL(0xa1c81fd3,0xb49d750b),LL(0xe7de2e6b,0xaae29861),
+ LL(0x5dd7de70,0x9a40644e),LL(0x937a5546,0x67fbae1c),LL(0x956c2fa8,0xb3e02907),LL(0x21b4aede,0xaf785374), LL(0x9c0a8bfe,0xf42a1e96),LL(0x78957181,0x3f6690e6),LL(0xa6c5e0a7,0x1b1c9575),LL(0xf9cfb9bd,0x6def8124),
+ LL(0x72faa1b0,0xde552cf9),LL(0x9b5ebbbc,0xfac2f4ad),LL(0x8ef89ba1,0x4b60a5a5),LL(0x8012f3b1,0xb6d9be57), LL(0x9b2b083d,0x3992a6f7),LL(0xac640f77,0xe79ec527),LL(0x3f1e632e,0xf6cca775),LL(0x8fb80790,0x5dae8413),
+ LL(0xb572407c,0xf0d4146c),LL(0x3f84cc39,0x829cfb38),LL(0xe31f007e,0xd7c9fed4),LL(0x09e68ce9,0x93b2a5bc), LL(0xd01482b9,0x073fb24a),LL(0xb8d44e62,0xfe494244),LL(0x3dc49858,0xe59a1649),LL(0xf005b31f,0x071776f7),
+ LL(0x285439af,0xaa368f59),LL(0xe27e783d,0xb0821574),LL(0x098746ba,0xe16903f6),LL(0x69dc00d0,0x436a95ae), LL(0x877bfcec,0x9ae5a91a),LL(0x1416ad3a,0x5d8758d9),LL(0x25fd9a9a,0xa420ce40),LL(0x39b0fbfa,0x99610fdf),
+ LL(0x41cc1e9b,0x782af222),LL(0x86ff4cf6,0x346a4a92),LL(0xabc900c1,0x9dc4c6cd),LL(0xe7fade51,0x7ed2476c), LL(0x4f1dd24b,0x68a72185),LL(0xb08260cb,0xcefcf0fd),LL(0x8a6f61b6,0x0199a147),LL(0xcb5769c5,0x176b6079),
+ LL(0x347d5a63,0x6dbcceb0),LL(0x9c4dc505,0x26433ebc),LL(0x05d5e74d,0x52570318),LL(0x057ca464,0x692f1d81), LL(0x477f424e,0xa09554a0),LL(0x176a695d,0xbd3f9bbd),LL(0x5972db27,0x8c7f52f3),LL(0xf28b2aa4,0xacee8234),
+ LL(0x3a4a0217,0xb853465a),LL(0x66f3a4d5,0x74a2534f),LL(0xeff0423b,0xae1a7ff3),LL(0xbb126028,0xd2a01a09), LL(0x4963e855,0xff84c6f0),LL(0x6bc18d50,0x63db264c),LL(0xcc6a5e25,0x39792dca),LL(0xedb37a25,0xf20cdf3e),
+ LL(0x8730f2c4,0x6a460f3d),LL(0x6a0ab6bb,0xe9b786c4),LL(0x084015c2,0xa9720a6b),LL(0x0dbe6f0f,0x28add2e2), LL(0x26be7de7,0x90fb0ba7),LL(0xe40f15fd,0xfae8b5d4),LL(0xceb9c856,0x007363a1),LL(0x586b770e,0x6d8bfe14),
+ LL(0xb7bcc0e0,0x63e7d78e),LL(0x3ed4ab62,0x56c569f8),LL(0x9e103abb,0x76c6a5bb),LL(0x638fc44d,0xeb24afeb), LL(0xf0be16f1,0x15e00239),LL(0x8778f084,0x7db92f67),LL(0x63de2bef,0x5198680e),LL(0xe0510421,0x69031d0e),
+ LL(0xb94753c1,0x8058f8aa),LL(0x454bf609,0x412d4c97),LL(0x95f9fd19,0xb8dbfe8a),LL(0x68b43233,0x6cd3221a), LL(0xa5adaaff,0x384a9f15),LL(0x42b2ef95,0x60c70f90),LL(0x2c7da919,0x085b2f3b),LL(0xbc8407e1,0x1e5d23d1),
+ LL(0xadb45b3e,0x9ea95bc9),LL(0xed06ec67,0xb5a28fec),LL(0x62a3c143,0xd678df46),LL(0x6793284a,0x80f0bc9d), LL(0x07d4afc7,0xeb7865a9),LL(0xc1301d87,0x0fc5eafe),LL(0x4823349b,0x50a8e7f5),LL(0x2d019e96,0x97800fa2),
+ LL(0x1bdd1d9c,0xfeff2579),LL(0x23886156,0x4d938c5d),LL(0x6979b9f6,0x25e3a806),LL(0x37bb6199,0xeeef8fa0), LL(0xd7d308b8,0x4d917977),LL(0x4ae672cc,0x60ca7ff9),LL(0x2a68db6e,0xb24ec154),LL(0x9e9942f5,0x7b0604ec),
+ LL(0xca4fad9e,0xfdf4794f),LL(0x3df5de22,0x086020f8),LL(0xd601533c,0x653da6ca),LL(0x735709f3,0xf97c1865), LL(0x7cbd6ab6,0x2457ffd0),LL(0xd003a502,0xce05a482),LL(0x33ee2740,0x5c0c0cba),LL(0xf37174aa,0x8146ca00),
+ LL(0x587262bb,0xec118827),LL(0x7e2a402c,0x8468c029),LL(0xbd6eb2aa,0xe1c3a9e3),LL(0xb496bde8,0x77d09b4d), LL(0x854693bf,0x454e767a),LL(0xa4de85bc,0x6bbcc22e),LL(0xb180f206,0x66452f10),LL(0x0f5b1744,0x110c5a05),
+ LL(0xa6b3f6e4,0xb7be75d8),LL(0x2c0d2e1d,0xf64bb3fd),LL(0x935ae640,0xad17a039),LL(0x8f243748,0x7304ad63), LL(0xd278caa9,0x04316bb4),LL(0x1e84f91d,0x19b89c62),LL(0x6e7a2511,0xdf4a47e9),LL(0x998b6bc0,0xdef32df9),
+ LL(0xcee95a1f,0xf1253ce0),LL(0x0ae96e31,0xbacf5206),LL(0x0b343e63,0x4ba2e24a),LL(0x79929dc6,0xca64d07f), LL(0x9424ce75,0xf2823ac8),LL(0x0207ee9f,0x2d4add37),LL(0x387cde5f,0x44d9ecd0),LL(0xe180a21f,0xa5095ccb),
+ LL(0x7c0cedf8,0x901cec8a),LL(0x3b8c759c,0xf291dc78),LL(0x49401234,0x98b8efdc),LL(0x058e9d9e,0x8f2b16e3), LL(0x27dba00f,0x16ce8007),LL(0x6d66d2f1,0x5bb8fca9),LL(0x7b85a96b,0x092eda98),LL(0x973eae20,0xec53f4bc),
+ LL(0x1b93a60f,0xe6e0df59),LL(0x2f6b0abf,0x65e06ecf),LL(0x569a9e1d,0xb8c2ec3e),LL(0xaa8c1cc3,0x27f9fe72), LL(0xccd4d5e2,0x9cf3908f),LL(0x725c8528,0x5a40e0a9),LL(0xd470b0b0,0x27b15a1e),LL(0x33d81bff,0x50a09ec1),
+ LL(0xda99fcf5,0xba976a58),LL(0xc3536b7c,0x3881ef1e),LL(0xfbc931b1,0xec65a069),LL(0xfc929a0e,0xab7f57b4), LL(0xbc61f452,0xc7c63491),LL(0xc1750dbc,0x5c1aa935),LL(0x9ff0465c,0x35b8789b),LL(0x727647b7,0x8ff8589b),
+ LL(0xa95022b6,0x2b56fe50),LL(0x2adbdbbd,0x24220569),LL(0xd2b80ea8,0x2370d94f),LL(0x71d9e6f7,0xe5d47b73), LL(0x8d858032,0x2fe84b72),LL(0x4ffd7cfe,0x0411034b),LL(0x7c2c84e0,0x0819a9f3),LL(0x30228f9e,0xf8248dfd),
+ LL(0x4fdf6c79,0x75c77f0a),LL(0x15579cc7,0x195b4b59),LL(0xf8d3705c,0x274c7c81),LL(0x70ee9be1,0x45a2209f), LL(0x0b1e818b,0x4a4fce69),LL(0xbb9926b1,0x74d05e5f),LL(0x3f2a796b,0xb64639ce),LL(0xae957d59,0x2d168d5b),
+ LL(0x16171846,0x067c2270),LL(0x1a03f8d1,0x7bb71d15),LL(0x495a09a1,0x2badd196),LL(0x51b990c4,0x024db163), LL(0xe79dcaac,0xc19edc61),LL(0x60df81e9,0xf17f54bd),LL(0x9ae347e4,0x4560262e),LL(0x59eb711d,0x1d2c2542),
+ LL(0x4919affe,0x40372d2d),LL(0xa009bd16,0x2d4a2ea3),LL(0xc1a62eb1,0x48f1e7f8),LL(0x587a1124,0xce083725), LL(0xe7ebadd3,0xe874261b),LL(0x057b93e9,0x7ca5c156),LL(0xfe39e6ff,0xe8b381e5),LL(0xd30815c3,0x2d16b32f),
+},
+/* digit=15 base_pwr=2^105 */
+{
+ LL(0xad2e996a,0xdfd30b28),LL(0x9df0fc37,0x64d4eeec),LL(0xddc39763,0x8e049e3d),LL(0x37ea2e8e,0x9f55e0ce), LL(0x4bf01984,0xf3fcba4e),LL(0x9d55bc4b,0x764d5c3d),LL(0xcfda895f,0x98cb92a1),LL(0x5c7bca69,0x27dfe795),
+ LL(0x23a86e2c,0x86dfdecf),LL(0x3387f712,0x02ac466b),LL(0xd63509d1,0xc30a1ac2),LL(0x63aebbd1,0xd3913422), LL(0x068ae34f,0xdc7b789f),LL(0x487dcd10,0x499f2d01),LL(0xa3e8a4b4,0x68e2a3bc),LL(0x14d2a26c,0xdf87ba71),
+ LL(0x34479e7b,0x9e3ab999),LL(0xb026e780,0x9d5f2dc3),LL(0x4f1bd429,0x131374fd),LL(0x9be1379a,0x92e2e738), LL(0xd13bc111,0x6cc32f80),LL(0x86f81c92,0x6fbfc350),LL(0x9263913a,0x12ca1b30),LL(0xe06ab75c,0x6f7da1ff),
+ LL(0x19301b16,0x4780f12a),LL(0xbc368a20,0x233bc231),LL(0xcbadb344,0xd9650892),LL(0xad9425a1,0x38a0d964), LL(0x4a8d4d7e,0x277abcf2),LL(0xb806ce9e,0x4ccd16b1),LL(0x7570d473,0x82ff40f0),LL(0xdf130780,0x57491414),
+ LL(0xa96ef42b,0x9f1f39f2),LL(0x107f1321,0x1fd967ed),LL(0x29d4767e,0x93832497),LL(0x3fa9e796,0x7761a38b), LL(0x66318df2,0x3e408c59),LL(0x41745f03,0x9283ca44),LL(0x2cce1a86,0xfedf8fa3),LL(0xb44600b4,0x8363860d),
+ LL(0x45f45a89,0x3dbfde55),LL(0x26ce399c,0x8800c860),LL(0xc25e9479,0xfb25e8da),LL(0xf7d367a2,0x6ff0d6cb), LL(0xa93f9890,0x70b0ba36),LL(0x49bd5a80,0xc07ca403),LL(0xed54d1aa,0x5f4feda6),LL(0x671ad0b4,0xfa1e2efd),
+ LL(0x8c56e7aa,0xda465467),LL(0x25e45bc0,0x39d04cdc),LL(0xaf21c637,0x26661bd6),LL(0xb55ddfa5,0xf757ff5c), LL(0x4394eb20,0x07318fd1),LL(0x2bcf3ad1,0xe010b19d),LL(0x8e5c7e7f,0x71e2031c),LL(0xedbfda69,0xee35f346),
+ LL(0x5d8f6fab,0x8d8d4120),LL(0xabed09c8,0x5e420839),LL(0x4aacbb1e,0x5120e079),LL(0xec1bc996,0xf7e840f8), LL(0x9707c3bb,0xd921d63b),LL(0xae891a71,0x3ab4b8b8),LL(0x73bb2278,0xbe465756),LL(0x553ee91c,0x776ce040),
+ LL(0x88222e0a,0x86f07c2e),LL(0xdf97816e,0x3f3688f1),LL(0xa6df9d3a,0x20d2d944),LL(0xb2cb925a,0xff399057), LL(0x27f1de19,0x010c747e),LL(0x7fc1fbc3,0xbe940669),LL(0x877ef709,0x3ab94600),LL(0x8f4c8a8e,0x9af40a6b),
+ LL(0x713f023a,0xf7c0f202),LL(0xd0a8dc63,0xbe0bf3db),LL(0x64a41337,0x09789926),LL(0x2c2823cf,0xbb4a8964), LL(0xb90e45c6,0x9279cb27),LL(0x382564ac,0x80283fd3),LL(0xfa5f0bcd,0x3a746b01),LL(0x0afaf10a,0x28667a8e),
+ LL(0x015d5295,0xeccfd0ee),LL(0x73ce8e21,0xbd6678a5),LL(0x336ecb65,0x132a87f2),LL(0xbe7dc659,0x09de4efc), LL(0x6f69b3bd,0xbedadd10),LL(0xe8303650,0x357c61e2),LL(0xa45777e6,0x6b3c613a),LL(0x08d41179,0x51dd30ad),
+ LL(0xf98feac3,0xa7b53f3f),LL(0xf9497319,0xe8e00328),LL(0x0ca20b40,0x1f3b080d),LL(0xe19b088e,0x06dc5456), LL(0x0dce02cb,0x1f3f18d7),LL(0x6fd1ade9,0x2d215544),LL(0x055550d0,0x4c6de38c),LL(0xf33f4973,0x5d535e6f),
+ LL(0x744c033d,0xdcfd4163),LL(0x76fc420a,0x0706a490),LL(0x394f5b6d,0xdc9db55c),LL(0xe040a093,0x1a050a62), LL(0xd0ab26f3,0x60367ebb),LL(0xc3d91820,0xb9c07239),LL(0xa3e32db2,0x14a8bed5),LL(0xd49f37dd,0x23b19cd3),
+ LL(0xea6c85ce,0xd048c64f),LL(0xd5716cfe,0x8aefff19),LL(0xab85bdcf,0x199fddb1),LL(0xbaea49d0,0x3f592e7e), LL(0xf1d58ff6,0x8c8decb6),LL(0x7fe8f425,0x02598a99),LL(0x64a93fd6,0xe4c73ae2),LL(0x878db06b,0x208a0f61),
+ LL(0x27c4a266,0xff0272fe),LL(0x69e7c6a2,0xccfc96ae),LL(0x8e78d74a,0xbd7e715f),LL(0x32ed35bc,0xd04ae9a4), LL(0x05614c5f,0x302af413),LL(0x33943b5a,0x98176637),LL(0x8a58cfd8,0xa4d1c9b2),LL(0xac2f3f79,0xf0ebd5f4),
+ LL(0xfdc7945f,0xebadb010),LL(0x03750a4b,0x62c9cff0),LL(0xa0c85b9d,0x75192383),LL(0x16eb0bf9,0x2aba7b53), LL(0xa4c06f9a,0x93d4adaa),LL(0x5f8e482c,0x573a86a2),LL(0xe791a79f,0x109c6fdc),LL(0xb37eeec2,0xd9ed02ce),
+ LL(0x7dd63c8b,0x7b1fb4b4),LL(0x22493b49,0xae6e2767),LL(0x6a411bc9,0x5ef6beb7),LL(0xe1bf4242,0x4d88918d), LL(0x02a97fbc,0x7ba26f8c),LL(0x7f41c518,0xf45b2a50),LL(0x83249e23,0x6c35fb69),LL(0x7a5778cc,0xc4a95134),
+ LL(0x08287cf7,0x6173f860),LL(0xfac3a444,0xdcfc71d9),LL(0x079ce3c9,0x894f3b33),LL(0x916b661c,0x842bf7da), LL(0xa758a243,0x94299d6f),LL(0xb242389a,0x0e23f984),LL(0xc03a7aa2,0x653050f0),LL(0x9559ad9c,0x2ec3041b),
+ LL(0x97cf6e9b,0xa61dd499),LL(0x448fa6c6,0xfd090f38),LL(0x39b126bf,0x4f1b75ac),LL(0x1ef1a280,0xb48d0372), LL(0xf2b2941f,0xe40c310d),LL(0x8d9d5ace,0x5b9a7369),LL(0x7ad9ad95,0xbe0415c1),LL(0xa8510622,0xffd864b6),
+ LL(0x898f28e8,0x2aceddcd),LL(0xba89a51f,0xa0cfc30a),LL(0xe105e448,0xd87db983),LL(0x5e5ea6fb,0x16ba795e), LL(0x352ad094,0x5f48e45a),LL(0x55fd75e7,0x1971a10f),LL(0xfd1c8d68,0xfb0f1767),LL(0x86df0665,0x904229d9),
+ LL(0xe87ab22b,0xc2c88671),LL(0x33611a50,0xcbe384a1),LL(0xad2eb708,0x38eec58e),LL(0x86d7bdee,0xaa19b174), LL(0x51832b61,0xa9f416d7),LL(0x355e7b6d,0x10b751ff),LL(0x4ff07a5a,0x6dd52063),LL(0x4e3505c1,0x6a6090c1),
+ LL(0xd4c80f29,0x53addd1c),LL(0x0d3d793e,0xe76d668b),LL(0x191eedd9,0xbdcdc4c9),LL(0x0f8e4877,0x80675320), LL(0x32f5661b,0xc41426dd),LL(0x06199185,0x9fcbe1ac),LL(0x404a1207,0x62fa2198),LL(0x33c8190e,0xc742fdc2),
+ LL(0x778ee765,0x16ec1b96),LL(0xe29d992d,0xda656f58),LL(0xb4369e7f,0x5393775b),LL(0x0674fc45,0x512f5c7b), LL(0x60efa8e0,0x55b8bd38),LL(0x155b57ab,0x1ab6d2df),LL(0xe26ad439,0xed0aa777),LL(0xd9b04376,0x5b16333e),
+ LL(0x8fc7ea72,0x321119d3),LL(0x7211ef45,0x390b4ef5),LL(0x1feda1a2,0x289f3945),LL(0x605c8596,0xcee9cb33), LL(0x971b6897,0x91109e96),LL(0x19701ea7,0xdf70c173),LL(0xa92c6b2b,0xa07d0ecd),LL(0xa9eab766,0xf8eb97fe),
+ LL(0x0e3cf9e8,0xbb2cf63b),LL(0xdda02b26,0xffa6c503),LL(0x9cb18efd,0x42c1ec1a),LL(0xc45d5b22,0x13cdda9c), LL(0xc820cdf5,0x6b3baf33),LL(0x610c8bfc,0xa337bc5e),LL(0x06a9ca6b,0x88186818),LL(0xa0c455af,0x382a34ee),
+ LL(0xe8fc59df,0x725006c9),LL(0xf929c670,0x0d46b697),LL(0x893a9f6e,0x7bd6eceb),LL(0x1cd04e5a,0xf25aa637), LL(0xf6612d4a,0xf1563d79),LL(0x5efc49d8,0x8c9372cf),LL(0x96c5bdc5,0x09cc0513),LL(0xd3cc34d8,0x70f19d46),
+ LL(0xfdfbe16c,0xe62f6891),LL(0xdc60110b,0x8b7db2fd),LL(0xf7868674,0x3557bff8),LL(0x95a638d6,0x2b414c8e), LL(0x6d19ac65,0x3b6610ac),LL(0xd641b0ea,0x20864204),LL(0x892161fb,0xee372a46),LL(0x4125868a,0xc7c5bd87),
+ LL(0xa61ee957,0x5edc6afc),LL(0xd37faed4,0xa4374ba1),LL(0x1e52b0ab,0xf0684f46),LL(0x2a007b66,0x0812cbca), LL(0xe68c4893,0xf3442afd),LL(0x2d9dd9a2,0xb02ac6df),LL(0x068c08bb,0xa4fe98dc),LL(0x7795e2e9,0xfcd5dc05),
+ LL(0xa0f55cd8,0x28983aee),LL(0xe96cf557,0xb390daf4),LL(0x3f119098,0xbfd2f5ab),LL(0x6386c0ad,0xed114587), LL(0x69539392,0x578995b9),LL(0x36b880ab,0xc8a77948),LL(0xe4c8b560,0x7e03cfb6),LL(0x06cdcbe0,0x018cd4db),
+ LL(0xb006f8d5,0xbd7f2e3a),LL(0xd6d9f30e,0xf25d1718),LL(0x1b22ae3d,0x9ef6e2ee),LL(0x416154ab,0x89a2695d), LL(0xda261e39,0x1975e0c8),LL(0xda2c2031,0x8fe66aed),LL(0x97e1e00c,0x6f93f839),LL(0xa742b328,0xcba9a773),
+ LL(0x3417df8b,0x9529fec1),LL(0x54e314b1,0x37a27cd9),LL(0x65f94a63,0x93feb0f8),LL(0xb5e029c1,0x65978b84), LL(0x81b705f1,0x576fd830),LL(0x688e8c52,0x37d07a37),LL(0x332838dc,0x3b91d360),LL(0xb0b14a94,0xcca9cbf8),
+ LL(0x8b63b669,0x86f18c44),LL(0x6972d2d1,0x53c6eba6),LL(0x8cff59bc,0x2a522d8c),LL(0x6ed25ce5,0xbc181d15), LL(0x5feb0eca,0x913f173d),LL(0xa207bd71,0x34273f8d),LL(0xfa1715ae,0x41b7572e),LL(0x7f16f4ae,0x8a8ffea2),
+ LL(0xf95bdf78,0x2b852908),LL(0xa26328b9,0xa75adbb3),LL(0xdae21d25,0x992ac179),LL(0x78e14467,0x8c99927a), LL(0x0c16e0c2,0x23fb2fee),LL(0xdbcb5f4e,0x58e797bb),LL(0xa07bd7de,0x33d6956e),LL(0x7172d36a,0xc921fdb3),
+ LL(0x158267b5,0x035f1744),LL(0xa291374d,0xc7495f33),LL(0x4a41a6a0,0xe07db2f5),LL(0xd1238792,0xfdb2987e), LL(0x49741ce6,0x616df624),LL(0x8a693880,0x90ecd21b),LL(0x341fe21b,0x447c729d),LL(0xc012a8ab,0x06ad3c90),
+ LL(0xddfd6b5a,0x13dc4fa9),LL(0x64cfc0f3,0x238a1add),LL(0xc34a2b1e,0x874a3c2f),LL(0x0deb1dd4,0x427b6e3c), LL(0x876f2621,0x78a1ad1d),LL(0x252f6837,0x34f9207c),LL(0x047d667b,0x1c812fbb),LL(0x3ee03ba7,0xc3512ea3),
+ LL(0x527a1b55,0x762de5f0),LL(0xae3221af,0x7873d692),LL(0xb112d35f,0xa8ac73c7),LL(0x815414f6,0x1d118c30), LL(0x865ab6f6,0xbc686118),LL(0xecf8c02d,0x01e75348),LL(0xe6220bf9,0x9b131840),LL(0xa67512b5,0x3d72dac4),
+ LL(0xaf95e16e,0xd9e49ecc),LL(0x1e2aa105,0x1297c560),LL(0xa1a5e8c2,0x925301ac),LL(0x990ab503,0x3b0ea863), LL(0x15f258c4,0x7860b660),LL(0x397253e4,0xa4497040),LL(0x14a4774d,0x88562ed0),LL(0x7adbd093,0x325d8b0d),
+ LL(0x41e24010,0xd4df8df2),LL(0x580031be,0xe7cb8663),LL(0xd7fc7e5f,0xd653593a),LL(0xe9f1fe9d,0x429a8863), LL(0x63e71ced,0x18a0a709),LL(0xa498140e,0x39d9316d),LL(0x40f40117,0x44466cff),LL(0x64602832,0x58d27cd6),
+ LL(0x86018a70,0xf4a4c22b),LL(0x6d703f04,0x7a4d4102),LL(0xb424b0fb,0x4f5a0037),LL(0x322b1876,0xfb591cfd), LL(0x632e0f56,0xb45798b0),LL(0xfdcbcf20,0x83ef9feb),LL(0x115749ac,0x0a23b09c),LL(0x946248f8,0x3b950273),
+ LL(0x1e13eaee,0x5ed75e68),LL(0x09dafdb9,0xbebd4744),LL(0x69941fc4,0x8b46621f),LL(0x91129bc0,0x1fd3c13f), LL(0xb7b9da22,0x371448d0),LL(0xd87a4742,0xd452ccea),LL(0xf91c38b9,0xe2f04778),LL(0xbd516bfe,0xfb443a5d),
+ LL(0x044d666b,0xd7bd4056),LL(0x2a9b17c4,0xb4546ffd),LL(0x818fe55a,0xf66765ae),LL(0x1b5dc7a0,0xc375126c), LL(0xc1a81c63,0xe9a7ed20),LL(0xf8cf06b9,0xaef2e23d),LL(0x3e67b95b,0xf4536865),LL(0x24309537,0x25cbb5a6),
+ LL(0x3256c020,0x8a230e68),LL(0x215dca7b,0x4a33e462),LL(0x2935b6d1,0xefef4936),LL(0x852c39f4,0xb383df4e), LL(0x57c21e90,0x197ddd77),LL(0x2164127f,0x236f98dd),LL(0xbbd61847,0x464b86ec),LL(0xfb89d515,0x107a387c),
+ LL(0x400d66d5,0xe01e50b7),LL(0x5f864426,0x4377af2b),LL(0xf8fe847a,0xde21c49a),LL(0x887c0674,0xc133e58f), LL(0xd2fda17c,0xda5b4c3b),LL(0xfed8fe68,0x24157f13),LL(0x8b6bb6bf,0x1c4483f3),LL(0xcf1bed73,0x940fab9e),
+ LL(0x3c15c7e5,0xce3fca79),LL(0x066de109,0xb83fce10),LL(0x0cd5a04a,0xbd42ed01),LL(0x407fcb03,0xba5446b8), LL(0xe5d35bda,0x4a8cb929),LL(0xbff8631f,0x6338fd7e),LL(0x4656a8cd,0xc85d4ee4),LL(0x92c99820,0x83b1f39a),
+ LL(0x7e90c823,0x153fa4d4),LL(0x15326196,0xc15809ba),LL(0x6eb4b379,0x320b8fe9),LL(0x58704d9e,0x27cc07c0), LL(0xf13d6ee7,0x301840b2),LL(0xc6d8c930,0xf1f6530f),LL(0x96a22034,0x3e9254ea),LL(0xaf5b8a2e,0xf8c0ee68),
+ LL(0xb8207fde,0x88e9e44e),LL(0x29bc1310,0xdea11cbd),LL(0x9c9d7df7,0xa20c2f17),LL(0xbceac495,0x2a954927), LL(0x2a58d6ba,0x3f405f5c),LL(0x2ac9aeaa,0x64df5364),LL(0xe8aa74a5,0xb618f6db),LL(0x74ef61e3,0x22dadc7f),
+ LL(0x9cfdc4cd,0x306ee832),LL(0x40698a5b,0xaff53321),LL(0x89567341,0x98893443),LL(0xac7c68ec,0xdfefbdd4), LL(0x3261a582,0xd3da7094),LL(0x62ce96e7,0xd23e3fa5),LL(0xd773337e,0x62c060c0),LL(0xa041f910,0x5cb2beca),
+ LL(0x7e8215d8,0xe21ab479),LL(0x923b4b27,0x84384686),LL(0x6a3d21ef,0xa93c08fe),LL(0x2fa6de1c,0x7bd96248), LL(0xca6de3e0,0xb858ecd7),LL(0x47c9fced,0x466a48c8),LL(0xc708239e,0x23ca9b75),LL(0xb5bbe833,0x860d553d),
+ LL(0x9e76e71d,0x45804f1a),LL(0x51e59be2,0x9fdb8b8d),LL(0x3bbc2a19,0xa76db4b7),LL(0x96f82cd0,0xaebb47ee), LL(0x97b1dd04,0x7a9b95b5),LL(0x5f0b1d7c,0xcc149a8d),LL(0x47a50eec,0xbba40e4d),LL(0x56b72539,0x4e635d70),
+ LL(0xb18659c4,0x31c40e90),LL(0x6f694b35,0x08026224),LL(0xe0cd6e15,0x8ed3d7b8),LL(0x9293cb36,0x157e2a9d), LL(0x96e54583,0x7b457bb1),LL(0x2609c44d,0x75647498),LL(0x970a8cf2,0x54667671),LL(0x3af72572,0x3b7da9c8),
+ LL(0x4d63473a,0x8fbba977),LL(0x23001221,0x7af5af43),LL(0xea29d97e,0x99093197),LL(0xfa564089,0x4409f6a9), LL(0x2f70e06f,0x64fd1cda),LL(0x2e9d55ea,0x8b7c83a6),LL(0x6385fcef,0x0dffbe4b),LL(0x7a6fe72d,0x4513f584),
+ LL(0xba1de4ae,0x6a64f166),LL(0x89069fbd,0x1f8550a9),LL(0xda7ef7fc,0x72b411fd),LL(0x829ea712,0xa185d2c3), LL(0xccc1868d,0x82f5ffb8),LL(0xff9fafa9,0xb484473a),LL(0x089132ed,0xe1857f3c),LL(0x08ef378f,0xdad885a9),
+ LL(0x7af9e2aa,0xbdbdfc0e),LL(0x95486202,0x366c07bb),LL(0xfc9d979f,0x37040d45),LL(0xa0f80630,0xf279ed10), LL(0x8f31b39c,0x27855261),LL(0xf26f91cb,0xea0c3b1c),LL(0xb38c050f,0x90b4e8c2),LL(0x1623ab47,0x7acb26b1),
+ LL(0xa4a064d2,0xb6cc3cd9),LL(0x97245482,0xa410880c),LL(0x3a6e6a1f,0xfb470e11),LL(0x93f347e4,0xf19080b1), LL(0xb75a53d9,0x23253dcf),LL(0x9c95d567,0x55047049),LL(0x7b20202a,0x8c75631e),LL(0x834b8380,0x58fccf32),
+ LL(0x243dddde,0xaf6bdbd8),LL(0xcf38f705,0xa3ca3e2c),LL(0xca38c9a2,0xa2357b4b),LL(0x6eba095b,0x8bf0d270), LL(0x9d998070,0xe4a43b7c),LL(0x8469214c,0xdf412faa),LL(0x000f1802,0xd2578cc4),LL(0xf8515863,0x2feb563f),
+ LL(0x5022112c,0xe66ce02a),LL(0x1461b1c6,0x8415df81),LL(0xad247c38,0xc2546e6a),LL(0x9a9c74d6,0x4b9788e6), LL(0xa22be3e8,0x9d0cb2e0),LL(0x295f76ad,0x15db086c),LL(0xa2337670,0x9758f99b),LL(0x9ab57f54,0x61ae09bb),
+ LL(0x93926a37,0x7af4d4aa),LL(0xf25cadb4,0xa895f386),LL(0xc6f4f514,0x90e13821),LL(0x4eef97ab,0x46738d95), LL(0xf0b479a2,0x66f559f3),LL(0x3262fb2b,0x9ea62dcd),LL(0x6a857025,0x91a39a5e),LL(0xbb3e6e11,0x11bdd19a),
+ LL(0x9353cc19,0xfa411fd6),LL(0x94cd2276,0x275d094c),LL(0x25243d1b,0xe2069b22),LL(0x630c8cbc,0x9f02f1e2), LL(0x379b6b63,0x85c942fd),LL(0xbdcc9307,0x293dcf87),LL(0xdc212ca8,0x56856d8e),LL(0x23a0c56d,0x1927e931),
+ LL(0x9c2f8b66,0xacfed288),LL(0x386ad1e3,0x20f6b94e),LL(0xdcbeff77,0x0e622304),LL(0x5978f2f6,0x67e895fa), LL(0x20029bfe,0x12a63bde),LL(0x8d968b8c,0x0ed75b6c),LL(0x57cec33e,0x611739ee),LL(0x42b9fc44,0xeffaae72),
+ LL(0x971a90a9,0xa7de79ce),LL(0x4fead0d5,0x529bd8a2),LL(0x9a1a43ef,0x78434c30),LL(0x4f3c848c,0x904d1db2), LL(0x6d4234ad,0xedb3c11e),LL(0x5975e9a0,0x4e0c9ec4),LL(0xff16ec74,0xc51236db),LL(0x36d09231,0xde652cff),
+ LL(0xe60a0bc5,0x0d7c18b7),LL(0x9d7df012,0xaf041383),LL(0x47d4cfd0,0x9c0ff3f4),LL(0x3d97bac7,0x64c7e6c2), LL(0x8cb44d50,0x239d2500),LL(0xbba96026,0x47189764),LL(0x31ddca37,0x22449328),LL(0xfb7c29ef,0xa53a1886),
+ LL(0x97a3789b,0x2515b665),LL(0x540ea258,0x825c5031),LL(0x09a5b24b,0x76680656),LL(0x60fb8bcc,0x833c240f), LL(0x01e55cc7,0x758e0b10),LL(0x8d260572,0x8b799c48),LL(0x6c5dd0cd,0x0981a802),LL(0x1b9c6cc9,0x6f6da55d),
+ LL(0x8c4d503a,0x3457b685),LL(0x009a7a94,0xc537730f),LL(0xd01dfdff,0x334d46b4),LL(0x15e20bc7,0x3e5dc6a8), LL(0x6ce8b8ab,0x1833b0bf),LL(0xc57a4292,0xe21b99ae),LL(0x1713ba15,0x743cb595),LL(0xe0bb44a7,0x550e41bc),
+ LL(0x2f8ebcf5,0xf356917a),LL(0x953f056c,0x6f2c400b),LL(0xdd84bb48,0x09d9ac41),LL(0xa61e98e3,0x50dc7a8e), LL(0x3d3a6776,0x1179a9d3),LL(0x16de8b3e,0xdda312e7),LL(0xce6e2bea,0x62a8b7c3),LL(0x645e4ca0,0x2b00036c),
+},
+/* digit=16 base_pwr=2^112 */
+{
+ LL(0xab6cf0b4,0x9ad2cbd7),LL(0xf13d1ddf,0x7a1e67f4),LL(0x746003ba,0xa58f0c73),LL(0xa64a8fcc,0x8263e888), LL(0xbe2452f7,0x535cbe37),LL(0x6ae81a76,0x93125766),LL(0x3a553701,0x7d2ed0ab),LL(0xb0717d78,0x93d7e7df),
+ LL(0xf9cf03ba,0x61bc013c),LL(0xfeee3a78,0x36223b88),LL(0x3d7e4c95,0x86efc923),LL(0x965625e4,0xaf3801be), LL(0x3f32fd9d,0xa7bba141),LL(0x4e564acb,0x70724dec),LL(0xb7edcac1,0x52587f32),LL(0xb3969985,0x0b1cd94c),
+ LL(0x661fbdab,0x9f08407a),LL(0x58e52151,0xc4d7c536),LL(0x63dfe954,0xa3765bce),LL(0xac2dddd1,0xc6829bfb), LL(0xdc6e4487,0x97393f65),LL(0xbf04c930,0x9ba29422),LL(0x18838c0a,0x493c6914),LL(0x4b2f35cd,0x41b137ff),
+ LL(0x4e1c5e60,0xc9e4aa24),LL(0x13253d51,0x54bb5289),LL(0x9bbabe53,0xf4a86ab3),LL(0x6ac0aa64,0xd561feae), LL(0x1911bad7,0x27a896ab),LL(0x64337303,0x9cb22b98),LL(0x161f6928,0xf14262fb),LL(0x59ba6c9f,0x1661885c),
+ LL(0xb82574db,0x4666ebd3),LL(0x8d8af3f6,0xc5e86672),LL(0x209319bf,0xcc645205),LL(0x3834d1a8,0xc183c12e), LL(0x49eb0f40,0x533d73da),LL(0x6aca649e,0x3bcab0bc),LL(0xe39e8361,0xa02f4c41),LL(0xa89bdc85,0x2391e7ae),
+ LL(0x608cbe2f,0x88067c5e),LL(0xf16c22f2,0xcdec82f6),LL(0xf1faf9dc,0x80aa719a),LL(0x2340185c,0x261fe951), LL(0x9713e72e,0xcb411366),LL(0x6d8a2a46,0xdb1e405e),LL(0x11106ce0,0xed174757),LL(0xf71c0e69,0x6d70cf6e),
+ LL(0xcf707c76,0xb5310322),LL(0x40b4b7d7,0x3a1eb2ff),LL(0xb1a2d26d,0xb83259fb),LL(0x799720c0,0xa83ffb0f), LL(0x0bedb326,0xeecb1928),LL(0xe9271715,0x4473e820),LL(0x2f2d71a9,0x506e6d20),LL(0x4319756d,0xe7b253b1),
+ LL(0xf576cb3c,0x27e19335),LL(0xdfb3b78f,0xe16e4573),LL(0x63da0001,0xaf96d785),LL(0xf7444c5e,0xb38deafd), LL(0xc0eb0e28,0xaca6b38c),LL(0x7fe41b98,0xa6ca3541),LL(0x18965b31,0xfeb37b47),LL(0x597d5bc6,0x739cc322),
+ LL(0x4cb1fbc3,0x82776041),LL(0x8e2a3ad1,0xcdaa873d),LL(0xc01318bf,0xb5f87b34),LL(0x229cb81e,0x0c692268), LL(0xa53089f5,0xb0724016),LL(0x05415313,0xb2976a53),LL(0xcee8fdf2,0x436eab75),LL(0xd82b13e5,0x8794e1a6),
+ LL(0xd5516e3d,0x0d51a072),LL(0x4b2fdb3c,0x7bae61ce),LL(0x550728ee,0x0d987e89),LL(0xee6778db,0xfd5a656e), LL(0xbb4d9d7a,0x942ee623),LL(0x2dc1baf8,0xfc06d64b),LL(0x47c3dc8e,0x5244fcd8),LL(0x8568653e,0x5e37e156),
+ LL(0x048c8355,0xe5c2c6ff),LL(0xa0474046,0x480872ec),LL(0x7ff92484,0x67e3089d),LL(0x29971b3e,0xdc071893), LL(0x5a63e8ad,0x3857db2b),LL(0x5f2e0a09,0xf617d94e),LL(0x5844de79,0x267e9818),LL(0x861f5f92,0xfdb103b2),
+ LL(0x1570d6e9,0xb969bd3c),LL(0xe0fb517e,0x7350b9db),LL(0x55aa543b,0x083b142e),LL(0xaa2bc581,0x424757be), LL(0x69ea3302,0x4bd50f64),LL(0xed4c8288,0x053dcf83),LL(0xc118ac52,0xac2b3074),LL(0xe76ca88b,0x57f066a8),
+ LL(0x0a3207cb,0xb9ac28fd),LL(0x205829b0,0x0ec2ad13),LL(0x4f403b64,0x76216e56),LL(0x6621dd5c,0x7eaef662), LL(0x4b06ac54,0x9e0cc836),LL(0x9648523c,0x16ac3c6c),LL(0x08eec1d8,0xe1208a1a),LL(0xbe054a54,0x1e90b3a2),
+ LL(0x23a836cb,0xdfab7f92),LL(0x6f7674c8,0x624d6bd2),LL(0xea06210a,0xc34a914c),LL(0xf26c4f23,0xba5314ec), LL(0xa33a11cd,0xd440b196),LL(0x75eb951f,0xf81ab63e),LL(0x39350f0c,0x05ebb91a),LL(0x92e9528f,0x3f3c08ec),
+ LL(0x4fe6f4e6,0x54ff8844),LL(0x79b7ba49,0x217c0e02),LL(0xbf3a4179,0x13c4372b),LL(0xa1434264,0x6e5ad10b), LL(0x62bd8ff2,0xc8426540),LL(0x85fe6ef1,0x7c3dd284),LL(0x05da0e84,0x2c59b300),LL(0x17468e18,0xf303ed94),
+ LL(0xa211ffd3,0xe19fac99),LL(0x3f1f6bca,0x408f9424),LL(0xa5648244,0x1f5b76d1),LL(0x95b2bd67,0xef3942e8), LL(0xb538f1d7,0x1b9dee7f),LL(0x444b8f85,0x1cb78620),LL(0xcb8ea6a3,0x9f8ecd63),LL(0xb9d3b71f,0xca111b2e),
+ LL(0xbdc4e8e2,0xff83d71e),LL(0x3f76a9d5,0x43745ddb),LL(0xa25856ee,0x72db22a9),LL(0x5e9a9ff7,0xf34d5aa2), LL(0xbc529902,0x01f6b5f3),LL(0x086f4867,0xadf5d31e),LL(0xca556b56,0xbd88674f),LL(0xfdc81625,0xfd00120d),
+ LL(0xfdde77f6,0x90fbaba0),LL(0x559ec6e7,0x266d3bfe),LL(0xc8094357,0x372acf54),LL(0x6c61bb78,0x772bd8e4), LL(0x1af9aefc,0xcb2ac592),LL(0x5b178386,0xacc3dc9b),LL(0x23438463,0x09963084),LL(0x8359f1e6,0xae84f973),
+ LL(0xa4cee642,0xc3b19aa0),LL(0xb19a918f,0xcd5ca5c8),LL(0xe67cb207,0x46ac0d2e),LL(0x73ffebf2,0x2ae45e10), LL(0x10ef065c,0xf84aad8e),LL(0x32a7e903,0xa0af57fa),LL(0x43d346dc,0x42295904),LL(0x7f170965,0x8d6f711d),
+ LL(0xb110cffe,0x11aa7070),LL(0x9755605d,0x091a100d),LL(0xd27d86a6,0xc5a0c654),LL(0xdb30feaa,0x1031a244), LL(0xc02228d9,0x36804045),LL(0x8b746039,0x1877fc67),LL(0xe09bb238,0xba554015),LL(0x1de9b40d,0xc50d8f92),
+ LL(0x032f7a2c,0x29e40d88),LL(0x1d315ec2,0x514b56dd),LL(0x61778f04,0x9052652e),LL(0xe1a1c195,0x0d2bc606), LL(0xb05043ae,0x375fd7ec),LL(0x6eba4d1b,0x03b82577),LL(0xc349b39a,0x8e61b567),LL(0xb35fc43b,0xa670973a),
+ LL(0x5571b4a7,0x80c05ca7),LL(0x8a4af0ba,0x95d14f49),LL(0x67bf4290,0x96767cdb),LL(0x46870ef1,0xb293372f), LL(0x1afe1027,0xc6494405),LL(0x9019c4c2,0x9f027a1c),LL(0x188a593a,0xa392ac59),LL(0xfcb6e1ca,0x68acca2f),
+ LL(0x68ed921b,0xd8f86cbe),LL(0x712d2c07,0x24679ac2),LL(0x4e672cd9,0x18fbdb21),LL(0x51d1f8e1,0x401bb718), LL(0xaa8da4a1,0x688792e1),LL(0x3ca93d06,0xedf9266f),LL(0xaed484df,0x5ddba14a),LL(0xb0ea10a5,0xa5dab102),
+ LL(0x833396ea,0xd397edcd),LL(0xed5e6747,0x78a75693),LL(0x1a5f8260,0xf2c844ba),LL(0x5fb9fec5,0xbcafe59d), LL(0xd3147e7e,0xa2413d5f),LL(0xafdf26cd,0x130dd9e3),LL(0x9ad1abde,0x44be87ec),LL(0x6e77fbe8,0xe925c495),
+ LL(0xf26ced16,0x07ce8d96),LL(0x86ef7306,0x36c85643),LL(0xc7e3d409,0x62545902),LL(0x2ed4d38e,0x1747bf4a), LL(0x55adc839,0x6fe6fc3d),LL(0x8eaf64a8,0x20a3cc09),LL(0x622887b1,0xc1e9b766),LL(0xc41ac659,0x7b9d2f96),
+ LL(0xf2a65e45,0xfdb897ce),LL(0x97889eb8,0x0c09c905),LL(0xe4becf5b,0xa15df10f),LL(0xccef7e40,0x14a3d4fe), LL(0xa8fc67bd,0xedaa11f6),LL(0x5d185b42,0x7bf6fe9b),LL(0x6f9cb5c9,0x7bb9f1f5),LL(0xf97ea9cd,0x1b4ab74e),
+ LL(0x07638d62,0xe9ebf11d),LL(0xa78cf538,0x413a4a87),LL(0x570dd371,0x93785f86),LL(0xfb48063c,0xba431a91), LL(0x4ed4e5fa,0xf1f2ea5b),LL(0x5308325a,0x91a72c47),LL(0xc9ea6acb,0x4e6518e7),LL(0x208f67e3,0xfeaf4c3c),
+ LL(0x2c16bb1a,0x98c5d768),LL(0xee31dc08,0xbf91b62d),LL(0x33a54959,0xe9ad408d),LL(0x38b7170b,0x9d754a64), LL(0xd9d6da2b,0x106db7bc),LL(0xadd533af,0xf556cbb4),LL(0xf16d3b58,0x62db0de0),LL(0x1fa579ba,0x78a1b0be),
+ LL(0x7b552058,0xda96740b),LL(0x626c4d93,0x0c689cc6),LL(0xaf68e53b,0xee3dd5c9),LL(0x134d763b,0x78653a9f), LL(0x3ca5aa67,0xec9c1b72),LL(0x7d56992e,0x67471dac),LL(0xad1d8580,0x0a97dffe),LL(0x0063c040,0x11c7d93d),
+ LL(0x6e90b157,0xb79e355c),LL(0xd9c894c4,0x2c06edcb),LL(0x71a75ed7,0x9b931897),LL(0x8e95ad91,0xd7f00247), LL(0xb85bf054,0xfce1b489),LL(0x503b38bf,0xa3ffb8fd),LL(0xe0fe2ec9,0xe7ea3ad4),LL(0x0049865d,0x0f32f520),
+ LL(0xcff21b51,0x33afa324),LL(0x62a1cd24,0x3d6847d7),LL(0x0b06ce2f,0xf534e159),LL(0xae7cdae0,0x24d27b3d), LL(0x4ad68ab5,0xb727db29),LL(0xb63c0bc9,0x7e8e47e3),LL(0x02389039,0xe81f3122),LL(0x88e6a17c,0x0c281f52),
+ LL(0x091e1c4c,0x3cc00e21),LL(0x867ccc75,0xd500db44),LL(0xf5ebbbe4,0xa8e2e84b),LL(0xc4279ac0,0xc3266881), LL(0x7a170658,0x2e8fb4de),LL(0x51da4a2e,0x219c5ec1),LL(0xeeacee19,0xda69a3fd),LL(0x30462243,0x9d4c6fbd),
+ LL(0xa978c29e,0x43673fe8),LL(0x5861bbc1,0x6e825c95),LL(0xdba8e7ba,0xb41d1435),LL(0xb885d004,0x0f286f78), LL(0xee57436f,0xea42b7fd),LL(0xef7e29c7,0xcdae14bc),LL(0x24251056,0x50cff3f0),LL(0x6f6e8cb1,0xf60809fe),
+ LL(0x12932e53,0xee9f1d15),LL(0x167d5097,0xa6e55cd6),LL(0x9d926359,0x5df8816d),LL(0x797b7eca,0x108e2117), LL(0x91921587,0x7ba20319),LL(0xad23652e,0x304138e4),LL(0x51ebc32f,0x73d0ed57),LL(0xf01d0fc3,0xe0c10a38),
+ LL(0x78c49b19,0x14c6b72f),LL(0x3b7c7418,0x4f952b7e),LL(0xa2d019bf,0x3fe75d21),LL(0x7ca33e87,0x4837bfd2), LL(0x3946e7ea,0x4597729b),LL(0x4c37ea10,0xbe22c14a),LL(0xd7909474,0x91106c7c),LL(0xbf5551a1,0xfbf1e7db),
+ LL(0x55ffea13,0x8e06336c),LL(0x0a1f99f5,0x0deaeda0),LL(0xfda98fc9,0x9b738c4b),LL(0xa59c98ba,0x061cc613), LL(0xb477692c,0x5ceb5b83),LL(0x1fcc473b,0x5db77559),LL(0x83df476c,0x77214b62),LL(0x427ea01d,0x2ffac971),
+ LL(0x49fd0ba7,0xf29f600b),LL(0x7233ef79,0x1106f8b2),LL(0xe8a0ca35,0x706bc171),LL(0xacbff08b,0x4da7a9e6), LL(0x7725f97c,0x17c2fa4e),LL(0xe84a5095,0xab459314),LL(0x6b24d47e,0x01556f14),LL(0xb016dc1a,0x01399059),
+ LL(0x28eca6c6,0x154b84c7),LL(0xd9084e68,0x88ed8612),LL(0x00bf9b5b,0x4dfd5080),LL(0xba9a0cca,0x853cd8ab), LL(0x8af0e94b,0x8cbf9bd8),LL(0x83035d16,0x50782b73),LL(0x4f44533c,0x694d3e65),LL(0xa6e534eb,0x155d4bf4),
+ LL(0xee908b6b,0x9028e2ab),LL(0xa6743060,0x36e5aac0),LL(0x3c37d6f1,0xd26f5a51),LL(0x33729b9e,0x8483703e), LL(0x2e5f82a5,0xf27a6603),LL(0xca55d187,0x33bf2bdc),LL(0x7724a85f,0x894c415c),LL(0xa2ea178d,0x9255d416),
+ LL(0x0a6dc5b9,0x35ecb4e2),LL(0x51c54ed2,0x8b3fc2c8),LL(0x9eede13d,0x059f86eb),LL(0x791dd5eb,0xa796c750), LL(0xea88555b,0xb2f33680),LL(0x1245348c,0x92730950),LL(0xd1e63bfb,0x1a5545f8),LL(0xbebb7858,0xfebc9a14),
+ LL(0x6bdf0c84,0x13cce767),LL(0xa1d341fa,0x1aa9dc07),LL(0x1ee6fa43,0xd46e8ff6),LL(0x4b1dda64,0x4198e5d6), LL(0x2782abd1,0xe82a8134),LL(0xb6d64830,0xe6f7b1b4),LL(0x7f0fb374,0xabe00274),LL(0x7494d7d3,0xf1a8e2b7),
+ LL(0xf274f296,0xd16b0d9e),LL(0x65246ee9,0x3c94a7ac),LL(0x91ec2262,0xd32c32da),LL(0x83116ec1,0x04c7bb90), LL(0x78524a06,0x70fa0406),LL(0x07df8064,0x8d2d5176),LL(0xe2c8d48a,0x13e589f2),LL(0x122aed4e,0x3b110ac4),
+ LL(0x34e972cf,0xe8e0eb52),LL(0xfb3a77fe,0xc082944a),LL(0x6a32c23b,0xcdaff7a3),LL(0xc37b4a2c,0x88cc568d), LL(0xe27b2552,0xc9979a9c),LL(0xd6ef51f9,0x8612ae7d),LL(0xef4e8f85,0x7bf0f937),LL(0x3f12d45c,0x2f360a58),
+ LL(0x9b336663,0x3ec9d0e3),LL(0xb1438d2b,0x5ac2df38),LL(0xff93fde4,0x7f2de910),LL(0xd92534ba,0xbbc460da), LL(0x59a94ab9,0x74de3159),LL(0xc45b80dc,0xd51cfd32),LL(0x6e5b2397,0x9f1f349c),LL(0x995f7271,0xbdbd16ed),
+ LL(0xf59709a6,0x4a7efc1c),LL(0x4b3db99a,0x74e2760d),LL(0x7726a2e1,0xa7238e9e),LL(0x1a376013,0x47764208), LL(0x7e33ebc0,0xbc96f396),LL(0xc9e4ec0d,0x31e159e6),LL(0x6a2ab9f6,0x26a5aef2),LL(0x320eeea7,0x23add07c),
+ LL(0x833b45b6,0xa79a97c9),LL(0xc51885e6,0xb08da907),LL(0xae8d5659,0x23f5e651),LL(0x1faff2f2,0x1eb0be48), LL(0xa1e090da,0xe414ee3d),LL(0x7fcb664f,0x16e4f8fa),LL(0x98c36865,0x7a15a7e4),LL(0xaf89dacf,0xea60e8fd),
+ LL(0x86c1a4b4,0x4e009f45),LL(0x769644ad,0x78c1bebf),LL(0x0b4b3501,0xa41b480f),LL(0x57f0a0e9,0x98be5037), LL(0x3af24657,0x06934887),LL(0x2b6260f9,0xe2503ddb),LL(0xd1d0caaa,0x37c936c2),LL(0x16431f50,0xd371e991),
+ LL(0x6087c5e5,0xd9621d16),LL(0xc53a8bc5,0xae49c2ce),LL(0xcad314cd,0xd7868882),LL(0xaa57af18,0xfde10dc7), LL(0x3800f397,0x3fa8a60d),LL(0x388b333c,0xcec8ae7b),LL(0x85fa8129,0xefd8d692),LL(0x90776c32,0x33d5685b),
+ LL(0x65971a6e,0x47ecec0a),LL(0xad7c5755,0xe8a20bbe),LL(0x87372016,0xbeed0a4d),LL(0x1d9b8dc0,0xd0d499bb), LL(0x2800907d,0xf4ce27cd),LL(0x8622bbb7,0x07a30b77),LL(0x77e264db,0x7532f435),LL(0xd64f0710,0xfdd1a9c3),
+ LL(0xa6543720,0x92ca210f),LL(0x5bb6985a,0x2f19ed66),LL(0xf9399b43,0x08a4ac61),LL(0x757f241d,0x0b7bac5d), LL(0x3763c20d,0x93ef27cc),LL(0xa86b1f05,0xda3b206e),LL(0xd62467c0,0x8f19c74a),LL(0x6a3ad263,0x3ec5ef6d),
+ LL(0x2bc8b9f0,0x249aa636),LL(0x7f70990c,0x0fca7318),LL(0x6f038497,0x6d4aabc5),LL(0x5afaaaef,0x4647f72b), LL(0x7bf90444,0xc7cbe03a),LL(0xcac2efb0,0x6beb69ac),LL(0xbb3c6dc0,0x58544eba),LL(0x96aefc2f,0x569cdcd6),
+ LL(0x5e4c950d,0x2e8a4c57),LL(0x4dd32002,0x6f5341d7),LL(0x6efa5908,0xd0345db6),LL(0xf1d2bbe6,0x4b043197), LL(0xe8730bae,0xde8a4cb6),LL(0xa485cb62,0x9a89231f),LL(0xfcd9bcd4,0xb24ace89),LL(0x3ed5801d,0x01892cc0),
+ LL(0x413408f9,0x80ce2f30),LL(0xf8773b6a,0xaf67343a),LL(0xdd6ade17,0x91acc6d2),LL(0xe5eb3def,0x9d2ffeca), LL(0x50b029fd,0x72f8af06),LL(0x79c0aabd,0x339c802c),LL(0xafc0a6ad,0x46161fff),LL(0xbac9a2d4,0x1046d9f8),
+ LL(0xab920e51,0x2f12eb06),LL(0x2892e552,0xfc004900),LL(0x13e61154,0x9aadf93e),LL(0xabcfd127,0x4468da94), LL(0x152f220e,0x6a5d3ffe),LL(0x4737fe79,0xe6260c23),LL(0x5e6b4251,0x8b5dd1c9),LL(0x9af02b98,0x044f0656),
+ LL(0xa97ff366,0x434d475c),LL(0x2c4bcc46,0xbae8db8e),LL(0xf9777251,0x2ba43a8b),LL(0xdd019f1a,0x7ff430a5), LL(0x630064ba,0x65e9f290),LL(0x7e871c0e,0xfc57a54e),LL(0x5791ae48,0x54107bbb),LL(0x5c334de0,0xdfce137f),
+ LL(0xaed5be73,0xab65c8f6),LL(0x174bf00b,0x838c3958),LL(0xf1c7e594,0x27c57199),LL(0x0d02fae6,0x62643d81), LL(0x5f4431fa,0xc1e70c12),LL(0xb2b41f7e,0xfac86124),LL(0xf0108e3c,0x062ac35a),LL(0xa43d3a28,0xd7d34dfc),
+ LL(0x3143de4d,0xc40fb44a),LL(0xd2e0f9ae,0x06eac4ed),LL(0x95d9a69a,0x998f3211),LL(0xe950bd2e,0xb268f6a0), LL(0x1e9d4e40,0xadfab210),LL(0x73ce9324,0xc453a68c),LL(0x80881171,0x5e2f2544),LL(0xee7e543e,0xe4f596db),
+ LL(0x76b6698e,0x77f48e4e),LL(0x227365c6,0x47b5165f),LL(0x14ef39e6,0xf56ec8d4),LL(0x74ce46fa,0x1638d647), LL(0x08aa8b9a,0x244d0fac),LL(0x298326c9,0x98ccc4d0),LL(0xce0d2983,0x492d7661),LL(0x73158cda,0x728b3e3f),
+ LL(0xc4948011,0x7959ca67),LL(0x08425a38,0x32044ae9),LL(0xb1070c2b,0x05a7a6a7),LL(0xcc129ba5,0x34ed541f), LL(0xb2f1c3e2,0x4b6bf65c),LL(0xd0d8aec8,0x6f090ce6),LL(0xd4fe39c1,0x11ade23a),LL(0xa5a35528,0x50510c08),
+ LL(0xad6fd7c6,0xb7e2a5de),LL(0x2745dca8,0x9d691939),LL(0xad053184,0xff669c38),LL(0xecd0703e,0x394ca6b7), LL(0x60b15e75,0x59e32e80),LL(0x13c14864,0x82dde889),LL(0x64d4f086,0x0fd1624c),LL(0xc9893d7f,0x7fb502a7),
+ LL(0x711479a1,0x59b86bcf),LL(0xc40b44bc,0xfd4bc4d8),LL(0x988100c3,0x2fae18f5),LL(0x615867d7,0xe4af2f4f), LL(0xbe479e28,0x7d45e1e8),LL(0xa04798a5,0x547accbd),LL(0x1c458b5e,0xe88a85b1),LL(0x6032f0cc,0xe144f7f2),
+ LL(0x3f807365,0xad5276d3),LL(0xb318a6ea,0x5b6519e7),LL(0x2d0fcf50,0x5889cbb5),LL(0x2bdab4e0,0xdce91cab), LL(0x41b78954,0x17b6249f),LL(0x6f10449b,0xc9320b65),LL(0xf264ae8f,0xe38a7cc0),LL(0x52b85829,0xaab8803e),
+ LL(0xdd97973c,0x63668621),LL(0xd04138c7,0x5aaedce7),LL(0x1762874c,0x8e8e6614),LL(0x163fc862,0xd0cefcf4), LL(0xffed1ace,0x0ebe0048),LL(0x7a8c2673,0x070c3348),LL(0x9b0d3fd7,0xb801d159),LL(0x922d4842,0xf1d55911),
+ LL(0x680dcbf9,0xf0acf768),LL(0x4f0a51df,0x5072b825),LL(0xd88df9c5,0x3a74751c),LL(0x1cc1a332,0x9d20f989), LL(0x6926c34a,0x4e90042b),LL(0x00766880,0x5c728b1e),LL(0xf76e9dcb,0xf2e3bfe8),LL(0x15a125ae,0xd9822f0a),
+},
+/* digit=17 base_pwr=2^119 */
+{
+ LL(0xf51b14b0,0xbf84db58),LL(0xa39a79f0,0xdf73ccf5),LL(0x2b5a1f11,0x0ce1e584),LL(0x185fc400,0x841fa6a3), LL(0x2455c32a,0x94b09c68),LL(0xbfa71cc3,0x383c9bde),LL(0x1e797929,0xb6381486),LL(0x623d0a5d,0x33036faf),
+ LL(0x90f17cba,0x41b6cf7c),LL(0x30c7c5f4,0x5d655ff4),LL(0x4ccc7f38,0xc64f29d5),LL(0x6124a79e,0xf28e8531), LL(0x67bf1e98,0x1efa8d51),LL(0x5d7a33b0,0x8610027f),LL(0xcb9a40a4,0x35fe2bb2),LL(0x43d50a0b,0xc5cc1bf1),
+ LL(0x46e33870,0x84dbc605),LL(0x843c4e1e,0x23d8d2e5),LL(0x4cf8b569,0x69964b5e),LL(0xe0c546a5,0x2a5228e8), LL(0x96d6e111,0x4c0467ed),LL(0xa12bd298,0x25764cdf),LL(0xfbaaad46,0x92a3e7fa),LL(0xd12fa469,0x08ac1d36),
+ LL(0xa32106c2,0x60ae2bbf),LL(0x3e917750,0xef155b2a),LL(0x13853a30,0x5567c3c7),LL(0xeddb305b,0xa6be8290), LL(0xade26eec,0x2db58c21),LL(0x003c17ed,0xfa3c895c),LL(0x6293f8a2,0x96ab0de1),LL(0xac3710c6,0xbd2365ec),
+ LL(0x6aa24f73,0x93ea8553),LL(0xe0410c40,0xf75140d0),LL(0xaff0f7f2,0x760cfa2f),LL(0x3e580d68,0xc6dfb3c7), LL(0xc16d39e2,0x25fc2091),LL(0x19e1d5e2,0xa05b0c81),LL(0x62bbec7a,0xd4d223d8),LL(0xf293f34a,0x11a93775),
+ LL(0xe194c642,0x9ab03e73),LL(0x789e3c85,0x607b7106),LL(0x4bdacd55,0x952aab02),LL(0x21cc6084,0x31ca3ee2), LL(0x1c6b93f9,0xd3149b2b),LL(0xead930f8,0xcbc5ef3b),LL(0x22872630,0xed04984f),LL(0x6c4b6fe2,0xef5d052d),
+ LL(0x6010ffa2,0x808ae6c0),LL(0x1143166a,0x88b6fcd8),LL(0x5ab945ec,0xa2780263),LL(0x36db5012,0x4777b4aa), LL(0x059aa3c7,0x2156bf83),LL(0x2a660260,0xcbef6fb7),LL(0x8b366ce5,0x189fa221),LL(0x08290914,0xd6f5bdaa),
+ LL(0x57028677,0xd2028d05),LL(0xce9aabdf,0x90eebeeb),LL(0x06d4e5d0,0xab977aee),LL(0xf9361873,0x7a98c527), LL(0xb7c2474d,0xe49b1251),LL(0x5f3e7b02,0xcdaf2a36),LL(0x6fe54af1,0x638bcaf4),LL(0x1dac06b7,0xfec42624),
+ LL(0x3741a88b,0x422be225),LL(0x5304f139,0x1f3b82c3),LL(0x181c2fc2,0x101eab8e),LL(0x5898163c,0x8522738e), LL(0x2d2bac1b,0x0372d05f),LL(0x1d1f3c42,0xb65c786c),LL(0x64e2f5b3,0xbd59694b),LL(0x24c5671b,0xf1c424bf),
+ LL(0x1eafe37b,0xda738cf5),LL(0x30dd7c2b,0x503eac24),LL(0x11dd77af,0xf9b7b7a5),LL(0xe9dcfe7c,0x0ade03af), LL(0xf479e3b5,0x489bd34a),LL(0x030a33f3,0x993ab403),LL(0x9fb64068,0xaef322bf),LL(0x0e27f110,0xa47cc71b),
+ LL(0xefab99c8,0x1c445554),LL(0xa7f10e58,0x7c3c51e7),LL(0x78a87474,0xaa8b43ee),LL(0x2418475a,0x037d6397), LL(0x10324911,0xc9c751fe),LL(0x3e0797d4,0x3d65d9e0),LL(0x7dea2a63,0x98b68d2b),LL(0xf4afca19,0xa211ed3b),
+ LL(0xc63b9e75,0xe19ff8f8),LL(0x0d7d130a,0x43f6b4fc),LL(0x7c8490b7,0xdba3385d),LL(0x0252c14a,0x97889df7), LL(0xb2f18b9f,0xfccfca86),LL(0xc3a87422,0xf092ff9e),LL(0x67474838,0xf96dd675),LL(0x5bad2e9f,0x039e8287),
+ LL(0x52e041f6,0x7ed85e70),LL(0xcfdeb19f,0x3d6ef1e7),LL(0x0d9ac66e,0x9f9fe399),LL(0x16cb8554,0x5825e7bf), LL(0xd954a4d5,0xecffdf90),LL(0x20678fc5,0x8617ffdd),LL(0x666df77b,0x3e974054),LL(0xb5d92788,0x748379d1),
+ LL(0x2da32c0a,0x46a60911),LL(0xb2676ca3,0xb2e1ac32),LL(0x17614dc6,0xfb74093f),LL(0x3f27f965,0xf44939e4), LL(0xc922422b,0x4656a402),LL(0x3ff5c56f,0xd60a55ba),LL(0xab9aa62e,0x0d061b41),LL(0xaca3acd2,0xc9ceacfe),
+ LL(0xd946003b,0x056d5718),LL(0x2c7815f3,0xf8530d6d),LL(0x706536b8,0xbae14342),LL(0x2b901188,0x45c96dda), LL(0xc64ed946,0x386d88b6),LL(0x6c00f1c2,0xb7017022),LL(0xec8988df,0x28519811),LL(0x5a05cffc,0x3b011fe2),
+ LL(0x515f954c,0x4f581d47),LL(0x7f470a40,0x145f925b),LL(0x736feaaf,0xfee6b6b0),LL(0x2ea5743b,0xf90744af), LL(0xa2f36f56,0x4d8e8cea),LL(0xe3ed4007,0x4239a6ce),LL(0xd515e6db,0x0906b5bd),LL(0x8ac973d1,0x53622990),
+ LL(0xeb2fe229,0x472ceb94),LL(0x6a121363,0x0775ed41),LL(0x761ddb38,0xc0492e07),LL(0xaef9be2f,0x80c24d51), LL(0xdcba73a1,0xa2a3982b),LL(0x4e26d062,0xe0d83978),LL(0xcd41c930,0x794959a8),LL(0x70131161,0x7d2a88d7),
+ LL(0xf4f966da,0x48f93fc3),LL(0xed5b6487,0xf92691a0),LL(0xada2c1fc,0xc5a93e5d),LL(0x4b7d9243,0x4a7aca52), LL(0xd7c5598b,0x810aba93),LL(0x25109638,0x98f9ead2),LL(0xa388481a,0xe8c6e893),LL(0xe91ce74b,0x56e96b9b),
+ LL(0xd935f591,0xfa1e5dc3),LL(0x555eb816,0x985bb06c),LL(0xc4d14e69,0x6478c518),LL(0xc7f47349,0x48afbdbc), LL(0x26fed96c,0xbde90933),LL(0xcd468186,0xf9b96f41),LL(0x730e8518,0x22de6a29),LL(0x915db842,0x7a3dc912),
+ LL(0xfc1f9449,0x8d13b665),LL(0xdd4bba75,0x6e9932a9),LL(0x564083da,0xa90ce8e5),LL(0xbbf7989d,0x8a7cf362), LL(0x1b07ee2f,0x652eccb7),LL(0x6857a141,0x0c0dcf1a),LL(0xb7bfb43e,0xa87ec410),LL(0x82b8d179,0xaebdb7e7),
+ LL(0x625a24dd,0xeb3bc468),LL(0x463b1f89,0x7e45e47b),LL(0x00c75a48,0xc3013535),LL(0x13778807,0xafea920d), LL(0x22dcef16,0x0d1e9277),LL(0x86cecfd6,0xa2a10f67),LL(0xd7160bf2,0xad40e29c),LL(0xeac1265e,0xe78e6589),
+ LL(0x0c62c041,0xd3a24310),LL(0x6c03c747,0x4d27344a),LL(0x7d3ee9d1,0x0b19e4a6),LL(0xcd90de33,0x9cf2eccd), LL(0xfda636a9,0x673a9d1f),LL(0xa86ee501,0xb7349981),LL(0xe43766ed,0x11ca1e49),LL(0xe3ff3b08,0x0806af6f),
+ LL(0x8a01f119,0x21304338),LL(0xf3cb268f,0x58a6d3be),LL(0xe37d7851,0x40ceacca),LL(0xef5b81e8,0x18694595), LL(0x84bad32a,0x35678ed7),LL(0xd1624256,0x4f280f92),LL(0xfb28709c,0xdecb1f1e),LL(0x164911d7,0x2a7f3048),
+ LL(0x579d8a41,0x32551d31),LL(0x60a5ee33,0x754c7c24),LL(0x6a88f85f,0x2c53fbff),LL(0x2c7a36a0,0x6ad0bda7), LL(0x15724d6c,0x8b3674f8),LL(0xb9b7b34a,0x614727ce),LL(0x82ca9cd7,0x384fba98),LL(0x0c566025,0x8ef4343c),
+ LL(0x64886c98,0x5645fefb),LL(0x0f5c29e8,0x702befb3),LL(0x46de1523,0x6d74a7e0),LL(0xb1302163,0xcb2bcdb9), LL(0xab4ca69b,0xe65cff39),LL(0xf2d4f6ec,0xeacb7103),LL(0x1770d3ef,0x15826c2d),LL(0x3f710600,0x38b008f1),
+ LL(0x4bc7dccb,0xc68450cb),LL(0x9e5f2400,0xb5f11b26),LL(0x9c3a833b,0x2af58e9e),LL(0xa058abaa,0xb60e2672), LL(0x75b080c0,0xe891bf8c),LL(0x2434bf38,0x5b09b276),LL(0x700b8739,0x0d90a040),LL(0xe69f4a0b,0x995cb042),
+ LL(0x44a56b84,0xe30df0a1),LL(0x1ead5a62,0xbaf92d16),LL(0x6e0193a4,0xe214a062),LL(0xe9758b9e,0xd41de5bc), LL(0x732d82d5,0xcf214213),LL(0xf949f07b,0xaa1421f6),LL(0xf7fb101c,0x5f38c91e),LL(0x2a3e41e4,0x47ce2ec2),
+ LL(0x240c7897,0x6bb34768),LL(0x7b45473e,0x80ff54ea),LL(0x82fe5aac,0x16acd40f),LL(0x4350449f,0xa3e76f52), LL(0xacacbeb9,0xf7a3579e),LL(0x7bc40732,0x9791e0e0),LL(0xbc58cb9d,0xb26da7b5),LL(0x987e18f4,0x11d9fc80),
+ LL(0x1d8e0d34,0xc3c189a8),LL(0x2d42e0b5,0x3011097c),LL(0x94ab9371,0x4e385932),LL(0x0c237147,0x79e0c2ce), LL(0x7172e6ce,0xc9f17122),LL(0x9b89a008,0xf8d73b1d),LL(0xa945995d,0x91690c6b),LL(0xc15306c6,0x089eb941),
+ LL(0x12ac8df5,0xee5f526d),LL(0x3bf94c65,0xf1dd23f7),LL(0x81a3cb0e,0x594ceaac),LL(0x9757cc8b,0x07d41d3b), LL(0xfc5603d5,0x9eb0081d),LL(0x57bd230c,0xfb5d3298),LL(0xcde3f845,0xf2c0402e),LL(0x41e8aba6,0xa2defd67),
+ LL(0x2dd9573d,0xb300802a),LL(0x60c1ded3,0x64e401a5),LL(0x8ab1d3d8,0x19d4a677),LL(0xcca04f74,0x3c2092f2), LL(0xac40056a,0xf4827ba5),LL(0x9c09ddc2,0x49d4cf22),LL(0xdbf20277,0xb2b00f6b),LL(0x5b281e9b,0xc9ac48d4),
+ LL(0x32efbbce,0x648d6674),LL(0xe9639719,0x64a6c2b3),LL(0x30662e7d,0x38c04657),LL(0x352c9184,0x15d1d7ca), LL(0xcc3020cc,0x70e8630c),LL(0xb09f038f,0xe4b56c9c),LL(0xfe76a744,0xdb9cb5ed),LL(0x6947b988,0x4c85f020),
+ LL(0x29d8add4,0x7e500126),LL(0xbfaf6d7e,0xdbcfd295),LL(0x38df80be,0xc1a1c228),LL(0xf606ce3d,0xcfa6272a), LL(0x8e0af540,0xbf2a5720),LL(0x5b599ab0,0xb9c544fd),LL(0xd0a22c9a,0xd6dc994d),LL(0xd23e4c0e,0xa8a12acf),
+ LL(0xba588a5e,0x41f7ac85),LL(0xccdb9687,0x5425fa00),LL(0xec9398f0,0x12fbce76),LL(0x4f550b9b,0x2ad69251), LL(0xbb318636,0x120ff0f2),LL(0x01ecd90b,0x9378346c),LL(0xd0ba149b,0x1b98fe99),LL(0xc9c481c8,0xd69d5462),
+ LL(0x959e428e,0x11c79184),LL(0xcff227cc,0x9de61a8d),LL(0x1e09b860,0x144dfdcd),LL(0xf8ebe350,0x110c3a47), LL(0xfadf86b0,0x59e574dc),LL(0xcf3b8d30,0xe6ff6e12),LL(0x19c77143,0xe2d512fc),LL(0x60279af1,0x63461543),
+ LL(0x32b4d371,0xff65189c),LL(0x0faf5ba7,0x022fecca),LL(0x414707b4,0xd08fe9bf),LL(0x722d5fd2,0x0ef8af2b), LL(0x4e6fa14a,0xbef06063),LL(0xcca29177,0x1c41f752),LL(0x65091fe1,0x17dc7e18),LL(0x23f13c18,0x693d72d2),
+ LL(0xce8e2d30,0xce88eb02),LL(0xe972faca,0x7071f98a),LL(0x549c38ee,0xb7388d61),LL(0x0b788b8c,0x7cfccee2), LL(0xcb93b5e8,0xdc470705),LL(0xab96d485,0xea053c18),LL(0xd634c9b3,0x70e96456),LL(0xd5999cf2,0x2c58c20b),
+ LL(0xa77c1767,0xcd392b3c),LL(0x7c4e6bd9,0x14471fab),LL(0x75c905ff,0x312e1547),LL(0xace47038,0x45764654), LL(0x8fc3d697,0xa34a0b0e),LL(0xd309ed3a,0x5d9ad31a),LL(0x0918f957,0xbba340c0),LL(0x31fd72a1,0x768e06e8),
+ LL(0x3e1a4a54,0x77e5dd92),LL(0x3fdbc1e1,0x0970719f),LL(0xb0371fe2,0xd4f1da6f),LL(0xfd7f895a,0x3635f433), LL(0x411c8e6f,0x0e8e40e6),LL(0xec18103c,0x31d126bd),LL(0xc299d7cc,0x415a0cc1),LL(0x3a8e97f1,0xdf528e7b),
+ LL(0xeed95e91,0x4551a8c7),LL(0x32bcfb03,0x8de89888),LL(0x2eac5c3a,0x25da4f5f),LL(0x5f88d63f,0x6d0b2e25), LL(0x575d6145,0x8d158d14),LL(0x345f62b0,0xe5601a6b),LL(0x113c6895,0x6f951699),LL(0xb87e50ef,0x79e29fd5),
+ LL(0xd5fa51ff,0xf1ab215c),LL(0xaf2c3094,0x4fc5c4ea),LL(0x2c006042,0x1baeda40),LL(0x3e30e75f,0xcdfcc37c), LL(0x467f57eb,0xdd64e5dd),LL(0x22902d21,0xa5b13731),LL(0x1c52cb7b,0x856866dd),LL(0x16a08caa,0x05cf0f7a),
+ LL(0x533b4d09,0xa46e8a55),LL(0x4e073af1,0xfc803998),LL(0xe0d589c3,0x8e3825c8),LL(0x4c1daef3,0x505e8e5d), LL(0xc5f3db12,0x9f8363b1),LL(0x74f569e2,0xe7d46700),LL(0x4d68461a,0x551fd2ed),LL(0xa8bbe83d,0x26248da5),
+ LL(0x65681dbd,0x8d90c47f),LL(0x2200ba6b,0xe726d25e),LL(0x65a3bc9b,0xa2fe408f),LL(0x9c443b57,0x94a80457), LL(0x07364677,0x95f7f024),LL(0xdaf0fb34,0xe9d9bc87),LL(0x5588e979,0xe9082548),LL(0xa0e61ff2,0xede1f94d),
+ LL(0x45e1c230,0xcb89a1e8),LL(0x50a15304,0xee014c23),LL(0x2bab57e1,0xf25d8ffa),LL(0x26223c6e,0x8a920680), LL(0xaadf7e6a,0xc5abb7af),LL(0x9e7d8da5,0xcb57c893),LL(0x7d589a91,0x839bcda0),LL(0x77e82027,0x1fa774c0),
+ LL(0xba6504d7,0xeca669cf),LL(0x6845e47d,0x7bf09544),LL(0x607b3641,0x5eb6c33e),LL(0x64bab450,0xf445556e), LL(0x86096fde,0xed0b1c02),LL(0x8ea41693,0x2c5ba666),LL(0x37ec248d,0xe578b315),LL(0xf64ed28f,0x97ef44fe),
+ LL(0xce419462,0xfa5a6c46),LL(0x9cce80e9,0x29336dc9),LL(0xeee7617f,0x9e9054b9),LL(0xf3d51cba,0xcea9a100), LL(0x13267ec6,0xc3cce5e8),LL(0xa4e807e7,0x650c8383),LL(0x9b2726dc,0x1338e22e),LL(0xbf79b47a,0x220c50b2),
+ LL(0xa0e0962a,0xe160d496),LL(0xe1ed5cdc,0xe1a26460),LL(0x31427c62,0x9a1ed8c3),LL(0xe99a096a,0x65ef5300), LL(0x4e3ad558,0x38abea5f),LL(0x0880ba0c,0x03bb15e9),LL(0x0141b036,0x1e6dda7e),LL(0x5bf37669,0xd31b08bf),
+ LL(0x68da20d2,0x948e0366),LL(0x4108fe36,0x36998a24),LL(0xf9d6563b,0x7606e6ed),LL(0xe42172ba,0xcf7cbdd3), LL(0xa1265b99,0x2335a9a4),LL(0x30ac3f69,0x64776cdc),LL(0xa59b595e,0x04040362),LL(0x2cbc03cd,0x82df96b9),
+ LL(0x6cea2796,0xe9d18c7f),LL(0xe1ea7e35,0x3112c4f6),LL(0x5f8a786d,0xf9cbc205),LL(0x2097da0d,0x36cc6d42), LL(0x2153e665,0x54093350),LL(0xce937bb9,0xebe9db0f),LL(0xd95942f8,0x9d1a5972),LL(0xd4bd5c74,0x81c1f94a),
+ LL(0xaa04152e,0x61dc7318),LL(0x95e5ec9f,0xdf636db1),LL(0x48090850,0x64a80d46),LL(0xce890a30,0x2b37679e), LL(0xff6025e3,0x9f46d5b9),LL(0xf24534dd,0x6eed5a44),LL(0xf740a84b,0xc56b5cb1),LL(0x228cc826,0xb4641c28),
+ LL(0xaf62b943,0x676289be),LL(0x1eae5409,0xe3f3810c),LL(0x04b5be78,0x73613f32),LL(0x398b556c,0xe6359179), LL(0xc0263f77,0x6a342b12),LL(0xc10a6db5,0x6b093bbd),LL(0x29832fb9,0x8f3fc90d),LL(0xff03b2ff,0xb3f2d8fc),
+ LL(0x64457331,0x1de7bd1c),LL(0x43bb1380,0x0a03a06b),LL(0x8bf17419,0x6720cc3d),LL(0x33938d5a,0x2627c7da), LL(0x8d98f34c,0x204da058),LL(0x51cbd284,0x80e29f46),LL(0xa46f93d5,0x11b22dd4),LL(0xe971a61a,0xd7341655),
+ LL(0xee69f782,0x36a748b7),LL(0x94f08ac0,0xa3740020),LL(0xc36099f3,0x383fb245),LL(0x00137fdc,0xa7cb0ef9), LL(0x6e1dd2e5,0x5371052f),LL(0x7976a1d3,0xed3ab7b5),LL(0x9df822e6,0xb0119c0d),LL(0x358685d1,0xafd2a477),
+ LL(0x4ae1103c,0x82879cb0),LL(0x94385be6,0x61cd6ca8),LL(0xd85d4a62,0x7c551809),LL(0xb318d965,0x9632ac5f), LL(0xe1340605,0x67baad2c),LL(0xac6ed4f7,0x39c2c8c7),LL(0x71211c2f,0x42c4a7b1),LL(0x9bf758f6,0x43c778bb),
+ LL(0xf519acb2,0x2dc8fc39),LL(0x08eff177,0xd3c30a6d),LL(0x5144484b,0xf889c021),LL(0xca376af3,0x01b82327), LL(0xd3e71253,0x168a0b2f),LL(0x3f9ff89d,0x5e92c6ba),LL(0x5b4c6844,0x8c74c132),LL(0x33de6858,0x707c4a40),
+ LL(0x9c36dd9e,0xb13f6abd),LL(0x9b3aa9f5,0x4baaef52),LL(0xcd156392,0x0a4fa929),LL(0x6506f42f,0xde0f1956), LL(0x150d4ee7,0xe43dd7f0),LL(0x7247f552,0xf7afe7db),LL(0x9072b450,0x9abc8d1c),LL(0xc9a8e159,0x5d0645d5),
+ LL(0x01c6f17a,0x863d3e8f),LL(0xdf080690,0x3a0575ac),LL(0x2b0fb150,0xcad62d87),LL(0x625c35c6,0xa1f54744), LL(0x41fe59ec,0x7d3bcec3),LL(0x169f1e04,0x0fd3e40e),LL(0x2ed9aa4b,0xbde8c827),LL(0x13046c6e,0x71562ee6),
+ LL(0xe9acac7a,0xaf049c5c),LL(0x261dd422,0x7efec06c),LL(0x095564c4,0xa530fbfd),LL(0x2a57af79,0x000c0c82), LL(0x2ce1315c,0x9f79868f),LL(0x1b5d575e,0x0dd99453),LL(0x1e534cfd,0xf1a49419),LL(0xed7e8b39,0xc7de8756),
+ LL(0x3ed2ccb2,0xef61f5c8),LL(0x34af2a15,0x032ee766),LL(0x9f69ae9d,0xe0692ed5),LL(0xf64900df,0xd34fc2d5), LL(0xaca6d51b,0x1c51c950),LL(0xa7717dfb,0x10ae0fb2),LL(0xa7ec7ca8,0x9fa305f7),LL(0xb5728214,0xb215a8ab),
+ LL(0x8819505b,0x62628fdf),LL(0x004ba54e,0x3cefd86c),LL(0xc571da3d,0xa17bed74),LL(0x93a5faa5,0x362dfef6), LL(0xf8aeea05,0x1bee6899),LL(0x16f18b7a,0xd7bf7e31),LL(0x1cb7685c,0x3f3cf39d),LL(0xe2e57c8e,0x1df41f23),
+ LL(0xe2fd94f1,0x8f62ecb8),LL(0x4c30a178,0x652099c9),LL(0x4262e9e6,0xaa2454e1),LL(0x2015d4a9,0x7f0d440f), LL(0xbb5b39fa,0xa2c76313),LL(0x1ab47bb3,0x46e57ab2),LL(0x8697e682,0xd181f444),LL(0x33273dfe,0x55db129e),
+ LL(0xe71d029f,0xda188361),LL(0xb5def631,0x3e3e19da),LL(0x087ad30b,0x7431f513),LL(0x9f27c84e,0x2537887e), LL(0xac9df89d,0x0c228c62),LL(0x10031289,0xdcd2c5e9),LL(0x0321d1b6,0x5cc76782),LL(0x6cb3d600,0x4e460bdf),
+ LL(0x9a870166,0x6f356aab),LL(0x497d4ac0,0x21aecb3b),LL(0xf0495ef1,0xd981a4b0),LL(0x0fb7704b,0x615e8bff), LL(0x8478bf12,0xc148e8ea),LL(0x364eee52,0x7011ec5b),LL(0xf692bc12,0xd9075965),LL(0xe622ad51,0x3019c824),
+ LL(0xec83c953,0x349e4873),LL(0x3a21ef0a,0xb4f59fb3),LL(0x40f7d93e,0x3872d314),LL(0xc2568c82,0x479e1d02), LL(0x65d43d22,0xd7e4dc9a),LL(0xe775efa8,0xcc068e81),LL(0x326defa6,0xb78ccae9),LL(0x2da64956,0x8f92b296),
+},
+/* digit=18 base_pwr=2^126 */
+{
+ LL(0xdea227ee,0xb721f8d5),LL(0x3dda8ba0,0xf48c766c),LL(0xe43e3520,0x0583d94b),LL(0xe1d898b6,0xebda36c9), LL(0x6627adaa,0x1808286a),LL(0x9938368e,0x19c4c620),LL(0xf750949f,0xe0dbd707),LL(0x0cf356d9,0xcadf4bea),
+ LL(0x2dc890a7,0xf5de2126),LL(0x95aa75a3,0x76b7b675),LL(0x2a070b32,0x475fc143),LL(0x8e31d68f,0x7429a646), LL(0x09be3dca,0xec3a9aaa),LL(0xaf780ed7,0x07e119a9),LL(0x64fd96c4,0x62125625),LL(0xe8e80577,0xb571494f),
+ LL(0x5228d735,0x955ee349),LL(0x8fc5d4b6,0xa04ef2bb),LL(0x3600814f,0x0c532891),LL(0x59f85bd4,0x41f1f637), LL(0xe3dcdfb4,0x72f1d731),LL(0x3aa5edb3,0x28a4ddb9),LL(0xf702dcdb,0x116a68e1),LL(0x3bde657e,0x1975bc42),
+ LL(0x8a914b50,0x7b9f561a),LL(0x9154d377,0x2bf7130e),LL(0x519b4c35,0x6800f696),LL(0x568b4c56,0xc9e65040), LL(0x6d98a331,0x30706e00),LL(0xe211ce1e,0x781a12f6),LL(0x40562e5f,0x1fff9e3d),LL(0x8c166747,0x6356cf46),
+ LL(0x429945a7,0x80e87329),LL(0xb7ab06ad,0xc619fe17),LL(0x6fd86b17,0x9116bc2e),LL(0xb9116aac,0x64a41877), LL(0x32ba4f3b,0xe3ed867e),LL(0x68b4ebe6,0x013e263b),LL(0xe779e4ec,0x305ebfe7),LL(0x50178251,0x5536d45d),
+ LL(0x8873a93d,0x5abb939f),LL(0x8c4c9cb1,0x0263ba48),LL(0x6b78a4b5,0x36764b8d),LL(0x28bebc1e,0x205bb45d), LL(0xae89dcd5,0x16df4bb0),LL(0x316fadb7,0x85994670),LL(0x3af3c724,0x71f75664),LL(0xe8520c9c,0x43e30313),
+ LL(0x29e91921,0x3ab9ec54),LL(0xe3299f47,0xd931436e),LL(0xb89cd49f,0xb56da7bf),LL(0xcff7f637,0x90623412), LL(0x714022de,0x751e7944),LL(0x2c338262,0x86bcc342),LL(0x314c23bb,0x85f6a9bc),LL(0x1f0a3991,0xedbe8e74),
+ LL(0x003b40dd,0x7a748d63),LL(0x3951b7ae,0x8a682402),LL(0x704a91b0,0x41e92dd9),LL(0x858cd3ea,0x2dfb3eb9), LL(0xf5094667,0xc3c2af35),LL(0x7435aa2d,0xffa287dc),LL(0x7462714f,0xd03f3979),LL(0x203e5b0e,0xdb550f67),
+ LL(0xe241ed0c,0x6df7801b),LL(0xb642fd3a,0xb52c0a3f),LL(0x1977a29d,0xdd35e1cf),LL(0xa661404c,0x8e793d60), LL(0x6b9442ae,0x393e2b87),LL(0x2aa6b707,0x123b893a),LL(0xdb8d306a,0xeec88682),LL(0xce847879,0x92c2d93d),
+ LL(0x80ec63b4,0x725f1e7d),LL(0x74113de0,0xcb8f53d9),LL(0xb819f730,0x2132a072),LL(0xb4c61f06,0xfabf3c47), LL(0x2cb243d8,0x79c1bc86),LL(0x757e3600,0x442833c5),LL(0x4e918b8a,0xfa4f69ad),LL(0x73bc193e,0x5816f3f3),
+ LL(0x30f40e93,0xc671c7a4),LL(0x5c51cfa4,0x6041aa03),LL(0x2fac25d7,0x3a713549),LL(0x24a7df01,0xf5053237), LL(0xd29f4ec5,0x99efb34a),LL(0x71d2cb1b,0x74810523),LL(0xf3a029ab,0xacefaf8f),LL(0x069d9545,0xc82e4f5a),
+ LL(0xd3341d80,0xd759549d),LL(0x31a2a0a4,0x079e9fa7),LL(0x2a164f75,0x75da56c7),LL(0xbeefc182,0x9313ef5a), LL(0xbde130ad,0x0aa365b6),LL(0x98411180,0x44265977),LL(0xaa26466a,0xa65373f7),LL(0x2e2cf404,0x1a43bee6),
+ LL(0xb37a9390,0xe029ed6d),LL(0x34970065,0x5c2351ca),LL(0x1c46d72c,0x7c4f3c30),LL(0x7262ce20,0x09ce770a), LL(0xdd58a9f8,0x0cfeefad),LL(0x408addaa,0x06797d79),LL(0x05aed325,0x76a87c06),LL(0x8a46d0c6,0xe002b672),
+ LL(0x05b6e1a4,0xcf77ea31),LL(0xa5d92b00,0x3bf900bc),LL(0xdccfe144,0x05996d8c),LL(0x951a602c,0x73d4dfd7), LL(0x0ed8885d,0x033f3959),LL(0x36400817,0x8332dc73),LL(0x2d8ebda7,0x96372295),LL(0xb5da0c67,0x3fb32cf6),
+ LL(0x3e36defc,0xcb521d65),LL(0xa67f00f0,0xc293d170),LL(0xfb35bd06,0x6a3a2fd4),LL(0x0bd490a5,0x537937dd), LL(0xc274ee5a,0x898d94bc),LL(0x7515b5e7,0xdc70f9bd),LL(0x3749900f,0xa94673db),LL(0x49ad3b04,0x3e6e2af0),
+ LL(0x207eecd9,0xb9dae1b8),LL(0xec07b47c,0xd3f50d63),LL(0x364292da,0x02b4d909),LL(0xfc35975b,0x919a6df3), LL(0xb616452e,0xb41ed4aa),LL(0x5cfc6abb,0xe58689cd),LL(0xf389b025,0xeac325d9),LL(0x8f255de5,0x45ceb1e6),
+ LL(0x5e46cdff,0xda4a0715),LL(0x0f6c761c,0x8a860a55),LL(0x5fe1eef1,0xe1395274),LL(0xf7bc535f,0x256e296a), LL(0x2755dd27,0xf3d4b06c),LL(0xbb530c26,0x3ced6ee5),LL(0x96ba599d,0x73249ad7),LL(0xe8a66027,0x5de8dab3),
+ LL(0xc2f97e01,0xa4892840),LL(0x427945be,0xbe0dbe49),LL(0xa57d4e4f,0x6fd86a7b),LL(0x04a2e778,0x7f56c3e0), LL(0xffc13d49,0x734708cc),LL(0x788d31fe,0x3c1d9413),LL(0x8d3e4c36,0xfe85545b),LL(0x8815129c,0xcca441fc),
+ LL(0x15e3d172,0x2e2095e2),LL(0x64b43e81,0xc0c8d3c4),LL(0xc68e802e,0x084557ab),LL(0x30d239b9,0xa6b73590), LL(0xb67b0548,0x61ec00a9),LL(0xb8ab138d,0x630059de),LL(0x36ca9888,0x800abf01),LL(0x9517149e,0xe26d644a),
+ LL(0x58bf21d9,0x775d5a98),LL(0xdbeab706,0x00eb6846),LL(0x8232d477,0x9d714c9f),LL(0xb70f91c2,0x7cde2c3e), LL(0xe9871f0c,0xe6d0a8ce),LL(0x19e8444a,0x902bc60b),LL(0xff0cd43a,0x8651ed57),LL(0xd480d222,0x4418cc07),
+ LL(0xf3cbe01d,0xb5e0c7e3),LL(0xe43adcdf,0xbf4a899f),LL(0x78f8f79d,0xb89b022c),LL(0xf42c797c,0x79cbbf97), LL(0x59d53cc1,0x46d73cc5),LL(0x4ffca67c,0x99f683e6),LL(0x98865e5b,0x527c16ec),LL(0xf68f8ee0,0xc844b70f),
+ LL(0xc9854994,0xcffcccc0),LL(0x74926d5d,0x4aafcc15),LL(0x835aea59,0xeb084832),LL(0x20df21cf,0xcb317b5f), LL(0xe43d1853,0x3c45b084),LL(0xb93b9167,0xd12c9411),LL(0x19316bdf,0xb0901982),LL(0xd11ab5e2,0x76bfa2ac),
+ LL(0x4e84d3e9,0x22bf23cb),LL(0xd1572d4a,0x96ec9f8e),LL(0x080ba39a,0x31594ae4),LL(0xadc6bae4,0x105b5677), LL(0xa644e230,0x501e45dd),LL(0x64573126,0xeb571f27),LL(0xa36ac1ef,0x1fc3d478),LL(0x327c7da7,0xbd5fcee8),
+ LL(0x34a70bfe,0x1b2b1885),LL(0xa36345c5,0xcfa421f7),LL(0x6f322ae9,0x2f33f4cc),LL(0x4dabb7a0,0xdac0bb75), LL(0x923cea0a,0xfba35536),LL(0x6d9cb50c,0xc16f73e5),LL(0x25812c96,0x23216dc6),LL(0x3d7ab424,0x82945e67),
+ LL(0x0796605d,0x829577b2),LL(0x5026907f,0x47fa0978),LL(0x2d0f68b2,0x99701169),LL(0xbc1e46db,0xa0d24be4), LL(0x2eb2ac98,0xcf409c2e),LL(0x97f3ff5c,0x7b59c3c5),LL(0x81ed7f02,0x2f4576bd),LL(0x10399c22,0xe41339e5),
+ LL(0x2ecce0e6,0x562d7744),LL(0x9a1656c2,0x1afc3869),LL(0x86200621,0x5714820e),LL(0x566da805,0xee36f7b6), LL(0x6e5a2a06,0xe6694104),LL(0x8caabaab,0xd4390b74),LL(0x93b0d142,0x9db20998),LL(0x7926baf3,0xe1811b81),
+ LL(0x08bc1965,0xd578f2ed),LL(0x35f00d5d,0x9a7e31e2),LL(0xc9007327,0x3725b65c),LL(0x29c36f38,0x157cfe95), LL(0x23a521d7,0xb1c3d0f1),LL(0xb8a9ae08,0x3e65fb7c),LL(0x690b8f78,0xed48bcf9),LL(0x90d5dfde,0xe5f46b2c),
+ LL(0x0b6da2b6,0x14aebb35),LL(0x7b65ee55,0x91fef336),LL(0x1a0a004d,0xdb77b57b),LL(0x23aef1f7,0x1c59b628), LL(0x3ec88d18,0xa79c8c89),LL(0x4fde31f1,0x52cca38a),LL(0xcf4e30b6,0xe2f64a94),LL(0x37ff1cbb,0x2b4cdbd7),
+ LL(0x0b566632,0xcb542f68),LL(0x676fae9f,0xedab69a6),LL(0xc45cb6f0,0xc4531e0b),LL(0xb88fe4a5,0xf967ec6e), LL(0x2919785d,0x4ab4e645),LL(0x7a17b20f,0x2dcaefca),LL(0xda7afaa0,0x65c89c05),LL(0x4dafc6a2,0x59ea00e9),
+ LL(0x8eb43733,0xa6362bf8),LL(0x12011803,0xae2dddc1),LL(0x0bb2aaf8,0xbbf516b1),LL(0xd8de21a3,0x9f2627e9), LL(0x43a20b74,0xaf30439a),LL(0x4ce86408,0xac7e07b0),LL(0x7c10566b,0xc54cdff2),LL(0x6279af0a,0xe3ee0622),
+ LL(0xf7770f95,0x57d09708),LL(0x123e020b,0x6f0ba223),LL(0x6cd41559,0x6c123fb9),LL(0x6fb30f58,0xc54f5c65), LL(0xbbf7101c,0x5e168af3),LL(0xce974455,0xf6d6dbdb),LL(0x88313516,0xa001f3b9),LL(0xdfb4ac20,0xe6e4a26d),
+ LL(0x506f7dcd,0x74e7b7fc),LL(0x5d037d69,0x985e8546),LL(0x1ec8d374,0xff00a4da),LL(0x505b4180,0x8c339ae3), LL(0x3a5f71c4,0x78bcd4f2),LL(0x67ac3e9f,0x2fb4d99f),LL(0xee65dad1,0x7dd25aa6),LL(0xb62c34dc,0x2fd63fc2),
+ LL(0xf7700192,0xdee42663),LL(0x2c3248e9,0x9925a206),LL(0x2ea9f052,0x4a55a55d),LL(0x16ac67fe,0xe1d6efcd), LL(0x9bb02415,0x7f82246d),LL(0x72cd7a6c,0x2fadbb9b),LL(0x712004dc,0xe977a037),LL(0xb3c9f4b9,0xe8c449b2),
+ LL(0x861ea138,0xa2cb838a),LL(0x356ae003,0xfcbe219a),LL(0x1838504f,0x15c02496),LL(0x0769d5dc,0x58cef52c), LL(0xb3fef999,0x7e94ff7d),LL(0x04e4fc87,0xf55501e0),LL(0xc05430dc,0xcdb5fd36),LL(0x778c5cd4,0x49872453),
+ LL(0x1b5e7ace,0x4c4855ff),LL(0xb159fe74,0x89fc6309),LL(0x3c9ebbe2,0xaca00404),LL(0x866bf867,0x4c030591), LL(0x9b18a535,0xa7e8f599),LL(0x5c0a0a44,0x9203ebfc),LL(0x463207c9,0xbf1b30cc),LL(0x9d135aeb,0x90b59001),
+ LL(0x794cb3ab,0xedc44d04),LL(0x0ad7be70,0xb3baa475),LL(0x6c09fc91,0xb7d8c7c5),LL(0xf45a5bd6,0x2a362d71), LL(0x8cf3e5a6,0x36e308c3),LL(0x0a649c31,0x4caf2cd1),LL(0xb3c501c7,0xbae328f5),LL(0x83a0eeb3,0x2efeca03),
+ LL(0x7086093a,0xc3a27585),LL(0x6d686d83,0x78e86515),LL(0xedf0def6,0x18cf3ac1),LL(0x5a1d6cf4,0x2f6a56da), LL(0x30084873,0x350c822e),LL(0x65843610,0x82d48087),LL(0xf393ecd1,0xa4e752c1),LL(0xeeb74f25,0xe3034d6d),
+ LL(0xb8b0c5c7,0x1793727c),LL(0x7ec9ce37,0xde561ca6),LL(0x6190f612,0xd9eddc50),LL(0xca89a191,0xb52dc77c), LL(0x4bf1e87a,0x990010b2),LL(0x15b91691,0x073136b2),LL(0x15546011,0x50111261),LL(0x0196cb8d,0x17d48864),
+ LL(0xfd61d824,0x7ec44104),LL(0xf088d3db,0x213550ef),LL(0xacbbb608,0x5e8d321f),LL(0x39312b64,0xc317c1f8), LL(0x27de4329,0x7a4a1cd0),LL(0xf9b135e4,0xbfb33f07),LL(0x59b94480,0xcf82b639),LL(0x70b118e6,0xca62d957),
+ LL(0x2b1d45fb,0x95b2ff03),LL(0x2570686c,0x472dd56c),LL(0xd3d50e32,0x4fbae8a0),LL(0x65796a08,0xa31c65dd), LL(0x037ce5bb,0xe261f6f8),LL(0xd042073b,0x3b7816bf),LL(0xbfba45f8,0x6d0ebbee),LL(0xc9522e36,0xf2d99979),
+ LL(0x77cb5b0c,0x707f2a18),LL(0xdfc02b82,0x954b5a91),LL(0xc20ae04b,0x246b9a55),LL(0x9dd79f93,0xa1486775), LL(0xc11f6d8e,0xd4092830),LL(0x267a4dab,0x74ca482f),LL(0x9c58706f,0xe3c80bb6),LL(0x099154c1,0x245f04b7),
+ LL(0xf149259f,0x3a4b25b5),LL(0x65ccbe91,0xeac735f8),LL(0x572788a4,0x260e749f),LL(0xe34d40cb,0x30b9c736), LL(0xf524a17f,0x65981d50),LL(0xcddbbefc,0x6c462f5d),LL(0xa1e57312,0x245bfa18),LL(0x46dc8ae0,0x3b4b003c),
+ LL(0x5d262a35,0xb1958797),LL(0xffafd8c5,0x83f6e604),LL(0xbc2e0801,0x60843f9c),LL(0xc783ad3d,0x11d85ac1), LL(0x2e016e43,0x1ce477dd),LL(0xfb4a0201,0x2b628f06),LL(0xbf4f77d7,0x897b7f62),LL(0x10277d8a,0x52e04f22),
+ LL(0x5f3f0d6a,0x17132351),LL(0x59a96c4d,0x13c9e064),LL(0x86f05ae8,0xc73892b0),LL(0x4212ad65,0x94545c8a), LL(0x3dc4984c,0x0591b091),LL(0xf2ec1ca9,0x06845698),LL(0xb3ac894b,0xb0e1e1d0),LL(0xa7c915cd,0x962ca1da),
+ LL(0x95331bd5,0xb0640de8),LL(0x478c1b6d,0x2544348a),LL(0x5647a67e,0x3c3bd415),LL(0x5b20e5fb,0xd7970ef8), LL(0xe06b4fa6,0xd6e6f6be),LL(0x871390ff,0x5ae29e5e),LL(0x7256daa1,0xc7924188),LL(0x59f61750,0xfae5e501),
+ LL(0xd1ef1d2b,0xfac83ece),LL(0x554736da,0xa567060c),LL(0x1dba8bc7,0x697571f4),LL(0x553fbcfc,0xd3fc5aeb), LL(0x9755fab0,0xe665970a),LL(0xb5537da8,0x30fbe8d9),LL(0x97c2b5f0,0x7a7d0013),LL(0x1b700a02,0x9fea5c9c),
+ LL(0xe9a377da,0xcfc0166e),LL(0xac502375,0xcc78f3d8),LL(0xba64c3b7,0x803fbbda),LL(0x4d70cc42,0xe53c7d6b), LL(0x5189b7da,0x6b927bba),LL(0x8b05322a,0x2c86253b),LL(0xf3869873,0x333e7491),LL(0x4b492879,0x9308348a),
+ LL(0xb9ab0a36,0x39bfa2a8),LL(0x18f71ac7,0x560f80a6),LL(0x45e24412,0xca9b265a),LL(0x8e2ddac3,0x6796bece), LL(0x17bfcabb,0x87f1eee5),LL(0x195c9bb2,0x624db4d9),LL(0x2b4db6d2,0xf7110fcf),LL(0xb432d19d,0x41d3fb0d),
+ LL(0x73554a3c,0x3344ea7d),LL(0x830a3881,0x4c968dad),LL(0x687f71ec,0x5df71ad2),LL(0x259cbc07,0x4c4df41f), LL(0xeb541d72,0x8d12d2e0),LL(0xa20fb162,0x94c0dab6),LL(0x1eda0516,0x9bbc2524),LL(0xdd7871ff,0x696c924e),
+ LL(0x1db84dc1,0x97efb495),LL(0x03cbfbf8,0x7d293ce5),LL(0xbc48d007,0x79e25d3e),LL(0x8591a1ea,0xc900a580), LL(0xd37508c3,0xf0277a09),LL(0xe84557bf,0xbf583aa4),LL(0xd8228591,0x2e258d60),LL(0x117da3a9,0xb037e17c),
+ LL(0x243d588d,0x4b35355e),LL(0xcce2539e,0xbe6dfa36),LL(0x4843c9da,0xa57d5823),LL(0xf59348fa,0xe3d91511), LL(0x2791c08f,0xb5d1395c),LL(0xf6fdcc93,0x04129e5d),LL(0x0f53087b,0x635a63ba),LL(0xf237612e,0x66da6bec),
+ LL(0x22755420,0xc3d052e5),LL(0xd7a1bd35,0xc37a9b47),LL(0x9b347e02,0xf19613f3),LL(0xbbda7ae0,0xee84dbac), LL(0x3a85f2e5,0x603be21d),LL(0xff679451,0x5f0927c2),LL(0x8674f8d7,0x799013ad),LL(0x00f465e5,0x17b248d3),
+ LL(0x96ca19de,0x2a29135f),LL(0x957d1844,0xc8e56e32),LL(0xa11a4349,0x935e7eaf),LL(0x741b73d3,0x717308e1), LL(0x7233a9df,0x40477acb),LL(0xd2c83b72,0x7a78dac2),LL(0x2c5d79d2,0xfb882461),LL(0x76f44fa0,0x984505fb),
+ LL(0xdfdc4a9d,0x5cdded16),LL(0x3f0ff597,0x4cbea135),LL(0x8a79078e,0x38daf27a),LL(0xce1bbf0e,0xb4b0085d), LL(0x86f19fd0,0xb6b0d8d7),LL(0x1778ca6a,0xe0fdcdae),LL(0x0b26b9b5,0x257c7df9),LL(0x141dcafc,0x4b82422c),
+ LL(0x4d3cf148,0xcf8a2dad),LL(0x5f17e914,0xf1a4e292),LL(0x60de8f64,0xc40755bb),LL(0x8718f49d,0x412449f8), LL(0x8737b6cb,0xdabb9968),LL(0x6236ea05,0xdd94ae81),LL(0x05c5aca2,0xb5223cd0),LL(0x762210ed,0x6b81bd33),
+ LL(0x5d4164df,0x1f0921db),LL(0x8d4a35df,0xf6fdb08f),LL(0xc602d4d8,0x1efcf3c7),LL(0x057f3aa0,0xa2ecd9e6), LL(0xeb4fcba2,0x13a6c576),LL(0x13130559,0x16425bd4),LL(0x416b4968,0xa9eac848),LL(0x2119600e,0x617c32a9),
+ LL(0x0bb49e40,0x1a84eca5),LL(0xbc2310b3,0x2ed98d25),LL(0x5edbc719,0xad191f88),LL(0x0376ae08,0xd8d667d5), LL(0xf0b4fe29,0xb855a8ee),LL(0xe75354f7,0xc3fe79fb),LL(0x403b651e,0x1ee9b9e6),LL(0x2baa2c6e,0x99ddbb3c),
+ LL(0xeccce37d,0xc6a84c47),LL(0x038c9821,0x71a05a24),LL(0x9a6353d8,0x8d32194c),LL(0xcf0a1462,0x14cd3ea6), LL(0x7bdbe521,0x40d70aa2),LL(0x95c80cd8,0x200f0b21),LL(0x3efdf656,0x4c79dab9),LL(0xa981d8b5,0xafa44e4c),
+ LL(0xa7111315,0x811b9387),LL(0x7590c35d,0x0255a234),LL(0xf1af875c,0xb18e87c0),LL(0xced5cc1f,0x0a930b41), LL(0x96094a55,0x6ff4fca4),LL(0x6a9dc519,0x74095b88),LL(0xafa4894a,0x44492273),LL(0xa2e6f56e,0x54f16f88),
+ LL(0x34485e31,0xd613fbb4),LL(0xd2464242,0xc716c370),LL(0x1644f2e1,0x21535837),LL(0xbe417c3a,0x7719474b), LL(0x2045d2be,0x31bfb158),LL(0xf50e6828,0x10855524),LL(0x98a67af1,0xdb9490ad),LL(0x1c281ff3,0x41a34aa6),
+ LL(0xa8bf2580,0x87109ba8),LL(0x2d7eb52d,0x70c2e936),LL(0xfb3fc109,0xefe9fe2c),LL(0x780526bf,0xfd3f4d7b), LL(0x9ed0c3bc,0x6f9a48d8),LL(0x5d8205b2,0x0aec850f),LL(0x1c6a13ef,0xa378f8c6),LL(0x9d10e11b,0xac02f367),
+ LL(0x3b9bbf54,0x79c6b396),LL(0x42779c58,0xfb586d71),LL(0x889eecb3,0x5d975728),LL(0x434537d8,0xda2ec867), LL(0x62f31813,0x15a3c9c3),LL(0x3c30433e,0xc4b357c8),LL(0xc464e972,0xf26d281f),LL(0x4512ffcf,0x99fa49e7),
+ LL(0x725b9753,0x456db1b2),LL(0xb42941c5,0xec501760),LL(0x7d6d406f,0xd822a9d5),LL(0x7bbcd4d6,0x4bb7a820), LL(0xcc96a5b7,0x079b1fe0),LL(0x24aa4901,0xf83e5755),LL(0x20da7fcb,0x317cdd1d),LL(0x93b04a81,0x487fd706),
+ LL(0xe43332ef,0x43e0671f),LL(0x441c2218,0x71c5dd5b),LL(0xe922ba18,0x4c1d2c1f),LL(0xd619cb67,0x558e9c2f), LL(0x1ec51255,0xd04acde0),LL(0xaf824507,0x824b3740),LL(0x744c6afe,0x62d1b9de),LL(0xab0d52e3,0xb99616db),
+},
+/* digit=19 base_pwr=2^133 */
+{
+ LL(0x7f6a1cda,0x5ec9c084),LL(0x823d6350,0x68839c14),LL(0x03bad007,0xcbbb678b),LL(0x4788854e,0x6a727255), LL(0xef5c7294,0xc747fea2),LL(0x4875e775,0x74852778),LL(0xaa61a893,0xad7b8e8b),LL(0x40da98b1,0x18ff3335),
+ LL(0x5529ec80,0xa51e9f4f),LL(0x6fd146d1,0x0420274a),LL(0x8e300c2c,0xbbf1ab66),LL(0x41653fea,0x2d0b3a9d), LL(0x23a495b9,0x2be2180f),LL(0x5415d73b,0x6ef3c374),LL(0xc67ae4fc,0x1d3e1ec8),LL(0x98d31f5f,0xa5839e9c),
+ LL(0x37d77c01,0xf54114d6),LL(0x41023c87,0xc2e18a4b),LL(0x9e6e1221,0x6fa6c3d3),LL(0x410e48f9,0x9a6cf4e2), LL(0xb181828f,0xe0881140),LL(0x78cb7833,0x17c6df29),LL(0xa7cd2367,0xc1eb8df1),LL(0xca89f922,0xb78f1c8d),
+ LL(0xd0d42887,0xf25d4777),LL(0x2b7a2707,0x4b489218),LL(0x2d3966fe,0x1b4dbf9b),LL(0x41ae2bec,0x4bac5f48), LL(0x1733964e,0x68db2733),LL(0x6a814a69,0xa10c5dff),LL(0xa9898348,0x84ebdaf0),LL(0xa74da3f4,0x60e46823),
+ LL(0x93420649,0x452b6b1d),LL(0x6ed5d7f6,0x9dd6452b),LL(0xe687b577,0x4a9b8fa1),LL(0x854c49d7,0x1e203166), LL(0xa45feba8,0xf523667e),LL(0x5f9f4a56,0x9ecb4d44),LL(0x7fb1c641,0xb8655a5f),LL(0x87c26201,0x5516401a),
+ LL(0x0d2face6,0x24677754),LL(0xa8ade59c,0xd9f7da7f),LL(0x7fa7df06,0x27e3ad77),LL(0xf60395ad,0x35a4caf0), LL(0xe4e701ac,0xfaef231c),LL(0x23755489,0x9e135976),LL(0x43554ad3,0x7caa73ab),LL(0x94f0d878,0x9d8554d9),
+ LL(0xa85b81d5,0xe42040ce),LL(0x40fa9631,0x4d28aca7),LL(0x7e04b755,0x076fed3d),LL(0x1129ce4c,0xdde3d347), LL(0x1179af95,0x77f785d7),LL(0xf74e0672,0x4782f842),LL(0x0b4597cb,0xbd068cc1),LL(0x8f4c65b7,0x3d6d4b2a),
+ LL(0xf9066d73,0xe0642d18),LL(0xa098b3bf,0xbe1d2ec3),LL(0x21b4954c,0xefee860c),LL(0x27b629bb,0x4d7c4e6d), LL(0x8e8b81b0,0xcd8f1e03),LL(0x7fe77eb0,0x4a80168e),LL(0xce247c73,0x4d977591),LL(0x857e0356,0x9b30c9f2),
+ LL(0x2940e9de,0xc02495ba),LL(0xb6d2b72c,0x357299f5),LL(0x06a9c2e4,0x132b4c63),LL(0x084d8c67,0xe90a90c5), LL(0xace1b471,0x0f0c9e94),LL(0xf1e3d8f6,0x769457e1),LL(0xd71118c6,0xc4c30ce3),LL(0x6b652a3d,0xdb5fd8d6),
+ LL(0x4def5978,0x090df107),LL(0x2d8a5f3a,0x1abcfa32),LL(0xa34b70db,0x2976b012),LL(0xfa5e75b9,0x90f541d4), LL(0x37a6e9a0,0x50c991a9),LL(0x903bffda,0xf51e8693),LL(0x8d344776,0xa2697ab4),LL(0xe34a7850,0x77134fe8),
+ LL(0xa72597ac,0x723e5d3d),LL(0x4269aff7,0x4a49847a),LL(0x443b8db6,0x75ad9088),LL(0xa51d80a1,0x9b7d00d5), LL(0xe5e04ac2,0xce1c7049),LL(0x2a792bde,0xb8c2793c),LL(0xe410e175,0xde9220a0),LL(0x9401bc2a,0x4b3a9b85),
+ LL(0xf037d15f,0xc7eaf2c5),LL(0xc7afbf8b,0x410b627e),LL(0xd7bedf50,0x243cdb79),LL(0xbe6512d0,0x04813b51), LL(0x26beca2f,0x2fb77cab),LL(0x7baa3099,0xbb601975),LL(0x40bda4d0,0x8c327e59),LL(0x13c23444,0x85b9c764),
+ LL(0x08ed59d8,0x26960d9c),LL(0x4a72854d,0x9b76dced),LL(0xfdc3b7f5,0xca2f579a),LL(0x6cae8b4f,0xac27028a), LL(0x42326aa5,0x48fd1a49),LL(0x5759c63f,0xb95fdb4f),LL(0xe0a96abf,0x27655358),LL(0x36ed53b0,0x26d38b64),
+ LL(0xfc6d1f3e,0x03cfdd49),LL(0x15adaba0,0x20af5886),LL(0x754dd268,0x74c6c943),LL(0x7977717e,0xe7d52cdf), LL(0x3b414dd2,0x9a81d440),LL(0xd790a4c7,0x697c7b4a),LL(0xedbce1f2,0xb1b7735f),LL(0xbefa7210,0xbd90e63f),
+ LL(0x7ab207d1,0x2e2b0dad),LL(0x9b373211,0x89abbd83),LL(0x8e35e2bb,0x45d34ebc),LL(0x064856f6,0x67ba3ac5), LL(0xa52c7676,0xb5527dbe),LL(0x71294012,0x906fb217),LL(0xab305260,0x65fca552),LL(0x14ee193b,0x89ac52a3),
+ LL(0x88c06b1c,0x673aead4),LL(0x49d9d4e8,0xea8af420),LL(0xcb9e86bf,0xa7b4409a),LL(0x5414aa56,0x49f76f71), LL(0x8c13857a,0x6603c801),LL(0xce742384,0x7c26f1c2),LL(0x2a665719,0x042fb224),LL(0xe175b0c6,0x2619f254),
+ LL(0x7c092397,0x5b3b71ea),LL(0xf18c29ae,0xd9087023),LL(0x2008841d,0x48dbecbd),LL(0x22622bba,0x658c998e), LL(0x578e463f,0x38a2cc6d),LL(0xcbb88796,0x7002380f),LL(0x71695101,0xc545baff),LL(0xce65b49c,0x064a0500),
+ LL(0xb1ae0398,0x3651d926),LL(0x4ace0e86,0x33c9ea8f),LL(0x1a6debd7,0x481fab1b),LL(0x4d365031,0x65b58a79), LL(0x811e8f01,0xb73ec84b),LL(0x51342ef2,0xb6aa3955),LL(0x9efcdbcc,0xdbce3d9f),LL(0xcfbf2a4f,0x5791b35f),
+ LL(0x6eaad1f0,0x67024158),LL(0x0063ae25,0xe8dbaa88),LL(0x9fedc144,0x6d2051cc),LL(0x18b5e86d,0x136c2ab1), LL(0xc89241d4,0x3b2d3d63),LL(0x4a82dec6,0x843cfa3d),LL(0xf0a5f163,0x64fa5860),LL(0x1ae3be83,0x2d9b6095),
+ LL(0xb01a91e5,0x75f97753),LL(0xcd0d8cac,0xd374dfa2),LL(0x8eb72ba0,0xe5dbffef),LL(0xd7b8a624,0x61049807), LL(0xa39277d3,0x9c8b5e93),LL(0x3b1cc635,0x6e5ba593),LL(0x21cde059,0x8bd0a69e),LL(0x071ec0c8,0xd0a19b53),
+ LL(0xd1bb088d,0x8c87785a),LL(0x7e249c39,0xd801d5a6),LL(0x8688914f,0x002ee598),LL(0x6b68413d,0x52b014fc), LL(0x507946df,0xaf1d7e88),LL(0x84ccebf1,0xa38e436f),LL(0xaa86a4b6,0x37d9b946),LL(0xc506a394,0x55da0db6),
+ LL(0x02b900bd,0x856928c3),LL(0x7bc6a67b,0x9eb926a3),LL(0xd0f39446,0x2f4d392d),LL(0x01c49daa,0xb12f2761), LL(0x13874ac7,0x07b8d23f),LL(0x1efaa157,0xa473ef4c),LL(0xdf8cf2ab,0x550765f6),LL(0xd23d3750,0xeba88504),
+ LL(0x2434fa2e,0xf05791d4),LL(0x4e2a05ea,0x8c0899c3),LL(0x898bc9b0,0x40a53bdd),LL(0x40c8bf7c,0x6c255f6f), LL(0xe164b910,0x203db8c5),LL(0xc1c4de69,0x070baaee),LL(0x5df5c0a7,0x89660629),LL(0xdb364b99,0x0b9c2f4b),
+ LL(0x44bb5a79,0x012c6994),LL(0x9bd1fdc0,0xf5928e0c),LL(0x3ce49191,0xd30b8a97),LL(0xe3a05dd3,0x52792b85), LL(0x1d3d69c3,0x0da08916),LL(0xed59a28d,0x931759e8),LL(0x6ca05485,0x412148d9),LL(0x3d6e9964,0xb1517aa0),
+ LL(0xde75812d,0x15204ba9),LL(0x5698b03f,0x49e377e0),LL(0x05c9072e,0xe7790d41),LL(0xdba28e80,0xf79adbed), LL(0x4644840d,0x6aad9f96),LL(0x2e0a695b,0xc3f3d032),LL(0xaa4aa737,0x3eb739d2),LL(0x37d8d520,0x45c6b665),
+ LL(0x9917cb85,0xc3ba2408),LL(0xd7bf6304,0x1c729ffb),LL(0xcc160245,0x56b9935e),LL(0xe03cb227,0x42379567), LL(0xb66bfc5d,0x2dc20028),LL(0x95de8ed3,0xfaf7d224),LL(0x3214024e,0xa7541158),LL(0x50aabdb6,0x2f7755d8),
+ LL(0x7ea9b93a,0xb74ac27b),LL(0xa2e0516c,0xc1c5a8fe),LL(0x6b64f56f,0xe9f4f222),LL(0x8fbc4a64,0xf3c0c7fb), LL(0xa16edc23,0x43ac0ac2),LL(0x6d086e9e,0x0e26e4ad),LL(0x5bc0961f,0x5b8ef949),LL(0xd2b77c29,0xa0d16d39),
+ LL(0x78845d09,0x50b43efa),LL(0xcb3acdd9,0x3899e1be),LL(0x18d4ec31,0xa93a28e3),LL(0x0a66fe47,0x18a4eeed), LL(0x87333831,0xd7a7bf46),LL(0xdbe14699,0xbbf5c1a8),LL(0x80b9c9d0,0xf2a3da73),LL(0x82bceb4e,0x133c138a),
+ LL(0x335a923a,0xcfd4b885),LL(0x8fc82f3b,0xf9b69b3f),LL(0x8784c35c,0x08908b60),LL(0xd843b66e,0x76bf1082), LL(0xbb57a641,0x1ba730bf),LL(0x34e9f095,0x3bb4a8d7),LL(0xc28d5414,0x0342d32b),LL(0xcfd99e1a,0x8fb13cbf),
+ LL(0x1d02f47c,0x3845e507),LL(0x14ef0b26,0x4d77af89),LL(0x5ef578d9,0x93454480),LL(0xbdc408ec,0x23138c57), LL(0x47cf528a,0xdac833ed),LL(0x29d7cf20,0xd18e9865),LL(0xcdc8e55a,0x93208743),LL(0x724025a0,0xbfe570c8),
+ LL(0x3aee838e,0xb75c3de0),LL(0xe0f21f23,0x29304886),LL(0x82791daf,0xe46792ab),LL(0x3f124394,0x3d798d92), LL(0x29a6fb5e,0x2446dc81),LL(0xbd68c23a,0x2446e5b3),LL(0x689b1176,0xe1b5c76d),LL(0x9a852082,0x3fb66661),
+ LL(0xd9b45206,0x8d6fbcc7),LL(0xeabc4640,0x00ab735d),LL(0x810e37d1,0x428c7017),LL(0x27af5718,0xa4365872), LL(0x0a910146,0x8f195823),LL(0x0ff76704,0xc13ccdd7),LL(0x44d6f1c8,0x59d34ad6),LL(0x795b61b4,0xd3dfa6b2),
+ LL(0x12eea439,0x1ec08010),LL(0x7b2cd52a,0xafbbea32),LL(0x68cfe98b,0x99428f9a),LL(0x95628fe7,0x4ff9a5bc), LL(0x7ac41e9a,0x212baeb7),LL(0x29206e86,0x595cf03f),LL(0x733f37c4,0x4b62a429),LL(0x4d3cb6a6,0xa1fac4ae),
+ LL(0x1aed3c45,0x2d6cb0e6),LL(0x4e6da48d,0xf6703493),LL(0x2d13f9c1,0xa0036fb4),LL(0x7fe3ea2e,0x7db5078a), LL(0xd5992163,0x152a1fc0),LL(0x744b44ff,0xd63270e9),LL(0xf177c075,0x56730292),LL(0x17c3e08c,0x470f5e72),
+ LL(0xecb927f5,0xbf53d223),LL(0x629e8aa1,0xc80fbc1b),LL(0x24d72477,0xed59f186),LL(0x38811583,0xc266f5a6), LL(0x7c404560,0xc6f37bc1),LL(0x0c5b68e9,0xd58c10e5),LL(0x916e8f3c,0x696de793),LL(0x56a7781f,0x7298af8e),
+ LL(0xb16679d5,0xaf063553),LL(0x4316ed7e,0xa509f449),LL(0xb53cc0e2,0xe3d6ec43),LL(0x16ba34cd,0x9e957ce0), LL(0x7857d80d,0x2b0c7fbc),LL(0x3daffbf3,0xc2c671fe),LL(0x0d251d41,0xebcbf012),LL(0xffef45f5,0xedcfe7f7),
+ LL(0x334a1734,0xf5b66555),LL(0xe505f4bb,0x4354ccfa),LL(0x52a59260,0x6ee0b5b9),LL(0x5a699a93,0xb7bb64c1), LL(0x6de84422,0x85e34c0e),LL(0x8bbe0560,0xca9bacfe),LL(0x952a52d2,0xa08c780f),LL(0x3919176b,0x0e794b05),
+ LL(0x154d282d,0x8a496598),LL(0xdc34508c,0xb2999dc4),LL(0x9db4410a,0xfc304fe3),LL(0xe1bc07c8,0xbc09aee4), LL(0xef6d497d,0x1d2f0147),LL(0x96488fc1,0x3b9e06e0),LL(0x34cb97a7,0x37635d04),LL(0x8757f955,0x9a294b89),
+ LL(0x59508819,0x38c568ac),LL(0x46e15b82,0x854370fc),LL(0xee57f0b4,0x9f676404),LL(0x8f45319c,0x268854cc), LL(0x63746274,0x4256d25c),LL(0x0496cf9c,0x0a553821),LL(0x15e2fc17,0xb6bf27de),LL(0x99bd538a,0x6848f83a),
+ LL(0x1685e460,0x00e15d0a),LL(0x155d00b6,0x6fae8b37),LL(0xdc561456,0x277126d8),LL(0x6bf70c63,0x331c02e5), LL(0x515f39b7,0xc9b7da4e),LL(0x966c2060,0xb7e0d135),LL(0xc401f926,0x9a801457),LL(0xffb0137e,0xcc560825),
+ LL(0x5c7e38fc,0xbcfac5f8),LL(0x174e97ba,0xd542c1a4),LL(0x0bb507b8,0xbea67b1e),LL(0x3b782fd8,0xf008cc2c), LL(0x0aa329bc,0x865834da),LL(0x2b6db70a,0x0fd746f2),LL(0x65fbe439,0x8e72e5f7),LL(0x005295ee,0xac23881d),
+ LL(0xad9d013c,0xc2c45fef),LL(0x71c311f9,0x0df74277),LL(0x6bb32b66,0x69caf967),LL(0xb8e4a3e5,0x9fbd32ff), LL(0x78c0c439,0x39d94e31),LL(0xffa4b625,0x7489a8f0),LL(0x8aac717c,0x59af0ec3),LL(0xa12d996f,0xdd3b470e),
+ LL(0x8da3fef0,0x6d60cb97),LL(0x044d64fc,0x5164d722),LL(0xfc21305b,0xefe06ead),LL(0xceed89c1,0x72b4c45e), LL(0x8cabf0df,0x072cf1dc),LL(0xa5371d3e,0x0a0d7c0c),LL(0x2ae831d5,0xb13ba707),LL(0x269f189e,0x7702c3c5),
+ LL(0xc8239fe7,0xfb8e903e),LL(0x524f213c,0x5805c2ef),LL(0x70645f7f,0xdf056e45),LL(0x454c4577,0xfe10ecfb), LL(0x990dc567,0x422126da),LL(0xbf55cd81,0x95a5d753),LL(0x8c2688ed,0x2705a00c),LL(0x2f8f91af,0xd079ecb4),
+ LL(0x2b69a2c8,0x8cd13fa0),LL(0x36b657b8,0x7b0f310a),LL(0x251c595b,0xa7247cfd),LL(0x5a36e4b1,0xda352dc8), LL(0xf43312de,0x588d2e88),LL(0xdb9f6dec,0xef80a48f),LL(0x3fb2d6e3,0x39583634),LL(0x5a46bc46,0x0fbfa769),
+ LL(0xfe701598,0x3570a3f2),LL(0xac815fbb,0xd1d0d091),LL(0xd7f2b1b2,0x4d7bfadd),LL(0x66496326,0x509298d4), LL(0xcad9fb50,0xb7accafc),LL(0x9c592dee,0xcdbcb762),LL(0x6888482a,0xfe47a3b1),LL(0xe8b8c133,0x312be210),
+ LL(0x00167f93,0xc474b07f),LL(0xa637f35e,0x19457000),LL(0x5005d8a1,0x3eafa14e),LL(0xadf25f29,0x2a84723a), LL(0xa741cf9e,0x2c9d7ebb),LL(0xc3913acf,0x94024dc2),LL(0x97b98f1f,0xac2db91d),LL(0x46a7bf92,0xfb9a0502),
+ LL(0x6487a5d4,0x8874ffb5),LL(0x2f53e25f,0xc02a12b5),LL(0x416ba8fc,0x38654a57),LL(0x0c0b25d6,0x226356f2), LL(0x6030f2ac,0x34f2eaa6),LL(0x9cea9176,0xb788baa1),LL(0x4e912104,0x66fbe9f7),LL(0x39a69e3d,0x982ef71d),
+ LL(0xbbe5733a,0x9f361d17),LL(0x1988f31e,0xc79569a0),LL(0x9e0f52fe,0xf2b96ecb),LL(0x80235136,0xc78e44dc), LL(0x8462ef4f,0x96053ab5),LL(0x81506701,0xf83c1f6d),LL(0xa65c09e9,0xc7313eb1),LL(0x4efcf558,0xf5dfaa4a),
+ LL(0xe65ede91,0x8b4819e4),LL(0x6dc0a533,0x5a5824ba),LL(0xb4c930f8,0x89d18b20),LL(0xfcefa378,0xaad7a5d8), LL(0x298dba63,0x2ef790c2),LL(0xe90c322f,0x3e4b31b6),LL(0x52ce2ee4,0xa257bb81),LL(0xd39c36bb,0xb8c2966e),
+ LL(0x487719c7,0x13954df8),LL(0x791b00e7,0xcb0f7ae5),LL(0xc8d21faf,0x367a1cad),LL(0x3fbd8a7c,0x44dd204d), LL(0x5f67ec30,0x778fdb56),LL(0x5de5caeb,0xfb288790),LL(0xca53300c,0x310b4d56),LL(0x325c54b1,0x37dbb7c4),
+ LL(0xfe771ef7,0xc80c83a4),LL(0x1c1c1b92,0xe212050f),LL(0xf09c666f,0x0f12bb88),LL(0x10a2eca2,0x8ec5f396), LL(0x90a22eb7,0xdaf96996),LL(0x450de941,0xeb77eee5),LL(0x58fb0165,0x13823c58),LL(0x31272111,0x2157ba6e),
+ LL(0x2b4f9e7e,0x110ee33e),LL(0xf682d48f,0x7e1b550b),LL(0x3e17cb9b,0x8fd8c6c1),LL(0xe1843894,0x91cfbcf7), LL(0x2917b1c7,0x5fc64346),LL(0xba86d14a,0x06f56d0f),LL(0xaf219f21,0xb8874d88),LL(0x11ab8b0b,0xf8803b37),
+ LL(0xbe12841e,0x7e63cf63),LL(0xbc90765a,0x9c9cc421),LL(0x1084fa84,0x0264a597),LL(0x252a9bbe,0xce260a60), LL(0x2fefa4f2,0xfaff225c),LL(0x05bd09b0,0x02b900ad),LL(0x11b1b81c,0x631e5cfb),LL(0x0a193140,0x4d93de46),
+ LL(0xe3173750,0xd92a710a),LL(0x671a3833,0xd712d3a1),LL(0x4116e26b,0xbc9caad1),LL(0xa72fbd71,0xeb24f658), LL(0x9055f802,0x3986a207),LL(0xe2707793,0x212446f8),LL(0x1721b395,0x602541d6),LL(0xb07160c2,0x4099a2e6),
+ LL(0x2369ce91,0x765390f6),LL(0x5754d219,0x2dc37639),LL(0x7c018afb,0xbc552369),LL(0x35bf6b66,0xca835077), LL(0x61d4b0a6,0x61b83e43),LL(0x27cf66c5,0x8f87f597),LL(0x9357cbf2,0xace57840),LL(0xabe47fb7,0x24834481),
+ LL(0xdb3c6e47,0xa434c950),LL(0xaa1da775,0x1f479519),LL(0xf14f9d5e,0x338c9cd2),LL(0x1e75f72e,0x4666ce7e), LL(0xe56564e5,0x4fce4d95),LL(0x89e0ff6f,0x0db55ed5),LL(0x00190b73,0x88796e85),LL(0x454e31d0,0xfdf6492a),
+ LL(0xb9ed6e3b,0x30cb3fbe),LL(0xde8f0544,0x5c796282),LL(0xb6af89bc,0xe11b36bd),LL(0xec439d95,0x0a91cf73), LL(0x0a93fe1c,0xbbe74a5e),LL(0xa5d75083,0xcf1f376f),LL(0xf7725460,0x6718bce5),LL(0xa316d17f,0x6654d7b1),
+ LL(0x0393aa3b,0xdaa925e5),LL(0x9446cdbd,0x81217e18),LL(0xa7afc408,0x07708483),LL(0x44709dfe,0xa4c76c4f), LL(0x3a1c412b,0x72557d71),LL(0xb49b0e1c,0xeb4c2648),LL(0xe4d6c002,0xcdd24b77),LL(0x77113e0d,0x3384ea5b),
+ LL(0x6a10a9ea,0x906fb748),LL(0x0a3b0e89,0x46cda42e),LL(0x7ae4ad43,0x10b9096d),LL(0x3bf2afea,0xe1f23996), LL(0x0dd82d19,0xcb50b941),LL(0x832d93a0,0x008e593c),LL(0xd86a71e0,0x0b1fb0e6),LL(0xb1730860,0x75f2aa6b),
+ LL(0x7efc480a,0xed5d4d7c),LL(0xc76c64de,0x500b9d8c),LL(0xec4fc026,0x28904003),LL(0xdec8b315,0xe41b3f23), LL(0x70c06860,0xa9b5caff),LL(0x28343b2d,0x5cb9a4d1),LL(0x9986a0c3,0xec157abd),LL(0xb5fc67e9,0xbcad3bc6),
+ LL(0x13aa9c17,0x6e64dd26),LL(0x271aef54,0xa347c4a2),LL(0x883d90bf,0x47b26cb9),LL(0xe1c412c9,0xe84d9c6a), LL(0x1c67439f,0xd2eacc10),LL(0xc61b2b5d,0xd7797bb3),LL(0x8ebdb4be,0x0deda652),LL(0xac3fc2f4,0x9e04455d),
+ LL(0x27c86688,0xbbfc6e69),LL(0xa1715a33,0xf7cf2947),LL(0x47bc6409,0xe047a3e3),LL(0x6f2a5b28,0xefeb573a), LL(0xd105ba3b,0xbf3ea3af),LL(0x426c6482,0x5f01b4c2),LL(0x968390b1,0x778a5240),LL(0x72bcf6a6,0xc9c71625),
+ LL(0x6fd8b309,0x698ec2c9),LL(0xa055809f,0x512ea17a),LL(0x8822943c,0x28cb44e7),LL(0xdeb7d3e6,0x434dc709), LL(0x1be76434,0xb8b324d1),LL(0x382ff0b1,0x7cf24ed3),LL(0x2905e726,0xda8265fe),LL(0xee6c3abc,0xd57b3915),
+},
+/* digit=20 base_pwr=2^140 */
+{
+ LL(0xd2a819b5,0xf9010095),LL(0x48f2f653,0x5291aaf9),LL(0xf0afe366,0xfa533907),LL(0x8e279e27,0x88a58ecf), LL(0xfae130bc,0x0f077127),LL(0xf8a54c75,0xee9ccf1a),LL(0xbed82b6a,0x38a6783e),LL(0xed414524,0x9a1acb3d),
+ LL(0xd9c12e2a,0xe4e53cee),LL(0x7fc1308f,0x11983fc1),LL(0x892c2d0f,0x3eb4d84d),LL(0x74499723,0xa0bfc1ca), LL(0x0145176b,0x708344d9),LL(0x6f12e75b,0xbb2988e0),LL(0xada67545,0xdf73cead),LL(0x2bb8f989,0xf37069d1),
+ LL(0x9cc17f65,0xa24a35e6),LL(0x89d9abe0,0xc49b3e9a),LL(0x2fc09ae3,0x82f40303),LL(0x002cc587,0xbffe7d4d), LL(0x424ef713,0x5511f4e6),LL(0xa658f660,0xb86bf654),LL(0x1c8baea2,0x623388d9),LL(0x33656759,0x60664a71),
+ LL(0xd8447e16,0x18996198),LL(0x662171dd,0x17195d76),LL(0xf448b8e6,0x28cfe6a1),LL(0x0658c923,0x8a3c2823), LL(0x9c35e852,0x0c548d89),LL(0x2b378157,0xadf1cd2f),LL(0xf30113b6,0x999e41af),LL(0x9cf4696f,0xf87515a5),
+ LL(0x9778aa8e,0x6c332c55),LL(0xd1b8d8b2,0x290ae3ea),LL(0xbf533883,0x3e2bfa0b),LL(0x1a523ee2,0xe48e3747), LL(0x50fde3ed,0x4d40f1d5),LL(0x48710433,0xb57e695b),LL(0x1b241f3f,0xa4101258),LL(0x3042cabc,0xa0cabf7b),
+ LL(0xedfea522,0x68eb19c7),LL(0xa400db7b,0x68e028b8),LL(0xa8f03a08,0x6cd97bf7),LL(0xf442fe36,0x09f4d266), LL(0x5d713a1f,0x1ac77f91),LL(0x2f58ccb5,0x356e3a35),LL(0xf8ddc47d,0x31d657f1),LL(0x90092115,0xfea7aede),
+ LL(0x4ad49f66,0x2aeba1d2),LL(0x9d40861b,0x16ff2bad),LL(0x7da225f5,0x25464f37),LL(0x1ffc3f0b,0xa2fe66cc), LL(0xac757f41,0x74074d7f),LL(0xcd0a2c20,0x5c85d3d1),LL(0xc974b266,0xccda2a05),LL(0xcc10a04f,0x5c2e2511),
+ LL(0x510d515f,0x01ea2535),LL(0x489e7856,0xc861c54c),LL(0x680d17bc,0x9bc8485b),LL(0x819ccc86,0x71472c11), LL(0x0e9b5d8b,0xa7ef9485),LL(0xd029720d,0x698c9fe8),LL(0x61f50161,0x6ce987d1),LL(0x9d240bf6,0x035f6f32),
+ LL(0x44ec2bed,0xe7c03c9d),LL(0x76cf95c5,0x0bc4f4a2),LL(0x88f014ee,0x0722d57c),LL(0x76fa941b,0xae406348), LL(0x23ee068d,0x046424df),LL(0xe8c130c5,0xd30b6530),LL(0x554f149d,0x17b69098),LL(0x92f95b71,0x887e04f7),
+ LL(0x941c1244,0x414e7371),LL(0x94f1da50,0x1d48fe53),LL(0x6519802a,0xc18bcd89),LL(0x48925019,0xfae7c2d8), LL(0xf2ece2af,0x0f311ddf),LL(0x0a779f79,0x7e8e0e08),LL(0xb6207944,0x47daa5f9),LL(0xefd08d6e,0xf29dc331),
+ LL(0x23e48f60,0x9c096e19),LL(0x8dd36f0c,0xbcc6fe53),LL(0xbb86a9ca,0x452e60f9),LL(0xed16cf06,0xad35f732), LL(0x2bf445f7,0xcbdd01a2),LL(0xf60ce893,0xb7848e94),LL(0x2939a977,0x5e65e8ca),LL(0x63cfa5e4,0x304ebedc),
+ LL(0x252cc655,0x79bae721),LL(0xc4743792,0xa3b9a4e5),LL(0x36fdba1c,0xf32dcfeb),LL(0x7ac19885,0xadbd0c1f), LL(0xdc42a2cd,0xefb4fb68),LL(0x2289a71f,0x78b1ca37),LL(0x87fc6df4,0x7e1f70fe),LL(0x90a9faec,0x8d024301),
+ LL(0x46cd4141,0x37c08672),LL(0x1a60d8e5,0x3c0fed17),LL(0x0f56fea1,0xab18bf06),LL(0x372e757b,0x879ee748), LL(0x1d280206,0x84b19b80),LL(0xd96ac240,0xa40d7ce3),LL(0xfea42ebc,0x5d493fb1),LL(0x40d79bbd,0x9a5fdafd),
+ LL(0x383b371c,0x790c0b30),LL(0x676f8168,0x6dae5df9),LL(0x4c584948,0x101bb4fe),LL(0x55faafeb,0xe3d7e99f), LL(0x134c2e3b,0xd2c9aefa),LL(0x79e27788,0x0aa2a71f),LL(0x7ed0a606,0x4082f7a6),LL(0x6a1be308,0x843c12bb),
+ LL(0x56e9e473,0xae72ee74),LL(0x743e16ee,0xcecde6c1),LL(0x7c48ca04,0x9a06f105),LL(0x5f822a31,0x79179cd2), LL(0xe3530605,0x570d3eeb),LL(0x4c7b03b0,0xbacb30c3),LL(0x0eea0cb4,0x0a8fe254),LL(0x2cdf203a,0xa052a555),
+ LL(0x9c34971b,0xee031587),LL(0xe76545cf,0x5829eb07),LL(0x33a81bb9,0xb7a3a6ae),LL(0x49c9f710,0xff42daff), LL(0xbffb951b,0x894eae85),LL(0xce70f324,0x815fe3e2),LL(0x428b1f12,0x636564cb),LL(0xa029b0bd,0x722e0050),
+ LL(0xd373a65b,0xf45cb816),LL(0x6078d95e,0xf2210e00),LL(0x20d2924a,0xf767d7a6),LL(0x25b66987,0x06d6b552), LL(0x790563a1,0x5c4a3999),LL(0x3c85510c,0xcea00a91),LL(0xd2db6297,0x7e37da9c),LL(0xf67303e8,0xfca4735f),
+ LL(0xaf76f475,0x324ca06e),LL(0x76391adb,0x3367845e),LL(0xa26fe169,0x222aa1ce),LL(0x7ede94c7,0xb15a8665), LL(0x6b6a1f33,0x5b736342),LL(0x8562f392,0x25db61e1),LL(0xf2066206,0xfd4d720d),LL(0x82c555c3,0x26ef773f),
+ LL(0xfde6caa3,0xb6e35b3a),LL(0x87fabf4a,0x34eb5e13),LL(0x86236a62,0x4ad68635),LL(0x28510f8f,0x2651d3e6), LL(0xe0873ba6,0x88073e34),LL(0x22f63746,0x3becce70),LL(0x7c08dac6,0xff8f9b61),LL(0x8c28aa65,0xc8b45a9c),
+ LL(0xd87b59dc,0xe09c063b),LL(0xcbbdd4ec,0xf3e4b9ef),LL(0x4855a43e,0x1b6b1793),LL(0x4ada74ac,0x594d5565), LL(0xb410c5ef,0x10ee400f),LL(0x35695fe9,0xfc118113),LL(0x8f75d723,0x766cfe48),LL(0xff63aa76,0xc72023eb),
+ LL(0x9df9a165,0xc503a858),LL(0x851acc4b,0x9b1099ef),LL(0x66202ca0,0x9246c61a),LL(0x81390ccd,0xaba97788), LL(0xba9e2785,0x3309fa65),LL(0x2220f385,0xbc0388be),LL(0x00ddc8ba,0x94c01a9e),LL(0xbccfdec8,0xaa54aed9),
+ LL(0x059fc0d6,0x1a959c58),LL(0xf518e1c1,0xd0f34c38),LL(0xb53be8fe,0x38aa2b1d),LL(0xacdc872f,0xd95a2a19), LL(0xb4140bd6,0x97bde382),LL(0x4cfd5718,0x4084ba9d),LL(0xfd22450c,0xed016bfa),LL(0xa5d1f5bc,0xf00cdccf),
+ LL(0x111696ea,0x905114cc),LL(0x3a46e782,0x1f58a4d3),LL(0xa5e57fa0,0x899d1856),LL(0x68c45c2f,0x25186954), LL(0xfa6e3eec,0x806deb4a),LL(0x65a063a6,0x3c358d48),LL(0x3feacdcd,0xce28ed1f),LL(0xaaa8e601,0xef9ee31c),
+ LL(0x87c1c66b,0xddd4fe3d),LL(0xb3dbfac5,0xfc2b063e),LL(0x20c81dc5,0x52d37cd0),LL(0x083b5f53,0xb628f163), LL(0x7e42860b,0xd9295094),LL(0x307316ab,0xb877a744),LL(0x6b8d99b6,0xadec0d2d),LL(0x190bc675,0xa75183bd),
+ LL(0x4ad6bd44,0x2b1e0215),LL(0x9e020c66,0xda01ad52),LL(0x0c2913d9,0x65afd73d),LL(0xf0035373,0x67024b45), LL(0x4d308206,0xf501bb4c),LL(0x77e2e936,0xfa020c88),LL(0x936476a3,0x662b72bd),LL(0xbae57d17,0x07f76845),
+ LL(0xf34ca404,0x77a43055),LL(0x4eebc853,0x8e403294),LL(0x402fde89,0xe19ee69a),LL(0xfe00df56,0x9092acd0), LL(0xfb225f92,0x640c035c),LL(0xdce3aa84,0x92d94246),LL(0x971e9886,0x7fe8d3f9),LL(0x014b2a74,0xc569905e),
+ LL(0x7b7c299b,0xbafb8c4d),LL(0xd534cd21,0x3d289c60),LL(0xd311dee4,0x95e7032b),LL(0x6e8892a4,0xac0c46dd), LL(0xe5bd6486,0x9fedef00),LL(0x99f703aa,0x3f4d8daa),LL(0xf0c0ecd2,0x78e47925),LL(0xfdac73de,0x8f143c2b),
+ LL(0xc14bd094,0x1f88f5a9),LL(0x99d9532b,0x6cc19e43),LL(0x639ba66c,0x6e474499),LL(0xf5d06b03,0x5d9a283b), LL(0xaa25dbb5,0xc7e8164f),LL(0xf03faec8,0x7ab42a48),LL(0x647a0d72,0x4135765b),LL(0xe196b571,0x9562a676),
+ LL(0xa720cc20,0x62cc4c05),LL(0x13fa1ad2,0x9ed3f637),LL(0x7f59bac9,0xe5816f51),LL(0xb6884359,0x738e1544), LL(0x34d0fb02,0x83bb2666),LL(0x8014c57b,0x0e582c6b),LL(0x145e2bff,0xbb4069ae),LL(0x4f5f1d7d,0xd1965cdf),
+ LL(0x3cead86d,0xaf77f98b),LL(0x0e51cbd8,0x0ba278bd),LL(0xac2ebb7c,0xf11f20f6),LL(0xc9992b55,0xafd2333f), LL(0x322472b6,0x425dd0e4),LL(0x0958215e,0x0027a74a),LL(0x4cf7e0e4,0xddb301e7),LL(0xcbb70c2e,0xd0656ed5),
+ LL(0x0e7662e8,0xa40f629f),LL(0xe399a5ca,0xdaa85755),LL(0x7297010c,0x4c119aba),LL(0xe5df7140,0x4a4a6a43), LL(0x474f7873,0x6d90d303),LL(0xd1f8f867,0xc5b0e19c),LL(0x4f6dc217,0x188bcae6),LL(0x6777357f,0x51ce999a),
+ LL(0x41aeb39f,0xdfc9578b),LL(0x7dd55c1f,0xeeda86fe),LL(0xfb814075,0xd4b8fc54),LL(0x33a1317c,0x12e32a78), LL(0x2fd217d1,0xeb79cd2b),LL(0xdbd07638,0x5f5f20c0),LL(0x53dc7d8b,0xfc57643a),LL(0xf08350e2,0x65126014),
+ LL(0x871b0d3d,0x737ef5b4),LL(0xae3143a5,0x6b7e04ce),LL(0xb7ae12b9,0x0e5ab52e),LL(0xdb66ee0e,0x1a956daa), LL(0xeaa7042e,0x59657e47),LL(0xbf84a2cf,0xbbc35318),LL(0x78679b8b,0xef55429c),LL(0x60cb7678,0xef92df9d),
+ LL(0x1dd267d6,0x17655580),LL(0xeb0bc1fa,0x00a3ec71),LL(0x50514840,0xafa0a256),LL(0xf161c685,0x68c28d0c), LL(0xb1c766dc,0x069f7862),LL(0xd5ad4568,0x6868a463),LL(0x70e46d7d,0xf9c3d670),LL(0x6c875260,0xd2432cc9),
+ LL(0x088cecd9,0x534c3425),LL(0xb4e34c6c,0x3f1818e6),LL(0x028f153b,0x3aedf0a8),LL(0x50d9433a,0xe0a1cb9d), LL(0xe523b764,0x9b4e225f),LL(0xe5f8542c,0xcba6cba9),LL(0xa8f6b81e,0x59c307e4),LL(0x01bb44fc,0x36abf4b7),
+ LL(0xdd62528c,0xf7692c14),LL(0xdf57773e,0x0d4a8341),LL(0xc9b4f968,0xece6957d),LL(0x52779586,0x82eda200), LL(0x2f06ec6b,0xb902c488),LL(0x91a876f0,0x127dd7ba),LL(0x33ad0c13,0x06eb96d8),LL(0xfc5985ce,0xd7394080),
+ LL(0x661aaa4d,0x624c8f61),LL(0x6717a3e1,0x6fe10a11),LL(0x53168ad0,0x6c288c53),LL(0x8b52d037,0x91b8779b), LL(0x1b5b0ab9,0x89e664d4),LL(0xf30d47d3,0x9f69b44f),LL(0x03176019,0xfe67cad5),LL(0xb346a205,0xb83efd48),
+ LL(0xaeea0c91,0x63fc4863),LL(0xdb56004b,0xbabf9042),LL(0xa9917def,0xdb19f2ee),LL(0x54c3fae1,0x1d12f2dc), LL(0x55e36d40,0x7bb496af),LL(0x6be63b27,0x1f6c11f8),LL(0xcaf9a5b9,0x96d79804),LL(0x0648051c,0x03a085c4),
+ LL(0xb56baf4c,0x3b54c223),LL(0x559c1fc1,0x04af8c4c),LL(0xabd3cebb,0x05d55266),LL(0xf865e262,0xd2d3ae9b), LL(0xedfedc54,0x3bd3ca3a),LL(0x922776c4,0x30a6ff1c),LL(0x1616a6f2,0xfecd8845),LL(0x94948d8c,0x4e7bc2e8),
+ LL(0xedca784b,0x16e0d824),LL(0x67ea1eea,0x84584f98),LL(0x8625626b,0xeceb1418),LL(0xc34fc1f3,0xa487cf9f), LL(0xa57cec36,0x4ecfedd2),LL(0xd24a0709,0x08624865),LL(0x6a48f3ee,0x47bb1909),LL(0xc69bc041,0x54c5dd0c),
+ LL(0x7527166e,0x15a291e6),LL(0x4a9a8315,0x8a92370d),LL(0xda584bd6,0xe9fe705d),LL(0x3625a669,0xed441dc3), LL(0x3063f2de,0xa57929ce),LL(0x6348cc31,0x2809fe4b),LL(0x04cc19c0,0x92041d54),LL(0xb62c1f94,0xd7c227fc),
+ LL(0xcd0d497c,0xecfeee53),LL(0x128818a8,0x8d1ea9fd),LL(0x2ae4725d,0xb5cf2c28),LL(0xc6abad3a,0x7de9f967), LL(0xb14a183c,0xc64a11fc),LL(0xd5777d77,0x7f14d0fe),LL(0x12957444,0xbe79846c),LL(0x0e3257ca,0x4cf23abf),
+ LL(0x6e01b48e,0x8da0fd8d),LL(0x5ee87ca4,0x63a7ff16),LL(0x5cc96b94,0x90dff4d3),LL(0x406fc905,0xff1b41c3), LL(0x3ac71c41,0xdd932925),LL(0xcf65e59d,0xec57f1b8),LL(0x3ce0512b,0xa3116d6f),LL(0xa2e28316,0x3b46fd3c),
+ LL(0x60156a5e,0x5a6c0314),LL(0x55d46fd0,0xfab3afe3),LL(0x9846f0db,0x4617926c),LL(0x121ef237,0xc2d5a447), LL(0xf1cda3b1,0x789498d1),LL(0xccd64aac,0xa195cf03),LL(0x9440be2b,0xe8d1a162),LL(0x3ad5373e,0x7399890a),
+ LL(0x4fbf1899,0x65dcea2f),LL(0x44ee1a5a,0x44d9c8ab),LL(0x406880fb,0x2e94f8c8),LL(0x51faab7d,0x70732bad), LL(0xf1e92b52,0xd69309dd),LL(0x3c7685d0,0x25f9a675),LL(0x1dbfbaa0,0x3604f30b),LL(0x2ff28c22,0x5ac0001b),
+ LL(0x52762d8d,0x648ec4fa),LL(0x0cef95f8,0x4fc248c6),LL(0xe5fbb57d,0xfc0f7030),LL(0x5ff2db51,0x2e644729), LL(0x3775471c,0xd85877ec),LL(0x6076a271,0xe2580058),LL(0x09cb3873,0x58a4a24f),LL(0xb142da8c,0xb412928b),
+ LL(0x5997987a,0x1da7964b),LL(0x1825d97b,0x69765ff0),LL(0x4c97095c,0xde8ae407),LL(0xbb59316c,0xb257a968), LL(0xcf2dfbd2,0x80e5240d),LL(0x1fccd0e7,0x2b3b04b0),LL(0x8ff1093e,0x949f1234),LL(0x65f62273,0xa4df3290),
+ LL(0xd0058ffa,0x305b7479),LL(0x180b0de6,0xe459ecff),LL(0x8ca0585f,0xfbe00c08),LL(0xc3dd4fa0,0xc169e23a), LL(0x44026f6e,0x65d9009a),LL(0x1d96fe58,0xbbc258c3),LL(0x328ed1e0,0xd7ed379c),LL(0x23970884,0xe8b45744),
+ LL(0xed1095b5,0x2f44c8ce),LL(0xc59404aa,0x25725b0d),LL(0xa273e09f,0xea926278),LL(0x529143d5,0x102b120b), LL(0x81174d10,0xbd2c012d),LL(0x4e8333ad,0x0bf5cf89),LL(0xb2f60645,0x6b93e3b0),LL(0xf38df3ce,0x040298b8),
+ LL(0xb89e18fd,0x6433b6fc),LL(0x6bd6af88,0x48d6584a),LL(0x0e1747a5,0x46c8a061),LL(0x1ed79faa,0xe225d3cd), LL(0x5c28a48b,0x6c579abb),LL(0xda3889d6,0xc7a5ff4d),LL(0x008febdf,0x037ebc4b),LL(0xa7c5cbc9,0x03b60593),
+ LL(0xdcaa3319,0x0840804d),LL(0xb7481f45,0x38b0f084),LL(0x112e794e,0xfdb059c9),LL(0xe1afb614,0xb62bce05), LL(0x53be7c02,0xc15035b6),LL(0x153ee8e5,0x66fc7106),LL(0x8258727f,0x27fd2ea4),LL(0xb470105e,0x8e012416),
+ LL(0xd7711aee,0x3d24685b),LL(0x021bab69,0x66a83c3b),LL(0x5501d69d,0x6e1112a7),LL(0x068b0504,0x2219fe0b), LL(0xa926ab1b,0xaaa553c1),LL(0x56d6ca58,0x1c81af95),LL(0x221ef447,0x0a997380),LL(0xf5f55487,0x881a62fa),
+ LL(0x4f1b618a,0xf88fa0bd),LL(0xcbac98e8,0xb20e161c),LL(0x3bc6a7ad,0x443352b5),LL(0x0fd5748a,0xbc8e03ff), LL(0x0ca427fc,0x64006aff),LL(0x7cbbda99,0x1a477593),LL(0x1a347c47,0x21ef1afd),LL(0xdee162b6,0xfe056287),
+ LL(0x797a0b14,0x9d4eb7da),LL(0x951c4bd0,0xe4e01a46),LL(0x7fe354a6,0xaf8fa17f),LL(0xc430b12b,0xd71f160c), LL(0x83d46be0,0x5bb68437),LL(0x619bba86,0x99d10d82),LL(0xf4327042,0x95c2219d),LL(0x9c19ab57,0xdace2322),
+ LL(0xc8750fe7,0x88abbc67),LL(0xd3abe7d2,0x81ab300a),LL(0x45aa8948,0x62a6d8d5),LL(0x5d4ce8c3,0x76175bbd), LL(0x8ea70976,0x095cb181),LL(0xf7e62a19,0x785de3fc),LL(0xed11a7fe,0xc478bce8),LL(0x1528aee2,0xb7e5993b),
+ LL(0x76c32e4b,0xb9ec58d7),LL(0x2dbc9a61,0xef815613),LL(0x5e07410d,0x372c3856),LL(0x033276d0,0xa1b16510), LL(0x82640d26,0xd8589581),LL(0x9053fff0,0x1cb98180),LL(0xc1ff11f1,0x41519ce7),LL(0x666431e4,0x2f21a48f),
+ LL(0xe83ee840,0x2c223ed1),LL(0x1e7cf4dc,0x833ae708),LL(0xacd13385,0xec8853d8),LL(0x6a7a8cb1,0x559115ab), LL(0xeb184e71,0xe2f4ab2a),LL(0xc10194df,0x679abbce),LL(0x3aca0828,0x10199c84),LL(0x978cc1d6,0x7474e113),
+ LL(0x44e8eb9a,0xa4460ef1),LL(0x828aa4bf,0x4cde5260),LL(0x249bff50,0xd3d23790),LL(0x6bc7fbbc,0x2e6660da), LL(0x61494df0,0x3e3cc146),LL(0x0bcda8ba,0x6e9a1571),LL(0x096e00b7,0x68ce233e),LL(0x5106c85b,0x247a5c49),
+ LL(0x55fc5757,0xe6f0cb5c),LL(0xb7585799,0x452682b9),LL(0x869e747e,0x84509dfe),LL(0x8d23be04,0x904366e5), LL(0xb0f72c6d,0x7324a14d),LL(0x1913a9ff,0x9fbe3116),LL(0x428a6b5d,0x2f9fa62a),LL(0xf8a34d9e,0x8039270f),
+ LL(0x407aec78,0x0e3ce7ae),LL(0x826458cd,0x4d935d3d),LL(0xfc6f46d4,0xf75db7db),LL(0x88586874,0x3ab7ba68), LL(0x9a198b50,0xec92749f),LL(0xefc51cdb,0x0ffc7681),LL(0xe17bc0e3,0x951406d5),LL(0xc898a018,0x39cd2d07),
+ LL(0xf2f79af6,0x9dc3803c),LL(0x0a56cd68,0x292f3164),LL(0xf6fbdbdf,0xdcac21f9),LL(0x23e9e959,0x6f9ce2a4), LL(0x970f6c34,0x2011d221),LL(0x9e2decfb,0xd2e63711),LL(0x118ff327,0x19c7a489),LL(0xbb6e534e,0xe19d7e83),
+ LL(0xbd1a426b,0xc685389a),LL(0x8c679952,0x432ff7b0),LL(0xc5e2687f,0x516cbdfa),LL(0xba1eac8f,0x8242405d), LL(0x0b09854e,0x63af3152),LL(0x231ec979,0xcecd0faa),LL(0x7273f0b2,0x4746733f),LL(0x8f001365,0x69b28d87),
+ LL(0xc6f2623c,0x0d87d506),LL(0x86c40ed2,0xd209a9c6),LL(0x0fa20f3b,0xa5b7fde2),LL(0x4f5b2129,0x54550dc5), LL(0xfeddaa1b,0x36884047),LL(0xd899a29f,0x51398fa0),LL(0xcdf11867,0x14a416be),LL(0x3e466b62,0x86351ac6),
+ LL(0x39bb481a,0xd63e91e1),LL(0x99984155,0xdcdc072a),LL(0xd2d8e622,0x9fce6e38),LL(0x8e8c8034,0xbf6978b6), LL(0x8c37990a,0xaa1ae874),LL(0x0e749b86,0xd1f0e068),LL(0xcbdc7c12,0x5aa303b1),LL(0xc9130211,0x9a78baaf),
+},
+/* digit=21 base_pwr=2^147 */
+{
+ LL(0xb3e2087b,0x5eeba910),LL(0x44a61a33,0xbd016dd3),LL(0x48cd5c0f,0xffd1f081),LL(0x2e6a8e94,0x041c6aa0), LL(0xc4ac3d91,0xe09c35c5),LL(0x634767a4,0x58298105),LL(0x1040c2b5,0x6120e7cb),LL(0xa713589f,0x32a661ef),
+ LL(0xbd74c70e,0x5a056a90),LL(0x8af672f3,0x44f7d00d),LL(0xef4e9a48,0xdc25ab68),LL(0xfdfb1069,0xadd15cc3), LL(0x9f3033bf,0xb1f4fd28),LL(0xebb8b8a7,0x088a49bb),LL(0xa8d2861c,0xea485869),LL(0x6b977fb5,0x46dbfdaf),
+ LL(0xd88ae888,0x04e6461e),LL(0x9be2d7ad,0x112d204a),LL(0xdb558427,0x952dc813),LL(0x27e35200,0x39b01652), LL(0xff02cdbb,0x8b89bfce),LL(0x3e854e4c,0x1381a99b),LL(0x999efd2b,0x68185218),LL(0x86dc62e1,0xeb41e1bb),
+ LL(0x02d0aaff,0xa264ef40),LL(0x6e679fe2,0xa678c07d),LL(0xfd88bdce,0xcff13be7),LL(0x617badb8,0x9a8efe8d), LL(0xad5a22f4,0x1388a815),LL(0xfec398b3,0x8f821400),LL(0xff4fc2da,0x85a6a565),LL(0x858dd4f3,0x681f0181),
+ LL(0x91ee75bc,0xdc870745),LL(0x64f20e50,0xbadbf940),LL(0x49d3d417,0xf3ea437f),LL(0xc02109d0,0x7bebd868), LL(0xd16bb240,0xe6c8d93c),LL(0xfdab9bbd,0x2087141a),LL(0x20a3b470,0x8dba80ff),LL(0x29d3a8d7,0x960a0c7b),
+ LL(0xf8ec1151,0xae61b637),LL(0xaadc8545,0x415dd36b),LL(0x69d0985a,0xed21d176),LL(0x97893f50,0xc4d062af), LL(0x337b81f9,0x4d93ba1a),LL(0xb7c163a2,0xb995fe9e),LL(0x5416e4ed,0x447eff3b),LL(0x0bf4a8e7,0xd7660300),
+ LL(0x56d9e00f,0x9e14c6a2),LL(0xfa1f60e0,0xa228491c),LL(0x8782a9be,0xd540713e),LL(0xdcd55e21,0x5d3fcce8), LL(0x35c87b90,0xa176c34e),LL(0xf9508f35,0xc1d80aa1),LL(0x92302d47,0x14f7e7fc),LL(0x2b076e72,0x459372ba),
+ LL(0x4e933b19,0x44168fbc),LL(0xe54ea969,0xaf2db74c),LL(0xaeacbb56,0x36fade13),LL(0x84e6cd1d,0x29708665), LL(0xb692df97,0x6f7ff1e1),LL(0x6ae66307,0x5a68c1a2),LL(0xe7685f20,0x85bc544c),LL(0x0f65eeec,0xb3f42e6d),
+ LL(0x5b91b644,0xef209f44),LL(0x50cb02b6,0x808b930a),LL(0x099f684f,0xc5da5e86),LL(0x4330c2d8,0xd8f1dbcc), LL(0xd8608776,0x52e8cab5),LL(0x16e56f5d,0x13c89771),LL(0xb135282b,0x7d7d802a),LL(0xe9be8a20,0x69762c39),
+ LL(0x2a08a1dc,0x13f6bbad),LL(0x7f2dba7a,0xa7131e4a),LL(0x7864f5a3,0x751dce48),LL(0x08135109,0xc5af1b45), LL(0x4f08636e,0x3c4d75f7),LL(0x2e251e48,0x9949b2f5),LL(0x9bd98853,0xd0497977),LL(0x909b0e84,0x09d8e627),
+ LL(0x4ceff1c9,0x505753ee),LL(0x460710ca,0x03ca4571),LL(0x5480abc0,0x0cf72dee),LL(0xc19c8ef3,0x55d5a30e), LL(0x86541f6f,0x9e47641b),LL(0x10c9d6fb,0x89b2e48f),LL(0x0860915c,0x9d16382b),LL(0xf54b337f,0x770ac417),
+ LL(0x77ef7f67,0x366d0781),LL(0x2b6340c9,0xfefec947),LL(0x097acf63,0x7ce3a056),LL(0xaf306dec,0x26538c7c), LL(0x287dc8d1,0x8a8bb55e),LL(0x448823ae,0x9431095b),LL(0x7970fc51,0x8358087a),LL(0x413509ac,0x95299959),
+ LL(0x8b0911d4,0xb165f92a),LL(0xbfb37459,0xdde855ee),LL(0x3d9ce36e,0xe672eed4),LL(0x74bae261,0xf7da91e5), LL(0xb741c8e6,0x1f67323c),LL(0xc92c91ce,0x8efd4661),LL(0x78e73c42,0x556f0b1a),LL(0x16101f96,0x7d326b7f),
+ LL(0xfb48bd3a,0x8814ef0b),LL(0xc508309e,0x1bbbe13e),LL(0x67709c10,0x7ddaf061),LL(0x6436f655,0x82b67847), LL(0x03712e64,0x2a5601c6),LL(0x3e3f9b2e,0xac1f0362),LL(0x09184b5d,0xcc7e6a09),LL(0xb4625149,0x1258b265),
+ LL(0x384a6b54,0xd9f21461),LL(0x6cfe9311,0xde483161),LL(0x889f43cc,0x593dae45),LL(0xedee221b,0x8454335b), LL(0x3a2cbced,0x90f3fb43),LL(0xcc8dcb75,0x895ed692),LL(0x14233aa7,0x9857d719),LL(0x48166d5f,0x91b1a2ab),
+ LL(0x675b47a0,0xfbf7033a),LL(0x6542378f,0xcb3669c4),LL(0x125ec248,0x96abb0f7),LL(0x795fc346,0x6d5d2047), LL(0x8f5cffb6,0xa6c6c9e8),LL(0xbea5ee09,0xb968f2c7),LL(0x844ffd6f,0x2f2ce735),LL(0x27e40ac8,0x7931b877),
+ LL(0x2b63d538,0xe1f62dcf),LL(0xf44d7bf9,0x395681dd),LL(0x54aec359,0xf02eedf7),LL(0xa0ad5eb7,0xc64b6233), LL(0x346b086a,0xc65093c7),LL(0xe957b243,0xfcf8ecc9),LL(0x1ca48020,0xe1accffa),LL(0x4047bbeb,0xe1f29792),
+ LL(0x9fc6be25,0xb1097d40),LL(0x923eb7b4,0x02d33d19),LL(0x1f58f545,0x9e25200c),LL(0xda51efcb,0x2ffae306), LL(0xc0b011f2,0x7e6d76c1),LL(0xf680676b,0xedbd8398),LL(0x8d7fc8c2,0x38517fc2),LL(0x5c3ab05c,0x55a7fcf9),
+ LL(0x8e6dd02d,0x047e2422),LL(0x1f290d6a,0x7b3bf0e6),LL(0x6a99a6d0,0xbcf326fc),LL(0x2eef8232,0x1e3f38fa), LL(0x15bac529,0x9890780e),LL(0x9f143ba0,0x94202e0e),LL(0x885e4ed5,0xbd574712),LL(0x396f938d,0x2404c223),
+ LL(0xacde8286,0xd54d401c),LL(0xe7af01fd,0x80397794),LL(0xf615a8eb,0x94457d07),LL(0xd22d9ef7,0x34680480), LL(0x2c489ccf,0x04d4b302),LL(0xc3673dae,0x11dea4bd),LL(0x58cdfe41,0x8fbb4df5),LL(0x0f10a70e,0x49425184),
+ LL(0x077a59ce,0x831b977a),LL(0x894627f3,0xee08fb0c),LL(0x2f8553f0,0x21360507),LL(0x0487171b,0xca77ccd1), LL(0x07e11059,0xc17d20c2),LL(0xbe613256,0xcf74be6b),LL(0xa5fe18c1,0x06f185e6),LL(0x2b57ce3e,0x8d2cf4f5),
+ LL(0xc9c983e7,0x7179273c),LL(0x153f58d8,0xc7d27357),LL(0x4f400bd4,0xc0273069),LL(0x26262553,0x23309c7f), LL(0x712d0314,0xf26b6e11),LL(0xf96ee39a,0xb925cebf),LL(0x73944251,0x6df57108),LL(0x589d90aa,0x95419b24),
+ LL(0x796a8ee2,0x57a1bcc5),LL(0x2acee09d,0x22a22530),LL(0x66fa2911,0xa4c2cc03),LL(0xd85f13dc,0x9cc2b7fa), LL(0xce152790,0xf2498b8a),LL(0x1caf39d1,0xd8406007),LL(0x84c0822f,0x7ff50064),LL(0x155f1280,0xaf14ca4b),
+ LL(0x89b781c2,0x113f094b),LL(0x013833a5,0x996bf893),LL(0xc0b9cf6d,0x26bc6210),LL(0x6a88f1cf,0x18e2d3ac), LL(0xa21a2d35,0xc0ff2b3c),LL(0xa79e918e,0x409c2598),LL(0xb6917e22,0xffcf65a0),LL(0xbb4f8f3c,0x8036897f),
+ LL(0x9ec27fd7,0xac660365),LL(0x0c56cbb1,0x3c5ca1a9),LL(0xbe9e9ec7,0x01c5dce1),LL(0x386edb4a,0xdc21b01a), LL(0x4b1dde01,0x47e02a92),LL(0x44af3e0b,0x0613b7ca),LL(0x1c445b6f,0x644ac708),LL(0x87243e2a,0xb5566f0f),
+ LL(0xba9f354a,0x5b244172),LL(0xeb653a5e,0xaca4e9d3),LL(0x514809f2,0x6ff6904a),LL(0x96595230,0xf87a329b), LL(0x8d4bd051,0x39ebe6eb),LL(0x07d17d59,0x66f05f5c),LL(0xe0f81731,0xfa1ee673),LL(0xd12804a9,0xf41c1042),
+ LL(0xacd14cf5,0x1c4a655a),LL(0xef47548f,0xdc72f5bc),LL(0x0b3ee6c7,0xab07ceff),LL(0xbb501a28,0xcfa88319), LL(0xd8f03f7c,0xcec9c2e2),LL(0xe0c98d62,0x3098d752),LL(0x0a8681b3,0xa41a0794),LL(0x23587932,0x0e588076),
+ LL(0x5ef86f7c,0x4617dc66),LL(0xcedb5377,0x51de8430),LL(0x737381b6,0x0dda704a),LL(0x008f4671,0x83a44653), LL(0x38401c11,0x71bbb73e),LL(0x4894d378,0x879fe49c),LL(0xeab186a2,0x8875eef9),LL(0x12a382a9,0xedefe278),
+ LL(0x13b897fd,0x95ef41b8),LL(0x2a98ddd9,0xfefd495f),LL(0x680b12e8,0x09cbccfc),LL(0x167da5dc,0xc1888a21), LL(0x3bb290b4,0x2a204912),LL(0xd9613190,0xdcac95fc),LL(0x709c76f7,0x4df94f62),LL(0xa5cea926,0xc8c3a8ab),
+ LL(0x37a2b813,0x15c876b2),LL(0x9c3c821c,0x9b52803e),LL(0xcb3d6ff1,0x40f2268c),LL(0xa1573601,0x689f1696), LL(0x8e921f56,0x8d7566dd),LL(0xd992335a,0x5d8a990c),LL(0x20dc4f4b,0x6339153a),LL(0xdc5d06ab,0x0b07419c),
+ LL(0x97c201f9,0xe9cc014d),LL(0xa635f472,0xec04a52e),LL(0xa538a84f,0x6aac504a),LL(0x5762fe7c,0x4d0288e3), LL(0x34cbd09a,0xaa8539f0),LL(0x2619bcf7,0x6f7e0e94),LL(0x0dd338d0,0x178303dd),LL(0x8326f40e,0x6b58c2b1),
+ LL(0xfe73e699,0x98bb15ec),LL(0x47526489,0x7533abdc),LL(0x491dcc6d,0x4b269607),LL(0x77187363,0x325ec2a0), LL(0x7e9ab865,0x766faa19),LL(0xc25a9448,0x1c105b4a),LL(0x0531b5ba,0x0b6b8963),LL(0x2db1a579,0x32691f11),
+ LL(0x643e479c,0x24d90a57),LL(0xb98578df,0x048b27cb),LL(0xe53bed53,0x0600f93f),LL(0x0aac585f,0x1fd57dfc), LL(0x71d0e4e0,0xc3d72121),LL(0xf612fc4e,0x5ff10dfb),LL(0xb5a7ec79,0x9edf4b23),LL(0xd87706ab,0x975165c7),
+ LL(0x7095c3c4,0x8b99db04),LL(0x897faf50,0x65196441),LL(0xdd5b64cb,0x5d23d7d9),LL(0xe95fe601,0xec734b06), LL(0x0b5fcde9,0x03a5f53f),LL(0xebe35310,0x0186ad22),LL(0x84846603,0xe9a65eef),LL(0xa7c6e5be,0xe99e5188),
+ LL(0xf0887da6,0xa917327d),LL(0xe3f9fa70,0x49965f78),LL(0x4f10b31d,0x02ed227d),LL(0xb6120be5,0x535b4386), LL(0xcc1bf98a,0xdff21a8a),LL(0xeb1634bc,0x5b52a09a),LL(0xa3f61fa2,0x60f8690d),LL(0xb863c790,0x58a02566),
+ LL(0x5c6b2929,0xf9b90a9e),LL(0x22fca36e,0xd552e84c),LL(0x9eabcb58,0x6b23da4f),LL(0x5d4136dc,0x01111d07), LL(0xb3642a09,0xfaa80059),LL(0x5f49d533,0x1de667f4),LL(0x17525176,0xb3268776),LL(0xda729fde,0x75b0b102),
+ LL(0x6e9fe6ed,0x4ec7f678),LL(0x2717f8b0,0x28d29578),LL(0xd4cc149f,0x6a713c37),LL(0x7dfdf8c6,0x4804e04f), LL(0x5c931aa6,0xe7c6daab),LL(0xa0394f29,0x793e411d),LL(0x79ed9819,0xc0741c0d),LL(0x24d5d992,0x3f2ba70b),
+ LL(0xca9c987a,0xa61dc03f),LL(0xe64b50c1,0x78201cb8),LL(0x1861f4e4,0x45a23c25),LL(0xc4ee5d82,0x10f19f4f), LL(0xf3f055f4,0xf1520547),LL(0x006ccf49,0x69ae26b3),LL(0x33d8d4ad,0xe96eec0b),LL(0x48a4fc2c,0x00765f0c),
+ LL(0xa3976c07,0xad47e14e),LL(0xd905b6b4,0x82b1f882),LL(0x91382bac,0x7a1b9d73),LL(0x18178290,0xcc84a820), LL(0xb4e845ab,0x1123c6f6),LL(0xb92e3b08,0x63216635),LL(0x183879fb,0x748be745),LL(0xa73e9ada,0x7f20e1f0),
+ LL(0x9224c152,0x05de3e11),LL(0xea8fda4e,0x2fa9a474),LL(0xf48055ec,0xf5c8df05),LL(0x9e23a599,0x48bbf43a), LL(0x148086db,0xf593f034),LL(0xef0a2b62,0x0173a87a),LL(0x3fbabb6f,0x90ef0132),LL(0x21ade107,0x56ced09a),
+ LL(0x73f1d3e0,0xcf1ce892),LL(0x22424580,0x765236c6),LL(0xd939d063,0x0d223937),LL(0x7cb2fe2f,0x9a21beda), LL(0x1ce3a7fc,0xa559a571),LL(0x1b060dd5,0x7fd6b255),LL(0xc5afdf1a,0x4dfbd210),LL(0x1239368a,0xa74751ce),
+ LL(0x6d9a3eec,0x93acdd06),LL(0x9832dcfd,0x7d97f794),LL(0x0cc645ca,0xdafa9a44),LL(0xcfee0817,0x1da27ddf), LL(0x01b8dd49,0x0c1e6319),LL(0xd91aeace,0x8267e508),LL(0x87f43f20,0x86a2cedc),LL(0x07db2f24,0x7dd0e670),
+ LL(0x9db25177,0x8ea1e973),LL(0xab8802df,0x659cccb8),LL(0x004940ab,0x2bd39c65),LL(0xd9419db5,0x57676876), LL(0x6d6f237c,0xd52058a3),LL(0xfb4a9a7b,0xd9812dcd),LL(0x53bec56e,0x879890d1),LL(0x7ac5d9d9,0x17b7f151),
+ LL(0x1ec6db6c,0x2db3f5df),LL(0xafdf29b0,0xe9a3b18f),LL(0xe63a9ae9,0xda633d62),LL(0x38d13c8c,0x0922b16d), LL(0x7462c8e6,0xaeb7e270),LL(0xa01b6984,0xa98c96d8),LL(0x297c242f,0x5586e0d3),LL(0xff587596,0xbeddd1ab),
+ LL(0xc02ea084,0x79ac33ce),LL(0x8e02ae2f,0xe7d06753),LL(0x94d526b8,0x05fffd7d),LL(0x5ebc46d0,0x4590d655), LL(0x855f85e6,0xfb79c066),LL(0x7400ed08,0xbb3f0a6d),LL(0x67fb3683,0x46f4c3cd),LL(0xd19804cf,0x62fc1931),
+ LL(0xd1b6f356,0x0480e772),LL(0x56320242,0xa5810f25),LL(0x64073c03,0x6cf6c9c3),LL(0x46a6bfbc,0x7dfe137b), LL(0xba59baf8,0xa5633fa0),LL(0x5fd4929a,0xb703e5db),LL(0xd7515518,0x09eef835),LL(0xa0e3b067,0x2e596aa8),
+ LL(0x8649bb99,0x793831fc),LL(0x5ba4c1b6,0x91cb0057),LL(0x270ec9e8,0x44e93dbd),LL(0xd139d219,0xbf2ed01a), LL(0xc9d68198,0x39697e05),LL(0xde2b6894,0xf04439cf),LL(0x1e6b8e6d,0x65b7a04a),LL(0xce35ae6d,0xce3e9425),
+ LL(0x9f102fb3,0x041e0aff),LL(0x106ae748,0x91b3a87c),LL(0xc426fa5d,0xfd969804),LL(0x28f95b76,0xe624f1cd), LL(0x34f2ea56,0x6fe28cce),LL(0xd230f37c,0xdea55947),LL(0xf92f2742,0xd5e336f2),LL(0x1899c751,0x86852e3c),
+ LL(0xa5d1bd04,0x5ef2a63b),LL(0xb6ca2b79,0x5f4721a2),LL(0x9f484f78,0xbdb27b7c),LL(0xb085b4ed,0x2b07bf5b), LL(0x501b62ab,0x96b8ae73),LL(0x3ba64e23,0x0b1e003a),LL(0x93024347,0x43f9ec00),LL(0xae180a03,0x3c8c0c7e),
+ LL(0x8c0b21d4,0x58c72237),LL(0x2b15a1fa,0x9d51a996),LL(0xec755eda,0xf5201743),LL(0x933800fb,0x0c845fa3), LL(0x0e82418e,0xb6b66cdb),LL(0x3ae3eeb7,0x875258e5),LL(0x1a8f2b3e,0xf2c30b1e),LL(0x250f3328,0xa10b3843),
+ LL(0xc47c53f8,0x9f449967),LL(0x8775e16e,0x5dfe8c76),LL(0x336f2194,0xb02813a1),LL(0x5636498b,0x90ad3ad5), LL(0xc7c647e0,0x095acf96),LL(0x1f57c069,0xc90ef12b),LL(0x1fb85cc1,0x52f51878),LL(0x25a125ad,0x582cfd67),
+ LL(0x0d43ffad,0x53b4bfc7),LL(0x04dcf047,0x143b0b48),LL(0xd4500bf4,0x65d16216),LL(0x9ab1e4cd,0x960c7910), LL(0xe1d08c70,0x38b7ef7e),LL(0x9806e01e,0x64ae69e1),LL(0x6796b923,0x07468184),LL(0x70af1e64,0x6480887a),
+ LL(0x02384b34,0x4eb2d6fb),LL(0x05be47f3,0xb29337a8),LL(0x6b744f9d,0xfec96fc0),LL(0xc8c9afc3,0xc3de2fb0), LL(0xcc6dd0a5,0xe8ccc3eb),LL(0x71d7de7a,0x0329a9b9),LL(0xe357c4f9,0x459fbc8c),LL(0x025fdc97,0x80287f50),
+ LL(0xa089583d,0xedf1b0aa),LL(0xfb08add3,0xb1ad1a57),LL(0xe1ae76c1,0xd6826d03),LL(0x541462c8,0x3070cd2e), LL(0x83e6f4da,0x7b03c859),LL(0x24bdb487,0x5b39a809),LL(0x453bebb7,0x70017570),LL(0xb8ebbfc6,0xfe4e6206),
+ LL(0x106defe3,0xbb8a1899),LL(0x8683287a,0x6f23dc7a),LL(0x65d96aed,0x2cf01995),LL(0xdda4ea18,0x4e4cf7e9), LL(0xd2d0316b,0x72ad201f),LL(0x61de6cd4,0xd6451150),LL(0xc84856be,0x12432dbf),LL(0xd2a8378a,0xdd4dca98),
+ LL(0xbf881f9e,0xe70af958),LL(0xc4e58ec4,0xd4cd35ad),LL(0x5a531924,0x3889d3d9),LL(0xb4ce15ec,0xac657424), LL(0xf41e1344,0xdbe384ca),LL(0x5ab8bb08,0x9a1aed23),LL(0x8561df1d,0x375a041f),LL(0xb7685c1c,0x19f7a238),
+ LL(0xa4ba6317,0x8ba59933),LL(0x271f4aa0,0x0c44b6df),LL(0xbd64e922,0x51f4e88f),LL(0x9095769f,0x7279df94), LL(0xeaf8c8d3,0x098c17b6),LL(0x1aa841d1,0xe602ff2c),LL(0x8b63ce81,0xbe4e4926),LL(0xfcc79573,0x85de277a),
+ LL(0x5b8304db,0x38253d40),LL(0xe422af76,0x58c50c3b),LL(0xbf95c27a,0x7f7ec0d1),LL(0x6041df33,0xcb7c3a8c), LL(0x35364c89,0xc55595c0),LL(0x2a6eb1e6,0xd1a72aa7),LL(0xdeb98a3d,0x1fa941de),LL(0xeff46690,0x1e9607ab),
+ LL(0xad46a05a,0x6633e398),LL(0xb585e241,0xb99e5784),LL(0xea558424,0xd63106a4),LL(0x5df0e501,0xf0a5f939), LL(0x59dacce3,0xba17aaef),LL(0xe907c457,0x03dc5a07),LL(0xa9800bc3,0xa59f6d63),LL(0x364e1ef7,0x294a3827),
+ LL(0xdd191356,0x741bbab9),LL(0xc43954a4,0xe8fe9161),LL(0x65341d90,0x6a711fa9),LL(0xadef2d82,0x09bd0faa), LL(0x21ffc303,0x2112f27e),LL(0x395b69e2,0xcd2214dd),LL(0x8670b06f,0xe4b503c9),LL(0xc4e13ef4,0x219a678a),
+ LL(0x4a993816,0xc4020eff),LL(0x1bac14d5,0x00a9f5de),LL(0xeba7c3a4,0xd00fce1f),LL(0x14b537ab,0x2c6d4993), LL(0x6b898739,0xe9b2b540),LL(0x29dbf826,0xae53e6e3),LL(0xc8438b2c,0x634606c7),LL(0xfabfd429,0x268a9ee4),
+ LL(0x173b5583,0xb0486aae),LL(0xbf222673,0xf88a2f80),LL(0x0b3178c8,0x49c56f76),LL(0xd77d1406,0xeab47059), LL(0x993b1a7a,0x95035846),LL(0xa9b83efa,0xd6446e94),LL(0xc4424fa8,0x1d1a71ce),LL(0x3d08b8d2,0x8d814c4d),
+ LL(0x7b9374ac,0xbc3ed8d2),LL(0x77a3c020,0x8dd2d56d),LL(0x97efca8d,0x93ada735),LL(0x37974cd3,0x072bb2d0), LL(0x7bd74e40,0xa7c86e7e),LL(0x5b52e0ed,0x7bff5613),LL(0x053af1f1,0xc8d0bb30),LL(0x840bcb7d,0xc5bdb8f9),
+ LL(0x41690d1c,0xabdf5f73),LL(0xf0edac8c,0x0e857a78),LL(0x8238cfb0,0x59f40fcf),LL(0x511d41d2,0xdcb54f67), LL(0x0e645117,0x3f036ac8),LL(0x7af5fdcc,0xdc4e833e),LL(0x3d7bab2c,0x67d859b2),LL(0x5f8b32bd,0x92489b23),
+},
+/* digit=22 base_pwr=2^154 */
+{
+ LL(0xb9e2f9f8,0xe412aaf7),LL(0x0ff419ac,0x0484c1aa),LL(0x417bcb90,0x9d944989),LL(0xfe7318ca,0x2b73dbe3), LL(0x52dd7b0a,0xb91b71e5),LL(0x3954afeb,0xd61f8eea),LL(0xa07e3958,0xaaeab13c),LL(0x02a1ff49,0xde442032),
+ LL(0x0b054a0f,0x8292d96d),LL(0x74b9077a,0xa978af88),LL(0xfff1d49f,0x70bd185b),LL(0x0279eab1,0xbe6d0844), LL(0xb8ed07e9,0xa8fffe45),LL(0xcb920e55,0x714824a1),LL(0xaf1bb143,0xcd5c628a),LL(0x7637dbb7,0xd151afcd),
+ LL(0x62d7ee7c,0x83fb0f37),LL(0x9a3bcb7e,0x58c2282f),LL(0xeac2ca5a,0x79f77476),LL(0x579a262b,0x7e80c351), LL(0xedb4f0fc,0x19e67272),LL(0x1fbbe9fe,0xe142bb31),LL(0x95ea6cc1,0x5c7d7cce),LL(0xabfdcf7f,0x6465a380),
+ LL(0x5a26a1d4,0xa433bd2e),LL(0xd1c2d78c,0x1148bb1d),LL(0x64102515,0x4aae419e),LL(0x66489384,0xd03b9939), LL(0xd61a9919,0xe21d58b1),LL(0x4a0ef3d4,0x17618c36),LL(0x6fe8c0dd,0x2519020d),LL(0x00b87a75,0x48d837d6),
+ LL(0x426c1aa6,0xe6e067ab),LL(0xb11d1280,0x431579d2),LL(0x2ead6552,0xb926943f),LL(0x057fed1f,0x8fd692bf), LL(0xe9a98fae,0xed11c0ed),LL(0x9bcb2abd,0xe2bc967a),LL(0x68729b8e,0x1b388d66),LL(0x6f74563d,0x2144d67c),
+ LL(0x03fcd3bf,0xbe519757),LL(0xc8c7b62f,0x3f9dbd8d),LL(0xfc476e0e,0xce91fce6),LL(0x2715393a,0x2f140c73), LL(0xf11da35b,0x8a149a94),LL(0x5367030d,0xf6a2be5e),LL(0x0269def3,0xb68c0d82),LL(0x8eecb775,0x32d58819),
+ LL(0x32845ab0,0xccea6f53),LL(0x2541c834,0x792bc041),LL(0xb1336aa7,0xd726425f),LL(0x3ddd6256,0x85b1d21e), LL(0xd9b1ba0b,0xd575bfa8),LL(0xb778b77a,0xd23084e2),LL(0x44bb1010,0xd44e7399),LL(0xa91623fc,0x3d665388),
+ LL(0x3f11fc00,0x5cfd3a69),LL(0x8bc8eade,0x1f2b5d01),LL(0xa6b9f7ae,0x5160359b),LL(0xfa696463,0x1e2601dc), LL(0x915f6084,0x7f5ac6d2),LL(0x679176d5,0x6e387789),LL(0xae26abee,0x7fb99f4b),LL(0xaa409d22,0x4798a2fc),
+ LL(0x5965615c,0x582164f7),LL(0x0472cbeb,0x2c9dfb60),LL(0x2266724f,0x36eacc3f),LL(0x5fcb8868,0x253eb08c), LL(0x760c15b3,0x749a0577),LL(0x5686b036,0x71e4ce1e),LL(0xb710196a,0x47893a8f),LL(0xdf51c4e8,0xe27dfbac),
+ LL(0xffb3df08,0xc9536d6b),LL(0x6dde9e09,0xc95169ce),LL(0xcc085766,0xcb050de7),LL(0x0df088dc,0x92fce77e), LL(0x88781592,0x10c124ca),LL(0xc81030f3,0x6429d30b),LL(0x09e20c50,0x2e37721d),LL(0xf3e3d604,0x43e7f9ca),
+ LL(0x5b095e01,0xa277a87e),LL(0x83a51a95,0x968bc951),LL(0x53aff355,0x3b375d45),LL(0xe1ebac06,0xb79d7cce), LL(0x022995b4,0xd929e1a6),LL(0x28164ff7,0x228cf7f4),LL(0x5d3e4608,0x7bd12900),LL(0x2f97ebd8,0xc57ac873),
+ LL(0x86b383b5,0xc192342d),LL(0x706b01d5,0xe85f303f),LL(0x88cdcb89,0x19e19213),LL(0x2ce0de2a,0xe88f1943), LL(0xe453aecc,0xf6fcf8cf),LL(0x9a67b49f,0x0dcd10b8),LL(0xafece961,0xb93d5b4d),LL(0xc39d0b53,0xe232f34a),
+ LL(0x30735384,0x1b8f6cc3),LL(0xe4f26c08,0xc35c5a82),LL(0xba98f626,0x9e0c933b),LL(0x4c70aed7,0x49868100), LL(0xb7f26c66,0x711a3aad),LL(0x7dac506b,0x786ea28d),LL(0x43935657,0xd3a7ab1e),LL(0xd1b69e9e,0xda7f5c1f),
+ LL(0x0e6c8579,0xc08c85e5),LL(0x8d991759,0x29d04ad4),LL(0x3a8ccd69,0xbae8f163),LL(0x1790a49c,0xade66539), LL(0x45915cc1,0xf9f5bc8c),LL(0x4f2b18c3,0x63461cf0),LL(0xd236e848,0xceb75a9c),LL(0x847ce6c2,0xac653e3b),
+ LL(0xdb088764,0xb93b3032),LL(0xa78e5943,0x567fe1c3),LL(0xe359cb34,0xba7a7acf),LL(0xe2c3827e,0x38f4fbfd), LL(0xc90abad2,0x761c36d4),LL(0x75027c02,0xac1af4e7),LL(0xd4715572,0x95e6d01c),LL(0xd621145d,0x5b06cf39),
+ LL(0x64ca2efc,0x799acd7c),LL(0x4e0bcb6c,0x3397a15b),LL(0x0358a26c,0xb9b10ced),LL(0x4b8ddfaa,0x0a30dbbe), LL(0xe20f6fac,0xa70e9712),LL(0xd11451b0,0x87c7f732),LL(0xd5eece8f,0xf0c967b1),LL(0xab370e2d,0xbc62882a),
+ LL(0x59ddb7cb,0x134fb08e),LL(0x3ae8f816,0xe937c663),LL(0x802ed184,0x083f73a7),LL(0x8cd69f8d,0xd4badd85), LL(0x987f389e,0x2d8bfaf5),LL(0x4454b1f2,0x5338c056),LL(0x2f104468,0xdce38439),LL(0x83c5278b,0xffd94d27),
+ LL(0x5628ad08,0x8740af50),LL(0x8b1284e8,0x30a233db),LL(0x57acc8cd,0xb3982d73),LL(0x37c5ff03,0x211d53d3), LL(0xf6578d40,0xb6371f1b),LL(0xa80dec53,0x7f749bea),LL(0xa9816ec0,0xe6b3f730),LL(0xf5423ec6,0xd26832fd),
+ LL(0x63e27b64,0x80127368),LL(0xd2d21879,0x17b7a4b2),LL(0x43cf40d4,0x7dcced37),LL(0x97cf7c4c,0x999bbb80), LL(0x6bafa0b0,0x191c84e5),LL(0x917f6b17,0x1d08c049),LL(0xf4715c99,0x02e5fe53),LL(0x0658f1de,0xa92c6085),
+ LL(0x16a010bc,0xe9c0ba85),LL(0xea4f3e8e,0x2fd90fba),LL(0x4570a1e5,0x8af18371),LL(0x7cca9004,0xe869e8f7), LL(0x2dd83019,0xe2c8afb7),LL(0xfd99b386,0xb877995d),LL(0xf5adab87,0x1e3efc16),LL(0xaa3b191a,0x93105fe4),
+ LL(0xae504c31,0x21690dca),LL(0x698f629d,0x2d51ead4),LL(0x724c9cbf,0x2af3eef1),LL(0x81a0d4aa,0xa6181e60), LL(0xa94f6b05,0x580982c7),LL(0x48653ad7,0xe8bea903),LL(0xa608598d,0x0270614c),LL(0x3d0d5360,0xa7cae0f0),
+ LL(0x96067f64,0x81407687),LL(0x77a62d7d,0xab2c2706),LL(0xae19786b,0xbe9c1edf),LL(0x887814eb,0xa313f2b2), LL(0x08fd3c04,0xe2bc4c1f),LL(0xe5a9d032,0x25387129),LL(0x8fbc5030,0x7b3ced22),LL(0xadbf1bdc,0xc22bea3b),
+ LL(0x7b1308da,0x4f6b6b6d),LL(0xd0e33069,0x0f2faaaf),LL(0x0d3677c4,0xb461990f),LL(0x0e6a876b,0x55c9df43), LL(0x316d252a,0x5ce9aaa4),LL(0x0e8e5097,0x7d98a813),LL(0x9aa3343e,0x047ecd13),LL(0x939277e1,0x15cc7072),
+ LL(0x0a020be7,0x305165d1),LL(0xf66eaf8b,0x48560411),LL(0xffd2380e,0x5ff898dd),LL(0x784b4b11,0x7da35f08), LL(0x38fd05c7,0x50f53e2c),LL(0x47ada3a5,0x64b3ee82),LL(0x678995de,0x672ae316),LL(0xdfe96605,0x74707460),
+ LL(0x441e7150,0xb346dc71),LL(0x55fd483c,0xd9505e7a),LL(0x94302331,0xca96e59f),LL(0x801930cf,0xcfde701c), LL(0x73c31e5d,0x02fc9936),LL(0x8cda0b51,0x4ef53a55),LL(0xa269a1f3,0xa934e268),LL(0x7cca8542,0x7ba4e5e0),
+ LL(0xa2ae339c,0x4c6408f9),LL(0x5a70ba33,0xf9ea4cb2),LL(0x5cac2af4,0x3eaa9364),LL(0x95eaea09,0x62686d46), LL(0x3e771722,0x5196e88f),LL(0x7108b198,0x749518e8),LL(0x29b25254,0x394107c4),LL(0x3a315aad,0xf9945ac1),
+ LL(0xaab9dbe5,0xce15c84d),LL(0x3940eb15,0xebb54d52),LL(0xa2fdd11d,0x69b649c7),LL(0x3f6ade80,0x4e2d1782), LL(0x2327f7d8,0x0f53ac9c),LL(0xc79eb564,0xf6158d6e),LL(0x4536f5c1,0x2903bfc0),LL(0xfb9e9e07,0x0a25518b),
+ LL(0x62a0b0ed,0x70cbce8b),LL(0x0abbc9be,0x92f5dc33),LL(0xf369c2d6,0xbb92b7d3),LL(0x79ef83e1,0x70dd90c8), LL(0x7937ab45,0xe0b33153),LL(0xc054af6d,0x3a8d1f74),LL(0xb05ebfc4,0x35cf7380),LL(0x58c2cd0c,0xefb8dac2),
+ LL(0x7d665d26,0xe7316f99),LL(0x800fba6f,0x59a7ead9),LL(0x08a2cb88,0xfa4d2a2a),LL(0xb441995d,0x2e7d3bab), LL(0x93046f2b,0x390988c9),LL(0x08869cf5,0xfd95b86e),LL(0x9a76537b,0x0185b6be),LL(0xb6cd3d59,0xa89563bd),
+ LL(0xecb1ad25,0xe79a4f63),LL(0x6948504d,0x1857cec7),LL(0xa497922f,0x03b7b3ad),LL(0x38930f36,0x9df2f2e4), LL(0x4bb5927c,0x355e4a7a),LL(0x636ec349,0x5ad3fd47),LL(0xc41b19ca,0x5400730d),LL(0x555afa93,0xbfeabac1),
+ LL(0x6cca58b7,0xb6232083),LL(0x76d0c53e,0x55faae6b),LL(0x40a8eb5a,0x64ef60e2),LL(0xe8f22c94,0xc68bc678), LL(0x10a0416e,0x5156dc1c),LL(0x5c2037e4,0xac779644),LL(0xc7162aaa,0xd2e30925),LL(0x2cf21e2f,0x7bb5275f),
+ LL(0x0c11e65a,0x7722cb40),LL(0x68ff2be5,0xc94a7f52),LL(0x8d9f9352,0x420085cc),LL(0xca4b2544,0x4addb986), LL(0x06264a47,0x3c6ceac0),LL(0xe2b48ccc,0xebc01a03),LL(0xea94fef2,0xc430e7ab),LL(0xbd94aa8a,0x973bb6f0),
+ LL(0x3225b585,0xd60e5feb),LL(0x01b56ad1,0x6cbab39c),LL(0x37d6d1b4,0xcb55a9cc),LL(0xfbce1d89,0xd7288c1e), LL(0x162d4b46,0xcb516843),LL(0x15edb910,0xf0aca3a6),LL(0x08a6685a,0xdb998b55),LL(0x07811873,0x16b442e6),
+ LL(0xa1a7e0c2,0xa9badd09),LL(0x9f813289,0x0a9a339b),LL(0xd4cda45b,0xabf1793f),LL(0xc7378a84,0xa9830a12), LL(0xd28165b1,0x1ae11c32),LL(0xf71bca14,0xbfd49ace),LL(0xfc035476,0x9a3990df),LL(0x6c32b72a,0x0fd2b153),
+ LL(0x3541b5ae,0xceece835),LL(0x8256c750,0x2f7429f5),LL(0x88104f8c,0x456c3478),LL(0x8b23da06,0x8a435588), LL(0xd817ce6a,0x6b6c14f2),LL(0xf35ab86a,0x83bf0acb),LL(0x364b83fd,0xdadb89ba),LL(0x5cfecaf3,0x2c8fcf90),
+ LL(0x20d12c92,0xa90f77ca),LL(0x69d1739c,0x2e278e0e),LL(0x5c1f9e82,0x29d24b44),LL(0x647c59b1,0xbf4fb4cb), LL(0x90ffd733,0x9c8ea39d),LL(0xf14db3fc,0xe37a1352),LL(0x8f3e1dca,0x3c9164a2),LL(0xaec86440,0x515c16f2),
+ LL(0x5c483906,0x736fee4c),LL(0xa3f651c7,0x2325cabb),LL(0x35b94e45,0x582324df),LL(0x45598c64,0xeacedb3a), LL(0xde9ea8cd,0x674e1740),LL(0x89d2b975,0x30f2f423),LL(0x9c8abe45,0x330bd76d),LL(0x5371c0c4,0xb97e89f6),
+ LL(0xb7569543,0xb1769248),LL(0xd85f4d72,0xd29cc9d2),LL(0x10a5b6dd,0x89e1fd0c),LL(0xa693a796,0x501be0ae), LL(0xe490e600,0xc70965b6),LL(0x1bb6c5cd,0xf518f8af),LL(0x76f6daa2,0xf51d40bb),LL(0x5ec7849c,0x83a83b67),
+ LL(0x6d8aa314,0x0fe0d975),LL(0xea664a8c,0x9bf9aed5),LL(0x96fad9aa,0xef8bb989),LL(0x04a0e441,0xd07dce35), LL(0xb3c5eb81,0x53bd2a16),LL(0xaf178b66,0x49e29fe2),LL(0x24dced32,0x62cf7a62),LL(0x0f541e36,0xcc111fba),
+ LL(0xda9dd111,0xc93cd7c1),LL(0x28c9c1b4,0x56b625ab),LL(0x3769f3a2,0xeff436ae),LL(0xcbd31a17,0xa0d8d46b), LL(0xc80dc873,0x241693fa),LL(0x3cd579ab,0x56083f64),LL(0x33fbd431,0x12ee753b),LL(0xd66c283a,0x1bde60ad),
+ LL(0x0243cd83,0x0db508dd),LL(0x1349307c,0x3b12c134),LL(0x61d86bda,0x8296aa6d),LL(0x630adc96,0x1d5c8a4f), LL(0xa30a8ae6,0x9d01dc28),LL(0x1dab8168,0xc555a743),LL(0x7abe577a,0x61fe0d14),LL(0xc8c93bb7,0xe26aa4d8),
+ LL(0xda2bab5b,0xfb4b03bf),LL(0x79b4e6c0,0xfbd49089),LL(0x86806aa4,0xda1a0108),LL(0xdc078112,0x281f76ae), LL(0xe0fbd693,0x9f662594),LL(0x49ec4ee0,0x1da897b0),LL(0xfc7d1578,0x20d52a97),LL(0x6b1f4ab4,0xdbf8d157),
+ LL(0x3b97d1e3,0xfc0a5936),LL(0x1aa091b6,0x00f0f283),LL(0x13aadeb0,0x505e183e),LL(0xa55b3f8a,0xe28041ad), LL(0x086c2d23,0x2e0f76da),LL(0xf2c5eceb,0x815b147d),LL(0x673ba5f2,0x02066c02),LL(0xce043d4d,0xb85d6a8a),
+ LL(0x113890f6,0xd5f023a3),LL(0xa9d2491b,0xaa4f9058),LL(0x16d175a3,0x6d82393e),LL(0x671e2aed,0x1d1e00b2), LL(0x40018bae,0xd47c4f28),LL(0x7b30838f,0xd08eac83),LL(0x5dfe910d,0xa0fde631),LL(0x5c66d5c6,0xfc16adf7),
+ LL(0x18d8c6b1,0x0ed2a8a2),LL(0x632b5b07,0x67ee6037),LL(0x21a89b8d,0x7eed42e5),LL(0x33e6da02,0xd99942cf), LL(0x39971405,0x759ec79e),LL(0x174dca4c,0x669a92c7),LL(0x9d1e7c55,0x85935ed7),LL(0xa82055c0,0x5f3f9e68),
+ LL(0x56aa5af3,0xab0507c8),LL(0x1bd2726f,0x354cac5d),LL(0xb864816f,0x46e85e16),LL(0xd1840add,0xef2548f6), LL(0xc3842f43,0xe494ea07),LL(0xedf6c13a,0xa6169c4a),LL(0xa460e30b,0x65d9cca3),LL(0x31e7dfc3,0xa6848e4f),
+ LL(0x5c8109dd,0x4309f315),LL(0xc5799833,0x7a4ec14e),LL(0xa8132b78,0xcb768a63),LL(0xb416c77c,0x229106d1), LL(0xded02f41,0x1ca71df6),LL(0xc1a1fc66,0xb6365d3e),LL(0x1431d1fa,0xf7c432a1),LL(0xa5654387,0x30364500),
+ LL(0xd5b13b2e,0xc9ed0cf8),LL(0xd18d5a28,0xdbd541bb),LL(0x754de9d2,0x6b78c887),LL(0x54651568,0x7d32fedb), LL(0x0d37c339,0x7f319680),LL(0x37d70b76,0x22304d1f),LL(0x6fb5e555,0x01b2709e),LL(0xfd5d1708,0x978b0d3e),
+ LL(0x96bc118d,0x83206b9d),LL(0xec7bfc1c,0xb1a4d7bf),LL(0xb6b41502,0x753f98a6),LL(0x4c5187ce,0x41139110), LL(0x587a8213,0x56e9e218),LL(0xad9aefd0,0x3b39955b),LL(0xb9947ceb,0x7428b03f),LL(0xbe8bda29,0xbbe82668),
+ LL(0x5c4b4c63,0x5142e8ba),LL(0xe92ee291,0x90c3e2e3),LL(0x8f6a076d,0x6947a55a),LL(0x61964435,0x9acdeec1), LL(0x181dac35,0x56bc8e4c),LL(0x7a824372,0x4f4f2c0a),LL(0xc1033f6b,0xd1958b99),LL(0xc83ecf98,0xeeaa6604),
+ LL(0xaca52cb3,0xe43c0b44),LL(0x75443f14,0x12446426),LL(0xddcc00b4,0x0d14e885),LL(0x6cfe5734,0xb0f5f11d), LL(0x1013afcb,0x0e160164),LL(0xed9f4535,0x4f570ca9),LL(0x73a307ad,0xe5162a12),LL(0x3321ae54,0x6a431695),
+ LL(0x5ae301b4,0xa6c7b0c5),LL(0xbd2d3f1d,0x6f5d42b1),LL(0x15c0c94b,0x4eb12c09),LL(0x28618c41,0xf1c40386), LL(0xc0f55c25,0x30302333),LL(0xbd1c19f0,0xa5e41426),LL(0xcfcc66f8,0xd5d4d4d7),LL(0x449253c5,0xcfdf3039),
+ LL(0xb30ec0ff,0x17b0eb72),LL(0x5e6424f9,0xbce593e2),LL(0x2a73184e,0xa5d82937),LL(0xebe58773,0x23d2857a), LL(0x067e1eac,0xe3f0f676),LL(0x50509d7f,0x073ded2d),LL(0xca405a7e,0xc22af8f0),LL(0x6df6a46c,0x7a4ef592),
+ LL(0x97067006,0xf9cb0178),LL(0x489d2a39,0x9ae132af),LL(0x6a2da1c1,0xc7c46b35),LL(0xd95850c9,0x0993353b), LL(0xa25d52ef,0x6c313a57),LL(0x93c852c3,0xa6bdb2b2),LL(0x7e9e296d,0x27ed916b),LL(0xc7aeb09b,0x10b58337),
+ LL(0xecebe36e,0x78800c35),LL(0x2234ce8a,0xd93e2423),LL(0xfa95019f,0xe4cf5cee),LL(0x71e13748,0x21396d37), LL(0x0c32fdad,0xeb028350),LL(0x61f1652b,0x31645697),LL(0xf6677491,0x9e1c6e0b),LL(0x74176c12,0x4d18f2e5),
+ LL(0x3832d713,0x78d559bf),LL(0xb6e00e15,0x04f0b57b),LL(0xe80add3a,0xd6c9cb16),LL(0x5c7b1d70,0xeabfabc5), LL(0x98a62cc3,0x40570866),LL(0x4abb2b1a,0x39ef8ff1),LL(0x0c19959c,0xadb40548),LL(0x388b1f7c,0xd61632d7),
+ LL(0xd73b7d50,0xd1f9b736),LL(0x560bf0aa,0x652ed78e),LL(0x50e3fc4f,0x58e71e33),LL(0x55df1ad1,0xbfaf5f44), LL(0x9106744f,0xefe8893b),LL(0x356d1fe9,0xabfbd51e),LL(0x9eb1cbaf,0xab03570b),LL(0x3919012c,0x92cfe2e4),
+ LL(0xb6f7c64d,0x7671e5fb),LL(0x6e0a44b7,0xf040c039),LL(0x62b36088,0xf430f593),LL(0x94c7c0ac,0xa85b4bc9), LL(0x16b54fff,0x07d5c40c),LL(0xc53a3788,0x47aa73ee),LL(0x7000d61e,0xa63c5b36),LL(0x91b9f09f,0x04e8f53d),
+ LL(0x87dc6a3d,0x7e48021d),LL(0x28ae0f74,0xa2b5516b),LL(0x705132e2,0x84412003),LL(0xe243d1fa,0xc55f69cf), LL(0x6a8f80bd,0x758c0f71),LL(0xd09b719d,0x69ecf887),LL(0xa9b45194,0x51b100f0),LL(0x90ae0769,0x1fb9ef66),
+ LL(0x30fcdfd2,0xfee82fab),LL(0x36a6990b,0xf36185be),LL(0x3d33027b,0x88f343f6),LL(0x38ae16c6,0xb775dcbb), LL(0x85a82e45,0xa107b9f0),LL(0xde6b9806,0xaff8b0ae),LL(0x0392fad0,0x3cd3980f),LL(0xf3cf7650,0xdd829fc6),
+ LL(0x0dc8d031,0x177190cc),LL(0x7fc491eb,0x3e21cd25),LL(0x0d929039,0xea0cc90e),LL(0x1dfc37b3,0x5f7e6292), LL(0xe23bdd04,0x66dd6dde),LL(0x64fa490a,0x70e7a317),LL(0x10a03dd8,0x59c90f81),LL(0x96d58314,0x425ee6ce),
+ LL(0x5f896ed1,0x868001eb),LL(0x91dad4fd,0xc4c003f5),LL(0xd9ef80b4,0xfb4782b2),LL(0x323e4fc5,0xb9edb975), LL(0x53ef4ccc,0xa2ec9b6c),LL(0xa77922b6,0x4af8b2ca),LL(0x6697874b,0x73850e89),LL(0x3568523f,0x76e0fd72),
+ LL(0xe9c400a6,0x64799f46),LL(0xa9c245de,0x6c5176e7),LL(0x93503700,0xbd97c80c),LL(0xffbe539f,0xa92d9ee5), LL(0x8376bb3b,0x76003d14),LL(0xac564679,0x2e75cc77),LL(0x3a333970,0x126af6c7),LL(0x6b6604bd,0xdbfd0133),
+ LL(0x24424a48,0x11cf4c2e),LL(0x37d4471c,0x843c73ee),LL(0x617a488b,0xb3047fc5),LL(0xe3cf861c,0xf2a91709), LL(0x1c3a60f7,0x84444421),LL(0x26679148,0x74787a36),LL(0x53d9404b,0x115fbd06),LL(0x6244cef0,0x70fd3365),
+},
+/* digit=23 base_pwr=2^161 */
+{
+ LL(0x2b574b7f,0x76695c9b),LL(0xc369b6be,0xcca80405),LL(0xe3108ded,0x1f4bae99),LL(0xea133fce,0x9e715ce2), LL(0x54c2ee1c,0x60d52055),LL(0x1680742e,0x56bab301),LL(0x3fe438b9,0xa409b5f6),LL(0x8036f7ce,0xe3a8e4d0),
+ LL(0x247fdfdf,0xe1d7ec0f),LL(0x4a23d1dc,0xfb9d90e7),LL(0x190fdc41,0x7012eb2c),LL(0xddced48c,0x5c2bbff6), LL(0x68cd7feb,0x8a93426a),LL(0x6b4854e1,0xb5963962),LL(0xe772bbd8,0x8ac72b8e),LL(0xa6b3040a,0xc10d24d2),
+ LL(0x94d5f347,0x8fdfef16),LL(0x2b04af0a,0xf3189490),LL(0x6d2ca633,0x30e3da7a),LL(0x4803814a,0x8d002aea), LL(0x95a0bfe9,0xc15e311f),LL(0x4b4cc50c,0x2891ec7e),LL(0x8834df25,0x0936fed8),LL(0x78e00289,0x7e5d7dbf),
+ LL(0xfbfcf1b5,0xb9a92d78),LL(0xe8427d74,0x17ce4fab),LL(0xac66e74e,0xbae98ffd),LL(0x145bb5e5,0x6d548304), LL(0x0992abe1,0xbf3dc603),LL(0xbefdc5c5,0x318cfbda),LL(0x59f8efb8,0xbb5fa37d),LL(0x4ef5bef8,0x347874a0),
+ LL(0xbf68688b,0xdf552b01),LL(0x8f96a57a,0x2fc542cb),LL(0x4edb340e,0x5a731b61),LL(0x181cf578,0x5143d103), LL(0x2cc936b6,0x749ab511),LL(0x0dd355c2,0xbc94c053),LL(0xa3900fa2,0xa825eff5),LL(0xc1dc2b31,0x60a909a3),
+ LL(0xaf5bcab5,0x59b33c78),LL(0x496fbcdf,0x0053d789),LL(0xd7883bc1,0x5a5afe02),LL(0xfa66951d,0xec9afe78), LL(0x728e56a6,0x38f28b83),LL(0x78cafb9d,0x21d0b6ac),LL(0x7042e327,0xd43996bc),LL(0x7c31c145,0x60686637),
+ LL(0x3d919304,0xe1f8d2e6),LL(0x456be82a,0x09cf437c),LL(0xf0c21973,0x6a01dae8),LL(0x246d9ef8,0x8bffcda8), LL(0x5d853975,0x7e03a0d4),LL(0x32533ba3,0xc3800ca8),LL(0xf02ce43c,0xd77152cc),LL(0x6392089a,0xb8bc17a6),
+ LL(0x4b4558fb,0x6f5fcb61),LL(0x1f2545aa,0x9602597b),LL(0xabe5e469,0xfd89ab3f),LL(0xfb2e16bc,0xf1daeea2), LL(0x3a12940f,0xe699acd7),LL(0x4d7c7311,0x24980f6c),LL(0x336c8ec6,0x4a5cf975),LL(0x8c27d3dc,0x8e180e32),
+ LL(0xd36cb503,0xafb66269),LL(0x754fdd67,0xe98b07d2),LL(0x5a1fe9bf,0x1e0b425b),LL(0x24fc4a85,0xb4ac13e9), LL(0xc05a9c3f,0xef693781),LL(0x5c0124dc,0x266c1216),LL(0x64ee22e2,0x7f3184c4),LL(0xcdb5f1a9,0x3f985fb3),
+ LL(0xfc01efaa,0xb258cd5f),LL(0x0775588e,0x861688b1),LL(0xfa46eae0,0x72184b18),LL(0x5003404a,0xd17c9dea), LL(0x92e7bf9e,0xa8791966),LL(0x7891ac50,0x049c63cb),LL(0x5d46b33d,0x2ed32928),LL(0x0623595a,0x49d1bfbf),
+ LL(0x36c8e3e9,0x9f871470),LL(0xb20d610d,0xdec7eb98),LL(0x7b151f4e,0x15b9326f),LL(0x04005d02,0xa624c23e), LL(0xd9cacded,0x89fc2a8e),LL(0x9a2c3a00,0x9eb8defa),LL(0xe8d7eab7,0x7c5dc2d6),LL(0xeb0a77cf,0x48fa5403),
+ LL(0xbf033733,0xcc4c31d0),LL(0xef211c17,0xf37d0072),LL(0xae35b246,0x8967fe49),LL(0x5cb1aa9b,0x8c4cbd66), LL(0x04840da3,0xab0097db),LL(0x5828733e,0x3946faec),LL(0x87d64045,0x96c6531e),LL(0x83bc0d0e,0x893d3780),
+ LL(0x53bec0dc,0xf833e355),LL(0x2803a655,0xc9ff7280),LL(0x42b99b53,0x300ff7aa),LL(0x6a7c3f2c,0x3b48a8db), LL(0xf617f8aa,0xf78c21d9),LL(0xcbe4d565,0x23684cb7),LL(0x7514e9a0,0xf64ae9c8),LL(0x8429d8ba,0x4ff5483c),
+ LL(0x5cb18391,0xdedab351),LL(0x769ae948,0xd3126ffc),LL(0xd3546ad9,0x6c2f9ba8),LL(0x69aabfb7,0x4567e48a), LL(0xaa284747,0x6fbe29b0),LL(0x98af4f2f,0x3185f0db),LL(0x5b4c14e3,0xf2a958a2),LL(0x27d04855,0x106150c5),
+ LL(0x68a19ca9,0x60a3b4fb),LL(0xfac47c70,0x65c5719a),LL(0x973e4cfd,0xe228e088),LL(0xcb63c89f,0x122a2429), LL(0xbaea08f7,0x39fda97e),LL(0x621c12cb,0xe7da5324),LL(0xff9b3c84,0x569c8a51),LL(0x4c3b8d54,0x5ab8bb6d),
+ LL(0x00e25a95,0x4f02ece4),LL(0x7ac1732e,0xef947402),LL(0x51149260,0xecdb65ac),LL(0xa9180d51,0x6043aa29), LL(0x852deca0,0x07fc92bd),LL(0x15237c8d,0xf3338297),LL(0xe84b3f38,0xecfb0e76),LL(0x6b89af17,0x21f2f5c5),
+ LL(0x9659963f,0xf7aec268),LL(0xa0cb213c,0x67fb5260),LL(0x66d931b7,0x5daa0fef),LL(0x34d309ff,0x95457a7e), LL(0xc21285b6,0xe7cf1a56),LL(0x244e11b4,0xcbff9b08),LL(0xc0ecce3d,0xd79ee62d),LL(0x8267c254,0xe3f20739),
+ LL(0x037ef2d3,0xee06dd39),LL(0xd522f762,0x790d1b0f),LL(0xf30c47d0,0xf0659106),LL(0xb5fdc6b5,0xcd83214b), LL(0x6593b717,0xc8621660),LL(0xfe3fa381,0xb10a6d99),LL(0xab254244,0xa5c3224c),LL(0x5854b18e,0xd15287e6),
+ LL(0x225806ae,0x6bf9594c),LL(0x57e554f2,0x75a97e21),LL(0x82b00b16,0x0ea199f3),LL(0x5389c90f,0xde81a726), LL(0x86922afe,0x8503609e),LL(0x254b75c3,0x6778ad88),LL(0xf3e660ba,0x6bc2ac1b),LL(0x209c04a4,0x7efc1550),
+ LL(0x2528ec51,0x6e90b6a5),LL(0x0548389e,0x9196a7c9),LL(0x7b5b5dde,0xf7e285c1),LL(0x223d4837,0x6335a624), LL(0x412d19c4,0x8acef5af),LL(0x9783256b,0xb22808a5),LL(0xf53e4b62,0x6ea3daaa),LL(0xfa7bada4,0x7ca4c51b),
+ LL(0xe4d3115e,0x3e40461e),LL(0x3646fc40,0x24889b50),LL(0xfa26ccf7,0x39e0eb1e),LL(0xa82af350,0xfcad5d47), LL(0x4862b1fd,0x90037503),LL(0x1a79283c,0x88e937e8),LL(0x9a0127fb,0x16dd07c0),LL(0x39fca31a,0xac62a168),
+ LL(0xa294dac9,0x26542e2a),LL(0x2a5dcfe8,0xefab45af),LL(0xe642bbe8,0x6166857d),LL(0xff6290a8,0x3f3ad480), LL(0x5f50633f,0x435d4c2b),LL(0x84451c8b,0x36da60a7),LL(0x261612e4,0x00f5e2e4),LL(0x2d04786a,0xe4318273),
+ LL(0x2c175edb,0x192bcda5),LL(0x59a6f637,0x74681e0a),LL(0x2d244985,0x696df08b),LL(0xfcf577c6,0xde61a87c), LL(0xf2c9de81,0xcbd2ceab),LL(0xd36162e8,0x878f06ce),LL(0xb3d22955,0xc4f312e0),LL(0xe903efee,0x736ed43f),
+ LL(0xca9bf60f,0x2c687134),LL(0xbc7da3a5,0x2473ea8f),LL(0xb45fb57e,0xf54ef685),LL(0x3383cadb,0x594e8445), LL(0x4a7df4bb,0xe1edd3fb),LL(0xc17c2c92,0xa783d987),LL(0xcf8fcba8,0x0d498637),LL(0x3acd6e4c,0xdebd801d),
+ LL(0x34d3761e,0x2ade8a7c),LL(0xd825cd19,0xc591c889),LL(0x39b42dec,0x3ffd60ba),LL(0xfd9674dc,0x136d4902), LL(0xda4842c4,0x373a70f8),LL(0x3f078bfd,0x3208c485),LL(0xef608639,0x3587f871),LL(0xf04e46ed,0xf990ab0f),
+ LL(0xa83a8450,0x39d542ab),LL(0xdacb7c65,0x634b9198),LL(0x82486a05,0x680cef78),LL(0x16eaf88b,0xab1d4d77), LL(0x699c7aa5,0x5e605279),LL(0x3c40a07f,0x7e37906f),LL(0xfb6926e3,0x4ae84ad8),LL(0xe2ebc73b,0x236b5f07),
+ LL(0x9e0939a5,0xa94e50ab),LL(0x2d9e10e2,0xabeed810),LL(0x4e6423d3,0xea8190fb),LL(0x17acb62c,0xc739d209), LL(0x6fdbe8dc,0xae38106e),LL(0x63204138,0x1c6532d7),LL(0xbb7d0510,0x03af879d),LL(0x8cd2b1a4,0x1d76faf0),
+ LL(0xd77386cc,0x2fcdaf9b),LL(0xe32d2633,0x30f9f5a4),LL(0x382e7298,0xa4fc8189),LL(0x588af205,0x946923a1), LL(0x114f2beb,0x2c527a79),LL(0x077762eb,0xa2ca55d3),LL(0xcc85e41e,0xe4b2eb7c),LL(0x89346ada,0x4b5938d2),
+ LL(0x4c2084cf,0x8e94e741),LL(0xa839ecb4,0x4ef32d29),LL(0x802f0897,0xc5371755),LL(0xc49ae8a1,0xb0274ff1), LL(0x417bff62,0xf7716d1c),LL(0x918f9555,0x6efb0748),LL(0x7aeb1e8d,0x7d3bb9c8),LL(0x20d51e18,0xee9bd5e1),
+ LL(0xd52033b1,0xfaf0a1a5),LL(0xb8626432,0x7967d3f4),LL(0x5574dc0e,0xe837ca4b),LL(0x2c11d8ff,0xf7eae237), LL(0x87dc4007,0xc0f2f1fa),LL(0x8dfb51f7,0xf5f1f153),LL(0x5bd9ac7f,0xa64b10ae),LL(0xa2198841,0xb3c2ba37),
+ LL(0x66c1ee7b,0x5a7ebac5),LL(0xdba62ea8,0x59e06f4c),LL(0x30944ef3,0xa2ea165e),LL(0x3e21385b,0xfd5c7dfa), LL(0xe3bb110d,0x4a012c73),LL(0x4fb2fdf3,0x16d85219),LL(0x7cad0594,0x1aac7f11),LL(0x4b098d9f,0xea7f7dbf),
+ LL(0x7fd181e7,0x88abaa5c),LL(0xca3ad1eb,0x136a0c9f),LL(0xf394aab5,0xe6e5e6c2),LL(0x9349e4a5,0x84d697d4), LL(0xf76f4b3b,0x8215578b),LL(0x12feeb5f,0x81a1cec6),LL(0x3e876bc3,0x5d336eb7),LL(0x071892ca,0xe8afdcb5),
+ LL(0x3da8d94c,0x22f16f6b),LL(0x2d150069,0x28b276c5),LL(0x643d3e58,0x49d20441),LL(0x3da3a7fb,0x3450c84a), LL(0x442ca3e3,0x8f5bf388),LL(0x9e615382,0xca31411c),LL(0x7798675f,0xbe63e34d),LL(0xd1ea01e1,0x551eb64d),
+ LL(0x34a00e27,0x1738a83b),LL(0xbf58ce70,0xe7591d15),LL(0x57d806d8,0xde2ace5a),LL(0xd0338020,0xe89e8110), LL(0x4e25756c,0x935ed5de),LL(0x46d0f00b,0x07ef8c2f),LL(0xa659592a,0xa28e5fb4),LL(0x7fa4986a,0xcb45c622),
+ LL(0x74de493c,0x6b7df066),LL(0x79aa5258,0x4d6bdaef),LL(0xe2b255ed,0xe9709c34),LL(0x7d0e7443,0xdba2653a), LL(0xa00eb3e4,0xeb8da5c8),LL(0x7ab0e45c,0xe978228e),LL(0x9d551a51,0x3a31bafd),LL(0x403352f5,0x1de0e9cf),
+ LL(0x23ddd51c,0xb94d5478),LL(0x130e78e3,0x7c215c91),LL(0xed547bce,0x556b92e0),LL(0x909f5c6f,0x0072da6b), LL(0xf0dc846b,0x4ec71b11),LL(0xbf7baaa1,0xd0f3b3b4),LL(0x47770705,0x896391c5),LL(0x66732587,0x41fe5736),
+ LL(0x4acd3c51,0x02a7e3e3),LL(0xd30407b3,0x217df736),LL(0xe47c33cb,0x503a31ae),LL(0x4912bbb0,0xe3186392), LL(0x75a5df9a,0x2491a08a),LL(0xc09294ad,0x2882f937),LL(0x979ad9f9,0xe2576b69),LL(0x26dc1ffc,0xf44ddc15),
+ LL(0x968268ae,0x7dad21d4),LL(0xbe9c6fc0,0x07378e90),LL(0x2b329579,0x9406a872),LL(0x761f10ae,0xb27b5c51), LL(0xd04cf60b,0xf5dad2f9),LL(0xdf950997,0x3154dff5),LL(0xd8534a9a,0xaaec9d30),LL(0xac43f212,0x4ac722f5),
+ LL(0x46464c70,0x722882f4),LL(0x6c3c702e,0x9b9b5226),LL(0x8325964e,0x4e3974bb),LL(0xaa0c5227,0xd3ceff9d), LL(0x9534dba5,0xd530c8f9),LL(0xbc751878,0xd26e547b),LL(0xea79b19a,0x184a3527),LL(0x74f1cdc4,0x8dab9214),
+ LL(0xc051e9f6,0x708abc8c),LL(0x4be2d9ca,0x75194e9f),LL(0xd6ab5348,0x031d69c1),LL(0x78b0e490,0x1785990e), LL(0xf6c41f8e,0xd825f125),LL(0x0fbf2fe6,0x429924ea),LL(0xfb87161e,0x53c044be),LL(0x0651d153,0xa3bbdf1b),
+ LL(0xec6ecb9c,0xda660697),LL(0xddb8c619,0x51b4a5fd),LL(0x230fbffb,0x80b87520),LL(0x8848da9d,0xa0587430), LL(0x864c2502,0x98715939),LL(0xaf973396,0x2b10cbfb),LL(0x09572b5f,0x28675184),LL(0x39adf777,0x0a40cdef),
+ LL(0x3ead6eef,0x2efa3bb4),LL(0xd1b9fe65,0xbd76b425),LL(0x5e527201,0x95f006cd),LL(0x38a7dc3f,0x00890f3b), LL(0x3a7ce6be,0x84ffa014),LL(0x89541c2e,0x3406aaa0),LL(0x9559d989,0x430542b6),LL(0xb53bddd8,0x9b427b08),
+ LL(0x49639170,0x2182bd91),LL(0x3299ae83,0xb9fb2b42),LL(0x423b7ea2,0xbc993d59),LL(0xc110039e,0x03e416ac), LL(0x3ffe24aa,0x90c2269a),LL(0x1c322c49,0x421ea02d),LL(0x0ef8fa01,0x40677b1c),LL(0xc59407d4,0xa1acd239),
+ LL(0x8f14decc,0xb8cd4f40),LL(0x69e16a6b,0x95e90d87),LL(0xc3c38fd3,0x85dcf163),LL(0x0c01f90a,0xf4fb87ba), LL(0xdcd0f994,0x8274f825),LL(0x2e6bf7d8,0x4c685fa5),LL(0x3d928011,0xc87d8847),LL(0xf9efa96a,0x9add0105),
+ LL(0x50db3113,0xed39152b),LL(0xb794e6b4,0x6b523496),LL(0x84630b17,0x6bb241b6),LL(0x1de3ae08,0x6e9f8ae0), LL(0xd94ce4fe,0x97bd7c09),LL(0x9e61057a,0xe887b02c),LL(0xc62c27fa,0x853e8feb),LL(0x01600ed6,0x3f9d951a),
+ LL(0xb57b9742,0x3e957b36),LL(0x82b72110,0x92bfd61e),LL(0xfdce7ec4,0x108b450b),LL(0xcc29c494,0xd8af107a), LL(0x47688c92,0x8d67ff70),LL(0x28b9b681,0x57f42933),LL(0xaaf8a48d,0xbbc98ef3),LL(0xe2d549b6,0x14113b1a),
+ LL(0x0b412b3c,0x1172b259),LL(0x1d42a63e,0xaf86ca6f),LL(0x83660d24,0x5f893135),LL(0x5a21a441,0xe7bfe9a8), LL(0x4ee5122e,0xecd0aa5b),LL(0x5e4df46e,0xbb68654c),LL(0x5e243845,0x0c3e820b),LL(0x5c46bfa5,0x042b1895),
+ LL(0x894f7f16,0x791b2085),LL(0xb5c353fb,0x42eb80f2),LL(0xdf8db0d4,0x377777f7),LL(0x34c42ef2,0x023c0963), LL(0xa34cb6d0,0xba05eb5e),LL(0x55cd1242,0xffb8b01e),LL(0x87cd9f24,0xeab6ff7d),LL(0xab3c09fc,0x175e94c9),
+ LL(0x7075fd9d,0x6dc68140),LL(0x4b203c44,0x63851566),LL(0x871d1be7,0x3071e924),LL(0x85ee9cd9,0xe6285b56), LL(0x4bcf8edc,0x738dd629),LL(0x4ace75f5,0xf3a36813),LL(0x3cf6feb4,0x37a09e34),LL(0x2cd0c8af,0x4c2eaef7),
+ LL(0x16205f2a,0xd945a28b),LL(0xabadde7a,0xfe9112a7),LL(0x2bbf97c2,0x7db6c5ee),LL(0xb5b54833,0x3eb84a8f), LL(0x273007d9,0x9732a49f),LL(0xc6a2e3ef,0xe61431c0),LL(0x10a101da,0x88aa1a06),LL(0xb972cc61,0x64b94de3),
+ LL(0xf8402027,0xe79eb6aa),LL(0xea6e7157,0xbb1fa5e3),LL(0x4ebdbe4b,0x457f33a2),LL(0x7a61b393,0xf4e955e0), LL(0x698d37cf,0x578e2e64),LL(0x82ecbb69,0xbb139e23),LL(0xcfe8d05f,0x268d0291),LL(0x625fa854,0x7dcfef41),
+ LL(0x9c4da5e3,0xe21d5b8f),LL(0x10bf3df1,0xb5e22209),LL(0x437bf2c6,0xb04dd106),LL(0x1d055404,0x807c5d04), LL(0x2c06fd15,0x6e983206),LL(0xed63ea25,0x773450af),LL(0x95c8dca3,0xc2dae106),LL(0xd82229e8,0x5323f6ba),
+ LL(0x57c062bb,0x647fabee),LL(0xcd5210ac,0xcd6adee7),LL(0x181f674f,0x11b4df3b),LL(0xf2a92b48,0x4e23bf4e), LL(0x84a83d6f,0xeea34e2e),LL(0x9cb197e5,0xeaa09d51),LL(0x845e5008,0x7f36a278),LL(0x1581c0ab,0x41fa9b52),
+ LL(0x23d1206a,0x58917f67),LL(0x11062b8d,0xc04601ce),LL(0xf31f7326,0xdcc60fb6),LL(0x4b071708,0xc5aeef46), LL(0xdc6939eb,0x5364069e),LL(0x034a1052,0x44bd15a2),LL(0x62a307fe,0x8177eeb1),LL(0x1907ad16,0x451ae4e7),
+ LL(0x27eb3193,0x80e49544),LL(0xaf88f4c9,0xd788e57a),LL(0xd944e00a,0xf062c60f),LL(0xeb4a609f,0x504463e6), LL(0x74f13c8b,0x3593ad20),LL(0xc50bce88,0xdc7c5a35),LL(0xb657d1f9,0xa6336115),LL(0x591425ef,0x18d14e5d),
+ LL(0x1454f76e,0x73896725),LL(0x425c87a9,0x52772de4),LL(0xc6efb7d6,0xe59e4516),LL(0xd76bbc11,0xdddb8bf3), LL(0xc6fd2066,0x1acbebd9),LL(0x1d7082ea,0x88c3b525),LL(0x6d69cea3,0x6a3b3d62),LL(0x8d065405,0xdbf73dfa),
+ LL(0x4a7bd06e,0xd659c8d6),LL(0x7bd10bb0,0x67867520),LL(0x97838647,0x7c4e3be5),LL(0xc5891864,0x545c7144), LL(0xfa78d62c,0xf64e1031),LL(0xfa71692b,0x1f046593),LL(0x71310c47,0xd35a9cb7),LL(0x0ea84922,0x10911b96),
+ LL(0x93a9f5ac,0x5647310d),LL(0x6c05eedb,0xa6785861),LL(0x43950b68,0x2f5aa7c8),LL(0xa9d03b3a,0x57580907), LL(0x42e15fe3,0xd581049b),LL(0x916c4e88,0x55dcf9d2),LL(0x27d1a183,0x87ebfd13),LL(0xf5aaa51e,0x13aee909),
+ LL(0x3b9fc03e,0xa651959d),LL(0x98997a74,0x05c28772),LL(0xae2e4a65,0x73e047f4),LL(0x783aa072,0x359e6c45), LL(0x7a04b710,0x1124e9f0),LL(0x6d2053f2,0xd35094de),LL(0x2575dab0,0x0d57d976),LL(0x69171229,0x822256fc),
+ LL(0x3d19de1c,0xbd46937a),LL(0x6f0be84d,0x71feede4),LL(0x7c4dc4b3,0xca205366),LL(0xe3e851cb,0xfbb97d0d), LL(0x2066e9a4,0x0270b5ea),LL(0x42ae150b,0xeade87ff),LL(0x8eb1bafa,0x9a7f9e81),LL(0x0eb5f68e,0xcb374aaf),
+ LL(0xd5525ab2,0xa5841c9a),LL(0x03e02cd0,0x3eed9ba8),LL(0x279fca98,0x29449bca),LL(0x3f450c92,0x4990ec0f), LL(0xbecbba58,0xa241a8e3),LL(0x2eb47817,0xd0e2487c),LL(0x8300837d,0x6db7d420),LL(0x2d7f59ef,0x78872895),
+ LL(0x1314fc73,0x1b3d5033),LL(0xe710aded,0x2cf4cd42),LL(0x6f4026b7,0x9159bc5d),LL(0x2e62cc45,0x403f947b), LL(0x47d97843,0x18d6ac70),LL(0x0694f7eb,0x69d5faaa),LL(0x6932e0f0,0x7711535c),LL(0x6ebd1488,0xc85c9616),
+ LL(0xd3542212,0x558e3750),LL(0x02921066,0x21fe02d7),LL(0x46b90554,0x1636a1a2),LL(0x0108cc04,0x8acf01ed), LL(0xb4d60d37,0x57a2b16a),LL(0x91f4fdb4,0x3301a33b),LL(0x8e09b548,0x70dc3d3a),LL(0x079c0c2f,0x35ae7d07),
+ LL(0x978f92cc,0x95792f06),LL(0x23196752,0xb11574d3),LL(0xb8cfcac1,0xc3249711),LL(0xcf93af67,0x2061c767), LL(0x2f63dbe7,0xeff09a1b),LL(0x48091edd,0x527776b6),LL(0x19bba5a9,0xf0fa985e),LL(0x66ae3221,0xc54f89f3),
+},
+/* digit=24 base_pwr=2^168 */
+{
+ LL(0x6a436476,0xbc5a6284),LL(0x35dbb9cb,0x6fcc2313),LL(0x5012ffbf,0xa77d2d9f),LL(0x4ae4bd14,0xcc25e9f4), LL(0x1a5e40c6,0xd17fcfc4),LL(0xff085322,0x7d716a5f),LL(0xee3077c4,0x9dcbc50b),LL(0xdb4a6e61,0xebfe953c),
+ LL(0xd3d777d7,0xe7e66f2f),LL(0xcf1a6b09,0x3519dc64),LL(0xdbf88dcf,0x0df07beb),LL(0xacd4e105,0x17b09654), LL(0x4e70c783,0xcbd7acd0),LL(0x96b9d577,0xda66e747),LL(0xe3e52f8a,0x6d0488a1),LL(0x6ff71c1b,0x3ec0fd11),
+ LL(0xbe4f2782,0x75474cb6),LL(0x41c2c0cd,0x10ef5e6b),LL(0x6a65e29c,0x592c6b06),LL(0xd12d0608,0x4d424662), LL(0xb1a714fe,0xf5280949),LL(0x1199f802,0x52697bcc),LL(0xe6a4ff3a,0xc68ba4f8),LL(0x351849ce,0x25a5380f),
+ LL(0x573ec6f5,0x33207f69),LL(0x67bd2e8b,0x7ecc4bbe),LL(0x8ffe2420,0xa07acd34),LL(0xa13f9cdd,0x0a957eb8), LL(0x9ec9c0c5,0x0bc7f95b),LL(0x6a8578cd,0xd82147cc),LL(0x9e61923c,0x07a2e7c5),LL(0x32e83f25,0x591eb066),
+ LL(0x957c94fa,0xaaa61588),LL(0x364911fb,0x6a2bc707),LL(0xc4907b19,0x09771450),LL(0x9694ccc4,0x4cc48773), LL(0x50c878ac,0x9db6216e),LL(0x6f3031f1,0x6e89210c),LL(0xced0d41e,0xb711dcbf),LL(0x0fbf9751,0xe39bfe3e),
+ LL(0x764636b5,0x18fd7a45),LL(0xb75d48f3,0xe437ee86),LL(0x60a80177,0xe323bb18),LL(0xbc94c0ea,0xedc3c8f3), LL(0xec8cb0cf,0xd8351164),LL(0x2472936d,0xccdd8829),LL(0x58059756,0xa8db1b85),LL(0xd55c184a,0x4eda8cf8),
+ LL(0x2923b8cb,0xdfb5727d),LL(0xe6773d5e,0x6e793e5c),LL(0xa0641165,0x8ecc901b),LL(0xd6da5095,0x6077ab26), LL(0x6b127d9d,0x00669b0c),LL(0xd63e2e1f,0x8140e4e0),LL(0x9641b6a2,0x1ad5b03c),LL(0x9baed7b0,0x44299f88),
+ LL(0x1ea4a056,0x1736296d),LL(0xd77811ba,0x6f74702c),LL(0x432dd74b,0x5c927548),LL(0xe7a194ab,0x9cc73271), LL(0xd6328dca,0x0f035ede),LL(0x28db755e,0x5292aa39),LL(0xa0192a4a,0xb5488385),LL(0xdfc6895c,0x6e7d2fa8),
+ LL(0x5d8bbec9,0xfa912a0a),LL(0x0087edb3,0x7051140a),LL(0x64865e5b,0x5293672b),LL(0xc82c48d5,0x6e8448c9), LL(0xa2c437b3,0xeece41cb),LL(0x21ce1ef4,0x148967d2),LL(0x6b05c2a5,0xf14391fa),LL(0x8fed2f1f,0x15ff5fc9),
+ LL(0x4557b49f,0x18ae5e74),LL(0x3db266b2,0xe33760c6),LL(0xb1b249b5,0xd5d830c7),LL(0xc5fff531,0x24c665b9), LL(0xc57df7c0,0x6b304406),LL(0xc3958e89,0x59706667),LL(0x790a5483,0xbf590ff2),LL(0x5ce77aaa,0xbcaea5a5),
+ LL(0x80ceb559,0x8578a002),LL(0xd8d61946,0x3639aadf),LL(0xadd3bb00,0x3fd52d94),LL(0xe09a8ce3,0x16c27846), LL(0x294c7967,0x75cfd6c6),LL(0x59195034,0xfb9b7f37),LL(0xaa972a86,0xae687a99),LL(0xebd2394e,0x04bdefdb),
+ LL(0x2f96144d,0x8e245a19),LL(0x3b61e5ab,0xc740d348),LL(0x293ddb25,0x8703710e),LL(0x2bbf8f63,0xf4bb6ac0), LL(0xde3b5805,0x86396457),LL(0x65d29e63,0x607022db),LL(0xcc930fe3,0xad0a0cdc),LL(0x1626abf6,0xd9997ebb),
+ LL(0x2a510565,0x2d872d17),LL(0x0357ba07,0x3e682079),LL(0xebfaf203,0x49edd962),LL(0xf81eda20,0x3a13edfb), LL(0x7a75f2d5,0x87b5b5e1),LL(0xddfd9511,0xf04de2b8),LL(0xcfc5c5ff,0xf29a1569),LL(0x07160ed3,0xa3995532),
+ LL(0xcb2b061b,0xb6247469),LL(0x2f10fe1e,0xe75c5351),LL(0xd20e1bf7,0xbaf44963),LL(0x2d93babf,0x216cb6ab), LL(0xf5109e45,0x7e0b655c),LL(0x6657450d,0xdcc712fc),LL(0xd51fc733,0xe06c408e),LL(0xed9c0912,0x85b11f96),
+ LL(0x37365c9b,0x954cb91c),LL(0xb2f74fe7,0xe0eaa047),LL(0x15716541,0x9af74b86),LL(0xf73dc7bd,0x4da06207), LL(0xe07890a1,0xdb0d089e),LL(0x73902f91,0x5bf09681),LL(0xa897f0fe,0x14e1710c),LL(0x3605b1c2,0x191ec9a1),
+ LL(0x0133903b,0x271b2e2a),LL(0xe495ee32,0x5b3686f2),LL(0x0c991f28,0x89bcc974),LL(0x34f93b8a,0xadd20cce), LL(0x680b65b6,0x5f5a1768),LL(0xaad41c40,0x0c453ab8),LL(0xa7fb4269,0xd479630f),LL(0x52c4e929,0x60039d01),
+ LL(0xff860883,0x0d8d112c),LL(0x723c6e29,0xe1dce5c9),LL(0x191ad70e,0xc19eadae),LL(0x62ce0e64,0x4af8194d), LL(0xcc81415c,0xf207bfb0),LL(0x008495c8,0x3ab92f3b),LL(0xfdb9534b,0xe7250e17),LL(0x6c0c1d1c,0xba67e9b8),
+ LL(0x072c793f,0x117ae3ff),LL(0x9fb3091e,0x5243e6ea),LL(0x31a59e39,0xf93ad514),LL(0xc93c1891,0x8ce9cfb0), LL(0x1ed08b0e,0xbfcbf901),LL(0xb53d687d,0x4d13cf2a),LL(0x5d81e4ad,0x25aa82db),LL(0x63c3cb41,0xd12f01f5),
+ LL(0xf8d1333a,0x1e799084),LL(0x653bcd0a,0x30c96c55),LL(0x44b5195c,0x9cf130fd),LL(0x13c77763,0x4cffc531), LL(0x9430619f,0x082287f8),LL(0xb08ce0d9,0x78bb037d),LL(0x3affe8e8,0x2e69d512),LL(0xba9ec693,0xe9dbb263),
+ LL(0x62f132b5,0x67b66ad8),LL(0xbeb47184,0x70318d2b),LL(0xf50a0e98,0x46c429ea),LL(0xe2b3542c,0xd7e32eba), LL(0xe096b4b7,0x625c1ce9),LL(0x389fd4dd,0x09221351),LL(0xfb0ee85a,0x08dc02d2),LL(0x853cd901,0x98c0ba7d),
+ LL(0x0deb1d99,0x88a0cd6d),LL(0x79a6b90c,0x989e4962),LL(0x24dd89d5,0xf5d19b95),LL(0xb37cf19e,0x189e5230), LL(0xb0c5fefa,0x84a607b8),LL(0xd8c7fbd1,0xe48450c9),LL(0x46479ad7,0x178f9b56),LL(0xcbcd2ae5,0x7d6a36c6),
+ LL(0x71ae6516,0x95a4d51f),LL(0x566e2171,0x0363349f),LL(0xed1f2fc7,0x4d4bb4b0),LL(0xf10fa10c,0xde435aaf), LL(0xb76e3b6e,0x711258a9),LL(0x2792e0b3,0x9a640eeb),LL(0x5fab8617,0x7953ead8),LL(0xdd64702a,0xd4b6d248),
+ LL(0x2d672209,0x95bbe528),LL(0xb6926b8a,0xfcc53cfc),LL(0x57659f87,0x05814190),LL(0x08d25069,0x4836e93b), LL(0x6a5ad81e,0xd1eb2006),LL(0xaf0d37f8,0x4bee145a),LL(0xd31ce6cb,0xd44362ad),LL(0x936c1060,0xdc03e581),
+ LL(0x16fcb889,0x13cffce9),LL(0xac7e709a,0xed7e6683),LL(0x5896e541,0xb655d098),LL(0xb92a6204,0x07124356), LL(0xa8f50043,0xa2ae43c8),LL(0x68731891,0xeb39255c),LL(0x3d9c408b,0xe07be0ad),LL(0x0b4f5c3a,0x0db7904f),
+ LL(0x4d70bb81,0x7ddc0235),LL(0x5347797a,0xe3b323c3),LL(0x3536deee,0x3536cd9d),LL(0x001bfd25,0x579b6894), LL(0xebe2922e,0x58ad5301),LL(0x92a88d43,0xe0aa2cae),LL(0x4409e205,0x24567a3b),LL(0x2258f0cb,0x3cece61a),
+ LL(0x3babf4f6,0x8da5cf46),LL(0x81fff8e6,0xb37428d9),LL(0x48495d23,0xcda1ff77),LL(0x34f392ad,0x98f9208f), LL(0x5bc88514,0x931f5b37),LL(0xcb375921,0xd49971be),LL(0xb5c01fab,0x9dcd4986),LL(0xc1ab1c94,0xcc26ec02),
+ LL(0xb4b874d6,0x34e8087d),LL(0x9d0a3761,0x224fc277),LL(0x3f7e5159,0xacc1f258),LL(0x8966d593,0xc82d71ec), LL(0x7dcd691a,0x5b1f9f40),LL(0xba28f416,0xd8fafdae),LL(0x43b6d90f,0xe8622ae6),LL(0x9ec71d5b,0xec13fce7),
+ LL(0xfd2e8214,0x07b6aeb8),LL(0x4cbc297a,0x813e718e),LL(0x81fd6931,0xfac0dfab),LL(0x3c48ffd7,0xa1fe8821), LL(0x85e03c08,0xd2715c18),LL(0x977c57f0,0xb6e4418a),LL(0x73418cde,0xfaa79ea4),LL(0x171e2a89,0x6ab8c25b),
+ LL(0x4ec7cf05,0x2800445c),LL(0xb66c6200,0x8e74a7b0),LL(0x481db950,0x081b1177),LL(0xb89f7c02,0x526d051c), LL(0x5c29c905,0x3c830942),LL(0x44c15ce5,0xbfbd9e3e),LL(0xa29472e6,0x6055c949),LL(0xa37c4912,0xab0010c7),
+ LL(0x5b7d3647,0xeb8492be),LL(0x1ee31caf,0x0b4cfd7b),LL(0x4b46304b,0x81cfcde2),LL(0xc554a5bc,0x968df75d), LL(0x8d0e043c,0x7ce78806),LL(0x345ea27c,0x1e896819),LL(0x6e287603,0xe040c19c),LL(0x138e8ece,0xa581856f),
+ LL(0xc354a9d6,0xe49f6558),LL(0xc0cfb2d3,0xc4ad763a),LL(0x1b76b8f3,0x4be2143b),LL(0xd0ad0247,0xa8caae14), LL(0x928b0ae5,0xcfe96bd5),LL(0x7724f8e4,0xcf5051f7),LL(0xec4af64a,0x9128916f),LL(0xcb437bfb,0xc211ff4b),
+ LL(0xbce59c0f,0xee6e8134),LL(0xd59f7f86,0x3d068b4c),LL(0x96283457,0xafa2753c),LL(0x1aedcbf0,0x453fe33c), LL(0x483c0b1a,0x781294c8),LL(0x5c2ad1ee,0x9e6f5133),LL(0x69383e0b,0x2a77b6ce),LL(0xfa9f0142,0xcb5a83ab),
+ LL(0x3b0e027f,0x2318aa98),LL(0xc2c68dd5,0xdea716a3),LL(0x9f548eb3,0x3f75c46d),LL(0x96120de9,0x71642513), LL(0xdbee488e,0xf733614c),LL(0xaad077f4,0xdf940026),LL(0x94a840cb,0xeda9c098),LL(0x393be3b9,0x5108bf0b),
+ LL(0x39980cee,0x137c08b0),LL(0x0839112b,0x2e31bba0),LL(0xba614ea3,0x9ec73de2),LL(0xd17822c0,0xd0bca8d4), LL(0x50b7805d,0x5d9f7482),LL(0x298becf6,0x16035a80),LL(0xd7c318e7,0x46571500),LL(0xd0ee6956,0x6bd30919),
+ LL(0xb2e13320,0x5c0ad747),LL(0xda47666d,0xe7f7f71e),LL(0x318a8e8e,0xce322037),LL(0xe9f84dd6,0xf15232ae), LL(0x915a03b7,0xc59709c5),LL(0x9a3040b4,0x2e2000f7),LL(0x8398a5a9,0x41955f77),LL(0x7086b69e,0xa8e6620e),
+ LL(0x8344224b,0x63acd70e),LL(0xc3145159,0x966efefc),LL(0xf5e0f955,0x406619ec),LL(0xec6de618,0xedd0efc9), LL(0xb2580ed4,0x6fe3e34e),LL(0x4139b95e,0x9d8875b5),LL(0x8e5be187,0x85baf0c1),LL(0x09553886,0x549cefca),
+ LL(0xae9ef2cc,0xc965b2a2),LL(0x15afee63,0xd43079fb),LL(0x076cdb05,0x02b8794a),LL(0xa0d1a953,0xd0ae7321), LL(0x2ac5fff0,0x5a8b5281),LL(0xcdda362d,0x73437d67),LL(0x1a95ff87,0x1866b2b9),LL(0x0420b3e1,0x5ff11398),
+ LL(0x92284adf,0x0d43b92c),LL(0x4da4c4a7,0x81425367),LL(0xdf17641a,0xc8093c56),LL(0xb5ccd14d,0xc418f19d), LL(0x506762ed,0xaad98608),LL(0xddb2c829,0xb6f45297),LL(0xd395692a,0xd0e49176),LL(0x3b1073d3,0xc05b4e27),
+ LL(0xe5808e53,0xe8ca133b),LL(0x06a64b56,0x6105cd0e),LL(0x53cf6d7e,0x89a64669),LL(0x1bebfea5,0xe281ca2d), LL(0x324b25d8,0x98ee67ac),LL(0xdca154ec,0x2227631f),LL(0x4406e8ba,0xa242c5a1),LL(0x49250026,0xced39f05),
+ LL(0xdd77d731,0xd256dd83),LL(0x7414d0c0,0x2faa6a0e),LL(0x3b90f004,0xa2e0f928),LL(0x8719bfd4,0x019bb3ef), LL(0xe2d515c2,0x3f4f6109),LL(0xbf88d7a6,0xb50a9907),LL(0x015ac4de,0x8e5fbc2d),LL(0xe78a2117,0x96992421),
+ LL(0x26e53df3,0x321e6086),LL(0xf42b2508,0x07eb1d15),LL(0x0ef22bc2,0x7b552108),LL(0x00f3e571,0x9eedb828), LL(0x6f0e883c,0x556abbaf),LL(0x40473ead,0x8025770b),LL(0x6ece1cc8,0x2fdab965),LL(0x00ec1adc,0xba07cf89),
+ LL(0x4be5ad18,0xefec4deb),LL(0xd59fa732,0x16625be8),LL(0x6808cdf7,0xffee542e),LL(0xd7a9f29b,0x85c19ef3), LL(0x82dc1ae3,0xca4ac1f9),LL(0xca5e8f58,0xa6c726d1),LL(0x66960edd,0x0bcc3d58),LL(0x56f94ea8,0x8e8445d0),
+ LL(0x938e64c9,0xd4d0177b),LL(0xf9a0288f,0x8d0199f1),LL(0x14a226c0,0x9176d559),LL(0xa00aea02,0x13b373ee), LL(0x6b629fea,0xc63b2d79),LL(0xa7e0cc42,0x36df7c09),LL(0x40bdbc8e,0x4628ba4f),LL(0x0de296f2,0x7f5b0228),
+ LL(0x3c63d73f,0xb0598130),LL(0x0431550e,0x55e59f61),LL(0x6693eb8c,0x6f2e109d),LL(0x470b10fe,0x3602ba82), LL(0x5ec7f357,0x3acd0af4),LL(0xb071c758,0xfa7479f4),LL(0xe13652c9,0xbf47caa0),LL(0xf5f5eca9,0x6fa139bb),
+ LL(0x8c0e197e,0xfa149b84),LL(0x60ae7755,0xca31714c),LL(0x8ccc4241,0x934ed1af),LL(0x781a024e,0x39772769), LL(0xbe24eb34,0x9f07dfb1),LL(0x0a3dac06,0xfa8a9c60),LL(0x8e410ce7,0x08fbbe21),LL(0x396a9702,0xea55fb96),
+ LL(0xf18882bb,0x4422bc58),LL(0x0ddd0dd7,0x1ccb7b47),LL(0xf40ea941,0x828580a8),LL(0x0db78350,0xf9ec9728), LL(0x1612f28a,0x2823b4fd),LL(0x82b26487,0x96dc3e29),LL(0x2497420a,0x1740fdae),LL(0x322f1c6f,0x3bb39dfa),
+ LL(0x4cb19878,0xf32a21e6),LL(0x9277c80b,0xeac04097),LL(0x13380801,0x67178d8f),LL(0x34bf8872,0xfe5e2694), LL(0x327129d3,0x8278bad4),LL(0x941c4e5c,0xb42a3f9b),LL(0x39de36f0,0x04eefb7d),LL(0x8d967703,0xed2aab7f),
+ LL(0x72aa1c89,0xa3283a2c),LL(0x2a4d513e,0x1969613e),LL(0xddd5ea18,0x0d4c0347),LL(0x43cee5fe,0xbbad9ce4), LL(0x57313b49,0xe8c050a8),LL(0xff09bf31,0x3b91c3cc),LL(0x610395cb,0xe6e5ab6d),LL(0xdeb31bef,0xfc36cde0),
+ LL(0x5d43c8a7,0x76f806f2),LL(0x63b7c746,0x08a64cb2),LL(0x45256a2a,0xb6cdcdab),LL(0x9bebae90,0x640f67ea), LL(0xcf016971,0x682eeeb6),LL(0x50f59261,0x4d16d566),LL(0xf41db99d,0xdaca66bb),LL(0xf8f04d96,0xccdb3da0),
+ LL(0xcf41b164,0x7c228cae),LL(0xedbefa7c,0x40bef27f),LL(0xecb43685,0x4efdd6c2),LL(0xa834a50b,0x4d0fa367), LL(0xb87f7ec7,0x2ec9c445),LL(0x23170d0f,0xc3663ced),LL(0xc5b47b29,0x189872e4),LL(0x746d6a13,0xf8047387),
+ LL(0xb75ac898,0x753837d3),LL(0x91959a78,0xaee88a60),LL(0xe6f59621,0xf46b0f6e),LL(0x10d981c8,0x0e92e271), LL(0x8d578b6d,0x610d0f80),LL(0xb4d9b9de,0x962bd7bb),LL(0x84a0c394,0xbe26960d),LL(0x3b5bd996,0x142a0c75),
+ LL(0x0be95497,0x442bb39a),LL(0x0f33c9de,0xce5d2c60),LL(0x283dc751,0x1ce0d08c),LL(0x79b3c1a8,0x106ed588), LL(0x7f8ee4d7,0x4b2e29c6),LL(0x08bbd660,0x7d61e3bb),LL(0x1e964a3e,0x11504dc5),LL(0xc77a957a,0x31544a52),
+ LL(0xcd7d0dac,0x1fc4161e),LL(0x370c15c9,0x83733f27),LL(0x853758cc,0x224976de),LL(0x47c1ab78,0x1bbb7730), LL(0x19c89029,0x94a3b697),LL(0x37dfc44f,0x031432f0),LL(0xd88090cb,0xf84593ac),LL(0x65bcfee8,0x381b51bc),
+ LL(0x10b412b7,0x38dac75b),LL(0xc7e06d08,0x6df5c9a1),LL(0x0e08c41c,0x9c6d8068),LL(0xc3600f4f,0x1544e3c5), LL(0x9c83e0a1,0xf827a48d),LL(0x06bcb3c4,0xd8539228),LL(0x6268cf12,0x149862b3),LL(0x6ec4e354,0x4829ee56),
+ LL(0xb712a1f9,0x44b2c3bf),LL(0xc90852af,0xe556b78a),LL(0x906a13b6,0x50f6de2e),LL(0x568a1293,0x1744efd5), LL(0x2b5745a1,0x942ad99e),LL(0xca362913,0x0f100bd9),LL(0x91e96cde,0xd9b6ad51),LL(0x5a2f88e9,0x4aa440bc),
+ LL(0x57a10070,0x53c4c956),LL(0xae6e4872,0x7d1be72e),LL(0xd427eda4,0xb704009c),LL(0x5f39b7d8,0x3e0aa93f), LL(0x3153a757,0xdea1ab48),LL(0x9ee60ead,0x10a070e7),LL(0xe6c916bf,0xd6a6e92d),LL(0xbd7bb216,0x02b1e0e6),
+ LL(0xb49138a3,0x6efb5f1b),LL(0xe88d2db0,0x11f7a9be),LL(0x3233df5b,0x0b9a2b11),LL(0x1824fcc5,0x0688afda), LL(0x5ff97f9a,0xcf1ea2a5),LL(0x4998e602,0xe8ad7b15),LL(0xa455aad1,0xdb4ae67e),LL(0x74a27ff3,0x823ac090),
+ LL(0x2573443f,0x5c431060),LL(0x94258714,0x92f9f9ab),LL(0xb1283d2e,0x1548fe21),LL(0x5c5be5f9,0xf86fe50b), LL(0x520c5fc6,0xd20dfc8a),LL(0x53b5e7c5,0x6e721dd9),LL(0x8f2a8969,0x8ef7eee5),LL(0x62d07bdf,0xe894859f),
+ LL(0x1cfc6627,0xaf279176),LL(0x483755e9,0x94b8cff4),LL(0x0fda4bcb,0xa5916f70),LL(0x47ba65f3,0x9c5318d0), LL(0x636cd7e3,0x9e9c8e54),LL(0x54c49da3,0x5c64a261),LL(0x690e932c,0x04d7ff61),LL(0xc84b0b78,0x92a357b3),
+ LL(0xc6f3bd8d,0x47f6144c),LL(0x71c19265,0xdf7b1ee4),LL(0x3fd5c30f,0xa7ea37f1),LL(0x79fa08cf,0xdc2d890b), LL(0x2fd40236,0x9813bced),LL(0x432dde17,0xa8a1055f),LL(0x7772c727,0x70011f47),LL(0x2e2e802f,0x965c130a),
+ LL(0xf5bd4ac5,0x31a6aca7),LL(0xd825db6f,0x83995bde),LL(0xfe521833,0xcbf20325),LL(0x0278f4a0,0x8dcd25a1), LL(0x5f2293ea,0xf1e83d97),LL(0x52317ad3,0x1717876b),LL(0x14181928,0x0df62167),LL(0x2fe203ce,0x24adfd6e),
+ LL(0x797f25ff,0x1d264af0),LL(0xd22e3da1,0x2cb7cc17),LL(0xe0016a19,0x10c4b51a),LL(0xd82b2a86,0x5956ce8f), LL(0xa3d4780e,0xdef0fefc),LL(0x6e92b93a,0x97e693ab),LL(0x20bcc98f,0x8fa3f4fa),LL(0xf9182867,0x4fc004f1),
+ LL(0x93e73961,0x1a206da3),LL(0x1e7db32c,0x37d75a90),LL(0x0455b815,0xa39f0db1),LL(0xb69ee770,0x841646e0), LL(0x0939f065,0xadb0aaaa),LL(0x0b147d7a,0x5608613b),LL(0x470f6875,0x84ce1a4c),LL(0x7983050e,0x501de5fe),
+ LL(0xc3d8ed98,0x19915b26),LL(0x9a66a6e5,0xf451e57a),LL(0x30dab6a3,0x29843607),LL(0x3d1a1ebb,0x1710267c), LL(0xe11d88c0,0xce4ecfd4),LL(0x11ce026a,0x12fc2787),LL(0x691227de,0x9801cecd),LL(0x76ce6dae,0x517a92f3),
+},
+/* digit=25 base_pwr=2^175 */
+{
+ LL(0x648c48e5,0x821b0fdf),LL(0x9f45a433,0x689e6d56),LL(0x2e572855,0xa5a9dca8),LL(0x8adfb547,0xb0f07eb7), LL(0x552c8d55,0x48ecb166),LL(0xce854171,0xfe3fc268),LL(0xeeee9bc0,0x323af5eb),LL(0x41ae1c80,0x0666a2a3),
+ LL(0x9ff262fb,0xa06d20bc),LL(0xd075868b,0xcba032fd),LL(0x943fd973,0x70376026),LL(0xe35c5e02,0x81c57cba), LL(0xba871f1b,0x1964e700),LL(0x6b265f57,0xf03a8c04),LL(0x0b950259,0xc8ebc912),LL(0xad32ca8b,0xd2b0ee30),
+ LL(0x89c8e719,0xe01bf0c2),LL(0xb2f4cdb0,0xbce1e20f),LL(0xa1053ca5,0x8c38eeaf),LL(0x7cd633a5,0x8c2d85ef), LL(0x9b53cdb1,0x75695364),LL(0x447eb1a5,0x5e999741),LL(0xdbd88626,0x6d6b2d88),LL(0x21876357,0x87eaf045),
+ LL(0xdeec441e,0x2c88f1ff),LL(0xd01b2157,0xab52096b),LL(0x6c45cf5c,0x37eee275),LL(0x0520ecaa,0xa070d24e), LL(0x546b9fd3,0x61d15bd1),LL(0x2c96db1c,0x3276fb74),LL(0xb95b29b7,0xc5c1b041),LL(0xbd7d3254,0xe18008db),
+ LL(0x98dfb69a,0xd56ae44f),LL(0x609d941c,0xd5f66b0b),LL(0xb91b5245,0xca6b6d35),LL(0x7b3f98a6,0x98e3a4e3), LL(0xf358c56a,0x0715dfa6),LL(0x36a66c64,0x3b02ff21),LL(0xcb22cbd3,0x737b1401),LL(0x6b8e9624,0x9dd15f5b),
+ LL(0xd360d017,0x25f5a71d),LL(0x29b0ed73,0x4c0779b5),LL(0x9825a018,0xc662fedc),LL(0x61d4add0,0xeee89125), LL(0x92163d14,0x1543814d),LL(0x27370d3c,0x79f2376f),LL(0xcbe1af7a,0xf80c6963),LL(0xeb9e41f7,0xf2d521bc),
+ LL(0xc1805864,0xe241619f),LL(0xb2de204a,0x6f1d6166),LL(0x50e68d0b,0x13c3f912),LL(0xc4a24f5a,0x32eb021d), LL(0x0e78c588,0x3f1452f5),LL(0xc9971e98,0xa267bf19),LL(0xe801c021,0x77a231a7),LL(0xc2666e80,0xf363c9b3),
+ LL(0xae309a0a,0xb8eb0bf0),LL(0x375b8fbc,0xa9f52f58),LL(0x1a4993b7,0xb8e4f948),LL(0x8f73c292,0x50ce578e), LL(0x02e503d6,0x2437a4a6),LL(0xe4c68ea3,0x20cdfc50),LL(0x3616f348,0xfec5993b),LL(0xc0c420df,0x5d96b4c5),
+ LL(0xcca0c48a,0x6b71cdf0),LL(0xc1aea033,0x00e71b54),LL(0x69f6d107,0x247f5baa),LL(0x050c3704,0x4e3ec504), LL(0x7a438e93,0xf2b2be8a),LL(0xa331e01e,0x240b632d),LL(0x91150675,0x61e66557),LL(0x95a99a28,0x32364134),
+ LL(0xd3399e1e,0x5e5de136),LL(0xfe2f8b75,0xe38bab00),LL(0x3a77db29,0x736126de),LL(0xf2aa121e,0x7b0d1865), LL(0xdecf9cde,0x5545e45e),LL(0x2318be70,0x9608ebce),LL(0xfa55b0e5,0xe6596006),LL(0xbc4b6ca0,0x0c8c2f41),
+ LL(0x92025945,0xda1c5c7a),LL(0x5d3b0775,0xb114ba22),LL(0xcedb69a0,0x11cc6888),LL(0x0f83c772,0x4365bea8), LL(0xbda8dbe3,0x006fe80b),LL(0xc2d3d266,0x334adcb6),LL(0x1521de1c,0x8c92c084),LL(0x78d8f72c,0x57873ef9),
+ LL(0x3b64dcd7,0xcfb0a7d0),LL(0x558c9d55,0xf4c2f1fc),LL(0xa0fbc656,0x110c2db2),LL(0xef5b6bea,0x3cad85ca), LL(0x4e0b1230,0x7099dd0e),LL(0x098a2fcd,0xc769b937),LL(0x1e1e7407,0x9209f550),LL(0x1ba7cb47,0x1b47255d),
+ LL(0x2c01b596,0xd8aed0cd),LL(0x30efcda3,0x1a1a2e11),LL(0x36b1a5b5,0xf771f93b),LL(0x14fcd251,0x2ea34e3d), LL(0xfd893979,0x6895cb31),LL(0x14f556b4,0x10b1d2c9),LL(0x6430bfa8,0x835fdf7e),LL(0x24bf4ba5,0x1f4bbef5),
+ LL(0xd562b5f1,0xbc805aa5),LL(0x35dac658,0x7101b9da),LL(0xddc28e5a,0x5b7f211d),LL(0xd3d1cd0a,0xea89f24c), LL(0x7567c80d,0xbaaa9ef5),LL(0x9a60c5ee,0xe0d1f26d),LL(0xab36cd64,0xc88a044c),LL(0x1b125de6,0xb8e03d02),
+ LL(0x3a707a66,0xda0c1047),LL(0x0c692d44,0x76ddb98f),LL(0xb15b7254,0xeccae586),LL(0xe7e82423,0xeadc1b51), LL(0x7c3cb698,0xd6779ff2),LL(0xdf6e7da6,0x0e271cb4),LL(0x45900023,0xeacf34c3),LL(0x03da2ba5,0xafd017ad),
+ LL(0x27c7e6eb,0x49266998),LL(0x6625bc7f,0x84ffa372),LL(0x05c9cb15,0xedec9247),LL(0x8075b84e,0xcfad0b90), LL(0xbc0898d3,0x94bed316),LL(0x11f92525,0x02481eec),LL(0x0d7e59d7,0x19896e1b),LL(0xf2bb3129,0xa06adb6c),
+ LL(0x62a0a690,0x1539228e),LL(0x8ae02bda,0x98ac50b9),LL(0xe5cf21b9,0xaf233c85),LL(0xd6a9f599,0x943348d3), LL(0xdb363eaa,0xf5a2f2d1),LL(0x7a8ea96b,0xe917e2c5),LL(0xbf5c8293,0xc80b56c8),LL(0xcdbb5c4f,0xcfc1c24f),
+ LL(0xfbddf07b,0x7812dce2),LL(0x0186013a,0xd4af2f9b),LL(0x6fe8d485,0x1fadcd16),LL(0xc968f0b7,0xc3c2cd95), LL(0x778bff58,0xdbdd2ef0),LL(0x8706da34,0x67369204),LL(0xb8e70e35,0x31cf3a66),LL(0xd333801f,0x0b9e5cc5),
+ LL(0xf7177c4a,0x1212a811),LL(0x2d379e12,0x9e266ec3),LL(0x2e8bbbf7,0xc7382848),LL(0xa973be5f,0x3f3f1dc1), LL(0x786e727e,0x534d04de),LL(0x225497dc,0xfd7a5fbb),LL(0xb63b6320,0x3c03a7fd),LL(0x5dc76e05,0xe77f8985),
+ LL(0x265f8b8f,0xe8d14f32),LL(0xb90549c9,0xfeaab021),LL(0x081ccea6,0x7cd36751),LL(0x1f1e8f7a,0x7a001441), LL(0x1fdfd622,0x2e87b8a2),LL(0x8bb4f812,0xe76138ce),LL(0x71e03be4,0x9a5e8722),LL(0x153e0a5f,0x795e60f3),
+ LL(0xd0eb7d4c,0x11d28438),LL(0x4254a845,0x147884e1),LL(0x2a8693fb,0x6795f20f),LL(0xee01bd1a,0x5a10d535), LL(0x218c0513,0xe39982c9),LL(0x1d4e6ab5,0x6c23e5be),LL(0x0f424e7c,0x20a8c27f),LL(0x3bbb486f,0x74ae9998),
+ LL(0xb90ce3a1,0x3fae61be),LL(0x571c968b,0xf0f5a1e4),LL(0x7780d91b,0x6b9dded8),LL(0x7597e866,0x10f60ce2), LL(0xf1eb7d1c,0xf268ed02),LL(0x6030bf9b,0xa49b5a46),LL(0x251f8676,0xc939c4e7),LL(0xe2b9928f,0xbdfe5036),
+ LL(0xbccf7f43,0x5abfbcc2),LL(0x28c560af,0xb22067b6),LL(0x04c6a2da,0xecf07771),LL(0x8c4ae7dc,0xa2bf88db), LL(0x616675e8,0x172396f2),LL(0x8bfcfbc2,0x9abbb19c),LL(0xe85edd21,0x52e26c06),LL(0xa65de52f,0xfca4c4e0),
+ LL(0x281d58be,0x255e2d10),LL(0x3614ed6c,0x93ec2934),LL(0x6dc71abe,0x36d6cc15),LL(0xf592ae78,0xaa2ad1ef), LL(0xcc9291fb,0x39a82740),LL(0x102600d8,0x6812b80f),LL(0x50c511d5,0x64f4843c),LL(0x03445793,0x28f5795e),
+ LL(0x29f20b0c,0x2c566372),LL(0x9e24474c,0xb168ca7a),LL(0xabe37949,0xfadd8f80),LL(0x4cd69856,0xafa1bea2), LL(0x46713b88,0x5ce6ed80),LL(0x4b3bb84d,0xaf8b5fb3),LL(0x29d53349,0x134e5120),LL(0xcdcedefa,0x1214f4f0),
+ LL(0x4bb405b9,0xc346821b),LL(0xddd624d6,0x753afa86),LL(0xc7c014e3,0x15fe543c),LL(0x43d08964,0x6b3c0c5d), LL(0x745221aa,0xc77c8fb0),LL(0x152995c9,0x3e144fce),LL(0xa61b96bc,0x57089907),LL(0x5e05c1ee,0xd19a912c),
+ LL(0xa6ddd20b,0x7bcdc697),LL(0x2d5090f3,0xcb07e229),LL(0xf089607e,0x76afc803),LL(0x637dae27,0x9f7a88b9), LL(0x3bd20d78,0x1352d8bd),LL(0x5ea79d4c,0xede1a780),LL(0xf389e31d,0x59a8222b),LL(0x5c09f3d4,0xed066aa6),
+ LL(0x684529d3,0xade16197),LL(0x96a2a159,0x97bed904),LL(0x1b695d68,0xdd3da765),LL(0x02fecb9e,0xb8fa37e8), LL(0xbc0f7b99,0x1af4311c),LL(0x2a492a7e,0x600bdd46),LL(0x45dc9d16,0x6aa9cb30),LL(0xc0b93019,0xaa494815),
+ LL(0xba052dd8,0x1211834b),LL(0x86822bf1,0xcdc0208e),LL(0x8c8362a0,0x515eebd4),LL(0x9b90cf96,0x9ea7b9f5), LL(0x3a0a5a48,0x8418fe34),LL(0x331a2db1,0x654d3c32),LL(0xafde743c,0x22362ddf),LL(0x6f6ee3ba,0x617a89e8),
+ LL(0xb7deb988,0xed5f3d04),LL(0xbbc8a6b2,0x31c2c9e6),LL(0x81a3f184,0x8faa80e1),LL(0x51ecc548,0xa7183488), LL(0xa3780d0a,0xe67512d0),LL(0x822db54d,0x9f868036),LL(0xe555beab,0x6c74490a),LL(0xd989d6be,0xe747e666),
+ LL(0xdf8cd308,0xf8346dd6),LL(0x4745cd8e,0xe7ca105f),LL(0x31055db8,0xee059c58),LL(0x18b38aa0,0x90f4053a), LL(0x41081a21,0xbb2e7fc3),LL(0x45b33a71,0x3602525e),LL(0x2b411945,0xff21f2aa),LL(0x064ccb11,0xbeaadbd3),
+ LL(0xfe94629d,0xc35f6950),LL(0x9f860b15,0x1cbaa935),LL(0xf24f8f15,0x29b4bcd3),LL(0xd29c8458,0x0ae5b06a), LL(0x1b6c2df1,0xa645c31d),LL(0xd804facc,0x640b0990),LL(0x122b33e6,0x7a4a7f59),LL(0x7479b828,0x94bb0b2b),
+ LL(0xc4cd4887,0x0567272a),LL(0xfc8e4b0b,0x676d6962),LL(0x8661c0c2,0xa712b020),LL(0x279454a7,0x660e6aff), LL(0x1cd25bfd,0xe1295106),LL(0x077496a8,0x7096885c),LL(0x3006ab7b,0xdbc47c92),LL(0x509205f3,0x498761fa),
+ LL(0xe85ecfee,0x5d1eaeca),LL(0x534f38f5,0x9fcddeed),LL(0x8af32f70,0x4d34ec80),LL(0x24b3b4e3,0x476dffc9), LL(0x8bbcda9f,0xb45cd869),LL(0xdf684c2d,0x3b0079e7),LL(0x765cd483,0xcaf3eeb5),LL(0x63945b62,0x0b9e25e6),
+ LL(0x06492e0a,0xfd73833e),LL(0x9507ea57,0x4d2937e1),LL(0xcf562953,0x3e532c2e),LL(0x81ca80c3,0xe4baa2d4), LL(0x28d22139,0x4699e5c4),LL(0x6b1c665a,0x69aab900),LL(0x641016ac,0xf6a37330),LL(0x5f3b7c71,0x335f14cb),
+ LL(0xfacd904f,0x94a6c868),LL(0x2ec2bf99,0xb1127cc4),LL(0xa4b72d69,0x0ccfceb3),LL(0x55172f5b,0x16b786a3), LL(0xe093a729,0x51ebe029),LL(0xc40c4487,0xf57f4a1e),LL(0xa8ed5a3d,0x8aaf0dd6),LL(0x811f35d6,0x617c51f7),
+ LL(0x11e98d29,0x18c7ac62),LL(0x2c904ea8,0x71c578c4),LL(0x3c4ef8bd,0x4626b0ad),LL(0xa390be8b,0x121eb676), LL(0x154e297d,0xcb7249f5),LL(0xc2288ba0,0x678ad966),LL(0x57cc9cbc,0x3c2ab066),LL(0x80c8fbda,0xe32c1d45),
+ LL(0xf0b35526,0xd2f152cb),LL(0x13877dfb,0xc7f75fd4),LL(0xe83ca4a2,0x8603feff),LL(0xcd680589,0x6be89bb3), LL(0x45e1f141,0x5650549e),LL(0xa55ffadc,0x7dab03b8),LL(0x2dc5d31f,0x342edda4),LL(0x9af8105a,0xa97451ac),
+ LL(0x705b8fd7,0x796e1fe3),LL(0x02d131b8,0x6252a7ba),LL(0x086c3099,0x3db2ab14),LL(0x9db0ce72,0xeb763df5), LL(0x52b62fa5,0xe7b57bab),LL(0x88b820bd,0x6076d449),LL(0x1b660123,0xc43e1f61),LL(0x189eace5,0xc802d40b),
+ LL(0x341309a1,0x1f2a2a91),LL(0x414db96b,0x8680be67),LL(0xc846e288,0x65dd0396),LL(0xb0bbea85,0x8a1d871e), LL(0x8ff931c6,0x623e2408),LL(0xe14c5941,0x4933ffda),LL(0xb2cbff67,0x72688986),LL(0x8cf79450,0xe51504d8),
+ LL(0xfeba1168,0x50cd0a3f),LL(0xcd833df8,0x08d2e0fe),LL(0x0a4370ed,0xdbd60827),LL(0x66f4f58d,0x010cf800), LL(0x144e9656,0xffa29252),LL(0x9d1e9d61,0x90b896a2),LL(0x81f7b4d3,0x1802257c),LL(0x595612a5,0xd7758e8b),
+ LL(0x241b4dd2,0x751882d8),LL(0xfe177abe,0x7dae3003),LL(0xee6fe1cd,0x8f4d5dc4),LL(0xb08f625d,0x93a9cd5b), LL(0xf91cc442,0xa4d6ee1a),LL(0x594d172f,0xe05976cd),LL(0x6e762b2e,0xfb4064c6),LL(0x51a0156d,0xb2068ad9),
+ LL(0x24f06e82,0x0d2d5b26),LL(0x8c85a9a9,0xad70f276),LL(0x0ed413cb,0x00ede5d5),LL(0x927064d2,0x245be28b), LL(0x2af70d77,0x06eb2825),LL(0x52b0592b,0x472af630),LL(0xd881d50e,0x493afd98),LL(0x1189c989,0x56fa76a8),
+ LL(0xfaa974f7,0x775665d2),LL(0xc3f54eff,0xe395ccdb),LL(0x3fc83a7f,0xf0a40e4e),LL(0x4c00087a,0xc3b11d22), LL(0xddb50678,0xef8d2f06),LL(0x6cd5f681,0x6e41f315),LL(0xa1b97891,0x7c9d7a3d),LL(0xa0a41260,0x8b297d75),
+ LL(0x3806a30a,0xca44b65c),LL(0x61a6206e,0x125c5702),LL(0x87003e1e,0x311842a2),LL(0x4513d726,0xe049a7d0), LL(0x7b123469,0x8022c2d0),LL(0x86294393,0x76533934),LL(0x892e7bc4,0x6a6e84e7),LL(0xdb2007fe,0x7daf8b11),
+ LL(0x923e185c,0x092d1914),LL(0x3def87c2,0x5ec11237),LL(0x18742a51,0x38019e96),LL(0x4808ca10,0xe05ea79e), LL(0x134cbf9b,0x1fc8ae26),LL(0x01b4c1c4,0x14054672),LL(0x64051972,0x32abf912),LL(0x1af62fca,0x0edaa925),
+ LL(0x3c47d01a,0x58fa82e2),LL(0x780762c6,0xdb12a452),LL(0xfdbf4683,0x16d5a733),LL(0x2f798deb,0x1d7e8507), LL(0x9eab12f7,0x259aa9b9),LL(0x91261397,0xb13e6e41),LL(0x32602f2e,0x564706fa),LL(0x9c2283ef,0x50daef9c),
+ LL(0xf07a196e,0x9275f219),LL(0xbb8fcd35,0xfc58ebea),LL(0xbad69c11,0x5d1025f1),LL(0x1605c11b,0xcf364154), LL(0x2992276c,0x427bd117),LL(0x6a73cbb3,0x5545bec5),LL(0x133f3266,0x86855c2f),LL(0x67d9e5b2,0xb3d753d1),
+ LL(0xc9fb343b,0x2134b384),LL(0xb0e12b7a,0xb572f5d6),LL(0x392d24fe,0x7ee5852f),LL(0xc4f285f9,0x73559fae), LL(0x7711c525,0x269cb9e7),LL(0xf00d5606,0x4badfc52),LL(0xb465df15,0xef66d726),LL(0xaa4a301b,0x83eb59a3),
+ LL(0xed329b12,0xdb406469),LL(0xd933eb45,0x6eb95cc9),LL(0x6b638bdd,0xe2dabfa4),LL(0x031df114,0x7a5d0098), LL(0x38dbfaaf,0xe22d8f3e),LL(0xd79d1ce1,0x2306fd54),LL(0x7acb7cce,0xda324535),LL(0x88f61a1e,0xde6fcc16),
+ LL(0xb730fe5c,0xaf3e4894),LL(0x28adf897,0x7a3e4a7d),LL(0xb160ae0e,0x352c0069),LL(0xee52c58a,0x225cfb67), LL(0x96b2505f,0x12391b71),LL(0x3758141d,0x8d811bee),LL(0x8cd82e11,0xc941524d),LL(0xbb83a251,0x0feb26a5),
+ LL(0x76da8411,0x60ad0665),LL(0x88d4a968,0xe3c033d9),LL(0xde120078,0x767b3c05),LL(0x9f31e1e8,0xab7da95a), LL(0xb93e7cb7,0x7ad9b263),LL(0xfd626ea3,0x280f6bc3),LL(0x62713cad,0x746c3945),LL(0x3a4edce8,0xfa2b4599),
+ LL(0x10ab7f93,0x8792d0cb),LL(0xc25a2a86,0xfa38d031),LL(0x08b028e8,0x6914db0b),LL(0x383cab40,0x75a98aa0), LL(0x6da884bf,0x462e6b6d),LL(0xd3aa74b1,0x2b0f682b),LL(0x5cee0a83,0xb3b7995e),LL(0x3cce609a,0xe99fca2b),
+ LL(0x45451744,0x342c41c9),LL(0xc81be29f,0xb00d3c24),LL(0x022e8d27,0xd1e64d86),LL(0xbcf67326,0x404550be), LL(0xc8aab829,0xc7c510f0),LL(0xa90c605d,0xb61ae647),LL(0x02db8602,0x582ad9c9),LL(0x71cb4397,0x732b19ed),
+ LL(0x265e5369,0xea097c35),LL(0x9d5ea687,0xea7c368f),LL(0x8fcae7f1,0x7fc3b213),LL(0x49c54942,0x641daa3f), LL(0x404c39a6,0x0696372b),LL(0x87b4b181,0x56815716),LL(0xfca24eb8,0xa6e156b3),LL(0xd078a39c,0xf278eeae),
+ LL(0xac762dbe,0x046566d1),LL(0x625ed2e8,0x662ef0f6),LL(0x650e4764,0x15499e72),LL(0x84edf50e,0x361ccef0), LL(0x1f4a2200,0x2441f6f4),LL(0xdb730d58,0xf36fff06),LL(0x3c01edc7,0xcc18624d),LL(0x8a77e5bb,0x4889078f),
+ LL(0x75f8dd8a,0x02294e3b),LL(0xfc4113c5,0x5f6f6057),LL(0x6f699f18,0xb5300e0d),LL(0x639dc977,0x52cce358), LL(0x328fd50b,0x5dbe59b8),LL(0x39d73c2f,0x81500be6),LL(0x96ae313d,0x409ac4d7),LL(0x5b16c316,0x15205b7b),
+ LL(0xfc688c09,0xe272300c),LL(0xbdf71f2d,0xb412cf39),LL(0xf85b23d4,0xe3ab9c44),LL(0x7b662694,0x5c14085c), LL(0x9956d07b,0x24b0b385),LL(0x30b2c82d,0xfa8ea968),LL(0x6d403b58,0xd443b2aa),LL(0xe7fc8d57,0x6da53ecb),
+ LL(0xdfdf488f,0x29655314),LL(0xadc57e2b,0xb418943d),LL(0x6395a287,0xbaf090f1),LL(0xd62f5b38,0x8fdb4fc8), LL(0x371c9db1,0x115653c0),LL(0x96463359,0x6f5e1f39),LL(0x825e6273,0x106aaf1e),LL(0x398cbe1b,0xba22b7db),
+ LL(0x62b6bf7e,0x3b545300),LL(0x5bb6f993,0x495d7d27),LL(0x3f00290b,0xf558fc5d),LL(0x2cfc2381,0xdddbeb3e), LL(0x65c79326,0xca402179),LL(0x33b1973c,0x376ce4ac),LL(0x9b30749a,0xd6e65ae4),LL(0x5f54bf5a,0xdf68ee04),
+ LL(0x4cfdb41a,0xa982948d),LL(0xf2a7b4b3,0xddd1d3ba),LL(0x581aaba1,0xf52a6b33),LL(0x894ebf68,0xc3258264), LL(0x84665ac1,0x26c32c27),LL(0x20119b0e,0xda0190eb),LL(0xb86745c1,0x4a599db7),LL(0x58964b41,0xf9570f50),
+ LL(0xe0648365,0xb34d039b),LL(0x5c5f61e1,0x2cd7fde0),LL(0xbc6b08cc,0x76f514a3),LL(0x18a3cabf,0xc957b50d), LL(0x2334cd1f,0x775fc56a),LL(0x67ec91c6,0x7bfe3864),LL(0x35ad3a9a,0x99037daa),LL(0xb7ca5657,0x17ffe391),
+ LL(0xfef04aef,0x19f6d369),LL(0xd1876f8c,0x8030b467),LL(0x3cd7878f,0xa014be02),LL(0x3358c943,0x03c22a58), LL(0x2a257094,0x3c77f083),LL(0xd962a04f,0x47386957),LL(0x82da3329,0x768da40c),LL(0x458219cf,0x1507350d),
+ LL(0x4397ee7c,0xf460aed3),LL(0x36fbc7fe,0xf249e4cc),LL(0xaab03dfe,0xc42d9da8),LL(0x435ab9f3,0xa3d73ce3), LL(0x3813a3f3,0x86dddbc3),LL(0xb79c32a3,0x86d5779a),LL(0x028a2c3f,0x7c3d9aff),LL(0xb1add2bf,0xc687e71b),
+},
+/* digit=26 base_pwr=2^182 */
+{
+ LL(0x09b3fed3,0x4612a562),LL(0x3579966a,0xf296c17a),LL(0x07960971,0xa124a36f),LL(0x380c4a05,0x6d03b214), LL(0x70f1f268,0xcb0746e2),LL(0x9341aea4,0xcc9b47ff),LL(0x6d2f59cc,0x1b3662d5),LL(0xd4b1a15d,0xa6c65b2d),
+ LL(0xcccb0a4b,0xf96c113a),LL(0x3615f016,0x24c26bba),LL(0xeead2f5b,0x52fe115a),LL(0x0d7aaabb,0x85623d26), LL(0x31a2564f,0x50791fd0),LL(0xcd0d59a4,0x3659974d),LL(0x7a8b7466,0x2cffdb74),LL(0x514787b0,0xcf6b36e5),
+ LL(0x4ab1ccd2,0x8afccd36),LL(0x1c03ab29,0x67314635),LL(0xd7ff3a32,0x458f36bf),LL(0xfcf71648,0x70e9e789), LL(0xa6e904cf,0xf3764534),LL(0xf4bdd378,0x2d6130b1),LL(0x1ca5ce34,0xc61c98fb),LL(0xa4a684f5,0xda11f502),
+ LL(0xb6223f04,0x8d9daa41),LL(0x841c3fab,0x803c9c0e),LL(0xc50b42cf,0x60eee3f9),LL(0x77298193,0xaf4a7a5a), LL(0xbf809ad6,0xd379c2e1),LL(0xf67c0ff2,0x903ab4b1),LL(0x90f8e637,0xc779d7ed),LL(0x2cf3d363,0x968b0cc0),
+ LL(0xacf51940,0xaadfa857),LL(0x50156581,0x0c789d1e),LL(0x62cff8f4,0x5e79cef7),LL(0x65eb0d49,0x54cdaba9), LL(0x3321c57e,0xdf7a5828),LL(0xa21a51a6,0x8571e6e2),LL(0xc3726e69,0x0b9b482b),LL(0x1d92b657,0x3bc201e3),
+ LL(0x8a3b4cf8,0x271c58bb),LL(0x717eb539,0x269fc422),LL(0x5b381fe1,0xe82644e9),LL(0xcb62982f,0x27fb0822), LL(0x5b5ec726,0xb0acd51c),LL(0xea4eff73,0xfd01053d),LL(0x00b11c80,0x465311dd),LL(0x2ed8460c,0xe50a8615),
+ LL(0x7b2243a0,0x3eade5eb),LL(0x77424d11,0xa59ec933),LL(0xf5c7c3b7,0x65a8e1aa),LL(0x0c1db536,0x008399fa), LL(0xfb194a74,0x80b20e97),LL(0x43be90dc,0x2316fb9b),LL(0x0da4d913,0xb2773b23),LL(0xce973d27,0x945d0671),
+ LL(0xb79f82af,0x64ca871c),LL(0x2dab52f6,0x31304b02),LL(0x928239a7,0x1825ab54),LL(0x8e4ad736,0x740413b2), LL(0x44071d19,0xc5c5d3fa),LL(0x3f0b2da8,0x83e438f1),LL(0xc70a1981,0xfd759448),LL(0x565ebae3,0x13e0c7ee),
+ LL(0x26bd7c0a,0x31b74b0a),LL(0xd280cb56,0x66e0e8e8),LL(0x3d1c83d2,0x086795e6),LL(0x396ecf25,0x59e678da), LL(0xf015a36e,0xab3c8d74),LL(0xadc03171,0x0d19aed3),LL(0x5a263686,0xc83b787f),LL(0x9057ed63,0x46b94ad0),
+ LL(0x90979da2,0xfbf783a7),LL(0xa335c784,0xf04dd6a0),LL(0x87d93c4c,0x6e3c2554),LL(0x47994eb3,0xe3e6b289), LL(0x1b74ba16,0x473c0684),LL(0xabe84e1c,0x4e959eb4),LL(0x7c4a67b7,0xdc3bfd51),LL(0x5095bd6e,0xb4e3cb85),
+ LL(0x3229fb05,0x96fc11f0),LL(0x4b36c83a,0x598227e4),LL(0xd46fca66,0xdc69ad06),LL(0x703ad6be,0x14cc98e5), LL(0x6b22cd50,0xf0fdd142),LL(0xf89c1a5d,0x9b821fe2),LL(0x829f9a74,0xa3762dca),LL(0xf0c320cc,0xf65a584a),
+ LL(0x5568f242,0x58f4eaba),LL(0x029afc1f,0x83b0c37b),LL(0x994d7dfc,0x93de2d27),LL(0xb1679532,0x0d9a6edb), LL(0x95f085b0,0x3b834279),LL(0xa299355f,0x46ebac98),LL(0x044427f8,0x0212e489),LL(0xa2f37d0e,0xf9e4ce34),
+ LL(0xfdc9e233,0x0fa328d6),LL(0x51ae732f,0xd5c8afab),LL(0x83c00cee,0x85e59553),LL(0x87505db4,0x9fce31f9), LL(0x7069d066,0x33ea5eb6),LL(0xf01c0ce9,0x10e32a39),LL(0x0c4f1a2e,0xf170233c),LL(0xbd4cb366,0x8a907760),
+ LL(0x79bf05e3,0xda593421),LL(0xce49a5bd,0x7730907a),LL(0x09be5c7b,0x0dfb8a97),LL(0x23eb936e,0x6f50c692), LL(0xcb18ff1a,0xc6160551),LL(0x661cc384,0xfa1d23fd),LL(0x7ddec262,0xfef12307),LL(0xb15af580,0xd1aca960),
+ LL(0x2ee50fbd,0x7eab8a59),LL(0xbe1e7a42,0xe7f71845),LL(0x6121e573,0x5f46a511),LL(0x38ff7eba,0xa25dacbf), LL(0xf58f047c,0xe8aefcc7),LL(0xb538aace,0xc343aaa7),LL(0x3c340b1f,0x3e58cdda),LL(0x1fb98ccb,0xb0e9867c),
+ LL(0xef7750f0,0x034dd314),LL(0x22da84d7,0x2ceaa705),LL(0xfc0d647b,0x4561a254),LL(0xbbe01157,0x81cf0915), LL(0x34b798eb,0x547a3d4e),LL(0x8b1c7544,0xbb5dd625),LL(0xc8194168,0x94fee01b),LL(0xfaeb010b,0xdb4c25ff),
+ LL(0xe4d4a176,0x1ff217fa),LL(0xaf87f4f5,0x8b46e6c2),LL(0x89734273,0xcf658775),LL(0x52746de9,0x73c4390d), LL(0xb01c7a06,0xb5c84899),LL(0xedd9ef63,0xfa5ffe4d),LL(0xa1a8b2d4,0x28a313c5),LL(0xdaf5a33f,0xadd45f47),
+ LL(0x1fdb8694,0xc2dc9d13),LL(0x9a90b4d1,0xaa5e026c),LL(0x208cbfa5,0x5edffd39),LL(0x72a4d6cc,0xf095b3fb), LL(0x6645fcc1,0xbfca4e10),LL(0x92408c6a,0x14b872ac),LL(0xd0b82d2d,0x3d9261e1),LL(0x0294e75b,0x13e4ecb6),
+ LL(0x3ac2ab9d,0xabd4541c),LL(0x4d5d1531,0x025355b2),LL(0xfb726ab8,0x3d85f67c),LL(0x6d6fc6bc,0x56e26c82), LL(0x495e05a0,0xb24608bb),LL(0xe5afdc5d,0x840e0978),LL(0x248727e2,0x2cc543b5),LL(0x3bc8c021,0xe48146da),
+ LL(0x530c98b7,0xa1b36baf),LL(0x5acf023b,0x04503d7b),LL(0x21de1503,0x96bc4449),LL(0xd2a9c89f,0xbb8a122f), LL(0xd5d4b133,0x66df99df),LL(0xc97d3e52,0x1bb4a13b),LL(0x79b318d6,0xdab370f3),LL(0x9f18552e,0xfa6c823e),
+ LL(0x6388a194,0xe5b27e78),LL(0xc88ba441,0x13270523),LL(0x4fecfef5,0x9f309fbf),LL(0x10afee60,0x72cd374b), LL(0x93dfe3af,0x16bd0e2e),LL(0x24bc7e8e,0x7e92096a),LL(0xfec7f0bb,0x144fdf82),LL(0xe1f765f7,0x5d1d4598),
+ LL(0x72c67697,0xb6b91efc),LL(0xb2487905,0xc7a2ceaf),LL(0x7fb24d99,0x4a4c9e63),LL(0x4d742089,0x7ed373ac), LL(0x9149ac54,0x3f9e6ae1),LL(0x0611efc8,0x64fd7fef),LL(0x3d779af6,0x1c38da32),LL(0x0a1681f5,0x6893691b),
+ LL(0x50a0fa72,0xbac29978),LL(0xba55c665,0x98d5c82e),LL(0x2d4b76bc,0xf3e5b58e),LL(0x90615b32,0xfae27d9a), LL(0xd49b2500,0xb93bc327),LL(0xbbc213cd,0x7d9d4bff),LL(0xd1ee81c4,0xf985fe72),LL(0x381f9e48,0x6e2a94d1),
+ LL(0x14fb9624,0x1f09b225),LL(0xca4229d7,0x2eba4ff8),LL(0x21dc8c19,0x5b159dd1),LL(0xb1aa553e,0x1e1f968f), LL(0xc7674d52,0x6ea25976),LL(0x7b283501,0x98e73adc),LL(0xd39468c2,0x7cfce0e1),LL(0x08438a62,0x7aad0af9),
+ LL(0xb2a3dde2,0x2291cdd0),LL(0xf77a0aa4,0x3a625d50),LL(0x5fbc5a0a,0x3be0fba2),LL(0xe794bf46,0x67b7598a), LL(0x531ad772,0x3673d805),LL(0x03e8479f,0xf9a9b392),LL(0x2e16a126,0x142d264c),LL(0x5a2f6f2c,0xc20409ac),
+ LL(0xcd43f273,0xd9d84438),LL(0xbda7be72,0xfecc561d),LL(0x241b7ec2,0xc4b113c6),LL(0x40dba9e3,0xfc5bc32b), LL(0xd56bca47,0x70853d39),LL(0xa5306217,0x2b9a902d),LL(0x2017bfd0,0x2bb1836d),LL(0xcd1c2768,0x829ce116),
+ LL(0x697097f5,0x42d5fcf8),LL(0x1e936db5,0xc1fe7be6),LL(0xcb6a81d4,0xcbc5cdcc),LL(0xafef5ffa,0xab1e4ecb), LL(0xb933c216,0x3cbbdf76),LL(0x503607e2,0xdb5808da),LL(0x6bc96246,0x5bdaab7c),LL(0x68274629,0x91e5d17c),
+ LL(0x2eb1db21,0xa3cd09f6),LL(0x92c3e3e1,0xbe370485),LL(0x6aa43da5,0xeb51fa29),LL(0xd726625e,0x2c7fa809), LL(0xf0ec0e99,0x90c6786f),LL(0x08135cbf,0xd315af33),LL(0x1504751b,0xc1b60172),LL(0x0e28781a,0x88674e2d),
+ LL(0xed74e633,0x6aa74055),LL(0x7d06ce02,0xc44e740f),LL(0xa33b8d5e,0x8b40bc5e),LL(0x20f00f14,0x42d3539f), LL(0x3307ef15,0xd9f1f5cd),LL(0xc8599bcc,0xa9fe4dfb),LL(0xefa80b8d,0x31cb6703),LL(0x53bb73fe,0x4172b46d),
+ LL(0x20e4c321,0x85a70280),LL(0x5ac075f3,0x999a0d07),LL(0x7bdb478c,0x59a62b62),LL(0x573c403b,0x9aeb710a), LL(0x950bb8fc,0x1c099614),LL(0x5dc09741,0xc1efafab),LL(0x7296a74b,0x0de58ca5),LL(0xf5be2ec4,0x657116a4),
+ LL(0xcb199b77,0x0ce52f0f),LL(0xbcd11438,0xdcdc5cb9),LL(0x4777327b,0x587a68ff),LL(0x1cc6fbb3,0x55d9abb7), LL(0x9eeb28a9,0xf1970b82),LL(0x4ceef00f,0xe1ab4e14),LL(0xf7462893,0x184d3fb6),LL(0xc8ea54fd,0x9942a008),
+ LL(0x1e33b2a3,0x1fee0f77),LL(0x9f789870,0xd4bed81f),LL(0x6ef05b7e,0x6396feea),LL(0x2640b62a,0x9c5d6a01), LL(0x6834bea4,0x170cfec9),LL(0xe131feca,0x68d16728),LL(0x00affb4d,0x4be9c5d6),LL(0x99a6f256,0xe34a423c),
+ LL(0x09b9ed61,0x1a254e4a),LL(0x30b10207,0x902bc066),LL(0x62121f53,0xd2d5ed01),LL(0x30f1b518,0x0ba86811), LL(0xabe139c9,0x7916c132),LL(0x62c4f337,0xb3a30fe0),LL(0xaa5693be,0x85d0a769),LL(0xe3c7687b,0x2d414379),
+ LL(0x94958719,0x92b0cb3c),LL(0x4ec6575d,0xb78aa37b),LL(0x4f1bf26a,0xd035aae1),LL(0xd31d5108,0x1383992d), LL(0x92bdd6f5,0x53ecc535),LL(0x08c622ca,0xa9925ff6),LL(0x916d890c,0xcaa3146e),LL(0xb9c10220,0x8cd0f12e),
+ LL(0x7e12a730,0xcb6ad82b),LL(0xac9485db,0x3f89047c),LL(0xfea2d970,0x6f926117),LL(0x46a19ecb,0x87b0cd9d), LL(0x01e45bf6,0x98bb5b02),LL(0x2ed7716d,0xfc814620),LL(0x4f5caa95,0x8d6808cf),LL(0x082f799e,0x3b57df03),
+ LL(0x2df84ca2,0x469e1854),LL(0x64aac069,0x00dd62eb),LL(0x88d9efff,0x7d3ee9ce),LL(0xbb830ffc,0x9faed6a2), LL(0xd2d74f58,0xd073aac1),LL(0x2d44199e,0xf69e96b4),LL(0x83ed62ca,0x6cb3a3b1),LL(0xd799acf8,0x472489fd),
+ LL(0xb63a36cc,0x5f84382d),LL(0x92d5b175,0x6ba1de87),LL(0x516101b7,0x25aab130),LL(0x5f039793,0x6f69c3fc), LL(0x89e3da4f,0xd28439ee),LL(0x5e6b2b61,0x8cb40a0e),LL(0xe3d6650d,0xdfa55805),LL(0x0be59fd2,0x2651f6c7),
+ LL(0x140d01c8,0x290e0044),LL(0x62ea488f,0x78afa0a4),LL(0x91eaa932,0xc4e39971),LL(0xfe2e79dc,0x8a9ef3a2), LL(0x50705b7e,0xdcfae315),LL(0xd4be3d75,0x73324dca),LL(0x03a91415,0x900bdd43),LL(0xedfdc74d,0xc3ed02ed),
+ LL(0xf22b4a66,0x509bd1d6),LL(0xb78d264b,0xfd8ed371),LL(0xa419134f,0x562b2d3a),LL(0x7a57a51e,0x80a2c274), LL(0x8c662472,0xebba5317),LL(0xa0be71fb,0xebafedf2),LL(0xb77899c8,0x0c5b9c1c),LL(0xc4888cb5,0x82448008),
+ LL(0x78401c3b,0xb795ea00),LL(0xa85ab971,0x86776990),LL(0x185739da,0xdd81393b),LL(0x58136c97,0x76d0031f), LL(0x641d39d1,0x6aceaa56),LL(0x39be7ca8,0x918844c7),LL(0xe18efc54,0xa63993f7),LL(0x4af0f30a,0xb5369150),
+ LL(0x3d04af4f,0x9bc2068c),LL(0xa7796ed2,0xf309dff9),LL(0x4e15b6a2,0x46e9a59d),LL(0xc22ef488,0x617aaeba), LL(0xa15cf0cb,0xd91a8f90),LL(0xc30fb779,0xc6ce12a4),LL(0xb9d0a7ff,0xf3b80254),LL(0x6e9b6fa1,0x32a63bf9),
+ LL(0x546fe4a8,0x3e1ac837),LL(0x1279c7ef,0x91ed89a5),LL(0xc73e9dea,0x8eb7b88e),LL(0x18238af0,0x96d07205), LL(0xe96abf80,0x56ebf306),LL(0x52c4b10f,0x5088ce24),LL(0xc979137f,0x65293176),LL(0x228d300a,0x824642fb),
+ LL(0x7836aea5,0x968963a8),LL(0xfabbfac1,0x2d4c556c),LL(0xd3f9977a,0xa4c389bb),LL(0x99b4ccb6,0x2e8b2818), LL(0x6cb67df6,0xc1fd8565),LL(0xa72d2be8,0x0ac57d2a),LL(0xb8224ead,0xa51ce6b8),LL(0xf417d744,0x33f7b468),
+ LL(0xf9f0bdf4,0xcf8c80af),LL(0xd3222dd6,0x0728f880),LL(0x653afc12,0x436188a3),LL(0x3c7940bb,0x0f8bf160), LL(0x424dcd2a,0xdc18c13f),LL(0x20d3cd1f,0x038c1842),LL(0x7b12fd42,0xed7f86a5),LL(0x7aaf1881,0xa75ab77b),
+ LL(0xdf0574e2,0x5c3d7612),LL(0x719414ce,0x2eeeeb6f),LL(0x90349fc4,0x797c5771),LL(0x2232eb33,0x0d850f73), LL(0x2638c051,0x0a0744f3),LL(0xb6e7dbfa,0x739e6278),LL(0x659fc5f5,0xa77f286d),LL(0x9654b0eb,0xb18b7cf1),
+ LL(0x6062e78e,0x5a2089ac),LL(0xdfa6fb44,0x152f1804),LL(0xb61e6faa,0xe8a404b4),LL(0x08d06ea8,0x4774d30f), LL(0x3c359648,0xd7119b91),LL(0x09473ff7,0x850b02bd),LL(0x936b7868,0x4db6f9a0),LL(0xae38c3c5,0x84064dd5),
+ LL(0xfe448461,0x294d6831),LL(0x42cd2105,0xc3c6f446),LL(0x3a2fdcae,0xa4412eb0),LL(0x3d5a9181,0x394c3774), LL(0x5ca87c4b,0x58f19024),LL(0x89ad5685,0xba1879db),LL(0x803c2589,0x43c55c6a),LL(0xa8249c65,0xae1fad20),
+ LL(0xe0aff809,0x4929e89f),LL(0x1769a00a,0x19755ec2),LL(0xc242f335,0x3b6a207b),LL(0x090edab0,0xeca054ef), LL(0xcd9e1c26,0x217e9c8b),LL(0x35d4ac57,0x917c2ecd),LL(0xad33911d,0xdc869d5d),LL(0x2e828bd7,0x22d9d860),
+ LL(0xf38dfaa1,0x89262252),LL(0xeb9cd8d7,0x155c96ce),LL(0xed5ebcc4,0xb0082b5d),LL(0x17182086,0x7b6f9203), LL(0xee92aa6d,0xaefe28aa),LL(0x9aaaa0eb,0xbe67090c),LL(0x2f8ef18d,0x88c5fbf1),LL(0xdd1fd65f,0xbdc8bef1),
+ LL(0xa9c7b483,0xfb7052f5),LL(0xbd6c8a99,0x49634258),LL(0xc9f424f8,0x1410a747),LL(0xe9805723,0xfda0a304), LL(0x0879bd30,0x1a438bd3),LL(0x7f6903cb,0xed09a9d3),LL(0x57e53497,0x920878f8),LL(0xa7fca0ed,0x87a12968),
+ LL(0x38590ca1,0x7c8207cb),LL(0xfae885c2,0x4cf52db1),LL(0xe8dc711f,0x6cf384c4),LL(0x221dc698,0x6fea20ff), LL(0xa07bb79f,0x6af56700),LL(0x33ca79c6,0xc7da3b52),LL(0xd05eb519,0x3a214691),LL(0x93d4f089,0xea94c4f1),
+ LL(0xba51f002,0x734039d0),LL(0xce206406,0xc45e2042),LL(0x4b3c3d53,0xc0e75dbb),LL(0x55b1b97c,0x3a701272), LL(0xd6addb6c,0xec856e95),LL(0xf283aae1,0xb63fe8c6),LL(0x405788d1,0x148fb239),LL(0xe0181912,0x42e7148b),
+ LL(0x7de07978,0x00bddcdd),LL(0x3c2e0a27,0xac79b657),LL(0xdf1dd3dd,0x94024ba6),LL(0x0bac41ad,0xcddeb357), LL(0x500c4f4b,0x51ec3dd7),LL(0xd31c8fbe,0xf00d594f),LL(0x373a3e93,0x6b8c6f43),LL(0xfc2b6be9,0x891ba3a5),
+ LL(0xddd72e36,0x3928225a),LL(0xcee362c1,0x1e6a63bf),LL(0xc5eb404c,0x317b78f4),LL(0x67c5e6b3,0xb882736b), LL(0x1f2f07aa,0xb1da56ce),LL(0xff83b633,0xab3c4fbe),LL(0x0ceeab99,0x9cc32f1c),LL(0x1062070e,0xf1dead0d),
+ LL(0x8a3e79c4,0x49ea0d9b),LL(0xec9f16d1,0x4e7abe3f),LL(0x5549ade0,0x19bda1c6),LL(0xe5885734,0xaae756a5), LL(0xcc2a1aaf,0xb3cff8ce),LL(0xf896ca47,0x812eebff),LL(0x9b2e1123,0x0951b2bb),LL(0xdef6d6a9,0x7f245699),
+ LL(0x1be7ef41,0xa1331e95),LL(0x9fa1be62,0xd1f0c3c3),LL(0x4383e451,0xb1d8295e),LL(0x9f08bc14,0x658d8a84), LL(0x3ba4b85b,0xb0587aef),LL(0x481cbb27,0xb519c587),LL(0x040d8f06,0x2b975db6),LL(0x1691d809,0x399f6417),
+ LL(0x7c6204fb,0x207a0e46),LL(0x62c3e9d7,0xe30f1420),LL(0x792f8208,0x6127b782),LL(0xb0d3fca9,0x38f806ab), LL(0x2ff46c64,0x38248542),LL(0x926ec166,0xc18ffe85),LL(0xc0c133fa,0xfd268866),LL(0xb93770e6,0xb7f63f5a),
+ LL(0xb13afb71,0xd8f1db26),LL(0x32a790de,0x5c5627eb),LL(0xdf50b6f8,0x7f41bc1d),LL(0x92d4c803,0x49d4ef17), LL(0xe8530065,0x577f909f),LL(0xe630ff2d,0x482cdede),LL(0x14f54de8,0x682c8c6a),LL(0xb4079343,0xe6b5a504),
+ LL(0xe58bde6b,0x00d927fc),LL(0xf34841f4,0x65d85f03),LL(0x2ac001d8,0x265aec02),LL(0x2dfe518d,0x1b785666), LL(0xc01e6e47,0x76142488),LL(0xdd5648dc,0x8e8b2044),LL(0xb3a340b3,0x2c422006),LL(0x3dd67b22,0xa5392113),
+ LL(0xa1567aaa,0xbd08d05b),LL(0x02acbec6,0x84a55e43),LL(0x5d898af0,0x744ffd21),LL(0x6682e78a,0x38067622), LL(0xffd08522,0xf3696ff2),LL(0x2bf02466,0x49dd0060),LL(0x59c3e65d,0xc9e0d1a5),LL(0x0a37fc25,0x29537f56),
+ LL(0xa5f6b17a,0x6f6cb9eb),LL(0x9c55857e,0xc1854320),LL(0x45dacc6e,0x959585c6),LL(0xe5f4e930,0xf4e97c94), LL(0x57d2a492,0x966deb5f),LL(0x55d2df12,0x98256831),LL(0xaa457eca,0xfdd65534),LL(0x03551474,0x76dbb021),
+ LL(0x09d9b4aa,0x0aeefee9),LL(0x784ca675,0x30fea11a),LL(0xff1d381a,0x56b4b509),LL(0x9fce40da,0xd1b26fea), LL(0x48d22911,0x4835b911),LL(0x8bbe57e8,0x6aaac57a),LL(0x19d02037,0xc8882792),LL(0x3ee49afa,0x301e0aa6),
+ LL(0x00e6b020,0x1641ce6b),LL(0xeac7cad8,0x846b97de),LL(0x61aa6886,0x9b74bfd8),LL(0xb0fa37ac,0xdd95e765), LL(0xf848a83b,0xda0cde52),LL(0x355b3528,0xd2cc831d),LL(0x5e22238f,0xc7fd2e03),LL(0xab9a6c34,0x6d5373fa),
+ LL(0xd8247f13,0x5dfc2874),LL(0xe3c11f56,0xc211a7a1),LL(0xa2503b97,0x7512563f),LL(0x5c007c82,0x124cd984), LL(0x491cd249,0x4f6eb682),LL(0xa683359d,0xaf4f70a3),LL(0xcc302b62,0x2f1dfe71),LL(0xe57fbf56,0x83c474bb),
+},
+/* digit=27 base_pwr=2^189 */
+{
+ LL(0x916a8016,0x43af7ab7),LL(0x532bfb9c,0xf93d487f),LL(0xe2174971,0xa5f9af3c),LL(0x2d59b4d4,0xd1b9cf1f), LL(0x44f4eb91,0x4a779418),LL(0xc226edc5,0x6a131fac),LL(0x80d4bb33,0x472ab897),LL(0x2f6ca1fe,0xb69687a5),
+ LL(0xfabd066a,0xffa73ca2),LL(0xf9c78bfd,0x494e03a8),LL(0xff55cfef,0xe585a878),LL(0xd7053784,0x00770b1f), LL(0x056fe70b,0xdec4da4a),LL(0x57bd444f,0xe37395d8),LL(0x685df668,0x666250d4),LL(0xbe6cc583,0x0549569e),
+ LL(0xab11639e,0x87629830),LL(0xa4488d53,0x869dd3ba),LL(0xbaf06eb6,0x10fe1c0b),LL(0x1687ac37,0x99034839), LL(0x7f1ffe7b,0x38418377),LL(0x25bd7c57,0x3334a74c),LL(0x7008ba67,0xc57cb7ed),LL(0xc1e4e12d,0x384c12d0),
+ LL(0xdb4bdb35,0xf48cdca6),LL(0x74d913a7,0x6bc23aec),LL(0x12ed94d5,0x8f0ccd9d),LL(0x86db09e7,0xe4aabd12), LL(0x1e948326,0x0cbff31a),LL(0x17a479a2,0xcf68c47c),LL(0xca7686f1,0x3cced8e2),LL(0x4eb62669,0x15ed1e99),
+ LL(0xbdb0c561,0xc373ab4b),LL(0x6a9066a7,0x15082022),LL(0x62d31801,0x330a60c3),LL(0xe35bea57,0x53d97f09), LL(0x9c5dbb92,0xf204e006),LL(0xf831262a,0xfb9a8219),LL(0x42136174,0x3468ae41),LL(0x0e03218e,0x0f8fb5bc),
+ LL(0x4ad8bba6,0x90337499),LL(0xe3ecb618,0xdb71e1fb),LL(0x3cf2a8ad,0x6955e874),LL(0xed691fee,0x594501f5), LL(0xd29bd364,0x7e2baef3),LL(0x6f766759,0x5cbd91ac),LL(0xb2201a96,0xaba54aaa),LL(0xcfa392ab,0x2cfea457),
+ LL(0x86f8f7da,0xa4da4162),LL(0xcbc0b934,0x88d70b86),LL(0xacff4f7b,0x9df02795),LL(0xc65ef81b,0x0fc80219), LL(0xa299ca0f,0x32d457de),LL(0x0896427b,0x97081b35),LL(0x41bab6b4,0x92d6c309),LL(0x73b8d601,0x5d5e56f3),
+ LL(0x202bde39,0xfb3992a4),LL(0x3d6bab98,0x2549f564),LL(0x87712512,0x0b564642),LL(0x7fde7e50,0xd52442b4), LL(0xa3d3e16e,0xa6cefd08),LL(0xc83b29bd,0x5b194f0a),LL(0x906dec8c,0x6db0edd8),LL(0x02570c1e,0x7a090959),
+ LL(0x4c41eb53,0xf6f74fcc),LL(0x5b944a6c,0xd07678a9),LL(0xb80677ea,0xf53bf11d),LL(0xbc5900f8,0x569a5761), LL(0xd3d4de91,0x34e5bba8),LL(0x8361f73e,0xc5774804),LL(0x59abdbd5,0xd637d3dd),LL(0x8772b615,0x64a81bf9),
+ LL(0x7f3d83ab,0x78bb12ea),LL(0x573f9b99,0xca22c31c),LL(0x2aed4c39,0x4283c173),LL(0x39f32bdb,0xda054c1d), LL(0x1da2cbd7,0x2ead717e),LL(0x62390b41,0x747d67cd),LL(0x6b9666a6,0x43739d9c),LL(0x8c827b12,0xb84e2f22),
+ LL(0xc0312773,0x0e4ac2b1),LL(0xe53f068e,0x571cfc75),LL(0x42bfe41e,0x6c44df85),LL(0x627e30bb,0xe7d2edb9), LL(0x0dd5cedc,0x9c2e4fd6),LL(0x0f7d22d7,0xe2d885ef),LL(0x1329bcfd,0x44b0b5db),LL(0xba1c96f6,0x006e872f),
+ LL(0x7e952317,0xdbadab5d),LL(0xc2a5bcaa,0xab849ed4),LL(0x1e72dbb1,0xe3acbb74),LL(0x5d4b7cb7,0xbf42c3d3), LL(0x3d748639,0xebe967b5),LL(0xc03af7a1,0x1fe93db5),LL(0xa944ea06,0x2ab14596),LL(0x76655c09,0xfb05a759),
+ LL(0x6f8a532b,0x5117890c),LL(0x59430c5b,0x2f57781f),LL(0x79e07b84,0xe70968b3),LL(0xe86d7223,0x05df2305), LL(0x31e32933,0x57af0dc5),LL(0x84afc419,0x5473e34a),LL(0x03d5feb4,0xa7337a42),LL(0x1b1c6bd8,0xd85c8602),
+ LL(0x753008e6,0x25ca1891),LL(0x5f0ff93a,0x4338ec98),LL(0xddd30a7c,0xd2ba8557),LL(0x09c51794,0xb4b65361), LL(0xd1cbc66e,0xfbb51399),LL(0xe53bca50,0x28853781),LL(0xfd5a9aaa,0x5b797232),LL(0x5b88c4f3,0x6249afd7),
+ LL(0xba6918a0,0xcc5ab6cb),LL(0x8fb65c7d,0x9f824ec1),LL(0x56b18754,0x4796d80b),LL(0x67721520,0x4c83d371), LL(0x63b03348,0xd77c373c),LL(0x54f27457,0x91930e5e),LL(0xaf40c03f,0x83f97370),LL(0x34eea661,0x65b55872),
+ LL(0xeb10175e,0x310695d0),LL(0xcd236aa1,0x79aaa6ea),LL(0x3edfff40,0xf78539ff),LL(0x02cd6063,0x2369c517), LL(0x5c8631ff,0x81e43ae5),LL(0x216a60bd,0x065e8212),LL(0xe761a5f9,0x225cb473),LL(0xab6de6fa,0x695ef860),
+ LL(0x7d7d98d4,0x03536a46),LL(0x18413673,0xa17d3a69),LL(0x295ae303,0xa6ddcd46),LL(0x61beae2b,0x86de0bbd), LL(0x7699458e,0xdd73dfcc),LL(0xb53f88dd,0x827deba5),LL(0x42a9a11c,0x213c376b),LL(0x12c73975,0xc854fd72),
+ LL(0x15ac27ff,0x1fa96547),LL(0xf49b6c9a,0xcb0dc17b),LL(0x709dd202,0xa3e44853),LL(0xcfe2bbea,0xd3905c5f), LL(0x6c35ce9c,0xb01e5799),LL(0x900ef600,0x0063e7ac),LL(0xfffa5cc0,0x8c70b87e),LL(0x74230b0c,0xebd76d34),
+ LL(0xed5f8529,0x914eec9e),LL(0xe8edf477,0x7a65ffd3),LL(0x70c74bee,0xf0cb206d),LL(0xd1b02e01,0x03445ff1), LL(0xe5dbf791,0x664ca356),LL(0x254e69c4,0xd678d4ae),LL(0x8617386b,0x370c9f0f),LL(0xfdcd985d,0x42af7a0c),
+ LL(0x83c3da54,0x8c4b5009),LL(0x4c8a87c8,0x086a7ec5),LL(0xaa166c4c,0x9ba0b368),LL(0xa658ac1c,0xa279670f), LL(0x5d0544da,0xc49f49bd),LL(0x15cb0b41,0x28c22323),LL(0xa4834d71,0x86293dfa),LL(0xd1e1d63b,0x283e191d),
+ LL(0xca188555,0x0cad6519),LL(0x0cbd0c5c,0x323ce5da),LL(0x38560254,0x6b7d2be1),LL(0x1696b9b9,0xb05ed385), LL(0x9ae59f92,0x8ce4b5a7),LL(0x4f7e61a3,0xabe5ff33),LL(0xdbfeb302,0xae15a3cc),LL(0x837fde82,0x691b1129),
+ LL(0x2e6d116b,0xb60b31f3),LL(0xecab5aa9,0xd49e9d11),LL(0x6787f23d,0x3e95f844),LL(0xa12f4846,0x2ab8834f), LL(0x5b6359cc,0xe70e2ab1),LL(0x9322a047,0x7a6349e9),LL(0x6c1e483a,0xc01e424c),LL(0x92bd5d1b,0x424b2027),
+ LL(0x254e49a3,0x8a6e6766),LL(0x97e70d58,0xb8d85d42),LL(0xb51b3abc,0xa859082f),LL(0xe7bb828a,0x2850573b), LL(0x7bfe8021,0x47cc95b2),LL(0x5853f12c,0x7c28fe9e),LL(0x10c0f389,0xe5fb0558),LL(0xdaf0a7e7,0xb99a639f),
+ LL(0xf60ee3e5,0xa6b9e6c9),LL(0xa236377f,0xb397af7f),LL(0x7da4af71,0xb7a318ac),LL(0x0a9d39fb,0xae64b613), LL(0x902b3411,0x66ce6c74),LL(0x5a199e53,0xea256a70),LL(0x550fb76f,0x8dcddd89),LL(0x03e70f9c,0x9443b477),
+ LL(0x142113a6,0x1787b8a5),LL(0x180aec95,0xa58b6c61),LL(0x947ff26d,0xcc381420),LL(0x3d8b8c36,0x22520e8f), LL(0xef2cc6ef,0x192ee945),LL(0xe9ca0c7a,0xea52afee),LL(0xe6e30d93,0x5970d794),LL(0x57c786ac,0x0a325e42),
+ LL(0x33ca1226,0x5e2dddf8),LL(0x588cb1e3,0x18e624b9),LL(0x21809265,0xf3ba597a),LL(0x5d575728,0x90247702), LL(0xc1f918db,0x48a5bf7b),LL(0xd6840541,0x17d1efaf),LL(0x3e2e754d,0x13dfe6fe),LL(0x707a531f,0xc471e16a),
+ LL(0x97d34b48,0x79085bbd),LL(0xc2e9bea9,0xfa5ba99d),LL(0x6c5a6dc2,0x70b9c9fc),LL(0x4e94c5db,0x4e042213), LL(0x25ebb95f,0x4a37b41f),LL(0x055d79fb,0x24691010),LL(0x3f572a8f,0xdaff9352),LL(0xf327ec2a,0xe63d55b0),
+ LL(0xdebd5116,0xc5a86d3c),LL(0xa2ddef2a,0xd547fe08),LL(0x6a149f12,0xbabb617f),LL(0x8a766128,0x14f69a1b), LL(0x48236f77,0xb83a1477),LL(0x35711279,0xd0d81be1),LL(0x5eab1c3a,0x706f9067),LL(0x16a1ffaf,0x8c4823f1),
+ LL(0xaff5ea89,0xd845c68b),LL(0x6b75eadb,0xa276eaeb),LL(0xcc230ec1,0x2d0fc819),LL(0xedaaf1f2,0xdfad96e8), LL(0x40868254,0x0f25dcbf),LL(0x5babd7f9,0x53bbe31e),LL(0xcf804a8d,0x7f8afc48),LL(0x5f9b9a0d,0x7f4922ef),
+ LL(0xd7422804,0x703cbf6d),LL(0x83349bdd,0xe5df61f3),LL(0x77d285ad,0x0fa3d8cd),LL(0x2e88e15e,0xe990f9e5), LL(0x8561d8a6,0x40ec61f7),LL(0x16650305,0x7fc498a6),LL(0x8e5beabf,0xa3bf5cb4),LL(0x76ae0350,0xfaa52008),
+ LL(0xe4fc3e72,0x99e24318),LL(0x2079c616,0x9241c8ab),LL(0x9584a258,0xefa5bf38),LL(0x1eebb098,0xd7b770b5), LL(0xe1fc18a7,0x28b714a3),LL(0x5b83dd9a,0xf0426bd2),LL(0x291b28ee,0x956d8972),LL(0x6eb553ff,0x8bb8cbde),
+ LL(0x95298003,0x396cfe2d),LL(0xad8412fc,0xcaa66550),LL(0x83997dd3,0xf41d0215),LL(0x45534587,0x7066e356), LL(0x5b6de0d7,0x0d5b5c3e),LL(0xcecd5f26,0x8ead45d0),LL(0xd252ae50,0xe2f24e2c),LL(0x815150bf,0xf71e5d4f),
+ LL(0x54527ce5,0x3872685d),LL(0x91fd99ee,0x59b343ae),LL(0x3462cc0c,0xd621d027),LL(0x8dbfbcf4,0xfa42481f), LL(0xaf7ae918,0xda481a9e),LL(0x7c909a18,0xfd5fd37c),LL(0x805fb7b7,0xa5ebb7bf),LL(0x165200b1,0xeac65687),
+ LL(0x7cef9b97,0x56302866),LL(0xae3ddb64,0x8f662dd6),LL(0x60c1aa98,0x90cb4e87),LL(0x986fb3bc,0x33f9fc60), LL(0x974593cd,0x76f41ecc),LL(0x6e0f01e8,0xb19501f9),LL(0x25760dd5,0x587d9035),LL(0x9391032e,0xa31c971c),
+ LL(0x95c9a84f,0x7650e3b1),LL(0x78c66087,0xbb83ea93),LL(0xdfcf1365,0xda08a04c),LL(0xca0b84a4,0xd23daeba), LL(0x2ca3bd2b,0xf89d395d),LL(0x6e53fc93,0x779e2aaf),LL(0x34216082,0xc0fc7dc8),LL(0x42a66691,0x6cd8bdf6),
+ LL(0x0fe014cf,0x836a2cf3),LL(0x0c08373d,0xdde5fc22),LL(0xcb3b2b54,0xc4fa2387),LL(0xe2aa434a,0x96253732), LL(0x1d502ce8,0x4c4f5979),LL(0xb6df40c4,0xf046f5a9),LL(0xac6b75b5,0xc7d05765),LL(0xb69f3c34,0xae1cd887),
+ LL(0x49b86680,0xafed4be6),LL(0x14f70463,0x17b75fa5),LL(0x90b7c07f,0xb12e8051),LL(0x39a8e99d,0xe2c8cf2b), LL(0xd5fdb65b,0x984744c4),LL(0xa28942e4,0xd8b1c012),LL(0x46693fb2,0x295d0199),LL(0xa0a3b4fa,0x5ab3a305),
+ LL(0x26755b3f,0x3c191023),LL(0xb6c084de,0x75f35df1),LL(0x63e6286b,0x30640e66),LL(0xd2c6c059,0x3b3720ec), LL(0x6ea837be,0x2c821a0f),LL(0x84f23bd0,0x238c4d93),LL(0x390ea4f5,0xbdc40703),LL(0xae68a2db,0xcb207d0a),
+ LL(0xe25f098f,0x487d18bd),LL(0x9ab84e10,0x39018023),LL(0x8b7ab4a2,0xaa19aa62),LL(0x89f08fbd,0xcb9cdebe), LL(0x2ca57917,0x26a4c9eb),LL(0xda92ce1b,0xaadfd472),LL(0xdaa907db,0x32b592d8),LL(0x7d6f995e,0x9bbebacc),
+ LL(0xe1d88c25,0xa27a4735),LL(0x9bd66b67,0x339905e1),LL(0x62af9942,0xa9bfa0ed),LL(0x2e2cb83c,0xd94dd9e0), LL(0xab28e268,0x279d8fda),LL(0x51a97518,0xf28ab69b),LL(0x9691f33e,0xce9bd2ea),LL(0x74be3d64,0xb9e8b2fe),
+ LL(0xabefa07d,0x35072fab),LL(0x7b51ba8e,0x1c2ba05c),LL(0xd32d6bf5,0x3bb1ec56),LL(0x5d7bd7dc,0x326bdfdc), LL(0xd95bdcb1,0x33f4f4f6),LL(0x453ef338,0x781bfd34),LL(0x1ef61a66,0x4d210cad),LL(0x2799bcc7,0x6ae7bb14),
+ LL(0x194f4d6a,0xb105e5ec),LL(0x52b77f08,0x204a5480),LL(0xa328ab98,0x13f4e022),LL(0xb7f9a240,0xa56863c4), LL(0xce4cf7bd,0x2780c9a7),LL(0xc497fdf3,0xf98e3f58),LL(0xf52738fc,0x635b8bc6),LL(0x58937500,0xc5fd89b8),
+ LL(0x75e98a64,0x57070428),LL(0x946f094b,0x66aabaae),LL(0x06d37944,0x7d2376e8),LL(0x09319f13,0x9b316827), LL(0xa77eb79b,0xbbde59a8),LL(0xf451fde0,0xb7f35bbb),LL(0x64aa79fd,0xb2f7914e),LL(0x9f68a486,0x4d2944b3),
+ LL(0xc1a7e537,0xbd8a92de),LL(0x4fc930a3,0x76695e9a),LL(0xbcb4153b,0x1b75f9eb),LL(0xf6485404,0xf5a34d2d), LL(0x26853a8e,0xe09ee965),LL(0x9dbb319a,0x63de8595),LL(0xda079d6d,0xbbbc1b07),LL(0xdfa71b9d,0x5956bb3d),
+ LL(0x209cbcc3,0x69709306),LL(0xe3360429,0xbe2a08d0),LL(0x92a58752,0xd377a9fe),LL(0x997bc322,0x37e175ea), LL(0x042ff2e4,0xfe355d4d),LL(0x4c4babd3,0x4332ef31),LL(0x2314b1af,0x634429c2),LL(0x91a7d5e5,0xae6e8275),
+ LL(0x250a1476,0x134a39c7),LL(0x08994f0c,0xec9bb642),LL(0xd38704cd,0x2a9e0ac0),LL(0x536a4ad0,0x16490507), LL(0x7c8dbfeb,0xc7f747d2),LL(0xc0bb24ac,0x91e67dd2),LL(0x959eca45,0x2dfc6c8a),LL(0xc54fefe8,0x78bafaf0),
+ LL(0x5da056f3,0xf3eb2d1b),LL(0x3b89c967,0xda14b631),LL(0xcb51f621,0x80923b1c),LL(0x6609791c,0xc3d5fd1f), LL(0x817b1063,0x68ad7bef),LL(0xa1f0b00c,0x3775b686),LL(0x6c7f0dc1,0xb207c9a5),LL(0xa9b91fff,0xb7c30a7d),
+ LL(0x8b9f8e8c,0x9274c090),LL(0x24e94ce1,0xa3757610),LL(0x4f0f3ec1,0x8f2b1f2c),LL(0x3938d26f,0x02e53bb2), LL(0x701e5ae8,0x90a3da2c),LL(0xa271dcca,0x60c2eaca),LL(0x31fb2372,0xc9c08e39),LL(0xb838908a,0xcaa3245e),
+ LL(0xa6a6a275,0x2e168b0b),LL(0x0030ef6b,0x986a30a3),LL(0x170ab683,0x79f768f9),LL(0xff70981e,0x7296fd6f), LL(0x13a323cd,0xbab6fedf),LL(0x186e9813,0xa86ec0dd),LL(0xcd56e7d5,0xd9f8db04),LL(0xaa8b1c96,0x47b20676),
+ LL(0xf1fb3b03,0xdff4574e),LL(0x1051f9fc,0x41a1f765),LL(0x7f289a4e,0x35779aee),LL(0x11c96180,0x93bd54c9), LL(0x37b95c67,0x1485074a),LL(0x0865b2f0,0x0b01af95),LL(0x90ce0b41,0x43033ffe),LL(0x71504d6f,0xffd6e34c),
+ LL(0x1aa946c8,0xb380cd60),LL(0x806b2e19,0x7f7cc73b),LL(0x2db88e6d,0xc17df7d8),LL(0x072e5416,0x7b767ca2), LL(0x0ad6134b,0xbb42d3ed),LL(0x640df8af,0x5444339f),LL(0x5bc73112,0x7e7c7e7b),LL(0xf899dba4,0xe8f139b4),
+ LL(0x43a06bf3,0xd13b436d),LL(0x773e4863,0xe43f8567),LL(0x56b814d7,0x35555cd5),LL(0xd429ccc8,0x54af8e53), LL(0x82ae0477,0xc346718f),LL(0xbe02c7a8,0x301fb382),LL(0xd2a70595,0xcd65b3b2),LL(0x5aad01d6,0xcfcff499),
+ LL(0x589feca8,0xd0fcc076),LL(0x7c603ed8,0x7b2b93c7),LL(0x6ddfc3b8,0x2dda7a8c),LL(0x74723d99,0x678d66e9), LL(0x6db60b07,0x0f7e4215),LL(0xc0bfa2f9,0x40666848),LL(0x8e116caf,0x70b46b5c),LL(0xfba46d90,0xbd753511),
+ LL(0x019d8279,0xe48374cd),LL(0x309b0fc6,0x7d40e6e2),LL(0x9dec7a42,0x226435ee),LL(0x4243e7d0,0x818e79cb), LL(0x54658634,0x3d7376d7),LL(0x9f8727ac,0xa40cafeb),LL(0x81f556bc,0xdc1d09f0),LL(0x63223573,0x32ca7367),
+ LL(0x5810a27d,0x92e10f91),LL(0x1fdf969f,0x6fb34bad),LL(0x657a067e,0xe5c2b2ff),LL(0x382ba37a,0x173c0900), LL(0x86d87c1e,0xdd5113c8),LL(0xcaf77294,0x56a2ca9d),LL(0x666a9821,0x9f956881),LL(0xa3b18c0f,0xc4bcafc7),
+ LL(0x2b02578b,0xb100f338),LL(0x64b2c607,0x4716339e),LL(0x5b161179,0x92c923ae),LL(0x0df442a0,0xada2e4da), LL(0x47f85474,0x4d4b90c5),LL(0x824e3195,0xa378bf79),LL(0x2478a0d4,0x4469339d),LL(0x0c1e69e2,0x0972e788),
+ LL(0x72edc384,0x1aedd761),LL(0x9898d672,0xcabcd976),LL(0xba814ca2,0xd370aa7a),LL(0xe88eca9c,0x20fa58db), LL(0x45a7ab8d,0x1540ada9),LL(0xbdca94fc,0x8dcf9860),LL(0xaa9df4f4,0xf0187e2c),LL(0x54a49576,0x9a197dc3),
+ LL(0xb4a1f341,0xb54f5cb2),LL(0xfe32827b,0x1439caf0),LL(0xd36783f5,0x3c1a356d),LL(0xc56a6e47,0x284e2f15), LL(0x4dcfaddf,0xc6abad59),LL(0x082bb2b4,0xe82993f7),LL(0x23655955,0x3cb46972),LL(0x992551e3,0x8ab06385),
+ LL(0xdaa13ab3,0xcbd6cb99),LL(0x2dc1333d,0x01375bbd),LL(0x972c4440,0x638a7f20),LL(0x24dcb1cc,0x150665c6), LL(0x1ea989c6,0x4044e12f),LL(0x61012ea3,0x204c4eba),LL(0xac2719c1,0x78b8edaa),LL(0x2ab50d99,0x6772643d),
+ LL(0x606d63de,0x94604146),LL(0x693aadc8,0xa876d9b0),LL(0x667044ff,0xf7401ffb),LL(0xb599ecb4,0xab98d73e), LL(0xda5cbee3,0xe2b2048f),LL(0xa2b3da50,0x526e3aa1),LL(0xb4ad2073,0x4d0885e3),LL(0x644a1a19,0x916ce3d2),
+ LL(0x96930e8d,0x952b5747),LL(0xb0cf7f5f,0x2a489fd6),LL(0xa8b3b538,0xbff4b59b),LL(0x6aff1cbe,0xba0e03ff), LL(0xd56b2285,0xfa614adc),LL(0x50d58e62,0x2305edd4),LL(0xe36877e9,0xb349fdce),LL(0x43a6103b,0x5f808fc2),
+ LL(0x86493abe,0x66d8404b),LL(0x9b08ff7d,0x18c92d3d),LL(0x89754762,0x6a60ab6b),LL(0x8233dee7,0xec69fd4c), LL(0x06beadfa,0x32449242),LL(0xe0df7084,0x421caf1e),LL(0xd7969339,0x6f89693b),LL(0xfa30a7a9,0xb9a53713),
+ LL(0x11556d9a,0xf89d9bf5),LL(0xee8cf993,0xe4e9c5f0),LL(0x17ed9a7e,0xe5b2a323),LL(0x93e80c9e,0xd4db3920), LL(0x1fda3726,0xae857864),LL(0xa3e88485,0xe5cb36a3),LL(0xf495b9a8,0xa6b85205),LL(0x38f3b180,0xc1be0108),
+ LL(0x36a1f3a8,0x79d0585b),LL(0x913ba5f2,0xa3d8f17f),LL(0x225acf11,0x1eaee5d6),LL(0x0d32de79,0xd4dfd0a2), LL(0x6b3ceff3,0x0cec324b),LL(0xab447870,0x3acc6dec),LL(0xb9c759ac,0xabbf7e6d),LL(0xa5196938,0x0d5c1f47),
+},
+/* digit=28 base_pwr=2^196 */
+{
+ LL(0x45e7ea91,0x781a2157),LL(0xacadfc40,0x4da3f86d),LL(0x162cd393,0xc81d6c7d),LL(0xad6e60fc,0x2c38a2a1), LL(0xf753479d,0x575b25d6),LL(0xbdec6025,0xc914e08e),LL(0x492d5547,0xf81cea34),LL(0xfb1b6969,0x6bbb8bb1),
+ LL(0x1279504c,0x1ee8082c),LL(0x2c92ffb7,0xa466abb2),LL(0x3e81c7e2,0x4118b26a),LL(0xfc60e33a,0x1a76cc50), LL(0x5736d7ae,0x34998bc2),LL(0xbd1ef993,0x20b39558),LL(0x5fbf2525,0xd669e2ae),LL(0x01cc7626,0xbf956ec6),
+ LL(0xb0ccbaa5,0xce817029),LL(0x279b78a6,0x57ef5bd2),LL(0x4df45d89,0xc9283747),LL(0x2ec4bfd3,0xe86b91a8), LL(0xfe565915,0xe5ab4c6d),LL(0x7c58a042,0xe6574716),LL(0x6301c4bc,0xe141deda),LL(0x8084513a,0x2f95d561),
+ LL(0xeecede3d,0xdc424508),LL(0x386440d0,0x11889b35),LL(0x98de0d77,0x7b229f93),LL(0x300a7447,0x73fced8a), LL(0xe31c8f88,0xf75e1c79),LL(0xbb277e4f,0x8db20bdd),LL(0x2b87c02c,0x8ded0a70),LL(0x4d164c1a,0x166281b5),
+ LL(0xeedd8e0c,0x887356cf),LL(0xe44c012b,0x8afab37f),LL(0xe4aa3eb6,0x0795935f),LL(0xda6dfa57,0x9b9efc0c), LL(0xa8ab0840,0x0ff0f8aa),LL(0xc8561605,0x0f3a4b63),LL(0xd5db9315,0x2ca911ef),LL(0xc8ded9f8,0xef70e5ba),
+ LL(0xa6aae58b,0x443d9209),LL(0x274edda3,0x3d0798e8),LL(0xc2be3c9a,0x5c2d462c),LL(0x439882dc,0xb5488239), LL(0x977d4de4,0x6391bb41),LL(0x1e8245c4,0x7fd91040),LL(0x3b093dc2,0x1a6d3c71),LL(0x7b22fe12,0x423a4e3a),
+ LL(0x3a9a04a3,0xe3156f40),LL(0x297d9aff,0x9b32c4e5),LL(0x62a89850,0x7e0b401e),LL(0xa84ef082,0xffbf542e), LL(0xf990caf5,0x377cc0e0),LL(0xec88ea9b,0x02704343),LL(0x63f96a51,0x846fd46c),LL(0xe9855c47,0x37f5cebf),
+ LL(0xe6ad29dc,0xbd140bd8),LL(0x6a04da28,0x7dca4b10),LL(0xade05b33,0xa84feafc),LL(0x7630aacf,0x44d031f8), LL(0xcdee269c,0x18af2fa6),LL(0x8697a40b,0x1e40571b),LL(0xf0e5f826,0xf71d44ad),LL(0xa434cfe6,0x2a47ddf9),
+ LL(0xad17cc54,0x22b97078),LL(0xf2c105b2,0x223732dc),LL(0xe284fae8,0x25168336),LL(0xb356407b,0x41b1bb94), LL(0x89933a11,0x299e7d7a),LL(0xff7dd9f6,0x19e13d3c),LL(0xf23d7ca7,0x9517bd16),LL(0x1eb978a4,0x9e5e9e34),
+ LL(0x5fa3f92f,0x4c222dae),LL(0xed489ca7,0xd5e38e84),LL(0x70ea613d,0x3d81aca4),LL(0xbe4e88f6,0xc7bed301), LL(0x0757d8db,0x6fd5a7bf),LL(0x7a9181b0,0x1472441d),LL(0x5a90b66f,0x78b78753),LL(0xabdae620,0xe3fd5e91),
+ LL(0x84535653,0xea6a77d8),LL(0x81d7e667,0x8d241deb),LL(0xfaf4ef1b,0x1af73798),LL(0x3e0dae27,0x5e1ae728), LL(0x2f7450b5,0x6a67088c),LL(0xda9cb3c6,0x7bccbe06),LL(0x5b808e05,0x520fabab),LL(0x702b247b,0x84222f68),
+ LL(0xe0bd7ef2,0x2471546a),LL(0x656a62a3,0x27d310dc),LL(0xad35da30,0xb8014eca),LL(0x7f35cd7a,0xbdfdcd82), LL(0x040ae645,0xf1e4d51f),LL(0xf42a4d9b,0x672ffadf),LL(0x2d0be1c0,0x9d874370),LL(0xc6e55471,0xcc3671c6),
+ LL(0xbb9c9667,0x39aa705c),LL(0xc51f661d,0x8c3e584a),LL(0xe570769c,0xe5645b1d),LL(0xbc97abf4,0x81923fda), LL(0x0caac97c,0x51d64f64),LL(0xff847f4a,0x45c17651),LL(0x8cbfa2c7,0xc7a6eaf9),LL(0xba8ab893,0x6c2ab9f7),
+ LL(0xf435624e,0xbdaa2c7b),LL(0x1d961058,0xc113e971),LL(0xa2021a1c,0xb230f1b0),LL(0x521a4816,0x6b34e1ff), LL(0x9b874f4d,0x159dc24d),LL(0xbeaab169,0xeaa0f951),LL(0xb56f4916,0x4f38733f),LL(0xdc9d3ac7,0x4ee689db),
+ LL(0x7bf8d03b,0x720254bb),LL(0xd31d7679,0x78b0e6d6),LL(0xf130d7b0,0x848fb878),LL(0xd3ba625a,0xe8e478ec), LL(0x100dfefb,0xb0ce9168),LL(0xe5098aa8,0xfe1463ab),LL(0xa11ec558,0xf780ac38),LL(0x8e474b9f,0x92f15c52),
+ LL(0x46410cb1,0x3b3892d3),LL(0x03a5a136,0x72097f22),LL(0x98de068d,0xdb3a1b80),LL(0x4b1a3890,0xfb7438e4), LL(0x3839d3d9,0x8a10d5ea),LL(0xf4bd8126,0xd9ad034d),LL(0xd4800261,0x07d108ef),LL(0x9c5d6c52,0x978d98ba),
+ LL(0xecb9ce1c,0x63ae69e1),LL(0x51b28f39,0x70d2b437),LL(0x77f848a2,0xc15696b6),LL(0xd8ab4d76,0x6b6e60f4), LL(0x030bf112,0x33a581a4),LL(0xc5e74a76,0x9cdb1a6e),LL(0x7a950053,0x6c6f6ec4),LL(0xb04ebcff,0xd47dc472),
+ LL(0x5e0970df,0xe85ca76a),LL(0x78988af2,0x74448d98),LL(0x81620019,0x5227649b),LL(0xaabc2027,0x47e2ac62), LL(0xfbffedf2,0xfea15155),LL(0x3b4cb501,0xa565c484),LL(0xd830cece,0x4c523be5),LL(0xc321a440,0x2e2de6bc),
+ LL(0x8d69887d,0xa7d62771),LL(0x4e138de4,0xf9d8ac67),LL(0x9fcb0a09,0xad3fbc08),LL(0xbfc3bc9a,0xcaabb0b0), LL(0xb1c20604,0x84646bc3),LL(0xd1574260,0xf1059ac4),LL(0xeefff298,0x5c15c6a2),LL(0xf3b0a393,0x7975ede6),
+ LL(0x27c2343a,0x0ea9d355),LL(0x4b32e339,0xe21c75e4),LL(0xa7fc353a,0x1438785e),LL(0xe9a1dd56,0x0b8d64ba), LL(0x75347c02,0xcacf9b64),LL(0xcaad57aa,0xf788c83e),LL(0x36ecf2e0,0x90df1ab8),LL(0xf45070ac,0x4db604a3),
+ LL(0xb4c4ed93,0xbc76e168),LL(0x85b65a6c,0x07177b5e),LL(0x00d21309,0x41e3c275),LL(0x76a48f42,0xcc9678e4), LL(0xb1c6256f,0x3a04d197),LL(0xb2cc7330,0x940920a9),LL(0x2523d52f,0x990e4da8),LL(0x5a59d733,0x34709b24),
+ LL(0x8e745028,0x2f0da81c),LL(0xcd5668ab,0x32b5f384),LL(0xee538e7e,0x82744a5a),LL(0xf3eb2516,0x1b019bab), LL(0xd79d735f,0xccbd28fb),LL(0x85f90aa2,0x0bb54a6e),LL(0x9a69ecaf,0xacf5552f),LL(0xd1f1e30b,0xbc51ee85),
+ LL(0xfa25193d,0x12bf8b0b),LL(0x5ba4b3c8,0x3f0f51b0),LL(0x66181f23,0xc1b65deb),LL(0xc0156b03,0xfeb037f9), LL(0xa9dc59ed,0xdd7a0a8c),LL(0x7b57e018,0x20b5c8ea),LL(0xefaadad5,0x0c3ebc94),LL(0x18758eba,0x146d05b6),
+ LL(0x09c7b43c,0xcb952e41),LL(0x1c1b8fb6,0x7f7a0ae3),LL(0x331dfb05,0xbca8a9cf),LL(0xe0db9d7d,0x4a1db4a1), LL(0xe5b9c892,0x988d36a3),LL(0x010ad00e,0x64640e55),LL(0xc011bffd,0x4c33c7e8),LL(0xa0ad217b,0x5d7cf370),
+ LL(0x71f3df52,0xbaf8b74a),LL(0xa5995b20,0x300963bc),LL(0xd6c27636,0x695cf7ee),LL(0x03ac244e,0x74d4d3a1), LL(0xc898e5bb,0xddba3bd6),LL(0xfe3499f7,0x27573a89),LL(0x4b0a6c98,0x666b4415),LL(0xaa4ccfaa,0xf4f3e8c5),
+ LL(0x1a5b919b,0x5f136875),LL(0x670d4b04,0xed8eb5db),LL(0x0d0d73bf,0x4cd83d19),LL(0xbdf22579,0xd2a5c62a), LL(0xc2d04c2b,0x8c41be16),LL(0xbf9ad465,0x5aa33bc4),LL(0x5e00d922,0x36e20646),LL(0x00b70e17,0x9df21e7c),
+ LL(0xd440af4d,0x0601e630),LL(0x963e87dc,0x4aab0d33),LL(0x36d39000,0x2712abdb),LL(0xf9147e2a,0x856d7e3b), LL(0xc8e5d2f4,0xadc4a96a),LL(0x2e70c206,0xac3e5336),LL(0x6f6f3d0e,0x1ee7d838),LL(0xead72426,0x4674ef20),
+ LL(0x6af5f580,0x3a804dd8),LL(0xd74ea5ce,0x724a756b),LL(0x0432d854,0x0c2968d0),LL(0xa4f262fe,0xe3be03f3), LL(0xc84c22bb,0xe446692a),LL(0x9647650d,0x156b3168),LL(0xb5d3d62a,0x4e06bc39),LL(0x80eea174,0xf99d4fec),
+ LL(0xc08f1144,0x3a2b7ae8),LL(0x12dae8d6,0x35e65bf9),LL(0xae3892b5,0xfa0af1cf),LL(0xac408112,0xa57062dc), LL(0x24bf1af9,0xef6a9ec3),LL(0x5decd8bc,0xdda3b476),LL(0x7bed3775,0x9314a36c),LL(0x60aa296e,0x9e254b0e),
+ LL(0x65b9cf2c,0x8be2de80),LL(0xcb3b96cf,0x1b110df6),LL(0x18957e21,0x0f647a12),LL(0x4f907766,0xa1e11238), LL(0xc5528977,0x751a0d82),LL(0x9a4b1260,0x958d8738),LL(0x773658ee,0x99087543),LL(0xf19f74cf,0x18148bbe),
+ LL(0x0a19a374,0x5f50ef19),LL(0x6bdd3392,0xc5bc4160),LL(0xb80ad74c,0x1bdf5e4b),LL(0xed7e68c8,0xc40ec2f7), LL(0xdecef5b8,0xedd7dd6a),LL(0x896c95a3,0x3d29a1cb),LL(0x70ad41d4,0xfa84c325),LL(0xc398c177,0x6a577072),
+ LL(0x7375f2de,0x4f942d01),LL(0x8aa1523a,0x968a7608),LL(0x377e5c4c,0x55dc7da6),LL(0x282b540e,0xb75fff53), LL(0xfd4b6951,0xfee35c15),LL(0xf04ddfae,0x6d1d64f6),LL(0xaf7c8714,0x320f1769),LL(0x482ba6fd,0x2b5f86a4),
+ LL(0x1ab9986b,0xcf691cb7),LL(0x7377ba6b,0x42913d71),LL(0x1e47bf08,0x120b4601),LL(0x764b2661,0xfb514e52), LL(0xa140ae04,0x371c0155),LL(0x2e186763,0x94e65b70),LL(0xd5764306,0x5e440f7b),LL(0x7b8a5eeb,0x3411dadf),
+ LL(0xf0e3e158,0x6c25e519),LL(0xe8898c80,0x46ee66d6),LL(0xec4f9b03,0xa0e9d4b1),LL(0x126c1f31,0xba48d97c), LL(0xbdbf0928,0xb9f96818),LL(0x7f51cb48,0x293ce87d),LL(0x76f09d38,0x077a7420),LL(0xedea4c81,0xc71cb875),
+ LL(0x9ddd1485,0xfeda750d),LL(0x51c10504,0x987876dc),LL(0x75ec7922,0x4d0253f8),LL(0xc676b336,0xbcc15e39), LL(0xb9370740,0x33d533d8),LL(0xcb8c88ab,0xc5c482db),LL(0xc7c08a75,0x1ff3f223),LL(0x401b00fd,0xccfaf564),
+ LL(0x6ac9757c,0x6ba93d3a),LL(0xec2c92a0,0xff09b546),LL(0xc5960be8,0x95d3436c),LL(0x69029082,0x90b7e8cb), LL(0xdb6b32e5,0xbdd1e2b9),LL(0xfd47ad85,0xf4d2e43b),LL(0xcb005dbe,0x8923251e),LL(0x662912e7,0xc21368a0),
+ LL(0x062d205c,0xc7ce2963),LL(0x9542b831,0x1e8f812f),LL(0x818c322d,0x4f8a7915),LL(0xfb678809,0x50073cba), LL(0x0cb91b3e,0xed7b5237),LL(0x60d3fe6b,0x22d1fa41),LL(0x2d690f75,0x3de39063),LL(0xf164ec1f,0x12b2e39e),
+ LL(0x332f408f,0xa28a0d83),LL(0x6a054db1,0xe6d9406c),LL(0x5ddd64e0,0x67369b76),LL(0x02b21c2d,0x6d671707), LL(0xac42170f,0xb9ad3368),LL(0xe5802ffa,0x5e8f5277),LL(0xd9b4a0a9,0x1b4468fb),LL(0x96c24331,0x0daf8269),
+ LL(0xc09ad26d,0x976c2f23),LL(0x19c68d38,0xd47afe88),LL(0xd3d8d84f,0x0e96c03b),LL(0x0932b2fe,0xe05b5fd8), LL(0x347fbbbd,0x13931043),LL(0xb0ccc752,0xe0fa842f),LL(0xc75bf745,0x7295ee0f),LL(0xb0aa9d61,0xebaae0dc),
+ LL(0x6355564c,0xb392d49b),LL(0x887c5a18,0x57e2f166),LL(0x230a278a,0x88b3a014),LL(0x4c194449,0x088e4908), LL(0x43d6af69,0xc6cd309f),LL(0x589a7f7e,0x394445e3),LL(0x031e7c08,0x0610077a),LL(0xa3519f78,0xd05547cc),
+ LL(0x926e26ed,0x0123b543),LL(0x62d06da6,0xcd430b80),LL(0x0dcd6db5,0xddb182d0),LL(0x8eb6e010,0x724c9bce), LL(0x50a4a597,0x985a2f0f),LL(0x900f2a49,0x35f2427f),LL(0x13cbf187,0xce6136fe),LL(0x1086c2aa,0xc893bdee),
+ LL(0x07eca624,0xe2410ccb),LL(0xddf9afb0,0xeda92913),LL(0x5bb66033,0x8fc0cfd0),LL(0x0509ffc8,0x0ab7d29b), LL(0xb3d4f10a,0xc063b004),LL(0xeb8cf642,0xed94a955),LL(0xa272ac4d,0xacfb2f14),LL(0xc4ebbf0b,0x10f2c91a),
+ LL(0x06ea04eb,0x73f6e02e),LL(0x8b97ea93,0xb969e8f8),LL(0x0cd48657,0xa9b27472),LL(0x99264937,0xe1a874ec), LL(0xf794332d,0x34e677a4),LL(0x5ee2daea,0x5e67865e),LL(0xe6886879,0x3fe02b91),LL(0x0f9776ad,0xe113432f),
+ LL(0x6a2c47d1,0x37567306),LL(0x62feb54a,0xf66df9b8),LL(0x3e07ce56,0xf734ee37),LL(0x659809fd,0x50c4982d), LL(0x9daf8faa,0xe2fa768f),LL(0x8b9fd7c3,0x66088ddc),LL(0x333683c6,0xb8265661),LL(0xdff2a0a7,0xe7dacf81),
+ LL(0x5e3da06c,0x1e99d6bd),LL(0xbae05a25,0xbd50e15c),LL(0x802d7b40,0x47a0d997),LL(0x193ef621,0x0a25b51b), LL(0x148ee5a3,0x24d3d4f4),LL(0x022a9df0,0x7012618f),LL(0xf68e648f,0xb3777339),LL(0xd7544352,0xcdfb557f),
+ LL(0x1f912c5f,0x4b0b2d46),LL(0x957515d9,0xddaf929a),LL(0x0ae46856,0x29e4bf1f),LL(0x44e32ab0,0x158b4c85), LL(0x7c48d2d2,0x17935398),LL(0x6f2430bc,0xe4ab6300),LL(0x0d8b24d4,0x71dd7284),LL(0xfc21d7e4,0xd9303af1),
+ LL(0x450f7f6d,0x816c616f),LL(0x3306df19,0x17875d8e),LL(0x087e86e0,0x7ce8d4a5),LL(0x36251f01,0xa53970ac), LL(0xfc98edaf,0x2037f12c),LL(0xabf72b6f,0xc359a382),LL(0x85130fa6,0x06acf1a6),LL(0xadfe4344,0x08f45064),
+ LL(0xdd857b31,0xc01e1f3b),LL(0xc9513734,0x92c2263a),LL(0x589327b8,0x562652d5),LL(0x96a1c164,0xa8edd065), LL(0x79f8df8d,0x2cbf8f98),LL(0x40847dde,0x3d5cf771),LL(0x597c0622,0x69b08ee4),LL(0x8a868f2a,0xfff18c4d),
+ LL(0xf5ad0686,0x28bca3d2),LL(0x2d4eef7b,0xf7992f89),LL(0x3977e15d,0xab10b9cc),LL(0x2db8ef03,0x47912ca1), LL(0xdf27884b,0x1f3e70e6),LL(0x0e9d8efa,0xdd9bb81e),LL(0x279e27f6,0x97a83b6f),LL(0x24daf922,0x47e259fb),
+ LL(0x124e71be,0x49eb72bc),LL(0x3a6778ba,0x01dba001),LL(0x3be03050,0x8d02baec),LL(0x6dd6c8ef,0xe3571b3c), LL(0x2cc11ffe,0x6e1ffbac),LL(0xf4e2e6f0,0x6d725c75),LL(0xf2b53a58,0x96c31b45),LL(0x97f1634b,0xa0e38dd7),
+ LL(0x143ce001,0xe8507959),LL(0x8b49cc63,0xad9a9f52),LL(0x8438b0fa,0x950fd33d),LL(0xbe0cbdf6,0x2b294c00), LL(0x937b00ce,0xb2076b47),LL(0x78041498,0x026153a1),LL(0xe9e53d27,0xe958f12d),LL(0xe8f8fad9,0xf49e1124),
+ LL(0x2bca0ae1,0xb78a5b74),LL(0xcccdc3d3,0x35180dec),LL(0xa97e519f,0x15e4fba5),LL(0xf5b8340e,0xe49dac9d), LL(0xe5978024,0xdbd8ed3a),LL(0xeb105505,0xd181f26a),LL(0x29f57098,0x38364818),LL(0x3900171a,0xd674fe1f),
+ LL(0xf1bd5803,0x5a2ff729),LL(0xeda23387,0x53de7261),LL(0xf0dc417c,0x7f1d84c8),LL(0x5360fa80,0xa65694a7), LL(0x96ed36e6,0x356e4518),LL(0x406bfd36,0x127a52de),LL(0xde925d04,0xb575a98e),LL(0xc0627c4f,0x35fb44be),
+ LL(0x471e745a,0xc85f2c69),LL(0x6213d79e,0x1c01e1ea),LL(0x2f5081f0,0x95ea99a1),LL(0xc3367864,0xdb38bd3e), LL(0xd8880436,0x0e8cafec),LL(0xf9c63d09,0x1d59fd74),LL(0x7f875dbb,0xe57b0b4f),LL(0x77084bd7,0xe266c939),
+ LL(0x2fc1f909,0x0e289c5a),LL(0x86c4fc40,0xece9d225),LL(0x5d79b4b3,0xe0a56fbe),LL(0xd4489041,0x2b96fae7), LL(0xe23c85e7,0x0f66316b),LL(0xadfef0c2,0x2d1a3c78),LL(0x9fbce9cd,0x1aece4ad),LL(0x6c32d32d,0xccd0f334),
+ LL(0xfb9ba6dd,0x958d7a5c),LL(0xe673275d,0xa0052032),LL(0x7f978d07,0x514ffd9d),LL(0x450b76e1,0x544bbce9), LL(0x6b5201b6,0xeaa25d74),LL(0x74d082a5,0x7528a4ea),LL(0x66609e27,0xa08c8d31),LL(0xda7c6fd9,0x5150d1be),
+ LL(0x39930618,0x864f5b4c),LL(0xcebb516e,0xe71e7f1a),LL(0xebf1f8ac,0xaeee7fa5),LL(0x0ea827c6,0x6efcad4a), LL(0x74e21dd8,0x6e0f4ecb),LL(0xf33a7939,0xc5311600),LL(0xa4d93fc4,0xdf62f3c3),LL(0x9a18476d,0xd3b62727),
+ LL(0xc0e1256b,0x0b54f5e6),LL(0x97ba9afa,0xe8987efb),LL(0x41d11c15,0x4b6ea064),LL(0x79b79f0f,0xfed7017e), LL(0x5bd04e40,0x5a6bcf9e),LL(0x8fd3b4bd,0xf3090153),LL(0x82240648,0xa23b5acb),LL(0xb16cf033,0x61d9a8b1),
+ LL(0xc9fbee1e,0x2feb1706),LL(0xd7e07918,0xfaa4cd69),LL(0x447cba7a,0x28562c58),LL(0xa61a1064,0x727926c4), LL(0x97ac7eff,0x1b32db7f),LL(0x452253ce,0xfd968b22),LL(0x5cdd3217,0x69d1842f),LL(0x26f4007d,0xba7689da),
+ LL(0x141c8b35,0x16445a64),LL(0x73c61779,0xc11c3101),LL(0x485300ee,0xa5aa0d18),LL(0x1cc02bf0,0x531b6de1), LL(0xc4efeb2c,0xf8b94155),LL(0xd015a9c8,0x83632663),LL(0xcba18b7f,0xc369b3ce),LL(0xc29e0f9b,0xe11b3ef6),
+ LL(0x903ca95b,0x1a5e9bf2),LL(0xa50cb332,0x2d9aefc6),LL(0xb29ce693,0xb5670264),LL(0xab1d7b7e,0x806d08ac), LL(0xc9107eac,0xcbdfdf28),LL(0x6cdf12ac,0xa8086243),LL(0x903d5999,0xe7d9c315),LL(0xc079d951,0x4379820b),
+ LL(0xbf1edf4c,0xe789ecad),LL(0x47bc7752,0xec086811),LL(0xc2fc8798,0xeea2eeb8),LL(0xe031a96b,0x763183e0), LL(0xf9a6bfaf,0xc7daf0b2),LL(0x4b957cf7,0x1a2a7ffb),LL(0xbf2d2e7d,0xa483c7c8),LL(0x58ff7f9c,0xf96921fc),
+ LL(0x574ee010,0x41386185),LL(0x2780c649,0x62e6a1d8),LL(0x60f2516e,0xdec553af),LL(0x7a04eb11,0x5b091537), LL(0x67eb90c5,0x1b53e9dd),LL(0xddfda333,0xc390a23a),LL(0x480568aa,0xdd4e7c6d),LL(0x59ccbe61,0xd6c1e8a8),
+ LL(0x9107901b,0x1c6fd7a9),LL(0xa211d116,0x5dc4a41e),LL(0xaf1b78a8,0x597e94e7),LL(0x53afcb6a,0xe72da34d), LL(0x74512c24,0xbc364db7),LL(0xb2811e91,0xc26a8fb9),LL(0x290469b1,0xfdd39d7f),LL(0x20612535,0x84515392),
+},
+/* digit=29 base_pwr=2^203 */
+{
+ LL(0x1539cf31,0x7fe996a0),LL(0x0ded7c6e,0x4a3f729a),LL(0x3016f614,0x86f1f299),LL(0x86cb9163,0xc3d44e18), LL(0x558fa36c,0x96984531),LL(0x369c89d6,0x58e8bf05),LL(0xf9ee923f,0x287da114),LL(0xec271fbc,0x2032e984),
+ LL(0xd39207ad,0x91b8579d),LL(0x0b1fe916,0x6f62c725),LL(0xd89e01bf,0x0f1599ac),LL(0x4d1e5843,0x8d9bb86d), LL(0x726e38d1,0x348b90d4),LL(0x52a8c6b9,0xb824a1ca),LL(0xb1d2f6f4,0x984d9309),LL(0x431ec12e,0xefa485b7),
+ LL(0x9d616a5c,0x24cafa66),LL(0x4c9d0ea8,0xc1c7445f),LL(0x90bee7b6,0xf733e085),LL(0xd251d2ba,0xa2f3ece3), LL(0x66aeba6c,0x6e422a45),LL(0x37c1337f,0x35e99b16),LL(0x6d4f8d03,0x52d0fdf7),LL(0x79c92672,0xa043420c),
+ LL(0x76ac1925,0x99725607),LL(0x3442fc58,0x086449db),LL(0x2e311e74,0x8dbab920),LL(0x7ea25561,0x29dee69b), LL(0x19a7cd6c,0x5a62b6ee),LL(0x0d0dd5a0,0xba38cc4c),LL(0x166d0ff1,0x779279e5),LL(0xf48b3dae,0x0eef53cc),
+ LL(0x0f82c6a6,0x0463dcaa),LL(0x11d7d6d8,0x75dfc96d),LL(0x6c100d92,0x61f05e7b),LL(0xe13eabb4,0xa118e548), LL(0xdcdf06b5,0xcc77e3c8),LL(0x6ac25960,0x902d37d6),LL(0x347d7116,0x967d9993),LL(0x9ae33561,0xd2828650),
+ LL(0x8c7c6d89,0x955b7840),LL(0x42c2555f,0xbfa78bc8),LL(0xa69c3165,0x8c56ae3d),LL(0xe33bb1bc,0x72b20e72), LL(0xd1aa6416,0x686870b4),LL(0x7db03cdd,0xf000040b),LL(0xb0a0fd40,0xd25b16a9),LL(0x36815f1f,0xeb89e932),
+ LL(0x349b549c,0xb3e5e912),LL(0x086c4e74,0x801f788e),LL(0x0082ae92,0xafb9ea4f),LL(0x0d740026,0x4e8f27a4), LL(0x05f4a6ac,0xc4f8285a),LL(0x0adcd58c,0xefea5297),LL(0xc52f8c21,0x9d5b6ae5),LL(0xe97af4dd,0x92622a7a),
+ LL(0x79f34a8a,0x39b43935),LL(0x30046435,0x61acf55f),LL(0x3f05fdb1,0xf0a23fe6),LL(0x0c4fa7ff,0x7d6baee1), LL(0xe2daf735,0x253f62b6),LL(0x2948637b,0xe370ead8),LL(0xd84e6206,0xda57c16a),LL(0x0dd22ad3,0xf19ffe09),
+ LL(0x95bf2003,0x701acab2),LL(0x9dff6efc,0x50e4e10a),LL(0x43b95430,0xe637bcf0),LL(0x85050cbc,0xac45cd3e), LL(0x80639e4d,0xc2ebff64),LL(0x3056f603,0xe5af1fb5),LL(0x08b17132,0x302791d5),LL(0xed517904,0x87775ac4),
+ LL(0x4263a566,0xfe64ed1e),LL(0x1d5e8f55,0x735bbee4),LL(0x8294342c,0x9ac61915),LL(0xd4904935,0x0f522e5a), LL(0x7c1e11f4,0x2ee883b5),LL(0xf0c237f4,0x0a2ce30f),LL(0x8d955086,0xf4a7157b),LL(0x022dc2db,0x7ec0462e),
+ LL(0xca391b0b,0x562fb75b),LL(0x3bb1efd6,0x13030aac),LL(0x347f44fe,0x305d9831),LL(0x94b2615b,0x9f70c1ad), LL(0x4162ff22,0xaaf935f4),LL(0xa68d160e,0x2b20f047),LL(0x39222d1b,0x30d52a97),LL(0x6551642f,0x051223b1),
+ LL(0x39620daa,0xae65a5c7),LL(0x6f7c078f,0x8ef6f93f),LL(0xb0177db8,0xb06d52bc),LL(0x68fdf535,0x915cdd08), LL(0xc5183222,0x0070d150),LL(0x7817a2ae,0x2b6495cd),LL(0x0b194f0b,0x3ce47614),LL(0x513bfdfb,0x2eec6acf),
+ LL(0xf3dbd34d,0x725dbede),LL(0x3621fc75,0x01c4412a),LL(0x3c07f048,0x17bd68de),LL(0x62e735eb,0x117df57e), LL(0xb249c407,0xb1596c6d),LL(0xd46c55c4,0xa878f56a),LL(0xb8aa0cb4,0x33385670),LL(0x800ec887,0xc7faa80e),
+ LL(0xd7daf836,0x2cd2814f),LL(0x0d616922,0x877b72b7),LL(0xdb066012,0xea73ca1b),LL(0xb0d4159d,0xbe336c7b), LL(0x0f8fcd76,0xb993b07f),LL(0x8a593562,0x5fdceaba),LL(0xf691ec19,0x716595fb),LL(0x8e68e3c0,0x51a77f61),
+ LL(0x7a7c18db,0xe9e4cdfe),LL(0x7b4f69b7,0x967d3575),LL(0xa9a434c1,0x6dd350a1),LL(0x00c79ba7,0xb92cdef9), LL(0xa6bb0f93,0x7a762493),LL(0x8158ad36,0x6c18cdc2),LL(0xc529ecfd,0xa0bd83e3),LL(0x3962f96d,0x98363c59),
+ LL(0x1d63aa7f,0xd80f45a5),LL(0xb3b32da2,0x8d5eba75),LL(0xa4708858,0x0ef233df),LL(0x52161c61,0x74c3f4f7), LL(0xe6420de4,0xfa9bfe6b),LL(0x97dd86d5,0x96c0c501),LL(0xcfce233b,0x28e6827b),LL(0x58e74d63,0x035cc9a9),
+ LL(0x7948782d,0x9ba64bf4),LL(0x80d9ce1a,0x5e5b7c72),LL(0xf51df862,0x7b9435db),LL(0xb4dd2421,0xe74ab6e8), LL(0x60954c75,0xb0d704db),LL(0x0b59ae5b,0xd31c5145),LL(0xd99ba307,0xe0ff4660),LL(0x986bd82b,0x1a3800fd),
+ LL(0x509a0a50,0xe7e06ab7),LL(0xe4539885,0xbdf63778),LL(0x16ddb433,0xf888320f),LL(0x18e18998,0x0f108304), LL(0xfa834b14,0x27e7ffd6),LL(0xc68b9434,0x16de9a71),LL(0x4d360436,0x53a12e2c),LL(0x5e110b02,0x5ad2c986),
+ LL(0x3cf53e0c,0x3439443c),LL(0x1d65a7a3,0xfeae29b0),LL(0x78ad7d78,0x1e7774f6),LL(0x6fee368c,0x0c79fb01), LL(0xe4faf3ee,0xbec71de1),LL(0x263868e8,0x1a88f3e5),LL(0x90e91a8c,0x975d8381),LL(0x0f999c60,0x69c5a65d),
+ LL(0x8b884857,0xbd3360d8),LL(0x31b7c579,0x04190413),LL(0x142cc145,0x40dd9229),LL(0xdad0b2df,0xb5faab94), LL(0x52df4831,0x3e7d7921),LL(0x228bf67d,0xcf5bd1ed),LL(0xc4980085,0xd8669635),LL(0x1c71903d,0x094b8973),
+ LL(0xc4abb028,0x493a7a3d),LL(0xb4ab8e35,0x0e1a8fac),LL(0x017aa5f2,0x26094ca2),LL(0x021476cb,0x94fcb8b1), LL(0x4abf3bcd,0x57f101f9),LL(0x2d7f12a8,0x1ac2c125),LL(0x2e42789c,0x575259d9),LL(0x22471eb3,0xa64a4a4b),
+ LL(0xe1c00144,0xcc02304d),LL(0x754734b2,0x6269dfb9),LL(0xf14fbc81,0x72e7a183),LL(0x2a05caa2,0xd92a5b1c), LL(0x15efc2fb,0xd593492e),LL(0xd8dd458b,0x1ace7dca),LL(0xaef2ae81,0x576b4bc8),LL(0x351b397e,0x6de6a2db),
+ LL(0x656cf9ab,0x73f13b48),LL(0xaee7e01d,0xc18df1c9),LL(0x560355e7,0x30fb5155),LL(0x9ad059d5,0xd2c9a0ee), LL(0x5e5e0c7c,0xd9f89936),LL(0xf0a6c9d7,0x5d0a2cbd),LL(0x58fa9be9,0x3c2c497d),LL(0x6ac61a2f,0xe6c6fcf2),
+ LL(0x35607bc4,0xf7ec89e3),LL(0x9946bf52,0x17ca00ca),LL(0x180c8bd8,0xee46be5b),LL(0xb2873893,0xd29d5eb0), LL(0x97487b3c,0x348ac939),LL(0xfeef78ce,0xc18f0ceb),LL(0xf797cce5,0xfc648dca),LL(0x442148d7,0xe2467e0c),
+ LL(0xda6dbaf6,0x8e201ee7),LL(0xabd0490c,0xc1a93ee4),LL(0x4de7c210,0xfd0007bf),LL(0x083ffce0,0x02eccb8b), LL(0x97844c8d,0xbba82bbb),LL(0x2747a430,0xb7ff954c),LL(0x18fb5f29,0xb05f0584),LL(0xee7c263f,0x35a29cf5),
+ LL(0x25282da8,0x5fd84efd),LL(0x7682db7c,0xc1fc84c1),LL(0x4bb291e6,0x8422b56a),LL(0x66a56078,0xce379feb), LL(0xe7f045a0,0x1c3c581e),LL(0x6b3f89ac,0x8f42985d),LL(0xa6b2ba59,0x112839e9),LL(0xc2a7b29a,0x3f0c7269),
+ LL(0x79bd3046,0xecdadb6f),LL(0x9617ff6e,0x669f559b),LL(0x68928ca9,0x242bb14d),LL(0xc19cafcc,0x28e2b0cb), LL(0x81330593,0xfb7d8954),LL(0x9fbf8665,0x5c3741fd),LL(0xc3b93e86,0xaf49e83a),LL(0x32822548,0xd60ecf7d),
+ LL(0x7cfb37cd,0x4bf36759),LL(0xdb7af2ed,0x94b0c7f0),LL(0xebf8b461,0x2f1bebf6),LL(0x073e5c18,0x90ebc9c7), LL(0x3774e905,0xe431c793),LL(0xe03265bb,0xb8a4bc2f),LL(0xfabb629e,0x0bee0825),LL(0x84557170,0xbd1481dc),
+ LL(0xe1a010a0,0xa2257b58),LL(0x4688bb89,0x43f5451c),LL(0x91b96371,0xb87a5ff0),LL(0xde3c7b25,0x445dd02f), LL(0x51a0964c,0x44c0c080),LL(0x9afdcefa,0xb0c3190e),LL(0x0044d258,0x14cc65ad),LL(0x374fdd44,0x8c500b3e),
+ LL(0x51b07812,0xed8d840f),LL(0x76530691,0xd414a4a2),LL(0x1468ef8d,0x9db9d138),LL(0x292b3870,0xfc6b7434), LL(0xc9d7ad96,0x80b66797),LL(0x2a9c1e99,0x81e74eb6),LL(0x9e92f64b,0x48657d9a),LL(0x4c851ddd,0xf5c60075),
+ LL(0xd99d5cfe,0x08fa89be),LL(0x4db4addf,0x78b1f26e),LL(0x3523ead9,0x03237177),LL(0x6a281494,0x0147af5c), LL(0x916836b0,0x8db3952a),LL(0xfd365650,0x0632b102),LL(0xccb3f2f1,0x3854a8e9),LL(0x586ad427,0x5048486c),
+ LL(0x17a86e18,0x22de9979),LL(0xbe029111,0xe2ac2321),LL(0x35cc5a17,0xbfd34397),LL(0x525e13cf,0x7a93461f), LL(0x5122d6f1,0xd433542c),LL(0x833982c7,0x41d2d9de),LL(0x8ec24d27,0xe9f1f29a),LL(0xf3b99d58,0x4ae251f3),
+ LL(0x10adb458,0x7234dd24),LL(0x88379ef5,0x0e4b6567),LL(0x748dba5d,0x3007df15),LL(0x35103772,0x1485ef01), LL(0x29c2382f,0xe21a9dc9),LL(0x6b6c1c8d,0xcf7e0c24),LL(0x30550c0a,0xf8a71820),LL(0xb797de2e,0xb30e5c0f),
+ LL(0x03705145,0xbe136119),LL(0xf94aadc7,0xe6d1f720),LL(0x255f5297,0x38ce1872),LL(0xc3143f58,0xbbba4793), LL(0x0984e265,0xda5345fe),LL(0xd895e0d7,0xe93989d6),LL(0xcaab40a3,0xb7392b18),LL(0x65e754fc,0x4a586963),
+ LL(0xa3afd381,0xb3e88445),LL(0x693ad961,0xa6cbab0a),LL(0x257d56dc,0x64d51359),LL(0xbbde137a,0xf9e70fcc), LL(0xadd016b1,0xa33872fa),LL(0x7344f234,0xd1d263d2),LL(0x24ba41b2,0xc2d51210),LL(0xe4ab65cb,0x8c9c830c),
+ LL(0x175b4039,0x3b47563c),LL(0x116b2025,0x53521dfd),LL(0x1a9f1cca,0xe4f3aa89),LL(0xe7cb1d2b,0xcc73485c), LL(0xbf58fe30,0xa6ca61ef),LL(0x531a2b6a,0x5d50e15d),LL(0x22611c31,0x71cfdb41),LL(0x61e3d46a,0x0dc15533),
+ LL(0x479074ba,0xb363c60b),LL(0x24cb405d,0x2a4d8f4c),LL(0x646b7f0a,0x3d3bee13),LL(0x5571af63,0xdfa9194c), LL(0xee76521c,0x951a61a7),LL(0x65eda1f1,0x67466ba5),LL(0x69ebc7ea,0xe41d33b8),LL(0xd4f4848f,0x8b6c992d),
+ LL(0xa5003eaa,0x3572faac),LL(0xabf54df1,0x01e36500),LL(0xac6f3af7,0x6622f12f),LL(0x0a8bb122,0xb5d7c17f), LL(0x240286b1,0xd1fc1b99),LL(0xad968ede,0x519d52ce),LL(0xece28bb4,0xcd1e7d0c),LL(0x93f0b097,0x64ffc699),
+ LL(0x25af7d81,0xb18d51f8),LL(0x19820fb2,0x8d0bb08f),LL(0xaa344723,0xe9f45919),LL(0x5f9e0501,0x558f18ea), LL(0x07cc79dc,0x56eff076),LL(0xd5fa9783,0xf171e880),LL(0x8be7f1fe,0xd5fb41f3),LL(0xd6fe9afc,0x19a34620),
+ LL(0x7d8a042a,0x74c2696b),LL(0x54230ded,0xcf4908c3),LL(0xdb32943b,0x98a870d8),LL(0x52f33e07,0x181cbe5c), LL(0x93709d8b,0x4d9d1172),LL(0x2b2b7939,0xb800c292),LL(0xa8920f60,0xd5a1fb7a),LL(0xbf7df622,0x8d0a7725),
+ LL(0xe9415cf4,0x83a370cf),LL(0x62a4ff4d,0x9f24d1e1),LL(0x0a6ff7cb,0xca33914b),LL(0xda1d1aaf,0x2576f2d8), LL(0xb4793101,0xbb2668bd),LL(0xca990b4f,0xb576672c),LL(0xff1d3988,0xfa165b5f),LL(0xba8c9e2c,0x273d5b18),
+ LL(0x720a5b3f,0x13594ae5),LL(0x2e65454c,0x38c4e04a),LL(0x55d0d903,0xc5b55d98),LL(0xf72db301,0xfabeb890), LL(0x2f3deaa2,0xe471f1d5),LL(0xc5ade08d,0x3f8d39f5),LL(0x6baf9d1a,0xe08486a4),LL(0xe5140d3b,0x77c6d30e),
+ LL(0xd23d4e09,0x828db96a),LL(0x84dcac15,0x2de4856d),LL(0xa6ac856d,0x313c7f8b),LL(0xfe7dea98,0x7c9f671c), LL(0xfebe9e72,0x4d6c14a5),LL(0x6014be55,0x185ac4e6),LL(0x5ed64e23,0x42809988),LL(0xbd6440fe,0xdc9395a1),
+ LL(0x24108055,0x10169080),LL(0x38961403,0xfe0d9cb0),LL(0xceb87d29,0xf88e6a48),LL(0x69618944,0x0365ca2f), LL(0x9fb59ec9,0x1504647e),LL(0xa4aadbb7,0xb6486b3b),LL(0x22ef3214,0xfe8701af),LL(0x5f56d985,0x4c895bc1),
+ LL(0x2e1e68d2,0x6fdc6cb6),LL(0x13f07350,0x0689b22b),LL(0x6d62eb1f,0xba94416b),LL(0x98996d72,0x5a2fcbba), LL(0x04b2afed,0x2ca2a2e9),LL(0x0bf61008,0x5b62c764),LL(0x37f4d486,0x30074e57),LL(0x31865287,0x4e02be2a),
+ LL(0x6842ab16,0x401cfb89),LL(0x5b2eb304,0x440fb52d),LL(0xd22eaa61,0x3245fd38),LL(0x373f201e,0x252120e8), LL(0xb2e724c9,0x4d253f5c),LL(0x27e5b5e4,0x9428d6be),LL(0x6785ee9c,0x00d4c598),LL(0x56208d4b,0x0b7fc5f9),
+ LL(0x92310137,0x4426665d),LL(0xfee8da95,0x75b96cd3),LL(0xb561c6d8,0xaaaac6c3),LL(0x3f09e1d9,0x0784a3c5), LL(0xdcac620b,0xac78c064),LL(0x119b8d90,0x49dd5f02),LL(0x57e5caf4,0xf1f5ebf2),LL(0x0eb825e2,0xd8a9fa2d),
+ LL(0xbfb6a2fd,0x3553633a),LL(0xa0c9ce9a,0x06533515),LL(0x04c71728,0x6decd9e8),LL(0x980b29bd,0xcbc0df55), LL(0x31826d15,0x17b1b559),LL(0x1c5cae17,0xc96ed7d7),LL(0x88cda83e,0x24f58740),LL(0x0c69f40f,0x9e2ee1bc),
+ LL(0x9e5604ed,0x138ebf0f),LL(0xf229f097,0x0577f4c2),LL(0x9762825f,0x0a44f975),LL(0xdd085e55,0x113b8639), LL(0x73acc59e,0x4be02fee),LL(0xada7a17d,0x7829f288),LL(0x84fb30d4,0x086bd736),LL(0xe5338eca,0xb2f120ee),
+ LL(0xfb778d2f,0x21701393),LL(0x6441fd75,0xd46bc61e),LL(0x135b55bc,0x466671de),LL(0x51c0f145,0xee1d9cbb), LL(0x6d9ce27c,0x7a7bce67),LL(0x26d82b1d,0xa8c9b1e0),LL(0x4c87bd6e,0x250bee03),LL(0xd3829702,0xd6b02f71),
+ LL(0x0e555d98,0xf14b3748),LL(0x6f775e78,0xf795e62a),LL(0x8f46de18,0xe9a4e4ac),LL(0xc5ab76ef,0x773bd32a), LL(0x5264cae9,0x4f2dcc68),LL(0xc63a6419,0x453b627e),LL(0xe441c6d9,0xc3aeddd1),LL(0x3027b8f3,0x669500b7),
+ LL(0x88d601e5,0x06b93413),LL(0x76c4483c,0x0e996e87),LL(0x00eb0c21,0xe2ff3a6d),LL(0xf4690674,0x86ec3a73), LL(0xe9f82ca7,0x673d123e),LL(0xbf611d0c,0x952c2765),LL(0x3676497d,0x26ed9a68),LL(0x9d29cefc,0x2c9c0049),
+ LL(0x2ae73af6,0x0b8c12fe),LL(0x6455c8e1,0x555b0ab3),LL(0x4804b006,0xd2f49f03),LL(0x02e829a0,0x408a22bc), LL(0xf2832c53,0xde2a59cf),LL(0x96a54082,0x01332439),LL(0xbbd38f9f,0x11dc4ab6),LL(0xa24764b5,0x0248fd93),
+ LL(0x1374972a,0xc7774c12),LL(0x92764b41,0xc7355966),LL(0x23143092,0x31c10ea5),LL(0x9070137f,0xe89d9f88), LL(0xa504d91e,0x7d074406),LL(0x70b7aa8c,0xc5210379),LL(0xea799dd8,0xa67904f8),LL(0xe7b02c04,0x81e6516b),
+ LL(0xb08cc6fe,0x18daf05f),LL(0xf59d49f6,0xfbbd3061),LL(0x93a78581,0x5429b117),LL(0x1906df65,0x795a4465), LL(0xd51a7866,0x643c37e3),LL(0x663a17b1,0x69b8118d),LL(0x3e8a2c53,0x5e385989),LL(0x50f007d2,0xbc18c2ea),
+ LL(0xb616aa15,0x4adec20a),LL(0xea085548,0x99f77e49),LL(0xc01b9a33,0x9108c205),LL(0x6ef3bcef,0x298fbeb1), LL(0xefd8ba0e,0xdf1a8d2e),LL(0xe9756e7b,0xf0ec9492),LL(0x7ff5fbc3,0x4fd33389),LL(0x03ac8371,0x122a6bfb),
+ LL(0x90d66732,0x7d053c8c),LL(0xf9b2909f,0x83f26571),LL(0x66cba4b6,0x350dd6d0),LL(0x40d0d47d,0x8c71c17a), LL(0x4d0be34a,0x3bf85053),LL(0xe11bd49f,0x91ae4f59),LL(0xa22c648f,0xf8a38b41),LL(0x58abaaea,0xcb96620e),
+ LL(0xa7fabcf5,0xa55cee46),LL(0x79c8fbce,0xd16a8b92),LL(0xcbf048bf,0x26ad700b),LL(0x47bb5f1d,0x83b3ce11), LL(0x6b310318,0x31a48f46),LL(0x00612ef3,0x13a7f781),LL(0xa18db234,0xcd840f2a),LL(0x30611c74,0x3be2a7a8),
+ LL(0x2b1c0447,0xbdf37cb2),LL(0xfe71722d,0x7f572382),LL(0x25535e86,0x085b3566),LL(0x3f5b9cc2,0xb5b43063), LL(0xdee66228,0x7c7cff51),LL(0xb676fd6e,0xe29236ae),LL(0xab0cdb1a,0xf0c0105e),LL(0x06b52812,0x0adc9d6e),
+ LL(0x483baf0f,0xc9e6ca97),LL(0xf9bf5055,0x09b063bf),LL(0xfc5a407f,0x8c4c6b2a),LL(0x99a6f540,0xe29cb487), LL(0xcb9a2758,0x18b72239),LL(0x8a5ed308,0xa0ae9f10),LL(0x6e402657,0x2a2cb603),LL(0xaf6f4d14,0x9c7f52cf),
+ LL(0x70ca9046,0x0ed032e7),LL(0x59cac9e9,0xe4b0b1d3),LL(0x18462dfd,0xd12c87b0),LL(0xbb8860dd,0xa25a23ee), LL(0x507fa3d9,0x6c9a8676),LL(0x218f325f,0xc6bb96c4),LL(0x2386b7b2,0xe141bbb8),LL(0xd4183c77,0xf86a72d0),
+ LL(0xaece96b6,0x35537f86),LL(0x63f7e1fa,0x83aa1df9),LL(0x7ac4aaf2,0xa39ab4aa),LL(0x8a202375,0xb8d0ffa6), LL(0x86514cd8,0xd916df09),LL(0x11902747,0x71f905b3),LL(0x8c744f32,0x6388c2ee),LL(0xa5431096,0x6282e1f5),
+ LL(0x7c388413,0x14bfa765),LL(0x7b4437aa,0x95dd04d9),LL(0x3c39d7c3,0xdf6ca849),LL(0x0c2ddf38,0x85cb1123), LL(0xc401529c,0xf7766d86),LL(0x99a4d031,0xe33416a8),LL(0xb874ace4,0x5c507c3f),LL(0xdad6fcb0,0x0e3a42b6),
+ LL(0x47920742,0x402da460),LL(0xb45f94cc,0xb142d6ef),LL(0x76608dd4,0xc2d613e8),LL(0x5d75d4b5,0xa2c06cdd), LL(0x3c564ff4,0xa1951bc5),LL(0xad1d5ecd,0xe60f126b),LL(0x702135ad,0xa634e765),LL(0x8df44695,0xa5a56a6e),
+},
+/* digit=30 base_pwr=2^210 */
+{
+ LL(0x9e2207b4,0x234b8c7a),LL(0xf7ee9f62,0x1f724f30),LL(0xc58e21b6,0xfa908ca2),LL(0xa74296ae,0x55587744), LL(0x02911ae1,0x7dbe9130),LL(0x9d3af02e,0xc2075433),LL(0x0f3955a1,0x505b724b),LL(0xcaeced66,0x480e1a92),
+ LL(0x446d9f66,0xb20f6128),LL(0xc354b5a1,0xd6e06b14),LL(0x63558aac,0xa72d287d),LL(0xae68a8fd,0x4819be29), LL(0x205fbdf2,0xb024c324),LL(0x210927f9,0x2fca94e7),LL(0xbe658f80,0x74798be7),LL(0xef07c046,0x618e07f1),
+ LL(0xb35a8c3d,0xfba715fc),LL(0xed1beba8,0xc2548193),LL(0x2ceb663c,0xb956c6dd),LL(0xaacafe85,0x13d4ddbe), LL(0x30a29cc3,0x2f8275b5),LL(0xf51b39ef,0x10432e15),LL(0x2509b2d0,0xd6c9277c),LL(0x849b946c,0x4ee0d4c3),
+ LL(0x54b01bbc,0x547ba946),LL(0x055d4821,0x7c56c36d),LL(0x05575f20,0x8e933620),LL(0x3a621cf4,0xaec65be9), LL(0x46287937,0x820b96df),LL(0x733c67e7,0x35cea883),LL(0x58cf3e05,0x30366a3a),LL(0x2da39773,0x2580d565),
+ LL(0xba4417ed,0x7717c42f),LL(0x654c1086,0xb2d66fc7),LL(0x57503cd8,0x07fe918e),LL(0x3cacf74f,0xf9385159), LL(0x63063029,0x157d9081),LL(0x659034cf,0x79c84c08),LL(0xa8048cb9,0x02976610),LL(0x03e81417,0xef822006),
+ LL(0x22e489c6,0x5fb5dd4d),LL(0x81e167e9,0x9a06d9c2),LL(0x6b974c90,0x83fc248f),LL(0x7110dca6,0xb78cab72), LL(0x370ff66a,0x73f8f311),LL(0x3b61d20f,0x8c5049eb),LL(0xc8516e05,0xaac47edb),LL(0x53f0201b,0x2ceba50d),
+ LL(0x0b93fbc7,0x6679dc5e),LL(0xa560bd27,0xf4457919),LL(0xb1acadc9,0x2561bfca),LL(0x46708164,0x338fbb6d), LL(0x8b9cfd27,0x9f407621),LL(0xd3123732,0xe806c1e6),LL(0x7f24a161,0xaa1eafc4),LL(0x68e6650b,0xbee3f4a1),
+ LL(0x5832cd6c,0x453b6181),LL(0x985e90ba,0xc002e337),LL(0x6414f686,0x4b33afde),LL(0x8511fd45,0xf9ab29e9), LL(0x6fb9a688,0x067f0972),LL(0x7202a1b3,0x7db6e14c),LL(0x73a881ab,0x0c15b6e9),LL(0xfad10660,0xc8c324e0),
+ LL(0x87d9f927,0xa997a6d2),LL(0xacd2f107,0x62307f24),LL(0x9c80a742,0xed7b48a5),LL(0xa7c81e7e,0xecd33ae5), LL(0xefa00a94,0xcf05c763),LL(0xd9ee5aa7,0x38844b0d),LL(0x214b293f,0x02e0b05d),LL(0x8a8a510e,0x732e776b),
+ LL(0x6c929e53,0x784cd909),LL(0x56a33da2,0xe436e294),LL(0xce9e06d2,0x68eeb727),LL(0xfce7e2f0,0x637890b3), LL(0xc3fde38c,0xc0681a1c),LL(0x76dda134,0x9cb729d9),LL(0x5c333ece,0xaa69eb97),LL(0x48eed8a6,0xe138a680),
+ LL(0x505dc701,0xd53cbd01),LL(0x6a64c3d1,0x413de346),LL(0x3170a5bf,0x91f6cde9),LL(0x8489b5fa,0x58ffdfd9), LL(0x5c584a48,0xcc0b89d7),LL(0x167f28de,0x74f8ceed),LL(0x8c878c91,0x250fa9f7),LL(0x630adfdb,0xeb960a79),
+ LL(0xc9489dcb,0xe43ed412),LL(0x112d084b,0xcec053a5),LL(0x664c7cd2,0x0fd4fe42),LL(0x82a917f7,0x48ee06f4), LL(0x83cd65f5,0xc5de1970),LL(0x5569c42f,0x3a176578),LL(0x4f876110,0xf24508f3),LL(0x0a415bc4,0xf350374b),
+ LL(0xc63aa8ad,0x9c2b11c2),LL(0x7a51c0cc,0x6ac1ae12),LL(0xe1db428f,0x75acd0d7),LL(0x19800684,0x9e391227), LL(0xb1050426,0x4f89e9c6),LL(0xdaf99eee,0x099d97cc),LL(0x1ffce97f,0x27a19ad0),LL(0x3c038d77,0x05fad057),
+ LL(0x8597d09c,0x96d6c678),LL(0x1e1d8b57,0x38f6336c),LL(0x6330ace7,0x1f945bef),LL(0x613f9faf,0x9d627bbb), LL(0x19176cb7,0xc0e7f21b),LL(0xbb9db710,0xf0e09be3),LL(0xc650133c,0x16b06011),LL(0xf3673d7c,0x8629b975),
+ LL(0x67115575,0x8c8230b2),LL(0x9c9f30c0,0x9bfc55b1),LL(0xce93fd71,0x132d0e07),LL(0x511c5947,0x08e4736e), LL(0xfe881630,0xd54a098e),LL(0x98efa501,0x8ec67a85),LL(0x2267db00,0x72975dc7),LL(0xa338290d,0x3d6fc706),
+ LL(0x55ade88b,0x0c891082),LL(0x4b212e85,0x0525b501),LL(0xb61362fa,0x9ede010b),LL(0x881eecac,0x52f3d088), LL(0xbc6f0ae4,0x49957b6e),LL(0x1659701d,0x25fe7263),LL(0x07b76f45,0x41e9b7f5),LL(0xbda77d42,0x5f2ad664),
+ LL(0xa9c418c4,0x5bdcb490),LL(0xe500a527,0xd0e2c38d),LL(0xca83fada,0x0af29f6b),LL(0x62273db6,0x1f75b1f2), LL(0x9e857e57,0x8454f751),LL(0xb9e79612,0x3fb816d1),LL(0x6412b5f3,0xbe3040ae),LL(0x843ca984,0x99535136),
+ LL(0x3257f19d,0xb26ec8a8),LL(0xe54dd785,0xd32dc622),LL(0xf8698ab5,0x0c52e874),LL(0x79183316,0xf9a60af5), LL(0xf7f4496a,0x38575d53),LL(0x3d5cd0de,0x33adfd1e),LL(0x7f502017,0x2133f4a1),LL(0x3e8676f8,0x46c09393),
+ LL(0x3fb4c7fe,0xca8a5a58),LL(0x328ff257,0x2ad58826),LL(0x13b8d08d,0xd9264875),LL(0xdc5a845a,0x661ae2b2), LL(0x49a408d3,0xd2dcaa06),LL(0x85c21e84,0x9ef164f8),LL(0xb7819b61,0x55efaf85),LL(0xf504c32a,0x9488bb1c),
+ LL(0x9bb777fc,0xb571518c),LL(0x82415187,0xf369c391),LL(0x2720284b,0x2d7c5dd9),LL(0x4eec41cc,0x6feab634), LL(0x24ecd0be,0x2522d5db),LL(0x00338736,0x1fca0d97),LL(0x20145279,0x74416105),LL(0x0496e925,0xf4492e1e),
+ LL(0xbc33b547,0xa62e09fc),LL(0xae063835,0x9434475a),LL(0xa139b769,0x51edd69f),LL(0xe5166a9d,0x17bbe224), LL(0x1b4b6c84,0x6ecb0a02),LL(0x97968c70,0x16439490),LL(0xbc8aa671,0x75af0456),LL(0x3b4411ff,0xaef056ab),
+ LL(0x05cef121,0x686b7714),LL(0x078f4500,0x5ad6bdf3),LL(0x072e70eb,0x56df858c),LL(0x254c0917,0xa0fc5e6f), LL(0xc15bf9cf,0x1a99de09),LL(0xd008aacb,0x8aeb587a),LL(0xb900d652,0xba2d8c53),LL(0xad0f69b6,0x60eb5d0c),
+ LL(0x10b27762,0x27098ff8),LL(0x13264ed3,0x33329ca9),LL(0x887e3f40,0xffceaf40),LL(0x930df9ef,0x854b8284), LL(0x7d5627be,0xdda913a8),LL(0x35e9823b,0x8eb94d64),LL(0x2eb9e9bd,0x94c527fd),LL(0xf57b9f74,0x18335b1b),
+ LL(0xd193a526,0x3c44dac0),LL(0xe2b2d54f,0xd0717099),LL(0xc4c67d11,0x65624fb4),LL(0xbccedad8,0x04aa7033), LL(0x31470c52,0x0c522fac),LL(0x33b05d54,0x08eb33ca),LL(0xb4565e57,0x940e0693),LL(0x7be56370,0x7e2fd553),
+ LL(0x12e206ff,0xf722793c),LL(0x155d3d02,0xb57e1f23),LL(0x94fc6ce3,0xd68be193),LL(0x22d4815b,0xb0f3606c), LL(0xb62d5741,0xdaf995a9),LL(0x3e8f5df5,0xa7d19980),LL(0xe4631583,0x7bcdb661),LL(0x5a97dc7e,0x013193e3),
+ LL(0xfc73494b,0x8210be46),LL(0x57e10efc,0x508817ee),LL(0x126f2466,0x7b6b8da2),LL(0x177bee35,0x2f3b0ec6), LL(0x48db1eef,0x5ceb71e0),LL(0xdc62b6bc,0xd989d9c3),LL(0xf78fac92,0x2cc38cb9),LL(0x955ba5f4,0xcd2a009f),
+ LL(0x453b668e,0x65a74191),LL(0xc081b447,0x40e9dc38),LL(0x8c3fdf2c,0x48eb63bf),LL(0x5763071a,0x7845cf66), LL(0x787754ca,0x30d9b771),LL(0x8783a05a,0x10b3729f),LL(0x6ab570d9,0xf8090b3b),LL(0x502b3558,0xc1dfbde1),
+ LL(0xbe4d36ec,0xa568f5d0),LL(0x28e952fe,0x1e9e5393),LL(0xeaad6b24,0x768113f9),LL(0xa8fbede9,0x2bc798fc), LL(0xaaa9010d,0x2c787f9b),LL(0x761834ca,0x32cbc77a),LL(0x032c25d8,0x449e55f7),LL(0xca6216dd,0xe824a5bf),
+ LL(0x17ac1130,0x3beaec52),LL(0x5e9d1aa8,0xcc28c64b),LL(0x3af8c635,0x355d68bf),LL(0xd3d1adaa,0xcd12e443), LL(0x6c2030d8,0xa456daca),LL(0x62427eff,0x0dfe5bbb),LL(0xf69e2484,0xae45325d),LL(0x7245c979,0xfc2a90ab),
+ LL(0xa008b446,0xc34f38e9),LL(0xaac355e0,0x5e86163d),LL(0xd586a2fa,0x61432646),LL(0x3d92e0c3,0xc68c7c8e), LL(0x020c1dd6,0xbfa8c268),LL(0x8bbcc223,0x25788741),LL(0xef62642c,0xbaf8c9a3),LL(0xa8c496d2,0x6d2f1ae5),
+ LL(0x44e57ce4,0x92d1c805),LL(0xaacd2100,0x34cdf4a3),LL(0x31e9c649,0xd5b89e4d),LL(0x232cfc85,0x558a6e26), LL(0xcea31a31,0xb40f3e4a),LL(0x35c5c924,0x346c1e07),LL(0x3fcede81,0x8ffedd8e),LL(0x3b55d143,0x35269ba3),
+ LL(0x848bdc53,0x0366065a),LL(0x078554dd,0xba2af074),LL(0x19ff3b4d,0x3c755fba),LL(0x35a22cbb,0x5ea93372), LL(0x1eb3e23b,0x0e55fe02),LL(0x765dede4,0x2626ecca),LL(0x81f445da,0x187bf094),LL(0x9df30578,0xba011017),
+ LL(0xd72507f2,0x81148037),LL(0x5db072d0,0x3a5841fc),LL(0xbd910aa1,0xfd631862),LL(0x23881c60,0x17b22d68), LL(0xfcc13359,0x6fa799cb),LL(0x2d39fc5a,0x55c40219),LL(0x9f1f6515,0xd50bfff6),LL(0x2e30fa1a,0x575090b5),
+ LL(0x9ba20c27,0x70343a0b),LL(0x749306a5,0xef34db86),LL(0x4ba85f8d,0xd7ad61d2),LL(0x7e091a33,0xe4d24ad8), LL(0xfc348493,0xbd6b49b9),LL(0x299c325d,0x4f11b543),LL(0x55036e93,0x4574a254),LL(0x676b75d9,0x534a623e),
+ LL(0x7d05afbd,0x54aa3d8a),LL(0x7f3f2c90,0x13349009),LL(0xa94b18aa,0xcd03de0f),LL(0x855c050d,0x13123c18), LL(0xf598b5f8,0x747c3cda),LL(0x8644df20,0x0f7ed9b6),LL(0x08d73585,0x45e010fd),LL(0xf8cec4af,0x3b0ff430),
+ LL(0xb028a832,0x3745a41f),LL(0xc4106172,0xcd6d2468),LL(0x1eceac6f,0x56c5a9b0),LL(0xe1e6e980,0x769c1285), LL(0xfa113196,0xbd163a36),LL(0x5840c242,0x206ffc36),LL(0x9c57ef67,0x12de1147),LL(0x03bea885,0x50260273),
+ LL(0x9684d63f,0x3099c21b),LL(0xc7c66691,0x06adb196),LL(0x3d63b3be,0x8464492c),LL(0x0bd38c15,0x86024ef4), LL(0x10565cbf,0x226022a2),LL(0xc9899033,0x2ae6b298),LL(0x262ffa14,0x5564856b),LL(0x7e038b55,0x9472d0e1),
+ LL(0xb1dd268f,0x1b17ea07),LL(0x4899352e,0x8340b9d5),LL(0x75242992,0x4f159400),LL(0xe6727e9d,0xe4392a31), LL(0xaef59026,0x4df1ef86),LL(0x950cfee6,0xe40671ff),LL(0xde4dd990,0x7b36d1cd),LL(0x3366ff4b,0x25df10a6),
+ LL(0x584ef631,0x83fb7e59),LL(0x91af7b6a,0xf12dd400),LL(0xe26f11c7,0x4a5ae41e),LL(0x96d90445,0xeb86d5dd), LL(0xa355d0a3,0x028ae37e),LL(0x99260127,0x3c118ef4),LL(0x76f51bd7,0xb8c7538c),LL(0x5fbadc4d,0x66b90aae),
+ LL(0x17dfd0cf,0x078de9df),LL(0xfe44b17c,0x938df6da),LL(0xc40bc950,0x4a09616b),LL(0xbc969aac,0x0b507845), LL(0x35f7fb82,0x23bae091),LL(0x9ad29b83,0xebc04d37),LL(0x26a3c5fa,0x9fa48a5b),LL(0xf08f3d8c,0xf67c661c),
+ LL(0xb2e9c3a1,0x21825747),LL(0x46c3eb43,0x3520a82e),LL(0x9646183d,0xe309ae9f),LL(0x26dac288,0xa19c31be), LL(0xc76623de,0x3c37018d),LL(0x64b51087,0x59b9a0fa),LL(0xf1954f4e,0xa32f8357),LL(0x1f6da143,0x24251df4),
+ LL(0x01fb07d0,0x825c61cf),LL(0xf2f0243c,0x69ae93fd),LL(0x0943f7bd,0xd507c99e),LL(0x463ee64a,0x5e6dfb09), LL(0x29afd00b,0x10a3c32a),LL(0xbe8cbada,0x92179b5f),LL(0x7d89f9a6,0x7bebad0a),LL(0xd13b3073,0x7ba9bbf6),
+ LL(0x6481cc75,0xfc23c215),LL(0xfeca7532,0x6a654801),LL(0x0fed841f,0x20785ec0),LL(0x25269b21,0xcb612be9), LL(0x414a0fab,0xe9a9c09b),LL(0x6b4fa0dd,0x5404c7a7),LL(0xcb418588,0xde62dae8),LL(0xc594334e,0x2d80afd4),
+ LL(0x95366a44,0xfe454df1),LL(0x755cf8b2,0xda7626c3),LL(0x41397051,0x4446f0ab),LL(0x70eb8b23,0xd1788064), LL(0x977b040a,0xbc7737f1),LL(0x57590edb,0xbfb39418),LL(0x343a7333,0xb094b4a8),LL(0xeb91372f,0xb15912ce),
+ LL(0x0b56002c,0x584e1d5e),LL(0xaa0cb90f,0x1460ce24),LL(0x8f7ffcb6,0x58f0c144),LL(0xbe0d802e,0x56e39f33), LL(0x529458d0,0xb02a6edb),LL(0xa730f9d5,0xa0fbae74),LL(0x1bf69928,0xd98c0ac5),LL(0x796f12e9,0x5c9f888f),
+ LL(0x22e065c8,0x749207b0),LL(0x88c61143,0x6e0232a4),LL(0x837adda6,0x27f30808),LL(0xd0c215d5,0x0b748853), LL(0xbf076ba7,0x97bc4008),LL(0xf157f4d2,0xadae0275),LL(0x8bcba88b,0x394e5d7a),LL(0x23ef50ad,0xf995ec14),
+ LL(0xaa9b60a9,0x6b207f9c),LL(0x52f9979f,0xcd7509c1),LL(0x0834e0ad,0xe3e8f6dc),LL(0xcd5b1314,0x6e2a4165), LL(0xfd60d975,0x073a2db3),LL(0x2c053b7a,0x5ad92ca4),LL(0xfba97ae8,0xceb10220),LL(0xd265e913,0xab82f6a0),
+ LL(0xaa68a13d,0xc7a755ad),LL(0x10dd277a,0x56c13360),LL(0xdef56183,0xbbcf6411),LL(0xb863a4e1,0xebffe360), LL(0x814e8aec,0x67ff26e5),LL(0xa0804732,0x90553561),LL(0xad5fe672,0x407396ac),LL(0x11ad53af,0x053a068b),
+ LL(0xc652cb95,0xb518dd04),LL(0x57e2b99f,0xc818563a),LL(0xb96432a7,0x217cf87d),LL(0x8cc2fdcd,0x7fdc35be), LL(0x4effaebf,0x8c2ef271),LL(0xf427c7c2,0x21879369),LL(0x5197ba08,0xd80ebbea),LL(0xfc6f4c66,0x1b00db45),
+ LL(0x3828a5c0,0x99b9d2be),LL(0xd24a69e8,0xa8855350),LL(0x3ceaa821,0x2f919695),LL(0x04296439,0x89390c91), LL(0xc5cf8a0c,0xc12b3852),LL(0x73afc431,0xdcf234ea),LL(0xf4adf01b,0xdddf5568),LL(0x1b426097,0x2d04fc76),
+ LL(0xcb27c5e0,0x02a21dd5),LL(0xa6b2f9b3,0x01b842c3),LL(0xd8bd7a07,0xefbd483e),LL(0xd13a781e,0x0220825e), LL(0xde802c17,0x8aa029a0),LL(0x3a3f0fbf,0xb62fcd6e),LL(0xe9635f48,0x80558aff),LL(0x65dbeb2d,0xbdc6851d),
+ LL(0xb5412271,0x99f48286),LL(0xe242a8a3,0xa53ef798),LL(0xc0371086,0x41d18606),LL(0xfcb6d1aa,0x5df3379c), LL(0x00a7a13e,0x53f2f5a1),LL(0x2bf51e2a,0x3565a6eb),LL(0x930c5a71,0xa2832b52),LL(0xee2abfcb,0x66071ec7),
+ LL(0x3496a532,0x75ce0a56),LL(0xbe0d69b7,0xa316dfbb),LL(0x353e94fc,0x35438d6a),LL(0x1e0ce775,0xf53433c1), LL(0x22ff3a1d,0x47ea3e8f),LL(0xcd7ccdb6,0x60ebfba8),LL(0x33c475d0,0x47c6b6e2),LL(0xb7959fd5,0xd18637e7),
+ LL(0xa1ae3404,0x8d7a35ce),LL(0x75b832bf,0xf15c71d6),LL(0x98b9d24b,0x65047419),LL(0x0dcf73f4,0x28625a55), LL(0xc7c99478,0x5aa9dce8),LL(0x0bde8d53,0x752d1625),LL(0x93e99ee4,0x7255ecfa),LL(0x22706f48,0x1c53bf71),
+ LL(0x4d478014,0x28335451),LL(0x3f392c0a,0xd64b05ff),LL(0x4fba1661,0x1d9ac89d),LL(0x34828cd8,0x281a0ffb), LL(0x577ed419,0x07abacdd),LL(0x3cfb2c56,0xa66949f5),LL(0x847ebe65,0x38e69105),LL(0x44d6236d,0x8fbbba5a),
+ LL(0x725ef820,0x0c85bd64),LL(0x25a152a7,0x4ef91524),LL(0xb019cebf,0x5237ef0e),LL(0xc9a7724f,0x48203f41), LL(0xc55fc0d4,0x1f61885c),LL(0xbcb3daeb,0x2c4dd07a),LL(0x4b7dafc5,0x9855d5e7),LL(0x5f3769af,0xd76e6fdf),
+ LL(0xbb547be6,0xb834df1a),LL(0x3e7a9586,0x43056b12),LL(0x4375fc7e,0x7459e0bb),LL(0x9c85fc6b,0x5f5f295a), LL(0xbb23b709,0x3f2d2bb7),LL(0x955983ce,0x0b53bd8c),LL(0xfaf68dcc,0x5aee93df),LL(0x509f09dc,0x5575770c),
+ LL(0x40b1b744,0x2bf23c0c),LL(0x9a5bb913,0x524154bb),LL(0x296bdb2e,0xb0e93d76),LL(0xda0b2925,0xb3c71f5b), LL(0x0c617939,0x8e77ae7a),LL(0x1aca9b0a,0x2bfea97e),LL(0x7897c5a8,0x8e3317c9),LL(0x4cee2716,0x850ddefb),
+ LL(0x107d9186,0x684ceee9),LL(0x0082c312,0x48708423),LL(0x6c556897,0x5300137c),LL(0x7e99bc76,0x6d464401), LL(0x8808ca2b,0x6b11e1e3),LL(0xcca6433e,0xedd30eee),LL(0xaa072ff0,0xa9099f60),LL(0x5830f69d,0x774662ec),
+ LL(0xf94547d9,0x0770355c),LL(0x42967865,0xb5041edb),LL(0xe585a93b,0x169a6274),LL(0xd04d6a81,0x06cebf5e), LL(0x2ebc1791,0x0a59450f),LL(0x765ac18a,0x69fd006e),LL(0xa54f7e7a,0x4711ec9c),LL(0x819c6af9,0xd72c8d58),
+ LL(0xb5418e15,0x89c97c6c),LL(0xa558a854,0xd520b03c),LL(0x0d76773a,0xe3c24aca),LL(0x67e5110e,0xc4deb5ce), LL(0xcbb04ba4,0x5bb40152),LL(0xde1b628a,0x672563b6),LL(0x2e8d9e54,0xaec916aa),LL(0x3c60ac70,0xa4e8cb47),
+ LL(0x452d5064,0x54a03e39),LL(0x1e7bb355,0x1e405c2d),LL(0x3bbd3ab0,0x2ab2d5df),LL(0xdbc9fbd8,0x0808410e), LL(0x27f23f6f,0x4180ceea),LL(0xba1d6beb,0x2b965b35),LL(0xf66d6546,0x14f1f010),LL(0xf85cfb4a,0xefdca6a8),
+ LL(0x6614c1c0,0x69e6188e),LL(0xe07cb7f8,0x00bd1531),LL(0x4bb7ee68,0x1b90f515),LL(0x51abb1f3,0x8afdf466), LL(0xb5f34316,0xf59a7327),LL(0x64c7bf22,0x43c3c19d),LL(0xcdb00a2b,0xb275733f),LL(0x602915ba,0x0160df79),
+ LL(0x1baea574,0x1ae4ee9a),LL(0x03ae5168,0x0d922f28),LL(0xca691124,0x07df28fd),LL(0x8dd457c4,0x5aad2f31), LL(0x137384ca,0xe0d4f443),LL(0x6620ea8c,0xd93d424a),LL(0x5067797a,0x21d544d3),LL(0x9d8a15bc,0xc8a8cc99),
+},
+/* digit=31 base_pwr=2^217 */
+{
+ LL(0x941d80a3,0x610f0e26),LL(0xad36514e,0x30927879),LL(0x98f22601,0xaa2dfd48),LL(0x88c8b0f6,0xbc5b31b7), LL(0x6c841cc8,0xb1281f37),LL(0x5a412b84,0xdae16719),LL(0x828f210d,0x9ec1f6c8),LL(0xe8d92901,0x1935d576),
+ LL(0xaf3840f2,0x47247921),LL(0xdf3fcdfc,0x348325d2),LL(0xc43961bd,0xef578508),LL(0x1bd98c29,0x7d5e8ccd), LL(0xf8a30164,0x59cdba10),LL(0x7cb8c653,0x0757408f),LL(0xc3056ef4,0xcd7ed73f),LL(0xfb99cd1b,0xd28e7cc1),
+ LL(0x6bb62286,0xa8a67494),LL(0xe7d87467,0x8d6ef816),LL(0xf673b6d5,0x3529f938),LL(0x8bbf101b,0xf5c0ee76), LL(0x49fdc949,0x3768ed61),LL(0xcf405ee0,0x53b6999e),LL(0x1718e51a,0xbf0108a0),LL(0x5181ebd7,0x38e609ec),
+ LL(0xd8595159,0x82051640),LL(0x579a3876,0x30e1c706),LL(0x0298a67c,0x091154c6),LL(0x51132d27,0x76d9a9c9), LL(0x5c661a4d,0xe41de8b7),LL(0x2a6dcbaf,0xf24b5e96),LL(0xd714e045,0x1ed4cb0c),LL(0x0c187c70,0x605926a4),
+ LL(0xf34b1c93,0x97672559),LL(0xe0b43506,0xa256be98),LL(0xe1a98eb3,0x7fcdd412),LL(0x295a061b,0x7fcfcd84), LL(0xcc2386cf,0xddbac22b),LL(0x928c2556,0x7741adb7),LL(0x4e6e1288,0x3a2bb869),LL(0x025bb4a1,0x53ed11da),
+ LL(0x4108c8e2,0xb114bd67),LL(0x3deb8e23,0x85948c6b),LL(0xd0e9434c,0x6a9e05d9),LL(0xb9c4fd70,0x395060b7), LL(0x18893751,0xa0ccfd16),LL(0xbbf65477,0xa941ff60),LL(0x59423e35,0x34ada238),LL(0x7e570058,0x4ba7a7d1),
+ LL(0x869ae596,0x3d05d455),LL(0x93368325,0x92a15400),LL(0x62eb7ffa,0xbd64ae0a),LL(0xd34b2c59,0x3f263a7a), LL(0xa22244e1,0xe95eece3),LL(0x706fc500,0x39ccef58),LL(0x22f1d2e6,0x39a88f93),LL(0x6d47c670,0x1ec796b3),
+ LL(0xaa1ff4af,0x1558e0f2),LL(0x390503a4,0x61f43487),LL(0x3c4f76f1,0x66164732),LL(0x9e13432e,0x50d0706e), LL(0xf5eba0fb,0x5f1a87ca),LL(0x80bda2c5,0x28a95c0f),LL(0x12ae6462,0x10d693e0),LL(0xf45e6ba6,0x79871340),
+ LL(0x887051c0,0x8abf0cad),LL(0xb3c6b540,0xd09f571d),LL(0xe30ab25d,0x3fb2e16b),LL(0x539e8bc4,0x12e057a7), LL(0x733c2597,0x6efe71ce),LL(0xe71058ac,0x72fa0df5),LL(0xccc037bf,0x49f14d06),LL(0xceb3eb6c,0x9a3ceb03),
+ LL(0x4195370a,0x9895e908),LL(0x927345e7,0xa75007e5),LL(0xd3850711,0x00b4c212),LL(0xdfee8b34,0x76e4060d), LL(0x184c1d07,0x15801862),LL(0x302f5711,0x234e39c0),LL(0x6aa74204,0x4c0bd387),LL(0x6f496836,0x0515eddc),
+ LL(0xc849afbe,0xa9fd0cb5),LL(0xcad5c0aa,0x041df5ba),LL(0xddff259e,0x9a54af37),LL(0x9b550a8e,0xa3f156bf), LL(0x7e3298d4,0x4df2d33d),LL(0x65ff0e1a,0x0957a0a0),LL(0x1e2b3a45,0xff7fb43d),LL(0x1a73285a,0xb86d386a),
+ LL(0x28b18e93,0x6e283c47),LL(0x4b4132ed,0x5458b92f),LL(0xba674332,0x7026345e),LL(0x5c9fc32d,0xc8e38151), LL(0x58e7b4fe,0xd6aaf8e1),LL(0x4267253a,0x3e77a5c9),LL(0xa0949607,0x6441cba2),LL(0xdee20b2e,0xfa205185),
+ LL(0xf5b44600,0x64f3d576),LL(0xef5c8446,0xf12125db),LL(0x487a0116,0x1467539b),LL(0xf380229a,0x3aa0fa49), LL(0xd79f36dc,0xcc6586f1),LL(0x1b9a0b42,0xebcf653d),LL(0x9c1df729,0x68af006d),LL(0xa7903ee6,0x507e055a),
+ LL(0xafd8ac9b,0xd1b48ef8),LL(0x3b5f6b51,0xd8920af7),LL(0x983339c8,0x9629e789),LL(0xfa9248d3,0xbfd2d787), LL(0x9a078882,0xb50ca302),LL(0xf5cb0529,0x1c34f848),LL(0x1646a9f8,0xb9b01519),LL(0x80d53f9d,0xc9e3679e),
+ LL(0x1af3e5f2,0x5a63e822),LL(0xff58e3d1,0x05480ad8),LL(0xd6b3626b,0x2d241643),LL(0xc1eda15f,0x33b15660), LL(0x8528e5d6,0x3e74f855),LL(0xf63188f4,0xafb6dc9a),LL(0xaeeb1d32,0x0cac44cb),LL(0xa627eff8,0x50661046),
+ LL(0x64b49667,0xadc4b012),LL(0x1e05f760,0xa4bdafa7),LL(0xf185d27a,0x171b28b3),LL(0x33425747,0x987e5163), LL(0xc3864a65,0x7c42ac4e),LL(0xbf449c12,0x2dae1bb8),LL(0x06965832,0x680d9743),LL(0x7e31d9f4,0x6ac1ef01),
+ LL(0x579d6ae4,0xdef57433),LL(0xd5240bf9,0xe055b087),LL(0x90a5e069,0xe4dbbe60),LL(0xddb3dc15,0x2161d5fe), LL(0xda297b71,0x7d303012),LL(0xd468046c,0x04481034),LL(0x0ac93c6c,0xaa94d5bb),LL(0xd8d8f53a,0x95bacd45),
+ LL(0x3e03e895,0x790a5d6f),LL(0x44fa5a81,0x27efd502),LL(0xe5998b32,0xd9d35230),LL(0xf22ade19,0xb36a0c07), LL(0xf979a2fe,0x46ec8691),LL(0xced8cb94,0xa67ba933),LL(0x2f856ab3,0x00d07245),LL(0x3c925dae,0xadc9ff42),
+ LL(0x563038a5,0x0e4eaa25),LL(0x8a8f6483,0xfef7e89c),LL(0xace61af8,0x50433633),LL(0x2e1a3515,0x8a1589e0), LL(0x5fdcb1ac,0x99f21e29),LL(0xc9a466da,0x8fd2d411),LL(0xf56b7f13,0x55323c6f),LL(0x5cff438c,0xa016d64a),
+ LL(0xdc05b5cc,0x3e3dfcbc),LL(0xfc3c70ec,0xc1956ca8),LL(0xe63f02df,0x7dbbd169),LL(0x240b87c8,0x95206689), LL(0x1aa6d48a,0x7bacda5e),LL(0x39280f78,0x51dcf19f),LL(0x660abac2,0x1511ae04),LL(0xd905af53,0x3a95adc9),
+ LL(0xea464737,0x0c8c4330),LL(0x34fc4b51,0x989c09c4),LL(0xe2cf3376,0x1852120d),LL(0x25c04de3,0x5a1cb8a8), LL(0x75fe7596,0x50486f98),LL(0x223030b1,0x8cd78d2e),LL(0xcfa1ab11,0x524cb8f8),LL(0x5a15b0b9,0xa716ea3f),
+ LL(0xb902d114,0x7618e95e),LL(0x084ebf5d,0x0a1a4146),LL(0xe3f87683,0xdfb909e9),LL(0x4107410c,0xa0b7eee1), LL(0xf02b0e12,0xa45a551c),LL(0x9efccb9f,0xceabbfd2),LL(0x740f4e3a,0xb0d1b6bc),LL(0x4cbfd0de,0xfc737250),
+ LL(0x32452b0e,0x3fad2d9e),LL(0xf523527d,0xb4e659fe),LL(0x6c0ff353,0xf0dcd701),LL(0xd67b6f98,0x28f06e2a), LL(0x82a789b4,0x2d0c36ce),LL(0x49c0d54e,0x20e577da),LL(0xae38dd0e,0x8d1d5c7f),LL(0x894d9143,0x72e01399),
+ LL(0x3958e055,0xf7806856),LL(0x5df44aee,0xac35ee40),LL(0x97c18b8d,0x2b478913),LL(0xfa2586cd,0x5396824e), LL(0x1b23f8c4,0x22b37b25),LL(0xcdecdefa,0xf9ced36e),LL(0xc2fc39c0,0x28c3bee5),LL(0x6d9db32b,0xa1731fae),
+ LL(0xbc3e2c91,0xa0445fa7),LL(0x75a4aa72,0xa1ab6955),LL(0xbbe0a1c7,0xf0cd61c6),LL(0x0123bc52,0x923c3b69), LL(0xafd7c4bc,0x818ad28c),LL(0x28b15b05,0x7c229224),LL(0x1f78a4f4,0xecde7efb),LL(0x03ef3ab3,0x550d68e7),
+ LL(0xfc5f8c35,0x0371021d),LL(0x0ed2b06e,0x4440aa1e),LL(0x9ba7247d,0x70c8ede9),LL(0x84f23fde,0x0d2b6ed3), LL(0x5ff4478c,0xd0119d95),LL(0xf79c69d5,0x66152d27),LL(0x02afd13b,0x56d8bea4),LL(0x15bb938a,0x035efe5f),
+ LL(0x2ccaa425,0xc5ca7d08),LL(0xeeee9376,0xc8c69ea6),LL(0x493a2051,0xb22cfe59),LL(0xdc7b90fb,0xcb50e618), LL(0xe05a8705,0x0f6fdf2b),LL(0x4814df31,0x081f3fe7),LL(0xeb1e3e76,0x6fefe18a),LL(0x03e06a50,0x81910050),
+ LL(0xdb45bfea,0x8a801df1),LL(0x7a828cf6,0x8c7fe1fd),LL(0x8d173cfd,0x1c1868b5),LL(0x0dbde1c8,0xe18f0a36), LL(0x9ac345b6,0x3b29ed64),LL(0x9dcd07a5,0xd56d5956),LL(0xc6813a88,0xf4191570),LL(0xeda3af42,0x39033ebc),
+ LL(0xad5d215d,0xdee5591b),LL(0xafbe5a28,0x9cfa11c6),LL(0x1823c28f,0x73d0f1e2),LL(0xafab1f67,0x75d49925), LL(0x7c521448,0x61c81e2c),LL(0x4a96edb5,0xc547be6f),LL(0x4ca368b3,0xccb9fc59),LL(0x04fc3303,0x175ebe48),
+ LL(0xfce42989,0x507620cf),LL(0x9abfadb2,0xf236e043),LL(0xab36ab58,0x381c50c3),LL(0xae22c6a3,0xed4cb73e), LL(0x2158dc4c,0xa68a2827),LL(0xe9fa53ff,0x1715ac43),LL(0xfa266797,0xb02fdf73),LL(0x7eefb203,0x3079f3c7),
+ LL(0x7f7545bd,0x0a41fb94),LL(0xcb923ace,0x6b9dd022),LL(0x3bea2541,0x582c7ff5),LL(0x5ecdbe2d,0x992f2379), LL(0xfe17bdca,0x821f1670),LL(0x2626bdde,0x521c06f2),LL(0x1864ca0b,0x6292748c),LL(0x1bc74d8b,0x554d4ece),
+ LL(0xea3d4446,0x745d4f74),LL(0x40ad1c7f,0xa439f178),LL(0x51374e92,0xc95d9510),LL(0x90229008,0x75870e9f), LL(0xc54e7e81,0x3fec98c2),LL(0x94b3860b,0xef537ee9),LL(0x40bfc8f6,0x139dd834),LL(0x0f114403,0x20b51364),
+ LL(0x30b4b4db,0x4752a49f),LL(0x8c3c90e0,0xdfbb8b17),LL(0x70f0b16a,0x60c8915b),LL(0x40528319,0x5e395000), LL(0xa641f2e3,0x8a1624c7),LL(0xbb4ca0dc,0x3c9925c6),LL(0x2c3152b5,0x2aae6edb),LL(0x08b896ff,0x8dbac580),
+ LL(0xe5a36bc8,0xe0516205),LL(0x3295707b,0xd7714332),LL(0x51c3513f,0x61db6804),LL(0xab552df8,0xf2ee6e20), LL(0x353c17f0,0x5ddcfa99),LL(0x046d5fd4,0x65687a2f),LL(0xfd1ccad4,0xef567e9f),LL(0xa0238b70,0x7cd5f7dd),
+ LL(0x92c01197,0x96fba79e),LL(0x83b50e70,0x46a9f2de),LL(0xfe287169,0x7efcbbb2),LL(0x4528d67d,0xe30d60cb), LL(0x6cb04d3a,0x88fed0cc),LL(0x0221ceb8,0x63eb9d0d),LL(0x748b5813,0xc6954e9f),LL(0x5c96e897,0xceef2bd8),
+ LL(0x85648f04,0x99503ae2),LL(0x923e87d7,0xeee51f99),LL(0xb6560ceb,0x90908fca),LL(0x80e0f6b3,0xafad5926), LL(0xaea32cf9,0xa50f31f3),LL(0xa74ae92d,0x7ea17064),LL(0xcda71d1a,0x0675ccc1),LL(0x1e0a464a,0xd1e3b630),
+ LL(0x2442872d,0xa361f2b7),LL(0x46e52c97,0xb21bcd39),LL(0x85574630,0x1405f89c),LL(0x8e0a96ab,0x0da7bfbd), LL(0x4220f57b,0x48af06c2),LL(0x6a333e4f,0x772a9b12),LL(0x6f712eb8,0x3afc661e),LL(0x2eba8817,0x29deff6c),
+ LL(0xd8c69e5a,0xbab680de),LL(0xe93daf10,0xf8615abb),LL(0xcef6fae6,0x7455ea1d),LL(0x868455fd,0xac0a30ea), LL(0xe47d628a,0xae967b17),LL(0x65f1f482,0xa6d703e2),LL(0x0bfcc371,0x2723a965),LL(0x6db4a042,0x9b06cc14),
+ LL(0xa77c8b21,0xa973d738),LL(0xc008f2ed,0x9a981f80),LL(0xaf27cdb3,0xecc7bbcb),LL(0xb5cb693a,0x514db964), LL(0xe75c93d1,0x24125414),LL(0x1f00d53c,0xd9308c0e),LL(0x831eba6d,0xdb56d155),LL(0x672b86f1,0x29eefc2c),
+ LL(0xdd13b3c9,0x332f6ab6),LL(0xe371f873,0x70e052f6),LL(0x125712ab,0x05740742),LL(0xb3512100,0x4239152d), LL(0x80b22915,0x98355eaa),LL(0xb896f6fa,0xd0e263ec),LL(0x442b4c8f,0x9378a8a6),LL(0xf65795bb,0x40c2b546),
+ LL(0xd572ead8,0x0cfa46ed),LL(0x78361300,0xb9b4abdb),LL(0x8c102020,0x5fe63ef1),LL(0x785a4b54,0x1805c84e), LL(0x805cb642,0x147cf487),LL(0x487e581f,0x87cf50aa),LL(0x9eaebcd0,0xe942fa5b),LL(0xd1af71f2,0x06d4fa96),
+ LL(0xc4fc3823,0x20c1a770),LL(0x85140885,0xcdffd09e),LL(0x6b3592e9,0x27ce78ab),LL(0x8ba82008,0xb8e8c15e), LL(0xfef74187,0x5fe8f3f0),LL(0x77ce808d,0x8e85a3a5),LL(0xc7395f64,0x8447dc69),LL(0x1181b854,0xae90769f),
+ LL(0x456114c8,0x54adc101),LL(0x9ca6a9c1,0xe7962b76),LL(0x909410a4,0x3f0e77fb),LL(0x9e2e44f9,0xe18151cd), LL(0x2cf6e29e,0x5e510a0a),LL(0xb1836b07,0x136896ab),LL(0x0fe11010,0x3ad4fdec),LL(0xdbddf038,0x35b36790),
+ LL(0x75903df9,0x7c4f5a68),LL(0x2f5b7193,0x3e9cb056),LL(0x591a4524,0x745e9452),LL(0x1a056e15,0xc406ad44), LL(0xa69e11ef,0x2e93edf2),LL(0x73a1cb88,0xa28b82fd),LL(0x1225c3d5,0xdc1c9cda),LL(0xa5569794,0x86e9a994),
+ LL(0x5b092dde,0xd698506e),LL(0xd1ca8b06,0x076a4c82),LL(0x2ef2bc6f,0x4516033b),LL(0xd78fa65f,0x0574c792), LL(0x735bb362,0xa3b1c3d8),LL(0x0da54317,0x22fca7a4),LL(0x60aaebb6,0x3e7ae709),LL(0x937638c1,0x42417d54),
+ LL(0x1dfe8b0e,0x32f00a5d),LL(0x8dcdbdbc,0x8ea5e8e1),LL(0x6b30ea52,0x38df57cb),LL(0xe94c30ca,0xd325aa1c), LL(0xdce4d256,0x7aa04a9d),LL(0x74c7db6b,0x78e98cd3),LL(0x443d5c9f,0x631475a8),LL(0x7adfbceb,0x34e5c73a),
+ LL(0x9f1e8828,0x7fb69bab),LL(0xc84149e3,0xcadc78be),LL(0x1fe86af8,0xe9424ecc),LL(0xbc504ea8,0x13160cc8), LL(0x4c96a680,0xcb380078),LL(0x845faae5,0x006fb9d8),LL(0x1e0e66d1,0xc6a64277),LL(0x428f526d,0x13f77d6e),
+ LL(0x28474530,0x9f80fe8c),LL(0xdb7fec00,0x5649a173),LL(0xd9cb05ca,0xdeed5bf4),LL(0xd7077c41,0x14b1a3a9), LL(0x096883ec,0x4c2ed239),LL(0x44ae671d,0xd550edfe),LL(0xf7b7362a,0xb233e5dc),LL(0x4fd464f2,0x32c15820),
+ LL(0x68880bf9,0x0ecb18f7),LL(0xaf230a34,0x53468bed),LL(0x370cd6ef,0xe3ba97b9),LL(0x3516d77e,0xf5cdabf4), LL(0x11462032,0x08d78a56),LL(0xd583ccc5,0x1393fa93),LL(0x0c1b3514,0x52af7f5d),LL(0x188ca043,0xf48cac66),
+ LL(0x5461a1d1,0x2524c8dd),LL(0x91b6e707,0x6eee8101),LL(0xca2fe87e,0x209fece6),LL(0x9ac56706,0x50b35727), LL(0xec373bb2,0x651a6701),LL(0x1a4c2e84,0x881de85b),LL(0xcfdb47d5,0x4892861d),LL(0x5cdc4424,0x5ae2e653),
+ LL(0xa1f90dd9,0xc58f4f59),LL(0xfcf158a4,0xa5584f85),LL(0xab072a7a,0xbde86fb0),LL(0x268bae62,0x7c69e25a), LL(0x44fc7b3e,0xee3478f3),LL(0x6b7d3647,0xec148394),LL(0xe1c8c0ca,0x2a542ebf),LL(0x161dc0c1,0x63d1d635),
+ LL(0x57ab9282,0x769acdbe),LL(0x2a119cb9,0x9c338971),LL(0x125e5b4c,0x049e366f),LL(0xf0c8fde4,0x3aec68e0), LL(0x324cefda,0x9d95b6e5),LL(0x704014b5,0x844cce33),LL(0x6a6bb216,0x03920a61),LL(0xf379db8e,0xd69d17e3),
+ LL(0xc5e386e5,0x1924ac16),LL(0xd64953c3,0x62373a48),LL(0x47f4e4a4,0x5b1f7d64),LL(0xffa115fd,0xc043b5b5), LL(0x87fb16b0,0xb2a2656e),LL(0xd8cd79a6,0xcac56b9b),LL(0xcc19d3af,0x544971f6),LL(0x0fd63db9,0xf539244b),
+ LL(0xfbf4d232,0x0f052d3c),LL(0x7a2a7280,0x6b3c8366),LL(0x48079b9f,0xaa6579db),LL(0xa4d9edcf,0xc5beb93d), LL(0x0f1599a3,0x8ad58825),LL(0x5f3f640b,0x3f3a2634),LL(0x9032fd7c,0xda15393a),LL(0xac0e7136,0x97c10230),
+ LL(0x599785ee,0xfa32ef9f),LL(0x6b4c7a65,0xe1ed3b28),LL(0x2da1dcdd,0xcee1af27),LL(0x6861e2c2,0x4e480c11), LL(0x9c8ad8c3,0x35b5ec42),LL(0x3fc55f23,0xfd07f6a4),LL(0xea76d444,0xab18ead2),LL(0x22ba099a,0xcb8bde14),
+ LL(0xc61ae967,0x252e6a81),LL(0x72a2e1e6,0xaf11042c),LL(0x1a211ef8,0xb353902a),LL(0xc99a25fc,0x644d16e0), LL(0x5b67e48a,0x637fd606),LL(0x51a0b665,0xfa570963),LL(0x7ee072b8,0xaa661c73),LL(0xf2e0a727,0xde1eb4fe),
+ LL(0x22ed7ee6,0x56096a0c),LL(0x5825908b,0x31aaf403),LL(0xbfa02db6,0xfd5f6ba7),LL(0xff798900,0x85f4f9a9), LL(0x4a0cd878,0xa0997d56),LL(0xb1b6982e,0xdd76909c),LL(0xeccf338e,0x874fab15),LL(0x4ce82bb1,0x5e072b3c),
+ LL(0x6dd0d997,0x5dbe883f),LL(0x41765fb6,0xa32117f2),LL(0x7d87fc5e,0x59ca4da3),LL(0xb95ec918,0xc91002cd), LL(0x6548248f,0xd53bc123),LL(0x6c6d1e0e,0xef10a373),LL(0x99d9893f,0xafb2d760),LL(0xce0ba0ca,0xb77c1f1b),
+ LL(0xcfb9f6b2,0xabce362c),LL(0x35f9be91,0xe6e108d2),LL(0x7187fa9d,0xb2331290),LL(0xfc7ddce6,0xdcd1f4fd), LL(0x9086eb29,0x3a129991),LL(0x53a56d57,0xb0730520),LL(0xabd421bd,0x9fcdf4cf),LL(0x08f3e8e0,0x96271270),
+ LL(0x401e0217,0x951ea7e2),LL(0x733f637b,0xa4d1d708),LL(0x4f4cd676,0xc75170f4),LL(0x832f0b4d,0x568279ba), LL(0x25c17ab7,0xda4c01f7),LL(0xfa30e1b9,0xfcc13028),LL(0xacba57ec,0x4d1d8f71),LL(0xef6b3913,0x0c7971cf),
+ LL(0xc014f166,0xdf16e73d),LL(0xf96f2c30,0xd5796183),LL(0x3f70dd7c,0xd13ee9f7),LL(0xdac738c5,0x3f9aa0dd), LL(0xad021e28,0xa200c7e4),LL(0x08414fd0,0x982abae3),LL(0xc3779882,0x76d16a8c),LL(0xe70a6ff5,0x41563d33),
+ LL(0x4b553a17,0xdbb9656e),LL(0xd9c87aa1,0x96af21a0),LL(0x7bd9a625,0x2de13a03),LL(0xfeb1fec2,0x29f8c49b), LL(0x1a4ce44a,0x84e2df47),LL(0x548b39ee,0x83bb2965),LL(0x94d996eb,0x38b91cce),LL(0x9441ae0b,0x41e0a3cd),
+ LL(0xdaa92f34,0x720d30d8),LL(0x06f30fbb,0xba587579),LL(0x4c96ad59,0x24f74676),LL(0x0d33bd5f,0xf40493f7), LL(0x126a7267,0x9068c3e9),LL(0x18927490,0xa51099df),LL(0xa9cfe02f,0x27452423),LL(0xb8749653,0xcfd035be),
+ LL(0xfda6a4a9,0x0dd9bc2a),LL(0x0106ae0e,0xdba0178a),LL(0x4969a4bb,0x3820c9f5),LL(0x99fbc715,0x5031e9fd), LL(0xc193d942,0x642a030a),LL(0x454cbb39,0xdc3d6ab7),LL(0x1c8fa77c,0x507c17b9),LL(0xe3642a95,0x8465bcc8),
+},
+/* digit=32 base_pwr=2^224 */
+{
+ LL(0xc25dfad3,0xe74e265b),LL(0x493f44b6,0xd03630b9),LL(0xbfd6d473,0xb3270892),LL(0x1c5ee992,0x5b2d9543), LL(0xa36f7c5f,0xeeb94537),LL(0x8ab0b81d,0x9befc01d),LL(0x188b45e5,0x483cdb08),LL(0x01e4648b,0x44c753b7),
+ LL(0xb2411618,0xee43bc87),LL(0xf07924c4,0x08754bd2),LL(0x4ac92557,0xef205033),LL(0xee0387f4,0x6e7e4fe6), LL(0x76961d0e,0x51f3e2e2),LL(0x37eac10f,0x2b69d417),LL(0x73757a88,0x36d0f45f),LL(0x2b0c7d35,0x38b967e5),
+ LL(0xb31fa779,0x94ba8fc4),LL(0x0f13036e,0x8024dc85),LL(0x82d754b7,0xfda2af63),LL(0xae9ea9ae,0x4a784242), LL(0xf9887947,0x67dd14ab),LL(0xcd555a0a,0x7f2ecfc4),LL(0xf63a46aa,0xb37c4244),LL(0xff71b4b5,0xd032cfc1),
+ LL(0x6b8a6a97,0x0aef84c1),LL(0x0b2bca36,0xd2e7f3de),LL(0x5b174d43,0x721c6c09),LL(0xd52ccc5b,0x5719cf31), LL(0x3adf9517,0x6c7361f0),LL(0xabe20ff5,0x1e264169),LL(0x69eacc0e,0x01f9d997),LL(0xc2e635d2,0x721eba63),
+ LL(0x25df8bb5,0x4225e9c8),LL(0xb5752d7e,0x931f721e),LL(0x0a3b281d,0x3c4ed475),LL(0x4a4668be,0xcf927682), LL(0x75b7e90c,0x1b7f358e),LL(0xb7a29b9a,0x06e5c24d),LL(0xa167f2c8,0x0058967a),LL(0xa4ee62d3,0x9f1a6fb9),
+ LL(0x278291f1,0xca899c4f),LL(0xf4e64c1d,0x69a90324),LL(0x8d62916e,0x46cc5d42),LL(0xec1007cc,0x3c802e65), LL(0x6219cfbb,0xdadcf2aa),LL(0xd10258b2,0x942870dc),LL(0xa5e142af,0x77264e68),LL(0x089cc7a3,0xf25675e2),
+ LL(0x7336aa16,0x177e8a3b),LL(0xbc5c622c,0x5a92cc2d),LL(0x1789e029,0x33a35a2c),LL(0x4e4d5573,0x6f91306e), LL(0xda0a46f5,0xe5a2a581),LL(0x42640bba,0xfb532bed),LL(0x4a7b3ae4,0x88ff0f11),LL(0xb8ff7a71,0x2223e7b6),
+ LL(0x5d21d261,0x75933133),LL(0xcabb1fbd,0xa336289a),LL(0x631b3b61,0x797db2f3),LL(0xd7e6a511,0xc2cedb25), LL(0x10355332,0xb8806f34),LL(0x5d0ae37f,0xe5f1fb4a),LL(0x5d17c5c7,0x57cf26a5),LL(0x68c43ec3,0x82e8df47),
+ LL(0xf86bd784,0x70fa23eb),LL(0x51b0ce75,0x711a9dbb),LL(0x82170008,0x83bb4a90),LL(0x630602dc,0x8f096ee9), LL(0x7f15e77a,0x7d275fc9),LL(0xfe727ec7,0x63516a6a),LL(0x1dce9d38,0x6b06827a),LL(0x023b31c2,0xa01a5382),
+ LL(0x886209b8,0x12537433),LL(0xc5a11b32,0xb7875fa8),LL(0xbd61176d,0xfa63cb99),LL(0x33378ebb,0xebb204ea), LL(0x70c135f6,0xf29a29a0),LL(0xfa29d69f,0xf53941e9),LL(0x9917da42,0xab97b39a),LL(0x45947ae4,0x4677cfea),
+ LL(0x0f6dd908,0xd4668cff),LL(0x987e0769,0x48bb09ed),LL(0x8d64b6fd,0x794ed298),LL(0xfac845da,0xaf89d530), LL(0x2d06e70d,0x57445649),LL(0x079e70a7,0xe2a1a8c2),LL(0xf524fc03,0xd2ef1779),LL(0xb137bb1b,0xeaccaacc),
+ LL(0x5d279f42,0x34d8ed87),LL(0x1cd68904,0x4dd5344c),LL(0x24abd550,0xb558b71d),LL(0x40df135e,0x3728e850), LL(0xcfe86519,0x9329e2b2),LL(0xac74cde2,0x48ad17fb),LL(0x30b388b5,0x2ad61b22),LL(0xfaea71e1,0xebcbc1ad),
+ LL(0x35990d9d,0x50d7b19e),LL(0x6eb70243,0xb17138e5),LL(0xaa8ae7e6,0xb61618f6),LL(0xabce12c6,0xedee15b0), LL(0xcc7205fc,0xa99ce250),LL(0x69e0d75c,0xe438efc9),LL(0x5084b390,0x1feb6a10),LL(0x9c80d42d,0x7b348954),
+ LL(0xe4b68140,0x67ac89d5),LL(0xc9b092af,0x34afd23b),LL(0xfe1ad661,0xad65cae9),LL(0xe02d884c,0x4f402947), LL(0x6b1c40c1,0xd0a48fcc),LL(0x8961487b,0xf950c9f7),LL(0x206d1752,0xdb1cd811),LL(0xe99fd891,0x863b0ded),
+ LL(0xbb2a4515,0xd3aad8c2),LL(0x797e223c,0xc93c8cb8),LL(0x12a77d46,0x0f471e49),LL(0x600872b6,0xa2ac9434), LL(0x915f730b,0x6fb1c7ef),LL(0xd254d363,0x9fb72401),LL(0x6b44796a,0xf521e33a),LL(0x97c9fafb,0xb7ed2e8d),
+ LL(0xffb5e7ce,0x60d41128),LL(0xaecb96c2,0xdbd8b542),LL(0x0b5ca788,0x029ab3dd),LL(0x190eb38c,0x8b1148a2), LL(0x69fb1924,0x59048db8),LL(0xb18391a8,0xcd2149f0),LL(0xfed311b9,0x6bece5b6),LL(0x9ffd29b9,0x5edbe9b9),
+ LL(0x1156ded2,0x53810556),LL(0x721f3e68,0xf812ce5d),LL(0x7ccdc8cb,0x50504d40),LL(0xc60fa4fc,0xb559ba08), LL(0x1d6bd879,0x862a83d9),LL(0x836e26ba,0x2f8f653b),LL(0xeb26ca11,0x8587e6df),LL(0x8c8aaf7b,0x127bd905),
+ LL(0xd67d9902,0xe26e690d),LL(0xb58e7e78,0x1a6061f4),LL(0x480dd4d1,0x960ef741),LL(0x75589610,0x7fd09736), LL(0x855a8b2b,0x5a20a1a2),LL(0x355b4e0f,0x3ed68662),LL(0xe76595b4,0xd3786f45),LL(0x0bdedcfb,0x72a6999d),
+ LL(0x6a175646,0x4e48e843),LL(0xe05dc02d,0xde53c427),LL(0x97d31bc6,0x9728a4c5),LL(0x5bb3bd37,0x01a07129), LL(0xa74a0fcc,0x83c08a98),LL(0xbc345df8,0x233e400f),LL(0xcc3e0edb,0x9578c5f2),LL(0xf144a31f,0x0fe89df2),
+ LL(0x14c5a2cc,0x308098a0),LL(0xba40c0bc,0xeda5a59d),LL(0xb718a5ae,0x0b10f7e0),LL(0x5b8ad9ba,0xdaf7da8c), LL(0x87394cde,0xddc71285),LL(0xe43458d3,0x9bdb27cd),LL(0x4bd7c11c,0xc698d972),LL(0x3540be14,0x2ee97fbc),
+ LL(0x72f98422,0x2c704995),LL(0xef8661c5,0xfc71fee2),LL(0xce08043e,0x6574e022),LL(0x5143733c,0x3d17162e), LL(0x730e5b80,0x3bf0b448),LL(0x7cf94b5e,0x56de346a),LL(0x6c797797,0xfa87a53e),LL(0x6487d014,0xe8b9edfa),
+ LL(0x7be60b03,0x09e74387),LL(0xec8750db,0x2277ebc3),LL(0x7aeaa545,0xf1e9d594),LL(0x44c03394,0x41564562), LL(0x4de9f7ec,0x57943adc),LL(0x2a220cd5,0x09dd58f9),LL(0x06973808,0xdf848ec8),LL(0xd3950024,0xf1d5def1),
+ LL(0x5a8707e5,0xd089eba5),LL(0xb0b90ebe,0x914046cb),LL(0x63fe6bc2,0xb01180b2),LL(0x7ede9d83,0x1ffbc968), LL(0x3c52c09f,0xe16d336f),LL(0xdf40338d,0x32270ecb),LL(0x7eec7039,0xb55ff5c6),LL(0x38a63fab,0xb5ffb314),
+ LL(0xee18ffec,0x3e9f284f),LL(0x1d1b4e80,0x702d97f5),LL(0x214c4da1,0x2005ee57),LL(0x2f5ea2f4,0x1c210413), LL(0xa4149949,0xd24a486c),LL(0x23c8e201,0x3869a339),LL(0x0149992e,0x00f6e410),LL(0xf0a367dd,0x54e97b46),
+ LL(0xe169de5c,0xd967726c),LL(0x6a0fcd03,0xa3e81f93),LL(0xdb1b1733,0x171faa9d),LL(0x3828e41b,0x0bbb5e91), LL(0xf0828387,0x789a7b2e),LL(0xfca60b9b,0x9465cc16),LL(0xab630d23,0xcb58e90a),LL(0xa339d4b4,0xe7d30293),
+ LL(0x18e75428,0x0bcac958),LL(0x9a95900a,0xd2f1554a),LL(0x03846833,0xc63c2afb),LL(0x6d1e8753,0x703d0220), LL(0x04a357a2,0x47f5fe57),LL(0xcdc17255,0xaafba53e),LL(0x821af8d5,0x8f94c8eb),LL(0x35e37920,0x4d9918bc),
+ LL(0xe32dd067,0xc029bd84),LL(0xf77f8962,0x25982357),LL(0x510b7cfb,0x7af256ca),LL(0x446925d7,0xca397f37), LL(0xe0614e1e,0xb3dc7be5),LL(0xbbc4cc93,0x3b64cd27),LL(0xfb99bbc9,0xbd762df5),LL(0x04d7177f,0xc1ef0d4d),
+ LL(0x65e75ed6,0x77b6d3d6),LL(0x53053b45,0xbe59c8da),LL(0x54fe92cc,0x054d089f),LL(0x6fa4758f,0x2f2327e0), LL(0x5d2b5a01,0x948cf03f),LL(0x9c23b83e,0x47544c4c),LL(0x6c128d69,0x338590fa),LL(0x76842160,0x5724008d),
+ LL(0xc4f063e6,0x4cbeb18e),LL(0x9c2f826c,0x507ba094),LL(0x6f4e49f3,0x0e877a6e),LL(0x34f56868,0x050c2040), LL(0x0f119e25,0x8fd667c4),LL(0x13b47d3f,0x881dd34d),LL(0xca8e9a6a,0x2a6b636d),LL(0x107ea18c,0x67b081fb),
+ LL(0x84af55d9,0xd3a46367),LL(0xd7626b67,0x0e709a00),LL(0x4c6dfc8e,0x135725fa),LL(0x133a6e20,0xbf6328d9), LL(0xa87031f2,0xa4b743b4),LL(0x13825d07,0x62e90e67),LL(0xb85f3c45,0x7004028e),LL(0x11751be0,0x0465c502),
+ LL(0x8a5ab076,0x4d5d467f),LL(0xf4fb8a45,0x9aa3f414),LL(0x5dc1fa84,0x9fa0422e),LL(0xd02cfd2b,0x3205c05f), LL(0x078836b6,0x3eac28fa),LL(0xfc3ff573,0x53bc0189),LL(0x00b02100,0x2c45ef09),LL(0x34360ef7,0x61bc02ae),
+ LL(0x532e8d6a,0xeb5593e7),LL(0xf02a1ee4,0x94092904),LL(0x200496c0,0x379b32e8),LL(0x360a27c8,0x46fb6e9e), LL(0x62005158,0x8a3377ba),LL(0x0de3f191,0x1a3266c1),LL(0xc94d2127,0xe60fad96),LL(0x646302f3,0x41553dd1),
+ LL(0x377e0766,0x88bf0bfa),LL(0xe75bf57b,0x870a24db),LL(0x79e77976,0xc133cb49),LL(0xf43b6f18,0x2f14924d), LL(0xaa94cd73,0xe561dc90),LL(0xd6eb695d,0x8c420eb2),LL(0x2f04ef79,0x99e41ba8),LL(0x71e6d054,0x7f427bdf),
+ LL(0x10bde8ce,0x7304bb25),LL(0xe48b16f8,0x5dbc4325),LL(0x8796db7b,0x47d17ab2),LL(0x94c77832,0x83426817), LL(0x9878ace2,0x6781850e),LL(0x019e97aa,0x7f747b90),LL(0x949f9b08,0xa0545c85),LL(0x244bc083,0xe0a0bbf8),
+ LL(0xa1f38ea6,0x8cb53666),LL(0x4989a568,0x9be29ff6),LL(0x083a7fcd,0xbc5a7f87),LL(0x44ca10f6,0x90d0129c), LL(0xd724b7e2,0x1ad274bb),LL(0xcad5f069,0xa5290cbd),LL(0x86a4e0a9,0x886b1a7c),LL(0x8d8fb13f,0xd2481b5a),
+ LL(0x4f606ac5,0x80075fb2),LL(0xbfc10e7f,0xf984b5a2),LL(0xf056142f,0xd3d91aea),LL(0x4afdc017,0x770bee0b), LL(0x6c49c827,0x3c42ca88),LL(0x0aaa3139,0xb620c4e8),LL(0xad87890c,0xac6b512d),LL(0x0eb61f92,0xaee62df7),
+ LL(0x21dad9ec,0xcf0f37fc),LL(0xc52e24c1,0xd780d315),LL(0x23a2b699,0x0263bcab),LL(0x9714b577,0xdc8dcd2f), LL(0x55622b11,0xeb16eca8),LL(0x01118edf,0x94b3d649),LL(0xec66879d,0x6bafea64),LL(0xc4ab9f48,0xc35739c0),
+ LL(0xf3232370,0x082ccf53),LL(0x71407825,0x01b55dd3),LL(0x4f7f4038,0x86e0fe94),LL(0xb04159e9,0x1a623675), LL(0xbc4df337,0xf908ca59),LL(0x816162ce,0x1b4f1ffe),LL(0x2d60e05b,0xb5128952),LL(0xd38cbdf7,0xb47ca0eb),
+ LL(0x8ee38219,0xdccba22f),LL(0x9fbb36ff,0xc9436453),LL(0x8ac12c9d,0x83cecbf5),LL(0xf4cb1ebf,0x591191b5), LL(0xf03c1632,0x693cf383),LL(0xcb6abaca,0xaebd3f9b),LL(0x0fa26e7a,0x1427c154),LL(0x01bf37af,0x4f0de894),
+ LL(0xd88da2a6,0x4e497acf),LL(0xe5c86482,0x8014a215),LL(0xcf94ee40,0xa627d78f),LL(0x9ca36aa3,0x7647708d), LL(0x87e108c8,0x3d4e8bb1),LL(0x516f8b28,0xacdc3223),LL(0x1d955038,0x74e4d436),LL(0xedd68905,0x7e4a198c),
+ LL(0xc4bfbad1,0x41dc4bdb),LL(0x85964942,0xfd1121b1),LL(0x0c0d85ff,0xe462eb9c),LL(0x2b012d88,0xade1ccb3), LL(0x318f2aa3,0x2eec3503),LL(0xdec8a13e,0x656b44da),LL(0xcda13a8c,0x90b7aac8),LL(0x214a530f,0xe7f3a5ff),
+ LL(0x159060b9,0xa0c8062a),LL(0xd9305873,0xc19f2608),LL(0xc9609521,0x0d6213c4),LL(0x9aec4539,0xde2b9134), LL(0xaeddf0a6,0x4a2a6476),LL(0x5cf2e85d,0x89222dff),LL(0x084a0245,0xad92a1d3),LL(0x2138063f,0x29644a60),
+ LL(0xb8164832,0x5b57a05b),LL(0x885ce4d1,0xecf6620f),LL(0x045d3b88,0xde28ed2f),LL(0xb4502308,0x3eb11759), LL(0x4d9f94b8,0xe97f1db2),LL(0xeb83f016,0xfa248583),LL(0xcda53ba0,0x63a273b4),LL(0xa228b7b9,0x9692973a),
+ LL(0xb6707cbd,0x5968cb12),LL(0x5c1a2b4d,0x1895ccb4),LL(0x37f0b240,0xff309157),LL(0xb90875c2,0x374d983e), LL(0xc4e815e7,0x22fc40c6),LL(0x98d18506,0xf2db27be),LL(0xaa9ae62e,0x2854a948),LL(0x79e39df1,0xd614a722),
+ LL(0xb3501c19,0xebeec551),LL(0xd89cefca,0xe2b878eb),LL(0x6b4cd6bc,0xa0a34757),LL(0x70bfdf88,0x0159129c), LL(0x489502ca,0x26fa3e53),LL(0x285be050,0x7932084f),LL(0x71912b0c,0xfe4998f4),LL(0xc60b88b7,0x3dce0a87),
+ LL(0xc718ee5c,0x5b93edb0),LL(0xbb075836,0xb93a225f),LL(0x7aa0595c,0x87a08c94),LL(0xc31e3249,0x401d2620), LL(0xdae2cdb9,0xbe6928b4),LL(0x5a226630,0x4b68e106),LL(0xc9d32e4f,0xdc38c2fc),LL(0x26542f89,0xc51a6245),
+ LL(0x1757f3c4,0x5fb37c1b),LL(0x89128aa4,0xa27d6c02),LL(0x5e629309,0x3b74f56f),LL(0x2f7aeef2,0x24b5ad84), LL(0xbdc89596,0x54a962cc),LL(0xcc2f3d5d,0x6e8bccf8),LL(0x312e9241,0x4c1df22c),LL(0xfc30f0dc,0x8ffe6b0d),
+ LL(0xa6ec0fe4,0x670431a2),LL(0x35964572,0x49da0b42),LL(0x9dda5c39,0xbb12d1b0),LL(0x72d3de51,0x64170fe1), LL(0xa4a2f5d9,0xea8b2b16),LL(0xe590be92,0xde1bad64),LL(0xf0b9b0b5,0xb7f93581),LL(0xe115d67e,0xb007f4dd),
+ LL(0x415732d4,0xab9d7523),LL(0x905ec0fe,0x2951149d),LL(0x74350478,0x94bb2c63),LL(0xe9b1ada4,0xe6b63bfd), LL(0x13e8528f,0xd09b4d4b),LL(0x685bf239,0x6bed3d25),LL(0x1a14b7ce,0x83023ad9),LL(0xd0505d6b,0x4bffff63),
+ LL(0x8bb1cfa0,0x2ccc180a),LL(0x3a09c912,0x70c18508),LL(0x5878201c,0x318c41c2),LL(0x64c01149,0xb9f207b1), LL(0xc58287d9,0x89fdd9ee),LL(0x05c43da0,0xdb6fa8db),LL(0x311a34a1,0xc31354f0),LL(0xf1521976,0xccfbaddb),
+ LL(0x0c5e8388,0xf4175f75),LL(0xa81226cf,0x7e090ce8),LL(0xeda6a1ab,0x5209107e),LL(0x7e5ccefd,0xf0a263cb), LL(0x10c704a1,0x9fe05a36),LL(0xcf133aee,0x3784d7ca),LL(0x37af86c8,0x066c3116),LL(0xd7ebeb8a,0xbf32ca04),
+ LL(0xa9b5bab4,0x0447a950),LL(0x41bb1f1c,0x3b2f98bd),LL(0x59c62f08,0xd89bbdd7),LL(0x3ded069b,0x26bab370), LL(0x69ea63ae,0xb0db4ca5),LL(0x9133df68,0x57b32f32),LL(0x5a17efbe,0xc79a22d0),LL(0xf8ae3c2d,0x576976a3),
+ LL(0x9d02d212,0x5754198b),LL(0x230d0213,0x9cc9e61e),LL(0x92889e33,0x76772179),LL(0xf5df6cba,0xb1246608), LL(0x8d491280,0x821766bc),LL(0x96bd3df5,0xe148f470),LL(0xed753b73,0xc1e9fc70),LL(0xd6cecfc5,0x840e40ed),
+ LL(0x93e2f3a0,0x03874679),LL(0x5b646b64,0x462e5abf),LL(0xd7ae0e67,0x6fb19eda),LL(0xc3d2dddf,0x01e8a27f), LL(0x4bacfe2d,0xc9e69639),LL(0x712e8afb,0xbc3a134e),LL(0x8af6d30f,0x5d943a86),LL(0x443c942c,0x65eb5f99),
+ LL(0x2339e348,0xf5000308),LL(0xeb0d80e6,0xd69b7693),LL(0x5b9d220b,0x7b00b43b),LL(0x497bbcf9,0xde0dfc80), LL(0x0c2e851f,0xcfe2e3f3),LL(0x7e91d378,0xef7793d1),LL(0x9d266a5b,0x9e43eeac),LL(0x1766c5c1,0x9c81d68b),
+ LL(0xf6a4d560,0x121db320),LL(0x073582a7,0xcd0a4f03),LL(0x6e841041,0xbf469f9a),LL(0x5eb2d753,0x4314f0f6), LL(0x8c498414,0x09021001),LL(0x859275b7,0xf63d00ee),LL(0xf1c0385a,0x228fa809),LL(0x694c3318,0x44259d51),
+ LL(0xa2ad4eac,0xb0a5d5fe),LL(0xabdedf11,0xbb950010),LL(0x6264c601,0x081024ce),LL(0xaefb4115,0x6cc7faf2), LL(0x8692a7a4,0x90511289),LL(0x60596012,0x2bef4135),LL(0x0f0becb6,0xfec5209a),LL(0xd1ceb42e,0xad0907a6),
+ LL(0xf517372c,0x6cde3f21),LL(0x26131459,0x9acd4f09),LL(0x491f59d7,0xf3629a43),LL(0x41a037dd,0xe944561a), LL(0x826d1b5c,0x07beeabe),LL(0x3a1476cd,0x0728a907),LL(0x7d4a1abf,0xa91f41a0),LL(0xa7a119c4,0xdf58ed06),
+ LL(0xba701704,0x19990669),LL(0x47b67175,0x8aa3f76b),LL(0xdd0a6e9a,0x8bccff3e),LL(0x24f49029,0x4173fcda), LL(0x61c18233,0x2a688911),LL(0x78b9fa8f,0xdf54b239),LL(0x37596f40,0x714cf627),LL(0x24e6a879,0x2c73ddba),
+ LL(0xf2547f19,0x1538fd36),LL(0x0e7e84ee,0xd85c4730),LL(0x306f5fc0,0x00799e9f),LL(0x49ce114c,0xfccc6a37), LL(0x3fe08120,0xf9cff5e8),LL(0xc2be9f27,0xdf876a1f),LL(0x6939fdb9,0xe817c72e),LL(0xd34d0e43,0x244a1800),
+ LL(0x78fa7f11,0x41e83eef),LL(0xba6367e5,0xecaa250c),LL(0x8def6ae6,0x9c420347),LL(0x250b9e58,0x99efb3b1), LL(0x79b2298c,0xdaf311ee),LL(0x69b6dff3,0xb49200cf),LL(0x559e51f5,0x5c7f17bb),LL(0x424be7e9,0x117d0cbe),
+ LL(0x36e3af54,0x290a35c4),LL(0xe3a643b1,0xd2326cd8),LL(0x3580f9ee,0xc208b2b3),LL(0x4464a9e0,0x2419c661), LL(0xbccb2759,0x87123d3a),LL(0x1a77d469,0x5d36fcf3),LL(0x49b07e5a,0x5aafd58a),LL(0x6b71e237,0xf534595b),
+ LL(0x6705039f,0x0f0d3161),LL(0xca701676,0x7282b08c),LL(0x13796941,0xb05e8c3e),LL(0xfca06e08,0x5250012e), LL(0x980c5ea3,0x7eb2341a),LL(0xa41defb2,0x92f5aeb1),LL(0x0e62453f,0x203244e0),LL(0x96181756,0x74341218),
+ LL(0xe12a94ab,0x3b0cd36f),LL(0xb5ad7c48,0xf364b3b9),LL(0x8e768469,0x96a7a2a7),LL(0x1bbc7cc5,0xccc31c7e), LL(0x080dbb92,0xe70ad5d0),LL(0x56fb0f1f,0xfb201e92),LL(0x29d99f57,0xdfce7a1e),LL(0x06457da5,0xc12a02b0),
+},
+/* digit=33 base_pwr=2^231 */
+{
+ LL(0x2a80f39c,0xdea72ba6),LL(0x68cbe088,0xcb2174b1),LL(0xd6bd1cc1,0x9c73ec69),LL(0xf20dcce6,0x6a2dbe20), LL(0xeeaae9da,0x20a5150b),LL(0x9df630da,0xc935e85d),LL(0xa1634cd8,0x2147144f),LL(0x44f3af02,0x5eccb56c),
+ LL(0xc0e2b70a,0xf77a79cf),LL(0xee8cbae7,0x2569c8bc),LL(0xfadb18fc,0x392a5dbe),LL(0x3ce6a0ff,0x59bc96b4), LL(0x8b551005,0x287f04f4),LL(0xa44b2bd8,0x7efe3aa5),LL(0x6ac447d7,0x0e9cb8ed),LL(0x7783bdd0,0x9b4eb10a),
+ LL(0xb981d96f,0x793c4880),LL(0xd56fb2a6,0xf719d828),LL(0x8149057e,0x9fcc236f),LL(0xb4d65c2b,0x318c63ec), LL(0x5f95c5de,0x5269c1d7),LL(0xd0efd6bc,0x33b3745f),LL(0x4ae87c64,0xace344d5),LL(0xdd30ba2c,0x238809d6),
+ LL(0x71192348,0x3cc32acc),LL(0x3f17ef60,0x545401bf),LL(0xcde25b0e,0xe209a493),LL(0x663abab9,0x5c11886b), LL(0x28ec7c90,0xe61a81b1),LL(0x75b57f5c,0x18b125a6),LL(0xfad91696,0x86d1b45a),LL(0xa4c3f7ff,0xb31a786d),
+ LL(0xf45831d8,0x2fd4cd72),LL(0x8be40d9f,0x85978fa6),LL(0xa9301111,0x38106329),LL(0x9e5979ee,0x1527e462), LL(0x76c5fc8a,0x97f71c7e),LL(0xf1f33056,0x205fa473),LL(0xa6546a05,0x7bb9d24e),LL(0xf84c4d35,0x0e282a5c),
+ LL(0x59471f1f,0x59d21896),LL(0xf6303573,0x2e613dec),LL(0x78bf5a4b,0xa7995794),LL(0xbf19fbe5,0x20adf6b5), LL(0x1574d34d,0x3a48c95f),LL(0x09323ceb,0x95488f09),LL(0x552df9cf,0x450aee7f),LL(0x53557500,0xdf016f7a),
+ LL(0x2da8a2a6,0xf2acedc6),LL(0x2f4a0632,0x03fc8cf8),LL(0x5b82f03a,0xe7ff136b),LL(0x9e88c421,0xd5841c4d), LL(0x7eef63f0,0x75a4d66f),LL(0x2865c14b,0x92091ade),LL(0x64fe7ba3,0x7060474c),LL(0xfe30cb3e,0x4056724c),
+ LL(0x8d9fceb6,0x38cf4c6f),LL(0xab528f38,0x11e85f78),LL(0x52303b2b,0xe2896d25),LL(0xed68c605,0xf929675a), LL(0x10c708a9,0xfbd22374),LL(0x40d7e5a7,0x4682ca17),LL(0x9041047f,0x4242b5c5),LL(0x0f9c6840,0xaf571053),
+ LL(0xa56af433,0x713b2bbb),LL(0x5e82f947,0x45aaf2ce),LL(0x106283c7,0x9882571a),LL(0x9b9c3c3c,0x37de12ca), LL(0xbef10529,0xcb463af2),LL(0xd771236c,0xe18d763d),LL(0x62935de3,0xb47a69ca),LL(0x9a41e09a,0x4798e91f),
+ LL(0x8e93edd5,0x89696697),LL(0xb7ea4f45,0x35cdb8e1),LL(0xfed33d87,0x36f8305d),LL(0x625642d6,0x57623440), LL(0x945dd7d6,0xdfd9b580),LL(0x731739bc,0x965ffcb5),LL(0x637bf127,0x34588e1f),LL(0x539d21c7,0x936c0ba0),
+ LL(0x71640eed,0x70832099),LL(0x3ff407e3,0x916b1952),LL(0x88440bc0,0x4cd58881),LL(0xc280e977,0xd9fcb83d), LL(0xdf6cda83,0x0d3df9db),LL(0x3d55047e,0xc629414e),LL(0xc16b84c9,0xe05738a8),LL(0xe8783570,0xf4bdc724),
+ LL(0x9a93a5c9,0x7d876a59),LL(0xa8d12f61,0x026be75c),LL(0xe9b2aa43,0xe49900ed),LL(0xb3a68dad,0x44d6dc80), LL(0x7d23e11b,0xf96b116b),LL(0xb6814209,0x12791212),LL(0x6cc65956,0x3e2807cf),LL(0xf405ffae,0xcc606ca7),
+ LL(0x5df47226,0x5484b2c5),LL(0x8802da81,0xfbaf9042),LL(0x087adadc,0x84146315),LL(0x58d593b3,0x6adbcbc1), LL(0x68b97533,0xc1fb3896),LL(0x954cc1b7,0xa6919aac),LL(0x27a4ddd0,0xf301b2e4),LL(0xdf1a07b1,0xa15c16eb),
+ LL(0xc145a6c7,0xb36c017d),LL(0x968798da,0xcca64382),LL(0x8d0eff5d,0xd13b6376),LL(0x2206e681,0x06e39e2d), LL(0x3add517a,0x1d9dffa4),LL(0x10d95fef,0xe670e6c8),LL(0xf1c7c7a8,0x0ecb51ab),LL(0x74945305,0xf17dff51),
+ LL(0xb00d9c0f,0xf71b09b1),LL(0x9c72c80a,0xc719cf62),LL(0xe00a49a1,0x310c5aeb),LL(0x1b33c5e6,0xd01285e5), LL(0x05aa6eb7,0x7b23e7c7),LL(0x6bc88677,0xf84188b1),LL(0x64be321a,0x7e034cb5),LL(0xe884323f,0x270df734),
+ LL(0xe5137d20,0x218e68f9),LL(0x0f7e70ad,0x79588cba),LL(0x58b86b0a,0xb6d37f52),LL(0x7cc591fe,0xcb281c98), LL(0x8fe40e06,0x30e03fed),LL(0xed9ca793,0x394ded95),LL(0xbcd3a3da,0xf1d22cdd),LL(0x0c591130,0xcb88cb27),
+ LL(0x8ff0cbf4,0x67786ba3),LL(0x0565d337,0x85738a44),LL(0xaf9a667b,0x9d3b35ec),LL(0x8f5f540a,0x45a17512), LL(0xade5a5ba,0xf1ae5171),LL(0x39869be4,0x720e2823),LL(0x5352d84b,0x6893f14a),LL(0xc784dc20,0x919a4f15),
+ LL(0xf7ae5a67,0x36136612),LL(0xeaff0924,0x11f43d1c),LL(0x39449b96,0xcfee088c),LL(0x70c42ff6,0x3dc48359), LL(0xbf208b67,0x4072683a),LL(0xbe15d18f,0x35a7c2be),LL(0xe2c3391b,0xe61d2748),LL(0x39921d95,0x0a4109b1),
+ LL(0x05545cfc,0xe2cd131b),LL(0x3ae20d7f,0xa898da2c),LL(0x50dc4c61,0x501cd849),LL(0x3374e7f0,0x10e287d4), LL(0x38aea879,0x90d6326f),LL(0xef43fa08,0xc48d9af7),LL(0x6c20f168,0xf8f4886a),LL(0x23ccac4b,0xc5d34a86),
+ LL(0xb3d7004e,0x72357752),LL(0x817bd377,0x167db0ed),LL(0xdfb64d05,0x5d45b3da),LL(0xf0b414ac,0xed4b7fc4), LL(0x0bf1dd64,0xc178941b),LL(0x8fe835a5,0x43feac17),LL(0x6a014609,0xe1c23a17),LL(0xd5e23bd5,0x63255991),
+ LL(0xd7dfec55,0xefc76468),LL(0xc0831696,0xb1bc3fee),LL(0x5f52433b,0x0996811b),LL(0x799649fc,0x6b8b6daa), LL(0xab518b64,0x6e9f7cb6),LL(0x38a3a2ab,0x6a67a009),LL(0x928209e2,0xe55de954),LL(0x3da81142,0x98b6d0a7),
+ LL(0xe3f832e8,0xdec30331),LL(0xe50fa9e3,0xa9b77f3b),LL(0x5167c6a6,0x20febc21),LL(0x76fb0f13,0x0ce07d1a), LL(0xe796f8a3,0x9745dead),LL(0xd95deba6,0x2cb4eb1f),LL(0x4caf2afe,0x062e7cac),LL(0x16ace879,0xf50ce065),
+ LL(0x1d99d3e7,0xdec8954b),LL(0xa48262c7,0x5287e954),LL(0xcc3530de,0x1c6fbd17),LL(0x53af4211,0x6bcbea50), LL(0x4dce058d,0xe3533bca),LL(0xfc9cdf00,0x6fe62e64),LL(0xe8ec4cf9,0xee29fdec),LL(0xc8d52f80,0x7361797d),
+ LL(0xf4e36023,0xb1d858da),LL(0x73e6dee1,0x4a1282ce),LL(0xce1d71cc,0x6ba8f8ba),LL(0xcbbd8eb9,0xf5b7d6b4), LL(0x5aed382b,0x60f8bd50),LL(0x3f3a46b1,0x47b40519),LL(0x8a997d93,0xaed13bb9),LL(0x4dc6e35d,0x6cc2260e),
+ LL(0xccf915d9,0x173bfcdd),LL(0xc2d46f6e,0xad4525e1),LL(0xcdd2382b,0xb7ecec0b),LL(0xd2b76c84,0x01ae8291), LL(0xbec6b980,0x2d1e2a91),LL(0x7008a00c,0x1b0040be),LL(0x7d555120,0x6ac708d7),LL(0x0d745eef,0xa6017568),
+ LL(0x1ed38ef4,0x735e3511),LL(0xcebe5a8c,0x7c97f284),LL(0x24fecbac,0xd4059313),LL(0xde18c42c,0xf874ca4b), LL(0xdbb829b6,0x9ab736a8),LL(0x82ff128d,0xe914bdde),LL(0xfd0f362b,0x6e949bab),LL(0xffea2e79,0x275824cf),
+ LL(0x8cc52417,0x81f57245),LL(0x2f274090,0xed0a9079),LL(0xfdd0ba2f,0x98c3372e),LL(0x3ae99478,0x49820f41), LL(0xce373d3e,0x1c47e09f),LL(0x6dd12846,0x875d7920),LL(0x15d5bbb1,0x7a9e7973),LL(0x6d227962,0x48512656),
+ LL(0x199241e3,0x2c167c88),LL(0x7209ca37,0x98c1df6a),LL(0xde89e412,0x09a1583f),LL(0xc792de48,0xc19ed5b9), LL(0x74dc0834,0xb8dd1b1d),LL(0xa04456e9,0x9d458529),LL(0xad0ad39d,0x66ef5463),LL(0xe641edc5,0x8d7df4a1),
+ LL(0x6bd322e4,0x97815de2),LL(0xc1f77fb3,0x0bf6fc83),LL(0x8b4f7152,0x49378167),LL(0xbf0a1712,0xfdd476ef), LL(0xf2f9883a,0xe87e1977),LL(0x9ad2d034,0xdbb2fcbf),LL(0x64e1a4c6,0x5afdd161),LL(0x3e435191,0x0e43f911),
+ LL(0x42253804,0xde2d1ee6),LL(0xdaf13e57,0x6def6ceb),LL(0x05423bab,0xae09fd4f),LL(0xad46e409,0x6f6c17b8), LL(0x6c345cd3,0x966fa09d),LL(0x47abc35d,0x6c8aa1e9),LL(0xe015a566,0x02991686),LL(0xcd2f925d,0x39b3aeee),
+ LL(0x9119c117,0xf9cda92a),LL(0xf4f833e1,0x7b21ce82),LL(0xe4f99193,0x87517bf5),LL(0x4eb412f9,0x1b7ddec9), LL(0x6b077498,0x7a30dd57),LL(0x0ec44230,0xe060625f),LL(0xb0e5446b,0x0f355dc4),LL(0xbbd2df28,0xdf324d65),
+ LL(0x649966a5,0x28c7eb34),LL(0x26639e19,0x97587f4f),LL(0x0bce0f38,0x0724cc00),LL(0x4ae6280a,0x63578add), LL(0xc7fd6a1a,0xf1beaa57),LL(0x7b017e35,0x83b1a533),LL(0xefdf2ed1,0x01c027e3),LL(0xd2d31852,0xf373d4ea),
+ LL(0x65b8f5d7,0xe568acb6),LL(0x1240a545,0xea8ce1b8),LL(0x555fac44,0xb95b0db2),LL(0x768333dc,0x01d18170), LL(0xab1798ad,0xf938b55e),LL(0x999a7e5b,0x73a0d9dd),LL(0x57fd9b51,0xd2359bb5),LL(0x77fb4e5e,0x20f1d4fd),
+ LL(0x932dc388,0xf5efd71f),LL(0x21a37385,0x40f86819),LL(0xff935ef3,0x05395fb2),LL(0x1b615e8e,0xc2ee43ac), LL(0xe82d509a,0xa3bb6518),LL(0x30b93347,0x3a87d5a2),LL(0x5b130bcc,0xac0a5ad0),LL(0x9154d73a,0x91fe8fdd),
+ LL(0xdeb203a2,0x677d7d48),LL(0x8b0168e1,0x4d4108fe),LL(0xddc3d24c,0x16be4ad1),LL(0x9865df69,0x9b0ea387), LL(0x4c50ec70,0x16daf932),LL(0x478c96a3,0xa4799bda),LL(0x7114d3bb,0x4ef24d3f),LL(0x46e6bbdc,0x30a31509),
+ LL(0x97f3cb4b,0x60137187),LL(0x0a29d865,0xf2b66d8f),LL(0x60064a5c,0x93a4a37a),LL(0xe8c3cf47,0x7dee9bed), LL(0x0b7ee8b8,0x748833ce),LL(0x56f89483,0xc07f2f6d),LL(0xd24b406f,0xd71a40d8),LL(0xebbb7655,0xbe3b2e8f),
+ LL(0x4a536998,0xa23c2b05),LL(0xa9be2e14,0xdcaf45b3),LL(0xfe346ad1,0x515ad15f),LL(0xb7847640,0xb9c06a18), LL(0xf35bff4a,0x8552eb06),LL(0x2b7a29f5,0x4fb792e7),LL(0xa41a38b4,0x1cce2af5),LL(0x02b42414,0xde68bd0d),
+ LL(0x7cd66728,0x8124d6e2),LL(0x55efbadd,0x5906d1b4),LL(0x827f2741,0x7e17855a),LL(0x12c6966c,0xab525dfb), LL(0x758e0cd3,0x065ae99a),LL(0x517318a9,0x0dcb8f5d),LL(0x42441f5e,0x48756645),LL(0xd79d535e,0x03859154),
+ LL(0x8217e4bf,0x99bb28cd),LL(0x8291e54d,0xd6aed2e5),LL(0x1c92a65e,0x8f9067e3),LL(0x1540b9b5,0x120890ea), LL(0xec60a215,0x227d7c86),LL(0x556d8c65,0xb6609e85),LL(0x47f8c8a3,0xa6a26c37),LL(0xf1204bdc,0x4c850fe3),
+ LL(0x42db4eb8,0x25f7e61a),LL(0x3d62869d,0xfdf05575),LL(0x52b31c23,0x8b36a744),LL(0x1a5e8d4c,0x83b83c89), LL(0x5d9208bf,0x72d38dd3),LL(0x8cf7b6f4,0xbeb8873b),LL(0xcf90bcb6,0xa3ec5c36),LL(0x9a6d5fe7,0x35adda6f),
+ LL(0xf61c68d9,0x7312423d),LL(0x20bcaf77,0xb1c4e10f),LL(0xf168ee57,0x4df2850d),LL(0x180985e1,0xed07a4de), LL(0x2fba1f23,0xcb353d6b),LL(0x778cc15e,0x00ea9094),LL(0x20857170,0x4967faaa),LL(0xd7153bc4,0x9ff70dbe),
+ LL(0x59f62fc6,0x49eb7994),LL(0x3c91862d,0x5f459faf),LL(0x46d8f2e0,0x1c10f621),LL(0x252954e7,0x7e669c9a), LL(0xa83f6c57,0x4ccf659a),LL(0xec0a0a03,0xdc2b77eb),LL(0x2cc6b8a2,0xcf09ad07),LL(0xa97aa2d0,0x231960fc),
+ LL(0xde227de8,0xc0609130),LL(0xf1d7ddf1,0x40d2691c),LL(0xf9a73890,0x60349cf4),LL(0xf9968132,0x3f50005d), LL(0xf16f44b9,0xb4be853e),LL(0x799caac5,0x48bf4804),LL(0x3c562849,0xe6a64876),LL(0x854f283f,0x2f4d487f),
+ LL(0x159484c4,0x64b77e39),LL(0x523e1529,0xd419d4bd),LL(0x143dcf7d,0x1bf9510c),LL(0xed5cb4e1,0xa85bea71), LL(0xec715818,0x73a4cfd2),LL(0x67f475f5,0x88b11d0e),LL(0x4d12361c,0xbfe170d8),LL(0x00a0f979,0x9fc48e64),
+ LL(0x65682105,0x6a8bb2dd),LL(0x00bd952a,0xc1362a9c),LL(0xa6013753,0xef5b3d89),LL(0x8fdfa22a,0xc87bbacb), LL(0x31bb19e4,0x74fbdfc0),LL(0x32bfe260,0x7d058029),LL(0xe53da990,0x54a4cce4),LL(0x822da672,0x01acdff6),
+ LL(0x95597766,0xd2a2d484),LL(0xd43dc7fd,0x5960ac1f),LL(0x8d6db685,0xcf095b6f),LL(0xa85618f3,0x87232088), LL(0x34753c7c,0x91497a48),LL(0xd6353024,0xf682e372),LL(0x0c9b271c,0x7889ceda),LL(0x18340951,0x7126504e),
+ LL(0x967c8a60,0xf786b821),LL(0xc17f3d99,0xfce01b37),LL(0x1f2a8575,0xe23c00a1),LL(0xab6ff8a0,0x7f56aa1b), LL(0xd193dfcb,0xdb73869d),LL(0xd644733e,0xbec02c94),LL(0xf7b43261,0x283117bc),LL(0xb4108e39,0x920acf5d),
+ LL(0xe49aebb8,0x33f1ef5e),LL(0x0fcea2c1,0x9ead51e4),LL(0xf8503f28,0x1f800a68),LL(0x34a75f67,0x78818531), LL(0xb70ffb27,0x1aeb3760),LL(0xcb6309e9,0x1cca590a),LL(0x7170d241,0x8d09f360),LL(0xa0e0d0f8,0xbc970b5b),
+ LL(0x31d038a3,0x2ec93eea),LL(0x5153f8a2,0x3482a0d7),LL(0x6641b5d8,0xedcbe914),LL(0xe516e387,0xc086e61b), LL(0x9b875513,0x03814266),LL(0x37340a4f,0x6d37fee3),LL(0xe5d17ab7,0xcf78515e),LL(0x4119a759,0x0c7cd830),
+ LL(0x54924618,0xbd49062b),LL(0x41e7e7a3,0x34c44f45),LL(0x706bd0af,0x0039f3d2),LL(0x0be9a628,0x146cadc6), LL(0x57d48746,0x6d5d5020),LL(0x82caf4b0,0x0ea43f7b),LL(0x8a064d34,0x11a08927),LL(0x95638fa2,0x30c0ef40),
+ LL(0x602a871b,0x4b950c04),LL(0x6a731537,0xf50cb1ef),LL(0xcbe5e4ef,0xb87a1cd3),LL(0x3dd1c601,0xb1fc4894), LL(0xa516617a,0xdf402711),LL(0xaaf63c65,0x5bdd1d67),LL(0x6e559bd9,0x020d1062),LL(0x81ec09fc,0x4dec26d0),
+ LL(0xeeeeb2bc,0x7b91fafd),LL(0x33aaf2c4,0x56290f98),LL(0x79c7bf9e,0x57abbd27),LL(0x2b1e1ecf,0x568bdee6), LL(0x470f1d01,0x58f8c80c),LL(0x1b9cb76b,0xeecfe398),LL(0x311a0634,0xc0ffa4de),LL(0x0ae99877,0x425fcd13),
+ LL(0xf7bd0748,0x1964c681),LL(0x9d920471,0xebcca16f),LL(0xab4aa03e,0xa72b40cb),LL(0xa05624fc,0x4397d6af), LL(0xa94fca0a,0x372d522c),LL(0x3035b9fc,0xe1010d60),LL(0x4f788d44,0x9f1f00cc),LL(0x6a88b672,0xfd00ec75),
+ LL(0x2983aef7,0x53706702),LL(0x9b458edb,0xa5f67b0b),LL(0x7db93ca8,0x10789b90),LL(0xfd27cd55,0x885346f0), LL(0x2ebb5f15,0x3af5b0c8),LL(0x2a36b2a7,0x282e4c4a),LL(0xa6d88bd4,0x2f9d5d8b),LL(0x9856b7aa,0x6f016bda),
+ LL(0xa8198c1d,0x990ae53e),LL(0xa07e7ac5,0x295beceb),LL(0x48c2d246,0x576f790f),LL(0xe3ea9864,0xe99ab2ae), LL(0x43e2d400,0xcf4959f2),LL(0x7a39dfea,0xdd1d8fad),LL(0xfcd7fda0,0xdd6ff9c2),LL(0xb6ace55e,0x61c25b3e),
+ LL(0xb4dcddad,0xf94742af),LL(0x44601959,0xc49cfa21),LL(0x30c18470,0x07b3f1d1),LL(0x6e6afc82,0x2736cb99), LL(0xe24a8785,0x401fb234),LL(0x074f51ea,0x9af8ba40),LL(0xa9faed0c,0xe1acc646),LL(0xc9667008,0xd5a5f789),
+ LL(0x68c3ab8f,0xc6436514),LL(0xfe8d6b46,0x6fa0d734),LL(0xaf7f49c7,0xe5fccbfc),LL(0xbebcc58c,0x42c88c53), LL(0xe2a0f7f2,0x7d2e2fed),LL(0x36a18b26,0x694eb76c),LL(0x6b0f657b,0xf0e6ae43),LL(0x48f1ece7,0x8a0f6255),
+ LL(0x8674bfee,0xd594c168),LL(0xac7d5ebd,0xe59ad38d),LL(0x21645a1e,0x080a6b97),LL(0xf221b37b,0xb900f0e1), LL(0x04cab97d,0x562dabce),LL(0x6f472462,0x5c308741),LL(0xc7c4cba8,0xa5d87e23),LL(0x9b061062,0x5237fe16),
+ LL(0x222021c1,0xeddfbeb4),LL(0x4e7a2a8e,0xa4fe57d0),LL(0x2de56c47,0x0fbf6bdb),LL(0x6fcebc6c,0x819588e7), LL(0xdf041e3a,0x14196961),LL(0x40cd4f23,0x76a31437),LL(0x8e1a877d,0x44acd14d),LL(0x37d7b7de,0x227a35c6),
+ LL(0x842a9534,0xe1934f1d),LL(0x53ed73e2,0x7a2ed2c1),LL(0x3903924b,0xcffedd58),LL(0xb306431d,0x7c9dbf55), LL(0x56e06ab5,0x61a72f10),LL(0x616bc5cb,0xb46cf5cc),LL(0xf7c22216,0xecf07e10),LL(0xd9364b3a,0xa4bddad9),
+ LL(0xda8b1c93,0x548b95b2),LL(0xa1e1c0cb,0xc09a9598),LL(0x21d80851,0xedd80ef1),LL(0xc283f047,0x4684c439), LL(0x87333da3,0x07ca41f3),LL(0xca79a8f4,0x173ec4de),LL(0xb4aec6eb,0x89ce06f2),LL(0x15aaf7f0,0xfe6b0e92),
+ LL(0x7c1b9ed3,0xdab8876d),LL(0xa2606f83,0x88aba90f),LL(0xbebaf9f6,0xcd21a408),LL(0x0042a162,0x09da6696), LL(0x2d66ccf6,0x4a9b8b21),LL(0x44d5a648,0x34c74904),LL(0x3b0e9564,0xf3fe98e9),LL(0x221aa4a5,0xe4a8a352),
+ LL(0x26c2b53e,0x6278b4b5),LL(0x1b1708ea,0x4ddf26ce),LL(0x6eb0d845,0x704207af),LL(0x0f5862ef,0x60533de3), LL(0xe54393c0,0x2b5945dd),LL(0x145ea298,0x55941df2),LL(0xc240f654,0xe2b500b6),LL(0xcf9f6934,0x5a49d8f1),
+ LL(0x27502203,0xfe8d5468),LL(0x58ade316,0x985039d4),LL(0x0a687415,0xefd373f1),LL(0x43526774,0xefccb791), LL(0x0f4497d9,0xeef8d46e),LL(0x1601ab9a,0x4152df71),LL(0xe47b2ad1,0x4250cd2f),LL(0xfb048180,0xa2b63fa5),
+},
+/* digit=34 base_pwr=2^238 */
+{
+ LL(0x787d1f1c,0xd8a6cb6f),LL(0x3d219a66,0x427bac94),LL(0x383146b0,0x51d7d49f),LL(0x7863d781,0x8164b77f), LL(0x2f9631b8,0x1646b084),LL(0x849388df,0xef5b3aa8),LL(0xe58cd383,0x60536422),LL(0xf43ea3a0,0xb079d911),
+ LL(0xcb73887e,0x504ac041),LL(0xc3ce3a33,0xf878b618),LL(0x56393e75,0x57ef73d5),LL(0xd276c08c,0xe4372d2e), LL(0x0924cf58,0xfd9bc894),LL(0xaaa317e2,0xfa2a4deb),LL(0x79608da5,0xe51edccc),LL(0x8cd4b960,0xadcc68fa),
+ LL(0xf8e156c7,0xaa66c201),LL(0x1ab2e3fe,0x7c7cf22e),LL(0x0a677d85,0xe479c393),LL(0xb87c412b,0xc0cd340f), LL(0xf95ff321,0x2b2bcef4),LL(0xb8409952,0x65da11c9),LL(0xeb67eb9c,0x143a2218),LL(0xe53508e4,0x8919ff25),
+ LL(0xa9e0eeae,0x6f154f09),LL(0xab05a657,0x2246e6fe),LL(0x1045b85d,0x4d7c1c81),LL(0xd3bb7432,0xde99ea37), LL(0x63184ff4,0x058f8187),LL(0xd134bfc3,0x2a223421),LL(0x23120320,0x1560dbed),LL(0x76a3de9c,0x37243c95),
+ LL(0xd36a81b1,0xb8f3851a),LL(0xbdad7ad9,0xfbc62bfc),LL(0x561e0f8c,0xf68215c7),LL(0x1bcf765b,0x894131d1), LL(0x45c5d736,0x8da01f9e),LL(0x7484e0c1,0x025de05c),LL(0x6858b504,0x62f4c66c),LL(0xd6dc5f93,0x754b85d6),
+ LL(0x822a3de0,0x5b37cecc),LL(0xa98a37c2,0x422e49b1),LL(0xbe41e927,0x3ef53d89),LL(0xf4d5bffa,0x0994dd11), LL(0xf7eacca3,0xa62ea556),LL(0x7c746025,0x37b4e230),LL(0xa8e14253,0xb4291e37),LL(0x2a2b666c,0x2bfc9eaa),
+ LL(0xc26e5588,0xf604604a),LL(0xa7ec3971,0xf75816ff),LL(0x26a30a6d,0x859e9ec7),LL(0xa1a5b815,0x2ce57b66), LL(0xd65e8ec2,0xc7aa4df4),LL(0xa5d82ede,0xbab6b3bb),LL(0x7b088314,0x7a11b25d),LL(0xc2c636ac,0x501a3891),
+ LL(0xe256b02b,0x9f116c8f),LL(0xfa5946e0,0x71495693),LL(0xc335452a,0xeb9696ff),LL(0x4971162e,0x01ca5929), LL(0xc0f28e72,0xee0a1f50),LL(0x70d8df1a,0x2baac62c),LL(0xf49110f8,0xcf65d297),LL(0x9a45e16a,0x041dbb01),
+ LL(0x5e1410c0,0x8db69426),LL(0xa70d0268,0xb21f3c6a),LL(0xbac0ddac,0x64a3c30e),LL(0x66a2d33a,0xdcebdedc), LL(0xa519de21,0xc5dcd769),LL(0x19322c69,0xa692b6a0),LL(0x154fca13,0x454add5b),LL(0x4935eba2,0xd2281cf0),
+ LL(0xf2602323,0xb5f44fe7),LL(0x5d68a3db,0x772fb6a6),LL(0x76eec37a,0xf519c5d4),LL(0xada6c3f4,0xbc8e9a15), LL(0xf18effee,0x9cd2a2f2),LL(0x1808ab42,0x9601c142),LL(0x0480ad18,0x05d110f7),LL(0xef6a7f33,0x5f7e0721),
+ LL(0xe6409e21,0x1afbeaec),LL(0x317f7967,0xf6714651),LL(0x80124751,0x34cd21ff),LL(0x931d9639,0xf85c70ec), LL(0x1ca19094,0x4e26bef6),LL(0x0b841b9a,0xc513f66b),LL(0xb9b41001,0xe25507bd),LL(0x94f49f7c,0xd77fee94),
+ LL(0xd39e1ee4,0x20b19223),LL(0x4e3e6c2c,0xc8832a2c),LL(0xa3a45c34,0x64a8f43d),LL(0x21fb291b,0x52a05eef), LL(0xe4b68e38,0x10d3e24a),LL(0xee2d8a40,0x5289120a),LL(0x425b7da8,0x33836b98),LL(0xb00c64e1,0x5bd418f3),
+ LL(0xd511c3f8,0x10e92e5a),LL(0x18b62b7d,0x17f1301d),LL(0x97f0fcae,0xf710b02d),LL(0xbd394477,0x8b1030f6), LL(0xe5aab897,0x49040009),LL(0xce75b4d3,0xfdb23ac1),LL(0xf2b70e1b,0x7a43d904),LL(0xf94fa56f,0xdc09e995),
+ LL(0xd075dd65,0x9f314e85),LL(0xb9e26b8d,0xc0d39ce0),LL(0xfdc3b678,0xd3f6778e),LL(0xfc8497df,0xce6573e9), LL(0x67abaf7a,0x1f4535f8),LL(0xa47dd948,0x80706dab),LL(0xc059242b,0x670ae5bc),LL(0xcf5f9308,0x3a29bc73),
+ LL(0x8af2bf74,0xd2f8e297),LL(0x6c48bbec,0x98dbb443),LL(0xeb448447,0x211a3a96),LL(0x5af4a2c0,0x88ffb240), LL(0x9cdf9e20,0x1959dd34),LL(0xf34627e0,0xa4d0d839),LL(0xf00057cc,0xa5cecad3),LL(0xc5d97b18,0x22f32cce),
+ LL(0xcedc2c97,0x31a02241),LL(0x2b632641,0xf0f5489b),LL(0xcbfb588f,0xb09091dd),LL(0x5d9478e7,0x5ffd0f38), LL(0xdae35eda,0x13f141a1),LL(0x62f0b26c,0xd25563a6),LL(0x1b9dde18,0x80014b17),LL(0x7da49b36,0x9fcf8f81),
+ LL(0x93519f31,0x68aac84a),LL(0xc0b3660a,0xe14c35c1),LL(0x08195bc5,0x29f447dd),LL(0x10bba62f,0xc61fbbe6), LL(0x4ed8621a,0xc471624c),LL(0x0950a4c6,0x8005f67f),LL(0x93a2a33e,0xdfc3b3e5),LL(0x3c1d0e42,0x9c3c815e),
+ LL(0x93904766,0x1ed1aedb),LL(0x376fd0bc,0xcd5e0cf6),LL(0x90d03033,0xdd4c3378),LL(0xd85dca30,0xde39db01), LL(0xe6fab58b,0x49d01dc2),LL(0x6d449f51,0xd16d7940),LL(0xd20a95e6,0x3fb6cf8e),LL(0xbbeeccb1,0x0b10a596),
+ LL(0x0005acd3,0x06ceaa62),LL(0x47555053,0x09db6b28),LL(0x7e7d18d7,0x45d84a85),LL(0x229ad33e,0x33c28b02), LL(0x72e4f34c,0x1e5a6b52),LL(0xb64fa831,0x81eefbe6),LL(0x2aa209aa,0x4983b84a),LL(0x38d6a8d6,0x20777198),
+ LL(0x40096f25,0xbe993805),LL(0xec820131,0x900d4bdd),LL(0x2a993f9c,0x2170cfd3),LL(0x2dfe1007,0xa0e3d894), LL(0x0e7df109,0x600d0b5a),LL(0x47fde3dd,0xc904985a),LL(0xcb89816a,0x15597a84),LL(0xb9dfeb9e,0x8ac8b027),
+ LL(0x6450a179,0x5c9211bc),LL(0xf6333f95,0xd448a70a),LL(0x824e1d7f,0xe9c9a964),LL(0x15750ae4,0xc47d3f3c), LL(0xadcf9482,0x959f776b),LL(0xe741ceb3,0x00557ffe),LL(0x353d7898,0x8b69d3f6),LL(0x45cfa492,0x6b4d80d3),
+ LL(0x30c313da,0xc33ead78),LL(0x67eee139,0x86f96c3a),LL(0x08611b15,0x0c6675c7),LL(0x60620c27,0xf9ee695d), LL(0xd70c9258,0xb35d438c),LL(0xa5e7a4b1,0x1bc2b1e7),LL(0xef92f629,0x38d257f8),LL(0x79fd1eb0,0x090af73a),
+ LL(0xf59342e5,0x96ebd1f0),LL(0x4d053375,0xd4869362),LL(0x5fab54aa,0x7db504e2),LL(0x6e8e43fb,0x17c0801e), LL(0x136b1941,0xd3904d62),LL(0x28a43bd1,0x5932b753),LL(0xacb35572,0x551d895e),LL(0x1a6fdfbe,0x3f7a8a46),
+ LL(0xf7a2df83,0x9e3ea4fd),LL(0x64524d44,0x8b68b26b),LL(0x126aee21,0x74caeeab),LL(0x915d9e1c,0x590a00a5), LL(0x49b90eff,0x5ae2a6ab),LL(0x2df4fe51,0x74b4cb1e),LL(0x07fcb6ed,0x0306ed11),LL(0x502f5b30,0x564ebe2e),
+ LL(0x0c89e9ba,0x5a09a32e),LL(0x84f2466d,0x967f9dfb),LL(0x26a1a8a0,0x8b27416c),LL(0xc3158a18,0x1c21ef95), LL(0x2be23ae9,0xa7ee1ad8),LL(0x4daa1fcf,0x1f312d04),LL(0x44f9c7d7,0x6782f843),LL(0xe19e2681,0xb12ea2bf),
+ LL(0xd20578af,0xd2e43cbf),LL(0xbb5819b4,0x5566460a),LL(0xb658c03c,0x86f6c860),LL(0x62d42d82,0xc8d90309), LL(0xcb883ceb,0x7975a5f3),LL(0xdcded5a1,0xf6f5cf0f),LL(0xd3eb810b,0x25554fb1),LL(0xa596c7c6,0x3df7536b),
+ LL(0x83de31cd,0x255ca136),LL(0x7795eb96,0x7ac532ee),LL(0xb12bc235,0xfa9d83a9),LL(0x4b287a83,0x7df5d231), LL(0xb4f19fce,0xb2eaaaf6),LL(0x1a045f6a,0x7caabfb0),LL(0xb1449e6a,0x6d1b7f40),LL(0x12d22c82,0x24ae41da),
+ LL(0xc0a9d128,0xb0f7a0c3),LL(0xaed0d3bd,0x2adc34d3),LL(0x13e778e6,0x4ebf5778),LL(0xbb8476ba,0xd3b89bd0), LL(0x37413953,0xe09eb528),LL(0xd8ba3471,0x952b705c),LL(0x86a79c09,0xcaa81ade),LL(0x7e0e7b2a,0xc08eed3d),
+ LL(0xc80b4196,0x313fb103),LL(0x88c7ac81,0x25449ece),LL(0x24f16fa2,0xa6cb9ad3),LL(0x728a0c4b,0x4602c441), LL(0x5a000a9c,0xc3366f88),LL(0xef8778bd,0x146623e3),LL(0xf0773fdc,0x184ba0b1),LL(0xaecd8d63,0xe1d115ef),
+ LL(0xae165e6c,0x420d5473),LL(0x108d8575,0xefe137cd),LL(0x6fcff7d9,0x15378c57),LL(0xc1f5b601,0x49c48099), LL(0xf68473f1,0x1b0e3aee),LL(0xd320720d,0xa78329bb),LL(0xdca54cad,0x385e521b),LL(0x5c5b8d60,0x478ce06f),
+ LL(0xca7c4d4b,0x215d7d33),LL(0xa095366c,0x773f3ab3),LL(0x7afeeaa1,0x668e0d11),LL(0x4878d8a3,0x410cd205), LL(0xb2800646,0x2748fd98),LL(0x73a1dbef,0xf1183786),LL(0x7567ed3a,0xecc31bd2),LL(0x0ceb3873,0x775210df),
+ LL(0x9a8f42ff,0x2ea0c2bc),LL(0x4a1c029a,0x62974240),LL(0x9e4dd41b,0x5ee5f5f6),LL(0x2e110249,0x5b1bba80), LL(0x78da8016,0x5ac4eadb),LL(0x1809f79f,0xc2978780),LL(0xe3f8c0de,0x39d2dbce),LL(0x064d3ba9,0x7fb4b5fc),
+ LL(0xcd481ab4,0x038a736d),LL(0x396888eb,0xc4b15c5c),LL(0xd421f36f,0x459a896d),LL(0x47f54663,0x6058b90f), LL(0xafefebe5,0x0a5f6771),LL(0xa5b7c2ca,0x45c97ab2),LL(0x85139ca4,0x6d547af9),LL(0xa29d71cb,0x6db218de),
+ LL(0xfb956184,0xca6e0e7b),LL(0x1f660ac6,0x6682b6e3),LL(0x8b21bceb,0x3959e396),LL(0x632cf9c8,0x0459fd46), LL(0x74f296bb,0xc741250c),LL(0x990dbefa,0x29b9cacf),LL(0xfc35bdf7,0x5065d818),LL(0xa551dc04,0xeb8e9e1b),
+ LL(0x11befe9e,0x4f7d6f7d),LL(0x7478fdee,0xa88f1fce),LL(0xafa688e3,0x39b1e053),LL(0xe16847e0,0x562a0d6e), LL(0x34c26d14,0xf6044e4b),LL(0x7df61b90,0x5ebe8727),LL(0x6b5e5a39,0xa82a4de4),LL(0xfb9d296c,0xc916b0ba),
+ LL(0x2e1dc01e,0x029f1cb2),LL(0xfc429483,0x7699d92e),LL(0x154560f0,0xee0e425a),LL(0x787b6641,0x3f5cdfe6), LL(0xe5f6794e,0x726d87bb),LL(0x23aecad2,0x97d73588),LL(0x09ca351c,0x47f4f5b9),LL(0x57dc5e3b,0xd742ef4b),
+ LL(0x71411a86,0xccd2209d),LL(0x2223e6ce,0x94d57663),LL(0x66c7950c,0x228a7400),LL(0x54dd4e37,0x2d00ef6e), LL(0xd60f66be,0x9ea5daf3),LL(0x8aca724f,0x743c58a5),LL(0x44e38446,0x1f638406),LL(0x92ef6bb0,0x06314bb0),
+ LL(0xbb05589d,0xa7459e7f),LL(0xbfa913d7,0xc3a39592),LL(0xdf07b190,0x27dbabee),LL(0xd2ee62ff,0x1c8a2f33), LL(0xe31e8d63,0x60c8bcb8),LL(0xce410061,0xea1604d1),LL(0x3d7f7a98,0x55e8cfee),LL(0xebc64102,0x49efc316),
+ LL(0x41934914,0x04c86d8e),LL(0xab7facd4,0x26667c76),LL(0xa71a8916,0x319158db),LL(0x114fff43,0xb802942d), LL(0x8ce544f5,0x5efdef7b),LL(0x70e870c1,0xf531c718),LL(0x4d92071d,0x4b9a5f1b),LL(0x60cc48b6,0xbe767cf2),
+ LL(0x717381ea,0xbf389d37),LL(0x06bc5bcb,0xefd9e984),LL(0x67ff1110,0xcc8bc960),LL(0xb05612e4,0xd3414c0b), LL(0x927fad1a,0x084e5f05),LL(0x438e241f,0x999bd581),LL(0xfaa4fab8,0x0c917602),LL(0x95080657,0xda0520d2),
+ LL(0xce2f1af2,0x3160f928),LL(0x364f56e4,0x61186d84),LL(0x25fa68f0,0xe36a5fc0),LL(0x774c584b,0x9e6f66bd), LL(0x9ecb449a,0x2611bba4),LL(0xec5a0667,0xb1e0b341),LL(0x6cddb6c3,0x336de76d),LL(0x65a18f95,0x9668b5b3),
+ LL(0x7c3ec388,0x1ff6c81f),LL(0x40a8e2d0,0x53545b05),LL(0x14ae31d6,0x990a3cc5),LL(0x063a2995,0x769b4c26), LL(0x039e279f,0xcea238f4),LL(0x732fb38e,0xbfc5cfb9),LL(0x82fa05d8,0x99f5a33c),LL(0x69c42686,0x274dc741),
+ LL(0x76af2af7,0x193338ee),LL(0x6914ae66,0x0488c19f),LL(0x5fc58bf4,0x8d197f4e),LL(0xf0e61d4b,0x23de54df), LL(0x44a165e1,0x547dd09f),LL(0x1c2d5471,0x99878065),LL(0x39b311db,0xb2cabfad),LL(0x4b61a7eb,0x0aed63d9),
+ LL(0xbe8110ef,0x03713ac5),LL(0x50f989d3,0xaab1917d),LL(0x358fe8b0,0x0d80fe98),LL(0xa7a1f8e3,0xf6e874c5), LL(0xdeb42398,0x05650fd8),LL(0x1c44de73,0xbad3e085),LL(0x1c27f3c2,0x5369135f),LL(0xa7fc74ac,0x14bc04f8),
+ LL(0xb5dae291,0x18cbf622),LL(0x9356b88c,0xce290570),LL(0x39eba4e6,0x61bbb446),LL(0x980fee37,0xa79c291b), LL(0x19960cc6,0xd9f18006),LL(0x0ce98896,0xb0823f41),LL(0x1377df6f,0xf2bc612e),LL(0xc0b0e71c,0x1c07bded),
+ LL(0x37211fd5,0xffbf9841),LL(0x04a81410,0xbd704a6b),LL(0x6abf1c67,0x653cd2ee),LL(0x40681621,0x73ab8aa1), LL(0x271ada5c,0xc0bae4fd),LL(0xc46f189d,0xf567cae8),LL(0xa5535334,0xd183cb27),LL(0xe53c530c,0xcbf133f7),
+ LL(0xedd6a17e,0x32e53f78),LL(0xa2194fae,0x6ce6da9a),LL(0x58cd3586,0xa89b8054),LL(0x43b520a5,0x0037febb), LL(0x653e2c0b,0xbe67a2cf),LL(0x50301f52,0xc07a1ed1),LL(0xf5ea954f,0xf98b2b60),LL(0x7af6c499,0xfa6da95d),
+ LL(0xe3889cb1,0x44892091),LL(0xd45ae338,0x123fc555),LL(0x02a63128,0x2bc4a9ef),LL(0xa1dbb436,0xb72012c9), LL(0x556a0b46,0x8c75f7b3),LL(0x5b7608a4,0xe4c6f46c),LL(0x38fce20f,0xb36abf68),LL(0xbf6c21e1,0xb5a8e657),
+ LL(0xcecd5963,0x9ceaeefe),LL(0x6105fc29,0xe84f200d),LL(0x8591e346,0xc28981a9),LL(0x207001f1,0x0be4e931), LL(0x88616b18,0x31399d9d),LL(0x238c626e,0x3dac9f55),LL(0x65574274,0x0213fca7),LL(0x827aa853,0xa3560244),
+ LL(0x1ca99134,0x3ffbfeeb),LL(0xd07a2dac,0x0a4b56f6),LL(0x75417a6b,0x01795eca),LL(0x18a5fb22,0xe2a6dd9c), LL(0x8aca0cd8,0x13c97586),LL(0x7c323c52,0x3c2bb26e),LL(0xe38319bf,0xa3688cae),LL(0x4c88726a,0xe04b44b4),
+ LL(0xb0a88a4c,0xfed864d0),LL(0x6b1fa305,0x3e6cf152),LL(0x00e18e4a,0x8416b5f0),LL(0xfa4cd8f2,0x3a7603ca), LL(0x7ec750ef,0x8b04d5ff),LL(0x1c1ced05,0xe1867f9b),LL(0xdac2f8c1,0x87ffd0fb),LL(0x08b3cdca,0xc9ebe420),
+ LL(0x029c247e,0x5028a4fd),LL(0xa5ae3e76,0xd6225a43),LL(0xf970817e,0xfb3fa71c),LL(0x9ab4aef1,0x74216809), LL(0xa39c2f13,0xca81ee99),LL(0x86a97827,0xa8336e42),LL(0xb6489555,0xb75aff99),LL(0xe565435c,0x005b2338),
+ LL(0x524bdb34,0xbaee27bb),LL(0x82e47e71,0xbf22e1c9),LL(0x97491139,0x6ab1d712),LL(0x2cf4cbff,0xf420ce06), LL(0xb2b0c86a,0x9f96a2fc),LL(0xabeb7335,0x42765dd9),LL(0x45b7e044,0x7c223bb7),LL(0x1794e144,0xce3f9245),
+ LL(0xf3ee5c4e,0xa0a15b27),LL(0x54622215,0x1721c5bf),LL(0xada5a99c,0x0003fd16),LL(0xdbdccc7b,0x8e96dd56), LL(0x43f83748,0xd1abdc0b),LL(0x0f5ce74b,0x71cac4a6),LL(0xd46717ad,0xb8539aff),LL(0xb99661d9,0xeb65c589),
+ LL(0x85e89e17,0x66b4df3b),LL(0x6fc30672,0xc94fad66),LL(0x81d90df8,0xfd2aa80f),LL(0xbd8234c1,0xed73a163), LL(0x72eb45dd,0xe1a2c0b9),LL(0x902b5ca9,0x417e355d),LL(0xd5128812,0xa8f55aaa),LL(0x3c14cb79,0x4826b934),
+ LL(0x394d7a92,0xeae495e3),LL(0xb90faec0,0xcba23153),LL(0xf6d9d80c,0xd687c821),LL(0x8bff3082,0x951dada2), LL(0x701708ad,0x4e74f1f0),LL(0xdd2134f2,0xa6333cd1),LL(0x04665f7c,0xeea276cf),LL(0xae74c17a,0x527257fc),
+ LL(0xe51b53bd,0xeb3fd493),LL(0x69ec567e,0xae7807db),LL(0x5de15fd0,0xa50124aa),LL(0x1336f055,0x781bfe70), LL(0xd70a0dfc,0xb5729a74),LL(0x9f50c1a3,0x89da37f3),LL(0xcd8e6c1c,0x6e063297),LL(0x181d0271,0x17eb6ec1),
+ LL(0xe4e52a8c,0x36e7251a),LL(0x94705324,0x3acfe89b),LL(0xbc130c3b,0xaa94f06e),LL(0x309ae25a,0x01b5e44c), LL(0x0f61b55b,0xb72160f2),LL(0xe7bbc3f2,0xbef61953),LL(0x1bf138a1,0x96734d7a),LL(0x08c25135,0xdaa6186c),
+ LL(0xf34534a2,0xa3b031b2),LL(0xde46f581,0x44136619),LL(0x6d379647,0x4d0ed04b),LL(0xbb2b6735,0x4879d90d), LL(0x590156e0,0x8f7e031a),LL(0xf42bbc53,0x28428354),LL(0x5c5b791e,0x1cbed33c),LL(0x4cfc5562,0x17571645),
+ LL(0x7f76462f,0x8392350a),LL(0x0c216ccb,0x659ce7db),LL(0x047e35d5,0xe87a78b7),LL(0x6e0862d6,0x307c4861), LL(0xe70741bd,0xd444fb86),LL(0xfea1abe2,0x1138a886),LL(0x62b79c4f,0x4695397d),LL(0x003130ee,0x11aaf588),
+ LL(0x3a11712b,0x53bdda6d),LL(0x40fba3d2,0x30c384bd),LL(0x50ea38be,0x63039585),LL(0x3da9738a,0x7f110eca), LL(0x5b68c01e,0xbd701fc6),LL(0xcc48f38d,0xd23f3e8f),LL(0xf8b9bb65,0x6e2557eb),LL(0xa3dafc8f,0x29ceb4b6),
+ LL(0x4b6b7705,0x24659686),LL(0x4aca2b43,0x04143a8a),LL(0x975e06d8,0x3baed256),LL(0x3e834249,0x846fb3c9), LL(0x75f6770a,0x7890761e),LL(0x203c78fd,0x1187920e),LL(0x6b26281f,0x9b06c3a9),LL(0xa98215e1,0x3fe3dccd),
+ LL(0x4f33655e,0x099d7d7a),LL(0x662fb55a,0x1ba571e6),LL(0xcbc497f0,0x1a0d0147),LL(0x2862ff38,0xa94218ae), LL(0x5ce08047,0x1b0f919b),LL(0x2baf46cd,0x9a3ac37a),LL(0x8964cc68,0x76b7a03a),LL(0x4d3e1a40,0x5aed8c6d),
+ LL(0x7f034ff4,0x6607179c),LL(0x3781eac2,0xefb8fcd9),LL(0x7b022138,0xfa57f8a9),LL(0x56ab6039,0xc5bb9f1d), LL(0xe4d2ab7f,0xf9027e24),LL(0x77a9e364,0x3d67ad71),LL(0x1f7f487d,0xc579e70c),LL(0x2a7e6bd0,0x7fefc894),
+},
+/* digit=35 base_pwr=2^245 */
+{
+ LL(0xa45cfd31,0x2cb91662),LL(0x16f65cfe,0x09dd56d3),LL(0x14f3de51,0x983e005d),LL(0x210f64fc,0xb9dc05b0), LL(0x885eafe5,0x22790afd),LL(0x7444bdec,0xbd5213d3),LL(0x8987300a,0x289dca92),LL(0xb3960b76,0x69fb2ac2),
+ LL(0x9ae7540f,0xe3274886),LL(0x6131e921,0xd7386631),LL(0xf2a360c8,0x2e3d4fd8),LL(0x3d9d41e0,0xb20a59b6), LL(0x99082a34,0x72b67eae),LL(0x51819470,0xfad6aa7d),LL(0xa2d1d007,0x7c299b9a),LL(0x8100bed0,0xc1f841e0),
+ LL(0x43e90ebd,0x2c1f7d4c),LL(0x1fc72b07,0x58b78107),LL(0xaf94f402,0xda8503e1),LL(0x59f244b0,0xfbb724b7), LL(0xfcd8755a,0x2fcd2186),LL(0x868482b7,0x7407cdee),LL(0x349be3d5,0x4d62f578),LL(0xdcc6202c,0x4a012544),
+ LL(0x151ffc08,0xb8a414d2),LL(0x740d6b55,0xaa79acf0),LL(0xcdf472ab,0xeeab0104),LL(0xa3aa5f1d,0x5014a8c1), LL(0x33f13425,0x8c743405),LL(0x57eb54d4,0x2b776b49),LL(0x548a723b,0x3a0cc4ac),LL(0xc79fe63a,0x65aae6f3),
+ LL(0xee5e579c,0xe8b388f2),LL(0x991c03d4,0x31cc9373),LL(0x567bfa7c,0x53eed518),LL(0x67f985ed,0x267e282d), LL(0xb4763ea0,0xc435fd22),LL(0xe39b7703,0xead83837),LL(0x094ba5b4,0x806daad5),LL(0x45842672,0xa738a847),
+ LL(0x9984c4c2,0x99421b42),LL(0xd35c7bbd,0x1a3bce27),LL(0x3563b09e,0xe51ae6f6),LL(0x8d9c9fbf,0x8e67853b), LL(0x6b2100b5,0xca8784da),LL(0x98879bba,0xe89a24f7),LL(0xe286b039,0xe901b45c),LL(0xf50384bd,0x23dedbb8),
+ LL(0x5cbf7df2,0x4728cbdb),LL(0x6764329e,0xed274fdf),LL(0x642d199a,0xc2af1a07),LL(0x17a50e7e,0x5d665659), LL(0xfaa5eb82,0x7babf4bc),LL(0x99fe4026,0xd3bcfc67),LL(0x607d9f41,0xaa5d2648),LL(0x967efac1,0x7405c071),
+ LL(0xdfa782a4,0x79447ef9),LL(0x74cd9500,0x6dadc8e1),LL(0xdc38f762,0x0574020e),LL(0xe2ee7a14,0x17596d7e), LL(0x9e1f8adc,0x9ef75af7),LL(0xa4791da0,0x5ac5f216),LL(0x7b7b5d80,0x1583226b),LL(0xa21c26cc,0x59f3f053),
+ LL(0xf95e30d9,0xd80e7fdc),LL(0x0a3a3616,0xecf5041c),LL(0x03043fa6,0x50b93b8b),LL(0xae262ad6,0xa31a2aa4), LL(0xd63cd98d,0x1468b370),LL(0xdc07a367,0xfb89cc65),LL(0x4d47b59f,0x6cf1df6b),LL(0x1b6350fe,0xab451a99),
+ LL(0x8c124dff,0xeb74554d),LL(0x21be0be0,0x781a8c4d),LL(0xe3510068,0xfaacc154),LL(0xd6238265,0x16655d65), LL(0x0466134a,0xba46d27b),LL(0x3101e283,0x1a3f51b9),LL(0x096ec237,0xc08298a9),LL(0xc69cfb5b,0x46248627),
+ LL(0x81a0500f,0xf9e7a5a4),LL(0xbd2e03e7,0x92db27d5),LL(0x82899e3c,0x3dcce4f6),LL(0xf39a39c7,0x861f1797), LL(0x69dc8961,0x175b2430),LL(0xdc67953e,0x93d2a88e),LL(0x92d794d6,0xa40f3704),LL(0x3526eeaf,0x607019f0),
+ LL(0x22f37d65,0xf20e163b),LL(0x32cf180a,0x70fd00c8),LL(0x0b17244e,0xff1a97d2),LL(0xacedb33a,0x9a5a141b), LL(0xcc16bbb4,0xf03dd868),LL(0xa40e44e9,0x9b15372d),LL(0x15ac397f,0xd5ba6436),LL(0xc821f6b7,0xb1a886d4),
+ LL(0x4b7b4e21,0xbe3aacda),LL(0x66b56729,0xad9829fe),LL(0xd541cc1a,0x78965cef),LL(0x7d17631e,0x414bfea7), LL(0xc64dd621,0xf55835d9),LL(0xef644d93,0xa0ebf68b),LL(0xc8a40021,0x01d15340),LL(0x42b99aa0,0x00ae640d),
+ LL(0x6881e64f,0x92321ee2),LL(0x5267bdd3,0xaccab5c8),LL(0x5927647b,0x0c1f87ea),LL(0x162c6d86,0x0093d07e), LL(0x389c711d,0x49868df4),LL(0xc11e1f37,0xe68d69ae),LL(0xb4207246,0xa40e7aa8),LL(0xce832395,0x4ae8d126),
+ LL(0x86450cc0,0x5f9b128a),LL(0xc8ec07e6,0x88f76293),LL(0x179702b8,0x0762f293),LL(0x4910006d,0xb5696102), LL(0x35fe0505,0x3951291b),LL(0xce8d7056,0x70f75a5c),LL(0x2eb13369,0x4541beaf),LL(0xa643316c,0x7060a749),
+ LL(0x49c879a5,0xee16abd0),LL(0xa47ac42e,0x844874a7),LL(0x3c9c2326,0xee3f8a20),LL(0xdeaed33b,0x99a12054), LL(0x63b333ae,0x4814a15b),LL(0x9d923fa0,0xee9f28a5),LL(0x33b1b1ef,0x5b0cd250),LL(0x8346d928,0x3ccc39b9),
+ LL(0x002bec95,0xf5c1000e),LL(0xf63528c2,0x2ba2f18c),LL(0xcdcec15a,0x8102f6c8),LL(0xbb13d14a,0xab7effcd), LL(0xfcd3787c,0x183e0ba2),LL(0x2f4a7fc0,0xae70635e),LL(0x760bbc96,0x473ed37f),LL(0x8a8efb39,0xf0ea0acf),
+ LL(0x29b526a9,0x63cea36c),LL(0x9d03f3db,0xcdb31613),LL(0xd57cca8e,0xa3891096),LL(0xa14a8ffc,0x646418a9), LL(0x8075291f,0x10f8906b),LL(0x2c618bf6,0x8221d941),LL(0x8a5da4df,0x1dc1ae7a),LL(0x8a8cc8bc,0xb66b96e3),
+ LL(0xfe3551b4,0xe4da7e48),LL(0xad9b3827,0xe6891cc9),LL(0x6b37b99f,0xb266733f),LL(0xfd5d1219,0xfccce911), LL(0x7262b8cc,0xe5a47c4b),LL(0xe656af49,0x5d349caf),LL(0x7e04e48e,0x7a3a4a28),LL(0x80ea7d03,0x7c39a68e),
+ LL(0xbee0d434,0xf35d5e32),LL(0x0b536161,0x9651f3d9),LL(0x72cb370c,0x42634cc9),LL(0x406b3457,0xa7764026), LL(0x65d53d80,0xec7525bd),LL(0xadcc8b05,0xf44a1bca),LL(0xda112ddc,0x12ef8427),LL(0x20a0f78f,0x796a65b3),
+ LL(0x6bd5b0ab,0x12726e24),LL(0x8242fe07,0x9e441467),LL(0xde2bea52,0x4b52e276),LL(0x10422c2c,0x3a76b6b4), LL(0xb4e496b9,0x71f14945),LL(0xf36dce4f,0xd20f04b0),LL(0x2b310e90,0xa0e57d8d),LL(0x32ec8f38,0x59eb7737),
+ LL(0xaaf6619e,0x20a19834),LL(0x691a538e,0x633b94e8),LL(0x92cdf395,0xea1a8985),LL(0x4349b971,0xa3a01c57), LL(0x30822c59,0x0d65192a),LL(0xa522ae8c,0x93a5152d),LL(0x0e1aa4bc,0x5b09a7a3),LL(0x8d3b97a9,0xdd2588f3),
+ LL(0x5b62a3a5,0xafa1f62a),LL(0xa9ace9c5,0xbded10e6),LL(0xbf6e7fb2,0x9d03e061),LL(0x4b87177a,0x60c564a8), LL(0xc22c14c1,0x36be1308),LL(0x9425b6bb,0xeeda57e8),LL(0x36af38c2,0x5ddaae14),LL(0xecdc2911,0x1695464b),
+ LL(0x161e13e7,0x4b795e1d),LL(0x907e7069,0x0f9abc20),LL(0x54522fe7,0xfb3be618),LL(0x1938134e,0x9e2d0f37), LL(0xd292c6b0,0xb8dc7c36),LL(0xc1e77895,0xbafbf59c),LL(0x1b6c55f3,0x7d0132cd),LL(0xf609f087,0xefa02ed9),
+ LL(0x03519f9f,0x4bfe6aeb),LL(0xdab4c075,0x248e19a0),LL(0x69429f29,0x83ee803d),LL(0x8190ce56,0xdbbe31e2), LL(0x6b787a5d,0x3ba735d2),LL(0x1818070c,0xfa021185),LL(0xa3683cee,0x9b653000),LL(0xe9517ba2,0xfc3c7907),
+ LL(0x88d94f69,0x6521c92f),LL(0x7b52da8d,0x3950e9e8),LL(0x8ee64a88,0xadb81700),LL(0xf73994fe,0x8ccbfa3c), LL(0xb048e71e,0xb780ab12),LL(0xe2aeb607,0x52879e7b),LL(0x3237554f,0xef04b1ed),LL(0xe1d5a5ef,0xaeba6a96),
+ LL(0x266f7e93,0xedb58542),LL(0x5ea02852,0x9a1b8057),LL(0x5beb3fbd,0x1963c6f2),LL(0x1ad52473,0xf4183355), LL(0x6faed2f4,0xca772e9e),LL(0x3cf8fd1f,0x937eddd0),LL(0xc1d49dac,0xb3255376),LL(0xe670d3cc,0x549c2119),
+ LL(0x3b6cd199,0x10edbf39),LL(0x75644d6a,0xe9479223),LL(0xd6e8cc36,0x36cfba92),LL(0xfe00d80a,0xa37b1d91), LL(0xdeb5ef4a,0x3aadf918),LL(0xd3893df2,0x5bb2ca4d),LL(0x6569ab8b,0xa776000e),LL(0x1cf64905,0x4fb2308f),
+ LL(0x273731c2,0x04da4d09),LL(0x23c05518,0x1d4a61fe),LL(0x0d5206e5,0x201098a3),LL(0x06430c82,0xd9a7ad4e), LL(0x36f7f462,0x56df0d06),LL(0x44c81042,0x2c067f3d),LL(0xc453d28e,0x01193bc9),LL(0x45ce6e64,0xcdf5af5d),
+ LL(0x0f7d8d12,0x9992ce1a),LL(0x0e5e4542,0xa7c46a61),LL(0x057802ba,0x3fcc0647),LL(0xc7dccbe2,0xa78f73d8), LL(0xf138dc6d,0x67f37b94),LL(0x650a9002,0x89330885),LL(0x68aa24c7,0xf661caf2),LL(0xbf73c435,0x47732bcd),
+ LL(0x3b04622e,0xb9ba5f91),LL(0x477d420a,0x24265f73),LL(0x0d44cb89,0x5da6ddb0),LL(0x151fc40b,0x9f8cb8b6), LL(0x9b9f2613,0x81b6956b),LL(0xebb917df,0x37419206),LL(0x2bb7a709,0xdb9cfc16),LL(0xbacd3fb7,0x7a800aa3),
+ LL(0xd93f6e1a,0xf8ea9359),LL(0x3d41c118,0x729005d4),LL(0x7cb641af,0x4c293410),LL(0x895e8e78,0x6b2b4671), LL(0x5958fad3,0x2a1251d0),LL(0x78619fe4,0xb69bc2be),LL(0xd911d318,0xd74df34c),LL(0x15102704,0x5def8378),
+ LL(0x08268482,0xb19ea17a),LL(0x1c37e5d1,0x14591196),LL(0x7640df9c,0xe0e12d2e),LL(0x8c941274,0x8fd6bd4d), LL(0xdcd142b1,0xc3f9f120),LL(0x78dfe6b0,0x106c49ac),LL(0xcfd9b542,0x243c8e93),LL(0x0a2c5fe6,0x6758062d),
+ LL(0x15f2f638,0xee5a99e8),LL(0x13979ab6,0xb95b008d),LL(0xacfcca6a,0x7fd03105),LL(0xe4ced1b3,0x6af914a4), LL(0xa25f8627,0x8bef3d0f),LL(0xf9b2f931,0x21bae309),LL(0x2195a839,0xe85dee2b),LL(0xa3baeb25,0x46ad0ad9),
+ LL(0x022b62a9,0x6d8e40f8),LL(0x90b5cd33,0x4a6bbabf),LL(0xffa89bb2,0x53481e6b),LL(0x22003cc2,0xd674b3b3), LL(0x004a2aa6,0xc71a0a85),LL(0xb5404657,0x86df9697),LL(0xc74e80cc,0x407727f4),LL(0x950a7b08,0x39c13926),
+ LL(0xd74472a4,0x26bee75a),LL(0x2eb6f0d6,0xbf7c4ea0),LL(0x608bea48,0x689a5de5),LL(0x29d513f8,0x5b383892), LL(0xda457cf9,0x49fee2c2),LL(0x62d523d3,0x7fc0aee7),LL(0xb636a46e,0x5bf447de),LL(0x8194766e,0xda3efd98),
+ LL(0xd382756d,0xa77c3ad2),LL(0x0fa55315,0xc0eaa9de),LL(0xb1df90e3,0xe68d0a51),LL(0x01d1d8a7,0x0994e8c7), LL(0xa91bfed0,0x4f898bc3),LL(0xab6025df,0x1c2a3e46),LL(0x8b269271,0x37bd5c37),LL(0x8b97f0af,0x4e07f5ca),
+ LL(0x97923d14,0xe346b5aa),LL(0x9e0bd9c4,0xa8549f61),LL(0x40113a60,0x78e59d6b),LL(0xed8a0fc6,0xe3015fb2), LL(0x8b43288a,0xfc56a08f),LL(0xcae6c18a,0xcbdb8cae),LL(0x5f4423db,0xcb147c44),LL(0x10f361c1,0xa6aaa6c9),
+ LL(0x7caf702a,0x6be86c0c),LL(0x736f6dac,0x2188e83c),LL(0x59ba2af9,0x40b5ed25),LL(0xab8018c3,0x76211894), LL(0xf5b0b048,0x0c1c532f),LL(0xe3200521,0x7503aca9),LL(0xdfa7eb2d,0xb9325d85),LL(0x2edbb68f,0xe6c25a00),
+ LL(0x8c673c89,0xf9ff5867),LL(0x099c7bae,0x4925a046),LL(0xdbb1e1b6,0x0b3bf59a),LL(0x30ae084f,0xc7e9d9f2), LL(0x0fa1776f,0x70982396),LL(0x624c897b,0xb2e1b98f),LL(0x6c3534d5,0xa9a6407d),LL(0xa4dc3f63,0x5e22319b),
+ LL(0x2431dc01,0xc2f0bf3f),LL(0xc2cfb315,0x478f797d),LL(0x3b3ae0c5,0x6559f59c),LL(0xe18e74a8,0x7e95aa62), LL(0xd3fce912,0xf2a94006),LL(0xe1bd96ce,0x7f1b57a2),LL(0xa3d7b828,0x55028ad0),LL(0x4f09fe92,0xadae7e92),
+ LL(0x757b418f,0x2174c736),LL(0x3661d54d,0xd904ba43),LL(0x63218ecb,0x0281f912),LL(0xc50c8eb6,0x5fd03ba0), LL(0x896a5aea,0x29626906),LL(0xe55ee73f,0xab4d3f27),LL(0xedfd1991,0x3db1c43d),LL(0xa3f9c340,0x498cc31a),
+ LL(0x4fe75d33,0xa43bdec1),LL(0x66ae5d4f,0x5b067dfb),LL(0x464c8239,0x84581814),LL(0x503a52ea,0x2f10557f), LL(0xa10fbb90,0x21c4c180),LL(0xf79d5e02,0x33b191ee),LL(0xb499478e,0x6dee3881),LL(0xbfbd56fa,0x27dfef0b),
+ LL(0x28be2d62,0x671a3dd7),LL(0x050897ff,0x06f2f4c2),LL(0xb7c4587d,0xd92bdab6),LL(0xfd8d5160,0xd2253a16), LL(0xf1c098b1,0x64f6e4ae),LL(0x11ea7255,0x005a3939),LL(0xdab542e5,0x2ed4eb92),LL(0x50c5e874,0x26920bc1),
+ LL(0x5d0bc87c,0x93e8f58a),LL(0xb2b29b4b,0xaa4d313e),LL(0x01b2096f,0x3e175dec),LL(0x1cf31783,0x6c560972), LL(0x73b76f6b,0x9d41aca2),LL(0x5f1d4b12,0xa2454cf5),LL(0x65b35eea,0xa5615196),LL(0x70af4fde,0xf241e516),
+ LL(0x65061472,0x5255e91b),LL(0x5bdbb257,0x6ef98d2d),LL(0xc74c7b2c,0x0d1d1ab1),LL(0x2e9febde,0x9ffb9fdf), LL(0x6c50bf24,0x853f3b9f),LL(0x6fbd22bd,0x3d369594),LL(0xbcdad9a9,0x4d281126),LL(0xdc46ddc1,0x99eb62b6),
+ LL(0x4b10c402,0x5aa8c8b2),LL(0x473af61d,0x2e79f595),LL(0xce360f37,0x96153360),LL(0x66bc29dd,0x16dffe22), LL(0x1137f9c3,0x35536eb1),LL(0xe2a6a47a,0xd636ecad),LL(0xb499f840,0x83cdf214),LL(0xd247f18c,0x3642c77c),
+ LL(0x916ef527,0x4d906a2e),LL(0x293dc085,0xadeb94d0),LL(0x1491da3e,0x03a07801),LL(0x0b84d2eb,0x177dceae), LL(0x7b691e0c,0x61e5a3c1),LL(0xd172cea3,0x47d40bd7),LL(0x8ca76bce,0x7d0646ad),LL(0xc64d635f,0x90b030a9),
+ LL(0x97118df2,0x71eca8e7),LL(0x3ac9536b,0x2cd48f70),LL(0x89fb4d72,0x9ffd991d),LL(0xebf781fb,0xd49006bc), LL(0xd3e60da1,0x688af07f),LL(0x619063b7,0x5f74aa46),LL(0xa40d313f,0x44fcbeb3),LL(0x326faaa4,0x0ed5908b),
+ LL(0xf41ec05d,0xe836d537),LL(0x221b0c32,0x01eaf207),LL(0x72f8c904,0x1d6a0bb6),LL(0xdfd74641,0xa6ef58b2), LL(0x811bd6cb,0xbb855ceb),LL(0x05408eab,0x7b1c8b71),LL(0x4187fb7f,0xd24d709e),LL(0x8b30a9be,0x283d647d),
+ LL(0xf9f0d6e6,0x6d9d3793),LL(0xb1c06b19,0x02fc3ddb),LL(0x94d9abec,0x8ff86793),LL(0x24705873,0x1f20bba2), LL(0x0021b290,0x74eebc12),LL(0x35b6c157,0xd859521e),LL(0x431aea79,0x2201aa41),LL(0x90da1a75,0x79c1caaf),
+ LL(0x6e412a6a,0xcd6abab7),LL(0xb4c58b05,0x82399139),LL(0xa3b55538,0xdf416966),LL(0x679882d3,0x2b2d546f), LL(0xf9145657,0x17425cbc),LL(0xe1b8247e,0x3cc6735f),LL(0x57edd04c,0x13e50c56),LL(0x1b85b7cb,0xc8723137),
+ LL(0xdc0ab9d5,0x907b5b02),LL(0x4ab23b78,0x5617fb7f),LL(0xe8f449cd,0x7ae8ff03),LL(0x174e0e22,0x86d3ff17), LL(0xbf1e9f8d,0x22cb7f69),LL(0x0b0c62f0,0x12f0abbe),LL(0x537f658c,0xc8315981),LL(0xc467f2b4,0x43da2770),
+ LL(0x5b9e88ef,0x3ef9bb81),LL(0x3a8e51f2,0xb8526318),LL(0xf8d744ac,0x2e47cb7f),LL(0x510aaa7c,0x63d6dc16), LL(0xb40ccc41,0x54da7cdb),LL(0x402b2ad9,0xdecbe5fd),LL(0x34c8f225,0x14c6f15c),LL(0xc6559496,0x6d8b2342),
+ LL(0x66fea635,0xa4b72281),LL(0x22f248a8,0x55f5c27f),LL(0x0959cd01,0x3ced1483),LL(0xb53bdf42,0xcc6469db), LL(0x1e460645,0x2bb2346f),LL(0x9d7535e7,0x4d8573c6),LL(0x49cd2d68,0x988cddd5),LL(0xb9835538,0x785c4a70),
+ LL(0x1f6e396c,0xb08337b3),LL(0x49a782f3,0x6166b21e),LL(0x8ec9b974,0x1ac6198b),LL(0x0bb44d3d,0xee2e3446), LL(0x35039dd9,0xdb283740),LL(0x29f5c692,0x7c708f95),LL(0x98ddb466,0x8914cce0),LL(0xd446f3cf,0x8bb1b9f1),
+ LL(0xee0933a3,0xa9dea222),LL(0x4b26049e,0x2538bd43),LL(0xbdcafae2,0x18741aca),LL(0x16b0f4bb,0xe0f830f7), LL(0x902caefa,0x0479ec95),LL(0xdcda9e64,0x1f858937),LL(0x515c4089,0xe75b4f7b),LL(0x2eb91b51,0xb78afde4),
+ LL(0x18949935,0x1eebe3e9),LL(0xba092037,0xde8deaa9),LL(0x93609411,0xd43cf4ef),LL(0xc2d7b76e,0xe0fdb1e4), LL(0x4e34b4bd,0x1d3191a5),LL(0x9ccc4c26,0x106d92f1),LL(0x29a2a6d1,0x1a404ef6),LL(0xc598f481,0x3338bc9c),
+ LL(0xe3fcbf71,0x3945e39d),LL(0x9c89ab61,0x123b082c),LL(0x0f9f3c37,0xc7477f77),LL(0x7dbcc077,0x408c0c7a), LL(0x3654f98c,0x6c4d99f5),LL(0x05299a1a,0x276a007a),LL(0x23e2d7d0,0xabd4b8ea),LL(0x86017545,0xe05a5f3a),
+ LL(0xa11b03cd,0xde3b885c),LL(0x8df5d64e,0x46ef0755),LL(0xbf3f085d,0x112a49d6),LL(0x198ff32f,0xf6ebf441), LL(0x7feae481,0x581c00d8),LL(0xcfde5b2f,0xf2b43827),LL(0x9b7358f2,0x3ceb7f8f),LL(0x55fe7117,0x95761fbd),
+ LL(0xdc04773c,0x305836fa),LL(0xb3c4873c,0x66324504),LL(0x55b130de,0x5d878c1f),LL(0x8ad49a9b,0x96e9b28c), LL(0x76d70429,0xd1a707b8),LL(0xaa402e90,0xaff33f93),LL(0xedbfb28f,0x733d6256),LL(0xa75d2342,0x9e421a7c),
+ LL(0xc02e49c1,0xdf86b254),LL(0xb56d308a,0x6bb53867),LL(0x73f29561,0x771dde4b),LL(0x8bf28e5f,0x96eaf73e), LL(0x06fbb550,0x9b1ee6be),LL(0x97d4a4e8,0xe09fec77),LL(0xd5aa84fd,0x93bdcd60),LL(0xd457ab9c,0x3fa8d3a0),
+ LL(0xa0a2e52c,0x315b32b1),LL(0x3bbcb61d,0xe7e50b2d),LL(0x5e5c6e11,0x8a55cc0e),LL(0x961295ef,0xc2bfa998), LL(0x66e996d1,0x4a5ab3bb),LL(0x4886a421,0x22c42e4f),LL(0x4850e0a4,0xa0cdd364),LL(0xc64ed713,0x7682d38d),
+ LL(0xa2c539e4,0xe31575c2),LL(0xa756daf9,0x0bac5dcd),LL(0x91f55a12,0xe917cecf),LL(0xe96f6299,0x1e96433b), LL(0x3700d8fb,0xeec7c71c),LL(0xdc9b4444,0x9a1d2965),LL(0xcf74f19c,0x3d2c6970),LL(0xac5e0d6b,0x3b444c48),
+},
+/* digit=36 base_pwr=2^252 */
+{
+ LL(0x8ccb854c,0xe563cefd),LL(0x65b0c45a,0xf5452cdb),LL(0x9c37f743,0xb3c78769),LL(0x95d444ab,0x34e9d192), LL(0x52ff26b7,0x29347946),LL(0x9b94d642,0x70d6ecfa),LL(0xfdaffb8f,0x7d201858),LL(0x45dcdc71,0xc288719d),
+ LL(0x0728a2eb,0xc695469d),LL(0xc433d11c,0x7b46244e),LL(0xf106c08e,0x4a8b99ba),LL(0x63422083,0x7989794f), LL(0xd4fc5696,0x82218867),LL(0x3c79cdb8,0x6b021f28),LL(0xb26d5049,0x5ff7bbea),LL(0xa7261628,0xb78611ca),
+ LL(0x531313d7,0x5a75f961),LL(0x66dcdc9e,0x85a1f4db),LL(0x6460e991,0xae3026b9),LL(0x17ecf7cc,0x7d467bef), LL(0x05118708,0x8a0dbf67),LL(0xf3b2f1c9,0x54bfa368),LL(0xf2c0e4e0,0xa9fc9d5c),LL(0x5e93611b,0xa8c2ad11),
+ LL(0xaa1256bd,0x3ef1faf0),LL(0x9e4631de,0x0f224545),LL(0xde9c2676,0x69cb9800),LL(0x95782b24,0x26019816), LL(0xa66c0ccd,0x945c172c),LL(0xb440719a,0x6c25f635),LL(0xa49f681a,0x917d5dba),LL(0xb2dc5df4,0xc0cad047),
+ LL(0x5960ef1c,0xd45bcf4c),LL(0x8c6979d5,0xbabcb16d),LL(0xae9090d6,0x8e3be750),LL(0xac0eb728,0x9481d261), LL(0x0d6a7d46,0x46b436cd),LL(0x1f976501,0x6eb1a6a3),LL(0xdbe1064f,0x5984ffa2),LL(0xf809dc20,0xe6575fb1),
+ LL(0x4d974a81,0xf0426d80),LL(0x97a74be6,0x61304f0f),LL(0xa9486531,0x2346ff98),LL(0xf53d781a,0xa1242cca), LL(0x97355f15,0x482f03df),LL(0xbd6058cf,0xc607ed33),LL(0x68aefe28,0x03bc8cd4),LL(0x851307e4,0xa6e7de5a),
+ LL(0xc6af7d44,0x2c07df0f),LL(0xb15a9188,0x310b251f),LL(0xd3e15c2f,0xd42661ce),LL(0x1b4d8313,0x5198fd90), LL(0xda8368a1,0x7a6062cd),LL(0x5e9c2542,0x1a905d11),LL(0xdae37cee,0x1d752b70),LL(0x16bf84ca,0x3ed8c1a5),
+ LL(0xeecc2f22,0x5190fb0f),LL(0x698d8e60,0x3df210f3),LL(0xf5f3ce72,0xcce57d3a),LL(0x312b8fc6,0xb2fb6223), LL(0x71867c84,0x79947005),LL(0xbe139ebe,0x141cd92c),LL(0x5de7944e,0x415efc9e),LL(0x45821058,0xae9ee919),
+ LL(0x5bf363dc,0xd696e1d9),LL(0x8251449c,0x6a1bcfc0),LL(0xa5fa53e9,0xa1b82dff),LL(0xeef05378,0x6c56b5be), LL(0xc0e74dc3,0xaf9efe4c),LL(0xe5c1f1a0,0x3d9a7ae9),LL(0x2823c3e5,0x34b38577),LL(0x41fbabac,0x69f297dc),
+ LL(0xd74c5a65,0xf01aff98),LL(0x1951a915,0x97993104),LL(0x723096a6,0x8b211915),LL(0xa769ef1f,0xf85910c4), LL(0x8ddc0eb4,0x30cefb9e),LL(0xbb09607b,0xd5957eef),LL(0x2355b499,0x2e139c9c),LL(0xc1789013,0x5749531d),
+ LL(0x5475f2d2,0x1603ca64),LL(0x0a336508,0x57190e0e),LL(0xcea7d558,0x2203b703),LL(0xfb5503e3,0xf16eba4d), LL(0xb7344a98,0x62e2ce3d),LL(0x9a4efa7a,0xebf5b243),LL(0x1c914064,0x96212455),LL(0xbe5bbc07,0xd2c5e31c),
+ LL(0x06c30b28,0x2b5f2f77),LL(0xbc9823d3,0x0931841d),LL(0xadfa6fdb,0xd16fb08b),LL(0xd6fd441e,0x8892bae2), LL(0x2e576983,0x3fc64630),LL(0x07b05529,0x08c60fb6),LL(0x7afc1d4d,0x32b283b1),LL(0xa2f0e37f,0xc9c56965),
+ LL(0x4644e173,0x8e719178),LL(0xf88b43ff,0x4c2a11ec),LL(0x7d3ddbb3,0xb13644e6),LL(0xc3d8703c,0xd4746056), LL(0x55dca667,0x6611395f),LL(0x27c91d73,0x63596712),LL(0xea2ff489,0x4ca68a87),LL(0x337adc1d,0x2864a816),
+ LL(0x224d4f21,0x8aa830ae),LL(0x9f7845dc,0xda6c122e),LL(0xfb240793,0xb0c61ffc),LL(0xce8580e9,0xf4df6842), LL(0x0a990dc7,0x94372aaa),LL(0x5ce1aa24,0x42968cd3),LL(0x4df363a5,0x177c5ff0),LL(0x68c4546f,0xa8c3f737),
+ LL(0xbd21c524,0xc69750d5),LL(0x22a6c4ae,0xbf3b4857),LL(0xe2883a1d,0xcefcbb98),LL(0xae13f22b,0x6ffef743), LL(0x5defea01,0x6316ba60),LL(0x4ba63810,0x0a89e6a7),LL(0x15ab0e11,0x7f9af1de),LL(0x385911c9,0x6247ca15),
+ LL(0x32f9eaf5,0x6f7b1a6a),LL(0xacfc13dc,0x2c440f94),LL(0x66b18adf,0x2cf39bc5),LL(0x9f01533f,0xb9939fe8), LL(0x383a6450,0x031c4553),LL(0xf0102087,0x16d96ad3),LL(0x501f1360,0xcbd6fa95),LL(0x65f96c08,0x667d3ea0),
+ LL(0x68a1a680,0xa5a7cbfa),LL(0x42041db7,0xf131d779),LL(0xd85d377f,0xbefee3ac),LL(0x3b62dfa2,0x6d0ed6b7), LL(0x1baacfbd,0xef683f0f),LL(0xc976cebd,0xc586c4f2),LL(0x3b163339,0x3a4120dc),LL(0xc79e5c1f,0x9ac9b950),
+ LL(0xe294926a,0xaf1ff35f),LL(0xa2103168,0x2703bab8),LL(0x658a52bf,0xc645560a),LL(0xe466fd97,0x5ff3ccd9), LL(0x54867f14,0xe62fdc01),LL(0x9cdba39e,0x435ef950),LL(0x92828acc,0x2a7bbffd),LL(0xfe763981,0xe7538fdb),
+ LL(0x8bfe9773,0xedf45173),LL(0x471b8b9c,0xd187fa01),LL(0x78fa54df,0x34506c35),LL(0xc2767589,0x73cab9fd), LL(0x6726f305,0xf8f76c65),LL(0x8de332b2,0xea45012d),LL(0x87970e03,0xb746f40d),LL(0x1ba8fbd6,0xb2b2279a),
+ LL(0x21147dbc,0x79cdc610),LL(0x9939a3cc,0x738ef680),LL(0x8101bd8b,0xd66d6ce6),LL(0x09323caa,0x65612acb), LL(0x10310a29,0x6874b372),LL(0x5ee9ecfa,0x3cf30f0a),LL(0x8cfe1df8,0x4e1026ad),LL(0xd5989af5,0x75a153f7),
+ LL(0x8b8e0c49,0xc362ccee),LL(0xb533f3dd,0x8adfc0d2),LL(0xa109572e,0xe02ab03b),LL(0xfd3066ec,0x06efacdc), LL(0x3fa28700,0xf136a8ba),LL(0x308cceb9,0x48a1e987),LL(0x68253387,0xe8ee7c03),LL(0xc2b463c7,0x47febbe8),
+ LL(0x39a5c4d3,0x485195f2),LL(0xa26241ec,0xf42e000e),LL(0xcd05368d,0x08c64f90),LL(0x857cdbdb,0x46fbd381), LL(0x4c7e16ae,0xf711df8b),LL(0xe4edea42,0x95637e46),LL(0xad171465,0x2df8b206),LL(0x4bccedce,0xa31ea895),
+ LL(0x50743bb6,0x28dbcb77),LL(0xf9cf84b9,0x13d12f8e),LL(0xc8f7d408,0x39e3d3af),LL(0xeba591d4,0x5824117f), LL(0x1bead2d6,0xd8ef7c9a),LL(0xcaf53dd7,0x9003a559),LL(0x174cb9a9,0x33b2365c),LL(0xadb33afb,0x1149d080),
+ LL(0xaea9bd3c,0x55231d00),LL(0xfdf3f015,0x07e107c9),LL(0xec9d8fce,0xf535947d),LL(0xbba349a7,0x8b64ed8a), LL(0x049301df,0xdd5881fd),LL(0xe6490fd0,0xefac9c43),LL(0x73740a78,0xd9902852),LL(0x942c326c,0x6eef3724),
+ LL(0x5cfb3c8c,0x5671a6e9),LL(0x0ea29721,0x040aabd2),LL(0xeac8da18,0x24e92ca6),LL(0xa31170c3,0xc34d3d79), LL(0xb061e416,0xf81dd15f),LL(0x85f80af0,0xff7be70e),LL(0xade45cd4,0xa9faba4b),LL(0x505fddd4,0x42a6ab05),
+ LL(0x0a793534,0x17d5821d),LL(0xce0ade43,0x9e094e54),LL(0xc42cb4d2,0xa127fb6d),LL(0xdb12dc99,0x43865428), LL(0x59e3bfc1,0xb6b1b347),LL(0x1ec5b810,0x0b0076a9),LL(0xa6864982,0xbf2dd17a),LL(0x9d523c87,0x0c45947f),
+ LL(0x4c5dd59e,0x9f53372f),LL(0xca5ce09f,0x3d0ceaea),LL(0x7c0337fb,0xf3ff88e8),LL(0xfaa022c7,0xb4fa4593), LL(0xd65ea54d,0x575240a7),LL(0xadb92fb0,0xa4ec0a39),LL(0x79429eb1,0xc20e737c),LL(0x69addec4,0xcea931d1),
+ LL(0x3e09f46a,0x7a29011f),LL(0x0e578a5b,0x9c36865e),LL(0x71d805f4,0x8746ea51),LL(0xe12d3024,0xf024de85), LL(0x15a7f6be,0xc397b46c),LL(0x1b0580d7,0x612db6fb),LL(0xf736d087,0xe5342f76),LL(0x8c1e844c,0x65276853),
+ LL(0x113841a5,0xedf48adc),LL(0xe5c482f0,0xc21b67e1),LL(0x684a540b,0xe43b0138),LL(0xa5d4b266,0xc4f2782b), LL(0x397f3664,0x184e240c),LL(0x0d8788f8,0x968e89e7),LL(0x377e18bf,0xec3eba1a),LL(0x36002652,0x4d03cbbc),
+ LL(0x1005a953,0x21eedee7),LL(0x75ba987e,0xc178ddf1),LL(0xc4ba43f6,0xd0d577f6),LL(0x4d6f24fd,0x9486f46c), LL(0xc5421895,0x3d33c574),LL(0x842e52ab,0x5be6cb4c),LL(0x9debc9ff,0x3809690d),LL(0xa84a5b6f,0xe4b1c692),
+ LL(0xd7e18b57,0x58b966ad),LL(0x77c94715,0x7ff0b61e),LL(0xf06add82,0x0e295883),LL(0x65c7f5a4,0x7c3c04fd), LL(0x60223be5,0x4ea92660),LL(0x89262bfd,0x5d843a57),LL(0x36da11c0,0x35bf4aef),LL(0xaf859eb1,0xa6692f14),
+ LL(0xa12fdf41,0xca1fc13b),LL(0x8224f5d2,0xd798c04b),LL(0x1dd5872b,0x22f4594e),LL(0x1bddfda8,0xdee12df5), LL(0xed83420a,0x96473ff0),LL(0x8daa27f4,0xf41cf1c7),LL(0xaecefd8a,0x2772cd56),LL(0x4902b47f,0xd5ddaf18),
+ LL(0xc0798101,0xff77551f),LL(0x26946bda,0x8baa01d6),LL(0x100525f2,0xd0087e47),LL(0x4c0de308,0x521d6254), LL(0x9bbce049,0x4a0f45eb),LL(0xa6c6b96e,0x5ee33cbe),LL(0xd6a22345,0x9a6af4b7),LL(0x38b1b406,0x0d0d35e7),
+ LL(0xbbedc29b,0x9e71252d),LL(0xcad1455e,0x3aa70bb6),LL(0x42a1778c,0xa406fb7a),LL(0xf0897613,0xd94f9646), LL(0xf57f66c8,0x5256370f),LL(0x4432f679,0x95891e35),LL(0xbcb6b3d3,0x75d6423a),LL(0x2367483f,0x79d9ea01),
+ LL(0x9efb0473,0x1e36ccc6),LL(0xdfdc0cec,0x3e64b034),LL(0x028bb238,0x13bfd326),LL(0x209edd95,0x171e9d96), LL(0x07b22424,0xda258380),LL(0xd41b8023,0xe31e97f6),LL(0x7269cecd,0xdd4ed390),LL(0x12d5cec6,0x810fb3c8),
+ LL(0xbabeec88,0x2f956519),LL(0x455baf52,0xb0350c52),LL(0x48d5abf1,0xa7fb548a),LL(0xca5e2d9f,0xcb81bd0c), LL(0xa6d17b19,0xda5ecd39),LL(0x508e5149,0xd2588bab),LL(0xc3e23cfd,0x1a30cff5),LL(0xf89f8712,0x2dd398b4),
+ LL(0x5b304005,0x2a911800),LL(0xd9dece69,0xd091be7a),LL(0xf6cabc89,0x147e93da),LL(0x44935824,0x7eac2018), LL(0x32f5de9b,0xd4aaf2be),LL(0xd9396cd1,0xe302bc41),LL(0x2c069d1a,0x3c2794cf),LL(0xa9d433ae,0xf9197eaa),
+ LL(0x4445e8c2,0x98f822ef),LL(0x1383ece8,0xc578360e),LL(0x01869457,0xa5372c12),LL(0x787d6644,0x1c6ed00d), LL(0x86531814,0x77fb08cd),LL(0x63a70db8,0xeff6ee26),LL(0x80976119,0x980be153),LL(0xd69d60c5,0x534a09bd),
+ LL(0x759dba20,0x71a58b0c),LL(0x679c0b40,0x34d5f06c),LL(0xceed2f9f,0xdc0e7e5f),LL(0x48808edb,0xaaa5996e), LL(0xbcdd88e5,0x8ca96ff0),LL(0xc37c2b46,0x91b02d67),LL(0x95526319,0xbe4f3948),LL(0x89be56d1,0x4315c7f2),
+ LL(0xdc85bba1,0xa312a3c0),LL(0x431ca797,0x3328fa8e),LL(0x68fd219a,0x5438bf1c),LL(0x85837d74,0x98812c6f), LL(0xf8c96d49,0xe88c4913),LL(0xc2442aca,0xcc62e79c),LL(0x046655f1,0x4ef3c7d4),LL(0xdadab1ea,0x04a362ed),
+ LL(0x30a199cf,0x975e2f3c),LL(0x014a165a,0x831e04a9),LL(0xaa126719,0x1e1d3c53),LL(0x1bf707a0,0xc42661e0), LL(0xaa2da264,0x295b0738),LL(0x65d4ba34,0xb45f5ed8),LL(0x9f3938fa,0x27fb5a12),LL(0xcb26f86c,0x25fba614),
+ LL(0xcf3c1c4d,0x6bd41981),LL(0xa0dedafd,0xd6f9239c),LL(0xae55b97f,0x46882526),LL(0x81b628d4,0x8e6fa994), LL(0xdc0aa158,0xbdb314dd),LL(0x12ba2a17,0x35343678),LL(0x32e2e431,0xac018e83),LL(0xe65cc63e,0x43a64e35),
+ LL(0x0b6603ea,0x887f3a2a),LL(0x76b2673f,0xe015426c),LL(0x27edfe8a,0x59dc5530),LL(0x68d9ebf3,0xea9eacf3), LL(0xcc3e07ca,0x40301c8e),LL(0x0f57a2e6,0xd8cb9b5b),LL(0x60ec5864,0x542e6b52),LL(0x17f6affe,0xb8791dd6),
+ LL(0x798d9993,0x6735bd1c),LL(0xd5da393c,0x006d8b25),LL(0x49e6d0d2,0x1d675bdb),LL(0x8607f99e,0x331d9a10), LL(0x9dc4cd07,0x4ff8ab74),LL(0x64ea3192,0xa87d4ae1),LL(0x41196b5b,0xdde0d92e),LL(0xb2e010eb,0xa15ad47b),
+ LL(0xa5522a75,0x23e6003f),LL(0x84afa749,0xc6ef3f1b),LL(0x146d10a3,0x9a723f75),LL(0x119106b0,0x5fa99480), LL(0xc0013dba,0x01d500db),LL(0x548edbe0,0x10b30ada),LL(0xb04ffc6b,0xb2eb046e),LL(0x64f25ee2,0xa57088f3),
+ LL(0x83a068a3,0xc0c919c3),LL(0xfbde282f,0x8139559d),LL(0x9fec9a99,0x4e2b5d13),LL(0xfbefa7e6,0x53bad712), LL(0x2860bd4f,0xa6befe0d),LL(0x0011bd15,0x6ea0ae15),LL(0x2bce3779,0xc1ef3463),LL(0x5d742dbb,0xc09ecb30),
+ LL(0xf73db19d,0x29526afd),LL(0x6a029a40,0x7c02c905),LL(0xde5a48ba,0xa778460f),LL(0x77c105f6,0xda05993e), LL(0xc9ddece9,0xb6d599f9),LL(0x0cfc33ca,0x9f9df668),LL(0xa0aa67a8,0xdcd8ef4f),LL(0xc3f4d178,0x31277019),
+ LL(0x53e86ae1,0x98e05abf),LL(0x3850830d,0xc1dc4d90),LL(0xe06bc33c,0xbd7fd806),LL(0xacf1286f,0x1ac330d6), LL(0xe1588c1e,0x28ce2303),LL(0x1b7e9c19,0xdc25e54b),LL(0x4b7149f2,0x11e51e49),LL(0xb5c7fa25,0x551b8391),
+ LL(0x1bf69873,0xa2fc251c),LL(0x2aec1574,0x099b7b53),LL(0x7c53296a,0x9ff98156),LL(0xa2dc60de,0xaf3f8d08), LL(0x59b72d6c,0x18dd295c),LL(0xe75f44fc,0x165c9063),LL(0x427a0c55,0x9046ee7c),LL(0xc79ffdb3,0x317ea24d),
+ LL(0x0ef0447d,0x6835a315),LL(0x8068e7c7,0xb2b9c786),LL(0x0e646af5,0xe6352714),LL(0x442baaa0,0xc5554a91), LL(0x6d0ba1ea,0x671febc5),LL(0x0cf649ed,0x44f9ef7b),LL(0x0c1dac6b,0x4aa0cd61),LL(0x6e393e68,0x865f3c23),
+ LL(0xa71dee29,0xf6886bcd),LL(0xda44ffae,0x934b0455),LL(0x016d6039,0xda7621c4),LL(0x3ad35493,0xf36c41bf), LL(0xe5f6ab8d,0x9063135e),LL(0x47bdc0a8,0xb0e8eaba),LL(0x4c737cf3,0x62530616),LL(0x64f6b6cb,0x8046423e),
+ LL(0x7958e3dc,0x11e50ad7),LL(0xb57234ab,0x4dab4e16),LL(0xe0916210,0x6ccfe2c6),LL(0x80f49d40,0x4d5dbc3b), LL(0xef1b2b1b,0x2b8ff368),LL(0x752fea2a,0xf2afb326),LL(0x0246e36b,0xffa48ea7),LL(0x589b7444,0x3a4bae9b),
+ LL(0x6ff3efcf,0x80ff984a),LL(0x56b77b47,0x7af53f30),LL(0x9320cae6,0x1f1c33b0),LL(0x26fc4ad4,0xce1f1c48), LL(0xad350ee5,0x9cac662b),LL(0xe27a7dbd,0xf4c72fff),LL(0x703184e5,0xd766f986),LL(0x7c5b241e,0x36d3efd5),
+ LL(0xf7ff5804,0xd4d6e358),LL(0x8f5e0bf6,0xa832b302),LL(0x453d9a22,0x4b3d73f7),LL(0xdf938705,0xb4dae072), LL(0x92401620,0x6bff7b2e),LL(0x9bfa61cd,0x96b8494e),LL(0xb74dc1e5,0x4bcda341),LL(0xc19c393d,0x383fe3d2),
+ LL(0x077e8821,0xa375fb70),LL(0xc17eb9bc,0xea35e04b),LL(0x7c4dd076,0x941d21ba),LL(0x3d0c3d8a,0x916c0a59), LL(0x15b2cf47,0x2c1304e3),LL(0xd0c955c0,0x9233ebf3),LL(0x2b2fc935,0x77acdd07),LL(0xc04276bf,0xd71b6a7a),
+ LL(0xd2ee8d68,0x789ea49b),LL(0x0a84a920,0x89552b46),LL(0x1a4ea456,0xe629d5de),LL(0x22ddd405,0xddfefe87), LL(0x1cdb9e7b,0x3d56f697),LL(0xa8bf715b,0x95a861b0),LL(0x7896c993,0xb01248d6),LL(0x01a3085c,0x3c4e3d98),
+ LL(0x9085b360,0x674939e1),LL(0xb589a287,0xae67dea9),LL(0x2bfdcfc9,0xc563856f),LL(0x313b685d,0x62fa9a80), LL(0x7ad501d9,0x36ff33d9),LL(0x730ab349,0xf8bab4dd),LL(0xc46ba69d,0x18fd59f3),LL(0xe65278e9,0x81e08665),
+ LL(0xeb8a1e84,0x5a5e803f),LL(0x47243604,0x5b4eef35),LL(0x393d6cdf,0x0ee71ee0),LL(0xc3a9c6db,0xde4d9dea), LL(0x64466b53,0x0c14c376),LL(0x89e3b45e,0xc2ce9642),LL(0x54a2de21,0x6aa8012f),LL(0x29b6bc2c,0x519759c1),
+ LL(0xe4667322,0x17768527),LL(0xac83b2ea,0x09fdfe4d),LL(0x04a0d5f5,0xd422125d),LL(0x2b86b310,0x02e8ff96), LL(0xd7ee97af,0xf033628d),LL(0x7d72e0e6,0x778a846c),LL(0x882f63d6,0x06fde613),LL(0x8d434f14,0x9e258b0d),
+ LL(0xccdcd600,0x5cdda529),LL(0x033c4535,0x37038b38),LL(0x391c1d7d,0xd6a1d639),LL(0x31d4ce6b,0x4f6489e4), LL(0x5754e08c,0xd1b82f17),LL(0x75db7bd6,0x7df268ee),LL(0xad14dcfa,0x1e4a1202),LL(0xccfb9b77,0x7ab92ce2),
+ LL(0x23aef997,0x61388e03),LL(0x06440ce3,0x9981f5bf),LL(0xc67d0edd,0x8d7631da),LL(0xc0a93516,0xc6ea593f), LL(0xee841b38,0x064a06e0),LL(0x521ce83f,0x0d1d4f57),LL(0x70df2613,0xf7a0e0c3),LL(0x84c071ab,0x1506cccb),
+ LL(0x328565e9,0x42a138ec),LL(0xb8130d16,0xe16b4578),LL(0x45ba251a,0x0628ff22),LL(0x210e22e8,0x016a84ca), LL(0x94592d43,0x8ba14bb4),LL(0x785274a5,0xffee4308),LL(0x01354b75,0x01fc21ab),LL(0x7e424674,0xc37ce45f),
+ LL(0xa7fe2735,0x71e153af),LL(0xc307721f,0x000fcee9),LL(0x805b56e3,0x3b189004),LL(0x7f504d9b,0x2f1435aa), LL(0xa083bd72,0xd9aa1eba),LL(0x720ccf3d,0xf1145036),LL(0x4084fa32,0x95b29e27),LL(0x01f94f0c,0x8862d213),
+ LL(0x1510a406,0x23fc5ddf),LL(0xc9f0e98d,0x475a78f4),LL(0xe72843a0,0xb6d681c4),LL(0x4a00c5a6,0xa90af2a4), LL(0xa34f4412,0x95fc6d45),LL(0xe7f5d703,0x60f9c0e2),LL(0xad110925,0x2bc0642b),LL(0xbe24a4d5,0x79abfc10),
+}
+};
+#endif /* _DISABLE_ECP_SM2_HARDCODED_BP_TBL_ */
+#endif /* _IPP_DATA */
+
+
+const cpPrecompAP* gfpec_precom_sm2_fun(void)
+{
+ static cpPrecompAP t = {
+ /* w */ 7,
+ /* select function */ p256r1_select_ap_w7,
+ /* precomputed data */ (BNU_CHUNK_T*)precomputed_ec_sm2
+ };
+ return &t;
+};
diff --git a/ext/ipp/sources/ippcp/src/pcptool.h b/ext/ipp/sources/ippcp/src/pcptool.h
new file mode 100644
index 0000000..2d05b9e
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcptool.h
@@ -0,0 +1,657 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+//
+// Purpose:
+// Cryptography Primitive.
+// Internal Definitions of Block Cipher Tools
+//
+//
+*/
+
+#if !defined(_PC_TOOL_H)
+#define _CP_TOOL_H
+
+#define _NEW_COPY16_
+#define _NEW_XOR16_
+
+/* copy data block */
+__INLINE void CopyBlock(const void* pSrc, void* pDst, cpSize numBytes)
+{
+ const Ipp8u* s = (Ipp8u*)pSrc;
+ Ipp8u* d = (Ipp8u*)pDst;
+ cpSize k;
+ for(k=0; k<numBytes; k++ )
+ d[k] = s[k];
+}
+__INLINE void CopyBlock8(const void* pSrc, void* pDst)
+{
+ int k;
+ for(k=0; k<8; k++ )
+ ((Ipp8u*)pDst)[k] = ((Ipp8u*)pSrc)[k];
+}
+
+#if defined(_NEW_COPY16_)
+__INLINE void CopyBlock16(const void* pSrc, void* pDst)
+{
+#if (_IPP_ARCH ==_IPP_ARCH_EM64T)
+ ((Ipp64u*)pDst)[0] = ((Ipp64u*)pSrc)[0];
+ ((Ipp64u*)pDst)[1] = ((Ipp64u*)pSrc)[1];
+#else
+ ((Ipp32u*)pDst)[0] = ((Ipp32u*)pSrc)[0];
+ ((Ipp32u*)pDst)[1] = ((Ipp32u*)pSrc)[1];
+ ((Ipp32u*)pDst)[2] = ((Ipp32u*)pSrc)[2];
+ ((Ipp32u*)pDst)[3] = ((Ipp32u*)pSrc)[3];
+#endif
+}
+#else
+__INLINE void CopyBlock16(const void* pSrc, void* pDst)
+{
+ int k;
+ for(k=0; k<16; k++ )
+ ((Ipp8u*)pDst)[k] = ((Ipp8u*)pSrc)[k];
+}
+#endif
+
+__INLINE void CopyBlock24(const void* pSrc, void* pDst)
+{
+ int k;
+ for(k=0; k<24; k++ )
+ ((Ipp8u*)pDst)[k] = ((Ipp8u*)pSrc)[k];
+}
+__INLINE void CopyBlock32(const void* pSrc, void* pDst)
+{
+ int k;
+ for(k=0; k<32; k++ )
+ ((Ipp8u*)pDst)[k] = ((Ipp8u*)pSrc)[k];
+}
+
+/*
+// padding data block
+*/
+__INLINE void PaddBlock(Ipp8u paddingByte, void* pDst, cpSize numBytes)
+{
+ Ipp8u* d = (Ipp8u*)pDst;
+ cpSize k;
+ for(k=0; k<numBytes; k++ )
+ d[k] = paddingByte;
+}
+
+#if !((_IPP>=_IPP_W7) || (_IPP32E>=_IPP32E_M7))
+__INLINE void PurgeBlock(void* pDst, int len)
+{
+ int n;
+ for(n=0; n<len; n++) ((Ipp8u*)pDst)[n] = 0;
+}
+#else
+#define PurgeBlock OWNAPI(PurgeBlock)
+void PurgeBlock(void* pDst, int len);
+#endif
+
+/* fill block */
+__INLINE void FillBlock16(Ipp8u filler, const void* pSrc, void* pDst, int len)
+{
+ int n;
+ for(n=0; n<len; n++) ((Ipp8u*)pDst)[n] = ((Ipp8u*)pSrc)[n];
+ for(; n<16; n++) ((Ipp8u*)pDst)[n] = filler;
+}
+
+/* xor block */
+__INLINE void XorBlock(const void* pSrc1, const void* pSrc2, void* pDst, int len)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ Ipp8u* d = (Ipp8u*)pDst;
+ int k;
+ for(k=0; k<len; k++)
+ d[k] = (Ipp8u)(p1[k] ^p2[k]);
+}
+__INLINE void XorBlock8(const void* pSrc1, const void* pSrc2, void* pDst)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ Ipp8u* d = (Ipp8u*)pDst;
+ int k;
+ for(k=0; k<8; k++ )
+ d[k] = (Ipp8u)(p1[k] ^p2[k]);
+}
+
+#if defined(_NEW_XOR16_)
+__INLINE void XorBlock16(const void* pSrc1, const void* pSrc2, void* pDst)
+{
+#if (_IPP_ARCH ==_IPP_ARCH_EM64T)
+ ((Ipp64u*)pDst)[0] = ((Ipp64u*)pSrc1)[0] ^ ((Ipp64u*)pSrc2)[0];
+ ((Ipp64u*)pDst)[1] = ((Ipp64u*)pSrc1)[1] ^ ((Ipp64u*)pSrc2)[1];
+#else
+ ((Ipp32u*)pDst)[0] = ((Ipp32u*)pSrc1)[0] ^ ((Ipp32u*)pSrc2)[0];
+ ((Ipp32u*)pDst)[1] = ((Ipp32u*)pSrc1)[1] ^ ((Ipp32u*)pSrc2)[1];
+ ((Ipp32u*)pDst)[2] = ((Ipp32u*)pSrc1)[2] ^ ((Ipp32u*)pSrc2)[2];
+ ((Ipp32u*)pDst)[3] = ((Ipp32u*)pSrc1)[3] ^ ((Ipp32u*)pSrc2)[3];
+#endif
+}
+#else
+__INLINE void XorBlock16(const void* pSrc1, const void* pSrc2, void* pDst)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ Ipp8u* d = (Ipp8u*)pDst;
+ int k;
+ for(k=0; k<16; k++ )
+ d[k] = (Ipp8u)(p1[k] ^p2[k]);
+}
+#endif
+
+__INLINE void XorBlock24(const void* pSrc1, const void* pSrc2, void* pDst)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ Ipp8u* d = (Ipp8u*)pDst;
+ int k;
+ for(k=0; k<24; k++ )
+ d[k] = (Ipp8u)(p1[k] ^p2[k]);
+}
+__INLINE void XorBlock32(const void* pSrc1, const void* pSrc2, void* pDst)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ Ipp8u* d = (Ipp8u*)pDst;
+ int k;
+ for(k=0; k<32; k++ )
+ d[k] = (Ipp8u)(p1[k] ^p2[k]);
+}
+
+
+/* compare (equivalence) */
+__INLINE int EquBlock(const void* pSrc1, const void* pSrc2, int len)
+{
+ const Ipp8u* p1 = (const Ipp8u*)pSrc1;
+ const Ipp8u* p2 = (const Ipp8u*)pSrc2;
+ int k;
+ int isEqu;
+ for(k=0, isEqu=1; k<len && isEqu; k++)
+ isEqu = (p1[k] == p2[k]);
+ return isEqu;
+}
+
+
+/* addition functions for CTR mode of diffenent block ciphers */
+__INLINE void StdIncrement(Ipp8u* pCounter, int blkSize, int numSize)
+{
+ int maskPosition = (blkSize-numSize)/8;
+ Ipp8u mask = (Ipp8u)( 0xFF >> (blkSize-numSize)%8 );
+
+ /* save crytical byte */
+ Ipp8u save = (Ipp8u)( pCounter[maskPosition] & ~mask );
+
+ int len = BITS2WORD8_SIZE(blkSize);
+ Ipp32u carry = 1;
+ for(; (len>maskPosition) && carry; len--) {
+ Ipp32u x = pCounter[len-1] + carry;
+ pCounter[len-1] = (Ipp8u)x;
+ carry = (x>>8) & 0xFF;
+ }
+
+ /* update crytical byte */
+ pCounter[maskPosition] &= mask;
+ pCounter[maskPosition] |= save;
+}
+
+/* vb */
+__INLINE void ompStdIncrement64( void* pInitCtrVal, void* pCurrCtrVal,
+ int ctrNumBitSize, int n )
+{
+ int k;
+ Ipp64u cntr;
+ Ipp64u temp;
+ Ipp64s item;
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ ( ( Ipp8u* )&cntr )[k] = ( ( Ipp8u* )pInitCtrVal )[7 - k];
+ #else
+ for( k = 0; k < 8; k++ )
+ ( ( Ipp8u* )&cntr )[k] = ( ( Ipp8u* )pInitCtrVal )[k];
+ #endif
+
+ if( ctrNumBitSize == 64 )
+ {
+ cntr += ( Ipp64u )n;
+ }
+ else
+ {
+ Ipp64u mask = CONST_64(0xFFFFFFFFFFFFFFFF) >> ( 64 - ctrNumBitSize );
+ Ipp64u save = cntr & ( ~mask );
+ Ipp64u bndr = ( Ipp64u )1 << ctrNumBitSize;
+
+ temp = cntr & mask;
+ cntr = temp + ( Ipp64u )n;
+
+ if( cntr > bndr )
+ {
+ item = ( Ipp64s )n - ( Ipp64s )( bndr - temp );
+
+ while( item > 0 )
+ {
+ cntr = ( Ipp64u )item;
+ item -= ( Ipp64s )bndr;
+ }
+ }
+
+ cntr = save | ( cntr & mask );
+ }
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ ( ( Ipp8u* )pCurrCtrVal )[7 - k] = ( ( Ipp8u* )&cntr )[k];
+ #else
+ for( k = 0; k < 8; k++ )
+ ( ( Ipp8u* )pCurrCtrVal )[k] = ( ( Ipp8u* )&cntr )[k];
+ #endif
+}
+
+
+/* vb */
+__INLINE void ompStdIncrement128( void* pInitCtrVal, void* pCurrCtrVal,
+ int ctrNumBitSize, int n )
+{
+ int k;
+ Ipp64u low;
+ Ipp64u hgh;
+ Ipp64u flag;
+ Ipp64u mask = CONST_64(0xFFFFFFFFFFFFFFFF);
+ Ipp64u save;
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[15 - k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[7 - k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[8 + k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[k];
+ }
+ #endif
+
+ if( ctrNumBitSize == 64 )
+ {
+ low += ( Ipp64u )n;
+ }
+ else if( ctrNumBitSize < 64 )
+ {
+ Ipp64u bndr;
+ Ipp64u cntr;
+ Ipp64s item;
+
+ mask >>= ( 64 - ctrNumBitSize );
+ save = low & ( ~mask );
+ cntr = ( low & mask ) + ( Ipp64u )n;
+
+ if( ctrNumBitSize < 31 )
+ {
+ bndr = ( Ipp64u )1 << ctrNumBitSize;
+
+ if( cntr > bndr )
+ {
+ item = ( Ipp64s )( ( Ipp64s )n - ( ( Ipp64s )bndr -
+ ( Ipp64s )( low & mask ) ) );
+
+ while( item > 0 )
+ {
+ cntr = ( Ipp64u )item;
+ item -= ( Ipp64s )bndr;
+ }
+ }
+ }
+
+ low = save | ( cntr & mask );
+ }
+ else
+ {
+ flag = ( low >> 63 );
+
+ if( ctrNumBitSize != 128 )
+ {
+ mask >>= ( 128 - ctrNumBitSize );
+ save = hgh & ( ~mask );
+ hgh &= mask;
+ }
+
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) ) hgh++;
+
+ if( ctrNumBitSize != 128 )
+ {
+ hgh = save | ( hgh & mask );
+ }
+ }
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[15 - k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[7 - k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[8 + k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #endif
+}
+
+
+/* vb */
+__INLINE void ompStdIncrement192( void* pInitCtrVal, void* pCurrCtrVal,
+ int ctrNumBitSize, int n )
+{
+ int k;
+ Ipp64u low;
+ Ipp64u mdl;
+ Ipp64u hgh;
+ Ipp64u flag;
+ Ipp64u mask = CONST_64(0xFFFFFFFFFFFFFFFF);
+ Ipp64u save;
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[23 - k];
+ ( ( Ipp8u* )&mdl )[k] = ( ( Ipp8u* )pInitCtrVal )[15 - k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[7 - k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[16 + k];
+ ( ( Ipp8u* )&mdl )[k] = ( ( Ipp8u* )pInitCtrVal )[8 + k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[k];
+ }
+ #endif
+
+ if( ctrNumBitSize == 64 )
+ {
+ low += ( Ipp64u )n;
+ }
+ else if( ctrNumBitSize == 128 )
+ {
+ flag = ( low >> 63 );
+ low += ( Ipp64u )n;
+ if( flag != ( low >> 63 ) ) mdl++;
+ }
+ else if( ctrNumBitSize == 192 )
+ {
+ flag = ( low >> 63 );
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+ if( flag != ( mdl >> 63 ) ) hgh++;
+ }
+ }
+ else if( ctrNumBitSize < 64 )
+ {
+ Ipp64u bndr;
+ Ipp64u cntr;
+ Ipp64s item;
+
+ mask >>= ( 64 - ctrNumBitSize );
+ save = low & ( ~mask );
+ cntr = ( low & mask ) + ( Ipp64u )n;
+
+ if( ctrNumBitSize < 31 )
+ {
+ bndr = ( Ipp64u )1 << ctrNumBitSize;
+
+ if( cntr > bndr )
+ {
+ item = ( Ipp64s )( ( Ipp64s )n - ( ( Ipp64s )bndr -
+ ( Ipp64s )( low & mask ) ) );
+
+ while( item > 0 )
+ {
+ cntr = ( Ipp64u )item;
+ item -= ( Ipp64s )bndr;
+ }
+ }
+ }
+
+ low = save | ( cntr & mask );
+ }
+ else if( ctrNumBitSize < 128 )
+ {
+ flag = ( low >> 63 );
+ mask >>= ( 128 - ctrNumBitSize );
+ save = mdl & ( ~mask );
+ mdl &= mask;
+ low += ( Ipp64u )n;
+ if( flag != ( low >> 63 ) ) mdl++;
+ mdl = save | ( mdl & mask );
+ }
+ else
+ {
+ flag = ( low >> 63 );
+ mask >>= ( 192 - ctrNumBitSize );
+ save = hgh & ( ~mask );
+ hgh &= mask;
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+ if( flag != ( mdl >> 63 ) ) hgh++;
+ }
+
+ hgh = save | ( hgh & mask );
+ }
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[23 - k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[15 - k] = ( ( Ipp8u* )&mdl )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[7 - k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[16 + k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[8 + k] = ( ( Ipp8u* )&mdl )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #endif
+}
+
+
+/* vb */
+__INLINE void ompStdIncrement256( void* pInitCtrVal, void* pCurrCtrVal,
+ int ctrNumBitSize, int n )
+{
+ int k;
+ Ipp64u low;
+ Ipp64u mdl;
+ Ipp64u mdm;
+ Ipp64u hgh;
+ Ipp64u flag;
+ Ipp64u mask = CONST_64(0xFFFFFFFFFFFFFFFF);
+ Ipp64u save;
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[31 - k];
+ ( ( Ipp8u* )&mdl )[k] = ( ( Ipp8u* )pInitCtrVal )[23 - k];
+ ( ( Ipp8u* )&mdm )[k] = ( ( Ipp8u* )pInitCtrVal )[15 - k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[7 - k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )&low )[k] = ( ( Ipp8u* )pInitCtrVal )[24 + k];
+ ( ( Ipp8u* )&mdl )[k] = ( ( Ipp8u* )pInitCtrVal )[16 + k];
+ ( ( Ipp8u* )&mdm )[k] = ( ( Ipp8u* )pInitCtrVal )[8 + k];
+ ( ( Ipp8u* )&hgh )[k] = ( ( Ipp8u* )pInitCtrVal )[k];
+ }
+ #endif
+
+ if( ctrNumBitSize == 64 )
+ {
+ low += ( Ipp64u )n;
+ }
+ else if( ctrNumBitSize == 128 )
+ {
+ flag = ( low >> 63 );
+ low += ( Ipp64u )n;
+ if( flag != ( low >> 63 ) ) mdl++;
+ }
+ else if( ctrNumBitSize == 192 )
+ {
+ flag = ( low >> 63 );
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+ if( flag != ( mdl >> 63 ) ) hgh++;
+ }
+ }
+ else if( ctrNumBitSize == 256 )
+ {
+ flag = ( low >> 63 );
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+
+ if( flag != ( mdl >> 63 ) )
+ {
+ flag = ( mdm >> 63 );
+ mdm++;
+ if( flag != ( mdm >> 63 ) ) hgh++;
+ }
+ }
+ }
+ else if( ctrNumBitSize < 64 )
+ {
+ Ipp64u bndr;
+ Ipp64u cntr;
+ Ipp64s item;
+
+ mask >>= ( 64 - ctrNumBitSize );
+ save = low & ( ~mask );
+ cntr = ( low & mask ) + ( Ipp64u )n;
+
+ if( ctrNumBitSize < 31 )
+ {
+ bndr = ( Ipp64u )1 << ctrNumBitSize;
+
+ if( cntr > bndr )
+ {
+ item = ( Ipp64s )( ( Ipp64s )n - ( ( Ipp64s )bndr -
+ ( Ipp64s )( low & mask ) ) );
+
+ while( item > 0 )
+ {
+ cntr = ( Ipp64u )item;
+ item -= ( Ipp64s )bndr;
+ }
+ }
+ }
+
+ low = save | ( cntr & mask );
+ }
+ else if( ctrNumBitSize < 128 )
+ {
+ flag = ( low >> 63 );
+ mask >>= ( 128 - ctrNumBitSize );
+ save = mdl & ( ~mask );
+ mdl &= mask;
+ low += ( Ipp64u )n;
+ if( flag != ( low >> 63 ) ) mdl++;
+ mdl = save | ( mdl & mask );
+ }
+ else if( ctrNumBitSize < 192 )
+ {
+ flag = ( low >> 63 );
+ mask >>= ( 192 - ctrNumBitSize );
+ save = mdm & ( ~mask );
+ mdm &= mask;
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+ if( flag != ( mdl >> 63 ) ) mdm++;
+ }
+
+ mdm = save | ( mdm & mask );
+ }
+ else
+ {
+ flag = ( low >> 63 );
+ mask >>= ( 256 - ctrNumBitSize );
+ save = hgh & ( ~mask );
+ hgh &= mask;
+ low += ( Ipp64u )n;
+
+ if( flag != ( low >> 63 ) )
+ {
+ flag = ( mdl >> 63 );
+ mdl++;
+
+ if( flag != ( mdl >> 63 ) )
+ {
+ flag = ( mdm >> 63 );
+ mdm++;
+ if( flag != ( mdm >> 63 ) ) hgh++;
+ }
+ }
+
+ hgh = save | ( hgh & mask );
+ }
+
+ #if( IPP_ENDIAN == IPP_LITTLE_ENDIAN )
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[31 - k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[23 - k] = ( ( Ipp8u* )&mdl )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[15 - k] = ( ( Ipp8u* )&mdm )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[7 - k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #else
+ for( k = 0; k < 8; k++ )
+ {
+ ( ( Ipp8u* )pCurrCtrVal )[24 + k] = ( ( Ipp8u* )&low )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[16 + k] = ( ( Ipp8u* )&mdl )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[8 + k] = ( ( Ipp8u* )&mdm )[k];
+ ( ( Ipp8u* )pCurrCtrVal )[k] = ( ( Ipp8u* )&hgh )[k];
+ }
+ #endif
+}
+
+#endif /* _CP_TOOL_H */
diff --git a/ext/ipp/sources/ippcp/src/pcpvariant.h b/ext/ipp/sources/ippcp/src/pcpvariant.h
new file mode 100644
index 0000000..bbfd60f
--- /dev/null
+++ b/ext/ipp/sources/ippcp/src/pcpvariant.h
@@ -0,0 +1,419 @@
+/*############################################################################
+ # Copyright 1999-2018 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*
+// Intel(R) Integrated Performance Primitives
+// Cryptographic Primitives (ippcp)
+//
+// Purpose:
+// Define ippCP variant
+//
+//
+*/
+
+#if !defined(_CP_VARIANT_H)
+#define _CP_VARIANT_H
+
+/*
+// set _AES_NI_ENABLING_
+*/
+#if defined _IPP_AES_NI_
+ #if (_IPP_AES_NI_ == 0)
+ #define _AES_NI_ENABLING_ _FEATURE_OFF_
+ #elif (_IPP_AES_NI_ == 1)
+ #define _AES_NI_ENABLING_ _FEATURE_ON_
+ #else
+ #error Define _IPP_AES_NI_=0 or 1 or omit _IPP_AES_NI_ at all
+ #endif
+#else
+ #if (_IPP>=_IPP_P8) || (_IPP32E>=_IPP32E_Y8)
+ #define _AES_NI_ENABLING_ _FEATURE_TICKTOCK_
+ #else
+ #define _AES_NI_ENABLING_ _FEATURE_OFF_
+ #endif
+#endif
+
+/*
+// select AES safe implementation
+*/
+#define _ALG_AES_SAFE_COMPACT_SBOX_ (1)
+#define _ALG_AES_SAFE_COMPOSITE_GF_ (2)
+
+#if (_AES_NI_ENABLING_==_FEATURE_ON_)
+ #define _ALG_AES_SAFE_ _FEATURE_OFF_
+#else
+ #if (_IPP>=_IPP_V8) || (_IPP32E>=_IPP32E_U8)
+ #define _ALG_AES_SAFE_ _ALG_AES_SAFE_COMPOSITE_GF_
+ #else
+ #define _ALG_AES_SAFE_ _ALG_AES_SAFE_COMPACT_SBOX_
+ //#define _ALG_AES_SAFE_ _ALG_AES_SAFE_COMPOSITE_GF_
+ #endif
+#endif
+
+
+/*
+// if there is no outside assignment
+// set _SHA_NI_ENABLING_ based on CPU specification
+*/
+#if !defined(_SHA_NI_ENABLING_)
+#if (_IPP>=_IPP_P8) || (_IPP32E>=_IPP32E_Y8)
+ #define _SHA_NI_ENABLING_ _FEATURE_TICKTOCK_
+#else
+ #define _SHA_NI_ENABLING_ _FEATURE_OFF_
+#endif
+#endif
+
+/*
+// set/reset _ADCOX_NI_ENABLING_
+*/
+#if (_IPP32E>=_IPP32E_L9)
+ #if !defined(_ADCOX_NI_ENABLING_)
+ #define _ADCOX_NI_ENABLING_ _FEATURE_TICKTOCK_
+ #endif
+#else
+ #undef _ADCOX_NI_ENABLING_
+ #define _ADCOX_NI_ENABLING_ _FEATURE_OFF_
+#endif
+
+/*
+// IPP supports several hash algorithms by default:
+// SHA-1
+// SHA-256
+// SHA-224 (or SHA256/224 by the FIPS180-4 classification)
+// SHA-512
+// SHA-384 (or SHA512/384 by the FIPS180-4 classification)
+// MD5
+// SM3
+//
+// By default all hash algorithms are included in IPP Crypto.
+//
+// If one need excludes code of particular hash, just define
+// suitable _DISABLE_ALG_XXX, where XXX name of the hash algorithm
+//
+*/
+#if !defined(_DISABLE_ALG_SHA1_)
+#define _ENABLE_ALG_SHA1_ /* SHA1 on */
+#else
+# undef _ENABLE_ALG_SHA1_ /* SHA1 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA256_)
+# define _ENABLE_ALG_SHA256_ /* SHA256 on */
+#else
+# undef _ENABLE_ALG_SHA256_ /* SHA256 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA224_)
+# define _ENABLE_ALG_SHA224_ /* SHA224 on */
+#else
+# undef _ENABLE_ALG_SHA224_ /* SHA224 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA512_)
+# define _ENABLE_ALG_SHA512_ /* SHA512 on */
+#else
+# undef _ENABLE_ALG_SHA512_ /* SHA512 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA384_)
+# define _ENABLE_ALG_SHA384_ /* SHA384 on */
+#else
+# undef _ENABLE_ALG_SHA384_ /* SHA384 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA512_224_)
+# define _ENABLE_ALG_SHA512_224_ /* SHA512/224 on */
+#else
+# undef _ENABLE_ALG_SHA512_224_ /* SHA512/224 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SHA512_256_)
+# define _ENABLE_ALG_SHA512_256_ /* SHA512/256 on */
+#else
+# undef _ENABLE_ALG_SHA512_256_ /* SHA512/256 off */
+#endif
+
+#if !defined(_DISABLE_ALG_MD5_)
+# define _ENABLE_ALG_MD5_ /* MD5 on */
+#else
+# undef _ENABLE_ALG_MD5_ /* MD5 off */
+#endif
+
+#if !defined(_DISABLE_ALG_SM3_)
+# define _ENABLE_ALG_SM3_ /* SM3 on */
+#else
+# undef _ENABLE_ALG_SM3_ /* SM3 off */
+#endif
+
+/*
+// SHA1 plays especial role in IPP. Thus IPP random generator
+// and therefore prime number generator are based on SHA1.
+// So, do no exclude SHA1 from the active list of hash algorithms
+*/
+#if defined(_DISABLE_ALG_SHA1_)
+#undef _DISABLE_ALG_SHA1_
+#endif
+
+/*
+// Because of performane reason hash algorithms are implemented in form
+// of unroller cycle and therefore these implementations are big enough.
+// IPP supports "compact" implementation of some basic hash algorithms:
+// SHA-1
+// SHA-256
+// SHA-512
+// SM3
+//
+// Define any
+// _ALG_SHA1_COMPACT_
+// _ALG_SHA256_COMPACT_
+// _ALG_SHA512_COMPACT_
+// _ALG_SM3_COMPACT_
+//
+// to select "compact" implementation of particular hash algorithm.
+// IPP does not define "compact" implementation by default.
+//
+// Don't know what performance degradation leads "compact"
+// in comparison with default IPP implementation.
+//
+// Note: the definition like _ALG_XXX_COMPACT_ has effect
+// if and only if IPP instance is _PX or _MX
+*/
+//#define _ALG_SHA1_COMPACT_
+//#define _ALG_SHA256_COMPACT_
+//#define _ALG_SHA512_COMPACT_
+//#define _ALG_SM3_COMPACT_
+//#undef _ALG_SHA1_COMPACT_
+//#undef _ALG_SHA256_COMPACT_
+//#undef _ALG_SHA512_COMPACT_
+//#undef _ALG_SM3_COMPACT_
+
+
+/*
+// BN arithmetic:
+// - do/don't use special implementation of sqr instead of usual multication
+// - do/don't use Karatsuba multiplication alg
+*/
+#define _USE_SQR_ /* use implementaton of sqr */
+#define xUSE_KARATSUBA_ /* not use Karatsuba method for multiplication */
+#if !defined(_DISABLE_WINDOW_EXP_)
+ #define _USE_WINDOW_EXP_ /* use fixed window exponentiation */
+#endif
+
+
+/*
+// RSA:
+// - do/don't use Ernie's style mitigation of CBA
+// - do/don't use Gres's style mitigation of CBA
+// - do/don't use Foldinf technique for RSA-1204 implementation
+*/
+#define xUSE_ERNIE_CBA_MITIGATION_ /* not use (Ernie) mitigation of CBA */
+#define _USE_GRES_CBA_MITIGATION_ /* use (Gres) mitigation of CBA */
+#define xUSE_FOLD_MONT512_ /* use foding technique in RSA-1024 case */
+
+
+/*
+// IPP supports different implementation of NIST's (standard) EC over GF(0):
+// P-128 (IppECCPStd128r1, IppECCPStd128r2)
+// P-192 (IppECCPStd192r1)
+// P-224 (IppECCPStd224r1)
+// P-256 (IppECCPStd256r1)
+// P-384 (IppECCPStd384r1)
+// P-521 (IppECCPStd521r1)
+//
+// If one need replace the particular implementation by abritrary one
+// assign _ECP_IMP_ARBIRTRARY_ to suitable symbol
+//
+// _ECP_IMPL_ARBIRTRARY_ means that implementtaion does not use any curve specific,
+// provide the same (single) code for any type curve
+//
+// _ECP_IMPL_SPECIFIC_ means that implementation uses specific modular reduction
+// based on prime structure;
+// most of NIST's cures (p128, p192, p224, p256, p384, p521) are uses
+// such kind of reduction procedure;
+// in contrast with _ECP_IMPL_ARBIRTRARY_ and _ECP_IMPL_MFM_
+// this type of implementation uses point representation in REGULAR residual
+// (not Montgometry!!) domain
+//
+// _ECP_IMPL_MFM_ means that implementation uses "Montgomary Friendly Modulus" (primes);
+// p256 and sm2 are using such kind of optimization
+*/
+#define _ECP_IMPL_NONE_ 0
+#define _ECP_IMPL_ARBIRTRARY_ 1
+#define _ECP_IMPL_SPECIFIC_ 2
+#define _ECP_IMPL_MFM_ 3
+
+#if !defined(_ECP_112R1_)
+#if !defined(_DISABLE_ECP_112R1_)
+# define _ECP_112R1_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_112R1_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_112R2_)
+#if !defined(_DISABLE_ECP_112R2_)
+# define _ECP_112R2_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_112R2_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_160R1_)
+#if !defined(_DISABLE_ECP_160R1_)
+# define _ECP_160R1_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_160R1_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_160R2_)
+#if !defined(_DISABLE_ECP_160R2_)
+# define _ECP_160R2_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_160R2_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_128R1_)
+#if !defined(_DISABLE_ECP_128R1_)
+# define _ECP_128R1_ _ECP_IMPL_SPECIFIC_
+#else
+# define _ECP_128R1_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_128R2_)
+#if !defined(_DISABLE_ECP_128R2_)
+# define _ECP_128R2_ _ECP_IMPL_SPECIFIC_
+#else
+# define _ECP_128R2_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_192_)
+#if !defined(_DISABLE_ECP_192_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_192_ _ECP_IMPL_MFM_
+# else
+# define _ECP_192_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_192_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_224_)
+#if !defined(_DISABLE_ECP_224_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_224_ _ECP_IMPL_MFM_
+# else
+# define _ECP_224_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_224_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_256_)
+#if !defined(_DISABLE_ECP_256_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_256_ _ECP_IMPL_MFM_
+# else
+# define _ECP_256_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_256_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_384_)
+#if !defined(_DISABLE_ECP_384_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_384_ _ECP_IMPL_MFM_
+# else
+# define _ECP_384_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_384_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_521_)
+#if !defined(_DISABLE_ECP_521_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_521_ _ECP_IMPL_MFM_
+# else
+# define _ECP_521_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_521_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_SM2_)
+#if !defined(_DISABLE_ECP_SM2_)
+# if (_IPP32E >= _IPP32E_M7) || (_IPP >= _IPP_P8)
+# define _ECP_SM2_ _ECP_IMPL_MFM_
+# else
+# define _ECP_SM2_ _ECP_IMPL_SPECIFIC_
+# endif
+#else
+# define _ECP_SM2_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_ECP_BN_)
+#if !defined(_DISABLE_ECP_BN_)
+# define _ECP_BN_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_BN_ _ECP_IMPL_NONE_
+#endif
+#endif
+
+#if !defined(_DISABLE_ECP_GENERAL_)
+# define _ECP_GENERAL_ _ECP_IMPL_ARBIRTRARY_
+#else
+# define _ECP_GENERAL_ _ECP_IMPL_NONE_
+#endif
+
+
+/*
+// EC over GF(p):
+// - do/don't use mitigation of CBA
+*/
+#define _USE_ECCP_SSCM_ /* use SSCM ECCP */
+
+
+#if defined ( _OPENMP )
+#define DEFAULT_CPU_NUM (8)
+
+#define BF_MIN_BLK_PER_THREAD (32)
+#define TF_MIN_BLK_PER_THREAD (16)
+
+#define DES_MIN_BLK_PER_THREAD (32)
+#define TDES_MIN_BLK_PER_THREAD (16)
+
+#define RC5_64_MIN_BLK_PER_THREAD (16)
+#define RC5_128_MIN_BLK_PER_THREAD (32)
+
+#define RIJ128_MIN_BLK_PER_THREAD (32)
+#define RIJ192_MIN_BLK_PER_THREAD (16)
+#define RIJ256_MIN_BLK_PER_THREAD (16)
+
+#define AESNI128_MIN_BLK_PER_THREAD (256)
+#endif
+
+#endif /* _CP_VARIANT_H */
diff --git a/parts-site/configurations/__init__.py b/parts-site/configurations/__init__.py
new file mode 100644
index 0000000..8e82fa7
--- /dev/null
+++ b/parts-site/configurations/__init__.py
@@ -0,0 +1,27 @@
+############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################*/
+# pylint: disable=locally-disabled, missing-docstring, no-member, unused-variable
+
+import parts.load_module as load_module
+import parts.reporter as reporter
+
+def configuration(type_name):
+ """define configurations"""
+ try:
+ mod = load_module.load_module(
+ load_module.get_site_directories('configurations'), type_name, 'configtype')
+ except ImportError:
+ reporter.report_error('configuration "%s" was not found.'%type_name, show_stack=False)
diff --git a/parts-site/configurations/debug/__init__.py b/parts-site/configurations/debug/__init__.py
new file mode 100644
index 0000000..624392f
--- /dev/null
+++ b/parts-site/configurations/debug/__init__.py
@@ -0,0 +1,20 @@
+############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, missing-docstring
+
+from parts.config import DefineConfiguration
+
+DefineConfiguration("debug", dependsOn='default')
diff --git a/parts-site/configurations/debug/g++.py b/parts-site/configurations/debug/g++.py
new file mode 100644
index 0000000..4c899c0
--- /dev/null
+++ b/parts-site/configurations/debug/g++.py
@@ -0,0 +1,56 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""g++ compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # produce debugging information
+ '-g',
+ # disable optimization
+ '-O0',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ '-fPIC'
+ ],
+ CXXFLAGS=[
+ # modern C++ features support
+ '-std=c++0x',
+ ],
+ CPPDEFINES=[
+ '_FORTIFY_SOURCE=2',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/debug/g++_win32-any.py b/parts-site/configurations/debug/g++_win32-any.py
new file mode 100644
index 0000000..576d4d9
--- /dev/null
+++ b/parts-site/configurations/debug/g++_win32-any.py
@@ -0,0 +1,58 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""g++ compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # produce debugging information
+ '-g',
+ # disable optimization
+ '-O0',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ ],
+ CXXFLAGS=[
+ # modern C++ features support
+ #'-std=c++0x',
+ # modern C++ features with gcc extensions
+ '-std=gnu++11'
+ ],
+ CPPDEFINES=[
+ '_FORTIFY_SOURCE=2',
+ '__int64=long long',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/debug/gcc.py b/parts-site/configurations/debug/gcc.py
new file mode 100644
index 0000000..2fc3436
--- /dev/null
+++ b/parts-site/configurations/debug/gcc.py
@@ -0,0 +1,61 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""gcc compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # produce debugging information
+ '-g',
+ # disable optimization
+ '-O0',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ # disable warnings due to gcc 4.8.5 issues
+ '-Wno-missing-braces',
+ '-Wno-missing-field-initializers',
+ '-Wno-unknown-pragmas',
+ '-Wno-unused-function',
+ # do not warn about unused but set variables
+ '-Wno-unused-but-set-variable',
+ # do not warn about multiline comments
+ '-Wno-comment',
+ '-fPIC'
+ ],
+ CPPDEFINES=[
+ '_FORTIFY_SOURCE=2',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/debug/gcc_win32-any.py b/parts-site/configurations/debug/gcc_win32-any.py
new file mode 100644
index 0000000..a7b3069
--- /dev/null
+++ b/parts-site/configurations/debug/gcc_win32-any.py
@@ -0,0 +1,60 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""gcc compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # produce debugging information
+ '-g',
+ # disable optimization
+ '-O0',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ # disable warnings due to gcc 4.8.5 issues
+ '-Wno-missing-braces',
+ '-Wno-missing-field-initializers',
+ '-Wno-unknown-pragmas',
+ '-Wno-unused-function',
+ # do not warn about unused but set variables
+ '-Wno-unused-but-set-variable',
+ # do not warn about multiline comments
+ '-Wno-comment',
+ ],
+ CPPDEFINES=[
+ '__int64=long long',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/debug/intelc_posix-any.py b/parts-site/configurations/debug/intelc_posix-any.py
new file mode 100644
index 0000000..beb7443
--- /dev/null
+++ b/parts-site/configurations/debug/intelc_posix-any.py
@@ -0,0 +1,48 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel posix compiler configuration for debug
+"""
+
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ '-fPIC'],
+ CXXFLAGS=['',
+ # modern C++ features support
+ '-std=c++0x',
+ ]
+ )
+ )
diff --git a/parts-site/configurations/debug/intelc_win32-any_win32-x86.py b/parts-site/configurations/debug/intelc_win32-any_win32-x86.py
new file mode 100644
index 0000000..fcf2965
--- /dev/null
+++ b/parts-site/configurations/debug/intelc_win32-any_win32-x86.py
@@ -0,0 +1,49 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/Od',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Gd',
+ '/MTd',
+ '/nologo'],
+ CXXFLAGS=['/EHsc'],
+ LINKFLAGS=['/WX',
+ '/SAFESEH',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/nologo'],
+ CPPDEFINES=['DEBUG']
+ )
+ )
diff --git a/parts-site/configurations/debug/intelc_win32-any_win32-x86_64.py b/parts-site/configurations/debug/intelc_win32-any_win32-x86_64.py
new file mode 100644
index 0000000..7e595f1
--- /dev/null
+++ b/parts-site/configurations/debug/intelc_win32-any_win32-x86_64.py
@@ -0,0 +1,48 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/Od',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/MTd',
+ '/nologo'],
+ CXXFLAGS=['/EHsc'],
+ LINKFLAGS=['/WX',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/MACHINE:X64',
+ '/nologo'],
+ CPPDEFINES=['DEBUG']
+ )
+ )
diff --git a/parts-site/configurations/debug/msvc_win32-any_win32-x86.py b/parts-site/configurations/debug/msvc_win32-any_win32-x86.py
new file mode 100644
index 0000000..dc2127d
--- /dev/null
+++ b/parts-site/configurations/debug/msvc_win32-any_win32-x86.py
@@ -0,0 +1,54 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""MSVC win32 compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['MSVC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/wd4127', # allow while (0)
+ '/wd4592', # VS2015U1 limitation
+ #'/wd4366', # ok unaligned &
+ #'/wd4204', # allow x= {a,b}
+ #'/wd4221', # allow x = {&y}
+ '/Zc:wchar_t',
+ '/Z7',
+ '/Od',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Gd',
+ '/MTd',
+ '/nologo'],
+ CXXFLAGS=['/EHsc'],
+ LINKFLAGS=['/WX',
+ '/SAFESEH',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/nologo'],
+ CPPDEFINES=['DEBUG']
+ )
+ )
diff --git a/parts-site/configurations/debug/msvc_win32-any_win32-x86_64.py b/parts-site/configurations/debug/msvc_win32-any_win32-x86_64.py
new file mode 100644
index 0000000..1cc4085
--- /dev/null
+++ b/parts-site/configurations/debug/msvc_win32-any_win32-x86_64.py
@@ -0,0 +1,53 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""MSVC win32 compiler configuration for debug
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['MSVC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/wd4127', # allow while (0)
+ '/wd4592', # VS2015U1 limitation
+ #'/wd4366', # ok unaligned &
+ #'/wd4204', # allow x= {a,b}
+ #'/wd4221', # allow x = {&y}
+ '/Zc:wchar_t',
+ '/Z7',
+ '/Od',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/MTd',
+ '/nologo'],
+ CXXFLAGS=['/EHsc'],
+ LINKFLAGS=['/WX',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/MACHINE:X64',
+ '/nologo'],
+ CPPDEFINES=['DEBUG']
+ )
+ )
diff --git a/parts-site/configurations/embedded/__init__.py b/parts-site/configurations/embedded/__init__.py
new file mode 100644
index 0000000..1088b0b
--- /dev/null
+++ b/parts-site/configurations/embedded/__init__.py
@@ -0,0 +1,20 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, missing-docstring
+
+from parts.config import DefineConfiguration
+
+DefineConfiguration("embedded", dependsOn='default')
diff --git a/parts-site/configurations/embedded/gcc.py b/parts-site/configurations/embedded/gcc.py
new file mode 100644
index 0000000..4b853a1
--- /dev/null
+++ b/parts-site/configurations/embedded/gcc.py
@@ -0,0 +1,72 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""gcc compiler configuration for embedded
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ # optimize for size
+ '-Os',
+ # prevent using built in stdlib replacement functions
+ '-fno-builtin',
+ '-fno-stack-protector',
+ '-fomit-frame-pointer',
+ '-fno-asynchronous-unwind-tables',
+ # allow linker to optimize out not used stuff
+ '-fdata-sections',
+ '-ffunction-sections',
+ # only export specified functions
+ '-fvisibility=hidden',
+ # shared object friendly
+ '-fPIC',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # Allow struct initilization with {0}
+ '-Wno-missing-braces',
+ # dump stack usage to file
+ '-fstack-usage',
+ # dump control flow graph
+ '-fdump-tree-cfg-raw',
+ ],
+ CPPDEFINES=[
+ 'NDEBUG',
+ ],
+ LINKFLAGS=[
+ # do not link standard system libraries
+ '-nodefaultlibs',
+ '-nostdlib',
+ # do not use stadard system startup
+ '-nostartfiles',
+ # remove all symbol table and relocation information
+ '-s',
+ # link only what is used
+ '-Xlinker',
+ '--gc-sections',
+ ],))
diff --git a/parts-site/configurations/embedded/gcc_win32-any.py b/parts-site/configurations/embedded/gcc_win32-any.py
new file mode 100644
index 0000000..b7ac98f
--- /dev/null
+++ b/parts-site/configurations/embedded/gcc_win32-any.py
@@ -0,0 +1,72 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""win32 gcc compiler configuration for embedded
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ # optimize for size
+ '-Os',
+ # prevent using built in stdlib replacement functions
+ '-fno-builtin',
+ '-fno-stack-protector',
+ '-fomit-frame-pointer',
+ '-fno-asynchronous-unwind-tables',
+ # allow linker to optimize out not used stuff
+ '-fdata-sections',
+ '-ffunction-sections',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # Allow struct initilization with {0}
+ '-Wno-missing-braces',
+ # dump stack usage to file
+ '-fstack-usage',
+ # dump control flow graph
+ '-fdump-tree-cfg-raw',
+ ],
+ CPPDEFINES=[
+ 'NDEBUG',
+ ],
+ SHLINKFLAGS=[
+ # do not use stadard system entrypoint
+ '-e 0',
+ ],
+ LINKFLAGS=[
+ # do not link standard system libraries
+ '-nodefaultlibs',
+ '-nostdlib',
+ # do not use stadard system startup
+ '-nostartfiles',
+ # remove all symbol table and relocation information
+ '-s',
+ # link only what is used
+ '-Xlinker',
+ '--gc-sections',
+ ],))
diff --git a/parts-site/configurations/embedded/intelc_posix-any.py b/parts-site/configurations/embedded/intelc_posix-any.py
new file mode 100644
index 0000000..b94b90c
--- /dev/null
+++ b/parts-site/configurations/embedded/intelc_posix-any.py
@@ -0,0 +1,66 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel posix compiler configuration for embedded
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "7-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ # second level optimization
+ '-Os',
+ # prevent using built in stdlib replacement functions
+ '-fno-builtin',
+ '-fno-stack-protector',
+ '-fomit-frame-pointer',
+ '-fno-asynchronous-unwind-tables',
+ # allow linker to optimize out not used stuff
+ '-fdata-sections',
+ '-ffunction-sections',
+ # only export specified functions
+ '-fvisibility=hidden',
+ # shared object friendly
+ '-fPIC',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ ],
+ CPPDEFINES=[
+ 'NDEBUG',
+ ],
+ LINKFLAGS=[
+ # do not link standard system libraries
+ '-nodefaultlibs',
+ '-nostdlib',
+ # do not use stadard system startup
+ '-nostartfiles',
+ # remove all symbol table and relocation information
+ '-s',
+ # link only what is used
+ '-Xlinker',
+ '--gc-sections',
+ ],))
diff --git a/parts-site/configurations/embedded/intelc_win32-any.py b/parts-site/configurations/embedded/intelc_win32-any.py
new file mode 100644
index 0000000..8bdde1c
--- /dev/null
+++ b/parts-site/configurations/embedded/intelc_win32-any.py
@@ -0,0 +1,69 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configurations release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ # Compile using multiple processes
+ '/MP',
+ # SDL: Stack-based Buffer Overrun Detection
+ '/GS-',
+ # minimize size
+ '/O1',
+ # allow non standart comment in C
+ '/wd991',
+ # typedef forward with the same name
+ '/wd344',
+ # disable language extensions
+ '/Za',
+ # Use multi-thread static libc
+ '/MT',
+ # treat all warnings as errors
+ '/Wall',
+ '/WX',
+ '/nologo'],
+ CXXFLAGS=[
+ '/EHsc',
+ # disable RTTI
+ '/GR-'],
+ LINKFLAGS=[
+ # no default libraries
+ '/NODEFAULTLIB',
+ # prevent linker from references _main in dll
+ '/NOENTRY',
+ # elminiate unreferenced functions + data
+ '/OPT:REF',
+ # SDL: Data Execution Prevention
+ '/NXCOMPAT',
+ # SDL: Image Randomization
+ '/DYNAMICBASE',
+ # treat linker warnings as errors
+ '/WX',
+ '/nologo'
+ ],
+ CPPDEFINES=['NDEBUG']
+ )
+ )
diff --git a/parts-site/configurations/embedded/msvc_win32-any.py b/parts-site/configurations/embedded/msvc_win32-any.py
new file mode 100644
index 0000000..33f63ca
--- /dev/null
+++ b/parts-site/configurations/embedded/msvc_win32-any.py
@@ -0,0 +1,85 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""msvc win32 compiler configuration for embedded
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['MSVC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "7-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ # minimize size
+ '/O1',
+ # Use multi-thread static libc
+ '/MT',
+ # allow single line comment in C
+ '/wd4001',
+ # allow functions to auto inline
+ '/wd4711',
+ # allow compiler to append padding to structs
+ '/wd4820',
+ # allow while (0)
+ '/wd4127',
+ # whole program optimization
+ #'/GL',
+ # disable language extensions
+ '/Za',
+ # SDL: Stack-based Buffer Overrun Detection
+ '/GS-',
+ # SDL: Compiler settings validation
+ #'/sdl-',
+ # Compile using multiple processes
+ '/MP',
+ # treat all warnings as errors
+ '/WX',
+ '/Wall',
+ '/nologo'
+ ],
+ CXXFLAGS=[
+ '/EHsc',
+ # disable RTTI
+ '/GR-'
+ ],
+ LINKFLAGS=[
+ # no default libraries
+ '/NODEFAULTLIB',
+ # prevent linker from references _main in dll
+ '/NOENTRY',
+ # elminiate unreferenced functions + data
+ '/OPT:REF',
+ # whole program optimization
+ #'/LTCG',
+ # SDL: Data Execution Prevention
+ '/NXCOMPAT',
+ # SDL: Image Randomization
+ '/DYNAMICBASE',
+ # SDL: Safe Exception Handling
+ #'/SAFESEH', # not compatible with x64
+ # treat linker warnings as errors
+ '/WX',
+ # target platform
+ #'/MACHINE:X64',
+ '/nologo'
+ ],
+ CPPDEFINES=['NDEBUG']))
diff --git a/parts-site/configurations/release/__init__.py b/parts-site/configurations/release/__init__.py
new file mode 100644
index 0000000..a571c53
--- /dev/null
+++ b/parts-site/configurations/release/__init__.py
@@ -0,0 +1,20 @@
+############################################################################
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, missing-docstring
+
+from parts.config import DefineConfiguration
+
+DefineConfiguration("release", dependsOn='default')
diff --git a/parts-site/configurations/release/g++.py b/parts-site/configurations/release/g++.py
new file mode 100644
index 0000000..601f8d1
--- /dev/null
+++ b/parts-site/configurations/release/g++.py
@@ -0,0 +1,55 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""g++ compiler configuration for release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("3-*",
+ append=ConfigValues(
+ CCFLAGS=['',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ '-Wformat',
+ '-Wformat-security',
+ '-fstack-protector',
+ '-fPIC'],
+ CXXFLAGS=['',
+ # modern C++ features support
+ '-std=c++0x'],
+ CPPDEFINES=['NDEBUG',
+ '_FORTIFY_SOURCE=2'],
+ LINKFLAGS=['-fstack-protector',
+ '-znoexecstack',
+ '-zrelro',
+ '-znow',
+ '-pie'],
+ )
+ )
diff --git a/parts-site/configurations/release/g++_win32-any.py b/parts-site/configurations/release/g++_win32-any.py
new file mode 100644
index 0000000..8bce2e5
--- /dev/null
+++ b/parts-site/configurations/release/g++_win32-any.py
@@ -0,0 +1,61 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""g++ compiler configuration for release
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ '-Wformat',
+ '-Wformat-security',
+ '-fstack-protector',
+ ],
+ CXXFLAGS=[
+ '',
+ # modern C++ features support
+ #'-std=c++0x',
+ # modern C++ features with gcc extensions
+ '-std=gnu++11'
+ ],
+ CPPDEFINES=[
+ 'NDEBUG',
+ '_FORTIFY_SOURCE=2',
+ '__int64=long long',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/release/gcc.py b/parts-site/configurations/release/gcc.py
new file mode 100644
index 0000000..d0b56fe
--- /dev/null
+++ b/parts-site/configurations/release/gcc.py
@@ -0,0 +1,63 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""gcc compiler configuration for release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("3-*",
+ append=ConfigValues(
+ CCFLAGS=['',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ # disable warnings due to gcc 4.8.5 issues
+ '-Wno-missing-braces',
+ '-Wno-missing-field-initializers',
+ '-Wno-unknown-pragmas',
+ '-Wno-unused-function',
+ # do not assume strict aliasing
+ '-fno-strict-aliasing',
+ # do not warn about unused but set variables
+ '-Wno-unused-but-set-variable',
+ # do not warn about multiline comments
+ '-Wno-comment',
+ '-Wformat',
+ '-Wformat-security',
+ '-fstack-protector',
+ '-fPIC'],
+ CPPDEFINES=['NDEBUG',
+ '_FORTIFY_SOURCE=2'],
+ LINKFLAGS=['-fstack-protector',
+ '-znoexecstack',
+ '-zrelro',
+ '-znow',
+ '-pie'],
+ )
+ )
diff --git a/parts-site/configurations/release/gcc_win32-any.py b/parts-site/configurations/release/gcc_win32-any.py
new file mode 100644
index 0000000..7b4f2ff
--- /dev/null
+++ b/parts-site/configurations/release/gcc_win32-any.py
@@ -0,0 +1,65 @@
+############################################################################
+# Copyright 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+"""gcc compiler configuration for release
+"""
+from parts.config import ConfigValues, configuration
+
+
+def map_default_version(env):
+ return env['GCC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange(
+ "3-*",
+ append=ConfigValues(
+ CCFLAGS=[
+ '',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ # disable warnings due to gcc 4.8.5 issues
+ '-Wno-missing-braces',
+ '-Wno-missing-field-initializers',
+ '-Wno-unknown-pragmas',
+ '-Wno-unused-function',
+ # do not assume strict aliasing
+ '-fno-strict-aliasing',
+ # do not warn about unused but set variables
+ '-Wno-unused-but-set-variable',
+ # do not warn about multiline comments
+ '-Wno-comment',
+ '-Wformat',
+ '-Wformat-security',
+ '-fstack-protector',
+ ],
+ CPPDEFINES=[
+ 'NDEBUG',
+ '_FORTIFY_SOURCE=2',
+ '__int64=long long',
+ ],
+ LINKFLAGS=[
+ '-fstack-protector',
+ ], ))
diff --git a/parts-site/configurations/release/intelc_posix-any.py b/parts-site/configurations/release/intelc_posix-any.py
new file mode 100644
index 0000000..5b42d75
--- /dev/null
+++ b/parts-site/configurations/release/intelc_posix-any.py
@@ -0,0 +1,57 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel posix compiler configuration for release
+"""
+
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['',
+ # second level optimization
+ '-O2',
+ # treat warnings as errors
+ '-Werror',
+ # enable all warnings
+ '-Wall',
+ # extra warnings
+ '-Wextra',
+ # pedantic warnings
+ # '-Wpedantic',
+ '-Wformat',
+ '-Wformat-security',
+ '-fstack-protector',
+ '-fPIC'],
+ CXXFLAGS=['',
+ # modern C++ features support
+ '-std=c++0x'],
+ CPPDEFINES=['NDEBUG',
+ '_FORTIFY_SOURCE=2'],
+ LINKFLAGS=['-fstack-protector',
+ '-znoexecstack',
+ '-zrelro',
+ '-znow',
+ '-pie'],
+ )
+ )
diff --git a/parts-site/configurations/release/intelc_win32-any_win32-x86.py b/parts-site/configurations/release/intelc_win32-any_win32-x86.py
new file mode 100644
index 0000000..0ec984a
--- /dev/null
+++ b/parts-site/configurations/release/intelc_win32-any_win32-x86.py
@@ -0,0 +1,52 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configuration for release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/Gy',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/O2',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Gd',
+ '/Oi',
+ '/MT',
+ '/nologo'],
+ CXXFLAGS=['/EHsc',
+ '/GR'],
+ LINKFLAGS=['/WX',
+ '/SAFESEH',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/nologo'],
+ CPPDEFINES=['NDEBUG']
+ )
+ )
diff --git a/parts-site/configurations/release/intelc_win32-any_win32-x86_64.py b/parts-site/configurations/release/intelc_win32-any_win32-x86_64.py
new file mode 100644
index 0000000..aa76509
--- /dev/null
+++ b/parts-site/configurations/release/intelc_win32-any_win32-x86_64.py
@@ -0,0 +1,51 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configurations release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['INTELC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/Gy',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/O2',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Oi',
+ '/MT',
+ '/nologo'],
+ CXXFLAGS=['/EHsc',
+ '/GR'],
+ LINKFLAGS=['/WX',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/MACHINE:X64',
+ '/nologo'],
+ CPPDEFINES=['NDEBUG']
+ )
+ )
diff --git a/parts-site/configurations/release/msvc_win32-any_win32-x86.py b/parts-site/configurations/release/msvc_win32-any_win32-x86.py
new file mode 100644
index 0000000..4154ba3
--- /dev/null
+++ b/parts-site/configurations/release/msvc_win32-any_win32-x86.py
@@ -0,0 +1,58 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configurations release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['MSVC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/wd4127', # allow while (0)
+ '/wd4592', # VS2015U1 limitation
+ #'/wd4366', # ok unaligned &
+ #'/wd4204', # allow x= {a,b}
+ #'/wd4221', # allow x = {&y}
+ '/Gy',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/O2',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Gd',
+ '/Oi',
+ '/MT',
+ '/sdl',
+ '/nologo'],
+ CXXFLAGS=['/EHsc',
+ '/GR'],
+ LINKFLAGS=['/WX',
+ '/SAFESEH',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/nologo'],
+ CPPDEFINES=['NDEBUG']
+ )
+ )
diff --git a/parts-site/configurations/release/msvc_win32-any_win32-x86_64.py b/parts-site/configurations/release/msvc_win32-any_win32-x86_64.py
new file mode 100644
index 0000000..a83c0e1
--- /dev/null
+++ b/parts-site/configurations/release/msvc_win32-any_win32-x86_64.py
@@ -0,0 +1,57 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, missing-docstring
+
+"""Intel win32 compiler configurations release
+"""
+from parts.config import ConfigValues, configuration
+
+def map_default_version(env):
+ return env['MSVC_VERSION']
+
+config = configuration(map_default_version)
+
+config.VersionRange("7-*",
+ append=ConfigValues(
+ CCFLAGS=['/MP',
+ '/GS',
+ '/W4',
+ '/wd4127', # allow while (0)
+ '/wd4592', # VS2015U1 limitation
+ #'/wd4366', # ok unaligned &
+ #'/wd4204', # allow x= {a,b}
+ #'/wd4221', # allow x = {&y}
+ '/Gy',
+ '/Zc:wchar_t',
+ '/Z7',
+ '/O2',
+ '/fp:precise',
+ '/WX',
+ '/Zc:forScope',
+ '/Oi',
+ '/MT',
+ '/sdl',
+ '/nologo'],
+ CXXFLAGS=['/EHsc',
+ '/GR'],
+ LINKFLAGS=['/WX',
+ '/NXCOMPAT',
+ '/DYNAMICBASE',
+ '/MACHINE:X64',
+ '/nologo'],
+ CPPDEFINES=['NDEBUG']
+ )
+ )
diff --git a/parts-site/pieces/arm_support.py b/parts-site/pieces/arm_support.py
new file mode 100644
index 0000000..525629d
--- /dev/null
+++ b/parts-site/pieces/arm_support.py
@@ -0,0 +1,23 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+"""
+Adds ARM targets support to Parts
+"""
+
+import parts.api.platforms
+
+parts.api.platforms.AddArchitecture('arm_hf')
+parts.api.platforms.AddArchitecture('aarch64')
diff --git a/parts-site/tools/g++.py b/parts-site/tools/g++.py
new file mode 100644
index 0000000..8fe9d17
--- /dev/null
+++ b/parts-site/tools/g++.py
@@ -0,0 +1,74 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name
+"""
+Configure g++ ARM toolchain
+"""
+
+import importlib
+from parts.platform_info import SystemPlatform
+from parts.tools.Common.Finders import PathFinder
+import parts.tools.GnuCommon.common
+
+parts.tools.GnuCommon.common.gxx.Register(
+ # compilation for Linux armel architecture system can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'arm')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary location for arm-linux-gnueabi-g++ compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='arm-linux-gnueabi-g++')
+ ]
+)
+
+parts.tools.GnuCommon.common.gxx.Register(
+ # compilation for Linux armhf architecture system can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'arm_hf')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary location for arm-linux-gnueabihf-g++ compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='arm-linux-gnueabihf-g++')
+ ]
+)
+
+parts.tools.GnuCommon.common.gxx.Register(
+ # compilation for Linux arm 64bit can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'aarch64')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary for aarch64-linux-gnu-g++ compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='aarch64-linux-gnu-g++')
+ ]
+)
+# import g++ tool from parts ( we only need to add configurations to be loaded)
+globals().update(importlib.import_module('parts.tools.g++').__dict__)
diff --git a/parts-site/tools/gcc.py b/parts-site/tools/gcc.py
new file mode 100644
index 0000000..cd76a48
--- /dev/null
+++ b/parts-site/tools/gcc.py
@@ -0,0 +1,73 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+# pylint: disable=locally-disabled, invalid-name, wildcard-import, unused-wildcard-import
+"""
+Configure gcc ARM toolchain
+"""
+
+from parts.platform_info import SystemPlatform
+from parts.tools.Common.Finders import PathFinder
+import parts.tools.GnuCommon.common
+# import gcc tool from parts ( we only need to add configurations to be loaded)
+from parts.tools.gcc import *
+
+parts.tools.GnuCommon.common.gcc.Register(
+ # compilation for Linux armel architecture system can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'arm')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary location for arm-linux-gnueabi-gcc compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='arm-linux-gnueabi-gcc')
+ ]
+)
+
+parts.tools.GnuCommon.common.gcc.Register(
+ # compilation for Linux armhf architecture system can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'arm_hf')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary location for arm-linux-gnueabihf-gcc compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='arm-linux-gnueabihf-gcc')
+ ]
+)
+
+parts.tools.GnuCommon.common.gcc.Register(
+ # compilation for Linux arm 64bit can be done from any Linux x86_64 system
+ hosts=[SystemPlatform('posix', 'x86_64')],
+ targets=[SystemPlatform('posix', 'aarch64')],
+ info=[
+ parts.tools.GnuCommon.common.GnuInfo(
+ # default binary location for aarch64-linux-gnu-gcc compiler
+ install_scanner=[PathFinder(['/usr/bin'])],
+ opt_dirs=['/opt/'],
+ script=None,
+ subst_vars={},
+ shell_vars={'PATH': '${GCC.INSTALL_ROOT}'},
+ test_file='aarch64-linux-gnu-gcc')
+ ]
+)
diff --git a/tools/Makefile b/tools/Makefile
new file mode 100644
index 0000000..c79e980
--- /dev/null
+++ b/tools/Makefile
@@ -0,0 +1,109 @@
+#!/usr/bin/make -f
+
+#define variables
+TOOLS_INSTALL_DIR = $(epidinstalldir)/tools
+
+EXTRACTGRPS_INCLUDE_DIR = ./extractgrps
+EXTRACTGRPS_SRC = $(wildcard ./extractgrps/src/*.c)
+EXTRACTGRPS_OBJ = $(EXTRACTGRPS_SRC:.c=.o)
+EXTRACTGRPS_EXE = ./extractgrps/src/extractgrps$(EXE_EXTENSION)
+
+EXTRACTKEYS_INCLUDE_DIR = ./extractkeys
+EXTRACTKEYS_SRC = $(wildcard ./extractkeys/src/*.c)
+EXTRACTKEYS_OBJ = $(EXTRACTKEYS_SRC:.c=.o)
+EXTRACTKEYS_EXE = ./extractkeys/src/extractkeys$(EXE_EXTENSION)
+
+REVOKEGRP_INCLUDE_DIR = ./revokegrp
+REVOKEGRP_SRC = $(wildcard ./revokegrp/src/*.c)
+REVOKEGRP_OBJ = $(REVOKEGRP_SRC:.c=.o)
+REVOKEGRP_EXE = ./revokegrp/src/revokegrp$(EXE_EXTENSION)
+
+REVOKEKEY_INCLUDE_DIR = ./revokekey
+REVOKEKEY_SRC = $(wildcard ./revokekey/src/*.c)
+REVOKEKEY_OBJ = $(REVOKEKEY_SRC:.c=.o)
+REVOKEKEY_EXE = ./revokekey/src/revokekey$(EXE_EXTENSION)
+
+REVOKESIG_INCLUDE_DIR = ./revokesig
+REVOKESIG_SRC = $(wildcard ./revokesig/src/*.c)
+REVOKESIG_OBJ = $(REVOKESIG_SRC:.c=.o)
+REVOKESIG_EXE = ./revokesig/src/revokesig$(EXE_EXTENSION)
+
+EPID_SDK_ROOT_DIR = ..
+EXAMPLE_DIR = $(EPID_SDK_ROOT_DIR)/example
+LIB_ARGTABLE_DIR = $(EPID_SDK_ROOT_DIR)/ext/argtable3
+LIB_UTIL_DIR = $(EPID_SDK_ROOT_DIR)/example/util/src
+LIB_IPPCP_DIR = $(EPID_SDK_ROOT_DIR)/ext/ipp/sources/ippcp/src
+LIB_MEMBER_DIR = $(EPID_SDK_ROOT_DIR)/epid/member
+LIB_COMMON_DIR = $(EPID_SDK_ROOT_DIR)/epid/common
+
+#set linker flags
+LDFLAGS += -L$(LIB_UTIL_DIR) \
+ -L$(LIB_ARGTABLE_DIR) \
+ -L$(LIB_IPPCP_DIR) \
+ -L$(LIB_COMMON_DIR) \
+ -lcommon \
+ -lippcp -lutil -largtable3
+
+$(EXTRACTGRPS_EXE): $(EXTRACTGRPS_OBJ)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+$(EXTRACTGRPS_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(EPID_SDK_ROOT_DIR) \
+ -I${EXAMPLE_DIR} -I$(EXTRACTGRPS_INCLUDE_DIR) \
+ -I${LIB_ARGTABLE_DIR} \
+ -c $^
+
+$(EXTRACTKEYS_EXE): $(EXTRACTKEYS_OBJ)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+$(EXTRACTKEYS_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(EPID_SDK_ROOT_DIR) \
+ -I${EXAMPLE_DIR} -I$(EXTRACTKEYS_INCLUDE_DIR) \
+ -I${LIB_ARGTABLE_DIR} \
+ -c $^
+
+$(REVOKEGRP_EXE): $(REVOKEGRP_OBJ)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+$(REVOKEGRP_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(EPID_SDK_ROOT_DIR) \
+ -I${EXAMPLE_DIR} -I$(REVOKEGRP_INCLUDE_DIR) \
+ -I${LIB_ARGTABLE_DIR} \
+ -c $^
+
+MEMBER_LIBS = -lmember
+ifneq ($(TINY),)
+ MEMBER_LIBS += -lmath -ltiny_stdlib
+endif
+$(REVOKEKEY_EXE): $(REVOKEKEY_OBJ)
+ $(CC) -o $@ $^ -L$(LIB_MEMBER_DIR) $(MEMBER_LIBS) $(LDFLAGS)
+
+$(REVOKEKEY_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(EPID_SDK_ROOT_DIR) \
+ -I$(LIB_MEMBER_DIR)/../.. \
+ -I${EXAMPLE_DIR} -I$(REVOKEKEY_INCLUDE_DIR) \
+ -I${LIB_ARGTABLE_DIR} \
+ -c $^
+
+$(REVOKESIG_EXE): $(REVOKESIG_OBJ)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+$(REVOKESIG_OBJ): %.o: %.c
+ $(CC) -o $@ $(CFLAGS) -I$(EPID_SDK_ROOT_DIR) \
+ -I${EXAMPLE_DIR} -I$(REVOKESIG_INCLUDE_DIR) \
+ -I${LIB_ARGTABLE_DIR} \
+ -c $^
+
+#target part
+build: all install
+
+all: $(EXTRACTGRPS_EXE) $(EXTRACTKEYS_EXE) $(REVOKEGRP_EXE) $(REVOKEKEY_EXE) $(REVOKESIG_EXE)
+
+install:
+ mkdir -p '$(TOOLS_INSTALL_DIR)'
+ cp $(EXTRACTGRPS_EXE) $(EXTRACTKEYS_EXE) $(REVOKEGRP_EXE) $(REVOKEKEY_EXE) $(REVOKESIG_EXE) \
+ '$(TOOLS_INSTALL_DIR)'
+
+clean:
+ rm -f $(EXTRACTGRPS_EXE) $(EXTRACTKEYS_EXE) $(REVOKEGRP_EXE) $(REVOKEKEY_EXE) $(REVOKESIG_EXE) \
+ $(EXTRACTGRPS_OBJ) $(EXTRACTKEYS_OBJ) $(REVOKEGRP_OBJ) $(REVOKEKEY_OBJ) $(REVOKESIG_OBJ)
diff --git a/tools/extractgrps/extractgrps.parts b/tools/extractgrps/extractgrps.parts
new file mode 100644
index 0000000..264e63e
--- /dev/null
+++ b/tools/extractgrps/extractgrps.parts
@@ -0,0 +1,47 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("extractgrps")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+parts_file = ['extractgrps.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='tools/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='tools/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ env.Append(CPPDEFINES='_CRT_SECURE_NO_WARNINGS')
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
diff --git a/tools/extractgrps/src/main.c b/tools/extractgrps/src/main.c
new file mode 100644
index 0000000..d02271a
--- /dev/null
+++ b/tools/extractgrps/src/main.c
@@ -0,0 +1,210 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Extract group keys from group key output file
+ */
+
+#include <argtable3.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "epid/common/file_parser.h"
+#include "epid/common/types.h"
+#include "util/buffutil.h"
+#include "util/envutil.h"
+#include "util/stdtypes.h"
+#include "util/strutil.h"
+
+#define PROGRAM_NAME "extractgrps"
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 5
+
+#pragma pack(1)
+/// Intel(R) EPID Key Output File Entry
+typedef struct EpidBinaryGroupCertificate {
+ EpidFileHeader header; ///< Intel(R) EPID binary file header
+ GroupPubKey pubkey; ///< Intel(R) EPID 2.0 group public key
+ EcdsaSignature signature; ///< ECDSA Signature on SHA-256 of above values
+} EpidBinaryGroupCertificate;
+#pragma pack()
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_SUCCESS;
+
+ size_t keyfile_size = 0;
+ size_t num_keys_extracted = 0;
+ size_t num_keys_in_file = 0;
+
+ FILE* file = NULL;
+
+ int i = 0;
+ size_t bytes_read = 0;
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ struct arg_file* keyfile =
+ arg_file1(NULL, NULL, "FILE", "FILE containing keys to extract");
+ struct arg_int* num_keys_to_extract =
+ arg_int1(NULL, NULL, "NUM", "number of keys to extract");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = keyfile;
+ argtable[1] = num_keys_to_extract;
+ argtable[2] = help;
+ argtable[3] = verbose;
+ argtable[4] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]... [FILE] [NUM]\n"
+ "Extract the first NUM group certs from FILE to current "
+ "directory\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (num_keys_to_extract->ival[0] < 0) {
+ log_error("unable extract negative number of keys");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // check file existence
+ if (!FileExists(keyfile->filename[0])) {
+ log_error("cannot access '%s'", keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ keyfile_size = GetFileSize(keyfile->filename[0]);
+ if (0 != keyfile_size % sizeof(EpidBinaryGroupCertificate)) {
+ log_error(
+ "input file '%s' is invalid: does not contain integral number of "
+ "group keys",
+ keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ num_keys_in_file = keyfile_size / sizeof(EpidBinaryGroupCertificate);
+
+ if ((unsigned int)num_keys_to_extract->ival[0] > num_keys_in_file) {
+ log_error("can not extract %d keys: only %d in file",
+ num_keys_to_extract->ival[0], num_keys_in_file);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ file = fopen(keyfile->filename[0], "rb");
+ if (!file) {
+ log_error("failed read from '%s'", keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // start extraction
+ for (i = 0; i < num_keys_to_extract->ival[0]; i++) {
+ EpidBinaryGroupCertificate temp;
+ int seek_failed = 0;
+ seek_failed = fseek(file, i * sizeof(temp), SEEK_SET);
+ bytes_read = fread(&temp, 1, sizeof(temp), file);
+ if (seek_failed || bytes_read != sizeof(temp)) {
+ log_error("failed to extract key #%lu from '%s'", i,
+ keyfile->filename[0]);
+ } else {
+ // ulong max = 4294967295
+ char outkeyname[256] = {0};
+ if (memcmp(&kEpidVersionCode[kEpid2x], &temp.header.epid_version,
+ sizeof(temp.header.epid_version)) ||
+ memcmp(&kEpidFileTypeCode[kGroupPubKeyFile], &temp.header.file_type,
+ sizeof(temp.header.file_type))) {
+ log_error("failed to extract key #%lu from '%s': file is invalid", i,
+ keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ snprintf(outkeyname, sizeof(outkeyname), "pubkey%010u.bin", i);
+ if (FileExists(outkeyname)) {
+ log_error("file '%s' already exists", outkeyname);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (0 != WriteLoud(&temp, sizeof(temp), outkeyname)) {
+ log_error("failed to write key #%lu from '%s'", i,
+ keyfile->filename[0]);
+ } else {
+ num_keys_extracted++;
+ }
+ }
+ }
+ if (EXIT_FAILURE == ret_value) {
+ break;
+ }
+
+ log_msg("extracted %lu of %lu keys", num_keys_extracted, num_keys_in_file);
+ } while (0);
+
+ if (file) {
+ fclose(file);
+ file = NULL;
+ }
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
diff --git a/tools/extractkeys/extractkeys.parts b/tools/extractkeys/extractkeys.parts
new file mode 100644
index 0000000..e441513
--- /dev/null
+++ b/tools/extractkeys/extractkeys.parts
@@ -0,0 +1,47 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("extractkeys")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+parts_file = ['extractkeys.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='tools/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='tools/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ env.Append(CPPDEFINES='_CRT_SECURE_NO_WARNINGS')
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
diff --git a/tools/extractkeys/src/main.c b/tools/extractkeys/src/main.c
new file mode 100644
index 0000000..21e928a
--- /dev/null
+++ b/tools/extractkeys/src/main.c
@@ -0,0 +1,232 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Extract member private keys from key output file
+ *
+ * Not validating SHA hashes in key file
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <argtable3.h>
+#include "epid/common/types.h"
+#include "util/buffutil.h"
+#include "util/envutil.h"
+#include "util/stdtypes.h"
+#include "util/strutil.h"
+
+#define PROGRAM_NAME "extractkeys"
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 6
+
+#pragma pack(1)
+/// Intel(R) EPID Key Output File Entry
+typedef struct EpidKeyOutputFileKey {
+ unsigned char product_id[2]; ///< 2-byte Product ID (Big Endian)
+ unsigned char key_id[8]; ///< 8-byte Key Unique Id(Big Endian)
+ unsigned char svn[4]; ///< 4-byte Security Version Number (SVN) (Big Endian)
+ PrivKey privkey; ///< Intel(R) EPID 2.0 Private Key
+ unsigned char hash[20]; ///< 20-byte SHA-1 of above
+} EpidKeyOutputFileKey;
+
+/// Intel(R) EPID Compressed Key Output File Entry
+typedef struct EpidCompressedKeyOutputFileKey {
+ unsigned char product_id[2]; ///< 2-byte Product ID (Big Endian)
+ unsigned char key_id[8]; ///< 8-byte Key Unique Id(Big Endian)
+ unsigned char svn[4]; ///< 4-byte Security Version Number (SVN) (Big Endian)
+ CompressedPrivKey privkey; ///< Intel(R) EPID 2.0 Compressed Private Key
+ unsigned char hash[20]; ///< 20-byte SHA-1 of above
+} EpidCompressedKeyOutputFileKey;
+#pragma pack()
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_SUCCESS;
+ // Buffer to store read key
+ uint8_t temp[sizeof(EpidKeyOutputFileKey)] = {0};
+
+ // Private key to extract
+ void* privkey = 0;
+ size_t privkey_size = 0;
+
+ size_t keyfile_size = 0;
+ size_t keyfile_entry_size = 0;
+ size_t num_keys_extracted = 0;
+ size_t num_keys_in_file = 0;
+
+ FILE* file = NULL;
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ int i = 0;
+ size_t bytes_read = 0;
+
+ struct arg_file* keyfile =
+ arg_file1(NULL, NULL, "FILE", "FILE containing keys to extract");
+ struct arg_int* num_keys_to_extract =
+ arg_int1(NULL, NULL, "NUM", "number of keys to extract");
+ struct arg_lit* compressed =
+ arg_lit0("c", "compressed", "extract compressed keys");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = keyfile;
+ argtable[1] = num_keys_to_extract;
+ argtable[2] = compressed;
+ argtable[3] = help;
+ argtable[4] = verbose;
+ argtable[5] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]... [FILE] [NUM]\n"
+ "Extract the first NUM private keys from FILE to current "
+ "directory.\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (num_keys_to_extract->ival[0] < 0) {
+ log_error("unable extract negative number of keys");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // check file existence
+ if (!FileExists(keyfile->filename[0])) {
+ log_error("cannot access '%s'", keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ keyfile_size = GetFileSize(keyfile->filename[0]);
+ if (compressed->count > 0) {
+ privkey_size = sizeof(CompressedPrivKey);
+ privkey = &(((EpidCompressedKeyOutputFileKey*)&temp[0])->privkey);
+ keyfile_entry_size = sizeof(EpidCompressedKeyOutputFileKey);
+ } else {
+ privkey_size = sizeof(PrivKey);
+ privkey = &(((EpidKeyOutputFileKey*)&temp[0])->privkey);
+ keyfile_entry_size = sizeof(EpidKeyOutputFileKey);
+ }
+
+ if (0 != keyfile_size % keyfile_entry_size) {
+ log_error(
+ "input file '%s' is invalid: does not contain integral number of "
+ "keys",
+ keyfile->filename[0]);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ num_keys_in_file = keyfile_size / keyfile_entry_size;
+
+ if ((unsigned int)num_keys_to_extract->ival[0] > num_keys_in_file) {
+ log_error("can not extract %d keys: only %d in file",
+ num_keys_to_extract->ival[0], num_keys_in_file);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ file = fopen(keyfile->filename[0], "rb");
+ if (!file) {
+ log_error("failed read from '%s'", keyfile->filename[0]);
+
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // start extraction
+ for (i = 0; i < num_keys_to_extract->ival[0]; ++i) {
+ int seek_failed = 0;
+ seek_failed = fseek(file, (int)(i * keyfile_entry_size), SEEK_SET);
+ bytes_read = fread(&temp, 1, keyfile_entry_size, file);
+ if (seek_failed || bytes_read != keyfile_entry_size) {
+ log_error("failed to extract key #%lu from '%s'", i,
+ keyfile->filename[0]);
+ } else {
+ char outkeyname[256] = {0};
+ snprintf(outkeyname, sizeof(outkeyname), "mprivkey%010u.dat", i);
+
+ if (FileExists(outkeyname)) {
+ log_error("file '%s' already exists", outkeyname);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (0 != WriteLoud(privkey, privkey_size, outkeyname)) {
+ log_error("failed to write key #%lu from '%s'", i,
+ keyfile->filename[0]);
+ } else {
+ num_keys_extracted++;
+ }
+ }
+ }
+ if (EXIT_FAILURE == ret_value) {
+ break;
+ }
+
+ log_msg("extracted %lu of %lu keys", num_keys_extracted, num_keys_in_file);
+ } while (0);
+
+ if (file) {
+ fclose(file);
+ file = NULL;
+ }
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
diff --git a/tools/revokegrp/revokegrp.parts b/tools/revokegrp/revokegrp.parts
new file mode 100644
index 0000000..ca95854
--- /dev/null
+++ b/tools/revokegrp/revokegrp.parts
@@ -0,0 +1,46 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("revokegrp")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+parts_file = ['revokegrp.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='tools/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='tools/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
diff --git a/tools/revokegrp/src/main.c b/tools/revokegrp/src/main.c
new file mode 100644
index 0000000..fc55e66
--- /dev/null
+++ b/tools/revokegrp/src/main.c
@@ -0,0 +1,375 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Create group revocation list request
+ *
+ */
+
+#include <argtable3.h>
+#include <stdlib.h>
+#include <string.h>
+#include "epid/common/file_parser.h"
+#include "util/buffutil.h"
+#include "util/envutil.h"
+#include "util/stdtypes.h"
+
+const OctStr16 kEpidFileVersion = {2, 0};
+
+// Defaults
+#define PROGRAM_NAME "revokegrp"
+#define PUBKEYFILE_DEFAULT "pubkey.bin"
+#define REQFILE_DEFAULT "grprlreq.dat"
+#define REASON_DEFAULT 0
+#define GROUP_PUB_KEY_SIZE \
+ (sizeof(EpidFileHeader) + sizeof(GroupPubKey) + sizeof(EcdsaSignature))
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 7
+
+// Defined function to get defined number as string
+#define STRINGIZE_(x) #x
+#define STRINGIZE(x) STRINGIZE_(x)
+
+#pragma pack(1)
+/// Group revocation request entry
+typedef struct GrpInfo {
+ GroupId gid; ///< Intel(R) EPID Group ID
+ uint8_t reason; ///< Revocation reason
+} GrpInfo;
+/// Group Revocation request
+typedef struct GrpRlRequest {
+ EpidFileHeader header; ///< Intel(R) EPID File Header
+ uint32_t count; ///< Revoked count (big endian)
+ GrpInfo groups[1]; ///< Revoked group count (flexible array)
+} GrpRlRequest;
+#pragma pack()
+
+/// convert host to network byte order
+static uint32_t htonl(uint32_t hostlong) {
+ return (((hostlong & 0xFF) << 24) | ((hostlong & 0xFF00) << 8) |
+ ((hostlong & 0xFF0000) >> 8) | ((hostlong & 0xFF000000) >> 24));
+}
+/// convert network to host byte order
+static uint32_t ntohl(uint32_t netlong) {
+ return (((netlong & 0xFF) << 24) | ((netlong & 0xFF00) << 8) |
+ ((netlong & 0xFF0000) >> 8) | ((netlong & 0xFF000000) >> 24));
+}
+
+/// Makes a request and appends it to file.
+/*!
+\param[in] cacert_file
+Issuing CA certificate used to sign group public key file.
+\param[in] pubkey_file
+File containing group public key.
+\param[in] req_file
+File to write a request.
+\param[in] reason
+Revokation reason.
+\param[in] verbose
+If true function would print debug information to stdout.
+*/
+int MakeRequest(char const* cacert_file, char const* pubkey_file,
+ char const* req_file, uint8_t reason, bool verbose);
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_FAILURE;
+
+ // User Settings
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ struct arg_file* pubkey_file = arg_file0(
+ NULL, "gpubkey", "FILE",
+ "load group public key from FILE (default: " PUBKEYFILE_DEFAULT ")");
+ struct arg_file* cacert_file = arg_file1(
+ NULL, "capubkey", "FILE", "load IoT Issuing CA public key from FILE");
+ struct arg_int* reason =
+ arg_int0(NULL, "reason", "NUM",
+ "revocation reason (default: " STRINGIZE(REASON_DEFAULT) ")");
+ struct arg_file* req_file = arg_file0(
+ NULL, "req", "FILE",
+ "append signature revocation request to FILE (default: " REQFILE_DEFAULT
+ ")");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = pubkey_file;
+ argtable[1] = cacert_file;
+ argtable[2] = reason;
+ argtable[3] = req_file;
+ argtable[4] = help;
+ argtable[5] = verbose;
+ argtable[6] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* set any command line default values prior to parsing */
+ pubkey_file->filename[0] = PUBKEYFILE_DEFAULT;
+ req_file->filename[0] = REQFILE_DEFAULT;
+ reason->ival[0] = REASON_DEFAULT;
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]...\n"
+ "Revoke Intel(R) EPID group\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (reason->ival[0] < 0 || reason->ival[0] > UCHAR_MAX) {
+ log_error(
+ "unexpected reason value. Value of the reason must be in a range "
+ "from 0 to %d",
+ UCHAR_MAX);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (verbose_flag) {
+ log_msg("\nOption values:");
+ log_msg(" pubkey_file : %s", pubkey_file->filename[0]);
+ log_msg(" cacert_file : %s", cacert_file->filename[0]);
+ log_msg(" reason : %d", reason->ival[0]);
+ log_msg(" req_file : %s", req_file->filename[0]);
+ log_msg("");
+ }
+
+ ret_value = MakeRequest(cacert_file->filename[0], pubkey_file->filename[0],
+ req_file->filename[0], (uint8_t)reason->ival[0],
+ verbose_flag);
+ } while (0);
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
+
+int MakeRequest(char const* cacert_file, char const* pubkey_file,
+ char const* req_file, uint8_t reason, bool verbose) {
+ // Group index and count
+ uint32_t grp_index = 0;
+ uint32_t grp_count = 0;
+
+ // Buffers and computed values
+ // Group public key file
+ unsigned char* pubkey_file_data = NULL;
+ size_t pubkey_file_size = 0;
+
+ // Group public key buffer
+ GroupPubKey pubkey = {0};
+
+ // CA certificate
+ EpidCaCertificate cacert = {0};
+
+ // Request buffer
+ uint8_t* req_buf = NULL;
+ size_t req_size = 0;
+ size_t req_file_size = 0;
+ GrpRlRequest* request = NULL;
+ size_t req_extra_space = sizeof(GroupId) + sizeof(uint8_t);
+
+ int ret_value = EXIT_FAILURE;
+ do {
+ if (!cacert_file || !pubkey_file || !req_file) {
+ log_error("internal error: badarg to MakeRequest()");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // convert command line args to usable formats
+ // CA certificate
+ if (0 != ReadLoud(cacert_file, &cacert, sizeof(cacert))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Group public key file
+ pubkey_file_data = NewBufferFromFile(pubkey_file, &pubkey_file_size);
+ if (!pubkey_file_data) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Security note:
+ // Application must confirm group public key is
+ // authorized by the issuer, e.g., signed by the issuer.
+ if (GROUP_PUB_KEY_SIZE != pubkey_file_size) {
+ log_error("unexpected file size for '%s'. Expected: %d; got: %d",
+ pubkey_file, (int)GROUP_PUB_KEY_SIZE, pubkey_file_size);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (kEpidNoErr != EpidParseGroupPubKeyFile(pubkey_file_data,
+ pubkey_file_size, &cacert,
+ &pubkey)) {
+ log_error("group public key is not authorized");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Input settings:");
+ log_msg("");
+ log_msg(" [in] Group ID: ");
+ PrintBuffer(&pubkey.gid, sizeof(pubkey.gid));
+ log_msg("");
+ log_msg(" [in] Reason: %d", reason);
+ log_msg("==============================================");
+ }
+
+ // Calculate request size
+ req_size = sizeof(EpidFileHeader) + sizeof(uint32_t);
+
+ if (FileExists(req_file)) {
+ req_file_size = GetFileSize_S(req_file, SIZE_MAX - req_extra_space);
+
+ if (req_file_size < req_size) {
+ log_error("output file smaller then size of empty request");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ req_size = req_file_size;
+ } else {
+ log_msg("request file does not exsist, create new");
+ }
+
+ req_size += req_extra_space;
+
+ // Allocate request buffer
+ req_buf = AllocBuffer(req_size);
+ if (!req_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ request = (GrpRlRequest*)req_buf;
+
+ // Load existing request file
+ if (req_file_size > 0) {
+ if (0 != ReadLoud(req_file, req_buf, req_file_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Check Intel(R) EPID and file versions
+ if (0 != memcmp(&request->header.epid_version, &kEpidFileVersion,
+ sizeof(kEpidFileVersion))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (0 != memcmp(&request->header.file_type,
+ &kEpidFileTypeCode[kGroupRlRequestFile],
+ sizeof(kEpidFileTypeCode[kGroupRlRequestFile]))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ grp_count = ntohl(request->count);
+ // check if revoked count matches the number of group revocation request
+ // entries contained in the file
+ if (grp_count * sizeof(GrpInfo) !=
+ req_file_size - sizeof(EpidFileHeader) - sizeof(uint32_t)) {
+ log_error("Incorrect revoked request count in existing file");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ // Update the reason if the group is in the request
+ for (grp_index = 0; grp_index < grp_count; grp_index++) {
+ if (0 == memcmp(&request->groups[grp_index].gid, &pubkey.gid,
+ sizeof(pubkey.gid))) {
+ request->groups[grp_index].reason = reason;
+ req_size = req_file_size;
+ break;
+ }
+ }
+ }
+
+ // Append group to the request
+ if (grp_index == grp_count) {
+ request->header.epid_version = kEpidFileVersion;
+ request->header.file_type = kEpidFileTypeCode[kGroupRlRequestFile];
+ request->groups[grp_count].gid = pubkey.gid;
+ request->groups[grp_count].reason = reason;
+ request->count = htonl(++grp_count);
+ }
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Request generated:");
+ log_msg("");
+ log_msg(" [in] Request Len: %d", (int)req_size);
+ log_msg(" [in] Request: ");
+ PrintBuffer(req_buf, req_size);
+ log_msg("==============================================");
+ }
+
+ // Store request
+ if (0 != WriteLoud(req_buf, req_size, req_file)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Success
+ ret_value = EXIT_SUCCESS;
+ } while (0);
+
+ // Free allocated buffers
+ if (pubkey_file_data) free(pubkey_file_data);
+ if (req_buf) free(req_buf);
+
+ return ret_value;
+}
diff --git a/tools/revokekey/revokekey.parts b/tools/revokekey/revokekey.parts
new file mode 100644
index 0000000..57015e2
--- /dev/null
+++ b/tools/revokekey/revokekey.parts
@@ -0,0 +1,47 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("revokekey")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+parts_file = ['revokekey.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='tools/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='tools/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ Component('member'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
diff --git a/tools/revokekey/src/main.c b/tools/revokekey/src/main.c
new file mode 100644
index 0000000..d8f7d30
--- /dev/null
+++ b/tools/revokekey/src/main.c
@@ -0,0 +1,342 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Create private key revocation list request
+ *
+ */
+
+#include <argtable3.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "epid/common/file_parser.h"
+#include "epid/member/api.h"
+#include "util/buffutil.h"
+#include "util/envutil.h"
+#include "util/stdtypes.h"
+
+const OctStr16 kEpidFileVersion = {2, 0};
+
+// Defaults
+#define PROGRAM_NAME "revokekey"
+#define PRIVKEY_DEFAULT "mprivkey.dat"
+#define REQFILE_DEFAULT "privreq.dat"
+#define PUBKEYFILE_DEFAULT "pubkey.bin"
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 8
+
+/// Partial signature request, includes all but message.
+typedef struct PrivRlRequestTop {
+ EpidFileHeader header; ///< Intel(R) EPID File Header
+ PrivKey privkey; ///< Intel(R) EPID Private Key
+} PrivRlRequestTop;
+
+int OpenKey(char const* privkey_file, char const* gpubkey_file,
+ char const* cacert_file, PrivKey* priv_key) {
+ int retval = EXIT_FAILURE;
+ size_t file_size = GetFileSize(privkey_file);
+
+ if (0 == file_size && !FileExists(privkey_file)) {
+ log_error("cannot access '%s'", privkey_file);
+ return EXIT_FAILURE;
+ }
+
+ if (file_size == sizeof(PrivKey)) {
+ if (0 != ReadLoud(privkey_file, priv_key, sizeof(PrivKey))) {
+ return EXIT_FAILURE;
+ }
+ retval = EXIT_SUCCESS;
+ } else if (file_size == sizeof(CompressedPrivKey)) {
+ void* signed_pubkey = NULL;
+ if (!cacert_file) {
+ log_error("issuing CA public key must be specified for compressed key");
+ return EXIT_FAILURE;
+ }
+ if (!gpubkey_file) {
+ log_error("group public key must be specified for compressed key");
+ return EXIT_FAILURE;
+ }
+
+ do {
+ size_t signed_pubkey_size = 0;
+ CompressedPrivKey cmp_key;
+ EpidCaCertificate cacert;
+ GroupPubKey pub_key;
+ EpidStatus sts;
+ if (0 != ReadLoud(privkey_file, &cmp_key, sizeof(CompressedPrivKey))) {
+ retval = EXIT_FAILURE;
+ break;
+ }
+ signed_pubkey = NewBufferFromFile(gpubkey_file, &signed_pubkey_size);
+ if (!signed_pubkey) {
+ retval = EXIT_FAILURE;
+ break;
+ }
+ if (0 != ReadLoud(gpubkey_file, signed_pubkey, signed_pubkey_size)) {
+ retval = EXIT_FAILURE;
+ break;
+ }
+ if (0 != ReadLoud(cacert_file, &cacert, sizeof(cacert))) {
+ retval = EXIT_FAILURE;
+ break;
+ }
+ sts = EpidParseGroupPubKeyFile(signed_pubkey, signed_pubkey_size, &cacert,
+ &pub_key);
+ if (kEpidNoErr != sts) {
+ log_error("error while parsing group public key");
+ retval = EXIT_FAILURE;
+ break;
+ }
+ sts = EpidDecompressPrivKey(&pub_key, &cmp_key, priv_key);
+ if (kEpidNoErr != sts) {
+ log_error("error while decompressing member private key");
+ retval = EXIT_FAILURE;
+ break;
+ }
+ retval = EXIT_SUCCESS;
+ } while (0);
+ free(signed_pubkey);
+ } else {
+ log_error("unexpected file size for '%s'", privkey_file);
+ retval = EXIT_FAILURE;
+ }
+ return retval;
+}
+
+int MakeRequest(PrivKey const* priv_key, char const* req_file, bool verbose) {
+ // Request buffer
+ uint8_t* req_buf = NULL;
+ size_t req_size = 0;
+ size_t req_extra_space = 0;
+ int ret_value = EXIT_FAILURE;
+ do {
+ size_t entry_size = sizeof(EpidFileHeader) + sizeof(PrivKey);
+ size_t req_file_size = 0;
+ bool duplicate = false;
+ size_t i = 0;
+ PrivRlRequestTop* req_top = NULL;
+
+ if (!req_file) {
+ log_error("internal error: badarg to MakeRequest()");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // convert command line args to usable formats
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Input settings:");
+ log_msg("");
+ log_msg(" [in] Group ID: ");
+ PrintBuffer(&(priv_key->gid), sizeof(priv_key->gid));
+ log_msg("");
+ log_msg(" [in] Private Key Len: %d", sizeof(PrivKey));
+ log_msg(" [in] Private Key: ");
+ PrintBuffer(priv_key, sizeof(PrivKey));
+ log_msg("");
+ log_msg("==============================================");
+ }
+
+ req_extra_space += entry_size;
+ if (FileExists(req_file)) {
+ req_file_size = GetFileSize_S(req_file, SIZE_MAX - req_extra_space);
+
+ if (req_file_size < entry_size) {
+ log_error("output file smaller then size of one entry");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (req_file_size % entry_size != 0) {
+ log_error("size of output file is not multiple of the entry size");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ } else {
+ log_msg("request file does not exsist, create new");
+ }
+
+ req_size = req_file_size + req_extra_space;
+
+ req_buf = AllocBuffer(req_size);
+ if (!req_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Load existing request file
+ if (req_file_size > 0) {
+ if (0 != ReadLoud(req_file, req_buf, req_file_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ for (i = 0; i < req_file_size / entry_size; i++) {
+ if (0 == memcmp(req_buf + entry_size * i + sizeof(EpidFileHeader),
+ priv_key, sizeof(PrivKey))) {
+ duplicate = true;
+ break;
+ }
+ }
+ if (duplicate) {
+ log_error("this private key already exists in output file");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ // Append to the request
+ req_top = (PrivRlRequestTop*)(req_buf + req_file_size);
+ req_top->header.epid_version = kEpidFileVersion;
+ req_top->header.file_type = kEpidFileTypeCode[kPrivRlRequestFile];
+ req_top->privkey = *priv_key;
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Request generated:");
+ log_msg("");
+ log_msg(" [in] Request Len: %d", sizeof(PrivRlRequestTop));
+ log_msg(" [in] Request: ");
+ PrintBuffer(req_top, sizeof(PrivRlRequestTop));
+ log_msg("==============================================");
+ }
+
+ // Store request
+ if (0 != WriteLoud(req_buf, req_size, req_file)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ ret_value = EXIT_SUCCESS;
+ } while (0);
+
+ // Free allocated buffers
+ if (req_buf) free(req_buf);
+
+ return ret_value;
+}
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ int retval = EXIT_FAILURE;
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ // Private key
+ PrivKey priv_key;
+
+ struct arg_file* privkey_file = arg_file0(
+ NULL, "mprivkey", "FILE",
+ "load private key to revoke from FILE (default: " PRIVKEY_DEFAULT ")");
+ struct arg_file* req_file = arg_file0(
+ NULL, "req", "FILE",
+ "append signature revocation request to FILE (default: " REQFILE_DEFAULT
+ ")");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_rem* comment_line = arg_rem(
+ NULL, "The following options are only needed for compressed keys:");
+ struct arg_file* gpubkey_file = arg_file0(
+ NULL, "gpubkey", "FILE",
+ "load group public key from FILE (default: " PUBKEYFILE_DEFAULT ")");
+ struct arg_file* capubkey_file = arg_file0(
+ NULL, "capubkey", "FILE", "load IoT Issuing CA public key from FILE");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = privkey_file;
+ argtable[1] = req_file;
+ argtable[2] = help;
+ argtable[3] = verbose;
+ argtable[4] = comment_line;
+ argtable[5] = gpubkey_file;
+ argtable[6] = capubkey_file;
+ argtable[7] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ retval = EXIT_FAILURE;
+ break;
+ }
+
+ /* set any command line default values prior to parsing */
+ privkey_file->filename[0] = PRIVKEY_DEFAULT;
+ gpubkey_file->filename[0] = PUBKEYFILE_DEFAULT;
+ req_file->filename[0] = REQFILE_DEFAULT;
+ capubkey_file->filename[0] = NULL;
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]...\n"
+ "Revoke Intel(R) EPID signature\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ retval = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ retval = EXIT_FAILURE;
+ break;
+ }
+ if (verbose_flag) {
+ log_msg("\nOption values:");
+ log_msg(" mprivkey : %s", privkey_file->filename[0]);
+ log_msg(" req : %s", req_file->filename[0]);
+ log_msg(" gpubkey : %s", gpubkey_file->filename[0]);
+ log_msg(" capubkey : %s", capubkey_file->filename[0]);
+ log_msg("");
+ }
+
+ retval = OpenKey(privkey_file->filename[0], gpubkey_file->filename[0],
+ capubkey_file->filename[0], &priv_key);
+ if (EXIT_SUCCESS != retval) {
+ break;
+ }
+ retval = MakeRequest(&priv_key, req_file->filename[0], verbose_flag);
+ } while (0);
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return retval;
+}
diff --git a/tools/revokesig/revokesig.parts b/tools/revokesig/revokesig.parts
new file mode 100644
index 0000000..3343c31
--- /dev/null
+++ b/tools/revokesig/revokesig.parts
@@ -0,0 +1,46 @@
+############################################################################
+# Copyright 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+############################################################################
+
+Import('*')
+
+env.PartName("revokesig")
+
+src_files = Pattern(src_dir='src/',
+ includes=['*.c'],
+ recursive=True).files()
+
+parts_file = ['revokesig.parts']
+
+if 'install_package' in env['MODE']:
+ env.InstallTopLevel(src_files, sub_dir='tools/${PART_SHORT_NAME}/src')
+ env.InstallTopLevel(parts_file, sub_dir='tools/${PART_SHORT_NAME}')
+else:
+ env.DependsOn([
+ Component('common'),
+ Component('util'),
+ Component('argtable3')
+ ])
+
+ if env['TARGET_PLATFORM']['OS'] == 'win32':
+ if env.isConfigBasedOn('debug'):
+ env['PDB'] = '${PART_NAME}.pdb'
+
+ outputs = env.Program('${PART_NAME}', src_files,
+ no_import_lib=True)
+
+ env.InstallBin(outputs,
+ no_pkg=False,
+ INSTALL_BIN='${INSTALL_TOOLS_BIN}')
diff --git a/tools/revokesig/src/main.c b/tools/revokesig/src/main.c
new file mode 100644
index 0000000..91264a4
--- /dev/null
+++ b/tools/revokesig/src/main.c
@@ -0,0 +1,434 @@
+/*############################################################################
+ # Copyright 2016-2017 Intel Corporation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ ############################################################################*/
+
+/*!
+ * \file
+ *
+ * \brief Create signature based revocation list request
+ *
+ */
+
+#include <argtable3.h>
+#include <stdlib.h>
+#include <string.h>
+#include "epid/common/file_parser.h"
+#include "util/buffutil.h"
+#include "util/envutil.h"
+#include "util/stdtypes.h"
+
+// Defaults
+#define PROGRAM_NAME "revokesig"
+#define PUBKEYFILE_DEFAULT "pubkey.bin"
+#define REQFILE_DEFAULT "sigrlreq.dat"
+#define SIG_DEFAULT "sig.dat"
+#define GROUP_PUB_KEY_SIZE \
+ (sizeof(EpidFileHeader) + sizeof(GroupPubKey) + sizeof(EcdsaSignature))
+#define ARGPARSE_ERROR_MAX 20
+#define ARGTABLE_SIZE 9
+
+#pragma pack(1)
+/// Partial signature request, includes components through sig.
+typedef struct SigRlRequestTop {
+ EpidFileHeader header; ///< Intel(R) EPID File Header
+ GroupId gid; ///< Intel(R) EPID Group ID
+ EpidSignature sig; ///< Intel(R) EPID Signature
+} SigRlRequestTop;
+
+/// Partial signature request, includes components after.
+typedef struct SigRlRequestMid {
+ uint32_t be_msg_size; ///< size of message in bytes (big endian)
+ uint8_t msg[1]; ///< message used to create signature (flexible array)
+} SigRlRequestMid;
+#pragma pack()
+
+/// convert host to network byte order
+static uint32_t htonl(uint32_t hostlong) {
+ return (((hostlong & 0xFF) << 24) | ((hostlong & 0xFF00) << 8) |
+ ((hostlong & 0xFF0000) >> 8) | ((hostlong & 0xFF000000) >> 24));
+}
+
+/// Fill a single SigRlRequest structure
+/*!
+\param[in] pubkey
+Group public key.
+\param[in] sig
+Signature to append to request.
+\param[in] sig_size
+Size of the signature.
+\param[in] msg_str
+Message used to generate signature to revoke.
+\param[in] msg_size
+Length of the message.
+\param[in out] req_buf
+Pointer to request buffer.
+\param[in] req_size
+Size of request buffer.
+\param[in out] req_top
+Pointer to top structure of request.
+*/
+void FillRequest(GroupPubKey const* pubkey, EpidSignature const* sig,
+ size_t sig_size, char const* msg_str, size_t msg_size,
+ uint8_t* req_buf, size_t req_size, SigRlRequestTop* req_top);
+
+/// Makes a request and appends it to file.
+/*!
+\param[in] cacert_file
+Issuing CA certificate used to sign group public key file.
+\param[in] sig_file
+File containing signature to add to request.
+\param[in] pubkey_file
+File containing group public key.
+\param[in] req_file
+File to write a request.
+\param[in] msg_str
+Message used to generate signature to revoke.
+\param[in] msg_size
+Length of the message.
+\param[in] verbose
+If true function would print debug information to stdout.
+*/
+int MakeRequest(char const* cacert_file, char const* sig_file,
+ char const* pubkey_file, char const* req_file,
+ char const* msg_str, size_t msg_size, bool verbose);
+
+/// Main entrypoint
+int main(int argc, char* argv[]) {
+ // intermediate return value for C style functions
+ int ret_value = EXIT_FAILURE;
+
+ // Message string parameter
+ static char* msg_str = NULL;
+ size_t msg_size = 0;
+ char* msg_buf = NULL; // message loaded from msg_file
+
+ // Verbose flag parameter
+ static bool verbose_flag = false;
+
+ struct arg_file* sig_file = arg_file0(
+ NULL, "sig", "FILE",
+ "load signature to revoke from FILE (default: " SIG_DEFAULT ")");
+ struct arg_str* msg =
+ arg_str0(NULL, "msg", "MESSAGE",
+ "MESSAGE used to generate signature to revoke (default: empty)");
+ struct arg_file* msg_file =
+ arg_file0(NULL, "msgfile", "FILE",
+ "FILE containing message used to generate signature to revoke");
+ struct arg_file* pubkey_file = arg_file0(
+ NULL, "gpubkey", "FILE",
+ "load group public key from FILE (default: " PUBKEYFILE_DEFAULT ")");
+ struct arg_file* cacert_file = arg_file1(
+ NULL, "capubkey", "FILE", "load IoT Issuing CA public key from FILE");
+ struct arg_file* req_file = arg_file0(
+ NULL, "req", "FILE",
+ "append signature revocation request to FILE (default: " REQFILE_DEFAULT
+ ")");
+ struct arg_lit* help = arg_lit0(NULL, "help", "display this help and exit");
+ struct arg_lit* verbose =
+ arg_lit0("v", "verbose", "print status messages to stdout");
+ struct arg_end* end = arg_end(ARGPARSE_ERROR_MAX);
+ void* argtable[ARGTABLE_SIZE];
+ int nerrors;
+
+ /* initialize the argtable array with ptrs to the arg_xxx structures
+ * constructed above */
+ argtable[0] = sig_file;
+ argtable[1] = msg;
+ argtable[2] = msg_file;
+ argtable[3] = pubkey_file;
+ argtable[4] = cacert_file;
+ argtable[5] = req_file;
+ argtable[6] = help;
+ argtable[7] = verbose;
+ argtable[8] = end;
+
+ // set program name for logging
+ set_prog_name(PROGRAM_NAME);
+ do {
+ /* verify the argtable[] entries were allocated sucessfully */
+ if (arg_nullcheck(argtable) != 0) {
+ /* NULL entries were detected, some allocations must have failed */
+ printf("%s: insufficient memory\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ /* set any command line default values prior to parsing */
+ sig_file->filename[0] = SIG_DEFAULT;
+ pubkey_file->filename[0] = PUBKEYFILE_DEFAULT;
+ req_file->filename[0] = REQFILE_DEFAULT;
+
+ /* Parse the command line as defined by argtable[] */
+ nerrors = arg_parse(argc, argv, argtable);
+
+ if (help->count > 0) {
+ log_fmt(
+ "Usage: %s [OPTION]...\n"
+ "Revoke Intel(R) EPID signature\n"
+ "\n"
+ "Options:\n",
+ PROGRAM_NAME);
+ arg_print_glossary(stdout, argtable, " %-25s %s\n");
+ ret_value = EXIT_SUCCESS;
+ break;
+ }
+ if (verbose->count > 0) {
+ verbose_flag = ToggleVerbosity();
+ }
+ /* If the parser returned any errors then display them and exit */
+ if (nerrors > 0) {
+ /* Display the error details contained in the arg_end struct.*/
+ arg_print_errors(stderr, end, PROGRAM_NAME);
+ fprintf(stderr, "Try '%s --help' for more information.\n", PROGRAM_NAME);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (msg->count > 0 && msg_file->count > 0) {
+ log_error("options --msg and --msgfile cannot be used together");
+ ret_value = EXIT_FAILURE;
+ break;
+ } else if (msg->count > 0) {
+ msg_str = (char*)msg->sval[0];
+ msg_size = strlen(msg_str);
+ } else if (msg_file->count > 0) {
+ msg_buf = NewBufferFromFile(msg_file->filename[0], &msg_size);
+ if (!msg_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ msg_str = msg_buf;
+ } else {
+ msg_size = 0;
+ }
+
+ if (verbose_flag) {
+ log_msg("\nOption values:");
+ log_msg(" sig_file : %s", sig_file->filename[0]);
+ log_msg(" msg_str : %s", msg_str);
+ log_msg(" pubkey_file : %s", pubkey_file->filename[0]);
+ log_msg(" cacert_file : %s", cacert_file->filename[0]);
+ log_msg(" req_file : %s", req_file->filename[0]);
+ log_msg("");
+ }
+
+ ret_value = MakeRequest(cacert_file->filename[0], sig_file->filename[0],
+ pubkey_file->filename[0], req_file->filename[0],
+ msg_str, msg_size, verbose_flag);
+ } while (0);
+
+ if (msg_buf) {
+ free(msg_buf);
+ msg_buf = NULL;
+ }
+
+ arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
+
+ return ret_value;
+}
+
+/// Fill a single SigRlRequest structure
+/*!
+
+ | Field | Size |
+ |:--------------------------------|--------------:|
+ | Intel(R) EPID Version (0x0200) | 2 bytes |
+ | File Type (0x000B) | 2 bytes |
+ | Group ID Number | 16 bytes |
+ | Basic Signature | 52 bytes |
+ | SigRL Version | 4 bytes |
+ | Number of Non-Revoked Proofs | 4 bytes |
+ | nNRP * Non-Revoked Proofs | 160 * nNRP |
+ | Message Size in Bytes (msgSize) | 4 bytes |
+ | Message | msgSize bytes |
+
+ */
+void FillRequest(GroupPubKey const* pubkey, EpidSignature const* sig,
+ size_t sig_size, char const* msg_str, size_t msg_size,
+ uint8_t* req_buf, size_t req_size, SigRlRequestTop* req_top) {
+ const OctStr16 kEpidFileVersion = {2, 0};
+ size_t i = 0;
+ size_t req_mid_size = sizeof(((SigRlRequestMid*)0)->be_msg_size) + msg_size;
+ SigRlRequestMid* req_mid =
+ (SigRlRequestMid*)(req_buf + req_size - req_mid_size);
+
+ if (!pubkey || !sig || !req_buf || !req_top || (!msg_str && 0 != msg_size)) {
+ log_error("internal error: badarg to FillRequest()");
+ return;
+ }
+
+ req_top->header.epid_version = kEpidFileVersion;
+ req_top->header.file_type = kEpidFileTypeCode[kSigRlRequestFile];
+ req_top->gid = pubkey->gid;
+ // copy signature
+ for (i = 0; i < sig_size; i++) {
+ ((uint8_t*)&req_top->sig)[i] = ((uint8_t*)sig)[i];
+ }
+ req_mid->be_msg_size = htonl((uint32_t)msg_size);
+ // copy msg
+ for (i = 0; i < msg_size; i++) {
+ req_mid->msg[i] = msg_str[i];
+ }
+}
+
+int MakeRequest(char const* cacert_file, char const* sig_file,
+ char const* pubkey_file, char const* req_file,
+ char const* msg_str, size_t msg_size, bool verbose) {
+ // Buffers and computed values
+ // Signature buffer
+ EpidSignature* sig = NULL;
+ size_t sig_size = 0;
+
+ // Group public key file
+ unsigned char* pubkey_file_data = NULL;
+ size_t pubkey_file_size = 0;
+
+ // CA certificate
+ EpidCaCertificate cacert = {0};
+
+ // Group public key buffer
+ GroupPubKey pubkey = {0};
+
+ // Request buffer
+ uint8_t* req_buf = NULL;
+ size_t req_size = 0;
+
+ size_t req_extra_space = (sizeof(EpidFileHeader) + sizeof(GroupId));
+
+ int ret_value = EXIT_FAILURE;
+ do {
+ SigRlRequestTop* req_top = NULL;
+ size_t req_file_size = 0;
+ const size_t kMsgSizeSize = sizeof(((SigRlRequestMid*)0)->be_msg_size);
+
+ if (!cacert_file || !sig_file || !pubkey_file || !req_file ||
+ (!msg_str && 0 != msg_size)) {
+ log_error("internal error: badarg to MakeRequest()");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // convert command line args to usable formats
+ // CA certificate
+ if (0 != ReadLoud(cacert_file, &cacert, sizeof(cacert))) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Signature
+ sig = NewBufferFromFile(sig_file, &sig_size);
+ if (!sig) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Group public key file
+ pubkey_file_data = NewBufferFromFile(pubkey_file, &pubkey_file_size);
+ if (!pubkey_file_data) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Security note:
+ // Application must confirm group public key is
+ // authorized by the issuer, e.g., signed by the issuer.
+ if (GROUP_PUB_KEY_SIZE != pubkey_file_size) {
+ log_error("unexpected file size for '%s'. Expected: %d; got: %d",
+ pubkey_file, (int)GROUP_PUB_KEY_SIZE, (int)pubkey_file_size);
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ if (kEpidNoErr != EpidParseGroupPubKeyFile(pubkey_file_data,
+ pubkey_file_size, &cacert,
+ &pubkey)) {
+ log_error("group public key is not authorized");
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Creating SigRL revocation request:");
+ log_msg("");
+ log_msg(" [in] Group ID: ");
+ PrintBuffer(&pubkey.gid, sizeof(pubkey.gid));
+ log_msg("");
+ log_msg(" [in] Signature Len: %d", (int)sig_size);
+ log_msg(" [in] Signature: ");
+ PrintBuffer(sig, sig_size);
+ log_msg("");
+ log_msg(" [in] Message Len: %d", (int)msg_size);
+ log_msg(" [in] Message: ");
+ PrintBuffer(msg_str, msg_size);
+ log_msg("==============================================");
+ }
+
+ req_extra_space += sig_size + kMsgSizeSize + msg_size;
+
+ if (FileExists(req_file)) {
+ req_file_size = GetFileSize_S(req_file, SIZE_MAX - req_extra_space);
+ } else {
+ log_msg("request file does not exsist, create new");
+ }
+
+ req_size = req_file_size + req_extra_space;
+
+ req_buf = AllocBuffer(req_size);
+ if (!req_buf) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ if (req_file_size > 0) {
+ if (0 != ReadLoud(req_file, req_buf, req_file_size)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+ }
+
+ req_top = (SigRlRequestTop*)(req_buf + req_file_size);
+
+ FillRequest(&pubkey, sig, sig_size, msg_str, msg_size, req_buf, req_size,
+ req_top);
+
+ // Report Settings
+ if (verbose) {
+ log_msg("==============================================");
+ log_msg("Reqest generated:");
+ log_msg("");
+ log_msg(" [in] Request Len: %d", sizeof(SigRlRequestTop));
+ log_msg(" [in] Request: ");
+ PrintBuffer(req_top, sizeof(SigRlRequestTop));
+ log_msg("==============================================");
+ }
+
+ // Store request
+ if (0 != WriteLoud(req_buf, req_size, req_file)) {
+ ret_value = EXIT_FAILURE;
+ break;
+ }
+
+ // Success
+ ret_value = EXIT_SUCCESS;
+ } while (0);
+
+ // Free allocated buffers
+ if (pubkey_file_data) free(pubkey_file_data);
+ if (sig) free(sig);
+ if (req_buf) free(req_buf);
+
+ return ret_value;
+}